{"version":3,"sources":["webpack:///rapp_standalone.js","webpack:///webpack/bootstrap 70709c645e05ad0335bf","webpack:///./node_modules/react/index.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/moment/moment.js","webpack:///./node_modules/lodash/lodash.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_export.js","webpack:///./node_modules/create-react-class/index.js","webpack:///./node_modules/mapbox-gl/js/util/util.js","webpack:///./node_modules/classnames/index.js","webpack:///../../../src/javascripts/index.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/util.js","webpack:///./node_modules/point-geometry/index.js","webpack:///./javascripts/actions/grid_report_actions.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js","webpack:///./node_modules/immutable/dist/immutable.es.js","webpack:///./node_modules/@opengov/og_flux/build/index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_global.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/backbone/backbone.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js","webpack:///./javascripts/actions/report_actions.ts","webpack:///./javascripts/strings.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js","webpack:///./node_modules/handlebars/runtime.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js","webpack:///./node_modules/react-dom/index.js","webpack:///./javascripts/stores/report_view_store.ts","webpack:///./javascripts/actions/summary_report_actions.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js","webpack:///./javascripts/querygrid/utils.ts","webpack:///./node_modules/@opengov/og_api/lib/index.js","webpack:///./node_modules/assert/assert.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/error/validation_error.js","webpack:///./node_modules/mapbox-gl/js/util/browser/browser.js","webpack:///./javascripts/stores/summary_report_store.ts","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/browser.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/error/validation_error.js","webpack:///./node_modules/mapbox-gl/js/data/bucket.js","webpack:///./node_modules/@opengov/ovid/node_modules/lodash/dist/lodash.js","webpack:///./javascripts/maps/map_constants.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js","webpack:///./node_modules/mapbox-gl/js/util/evented.js","webpack:///./node_modules/mapbox-gl/js/util/browser/dom.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js","webpack:///./node_modules/underscore.string/lib/underscore.string.js","webpack:///./javascripts/og.ts","webpack:///./javascripts/utils/transactions_utils.ts","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/evented.js","webpack:///./javascripts/wizard/wizard_step_mixin.tsx","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_has.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js","webpack:///./node_modules/@opengov/controlpanel/lib/stores/session_store.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/dom.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/get_type.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_core.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js","webpack:///(webpack)/buildin/module.js","webpack:///./javascripts/stores/grid_report_store.ts","webpack:///./javascripts/utils/embed_utils.ts","webpack:///./node_modules/mapbox-gl-style-spec/lib/util/get_type.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/object-assign/index.js","webpack:///./node_modules/react-router/build/lib/PropTypes.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/utils.js","webpack:///./javascripts/actions/invite_actions.ts","webpack:///./node_modules/gl-matrix/src/gl-matrix/common.js","webpack:///./node_modules/mapbox-gl/js/geo/lng_lat.js","webpack:///./javascripts/actions/settings_panel_actions.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js","webpack:///./node_modules/i18next/dist/commonjs/logger.js","webpack:///./javascripts/numberTypes.ts","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/ajax.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/lng_lat.js","webpack:///./node_modules/gl-matrix/src/gl-matrix.js","webpack:///./node_modules/mapbox-gl/js/util/browser/ajax.js","webpack:///./node_modules/html2canvas/dist/npm/Color.js","webpack:///./node_modules/html2canvas/dist/npm/Bounds.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_library.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js","webpack:///./node_modules/react-router/build/lib/Route.js","webpack:///./node_modules/@opengov/controlpanel/node_modules/lodash/index.js","webpack:///./javascripts/utils/target_utils.ts","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/struct_array.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer.js","webpack:///./node_modules/mapbox-gl/js/util/struct_array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/@opengov/og_analytics/lib/analytics.js","webpack:///./node_modules/react-router/build/lib/History.js","webpack:///./javascripts/asset_helpers.ts","webpack:///./javascripts/utils/schema_utils.ts","webpack:///./javascripts/utils/intercom_utils.ts","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/mapbox.js","webpack:///./node_modules/pbf/index.js","webpack:///./node_modules/feature-filter/index.js","webpack:///./node_modules/viewport-mercator-project/index.js","webpack:///./node_modules/react-dnd/node_modules/lodash/isPlainObject.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate.js","webpack:///./node_modules/mapbox-gl/js/util/mapbox.js","webpack:///./node_modules/html2canvas/dist/npm/Length.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./node_modules/i18next/dist/commonjs/EventEmitter.js","webpack:///./node_modules/i18next/dist/commonjs/utils.js","webpack:///./node_modules/react-router/build/lib/actions/LocationActions.js","webpack:///../../../../../src/javascripts/jsx/forms/field.js","webpack:///./node_modules/react-transition-group/index.js","webpack:///./javascripts/models/reports.ts","webpack:///./javascripts/utils/event_observer_mixin.ts","webpack:///./javascripts/utils/dataset_utils.ts","webpack:///./node_modules/handlebars/dist/cjs/handlebars/exception.js","webpack:///./node_modules/numeral/numeral.js","webpack:///./javascripts/stores/saved_views_store.ts","webpack:///./javascripts/config.ts","webpack:///./javascripts/maps/utils/geodata_utils.ts","webpack:///./node_modules/react-i18next/dist/es/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_object.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/unbundle_jsonlint.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/buffer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/vertex_array_object.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/load_geometry.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile_coord.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/pixels_to_tile_units.js","webpack:///./node_modules/path-browserify/index.js","webpack:///./node_modules/global/window.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isArray.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_root.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_object.js","webpack:///./node_modules/mapbox-gl/js/data/buffer.js","webpack:///./node_modules/mapbox-gl/js/render/vertex_array_object.js","webpack:///./node_modules/mapbox-gl/js/data/load_geometry.js","webpack:///./node_modules/mapbox-gl/js/source/tile_coord.js","webpack:///./node_modules/mapbox-gl/js/source/pixels_to_tile_units.js","webpack:///./node_modules/mapbox-gl/js/ui/control/control.js","webpack:///./node_modules/react-scroll/modules/mixins/utils.js","webpack:///./node_modules/html2canvas/dist/npm/Util.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js","webpack:///./node_modules/cookies-js/src/cookies.js","webpack:///./javascripts/i18n.ts","webpack:///./node_modules/fbjs/lib/invariant.js","webpack:///./node_modules/react-router/build/lib/index.js","webpack:///./node_modules/react-router/build/lib/components/RouteHandler.js","webpack:///./node_modules/react-router/build/lib/components/Route.js","webpack:///./node_modules/can-use-dom/index.js","webpack:///../../../../src/javascripts/jsx/overlays.js","webpack:///./node_modules/superagent/lib/client.js","webpack:///./javascripts/utils/css_transition_defaults.ts","webpack:///./node_modules/immutability-helper/index.js","webpack:///./javascripts/og_colors.ts","webpack:///./javascripts/actions/saved_view_actions.ts","webpack:///./javascripts/share/share_icons.tsx","webpack:///./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/coordinate.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/interpolate.js","webpack:///./node_modules/csscolorparser/csscolorparser.js","webpack:///./node_modules/shelf-pack/index.umd.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile_pyramid.js","webpack:///./node_modules/vector-tile/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_raster.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/lng_lat_bounds.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/control.js","webpack:///./node_modules/dnd-core/lib/actions/dragDrop.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_getNative.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_root.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_getMapData.js","webpack:///./node_modules/dnd-core/lib/actions/registry.js","webpack:///./node_modules/react-dnd/lib/utils/checkDecoratorArguments.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_getNative.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isObject.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isObjectLike.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_getMapData.js","webpack:///./javascripts/amount.tsx","webpack:///./node_modules/mapbox-gl/js/geo/coordinate.js","webpack:///./node_modules/mapbox-gl/js/util/interpolate.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/util/unbundle_jsonlint.js","webpack:///./node_modules/mapbox-gl/js/render/draw_raster.js","webpack:///./node_modules/mapbox-gl/js/geo/lng_lat_bounds.js","webpack:///./javascripts/share/share_links.tsx","webpack:///./javascripts/share/shared_link_helper.ts","webpack:///./node_modules/react-scroll/modules/mixins/scroller.js","webpack:///./javascripts/header_actions/grid_download_menu/export_filter/public_user/export_modal.tsx","webpack:///./node_modules/html2canvas/dist/npm/drawing/Path.js","webpack:///./node_modules/html2canvas/dist/npm/NodeContainer.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/background.js","webpack:///./node_modules/html2canvas/dist/npm/drawing/Vector.js","webpack:///./node_modules/html2canvas/dist/npm/Feature.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js","webpack:///./node_modules/@opengov/controlpanel/lib/stores/control_panel_store.js","webpack:///./node_modules/underscore/modules/index.js","webpack:///./node_modules/fbjs/lib/emptyObject.js","webpack:///./node_modules/fbjs/lib/emptyFunction.js","webpack:///./node_modules/fbjs/lib/shallowEqual.js","webpack:///./node_modules/react-router/build/lib/warning.js","webpack:///./node_modules/react-router/build/lib/PathUtils.js","webpack:///./node_modules/react-router/build/lib/locations/HistoryLocation.js","webpack:///./node_modules/@opengov/controlpanel/lib/actions/entity_actions.js","webpack:///../../../../src/javascripts/jsx/dropdown.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./javascripts/models/report.ts","webpack:///./javascripts/tracking.ts","webpack:///./node_modules/bluebird/js/browser/bluebird.js","webpack:///./javascripts/stores/modal_store.ts","webpack:///./javascripts/views/recoverable_error.ts","webpack:///./javascripts/templates.ts","webpack:///./javascripts/querygrid/querymodel.ts","webpack:///./javascripts/metric_data_constants.ts","webpack:///./javascripts/cookie_helper.ts","webpack:///./javascripts/querygrid/remotemodel.ts","webpack:///./javascripts/querygrid/plugins/contextmenu.ts","webpack:///./javascripts/views/sort_selector.ts","webpack:///./node_modules/react-i18next/dist/es/context.js","webpack:///./node_modules/mapbox-gl-supported/index.js","webpack:///./node_modules/react-pure-render/mixin.js","webpack:///./node_modules/node-libs-browser/node_modules/util/util.js","webpack:///./node_modules/autobind-decorator/lib/index.js","webpack:///./node_modules/d3/d3.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/mapbox-gl.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_function.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_enum.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_filter.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/geojson_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/video_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/image_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/transform.js","webpack:///./node_modules/global/document.js","webpack:///./node_modules/webgl-heatmap/heatmap-texture.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isObject.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_SetCache.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_Symbol.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_arrayIncludes.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_arrayIncludesWith.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_arrayMap.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_cacheHas.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseRest.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isArrayLikeObject.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isObjectLike.js","webpack:///./node_modules/react-dnd/lib/utils/shallowEqual.js","webpack:///./node_modules/disposables/modules/isDisposable.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseRest.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_Symbol.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/eq.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isArrayLike.js","webpack:///./node_modules/react-dnd-html5-backend/lib/NativeTypes.js","webpack:///./node_modules/recompose/node_modules/lodash/_LodashWrapper.js","webpack:///./node_modules/recompose/node_modules/lodash/isObject.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseLodash.js","webpack:///./node_modules/recompose/node_modules/lodash/_Symbol.js","webpack:///./node_modules/recompose/node_modules/lodash/_root.js","webpack:///./node_modules/recompose/node_modules/lodash/isObjectLike.js","webpack:///./node_modules/recompose/node_modules/lodash/isArray.js","webpack:///./node_modules/recompose/node_modules/lodash/_LazyWrapper.js","webpack:///./node_modules/mapbox-gl/js/style/style_function.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_enum.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_filter.js","webpack:///./javascripts/actions/report_download_actions.ts","webpack:///./node_modules/react-scroll/modules/mixins/scroll-link.js","webpack:///./node_modules/react-scroll/modules/mixins/scroll-spy.js","webpack:///./node_modules/react-scroll/modules/mixins/passive-event-listeners.js","webpack:///./node_modules/react-scroll/modules/mixins/scroll-events.js","webpack:///./javascripts/router.ts","webpack:///./javascripts/sidebar.tsx","webpack:///./node_modules/html2canvas/dist/npm/parsing/textDecoration.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/border.js","webpack:///./node_modules/html2canvas/dist/npm/TextContainer.js","webpack:///./javascripts/wizard/base_report_flow.ts","webpack:///./javascripts/wizard/start.tsx","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_html.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_task.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js","webpack:///./node_modules/@opengov/controlpanel/lib/models/entity.js","webpack:///./node_modules/i18next/dist/commonjs/postProcessor.js","webpack:///./node_modules/i18next/dist/commonjs/compatibility/v1.js","webpack:///./node_modules/react-router/build/lib/components/DefaultRoute.js","webpack:///./node_modules/react-router/node_modules/qs/lib/utils.js","webpack:///./node_modules/react-router/build/lib/components/NotFoundRoute.js","webpack:///./node_modules/react-router/build/lib/components/Redirect.js","webpack:///./node_modules/react-router/build/lib/locations/HashLocation.js","webpack:///./node_modules/react-router/build/lib/locations/RefreshLocation.js","webpack:///./node_modules/react-router/build/lib/locations/StaticLocation.js","webpack:///./node_modules/react-router/build/lib/behaviors/ImitateBrowserBehavior.js","webpack:///./node_modules/react-router/build/lib/createRoutesFromReactChildren.js","webpack:///./node_modules/react-router/build/lib/createRouter.js","webpack:///./node_modules/react-router/build/lib/Cancellation.js","webpack:///./node_modules/react-router/build/lib/Redirect.js","webpack:///./node_modules/@opengov/og_flux/build/mixins/store_listener.js","webpack:///./node_modules/@opengov/og_flux/build/stores/base_store.js","webpack:///./node_modules/node-libs-browser/node_modules/events/events.js","webpack:///./node_modules/@opengov/og_flux/build/dispatcher/index.js","webpack:///./node_modules/@opengov/controlpanel/lib/stores/entity_store.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./node_modules/moment/locale/af.js","webpack:///./node_modules/moment/locale/ar.js","webpack:///./node_modules/moment/locale/ar-dz.js","webpack:///./node_modules/moment/locale/ar-kw.js","webpack:///./node_modules/moment/locale/ar-ly.js","webpack:///./node_modules/moment/locale/ar-ma.js","webpack:///./node_modules/moment/locale/ar-sa.js","webpack:///./node_modules/moment/locale/ar-tn.js","webpack:///./node_modules/moment/locale/az.js","webpack:///./node_modules/moment/locale/be.js","webpack:///./node_modules/moment/locale/bg.js","webpack:///./node_modules/moment/locale/bm.js","webpack:///./node_modules/moment/locale/bn.js","webpack:///./node_modules/moment/locale/bo.js","webpack:///./node_modules/moment/locale/br.js","webpack:///./node_modules/moment/locale/bs.js","webpack:///./node_modules/moment/locale/ca.js","webpack:///./node_modules/moment/locale/cs.js","webpack:///./node_modules/moment/locale/cv.js","webpack:///./node_modules/moment/locale/cy.js","webpack:///./node_modules/moment/locale/da.js","webpack:///./node_modules/moment/locale/de.js","webpack:///./node_modules/moment/locale/de-at.js","webpack:///./node_modules/moment/locale/de-ch.js","webpack:///./node_modules/moment/locale/dv.js","webpack:///./node_modules/moment/locale/el.js","webpack:///./node_modules/moment/locale/en-au.js","webpack:///./node_modules/moment/locale/en-ca.js","webpack:///./node_modules/moment/locale/en-gb.js","webpack:///./node_modules/moment/locale/en-ie.js","webpack:///./node_modules/moment/locale/en-il.js","webpack:///./node_modules/moment/locale/en-nz.js","webpack:///./node_modules/moment/locale/eo.js","webpack:///./node_modules/moment/locale/es.js","webpack:///./node_modules/moment/locale/es-do.js","webpack:///./node_modules/moment/locale/es-us.js","webpack:///./node_modules/moment/locale/et.js","webpack:///./node_modules/moment/locale/eu.js","webpack:///./node_modules/moment/locale/fa.js","webpack:///./node_modules/moment/locale/fi.js","webpack:///./node_modules/moment/locale/fo.js","webpack:///./node_modules/moment/locale/fr.js","webpack:///./node_modules/moment/locale/fr-ca.js","webpack:///./node_modules/moment/locale/fr-ch.js","webpack:///./node_modules/moment/locale/fy.js","webpack:///./node_modules/moment/locale/gd.js","webpack:///./node_modules/moment/locale/gl.js","webpack:///./node_modules/moment/locale/gom-latn.js","webpack:///./node_modules/moment/locale/gu.js","webpack:///./node_modules/moment/locale/he.js","webpack:///./node_modules/moment/locale/hi.js","webpack:///./node_modules/moment/locale/hr.js","webpack:///./node_modules/moment/locale/hu.js","webpack:///./node_modules/moment/locale/hy-am.js","webpack:///./node_modules/moment/locale/id.js","webpack:///./node_modules/moment/locale/is.js","webpack:///./node_modules/moment/locale/it.js","webpack:///./node_modules/moment/locale/ja.js","webpack:///./node_modules/moment/locale/jv.js","webpack:///./node_modules/moment/locale/ka.js","webpack:///./node_modules/moment/locale/kk.js","webpack:///./node_modules/moment/locale/km.js","webpack:///./node_modules/moment/locale/kn.js","webpack:///./node_modules/moment/locale/ko.js","webpack:///./node_modules/moment/locale/ky.js","webpack:///./node_modules/moment/locale/lb.js","webpack:///./node_modules/moment/locale/lo.js","webpack:///./node_modules/moment/locale/lt.js","webpack:///./node_modules/moment/locale/lv.js","webpack:///./node_modules/moment/locale/me.js","webpack:///./node_modules/moment/locale/mi.js","webpack:///./node_modules/moment/locale/mk.js","webpack:///./node_modules/moment/locale/ml.js","webpack:///./node_modules/moment/locale/mr.js","webpack:///./node_modules/moment/locale/ms.js","webpack:///./node_modules/moment/locale/ms-my.js","webpack:///./node_modules/moment/locale/mt.js","webpack:///./node_modules/moment/locale/my.js","webpack:///./node_modules/moment/locale/nb.js","webpack:///./node_modules/moment/locale/ne.js","webpack:///./node_modules/moment/locale/nl.js","webpack:///./node_modules/moment/locale/nl-be.js","webpack:///./node_modules/moment/locale/nn.js","webpack:///./node_modules/moment/locale/pa-in.js","webpack:///./node_modules/moment/locale/pl.js","webpack:///./node_modules/moment/locale/pt.js","webpack:///./node_modules/moment/locale/pt-br.js","webpack:///./node_modules/moment/locale/ro.js","webpack:///./node_modules/moment/locale/ru.js","webpack:///./node_modules/moment/locale/sd.js","webpack:///./node_modules/moment/locale/se.js","webpack:///./node_modules/moment/locale/si.js","webpack:///./node_modules/moment/locale/sk.js","webpack:///./node_modules/moment/locale/sl.js","webpack:///./node_modules/moment/locale/sq.js","webpack:///./node_modules/moment/locale/sr.js","webpack:///./node_modules/moment/locale/sr-cyrl.js","webpack:///./node_modules/moment/locale/ss.js","webpack:///./node_modules/moment/locale/sv.js","webpack:///./node_modules/moment/locale/sw.js","webpack:///./node_modules/moment/locale/ta.js","webpack:///./node_modules/moment/locale/te.js","webpack:///./node_modules/moment/locale/tet.js","webpack:///./node_modules/moment/locale/tg.js","webpack:///./node_modules/moment/locale/th.js","webpack:///./node_modules/moment/locale/tl-ph.js","webpack:///./node_modules/moment/locale/tlh.js","webpack:///./node_modules/moment/locale/tr.js","webpack:///./node_modules/moment/locale/tzl.js","webpack:///./node_modules/moment/locale/tzm.js","webpack:///./node_modules/moment/locale/tzm-latn.js","webpack:///./node_modules/moment/locale/ug-cn.js","webpack:///./node_modules/moment/locale/uk.js","webpack:///./node_modules/moment/locale/ur.js","webpack:///./node_modules/moment/locale/uz.js","webpack:///./node_modules/moment/locale/uz-latn.js","webpack:///./node_modules/moment/locale/vi.js","webpack:///./node_modules/moment/locale/x-pseudo.js","webpack:///./node_modules/moment/locale/yo.js","webpack:///./node_modules/moment/locale/zh-cn.js","webpack:///./node_modules/moment/locale/zh-hk.js","webpack:///./node_modules/moment/locale/zh-tw.js","webpack:///../../../../src/javascripts/jsx/calendar.js","webpack:///../../../../src/javascripts/jsx/toggle_mixin.js","webpack:///../../../../src/javascripts/jsx/timeout_mixin.js","webpack:///./node_modules/react-transition-group/TransitionGroup.js","webpack:///./node_modules/dom-helpers/util/inDOM.js","webpack:///./node_modules/react-transition-group/utils/PropTypes.js","webpack:///./javascripts/models/gl_data_sets.ts","webpack:///./javascripts/models/entity.ts","webpack:///./javascripts/models/chart_of_accounts.ts","webpack:///./node_modules/simply-uuid/index.js","webpack:///./javascripts/models/breakdown.ts","webpack:///./javascripts/athena_state.ts","webpack:///./javascripts/handlebars_helpers.ts","webpack:///./node_modules/handlebars/dist/cjs/handlebars/base.js","webpack:///./node_modules/color/node_modules/color-convert/index.js","webpack:///./javascripts/maps/utils/layer_utils.ts","webpack:///./node_modules/moment-range/dist/moment-range.js","webpack:///./javascripts/stores/invites_store.ts","webpack:///./node_modules/@opengov/capital-style/dist/tokens.js","webpack:///./javascripts/report_keywords/report_keywords_utils.tsx","webpack:///./node_modules/@opengov/launchdarkly/index.ts","webpack:///./node_modules/ldclient-js/dist/ldclient.es.js","webpack:///./javascripts/querygrid/querygrid.ts","webpack:///./node_modules/jquery-ui/widget.js","webpack:///./javascripts/querygrid/plugins/headermenu.ts","webpack:///./javascripts/griddle/bootstrap-datepicker.ts","webpack:///./javascripts/header.tsx","webpack:///./javascripts/footer.tsx","webpack:///./javascripts/report_description.tsx","webpack:///./node_modules/react-i18next/dist/es/I18n.js","webpack:///./javascripts/griddle/report_updated_info.tsx","webpack:///./javascripts/griddle/report_header_row_count.tsx","webpack:///./javascripts/visibility_settings/error.tsx","webpack:///./javascripts/visibility_settings/panel_data.tsx","webpack:///./javascripts/visibility_settings/panel_header.tsx","webpack:///./javascripts/visibility_settings/visibility_utils.tsx","webpack:///./javascripts/highcharts_og/highcharts-shim.ts","webpack:///./node_modules/highcharts/highcharts.js","webpack:///./javascripts/summary_tooltip.tsx","webpack:///./javascripts/summary_pie_slider.tsx","webpack:///./node_modules/react-pure-render/function.js","webpack:///./javascripts/utils/chart_utils.ts","webpack:///./javascripts/mini_loader.tsx","webpack:///./node_modules/rx/dist/rx.all.js","webpack:///./node_modules/unitbezier/index.js","webpack:///./node_modules/mapbox-gl-js-supported/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style.js","webpack:///./node_modules/mapbox-gl-function/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/parse_color.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_spec.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/validate_style.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_constants.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/extend.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_function.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_array.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_number.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_paint_property.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_layout_property.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_light.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_string.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/config.js","webpack:///./javascripts/maps/execute_worker.js","webpack:///./node_modules/worker-loader/createInlineWorker.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/animation_loop.js","webpack:///./node_modules/earcut/src/earcut.js","webpack:///./node_modules/quickselect/quickselect.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/anchor.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/token.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/quads.js","webpack:///./node_modules/react-map-gl/node_modules/grid-index/grid-index.js","webpack:///./node_modules/vector-tile/lib/vectortilelayer.js","webpack:///./node_modules/vector-tile/lib/vectortilefeature.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/vectortile_to_geojson.js","webpack:///./node_modules/whoots-js/index.umd.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/vector_tile_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/raster_tile_source.js","webpack:///./node_modules/resolve-url/resolve-url.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/mat3.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/vec3.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/vec4.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/create_uniform_pragmas.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/attribution.js","webpack:///./node_modules/react-map-gl/dist/config.js","webpack:///./node_modules/react-map-gl/dist/noop.js","webpack:///./node_modules/webgl-heatmap/heatmap-shader.js","webpack:///./node_modules/react-dnd/lib/index.js","webpack:///./node_modules/react-dnd/lib/DragDropContext.js","webpack:///./node_modules/redux/node_modules/lodash/_Symbol.js","webpack:///./node_modules/dnd-core/lib/reducers/dragOffset.js","webpack:///./node_modules/dnd-core/lib/utils/matchesType.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseDifference.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isFunction.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseUnary.js","webpack:///./node_modules/dnd-core/node_modules/lodash/identity.js","webpack:///./node_modules/dnd-core/lib/reducers/dirtyHandlerIds.js","webpack:///./node_modules/dnd-core/node_modules/lodash/noop.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_setToArray.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_Symbol.js","webpack:///./node_modules/react-dnd/lib/utils/shallowEqualScalar.js","webpack:///./node_modules/react-dnd/lib/decorateHandler.js","webpack:///./node_modules/react-dnd/lib/wrapConnectorHooks.js","webpack:///./node_modules/react-dnd/lib/areOptionsEqual.js","webpack:///./node_modules/react-dnd/lib/utils/isValidType.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/identity.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isFunction.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isLength.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isIndex.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isArguments.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isArray.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseUnary.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_SetCache.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_MapCache.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayIncludes.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayIncludesWith.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_cacheHas.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_setToArray.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isArrayLikeObject.js","webpack:///./node_modules/react-dnd-html5-backend/lib/BrowserDetector.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseCreate.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/recompose/node_modules/lodash/_getNative.js","webpack:///./node_modules/recompose/node_modules/lodash/_getData.js","webpack:///./node_modules/recompose/node_modules/lodash/_getFuncName.js","webpack:///./javascripts/maps/tooltip_value.tsx","webpack:///./javascripts/formatValue.ts","webpack:///./node_modules/mapbox-gl/js/mapbox-gl.js","webpack:///./node_modules/mapbox-gl/js/style/style.js","webpack:///./node_modules/mapbox-gl/js/style/parse_color.js","webpack:///./node_modules/mapbox-gl/js/style/style_spec.js","webpack:///./node_modules/mapbox-gl-style-spec/reference/latest.min.js","webpack:///./node_modules/mapbox-gl/js/style/validate_style.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_constants.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/util/extend.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_function.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_array.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_number.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_layer.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_paint_property.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_layout_property.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_source.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_string.js","webpack:///./node_modules/mapbox-gl/js/util/config.js","webpack:///./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack:///./node_modules/querystring-es3/index.js","webpack:///./node_modules/mapbox-gl/js/style/animation_loop.js","webpack:///./node_modules/mapbox-gl/js/source/source.js","webpack:///./node_modules/mapbox-gl/js/source/load_tilejson.js","webpack:///./node_modules/mapbox-gl/js/util/classify_rings.js","webpack:///./node_modules/mapbox-gl/js/symbol/anchor.js","webpack:///./node_modules/mapbox-gl/js/util/token.js","webpack:///./node_modules/mapbox-gl/js/symbol/quads.js","webpack:///./node_modules/mapbox-gl/js/util/intersection_tests.js","webpack:///./node_modules/mapbox-gl/js/source/source_cache.js","webpack:///./node_modules/grid-index/grid-index.js","webpack:///./node_modules/mapbox-gl/js/util/vectortile_to_geojson.js","webpack:///./node_modules/mapbox-gl/js/render/create_uniform_pragmas.js","webpack:///./node_modules/mapbox-gl/js/ui/control/attribution.js","webpack:///./node_modules/mapbox-gl/js/ui/popup.js","webpack:///./javascripts/share/share_options.tsx","webpack:///./node_modules/react-scroll/modules/mixins/animate-scroll.js","webpack:///./node_modules/react-scroll/modules/mixins/scroll-hash.js","webpack:///./node_modules/react-scroll/modules/mixins/scroll-element.js","webpack:///./javascripts/share/report_permission_options.ts","webpack:///./javascripts/TransparencyLoginButton.tsx","webpack:///./javascripts/modals/feedback.tsx","webpack:///./javascripts/document_list.tsx","webpack:///./javascripts/modals/terms-of-service.tsx","webpack:///./javascripts/griddle/budget101.tsx","webpack:///./javascripts/modals/summary_welcome.tsx","webpack:///./javascripts/graph.ts","webpack:///./node_modules/html2canvas/dist/npm/renderer/CanvasRenderer.js","webpack:///./node_modules/html2canvas/dist/npm/Logger.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/padding.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/position.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/textTransform.js","webpack:///./node_modules/html2canvas/dist/npm/Input.js","webpack:///./node_modules/html2canvas/dist/npm/TextBounds.js","webpack:///./node_modules/html2canvas/dist/npm/renderer/ForeignObjectRenderer.js","webpack:///./node_modules/html2canvas/dist/npm/Font.js","webpack:///./node_modules/html2canvas/dist/npm/Proxy.js","webpack:///./javascripts/tables_section/summary_table.tsx","webpack:///./node_modules/machina/node_modules/lodash/dist/lodash.js","webpack:///./javascripts/stores/settings_panel_store.ts","webpack:///./javascripts/wizard/gl_data_sets.tsx","webpack:///./javascripts/wizard/tx_data_sets.tsx","webpack:///./javascripts/settings_panel/settings_panel_header.tsx","webpack:///./javascripts/actions/stories_actions.ts","webpack:///./javascripts/stores/stories_store.ts","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js","webpack:///./node_modules/underscore/modules/index-all.js","webpack:///./node_modules/underscore/modules/index-default.js","webpack:///./node_modules/i18next/index.js","webpack:///./node_modules/i18next/dist/commonjs/index.js","webpack:///./node_modules/i18next/dist/commonjs/i18next.js","webpack:///./node_modules/i18next/dist/commonjs/ResourceStore.js","webpack:///./node_modules/i18next/dist/commonjs/Translator.js","webpack:///./node_modules/i18next/dist/commonjs/LanguageUtils.js","webpack:///./node_modules/i18next/dist/commonjs/PluralResolver.js","webpack:///./node_modules/i18next/dist/commonjs/Interpolator.js","webpack:///./node_modules/i18next/dist/commonjs/BackendConnector.js","webpack:///./node_modules/i18next/dist/commonjs/CacheConnector.js","webpack:///./node_modules/i18next/dist/commonjs/defaults.js","webpack:///./locales/es/report.json","webpack:///./locales/en/report.json","webpack:///./javascripts/routes.tsx","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/react/node_modules/object-assign/index.js","webpack:///./node_modules/react-dom/cjs/react-dom.production.min.js","webpack:///./node_modules/fbjs/lib/ExecutionEnvironment.js","webpack:///./node_modules/react-dom/node_modules/object-assign/index.js","webpack:///./node_modules/fbjs/lib/getActiveElement.js","webpack:///./node_modules/fbjs/lib/containsNode.js","webpack:///./node_modules/fbjs/lib/isTextNode.js","webpack:///./node_modules/fbjs/lib/isNode.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./node_modules/react-router/node_modules/qs/index.js","webpack:///./node_modules/react-router/node_modules/qs/lib/index.js","webpack:///./node_modules/react-router/node_modules/qs/lib/stringify.js","webpack:///./node_modules/react-router/node_modules/qs/lib/parse.js","webpack:///./node_modules/react-router/build/lib/components/ContextWrapper.js","webpack:///./node_modules/react-router/build/lib/components/Link.js","webpack:///./node_modules/react-router/build/lib/locations/TestLocation.js","webpack:///./node_modules/react-router/build/lib/behaviors/ScrollToTopBehavior.js","webpack:///./node_modules/react-router/build/lib/Navigation.js","webpack:///./node_modules/react-router/build/lib/State.js","webpack:///./node_modules/create-react-class/factory.js","webpack:///./node_modules/create-react-class/node_modules/object-assign/index.js","webpack:///./node_modules/react-router/build/lib/ScrollHistory.js","webpack:///./node_modules/react-router/build/lib/getWindowScrollPosition.js","webpack:///./node_modules/react-router/build/lib/isReactChildren.js","webpack:///./node_modules/react-router/build/lib/Transition.js","webpack:///./node_modules/react-router/build/lib/Match.js","webpack:///./node_modules/react-router/build/lib/supportsHistory.js","webpack:///./node_modules/react-router/build/lib/runRouter.js","webpack:///./node_modules/@opengov/og_flux/build/connect.js","webpack:///./node_modules/@opengov/og_flux/build/stores/immutable_store.js","webpack:///./node_modules/flux/index.js","webpack:///./node_modules/flux/lib/Dispatcher.js","webpack:///./node_modules/@opengov/controlpanel/lib/models/entities.js","webpack:///../../../../../src/javascripts/jsx/forms/form.js","webpack:///./node_modules/lodash-deep/lodash-deep.js","webpack:///../../../../../src/javascripts/jsx/forms/input_field.js","webpack:///../../../../../src/javascripts/jsx/forms/toggle.js","webpack:///../../../../../src/javascripts/jsx/forms/textarea.js","webpack:///../../../../../src/javascripts/jsx/forms/select_field.js","webpack:///../../../../src/javascripts/jsx/date_picker.js","webpack:///./node_modules/moment/locale ^\\.\\/.*$","webpack:///../../../../../src/javascripts/jsx/slider/index.js","webpack:///./node_modules/react-addons-pure-render-mixin/index.js","webpack:///../../../../src/javascripts/jsx/event_utils.js","webpack:///../../../../../src/javascripts/jsx/slider/slider_handle.js","webpack:///../../../../../src/javascripts/jsx/slider/slider_range.js","webpack:///../../../../../src/javascripts/jsx/search/search.js","webpack:///../../../../../src/javascripts/jsx/search/search_dropdown.js","webpack:///../../../../../src/javascripts/jsx/search/search_results.js","webpack:///../../../../../src/javascripts/jsx/search/search_result_item.js","webpack:///../../../../src/javascripts/jsx/toggle_switch.js","webpack:///../../../../src/javascripts/jsx/check_button.js","webpack:///../../../../src/javascripts/jsx/dropdown_list.js","webpack:///../../../../src/javascripts/jsx/alert_modal.js","webpack:///../../../../src/javascripts/jsx/flash.js","webpack:///../../../../src/javascripts/jsx/overlay.js","webpack:///../../../../src/javascripts/jsx/global_alert.js","webpack:///../../../../src/javascripts/jsx/loader.js","webpack:///../../../../src/javascripts/jsx/progress_bar.js","webpack:///../../../../src/javascripts/jsx/table.js","webpack:///../../../../src/javascripts/jsx/table_columns.js","webpack:///../../../../src/javascripts/jsx/collection_search.js","webpack:///../../../../src/javascripts/jsx/main_panel.js","webpack:///../../../../src/javascripts/jsx/tabs.js","webpack:///../../../../src/javascripts/jsx/avatar.js","webpack:///../../../../src/javascripts/jsx/report_card.js","webpack:///../../../../src/javascripts/jsx/check_mock.js","webpack:///./node_modules/number-to-words/numberToWords.min.js","webpack:///../../../../src/javascripts/jsx/opengov_logo.js","webpack:///../../../../src/javascripts/jsx/onboarding.js","webpack:///./node_modules/react-transition-group/CSSTransitionGroup.js","webpack:///./node_modules/chain-function/index.js","webpack:///./node_modules/warning/browser.js","webpack:///./node_modules/react-transition-group/utils/ChildMapping.js","webpack:///./node_modules/react-transition-group/CSSTransitionGroupChild.js","webpack:///./node_modules/dom-helpers/class/addClass.js","webpack:///./node_modules/dom-helpers/class/hasClass.js","webpack:///./node_modules/dom-helpers/class/removeClass.js","webpack:///./node_modules/dom-helpers/util/requestAnimationFrame.js","webpack:///./node_modules/dom-helpers/transition/properties.js","webpack:///./javascripts/report_app.tsx","webpack:///./javascripts/models/gl_data_set.ts","webpack:///./javascripts/report_index.tsx","webpack:///./javascripts/models/chart_of_account.ts","webpack:///./node_modules/async/lib/async.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./javascripts/actions/report_preferences_actions.ts","webpack:///./node_modules/@opengov/og_api/lib/og_api.js","webpack:///./node_modules/superagent/node_modules/component-emitter/index.js","webpack:///./node_modules/reduce-component/index.js","webpack:///./node_modules/simply-uuid/lib/uuid-node.js","webpack:///./node_modules/@opengov/og_api/lib/retry_middleware.js","webpack:///./node_modules/react-treeview/lib/react-treeview.js","webpack:///./javascripts/locked_report_creation_modal.tsx","webpack:///./javascripts/create_new_report_button.tsx","webpack:///./javascripts/link_to_civicdashboards_button.tsx","webpack:///./javascripts/stores/report_preferences_store.ts","webpack:///./javascripts/modals/report_welcome_modal.tsx","webpack:///./node_modules/@opengov/og_analytics/lib/ga.js","webpack:///./node_modules/@opengov/og_analytics/lib/heap.js","webpack:///./node_modules/@opengov/og_analytics/lib/type.js","webpack:///./node_modules/raven-js/dist/raven.js","webpack:///./node_modules/@opengov/og_analytics/lib/location.js","webpack:///./node_modules/@opengov/og_analytics/node_modules/object-assign/index.js","webpack:///./javascripts/actions/mask_actions.ts","webpack:///./javascripts/budget_data.ts","webpack:///./javascripts/models/render_line.ts","webpack:///./javascripts/models/budget_node.ts","webpack:///./javascripts/formulas.ts","webpack:///./node_modules/handlebars/dist/cjs/handlebars.runtime.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/decorators.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/logger.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/safe-string.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/runtime.js","webpack:///./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js","webpack:///./templates/download_menu.hbs","webpack:///./templates/filter-section.hbs","webpack:///./templates/griddle/panel_aggregates.hbs","webpack:///./templates/griddle/panel_columns.hbs","webpack:///./templates/griddle/panel_columns_sortable.hbs","webpack:///./templates/griddle/panel_filters.hbs","webpack:///./templates/griddle/select_box.hbs","webpack:///./templates/griddle_subpanels.hbs","webpack:///./templates/modal-budget101.hbs","webpack:///./templates/modal-faq.hbs","webpack:///./templates/modal-feedback.hbs","webpack:///./templates/modal-download.hbs","webpack:///./templates/modal-password.hbs","webpack:///./templates/modal-recoverable-error.hbs","webpack:///./templates/modal-tos.hbs","webpack:///./templates/modal-unrecoverable-error.hbs","webpack:///./templates/modal-welcome.hbs","webpack:///./templates/months.hbs","webpack:///./templates/querygrid/column.hbs","webpack:///./templates/querygrid/date.hbs","webpack:///./templates/querygrid/monetary.hbs","webpack:///./templates/querygrid/numeric.hbs","webpack:///./templates/querygrid/text.hbs","webpack:///./node_modules/filesize/lib/filesize.js","webpack:///./javascripts/stores/date_utils.ts","webpack:///./node_modules/color/color.js","webpack:///./node_modules/color/node_modules/color-convert/conversions.js","webpack:///./node_modules/color/node_modules/color-string/color-string.js","webpack:///./javascripts/query_planners/visual_aggregate_planner.ts","webpack:///./javascripts/utils/time_utils.ts","webpack:///./javascripts/utils/uuid_converter.ts","webpack:///./javascripts/utils/google_translate.ts","webpack:///./javascripts/utils/search_utils.ts","webpack:///./node_modules/fuse.js/src/fuse.js","webpack:///./javascripts/fixtures/template_fixtures.ts","webpack:///./javascripts/report_index_nav.tsx","webpack:///./javascripts/capital_tabs/index.ts","webpack:///./javascripts/capital_tabs/Tab.Group/Tab.Group.tsx","webpack:///./javascripts/capital_tabs/Tab.Option/Tab.Option.tsx","webpack:///./javascripts/capital_badge/Badge.tsx","webpack:///./node_modules/@opengov/capital-style/dist/index.js","webpack:///./node_modules/@opengov/capital-style/dist/color-utils.js","webpack:///./javascripts/report_index_header/header.tsx","webpack:///./javascripts/report_index_header/search.tsx","webpack:///./javascripts/report_index_header/filter.tsx","webpack:///./javascripts/report_index_header/filter_options.tsx","webpack:///./javascripts/report_index_header/sort.tsx","webpack:///./javascripts/report_index_header/list.tsx","webpack:///./javascripts/report_index_header/show.tsx","webpack:///./javascripts/report_index_item.tsx","webpack:///./javascripts/report_list_view.tsx","webpack:///./javascripts/report_keywords/edit_keywords_panel.tsx","webpack:///./javascripts/report_keywords/keywords_search.tsx","webpack:///./javascripts/report_keywords/toggle_edit_keyword.tsx","webpack:///./node_modules/@opengov/launchdarkly/src/index.ts","webpack:///./javascripts/report_view.tsx","webpack:///./javascripts/grid_report.tsx","webpack:///./javascripts/griddle.ts","webpack:///./javascripts/views/filter_menu.ts","webpack:///./node_modules/jquery-ui/position.js","webpack:///./node_modules/jquery-ui/sortable.js","webpack:///./node_modules/jquery-ui/core.js","webpack:///./node_modules/jquery-ui/mouse.js","webpack:///./node_modules/@opengov/slickgrid/lib/jquery.event.drag-2.2.js","webpack:///./node_modules/@opengov/slickgrid/slick.core.js","webpack:///./node_modules/@opengov/slickgrid/slick.grid.js","webpack:///./node_modules/@opengov/slickgrid/plugins/slick.autotooltips.js","webpack:///./node_modules/@opengov/slickgrid/plugins/slick.cellselectionmodel.js","webpack:///./node_modules/@opengov/slickgrid/plugins/slick.cellrangeselector.js","webpack:///./node_modules/@opengov/slickgrid/plugins/slick.cellrangedecorator.js","webpack:///./node_modules/@opengov/slickgrid/plugins/slick.cellexternalcopymanager.js","webpack:///./javascripts/querygrid/plugins/checkbook_contextmenu.ts","webpack:///./javascripts/querygrid/plugins/facetpanel.ts","webpack:///./javascripts/views/selector.ts","webpack:///./javascripts/querygrid/plugins/filterspanel.ts","webpack:///./javascripts/querygrid/plugins/columnspanel.ts","webpack:///./node_modules/dragula/dragula.js","webpack:///./node_modules/contra/emitter.js","webpack:///./node_modules/atoa/atoa.js","webpack:///./node_modules/contra/debounce.js","webpack:///./node_modules/ticky/ticky-browser.js","webpack:///./node_modules/crossvent/src/crossvent.js","webpack:///./node_modules/custom-event/index.js","webpack:///./node_modules/crossvent/src/eventmap.js","webpack:///./node_modules/dragula/classes.js","webpack:///./javascripts/network/header.tsx","webpack:///./javascripts/social_networking.tsx","webpack:///./javascripts/griddle/report_header.tsx","webpack:///./node_modules/autolinker/dist/Autolinker.js","webpack:///./javascripts/griddle/autocomplete.tsx","webpack:///./node_modules/react-i18next/dist/es/translate.js","webpack:///./node_modules/react-i18next/dist/es/shallowEqual.js","webpack:///./node_modules/react-i18next/dist/es/Interpolate.js","webpack:///./node_modules/react-i18next/dist/es/Trans.js","webpack:///./node_modules/html-parse-stringify2/index.js","webpack:///./node_modules/html-parse-stringify2/lib/parse.js","webpack:///./node_modules/html-parse-stringify2/lib/parse-tag.js","webpack:///./node_modules/void-elements/index.js","webpack:///./node_modules/html-parse-stringify2/lib/stringify.js","webpack:///./node_modules/react-i18next/dist/es/I18nextProvider.js","webpack:///./node_modules/react-i18next/dist/es/loadNamespaces.js","webpack:///./javascripts/griddle/sub_report_header.tsx","webpack:///./javascripts/griddle/filter_pill.tsx","webpack:///./javascripts/utils/filters_utils.ts","webpack:///./javascripts/griddle/amounts_type_menu.tsx","webpack:///./javascripts/griddle/amount_menu.tsx","webpack:///./javascripts/visibility_settings/amount_column_settings/amount_columns_settings_toggle.tsx","webpack:///./javascripts/visibility_settings/amount_column_settings/amount_columns_settings_panel.tsx","webpack:///./javascripts/griddle/aggregate_visualization.tsx","webpack:///./javascripts/griddle/aggregate_visualization_charts.tsx","webpack:///./node_modules/highcharts/highcharts.src.js","webpack:///./node_modules/highcharts/modules/treemap.src.js","webpack:///./node_modules/highcharts/modules/exporting.src.js","webpack:///./javascripts/highcharts_og/vendor/highcharts-pattern-fill.ts","webpack:///./node_modules/react-pure-render/shallowEqual.js","webpack:///./javascripts/document_mixin.ts","webpack:///./javascripts/griddle/grid_legend/index.tsx","webpack:///./javascripts/griddle/grid_legend/legend_item.tsx","webpack:///./javascripts/griddle/grid_legend/legend_sort.tsx","webpack:///./javascripts/griddle/grid_legend/legend_more_button.tsx","webpack:///./node_modules/chroma-js/chroma.js","webpack:///./javascripts/griddle/map_amount_menu.tsx","webpack:///./javascripts/griddle/map/map_type_menu.tsx","webpack:///./javascripts/griddle/grid_graph_type.tsx","webpack:///./javascripts/griddle/map/map_unsupported_message.tsx","webpack:///./javascripts/griddle/map/gl_grid_map.tsx","webpack:///./javascripts/griddle/map/grid_map_legend.tsx","webpack:///./javascripts/griddle/map/bubble_map_legend.tsx","webpack:///./javascripts/griddle/map/horizontal_scaled_circles.tsx","webpack:///./javascripts/griddle/map/heat_map_legend.tsx","webpack:///./node_modules/react-map-gl/index.js","webpack:///./node_modules/react-map-gl/dist/index.js","webpack:///./node_modules/react-map-gl/dist/map.react.js","webpack:///./node_modules/assert/node_modules/object-assign/index.js","webpack:///./node_modules/node-libs-browser/node_modules/util/support/isBufferBrowser.js","webpack:///./node_modules/node-libs-browser/node_modules/inherits/inherits_browser.js","webpack:///./node_modules/pure-render-decorator/index.js","webpack:///./node_modules/fbjs/lib/warning.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/package.json","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/map.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/canvas.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_transition.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_declaration.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/latest.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/v8.json","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate_style.min.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_boolean.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_color.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/latest.min.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/v8.min.json","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_glyphs_url.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/background_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/circle_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/fill_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/line_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/raster_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/symbol_style_layer.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/image_sprite.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/glyph_source.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/glyphs.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/glyph_atlas.js","webpack:///./node_modules/pbf/buffer.js","webpack:///./node_modules/ieee754/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/sprite_atlas.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/line_atlas.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/dispatcher.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/actor.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/worker.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/fill_bucket.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/classify_rings.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/line_bucket.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/circle_bucket.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/symbol_bucket.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/get_anchors.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/check_max_angle.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/shaping.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/resolve_text.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/mergelines.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/clip_line.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_feature.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/feature_index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/dictionary_coder.js","webpack:///./node_modules/vector-tile/lib/vectortile.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/intersection_tests.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_tile.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_box.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/symbol_instances.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/symbol_quads.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/lru_cache.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/painter.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/mat2.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/mat2d.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/mat4.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/quat.js","webpack:///./node_modules/gl-matrix/src/gl-matrix/vec2.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/frame_history.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/painter/use_program.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl-shaders/index.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_symbol.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_collision_debug.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_circle.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_line.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_fill.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_background.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_debug.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/lib/debugtext.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/hash.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/bind_handlers.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/scroll_zoom.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/box_zoom.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/drag_rotate.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/drag_pan.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/keyboard.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/dblclick_zoom.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/touch_zoom_rotate.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/camera.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/navigation.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/geolocate.js","webpack:///./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/popup.js","webpack:///./node_modules/bowser/src/bowser.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///./node_modules/react-map-gl/dist/map-interactions.react.js","webpack:///./node_modules/react-map-gl/dist/diff-styles.js","webpack:///./node_modules/react-map-gl/dist/fit-bounds.js","webpack:///./node_modules/react-map-gl/dist/overlays/index.js","webpack:///./node_modules/react-map-gl/dist/overlays/canvas.react.js","webpack:///./node_modules/react-map-gl/dist/overlays/choropleth.react.js","webpack:///./node_modules/react-map-gl/dist/overlays/draggable-points.react.js","webpack:///./node_modules/svg-transform/index.js","webpack:///./node_modules/react-map-gl/dist/utils.js","webpack:///./node_modules/react-map-gl/dist/overlays/html.react.js","webpack:///./node_modules/react-map-gl/dist/overlays/scatterplot.react.js","webpack:///./node_modules/canvas-composite-types/index.js","webpack:///./node_modules/react-map-gl/dist/overlays/svg.react.js","webpack:///./javascripts/maps/feature_layer.tsx","webpack:///./javascripts/maps/gl_heat_map_layer.tsx","webpack:///./node_modules/webgl-heatmap/index.js","webpack:///./node_modules/webgl-heatmap/webgl-heatmap.js","webpack:///./node_modules/webgl-heatmap/heatmap-heights.js","webpack:///./node_modules/webgl-heatmap/heatmap-node.js","webpack:///./node_modules/webgl-heatmap/framebuffer.js","webpack:///./javascripts/maps/gl_map_tooltip.tsx","webpack:///./javascripts/maps/tooltip_editor.tsx","webpack:///./node_modules/dnd-core/lib/index.js","webpack:///./node_modules/dnd-core/lib/DragDropManager.js","webpack:///./node_modules/redux/lib/createStore.js","webpack:///./node_modules/redux/node_modules/lodash/isPlainObject.js","webpack:///./node_modules/redux/node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/redux/node_modules/lodash/_root.js","webpack:///./node_modules/redux/node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/redux/node_modules/lodash/_getRawTag.js","webpack:///./node_modules/redux/node_modules/lodash/_objectToString.js","webpack:///./node_modules/redux/node_modules/lodash/_getPrototype.js","webpack:///./node_modules/redux/node_modules/lodash/_overArg.js","webpack:///./node_modules/redux/node_modules/lodash/isObjectLike.js","webpack:///./node_modules/symbol-observable/es/index.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///./node_modules/symbol-observable/es/ponyfill.js","webpack:///./node_modules/dnd-core/lib/reducers/index.js","webpack:///./node_modules/dnd-core/lib/reducers/dragOperation.js","webpack:///./node_modules/dnd-core/node_modules/lodash/without.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_MapCache.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_Hash.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_hashClear.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_getRawTag.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_objectToString.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_isMasked.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_coreJsData.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_toSource.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_getValue.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_hashDelete.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_hashGet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_hashHas.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_hashSet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_ListCache.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/dnd-core/node_modules/lodash/eq.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_Map.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_isKeyable.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseIndexOf.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseFindIndex.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseIsNaN.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_strictIndexOf.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_overRest.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_apply.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_setToString.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseSetToString.js","webpack:///./node_modules/dnd-core/node_modules/lodash/constant.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_defineProperty.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_shortOut.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isArrayLike.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isLength.js","webpack:///./node_modules/dnd-core/lib/reducers/refCount.js","webpack:///./node_modules/dnd-core/node_modules/lodash/xor.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_arrayFilter.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseXor.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseFlatten.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_arrayPush.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_isFlattenable.js","webpack:///./node_modules/dnd-core/node_modules/lodash/isArguments.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseUniq.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_createSet.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_Set.js","webpack:///./node_modules/dnd-core/node_modules/lodash/intersection.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_baseIntersection.js","webpack:///./node_modules/dnd-core/node_modules/lodash/_castArrayLikeObject.js","webpack:///./node_modules/dnd-core/lib/reducers/stateId.js","webpack:///./node_modules/dnd-core/lib/DragDropMonitor.js","webpack:///./node_modules/dnd-core/lib/HandlerRegistry.js","webpack:///./node_modules/asap/browser-asap.js","webpack:///./node_modules/asap/browser-raw.js","webpack:///./node_modules/dnd-core/lib/utils/getNextUniqueId.js","webpack:///./node_modules/dnd-core/lib/DragSource.js","webpack:///./node_modules/dnd-core/lib/DropTarget.js","webpack:///./node_modules/dnd-core/lib/backends/createTestBackend.js","webpack:///./node_modules/react-dnd/lib/DragDropContextProvider.js","webpack:///./node_modules/react-dnd/lib/DragLayer.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_root.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_getRawTag.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_objectToString.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_getPrototype.js","webpack:///./node_modules/react-dnd/node_modules/lodash/_overArg.js","webpack:///./node_modules/react-dnd/node_modules/lodash/isObjectLike.js","webpack:///./node_modules/react-dnd/lib/DragSource.js","webpack:///./node_modules/disposables/modules/index.js","webpack:///./node_modules/disposables/modules/Disposable.js","webpack:///./node_modules/disposables/modules/CompositeDisposable.js","webpack:///./node_modules/disposables/modules/SerialDisposable.js","webpack:///./node_modules/react-dnd/lib/registerSource.js","webpack:///./node_modules/react-dnd/lib/createSourceFactory.js","webpack:///./node_modules/react-dnd/lib/createSourceMonitor.js","webpack:///./node_modules/react-dnd/lib/createSourceConnector.js","webpack:///./node_modules/react-dnd/lib/utils/cloneWithRef.js","webpack:///./node_modules/react-dnd/node_modules/lodash/isArray.js","webpack:///./node_modules/react-dnd/lib/DropTarget.js","webpack:///./node_modules/react-dnd/lib/registerTarget.js","webpack:///./node_modules/react-dnd/lib/createTargetFactory.js","webpack:///./node_modules/react-dnd/lib/createTargetMonitor.js","webpack:///./node_modules/react-dnd/lib/createTargetConnector.js","webpack:///./node_modules/react-dnd-html5-backend/lib/index.js","webpack:///./node_modules/react-dnd-html5-backend/lib/HTML5Backend.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/defaults.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_overRest.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_apply.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_setToString.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseSetToString.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/constant.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_defineProperty.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_getRawTag.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_objectToString.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isMasked.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_coreJsData.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_toSource.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_getValue.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_shortOut.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isIterateeCall.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/keysIn.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayLikeKeys.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseTimes.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isBuffer.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/stubFalse.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/isTypedArray.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsTypedArray.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_nodeUtil.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseKeysIn.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isPrototype.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_nativeKeysIn.js","webpack:///./node_modules/react-dnd-html5-backend/lib/shallowEqual.js","webpack:///./node_modules/react-dnd-html5-backend/lib/EnterLeaveCounter.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/union.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseFlatten.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayPush.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isFlattenable.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseUniq.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_Hash.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashClear.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashDelete.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashGet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashHas.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashSet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_ListCache.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_Map.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_isKeyable.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIndexOf.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseFindIndex.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsNaN.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_strictIndexOf.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_createSet.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_Set.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/noop.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/without.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseDifference.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayMap.js","webpack:///./node_modules/react-dnd-html5-backend/node_modules/lodash/memoize.js","webpack:///./node_modules/react-dnd-html5-backend/lib/OffsetUtils.js","webpack:///./node_modules/react-dnd-html5-backend/lib/MonotonicInterpolant.js","webpack:///./node_modules/react-dnd-html5-backend/lib/NativeDragSources.js","webpack:///./node_modules/react-dnd-html5-backend/lib/getEmptyImage.js","webpack:///./javascripts/maps/sortable_tooltip_editor_item.tsx","webpack:///./node_modules/recompose/compose.js","webpack:///./node_modules/recompose/node_modules/lodash/flowRight.js","webpack:///./node_modules/recompose/node_modules/lodash/_createFlow.js","webpack:///./node_modules/recompose/node_modules/lodash/_flatRest.js","webpack:///./node_modules/recompose/node_modules/lodash/flatten.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseFlatten.js","webpack:///./node_modules/recompose/node_modules/lodash/_arrayPush.js","webpack:///./node_modules/recompose/node_modules/lodash/_isFlattenable.js","webpack:///./node_modules/recompose/node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/recompose/node_modules/lodash/isArguments.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/recompose/node_modules/lodash/_getRawTag.js","webpack:///./node_modules/recompose/node_modules/lodash/_objectToString.js","webpack:///./node_modules/recompose/node_modules/lodash/_overRest.js","webpack:///./node_modules/recompose/node_modules/lodash/_apply.js","webpack:///./node_modules/recompose/node_modules/lodash/_setToString.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseSetToString.js","webpack:///./node_modules/recompose/node_modules/lodash/constant.js","webpack:///./node_modules/recompose/node_modules/lodash/_defineProperty.js","webpack:///./node_modules/recompose/node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/recompose/node_modules/lodash/isFunction.js","webpack:///./node_modules/recompose/node_modules/lodash/_isMasked.js","webpack:///./node_modules/recompose/node_modules/lodash/_coreJsData.js","webpack:///./node_modules/recompose/node_modules/lodash/_toSource.js","webpack:///./node_modules/recompose/node_modules/lodash/_getValue.js","webpack:///./node_modules/recompose/node_modules/lodash/identity.js","webpack:///./node_modules/recompose/node_modules/lodash/_shortOut.js","webpack:///./node_modules/recompose/node_modules/lodash/_metaMap.js","webpack:///./node_modules/recompose/node_modules/lodash/_WeakMap.js","webpack:///./node_modules/recompose/node_modules/lodash/noop.js","webpack:///./node_modules/recompose/node_modules/lodash/_realNames.js","webpack:///./node_modules/recompose/node_modules/lodash/_isLaziable.js","webpack:///./node_modules/recompose/node_modules/lodash/wrapperLodash.js","webpack:///./node_modules/recompose/node_modules/lodash/_wrapperClone.js","webpack:///./node_modules/recompose/node_modules/lodash/_copyArray.js","webpack:///./javascripts/maps/tooltip_editor_column_select.tsx","webpack:///./javascripts/maps/tooltip.tsx","webpack:///./javascripts/maps/gl_popup.tsx","webpack:///./node_modules/mapbox-gl/package.json","webpack:///./node_modules/mapbox-gl/js/ui/map.js","webpack:///./node_modules/mapbox-gl/js/util/browser/canvas.js","webpack:///./node_modules/mapbox-gl/js/style/style_transition.js","webpack:///./node_modules/mapbox-gl/js/style/style_declaration.js","webpack:///./node_modules/mapbox-gl-style-spec/reference/v8.min.json","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate_style.min.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_boolean.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_color.js","webpack:///./node_modules/mapbox-gl-style-spec/lib/validate/validate_glyphs_url.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/background_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/circle_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/fill_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/line_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/raster_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/style_layer/symbol_style_layer.js","webpack:///./node_modules/mapbox-gl/js/style/image_sprite.js","webpack:///./node_modules/url/url.js","webpack:///./node_modules/url/util.js","webpack:///./node_modules/querystring-es3/decode.js","webpack:///./node_modules/querystring-es3/encode.js","webpack:///./node_modules/mapbox-gl/js/symbol/glyph_source.js","webpack:///./node_modules/mapbox-gl/js/util/glyphs.js","webpack:///./node_modules/mapbox-gl/js/symbol/glyph_atlas.js","webpack:///./node_modules/mapbox-gl/js/symbol/sprite_atlas.js","webpack:///./node_modules/mapbox-gl/js/render/line_atlas.js","webpack:///./node_modules/mapbox-gl/js/util/dispatcher.js","webpack:///./node_modules/mapbox-gl/js/util/actor.js","webpack:///./node_modules/mapbox-gl/js/source/vector_tile_source.js","webpack:///./node_modules/mapbox-gl/js/source/raster_tile_source.js","webpack:///./node_modules/mapbox-gl/js/source/geojson_source.js","webpack:///./node_modules/mapbox-gl/js/data/array_group.js","webpack:///./node_modules/mapbox-gl/js/data/buffer_group.js","webpack:///./node_modules/mapbox-gl/js/data/bucket/fill_bucket.js","webpack:///./node_modules/mapbox-gl/js/data/bucket/line_bucket.js","webpack:///./node_modules/mapbox-gl/js/data/bucket/circle_bucket.js","webpack:///./node_modules/mapbox-gl/js/data/bucket/symbol_bucket.js","webpack:///./node_modules/mapbox-gl/js/symbol/get_anchors.js","webpack:///./node_modules/mapbox-gl/js/symbol/check_max_angle.js","webpack:///./node_modules/mapbox-gl/js/symbol/shaping.js","webpack:///./node_modules/mapbox-gl/js/symbol/resolve_text.js","webpack:///./node_modules/mapbox-gl/js/symbol/mergelines.js","webpack:///./node_modules/mapbox-gl/js/symbol/clip_line.js","webpack:///./node_modules/mapbox-gl/js/symbol/collision_feature.js","webpack:///./node_modules/mapbox-gl/js/util/find_pole_of_inaccessibility.js","webpack:///./node_modules/tinyqueue/index.js","webpack:///./node_modules/mapbox-gl/js/source/video_source.js","webpack:///./node_modules/mapbox-gl/js/source/image_source.js","webpack:///./node_modules/mapbox-gl/js/source/query_features.js","webpack:///./node_modules/mapbox-gl/js/source/tile.js","webpack:///./node_modules/mapbox-gl/js/data/feature_index.js","webpack:///./node_modules/mapbox-gl/js/util/dictionary_coder.js","webpack:///./node_modules/mapbox-gl/js/symbol/collision_tile.js","webpack:///./node_modules/mapbox-gl/js/symbol/collision_box.js","webpack:///./node_modules/mapbox-gl/js/symbol/symbol_instances.js","webpack:///./node_modules/mapbox-gl/js/symbol/symbol_quads.js","webpack:///./node_modules/mapbox-gl/js/util/lru_cache.js","webpack:///./node_modules/mapbox-gl/js/global_worker_pool.js","webpack:///./node_modules/mapbox-gl/js/util/worker_pool.js","webpack:///./node_modules/mapbox-gl/js/util/browser/web_worker.js","webpack:///./node_modules/mapbox-gl/js/source/worker.js","webpack:///./node_modules/mapbox-gl/js/render/painter.js","webpack:///./node_modules/mapbox-gl/js/render/frame_history.js","webpack:///./node_modules/mapbox-gl/js/render/painter/use_program.js","webpack:///./node_modules/mapbox-gl-shaders/index.js","webpack:///./node_modules/mapbox-gl/js/render/draw_symbol.js","webpack:///./node_modules/mapbox-gl/js/render/draw_collision_debug.js","webpack:///./node_modules/mapbox-gl/js/render/draw_circle.js","webpack:///./node_modules/mapbox-gl/js/render/draw_line.js","webpack:///./node_modules/mapbox-gl/js/render/draw_fill.js","webpack:///./node_modules/mapbox-gl/js/render/draw_background.js","webpack:///./node_modules/mapbox-gl/js/render/draw_debug.js","webpack:///./node_modules/mapbox-gl/js/lib/debugtext.js","webpack:///./node_modules/mapbox-gl/js/geo/transform.js","webpack:///./node_modules/mapbox-gl/js/ui/hash.js","webpack:///./node_modules/mapbox-gl/js/ui/bind_handlers.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/scroll_zoom.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/box_zoom.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/drag_rotate.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/drag_pan.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/keyboard.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/dblclick_zoom.js","webpack:///./node_modules/mapbox-gl/js/ui/handler/touch_zoom_rotate.js","webpack:///./node_modules/mapbox-gl/js/ui/camera.js","webpack:///./node_modules/mapbox-gl/js/ui/control/navigation.js","webpack:///./node_modules/mapbox-gl/js/ui/control/geolocate.js","webpack:///./node_modules/mapbox-gl/js/ui/control/scale.js","webpack:///./node_modules/mapbox-gl/js/ui/marker.js","webpack:///./javascripts/griddle/visualization_button.tsx","webpack:///./javascripts/grid_header_actions.tsx","webpack:///./javascripts/header_actions/grid_help_menu.tsx","webpack:///./node_modules/react-tether/lib/react-tether.js","webpack:///./node_modules/react-tether/lib/TetherComponent.js","webpack:///./node_modules/tether/dist/js/tether.js","webpack:///./javascripts/share/share_message.tsx","webpack:///./javascripts/share/share_message_footer.tsx","webpack:///./javascripts/share/share_message_header.tsx","webpack:///./javascripts/share/share_message_action.tsx","webpack:///./javascripts/share/message_search.tsx","webpack:///./node_modules/react-scroll/modules/index.js","webpack:///./node_modules/react-scroll/modules/components/Link.js","webpack:///./node_modules/lodash.throttle/index.js","webpack:///./node_modules/react-scroll/modules/mixins/smooth.js","webpack:///./node_modules/react-scroll/modules/mixins/cancel-events.js","webpack:///./node_modules/react-scroll/modules/components/Button.js","webpack:///./node_modules/react-scroll/modules/components/Element.js","webpack:///./node_modules/react-scroll/modules/mixins/Helpers.js","webpack:///./javascripts/share/share_notification.tsx","webpack:///./javascripts/share/change_report_permission.tsx","webpack:///./javascripts/share/report_permission_option.tsx","webpack:///./javascripts/share/share_options_content.tsx","webpack:///./javascripts/share/invitable_user.tsx","webpack:///./javascripts/share/owner_confirmation.tsx","webpack:///./javascripts/share/share_options_dropdown.tsx","webpack:///./javascripts/share/error_display.tsx","webpack:///./javascripts/share/invitee_search.tsx","webpack:///./javascripts/header_actions/grid_download_menu/index.tsx","webpack:///./javascripts/header_actions/grid_download_menu/grid_download_menu.tsx","webpack:///./javascripts/targets/target_toggle.tsx","webpack:///./javascripts/targets/target_panel.tsx","webpack:///./javascripts/targets/target_progress_bar.tsx","webpack:///./javascripts/targets/target_status.tsx","webpack:///./javascripts/check_panel.tsx","webpack:///./javascripts/modal_gridhowto.tsx","webpack:///./javascripts/banner.tsx","webpack:///./javascripts/griddle/welcome_modal.tsx","webpack:///./javascripts/grid_break_down_dropdown.tsx","webpack:///./javascripts/griddle/breakdown_menu.tsx","webpack:///./javascripts/visibility_settings/breakdown_settings/breakdowns_settings_toggle.tsx","webpack:///./javascripts/visibility_settings/breakdown_settings/breakdowns_settings_panel.tsx","webpack:///./javascripts/grid_report_total.tsx","webpack:///./javascripts/email_export_filter.tsx","webpack:///./javascripts/header_actions/grid_download_menu/export_filter/public_user/index.tsx","webpack:///./javascripts/header_actions/grid_download_menu/export_filter/public_user/processing_export.tsx","webpack:///./javascripts/header_actions/grid_download_menu/export_filter/public_user/finished_export.tsx","webpack:///./javascripts/header_actions/grid_download_menu/export_filter/email_logged_in_user.tsx","webpack:///./javascripts/griddle/summary_table.tsx","webpack:///./javascripts/report_config_buttons.tsx","webpack:///./javascripts/entity_logo.tsx","webpack:///./javascripts/report_list.tsx","webpack:///./javascripts/toggle_panel.tsx","webpack:///./javascripts/saved_views_panel/index.tsx","webpack:///./javascripts/saved_views_panel/saved_views_list.tsx","webpack:///./javascripts/saved_views_panel/saved_view_item.tsx","webpack:///./javascripts/saved_views_panel/saved_view_modal.tsx","webpack:///./javascripts/story_list.tsx","webpack:///./javascripts/filter-buttons.tsx","webpack:///./javascripts/summary_report.tsx","webpack:///./javascripts/report_header.tsx","webpack:///./javascripts/breadcrumbs.tsx","webpack:///./javascripts/title.tsx","webpack:///./javascripts/header_actions.tsx","webpack:///./javascripts/header_actions/help_menu.tsx","webpack:///./javascripts/header_actions/create_copy_menu.tsx","webpack:///./javascripts/graphtype.tsx","webpack:///./javascripts/filter_panel_options.tsx","webpack:///./javascripts/legend/index.tsx","webpack:///./javascripts/annotations_button.tsx","webpack:///./javascripts/legend/legend_item.tsx","webpack:///./javascripts/legend/legend_more_button.tsx","webpack:///./javascripts/legend/legend_sort.tsx","webpack:///./javascripts/models/download.ts","webpack:///./javascripts/measure_text.ts","webpack:///./javascripts/summary_graph.tsx","webpack:///./javascripts/series_tooltip.tsx","webpack:///./javascripts/single_point_tooltip.tsx","webpack:///./javascripts/annotations_panel.tsx","webpack:///./node_modules/react-autolink-text/lib/index.js","webpack:///./node_modules/react-autolink-text/lib/match_parser.js","webpack:///./node_modules/react-autolink-text/lib/match_validator.js","webpack:///./node_modules/react-autolink-text/lib/url_match.js","webpack:///./javascripts/summary_report_filters_panel.tsx","webpack:///./javascripts/breakdown_switcher.tsx","webpack:///./javascripts/filter_menu_toggles.tsx","webpack:///./javascripts/time_period.tsx","webpack:///./javascripts/utils/toggle_mixin.ts","webpack:///./javascripts/fiscal_year_dropdown.tsx","webpack:///./javascripts/global_alert.tsx","webpack:///./javascripts/modals/howto.tsx","webpack:///./javascripts/modals/download.tsx","webpack:///./javascripts/modals/modal_operations/download_operations.ts","webpack:///./javascripts/operations/html2canvas_operations.ts","webpack:///./node_modules/html2canvas/dist/npm/index.js","webpack:///./node_modules/html2canvas/dist/npm/Window.js","webpack:///./node_modules/html2canvas/dist/npm/NodeParser.js","webpack:///./node_modules/html2canvas/dist/npm/StackingContext.js","webpack:///./node_modules/html2canvas/dist/npm/drawing/Size.js","webpack:///./node_modules/html2canvas/dist/npm/drawing/BezierCurve.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/borderRadius.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/display.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/float.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/font.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/letterSpacing.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/overflow.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/textShadow.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/transform.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/visibility.js","webpack:///./node_modules/html2canvas/dist/npm/parsing/zIndex.js","webpack:///./node_modules/html2canvas/dist/npm/drawing/Circle.js","webpack:///./node_modules/html2canvas/dist/npm/Renderer.js","webpack:///./node_modules/html2canvas/dist/npm/Gradient.js","webpack:///./node_modules/html2canvas/dist/npm/Angle.js","webpack:///./node_modules/html2canvas/dist/npm/Clone.js","webpack:///./node_modules/html2canvas/dist/npm/ResourceLoader.js","webpack:///./node_modules/canvg/canvg.js","webpack:///./node_modules/rgbcolor/index.js","webpack:///./node_modules/stackblur/index.js","webpack:///./javascripts/filter_panel/index.tsx","webpack:///./javascripts/filter_panel/panel.tsx","webpack:///./javascripts/filter_panel/node.tsx","webpack:///./javascripts/filter_panel/search_input.tsx","webpack:///./javascripts/filter_panel/sort_dropdown.tsx","webpack:///./javascripts/utils/projections_utils.tsx","webpack:///./javascripts/tables_section/summary_table_head.tsx","webpack:///./javascripts/utils/summary_table_utils.ts","webpack:///./javascripts/tables_section/datagrid_container_component.tsx","webpack:///./javascripts/tables_section/datagrid_component.tsx","webpack:///./javascripts/report_panel.tsx","webpack:///./javascripts/wizard/index.tsx","webpack:///./javascripts/wizard/report_creation_flow.tsx","webpack:///./node_modules/machina/lib/machina.js","webpack:///./javascripts/wizard/report_type.tsx","webpack:///./javascripts/wizard/ledger_types.tsx","webpack:///./javascripts/wizard/check_dataset_subset.ts","webpack:///./javascripts/wizard/coa.tsx","webpack:///./javascripts/wizard/report_name.tsx","webpack:///./javascripts/wizard/report_created.tsx","webpack:///./javascripts/wizard/no_data.tsx","webpack:///./javascripts/wizard/report_creation_utils.ts","webpack:///./javascripts/models/report_types.ts","webpack:///./javascripts/models/report_type.ts","webpack:///./javascripts/wizard/report_edit_flow.tsx","webpack:///./javascripts/wizard/report_linking_flow.tsx","webpack:///./javascripts/wizard/ajax_error.tsx","webpack:///./javascripts/wizard/no_grid_reports.tsx","webpack:///./javascripts/wizard/embed_grid_report.tsx","webpack:///./javascripts/modals/password.tsx","webpack:///./javascripts/editor_footer.tsx","webpack:///./javascripts/handle_jquery_ajax_error.tsx","webpack:///./javascripts/settings_panel/index.tsx","webpack:///./javascripts/settings_panel/settings_category_list.tsx","webpack:///./javascripts/settings_panel/settings_panel_header_text.tsx","webpack:///./javascripts/settings_panel/settings_category_item.tsx","webpack:///./javascripts/settings_panel/settings_category_panel.tsx","webpack:///./javascripts/settings_panel/general_settings.tsx","webpack:///./javascripts/settings_panel/mask_field.tsx","webpack:///./javascripts/settings_panel/view_settings.tsx","webpack:///./javascripts/settings_panel/y_axis_scale.tsx","webpack:///./javascripts/settings_panel/metrics_dropdown.tsx","webpack:///./javascripts/settings_panel/default_configuration.tsx","webpack:///./javascripts/x_axis_editor.tsx","webpack:///./javascripts/settings_panel/current_year_settings.tsx","webpack:///./javascripts/settings_panel/disableable_toggle.tsx","webpack:///./javascripts/trapi_middleware.ts","webpack:///./javascripts/story_view.tsx","webpack:///./javascripts/stories_header_actions.tsx","webpack:///./javascripts/utils/report_utils.ts","webpack:///./node_modules/babel-polyfill/lib/index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/shim.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js","webpack:///./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js","webpack:///./node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js","webpack:///./javascripts/standalone.ts"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","global","factory","this","hooks","hookCallback","apply","arguments","isArray","input","Array","toString","isObject","isObjectEmpty","obj","getOwnPropertyNames","length","k","isUndefined","isNumber","isDate","Date","map","arr","fn","res","push","hasOwnProp","a","b","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","some","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","absFloor","number","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","key","slice","join","Error","stack","deprecateSimple","deprecations","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","calendar","mom","now","output","_calendar","longDateFormat","_longDateFormat","formatUpper","toUpperCase","replace","invalidDate","_invalidDate","ordinal","_ordinal","relativeTime","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","addUnitPriority","priority","priorities","getPrioritizedUnits","unitsObj","u","sort","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","max","substr","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","formatMoment","expandFormat","formatFunctions","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInYear","year","isLeapYear","getIsLeapYear","makeGetSet","keepTime","set$1","month","date","daysInMonth","stringGet","stringSet","prioritized","mod","x","modMonth","localeMonths","_months","isFormat","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","monthsShort","months","indexOf","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","monthsParse","getSetMonth","getDaysInMonth","monthsShortRegex","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","defaultMonthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","defaultMonthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","createDate","y","h","M","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","parseWeekday","weekdaysParse","parseInt","parseIsoWeekday","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","weekdaysMin","weekdaysShort","weekdays","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","weekdaysRegex","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","defaultWeekdaysRegex","weekdaysShortRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","defaultWeekdaysShortRegex","weekdaysMinRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","defaultWeekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","normalizeLocale","chooseLocale","names","j","next","split","loadLocale","globalLocale","oldLocale","locales","_abbr","getSetGlobalLocale","e","values","data","getLocale","defineLocale","baseConfig","abbr","parentLocale","localeFamilies","forEach","updateLocale","tmpLocale","listLocales","keys","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","defaults","currentDateArray","nowValue","_useUTC","getUTCMonth","getUTCDate","getMonth","getDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","curWeek","gg","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","exec","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","result","untruncateYear","defaultLocaleMonthsShort","preprocessRFC2822","trim","checkWeekday","weekdayStr","parsedInput","defaultLocaleWeekdaysShort","calculateOffset","obsOffset","militaryOffset","numOffset","obsOffsets","hm","configFromRFC2822","parsedArray","configFromString","aspNetJsonRegex","createFromInputFallback","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","_meridiem","meridiemFixWrap","hour","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","isDurationValid","ordering","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","days","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","sign","offsetFromString","matcher","matches","chunk","parts","chunkOffset","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","matchShortOffset","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","period","dur","tmp","isAdding","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","toISOString","keepOffset","toDate","inspect","zone","prefix","suffix","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfYear","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","clone$1","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","thresholds","ss","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","withSuffix","toISOString$1","abs$1","Y","D","toFixed","total","asSeconds","totalSign","ymSign","daysSign","hmsSign","fun","t","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","defaultLongDateFormat","LTS","LT","L","LL","LLL","LLLL","defaultDayOfMonthOrdinalParse","defaultRelativeTime","future","past","mm","hh","dd","MM","yy","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","parseTwoDigitYear","getSetYear","defaultLocaleMonths","defaultLocaleWeek","defaultLocaleWeekdays","defaultLocaleWeekdaysMin","kInput","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","dayOfMonthOrdinalParse","meridiemParse","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","prototypeMin","prototypeMax","invalid","lang","isoWeekYear","getSetDayOfMonth","getSetMinute","getSetSecond","getSetMillisecond","proto","isoWeeks","isoWeeksInYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","firstDayOfYear","firstDayOfWeek","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","thisArg","arrayAggregator","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiToArray","asciiWords","reAsciiWord","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","NAN","baseProperty","basePropertyOf","baseReduce","baseSortBy","comparer","current","baseTimes","baseToPairs","props","baseUnary","baseValues","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","escapeStringChar","chr","stringEscapes","getValue","hasUnicode","reHasUnicode","hasUnicodeWord","reHasUnicodeWord","iteratorToArray","iterator","done","mapToArray","size","overArg","transform","replaceHolders","PLACEHOLDER","setToArray","setToPairs","strictLastIndexOf","stringSize","unicodeSize","asciiSize","stringToArray","unicodeToArray","reUnicode","unicodeWords","reUnicodeWord","LARGE_ARRAY_SIZE","CORE_ERROR_TEXT","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","WRAP_BIND_FLAG","WRAP_BIND_KEY_FLAG","WRAP_CURRY_BOUND_FLAG","WRAP_CURRY_FLAG","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","WRAP_FLIP_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","INFINITY","MAX_SAFE_INTEGER","MAX_INTEGER","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","asyncTag","boolTag","dateTag","domExcTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","weakSetTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrim","reTrimStart","reTrimEnd","reWrapComment","reWrapDetails","reSplitDetails","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsBreak","rsCombo","rsLower","rsMisc","rsFitz","rsRegional","rsSurrPair","rsUpper","rsMiscLower","reOptMod","rsModifier","rsOptJoin","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","rsMiscUpper","contextProps","templateCounter","typedArrayTags","cloneableTags","deburredLetters","htmlEscapes","htmlUnescapes","freeParseFloat","freeParseInt","freeGlobal","freeSelf","self","root","freeExports","nodeType","freeModule","moduleExports","freeProcess","process","nodeUtil","types","require","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","deburrLetter","escapeHtmlChar","unescapeHtmlChar","_","runInContext","context","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","lazyClone","copyArray","lazyReverse","lazyValue","dir","isArr","isRight","arrLength","view","getView","start","end","iteratees","iterLength","takeCount","nativeMin","baseWrapperValue","outer","iterIndex","type","computed","Hash","entries","clear","entry","hashClear","__data__","nativeCreate","hashDelete","hashGet","hashHas","hashSet","ListCache","listCacheClear","listCacheDelete","assocIndexOf","pop","splice","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","Map","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","pairs","arrayLikeKeys","inherited","isArg","isArguments","isBuff","isBuffer","isType","skipIndexes","String","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","baseAggregator","baseEach","baseAssign","copyObject","baseAssignIn","keysIn","baseAt","paths","skip","lower","upper","baseClone","bitmask","customizer","isDeep","isFlat","isFull","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","copySymbolsIn","copySymbols","initCloneByTag","stacked","subValue","keysFunc","getAllKeysIn","getAllKeys","baseConforms","baseConformsTo","baseDelay","wait","TypeError","setTimeout","baseDifference","includes","isCommon","valuesLength","valuesIndex","baseEvery","baseExtremum","isSymbol","baseFill","toInteger","toLength","baseFilter","baseFlatten","depth","isFlattenable","baseForOwn","baseFor","baseForOwnRight","baseForRight","baseFunctions","baseGet","path","castPath","toKey","baseGetAllKeys","symbolsFunc","baseGetTag","symToStringTag","getRawTag","objectToString","baseGt","baseHas","baseHasIn","baseInRange","nativeMax","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInverter","baseInvoke","parent","last","baseIsArguments","baseIsArrayBuffer","baseIsDate","baseIsEqual","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsMap","baseIsMatch","matchData","noCustomizer","srcValue","baseIsNative","isMasked","reIsNative","toSource","baseIsRegExp","baseIsSet","baseIsTypedArray","isLength","baseIteratee","identity","baseMatchesProperty","baseMatches","baseKeys","isPrototype","nativeKeys","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","baseMergeDeep","newValue","safeGet","mergeFunc","isTyped","isArrayLikeObject","cloneTypedArray","isPlainObject","toPlainObject","baseNth","baseOrderBy","orders","getIteratee","compareMultiple","basePick","basePickBy","baseSet","basePropertyDeep","basePullAll","basePullAt","indexes","previous","baseUnset","nativeFloor","nativeRandom","baseRange","step","nativeCeil","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","symbolToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castSlice","buffer","allocUnsafe","constructor","copy","cloneArrayBuffer","arrayBuffer","byteLength","Uint8Array","cloneDataView","dataView","byteOffset","cloneRegExp","regexp","cloneSymbol","symbol","symbolValueOf","typedArray","compareAscending","valIsDefined","valIsReflexive","objCriteria","criteria","othCriteria","ordersLength","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","getSymbols","getSymbolsIn","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","createBaseEach","iterable","createBaseFor","createBind","wrapper","Ctor","isBind","createCtor","createCaseFirst","methodName","trailing","createCompounder","words","deburr","thisBinding","baseCreate","createCurry","arity","getHolder","createRecurry","createHybrid","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","reverse","getFuncName","funcName","getData","isLaziable","plant","partialsRight","holdersRight","argPos","ary","holdersCount","newHolders","isBindKey","reorder","isFlip","isAry","createInverter","toIteratee","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createPartial","createRange","toFinite","createRelationalOperation","toNumber","wrapFunc","isCurry","newHoldersRight","newPartials","newPartialsRight","newData","setData","setWrapToString","createRound","precision","nativeIsFinite","pair","createToPairs","createWrap","mergeData","baseSetData","customDefaultsAssignIn","objectProto","customDefaultsMerge","customOmitClone","isPartial","arrValue","othValue","compared","message","convert","objProps","objLength","skipCtor","objCtor","othCtor","flatten","realNames","otherFunc","isKeyable","getNative","isOwn","unmasked","nativeObjectToString","transforms","getWrapDetails","hasPath","hasFunc","getPrototype","insertWrapDetails","details","spreadableSymbol","maskSrcKey","srcBitmask","newBitmask","isCombo","otherArgs","oldArray","reference","updateWrapDetails","shortOut","count","lastCalled","stamp","nativeNow","remaining","rand","funcToString","compact","concat","drop","dropRight","dropRightWhile","dropWhile","fill","findIndex","findLastIndex","flattenDeep","flattenDepth","fromPairs","head","initial","nativeJoin","lastIndexOf","nth","pullAll","pullAllBy","pullAllWith","remove","nativeReverse","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","sortedUniq","sortedUniqBy","tail","take","takeRight","takeRightWhile","takeWhile","uniq","uniqBy","uniqWith","unzip","group","unzipWith","zipObject","zipObjectDeep","chain","tap","interceptor","wrapperChain","wrapperCommit","wrapperNext","wrapperToIterator","wrapperPlant","wrapperReverse","wrapped","wrapperValue","every","filter","flatMap","flatMapDeep","flatMapDepth","forEachRight","baseEachRight","isString","orderBy","reduce","reduceRight","reject","negate","sample","sampleSize","shuffle","after","before","curry","curryRight","debounce","options","invokeFunc","lastArgs","lastThis","lastInvokeTime","leadingEdge","timerId","timerExpired","leading","remainingWait","timeSinceLastCall","lastCallTime","timeSinceLastInvoke","timeWaiting","maxing","maxWait","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","flip","memoize","resolver","memoized","Cache","once","rest","spread","throttle","unary","wrap","partial","castArray","cloneWith","cloneDeep","cloneDeepWith","conformsTo","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isError","isInteger","isMatch","isMatchWith","isNative","isMaskable","isNull","isNil","objectCtorString","isSafeInteger","isWeakMap","isWeakSet","symIterator","remainder","isBinary","toSafeInteger","create","properties","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","functions","functionsIn","mapKeys","mapValues","omitBy","setWith","isArrLike","unset","update","updateWith","valuesIn","clamp","inRange","random","floating","capitalize","upperFirst","endsWith","target","position","escape","escapeRegExp","pad","strLength","padEnd","padStart","radix","nativeParseInt","repeat","startsWith","template","settings","templateSettings","assignInWith","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","attempt","toLower","toUpper","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","pattern","cond","conforms","constant","defaultTo","matchesProperty","mixin","methodNames","noConflict","oldDash","noop","nthArg","propertyOf","stubArray","stubFalse","stubObject","stubString","stubTrue","times","toPath","uniqueId","id","idCounter","maxBy","mean","meanBy","minBy","sum","sumBy","pick","arrayProto","funcProto","coreJsData","uid","IE_PROTO","Buffer","Symbol","getPrototypeOf","objectCreate","propertyIsEnumerable","isConcatSpreadable","toStringTag","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","DataView","Promise","Set","WeakMap","metaMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","baseSetToString","castRest","ArrayBuffer","resolve","ctorString","charCodeAt","quote","subString","difference","differenceBy","differenceWith","intersection","mapped","intersectionBy","intersectionWith","pull","pullAt","union","unionBy","unionWith","without","xor","xorBy","xorWith","zip","zipWith","wrapperAt","countBy","find","findLast","groupBy","invokeMap","keyBy","partition","sortBy","bind","bindKey","defer","delay","overArgs","funcsLength","partialRight","rearg","gt","gte","lt","lte","assign","assignIn","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","toPairs","toPairsIn","camelCase","word","kebabCase","lowerFirst","snakeCase","startCase","upperCase","bindAll","flow","flowRight","method","methodOf","over","overEvery","overSome","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","minuend","subtrahend","entriesIn","extendWith","each","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","commit","core","hide","redefine","ctx","$export","own","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","S","IS_PROTO","P","IS_BIND","B","expProto","U","R","React","ReactNoopUpdateQueue","Component","isValidElement","UnitBezier","Coordinate","easeCubicInOut","t2","t3","bezier","p1x","p1y","p2x","p2y","solve","ease","coalesce","asyncAll","results","error","item","err","keysDifference","dest","src","extendAll","getOwnPropertyDescriptor","inherit","parentProto","timer","fns","bindHandlers","setOptions","getCoordinatesCenter","coords","minX","minY","maxX","maxY","column","row","dx","dy","dMax","zoomTo","log","LN2","mapObject","filterObject","deepEqual","arraysIntersect","warnOnceHistory","warnOnce","isCounterClockwise","calculateSignedArea","ring","isClosedPolygon","points","classNames","classes","argType","inner","hasOwn","default","_interopRequireDefault","Onboarding","OpenGovLogo","CheckMock","ReportCard","Avatar","Tabs","MainPanel","CollectionSearch","RadioColumn","CheckboxColumn","Table","ProgressBar","Loader","GlobalAlert","Overlay","Overlays","Flash","Alert","DropdownListItem","DropdownList","Dropdown","CheckButton","ToggleSwitch","Search","Slider","Calendar","DatePicker","SelectField","TextArea","Toggle","InputField","Field","Form","_form","_field","_input_field","_toggle","_textarea","_select_field","_date_picker","_slider","_search","_toggle_switch","_check_button","_dropdown","_dropdown_list","_alert_modal","_flash","_overlays","_overlay","_global_alert","_loader","_progress_bar","_table","_table_columns","_collection_search","_main_panel","_tabs","_avatar","_report_card","_check_mock","_opengov_logo","_onboarding","_timeout_mixin2","_timeout_mixin","_toggle_mixin2","_toggle_mixin","Timeout","document","window","noGlobal","isArraylike","jQuery","isWindow","winnow","elements","qualifier","not","grep","elem","risSimple","inArray","sibling","cur","createOptions","optionsCache","rnotwhite","flag","detach","addEventListener","removeEventListener","completed","detachEvent","event","readyState","ready","dataAttr","rmultiDash","getAttribute","rbrace","parseJSON","isEmptyDataObject","isEmptyObject","internalData","pvt","acceptData","thisCache","internalKey","expando","isNode","deletedIds","guid","internalRemoveData","cleanData","support","deleteExpando","returnTrue","returnFalse","safeActiveElement","activeElement","createSafeFragment","list","nodeNames","safeFrag","createDocumentFragment","createElement","getAll","elems","found","getElementsByTagName","strundefined","querySelectorAll","childNodes","nodeName","fixDefaultChecked","rcheckableType","defaultChecked","checked","manipulationTarget","content","firstChild","appendChild","ownerDocument","disableScript","attr","restoreScript","rscriptTypeMasked","removeAttribute","setGlobalEval","refElements","cloneCopyEvent","hasData","oldData","curData","events","handle","fixCloneNodeIssues","noCloneEvent","removeEvent","text","parentNode","outerHTML","html5Clone","innerHTML","defaultSelected","selected","actualDisplay","doc","style","appendTo","body","display","getDefaultComputedStyle","css","defaultDisplay","elemdisplay","iframe","documentElement","contentWindow","contentDocument","write","close","addGetHookIf","conditionFn","hookFn","condition","vendorPropName","capName","origName","cssPrefixes","showHide","show","hidden","isHidden","setPositiveNumber","rnumsplit","augmentWidthOrHeight","extra","isBorderBox","styles","cssExpand","getWidthOrHeight","valueIsBorderBox","offsetWidth","offsetHeight","getStyles","boxSizing","curCSS","rnumnonpx","boxSizingReliable","Tween","easing","init","createFxNow","fxNow","genFx","includeWidth","which","attrs","height","opacity","width","createTween","animation","tween","tweeners","defaultPrefilter","opts","toggle","oldfire","anim","orig","dataShow","queue","_queueHooks","unqueued","fire","always","overflowX","overflowY","inlineBlockNeedsLayout","zoom","shrinkWrapBlocks","rfxtypes","_removeData","propFilter","specialEasing","cssHooks","expand","Animation","stopped","animationPrefilters","deferred","Deferred","tick","currentTime","startTime","percent","tweens","run","notifyWith","resolveWith","promise","originalProperties","originalOptions","stop","gotoEnd","rejectWith","fx","progress","complete","fail","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","unshift","inspectPrefiltersOrTransports","jqXHR","inspected","prefilterOrFactory","dataTypeOrTransport","seekingTransport","transports","ajaxExtend","deep","flatOptions","ajaxSettings","ajaxHandleResponses","responses","firstDataType","ct","finalDataType","contents","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","conv","prev","responseFields","dataFilter","state","buildParams","traditional","v","rbracket","createStandardXHR","XMLHttpRequest","createActiveXHR","ActiveXObject","getWindow","defaultView","parentWindow","class2type","selector","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","jquery","num","pushStack","prevObject","copyIsArray","isReady","isNumeric","ownLast","globalEval","execScript","makeArray","callbackExpect","proxy","Sizzle","seed","groups","old","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","getElementById","contains","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","setAttribute","toSelector","rsibling","testContext","qsaError","select","createCache","Expr","cacheLength","markFunction","assert","div","removeChild","addHandle","handler","attrHandle","siblingCheck","sourceIndex","MAX_NEGATIVE","nextSibling","createPositionalPseudo","argument","matchIndexes","setFilters","addCombinator","combinator","checkNonElements","doneName","xml","oldCache","outerCache","newCache","dirruns","elementMatcher","matchers","multipleContexts","contexts","condense","unmatched","newUnmatched","setMatcher","preFilter","postFilter","postFinder","postSelector","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","uniqueSort","getText","isXML","compile","sortInput","hasDuplicate","docElem","rbuggyMatches","classCache","tokenCache","compilerCache","sortOrder","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","rinputs","rheader","rnative","runescape","funescape","escaped","escapedWhitespace","fromCharCode","unloadHandler","els","node","hasCompare","top","attachEvent","className","createComment","getById","getElementsByName","attrId","getAttributeNode","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","specified","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","excess","unquoted","nodeNameSelector","check","what","simple","forward","ofType","nodeIndex","useCache","lastChild","pseudo","idx","innerText","elemLang","hash","location","hasFocus","href","tabIndex","disabled","selectedIndex","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","soFar","preFilters","cached","compiled","div1","unique","isXMLDoc","rneedsContext","needsContext","rsingleTag","is","rootjQuery","parseHTML","rparentsprev","guaranteedUnique","children","until","r","targets","closest","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","stopOnFalse","disable","lock","locked","fireWith","tuples","then","newDefer","tuple","returned","notify","pipe","stateString","when","subordinate","progressValues","progressContexts","resolveContexts","resolveValues","updateFunc","readyList","readyWait","holdReady","hold","triggerHandler","off","frameElement","doScroll","doScrollCheck","container","cssText","noData","removeData","dequeue","startLength","clearQueue","pnum","el","access","chainable","emptyGet","raw","bulk","fragment","leadingWhitespace","tbody","htmlSerialize","cloneNode","appendChecked","noCloneChecked","checkClone","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","trigger","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","button","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","srcElement","metaKey","original","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","focus","blur","beforeunload","returnValue","simulate","isSimulated","defaultPrevented","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","keepData","html","replaceWith","replaceChild","hasScripts","iNoClone","_evalUrl","prependTo","insertAfter","replaceAll","insert","shrinkWrapBlocksVal","rmargin","rposition","getComputedStyle","opener","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","computeStyleTests","pixelPositionVal","boxSizingReliableVal","reliableMarginRightVal","marginRight","reliableHiddenOffsetsVal","cssFloat","backgroundClip","clearCloneStyle","MozBoxSizing","WebkitBoxSizing","reliableHiddenOffsets","pixelPosition","reliableMarginRight","swap","ralpha","ropacity","rdisplayswap","rrelNum","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","cssNumber","cssProps","$1","margin","padding","border","expanded","propHooks","eased","linear","swing","cos","PI","rfxnum","rrun","scale","maxIterations","tweener","prefilter","speed","opt","speeds","fadeTo","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","timeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","bool","propName","attrNames","propFix","setAttributeNode","createAttribute","contenteditable","rfocusable","rclickable","removeProp","notxml","tabindex","rclass","addClass","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","hasClass","hover","fnOver","fnOut","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","str","comma","open","parseXML","DOMParser","parseFromString","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","allTypes","active","lastModified","etag","url","processData","contentType","accepts","json","ajaxSetup","ajaxPrefilter","ajaxTransport","ajax","status","nativeStatusText","headers","success","modified","statusText","timeoutTimer","transport","responseHeadersString","ifModified","cacheURL","callbackContext","statusCode","fireGlobals","globalEventContext","completeDeferred","responseHeaders","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","abort","finalText","crossDomain","hasContent","beforeSend","send","getJSON","getScript","wrapAll","wrapInner","unwrap","visible","r20","rCRLF","rsubmitterTypes","rsubmittable","encodeURIComponent","serialize","serializeArray","xhr","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","script","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","andSelf","_jQuery","_$","$","Point","_add","sub","_sub","mult","_mult","_div","rotate","_rotate","matMult","_matMult","_unit","perp","_perp","_round","mag","sqrt","equals","dist","distSqr","angle","atan2","angleTo","angleWith","angleWithSep","sin","_defineProperty","writable","GridReportActions","mapReduceAllAggregateTransactions","cancelAggregateRequests","_extends","_og_flux","_og_api2","_og_api","_moment2","_moment","_bluebird2","_bluebird","_lodash2","_lodash","_report_actions2","_report_actions","_grid_report_store2","_grid_report_store","_report_view_store2","_report_view_store","gridDataApi","OgApi","getYear","getState","getIn","fiscal_year","addLeadingZero","getTimePeriodQuery","schema","dateColumnName","xAxis","xAxisTick","query","start_day","end_day","ge","le","entity","getReportEntity","fiscalYearStartMonth","visualAggregateRequests","req","called","aggReqs","queryPlan","reducer","mapper","isSummaryTableQuery","reduceStep","transactions","mapStep","successStep","getSummaryTableAggregatesSuccess","getVisualAggregatesSuccess","concurrency","transactionCollection","executeQueryPlan","report","getRenderedReport","transactionsDataSetId","requests","queries","trapi","post","updateData","dbParallelCapable","getSchema","queryPlannerOptions","allowParallel","buildVisualAggregatesQueryPlan","backupPlan","catch","plan","getVisualAggregatesError","shouldFetchMapDataBounds","getMapDataBounds","shouldFitMapToDataBounds","getMapViewportBounds","fitMapToDataBounds","dataBounds","getMapDataStats","mapFitBounds","List","shouldGetRowForTooltipEditor","getFirstRowOfMapData","isEditingMapTooltip","getRowForTooltipEditor","firstRowWithLocation","getRowsForTooltip","shouldUpdateTooltipSchema","tooltip","getMapTooltip","tooltipVersion","currentMapTooltipSchema","updateTooltipSchema","updatedTooltip","migrateFromPrevious","mapTooltipSaved","mapTooltipEdited","fetchCellsForNewBounds","grid","bounds","cell","isPending","boundsIntersect","loadMapGridCell","currentReportWasJustCreated","lastCreatedReport","renderedReport","getIntercomReportAttributes","reportId","reportName","loadMap","getMapMeta","getMapStatsForDataset","mapMeta","boundingBox","getBoundingBoxFromMeta","setMapGrid","createMapLoaderGrid","x1","x2","y1","y2","loadMapGridCellsInViewport","mapPromises","_rowsForTooltipPromise","_saveGridStatePromise","_rowForTooltipPromise","_getMapMetaPromise","_getMapStatsForDataset","_getMapBreakdownValuesPromise","_mapMinMaxValuesPromise","_resetAndLoadPromise","cancelMapPromises","mapPromise","trackAndLoadMap","hasPreviousSavedState","setVisualizationType","clearLastCreatedReport","trackIntercomEvent","setSchema","meta","Dispatcher","handleViewAction","actionType","isLoading","getVisualAggregates","isMapEnabled","fetchData","triggerUpdate","filterByFiscalYear","fiscalYear","filterColumn","filterRemainingAggregates","saveGridState","getSavedState","toggleVisualizations","mapReset","setLastXYZDays","graphType","previousSavedState","getPreviousSavedState","previousGraphType","savedState","dateColumn","lastState","dateFilter","setIn","deleteIn","setVisualizationYear","clearTarget","selectedVizType","shouldSaveState","timePeriodQuery","mergeDeep","fromJS","showingSummaryTable","transactionsByFiscalYear","toggleLegend","setVisualBreakdown","breakdown","showVisualizationTooltip","percentage","hideVisualizationTooltip","setDownloadsLoading","transactionDownloadsLoaded","downloadData","handleServerAction","downloads","setInSyncStatus","showCheckImagePanel","quasiId","gridQuery","transactionId","saveState","rowTop","amountColumn","quasi_id","isCheckImageQuery","transaction","checkData","loadingMessage","voucher_id","relatedTransactionAmount","hideCheckImagePanel","nextSavedState","ignoredFields","toJS","grid_state","dispatchGridStateLoad","updateHistory","lastXYZDays","loadedState","loadedGridState","visualization","errorLoadingGridData","loadGridState","lastXYZDaysParam","isGridStateLoaded","stateId","requestResponse","notFound","dismissAlert","loadingGridData","loadedGridData","showBudget101","hideBudget101","showTOS","hideTOS","showExportFilter","hideExportFilter","toggleTargetPanel","toggleColumnsSettingsPanel","toggleBreakdownsSettingsPanel","hideColumn","settingsType","selectAll","resetColumns","settingsData","setTarget","showHowToModal","showWelcomeModal","hideHowToModal","hideWelcomeModal","startWelcomeTour","endTour","gotoTourStep","currentStep","goBack","currentSavedState","currentBreakdown","currentLimit","currentQueryFilter","currentAmountColumn","currentLegendSortBy","pastSavedState","pastBreakdown","pastLimit","pastQueryFilter","pastAmountColumn","pastLegendSortBy","breakdownValueNames","setMapType","mapType","clearRowsForTooltip","datasetId","items","getLngLatFromFeature","in","rowsForTooltip","mapLegendShowMoreClicked","mapLegendShowPreviousClicked","mapLegendReset","updateMapTooltip","setMapTooltipEditing","mapLoading","mapLoaded","mapMoveStart","entity_id","query_results","centerLng","centroid_x","centerLat","centroid_y","bbox_x1","bbox_y1","bbox_x2","bbox_y2","center","lng","lat","baseMinMaxParams","fields","breakdownParams","getMapBreakdownValues","getMapMinMaxValues","cancellable","CancellationError","collectBreakdownValues","breakdownValues","getPromiseForSortDirection","resetAndLoadMap","viewportBounds","boundsForFetch","loadingGridCells","getMapGrid","mapData","buildObjectsFromGeoResponse","loadedCell","setLastCreatedReport","reloadProperties","setMapAmountColumn","mapAmountColumn","updateFilteredExportJob","jobResult","errors","errorFilteredExportJob","messages","setHeatmapType","heatmapType","setAmountsType","amountsType","setAmountColumn","setLegendSortBy","sortId","addActiveFilter","removeActiveFilter","it","__webpack_exports__","MakeRef","ref","SetRef","OwnerID","ensureSize","iter","__iterate","wrapIndex","uint32Index","wholeSlice","begin","isNeg","resolveBegin","resolveIndex","resolveEnd","defaultIndex","isImmutable","maybeImmutable","isCollection","isRecord","maybeCollection","IS_ITERABLE_SENTINEL","isKeyed","maybeKeyed","IS_KEYED_SENTINEL","isIndexed","maybeIndexed","IS_INDEXED_SENTINEL","isAssociative","maybeAssociative","isOrdered","maybeOrdered","IS_ORDERED_SENTINEL","maybeRecord","IS_RECORD_SENTINEL","isValueObject","maybeValue","hashCode","iteratorValue","iteratorResult","iteratorDone","hasIterator","maybeIterable","getIteratorFn","isIterator","maybeIterator","getIterator","iteratorFn","REAL_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","isSeq","maybeSeq","IS_SEQ_SENTINEL","emptySequence","EMPTY_SEQ","ArraySeq","keyedSeqFromValue","seq","IteratorSeq","CollectionSeq","fromEntrySeq","ObjectSeq","indexedSeqFromValue","maybeIndexedSeqFromValue","seqFromValue","valueA","valueB","smi","i32","STRING_HASH_CACHE_MIN_STRLEN","cachedHashString","hashString","hashJSObj","hashed","stringHashCache","STRING_HASH_CACHE_SIZE","STRING_HASH_CACHE_MAX_SIZE","usingWeakMap","weakMap","UID_HASH_KEY","canDefineProperty","getIENodeHash","objHashUID","isExtensible","uniqueID","flipFactory","flipSequence","makeSequence","_iter","reversedSequence","cacheResult","cacheResultThrough","__iterateUncached","this$1","__iteratorUncached","ITERATE_ENTRIES","__iterator","Iterator","ITERATE_VALUES","ITERATE_KEYS","mapFactory","mappedSequence","notSetValue","NOT_SET","reverseFactory","useKeys","filterFactory","filterSequence","iterations","countByFactory","grouper","asMutable","asImmutable","groupByFactory","isKeyedIter","OrderedMap","coerce","collectionClass","reify","sliceFactory","originalSize","resolvedBegin","resolvedEnd","toSeq","sliceSize","resolvedSize","sliceSeq","isSkipping","takeWhileFactory","takeSequence","iterating","skipWhileFactory","skipSequence","skipping","concatFactory","isKeyedCollection","iters","KeyedCollection","singleton","concatSeq","toKeyedSeq","toSetSeq","flattenFactory","flatSequence","flatDeep","currentDepth","flatMapFactory","interposeFactory","interposedSequence","sortFactory","defaultComparator","valueSeq","KeyedSeq","IndexedSeq","SetSeq","maxFactory","maxCompare","comp","zipWithFactory","keyIter","zipper","zipAll","zipSequence","sizes","iterators","Collection","isDone","steps","validateEntry","IndexedCollection","SetCollection","Seq","arrCopy","newArr","invariant","assertNotInfinite","coerceKeyPath","keyPath","isPlainObj","isDataStructure","quoteString","stringify","_ignoreError","shallowCopy","collectionCopy","updateIn","updatedValue","updateInDeeply","inImmutable","existing","wasNotSet","existingValue","nextExisting","nextUpdated","emptyMap","setIn$1","setIn$$1","removeIn","update$1","update$$1","updateIn$1","mergeIntoKeyedWith","merger","collections","collection$1","__ownerID","withMutations","mergeIntoCollection","oldVal","merge$1","mergeWithSources","mergeWith$1","mergeDeep$1","mergeDeepWithSources","mergeDeepWith$1","deepMergerWith","merged","Collection$$1","mergeItem","hasVal","nextVal","deepMerger","oldValue","mergeDeepWith","mergeIn","mergeDeepIn","mutable","wasAltered","__ensureOwner","__altered","maybeMap","IS_MAP_SENTINEL","mapIteratorValue","mapIteratorFrame","__prev","makeMap","ownerID","hash$$1","MapPrototype","_root","__hash","EMPTY_MAP","updateMap","newRoot","newSize","didChangeSize","CHANGE_LENGTH","didAlter","DID_ALTER","updateNode","ArrayMapNode","keyHash","ValueNode","isLeafNode","HashCollisionNode","mergeIntoNode","newNode","idx1","MASK","idx2","SHIFT","BitmapIndexedNode","createNodes","packNodes","excluding","bitmap","packedII","packedNodes","bit","expandNodes","including","expandedNodes","SIZE","HashArrayMapNode","popCount","setAt","canEdit","newArray","spliceIn","newLen","spliceOut","isList","maybeList","IS_LIST_SENTINEL","iterateList","iterateNodeOrLeaf","level","iterateLeaf","iterateNode","tailPos","right","DONE","_origin","_capacity","getTailOffset","_tail","_level","makeList","origin","capacity","ListPrototype","emptyList","EMPTY_LIST","updateList","setListBounds","newTail","updateVNode","nodeHas","lowerNode","newLowerNode","editableVNode","VNode","listNodeFor","rawIndex","owner","oldOrigin","oldCapacity","newOrigin","newCapacity","newLevel","offsetShift","oldTailOffset","newTailOffset","oldTail","removeAfter","removeBefore","beginIndex","isOrderedMap","maybeOrderedMap","makeOrderedMap","omap","_map","_list","emptyOrderedMap","EMPTY_ORDERED_MAP","updateOrderedMap","newMap","newList","toMap","isStack","maybeStack","IS_STACK_SENTINEL","makeStack","StackPrototype","_head","emptyStack","EMPTY_STACK","notAssociative","flipped","allEqual","bSize","ctor","methods","keyCopier","maybeSet","IS_SET_SENTINEL","updateSet","__empty","__make","makeSet","SetPrototype","emptySet","EMPTY_SET","getIn$1","searchKeyPath","getIn$$1","hasIn$1","hasIn$$1","reduction","useFirst","keyMapper","entryMapper","neg","defaultZipper","defaultNegComparator","hashCollection","ordered","keyed","murmurHashOfSize","hashMerge","imul","isOrderedSet","maybeOrderedSet","makeOrderedSet","OrderedSetPrototype","emptyOrderedSet","EMPTY_ORDERED_SET","makeRecord","likeRecord","record","_values","recordName","_name","recordSeq","_keys","setProp","converter","fromJSWith","defaultConverter","parentValue","converted","toList","__proto__","Keyed","Indexed","ITERATOR_SYMBOL","KEYS","VALUES","ENTRIES","__toString","_cache","entrySeq","toIndexedSeq","of","_array","_object","_collection","_iterator","_iteratorCache","ToKeyedSequence","KeyedSeq$$1","indexed","_useKeys","ToIndexedSequence","IndexedSeq$$1","ToSetSequence","SetSeq$$1","FromEntriesSequence","indexedCollection","KeyedCollection$$1","keyValues","deleteAll","MapIterator","iterate","removeAll","removed","exists","MAX_ARRAY_MAP_SIZE","isEditable","newEntries","keyHashFrag","MAX_BITMAP_INDEXED_SIZE","newBitmap","newNodes","newCount","MIN_HASH_ARRAY_MAP_SIZE","keyMatch","maxIndex","Iterator$$1","_type","_reverse","_stack","subNode","IndexedCollection$$1","setSize","oldSize","arguments$1","seqs","originIndex","newChild","removingFirst","oldChild","editable","sizeIndex","Map$$1","pushAll","peek","unshiftAll","SetCollection$$1","fromKeys","keySeq","intersect","sets","toRemove","OrderedSet","EMPTY_RANGE","Range","_start","_end","_step","searchValue","possibleIndex","offsetValue","isIterable","useTuples","toOrderedMap","toOrderedSet","toSet","toStack","__toStringMapper","findEntry","sideEffect","joined","isFirst","initialReduction","butLast","entriesSequence","filterNot","findLastEntry","searchKey","isSubset","isSuperset","keyOf","lastKeyOf","amount","skipLast","skipWhile","skipUntil","takeLast","takeUntil","CollectionPrototype","mapEntries","KeyedCollectionPrototype","removeNum","numArgs","spliced","interpose","interleave","zipped","interleaved","IndexedCollectionPrototype","Set$$1","Record","defaultValues","hasInitialized","RecordType","indices","RecordTypePrototype","_indices","_defaultValues","RecordPrototype","newValues","getDescriptiveName","EMPTY_REPEAT","Repeat","_value","Immutable","Iterable","_connect","_base_store","_immutable_store","_store_listener","_dispatcher","__g","g","eval","Backbone","previousBackbone","emulateHTTP","emulateJSON","Events","eventsApi","_events","_callback","retain","ev","allEvents","triggerEvents","stopListening","listeningTo","_listeningTo","_listenId","eventSplitter","a1","a2","a3","listenMethods","listenTo","listenToOnce","implementation","Model","cid","changed","initialize","validationError","idAttribute","sync","changes","silent","changing","_validate","_changing","_previousAttributes","_pending","hasChanged","changedAttributes","previousAttributes","fetch","resp","wrapError","save","validate","serverAttrs","patch","destroy","urlError","modelMethods","models","_reset","addOptions","singular","_byId","_removeReference","targetModel","sortable","sortAttr","toAdd","modelMap","order","_prepareModel","_addReference","orderedModels","previousModels","where","findWhere","pluck","_onModelEvent","attributeMethods","View","viewOptions","_ensureElement","delegateEvents","delegateEventSplitter","tagName","$el","render","setElement","element","undelegateEvents","methodMap","_method","noXhrPatch","dispatchEvent","Router","routes","_bindRoutes","optionalParam","namedParam","splatParam","route","_routeToRegExp","router","history","_extractParameters","execute","navigate","optional","decodeURIComponent","History","routeStripper","rootStripper","isExplorer","trailingSlash","pathStripper","started","atRoot","pathname","getHash","getFragment","forcePushState","_hasPushState","_wantsHashChange","decodeURI","hashChange","_wantsPushState","pushState","docMode","documentMode","oldIE","navigator","userAgent","frame","checkUrl","_checkUrlInterval","loc","replaceState","title","loadUrl","any","_updateHash","protoProps","staticProps","child","Surrogate","__super__","_immutable","_immutable2","_og_analytics2","_og_analytics","_session_store2","_session_store","_mask_actions2","_mask_actions","_summary_report_actions2","_summary_report_actions","InviteActions","newObj","_underscore2","_underscore","ReportActions","newReport","cloneReport","copySavedViews","saved_views","loadReport","loadedReport","invites","loadedInvitedUsers","isGridReport","getPackage","updatedReport","updateReportPermission","put","updateState","loadedBackboneReport","resetState","defaultStateUpdated","selectSidebar","sidebar","toggleMainPanel","panel","openAnnotationsPanel","closeAnnotationsPanel","pushHistory","popHistory","clearHistory","toggleAuditMode","auditModeEnabled","getAuditModeEnabled","pushEvent","enableEditDefaultStateMode","cancelEditDefaultStateMode","openSettingsPanel","getMasks","openEditData","closeEditData","openEditLinkage","summaryToggleNode","nodeId","summarySetExpandedNodes","loaded","hasInvalidData","hasValidData","graphResized","downloadCSV","printReport","updateUrlParams","persistState","showHowTo","hideHowTo","showReportWelcomeModal","hideReportWelcomeModal","showFeedback","hideFeedback","showDownloadModal","hideDownloadModal","sendFeedback","phone","email","entityId","report_id","errorMessage","mapTooltip","canEditTooltips","getSession","currentTooltips","mapTooltips","packageTooltipForSave","_numeral2","_numeral","DataSetUtils","_i18n2","_i18n","translate","getFixedT","isBalanceSheetLedger","ledger","isVariance","accountType","visibleAccounts","strings","versusViewsStrings","trees","accountTypeCategories","revenues","expenses","assets","liabilities","revAndExp","assetAndLiability","returnObjects","aggregateRowLabel","isBalanceSheetReport","nl2br","nl2space","br2space","yAxis","validScale","yAxisScale","scaleName","scaleValue","reportType","spending","currentYearAmount","currentYearPeriod","yAxisLabel","label","currencyNoDollar","numberFormat","Number","addCommasKeepDecimal","generateDownloadString","amountUnitLabel","dataSetLabel","dataSet","startMonth","isProjectionDataset","description","proration","summaryHeaderLabel","product","twoDigitYear","accountTypeBreakdown","accountTypeId","breakdownName","accountCategoryName","accountCodeChains","codes","aggregationsCombinedName","aggregations","tree","exportTitle","breakdownTitles","yearText","validNumericScale","entityName","primary","formatFTE","truncateLabel","unitIsPrefix","pillIconToUse","centsToDollars","metric","yr","generateTotalLabel","isBarGraph","isLineGraph","isVisualizationVisible","isSingleXAxis","isPlural","firstTick","hasMonths","isComputed","plurality","timeUnits","pluralEnding","totalValueLabel","formatShareMessageFooter","fullNames","more","formatShareMessageFlash","startName","remainderList","store","USE_SYMBOL","f","argIndex","framesToPop","checkDCE","__REACT_DEVTOOLS_GLOBAL_HOOK__","_classCallCheck","instance","Constructor","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","setPrototypeOf","_createClass","defineProperties","descriptor","_report","_entity","_activeSidebar","_activeMainPanel","standalone","_history","_editingDefaultState","_editingData","_hasValidData","_wizardFlow","_maskOptions","register","payload","_handleAction","ReportViewStore","_BaseStore","_state","_urlParams","masks","mask","emitChange","toImmutable","BaseStore","gon","__class","_summary_report_store2","_summary_report_store","_google_translate2","_google_translate","SummaryReportActions","getAggregationsDebounced","skipGraph","getAggregationsRequest","getAggregations","athenaState","budgetData","pkg","account","state_scale_flag","requestData","data_sets","dataSets","coa_mask_id","cache_key","visible_accounts","invisibleAccounts","time_period","serve_old","state_scale","ungroup","checked_nodes","expanded_nodes","api","pendingSelection","minimalSelectedNodeList","dataApi","updateGraphLoadingStatus","tapi","getAggregationsSuccess","getAggregationsError","finally","getMetricsAvailable","embed","entitydata","metricsAvailable","metrics","getMetricData","overlaysSelected","scaleSelected","selectionFiltered","dataHasntBeenRetrievedYet","existingItem","apiCalls","metricData","setInitialState","initialState","previousState","Raven","captureException","updateEnabledState","enabled_nodes","ds","shouldTranslate","treeNames","treeCategories","categories","dictionary","categoryName","loadedPackageNoDataSets","getPackageSuccess","getPackageError","getAnnotations","ok","annotations","getAnnotationsSuccess","setBreakdown","breakdownId","setAccountType","setVersusView","versusViewId","togglePerCapitaScale","disableAggregations","setYear","setOverlays","setScale","toggleFilterPanel","panelId","toggleAllFilterPanels","closeAllFilterPanels","urlParams","getUrlParams","drill","expandMore","treeSelect","nodeToggleSelect","nodeExclusiveSelect","changeCurrentYearPeriod","toggleProration","toggleHighlightingVariance","setHighlightingVariance","highlightingVariance","toggleProjections","metadata","toggled","setProjectionType","projectionType","setFiscalYearRange","changeCurrentYearAmount","anObject","IE8_DOM_DEFINE","toPrimitive","dP","O","Attributes","defined","utils","parseValue","parseNumber","parseMonetary","parseDate","parsePercent","getFormatter","getGridValueFormatter","formatTextForTable","formatNumber","formatMonetary","formatDate","formatPercent","getSimpleFormatter","formatText","getInputFormatter","formatFloatNumberComma","formatDateInput","strip","numberSuffix","mil","million","billion","matchResult","formatNumberComma","translateAccountingFloat","valStr","DATE_FORMAT","localeDateStringToMoment","dateString","momentToLocaleDate","usM","vm","resolution","stringComparator","aLabel","bLabel","stringComparatorReverse","retry","npm_package_config_ogApi_core","npm_package_config_ogApi_entitydata","npm_package_config_ogApi_tapi","npm_package_config_ogApi_trapi","del","use","_isBuffer","pToString","isView","arrbuf","getName","util","functionsHaveNames","something","rawname","getMessage","actual","expected","stackStartFunction","AssertionError","_deepEqual","memos","multiline","ignoreCase","Float32Array","Float64Array","actualIndex","objEquiv","actualVisitedObjects","isPrimitive","aIsArgs","bIsArgs","pSlice","ka","objectKeys","kb","notDeepStrictEqual","expectedException","isPrototypeOf","_tryBlock","block","_throws","shouldThrow","userProvidedMessage","isUnwantedException","isUnexpectedException","objectAssign","generatedMessage","captureStackTrace","fn_name","next_line","inherits","equal","notEqual","deepStrictEqual","notDeepEqual","strictEqual","notStrictEqual","throws","doesNotThrow","ifError","ValidationError","__line__","line","performance","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","cancelFrame","timed","supported","hardwareConcurrency","devicePixelRatio","supportsWebp","webpImgTest","supportsGeolocation","geolocation","initialized","loading","graphLoading","rebuilding","versusView","getEmbedType","isAnnotationsPanelOpen","graphSize","reportAmountType","numberTypes","dollar","scales","actualValue","perCapita","inThousands","inMillions","overlay","available","none","metric_type","overlayCompatibleCharts","filterPanels","fiscalYearRange","urlState","monthsWithActuals","yearsWithMonthlyActuals","monthAsFiscalYearOffset","mostRecentMonthWithActuals","mostRecentMonthsWithActuals","mostRecentYearWithMonthlyActuals","generateReportAmountType","accountTypeAndLocaleToNumberType","getDefaultState","fiscal_year_range","validFiscalYearRange","validCurrentYearPeriod","current_year_period","validCurrentYearAmount","current_year_amount","validYear","validMonth","breakdown_id","intialState","SummaryReportStore","getInitialState","projections","projection_type","highlighting","highlighting_variance","getFiscalYearRange","fiscalStart","fiscalEnd","iStart","iEnd","minYear","maxYear","findDefaultVersusView","getFiscalYearMinMaxRange","mapUrlParamsToState","parseDateParams","_budget_data2","_budget_data","_report2","_athena_state2","_athena_state","_uuid_converter2","_uuid_converter","_strings2","_strings","ImmutableStore","getRenderedDataSets","renderedDataSets","fiscal_year_start_month","getRenderedData","getAmountUnit","renderedData","getVersusViews","getAmountType","getReportAmountType","isCurrency","getFilterPanels","breakdowns","isOpen","generateSummaryReportState","fiscalYearRangeStart","fiscalYearRangeEnd","changingProps","toHash","graph","sort_order","saved_view","selected_data_set_index","y_axis_scale","hashState","legendSort","selectedDataSetIndex","fiscal_start","fiscal_end","defaultSelectedDataSetIndex","getDataError","reportDataSets","getReportDataSets","hasMonthlyDataSets","isMonthlyReport","REPORT_STATE_RESET","changeState","mappedParams","UPDATE_GRAPH_LOADING_STATUS","REPORT_SET_INITIAL_STATE","REPORT_TOGGLE_PRORATION","REPORT_MIRROR_PROJECTIONS","REPORT_MIRROR_PROJECTION_TYPE","REPORT_TOGGLE_HIGHLIGHTING_VARIANCE","REPORT_SET_HIGHLIGHTING_VARIANCE","REPORT_GO_BACK","REPORT_GET_AGGREGATIONS_SUCCESS","deselectAll","selectNodes","activeAnnotations","filterActiveAnnotations","REPORT_GET_ANNOTATIONS_SUCCESS","nextState","SAVED_VIEW_SELECTED","savedView","REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE","REPORT_GET_PACKAGE","payloadEntity","reportData","storedInitialState","report_type","REPORT_GET_PACKAGE_SUCCESS","shouldShowAllMonths","nodesForLinkage","nodes_for_linkage","masksForLinkage","masks_for_linkage","initBudgetData","panels","newState","selectedYear","defaultState","defaultYear","defaultFiscal","urlFiscalStart","urlFiscalEnd","lastYearWithMonthlyActuals","lastMonthOfLastYearWithMonthlyActuals","fiscalYearStart","fiscalYearEnd","latestRange","REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS","REPORT_SUMMARY_TOGGLE_FILTER_PANEL","REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS","REPORT_VIEW_OPEN_ANNOTATIONS_PANEL","REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL","REPORT_SUMMARY_TOGGLE_NODE","REPORT_GRAPH_RESIZE","REPORT_TOGGLE_PER_CAPITA_SCALE","REPORT_SUMMARY_EXPANDED_NODES","REPORT_SET_BREAKDOWN","REPORT_SET_ACCOUNT_TYPE","REPORT_SET_VERSUS_VIEW","REPORT_SET_MONTH","REPORT_SET_YEAR","REPORT_SET_OVERLAYS","overlays","REPORT_SET_SCALE","REPORT_SET_METRIC_DATA","REPORT_SET_METRICS_AVAILABLE","REPORT_METRICS_UNAVAILABLE","metricsSorted","metricsAllowed","currentLimits","scalesAllowed","scaleLimit","unavailable","REPORT_DRILL","aggregationGroup","exclusiveSelect","REPORT_NODE_TOGGLE_SELECT","toggleSelect","REPORT_NODE_EXCLUSIVE_SELECT","REPORT_TREE_SELECT","REPORT_CHANGE_CURRENT_YEAR_PERIOD","REPORT_CHANGE_CURRENT_YEAR_AMOUNT","REPORT_UPDATE_URL_PARAMS","paramValue","paramName","fiscalDate","representationFormat","minMaxYear","minMaxYearDefault","fiscalRangeValue","fiscalYearValue","Bucket","overscaling","layer","childLayers","features","sourceLayer","sourceLayerIndex","minZoom","minzoom","maxZoom","maxzoom","paintAttributes","createPaintAttributes","bufferGroups","programArrayGroups","programName","programArrayGroup","layoutOrPaint","arrayType","arrayTypes","members","BufferType","ELEMENT","VERTEX","vaos","layout","element2","secondVaos","layerName","VertexArrayObject","createElementBufferType","components","StructArrayType","ELEMENT_ATTRIBUTE_TYPE","bucket","interfaceName","programInterfaces","layerPaintAttributes","uniforms","defines","vertexPragmas","define","fragmentPragmas","interface_","attribute","attributeType","attributeInputName","attributeVaryingDefinition","attributeInnerName","isPaintValueFeatureConstant","paintProperty","isPaintValueZoomConstant","attributeAttributeDefinition","tName","zoomLevels","getPaintValueStopZoomLevels","numStops","stopOffset","fourZoomLevels","createGetUniform","createFunctionGetValue","attributeInputNames","stopZoomLevels","globalProperties","featureProperties","z","stopZoomLevel","stopInterp","getPaintInterpolationT","featureFilter","circle","EXTENT","populateBuffers","createArrays","recalculateStyleLayers","addFeature","trimArrays","makeRoomFor","numVertices","arrayGroups","currentGroup","vertex","VertexArrayType","ElementArrayType","ElementArrayType2","paint","PaintVertexArrayType","programInterface","programArrayTypes","vertexBuffer","layoutAttributes","alignment","VERTEX_ATTRIBUTE_ALIGNMENT","elementBuffer","elementBufferComponents","elementBuffer2","elementBuffer2Components","gl","programBufferGroups","programBuffers","paintBuffer","layoutBuffer","programArrays","paintArray","layoutArray","setUniforms","program","uniform","uniformLocation","layerId","arrayGroup","childLayerIds","createFilter","FAKE_ZOOM_HISTORY","lastIntegerZoom","lastIntegerZoomTime","lastZoom","recalculate","populatePaintArrays","startGroup","startIndex","vertexArray","resize","memberName","paintVertexArrayTypes","BufferGroup","layoutVertexArrayType","elementArrayType","elementArrayType2","ArrayGroup","populateArrays","prepareArrayGroup","hasCapacityFor","getTransferables","transferables","layoutVertexArray","paintVertexArrays","__WEBPACK_AMD_DEFINE_RESULT__","_typeof","cacheIndexOf","keyPrefix","cachePush","typeCache","charAtCallback","ac","bc","getObject","getArray","arrayPool","objectPool","releaseArray","maxPoolSize","releaseObject","lodashWrapper","baseBind","bindData","bound","partialArgs","setBindData","stackA","stackB","cloneableClasses","ctorByClass","boolClass","dateClass","numberClass","stringClass","regexpClass","initedStack","baseCreateCallback","argCount","__bindData__","funcNames","funcDecomp","fnToString","reFuncName","reThis","baseCreateWrapper","partialRightArgs","isCurryBound","getIndexOf","isLarge","largeArraySize","isShallow","valIndex","valLength","isWhere","otherType","objectTypes","otherClass","argsClass","objectClass","arrayClass","aWrapped","bWrapped","ctorA","ctorB","stackLength","isSorted","createCallback","createWrapper","isPartialRight","reNative","shimIsPlainObject","nativeIsNaN","noaccum","trustIndexOf","compose","maxTimeoutId","timeoutId","trailingCall","delayed","isCalled","maxDelayed","leadingCall","ran","debounceOptions","noMin","noMax","hasVariable","wrapperToString","wrapperValueOf","Boolean","arrayRef","nativeIsArray","funcClass","WinRTError","shimKeys","ownIndex","ownProps","objProto","indexBy","reLeadingSpacesAndZeros","collect","detect","foldl","foldr","include","inject","callbackable","MapColors","HtmlMapColors","colorMap","breakdownValue","currentColorMap","getHtmlColor","legendMap","getCurrentTooltipFromProperties","mapTooltipSchemas","bubbleColorTransform","HeatMapGradientStops","HeatMapGradient","MapLegendConfig","MapTypeNames","MapTypes","MapSpecificBreakdownValues","MapSpecificBreakdowns","GeocoderMapDataTypes","AllMapDataTypes","MapDataTypes","MAX_NUMBER_OF_TOOLTIP_FIELDS","MapboxGl","OpenGovVectorTileLayerURL","MapBoxAPIAccessToken","_color2","_color","_og_colors2","_og_colors","mapBoxApiAccessToken","longitude","latitude","address","city","zipcode","country_code","None","layerType","Heatmap","configuration","intensityExponent","radius","sizeExponent","zoomExponent","density","Bubble","minBubbleRadius","maxBubbleRadius","bubbleFillAlpha","itemsPerPage","0.1","0.2","0.4","0.6","0.8","1","color","intToHtmlColor","removeColumn","alpha","rgbaString","updateColumnInTooltip","origColumn","newColumn","reorderColumns","currentTooltip","moved","movedOver","createDefault","columns","showColumnName","addNewColumn","updatedColumns","getColumnTypeByName","map_tooltips","session","partitions","xPartitionSize","yPartitionSize","lngRange","latRange","outerGrid","loader","cells","Evented","listener","listens","listeners","testProp","docStyle","suppressClick","userSelect","selectProp","disableDrag","enableDrag","transformProp","setTransform","mousePos","rect","touches","touchPos","createDesc","SRC","$toString","TPL","inspectSource","fails","quot","createHTML","NAME","boolMatch","down","nativeTrim","nativeTrimRight","trimRight","nativeTrimLeft","trimLeft","strRepeat","qty","defaultToWhiteSpace","characters","_s","escapeChars","amp","apos","reversedEscapeChars","sprintf","get_type","str_repeat","str_format","parse_tree","argv","pad_character","pad_length","cursor","tree_length","node_type","toExponential","fmt","_fmt","arg_names","field_list","replacement_field","field_match","isBlank","stripTags","chop","clean","swapCase","escapeHTML","unescapeHTML","entityCode","howmany","needle","lines","starts","ends","succ","titleize","camelize","underscored","dasherize","classify","ltrim","truncateStr","prune","pruneStr","tmpl","delimiter","padStr","padlen","lpad","rpad","lrpad","vsprintf","decimals","dec","dsep","tsep","fnums","strRight","sep","strRightBack","strLeft","strLeftBack","toSentence","lastSeparator","serial","lastMember","toSentenceSerial","slugify","surround","quoteChar","unquote","naturalCmp","str1","str2","cmpRegex","tokens1","tokens2","num1","num2","levenshtein","toBoolean","trueValues","falseValues","lstrip","rstrip","rjust","ljust","q","toBool","closeOpenItems","closeItems","selfClicked","colorIntTohtmlRGB","svgSupported","renderTo","_backbone2","_backbone","_jquery2","_jquery","_templates2","_templates","views","viewId","parentView","$placeholder","registerCloseItem","isSelfClick","popup","uri","viewData","_viewData","getParent","replaceContainer","$parent","$container","templateId","templateName","templateFunc","hasFeature","_toConsumableArray","arr2","isLedgerTree","treeId","getMaskNodesForLinkage","coaNodesToLinkageNodes","getAmountColumn","formatUnits","getVisibleAmountColumns","getUpdatedResetColumns","getUpdatedHiddenColumns","filterBreakdown","filterAmountColumns","convertToCumulativeAmounts","AmountsTypes","isMultipleAmountColumnsEnabled","_utils2","_utils","feature_permissions","fp","Incremental","Cumulative","keyProperty","aggregates","breakdownColumn","agg","trans","prevVal","amt","amountColumnOptions","columnId","breakdownAmountColumn","columnVisibility","stateColumns","amountColumnName","showCurrencySymbol","targetCol","findColumnByName","targetColType","columnTypeToNumberType","formatter","nodesWithTreesExpanded","acc","isTree","tree_id","memberIds","member","categoryNodes","category","selected_node_ids","mask_node_array","masked_node_ids","_react","_react2","_propTypes2","_propTypes","_settings_panel_actions2","_settings_panel_actions","WizardStep","propTypes","isRequired","onNextStep","_isMounted","renderFooter","renderActions","onClick","renderHeader","renderContent","nextButtonText","isLastStep","saving","canGoBack","prevStep","isFirstStep","handleClickNext","componentDidMount","handleChange","componentWillUmount","forceUpdate","nextStep","onPrevStep","onCancel","IObject","pIE","toIObject","gOPD","ObjectProto","SessionStore","_session","getEntity","isOpenGov","hasFeaturePermission","feature","_onSessionChange","role","intercomSettings","user_id","full_name","app_id","intercomAppId","user_hash","user_intercom_hash","company","created_at","heap","identityHash","og_user_id","subdomain","identify","addUserProperties","onSessionChange","analyticsIdentify","__e","aFunction","webpackPolyfill","keySet","makeCheckDataObject","fiscalData","file_url","file_size","savedStateApiFormat","getschemaAmountBreakdownColumns","rejectInvisible","amountColumnTypes","breakdownColumns","amountColumns","getVisualizationObjects","schemaBreakdownColumns","columnsString","visibleBreakdownColumnsArray","updatedschemaBreakdownColumns","visualizationApiFormat","visibleBreakdownColumnsString","getApiString","visibleAmountColumnsString","visibleColumns","getSchemaVisualizationColumnsSaving","updatedSchemaBreakdownColumns","updatedSchemaAmountColumns","schemaAmountColumns","getSchemaVisualizationColumnsLoading","currentCheckData","isVisible","showLegend","currentMapType","mapBounds","legendSortBy","generateMoment","getTickInfo","isDateColumnComputed","tickLabel","adjustedFiscalYear","startDayString","setMomentFormat","setMomentDate","endDayString","filterColumnIds","columnIds","GriddleSettings","invalidColumns","cleanFilter","hasMapsFeaturePermission","hasMapColumns","areMapTooltipsEditable","availableGraphTypes","visualization_visible","isSummaryLoading","mapDataLoading","visualization_breakdown","DEFAULT_LIMIT","draft","selectableColumns","setupComplete","editing","itemsForTooltip","locationForTooltip","availableMapTypes","mapLegendPage","amount_column","extractors","legendColorMap","dataStats","minAmount","maxAmount","isInvalid","loaderGrid","visualizationDefaultState","number_of_decimals","defaultBreakdown","queryModel","showTargetPanel","relatedTransactions","showWelcome","onboardingTour","showTour","savedStateId","defaultSavedStateId","grid_state_id","filteredExport","job_result","filterState","activeFilterIds","buildLegendColorMap","updateColorMap","_filesize2","_filesize","_querymodel2","_querymodel","initialModalState","modifyDateFilter","dataColorMap","getColorMapFor","getLegendColorMap","getColorExtractorFor","updateMapLayer","FeatureLayerTypes","typeName","getLayerForMapType","updateMapState","initializeMapTooltip","amountCol","defaultColumns","tooltipsEditable","GridReportStore","getDownloads","fiscalYears","download","fullDataSet","getMap","getMapExtractors","getGridReportDownload","REPORT_LOADED","localeToCurrency","associatedReport","REPORT_GRID_FILTER_COLUMN","REPORT_GRID_FILTER_BY_FISCAL_YEAR","REPORT_GRID_TOGGLE_VISUALIZATIONS","REPORT_GRID_SET_LAST_XYZ_DAYS","today","REPORT_GRID_SET_VISUALIZATION_TYPE","REPORT_GRID_TOGGLE_LEGEND","REPORT_GRID_GET_VISUAL_AGGREGATIONS","REPORT_GRID_FILTER_REMAINING_AGGREGATES","REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS","sumField","transactionsByFiscalYearCleaned","isMonthly","dateColumnMeta","max_date","min_date","getColumnQuery","dayDiff","generateXAxis","yearIndex","axis","mostRecentYear","mostRecentYearIndex","xAxisValues","defaultXAxis","xAxisSet","REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS","REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR","REPORT_GRID_SET_VISUAL_BREAKDOWN","REPORT_GRID_RESET","keyIn","REPORT_GRID_SET_SCHEMA","date_column","db_parallel_capable","dateColumnSchema","dateColumnExists","departments","amountTypes","mapAmountColumnOptions","stateBreakdownColumns","stateAmountColumns","REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP","REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP","REPORT_LOADED_TRANSACTION_DOWNLOADS","CHECK_IMAGE_LOADING","CHECK_IMAGE_LOAD_ERROR","alert","REPORT_IN_SYNC_STATUS","isRebuilding","in_sync","SHOW_CHECK_IMAGE","HIDE_CHECK_IMAGE","REPORT_GRID_SET_VISUALIZATION_YEAR","GRID_REPORT_STATE_SAVING","GRID_REPORT_STATE_SAVED","formattedState","historyState","GRID_REPORT_STATE_LOADING","GRID_REPORT_STATE_LOADED","isTargetValid","visibleBreakdowns","newBreakdown","GRID_REPORT_STATE_NOT_FOUND","GRID_REPORT_DISMISS_ALERT","GRID_REPORT_STATE_LOAD_ERROR","GRID_REPORT_DATA_LOADING","GRID_REPORT_DATA_LOADED","GRID_REPORT_DATA_LOAD_ERROR","SHOW_TOS","HIDE_TOS","SHOW_BUDGET_101","HIDE_BUDGET_101","SHOW_GRID_HOWTO","HIDE_GRID_HOWTO","SHOW_EXPORT_FILTER","HIDE_EXPORT_FILTER","CLEAR_TARGET","SET_TARGET","warning","HIDE_COLUMN","columnData","RESET_COLUMN","TOGGLE_TARGET_PANEL","TOGGLE_COLUMNS_SETTINGS_PANEL","TOGGLE_BREAKDOWNS_SETTINGS_PANEL","RELATED_CHECK_INFORMATION_LOADED","SHOW_GRID_WELCOME","HIDE_GRID_WELCOME","SHOW_GRID_TOUR","HIDE_GRID_TOUR","GOTO_TOUR_WAYPOINT","GRID_REPORT_GO_BACK","REPORT_GRID_SET_MAP_TYPE","REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED","REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED","REPORT_GRID_MAP_LEGEND_RESET","REPORT_GRID_MAP_TOOLTIP_EDITED","REPORT_GRID_MAP_TOOLTIP_SAVED","REPORT_GRID_GET_ROWS_FOR_TOOLTIP","REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS","parseGeoJson","REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR","REPORT_GRID_SET_MAP_TOOLTIP_EDITING","REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP","REPORT_GRID_SET_MAP_LOADING","REPORT_GRID_SET_MAP_LOADED","REPORT_GRID_MAP_FIT_BOUNDS","REPORT_GRID_MAP_SET_GRID","REPORT_GRID_GET_MAP_META_SUCCESS","REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS","rawValue","newStats","REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS","REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS","REPORT_GRID_MAP_LOAD_GRID_CELLS","loadingCell","REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS","dataMax","updatedMapData","ingestRowsForMap","updatedLoaderGrid","REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS","REPORT_GRID_MAP_RESET","REPORT_GRID_SET_LAST_CREATED_REPORT","REPORT_GRID_CLEAR_LAST_CREATED_REPORT","delete","REPORT_GRID_RELOAD_PROPERTIES","REPORT_GRID_SET_MAP_AMOUNT_COLUMN","REPORT_GRID_SET_HEATMAP_TYPE","REPORT_GRID_FILTERED_EXPORT","REPORT_GRID_SET_AMOUNTS_TYPE","REPORT_GRID_SET_AMOUNT_COLUMN","REPORT_GRID_SET_LEGEND_SORT_BY","REPORT_GRID_ADD_ACTIVE_FILTER","REPORT_GRID_REMOVE_ACTIVE_FILTER","getUrlState","isShowingExportFilter","hasError","canReset","isMapGraphType","getFeatureCoordinates","getMapLayer","embedRegex","isEmbed","hideTable","hideViz","KEY","asc","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","$this","callbackfn","ToObject","ReactPropTypes","Route","PropTypes","falsy","componentName","instanceOf","escapeChar","escapeExpression","toHTML","possible","badChars","createFrame","_parent","blockParams","ids","appendContextPath","contextPath","report_roles","userId","invite","errorType","users","userLastSeenReport","last_seen","user","filteredUsers","updatedUser","onSuccess","userIds","messageUserNames","getMessageUsers","successString","resetShareMessagePanel","Ovid","ftw","hideSending","modifiers","whoops","notificationLastSeen","currentDateTime","userPreferences","reportSharingPreferences","canShowNotification","isPastDeadline","report_sharing_preferences","notification_last_seen","cachedUserPreferences","getUserPreferences","currentUserPreferences","notificationProperties","determineNotificationProperties","closeNotification","notification_enabled","_invites_store2","_invites_store","glMatrix","EPSILON","ARRAY_TYPE","RANDOM","ENABLE_SIMD","SIMD_AVAILABLE","USE_SIMD","setMatrixArrayType","degree","toRadian","LngLat","_settings_panel_store2","_settings_panel_store","selectCategory","changeAttribute","fieldPath","unexpectedError","deleteReport","confirmedDeleteReport","cancelDeleteReport","finishDeleteReport","changeDataSetOrder","renameDataSet","dataSetIndex","changeXAxisLabel","LIBRARY","$typed","$buffer","anInstance","propertyDesc","redefineAll","toIndex","toAbsoluteIndex","classof","isArrayIter","gOPN","getIterFn","wks","createArrayMethod","createArrayIncludes","speciesConstructor","ArrayIterators","Iterators","$iterDetect","setSpecies","arrayFill","arrayCopyWithin","$DP","$GOPD","RangeError","ArrayProto","$ArrayBuffer","$DataView","arrayForEach","arrayFind","arrayFindIndex","arrayIndexOf","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","arrayJoin","arraySort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","ITERATOR","TAG","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","CONSTR","TYPED_ARRAY","TYPED","VIEW","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","C","speciesFromList","fromList","addGetter","internal","$from","aLen","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","copyWithin","searchElement","middle","comparefn","subarray","$begin","BYTES_PER_ELEMENT","$slice","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","CLAMPED","GETTER","SETTER","TypedArray","Base","TAC","FORCED","ABV","TypedArrayPrototype","addElement","$offset","$length","klass","$len","$nativeIterator","CORRECT_ITER_NAME","$iterator","shared","getOrCreateMetadataMap","targetKey","targetMetadata","keyMetadata","ordinaryHasOwnMetadata","MetadataKey","metadataMap","ordinaryGetOwnMetadata","ordinaryDefineOwnMetadata","MetadataValue","ordinaryOwnMetadataKeys","toMetaKey","consoleLogger","_output","Logger","concreteLogger","subs","logger","debug","setDebug","lvl","debugOnly","moduleName","pound","fte","interpolated","incidents","per","columnType","sameOrigin","protocol","host","onerror","getArrayBuffer","responseType","getImage","imgData","img","Image","URL","webkitURL","revokeObjectURL","blob","Blob","createObjectURL","canvas","getContext","drawImage","getImageData","getVideo","urls","video","onloadstart","crossOrigin","mat2","mat2d","mat3","mat4","quat","vec2","vec3","vec4","_slicedToArray","sliceIterator","_arr","_n","_e","HEX3","hex3","HEX6","hex6","RGB","rgb","RGBA","rgba","fromArray","namedColor","NAMED_COLORS","Color","_ref","_ref2","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","TRANSPARENT","parseBoundCurves","calculatePaddingBoxPath","calculateBorderBoxPath","parsePathForBorder","parseDocumentSize","calculateContentBox","calculatePaddingBox","parseBounds","Bounds","_Vector","_Vector2","_BezierCurve","_BezierCurve2","clientRect","scrollX","scrollY","createPathFromCurves","fromClientRect","borders","borderWidth","paddingTop","paddingRight","paddingBottom","paddingLeft","scrollWidth","clientWidth","clientHeight","curves","borderSide","topLeftOuter","topLeftInner","topRightOuter","topRightInner","bottomRightOuter","bottomRightInner","bottomLeftOuter","bottomLeftInner","outer1","inner1","outer2","inner2","subdivide","CORNER","borderRadius","HALF_WIDTH","HALF_HEIGHT","tlh","TOP_LEFT","getAbsoluteValue","tlv","trh","TOP_RIGHT","trv","brh","BOTTOM_RIGHT","brv","blh","BOTTOM_LEFT","blv","topWidth","rightHeight","bottomWidth","leftHeight","getCurvePoints","r1","r2","kappa","ox","oy","xm","ym","META","setDesc","FREEZE","preventExtensions","setMeta","fastKey","getWeak","onFreeze","NEED","UNSCOPABLES","_currentRoute","PathUtils","ignoreScrollBehavior","isDefault","isNotFound","onEnter","onLeave","paramNames","extractParamNames","parentRoute","isAbsolute","defaultRoute","notFoundRoute","currentRoute","createRoute","transition","redirect","childRoutes","baseCompareAscending","indexOfNaN","baseIsFunction","charsLeftIndex","charsRightIndex","isSpace","trimmedLeftIndex","trimmedRightIndex","__dropCount__","POSITIVE_INFINITY","arrayCopy","LAZY_DROP_WHILE_FLAG","mapDelete","mapGet","mapHas","mapSet","arrayMax","NEGATIVE_INFINITY","arrayMin","initFromArray","arraySum","assignDefaults","objectValue","sourceValue","assignOwnDefaults","baseCopy","baseCallback","bindCallback","objToString","baseFind","retKey","baseForIn","isLoose","valType","othType","valWrapped","othWrapped","strictCompareFlags","isSrcArr","initFromCollection","baseSortByOrder","binaryIndex","binaryIndexBy","valIsUndef","isReflexive","bufferClone","bufferSlice","getCallback","createBindWrapper","createCtorWrapper","curryFunc","createExtremum","isMin","noIteratee","toIterable","extremumBy","createFindIndex","createFindKey","objectFunc","createForEach","createForIn","createForOwn","createPadDir","partialFunc","restParam","createReduce","createHybridWrapper","isCurryRight","argsHolders","newArgPos","newArity","newsHolders","PARTIAL_FLAG","PARTIAL_RIGHT_FLAG","BIND_FLAG","BIND_KEY_FLAG","ARY_FLAG","CURRY_FLAG","CURRY_BOUND_FLAG","CURRY_RIGHT_FLAG","padLength","createPartialWrapper","createSortedIndex","exValue","REARG_FLAG","pickByArray","pickByCallback","allowIndexes","nonEnumArgs","getLength","sortByAll","sortByOrder","reHostCtor","multiValue","reLatin1","reComboMarks","reHasRegExpChars","reRegExpChars","otherOptions","trunc","reWords","isObj","stringProto","nativeNumIsFinite","FLOAT64_BYTES_PER_ELEMENT","dom","floatLength","padLeft","padRight","reHexPrefix","backflow","isDropWhile","filtered","whileName","operationName","freeWindow","getProgressValues","getProgressBars","getTargetStatus","getTargetText","isBetweenTarget","isKPITargetsEnabled","isTargetGraph","targetStatuses","targetTypes","Above","Below","Between","onTarget","onTrack","needsFocus","StyleLayer","refLayer","getDeclarationValue","declaration","StyleTransition","StyleDeclaration","styleSpec","validateStyle","parseColor","background","raster","_paintSpecifications","_layoutSpecifications","_paintTransitions","_paintTransitionOptions","_paintDeclarations","_layoutDeclarations","_layoutFunctions","paintName","layoutName","setPaintProperty","setLayoutProperty","getPaintValue","_updateLayoutValue","_handleErrors","layoutProperty","getLayoutProperty","getLayoutValue","specification","calculate","validateStyleKey","getPaintProperty","calculateInterpolationT","isFeatureConstant","isZoomConstant","updatePaintTransitions","globalOptions","animationLoop","declarations","_applyPaintDeclaration","updatePaintTransition","classPaintDeclarations","zoomHistory","includeRefProperties","oldTransition","spec","transitionOptions","newTransition","instant","loopID","endTime","emitErrors","objectKey","glyphs","sprite","getType","validateFunction","validateObject","VALIDATORS","valueSpec","$version","constants","function","StructType","Struct","StructArray","structArrayTypeCache","maxSize","usedTypes","viewTypes","typeSize","sizeOf","align","createGetter","createSetter","serializeStructArrayType","bytesPerElement","emplaceBack","createEmplaceBack","_usedTypes","getArrayViewName","usedTypeSizes","argNames","argName","createMemberComponentString","component","elementOffset","componentOffset","structArray","_structArray","_pos1","_pos2","_pos4","_pos8","serialized","_refreshViews","Int8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint32Array","DEFAULT_CAPACITY","RESIZE_MULTIPLIER","oldUint8Array","uint8","endIndex","struct","isLayoutValueFeatureConstant","px","$keys","enumBugKeys","dPs","Empty","createDict","iframeDocument","Properties","hiddenKeys","DESCRIPTORS","SPECIES","forbiddenField","BREAK","RETURN","_t","defaultSetTimout","defaultClearTimeout","runTimeout","cachedSetTimeout","runClearTimeout","marker","cachedClearTimeout","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","Item","nextTick","browser","env","versions","addListener","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","cwd","chdir","umask","injectRavenPayload","handleDispatcherAction","analytics","lastKnownActionPayload","ga","uuid","subdomains","hostname","baseDomain","ravenDSN","RavenConfig","userEntityId","webPropertyId","didInitialize","gaPropertyId","heapProjectId","pageId","generate","dataCallback","install","setUserId","setEntityId","setRole","setSubdomain","setBaseDomain","updateSentryUser","setUserContext","setUser","pushPageView","setReportId","actionPayload","lastAction","isDispatching","event_id","canUseDOM","back","assetName","assetManifest","basePath","asset_path","asset_manifest","columnName","eventMetadata","Intercom","normalizeURL","pathPrefix","accessToken","ACCESS_TOKEN","REQUIRE_ACCESS_TOKEN","API_URL","normalizeStyleURL","normalizeSourceURL","normalizeGlyphsURL","normalizeSpriteURL","ext","normalizeTileURL","sourceUrl","tileSize","extension","Pbf","buf","readVarintRemainder","pbf","writeBigVarint","realloc","maxPos","reallocForRawMessage","startPos","extraLen","writePackedVarint","writeVarint","writePackedSVarint","writeSVarint","writePackedFloat","writeFloat","writePackedDouble","writeDouble","writePackedBoolean","writeBoolean","writePackedFixed32","writeFixed32","writePackedSFixed32","writeSFixed32","writePackedFixed64","writeFixed64","writePackedSFixed64","writeSFixed64","Varint","Fixed64","Bytes","Fixed32","POW_2_63","readFields","readField","readVarint","readMessage","readFixed32","readUInt32LE","readSFixed32","readInt32LE","readFixed64","readSFixed64","readFloat","readFloatLE","readDouble","readDoubleLE","readVarint64","readSVarint","readBoolean","readString","readBytes","readPackedVarint","readPackedSVarint","readPackedBoolean","readPackedFloat","readPackedDouble","readPackedFixed32","readPackedSFixed32","readPackedFixed64","readPackedSFixed64","writeTag","writeUInt32LE","writeInt32LE","writeString","bytes","writeFloatLE","writeDoubleLE","writeBytes","writeRawMessage","writeMessage","writeBytesField","writeFixed32Field","writeSFixed32Field","writeFixed64Field","writeSFixed64Field","writeVarintField","writeSVarintField","writeStringField","writeFloatField","writeDoubleField","writeBooleanField","op","compileComparisonOp","compileLogicalOp","compileNegation","compileInOp","compileHasOp","compilePropertyReference","checkType","expressions","expression","radians","DEGREES_TO_RADIANS","degrees","RADIANS_TO_DEGREES","ViewportMercator","project","lnglat2","lamda2","phi2","offsetX","offsetY","unproject","xy","atan","lamda","phi","formatQuery","replaceTempAccessToken","access_token","urlObject","tileURL","tileURLObject","calculateLengthFromValueWithUnit","LENGTH_TYPE","_NodeContainer","PX","PERCENTAGE","Length","parsedValue","parentLength","isPercentage","getRootFontSize","font","fontSize","def","stat","cof","ARG","tryGet","T","callee","spaces","space","non","exporter","ALIAS","FORCE","clearFn","_id","_clearFn","scope","unref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","_onTimeout","setImmediate","clearImmediate","EventEmitter","observers","_this","_this2","_len","_key","observer","makeString","getLastOfPath","cleanKey","setPath","_getLastOfPath","pushPath","_getLastOfPath2","getPath","_getLastOfPath3","deepExtend","overwrite","_entityMap","LocationActions","PUSH","REPLACE","POP","_classnames2","_classnames","hint","required","currentLength","_CSSTransitionGroup","_CSSTransitionGroup2","_TransitionGroup","_TransitionGroup2","TransitionGroup","CSSTransitionGroup","Reports","reports","getFirst","findParentReportsByChildId","reportJSON","associated_report_ids","findById","EventObserver","EventObserverBase","listenToProp","_listenToProps","propListeners","_bindProp","propObject","_unbindProp","_rebindPropListeners","prevPropObject","nextPropObject","_unbindPropListeners","componentWillReceiveProps","nextProps","nextProp","prevProp","componentWillUnmount","isProjectionType","Exception","errorProps","lineNumber","nop","Numeral","optionals","optionalsRegExp","power","formatNumeral","formatCurrency","formatPercentage","formatTime","unformatNumeral","thousandRegExp","millionRegExp","billionRegExp","trillionRegExp","stringOriginal","suffixes","bytesMultiplier","unformatTime","zeroFormat","languages","currentLanguage","delimiters","decimal","abbreviations","thousand","currency","trillion","spliceIndex","symbolIndex","openParenIndex","minusSignIndex","timeArray","thousands","negP","signed","optDec","abbrK","abbrM","abbrB","abbrT","abbrForce","ord","loadLanguage","correctionFactor","mp","mn","numeral","hasModule","isNumeral","unformat","language","languageData","opt_initialValue","isValueSet","cback","accum","curr","currI","corrFactor","ender","maxNumberOfSavedViewsReturned","_immutabilityHelper","_immutabilityHelper2","CLEAR_SAVED_VIEW_PROPERTIES","_views","_activeView","_editView","_editViewSyncing","_visitedViews","SavedViewsStore","findViewById","_dragViewId","$push","$splice","oldView","newView","afterId","afterView","viewIndex","afterViewIndex","updatedView","_fetchSavedViews","_clearEditView","viewState","view_state","reportState","_markViewAsVisited","_newView","__clientId","requestId","_addSavedView","__error","savedViewId","updatedAttributes","_replaceSavedView","_removeSavedView","_moveSavedView","CheckSettings","checkbookDomain","pdfPath","requiredFields","descriptionFields","requiresFeaturePermission","getLng","getLat","lngs","lats","ne","sw","padBounds","geometry","coordinates","getBounds","getFeatureLongitude","getFeatureLatitude","paddingRatio","DEFAULT_BOUNDS_PADDING","lngDiff","MINIMUM_POINT_DIFF","latDiff","lngPadding","latPadding","coordinateIsInvalid","lngLat","boundsA","boundsB","lngLatIndex","coordIndex","BOUNDS_NEAR_EQUAL_DIFF_RATIO","parsedNumber","locationColumn","HeatmapExtractorsMap","mapAmountField","transformRowsToFeatures","filterRowsWithoutLocation","featureLocationsVirtuallyIdentical","_HeatmapExtractorsMap","firstCoord","rows","lngLatExtractor","__heatmapIntensity","getHeatmapIntensityForAmount","__heatmapSize","getHeatmapSizeForAmount","intensityExtractor","sizeExtractor","transformedRows","objectFromKeyArray","buildObjectsFromArrays","query_header","validateSpec","elementSpecs","elementValidators","objectElementValidators","validateElement","elementSpecKey","elementSpec","itemSize","bindBuffer","createBuffer","bufferData","STATIC_DRAW","AttributeType","Int8","Uint8","Int16","Uint16","setVertexAttribPointers","attribIndex","vertexAttribPointer","deleteBuffer","boundProgram","boundVertexBuffer","boundVertexBuffer2","boundElementBuffer","vao","vertexBuffer2","extVertexArrayObject","getExtension","isFreshBindRequired","freshBind","bindVertexArrayOES","numPrevAttributes","numNextAttributes","numAttributes","createVertexArrayOES","currentNumAttributes","disableVertexAttribArray","enableVertexAttribArray","deleteVertexArrayOES","EXTENT_MIN","EXTENT_MAX","extent","loadGeometry","point","TileCoord","dim","posMatrix","edge","x0","y0","scanSpans","e0","e1","ymin","ymax","scanLine","m0","m1","d0","d1","scanTriangle","ab","ca","WhooTS","toCoordinate","sourceMaxZoom","tileScale","fromID","scheme","bbox","getTileBBox","cover","actualZ","wx","coord","tiles","tile","pixelValue","normalizeArray","allowAboveRoot","up","basename","matchedSlash","xs","resolvedPath","resolvedAbsolute","normalize","fromParts","toParts","samePartsLength","outputParts","dirname","hasRoot","extname","startDot","startPart","preDotState","valueSpecKey","objectElementSpec","objectElementValidator","layoutVertexBuffer","createBounds","bits","boundsLookup","15","16","getQuadkey","quadkey","Control","addTo","_container","onAdd","corner","_controlCorners","onRemove","pushHash","filterElementInContainer","scrollOffset","offsetTop","distance","copyCSSStyles","setProperty","SMALL_IMAGE","mode","copyright","unicode","sticky","Cookies","_document","_navigator","_cachedDocumentCookie","cookie","_renewCache","_getExtendedOptions","expires","_getExpiresDate","_generateCookieString","expire","domain","secure","_isValidDate","cookieString","toUTCString","_getCookieObjectFromString","documentCookie","cookieObject","cookiesArray","cookieKvp","_getKeyValuePairFromCookieString","separatorIndex","_areEnabled","areEnabled","enabled","getPreferredLanguage","_i18next","_i18next2","preferred_language","resources","lowerCaseLng","nonExplicitWhitelist","whitelist","fallbackLng","ns","defaultNS","interpolation","changeLanguage","validateFormat","DefaultRoute","Link","NotFoundRoute","Redirect","ActiveHandler","RouteHandler","HashLocation","HistoryLocation","RefreshLocation","StaticLocation","TestLocation","ImitateBrowserBehavior","ScrollToTopBehavior","Navigation","State","createDefaultRoute","createNotFoundRoute","createRedirect","createRoutesFromReactChildren","_get","_x","_x2","_x3","_again","receiver","ContextWrapper","REF_NAME","_React$Component","routeDepth","_updateRouteComponent","setRouteComponentAtDepth","getRouteDepth","getRouteAtDepth","childProps","getCurrentParams","getCurrentQuery","createChildRouteHandler","contextTypes","childContextTypes","defaultProps","_events2","overlayEvents","overlayItems","_temp","_ret","isHost","parseString","parseHeader","Response","setStatusProperties","header","setHeaderProperties","parseBody","Request","Emitter","_query","_header","new_err","request","getXHR","serializeObject","urlencoded","statusType","info","clientError","serverError","toError","accepted","noContent","badRequest","unauthorized","notAcceptable","forbidden","_timeout","_timer","aborted","getHeader","accept","auth","pass","btoa","_formData","FormData","attach","filename","crossDomainError","timeoutError","withCredentials","_withCredentials","timedout","handleProgress","hasListeners","onprogress","upload","transitionEnterTimeout","transitionLeaveTimeout","commands","nextObject","objectWasNextObject","isEquals","nextValueForKey","defaultCommands","directive","invariantPushAndUnshift","command","invariantSpecArray","invariantSplices","invariantSplice","invariantApply","invariantSet","invariantMerge","specValue","invariantMapOrSet","typeOfTarget","$unshift","originalObject","$toggle","nextObjectCopy","$unset","$add","$remove","$merge","$apply","contextForExport","hex","colors","htmlColors","getColor","moreColor","moreHtmlColor","axisColor","axisHtmlColor","generateRequestId","_saved_views_store2","_saved_views_store","_grid_report_actions2","_grid_report_actions","selectView","getActiveView","cancelView","createView","getEditView","editView","updateView","deleteView","startViewDrag","dragViewAfter","dropView","getDragView","ShareIcon","_Component","viewBox","renderPrivate","renderOrg","renderNetwork","renderPublic","oneOf","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","objectPrototype","inheritedComponent","REACT_STATICS","KNOWN_STATICS","displayName","getDefaultProps","getDerivedStateFromProps","mixins","caller","_zoomTo","clamp_css_byte","clamp_css_float","parse_css_int","parse_css_float","css_hue_to_rgb","m2","parseCSSColor","css_str","kCSSColorTable","iv","ep","fname","ShelfPack","autoResize","shelves","stats","Shelf","free","pack","bins","allocation","packOne","inPlace","w2","h2","shelf","waste","best","alloc","h1","w1","sortTilesIn","coordA","coordB","mergeRenderedFeatureLayers","layerID","tileFeatures","resultFeatures","TilePyramid","_loadTileJSON","tileJSON","vector_layers","vectorLayers","vectorLayerIds","_pyramid","roundZoom","reparseOverscaled","_loadTile","_abortTile","unload","_unloadTile","_addTile","_removeTile","redoPlacement","_redoTilePlacement","orderedIDs","getTile","_getTile","_getVisibleCoordinates","renderedIDs","_queryRenderedVectorFeatures","queryGeometry","bearing","tilesIn","styleLayers","_layers","renderedFeatureLayers","tileIn","featureIndex","_querySourceFeatures","pyramid","dataTiles","dataID","querySourceFeatures","vector","geojson","_abort","_unload","_remove","_redoPlacement","_tiles","_filterRendered","coordinateToTilePoint","tileCoord","zoomedCoord","compareKeyZoom","Tile","maxOverzooming","maxUnderzooming","errored","_coveredTiles","reload","getZoom","coveringZoomLevel","coveringTiles","tileCenter","locationCoordinate","centerPoint","pointCoordinate","findLoadedChildren","maxCoveringZoom","z2","parentId","findLoadedParent","minCoveringZoom","addTile","updateCacheSize","widthInTiles","heightInTiles","approxTilesInView","setMaxSize","used","fadeDuration","parentsForFading","timeAdded","fadedParent","removeTile","uses","clearTiles","tileResults","tileSpaceBounds","tileSpaceQueryGeometry","tileResult","VectorTile","VectorTileFeature","VectorTileLayer","drawRaster","painter","isOpaquePass","enable","DEPTH_TEST","depthMask","depthFunc","LESS","minTileZ","setDepthSublayer","drawRasterTile","LEQUAL","STENCIL_TEST","calculatePosMatrix","useProgram","uniformMatrix4fv","u_matrix","uniform1f","u_brightness_low","u_brightness_high","u_saturation_factor","saturationFactor","u_contrast_factor","contrastFactor","uniform3fv","u_spin_weights","spinWeights","parentScaleBy","parentTL","parentTile","opacities","getOpacities","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texture","TEXTURE1","uniform2fv","u_tl_parent","u_scale_parent","u_buffer_scale","u_opacity0","u_opacity1","uniform1i","u_image0","u_image1","boundsBuffer","rasterBoundsBuffer","boundsVAO","rasterBoundsVAO","drawArrays","TRIANGLE_STRIP","contrast","saturation","sinceTile","sinceParent","idealZ","parentFurther","RasterBoundsArray","LngLatBounds","sw2","ne2","_sw","_ne","getCenter","getSouthWest","getNorthEast","getNorthWest","getWest","getNorth","getSouthEast","getEast","getSouth","beginDrag","sourceIds","publishSource","clientOffset","getSourceClientOffset","_invariant2","_isArray2","monitor","getMonitor","registry","getRegistry","isDragging","getSource","sourceId","canDragSource","sourceClientOffset","_isObject2","pinSource","itemType","getSourceType","BEGIN_DRAG","isSourcePublic","publishDragSource","PUBLISH_DRAG_SOURCE","targetIdsArg","_ref$clientOffset","targetIds","didDrop","targetId","getTarget","draggedItemType","getItemType","_i2","_targetId","targetType","getTargetType","_matchesType2","_i3","_targetId2","HOVER","getTargetIds","canDropOnTarget","dropResult","getDropResult","DROP","endDrag","getSourceId","unpinSource","END_DRAG","_invariant","_isArray","_isObject","_matchesType","addSource","ADD_SOURCE","addTarget","ADD_TARGET","removeSource","REMOVE_SOURCE","removeTarget","REMOVE_TARGET","checkDecoratorArguments","functionName","signature","Amount","abbreviated","noUnitSymbols","addSpace","formatValue","setSouthWest","setNorthEast","og","_createReactClass2","_createReactClass","ShareList","linkHelper","showShareMenu","showDownloadItems","handleTwitter","shareTwitter","handleFacebook","shareFacebook","handleGoogle","shareGoogle","handleEmail","shareEmail","handleCSVDownload","downloadModel","downloadCsv","showDownloads","hideImageDownload","tableHeader","maxDepth","amounts","variance","tableBody","depthNames","percentVariance","tableFooter","totals","footer","delta","unitSymbol","titles","filterContext","exportDateString","_renderShareItems","_renderDownloadItems","SharedLinkHelper","getLocationProperties","hashtag","locationString","updateUrl","_animateScroll","_animateScroll2","_scrollEvents","_scrollEvents2","__mapped","__activeLink","unmount","unregister","setActiveLink","link","getActiveLink","absolute","containerId","containerElement","registered","smooth","animateTopScroll","ExportModal","cancelable","confirmable","confirmText","cancelText","onClose","onConfirm","rightButtonClass","leftButtonClass","PATH","VECTOR","BEZIER_CURVE","CIRCLE","_Color","_Color2","_Util","_background","_border","_borderRadius","_display","_float","_font","_letterSpacing","_overflow","_padding","_position","_textDecoration","_textShadow","_textTransform","_transform","_visibility","_zIndex","_Bounds","_Input","INPUT_TAGS","NodeContainer","resourceLoader","parseDisplay","IS_INPUT","parsePosition","INPUT_BACKGROUND","parseBackground","INPUT_BORDERS","parseBorder","HTMLInputElement","getInputBorderRadius","parseBorderRadius","INPUT_COLOR","float","parseCSSFloat","parseFont","parseLetterSpacing","parseOverflow","OVERFLOW","HIDDEN","parsePadding","textDecoration","parseTextDecoration","textShadow","parseTextShadow","textTransform","parseTextTransform","parseTransform","parseVisibility","zIndex","parseZIndex","POSITION","STATIC","isTransformed","curvedBounds","reformatInputBounds","parentClips","getClipPaths","SCROLL","isRootElement","isFloating","isAbsolutelyPositioned","DISPLAY","NONE","VISIBILITY","VISIBLE","RELATIVE","FLOAT","isPositioned","auto","INLINE","INLINE_BLOCK","INLINE_FLEX","INLINE_GRID","INLINE_LIST_ITEM","INLINE_TABLE","SVGSVGElement","XMLSerializer","loadImage","serializeToString","currentSrc","loadCanvas","iframeKey","parseBackgroundImage","calculateBackgroundRepeatPath","calculateBackgroundPosition","calculateBackgroungPositioningArea","calculateBackgroungPaintingArea","calculateGradientBackgroundSize","calculateBackgroundSize","BACKGROUND_ORIGIN","BACKGROUND_CLIP","BACKGROUND_SIZE","BACKGROUND_REPEAT","_Length","_Length2","_Size","_Size2","REPEAT","NO_REPEAT","REPEAT_X","REPEAT_Y","AUTO","CONTAIN","COVER","LENGTH","BORDER_BOX","PADDING_BOX","CONTENT_BOX","BackgroundSize","AUTO_SIZE","backgroundImage","targetRatio","currentRatio","parseBackgroundClip","clip","backgroundOrigin","paddingBox","PADDING_SIDES","LEFT","RIGHT","TOP","BOTTOM","backgroundPositioningArea","backgroundColor","parseBackgroundImages","parseBackgroundOrigin","parseBackgroundRepeat","backgroundRepeat","positions","backgroundPosition","repeats","backgroundSize","parseBackgroundSize","parseBackgoundPosition","definition","numParen","appendResult","prefix_i","_Path","Vector","_ForeignObjectRenderer","testRangeBounds","testElement","TEST_HEIGHT","selectNode","rangeBounds","rangeHeight","testBase64","toDataURL","testCORS","testResponseType","testSVG","isGreenPixel","testForeignObject","fillStyle","fillRect","greenImageSrc","svg","createForeignObjectSVG","loadSerializedSVG","FEATURES","IS_INCLUDES","TO_STRING","MATCH","SAFE_CLOSING","riter","skipClosing","builtinExec","regexpExec","REPLACE_SUPPORTS_NAMED_GROUPS","re","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","strfn","rxfn","forOf","setToStringTag","inheritIfRequired","common","IS_WEAK","ADDER","fixMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","getConstructor","setStrong","Typed","TypedArrayConstructors","K","__defineSetter__","COLLECTION","A","cb","mapFn","nextItem","__ControlPanelStore","ControlPanelStore","getApps","selectedApp","getSelectedAppId","getSelectedEntity","isEntitySelected","featurePermissions","containsPermission","menuItem","requires_feature_permission","_menuItems","mi","requires_entity","entrypoint","_computeMIEntrypoint","getAppEntrypoint","app","_findAppById","_apps","getDefaultApp","_selectedEntity","getLoadedApp","_loadedApp","_selectedApp","_isOpenGov","isEntitySwitcherOpen","_entitySwitcherOpen","_entityLoading","isDirty","_isDirty","getLeaveModal","_leaveModal","_onEntityChange","LEAVE_MODAL_DEFAULTS","TITLE","MESSAGE","ui","abilities","switch_to","location_template","_loadApp","appId","_selectApp","selectedAppId","onEntityChange","leaveModal","isLeaveModalObject","_selectEntity","isGlobal","_wrapped","optimizeCb","restArguments","shallowProperty","_has","deepGet","currentKey","memo","keyFinder","lastComputed","behavior","reStrSymbol","_flatten","shallow","createPredicateIndexFinder","createIndexFinder","predicateFind","executeBound","sourceFunc","boundFunc","callingContext","hasher","later","throttled","_now","immediate","callNow","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","ObjProto","hasEnumBug","allKeys","keyInObj","extendOwn","aStack","bStack","deepEq","SymbolProto","areArrays","aCtor","bCtor","tagTester","_isFinite","_isNaN","createEscaper","escaper","testRegexp","replaceRegexp","fallback","oldSettings","noMatch","_chain","chainResult","otherArrays","callArgs","boundArgs","nodelist","escapeMap","unescapeMap","escapes","emptyObject","makeEmptyFunction","emptyFunction","thatReturns","thatReturnsFalse","thatReturnsTrue","thatReturnsNull","thatReturnsThis","thatReturnsArgument","shallowEqual","objA","objB","keysA","keysB","compilePattern","_compiledPatterns","paramCompileMatcher","qs","paramInjectMatcher","paramInjectTrailingSlashMatcher","queryMatcher","extractParams","_compilePattern","injectParams","splatIndex","segment","extractQuery","withoutQuery","withQuery","existingQuery","queryString","arrayFormat","notifyChange","getCurrentPath","_listeners","onPopState","_isListening","addChangeListener","removeChangeListener","_entity2","_entities2","_entities","_control_panel_store2","_control_panel_store","_entity_store2","_entity_store","selectedById","forceReload","Entity","_onEntityError","startLoading","loadAll","entities","Entities","_onEntitiesError","newEntity","_fetchEntityTypes","_fetchCountries","_fetchStates","_fetchGroups","submitEntityForm","EntityStore","getNewEntity","cancelEntityForm","countrySelected","country","getEntityTypes","entityTypes","entity_types","getCountries","countries","getSelectedCountry","getStates","states","getGroups","rawGroups","formattedGroups","ToggleMixin","dropdownClass","onToggle","targetClass","dropdownClassMixin","data-hint","data-hint-position","handleToggleClick","_gl_data_sets2","_gl_data_sets","legacyReportIds","Report","urlRoot","defaultGraphType","setAssocReport","initDataSets","authorized","associated_reports","initAssocReport","data_set_type","technical_name","parseError","responseJSON","parseDataSetErrors","unsetAssocReport","setDataSets","setDefaultState","canDelete","canRename","isLegacy","isDescriptionVisible","description_visible","isAuthorized","access_code","editSettings","editDefaultState","selectData","initializeTracking","entity_type","user_entity_id","user_roles","user_is_opengov_employee","user_suite","user_department","department","user_title","user_entity_salesforce_id","salesforce_id","user_delphius_features","internal_external","user_role","entity_bp_id","entity_rt_id","entity_salesforce_id","entity_country","entity_state","trackPage","pageName","pageTrackingProps","page","_dereq_","promises","SomePromiseArray","setHowMany","setUnwrap","_SomePromiseArray","2","Async","_isTickUsed","_lateQueue","Queue","_normalQueue","_trampolineEnabled","drainQueues","_drainQueues","_schedule","schedule","isStatic","AsyncInvokeLater","_queueTick","AsyncInvoke","AsyncSettlePromises","_pushOne","firstLineError","disableTrampolineIfNecessary","hasDevTools","enableTrampoline","haveItemsQueued","throwLater","invokeLater","settlePromises","_settlePromises","invokeFirst","_drainQueue","3","INTERNAL","tryConvertToPromise","rejectThis","_reject","targetRejected","promiseRejectionQueued","bindingPromise","_then","bindingResolved","_isPending","_resolveCallback","bindingRejected","maybePromise","_propagateFrom","_target","_setBoundTo","_progress","_bitField","_boundTo","_isBound","4","bluebird","5","cr","callerCache","getterCache","ensureMethod","classString","namedGetter","indexedGetter","getGetter","canEvaluate","isIdentifier","$_len","$_i","maybeGetter","6","_cancel","reason","isCancellable","promiseToReject","_cancellationParent","_unsetCancellable","_rejectCallback","_cancellable","_setCancellable","uncancellable","fork","didFulfill","didReject","didProgress","7","CapturedTrace","_length","uncycle","reconstructStack","stacks","removeDuplicateOrEmptyJumps","removeCommonRoots","currentLastIndex","currentLastLine","commonRootMeetPoint","cleanStack","isTraceLine","stackFramePattern","isInternalFrame","shouldIgnore","indentStackFrames","stackFramesAsArray","formatNonError","snip","maxChars","parseLineInfo","parseLineInfoRegex","fileName","bluebirdFramePattern","formatStack","stackToIndex","currentStack","cycleEdgeNode","currentChildLength","hasParent","attachExtraTrace","__stackCleaned__","parseStackAndMessage","trace","notEnumerableProp","formatAndLogError","unhandledRejection","isSupported","fireRejectionEvent","localHandler","localEventFired","globalEventFired","fireGlobalEvent","domEventFired","fireDomEvent","setBounds","lastLineError","firstFileName","lastFileName","firstStackLines","lastStackLines","firstIndex","v8stackFramePattern","v8stackFormatter","stackTraceLimit","ignoreUntil","hasStackAfterThrow","customEventWorks","anyEventWorks","CustomEvent","createEvent","initCustomEvent","detail","bubbles","toWindowMethodNameMap","stderr","isTTY","8","NEXT_FILTER","CatchFilter","instances","_instances","_promise","safePredicate","safeObject","retfilter","tryCatch","errorObj","doFilter","boundTo","_boundValue","itemIsErrorType","shouldHandle","9","isDebugging","Context","_trace","peekContext","createContext","contextStack","_pushContext","_popContext","_peekContext","10","unhandledRejectionHandled","possiblyUnhandledRejection","getDomain","_getDomain","Warning","canAttachTrace","debugging","_ignoreRejections","_unsetRejectionIsUnhandled","_ensurePossibleRejectionHandled","_setRejectionIsUnhandled","_notifyUnhandledRejection","_notifyUnhandledRejectionIsHandled","_isRejectionUnhandled","_getCarriedStackTrace","_settledValue","_setUnhandledRejectionIsNotified","_unsetUnhandledRejectionIsNotified","_isUnhandledRejectionNotified","_setCarriedStackTrace","capturedTrace","_fulfillmentHandler0","_isCarryingStackTrace","_captureStackTrace","_attachExtraTrace","ignoreSelf","_warn","onPossiblyUnhandledRejection","onUnhandledRejectionHandled","longStackTraces","hasLongStackTraces","11","returner","thrower","returnUndefined","throwUndefined","thenReturn","thenThrow","12","PromiseReduce","13","subError","nameProperty","defaultMessage","SubError","OperationalError","cause","_TypeError","_RangeError","es5","Objectfreeze","freeze","TimeoutError","AggregateError","indent","errorTypes","RejectionError","14","isES5","getDescriptor","propertyIsWritable","ObjectKeys","ObjectGetDescriptor","ObjectDefineProperty","ObjectFreeze","ObjectGetPrototypeOf","ArrayIsArray","PromiseMap","returnThis","throwThis","return$","throw$","promisedFinally","reasonOrValue","isFulfilled","finallyHandler","isRejected","tapHandler","_passThroughHandler","isFinally","promiseAndHandler","lastly","17","apiRejection","promiseFromYieldHandler","yieldHandlers","traceParent","PromiseSpawn","generatorFunction","yieldHandler","_generatorFunction","_receiver","_generator","_yieldHandlers","_run","_next","_continue","_throw","coroutine","PromiseSpawn$","generator","spawn","addYieldHandler","18","PromiseArray","19","MappingPromiseArray","_filter","constructor$","_preservedValues","_limit","_inFlight","_queue","EMPTY_ARRAY","_init$","PENDING","_init","_promiseFulfilled","preservedValues","_isResolved","_proxyPromiseArray","_isFulfilled","_reason","_totalResolved","_resolve","20","_resolveFromSyncValue","21","spreadAdapter","nodeback","successAdapter","errorAdapter","newReason","asCallback","nodeify","adapter","22","progressed","progressValue","_isFollowingOrFulfilledOrRejected","_progressUnchecked","_progressHandlerAt","_progressHandler0","_doProgressWith","progression","_promiseAt","_receiverAt","_promiseProgressed","23","_rejectionHandler0","_promise0","_receiver0","_resolveFromResolver","fillTypes","makeSelfResolutionError","reflect","PromiseInspection","UNDEFINED_BINDING","APPLY","PromiseResolver","nodebackForPromise","_nodebackForPromise","caught","catchInstances","catchFilter","_setIsFinal","isResolved","fulfillmentValue","rejectionReason","originatesFromRejection","getNewLibraryCopy","fromNode","pending","cast","_fulfillUnchecked","fulfilled","rejected","setScheduler","haveInternalData","_setIsMigrated","callbackIndex","_addCallbacks","_isSettlePromisesQueued","_settlePromiseAtPostResolution","_settlePromiseAt","_isFollowing","_setLength","_setFulfilled","_setRejected","_setFollowing","_isFinal","_unsetIsMigrated","_isMigrated","_fulfillmentHandlerAt","_rejectionHandlerAt","_migrateCallbacks","follower","fulfill","_setProxyHandlers","promiseSlotValue","promiseArray","shouldBind","_fulfill","propagationFlags","_setFollowee","_rejectUnchecked","synchronous","shouldNotMarkOriginatingFromRejection","markAsOriginatingFromRejection","ensureErrorObject","hasStack","_settlePromiseFromHandler","_isRejected","_followee","_cleanValues","carriedStackTrace","isPromise","_clearCallbackDataAtIndex","_promiseRejected","_setSettlePromisesQueued","_unsetSettlePromisesQueued","_queueSettlePromises","_rejectUncheckedCheckError","toFastProperties","24","toResolutionValue","resolveValueIfEmpty","__hardReject__","_resolveEmptyArray","getActualLength","shouldCopyValues","25","isUntypedError","wrapAsOperationalError","rErrorKey","maybeWrapAsError","haveGetters","26","propsFilter","noCopyPropsPattern","isPromisified","__isPromisified__","hasPromisified","getDataPropertyOrDefault","defaultPromisified","checkValid","suffixRegexp","keyWithoutAsyncSuffix","promisifiableMethods","inheritedDataKeys","passesDefaultFilter","defaultFilter","makeNodePromisifiedClosure","promisified","THIS","defaultThis","withAppended","promisifyAll","promisifier","escapeIdentRegex","promisifiedKey","makeNodePromisified","promisify","makeNodePromisifiedEval","noCopyProps","copyDescriptors","isClass","27","PropertiesPromiseArray","castValue","keyOffset","28","arrayMove","dst","dstIndex","_front","_willBeOverCapacity","_checkCapacity","_unshiftOne","front","wrapMask","_resizeTo","29","race","raceLater","30","ReductionPromiseArray","_each","_zerothIsAccum","_gotAccum","_reducingIndex","_valuesPhase","_accum","initialValue","valuesPhaseIndex","isEach","gotAccum","valuesPhase","31","noAsyncScheduler","MutationObserver","GlobalSetImmediate","ProcessNextTick","isRecentNode","observe","classList","32","SettledPromiseArray","_promiseResolved","inspection","settle","33","_howMany","_unwrap","_initialized","howMany","isArrayResolved","_canPossiblyFulfill","_getRangeError","_addFulfilled","_fulfilled","_addRejected","_rejected","34","35","isAnyBluebirdPromise","getThen","doThenable","hasProp","resolveFromThenable","rejectFromThenable","progressFromThenable","36","successClear","failureClear","afterTimeout","afterValue","37","inspectionMapper","inspections","castPreservingDisposable","thenable","_isDisposable","_getDisposer","_setDisposable","dispose","tryDispose","disposerSuccess","disposerFail","Disposer","_context","FunctionDisposer","maybeUnwrapDisposer","isDisposer","resource","doDispose","_unsetDisposable","spreadArgs","disposer","vals","_disposer","38","tryCatcher","tryCatchTarget","maybeError","safeToString","appendee","hasMethods","hasMethodsOtherThanConstructor","hasThisAssignmentAndStaticMethods","thisAssignmentPattern","rident","filledRange","ignore","Child","Parent","excludedPrototypes","isExcludedProto","getKeys","visitedKeys","enumeration","chrome","loadTimes","showReportWelcome","showTemplateModal","feedback","showError","ModalStore","SHOW_WELCOME","HIDE_WELCOME","SHOW_REPORT_WELCOME","HIDE_REPORT_WELCOME","SHOW_HOWTO","HIDE_HOWTO","SHOW_FEEDBACK_FORM","HIDE_FEEDBACK_FORM","SHOW_FEEDBACK_ERROR","FEEDBACK_SAVING","FEEDBACK_SAVED","SHOW_DOWNLOAD","HIDE_DOWNLOAD","suppressRemoval","subtext","buttons","_updates","setQuery","QueryModel","force","_old_q","_q","acobject","account_codes","linkageNodes","maskNodesForLinkage","linkage_nodes","mask_nodes_for_linkage","compatibleReports","_cookiesJs","_cookiesJs2","cookieHelper","setVisitedCookie","parentDomain","unsetVisitedCookie","RemoteModel","pageSize","lookaheadRatio","requestDelay","requestHandle","dataLength","ensureData","computeRange","fromPage","toPage","processQuery","sendRequest","lookahead","endpoint","onError","reqsize","total_count_estimate","ContextMenu","menu","choices","blank","handleContextMenu","handleClick","hideMenu","showDropdown","getCellFromEvent","getColumns","cellValue","getDataItem","choice","elementData","my","collision","positionCallback","isInsideClicked","_selector","_selector2","dropdown","setDefaults","defaultOptions","getDefaults","setI18n","i18n","getI18n","withRef","bindI18n","bindStore","translateFuncName","nsMode","usePureComponent","reactI18nextModule","react","isBrowser","isArraySupported","isFunctionSupported","isObjectSupported","isJSONSupported","isWorkerSupported","isUint8ClampedArraySupported","isWebGLSupportedCached","failIfMajorPerformanceCaveat","isSealed","seal","isWebGLSupportedCache","isWebGLSupported","webGLContextAttributes","probablySupportsContext","supportsContext","mapboxgl","antialias","stencil","_function","_function2","shouldComponentUpdate","stylize","stylizeNoColor","showHidden","_extend","customInspect","stylizeWithColor","styleType","arrayToHash","recurseTimes","primitive","formatPrimitive","visibleKeys","formatError","braces","formatArray","formatProperty","reduceToSingleString","numLinesEst","ar","isNullOrUndefined","timestamp","getHours","getMinutes","getSeconds","callbackifyOnRejected","callbackify","callbackified","maybeCb","rej","getOwnPropertyDescriptors","descriptors","formatRegExp","objects","deprecated","warned","throwDeprecation","traceDeprecation","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","pid","kCustomPromisifiedSymbol","promiseResolve","promiseReject","custom","autobind","boundClass","boundMethod","Reflect","ownKeys","definingProperty","boundFn","d3_documentElement","d3_window","d3_ascending","d3_number","d3_numeric","d3_bisector","lo","hi","d3_transposeLength","d3_range_integerScale","d3_class","d3_Map","d3_map_escape","d3_map_proto","d3_map_zero","d3_map_unescape","d3_map_has","d3_map_remove","d3_map_keys","d3_map_size","d3_map_empty","d3_Set","d3_identity","d3_rebind","d3_vendorSymbol","d3_vendorPrefixes","prefixName","d3_noop","d3_dispatch","d3_dispatch_event","listenerByName","d3_eventPreventDefault","d3","d3_eventSource","sourceEvent","d3_eventDispatch","thiz","argumentz","d3_selection","d3_subclass","d3_selectionPrototype","d3_selection_selector","d3_select","d3_selection_selectorAll","d3_selectAll","d3_selection_attr","attrNull","attrNullNS","removeAttributeNS","attrConstant","attrConstantNS","setAttributeNS","attrFunction","attrFunctionNS","qualify","d3_collapse","d3_selection_classedRe","requote","d3_selection_classes","d3_selection_classed","classedConstant","classedFunction","d3_selection_classedName","d3_selection_style","styleNull","removeProperty","styleConstant","styleFunction","d3_selection_property","propertyNull","propertyConstant","propertyFunction","d3_selection_creator","namespaceURI","d3_nsXhtml","createElementNS","createNS","d3_selectionRemove","d3_selection_dataNode","d3_selection_filter","d3_selectMatches","d3_selection_sortComparator","d3_selection_each","d3_selection_enter","d3_selection_enterPrototype","d3_selection_enterInsertBefore","enter","i0","j0","d3_selection_on","capture","d3_array","d3_selection_onListener","d3_selection_onFilters","d3_selection_onFilter","d3_event_dragSuppress","d3_event_dragId","d3_event_dragSelect","d3_mousePoint","changedTouches","ownerSVGElement","createSVGPoint","d3_mouse_bug44083","ctm","getScreenCTM","matrixTransform","inverse","d3_behavior_dragTouchId","d3_sgn","d3_cross2d","d3_acos","π","acos","d3_asin","halfπ","asin","d3_sinh","d3_cosh","d3_tanh","d3_haversin","d3_color","d3_hsl","d3_rgb_parse","d3_rgb_hsl","d3_hsl_rgb","vv","d3_rgb","d3_hcl","d3_lab","d3_lab_hcl","d3_rgb_lab","d3_hcl_lab","d3_radians","d3_lab_rgb","d3_lab_xyz","d3_lab_X","d3_lab_Y","d3_lab_Z","d3_xyz_rgb","d3_degrees","d3_xyz_lab","d3_rgbNumber","d3_rgbString","d3_rgb_hex","hsl","d3_rgb_parseNumber","d3_rgb_names","d3_rgb_xyz","d3_functor","d3_xhrType","d3_xhr","respond","d3_xhrHasResponse","XDomainRequest","beforesend","rebind","d3_xhr_fixCallback","d3_timer","d3_timer_queueTail","d3_timer_queueHead","d3_timer_interval","d3_timer_timeout","d3_timer_frame","d3_timer_step","d3_timer_mark","d3_timer_sweep","t0","t1","d3_format_precision","LN10","d3_formatPrefix","d3_locale_numberFormat","locale_decimal","locale_thousands","locale_grouping","grouping","locale_currency","formatGroup","specifier","d3_format_re","zfill","integer","exponent","d3_format_types","d3_format_typeDefault","zcomma","fullSuffix","negative","formatPrefix","d3_date_utc","d3_time_interval","d3_date","dt","range_utc","d3_time_interval_utc","d3_locale_timeFormat","d3_time_format","d3_time_formatPads","d3_time_formats","H","Z","d3_time_parse","localZ","setHours","d3_time_parsers","d3_time_parseWeekdayAbbrev","d3_time_dayAbbrevRe","d3_time_dayAbbrevLookup","d3_time_parseWeekday","d3_time_dayRe","d3_time_dayLookup","d3_time_parseMonthAbbrev","d3_time_monthAbbrevRe","d3_time_monthAbbrevLookup","d3_time_parseMonth","d3_time_monthRe","d3_time_monthLookup","d3_time_parseLocaleFull","d3_time_parseLocaleDate","d3_time_parseLocaleTime","X","d3_time_parseAmPm","d3_time_periodLookup","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_days","locale_shortDays","shortDays","locale_months","locale_shortMonths","shortMonths","multi","d3_time_formatMulti","d3_time_formatRe","d3_time_formatLookup","d3_time_formatPad","I","d3_time","getMilliseconds","sundayOfYear","mondayOfYear","d3_time_zone","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","d3_time_parseYear","d3_time_parseFullYear","d3_time_parseZone","d3_time_parseLiteralPercent","d3_time_numberRe","d3_time_expandYear","zs","zh","zm","d3_time_percentRe","d3_adder","d3_adderSum","bv","av","d3_geo_streamGeometry","d3_geo_streamGeometryType","d3_geo_streamLine","closed","coordinate","lineStart","lineEnd","d3_geo_streamPolygon","polygonStart","polygonEnd","d3_geo_areaRingStart","nextPoint","λ","φ","dλ","λ0","sdλ","adλ","cosφ","sinφ","sinφ0","cosφ0","d3_geo_areaRingSum","λ00","φ00","d3_geo_area","d3_geo_cartesian","spherical","d3_geo_cartesianDot","d3_geo_cartesianCross","d3_geo_cartesianAdd","d3_geo_cartesianScale","d3_geo_cartesianNormalize","d3_geo_spherical","cartesian","d3_geo_sphericalEqual","ε","d3_geo_centroidPoint","d3_geo_centroidPointXYZ","d3_geo_centroidW0","d3_geo_centroidX0","d3_geo_centroidY0","d3_geo_centroidZ0","d3_geo_centroidLineStart","z0","d3_geo_centroidW1","d3_geo_centroidX1","d3_geo_centroidY1","d3_geo_centroidZ1","d3_geo_centroid","d3_geo_centroidLineEnd","d3_geo_centroidRingStart","cx","cy","cz","d3_geo_centroidX2","d3_geo_centroidY2","d3_geo_centroidZ2","d3_geo_compose","d3_true","d3_geo_clipPolygon","segments","clipStartInside","subject","p0","d3_geo_clipPolygonIntersection","d3_geo_clipPolygonLinkCircular","isSubject","d3_geo_clip","pointVisible","clipLine","clipStart","pointLine","pointRing","ringListener","ringStart","ringEnd","ringSegments","polygon","polygonStarted","d3_geo_clipSegmentLength1","rotatedClipStart","d3_geo_pointInPolygon","d3_geo_clipSort","sphere","d3_geo_clipBufferListener","rejoin","d3_geo_clipAntimeridianLine","φ0","sλ0","λ1","φ1","sλ1","d3_geo_clipAntimeridianIntersect","cosφ1","sinλ0_λ1","d3_geo_clipAntimeridianInterpolate","meridian","parallel","meridianNormal","polarAngle","winding","point0","antimeridian","τ","arc","φarc","d3_geo_clipCircle","c0","v0","v00","point2","point1","smallRadius","notHemisphere","two","pa","pb","n1","n2","n2n2","n1n2","determinant","c1","c2","n1xn2","uu","δλ","polar","q1","d3_geo_circleInterpolate","d3_geom_clipLine","ax","ay","bx","by","d3_geo_clipExtent","comparePoints","insidePolygon","wn","linePoint","v_","x_","y_","x__","y__","v__","bufferListener","d3_geo_clipExtentMAX","listener_","inside","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","ρ","ρ0","ρ0_y","d3_geo_pathAreaRingStart","d3_geo_pathAreaPolygon","x00","y00","d3_geo_pathArea","d3_geo_pathBoundsPoint","d3_geo_pathBoundsX0","d3_geo_pathBoundsX1","d3_geo_pathBoundsY0","d3_geo_pathBoundsY1","d3_geo_pathBuffer","pointCircle","pointLineStart","stream","lineEndPolygon","d3_geo_pathBufferCircle","pointRadius","d3_geo_pathCentroidPoint","d3_geo_pathCentroidLineStart","d3_geo_pathCentroid","d3_geo_pathCentroidLineEnd","d3_geo_pathCentroidRingStart","d3_geo_pathContext","moveTo","lineTo","closePath","d3_geo_resample","resample","resampleRecursive","resampleNone","d3_geo_transformPoint","resampleLineTo","a0","b0","ringPoint","a00","b00","c00","b1","d2","δ2","φ2","λ2","dx2","dy2","dz","cosMinDistance","d3_geo_pathProjectStream","d3_geo_projectionRadians","d3_geo_transform","d3_geo_projection","projection","projectRotate","δx","δy","d3_geo_rotation","δφ","δγ","invalidate","valid","projectResample","preclip","d3_geo_clipAntimeridian","postclip","clipAngle","clipExtent","d3_geo_equirectangular","d3_geo_identityRotation","d3_geo_rotationλ","d3_geo_rotationφγ","d3_geo_forwardRotationλ","rotation","cosδφ","sinδφ","cosδγ","sinδγ","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","d3_geo_interpolate","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","d3_geo_lengthLineStart","cosΔλ","d3_geo_lengthSum","d3_geo_length","d3_geo_azimuthal","azimuthal","cosλ","sinc","cosc","d3_geo_conicConformal","d3_geo_mercator","d3_geo_conicEquidistant","d3_geo_mercatorProjection","clipAuto","d3_geo_transverseMercator","d3_geom_pointX","d3_geom_pointY","d3_geom_hullUpper","hull","hs","d3_geom_hullOrder","d3_geom_polygonInside","d3_geom_polygonIntersect","x3","x21","x43","y3","y21","y43","ua","d3_geom_polygonClosed","d3_geom_voronoiBeach","d3_geom_voronoiRedBlackNode","site","d3_geom_voronoiCreateBeach","beach","d3_geom_voronoiBeachPool","d3_geom_voronoiDetachBeach","d3_geom_voronoiDetachCircle","d3_geom_voronoiBeaches","d3_geom_voronoiRemoveBeach","N","disappearing","lArc","rArc","iArc","nArcs","d3_geom_voronoiSetEdgeEnd","d3_geom_voronoiCreateEdge","d3_geom_voronoiAttachCircle","d3_geom_voronoiAddBeach","dxl","dxr","directrix","d3_geom_voronoiLeftBreakPoint","d3_geom_voronoiRightBreakPoint","newArc","lSite","rSite","hb","hc","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","d3_geom_voronoiCell","edges","d3_geom_voronoiCloseCells","iHalfEdge","halfEdges","nHalfEdges","d3_geom_voronoiCells","iCell","prepare","d3_geom_voronoiHalfEdge","d3_geom_voronoiCreateBorderEdge","d3_geom_voronoiHalfEdgeOrder","d3_geom_voronoiCircle","cSite","ε2","ha","d3_geom_voronoiCirclePool","d3_geom_voronoiCircles","d3_geom_voronoiFirstCircle","d3_geom_voronoiClipEdges","d3_geom_voronoiEdges","d3_geom_voronoiConnectEdge","vb","fm","fb","va","lx","ly","rx","ry","fy","d3_geom_voronoiEdge","d3_geom_voronoiRedBlackTree","d3_geom_voronoiRedBlackRotateLeft","d3_geom_voronoiRedBlackRotateRight","d3_geom_voronoiRedBlackFirst","d3_geom_voronoi","sites","d3_geom_voronoiVertexOrder","diagram","d3_geom_voronoiTriangleArea","d3_geom_quadtreeCompatX","d3_geom_quadtreeCompatY","d3_geom_quadtreeNode","leaf","d3_geom_quadtreeVisit","sx","sy","d3_geom_quadtreeFind","closestPoint","minDistance2","distance2","below","d3_interpolateRgb","ag","br","bg","bb","d3_interpolateObject","d3_interpolate","d3_interpolateNumber","d3_interpolateString","am","bm","bs","bi","d3_interpolate_numberA","d3_interpolate_numberB","interpolators","d3_interpolateArray","na","nb","n0","d3_ease_clamp","d3_ease_reverse","d3_ease_reflect","d3_ease_quad","d3_ease_cubic","d3_ease_cubicInOut","d3_ease_poly","d3_ease_sin","d3_ease_exp","d3_ease_circle","d3_ease_elastic","d3_ease_back","d3_ease_bounce","d3_interpolateHcl","hcl","ah","al","bh","bl","d3_interpolateHsl","d3_interpolateLab","lab","aa","ba","d3_interpolateRound","d3_transform","r0","kx","d3_transformNormalize","kz","d3_transformDot","ky","d3_transformCombine","skew","d3_interpolateTransformPop","d3_interpolateTranslate","ta","tb","d3_interpolateRotate","ra","rb","d3_interpolateSkew","wa","wb","d3_interpolateScale","d3_interpolateTransform","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundlePath","lca","d3_layout_bundleLeastCommonAncestor","d3_layout_bundleAncestors","ancestors","aNodes","bNodes","aNode","bNode","sharedNode","d3_layout_forceDragstart","fixed","d3_layout_forceDragend","d3_layout_forceMouseover","py","d3_layout_forceMouseout","d3_layout_forceAccumulate","quad","charges","charge","pointCharge","d3_layout_hierarchyRebind","hierarchy","links","d3_layout_hierarchyLinks","d3_layout_hierarchyVisitBefore","d3_layout_hierarchyVisitAfter","nodes2","d3_layout_hierarchyChildren","d3_layout_hierarchyValue","d3_layout_hierarchySort","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","d3_layout_stackMaxIndex","d3_layout_stackReduceSum","d3_layout_stackSum","d3_layout_histogramBinSturges","d3_layout_histogramBinFixed","d3_layout_histogramRange","d3_layout_packSort","d3_layout_packInsert","_pack_next","_pack_prev","d3_layout_packSplice","d3_layout_packIntersects","dr","d3_layout_packSiblings","xMin","xMax","yMin","yMax","d3_layout_packLink","d3_layout_packPlace","isect","s1","s2","d3_layout_packUnlink","d3_layout_packTransform","db","da","dc","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treeMove","wm","wp","d3_layout_treeShift","d3_layout_treeAncestor","vim","ancestor","d3_layout_clusterY","d3_layout_clusterX","d3_layout_clusterLeft","d3_layout_clusterRight","d3_layout_treemapPadNull","d3_layout_treemapPad","d3_scaleExtent","d3_scaleRange","rangeExtent","d3_scale_bilinear","uninterpolate","d3_scale_nice","nice","i1","d3_scale_niceStep","d3_scale_niceIdentity","d3_scale_polylinear","bisect","d3_scale_linear","rescale","rangeRound","ticks","d3_scale_linearTicks","tickFormat","d3_scale_linearTickFormat","d3_scale_linearNice","d3_scale_linearRebind","d3_scale_linearTickRange","span","d3_scale_linearPrecision","d3_scale_linearFormatPrecision","d3_scale_linearFormatSignificant","d3_scale_log","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_pow","powp","d3_scale_powPow","powb","d3_scale_ordinal","ranger","rangeBand","xi","rangePoints","rangeRoundPoints","rangeBands","outerPadding","rangeRoundBands","d3_scale_quantile","quantile","quantiles","invertExtent","d3_scale_quantize","d3_scale_threshold","d3_scale_identity","d3_zero","d3_svg_arcInnerRadius","innerRadius","d3_svg_arcOuterRadius","outerRadius","d3_svg_arcStartAngle","startAngle","d3_svg_arcEndAngle","endAngle","d3_svg_arcPadAngle","padAngle","d3_svg_arcSweep","d3_svg_arcCornerTangents","rc","cw","x01","y01","cx0","cx1","dx0","dy0","dx1","dy1","d3_svg_line","tension","d3_svg_lineLinear","interpolateKey","d3_svg_lineInterpolators","d3_svg_lineLinearClosed","d3_svg_lineStep","d3_svg_lineStepBefore","d3_svg_lineStepAfter","d3_svg_lineCardinalOpen","d3_svg_lineHermite","d3_svg_lineCardinalTangents","d3_svg_lineCardinalClosed","d3_svg_lineCardinal","tangents","pi","lp","d3_svg_lineBasis","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","d3_svg_lineBasisOpen","d3_svg_lineBasisClosed","d3_svg_lineBundle","d3_svg_lineBasisBezier1","d3_svg_lineBasisBezier2","d3_svg_lineSlope","d3_svg_lineFiniteDifferences","d3_svg_lineMonotoneTangents","d3_svg_lineMonotone","d3_svg_lineRadial","d3_svg_area","points1","interpolateReverse","points0","fx0","fy0","fx1","fy1","d3_svg_chordRadius","d3_svg_diagonalProjection","d3_svg_diagonalRadialProjection","d3_svg_symbolSize","d3_svg_symbolType","d3_svg_symbolCircle","d3_selection_interruptNS","activeId","interrupt","d3_transition","d3_transitionPrototype","d3_transition_tween","d3_transition_text","d3_transitionNamespace","d3_transitionNode","elapsed","cancelId","d3_svg_axisX","d3_svg_axisY","d3_time_formatIsoNative","d3_time_scale","tickMethod","d3_time_scaleSteps","d3_time_scaleMilliseconds","d3_time_scaleDate","d3_json","d3_html","d3_document","createContextualFragment","d3_arraySlice","d3_element_prototype","Element","d3_element_setAttribute","d3_element_setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","ascending","descending","median","numbers","deviation","d3_bisect","bisectLeft","bisectRight","bisector","permute","permutes","transpose","matrix","nest","rollup","sortValues","keyValue","valuesByKey","sortKey","sortKeys","keyMap","d3_requote_re","querySelector","d3_selectMatcher","subgroup","subnode","subgroups","d3_nsPrefix","xhtml","xlink","xmlns","getAttributeNS","classed","groupData","nodeData","updateNodes","enterNodes","exitNodes","nodeByKeyValue","exit","datum","upgroup","mouse","touch","drag","mousedown","touchstart","dragstart","move","position1","dragId","position0","dragged","dragOffset","ended","dragSubject","dragName","dragRestore","correspondingElement","τε","SQRT2","interpolateZoom","ux0","uy0","w0","ux1","uy1","coshr0","mousedowned","d3_behavior_zoomWheel","mousewheeled","dblclicked","touchstarted","scaleTo","scaleExtent","translateTo","__chart__","center0","zoomstarted","zooming","zoomed","zoomended","location0","mousemove","mouseup","d3_selection_interrupt","relocate","scale0","locations0","touchmove","touchend","touchtime","distance0","l0","l1","distance1","scale1","zoomName","mousewheelTimer","translate0","d3_behavior_zoomDelta","shiftKey","d3_behavior_zoomInfinity","deltaY","deltaMode","wheelDelta","view1","d3_transitionInheritId","d3_hslPrototype","brighter","darker","d3_hclPrototype","d3_lab_K","d3_labPrototype","d3_rgbPrototype","functor","dsv","typedResponse","formatRow","reFormat","delimiterCode","parseRows","EOF","eol","EOL","formatRows","fieldSet","csv","tsv","d3_formatPrefixes","toPrecision","getUTCHours","getUTCMilliseconds","getUTCSeconds","setDate","d3_time_prototype","setUTCDate","setDay","setUTCDay","setUTCHours","setMilliseconds","setUTCMilliseconds","setMinutes","setUTCMonth","setSeconds","setUTCSeconds","sunday","d3_locale_enUS","geo","d3_adderTemp","d3_geo_streamObjectType","Feature","FeatureCollection","Sphere","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","geometries","d3_geo_areaSum","ranges","normal","equatorial","inflection","λ_","λi","φi","dλSum","λ__","φ__","compareRanges","withinRange","centroid","conicEqualArea","albers","albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","lower48Stream","alaskaStream","hawaiiStream","d3_geo_pathAreaSum","d3_geo_pathBounds","contextStream","cacheStream","projectStream","projectionMutator","equirectangular","Δλ","sinΔλ","sinφ1","graticule","X0","DX","X1","Y0","DY","Y1","outline","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","d3_geo_azimuthalEqualArea","cosλcosφ","azimuthalEqualArea","d3_geo_azimuthalEquidistant","azimuthalEquidistant","conicConformal","conicEquidistant","d3_geo_gnomonic","gnomonic","mercator","d3_geo_orthographic","orthographic","d3_geo_stereographic","stereographic","transverseMercator","geom","vertices","flippedPoints","skipLeft","skipRight","d3_geom_polygonPrototype","grandpa","uncle","voronoi","polygons","d3_geom_voronoiClipExtent","triangles","s0","delaunay","quadtree","nx","ny","insertChild","nPoint","ys","x1_","y1_","x2_","y2_","compat","visit","interpolateRgb","interpolateObject","interpolateNumber","interpolateString","interpolateArray","d3_ease_default","d3_ease","poly","cubic","elastic","bounce","d3_ease_mode","interpolateHcl","interpolateHsl","interpolateLab","interpolateRound","baseVal","consolidate","d3_transformIdentity","interpolateTransform","bundle","chord","relayout","groupSums","groupIndex","subgroupIndex","chords","sortGroups","sortSubgroups","di","dj","subindex","sortChords","resort","repulse","dw","dn","theta2","chargeDistance2","dragmove","resume","distances","strengths","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","d3_layout_forceChargeDistance2","gravity","weight","chargeDistance","theta","dimension","neighbors","candidates","childs","revalue","pie","arcs","d3_layout_pieSortByValue","series","offsets","d3_layout_stackOrders","d3_layout_stackOffsets","sums","bottom","tops","bottoms","silhouette","wiggle","s3","o0","zero","histogram","bin","valuer","binner","frequency","root0","root1","wrapTree","firstWalk","secondWalk","nodeSize","sizeNode","tx","separation","node1","midpoint","apportion","vip","vop","vom","sip","sop","sim","som","cluster","previousNode","treemap","squarify","worst","stickify","rmax","rmin","ratio","stickies","padFunction","padConstant","µ","σ","logNormal","bates","irwinHall","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","category20c","d3_category20c","quantize","circleSegment","rp","padRadius","d3_svg_arcAuto","h0","cornerRadius","rc1","rc0","oc","kc","lc","t30","t12","t03","t21","basis","cardinal","monotone","radial","curve","diagonal","projection_","d3_svg_symbols","cross","diamond","d3_svg_symbolTan30","square","d3_svg_symbolSqrt3","symbolTypes","d3_transitionId","d3_transitionInherit","subnodes","nameNS","attrTween","attrTweenNS","styleString","styleTween","inheritId","id0","id1","tickTransform","tickValues","tickArguments_","tickFormat_","tickEnter","tickExit","tickUpdate","tickSpacing","innerTickSize","tickPadding","pathUpdate","lineEnter","lineUpdate","textEnter","textUpdate","orient","outerTickSize","d3_svg_axisDefaultOrient","d3_svg_axisOrients","tickSize","tickSubdivide","brush","brushstart","resizes","d3_svg_brushCursor","gUpdate","backgroundUpdate","redrawX","redrawY","redraw","xExtent","yExtent","keydown","dragging","keyup","brushmove","altKey","resizingX","move1","resizingY","event_","yClamp","xClamp","yExtentDomain","xExtentDomain","brushend","eventTarget","resizing","ex","ey","d3_svg_brushResizes","extent1","extent0","yi","nw","se","d3_time_formatUtc","d3_time_formatIso","timezone","d3_time_scaleLocalMethods","d3_time_scaleLocalFormat","d3_time_scaleUtcMethods","d3_time_scaleUtcFormat","responseXML","Geolocate","Attribution","Popup","GeoJSONSource","VideoSource","ImageSource","Style","MapboxGLFunction","parameters","isFunctionDefinition","unbundle","validateEnum","validateFilter","filter_operator","geometry_type","isUnloaded","buckets","unserializeBuckets","getLayer","FeatureIndex","vt","Protobuf","GeoJSONFeature","CollisionTile","CollisionBoxArray","SymbolInstancesArray","SymbolQuadsArray","loadVectorData","collisionBoxArray","collisionTile","symbolInstancesArray","symbolQuadsArray","rawTileData","reloadSymbolData","setCollisionTile","unloadVectorData","redoingPlacement","redoWhenDone","dispatcher","pitch","showCollisionBoxes","workerID","getBucket","vtLayers","layers","_geojsonTileLayer","geojsonFeature","geojsonVtOptions","tolerance","superclusterOptions","clusterMaxZoom","clusterRadius","Source","urlResolve","_dirty","isTileClipped","_loaded","_updateData","getVisibleCoordinates","queryRenderedFeatures","loop","_rerender","play","setCoordinates","cornerZ0Coords","centerCoord","tileCoords","texSubImage2D","UNSIGNED_BYTE","createTexture","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_MAG_FILTER","texImage2D","_currentTime","Transform","_minZoom","_maxZoom","_center","_altitude","_pitch","_unmodified","interp","glmatrix","_calcMatrices","rotationMatrix","altitude","_zoom","zoomScale","tileZoom","zoomFraction","_constrain","pixelsToGLUnits","scaleZoom","lnglat","worldSize","lngX","latY","xLng","yLat","panBy","pointLocation","setLocationAtPoint","coordAtPoint","coordCenter","coordinateLocation","locationPoint","coordinatePoint","ll","coord0","coord1","transformMat4","pixelMatrixInverse","z1","pixelMatrix","projMatrix","_constraining","unmodified","halfFov","topHalfSurfaceDistance","farZ","perspective","rotateX","rotateZ","doccy","minDoc","topLevel","HeatmapTexture","_ref1","channels","chancount","LUMINANCE_ALPHA","deleteTexture","nearest","NEAREST","clampToEdge","isDisposable","FILE","TEXT","amountColumnState","Observable","fromPromise","query_params","amount_column_state","getAsyncJobs","jobId","asyncJobsURL","fromNodeCallback","observableStream","STOP_STATES","STATES","QUEUED","exportCurrentFilter","getJobPollSteam","job_id","POLL_INTERVAL","_superagent2","_superagent","FAILED","FINISHED","exportCurrentFilterWithJobPoll","_reactDom","_scrollSpy","_scrollSpy2","_scroller","_scroller2","_scrollHash","_scrollHash2","protoTypes","activeClass","spy","oneOfType","isDynamic","onSetActive","onSetInactive","ignoreCancelEvents","hashSpy","customScroller","scroller","_React$PureComponent","_initialiseProps","scrollSpyContainer","getScrollSpyContainer","isMounted","mount","mapContainer","addSpyHandler","spyHandler","setState","stateHandler","PureComponent","isInitialized","elemTopBound","elemBottomBound","containerTop","cords","isInside","isOutside","activeLink","changeHash","_passiveEventListeners","eventThrottler","eventHandler","scrollSpy","spyCallbacks","spySetState","scrollSpyContainers","scrollHandler","addPassiveEventListener","currentPositionY","supportPageOffset","isCSS1Compat","compatMode","addStateHandler","updateStates","supportsPassiveOption","passive","removePassiveEventListener","scrollEvent","evtName","paramsText","keyOrValue","stringifyParameters","storeRoute","trackPageview","getHistory","lastHistoryParams","parseParameters","backEnabled","resetEnabled","currentState","lastHistory","StoriesSidebarContent","ControlPanelSidebarContent","ReportsSidebarContent","_report_config_buttons2","_report_config_buttons","_entity_logo2","_entity_logo","_report_list2","_report_list","_toggle_panel2","_toggle_panel","_story_list2","_story_list","SidebarTab","activeReport","isControlPanel","embedded","isNetwork","isEditingDefaultState","disableEditDefaultState","reportError","stories","selectedStoryId","handleSelectReports","handleSelectStories","Sidebar","hasStories","marginBottom","activeSidebar","TEXT_DECORATION_LINE","TEXT_DECORATION","TEXT_DECORATION_STYLE","SOLID","DOUBLE","DOTTED","DASHED","WAVY","UNDERLINE","OVERLINE","LINE_THROUGH","BLINK","parseLine","parseTextDecorationLine","parseTextDecorationStyle","textDecorationLine","textDecorationColor","textDecorationStyle","BORDER_SIDES","BORDER_STYLE","SIDES","parseBorderStyle","side","borderColor","borderStyle","_TextBounds","TextContainer","parseTextBounds","CAPITALIZE","TEXT_TRANSFORM","LOWERCASE","UPPERCASE","_machina2","_machina","BaseReportFlow","Fsm","ledgerDataSets","getStateComponent","_component","loadLedgerDataSets","coa_id","loadTransactionDataSets","_wizard_step_mixin2","_wizard_step_mixin","Start","wksExt","$Symbol","buggy","$expm1","expm1","$iterCreate","BUGGY","DEFAULT","IS_SET","IteratorPrototype","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","searchString","$defineProperty","getIteratorMethod","endPos","addToUnscopables","iterated","_k","Arguments","regexpFlags","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","reCopy","channel","port","cel","setTask","clearTask","MessageChannel","Dispatch","counter","port2","port1","onmessage","postMessage","importScripts","macrotask","Observer","WebKitMutationObserver","characterData","task","PromiseCapability","$$resolve","$$reject","packIEEE754","mLen","nBytes","eLen","eMax","eBias","rt","unpackIEEE754","nBits","unpackI32","packI8","packI16","packI32","packF64","packF32","PROTOTYPE","isLittleEndian","numIndex","intIndex","$LENGTH","WRONG_INDEX","$BUFFER","_b","$OFFSET","conversion","BaseBuffer","ArrayBufferProto","$setInt8","setInt8","getInt8","setUint8","bufferLength","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","fiscal_year_start_date_formatted","getRole","processors","addPostProcessor","translator","processor","convertInterpolation","unescapeSuffix","interpolationPrefix","interpolationSuffix","escapeInterpolation","nestingPrefix","reusePrefix","nestingSuffix","reuseSuffix","convertAPIOptions","resStore","defaultNs","fallbackToDefaultNS","fallbackNS","saveMissing","sendMissing","saveMissingTo","sendMissingTo","returnNull","fallbackOnNull","returnEmptyString","fallbackOnEmpty","returnObjectTrees","joinArrays","returnedObjectHandler","objectTreeKeyHandler","parseMissingKeyHandler","parseMissingKey","appendNamespaceToMissingKey","nsSeparator","nsseparator","keySeparator","keyseparator","shortcutFunction","overloadTranslationOptionHandler","postProcess","lngWhitelist","preload","backend","loadPath","resGetPath","addPath","resPostPath","allowMultiLoading","dynamicLoad","expirationTime","useLocalStorage","defaultVariables","convertJSONOptions","convertTOptions","appendBackwardsAPI","_logger2","services","languageUtils","toResolveHierarchy","loadLanguages","setLng","fixLng","fc","_logger","_Route","arrayToObject","il","kl","decode","refs","lookup","compacted","ensureSlash","onHashChange","curActionType","_actionType","throwCannotModify","updateScrollPosition","checkPropTypes","createRouteOptions","willTransitionTo","willTransitionFrom","createRouteFromReactElement","Children","hasProperties","hasMatch","prevParams","nextParams","prevQuery","nextQuery","addRoutesToNamedRoutes","namedRoutes","routeIsActive","activeRoutes","routeName","paramsAreActive","activeParams","queryIsActive","activeQuery","createRouter","isReactChildren","mountedComponents","DEFAULT_LOCATION","scrollBehavior","DEFAULT_SCROLL_BEHAVIOR","pendingTransition","dispatchHandler","needsDOM","supportsHistory","createReactClass","statics","isRunning","cancelPendingTransition","clearAllRoutes","addRoutes","replaceRoutes","refresh","Match","findMatch","makePath","makeHref","transitionTo","handleAbort","onAbort","abortReason","Cancellation","handleError","handleLocationChange","prevPath","isRefreshing","recordScrollPosition","fromRoutes","toRoutes","prevRoutes","nextRoutes","Transition","fromComponents","getLocation","getScrollBehavior","getCurrentPathname","getCurrentRoutes","isActive","ScrollHistory","getChildContext","storeDidUpdate","stores","ProcessEmitWarning","checkListener","_getMaxListeners","_maxListeners","defaultMaxListeners","_addListener","_eventsCount","newListener","emitter","onceWrapper","wrapFn","_onceWrap","evlistener","unwrapListeners","arrayClone","listenerCount","spliceOne","eventListener","errorListener","ReflectOwnKeys","ReflectApply","NumberIsNaN","setMaxListeners","getMaxListeners","doError","er","originalListener","rawListeners","eventNames","Flux","_newEntity","getEntities","getEntitiesLoading","_entitiesLoading","getEntitiesLoadingFailed","_entitiesLoadingFailed","_entityTypes","_countries","_states","_selectedCountry","_groups","_all","display_name","serverValidationErrors","__webpack_amd_options__","moment","symbolMap","numberMap","pluralForm","plurals","pluralize","weekdaysParseExact","70","80","50","100","60","90","plural","forms","relativeTimeWithPlural","lastDigit","last2Digits","relativeTimeWithMutation","mutation","specialMutationForYears","lastNumber","softMutation","mutationTable","monthsParseExact","lll","llll","shortMonthsParse","longMonthsParse","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","_calendarEl","monthsShortDot","monthsStrictRegex","monthsShortStrictRegex","verbalNumber","numbersFuture","numbersPast","monthsShortWithDots","monthsShortWithoutDots","weekEndings","0","40","isUpper","processFutureTime","eifelerRegelAppliesToNumber","processPastTime","firstDigit","translateSeconds","translateSingular","relativeTimeWithSingular","relativeSeconds","correctGrammaticalCase","wordKey","relativeTimeMr","monthsNominative","monthsSubjective","translateFuture","translatePast","numberNoun","numberAsNoun","hundred","ten","numbersNouns","weekdaysCaseReplace","processHoursFunction","selectionModes","yearsPerPage","minSelectionMode","onDateSelected","initMoment","selectionMode","selectedMoment","visibleMoment","getDays","currentMoment","firstDay","firstDayOffset","momentCursor","isBeforeMonth","isAfterMonth","new","getMonths","getYears","getYearRange","ypp","handleNext","handlePrev","handleNavigateDownMode","handleNavigateUpMode","_navigateVisibleMomentForward","isforward","selMode","_incrementSelectionMode","modeUp","_decrementSelectionMode","minMode","curMode","handleMinModeReached","getHeaderText","headerText","renderDOWHeader","renderYears","renderMonths","renderDays","colSpan","handleContentClick","handleDocumentClick","opening","componentWillMount","removeTimeout","timeouts","intervals","_chainFunction","_chainFunction2","_warning","_ChildMapping","childFactory","performAppear","currentlyTransitioningKeys","componentWillAppear","_handleDoneAppearing","componentDidAppear","currentChildMapping","getChildMapping","performLeave","performEnter","componentWillEnter","_handleDoneEntering","componentDidEnter","componentWillLeave","_handleDoneLeaving","componentDidLeave","keysToEnter","newChildren","childRefs","keysToLeave","initialChildMapping","nextChildMapping","prevChildMapping","mergeChildMappings","hasPrev","hasNext","componentDidUpdate","_this3","childrenToRender","isCallbackRef","factoryChild","cloneElement","transitionLeave","transitionName","transitionAppear","transitionEnter","transitionAppearTimeout","transitionTimeout","transitionType","timeoutPropName","enabledPropName","nameShape","shape","leave","enterActive","leaveActive","appear","appearActive","_gl_data_set2","_gl_data_set","dataSetId","sortFields","aval","bval","getChartOfAccountsIds","_chart_of_account2","_chart_of_account","chart_of_accounts","filterWithDataSets","coa","BreakdownModel","isAccountType","getTree","findTree","BreakdownCollection","sort_key","filterByValidAggregations","suppressHidden","valid_aggregations","aggregation","mapTreeId","findDefault","deptBreakdown","_recoverable_error2","_recoverable_error","_breakdown2","_breakdown","_saved_view_actions2","_saved_view_actions","legendLimit","legendLimitStep","vsGraphType","showAnnotations","stateAliases","recoverableErrorModal","triggerRenderData","pausedRendering","pauseRendering","resumeRendering","selectionChange","ledger_types","setVisibleAccounts","initSelectionState","resetMore","triggerSelectionChange","getLeafAccountCodeTreeMap","selectedLeafCodesByTree","initSorts","treeSorts","getTreeSort","setTreeSort","sortMethod","sortTree","legendExpanded","limitRenderedData","legendSortMethods","moreLine","moreLines","childless","average","collapseMore","colorAssigner","assignNextColor","isTable","sublines","holder","recursiveExpander","lastExpanded","expandedLines","changeProduct","loadSelection","defaultSelectionState","_runtime","_runtime2","registerHelper","asset","assetPath","data_id","placeHolderDiv","SafeString","isLast","isOdd","HandlebarsEnvironment","helpers","decorators","_helpers","registerDefaultHelpers","_decorators","registerDefaultDecorators","_exception","_exception2","COMPILER_REVISION","REVISION_CHANGES","unregisterHelper","registerPartial","unregisterPartial","registerDecorator","unregisterDecorator","conversions","mapStateToCircleColor","colorProperty","stops","colorForPoint","layerMapper","LayerMapperMap","_LayerMapperMap","_MapTypes$Bubble$conf","DateRange","_byString","hollaback","exclusive","_byRange","INTERVALS","overlaps","within","sessionId","InvitesStore","inviteeSearchQuery","currentInvitedUsers","currentUser","invitableUsersById","invitedUsers","messageUsers","reportRoles","userReportRoles","pendingUser","activePanel","isNotificationOpen","isLoadingUsers","reportOwner","INVITABLE_USERS_LOADED","usersById","initialMessageUsers","isCurrentUserOwner","INVITED_USERS_LOADED","REPORT_ROLES_LOADED","REPORT_INVITE_ROLE_UPDATED","REPORT_ADD_USER_ERROR","REPORT_UPDATE_ROLE_ERROR","REPORT_INVITE_DISMISS_ERROR","UPDATE_INVITEE_SEARCH_QUERY","SET_USER_PREFERENCES","ADD_USER_TO_MESSAGE_USERS","ADD_ALL_USERS_TO_MESSAGE_USERS","REMOVE_USER_FROM_MESSAGE_USERS","ADDING_USER_TO_INVITES","ADD_USER_TO_INVITES","REMOVE_USER_FROM_INVITES","eachUser","REPORT_HEADER_SET_SHARE_PANEL","REPORT_SHARE_UPDATE_MESSAGE","REPORT_SHARE_SHOW_SENDING","REPORT_SHARE_HIDE_SENDING","REPORT_SHARE_RESET","REPORT_SHARE_OPEN_NOTIFICATION","REPORT_SHARE_CLOSE_NOTIFICATION","SAVED_VIEW_CREATE_SUCCESS","openNotification","getSearchResults","userArray","filterItems","getInviteError","getReportRoles","getPendingUser","getInvitedUsers","getCurrentInvitedUsers","getCurrentUser","getIsLoadingUsers","getIsSendingMessage","getIsNotificationOpen","vizColorValueOrder","300","400","500","600","vizColorHueOrder","vizColor_hoverOpacity","vizColor_hoverfilter","vizColors","pear","200","700","800","900","1000","highlight","nextHue","sage","jade","cerulean","opengov","periwinkle","royal","rose","ruby","terracotta","getUpdatedKeywords","concatKeywords","spliceKeywords","updateStateKeywords","deletedKeywords","keyword","assignedKeywords","addedKeywordsReportState","deletedKeywordsReportState","updatedKeywords","keywords","_src","_ldclientJs","base64","base64URLEncode","onNextTick","wrapPromiseCallback","transformValuesToVersionedValues","chunkUserEventsForUrl","getLDUserAgentString","addLDHeaders","EventSender","serverTime","sendEvents","MAX_URL_LENGTH","EventSummarizer","summarizeEvent","variation","creationDate","getSummary","counters","unknown","startDate","endDate","clearSummary","UserFilter","allAttributesPrivate","all_attributes_private","privateAttributeNames","private_attribute_names","anonymous","secondary","ip","firstName","lastName","avatar","filterUser","privateAttrs","createCustomError","isHttpErrorRecoverable","EventProcessor","maybeReportError","LDInvalidArgumentError","inlineUsersInEvents","samplingInterval","flushInterval","isNan","enqueue","trackEvents","debugEventsUntilDate","userKey","LDUnexpectedResponseError","httpErrorMessage","doesUrlMatch","escapeStringRegexp","findGoalsForClick","GoalTracker","Store","getUser","loadFlags","localStorage","getItem","localStorageUnavailable","clearFlags","$schema","saveFlags","setItem","removeItem","Stream","connect","EventSource","disconnect","isConnected","OPEN","CONNECTING","fetchJSON","getResponseError","LDInvalidEnvironmentIdError","environmentNotFound","Requestor","fetchFlagSettings","fetchGoals","sanitizeUser","Identity","doNotTrack","msDoNotTrack","flagVersion","deleted","ping","LDFlagFetchError","errorFetchingFlags","changeEvent","baseUrl","eventsUrl","streamUrl","allowFrequentDuplicateEvents","sendEventsOnlyForVariation","useReport","eventProcessor","bootstrap","environmentNotSpecified","LDInvalidUserError","invalidUser","userNotSpecified","readyEvent","locationWatcherInterval","goalsEvent","editorClientBaseUrl","editorClientUrl","waitUntilReady","waitUntilGoalsReady","track","unknownCustomEventKey","LDInvalidEventKeyError","allFlags","deprecatedInitialize","atob","docLink","matchOperatorsRe","annotateSlickgridColumns","cssClass","griddle","gridOptions","defaultGridOptions","Slick","Grid","GridPrototype","enableColumnReorder","multiColumnSort","syncColumnCellResize","enableAddRow","enableCellNavigation","asyncEditorLoading","autoEdit","forceSyncScrolling","rowHeight","defaultMinWidth","cellPadding","characterWidth","autoWidth","sendVisibleFieldsOnly","_slickEvents","requiredColumns","setAllColumns","registerPlugin","AutoTooltips","enableForHeaderCells","DocumentTouch","setSelectionModel","onSelectedRangesChanged","setSelectedRanges","getSelectedRanges","CellSelectionModel","CellExternalCopyManager","onSort","subscribe","handleSort","onColumnsReordered","handleColumnsReordered","onColumnsResized","handleColumnsResized","handleDataLoaded","handleQueryChange","handleBodyClicked","handleSelectedRowsChanged","handleDropdownOpened","setColumns","getVisibleColumns","getContainerNode","deselectRows","currentDropdown","handleViewportChanged","vp","getViewport","cols","sortCols","sortCol","sortColumn","getAllColumns","rowData","firstRow","computeColumnWidths","uploadColumnIndex","__gdapi_upload_id","newColumns","getDataLength","scrollRowIntoView","setSortColumns","getSort","sortAsc","fixedColumns","getColumnIndex","adjustHeader","previousWidth","viewport","scrollbarWidth","lastColumn","autosizeColumns","getSelectedRows","setSelectedRows","metaData","columnsByVisibility","auxColumns","invisibleColumns","invisible","setColumnVisibility","applyColumnVisibility","toggleColumnVisibility","toggleAllColumnVisibility","unordered","slickName","_cleanData","widget","fullName","existingConstructor","basePrototype","proxiedPrototype","Widget","_createWidget","_proto","_childConstructors","_super","_superApply","__super","__superApply","widgetEventPrefix","widgetName","widgetFullName","childPrototype","bridge","inputIndex","inputLength","isMethodCall","methodValue","defaultElement","eventNamespace","_getCreateOptions","bindings","hoverable","focusable","_on","_create","_trigger","_getCreateEventData","_destroy","curOption","_setOptions","_setOption","suppressDisabledCheck","delegateElement","handlerProxy","_off","_delay","_hoverable","_focusable","focusout","defaultEffect","effect","hasOptions","effectName","effects","HeaderMenu","filterBlanks","_bootstrapDatepicker2","_bootstrapDatepicker","currentColumn","$menu","$activeHeaderColumn","handleOkClick","handleClearClick","getQuery","handleClearInputClick","updateQueryState","buttonFactory","handleHeaderCellRendered","handleBeforeHeaderCellDestroy","handleQueryChanged","updateFilterIndicators","$button","showMenu","updateColumnFilterIndicator","handleMenuClick","beginUpdate","endUpdate","pastFilter","pastOperator","from_val","to_val","hasFilters","createMenu","$menuButton","queryBackup","isAlreadyOpened","showSortAsc","showSortDesc","sorting","showBlankFilter","showNonBlankFilter","blankFiltered","cleanupElements","inputs","viewMode","changeMonth","changeYear","viewPeriod","setValue","place","picker","compoment","Datepicker","DPGlobal","isInput","minViewMode","startViewMode","weekStart","weekEnd","onRender","fillDow","fillMonths","showMode","outerHeight","enM","localeFormated","applyDateStringtoInput","newDate","viewDate","dowCnt","daysMin","prevMonth","nextMonth","clsName","prevY","prevM","currentYear","yearCont","modes","navFnc","navStep","daysShort","headTemplate","contTemplate","footTemplate","_header2","Header","headerOptions","_social_networking2","_social_networking","showTos","Footer","entityNameCapitalized","entityHashtag","entityUrl","_autolinker2","_autolinker","ReportDescription","dangerouslySetInnerHTML","__html","removedIsInitialSSR","I18n","i18nOptions","initialI18nStore","resourceStore","initialLanguage","isInitialSSR","hasResourceBundle","i18nLoadedAt","getI18nTranslate","onI18nChanged","mounted","loadNamespaces","_this4","ReportUpdatedInfo","ReportHeaderRowCount","estimate","adj","countText","noResults","reachedLimit","lessThanLimit","ErrorContainer","PanelData","PanelHeader","panelType","getVisibilityPanelClass","getFooterClass","_highcharts2","_highcharts","_treemap2","_treemap","_exporting2","_exporting","_highchartsPatternFill2","_highchartsPatternFill","createSVGRect","opera","J","deg2rad","hasBidiBug","hasTouch","TouchEvent","isMS","isWebKit","isFirefox","isChrome","isSafari","isTouchDevice","SVG_NS","chartCount","seriesTypes","symbolSizes","marginNames","charts","dateFormats","encodeURI","dSetter","toD","curAnim","initPath","startX","endX","isArea","fillSetter","strokeSetter","tweenTo","Fx","pInt","isDOMElement","erase","splat","syncTimeout","extendClass","relativeLength","numberFormatter","decimalPoint","thousandsSep","getMagnitude","Q","normalizeTickInterval","stableSort","safeI","destroyObjectProperties","discardElement","garbageBin","correctFloat","setAnimation","renderer","globalAnimation","chart","animObject","V","easeInOutSine","getStyle","ia","parentElement","objectEach","ja","addEvent","addEventListenerPolyfill","protoEvents","hcEvents","runTrackerClick","ea","removeEventListenerPolyfill","fireEvent","initEvent","pathArray","la","seriesType","fa","plotOptions","pointClass","uniqueKey","ma","useSerialIds","getOptions","highcharts","getNestedProperty","parsers","brighten","setOpacity","symbolCustomAttribs","_defaultGetter","_defaultSetter","parentGroup","parentInverted","inverted","textStr","buildText","added","handleZ","zIndexSetter","afterSetters","doTransform","updateTransform","alignedObjects","alignOptions","alignByTranslate","alignTo","verticalAlign","placed","alignAttr","alignSetter","alignValue","msHidden","webkitHidden","applyTextOutline","getContrast","fakeTS","ySetter","xSetter","removeTextOutline","stroke","symbolName","symbolAttr","styledMode","shadows","updateShadows","crisp","strokeWidth","complexColor","radialGradient","linearGradient","gradients","radialReference","gradientUnits","getRadialAttr","defs","radAttr","gradient","textWidth","forExport","textOutline","dashstyleSetter","isSVG","onclick","onmouseout","onmouseover","onmousemove","clipPath","safeRemoveChild","destroyShadows","destroyTextPath","textPathWrapper","pathToSegments","getBBox","cacheKeys","textOverflow","htmlGetBBox","ontouchstart","ontouchend","opacitySetter","setRadialReference","setTextPath","textAnchor","startOffset","shadow","oldShadowOptions","cutHeight","hasStroke","symbols","textSetter","textPxLength","titleSetter","toFront","translateX","translateY","scaleX","scaleY","rotationOriginX","rotationOriginY","visibilitySetter","xGetter","yGetter","matrixSetter","rotationOriginXSetter","rotationOriginYSetter","rotationSetter","scaleXSetter","scaleYSetter","translateXSetter","translateYSetter","verticalAlignSetter","SVGElement","__extends","anchorX","anchorY","baseline","symbolKey","bBox","emptyBBox","baselineOffset","needsBox","deferredAttr","alignFactor","xSetting","anchorXSetter","boxAttr","getCrispAdjust","anchorYSetter","ySetting","textProps","updateBoxSize","updateTextPadding","heightSetter","heightSetting","paddingSetter","paddingLeftSetter","rSetter","textAlign","widthSetting","fontMetrics","hasBoxWidthChanged","widthSetter","imgCount","chartIndex","boxWrapper","allowHTML","unSubPixelFix","fontFamily","setStyle","getSubStringLength","getSpanWidth","actualWidth","lineHeight","whiteSpace","textCache","crispLine","innerR","rGetter","preserveAspectRatio","imgwidth","imgheight","isImg","hasLoaded","clipRect","rotCorr","draw","triangle","longArc","clockwise","callout","SVGRenderer","Renderer","htmlCss","htmlUpdateTransform","offsetLeft","marginLeft","marginTop","invertChild","oldTextWidth","cTT","oldRotation","oldAlign","setSpanRotation","getSpanCorrection","xCorr","yCorr","alignOnAdd","getTransformKey","transformOrigin","addedSetters","pointerEvents","classSetter","isNewLabel","tickmarkOffset","addLabel","logarithmic","labels","tickPositions","tickInterval","resolveDTLFormat","dateTimeLabelFormats","higherRanks","unitName","main","formatCtx","dateTimeLabelFormat","tickPositionInfo","lin2log","labelFormatter","shortenLabel","getSlotWidth","_addedPlotLB","isXAxis","moveLabel","movedLabel","createLabel","useHTML","labelGroup","getPosition","oldChartHeight","chartHeight","transB","opposite","oldChartWidth","chartWidth","getLabelPosition","transA","isLinked","linkedParent","reversed","staggerLines","tickRotCorr","reserveSpaceDefault","labelOffset","labelAlign","getLabelSize","horiz","getMarkPath","handleOverflow","spacing","labelLeft","labelRight","isRadial","autoRotation","labelPos","renderGridLine","renderMark","renderLabel","gridLine","dashstyle","gridGroup","getPlotLinePath","lineWidth","mark","axisGroup","showFirstLabel","showLastLabel","replaceMovedLabel","Tick","variableTimezone","useUTC","timezoneOffsetFunction","timezoneOffset","makeTime","tz","shortWeekdays","getTimeTicks","unitRange","totalRange","Time","numericSymbols","resetZoom","resetZoomTitle","colorCount","defaultSeriesType","ignoreHiddenSeries","resetZoomButton","theme","plotBorderColor","widthAdjust","subtitle","alignColumns","navigation","activeColor","inactiveColor","itemStyle","itemHoverStyle","itemHiddenStyle","itemCheckboxStyle","squareSymbol","symbolPadding","labelStyle","footerFormat","snap","headerFormat","pointFormat","credits","zoomEnabled","userOptions","translationSlope","tickAmount","positiveValuesOnly","pointRangePadding","pointRange","plotLinesAndBandsGroups","plotLinesAndBands","paddedTicks","overlap","oldMin","oldMax","minPixelPadding","minorTicks","minorTickInterval","maxLabelLength","labelEdge","hasVisibleSeries","hasNames","coll","closestPointRange","alternateBands","isX","isZAxis","defaultLabelFormatter","allowNegativeLog","linkedTo","minRange","userMinRange","crosshair","crosshairs","axes","labelRotation","defaultYAxisOptions","defaultTopAxisOptions","defaultRightAxisOptions","defaultBottomAxisOptions","defaultLeftAxisOptions","numericSymbolMagnitude","getSeriesExtremes","dataMin","softThreshold","stacking","buildStacks","xData","getXExtremes","applyExtremes","oldTransA","isOrdinal","brokenAxis","hasBreaks","lin2val","sector","val2lin","toPixels","toValue","translatedValue","acrossPanes","getLinearTickPositions","single","getMinorTickInterval","getMinorTickPositions","getLogTickPositions","normalizeTimeTickInterval","startOfWeek","trimTicks","adjustForMinRange","xIncrement","log2lin","getClosest","noSharedTooltip","nameToX","requireSorting","uniqueNames","autoIncrement","updateNames","isDirtyData","generatePoints","setAxisTranslation","axisPointRange","minPointOffset","pointPlacement","slope","staticScale","minFromRange","setTickInterval","maxPadding","minPadding","tickPixelInterval","getTickAmount","userMin","userMax","getExtremes","beforePadding","usePercentage","softMin","softMax","ceiling","minTickInterval","allowDecimals","unsquish","setTickPositions","tickPositioner","hasVerticalPanning","startOnTick","endOnTick","tickmarkPlacement","adjustTickAmount","alignToOthers","alignTicks","pane","finalTickAmt","oldAxisLength","setAxisSize","forceRedraw","oldUserMin","oldUserMax","resetStacks","cleanStacks","panningState","setExtremes","kdTree","eventArgs","newMin","newMax","allowZoomOutside","displayBtn","plotWidth","plotHeight","plotTop","plotLeft","getThreshold","autoLabelAlign","labelMetrics","MAX_VALUE","autoRotationLimit","slotWidth","renderUnsquish","specificTextOverflow","showEmpty","addTitle","axisTitle","generateTick","getOffset","axisOffset","clipOffset","axisParent","showAxis","gridZIndex","reserveSpace","titleOffset","renderLine","axisTitleMargin","getMaxLabelDimensions","maxLabelDimensions","axisLine","getLinePath","lineColor","getTitlePosition","titlePosition","renderMinorTick","hasRendered","renderTick","stackLabels","alternateGridColor","PlotLineOrBand","plotLines","plotBands","addPlotBandOrLine","isPlaced","renderStackTotals","getKeepProps","keepProps","keepEvents","drawCrosshair","crosshairPos","plotX","plotY","chartX","chartY","stackY","isCrosshair","hideCrosshair","dashStyle","panning","indentation","minorTickLength","minorTickPosition","tickLength","tickPosition","minorGridLineColor","minorGridLineWidth","minorTickColor","gridLineColor","tickColor","allowOverlap","crop","gridLineWidth","Axis","AdditionsClass","minorAutoInterval","svgElem","getPlotBandPath","eventsAdded","getLabelText","xBounds","yBounds","addPlotBand","addPlotLine","removePlotBandOrLine","removePlotBand","removePlotLine","isSticky","outside","applyFilter","stdDeviation","bodyFormatter","tooltipOptions","tooltipFormatter","cleanSplit","tt","defaultFormatter","tooltipFooterHeaderFormatter","hideTimer","tooltipTimeout","getAnchor","pointer","followPointer","tooltipPos","plotLow","plotHigh","getDateFormat","getLabel","stickOnContact","inContact","hoverSeries","onMouseOut","getChartPosition","containerScaling","ttBelow","getXDateFormat","hideDelay","scrollablePixelsX","scrollablePixelsY","isStickyOnContact","drawTracker","getLabelConfig","applyInactiveState","renderSplit","spacingBox","colorIndex","updatePosition","scrollingContainer","positioner","isHeader","boxWidth","rank","distribute","tracker","hoverPoint","styledModeFormat","xDateFormat","isFooter","labelConfig","tooltipDateKeys","Tooltip","lastValidTouch","pinchDown","runChartClick","hasDragged","unbindContainerMouseLeave","linkedSeries","navigatorSeries","inactiveOtherPoints","setAllPointsToState","unDocMouseMove","unbindDocumentMouseUp","unbindDocumentTouchEnd","zoomHor","zoomVert","selectionMarker","mouseDownX","mouseDownY","panKey","isInsidePlot","hasCartesianSeries","zoomX","zoomY","selectionMarkerFill","pan","dragStart","mouseIsDown","cancelClick","hasPinched","scaleGroups","_cursor","findNearestKDPoint","findNearestPointBy","searchPoint","distX","getChartCoordinatesFromPoint","shapeArgs","chartPosition","getCoordinates","getHoverData","stickyTracking","directTouch","enableMouseTracking","isBoosting","getPoint","hoverPoints","getPointFromEvent","onTrackerMouseOut","isDirectTouch","inClass","followTouchMove","setDOMEvents","onContainerClick","firePointEvent","onContainerMouseDown","onContainerMouseMove","zoomOption","onContainerMouseLeave","hoverChartIndex","setHoverChartIndex","openMenu","runPointActions","onDocumentTouchEnd","onContainerTouchMove","onContainerTouchStart","onDocumentMouseMove","onDocumentMouseUp","pinch","hasZoom","initiated","plotBox","pinchTranslate","pinchTranslateDirection","isCartesian","hoverX","onMouseOver","getPlotBox","markerGroup","dataLabelsGroup","clipBox","onmousedown","zoomType","pinchType","Pointer","pointerType","MSPOINTER_TYPE_TOUCH","PointerEvent","batchMSEvents","onContainerPointerDown","onContainerPointerMove","onDocumentPointerUp","pointerId","allItems","contentGroup","maxLegendWidth","maxItemWidth","legendWidth","legendHeight","lastLineHeight","lastItemY","itemY","itemX","itemMarginTop","itemMarginBottom","itemHeight","initialItemY","pages","proximate","scrollGroup","widthOption","totalItemWidth","titleHeight","symbolWidth","symbolHeight","positionCheckboxes","unchartrender","proximatePositions","positionItems","isDirtyLegend","isDirtyBox","colorizeItem","legendGroup","legendItem","legendLine","legendSymbol","isMarker","pointAttribs","positionItem","isResizing","rtl","_legendItemPos","destroyItem","getAllItems","clipHeight","checkboxOffset","renderTitle","setText","labelFormat","renderItem","itemDistance","drawLegendSymbol","createCheckboxForItem","showCheckbox","setItemEvents","itemWidth","legendItemWidth","legendItemHeight","layoutItem","showInLegend","legendItems","legendType","getAlignment","adjustMargins","legendIndex","maxHeight","arrowSize","nav","currentPage","fullHeight","pageIx","scroll","pager","upTracker","downTracker","bubbleLegend","Legend","symbolCounter","pointCount","labelCollectors","colorCounter","getArgs","showAxes","firstRender","initSeries","missingModuleFor","setSeriesData","getSeriesOrderByLinks","enabledDataSorting","orderSeries","setResponsive","temporaryDisplay","layOutTitles","updateTotals","getStacks","getMargins","extKey","drawChartBox","getAxes","getSelectedPoints","getPointsCollection","selectedStaging","getSelectedSeries","setTitle","applyDescription","isStock","getChartSize","containerWidth","containerHeight","hcOrigStyle","hcOrigDetached","hcOricDetached","setClassName","getContainer","skipClone","exporting","resetMargins","getAxisMargins","colorAxis","setChartSize","reflow","isPrinting","reflowTimeout","setReflow","unbindReflow","plotSizeX","plotSizeY","plotBorderWidth","skipAxes","chartBackground","plotBackground","plotBorder","plotBGImage","plotBackgroundColor","plotBackgroundImage","plotShadow","propFromSeries","linkSeries","setDataSortingOptions","renderSeries","renderLabels","seriesGroup","addCredits","updateContainerScaling","mapCredits","isReadyToRender","MSPointerEvent","callbacks","Chart","scrollablePlotArea","minHeight","setUpScrolling","applyFixed","fixedDiv","WebkitOverflowScrolling","innerContainer","moveFixedElements","fixedRenderer","scrollableMask","scrollPositionX","scrollPositionY","redrawTrigger","oldStacks","stacksTouched","reversedStacks","setStackedPoints","setGroupedPoints","modifyStacks","cumulative","touched","stackTotalGroup","onInit","onDestroy","LegendSymbolMixin","drawRectangle","symbolRadius","drawLineMarker","animateBeforeDestroy","startXPos","getGraphicalProps","startYPos","applyOptions","pointValKey","optionsToObject","dataLabels","graphic","dataLabel","destroyElements","dataSorting","importEvents","allowPointSelect","ctrlKey","getClassName","stackTotal","getZone","zones","zoneAxis","nonZonedColor","hasNewShapeType","shapeType","resolveColor","pointArrayMap","setNestedProperty","_hasPointLabels","_hasPointMarkers","colorByPoint","valueDecimals","valuePrefix","valueSuffix","Series","enabledThreshold","radiusPlus","lineWidthPlus","fillColor","cropThreshold","halo","inactive","turboThreshold","axisTypes","cropShoulder","eventsToUnbind","parallelArrays","sorted","eventOptions","bindAxes","getSymbol","optionalAxis","updateParallelArrays","toYData","yData","pointIntervalUnit","pointStart","pointInterval","allowDG","negativeColor","negativeFillColor","getCyclic","hasGroupedData","findPointIndex","matchByName","cropped","cropStart","hasDerivedData","addPoint","sortData","isSeriesBoosting","getFirstValidPoint","getProcessedData","getExtremesFromAll","forceCrop","cropData","processedXData","processedYData","basePointRange","dataGroup","groupMap","stackedYData","dataExtremes","modifyValue","pointPlacementToXValue","startFromThreshold","negStacks","stackKey","getStackIndicator","irregularWidths","pointXOffset","barW","yBottom","isPointInside","closestPointRangePx","getValidPoints","getClipBox","setClip","sharedClipKey","afterAnimate","finishedAnimating","drawPoints","specialGroup","markerAttribs","hasImage","removeEvents","animationTimeout","survive","getGraphPath","connectNulls","leftCliff","rightCliff","getPointSpline","xMap","graphPath","drawGraph","gappedPath","getZonesGraphs","preventGraphAnimation","fillGraph","linecap","applyZones","clips","showLine","isVML","resetZones","invertGroups","isRadialSeries","plotGroup","invertable","drawDataLabels","redrawPoints","kdAxisArray","searchKDTree","buildKDTree","buildingKdTree","kdNow","isNegative","hasValidPoints","labelrank","getStackBox","justifyDataLabel","centerInCategory","singleStacks","percentStacker","StackItem","cleanRecursively","addSeries","addAxis","createAxis","addColorAxis","ColorAxis","showLoading","loadingDiv","loadingSpan","loadingShown","showDuration","hideLoading","hideDuration","propsRequireDirtyBox","propsRequireReflow","propsRequireUpdateSeries","collectionsWithUpdate","isResponsiveOptions","isInternal","collectionsWithInit","setSubtitle","setCaption","hasDummyGraphic","connector","fixedBox","removePoint","initialType","dataGrouping","setName","setCategories","getStackPoints","leftNull","rightNull","isCliff","doCurve","rectPlotX","areaPath","fillOpacity","shiftUnit","rightContX","rightContY","groupPadding","pointPadding","minPointLength","brightness","trackerGroups","getColumnMetrics","columnIndex","maxPointWidth","pointWidth","columnMetrics","paddedWidth","columnCount","crispCol","adjustForMissingColumns","Highcharts","dense","translatedThreshold","barX","pointAttrToOptions","animationLimit","allowShadow","jitter","takeOrdinalPosition","applyJitter","isLog","CenteredSeriesMixin","slicedOffset","innerSize","angular","getStartAndEndRadians","connectorPadding","connectorShape","crookDistance","softConnector","ignoreHiddenPoint","startAngleRad","startR","getX","radii","labelDistance","endAngleRad","maxLabelDistance","slicedTranslation","half","labelPosition","natural","connectorPosition","breakAt","touchingSliceAt","drawEmpty","shadowGroup","getTranslate","delayedRendering","sortByAngle","setVisible","sliced","haloPath","connectorShapes","fixedOffset","straight","crookedLine","getConnectorPath","final","reducedLen","dlOptions","dataLabelOnNull","connectors","contrastColor","textPath","getDataLabelPath","dataLabelPath","alignDataLabel","dlBox","centerX","forceDL","setDataLabelStartPos","dataLabelPositioners","radialDistributionY","distributeBox","radialDistributionX","justify","alignToPlotEdges","alignToConnectors","shortened","_pos","positionIndex","_attr","sideOverflow","verifyDataLabelOverflow","placeDataLabels","connectorWidth","connectorColor","minSize","hideOverlappingLabels","oldOpacity","newOpacity","absoluteBox","isOld","TrackerMixin","drawTrackerPoint","_hasTracking","drawTrackerGraph","trackByArea","scatter","browserEvent","showResetZoom","zoomOut","relativeTo","resetSelection","mapNavigation","startMin","startMax","accumulate","hasImportedEvents","stateMarkerGraphic","currentSymbol","isCluster","mouseOver","mouseOut","labelBySeries","responsive","currentResponsive","rules","matchResponsiveRule","chartOptions","ruleIds","undoOptions","currentOptions","mergedOptions","_modules","SummaryTooltip","wrapperStyle","contentStyle","adjustPosition","$wrapper","$tooltip","_mixin2","_mixin","_document_mixin2","_document_mixin","PieSlider","initialSelection","minTickWidth","sliderWidth","onChange","sliderLocked","onDocument","handleSliderBlur","handleSliderChange","handleTickSelection","prevProps","itemsDidUpdate","selectionDidUpdate","maximumLabelHeight","computeMaximumLabelHeight","tickStyle","tickWidth","isSelected","labelClassName","sliderPosition","onMouseDown","handleSliderFocus","visibleTicks","minPosition","maxPosition","centerPosition","getHandleCenter","$bar","sliderBar","sliderOffsetX","getItemFromPosition","handleCenter","shouldCallOnChange","sliderTicks","shouldPureComponentUpdate","_shallowEqual2","_shallowEqual","dataSetType","isBudgetType","isActualType","REGULAR_OPACITY","FAINT_OPACITY","getPatternStringForColor","setColorOpacityForDataSetType","seriesList","serie","isHighlighting","strokeOpacity","MIDDLE_OPACITY","getPatternFillForColor","saturateAndDarken","seriesId","colorMatch","saturate","darken","originalColor","areaFill","areaFillColorMatch","matchColor","series_id","chartType","columnColor","brightenSVGArea","seriesData","show_more","getAnimationDuration","SHADES_MULTIPLIER","HIGHLIGHT_OPACITY","ANIMATION_DURATION","_chromaJs2","_chromaJs","MiniLoader","checkGlobal","cloneArray","tryCatcherGen","makeStackTraceLong","observable","hasStacks","STACK_JUMP_SEPARATOR","concatedStacks","filterStackString","stackString","desiredLines","isNodeFrame","stackLine","fileNameAndLineNumber","getFileNameAndLineNumber","rFileName","rStartingLine","rEndingLine","captureLine","firstLine","attempt1","attempt2","attempt3","isHostObject","arrayInitialize","IndexedItem","ScheduledDisposable","scheduler","disposable","isDisposed","scheduleItem","IsDisposedDisposable","StringIterable","StringIterator","ArrayIterable","ArrayIterator","numberIsFinite","getIterable","$iterator$","maxSafeInteger","observableOf","isScheduler","currentThreadScheduler","FromArrayObservable","RepeatSink","amb","falseFactory","argumentsToArray","emptyArrayFactory","asObservable","notEmpty","concatMap","selectorFunc","observableFromPromise","observableFrom","concatAll","arrayIndexOfComparer","HashSet","plucker","currentProp","firstOnly","EmptyError","findValue","yieldIndex","AnonymousObservable","FindValueObserver","toObservable","isObservable","isGeneratorFunction","isGenerator","thunkToObservable","arrayToObservable","objectToObservable","Rx","just","observables","forkJoin","onNext","onCompleted","createCbObservable","AsyncSubject","createCbHandler","createNodeObservable","createNodeHandler","isNodeList","StaticNodeList","NodeList","ListenDisposable","_fn","createEventListener","disposables","CompositeDisposable","elemToString","combineLatestSource","resultSelector","hasValue","hasValueAll","BinaryDisposable","observableWindowWithOpenings","windowOpenings","windowClosingSelector","groupJoin","observableEmpty","observableWindowWithBoundaries","windowBoundaries","Subject","RefCountDisposable","addRef","observableWindowWithClosingSelector","createWindowClose","windowClose","SingleAssignmentDisposable","setDisposable","SerialDisposable","enumerableWhile","WhileEnumerable","Pattern","patterns","Plan","handleOnError","handleOnNext","planCreateObserver","externalSubscriptions","JoinObserver","ActivePlan","joinObserverArray","joinObservers","joinObserver","_observableTimer","dueTime","TimerObservable","observableTimerDateAndPeriod","normalizeTime","scheduleRecursiveFuture","observableTimerTimeSpanAndPeriod","schedulePeriodic","observableDefer","observableDelayRelative","subscription","exception","running","materialize","notification","shouldRun","recurseDueTime","shouldRecurse","observableDelayAbsolute","delayWithSelector","subscriptionDelay","delayDurationSelector","subDelay","delays","atEnd","debounceWithSelector","durationSelector","currentid","timeoutWithSelector","firstTimeout","timeoutDurationSelector","observableNever","observableThrow","setTimer","timerWins","switched","myId","oWins","defaultScheduler","createTimer","scheduleFuture","transformForObserver","obs","OnNextPredicate","OnErrorPredicate","MockPromise","subscriptions","innerNotification","scheduleAbsolute","jLen","disposableEmpty","thisGlobal","internals","defaultNow","defaultComparer","defaultSubComparer","defaultError","defaultKeySerializer","isFn","longStackSupport","ObjectDisposedError","ArgumentOutOfRangeError","NotSupportedError","NotImplementedError","notImplemented","notSupported","doneEnumerator","dontEnums","hasDontEnumBug","dontEnumsLength","__","addProperties","ln","getDisposable","compareTo","PriorityQueue","priorityProto","isHigherPriority","percolate","heapify","removeAt","CompositeDisposablePrototype","shouldDispose","currentDisposables","Disposable","disposableCreate","checkDisposed","disposableFixup","_fixup","_first","_second","old1","old2","NAryDisposable","_disposables","InnerDisposable","isInnerDisposed","underlyingDisposable","isPrimaryDisposed","ScheduledItem","invokeCore","isCancelled","Scheduler","schedulerProto","_scheduleFuture","timeSpan","invokeRecImmediate","innerAction","state2","scheduleWork","state3","isAdded","invokeRecDate","dueTime1","scheduleRecursive","catchError","CatchScheduler","scheduleMethod","clearMethod","SchedulePeriodicRecursive","createTick","recurse","_period","_action","_scheduler","ImmediateScheduler","immediateScheduler","CurrentThreadScheduler","runTrampoline","si","scheduleRequired","currentThread","localTimer","localSetTimeout","localClearTimeout","WScript","Sleep","runTask","currentlyRunning","tasksByHandle","nextHandle","isAsync","oldHandler","MSG_PREFIX","onGlobalPostMessage","scriptElement","DefaultScheduler","scheduleAction","ClearDisposable","LocalClearDisposable","scheduleLongRunning","_handler","_recursiveOriginal","_recursiveWrapper","_wrap","_clone","_getRecursiveWrapper","failed","state1","Notification","_accept","_acceptObserver","observerOrOnNext","OnNextNotification","OnErrorNotification","OnCompletedNotification","notificationCreateOnNext","createOnNext","notificationCreateOnError","createOnError","notificationCreateOnCompleted","createOnCompleted","toNotifier","asObserver","AnonymousObserver","CheckedObserver","observerCreate","fromNotifier","notifyOn","ObserveOnObserver","makeSafe","AnonymousSafeObserver","_onNext","_onError","_onCompleted","observableProto","AbstractObserver","isStopped","_observer","CheckedObserverPrototype","checkAccess","ScheduledObserver","isAcquired","hasFaulted","enqueueNext","enqueueError","enqueueCompleted","work","ensureActive","isOwner","makeSubscribe","oldOnError","oldSubscribe","_subscribe","oOrOnNext","subscribeOnNext","subscribeOnError","subscribeOnCompleted","ObservableBase","fixSubscriber","subscriber","ado","subscribeCore","AutoDetachObserver","FlatMapObservable","InnerObserver","_wrapResult","i2","Enumerable","ConcatEnumerableObservable","currentItem","currentValue","_recurse","CatchErrorObservable","lastError","RepeatEnumerable","RepeatEnumerator","enumerableRepeat","repeatCount","OfEnumerable","OfEnumerator","enumerableOf","ObserveOnObservable","observeOn","SubscribeOnObservable","subscribeOn","FromPromiseObservable","_p","scheduleNext","scheduleError","sad","toPromise","promiseCtor","ToArrayObservable","Defer","observableFactory","EmptyObservable","EmptySink","EMPTY_OBSERVABLE","FromObservable","_iterable","createScheduleMethod","_args","observableFromArray","GenerateObservable","cndFn","itrFn","resFn","_initialState","_cndFn","_itrFn","_resFn","hasResult","ofWithScheduler","ofArrayChanges","unobserve","observerFn","ofObjectChanges","NeverObservable","NEVER_OBSERVABLE","never","PairsObservable","_o","RangeObservable","rangeCount","loopRecursive","RepeatObservable","JustObservable","ThrowObservable","_error","UsingObservable","obsFn","_obsFn","resourceFactory","rightSource","leftSource","choiceL","leftChoice","rightSubscription","choiceR","rightChoice","leftSubscription","leftSubscribe","rightSubscribe","CatchObservable","CatchObserver","handlerOrSecond","observableCatch","combineLatest","CombineLatestObservable","_params","_cb","CombineLatestObserver","notTheSame","observableConcat","ConcatObserver","ConcatObservable","_sources","MergeObservable","maxConcurrent","MergeObserver","activeCount","handleSubscribe","innerSource","maxConcurrentOrOther","observableMerge","mergeAll","MergeAllObservable","MergeAllObserver","CompositeError","innerErrors","MergeDelayErrorObservable","MergeDelayErrorObserver","_group","setCompletion","_inner","mergeDelayError","onErrorResumeNext","OnErrorResumeNextObservable","OnErrorResumeNextObserver","SkipUntilObservable","_open","SkipUntilSourceObserver","SkipUntilOtherObserver","_r","SwitchObservable","SwitchObserver","latest","hasLatest","switchLatest","TakeUntilObservable","TakeUntilObserver","WithLatestFromObservable","_ss","WithLatestFromOtherObserver","outerSad","WithLatestFromSourceObserver","allValues","withLatestFrom","ZipObservable","ZipObserver","shiftEach","queuedValues","ZipIterableObservable","ZipIterableObserver","zipIterable","bufferWithCount","bufferCount","windowWithCount","DematerializeObservable","DematerializeObserver","dematerialize","DistinctUntilChangedObservable","keyFn","DistinctUntilChangedObserver","hasCurrentKey","comparerEquals","distinctUntilChanged","TapObservable","_oN","_oE","_oC","doAction","doOnNext","tapOnNext","doOnError","tapOnError","doOnCompleted","tapOnCompleted","FinallyObservable","FinallyDisposable","IgnoreElementsObservable","ignoreElements","MaterializeObservable","MaterializeObserver","retryCount","RetryWhenObservable","createDisposable","notifier","_notifier","exceptions","handled","notificationDisposable","exn","retryWhen","RepeatWhenObservable","completions","repeatWhen","ScanObservable","hasSeed","ScanObserver","_hs","_ha","_hv","scan","SkipLastObservable","_c","SkipLastObserver","startWith","TakeLastObserver","TakeLastBufferObserver","takeLastBuffer","windowCount","createWindow","refCountDisposable","selectConcat","selectorResult","concatMapObserver","selectConcatObserver","onNextFunc","onErrorFunc","onCompletedFunc","DefaultIfEmptyObserver","defaultIfEmpty","retValue","DistinctObservable","cmpFn","_keyFn","_cmpFn","DistinctObserver","_h","distinct","keySelector","elementSelector","groupByUntil","groupDisposable","fireNewMapEntry","writer","GroupedObservable","durationGroup","md","MapObservable","innerMap","internalMap","selectorFn","selectMany","mergeMap","flatMapObserver","selectManyObserver","flatMapLatest","switchMap","SkipObservable","_count","SkipObserver","SkipWhileObservable","SkipWhileObserver","TakeObservable","TakeObserver","TakeWhileObservable","TakeWhileObserver","FilterObservable","innerPredicate","internalFilter","shouldYield","ExtremaByObservable","ExtremaByObserver","_v","comparison","ReduceObservable","ReduceObserver","SomeObservable","SomeObserver","IsEmptyObservable","IsEmptyObserver","EveryObservable","EveryObserver","IncludesObservable","_elem","IncludesObserver","CountObservable","CountObserver","IndexOfObservable","IndexOfObserver","SumObservable","SumObserver","AverageObservable","AverageObserver","sequenceEqual","donel","doner","ql","qr","subscription1","subscription2","ElementAtObservable","ElementAtObserver","elementAt","SingleObserver","_obj","FirstObservable","FirstObserver","LastObservable","LastObserver","_y","ToSetObservable","ToSetObserver","ToMapObservable","ToMapObserver","_m","SliceObservable","SliceObserver","LastIndexOfObservable","LastIndexOfObserver","createObservable","__generatorFunction__","gen","processGenerator","observableToAsync","toAsync","fromCallback","useNativeEvents","EventObservable","_el","createHandler","fromEvent","fromEventPattern","publish","refCount","EventPatternObservable","_del","EventPatternDisposable","addHandler","removeHandler","startAsync","functionAsync","PausableObservable","pauser","controller","paused","conn","connection","pausable","pause","PausableBufferedObservable","previousShouldFire","shouldFire","pausableBuffered","ControlledObservable","enableQueue","ControlledSubject","multicast","numberOfItems","requestedCount","requestedDisposable","hasFailed","hasCompleted","disposeCurrentRequest","_processRequest","controlled","StopAndWaitObservable","StopAndWaitObserver","__sub__","scheduleDisposable","innerScheduleMethod","stopAndWait","WindowedObservable","windowSize","WindowedObserver","received","windowed","onDrain","_isStdio","MulticastObservable","fn1","fn2","_fn1","_fn2","connectable","subjectOrSubjectSelector","ConnectableObservable","share","publishLast","publishValue","initialValueOrSelector","BehaviorSubject","shareValue","replay","bufferSize","ReplaySubject","shareReplay","InnerSubscription","RefCountObservable","_connectableSubscription","_connection","_source","_subject","ConnectDisposable","singleInstance","getObservable","hasObservable","leftDurationSelector","rightDurationSelector","leftDone","rightDone","leftId","rightId","leftMap","rightMap","windowOpeningsOrClosingSelector","PairwiseObservable","PairwiseObserver","_hp","pairwise","letBind","thenSource","elseSourceOrScheduler","observableWhileDo","whileDo","doWhile","defaultSourceOrScheduler","ExpandObservable","ExpandObserver","_ensureActive","_m1","ForkJoinObservable","finished","hasResults","ForkJoinObserver","_subs","manySelect","ChainObservable","and","thenDo","activate","deactivate","errHandler","activePlan","jlen","removeActivePlan","addActivePlan","hasValues","firstValues","isCompleted","activePlans","JoinObserverPrototype","plans","outObserver","_dt","observableinterval","periodOrScheduler","firstArg","DebounceObservable","DebounceObserver","currentId","windowWithTime","windowTime","timeShiftOrScheduler","timeShift","isSpan","isShift","timerD","nextSpan","nextShift","newTotalTime","ts","totalTime","windowWithTimeOrCount","windowTimeOrCount","windowId","newId","newWindow","bufferWithTime","bufferTime","bufferWithTimeOrCount","bufferTimeOrCount","TimeIntervalObservable","TimeIntervalObserver","timeInterval","TimestampObservable","TimestampObserver","SampleObservable","sampler","_sampler","sourceSubscription","SampleSourceObserver","SamplerObserver","_handleMessage","intervalOrSampler","GenerateAbsoluteObservable","timeFn","_timeFn","generateWithAbsoluteTime","timeSelector","GenerateRelativeObservable","generateWithRelativeTime","DelaySubscription","delaySubscription","SkipLastWithTimeObservable","SkipLastWithTimeObserver","skipLastWithTime","TakeLastWithTimeObservable","TakeLastWithTimeObserver","takeLastWithTime","takeLastBufferWithTime","TakeWithTimeObservable","takeWithTime","SkipWithTimeObservable","SkipWithTimeObserver","skipWithTime","SkipUntilWithTimeObservable","_st","SkipUntilWithTimeObserver","skipUntilWithTime","takeUntilWithTime","windowDuration","lastOnNext","TransduceObserver","xform","_xform","transduce","transducer","SwitchFirstObservable","hasCurrent","SwitchFirstObserver","switchFirst","flatMapFirst","exhaustMap","flatMapWithMaxConcurrent","flatMapMaxConcurrent","VirtualTimeScheduler","initialClock","clock","isEnabled","VirtualTimeSchedulerPrototype","toAbsoluteTime","toRelativeTime","scheduleRelative","runAt","getNext","advanceTo","dueToClock","advanceBy","sleep","HistoricalScheduler","cmp","HistoricalSchedulerProto","ReactiveTest","created","subscribed","disposed","Recorded","Subscription","unsubscribe","MockDisposable","disposes","MockObserver","MockObserverPrototype","onResolved","onRejected","newPromise","HotObservable","ColdObservable","TestScheduler","baseComparer","startScheduler","createFn","createObserver","createHotObservable","createColdObservable","createResolvedPromise","createRejectedPromise","__subscribe","AutoDetachObserverPrototype","UnderlyingObservable","_u","underlyingObservable","mergedDisposable","hasObservers","os","AnonymousSubject","createRemovableDisposable","so","_trim","Pauser","sampleCurveX","sampleCurveY","sampleCurveDerivativeX","solveCurveX","epsilon","stylesheet","workerCount","AnimationLoop","spriteAtlas","SpriteAtlas","lineAtlas","LineAtlas","_order","_resetUpdates","updateClasses","ImageSprite","glyphSource","GlyphSource","_validateLayer","StyleFunction","layerJSON","_forwardLayerEvent","_groupLayers","_updateWorkerLayers","broadcast","_serializeLayers","_applyClasses","allPaintProps","paintProps","_recalculate","_updateZoomHistory","rasterFadeDuration","_checkLoaded","allLayers","updatedIds","updatedSourceIds","_reloadSource","_forwardSourceEvent","_forwardTileEvent","addLayer","arrayIndex","removeLayer","getReferentLayer","setLayerZoomRange","_updateLayer","setFilter","getFilter","wasFeatureConstant","_flattenRenderedFeatures","sourceResults","layerFeatures","sourceID","throwErrors","_updateSources","retina","setSprite","addIcons","icons","fontName","allGlyphs","getSimpleGlyphs","createFunction","defaultType","innerFun","zoomAndFeatureDependent","featureDependent","zoomDependent","evaluateExponentialFunction","evaluateIntervalFunction","evaluateCategoricalFunction","evaluateIdentityFunction","featureFunctions","featureFunctionStops","inputLower","inputUpper","outputLower","outputUpper","evaluatedLower","evaluatedUpper","parseColorString","constantName","validateArray","validateNumber","validateFunctionStops","functionType","arrayElementValidator","validateFunctionStop","isZoomAndPropertyFunction","previousStopDomainZoom","previousStopDomainValue","validateStopDomainValue","functionValueSpec","stopKeyType","stopDomainValues","isZoomFunction","isPropertyFunction","arraySpec","validateArrayElement","arrayElementSpec","minimum","maximum","validatePaintProperty","validateLayoutProperty","otherLayer","propertyKey","layerSpec","transitionMatch","source_tile","source_geojson","source_video","source_image","light","lightSpec","rootType","worker","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","getBlob","Worker","earcut","holeIndices","hasHoles","outerLen","outerNode","linkedList","invSize","eliminateHoles","earcutLinked","signedArea","insertNode","removeNode","filterPoints","again","steiner","ear","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","prevZ","nextZ","intersects","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","mx","tanMin","sectorContainsSector","sortLinked","numMerges","pSize","qSize","inSize","leftmost","intersectsPolygon","middleInside","q2","o1","o2","o3","o4","onSegment","Node","b2","an","polygonArea","trianglesArea","holes","dimensions","holeIndex","quickselect","quickselectStep","defaultCompare","sd","Anchor","resolveTokens","SymbolQuad","anchorPoint","tl","tex","minScale","maxScale","getIconQuads","shapedIcon","boxScale","alongLine","pixelRatio","getGlyphQuads","shaping","textRotate","keepUpright","positionedGlyphs","quads","positionedGlyph","glyph","glyphInstances","advance","labelMinScale","getSegmentGlyphs","otl","otr","obl","obr","glyphMinScale","glyphAngle","upsideDown","newAnchorPoint","prevScale","placementScale","GridIndex","NUM_PARAMS","keysOffset","bboxesOffset","bboxes","_insertReadonly","_forEachCell","_insertCell","cellIndex","seenUids","_queryCell","arg1","_convertToCellCoord","cx2","cy2","toArrayBuffer","metadataLength","totalCellLength","_pbf","_features","readLayer","readValueMessage","_geometry","readFeature","readTag","classifyRings","rings","ccw","cmd","cmdLen","toGeoJSON","vectorTileFeature","_vectorTileFeature","_z","getURL","service","srs","getMercCoords","VectorTileSource","_options","_tileLoaded","bucketStats","RasterTileSource","getTexture","LINEAR_MIPMAP_NEAREST","pixelStorei","UNPACK_PREMULTIPLY_ALPHA_WEBGL","generateMipmap","saveTexture","resolveUrl","numUrls","resolved","fromMat4","fromValues","m00","m01","m02","m10","m11","m12","m20","m21","m22","a01","a02","a12","a10","a11","a20","a21","a22","b01","b11","b21","det","adjoint","b02","b10","b12","b20","b22","mul","rad","fromTranslation","fromRotation","fromScaling","fromMat2d","fromQuat","xx","yx","zx","zy","zz","wy","wz","normalFromMat4","a03","a13","a23","a30","a31","a32","a33","b03","b04","b05","b06","b07","b08","b09","frob","multiplyScalar","multiplyScalarAndAdd","exactEquals","a4","a5","a6","a7","a8","b3","b4","b5","b6","b7","b8","scaleAndAdd","squaredDistance","sqrDist","squaredLength","sqrLen","dot","az","bz","lerp","hermite","factorTimes2","factor1","factor2","factor3","factor4","inverseFactor","inverseFactorTimesTwo","zScale","transformMat3","transformQuat","qy","qz","qw","ix","iy","iz","iw","rotateY","vec","stride","tempA","tempB","cosine","aw","pragmas","DOM","createAttributionString","attributions","attribution","attrib","_update","_updateEditLink","_editLink","_bowser","_bowser2","PREFIX","webkit","gecko","DEFAULTS","MAPBOX_API_ACCESS_TOKEN","CURSOR","GRABBING","GRAB","HeatmapShader","_arg","createProgram","vs","createShader","VERTEX_SHADER","fs","FRAGMENT_SHADER","attachShader","compileShader","value_cache","uniform_cache","attribCache","attribLocation","getAttribLocation","shader","shaderSource","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLoc","getUniformLocation","int","uniform2f","_DragDropContext","_DragDropContextProvider","_DragLayer","_DragSource","_DropTarget","DragDropContext","backendOrModule","_checkDecoratorArguments2","unpackBackendForEs5Users","childContext","createChildContext","DecoratedComponent","_class","DragDropContextContainer","dragDropManager","CHILD_CONTEXT_TYPES","_hoistNonReactStatics2","_dndCore","_hoistNonReactStatics","_checkDecoratorArguments","DragDropManager","areOffsetsEqual","offsetA","offsetB","_dragDrop","initialSourceClientOffset","initialClientOffset","getDifferenceFromInitialOffset","matchesType","dirtyHandlerIds","dragOperation","_registry","ALL","prevTargetIds","_xor2","didChange","prevInnermostTargetId","innermostTargetId","areDirty","handlerIds","_intersection2","_xor","_intersection","shallowEqualScalar","valA","valB","decorateHandler","createMonitor","createConnector","registerHandler","containerDisplayName","_options$arePropsEqua","arePropsEqual","_shallowEqualScalar2","DragDropContainer","handleChildRef","manager","handlerMonitor","handlerConnector","getBackend","receiveProps","getCurrentState","handlerId","decoratedComponentInstance","isCurrentlyMounted","currentType","receiveType","_registerHandler","receiveHandlerId","globalMonitor","subscribeToStateChange","receiveComponent","isClassComponent","_isPlainObject","_shallowEqualScalar","Comp","throwIfCompositeComponentElement","wrapHookToRecognizeElement","hook","elementOrNode","_cloneWithRef2","wrapConnectorHooks","wrappedHooks","wrappedHook","_cloneWithRef","areOptionsEqual","nextOptions","isValidType","allowArray","_memoize","_memoize2","safari","_amount2","_amount","isAmountType","getAmountTypeFor","TooltipValue","amountType","Scale","Marker","getWorkerPool","stylesheetLoaded","QueryFeatures","SourceCache","includedSources","rendered","addSourceType","SourceType","setType","workerSourceURL","mapId","validateValue","mapDomain","regexSeparators","ucs2decode","ucs2encode","stringFromCharCode","basicToDigit","codePoint","digitToBasic","digit","adapt","numPoints","damp","baseMinusTMin","tMax","basic","oldi","baseMinusT","initialN","bias","initialBias","maxInt","tMin","encode","handledCPCount","basicLength","handledCPCountPlusOne","qMinusT","toUnicode","regexPunycode","toASCII","regexNonASCII","punycode","sourceTypes","compareAreas","maxRings","anchorAngle","shapedText","iconWidth","iconHeight","textLeft","textRight","textTop","textBottom","textHeight","padT","padR","padB","padL","multiPolygonIntersectsBufferedMultiPoint","multiPolygon","polygonContainsPoint","pointIntersectsBufferedLine","multiPolygonIntersectsMultiPolygon","multiPolygonA","multiPolygonB","multiPolygonContainsPoint","lineIntersectsLine","multiPolygonIntersectsBufferedMultiLine","multiLine","lineIntersectsBufferedLine","lineA","lineB","lineSegmentIntersectsLineSegment","radiusSquared","distToSegmentSquared","l2","_sourceLoaded","_sourceErrored","unloadTile","_isIdRenderable","loadTile","abortTile","getIds","getRenderableIds","isRenderable","getTileByID","intersectionTest","_convertFromCellCoord","normalizeOffset","cornerOffset","isPointLike","convertedOffset","closeButton","closeOnClick","_onClickClose","_content","getLngLat","_lngLat","setLngLat","setDOMContent","setHTML","frag","htmlNode","_createContent","_closeButton","_tip","offsetedPos","anchorTranslate","mapStateToProps","isSendingMessage","updateMessage","sendMessage","_reactTether2","_reactTether","_share_message2","_share_message","_share_notification2","_share_notification","_change_report_permission2","_change_report_permission","_share_options_content2","_share_options_content","_report_permission_options2","_report_permission_options","ReportPublicOption","icon","readonly","TransitionableShareOptionsContent","closeDropdown","onSend","showSending","onNotificationNo","onNotificationYes","shareToggle","onNotificationNever","closeAndNeverShowNotification","handleDropdownToggle","onSavePermissionChange","showOverview","onCancelPermissionChange","ShareOptions","loadEntityUsers","loadReportRoles","permission","currentPermission","onBack","goToMessagePanel","onEditPermission","goToPermissionPanel","initialPermission","onSave","goToOverviewPanel","addUser","addMessageUser","removeUser","removeMessageUser","disableSearch","reportVisibility","isVisibleOnTransparency","dropdownIcon","attachment","targetAttachment","constraints","ignoreContentClicks","renderSharePanel","onYes","onNo","onNever","Connect","_smooth","_smooth2","_cancelEvents","_cancelEvents2","getAnimationType","defaultEasing","functionWrapper","currentWindowProperties","requestAnimationFrameHelper","makeData","startPositionY","targetPositionY","deltaTop","delayTimeout","scrollContainerHeight","animateScroll","easedAnimate","setContainer","proceedOptions","scrollToTop","toY","scrollToBottom","scrollMore","scrollHash","mountFlag","containers","handleHashChange","initStateFromHash","isInit","childBindings","domNode","registerElems","parentBindings","ReportPermissionOptions","getHostname","TransparencyLoginButton","transparencyUrl","embedStyle","locationHost","locationHash","redirectUrl","linkedElement","FeedbackModal","entityDisplayName","feedbackSaving","iconType","DocumentList","documents","sortedDocuments","file_name","icon_type","file_extension","tooltip_name","TermsOfService","handleClose","Budget101","alt","SummaryWelcome","isTallahasseeFl","evt","validGraphTypes","isValidGraphType","Graph","_highchartsOg2","_highchartsOg","_measure_text2","_measure_text","fontStyle","reportEvents","handleTooltip","textStyle","axisTextColor","currentGraph","pieSeries","lastGraph","removeAllSeries","labelWidthSum","averageWidth","oldPositions","numberOfTickLabels","yearId","startYear","yearOrder","positionPieSlider","xAxisTitle","yearLabels","showAggregates","isSameData","highchartsChartType","yUnit","xAxisMargin","labelHeights","xText","removeAllOverlays","sameTypeDifferentData","buildChart","constructOverlay","setPointStateForSeries","attachAreaEvents","addPlotLines","removeAnnotations","addAnnotations","selectedSeries","filterSelectedSeries","point_id","newSeries","generateLine","generatePie","seriesInLine","currentDataType","seriesDataType","annotation","seriesAnimation","seriesName","getColorForDatasetType","getDashStyleForDatasetType","getFillOpacity","dataPoint","isPositive","getPieSeries","unhighlightSeries","somethingRemoved","shouldRedraw","selectedOverlay","selectedData","yearData","yearDataPartitioned","constructOverlaySeries","seriesPartitioned","seriesSegment","part","axisExtremes","calculateAxisExtremes","overlayAxis","yAxisLabelFormatter","graphPos","hasZeroLine","constructNewSeries","brightenSeries","patternColors","getPatternFillForColors","spacingLeft","setAxisExtremes","highChartRenderer","addPattern","dataLine","absoluteAmount","extremes","minVal","maxVal","updateMinMax","updateBySeries","pos_only","neg_only","mouseover","highlightSeries","mouseout","highlightedSeries","getSeriesSlice","annotateSeries","annotatePoint","pointsArray","htmlAnnotation","primaryNode","oldAnnotation","addColorStops","canvasGradient","maxStop","colorStops","colorStop","addColorStop","CanvasRenderer","textBaseline","clipPaths","restore","destination","_path","beginPath","bezierCurveTo","startControl","endControl","createLinearGradient","createRadialGradient","midX","midY","invF","imageSize","createPattern","resizeImage","textBounds","textShadows","fontVariant","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","fillText","_options$fontMetrics$","getMetrics","rectangle","_options$fontMetrics$2","globalAlpha","_len2","_key2","ABSOLUTE","FIXED","STICKY","inlineSelectElement","inlineTextAreaElement","inlineInputElement","_TextContainer","_TextContainer2","_Circle","_Circle2","INPUT_BORDER_COLOR","INPUT_BACKGROUND_COLOR","INPUT_BORDER","RADIO_BORDER_RADIUS","RADIO_BORDER_RADIUS_TUPLE","INPUT_RADIO_BORDER_RADIUS","CHECKBOX_BORDER_RADIUS","CHECKBOX_BORDER_RADIUS_TUPLE","INPUT_CHECKBOX_BORDER_RADIUS","inlineFormElement","getInputValue","allowLinebreak","fromTextNode","TextBounds","_punycode","_Feature","_Feature2","UNICODE","hasUnicodeCharacters","encodeCodePoint","ucs2","getWrapperBounds","codePoints","letterRendering","textList","splitWords","SUPPORT_RANGE_BOUNDS","getRangeBounds","replacementNode","splitText","setStart","setEnd","onWordBoundary","isWordBoundary","characterCode","ForeignObjectRenderer","windowWidth","windowHeight","foreignObject","FontMetrics","_parseMetrics","Proxy","SUPPORT_CORS_XHR","SUPPORT_RESPONSE_TYPE","reader","FileReader","readAsDataURL","imageTimeout","ontimeout","_interopRequireWildcard","_toArray","_summary_table_head2","_summary_table_head","getVarianceClassNames","formulas","getHighlightingClass","updateScrollState","getViewData","setViewState","handleAllExpansion","trueLines","handleOnScroll","SummaryTable","customStyles","borderRightWidth","hideUnitSymbol","SummaryTableRow","_renderLine","reportUnit","overlayRow","_generateMetricRow","scaleRow","customFooterStyles","borderTop","SummaryTableCell","showVariance","balanceSheetReport","getFixedCellStyle","selectedItem","yearNum","interpolate_display","firstCol","population","defaultLabel","titleLabel","prorated","varianceBaseType","extraLines","headerHeight","trueLinesExpanded","pendingExpandAll","onScroll","stickyHeader","renderBody","_onExpandRow","_onAnnotationMouseOver","_getAnnotationClasses","cls","_onAnnotationMouseOut","_onAnnotationClick","annotationClasses","_generateAnnotation","expandIconEnabled","interactable","rowClassName","thClasses","lineStyle","fixedColor","dropItemIcon","lineNameClassName","Fragment","iconStyle","uncertain","activeCategory","deleteStatus","swapDataSets","REPORT_DELETED","REPORT_OPEN_SETTINGS_PANEL","REPORT_OPEN_EDIT_DATA","REPORT_OPEN_EDIT_LINKAGE","REPORT_SETTINGS_SELECT_CATEGORY","REPORT_SETTINGS_GO_BACK","REPORT_SETTINGS_CANCEL","REPORT_SETTINGS_SAVE","REPORT_SETTINGS_SAVE_SUCCESS","REPORT_SETTINGS_SAVE_ERROR","REPORT_SETTINGS_SAVE_DONE","REPORT_SETTINGS_CHANGE_ATTRIBUTE","REPORT_SETTINGS_DELETE_REPORT","REPORT_SETTINGS_DELETE_REPORT_CONFIRMED","REPORT_SETTINGS_DELETE_REPORT_CANCELED","REPORT_SETTINGS_DELETE_REPORT_SUCCESS","REPORT_SETTINGS_DELETE_REPORT_ERROR","REPORT_SETTINGS_DELETE_REPORT_FINISHED","REPORT_SETTINGS_CHANGE_DATA_SET_ORDER","REPORT_SETTINGS_RENAME_DATA_SET","REPORT_SETTINGS_CHANGE_XAXIS_LABEL","isTitleTooLong","_check_dataset_subset2","_check_dataset_subset","ChooseDataSets","coaDataSets","monthText","sortField","updated","filteredDataSets","dataSetErrors","isAllChecked","selectedDataSets","onCheckAll","handleSelectAll","checkedRows","handleSearchChange","rowErrors","onRowClick","handleRowClick","rawDataSets","isChecked","coaDataSet","selectedSet","getSelected","txDataSets","selectedRow","handleSelect","transaction_id","chart_id","_settings_panel_header_text2","_settings_panel_header_text","getProperty","_renderHeader","oneVisibleCategory","additionalHeadingText","additionalHeadingDescription","SettingsPanelHeader","PORTAL_STORIES_LIMIT","storyId","ogOperateHost","StoriesStore","selectedStoryPublicURL","story","STORIES_LOADED","STORIES_VIEW_STORY","windowNames","getWindowNames","gOPS","$assign","isEnum","factories","construct","partArgs","un","$parseInt","$trim","ws","$parseFloat","log1p","EPSILON32","MAX32","MIN32","roundTiesToEven","fround","$abs","$sign","inc","forced","newPromiseCapability","promiseCapability","strong","getEntry","$iterDefine","InternalMap","weak","NATIVE_WEAK_MAP","IS_IE11","uncaughtFrozenStore","ufstore","$WeakMap","$has","UncaughtFrozenStore","findUncaughtFrozen","flattenIntoArray","sourceLen","spreadable","targetIndex","IS_CONCAT_SPREADABLE","fillString","fillStr","intMaxLength","fillLen","stringFiller","isEntries","inLow","inHigh","outLow","outHigh","_defaults","_EventEmitter2","_EventEmitter3","_ResourceStore","_ResourceStore2","_Translator","_Translator2","_LanguageUtils","_LanguageUtils2","_PluralResolver","_PluralResolver2","_Interpolator","_Interpolator2","_BackendConnector","_BackendConnector2","_CacheConnector","_CacheConnector2","_defaults2","_postProcessor","_postProcessor2","_EventEmitter","transformOptions","createClassOnDemand","ClassOrObject","compatibilityAPI","compatibilityJSON","isClone","lu","cacheConnector","pluralResolver","pluralSeparator","interpolator","backendConnector","languageDetector","detection","_len3","_key3","fcName","loadResources","toLoad","_len4","_key4","cacheUserLanguage","_this5","fixedT","setDefaultNamespace","_this6","preloaded","newLngs","getLanguagePartFromCode","createInstance","cloneInstance","_this7","ResourceStore","addNamespaces","removeNamespaces","getResource","addResource","addResources","addResourceBundle","removeResourceBundle","getResourceBundle","Translator","extractFromKey","_extractFromKey","resType","noObject","extendTranslation","usedDefault","usedKey","isValidLookup","missingKeyHandler","postProcessorNames","applyPostProcessor","_extractFromKey2","needsPluralHandling","needsContextHandling","finalKey","finalKeys","pluralSuffix","getSuffix","contextSeparator","possibleKey","LanguageUtil","specialCases","formatLanguageCode","cleanCode","isWhitelisted","fallbackCode","addCode","createRules","nr","_rulesPluralsTypes","PluralResolver","addRule","getRule","needsPlural","rule","noAbs","Interpolator","iOpts","prefixEscaped","suffixEscaped","unescapePrefix","nestingPrefixEscaped","nestingSuffixEscaped","regexpStr","regexpUnescapeStr","regexpUnescape","nestingRegexpStr","nestingRegexp","regexSafe","handleHasOptions","optionsString","clonedOptions","Connector","queueLoad","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","_name$split","_name$split2","read","tried","readMulti","_name$split3","_name$split4","_err","_name$split5","_name$split6","fallbackValue","targetElement","getPropsFromState","Root","propsForRoot","I18nextProvider","translation","reportParams","getSortedReports","firstReport","onRouteChange","handleRouteChange","externalRoutes","internalRoutes","_reactDom2","_reactRouter2","_reactRouter","_entity_actions2","_entity_actions","_report_app2","_report_app","_report_index2","_report_index","_report_view2","_report_view","_story_view2","_story_view","_reports2","_reports","$$typeof","_owner","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","isReactComponent","isPureReactComponent","__self","__source","only","createRef","_calculateChangedBits","_defaultValue","_currentValue","_changedBits","Provider","Consumer","forwardRef","StrictMode","unstable_AsyncMode","createFactory","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","propIsEnumerable","test1","test2","test3","_hasCaughtError","_caughtError","_hasRethrowError","_rethrowError","qa","oa","extractEvents","eventTypes","sa","phasedRegistrationNames","registrationName","dependencies","xa","Ga","Fa","invokeGuardedCallbackAndCatchFirstError","Ha","Ia","Ka","_dispatchListeners","_dispatchInstances","isPersistent","release","La","Ma","Oa","stateNode","Da","Pa","Ja","rethrowCaughtError","Qa","Ua","Va","Xa","Ta","dispatchConfig","eb","_targetInst","gb","ib","jb","alternate","mb","lb","_fallbackText","_startText","ob","nativeEvent","Interface","sb","eventPool","destructor","getPooled","Mb","Nb","Pb","Lb","Bb","Qb","Ob","xb","char","Ab","Wb","Ea","Sb","restoreControlledState","Xb","Ub","Vb","Yb","Zb","cc","ec","gc","correspondingUseElement","ic","jc","stopTracking","_valueTracker","mc","zc","yc","Ac","sc","pc","qc","xc","Bc","_debugOwner","_debugSource","Fc","Ec","Dc","Cc","Gc","acceptsBooleans","Hc","attributeName","attributeNamespace","mustUseProperty","Tc","Uc","Vc","_wrapperState","initialChecked","Wc","Xc","Yc","Zc","$c","ad","cd","bd","fd","gd","hd","jd","kd","ed","ld","nd","od","getModifierState","rd","xd","effectTag","yd","_reactInternalFiber","zd","Ad","Bd","Cd","Gd","Qd","bubbled","captured","isInteractive","Od","Pd","Ud","targetInst","containerInfo","topLevelType","Wd","Vd","Sd","Xd","Yd","Zd","Td","ae","ee","ce","be","de","ke","je","ie","he","me","contentEditable","ue","te","qe","selectionStart","selectionEnd","getSelection","anchorNode","anchorOffset","focusNode","focusOffset","pe","xe","pendingProps","memoizedState","updateQueue","memoizedProps","lastEffect","firstEffect","nextEffect","ze","Ae","Be","wc","tc","uc","vc","Ce","De","pendingChildren","Ge","He","isDisabled","supportsFiber","Ee","onCommitFiberRoot","Fe","onCommitFiberUnmount","Ie","Je","Ke","baseState","callbackList","hasForceUpdate","capturedValues","Le","Oe","Me","Ne","Pe","Qe","partialState","Re","isReplace","isForced","capturedValue","Se","Te","UNSAFE_componentWillReceiveProps","cacheContext","getMaskedContext","getUnmaskedContext","isContextConsumer","hasContextChanged","adoptClassInstance","callGetDerivedStateFromProps","constructClassInstance","mountClassInstance","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","resumeMountClassInstance","updateClassInstance","UNSAFE_componentWillUpdate","componentWillUpdate","Ve","_stringRef","We","Xe","Ue","$e","Ze","Ye","nc","pendingContext","shouldSetTextContent","shouldDeprioritizeSubtree","pushHostContext","pushHostContainer","pushProvider","pushContextProvider","pushTopLevelContextObject","invalidateContextProvider","enterHydrationState","Wa","resetHydrationState","Cb","tryToClaimNextHydratableInstance","Jc","Kc","Lc","Db","Mc","Eb","beginWork","hydrate","unstable_observedBits","af","createTextInstance","appendInitialChild","finalizeInitialChildren","prepareUpdate","persistence","getRootHostContainer","popHostContext","getHostContext","popHostContainer","popContextProvider","popTopLevelContextObject","popProvider","prepareToHydrateHostInstance","prepareToHydrateHostTextInstance","popHydrationState","completeWork","componentDidCatch","bf","throwException","unwindWork","unwindInterruptedWork","cf","suppressReactErrorLogging","df","getPublicInstance","commitMount","commitUpdate","resetTextContent","commitTextUpdate","appendChildToContainer","insertInContainerBefore","removeChildFromContainer","commitBeforeMutationLifeCycles","__reactInternalSnapshotBeforeUpdate","commitResetTextContent","commitPlacement","commitDeletion","commitWork","commitLifeCycles","commitErrorLogging","getDerivedStateFromCatch","componentStack","commitAttachRef","commitDetachRef","ff","ef","getChildHostContext","getRootHostContext","createCursor","gf","hydration","canHydrateInstance","canHydrateTextInstance","getNextHydratableSibling","getFirstHydratableChild","hydrateInstance","hydrateTextInstance","hf","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","isContextProvider","processChildContext","__reactInternalMemoizedMergedChildContext","findCurrentUnmaskedContext","jf","kf","checkThatStackIsEmpty","resetStackAfterFatalErrorInDev","lf","Ya","Nc","ya","pendingCommitExpirationTime","Oc","Za","za","Fb","xg","ye","Ic","Pc","yg","Gb","mg","Qc","lg","nextScheduledRoot","remainingExpirationTime","Hb","$a","Ib","Aa","_onComplete","wg","Ba","Jb","finishedWork","firstBatch","_expirationTime","_defer","zg","kg","we","Ag","hg","ig","jg","timeRemaining","Bg","scheduleDeferredCallback","cancelDeferredCallback","prepareForCommit","resetAfterCommit","Rc","recalculateCurrentTime","computeExpirationForFiber","requestWork","flushRoot","batchedUpdates","unbatchedUpdates","flushSync","flushControlled","deferredUpdates","syncUpdates","interactiveUpdates","flushInteractiveUpdates","computeUniqueAsyncExpiration","legacyContext","mf","createContainer","updateContainer","updateContainerAtExpirationTime","getPublicRootInstance","findHostInstance","findHostInstanceWithNoPortals","injectIntoDevTools","findFiberByHostInstance","findHostInstanceByFiber","qf","Ff","Gf","Hf","If","wasMultiple","multiple","Jf","Kf","Lf","Mf","Of","Pf","Sf","Vf","Tf","Xf","Wf","Yf","$f","topBlur","topFocus","topCancel","topClose","fe","Nf","cg","Zf","Rf","dg","eg","fg","ng","rg","_callbacks","_hasChildren","_didComplete","_children","sg","_didCommit","_onCommit","tg","_internalRoot","ug","vg","autoFocus","Dg","hasAttribute","Eg","_reactRootContainer","legacy_renderSubtreeIntoContainer","Fg","invokeGuardedCallback","hasCaughtError","clearCaughtError","Ca","plugins","eventNameDispatchConfigs","registrationNameModules","registrationNameDependencies","possibleRegistrationNames","injectEventPluginOrder","injectEventPluginsByName","Na","Ra","injection","getListener","runEventsInBatch","runExtractedEventsInBatch","Sa","precacheFiberNode","getClosestInstanceFromNode","getInstanceFromNode","getNodeFromInstance","getFiberCurrentPropsFromNode","updateFiberProps","accumulateTwoPhaseDispatches","accumulateTwoPhaseDispatchesSkipTarget","accumulateEnterLeaveDispatches","accumulateDirectDispatches","qb","eventPhase","isTrusted","persist","ub","yb","zb","Kb","beforeInput","compositionEnd","compositionStart","compositionUpdate","Rb","Tb","injectFiberControlledHostComponent","$b","enqueueStateRestore","needsStateRestore","restoreStateIfNeeded","datetime","tel","Sc","pd","_isInputEventSupported","qd","Alt","Meta","Shift","ud","screenX","screenY","vd","mouseEnter","mouseLeave","wd","Dd","animationName","elapsedTime","pseudoElement","Ed","clipboardData","Fd","Hd","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Id","39","45","46","112","113","114","115","116","117","118","119","120","121","122","123","144","145","224","Jd","Kd","dataTransfer","Ld","targetTouches","Md","Nd","deltaX","wheelDeltaX","wheelDeltaY","deltaZ","Rd","isInteractiveTopLevelEventType","$d","setEnabled","trapBubbledEvent","trapCapturedEvent","animationend","animationiteration","animationstart","transitionend","topAnimationEnd","topAnimationIteration","topAnimationStart","topChange","topClick","topCompositionEnd","topCompositionStart","topCompositionUpdate","topContextMenu","topCopy","topCut","topDoubleClick","topDrag","topDragEnd","topDragEnter","topDragExit","topDragLeave","topDragOver","topDragStart","topDrop","topInput","topKeyDown","topKeyPress","topKeyUp","topLoad","topLoadStart","topMouseDown","topMouseMove","topMouseOut","topMouseOver","topMouseUp","topPaste","topScroll","topSelectionChange","topTextInput","topToggle","topTouchCancel","topTouchEnd","topTouchMove","topTouchStart","topTransitionEnd","topWheel","topAbort","topCanPlay","topCanPlayThrough","topDurationChange","topEmptied","topEncrypted","topEnded","topError","topLoadedData","topLoadedMetadata","topPause","topPlay","topPlaying","topProgress","topRateChange","topSeeked","topSeeking","topStalled","topSuspend","topTimeUpdate","topVolumeChange","topWaiting","oe","ve","onSelect","SimpleEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","SelectEventPlugin","BeforeInputEventPlugin","nf","pf","rf","sf","tf","uf","requestIdleCallback","cancelIdleCallback","vf","wf","xf","yf","zf","Af","Bf","Cf","didTimeout","Df","Ef","mathml","Qf","MSApp","execUnsafeLocalFunction","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","orphans","tabSize","widows","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","Uf","menuitem","hr","keygen","wbr","setInitialProperties","diffProperties","updateProperties","diffHydratedProperties","diffHydratedText","warnForUnmatchedText","warnForDeletedHydratableElement","warnForDeletedHydratableText","warnForInsertedHydratedElement","warnForInsertedHydratedText","pg","qg","createBatch","focusedElem","selectionRange","removeAllRanges","addRange","didNotMatchHydratedContainerTextInstance","didNotMatchHydratedTextInstance","didNotHydrateContainerInstance","didNotHydrateInstance","didNotFindHydratableContainerInstance","didNotFindHydratableContainerTextInstance","didNotFindHydratableInstance","didNotFindHydratableTextInstance","Cg","Gg","createPortal","findDOMNode","unstable_renderSubtreeIntoContainer","unmountComponentAtNode","unstable_createPortal","unstable_batchedUpdates","unstable_deferredUpdates","unstable_flushControlled","EventPluginHub","EventPluginRegistry","EventPropagators","ReactControlledComponent","ReactDOMComponentTree","ReactDOMEventListener","unstable_createRoot","bundleType","rendererPackageName","Hg","Ig","ExecutionEnvironment","canUseWorkers","canUseEventListeners","canUseViewport","screen","isInWorker","getActiveElement","containsNode","innerNode","isTextNode","emptyFunctionWithReset","ReactPropTypesSecret","resetWarningCache","shim","propFullName","secret","getShim","arrayOf","elementType","objectOf","exact","Stringify","Parse","Utils","arrayPrefixGenerators","brackets","generateArrayPrefix","objKeys","arrayLimit","parameterLimit","parseValues","parseObject","cleanRoot","indexString","parseKeys","tempObj","isLeftClickEvent","isModifiedEvent","clickResult","allowTransition","getActiveState","activeClassName","getHref","activeStyle","_updateHistoryLength","_notifyChange","getPathname","getParams","getRoutes","ReactComponent","validateMethodOverride","isAlreadyDefined","specPolicy","ReactClassInterface","ReactClassMixin","mixSpecIntoComponent","autoBindPairs","__reactAutoBindPairs","MIXINS_KEY","RESERVED_SPEC_KEYS","isReactClassMethod","shouldAutoBind","createMergedResultFunction","createChainedFunction","mixStaticSpecIntoComponent","isReserved","ReactClassStaticInterface","mergeIntoWithNoDuplicateKeys","bindAutoBindMethod","bindAutoBindMethods","autoBindKey","createClass","ReactClassComponent","injectedMixins","IsMountedPreMixin","IsMountedPostMixin","updateComponent","_assign","__isMounted","shouldUpdateScroll","prevState","getWindowScrollPosition","scrollHistory","getScrollPosition","_updateScroll","isValidChild","deepSearch","childRoute","runRouter","computeStateProps","WrappedComponent","_store_listener2","_handlers","_toImmutable","_handle","_bindActions","_isDispatching","_isHandled","_lastID","waitFor","_invokeCallback","_startDispatching","_stopDispatching","_pendingPayload","nullEntity","logo","fetched","getDraft","draftEntity","discardDraft","_lodashDeep2","_lodashDeep","initialValues","onSubmit","getProperties","propertyPath","parseStringPropertyPath","character","parsedPropertyPath","parsedPropertyPathPart","escapeNextCharacter","insideBrackets","SyntaxError","createDeepPluckStyleCallback","originalFunction","isArrayKey","deepIn","deepHas","deepOwn","deepSet","currentObject","deepDefault","deepCall","deepApply","deepEscapePropertyName","deepMapValues","deepMapValuesIteratee","deepPluck","deepFindIndex","deepFindLastIndex","deepFirst","deepFlatten","deepInitial","deepLast","deepLastIndexOf","deepRemove","deepRest","deepSortedIndex","deepUniq","deepCountBy","deepEvery","deepFilter","deepFind","deepGroupBy","deepIndexBy","deepMax","deepMin","deepReject","deepSome","deepSortBy","deepFindKey","deepFindLastKey","deepSetValue","deepGetValue","deepGetOwnValue","_field2","renderFieldSet","toggleLabel","toggleLabelIcon","handleToggle","true","false","toggleClasses","onKeyPress","aria-checked","TextAreaField","_calendar2","_dropdown2","formatDisplayDate","selectedText","handleDateChanged","setSelectedText","webpackContext","webpackContextResolve","_reactAddonsPureRenderMixin2","_reactAddonsPureRenderMixin","_event_utils2","_event_utils","_slider_handle2","_slider_handle","_slider_range2","_slider_range","PureRenderMixin","handleClasses","rangeWidth","labelWidth","onSliderStart","onSliderMove","onSliderEnd","onSliderClick","handles","focusedHandle","handleWidth","getValues","zindex","sliderRef","labelRef","onDown","sliderClasses","overlapping","handleDown","handleUp","getValueFromPosition","getPositionFromValue","sliding","getHandlePosition","handleMove","newPosition","limitHandlePosition","getRelativePosition","normalizeValue","getMinValue","getMaxValue","setHandlePosition","willHandleOverlap","updateValueAtIndex","valueCopy","rangeX","eventUtils","otherHandle","notifySliderStart","notifySliderMove","notifySliderEnd","notifySliderClick","getXPosition","SliderHandle","SliderRange","_search_dropdown2","_search_dropdown","onSelectResult","containerNode","itemNode","itemTop","itemBottom","onInputChange","onKeyDown","onBlur","activeIndex","onHoverResult","onClickResult","resultsRef","SearchDropdown","_search_results2","_search_results","heading","SearchResults","_search_result_item2","_search_result_item","onHover","SearchResultItem","onMouseEnter","checkButtonClasses","defaultTitle","defaultDescription","_overlays2","confirmButtonModifiers","confirmButtonClasses","modal","MultiLinePrompt","textarea","flashIcon","flashClasses","closeFlash","onAction","alertClass","subMessage","handleCancel","isProcessing","progressClass","handleColumnClick","tableClasses","layout_data","data-columnkey","rowError","rowTitle","rowClasses","data-rowid","handleCheckAll","CheckboxCell","handleCheck","unhideOnHover","Tab","Container","selectedTabIndex","selectedTabHandler","actionButtonLabel","actionButtonIcon","actionButtonHandler","minimal","actionButtonClass","handleTab","aria-selected","tabCount","isvisible","tabPanelClasses","avatarClassName","userImage","firstInitial","lastInitial","descriptionLabel","reportCardClassName","_numberToWords2","_numberToWords","FilterLink","itemKey","handleFilter","issuer","checkDate","checkNumber","recipient","dollarAmount","centsAmount","disclaimer","dollarsNoFormat","centsNoFormat","three","four","five","six","seven","eight","nine","eleven","twelve","toOrdinal","toWords","toWordsOrdinal","numberToWords","logoHeight","logoWidth","renderGraphic","Waypoint","xPos","yPos","waypointClassName","position_bottom","align_right","targetPosition","targetTop","targetLeft","waypointStyles","buttonLabel","waypoints","currentWaypoint","setCurrentWaypoint","bubbleClick","nextClick","_CSSTransitionGroupChild","_CSSTransitionGroupChild2","_PropTypes","_wrapChild","appearTimeout","enterTimeout","leaveTimeout","getValueForKey","nextKeysPending","pendingKeys","prevKey","childMapping","nextKey","pendingNextKey","addEndListener","_addClass","_addClass2","_removeClass","_removeClass2","_requestAnimationFrame","_requestAnimationFrame2","_properties","transitionEnd","animationEnd","CSSTransitionGroupChild","classNameAndNodeQueue","transitionTimeouts","unmounted","animationType","finishCallback","removeListeners","queueClassAndNode","rafHandle","flushClassNameAndNodeQueue","_hasClass","replaceClassName","origClass","classToRemove","compatRaf","_inDOM","vendors","raf","getKey","vendor","rafKey","animationDelay","animationTiming","animationDuration","transitionDuration","transitionDelay","transitionTiming","transitionProperty","_getTransitionPropert","vendorMap","Moz","Webkit","timing","ReportApp","StoreListener","settingsPanelOpen","getStateFromStore","currentEntity","nextEntity","loadReports","handleMakeDefaultReport","confirm","confirmed","makeDefaultReport","handleOpenSettingsPanel","handleCloseSettingsPanel","default_report_id","handleReportsLoaded","loadLegacyReport","setReportRoute","loadDefaultReport","onCloseSettingsPanel","onOpenSettingsPanel","onMakeDefaultReport","date_updated","date_created","_chart_of_accounts2","_chart_of_accounts","_async2","_async","_report_preferences_actions2","_report_preferences_actions","_css_transition_defaults2","_css_transition_defaults","_reactTreeview2","_reactTreeview","_event_observer_mixin2","_event_observer_mixin","_locked_report_creation_modal2","_locked_report_creation_modal","_create_new_report_button2","_create_new_report_button","_link_to_civicdashboards_button2","_link_to_civicdashboards_button","_modal_store2","_modal_store","_report_preferences_store2","_report_preferences_store","_report_welcome_modal2","_report_welcome_modal","_template_fixtures2","_template_fixtures","_report_index_nav2","_report_index_nav","_search2","_filter2","_sort2","_sort","_list2","_show2","_show","_report_index_item2","_report_index_item","_toggle_edit_keyword2","_toggle_edit_keyword","cookieExpires","confirmationMessage","ReportNavActions","civicDashboardsEnabled","coas","canCreateReport","newReportHref","toggleLockedReportCreation","ReportIndex","userRole","dashboardsEnabled","can","handleCoaChange","chartId","filteredReports","templatesLabel","handleShowTemplates","reportIndexClassnames","sortedReports","reportViewType","newReportingEnabled","searchInput","onHandleUserInput","handleUserInput","handleSorting","setSortOrder","checkedKeywords","onHandleManageKeywords","handleManageKeywords","onHandleChangeKeywords","handleChangeKeywords","onHandleChangeVisibility","handleChangeVisibility","changeReportViewType","ReportIndexListColumnHeaders","toggleEditKeywordsMode","isEditKeywordsMode","renderReports","loadingHideTemplates","nodeLabel","collapsed","showTemplates","renderReportTemplates","lockedReportCreationModal","closeModal","buildCookieName","formatSearchInput","performFiltering","first_name","last_name","positionMainPanel","initialTop","$window","scrollCallback","$node","windowTop","mainPanelTop","fetchReports","updateDocumentTitle","getUniqueKeywords","saveKeywordsOnDone","getActiveReportId","isUnsavedKeywords","saveKeywordsAction","updateReport","postSaveKeywords","addedKeywordsReport","deletedKeywordsReport","saveKeywords","addKeywords","deleteKeywords","unSavedKeywords","updateKeywords","setUpdatedReportKeywords","updatedReportKeywords","wrapperClass","isNotFiltering","shouldShowWelcome","ReportTemplateWelcomeItem","onMouseLeave","handleMouseLeave","handleMouseEnter","templates","ReportTemplateItem","hideTemplates","getTemplatePreferences","checkedKeywordsCookies","hoveredReport","confirmUnsavedChanges","beforeUnload","ldChangeHandler","ldIt","ldInitialize","launchDarklyKey","currentEntityId","client","uniqueKeywords","is_default","imageUrl","exampleUrl","downloadUrl","only_once","previous_async","_toString","_reduce","eachSeries","forEachSeries","eachLimit","_eachLimit","forEachLimit","replenish","doParallel","doParallelLimit","doSeries","_asyncMap","eachfn","mapSeries","mapLimit","_mapLimit","filterSeries","selectSeries","rejectSeries","_detect","main_callback","detectSeries","tasks","remainingTasks","taskComplete","theCallback","taskCallback","safeResults","rkey","requires","attempts","wrappedTask","wrappedCallback","wrappedResults","finalAttempt","seriesCallback","waterfall","wrapIterator","_parallel","parallelLimit","makeCallback","_concat","concatSeries","whilst","doWhilst","doUntil","_insert","drain","saturated","workers","kill","idle","priorityQueue","_compareTasks","_binarySearch","sequence","beg","cargo","working","drained","_console_fn","queues","unmemoized","unmemoize","timesSeries","newargs","nextargs","_applyEach","go","applyEach","applyEachSeries","forever","registerImmediate","runIfPresent","currentlyRunningATask","attachTo","postMessageIsAsynchronous","oldOnMessage","messagePrefix","onGlobalMessage","ReportPreferencesActions","reports_preferences","collapsed_preview_templates","deleteKeywordParams","_apiUrl","_middleware","_request","middleware","lastArgument","popArgument","createPromise","requestError","lut","maxAttempts","intervalFunction","retryCondition","exponential","currentAttempts","nextInterval","doRetry","attemptsRemaining","isSocketError","isPost","isServerError","isClientError","initTick","_objectWithoutProperties","TreeView","defaultCollapsed","_props","_props2","_props2$collapsed","_props2$className","_props2$itemClassName","itemClassName","_props2$treeViewClassName","treeViewClassName","_props2$childrenClassName","childrenClassName","arrowClassName","containerClassName","arrow","IconBlock","LockedReportCreationModal","interest","handleInterest","CreateNewReportButton","buttonStyle","boxShadow","svgStyle","svgPathStyle","LinkToCivicDashboardsButton","xmlnsXlink","xmlSpace","initialPreferencesState","ReportPreferencesStore","HIDE_TEMPLATES","_cookie_helper2","_cookie_helper","ReportWelcome","_hideModal","_includesAdmin","entityAdminContent","entityUserContent","projectId","appid","forceSSL","isObjectTypeTag","getLocationHref","triggerEvent","eventType","hasDocument","createEventObject","hasKey","RavenConfigError","parseDSN","dsnPattern","dsn","dsnKeys","handleStackInfo","stackInfo","frames","normalizeFrame","processException","lineno","normalized","colno","extractContextFromFrame","in_app","includePaths","fetchContext","pivot","isMinified","fileurl","stacktrace","fullMessage","ignoreErrors","ignoreUrls","whitelistUrls","objectMerge","culprit","obj1","obj2","trimPacket","maxMessageLength","getHttpData","httpData","referrer","Referer","baseData","globalProject","platform","tags","globalContext","serverName","server_name","shouldSendCallback","lastEventId","uuid4","logDebug","isSetup","makeRequest","globalServer","sentry_version","sentry_client","sentry_key","globalKey","sentry_data","newImage","urlencode","onabort","hasJSON","ravenNotConfiguredError","joinRegExp","crypto","msCrypto","getRandomValues","originalConsoleMethods","originalConsole","_slice","mergeContext","TraceKit","remoteFetching","collectWindowErrors","linesOfContext","UNKNOWN_FUNCTION","installGlobalHandler","unsubscribeAll","uninstallGlobalHandler","notifyHandlers","isWindowError","traceKitWindowOnError","lineNo","colNo","lastExceptionStack","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","guessFunctionName","gatherContext","_oldOnerrorHandler","_onErrorHandlerInstalled","_lastExceptionStack","_lastArgs","lastException","rethrow","incomplete","uninstall","loadSource","sourceCache","reFunctionArgNames","reGuessFunction","linesBefore","linesAfter","escapeCodeAsRegExpForMatchingInsideHTML","findSourceInUrls","findSourceInLine","findSourceByFunctionBody","codeRE","eventRE","computeStackTraceFromStackProp","winjs","columnNumber","computeStackTraceFromStacktraceProp","testRE","exc","computeStackTraceFromOperaMultiLineMessage","lineRE1","lineRE2","lineRE3","inlineScriptBlocks","relativeLine","midline","computeStackTraceByWalkingCallerChain","recursion","lastCapturedException","_Raven","isRavenInstalled","lastSlash","plugin","__raven__","__inner__","captureMessage","ex1","addPlugin","setExtraContext","setTagsContext","clearContext","setRelease","setDataCallback","setShouldSendCallback","setTransport","setReleaseContext","MaskActions","coaId","getMasksComplete","coa_masks","eachFiscalMonth","eachPreviousFiscalMonth","initialMonth","LineTotalType","_render_line2","_render_line","_budget_node2","_budget_node","_formulas2","_formulas","revenueLineColor","expenseLineColor","defaultNodeSortBy","buildTrees","buildDataSets","currentColor","annotatedNodes","report_preferences","syncStoreState","setSelectionState","ancestorNodes","ungrouped","uncheckSiblings","nodeIds","sortByName","sortByCoa","hasNoAggregations","excludeNodes","isAccountTypeTree","nodesGroupedByDepth","depths","eachDescendant","eachAggregationNode","getBreakdownTree","primaryTitle","titleNode","partiallySelected","secondaryTitle","showAllAccounts","breakdownByAccount","treeList","selectRootMostCheckedNodes","siblingNodes","deselect","selectedLeavesByTree","leafReducer","currentAccountType","nodeList","long_id","includedLedgerTypes","selectedNodes","collectSelectedNodes","annualDataSets","chainProjectedDataSets","projectedDataSetsByYear","previousDataSetIdByYearAndMonth","previousMonthIndex","monthIndex","prevProjectedDataSetId","chainProjectedDataSetsToActuals","sortedDataSetsByYear","getSortingIndex","actualsByYear","overlappingProjectionsByYear","lastActualDataSetId","lastOverlappingProjectionDataSetId","isProjectionsEnabled","fixProjectedDataSets","monthlyDataSetExists","returnDataSets","orderedDataSets","dataSetsByMonth","existingActualMonths","lastActualYearPresent","monthToPeriod","hasAggregations","accountTypeAggregations","alignCategories","subamounts","ytdMultiplier","deltaMultipliers","titleNodes","titleNodeIds","forcedDepth","adjustVirtualAggregateNodeAmounts","reaggregateBreakdownAmounts","applyTitleColor","alignAmountsByDepth","amountKeys","buildLines","parentAmounts","selectedCheck","breakDownAmounts","deltaMultiplier","originalIds","remapIds","dsValues","minDepth","assignAmounts","currentAmounts","allowAccumulate","currentAmount","parent_id","partialChildCount","selectedChildCount","leafAmounts","varianceFormula","includeDelta","budgetVsActualVariance","nodeAmounts","aggregateAmounts","aggregateData","itemSelected","dataSelected","scalesByYear","renderLineAmount","varianceValue","computeVarianceTotals","totalVarianceAccountType","isBudget","previousTotal","currentTotalAmount","previousTotalAmount","budget","typeYearMonths","actualMonths","pkgDataSet","multiFieldSort","sortMonthsByFiscalYear","previousDataSetId","objArr","hasMonthlyData","accountTypeTree","treeDeltaMultipliers","treeColors","accountTrees","budgetTree","buildNodes","nodeByCode","buildRootNodes","nodeValidWithAccountType","findTreeByName","removeBreakdown","enabledNodes","subTree","annotations_account_codes","codeIdentifier","account_code","secondaryNodes","dataSetAnnotations","buildNode","codesLineage","createChild","hasCodes","permuteArrays","codeChain","childId","perm","accounts","htmlColor","aggregateNodeData","nodeAggregations","prorate","previousValue","previousProjectedValue","previousAmount","findLastActualOrProjectedForThisYear","shouldComputeVariance","currentIndex","amountUnit","baseColor","alphaBlend","blend","BudgetNode","setParent","hasSelectedDescendants","childCount","findActiveChild","leaves","collectLeaves","fromParent","setChildSelectionStates","setParentSelectionStates","setImplicitSelectionState","preferences","_preferences","Formulas","formula","_handlebarsSafeString2","_handlebarsException2","VM","runtime","_handlebarsBase","_handlebarsSafeString","_handlebarsException","_handlebarsUtils","_handlebarsRuntime","_handlebarsNoConflict","_handlebarsNoConflict2","inst","_helpersBlockHelperMissing2","_helpersEach2","_helpersHelperMissing2","_helpersIf2","_helpersLog2","_helpersLookup2","_helpersWith2","_helpersBlockHelperMissing","_helpersEach","_helpersHelperMissing","_helpersIf","_helpersLog","_helpersLookup","_helpersWith","execIteration","priorKey","conditional","includeZero","_decoratorsInline2","_decoratorsInline","lookupLevel","levelMap","checkRevision","compilerInfo","compilerRevision","currentRevision","_base","runtimeVersions","compilerVersions","templateSpec","invokePartialWrapper","resolvePartial","invokePartial","compilerOptions","_setup","useData","initData","useBlockParams","useDepths","executeDecorators","decorator","main_d","compiler","lambda","programs","declaredBlockParams","programWrapper","wrapProgram","nullContext","isTop","usePartial","useDecorators","_child","prog","currentDepths","currentPartialBlock","partialBlock","Handlebars","$Handlebars","depth0","stack1","unless","helper","alias1","alias2","helperMissing","alias3","alias4","column_name","group_name","initialLoad","friendlyName","operatorLabel","valueLabel","clearDisabled","searchAll","applyDisabled","enableAll","numericColumn","monetaryColumn","textColumn","percentColumn","filesize","full","fullforms","spacer","standard","fullform","iec","jedec","cssString","hsv","cmyk","getRgba","setValues","getHsla","setSpace","rgbArray","hslArray","hsvArray","cmykArray","rgbaArray","hslaArray","setChannel","hue","lightness","saturationv","hexString","rgbString","percentString","hslString","hslaString","luminosity","lum","chan","color2","lum1","lum2","dark","lighten","desaturate","greyscale","clearer","opaquer","mix","weight1","weight2","rgb2","maxes","chans","sname","capped","rgb2hsl","rgb2hsv","rgb2cmyk","rgb2keyword","reverseKeywords","rgb2xyz","rgb2lab","xyz","hsl2rgb","hsl2hsv","hsl2cmyk","hsl2keyword","hsv2rgb","hsv2hsl","sl","hsv2cmyk","hsv2keyword","cmyk2rgb","cmyk2hsl","cmyk2hsv","cmyk2keyword","xyz2rgb","keyword2rgb","cssKeywords","keyword2hsl","keyword2hsv","keyword2cmyk","getRgb","getHsl","getAlpha","hexDouble","percentaString","hsla","POSTGRES_LIMIT","breakdownByField","gridState","getGridState","hasMultipleTicks","getDateLimitsFromFilterState","min_value","max_value","getDateBounds","dateRange","dateRangeLength","hasDateBoundsAdjusted","alternatePartitioningColumnName","findAlternateDateColumnForPartitioning","baseQuery","group_by_year_month","strategy","createSumAcrossGroupsReducer","planOptions","branches","calendarAligned","partitionColumnName","isExactlyOneYear","isFiscalYearAligned","hasLeapDay","group_by","group_by_body","dateRangeExactlyOneYear","dateRangeContainsLeapYear","hasMultipleFiscalYears","dateRangeFilter","nMonths","monthPairList","generateMonthPairList","partitionByMonthQueriesOnDateColumn","createPartitionCompletenessMapper","parallelMonthQueriesOnDateColumn","visAggQueryObject","fiscalYearForDatasetDateRange","parallelYearQueriesOnDateColumn","parallelDateRangeFilterQueries","generateDateRangePairs","year_month_pairs","partitioningDateColumnName","appendedDateColumnFilter","partialTransactions","periodGroup","avgField","minField","maxField","transactionsCleaned","transactionsGrouped","resultGroup","retGroup","groupName","sortedGroups","aggregated","defaultDateColumn","trickyFilters","dateToMoment","MINIMUM_PARALLELISM","dateColumnFilter","rangeOfMoments","schemaDateRange","schemaDateRangeLength","generateMonthPair","isStart","isEnd","monthPair","generated","endYear","containsLeapYear","startMoment","endMoment","granularity","fiscalYearOffset","startMomentMonth","yearLength","googleTranslateAPI","searchableItems","trimAndFilterText","_fuse","_fuse2","Fuse","deepValue","firstSegment","dotIndex","BitapSearcher","maxPatternLength","caseSensitive","patternLen","matchmask","patternAlphabet","_calculatePatternAlphabet","MULTI_CHAR_REGEX","shouldSort","searchFn","sortFn","getFn","verbose","resultMap","_keyMap","_prepareSearchers","_startSearch","_computeScore","_format","tokenSearchers","fullSeacher","listLen","keysLen","_analyze","scores","existingResult","averageScore","finalScore","scoresLen","mainSearchResult","tokenSearcher","termScores","tokenSearchResult","matchedIndices","totalScore","scoreLen","bestScore","nScore","replaceValue","getItemAtIndex","finalOutput","_item","_result","_bitapScore","accuracy","proximity","textLen","bestLoc","binMin","binMid","binMax","bitArr","lastBitArr","charMatch","locations","isMatched","matchMask","matchesLen","_getMatchedIndices","TemplateFixture","onTabChange","ReportIndexNav","Group","activeTabIndex","onTabIndexChanged","Option","dataTest","Badge","variant","_Tab","TabGroup","onTabClicked","tabIndexClicked","numTabsInGroup","TabOption","_classnames3","isFirstTab","isActiveTab","isLeftOfActiveTab","isRightOfActiveTab","isInactiveTab","_Badge","inlineStyle","_colorUtils","_tokens","getMonochromeVizColors","datapoints","startingHue","currentHue","hues","currentData","valueArray","startValue","getVizColors","orderRepeat","hoverColor","highlightColor","ReportIndexHeader","ReportIndexSearch","_filter_options2","_filter_options","toggleDropdown","getCheckedKeywordCount","ReportIndexFilter","mappedKeywords","searchQuery","handleOptionCancel","targetDropdown","_unsubscribeDOMEvents","_subscribeDOMEvents","generateKeywordsMap","toggleKeywords","checkedKeywordsMap","FilterOption","dropDownStyle","filteredKeywords","ReportIndexSort","ReportIndexList","ReportIndexShow","_share_icons2","_share_icons","_report_list_view2","_report_list_view","permissionDescriptions","private","my_organization","network","public","ReportIndexItem","permissionDescription","reportKeywords","_edit_keywords_panel2","_edit_keywords_panel","ReportListView","buildKeywords","_keywords_search2","_keywords_search","addedKeywords","addedKeywordsState","removedKeywords","EditKeywordsPanel","removeKeywords","KeywordLabels","keywordClasses","keywordPillStyle","keywordExist","handleSearchClick","searchRef","focusInput","handleBackSpace","labelBoxRef","renderKeywords","getResults","handleOnBlur","KeywordSearch","_React$Component2","searchItems","searchLastItem","LabelBoxStyle","keywordsSearchBox","ToggleEditSaveKeywords","_asyncToGenerator","sessionToLDUser","selectedEntityId","isLdAvailable","ldEnvKey","changeHandler","renderedProperties","backboneReportProperties","_summary_report2","_summary_report","_report_panel2","_report_panel","_password2","_password","_editor_footer2","_editor_footer","_handle_jquery_ajax_error2","_handle_jquery_ajax_error","_settings_panel2","_settings_panel","LegacyRouter","StoryActions","_stories_store2","_stories_store","_trapi_middleware2","_trapi_middleware","ReportView","editingReport","isEditingData","wizardFlow","getWizardFlow","getHasValidData","getActiveSidebar","creating","reportEntity","ReportComponent","reportClassName","report_container","GridReport","configAlertMessage","handleSaveDefaultState","editReport","selectedReport","flowKey","onWizardComplete","handleReportWizardComplete","handleCloseReportPanel","scalePerCapitaEnabled","editingDefaultState","onStateChange","handleStateChange","onDataSetChange","handleDataSetChange","onCoaMaskChange","handleCoaMaskChange","onParamsChange","setReportParams","onLoaded","handleReportLoaded","isReloaded","reloaded","showPasswordModal","accessCode","authorizeReport","isReportInitialized","reportTypeLabel","reportApplicationLabel","scrollPosition","setEntity","fetchStories","handleReportPropertiesUpdate","presentReport","director","setRoute","defaultReport","currentReportState","isEditingDataSets","isTriggeredFromSummaryReport","noTimeout","$report","$panel","$footer","viewportHeight","footerTop","triggerPoint","_griddle2","_griddle","_footer2","_footer","_report_header2","_report_header","_amounts_type_menu2","_amounts_type_menu","_amount_menu2","_amount_menu","_aggregate_visualization2","_aggregate_visualization","_visualization_button2","_visualization_button","_grid_header_actions2","_grid_header_actions","_feedback2","_feedback","_target_toggle2","_target_toggle","_target_panel2","_target_panel","_target_status2","_target_status","_document_list2","_document_list","_check_panel2","_check_panel","_modal_gridhowto2","_modal_gridhowto","_termsOfService2","_termsOfService","_banner2","_banner","_budget2","_budget","_welcome_modal2","_welcome_modal","_summary_welcome2","_summary_welcome","_config2","_grid_break_down_dropdown2","_grid_break_down_dropdown","_grid_report_total2","_grid_report_total","_email_export_filter2","_email_export_filter","_summary_table2","_summary_table","_sidebar2","_sidebar","_filterButtons2","_filterButtons","onboardingWaypoints","CheckLoadError","transactionQueryToggle","logHeaderAction","createActionHandler","gridReport","showAmountColumnPanel","showBreakdownsSettingsPanel","welcomeModal","griddleState","entityHasWelcomeDisabled","lastPageviewParams","summaryWelcomeModal","gridReportSchema","reportCurrentFilter","feedbackError","feedbackErrorMessage","handleDefaultStateChange","onGriddleStateChange","setReportState","scrollToInitialRowPosition","currentGriddleState","getReportState","isFirstRenderComplete","closeWelcomeModal","renderAlert","GridStateNotFoundAlert","GridStateUnexpectedErrorAlert","calculateCurrentTotal","isCumulative","renderedAggregates","generateTotalComponent","griddleStateAmount","calculatedTotal","totalString","handleCloseDownloadPanel","columnOnClick","bannerHeight","banner","WelcomeModalComponent","currentTotal","canShowSummaryTable","tableAggregates","renderedTableAggregates","tabName","embedMainContentStyle","embedMainPanelStyle","embedTableStyle","embedVizStyle","feedbackModal","menuItems","toggleAll","addFilter","removeFilter","closePanel","isPanelOpen","isVisShown","filterMenu","aggregatesData","QueryGrid","QueryGridLoader","summaryLoading","startTour","openFeedbackModal","visibleColumnIds","_filter_menu2","_filter_menu","_querygrid2","_querygrid","_remotemodel2","_remotemodel","_checkbook_contextmenu2","_checkbook_contextmenu","_contextmenu2","_contextmenu","_facetpanel2","_facetpanel","_headermenu2","_headermenu","_filterspanel2","_filterspanel","_columnspanel2","_columnspanel","isCheckImageVisible","Athena","initialRow","errorModal","schemaLoaded","_previousAmountColumn","_previousGraphType","viewCheckDetails","updateGriddle","notifyStateChange","fetchDataHandler","handleResize","showErrorModal","getColumnProperties","initGrid","responseTotal","loadTotal","columnSettings","schemaColumns","refetchTransactions","gridReportState","chartTypePie","_previousFilter","_totalRequest","onViewportChanged","headerMenuPlugin","check_image_visible","contextMenuPlugin","createContextMenu","filtersPanel","isOpened","columnsPanel","facetPanel","widgets","ColumnsPanel","AggregatesPanel","FiltersPanel","ColumnMenu","isCheckVisible","updateContextMenu","onDataLoaded","_pendingReportState","griddleContainer","summaryGridContainer","calculatedHeight","visibleColumnsCount","getVisibleColumnsCount","resizeCanvas","_updatingState","setGraphType","_didChangeState","resetFilters","filterClear","scrollRow","loadRows","onQueryChange","emptyTransactionsQuery","isQueryOptimizationEnabled","openPanelCount","closeAll","openAll","getOffsets","rpercent","parseCss","getDimensions","outerWidth","cachedScrollbarWidth","rhorizontal","rvertical","roffset","innerDiv","getScrollInfo","isDocument","hasOverflowX","getWithinInfo","withinElement","atOffset","targetWidth","targetHeight","targetOffset","basePosition","scrollInfo","horizontalOffset","verticalOffset","collisionPosition","elemWidth","elemHeight","collisionWidth","collisionHeight","myOffset","offsetFractions","horizontal","vertical","important","fit","newOverRight","withinOffset","collisionPosLeft","overLeft","overRight","newOverBottom","collisionPosTop","overTop","overBottom","newOverLeft","newOverTop","flipfit","testElementParent","testElementStyle","isOverAxis","connectWith","containment","cursorAt","dropOnEmpty","forcePlaceholderSize","forceHelperSize","revert","scrollSensitivity","scrollSpeed","beforeStop","receive","containerCache","_mouseInit","_mouseDestroy","_mouseCapture","overrideHandle","validHandle","reverting","_refreshItems","_removeCurrentsFromItems","_mouseStart","noActivation","currentContainer","refreshPositions","_createHelper","_cacheHelperProportions","_cacheMargins","scrollParent","margins","_getParentOffset","_getRelativeOffset","cssPosition","originalPosition","_generatePosition","originalPageX","originalPageY","_adjustOffsetFromHelper","domPosition","_createPlaceholder","_setContainment","storedCursor","storedStylesheet","_storedOpacity","_storedZIndex","overflowOffset","_uiHash","_preserveHelperProportions","ddmanager","dropBehaviour","prepareOffsets","_mouseDrag","itemElement","scrolled","positionAbs","_convertPositionTo","lastPositionAbs","_intersectsWithPointer","_intersectsWithSides","_rearrange","_contactContainers","_mouseStop","noPropagation","_clear","_mouseUp","_storedCSS","_noFinalSort","_getItemsAsjQuery","connected","_intersectsWith","helperProportions","dyClick","dxClick","isOverElementHeight","isOverElementWidth","isOverElement","forcePointerForContainers","verticalDirection","_getDragVerticalDirection","horizontalDirection","_getDragHorizontalDirection","isOverBottomHalf","isOverRightHalf","_connectWith","addItems","targetData","_queries","queriesLength","toleranceElement","refreshContainers","innerHeight","innerWidth","itemWithLeastDistance","posProperty","sizeProperty","nearBottom","innermostContainer","innermostIndex","po","co","scrollIsRootNode","hardRefresh","delayEvent","delayedTriggers","fromOutside","cancelHelperRemoval","_inst","sender","isTabIndexNotNaN","mapName","runiqueId","BACKSPACE","COMMA","DELETE","DOWN","END","ENTER","ESCAPE","HOME","NUMPAD_ADD","NUMPAD_DECIMAL","NUMPAD_DIVIDE","NUMPAD_ENTER","NUMPAD_MULTIPLY","NUMPAD_SUBTRACT","PAGE_DOWN","PAGE_UP","PERIOD","SPACE","TAB","UP","removeUniqueId","dataName","tabbable","isTabIndexNaN","selectstart","disableSelection","enableSelection","hasScroll","mouseHandled","_mouseDown","_mouseMoveDelegate","_mouseUpDelegate","_mouseStarted","_mouseDownEvent","btnIsLeft","elIsCancel","mouseDelayMet","_mouseDelayTimer","_mouseDistanceMet","_mouseDelayMet","_mouseMove","$event","$special","datakey","dontstart","textselect","propagates","interactions","interaction","hijack","live","droppable","cancelled","startY","originalX","originalY","unselectable","locate","$dispatch","touchHooks","touchcancel","draginit","dragend","EventData","EventHandler","fromRow","fromCell","toRow","toCell","isSingleRow","isSingleCell","NonDataItem","__nonDataRow","__group","groupingKey","GroupTotals","__groupTotals","EditorLock","activeEditController","editController","commitCurrentEdit","cancelCurrentEdit","SlickGrid","maxSupportedCssHeight","getMaxSupportedCssHeight","scrollbarDimensions","measureScrollbar","validateAndEnforceOptions","columnDefaults","defaultColumnWidth","columnsById","$focusSink","$headerScroller","$headers","getHeadersWidth","$headerRowScroller","$headerRow","$headerRowSpacer","getCanvasWidth","$topPanelScroller","$topPanel","showTopPanel","showHeaderRow","$viewport","autoHeight","$canvas","$focusSink2","explicitInitialization","finishInitialization","viewportW","measureCellPaddingAndBorder","enableTextSelectionOnCells","updateColumnCaches","createColumnHeaders","setupColumnSort","createCssRules","bindAncestorScrollEvents","handleScroll","handleHeaderContextMenu","handleHeaderClick","handleHeaderMouseEnter","handleHeaderMouseLeave","handleHeaderRowScroll","handleKeyDown","handleDblClick","handleDragInit","handleDragStart","handleDrag","handleDragEnd","handleMouseWheel","unregisterPlugin","selectionModel","handleSelectedRangesChanged","getSelectionModel","getCanvasNode","headersWidth","availableWidth","viewportHasVScroll","rowWidth","fullWidthRows","updateCanvasWidth","forceColumnWidthsUpdate","oldCanvasWidth","canvasWidth","viewportHasHScroll","applyColumnWidths","$target","supportedHeight","testUpTo","$elem","$boundAncestors","handleActiveCellPositionChange","unbindAncestorScrollEvents","updateColumnHeader","toolTip","columnDef","$header","onBeforeHeaderCellDestroy","onHeaderCellRendered","getHeaderRow","getHeaderRowColumn","onBeforeHeaderRowCellDestroy","headerColumnWidthDiff","headerCssClass","headerRowCell","onHeaderRowCellRendered","sortColumns","setupColumnResize","setupColumnReorder","$col","getEditorLock","sortOpts","defaultSortAsc","reorderedIds","reorderedColumns","columnElements","minPageX","maxPageX","firstResizable","lastResizable","resizable","forceFitColumns","shrinkLeewayOnRight","stretchLeewayOnRight","absoluteColumnMinWidth","shrinkLeewayOnLeft","stretchLeewayOnLeft","actualMinWidth","applyColumnHeaderWidths","newWidth","rerenderOnResize","invalidateAllRows","getVBoxDelta","headerColumnHeightDiff","cellWidthDiff","cellHeightDiff","$style","topPanelHeight","headerRowHeight","styleSheet","getColumnCssRules","sheets","styleSheets","ownerNode","owningElement","sheet","columnCssRulesL","columnCssRulesR","columnIdx","cssRules","selectorText","removeCssRules","onBeforeDestroy","editorLock","getEditController","prevTotal","widths","shrinkLeeway","availWidth","shrinkProportion","absMinWidth","shrinkSize","growProportion","growSize","currentWidth","reRender","setSortColumn","headerColumnEls","getSortColumns","selectedRows","canCellBeSelected","selectedCellCssClass","setCellCssStyles","onSelectedRowsChanged","columnPosLeft","columnPosRight","columnDefinitions","makeActiveCellNormal","invalidateRow","leaveSpaceForNewRows","updateRowCount","getDataLengthIncludingAddNew","getTopPanel","setTopPanelVisibility","setHeaderRowVisibility","getRowTop","getRowFromPosition","viewportH","oldOffset","ph","cj","newScrollTop","cleanupRows","getVisibleRange","updateRowPositions","prevScrollTop","vScrollDir","lastRenderedScrollTop","dataContext","rowMetadata","getItemMetadata","columnOverrides","formatterFactory","getEditor","columnMetadata","editor","editorFactory","getDataItemValueForColumn","dataItemColumnValueExtractor","appendRowHtml","stringArray","dataLoading","rowCss","activeRow","addNewRowCssClass","cssClasses","colspan","leftPx","rightPx","appendCellHtml","cellCss","activeCell","cellCssClasses","rowsCache","cellRenderQueue","cellColSpans","rangeToKeep","removeRowFromCache","currentEditor","cacheEntry","rowNodeFromLastMouseWheelEvent","rowNode","zombieRowNodeFromLastMouseWheelEvent","postProcessedRows","renderedRows","counter_rows_removed","invalidateRows","rl","updateCell","cellNode","getCellNode","loadValue","invalidatePostProcessingResults","updateRow","ensureCellNodesInRowsCache","cellNodesByColumnIdx","getViewportHeight","numVisibleRows","lastRenderedScrollLeft","dataLengthIncludingAddNew","numberOfRows","oldViewportHasVScroll","activeCellNode","resetActiveCell","oldH","oldScrollTopInRange","viewportTop","viewportLeft","getRenderedRange","previousSibling","cleanUpCells","totalCellsRemoved","cellsToRemove","cellToRemove","cleanUpAndRenderCells","cellsAdded","processedRows","totalCellsAdded","btm","processedRow","renderRows","needToReselectCell","counter_rows_rendered","startPostProcessing","enableAsyncPostRender","h_postrender","asyncPostProcessRows","asyncPostRenderDelay","postProcessFromRow","postProcessToRow","h_render","vScrollDist","hScrollDist","prevScrollLeft","asyncPostRender","updateCellCssStylesOnRenderedRows","addedHash","removedHash","addedRowHash","removedRowHash","addCellCssStyles","onCellCssStylesChanged","removeCellCssStyles","prevHash","getCellCssStyles","flashCell","toggleCellClass","$cell","cellFlashingCssClass","cellExists","retval","onDragInit","onDragStart","onDrag","onDragEnd","navigatePrev","cancelEditAndSetFocus","navigatePageDown","navigatePageUp","navigateLeft","navigateRight","navigateUp","navigateDown","navigateNext","commitEditAndSetFocus","makeActiveCellEditable","setFocus","canCellBeActive","setActiveCellInternal","onContextMenu","onDblClick","gotoCell","onHeaderMouseEnter","onHeaderMouseLeave","onHeaderContextMenu","onHeaderClick","getCellFromPoint","getCellFromNode","getRowFromNode","getCellNodeBox","tabbingDirection","scrollCellIntoView","doPaging","getColspan","scrollRight","newCell","opt_editMode","activeCellChanged","activePosX","isCellPotentiallyEditable","h_editorLoader","asyncEditorLoadDelay","onActiveCellChanged","getActiveCell","clearTextSelection","cannotTriggerInsert","onBeforeCellEditorDestroy","onBeforeEditCell","gridPosition","absBox","commitChanges","cancelChanges","serializedEditorValue","serializeValue","getActiveCellPosition","getGridPosition","onActiveCellPositionChanged","cellBox","getCellEditor","getActiveCellNode","rowAtTop","rowAtBottom","scrollRowToTop","scrollPage","deltaRows","prevCell","prevActivePosX","findFirstFocusableCell","findLastFocusableCell","lastFocusableCell","gotoRight","posX","gotoLeft","firstFocusableCell","gotoDown","gotoUp","gotoNext","gotoPrev","lastSelectableCell","stepFunctions","stepFn","isAddNewRow","setActiveCell","selectable","forceEdit","isValueChanged","validationResults","editCommand","serializedValue","prevSerializedValue","applyValue","onCellChange","undo","editCommandHandler","newItem","onAddNewRow","onValidationError","rowsToRanges","lastCell","GlobalEditorLock","multiSelect","_grid","enableForCells","maxToolTipLength","_canvas","handleActiveCellChange","onCellRangeSelected","handleCellRangeSelected","onBeforeCellRangeSelected","handleBeforeCellRangeSelected","removeInvalidRanges","_ranges","_self","selectActiveCell","dRow","dCell","dirRow","dirCell","new_last","viewRow","viewCell","CellRangeSelector","_decorator","CellRangeDecorator","_dragging","selectionCss","selectionCssClass","cellSelectionModel","dataItemColumnValueExtractorValue","retVal","editorArgs","setDataItemValueForColumn","dataItemColumnValueSetter","_createTextBox","_bodyElement","_decodeTabularData","clipText","clipRows","clippedRange","selectedCell","selectedRange","oneCellToMultiple","destH","destW","availableRows","addRows","newRowCreator","overflowsBottomOfGrid","newRowsNeeded","clipCommand","isClipboardCommand","oldValues","cellExternalCopyManager","markCopySelection","maxDestY","maxDestX","desty","destx","bRange","onPasteCells","clipboardCommandHandler","keyCodes","ESC","_copiedRanges","clearCopySelection","onCopyCancelled","INSERT","_onCopyInit","onCopyCells","clipTextRows","clipTextCells","includeHeaderWhenCopying","clipTextHeaders","focusEl","_onCopySuccess","rowCount","readOnlyMode","_copiedCellStyle","_copiedCellStyleLayerKey","_clearCopyTI","copiedCellStyleLayerKey","copiedCellStyle","bodyElement","onCopyInit","onCopySuccess","CheckbookContextMenu","hasRequiredFields","rowAmount","_sort_selector2","_sort_selector","FacetPanel","sorts","previousStat","onDataLoading","onGroupChange","fullColumn","statRow","athena","onSelectChange","onRecalculate","onGroupClick","eqVal","leVal","geVal","dateSplit","sort_name","noEscape","onItemsChange","setItems","updateItem","prevSelected","newlySelected","renderSelected","setTextSize","null","notnull","columnFilters","stateQueryModel","buildFilters","qmFilters","getColumnById","updateFilterCount","datepickerVisible","sortedColumns","onFilterAdd","updateDirtyness","allKeyup","inputValue","lastFocus","setButtonsState","onSearchClear","getColumnChoices","onFilterInput","getIndex","onFilterRemove","callSetFilter","allField","onFilterClear","onFilterField","currentSelection","onFilterOperator","onMenuSelect","oldColumn","customQueryModel","qm","enDate","_dragula2","_dragula","sortSelector","applySort","afterRender","handleClickAll","dragula","initialContainers","isContainer","drake","touchy","grab","eventualMovements","startBecauseMouseMoved","movements","crossvent","preventGrabbed","_grabbed","_moveX","_moveY","whichMouseButton","canStart","ignoreInputTextSelection","getCoord","elementFromPoint","grabbed","_offsetX","_offsetY","_copy","renderMirrorImage","_mirror","moves","nextEl","canMove","manualStart","isCopy","_initialSibling","_currentSibling","invalidTarget","ungrab","elementBehindCursor","getElementBehindPoint","dropTarget","findDropTarget","copySortSource","removeOnSpill","isInitialPlacement","cleanup","reverts","revertOnSpill","removeMirrorImage","rm","_renderTimer","_lastDropTarget","getImmediateChild","getReference","spillOver","spillOut","getRectWidth","getRectHeight","mirrorContainer","pointers","microsoft","pointerEnabled","msPointerEnabled","getScroll","scrollProp","offsetProp","nextElementSibling","getEventHost","missMap","atoa","thing","_once","et","emitterSnapshot","listen","ticky","addEventEasy","capturing","addEventHard","removeEventEasy","removeEventHard","fabricateEvent","eventmap","customEvent","wrapperFactory","hardCache","fabricate","NativeCustomEvent","foo","eventname","ron","lookupClass","rmClass","NetworkHeader","dropdownOpen","onDropdownClick","networkHomeUrl","networkEntityUrl","reportPath","itemCss","SocialNetworking","Facebook","Twitter","js","fjs","_report_description2","_report_description","_autocomplete2","_autocomplete","_sub_report_header2","_sub_report_header","_report_updated_info2","_report_updated_info","ReportHeader","embedHeaderStyle","isPredictiveSearchActive","gridSearchInput","handleSearchKeyDown","handleSearchBtnClick","onClear","clearSearch","nextColumnQuery","reportProperties","entityFeatures","checkImageVisible","hasOhioTosFlag","Autolinker","cfg","stripPrefix","twitter","matcherRegex","twitterRegex","emailRegex","protocolRegex","wwwRegex","domainNameRegex","tldRegex","urlSuffixRegex","protocolRelativeRegex","htmlRegex","tagNameRegex","attrNameRegex","attrValueRegex","nameEqualsValueRegex","urlPrefixRegex","textOrHtml","processHtml","currentResult","inBetweenTagsText","anchorTagStackCount","resultHtml","tagText","isClosingTag","processTextNode","processedTextNode","enableTwitter","enableEmailAddresses","enableUrls","matchStr","$2","$3","$4","$5","$6","$7","twitterMatch","twitterHandlePrefixWhitespaceChar","twitterHandle","emailAddress","urlMatch","protocolRelativeMatch","prefixStr","suffixStr","openParensMatch","closeParensMatch","linkType","anchorHref","anchorText","protocolRelRegex","charBeforeMatch","createAnchorTag","attributesStr","createAnchorAttrsStr","processAnchorText","createCssClass","stripUrlPrefix","removeTrailingSlash","doTruncate","truncateLen","AutoComplete","focusedFilter","allSearchApplied","lastAppliedAction","validColumnMap","_debouncedFetchDistinctFilter","_fetchDistinctFilters","_focusedFilterReveal","focused","focusedDOM","menuDOM","focusedRect","menuRect","isFocusedFilterInFilters","allFilter","inputColumnFilterId","inputColumnFilter","columnFilter","handleAllSearch","handleApplyFilter","handleClearInput","stateUpdate","handleInputChange","handleEnter","skipFilterChange","searchVal","focusPreviousFilter","focusNextFilter","_focusAdjacentFilter","focusedFilterIndex","_buildDistinctQuery","pendingRequests","_flattenResponse","groupedFilters","clearButton","SearchDropdownList","SearchDropdownListItem","onApplyFilter","getDisplayName","namespaceArg","Translate","getWrappedInstance","wrappedInstance","extraProps","tReady","Interpolate","REGEXP","useDangerouslySetInnerHTML","dangerouslySetInnerHTMLPartElement","tOpts","i18nKey","handleFormat","formatSeparator","additionalProps","exposeNamespace","hasChildren","getChildren","nodesToString","mem","elementKey","renderNodes","targetString","mapAST","reactNodes","astNodes","dummy","Trans","contextAndProps","tOptions","tFromContextAndProps","reactI18nextOptions","useAsParent","defaultTransParent","hashTransKey","pushTextNode","ignoreWhitespace","tagRE","parseTag","byTag","inComponent","isComment","nextChar","voidElement","attrRE","voidElements","expectingValueAfterEquals","attrString","buff","rootEl","eachComponents","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step$value","return","filterAndFlattenComponents","flattened","allNamespaces","resArray","_filter_pill2","_filter_pill","SubReportHeader","getFormattedFilters","handleReset","handleClickBack","breakdownLabel","filterObj","filterObjKey","filterPanel","FilterPill","dataHint","pillTextBody","operatorDescription","pillFilterType","operatorDisplay","handleFilterRemove","queryModelFilter","filterArray","AmountsTypeMenu","_amount_columns_settings_toggle2","_amount_columns_settings_toggle","_amount_columns_settings_panel2","_amount_columns_settings_panel","_error2","_panel_data2","_panel_data","_panel_header2","_panel_header","handleDocumentClickAmountColumns","inContainer","columnsSettingsPanel","inAmountColumnSettingToggle","handleColumnsSettingsCancel","isVisibilityValid","handleColumnsSettingsSave","setCurrentAmountColumn","settingsColumns","isAllColumnsVisible","isAllColumnChecked","hiddenColumns","hiddenColumnsIds","hiddenColumn","availableColumns","AmountColumnsPanelContainer","footerClass","visibilityPanelClass","_mapboxGlSupported2","_mapboxGlSupported","_aggregate_visualization_charts2","_aggregate_visualization_charts","_map_amount_menu2","_map_amount_menu","_map_type_menu2","_map_type_menu","_grid_graph_type2","_grid_graph_type","_map_unsupported_message2","_map_unsupported_message","_mini_loader2","_mini_loader","AggregateVisualization","isMapboxGlSupported","GLGridMap","legendPage","mapExtractors","isTypeWithLegend","isHeatmap","isDensityMap","isAmountMap","isTypeWithAmount","shouldShowMapAmountMenu","mapTypes","onMapTypeChange","amountChoices","graphTypes","editingTooltip","renderTooltipEditStatus","renderStandardHeader","renderMap","aggregateVizHeight","_summary_tooltip2","_summary_tooltip","_summary_pie_slider2","_summary_pie_slider","_grid_legend2","_grid_legend","firstPass","prevType","previousLength","noSeriesName","AggregateVisualizationCharts","graphWrapperClass","legendLines","onSortChange","handleLegendSortChange","highchartsThis","styleBold","percentageStr","valueStr","defaultStyle","fullText","calculatePercentage","yearTotal","columnTotal","previousVisualization","didAmountsTypeChange","didLegendSortByChange","didTargetChange","initializeChart","updateChartSeries","colorCache","legendReversed","labelsEnabled","$element","showToolTip","willFit","clearTooltips","bar","contextButton","target_index","seriesMap","rawAggregates","toVisualize","scopingToYear","band","clickedSeriesName","isRemaining","layoutAlgorithm","legendItemClick","onSeriesClick","sortedSeries","sortLegendData","targetValue","chartMax","updateVisualization","pointPlotY","pointYearTotal","_registerModule","glob","severity","isCode","defaultHandler","additionalMessages_1","doCopy","pathElements","subProperty","pathElement","startSeg","endSeg","tweenSeg","startItem","endItem","fromD","fullLength","moveSegment","otherSegment","segmentToAdd","positionFactor","lowerSegmentToAdd","internalClearTimeout","attribs","nopad","padder","outerArgs","valueAndFormat","splitter","floatRegex","decRegex","multiples","magnitude","hasTickAmount","retInterval","sortFunction","sortValue","except","prec","strinteger","roundedNumber","fractionDigits","origDec","boundingClientRectWidth","serialMode","eventObject","removeOneEvent","removeAllEvents","eventCollection","_val","eventElem","eventArguments","defaultFunction","iA","iB","pointProps","parser","hasAlpha","fromRgba","toRgba","inserted","currentClassName","newClassName","vAlign","vAlignFactor","animOptions","tspans","firstRealChild","hasContrast","isRTL_1","tspan","continueAnimation","hasSetSymbolSize","skipAttr","normalizer","colorOptions","colorObject","gradName","gradAttr","stopColor","gradientObject_1","stopObject","hyphenate","oldStyles","newStyles","serializedCss","hasNew","svgPseudoProps","grandParent","parentToClean","clipPath_1","textElement","seg","elemWrapper","rot","toggleTextShadowShim","cacheKey","hideByTranslation","touchStartPos","touchEventFired","svgElement","existingGradient","textPathOptions","textPathElement","textPathId","attribsMap","adder","shadowOptions","cutOff","shadowElementOpacity","defaultShadowOptions","otherElement","otherZIndex","undefinedOtherZIndex","parentWrapper","svgParent","extendStatics","SVGLabel","hasBGImage","isWidth","isFontStyle","textStyles","selectiveHandler","crispAdjust","textY","textX","subPixelFix","ren","rendererDefs","startAt","getString","truncated","minIndex","lengths","updateTSpan","charEnd","concatenatedEnd","isSubsequentLine","textNode","hasMarkup","parentX","textLineHeight","ellipsis","noWrap","tempParent","getLineHeight","fontSizeStyle","unescapeEntities","inputStr","parseAttribute","regexMatchBreaks","spans","spanNo","lineLength","classAttribute","styleAttribute","hrefAttribute","hasWhiteSpace","wrapLineNo","normalState","hoverState","pressedState","disabledState","curState","userNormalStyle","normalStyle","hoverStyle","pressedStyle","disabledStyle","setSVGImageSource","onDummyLoad","imageSrc","centerImage","imageRegex","isImage","sym","symbolFn","imgSize","parentVal","alterY","commandLength","fullCircle","cosStart","sinStart","cosEnd","sinEnd","safeDistance","isSettingWidth","alignCorrection","currentTextTransform","rotationStyle","cssTransformKey","addSetters","gWrapper","styleObject","svgGroupWrapper","htmlGroup","translateSetter","htmlGroupStyle","noLabel","labelOptions","animateLabels","tickPos","cHeight","yOffset","labelOffsetCorrection","leftPos","rightPos","pxPos","leftBound","rightBound","factor","modifiedSlotWidth","xCorrection","goRight","currentTick","reverseCrisp","gridLinePath","gridPrefix","tickPrefix","isNewMark","realMs","newOffset","fullYear","langWeekdays","replacements","normalizedInterval","variableDayLength","minDay","minDate","minMonth","minDateDate","minHours","numSymMagnitude","formatOption","numericSymbolDetector","xExtremes","seriesDataMin","seriesDataMax","seriesOptions","backwards","cvsCoord","handleLog","cvsOffset","localA","localMin","doPostTranslate","paneCoordinates","pixel","between","axisLeft","axisTop","cWidth","lastPos","roundedMin","roundedMax","minorTickPositions","logarithmic_1","zoomOffset","spaceAvailable","closestDataRange","loopLength","minArgs","maxArgs","seriesClosest","explicitCategories","nameX","saveOld","ordinalCorrection","hasCategories","seriesPointRange","isPointPlacementAxis","secondPass","linkedParentExtremes","thresholdMin","thresholdMax","hardMin","hardMax","tickIntervalOption","tickPixelIntervalOption","tickPositionsOption","minorTickIntervalOption","isColorAxis","hasOther","others","axisOptions","currentTickAmount","isDirtyAxisLength","isXAxisDirty","realMin","realMax","newTickInterval","slotSize","rotationOption","getStep","spaceNeeded","slotCount","cssWidth","commonWidth","commonTextOverflow","labelStyleOptions","textOverflowOption","axisTitleOptions","titleOffsetOption","labelOffsetPadded","lineHeightCorrection","invertedSide","titleMargin","directionFactor","lineLeft","lineTop","axisLength","xOption","yOption","textHeightOvershoot","alongAxis","offAxis","slideInTicks","stackLabelOptions","plotLineOptions","forDestruction","destroyInactiveItems","titleXy","plotLine","categorized","crossOptions","DateTimeAxisAdditions","unitsOption","lessThan","DateTimeAxis","AxisClass","LogarithmicAxisAdditions","minor","intermediate","break2","filteredTickIntervalOption","totalPixelLength","LogarithmicAxis","axisProto","logAxisProto","optionsLabel","isBand","isLine","groupAttribs","labelText","plus","pathStart","pathEnd","toPathStart","toPathEnd","updatedOptions","mouseEvent","dateStr","strpos","lastN","label_1","xSetter_1","ySetter_1","boxHeight","swapped","buildDimensionArray","preferFarSide","firstDimension","outerSize","scaledInnerSize","scaledDist","scaleDiff","roomLeft","roomRight","alignedLeft","alignedRight","secondDimension","skipAnchor","pointOrPoints","currentSeries","textConfig","pointConfig","defaultPositioner","headerTop","adjustedPlotHeight","distributionBoxTop","updatePartialTooltip","partialTooltip","colorClass","tooltipLabel","boxes","boxPosition","anchorPos","labelBBox","formatString","footOrHead","isDateTime","activeSeries","inactiveSeries","clickedInside","panningEnabled","runZoom","selectionData","selectionBox","selectionLeft","selectionTop","selectionWidth","selectionHeight","selectionMin","selectionMax","isCloserX","isCloser","isAbove","existingHoverPoint","existingHoverSeries","searchSeries","useExisting","notSticky","elemClassName","ePos","pEvt","touchesLength","fireClickEvent","absMin","absMax","forcedScale","selectionWH","selectionXY","clipXY","outOfBounds","transformScale","scaleKey","XY","sChartXY","wh","plotLeftTop","singleTouch","touch0Start","touch0Now","touch1Start","touch1Now","allowMove","tooltipPoints","useSharedTooltip","hoverData","seriesAttribs","ownerDoc","hoverChart","hasMoved","getWebkitTouches","fake","translateMSPointer","wktype","hasPointerEvent","MSPointer","hiddenColor","textColor","symbolColor","markerOptions","ltr","legendItemPos","destroyItems","titleOptions","li","isSeries","itemExtraWidth","alignments","alignLeft","lastPoint","useFirstPoint","allowedWidth","lastY","optionsY","alignTop","spaceHeight","navOptions","clipToHeight","addTracker","scrollBy","pageCount","runPositionItem","userPlotOptions","optionsChart","typeOptions","chartEvents","Constr","hasStackedSeries","hasDirtyStacks","legendUserOptions","redrawLegend","isHiddenChart","afterRedraw","itemById","optionsArray","xAxisOptions","yAxisOptions","subtitleOptions","explicitOptions","updateOptions","requiresDirtyBox","titleSize","heightOption","tempStyle","oldChartIndex","Ren","containerStyle","hasUserSize","clipX","clipY","sideName","chartBorderWidth","mgn","bgAttr","chartBackgroundColor","verb","chartSeries","tempWidth","tempHeight","redoHorizontal","redoVertical","correction","renderAxes","creds","serieOptions","corrections","scrollableMinWidth","scrollableMinHeight","marginName","correctionValue","axisClass","fixedSelectors","scrollableWidth","scrollableHeight","scrollableOptions","maskTop","maskLeft","maskBottom","maskRight","maskPlotRight","maskPlotBottom","StackingAxisAdditions","actualSeries","axisSeries","StackingAxis","generalRadius","legendItemGroup","verticalCenter","isDataLabel","animateParams","graphicalProps","destroyPoint","kinds","firstItemType","valueCount","isLastKey","seriesTooltipOptions","lastSeries","indexOption","AXIS","itemOptions","seriesUserOptions","setting","indexName","counterName","seriesMarkerOption","optionsObject","matchingPoint","matchedById","pointIndex","matchKey","oldPoint","hasUpdatedByKey","pointsToAdd","equalLength","succeeded","pointOptions","updatePoints","pt","updatedData","oldDataLength","firstPoint","indexOfX","indexOfY","sortedData","getPointOptionsObject","aValue","bValue","forceExtremesFromAll","croppedData","throwOnUnsorted","processedData","cropEnd","dataOptions","PointClass","processedDataLength","yDataLength","validValue","activeYData","activeCounter","shoulder","limitedRange","lastPlotX","stackIndicator","hasModifyValue","dynamicallyPlaced","stackThreshold","pointStack","stackValues","xValue","yValue","insideOnly","allowNull","finalBox","scrollablePlotAreaOptions","seriesClipBox","markerClipRect","pointMarkerOptions","hasPointMarker","seriesMarkerOptions","globallyEnabled","shouldDrawMarker","seriesStateOptions","pointStateOptions","pointColorOption","pointColor","zoneColor","keepEventsForUpdate","issue134","nullsAsZeroes","connectCliffs","gap","pathToPoint","graphKey","propset","translatedFrom","translatedTo","clipAttr","pxRange","pxPosMin","pxPosMax","zoneArea","zoneGraph","chartSizeMax","ignoreZones","setInvert","animDuration","chartSeriesGroup","wasDirty","_kdtree","startRecursive","setDistance","kdX","kdY","tdist","sideA","sideB","nPoint1","nPoint2","kdComparer","kdDimensions","stackOption","xOffset","xWidth","boxBottom","boxTop","defaultX","stackItem","yZero","stackBox","isJustify","boxOffsetX","boxOffsetY","axisPos","stackingParam","pointKey","negKey","pointExtremes","totalFactor","newer","older","loadingOptions","setLoadingSize","oneToOne","updateAllAxes","updateAllSeries","newHeight","runSetSize","adders","itemsForRemoval","indexMap","newOptions","hasId","runEvent","shouldDestroyGraphic","withEvent","isInTheMiddle","oldOptions","newType","keepPoints","initialSeriesProto","preserve","newEvents","visibleSeries","pointMap","seriesIndex","yAxisSeries","seriesLength","upOrDown","stackX","stackPoint","stackedValues","nullName","cliffName","cliff","otherStack","topPath","bottomPath","bottomPoints","graphPoints","addDummyPoints","otherI","nullVal","cliffVal","firstBottomPoint","areaKey","otherPoint","leftContX","leftContY","lastX","nextX","nextY","smoothing","areaProto","otherSeries","reverseStacks","stackGroups","otherYAxis","categoryWidth","groupWidth","pointOffsetWidth","colIndex","fromTop","xCrisp","yCrisp","indexInCategory_1","totalInCategory_1","pointValues","seriesPointWidth","seriesBarW","seriesXOffset","barY","barH","stateOptions","p2o","strokeOption","strokeWidthOption","hasGraphic","translateStart","translateProp","unrandom","translatedJitter","plotProp","handleSlicingRoom","slicingRoom","centerOption","smallestSize","finalConnectorOffset","radiusX","radiusY","connectorOffset","circ","centerY","groupTranslation","pointAttr","animateTo","toggleSlice","vis","lineSegment","pieCenterX","crookX","segmentWithCrook","useCrook","predefinedShapes","maxDistance","sortByTarget","origBoxes","restBoxes","posInCompositeBox","mergeArrays","seriesDlOptions","seriesAnimDuration","fadeInDuration","labelEnabled","normRotation","negRotation","setStartPos","labelCenter","halfWidth","justified","naturalY","seriesCenter","dataLabelWidth","maxDataLabelWidth","labelHeight","pointDataLabelsOptions","halves","distributionLength","overshoot","collector","label1","label2","box1","box2","isLabelAffected","trackerPath","TRACKER_FILL","isPoint","inactiveItem","fnLegendItemClick","btnOptions","hasZoomed","displayButton","mouseDownPos","axisData","axisStartPos","axisEndPos","isWithinPane","panningOptions","doRedraw","hasMapNavigation","paddedMin","paddedMax","spill","mouseDown","halfPointRange","pointRangeDirection","panMin","panMax","loopPoint","loopSeries","haloOptions","pointAttribsAnimation","newSymbol","normalDisabled","markerStateOptions","stateDisabled","pointMarker","hasMarkers","markerGraphic","markerVisibility","stateAnimation","showOrHide","oldVisibility","currentRuleIds","ruleId","getCurrent","setTreeValues","idRoot","mapIdToNode","nodeRoot","levelIsConstant","optionsPoint","childrenTotal","levelDynamic","isLeaf","getColorByPoint","colorIndexByPoint","mapOptionsToLevel","parentColor","parentColorIndex","chartOptionsChart","colorVariation","getLevelOptions","levels","updateRootId","rootId","rootNode","animatableAttribs","onComplete","shouldDraw","mixinTreeSeries","drawPoint","eachObject","recursive","treemapAxisDefaultValues","allowTraversingTree","layoutStartingDirection","alternateStartingDirection","drillUpButton","traverseUpButton","colorKey","heatmap","getListOfParents","existingIds","listOfParents","allIds","parentList","nodeMap","colorMapSeriesMixin","colorAttribs","allowDrillToNode","onClickDrillToNode","sortIndex","calculateChildrenAreas","algorithm","childrenValues","axisRatio","setPointValues","getCrispCorrection","crispCorr","setColorRecursive","colorInfo","algorithmGroup","plot","startDirection","nW","lW","nH","lH","elArr","lP","nR","lR","aspectRatio","algorithmCalcPoints","directionChange","childrenArea","pX","pY","pW","pH","keep","gW","gH","algorithmLowAspectRatio","pTot","algorithmFill","squarified","sliceAndDice","stripes","seriesArea","renderTraverseUpButton","setRootNode","borderDashStyle","withinAnimationLimit","groupKey","shouldAnimate","drillId","interactByLeaf","drillToByLeaf","drillToByGroup","isDrillAllowed","nodeParent","drillUp","drillToNode","newRootId","previousRootId","idPreviousRoot","targetNode","buttonOptions","backText","colorValueData","valueMin","valueMax","treeAxis","Fullscreen","browserProps","requestFullscreen","fullscreenChange","exitFullscreen","mozRequestFullScreen","webkitRequestFullScreen","msRequestFullscreen","fullscreen","Document","unbindFullscreenEvent","setButtonText","exportDivElements","exportingOptions","menuItemDefinitions","viewFullscreen","initUpdate","updates","updateConfig","addUpdate","chartNavigationMixin","isMSBrowser","isFirefoxBrowser","printChart","downloadPNG","downloadJPEG","downloadPDF","downloadSVG","contextButtonTitle","symbolSize","symbolX","symbolY","buttonSpacing","menuStyle","menuItemStyle","menuItemHoverStyle","symbolFill","symbolStroke","symbolStrokeWidth","printMaxWidth","menuClassName","titleKey","textKey","print","exportChart","formAttributes","matchMedia","mqlEvent","printingChart","beforePrint","afterPrint","sanitizeSVG","ieSanitizeSVG","getChartHTML","inlineStyles","getSVG","chartCopy","sandbox","sourceWidth","sourceHeight","cssHeight","isGantt","collOptions","axisCopy","getSVGForExport","chartExportingOptions","getFilename","moveContainers","handleMaxWidth","printReverseInfo","origDisplay","resetParams","contextMenu","innerMenu","cacheName","menuPadding","exportContextMenu","listStyle","MozBoxShadow","WebkitBoxShadow","exportEvents","exportMenuWidth","exportMenuHeight","addButton","btnCount","exportSVGElements","_titleKey","exportingGroup","buttonOffset","destroyExport","inlineToAttributes","inlineBlacklist","unstyledElements","filterStyles","blacklisted","whitelisted","parentStyles","defaultStyles","styleAttr","dummySVG","iframeDoc","inlineWhitelist","menuball","renderExporting","isDirtyExporting","patternUnits","VMLElement","VMLRenderer","markup","prepVML","addPredefinedPatterns","bHasOwnProperty","documentListeners","documentListener","_legend_item2","_legend_item","_legend_sort2","_legend_sort","_legend_more_button2","_legend_more_button","showMoreLine","hasMore","LegendItem","SortItemFactories","alpha_rev","SortItemOrder","LegendSort","currentSort","LegendMoreButton","__WEBPACK_AMD_DEFINE_ARRAY__","DEG2RAD","LAB_CONSTANTS","PITHIRD","RAD2DEG","TWOPI","_average_lrgb","_guess_formats","_guess_formats_sorted","_input","_interpolators","blend_f","brewer","burn","chroma","clip_rgb","css2rgb","dodge","hcg2rgb","hex2rgb","hsi2rgb","hsl2css","interpolate_hsx","interpolate_lab","interpolate_lrgb","interpolate_num","interpolate_rgb","lab2lch","lab2rgb","lab_xyz","lch2lab","lch2rgb","luminance_x","num2rgb","rgb2css","rgb2hcg","rgb2hex","rgb2hsi","rgb2lch","rgb2luminance","rgb2num","rgb2temperature","rgb_xyz","rnd","temperature2rgb","unpack","w3cx11","xyz_lab","xyz_rgb","classToType","strType","_clipped","_unclipped","chk","len1","_rgb","OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr","YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys","YlOrRd","PuRd","Blues","PuBuGn","Viridis","Spectral","RdYlGn","RdBu","PiYG","PRGn","RdYlBu","BrBG","RdGy","PuOr","Set2","Accent","Set1","Set3","Dark2","Paired","Pastel2","Pastel1","cornflower","laserlemon","lightgoldenrod","maroon2","maroon3","purple2","purple3","Yn","Xn","Zn","Kn","ref1","I0","I1","lab0","lab1","lab2","lab3","ref2","cubehelix","rotations","gamma","dh","dl","fract","cos_a","sin_a","digits","col1","col2","interpol","lrgb","xyz0","xyz1","cnt","xyz2","hxa","ref3","ref4","ref5","_g","hcg","named","lch","luminance","cur_lum","eps","max_iter","lm","kelvin","maxTemp","minTemp","temperature","sum_sq","deltaE","L1","L2","c4","dH2","delA","delB","delC","delL","sh","v1","v2","v3","modechan","clipped","premultiply","analyze","limits","_classes","_colorCache","_colors","_correctLightness","_domain","_gamma","_max","_min","_mode","_nacol","_out","_spread","_useCache","getClass","resetCache","setColors","tmap","maxc","minc","bypassMap","correctLightness","L0","L_actual","L_diff","L_ideal","pol","numColors","dm","samples","nodata","cool","hot","ai","aj","ak","assignments","centroids","clusterSizes","kClusters","max_log","min_log","mindist","nb_iters","newCentroids","pr","ref10","ref11","ref12","ref13","ref14","ref6","ref7","ref8","ref9","tmpKMeansBreaks","LOG10E","hsi","hue0","hue1","lbv","lbv0","lbv1","sat","sat0","sat1","MapAmountMenu","_MapTypeToIconClasses","MapTypeToIconClassesMap","MapTypeIcon","_onClick","MapTypeMenuListItem","iconClassname","MapTypeMenu","table","horizontal_stacked","GraphType","_LayerComponentMap","_grid_map_legend2","_grid_map_legend","_bubble_map_legend2","_bubble_map_legend","_heat_map_legend2","_heat_map_legend","_reactMapGl2","_reactMapGl","_feature_layer2","_feature_layer","_gl_heat_map_layer2","_gl_heat_map_layer","_gl_map_tooltip2","_gl_map_tooltip","HeatmapConfig","LayerComponentMap","_onMapRenderAndLoaded","_onMapRender","_onFeaturesClick","getBoundsForFeatures","previousViz","previousFilter","previousBreakdown","nextBounds","boundsNearlyEqual","colorExtractor","colorMapLoading","moveStart","_saveMapBounds","_initMapMoveHandlers","_initMapLoadingHandlers","zoomIn","newBounds","currentBounds","featureType","GLLayerComponent","mapboxApiAccessToken","mapStyle","onMapLoaded","_onMapLoaded","onChangeViewport","zoomDisabled","dragDisabled","_shouldMountLayer","getLayerProps","renderTooltip","getAmountHeatmapExtractors","gradientColors","onLoading","onFeaturesClick","isAmountHeatmapType","heatmapLegendProps","legendColumn","minValue","maxValue","mapTooltipEditing","renderMapControls","renderLegend","MapLegendItem","_itemsPerPage","MapLegend","followingCount","previousCount","renderLegendShowPrevious","renderLegendItems","renderLegendShowMore","_horizontal_scaled_circles2","_horizontal_scaled_circles","RADIUS_RANGE","BUBBLE_CONTAINER_HEIGHT","BubbleMapLegend","numCircles","minRadius","circlePadding","containerPadding","radiusRange","HorizontalScaledCircles","circleNum","HeatMapLegend","GRADIENT_HEIGHT","_fitBounds","_applyDecoratedDescriptor","modulus","unprojectFromTransform","_mapboxGl","cloneTransform","_transform2","_class2","_assert","_assert2","_autobindDecorator","_autobindDecorator2","_pureRenderDecorator","_pureRenderDecorator2","_d2","_mapboxGl2","_mapInteractions","_mapInteractions2","_diffStyles2","_diffStyles3","PROP_TYPES","startDragLngLat","onHoverFeatures","ignoreEmptyFeatures","attributionControl","onClickFeatures","preserveDrawingBuffer","preventStyleDiffing","perspectiveEnabled","DEFAULT_PROPS","MapGL","startBearing","startPitch","_mapReady","mapboxMap","interactive","getCanvas","_updateMapViewport","_callOnChangeViewport","newProps","_updateStateFromProps","_updateMapStyle","_updateMapSize","onClickFeature","oldProps","prevStyle","nextStyle","styleKeysMap","prevKeysMap","nextKeysMap","_getMap","prevKeysList","nextKeysList","_diffStyles","sourcesDiff","layersDiff","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","exiting","_exit","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","oldMapStyle","_setDiffStyle","viewportChanged","jumpTo","fitBounds","xDelta","yDelta","yScale","_getMap$getContainer","projectionMatrix","_ref3","_ref4","_calculateNewPitchAnd","_calculateNewPitchAndBearing","_ref5","around","_onMouseDown","onMouseDrag","_onMouseDrag","onMouseRotate","_onMouseRotate","onMouseUp","_onMouseUp","onMouseMove","_onMouseMove","onZoom","_onZoom","onZoomEnd","_onZoomEnd","readUInt8","superCtor","super_","TempCtor","getComponentName","pureRenderDecorator","Canvas","Painter","Camera","scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate","bearingSnap","trackResize","_interactive","_failIfMajorPerformanceCaveat","_preserveDrawingBuffer","_trackResize","_workerCount","maxBounds","setMaxBounds","_setupContainer","_setupPainter","_onWindowOnline","_onWindowResize","_hash","_onHashChange","setClasses","addControl","control","_classOptions","klasses","uniqueClasses","getClasses","lnglatbounds","setMinZoom","setZoom","setMaxZoom","pointOrBox","_makeQueryGeometry","_onStyleLoad","_forwardStyleEvent","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","getCanvasContainer","_canvasContainer","getElement","canvasContainer","controlContainer","_controlContainer","corners","getWebGLContext","_contextLost","_frameId","_contextRestored","_styleDirty","_sourcesDirty","updateStyle","_render","showTileBoundaries","showOverdrawInspector","_showOverdrawInspector","rotating","_repaint","_showTileBoundaries","_showCollisionBoxes","_vertices","interpZoomTransitioned","fromScale","toScale","transitionable","transitioned","interpolationAmountStops","fraction","validateStyleMin","latestStyleSpec","$root","validateGlyphsURL","validateConstants","sortErrors","wrapCleanErrors","validateString","BackgroundStyleLayer","CircleStyleLayer","FillStyleLayer","LineStyleLayer","flooredZoom","_flooredZoom","_flooredLineWidth","RasterStyleLayer","SymbolStyleLayer","isTextHidden","isIconHidden","newdata","SpritePosition","newSprite","sdf","getSpritePosition","atlases","SimpleGlyph","glyphUrl","fontstack","Glyphs","GlyphAtlas","glyphIDs","atlas","missing","glyphID","addGlyph","onRangeLoaded","loadRange","rangeName","getGlyphAtlas","readFontstacks","readFontstack","readGlyph","getGlyphs","getRects","rects","bufferedWidth","bufferedHeight","packWidth","packHeight","dirty","origw","origh","ALPHA","updateTexture","BufferMethods","encodeString","lead","lastStr","lastStrEncoded","ieee754","encoding","ch","isLE","images","copyBitmap","srcStride","srcX","srcY","dstStride","dstX","dstY","srcI","dstI","AtlasImage","allocateImage","pixelWidth","pixelHeight","repeating","srcImg","dstImg","filterVal","nextRow","getDash","dasharray","addDash","stretch","oddLength","partIndex","signedDistance","distLeft","distRight","distMiddle","distEdge","actors","currentActor","WebWorkify","actor","Actor","targetID","buffers","terminate","callbackID","transferList","FillBucket","addPolygon","triangleIndices","LineBucket","COS_HALF_SHARP_CORNER","MAX_LINE_DISTANCE","addLineVertex","extrude","ty","linesofar","addLine","cap","miterLimit","roundLimit","sharpCornerOffset","firstVertex","lastVertex","currentVertex","prevVertex","nextVertex","prevNormal","nextNormal","beginCap","endCap","startOfLine","e2","e3","joinNormal","cosHalfAngle","miterLength","isSharpCorner","prevSegmentLength","newPrevVertex","addCurrentVertex","middleVertex","currentJoin","bevelLength","lineTurnsLeft","approxFractionalJoinNormal","addPieSliceVertex","nextSegmentLength","newCurrentVertex","endLeft","endRight","layoutArrays","elementArray","CircleBucket","addCircleVertex","extrudeX","extrudeY","isLayerConstant","SymbolBucket","sdfIcons","iconsNeedLinear","adjustedTextSize","adjustedIconSize","addVertex","labelminzoom","getAnchors","Quads","Shaping","resolveText","mergeLines","CollisionFeature","shapeText","shapeIcon","programAttributes","addCollisionBoxVertex","placementZoom","collisionBox","adjustedTextMaxSize","adjustedIconMaxSize","tilePixelRatio","compareText","symbolInstancesStartIndex","textFeatures","horizontalAlign","textOffset","iconName","symbolInstancesEndIndex","placeFeatures","fontScale","textMaxSize","textBoxScale","textMaxBoxScale","iconBoxScale","symbolMinDistance","avoidEdges","textPadding","iconPadding","textMaxAngle","textAlongLine","iconAlongLine","mayOverlap","textRepeatDistance","anchors","anchorIsTooClose","addToBuffers","addSymbolInstance","repeatDistance","otherAnchors","symbolInstancesStructTypeArray","sortedSymbolInstances","anchorPointX","anchorPointY","symbolInstance","textCollisionFeature","boxStartIndex","textBoxStartIndex","boxEndIndex","textBoxEndIndex","iconCollisionFeature","iconBoxStartIndex","iconBoxEndIndex","hasText","hasIcon","iconWithoutText","textWithoutIcon","glyphScale","placeCollisionFeature","iconScale","insertCollisionFeature","addSymbols","glyphQuadStartIndex","glyphQuadEndIndex","iconQuadStartIndex","iconQuadEndIndex","addToDebugBuffers","quadsStart","quadsEnd","placementAngle","updateIcons","iconValue","updateFont","yStretch","bucketIndex","glyphQuads","iconQuads","addSymbolQuad","symbolQuad","maxAngle","glyphSize","tileExtent","angleWindowSize","labelLength","isLineContinued","fixedExtraOffset","placeAtMiddle","halfLabelLength","markedDistance","segmentDist","checkMaxAngle","anchorDistance","recentCorners","recentAngleDelta","angleDelta","PositionedGlyph","linewrap","lastSafeBreak","lengthBeforeCurrentLine","lineStartIndex","maxLineLength","justifyLine","breakable","lastPositionedGlyph","lastLineLength","lastAdvance","lineIndent","shiftX","shiftY","PositionedIcon","layoutProperties","codepoints","fl","toLocaleUpperCase","mergedFeatures","mergedGeom","mergedTexts","mergedIndex","mergeFromRight","leftKey","rightKey","mergeFromLeft","onRight","clippedLines","clippedLine","shaped","alignLine","straightLine","_addLineCollisionBoxes","boxSize","nBoxes","firstBoxOffset","segmentLength","boxDistanceToAnchor","segmentBoxDistance","boxAnchorPoint","distanceToInnerEdge","featureIndexArray","FeatureIndexArray","bucketLayerIDs","translateDistance","topDownFeatureComparator","getLineWidth","translateAnchor","pixelsToTileUnits","translated","translatedRing","offsetLine","newRings","newRing","aToB","bToC","DictionaryCoder","sourceLayerCoder","additionalRadius","styleLayer","styleLayerDistance","matching","filterMatching","matchingSymbols","queryRenderedSymbols","filterLayerIDs","previousIndex","layerIDs","sourceLayerName","translatedPolygon","circleRadius","layerResult","_stringToNumber","_numberToString","readTile","ignoredGrid","reverseRotationMatrix","tempCollisionBox","collisionFeature","minPlacementScale","bbox0","bbox1","bbox2","bbox3","blockingBoxes","blocking","blockingAnchorPoint","getPlacementScale","rotatedCollisionBox","edgeBox","sourceLayerFeatures","queryBox","searchBox","blockingBoxKeys","blockingBoxKeys2","anchorDiffX","anchorDiffY","s4","collisionFreeScale","blockingMaxScale","boxMaxScale","ignorePlacement","tlX","tlY","trX","trY","blX","blY","brX","brY","texX","texY","texH","texW","LRUCache","removedData","reusableTextures","preFbos","frameHistory","FrameHistory","numSublayers","depthEpsilon","lineWidthRange","getParameter","ALIASED_LINE_WIDTH_RANGE","createUniformPragmas","BLEND","blendFunc","ONE","ONE_MINUS_SRC_ALPHA","_depthMask","PosArray","tileExtentArray","tileExtentBuffer","tileExtentVAO","tileExtentPatternVAO","debugArray","debugBuffer","debugVAO","rasterBoundsArray","clearColor","COLOR_BUFFER_BIT","clearStencil","stencilMask","STENCIL_BUFFER_BIT","clearDepth","DEPTH_BUFFER_BIT","_renderTileClippingMasks","colorMask","stencilOp","KEEP","idNext","_tileClippingMaskIDs","stencilFunc","ALWAYS","enableTileClippingMask","EQUAL","prepareBuffers","bindDefaultFramebuffer","bindFramebuffer","FRAMEBUFFER","depthRange","renderPass","currentLayer","renderLayer","farDepth","nearDepth","translatePosMatrix","sinA","cosA","translatedMatrix","textures","CONSTANT_COLOR","blendColor","LDU","atx","aty","scalar","SIMD","m03","m13","m23","m30","m31","m32","m33","tmp01","tmp23","out0","out1","out2","out3","Float32x4","row0","row1","row2","row3","tmp1","minor0","minor1","minor2","minor3","swizzle","reciprocalApproximation","a_1","a_2","a_0","fromXRotation","fromYRotation","fromZRotation","fromRotationTranslation","xz","yz","getTranslation","mat","getRotation","fromRotationTranslationScale","sz","fromRotationTranslationScaleOrigin","oz","frustum","near","far","fovy","aspect","perspectiveFromFieldOfView","fov","upTan","upDegrees","downTan","downDegrees","leftTan","leftDegrees","rightTan","rightDegrees","xScale","ortho","lr","bt","lookAt","eye","eyex","eyey","eyez","upx","upy","upz","centerx","centery","centerz","a9","a14","a15","b9","b13","b14","b15","rotationTo","tmpvec3","xUnitVec3","yUnitVec3","setAxisAngle","setAxes","matr","fromMat3","getAxisAngle","out_axis","bw","calculateW","slerp","omega","cosom","sinom","sqlerp","temp1","temp2","invDot","conjugate","fRoot","fTrace","transformMat2","transformMat2d","changeTimes","changeOpacities","previousZoom","firstFrame","timeSince","opacityChange","applyPragmas","operation","shaders","utilSource","_createProgram","definesSource","fragmentShader","fragmentSource","vertexShader","vertexSource","ACTIVE_ATTRIBUTES","getActiveAttrib","numUniforms","ACTIVE_UNIFORMS","getActiveUniform","_createProgramCached","nextProgramName","nextProgram","currentProgram","linepattern","linesdfpattern","outlinepattern","collisionbox","drawSymbols","drawAcrossEdges","drawLayerSymbols","drawCollisionDebug","isText","rotationAlignment","haloWidth","haloColor","haloBlur","bothBufferGroups","drawSymbol","adjustedSize","extrudeScale","gammaScale","alignedWithMap","defaultSize","u_skewed","u_extrude_scale","u_texture","glyphAtlas","u_texsize","mapMoving","iconScaled","iconTransformed","zoomAdjust","u_zoom","u_fadetexture","u_gamma","uniform4fv","u_color","u_opacity","u_buffer","drawElements","TRIANGLES","UNSIGNED_SHORT","u_scale","u_maxzoom","LINES","drawCircles","programOptions","u_devicepixelratio","antialiasing","antialiasingMatrix","posA","posB","imagePosA","imagePosB","topedgelength","u_linewidth","u_gapwidth","u_antialiasing","u_blur","u_image","u_tex_y_a","u_tex_y_b","u_mix","u_extra","u_offset","uniformMatrix2fv","u_antialiasingmatrix","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_fade","widthA","widthB","scaleA","scaleB","u_ratio","u_patternscale_a","u_patternscale_b","u_sdfgamma","u_pattern_size_a","u_pattern_size_b","isOutlineColorDefined","drawFill","drawStroke","setPattern","u_world","drawingBufferWidth","drawingBufferHeight","u_tile_units_to_pixels","u_scale_a","u_scale_b","tileSizeAtNearestZoom","pixelX","pixelY","u_pixel_coord_upper","u_pixel_coord_lower","drawBackground","drawDebug","drawDebugTile","uniform4f","LINE_STRIP","textVertices","debugTextArray","debugTextBuffer","onePixel","translations","simplexFont","\"","len2","strokes","getBearing","bindOptions","mapOptions","fireMouseEvent","contextMenuEvent","onTouchStart","fireTouchEvent","tapped","onTouchTimeout","onTouchMove","onTouchEnd","onTouchCancel","lngLats","ScrollZoomHandler","firefox","_enabled","_onWheel","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_LINE","timeDelta","_time","_lastValue","targetZoom","delayEndEvents","BoxZoomHandler","_active","_onKeyDown","_startPos","_box","_fireEvent","_finish","boxZoomBounds","DragRotateHandler","_bearingSnap","inertiaEasing","_onDown","_ignoreEvent","_onMove","_onUp","_inertia","startToCenter","bearingDiff","inertia","_drainInertiaBuffer","_normalizeBearing","mapBearing","resetNorth","noMoveStart","flingDiff","flingDuration","rotateTo","DragPanHandler","_onTouchEnd","flingOffset","velocity","KeyboardHandler","eventData","isEasing","easeTo","getPitch","DoubleClickZoomHandler","_onDblClick","TouchZoomRotateHandler","_onStart","disableRotation","_rotationDisabled","enableRotation","_startVec","_startScale","_startBearing","_gestureIntent","_onEnd","scalingSignificantly","snapToNorth","lastScale","firstScale","scaleOffset","scaleDuration","targetScale","setCenter","panTo","setBearing","setPitch","flyTo","zoomChanged","bearingChanged","pitchChanged","toLngLat","toPoint","startZoom","fromPoint","pitching","_onEaseEnd","_ease","_easeToEnd","rho2","u1","sinh","cosh","tanh","startWorldSize","rho","wMax","screenSpeed","us","_abortFn","_finishEase","_finishFn","currentBearing","_updateEasing","copyMouseEvent","MouseEvent","movementX","movementY","_onContextMenu","_zoomInButton","_createButton","_zoomOutButton","_compass","_compassArrow","_onCompassDown","_onCompassMove","_onCompassUp","_rotateCompassArrow","geoOptions","enableHighAccuracy","_geolocateButton","_onClickGeolocate","getCurrentPosition","_success","_timeoutId","getFirstMatch","getSecondMatch","iosdevice","likeAndroid","android","nexusMobile","nexusTablet","chromeos","silk","sailfish","tizen","webos","windowsphone","windows","mac","linux","edgeVersion","versionIdentifier","tablet","mobile","xbox","samsungBrowser","whale","mzbrowser","coast","yandexbrowser","ucbrowser","maxthon","epiphany","puffin","sleipnir","kMeleon","osname","msedge","msie","chromeBook","vivaldi","seamonkey","firefoxos","phantom","slimer","blackberry","touchpad","bada","qupzilla","chromium","googlebot","blink","ios","osVersion","osversion","osMajorVersion","compareVersions","getVersionPrecision","chunks","isUnsupportedBrowser","minVersions","strictMode","bowser","browserList","browserItem","_document2","_window","_window2","_noop","_noop2","MapInteractions","mouseWheelPos","_getMousePos","mouseWheelType","mouseWheelTimeout","lastValue","mouseWheelLastValue","mouseWheelTime","_zoomEndTimeout","onWheel","diffSources","prevSources","nextSources","prevIds","nextIds","nextSource","diffLayers","prevLayers","nextLayers","prevMap","nextMap","layerImBehind","diffStyle","_bounds","_choropleth","_draggablePoints","_html","_scatterplot","_svg","_viewportMercatorProject","_viewportMercatorProject2","CanvasOverlay","_redraw","renderWhileDragging","globalOpacity","colorDomain","colorRange","valueAccessor","ChoroplethOverlay","projectPoint","lon","clearRect","_drawFeatures","colorScale","strokeStyle","_svgTransform","_svgTransform2","keyAccessor","lngLatAccessor","onAddPoint","onUpdatePoint","renderPoint","DraggablePointsOverlay","draggedPointKey","_onDrag","_onDragEnd","relativeMousePosition","draggedPoint","_addPoint","_onDragStart","HTMLOverlay","_canvasCompositeTypes","_canvasCompositeTypes2","dotRadius","dotFill","compositeOperation","ScatterplotOverlay","globalCompositeOperation","pixelRounded","SVGOverlay","_updateFeatures","dataSource","buildFeatureCollection","FeatureLayer","prevLayer","paintVal","paintKey","_webglHeatmap2","_webglHeatmap","INTENSITY_FACTOR","_prevGradientColors","_gradientTexture","HeatmapLayer","_heatmap","rawVal","adjustSize","intensity","shouldIgnoreLngLat","_interpolateWithZoom","gradientTexture","_getGradientTexture","intensityToAlpha","alphaRange","WebGLHeatmap","__indexOf","getSupportedExtensions","vendorRe","WebGLRenderingContext","extobj","checkColorBuffer","checkFloatLinear","checkSupport","checkTexture","createSourceCanvas","shimExtensions","shimLookup","unshimExtensions","unshimLookup","imageData","putImageData","sourceType","framebuffer","positionLoc","readBuffer","sourceCanvas","sourceLoc","deleteShader","deleteProgram","deleteFramebuffer","ARRAY_BUFFER","createFramebuffer","framebufferTexture2D","COLOR_ATTACHMENT0","readPixels","getError","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","halfFloatExt","halfFloatTexturing","singleFloatExt","singleFloatTexturing","OES_texture_float","WEBGL_color_buffer_float","RGBA32F_EXT","RGB32F_EXT","FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT","UNSIGNED_NORMALIZED_EXT","OES_texture_float_linear","OES_texture_half_float","HALF_FLOAT_OES","EXT_color_buffer_half_float","RGBA16F_EXT","RGB16F_EXT","OES_texture_half_float_linear","_j","_len1","getFloatExtension","candidate","halfFramebuffer","halfLinear","halfTexture","importance","preference","singleFramebuffer","singleLinear","singleTexture","prefer","filterable","renderable","alphaEnd","alphaStart","getColorFun","textureGradient","WebGLDebugUtils","makeDebugContext","glEnumToString","vertexShaderBlit","fragmentShaderBlit","heights","HeatmapHeights","canvasHeight","nodeFront","addPoints","_results","clampShader","multiplyShader","blurShader","nodeBack","HeatmapNode","vertexSize","maxPointCount","vertexBufferData","vertexBufferViews","bufferIndex","intensityLoc","STREAM_DRAW","floatExt","fbo","Framebuffer","deleteFRamebuffer","FRAMEBUFFER_UNSUPPORTED","FRAMEBUFFER_INCOMPLETE_ATTACHMENT","FRAMEBUFFER_INCOMPLETE_DIMENSIONS","FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT","framebufferRenderbuffer","DEPTH_ATTACHMENT","RENDERBUFFER","_tooltip_editor2","_tooltip_editor","_tooltip2","_tooltip","_gl_popup2","_gl_popup","GLMapTooltip","rowForTooltip","updateCurrentTooltip","saveTooltip","currentItems","isEditing","shouldRenderEditor","shouldRenderTooltip","getLngLatForTooltip","keepInView","disableScroll","renderLoading","renderEditor","_reactDndHtml5Backend2","_reactDndHtml5Backend","_sortable_tooltip_editor_item2","_sortable_tooltip_editor_item","__decorate","decorate","addItemDisabled","addItemClasses","addItemCallback","moveItem","isDraggable","updateColumn","MapTooltipEditor","_DragDropManager","_createTestBackend","_createStore","_createStore2","_reducers","_reducers2","dragDropActions","_DragDropMonitor","_DragDropMonitor2","createBackend","handleRefCountChange","shouldSetUp","isSetUp","bindActionCreator","actionCreator","boundActions","createStore","preloadedState","enhancer","ensureCanMutateNextListeners","nextListeners","currentListeners","isSubscribed","_isPlainObject2","currentReducer","replaceReducer","nextReducer","ActionTypes","INIT","outerSubscribe","observeState","_symbolObservable2","_symbolObservable","originalModule","symbolObservablePonyfill","_dirtyHandlerIds2","_dragOffset2","_refCount2","_dragOperation2","_stateId2","_dragOffset","_dragOperation","_refCount","_dirtyHandlerIds","_stateId","_without2","_without","_HandlerRegistry","_HandlerRegistry2","DragDropMonitor","prevStateId","currentStateId","canDrag","canDrop","validateSourceContract","validateTargetContract","validateType","getNextHandlerId","_getNextUniqueId2","HandlerRoles","SOURCE","TARGET","parseRoleFromHandlerId","_asap","_asap2","_getNextUniqueId","HandlerRegistry","pinnedSourceId","pinnedSource","includePinned","isSourceId","isTargetId","throwFirstError","pendingErrors","asap","rawTask","freeTasks","RawTask","rawAsap","requestErrorThrow","makeRequestCallFromTimer","requestFlush","flushing","newLength","handleTimer","timeoutHandle","intervalHandle","BrowserMutationObserver","getNextUniqueId","nextUniqueId","DragSource","DropTarget","TestBackend","getActions","didCallSetup","didCallTeardown","DragDropContextProvider","DragLayer","DragLayerContainer","unsubscribeFromOffsetChange","subscribeToOffsetChange","unsubscribeFromStateChange","_isValidType2","createSource","_createSourceFactory2","_decorateHandler2","connectBackend","connectDragSource","_registerSource2","_createSourceMonitor2","_createSourceConnector2","_decorateHandler","_registerSource","_createSourceFactory","_createSourceMonitor","_createSourceConnector","_isValidType","_isDisposable2","_isDisposable3","_Disposable2","_Disposable3","_CompositeDisposable2","_CompositeDisposable3","_SerialDisposable2","_SerialDisposable3","registerSource","unregisterSource","createSourceFactory","ALLOWED_SPEC_METHODS","REQUIRED_SPEC_METHODS","createSourceMonitor","SourceMonitor","isCallingCanDrag","isCallingIsDragging","internalMonitor","isDraggingSource","getInitialClientOffset","getInitialSourceClientOffset","getClientOffset","createSourceConnector","reconnectDragSource","disconnectCurrentDragSource","currentHandlerId","currentDragSourceNode","currentDragSourceOptions","reconnectDragPreview","disconnectCurrentDragPreview","currentDragPreviewNode","connectDragPreview","currentDragPreviewOptions","_wrapConnectorHooks2","dragSource","_areOptionsEqual2","dragPreview","_wrapConnectorHooks","_areOptionsEqual","cloneWithRef","newRef","previousRef","createTarget","_createTargetFactory2","connectDropTarget","_registerTarget2","_createTargetMonitor2","_createTargetConnector2","_registerTarget","_createTargetFactory","_createTargetMonitor","_createTargetConnector","registerTarget","unregisterTarget","createTargetFactory","Target","createTargetMonitor","TargetMonitor","isCallingCanDrop","isOverTarget","createTargetConnector","reconnectDropTarget","disconnectCurrentDropTarget","currentDropTargetNode","currentDropTargetOptions","createHTML5Backend","_HTML5Backend2","getEmptyImage","NativeTypes","_HTML5Backend","_getEmptyImage","_getEmptyImage2","_NativeTypes","_EnterLeaveCounter","_EnterLeaveCounter2","_BrowserDetector","_OffsetUtils","_NativeDragSources","HTML5Backend","sourcePreviewNodes","sourcePreviewNodeOptions","sourceNodes","sourceNodeOptions","enterLeaveCounter","dragStartSourceIds","dropTargetIds","dragEnterTargetIds","currentNativeSource","currentNativeHandle","currentDragSourceNodeOffset","currentDragSourceNodeOffsetChanged","altKeyPressed","mouseMoveTimeoutTimer","handleTopDragStart","handleTopDragStartCapture","handleTopDragEndCapture","handleTopDragEnter","handleTopDragEnterCapture","handleTopDragLeaveCapture","handleTopDragOver","handleTopDragOverCapture","handleTopDrop","handleTopDropCapture","handleSelectStart","endDragIfSourceWasRemovedFromDOM","endDragNativeItem","asyncEndDragNativeItem","isNodeInDocument","__isReactDndBackendSetUp","addEventListeners","removeEventListeners","clearCurrentDragSourceNode","asyncEndDragFrameId","handleDragEnter","handleDragOver","handleDrop","dropEffect","isDraggingNativeItem","getCurrentSourceNodeOptions","captureDraggingState","getNodeClientOffset","createNativeDragSource","mouseMoveTimeoutId","getEventClientOffset","nativeType","matchNativeItemType","setDragImage","sourceNode","_getCurrentSourcePrev","getCurrentSourcePreviewNodeOptions","offsetPoint","dragPreviewOffset","getDragPreviewOffset","setCurrentDragSourceNode","beginDragNativeItem","getCurrentDropEffect","dragOverTargetIds","checkIfCurrentDragSourceRectChanged","mutateItemByReadingDataTransfer","dragDrop","isContentEditable","_union","_union2","EnterLeaveCounter","entered","enteringNode","isNodeEntered","leavingNode","ELEMENT_NODE","_el$getBoundingClient","isImageNode","getDragPreviewSize","dragPreviewWidth","dragPreviewHeight","dragPreviewNode","dragPreviewNodeOffsetFromClient","offsetFromDragPreview","_getDragPreviewSize","isManualOffsetX","isManualOffsetY","_MonotonicInterpolant2","interpolantY","_MonotonicInterpolant","MonotonicInterpolant","dys","dxs","c1s","mNext","dxNext","c2s","c3s","invDx","_common","xHere","diffSq","_defineEnumerableProperties","descs","getDataFromDataTransfer","typesToTry","resultSoFar","typeToTry","_nativeTypesConfig$ty","nativeTypesConfig","exposeProperty","matchesTypes","NativeDragSource","_mutatorMap","dataTransferTypes","nativeItemType","_nativeTypesConfig","files","emptyImage","TooltipEditorItem","_compose2","_compose","_tooltip_editor_column_select2","_tooltip_editor_column_select","itemSource","itemTarget","draggedId","tooltipRow","selectedColumn","SortableTooltipEditorItem","_flowRight","_flowRight2","_tooltip_value2","_tooltip_value","TooltipEditorColumnSelect","columnValue","labelClasses","unshown","toggleMenu","SingleItemTooltip","MultiItemTooltip","EditButton","groupItemsByColorAndSort","TooltipItemGroup","TooltipValueWrapper","valueClass","mapValueWrapperProps","groupedItems","contentClass","_handleIndexChange","newIndex","_onBack","_onForward","_onJumpTo","_Component2","_Component3","colorForItem","renderPopupContent","_panTo","_onClose","_clickAttached","GLPopup","fireError","loseContext","isFillHidden","isOutlineHidden","Url","slashes","urlParse","parseQueryString","slashesDenoteHost","urlFormat","urlResolveObject","resolveObject","protocolPattern","portPattern","simplePathPattern","delims","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","unsafeProtocol","hostlessProtocol","slashedProtocol","querystring","queryIndex","uSplit","slashRegex","simplePath","lowerProto","hostEnd","hec","atSign","parseHost","ipv6Hostname","hostparts","newpart","validParts","notHost","esc","rel","tkeys","tk","tkey","rkeys","rk","relPath","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","authInHost","hasTrailingSlash","maxKeys","kstr","vstr","stringifyPrimitive","ks","DEFAULT_SIZE","prevWidth","prevHeight","workerPool","acquire","getWorkerSource","workerSource","loadTileJSON","reloadCallback","workerOptions","_updateWorkerData","LayoutVertexArrayType","elementArray2","MAX_VERTEX_ARRAY_LENGTH","paintVertexBuffers","LINE_DISTANCE_BUFFER_BITS","labelangle","findPoleOfInaccessibility","MAX_QUADS","symbolPlacement","pointsOrRings","findPolygonAnchors","polygonRings","outerRing","poi","compareMax","Cell","pointToPolygonDist","minDistSq","getCentroidCell","cellSize","cellQueue","bestCell","numProbes","TinyQueue","_down","_up","halfLength","_coord","_tileCoords","_setTile","_prepared","globalWorkerPool","WorkerPool","WebWorker","pitchAlignment","rotateWithMap","pitchWithMap","u_rotate_with_map","u_pitch_with_map","u_pitch","u_bearing","u_aspect_ratio","u_scale_with_map","drawLineTile","isOpaque","wasZooming","updateScale","maxMeters","getDistance","meters","getRoundNum","latlng1","latlng2","lat1","lat2","pow10","_popup","_closePopup","setPopup","_popupHandlersAdded","_openPopup","getPopup","togglePopup","VisualizationButton","_share_links2","_share_links","_shared_link_helper2","_shared_link_helper","_grid_help_menu2","_grid_help_menu","_share_options2","_share_options","_grid_download_menu2","_grid_download_menu","_TransparencyLoginButton2","_TransparencyLoginButton","HeaderActions","renderedDownloads","transparency_url","handleOpenHowTo","handleOpenFeedback","handleOpenWelcome","handleOpenBudget101","GridHelpMenu","budget_101","_TetherComponent","_TetherComponent2","_tether","_tether2","renderElementToPropTypes","childrenPropType","attachmentPositions","TetherComponent","_targetNode","_elementParentNode","_arguments","onUpdate","onRepositioned","renderElementTag","elementComponent","_renderNode","_updateTether","renderElementTo","tetherOptions","_registerEventListeners","targetModifier","classPrefix","optimizations","getActualBoundingClientRect","boundingRect","_frameElement","frameRect","getScrollParents","computedStyle","_style","removeUtilElements","zeroElement","docEl","getOrigin","getOffsetParent","getScrollBarSize","_scrollBarSize","widthContained","widthScroll","SVGAnimatedString","addOffset","offsetToPx","getBoundingRect","tether","scrollParents","BOUNDS_FORMAT","TetherBase","zeroPosCache","_bindings$event$i","_x6","_x7","_x8","_TetherBase$Utils","transformKey","tethers","lastCall","lastDuration","pendingTimeout","MIRROR_LR","MIRROR_TB","OFFSET_MAP","autoToFixedAttachment","relativeToAttachment","attachmentToOffset","parseOffset","_value$split","_value$split2","parseAttachment","TetherClass","_Evented","addTargetClasses","hasBottomScroll","scrollBottom","borderTopWidth","borderBottomWidth","borderLeftWidth","fitAdj","scrollPercentage","elementAttach","targetAttach","sides","_addAttachClasses","flushChanges","clearCache","updateAttachClasses","elementPos","lastSize","_lastSize","targetPos","getTargetBounds","targetSize","manualOffset","manualTargetOffset","_module2","scrollbarSize","moveElement","offsetPosition","offsetParentStyle","offsetParentSize","offsetBorder","_this8","same","transcribe","_same","gpu","offsetParentIsBody","currentNode","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","writeCSS","Tether","allClasses","constraint","outOfBoundsClass","pinnedClass","addClasses","tAttachment","eAttachment","pin","changeAttachX","changeAttachY","_attachment$split","_attachment$split2","pinned","oob","oobClass","abutted","targetPosSide","shiftTop","shiftLeft","_shift","_shift2","_share_message_footer2","_share_message_footer","_share_message_header2","_share_message_header","_share_message_action2","_share_message_action","_message_search2","_message_search","handleUpdateMessageField","handleSubmit","ShareMessage","addMessageAllUsers","handleInviteAll","ShareMessageFooter","currentInvitedUserNames","shareDescription","ShareMessageHeader","ShareMessageAction","onRemoveMessageUser","MessageUser","isNewUser","isCurrentUser","userClasses","updateSearchQuery","renderMessageUsers","MessageSearch","Helpers","ScrollElement","ScrollLink","Button","_Link","_Link2","_Button","_Button2","_Element","_Element2","_scrollLink","_scrollLink2","_scrollElement","_scrollElement2","_Helpers","_Helpers2","LinkElement","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","cancelEvent","ButtonElement","ElementWrapper","defaultScroller","ShareNotification","_report_permission_option2","_report_permission_option","onOptionClick","selectedOption","onSaveClick","ChangeReportPermission","ReportPermissionOption","_invitable_user2","_invitable_user","_error_display2","_error_display","_invitee_search2","_invitee_search","onRemoveUser","_loadReportIndex","renderInvitedUsers","updateRole","_updateRole","updateUserRole","_reloadReport","ShareOptionsContent","_owner_confirmation2","_owner_confirmation","_share_options_dropdown2","_share_options_dropdown","showConfirmation","_getActionSection","_onChangeRole","confirmOwner","_hideConfirmation","InvitableUser","share__user","share__user__pending","userMessage","hasUserSeenReport","_onConfirm","OwnerConfirmation","ShareOptionsDropdown","getInviteErrorMessage","ErrorDisplay","dismissError","InviteeSearch","ExportFilter","shouldShowExportFilter","parallelCapable","stateScaleEntity","onExportFilter","ROW_LIMIT","GridDownloadMenu","reportDataSize","buttonItem","buttonContainer","tooManyRowsError","rowsLimit","exportFilterButton","rowsCount","exportDisabled","TargetToggle","_target_progress_bar2","_target_progress_bar","isBetweenValuesValid","isWarningThresholdValid","noWarningProvided","valueAsFloat","warningAsFloat","targetPanel","handleTargetChange","stripInput","fromInput","toInput","warningFromInput","warningToInput","valueInput","warningInput","handleTargetSave","handleTypeChange","TargetPanelContainer","warningThresholdValid","renderBarComponent","TargetProgressBar","bars","TargetStatus","CheckDescriptionItems","PdfButton","CheckMessage","CheckMessageLink","voucherId","getLink","getCheckMessage","expense_type","toSnakeCase","getQueryStringPart","getUrl","getQueryString","checkProperty","checkDescription","getColumn","checkDescriptionValue","currentField","CheckDescriptionItem","resourceKey","filteredFields","descriptionPairs","CheckPanel","handleQuestions","onWrapperClick","check_date","check_no","paid_to","HowToModal","hideModal","Banner","WelcomeModal","_breakdown_menu2","_breakdown_menu","_breakdowns_settings_toggle2","_breakdowns_settings_toggle","_breakdowns_settings_panel2","_breakdowns_settings_panel","BreakdownMenu","breakdownsSettingsPanel","inBreakdownColumnSettingToggle","handleBreakdownsSettingsCancel","handleBreakdownsSettingsSave","setCurrentBreakdown","filteredBreakdowns","toggleBreakdownVisibility","isAllBreakdownsVisible","isAllBreakdownsChecked","toggleAllBreakdownVisibility","BreakdownsSettingsPanelContainer","GridReportTotal","currentFilter","onCancelExportFilter","getAmountColumnState","friendlyColumnName","_index2","_index","_email_logged_in_user2","_email_logged_in_user","_export_modal2","_export_modal","_report_download_actions2","_report_download_actions","_processing_export2","_processing_export","handleConfirm","jobObservable","PublicUser","renderError","_finished_export2","_finished_export","ProcessingExport","FinishedExport","UserEmail","submitExport","errorWithRequest","EmailLoggedInUser","summaryTableContainer","breakdownData","breakdownTitle","firstElementData","headerTitle","getFixedRowStyle","getFixedColumnStyle","renderHeaderCells","rowKey","rowItemValues","handleFilterClick","formatedItem","yearTotals","footerData","grandTotal","formatedTotal","renderFooterCells","summaryData","breakdownDataBySeriesName","breakdownTotals","Total","SavedViewButton","ToggleIcons","SetDefaultStateButton","SettingsButton","ReportConfigButtons","settingsButton","canUpdateReport","canCreateSavedViews","showCreateViews","reportActionsClassName","report__actions","isPresentation","EntityLogo","logoSrc","ReportListItem","getListItemId","rowButtonClasses","isPreview","ReportList","reportItems","_saved_views_panel2","_saved_views_panel","TogglePanel","getActiveMainPanel","isSavedViewsEnabled","publicFacing","hasSavedViews","getSavedViewsCount","canCreate","activePanelClass","handleSavedClick","_saved_views_list2","_saved_views_list","_saved_view_modal2","_saved_view_modal","SavedViewsPanel","savedViews","getSortedViews","visitedSavedViews","getVisitedViews","activeSavedView","isEditViewSyncing","modalView","visitedItems","activeItem","canUserEditViews","onEditItem","handleEditClick","isSyncing","onDelete","handleDelete","isSameEntityOrOpenGov","canManage","_querystring2","_querystring","_saved_view_item2","_saved_view_item","SavedViewsList","isConrolPanel","legend_sort","isVisited","onEditClick","SavedViewItem","savedViewModifiers","draggable","onDragOver","onDragEnter","onDrop","handleViewClick","renderEditControls","effectAllowed","relY","SavedViewModal","focusDescription","currentDescription","descriptionField","setSelectionRange","createTextRange","collapse","StoryListItem","StoryList","handleFilterAll","FilterButtons","_router2","_router","_header_actions2","_header_actions","_graphtype2","_graphtype","_filter_panel_options2","_filter_panel_options","_legend2","_legend","_download2","_download","_summary_graph2","_summary_graph","_annotations_panel2","_annotations_panel","_summary_report_filters_panel2","_summary_report_filters_panel","_global_alert2","_howto2","_howto","_download4","_download3","_filter_panel2","_filter_panel","_datagrid_container_component2","_datagrid_container_component","summaryTableHeight","SummaryReport","$graph","showLogo","handleSavedViewsStoreChange","handleAthenaInitialized","handleAthenaLoaded","handleAthenaError","handleRenderData","renderPackage","loadPackageRequest","updateDataSets","updateCoaMask","updateParams","activeView","xAxisLabels","accountCodeQuery","extraFiles","extra_files","athenaLoaded","handleLegendSelect","lineId","handleLegendMore","handleLegendLess","handleLegendItemEnter","legendOver","handleLegendItemLeave","handleRetryClick","retryButton","linkedYears","reportModel","howToModal","downloadModal","budget101Modal","tosModal","isHighlightingEnabled","sourceDatasets","projectionsErrors","getErrorsByProjectionTypesFromSourceDatasets","embedReportStyle","accountTypes","versusViews","shouldRenderGraph","isExpanded","onItemClick","onItemEnter","onItemLeave","onShowMore","onShowLess","annotationCount","isPublic","lastParams","downloadButtons","newParams","parsedParams","_breadcrumbs2","_breadcrumbs","_title2","_title","backClass","resetClass","breakdownTree","perCapitaValue","Breadcrumbs","Crumb","itemClasses","crumbs","computeCrumbs","hintPosition","renderCrumbItems","handleCrumbSelect","crumb","Title","scaleDescription","currentScale","YAxisScalePill","perSomething","classNameForIcon","_help_menu2","_help_menu","_create_copy_menu2","_create_copy_menu","DropDownCopyMenu","existingReports","showCreateCopyMenu","dropdownName","HelpMenu","useCurrentReportState","invalidName","isSubmitting","handleNameChange","toggleSetDefaultState","toggleCopySavedViews","handleCloneReport","cloneReportOptions","handleFormSubmit","handleFormCancel","CreateCopyMenu","handleChangeGraphType","TranslatedGraphType","FilterPanelOptions","summaryReportState","toggleState","yAxisScaleToggle","_annotations_button2","_annotations_button","singleRow","handleTableLinkClick","tableOffsetTop","reportOffsetTop","AnnotationsButton","legend__item","downloadUrls","createAndSubmitForm","createForm","newForm","measureSpan","_series_tooltip2","_series_tooltip","_single_point_tooltip2","_single_point_tooltip","SummaryGraph","tip","singleTooltip","renderDataError","filterSummaryTooltips","tooltips","hasChart","hasAxis","minimumHeight","updateGraphSize","renderGraph","projectionsChanged","projectionTypeChanged","projectionTypeHasNoErrors","overlayData","shouldUpdateGraphSize","dataError","setSeriesTooltipState","setSingleTooltipState","getPointsFromSeries","isOverlay","graphPoint","tooltipData","totalData","aggregateTitle","slider","$slider","lastSelection","lastAccountType","SeriesTooltip","SinglePointTooltip","_reactAutolinkText2","_reactAutolinkText","AnnotationsPanel","maxAnnotationLength","selectedAnnotation","wide","handleBack","annotationNodeNames","readMore","dataSetYear","handleReadMore","scrollToNode","scrollContainer","prepareElements","getAnchorHref","getAnchorText","truncatedText","keyElements","_reactPureRenderFunction","_reactPureRenderFunction2","_match_parser","_match_parser2","AutoLinkText","_match_validator","_url_match","_url_match2","charBeforeProtocolRelMatchRegex","urlRegex","_match","_match2","matchedText","protocolUrlMatch","wwwProtocolRelativeMatch","tldProtocolRelativeMatch","isValidMatch","isValidUriScheme","urlMatchDoesNotHaveProtocolOrDot","urlMatchDoesNotHaveAtLeastOneWordChar","isInvalidProtocolRelativeMatch","uriSchemeMatch","uriScheme","uriSchemeRegex","hasFullProtocolRegex","hasWordCharAfterProtocolRegex","invalidProtocolRelMatchRegex","URLMatch","protocolPrepended","_url","_protocolUrlMatch","_protocolRelativeMatch","stripProtocolRelativePrefix","_breakdown_switcher2","_breakdown_switcher","_filter_menu_toggles2","_filter_menu_toggles","_time_period2","_time_period","_fiscal_year_dropdown2","_fiscal_year_dropdown","SummaryReportFiltersPanel","fiscal_year_dropdown","AccountTypesDropdown","selectedValue","_onSelectAccountType","BreakdownSwitcher","FilterMenuToggles","isBreakdown","active_breakdown","TimePeriod","minDataSetCount","selectedHandle","handleSliderClick","renderPicker","pickerMinYear","pickerMaxYear","handlePickerClick","handlePickerSelect","ignoreClick","nextYear","ignoreToggle","DownloadModal","optionValue","includeDetails","textChanged","exportError","setOption","addRemoveDetails","setDownloadOption","generatePreview","updateStatus","updateDetails","removeDetails","toggleCustomDetails","updateDesc","updateTitle","checkRows","checkColumn","varianceColCount","hasTable","downloadPreviewImage","printSetup","rerender","createDummyReport","renderReportDescription","previewWarning","renderWarning","renderReportTitle","removeDummyReport","checkMaxCharacters","_onFormChange","fieldName","reportDetails","rowsLength","dummyContainer","createReportContainer","isScalable","addDesc","addGraph","reportDesc","convertSvgToCanvas","addSummaryTable","addFooter","ele","summaryTable","createDummyContainer","titleElement","desciptionElement","class","filtersMessage","secondaryGraph","addCss","cssStyle","atrib","webstore","graph2","dataURLtoBlob","dataurl","mime","bstr","u8arr","convertCanvasToImage","currentCanvas","msToBlob","msSaveBlob","preview","statusCallBack","previewCallBack","generateCanvas","dummySummaryTable","removeDummyContainer","_html2canvas_operations","svgimage","serializer","logging","useCORS","allowTaint","_html2canvas","_html2canvas2","_canvg2","_canvg","_CanvasRenderer","_CanvasRenderer2","_Logger","_Logger2","_Window","html2canvas","conf","removeContainer","foreignObjectRendering","renderElement","_NodeParser","_Renderer","_Renderer2","_ForeignObjectRenderer2","_Clone","_Font","windowBounds","documentBackgroundColor","bodyBackgroundColor","isTransparent","SUPPORT_FOREIGNOBJECT_DRAWING","supportForeignObject","cloner","inlineFonts","DocumentCloner","cloneWindow","clonedElement","NodeParser","clonedDocument","imageStore","renderOptions","_StackingContext","_StackingContext2","_NodeContainer2","IGNORED_NODE_NAMES","parseNodeTree","nextNode","childNode","Text","HTMLElement","SHOULD_TRAVERSE_CHILDREN","treatAsRealStackingContext","createsRealStackingContext","createsStackingContext","parentStack","getRealParentStackingContext","childStack","_treatAsRealStackingContext","_parentStack","_childStack","isPositionedWithZIndex","isBodyWithTransparentRoot","StackingContext","getOpacity","Size","BezierCurve","firstHalf","abbc","bccd","_value$split$map","_value$split$map2","BLOCK","RUN_IN","FLOW","FLOW_ROOT","TABLE","FLEX","GRID","RUBY","SUBGRID","LIST_ITEM","TABLE_ROW_GROUP","TABLE_HEADER_GROUP","TABLE_FOOTER_GROUP","TABLE_ROW","TABLE_CELL","TABLE_COLUMN_GROUP","TABLE_COLUMN","TABLE_CAPTION","RUBY_BASE","RUBY_TEXT","RUBY_BASE_CONTAINER","RUBY_TEXT_CONTAINER","CONTENTS","parseDisplayValue","setDisplayBit","INLINE_START","INLINE_END","parseFontWeight","NUMBER","numParens","appendValue","appendShadow","toFloat","MATRIX","parseTransformOrigin","parseTransformMatrix","webkitTransform","mozTransform","msTransform","oTransform","webkitTransformOrigin","mozTransformOrigin","msTransformOrigin","oTransformOrigin","matrix3d","COLLAPSE","Circle","_Gradient","renderNodeBackgroundAndBorders","renderNodeContent","renderTextNode","drawShape","_image","contentBox","_width","_height","HAS_BACKGROUND","renderableBorders","backgroundPaintingArea","renderBackgroundImage","renderBorder","renderBackgroundRepeat","renderBackgroundGradient","backgroundImageSize","renderRepeat","gradientBounds","parseGradient","GRADIENT_TYPE","LINEAR_GRADIENT","renderLinearGradient","RADIAL_GRADIENT","renderRadialGradient","curvePoints","_opacity","renderStackContent","_splitStackingContext","splitStackingContexts","_splitStackingContext2","negativeZIndex","zeroOrAutoZIndexOrTransformedOrOpacity","positiveZIndex","nonPositionedFloats","nonPositionedInlineLevel","_splitDescendants","splitDescendants","_splitDescendants2","inlineLevel","nonInlineLevel","sortByZIndex","renderStack","renderNode","isInlineLevel","transformWebkitRadialGradientArgs","RadialGradient","LinearGradient","RADIAL_GRADIENT_SHAPE","_Angle","SIDE_OR_CORNER","PERCENTAGE_ANGLES","ENDS_WITH_LENGTH","FROM_TO_COLORSTOP","RADIAL_SHAPE_DEFINITION","ELLIPSE","LENGTH_FOR_POSITION","parseColorStops","parseLinearGradient","transformObsoleteColorStops","parseRadialGradient","firstColorStopIndex","HAS_LENGTH","lastSpaceIndex","_stop","absoluteValuedColorStops","previousColorStop","_stop2","nextColorStep","stepSize","hasPrefix","parseAngle","HAS_SIDE_OR_CORNER","HAS_DIRECTION","calculateGradientDirection","parseSideOrCorner","parsePercentageAngle","gradientCenter","gradientRadius","calculateRadius","radian","HALF_LINE_LENGTH","parseTopRight","_angle$split$map","_angle$split$map2","findCorner","optimumDistance","optimumCorner","_corner","SHAPE_AND_EXTENT","RADIUS","matchStartPosition","matchShapeExtent","matchStartRadius","matchEndPosition","matchEndRadius","matchPosition","matchRadius","ANGLE","_Proxy","_ResourceLoader","_ResourceLoader2","copyInline","referenceElement","scrolledElements","copyStyles","inlineImages","inlineImage","backgroundImages","HTMLImageElement","clonedChild","createStyleSheetFontsFromText","getSheetFonts","fonts","dataUri","fontFace","fontCss","HTMLCanvasElement","HTMLIFrameElement","tempIframe","generateIframeKey","_parseBounds","getIframeDocumentElement","iframeCanvas","TEXT_NODE","createElementClone","clonedReferenceElement","HTMLBodyElement","createPseudoHideStyles","inlineAllImages","inlinePseudoElement","PSEUDO_BEFORE","PSEUDO_AFTER","cloneCanvasContents","CSSRule","FONT_FACE_RULE","baseHref","createHTMLDocument","restoreOwnerScroll","clonedCanvas","clonedCtx","pseudoElt","stripQuotes","URL_REGEXP","anonymousReplacedElement","PSEUDO_HIDE_ELEMENT_CLASS_BEFORE","PSEUDO_HIDE_ELEMENT_CLASS_AFTER","createStyles","initNode","DATA_URI_REGEXP","createIframeContainer","cloneIframeContainer","documentClone","iframeLoad","iframeLoader","scrolling","adoptNode","ResourceLoader","hasResourceInCache","SUPPORT_SVG_DRAWING","isInlineImage","isSameOrigin","addImage","_loadImage","SUPPORT_CORS_IMAGES","xhrImage","imageLoadHandler","supportsDataImages","isInlineBase64Image","SUPPORT_BASE64_DRAWING","_link","_resources","INLINE_SVG","INLINE_BASE64","INLINE_IMG","canvg","RGBColor","stackBlur","getSelectorSpecificity","typeCount","attributeRegex","idRegex","classRegex","pseudoElementRegex","pseudoClassWithBracketsRegex","pseudoClassRegex","elementRegex","build","FRAMERATE","MAX_VIRTUAL_PIXELS","UniqueId","Definitions","Styles","StylesSpecificity","Animations","Images","ViewPort","viewPorts","Clear","SetCurrent","RemoveCurrent","Current","ComputeSize","ImagesLoaded","compressSpaces","AJAX","parseXml","Windows","Data","Xml","xmlDoc","Dom","XmlDocument","XmlLoadSettings","prohibitDtd","loadXml","Property","numValue","valueOrDefault","numValueOrDefault","addOpacity","opacityProp","getDefinition","isUrlDefinition","getFillStyleDefinition","createGradient","getHrefAttribute","getDPI","viewPort","getEM","em","Font","getUnits","processPercent","toMilliseconds","toRadians","textBaselineMapping","toTextBaseline","Variants","Weights","CreateFont","ToNumberArray","applyTransform","xp","yp","CreatePoint","CreatePath","BoundingBox","addX","addY","addBoundingBox","addQuadraticCurve","p0x","p0y","cp1x","cp1y","cp2x","cp2y","addBezierCurve","p3x","p3y","b2ac","isPointInBox","Type","unapply","applyToPoint","SkewBase","skewX","skewY","transformType","AspectRatio","desiredWidth","desiredHeight","refX","refY","meetOrSlice","scaleMin","scaleMax","EmptyProperty","ElementBase","stylesSpecificity","createIfNotExists","skipAncestors","ps","setContext","renderChildren","addChild","CreateElement","addStylesFromStyleDefinition","specificity","existingSpecificity","allUppercase","captureTextNodes","RenderedElementBase","newLineWidth","lineCap","lineJoin","paintOrder","gaps","setLineDash","webkitLineDash","mozDash","lineDashOffset","webkitLineDashOffset","mozDashOffset","PathElementBase","Mouse","checkPath","markers","getMarkers","getBoundingBox","baseClearContext","baseSetContext","quadraticCurveTo","ellipse","KAPPA","getPoints","polyline","PathParser","previousCommand","angles","isCommandOrEnd","isRelativeCommand","getToken","getScalar","nextCommand","makeAbsolute","getAsControlPoint","getAsCurrentPoint","getReflectedControlPoint","addMarker","priorTo","addMarkerAngle","getMarkerPoints","getMarkerAngles","pp","newP","cntrl","cp","xAxisRotation","largeArcFlag","sweepFlag","currp","cpp","centp","halfWay","tempSvg","cctx","baseRender","GradientBase","getGradient","attributesToInherit","inheritStopContainer","stopsContainer","attributeToInherit","parentOpacityProp","addParentOpacity","rootView","tempCtx","AnimateBase","maxDuration","initialUnits","calcValue","frozen","animationFrozen","animationFrozenValue","animateColor","animateTransform","horizAdvX","isRTL","isArabic","missingGlyph","arabicForm","fontface","ascent","descent","unitsPerEm","missingglyph","getAnchorDelta","renderChild","startI","measureTextRecursive","textParent","measureText","TextElementBase","getGlyph","customFont","strokeText","lw","measure","textToMeasure","tref","baseRenderChildren","checkBoundingBox","isSvg","drawSvg","cssDefs","cssDef","srcs","urlStart","urlEnd","oldParent","cMask","maskCtx","oldBeginPath","CanvasRenderingContext2D","oldClosePath","efd","extraFilterDistance","feMorphology","feComposite","feColorMatrix","imGet","imSet","m3","srcData","feGaussianBlur","blurRadius","canvasRGBA","MISSING","loadXmlDoc","mapXY","isFirstRender","xRatio","yRatio","waitingForImages","intervalID","needUpdate","hasEvents","runEvents","eventElements","isPointInPath","svgTags","svgTag","Zepto","cOpts","ignoreMouse","ignoreAnimation","ignoreDimensions","ignoreClear","scaleWidth","scaleHeight","color_string","simple_colors","feldspar","lightslateblue","violetred","color_defs","example","toRGB","toRGBA","toHex","getHelpXML","examples","list_item","list_color","example_div","list_item_value","pixels","yw","r_sum","g_sum","b_sum","a_sum","r_out_sum","g_out_sum","b_out_sum","a_out_sum","r_in_sum","g_in_sum","b_in_sum","a_in_sum","rbs","widthMinus1","heightMinus1","radiusPlus1","sumFactor","stackStart","BlurStack","stackEnd","stackIn","stackOut","mul_sum","mul_table","shg_sum","shg_table","_panel2","_panel","FilterPanel","_subscribeBudgetDataEvents","_setAccountTypeChildren","panelState","_unsubscribeBudgetDataEvents","typesBreakdown","_setPanelTitle","_getVisiblePanels","isFilterButtonClick","isTitleFilterClick","targetClassName","isFilterCloseClick","panelStateCopy","filterPredicate","visiblePanels","changeSort","Panel","_node2","_node","_search_input2","_search_input","filterText","searchOverflow","searchResultCount","_tagMatchedNodes","_clearTaggedNodes","_visitChildNodes","visitorFunc","matchedNodes","expandStrategy","_accountTreeNodeExpand","_nodeExpand","regexpSearch","searchExpanded","searchHidden","searchIndexStart","searchIndexEnd","startMatchIndex","maxSearchResults","_tagMatchedNode","typesTree","_selectAllNodes","_closePanel","endMatchIndex","placeholderText","onUserInput","SortDropdown","TranslatedPanel","_toggleNode","_expandNode","_selectExclusiveNode","_renderDropItemBar","isUngrouped","dropItemBarClassNames","textClasses","_renderHighlightNode","indexStart","indexEnd","isCurExpanded","liClasses","buttonsClasses","SearchInput","sortMethods","sortOptions","curSort","cleanSourceDatasetErrors","getReadableProjectionsErrors","getReadableErrorYears","getProjectionDropdownListItemTitleAndDescription","PROJECTION_ERROR_MESSAGE","PROJECTION_TYPE_VALUES","PROJECTION_TYPES","PROJECTIONS_ERROR_TYPE_VALUES","PROJECTIONS_ERROR_TYPE_MESSAGES","isValidErrorType","getErrorMessage","PROJECTION_TYPE_BASE_DESCRIPTION","typehasErrors","sourceDataset","data_errors","previousError","currentError","currentErrorValue","calendarYear","calendar_year","calendarMonth","calendar_month","calendarYearErrors","cleanedSourceDatasets","previousDatasets","currentDataset","dataErrors","previousErrors","SummaryTableHead","anyExpandedRootLines","firstColumnStyle","renderCollapseCell","renderHeaderCell","account_type","highlight_variance","current_variance","variance_formulas","isVarianceOverOrUnderBudget","_datagrid_component2","_datagrid_component","EmbeddedGriddleComponent","columnProperties","fromDate","availableYears","transactionTableHeight","selectedTab","shouldRenderDatagrid","isPublicMode","handleFetchAvailableYears","handleDateChange","formatYearSelection","griddleStateChangeHandler","onKeyUp","handleFilterReset","fyMonthOffset","fiscalAdjust","buildFormattedFYString","handleSelectedTab","isGridVisible","getTabContent","loadingTotals","txTabCount","getTabIcons","txTabIcons","onFilterReset","onBreakdownTableSwitch","handleBreakdownTabSwitch","onFetchAvailableYears","DataGrid","reportNumberType","_createModels","_createGridInstance","_adjustGridDimensions","tableHeaderHeight","tabHeadingHeight","setLinkageNodes","setAccountCodeQuery","createFetchDataHandler","emptyFetchDataHandler","fetchGridState","fetchSchema","transformedCols","_createSlickgridInstance","transformedYears","_fiscalYearRange","maxDate","minDateAfterFYBreak","maxDateBeforeFYBreak","fetchTotal","$deferred","linkage_view","gridStateId","elementPosition","otherProperties","numberType","loaderClasses","_wizard2","_wizard","ReportVisibility","visibiltyClass","visibilityHint","ReportPanelItem","isOtherEntity","productIconClass","handleSettings","ReportPanelList","entityDefaultReportId","selectedReportId","onMakeDefault","ReportsTab","onClickAllEntities","handleWrapperClick","handleRootClick","tab","handleTabClick","clicked","_report_creation_flow2","_report_creation_flow","_report_edit_flow2","_report_edit_flow","_report_linking_flow2","_report_linking_flow","flowMap","NewReport","EditDatasets","LinkGridReport","ReportWizard","ReportFlow","originalReport","hasCOASelectionRights","stateMachine","showCOASelection","eventListeners","handleStateTransition","handleReportError","toggleSaving","stepComponent","modifiedReport","nextHistory","toState","fromState","handleComponentSetProps","stepComponentProps","chooseLedgerTypes","_base_report_flow2","_base_report_flow","_start2","_report_type2","_report_type","_ledger_types2","_ledger_types","_coa2","_coa","_tx_data_sets2","_tx_data_sets","_report_name2","_report_name","_report_created2","_report_created","_no_data2","_no_data","ReportCreationFlow","validateFlow","loadReportTypes","fetchReportTypes","loadDataSets","fetchDataSets","onDataSetsLoaded","chartOfAccountsIds","reportTypes","failedDataSetRequests","transactionDataSets","_onEnter","dataSetsLoaded","NoData","ChooseReportType","default_coa_id","ChooseChartOfAccounts","ChooseLedgerTypes","ChooseLedgerDataSets","ChooseTransactionDataSet","ReportDetails","ReportCreated","makeFsmNamespace","machinaCount","getDefaultOptions","eventQueue","targetReplayState","priorState","_priorAction","_currentAction","sourcePropKey","sourcePropVal","getHandlerName","getActualType","propType","machina","inputType","inExitHandler","handlerName","catchAll","currentActionArgs","processQueue","_onExit","attemptedState","filterFn","untilState","toProcess","evnt","deferUntilTransition","stateName","queued","queuedArgs","deferUntilNextHandler","_machKeys","fsm","machObj","blendedState","instanceStates","classProps","newFsm","ReportTypeItem","iconClass","getSelectedType","reportTypeItems","ledgerTypes","included","fteCount","ledgerType","_toggleLedgerType","LedgerTypeOption","differenceDataSetsCounter","selectedChart","getSelectedChart","coaErrors","chartsWithDataSets","ChooseReportName","handleFormChange","manageDataURL","_report_types2","_report_types","failedRequests","onRequestCompleted","report_types","ReportEditFlow","originalDataSetIds","updatedDataSets","_ajax_error2","_ajax_error","_no_grid_reports2","_no_grid_reports","_embed_grid_report2","_embed_grid_report","ReportLinkFlow","onDataSetsError","NotData","EmbedGridReport","AjaxError","LinkGridReports","availableReports","assocReportID","navigateNewReport","handlePasswordChange","PasswordModal","htmlFor","unexpectedErrorMessage","_settings_category_list2","_settings_category_list","_settings_category_item2","_settings_category_item","_settings_category_panel2","_settings_category_panel","_general_settings2","_general_settings","_view_settings2","_view_settings","_default_configuration2","_default_configuration","_current_year_settings2","_current_year_settings","ReportSettingsPanel","_getStateFromStore","settingsPanelState","canUpdate","canUpdateMask","canUpdateReportName","hasChanges","isEntityAdmin","isOpengovAdmin","isOpengovTSD","maskOptions","getMaskOptions","scalePerCapitalEnabled","_shouldShowLinkage","isNotGrid","hasLinkageEnabled","_onWrapperClick","_getCategories","showReportSettings","isYTDReport","saveable","visibleCategories","_settings_panel_header2","_settings_panel_header","SettingsCategoryList","AdditionalTitle","SettingsPanelHeaderText","additional","SettingsCategoryItem","SettingsCategoryPanel","CategoryHandler","_mask_field2","_mask_field","_onContinue","GeneralSettings","_onDeleteConfirm","isReportHidden","isDeleting","renderUpdateReportName","renderSetReportDescriptionVisible","renderSetReportAutoUpdate","renderCheckImages","renderTotalToggle","renderSummaryTableToggle","renderLocaleField","renderCanDelete","renderDeleteStatus","MaskField","_y_axis_scale2","_y_axis_scale","_metrics_dropdown2","_metrics_dropdown","ViewSettings","YAxisScale","entitySettingsLink","unitLabel","MetricsDropdown","overlaysAvailable","scalesAvailable","overlaySelected","disableOverdownDropdown","_x_axis_editor2","_x_axis_editor","DefaultConfiguration","_onChangeXAxisLabel","fiscalYearText","XAxisEditor","xAxisLabel","DataSet","onDataSetUp","handleDataSetUp","onDataSetDown","handleDataSetDown","otherIndex","_disableable_toggle2","_disableable_toggle","invalidProrationProps","CurrentYearSettings","enabledToggleLabel","disabledToggleLabel","disabledHint","hasInvalidProps","TOGGLE_ON_STATE","TOGGLE_OFF_STATE","handleOnToggle","DisableableToggle","invalidProps","showHint","selectedEntity","StoryView","_stories_header_actions2","_stories_header_actions","selectStoryToView","nextStoryId","frameBorder","StoriesHeaderActions","DEFINE_PROPERTY","_babelPolyfill","$fails","wksDefine","enumKeys","gOPNExt","$GOPS","$JSON","_stringify","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","USE_NATIVE","QObject","findChild","setSymbolDesc","protoDesc","$defineProperties","$propertyIsEnumerable","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","keyFor","useSetter","useSimple","FAILS_ON_PRIMITIVES","replacer","$replacer","$getPrototypeOf","$freeze","$seal","$preventExtensions","$isFrozen","$isSealed","$isExtensible","FProto","nameRE","HAS_INSTANCE","FunctionProto","$Number","BROKEN_COF","TRIM","third","maxCode","aNumberValue","$toFixed","ERROR","numToString","$toPrecision","MIN_SAFE_INTEGER","$acosh","acosh","asinh","$asinh","$atanh","atanh","cbrt","clz32","LOG2E","hypot","value1","value2","larg","$imul","xn","yn","xl","yl","log10","log2","$fromCodePoint","fromCodePoint","callSite","tpl","$at","codePointAt","$endsWith","endPosition","$startsWith","pv","$toISOString","lz","DateProto","createProperty","upTo","cloned","$sort","$forEach","STRICT","$filter","$some","$every","$reduce","$indexOf","NEGATIVE_ZERO","$find","$flags","$RegExp","CORRECT_NEW","tiRE","piRE","fiU","advanceStringIndex","regExpExec","$match","maybeCallNative","fullUnicode","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","$replace","getSubstitution","captures","namedCaptures","replacement","functionalReplace","accumulatedResult","nextSourcePosition","replacerArgs","sameValue","SEARCH","$search","previousLastIndex","callRegExpExec","$min","SUPPORTS_Y","SPLIT","$split","internalSplit","lastLength","lastLastIndex","splitLimit","separatorCopy","unicodeMatching","lim","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","microtask","newPromiseCapabilityModule","perform","v8","$Promise","FakePromise","PromiseRejectionEvent","isThenable","isReject","reaction","exited","onHandleUnhandled","onUnhandled","unhandled","isUnhandled","onunhandledrejection","onrejectionhandled","$reject","$resolve","executor","onFulfilled","capability","$index","alreadyCalled","$isView","fin","viewS","viewT","rApply","fApply","thisArgument","argumentsList","rConstruct","NEW_TARGET_BUG","ARGS_BUG","newTarget","$args","deleteProperty","Enumerate","enumerate","getProto","existingDescriptor","ownDesc","setProto","$includes","arraySpeciesCreate","depthArg","$pad","WEBKIT_BUG","getFlags","RegExpProto","$RegExpStringIterator","matchAll","getDesc","$values","__defineGetter__","__lookupGetter__","__lookupSetter__","DEG_PER_RAD","RAD_PER_DEG","fscale","iaddh","$x0","$x1","$y0","isubh","imulh","$u","$v","u0","umulh","signbit","onFinally","defineMetadata","metadataKey","metadataValue","deleteMetadata","ordinaryGetMetadata","getMetadata","ordinaryMetadataKeys","oKeys","pKeys","getMetadataKeys","getOwnMetadata","getOwnMetadataKeys","ordinaryHasMetadata","hasMetadata","hasOwnMetadata","$metadata","OBSERVABLE","cleanupSubscription","subscriptionClosed","closeSubscription","SubscriptionObserver","$Observable","MSIE","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","explicit","innerFn","outerFn","tryLocsList","protoGenerator","Generator","_invoke","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","defineIteratorMethods","AsyncIterator","__await","unwrapped","callInvokeWithMethodAndArg","previousPromise","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","GenStateSuspendedYield","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iteratorMethod","iteratorSymbol","Op","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","inModule","regeneratorRuntime","NativeIteratorPrototype","Gp","genFun","awrap","skipTempReset","rootEntry","rootRecord","rval","hasCatch","hasFinally","finallyEntry","thrown","delegateYield","$re","regExp","createRunCallback","createStandalonePropExtractor","google","TranslateElement","pageLanguage","includedLanguages","InlineLayout","HORIZONTAL","gaTrack","gaId"],"mappings":"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W,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,gBAAiB,IACjB,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,UAAW,IACX,aAAc,IACd,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,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AAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC5D,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAG5DE,GACE,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC/D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,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","file":"rapp_standalone.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1817);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nif (true) {\n  module.exports = __webpack_require__(741);\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (false) {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = __webpack_require__(750)();\n}\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js\n\n;(function (global, factory) {\n     true ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n        return (Object.getOwnPropertyNames(obj).length === 0);\n    } else {\n        var k;\n        for (k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.weekdayMismatch &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n        }\n        else {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction mod(n, x) {\n    return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nfunction daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n        return NaN;\n    }\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return globalLocale;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            var aliasedRequire = require;\n            __webpack_require__(783)(\"./\" + name);\n            getSetGlobalLocale(oldLocale);\n        } catch (e) {}\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n        else {\n            if ((typeof console !==  'undefined') && console.warn) {\n                //warn user if arguments are passed but the locale could not be set\n                console.warn('Locale ' + key +  ' not found. Did you forget to load it?');\n            }\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var locale, parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                locale = loadLocale(config.parentLocale);\n                if (locale != null) {\n                    parentConfig = locale._config;\n                } else {\n                    if (!localeFamilies[config.parentLocale]) {\n                        localeFamilies[config.parentLocale] = [];\n                    }\n                    localeFamilies[config.parentLocale].push({\n                        name: name,\n                        config: config\n                    });\n                    return null;\n                }\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, tmpLocale, parentConfig = baseConfig;\n        // MERGE\n        tmpLocale = loadLocale(name);\n        if (tmpLocale != null) {\n            parentConfig = tmpLocale._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n\n    // check for mismatching day of week\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n        getParsingFlags(config).weekdayMismatch = true;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [\n        untruncateYear(yearStr),\n        defaultLocaleMonthsShort.indexOf(monthStr),\n        parseInt(dayStr, 10),\n        parseInt(hourStr, 10),\n        parseInt(minuteStr, 10)\n    ];\n\n    if (secondStr) {\n        result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n}\n\nfunction untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n    if (year <= 49) {\n        return 2000 + year;\n    } else if (year <= 999) {\n        return 1900 + year;\n    }\n    return year;\n}\n\nfunction preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n        if (weekdayProvided !== weekdayActual) {\n            getParsingFlags(config).weekdayMismatch = true;\n            config._isValid = false;\n            return false;\n        }\n    }\n    return true;\n}\n\nvar obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n};\n\nfunction calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n        return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n        // the only allowed military tz is Z\n        return 0;\n    } else {\n        var hm = parseInt(numOffset, 10);\n        var m = hm % 100, h = (hm - m) / 100;\n        return h * 60 + m;\n    }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i));\n    if (match) {\n        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n        if (!checkWeekday(match[1], parsedArray, config)) {\n            return;\n        }\n\n        config._a = parsedArray;\n        config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n        config._d = createUTCDate.apply(null, config._a);\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    switch (units) {\n        case 'year': output = monthDiff(this, that) / 12; break;\n        case 'month': output = monthDiff(this, that); break;\n        case 'quarter': output = monthDiff(this, that) / 3; break;\n        case 'second': output = (this - that) / 1e3; break; // 1000\n        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n        default: output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n    if (!this.isValid()) {\n        return null;\n    }\n    var utc = keepOffset !== true;\n    var m = utc ? this.clone().utc() : this;\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        if (utc) {\n            return this.toDate().toISOString();\n        } else {\n            return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n        }\n    }\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\nproto.quarter = proto.quarters = getSetQuarter;\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\nproto.hour = proto.hours = getSetHour;\nproto.minute = proto.minutes = getSetMinute;\nproto.second = proto.seconds = getSetSecond;\nproto.millisecond = proto.milliseconds = getSetMillisecond;\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\n\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction clone$1 () {\n    return createDuration(this);\n}\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n    return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    var totalSign = total < 0 ? '-' : '';\n    var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n    return totalSign + 'P' +\n        (Y ? ymSign + Y + 'Y' : '') +\n        (M ? ymSign + M + 'M' : '') +\n        (D ? daysSign + D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? hmsSign + h + 'H' : '') +\n        (m ? hmsSign + m + 'M' : '') +\n        (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.clone          = clone$1;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.21.0';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding  = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n    TIME: 'HH:mm',                                  // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n    MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module)))\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.12';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      var index = -1;\n      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array == null ? 0 : array.length,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(array);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // with lookup (in case of e.g. prototype pollution), and strip newlines if any.\n      // A newline wouldn't be a valid sourceURL anyway, and it'd enable code injection.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/[\\r\\n]/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      // Like with sourceURL, we take care to not check the option's prototype,\n      // as this configuration is a code injection vector.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (true) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(69)(module)))\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar core = __webpack_require__(64);\nvar hide = __webpack_require__(49);\nvar redefine = __webpack_require__(50);\nvar ctx = __webpack_require__(65);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar React = __webpack_require__(0);\nvar factory = __webpack_require__(762);\n\nif (typeof React === 'undefined') {\n  throw Error(\n    'create-react-class could not find the React object. If you are using script tags, ' +\n      'make sure that React is being loaded before create-react-class.'\n  );\n}\n\n// Hack to grab NoopUpdateQueue from isomorphic React\nvar ReactNoopUpdateQueue = new React.Component().updater;\n\nmodule.exports = factory(\n  React.Component,\n  React.isValidElement,\n  ReactNoopUpdateQueue\n);\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar UnitBezier = __webpack_require__(538);\nvar Coordinate = __webpack_require__(215);\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @param {number} t input\n * @returns {number} input\n * @private\n */\nexports.easeCubicInOut = function (t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t,\n        t3 = t2 * t;\n    return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param {number} p1x control point 1 x coordinate\n * @param {number} p1y control point 1 y coordinate\n * @param {number} p2x control point 2 x coordinate\n * @param {number} p2y control point 2 y coordinate\n * @returns {Function} interpolator: receives number value, returns\n * number value.\n * @private\n */\nexports.bezier = function(p1x, p1y, p2x, p2y) {\n    var bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n    return function(t) {\n        return bezier.solve(t);\n    };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @param {number} t\n * @returns {number} output\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param {number} n value\n * @param {number} min the minimum value to be returned\n * @param {number} max the maximum value to be returned\n * @returns {number} the clamped value\n * @private\n */\nexports.clamp = function (n, min, max) {\n    return Math.min(max, Math.max(min, n));\n};\n\n/*\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n * @param {number} n value\n * @param {number} min the minimum value to be returned, exclusive\n * @param {number} max the maximum value to be returned, inclusive\n * @returns {number} constrained number\n * @private\n */\nexports.wrap = function (n, min, max) {\n    var d = max - min;\n    var w = ((n - min) % d + d) % d + min;\n    return (w === min) ? max : w;\n};\n\n/*\n * return the first non-null and non-undefined argument to this function.\n * @returns {*} argument\n * @private\n */\nexports.coalesce = function() {\n    for (var i = 0; i < arguments.length; i++) {\n        var arg = arguments[i];\n        if (arg !== null && arg !== undefined)\n            return arg;\n    }\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param {Array<*>} array input to each call of the async function.\n * @param {Function} fn an async function with signature (data, callback)\n * @param {Function} callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @returns {undefined}\n * @private\n */\nexports.asyncAll = function (array, fn, callback) {\n    if (!array.length) { return callback(null, []); }\n    var remaining = array.length;\n    var results = new Array(array.length);\n    var error = null;\n    array.forEach(function (item, i) {\n        fn(item, function (err, result) {\n            if (err) error = err;\n            results[i] = result;\n            if (--remaining === 0) callback(error, results);\n        });\n    });\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @param {Object} obj\n * @param {Object} other\n * @returns {Array<string>} keys difference\n * @private\n */\nexports.keysDifference = function (obj, other) {\n    var difference = [];\n    for (var i in obj) {\n        if (!(i in other)) {\n            difference.push(i);\n        }\n    }\n    return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n * @param {Object} dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @returns {Object} dest\n * @private\n */\nexports.extend = function (dest) {\n    for (var i = 1; i < arguments.length; i++) {\n        var src = arguments[i];\n        for (var k in src) {\n            dest[k] = src[k];\n        }\n    }\n    return dest;\n};\n\n/**\n * Extend a destination object with all properties of the src object,\n * using defineProperty instead of simple assignment.\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n * @private\n */\nexports.extendAll = function (dest, src) {\n    for (var i in src) {\n        Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i));\n    }\n    return dest;\n};\n\n/**\n * Extend a parent's prototype with all properties in a properties\n * object.\n *\n * @param {Object} parent\n * @param {Object} props\n * @returns {Object}\n * @private\n */\nexports.inherit = function (parent, props) {\n    var parentProto = typeof parent === 'function' ? parent.prototype : parent,\n        proto = Object.create(parentProto);\n    exports.extendAll(proto, props);\n    return proto;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param {Object} src the object\n * @param {Array<string>} properties an array of property names chosen\n * to appear on the resulting object.\n * @returns {Object} object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src, properties) {\n    var result = {};\n    for (var i = 0; i < properties.length; i++) {\n        var k = properties[i];\n        if (k in src) {\n            result[k] = src[k];\n        }\n    }\n    return result;\n};\n\nvar id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns {number} unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n    return id++;\n};\n\n/**\n * Create a version of `fn` that is only called `time` milliseconds\n * after its last invocation\n *\n * @param {Function} fn the function to be debounced\n * @param {number} time millseconds after which the function will be invoked\n * @returns {Function} debounced function\n * @private\n */\nexports.debounce = function(fn, time) {\n    var timer, args;\n\n    return function() {\n        args = arguments;\n        clearTimeout(timer);\n\n        timer = setTimeout(function() {\n            fn.apply(null, args);\n        }, time);\n    };\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param {Array<string>} fns list of member function names\n * @param {*} context the context value\n * @returns {undefined} changes functions in-place\n * @example\n * function MyClass() {\n *   bindAll(['ontimer'], this);\n *   this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n *   alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns, context) {\n    fns.forEach(function(fn) {\n        if (!context[fn]) { return; }\n        context[fn] = context[fn].bind(context);\n    });\n};\n\n/**\n * Given a class, bind all of the methods that look like handlers: that\n * begin with _on, and bind them to the class.\n *\n * @param {Object} context an object with methods\n * @private\n */\nexports.bindHandlers = function(context) {\n    for (var i in context) {\n        if (typeof context[i] === 'function' && i.indexOf('_on') === 0) {\n            context[i] = context[i].bind(context);\n        }\n    }\n};\n\n/**\n * Set the 'options' property on `obj` with properties\n * from the `options` argument. Properties in the `options`\n * object will override existing properties.\n *\n * @param {Object} obj destination object\n * @param {Object} options object of override options\n * @returns {Object} derived options object.\n * @private\n */\nexports.setOptions = function(obj, options) {\n    if (!obj.hasOwnProperty('options')) {\n        obj.options = obj.options ? Object.create(obj.options) : {};\n    }\n    for (var i in options) {\n        obj.options[i] = options[i];\n    }\n    return obj.options;\n};\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n * @param {Array<Coordinate>} coords\n * @returns {Coordinate} centerpoint\n * @private\n */\nexports.getCoordinatesCenter = function(coords) {\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n\n    for (var i = 0; i < coords.length; i++) {\n        minX = Math.min(minX, coords[i].column);\n        minY = Math.min(minY, coords[i].row);\n        maxX = Math.max(maxX, coords[i].column);\n        maxY = Math.max(maxY, coords[i].row);\n    }\n\n    var dx = maxX - minX;\n    var dy = maxY - minY;\n    var dMax = Math.max(dx, dy);\n    return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n        .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n};\n\n/**\n * Determine if a string ends with a particular substring\n * @param {string} string\n * @param {string} suffix\n * @returns {boolean}\n * @private\n */\nexports.endsWith = function(string, suffix) {\n    return string.indexOf(suffix, string.length - suffix.length) !== -1;\n};\n\n/**\n * Determine if a string starts with a particular substring\n * @param {string} string\n * @param {string} prefix\n * @returns {boolean}\n * @private\n */\nexports.startsWith = function(string, prefix) {\n    return string.indexOf(prefix) === 0;\n};\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.mapObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        output[key] = iterator.call(context || this, input[key], key, input);\n    }\n    return output;\n};\n\n/**\n * Create an object by filtering out values of an existing object\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.filterObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        if (iterator.call(context || this, input[key], key, input)) {\n            output[key] = input[key];\n        }\n    }\n    return output;\n};\n\n/**\n * Deeply compares two object literals.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.deepEqual = function deepEqual(a, b) {\n    if (Array.isArray(a)) {\n        if (!Array.isArray(b) || a.length !== b.length) return false;\n        for (var i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    if (typeof a === 'object' && a !== null && b !== null) {\n        if (!(typeof b === 'object')) return false;\n        var keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) return false;\n        for (var key in a) {\n            if (!deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n    return a === b;\n};\n\n/**\n * Deeply clones two objects.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.clone = function deepEqual(input) {\n    if (Array.isArray(input)) {\n        return input.map(exports.clone);\n    } else if (typeof input === 'object') {\n        return exports.mapObject(input, exports.clone);\n    } else {\n        return input;\n    }\n};\n\n/**\n * Check if two arrays have at least one common element.\n * @param {Array} a\n * @param {Array} b\n * @returns {boolean}\n * @private\n */\nexports.arraysIntersect = function(a, b) {\n    for (var l = 0; l < a.length; l++) {\n        if (b.indexOf(a[l]) >= 0) return true;\n    }\n    return false;\n};\n\nvar warnOnceHistory = {};\nexports.warnOnce = function(message) {\n    if (!warnOnceHistory[message]) {\n        // console isn't defined in some WebWorkers, see #2558\n        if (typeof console !== \"undefined\") console.warn(message);\n        warnOnceHistory[message] = true;\n    }\n};\n\n/**\n * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order\n *\n * @param {Point} a\n * @param {Point} b\n * @param {Point} c\n *\n * @returns {boolean} true for a counter clockwise set of points\n */\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nexports.isCounterClockwise = function(a, b, c) {\n    return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n};\n\n/**\n * Returns the signed area for the polygon ring.  Postive areas are exterior rings and\n * have a clockwise winding.  Negative areas are interior rings and have a counter clockwise\n * ordering.\n *\n * @param {Array<Point>} ring - Exterior or interior ring\n *\n * @returns {number}\n */\nexports.calculateSignedArea = function(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n};\n\n/**\n * Detects closed polygons, first + last point are equal\n * @param {Array<Point>} points array of points\n *\n * @return {boolean} true if the points are a closed polygon\n */\nexports.isClosedPolygon = function(points) {\n    // If it is 2 points that are the same then it is a point\n    // If it is 3 points with start and end the same then it is a line\n    if (points.length < 4)\n        return false;\n\n    var p1 = points[0];\n    var p2 = points[points.length - 1];\n\n    if (Math.abs(p1.x - p2.x) > 0 ||\n        Math.abs(p1.y - p2.y) > 0) {\n        return false;\n    }\n\n    // polygon simplification can produce polygons with zero area and more than 3 points\n    return (Math.abs(exports.calculateSignedArea(points)) > 0.01);\n};\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n  Copyright (c) 2017 Jed Watson.\n  Licensed under the MIT License (MIT), see\n  http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Onboarding = exports.OpenGovLogo = exports.CheckMock = exports.ReportCard = exports.Avatar = exports.Tabs = exports.MainPanel = exports.CollectionSearch = exports.RadioColumn = exports.CheckboxColumn = exports.Table = exports.ProgressBar = exports.Loader = exports.GlobalAlert = exports.Overlay = exports.Overlays = exports.Flash = exports.Alert = exports.DropdownListItem = exports.DropdownList = exports.Dropdown = exports.CheckButton = exports.ToggleSwitch = exports.Search = exports.Slider = exports.Calendar = exports.DatePicker = exports.SelectField = exports.TextArea = exports.Toggle = exports.InputField = exports.Field = exports.Form = exports.mixin = undefined;\n\nvar _form = __webpack_require__(776);\n\nObject.defineProperty(exports, 'Form', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_form).default;\n  }\n});\n\nvar _field = __webpack_require__(138);\n\nObject.defineProperty(exports, 'Field', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_field).default;\n  }\n});\n\nvar _input_field = __webpack_require__(778);\n\nObject.defineProperty(exports, 'InputField', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_input_field).default;\n  }\n});\n\nvar _toggle = __webpack_require__(779);\n\nObject.defineProperty(exports, 'Toggle', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_toggle).default;\n  }\n});\n\nvar _textarea = __webpack_require__(780);\n\nObject.defineProperty(exports, 'TextArea', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_textarea).default;\n  }\n});\n\nvar _select_field = __webpack_require__(781);\n\nObject.defineProperty(exports, 'SelectField', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_select_field).default;\n  }\n});\n\nvar _date_picker = __webpack_require__(782);\n\nObject.defineProperty(exports, 'DatePicker', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_date_picker).default;\n  }\n});\n\nvar _calendar = __webpack_require__(494);\n\nObject.defineProperty(exports, 'Calendar', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_calendar).default;\n  }\n});\n\nvar _slider = __webpack_require__(784);\n\nObject.defineProperty(exports, 'Slider', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_slider).default;\n  }\n});\n\nvar _search = __webpack_require__(789);\n\nObject.defineProperty(exports, 'Search', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_search).default;\n  }\n});\n\nvar _toggle_switch = __webpack_require__(793);\n\nObject.defineProperty(exports, 'ToggleSwitch', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_toggle_switch).default;\n  }\n});\n\nvar _check_button = __webpack_require__(794);\n\nObject.defineProperty(exports, 'CheckButton', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_check_button).default;\n  }\n});\n\nvar _dropdown = __webpack_require__(252);\n\nObject.defineProperty(exports, 'Dropdown', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_dropdown).default;\n  }\n});\n\nvar _dropdown_list = __webpack_require__(795);\n\nObject.defineProperty(exports, 'DropdownList', {\n  enumerable: true,\n  get: function get() {\n    return _dropdown_list.DropdownList;\n  }\n});\nObject.defineProperty(exports, 'DropdownListItem', {\n  enumerable: true,\n  get: function get() {\n    return _dropdown_list.DropdownListItem;\n  }\n});\n\nvar _alert_modal = __webpack_require__(796);\n\nObject.defineProperty(exports, 'Alert', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_alert_modal).default;\n  }\n});\n\nvar _flash = __webpack_require__(797);\n\nObject.defineProperty(exports, 'Flash', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_flash).default;\n  }\n});\n\nvar _overlays = __webpack_require__(182);\n\nObject.defineProperty(exports, 'Overlays', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_overlays).default;\n  }\n});\n\nvar _overlay = __webpack_require__(798);\n\nObject.defineProperty(exports, 'Overlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_overlay).default;\n  }\n});\n\nvar _global_alert = __webpack_require__(799);\n\nObject.defineProperty(exports, 'GlobalAlert', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_global_alert).default;\n  }\n});\n\nvar _loader = __webpack_require__(800);\n\nObject.defineProperty(exports, 'Loader', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_loader).default;\n  }\n});\n\nvar _progress_bar = __webpack_require__(801);\n\nObject.defineProperty(exports, 'ProgressBar', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_progress_bar).default;\n  }\n});\n\nvar _table = __webpack_require__(802);\n\nObject.defineProperty(exports, 'Table', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_table).default;\n  }\n});\n\nvar _table_columns = __webpack_require__(803);\n\nObject.defineProperty(exports, 'CheckboxColumn', {\n  enumerable: true,\n  get: function get() {\n    return _table_columns.CheckboxColumn;\n  }\n});\nObject.defineProperty(exports, 'RadioColumn', {\n  enumerable: true,\n  get: function get() {\n    return _table_columns.RadioColumn;\n  }\n});\n\nvar _collection_search = __webpack_require__(804);\n\nObject.defineProperty(exports, 'CollectionSearch', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_collection_search).default;\n  }\n});\n\nvar _main_panel = __webpack_require__(805);\n\nObject.defineProperty(exports, 'MainPanel', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_main_panel).default;\n  }\n});\n\nvar _tabs = __webpack_require__(806);\n\nObject.defineProperty(exports, 'Tabs', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_tabs).default;\n  }\n});\n\nvar _avatar = __webpack_require__(807);\n\nObject.defineProperty(exports, 'Avatar', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_avatar).default;\n  }\n});\n\nvar _report_card = __webpack_require__(808);\n\nObject.defineProperty(exports, 'ReportCard', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_report_card).default;\n  }\n});\n\nvar _check_mock = __webpack_require__(809);\n\nObject.defineProperty(exports, 'CheckMock', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_check_mock).default;\n  }\n});\n\nvar _opengov_logo = __webpack_require__(811);\n\nObject.defineProperty(exports, 'OpenGovLogo', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_opengov_logo).default;\n  }\n});\n\nvar _onboarding = __webpack_require__(812);\n\nObject.defineProperty(exports, 'Onboarding', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_onboarding).default;\n  }\n});\n\nvar _timeout_mixin = __webpack_require__(496);\n\nvar _timeout_mixin2 = _interopRequireDefault(_timeout_mixin);\n\nvar _toggle_mixin = __webpack_require__(495);\n\nvar _toggle_mixin2 = _interopRequireDefault(_toggle_mixin);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar mixin = exports.mixin = {\n  Timeout: _timeout_mixin2.default,\n  Toggle: _toggle_mixin2.default\n};\n\n// FORMS\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v1.11.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-04-28T16:19Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper window is present,\n\t\t// execute the factory and get jQuery\n\t\t// For environments that do not inherently posses a window with a document\n\t\t// (such as Node.js), expose a jQuery-making factory as module.exports\n\t\t// This accentuates the need for the creation of a real window\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\n\nvar deletedIds = [];\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"1.11.3\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1, IE<9\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: deletedIds.sort,\n\tsplice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1, IE<9\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\twhile ( j < len ) {\n\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n\t\tif ( len !== len ) {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: function() {\n\t\treturn +( new Date() );\n\t},\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\n\t\t\t\t\t} else if ( !(--remaining) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n\tif ( document.addEventListener ) {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t} else {\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\twindow.detachEvent( \"onload\", completed );\n\t}\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\tdetach();\n\t\tjQuery.ready();\n\t}\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n\nvar strundefined = typeof undefined;\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n\tbreak;\n}\nsupport.ownLast = i !== \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery(function() {\n\t// Minified: var a,b,c,d\n\tvar val, div, body, container;\n\n\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\tif ( !body || !body.style ) {\n\t\t// Return for frameset docs that don't have a body\n\t\treturn;\n\t}\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\tbody.appendChild( container ).appendChild( div );\n\n\tif ( typeof div.style.zoom !== strundefined ) {\n\t\t// Support: IE<8\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\tdiv.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n\t\tsupport.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n\t\tif ( val ) {\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t// Support: IE<8\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\t}\n\n\tbody.removeChild( container );\n});\n\n\n\n\n(function() {\n\tvar div = document.createElement( \"div\" );\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( elem ) {\n\tvar noData = jQuery.noData[ (elem.nodeName + \" \").toLowerCase() ],\n\t\tnodeType = +elem.nodeType || 1;\n\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n\treturn nodeType !== 1 && nodeType !== 9 ?\n\t\tfalse :\n\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\n\t\t!noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n};\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\n\t// throw uncatchable exceptions if you attempt to set expando properties\n\tnoData: {\n\t\t\"applet \": true,\n\t\t\"embed \": true,\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[0],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlength = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n};\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\t// Minified: var a,b,c\n\tvar input = document.createElement( \"input\" ),\n\t\tdiv = document.createElement( \"div\" ),\n\t\tfragment = document.createDocumentFragment();\n\n\t// Setup\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone =\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tinput.type = \"checkbox\";\n\tinput.checked = true;\n\tfragment.appendChild( input );\n\tsupport.appendChecked = input.checked;\n\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\t// Support: IE6-IE11+\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tfragment.appendChild( div );\n\tdiv.innerHTML = \"<input type='radio' checked='checked' name='t'/>\";\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tsupport.noCloneEvent = true;\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n})();\n\n\n(function() {\n\tvar i, eventName,\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\teventName = \"on\" + i;\n\n\t\tif ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\tsupport[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: IE < 9, Android < 4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tjQuery._removeData( doc, fix );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery._data( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!support.noCloneEvent || !support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = (rtagName.exec( elem ) || [ \"\", \"\" ])[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdeletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ (rtagName.exec( value ) || [ \"\", \"\" ])[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optmization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n\n(function() {\n\tvar shrinkWrapBlocksVal;\n\n\tsupport.shrinkWrapBlocks = function() {\n\t\tif ( shrinkWrapBlocksVal != null ) {\n\t\t\treturn shrinkWrapBlocksVal;\n\t\t}\n\n\t\t// Will be changed later if needed.\n\t\tshrinkWrapBlocksVal = false;\n\n\t\t// Minified: var b,c,d\n\t\tvar div, body, container;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE6\n\t\t// Check if elements with layout shrink-wrap their children\n\t\tif ( typeof div.style.zoom !== strundefined ) {\n\t\t\t// Reset CSS: box-sizing; display; margin; border\n\t\t\tdiv.style.cssText =\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;\" +\n\t\t\t\t\"padding:1px;width:1px;zoom:1\";\n\t\t\tdiv.appendChild( document.createElement( \"div\" ) ).style.width = \"5px\";\n\t\t\tshrinkWrapBlocksVal = div.offsetWidth !== 3;\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\treturn shrinkWrapBlocksVal;\n\t};\n\n})();\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\n\n\nvar getStyles, curCSS,\n\trposition = /^(top|right|bottom|left)$/;\n\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar width, minWidth, maxWidth, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\";\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar left, rs, rsLeft, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\t\tret = computed ? computed[ name ] : undefined;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\" || \"auto\";\n\t};\n}\n\n\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tvar condition = conditionFn();\n\n\t\t\tif ( condition == null ) {\n\t\t\t\t// The test was not ready at this point; screw the hook this time\n\t\t\t\t// but check again when needed next time.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( condition ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due to missing dependency),\n\t\t\t\t// remove it.\n\t\t\t\t// Since there are no other hooks for marginRight, remove the whole object.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\t// Minified: var b,c,d,e,f,g, h,i\n\tvar div, style, a, pixelPositionVal, boxSizingReliableVal,\n\t\treliableHiddenOffsetsVal, reliableMarginRightVal;\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\tstyle = a && a.style;\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !style ) {\n\t\treturn;\n\t}\n\n\tstyle.cssText = \"float:left;opacity:.5\";\n\n\t// Support: IE<9\n\t// Make sure that element opacity exists (as opposed to filter)\n\tsupport.opacity = style.opacity === \"0.5\";\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!style.cssFloat;\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: Firefox<29, Android 2.3\n\t// Vendor-prefix box-sizing\n\tsupport.boxSizing = style.boxSizing === \"\" || style.MozBoxSizing === \"\" ||\n\t\tstyle.WebkitBoxSizing === \"\";\n\n\tjQuery.extend(support, {\n\t\treliableHiddenOffsets: function() {\n\t\t\tif ( reliableHiddenOffsetsVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableHiddenOffsetsVal;\n\t\t},\n\n\t\tboxSizingReliable: function() {\n\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\n\t\tpixelPosition: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelPositionVal;\n\t\t},\n\n\t\t// Support: Android 2.3\n\t\treliableMarginRight: function() {\n\t\t\tif ( reliableMarginRightVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginRightVal;\n\t\t}\n\t});\n\n\tfunction computeStyleTests() {\n\t\t// Minified: var b,c,d,j\n\t\tvar div, body, container, contents;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\n\t\t// Support: IE<9\n\t\t// Assume reasonable values in the absence of getComputedStyle\n\t\tpixelPositionVal = boxSizingReliableVal = false;\n\t\treliableMarginRightVal = true;\n\n\t\t// Check for getComputedStyle so that this code is not run in IE<9.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tpixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tboxSizingReliableVal =\n\t\t\t\t( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tcontents = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\tcontents.style.cssText = div.style.cssText =\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\tcontents.style.marginRight = contents.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\treliableMarginRightVal =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );\n\n\t\t\tdiv.removeChild( contents );\n\t\t}\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\tcontents = div.getElementsByTagName( \"td\" );\n\t\tcontents[ 0 ].style.cssText = \"margin:0;border:0;padding:0;display:none\";\n\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\tcontents[ 0 ].style.display = \"\";\n\t\t\tcontents[ 1 ].style.display = \"none\";\n\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t}\n\n\t\tbody.removeChild( container );\n\t}\n\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set. See: #7116\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Support: IE\n\t\t\t\t// Swallow errors from 'invalid' CSS values (#5509)\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tsupport.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tjQuery._data( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !support.shrinkWrapBlocks() ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\t// Minified: var a,b,c,d,e\n\tvar input, div, select, a, opt;\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\n\t// First batch of tests.\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE8 only\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\tif ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {\n\n\t\t\t\t\t\t// Support: IE6\n\t\t\t\t\t\t// When new option element is added to select box we need to\n\t\t\t\t\t\t// force reflow of newly added node in order to workaround delay\n\t\t\t\t\t\t// of initialization properties\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toption.selected = optionSet = true;\n\n\t\t\t\t\t\t} catch ( _ ) {\n\n\t\t\t\t\t\t\t// Will be executed only in IE6\n\t\t\t\t\t\t\toption.scrollHeight;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption.selected = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = support.getSetAttribute,\n\tgetSetInput = support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\n\n// Retrieve booleans specially\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret, handle;\n\t\t\tif ( !isXML ) {\n\t\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\t\thandle = attrHandle[ name ];\n\t\t\t\tattrHandle[ name ] = ret;\n\t\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t\tattrHandle[ name ] = handle;\n\t\t\t}\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn elem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\tif ( name === \"value\" || value === elem.getAttribute( name ) ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Some attributes are constructed with empty-string values when not defined\n\tattrHandle.id = attrHandle.name = attrHandle.coords =\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn (ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\n\t// Fixing value retrieval on a button requires this module\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret && ret.specified ) {\n\t\t\t\treturn ret.value;\n\t\t\t}\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\n// Support: Safari, IE9+\n// mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\n\njQuery.parseJSON = function( data ) {\n\t// Attempt to parse using the native JSON parser first\n\tif ( window.JSON && window.JSON.parse ) {\n\t\t// Support: Android 2.3\n\t\t// Workaround failure to string-cast null input\n\t\treturn window.JSON.parse( data + \"\" );\n\t}\n\n\tvar requireNonComma,\n\t\tdepth = null,\n\t\tstr = jQuery.trim( data + \"\" );\n\n\t// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\n\t// after removing valid tokens\n\treturn str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\n\n\t\t// Force termination if we see a misplaced comma\n\t\tif ( requireNonComma && comma ) {\n\t\t\tdepth = 0;\n\t\t}\n\n\t\t// Perform no more replacements after returning to outermost depth\n\t\tif ( depth === 0 ) {\n\t\t\treturn token;\n\t\t}\n\n\t\t// Commas must not follow \"[\", \"{\", or \",\"\n\t\trequireNonComma = open || comma;\n\n\t\t// Determine new depth\n\t\t// array/object open (\"[\" or \"{\"): depth += true - false (increment)\n\t\t// array/object close (\"]\" or \"}\"): depth += false - true (decrement)\n\t\t// other cases (\",\" or primitive): depth += true - true (numeric cast)\n\t\tdepth += !close - !open;\n\n\t\t// Remove this token\n\t\treturn \"\";\n\t}) ) ?\n\t\t( Function( \"return \" + str ) )() :\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\t} catch( e ) {\n\t\txml = undefined;\n\t}\n\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType.charAt( 0 ) === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t(!support.reliableHiddenOffsets() &&\n\t\t\t((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n};\n\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\n\t// Support: IE6+\n\tfunction() {\n\n\t\t// XHR cannot access local files, always use ActiveX for that case\n\t\treturn !this.isLocal &&\n\n\t\t\t// Support: IE7-8\n\t\t\t// oldIE XHR does not support non-RFC2616 methods (#13240)\n\t\t\t// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\n\t\t\t// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\n\t\t\t// Although this check for six methods instead of eight\n\t\t\t// since IE also does not support \"trace\" and \"connect\"\n\t\t\t/^(get|post|head|put|delete|options)$/i.test( this.type ) &&\n\n\t\t\tcreateStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE<10\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t});\n}\n\n// Determine support properties\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( options ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !options.crossDomain || support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\t\t\t\t\tvar i,\n\t\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set headers\n\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE's ActiveXObject throws a 'Type Mismatch' exception when setting\n\t\t\t\t\t\t// request header to a null-value.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// To keep consistent with other XHR implementations, cast the value\n\t\t\t\t\t\t// to string and ignore `undefined`.\n\t\t\t\t\t\tif ( headers[ i ] !== undefined ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] + \"\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( options.hasContent && options.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, statusText, responses;\n\n\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\t\t\t\t\t\t\t// Clean up\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = undefined;\n\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\n\t\t\t\t\t\t\t// Abort manually if needed\n\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\tstatus = xhr.status;\n\n\t\t\t\t\t\t\t\t// Support: IE<10\n\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\tif ( !status && options.isLocal && !options.crossDomain ) {\n\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, xhr.getAllResponseHeaders() );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !options.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Add to the list of active xhr callbacks\n\t\t\t\t\t\txhr.onreadystatechange = xhrCallbacks[ id ] = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off, url.length ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\tjQuery.inArray(\"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ],\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\t// BlackBerry 5, iOS 3 (original iPhone)\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// getComputedStyle returns percent when specified for top/left/bottom/right\n// rather than make the css module depend on the offset module, we just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( true ) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\treturn jQuery;\n\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar UnitBezier = __webpack_require__(538);\nvar Coordinate = __webpack_require__(190);\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @param {number} t input\n * @returns {number} input\n * @private\n */\nexports.easeCubicInOut = function (t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t,\n        t3 = t2 * t;\n    return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param {number} p1x control point 1 x coordinate\n * @param {number} p1y control point 1 y coordinate\n * @param {number} p2x control point 2 x coordinate\n * @param {number} p2y control point 2 y coordinate\n * @returns {Function} interpolator: receives number value, returns\n * number value.\n * @private\n */\nexports.bezier = function(p1x, p1y, p2x, p2y) {\n    var bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n    return function(t) {\n        return bezier.solve(t);\n    };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @param {number} t\n * @returns {number} output\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param {number} n value\n * @param {number} min the minimum value to be returned\n * @param {number} max the maximum value to be returned\n * @returns {number} the clamped value\n * @private\n */\nexports.clamp = function (n, min, max) {\n    return Math.min(max, Math.max(min, n));\n};\n\n/*\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n * @param {number} n value\n * @param {number} min the minimum value to be returned, exclusive\n * @param {number} max the maximum value to be returned, inclusive\n * @returns {number} constrained number\n * @private\n */\nexports.wrap = function (n, min, max) {\n    var d = max - min;\n    var w = ((n - min) % d + d) % d + min;\n    return (w === min) ? max : w;\n};\n\n/*\n * return the first non-null and non-undefined argument to this function.\n * @returns {*} argument\n * @private\n */\nexports.coalesce = function() {\n    for (var i = 0; i < arguments.length; i++) {\n        var arg = arguments[i];\n        if (arg !== null && arg !== undefined)\n            return arg;\n    }\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param {Array<*>} array input to each call of the async function.\n * @param {Function} fn an async function with signature (data, callback)\n * @param {Function} callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @returns {undefined}\n * @private\n */\nexports.asyncAll = function (array, fn, callback) {\n    if (!array.length) { return callback(null, []); }\n    var remaining = array.length;\n    var results = new Array(array.length);\n    var error = null;\n    array.forEach(function (item, i) {\n        fn(item, function (err, result) {\n            if (err) error = err;\n            results[i] = result;\n            if (--remaining === 0) callback(error, results);\n        });\n    });\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @param {Object} obj\n * @param {Object} other\n * @returns {Array<string>} keys difference\n * @private\n */\nexports.keysDifference = function (obj, other) {\n    var difference = [];\n    for (var i in obj) {\n        if (!(i in other)) {\n            difference.push(i);\n        }\n    }\n    return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n * @param {Object} dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @returns {Object} dest\n * @private\n */\nexports.extend = function (dest) {\n    for (var i = 1; i < arguments.length; i++) {\n        var src = arguments[i];\n        for (var k in src) {\n            dest[k] = src[k];\n        }\n    }\n    return dest;\n};\n\n/**\n * Extend a destination object with all properties of the src object,\n * using defineProperty instead of simple assignment.\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n * @private\n */\nexports.extendAll = function (dest, src) {\n    for (var i in src) {\n        Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i));\n    }\n    return dest;\n};\n\n/**\n * Extend a parent's prototype with all properties in a properties\n * object.\n *\n * @param {Object} parent\n * @param {Object} props\n * @returns {Object}\n * @private\n */\nexports.inherit = function (parent, props) {\n    var parentProto = typeof parent === 'function' ? parent.prototype : parent,\n        proto = Object.create(parentProto);\n    exports.extendAll(proto, props);\n    return proto;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param {Object} src the object\n * @param {Array<string>} properties an array of property names chosen\n * to appear on the resulting object.\n * @returns {Object} object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src, properties) {\n    var result = {};\n    for (var i = 0; i < properties.length; i++) {\n        var k = properties[i];\n        if (k in src) {\n            result[k] = src[k];\n        }\n    }\n    return result;\n};\n\nvar id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns {number} unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n    return id++;\n};\n\n/**\n * Create a version of `fn` that is only called `time` milliseconds\n * after its last invocation\n *\n * @param {Function} fn the function to be debounced\n * @param {number} time millseconds after which the function will be invoked\n * @returns {Function} debounced function\n * @private\n */\nexports.debounce = function(fn, time) {\n    var timer, args;\n\n    return function() {\n        args = arguments;\n        clearTimeout(timer);\n\n        timer = setTimeout(function() {\n            fn.apply(null, args);\n        }, time);\n    };\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param {Array<string>} fns list of member function names\n * @param {*} context the context value\n * @returns {undefined} changes functions in-place\n * @example\n * function MyClass() {\n *   bindAll(['ontimer'], this);\n *   this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n *   alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns, context) {\n    fns.forEach(function(fn) {\n        context[fn] = context[fn].bind(context);\n    });\n};\n\n/**\n * Given a class, bind all of the methods that look like handlers: that\n * begin with _on, and bind them to the class.\n *\n * @param {Object} context an object with methods\n * @private\n */\nexports.bindHandlers = function(context) {\n    for (var i in context) {\n        if (typeof context[i] === 'function' && i.indexOf('_on') === 0) {\n            context[i] = context[i].bind(context);\n        }\n    }\n};\n\n/**\n * Set the 'options' property on `obj` with properties\n * from the `options` argument. Properties in the `options`\n * object will override existing properties.\n *\n * @param {Object} obj destination object\n * @param {Object} options object of override options\n * @returns {Object} derived options object.\n * @private\n */\nexports.setOptions = function(obj, options) {\n    if (!obj.hasOwnProperty('options')) {\n        obj.options = obj.options ? Object.create(obj.options) : {};\n    }\n    for (var i in options) {\n        obj.options[i] = options[i];\n    }\n    return obj.options;\n};\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n * @param {Array<Coordinate>} coords\n * @returns {Coordinate} centerpoint\n * @private\n */\nexports.getCoordinatesCenter = function(coords) {\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n\n    for (var i = 0; i < coords.length; i++) {\n        minX = Math.min(minX, coords[i].column);\n        minY = Math.min(minY, coords[i].row);\n        maxX = Math.max(maxX, coords[i].column);\n        maxY = Math.max(maxY, coords[i].row);\n    }\n\n    var dx = maxX - minX;\n    var dy = maxY - minY;\n    var dMax = Math.max(dx, dy);\n    return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n        .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n};\n\n/**\n * Determine if a string ends with a particular substring\n * @param {string} string\n * @param {string} suffix\n * @returns {boolean}\n * @private\n */\nexports.endsWith = function(string, suffix) {\n    return string.indexOf(suffix, string.length - suffix.length) !== -1;\n};\n\n/**\n * Determine if a string starts with a particular substring\n * @param {string} string\n * @param {string} prefix\n * @returns {boolean}\n * @private\n */\nexports.startsWith = function(string, prefix) {\n    return string.indexOf(prefix) === 0;\n};\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.mapObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        output[key] = iterator.call(context || this, input[key], key, input);\n    }\n    return output;\n};\n\n/**\n * Create an object by filtering out values of an existing object\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.filterObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        if (iterator.call(context || this, input[key], key, input)) {\n            output[key] = input[key];\n        }\n    }\n    return output;\n};\n\n/**\n * Deeply compares two object literals.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.deepEqual = function deepEqual(a, b) {\n    if (Array.isArray(a)) {\n        if (!Array.isArray(b) || a.length !== b.length) return false;\n        for (var i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    if (typeof a === 'object') {\n        if (!(typeof b === 'object')) return false;\n        var keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) return false;\n        for (var key in a) {\n            if (!deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n    return a === b;\n};\n\n/**\n * Deeply clones two objects.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.clone = function deepEqual(input) {\n    if (Array.isArray(input)) {\n        return input.map(exports.clone);\n    } else if (typeof input === 'object') {\n        return exports.mapObject(input, exports.clone);\n    } else {\n        return input;\n    }\n};\n\n/**\n * Check if two arrays have at least one common element.\n * @param {Array} a\n * @param {Array} b\n * @returns {boolean}\n * @private\n */\nexports.arraysIntersect = function(a, b) {\n    for (var l = 0; l < a.length; l++) {\n        if (b.indexOf(a[l]) >= 0) return true;\n    }\n    return false;\n};\n\nvar warnOnceHistory = {};\nexports.warnOnce = function(message) {\n    if (!warnOnceHistory[message]) {\n        // console isn't defined in some WebWorkers, see #2558\n        if (typeof console !== \"undefined\") console.warn(message);\n        warnOnceHistory[message] = true;\n    }\n};\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Point;\n\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n    clone: function() { return new Point(this.x, this.y); },\n\n    add:     function(p) { return this.clone()._add(p);     },\n    sub:     function(p) { return this.clone()._sub(p);     },\n    mult:    function(k) { return this.clone()._mult(k);    },\n    div:     function(k) { return this.clone()._div(k);     },\n    rotate:  function(a) { return this.clone()._rotate(a);  },\n    matMult: function(m) { return this.clone()._matMult(m); },\n    unit:    function() { return this.clone()._unit(); },\n    perp:    function() { return this.clone()._perp(); },\n    round:   function() { return this.clone()._round(); },\n\n    mag: function() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    equals: function(p) {\n        return this.x === p.x &&\n               this.y === p.y;\n    },\n\n    dist: function(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    distSqr: function(p) {\n        var dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    angle: function() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    angleTo: function(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    angleWith: function(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ.\n    angleWithSep: function(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    _matMult: function(m) {\n        var x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _add: function(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    _sub: function(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    _mult: function(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    _div: function(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    _unit: function() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp: function() {\n        var y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    _rotate: function(angle) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round: function() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n};\n\n// constructs Point from an array if necessary\nPoint.convert = function (a) {\n    if (a instanceof Point) {\n        return a;\n    }\n    if (Array.isArray(a)) {\n        return new Point(a[0], a[1]);\n    }\n    return a;\n};\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.GridReportActions = exports.mapReduceAllAggregateTransactions = exports.cancelAggregateRequests = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _bluebird = __webpack_require__(256);\n\nvar _bluebird2 = _interopRequireDefault(_bluebird);\n\nvar _immutable = __webpack_require__(14);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _visual_aggregate_planner = __webpack_require__(895);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _intercom_utils = __webpack_require__(121);\n\nvar _map_constants = __webpack_require__(45);\n\nvar _geodata_utils = __webpack_require__(147);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar gridDataApi = new _og_api2.default.OgApi('/api/grid_data/v0');\nvar getYear = function getYear(index) {\n    // Note this method is only called when the `result` object has the `fiscal_year` key\n    return _grid_report_store2.default.getState().getIn(['visualization', 'xAxis']).get(index).result.fiscal_year;\n};\nvar addLeadingZero = function addLeadingZero(number) {\n    return ('0' + number).slice(-2);\n};\nvar getTimePeriodQuery = function getTimePeriodQuery(index) {\n    var schema = _grid_report_store2.default.getState().get('schema');\n    var dateColumnName = schema.get('dateColumn');\n    var xAxis = _grid_report_store2.default.getState().getIn(['visualization', 'xAxis']);\n    var xAxisTick = xAxis.get(index);\n    var query = {\n        query: {\n            filter: _defineProperty({}, dateColumnName, {})\n        }\n    };\n    if (xAxisTick.result.month) {\n        var year = xAxisTick.result.year;\n        var _xAxisTick$result = xAxisTick.result,\n            month = _xAxisTick$result.month,\n            start_day = _xAxisTick$result.start_day,\n            end_day = _xAxisTick$result.end_day;\n        // add leading zeroes if any month or day is less than 10\n\n        month = addLeadingZero(month);\n        start_day = addLeadingZero(start_day);\n        end_day = addLeadingZero(end_day);\n        query.query.filter[dateColumnName].ge = year + '-' + month + '-' + start_day;\n        query.query.filter[dateColumnName].le = year + '-' + month + '-' + end_day;\n        return query;\n    }\n    var fiscal_year = xAxisTick.result.fiscal_year;\n\n    var entity = _report_view_store2.default.getReportEntity();\n    var fiscalYearStartMonth = entity.get('fiscal_year_start_month');\n    if (fiscalYearStartMonth) {\n        var start = fiscalYearStartMonth === 1 ? (0, _moment2.default)(fiscal_year, 'YYYY') : (0, _moment2.default)().set({ year: fiscal_year - 1, month: fiscalYearStartMonth - 1, date: 1 });\n        var end = (0, _moment2.default)(start).add(12, 'months').subtract(1, 'day');\n        query.query.filter[dateColumnName].ge = start.format('YYYY-MM-DD');\n        query.query.filter[dateColumnName].le = end.format('YYYY-MM-DD');\n    } else {\n        query.query.filter[dateColumnName].ge = fiscal_year + '-01-01';\n        query.query.filter[dateColumnName].le = fiscal_year + '-12-31';\n    }\n    return query;\n};\n//\n// Visual Aggregate Queries\n//\nvar visualAggregateRequests = []; // We declare this out here so we can keep requests in flight\nvar cancelAggregateRequests = exports.cancelAggregateRequests = function cancelAggregateRequests() {\n    visualAggregateRequests.forEach(function (req) {\n        if (req && req.called) {\n            req.abort();\n        }\n    });\n    visualAggregateRequests = [];\n};\nvar mapReduceAllAggregateTransactions = exports.mapReduceAllAggregateTransactions = function mapReduceAllAggregateTransactions(aggReqs, queryPlan) {\n    var reducer = queryPlan.reducer;\n    var mapper = queryPlan.mapper;\n    var isSummaryTableQuery = queryPlan.isSummaryTableQuery;\n    var reduceStep = function reduceStep(transactions) {\n        return reducer ? reducer(transactions) : transactions;\n    };\n    var mapStep = function mapStep(req) {\n        return req.end().then(function (_ref) {\n            var body = _ref.body;\n            return body.transactions;\n        }).then(function (transactions) {\n            return mapper ? mapper(transactions) : transactions;\n        });\n    };\n    var successStep = function successStep(transactions) {\n        return isSummaryTableQuery ? GridReportActions.getSummaryTableAggregatesSuccess(transactions) : GridReportActions.getVisualAggregatesSuccess(transactions);\n    };\n    cancelAggregateRequests();\n    visualAggregateRequests = aggReqs;\n    return _bluebird2.default.map(aggReqs, mapStep, { concurrency: 15 }) // Maximum Concurrency\n    .then(function (transactionCollection) {\n        return _lodash2.default.flatten(transactionCollection);\n    }).then(reduceStep).then(successStep);\n};\nvar executeQueryPlan = function executeQueryPlan(queryPlan) {\n    if (queryPlan == null) {\n        return _bluebird2.default.resolve();\n    }\n    var report = _report_view_store2.default.getRenderedReport();\n    var transactionsDataSetId = report.get('transaction_id');\n    var requests = _lodash2.default.map(queryPlan.queries, function (query) {\n        return _og_api2.default.trapi.post('query', transactionsDataSetId, query);\n    });\n    return mapReduceAllAggregateTransactions(requests, queryPlan);\n};\nvar updateData = function updateData(isSummaryTableQuery) {\n    var state = _grid_report_store2.default.getState();\n    var dbParallelCapable = _grid_report_store2.default.getSchema().get('dbParallelCapable');\n    var queryPlannerOptions = {\n        allowParallel: !dbParallelCapable,\n        isSummaryTableQuery: !!isSummaryTableQuery\n    };\n    var queryPlan = (0, _visual_aggregate_planner.buildVisualAggregatesQueryPlan)(state, queryPlannerOptions);\n    var backupPlan = void 0;\n    if (queryPlannerOptions.allowParallel) {\n        backupPlan = (0, _visual_aggregate_planner.buildVisualAggregatesQueryPlan)(state, _extends({}, queryPlannerOptions, { allowParallel: false }));\n    }\n    executeQueryPlan(queryPlan).catch(function (error) {\n        console.log(error.message);\n        if (backupPlan) {\n            return backupPlan;\n        }\n        throw error;\n    }).then(function (plan) {\n        // If primary plan worked, then transactions will already have been sent to renderer, and we'll get undefined.\n        if (plan) {\n            return executeQueryPlan(plan);\n        }\n    }).catch(function (error) {\n        cancelAggregateRequests();\n        GridReportActions.getVisualAggregatesError();\n        throw error;\n    });\n};\n//\n// Maps\n//\nvar shouldFetchMapDataBounds = function shouldFetchMapDataBounds() {\n    return !_grid_report_store2.default.getMapDataBounds();\n};\nvar shouldFitMapToDataBounds = function shouldFitMapToDataBounds() {\n    return !_grid_report_store2.default.getMapViewportBounds();\n};\nvar fitMapToDataBounds = function fitMapToDataBounds() {\n    // If we're not loading from a saved view we set the bounds of the map view to fit the map data\n    var dataBounds = _grid_report_store2.default.getMapDataStats().get('bounds');\n    GridReportActions.mapFitBounds((0, _immutable.List)([(0, _immutable.List)([dataBounds.get('x1'), dataBounds.get('y1')]), (0, _immutable.List)([dataBounds.get('x2'), dataBounds.get('y2')])]));\n};\nvar shouldGetRowForTooltipEditor = function shouldGetRowForTooltipEditor() {\n    return _grid_report_store2.default.getFirstRowOfMapData() && _grid_report_store2.default.isEditingMapTooltip();\n};\nvar getRowForTooltipEditor = function getRowForTooltipEditor() {\n    var firstRowWithLocation = _grid_report_store2.default.getFirstRowOfMapData();\n    var transactionsDataSetId = _report_view_store2.default.getRenderedReport().get('transaction_id');\n    GridReportActions.getRowsForTooltip(transactionsDataSetId, [firstRowWithLocation]);\n};\nvar shouldUpdateTooltipSchema = function shouldUpdateTooltipSchema() {\n    var tooltip = _grid_report_store2.default.getMapTooltip();\n    var tooltipVersion = tooltip.getIn(['config', 'version']);\n    return tooltip.get('config') != null && (!tooltipVersion || tooltipVersion !== _map_constants.currentMapTooltipSchema.version);\n};\nvar updateTooltipSchema = function updateTooltipSchema() {\n    var tooltip = _grid_report_store2.default.getMapTooltip();\n    var schema = _grid_report_store2.default.getSchema();\n    var updatedTooltip = _map_constants.currentMapTooltipSchema.migrateFromPrevious(tooltip, schema);\n    GridReportActions.mapTooltipSaved(updatedTooltip.get('config'));\n    GridReportActions.mapTooltipEdited(updatedTooltip.get('draft'));\n};\nvar fetchCellsForNewBounds = function fetchCellsForNewBounds(grid, bounds) {\n    return grid.get('cells').filter(function (cell) {\n        return !cell.get('loaded') && !cell.get('loader').isPending() && (0, _geodata_utils.boundsIntersect)(cell.get('bounds'), bounds);\n    }).map(function (cell) {\n        return cell.set('loader', GridReportActions.loadMapGridCell(cell));\n    });\n};\nvar currentReportWasJustCreated = function currentReportWasJustCreated() {\n    var lastCreatedReport = _grid_report_store2.default.getState().get('lastCreatedReport');\n    if (!lastCreatedReport) {\n        return false;\n    }\n    var renderedReport = _report_view_store2.default.getRenderedReport();\n    return lastCreatedReport.get('id') == renderedReport.get('id') && lastCreatedReport.get('entity_id') == renderedReport.get('entity_id');\n};\nvar getIntercomReportAttributes = function getIntercomReportAttributes() {\n    var report = _report_view_store2.default.getRenderedReport();\n    return {\n        entity: report.get('entity'),\n        reportId: report.get('id'),\n        reportName: report.get('name')\n    };\n};\nvar loadMap = function loadMap() {\n    return _bluebird2.default.resolve().then(function () {\n        if (shouldFetchMapDataBounds()) {\n            return GridReportActions.getMapMeta();\n        } else {\n            return _bluebird2.default.resolve(_grid_report_store2.default.getMapDataStats());\n        }\n    }).tap(GridReportActions.getMapStatsForDataset()).tap(function (mapMeta) {\n        var boundingBox = (0, _map_constants.getBoundingBoxFromMeta)(mapMeta);\n        return GridReportActions.setMapGrid((0, _map_constants.createMapLoaderGrid)(boundingBox.x1, boundingBox.x2, boundingBox.y1, boundingBox.y2, 5));\n    }).tap(function () {\n        return shouldFitMapToDataBounds() && fitMapToDataBounds();\n    }).tap(function () {\n        return shouldUpdateTooltipSchema() && updateTooltipSchema();\n    }).tap(function () {\n        GridReportActions.loadMapGridCellsInViewport().tap(function () {\n            return shouldGetRowForTooltipEditor() && getRowForTooltipEditor();\n        });\n    });\n};\nvar mapPromises = {\n    _rowsForTooltipPromise: null,\n    _saveGridStatePromise: null,\n    _rowForTooltipPromise: null,\n    _getMapMetaPromise: null,\n    _getMapStatsForDataset: null,\n    _getMapBreakdownValuesPromise: null,\n    _mapMinMaxValuesPromise: null,\n    _resetAndLoadPromise: null\n};\nvar cancelMapPromises = function cancelMapPromises() {\n    return _lodash2.default.each(mapPromises, function (mapPromise) {\n        return mapPromise && mapPromise.cancel();\n    });\n};\nvar trackAndLoadMap = function trackAndLoadMap() {\n    cancelMapPromises();\n    var notLoadedFromSavedState = !_grid_report_store2.default.hasPreviousSavedState();\n    if (notLoadedFromSavedState) {\n        GridReportActions.setVisualizationType('map');\n    }\n    if (currentReportWasJustCreated()) {\n        GridReportActions.clearLastCreatedReport();\n        (0, _intercom_utils.trackIntercomEvent)('grid-report-map-report-created', _extends({}, getIntercomReportAttributes()));\n    }\n    (0, _intercom_utils.trackIntercomEvent)('grid-report-map-load', _extends({}, getIntercomReportAttributes()));\n    return loadMap();\n};\nvar GridReportActions = exports.GridReportActions = {\n    // For Tests\n    mapReduceAllAggregateTransactions: mapReduceAllAggregateTransactions,\n    cancelAggregateRequests: cancelAggregateRequests,\n    executeQueryPlan: executeQueryPlan,\n    updateData: updateData,\n    // Real exports\n    setSchema: function setSchema(meta, schema, fiscalYearStartMonth) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_SCHEMA',\n            meta: meta, schema: schema, fiscalYearStartMonth: fiscalYearStartMonth\n        });\n        // If the grid state loaded before the schema then we must fetch the\n        // visual aggregates otherwise no data will be rendered in the graph.\n        if (_grid_report_store2.default.getState().get('savedStateId') && !_grid_report_store2.default.isLoading()) {\n            GridReportActions.getVisualAggregates();\n        }\n        if (_grid_report_store2.default.isMapEnabled(_grid_report_store2.default.getState()) && !_grid_report_store2.default.isLoading()) {\n            trackAndLoadMap();\n        } else {\n            if (_grid_report_store2.default.getState().getIn(['visualization', 'graphType']) == 'map') {\n                GridReportActions.setVisualizationType('bar');\n            }\n        }\n    },\n    fetchData: function fetchData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_FETCH_DATA'\n        });\n        _grid_report_store2.default.getState().get('queryModel').triggerUpdate(false, true);\n    },\n    filterByFiscalYear: function filterByFiscalYear(index) {\n        var fiscalYear = getYear(index);\n        //Do not execute dispatcher if drilled down into monthly view (as currently no weekly or monthly view)\n        if (fiscalYear) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_FILTER_BY_FISCAL_YEAR',\n                fiscalYear: fiscalYear\n            });\n            // we should not call saveGridState here because the handleStateChange method\n            // in the GridReport component calls saveGridState for us\n            GridReportActions.fetchData();\n        }\n    },\n    filterColumn: function filterColumn(column, operator, value) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_FILTER_COLUMN',\n            column: column,\n            operator: operator,\n            value: value\n        });\n        // we should not call saveGridState here because the handleStateChange method\n        // in the GridReport component calls saveGridState for us\n        GridReportActions.fetchData();\n    },\n    filterRemainingAggregates: function filterRemainingAggregates() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_FILTER_REMAINING_AGGREGATES'\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    toggleVisualizations: function toggleVisualizations() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_TOGGLE_VISUALIZATIONS'\n        });\n        // false is passed here because toggling visualizations should not fetch visual aggregates\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState(), false);\n        GridReportActions.mapReset();\n    },\n    setLastXYZDays: function setLastXYZDays(days) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_LAST_XYZ_DAYS',\n            days: days\n        });\n        GridReportActions.fetchData();\n    },\n    setVisualizationType: function setVisualizationType(graphType) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_VISUALIZATION_TYPE',\n            graphType: graphType\n        });\n        var previousSavedState = _grid_report_store2.default.getPreviousSavedState();\n        var previousGraphType = previousSavedState && previousSavedState.getIn(['visualization', 'graphType']);\n        var savedState = _grid_report_store2.default.getSavedState();\n        var dateColumn = _grid_report_store2.default.getState().getIn(['schema', 'dateColumn']);\n        if (previousGraphType !== graphType) {\n            if (previousGraphType === 'map') {\n                GridReportActions.mapReset();\n            }\n            if (graphType === 'bar' || graphType === 'line' || graphType === 'map') {\n                if (previousGraphType !== 'bar' && previousGraphType !== 'line' && previousGraphType !== 'map' && savedState.get('query') !== null) {\n                    // bar charts, line graphs and maps display all datasets so we need to clear the date column query\n                    var lastState = _grid_report_store2.default.getState().get('history').findLast(function (state) {\n                        return state.getIn(['visualization', 'graphType']) === graphType;\n                    });\n                    var dateFilter = lastState && lastState.getIn(['query', 'filter', dateColumn]) || (0, _immutable.Map)();\n                    savedState = savedState.setIn(['query', 'filter', dateColumn], dateFilter);\n                }\n                GridReportActions.saveGridState(savedState, false);\n            } else if (previousGraphType === 'bar' || previousGraphType === 'line') {\n                // Clear date filters when switching to a single-year visualizations\n                if ((graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') && savedState.getIn(['query', 'filter', dateColumn])) {\n                    savedState = savedState.deleteIn(['query', 'filter', dateColumn]);\n                }\n                GridReportActions.setVisualizationYear(savedState.getIn(['visualization', 'index']) || 0, true);\n                GridReportActions.saveGridState(savedState, false);\n            } else {\n                // For all other graph types just save the state\n                // Clear date filters when switching to a single-year visualizations\n                if ((graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') && savedState.getIn(['query', 'filter', dateColumn])) {\n                    savedState = savedState.deleteIn(['query', 'filter', dateColumn]);\n                }\n                GridReportActions.saveGridState(savedState, false);\n            }\n        }\n        // Clear target when graph type changes\n        GridReportActions.clearTarget();\n        (0, _intercom_utils.trackIntercomEvent)('grid-report-selected-viz-type', _extends({}, getIntercomReportAttributes(), {\n            selectedVizType: graphType\n        }));\n    },\n    setVisualizationYear: function setVisualizationYear(index) {\n        var shouldSaveState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        var timePeriodQuery = getTimePeriodQuery(index);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_VISUALIZATION_YEAR',\n            index: index,\n            timePeriodQuery: timePeriodQuery\n        });\n        if (shouldSaveState) {\n            var savedState = _grid_report_store2.default.getSavedState().mergeDeep((0, _immutable.fromJS)(timePeriodQuery));\n            GridReportActions.saveGridState(savedState, false);\n        }\n    },\n    getVisualAggregates: function getVisualAggregates() {\n        var showingSummaryTable = _report_view_store2.default.getRenderedReport().getIn(['properties', 'summary_table_visible']);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS'\n        });\n        updateData(false); // Visualization\n        if (showingSummaryTable) {\n            updateData(true); // Summary Table\n        }\n    },\n    getVisualAggregatesSuccess: function getVisualAggregatesSuccess(data) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS',\n            transactionsByFiscalYear: data\n        });\n    },\n    getSummaryTableAggregatesSuccess: function getSummaryTableAggregatesSuccess(data) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS',\n            transactionsByFiscalYear: data\n        });\n    },\n    toggleLegend: function toggleLegend() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_TOGGLE_LEGEND'\n        });\n        // false is passed here because toggling the legend should not fetch visual aggregates\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState(), false);\n    },\n    getVisualAggregatesError: function getVisualAggregatesError() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR'\n        });\n    },\n    reset: function reset() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_RESET'\n        });\n        GridReportActions.getVisualAggregates();\n    },\n    setVisualBreakdown: function setVisualBreakdown(breakdown) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_VISUAL_BREAKDOWN',\n            breakdown: breakdown\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    showVisualizationTooltip: function showVisualizationTooltip(left, top, name, value, percentage) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP',\n            left: left, top: top, name: name, value: value, percentage: percentage\n        });\n    },\n    hideVisualizationTooltip: function hideVisualizationTooltip() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP'\n        });\n    },\n    setDownloadsLoading: function setDownloadsLoading() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_LOAD_TRANSACTION_DOWNLOADS'\n        });\n    },\n    transactionDownloadsLoaded: function transactionDownloadsLoaded(downloadData) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_LOADED_TRANSACTION_DOWNLOADS',\n            downloads: downloadData\n        });\n    },\n    setInSyncStatus: function setInSyncStatus(meta) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_IN_SYNC_STATUS',\n            meta: meta\n        });\n    },\n    showCheckImagePanel: function showCheckImagePanel(quasiId, gridQuery, transactionId) {\n        var saveState = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n        var rowTop = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'CHECK_IMAGE_LOADING',\n            quasiId: quasiId\n        });\n        var amountColumn = _grid_report_store2.default.getState().getIn(['schema', 'amountColumn']);\n        if (quasiId) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'LOADING_CHECK_IMAGE'\n            });\n            var query = _lodash2.default.clone(gridQuery);\n            query.filter = { quasi_id: { eq: quasiId } };\n            query.isCheckImageQuery = true;\n            _og_api2.default.trapi.post('query', transactionId, query).end().then(function (response) {\n                var transaction = response.body.transactions[0];\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'SHOW_CHECK_IMAGE',\n                    checkData: transaction,\n                    amountColumn: amountColumn,\n                    loadingMessage: !!transaction.voucher_id,\n                    rowTop: rowTop\n                });\n                var query = _lodash2.default.omit(gridQuery, 'sort');\n                query.filter = { voucher_id: { eq: transaction.voucher_id } };\n                if (transaction.voucher_id) {\n                    return _og_api2.default.trapi.post('total', transactionId, query).end();\n                }\n            }).then(function (response) {\n                if (response) {\n                    _og_flux.Dispatcher.handleServerAction({\n                        actionType: 'RELATED_CHECK_INFORMATION_LOADED',\n                        relatedTransactionAmount: response.body.count <= 1 ? null : response.body.total\n                    });\n                }\n                if (saveState) {\n                    GridReportActions.saveGridState(_grid_report_store2.default.getSavedState(), false);\n                }\n            }).catch(function (err) {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'CHECK_IMAGE_LOAD_ERROR'\n                });\n                throw err;\n            });\n        }\n    },\n    hideCheckImagePanel: function hideCheckImagePanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_CHECK_IMAGE'\n        });\n    },\n    saveGridState: function saveGridState(nextSavedState) {\n        var getVisualAggregates = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_STATE_SAVING',\n            nextSavedState: nextSavedState\n        });\n        if (mapPromises._saveGridStatePromise) {\n            mapPromises._saveGridStatePromise.cancel();\n        }\n        var ignoredFields = ['id', 'map'];\n        // Clear target if the user leaves the saved view (through filtering, changing chart type, etc.)\n        var state = getVisualAggregates ? nextSavedState.setIn(['visualization', 'target'], (0, _immutable.Map)()) : nextSavedState;\n        mapPromises._saveGridStatePromise = _og_api2.default.core.post('grid_state', _lodash2.default.omit(state.toJS(), ignoredFields)).end().then(function (res) {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'GRID_REPORT_STATE_SAVED',\n                id: res.body.grid_state.id,\n                nextSavedState: state\n            });\n        }).then(function () {\n            if (getVisualAggregates) {\n                // clear the target again so it will operate on the other? state\n                GridReportActions.clearTarget();\n                GridReportActions.getVisualAggregates();\n            }\n        }).catch(function (err) {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'GRID_REPORT_STATE_SAVE_ERROR'\n            });\n            throw err;\n        });\n        return mapPromises._saveGridStatePromise;\n    },\n    dispatchGridStateLoad: function dispatchGridStateLoad(query, state, updateHistory, lastXYZDays, schema) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'GRID_REPORT_STATE_LOADED',\n            id: query,\n            loadedState: state,\n            updateHistory: updateHistory,\n            lastXYZDays: lastXYZDays,\n            schema: schema\n        });\n        GridReportActions.getVisualAggregates();\n        if (_grid_report_store2.default.isMapEnabled(_grid_report_store2.default.getState())) {\n            trackAndLoadMap();\n        }\n    },\n    loadedGridState: function loadedGridState(query, state, updateHistory, lastXYZDays, transactionId) {\n        _bluebird2.default.resolve(_og_api2.default.trapi.get('schema', transactionId).end()).then(function (response) {\n            var schema = response.body.schema;\n            // Clear date filters when switching to a single-year visualizations\n            var visualization = state.visualization;\n            var graphType = visualization.graphType;\n            if (graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') {\n                schema.forEach(function (column) {\n                    if (column.type === 'date' && state.query && state.query.filter && state.query.filter.length) {\n                        delete state.query.filter[column.name];\n                    }\n                });\n            }\n            GridReportActions.dispatchGridStateLoad(query, state, updateHistory, lastXYZDays, schema);\n        }).catch(function (err) {\n            GridReportActions.errorLoadingGridData();\n        });\n    },\n    loadGridState: function loadGridState() {\n        var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n        var _this = this;\n\n        var updateHistory = arguments[1];\n        var lastXYZDaysParam = arguments[2];\n\n        var report = _report_view_store2.default.getRenderedReport();\n        var query = state.query || report.getIn(['properties', 'grid_state_id']);\n        // No grid state id was provided and the report has no configured default state.\n        // Return false to signal to the caller we are not loading any grid state.\n        if (!query) {\n            return false;\n        }\n        if (_grid_report_store2.default.isGridStateLoaded(query)) {\n            return true;\n        }\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_STATE_LOADING',\n            stateId: query\n        });\n        _og_api2.default.core.get('grid_state', query).end().then(function (res) {\n            var state = res.body.grid_state;\n            var transactionId = _report_view_store2.default.getRenderedReport().get('transaction_id');\n            // this doesn't appear to be an error state but more of a sequencing issue\n            // or maybe transactionId is somewhere else in the state :shrug:\n            if (transactionId !== undefined) {\n                _this.loadedGridState(query, state, updateHistory, lastXYZDaysParam, transactionId);\n            }\n        }).catch(function (err) {\n            var requestResponse = err.requestResponse;\n\n            if (requestResponse && requestResponse.notFound) {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'GRID_REPORT_STATE_NOT_FOUND'\n                });\n            } else {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'GRID_REPORT_STATE_LOAD_ERROR'\n                });\n                throw err;\n            }\n        });\n        return true;\n    },\n    dismissAlert: function dismissAlert() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_DISMISS_ALERT'\n        });\n    },\n    loadingGridData: function loadingGridData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_DATA_LOADING'\n        });\n    },\n    loadedGridData: function loadedGridData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_DATA_LOADED'\n        });\n    },\n    errorLoadingGridData: function errorLoadingGridData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_DATA_LOAD_ERROR'\n        });\n    },\n    showBudget101: function showBudget101() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_BUDGET_101'\n        });\n    },\n    hideBudget101: function hideBudget101() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_BUDGET_101'\n        });\n    },\n    showTOS: function showTOS() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_TOS'\n        });\n    },\n    hideTOS: function hideTOS() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_TOS'\n        });\n    },\n    showExportFilter: function showExportFilter() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_EXPORT_FILTER'\n        });\n    },\n    hideExportFilter: function hideExportFilter() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_EXPORT_FILTER'\n        });\n    },\n    toggleTargetPanel: function toggleTargetPanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'TOGGLE_TARGET_PANEL'\n        });\n    },\n    toggleColumnsSettingsPanel: function toggleColumnsSettingsPanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'TOGGLE_COLUMNS_SETTINGS_PANEL'\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    toggleBreakdownsSettingsPanel: function toggleBreakdownsSettingsPanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'TOGGLE_BREAKDOWNS_SETTINGS_PANEL'\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    hideColumn: function hideColumn(column, visibility, settingsType, selectAll) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_COLUMN',\n            column: column,\n            visibility: visibility,\n            settingsType: settingsType,\n            selectAll: selectAll\n        });\n    },\n    resetColumns: function resetColumns(settingsData, settingsType) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'RESET_COLUMN',\n            settingsData: settingsData,\n            settingsType: settingsType\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    clearTarget: function clearTarget() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'CLEAR_TARGET'\n        });\n    },\n    setTarget: function setTarget(target) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SET_TARGET',\n            target: target\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState(), false);\n    },\n    showHowToModal: function showHowToModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_GRID_HOWTO'\n        });\n    },\n    showWelcomeModal: function showWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_GRID_WELCOME'\n        });\n    },\n    hideHowToModal: function hideHowToModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_GRID_HOWTO'\n        });\n    },\n    hideWelcomeModal: function hideWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_GRID_WELCOME'\n        });\n    },\n    startWelcomeTour: function startWelcomeTour() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_GRID_TOUR'\n        });\n    },\n    endTour: function endTour() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_GRID_TOUR'\n        });\n    },\n    gotoTourStep: function gotoTourStep(step) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GOTO_TOUR_WAYPOINT',\n            currentStep: step\n        });\n    },\n    goBack: function goBack() {\n        var currentSavedState = _grid_report_store2.default.getSavedState();\n        var currentBreakdown = currentSavedState.getIn(['visualization', 'breakdown']);\n        var currentLimit = currentSavedState.getIn(['visualization', 'limit']);\n        var currentQueryFilter = currentSavedState.getIn(['query', 'filter']);\n        var currentAmountColumn = currentSavedState.getIn(['visualization', 'amountColumn']);\n        var currentLegendSortBy = currentSavedState.getIn(['visualization', 'legendSortBy']);\n        var pastSavedState = _grid_report_store2.default.getPreviousSavedState(true);\n        var pastBreakdown = pastSavedState.getIn(['visualization', 'breakdown']);\n        var pastLimit = pastSavedState.getIn(['visualization', 'limit']);\n        var pastQueryFilter = pastSavedState.getIn(['query', 'filter']);\n        var pastAmountColumn = pastSavedState.getIn(['visualization', 'amountColumn']);\n        var pastLegendSortBy = pastSavedState.getIn(['visualization', 'legendSortBy']);\n        var breakdownValueNames = _grid_report_store2.default.getState().getIn(['visualization', 'breakdownValueNames']);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GRID_REPORT_GO_BACK'\n        });\n        // fetch visual aggreagates if the chart needs updating\n        if (breakdownValueNames.length === 1 ||\n        // if the legend item amount (index represents this) has changed...\n        currentLimit !== pastLimit ||\n        // if the breakdown has changed...\n        currentBreakdown !== pastBreakdown ||\n        // if our query filters have changed...\n        currentQueryFilter !== pastQueryFilter ||\n        // if our amount column changed...\n        currentAmountColumn !== pastAmountColumn ||\n        // if our legend sort by changed...\n        currentLegendSortBy !== pastLegendSortBy) {\n            GridReportActions.getVisualAggregates();\n        }\n    },\n    setMapType: function setMapType(mapType) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_MAP_TYPE',\n            mapType: mapType\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    clearRowsForTooltip: function clearRowsForTooltip() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP'\n        });\n    },\n    getRowsForTooltip: function getRowsForTooltip(datasetId, items) {\n        var location = (0, _geodata_utils.getLngLatFromFeature)(items[0]);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP',\n            location: location\n        });\n        if (mapPromises._rowsForTooltipPromise) {\n            mapPromises._rowsForTooltipPromise.cancel();\n        }\n        if (!datasetId) {\n            datasetId = _report_view_store2.default.getRenderedReport().get('transaction_id');\n        }\n        var query = {\n            filter: { quasi_id: { in: items.map(function (item) {\n                        return item.properties.quasi_id;\n                    }) } },\n            limit: items.length\n        };\n        mapPromises._rowsForTooltipPromise = _og_api2.default.trapi.post('query', datasetId, query).end().then(function (result) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS',\n                rowsForTooltip: result.body.transactions\n            });\n            return result.body.transactions;\n        }).catch(function (error) {\n            mapPromises._rowsForTooltipPromise.cancel();\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR',\n                error: error\n            });\n            throw error;\n        });\n        return mapPromises._rowForTooltipPromise;\n    },\n    mapLegendShowMoreClicked: function mapLegendShowMoreClicked() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED'\n        });\n    },\n    mapLegendShowPreviousClicked: function mapLegendShowPreviousClicked() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED'\n        });\n    },\n    mapLegendReset: function mapLegendReset() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_LEGEND_RESET'\n        });\n    },\n    mapTooltipSaved: function mapTooltipSaved(tooltip) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_TOOLTIP_SAVED',\n            tooltip: tooltip\n        });\n        _report_actions2.default.updateMapTooltip(tooltip);\n    },\n    mapTooltipEdited: function mapTooltipEdited(tooltip) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_TOOLTIP_EDITED',\n            tooltip: tooltip\n        });\n    },\n    setMapTooltipEditing: function setMapTooltipEditing() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_MAP_TOOLTIP_EDITING'\n        });\n    },\n    mapLoading: function mapLoading() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_MAP_LOADING'\n        });\n    },\n    mapLoaded: function mapLoaded() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_MAP_LOADED'\n        });\n    },\n    mapFitBounds: function mapFitBounds(bounds) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_FIT_BOUNDS',\n            bounds: bounds\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState()).tap(GridReportActions.loadMapGridCellsInViewport);\n    },\n    mapMoveStart: function mapMoveStart() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_MOVE_START'\n        });\n        if (mapPromises._saveGridStatePromise) {\n            mapPromises._saveGridStatePromise.cancel();\n        }\n    },\n    getMapMeta: function getMapMeta() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_MAP_META'\n        });\n        if (mapPromises._getMapMetaPromise) {\n            mapPromises._getMapMetaPromise.cancel && mapPromises._getMapMetaPromise.cancel();\n        }\n        var report = _report_view_store2.default.getRenderedReport();\n        var transactionsDataSetId = report.get('transaction_id');\n        var params = { entity_id: report.get('entity') };\n        mapPromises._getMapMetaPromise = gridDataApi.get('transaction_datasets/' + transactionsDataSetId + '/geometa', params).end().then(function (response) {\n            var _response$body$query_ = response.body.query_results,\n                centerLng = _response$body$query_.centroid_x,\n                centerLat = _response$body$query_.centroid_y,\n                x1 = _response$body$query_.bbox_x1,\n                y1 = _response$body$query_.bbox_y1,\n                x2 = _response$body$query_.bbox_x2,\n                y2 = _response$body$query_.bbox_y2;\n\n            var mapMeta = (0, _immutable.Map)({\n                center: (0, _immutable.Map)({ lng: centerLng, lat: centerLat }),\n                bounds: (0, _immutable.Map)({\n                    x1: x1,\n                    y1: y1,\n                    x2: x2,\n                    y2: y2\n                })\n            });\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_MAP_META_SUCCESS',\n                mapMeta: mapMeta\n            });\n            return _bluebird2.default.resolve(mapMeta);\n        }).catch(function (error) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_MAP_META_ERROR',\n                error: error\n            });\n            throw error;\n        });\n        return mapPromises._getMapMetaPromise;\n    },\n    getMapStatsForDataset: function getMapStatsForDataset() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_GET_MAP_STATS_FOR_DATASET'\n        });\n        if (mapPromises._getMapStatsForDataset) {\n            mapPromises._getMapStatsForDataset.cancel && mapPromises._getMapStatsForDataset.cancel();\n        }\n        var state = _grid_report_store2.default.getState();\n        var report = _report_view_store2.default.getRenderedReport();\n        var transactionsDataSetId = report.get('transaction_id');\n        var amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n        var breakdown = state.getIn(['visualization', 'breakdown']);\n        var baseMinMaxParams = {\n            entity_id: report.get('entity'),\n            fields: [amountColumn],\n            filter: state.getIn(['grid', 'query', 'filter']),\n            limit: 1\n        };\n        var breakdownParams = {\n            group: breakdown,\n            filter: state.getIn(['grid', 'query', 'filter']),\n            sort: [_defineProperty({}, breakdown, 'asc')],\n            fields: [],\n            offset: 0,\n            limit: 1000\n        };\n        mapPromises._getMapStatsForDataset = _bluebird2.default.join(GridReportActions.getMapBreakdownValues(transactionsDataSetId, breakdown, breakdownParams), GridReportActions.getMapMinMaxValues(transactionsDataSetId, amountColumn, baseMinMaxParams)).cancellable().then(function () {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS'\n            });\n        }).catch(_bluebird.CancellationError, _lodash2.default.noop);\n        return mapPromises._getMapStatsForDataset;\n    },\n    getMapBreakdownValues: function getMapBreakdownValues(transactionsDataSetId, breakdown, breakdownParams) {\n        var maxBreakdownValues = 10000;\n        if (mapPromises._getMapBreakdownValuesPromise) {\n            mapPromises._getMapBreakdownValuesPromise.cancel();\n        }\n        var collectBreakdownValues = function collectBreakdownValues(params, breakdownValues) {\n            return _bluebird2.default.resolve(_og_api2.default.trapi.post('query', transactionsDataSetId, params).end().then(function (response) {\n                var values = response.body.transactions.map(function (row) {\n                    return row[breakdown];\n                });\n                breakdownValues = breakdownValues.concat(values);\n                if (breakdownValues.length < maxBreakdownValues && values.length == params.limit) {\n                    return collectBreakdownValues(_extends({}, params, { offset: breakdownValues.length }), breakdownValues);\n                }\n                return _bluebird2.default.resolve(breakdownValues);\n            }));\n        };\n        mapPromises._getMapBreakdownValuesPromise = collectBreakdownValues(breakdownParams, []).cancellable().tap(function (breakdownValues) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS',\n                breakdownValues: breakdownValues\n            });\n        }).catch(_bluebird.CancellationError, _lodash2.default.noop);\n        return mapPromises._getMapBreakdownValuesPromise;\n    },\n    getMapMinMaxValues: function getMapMinMaxValues(transactionsDataSetId, amountColumn, baseMinMaxParams) {\n        if (mapPromises._mapMinMaxValuesPromise) {\n            mapPromises._mapMinMaxValuesPromise.cancel();\n        }\n        var getPromiseForSortDirection = function getPromiseForSortDirection(sort) {\n            return _og_api2.default.trapi.post('query', transactionsDataSetId, _lodash2.default.assign({}, { sort: [_defineProperty({}, amountColumn, sort)] }, baseMinMaxParams)).end().then(function (response) {\n                return _bluebird2.default.resolve(response.body.transactions[0][amountColumn]);\n            });\n        };\n        mapPromises._mapMinMaxValuesPromise = _bluebird2.default.join(getPromiseForSortDirection('asc'), getPromiseForSortDirection('desc')).cancellable().tap(function (responses) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS',\n                min: parseFloat(responses[0].replace(/\\$|,/g, '')),\n                max: parseFloat(responses[1].replace(/\\$|,/g, ''))\n            });\n        }).catch(_bluebird.CancellationError, _lodash2.default.noop);\n        return mapPromises._mapMinMaxValuesPromise;\n    },\n    mapReset: function mapReset() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_RESET'\n        });\n    },\n    resetAndLoadMap: function resetAndLoadMap() {\n        GridReportActions.mapReset();\n        if (mapPromises._resetAndLoadPromise) {\n            mapPromises._resetAndLoadPromise.cancel();\n        }\n        mapPromises._resetAndLoadPromise = loadMap().cancellable().catch(_bluebird.CancellationError, _lodash2.default.noop);\n        return mapPromises._resetAndLoadPromise;\n    },\n    setMapGrid: function setMapGrid(grid) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_SET_GRID',\n            grid: grid\n        });\n    },\n    loadMapGridCellsInViewport: function loadMapGridCellsInViewport() {\n        var viewportBounds = _grid_report_store2.default.getMapViewportBounds();\n        var boundsForFetch = (0, _immutable.Map)({\n            x1: viewportBounds.getIn([0, 0]),\n            x2: viewportBounds.getIn([1, 0]),\n            y1: viewportBounds.getIn([0, 1]),\n            y2: viewportBounds.getIn([1, 1])\n        });\n        var loadingGridCells = fetchCellsForNewBounds(_grid_report_store2.default.getMapGrid(), boundsForFetch);\n        if (loadingGridCells.size == 0) {\n            return _bluebird2.default.resolve();\n        }\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS',\n            loadingGridCells: loadingGridCells\n        });\n        return _bluebird2.default.all(loadingGridCells.map(function (cell) {\n            return cell.get('loader');\n        }).toJS()).then(function () {}).tap(function () {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS'\n            });\n        }).catch(function (error) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS_ERROR',\n                error: error\n            });\n        });\n    },\n    loadMapGridCell: function loadMapGridCell(cell) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL',\n            cell: cell\n        });\n        var bounds = cell.get('bounds');\n        var state = _grid_report_store2.default.getState();\n        var report = _report_view_store2.default.getRenderedReport();\n        var transactionsDataSetId = report.get('transaction_id');\n        var amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n        var breakdown = state.getIn(['visualization', 'breakdown']);\n        var params = _extends({\n            entity_id: report.get('entity'),\n            fields: [breakdown, amountColumn],\n            filter: state.getIn(['grid', 'query', 'filter'])\n        }, bounds.toJS());\n        return gridDataApi.post('transaction_datasets/' + transactionsDataSetId + '/geo', params).end().tap(function (result) {\n            var mapData = (0, _geodata_utils.buildObjectsFromGeoResponse)(result);\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS',\n                loadedCell: cell,\n                mapData: mapData\n            });\n        }).catch(function (error) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL_ERROR',\n                error: error,\n                cell: cell\n            });\n            throw error;\n        });\n    },\n    setLastCreatedReport: function setLastCreatedReport(report) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_LAST_CREATED_REPORT',\n            report: report\n        });\n    },\n    clearLastCreatedReport: function clearLastCreatedReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_CLEAR_LAST_CREATED_REPORT'\n        });\n    },\n    reloadProperties: function reloadProperties(properties) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_RELOAD_PROPERTIES',\n            properties: properties\n        });\n    },\n    setMapAmountColumn: function setMapAmountColumn(mapAmountColumn) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_MAP_AMOUNT_COLUMN',\n            mapAmountColumn: mapAmountColumn\n        });\n        GridReportActions.resetAndLoadMap();\n    },\n    updateFilteredExportJob: function updateFilteredExportJob(state, jobResult) {\n        var errors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n        var properties = (0, _immutable.Map)({ state: state, jobResult: (0, _immutable.Map)(jobResult), errors: (0, _immutable.List)(errors) });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_FILTERED_EXPORT',\n            properties: properties\n        });\n    },\n    errorFilteredExportJob: function errorFilteredExportJob(state, messages) {\n        var properties = (0, _immutable.Map)({ state: state, errors: (0, _immutable.List)(messages) });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_FILTERED_EXPORT',\n            properties: properties\n        });\n    },\n    setHeatmapType: function setHeatmapType(heatmapType) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_HEATMAP_TYPE',\n            heatmapType: heatmapType\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    setAmountsType: function setAmountsType(amountsType) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_AMOUNTS_TYPE',\n            amountsType: amountsType\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    setAmountColumn: function setAmountColumn(amountColumn) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_AMOUNT_COLUMN',\n            amountColumn: amountColumn\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    setLegendSortBy: function setLegendSortBy(sortId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_SET_LEGEND_SORT_BY',\n            sortId: sortId\n        });\n        GridReportActions.saveGridState(_grid_report_store2.default.getSavedState());\n    },\n    addActiveFilter: function addActiveFilter(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_ADD_ACTIVE_FILTER',\n            id: id\n        });\n    },\n    removeActiveFilter: function removeActiveFilter(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRID_REMOVE_ACTIVE_FILTER',\n            id: id\n        });\n    }\n};\nexports.default = GridReportActions;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(20);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"version\", function() { return version; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Collection\", function() { return Collection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Iterable\", function() { return Iterable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Seq\", function() { return Seq; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Map\", function() { return Map; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OrderedMap\", function() { return OrderedMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"List\", function() { return List; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Stack\", function() { return Stack; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Set\", function() { return Set; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OrderedSet\", function() { return OrderedSet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Record\", function() { return Record; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Range\", function() { return Range; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Repeat\", function() { return Repeat; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"is\", function() { return is; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fromJS\", function() { return fromJS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hash\", function() { return hash; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isImmutable\", function() { return isImmutable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isCollection\", function() { return isCollection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isKeyed\", function() { return isKeyed; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isIndexed\", function() { return isIndexed; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isAssociative\", function() { return isAssociative; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isOrdered\", function() { return isOrdered; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isValueObject\", function() { return isValueObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"get\", function() { return get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getIn\", function() { return getIn$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"has\", function() { return has; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasIn\", function() { return hasIn$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"merge\", function() { return merge$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeDeep\", function() { return mergeDeep$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeWith\", function() { return mergeWith$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeDeepWith\", function() { return mergeDeepWith$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"remove\", function() { return remove; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeIn\", function() { return removeIn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"set\", function() { return set; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setIn\", function() { return setIn$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"update\", function() { return update$1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"updateIn\", function() { return updateIn; });\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// Used for setting prototype methods that IE8 chokes on.\nvar DELETE = 'delete';\n\n// Constants describing the size of trie nodes.\nvar SHIFT = 5; // Resulted in best performance after ______?\nvar SIZE = 1 << SHIFT;\nvar MASK = SIZE - 1;\n\n// A consistent shared value representing \"not set\" which equals nothing other\n// than itself, and nothing that could be provided externally.\nvar NOT_SET = {};\n\n// Boolean references, Rough equivalent of `bool &`.\nvar CHANGE_LENGTH = { value: false };\nvar DID_ALTER = { value: false };\n\nfunction MakeRef(ref) {\n  ref.value = false;\n  return ref;\n}\n\nfunction SetRef(ref) {\n  ref && (ref.value = true);\n}\n\n// A function which returns a value representing an \"owner\" for transient writes\n// to tries. The return value will only ever equal itself, and will not equal\n// the return of any subsequent call of this function.\nfunction OwnerID() {}\n\nfunction ensureSize(iter) {\n  if (iter.size === undefined) {\n    iter.size = iter.__iterate(returnTrue);\n  }\n  return iter.size;\n}\n\nfunction wrapIndex(iter, index) {\n  // This implements \"is array index\" which the ECMAString spec defines as:\n  //\n  //     A String property name P is an array index if and only if\n  //     ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal\n  //     to 2^32−1.\n  //\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects\n  if (typeof index !== 'number') {\n    var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32\n    if ('' + uint32Index !== index || uint32Index === 4294967295) {\n      return NaN;\n    }\n    index = uint32Index;\n  }\n  return index < 0 ? ensureSize(iter) + index : index;\n}\n\nfunction returnTrue() {\n  return true;\n}\n\nfunction wholeSlice(begin, end, size) {\n  return (\n    ((begin === 0 && !isNeg(begin)) ||\n      (size !== undefined && begin <= -size)) &&\n    (end === undefined || (size !== undefined && end >= size))\n  );\n}\n\nfunction resolveBegin(begin, size) {\n  return resolveIndex(begin, size, 0);\n}\n\nfunction resolveEnd(end, size) {\n  return resolveIndex(end, size, size);\n}\n\nfunction resolveIndex(index, size, defaultIndex) {\n  // Sanitize indices using this shorthand for ToInt32(argument)\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n  return index === undefined\n    ? defaultIndex\n    : isNeg(index)\n      ? size === Infinity ? size : Math.max(0, size + index) | 0\n      : size === undefined || size === index\n        ? index\n        : Math.min(size, index) | 0;\n}\n\nfunction isNeg(value) {\n  // Account for -0 which is negative, but not less than 0.\n  return value < 0 || (value === 0 && 1 / value === -Infinity);\n}\n\nfunction isImmutable(maybeImmutable) {\n  return isCollection(maybeImmutable) || isRecord(maybeImmutable);\n}\n\nfunction isCollection(maybeCollection) {\n  return !!(maybeCollection && maybeCollection[IS_ITERABLE_SENTINEL]);\n}\n\nfunction isKeyed(maybeKeyed) {\n  return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);\n}\n\nfunction isIndexed(maybeIndexed) {\n  return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);\n}\n\nfunction isAssociative(maybeAssociative) {\n  return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);\n}\n\nfunction isOrdered(maybeOrdered) {\n  return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);\n}\n\nfunction isRecord(maybeRecord) {\n  return !!(maybeRecord && maybeRecord[IS_RECORD_SENTINEL]);\n}\n\nfunction isValueObject(maybeValue) {\n  return !!(\n    maybeValue &&\n    typeof maybeValue.equals === 'function' &&\n    typeof maybeValue.hashCode === 'function'\n  );\n}\n\nvar IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\nvar IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\nvar IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';\nvar IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\nvar IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@';\n\nvar Collection = function Collection(value) {\n  return isCollection(value) ? value : Seq(value);\n};\n\nvar KeyedCollection = (function (Collection) {\n  function KeyedCollection(value) {\n    return isKeyed(value) ? value : KeyedSeq(value);\n  }\n\n  if ( Collection ) KeyedCollection.__proto__ = Collection;\n  KeyedCollection.prototype = Object.create( Collection && Collection.prototype );\n  KeyedCollection.prototype.constructor = KeyedCollection;\n\n  return KeyedCollection;\n}(Collection));\n\nvar IndexedCollection = (function (Collection) {\n  function IndexedCollection(value) {\n    return isIndexed(value) ? value : IndexedSeq(value);\n  }\n\n  if ( Collection ) IndexedCollection.__proto__ = Collection;\n  IndexedCollection.prototype = Object.create( Collection && Collection.prototype );\n  IndexedCollection.prototype.constructor = IndexedCollection;\n\n  return IndexedCollection;\n}(Collection));\n\nvar SetCollection = (function (Collection) {\n  function SetCollection(value) {\n    return isCollection(value) && !isAssociative(value) ? value : SetSeq(value);\n  }\n\n  if ( Collection ) SetCollection.__proto__ = Collection;\n  SetCollection.prototype = Object.create( Collection && Collection.prototype );\n  SetCollection.prototype.constructor = SetCollection;\n\n  return SetCollection;\n}(Collection));\n\nCollection.Keyed = KeyedCollection;\nCollection.Indexed = IndexedCollection;\nCollection.Set = SetCollection;\n\nvar ITERATE_KEYS = 0;\nvar ITERATE_VALUES = 1;\nvar ITERATE_ENTRIES = 2;\n\nvar REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\n\nvar ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;\n\nvar Iterator = function Iterator(next) {\n  this.next = next;\n};\n\nIterator.prototype.toString = function toString () {\n  return '[Iterator]';\n};\n\nIterator.KEYS = ITERATE_KEYS;\nIterator.VALUES = ITERATE_VALUES;\nIterator.ENTRIES = ITERATE_ENTRIES;\n\nIterator.prototype.inspect = Iterator.prototype.toSource = function() {\n  return this.toString();\n};\nIterator.prototype[ITERATOR_SYMBOL] = function() {\n  return this;\n};\n\nfunction iteratorValue(type, k, v, iteratorResult) {\n  var value = type === 0 ? k : type === 1 ? v : [k, v];\n  iteratorResult\n    ? (iteratorResult.value = value)\n    : (iteratorResult = {\n        value: value,\n        done: false\n      });\n  return iteratorResult;\n}\n\nfunction iteratorDone() {\n  return { value: undefined, done: true };\n}\n\nfunction hasIterator(maybeIterable) {\n  return !!getIteratorFn(maybeIterable);\n}\n\nfunction isIterator(maybeIterator) {\n  return maybeIterator && typeof maybeIterator.next === 'function';\n}\n\nfunction getIterator(iterable) {\n  var iteratorFn = getIteratorFn(iterable);\n  return iteratorFn && iteratorFn.call(iterable);\n}\n\nfunction getIteratorFn(iterable) {\n  var iteratorFn =\n    iterable &&\n    ((REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||\n      iterable[FAUX_ITERATOR_SYMBOL]);\n  if (typeof iteratorFn === 'function') {\n    return iteratorFn;\n  }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isArrayLike(value) {\n  return value && typeof value.length === 'number';\n}\n\nvar Seq = (function (Collection$$1) {\n  function Seq(value) {\n    return value === null || value === undefined\n      ? emptySequence()\n      : isImmutable(value) ? value.toSeq() : seqFromValue(value);\n  }\n\n  if ( Collection$$1 ) Seq.__proto__ = Collection$$1;\n  Seq.prototype = Object.create( Collection$$1 && Collection$$1.prototype );\n  Seq.prototype.constructor = Seq;\n\n  Seq.prototype.toSeq = function toSeq () {\n    return this;\n  };\n\n  Seq.prototype.toString = function toString () {\n    return this.__toString('Seq {', '}');\n  };\n\n  Seq.prototype.cacheResult = function cacheResult () {\n    if (!this._cache && this.__iterateUncached) {\n      this._cache = this.entrySeq().toArray();\n      this.size = this._cache.length;\n    }\n    return this;\n  };\n\n  // abstract __iterateUncached(fn, reverse)\n\n  Seq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var cache = this._cache;\n    if (cache) {\n      var size = cache.length;\n      var i = 0;\n      while (i !== size) {\n        var entry = cache[reverse ? size - ++i : i++];\n        if (fn(entry[1], entry[0], this$1) === false) {\n          break;\n        }\n      }\n      return i;\n    }\n    return this.__iterateUncached(fn, reverse);\n  };\n\n  // abstract __iteratorUncached(type, reverse)\n\n  Seq.prototype.__iterator = function __iterator (type, reverse) {\n    var cache = this._cache;\n    if (cache) {\n      var size = cache.length;\n      var i = 0;\n      return new Iterator(function () {\n        if (i === size) {\n          return iteratorDone();\n        }\n        var entry = cache[reverse ? size - ++i : i++];\n        return iteratorValue(type, entry[0], entry[1]);\n      });\n    }\n    return this.__iteratorUncached(type, reverse);\n  };\n\n  return Seq;\n}(Collection));\n\nvar KeyedSeq = (function (Seq) {\n  function KeyedSeq(value) {\n    return value === null || value === undefined\n      ? emptySequence().toKeyedSeq()\n      : isCollection(value)\n        ? isKeyed(value) ? value.toSeq() : value.fromEntrySeq()\n        : isRecord(value) ? value.toSeq() : keyedSeqFromValue(value);\n  }\n\n  if ( Seq ) KeyedSeq.__proto__ = Seq;\n  KeyedSeq.prototype = Object.create( Seq && Seq.prototype );\n  KeyedSeq.prototype.constructor = KeyedSeq;\n\n  KeyedSeq.prototype.toKeyedSeq = function toKeyedSeq () {\n    return this;\n  };\n\n  return KeyedSeq;\n}(Seq));\n\nvar IndexedSeq = (function (Seq) {\n  function IndexedSeq(value) {\n    return value === null || value === undefined\n      ? emptySequence()\n      : isCollection(value)\n        ? isKeyed(value) ? value.entrySeq() : value.toIndexedSeq()\n        : isRecord(value)\n          ? value.toSeq().entrySeq()\n          : indexedSeqFromValue(value);\n  }\n\n  if ( Seq ) IndexedSeq.__proto__ = Seq;\n  IndexedSeq.prototype = Object.create( Seq && Seq.prototype );\n  IndexedSeq.prototype.constructor = IndexedSeq;\n\n  IndexedSeq.of = function of (/*...values*/) {\n    return IndexedSeq(arguments);\n  };\n\n  IndexedSeq.prototype.toIndexedSeq = function toIndexedSeq () {\n    return this;\n  };\n\n  IndexedSeq.prototype.toString = function toString () {\n    return this.__toString('Seq [', ']');\n  };\n\n  return IndexedSeq;\n}(Seq));\n\nvar SetSeq = (function (Seq) {\n  function SetSeq(value) {\n    return (isCollection(value) && !isAssociative(value)\n      ? value\n      : IndexedSeq(value)\n    ).toSetSeq();\n  }\n\n  if ( Seq ) SetSeq.__proto__ = Seq;\n  SetSeq.prototype = Object.create( Seq && Seq.prototype );\n  SetSeq.prototype.constructor = SetSeq;\n\n  SetSeq.of = function of (/*...values*/) {\n    return SetSeq(arguments);\n  };\n\n  SetSeq.prototype.toSetSeq = function toSetSeq () {\n    return this;\n  };\n\n  return SetSeq;\n}(Seq));\n\nSeq.isSeq = isSeq;\nSeq.Keyed = KeyedSeq;\nSeq.Set = SetSeq;\nSeq.Indexed = IndexedSeq;\n\nvar IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';\n\nSeq.prototype[IS_SEQ_SENTINEL] = true;\n\n// #pragma Root Sequences\n\nvar ArraySeq = (function (IndexedSeq) {\n  function ArraySeq(array) {\n    this._array = array;\n    this.size = array.length;\n  }\n\n  if ( IndexedSeq ) ArraySeq.__proto__ = IndexedSeq;\n  ArraySeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  ArraySeq.prototype.constructor = ArraySeq;\n\n  ArraySeq.prototype.get = function get (index, notSetValue) {\n    return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;\n  };\n\n  ArraySeq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var array = this._array;\n    var size = array.length;\n    var i = 0;\n    while (i !== size) {\n      var ii = reverse ? size - ++i : i++;\n      if (fn(array[ii], ii, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  ArraySeq.prototype.__iterator = function __iterator (type, reverse) {\n    var array = this._array;\n    var size = array.length;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var ii = reverse ? size - ++i : i++;\n      return iteratorValue(type, ii, array[ii]);\n    });\n  };\n\n  return ArraySeq;\n}(IndexedSeq));\n\nvar ObjectSeq = (function (KeyedSeq) {\n  function ObjectSeq(object) {\n    var keys = Object.keys(object);\n    this._object = object;\n    this._keys = keys;\n    this.size = keys.length;\n  }\n\n  if ( KeyedSeq ) ObjectSeq.__proto__ = KeyedSeq;\n  ObjectSeq.prototype = Object.create( KeyedSeq && KeyedSeq.prototype );\n  ObjectSeq.prototype.constructor = ObjectSeq;\n\n  ObjectSeq.prototype.get = function get (key, notSetValue) {\n    if (notSetValue !== undefined && !this.has(key)) {\n      return notSetValue;\n    }\n    return this._object[key];\n  };\n\n  ObjectSeq.prototype.has = function has (key) {\n    return hasOwnProperty.call(this._object, key);\n  };\n\n  ObjectSeq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var object = this._object;\n    var keys = this._keys;\n    var size = keys.length;\n    var i = 0;\n    while (i !== size) {\n      var key = keys[reverse ? size - ++i : i++];\n      if (fn(object[key], key, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  ObjectSeq.prototype.__iterator = function __iterator (type, reverse) {\n    var object = this._object;\n    var keys = this._keys;\n    var size = keys.length;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var key = keys[reverse ? size - ++i : i++];\n      return iteratorValue(type, key, object[key]);\n    });\n  };\n\n  return ObjectSeq;\n}(KeyedSeq));\nObjectSeq.prototype[IS_ORDERED_SENTINEL] = true;\n\nvar CollectionSeq = (function (IndexedSeq) {\n  function CollectionSeq(collection) {\n    this._collection = collection;\n    this.size = collection.length || collection.size;\n  }\n\n  if ( IndexedSeq ) CollectionSeq.__proto__ = IndexedSeq;\n  CollectionSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  CollectionSeq.prototype.constructor = CollectionSeq;\n\n  CollectionSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var collection = this._collection;\n    var iterator = getIterator(collection);\n    var iterations = 0;\n    if (isIterator(iterator)) {\n      var step;\n      while (!(step = iterator.next()).done) {\n        if (fn(step.value, iterations++, this$1) === false) {\n          break;\n        }\n      }\n    }\n    return iterations;\n  };\n\n  CollectionSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var collection = this._collection;\n    var iterator = getIterator(collection);\n    if (!isIterator(iterator)) {\n      return new Iterator(iteratorDone);\n    }\n    var iterations = 0;\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done ? step : iteratorValue(type, iterations++, step.value);\n    });\n  };\n\n  return CollectionSeq;\n}(IndexedSeq));\n\nvar IteratorSeq = (function (IndexedSeq) {\n  function IteratorSeq(iterator) {\n    this._iterator = iterator;\n    this._iteratorCache = [];\n  }\n\n  if ( IndexedSeq ) IteratorSeq.__proto__ = IndexedSeq;\n  IteratorSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  IteratorSeq.prototype.constructor = IteratorSeq;\n\n  IteratorSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterator = this._iterator;\n    var cache = this._iteratorCache;\n    var iterations = 0;\n    while (iterations < cache.length) {\n      if (fn(cache[iterations], iterations++, this$1) === false) {\n        return iterations;\n      }\n    }\n    var step;\n    while (!(step = iterator.next()).done) {\n      var val = step.value;\n      cache[iterations] = val;\n      if (fn(val, iterations++, this$1) === false) {\n        break;\n      }\n    }\n    return iterations;\n  };\n\n  IteratorSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = this._iterator;\n    var cache = this._iteratorCache;\n    var iterations = 0;\n    return new Iterator(function () {\n      if (iterations >= cache.length) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        cache[iterations] = step.value;\n      }\n      return iteratorValue(type, iterations, cache[iterations++]);\n    });\n  };\n\n  return IteratorSeq;\n}(IndexedSeq));\n\n// # pragma Helper functions\n\nfunction isSeq(maybeSeq) {\n  return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]);\n}\n\nvar EMPTY_SEQ;\n\nfunction emptySequence() {\n  return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));\n}\n\nfunction keyedSeqFromValue(value) {\n  var seq = Array.isArray(value)\n    ? new ArraySeq(value)\n    : isIterator(value)\n      ? new IteratorSeq(value)\n      : hasIterator(value) ? new CollectionSeq(value) : undefined;\n  if (seq) {\n    return seq.fromEntrySeq();\n  }\n  if (typeof value === 'object') {\n    return new ObjectSeq(value);\n  }\n  throw new TypeError(\n    'Expected Array or collection object of [k, v] entries, or keyed object: ' +\n      value\n  );\n}\n\nfunction indexedSeqFromValue(value) {\n  var seq = maybeIndexedSeqFromValue(value);\n  if (seq) {\n    return seq;\n  }\n  throw new TypeError(\n    'Expected Array or collection object of values: ' + value\n  );\n}\n\nfunction seqFromValue(value) {\n  var seq = maybeIndexedSeqFromValue(value);\n  if (seq) {\n    return seq;\n  }\n  if (typeof value === 'object') {\n    return new ObjectSeq(value);\n  }\n  throw new TypeError(\n    'Expected Array or collection object of values, or keyed object: ' + value\n  );\n}\n\nfunction maybeIndexedSeqFromValue(value) {\n  return isArrayLike(value)\n    ? new ArraySeq(value)\n    : isIterator(value)\n      ? new IteratorSeq(value)\n      : hasIterator(value) ? new CollectionSeq(value) : undefined;\n}\n\n/**\n * An extension of the \"same-value\" algorithm as [described for use by ES6 Map\n * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)\n *\n * NaN is considered the same as NaN, however -0 and 0 are considered the same\n * value, which is different from the algorithm described by\n * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).\n *\n * This is extended further to allow Objects to describe the values they\n * represent, by way of `valueOf` or `equals` (and `hashCode`).\n *\n * Note: because of this extension, the key equality of Immutable.Map and the\n * value equality of Immutable.Set will differ from ES6 Map and Set.\n *\n * ### Defining custom values\n *\n * The easiest way to describe the value an object represents is by implementing\n * `valueOf`. For example, `Date` represents a value by returning a unix\n * timestamp for `valueOf`:\n *\n *     var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...\n *     var date2 = new Date(1234567890000);\n *     date1.valueOf(); // 1234567890000\n *     assert( date1 !== date2 );\n *     assert( Immutable.is( date1, date2 ) );\n *\n * Note: overriding `valueOf` may have other implications if you use this object\n * where JavaScript expects a primitive, such as implicit string coercion.\n *\n * For more complex types, especially collections, implementing `valueOf` may\n * not be performant. An alternative is to implement `equals` and `hashCode`.\n *\n * `equals` takes another object, presumably of similar type, and returns true\n * if it is equal. Equality is symmetrical, so the same result should be\n * returned if this and the argument are flipped.\n *\n *     assert( a.equals(b) === b.equals(a) );\n *\n * `hashCode` returns a 32bit integer number representing the object which will\n * be used to determine how to store the value object in a Map or Set. You must\n * provide both or neither methods, one must not exist without the other.\n *\n * Also, an important relationship between these methods must be upheld: if two\n * values are equal, they *must* return the same hashCode. If the values are not\n * equal, they might have the same hashCode; this is called a hash collision,\n * and while undesirable for performance reasons, it is acceptable.\n *\n *     if (a.equals(b)) {\n *       assert( a.hashCode() === b.hashCode() );\n *     }\n *\n * All Immutable collections are Value Objects: they implement `equals()`\n * and `hashCode()`.\n */\nfunction is(valueA, valueB) {\n  if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n    return true;\n  }\n  if (!valueA || !valueB) {\n    return false;\n  }\n  if (\n    typeof valueA.valueOf === 'function' &&\n    typeof valueB.valueOf === 'function'\n  ) {\n    valueA = valueA.valueOf();\n    valueB = valueB.valueOf();\n    if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n      return true;\n    }\n    if (!valueA || !valueB) {\n      return false;\n    }\n  }\n  return !!(\n    isValueObject(valueA) &&\n    isValueObject(valueB) &&\n    valueA.equals(valueB)\n  );\n}\n\nvar imul =\n  typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2\n    ? Math.imul\n    : function imul(a, b) {\n        a |= 0; // int\n        b |= 0; // int\n        var c = a & 0xffff;\n        var d = b & 0xffff;\n        // Shift by 0 fixes the sign on the high part.\n        return (c * d + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0)) | 0; // int\n      };\n\n// v8 has an optimization for storing 31-bit signed numbers.\n// Values which have either 00 or 11 as the high order bits qualify.\n// This function drops the highest order bit in a signed number, maintaining\n// the sign bit.\nfunction smi(i32) {\n  return ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff);\n}\n\nfunction hash(o) {\n  if (o === false || o === null || o === undefined) {\n    return 0;\n  }\n  if (typeof o.valueOf === 'function') {\n    o = o.valueOf();\n    if (o === false || o === null || o === undefined) {\n      return 0;\n    }\n  }\n  if (o === true) {\n    return 1;\n  }\n  var type = typeof o;\n  if (type === 'number') {\n    if (o !== o || o === Infinity) {\n      return 0;\n    }\n    var h = o | 0;\n    if (h !== o) {\n      h ^= o * 0xffffffff;\n    }\n    while (o > 0xffffffff) {\n      o /= 0xffffffff;\n      h ^= o;\n    }\n    return smi(h);\n  }\n  if (type === 'string') {\n    return o.length > STRING_HASH_CACHE_MIN_STRLEN\n      ? cachedHashString(o)\n      : hashString(o);\n  }\n  if (typeof o.hashCode === 'function') {\n    // Drop any high bits from accidentally long hash codes.\n    return smi(o.hashCode());\n  }\n  if (type === 'object') {\n    return hashJSObj(o);\n  }\n  if (typeof o.toString === 'function') {\n    return hashString(o.toString());\n  }\n  throw new Error('Value type ' + type + ' cannot be hashed.');\n}\n\nfunction cachedHashString(string) {\n  var hashed = stringHashCache[string];\n  if (hashed === undefined) {\n    hashed = hashString(string);\n    if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {\n      STRING_HASH_CACHE_SIZE = 0;\n      stringHashCache = {};\n    }\n    STRING_HASH_CACHE_SIZE++;\n    stringHashCache[string] = hashed;\n  }\n  return hashed;\n}\n\n// http://jsperf.com/hashing-strings\nfunction hashString(string) {\n  // This is the hash from JVM\n  // The hash code for a string is computed as\n  // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n  // where s[i] is the ith character of the string and n is the length of\n  // the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n  // (exclusive) by dropping high bits.\n  var hashed = 0;\n  for (var ii = 0; ii < string.length; ii++) {\n    hashed = (31 * hashed + string.charCodeAt(ii)) | 0;\n  }\n  return smi(hashed);\n}\n\nfunction hashJSObj(obj) {\n  var hashed;\n  if (usingWeakMap) {\n    hashed = weakMap.get(obj);\n    if (hashed !== undefined) {\n      return hashed;\n    }\n  }\n\n  hashed = obj[UID_HASH_KEY];\n  if (hashed !== undefined) {\n    return hashed;\n  }\n\n  if (!canDefineProperty) {\n    hashed = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];\n    if (hashed !== undefined) {\n      return hashed;\n    }\n\n    hashed = getIENodeHash(obj);\n    if (hashed !== undefined) {\n      return hashed;\n    }\n  }\n\n  hashed = ++objHashUID;\n  if (objHashUID & 0x40000000) {\n    objHashUID = 0;\n  }\n\n  if (usingWeakMap) {\n    weakMap.set(obj, hashed);\n  } else if (isExtensible !== undefined && isExtensible(obj) === false) {\n    throw new Error('Non-extensible objects are not allowed as keys.');\n  } else if (canDefineProperty) {\n    Object.defineProperty(obj, UID_HASH_KEY, {\n      enumerable: false,\n      configurable: false,\n      writable: false,\n      value: hashed\n    });\n  } else if (\n    obj.propertyIsEnumerable !== undefined &&\n    obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable\n  ) {\n    // Since we can't define a non-enumerable property on the object\n    // we'll hijack one of the less-used non-enumerable properties to\n    // save our hash on it. Since this is a function it will not show up in\n    // `JSON.stringify` which is what we want.\n    obj.propertyIsEnumerable = function() {\n      return this.constructor.prototype.propertyIsEnumerable.apply(\n        this,\n        arguments\n      );\n    };\n    obj.propertyIsEnumerable[UID_HASH_KEY] = hashed;\n  } else if (obj.nodeType !== undefined) {\n    // At this point we couldn't get the IE `uniqueID` to use as a hash\n    // and we couldn't use a non-enumerable property to exploit the\n    // dontEnum bug so we simply add the `UID_HASH_KEY` on the node\n    // itself.\n    obj[UID_HASH_KEY] = hashed;\n  } else {\n    throw new Error('Unable to set a non-enumerable property on object.');\n  }\n\n  return hashed;\n}\n\n// Get references to ES5 object methods.\nvar isExtensible = Object.isExtensible;\n\n// True if Object.defineProperty works as expected. IE8 fails this test.\nvar canDefineProperty = (function() {\n  try {\n    Object.defineProperty({}, '@', {});\n    return true;\n  } catch (e) {\n    return false;\n  }\n})();\n\n// IE has a `uniqueID` property on DOM nodes. We can construct the hash from it\n// and avoid memory leaks from the IE cloneNode bug.\nfunction getIENodeHash(node) {\n  if (node && node.nodeType > 0) {\n    switch (node.nodeType) {\n      case 1: // Element\n        return node.uniqueID;\n      case 9: // Document\n        return node.documentElement && node.documentElement.uniqueID;\n    }\n  }\n}\n\n// If possible, use a WeakMap.\nvar usingWeakMap = typeof WeakMap === 'function';\nvar weakMap;\nif (usingWeakMap) {\n  weakMap = new WeakMap();\n}\n\nvar objHashUID = 0;\n\nvar UID_HASH_KEY = '__immutablehash__';\nif (typeof Symbol === 'function') {\n  UID_HASH_KEY = Symbol(UID_HASH_KEY);\n}\n\nvar STRING_HASH_CACHE_MIN_STRLEN = 16;\nvar STRING_HASH_CACHE_MAX_SIZE = 255;\nvar STRING_HASH_CACHE_SIZE = 0;\nvar stringHashCache = {};\n\nvar ToKeyedSequence = (function (KeyedSeq$$1) {\n  function ToKeyedSequence(indexed, useKeys) {\n    this._iter = indexed;\n    this._useKeys = useKeys;\n    this.size = indexed.size;\n  }\n\n  if ( KeyedSeq$$1 ) ToKeyedSequence.__proto__ = KeyedSeq$$1;\n  ToKeyedSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n  ToKeyedSequence.prototype.constructor = ToKeyedSequence;\n\n  ToKeyedSequence.prototype.get = function get (key, notSetValue) {\n    return this._iter.get(key, notSetValue);\n  };\n\n  ToKeyedSequence.prototype.has = function has (key) {\n    return this._iter.has(key);\n  };\n\n  ToKeyedSequence.prototype.valueSeq = function valueSeq () {\n    return this._iter.valueSeq();\n  };\n\n  ToKeyedSequence.prototype.reverse = function reverse () {\n    var this$1 = this;\n\n    var reversedSequence = reverseFactory(this, true);\n    if (!this._useKeys) {\n      reversedSequence.valueSeq = function () { return this$1._iter.toSeq().reverse(); };\n    }\n    return reversedSequence;\n  };\n\n  ToKeyedSequence.prototype.map = function map (mapper, context) {\n    var this$1 = this;\n\n    var mappedSequence = mapFactory(this, mapper, context);\n    if (!this._useKeys) {\n      mappedSequence.valueSeq = function () { return this$1._iter.toSeq().map(mapper, context); };\n    }\n    return mappedSequence;\n  };\n\n  ToKeyedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (v, k) { return fn(v, k, this$1); }, reverse);\n  };\n\n  ToKeyedSequence.prototype.__iterator = function __iterator (type, reverse) {\n    return this._iter.__iterator(type, reverse);\n  };\n\n  return ToKeyedSequence;\n}(KeyedSeq));\nToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true;\n\nvar ToIndexedSequence = (function (IndexedSeq$$1) {\n  function ToIndexedSequence(iter) {\n    this._iter = iter;\n    this.size = iter.size;\n  }\n\n  if ( IndexedSeq$$1 ) ToIndexedSequence.__proto__ = IndexedSeq$$1;\n  ToIndexedSequence.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  ToIndexedSequence.prototype.constructor = ToIndexedSequence;\n\n  ToIndexedSequence.prototype.includes = function includes (value) {\n    return this._iter.includes(value);\n  };\n\n  ToIndexedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var i = 0;\n    reverse && ensureSize(this);\n    return this._iter.__iterate(\n      function (v) { return fn(v, reverse ? this$1.size - ++i : i++, this$1); },\n      reverse\n    );\n  };\n\n  ToIndexedSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var this$1 = this;\n\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    var i = 0;\n    reverse && ensureSize(this);\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done\n        ? step\n        : iteratorValue(\n            type,\n            reverse ? this$1.size - ++i : i++,\n            step.value,\n            step\n          );\n    });\n  };\n\n  return ToIndexedSequence;\n}(IndexedSeq));\n\nvar ToSetSequence = (function (SetSeq$$1) {\n  function ToSetSequence(iter) {\n    this._iter = iter;\n    this.size = iter.size;\n  }\n\n  if ( SetSeq$$1 ) ToSetSequence.__proto__ = SetSeq$$1;\n  ToSetSequence.prototype = Object.create( SetSeq$$1 && SetSeq$$1.prototype );\n  ToSetSequence.prototype.constructor = ToSetSequence;\n\n  ToSetSequence.prototype.has = function has (key) {\n    return this._iter.includes(key);\n  };\n\n  ToSetSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (v) { return fn(v, v, this$1); }, reverse);\n  };\n\n  ToSetSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done\n        ? step\n        : iteratorValue(type, step.value, step.value, step);\n    });\n  };\n\n  return ToSetSequence;\n}(SetSeq));\n\nvar FromEntriesSequence = (function (KeyedSeq$$1) {\n  function FromEntriesSequence(entries) {\n    this._iter = entries;\n    this.size = entries.size;\n  }\n\n  if ( KeyedSeq$$1 ) FromEntriesSequence.__proto__ = KeyedSeq$$1;\n  FromEntriesSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n  FromEntriesSequence.prototype.constructor = FromEntriesSequence;\n\n  FromEntriesSequence.prototype.entrySeq = function entrySeq () {\n    return this._iter.toSeq();\n  };\n\n  FromEntriesSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (entry) {\n      // Check if entry exists first so array access doesn't throw for holes\n      // in the parent iteration.\n      if (entry) {\n        validateEntry(entry);\n        var indexedCollection = isCollection(entry);\n        return fn(\n          indexedCollection ? entry.get(1) : entry[1],\n          indexedCollection ? entry.get(0) : entry[0],\n          this$1\n        );\n      }\n    }, reverse);\n  };\n\n  FromEntriesSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    return new Iterator(function () {\n      while (true) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        var entry = step.value;\n        // Check if entry exists first so array access doesn't throw for holes\n        // in the parent iteration.\n        if (entry) {\n          validateEntry(entry);\n          var indexedCollection = isCollection(entry);\n          return iteratorValue(\n            type,\n            indexedCollection ? entry.get(0) : entry[0],\n            indexedCollection ? entry.get(1) : entry[1],\n            step\n          );\n        }\n      }\n    });\n  };\n\n  return FromEntriesSequence;\n}(KeyedSeq));\n\nToIndexedSequence.prototype.cacheResult = ToKeyedSequence.prototype.cacheResult = ToSetSequence.prototype.cacheResult = FromEntriesSequence.prototype.cacheResult = cacheResultThrough;\n\nfunction flipFactory(collection) {\n  var flipSequence = makeSequence(collection);\n  flipSequence._iter = collection;\n  flipSequence.size = collection.size;\n  flipSequence.flip = function () { return collection; };\n  flipSequence.reverse = function() {\n    var reversedSequence = collection.reverse.apply(this); // super.reverse()\n    reversedSequence.flip = function () { return collection.reverse(); };\n    return reversedSequence;\n  };\n  flipSequence.has = function (key) { return collection.includes(key); };\n  flipSequence.includes = function (key) { return collection.has(key); };\n  flipSequence.cacheResult = cacheResultThrough;\n  flipSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    return collection.__iterate(function (v, k) { return fn(k, v, this$1) !== false; }, reverse);\n  };\n  flipSequence.__iteratorUncached = function(type, reverse) {\n    if (type === ITERATE_ENTRIES) {\n      var iterator = collection.__iterator(type, reverse);\n      return new Iterator(function () {\n        var step = iterator.next();\n        if (!step.done) {\n          var k = step.value[0];\n          step.value[0] = step.value[1];\n          step.value[1] = k;\n        }\n        return step;\n      });\n    }\n    return collection.__iterator(\n      type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES,\n      reverse\n    );\n  };\n  return flipSequence;\n}\n\nfunction mapFactory(collection, mapper, context) {\n  var mappedSequence = makeSequence(collection);\n  mappedSequence.size = collection.size;\n  mappedSequence.has = function (key) { return collection.has(key); };\n  mappedSequence.get = function (key, notSetValue) {\n    var v = collection.get(key, NOT_SET);\n    return v === NOT_SET\n      ? notSetValue\n      : mapper.call(context, v, key, collection);\n  };\n  mappedSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    return collection.__iterate(\n      function (v, k, c) { return fn(mapper.call(context, v, k, c), k, this$1) !== false; },\n      reverse\n    );\n  };\n  mappedSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      var key = entry[0];\n      return iteratorValue(\n        type,\n        key,\n        mapper.call(context, entry[1], key, collection),\n        step\n      );\n    });\n  };\n  return mappedSequence;\n}\n\nfunction reverseFactory(collection, useKeys) {\n  var this$1 = this;\n\n  var reversedSequence = makeSequence(collection);\n  reversedSequence._iter = collection;\n  reversedSequence.size = collection.size;\n  reversedSequence.reverse = function () { return collection; };\n  if (collection.flip) {\n    reversedSequence.flip = function() {\n      var flipSequence = flipFactory(collection);\n      flipSequence.reverse = function () { return collection.flip(); };\n      return flipSequence;\n    };\n  }\n  reversedSequence.get = function (key, notSetValue) { return collection.get(useKeys ? key : -1 - key, notSetValue); };\n  reversedSequence.has = function (key) { return collection.has(useKeys ? key : -1 - key); };\n  reversedSequence.includes = function (value) { return collection.includes(value); };\n  reversedSequence.cacheResult = cacheResultThrough;\n  reversedSequence.__iterate = function(fn, reverse) {\n    var this$1 = this;\n\n    var i = 0;\n    reverse && ensureSize(collection);\n    return collection.__iterate(\n      function (v, k) { return fn(v, useKeys ? k : reverse ? this$1.size - ++i : i++, this$1); },\n      !reverse\n    );\n  };\n  reversedSequence.__iterator = function (type, reverse) {\n    var i = 0;\n    reverse && ensureSize(collection);\n    var iterator = collection.__iterator(ITERATE_ENTRIES, !reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      return iteratorValue(\n        type,\n        useKeys ? entry[0] : reverse ? this$1.size - ++i : i++,\n        entry[1],\n        step\n      );\n    });\n  };\n  return reversedSequence;\n}\n\nfunction filterFactory(collection, predicate, context, useKeys) {\n  var filterSequence = makeSequence(collection);\n  if (useKeys) {\n    filterSequence.has = function (key) {\n      var v = collection.get(key, NOT_SET);\n      return v !== NOT_SET && !!predicate.call(context, v, key, collection);\n    };\n    filterSequence.get = function (key, notSetValue) {\n      var v = collection.get(key, NOT_SET);\n      return v !== NOT_SET && predicate.call(context, v, key, collection)\n        ? v\n        : notSetValue;\n    };\n  }\n  filterSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    collection.__iterate(function (v, k, c) {\n      if (predicate.call(context, v, k, c)) {\n        iterations++;\n        return fn(v, useKeys ? k : iterations - 1, this$1);\n      }\n    }, reverse);\n    return iterations;\n  };\n  filterSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var iterations = 0;\n    return new Iterator(function () {\n      while (true) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        var entry = step.value;\n        var key = entry[0];\n        var value = entry[1];\n        if (predicate.call(context, value, key, collection)) {\n          return iteratorValue(type, useKeys ? key : iterations++, value, step);\n        }\n      }\n    });\n  };\n  return filterSequence;\n}\n\nfunction countByFactory(collection, grouper, context) {\n  var groups = Map().asMutable();\n  collection.__iterate(function (v, k) {\n    groups.update(grouper.call(context, v, k, collection), 0, function (a) { return a + 1; });\n  });\n  return groups.asImmutable();\n}\n\nfunction groupByFactory(collection, grouper, context) {\n  var isKeyedIter = isKeyed(collection);\n  var groups = (isOrdered(collection) ? OrderedMap() : Map()).asMutable();\n  collection.__iterate(function (v, k) {\n    groups.update(\n      grouper.call(context, v, k, collection),\n      function (a) { return ((a = a || []), a.push(isKeyedIter ? [k, v] : v), a); }\n    );\n  });\n  var coerce = collectionClass(collection);\n  return groups.map(function (arr) { return reify(collection, coerce(arr)); });\n}\n\nfunction sliceFactory(collection, begin, end, useKeys) {\n  var originalSize = collection.size;\n\n  if (wholeSlice(begin, end, originalSize)) {\n    return collection;\n  }\n\n  var resolvedBegin = resolveBegin(begin, originalSize);\n  var resolvedEnd = resolveEnd(end, originalSize);\n\n  // begin or end will be NaN if they were provided as negative numbers and\n  // this collection's size is unknown. In that case, cache first so there is\n  // a known size and these do not resolve to NaN.\n  if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) {\n    return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys);\n  }\n\n  // Note: resolvedEnd is undefined when the original sequence's length is\n  // unknown and this slice did not supply an end and should contain all\n  // elements after resolvedBegin.\n  // In that case, resolvedSize will be NaN and sliceSize will remain undefined.\n  var resolvedSize = resolvedEnd - resolvedBegin;\n  var sliceSize;\n  if (resolvedSize === resolvedSize) {\n    sliceSize = resolvedSize < 0 ? 0 : resolvedSize;\n  }\n\n  var sliceSeq = makeSequence(collection);\n\n  // If collection.size is undefined, the size of the realized sliceSeq is\n  // unknown at this point unless the number of items to slice is 0\n  sliceSeq.size =\n    sliceSize === 0 ? sliceSize : (collection.size && sliceSize) || undefined;\n\n  if (!useKeys && isSeq(collection) && sliceSize >= 0) {\n    sliceSeq.get = function(index, notSetValue) {\n      index = wrapIndex(this, index);\n      return index >= 0 && index < sliceSize\n        ? collection.get(index + resolvedBegin, notSetValue)\n        : notSetValue;\n    };\n  }\n\n  sliceSeq.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (sliceSize === 0) {\n      return 0;\n    }\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var skipped = 0;\n    var isSkipping = true;\n    var iterations = 0;\n    collection.__iterate(function (v, k) {\n      if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) {\n        iterations++;\n        return (\n          fn(v, useKeys ? k : iterations - 1, this$1) !== false &&\n          iterations !== sliceSize\n        );\n      }\n    });\n    return iterations;\n  };\n\n  sliceSeq.__iteratorUncached = function(type, reverse) {\n    if (sliceSize !== 0 && reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    // Don't bother instantiating parent iterator if taking 0.\n    if (sliceSize === 0) {\n      return new Iterator(iteratorDone);\n    }\n    var iterator = collection.__iterator(type, reverse);\n    var skipped = 0;\n    var iterations = 0;\n    return new Iterator(function () {\n      while (skipped++ < resolvedBegin) {\n        iterator.next();\n      }\n      if (++iterations > sliceSize) {\n        return iteratorDone();\n      }\n      var step = iterator.next();\n      if (useKeys || type === ITERATE_VALUES || step.done) {\n        return step;\n      }\n      if (type === ITERATE_KEYS) {\n        return iteratorValue(type, iterations - 1, undefined, step);\n      }\n      return iteratorValue(type, iterations - 1, step.value[1], step);\n    });\n  };\n\n  return sliceSeq;\n}\n\nfunction takeWhileFactory(collection, predicate, context) {\n  var takeSequence = makeSequence(collection);\n  takeSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterations = 0;\n    collection.__iterate(\n      function (v, k, c) { return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$1); }\n    );\n    return iterations;\n  };\n  takeSequence.__iteratorUncached = function(type, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var iterating = true;\n    return new Iterator(function () {\n      if (!iterating) {\n        return iteratorDone();\n      }\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      var k = entry[0];\n      var v = entry[1];\n      if (!predicate.call(context, v, k, this$1)) {\n        iterating = false;\n        return iteratorDone();\n      }\n      return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n    });\n  };\n  return takeSequence;\n}\n\nfunction skipWhileFactory(collection, predicate, context, useKeys) {\n  var skipSequence = makeSequence(collection);\n  skipSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var isSkipping = true;\n    var iterations = 0;\n    collection.__iterate(function (v, k, c) {\n      if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) {\n        iterations++;\n        return fn(v, useKeys ? k : iterations - 1, this$1);\n      }\n    });\n    return iterations;\n  };\n  skipSequence.__iteratorUncached = function(type, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var skipping = true;\n    var iterations = 0;\n    return new Iterator(function () {\n      var step;\n      var k;\n      var v;\n      do {\n        step = iterator.next();\n        if (step.done) {\n          if (useKeys || type === ITERATE_VALUES) {\n            return step;\n          }\n          if (type === ITERATE_KEYS) {\n            return iteratorValue(type, iterations++, undefined, step);\n          }\n          return iteratorValue(type, iterations++, step.value[1], step);\n        }\n        var entry = step.value;\n        k = entry[0];\n        v = entry[1];\n        skipping && (skipping = predicate.call(context, v, k, this$1));\n      } while (skipping);\n      return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n    });\n  };\n  return skipSequence;\n}\n\nfunction concatFactory(collection, values) {\n  var isKeyedCollection = isKeyed(collection);\n  var iters = [collection]\n    .concat(values)\n    .map(function (v) {\n      if (!isCollection(v)) {\n        v = isKeyedCollection\n          ? keyedSeqFromValue(v)\n          : indexedSeqFromValue(Array.isArray(v) ? v : [v]);\n      } else if (isKeyedCollection) {\n        v = KeyedCollection(v);\n      }\n      return v;\n    })\n    .filter(function (v) { return v.size !== 0; });\n\n  if (iters.length === 0) {\n    return collection;\n  }\n\n  if (iters.length === 1) {\n    var singleton = iters[0];\n    if (\n      singleton === collection ||\n      (isKeyedCollection && isKeyed(singleton)) ||\n      (isIndexed(collection) && isIndexed(singleton))\n    ) {\n      return singleton;\n    }\n  }\n\n  var concatSeq = new ArraySeq(iters);\n  if (isKeyedCollection) {\n    concatSeq = concatSeq.toKeyedSeq();\n  } else if (!isIndexed(collection)) {\n    concatSeq = concatSeq.toSetSeq();\n  }\n  concatSeq = concatSeq.flatten(true);\n  concatSeq.size = iters.reduce(function (sum, seq) {\n    if (sum !== undefined) {\n      var size = seq.size;\n      if (size !== undefined) {\n        return sum + size;\n      }\n    }\n  }, 0);\n  return concatSeq;\n}\n\nfunction flattenFactory(collection, depth, useKeys) {\n  var flatSequence = makeSequence(collection);\n  flatSequence.__iterateUncached = function(fn, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterations = 0;\n    var stopped = false;\n    function flatDeep(iter, currentDepth) {\n      iter.__iterate(function (v, k) {\n        if ((!depth || currentDepth < depth) && isCollection(v)) {\n          flatDeep(v, currentDepth + 1);\n        } else {\n          iterations++;\n          if (fn(v, useKeys ? k : iterations - 1, flatSequence) === false) {\n            stopped = true;\n          }\n        }\n        return !stopped;\n      }, reverse);\n    }\n    flatDeep(collection, 0);\n    return iterations;\n  };\n  flatSequence.__iteratorUncached = function(type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(type, reverse);\n    var stack = [];\n    var iterations = 0;\n    return new Iterator(function () {\n      while (iterator) {\n        var step = iterator.next();\n        if (step.done !== false) {\n          iterator = stack.pop();\n          continue;\n        }\n        var v = step.value;\n        if (type === ITERATE_ENTRIES) {\n          v = v[1];\n        }\n        if ((!depth || stack.length < depth) && isCollection(v)) {\n          stack.push(iterator);\n          iterator = v.__iterator(type, reverse);\n        } else {\n          return useKeys ? step : iteratorValue(type, iterations++, v, step);\n        }\n      }\n      return iteratorDone();\n    });\n  };\n  return flatSequence;\n}\n\nfunction flatMapFactory(collection, mapper, context) {\n  var coerce = collectionClass(collection);\n  return collection\n    .toSeq()\n    .map(function (v, k) { return coerce(mapper.call(context, v, k, collection)); })\n    .flatten(true);\n}\n\nfunction interposeFactory(collection, separator) {\n  var interposedSequence = makeSequence(collection);\n  interposedSequence.size = collection.size && collection.size * 2 - 1;\n  interposedSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    collection.__iterate(\n      function (v) { return (!iterations || fn(separator, iterations++, this$1) !== false) &&\n        fn(v, iterations++, this$1) !== false; },\n      reverse\n    );\n    return iterations;\n  };\n  interposedSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_VALUES, reverse);\n    var iterations = 0;\n    var step;\n    return new Iterator(function () {\n      if (!step || iterations % 2) {\n        step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n      }\n      return iterations % 2\n        ? iteratorValue(type, iterations++, separator)\n        : iteratorValue(type, iterations++, step.value, step);\n    });\n  };\n  return interposedSequence;\n}\n\nfunction sortFactory(collection, comparator, mapper) {\n  if (!comparator) {\n    comparator = defaultComparator;\n  }\n  var isKeyedCollection = isKeyed(collection);\n  var index = 0;\n  var entries = collection\n    .toSeq()\n    .map(function (v, k) { return [k, v, index++, mapper ? mapper(v, k, collection) : v]; })\n    .valueSeq()\n    .toArray();\n  entries.sort(function (a, b) { return comparator(a[3], b[3]) || a[2] - b[2]; }).forEach(\n    isKeyedCollection\n      ? function (v, i) {\n          entries[i].length = 2;\n        }\n      : function (v, i) {\n          entries[i] = v[1];\n        }\n  );\n  return isKeyedCollection\n    ? KeyedSeq(entries)\n    : isIndexed(collection) ? IndexedSeq(entries) : SetSeq(entries);\n}\n\nfunction maxFactory(collection, comparator, mapper) {\n  if (!comparator) {\n    comparator = defaultComparator;\n  }\n  if (mapper) {\n    var entry = collection\n      .toSeq()\n      .map(function (v, k) { return [v, mapper(v, k, collection)]; })\n      .reduce(function (a, b) { return (maxCompare(comparator, a[1], b[1]) ? b : a); });\n    return entry && entry[0];\n  }\n  return collection.reduce(function (a, b) { return (maxCompare(comparator, a, b) ? b : a); });\n}\n\nfunction maxCompare(comparator, a, b) {\n  var comp = comparator(b, a);\n  // b is considered the new max if the comparator declares them equal, but\n  // they are not equal and b is in fact a nullish value.\n  return (\n    (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) ||\n    comp > 0\n  );\n}\n\nfunction zipWithFactory(keyIter, zipper, iters, zipAll) {\n  var zipSequence = makeSequence(keyIter);\n  var sizes = new ArraySeq(iters).map(function (i) { return i.size; });\n  zipSequence.size = zipAll ? sizes.max() : sizes.min();\n  // Note: this a generic base implementation of __iterate in terms of\n  // __iterator which may be more generically useful in the future.\n  zipSequence.__iterate = function(fn, reverse) {\n    var this$1 = this;\n\n    /* generic:\n    var iterator = this.__iterator(ITERATE_ENTRIES, reverse);\n    var step;\n    var iterations = 0;\n    while (!(step = iterator.next()).done) {\n      iterations++;\n      if (fn(step.value[1], step.value[0], this) === false) {\n        break;\n      }\n    }\n    return iterations;\n    */\n    // indexed:\n    var iterator = this.__iterator(ITERATE_VALUES, reverse);\n    var step;\n    var iterations = 0;\n    while (!(step = iterator.next()).done) {\n      if (fn(step.value, iterations++, this$1) === false) {\n        break;\n      }\n    }\n    return iterations;\n  };\n  zipSequence.__iteratorUncached = function(type, reverse) {\n    var iterators = iters.map(\n      function (i) { return ((i = Collection(i)), getIterator(reverse ? i.reverse() : i)); }\n    );\n    var iterations = 0;\n    var isDone = false;\n    return new Iterator(function () {\n      var steps;\n      if (!isDone) {\n        steps = iterators.map(function (i) { return i.next(); });\n        isDone = zipAll ? steps.every(function (s) { return s.done; }) : steps.some(function (s) { return s.done; });\n      }\n      if (isDone) {\n        return iteratorDone();\n      }\n      return iteratorValue(\n        type,\n        iterations++,\n        zipper.apply(null, steps.map(function (s) { return s.value; }))\n      );\n    });\n  };\n  return zipSequence;\n}\n\n// #pragma Helper Functions\n\nfunction reify(iter, seq) {\n  return iter === seq ? iter : isSeq(iter) ? seq : iter.constructor(seq);\n}\n\nfunction validateEntry(entry) {\n  if (entry !== Object(entry)) {\n    throw new TypeError('Expected [K, V] tuple: ' + entry);\n  }\n}\n\nfunction collectionClass(collection) {\n  return isKeyed(collection)\n    ? KeyedCollection\n    : isIndexed(collection) ? IndexedCollection : SetCollection;\n}\n\nfunction makeSequence(collection) {\n  return Object.create(\n    (isKeyed(collection)\n      ? KeyedSeq\n      : isIndexed(collection) ? IndexedSeq : SetSeq\n    ).prototype\n  );\n}\n\nfunction cacheResultThrough() {\n  if (this._iter.cacheResult) {\n    this._iter.cacheResult();\n    this.size = this._iter.size;\n    return this;\n  }\n  return Seq.prototype.cacheResult.call(this);\n}\n\nfunction defaultComparator(a, b) {\n  if (a === undefined && b === undefined) {\n    return 0;\n  }\n\n  if (a === undefined) {\n    return 1;\n  }\n\n  if (b === undefined) {\n    return -1;\n  }\n\n  return a > b ? 1 : a < b ? -1 : 0;\n}\n\n// http://jsperf.com/copy-array-inline\nfunction arrCopy(arr, offset) {\n  offset = offset || 0;\n  var len = Math.max(0, arr.length - offset);\n  var newArr = new Array(len);\n  for (var ii = 0; ii < len; ii++) {\n    newArr[ii] = arr[ii + offset];\n  }\n  return newArr;\n}\n\nfunction invariant(condition, error) {\n  if (!condition) { throw new Error(error); }\n}\n\nfunction assertNotInfinite(size) {\n  invariant(\n    size !== Infinity,\n    'Cannot perform this action with an infinite size.'\n  );\n}\n\nfunction coerceKeyPath(keyPath) {\n  if (isArrayLike(keyPath) && typeof keyPath !== 'string') {\n    return keyPath;\n  }\n  if (isOrdered(keyPath)) {\n    return keyPath.toArray();\n  }\n  throw new TypeError(\n    'Invalid keyPath: expected Ordered Collection or Array: ' + keyPath\n  );\n}\n\nfunction isPlainObj(value) {\n  return (\n    value && (value.constructor === Object || value.constructor === undefined)\n  );\n}\n\n/**\n * Returns true if the value is a potentially-persistent data structure, either\n * provided by Immutable.js or a plain Array or Object.\n */\nfunction isDataStructure(value) {\n  return isImmutable(value) || Array.isArray(value) || isPlainObj(value);\n}\n\n/**\n * Converts a value to a string, adding quotes if a string was provided.\n */\nfunction quoteString(value) {\n  try {\n    return typeof value === 'string' ? JSON.stringify(value) : String(value);\n  } catch (_ignoreError) {\n    return JSON.stringify(value);\n  }\n}\n\nfunction has(collection, key) {\n  return isImmutable(collection)\n    ? collection.has(key)\n    : isDataStructure(collection) && hasOwnProperty.call(collection, key);\n}\n\nfunction get(collection, key, notSetValue) {\n  return isImmutable(collection)\n    ? collection.get(key, notSetValue)\n    : !has(collection, key)\n      ? notSetValue\n      : typeof collection.get === 'function'\n        ? collection.get(key)\n        : collection[key];\n}\n\nfunction shallowCopy(from) {\n  if (Array.isArray(from)) {\n    return arrCopy(from);\n  }\n  var to = {};\n  for (var key in from) {\n    if (hasOwnProperty.call(from, key)) {\n      to[key] = from[key];\n    }\n  }\n  return to;\n}\n\nfunction remove(collection, key) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot update non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    if (!collection.remove) {\n      throw new TypeError(\n        'Cannot update immutable value without .remove() method: ' + collection\n      );\n    }\n    return collection.remove(key);\n  }\n  if (!hasOwnProperty.call(collection, key)) {\n    return collection;\n  }\n  var collectionCopy = shallowCopy(collection);\n  if (Array.isArray(collectionCopy)) {\n    collectionCopy.splice(key, 1);\n  } else {\n    delete collectionCopy[key];\n  }\n  return collectionCopy;\n}\n\nfunction set(collection, key, value) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot update non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    if (!collection.set) {\n      throw new TypeError(\n        'Cannot update immutable value without .set() method: ' + collection\n      );\n    }\n    return collection.set(key, value);\n  }\n  if (hasOwnProperty.call(collection, key) && value === collection[key]) {\n    return collection;\n  }\n  var collectionCopy = shallowCopy(collection);\n  collectionCopy[key] = value;\n  return collectionCopy;\n}\n\nfunction updateIn(collection, keyPath, notSetValue, updater) {\n  if (!updater) {\n    updater = notSetValue;\n    notSetValue = undefined;\n  }\n  var updatedValue = updateInDeeply(\n    isImmutable(collection),\n    collection,\n    coerceKeyPath(keyPath),\n    0,\n    notSetValue,\n    updater\n  );\n  return updatedValue === NOT_SET ? notSetValue : updatedValue;\n}\n\nfunction updateInDeeply(\n  inImmutable,\n  existing,\n  keyPath,\n  i,\n  notSetValue,\n  updater\n) {\n  var wasNotSet = existing === NOT_SET;\n  if (i === keyPath.length) {\n    var existingValue = wasNotSet ? notSetValue : existing;\n    var newValue = updater(existingValue);\n    return newValue === existingValue ? existing : newValue;\n  }\n  if (!wasNotSet && !isDataStructure(existing)) {\n    throw new TypeError(\n      'Cannot update within non-data-structure value in path [' +\n        keyPath.slice(0, i).map(quoteString) +\n        ']: ' +\n        existing\n    );\n  }\n  var key = keyPath[i];\n  var nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET);\n  var nextUpdated = updateInDeeply(\n    nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting),\n    nextExisting,\n    keyPath,\n    i + 1,\n    notSetValue,\n    updater\n  );\n  return nextUpdated === nextExisting\n    ? existing\n    : nextUpdated === NOT_SET\n      ? remove(existing, key)\n      : set(\n          wasNotSet ? (inImmutable ? emptyMap() : {}) : existing,\n          key,\n          nextUpdated\n        );\n}\n\nfunction setIn$1(collection, keyPath, value) {\n  return updateIn(collection, keyPath, NOT_SET, function () { return value; });\n}\n\nfunction setIn$$1(keyPath, v) {\n  return setIn$1(this, keyPath, v);\n}\n\nfunction removeIn(collection, keyPath) {\n  return updateIn(collection, keyPath, function () { return NOT_SET; });\n}\n\nfunction deleteIn(keyPath) {\n  return removeIn(this, keyPath);\n}\n\nfunction update$1(collection, key, notSetValue, updater) {\n  return updateIn(collection, [key], notSetValue, updater);\n}\n\nfunction update$$1(key, notSetValue, updater) {\n  return arguments.length === 1\n    ? key(this)\n    : update$1(this, key, notSetValue, updater);\n}\n\nfunction updateIn$1(keyPath, notSetValue, updater) {\n  return updateIn(this, keyPath, notSetValue, updater);\n}\n\nfunction merge() {\n  var iters = [], len = arguments.length;\n  while ( len-- ) iters[ len ] = arguments[ len ];\n\n  return mergeIntoKeyedWith(this, iters);\n}\n\nfunction mergeWith(merger) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return mergeIntoKeyedWith(this, iters, merger);\n}\n\nfunction mergeIntoKeyedWith(collection, collections, merger) {\n  var iters = [];\n  for (var ii = 0; ii < collections.length; ii++) {\n    var collection$1 = KeyedCollection(collections[ii]);\n    if (collection$1.size !== 0) {\n      iters.push(collection$1);\n    }\n  }\n  if (iters.length === 0) {\n    return collection;\n  }\n  if (collection.size === 0 && !collection.__ownerID && iters.length === 1) {\n    return collection.constructor(iters[0]);\n  }\n  return collection.withMutations(function (collection) {\n    var mergeIntoCollection = merger\n      ? function (value, key) {\n          update$1(\n            collection,\n            key,\n            NOT_SET,\n            function (oldVal) { return (oldVal === NOT_SET ? value : merger(oldVal, value, key)); }\n          );\n        }\n      : function (value, key) {\n          collection.set(key, value);\n        };\n    for (var ii = 0; ii < iters.length; ii++) {\n      iters[ii].forEach(mergeIntoCollection);\n    }\n  });\n}\n\nfunction merge$1(collection) {\n  var sources = [], len = arguments.length - 1;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n  return mergeWithSources(collection, sources);\n}\n\nfunction mergeWith$1(merger, collection) {\n  var sources = [], len = arguments.length - 2;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n  return mergeWithSources(collection, sources, merger);\n}\n\nfunction mergeDeep$1(collection) {\n  var sources = [], len = arguments.length - 1;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n  return mergeDeepWithSources(collection, sources);\n}\n\nfunction mergeDeepWith$1(merger, collection) {\n  var sources = [], len = arguments.length - 2;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n  return mergeDeepWithSources(collection, sources, merger);\n}\n\nfunction mergeDeepWithSources(collection, sources, merger) {\n  return mergeWithSources(collection, sources, deepMergerWith(merger));\n}\n\nfunction mergeWithSources(collection, sources, merger) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot merge into non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    return collection.mergeWith\n      ? collection.mergeWith.apply(collection, [ merger ].concat( sources ))\n      : collection.concat.apply(collection, sources);\n  }\n  var isArray = Array.isArray(collection);\n  var merged = collection;\n  var Collection$$1 = isArray ? IndexedCollection : KeyedCollection;\n  var mergeItem = isArray\n    ? function (value) {\n        // Copy on write\n        if (merged === collection) {\n          merged = shallowCopy(merged);\n        }\n        merged.push(value);\n      }\n    : function (value, key) {\n        var hasVal = hasOwnProperty.call(merged, key);\n        var nextVal =\n          hasVal && merger ? merger(merged[key], value, key) : value;\n        if (!hasVal || nextVal !== merged[key]) {\n          // Copy on write\n          if (merged === collection) {\n            merged = shallowCopy(merged);\n          }\n          merged[key] = nextVal;\n        }\n      };\n  for (var i = 0; i < sources.length; i++) {\n    Collection$$1(sources[i]).forEach(mergeItem);\n  }\n  return merged;\n}\n\nfunction deepMergerWith(merger) {\n  function deepMerger(oldValue, newValue, key) {\n    return isDataStructure(oldValue) && isDataStructure(newValue)\n      ? mergeWithSources(oldValue, [newValue], deepMerger)\n      : merger ? merger(oldValue, newValue, key) : newValue;\n  }\n  return deepMerger;\n}\n\nfunction mergeDeep() {\n  var iters = [], len = arguments.length;\n  while ( len-- ) iters[ len ] = arguments[ len ];\n\n  return mergeDeepWithSources(this, iters);\n}\n\nfunction mergeDeepWith(merger) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return mergeDeepWithSources(this, iters, merger);\n}\n\nfunction mergeIn(keyPath) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return updateIn(this, keyPath, emptyMap(), function (m) { return mergeWithSources(m, iters); });\n}\n\nfunction mergeDeepIn(keyPath) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return updateIn(this, keyPath, emptyMap(), function (m) { return mergeDeepWithSources(m, iters); }\n  );\n}\n\nfunction withMutations(fn) {\n  var mutable = this.asMutable();\n  fn(mutable);\n  return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;\n}\n\nfunction asMutable() {\n  return this.__ownerID ? this : this.__ensureOwner(new OwnerID());\n}\n\nfunction asImmutable() {\n  return this.__ensureOwner();\n}\n\nfunction wasAltered() {\n  return this.__altered;\n}\n\nvar Map = (function (KeyedCollection$$1) {\n  function Map(value) {\n    return value === null || value === undefined\n      ? emptyMap()\n      : isMap(value) && !isOrdered(value)\n        ? value\n        : emptyMap().withMutations(function (map) {\n            var iter = KeyedCollection$$1(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v, k) { return map.set(k, v); });\n          });\n  }\n\n  if ( KeyedCollection$$1 ) Map.__proto__ = KeyedCollection$$1;\n  Map.prototype = Object.create( KeyedCollection$$1 && KeyedCollection$$1.prototype );\n  Map.prototype.constructor = Map;\n\n  Map.of = function of () {\n    var keyValues = [], len = arguments.length;\n    while ( len-- ) keyValues[ len ] = arguments[ len ];\n\n    return emptyMap().withMutations(function (map) {\n      for (var i = 0; i < keyValues.length; i += 2) {\n        if (i + 1 >= keyValues.length) {\n          throw new Error('Missing value for key: ' + keyValues[i]);\n        }\n        map.set(keyValues[i], keyValues[i + 1]);\n      }\n    });\n  };\n\n  Map.prototype.toString = function toString () {\n    return this.__toString('Map {', '}');\n  };\n\n  // @pragma Access\n\n  Map.prototype.get = function get (k, notSetValue) {\n    return this._root\n      ? this._root.get(0, undefined, k, notSetValue)\n      : notSetValue;\n  };\n\n  // @pragma Modification\n\n  Map.prototype.set = function set (k, v) {\n    return updateMap(this, k, v);\n  };\n\n  Map.prototype.remove = function remove (k) {\n    return updateMap(this, k, NOT_SET);\n  };\n\n  Map.prototype.deleteAll = function deleteAll (keys) {\n    var collection = Collection(keys);\n\n    if (collection.size === 0) {\n      return this;\n    }\n\n    return this.withMutations(function (map) {\n      collection.forEach(function (key) { return map.remove(key); });\n    });\n  };\n\n  Map.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._root = null;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyMap();\n  };\n\n  // @pragma Composition\n\n  Map.prototype.sort = function sort (comparator) {\n    // Late binding\n    return OrderedMap(sortFactory(this, comparator));\n  };\n\n  Map.prototype.sortBy = function sortBy (mapper, comparator) {\n    // Late binding\n    return OrderedMap(sortFactory(this, comparator, mapper));\n  };\n\n  // @pragma Mutability\n\n  Map.prototype.__iterator = function __iterator (type, reverse) {\n    return new MapIterator(this, type, reverse);\n  };\n\n  Map.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    this._root &&\n      this._root.iterate(function (entry) {\n        iterations++;\n        return fn(entry[1], entry[0], this$1);\n      }, reverse);\n    return iterations;\n  };\n\n  Map.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyMap();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeMap(this.size, this._root, ownerID, this.__hash);\n  };\n\n  return Map;\n}(KeyedCollection));\n\nfunction isMap(maybeMap) {\n  return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]);\n}\n\nMap.isMap = isMap;\n\nvar IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';\n\nvar MapPrototype = Map.prototype;\nMapPrototype[IS_MAP_SENTINEL] = true;\nMapPrototype[DELETE] = MapPrototype.remove;\nMapPrototype.removeAll = MapPrototype.deleteAll;\nMapPrototype.concat = MapPrototype.merge;\nMapPrototype.setIn = setIn$$1;\nMapPrototype.removeIn = MapPrototype.deleteIn = deleteIn;\nMapPrototype.update = update$$1;\nMapPrototype.updateIn = updateIn$1;\nMapPrototype.merge = merge;\nMapPrototype.mergeWith = mergeWith;\nMapPrototype.mergeDeep = mergeDeep;\nMapPrototype.mergeDeepWith = mergeDeepWith;\nMapPrototype.mergeIn = mergeIn;\nMapPrototype.mergeDeepIn = mergeDeepIn;\nMapPrototype.withMutations = withMutations;\nMapPrototype.wasAltered = wasAltered;\nMapPrototype.asImmutable = asImmutable;\nMapPrototype['@@transducer/init'] = MapPrototype.asMutable = asMutable;\nMapPrototype['@@transducer/step'] = function(result, arr) {\n  return result.set(arr[0], arr[1]);\n};\nMapPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\n// #pragma Trie Nodes\n\nvar ArrayMapNode = function ArrayMapNode(ownerID, entries) {\n  this.ownerID = ownerID;\n  this.entries = entries;\n};\n\nArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  var entries = this.entries;\n  for (var ii = 0, len = entries.length; ii < len; ii++) {\n    if (is(key, entries[ii][0])) {\n      return entries[ii][1];\n    }\n  }\n  return notSetValue;\n};\n\nArrayMapNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  var removed = value === NOT_SET;\n\n  var entries = this.entries;\n  var idx = 0;\n  var len = entries.length;\n  for (; idx < len; idx++) {\n    if (is(key, entries[idx][0])) {\n      break;\n    }\n  }\n  var exists = idx < len;\n\n  if (exists ? entries[idx][1] === value : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n  (removed || !exists) && SetRef(didChangeSize);\n\n  if (removed && entries.length === 1) {\n    return; // undefined\n  }\n\n  if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n    return createNodes(ownerID, entries, key, value);\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newEntries = isEditable ? entries : arrCopy(entries);\n\n  if (exists) {\n    if (removed) {\n      idx === len - 1\n        ? newEntries.pop()\n        : (newEntries[idx] = newEntries.pop());\n    } else {\n      newEntries[idx] = [key, value];\n    }\n  } else {\n    newEntries.push([key, value]);\n  }\n\n  if (isEditable) {\n    this.entries = newEntries;\n    return this;\n  }\n\n  return new ArrayMapNode(ownerID, newEntries);\n};\n\nvar BitmapIndexedNode = function BitmapIndexedNode(ownerID, bitmap, nodes) {\n  this.ownerID = ownerID;\n  this.bitmap = bitmap;\n  this.nodes = nodes;\n};\n\nBitmapIndexedNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK);\n  var bitmap = this.bitmap;\n  return (bitmap & bit) === 0\n    ? notSetValue\n    : this.nodes[popCount(bitmap & (bit - 1))].get(\n        shift + SHIFT,\n        keyHash,\n        key,\n        notSetValue\n      );\n};\n\nBitmapIndexedNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var bit = 1 << keyHashFrag;\n  var bitmap = this.bitmap;\n  var exists = (bitmap & bit) !== 0;\n\n  if (!exists && value === NOT_SET) {\n    return this;\n  }\n\n  var idx = popCount(bitmap & (bit - 1));\n  var nodes = this.nodes;\n  var node = exists ? nodes[idx] : undefined;\n  var newNode = updateNode(\n    node,\n    ownerID,\n    shift + SHIFT,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n\n  if (newNode === node) {\n    return this;\n  }\n\n  if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n    return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);\n  }\n\n  if (\n    exists &&\n    !newNode &&\n    nodes.length === 2 &&\n    isLeafNode(nodes[idx ^ 1])\n  ) {\n    return nodes[idx ^ 1];\n  }\n\n  if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n    return newNode;\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit;\n  var newNodes = exists\n    ? newNode\n      ? setAt(nodes, idx, newNode, isEditable)\n      : spliceOut(nodes, idx, isEditable)\n    : spliceIn(nodes, idx, newNode, isEditable);\n\n  if (isEditable) {\n    this.bitmap = newBitmap;\n    this.nodes = newNodes;\n    return this;\n  }\n\n  return new BitmapIndexedNode(ownerID, newBitmap, newNodes);\n};\n\nvar HashArrayMapNode = function HashArrayMapNode(ownerID, count, nodes) {\n  this.ownerID = ownerID;\n  this.count = count;\n  this.nodes = nodes;\n};\n\nHashArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var node = this.nodes[idx];\n  return node\n    ? node.get(shift + SHIFT, keyHash, key, notSetValue)\n    : notSetValue;\n};\n\nHashArrayMapNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var removed = value === NOT_SET;\n  var nodes = this.nodes;\n  var node = nodes[idx];\n\n  if (removed && !node) {\n    return this;\n  }\n\n  var newNode = updateNode(\n    node,\n    ownerID,\n    shift + SHIFT,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n  if (newNode === node) {\n    return this;\n  }\n\n  var newCount = this.count;\n  if (!node) {\n    newCount++;\n  } else if (!newNode) {\n    newCount--;\n    if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n      return packNodes(ownerID, nodes, newCount, idx);\n    }\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newNodes = setAt(nodes, idx, newNode, isEditable);\n\n  if (isEditable) {\n    this.count = newCount;\n    this.nodes = newNodes;\n    return this;\n  }\n\n  return new HashArrayMapNode(ownerID, newCount, newNodes);\n};\n\nvar HashCollisionNode = function HashCollisionNode(ownerID, keyHash, entries) {\n  this.ownerID = ownerID;\n  this.keyHash = keyHash;\n  this.entries = entries;\n};\n\nHashCollisionNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  var entries = this.entries;\n  for (var ii = 0, len = entries.length; ii < len; ii++) {\n    if (is(key, entries[ii][0])) {\n      return entries[ii][1];\n    }\n  }\n  return notSetValue;\n};\n\nHashCollisionNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n\n  var removed = value === NOT_SET;\n\n  if (keyHash !== this.keyHash) {\n    if (removed) {\n      return this;\n    }\n    SetRef(didAlter);\n    SetRef(didChangeSize);\n    return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]);\n  }\n\n  var entries = this.entries;\n  var idx = 0;\n  var len = entries.length;\n  for (; idx < len; idx++) {\n    if (is(key, entries[idx][0])) {\n      break;\n    }\n  }\n  var exists = idx < len;\n\n  if (exists ? entries[idx][1] === value : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n  (removed || !exists) && SetRef(didChangeSize);\n\n  if (removed && len === 2) {\n    return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]);\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newEntries = isEditable ? entries : arrCopy(entries);\n\n  if (exists) {\n    if (removed) {\n      idx === len - 1\n        ? newEntries.pop()\n        : (newEntries[idx] = newEntries.pop());\n    } else {\n      newEntries[idx] = [key, value];\n    }\n  } else {\n    newEntries.push([key, value]);\n  }\n\n  if (isEditable) {\n    this.entries = newEntries;\n    return this;\n  }\n\n  return new HashCollisionNode(ownerID, this.keyHash, newEntries);\n};\n\nvar ValueNode = function ValueNode(ownerID, keyHash, entry) {\n  this.ownerID = ownerID;\n  this.keyHash = keyHash;\n  this.entry = entry;\n};\n\nValueNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  return is(key, this.entry[0]) ? this.entry[1] : notSetValue;\n};\n\nValueNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  var removed = value === NOT_SET;\n  var keyMatch = is(key, this.entry[0]);\n  if (keyMatch ? value === this.entry[1] : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n\n  if (removed) {\n    SetRef(didChangeSize);\n    return; // undefined\n  }\n\n  if (keyMatch) {\n    if (ownerID && ownerID === this.ownerID) {\n      this.entry[1] = value;\n      return this;\n    }\n    return new ValueNode(ownerID, this.keyHash, [key, value]);\n  }\n\n  SetRef(didChangeSize);\n  return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]);\n};\n\n// #pragma Iterators\n\nArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = function(\n  fn,\n  reverse\n) {\n  var entries = this.entries;\n  for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) {\n    if (fn(entries[reverse ? maxIndex - ii : ii]) === false) {\n      return false;\n    }\n  }\n};\n\nBitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = function(\n  fn,\n  reverse\n) {\n  var nodes = this.nodes;\n  for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) {\n    var node = nodes[reverse ? maxIndex - ii : ii];\n    if (node && node.iterate(fn, reverse) === false) {\n      return false;\n    }\n  }\n};\n\n// eslint-disable-next-line no-unused-vars\nValueNode.prototype.iterate = function(fn, reverse) {\n  return fn(this.entry);\n};\n\nvar MapIterator = (function (Iterator$$1) {\n  function MapIterator(map, type, reverse) {\n    this._type = type;\n    this._reverse = reverse;\n    this._stack = map._root && mapIteratorFrame(map._root);\n  }\n\n  if ( Iterator$$1 ) MapIterator.__proto__ = Iterator$$1;\n  MapIterator.prototype = Object.create( Iterator$$1 && Iterator$$1.prototype );\n  MapIterator.prototype.constructor = MapIterator;\n\n  MapIterator.prototype.next = function next () {\n    var this$1 = this;\n\n    var type = this._type;\n    var stack = this._stack;\n    while (stack) {\n      var node = stack.node;\n      var index = stack.index++;\n      var maxIndex = (void 0);\n      if (node.entry) {\n        if (index === 0) {\n          return mapIteratorValue(type, node.entry);\n        }\n      } else if (node.entries) {\n        maxIndex = node.entries.length - 1;\n        if (index <= maxIndex) {\n          return mapIteratorValue(\n            type,\n            node.entries[this$1._reverse ? maxIndex - index : index]\n          );\n        }\n      } else {\n        maxIndex = node.nodes.length - 1;\n        if (index <= maxIndex) {\n          var subNode = node.nodes[this$1._reverse ? maxIndex - index : index];\n          if (subNode) {\n            if (subNode.entry) {\n              return mapIteratorValue(type, subNode.entry);\n            }\n            stack = this$1._stack = mapIteratorFrame(subNode, stack);\n          }\n          continue;\n        }\n      }\n      stack = this$1._stack = this$1._stack.__prev;\n    }\n    return iteratorDone();\n  };\n\n  return MapIterator;\n}(Iterator));\n\nfunction mapIteratorValue(type, entry) {\n  return iteratorValue(type, entry[0], entry[1]);\n}\n\nfunction mapIteratorFrame(node, prev) {\n  return {\n    node: node,\n    index: 0,\n    __prev: prev\n  };\n}\n\nfunction makeMap(size, root, ownerID, hash$$1) {\n  var map = Object.create(MapPrototype);\n  map.size = size;\n  map._root = root;\n  map.__ownerID = ownerID;\n  map.__hash = hash$$1;\n  map.__altered = false;\n  return map;\n}\n\nvar EMPTY_MAP;\nfunction emptyMap() {\n  return EMPTY_MAP || (EMPTY_MAP = makeMap(0));\n}\n\nfunction updateMap(map, k, v) {\n  var newRoot;\n  var newSize;\n  if (!map._root) {\n    if (v === NOT_SET) {\n      return map;\n    }\n    newSize = 1;\n    newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]);\n  } else {\n    var didChangeSize = MakeRef(CHANGE_LENGTH);\n    var didAlter = MakeRef(DID_ALTER);\n    newRoot = updateNode(\n      map._root,\n      map.__ownerID,\n      0,\n      undefined,\n      k,\n      v,\n      didChangeSize,\n      didAlter\n    );\n    if (!didAlter.value) {\n      return map;\n    }\n    newSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0);\n  }\n  if (map.__ownerID) {\n    map.size = newSize;\n    map._root = newRoot;\n    map.__hash = undefined;\n    map.__altered = true;\n    return map;\n  }\n  return newRoot ? makeMap(newSize, newRoot) : emptyMap();\n}\n\nfunction updateNode(\n  node,\n  ownerID,\n  shift,\n  keyHash,\n  key,\n  value,\n  didChangeSize,\n  didAlter\n) {\n  if (!node) {\n    if (value === NOT_SET) {\n      return node;\n    }\n    SetRef(didAlter);\n    SetRef(didChangeSize);\n    return new ValueNode(ownerID, keyHash, [key, value]);\n  }\n  return node.update(\n    ownerID,\n    shift,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n}\n\nfunction isLeafNode(node) {\n  return (\n    node.constructor === ValueNode || node.constructor === HashCollisionNode\n  );\n}\n\nfunction mergeIntoNode(node, ownerID, shift, keyHash, entry) {\n  if (node.keyHash === keyHash) {\n    return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]);\n  }\n\n  var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK;\n  var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n\n  var newNode;\n  var nodes =\n    idx1 === idx2\n      ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)]\n      : ((newNode = new ValueNode(ownerID, keyHash, entry)),\n        idx1 < idx2 ? [node, newNode] : [newNode, node]);\n\n  return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes);\n}\n\nfunction createNodes(ownerID, entries, key, value) {\n  if (!ownerID) {\n    ownerID = new OwnerID();\n  }\n  var node = new ValueNode(ownerID, hash(key), [key, value]);\n  for (var ii = 0; ii < entries.length; ii++) {\n    var entry = entries[ii];\n    node = node.update(ownerID, 0, undefined, entry[0], entry[1]);\n  }\n  return node;\n}\n\nfunction packNodes(ownerID, nodes, count, excluding) {\n  var bitmap = 0;\n  var packedII = 0;\n  var packedNodes = new Array(count);\n  for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n    var node = nodes[ii];\n    if (node !== undefined && ii !== excluding) {\n      bitmap |= bit;\n      packedNodes[packedII++] = node;\n    }\n  }\n  return new BitmapIndexedNode(ownerID, bitmap, packedNodes);\n}\n\nfunction expandNodes(ownerID, nodes, bitmap, including, node) {\n  var count = 0;\n  var expandedNodes = new Array(SIZE);\n  for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n    expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined;\n  }\n  expandedNodes[including] = node;\n  return new HashArrayMapNode(ownerID, count + 1, expandedNodes);\n}\n\nfunction popCount(x) {\n  x -= (x >> 1) & 0x55555555;\n  x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n  x = (x + (x >> 4)) & 0x0f0f0f0f;\n  x += x >> 8;\n  x += x >> 16;\n  return x & 0x7f;\n}\n\nfunction setAt(array, idx, val, canEdit) {\n  var newArray = canEdit ? array : arrCopy(array);\n  newArray[idx] = val;\n  return newArray;\n}\n\nfunction spliceIn(array, idx, val, canEdit) {\n  var newLen = array.length + 1;\n  if (canEdit && idx + 1 === newLen) {\n    array[idx] = val;\n    return array;\n  }\n  var newArray = new Array(newLen);\n  var after = 0;\n  for (var ii = 0; ii < newLen; ii++) {\n    if (ii === idx) {\n      newArray[ii] = val;\n      after = -1;\n    } else {\n      newArray[ii] = array[ii + after];\n    }\n  }\n  return newArray;\n}\n\nfunction spliceOut(array, idx, canEdit) {\n  var newLen = array.length - 1;\n  if (canEdit && idx === newLen) {\n    array.pop();\n    return array;\n  }\n  var newArray = new Array(newLen);\n  var after = 0;\n  for (var ii = 0; ii < newLen; ii++) {\n    if (ii === idx) {\n      after = 1;\n    }\n    newArray[ii] = array[ii + after];\n  }\n  return newArray;\n}\n\nvar MAX_ARRAY_MAP_SIZE = SIZE / 4;\nvar MAX_BITMAP_INDEXED_SIZE = SIZE / 2;\nvar MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4;\n\nvar List = (function (IndexedCollection$$1) {\n  function List(value) {\n    var empty = emptyList();\n    if (value === null || value === undefined) {\n      return empty;\n    }\n    if (isList(value)) {\n      return value;\n    }\n    var iter = IndexedCollection$$1(value);\n    var size = iter.size;\n    if (size === 0) {\n      return empty;\n    }\n    assertNotInfinite(size);\n    if (size > 0 && size < SIZE) {\n      return makeList(0, size, SHIFT, null, new VNode(iter.toArray()));\n    }\n    return empty.withMutations(function (list) {\n      list.setSize(size);\n      iter.forEach(function (v, i) { return list.set(i, v); });\n    });\n  }\n\n  if ( IndexedCollection$$1 ) List.__proto__ = IndexedCollection$$1;\n  List.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n  List.prototype.constructor = List;\n\n  List.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  List.prototype.toString = function toString () {\n    return this.__toString('List [', ']');\n  };\n\n  // @pragma Access\n\n  List.prototype.get = function get (index, notSetValue) {\n    index = wrapIndex(this, index);\n    if (index >= 0 && index < this.size) {\n      index += this._origin;\n      var node = listNodeFor(this, index);\n      return node && node.array[index & MASK];\n    }\n    return notSetValue;\n  };\n\n  // @pragma Modification\n\n  List.prototype.set = function set (index, value) {\n    return updateList(this, index, value);\n  };\n\n  List.prototype.remove = function remove (index) {\n    return !this.has(index)\n      ? this\n      : index === 0\n        ? this.shift()\n        : index === this.size - 1 ? this.pop() : this.splice(index, 1);\n  };\n\n  List.prototype.insert = function insert (index, value) {\n    return this.splice(index, 0, value);\n  };\n\n  List.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = this._origin = this._capacity = 0;\n      this._level = SHIFT;\n      this._root = this._tail = null;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyList();\n  };\n\n  List.prototype.push = function push (/*...values*/) {\n    var values = arguments;\n    var oldSize = this.size;\n    return this.withMutations(function (list) {\n      setListBounds(list, 0, oldSize + values.length);\n      for (var ii = 0; ii < values.length; ii++) {\n        list.set(oldSize + ii, values[ii]);\n      }\n    });\n  };\n\n  List.prototype.pop = function pop () {\n    return setListBounds(this, 0, -1);\n  };\n\n  List.prototype.unshift = function unshift (/*...values*/) {\n    var values = arguments;\n    return this.withMutations(function (list) {\n      setListBounds(list, -values.length);\n      for (var ii = 0; ii < values.length; ii++) {\n        list.set(ii, values[ii]);\n      }\n    });\n  };\n\n  List.prototype.shift = function shift () {\n    return setListBounds(this, 1);\n  };\n\n  // @pragma Composition\n\n  List.prototype.concat = function concat (/*...collections*/) {\n    var arguments$1 = arguments;\n\n    var seqs = [];\n    for (var i = 0; i < arguments.length; i++) {\n      var argument = arguments$1[i];\n      var seq = IndexedCollection$$1(\n        typeof argument !== 'string' && hasIterator(argument)\n          ? argument\n          : [argument]\n      );\n      if (seq.size !== 0) {\n        seqs.push(seq);\n      }\n    }\n    if (seqs.length === 0) {\n      return this;\n    }\n    if (this.size === 0 && !this.__ownerID && seqs.length === 1) {\n      return this.constructor(seqs[0]);\n    }\n    return this.withMutations(function (list) {\n      seqs.forEach(function (seq) { return seq.forEach(function (value) { return list.push(value); }); });\n    });\n  };\n\n  List.prototype.setSize = function setSize (size) {\n    return setListBounds(this, 0, size);\n  };\n\n  // @pragma Iteration\n\n  List.prototype.slice = function slice (begin, end) {\n    var size = this.size;\n    if (wholeSlice(begin, end, size)) {\n      return this;\n    }\n    return setListBounds(\n      this,\n      resolveBegin(begin, size),\n      resolveEnd(end, size)\n    );\n  };\n\n  List.prototype.__iterator = function __iterator (type, reverse) {\n    var index = reverse ? this.size : 0;\n    var values = iterateList(this, reverse);\n    return new Iterator(function () {\n      var value = values();\n      return value === DONE\n        ? iteratorDone()\n        : iteratorValue(type, reverse ? --index : index++, value);\n    });\n  };\n\n  List.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var index = reverse ? this.size : 0;\n    var values = iterateList(this, reverse);\n    var value;\n    while ((value = values()) !== DONE) {\n      if (fn(value, reverse ? --index : index++, this$1) === false) {\n        break;\n      }\n    }\n    return index;\n  };\n\n  List.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyList();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeList(\n      this._origin,\n      this._capacity,\n      this._level,\n      this._root,\n      this._tail,\n      ownerID,\n      this.__hash\n    );\n  };\n\n  return List;\n}(IndexedCollection));\n\nfunction isList(maybeList) {\n  return !!(maybeList && maybeList[IS_LIST_SENTINEL]);\n}\n\nList.isList = isList;\n\nvar IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';\n\nvar ListPrototype = List.prototype;\nListPrototype[IS_LIST_SENTINEL] = true;\nListPrototype[DELETE] = ListPrototype.remove;\nListPrototype.merge = ListPrototype.concat;\nListPrototype.setIn = setIn$$1;\nListPrototype.deleteIn = ListPrototype.removeIn = deleteIn;\nListPrototype.update = update$$1;\nListPrototype.updateIn = updateIn$1;\nListPrototype.mergeIn = mergeIn;\nListPrototype.mergeDeepIn = mergeDeepIn;\nListPrototype.withMutations = withMutations;\nListPrototype.wasAltered = wasAltered;\nListPrototype.asImmutable = asImmutable;\nListPrototype['@@transducer/init'] = ListPrototype.asMutable = asMutable;\nListPrototype['@@transducer/step'] = function(result, arr) {\n  return result.push(arr);\n};\nListPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nvar VNode = function VNode(array, ownerID) {\n  this.array = array;\n  this.ownerID = ownerID;\n};\n\n// TODO: seems like these methods are very similar\n\nVNode.prototype.removeBefore = function removeBefore (ownerID, level, index) {\n  if (index === level ? 1 << level : 0 || this.array.length === 0) {\n    return this;\n  }\n  var originIndex = (index >>> level) & MASK;\n  if (originIndex >= this.array.length) {\n    return new VNode([], ownerID);\n  }\n  var removingFirst = originIndex === 0;\n  var newChild;\n  if (level > 0) {\n    var oldChild = this.array[originIndex];\n    newChild =\n      oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index);\n    if (newChild === oldChild && removingFirst) {\n      return this;\n    }\n  }\n  if (removingFirst && !newChild) {\n    return this;\n  }\n  var editable = editableVNode(this, ownerID);\n  if (!removingFirst) {\n    for (var ii = 0; ii < originIndex; ii++) {\n      editable.array[ii] = undefined;\n    }\n  }\n  if (newChild) {\n    editable.array[originIndex] = newChild;\n  }\n  return editable;\n};\n\nVNode.prototype.removeAfter = function removeAfter (ownerID, level, index) {\n  if (index === (level ? 1 << level : 0) || this.array.length === 0) {\n    return this;\n  }\n  var sizeIndex = ((index - 1) >>> level) & MASK;\n  if (sizeIndex >= this.array.length) {\n    return this;\n  }\n\n  var newChild;\n  if (level > 0) {\n    var oldChild = this.array[sizeIndex];\n    newChild =\n      oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index);\n    if (newChild === oldChild && sizeIndex === this.array.length - 1) {\n      return this;\n    }\n  }\n\n  var editable = editableVNode(this, ownerID);\n  editable.array.splice(sizeIndex + 1);\n  if (newChild) {\n    editable.array[sizeIndex] = newChild;\n  }\n  return editable;\n};\n\nvar DONE = {};\n\nfunction iterateList(list, reverse) {\n  var left = list._origin;\n  var right = list._capacity;\n  var tailPos = getTailOffset(right);\n  var tail = list._tail;\n\n  return iterateNodeOrLeaf(list._root, list._level, 0);\n\n  function iterateNodeOrLeaf(node, level, offset) {\n    return level === 0\n      ? iterateLeaf(node, offset)\n      : iterateNode(node, level, offset);\n  }\n\n  function iterateLeaf(node, offset) {\n    var array = offset === tailPos ? tail && tail.array : node && node.array;\n    var from = offset > left ? 0 : left - offset;\n    var to = right - offset;\n    if (to > SIZE) {\n      to = SIZE;\n    }\n    return function () {\n      if (from === to) {\n        return DONE;\n      }\n      var idx = reverse ? --to : from++;\n      return array && array[idx];\n    };\n  }\n\n  function iterateNode(node, level, offset) {\n    var values;\n    var array = node && node.array;\n    var from = offset > left ? 0 : (left - offset) >> level;\n    var to = ((right - offset) >> level) + 1;\n    if (to > SIZE) {\n      to = SIZE;\n    }\n    return function () {\n      while (true) {\n        if (values) {\n          var value = values();\n          if (value !== DONE) {\n            return value;\n          }\n          values = null;\n        }\n        if (from === to) {\n          return DONE;\n        }\n        var idx = reverse ? --to : from++;\n        values = iterateNodeOrLeaf(\n          array && array[idx],\n          level - SHIFT,\n          offset + (idx << level)\n        );\n      }\n    };\n  }\n}\n\nfunction makeList(origin, capacity, level, root, tail, ownerID, hash) {\n  var list = Object.create(ListPrototype);\n  list.size = capacity - origin;\n  list._origin = origin;\n  list._capacity = capacity;\n  list._level = level;\n  list._root = root;\n  list._tail = tail;\n  list.__ownerID = ownerID;\n  list.__hash = hash;\n  list.__altered = false;\n  return list;\n}\n\nvar EMPTY_LIST;\nfunction emptyList() {\n  return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT));\n}\n\nfunction updateList(list, index, value) {\n  index = wrapIndex(list, index);\n\n  if (index !== index) {\n    return list;\n  }\n\n  if (index >= list.size || index < 0) {\n    return list.withMutations(function (list) {\n      index < 0\n        ? setListBounds(list, index).set(0, value)\n        : setListBounds(list, 0, index + 1).set(index, value);\n    });\n  }\n\n  index += list._origin;\n\n  var newTail = list._tail;\n  var newRoot = list._root;\n  var didAlter = MakeRef(DID_ALTER);\n  if (index >= getTailOffset(list._capacity)) {\n    newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter);\n  } else {\n    newRoot = updateVNode(\n      newRoot,\n      list.__ownerID,\n      list._level,\n      index,\n      value,\n      didAlter\n    );\n  }\n\n  if (!didAlter.value) {\n    return list;\n  }\n\n  if (list.__ownerID) {\n    list._root = newRoot;\n    list._tail = newTail;\n    list.__hash = undefined;\n    list.__altered = true;\n    return list;\n  }\n  return makeList(list._origin, list._capacity, list._level, newRoot, newTail);\n}\n\nfunction updateVNode(node, ownerID, level, index, value, didAlter) {\n  var idx = (index >>> level) & MASK;\n  var nodeHas = node && idx < node.array.length;\n  if (!nodeHas && value === undefined) {\n    return node;\n  }\n\n  var newNode;\n\n  if (level > 0) {\n    var lowerNode = node && node.array[idx];\n    var newLowerNode = updateVNode(\n      lowerNode,\n      ownerID,\n      level - SHIFT,\n      index,\n      value,\n      didAlter\n    );\n    if (newLowerNode === lowerNode) {\n      return node;\n    }\n    newNode = editableVNode(node, ownerID);\n    newNode.array[idx] = newLowerNode;\n    return newNode;\n  }\n\n  if (nodeHas && node.array[idx] === value) {\n    return node;\n  }\n\n  SetRef(didAlter);\n\n  newNode = editableVNode(node, ownerID);\n  if (value === undefined && idx === newNode.array.length - 1) {\n    newNode.array.pop();\n  } else {\n    newNode.array[idx] = value;\n  }\n  return newNode;\n}\n\nfunction editableVNode(node, ownerID) {\n  if (ownerID && node && ownerID === node.ownerID) {\n    return node;\n  }\n  return new VNode(node ? node.array.slice() : [], ownerID);\n}\n\nfunction listNodeFor(list, rawIndex) {\n  if (rawIndex >= getTailOffset(list._capacity)) {\n    return list._tail;\n  }\n  if (rawIndex < 1 << (list._level + SHIFT)) {\n    var node = list._root;\n    var level = list._level;\n    while (node && level > 0) {\n      node = node.array[(rawIndex >>> level) & MASK];\n      level -= SHIFT;\n    }\n    return node;\n  }\n}\n\nfunction setListBounds(list, begin, end) {\n  // Sanitize begin & end using this shorthand for ToInt32(argument)\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n  if (begin !== undefined) {\n    begin |= 0;\n  }\n  if (end !== undefined) {\n    end |= 0;\n  }\n  var owner = list.__ownerID || new OwnerID();\n  var oldOrigin = list._origin;\n  var oldCapacity = list._capacity;\n  var newOrigin = oldOrigin + begin;\n  var newCapacity =\n    end === undefined\n      ? oldCapacity\n      : end < 0 ? oldCapacity + end : oldOrigin + end;\n  if (newOrigin === oldOrigin && newCapacity === oldCapacity) {\n    return list;\n  }\n\n  // If it's going to end after it starts, it's empty.\n  if (newOrigin >= newCapacity) {\n    return list.clear();\n  }\n\n  var newLevel = list._level;\n  var newRoot = list._root;\n\n  // New origin might need creating a higher root.\n  var offsetShift = 0;\n  while (newOrigin + offsetShift < 0) {\n    newRoot = new VNode(\n      newRoot && newRoot.array.length ? [undefined, newRoot] : [],\n      owner\n    );\n    newLevel += SHIFT;\n    offsetShift += 1 << newLevel;\n  }\n  if (offsetShift) {\n    newOrigin += offsetShift;\n    oldOrigin += offsetShift;\n    newCapacity += offsetShift;\n    oldCapacity += offsetShift;\n  }\n\n  var oldTailOffset = getTailOffset(oldCapacity);\n  var newTailOffset = getTailOffset(newCapacity);\n\n  // New size might need creating a higher root.\n  while (newTailOffset >= 1 << (newLevel + SHIFT)) {\n    newRoot = new VNode(\n      newRoot && newRoot.array.length ? [newRoot] : [],\n      owner\n    );\n    newLevel += SHIFT;\n  }\n\n  // Locate or create the new tail.\n  var oldTail = list._tail;\n  var newTail =\n    newTailOffset < oldTailOffset\n      ? listNodeFor(list, newCapacity - 1)\n      : newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail;\n\n  // Merge Tail into tree.\n  if (\n    oldTail &&\n    newTailOffset > oldTailOffset &&\n    newOrigin < oldCapacity &&\n    oldTail.array.length\n  ) {\n    newRoot = editableVNode(newRoot, owner);\n    var node = newRoot;\n    for (var level = newLevel; level > SHIFT; level -= SHIFT) {\n      var idx = (oldTailOffset >>> level) & MASK;\n      node = node.array[idx] = editableVNode(node.array[idx], owner);\n    }\n    node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail;\n  }\n\n  // If the size has been reduced, there's a chance the tail needs to be trimmed.\n  if (newCapacity < oldCapacity) {\n    newTail = newTail && newTail.removeAfter(owner, 0, newCapacity);\n  }\n\n  // If the new origin is within the tail, then we do not need a root.\n  if (newOrigin >= newTailOffset) {\n    newOrigin -= newTailOffset;\n    newCapacity -= newTailOffset;\n    newLevel = SHIFT;\n    newRoot = null;\n    newTail = newTail && newTail.removeBefore(owner, 0, newOrigin);\n\n    // Otherwise, if the root has been trimmed, garbage collect.\n  } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) {\n    offsetShift = 0;\n\n    // Identify the new top root node of the subtree of the old root.\n    while (newRoot) {\n      var beginIndex = (newOrigin >>> newLevel) & MASK;\n      if ((beginIndex !== newTailOffset >>> newLevel) & MASK) {\n        break;\n      }\n      if (beginIndex) {\n        offsetShift += (1 << newLevel) * beginIndex;\n      }\n      newLevel -= SHIFT;\n      newRoot = newRoot.array[beginIndex];\n    }\n\n    // Trim the new sides of the new root.\n    if (newRoot && newOrigin > oldOrigin) {\n      newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift);\n    }\n    if (newRoot && newTailOffset < oldTailOffset) {\n      newRoot = newRoot.removeAfter(\n        owner,\n        newLevel,\n        newTailOffset - offsetShift\n      );\n    }\n    if (offsetShift) {\n      newOrigin -= offsetShift;\n      newCapacity -= offsetShift;\n    }\n  }\n\n  if (list.__ownerID) {\n    list.size = newCapacity - newOrigin;\n    list._origin = newOrigin;\n    list._capacity = newCapacity;\n    list._level = newLevel;\n    list._root = newRoot;\n    list._tail = newTail;\n    list.__hash = undefined;\n    list.__altered = true;\n    return list;\n  }\n  return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail);\n}\n\nfunction getTailOffset(size) {\n  return size < SIZE ? 0 : ((size - 1) >>> SHIFT) << SHIFT;\n}\n\nvar OrderedMap = (function (Map$$1) {\n  function OrderedMap(value) {\n    return value === null || value === undefined\n      ? emptyOrderedMap()\n      : isOrderedMap(value)\n        ? value\n        : emptyOrderedMap().withMutations(function (map) {\n            var iter = KeyedCollection(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v, k) { return map.set(k, v); });\n          });\n  }\n\n  if ( Map$$1 ) OrderedMap.__proto__ = Map$$1;\n  OrderedMap.prototype = Object.create( Map$$1 && Map$$1.prototype );\n  OrderedMap.prototype.constructor = OrderedMap;\n\n  OrderedMap.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  OrderedMap.prototype.toString = function toString () {\n    return this.__toString('OrderedMap {', '}');\n  };\n\n  // @pragma Access\n\n  OrderedMap.prototype.get = function get (k, notSetValue) {\n    var index = this._map.get(k);\n    return index !== undefined ? this._list.get(index)[1] : notSetValue;\n  };\n\n  // @pragma Modification\n\n  OrderedMap.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._map.clear();\n      this._list.clear();\n      return this;\n    }\n    return emptyOrderedMap();\n  };\n\n  OrderedMap.prototype.set = function set (k, v) {\n    return updateOrderedMap(this, k, v);\n  };\n\n  OrderedMap.prototype.remove = function remove (k) {\n    return updateOrderedMap(this, k, NOT_SET);\n  };\n\n  OrderedMap.prototype.wasAltered = function wasAltered () {\n    return this._map.wasAltered() || this._list.wasAltered();\n  };\n\n  OrderedMap.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._list.__iterate(\n      function (entry) { return entry && fn(entry[1], entry[0], this$1); },\n      reverse\n    );\n  };\n\n  OrderedMap.prototype.__iterator = function __iterator (type, reverse) {\n    return this._list.fromEntrySeq().__iterator(type, reverse);\n  };\n\n  OrderedMap.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    var newMap = this._map.__ensureOwner(ownerID);\n    var newList = this._list.__ensureOwner(ownerID);\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyOrderedMap();\n      }\n      this.__ownerID = ownerID;\n      this._map = newMap;\n      this._list = newList;\n      return this;\n    }\n    return makeOrderedMap(newMap, newList, ownerID, this.__hash);\n  };\n\n  return OrderedMap;\n}(Map));\n\nfunction isOrderedMap(maybeOrderedMap) {\n  return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap);\n}\n\nOrderedMap.isOrderedMap = isOrderedMap;\n\nOrderedMap.prototype[IS_ORDERED_SENTINEL] = true;\nOrderedMap.prototype[DELETE] = OrderedMap.prototype.remove;\n\nfunction makeOrderedMap(map, list, ownerID, hash) {\n  var omap = Object.create(OrderedMap.prototype);\n  omap.size = map ? map.size : 0;\n  omap._map = map;\n  omap._list = list;\n  omap.__ownerID = ownerID;\n  omap.__hash = hash;\n  return omap;\n}\n\nvar EMPTY_ORDERED_MAP;\nfunction emptyOrderedMap() {\n  return (\n    EMPTY_ORDERED_MAP ||\n    (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList()))\n  );\n}\n\nfunction updateOrderedMap(omap, k, v) {\n  var map = omap._map;\n  var list = omap._list;\n  var i = map.get(k);\n  var has = i !== undefined;\n  var newMap;\n  var newList;\n  if (v === NOT_SET) {\n    // removed\n    if (!has) {\n      return omap;\n    }\n    if (list.size >= SIZE && list.size >= map.size * 2) {\n      newList = list.filter(function (entry, idx) { return entry !== undefined && i !== idx; });\n      newMap = newList\n        .toKeyedSeq()\n        .map(function (entry) { return entry[0]; })\n        .flip()\n        .toMap();\n      if (omap.__ownerID) {\n        newMap.__ownerID = newList.__ownerID = omap.__ownerID;\n      }\n    } else {\n      newMap = map.remove(k);\n      newList = i === list.size - 1 ? list.pop() : list.set(i, undefined);\n    }\n  } else if (has) {\n    if (v === list.get(i)[1]) {\n      return omap;\n    }\n    newMap = map;\n    newList = list.set(i, [k, v]);\n  } else {\n    newMap = map.set(k, list.size);\n    newList = list.set(list.size, [k, v]);\n  }\n  if (omap.__ownerID) {\n    omap.size = newMap.size;\n    omap._map = newMap;\n    omap._list = newList;\n    omap.__hash = undefined;\n    return omap;\n  }\n  return makeOrderedMap(newMap, newList);\n}\n\nvar Stack = (function (IndexedCollection$$1) {\n  function Stack(value) {\n    return value === null || value === undefined\n      ? emptyStack()\n      : isStack(value) ? value : emptyStack().pushAll(value);\n  }\n\n  if ( IndexedCollection$$1 ) Stack.__proto__ = IndexedCollection$$1;\n  Stack.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n  Stack.prototype.constructor = Stack;\n\n  Stack.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  Stack.prototype.toString = function toString () {\n    return this.__toString('Stack [', ']');\n  };\n\n  // @pragma Access\n\n  Stack.prototype.get = function get (index, notSetValue) {\n    var head = this._head;\n    index = wrapIndex(this, index);\n    while (head && index--) {\n      head = head.next;\n    }\n    return head ? head.value : notSetValue;\n  };\n\n  Stack.prototype.peek = function peek () {\n    return this._head && this._head.value;\n  };\n\n  // @pragma Modification\n\n  Stack.prototype.push = function push (/*...values*/) {\n    var arguments$1 = arguments;\n\n    if (arguments.length === 0) {\n      return this;\n    }\n    var newSize = this.size + arguments.length;\n    var head = this._head;\n    for (var ii = arguments.length - 1; ii >= 0; ii--) {\n      head = {\n        value: arguments$1[ii],\n        next: head\n      };\n    }\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  Stack.prototype.pushAll = function pushAll (iter) {\n    iter = IndexedCollection$$1(iter);\n    if (iter.size === 0) {\n      return this;\n    }\n    if (this.size === 0 && isStack(iter)) {\n      return iter;\n    }\n    assertNotInfinite(iter.size);\n    var newSize = this.size;\n    var head = this._head;\n    iter.__iterate(function (value) {\n      newSize++;\n      head = {\n        value: value,\n        next: head\n      };\n    }, /* reverse */ true);\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  Stack.prototype.pop = function pop () {\n    return this.slice(1);\n  };\n\n  Stack.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._head = undefined;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyStack();\n  };\n\n  Stack.prototype.slice = function slice (begin, end) {\n    if (wholeSlice(begin, end, this.size)) {\n      return this;\n    }\n    var resolvedBegin = resolveBegin(begin, this.size);\n    var resolvedEnd = resolveEnd(end, this.size);\n    if (resolvedEnd !== this.size) {\n      // super.slice(begin, end);\n      return IndexedCollection$$1.prototype.slice.call(this, begin, end);\n    }\n    var newSize = this.size - resolvedBegin;\n    var head = this._head;\n    while (resolvedBegin--) {\n      head = head.next;\n    }\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  // @pragma Mutability\n\n  Stack.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyStack();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeStack(this.size, this._head, ownerID, this.__hash);\n  };\n\n  // @pragma Iteration\n\n  Stack.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return new ArraySeq(this.toArray()).__iterate(\n        function (v, k) { return fn(v, k, this$1); },\n        reverse\n      );\n    }\n    var iterations = 0;\n    var node = this._head;\n    while (node) {\n      if (fn(node.value, iterations++, this$1) === false) {\n        break;\n      }\n      node = node.next;\n    }\n    return iterations;\n  };\n\n  Stack.prototype.__iterator = function __iterator (type, reverse) {\n    if (reverse) {\n      return new ArraySeq(this.toArray()).__iterator(type, reverse);\n    }\n    var iterations = 0;\n    var node = this._head;\n    return new Iterator(function () {\n      if (node) {\n        var value = node.value;\n        node = node.next;\n        return iteratorValue(type, iterations++, value);\n      }\n      return iteratorDone();\n    });\n  };\n\n  return Stack;\n}(IndexedCollection));\n\nfunction isStack(maybeStack) {\n  return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]);\n}\n\nStack.isStack = isStack;\n\nvar IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';\n\nvar StackPrototype = Stack.prototype;\nStackPrototype[IS_STACK_SENTINEL] = true;\nStackPrototype.shift = StackPrototype.pop;\nStackPrototype.unshift = StackPrototype.push;\nStackPrototype.unshiftAll = StackPrototype.pushAll;\nStackPrototype.withMutations = withMutations;\nStackPrototype.wasAltered = wasAltered;\nStackPrototype.asImmutable = asImmutable;\nStackPrototype['@@transducer/init'] = StackPrototype.asMutable = asMutable;\nStackPrototype['@@transducer/step'] = function(result, arr) {\n  return result.unshift(arr);\n};\nStackPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nfunction makeStack(size, head, ownerID, hash) {\n  var map = Object.create(StackPrototype);\n  map.size = size;\n  map._head = head;\n  map.__ownerID = ownerID;\n  map.__hash = hash;\n  map.__altered = false;\n  return map;\n}\n\nvar EMPTY_STACK;\nfunction emptyStack() {\n  return EMPTY_STACK || (EMPTY_STACK = makeStack(0));\n}\n\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (\n    !isCollection(b) ||\n    (a.size !== undefined && b.size !== undefined && a.size !== b.size) ||\n    (a.__hash !== undefined &&\n      b.__hash !== undefined &&\n      a.__hash !== b.__hash) ||\n    isKeyed(a) !== isKeyed(b) ||\n    isIndexed(a) !== isIndexed(b) ||\n    isOrdered(a) !== isOrdered(b)\n  ) {\n    return false;\n  }\n\n  if (a.size === 0 && b.size === 0) {\n    return true;\n  }\n\n  var notAssociative = !isAssociative(a);\n\n  if (isOrdered(a)) {\n    var entries = a.entries();\n    return (\n      b.every(function (v, k) {\n        var entry = entries.next().value;\n        return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));\n      }) && entries.next().done\n    );\n  }\n\n  var flipped = false;\n\n  if (a.size === undefined) {\n    if (b.size === undefined) {\n      if (typeof a.cacheResult === 'function') {\n        a.cacheResult();\n      }\n    } else {\n      flipped = true;\n      var _ = a;\n      a = b;\n      b = _;\n    }\n  }\n\n  var allEqual = true;\n  var bSize = b.__iterate(function (v, k) {\n    if (\n      notAssociative\n        ? !a.has(v)\n        : flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)\n    ) {\n      allEqual = false;\n      return false;\n    }\n  });\n\n  return allEqual && a.size === bSize;\n}\n\n/**\n * Contributes additional methods to a constructor\n */\nfunction mixin(ctor, methods) {\n  var keyCopier = function (key) {\n    ctor.prototype[key] = methods[key];\n  };\n  Object.keys(methods).forEach(keyCopier);\n  Object.getOwnPropertySymbols &&\n    Object.getOwnPropertySymbols(methods).forEach(keyCopier);\n  return ctor;\n}\n\nfunction toJS(value) {\n  return isDataStructure(value)\n    ? Seq(value)\n        .map(toJS)\n        .toJSON()\n    : value;\n}\n\nvar Set = (function (SetCollection$$1) {\n  function Set(value) {\n    return value === null || value === undefined\n      ? emptySet()\n      : isSet(value) && !isOrdered(value)\n        ? value\n        : emptySet().withMutations(function (set) {\n            var iter = SetCollection$$1(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v) { return set.add(v); });\n          });\n  }\n\n  if ( SetCollection$$1 ) Set.__proto__ = SetCollection$$1;\n  Set.prototype = Object.create( SetCollection$$1 && SetCollection$$1.prototype );\n  Set.prototype.constructor = Set;\n\n  Set.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  Set.fromKeys = function fromKeys (value) {\n    return this(KeyedCollection(value).keySeq());\n  };\n\n  Set.intersect = function intersect (sets) {\n    sets = Collection(sets).toArray();\n    return sets.length\n      ? SetPrototype.intersect.apply(Set(sets.pop()), sets)\n      : emptySet();\n  };\n\n  Set.union = function union (sets) {\n    sets = Collection(sets).toArray();\n    return sets.length\n      ? SetPrototype.union.apply(Set(sets.pop()), sets)\n      : emptySet();\n  };\n\n  Set.prototype.toString = function toString () {\n    return this.__toString('Set {', '}');\n  };\n\n  // @pragma Access\n\n  Set.prototype.has = function has (value) {\n    return this._map.has(value);\n  };\n\n  // @pragma Modification\n\n  Set.prototype.add = function add (value) {\n    return updateSet(this, this._map.set(value, value));\n  };\n\n  Set.prototype.remove = function remove (value) {\n    return updateSet(this, this._map.remove(value));\n  };\n\n  Set.prototype.clear = function clear () {\n    return updateSet(this, this._map.clear());\n  };\n\n  // @pragma Composition\n\n  Set.prototype.union = function union () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    iters = iters.filter(function (x) { return x.size !== 0; });\n    if (iters.length === 0) {\n      return this;\n    }\n    if (this.size === 0 && !this.__ownerID && iters.length === 1) {\n      return this.constructor(iters[0]);\n    }\n    return this.withMutations(function (set) {\n      for (var ii = 0; ii < iters.length; ii++) {\n        SetCollection$$1(iters[ii]).forEach(function (value) { return set.add(value); });\n      }\n    });\n  };\n\n  Set.prototype.intersect = function intersect () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    if (iters.length === 0) {\n      return this;\n    }\n    iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n    var toRemove = [];\n    this.forEach(function (value) {\n      if (!iters.every(function (iter) { return iter.includes(value); })) {\n        toRemove.push(value);\n      }\n    });\n    return this.withMutations(function (set) {\n      toRemove.forEach(function (value) {\n        set.remove(value);\n      });\n    });\n  };\n\n  Set.prototype.subtract = function subtract () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    if (iters.length === 0) {\n      return this;\n    }\n    iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n    var toRemove = [];\n    this.forEach(function (value) {\n      if (iters.some(function (iter) { return iter.includes(value); })) {\n        toRemove.push(value);\n      }\n    });\n    return this.withMutations(function (set) {\n      toRemove.forEach(function (value) {\n        set.remove(value);\n      });\n    });\n  };\n\n  Set.prototype.sort = function sort (comparator) {\n    // Late binding\n    return OrderedSet(sortFactory(this, comparator));\n  };\n\n  Set.prototype.sortBy = function sortBy (mapper, comparator) {\n    // Late binding\n    return OrderedSet(sortFactory(this, comparator, mapper));\n  };\n\n  Set.prototype.wasAltered = function wasAltered () {\n    return this._map.wasAltered();\n  };\n\n  Set.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._map.__iterate(function (k) { return fn(k, k, this$1); }, reverse);\n  };\n\n  Set.prototype.__iterator = function __iterator (type, reverse) {\n    return this._map.__iterator(type, reverse);\n  };\n\n  Set.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    var newMap = this._map.__ensureOwner(ownerID);\n    if (!ownerID) {\n      if (this.size === 0) {\n        return this.__empty();\n      }\n      this.__ownerID = ownerID;\n      this._map = newMap;\n      return this;\n    }\n    return this.__make(newMap, ownerID);\n  };\n\n  return Set;\n}(SetCollection));\n\nfunction isSet(maybeSet) {\n  return !!(maybeSet && maybeSet[IS_SET_SENTINEL]);\n}\n\nSet.isSet = isSet;\n\nvar IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';\n\nvar SetPrototype = Set.prototype;\nSetPrototype[IS_SET_SENTINEL] = true;\nSetPrototype[DELETE] = SetPrototype.remove;\nSetPrototype.merge = SetPrototype.concat = SetPrototype.union;\nSetPrototype.withMutations = withMutations;\nSetPrototype.asImmutable = asImmutable;\nSetPrototype['@@transducer/init'] = SetPrototype.asMutable = asMutable;\nSetPrototype['@@transducer/step'] = function(result, arr) {\n  return result.add(arr);\n};\nSetPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nSetPrototype.__empty = emptySet;\nSetPrototype.__make = makeSet;\n\nfunction updateSet(set, newMap) {\n  if (set.__ownerID) {\n    set.size = newMap.size;\n    set._map = newMap;\n    return set;\n  }\n  return newMap === set._map\n    ? set\n    : newMap.size === 0 ? set.__empty() : set.__make(newMap);\n}\n\nfunction makeSet(map, ownerID) {\n  var set = Object.create(SetPrototype);\n  set.size = map ? map.size : 0;\n  set._map = map;\n  set.__ownerID = ownerID;\n  return set;\n}\n\nvar EMPTY_SET;\nfunction emptySet() {\n  return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap()));\n}\n\n/**\n * Returns a lazy seq of nums from start (inclusive) to end\n * (exclusive), by step, where start defaults to 0, step to 1, and end to\n * infinity. When start is equal to end, returns empty list.\n */\nvar Range = (function (IndexedSeq$$1) {\n  function Range(start, end, step) {\n    if (!(this instanceof Range)) {\n      return new Range(start, end, step);\n    }\n    invariant(step !== 0, 'Cannot step a Range by 0');\n    start = start || 0;\n    if (end === undefined) {\n      end = Infinity;\n    }\n    step = step === undefined ? 1 : Math.abs(step);\n    if (end < start) {\n      step = -step;\n    }\n    this._start = start;\n    this._end = end;\n    this._step = step;\n    this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);\n    if (this.size === 0) {\n      if (EMPTY_RANGE) {\n        return EMPTY_RANGE;\n      }\n      EMPTY_RANGE = this;\n    }\n  }\n\n  if ( IndexedSeq$$1 ) Range.__proto__ = IndexedSeq$$1;\n  Range.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  Range.prototype.constructor = Range;\n\n  Range.prototype.toString = function toString () {\n    if (this.size === 0) {\n      return 'Range []';\n    }\n    return (\n      'Range [ ' +\n      this._start +\n      '...' +\n      this._end +\n      (this._step !== 1 ? ' by ' + this._step : '') +\n      ' ]'\n    );\n  };\n\n  Range.prototype.get = function get (index, notSetValue) {\n    return this.has(index)\n      ? this._start + wrapIndex(this, index) * this._step\n      : notSetValue;\n  };\n\n  Range.prototype.includes = function includes (searchValue) {\n    var possibleIndex = (searchValue - this._start) / this._step;\n    return (\n      possibleIndex >= 0 &&\n      possibleIndex < this.size &&\n      possibleIndex === Math.floor(possibleIndex)\n    );\n  };\n\n  Range.prototype.slice = function slice (begin, end) {\n    if (wholeSlice(begin, end, this.size)) {\n      return this;\n    }\n    begin = resolveBegin(begin, this.size);\n    end = resolveEnd(end, this.size);\n    if (end <= begin) {\n      return new Range(0, 0);\n    }\n    return new Range(\n      this.get(begin, this._end),\n      this.get(end, this._end),\n      this._step\n    );\n  };\n\n  Range.prototype.indexOf = function indexOf (searchValue) {\n    var offsetValue = searchValue - this._start;\n    if (offsetValue % this._step === 0) {\n      var index = offsetValue / this._step;\n      if (index >= 0 && index < this.size) {\n        return index;\n      }\n    }\n    return -1;\n  };\n\n  Range.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n    return this.indexOf(searchValue);\n  };\n\n  Range.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var step = this._step;\n    var value = reverse ? this._start + (size - 1) * step : this._start;\n    var i = 0;\n    while (i !== size) {\n      if (fn(value, reverse ? size - ++i : i++, this$1) === false) {\n        break;\n      }\n      value += reverse ? -step : step;\n    }\n    return i;\n  };\n\n  Range.prototype.__iterator = function __iterator (type, reverse) {\n    var size = this.size;\n    var step = this._step;\n    var value = reverse ? this._start + (size - 1) * step : this._start;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var v = value;\n      value += reverse ? -step : step;\n      return iteratorValue(type, reverse ? size - ++i : i++, v);\n    });\n  };\n\n  Range.prototype.equals = function equals (other) {\n    return other instanceof Range\n      ? this._start === other._start &&\n          this._end === other._end &&\n          this._step === other._step\n      : deepEqual(this, other);\n  };\n\n  return Range;\n}(IndexedSeq));\n\nvar EMPTY_RANGE;\n\nfunction getIn$1(collection, searchKeyPath, notSetValue) {\n  var keyPath = coerceKeyPath(searchKeyPath);\n  var i = 0;\n  while (i !== keyPath.length) {\n    collection = get(collection, keyPath[i++], NOT_SET);\n    if (collection === NOT_SET) {\n      return notSetValue;\n    }\n  }\n  return collection;\n}\n\nfunction getIn$$1(searchKeyPath, notSetValue) {\n  return getIn$1(this, searchKeyPath, notSetValue);\n}\n\nfunction hasIn$1(collection, keyPath) {\n  return getIn$1(collection, keyPath, NOT_SET) !== NOT_SET;\n}\n\nfunction hasIn$$1(searchKeyPath) {\n  return hasIn$1(this, searchKeyPath);\n}\n\nfunction toObject() {\n  assertNotInfinite(this.size);\n  var object = {};\n  this.__iterate(function (v, k) {\n    object[k] = v;\n  });\n  return object;\n}\n\n// Note: all of these methods are deprecated.\nCollection.isIterable = isCollection;\nCollection.isKeyed = isKeyed;\nCollection.isIndexed = isIndexed;\nCollection.isAssociative = isAssociative;\nCollection.isOrdered = isOrdered;\n\nCollection.Iterator = Iterator;\n\nmixin(Collection, {\n  // ### Conversion to other types\n\n  toArray: function toArray() {\n    assertNotInfinite(this.size);\n    var array = new Array(this.size || 0);\n    var useTuples = isKeyed(this);\n    var i = 0;\n    this.__iterate(function (v, k) {\n      // Keyed collections produce an array of tuples.\n      array[i++] = useTuples ? [k, v] : v;\n    });\n    return array;\n  },\n\n  toIndexedSeq: function toIndexedSeq() {\n    return new ToIndexedSequence(this);\n  },\n\n  toJS: function toJS$1() {\n    return toJS(this);\n  },\n\n  toKeyedSeq: function toKeyedSeq() {\n    return new ToKeyedSequence(this, true);\n  },\n\n  toMap: function toMap() {\n    // Use Late Binding here to solve the circular dependency.\n    return Map(this.toKeyedSeq());\n  },\n\n  toObject: toObject,\n\n  toOrderedMap: function toOrderedMap() {\n    // Use Late Binding here to solve the circular dependency.\n    return OrderedMap(this.toKeyedSeq());\n  },\n\n  toOrderedSet: function toOrderedSet() {\n    // Use Late Binding here to solve the circular dependency.\n    return OrderedSet(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toSet: function toSet() {\n    // Use Late Binding here to solve the circular dependency.\n    return Set(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toSetSeq: function toSetSeq() {\n    return new ToSetSequence(this);\n  },\n\n  toSeq: function toSeq() {\n    return isIndexed(this)\n      ? this.toIndexedSeq()\n      : isKeyed(this) ? this.toKeyedSeq() : this.toSetSeq();\n  },\n\n  toStack: function toStack() {\n    // Use Late Binding here to solve the circular dependency.\n    return Stack(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toList: function toList() {\n    // Use Late Binding here to solve the circular dependency.\n    return List(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  // ### Common JavaScript methods and properties\n\n  toString: function toString() {\n    return '[Collection]';\n  },\n\n  __toString: function __toString(head, tail) {\n    if (this.size === 0) {\n      return head + tail;\n    }\n    return (\n      head +\n      ' ' +\n      this.toSeq()\n        .map(this.__toStringMapper)\n        .join(', ') +\n      ' ' +\n      tail\n    );\n  },\n\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  concat: function concat() {\n    var values = [], len = arguments.length;\n    while ( len-- ) values[ len ] = arguments[ len ];\n\n    return reify(this, concatFactory(this, values));\n  },\n\n  includes: function includes(searchValue) {\n    return this.some(function (value) { return is(value, searchValue); });\n  },\n\n  entries: function entries() {\n    return this.__iterator(ITERATE_ENTRIES);\n  },\n\n  every: function every(predicate, context) {\n    assertNotInfinite(this.size);\n    var returnValue = true;\n    this.__iterate(function (v, k, c) {\n      if (!predicate.call(context, v, k, c)) {\n        returnValue = false;\n        return false;\n      }\n    });\n    return returnValue;\n  },\n\n  filter: function filter(predicate, context) {\n    return reify(this, filterFactory(this, predicate, context, true));\n  },\n\n  find: function find(predicate, context, notSetValue) {\n    var entry = this.findEntry(predicate, context);\n    return entry ? entry[1] : notSetValue;\n  },\n\n  forEach: function forEach(sideEffect, context) {\n    assertNotInfinite(this.size);\n    return this.__iterate(context ? sideEffect.bind(context) : sideEffect);\n  },\n\n  join: function join(separator) {\n    assertNotInfinite(this.size);\n    separator = separator !== undefined ? '' + separator : ',';\n    var joined = '';\n    var isFirst = true;\n    this.__iterate(function (v) {\n      isFirst ? (isFirst = false) : (joined += separator);\n      joined += v !== null && v !== undefined ? v.toString() : '';\n    });\n    return joined;\n  },\n\n  keys: function keys() {\n    return this.__iterator(ITERATE_KEYS);\n  },\n\n  map: function map(mapper, context) {\n    return reify(this, mapFactory(this, mapper, context));\n  },\n\n  reduce: function reduce$1(reducer, initialReduction, context) {\n    return reduce(\n      this,\n      reducer,\n      initialReduction,\n      context,\n      arguments.length < 2,\n      false\n    );\n  },\n\n  reduceRight: function reduceRight(reducer, initialReduction, context) {\n    return reduce(\n      this,\n      reducer,\n      initialReduction,\n      context,\n      arguments.length < 2,\n      true\n    );\n  },\n\n  reverse: function reverse() {\n    return reify(this, reverseFactory(this, true));\n  },\n\n  slice: function slice(begin, end) {\n    return reify(this, sliceFactory(this, begin, end, true));\n  },\n\n  some: function some(predicate, context) {\n    return !this.every(not(predicate), context);\n  },\n\n  sort: function sort(comparator) {\n    return reify(this, sortFactory(this, comparator));\n  },\n\n  values: function values() {\n    return this.__iterator(ITERATE_VALUES);\n  },\n\n  // ### More sequential methods\n\n  butLast: function butLast() {\n    return this.slice(0, -1);\n  },\n\n  isEmpty: function isEmpty() {\n    return this.size !== undefined ? this.size === 0 : !this.some(function () { return true; });\n  },\n\n  count: function count(predicate, context) {\n    return ensureSize(\n      predicate ? this.toSeq().filter(predicate, context) : this\n    );\n  },\n\n  countBy: function countBy(grouper, context) {\n    return countByFactory(this, grouper, context);\n  },\n\n  equals: function equals(other) {\n    return deepEqual(this, other);\n  },\n\n  entrySeq: function entrySeq() {\n    var collection = this;\n    if (collection._cache) {\n      // We cache as an entries array, so we can just return the cache!\n      return new ArraySeq(collection._cache);\n    }\n    var entriesSequence = collection\n      .toSeq()\n      .map(entryMapper)\n      .toIndexedSeq();\n    entriesSequence.fromEntrySeq = function () { return collection.toSeq(); };\n    return entriesSequence;\n  },\n\n  filterNot: function filterNot(predicate, context) {\n    return this.filter(not(predicate), context);\n  },\n\n  findEntry: function findEntry(predicate, context, notSetValue) {\n    var found = notSetValue;\n    this.__iterate(function (v, k, c) {\n      if (predicate.call(context, v, k, c)) {\n        found = [k, v];\n        return false;\n      }\n    });\n    return found;\n  },\n\n  findKey: function findKey(predicate, context) {\n    var entry = this.findEntry(predicate, context);\n    return entry && entry[0];\n  },\n\n  findLast: function findLast(predicate, context, notSetValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .find(predicate, context, notSetValue);\n  },\n\n  findLastEntry: function findLastEntry(predicate, context, notSetValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .findEntry(predicate, context, notSetValue);\n  },\n\n  findLastKey: function findLastKey(predicate, context) {\n    return this.toKeyedSeq()\n      .reverse()\n      .findKey(predicate, context);\n  },\n\n  first: function first() {\n    return this.find(returnTrue);\n  },\n\n  flatMap: function flatMap(mapper, context) {\n    return reify(this, flatMapFactory(this, mapper, context));\n  },\n\n  flatten: function flatten(depth) {\n    return reify(this, flattenFactory(this, depth, true));\n  },\n\n  fromEntrySeq: function fromEntrySeq() {\n    return new FromEntriesSequence(this);\n  },\n\n  get: function get(searchKey, notSetValue) {\n    return this.find(function (_, key) { return is(key, searchKey); }, undefined, notSetValue);\n  },\n\n  getIn: getIn$$1,\n\n  groupBy: function groupBy(grouper, context) {\n    return groupByFactory(this, grouper, context);\n  },\n\n  has: function has(searchKey) {\n    return this.get(searchKey, NOT_SET) !== NOT_SET;\n  },\n\n  hasIn: hasIn$$1,\n\n  isSubset: function isSubset(iter) {\n    iter = typeof iter.includes === 'function' ? iter : Collection(iter);\n    return this.every(function (value) { return iter.includes(value); });\n  },\n\n  isSuperset: function isSuperset(iter) {\n    iter = typeof iter.isSubset === 'function' ? iter : Collection(iter);\n    return iter.isSubset(this);\n  },\n\n  keyOf: function keyOf(searchValue) {\n    return this.findKey(function (value) { return is(value, searchValue); });\n  },\n\n  keySeq: function keySeq() {\n    return this.toSeq()\n      .map(keyMapper)\n      .toIndexedSeq();\n  },\n\n  last: function last() {\n    return this.toSeq()\n      .reverse()\n      .first();\n  },\n\n  lastKeyOf: function lastKeyOf(searchValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .keyOf(searchValue);\n  },\n\n  max: function max(comparator) {\n    return maxFactory(this, comparator);\n  },\n\n  maxBy: function maxBy(mapper, comparator) {\n    return maxFactory(this, comparator, mapper);\n  },\n\n  min: function min(comparator) {\n    return maxFactory(\n      this,\n      comparator ? neg(comparator) : defaultNegComparator\n    );\n  },\n\n  minBy: function minBy(mapper, comparator) {\n    return maxFactory(\n      this,\n      comparator ? neg(comparator) : defaultNegComparator,\n      mapper\n    );\n  },\n\n  rest: function rest() {\n    return this.slice(1);\n  },\n\n  skip: function skip(amount) {\n    return amount === 0 ? this : this.slice(Math.max(0, amount));\n  },\n\n  skipLast: function skipLast(amount) {\n    return amount === 0 ? this : this.slice(0, -Math.max(0, amount));\n  },\n\n  skipWhile: function skipWhile(predicate, context) {\n    return reify(this, skipWhileFactory(this, predicate, context, true));\n  },\n\n  skipUntil: function skipUntil(predicate, context) {\n    return this.skipWhile(not(predicate), context);\n  },\n\n  sortBy: function sortBy(mapper, comparator) {\n    return reify(this, sortFactory(this, comparator, mapper));\n  },\n\n  take: function take(amount) {\n    return this.slice(0, Math.max(0, amount));\n  },\n\n  takeLast: function takeLast(amount) {\n    return this.slice(-Math.max(0, amount));\n  },\n\n  takeWhile: function takeWhile(predicate, context) {\n    return reify(this, takeWhileFactory(this, predicate, context));\n  },\n\n  takeUntil: function takeUntil(predicate, context) {\n    return this.takeWhile(not(predicate), context);\n  },\n\n  update: function update(fn) {\n    return fn(this);\n  },\n\n  valueSeq: function valueSeq() {\n    return this.toIndexedSeq();\n  },\n\n  // ### Hashable Object\n\n  hashCode: function hashCode() {\n    return this.__hash || (this.__hash = hashCollection(this));\n  }\n\n  // ### Internal\n\n  // abstract __iterate(fn, reverse)\n\n  // abstract __iterator(type, reverse)\n});\n\nvar CollectionPrototype = Collection.prototype;\nCollectionPrototype[IS_ITERABLE_SENTINEL] = true;\nCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.values;\nCollectionPrototype.toJSON = CollectionPrototype.toArray;\nCollectionPrototype.__toStringMapper = quoteString;\nCollectionPrototype.inspect = CollectionPrototype.toSource = function() {\n  return this.toString();\n};\nCollectionPrototype.chain = CollectionPrototype.flatMap;\nCollectionPrototype.contains = CollectionPrototype.includes;\n\nmixin(KeyedCollection, {\n  // ### More sequential methods\n\n  flip: function flip() {\n    return reify(this, flipFactory(this));\n  },\n\n  mapEntries: function mapEntries(mapper, context) {\n    var this$1 = this;\n\n    var iterations = 0;\n    return reify(\n      this,\n      this.toSeq()\n        .map(function (v, k) { return mapper.call(context, [k, v], iterations++, this$1); })\n        .fromEntrySeq()\n    );\n  },\n\n  mapKeys: function mapKeys(mapper, context) {\n    var this$1 = this;\n\n    return reify(\n      this,\n      this.toSeq()\n        .flip()\n        .map(function (k, v) { return mapper.call(context, k, v, this$1); })\n        .flip()\n    );\n  }\n});\n\nvar KeyedCollectionPrototype = KeyedCollection.prototype;\nKeyedCollectionPrototype[IS_KEYED_SENTINEL] = true;\nKeyedCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.entries;\nKeyedCollectionPrototype.toJSON = toObject;\nKeyedCollectionPrototype.__toStringMapper = function (v, k) { return quoteString(k) + ': ' + quoteString(v); };\n\nmixin(IndexedCollection, {\n  // ### Conversion to other types\n\n  toKeyedSeq: function toKeyedSeq() {\n    return new ToKeyedSequence(this, false);\n  },\n\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  filter: function filter(predicate, context) {\n    return reify(this, filterFactory(this, predicate, context, false));\n  },\n\n  findIndex: function findIndex(predicate, context) {\n    var entry = this.findEntry(predicate, context);\n    return entry ? entry[0] : -1;\n  },\n\n  indexOf: function indexOf(searchValue) {\n    var key = this.keyOf(searchValue);\n    return key === undefined ? -1 : key;\n  },\n\n  lastIndexOf: function lastIndexOf(searchValue) {\n    var key = this.lastKeyOf(searchValue);\n    return key === undefined ? -1 : key;\n  },\n\n  reverse: function reverse() {\n    return reify(this, reverseFactory(this, false));\n  },\n\n  slice: function slice(begin, end) {\n    return reify(this, sliceFactory(this, begin, end, false));\n  },\n\n  splice: function splice(index, removeNum /*, ...values*/) {\n    var numArgs = arguments.length;\n    removeNum = Math.max(removeNum || 0, 0);\n    if (numArgs === 0 || (numArgs === 2 && !removeNum)) {\n      return this;\n    }\n    // If index is negative, it should resolve relative to the size of the\n    // collection. However size may be expensive to compute if not cached, so\n    // only call count() if the number is in fact negative.\n    index = resolveBegin(index, index < 0 ? this.count() : this.size);\n    var spliced = this.slice(0, index);\n    return reify(\n      this,\n      numArgs === 1\n        ? spliced\n        : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum))\n    );\n  },\n\n  // ### More collection methods\n\n  findLastIndex: function findLastIndex(predicate, context) {\n    var entry = this.findLastEntry(predicate, context);\n    return entry ? entry[0] : -1;\n  },\n\n  first: function first() {\n    return this.get(0);\n  },\n\n  flatten: function flatten(depth) {\n    return reify(this, flattenFactory(this, depth, false));\n  },\n\n  get: function get(index, notSetValue) {\n    index = wrapIndex(this, index);\n    return index < 0 ||\n      (this.size === Infinity || (this.size !== undefined && index > this.size))\n      ? notSetValue\n      : this.find(function (_, key) { return key === index; }, undefined, notSetValue);\n  },\n\n  has: function has(index) {\n    index = wrapIndex(this, index);\n    return (\n      index >= 0 &&\n      (this.size !== undefined\n        ? this.size === Infinity || index < this.size\n        : this.indexOf(index) !== -1)\n    );\n  },\n\n  interpose: function interpose(separator) {\n    return reify(this, interposeFactory(this, separator));\n  },\n\n  interleave: function interleave(/*...collections*/) {\n    var collections = [this].concat(arrCopy(arguments));\n    var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, collections);\n    var interleaved = zipped.flatten(true);\n    if (zipped.size) {\n      interleaved.size = zipped.size * collections.length;\n    }\n    return reify(this, interleaved);\n  },\n\n  keySeq: function keySeq() {\n    return Range(0, this.size);\n  },\n\n  last: function last() {\n    return this.get(-1);\n  },\n\n  skipWhile: function skipWhile(predicate, context) {\n    return reify(this, skipWhileFactory(this, predicate, context, false));\n  },\n\n  zip: function zip(/*, ...collections */) {\n    var collections = [this].concat(arrCopy(arguments));\n    return reify(this, zipWithFactory(this, defaultZipper, collections));\n  },\n\n  zipAll: function zipAll(/*, ...collections */) {\n    var collections = [this].concat(arrCopy(arguments));\n    return reify(this, zipWithFactory(this, defaultZipper, collections, true));\n  },\n\n  zipWith: function zipWith(zipper /*, ...collections */) {\n    var collections = arrCopy(arguments);\n    collections[0] = this;\n    return reify(this, zipWithFactory(this, zipper, collections));\n  }\n});\n\nvar IndexedCollectionPrototype = IndexedCollection.prototype;\nIndexedCollectionPrototype[IS_INDEXED_SENTINEL] = true;\nIndexedCollectionPrototype[IS_ORDERED_SENTINEL] = true;\n\nmixin(SetCollection, {\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  get: function get(value, notSetValue) {\n    return this.has(value) ? value : notSetValue;\n  },\n\n  includes: function includes(value) {\n    return this.has(value);\n  },\n\n  // ### More sequential methods\n\n  keySeq: function keySeq() {\n    return this.valueSeq();\n  }\n});\n\nSetCollection.prototype.has = CollectionPrototype.includes;\nSetCollection.prototype.contains = SetCollection.prototype.includes;\n\n// Mixin subclasses\n\nmixin(KeyedSeq, KeyedCollection.prototype);\nmixin(IndexedSeq, IndexedCollection.prototype);\nmixin(SetSeq, SetCollection.prototype);\n\n// #pragma Helper functions\n\nfunction reduce(collection, reducer, reduction, context, useFirst, reverse) {\n  assertNotInfinite(collection.size);\n  collection.__iterate(function (v, k, c) {\n    if (useFirst) {\n      useFirst = false;\n      reduction = v;\n    } else {\n      reduction = reducer.call(context, reduction, v, k, c);\n    }\n  }, reverse);\n  return reduction;\n}\n\nfunction keyMapper(v, k) {\n  return k;\n}\n\nfunction entryMapper(v, k) {\n  return [k, v];\n}\n\nfunction not(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\nfunction neg(predicate) {\n  return function() {\n    return -predicate.apply(this, arguments);\n  };\n}\n\nfunction defaultZipper() {\n  return arrCopy(arguments);\n}\n\nfunction defaultNegComparator(a, b) {\n  return a < b ? 1 : a > b ? -1 : 0;\n}\n\nfunction hashCollection(collection) {\n  if (collection.size === Infinity) {\n    return 0;\n  }\n  var ordered = isOrdered(collection);\n  var keyed = isKeyed(collection);\n  var h = ordered ? 1 : 0;\n  var size = collection.__iterate(\n    keyed\n      ? ordered\n        ? function (v, k) {\n            h = (31 * h + hashMerge(hash(v), hash(k))) | 0;\n          }\n        : function (v, k) {\n            h = (h + hashMerge(hash(v), hash(k))) | 0;\n          }\n      : ordered\n        ? function (v) {\n            h = (31 * h + hash(v)) | 0;\n          }\n        : function (v) {\n            h = (h + hash(v)) | 0;\n          }\n  );\n  return murmurHashOfSize(size, h);\n}\n\nfunction murmurHashOfSize(size, h) {\n  h = imul(h, 0xcc9e2d51);\n  h = imul((h << 15) | (h >>> -15), 0x1b873593);\n  h = imul((h << 13) | (h >>> -13), 5);\n  h = ((h + 0xe6546b64) | 0) ^ size;\n  h = imul(h ^ (h >>> 16), 0x85ebca6b);\n  h = imul(h ^ (h >>> 13), 0xc2b2ae35);\n  h = smi(h ^ (h >>> 16));\n  return h;\n}\n\nfunction hashMerge(a, b) {\n  return (a ^ (b + 0x9e3779b9 + (a << 6) + (a >> 2))) | 0; // int\n}\n\nvar OrderedSet = (function (Set$$1) {\n  function OrderedSet(value) {\n    return value === null || value === undefined\n      ? emptyOrderedSet()\n      : isOrderedSet(value)\n        ? value\n        : emptyOrderedSet().withMutations(function (set) {\n            var iter = SetCollection(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v) { return set.add(v); });\n          });\n  }\n\n  if ( Set$$1 ) OrderedSet.__proto__ = Set$$1;\n  OrderedSet.prototype = Object.create( Set$$1 && Set$$1.prototype );\n  OrderedSet.prototype.constructor = OrderedSet;\n\n  OrderedSet.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  OrderedSet.fromKeys = function fromKeys (value) {\n    return this(KeyedCollection(value).keySeq());\n  };\n\n  OrderedSet.prototype.toString = function toString () {\n    return this.__toString('OrderedSet {', '}');\n  };\n\n  return OrderedSet;\n}(Set));\n\nfunction isOrderedSet(maybeOrderedSet) {\n  return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet);\n}\n\nOrderedSet.isOrderedSet = isOrderedSet;\n\nvar OrderedSetPrototype = OrderedSet.prototype;\nOrderedSetPrototype[IS_ORDERED_SENTINEL] = true;\nOrderedSetPrototype.zip = IndexedCollectionPrototype.zip;\nOrderedSetPrototype.zipWith = IndexedCollectionPrototype.zipWith;\n\nOrderedSetPrototype.__empty = emptyOrderedSet;\nOrderedSetPrototype.__make = makeOrderedSet;\n\nfunction makeOrderedSet(map, ownerID) {\n  var set = Object.create(OrderedSetPrototype);\n  set.size = map ? map.size : 0;\n  set._map = map;\n  set.__ownerID = ownerID;\n  return set;\n}\n\nvar EMPTY_ORDERED_SET;\nfunction emptyOrderedSet() {\n  return (\n    EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap()))\n  );\n}\n\nvar Record = function Record(defaultValues, name) {\n  var hasInitialized;\n\n  var RecordType = function Record(values) {\n    var this$1 = this;\n\n    if (values instanceof RecordType) {\n      return values;\n    }\n    if (!(this instanceof RecordType)) {\n      return new RecordType(values);\n    }\n    if (!hasInitialized) {\n      hasInitialized = true;\n      var keys = Object.keys(defaultValues);\n      var indices = (RecordTypePrototype._indices = {});\n      RecordTypePrototype._name = name;\n      RecordTypePrototype._keys = keys;\n      RecordTypePrototype._defaultValues = defaultValues;\n      for (var i = 0; i < keys.length; i++) {\n        var propName = keys[i];\n        indices[propName] = i;\n        if (RecordTypePrototype[propName]) {\n          /* eslint-disable no-console */\n          typeof console === 'object' &&\n            console.warn &&\n            console.warn(\n              'Cannot define ' +\n                recordName(this$1) +\n                ' with property \"' +\n                propName +\n                '\" since that property name is part of the Record API.'\n            );\n          /* eslint-enable no-console */\n        } else {\n          setProp(RecordTypePrototype, propName);\n        }\n      }\n    }\n    this.__ownerID = undefined;\n    this._values = List().withMutations(function (l) {\n      l.setSize(this$1._keys.length);\n      KeyedCollection(values).forEach(function (v, k) {\n        l.set(this$1._indices[k], v === this$1._defaultValues[k] ? undefined : v);\n      });\n    });\n  };\n\n  var RecordTypePrototype = (RecordType.prototype = Object.create(\n    RecordPrototype\n  ));\n  RecordTypePrototype.constructor = RecordType;\n\n  return RecordType;\n};\n\nRecord.prototype.toString = function toString () {\n    var this$1 = this;\n\n  var str = recordName(this) + ' { ';\n  var keys = this._keys;\n  var k;\n  for (var i = 0, l = keys.length; i !== l; i++) {\n    k = keys[i];\n    str += (i ? ', ' : '') + k + ': ' + quoteString(this$1.get(k));\n  }\n  return str + ' }';\n};\n\nRecord.prototype.equals = function equals (other) {\n  return (\n    this === other ||\n    (other &&\n      this._keys === other._keys &&\n      recordSeq(this).equals(recordSeq(other)))\n  );\n};\n\nRecord.prototype.hashCode = function hashCode () {\n  return recordSeq(this).hashCode();\n};\n\n// @pragma Access\n\nRecord.prototype.has = function has (k) {\n  return this._indices.hasOwnProperty(k);\n};\n\nRecord.prototype.get = function get (k, notSetValue) {\n  if (!this.has(k)) {\n    return notSetValue;\n  }\n  var index = this._indices[k];\n  var value = this._values.get(index);\n  return value === undefined ? this._defaultValues[k] : value;\n};\n\n// @pragma Modification\n\nRecord.prototype.set = function set (k, v) {\n  if (this.has(k)) {\n    var newValues = this._values.set(\n      this._indices[k],\n      v === this._defaultValues[k] ? undefined : v\n    );\n    if (newValues !== this._values && !this.__ownerID) {\n      return makeRecord(this, newValues);\n    }\n  }\n  return this;\n};\n\nRecord.prototype.remove = function remove (k) {\n  return this.set(k);\n};\n\nRecord.prototype.clear = function clear () {\n  var newValues = this._values.clear().setSize(this._keys.length);\n  return this.__ownerID ? this : makeRecord(this, newValues);\n};\n\nRecord.prototype.wasAltered = function wasAltered () {\n  return this._values.wasAltered();\n};\n\nRecord.prototype.toSeq = function toSeq () {\n  return recordSeq(this);\n};\n\nRecord.prototype.toJS = function toJS$1 () {\n  return toJS(this);\n};\n\nRecord.prototype.entries = function entries () {\n  return this.__iterator(ITERATE_ENTRIES);\n};\n\nRecord.prototype.__iterator = function __iterator (type, reverse) {\n  return recordSeq(this).__iterator(type, reverse);\n};\n\nRecord.prototype.__iterate = function __iterate (fn, reverse) {\n  return recordSeq(this).__iterate(fn, reverse);\n};\n\nRecord.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n  if (ownerID === this.__ownerID) {\n    return this;\n  }\n  var newValues = this._values.__ensureOwner(ownerID);\n  if (!ownerID) {\n    this.__ownerID = ownerID;\n    this._values = newValues;\n    return this;\n  }\n  return makeRecord(this, newValues, ownerID);\n};\n\nRecord.isRecord = isRecord;\nRecord.getDescriptiveName = recordName;\nvar RecordPrototype = Record.prototype;\nRecordPrototype[IS_RECORD_SENTINEL] = true;\nRecordPrototype[DELETE] = RecordPrototype.remove;\nRecordPrototype.deleteIn = RecordPrototype.removeIn = deleteIn;\nRecordPrototype.getIn = getIn$$1;\nRecordPrototype.hasIn = CollectionPrototype.hasIn;\nRecordPrototype.merge = merge;\nRecordPrototype.mergeWith = mergeWith;\nRecordPrototype.mergeIn = mergeIn;\nRecordPrototype.mergeDeep = mergeDeep;\nRecordPrototype.mergeDeepWith = mergeDeepWith;\nRecordPrototype.mergeDeepIn = mergeDeepIn;\nRecordPrototype.setIn = setIn$$1;\nRecordPrototype.update = update$$1;\nRecordPrototype.updateIn = updateIn$1;\nRecordPrototype.withMutations = withMutations;\nRecordPrototype.asMutable = asMutable;\nRecordPrototype.asImmutable = asImmutable;\nRecordPrototype[ITERATOR_SYMBOL] = RecordPrototype.entries;\nRecordPrototype.toJSON = RecordPrototype.toObject =\n  CollectionPrototype.toObject;\nRecordPrototype.inspect = RecordPrototype.toSource = function() {\n  return this.toString();\n};\n\nfunction makeRecord(likeRecord, values, ownerID) {\n  var record = Object.create(Object.getPrototypeOf(likeRecord));\n  record._values = values;\n  record.__ownerID = ownerID;\n  return record;\n}\n\nfunction recordName(record) {\n  return record._name || record.constructor.name || 'Record';\n}\n\nfunction recordSeq(record) {\n  return keyedSeqFromValue(record._keys.map(function (k) { return [k, record.get(k)]; }));\n}\n\nfunction setProp(prototype, name) {\n  try {\n    Object.defineProperty(prototype, name, {\n      get: function() {\n        return this.get(name);\n      },\n      set: function(value) {\n        invariant(this.__ownerID, 'Cannot set on an immutable record.');\n        this.set(name, value);\n      }\n    });\n  } catch (error) {\n    // Object.defineProperty failed. Probably IE8.\n  }\n}\n\n/**\n * Returns a lazy Seq of `value` repeated `times` times. When `times` is\n * undefined, returns an infinite sequence of `value`.\n */\nvar Repeat = (function (IndexedSeq$$1) {\n  function Repeat(value, times) {\n    if (!(this instanceof Repeat)) {\n      return new Repeat(value, times);\n    }\n    this._value = value;\n    this.size = times === undefined ? Infinity : Math.max(0, times);\n    if (this.size === 0) {\n      if (EMPTY_REPEAT) {\n        return EMPTY_REPEAT;\n      }\n      EMPTY_REPEAT = this;\n    }\n  }\n\n  if ( IndexedSeq$$1 ) Repeat.__proto__ = IndexedSeq$$1;\n  Repeat.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  Repeat.prototype.constructor = Repeat;\n\n  Repeat.prototype.toString = function toString () {\n    if (this.size === 0) {\n      return 'Repeat []';\n    }\n    return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';\n  };\n\n  Repeat.prototype.get = function get (index, notSetValue) {\n    return this.has(index) ? this._value : notSetValue;\n  };\n\n  Repeat.prototype.includes = function includes (searchValue) {\n    return is(this._value, searchValue);\n  };\n\n  Repeat.prototype.slice = function slice (begin, end) {\n    var size = this.size;\n    return wholeSlice(begin, end, size)\n      ? this\n      : new Repeat(\n          this._value,\n          resolveEnd(end, size) - resolveBegin(begin, size)\n        );\n  };\n\n  Repeat.prototype.reverse = function reverse () {\n    return this;\n  };\n\n  Repeat.prototype.indexOf = function indexOf (searchValue) {\n    if (is(this._value, searchValue)) {\n      return 0;\n    }\n    return -1;\n  };\n\n  Repeat.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n    if (is(this._value, searchValue)) {\n      return this.size;\n    }\n    return -1;\n  };\n\n  Repeat.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var i = 0;\n    while (i !== size) {\n      if (fn(this$1._value, reverse ? size - ++i : i++, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  Repeat.prototype.__iterator = function __iterator (type, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var i = 0;\n    return new Iterator(\n      function () { return i === size\n          ? iteratorDone()\n          : iteratorValue(type, reverse ? size - ++i : i++, this$1._value); }\n    );\n  };\n\n  Repeat.prototype.equals = function equals (other) {\n    return other instanceof Repeat\n      ? is(this._value, other._value)\n      : deepEqual(other);\n  };\n\n  return Repeat;\n}(IndexedSeq));\n\nvar EMPTY_REPEAT;\n\nfunction fromJS(value, converter) {\n  return fromJSWith(\n    [],\n    converter || defaultConverter,\n    value,\n    '',\n    converter && converter.length > 2 ? [] : undefined,\n    { '': value }\n  );\n}\n\nfunction fromJSWith(stack, converter, value, key, keyPath, parentValue) {\n  var toSeq = Array.isArray(value)\n    ? IndexedSeq\n    : isPlainObj(value) ? KeyedSeq : null;\n  if (toSeq) {\n    if (~stack.indexOf(value)) {\n      throw new TypeError('Cannot convert circular structure to Immutable');\n    }\n    stack.push(value);\n    keyPath && key !== '' && keyPath.push(key);\n    var converted = converter.call(\n      parentValue,\n      key,\n      toSeq(value).map(function (v, k) { return fromJSWith(stack, converter, v, k, keyPath, value); }\n      ),\n      keyPath && keyPath.slice()\n    );\n    stack.pop();\n    keyPath && keyPath.pop();\n    return converted;\n  }\n  return value;\n}\n\nfunction defaultConverter(k, v) {\n  return isKeyed(v) ? v.toMap() : v.toList();\n}\n\nvar version = \"4.0.0-rc.9\";\n\n// Functional read/write API\nvar Immutable = {\n  version: version,\n\n  Collection: Collection,\n  // Note: Iterable is deprecated\n  Iterable: Collection,\n\n  Seq: Seq,\n  Map: Map,\n  OrderedMap: OrderedMap,\n  List: List,\n  Stack: Stack,\n  Set: Set,\n  OrderedSet: OrderedSet,\n\n  Record: Record,\n  Range: Range,\n  Repeat: Repeat,\n\n  is: is,\n  fromJS: fromJS,\n  hash: hash,\n\n  isImmutable: isImmutable,\n  isCollection: isCollection,\n  isKeyed: isKeyed,\n  isIndexed: isIndexed,\n  isAssociative: isAssociative,\n  isOrdered: isOrdered,\n  isValueObject: isValueObject,\n\n  get: get,\n  getIn: getIn$1,\n  has: has,\n  hasIn: hasIn$1,\n  merge: merge$1,\n  mergeDeep: mergeDeep$1,\n  mergeWith: mergeWith$1,\n  mergeDeepWith: mergeDeepWith$1,\n  remove: remove,\n  removeIn: removeIn,\n  set: set,\n  setIn: setIn$1,\n  update: update$1,\n  updateIn: updateIn\n};\n\n// Note: Iterable is deprecated\nvar Iterable = Collection;\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Immutable);\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _connect = __webpack_require__(771);\n\nObject.defineProperty(exports, 'Connect', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_connect).default;\n  }\n});\n\nvar _base_store = __webpack_require__(367);\n\nObject.defineProperty(exports, 'BaseStore', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_base_store).default;\n  }\n});\n\nvar _immutable_store = __webpack_require__(772);\n\nObject.defineProperty(exports, 'ImmutableStore', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_immutable_store).default;\n  }\n});\n\nvar _store_listener = __webpack_require__(366);\n\nObject.defineProperty(exports, 'StoreListener', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_store_listener).default;\n  }\n});\n\nvar _dispatcher = __webpack_require__(369);\n\nObject.defineProperty(exports, 'Dispatcher', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_dispatcher).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//     Backbone.js 1.1.2\n\n//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(root, factory) {\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(725), __webpack_require__(9), exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    var _ = require('underscore');\n    factory(root, exports, _);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n\n}(this, function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create local references to array methods we'll want to use later.\n  var array = [];\n  var push = array.push;\n  var slice = array.slice;\n  var splice = array.splice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.1.2';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may bind with `on` or remove with `off` callback\n  // functions to an event; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {\n\n    // Bind an event to a `callback` function. Passing `\"all\"` will bind\n    // the callback to all events fired.\n    on: function(name, callback, context) {\n      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n      this._events || (this._events = {});\n      var events = this._events[name] || (this._events[name] = []);\n      events.push({callback: callback, context: context, ctx: context || this});\n      return this;\n    },\n\n    // Bind an event to only be triggered a single time. After the first time\n    // the callback is invoked, it will be removed.\n    once: function(name, callback, context) {\n      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n      var self = this;\n      var once = _.once(function() {\n        self.off(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n      return this.on(name, once, context);\n    },\n\n    // Remove one or many callbacks. If `context` is null, removes all\n    // callbacks with that function. If `callback` is null, removes all\n    // callbacks for the event. If `name` is null, removes all bound\n    // callbacks for all events.\n    off: function(name, callback, context) {\n      var retain, ev, events, names, i, l, j, k;\n      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n      if (!name && !callback && !context) {\n        this._events = void 0;\n        return this;\n      }\n      names = name ? [name] : _.keys(this._events);\n      for (i = 0, l = names.length; i < l; i++) {\n        name = names[i];\n        if (events = this._events[name]) {\n          this._events[name] = retain = [];\n          if (callback || context) {\n            for (j = 0, k = events.length; j < k; j++) {\n              ev = events[j];\n              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||\n                  (context && context !== ev.context)) {\n                retain.push(ev);\n              }\n            }\n          }\n          if (!retain.length) delete this._events[name];\n        }\n      }\n\n      return this;\n    },\n\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\n    // passed the same arguments as `trigger` is, apart from the event name\n    // (unless you're listening on `\"all\"`, which will cause your callback to\n    // receive the true name of the event as the first argument).\n    trigger: function(name) {\n      if (!this._events) return this;\n      var args = slice.call(arguments, 1);\n      if (!eventsApi(this, 'trigger', name, args)) return this;\n      var events = this._events[name];\n      var allEvents = this._events.all;\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, arguments);\n      return this;\n    },\n\n    // Tell this object to stop listening to either specific events ... or\n    // to every object it's currently listening to.\n    stopListening: function(obj, name, callback) {\n      var listeningTo = this._listeningTo;\n      if (!listeningTo) return this;\n      var remove = !name && !callback;\n      if (!callback && typeof name === 'object') callback = this;\n      if (obj) (listeningTo = {})[obj._listenId] = obj;\n      for (var id in listeningTo) {\n        obj = listeningTo[id];\n        obj.off(name, callback, this);\n        if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];\n      }\n      return this;\n    }\n\n  };\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Implement fancy features of the Events API such as multiple event\n  // names `\"change blur\"` and jQuery-style event maps `{change: action}`\n  // in terms of the existing API.\n  var eventsApi = function(obj, action, name, rest) {\n    if (!name) return true;\n\n    // Handle event maps.\n    if (typeof name === 'object') {\n      for (var key in name) {\n        obj[action].apply(obj, [key, name[key]].concat(rest));\n      }\n      return false;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return false;\n    }\n\n    return true;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};\n\n  // Inversion-of-control versions of `on` and `once`. Tell *this* object to\n  // listen to an event in another object ... keeping track of what it's\n  // listening to.\n  _.each(listenMethods, function(implementation, method) {\n    Events[method] = function(obj, name, callback) {\n      var listeningTo = this._listeningTo || (this._listeningTo = {});\n      var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n      listeningTo[id] = obj;\n      if (!callback && typeof name === 'object') callback = this;\n      obj[implementation](name, callback, this);\n      return this;\n    };\n  });\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId('c');\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      var attr, attrs, unset, changes, silent, changing, prev, current;\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      unset           = options.unset;\n      silent          = options.silent;\n      changes         = [];\n      changing        = this._changing;\n      this._changing  = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n      current = this.attributes, prev = this._previousAttributes;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // For each `set` attribute, update or delete the current value.\n      for (attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          this.changed[attr] = val;\n        } else {\n          delete this.changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0, l = changes.length; i < l; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var val, changed = false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      for (var attr in diff) {\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\n        (changed || (changed = {}))[attr] = val;\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overridden,\n    // triggering a `\"change\"` event.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (!model.set(model.parse(resp, options), options)) return false;\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      var attrs, method, xhr, attributes = this.attributes;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true}, options);\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !options.wait) {\n        if (!this.set(attrs, options)) return false;\n      } else {\n        if (!this._validate(attrs, options)) return false;\n      }\n\n      // Set temporary attributes if `{wait: true}`.\n      if (attrs && options.wait) {\n        this.attributes = _.extend({}, attributes, attrs);\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = model.parse(resp, options);\n        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);\n        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {\n          return false;\n        }\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch') options.attrs = attrs;\n      xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      if (attrs && options.wait) this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n\n      var destroy = function() {\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (options.wait || model.isNew()) destroy();\n        if (success) success(model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      if (this.isNew()) {\n        options.success();\n        return false;\n      }\n      wrapError(this, options);\n\n      var xhr = this.sync('delete', this, options);\n      if (!options.wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      return base.replace(/([^\\/])$/, '$1/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend(options || {}, { validate: true }));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model.\n  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  _.each(modelMethods, function(method) {\n    Model.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.attributes);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analagous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model){ return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      var singular = !_.isArray(models);\n      models = singular ? [models] : _.clone(models);\n      options || (options = {});\n      var i, l, index, model;\n      for (i = 0, l = models.length; i < l; i++) {\n        model = models[i] = this.get(models[i]);\n        if (!model) continue;\n        delete this._byId[model.id];\n        delete this._byId[model.cid];\n        index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n        this._removeReference(model, options);\n      }\n      return singular ? models[0] : models;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      options = _.defaults({}, options, setOptions);\n      if (options.parse) models = this.parse(models, options);\n      var singular = !_.isArray(models);\n      models = singular ? (models ? [models] : []) : _.clone(models);\n      var i, l, id, model, attrs, existing, sort;\n      var at = options.at;\n      var targetModel = this.model;\n      var sortable = this.comparator && (at == null) && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n      var toAdd = [], toRemove = [], modelMap = {};\n      var add = options.add, merge = options.merge, remove = options.remove;\n      var order = !sortable && add && remove ? [] : false;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      for (i = 0, l = models.length; i < l; i++) {\n        attrs = models[i] || {};\n        if (attrs instanceof Model) {\n          id = model = attrs;\n        } else {\n          id = attrs[targetModel.prototype.idAttribute || 'id'];\n        }\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        if (existing = this.get(id)) {\n          if (remove) modelMap[existing.cid] = true;\n          if (merge) {\n            attrs = attrs === model ? model.attributes : attrs;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(attrs, options);\n          if (!model) continue;\n          toAdd.push(model);\n          this._addReference(model, options);\n        }\n\n        // Do not add multiple models with the same `id`.\n        model = existing || model;\n        if (order && (model.isNew() || !modelMap[model.id])) order.push(model);\n        modelMap[model.id] = true;\n      }\n\n      // Remove nonexistent models if appropriate.\n      if (remove) {\n        for (i = 0, l = this.length; i < l; ++i) {\n          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this.remove(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      if (toAdd.length || (order && order.length)) {\n        if (sortable) sort = true;\n        this.length += toAdd.length;\n        if (at != null) {\n          for (i = 0, l = toAdd.length; i < l; i++) {\n            this.models.splice(at + i, 0, toAdd[i]);\n          }\n        } else {\n          if (order) this.models.length = 0;\n          var orderedModels = order || toAdd;\n          for (i = 0, l = orderedModels.length; i < l; i++) {\n            this.models.push(orderedModels[i]);\n          }\n        }\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort events.\n      if (!options.silent) {\n        for (i = 0, l = toAdd.length; i < l; i++) {\n          (model = toAdd[i]).trigger('add', model, this, options);\n        }\n        if (sort || (order && order.length)) this.trigger('sort', this, options);\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options || (options = {});\n      for (var i = 0, l = this.models.length; i < l; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      if (_.isEmpty(attrs)) return first ? void 0 : [];\n      return this[first ? 'find' : 'filter'](function(model) {\n        for (var key in attrs) {\n          if (attrs[key] !== model.get(key)) return false;\n        }\n        return true;\n      });\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      // Run sort based on type of `comparator`.\n      if (_.isString(this.comparator) || this.comparator.length === 1) {\n        this.models = this.sortBy(this.comparator, this);\n      } else {\n        this.models.sort(_.bind(this.comparator, this));\n      }\n\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return _.invoke(this.models, 'get', attr);\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success(collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      if (!(model = this._prepareModel(model, options))) return false;\n      if (!options.wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(model, resp) {\n        if (options.wait) collection.add(model, options);\n        if (success) success(model, resp, options);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (attrs instanceof Model) return attrs;\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      if (model.id != null) this._byId[model.id] = model;\n      if (!model.collection) model.collection = this;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if ((event === 'add' || event === 'remove') && collection !== this) return;\n      if (event === 'destroy') this.remove(model, options);\n      if (model && event === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        if (model.id != null) this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',\n    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',\n    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',\n    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',\n    'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',\n    'lastIndexOf', 'isEmpty', 'chain', 'sample'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Collection.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.models);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Underscore methods that take a property name as an argument.\n  var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];\n\n  // Use attributes instead of properties.\n  _.each(attributeMethods, function(method) {\n    Collection.prototype[method] = function(value, context) {\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _[method](this.models, iterator, context);\n    };\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    options || (options = {});\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n    this.delegateEvents();\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this.$el.remove();\n      this.stopListening();\n      return this;\n    },\n\n    // Change the view's element (`this.el` property), including event\n    // re-delegation.\n    setElement: function(element, delegate) {\n      if (this.$el) this.undelegateEvents();\n      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);\n      this.el = this.$el[0];\n      if (delegate !== false) this.delegateEvents();\n      return this;\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents: function(events) {\n      if (!(events || (events = _.result(this, 'events')))) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[events[key]];\n        if (!method) continue;\n\n        var match = key.match(delegateEventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          this.$el.on(eventName, method);\n        } else {\n          this.$el.on(eventName, selector, method);\n        }\n      }\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);\n        this.setElement($el, false);\n      } else {\n        this.setElement(_.result(this, 'el'), false);\n      }\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // If we're sending a `PATCH` request, and we're in an old Internet Explorer\n    // that still has ActiveX enabled by default, override jQuery to use that\n    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.\n    if (params.type === 'PATCH' && noXhrPatch) {\n      params.xhr = function() {\n        return new ActiveXObject(\"Microsoft.XMLHTTP\");\n      };\n    }\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  var noXhrPatch =\n    typeof window !== 'undefined' && !!window.ActiveXObject &&\n      !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch':  'PATCH',\n    'delete': 'DELETE',\n    'read':   'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        router.execute(callback, args);\n        router.trigger.apply(router, ['route:' + name].concat(args));\n        router.trigger('route', name, args);\n        Backbone.history.trigger('route', router, name, args);\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional) {\n                     return optional ? match : '([^/?]+)';\n                   })\n                   .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Cached regex for removing a trailing slash.\n  var trailingSlash = /\\/$/;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment: function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || !this._wantsHashChange || forcePushState) {\n          fragment = decodeURI(this.location.pathname + this.location.search);\n          var root = this.root.replace(trailingSlash, '');\n          if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      if (oldIE && this._wantsHashChange) {\n        var frame = Backbone.$('<iframe src=\"javascript:0\" tabindex=\"-1\">');\n        this.iframe = frame.hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        Backbone.$(window).on('popstate', this.checkUrl);\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n        Backbone.$(window).on('hashchange', this.checkUrl);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      var loc = this.location;\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          this.fragment = this.getFragment(null, true);\n          this.location.replace(this.root + '#' + this.fragment);\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot() && loc.hash) {\n          this.fragment = this.getHash().replace(routeStripper, '');\n          this.history.replaceState({}, document.title, this.root + this.fragment);\n        }\n\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n      if (current === this.fragment && this.iframe) {\n        current = this.getFragment(this.getHash(this.iframe));\n      }\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      var url = this.root + (fragment = this.getFragment(fragment || ''));\n\n      // Strip the hash for matching.\n      fragment = fragment.replace(pathStripper, '');\n\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n\n      // Don't include a trailing slash on the root.\n      if (fragment === '' && url !== '/') url = url.slice(0, -1);\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._hasPushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if(!options.replace) this.iframe.document.open().close();\n          this._updateHash(this.iframe.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent's constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    var Surrogate = function(){ this.constructor = child; };\n    Surrogate.prototype = parent.prototype;\n    child.prototype = new Surrogate;\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error(model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n\n}));\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_analytics = __webpack_require__(117);\n\nvar _og_analytics2 = _interopRequireDefault(_og_analytics);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _mask_actions = __webpack_require__(847);\n\nvar _mask_actions2 = _interopRequireDefault(_mask_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportActions = {\n    newReport: function newReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_NEW'\n        });\n    },\n    cloneReport: function cloneReport(_ref) {\n        var report = _ref.report,\n            name = _ref.name,\n            properties = _ref.properties,\n            copySavedViews = _ref.copySavedViews;\n\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_CLONE'\n        });\n        _og_api2.default.post('reports/' + report.get('id') + '/clone', {\n            name: name,\n            properties: properties,\n            saved_views: copySavedViews\n        }).end().then(function (response) {\n            var _response$body = response.body,\n                entity = _response$body.entity,\n                id = _response$body.id;\n\n            window.location = 'reports#/' + entity + '/' + id;\n        });\n    },\n    loadReport: function loadReport(reportId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_LOAD',\n            reportId: reportId\n        });\n    },\n    loadedReport: function loadedReport(report, entity) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_LOADED',\n            report: report,\n            entity: entity\n        });\n        var invites = report && report.get('invites');\n        if (invites) {\n            InviteActions.loadedInvitedUsers(invites);\n        }\n        if (!_report_view_store2.default.isGridReport()) {\n            return _summary_report_actions2.default.getPackage();\n        }\n        return Promise.resolve();\n    },\n    updatedReport: function updatedReport(report) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_UPDATED',\n            updatedReport: report\n        });\n    },\n    updateReportPermission: function updateReportPermission(_ref2) {\n        var visibility = _ref2.visibility;\n\n        var report = _report_view_store2.default.getRenderedReport();\n        _og_api2.default.put('reports', report.get('id'), { visibility: visibility }).end().then(function () {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_UPDATE_PERMISSION',\n                visibility: visibility\n            });\n        });\n    },\n    updateState: function updateState(state) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_STATE_CHANGE',\n            state: state\n        });\n    },\n    loadedBackboneReport: function loadedBackboneReport(report) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_BACKBONE_LOADED',\n            report: report\n        });\n    },\n    resetState: function resetState() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_STATE_RESET'\n        });\n    },\n    defaultStateUpdated: function defaultStateUpdated(properties) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_DEFAULT_STATE_UPDATED',\n            properties: properties\n        });\n    },\n    selectSidebar: function selectSidebar(sidebar) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_SELECT_SIDEBAR',\n            sidebar: sidebar\n        });\n    },\n    toggleMainPanel: function toggleMainPanel(panel) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_TOGGLE_MAIN_PANEL',\n            panel: panel\n        });\n    },\n    openAnnotationsPanel: function openAnnotationsPanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_OPEN_ANNOTATIONS_PANEL'\n        });\n    },\n    closeAnnotationsPanel: function closeAnnotationsPanel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL'\n        });\n    },\n    pushHistory: function pushHistory(item) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_PUSH_HISTORY',\n            item: item\n        });\n    },\n    popHistory: function popHistory() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_POP_HISTORY'\n        });\n    },\n    clearHistory: function clearHistory() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_VIEW_CLEAR_HISTORY'\n        });\n    },\n    toggleAuditMode: function toggleAuditMode() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_TOGGLE_AUDIT_MODE'\n        });\n        _summary_report_actions2.default.getPackage();\n        var auditModeEnabled = _report_view_store2.default.getAuditModeEnabled();\n        _og_analytics2.default.pushEvent('ReportActions', 'ToggleAuditMode', '', auditModeEnabled);\n    },\n    enableEditDefaultStateMode: function enableEditDefaultStateMode() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_ENABLE_EDIT_DEFAULT_STATE_MODE'\n        });\n    },\n    cancelEditDefaultStateMode: function cancelEditDefaultStateMode() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_CANCEL_EDIT_DEFAULT_STATE_MODE'\n        });\n    },\n    openSettingsPanel: function openSettingsPanel() {\n        var report = _report_view_store2.default.getRenderedReport();\n        _mask_actions2.default.getMasks(report.get('coa_id'));\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_OPEN_SETTINGS_PANEL'\n        });\n    },\n    openEditData: function openEditData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_OPEN_EDIT_DATA'\n        });\n    },\n    closeEditData: function closeEditData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_CLOSE_EDIT_DATA'\n        });\n    },\n    openEditLinkage: function openEditLinkage() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_OPEN_EDIT_LINKAGE'\n        });\n    },\n    summaryToggleNode: function summaryToggleNode(nodeId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_TOGGLE_NODE',\n            nodeId: nodeId\n        });\n    },\n    summarySetExpandedNodes: function summarySetExpandedNodes(nodes, loaded) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_EXPANDED_NODES',\n            nodes: nodes, loaded: loaded\n        });\n    },\n    hasInvalidData: function hasInvalidData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_INVALID_DATA'\n        });\n    },\n    hasValidData: function hasValidData() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_VALID_DATA'\n        });\n    },\n    graphResized: function graphResized(width, height) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GRAPH_RESIZE',\n            width: width,\n            height: height\n        });\n    },\n    downloadCSV: function downloadCSV() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'DOWNLOAD_CSV'\n        });\n    },\n    printReport: function printReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'PRINT_REPORT'\n        });\n    },\n    updateUrlParams: function updateUrlParams(params) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_UPDATE_URL_PARAMS',\n            params: params\n        });\n    },\n    showBudget101: function showBudget101(persistState) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_BUDGET_101',\n            persistState: persistState\n        });\n    },\n    hideBudget101: function hideBudget101() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_BUDGET_101'\n        });\n    },\n    showTOS: function showTOS() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_TOS'\n        });\n    },\n    hideTOS: function hideTOS() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_TOS'\n        });\n    },\n    showHowTo: function showHowTo() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_HOWTO'\n        });\n    },\n    hideHowTo: function hideHowTo() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_HOWTO'\n        });\n    },\n    showWelcomeModal: function showWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_WELCOME'\n        });\n    },\n    hideWelcomeModal: function hideWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_WELCOME'\n        });\n    },\n    showReportWelcomeModal: function showReportWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_REPORT_WELCOME'\n        });\n    },\n    hideReportWelcomeModal: function hideReportWelcomeModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_REPORT_WELCOME'\n        });\n    },\n    showFeedback: function showFeedback() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_FEEDBACK_FORM'\n        });\n    },\n    hideFeedback: function hideFeedback() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_FEEDBACK_FORM'\n        });\n    },\n    showDownloadModal: function showDownloadModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SHOW_DOWNLOAD'\n        });\n    },\n    hideDownloadModal: function hideDownloadModal() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_DOWNLOAD'\n        });\n    },\n    sendFeedback: function sendFeedback(name, phone, email, message, reportId, entityId) {\n        var data = {\n            name: name,\n            email: email,\n            phone: phone,\n            message: message,\n            entity_id: entityId,\n            url: window.location.href,\n            report_id: null\n        };\n        if (reportId) {\n            data.report_id = reportId;\n        }\n        if (_underscore2.default.trim(data.message) !== '') {\n            _og_api2.default.core.post('feedbacks', data).end().then(function () {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'FEEDBACK_SAVED'\n                });\n            }).catch(function () {\n                _og_flux.Dispatcher.handleViewAction({\n                    actionType: 'SHOW_FEEDBACK_ERROR',\n                    errorMessage: 'An error occurred when trying to send feedback'\n                });\n            });\n        } else {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'SHOW_FEEDBACK_ERROR',\n                errorMessage: 'Please input a message'\n            });\n        }\n    },\n    updateMapTooltip: function updateMapTooltip(mapTooltip) {\n        if (!(0, _map_constants.canEditTooltips)(_session_store2.default.getSession())) {\n            return;\n        }\n        var report = _report_view_store2.default.getRenderedReport();\n        var currentTooltips = report.getIn(['properties', 'map_tooltips']) || _immutable2.default.List();\n        var mapTooltips = currentTooltips.push((0, _map_constants.packageTooltipForSave)(mapTooltip));\n        var properties = report.get('properties').set('map_tooltips', mapTooltips).toJS();\n        _og_api2.default.put('reports', report.get('id'), { properties: properties }).end().then(function () {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_UPDATE_MAP_TOOLTIPS',\n                mapTooltips: mapTooltips\n            });\n        });\n    }\n};\nexports.default = ReportActions;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _numeral = __webpack_require__(144);\n\nvar _numeral2 = _interopRequireDefault(_numeral);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _dataset_utils = __webpack_require__(142);\n\nvar DataSetUtils = _interopRequireWildcard(_dataset_utils);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _i18n = __webpack_require__(176);\n\nvar _i18n2 = _interopRequireDefault(_i18n);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar translate = function translate(key, options) {\n    var t = _i18n2.default.getFixedT(null, 'report');\n    return t(key, options);\n};\n\nvar isBalanceSheetLedger = function isBalanceSheetLedger(ledger) {\n    return ledger.id === 'assets' || ledger.id === 'liabilities';\n};\nvar isVariance = function isVariance(accountType, visibleAccounts) {\n    return accountType === 'types' && visibleAccounts && visibleAccounts.length && visibleAccounts.every(isBalanceSheetLedger);\n};\nvar strings = {\n    versusViewsStrings: function versusViewsStrings() {\n        return _immutable2.default.fromJS([{ id: 'balanceSheet', name: translate('strings.versusViews.balanceSheet'), trees: ['assets', 'liabilities'] }, { id: 'revenuesVersusExpenses', name: translate('strings.versusViews.revenuesVersusExpenses'), trees: ['revenues', 'expenses'] }]);\n    },\n    accountTypeCategories: function accountTypeCategories() {\n        return {\n            revenues: translate('strings.accountTypeCategories.revenues'),\n            expenses: translate('strings.accountTypeCategories.expenses'),\n            assets: translate('strings.accountTypeCategories.assets'),\n            liabilities: translate('strings.accountTypeCategories.liabilities'),\n            revAndExp: translate('strings.accountTypeCategories.revAndExp'),\n            assetAndLiability: translate('strings.accountTypeCategories.assetAndLiability')\n        };\n    },\n    month: function month(_month) {\n        var months = translate('strings.months', { returnObjects: true });\n        return months[_month - 1];\n    },\n    aggregateRowLabel: function aggregateRowLabel(accountType, visibleAccounts, isBalanceSheetReport) {\n        if (isBalanceSheetReport && accountType === 'types') {\n            return translate('strings.tableTotalFooters.balanceSheet');\n        }\n        if (accountType === 'types') {\n            if (isVariance(accountType, visibleAccounts)) {\n                return translate('strings.tableTotalFooters.variance');\n            }\n            return translate('strings.tableTotalFooters.revLessExp');\n        }\n        return translate('strings.tableTotalFooters.total');\n    },\n\n    // taken from php.js\n    nl2br: function nl2br(str) {\n        return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1<br>$2');\n    },\n    nl2space: function nl2space(str) {\n        return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1 $2');\n    },\n    br2space: function br2space(str) {\n        return (str + '').replace(/<br>/gi, ' ');\n    },\n    yAxis: function yAxis(options) {\n        var validScale = options.yAxisScale && options.yAxisScale.type && options.yAxisScale.value;\n        var scaleName = validScale ? options.yAxisScale.get('name') : null;\n        var scaleValue = validScale ? options.yAxisScale.value : null;\n        scaleName = validScale ? ' ' + scaleName + ' (' + (0, _numeral2.default)(scaleValue).format('0,0') + ')' : '';\n        switch (options.units) {\n            case '£':\n                return 'Pounds' + scaleName;\n            case '$':\n                return 'Dollars' + scaleName;\n            case '%':\n                return 'Percent of Total' + scaleName;\n            case 'FTE':\n                return 'FTE';\n            default:\n                throw new Error('Unrecognized units');\n        }\n    },\n    xAxis: function xAxis(options) {\n        if (options.reportType === 'ytd') {\n            var spending = options.currentYearAmount === 'cumulative' ? 'cumulative amounts' : 'incremental amounts';\n            if (options.currentYearPeriod === 'months') {\n                return 'Fiscal Year ' + this.fiscalYear(options.year, options.fiscalYearStartMonth) + ' (' + spending + ')';\n            }\n            if (options.month) {\n                if (options.currentYearAmount === 'monthly') {\n                    return this.month(options.month) + ' (' + spending + ')';\n                }\n                return 'Fiscal Year Through ' + this.month(options.month) + ' (' + spending + ')';\n            }\n        }\n        return 'Fiscal Year';\n    },\n    yAxisLabel: function yAxisLabel(value, yAxisScale) {\n        var num = void 0;\n        if (yAxisScale && yAxisScale.type === 'monetary') {\n            num = value / yAxisScale.value;\n            num = (0, _numeral2.default)(num).format('0,0.[00]');\n            if (yAxisScale.name === 'in Thousands') {\n                return num + 'k';\n            } else if (yAxisScale.name === 'in Millions') {\n                return num + 'M';\n            }\n        }\n        var label = (0, _numeral2.default)(value).format('0.[00]a');\n        return label.indexOf('k') !== -1 ? label : label.toUpperCase();\n    },\n    currencyNoDollar: function currencyNoDollar(number, yAxisScale) {\n        if (yAxisScale && number < 1 && number > 0) {\n            return _underscore2.default.numberFormat(Number(number), 2);\n        }\n        return _underscore2.default.numberFormat(Math.round(Number(number)));\n    },\n    addCommasKeepDecimal: function addCommasKeepDecimal(number) {\n        var parts = (Math.round(number * 100) / 100).toString().split('.');\n        parts[0] = _underscore2.default.numberFormat(Number(parts[0]));\n        return parts.join('.');\n    },\n    generateDownloadString: function generateDownloadString() {\n        var locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en_US';\n\n        var m = (0, _moment2.default)();\n        m.locale(locale);\n        return 'Download generated on ' + m.format('L');\n    },\n    percentage: function percentage(number) {\n        if (!_lodash2.default.isFinite(number)) {\n            return '--';\n        }\n        return _underscore2.default.numberFormat(number, 2) + '%';\n    },\n    amountUnitLabel: function amountUnitLabel(unit) {\n        switch (unit) {\n            case 'FTE':\n                return 'FTE Count';\n            case '$':\n                return 'dollar';\n            default:\n                return '';\n        }\n    },\n    dataSetLabel: function dataSetLabel(dataSet, reportType, currentYearPeriod, currentYearAmount, startMonth, options) {\n        var label = [];\n        if (dataSet.label) {\n            if (DataSetUtils.isProjectionDataset(dataSet) && dataSet.month) {\n                label.push(this.month(dataSet.month));\n                label.push(this.fiscalYear(dataSet.year, startMonth));\n            } else {\n                if (DataSetUtils.isProjectionDataset(dataSet)) {\n                    label.push(this.fiscalYear(dataSet.year, startMonth));\n                    label.push(dataSet.description);\n                } else {\n                    label.push(dataSet.label);\n                }\n            }\n        } else {\n            if (dataSet.month) {\n                label.push(this.month(dataSet.month));\n            }\n            label.push(this.fiscalYear(dataSet.year, startMonth));\n            label.push(dataSet.description);\n        }\n        if (reportType === 'ytd' && !dataSet.month && !(currentYearAmount === 'cumulative' && currentYearPeriod === 'months') && (options && options.proration || dataSet.type === 'actual')) {\n            label.push('(Prorated)');\n        }\n        if (DataSetUtils.isProjectionDataset(dataSet)) {\n            label.push('(Projected)');\n        }\n        return label.join('\\n');\n    },\n    summaryHeaderLabel: function summaryHeaderLabel(dataSet, product, startMonth) {\n        var label = [];\n        if (dataSet.month) {\n            label.push(this.month(dataSet.month));\n        }\n        label.push(this.fiscalYear(dataSet.year, startMonth));\n        label.push(dataSet.description);\n        return label.join(' ');\n    },\n    fiscalYear: function fiscalYear(year, startMonth) {\n        if (!startMonth) {\n            throw new Error('Cannot display fiscal year without starting month');\n        }\n        if (startMonth === 1) {\n            return '' + year;\n        }\n        var twoDigitYear = year % 100;\n        twoDigitYear = (twoDigitYear < 10 ? '0' : '') + twoDigitYear;\n        return year - 1 + '-' + twoDigitYear;\n    },\n    accountTypeBreakdown: function accountTypeBreakdown(accountTypeId, reportType) {\n        if (accountTypeId === 'types') {\n            accountTypeId = reportType === 'balance' ? 'assetAndLiability' : 'revAndExp';\n        }\n        var accountTypeBreakdowns = translate('strings.accountTypeBreakdowns', { returnObjects: true });\n        return accountTypeBreakdowns[accountTypeId];\n    },\n    breakdownName: function breakdownName(breakdown, accountType, visibleAccounts, reportType) {\n        if (breakdown.get('id') === 'types') {\n            if (isVariance(breakdown.get('id'), visibleAccounts)) {\n                return translate('strings.accountTypeBreakdowns.assetAndLiability');\n            }\n            return strings.accountTypeBreakdown(accountType, reportType);\n        }\n        return breakdown.get('name');\n    },\n    accountCategoryName: function accountCategoryName(accountTypeId, product) {\n        if (accountTypeId === 'types') {\n            accountTypeId = product === 'balance' ? 'assetAndLiability' : 'revAndExp';\n        }\n        return this.accountTypeCategories()[accountTypeId];\n    },\n    nodeName: function nodeName(node) {\n        var name = node.name;\n        var auditModeEnabled = _report_view_store2.default.getAuditModeEnabled();\n        if (auditModeEnabled && !_lodash2.default.isEmpty(node.accountCodeChains)) {\n            var parts = [];\n            for (var i = 0, len = node.accountCodeChains.length; i < len; ++i) {\n                var codes = node.accountCodeChains[i];\n                parts.push(codes.join('.'));\n            }\n            name = '(' + parts.join(', ') + ') ' + name;\n        }\n        return name;\n    },\n    aggregationsCombinedName: function aggregationsCombinedName(aggregations) {\n        var isBalanceSheet = !_lodash2.default.isEmpty(aggregations) && _lodash2.default.every(aggregations, function (tree) {\n            return tree.id === 'assets' || tree.id === 'liabilities';\n        });\n        if (isBalanceSheet) {\n            return translate('strings.versusViews.balanceSheet');\n        } else {\n            return _lodash2.default.map(aggregations, function (tree) {\n                return tree ? tree.get('name') : '';\n            }).join(' & ');\n        }\n    },\n    exportTitle: function exportTitle(reportType, entity, breakdownTitles, yearText, yAxisScale) {\n        var validNumericScale = yAxisScale && yAxisScale.get('type') === 'numeric';\n        var scaleValue = validNumericScale ? ' (' + (0, _numeral2.default)(yAxisScale.value).format('0,0') + ')' : null;\n        var scaleName = yAxisScale ? ' - ' + yAxisScale.get('name') : '';\n        scaleName = validNumericScale ? scaleName + scaleValue : scaleName;\n        return _lodash2.default.template('${entityName}<br />${reportType} - ${breakdown}${yearText}${yAxisScale}')({\n            entityName: _underscore2.default.capitalize(entity.name),\n            reportType: reportType,\n            breakdown: breakdownTitles.primary.name,\n            yearText: yearText ? '<br/>' + yearText : '',\n            yAxisScale: yAxisScale ? scaleName : ''\n        });\n    },\n    formatFTE: function formatFTE(value) {\n        var precision = parseInt(value) === parseFloat(value.toFixed(3)) ? 0 : 3;\n        return _underscore2.default.numberFormat(value, precision);\n    },\n    truncateLabel: function truncateLabel(str) {\n        var len = 25;\n        if (str.length > len + 3) {\n            return str.slice(0, len) + '...';\n        }\n        return str;\n    },\n    unitIsPrefix: function unitIsPrefix(unit) {\n        if (unit === '$') {\n            return true;\n        }\n        return false;\n    },\n    pillIconToUse: function pillIconToUse(unit) {\n        unit = _lodash2.default.includes(unit, '$') ? '$' : unit; // Unit may be a string with more than just '$'\n        switch (unit) {\n            case '$':\n                return 'icon-dollar-1';\n            case 'FTE':\n                return 'icon-clock-1';\n            case 'people':\n                return 'icon-user-1'; //icon-team-1\n            case 'incidents':\n                return '';\n            default:\n                return '';\n        }\n    },\n    centsToDollars: function centsToDollars(metric, values) {\n        if (_lodash2.default.includes(metric.units, 'US cents')) {\n            metric.units = metric.units.replace('US cents', '$');\n            _lodash2.default.forEach(values, function (yr) {\n                return yr.value /= 100;\n            });\n        }\n    },\n\n    generateTotalLabel: function generateTotalLabel(visualization, dateColumn) {\n        var isBarGraph = visualization && visualization.get('graphType') === 'bar';\n        var isLineGraph = visualization && visualization.get('graphType') === 'line';\n        var isVisualizationVisible = visualization && visualization.get('isVisible');\n        var isSingleXAxis = visualization && visualization.get('xAxis') && visualization.get('xAxis').size === 1;\n        var isPlural = (isBarGraph || isLineGraph) && !isSingleXAxis;\n        var firstTick = visualization && visualization.get('xAxis').first();\n        var hasMonths = firstTick && _lodash2.default.has(firstTick.result, 'month');\n        var isComputed = dateColumn && dateColumn.get('computed');\n        var plurality = isPlural ? 'all' : 'a';\n        var timeUnits = hasMonths && !isComputed ? 'month' : 'year';\n        var pluralEnding = isPlural ? 's' : '';\n        var totalValueLabel = 'Total for ' + plurality + ' ' + timeUnits + pluralEnding;\n        return isVisualizationVisible ? totalValueLabel : 'Total';\n    },\n    formatShareMessageFooter: function formatShareMessageFooter(list, limit) {\n        if (list.length === 0) {\n            return 'You have not invited anyone to access this report';\n        }\n        var fullNames = _lodash2.default.take(list, limit).join(', ');\n        if (list.length > limit) {\n            var more = list.length - limit;\n            fullNames += ', and ' + more + (more > 1 ? ' others' : ' other');\n        } else if (list.length === 1) {\n            fullNames = 'and ' + fullNames;\n        } else {\n            fullNames = fullNames.replace(/\\,(?=[^,]*$)/, ', and');\n        }\n        return 'You' + (list.length > 1 ? ',' : '') + ' ' + fullNames + ' have access';\n    },\n    formatShareMessageFlash: function formatShareMessageFlash(list, count) {\n        if (list.length === 0) {\n            return 'No one has been sent a link to this report';\n        }\n        var limit = 0;\n        var startName = list[0];\n        var remainderList = list.slice(1);\n        var fullNames = _lodash2.default.take(remainderList, limit).join(', ');\n        if (remainderList.length > limit) {\n            var more = remainderList.length - limit;\n            fullNames += '' + (limit > 0 ? ', ' : '');\n            fullNames += 'and ' + more + (more > 1 ? ' other users' : ' other user');\n        } else if (remainderList.length === 1) {\n            fullNames = 'and ' + fullNames;\n        } else {\n            fullNames = fullNames.replace(/\\,(?=[^,]*$)/, ', and');\n        }\n        var potentialComma = remainderList.length > 1 && limit > 0 ? ',' : '';\n        var potentialSpace = remainderList.length > 0 ? ' ' : '';\n        var verb = remainderList.length > 0 || _lodash2.default.endsWith(startName, '(You)') ? 'have' : 'has';\n        return '' + startName + potentialComma + ' ' + fullNames + potentialSpace + verb + ' been sent a link to this report.';\n    }\n};\nexports.default = strings;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(169)('wks');\nvar uid = __webpack_require__(106);\nvar Symbol = __webpack_require__(16).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = __webpack_require__(852)['default'];\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(67);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (false) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(19)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (false) {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (true) {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = __webpack_require__(743);\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _og_flux = __webpack_require__(15);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportViewStore = function (_BaseStore) {\n    _inherits(ReportViewStore, _BaseStore);\n\n    function ReportViewStore(options) {\n        _classCallCheck(this, ReportViewStore);\n\n        var _this = _possibleConstructorReturn(this, (ReportViewStore.__proto__ || Object.getPrototypeOf(ReportViewStore)).call(this));\n\n        options = options || {};\n        _this._report = Immutable.Map();\n        _this._entity = Immutable.Map();\n        _this._activeSidebar = 'reports';\n        _this._activeMainPanel = options.standalone ? 'saved' : 'filter';\n        _this._history = [];\n        _this._editingDefaultState = false;\n        _this._editingData = false;\n        _this._hasValidData = true;\n        _this._wizardFlow = null;\n        _this._maskOptions = [];\n        _og_flux.Dispatcher.register(function (payload) {\n            _this._handleAction(payload.action);\n        });\n        return _this;\n    }\n\n    _createClass(ReportViewStore, [{\n        key: 'getRenderedReport',\n        value: function getRenderedReport() {\n            return this._report;\n        }\n    }, {\n        key: 'getReportEntity',\n        value: function getReportEntity() {\n            return this._entity;\n        }\n    }, {\n        key: 'getReportDataSets',\n        value: function getReportDataSets() {\n            return this._report.get('data_sets');\n        }\n    }, {\n        key: 'getState',\n        value: function getState() {\n            return this._state;\n        }\n    }, {\n        key: 'getActiveSidebar',\n        value: function getActiveSidebar() {\n            return this._activeSidebar;\n        }\n    }, {\n        key: 'getActiveMainPanel',\n        value: function getActiveMainPanel() {\n            return this._activeMainPanel;\n        }\n    }, {\n        key: 'getHistory',\n        value: function getHistory() {\n            return this._history;\n        }\n    }, {\n        key: 'getUrlParams',\n        value: function getUrlParams() {\n            return this._urlParams;\n        }\n    }, {\n        key: 'getAuditModeEnabled',\n        value: function getAuditModeEnabled() {\n            return this._report.getIn(['properties', 'audit_mode_enabled']) || false;\n        }\n    }, {\n        key: 'getMaskOptions',\n        value: function getMaskOptions() {\n            return this._maskOptions;\n        }\n    }, {\n        key: 'isEditingDefaultState',\n        value: function isEditingDefaultState() {\n            return this._editingDefaultState;\n        }\n    }, {\n        key: 'isEditingData',\n        value: function isEditingData() {\n            return this._editingData;\n        }\n    }, {\n        key: 'getWizardFlow',\n        value: function getWizardFlow() {\n            return this._wizardFlow;\n        }\n    }, {\n        key: 'getHasValidData',\n        value: function getHasValidData() {\n            return this._hasValidData;\n        }\n    }, {\n        key: 'isDefaultReport',\n        value: function isDefaultReport() {\n            return this._report.get('position') === 0;\n        }\n    }, {\n        key: 'isGridReport',\n        value: function isGridReport() {\n            return this._report.get('report_type') === 'grid';\n        }\n    }, {\n        key: 'isMonthlyReport',\n        value: function isMonthlyReport() {\n            return this._report.get('report_type') === 'ytd';\n        }\n    }, {\n        key: 'isBalanceSheetReport',\n        value: function isBalanceSheetReport() {\n            return this._report.get('report_type') === 'balance';\n        }\n    }, {\n        key: '_handleAction',\n        value: function _handleAction(action) {\n            switch (action.actionType) {\n                case 'MASK_GET_MASKS_COMPLETE':\n                    this._maskOptions = _lodash2.default.map(action.masks, function (mask) {\n                        return { option: mask.name, value: mask.id };\n                    });\n                    this.emitChange();\n                    break;\n                case 'REPORT_NEW':\n                    this._editingData = true;\n                    this._wizardFlow = 'NewReport';\n                    this.emitChange();\n                    break;\n                case 'REPORT_LOADED':\n                    this._report = action.report.toImmutable();\n                    if (this._report.getIn(['properties', 'total_text_visible']) === null) {\n                        this._report = this._report.setIn(['properties', 'total_text_visible'], true);\n                    }\n                    if (this._report.getIn(['properties', 'summary_table_visible']) === null) {\n                        this._report = this._report.setIn(['properties', 'summary_table_visible'], false);\n                    }\n                    this._entity = Immutable.fromJS(action.entity.toJSON());\n                    this._history = [];\n                    this.emitChange();\n                    break;\n                case 'REPORT_UPDATED':\n                    this._report = action.updatedReport;\n                    this.emitChange();\n                    break;\n                case 'REPORT_UPDATE_PERMISSION':\n                    this._report = this._report.set('visibility', action.visibility);\n                    this.emitChange();\n                    break;\n                case 'REPORT_STATE_CHANGE':\n                    if (!_lodash2.default.isEqual(this._state, action.state)) {\n                        this._state = action.state;\n                        this.emitChange();\n                    }\n                    break;\n                case 'REPORT_VIEW_TOGGLE_MAIN_PANEL':\n                    this._activeMainPanel = action.panel;\n                    this.emitChange();\n                    break;\n                case 'REPORT_VIEW_PUSH_HISTORY':\n                    this._history = this._history.concat(action.item);\n                    this.emitChange();\n                    break;\n                case 'REPORT_VIEW_POP_HISTORY':\n                    this._history = this._history.slice(0, -1);\n                    this.emitChange();\n                    break;\n                case 'REPORT_VIEW_CLEAR_HISTORY':\n                    this._history = [];\n                    this.emitChange();\n                    break;\n                case 'REPORT_ENABLE_EDIT_DEFAULT_STATE_MODE':\n                    this._editingDefaultState = true;\n                    this.emitChange();\n                    break;\n                case 'REPORT_DEFAULT_STATE_UPDATED':\n                    this._editingDefaultState = false;\n                    this._report = this._report.set('properties', action.properties);\n                    this.emitChange();\n                    break;\n                case 'REPORT_CANCEL_EDIT_DEFAULT_STATE_MODE':\n                    this._editingDefaultState = false;\n                    this.emitChange();\n                    break;\n                case 'REPORT_OPEN_EDIT_DATA':\n                    this._editingData = true;\n                    this._wizardFlow = 'EditDatasets';\n                    this.emitChange();\n                    break;\n                case 'REPORT_CLOSE_EDIT_DATA':\n                    this._editingData = false;\n                    this.emitChange();\n                    break;\n                case 'REPORT_OPEN_EDIT_LINKAGE':\n                    this._editingData = true;\n                    this._wizardFlow = 'LinkGridReport';\n                    this.emitChange();\n                    break;\n                case 'REPORT_SUMMARY_INVALID_DATA':\n                    this._hasValidData = false;\n                    this.emitChange();\n                    break;\n                case 'REPORT_SUMMARY_VALID_DATA':\n                    this._hasValidData = true;\n                    this.emitChange();\n                    break;\n                case 'REPORT_TOGGLE_AUDIT_MODE':\n                    this._report = this._report.setIn(['properties', 'audit_mode_enabled'], !this.getAuditModeEnabled());\n                    this.emitChange();\n                    break;\n                case 'REPORT_UPDATE_URL_PARAMS':\n                    this._urlParams = action.params;\n                    break;\n                case 'SAVED_VIEW_SELECTED':\n                    // When user selects a saved view, show the saved views panel.\n                    this._activeMainPanel = 'saved';\n                    this.emitChange();\n                    break;\n                case 'REPORT_VIEW_SELECT_SIDEBAR':\n                    this._activeSidebar = action.sidebar;\n                    this.emitChange();\n                    break;\n                case 'REPORT_UPDATE_MAP_TOOLTIPS':\n                    this._report = this._report.setIn(['properties', 'map_tooltips'], action.mapTooltips);\n                    this.emitChange();\n                    break;\n            }\n        }\n    }]);\n\n    return ReportViewStore;\n}(_og_flux.BaseStore);\n\nvar store = new ReportViewStore({\n    standalone: gon.standalone\n});\nstore.__class = ReportViewStore;\nexports.default = store;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _google_translate = __webpack_require__(898);\n\nvar _google_translate2 = _interopRequireDefault(_google_translate);\n\nvar _i18n = __webpack_require__(176);\n\nvar _intercom_utils = __webpack_require__(121);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar GET_AGGREGATIONS_DEBOUNCE_TIME = 800;\nvar SummaryReportActions = {\n    getAggregationsDebounced: _lodash2.default.debounce(function (skipGraph) {\n        SummaryReportActions.getAggregationsRequest(skipGraph);\n    }, GET_AGGREGATIONS_DEBOUNCE_TIME),\n    getAggregations: function getAggregations(skipGraph) {\n        SummaryReportActions.getAggregationsRequest(skipGraph);\n    },\n    getAggregationsRequest: function getAggregationsRequest(skipGraph) {\n        var report = _report_view_store2.default.getRenderedReport();\n        var entity = _report_view_store2.default.getReportEntity();\n        var state = _summary_report_store2.default.getState();\n        var athenaState = state.get('athenaState');\n        var budgetData = state.get('budgetData');\n        var pkg = state.get('pkg');\n        var accountType = state.get('accountType');\n        var visibleAccounts = budgetData.visibleAccounts.map(function (account) {\n            var res = { id: account.id, active: null };\n            if (account.id === accountType) {\n                res.active = true;\n            }\n            return res;\n        });\n        if (state.get('versusView')) {\n            visibleAccounts.push({ id: 'types', active: true });\n        }\n        var state_scale_flag = false;\n        if (entity.get('feature_permissions') !== undefined && _lodash2.default.includes(entity.get('feature_permissions').toArray(), 'linkage_view')) {\n            state_scale_flag = true;\n        }\n        var requestData = {\n            data_sets: budgetData.report.dataSets.pluck('id'),\n            coa_mask_id: report.get('coa_mask_id'),\n            cache_key: pkg.cache_key,\n            breakdown: accountType === 'types' ? 'types' : state.get('breakdown'),\n            visible_accounts: [].concat(visibleAccounts, budgetData.invisibleAccounts),\n            time_period: state.get('fiscalYearRange').toJS(),\n            mask: state.get('mask'),\n            serve_old: true,\n            state_scale: state_scale_flag,\n            ungroup: null,\n            selection: null,\n            checked_nodes: null,\n            expanded_nodes: null,\n            api: null\n        };\n        if (_report_view_store2.default.getAuditModeEnabled()) {\n            requestData.ungroup = true;\n        }\n        if (athenaState.pendingSelection) {\n            requestData.selection = athenaState.pendingSelection;\n            athenaState.pendingSelection = null;\n        } else {\n            requestData.checked_nodes = _lodash2.default.map(budgetData.minimalSelectedNodeList(), 'id');\n            requestData.expanded_nodes = _lodash2.default.keys(_summary_report_store2.default.getState().get('expandedNodes').toObject());\n        }\n        if (window.gon && gon.dataApi) {\n            requestData.api = gon.dataApi;\n        }\n        SummaryReportActions.updateGraphLoadingStatus(true);\n        _og_api2.default.tapi.post('select', report.get('coa_id'), requestData).end().then(function (res) {\n            SummaryReportActions.getAggregationsSuccess(res.body, skipGraph);\n        }).catch(function (error) {\n            SummaryReportActions.getAggregationsError(error);\n        }).finally(function () {\n            SummaryReportActions.updateGraphLoadingStatus(false);\n        });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_AGGREGATIONS'\n        });\n    },\n    getMetricsAvailable: function getMetricsAvailable() {\n        var report = _report_view_store2.default.getRenderedReport();\n        var entity = report.get('entity');\n        var requestData = { embed: 'metrics' };\n        _og_api2.default.entitydata.get('entities', entity, requestData).end().then(function (res) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_SET_METRICS_AVAILABLE',\n                metricsAvailable: res.body.metrics\n            });\n        }).catch(function () {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_METRICS_UNAVAILABLE'\n            });\n        });\n    },\n    getMetricData: function getMetricData() {\n        var report = _report_view_store2.default.getRenderedReport();\n        var state = _summary_report_store2.default.getState();\n        var overlaysSelected = state.getIn(['overlay', 'selected']);\n        var scaleSelected = state.getIn(['scale', 'selected']);\n        var selection = overlaysSelected.concat(scaleSelected);\n        // Filtering null + items that have already been queried for\n        var selectionFiltered = selection.filter(function (selected) {\n            var dataHasntBeenRetrievedYet = state.getIn(['metricData', 'data']).filter(function (existingItem) {\n                return existingItem.get('metric_type') === selected;\n            }).size === 0;\n            return !_lodash2.default.isNull(selected) && !_lodash2.default.isUndefined(selected) && dataHasntBeenRetrievedYet;\n        });\n        var apiCalls = [];\n        // It is preferable to make only 1 API call, however current API does not allow for different interpolation types for each selectedItem\n        selectionFiltered.forEach(function (selected) {\n            // Getting entire year range instead of `fiscalYearRange`, as do not have to rerun query when fiscalYearRange changes\n            var years = state.get('years');\n            var entity = report.get('entity');\n            var requestData = {\n                embed: selected + ':' + years.min() + '..' + years.max(),\n                interpolate: true\n            };\n            apiCalls.push(new Promise(function (resolve) {\n                _og_api2.default.entitydata.get('entities', entity, requestData).end().then(function (res) {\n                    _og_flux.Dispatcher.handleViewAction({\n                        actionType: 'REPORT_SET_METRIC_DATA',\n                        metricData: res.body.metrics\n                    });\n                    resolve();\n                }).catch(function (err) {\n                    console.error(err);resolve();\n                });\n            }));\n        });\n        return Promise.all(apiCalls);\n    },\n    reset: function reset() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SUMMARY_REPORT_RESET'\n        });\n        SummaryReportActions.getAggregations();\n    },\n    setInitialState: function setInitialState(initialState) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_INITIAL_STATE',\n            initialState: initialState\n        });\n    },\n    goBack: function goBack(previousState) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GO_BACK',\n            previousState: previousState\n        });\n        SummaryReportActions.getAggregations();\n    },\n    updateGraphLoadingStatus: function updateGraphLoadingStatus(status) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'UPDATE_GRAPH_LOADING_STATUS',\n            status: status\n        });\n    },\n    getAggregationsError: function getAggregationsError(error) {\n        var state = _summary_report_store2.default.getState();\n        var budgetData = state.get('budgetData');\n        budgetData.trigger('aggregation:error', error);\n        Raven.captureException(error);\n    },\n    getAggregationsSuccess: function getAggregationsSuccess(aggregations, skipGraph) {\n        var state = _summary_report_store2.default.getState();\n        var budgetData = state.get('budgetData');\n        budgetData.updateEnabledState(aggregations.enabled_nodes);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_AGGREGATIONS_SUCCESS',\n            aggregations: aggregations\n        });\n        budgetData.aggregations = aggregations;\n        budgetData.aggregations.skipGraph = skipGraph;\n        budgetData.trigger('aggregation', aggregations);\n    },\n    getPackage: function getPackage() {\n        var report = _report_view_store2.default.getRenderedReport();\n        var entity = _report_view_store2.default.getReportEntity();\n        var state_scale_flag = false;\n        if (entity.get('feature_permissions') !== undefined && _lodash2.default.includes(entity.get('feature_permissions').toArray(), 'linkage_view')) {\n            state_scale_flag = true;\n        }\n        var params = {\n            coa_mask_id: report.get('coa_mask_id'),\n            data_sets: report.get('data_sets').map(function (ds) {\n                return ds.get('id');\n            }).toArray(),\n            mask: _summary_report_store2.default.getState().get('mask'),\n            serve_old: true,\n            state_scale: state_scale_flag,\n            ungroup: null,\n            api: null\n        };\n        if (_report_view_store2.default.getAuditModeEnabled()) {\n            params.ungroup = true;\n        }\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_PACKAGE'\n        });\n        if (window.gon && gon.dataApi) {\n            params.api = gon.dataApi;\n        }\n        return _og_api2.default.tapi.post('package', report.get('coa_id'), params).end().then(function (res) {\n            return res.body;\n        }).then(function (pkg) {\n            if ((0, _i18n.shouldTranslate)()) {\n                return new Promise(function (resolve) {\n                    // lets gather things we need to translate\n                    var treeNames = _lodash2.default.map(pkg.trees, function (obj) {\n                        return obj.name;\n                    });\n                    var treeCategories = (0, _lodash2.default)(pkg.trees).map(function (obj) {\n                        return obj.categories;\n                    }).flatten().value();\n                    (0, _google_translate2.default)(_lodash2.default.flatten([treeNames, treeCategories])).then(function (dictionary) {\n                        // replace translations\n                        _lodash2.default.each(pkg.trees, function (obj) {\n                            obj.name = dictionary[obj.name];\n                            obj.categories = _lodash2.default.map(obj.categories, function (categoryName) {\n                                return dictionary[categoryName];\n                            });\n                        });\n                        resolve(pkg);\n                    }).catch(function (error) {\n                        resolve(pkg);\n                        // NOTE: we should resolve first and then deal with Raven!\n                        window.Raven && window.Raven.captureException(error);\n                    });\n                });\n            } else {\n                return pkg;\n            }\n        }).then(function (pkg) {\n            if (!_lodash2.default.size(pkg.data_sets)) {\n                SummaryReportActions.loadedPackageNoDataSets(pkg);\n            }\n            // Hack to defer loading the selections before the summary report has\n            // fully reloaded after you change the selected data sets.\n            _lodash2.default.defer(function () {\n                SummaryReportActions.getPackageSuccess(pkg);\n            });\n        }).catch(function (err) {\n            setTimeout(SummaryReportActions.getPackageError(err), 1);\n            throw err;\n        });\n    },\n    getAnnotations: function getAnnotations() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_ANNOTATIONS'\n        });\n        var report = _report_view_store2.default.getRenderedReport();\n        _og_api2.default.get('annotations', {\n            report_id: report.get('id'),\n            limit: 1000\n        }, function (error, response) {\n            if (error || !response.ok) {\n                window.Raven && window.Raven.captureException(new Error('Failed to load annotations'));\n                return;\n            }\n            var annotations = response.body.annotations;\n            SummaryReportActions.getAnnotationsSuccess(annotations);\n        });\n    },\n    getAnnotationsSuccess: function getAnnotationsSuccess(annotations) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_ANNOTATIONS_SUCCESS',\n            annotations: annotations\n        });\n    },\n    setBreakdown: function setBreakdown(breakdownId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_BREAKDOWN',\n            breakdownId: breakdownId\n        });\n        SummaryReportActions.getAggregations();\n    },\n    setAccountType: function setAccountType(accountTypeId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_ACCOUNT_TYPE',\n            accountTypeId: accountTypeId\n        });\n        SummaryReportActions.getAggregations();\n    },\n    setVersusView: function setVersusView(versusViewId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_VERSUS_VIEW',\n            versusViewId: versusViewId\n        });\n        SummaryReportActions.getAggregations();\n    },\n    togglePerCapitaScale: function togglePerCapitaScale() {\n        var disableAggregations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_TOGGLE_PER_CAPITA_SCALE'\n        });\n        SummaryReportActions.getMetricData().then(function () {\n            if (!disableAggregations) {\n                SummaryReportActions.getAggregations();\n            }\n        });\n    },\n    setMonth: function setMonth(month) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_MONTH',\n            month: month\n        });\n        SummaryReportActions.getAggregations();\n    },\n    setYear: function setYear(year) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_YEAR',\n            year: year\n        });\n        SummaryReportActions.getAggregations();\n    },\n    setOverlays: function setOverlays(overlaysSelected) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_OVERLAYS',\n            overlaysSelected: overlaysSelected\n        });\n        SummaryReportActions.getMetricData().then();\n    },\n    setScale: function setScale(scaleSelected) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_SCALE',\n            scaleSelected: scaleSelected\n        });\n        SummaryReportActions.getMetricData().then(function () {\n            SummaryReportActions.getAggregations(); //This force updates the table\n        });\n    },\n    toggleFilterPanel: function toggleFilterPanel(panelId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_TOGGLE_FILTER_PANEL',\n            panelId: panelId\n        });\n    },\n    toggleAllFilterPanels: function toggleAllFilterPanels() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS'\n        });\n    },\n    closeAllFilterPanels: function closeAllFilterPanels() {\n        // close panels only if they are open\n        var countOpenedPanels = _summary_report_store2.default.getState().get('filterPanels').reduce(function (prev, current) {\n            return prev + (current === true ? 1 : 0);\n        }, 0);\n        if (countOpenedPanels) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS'\n            });\n        }\n    },\n    getPackageError: function getPackageError(err) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'GET_PACKAGE_ERR',\n            err: err\n        });\n    },\n    loadedPackageNoDataSets: function loadedPackageNoDataSets(pkg) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_LOADED_PACKAGE_NO_DATA_SETS',\n            pkg: pkg\n        });\n    },\n    getPackageSuccess: function getPackageSuccess(pkg) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_GET_PACKAGE_SUCCESS',\n            pkg: pkg,\n            urlParams: _report_view_store2.default.getUrlParams()\n        });\n        SummaryReportActions.getAnnotations();\n        SummaryReportActions.getAggregations();\n    },\n    drill: function drill(id) {\n        var athenaState = _summary_report_store2.default.getState().get('athenaState');\n        if (id === '_moreLine') {\n            athenaState.expandMore();\n        } else {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'REPORT_DRILL',\n                id: id\n            });\n            SummaryReportActions.getAggregations();\n        }\n    },\n    treeSelect: function treeSelect(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_TREE_SELECT',\n            id: id\n        });\n        SummaryReportActions.getAggregations();\n    },\n    nodeToggleSelect: function nodeToggleSelect(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_NODE_TOGGLE_SELECT',\n            id: id\n        });\n        SummaryReportActions.getAggregationsDebounced();\n    },\n    nodeExclusiveSelect: function nodeExclusiveSelect(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_NODE_EXCLUSIVE_SELECT',\n            id: id\n        });\n        SummaryReportActions.getAggregationsDebounced();\n    },\n    changeCurrentYearPeriod: function changeCurrentYearPeriod(period) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_CHANGE_CURRENT_YEAR_PERIOD',\n            period: period\n        });\n        SummaryReportActions.getAggregations();\n    },\n    toggleProration: function toggleProration() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_TOGGLE_PRORATION'\n        });\n        SummaryReportActions.getAggregations();\n    },\n    toggleHighlightingVariance: function toggleHighlightingVariance() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_TOGGLE_HIGHLIGHTING_VARIANCE'\n        });\n    },\n    setHighlightingVariance: function setHighlightingVariance(highlightingVariance) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SET_HIGHLIGHTING_VARIANCE',\n            highlightingVariance: highlightingVariance\n        });\n    },\n    toggleProjections: function toggleProjections() {\n        // store this in athena state because we don't want to persist it to the DB\n        var athenaState = _summary_report_store2.default.getState().get('athenaState');\n        athenaState.set('projections', !athenaState.get('projections'));\n        /**\r\n        * Forgive me my coding sins, but we could've done it through athena_state triggering the change.\r\n        * However, making athena_state to trigger the change is really inefficient way because we store\r\n        * one state in the other and athena state also triggers URL params change, which triggers tons of other changes.\r\n        * Have had we done it through the athena_state triggering the change, we would've experienced a really degrading\r\n        * performance.\r\n        * Bottom line, we just mirror both projections and projectionType in the summary report store.\r\n        */\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_MIRROR_PROJECTIONS'\n        });\n        var metadata = {\n            toggled: athenaState.get('projections')\n        };\n        (0, _intercom_utils.trackIntercomEvent)('toggle-projections', metadata);\n    },\n    setProjectionType: function setProjectionType(projectionType) {\n        // store this in athena state because we don't want to persist it to the DB\n        var athenaState = _summary_report_store2.default.getState().get('athenaState');\n        athenaState.set('projectionType', projectionType);\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_MIRROR_PROJECTION_TYPE'\n        });\n    },\n    setFiscalYearRange: function setFiscalYearRange(range) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE',\n            range: range\n        });\n    },\n    changeCurrentYearAmount: function changeCurrentYearAmount(amount) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_CHANGE_CURRENT_YEAR_AMOUNT',\n            amount: amount\n        });\n        SummaryReportActions.getAggregations();\n    },\n    summaryToggleNode: function summaryToggleNode(nodeId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_TOGGLE_NODE',\n            nodeId: nodeId\n        });\n        SummaryReportActions.getAggregations(true);\n    },\n    summarySetExpandedNodes: function summarySetExpandedNodes(nodes, loaded) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SUMMARY_EXPANDED_NODES',\n            nodes: nodes, loaded: loaded\n        });\n        if (!loaded) {\n            SummaryReportActions.getAggregations(true);\n        }\n    }\n};\nexports.default = SummaryReportActions;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(13);\nvar IE8_DOM_DEFINE = __webpack_require__(686);\nvar toPrimitive = __webpack_require__(73);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(27) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(74);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @class Utils\r\n    @static */\nvar utils =\n/** @lends Utils */\n{\n    /* === General Helpers */\n    /** @static */\n    parseValue: function parseValue(val, type, format) {\n        if (type === 'numeric') {\n            return utils.parseNumber(val);\n        } else if (type === 'monetary') {\n            return utils.parseMonetary(val);\n        } else if (type === 'date') {\n            return utils.parseDate(val, format);\n        } else if (type === 'percent') {\n            return utils.parsePercent(val);\n        }\n        return val;\n    },\n\n    /** Get formatter used in grid\r\n        @static */\n    getFormatter: function getFormatter(column, locale) {\n        var func = utils.getGridValueFormatter(column, locale);\n        return function (row, cell, value) {\n            return func(value);\n        };\n    },\n\n    /** Get formatters for grid\r\n        @static */\n    getGridValueFormatter: function getGridValueFormatter(column) {\n        var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en_US';\n\n        var func = utils.formatTextForTable;\n        if (column.type === 'numeric') {\n            func = utils.formatNumber;\n        } else if (column.type === 'monetary') {\n            func = function func(value) {\n                return utils.formatMonetary(value);\n            };\n        } else if (column.type === 'date') {\n            func = utils.formatDate(locale);\n        } else if (column.type === 'percent') {\n            func = utils.formatPercent;\n        }\n        return func;\n    },\n\n    /** Get formatter which can be simply used\r\n        @static */\n    getSimpleFormatter: function getSimpleFormatter(column) {\n        var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en_US';\n\n        var func = utils.formatText;\n        if (column.type === 'numeric') {\n            func = utils.formatNumber;\n        } else if (column.type === 'monetary') {\n            func = function func(value) {\n                return utils.formatMonetary(value);\n            };\n        } else if (column.type === 'date') {\n            func = utils.formatDate(locale);\n        } else if (column.type === 'percent') {\n            func = utils.formatPercent;\n        }\n        return func;\n    },\n\n    /** Get formatter used for inputs\r\n        @static */\n    getInputFormatter: function getInputFormatter(column, locale) {\n        var func = utils.formatText;\n        if (column.type === 'numeric') {\n            func = utils.formatNumber;\n        } else if (column.type === 'monetary') {\n            func = utils.formatFloatNumberComma;\n        } else if (column.type === 'date') {\n            func = utils.formatDateInput(locale);\n        }\n        return func;\n    },\n\n    /* === Text related === */\n    /** Capitalize string.\r\n     *  @param {string} str * @return {string} * @static */\n    capitalize: function capitalize(str) {\n        return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n\n    /** Strips whitespace from beginning and end of a string. */\n    strip: function strip(str) {\n        return str.replace(/^\\s+|\\s+$/g, '');\n    },\n\n    /** @static */\n    formatText: function formatText(value) {\n        return value;\n    },\n\n    /** @static */\n    formatTextForTable: function formatTextForTable(value) {\n        if (value == null) {\n            return '';\n        }\n        return (value + '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n    },\n\n    /** @static\r\n        function to enable future localization\r\n    */\n    tr: function tr(x) {\n        return x;\n    },\n\n    /* === Number Related === */\n    numberSuffix: {\n        k: 1e3,\n        m: 1e6,\n        mil: 1e6,\n        million: 1e6,\n        b: 1e9,\n        billion: 1e9\n    },\n    /** @static */\n    parseNumber: function parseNumber(value) {\n        var matchResult = void 0;\n        if (value !== null && value !== undefined) {\n            // Allow negative numbers to be presented as numbers wrapped in parens\n            matchResult = value.match(/^\\s*\\((.*)\\)\\s*$/);\n            if (matchResult) {\n                value = '-' + matchResult[1];\n            }\n            // Remove thousands delimiters and regex match\n            matchResult = value.replace(/,/g, '').match(/(\\-?[\\d.,]+)\\s*([\\w]*)/);\n            if (matchResult) {\n                return parseFloat(matchResult[1]) * (utils.numberSuffix[matchResult[2].toLowerCase()] || 1);\n            }\n        }\n        return '';\n    },\n\n    /** @static */\n    formatNumberComma: function formatNumberComma(value) {\n        if (value !== null && value !== undefined) {\n            value = parseInt(value, 10);\n            if (!_lodash2.default.isNaN(value)) {\n                return ('' + value).replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n            }\n        }\n        return '';\n    },\n\n    /** @static */\n    formatFloatNumberComma: function formatFloatNumberComma(value) {\n        if (value !== null && value !== undefined) {\n            value = parseFloat(value);\n            if (!_lodash2.default.isNaN(value)) {\n                return value.toFixed(2).replace(/(\\d)(?=(\\d{3})+[\\.$])/g, '$1,');\n            }\n        }\n        return '';\n    },\n\n    /** @static */\n    formatNumber: function formatNumber(value) {\n        if (value !== null && value !== undefined) {\n            return '' + value;\n        }\n        return '';\n    },\n\n    /* === Money related === */\n    /** @static */\n    parseMonetary: function parseMonetary(x) {\n        return utils.parseNumber(x);\n    },\n\n    /** @static */\n    translateAccountingFloat: function translateAccountingFloat(value) {\n        var valStr = Math.abs(value).toFixed(2).replace(/(\\d)(?=(\\d{3})+[\\.$])/g, '$1,');\n        return value < 0 ? '(' + valStr + ')' : valStr;\n    },\n\n    /** @static */\n    formatMonetary: function formatMonetary(value) {\n        if (value !== null && value !== undefined) {\n            value = parseFloat(value);\n            if (!_lodash2.default.isNaN(value)) {\n                return utils.translateAccountingFloat(value);\n            }\n        }\n        return '';\n    },\n\n    /* === Date related === */\n    // 'L' is the locale version of 'MM/DD/YYYY' for moment\n    DATE_FORMAT: 'L',\n    /** @static */\n    parseDate: function parseDate(x, format) {\n        var val = format ? (0, _moment2.default)(x, format) : (0, _moment2.default)(x);\n        return val.isValid() ? val.format('YYYY-MM-DD') : '';\n    },\n    localeDateStringToMoment: function localeDateStringToMoment(dateString, locale) {\n        var m = (0, _moment2.default)();\n        m.locale(locale);\n        var format = m.localeData().longDateFormat(utils.DATE_FORMAT);\n        var localeM = (0, _moment2.default)(dateString, format, locale);\n        return localeM;\n    },\n    momentToLocaleDate: function momentToLocaleDate(m, locale) {\n        var usM = m.clone();\n        usM.locale(locale);\n        return usM.toDate();\n    },\n\n    /** @static */\n    formatDate: function formatDate() {\n        var locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en_US';\n\n        return function (value) {\n            if (value) {\n                var vm = (0, _moment2.default)(value, 'YYYY-MM-DDTHH:mm:ss.SSS');\n                if (vm.isValid()) {\n                    vm.locale(locale);\n                    return vm.format(utils.DATE_FORMAT);\n                }\n            }\n            return '';\n        };\n    },\n\n    /** @static */\n    formatDateInput: function formatDateInput() {\n        var locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en_US';\n\n        return function (value, resolution) {\n            if (value && !_lodash2.default.isBoolean(value) && value.indexOf('/') !== -1) {\n                resolution = utils.DATE_FORMAT;\n            } else {\n                resolution = resolution || 'YYYY-MM-DD';\n            }\n            if (value) {\n                var vm = (0, _moment2.default)(value, resolution);\n                if (vm.isValid()) {\n                    vm.locale(locale);\n                    var d = vm.format(utils.DATE_FORMAT);\n                    return d;\n                }\n            }\n            return '';\n        };\n    },\n\n    /* === Percent related === */\n    /** @static */\n    parsePercent: function parsePercent(val) {\n        var matchResult = val.trim().match(/^(\\d*\\.?\\d+)(%?)$/);\n        if (matchResult) {\n            var res = matchResult[1];\n            if (matchResult[2]) {\n                res = res / 100;\n            }\n            return res;\n        }\n        return '';\n    },\n\n    /** @static */\n    formatPercent: function formatPercent(value) {\n        if (value !== null && value !== undefined) {\n            value = parseFloat(value);\n            if (!_lodash2.default.isNaN(value)) {\n                return (value * 100).toFixed(2) + '%';\n            }\n        }\n        return '';\n    },\n    stringComparator: function stringComparator(a, b) {\n        var aLabel = a.label;\n        var bLabel = b.label;\n        return aLabel === bLabel ? 0 : aLabel < bLabel ? -1 : 1;\n    },\n    stringComparatorReverse: function stringComparatorReverse(a, b) {\n        return -1 * utils.stringComparator(a, b);\n    }\n};\nexports.default = utils;\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar OgApi = __webpack_require__(830);\nvar retry = __webpack_require__(834);\n\nexports.OgApi = OgApi;\nexports.core = new OgApi(Object({\"NODE_ENV\":\"production\"}).npm_package_config_ogApi_core || '/api/v1');\nexports.entitydata = new OgApi(Object({\"NODE_ENV\":\"production\"}).npm_package_config_ogApi_entitydata || '/api/entitydata/v1');\nexports.tapi = new OgApi(Object({\"NODE_ENV\":\"production\"}).npm_package_config_ogApi_tapi || '/api/transparency/v1');\nexports.trapi = new OgApi(Object({\"NODE_ENV\":\"production\"}).npm_package_config_ogApi_trapi || '/api/transactions/v1');\n\nexports.get = exports.core.get.bind(exports.core);\nexports.post = exports.core.post.bind(exports.core);\nexports.put = exports.core.put.bind(exports.core);\nexports.del = exports.core.del.bind(exports.core);\n\nexports.core.use(retry());\nexports.tapi.use(retry());\nexports.trapi.use(retry());\n\nmodule.exports = exports;\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nvar objectAssign = __webpack_require__(1003);\n\n// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\nfunction compare(a, b) {\n  if (a === b) {\n    return 0;\n  }\n\n  var x = a.length;\n  var y = b.length;\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i];\n      y = b[i];\n      break;\n    }\n  }\n\n  if (x < y) {\n    return -1;\n  }\n  if (y < x) {\n    return 1;\n  }\n  return 0;\n}\nfunction isBuffer(b) {\n  if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {\n    return global.Buffer.isBuffer(b);\n  }\n  return !!(b != null && b._isBuffer);\n}\n\n// based on node assert, original notice:\n// NB: The URL to the CommonJS spec is kept just for tradition.\n//     node-assert has evolved a lot since then, both in API and behavior.\n\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = __webpack_require__(269);\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar pSlice = Array.prototype.slice;\nvar functionsHaveNames = (function () {\n  return function foo() {}.name === 'foo';\n}());\nfunction pToString (obj) {\n  return Object.prototype.toString.call(obj);\n}\nfunction isView(arrbuf) {\n  if (isBuffer(arrbuf)) {\n    return false;\n  }\n  if (typeof global.ArrayBuffer !== 'function') {\n    return false;\n  }\n  if (typeof ArrayBuffer.isView === 'function') {\n    return ArrayBuffer.isView(arrbuf);\n  }\n  if (!arrbuf) {\n    return false;\n  }\n  if (arrbuf instanceof DataView) {\n    return true;\n  }\n  if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {\n    return true;\n  }\n  return false;\n}\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\nvar regex = /\\s*function\\s+([^\\(\\s]*)\\s*/;\n// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js\nfunction getName(func) {\n  if (!util.isFunction(func)) {\n    return;\n  }\n  if (functionsHaveNames) {\n    return func.name;\n  }\n  var str = func.toString();\n  var match = str.match(regex);\n  return match && match[1];\n}\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  if (options.message) {\n    this.message = options.message;\n    this.generatedMessage = false;\n  } else {\n    this.message = getMessage(this);\n    this.generatedMessage = true;\n  }\n  var stackStartFunction = options.stackStartFunction || fail;\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  } else {\n    // non v8 browsers so we can have a stacktrace\n    var err = new Error();\n    if (err.stack) {\n      var out = err.stack;\n\n      // try to strip useless frames\n      var fn_name = getName(stackStartFunction);\n      var idx = out.indexOf('\\n' + fn_name);\n      if (idx >= 0) {\n        // once we have located the function frame\n        // we need to strip out everything before it (and its line)\n        var next_line = out.indexOf('\\n', idx + 1);\n        out = out.substring(next_line + 1);\n      }\n\n      this.stack = out;\n    }\n  }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction truncate(s, n) {\n  if (typeof s === 'string') {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\nfunction inspect(something) {\n  if (functionsHaveNames || !util.isFunction(something)) {\n    return util.inspect(something);\n  }\n  var rawname = getName(something);\n  var name = rawname ? ': ' + rawname : '';\n  return '[Function' +  name + ']';\n}\nfunction getMessage(self) {\n  return truncate(inspect(self.actual), 128) + ' ' +\n         self.operator + ' ' +\n         truncate(inspect(self.expected), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n  if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected, strict, memos) {\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n  } else if (isBuffer(actual) && isBuffer(expected)) {\n    return compare(actual, expected) === 0;\n\n  // 7.2. If the expected value is a Date object, the actual value is\n  // equivalent if it is also a Date object that refers to the same time.\n  } else if (util.isDate(actual) && util.isDate(expected)) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3 If the expected value is a RegExp object, the actual value is\n  // equivalent if it is also a RegExp object with the same source and\n  // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n    return actual.source === expected.source &&\n           actual.global === expected.global &&\n           actual.multiline === expected.multiline &&\n           actual.lastIndex === expected.lastIndex &&\n           actual.ignoreCase === expected.ignoreCase;\n\n  // 7.4. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if ((actual === null || typeof actual !== 'object') &&\n             (expected === null || typeof expected !== 'object')) {\n    return strict ? actual === expected : actual == expected;\n\n  // If both values are instances of typed arrays, wrap their underlying\n  // ArrayBuffers in a Buffer each to increase performance\n  // This optimization requires the arrays to have the same type as checked by\n  // Object.prototype.toString (aka pToString). Never perform binary\n  // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their\n  // bit patterns are not identical.\n  } else if (isView(actual) && isView(expected) &&\n             pToString(actual) === pToString(expected) &&\n             !(actual instanceof Float32Array ||\n               actual instanceof Float64Array)) {\n    return compare(new Uint8Array(actual.buffer),\n                   new Uint8Array(expected.buffer)) === 0;\n\n  // 7.5 For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else if (isBuffer(actual) !== isBuffer(expected)) {\n    return false;\n  } else {\n    memos = memos || {actual: [], expected: []};\n\n    var actualIndex = memos.actual.indexOf(actual);\n    if (actualIndex !== -1) {\n      if (actualIndex === memos.expected.indexOf(expected)) {\n        return true;\n      }\n    }\n\n    memos.actual.push(actual);\n    memos.expected.push(expected);\n\n    return objEquiv(actual, expected, strict, memos);\n  }\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b, strict, actualVisitedObjects) {\n  if (a === null || a === undefined || b === null || b === undefined)\n    return false;\n  // if one is a primitive, the other must be same\n  if (util.isPrimitive(a) || util.isPrimitive(b))\n    return a === b;\n  if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))\n    return false;\n  var aIsArgs = isArguments(a);\n  var bIsArgs = isArguments(b);\n  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n    return false;\n  if (aIsArgs) {\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b, strict);\n  }\n  var ka = objectKeys(a);\n  var kb = objectKeys(b);\n  var key, i;\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length !== kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] !== kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))\n      return false;\n  }\n  return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);\n  }\n}\n\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n    return expected.test(actual);\n  }\n\n  try {\n    if (actual instanceof expected) {\n      return true;\n    }\n  } catch (e) {\n    // Ignore.  The instanceof check doesn't work for arrow functions.\n  }\n\n  if (Error.isPrototypeOf(expected)) {\n    return false;\n  }\n\n  return expected.call({}, actual) === true;\n}\n\nfunction _tryBlock(block) {\n  var error;\n  try {\n    block();\n  } catch (e) {\n    error = e;\n  }\n  return error;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (typeof block !== 'function') {\n    throw new TypeError('\"block\" argument must be a function');\n  }\n\n  if (typeof expected === 'string') {\n    message = expected;\n    expected = null;\n  }\n\n  actual = _tryBlock(block);\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail(actual, expected, 'Missing expected exception' + message);\n  }\n\n  var userProvidedMessage = typeof message === 'string';\n  var isUnwantedException = !shouldThrow && util.isError(actual);\n  var isUnexpectedException = !shouldThrow && actual && !expected;\n\n  if ((isUnwantedException &&\n      userProvidedMessage &&\n      expectedException(actual, expected)) ||\n      isUnexpectedException) {\n    fail(actual, expected, 'Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws(true, block, error, message);\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {\n  _throws(false, block, error, message);\n};\n\nassert.ifError = function(err) { if (err) throw err; };\n\n// Expose a strict only variant of assert\nfunction strict(value, message) {\n  if (!value) fail(value, true, message, '==', strict);\n}\nassert.strict = objectAssign(strict, assert, {\n  equal: assert.strictEqual,\n  deepEqual: assert.deepStrictEqual,\n  notEqual: assert.notStrictEqual,\n  notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (hasOwn.call(obj, key)) keys.push(key);\n  }\n  return keys;\n};\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar format = __webpack_require__(269).format;\n\nfunction ValidationError(key, value /*, message, ...*/) {\n    this.message = (\n        (key ? key + ': ' : '') +\n        format.apply(format, Array.prototype.slice.call(arguments, 2))\n    );\n\n    if (value !== null && value !== undefined && value.__line__) {\n        this.line = value.__line__;\n    }\n}\n\nmodule.exports = ValidationError;\n\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Unlike js/util/browser.js, this code is written with the expectation\n * of a browser environment with a global 'window' object\n * @module browser\n * @private\n */\n\nexports.window = window;\n\n/**\n * Provides a function that outputs milliseconds: either performance.now()\n * or a fallback to Date.now()\n */\nmodule.exports.now = (function() {\n    if (window.performance &&\n        window.performance.now) {\n        return window.performance.now.bind(window.performance);\n    } else {\n        return Date.now.bind(Date);\n    }\n}());\n\nvar frame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n    return frame(fn);\n};\n\nvar cancel = window.cancelAnimationFrame ||\n    window.mozCancelAnimationFrame ||\n    window.webkitCancelAnimationFrame ||\n    window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n    cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n    if (!dur) {\n        fn.call(ctx, 1);\n        return null;\n    }\n\n    var abort = false,\n        start = module.exports.now();\n\n    function tick(now) {\n        if (abort) return;\n        now = module.exports.now();\n\n        if (now >= start + dur) {\n            fn.call(ctx, 1);\n        } else {\n            fn.call(ctx, (now - start) / dur);\n            exports.frame(tick);\n        }\n    }\n\n    exports.frame(tick);\n\n    return function() { abort = true; };\n};\n\n/**\n * Test if the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer would be used)\n * @return {boolean}\n */\nexports.supported = __webpack_require__(267);\n\nexports.hardwareConcurrency = navigator.hardwareConcurrency || 4;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n    get: function() { return window.devicePixelRatio; }\n});\n\nexports.supportsWebp = false;\n\nvar webpImgTest = document.createElement('img');\nwebpImgTest.onload = function() {\n    exports.supportsWebp = true;\n};\nwebpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n\nexports.supportsGeolocation = !!navigator.geolocation;\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getFiscalYearMinMaxRange = exports.mapUrlParamsToState = exports.parseDateParams = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // Summary Report ~= GL Report ¯\\_(ツ)_/¯\n\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _immutable = __webpack_require__(14);\n\nvar _budget_data = __webpack_require__(848);\n\nvar _budget_data2 = _interopRequireDefault(_budget_data);\n\nvar _report = __webpack_require__(254);\n\nvar _report2 = _interopRequireDefault(_report);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _athena_state = __webpack_require__(505);\n\nvar _athena_state2 = _interopRequireDefault(_athena_state);\n\nvar _uuid_converter = __webpack_require__(897);\n\nvar _uuid_converter2 = _interopRequireDefault(_uuid_converter);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _metric_data_constants = __webpack_require__(261);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _embed_utils = __webpack_require__(71);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction initialState() {\n    return (0, _immutable.fromJS)({\n        standalone: gon.standalone,\n        initialized: false,\n        loading: true,\n        graphLoading: true,\n        rebuilding: false,\n        breakdown: '',\n        versusView: null,\n        embed: (0, _embed_utils.getEmbedType)(),\n        isAnnotationsPanelOpen: false,\n        mask: window.gon.mask,\n        expandedNodes: {},\n        graphSize: { width: 1000, height: 500 },\n        yAxisScale: null,\n        reportAmountType: _numberTypes.numberTypes.dollar,\n        locale: 'en_US',\n        scales: {\n            actualValue: {\n                name: 'Actual Value',\n                description: 'No scaling applied'\n            },\n            perCapita: {\n                name: 'Per Capita',\n                description: 'Amounts scaled to dollars per person',\n                type: 'numeric',\n                value: null\n            },\n            inThousands: {\n                name: 'in Thousands',\n                description: 'Amounts scaled to thousands of dollars',\n                type: 'monetary',\n                value: 1e3\n            },\n            inMillions: {\n                name: 'in Millions',\n                description: 'Amounts scaled to millions of dollars',\n                type: 'monetary',\n                value: 1e6\n            }\n        },\n        metricData: {\n            data: {}\n        },\n        overlay: {\n            selected: [null],\n            available: [{ none: { metric_type: null, name: 'None' } }],\n            overlayCompatibleCharts: ['line', 'bar', 'stacked']\n        },\n        scale: {\n            selected: [null],\n            available: [{ none: { metric_type: null, name: 'None' } }]\n        },\n        filterPanels: {},\n        currentYearPeriod: 'years',\n        currentYearAmount: 'cumulative',\n        year: 0,\n        month: 0,\n        months: [],\n        years: [],\n        fiscalYearRange: [0, Infinity],\n        urlState: {\n            embed: (0, _embed_utils.getEmbedType)()\n        }\n    });\n}\nvar SummaryReportStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return initialState();\n    },\n\n    /**\r\n    * This function is called from:\r\n    * 1) summary_graph.hasDataSets\r\n    * 2) share_links.\r\n    * 3) summary_report.handleRenderData\r\n    * 4) summary_table.getViewData\r\n    * 5) download_menu.tableHeader\r\n    * wow, so many places call this function to get the same result.\r\n    * TODO: we should optimize these calls so that when data is rendered once, it stays in the state\r\n    * everybody who needs this data, gets it. Once we change any params, we re-render/re-calculate the data\r\n    * and update the state again.\r\n    */\n    getRenderedDataSets: function getRenderedDataSets() {\n        var state = this.getState();\n        var athenaState = state.get('athenaState');\n        var budgetData = state.get('budgetData');\n        var entity = athenaState.get('entity');\n        return budgetData.renderedDataSets(this.getState(), entity.fiscal_year_start_month);\n    },\n    getRenderedData: function getRenderedData(limit, expand) {\n        var state = this.getState().set('amountUnit', this.getAmountUnit()); // We need to inject the amount unit being used here for budget data to the right precision for amount values.\n        var athenaState = state.get('athenaState');\n        var entity = athenaState.get('entity');\n        return athenaState.renderedData(state, entity.fiscal_year_start_month, !limit, limit, expand);\n    },\n    getVersusViews: function getVersusViews() {\n        var budgetData = this.getState().get('budgetData');\n        if (!budgetData) return (0, _immutable.List)();\n        var visibleAccounts = _lodash2.default.keyBy(budgetData.visibleAccounts, 'id');\n        return _strings2.default.versusViewsStrings().filter(function (view) {\n            return view.get('trees').every(function (tree) {\n                return visibleAccounts[tree];\n            });\n        });\n    },\n\n    // deprecated\n    getAmountType: function getAmountType() {\n        return this.getReportAmountType().isCurrency ? 'currency' : 'float';\n    },\n    getReportAmountType: function getReportAmountType() {\n        return this.getState().get('reportAmountType');\n    },\n\n    // deprecated\n    getAmountUnit: function getAmountUnit() {\n        return this.getState().get('reportAmountType').get('symbol');\n    },\n    getFilterPanels: function getFilterPanels() {\n        var filterPanels = this.getState().get('filterPanels');\n        var budgetData = this.getState().get('budgetData');\n        if (!budgetData) {\n            return (0, _immutable.List)();\n        }\n        return (0, _immutable.fromJS)(budgetData.breakdowns.map(function (breakdown) {\n            var id = breakdown.get('id');\n            var tree = budgetData.trees[breakdown.id];\n            var visible = (breakdown.id === 'types' || tree.visible) && breakdown.get('visible');\n            return { id: id, name: breakdown.get('name'), visible: visible, isOpen: filterPanels.get(id) };\n        }));\n    },\n\n    /**\r\n    * NOTE: remember to do a snake style property names here because we are persisting it into Rails\r\n    */\n    generateSummaryReportState: function generateSummaryReportState() {\n        var state = this.getState();\n        var athenaState = state.get('athenaState');\n        var budgetData = state.get('budgetData');\n        var breakdown = budgetData.breakdowns.get(state.get('breakdown'));\n        var fiscalYearRangeStart = state.getIn(['fiscalYearRange', 0]);\n        var fiscalYearRangeEnd = state.getIn(['fiscalYearRange', 1]);\n        var changingProps = {\n            breakdown_id: breakdown && breakdown.toHash(),\n            ledger: state.getIn(['versusView', 'id']) || state.get('accountType'),\n            graph: athenaState.get('graphType'),\n            selection: athenaState.get('selection'),\n            sort_order: athenaState.get('legendSort'),\n            current_year_period: state.get('currentYearPeriod'),\n            current_year_amount: state.get('currentYearAmount'),\n            proration: state.get('proration'),\n            projections: athenaState.get('projections'),\n            projection_type: athenaState.get('projectionType'),\n            highlighting: state.get('highlighting'),\n            highlighting_variance: state.get('highlightingVariance'),\n            fiscal_year_range: {\n                start: fiscalYearRangeStart === state.get('minYear') ? 'earliest' : fiscalYearRangeStart,\n                end: fiscalYearRangeEnd === state.get('maxYear') ? 'latest' : fiscalYearRangeEnd\n            },\n            saved_view: athenaState.get('saved_view'),\n            selected_data_set_index: athenaState.get('selectedDataSetIndex'),\n            // These state of these properties is not persisted to the URL by\n            // the component so we must saved them manually in the saved view.\n            scale: {\n                // toJS because `selected` is an array\n                selected: state.getIn(['scale', 'selected']).toJS()\n            },\n            y_axis_scale: state.get('yAxisScale') && state.get('yAxisScale').toJS(),\n            month: null,\n            year: null\n        };\n        // if we are in current year report, we should push month and year\n        // whatever we push here, is saved into the current saved view.\n        if (athenaState.get('report').get('technical_name') === 'ytd') {\n            // we push month only if it's not the last actual month\n            if (state.get('month') !== state.get('latestRange').get('month')) {\n                changingProps.month = state.get('month');\n            }\n            // we push year only if it's not the last year for the available actuals. I.e. if a user\n            // selected different year\n            if (state.get('year') !== state.get('latestRange').get('year')) {\n                changingProps.year = state.get('year');\n            }\n        }\n        return changingProps;\n    },\n    hashState: function hashState() {\n        var state = this.getState();\n        var athenaState = state.get('athenaState');\n        var budgetData = state.get('budgetData');\n        var year = state.get('year');\n        if (!budgetData) {\n            return {};\n        }\n        var accountType = state.getIn(['versusView', 'id']) || state.get('accountType');\n        var breakdown = budgetData.breakdowns.get(state.get('breakdown'));\n        var hash = {\n            accountType: accountType,\n            embed: (0, _embed_utils.getEmbedType)(),\n            breakdown: breakdown && breakdown.toHash(),\n            currentYearAmount: state.get('currentYearAmount'),\n            currentYearPeriod: state.get('currentYearPeriod'),\n            graph: athenaState.get('graphType'),\n            legendSort: athenaState.get('legendSort'),\n            month: state.get('month'),\n            proration: state.get('proration'),\n            saved_view: athenaState.get('saved_view'),\n            selection: athenaState.get('selection'),\n            projections: null,\n            projectionType: null,\n            highlighting: null,\n            highlightingVariance: null,\n            // To prevent an invalid fiscal year message\n            year: year,\n            selectedDataSetIndex: null,\n            fiscal_start: null,\n            fiscal_end: null\n        };\n        if (athenaState.get('projections')) {\n            hash.projections = athenaState.get('projections');\n            hash.projectionType = athenaState.get('projectionType');\n        }\n        if (state.get('highlighting')) {\n            hash.highlighting = state.get('highlighting');\n            hash.highlightingVariance = state.get('highlightingVariance');\n        }\n        if (hash.graph === 'pie') {\n            var defaultSelectedDataSetIndex = state.get('months').size;\n            if (hash.currentYearPeriod === 'years') {\n                defaultSelectedDataSetIndex = state.get('years').size;\n            }\n            hash.selectedDataSetIndex = athenaState.get('selectedDataSetIndex') || defaultSelectedDataSetIndex;\n        }\n        var fiscalYearRangeStart = state.getIn(['fiscalYearRange', 0]);\n        var fiscalYearRangeEnd = state.getIn(['fiscalYearRange', 1]);\n        /**\r\n        * wow, we never respected what current fiscal_start we had in the state.\r\n        */\n        hash.fiscal_start = fiscalYearRangeStart === state.get('minYear') ? 'earliest' : fiscalYearRangeStart;\n        hash.fiscal_end = fiscalYearRangeEnd === state.get('maxYear') ? 'latest' : fiscalYearRangeEnd;\n        return hash;\n    },\n    getDataError: function getDataError() {\n        var state = SummaryReportStore.getState();\n        var budgetData = state.get('budgetData');\n        var reportDataSets = _report_view_store2.default.getReportDataSets();\n        var hasMonthlyDataSets = reportDataSets && reportDataSets.some(function (dataSet) {\n            return dataSet.get('month') !== null;\n        });\n        if (_report_view_store2.default.isMonthlyReport() && !hasMonthlyDataSets) {\n            return 'DATA_ERROR_NO_MONTHLY_DATA_SETS';\n        }\n        var trees = budgetData.trees;\n\n        if (_report_view_store2.default.isBalanceSheetReport() && !trees.assets && !trees.liabilities) {\n            return 'DATA_ERROR_MISSING_BALANCE_SHEET_TREES';\n        }\n        var renderedDataSets = SummaryReportStore.getRenderedDataSets();\n        if (_lodash2.default.isEmpty(renderedDataSets)) {\n            return 'DATA_ERROR_NO_RENDERED_DATA_SETS';\n        }\n    },\n\n    actions: {\n        REPORT_STATE_RESET: function REPORT_STATE_RESET(state) {\n            var initialState = state.get('initialState');\n            /*\r\n                [aykutsimseks]\r\n                This is a quick and non-elegant fix for back & reset button behavior (GRA-410).\r\n                The root cause of the issue was, accoutType is expected to be \"types\" for \"revenuesVersusExpenses\" and \"balanceSheet\" type reports.\r\n                This requires us handling those cases back and forth seperately all over the code base, and needs further investigation for a permanent fix.\r\n                       See also: REPORT_GO_BACK\r\n             */\n            if (initialState.accountType == 'revenuesVersusExpenses' || initialState.accountType == 'balanceSheet') {\n                initialState.accountType = 'types';\n            }\n            var athenaState = state.get('athenaState');\n            athenaState.changeState(initialState);\n            var report = athenaState.report;\n            var locale = report ? report.get('locale') : initialState.get('locale');\n            var reportAmountType = (0, _numberTypes.accountTypeAndLocaleToNumberType)(state.get('accountType'), locale);\n            var mappedParams = mapUrlParamsToState(state, initialState);\n            var replaceState = mappedParams.merge(initialState, reportAmountType, (0, _immutable.fromJS)({ locale: locale }));\n            return state.merge(replaceState);\n        },\n        UPDATE_GRAPH_LOADING_STATUS: function UPDATE_GRAPH_LOADING_STATUS(state, _ref) {\n            var status = _ref.status;\n\n            return state.set('graphLoading', status);\n        },\n        REPORT_SET_INITIAL_STATE: function REPORT_SET_INITIAL_STATE(state, action) {\n            return state.set('initialState', action.initialState);\n        },\n        REPORT_TOGGLE_PRORATION: function REPORT_TOGGLE_PRORATION(state) {\n            return state.set('proration', !state.get('proration'));\n        },\n        REPORT_MIRROR_PROJECTIONS: function REPORT_MIRROR_PROJECTIONS(state) {\n            return state.set('projections', state.get('athenaState').get('projections'));\n        },\n        REPORT_MIRROR_PROJECTION_TYPE: function REPORT_MIRROR_PROJECTION_TYPE(state) {\n            return state.set('projectionType', state.get('athenaState').get('projectionType'));\n        },\n        REPORT_TOGGLE_HIGHLIGHTING_VARIANCE: function REPORT_TOGGLE_HIGHLIGHTING_VARIANCE(state) {\n            return state.set('highlighting', !state.get('highlighting'));\n        },\n        REPORT_SET_HIGHLIGHTING_VARIANCE: function REPORT_SET_HIGHLIGHTING_VARIANCE(state, action) {\n            return state.set('highlightingVariance', parseInt(action.highlightingVariance));\n        },\n\n        /**\r\n        * fired up from summary_report_actions.goBack\r\n        */\n        REPORT_GO_BACK: function REPORT_GO_BACK(state, action) {\n            /*\r\n                [aykutsimseks]\r\n                This is a quick and non-elegant fix for back & reset button behavior (GRA-410).\r\n                The root cause of the issue was, accoutType is expected to be \"types\" for \"revenuesVersusExpenses\" and \"balanceSheet\" reports.\r\n                This requires us handling those cases back and forth seperately all over the code base, and needs further investigation for a permanent fix.\r\n                       See also: REPORT_STATE_RESET\r\n             */\n            var previousState = (0, _immutable.fromJS)(action.previousState);\n            if (previousState.get('accountType') == 'revenuesVersusExpenses' || previousState.get('accountType') == 'balanceSheet') {\n                previousState = previousState.set('accountType', 'types');\n            }\n            return state.merge(previousState);\n        },\n        REPORT_GET_AGGREGATIONS_SUCCESS: function REPORT_GET_AGGREGATIONS_SUCCESS(state, action) {\n            var budgetData = state.get('budgetData');\n            if (action.aggregations.checked_nodes) {\n                budgetData.deselectAll();\n                budgetData.selectNodes(action.aggregations.checked_nodes);\n            }\n            var activeAnnotations = budgetData.filterActiveAnnotations(state, state.get('breakdown'));\n            return state.mergeDeep((0, _immutable.fromJS)({\n                loading: false,\n                reportAmountType: generateReportAmountType(state.get('accountType')),\n                isAnnotationsPanelOpen: activeAnnotations.length ? state.get('isAnnotationsPanelOpen') : false\n            }));\n        },\n        REPORT_GET_ANNOTATIONS_SUCCESS: function REPORT_GET_ANNOTATIONS_SUCCESS(state, _ref2) {\n            var annotations = _ref2.annotations;\n\n            var budgetData = state.get('budgetData');\n            var nextState = state.set('annotations', annotations);\n            budgetData.filterActiveAnnotations(nextState, nextState.get('breakdown'));\n            return nextState;\n        },\n        SAVED_VIEW_SELECTED: function SAVED_VIEW_SELECTED(state, _ref3) {\n            var savedView = _ref3.savedView;\n\n            var yAxisScale = state.get('yAxisScale');\n            var savedViewYAxisScale = _lodash2.default.get(savedView, 'view_state.y_axis_scale');\n            if (!!yAxisScale !== !!savedViewYAxisScale) {\n                _lodash2.default.defer(function () {\n                    _summary_report_actions2.default.togglePerCapitaScale(true);\n                });\n            }\n        },\n        REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE: function REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE(state, _ref4) {\n            var range = _ref4.range;\n\n            return state.set('fiscalYearRange', (0, _immutable.List)([parseInt(range[0]) || state.get('minYear'), parseInt(range[1]) || state.get('maxYear')]));\n        },\n        REPORT_GET_PACKAGE: function REPORT_GET_PACKAGE(state, _ref5) {\n            var payloadEntity = _ref5.payloadEntity;\n\n            var reportData = _report_view_store2.default.getRenderedReport().toJS();\n            var report = new _report2.default(reportData);\n            report.parse(reportData);\n            var entity = _report_view_store2.default.getReportEntity().toJS();\n            var athenaState = new _athena_state2.default({\n                report: report,\n                entity: payloadEntity || entity\n            });\n            var storedInitialState = state.get('initialState') || null;\n            var locale = report.get('locale');\n            var reportAmountType = (0, _numberTypes.accountTypeAndLocaleToNumberType)(state.get('accountType'), locale);\n            return initialState().set('athenaState', athenaState).set('reportAmountType', reportAmountType).set('locale', locale).set('reportType', reportData.report_type).set('loading', true).set('graphLoading', true).set('initialized', false).set('isAnnotationsPanelOpen', false).set('yAxisScale', state.get('yAxisScale')).set('initialState', storedInitialState);\n        },\n        REPORT_GET_PACKAGE_SUCCESS: function REPORT_GET_PACKAGE_SUCCESS(state, _ref6) {\n            var pkg = _ref6.pkg,\n                urlParams = _ref6.urlParams;\n\n            var athenaState = state.get('athenaState');\n            var report = athenaState.get('report');\n            var entity = athenaState.get('entity');\n            var years = (0, _lodash2.default)(pkg.data_sets).map('year').sort().uniq().map(function (i) {\n                return parseInt(i);\n            }).value();\n            var minYear = _lodash2.default.min(years);\n            var maxYear = _lodash2.default.max(years);\n            var shouldShowAllMonths = report.get('report_type') === 'ytd' && state.get('currentYearPeriod') === 'years';\n            var months = shouldShowAllMonths ? monthsWithActuals(pkg.data_sets, entity.fiscal_year_start_month) : mostRecentMonthsWithActuals(pkg.data_sets, entity.fiscal_year_start_month);\n            var nodesForLinkage = pkg.nodes_for_linkage;\n            var masksForLinkage = pkg.masks_for_linkage;\n            var budgetData = new _budget_data2.default({\n                entity: athenaState.get('entity'),\n                report: athenaState.get('report'),\n                pkg: pkg,\n                mask: state.get('mask'),\n                store: SummaryReportStore\n            });\n            athenaState.initBudgetData(budgetData);\n            var filterPanels = budgetData.breakdowns.reduce(function (panels, breakdown) {\n                return _extends({}, panels, _defineProperty({}, breakdown.get('id'), false));\n            }, {});\n            var newState = state.mergeDeep((0, _immutable.fromJS)({\n                years: years,\n                minYear: minYear,\n                maxYear: maxYear,\n                months: months,\n                filterPanels: filterPanels\n            })).mergeDeep({\n                budgetData: budgetData,\n                pkg: pkg,\n                nodesForLinkage: nodesForLinkage,\n                masksForLinkage: masksForLinkage\n            });\n            var urlState = mapUrlParamsToState(newState, urlParams);\n            var month = urlState.get('month') !== 'latest' && urlState.get('month');\n            month = !!~months.indexOf(month) && month || (shouldShowAllMonths ? mostRecentMonthWithActuals(pkg.data_sets, entity.fiscal_year_start_month) : _lodash2.default.last(months));\n            var selectedYear = urlState.get('year') !== 'latest' && urlState.get('year') || mostRecentYearWithMonthlyActuals(pkg.data_sets);\n            var defaultState = getDefaultState(newState, report.get('properties'));\n            var fiscalYearRange = defaultState.fiscalYearRange,\n                defaultYear = defaultState.year;\n\n            var defaultFiscal = getFiscalYearRange(fiscalYearRange);\n            var urlFiscalStart = urlState.getIn(['fiscalYearRange', 0]) || null;\n            var urlFiscalEnd = urlState.getIn(['fiscalYearRange', 1]) || null;\n            var lastYearWithMonthlyActuals = mostRecentYearWithMonthlyActuals(pkg.data_sets);\n            var lastMonthOfLastYearWithMonthlyActuals = _lodash2.default.last(monthsWithActuals(pkg.data_sets, entity.fiscal_year_start_month, [lastYearWithMonthlyActuals]));\n            var fiscalYearStart = urlFiscalStart || defaultFiscal.fiscalStart || minYear;\n            var fiscalYearEnd = urlFiscalEnd || defaultFiscal.fiscalEnd || maxYear;\n            var startState = newState.mergeDeep((0, _immutable.fromJS)(defaultState)).mergeDeep((0, _immutable.fromJS)(urlState)).mergeDeep((0, _immutable.fromJS)({\n                latestRange: {\n                    month: lastMonthOfLastYearWithMonthlyActuals,\n                    year: lastYearWithMonthlyActuals\n                },\n                year: state.get('year') || selectedYear || defaultYear,\n                month: state.get('month') || month,\n                rebuilding: pkg.rebuilding\n            })).set('fiscalYearRange', (0, _immutable.List)([fiscalYearStart < minYear ? minYear : fiscalYearStart, fiscalYearEnd > maxYear ? maxYear : fiscalYearEnd]));\n            return startState;\n        },\n        REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS: function REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS(state) {\n            var filterPanels = state.get('filterPanels');\n            var isOpen = filterPanels.every(function (isOpen) {\n                return isOpen;\n            });\n            return state.update('filterPanels', function (filterPanels) {\n                return filterPanels.map(function () {\n                    return !isOpen;\n                });\n            });\n        },\n        REPORT_SUMMARY_TOGGLE_FILTER_PANEL: function REPORT_SUMMARY_TOGGLE_FILTER_PANEL(state, _ref7) {\n            var panelId = _ref7.panelId;\n\n            return state.updateIn(['filterPanels', panelId], function (isOpen) {\n                return !isOpen;\n            });\n        },\n        REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS: function REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS(state) {\n            return state.update('filterPanels', function (filterPanels) {\n                return filterPanels.map(function () {\n                    return false;\n                });\n            });\n        },\n        REPORT_VIEW_OPEN_ANNOTATIONS_PANEL: function REPORT_VIEW_OPEN_ANNOTATIONS_PANEL(state) {\n            return state.set('isAnnotationsPanelOpen', true);\n        },\n        REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL: function REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL(state) {\n            return state.set('isAnnotationsPanelOpen', false);\n        },\n        REPORT_SUMMARY_TOGGLE_NODE: function REPORT_SUMMARY_TOGGLE_NODE(state, action) {\n            var path = ['expandedNodes', action.nodeId];\n            if (state.getIn(path)) {\n                return state.removeIn(path);\n            } else {\n                return state.setIn(path, 'pending');\n            }\n        },\n        REPORT_GRAPH_RESIZE: function REPORT_GRAPH_RESIZE(state, action) {\n            return state.setIn(['graphSize', 'width'], action.width).setIn(['graphSize', 'height'], action.height);\n        },\n        REPORT_TOGGLE_PER_CAPITA_SCALE: function REPORT_TOGGLE_PER_CAPITA_SCALE(state) {\n            var perCapita = state.getIn(['scales', 'perCapita']);\n            if (state.getIn(['scale', 'selected', 0]) === 'population') {\n                return state.set('yAxisScale', null).setIn(['scale', 'selected'], (0, _immutable.fromJS)([null]));\n            }\n            return state.setIn(['scale', 'selected'], (0, _immutable.fromJS)(['population'])).set('yAxisScale', perCapita);\n        },\n        REPORT_SUMMARY_EXPANDED_NODES: function REPORT_SUMMARY_EXPANDED_NODES(state, action) {\n            if (_lodash2.default.isArray(action.nodes)) {\n                action.nodes = _lodash2.default.zipObject(action.nodes, _lodash2.default.map(action.nodes, function () {\n                    return action.loaded ? 'expanded' : 'pendingAll';\n                }));\n            } else if (action.nodes == null) {\n                action.nodes = {};\n            }\n            return state.set('expandedNodes', (0, _immutable.fromJS)(action.nodes));\n        },\n        REPORT_SET_BREAKDOWN: function REPORT_SET_BREAKDOWN(state, action) {\n            var athenaState = state.get('athenaState');\n            athenaState.set('breakdown', action.breakdownId);\n            return state.set('breakdown', action.breakdownId);\n        },\n        REPORT_SET_ACCOUNT_TYPE: function REPORT_SET_ACCOUNT_TYPE(state, action) {\n            return state.set('accountType', action.accountTypeId).set('versusView', null).set('reportAmountType', generateReportAmountType(action.accountTypeId));\n        },\n        REPORT_SET_VERSUS_VIEW: function REPORT_SET_VERSUS_VIEW(state, action) {\n            var versusView = _strings2.default.versusViewsStrings().find(function (view) {\n                return view.get('id') === action.versusViewId;\n            });\n            return state.set('versusView', versusView).set('accountType', 'types').set('breakdown', 'types');\n        },\n        REPORT_SET_MONTH: function REPORT_SET_MONTH(state, action) {\n            var athenaState = state.get('athenaState');\n            athenaState.set('month', action.month);\n            return state.set('month', action.month);\n        },\n        REPORT_SET_YEAR: function REPORT_SET_YEAR(state, action) {\n            return state.set('year', action.year);\n        },\n        REPORT_SET_OVERLAYS: function REPORT_SET_OVERLAYS(state, action) {\n            var selected = action.overlaysSelected;\n            var overlays = _lodash2.default.isArray(selected) ? selected : [selected];\n            return state.setIn(['overlay', 'selected'], (0, _immutable.fromJS)(overlays));\n        },\n        REPORT_SET_SCALE: function REPORT_SET_SCALE(state, action) {\n            var selected = action.scaleSelected;\n            var scale = _lodash2.default.isArray(selected) ? selected : [selected];\n            if (_lodash2.default.isNull(scale[0])) {\n                return state.setIn(['scale', 'selected'], (0, _immutable.fromJS)([null])).set('yAxisScale', null);\n            }\n            return state.setIn(['scale', 'selected'], (0, _immutable.fromJS)(scale));\n        },\n        REPORT_SET_METRIC_DATA: function REPORT_SET_METRIC_DATA(state, action) {\n            _lodash2.default.forEach(action.metricData, function (metric) {\n                _strings2.default.centsToDollars(metric, metric.years);\n            });\n            return state.mergeDeepIn(['metricData', 'data'], (0, _immutable.fromJS)(action.metricData));\n        },\n        REPORT_SET_METRICS_AVAILABLE: function REPORT_SET_METRICS_AVAILABLE(state, action) {\n            if (_lodash2.default.isUndefined(action.metricsAvailable)) {\n                return SummaryReportStore.actions.REPORT_METRICS_UNAVAILABLE(state);\n            } else {\n                //Currently the amount of metrics are limited\n                var metricsSorted = _lodash2.default.sortBy(action.metricsAvailable, function (metric) {\n                    if (metric.metric_type === 'population') {\n                        metric.name += ' (as reported by the US Census Bureau)';\n                    }\n                    if (metric.metric_type === 'population_served') {\n                        metric.name = 'Current Population (' + _strings2.default.currencyNoDollar(_lodash2.default.head(metric.years).value) + ' residents)';\n                    }\n                    return metric.name;\n                });\n                var metricsAllowed = _lodash2.default.filter(metricsSorted, function (metric) {\n                    return _lodash2.default.includes(_metric_data_constants.currentLimits, metric.metric_type) && metric.units !== '%';\n                });\n                metricsAllowed.unshift({ metric_type: null, name: 'None' });\n                var scalesAllowed = _lodash2.default.filter(metricsSorted, function (metric) {\n                    return _lodash2.default.includes(_metric_data_constants.scaleLimit, metric.metric_type);\n                });\n                scalesAllowed.unshift({ metric_type: null, name: 'None' });\n                return state.setIn(['overlay', 'available'], (0, _immutable.fromJS)(metricsAllowed)).setIn(['scale', 'available'], (0, _immutable.fromJS)(scalesAllowed));\n            }\n        },\n        REPORT_METRICS_UNAVAILABLE: function REPORT_METRICS_UNAVAILABLE(state) {\n            var unavailable = [{ metric_type: null, name: 'Unavailable' }];\n            return state.setIn(['overlay', 'available'], (0, _immutable.fromJS)(unavailable)).setIn(['scale', 'available'], (0, _immutable.fromJS)(unavailable));\n        },\n        REPORT_DRILL: function REPORT_DRILL(state, _ref8) {\n            var id = _ref8.id;\n\n            var budgetData = state.get('budgetData');\n            if (id === '_moreLine') {\n                return state;\n            }\n            if (state.get('accountType') === 'types') {\n                var node = budgetData.nodes[id];\n                var accountType = node && node.aggregationGroup || id;\n                return state.set('accountType', accountType).set('versusView', null);\n            }\n            budgetData.exclusiveSelect(id);\n        },\n        REPORT_NODE_TOGGLE_SELECT: function REPORT_NODE_TOGGLE_SELECT(state, action) {\n            var budgetData = state.get('budgetData');\n            budgetData.toggleSelect(action.id);\n        },\n        REPORT_NODE_EXCLUSIVE_SELECT: function REPORT_NODE_EXCLUSIVE_SELECT(state, action) {\n            var budgetData = state.get('budgetData');\n            budgetData.exclusiveSelect(action.id);\n        },\n        REPORT_TREE_SELECT: function REPORT_TREE_SELECT(state, action) {\n            var budgetData = state.get('budgetData');\n            budgetData.treeSelect(action.id);\n        },\n        REPORT_CHANGE_CURRENT_YEAR_PERIOD: function REPORT_CHANGE_CURRENT_YEAR_PERIOD(state, action) {\n            var nextState = state;\n            // Proration is disabled when viewing months over months cumulatively\n            if (nextState.get('currentYearAmount') === 'cumulative' && action.period === 'months') {\n                nextState = nextState.set('proration', false);\n            }\n            // Projections are disabled when viewing yearly data\n            if (action.period === 'years') {\n                nextState = nextState.set('projections', false);\n            }\n            return nextState.set('currentYearPeriod', action.period);\n        },\n        REPORT_CHANGE_CURRENT_YEAR_AMOUNT: function REPORT_CHANGE_CURRENT_YEAR_AMOUNT(state, action) {\n            var nextState = state;\n            // Proration is disabled when viewing months over months cumulatively\n            if (nextState.get('currentYearPeriod') === 'months' && action.amount === 'cumulative') {\n                nextState = nextState.set('proration', false);\n            }\n            return nextState.set('currentYearAmount', action.amount);\n        },\n\n        /**\r\n        * basically we rely on URL params for the state\r\n        * This action is called from:\r\n        * 1) report_view.willTransitionTo\r\n        */\n        REPORT_UPDATE_URL_PARAMS: function REPORT_UPDATE_URL_PARAMS(state, action) {\n            var urlState = mapUrlParamsToState(state, action.params);\n            return state.merge(urlState);\n        }\n    }\n});\nfunction monthsWithActuals(dataSets, fiscalYearStartMonth) {\n    var years = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n    years = years || yearsWithMonthlyActuals(dataSets);\n    var months = (0, _lodash2.default)(dataSets).filter(function (ds) {\n        return ds.month && years.indexOf(parseInt(ds.year)) >= 0 && ds.type === 'actual';\n    }).map('month').map(function (i) {\n        return parseInt(i);\n    }).uniq().sortBy(function (month) {\n        return monthAsFiscalYearOffset(month, fiscalYearStartMonth);\n    }).value();\n    return months;\n}\n//This gets the last month that has actual data\nfunction mostRecentMonthWithActuals(dataSets, fiscalYearStartMonth) {\n    return _lodash2.default.last(mostRecentMonthsWithActuals(dataSets, fiscalYearStartMonth));\n}\nfunction mostRecentMonthsWithActuals(dataSets, fiscalYearStartMonth) {\n    var year = mostRecentYearWithMonthlyActuals(dataSets);\n    return monthsWithActuals(dataSets, fiscalYearStartMonth, [year]);\n}\nfunction yearsWithMonthlyActuals(dataSets) {\n    return _lodash2.default.reduce(dataSets, function (years, ds) {\n        if (ds.month && ds.type === 'actual') {\n            years.push(ds.year);\n        }\n        return years;\n    }, []);\n}\nfunction mostRecentYearWithMonthlyActuals(dataSets) {\n    var years = yearsWithMonthlyActuals(dataSets);\n    // Added safety here because if years === [] this will return NaN\n    if (years && years.length > 0) {\n        return parseInt(_lodash2.default.max(years));\n    }\n    return null;\n}\nfunction monthAsFiscalYearOffset(month, fiscalYearStartMonth) {\n    if (!fiscalYearStartMonth) {\n        throw new Error('Cannot calculate month as of fiscal year without fiscal year start month');\n    }\n    return (12 + month - fiscalYearStartMonth) % 12 + 1;\n}\nfunction generateReportAmountType(accountType) {\n    return (0, _numberTypes.accountTypeAndLocaleToNumberType)(accountType, _report_view_store2.default.getRenderedReport().get('locale'));\n}\nfunction getDefaultState(state, props) {\n    var defaults = {};\n    var budgetData = state.get('budgetData');\n    if (props.fiscal_year_range) {\n        defaults.fiscalYearRange = validFiscalYearRange(state, [props.fiscal_year_range.start, props.fiscal_year_range.end]);\n    } else {\n        defaults.fiscalYearRange = [state.get('minYear'), state.get('maxYear')];\n    }\n    defaults.currentYearPeriod = validCurrentYearPeriod(props.current_year_period);\n    defaults.currentYearAmount = validCurrentYearAmount(props.current_year_amount);\n    defaults.year = validYear(state, props.year);\n    defaults.month = validMonth(state, props.month);\n    var accountType = state.get('accountType') || props.ledger;\n    if (!accountType || accountType === 'types') {\n        var visibleAccounts = _lodash2.default.keyBy(budgetData.visibleAccounts, 'id');\n        defaults.versusView = _strings2.default.versusViewsStrings().find(function (view) {\n            return view.get('trees').every(function (tree) {\n                return visibleAccounts[tree];\n            });\n        });\n    } else {\n        defaults.versusView = _strings2.default.versusViewsStrings().find(function (view) {\n            return view.get('id') === accountType;\n        });\n    }\n    if (defaults.versusView) {\n        defaults.accountType = 'types';\n        defaults.breakdown = 'types';\n    } else {\n        defaults.accountType = accountType || _lodash2.default.result(_lodash2.default.head(budgetData.visibleAccounts), 'id');\n        defaults.breakdown = (0, _uuid_converter2.default)(props.breakdown_id) || 'types';\n    }\n    defaults.reportAmountType = generateReportAmountType(defaults.accountType);\n    var intialState = SummaryReportStore.getInitialState().toJS();\n    defaults.metricData = intialState.metricData;\n    defaults.overlay = intialState.overlay;\n    defaults.scale = intialState.scale;\n    // if proration setting is intentionally disabled use that, otherwise enabled by default\n    defaults.proration = props.proration === false ? false : true;\n    defaults.projections = props.projections === true;\n    defaults.projectionType = props.projection_type || 'auto_year_avg';\n    defaults.highlighting = props.highlighting === true;\n    defaults.highlightingVariance = ~~props.highlighting_variance || 10;\n    return defaults;\n}\nfunction validCurrentYearPeriod(period) {\n    return _lodash2.default.includes(['months', 'years'], period) ? period : 'years';\n}\nfunction validCurrentYearAmount(amount) {\n    return _lodash2.default.includes(['cumulative', 'monthly'], amount) ? amount : 'cumulative';\n}\nfunction validMonth(state, month) {\n    var months = state.get('months').toArray();\n    return _lodash2.default.includes(months, month) ? month : _lodash2.default.last(months);\n}\nfunction validYear(state, year) {\n    var years = state.get('years').toArray();\n    return _lodash2.default.includes(years, year) ? year : _lodash2.default.last(years);\n}\nfunction getFiscalYearRange(range) {\n    if (range && range[0] && range[1]) {\n        return { fiscalStart: range[0], fiscalEnd: range[1] };\n    }\n    return { fiscalStart: null, fiscalEnd: null };\n}\nfunction validFiscalYearRange(state, range) {\n    var iStart = parseInt(range[0]);\n    var iEnd = parseInt(range[1]);\n    var minYear = state.get('minYear');\n    var maxYear = state.get('maxYear');\n    var start = inRange(iStart, minYear, maxYear + 1) ? iStart : minYear;\n    var end = inRange(iEnd, minYear, maxYear + 1) ? iEnd : maxYear;\n    return [start < end ? start : end, end];\n}\nfunction inRange(n, low, high) {\n    return n >= low && n < high;\n}\n/**\r\n* year and month URL params might have 'latest' value, which will translate into the latest\r\n* present actuals in datasets.\r\n* NOTE: we don't want to return NaN\r\n*/\nvar parseDateParams = exports.parseDateParams = function parseDataParams(state, paramValue, paramName) {\n    if (paramValue && paramValue === 'latest' && state.get('latestRange')) {\n        return state.get('latestRange').get(paramName);\n    } else if (paramValue && !isNaN(parseInt(paramValue))) {\n        return parseInt(paramValue);\n    }\n    return null;\n};\n/**\r\n* this function is called on the initial report load and\r\n* whenever URL is updated either through the push state or manual user update.\r\n* It parses the passed URL params and replaces them again.\r\n*\r\n* ──────▄▀▄─────▄▀▄\r\n* ─────▄█░░▀▀▀▀▀░░█▄\r\n* ─▄▄──█░░░░░░░░░░░█──▄▄\r\n* █▄▄█─█░░▀░░┬░░▀░░█─█▄▄█\r\n*\r\n* it took me some time to find this animal.\r\n*/\nvar mapUrlParamsToState = exports.mapUrlParamsToState = function mapUrlParamsToState(state) {\n    var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var urlState = {\n        currentYearPeriod: !_lodash2.default.isEmpty(params.currentYearPeriod) ? params.currentYearPeriod : null,\n        currentYearAmount: !_lodash2.default.isEmpty(params.currentYearAmount) ? params.currentYearAmount : null,\n        year: parseDateParams(state, params.year, 'year'),\n        month: parseDateParams(state, params.month, 'month'),\n        breakdown: (0, _uuid_converter2.default)(params.breakdown)\n    };\n    urlState.selectedDataSetIndex = params.selectedDataSetIndex ? params.selectedDataSetIndex : state.get('selectedDataSetIndex');\n    if (params.projections) {\n        urlState.projections = _lodash2.default.get(params, 'projections', false) + '' === 'true';\n        urlState.projectionType = _lodash2.default.get(params, 'projectionType', 'auto_year_avg');\n    }\n    if (params.highlighting) {\n        urlState.highlighting = _lodash2.default.get(params, 'highlighting', false) + '' === 'true';\n        urlState.highlightingVariance = Math.min(parseInt(_lodash2.default.get(params, 'highlightingVariance', 10)), 9999);\n    }\n    var fiscalYearRange = [];\n    if (params.fiscal_start) {\n        fiscalYearRange[0] = getFiscalYearMinMaxRange(params.fiscal_start, params.currentYearPeriod, state.get('minYear'), 0, 'earliest');\n    }\n    if (params.fiscal_end) {\n        fiscalYearRange[1] = getFiscalYearMinMaxRange(params.fiscal_end, params.currentYearPeriod, state.get('maxYear'), Infinity, 'latest');\n    }\n    if (params.fiscal_start || params.fiscal_end) {\n        urlState.fiscalYearRange = fiscalYearRange;\n    }\n    if (params.embed) {\n        urlState.embed = params.embed;\n    }\n    if (params.accountType) {\n        urlState.accountType = params.accountType;\n        urlState.versusView = null;\n        if (params.accountType === 'types') {\n            urlState.versusView = findDefaultVersusView(state);\n        } else {\n            urlState.versusView = _strings2.default.versusViewsStrings().find(function (view) {\n                return view.get('id') === params.accountType;\n            });\n            if (urlState.versusView) {\n                urlState.accountType = 'types';\n            }\n        }\n    }\n    return (0, _immutable.fromJS)(urlState).filter(function (value, key) {\n        return key === 'versusView' || value != null;\n    });\n};\nvar getFiscalYearMinMaxRange = exports.getFiscalYearMinMaxRange = function getFiscalYearMinMaxRange(fiscalDate, representationFormat, minMaxYear, minMaxYearDefault, fiscalRangeValue) {\n    var fiscalYearValue = 0;\n    var isNumber = function isNumber(num) {\n        return !!num && !isNaN(num);\n    };\n    //params.representationFormat === 'months' indicates MoM view\n    //For MoM, reset the fiscal_start and fiscal_end so that we get the report data for all years\n    if (representationFormat === 'months') {\n        fiscalYearValue = minMaxYear || minMaxYearDefault;\n    } else {\n        //params.representationFormat === 'years' indicates YoY view\n        //For YoY, save the fiscal_start and fiscal_end\n        if (fiscalDate === fiscalRangeValue) {\n            fiscalYearValue = minMaxYear || minMaxYearDefault;\n        } else if (isNumber(fiscalDate)) {\n            fiscalYearValue = parseInt(fiscalDate);\n        }\n    }\n    return fiscalYearValue;\n};\nfunction findDefaultVersusView(state) {\n    var budgetData = state.get('budgetData');\n    if (!budgetData) {\n        return;\n    }\n    var visibleAccounts = _lodash2.default.keyBy(budgetData.visibleAccounts, 'id');\n    return _strings2.default.versusViewsStrings().find(function (view) {\n        return view.get('trees').every(function (tree) {\n            return visibleAccounts[tree];\n        });\n    });\n}\nexports.default = SummaryReportStore;\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Unlike js/util/browser.js, this code is written with the expectation\n * of a browser environment with a global 'window' object\n * @module browser\n * @private\n */\n\nexports.window = window;\n\n/**\n * Provides a function that outputs milliseconds: either performance.now()\n * or a fallback to Date.now()\n */\nmodule.exports.now = (function() {\n    if (window.performance &&\n        window.performance.now) {\n        return window.performance.now.bind(window.performance);\n    } else {\n        return Date.now.bind(Date);\n    }\n}());\n\nvar frame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n    return frame(fn);\n};\n\nvar cancel = window.cancelAnimationFrame ||\n    window.mozCancelAnimationFrame ||\n    window.webkitCancelAnimationFrame ||\n    window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n    cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n    if (!dur) {\n        fn.call(ctx, 1);\n        return null;\n    }\n\n    var abort = false,\n        start = module.exports.now();\n\n    function tick(now) {\n        if (abort) return;\n        now = module.exports.now();\n\n        if (now >= start + dur) {\n            fn.call(ctx, 1);\n        } else {\n            fn.call(ctx, (now - start) / dur);\n            exports.frame(tick);\n        }\n    }\n\n    exports.frame(tick);\n\n    return function() { abort = true; };\n};\n\n/**\n * Test if the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer would be used)\n * @return {boolean}\n */\nexports.supported = __webpack_require__(539);\n\nexports.hardwareConcurrency = navigator.hardwareConcurrency || 4;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n    get: function() { return window.devicePixelRatio; }\n});\n\nexports.supportsWebp = false;\n\nvar webpImgTest = document.createElement('img');\nwebpImgTest.onload = function() {\n    exports.supportsWebp = true;\n};\nwebpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n\nexports.supportsGeolocation = !!navigator.geolocation;\n\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar featureFilter = __webpack_require__(124);\nvar Buffer = __webpack_require__(151);\nvar util = __webpack_require__(10);\nvar StructArrayType = __webpack_require__(102);\nvar VertexArrayObject = __webpack_require__(152);\nvar assert = __webpack_require__(35);\n\nmodule.exports = Bucket;\n\n/**\n * Instantiate the appropriate subclass of `Bucket` for `options`.\n * @private\n * @param options See `Bucket` constructor options\n * @returns {Bucket}\n */\nBucket.create = function(options) {\n    var Classes = {\n        fill: __webpack_require__(1038),\n        line: __webpack_require__(1040),\n        circle: __webpack_require__(1041),\n        symbol: __webpack_require__(1042)\n    };\n    return new Classes[options.layer.type](options);\n};\n\n\n/**\n * The maximum extent of a feature that can be safely stored in the buffer.\n * In practice, all features are converted to this extent before being added.\n *\n * Positions are stored as signed 16bit integers.\n * One bit is lost for signedness to support featuers extending past the left edge of the tile.\n * One bit is lost because the line vertex buffer packs 1 bit of other data into the int.\n * One bit is lost to support features extending past the extent on the right edge of the tile.\n * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nBucket.EXTENT = 8192;\n\n/**\n * The `Bucket` class is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract class. A subclass exists for each Mapbox GL\n * style spec layer type. Because `Bucket` is an abstract class,\n * instances should be created via the `Bucket.create` method.\n *\n * @class Bucket\n * @private\n * @param options\n * @param {number} options.zoom Zoom level of the buffers being built. May be\n *     a fractional zoom level.\n * @param options.layer A Mapbox GL style layer object\n * @param {Object.<string, Buffer>} options.buffers The set of `Buffer`s being\n *     built for this tile. This object facilitates sharing of `Buffer`s be\n       between `Bucket`s.\n */\nfunction Bucket(options) {\n    this.zoom = options.zoom;\n    this.overscaling = options.overscaling;\n    this.layer = options.layer;\n    this.childLayers = options.childLayers;\n\n    this.type = this.layer.type;\n    this.features = [];\n    this.id = this.layer.id;\n    this.index = options.index;\n    this.sourceLayer = this.layer.sourceLayer;\n    this.sourceLayerIndex = options.sourceLayerIndex;\n    this.minZoom = this.layer.minzoom;\n    this.maxZoom = this.layer.maxzoom;\n\n    this.paintAttributes = createPaintAttributes(this);\n\n    if (options.arrays) {\n        var childLayers = this.childLayers;\n        this.bufferGroups = util.mapObject(options.arrays, function(programArrayGroups, programName) {\n            return programArrayGroups.map(function(programArrayGroup) {\n\n                var group = util.mapObject(programArrayGroup, function(arrays, layoutOrPaint) {\n                    return util.mapObject(arrays, function(array, name) {\n                        var arrayType = options.arrayTypes[programName][layoutOrPaint][name];\n                        var type = (arrayType.members.length && arrayType.members[0].name === 'vertices' ? Buffer.BufferType.ELEMENT : Buffer.BufferType.VERTEX);\n                        return new Buffer(array, arrayType, type);\n                    });\n                });\n\n                group.vaos = {};\n                if (group.layout.element2) group.secondVaos = {};\n                for (var l = 0; l < childLayers.length; l++) {\n                    var layerName = childLayers[l].id;\n                    group.vaos[layerName] = new VertexArrayObject();\n                    if (group.layout.element2) group.secondVaos[layerName] = new VertexArrayObject();\n                }\n\n                return group;\n            });\n        });\n    }\n}\n\n/**\n * Build the buffers! Features are set directly to the `features` property.\n * @private\n */\nBucket.prototype.populateBuffers = function() {\n    this.createArrays();\n    this.recalculateStyleLayers();\n\n    for (var i = 0; i < this.features.length; i++) {\n        this.addFeature(this.features[i]);\n    }\n\n    this.trimArrays();\n};\n\n/**\n * Check if there is enough space available in the current element group for\n * `vertexLength` vertices. If not, append a new elementGroup. Should be called\n * by `populateBuffers` and its callees.\n * @private\n * @param {string} programName the name of the program associated with the buffer that will receive the vertices\n * @param {number} vertexLength The number of vertices that will be inserted to the buffer.\n * @returns The current element group\n */\nBucket.prototype.makeRoomFor = function(programName, numVertices) {\n    var groups = this.arrayGroups[programName];\n    var currentGroup = groups.length && groups[groups.length - 1];\n\n    if (!currentGroup || currentGroup.layout.vertex.length + numVertices > 65535) {\n\n        var arrayTypes = this.arrayTypes[programName];\n        var VertexArrayType = arrayTypes.layout.vertex;\n        var ElementArrayType = arrayTypes.layout.element;\n        var ElementArrayType2 = arrayTypes.layout.element2;\n\n        currentGroup = {\n            index: groups.length,\n            layout: {},\n            paint: {}\n        };\n\n        currentGroup.layout.vertex = new VertexArrayType();\n        if (ElementArrayType) currentGroup.layout.element = new ElementArrayType();\n        if (ElementArrayType2) currentGroup.layout.element2 = new ElementArrayType2();\n\n        for (var i = 0; i < this.childLayers.length; i++) {\n            var layerName = this.childLayers[i].id;\n            var PaintVertexArrayType = arrayTypes.paint[layerName];\n            currentGroup.paint[layerName] = new PaintVertexArrayType();\n        }\n\n        groups.push(currentGroup);\n    }\n\n    return currentGroup;\n};\n\n/**\n * Start using a new shared `buffers` object and recreate instances of `Buffer`\n * as necessary.\n * @private\n */\nBucket.prototype.createArrays = function() {\n    this.arrayGroups = {};\n    this.arrayTypes = {};\n\n    for (var programName in this.programInterfaces) {\n        var programInterface = this.programInterfaces[programName];\n        var programArrayTypes = this.arrayTypes[programName] = { layout: {}, paint: {} };\n        this.arrayGroups[programName] = [];\n\n        if (programInterface.vertexBuffer) {\n            var VertexArrayType = new StructArrayType({\n                members: this.programInterfaces[programName].layoutAttributes,\n                alignment: Buffer.VERTEX_ATTRIBUTE_ALIGNMENT\n            });\n\n            programArrayTypes.layout.vertex = VertexArrayType;\n\n            var layerPaintAttributes = this.paintAttributes[programName];\n            for (var layerName in layerPaintAttributes) {\n                var PaintVertexArrayType = new StructArrayType({\n                    members: layerPaintAttributes[layerName].attributes,\n                    alignment: Buffer.VERTEX_ATTRIBUTE_ALIGNMENT\n                });\n\n                programArrayTypes.paint[layerName] = PaintVertexArrayType;\n            }\n        }\n\n        if (programInterface.elementBuffer) {\n            var ElementArrayType = createElementBufferType(programInterface.elementBufferComponents);\n            programArrayTypes.layout.element = ElementArrayType;\n        }\n\n        if (programInterface.elementBuffer2) {\n            var ElementArrayType2 = createElementBufferType(programInterface.elementBuffer2Components);\n            programArrayTypes.layout.element2 = ElementArrayType2;\n        }\n    }\n};\n\nBucket.prototype.destroy = function(gl) {\n    for (var programName in this.bufferGroups) {\n        var programBufferGroups = this.bufferGroups[programName];\n        for (var i = 0; i < programBufferGroups.length; i++) {\n            var programBuffers = programBufferGroups[i];\n            for (var paintBuffer in programBuffers.paint) {\n                programBuffers.paint[paintBuffer].destroy(gl);\n            }\n            for (var layoutBuffer in programBuffers.layout) {\n                programBuffers.layout[layoutBuffer].destroy(gl);\n            }\n            for (var j in programBuffers.vaos) {\n                programBuffers.vaos[j].destroy(gl);\n            }\n            for (var k in programBuffers.secondVaos) {\n                programBuffers.secondVaos[k].destroy(gl);\n            }\n        }\n    }\n\n};\n\nBucket.prototype.trimArrays = function() {\n    for (var programName in this.arrayGroups) {\n        var programArrays = this.arrayGroups[programName];\n        for (var paintArray in programArrays.paint) {\n            programArrays.paint[paintArray].trim();\n        }\n        for (var layoutArray in programArrays.layout) {\n            programArrays.layout[layoutArray].trim();\n        }\n    }\n};\n\nBucket.prototype.setUniforms = function(gl, programName, program, layer, globalProperties) {\n    var uniforms = this.paintAttributes[programName][layer.id].uniforms;\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        var uniformLocation = program[uniform.name];\n        gl['uniform' + uniform.components + 'fv'](uniformLocation, uniform.getValue(layer, globalProperties));\n    }\n};\n\nBucket.prototype.serialize = function() {\n    return {\n        layerId: this.layer.id,\n        zoom: this.zoom,\n        arrays: util.mapObject(this.arrayGroups, function(programArrayGroups) {\n            return programArrayGroups.map(function(arrayGroup) {\n                return util.mapObject(arrayGroup, function(arrays) {\n                    return util.mapObject(arrays, function(array) {\n                        return array.serialize();\n                    });\n                });\n            });\n        }),\n        arrayTypes: util.mapObject(this.arrayTypes, function(programArrayTypes) {\n            return util.mapObject(programArrayTypes, function(arrayTypes) {\n                return util.mapObject(arrayTypes, function(arrayType) {\n                    return arrayType.serialize();\n                });\n            });\n        }),\n\n        childLayerIds: this.childLayers.map(function(layer) {\n            return layer.id;\n        })\n    };\n};\n\nBucket.prototype.createFilter = function() {\n    if (!this.filter) {\n        this.filter = featureFilter(this.layer.filter);\n    }\n};\n\nvar FAKE_ZOOM_HISTORY = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\nBucket.prototype.recalculateStyleLayers = function() {\n    for (var i = 0; i < this.childLayers.length; i++) {\n        this.childLayers[i].recalculate(this.zoom, FAKE_ZOOM_HISTORY);\n    }\n};\n\nBucket.prototype.populatePaintArrays = function(interfaceName, globalProperties, featureProperties, startGroup, startIndex) {\n    for (var l = 0; l < this.childLayers.length; l++) {\n        var layer = this.childLayers[l];\n        var groups = this.arrayGroups[interfaceName];\n        for (var g = startGroup.index; g < groups.length; g++) {\n            var group = groups[g];\n            var length = group.layout.vertex.length;\n            var vertexArray = group.paint[layer.id];\n            vertexArray.resize(length);\n\n            var attributes = this.paintAttributes[interfaceName][layer.id].attributes;\n            for (var m = 0; m < attributes.length; m++) {\n                var attribute = attributes[m];\n\n                var value = attribute.getValue(layer, globalProperties, featureProperties);\n                var multiplier = attribute.multiplier || 1;\n                var components = attribute.components || 1;\n\n                for (var i = startIndex; i < length; i++) {\n                    var vertex = vertexArray.get(i);\n                    for (var c = 0; c < components; c++) {\n                        var memberName = components > 1 ? (attribute.name + c) : attribute.name;\n                        vertex[memberName] = value[c] * multiplier;\n                    }\n                }\n            }\n        }\n    }\n};\n\nfunction createElementBufferType(components) {\n    return new StructArrayType({\n        members: [{\n            type: Buffer.ELEMENT_ATTRIBUTE_TYPE,\n            name: 'vertices',\n            components: components || 3\n        }]\n    });\n}\n\nfunction createPaintAttributes(bucket) {\n    var attributes = {};\n    for (var interfaceName in bucket.programInterfaces) {\n        var layerPaintAttributes = attributes[interfaceName] = {};\n\n        for (var c = 0; c < bucket.childLayers.length; c++) {\n            var childLayer = bucket.childLayers[c];\n\n            layerPaintAttributes[childLayer.id] = {\n                attributes: [],\n                uniforms: [],\n                defines: [],\n                vertexPragmas: { define: {}, initialize: {} },\n                fragmentPragmas: { define: {}, initialize: {} }\n            };\n        }\n\n        var interface_ = bucket.programInterfaces[interfaceName];\n        if (!interface_.paintAttributes) continue;\n        for (var i = 0; i < interface_.paintAttributes.length; i++) {\n            var attribute = interface_.paintAttributes[i];\n            attribute.multiplier = attribute.multiplier || 1;\n\n            for (var j = 0; j < bucket.childLayers.length; j++) {\n                var layer = bucket.childLayers[j];\n                var paintAttributes = layerPaintAttributes[layer.id];\n\n                var attributeType = attribute.components === 1 ? 'float' : 'vec' + attribute.components;\n                var attributeInputName = attribute.name;\n                assert(attribute.name.slice(0, 2) === 'a_');\n                var attributeInnerName = attribute.name.slice(2);\n                var attributeVaryingDefinition;\n\n                paintAttributes.fragmentPragmas.initialize[attributeInnerName] = '';\n\n                // This token is replaced by the first argument to the pragma,\n                // which must be the attribute's precision (\"lowp\", \"mediump\",\n                // or \"highp\")\n                var attributePrecision = '{precision}';\n\n                if (layer.isPaintValueFeatureConstant(attribute.paintProperty)) {\n                    paintAttributes.uniforms.push(attribute);\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = paintAttributes.vertexPragmas.define[attributeInnerName] = [\n                        'uniform',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';';\n\n                    paintAttributes.fragmentPragmas.initialize[attributeInnerName] = paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName,\n                        '=',\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                } else if (layer.isPaintValueZoomConstant(attribute.paintProperty)) {\n                    paintAttributes.attributes.push(util.extend({}, attribute, {\n                        name: attributeInputName\n                    }));\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    var attributeAttributeDefinition = [\n                        paintAttributes.fragmentPragmas.define[attributeInnerName],\n                        'attribute',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + attributeAttributeDefinition;\n\n                    paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributeInnerName,\n                        '=',\n                        attributeInputName,\n                        '/',\n                        attribute.multiplier.toFixed(1)\n                    ].join(' ') + ';\\n';\n\n                } else {\n\n                    var tName = 'u_' + attributeInputName.slice(2) + '_t';\n                    var zoomLevels = layer.getPaintValueStopZoomLevels(attribute.paintProperty);\n\n                    // Pick the index of the first offset to add to the buffers.\n                    // Find the four closest stops, ideally with two on each side of the zoom level.\n                    var numStops = 0;\n                    while (numStops < zoomLevels.length && zoomLevels[numStops] < bucket.zoom) numStops++;\n                    var stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2));\n\n                    var fourZoomLevels = [];\n                    for (var s = 0; s < 4; s++) {\n                        fourZoomLevels.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]);\n                    }\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + [\n                        'uniform',\n                        'lowp',\n                        'float',\n                        tName\n                    ].join(' ') + ';\\n';\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.uniforms.push(util.extend({}, attribute, {\n                        name: tName,\n                        getValue: createGetUniform(attribute, stopOffset),\n                        components: 1\n                    }));\n\n                    var components = attribute.components;\n                    if (components === 1) {\n\n                        paintAttributes.attributes.push(util.extend({}, attribute, {\n                            getValue: createFunctionGetValue(attribute, fourZoomLevels),\n                            isFunction: true,\n                            components: components * 4\n                        }));\n\n                        paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                            'attribute',\n                            attributePrecision,\n                            'vec4',\n                            attributeInputName\n                        ].join(' ') + ';\\n';\n\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            '=',\n                            'evaluate_zoom_function_1(' + attributeInputName + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n\n                    } else {\n\n                        var attributeInputNames = [];\n                        for (var k = 0; k < 4; k++) {\n                            attributeInputNames.push(attributeInputName + k);\n                            paintAttributes.attributes.push(util.extend({}, attribute, {\n                                getValue: createFunctionGetValue(attribute, [fourZoomLevels[k]]),\n                                isFunction: true,\n                                name: attributeInputName + k\n                            }));\n                            paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                                'attribute',\n                                attributePrecision,\n                                attributeType,\n                                attributeInputName + k\n                            ].join(' ') + ';\\n';\n                        }\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            ' = ',\n                            'evaluate_zoom_function_4(' + attributeInputNames.join(', ') + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n                    }\n                }\n            }\n        }\n    }\n    return attributes;\n}\n\nfunction createFunctionGetValue(attribute, stopZoomLevels) {\n    return function(layer, globalProperties, featureProperties) {\n        if (stopZoomLevels.length === 1) {\n            // return one multi-component value like color0\n            return attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevels[0] }), featureProperties);\n        } else {\n            // pack multiple single-component values into a four component attribute\n            var values = [];\n            for (var z = 0; z < stopZoomLevels.length; z++) {\n                var stopZoomLevel = stopZoomLevels[z];\n                values.push(attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevel }), featureProperties)[0]);\n            }\n            return values;\n        }\n    };\n}\n\nfunction createGetUniform(attribute, stopOffset) {\n    return function(layer, globalProperties) {\n        // stopInterp indicates which stops need to be interpolated.\n        // If stopInterp is 3.5 then interpolate half way between stops 3 and 4.\n        var stopInterp = layer.getPaintInterpolationT(attribute.paintProperty, globalProperties.zoom);\n        // We can only store four stop values in the buffers. stopOffset is the number of stops that come\n        // before the stops that were added to the buffers.\n        return [Math.max(0, Math.min(4, stopInterp - stopOffset))];\n    };\n}\n\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar format = __webpack_require__(269).format;\n\nfunction ValidationError(key, value /*, message, ...*/) {\n    this.message = (\n        (key ? key + ': ' : '') +\n        format.apply(format, Array.prototype.slice.call(arguments, 2))\n    );\n\n    if (value !== null && value !== undefined && value.__line__) {\n        this.line = value.__line__;\n    }\n}\n\nmodule.exports = ValidationError;\n\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar featureFilter = __webpack_require__(124);\nvar ArrayGroup = __webpack_require__(1369);\nvar BufferGroup = __webpack_require__(1370);\nvar util = __webpack_require__(6);\nvar StructArrayType = __webpack_require__(104);\nvar assert = __webpack_require__(35);\n\nmodule.exports = Bucket;\n\n/**\n * Instantiate the appropriate subclass of `Bucket` for `options`.\n * @private\n * @param options See `Bucket` constructor options\n * @returns {Bucket}\n */\nBucket.create = function(options) {\n    var Classes = {\n        fill: __webpack_require__(1371),\n        line: __webpack_require__(1372),\n        circle: __webpack_require__(1373),\n        symbol: __webpack_require__(1374)\n    };\n    return new Classes[options.layer.type](options);\n};\n\n\n/**\n * The maximum extent of a feature that can be safely stored in the buffer.\n * In practice, all features are converted to this extent before being added.\n *\n * Positions are stored as signed 16bit integers.\n * One bit is lost for signedness to support featuers extending past the left edge of the tile.\n * One bit is lost because the line vertex buffer packs 1 bit of other data into the int.\n * One bit is lost to support features extending past the extent on the right edge of the tile.\n * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nBucket.EXTENT = 8192;\n\n/**\n * The `Bucket` class is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract class. A subclass exists for each Mapbox GL\n * style spec layer type. Because `Bucket` is an abstract class,\n * instances should be created via the `Bucket.create` method.\n *\n * @class Bucket\n * @private\n * @param options\n * @param {number} options.zoom Zoom level of the buffers being built. May be\n *     a fractional zoom level.\n * @param options.layer A Mapbox style layer object\n * @param {Object.<string, Buffer>} options.buffers The set of `Buffer`s being\n *     built for this tile. This object facilitates sharing of `Buffer`s be\n       between `Bucket`s.\n */\nfunction Bucket(options) {\n    this.zoom = options.zoom;\n    this.overscaling = options.overscaling;\n    this.layer = options.layer;\n    this.childLayers = options.childLayers;\n\n    this.type = this.layer.type;\n    this.features = [];\n    this.id = this.layer.id;\n    this.index = options.index;\n    this.sourceLayer = this.layer.sourceLayer;\n    this.sourceLayerIndex = options.sourceLayerIndex;\n    this.minZoom = this.layer.minzoom;\n    this.maxZoom = this.layer.maxzoom;\n\n    this.paintAttributes = createPaintAttributes(this);\n\n    if (options.arrays) {\n        var programInterfaces = this.programInterfaces;\n        this.bufferGroups = util.mapObject(options.arrays, function(programArrayGroups, programName) {\n            var programInterface = programInterfaces[programName];\n            var paintVertexArrayTypes = options.paintVertexArrayTypes[programName];\n            return programArrayGroups.map(function(arrayGroup) {\n                return new BufferGroup(arrayGroup, {\n                    layoutVertexArrayType: programInterface.layoutVertexArrayType.serialize(),\n                    elementArrayType: programInterface.elementArrayType && programInterface.elementArrayType.serialize(),\n                    elementArrayType2: programInterface.elementArrayType2 && programInterface.elementArrayType2.serialize(),\n                    paintVertexArrayTypes: paintVertexArrayTypes\n                });\n            });\n        });\n    }\n}\n\n/**\n * Build the arrays! Features are set directly to the `features` property.\n * @private\n */\nBucket.prototype.populateArrays = function() {\n    this.createArrays();\n    this.recalculateStyleLayers();\n\n    for (var i = 0; i < this.features.length; i++) {\n        this.addFeature(this.features[i]);\n    }\n\n    this.trimArrays();\n};\n\n/**\n * Check if there is enough space available in the current array group for\n * `vertexLength` vertices. If not, append a new array group. Should be called\n * by `populateArrays` and its callees.\n *\n * Array groups are added to this.arrayGroups[programName].\n *\n * @private\n * @param {string} programName the name of the program associated with the buffer that will receive the vertices\n * @param {number} vertexLength The number of vertices that will be inserted to the buffer.\n * @returns The current array group\n */\nBucket.prototype.prepareArrayGroup = function(programName, numVertices) {\n    var groups = this.arrayGroups[programName];\n    var currentGroup = groups.length && groups[groups.length - 1];\n\n    if (!currentGroup || !currentGroup.hasCapacityFor(numVertices)) {\n        currentGroup = new ArrayGroup({\n            layoutVertexArrayType: this.programInterfaces[programName].layoutVertexArrayType,\n            elementArrayType: this.programInterfaces[programName].elementArrayType,\n            elementArrayType2: this.programInterfaces[programName].elementArrayType2,\n            paintVertexArrayTypes: this.paintVertexArrayTypes[programName]\n        });\n\n        currentGroup.index = groups.length;\n\n        groups.push(currentGroup);\n    }\n\n    return currentGroup;\n};\n\n/**\n * Sets up `this.paintVertexArrayTypes` as { [programName]: { [layerName]: PaintArrayType, ... }, ... }\n *\n * And `this.arrayGroups` as { [programName]: [], ... }; these get populated\n * with array group structure over in `prepareArrayGroup`.\n *\n * @private\n */\nBucket.prototype.createArrays = function() {\n    this.arrayGroups = {};\n    this.paintVertexArrayTypes = {};\n\n    for (var programName in this.programInterfaces) {\n        this.arrayGroups[programName] = [];\n\n        var paintVertexArrayTypes = this.paintVertexArrayTypes[programName] = {};\n        var layerPaintAttributes = this.paintAttributes[programName];\n\n        for (var layerName in layerPaintAttributes) {\n            paintVertexArrayTypes[layerName] = new Bucket.VertexArrayType(layerPaintAttributes[layerName].attributes);\n        }\n    }\n};\n\nBucket.prototype.destroy = function(gl) {\n    for (var programName in this.bufferGroups) {\n        var programBufferGroups = this.bufferGroups[programName];\n        for (var i = 0; i < programBufferGroups.length; i++) {\n            programBufferGroups[i].destroy(gl);\n        }\n    }\n};\n\nBucket.prototype.trimArrays = function() {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            arrayGroups[i].trim();\n        }\n    }\n};\n\nBucket.prototype.isEmpty = function() {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            if (!arrayGroups[i].isEmpty()) {\n                return false;\n            }\n        }\n    }\n    return true;\n};\n\nBucket.prototype.getTransferables = function(transferables) {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            arrayGroups[i].getTransferables(transferables);\n        }\n    }\n};\n\nBucket.prototype.setUniforms = function(gl, programName, program, layer, globalProperties) {\n    var uniforms = this.paintAttributes[programName][layer.id].uniforms;\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        var uniformLocation = program[uniform.name];\n        gl['uniform' + uniform.components + 'fv'](uniformLocation, uniform.getValue(layer, globalProperties));\n    }\n};\n\nBucket.prototype.serialize = function() {\n    return {\n        layerId: this.layer.id,\n        zoom: this.zoom,\n        arrays: util.mapObject(this.arrayGroups, function(programArrayGroups) {\n            return programArrayGroups.map(function(arrayGroup) {\n                return arrayGroup.serialize();\n            });\n        }),\n        paintVertexArrayTypes: util.mapObject(this.paintVertexArrayTypes, function(arrayTypes) {\n            return util.mapObject(arrayTypes, function(arrayType) {\n                return arrayType.serialize();\n            });\n        }),\n\n        childLayerIds: this.childLayers.map(function(layer) {\n            return layer.id;\n        })\n    };\n};\n\nBucket.prototype.createFilter = function() {\n    if (!this.filter) {\n        this.filter = featureFilter(this.layer.filter);\n    }\n};\n\nvar FAKE_ZOOM_HISTORY = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\nBucket.prototype.recalculateStyleLayers = function() {\n    for (var i = 0; i < this.childLayers.length; i++) {\n        this.childLayers[i].recalculate(this.zoom, FAKE_ZOOM_HISTORY);\n    }\n};\n\nBucket.prototype.populatePaintArrays = function(interfaceName, globalProperties, featureProperties, startGroup, startIndex) {\n    for (var l = 0; l < this.childLayers.length; l++) {\n        var layer = this.childLayers[l];\n        var groups = this.arrayGroups[interfaceName];\n        for (var g = startGroup.index; g < groups.length; g++) {\n            var group = groups[g];\n            var length = group.layoutVertexArray.length;\n            var paintArray = group.paintVertexArrays[layer.id];\n            paintArray.resize(length);\n\n            var attributes = this.paintAttributes[interfaceName][layer.id].attributes;\n            for (var m = 0; m < attributes.length; m++) {\n                var attribute = attributes[m];\n\n                var value = attribute.getValue(layer, globalProperties, featureProperties);\n                var multiplier = attribute.multiplier || 1;\n                var components = attribute.components || 1;\n\n                var start = g === startGroup.index  ? startIndex : 0;\n                for (var i = start; i < length; i++) {\n                    var vertex = paintArray.get(i);\n                    for (var c = 0; c < components; c++) {\n                        var memberName = components > 1 ? (attribute.name + c) : attribute.name;\n                        vertex[memberName] = value[c] * multiplier;\n                    }\n                }\n            }\n        }\n    }\n};\n\n/**\n * A vertex array stores data for each vertex in a geometry. Elements are aligned to 4 byte\n * boundaries for best performance in WebGL.\n * @private\n */\nBucket.VertexArrayType = function (members) {\n    return new StructArrayType({\n        members: members,\n        alignment: 4\n    });\n};\n\n/**\n * An element array stores Uint16 indicies of vertexes in a corresponding vertex array. With no\n * arguments, it defaults to three components per element, forming triangles.\n * @private\n */\nBucket.ElementArrayType = function (components) {\n    return new StructArrayType({\n        members: [{\n            type: 'Uint16',\n            name: 'vertices',\n            components: components || 3\n        }]\n    });\n};\n\nfunction createPaintAttributes(bucket) {\n    var attributes = {};\n    for (var interfaceName in bucket.programInterfaces) {\n        var layerPaintAttributes = attributes[interfaceName] = {};\n\n        for (var c = 0; c < bucket.childLayers.length; c++) {\n            var childLayer = bucket.childLayers[c];\n\n            layerPaintAttributes[childLayer.id] = {\n                attributes: [],\n                uniforms: [],\n                defines: [],\n                vertexPragmas: { define: {}, initialize: {} },\n                fragmentPragmas: { define: {}, initialize: {} }\n            };\n        }\n\n        var interface_ = bucket.programInterfaces[interfaceName];\n        if (!interface_.paintAttributes) continue;\n\n        // These tokens are replaced by arguments to the pragma\n        // https://github.com/mapbox/mapbox-gl-shaders#pragmas\n        var attributePrecision = '{precision}';\n        var attributeType = '{type}';\n\n        for (var i = 0; i < interface_.paintAttributes.length; i++) {\n            var attribute = interface_.paintAttributes[i];\n            attribute.multiplier = attribute.multiplier || 1;\n\n            for (var j = 0; j < bucket.childLayers.length; j++) {\n                var layer = bucket.childLayers[j];\n                var paintAttributes = layerPaintAttributes[layer.id];\n\n                var attributeInputName = attribute.name;\n                assert(attribute.name.slice(0, 2) === 'a_');\n                var attributeInnerName = attribute.name.slice(2);\n                var attributeVaryingDefinition;\n\n                paintAttributes.fragmentPragmas.initialize[attributeInnerName] = '';\n\n                if (layer.isPaintValueFeatureConstant(attribute.paintProperty)) {\n                    paintAttributes.uniforms.push(attribute);\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = paintAttributes.vertexPragmas.define[attributeInnerName] = [\n                        'uniform',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';';\n\n                    paintAttributes.fragmentPragmas.initialize[attributeInnerName] = paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName,\n                        '=',\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                } else if (layer.isPaintValueZoomConstant(attribute.paintProperty)) {\n                    paintAttributes.attributes.push(util.extend({}, attribute, {\n                        name: attributeInputName\n                    }));\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    var attributeAttributeDefinition = [\n                        paintAttributes.fragmentPragmas.define[attributeInnerName],\n                        'attribute',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + attributeAttributeDefinition;\n\n                    paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributeInnerName,\n                        '=',\n                        attributeInputName,\n                        '/',\n                        attribute.multiplier.toFixed(1)\n                    ].join(' ') + ';\\n';\n\n                } else {\n\n                    var tName = 'u_' + attributeInputName.slice(2) + '_t';\n                    var zoomLevels = layer.getPaintValueStopZoomLevels(attribute.paintProperty);\n\n                    // Pick the index of the first offset to add to the buffers.\n                    // Find the four closest stops, ideally with two on each side of the zoom level.\n                    var numStops = 0;\n                    while (numStops < zoomLevels.length && zoomLevels[numStops] < bucket.zoom) numStops++;\n                    var stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2));\n\n                    var fourZoomLevels = [];\n                    for (var s = 0; s < 4; s++) {\n                        fourZoomLevels.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]);\n                    }\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + [\n                        'uniform',\n                        'lowp',\n                        'float',\n                        tName\n                    ].join(' ') + ';\\n';\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.uniforms.push(util.extend({}, attribute, {\n                        name: tName,\n                        getValue: createGetUniform(attribute, stopOffset),\n                        components: 1\n                    }));\n\n                    var components = attribute.components;\n                    if (components === 1) {\n\n                        paintAttributes.attributes.push(util.extend({}, attribute, {\n                            getValue: createFunctionGetValue(attribute, fourZoomLevels),\n                            isFunction: true,\n                            components: components * 4\n                        }));\n\n                        paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                            'attribute',\n                            attributePrecision,\n                            'vec4',\n                            attributeInputName\n                        ].join(' ') + ';\\n';\n\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            '=',\n                            'evaluate_zoom_function_1(' + attributeInputName + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n\n                    } else {\n\n                        var attributeInputNames = [];\n                        for (var k = 0; k < 4; k++) {\n                            attributeInputNames.push(attributeInputName + k);\n                            paintAttributes.attributes.push(util.extend({}, attribute, {\n                                getValue: createFunctionGetValue(attribute, [fourZoomLevels[k]]),\n                                isFunction: true,\n                                name: attributeInputName + k\n                            }));\n                            paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                                'attribute',\n                                attributePrecision,\n                                attributeType,\n                                attributeInputName + k\n                            ].join(' ') + ';\\n';\n                        }\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            ' = ',\n                            'evaluate_zoom_function_4(' + attributeInputNames.join(', ') + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n                    }\n                }\n            }\n        }\n    }\n    return attributes;\n}\n\nfunction createFunctionGetValue(attribute, stopZoomLevels) {\n    return function(layer, globalProperties, featureProperties) {\n        if (stopZoomLevels.length === 1) {\n            // return one multi-component value like color0\n            return attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevels[0] }), featureProperties);\n        } else {\n            // pack multiple single-component values into a four component attribute\n            var values = [];\n            for (var z = 0; z < stopZoomLevels.length; z++) {\n                var stopZoomLevel = stopZoomLevels[z];\n                values.push(attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevel }), featureProperties)[0]);\n            }\n            return values;\n        }\n    };\n}\n\nfunction createGetUniform(attribute, stopOffset) {\n    return function(layer, globalProperties) {\n        // stopInterp indicates which stops need to be interpolated.\n        // If stopInterp is 3.5 then interpolate half way between stops 3 and 4.\n        var stopInterp = layer.getPaintInterpolationT(attribute.paintProperty, globalProperties.zoom);\n        // We can only store four stop values in the buffers. stopOffset is the number of stops that come\n        // before the stops that were added to the buffers.\n        return [Math.max(0, Math.min(4, stopInterp - stopOffset))];\n    };\n}\n\n\n/***/ }),\n/* 43 */,\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * @license\n * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function () {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date() + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace =\n  // whitespace\n  ' \\t\\x0B\\f\\xA0\\uFEFF' +\n\n  // line terminators\n  '\\n\\r\\u2028\\u2029' +\n\n  // unicode category \"Zs\" space separators\n  '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000';\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = ['Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN', 'parseInt', 'setTimeout'];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] = cloneableClasses[boolClass] = cloneableClasses[dateClass] = cloneableClasses[numberClass] = cloneableClasses[objectClass] = cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = objectTypes[typeof window === 'undefined' ? 'undefined' : _typeof(window)] && window || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[ false ? 'undefined' : _typeof(exports)] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[ false ? 'undefined' : _typeof(module)] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global === 'undefined' ? 'undefined' : _typeof(global)] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object' ? cache && baseIndexOf(cache, value) > -1 ? 0 : -1 : cache ? 0 : -1;\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[length / 2 | 0],\n        last = array[length - 1];\n\n    if (first && (typeof first === 'undefined' ? 'undefined' : _typeof(first)) == 'object' && mid && (typeof mid === 'undefined' ? 'undefined' : _typeof(mid)) == 'object' && last && (typeof last === 'undefined' ? 'undefined' : _typeof(last)) == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' + String(toString).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/toString| for [^\\]]+/g, '.*?') + '$');\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = function () {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch (e) {}\n      return result;\n    }();\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__') ? value : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      } else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function (objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = function () {\n        function Object() {}\n        return function (prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object();\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }();\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || bindData !== true && bindData[1] & 1) {\n        return func;\n      }\n      switch (argCount) {\n        case 1:\n          return function (value) {\n            return func.call(thisArg, value);\n          };\n        case 2:\n          return function (a, b) {\n            return func.call(thisArg, a, b);\n          };\n        case 3:\n          return function (value, index, collection) {\n            return func.call(thisArg, value, index, collection);\n          };\n        case 4:\n          return function (accumulator, value, index, collection) {\n            return func.call(thisArg, accumulator, value, index, collection);\n          };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, isCurryBound ? bitmask : bitmask & ~3, args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && typeof value.length == 'number' && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || 1 / a == 1 / b;\n      }\n      var type = typeof a === 'undefined' ? 'undefined' : _typeof(a),\n          otherType = typeof b === 'undefined' ? 'undefined' : _typeof(b);\n\n      // exit early for unlike primitive values\n      if (a === a && !(a && objectTypes[type]) && !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return a != +a ? b != +b\n          // but treat `+0` vs. `-0` as not equal\n          : a == 0 ? 1 / a == 1 / b : a == +b;\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB && !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) && 'constructor' in a && 'constructor' in b) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if (result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB)) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      } else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function (value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB);\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function (value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return result = --size > -1;\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function (source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if (found = stackA[stackLength] == source) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if (isShallow = typeof result != 'undefined') {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr ? isArray(value) ? value : [] : isPlainObject(value) ? value : {};\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        } else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = callback || isLarge ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted ? !index || seen[seen.length - 1] !== computed : indexOf(seen, computed) < 0) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function (collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function (value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError();\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = bitmask == 1 || bitmask === 17 ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function (func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n      descriptor.value = null;\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor, result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) || (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function (value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && typeof value.length == 'number' && toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function (value) {\n      return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && typeof value.length == 'number' && toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function shimKeys(object) {\n      var index,\n          iterable = object,\n          result = [];\n      if (!iterable) return result;\n      if (!objectTypes[typeof object === 'undefined' ? 'undefined' : _typeof(object)]) return result;\n      for (index in iterable) {\n        if (hasOwnProperty.call(iterable, index)) {\n          result.push(index);\n        }\n      }\n      return result;\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function (object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function assign(object, source, guard) {\n      var index,\n          iterable = object,\n          result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)]) {\n          var ownIndex = -1,\n              ownProps = objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)] && keys(iterable),\n              length = ownProps ? ownProps.length : 0;\n\n          while (++ownIndex < length) {\n            index = ownProps[ownIndex];\n            result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n          }\n        }\n      }\n      return result;\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function defaults(object, source, guard) {\n      var index,\n          iterable = object,\n          result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)]) {\n          var ownIndex = -1,\n              ownProps = objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)] && keys(iterable),\n              length = ownProps ? ownProps.length : 0;\n\n          while (++ownIndex < length) {\n            index = ownProps[ownIndex];\n            if (typeof result[index] == 'undefined') result[index] = iterable[index];\n          }\n        }\n      }\n      return result;\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function (value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function (value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function forIn(collection, callback, thisArg) {\n      var index,\n          iterable = collection,\n          result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      for (index in iterable) {\n        if (callback(iterable[index], index, collection) === false) return result;\n      }\n      return result;\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function (value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function forOwn(collection, callback, thisArg) {\n      var index,\n          iterable = collection,\n          result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      var ownIndex = -1,\n          ownProps = objectTypes[typeof iterable === 'undefined' ? 'undefined' : _typeof(iterable)] && keys(iterable),\n          length = ownProps ? ownProps.length : 0;\n\n      while (++ownIndex < length) {\n        index = ownProps[ownIndex];\n        if (callback(iterable[index], index, collection) === false) return result;\n      }\n      return result;\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function (value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if (className == arrayClass || className == stringClass || className == argsClass || className == objectClass && typeof length == 'number' && isFunction(value.splice)) {\n        return !length;\n      }\n      forOwn(value, function () {\n        return result = false;\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value === 'undefined' ? 'undefined' : _typeof(value)]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function (value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto ? value == objProto || getPrototypeOf(value) == objProto : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function (value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function (value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function (value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function (value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function (value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = args[2] && args[2][args[1]] === collection ? 1 : props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function (value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function (result, value, key) {\n      hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1;\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function (value, index, collection) {\n          return result = !!callback(value, index, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function (value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function (value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function (value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function (value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function (result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function (result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function (value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function (value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = callback == null && isString(collection) ? charAtCallback : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function (value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = callback == null && isString(collection) ? charAtCallback : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function (value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function (value, index, collection) {\n          accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, collection);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function (value, index, collection) {\n        accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function (value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function (value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (result = callback(collection[index], index, collection)) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function (value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function (value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function (key) {\n            return value[key];\n          });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0;\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback == null || thisArg ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize && createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer: while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : +step || 1;\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback == null || thisArg ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = low + high >>> 1;\n        callback(array[mid]) < value ? low = mid + 1 : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result))) : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      return function () {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2 ? createWrapper(func, 17, slice(arguments, 2), null, thisArg) : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2 ? createWrapper(key, 19, slice(arguments, 2), null, object) : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError();\n        }\n      }\n      return function () {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : +arity || func.length;\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function delayed() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function maxDelayed() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || maxWait !== wait) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function () {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          } else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        } else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function () {\n        func.apply(undefined, args);\n      }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function () {\n        func.apply(undefined, args);\n      }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      var memoized = function memoized() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key) ? cache[key] : cache[key] = func.apply(this, arguments);\n      };\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran, result;\n\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      return function () {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError();\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function () {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func === 'undefined' ? 'undefined' : _typeof(func);\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function (object) {\n          var b = object[key];\n          return a === b && (a !== 0 || 1 / a == 1 / b);\n        };\n      }\n      return function (object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || !options && !methodNames.length) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function (methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function () {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {}\n    // no operation performed\n\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function () {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function (value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function (object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        } else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * https://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp((options.escape || reNoMatch).source + '|' + interpolate.source + '|' + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + (options.evaluate || reNoMatch).source + '|$', 'g');\n\n      text.replace(reDelimiters, function (match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source).replace(reEmptyStringMiddle, '$1').replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' + (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') + \"var __t, __p = '', __e = _.escape\" + (isEvaluating ? ', __j = Array.prototype.join;\\n' + \"function print() { __p += __j.call(arguments, '') }\\n\" : ';\\n') + source + 'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + templateCounter++ + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch (e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function () {\n      var source = {};\n      forOwn(lodash, function (func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function (func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName] = function (n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || guard && !(callbackable && typeof n == 'function')) ? result : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.2';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function (methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function () {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll ? new lodashWrapper(result, chainAll) : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function (methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function () {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function (methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function () {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (\"function\" == 'function' && _typeof(__webpack_require__(371)) == 'object' && __webpack_require__(371)) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n      // in Node.js or RingoJS\n      if (moduleExports) {\n        (freeModule.exports = _)._ = _;\n      }\n      // in Narwhal or Rhino -require\n      else {\n          freeExports._ = _;\n        }\n    } else {\n      // in a browser or Rhino\n      root._ = _;\n    }\n}).call(undefined);\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module), __webpack_require__(17)))\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.createMapLoaderGrid = exports.getBoundingBoxFromMeta = exports.canEditTooltips = exports.getCurrentTooltipFromProperties = exports.packageTooltipForSave = exports.currentMapTooltipSchema = exports.mapTooltipSchemas = exports.bubbleColorTransform = exports.HtmlMapColors = exports.HeatMapGradientStops = exports.HeatMapGradient = exports.MapColors = exports.MapLegendConfig = exports.MapTypeNames = exports.MapTypes = exports.MapSpecificBreakdownValues = exports.MapSpecificBreakdowns = exports.GeocoderMapDataTypes = exports.AllMapDataTypes = exports.MapDataTypes = exports.MAX_NUMBER_OF_TOOLTIP_FIELDS = exports.MapboxGl = exports.OpenGovVectorTileLayerURL = exports.MapBoxAPIAccessToken = undefined;\nexports.getColor = getColor;\nexports.getHtmlColor = getHtmlColor;\nexports.getColorExtractorFor = getColorExtractorFor;\nexports.getColorMapFor = getColorMapFor;\nexports.getLegendColorMap = getLegendColorMap;\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _color = __webpack_require__(892);\n\nvar _color2 = _interopRequireDefault(_color);\n\nvar _bluebird = __webpack_require__(256);\n\nvar _bluebird2 = _interopRequireDefault(_bluebird);\n\nvar _og_colors = __webpack_require__(186);\n\nvar _og_colors2 = _interopRequireDefault(_og_colors);\n\nvar _schema_utils = __webpack_require__(120);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar MapBoxAPIAccessToken = exports.MapBoxAPIAccessToken = window.gon && gon.mapBoxApiAccessToken;\nvar OpenGovVectorTileLayerURL = exports.OpenGovVectorTileLayerURL = 'mapbox://styles/opengov/ciom010hc0006axnld5s0ylyp';\nvar MapboxGl = exports.MapboxGl = {\n    maxZoom: 20\n};\nvar MAX_NUMBER_OF_TOOLTIP_FIELDS = exports.MAX_NUMBER_OF_TOOLTIP_FIELDS = 5; // the max that will comfortably fit in the map pane\nvar MapDataTypes = exports.MapDataTypes = {\n    longitude: 'longitude',\n    latitude: 'latitude',\n    address: 'address',\n    city: 'city',\n    state: 'state',\n    zipcode: 'zipcode',\n    country_code: 'country_code'\n};\nvar AllMapDataTypes = exports.AllMapDataTypes = _lodash2.default.values(MapDataTypes);\nvar GeocoderMapDataTypes = exports.GeocoderMapDataTypes = [MapDataTypes.address, MapDataTypes.city, MapDataTypes.state, MapDataTypes.zipcode, MapDataTypes.country_code];\n// TODO: null and other `undefined-ish` values break the aggregate request so,\n// we have to use quasi_id below to simulate no grouping; preferably this goes away at some point?\nvar MapSpecificBreakdowns = exports.MapSpecificBreakdowns = {\n    None: { name: 'quasi_id', label: '- none -' }\n};\nvar MapSpecificBreakdownValues = exports.MapSpecificBreakdownValues = _immutable2.default.List(_lodash2.default.values(MapSpecificBreakdowns)).map(function (v) {\n    return _immutable2.default.fromJS(v);\n});\nvar MapTypes = exports.MapTypes = {\n    Point: {\n        name: 'point',\n        label: 'Point',\n        layerType: 'circle'\n    },\n    Heatmap: {\n        name: 'heatmap',\n        label: 'Heatmap',\n        configuration: {\n            // These values were arrived at by manually tweaking them with existing visualizations\n            intensityExponent: 1 / 3,\n            max: 8,\n            min: 1,\n            radius: 6.5,\n            sizeExponent: 1 + 2 / 3,\n            zoomExponent: 1.15\n        },\n        types: {\n            amount: 'amount',\n            density: 'density'\n        }\n    },\n    Bubble: {\n        name: 'bubble',\n        label: 'Bubble',\n        layerType: 'circle',\n        configuration: {\n            minBubbleRadius: 4,\n            maxBubbleRadius: 25,\n            bubbleFillAlpha: 0.75\n        }\n    }\n};\nvar MapTypeNames = exports.MapTypeNames = _lodash2.default.map(MapTypes, function (t) {\n    return t.name;\n});\nvar MapLegendConfig = exports.MapLegendConfig = {\n    // This is 6 just to fit the items in the legend container\n    itemsPerPage: 6\n};\nvar MapColors = exports.MapColors = [0x4781BF, 0xA1BBE5, 0xE59539, 0xE8CE8B, 0x6F5DA8, 0xCDABDB, 0x3D9990, 0x7CCFB4, 0x4C5FB5, 0x979ACC, 0xCC5E69, 0xEDA19F, 0x4692B0, 0x8BD4D6, 0xE0694F, 0xF5A482, 0x549970, 0x9AD9A4, 0x9C4174, 0xCF7C92];\nvar HeatMapGradient = exports.HeatMapGradient = {\n    0.1: '#89BDE0',\n    0.2: '#96E3E6',\n    0.4: '#82CEB6',\n    0.6: '#FAF3A5',\n    0.8: '#F5D98B',\n    1.0: '#DE9A96'\n};\nvar HeatMapGradientStops = exports.HeatMapGradientStops = _lodash2.default.sortBy(_lodash2.default.map(HeatMapGradient, function (color, stop) {\n    return { color: color, stop: stop };\n}), function (_ref) {\n    var stop = _ref.stop;\n    return parseFloat(stop);\n});\nvar HtmlMapColors = exports.HtmlMapColors = MapColors.map(function (color) {\n    return _og_colors2.default.intToHtmlColor(color);\n});\nfunction getColor(index) {\n    return MapColors[index % MapColors.length];\n}\nfunction getHtmlColor(index) {\n    return HtmlMapColors[index % HtmlMapColors.length];\n}\nfunction getColorExtractorFor(breakdown, colorMap) {\n    return function (row) {\n        var breakdownValue = _immutable2.default.isImmutable(row) ? row.get(breakdown) : row[breakdown];\n        return colorMap[breakdown][breakdownValue];\n    };\n}\nvar bubbleColorTransform = exports.bubbleColorTransform = function bubbleColorTransform(c) {\n    return (0, _color2.default)(c).alpha(MapTypes.Bubble.configuration.bubbleFillAlpha).rgbaString();\n};\nfunction getColorMapFor(newValues, breakdown, currentColorMap) {\n    return _lodash2.default.set(currentColorMap, breakdown, _lodash2.default.reduce(newValues, function (result, value, i) {\n        return _lodash2.default.defaults(result, _defineProperty({}, value, value == null ? getHtmlColor(0) : getHtmlColor(i)));\n    }, _lodash2.default.get(_lodash2.default.defaults(currentColorMap || {}, _defineProperty({}, breakdown, {})), breakdown)));\n}\nfunction getLegendColorMap(values, breakdown, colorMap) {\n    return _lodash2.default.reduce(values, function (legendMap, value) {\n        legendMap[breakdown][value] = colorMap[breakdown][value];\n        return legendMap;\n    }, _defineProperty({}, breakdown, {}));\n}\nvar removeColumn = function removeColumn(toRemove, tooltip) {\n    return tooltip.set('columns', tooltip.get('columns').filter(function (column) {\n        return column !== toRemove;\n    }));\n};\nvar updateColumnInTooltip = function updateColumnInTooltip(origColumn, newColumn, tooltip) {\n    return tooltip.set('columns', tooltip.get('columns').map(function (column) {\n        if (column === origColumn) {\n            return origColumn.merge(newColumn);\n        }\n        return column;\n    }));\n};\nvar reorderColumns = function reorderColumns(currentTooltip, moved, movedOver) {\n    return currentTooltip.set('columns', currentTooltip.get('columns').map(function (column) {\n        if (column === moved) {\n            return movedOver;\n        }\n        if (column === movedOver) {\n            return moved;\n        }\n        return column;\n    }));\n};\nvar mapTooltipSchemas = exports.mapTooltipSchemas = [{\n    version: 'v1',\n    removeColumn: removeColumn,\n    updateColumnInTooltip: updateColumnInTooltip,\n    reorderColumns: reorderColumns,\n    createDefault: function createDefault(columns) {\n        return _immutable2.default.fromJS({\n            columns: columns.map(function (column) {\n                return {\n                    name: _lodash2.default.result(column, 'name'),\n                    label: _lodash2.default.result(column, 'label'),\n                    showColumnName: true\n                };\n            })\n        });\n    },\n    addNewColumn: function addNewColumn(currentTooltip, column) {\n        return currentTooltip.set('columns', currentTooltip.get('columns').push(_immutable2.default.fromJS({\n            name: column.get('name'),\n            label: column.get('label'),\n            showColumnName: true\n        })));\n    },\n\n    migrateFromPrevious: null\n}, {\n    version: 'v2',\n    removeColumn: removeColumn,\n    updateColumnInTooltip: updateColumnInTooltip,\n    reorderColumns: reorderColumns,\n    createDefault: function createDefault(columns) {\n        return _immutable2.default.fromJS({\n            version: 'v2',\n            columns: columns.map(function (column) {\n                return {\n                    name: _lodash2.default.result(column, 'name'),\n                    label: _lodash2.default.result(column, 'label'),\n                    type: _lodash2.default.result(column, 'type'),\n                    showColumnName: true\n                };\n            })\n        });\n    },\n    addNewColumn: function addNewColumn(currentTooltip, column) {\n        return currentTooltip.set('columns', currentTooltip.get('columns').push(_immutable2.default.fromJS({\n            name: column.get('name'),\n            label: column.get('label'),\n            type: column.get('type'),\n            showColumnName: true\n        })));\n    },\n    migrateFromPrevious: function migrateFromPrevious(tooltip, schema) {\n        var updatedColumns = tooltip.getIn(['config', 'columns']).map(function (column) {\n            return column.set('type', (0, _schema_utils.getColumnTypeByName)(schema, column.get('name')));\n        });\n        return tooltip.setIn(['config', 'columns'], updatedColumns).setIn(['config', 'columns'], updatedColumns);\n    }\n}];\nvar currentMapTooltipSchema = exports.currentMapTooltipSchema = _lodash2.default.last(mapTooltipSchemas);\nvar packageTooltipForSave = exports.packageTooltipForSave = function packageTooltipForSave(tooltip) {\n    return _immutable2.default.fromJS({ schema: currentMapTooltipSchema.version }).set('tooltip', tooltip);\n};\nvar getCurrentTooltipFromProperties = exports.getCurrentTooltipFromProperties = function getCurrentTooltipFromProperties(properties) {\n    return _immutable2.default.fromJS(_lodash2.default.last(properties.map_tooltips).tooltip);\n};\nvar canEditTooltips = exports.canEditTooltips = function canEditTooltips(session) {\n    return session && _lodash2.default.get(session.get('abilities'), ['report', 'update']);\n};\nvar getBoundingBoxFromMeta = exports.getBoundingBoxFromMeta = function getBoundingBoxFromMeta(meta) {\n    var margin = 0.001;\n    return {\n        x1: meta.getIn(['bounds', 'x1']) - margin,\n        y1: meta.getIn(['bounds', 'y1']) - margin,\n        x2: meta.getIn(['bounds', 'x2']) + margin,\n        y2: meta.getIn(['bounds', 'y2']) + margin\n    };\n};\nvar createMapLoaderGrid = exports.createMapLoaderGrid = function createMapLoaderGrid(x1, x2, y1, y2, partitions) {\n    var xPartitionSize = (x2 - x1) / partitions;\n    var yPartitionSize = (y2 - y1) / partitions;\n    var lngRange = _lodash2.default.range(x1, x2, xPartitionSize);\n    var latRange = _lodash2.default.range(y1, y2, yPartitionSize);\n    return _lodash2.default.reduce(lngRange, function (outerGrid, lng) {\n        return _lodash2.default.reduce(latRange, function (grid, lat) {\n            return grid.set('cells', grid.get('cells').push((0, _immutable.Map)({\n                bounds: (0, _immutable.Map)({\n                    x1: lng,\n                    y1: lat,\n                    x2: lng + xPartitionSize,\n                    y2: lat + yPartitionSize\n                }),\n                loaded: false,\n                loader: _bluebird2.default.resolve()\n            })));\n        }, outerGrid);\n    }, (0, _immutable.Map)({ cells: (0, _immutable.List)(), x1: x1, x2: x2, y1: y1, y2: y2, xPartitionSize: xPartitionSize, yPartitionSize: yPartitionSize }));\n};\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\n\n/**\n * Methods mixed in to other classes for event capabilities.\n *\n * @mixin Evented\n */\nvar Evented = {\n\n    /**\n     * Adds a listener to a specified event type.\n     *\n     * @param {string} type The event type to add a listen for.\n     * @param {Function} listener The function to be called when the event is fired.\n     *   The listener function is called with the data object passed to `fire`,\n     *   extended with `target` and `type` properties.\n     * @returns {Object} `this`\n     */\n    on: function(type, listener) {\n        this._events = this._events || {};\n        this._events[type] = this._events[type] || [];\n        this._events[type].push(listener);\n\n        return this;\n    },\n\n    /**\n     * Removes a previously registered event listener.\n     *\n     * @param {string} [type] The event type to remove listeners for.\n     *   If none is specified, listeners will be removed for all event types.\n     * @param {Function} [listener] The listener function to remove.\n     *   If none is specified, all listeners will be removed for the event type.\n     * @returns {Object} `this`\n     */\n    off: function(type, listener) {\n        if (!type) {\n            // clear all listeners if no arguments specified\n            delete this._events;\n            return this;\n        }\n\n        if (!this.listens(type)) return this;\n\n        if (listener) {\n            var idx = this._events[type].indexOf(listener);\n            if (idx >= 0) {\n                this._events[type].splice(idx, 1);\n            }\n            if (!this._events[type].length) {\n                delete this._events[type];\n            }\n        } else {\n            delete this._events[type];\n        }\n\n        return this;\n    },\n\n    /**\n     * Adds a listener that will be called only once to a specified event type.\n     *\n     * The listener will be called first time the event fires after the listener is registered.\n     *\n     * @param {string} type The event type to listen for.\n     * @param {Function} listener The function to be called when the event is fired the first time.\n     * @returns {Object} `this`\n     */\n    once: function(type, listener) {\n        var wrapper = function(data) {\n            this.off(type, wrapper);\n            listener.call(this, data);\n        }.bind(this);\n        this.on(type, wrapper);\n        return this;\n    },\n\n    /**\n     * Fires an event of the specified type.\n     *\n     * @param {string} type The type of event to fire.\n     * @param {Object} [data] Data to be passed to any listeners.\n     * @returns {Object} `this`\n     */\n    fire: function(type, data) {\n        if (!this.listens(type)) {\n            // To ensure that no error events are dropped, print them to the\n            // console if they have no listeners.\n            if (util.endsWith(type, 'error')) {\n                console.error((data && data.error) || data || 'Empty error event');\n            }\n            return this;\n        }\n\n        data = util.extend({}, data);\n        util.extend(data, {type: type, target: this});\n\n        // make sure adding/removing listeners inside other listeners won't cause infinite loop\n        var listeners = this._events[type].slice();\n\n        for (var i = 0; i < listeners.length; i++) {\n            listeners[i].call(this, data);\n        }\n\n        return this;\n    },\n\n    /**\n     * Returns a Boolean indicating whether any listeners are registered for a specified event type.\n     *\n     * @param {string} type The event type to check.\n     * @returns {boolean} `true` if there is at least one registered listener for specified event type.\n     */\n    listens: function(type) {\n        return !!(this._events && this._events[type]);\n    }\n};\n\nmodule.exports = Evented;\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nexports.create = function (tagName, className, container) {\n    var el = document.createElement(tagName);\n    if (className) el.className = className;\n    if (container) container.appendChild(el);\n    return el;\n};\n\nvar docStyle = document.documentElement.style;\n\nfunction testProp(props) {\n    for (var i = 0; i < props.length; i++) {\n        if (props[i] in docStyle) {\n            return props[i];\n        }\n    }\n}\n\nvar selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']),\n    userSelect;\nexports.disableDrag = function () {\n    if (selectProp) {\n        userSelect = docStyle[selectProp];\n        docStyle[selectProp] = 'none';\n    }\n};\nexports.enableDrag = function () {\n    if (selectProp) {\n        docStyle[selectProp] = userSelect;\n    }\n};\n\nvar transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n    el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n    window.addEventListener('click', suppressClick, true);\n    window.setTimeout(function() {\n        window.removeEventListener('click', suppressClick, true);\n    }, 0);\n};\n\nexports.mousePos = function (el, e) {\n    var rect = el.getBoundingClientRect();\n    e = e.touches ? e.touches[0] : e;\n    return new Point(\n        e.clientX - rect.left - el.clientLeft,\n        e.clientY - rect.top - el.clientTop\n    );\n};\n\nexports.touchPos = function (el, e) {\n    var rect = el.getBoundingClientRect(),\n        points = [];\n    for (var i = 0; i < e.touches.length; i++) {\n        points.push(new Point(\n            e.touches[i].clientX - rect.left - el.clientLeft,\n            e.touches[i].clientY - rect.top - el.clientTop\n        ));\n    }\n    return points;\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(31);\nvar createDesc = __webpack_require__(105);\nmodule.exports = __webpack_require__(27) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar hide = __webpack_require__(49);\nvar has = __webpack_require__(57);\nvar SRC = __webpack_require__(106)('src');\nvar $toString = __webpack_require__(1598);\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(64).inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar fails = __webpack_require__(19);\nvar defined = __webpack_require__(74);\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n  var S = String(defined(string));\n  var p1 = '<' + tag;\n  if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n  return p1 + '>' + S + '</' + tag + '>';\n};\nmodule.exports = function (NAME, exec) {\n  var O = {};\n  O[NAME] = exec(createHTML);\n  $export($export.P + $export.F * fails(function () {\n    var test = ''[NAME]('\"');\n    return test !== test.toLowerCase() || test.split('\"').length > 3;\n  }), 'String', O);\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//  Underscore.string\n//  (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org>\n//  Underscore.string is freely distributable under the terms of the MIT license.\n//  Documentation: https://github.com/epeli/underscore.string\n//  Some code is borrowed from MooTools and Alexandru Marasteanu.\n//  Version '2.3.2'\n\n!function(root, String){\n  'use strict';\n\n  // Defining helper functions.\n\n  var nativeTrim = String.prototype.trim;\n  var nativeTrimRight = String.prototype.trimRight;\n  var nativeTrimLeft = String.prototype.trimLeft;\n\n  var parseNumber = function(source) { return source * 1 || 0; };\n\n  var strRepeat = function(str, qty){\n    if (qty < 1) return '';\n    var result = '';\n    while (qty > 0) {\n      if (qty & 1) result += str;\n      qty >>= 1, str += str;\n    }\n    return result;\n  };\n\n  var slice = [].slice;\n\n  var defaultToWhiteSpace = function(characters) {\n    if (characters == null)\n      return '\\\\s';\n    else if (characters.source)\n      return characters.source;\n    else\n      return '[' + _s.escapeRegExp(characters) + ']';\n  };\n\n  // Helper for toBoolean\n  function boolMatch(s, matchers) {\n    var i, matcher, down = s.toLowerCase();\n    matchers = [].concat(matchers);\n    for (i = 0; i < matchers.length; i += 1) {\n      matcher = matchers[i];\n      if (!matcher) continue;\n      if (matcher.test && matcher.test(s)) return true;\n      if (matcher.toLowerCase() === down) return true;\n    }\n  }\n\n  var escapeChars = {\n    lt: '<',\n    gt: '>',\n    quot: '\"',\n    amp: '&',\n    apos: \"'\"\n  };\n\n  var reversedEscapeChars = {};\n  for(var key in escapeChars) reversedEscapeChars[escapeChars[key]] = key;\n  reversedEscapeChars[\"'\"] = '#39';\n\n  // sprintf() for JavaScript 0.7-beta1\n  // http://www.diveintojavascript.com/projects/javascript-sprintf\n  //\n  // Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>\n  // All rights reserved.\n\n  var sprintf = (function() {\n    function get_type(variable) {\n      return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n    }\n\n    var str_repeat = strRepeat;\n\n    var str_format = function() {\n      if (!str_format.cache.hasOwnProperty(arguments[0])) {\n        str_format.cache[arguments[0]] = str_format.parse(arguments[0]);\n      }\n      return str_format.format.call(null, str_format.cache[arguments[0]], arguments);\n    };\n\n    str_format.format = function(parse_tree, argv) {\n      var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n      for (i = 0; i < tree_length; i++) {\n        node_type = get_type(parse_tree[i]);\n        if (node_type === 'string') {\n          output.push(parse_tree[i]);\n        }\n        else if (node_type === 'array') {\n          match = parse_tree[i]; // convenience purposes only\n          if (match[2]) { // keyword argument\n            arg = argv[cursor];\n            for (k = 0; k < match[2].length; k++) {\n              if (!arg.hasOwnProperty(match[2][k])) {\n                throw new Error(sprintf('[_.sprintf] property \"%s\" does not exist', match[2][k]));\n              }\n              arg = arg[match[2][k]];\n            }\n          } else if (match[1]) { // positional argument (explicit)\n            arg = argv[match[1]];\n          }\n          else { // positional argument (implicit)\n            arg = argv[cursor++];\n          }\n\n          if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n            throw new Error(sprintf('[_.sprintf] expecting number but found %s', get_type(arg)));\n          }\n          switch (match[8]) {\n            case 'b': arg = arg.toString(2); break;\n            case 'c': arg = String.fromCharCode(arg); break;\n            case 'd': arg = parseInt(arg, 10); break;\n            case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n            case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n            case 'o': arg = arg.toString(8); break;\n            case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;\n            case 'u': arg = Math.abs(arg); break;\n            case 'x': arg = arg.toString(16); break;\n            case 'X': arg = arg.toString(16).toUpperCase(); break;\n          }\n          arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);\n          pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';\n          pad_length = match[6] - String(arg).length;\n          pad = match[6] ? str_repeat(pad_character, pad_length) : '';\n          output.push(match[5] ? arg + pad : pad + arg);\n        }\n      }\n      return output.join('');\n    };\n\n    str_format.cache = {};\n\n    str_format.parse = function(fmt) {\n      var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n      while (_fmt) {\n        if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n          parse_tree.push(match[0]);\n        }\n        else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n          parse_tree.push('%');\n        }\n        else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n          if (match[2]) {\n            arg_names |= 1;\n            var field_list = [], replacement_field = match[2], field_match = [];\n            if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n              field_list.push(field_match[1]);\n              while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n                if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n                  field_list.push(field_match[1]);\n                }\n                else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n                  field_list.push(field_match[1]);\n                }\n                else {\n                  throw new Error('[_.sprintf] huh?');\n                }\n              }\n            }\n            else {\n              throw new Error('[_.sprintf] huh?');\n            }\n            match[2] = field_list;\n          }\n          else {\n            arg_names |= 2;\n          }\n          if (arg_names === 3) {\n            throw new Error('[_.sprintf] mixing positional and named placeholders is not (yet) supported');\n          }\n          parse_tree.push(match);\n        }\n        else {\n          throw new Error('[_.sprintf] huh?');\n        }\n        _fmt = _fmt.substring(match[0].length);\n      }\n      return parse_tree;\n    };\n\n    return str_format;\n  })();\n\n\n\n  // Defining underscore.string\n\n  var _s = {\n\n    VERSION: '2.3.0',\n\n    isBlank: function(str){\n      if (str == null) str = '';\n      return (/^\\s*$/).test(str);\n    },\n\n    stripTags: function(str){\n      if (str == null) return '';\n      return String(str).replace(/<\\/?[^>]+>/g, '');\n    },\n\n    capitalize : function(str){\n      str = str == null ? '' : String(str);\n      return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n\n    chop: function(str, step){\n      if (str == null) return [];\n      str = String(str);\n      step = ~~step;\n      return step > 0 ? str.match(new RegExp('.{1,' + step + '}', 'g')) : [str];\n    },\n\n    clean: function(str){\n      return _s.strip(str).replace(/\\s+/g, ' ');\n    },\n\n    count: function(str, substr){\n      if (str == null || substr == null) return 0;\n\n      str = String(str);\n      substr = String(substr);\n\n      var count = 0,\n        pos = 0,\n        length = substr.length;\n\n      while (true) {\n        pos = str.indexOf(substr, pos);\n        if (pos === -1) break;\n        count++;\n        pos += length;\n      }\n\n      return count;\n    },\n\n    chars: function(str) {\n      if (str == null) return [];\n      return String(str).split('');\n    },\n\n    swapCase: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/\\S/g, function(c){\n        return c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase();\n      });\n    },\n\n    escapeHTML: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/[&<>\"']/g, function(m){ return '&' + reversedEscapeChars[m] + ';'; });\n    },\n\n    unescapeHTML: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/\\&([^;]+);/g, function(entity, entityCode){\n        var match;\n\n        if (entityCode in escapeChars) {\n          return escapeChars[entityCode];\n        } else if (match = entityCode.match(/^#x([\\da-fA-F]+)$/)) {\n          return String.fromCharCode(parseInt(match[1], 16));\n        } else if (match = entityCode.match(/^#(\\d+)$/)) {\n          return String.fromCharCode(~~match[1]);\n        } else {\n          return entity;\n        }\n      });\n    },\n\n    escapeRegExp: function(str){\n      if (str == null) return '';\n      return String(str).replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n    },\n\n    splice: function(str, i, howmany, substr){\n      var arr = _s.chars(str);\n      arr.splice(~~i, ~~howmany, substr);\n      return arr.join('');\n    },\n\n    insert: function(str, i, substr){\n      return _s.splice(str, i, 0, substr);\n    },\n\n    include: function(str, needle){\n      if (needle === '') return true;\n      if (str == null) return false;\n      return String(str).indexOf(needle) !== -1;\n    },\n\n    join: function() {\n      var args = slice.call(arguments),\n        separator = args.shift();\n\n      if (separator == null) separator = '';\n\n      return args.join(separator);\n    },\n\n    lines: function(str) {\n      if (str == null) return [];\n      return String(str).split(\"\\n\");\n    },\n\n    reverse: function(str){\n      return _s.chars(str).reverse().join('');\n    },\n\n    startsWith: function(str, starts){\n      if (starts === '') return true;\n      if (str == null || starts == null) return false;\n      str = String(str); starts = String(starts);\n      return str.length >= starts.length && str.slice(0, starts.length) === starts;\n    },\n\n    endsWith: function(str, ends){\n      if (ends === '') return true;\n      if (str == null || ends == null) return false;\n      str = String(str); ends = String(ends);\n      return str.length >= ends.length && str.slice(str.length - ends.length) === ends;\n    },\n\n    succ: function(str){\n      if (str == null) return '';\n      str = String(str);\n      return str.slice(0, -1) + String.fromCharCode(str.charCodeAt(str.length-1) + 1);\n    },\n\n    titleize: function(str){\n      if (str == null) return '';\n      str  = String(str).toLowerCase();\n      return str.replace(/(?:^|\\s|-)\\S/g, function(c){ return c.toUpperCase(); });\n    },\n\n    camelize: function(str){\n      return _s.trim(str).replace(/[-_\\s]+(.)?/g, function(match, c){ return c ? c.toUpperCase() : \"\"; });\n    },\n\n    underscored: function(str){\n      return _s.trim(str).replace(/([a-z\\d])([A-Z]+)/g, '$1_$2').replace(/[-\\s]+/g, '_').toLowerCase();\n    },\n\n    dasherize: function(str){\n      return _s.trim(str).replace(/([A-Z])/g, '-$1').replace(/[-_\\s]+/g, '-').toLowerCase();\n    },\n\n    classify: function(str){\n      return _s.titleize(String(str).replace(/[\\W_]/g, ' ')).replace(/\\s/g, '');\n    },\n\n    humanize: function(str){\n      return _s.capitalize(_s.underscored(str).replace(/_id$/,'').replace(/_/g, ' '));\n    },\n\n    trim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrim) return nativeTrim.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp('\\^' + characters + '+|' + characters + '+$', 'g'), '');\n    },\n\n    ltrim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrimLeft) return nativeTrimLeft.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp('^' + characters + '+'), '');\n    },\n\n    rtrim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrimRight) return nativeTrimRight.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp(characters + '+$'), '');\n    },\n\n    truncate: function(str, length, truncateStr){\n      if (str == null) return '';\n      str = String(str); truncateStr = truncateStr || '...';\n      length = ~~length;\n      return str.length > length ? str.slice(0, length) + truncateStr : str;\n    },\n\n    /**\n     * _s.prune: a more elegant version of truncate\n     * prune extra chars, never leaving a half-chopped word.\n     * @author github.com/rwz\n     */\n    prune: function(str, length, pruneStr){\n      if (str == null) return '';\n\n      str = String(str); length = ~~length;\n      pruneStr = pruneStr != null ? String(pruneStr) : '...';\n\n      if (str.length <= length) return str;\n\n      var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },\n        template = str.slice(0, length+1).replace(/.(?=\\W*\\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'\n\n      if (template.slice(template.length-2).match(/\\w\\w/))\n        template = template.replace(/\\s*\\S+$/, '');\n      else\n        template = _s.rtrim(template.slice(0, template.length-1));\n\n      return (template+pruneStr).length > str.length ? str : str.slice(0, template.length)+pruneStr;\n    },\n\n    words: function(str, delimiter) {\n      if (_s.isBlank(str)) return [];\n      return _s.trim(str, delimiter).split(delimiter || /\\s+/);\n    },\n\n    pad: function(str, length, padStr, type) {\n      str = str == null ? '' : String(str);\n      length = ~~length;\n\n      var padlen  = 0;\n\n      if (!padStr)\n        padStr = ' ';\n      else if (padStr.length > 1)\n        padStr = padStr.charAt(0);\n\n      switch(type) {\n        case 'right':\n          padlen = length - str.length;\n          return str + strRepeat(padStr, padlen);\n        case 'both':\n          padlen = length - str.length;\n          return strRepeat(padStr, Math.ceil(padlen/2)) + str\n                  + strRepeat(padStr, Math.floor(padlen/2));\n        default: // 'left'\n          padlen = length - str.length;\n          return strRepeat(padStr, padlen) + str;\n        }\n    },\n\n    lpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr);\n    },\n\n    rpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr, 'right');\n    },\n\n    lrpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr, 'both');\n    },\n\n    sprintf: sprintf,\n\n    vsprintf: function(fmt, argv){\n      argv.unshift(fmt);\n      return sprintf.apply(null, argv);\n    },\n\n    toNumber: function(str, decimals) {\n      if (!str) return 0;\n      str = _s.trim(str);\n      if (!str.match(/^-?\\d+(?:\\.\\d+)?$/)) return NaN;\n      return parseNumber(parseNumber(str).toFixed(~~decimals));\n    },\n\n    numberFormat : function(number, dec, dsep, tsep) {\n      if (isNaN(number) || number == null) return '';\n\n      number = number.toFixed(~~dec);\n      tsep = typeof tsep == 'string' ? tsep : ',';\n\n      var parts = number.split('.'), fnums = parts[0],\n        decimals = parts[1] ? (dsep || '.') + parts[1] : '';\n\n      return fnums.replace(/(\\d)(?=(?:\\d{3})+$)/g, '$1' + tsep) + decimals;\n    },\n\n    strRight: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.indexOf(sep);\n      return ~pos ? str.slice(pos+sep.length, str.length) : str;\n    },\n\n    strRightBack: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.lastIndexOf(sep);\n      return ~pos ? str.slice(pos+sep.length, str.length) : str;\n    },\n\n    strLeft: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.indexOf(sep);\n      return ~pos ? str.slice(0, pos) : str;\n    },\n\n    strLeftBack: function(str, sep){\n      if (str == null) return '';\n      str += ''; sep = sep != null ? ''+sep : sep;\n      var pos = str.lastIndexOf(sep);\n      return ~pos ? str.slice(0, pos) : str;\n    },\n\n    toSentence: function(array, separator, lastSeparator, serial) {\n      separator = separator || ', ';\n      lastSeparator = lastSeparator || ' and ';\n      var a = array.slice(), lastMember = a.pop();\n\n      if (array.length > 2 && serial) lastSeparator = _s.rtrim(separator) + lastSeparator;\n\n      return a.length ? a.join(separator) + lastSeparator + lastMember : lastMember;\n    },\n\n    toSentenceSerial: function() {\n      var args = slice.call(arguments);\n      args[3] = true;\n      return _s.toSentence.apply(_s, args);\n    },\n\n    slugify: function(str) {\n      if (str == null) return '';\n\n      var from  = \"ąàáäâãåæăćęèéëêìíïîłńòóöôõøśșțùúüûñçżź\",\n          to    = \"aaaaaaaaaceeeeeiiiilnoooooosstuuuunczz\",\n          regex = new RegExp(defaultToWhiteSpace(from), 'g');\n\n      str = String(str).toLowerCase().replace(regex, function(c){\n        var index = from.indexOf(c);\n        return to.charAt(index) || '-';\n      });\n\n      return _s.dasherize(str.replace(/[^\\w\\s-]/g, ''));\n    },\n\n    surround: function(str, wrapper) {\n      return [wrapper, str, wrapper].join('');\n    },\n\n    quote: function(str, quoteChar) {\n      return _s.surround(str, quoteChar || '\"');\n    },\n\n    unquote: function(str, quoteChar) {\n      quoteChar = quoteChar || '\"';\n      if (str[0] === quoteChar && str[str.length-1] === quoteChar)\n        return str.slice(1,str.length-1);\n      else return str;\n    },\n\n    exports: function() {\n      var result = {};\n\n      for (var prop in this) {\n        if (!this.hasOwnProperty(prop) || prop.match(/^(?:include|contains|reverse)$/)) continue;\n        result[prop] = this[prop];\n      }\n\n      return result;\n    },\n\n    repeat: function(str, qty, separator){\n      if (str == null) return '';\n\n      qty = ~~qty;\n\n      // using faster implementation if separator is not needed;\n      if (separator == null) return strRepeat(String(str), qty);\n\n      // this one is about 300x slower in Google Chrome\n      for (var repeat = []; qty > 0; repeat[--qty] = str) {}\n      return repeat.join(separator);\n    },\n\n    naturalCmp: function(str1, str2){\n      if (str1 == str2) return 0;\n      if (!str1) return -1;\n      if (!str2) return 1;\n\n      var cmpRegex = /(\\.\\d+)|(\\d+)|(\\D+)/g,\n        tokens1 = String(str1).toLowerCase().match(cmpRegex),\n        tokens2 = String(str2).toLowerCase().match(cmpRegex),\n        count = Math.min(tokens1.length, tokens2.length);\n\n      for(var i = 0; i < count; i++) {\n        var a = tokens1[i], b = tokens2[i];\n\n        if (a !== b){\n          var num1 = parseInt(a, 10);\n          if (!isNaN(num1)){\n            var num2 = parseInt(b, 10);\n            if (!isNaN(num2) && num1 - num2)\n              return num1 - num2;\n          }\n          return a < b ? -1 : 1;\n        }\n      }\n\n      if (tokens1.length === tokens2.length)\n        return tokens1.length - tokens2.length;\n\n      return str1 < str2 ? -1 : 1;\n    },\n\n    levenshtein: function(str1, str2) {\n      if (str1 == null && str2 == null) return 0;\n      if (str1 == null) return String(str2).length;\n      if (str2 == null) return String(str1).length;\n\n      str1 = String(str1); str2 = String(str2);\n\n      var current = [], prev, value;\n\n      for (var i = 0; i <= str2.length; i++)\n        for (var j = 0; j <= str1.length; j++) {\n          if (i && j)\n            if (str1.charAt(j - 1) === str2.charAt(i - 1))\n              value = prev;\n            else\n              value = Math.min(current[j], current[j - 1], prev) + 1;\n          else\n            value = i + j;\n\n          prev = current[j];\n          current[j] = value;\n        }\n\n      return current.pop();\n    },\n\n    toBoolean: function(str, trueValues, falseValues) {\n      if (typeof str === \"number\") str = \"\" + str;\n      if (typeof str !== \"string\") return !!str;\n      str = _s.trim(str);\n      if (boolMatch(str, trueValues || [\"true\", \"1\"])) return true;\n      if (boolMatch(str, falseValues || [\"false\", \"0\"])) return false;\n    }\n  };\n\n  // Aliases\n\n  _s.strip    = _s.trim;\n  _s.lstrip   = _s.ltrim;\n  _s.rstrip   = _s.rtrim;\n  _s.center   = _s.lrpad;\n  _s.rjust    = _s.lpad;\n  _s.ljust    = _s.rpad;\n  _s.contains = _s.include;\n  _s.q        = _s.quote;\n  _s.toBool   = _s.toBoolean;\n\n  // Exporting\n\n  // CommonJS module is defined\n  if (true) {\n    if (typeof module !== 'undefined' && module.exports)\n      module.exports = _s;\n\n    exports._s = _s;\n  }\n\n  // Register as a named module with AMD.\n  if (true)\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){ return _s; }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n  // Integrate with Underscore.js if defined\n  // or create our own underscore object.\n  root._ = root._ || {};\n  root._.string = root._.str = _s;\n}(this, String);\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.colorIntTohtmlRGB = exports.svgSupported = exports.renderTo = exports.View = exports.api = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _templates = __webpack_require__(259);\n\nvar _templates2 = _interopRequireDefault(_templates);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\n__webpack_require__(506);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.api = _og_api2.default;\n\nvar closeItems = [];\nfunction closeOpenItems() {\n    _lodash2.default.each(closeItems, function (item) {\n        if (item.isOpen) {\n            if (!item.selfClicked) {\n                item.close();\n                item.isOpen = false;\n            } else {\n                item.selfClicked = false;\n            }\n        }\n    });\n}\n(0, _jquery2.default)('body').on('click', closeOpenItems);\nvar View = exports.View = _backbone2.default.View.extend({\n    tagName: 'athena',\n    constructor: function constructor(options) {\n        this.views = {};\n        this.options = options || {};\n        if (options) {\n            if (options.template) {\n                this.template = options.template;\n            }\n            if (options.placeholder) {\n                this.placeholder = options.placeholder;\n            }\n        }\n        _backbone2.default.View.prototype.constructor.call(this, options);\n    },\n    view: function view(name, viewId, _view) {\n        if (arguments.length === 2) {\n            _view = viewId;\n        }\n        if (arguments.length === 3) {\n            name = name + '__' + viewId;\n            _view.viewId = viewId;\n        }\n        if (arguments.length === 1) {\n            _view = this.views[name];\n        } else {\n            _view.parentView = this;\n            this.views[name] = _view;\n        }\n        return _view;\n    },\n    remove: function remove() {\n        this.$el.replaceWith(this.$placeholder);\n        _backbone2.default.View.prototype.remove.call(this);\n        this.stopListening();\n        return this;\n    },\n\n    //Views can provide an isSelfClick function to determine what\n    //qualifies as a \"self click\" (main use case is parent containers\n    //with larger dimensions than all of its contained children)\n    registerCloseItem: function registerCloseItem(isSelfClick) {\n        var self = this;\n        closeItems.push(this);\n        this.$el.on('click', function (e) {\n            self.selfClicked = _lodash2.default.isFunction(isSelfClick) ? isSelfClick(e) : true;\n        });\n    },\n    popup: function popup(uri, name, features) {\n        window.open(uri, name, features);\n    },\n    viewData: function viewData(data) {\n        if (data) {\n            this._viewData = data;\n            return;\n        }\n        if (this._viewData) {\n            return this._viewData;\n        }\n        return this;\n    },\n    find: function find(prefix, id) {\n        return this.$('#' + prefix + '_' + id);\n    },\n    getParent: function getParent() {\n        if (this.parentView) {\n            return this.parentView.$el;\n        }\n        return (0, _jquery2.default)('body');\n    },\n    stopListening: function stopListening() {\n        _backbone2.default.Events.stopListening.apply(this, arguments);\n        _lodash2.default.each(this.views, function (view) {\n            view.stopListening();\n        });\n    },\n    render: function render(replaceContainer) {\n        if (this.template) {\n            var placeholder = exports.renderTo(this.getParent(), this.$el, this.template, this.placeholder, this.viewId, this.viewData(), replaceContainer);\n            if (placeholder) {\n                this.$placeholder = placeholder;\n            }\n            this.setElement(this.el);\n        }\n        _lodash2.default.each(this.views, function (view) {\n            view.render();\n        });\n    }\n});\nvar renderTo = exports.renderTo = function renderTo($parent, $el, template, placeholder, id, data, replaceContainer) {\n    var $container = void 0;\n    var templateId = void 0;\n    placeholder = placeholder || template;\n    templateId = !_lodash2.default.isUndefined(id) ? placeholder + '__' + id : placeholder;\n    $container = $parent.find('#template-' + templateId);\n    if (!$container.length) {\n        throw new Error('Could not find placeholder render element ' + templateId);\n    }\n    var templateName = $container.data('template') || 'athena/' + template;\n    var templateFunc = _templates2.default[templateName];\n    if (!templateFunc) {\n        throw new Error('Could not find handlebars template: ' + templateName);\n    }\n    $el.html(templateFunc(data));\n    // Figure out what's going on here...\n    if (replaceContainer || !$container.hasClass('inserted')) {\n        $el.addClass('inserted');\n        $el.attr('id', $container.attr('id'));\n        $container.replaceWith($el);\n        return $container;\n    }\n};\nvar svgSupported = exports.svgSupported = function svgSupported() {\n    return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Shape', '1.1');\n};\nvar colorIntTohtmlRGB = exports.colorIntTohtmlRGB = function colorIntTohtmlRGB(i) {\n    var r = i >> 16 & 255;\n    var g = i >> 8 & 255;\n    var b = i & 255;\n    return 'rgb(' + r + ',' + g + ',' + b + ')';\n};\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getMaskNodesForLinkage = exports.coaNodesToLinkageNodes = exports.getAmountColumn = exports.formatUnits = exports.getVisibleAmountColumns = exports.getUpdatedResetColumns = exports.getUpdatedHiddenColumns = exports.filterBreakdown = exports.filterAmountColumns = exports.convertToCumulativeAmounts = exports.toMap = exports.AmountsTypes = exports.isMultipleAmountColumnsEnabled = undefined;\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _schema_utils = __webpack_require__(120);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _numberTypes = __webpack_require__(87);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar isMultipleAmountColumnsEnabled = exports.isMultipleAmountColumnsEnabled = function isMultipleAmountColumnsEnabled(entity) {\n    return _lodash2.default.some(entity.attributes.feature_permissions, function (fp) {\n        return fp === 'multiple_amount_columns';\n    });\n};\n/**\r\n * Constants of supported amount types.\r\n *\r\n * Incremental - amounts for each period is the total of only the transactions dated during that period\r\n * Cumulative - amounts for each period is the total of previous periods plus the total of transactions during that period\r\n *              (totals accumulate over each period)\r\n */\nvar AmountsTypes = exports.AmountsTypes = {\n    Incremental: 'incremental',\n    Cumulative: 'cumulative'\n};\n/**\r\n * Creates a Immutable.OrderedMap indexing it using the provided `keyProperty`\r\n *\r\n * @param {Immutable.List} transactions - A collection of transactions to be converted to an ordered map\r\n * @param {string} keyProperty - The name of the property on each transaction object to be used as keys in the created map\r\n * @returns {Immutable.OrderedMap}\r\n */\nvar toMap = exports.toMap = function toMap(transactions, keyProperty) {\n    return transactions.reduce(function (r, t) {\n        return r.set(t.get(keyProperty), t);\n    }, Immutable.OrderedMap());\n};\n/**\r\n * Converts the transaction amounts from incremental to cumulative.\r\n *\r\n * @param {Immutable.List} aggregates - A collection of aggregate results from the query endpoint\r\n * @param {string} breakdownColumn - The column used for the breakdown\r\n * @param {string} amountColumn - The column used for the amounts\r\n * @returns {Immutable.List}\r\n */\nvar convertToCumulativeAmounts = exports.convertToCumulativeAmounts = function convertToCumulativeAmounts(aggregates, breakdownColumn, amountColumn) {\n    var prev = Immutable.OrderedMap();\n    var aggs = aggregates || Immutable.List();\n    return aggs.map(function (agg) {\n        return agg.update('transactions', function (trans) {\n            prev = prev.mergeWith(function (prevVal, nextVal) {\n                return prevVal.update(amountColumn, function (amt) {\n                    return amt + nextVal.get(amountColumn);\n                });\n            }, toMap(trans, breakdownColumn));\n            return prev.toList();\n        });\n    });\n};\n/**\r\n * Filter visible amount columns or default amount column if all amount columns are hidden\r\n *\r\n * @param {Immutable.List} schema - A collection that contains the schema\r\n * @returns { {Immutable.List} , {boolean} }\r\n */\nvar filterAmountColumns = exports.filterAmountColumns = function filterAmountColumns(visualization) {\n    var amountColumnOptions = visualization.get('amountColumns');\n    // Filter out only the visible columns\n    return amountColumnOptions ? amountColumnOptions.filter(function (column) {\n        return column.get('visible') === true;\n    }) : {};\n};\n/**\r\n * Filter breakdown according to the visible columns\r\n * @param {Immutable.List} visualization - An object that contains the visualization\r\n * @returns {Immutable.List}\r\n */\nvar filterBreakdown = exports.filterBreakdown = function filterBreakdown(visualization) {\n    var breakdowns = visualization.get('breakdownColumns');\n    return breakdowns ? breakdowns.filter(function (column) {\n        return column.get('visible') === true;\n    }) : {};\n};\n/**\r\n * Update visible parameter in the columns\r\n * @param {Immutable.List} columns - A collection of columns\r\n * @param {string} columnId - column Id\r\n * @param {boolean} visibility - A boolean to determine the visibility of the column\r\n * @returns { {Immutable.List} }\r\n */\nvar getUpdatedHiddenColumns = exports.getUpdatedHiddenColumns = function getUpdatedHiddenColumns(columns, columnId, visibility) {\n    return columns.size > 0 ? columns.update(columns.findIndex(function (breakdownAmountColumn) {\n        return breakdownAmountColumn.get('id') === columnId;\n    }), function (breakdownAmountColumn) {\n        var columnVisibility = visibility ? visibility : !breakdownAmountColumn.get('visible');\n        return breakdownAmountColumn.set('visible', columnVisibility);\n    }) : columns;\n};\n/**\r\n * reset visible parameter in the columns when action is cancelled\r\n * @param {Immutable.List} columns - A collection of columns\r\n * @param {string} columnId - column Id\r\n * @param {boolean} visibility - A boolean to determine the visibility of the column\r\n * @returns { {Immutable.List} }\r\n */\nvar getUpdatedResetColumns = exports.getUpdatedResetColumns = function getUpdatedResetColumns(columns, columnId) {\n    return columns.update(columns.findIndex(function (breakdownAmountColumn) {\n        return columnId === breakdownAmountColumn.get('id');\n    }), function (breakdownAmountColumn) {\n        return breakdownAmountColumn.set('visible', !breakdownAmountColumn.get('visible'));\n    });\n};\n/**\r\n * Filter amount columns according to the visible columns\r\n * @param {Immutable.List} stateColumns - A collection of available amount columns\r\n * @returns {Array}\r\n */\nvar getVisibleAmountColumns = exports.getVisibleAmountColumns = function getVisibleAmountColumns(stateColumns) {\n    return stateColumns ? _lodash2.default.map(stateColumns.filter(function (column) {\n        return column.get('visible') === true;\n    }).toJS(), 'id') : [];\n};\n/**\r\n * Formats units based on their type\r\n *\r\n * @param {Immutable.List} schema - A collection that contains the schema of the report\r\n * @param {string} amountColumnName - The column used for the amounts\r\n * @param {string} units - The units that need to be formatted\r\n * @returns {string}\r\n */\nvar formatUnits = exports.formatUnits = function formatUnits(schema, amountColumnName, units) {\n    var showCurrencySymbol = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\n    if (!_lodash2.default.isUndefined(units) && !_lodash2.default.isNull(units)) {\n        var targetCol = (0, _schema_utils.findColumnByName)(schema, amountColumnName);\n        var targetColType = targetCol ? targetCol.get('type') : 'monetary';\n        var reportAmountType = (0, _numberTypes.columnTypeToNumberType)(targetColType, schema.get('locale'));\n        if (targetColType === 'monetary') {\n            var formattedUnits = showCurrencySymbol ? reportAmountType.formatter(_utils2.default.formatMonetary(units)) : _utils2.default.formatMonetary(units);\n            return formattedUnits;\n        } else {\n            return _strings2.default.addCommasKeepDecimal(units);\n        }\n    }\n    return null;\n};\n/**\r\n * Get the amount column from the visualization object\r\n *\r\n * @param {Immutable.List} visualization - A collection that contains the visualization object\r\n * @returns {string}\r\n */\nvar getAmountColumn = exports.getAmountColumn = function getAmountColumn(visualization, schema) {\n    if (visualization && visualization.get('amountColumn')) {\n        return visualization.get('amountColumn');\n    }\n    // If for any reason the visualization object doesn't contain the amountColumn\n    // use the amountColumn from schema\n    return schema.get('amountColumn');\n};\nfunction isLedgerTree(treeId) {\n    return _lodash2.default.includes(['expenses', 'revenues', 'assets', 'liabilities', 'fteCount'], treeId);\n}\nvar coaNodesToLinkageNodes = exports.coaNodesToLinkageNodes = function coaNodesToLinkageNodes(nodes, nodesForLinkage) {\n    var nodesWithTreesExpanded = _lodash2.default.reduce(nodes, function (acc, node) {\n        // If a tree is fully selected we can just exclude it from the linkage nodes query.\n        // But if the tree is a ledger tree, we must still send up each of the root ledger nodes.\n        if (node.isTree) {\n            if (isLedgerTree(node.id)) {\n                return acc.concat(node.children);\n            }\n            return acc;\n        }\n        return acc.concat(node);\n    }, []);\n    // Produce an object that indexes trees and their categories by ID.\n    // {\n    //   'tree_id': { 'category_0': [node_0, node_1, ...] }\n    // }\n    var trees = _lodash2.default.reduce(nodesWithTreesExpanded, function (acc, node) {\n        var treeId = isLedgerTree(node.tree_id) ? 'ledger_tree' : node.tree_id;\n        var categories = acc[treeId] || (acc[treeId] = {});\n        var memberIds = node.memberIds || [node.id];\n        _lodash2.default.each(memberIds, function (member) {\n            var depth = nodesForLinkage[member]['depth'];\n            if (categories[depth]) {\n                categories[depth].push(member);\n            } else {\n                categories[depth] = [member];\n            }\n        });\n        return acc;\n    }, {});\n    return _lodash2.default.reduce(trees, function (acc, categories, treeId) {\n        return acc.concat.apply(acc, _toConsumableArray(_lodash2.default.map(categories, function (categoryNodes, depth) {\n            return {\n                tree_id: treeId,\n                category: parseInt(depth),\n                selected_node_ids: categoryNodes\n            };\n        })));\n    }, []);\n};\nvar getMaskNodesForLinkage = exports.getMaskNodesForLinkage = function getMaskNodesForLinkage(masksForLinkage, nodesForLinkage) {\n    /***\r\n     * TODO: REP-1495 This can be merged as part of linkage node as a separate attributed\r\n    ***/\n    /***\r\n     * Produce an object that indexes trees and their categories by ID.\r\n     * {\r\n     *   'tree_id': { 'category_0': [node_0, node_1, ...] }\r\n     * }\r\n    ***/\n    var mask_node_array = masksForLinkage['nodes'];\n    if (!Array.isArray(mask_node_array) || !mask_node_array.length) {\n        return [];\n    }\n    var trees = _lodash2.default.reduce(mask_node_array, function (acc, node) {\n        var treeId = isLedgerTree(node.tree_id) ? 'ledger_tree' : node.tree_id;\n        var categories = acc[treeId] || (acc[treeId] = {});\n        var memberIds = node.memberIds;\n        if (!Array.isArray(memberIds) || !memberIds.length) {\n            memberIds = [node.id];\n        }\n        _lodash2.default.each(memberIds, function (member) {\n            var depth = nodesForLinkage[member]['depth'];\n            if (categories[depth]) {\n                categories[depth].push(member);\n            } else {\n                categories[depth] = [member];\n            }\n        });\n        return acc;\n    }, {});\n    return _lodash2.default.reduce(trees, function (acc, categories, treeId) {\n        return acc.concat.apply(acc, _toConsumableArray(_lodash2.default.map(categories, function (categoryNodes, depth) {\n            return {\n                tree_id: treeId,\n                category: parseInt(depth),\n                masked_node_ids: categoryNodes\n            };\n        })));\n    }, []);\n};\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\n\n/**\n * Methods mixed in to other classes for event capabilities.\n * @mixin Evented\n */\nvar Evented = {\n\n    /**\n     * Subscribe to a specified event with a listener function the latter gets the data object that was passed to `fire` and additionally `target` and `type` properties\n     *\n     * @param {string} type Event type\n     * @param {Function} listener Function to be called when the event is fired\n     * @returns {Object} `this`\n     */\n    on: function(type, listener) {\n        this._events = this._events || {};\n        this._events[type] = this._events[type] || [];\n        this._events[type].push(listener);\n\n        return this;\n    },\n\n    /**\n     * Remove a event listener\n     *\n     * @param {string} [type] Event type. If none is specified, remove all listeners\n     * @param {Function} [listener] Function to be called when the event is fired. If none is specified all listeners are removed\n     * @returns {Object} `this`\n     */\n    off: function(type, listener) {\n        if (!type) {\n            // clear all listeners if no arguments specified\n            delete this._events;\n            return this;\n        }\n\n        if (!this.listens(type)) return this;\n\n        if (listener) {\n            var idx = this._events[type].indexOf(listener);\n            if (idx >= 0) {\n                this._events[type].splice(idx, 1);\n            }\n            if (!this._events[type].length) {\n                delete this._events[type];\n            }\n        } else {\n            delete this._events[type];\n        }\n\n        return this;\n    },\n\n    /**\n     * Call a function once when an event has fired\n     *\n     * @param {string} type Event type.\n     * @param {Function} listener Function to be called once when the event is fired\n     * @returns {Object} `this`\n     */\n    once: function(type, listener) {\n        var wrapper = function(data) {\n            this.off(type, wrapper);\n            listener.call(this, data);\n        }.bind(this);\n        this.on(type, wrapper);\n        return this;\n    },\n\n    /**\n     * Fire event of a given string type with the given data object\n     *\n     * @param {string} type Event type\n     * @param {Object} [data] Optional data passed to the event receiver (e.g. {@link EventData})\n     * @returns {Object} `this`\n     */\n    fire: function(type, data) {\n        if (!this.listens(type)) return this;\n\n        data = util.extend({}, data);\n        util.extend(data, {type: type, target: this});\n\n        // make sure adding/removing listeners inside other listeners won't cause infinite loop\n        var listeners = this._events[type].slice();\n\n        for (var i = 0; i < listeners.length; i++) {\n            listeners[i].call(this, data);\n        }\n\n        return this;\n    },\n\n    /**\n     * Check if an event is registered to a type\n     * @param {string} type Event type\n     * @returns {boolean} `true` if there is at least one registered listener for events of type `type`\n     */\n    listens: function(type) {\n        return !!(this._events && this._events[type]);\n    }\n};\n\nmodule.exports = Evented;\n\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WizardStep = {\n    propTypes: {\n        report: _propTypes2.default.object.isRequired,\n        onNextStep: _propTypes2.default.func\n    },\n    _isMounted: null,\n    render: function render() {\n        if (this.state.loading) {\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-loading\" }));\n        }\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, this.renderFooter ? this.renderFooter() : this.renderActions()), !this.props.report.isNew() ? _react2.default.createElement(\"header\", { className: \"ui-panel__sub-header\" }, _react2.default.createElement(\"h4\", null, _react2.default.createElement(\"a\", { className: \"ui-panel__back\", onClick: _settings_panel_actions2.default.goBack }, \"Back\"), \"Report data\")) : null, this.props.report.isNew() && this.renderHeader ? _react2.default.createElement(\"header\", { className: \"ui-panel__sub-header\" }, this.renderHeader()) : null, _react2.default.createElement(\"div\", { className: \"ui-panel__content ui-container_scroll\" }, this.renderContent()));\n    },\n    renderActions: function renderActions() {\n        var nextButtonText = 'Next';\n        if (this.props.isLastStep) {\n            if (this.props.report.isNew()) {\n                nextButtonText = this.props.saving ? 'Creating...' : 'Create';\n            } else {\n                nextButtonText = this.props.saving ? 'Saving...' : 'Save';\n            }\n        }\n        return _react2.default.createElement(\"div\", null, this.props.canGoBack ? _react2.default.createElement(\"button\", { className: \"ui-button pull-left back\", onClick: this.prevStep }, _react2.default.createElement(\"span\", { className: \"icon-left-1\" }), \"Back\") : null, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost\", onClick: this.cancel }, \"Cancel\"), !this.props.isFirstStep ? _react2.default.createElement(\"button\", { className: \"ui-button primary\", disabled: !this.isValid() || this.props.saving, onClick: this.handleClickNext }, nextButtonText) : null));\n    },\n    componentDidMount: function componentDidMount() {\n        this._isMounted = true;\n        this.props.report.on('change', this.handleChange, this);\n    },\n    componentWillUmount: function componentWillUmount() {\n        this._isMounted = false;\n        this.props.report.off(null, null, this);\n    },\n    handleChange: function handleChange() {\n        this._isMounted && this.forceUpdate();\n    },\n    handleClickNext: function handleClickNext() {\n        this.nextStep();\n    },\n    nextStep: function nextStep(skip) {\n        var onNextStep = this.props.onNextStep;\n        if (onNextStep && this.isValid()) {\n            onNextStep(skip);\n        }\n    },\n    prevStep: function prevStep() {\n        this.props.onPrevStep && this.props.onPrevStep();\n    },\n    cancel: function cancel() {\n        this.props.onCancel && this.props.onCancel();\n    }\n};\nexports.default = WizardStep;\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(170);\nvar defined = __webpack_require__(74);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(171);\nvar createDesc = __webpack_require__(105);\nvar toIObject = __webpack_require__(58);\nvar toPrimitive = __webpack_require__(73);\nvar has = __webpack_require__(57);\nvar IE8_DOM_DEFINE = __webpack_require__(686);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(27) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(57);\nvar toObject = __webpack_require__(32);\nvar IE_PROTO = __webpack_require__(326)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(98);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SessionStore = function (_BaseStore) {\n  _inherits(SessionStore, _BaseStore);\n\n  function SessionStore() {\n    _classCallCheck(this, SessionStore);\n\n    var _this = _possibleConstructorReturn(this, (SessionStore.__proto__ || Object.getPrototypeOf(SessionStore)).call(this));\n\n    _this.getSession = function () {\n      return _this._session;\n    };\n\n    _this.getEntity = function () {\n      if (!_this._session || _this._session.isOpenGov()) {\n        return null;\n      }\n\n      return _this._session && _this._session.entity.toJSON();\n    };\n\n    _this.hasFeaturePermission = function (feature) {\n      if (!_this._session) {\n        return false;\n      }\n\n      // OpenGov users should have all features enabled.\n      if (_this._session.isOpenGov()) {\n        return true;\n      }\n\n      return _lodash2.default.contains(_this._session.get('feature_permissions'), feature);\n    };\n\n    _this._session = null;\n    _this._onSessionChange = null;\n\n    _og_flux.Dispatcher.register(function (payload) {\n      return _this._handleAction(payload.action);\n    });\n    return _this;\n  }\n\n  _createClass(SessionStore, [{\n    key: 'analyticsIdentify',\n\n\n    // NOTE: The meat of this function should probably live in og_analytics,\n    //       but it has outstanding PRs that other projects are relying on.\n    //       Once those are merged, we can move this over there.\n    value: function analyticsIdentify() {\n      if (this._session) {\n        var session = this._session;\n        var entity = session.entity;\n        var email = session.attributes.email;\n\n        if (entity && email) {\n          var role = session.attributes.role && session.attributes.role.name;\n          window.intercomSettings = {\n            email: email,\n            user_id: session.attributes.id,\n            role: role,\n            full_name: session.attributes.full_name,\n            app_id: window.gon && window.gon.intercomAppId,\n            user_hash: session.attributes.user_intercom_hash,\n            company: {\n              id: entity.attributes.entity_id,\n              name: entity.attributes.name,\n              created_at: entity.attributes.created_at\n            }\n          };\n          if (window.heap) {\n            var identityHash = {\n              og_user_id: session.attributes.id,\n              role: role,\n              subdomain: entity.attributes.subdomain\n            };\n            window.heap.identify(email);\n            window.heap.addUserProperties(identityHash);\n          }\n        }\n      }\n    }\n  }, {\n    key: '_handleAction',\n    value: function _handleAction(action) {\n      switch (action.actionType) {\n        case 'CONTROL_PANEL_INITIALIZE':\n          this._onSessionChange = action.onSessionChange;\n          break;\n\n        case 'SESSION_SYNC':\n          this._session = action.session;\n          this.analyticsIdentify();\n          if (this._onSessionChange) {\n            this._onSessionChange(action.session);\n          }\n          this.emitChange();\n          break;\n\n        default:\n        // do nothing\n      }\n    }\n  }]);\n\n  return SessionStore;\n}(_og_flux.BaseStore);\n\nexports.default = new SessionStore();\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nexports.create = function (tagName, className, container) {\n    var el = document.createElement(tagName);\n    if (className) el.className = className;\n    if (container) container.appendChild(el);\n    return el;\n};\n\nvar docStyle = document.documentElement.style;\n\nfunction testProp(props) {\n    for (var i = 0; i < props.length; i++) {\n        if (props[i] in docStyle) {\n            return props[i];\n        }\n    }\n}\n\nvar selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']),\n    userSelect;\nexports.disableDrag = function () {\n    if (selectProp) {\n        userSelect = docStyle[selectProp];\n        docStyle[selectProp] = 'none';\n    }\n};\nexports.enableDrag = function () {\n    if (selectProp) {\n        docStyle[selectProp] = userSelect;\n    }\n};\n\nvar transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n    el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n    window.addEventListener('click', suppressClick, true);\n    window.setTimeout(function() {\n        window.removeEventListener('click', suppressClick, true);\n    }, 0);\n};\n\nexports.mousePos = function (el, e) {\n    var rect = el.getBoundingClientRect();\n    e = e.touches ? e.touches[0] : e;\n    return new Point(\n        e.clientX - rect.left - el.clientLeft,\n        e.clientY - rect.top - el.clientTop\n    );\n};\n\nexports.touchPos = function (el, e) {\n    var rect = el.getBoundingClientRect(),\n        points = [];\n    for (var i = 0; i < e.touches.length; i++) {\n        points.push(new Point(\n            e.touches[i].clientX - rect.left - el.clientLeft,\n            e.touches[i].clientY - rect.top - el.clientTop\n        ));\n    }\n    return points;\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function getType(val) {\n    if (val instanceof Number) {\n        return 'number';\n    } else if (val instanceof String) {\n        return 'string';\n    } else if (val instanceof Boolean) {\n        return 'boolean';\n    } else if (Array.isArray(val)) {\n        return 'array';\n    } else if (val === null) {\n        return 'null';\n    } else {\n        return typeof val;\n    }\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.6.11' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(46);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar fails = __webpack_require__(19);\n\nmodule.exports = function (method, arg) {\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call\n    arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n  });\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.setMomentFormat = exports.setMomentDate = exports.buildLegendColorMap = exports.updateColorMap = undefined;\nexports.keyIn = keyIn;\nexports.savedStateApiFormat = savedStateApiFormat;\nexports.generateXAxis = generateXAxis;\nexports.getGridState = getGridState;\nexports.isMapEnabled = isMapEnabled;\nexports.isQueryOptimizationEnabled = isQueryOptimizationEnabled;\nexports.initialState = initialState;\n\nvar _og_flux = __webpack_require__(15);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _filesize = __webpack_require__(890);\n\nvar _filesize2 = _interopRequireDefault(_filesize);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _date_utils = __webpack_require__(891);\n\nvar _querymodel = __webpack_require__(260);\n\nvar _querymodel2 = _interopRequireDefault(_querymodel);\n\nvar _config = __webpack_require__(146);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _target_utils = __webpack_require__(99);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _map_constants = __webpack_require__(45);\n\nvar _layer_utils = __webpack_require__(509);\n\nvar _geodata_utils = __webpack_require__(147);\n\nvar _schema_utils = __webpack_require__(120);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// used for Immuatable equivalents of omit and pick\n// taken from https://github.com/facebook/immutable-js/wiki/Predicates#pick--omit\nfunction keyIn() {\n    for (var _len = arguments.length, keys = Array(_len), _key = 0; _key < _len; _key++) {\n        keys[_key] = arguments[_key];\n    }\n\n    var keySet = _immutable2.default.Set(arguments);\n    return function (v, k) {\n        return keySet.has(k);\n    };\n}\nfunction makeCheckDataObject(fiscalData, title) {\n    if (!fiscalData) {\n        return null;\n    }\n    return { name: title || 'FY ' + fiscalData.fiscal_year, url: fiscalData.file_url, size: (0, _filesize2.default)(fiscalData.file_size, { round: 0 }) };\n}\nfunction pushHistory(state, history) {\n    var currentStateId = state.get('savedStateId');\n    if (currentStateId) {\n        var item = savedStateApiFormat(state);\n        return history.push(item);\n    }\n    return history;\n}\n//get the breakdownColumns and amountColumns from the schema\nfunction getschemaAmountBreakdownColumns(schema) {\n    var columns = rejectInvisible(schema);\n    var breakdownColumns = _immutable2.default.fromJS(_lodash2.default.sortBy(_lodash2.default.filter(columns, function (column) {\n        return column.type === 'text' || _lodash2.default.includes(_map_constants.GeocoderMapDataTypes, column.type);\n    }), 'name'));\n    var amountColumnTypes = ['monetary', 'numeric'];\n    var amountColumns = _immutable2.default.fromJS(_lodash2.default.sortBy(_lodash2.default.filter(columns, function (column) {\n        return amountColumnTypes.indexOf(column.type) > -1;\n    }), 'name'));\n    return { breakdownColumns: breakdownColumns, amountColumns: amountColumns };\n}\n//convert comma seperated string of visible column ids to column metadata objects\nfunction getVisualizationObjects(schemaBreakdownColumns, columnsString) {\n    var visibleBreakdownColumnsArray = columnsString.split(',');\n    var updatedschemaBreakdownColumns = (0, _immutable.fromJS)(schemaBreakdownColumns);\n    updatedschemaBreakdownColumns.filter(function (column) {\n        var visibility = _lodash2.default.includes(visibleBreakdownColumnsArray, column.get('id'));\n        updatedschemaBreakdownColumns = (0, _transactions_utils.getUpdatedHiddenColumns)(updatedschemaBreakdownColumns, column.get('id'), visibility);\n    });\n    return updatedschemaBreakdownColumns;\n}\n//convert objects to comma seperated string of visible column ids\nfunction visualizationApiFormat(state) {\n    var visualization = state.get('visualization');\n    var breakdownColumns = visualization.get('breakdownColumns');\n    var amountColumns = visualization.get('amountColumns');\n    var visibleBreakdownColumnsString = _lodash2.default.isEmpty(breakdownColumns) ? '' : getApiString(breakdownColumns);\n    var visibleAmountColumnsString = _lodash2.default.isEmpty(amountColumns) ? '' : getApiString(amountColumns);\n    return { visibleBreakdownColumnsString: visibleBreakdownColumnsString, visibleAmountColumnsString: visibleAmountColumnsString };\n}\nfunction getApiString(columns) {\n    //TODO Change string to JSON\n    var visibleColumns = typeof columns == 'string' ? columns : _lodash2.default.map(columns.filter(function (column) {\n        return column.get('visible') == true;\n    }).toJS(), 'id');\n    var visibleColumnsString = typeof visibleColumns == 'string' ? visibleColumns : visibleColumns.join(',');\n    return visibleColumnsString;\n}\n//called when saving from the grid report\nfunction getSchemaVisualizationColumnsSaving(nextSavedState, state) {\n    var updatedSchemaBreakdownColumns = nextSavedState ? nextSavedState.getIn(['visualization', 'breakdownColumns']) : [];\n    var updatedSchemaAmountColumns = nextSavedState ? nextSavedState.getIn(['visualization', 'amountColumns']) : [];\n    if (typeof updatedSchemaBreakdownColumns == 'string') {\n        var schemaBreakdownColumns = state.getIn(['schema', 'breakdownColumns']);\n        updatedSchemaBreakdownColumns = getVisualizationObjects((0, _immutable.fromJS)(schemaBreakdownColumns), updatedSchemaBreakdownColumns);\n    }\n    if (typeof updatedSchemaAmountColumns == 'string') {\n        var schemaAmountColumns = state.getIn(['schema', 'amountColumns']);\n        updatedSchemaAmountColumns = getVisualizationObjects((0, _immutable.fromJS)(schemaAmountColumns), updatedSchemaAmountColumns);\n    }\n    return { updatedSchemaBreakdownColumns: updatedSchemaBreakdownColumns, updatedSchemaAmountColumns: updatedSchemaAmountColumns };\n}\nfunction getSchemaVisualizationColumnsLoading(state, schema, breakdownColumns, amountColumns) {\n    var schemaBreakdownColumns = state.getIn(['schema', 'breakdownColumns']);\n    var schemaAmountColumns = state.getIn(['schema', 'amountColumns']);\n    var updatedSchemaBreakdownColumns = {};\n    var updatedSchemaAmountColumns = {};\n    if (schemaBreakdownColumns.size == 0) {\n        var _getschemaAmountBreak = getschemaAmountBreakdownColumns(schema),\n            _breakdownColumns = _getschemaAmountBreak.breakdownColumns,\n            _amountColumns = _getschemaAmountBreak.amountColumns;\n\n        schemaBreakdownColumns = _breakdownColumns;\n        schemaAmountColumns = _amountColumns;\n    }\n    updatedSchemaBreakdownColumns = typeof breakdownColumns == 'string' && schemaBreakdownColumns.size !== 0 ? getVisualizationObjects(schemaBreakdownColumns, breakdownColumns) : breakdownColumns;\n    updatedSchemaAmountColumns = typeof amountColumns == 'string' && schemaAmountColumns.size !== 0 ? getVisualizationObjects(schemaAmountColumns, amountColumns) : amountColumns;\n    return { updatedSchemaBreakdownColumns: updatedSchemaBreakdownColumns, updatedSchemaAmountColumns: updatedSchemaAmountColumns };\n}\nfunction savedStateApiFormat(state) {\n    var grid = state.get('grid');\n    var currentCheckData = state.get('currentCheckData');\n    var visualization = state.get('visualization');\n\n    var _visualizationApiForm = visualizationApiFormat(state),\n        visibleBreakdownColumnsString = _visualizationApiForm.visibleBreakdownColumnsString,\n        visibleAmountColumnsString = _visualizationApiForm.visibleAmountColumnsString;\n\n    grid = grid.mergeDeep((0, _immutable.fromJS)({\n        embed: (0, _embed_utils.getEmbedType)(),\n        id: state.get('savedStateId'),\n        currentCheckData: {\n            quasiId: currentCheckData.get('quasiId'),\n            rowTop: currentCheckData.get('rowTop')\n        },\n        visualization: {\n            breakdown: visualization.get('breakdown'),\n            index: visualization.get('index'),\n            graphType: visualization.get('graphType'),\n            isVisible: visualization.get('isVisible'),\n            showLegend: visualization.get('showLegend'),\n            currentMapType: visualization.get('currentMapType'),\n            mapBounds: visualization.get('mapBounds'),\n            heatmapType: visualization.get('heatmapType'),\n            mapAmountColumn: visualization.get('mapAmountColumn'),\n            target: visualization.get('target'),\n            amountsType: visualization.get('amountsType'),\n            amountColumn: visualization.get('amountColumn'),\n            legendSortBy: visualization.get('legendSortBy'),\n            breakdownColumns: visibleBreakdownColumnsString,\n            amountColumns: visibleAmountColumnsString\n        },\n        lastXYZDays: state.get('lastXYZDays')\n    }));\n    if (visualization.get('limit') !== Infinity) {\n        grid = grid.setIn(['visualization', 'limit'], visualization.get('limit'));\n    }\n    return _immutable2.default.fromJS(grid);\n}\nfunction generateMoment(year, month, date) {\n    return (0, _moment2.default)().set({\n        month: month - 1,\n        date: date,\n        year: year\n    });\n}\nfunction getTickInfo(tick) {\n    return {\n        fiscal_year: tick.fiscal_year,\n        year: tick.year,\n        month: tick.month,\n        start_day: tick.start_day,\n        end_day: tick.end_day\n    };\n}\nfunction generateXAxis(transactions, fiscalYearStartMonth, isDateColumnComputed) {\n    var transactionsSize = _lodash2.default.size(transactions);\n    var isSingleTick = transactionsSize === 1;\n    // if we only have one tick to display on the x-axis...\n    if (isSingleTick) {\n        var tickLabel = void 0;\n        var tick = transactions[0];\n\n        var _getTickInfo = getTickInfo(tick),\n            fiscal_year = _getTickInfo.fiscal_year,\n            year = _getTickInfo.year,\n            month = _getTickInfo.month,\n            start_day = _getTickInfo.start_day,\n            end_day = _getTickInfo.end_day;\n\n        var m = generateMoment(year, month, start_day);\n        // if our date has been computed, we should just show the fiscal year\n        if (isDateColumnComputed) {\n            // if fiscalYearStartMonth is other than January, then we should re-calculate fiscalYear to be sent\n            // e.g. for fiscalYearStartMonth=July, year=2016, month=October, year should be incremented to 2017 and result in 2016-17\n            // e.g. for fiscalYearStartMonth=July, year=2016, month=February, year should remain the same and result in 2015-16\n            var adjustedFiscalYear = fiscalYearStartMonth !== 1 && month >= fiscalYearStartMonth ? year + 1 : year;\n            tickLabel = _strings2.default.fiscalYear(adjustedFiscalYear, fiscalYearStartMonth);\n            // otherwise, show the range of days the tick contains\n        } else if (start_day && end_day) {\n            // module.exports allows to spy on & insure setMomentFormat is called with the right format\n            // no.\n            var startDayString = (0, _date_utils.setMomentFormat)((0, _date_utils.setMomentDate)(m, start_day), 'MMM Do');\n            var endDayString = (0, _date_utils.setMomentFormat)((0, _date_utils.setMomentDate)(m, end_day), 'MMM Do, YYYY');\n            tickLabel = startDayString + ' to ' + endDayString;\n        } else if (fiscal_year) {\n            tickLabel = fiscal_year;\n        }\n        return [{\n            index: 0,\n            value: tickLabel,\n            result: tick\n        }];\n    }\n    // if we have multiple ticks to display on the x-axis...\n    return _lodash2.default.map(transactions, _lodash2.default.bind(function (tick, index) {\n        var _getTickInfo2 = getTickInfo(tick),\n            fiscal_year = _getTickInfo2.fiscal_year,\n            year = _getTickInfo2.year,\n            month = _getTickInfo2.month,\n            start_day = _getTickInfo2.start_day;\n\n        var tickLabel = void 0;\n        // if we have years for xAxis ticks...\n        if (fiscal_year) {\n            tickLabel = _strings2.default.fiscalYear(fiscal_year, fiscalYearStartMonth);\n            // if we have months for xAxis ticks...\n        } else if (year && month) {\n            var _m = generateMoment(year, month, start_day);\n            tickLabel = (0, _date_utils.setMomentFormat)(_m, 'MMM YYYY');\n        }\n        return {\n            index: index,\n            value: tickLabel,\n            result: tick\n        };\n    }, this));\n}\nfunction getGridState(state) {\n    var filter = state.getIn(['grid', 'query', 'filter']);\n    var columns = state.getIn(['schema', 'columns']);\n    // Exclude any filters referencing columns that do not exist\n    if (filter && columns) {\n        var filterColumnIds = _lodash2.default.keys(filter.toObject());\n        var columnIds = columns.map(function (c) {\n            return c.get('id');\n        }).toArray().concat(_config.GriddleSettings.ignoredFields);\n        var invalidColumns = _lodash2.default.difference(filterColumnIds, columnIds);\n        var cleanFilter = _lodash2.default.reduce(invalidColumns, function (filter, column) {\n            return filter.remove(column);\n        }, filter);\n        return state.get('grid').setIn(['query', 'filter'], cleanFilter);\n    }\n    return state.get('grid');\n}\nvar initialModalState = {\n    showHowTo: false,\n    showTOS: false,\n    showExportFilter: false,\n    showWelcome: false,\n    showBudget101: false,\n    onboardingTour: {\n        showTour: false,\n        currentStep: 0\n    }\n};\nfunction rejectInvisible(columns) {\n    return _lodash2.default.reject(columns, function (c) {\n        return _lodash2.default.includes(_config.GriddleSettings.ignoredFields, c.id);\n    });\n}\nfunction isMapEnabled(state) {\n    var schema = state && state.get('schema');\n    var entity = _report_view_store2.default && _report_view_store2.default.getReportEntity();\n    if (!schema || !entity) {\n        return false;\n    }\n    var columns = schema.get('columns');\n    var features = entity.get('feature_permissions');\n    if (!columns || !features) {\n        return false;\n    }\n    var hasMapsFeaturePermission = _lodash2.default.some(['maps_light', 'maps_pro'], function (feature) {\n        return _lodash2.default.includes(_lodash2.default.isArray(features) ? features : features.toJS(), feature);\n    });\n    var hasMapColumns = columns.some(function (c) {\n        return _lodash2.default.some(_map_constants.AllMapDataTypes, function (type) {\n            return type === c.get('type');\n        });\n    });\n    return hasMapsFeaturePermission && hasMapColumns;\n}\nfunction isQueryOptimizationEnabled() {\n    var entity = _report_view_store2.default && _report_view_store2.default.getReportEntity();\n    var features = entity.get('feature_permissions') || [];\n    return features.includes('optimize_queries');\n}\nfunction areMapTooltipsEditable(state) {\n    return isMapEnabled(state) && (0, _map_constants.canEditTooltips)(_session_store2.default.getSession());\n}\nvar DEFAULT_LIMIT = 8;\nvar LIMIT_INCREMENT = 4;\nfunction initialState() {\n    var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    return {\n        loading: false,\n        rebuilding: false,\n        embed: (0, _embed_utils.getEmbedType)(),\n        locale: defaults.locale || 'en_US',\n        visualization: {\n            availableGraphTypes: ['horizontal_stacked', 'treemap', 'line', 'bar', 'pie', 'map'],\n            reportAmountType: defaults.reportAmountType || _numberTypes.numberTypes.dollar,\n            xAxis: _immutable2.default.List(),\n            index: Infinity,\n            isVisible: defaults.visualization_visible !== false,\n            showLegend: true,\n            isLoading: true,\n            isSummaryLoading: true,\n            mapLoading: false,\n            mapDataLoading: false,\n            isError: false,\n            graphType: isMapEnabled() ? 'map' : 'bar',\n            breakdown: defaults.visualization_breakdown || '',\n            breakdownColumns: [],\n            amountColumns: [],\n            breakdownValueNames: [],\n            amountsType: _transactions_utils.AmountsTypes.Incremental,\n            limit: DEFAULT_LIMIT,\n            tooltip: {\n                isVisible: false,\n                name: '',\n                value: 0,\n                left: 0,\n                top: 0,\n                percentage: 0\n            },\n            mapTooltip: {\n                config: defaults.map_tooltips ? (0, _map_constants.getCurrentTooltipFromProperties)(defaults) : null,\n                draft: null,\n                selectableColumns: [],\n                setupComplete: !!defaults.map_tooltips,\n                editing: false,\n                editable: false,\n                itemsForTooltip: null,\n                locationForTooltip: null,\n                loading: false\n            },\n            aggregates: {},\n            currentMapType: _map_constants.MapTypes.Point.name,\n            availableMapTypes: [_map_constants.MapTypes.Point, _map_constants.MapTypes.Bubble, _map_constants.MapTypes.Heatmap],\n            mapLegendPage: 1,\n            mapBounds: null,\n            mapAmountColumn: null,\n            heatmapType: _map_constants.MapTypes.Heatmap.types.density,\n            target: _immutable2.default.Map(),\n            amountColumn: defaults.amount_column || '',\n            legendSortBy: 'desc'\n        },\n        map: {\n            data: null,\n            extractors: {},\n            legendColorMap: null,\n            dataStats: {\n                minAmount: 0,\n                maxAmount: 0,\n                bounds: null,\n                isInvalid: true\n            },\n            loaderGrid: null\n        },\n        visualizationDefaultState: {\n            index: Infinity,\n            isLoading: true,\n            isSummaryLoading: true,\n            isVisible: defaults.visualization_visible !== false,\n            showLegend: true,\n            graphType: 'bar',\n            breakdown: defaults.visualization_breakdown || '',\n            limit: DEFAULT_LIMIT,\n            xAxis: _immutable2.default.List()\n        },\n        lastXYZDays: null,\n        schema: {\n            fiscalYearStartMonth: 1,\n            dateColumn: '',\n            columns: [],\n            reportAmountType: _numberTypes.numberTypes.dollar,\n            number_of_decimals: 2,\n            breakdownColumns: [],\n            amountColumns: [],\n            defaultBreakdown: ''\n        },\n        queryModel: new _querymodel2.default(),\n        downloads: null,\n        currentCheckData: {\n            loading: false,\n            data: null,\n            visible: false,\n            quasiId: null,\n            amountColumn: null\n        },\n        showHowTo: false,\n        showTOS: false,\n        showExportFilter: false,\n        showTargetPanel: false,\n        relatedTransactions: {\n            loading: true,\n            amount: null\n        },\n        showBudget101: false,\n        showWelcome: null,\n        onboardingTour: {\n            currentStep: 0,\n            showTour: false\n        },\n        grid: {},\n        savedStateId: null,\n        defaultSavedStateId: defaults.grid_state_id,\n        history: [],\n        filteredExport: {\n            state: 'enqueued',\n            job_result: {}\n        },\n        filterState: {\n            activeFilterIds: {}\n        }\n    };\n}\nvar modifyDateFilter = function modifyDateFilter(state, ge, le) {\n    state.get('queryModel').filterColumn(state.getIn(['schema', 'dateColumn']), 'ge', ge);\n    state.get('queryModel').filterColumn(state.getIn(['schema', 'dateColumn']), 'le', le);\n};\nvar updateColorMap = exports.updateColorMap = function updateColorMap(state) {\n    var breakdownValues = state.get('breakdownValues');\n    if (!breakdownValues || breakdownValues.length == 0) {\n        return state;\n    }\n    var breakdown = state.getIn(['visualization', 'breakdown']);\n    var currentColorMap = state.getIn(['map', 'dataColorMap']) || {};\n    var dataColorMap = (0, _map_constants.getColorMapFor)(breakdownValues, breakdown, currentColorMap);\n    return state.setIn(['visualization', 'dataColorMap'], dataColorMap).setIn(['map', 'legendColorMap'], (0, _map_constants.getLegendColorMap)(breakdownValues, breakdown, dataColorMap)).setIn(['map', 'extractors', 'colorExtractor'], (0, _map_constants.getColorExtractorFor)(breakdown, dataColorMap));\n};\nvar buildLegendColorMap = exports.buildLegendColorMap = function buildLegendColorMap(mapData, breakdown, colorMap) {\n    return mapData.map(function (row) {\n        return row[breakdown];\n    }).filter(function (label) {\n        return !_lodash2.default.isNull(label) && colorMap && colorMap[label];\n    }).reduce(function (map, label) {\n        return _lodash2.default.assign(map, _defineProperty({}, label, colorMap[label]));\n    }, {});\n};\nvar updateMapLayer = function updateMapLayer(state) {\n    if (state.getIn(['visualization', 'graphType']) !== 'map') {\n        return state;\n    }\n    var currentMapType = state.getIn(['visualization', 'currentMapType']);\n    if (_layer_utils.FeatureLayerTypes.some(function (typeName) {\n        return typeName === currentMapType;\n    })) {\n        state = state.setIn(['map', 'layer'], (0, _layer_utils.getLayerForMapType)(currentMapType, state));\n    }\n    return state;\n};\nvar updateMapState = function updateMapState(state) {\n    var itemsForTooltip = state.getIn(['visualization', 'mapTooltip', 'itemsForTooltip']);\n    var locationForTooltip = state.getIn(['visualization', 'mapTooltip', 'locationForTooltip']);\n    var isLoadingTooltip = !itemsForTooltip && locationForTooltip;\n    if (!isLoadingTooltip) {\n        state = state.setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null).setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null);\n    }\n    return state;\n};\nvar initializeMapTooltip = function initializeMapTooltip(state) {\n    var visualization = state.get('visualization');\n    var schema = state.get('schema');\n    var columns = schema.get('columns');\n    var mapTooltip = visualization.get('mapTooltip') || _immutable2.default.fromJS({});\n    var amountCol = columns.find(function (col) {\n        return col.get('name') === visualization.get('amountColumn');\n    });\n    var defaultColumns = [visualization.getIn(['breakdownColumns', 0]).toJS(), amountCol && amountCol.toJS()];\n    var tooltipsEditable = areMapTooltipsEditable(state);\n    return state.setIn(['visualization', 'mapTooltip'], mapTooltip.mergeDeep((0, _immutable.fromJS)({\n        draft: !!mapTooltip.get('config') ? mapTooltip.get('config') : _map_constants.currentMapTooltipSchema.createDefault(defaultColumns),\n        editing: !mapTooltip.get('setupComplete') && tooltipsEditable,\n        editable: tooltipsEditable,\n        setupComplete: !!mapTooltip.get('config'),\n        selectableColumns: columns\n    })));\n};\nvar GridReportStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return initialState();\n    },\n    getDownloads: function getDownloads() {\n        if (this._state.get('downloads')) {\n            var downloadData = this._state.get('downloads').toJS();\n            var fiscalYearData = _lodash2.default.map(_lodash2.default.filter(downloadData, 'fiscal_year'), _lodash2.default.bind(function (download) {\n                return makeCheckDataObject(download);\n            }, this));\n            var fullData = makeCheckDataObject(_lodash2.default.find(downloadData, { fiscal_year: null }), 'All fiscal years');\n            return {\n                fiscalYears: fiscalYearData,\n                fullDataSet: fullData\n            };\n        }\n    },\n    getPreviousSavedState: function getPreviousSavedState() {\n        var goBack = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n        if (this.hasPreviousSavedState()) {\n            var history = this._state.get('history');\n            if (goBack) {\n                history = history.pop();\n            }\n            return history.last();\n        }\n    },\n    hasPreviousSavedState: function hasPreviousSavedState() {\n        return !!this._state.get('history').size;\n    },\n    getMap: function getMap() {\n        return this._state.get('map');\n    },\n    getMapData: function getMapData() {\n        return this._state.getIn(['map', 'data']);\n    },\n    getMapDataStats: function getMapDataStats() {\n        return this._state.getIn(['map', 'dataStats']);\n    },\n    getMapExtractors: function getMapExtractors() {\n        return this._state.getIn(['map', 'extractors']);\n    },\n    getSchema: function getSchema() {\n        return this._state.get('schema');\n    },\n    getGridReportDownload: function getGridReportDownload() {\n        return this._state.get('gridReportDownload');\n    },\n\n    actions: {\n        REPORT_LOADED: function REPORT_LOADED(state, _ref) {\n            var report = _ref.report;\n\n            // When loading a grid report re-initialize the store state for the loaded report.\n            if (report.get('report_type') === 'grid') {\n                var properties = report.get('properties');\n                var attributes = report.attributes;\n                properties.locale = attributes.locale || 'en_US';\n                var reportAmountType = (0, _numberTypes.localeToCurrency)(report.attributes.locale);\n                properties.reportAmountType = reportAmountType;\n                return initialState(properties);\n            }\n            // If we are loading a GL report with an embedded grid report,\n            // we must clear the grid state since another grid report may have been loaded before.\n            if (report.associatedReport) {\n                return initialState();\n            }\n        },\n        REPORT_GRID_FILTER_COLUMN: function REPORT_GRID_FILTER_COLUMN(state, action) {\n            state.get('queryModel').filterColumn(action.column, action.operator, action.value);\n        },\n        REPORT_GRID_FILTER_BY_FISCAL_YEAR: function REPORT_GRID_FILTER_BY_FISCAL_YEAR(state, action) {\n            var range = this.fiscalYearRange(action.fiscalYear);\n            modifyDateFilter(state, range.start, range.end);\n        },\n        REPORT_GRID_TOGGLE_VISUALIZATIONS: function REPORT_GRID_TOGGLE_VISUALIZATIONS(state) {\n            return state.setIn(['visualization', 'isVisible'], !state.getIn(['visualization', 'isVisible']));\n        },\n        REPORT_GRID_SET_LAST_XYZ_DAYS: function REPORT_GRID_SET_LAST_XYZ_DAYS(state, action) {\n            var end = action.days && (0, _moment2.default)().subtract(action.days, 'days').format('YYYY-MM-DD') || undefined;\n            var today = action.days && (0, _moment2.default)().format('YYYY-MM-DD') || undefined;\n            modifyDateFilter(state, end, today);\n            return state.set('lastXYZDays', action.days); //Do not need to update history as changes are in query hash\n        },\n        REPORT_GRID_SET_VISUALIZATION_TYPE: function REPORT_GRID_SET_VISUALIZATION_TYPE(state, action) {\n            return state.setIn(['visualization', 'graphType'], action.graphType).setIn(['grid', 'graphType'], action.graphType);\n        },\n        REPORT_GRID_TOGGLE_LEGEND: function REPORT_GRID_TOGGLE_LEGEND(state) {\n            return state.setIn(['visualization', 'showLegend'], !state.getIn(['visualization', 'showLegend']));\n        },\n        REPORT_GRID_GET_VISUAL_AGGREGATIONS: function REPORT_GRID_GET_VISUAL_AGGREGATIONS(state) {\n            return state.setIn(['visualization', 'isLoading'], true).setIn(['visualization', 'isSummaryLoading'], true);\n        },\n        REPORT_GRID_FILTER_REMAINING_AGGREGATES: function REPORT_GRID_FILTER_REMAINING_AGGREGATES(state) {\n            return state.updateIn(['visualization', 'limit'], function (limit) {\n                return limit + LIMIT_INCREMENT;\n            });\n        },\n        REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS: function REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS(state, _ref2) {\n            var transactionsByFiscalYear = _ref2.transactionsByFiscalYear;\n\n            var breakdown = state.getIn(['visualization', 'breakdown']);\n            var transactions = _lodash2.default.flatten(_lodash2.default.map(transactionsByFiscalYear, 'transactions'));\n            var names = _lodash2.default.map(transactions, breakdown);\n            var breakdownValueNames = _lodash2.default.uniq(names);\n            var amountColumn = state.getIn(['visualization', 'amountColumn']);\n            var sumField = amountColumn + '_sum';\n            //removing years that do not have transaction data\n            var transactionsByFiscalYearCleaned = _lodash2.default.filter(transactionsByFiscalYear, function (result) {\n                return result.transactions.length !== 0;\n            });\n            var isMonthly = _lodash2.default.has(transactionsByFiscalYearCleaned[0], 'month');\n            var dateColumnMeta = isMonthly ? (0, _schema_utils.findColumnByName)(state.get('schema'), state.getIn(['schema', 'dateColumn'])) : null;\n            var max_date = isMonthly ? (0, _moment2.default)(dateColumnMeta.get('max_value'), 'YYYY-MM-DD') : null;\n            var min_date = isMonthly ? (0, _moment2.default)(dateColumnMeta.get('min_value'), 'YYYY-MM-DD') : null;\n            var dateColumn = state.get('queryModel').getColumnQuery(state.getIn(['schema', 'dateColumn'])).filter;\n            var ge = _lodash2.default.has(dateColumn, 'ge') ? dateColumn.ge : null;\n            var dayDiff = (0, _moment2.default)().diff((0, _moment2.default)(ge, 'YYYY-MM-DD'), 'days') || null;\n            _lodash2.default.each(transactionsByFiscalYearCleaned, function (result) {\n                //Issues might occur here later when `count` has a result.remaining\n                if (result.remaining >= 0.001 || result.remaining <= -0.001) {\n                    var _result$transactions$;\n\n                    result.transactions.push((_result$transactions$ = {}, _defineProperty(_result$transactions$, breakdown, 'Show More'), _defineProperty(_result$transactions$, sumField, result.remaining), _defineProperty(_result$transactions$, 'isRemaining', true), _result$transactions$));\n                }\n                if (isMonthly && result.year === max_date.year() && result.month - 1 === max_date.month()) {\n                    result.end_day = max_date.date();\n                }\n                if (isMonthly && result.year === min_date.year() && result.month - 1 === min_date.month()) {\n                    result.start_day = min_date.date();\n                }\n            });\n            var fiscalYearStartMonth = state.getIn(['schema', 'fiscalYearStartMonth']);\n            var isDateColumnComputed = dateColumnMeta && dateColumnMeta.get('computed');\n            var xAxis = generateXAxis(transactionsByFiscalYearCleaned, fiscalYearStartMonth, isDateColumnComputed);\n            //Checking to see if index is a contained within possible list of indexes\n            var index = state.getIn(['visualization', 'index']);\n            // Double equals since we don't always know what type the index is\n            var yearIndex = _lodash2.default.findIndex(xAxis, function (axis) {\n                return axis.index === Number(index);\n            });\n            var mostRecentYear = _lodash2.default.maxBy(xAxis, function (axis) {\n                return axis.index;\n            });\n            var mostRecentYearIndex = mostRecentYear && mostRecentYear.index;\n            if (yearIndex === -1) {\n                index = mostRecentYearIndex;\n            }\n            // Enables rendering of the horizontal stacked bar, treemap, and pie if only one year of data is displayed.\n            if (index === null) {\n                index = 0;\n            }\n            var xAxisValues = _immutable2.default.List(_lodash2.default.sortBy(xAxis, function (n) {\n                return n.index;\n            }));\n            var defaultXAxis = state.getIn(['visualizationDefaultState', 'xAxis']);\n            var xAxisSet = _immutable2.default.is(defaultXAxis, _immutable2.default.List()) ? xAxisValues : defaultXAxis; //Only set the default once\n            return state.setIn(['visualization', 'aggregates'], _immutable2.default.fromJS(transactionsByFiscalYearCleaned)).setIn(['visualization', 'breakdownValueNames'], breakdownValueNames).setIn(['visualization', 'isLoading'], false).setIn(['visualization', 'isSummaryLoading'], false).setIn(['visualization', 'xAxis'], xAxisValues).setIn(['visualizationDefaultState', 'xAxis'], _immutable2.default.fromJS(xAxisSet)).setIn(['visualization', 'index'], index).setIn(['visualizationDefaultState', 'index'], mostRecentYearIndex).set('lastXYZDays', dayDiff).setIn(['visualization', 'isError'], false);\n        },\n        REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS: function REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS(state, _ref3) {\n            var transactionsByFiscalYear = _ref3.transactionsByFiscalYear;\n\n            var breakdown = state.getIn(['visualization', 'breakdown']);\n            var amountColumn = state.getIn(['visualization', 'amountColumn']);\n            var sumField = amountColumn + '_sum';\n            //removing years that do not have transaction data\n            var transactionsByFiscalYearCleaned = _lodash2.default.filter(transactionsByFiscalYear, function (result) {\n                return result.transactions.length !== 0;\n            });\n            var isMonthly = _lodash2.default.has(transactionsByFiscalYearCleaned[0], 'month');\n            var dateColumnMeta = isMonthly ? (0, _schema_utils.findColumnByName)(state.get('schema'), state.getIn(['schema', 'dateColumn'])) : null;\n            var max_date = isMonthly ? (0, _moment2.default)(dateColumnMeta.get('max_value'), 'YYYY-MM-DD') : null;\n            var min_date = isMonthly ? (0, _moment2.default)(dateColumnMeta.get('min_value'), 'YYYY-MM-DD') : null;\n            _lodash2.default.each(transactionsByFiscalYearCleaned, function (result) {\n                //Issues might occur here later when `count` has a result.remaining\n                if (result.remaining >= 0.001 || result.remaining <= -0.001) {\n                    var _result$transactions$2;\n\n                    result.transactions.push((_result$transactions$2 = {}, _defineProperty(_result$transactions$2, breakdown, 'Show More'), _defineProperty(_result$transactions$2, sumField, result.remaining), _defineProperty(_result$transactions$2, 'isRemaining', true), _result$transactions$2));\n                }\n                if (isMonthly && result.year === max_date.year() && result.month - 1 === max_date.month()) {\n                    result.end_day = max_date.date();\n                }\n                if (isMonthly && result.year === min_date.year() && result.month - 1 === min_date.month()) {\n                    result.start_day = min_date.date();\n                }\n            });\n            return state.setIn(['visualization', 'tableAggregates'], _immutable2.default.fromJS(transactionsByFiscalYearCleaned)).setIn(['visualization', 'isSummaryLoading'], false);\n        },\n        REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR: function REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR(state) {\n            return state.setIn(['visualization', 'isLoading'], false).setIn(['visualization', 'isError'], true);\n        },\n        REPORT_GRID_SET_VISUAL_BREAKDOWN: function REPORT_GRID_SET_VISUAL_BREAKDOWN(state, action) {\n            return state.setIn(['visualization', 'breakdown'], action.breakdown);\n        },\n        REPORT_GRID_RESET: function REPORT_GRID_RESET(state) {\n            var first = state.get('history').first();\n\n            var _getSchemaVisualizati = getSchemaVisualizationColumnsSaving(first, state),\n                updatedSchemaBreakdownColumns = _getSchemaVisualizati.updatedSchemaBreakdownColumns,\n                updatedSchemaAmountColumns = _getSchemaVisualizati.updatedSchemaAmountColumns;\n\n            return state.set('history', _immutable2.default.List([first])).set('grid', first.filter(keyIn('query', 'columns', 'amountColumn'))).mergeIn(['visualization'], first.get('visualization')).setIn(['visualization', 'amountColumns'], first.getIn(['visualization', 'amountColumns'])).setIn(['visualization', 'mapBounds'], first.getIn(['visualization', 'mapBounds'])).set('lastXYZDays', first.get('lastXYZDays')).set('savedStateId', first.get('id')).setIn(['visualization', 'breakdownColumns'], updatedSchemaBreakdownColumns).setIn(['visualization', 'amountColumns'], updatedSchemaAmountColumns).updateIn(['visualization', 'amountColumn'], function (amountColumn) {\n                return amountColumn || state.getIn(['schema', 'amountColumn']);\n            }).updateIn(['visualization', 'breakdown'], function (breakdown) {\n                return breakdown || state.getIn(['schema', 'defaultBreakdown']);\n            });\n        },\n        REPORT_GRID_SET_SCHEMA: function REPORT_GRID_SET_SCHEMA(state, action) {\n            var columns = rejectInvisible(action.schema);\n            if (!columns.length && !columns.size) {\n                throw new Error('Schema has no columns');\n            }\n            var dateColumn = action.meta.date_column;\n            var dbParallelCapable = action.meta.db_parallel_capable;\n            var dateColumnSchema = _lodash2.default.filter(columns, { type: 'date' });\n            var dateColumnExists = _lodash2.default.includes(_lodash2.default.map(dateColumnSchema, function (col) {\n                return col.name;\n            }), dateColumn);\n            if ((!dateColumn || !dateColumnExists) && !_lodash2.default.isEmpty(dateColumnSchema)) {\n                dateColumn = _lodash2.default.head(dateColumnSchema).name;\n            } else if (!dateColumn && _lodash2.default.isEmpty(dateColumnSchema)) {\n                throw new Error('Could not find a date column');\n            }\n            var amountColumnName = action.meta.amount_column;\n            if (!amountColumnName) {\n                throw new Error('Could not find an amount column');\n            }\n            var breakdownColumns = _lodash2.default.sortBy(_lodash2.default.filter(columns, function (column) {\n                return column.type === 'text' || _lodash2.default.includes(_map_constants.GeocoderMapDataTypes, column.type);\n            }), 'name');\n            if (!breakdownColumns.length) {\n                throw new Error('Could not find any text columns for visualization breakdowns');\n            }\n            var defaultBreakdown = state.getIn(['visualizationDefaultState', 'breakdown']);\n            var breakdownFromSchema = _lodash2.default.find(breakdownColumns, { name: defaultBreakdown });\n            if (!breakdownFromSchema) {\n                var departments = _lodash2.default.find(breakdownColumns, { name: 'department' }) || _lodash2.default.find(breakdownColumns, { name: 'departments' });\n                defaultBreakdown = departments ? departments.name : breakdownColumns[0].name;\n            }\n            var amountColumnTypes = ['monetary', 'numeric'];\n            var amountColumns = _lodash2.default.sortBy(_lodash2.default.filter(columns, function (column) {\n                return amountColumnTypes.indexOf(column.type) > -1;\n            }), 'name');\n            var amountTypes = ['monetary', 'numeric', 'percent'];\n            var mapAmountColumnOptions = columns.filter(function (column) {\n                return amountTypes.indexOf(column.type) > -1;\n            });\n            var amountColumn = columns.filter(function (c) {\n                return c.name === amountColumnName;\n            })[0];\n            var reportAmountType = (0, _numberTypes.columnTypeToNumberType)(amountColumn.type, state.get('locale'));\n            var stateBreakdownColumns = state.getIn(['visualization', 'breakdownColumns']) || _immutable2.default.fromJS(breakdownColumns);\n            var stateAmountColumns = state.getIn(['visualization', 'amountColumns']) || _immutable2.default.fromJS(amountColumns);\n            var finalResult = initializeMapTooltip(state.mergeDeep((0, _immutable.fromJS)({\n                schema: {\n                    dateColumn: dateColumn,\n                    dbParallelCapable: dbParallelCapable,\n                    amountColumn: amountColumnName,\n                    sumField: amountColumnName + '_sum',\n                    columns: _immutable2.default.fromJS(columns),\n                    fiscalYearStartMonth: action.fiscalYearStartMonth,\n                    reportAmountType: reportAmountType,\n                    locale: state.get('locale'),\n                    breakdownColumns: breakdownColumns,\n                    amountColumns: amountColumns,\n                    defaultBreakdown: defaultBreakdown\n                },\n                visualization: {\n                    breakdownColumns: stateBreakdownColumns.size == 0 ? _immutable2.default.fromJS(breakdownColumns) : (0, _immutable.fromJS)(stateBreakdownColumns),\n                    breakdown: state.getIn(['visualization', 'breakdown']) || defaultBreakdown,\n                    defaultBreakdown: defaultBreakdown,\n                    mapAmountColumn: state.getIn(['visualization', 'mapAmountColumn']) || amountColumnName,\n                    mapAmountColumnOptions: _immutable2.default.fromJS(mapAmountColumnOptions),\n                    amountColumn: state.getIn(['visualization', 'amountColumn']) || amountColumnName,\n                    amountColumns: stateAmountColumns.size == 0 ? _immutable2.default.fromJS(amountColumns) : (0, _immutable.fromJS)(stateAmountColumns)\n                },\n                visualizationDefaultState: {\n                    breakdown: state.getIn(['visualizationDefaultState', 'breakdown']) || defaultBreakdown\n                }\n            })).setIn(['visualization', 'mapAmountColumnOptions'], _immutable2.default.fromJS(mapAmountColumnOptions)).setIn(['visualization', 'mapBounds'], state.getIn(['visualization', 'mapBounds'])).setIn(['schema', 'columns'], (0, _immutable.fromJS)(columns)).setIn(['schema', 'breakdownColumns'], breakdownColumns).setIn(['schema', 'amountColumns'], amountColumns).setIn(['visualization', 'breakdownColumns'], stateBreakdownColumns.size == 0 ? _immutable2.default.fromJS(breakdownColumns) : stateBreakdownColumns).setIn(['visualization', 'amountColumns'], stateAmountColumns.size == 0 ? _immutable2.default.fromJS(amountColumns) : stateAmountColumns));\n            return finalResult;\n        },\n        REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP: function REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP(state, action) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                visualization: {\n                    tooltip: {\n                        isVisible: true,\n                        left: action.left,\n                        name: action.name,\n                        value: action.value,\n                        percentage: action.percentage,\n                        top: action.top\n                    }\n                }\n            }));\n        },\n        REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP: function REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP(state) {\n            return state.setIn(['visualization', 'tooltip', 'isVisible'], false);\n        },\n        REPORT_LOADED_TRANSACTION_DOWNLOADS: function REPORT_LOADED_TRANSACTION_DOWNLOADS(state, action) {\n            return state.set('downloads', _immutable2.default.fromJS(action.downloads));\n        },\n        CHECK_IMAGE_LOADING: function CHECK_IMAGE_LOADING(state, action) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                currentCheckData: {\n                    loading: true,\n                    visible: true,\n                    data: null,\n                    rowTop: action.rowTop,\n                    quasiId: action.quasiId\n                }\n            }));\n        },\n        CHECK_IMAGE_LOAD_ERROR: function CHECK_IMAGE_LOAD_ERROR(state) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                alert: 'checkLoadError',\n                currentCheckData: {\n                    loading: false,\n                    visible: false,\n                    quasiId: null,\n                    rowTop: null\n                }\n            }));\n        },\n        REPORT_IN_SYNC_STATUS: function REPORT_IN_SYNC_STATUS(state, payload) {\n            var isRebuilding = _lodash2.default.isUndefined(payload.meta.in_sync) ? false : !payload.meta.in_sync;\n            return state.set('rebuilding', isRebuilding);\n        },\n        SHOW_CHECK_IMAGE: function SHOW_CHECK_IMAGE(state, action) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                currentCheckData: {\n                    loading: false,\n                    data: _immutable2.default.fromJS(action.checkData),\n                    quasiId: action.checkData.quasi_id || null,\n                    visible: true,\n                    rowTop: action.rowTop,\n                    amountColumn: action.amountColumn\n                },\n                relatedTransactions: {\n                    loading: action.loadingMessage\n                }\n            }));\n        },\n        HIDE_CHECK_IMAGE: function HIDE_CHECK_IMAGE(state) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                currentCheckData: {\n                    loading: false,\n                    data: null,\n                    visible: false,\n                    quasiId: null,\n                    rowTop: null,\n                    amountColumn: null\n                },\n                relatedTransactions: {\n                    loading: true,\n                    amount: null\n                }\n            }));\n        },\n        REPORT_GRID_SET_VISUALIZATION_YEAR: function REPORT_GRID_SET_VISUALIZATION_YEAR(state, _ref4) {\n            var index = _ref4.index,\n                timePeriodQuery = _ref4.timePeriodQuery;\n\n            return state.setIn(['visualization', 'index'], index).set('timePeriodQuery', timePeriodQuery.query);\n        },\n        GRID_REPORT_STATE_SAVING: function GRID_REPORT_STATE_SAVING(state, _ref5) {\n            var nextSavedState = _ref5.nextSavedState;\n\n            // last XYZ days?\n            var _getSchemaVisualizati2 = getSchemaVisualizationColumnsSaving(nextSavedState, state),\n                updatedSchemaBreakdownColumns = _getSchemaVisualizati2.updatedSchemaBreakdownColumns,\n                updatedSchemaAmountColumns = _getSchemaVisualizati2.updatedSchemaAmountColumns;\n\n            var nextState = state.mergeIn(['grid'], nextSavedState.filter(keyIn('query', 'columns', 'amountColumn', 'graphType'))).mergeDeepIn(['currentCheckData'], (0, _immutable.fromJS)(nextSavedState.get('currentCheckData'))).mergeDeepIn(['visualization'], (0, _immutable.fromJS)(nextSavedState.get('visualization'))).setIn(['visualization', 'amountColumns'], (0, _immutable.fromJS)(nextSavedState.getIn(['visualization', 'amountColumns']))).setIn(['visualization', 'breakdownColumns'], (0, _immutable.fromJS)(updatedSchemaBreakdownColumns)).setIn(['visualization', 'amountColumns'], (0, _immutable.fromJS)(updatedSchemaAmountColumns)).setIn(['visualization', 'mapBounds'], (0, _immutable.fromJS)(nextSavedState.getIn(['visualization', 'mapBounds'])));\n            return nextState.update('history', function (history) {\n                return pushHistory(nextState, history);\n            });\n        },\n        GRID_REPORT_STATE_SAVED: function GRID_REPORT_STATE_SAVED(state, _ref6) {\n            var id = _ref6.id,\n                nextSavedState = _ref6.nextSavedState;\n\n            var target = nextSavedState.getIn(['visualization', 'target']);\n            var formattedState = savedStateApiFormat(state).remove('id').removeIn(['visualization', 'target']);\n            var nextSavedStateWithoutIdOrTarget = nextSavedState.remove('id').removeIn(['visualization', 'target']);\n            // Verify this saved state is the one currently be rendered in the report.\n            // It is possible that pending requests for previous states may be delayed\n            // and finish after new states have been saved.\n            if (nextSavedStateWithoutIdOrTarget.equals(formattedState)) {\n                var historyState = formattedState.set('id', id).setIn(['visualization', 'target'], target);\n                return state.set('savedStateId', id).update('history', function (history) {\n                    return history.set(history.size - 1, historyState);\n                });\n            }\n            return state;\n        },\n        GRID_REPORT_STATE_LOADING: function GRID_REPORT_STATE_LOADING(state, _ref7) {\n            var stateId = _ref7.stateId;\n\n            return state.mergeDeep((0, _immutable.fromJS)({ loading: true, savedStateId: stateId }));\n        },\n        GRID_REPORT_STATE_LOADED: function GRID_REPORT_STATE_LOADED(state, _ref8) {\n            var id = _ref8.id,\n                loadedState = _ref8.loadedState,\n                updateHistory = _ref8.updateHistory,\n                lastXYZDays = _ref8.lastXYZDays,\n                schema = _ref8.schema;\n            var visualization = loadedState.visualization,\n                currentCheckData = loadedState.currentCheckData,\n                query = loadedState.query,\n                columns = loadedState.columns;\n\n            var dateColumn = state.getIn(['schema', 'dateColumn']);\n            var amountColumn = visualization && visualization.amountColumn ? visualization.amountColumn : state.getIn(['schema', 'amountColumn']) || '';\n            var legendSortBy = visualization && visualization.legendSortBy ? visualization.legendSortBy : 'desc';\n            var graphType = visualization && visualization.graphType ? visualization.graphType : '';\n            var limit = visualization && visualization.limit ? visualization.limit : DEFAULT_LIMIT;\n            var breakdownColumns = visualization && visualization.breakdownColumns ? visualization.breakdownColumns : state.getIn(['schema', 'breakdownColumns']);\n            var amountColumns = visualization && visualization.amountColumns ? visualization.amountColumns : state.getIn(['schema', 'amountColumns']);\n            var breakdownColumn = visualization && visualization.defaultBreakdown ? visualization.defaultBreakdown : state.getIn(['schema', 'defaultBreakdown']);\n\n            var _getSchemaVisualizati3 = getSchemaVisualizationColumnsLoading(state, schema, breakdownColumns, amountColumns),\n                updatedSchemaBreakdownColumns = _getSchemaVisualizati3.updatedSchemaBreakdownColumns,\n                updatedSchemaAmountColumns = _getSchemaVisualizati3.updatedSchemaAmountColumns;\n            // loadedState is overridden by lastXYZDays because to look at the last 30 days must look at lastXYZ rather than filter state which is hard coded to a day\n\n\n            if (dateColumn && lastXYZDays) {\n                var end = (0, _moment2.default)().subtract(lastXYZDays, 'days').format('YYYY-MM-DD');\n                query['filter'] = _defineProperty({}, dateColumn, { ge: end });\n            }\n            var nextState = state.set('savedStateId', id).set('loading', false).set('lastXYZDays', lastXYZDays).mergeDeepIn(['visualization'], (0, _immutable.fromJS)(visualization)).set('grid', _immutable2.default.fromJS({ query: query, columns: columns, amountColumn: amountColumn, graphType: graphType }));\n            if (visualization && visualization.mapBounds) {\n                nextState = nextState.setIn(['visualization', 'mapBounds'], (0, _immutable.fromJS)(visualization.mapBounds));\n            }\n            // set the deserialized breakdownColumns\n            nextState = nextState.setIn(['visualization', 'breakdownColumns'], (0, _immutable.fromJS)(updatedSchemaBreakdownColumns));\n            // set the deserialized amountColumns\n            nextState = nextState.setIn(['visualization', 'amountColumns'], (0, _immutable.fromJS)(updatedSchemaAmountColumns));\n            // If grid state has no amounts type set, default to showing incremental amounts.\n            if (visualization && !visualization.amountsType) {\n                nextState = nextState.setIn(['visualization', 'amountsType'], _transactions_utils.AmountsTypes.Incremental);\n            }\n            // If grid state has no amountcolumn, default to showing defaultamount column.\n            if (visualization && !visualization.amountColumn) {\n                nextState = nextState.setIn(['visualization', 'amountColumn'], amountColumn);\n            }\n            // If grid state has no breakdown, default to showing defaultbreakdown column.\n            if (visualization && !visualization.breakdown) {\n                nextState = nextState.setIn(['visualization', 'breakdown'], breakdownColumn);\n            }\n            // Default target if not set\n            if (visualization && !(0, _target_utils.isTargetValid)(_immutable2.default.fromJS(visualization.target))) {\n                nextState = nextState.setIn(['visualization', 'target'], _immutable2.default.Map());\n            }\n            // Default legendSortBy if not set\n            if (visualization && !visualization.legendSortBy) {\n                nextState = nextState.setIn(['visualization', 'legendSortBy'], legendSortBy);\n            }\n            // Default limit if not set\n            if (visualization && !visualization.limit) {\n                nextState = nextState.setIn(['visualization', 'limit'], limit);\n            }\n            // Reset limit if greater than default for pie charts\n            if (graphType === 'pie' && nextState.getIn(['visualization', 'limit']) > DEFAULT_LIMIT) {\n                nextState = nextState.setIn(['visualization', 'limit'], DEFAULT_LIMIT);\n            }\n            // To handle cases when some columns may not be present\n            // i.e. customized via the Data Manager\n            if (nextState.getIn(['visualization', 'breakdown'])) {\n                var currentBreakdown = nextState.getIn(['visualization', 'breakdown']);\n                var _columns = nextState.getIn(['visualization', 'breakdownColumns']);\n                var visibleBreakdowns = _columns ? _columns.filter(function (column) {\n                    return column.get('visible');\n                }) : {};\n                if (!visibleBreakdowns.find(function (column) {\n                    return column.get('id') === currentBreakdown;\n                })) {\n                    var newBreakdown = visibleBreakdowns.get(0).get('id');\n                    nextState = nextState.setIn(['visualization', 'breakdown'], newBreakdown);\n                }\n            }\n            // if this is the first call, add the initial state into the history array\n            if (updateHistory) {\n                // if we are loading up a check image on first load, insure that the history\n                // is updated with another entry so the user can dismiss the check image\n                if (currentCheckData && currentCheckData.quasiId && !isNaN(currentCheckData.rowTop)) {\n                    nextState = nextState.update('history', function (history) {\n                        return pushHistory(nextState, history);\n                    });\n                    nextState = nextState.update('currentCheckData', function () {\n                        return (0, _immutable.fromJS)(currentCheckData);\n                    });\n                }\n                return nextState.update('history', function (history) {\n                    return pushHistory(nextState, history);\n                });\n            }\n            return nextState;\n        },\n        GRID_REPORT_STATE_NOT_FOUND: function GRID_REPORT_STATE_NOT_FOUND(state) {\n            return state.set('alert', 'gridStateNotFound').set('loading', false);\n        },\n        GRID_REPORT_DISMISS_ALERT: function GRID_REPORT_DISMISS_ALERT(state) {\n            return state.set('alert', null);\n        },\n        GRID_REPORT_STATE_LOAD_ERROR: function GRID_REPORT_STATE_LOAD_ERROR(state) {\n            return state.set('alert', 'gridStateUnexpectedError');\n        },\n        GRID_REPORT_DATA_LOADING: function GRID_REPORT_DATA_LOADING(state) {\n            return state.set('loading', true).set('gridDataError', false);\n        },\n        GRID_REPORT_DATA_LOADED: function GRID_REPORT_DATA_LOADED(state) {\n            return state.set('loading', false);\n        },\n        GRID_REPORT_DATA_LOAD_ERROR: function GRID_REPORT_DATA_LOAD_ERROR(state) {\n            return state.set('loading', false).set('gridDataError', true);\n        },\n        SHOW_TOS: function SHOW_TOS(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, { showTOS: true })));\n        },\n        HIDE_TOS: function HIDE_TOS(state) {\n            return state.set('showTOS', false);\n        },\n        SHOW_BUDGET_101: function SHOW_BUDGET_101(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, { showBudget101: true })));\n        },\n        HIDE_BUDGET_101: function HIDE_BUDGET_101(state) {\n            return state.set('showBudget101', false);\n        },\n        SHOW_GRID_HOWTO: function SHOW_GRID_HOWTO(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, { showHowTo: true })));\n        },\n        HIDE_GRID_HOWTO: function HIDE_GRID_HOWTO(state) {\n            return state.set('showHowTo', false);\n        },\n        SHOW_EXPORT_FILTER: function SHOW_EXPORT_FILTER(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, { showExportFilter: true })));\n        },\n        HIDE_EXPORT_FILTER: function HIDE_EXPORT_FILTER(state) {\n            return state.set('showExportFilter', false);\n        },\n        CLEAR_TARGET: function CLEAR_TARGET(state) {\n            return state.setIn(['visualization', 'target'], _immutable2.default.Map());\n        },\n        SET_TARGET: function SET_TARGET(state, _ref9) {\n            var _ref9$target = _ref9.target,\n                type = _ref9$target.type,\n                value = _ref9$target.value,\n                warning = _ref9$target.warning;\n\n            return state.setIn(['visualization', 'target', 'type'], type).setIn(['visualization', 'target', 'value'], value).setIn(['visualization', 'target', 'warning'], warning);\n        },\n        HIDE_COLUMN: function HIDE_COLUMN(state, _ref10) {\n            var column = _ref10.column,\n                visibility = _ref10.visibility,\n                settingsType = _ref10.settingsType,\n                selectAll = _ref10.selectAll;\n\n            var updatedColumns = settingsType === 'breakdown' ? state.getIn(['visualization', 'breakdownColumns']) : state.getIn(['visualization', 'amountColumns']);\n            if (selectAll) {\n                column.map(function (columnData) {\n                    updatedColumns = (0, _transactions_utils.getUpdatedHiddenColumns)(updatedColumns, columnData.get('id'), visibility);\n                });\n            } else {\n                updatedColumns = (0, _transactions_utils.getUpdatedHiddenColumns)(updatedColumns, column.get('id'), visibility);\n            }\n            if (settingsType === 'breakdown') {\n                return state.setIn(['visualization', 'breakdownColumns'], updatedColumns);\n            } else {\n                return state.setIn(['visualization', 'amountColumns'], updatedColumns);\n            }\n        },\n        RESET_COLUMN: function RESET_COLUMN(state, _ref11) {\n            var settingsData = _ref11.settingsData,\n                settingsType = _ref11.settingsType;\n\n            var updatedColumns = settingsType === 'breakdown' ? state.getIn(['visualization', 'breakdownColumns']) : state.getIn(['visualization', 'amountColumns']);\n            _lodash2.default.each(settingsData, function (data) {\n                updatedColumns = (0, _transactions_utils.getUpdatedResetColumns)(updatedColumns, data);\n            });\n            if (settingsType === 'breakdown') {\n                return state.setIn(['visualization', 'breakdownColumns'], updatedColumns);\n            } else {\n                return state.setIn(['visualization', 'amountColumns'], updatedColumns);\n            }\n        },\n        TOGGLE_TARGET_PANEL: function TOGGLE_TARGET_PANEL(state) {\n            return state.set('showTargetPanel', !state.get('showTargetPanel'));\n        },\n        TOGGLE_COLUMNS_SETTINGS_PANEL: function TOGGLE_COLUMNS_SETTINGS_PANEL(state) {\n            return state.set('showAmountColumnPanel', !state.get('showAmountColumnPanel'));\n        },\n        TOGGLE_BREAKDOWNS_SETTINGS_PANEL: function TOGGLE_BREAKDOWNS_SETTINGS_PANEL(state) {\n            return state.set('showBreakdownsSettingsPanel', !state.get('showBreakdownsSettingsPanel'));\n        },\n        RELATED_CHECK_INFORMATION_LOADED: function RELATED_CHECK_INFORMATION_LOADED(state, action) {\n            return state.setIn(['relatedTransactions', 'loading'], false).setIn(['relatedTransactions', 'amount'], action.relatedTransactionAmount);\n        },\n        SHOW_GRID_WELCOME: function SHOW_GRID_WELCOME(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, { showWelcome: true })));\n        },\n        HIDE_GRID_WELCOME: function HIDE_GRID_WELCOME(state) {\n            return state.set('showWelcome', false);\n        },\n        SHOW_GRID_TOUR: function SHOW_GRID_TOUR(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, {\n                onboardingTour: {\n                    showTour: true\n                }\n            })));\n        },\n        HIDE_GRID_TOUR: function HIDE_GRID_TOUR(state) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState)));\n        },\n        GOTO_TOUR_WAYPOINT: function GOTO_TOUR_WAYPOINT(state, action) {\n            return state.mergeDeep((0, _immutable.fromJS)(_lodash2.default.extend({}, initialModalState, {\n                onboardingTour: {\n                    showTour: true,\n                    currentStep: action.currentStep\n                }\n            })));\n        },\n        GRID_REPORT_GO_BACK: function GRID_REPORT_GO_BACK(state) {\n            var history = state.get('history');\n            history = history.pop();\n            var last = history.last();\n\n            var _getSchemaVisualizati4 = getSchemaVisualizationColumnsSaving(last, state),\n                updatedSchemaBreakdownColumns = _getSchemaVisualizati4.updatedSchemaBreakdownColumns,\n                updatedSchemaAmountColumns = _getSchemaVisualizati4.updatedSchemaAmountColumns;\n\n            if (!last) {\n                return state.set('savedStateId', state.get('defaultSavedStateId'));\n            }\n            return state.set('history', history).set('grid', last.filter(keyIn('query', 'columns', 'amountColumn'))).set('savedStateId', last.get('id')).set('lastXYZDays', last.get('lastXYZDays')).mergeDeepIn(['visualization'], (0, _immutable.fromJS)(last.get('visualization'))).setIn(['visualization', 'amountColumns'], (0, _immutable.fromJS)(last.getIn(['visualization', 'amountColumns']))).setIn(['visualization', 'target'], (0, _immutable.fromJS)(last.getIn(['visualization', 'target']))).mergeDeepIn(['currentCheckData'], (0, _immutable.fromJS)(last.get('currentCheckData'))).setIn(['visualization', 'breakdownColumns'], updatedSchemaBreakdownColumns).setIn(['visualization', 'amountColumns'], updatedSchemaAmountColumns).updateIn(['visualization', 'amountColumn'], function (amountColumn) {\n                return amountColumn || state.getIn(['schema', 'amountColumn']);\n            }).updateIn(['visualization', 'breakdown'], function (breakdown) {\n                return breakdown || state.getIn(['schema', 'breakdown']);\n            });\n        },\n        REPORT_GRID_SET_MAP_TYPE: function REPORT_GRID_SET_MAP_TYPE(state, action) {\n            return updateMapState(state.setIn(['visualization', 'currentMapType'], action.mapType).setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null).setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null));\n        },\n        REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED: function REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED(state) {\n            return state.setIn(['visualization', 'mapLegendPage'], _lodash2.default.max([state.getIn(['visualization', 'mapLegendPage']) - 1, 1]));\n        },\n        REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED: function REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED(state) {\n            return state.setIn(['visualization', 'mapLegendPage'], state.getIn(['visualization', 'mapLegendPage']) + 1);\n        },\n        REPORT_GRID_MAP_LEGEND_RESET: function REPORT_GRID_MAP_LEGEND_RESET(state) {\n            return state.setIn(['visualization', 'mapLegendPage'], 1);\n        },\n        REPORT_GRID_MAP_TOOLTIP_EDITED: function REPORT_GRID_MAP_TOOLTIP_EDITED(state, action) {\n            return state.setIn(['visualization', 'mapTooltip', 'draft'], action.tooltip);\n        },\n        REPORT_GRID_MAP_TOOLTIP_SAVED: function REPORT_GRID_MAP_TOOLTIP_SAVED(state, action) {\n            return state.setIn(['visualization', 'mapTooltip', 'config'], action.tooltip).setIn(['visualization', 'mapTooltip', 'draft'], action.tooltip).setIn(['visualization', 'mapTooltip', 'setupComplete'], true).setIn(['visualization', 'mapTooltip', 'editing'], false);\n        },\n        REPORT_GRID_GET_ROWS_FOR_TOOLTIP: function REPORT_GRID_GET_ROWS_FOR_TOOLTIP(state, action) {\n            return state.setIn(['visualization', 'mapTooltip', 'loading'], true).setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null).setIn(['visualization', 'mapTooltip', 'locationForTooltip'], action.location);\n        },\n        REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS: function REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS(state, action) {\n            return state.setIn(['visualization', 'mapTooltip', 'loading'], false).setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], _immutable2.default.fromJS(action.rowsForTooltip.map(function (row) {\n                return (0, _geodata_utils.parseGeoJson)(row);\n            })));\n        },\n        REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR: function REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR(state) {\n            return state.setIn(['visualization', 'mapTooltip', 'loading'], false);\n        },\n        REPORT_GRID_SET_MAP_TOOLTIP_EDITING: function REPORT_GRID_SET_MAP_TOOLTIP_EDITING(state) {\n            return state.setIn(['visualization', 'mapTooltip', 'editing'], true).setIn(['visualization', 'mapTooltip', 'draft'], state.getIn(['visualization', 'mapTooltip', 'config']));\n        },\n        REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP: function REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP(state) {\n            return state.setIn(['visualization', 'mapTooltip', 'loading'], false).setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null).setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null);\n        },\n        REPORT_GRID_SET_MAP_LOADING: function REPORT_GRID_SET_MAP_LOADING(state) {\n            return state.setIn(['visualization', 'mapLoading'], true);\n        },\n        REPORT_GRID_SET_MAP_LOADED: function REPORT_GRID_SET_MAP_LOADED(state) {\n            return state.setIn(['visualization', 'mapLoading'], false);\n        },\n        REPORT_GRID_MAP_FIT_BOUNDS: function REPORT_GRID_MAP_FIT_BOUNDS(state, _ref12) {\n            var bounds = _ref12.bounds;\n\n            return state.setIn(['visualization', 'mapBounds'], bounds);\n        },\n        REPORT_GRID_MAP_SET_GRID: function REPORT_GRID_MAP_SET_GRID(state, _ref13) {\n            var grid = _ref13.grid;\n\n            return state.setIn(['map', 'loaderGrid'], grid);\n        },\n        REPORT_GRID_GET_MAP_META_SUCCESS: function REPORT_GRID_GET_MAP_META_SUCCESS(state, _ref14) {\n            var mapMeta = _ref14.mapMeta;\n\n            return state.setIn(['map', 'dataStats'], state.getIn(['map', 'dataStats']).set('isInvalid', false).set('center', mapMeta.get('center')).set('bounds', mapMeta.get('bounds'))).setIn(['map', 'data'], []);\n        },\n        REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS: function REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS(state, _ref15) {\n            var min = _ref15.min,\n                max = _ref15.max;\n\n            var mapAmountColumn = state.getIn(['visualization', 'mapAmountColumnOptions']).find(function (option) {\n                return option.get('id') === state.getIn(['visualization', 'mapAmountColumn']);\n            }).toJS();\n            var formatter = function formatter(rawValue) {\n                var value = rawValue === 0 ? rawValue : _utils2.default.getSimpleFormatter(mapAmountColumn)(rawValue);\n                var reportAmountType = state.getIn(['visualization', 'reportAmountType']);\n                if (reportAmountType.isCurrency && mapAmountColumn.type === 'monetary') {\n                    return reportAmountType.formatter(value);\n                }\n                return value;\n            };\n            var newStats = state.getIn(['map', 'dataStats']).set('minAmount', min).set('maxAmount', max).set('formattedMinAmount', formatter(min)).set('formattedMaxAmount', formatter(max));\n            return state.setIn(['map', 'dataStats'], newStats);\n        },\n        REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS: function REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS(state, _ref16) {\n            var breakdownValues = _ref16.breakdownValues;\n\n            return updateColorMap(state.set('breakdownValues', breakdownValues));\n        },\n        REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS: function REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS(state) {\n            return updateMapLayer(state);\n        },\n        REPORT_GRID_MAP_LOAD_GRID_CELLS: function REPORT_GRID_MAP_LOAD_GRID_CELLS(state, _ref17) {\n            var loadingGridCells = _ref17.loadingGridCells;\n\n            return state.setIn(['map', 'loaderGrid', 'cells'], state.getIn(['map', 'loaderGrid', 'cells']).map(function (cell) {\n                return loadingGridCells.find(function (loadingCell) {\n                    return loadingCell.get('bounds') === cell.get('bounds');\n                }) || cell;\n            })).setIn(['visualization', 'mapDataLoading'], true);\n        },\n        REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS: function REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS(state, _ref18) {\n            var mapData = _ref18.mapData,\n                loadedCell = _ref18.loadedCell;\n\n            var currentMapType = state.getIn(['visualization', 'currentMapType']);\n            var dataMax = state.getIn(['map', 'dataStats', 'maxAmount']);\n            var amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n            var updatedMapData = (state.getIn(['map', 'data']) || []).concat((0, _geodata_utils.ingestRowsForMap)(mapData, currentMapType, amountColumn, dataMax));\n            var updatedLoaderGrid = state.getIn(['map', 'loaderGrid', 'cells']).map(function (cell) {\n                return loadedCell.get('bounds') === cell.get('bounds') ? loadedCell.set('loaded', true) : cell;\n            });\n            return updateMapState(state.setIn(['map', 'loaderGrid', 'cells'], updatedLoaderGrid).setIn(['map', 'data'], updatedMapData));\n        },\n        REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS: function REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS(state) {\n            return state.setIn(['visualization', 'mapDataLoading'], false);\n        },\n        REPORT_GRID_MAP_RESET: function REPORT_GRID_MAP_RESET(state) {\n            return state.setIn(['map', 'data'], []).setIn(['map', 'loaderGrid'], null).setIn(['map', 'legendColorMap'], _lodash2.default.mapValues(state.getIn(['map', 'legendColorMap']), function () {\n                return null;\n            })).setIn(['map', 'layer'], null);\n        },\n        REPORT_GRID_SET_LAST_CREATED_REPORT: function REPORT_GRID_SET_LAST_CREATED_REPORT(state, _ref19) {\n            var report = _ref19.report;\n\n            return state.set('lastCreatedReport', report);\n        },\n        REPORT_GRID_CLEAR_LAST_CREATED_REPORT: function REPORT_GRID_CLEAR_LAST_CREATED_REPORT(state) {\n            return state.delete('lastCreatedReport');\n        },\n        REPORT_GRID_RELOAD_PROPERTIES: function REPORT_GRID_RELOAD_PROPERTIES(state, _ref20) {\n            var properties = _ref20.properties;\n\n            return _immutable2.default.fromJS(initialState(properties));\n        },\n        REPORT_GRID_SET_MAP_AMOUNT_COLUMN: function REPORT_GRID_SET_MAP_AMOUNT_COLUMN(state, _ref21) {\n            var mapAmountColumn = _ref21.mapAmountColumn;\n\n            return updateMapState(state.setIn(['visualization', 'mapAmountColumn'], mapAmountColumn));\n        },\n        REPORT_GRID_SET_HEATMAP_TYPE: function REPORT_GRID_SET_HEATMAP_TYPE(state, _ref22) {\n            var heatmapType = _ref22.heatmapType;\n\n            return state.setIn(['visualization', 'heatmapType'], heatmapType);\n        },\n        REPORT_GRID_FILTERED_EXPORT: function REPORT_GRID_FILTERED_EXPORT(state, _ref23) {\n            var properties = _ref23.properties;\n\n            return state.set('filteredExport', properties);\n        },\n        REPORT_GRID_SET_AMOUNTS_TYPE: function REPORT_GRID_SET_AMOUNTS_TYPE(state, _ref24) {\n            var amountsType = _ref24.amountsType;\n\n            return state.setIn(['visualization', 'amountsType'], amountsType);\n        },\n        REPORT_GRID_SET_AMOUNT_COLUMN: function REPORT_GRID_SET_AMOUNT_COLUMN(state, action) {\n            return state.setIn(['visualization', 'amountColumn'], action.amountColumn).setIn(['grid', 'amountColumn'], action.amountColumn);\n        },\n        REPORT_GRID_SET_LEGEND_SORT_BY: function REPORT_GRID_SET_LEGEND_SORT_BY(state, action) {\n            return state.setIn(['visualization', 'legendSortBy'], action.sortId);\n        },\n        REPORT_GRID_ADD_ACTIVE_FILTER: function REPORT_GRID_ADD_ACTIVE_FILTER(state, action) {\n            return state.setIn(['filterState', 'activeFilterIds', action.id], true);\n        },\n        REPORT_GRID_REMOVE_ACTIVE_FILTER: function REPORT_GRID_REMOVE_ACTIVE_FILTER(state, action) {\n            return state.deleteIn(['filterState', 'activeFilterIds', action.id]);\n        }\n    },\n    isGridStateLoaded: function isGridStateLoaded(id) {\n        return this.getState().get('savedStateId') === id;\n    },\n    getUrlState: function getUrlState() {\n        var urlState = {};\n        var state = this.getState();\n        var query = state.get('savedStateId');\n        if (query) {\n            urlState.query = query;\n        }\n        urlState.embed = (0, _embed_utils.getEmbedType)();\n        return urlState;\n    },\n    getSavedState: function getSavedState() {\n        //Do not combine check book data with viz information\n        //They are suppose to be seperated, so do not put into hash\n        return savedStateApiFormat(this.getState());\n    },\n    isShowingExportFilter: function isShowingExportFilter() {\n        return this.getState().get('showExportFilter');\n    },\n    isLoading: function isLoading() {\n        return this.getState().get('loading');\n    },\n    hasError: function hasError() {\n        return this.getState().get('gridDataError');\n    },\n    fiscalYearRange: function fiscalYearRange(year) {\n        var start = void 0;\n        var fiscalYearStartMonth = this._state.getIn(['schema', 'fiscalYearStartMonth']);\n        if (fiscalYearStartMonth === 1) {\n            start = (0, _moment2.default)([year]);\n        } else {\n            start = (0, _moment2.default)([year - 1, fiscalYearStartMonth - 1]);\n        }\n        var end = (0, _moment2.default)(start).add(12, 'months').subtract(1, 'day');\n        return { start: start.format(), end: end.format() };\n    },\n    canGoBack: function canGoBack() {\n        return this._state.get('history').size > 1;\n    },\n    canReset: function canReset() {\n        var defaultSavedStateId = this._state.get('defaultSavedStateId');\n        if (defaultSavedStateId) {\n            var savedStateId = this._state.get('savedStateId');\n            return this.canGoBack() && savedStateId !== defaultSavedStateId;\n        }\n        return this.canGoBack();\n    },\n    isEditingMapTooltip: function isEditingMapTooltip() {\n        return this._state.getIn(['visualization', 'mapTooltip', 'editing']);\n    },\n    getMapDataBounds: function getMapDataBounds() {\n        return this._state.getIn(['map', 'dataStats', 'bounds']);\n    },\n    getMapViewportBounds: function getMapViewportBounds() {\n        return this._state.getIn(['visualization', 'mapBounds']);\n    },\n    getMapTooltip: function getMapTooltip() {\n        return this._state.getIn(['visualization', 'mapTooltip']);\n    },\n    getMapGrid: function getMapGrid() {\n        return this._state.getIn(['map', 'loaderGrid']);\n    },\n    isMapGraphType: function isMapGraphType() {\n        return this._state.getIn(['visualization', 'graphType']) === 'map';\n    },\n    getFirstRowOfMapData: function getFirstRowOfMapData() {\n        return this.getMapData().find(_geodata_utils.getFeatureCoordinates);\n    },\n    getMapLayer: function getMapLayer() {\n        return this._state.getIn(['map', 'layer']);\n    },\n\n    isMapEnabled: isMapEnabled\n});\nexports.default = GridReportStore;\nexports.setMomentDate = _date_utils.setMomentDate;\nexports.setMomentFormat = _date_utils.setMomentFormat;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar getEmbedType = exports.getEmbedType = function getEmbedType() {\n    var embedRegex = /.*embed\\=(graph|table|y|n)/g;\n    var matches = embedRegex.exec(window.location.href);\n    return matches ? matches[1] : 'n';\n};\nvar isEmbed = exports.isEmbed = function isEmbed() {\n    return getEmbedType() !== 'n';\n};\nvar hideTable = exports.hideTable = function hideTable() {\n    var embedType = getEmbedType();\n    return embedType === 'graph';\n};\nvar hideViz = exports.hideViz = function hideViz() {\n    return getEmbedType() === 'table';\n};\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function getType(val) {\n    if (val instanceof Number) {\n        return 'number';\n    } else if (val instanceof String) {\n        return 'string';\n    } else if (val instanceof Boolean) {\n        return 'boolean';\n    } else if (Array.isArray(val)) {\n        return 'array';\n    } else if (val === null) {\n        return 'null';\n    } else {\n        return typeof val;\n    }\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(20);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(4);\nvar core = __webpack_require__(64);\nvar fails = __webpack_require__(19);\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(65);\nvar IObject = __webpack_require__(170);\nvar toObject = __webpack_require__(32);\nvar toLength = __webpack_require__(25);\nvar asc = __webpack_require__(342);\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction ToObject(val) {\n\tif (val == null) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar keys;\n\tvar to = ToObject(target);\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = arguments[s];\n\t\tkeys = Object.keys(Object(from));\n\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tto[keys[i]] = from[keys[i]];\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assign = __webpack_require__(77);\nvar ReactPropTypes = __webpack_require__(1);\nvar Route = __webpack_require__(97);\n\nvar PropTypes = assign({}, ReactPropTypes, {\n\n  /**\n   * Indicates that a prop should be falsy.\n   */\n  falsy: function falsy(props, propName, componentName) {\n    if (props[propName]) return new Error('<' + componentName + '> should not have a \"' + propName + '\" prop');\n  },\n\n  /**\n   * Indicates that a prop should be a Route object.\n   */\n  route: ReactPropTypes.instanceOf(Route),\n\n  /**\n   * Indicates that a prop should be a Router object.\n   */\n  //router: ReactPropTypes.instanceOf(Router) // TODO\n  router: ReactPropTypes.func\n\n});\n\nmodule.exports = PropTypes;\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.extend = extend;\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.createFrame = createFrame;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;',\n  '=': '&#x3D;'\n};\n\nvar badChars = /[&<>\"'`=]/g,\n    possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n  return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n  for (var i = 1; i < arguments.length; i++) {\n    for (var key in arguments[i]) {\n      if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n        obj[key] = arguments[i][key];\n      }\n    }\n  }\n\n  return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nvar isFunction = function isFunction(value) {\n  return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n  exports.isFunction = isFunction = function (value) {\n    return typeof value === 'function' && toString.call(value) === '[object Function]';\n  };\n}\nexports.isFunction = isFunction;\n\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n  return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};\n\nexports.isArray = isArray;\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\nfunction indexOf(array, value) {\n  for (var i = 0, len = array.length; i < len; i++) {\n    if (array[i] === value) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nfunction escapeExpression(string) {\n  if (typeof string !== 'string') {\n    // don't escape SafeStrings, since they're already safe\n    if (string && string.toHTML) {\n      return string.toHTML();\n    } else if (string == null) {\n      return '';\n    } else if (!string) {\n      return string + '';\n    }\n\n    // Force a string conversion as this will be done by the append regardless and\n    // the regex test will do this transparently behind the scenes, causing issues if\n    // an object's to string has escaped characters in it.\n    string = '' + string;\n  }\n\n  if (!possible.test(string)) {\n    return string;\n  }\n  return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n  if (!value && value !== 0) {\n    return true;\n  } else if (isArray(value) && value.length === 0) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction createFrame(object) {\n  var frame = extend({}, object);\n  frame._parent = object;\n  return frame;\n}\n\nfunction blockParams(params, ids) {\n  params.path = ids;\n  return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n  return (contextPath ? contextPath + '.' : '') + id;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.loadReportRoles = loadReportRoles;\nexports.updateUserRole = updateUserRole;\nexports.dismissError = dismissError;\nexports.loadEntityUsers = loadEntityUsers;\nexports.loadedInvitedUsers = loadedInvitedUsers;\nexports.userLastSeenReport = userLastSeenReport;\nexports.updateSearchQuery = updateSearchQuery;\nexports.addMessageUser = addMessageUser;\nexports.addMessageAllUsers = addMessageAllUsers;\nexports.removeMessageUser = removeMessageUser;\nexports.addUser = addUser;\nexports.removeUser = removeUser;\nexports.goToMessagePanel = goToMessagePanel;\nexports.goToPermissionPanel = goToPermissionPanel;\nexports.goToOverviewPanel = goToOverviewPanel;\nexports.updateMessage = updateMessage;\nexports.showSending = showSending;\nexports.hideSending = hideSending;\nexports.resetShareMessagePanel = resetShareMessagePanel;\nexports.sendMessage = sendMessage;\nexports.isPastDeadline = isPastDeadline;\nexports.determineNotificationProperties = determineNotificationProperties;\nexports.openNotification = openNotification;\nexports.closeNotification = closeNotification;\nexports.closeAndNeverShowNotification = closeAndNeverShowNotification;\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _invites_store = __webpack_require__(511);\n\nvar _invites_store2 = _interopRequireDefault(_invites_store);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction loadReportRoles() {\n    var report = _report_view_store2.default.getRenderedReport();\n    _og_api2.default.core.get('reports', report.get('id'), 'report_roles').end().then(function (resp) {\n        var report_roles = resp.body.report_roles;\n\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_ROLES_LOADED',\n            report_roles: report_roles\n        });\n    });\n}\nfunction updateUserRole(userId, reportId, role) {\n    return _og_api2.default.core.put('reports', reportId, 'invites', userId, { role: role }).end().then(function (resp) {\n        var invite = resp.body;\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_INVITE_ROLE_UPDATED',\n            invite: invite\n        });\n    }).catch(function (error) {\n        var status = error.requestResponse.status;\n\n        var errorType = status === 403 ? 'notAuthorized' : 'error';\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'REPORT_UPDATE_ROLE_ERROR',\n            errorType: errorType\n        });\n    });\n}\nfunction dismissError() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_INVITE_DISMISS_ERROR'\n    });\n}\nfunction loadEntityUsers() {\n    var entity = _report_view_store2.default.getReportEntity();\n    if (!entity) {\n        return;\n    }\n    _og_api2.default.core.get('users', { entity_id: entity.get('entity_id'), limit: 1000 }).end().then(function (resp) {\n        var users = resp.body.users;\n\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'INVITABLE_USERS_LOADED',\n            users: users\n        });\n    });\n}\nfunction loadedInvitedUsers(invites) {\n    _og_flux.Dispatcher.handleServerAction({\n        actionType: 'INVITED_USERS_LOADED',\n        invites: invites\n    });\n    var userId = _session_store2.default.getSession().get('id');\n    var isInvited = invites && invites.some(function (invite) {\n        return invite.id === userId;\n    });\n    if (isInvited) {\n        // sinon.spy does not work unless module.exports is here\n        // no.\n        userLastSeenReport(userId);\n    }\n}\nfunction userLastSeenReport(userId) {\n    var report = _report_view_store2.default.getRenderedReport();\n    _og_api2.default.core.put('reports/' + report.get('id') + '/invites/seen', {\n        user_id: userId,\n        last_seen: (0, _moment2.default)().format()\n    }).end().then(function () {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_USER_LAST_SEEN',\n            userId: userId\n        });\n    });\n}\nfunction updateSearchQuery(query) {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'UPDATE_INVITEE_SEARCH_QUERY',\n        query: query\n    });\n}\nfunction addMessageUser(user) {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'ADD_USER_TO_MESSAGE_USERS',\n        user: user\n    });\n}\nfunction addMessageAllUsers() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'ADD_ALL_USERS_TO_MESSAGE_USERS'\n    });\n}\nfunction removeMessageUser(user) {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REMOVE_USER_FROM_MESSAGE_USERS',\n        user: user\n    });\n}\nfunction addUser(user) {\n    var report = _report_view_store2.default.getRenderedReport();\n    if (!report) {\n        return;\n    }\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'ADDING_USER_TO_INVITES',\n        user: user\n    });\n    _og_api2.default.core.post('reports', report.get('id'), 'invites', { user_id: user.get('id') }).end().then(function (resp) {\n        var filteredUsers = resp.body.filter(function (item) {\n            return item.id === user.get('id');\n        });\n        if (filteredUsers.length < 1) {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'REPORT_ADD_USER_ERROR',\n                errorType: 'inviteFailed'\n            });\n            return;\n        }\n        var updatedUser = filteredUsers[0];\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'ADD_USER_TO_INVITES',\n            user: _immutable2.default.fromJS(updatedUser)\n        });\n    });\n}\nfunction removeUser(user) {\n    var report = _report_view_store2.default.getRenderedReport();\n    if (!report) {\n        return;\n    }\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REMOVE_USER_FROM_INVITES',\n        user: user\n    });\n    _og_api2.default.core.del('reports', report.get('id'), 'invites', user.get('id')).end();\n}\nfunction goToMessagePanel() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n        panel: 'message'\n    });\n}\nfunction goToPermissionPanel() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n        panel: 'permission'\n    });\n}\nfunction goToOverviewPanel() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n        panel: 'overview'\n    });\n}\nfunction updateMessage(message) {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_SHARE_UPDATE_MESSAGE',\n        message: message\n    });\n}\nfunction showSending() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_SHARE_SHOW_SENDING'\n    });\n}\nfunction hideSending() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_SHARE_HIDE_SENDING'\n    });\n}\nfunction resetShareMessagePanel() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_SHARE_RESET'\n    });\n}\nfunction sendMessage(_ref, onSuccess) {\n    var userIds = _ref.userIds,\n        message = _ref.message;\n\n    var report = _report_view_store2.default.getRenderedReport();\n    if (!report) {\n        return console.error('You must be viewing a report to send a message about it.');\n    }\n    var messageUserNames = _invites_store2.default.getMessageUsers().toSeq().map(function (user) {\n        return user.get('full_name');\n    });\n    var successString = _strings2.default.formatShareMessageFlash(messageUserNames.toArray());\n    _og_api2.default.core.post('reports', report.get('id'), 'invites', {\n        user_id: userIds,\n        message: message\n    }).end().then(function (response) {\n        resetShareMessagePanel();\n        var invites = response.body;\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'INVITED_USERS_LOADED',\n            invites: invites\n        });\n        Ovid.Flash.ftw({\n            title: 'Email sent',\n            message: successString\n        });\n        onSuccess();\n    }).catch(function () {\n        hideSending();\n        Ovid.Flash.show({\n            title: 'Email cannot be sent',\n            message: 'There was a error sending the report. Try again later.',\n            modifiers: { whoops: true }\n        });\n    });\n}\n//This function takes the current time and the cached time the notification was recently stored.\n//If the cache is unset or the current time exceeds the interval during which we do not reshow the notification\n//(1 day), we return false. Otherwise, true\nfunction isPastDeadline(notificationLastSeen, currentDateTime) {\n    return notificationLastSeen === undefined ? true : (0, _moment2.default)(notificationLastSeen).add(1, 'day').isBefore(currentDateTime);\n}\nfunction determineNotificationProperties(userPreferences, currentDateTime) {\n    var reportSharingPreferences = _lodash2.default.get(userPreferences, 'report_sharing_preferences');\n    //If server has values set, overwrite the defaults\n    var canShowNotification = _lodash2.default.get(reportSharingPreferences, 'notification_enabled') && isPastDeadline(_lodash2.default.get(reportSharingPreferences, 'notification_last_seen'), currentDateTime);\n    var notificationLastSeen = !canShowNotification ? _lodash2.default.get(reportSharingPreferences, 'notification_last_seen') : currentDateTime;\n    //Update preferences object\n    _lodash2.default.extend(userPreferences.report_sharing_preferences, { notification_last_seen: notificationLastSeen });\n    return {\n        userPreferences: userPreferences,\n        canShowNotification: canShowNotification\n    };\n}\nfunction openNotification() {\n    var userId = _session_store2.default.getSession().get('id');\n    var cachedUserPreferences = _invites_store2.default.getUserPreferences();\n    var currentDateTime = (0, _moment2.default)().format();\n    //Only update if we have no cache or current cache is out of date\n    if (cachedUserPreferences === null || isPastDeadline(_lodash2.default.get(cachedUserPreferences, 'report_sharing_preferences.notification_last_seen'), currentDateTime)) {\n        _og_api2.default.core.get('users', userId, 'application_preferences').end().then(function (response) {\n            var currentUserPreferences = response.body;\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'SET_USER_PREFERENCES',\n                userPreferences: currentUserPreferences\n            });\n            if (_lodash2.default.get(currentUserPreferences, 'report_sharing_preferences.notification_enabled') === null || _lodash2.default.get(currentUserPreferences, 'report_sharing_preferences.notification_enabled') === undefined) {\n                _lodash2.default.set(currentUserPreferences, 'report_sharing_preferences.notification_enabled', true);\n            }\n            var notificationProperties = determineNotificationProperties(currentUserPreferences, currentDateTime);\n            if (_lodash2.default.get(notificationProperties, 'canShowNotification')) {\n                _og_api2.default.core.put('users', userId, 'application_preferences', _lodash2.default.get(notificationProperties, 'userPreferences')).end().then(function () {\n                    _og_flux.Dispatcher.handleViewAction({\n                        actionType: 'REPORT_SHARE_OPEN_NOTIFICATION'\n                    });\n                }).catch(function (error) {\n                    Raven.captureException(error);\n                });\n            }\n        });\n    }\n}\nfunction closeNotification() {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'REPORT_SHARE_CLOSE_NOTIFICATION'\n    });\n}\nfunction closeAndNeverShowNotification() {\n    var userId = _session_store2.default.getSession().get('id');\n    var userPreferences = _invites_store2.default.getUserPreferences();\n    closeNotification();\n    if (userPreferences) {\n        userPreferences.report_sharing_preferences.notification_enabled = false;\n        _og_api2.default.core.put('users', userId, 'application_preferences', userPreferences).end().catch(function (error) {\n            Raven.captureException(error);\n        });\n    }\n}\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n// Configuration Constants\nglMatrix.EPSILON = 0.000001;\nglMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\nglMatrix.RANDOM = Math.random;\nglMatrix.ENABLE_SIMD = false;\n\n// Capability detection\nglMatrix.SIMD_AVAILABLE = (glMatrix.ARRAY_TYPE === Float32Array) && ('SIMD' in this);\nglMatrix.USE_SIMD = glMatrix.ENABLE_SIMD && glMatrix.SIMD_AVAILABLE;\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n    glMatrix.ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n\n/**\n* Convert Degree To Radian\n*\n* @param {Number} Angle in Degrees\n*/\nglMatrix.toRadian = function(a){\n     return a * degree;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less \n * than or equal to 1.0, and a relative tolerance is used for larger values)\n * \n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nglMatrix.equals = function(a, b) {\n\treturn Math.abs(a - b) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nmodule.exports = glMatrix;\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LngLat;\n\nvar wrap = __webpack_require__(6).wrap;\n\n/**\n * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.\n *\n * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option\n * can also accept an `Array` of two numbers and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatLike`](#LngLatLike).\n *\n * @class LngLat\n * @param {number} lng Longitude, measured in degrees.\n * @param {number} lat Latitude, measured in degrees.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n */\nfunction LngLat(lng, lat) {\n    if (isNaN(lng) || isNaN(lat)) {\n        throw new Error('Invalid LngLat object: (' + lng + ', ' + lat + ')');\n    }\n    this.lng = +lng;\n    this.lat = +lat;\n    if (this.lat > 90 || this.lat < -90) {\n        throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n    }\n}\n\n/**\n * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LngLat} The wrapped `LngLat` object.\n * @example\n * var ll = new mapboxgl.LngLat(286.0251, 40.7736);\n * var wrapped = ll.wrap();\n * wrapped.lng; // = -73.9749\n */\nLngLat.prototype.wrap = function () {\n    return new LngLat(wrap(this.lng, -180, 180), this.lat);\n};\n\n/**\n * Returns the coordinates represented as an array of two numbers.\n *\n * @returns {Array<number>} The coordinates represeted as an array of longitude and latitude.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toArray(); // = [-73.9749, 40.7736]\n */\nLngLat.prototype.toArray = function () {\n    return [this.lng, this.lat];\n};\n\n/**\n * Returns the coordinates represent as a string.\n *\n * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n */\nLngLat.prototype.toString = function () {\n    return 'LngLat(' + this.lng + ', ' + this.lat + ')';\n};\n\n/**\n * Converts an array of two numbers to a `LngLat` object.\n *\n * If a `LngLat` object is passed in, the function returns it unchanged.\n *\n * @param {LngLatLike} input An array of two numbers to convert, or a `LngLat` object to return.\n * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.\n * @example\n * var arr = [-73.9749, 40.7736];\n * var ll = mapboxgl.LngLat.convert(arr);\n * ll;   // = LngLat {lng: -73.9749, lat: 40.7736}\n */\nLngLat.convert = function (input) {\n    if (input instanceof LngLat) {\n        return input;\n    }\n    if (Array.isArray(input)) {\n        return new LngLat(input[0], input[1]);\n    }\n    return input;\n};\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _settings_panel_store = __webpack_require__(680);\n\nvar _settings_panel_store2 = _interopRequireDefault(_settings_panel_store);\n\nvar _intercom_utils = __webpack_require__(121);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n    selectCategory: function selectCategory(category) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_SELECT_CATEGORY',\n            category: category\n        });\n    },\n    goBack: function goBack() {\n        // Close the report data wizard panel if we are backing out of it.\n        if (!_settings_panel_store2.default.getState().get('isOpen')) {\n            _report_actions2.default.closeEditData();\n        }\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_GO_BACK'\n        });\n    },\n    changeAttribute: function changeAttribute(fieldPath, newValue) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_CHANGE_ATTRIBUTE',\n            fieldPath: fieldPath,\n            newValue: newValue\n        });\n    },\n    cancel: function cancel() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_CANCEL'\n        });\n    },\n    save: function save() {\n        var updatedReport = _settings_panel_store2.default.getState().get('updatedReport');\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_SAVE'\n        });\n        _og_api2.default.put('reports', updatedReport.get('id'), updatedReport.toJS()).end().then(function () {\n            _report_actions2.default.updatedReport(updatedReport);\n            var metadata = {\n                name: updatedReport.get('name'),\n                coa_mask_id: updatedReport.get('coa_mask_id'),\n                visibility: updatedReport.get('visibility')\n            };\n            (0, _intercom_utils.trackIntercomEvent)('update-report', metadata);\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'REPORT_SETTINGS_SAVE_SUCCESS'\n            });\n            Ovid.Flash.ftw({\n                title: 'Success!',\n                message: 'Report settings successfully saved'\n            });\n            if (updatedReport.getIn(['properties', 'summary_table_visible'])) {\n                _grid_report_actions.GridReportActions.getVisualAggregates();\n            }\n        }).catch(function (err) {\n            var requestResponse = err.requestResponse;\n\n            if (requestResponse && requestResponse.status === 422) {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'REPORT_SETTINGS_SAVE_ERROR',\n                    errors: requestResponse.body.errors\n                });\n            } else {\n                Ovid.Alert.unexpectedError();\n            }\n        }).finally(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'REPORT_SETTINGS_SAVE_DONE'\n            });\n        });\n    },\n    deleteReport: function deleteReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT'\n        });\n    },\n    confirmedDeleteReport: function confirmedDeleteReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT_CONFIRMED'\n        });\n        var reportId = _settings_panel_store2.default.getState().getIn(['updatedReport', 'id']);\n        _og_api2.default.del('reports', reportId).end().then(function (res) {\n            if (res.ok) {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'REPORT_SETTINGS_DELETE_REPORT_SUCCESS'\n                });\n                (0, _intercom_utils.trackIntercomEvent)('delete-report');\n            } else {\n                _og_flux.Dispatcher.handleServerAction({\n                    actionType: 'REPORT_SETTINGS_DELETE_REPORT_ERROR'\n                });\n            }\n        });\n    },\n    cancelDeleteReport: function cancelDeleteReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT_CANCELED'\n        });\n    },\n    finishDeleteReport: function finishDeleteReport() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT_FINISHED'\n        });\n    },\n    changeDataSetOrder: function changeDataSetOrder(from, to) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_CHANGE_DATA_SET_ORDER',\n            from: from, to: to\n        });\n    },\n    renameDataSet: function renameDataSet(dataSetIndex, name) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_RENAME_DATA_SET',\n            dataSetIndex: dataSetIndex, name: name\n        });\n    },\n    changeXAxisLabel: function changeXAxisLabel(label) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'REPORT_SETTINGS_CHANGE_XAXIS_LABEL',\n            label: label\n        });\n    }\n};\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nif (__webpack_require__(27)) {\n  var LIBRARY = __webpack_require__(94);\n  var global = __webpack_require__(16);\n  var fails = __webpack_require__(19);\n  var $export = __webpack_require__(4);\n  var $typed = __webpack_require__(239);\n  var $buffer = __webpack_require__(350);\n  var ctx = __webpack_require__(65);\n  var anInstance = __webpack_require__(112);\n  var propertyDesc = __webpack_require__(105);\n  var hide = __webpack_require__(49);\n  var redefineAll = __webpack_require__(114);\n  var toInteger = __webpack_require__(67);\n  var toLength = __webpack_require__(25);\n  var toIndex = __webpack_require__(714);\n  var toAbsoluteIndex = __webpack_require__(108);\n  var toPrimitive = __webpack_require__(73);\n  var has = __webpack_require__(57);\n  var classof = __webpack_require__(131);\n  var isObject = __webpack_require__(20);\n  var toObject = __webpack_require__(32);\n  var isArrayIter = __webpack_require__(339);\n  var create = __webpack_require__(109);\n  var getPrototypeOf = __webpack_require__(60);\n  var gOPN = __webpack_require__(110).f;\n  var getIterFn = __webpack_require__(341);\n  var uid = __webpack_require__(106);\n  var wks = __webpack_require__(23);\n  var createArrayMethod = __webpack_require__(76);\n  var createArrayIncludes = __webpack_require__(229);\n  var speciesConstructor = __webpack_require__(173);\n  var ArrayIterators = __webpack_require__(344);\n  var Iterators = __webpack_require__(133);\n  var $iterDetect = __webpack_require__(234);\n  var setSpecies = __webpack_require__(111);\n  var arrayFill = __webpack_require__(343);\n  var arrayCopyWithin = __webpack_require__(703);\n  var $DP = __webpack_require__(31);\n  var $GOPD = __webpack_require__(59);\n  var dP = $DP.f;\n  var gOPD = $GOPD.f;\n  var RangeError = global.RangeError;\n  var TypeError = global.TypeError;\n  var Uint8Array = global.Uint8Array;\n  var ARRAY_BUFFER = 'ArrayBuffer';\n  var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n  var PROTOTYPE = 'prototype';\n  var ArrayProto = Array[PROTOTYPE];\n  var $ArrayBuffer = $buffer.ArrayBuffer;\n  var $DataView = $buffer.DataView;\n  var arrayForEach = createArrayMethod(0);\n  var arrayFilter = createArrayMethod(2);\n  var arraySome = createArrayMethod(3);\n  var arrayEvery = createArrayMethod(4);\n  var arrayFind = createArrayMethod(5);\n  var arrayFindIndex = createArrayMethod(6);\n  var arrayIncludes = createArrayIncludes(true);\n  var arrayIndexOf = createArrayIncludes(false);\n  var arrayValues = ArrayIterators.values;\n  var arrayKeys = ArrayIterators.keys;\n  var arrayEntries = ArrayIterators.entries;\n  var arrayLastIndexOf = ArrayProto.lastIndexOf;\n  var arrayReduce = ArrayProto.reduce;\n  var arrayReduceRight = ArrayProto.reduceRight;\n  var arrayJoin = ArrayProto.join;\n  var arraySort = ArrayProto.sort;\n  var arraySlice = ArrayProto.slice;\n  var arrayToString = ArrayProto.toString;\n  var arrayToLocaleString = ArrayProto.toLocaleString;\n  var ITERATOR = wks('iterator');\n  var TAG = wks('toStringTag');\n  var TYPED_CONSTRUCTOR = uid('typed_constructor');\n  var DEF_CONSTRUCTOR = uid('def_constructor');\n  var ALL_CONSTRUCTORS = $typed.CONSTR;\n  var TYPED_ARRAY = $typed.TYPED;\n  var VIEW = $typed.VIEW;\n  var WRONG_LENGTH = 'Wrong length!';\n\n  var $map = createArrayMethod(1, function (O, length) {\n    return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n  });\n\n  var LITTLE_ENDIAN = fails(function () {\n    // eslint-disable-next-line no-undef\n    return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n  });\n\n  var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n    new Uint8Array(1).set({});\n  });\n\n  var toOffset = function (it, BYTES) {\n    var offset = toInteger(it);\n    if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n    return offset;\n  };\n\n  var validate = function (it) {\n    if (isObject(it) && TYPED_ARRAY in it) return it;\n    throw TypeError(it + ' is not a typed array!');\n  };\n\n  var allocate = function (C, length) {\n    if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n      throw TypeError('It is not a typed array constructor!');\n    } return new C(length);\n  };\n\n  var speciesFromList = function (O, list) {\n    return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n  };\n\n  var fromList = function (C, list) {\n    var index = 0;\n    var length = list.length;\n    var result = allocate(C, length);\n    while (length > index) result[index] = list[index++];\n    return result;\n  };\n\n  var addGetter = function (it, key, internal) {\n    dP(it, key, { get: function () { return this._d[internal]; } });\n  };\n\n  var $from = function from(source /* , mapfn, thisArg */) {\n    var O = toObject(source);\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var iterFn = getIterFn(O);\n    var i, length, values, result, step, iterator;\n    if (iterFn != undefined && !isArrayIter(iterFn)) {\n      for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n        values.push(step.value);\n      } O = values;\n    }\n    if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n    for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n      result[i] = mapping ? mapfn(O[i], i) : O[i];\n    }\n    return result;\n  };\n\n  var $of = function of(/* ...items */) {\n    var index = 0;\n    var length = arguments.length;\n    var result = allocate(this, length);\n    while (length > index) result[index] = arguments[index++];\n    return result;\n  };\n\n  // iOS Safari 6.x fails here\n  var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n  var $toLocaleString = function toLocaleString() {\n    return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n  };\n\n  var proto = {\n    copyWithin: function copyWithin(target, start /* , end */) {\n      return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n    },\n    every: function every(callbackfn /* , thisArg */) {\n      return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n      return arrayFill.apply(validate(this), arguments);\n    },\n    filter: function filter(callbackfn /* , thisArg */) {\n      return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n        arguments.length > 1 ? arguments[1] : undefined));\n    },\n    find: function find(predicate /* , thisArg */) {\n      return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    findIndex: function findIndex(predicate /* , thisArg */) {\n      return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    forEach: function forEach(callbackfn /* , thisArg */) {\n      arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    indexOf: function indexOf(searchElement /* , fromIndex */) {\n      return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    includes: function includes(searchElement /* , fromIndex */) {\n      return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    join: function join(separator) { // eslint-disable-line no-unused-vars\n      return arrayJoin.apply(validate(this), arguments);\n    },\n    lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n      return arrayLastIndexOf.apply(validate(this), arguments);\n    },\n    map: function map(mapfn /* , thisArg */) {\n      return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n      return arrayReduce.apply(validate(this), arguments);\n    },\n    reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n      return arrayReduceRight.apply(validate(this), arguments);\n    },\n    reverse: function reverse() {\n      var that = this;\n      var length = validate(that).length;\n      var middle = Math.floor(length / 2);\n      var index = 0;\n      var value;\n      while (index < middle) {\n        value = that[index];\n        that[index++] = that[--length];\n        that[length] = value;\n      } return that;\n    },\n    some: function some(callbackfn /* , thisArg */) {\n      return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    sort: function sort(comparefn) {\n      return arraySort.call(validate(this), comparefn);\n    },\n    subarray: function subarray(begin, end) {\n      var O = validate(this);\n      var length = O.length;\n      var $begin = toAbsoluteIndex(begin, length);\n      return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n        O.buffer,\n        O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n        toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n      );\n    }\n  };\n\n  var $slice = function slice(start, end) {\n    return speciesFromList(this, arraySlice.call(validate(this), start, end));\n  };\n\n  var $set = function set(arrayLike /* , offset */) {\n    validate(this);\n    var offset = toOffset(arguments[1], 1);\n    var length = this.length;\n    var src = toObject(arrayLike);\n    var len = toLength(src.length);\n    var index = 0;\n    if (len + offset > length) throw RangeError(WRONG_LENGTH);\n    while (index < len) this[offset + index] = src[index++];\n  };\n\n  var $iterators = {\n    entries: function entries() {\n      return arrayEntries.call(validate(this));\n    },\n    keys: function keys() {\n      return arrayKeys.call(validate(this));\n    },\n    values: function values() {\n      return arrayValues.call(validate(this));\n    }\n  };\n\n  var isTAIndex = function (target, key) {\n    return isObject(target)\n      && target[TYPED_ARRAY]\n      && typeof key != 'symbol'\n      && key in target\n      && String(+key) == String(key);\n  };\n  var $getDesc = function getOwnPropertyDescriptor(target, key) {\n    return isTAIndex(target, key = toPrimitive(key, true))\n      ? propertyDesc(2, target[key])\n      : gOPD(target, key);\n  };\n  var $setDesc = function defineProperty(target, key, desc) {\n    if (isTAIndex(target, key = toPrimitive(key, true))\n      && isObject(desc)\n      && has(desc, 'value')\n      && !has(desc, 'get')\n      && !has(desc, 'set')\n      // TODO: add validation descriptor w/o calling accessors\n      && !desc.configurable\n      && (!has(desc, 'writable') || desc.writable)\n      && (!has(desc, 'enumerable') || desc.enumerable)\n    ) {\n      target[key] = desc.value;\n      return target;\n    } return dP(target, key, desc);\n  };\n\n  if (!ALL_CONSTRUCTORS) {\n    $GOPD.f = $getDesc;\n    $DP.f = $setDesc;\n  }\n\n  $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n    getOwnPropertyDescriptor: $getDesc,\n    defineProperty: $setDesc\n  });\n\n  if (fails(function () { arrayToString.call({}); })) {\n    arrayToString = arrayToLocaleString = function toString() {\n      return arrayJoin.call(this);\n    };\n  }\n\n  var $TypedArrayPrototype$ = redefineAll({}, proto);\n  redefineAll($TypedArrayPrototype$, $iterators);\n  hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n  redefineAll($TypedArrayPrototype$, {\n    slice: $slice,\n    set: $set,\n    constructor: function () { /* noop */ },\n    toString: arrayToString,\n    toLocaleString: $toLocaleString\n  });\n  addGetter($TypedArrayPrototype$, 'buffer', 'b');\n  addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n  addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n  addGetter($TypedArrayPrototype$, 'length', 'e');\n  dP($TypedArrayPrototype$, TAG, {\n    get: function () { return this[TYPED_ARRAY]; }\n  });\n\n  // eslint-disable-next-line max-statements\n  module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n    CLAMPED = !!CLAMPED;\n    var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n    var GETTER = 'get' + KEY;\n    var SETTER = 'set' + KEY;\n    var TypedArray = global[NAME];\n    var Base = TypedArray || {};\n    var TAC = TypedArray && getPrototypeOf(TypedArray);\n    var FORCED = !TypedArray || !$typed.ABV;\n    var O = {};\n    var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n    var getter = function (that, index) {\n      var data = that._d;\n      return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n    };\n    var setter = function (that, index, value) {\n      var data = that._d;\n      if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n      data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n    };\n    var addElement = function (that, index) {\n      dP(that, index, {\n        get: function () {\n          return getter(this, index);\n        },\n        set: function (value) {\n          return setter(this, index, value);\n        },\n        enumerable: true\n      });\n    };\n    if (FORCED) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME, '_d');\n        var index = 0;\n        var offset = 0;\n        var buffer, byteLength, length, klass;\n        if (!isObject(data)) {\n          length = toIndex(data);\n          byteLength = length * BYTES;\n          buffer = new $ArrayBuffer(byteLength);\n        } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          buffer = data;\n          offset = toOffset($offset, BYTES);\n          var $len = data.byteLength;\n          if ($length === undefined) {\n            if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n            byteLength = $len - offset;\n            if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n          } else {\n            byteLength = toLength($length) * BYTES;\n            if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n          }\n          length = byteLength / BYTES;\n        } else if (TYPED_ARRAY in data) {\n          return fromList(TypedArray, data);\n        } else {\n          return $from.call(TypedArray, data);\n        }\n        hide(that, '_d', {\n          b: buffer,\n          o: offset,\n          l: byteLength,\n          e: length,\n          v: new $DataView(buffer)\n        });\n        while (index < length) addElement(that, index++);\n      });\n      TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n      hide(TypedArrayPrototype, 'constructor', TypedArray);\n    } else if (!fails(function () {\n      TypedArray(1);\n    }) || !fails(function () {\n      new TypedArray(-1); // eslint-disable-line no-new\n    }) || !$iterDetect(function (iter) {\n      new TypedArray(); // eslint-disable-line no-new\n      new TypedArray(null); // eslint-disable-line no-new\n      new TypedArray(1.5); // eslint-disable-line no-new\n      new TypedArray(iter); // eslint-disable-line no-new\n    }, true)) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME);\n        var klass;\n        // `ws` module bug, temporarily remove validation length for Uint8Array\n        // https://github.com/websockets/ws/pull/645\n        if (!isObject(data)) return new Base(toIndex(data));\n        if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          return $length !== undefined\n            ? new Base(data, toOffset($offset, BYTES), $length)\n            : $offset !== undefined\n              ? new Base(data, toOffset($offset, BYTES))\n              : new Base(data);\n        }\n        if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n        return $from.call(TypedArray, data);\n      });\n      arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n        if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n      });\n      TypedArray[PROTOTYPE] = TypedArrayPrototype;\n      if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n    }\n    var $nativeIterator = TypedArrayPrototype[ITERATOR];\n    var CORRECT_ITER_NAME = !!$nativeIterator\n      && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n    var $iterator = $iterators.values;\n    hide(TypedArray, TYPED_CONSTRUCTOR, true);\n    hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n    hide(TypedArrayPrototype, VIEW, true);\n    hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n    if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n      dP(TypedArrayPrototype, TAG, {\n        get: function () { return NAME; }\n      });\n    }\n\n    O[NAME] = TypedArray;\n\n    $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n    $export($export.S, NAME, {\n      BYTES_PER_ELEMENT: BYTES\n    });\n\n    $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n      from: $from,\n      of: $of\n    });\n\n    if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n    $export($export.P, NAME, proto);\n\n    setSpecies(NAME);\n\n    $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n    $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n    if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n    $export($export.P + $export.F * fails(function () {\n      new TypedArray(1).slice();\n    }), NAME, { slice: $slice });\n\n    $export($export.P + $export.F * (fails(function () {\n      return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n    }) || !fails(function () {\n      TypedArrayPrototype.toLocaleString.call([1, 2]);\n    })), NAME, { toLocaleString: $toLocaleString });\n\n    Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n    if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n  };\n} else module.exports = function () { /* empty */ };\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Map = __webpack_require__(709);\nvar $export = __webpack_require__(4);\nvar shared = __webpack_require__(169)('metadata');\nvar store = shared.store || (shared.store = new (__webpack_require__(712))());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n  var targetMetadata = store.get(target);\n  if (!targetMetadata) {\n    if (!create) return undefined;\n    store.set(target, targetMetadata = new Map());\n  }\n  var keyMetadata = targetMetadata.get(targetKey);\n  if (!keyMetadata) {\n    if (!create) return undefined;\n    targetMetadata.set(targetKey, keyMetadata = new Map());\n  } return keyMetadata;\n};\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n  var metadataMap = getOrCreateMetadataMap(O, P, false);\n  return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n  var metadataMap = getOrCreateMetadataMap(O, P, false);\n  return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n  getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n  var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n  var keys = [];\n  if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });\n  return keys;\n};\nvar toMetaKey = function (it) {\n  return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\nvar exp = function (O) {\n  $export($export.S, 'Reflect', O);\n};\n\nmodule.exports = {\n  store: store,\n  map: getOrCreateMetadataMap,\n  has: ordinaryHasOwnMetadata,\n  get: ordinaryGetOwnMetadata,\n  set: ordinaryDefineOwnMetadata,\n  keys: ordinaryOwnMetadataKeys,\n  key: toMetaKey,\n  exp: exp\n};\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar consoleLogger = {\n  type: 'logger',\n\n  log: function log(args) {\n    this._output('log', args);\n  },\n  warn: function warn(args) {\n    this._output('warn', args);\n  },\n  error: function error(args) {\n    this._output('error', args);\n  },\n  _output: function _output(type, args) {\n    if (console && console[type]) console[type].apply(console, Array.prototype.slice.call(args));\n  }\n};\n\nvar Logger = function () {\n  function Logger(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Logger);\n\n    this.subs = [];\n    this.init(concreteLogger, options);\n  }\n\n  Logger.prototype.init = function init(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    this.prefix = options.prefix || 'i18next:';\n    this.logger = concreteLogger || consoleLogger;\n    this.options = options;\n    this.debug = options.debug === false ? false : true;\n  };\n\n  Logger.prototype.setDebug = function setDebug(bool) {\n    this.debug = bool;\n    this.subs.forEach(function (sub) {\n      sub.setDebug(bool);\n    });\n  };\n\n  Logger.prototype.log = function log() {\n    this.forward(arguments, 'log', '', true);\n  };\n\n  Logger.prototype.warn = function warn() {\n    this.forward(arguments, 'warn', '', true);\n  };\n\n  Logger.prototype.error = function error() {\n    this.forward(arguments, 'error', '');\n  };\n\n  Logger.prototype.deprecate = function deprecate() {\n    this.forward(arguments, 'warn', 'WARNING DEPRECATED: ', true);\n  };\n\n  Logger.prototype.forward = function forward(args, lvl, prefix, debugOnly) {\n    if (debugOnly && !this.debug) return;\n    if (typeof args[0] === 'string') args[0] = prefix + this.prefix + ' ' + args[0];\n    this.logger[lvl](args);\n  };\n\n  Logger.prototype.create = function create(moduleName) {\n    var sub = new Logger(this.logger, _extends({ prefix: this.prefix + ':' + moduleName + ':' }, this.options));\n    this.subs.push(sub);\n\n    return sub;\n  };\n\n  // createInstance(options = {}) {\n  //   return new Logger(options, callback);\n  // }\n\n  return Logger;\n}();\n\n;\n\nexports.default = new Logger();\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.columnTypeToNumberType = exports.localeToCurrency = exports.accountTypeAndLocaleToNumberType = exports.numberTypes = undefined;\n\nvar _immutable = __webpack_require__(14);\n\nvar base = (0, _immutable.Record)({\n    symbol: '',\n    isCurrency: false,\n    label: '',\n    formatter: function formatter(value) {\n        return value;\n    }\n}); // Definitions of number types and their formatters\nvar numberTypes = exports.numberTypes = {\n    dollar: base({\n        symbol: '$',\n        isCurrency: true,\n        label: 'Dollar',\n        formatter: function formatter(value) {\n            var space = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n            return '$' + space + value;\n        }\n    }),\n    pound: base({\n        symbol: '£',\n        isCurrency: true,\n        label: 'Pound',\n        formatter: function formatter(value) {\n            var space = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n            return '\\xA3' + space + value;\n        }\n    }),\n    fte: base({\n        symbol: 'FTE',\n        isCurrency: false,\n        label: 'FTE'\n    }),\n    number: base({\n        symbol: '',\n        isCurrency: false,\n        label: ''\n    }),\n    percentage: base({\n        symbol: '%',\n        isCurrency: false,\n        label: 'Percentage',\n        formatter: function formatter(value) {\n            return value + '%';\n        }\n    }),\n    interpolated: base({\n        symbol: 'interpolated',\n        isCurrency: false,\n        label: 'Interpolated'\n    }),\n    incidents: base({\n        symbol: '',\n        isCurrency: false,\n        label: 'Incidents',\n        formatter: function formatter(value) {\n            return value + ' incidents';\n        }\n    }),\n    // 'type' is any other format type\n    per: function per(type, name) {\n        return base({\n            isCurrency: type.isCurrency,\n            label: 'Per',\n            formatter: function formatter(value) {\n                return type.formatter(value) + ' per ' + name;\n            }\n        });\n    },\n    none: base()\n};\nvar accountTypeAndLocaleToNumberType = exports.accountTypeAndLocaleToNumberType = function accountTypeAndLocaleToNumberType(accountType, locale) {\n    return accountType === 'fteCount' ? numberTypes.fte : localeToCurrency(locale);\n};\n// this assumes the default locale is 'en_US'\nvar localeToCurrency = exports.localeToCurrency = function localeToCurrency(locale) {\n    switch (locale) {\n        case 'en_GB':\n            return numberTypes.pound;\n    }\n    return numberTypes.dollar;\n};\nvar columnTypeToNumberType = exports.columnTypeToNumberType = function columnTypeToNumberType(columnType, locale) {\n    switch (columnType) {\n        case 'monetary':\n            return localeToCurrency(locale);\n        case 'percent':\n            return numberTypes.percentage;\n        case 'numeric':\n        default:\n            return numberTypes.number;\n    }\n};\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.getJSON = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.setRequestHeader('Accept', 'application/json');\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            var data;\n            try {\n                data = JSON.parse(xhr.response);\n            } catch (err) {\n                return callback(err);\n            }\n            callback(null, data);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.responseType = 'arraybuffer';\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            callback(null, xhr.response);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nfunction sameOrigin(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.protocol === document.location.protocol && a.host === document.location.host;\n}\n\nexports.getImage = function(url, callback) {\n    return exports.getArrayBuffer(url, function(err, imgData) {\n        if (err) return callback(err);\n        var img = new Image();\n        img.onload = function() {\n            callback(null, img);\n            (window.URL || window.webkitURL).revokeObjectURL(img.src);\n        };\n        var blob = new Blob([new Uint8Array(imgData)], { type: 'image/png' });\n        img.src = (window.URL || window.webkitURL).createObjectURL(blob);\n        img.getData = function() {\n            var canvas = document.createElement('canvas');\n            var context = canvas.getContext('2d');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            context.drawImage(img, 0, 0);\n            return context.getImageData(0, 0, img.width, img.height).data;\n        };\n        return img;\n    });\n};\n\nexports.getVideo = function(urls, callback) {\n    var video = document.createElement('video');\n    video.onloadstart = function() {\n        callback(null, video);\n    };\n    for (var i = 0; i < urls.length; i++) {\n        var s = document.createElement('source');\n        if (!sameOrigin(urls[i])) {\n            video.crossOrigin = 'Anonymous';\n        }\n        s.src = urls[i];\n        video.appendChild(s);\n    }\n    video.getData = function() { return video; };\n    return video;\n};\n\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LngLat;\n\nvar wrap = __webpack_require__(10).wrap;\n\n/**\n * Create a longitude, latitude object from a given longitude and latitude pair in degrees.\n * Mapbox GL uses Longitude, Latitude coordinate order to match GeoJSON.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object can also accept an\n * `Array` and will perform an implicit conversion.  The following lines are equivalent:\n ```\n map.setCenter([-73.9749, 40.7736]);\n map.setCenter( new mapboxgl.LngLat(-73.9749, 40.7736) );\n ```\n *\n * @class LngLat\n * @classdesc A representation of a longitude, latitude point, in degrees.\n * @param {number} lng longitude\n * @param {number} lat latitude\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n */\nfunction LngLat(lng, lat) {\n    if (isNaN(lng) || isNaN(lat)) {\n        throw new Error('Invalid LngLat object: (' + lng + ', ' + lat + ')');\n    }\n    this.lng = +lng;\n    this.lat = +lat;\n    if (this.lat > 90 || this.lat < -90) {\n        throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n    }\n}\n\n/**\n * Return a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LngLat} wrapped LngLat object\n * @example\n * var ll = new mapboxgl.LngLat(286.0251, 40.7736);\n * var wrapped = ll.wrap();\n * wrapped.lng; // = -73.9749\n */\nLngLat.prototype.wrap = function () {\n    return new LngLat(wrap(this.lng, -180, 180), this.lat);\n};\n\n/**\n * Return a `LngLat` as an array\n *\n * @returns {array} [lng, lat]\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toArray(); // = [-73.9749, 40.7736]\n */\nLngLat.prototype.toArray = function () {\n    return [this.lng, this.lat];\n};\n\n/**\n * Return a `LngLat` as a string\n *\n * @returns {string} \"LngLat(lng, lat)\"\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n */\nLngLat.prototype.toString = function () {\n    return 'LngLat(' + this.lng + ', ' + this.lat + ')';\n};\n\n/**\n * Convert an array to a `LngLat` object, or return an existing `LngLat` object\n * unchanged.\n *\n * @param {Array<number>|LngLat} input `input` to convert\n * @returns {LngLat} LngLat object or original input\n * @example\n * var arr = [-73.9749, 40.7736];\n * var ll = mapboxgl.LngLat.convert(arr);\n * ll;   // = LngLat {lng: -73.9749, lat: 40.7736}\n */\nLngLat.convert = function (input) {\n    if (input instanceof LngLat) {\n        return input;\n    }\n    if (Array.isArray(input)) {\n        return new LngLat(input[0], input[1]);\n    }\n    return input;\n};\n\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.3.2\n */\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n// END HEADER\n\nexports.glMatrix = __webpack_require__(81);\nexports.mat2 = __webpack_require__(1060);\nexports.mat2d = __webpack_require__(1061);\nexports.mat3 = __webpack_require__(573);\nexports.mat4 = __webpack_require__(1062);\nexports.quat = __webpack_require__(1063);\nexports.vec2 = __webpack_require__(1064);\nexports.vec3 = __webpack_require__(574);\nexports.vec4 = __webpack_require__(575);\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.getJSON = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.setRequestHeader('Accept', 'application/json');\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            var data;\n            try {\n                data = JSON.parse(xhr.response);\n            } catch (err) {\n                return callback(err);\n            }\n            callback(null, data);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.responseType = 'arraybuffer';\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            callback(null, xhr.response);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nfunction sameOrigin(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.protocol === document.location.protocol && a.host === document.location.host;\n}\n\nexports.getImage = function(url, callback) {\n    return exports.getArrayBuffer(url, function(err, imgData) {\n        if (err) return callback(err);\n        var img = new Image();\n        img.onload = function() {\n            callback(null, img);\n            (window.URL || window.webkitURL).revokeObjectURL(img.src);\n        };\n        var blob = new Blob([new Uint8Array(imgData)], { type: 'image/png' });\n        img.src = (window.URL || window.webkitURL).createObjectURL(blob);\n        img.getData = function() {\n            var canvas = document.createElement('canvas');\n            var context = canvas.getContext('2d');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            context.drawImage(img, 0, 0);\n            return context.getImageData(0, 0, img.width, img.height).data;\n        };\n        return img;\n    });\n};\n\nexports.getVideo = function(urls, callback) {\n    var video = document.createElement('video');\n    video.onloadstart = function() {\n        callback(null, video);\n    };\n    for (var i = 0; i < urls.length; i++) {\n        var s = document.createElement('source');\n        if (!sameOrigin(urls[i])) {\n            video.crossOrigin = 'Anonymous';\n        }\n        s.src = urls[i];\n        video.appendChild(s);\n    }\n    video.getData = function() { return video; };\n    return video;\n};\n\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// http://dev.w3.org/csswg/css-color/\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HEX3 = /^#([a-f0-9]{3})$/i;\nvar hex3 = function hex3(value) {\n    var match = value.match(HEX3);\n    if (match) {\n        return [parseInt(match[1][0] + match[1][0], 16), parseInt(match[1][1] + match[1][1], 16), parseInt(match[1][2] + match[1][2], 16), null];\n    }\n    return false;\n};\n\nvar HEX6 = /^#([a-f0-9]{6})$/i;\nvar hex6 = function hex6(value) {\n    var match = value.match(HEX6);\n    if (match) {\n        return [parseInt(match[1].substring(0, 2), 16), parseInt(match[1].substring(2, 4), 16), parseInt(match[1].substring(4, 6), 16), null];\n    }\n    return false;\n};\n\nvar RGB = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/;\nvar rgb = function rgb(value) {\n    var match = value.match(RGB);\n    if (match) {\n        return [Number(match[1]), Number(match[2]), Number(match[3]), null];\n    }\n    return false;\n};\n\nvar RGBA = /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?\\.?\\d+)\\s*\\)$/;\nvar rgba = function rgba(value) {\n    var match = value.match(RGBA);\n    if (match && match.length > 4) {\n        return [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4])];\n    }\n    return false;\n};\n\nvar fromArray = function fromArray(array) {\n    return [Math.min(array[0], 255), Math.min(array[1], 255), Math.min(array[2], 255), array.length > 3 ? array[3] : null];\n};\n\nvar namedColor = function namedColor(name) {\n    var color = NAMED_COLORS[name.toLowerCase()];\n    return color ? color : false;\n};\n\nvar Color = function () {\n    function Color(value) {\n        _classCallCheck(this, Color);\n\n        var _ref = Array.isArray(value) ? fromArray(value) : hex3(value) || rgb(value) || rgba(value) || namedColor(value) || hex6(value) || [0, 0, 0, null],\n            _ref2 = _slicedToArray(_ref, 4),\n            r = _ref2[0],\n            g = _ref2[1],\n            b = _ref2[2],\n            a = _ref2[3];\n\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n    }\n\n    _createClass(Color, [{\n        key: 'isTransparent',\n        value: function isTransparent() {\n            return this.a === 0;\n        }\n    }, {\n        key: 'toString',\n        value: function toString() {\n            return this.a !== null && this.a !== 1 ? 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + this.a + ')' : 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';\n        }\n    }]);\n\n    return Color;\n}();\n\nexports.default = Color;\n\n\nvar NAMED_COLORS = {\n    transparent: [0, 0, 0, 0],\n    aliceblue: [240, 248, 255, null],\n    antiquewhite: [250, 235, 215, null],\n    aqua: [0, 255, 255, null],\n    aquamarine: [127, 255, 212, null],\n    azure: [240, 255, 255, null],\n    beige: [245, 245, 220, null],\n    bisque: [255, 228, 196, null],\n    black: [0, 0, 0, null],\n    blanchedalmond: [255, 235, 205, null],\n    blue: [0, 0, 255, null],\n    blueviolet: [138, 43, 226, null],\n    brown: [165, 42, 42, null],\n    burlywood: [222, 184, 135, null],\n    cadetblue: [95, 158, 160, null],\n    chartreuse: [127, 255, 0, null],\n    chocolate: [210, 105, 30, null],\n    coral: [255, 127, 80, null],\n    cornflowerblue: [100, 149, 237, null],\n    cornsilk: [255, 248, 220, null],\n    crimson: [220, 20, 60, null],\n    cyan: [0, 255, 255, null],\n    darkblue: [0, 0, 139, null],\n    darkcyan: [0, 139, 139, null],\n    darkgoldenrod: [184, 134, 11, null],\n    darkgray: [169, 169, 169, null],\n    darkgreen: [0, 100, 0, null],\n    darkgrey: [169, 169, 169, null],\n    darkkhaki: [189, 183, 107, null],\n    darkmagenta: [139, 0, 139, null],\n    darkolivegreen: [85, 107, 47, null],\n    darkorange: [255, 140, 0, null],\n    darkorchid: [153, 50, 204, null],\n    darkred: [139, 0, 0, null],\n    darksalmon: [233, 150, 122, null],\n    darkseagreen: [143, 188, 143, null],\n    darkslateblue: [72, 61, 139, null],\n    darkslategray: [47, 79, 79, null],\n    darkslategrey: [47, 79, 79, null],\n    darkturquoise: [0, 206, 209, null],\n    darkviolet: [148, 0, 211, null],\n    deeppink: [255, 20, 147, null],\n    deepskyblue: [0, 191, 255, null],\n    dimgray: [105, 105, 105, null],\n    dimgrey: [105, 105, 105, null],\n    dodgerblue: [30, 144, 255, null],\n    firebrick: [178, 34, 34, null],\n    floralwhite: [255, 250, 240, null],\n    forestgreen: [34, 139, 34, null],\n    fuchsia: [255, 0, 255, null],\n    gainsboro: [220, 220, 220, null],\n    ghostwhite: [248, 248, 255, null],\n    gold: [255, 215, 0, null],\n    goldenrod: [218, 165, 32, null],\n    gray: [128, 128, 128, null],\n    green: [0, 128, 0, null],\n    greenyellow: [173, 255, 47, null],\n    grey: [128, 128, 128, null],\n    honeydew: [240, 255, 240, null],\n    hotpink: [255, 105, 180, null],\n    indianred: [205, 92, 92, null],\n    indigo: [75, 0, 130, null],\n    ivory: [255, 255, 240, null],\n    khaki: [240, 230, 140, null],\n    lavender: [230, 230, 250, null],\n    lavenderblush: [255, 240, 245, null],\n    lawngreen: [124, 252, 0, null],\n    lemonchiffon: [255, 250, 205, null],\n    lightblue: [173, 216, 230, null],\n    lightcoral: [240, 128, 128, null],\n    lightcyan: [224, 255, 255, null],\n    lightgoldenrodyellow: [250, 250, 210, null],\n    lightgray: [211, 211, 211, null],\n    lightgreen: [144, 238, 144, null],\n    lightgrey: [211, 211, 211, null],\n    lightpink: [255, 182, 193, null],\n    lightsalmon: [255, 160, 122, null],\n    lightseagreen: [32, 178, 170, null],\n    lightskyblue: [135, 206, 250, null],\n    lightslategray: [119, 136, 153, null],\n    lightslategrey: [119, 136, 153, null],\n    lightsteelblue: [176, 196, 222, null],\n    lightyellow: [255, 255, 224, null],\n    lime: [0, 255, 0, null],\n    limegreen: [50, 205, 50, null],\n    linen: [250, 240, 230, null],\n    magenta: [255, 0, 255, null],\n    maroon: [128, 0, 0, null],\n    mediumaquamarine: [102, 205, 170, null],\n    mediumblue: [0, 0, 205, null],\n    mediumorchid: [186, 85, 211, null],\n    mediumpurple: [147, 112, 219, null],\n    mediumseagreen: [60, 179, 113, null],\n    mediumslateblue: [123, 104, 238, null],\n    mediumspringgreen: [0, 250, 154, null],\n    mediumturquoise: [72, 209, 204, null],\n    mediumvioletred: [199, 21, 133, null],\n    midnightblue: [25, 25, 112, null],\n    mintcream: [245, 255, 250, null],\n    mistyrose: [255, 228, 225, null],\n    moccasin: [255, 228, 181, null],\n    navajowhite: [255, 222, 173, null],\n    navy: [0, 0, 128, null],\n    oldlace: [253, 245, 230, null],\n    olive: [128, 128, 0, null],\n    olivedrab: [107, 142, 35, null],\n    orange: [255, 165, 0, null],\n    orangered: [255, 69, 0, null],\n    orchid: [218, 112, 214, null],\n    palegoldenrod: [238, 232, 170, null],\n    palegreen: [152, 251, 152, null],\n    paleturquoise: [175, 238, 238, null],\n    palevioletred: [219, 112, 147, null],\n    papayawhip: [255, 239, 213, null],\n    peachpuff: [255, 218, 185, null],\n    peru: [205, 133, 63, null],\n    pink: [255, 192, 203, null],\n    plum: [221, 160, 221, null],\n    powderblue: [176, 224, 230, null],\n    purple: [128, 0, 128, null],\n    rebeccapurple: [102, 51, 153, null],\n    red: [255, 0, 0, null],\n    rosybrown: [188, 143, 143, null],\n    royalblue: [65, 105, 225, null],\n    saddlebrown: [139, 69, 19, null],\n    salmon: [250, 128, 114, null],\n    sandybrown: [244, 164, 96, null],\n    seagreen: [46, 139, 87, null],\n    seashell: [255, 245, 238, null],\n    sienna: [160, 82, 45, null],\n    silver: [192, 192, 192, null],\n    skyblue: [135, 206, 235, null],\n    slateblue: [106, 90, 205, null],\n    slategray: [112, 128, 144, null],\n    slategrey: [112, 128, 144, null],\n    snow: [255, 250, 250, null],\n    springgreen: [0, 255, 127, null],\n    steelblue: [70, 130, 180, null],\n    tan: [210, 180, 140, null],\n    teal: [0, 128, 128, null],\n    thistle: [216, 191, 216, null],\n    tomato: [255, 99, 71, null],\n    turquoise: [64, 224, 208, null],\n    violet: [238, 130, 238, null],\n    wheat: [245, 222, 179, null],\n    white: [255, 255, 255, null],\n    whitesmoke: [245, 245, 245, null],\n    yellow: [255, 255, 0, null],\n    yellowgreen: [154, 205, 50, null]\n};\n\nvar TRANSPARENT = exports.TRANSPARENT = new Color([0, 0, 0, 0]);\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBoundCurves = exports.calculatePaddingBoxPath = exports.calculateBorderBoxPath = exports.parsePathForBorder = exports.parseDocumentSize = exports.calculateContentBox = exports.calculatePaddingBox = exports.parseBounds = exports.Bounds = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Vector = __webpack_require__(227);\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _BezierCurve = __webpack_require__(1525);\n\nvar _BezierCurve2 = _interopRequireDefault(_BezierCurve);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TOP = 0;\nvar RIGHT = 1;\nvar BOTTOM = 2;\nvar LEFT = 3;\n\nvar H = 0;\nvar V = 1;\n\nvar Bounds = exports.Bounds = function () {\n    function Bounds(x, y, w, h) {\n        _classCallCheck(this, Bounds);\n\n        this.left = x;\n        this.top = y;\n        this.width = w;\n        this.height = h;\n    }\n\n    _createClass(Bounds, null, [{\n        key: 'fromClientRect',\n        value: function fromClientRect(clientRect, scrollX, scrollY) {\n            return new Bounds(clientRect.left + scrollX, clientRect.top + scrollY, clientRect.width, clientRect.height);\n        }\n    }]);\n\n    return Bounds;\n}();\n\nvar parseBounds = exports.parseBounds = function parseBounds(node, scrollX, scrollY) {\n    return Bounds.fromClientRect(node.getBoundingClientRect(), scrollX, scrollY);\n};\n\nvar calculatePaddingBox = exports.calculatePaddingBox = function calculatePaddingBox(bounds, borders) {\n    return new Bounds(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth));\n};\n\nvar calculateContentBox = exports.calculateContentBox = function calculateContentBox(bounds, padding, borders) {\n    // TODO support percentage paddings\n    var paddingTop = padding[TOP].value;\n    var paddingRight = padding[RIGHT].value;\n    var paddingBottom = padding[BOTTOM].value;\n    var paddingLeft = padding[LEFT].value;\n\n    return new Bounds(bounds.left + paddingLeft + borders[LEFT].borderWidth, bounds.top + paddingTop + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth + paddingLeft + paddingRight), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth + paddingTop + paddingBottom));\n};\n\nvar parseDocumentSize = exports.parseDocumentSize = function parseDocumentSize(document) {\n    var body = document.body;\n    var documentElement = document.documentElement;\n\n    if (!body || !documentElement) {\n        throw new Error( false ? 'Unable to get document size' : '');\n    }\n    var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));\n\n    var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));\n\n    return new Bounds(0, 0, width, height);\n};\n\nvar parsePathForBorder = exports.parsePathForBorder = function parsePathForBorder(curves, borderSide) {\n    switch (borderSide) {\n        case TOP:\n            return createPathFromCurves(curves.topLeftOuter, curves.topLeftInner, curves.topRightOuter, curves.topRightInner);\n        case RIGHT:\n            return createPathFromCurves(curves.topRightOuter, curves.topRightInner, curves.bottomRightOuter, curves.bottomRightInner);\n        case BOTTOM:\n            return createPathFromCurves(curves.bottomRightOuter, curves.bottomRightInner, curves.bottomLeftOuter, curves.bottomLeftInner);\n        case LEFT:\n        default:\n            return createPathFromCurves(curves.bottomLeftOuter, curves.bottomLeftInner, curves.topLeftOuter, curves.topLeftInner);\n    }\n};\n\nvar createPathFromCurves = function createPathFromCurves(outer1, inner1, outer2, inner2) {\n    var path = [];\n    if (outer1 instanceof _BezierCurve2.default) {\n        path.push(outer1.subdivide(0.5, false));\n    } else {\n        path.push(outer1);\n    }\n\n    if (outer2 instanceof _BezierCurve2.default) {\n        path.push(outer2.subdivide(0.5, true));\n    } else {\n        path.push(outer2);\n    }\n\n    if (inner2 instanceof _BezierCurve2.default) {\n        path.push(inner2.subdivide(0.5, true).reverse());\n    } else {\n        path.push(inner2);\n    }\n\n    if (inner1 instanceof _BezierCurve2.default) {\n        path.push(inner1.subdivide(0.5, false).reverse());\n    } else {\n        path.push(inner1);\n    }\n\n    return path;\n};\n\nvar calculateBorderBoxPath = exports.calculateBorderBoxPath = function calculateBorderBoxPath(curves) {\n    return [curves.topLeftOuter, curves.topRightOuter, curves.bottomRightOuter, curves.bottomLeftOuter];\n};\n\nvar calculatePaddingBoxPath = exports.calculatePaddingBoxPath = function calculatePaddingBoxPath(curves) {\n    return [curves.topLeftInner, curves.topRightInner, curves.bottomRightInner, curves.bottomLeftInner];\n};\n\nvar parseBoundCurves = exports.parseBoundCurves = function parseBoundCurves(bounds, borders, borderRadius) {\n    var HALF_WIDTH = bounds.width / 2;\n    var HALF_HEIGHT = bounds.height / 2;\n    var tlh = borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var tlv = borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var trh = borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var trv = borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var brh = borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var brv = borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var blh = borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var blv = borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n\n    var topWidth = bounds.width - trh;\n    var rightHeight = bounds.height - brv;\n    var bottomWidth = bounds.width - brh;\n    var leftHeight = bounds.height - blv;\n\n    return {\n        topLeftOuter: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT) : new _Vector2.default(bounds.left, bounds.top),\n        topLeftInner: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, Math.max(0, tlh - borders[LEFT].borderWidth), Math.max(0, tlv - borders[TOP].borderWidth), CORNER.TOP_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth),\n        topRightOuter: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top),\n        topRightInner: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borders[LEFT].borderWidth), bounds.top + borders[TOP].borderWidth, topWidth > bounds.width + borders[LEFT].borderWidth ? 0 : trh - borders[LEFT].borderWidth, trv - borders[TOP].borderWidth, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + borders[TOP].borderWidth),\n        bottomRightOuter: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top + bounds.height),\n        bottomRightInner: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borders[LEFT].borderWidth), bounds.top + Math.min(rightHeight, bounds.height + borders[TOP].borderWidth), Math.max(0, brh - borders[RIGHT].borderWidth), brv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth),\n        bottomLeftOuter: blh > 0 || blv > 0 ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left, bounds.top + bounds.height),\n        bottomLeftInner: blh > 0 || blv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + leftHeight, Math.max(0, blh - borders[LEFT].borderWidth), blv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth)\n    };\n};\n\nvar CORNER = {\n    TOP_LEFT: 0,\n    TOP_RIGHT: 1,\n    BOTTOM_RIGHT: 2,\n    BOTTOM_LEFT: 3\n};\n\nvar getCurvePoints = function getCurvePoints(x, y, r1, r2, position) {\n    var kappa = 4 * ((Math.sqrt(2) - 1) / 3);\n    var ox = r1 * kappa; // control point offset horizontal\n    var oy = r2 * kappa; // control point offset vertical\n    var xm = x + r1; // x-middle\n    var ym = y + r2; // y-middle\n\n    switch (position) {\n        case CORNER.TOP_LEFT:\n            return new _BezierCurve2.default(new _Vector2.default(x, ym), new _Vector2.default(x, ym - oy), new _Vector2.default(xm - ox, y), new _Vector2.default(xm, y));\n        case CORNER.TOP_RIGHT:\n            return new _BezierCurve2.default(new _Vector2.default(x, y), new _Vector2.default(x + ox, y), new _Vector2.default(xm, ym - oy), new _Vector2.default(xm, ym));\n        case CORNER.BOTTOM_RIGHT:\n            return new _BezierCurve2.default(new _Vector2.default(xm, y), new _Vector2.default(xm, y + oy), new _Vector2.default(x + ox, ym), new _Vector2.default(x, ym));\n        case CORNER.BOTTOM_LEFT:\n        default:\n            return new _BezierCurve2.default(new _Vector2.default(xm, ym), new _Vector2.default(xm - ox, ym), new _Vector2.default(x, y + oy), new _Vector2.default(x, y));\n    }\n};\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(106)('meta');\nvar isObject = __webpack_require__(20);\nvar has = __webpack_require__(57);\nvar setDesc = __webpack_require__(31).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !__webpack_require__(19)(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(23)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(49)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar assign = __webpack_require__(77);\nvar invariant = __webpack_require__(26);\nvar warning = __webpack_require__(248);\nvar PathUtils = __webpack_require__(249);\n\nvar _currentRoute;\n\nvar Route = (function () {\n  _createClass(Route, null, [{\n    key: 'createRoute',\n\n    /**\n     * Creates and returns a new route. Options may be a URL pathname string\n     * with placeholders for named params or an object with any of the following\n     * properties:\n     *\n     * - name                     The name of the route. This is used to lookup a\n     *                            route relative to its parent route and should be\n     *                            unique among all child routes of the same parent\n     * - path                     A URL pathname string with optional placeholders\n     *                            that specify the names of params to extract from\n     *                            the URL when the path matches. Defaults to `/${name}`\n     *                            when there is a name given, or the path of the parent\n     *                            route, or /\n     * - ignoreScrollBehavior     True to make this route (and all descendants) ignore\n     *                            the scroll behavior of the router\n     * - isDefault                True to make this route the default route among all\n     *                            its siblings\n     * - isNotFound               True to make this route the \"not found\" route among\n     *                            all its siblings\n     * - onEnter                  A transition hook that will be called when the\n     *                            router is going to enter this route\n     * - onLeave                  A transition hook that will be called when the\n     *                            router is going to leave this route\n     * - handler                  A React component that will be rendered when\n     *                            this route is active\n     * - parentRoute              The parent route to use for this route. This option\n     *                            is automatically supplied when creating routes inside\n     *                            the callback to another invocation of createRoute. You\n     *                            only ever need to use this when declaring routes\n     *                            independently of one another to manually piece together\n     *                            the route hierarchy\n     *\n     * The callback may be used to structure your route hierarchy. Any call to\n     * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect\n     * inside the callback automatically uses this route as its parent.\n     */\n    value: function createRoute(options, callback) {\n      options = options || {};\n\n      if (typeof options === 'string') options = { path: options };\n\n      var parentRoute = _currentRoute;\n\n      if (parentRoute) {\n        warning(options.parentRoute == null || options.parentRoute === parentRoute, 'You should not use parentRoute with createRoute inside another route\\'s child callback; it is ignored');\n      } else {\n        parentRoute = options.parentRoute;\n      }\n\n      var name = options.name;\n      var path = options.path || name;\n\n      if (path && !(options.isDefault || options.isNotFound)) {\n        if (PathUtils.isAbsolute(path)) {\n          if (parentRoute) {\n            invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, 'You cannot nest path \"%s\" inside \"%s\"; the parent requires URL parameters', path, parentRoute.path);\n          }\n        } else if (parentRoute) {\n          // Relative paths extend their parent.\n          path = PathUtils.join(parentRoute.path, path);\n        } else {\n          path = '/' + path;\n        }\n      } else {\n        path = parentRoute ? parentRoute.path : '/';\n      }\n\n      if (options.isNotFound && !/\\*$/.test(path)) path += '*'; // Auto-append * to the path of not found routes.\n\n      var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler);\n\n      if (parentRoute) {\n        if (route.isDefault) {\n          invariant(parentRoute.defaultRoute == null, '%s may not have more than one default route', parentRoute);\n\n          parentRoute.defaultRoute = route;\n        } else if (route.isNotFound) {\n          invariant(parentRoute.notFoundRoute == null, '%s may not have more than one not found route', parentRoute);\n\n          parentRoute.notFoundRoute = route;\n        }\n\n        parentRoute.appendChild(route);\n      }\n\n      // Any routes created in the callback\n      // use this route as their parent.\n      if (typeof callback === 'function') {\n        var currentRoute = _currentRoute;\n        _currentRoute = route;\n        callback.call(route, route);\n        _currentRoute = currentRoute;\n      }\n\n      return route;\n    }\n\n    /**\n     * Creates and returns a route that is rendered when its parent matches\n     * the current URL.\n     */\n  }, {\n    key: 'createDefaultRoute',\n    value: function createDefaultRoute(options) {\n      return Route.createRoute(assign({}, options, { isDefault: true }));\n    }\n\n    /**\n     * Creates and returns a route that is rendered when its parent matches\n     * the current URL but none of its siblings do.\n     */\n  }, {\n    key: 'createNotFoundRoute',\n    value: function createNotFoundRoute(options) {\n      return Route.createRoute(assign({}, options, { isNotFound: true }));\n    }\n\n    /**\n     * Creates and returns a route that automatically redirects the transition\n     * to another route. In addition to the normal options to createRoute, this\n     * function accepts the following options:\n     *\n     * - from         An alias for the `path` option. Defaults to *\n     * - to           The path/route/route name to redirect to\n     * - params       The params to use in the redirect URL. Defaults\n     *                to using the current params\n     * - query        The query to use in the redirect URL. Defaults\n     *                to using the current query\n     */\n  }, {\n    key: 'createRedirect',\n    value: function createRedirect(options) {\n      return Route.createRoute(assign({}, options, {\n        path: options.path || options.from || '*',\n        onEnter: function onEnter(transition, params, query) {\n          transition.redirect(options.to, options.params || params, options.query || query);\n        }\n      }));\n    }\n  }]);\n\n  function Route(name, path, ignoreScrollBehavior, isDefault, isNotFound, onEnter, onLeave, handler) {\n    _classCallCheck(this, Route);\n\n    this.name = name;\n    this.path = path;\n    this.paramNames = PathUtils.extractParamNames(this.path);\n    this.ignoreScrollBehavior = !!ignoreScrollBehavior;\n    this.isDefault = !!isDefault;\n    this.isNotFound = !!isNotFound;\n    this.onEnter = onEnter;\n    this.onLeave = onLeave;\n    this.handler = handler;\n  }\n\n  /**\n   * Appends the given route to this route's child routes.\n   */\n\n  _createClass(Route, [{\n    key: 'appendChild',\n    value: function appendChild(route) {\n      invariant(route instanceof Route, 'route.appendChild must use a valid Route');\n\n      if (!this.childRoutes) this.childRoutes = [];\n\n      this.childRoutes.push(route);\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      var string = '<Route';\n\n      if (this.name) string += ' name=\"' + this.name + '\"';\n\n      string += ' path=\"' + this.path + '\">';\n\n      return string;\n    }\n  }]);\n\n  return Route;\n})();\n\nmodule.exports = Route;\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * lodash 3.6.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -d -o ./index.js`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '3.6.0';\n\n  /** Used to compose bitmasks for wrapper metadata. */\n  var BIND_FLAG = 1,\n      BIND_KEY_FLAG = 2,\n      CURRY_BOUND_FLAG = 4,\n      CURRY_FLAG = 8,\n      CURRY_RIGHT_FLAG = 16,\n      PARTIAL_FLAG = 32,\n      PARTIAL_RIGHT_FLAG = 64,\n      ARY_FLAG = 128,\n      REARG_FLAG = 256;\n\n  /** Used as default options for `_.trunc`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect when a function becomes hot. */\n  var HOT_COUNT = 150,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_DROP_WHILE_FLAG = 0,\n      LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2;\n\n  /** Used as the `TypeError` message for \"Functions\" methods. */\n  var FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      objectTag = '[object Object]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      weakMapTag = '[object WeakMap]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,\n      reUnescapedHtml = /[&<>\"'`]/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n   */\n  var reComboMarks = /[\\u0300-\\u036f\\ufe20-\\ufe23]/g;\n\n  /**\n   * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect hexadecimal string values. */\n  var reHexPrefix = /^0[xX]/;\n\n  /** Used to detect host constructors (Safari > 5). */\n  var reHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n  var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /**\n   * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).\n   * In addition to special characters the forward slash is escaped to allow for\n   * easier `eval` use and `Function` compilation.\n   */\n  var reRegExpChars = /[.*+?^${}()|[\\]\\/\\\\]/g,\n      reHasRegExpChars = RegExp(reRegExpChars.source);\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to match words to create compound words. */\n  var reWords = (function() {\n    var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n        lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n    return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n  }());\n\n  /** Used to detect and test for whitespace. */\n  var whitespace = (\n    // Basic whitespace characters.\n    ' \\t\\x0b\\f\\xa0\\ufeff' +\n\n    // Line terminators.\n    '\\n\\r\\u2028\\u2029' +\n\n    // Unicode category \"Zs\" space separators.\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',\n    'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',\n    'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    'window'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dateTag] = typedArrayTags[errorTag] =\n  typedArrayTags[funcTag] = typedArrayTags[mapTag] =\n  typedArrayTags[numberTag] = typedArrayTags[objectTag] =\n  typedArrayTags[regexpTag] = typedArrayTags[setTag] =\n  typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\n  cloneableTags[dateTag] = cloneableTags[float32Tag] =\n  cloneableTags[float64Tag] = cloneableTags[int8Tag] =\n  cloneableTags[int16Tag] = cloneableTags[int32Tag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[stringTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[mapTag] = cloneableTags[setTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used as an internal `_.debounce` options object by `_.throttle`. */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used to map latin-1 supplementary letters to basic latin letters. */\n  var deburredLetters = {\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcC': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xeC': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '`': '&#96;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\",\n    '&#96;': '`'\n  };\n\n  /** Used to determine if values are of the language type `Object`. */\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Detect free variable `exports`. */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n  /** Detect free variable `window`. */\n  var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /**\n   * Used as a reference to the global object.\n   *\n   * The `this` value is used if it is the global object to avoid Greasemonkey's\n   * restricted `window` object, otherwise the `window` object is used.\n   */\n  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `compareAscending` which compares values and\n   * sorts them in ascending order without guaranteeing a stable sort.\n   *\n   * @private\n   * @param {*} value The value to compare to `other`.\n   * @param {*} other The value to compare to `value`.\n   * @returns {number} Returns the sort order indicator for `value`.\n   */\n  function baseCompareAscending(value, other) {\n    if (value !== other) {\n      var valIsReflexive = value === value,\n          othIsReflexive = other === other;\n\n      if (value > other || !valIsReflexive || (typeof value == 'undefined' && othIsReflexive)) {\n        return 1;\n      }\n      if (value < other || !othIsReflexive || (typeof other == 'undefined' && valIsReflexive)) {\n        return -1;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromRight) {\n    var length = array.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    if (value !== value) {\n      return indexOfNaN(array, fromIndex);\n    }\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isFunction` without support for environments\n   * with incorrect `typeof` results.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n   */\n  function baseIsFunction(value) {\n    // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n    // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n    return typeof value == 'function' || false;\n  }\n\n  /**\n   * Converts `value` to a string if it is not one. An empty string is returned\n   * for `null` or `undefined` values.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n  function baseToString(value) {\n    if (typeof value == 'string') {\n      return value;\n    }\n    return value == null ? '' : (value + '');\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback for string values.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the code unit of the first character of the string.\n   */\n  function charAtCallback(string) {\n    return string.charCodeAt(0);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the first character not found in `chars`.\n   */\n  function charsLeftIndex(string, chars) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the last character not found in `chars`.\n   */\n  function charsRightIndex(string, chars) {\n    var index = string.length;\n\n    while (index-- && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.sortBy` to compare transformed elements of a collection and stable\n   * sort them in ascending order.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function compareAscending(object, other) {\n    return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);\n  }\n\n  /**\n   * Used by `_.sortByOrder` to compare multiple properties of each element\n   * in a collection and stable sort them in the following order:\n   *\n   * If orders is unspecified, sort in ascending order for all properties.\n   * Otherwise, for each property, sort in ascending order if its corresponding value in\n   * orders is true, and descending order if false.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @param {boolean[]} orders The order to sort by for each property.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function compareMultiple(object, other, orders) {\n    var index = -1,\n        objCriteria = object.criteria,\n        othCriteria = other.criteria,\n        length = objCriteria.length,\n        ordersLength = orders.length;\n\n    while (++index < length) {\n      var result = baseCompareAscending(objCriteria[index], othCriteria[index]);\n      if (result) {\n        if (index >= ordersLength) {\n          return result;\n        }\n        return result * (orders[index] ? 1 : -1);\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to provide the same value for\n    // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n    // for more details.\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See https://code.google.com/p/v8/issues/detail?id=90 for more details.\n    return object.index - other.index;\n  }\n\n  /**\n   * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  function deburrLetter(letter) {\n    return deburredLetters[letter];\n  }\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeHtmlChar(chr) {\n    return htmlEscapes[chr];\n  }\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the index at which the first occurrence of `NaN` is found in `array`.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n   */\n  function indexOfNaN(array, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 0 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var other = array[index];\n      if (other !== other) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Checks if `value` is object-like.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   */\n  function isObjectLike(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n   * character code is whitespace.\n   *\n   * @private\n   * @param {number} charCode The character code to inspect.\n   * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n   */\n  function isSpace(charCode) {\n    return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||\n      (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      if (array[index] === placeholder) {\n        array[index] = PLACEHOLDER;\n        result[++resIndex] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * An implementation of `_.uniq` optimized for sorted arrays without support\n   * for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} [iteratee] The function invoked per iteration.\n   * @returns {Array} Returns the new duplicate-value-free array.\n   */\n  function sortedUniq(array, iteratee) {\n    var seen,\n        index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index],\n          computed = iteratee ? iteratee(value, index, array) : value;\n\n      if (!index || seen !== computed) {\n        seen = computed;\n        result[++resIndex] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the first non-whitespace character.\n   */\n  function trimmedLeftIndex(string) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedRightIndex(string) {\n    var index = string.length;\n\n    while (index-- && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  function unescapeHtmlChar(chr) {\n    return htmlUnescapes[chr];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the given `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utility\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // using `context` to mock `Date#getTime` use in `_.now`\n   * var mock = _.runInContext({\n   *   'Date': function() {\n   *     return { 'getTime': getTimeMock };\n   *   }\n   * });\n   *\n   * // or creating a suped-up `defer` in Node.js\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See https://es5.github.io/#x11.1.5 for more details.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for native method references. */\n    var arrayProto = Array.prototype,\n        objectProto = Object.prototype,\n        stringProto = String.prototype;\n\n    /** Used to detect DOM support. */\n    var document = (document = context.window) && document.document;\n\n    /** Used to resolve the decompiled source of functions. */\n    var fnToString = Function.prototype.toString;\n\n    /** Used to the length of n-tuples for `_.unzip`. */\n    var getLength = baseProperty('length');\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /**\n     * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n     * of values.\n     */\n    var objToString = objectProto.toString;\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = context._;\n\n    /** Used to detect if a method is native. */\n    var reNative = RegExp('^' +\n      escapeRegExp(objToString)\n      .replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Native method references. */\n    var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer,\n        bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,\n        ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        push = arrayProto.push,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        Set = isNative(Set = context.Set) && Set,\n        setTimeout = context.setTimeout,\n        splice = arrayProto.splice,\n        Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array,\n        WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;\n\n    /** Used to clone array buffers. */\n    var Float64Array = (function() {\n      // Safari 5 errors when using an array buffer to initialize a typed array\n      // where the array buffer's `byteLength` is not a multiple of the typed\n      // array's `BYTES_PER_ELEMENT`.\n      try {\n        var func = isNative(func = context.Float64Array) && func,\n            result = new func(new ArrayBuffer(10), 0, 1) && func;\n      } catch(e) {}\n      return result;\n    }());\n\n    /* Native method references for those with the same name as other `lodash` methods. */\n    var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsFinite = context.isFinite,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = isNative(nativeNow = Date.now) && nativeNow,\n        nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used as references for `-Infinity` and `Infinity`. */\n    var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,\n        POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n    /** Used as references for the maximum length and index of an array. */\n    var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,\n        MAX_ARRAY_INDEX =  MAX_ARRAY_LENGTH - 1,\n        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n    /** Used as the size, in bytes, of each `Float64Array` element. */\n    var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;\n\n    /**\n     * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n     * of an array-like value.\n     */\n    var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n     * Methods that operate on and return arrays, collections, and functions can\n     * be chained together. Methods that return a boolean or single value will\n     * automatically end the chain returning the unwrapped value. Explicit chaining\n     * may be enabled using `_.chain`. The execution of chained methods is lazy,\n     * that is, execution is deferred until `_#value` is implicitly or explicitly\n     * called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n     * fusion is an optimization that merges iteratees to avoid creating intermediate\n     * arrays and reduce the number of iteratee executions.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n     * `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n     * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n     * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n     * and `where`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n     * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n     * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`,\n     * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`,\n     * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,\n     * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,\n     * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,\n     * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`, `merge`,\n     * `mixin`, `negate`, `noop`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n     * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n     * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,\n     * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,\n     * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,\n     * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,\n     * `without`, `wrap`, `xor`, `zip`, and `zipObject`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,\n     * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,\n     * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,\n     * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,\n     * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,\n     * `isFinite`,`isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,\n     * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`,\n     * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`,\n     * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`,\n     * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`,\n     * `startCase`, `startsWith`, `sum`, `template`, `trim`, `trimLeft`,\n     * `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`\n     *\n     * The wrapper method `sample` will return a wrapped value when `n` is provided,\n     * otherwise an unwrapped value is returned.\n     *\n     * @name _\n     * @constructor\n     * @category Chain\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, n) {\n     *   return sum + n;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(n) {\n     *   return n * n;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The function whose prototype all chaining wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n     * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n     */\n    function LodashWrapper(value, chainAll, actions) {\n      this.__wrapped__ = value;\n      this.__actions__ = actions || [];\n      this.__chain__ = !!chainAll;\n    }\n\n    /**\n     * An object environment feature flags.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    (function(x) {\n\n      /**\n       * Detect if functions can be decompiled by `Function#toString`\n       * (all but Firefox OS certified apps, older Opera mobile browsers, and\n       * the PlayStation 3; forced `false` for Windows 8 apps).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcDecomp = /\\bthis\\b/.test(function() { return this; });\n\n      /**\n       * Detect if `Function#name` is supported (all but IE).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcNames = typeof Function.name == 'string';\n\n      /**\n       * Detect if the DOM is supported.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      try {\n        support.dom = document.createDocumentFragment().nodeType === 11;\n      } catch(e) {\n        support.dom = false;\n      }\n\n      /**\n       * Detect if `arguments` object indexes are non-enumerable.\n       *\n       * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object\n       * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat\n       * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`\n       * checks for indexes that exceed their function's formal parameters with\n       * associated values of `0`.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      try {\n        support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);\n      } catch(e) {\n        support.nonEnumArgs = true;\n      }\n    }(0, 0));\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB). Change the following template settings to use\n     * alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = null;\n      this.__dir__ = 1;\n      this.__dropCount__ = 0;\n      this.__filtered__ = false;\n      this.__iteratees__ = null;\n      this.__takeCount__ = POSITIVE_INFINITY;\n      this.__views__ = null;\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var actions = this.__actions__,\n          iteratees = this.__iteratees__,\n          views = this.__views__,\n          result = new LazyWrapper(this.__wrapped__);\n\n      result.__actions__ = actions ? arrayCopy(actions) : null;\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = iteratees ? arrayCopy(iteratees) : null;\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = views ? arrayCopy(views) : null;\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value();\n      if (!isArray(array)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var dir = this.__dir__,\n          isRight = dir < 0,\n          view = getView(0, array.length, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          takeCount = nativeMin(length, this.__takeCount__),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees ? iteratees.length : 0,\n          resIndex = 0,\n          result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type;\n\n          if (type == LAZY_DROP_WHILE_FLAG) {\n            if (data.done && (isRight ? (index > data.index) : (index < data.index))) {\n              data.count = 0;\n              data.done = false;\n            }\n            data.index = index;\n            if (!data.done) {\n              var limit = data.limit;\n              if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) {\n                continue outer;\n              }\n            }\n          } else {\n            var computed = iteratee(value);\n            if (type == LAZY_MAP_FLAG) {\n              value = computed;\n            } else if (!computed) {\n              if (type == LAZY_FILTER_FLAG) {\n                continue outer;\n              } else {\n                break outer;\n              }\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a cache object to store key/value pairs.\n     *\n     * @private\n     * @static\n     * @name Cache\n     * @memberOf _.memoize\n     */\n    function MapCache() {\n      this.__data__ = {};\n    }\n\n    /**\n     * Removes `key` and its value from the cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n     */\n    function mapDelete(key) {\n      return this.has(key) && delete this.__data__[key];\n    }\n\n    /**\n     * Gets the cached value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the cached value.\n     */\n    function mapGet(key) {\n      return key == '__proto__' ? undefined : this.__data__[key];\n    }\n\n    /**\n     * Checks if a cached value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapHas(key) {\n      return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n    }\n\n    /**\n     * Adds `value` to `key` of the cache.\n     *\n     * @private\n     * @name set\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to cache.\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache object.\n     */\n    function mapSet(key, value) {\n      if (key != '__proto__') {\n        this.__data__[key] = value;\n      }\n      return this;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates a cache object to store unique values.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var length = values ? values.length : 0;\n\n      this.data = { 'hash': nativeCreate(null), 'set': new Set };\n      while (length--) {\n        this.push(values[length]);\n      }\n    }\n\n    /**\n     * Checks if `value` is in `cache` mimicking the return signature of\n     * `_.indexOf` by returning `0` if the value is found, else `-1`.\n     *\n     * @private\n     * @param {Object} cache The cache to search.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `0` if `value` is found, else `-1`.\n     */\n    function cacheIndexOf(cache, value) {\n      var data = cache.data,\n          result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];\n\n      return result ? 0 : -1;\n    }\n\n    /**\n     * Adds `value` to the cache.\n     *\n     * @private\n     * @name push\n     * @memberOf SetCache\n     * @param {*} value The value to cache.\n     */\n    function cachePush(value) {\n      var data = this.data;\n      if (typeof value == 'string' || isObject(value)) {\n        data.set.add(value);\n      } else {\n        data.hash[value] = true;\n      }\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayCopy(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.forEach` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayEach(array, iteratee) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (iteratee(array[index], index, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.forEachRight` for arrays without support for\n     * callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayEachRight(array, iteratee) {\n      var length = array.length;\n\n      while (length--) {\n        if (iteratee(array[length], length, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.every` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     */\n    function arrayEvery(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (!predicate(array[index], index, array)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * A specialized version of `_.filter` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function arrayFilter(array, predicate) {\n      var index = -1,\n          length = array.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.map` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function arrayMap(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = iteratee(array[index], index, array);\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.max` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     */\n    function arrayMax(array) {\n      var index = -1,\n          length = array.length,\n          result = NEGATIVE_INFINITY;\n\n      while (++index < length) {\n        var value = array[index];\n        if (value > result) {\n          result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.min` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     */\n    function arrayMin(array) {\n      var index = -1,\n          length = array.length,\n          result = POSITIVE_INFINITY;\n\n      while (++index < length) {\n        var value = array[index];\n        if (value < result) {\n          result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.reduce` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the first element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduce(array, iteratee, accumulator, initFromArray) {\n      var index = -1,\n          length = array.length;\n\n      if (initFromArray && length) {\n        accumulator = array[++index];\n      }\n      while (++index < length) {\n        accumulator = iteratee(accumulator, array[index], index, array);\n      }\n      return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.reduceRight` for arrays without support for\n     * callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the last element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n      var length = array.length;\n      if (initFromArray && length) {\n        accumulator = array[--length];\n      }\n      while (length--) {\n        accumulator = iteratee(accumulator, array[length], length, array);\n      }\n      return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.some` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function arraySome(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (predicate(array[index], index, array)) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `_.sum` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     */\n    function arraySum(array) {\n      var length = array.length,\n          result = 0;\n\n      while (length--) {\n        result += +array[length] || 0;\n      }\n      return result;\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assign` use.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignDefaults(objectValue, sourceValue) {\n      return typeof objectValue == 'undefined' ? sourceValue : objectValue;\n    }\n\n    /**\n     * Used by `_.template` to customize its `_.assign` use.\n     *\n     * **Note:** This method is like `assignDefaults` except that it ignores\n     * inherited property values when checking if a property is `undefined`.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @param {string} key The key associated with the object and source values.\n     * @param {Object} object The destination object.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignOwnDefaults(objectValue, sourceValue, key, object) {\n      return (typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key))\n        ? sourceValue\n        : objectValue;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @returns {Object} Returns the destination object.\n     */\n    function baseAssign(object, source, customizer) {\n      var props = keys(source);\n      if (!customizer) {\n        return baseCopy(source, object, props);\n      }\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key],\n            result = customizer(value, source[key], key, object, source);\n\n        if ((result === result ? (result !== value) : (value === value)) ||\n            (typeof value == 'undefined' && !(key in object))) {\n          object[key] = result;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.at` without support for strings and individual\n     * key arguments.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {number[]|string[]} [props] The property names or indexes of elements to pick.\n     * @returns {Array} Returns the new array of picked elements.\n     */\n    function baseAt(collection, props) {\n      var index = -1,\n          length = collection.length,\n          isArr = isLength(length),\n          propsLength = props.length,\n          result = Array(propsLength);\n\n      while(++index < propsLength) {\n        var key = props[index];\n        if (isArr) {\n          key = parseFloat(key);\n          result[index] = isIndex(key, length) ? collection[key] : undefined;\n        } else {\n          result[index] = collection[key];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Array} props The property names to copy.\n     * @returns {Object} Returns `object`.\n     */\n    function baseCopy(source, object, props) {\n      if (!props) {\n        props = object;\n        object = {};\n      }\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n        object[key] = source[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.callback` which supports specifying the\n     * number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function baseCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (type == 'function') {\n        return typeof thisArg == 'undefined'\n          ? func\n          : bindCallback(func, thisArg, argCount);\n      }\n      if (func == null) {\n        return identity;\n      }\n      if (type == 'object') {\n        return baseMatches(func);\n      }\n      return typeof thisArg == 'undefined'\n        ? baseProperty(func + '')\n        : baseMatchesProperty(func + '', thisArg);\n    }\n\n    /**\n     * The base implementation of `_.clone` without support for argument juggling\n     * and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The object `value` belongs to.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n      var result;\n      if (customizer) {\n        result = object ? customizer(value, key, object) : customizer(value);\n      }\n      if (typeof result != 'undefined') {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return arrayCopy(value, result);\n        }\n      } else {\n        var tag = objToString.call(value),\n            isFunc = tag == funcTag;\n\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = initCloneObject(isFunc ? {} : value);\n          if (!isDeep) {\n            return baseCopy(value, result, keys(value));\n          }\n        } else {\n          return cloneableTags[tag]\n            ? initCloneByTag(value, tag, isDeep)\n            : (object ? value : {});\n        }\n      }\n      // Check for circular references and return corresponding clone.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == value) {\n          return stackB[length];\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate it with its clone.\n      stackA.push(value);\n      stackB.push(result);\n\n      // Recursively populate clone (susceptible to call stack limits).\n      (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n        result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function Object() {}\n      return function(prototype) {\n        if (isObject(prototype)) {\n          Object.prototype = prototype;\n          var result = new Object;\n          Object.prototype = null;\n        }\n        return result || context.Object();\n      };\n    }());\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts an index\n     * of where to slice the arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Object} args The arguments provide to `func`.\n     * @returns {number} Returns the timer id.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of `_.difference` which accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var length = array ? array.length : 0,\n          result = [];\n\n      if (!length) {\n        return result;\n      }\n      var index = -1,\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf,\n          cache = (isCommon && values.length >= 200) ? createCache(values) : null,\n          valuesLength = values.length;\n\n      if (cache) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n        values = cache;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index];\n\n        if (isCommon && value === value) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === value) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (indexOf(values, value, 0) < 0) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : (end >>> 0);\n      start >>>= 0;\n\n      while (start < length) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n     * without support for callback shorthands and `this` binding, which iterates\n     * over `collection` using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @param {boolean} [retKey] Specify returning the key of the found element\n     *  instead of the element itself.\n     * @returns {*} Returns the found element or its key, else `undefined`.\n     */\n    function baseFind(collection, predicate, eachFunc, retKey) {\n      var result;\n      eachFunc(collection, function(value, key, collection) {\n        if (predicate(value, key, collection)) {\n          result = retKey ? key : value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with added support for restricting\n     * flattening and specifying the start index.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} isDeep Specify a deep flatten.\n     * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, isDeep, isStrict) {\n      var index = -1,\n          length = array.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {\n          if (isDeep) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            value = baseFlatten(value, isDeep, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[++resIndex] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForIn` and `baseForOwn` which iterates\n     * over `object` properties returned by `keysFunc` invoking `iteratee` for\n     * each property. Iterator functions may exit iteration early by explicitly\n     * returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forIn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForIn(object, iteratee) {\n      return baseFor(object, iteratee, keysIn);\n    }\n\n    /**\n     * The base implementation of `_.forOwn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from those provided.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the new array of filtered property names.\n     */\n    function baseFunctions(object, props) {\n      var index = -1,\n          length = props.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var key = props[index];\n        if (isFunction(object[key])) {\n          result[++resIndex] = key;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` without support for `this` binding\n     * `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n      // Exit early for identical values.\n      if (value === other) {\n        // Treat `+0` vs. `-0` as not equal.\n        return value !== 0 || (1 / value == 1 / other);\n      }\n      var valType = typeof value,\n          othType = typeof other;\n\n      // Exit early for unlike primitive values.\n      if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||\n          value == null || other == null) {\n        // Return `false` unless both values are `NaN`.\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = arrayTag,\n          othTag = arrayTag;\n\n      if (!objIsArr) {\n        objTag = objToString.call(object);\n        if (objTag == argsTag) {\n          objTag = objectTag;\n        } else if (objTag != objectTag) {\n          objIsArr = isTypedArray(object);\n        }\n      }\n      if (!othIsArr) {\n        othTag = objToString.call(other);\n        if (othTag == argsTag) {\n          othTag = objectTag;\n        } else if (othTag != objectTag) {\n          othIsArr = isTypedArray(other);\n        }\n      }\n      var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)),\n          othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)),\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && !(objIsArr || objIsObj)) {\n        return equalByTag(object, other, objTag);\n      }\n      if (isLoose) {\n        if (!isSameTag && !(objIsObj && othIsObj)) {\n          return false;\n        }\n      } else {\n        var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (valWrapped || othWrapped) {\n          return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n        }\n        if (!isSameTag) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      // For more information on detecting circular references see https://es5.github.io/#JO.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == object) {\n          return stackB[length] == other;\n        }\n      }\n      // Add `object` and `other` to the stack of traversed objects.\n      stackA.push(object);\n      stackB.push(other);\n\n      var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n      stackA.pop();\n      stackB.pop();\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The source property names to match.\n     * @param {Array} values The source values to match.\n     * @param {Array} strictCompareFlags Strict comparison flags for source values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, props, values, strictCompareFlags, customizer) {\n      var index = -1,\n          length = props.length,\n          noCustomizer = !customizer;\n\n      while (++index < length) {\n        if ((noCustomizer && strictCompareFlags[index])\n              ? values[index] !== object[props[index]]\n              : !(props[index] in object)\n            ) {\n          return false;\n        }\n      }\n      index = -1;\n      while (++index < length) {\n        var key = props[index],\n            objValue = object[key],\n            srcValue = values[index];\n\n        if (noCustomizer && strictCompareFlags[index]) {\n          var result = typeof objValue != 'undefined' || (key in object);\n        } else {\n          result = customizer ? customizer(objValue, srcValue, key) : undefined;\n          if (typeof result == 'undefined') {\n            result = baseIsEqual(srcValue, objValue, customizer, true);\n          }\n        }\n        if (!result) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var result = [];\n      baseEach(collection, function(value, key, collection) {\n        result.push(iteratee(value, key, collection));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which does not clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatches(source) {\n      var props = keys(source),\n          length = props.length;\n\n      if (!length) {\n        return constant(true);\n      }\n      if (length == 1) {\n        var key = props[0],\n            value = source[key];\n\n        if (isStrictComparable(value)) {\n          return function(object) {\n            return object != null && object[key] === value &&\n              (typeof value != 'undefined' || (key in toObject(object)));\n          };\n        }\n      }\n      var values = Array(length),\n          strictCompareFlags = Array(length);\n\n      while (length--) {\n        value = source[props[length]];\n        values[length] = value;\n        strictCompareFlags[length] = isStrictComparable(value);\n      }\n      return function(object) {\n        return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which does not coerce `key`\n     * to a string.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} value The value to compare.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatchesProperty(key, value) {\n      if (isStrictComparable(value)) {\n        return function(object) {\n          return object != null && object[key] === value &&\n            (typeof value != 'undefined' || (key in toObject(object)));\n        };\n      }\n      return function(object) {\n        return object != null && baseIsEqual(value, object[key], null, true);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {Object} Returns the destination object.\n     */\n    function baseMerge(object, source, customizer, stackA, stackB) {\n      if (!isObject(object)) {\n        return object;\n      }\n      var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));\n      (isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) {\n        if (isObjectLike(srcValue)) {\n          stackA || (stackA = []);\n          stackB || (stackB = []);\n          return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n        }\n        var value = object[key],\n            result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n            isCommon = typeof result == 'undefined';\n\n        if (isCommon) {\n          result = srcValue;\n        }\n        if ((isSrcArr || typeof result != 'undefined') &&\n            (isCommon || (result === result ? (result !== value) : (value === value)))) {\n          object[key] = result;\n        }\n      });\n      return object;\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n      var length = stackA.length,\n          srcValue = source[key];\n\n      while (length--) {\n        if (stackA[length] == srcValue) {\n          object[key] = stackB[length];\n          return;\n        }\n      }\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = typeof result == 'undefined';\n\n      if (isCommon) {\n        result = srcValue;\n        if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {\n          result = isArray(value)\n            ? value\n            : ((value && value.length) ? arrayCopy(value) : []);\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          result = isArguments(value)\n            ? toPlainObject(value)\n            : (isPlainObject(value) ? value : {});\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate\n      // it with its merged value.\n      stackA.push(srcValue);\n      stackB.push(result);\n\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n      } else if (result === result ? (result !== value) : (value === value)) {\n        object[key] = result;\n      }\n    }\n\n    /**\n     * The base implementation of `_.property` which does not coerce `key` to a string.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     */\n    function baseProperty(key) {\n      return function(object) {\n        return object == null ? undefined : object[key];\n      };\n    }\n\n    /**\n     * The base implementation of `_.random` without support for argument juggling\n     * and returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.reduce` and `_.reduceRight` without support\n     * for callback shorthands and `this` binding, which iterates over `collection`\n     * using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} accumulator The initial value.\n     * @param {boolean} initFromCollection Specify using the first or last element\n     *  of `collection` as the initial value.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @returns {*} Returns the accumulated value.\n     */\n    function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n      eachFunc(collection, function(value, index, collection) {\n        accumulator = initFromCollection\n          ? (initFromCollection = false, value)\n          : iteratee(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop detection.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortBy` which uses `comparer` to define\n     * the sort order of `array` and replaces criteria objects with their\n     * corresponding values.\n     *\n     * @private\n     * @param {Array} array The array to sort.\n     * @param {Function} comparer The function to define sort order.\n     * @returns {Array} Returns `array`.\n     */\n    function baseSortBy(array, comparer) {\n      var length = array.length;\n\n      array.sort(comparer);\n      while (length--) {\n        array[length] = array[length].value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.sortByOrder` without param guards.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string[]} props The property names to sort by.\n     * @param {boolean[]} orders The sort orders of `props`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseSortByOrder(collection, props, orders) {\n      var index = -1,\n          length = collection.length,\n          result = isLength(length) ? Array(length) : [];\n\n      baseEach(collection, function(value) {\n        var length = props.length,\n            criteria = Array(length);\n\n        while (length--) {\n          criteria[length] = value == null ? undefined : value[props[length]];\n        }\n        result[++index] = { 'criteria': criteria, 'index': index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.sum` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {number} Returns the sum.\n     */\n    function baseSum(collection, iteratee) {\n      var result = 0;\n      baseEach(collection, function(value, index, collection) {\n        result += +iteratee(value, index, collection) || 0;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The function invoked per iteration.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     */\n    function baseUniq(array, iteratee) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array.length,\n          isCommon = indexOf == baseIndexOf,\n          isLarge = isCommon && length >= 200,\n          seen = isLarge ? createCache() : null,\n          result = [];\n\n      if (seen) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n      } else {\n        isLarge = false;\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value, index, array) : value;\n\n        if (isCommon && value === value) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (indexOf(seen, computed, 0) < 0) {\n          if (iteratee || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.values` and `_.valuesIn` which creates an\n     * array of `object` property values corresponding to the property names\n     * returned by `keysFunc`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} props The property names to get values for.\n     * @returns {Object} Returns the array of property values.\n     */\n    function baseValues(object, props) {\n      var index = -1,\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,\n     * and `_.takeWhile` without support for callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to peform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      var index = -1,\n          length = actions.length;\n\n      while (++index < length) {\n        var args = [result],\n            action = actions[index];\n\n        push.apply(args, action.args);\n        result = action.func.apply(action.thisArg, args);\n      }\n      return result;\n    }\n\n    /**\n     * Performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndex(array, value, retHighest) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (retHighest ? (computed <= value) : (computed < value)) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return binaryIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * This function is like `binaryIndex` except that it invokes `iteratee` for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array ? array.length : 0,\n          valIsNaN = value !== value,\n          valIsUndef = typeof value == 'undefined';\n\n      while (low < high) {\n        var mid = floor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            isReflexive = computed === computed;\n\n        if (valIsNaN) {\n          var setLow = isReflexive || retHighest;\n        } else if (valIsUndef) {\n          setLow = isReflexive && (retHighest || typeof computed != 'undefined');\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * A specialized version of `baseCallback` which only supports `this` binding\n     * and specifying the number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function bindCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      if (typeof thisArg == 'undefined') {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n        case 5: return function(value, other, key, object, source) {\n          return func.call(thisArg, value, other, key, object, source);\n        };\n      }\n      return function() {\n        return func.apply(thisArg, arguments);\n      };\n    }\n\n    /**\n     * Creates a clone of the given array buffer.\n     *\n     * @private\n     * @param {ArrayBuffer} buffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function bufferClone(buffer) {\n      return bufferSlice.call(buffer, 0);\n    }\n    if (!bufferSlice) {\n      // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.\n      bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {\n        var byteLength = buffer.byteLength,\n            floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,\n            offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,\n            result = new ArrayBuffer(byteLength);\n\n        if (floatLength) {\n          var view = new Float64Array(result, 0, floatLength);\n          view.set(new Float64Array(buffer, 0, floatLength));\n        }\n        if (byteLength != offset) {\n          view = new Uint8Array(result, offset);\n          view.set(new Uint8Array(buffer, offset));\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders) {\n      var holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          leftIndex = -1,\n          leftLength = partials.length,\n          result = Array(argsLength + leftLength);\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        result[holders[argsIndex]] = args[argsIndex];\n      }\n      while (argsLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders) {\n      var holdersIndex = -1,\n          holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          rightIndex = -1,\n          rightLength = partials.length,\n          result = Array(argsLength + rightLength);\n\n      while (++argsIndex < argsLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var pad = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[pad + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        result[pad + holders[holdersIndex]] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an accumulator\n     * object composed from the results of running each element in the collection\n     * through an iteratee.\n     *\n     * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,\n     * and `_.partition`.\n     *\n     * @private\n     * @param {Function} setter The function to set keys and values of the accumulator object.\n     * @param {Function} [initializer] The function to initialize the accumulator object.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee, thisArg) {\n        var result = initializer ? initializer() : {};\n        iteratee = getCallback(iteratee, thisArg, 3);\n\n        if (isArray(collection)) {\n          var index = -1,\n              length = collection.length;\n\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, iteratee(value, index, collection), collection);\n          }\n        } else {\n          baseEach(collection, function(value, key, collection) {\n            setter(result, value, iteratee(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that assigns properties of source object(s) to a given\n     * destination object.\n     *\n     * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return function() {\n        var args = arguments,\n            length = args.length,\n            object = args[0];\n\n        if (length < 2 || object == null) {\n          return object;\n        }\n        var customizer = args[length - 2],\n            thisArg = args[length - 1],\n            guard = args[3];\n\n        if (length > 3 && typeof customizer == 'function') {\n          customizer = bindCallback(customizer, thisArg, 5);\n          length -= 2;\n        } else {\n          customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null;\n          length -= (customizer ? 1 : 0);\n        }\n        if (guard && isIterateeCall(args[1], args[2], guard)) {\n          customizer = length == 3 ? null : customizer;\n          length = 2;\n        }\n        var index = 0;\n        while (++index < length) {\n          var source = args[index];\n          if (source) {\n            assigner(object, source, customizer);\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        var length = collection ? collection.length : 0;\n        if (!isLength(length)) {\n          return eachFunc(collection, iteratee);\n        }\n        var index = fromRight ? length : -1,\n            iterable = toObject(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var iterable = toObject(object),\n            props = keysFunc(object),\n            length = props.length,\n            index = fromRight ? length : -1;\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var key = props[index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createBindWrapper(func, thisArg) {\n      var Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(thisArg, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `Set` cache object to optimize linear searches of large arrays.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n     */\n    var createCache = !(nativeCreate && Set) ? constant(null) : function(values) {\n      return new SetCache(values);\n    };\n\n    /**\n     * Creates a function that produces compound words out of the words in a\n     * given string.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        var index = -1,\n            array = words(deburr(string)),\n            length = array.length,\n            result = '';\n\n        while (++index < length) {\n          result = callback(result, array[index], index);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtorWrapper(Ctor) {\n      return function() {\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, arguments);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a `_.curry` or `_.curryRight` function.\n     *\n     * @private\n     * @param {boolean} flag The curry bit flag.\n     * @returns {Function} Returns the new curry function.\n     */\n    function createCurry(flag) {\n      function curryFunc(func, arity, guard) {\n        if (guard && isIterateeCall(func, arity, guard)) {\n          arity = null;\n        }\n        var result = createWrapper(func, flag, null, null, null, null, null, arity);\n        result.placeholder = curryFunc.placeholder;\n        return result;\n      }\n      return curryFunc;\n    }\n\n    /**\n     * Creates a `_.max` or `_.min` function.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to get the extremum value from an array.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,\n     *  extremum value.\n     * @returns {Function} Returns the new extremum function.\n     */\n    function createExtremum(arrayFunc, isMin) {\n      return function(collection, iteratee, thisArg) {\n        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n          iteratee = null;\n        }\n        var func = getCallback(),\n            noIteratee = iteratee == null;\n\n        if (!(func === baseCallback && noIteratee)) {\n          noIteratee = false;\n          iteratee = func(iteratee, thisArg, 3);\n        }\n        if (noIteratee) {\n          var isArr = isArray(collection);\n          if (!isArr && isString(collection)) {\n            iteratee = charAtCallback;\n          } else {\n            return arrayFunc(isArr ? collection : toIterable(collection));\n          }\n        }\n        return extremumBy(collection, iteratee, isMin);\n      };\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(eachFunc, fromRight) {\n      return function(collection, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        if (isArray(collection)) {\n          var index = baseFindIndex(collection, predicate, fromRight);\n          return index > -1 ? collection[index] : undefined;\n        }\n        return baseFind(collection, predicate, eachFunc);\n      }\n    }\n\n    /**\n     * Creates a `_.findIndex` or `_.findLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindIndex(fromRight) {\n      return function(array, predicate, thisArg) {\n        if (!(array && array.length)) {\n          return -1;\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFindIndex(array, predicate, fromRight);\n      };\n    }\n\n    /**\n     * Creates a `_.findKey` or `_.findLastKey` function.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindKey(objectFunc) {\n      return function(object, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(object, predicate, objectFunc, true);\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return function() {\n        var length = arguments.length;\n        if (!length) {\n          return function() { return arguments[0]; };\n        }\n        var wrapper,\n            index = fromRight ? length : -1,\n            leftIndex = 0,\n            funcs = Array(length);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var func = funcs[leftIndex++] = arguments[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          var funcName = wrapper ? '' : getFuncName(func);\n          wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;\n        }\n        index = wrapper ? -1 : length;\n        while (++index < length) {\n          func = funcs[index];\n          funcName = getFuncName(func);\n\n          var data = funcName == 'wrapper' ? getData(func) : null;\n          if (data && isLaziable(data[0])) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments;\n          if (wrapper && args.length == 1 && isArray(args[0])) {\n            return wrapper.plant(args[0]).value();\n          }\n          var index = 0,\n              result = funcs[index].apply(this, args);\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      };\n    }\n\n    /**\n     * Creates a function for `_.forEach` or `_.forEachRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForEach(arrayFunc, eachFunc) {\n      return function(collection, iteratee, thisArg) {\n        return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))\n          ? arrayFunc(collection, iteratee)\n          : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n      };\n    }\n\n    /**\n     * Creates a function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForIn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee, keysIn);\n      };\n    }\n\n    /**\n     * Creates a function for `_.forOwn` or `_.forOwnRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForOwn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee);\n      };\n    }\n\n    /**\n     * Creates a function for `_.padLeft` or `_.padRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify padding from the right.\n     * @returns {Function} Returns the new pad function.\n     */\n    function createPadDir(fromRight) {\n      return function(string, length, chars) {\n        string = baseToString(string);\n        return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));\n      };\n    }\n\n    /**\n     * Creates a `_.partial` or `_.partialRight` function.\n     *\n     * @private\n     * @param {boolean} flag The partial bit flag.\n     * @returns {Function} Returns the new partial function.\n     */\n    function createPartial(flag) {\n      var partialFunc = restParam(function(func, partials) {\n        var holders = replaceHolders(partials, partialFunc.placeholder);\n        return createWrapper(func, flag, null, partials, holders);\n      });\n      return partialFunc;\n    }\n\n    /**\n     * Creates a function for `_.reduce` or `_.reduceRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createReduce(arrayFunc, eachFunc) {\n      return function(collection, iteratee, accumulator, thisArg) {\n        var initFromArray = arguments.length < 3;\n        return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))\n          ? arrayFunc(collection, iteratee, accumulator, initFromArray)\n          : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with optional `this`\n     * binding of, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & ARY_FLAG,\n          isBind = bitmask & BIND_FLAG,\n          isBindKey = bitmask & BIND_KEY_FLAG,\n          isCurry = bitmask & CURRY_FLAG,\n          isCurryBound = bitmask & CURRY_BOUND_FLAG,\n          isCurryRight = bitmask & CURRY_RIGHT_FLAG;\n\n      var Ctor = !isBindKey && createCtorWrapper(func),\n          key = func;\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it to other functions.\n        var length = arguments.length,\n            index = length,\n            args = Array(length);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight);\n        }\n        if (isCurry || isCurryRight) {\n          var placeholder = wrapper.placeholder,\n              argsHolders = replaceHolders(args, placeholder);\n\n          length -= argsHolders.length;\n          if (length < arity) {\n            var newArgPos = argPos ? arrayCopy(argPos) : null,\n                newArity = nativeMax(arity - length, 0),\n                newsHolders = isCurry ? argsHolders : null,\n                newHoldersRight = isCurry ? null : argsHolders,\n                newPartials = isCurry ? args : null,\n                newPartialsRight = isCurry ? null : args;\n\n            bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n            bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n            if (!isCurryBound) {\n              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n            }\n            var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n                result = createHybridWrapper.apply(undefined, newData);\n\n            if (isLaziable(func)) {\n              setData(result, newData);\n            }\n            result.placeholder = placeholder;\n            return result;\n          }\n        }\n        var thisBinding = isBind ? thisArg : this;\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (argPos) {\n          args = reorder(args, argPos);\n        }\n        if (isAry && ary < args.length) {\n          args.length = ary;\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func;\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates the padding required for `string` based on the given `length`.\n     * The `chars` string is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {string} string The string to create padding for.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the pad for `string`.\n     */\n    function createPadding(string, length, chars) {\n      var strLength = string.length;\n      length = +length;\n\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return '';\n      }\n      var padLength = length - strLength;\n      chars = chars == null ? ' ' : (chars + '');\n      return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the optional `this`\n     * binding of `thisArg` and the `partials` prepended to those provided to\n     * the wrapper.\n     *\n     * @private\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to the new function.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createPartialWrapper(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & BIND_FLAG,\n          Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it `func`.\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(argsLength + leftLength);\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {Function} Returns the new index function.\n     */\n    function createSortedIndex(retHighest) {\n      return function(array, value, iteratee, thisArg) {\n        var func = getCallback(iteratee);\n        return (func === baseCallback && iteratee == null)\n          ? binaryIndex(array, value, retHighest)\n          : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags.\n     *  The bitmask may be composed of the following flags:\n     *     1 - `_.bind`\n     *     2 - `_.bindKey`\n     *     4 - `_.curry` or `_.curryRight` of a bound function\n     *     8 - `_.curry`\n     *    16 - `_.curryRight`\n     *    32 - `_.partial`\n     *    64 - `_.partialRight`\n     *   128 - `_.rearg`\n     *   256 - `_.ary`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n        partials = holders = null;\n      }\n      length -= (holders ? holders.length : 0);\n      if (bitmask & PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = null;\n      }\n      var data = isBindKey ? null : getData(func),\n          newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n      if (data) {\n        mergeData(newData, data);\n        bitmask = newData[1];\n        arity = newData[9];\n      }\n      newData[9] = arity == null\n        ? (isBindKey ? 0 : func.length)\n        : (nativeMax(arity - length, 0) || 0);\n\n      if (bitmask == BIND_FLAG) {\n        var result = createBindWrapper(newData[0], newData[2]);\n      } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n        result = createPartialWrapper.apply(undefined, newData);\n      } else {\n        result = createHybridWrapper.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setter(result, newData);\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing arrays.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var index = -1,\n          arrLength = array.length,\n          othLength = other.length,\n          result = true;\n\n      if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n        return false;\n      }\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (result && ++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        result = undefined;\n        if (customizer) {\n          result = isLoose\n            ? customizer(othValue, arrValue, index)\n            : customizer(arrValue, othValue, index);\n        }\n        if (typeof result == 'undefined') {\n          // Recursively compare arrays (susceptible to call stack limits).\n          if (isLoose) {\n            var othIndex = othLength;\n            while (othIndex--) {\n              othValue = other[othIndex];\n              result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n              if (result) {\n                break;\n              }\n            }\n          } else {\n            result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n          }\n        }\n      }\n      return !!result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} value The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag) {\n      switch (tag) {\n        case boolTag:\n        case dateTag:\n          // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n          return +object == +other;\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case numberTag:\n          // Treat `NaN` vs. `NaN` as equal.\n          return (object != +object)\n            ? other != +other\n            // But, treat `-0` vs. `+0` as not equal.\n            : (object == 0 ? ((1 / object) == (1 / other)) : object == +other);\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings primitives and string\n          // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n          return object == (other + '');\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objProps = keys(object),\n          objLength = objProps.length,\n          othProps = keys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isLoose) {\n        return false;\n      }\n      var skipCtor = isLoose,\n          index = -1;\n\n      while (++index < objLength) {\n        var key = objProps[index],\n            result = isLoose ? key in other : hasOwnProperty.call(other, key);\n\n        if (result) {\n          var objValue = object[key],\n              othValue = other[key];\n\n          result = undefined;\n          if (customizer) {\n            result = isLoose\n              ? customizer(othValue, objValue, key)\n              : customizer(objValue, othValue, key);\n          }\n          if (typeof result == 'undefined') {\n            // Recursively compare objects (susceptible to call stack limits).\n            result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);\n          }\n        }\n        if (!result) {\n          return false;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (!skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Gets the extremum value of `collection` invoking `iteratee` for each value\n     * in `collection` to generate the criterion by which the value is ranked.\n     * The `iteratee` is invoked with three arguments: (value, index, collection).\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the\n     *  maximum, extremum value.\n     * @returns {*} Returns the extremum value.\n     */\n    function extremumBy(collection, iteratee, isMin) {\n      var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,\n          computed = exValue,\n          result = computed;\n\n      baseEach(collection, function(value, index, collection) {\n        var current = iteratee(value, index, collection);\n        if ((isMin ? (current < computed) : (current > computed)) ||\n            (current === exValue && current === result)) {\n          computed = current;\n          result = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Gets the appropriate \"callback\" function. If the `_.callback` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseCallback` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getCallback(func, thisArg, argCount) {\n      var result = lodash.callback || callback;\n      result = result === callback ? baseCallback : result;\n      return argCount ? result(func, thisArg, argCount) : result;\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    var getFuncName = (function() {\n      if (!support.funcNames) {\n        return constant('');\n      }\n      if (constant.name == 'constant') {\n        return baseProperty('name');\n      }\n      return function(func) {\n        var result = func.name,\n            array = realNames[result],\n            length = array ? array.length : 0;\n\n        while (length--) {\n          var data = array[length],\n              otherFunc = data.func;\n\n          if (otherFunc == null || otherFunc == func) {\n            return data.name;\n          }\n        }\n        return result;\n      };\n    }());\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseIndexOf` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function|number} Returns the chosen function or its result.\n     */\n    function getIndexOf(collection, target, fromIndex) {\n      var result = lodash.indexOf || indexOf;\n      result = result === indexOf ? baseIndexOf : result;\n      return collection ? result(collection, target, fromIndex) : result;\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} [transforms] The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms ? transforms.length : 0;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add array properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      var Ctor = object.constructor;\n      if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n        Ctor = Object;\n      }\n      return new Ctor;\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return bufferClone(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          var buffer = object.buffer;\n          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          var result = new Ctor(object.source, reFlags.exec(object));\n          result.lastIndex = object.lastIndex;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      value = +value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n      return value > -1 && value % 1 == 0 && value < length;\n    }\n\n    /**\n     * Checks if the provided arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number') {\n        var length = object.length,\n            prereq = isLength(length) && isIndex(index, length);\n      } else {\n        prereq = type == 'string' && index in object;\n      }\n      if (prereq) {\n        var other = object[index];\n        return value === value ? (value === other) : (other !== other);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func);\n      return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     */\n    function isLength(value) {\n      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers required to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n     * augment function arguments, making the order in which they are executed important,\n     * preventing the merging of metadata. However, we make an exception for a safe\n     * common case where curried functions have `_.ary` and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < ARY_FLAG;\n\n      var isCombo =\n        (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n        (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n        (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = arrayCopy(value);\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * A specialized version of `_.pick` that picks `object` properties specified\n     * by the `props` array.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} props The property names to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByArray(object, props) {\n      object = toObject(object);\n\n      var index = -1,\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        if (key in object) {\n          result[key] = object[key];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.pick` that picks `object` properties `predicate`\n     * returns truthy for.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByCallback(object, predicate) {\n      var result = {};\n      baseForIn(object, function(value, key, object) {\n        if (predicate(value, key, object)) {\n          result[key] = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = arrayCopy(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity function\n     * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = (function() {\n      var count = 0,\n          lastCalled = 0;\n\n      return function(key, value) {\n        var stamp = now(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return key;\n          }\n        } else {\n          count = 0;\n        }\n        return baseSetData(key, value);\n      };\n    }());\n\n    /**\n     * A fallback implementation of `_.isPlainObject` which checks if `value`\n     * is an object created by the `Object` constructor or has a `[[Prototype]]`\n     * of `null`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var Ctor,\n          support = lodash.support;\n\n      // Exit early for non `Object` objects.\n      if (!(isObjectLike(value) && objToString.call(value) == objectTag) ||\n          (!hasOwnProperty.call(value, 'constructor') &&\n            (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n        return false;\n      }\n      // IE < 9 iterates inherited properties before own properties. If the first\n      // iterated property is an object's own property then there are no inherited\n      // enumerable properties.\n      var result;\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      baseForIn(value, function(subValue, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * A fallback implementation of `Object.keys` which creates an array of the\n     * own enumerable property names of `object`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     */\n    function shimKeys(object) {\n      var props = keysIn(object),\n          propsLength = props.length,\n          length = propsLength && object.length,\n          support = lodash.support;\n\n      var allowIndexes = length && isLength(length) &&\n        (isArray(object) || (support.nonEnumArgs && isArguments(object)));\n\n      var index = -1,\n          result = [];\n\n      while (++index < propsLength) {\n        var key = props[index];\n        if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to an array-like object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Array|Object} Returns the array-like object.\n     */\n    function toIterable(value) {\n      if (value == null) {\n        return [];\n      }\n      if (!isLength(value.length)) {\n        return values(value);\n      }\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Converts `value` to an object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Object} Returns the object.\n     */\n    function toObject(value) {\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      return wrapper instanceof LazyWrapper\n        ? wrapper.clone()\n        : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `collection` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new array containing chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if (guard ? isIterateeCall(array, size, guard) : size == null) {\n        size = 1;\n      } else {\n        size = nativeMax(+size || 1, 1);\n      }\n      var index = 0,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = Array(ceil(length / size));\n\n      while (index < length) {\n        result[++resIndex] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3], [4, 2]);\n     * // => [1, 3]\n     */\n    var difference = restParam(function(array, values) {\n      return (isArray(array) || isArguments(array))\n        ? baseDifference(array, baseFlatten(values, false, true))\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that match the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [1]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active', false), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active', false), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8], '*', 1, 2);\n     * // => [4, '*', 8]\n     */\n    function fill(array, value, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(chr) {\n     *   return chr.user == 'barney';\n     * });\n     * // => 0\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findIndex(users, 'active', false);\n     * // => 0\n     *\n     * // using the `_.property` callback shorthand\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    var findIndex = createFindIndex();\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(chr) {\n     *   return chr.user == 'pebbles';\n     * });\n     * // => 2\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastIndex(users, 'active', false);\n     * // => 2\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    var findLastIndex = createFindIndex(true);\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([]);\n     * // => undefined\n     */\n    function first(array) {\n      return array ? array[0] : undefined;\n    }\n\n    /**\n     * Flattens a nested array. If `isDeep` is `true` the array is recursively\n     * flattened, otherwise it is only flattened a single level.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, [4]]\n     *\n     * // using `isDeep`\n     * _.flatten([1, [2, 3, [4]]], true);\n     * // => [1, 2, 3, 4]\n     */\n    function flatten(array, isDeep, guard) {\n      var length = array ? array.length : 0;\n      if (guard && isIterateeCall(array, isDeep, guard)) {\n        isDeep = false;\n      }\n      return length ? baseFlatten(array, isDeep) : [];\n    }\n\n    /**\n     * Recursively flattens a nested array.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to recursively flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, 4]\n     */\n    function flattenDeep(array) {\n      var length = array ? array.length : 0;\n      return length ? baseFlatten(array, true) : [];\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,\n     * it is used as the offset from the end of `array`. If `array` is sorted\n     * providing `true` for `fromIndex` performs a faster binary search.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // using `fromIndex`\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     *\n     * // performing a binary search\n     * _.indexOf([1, 1, 2, 2], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      if (typeof fromIndex == 'number') {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n      } else if (fromIndex) {\n        var index = binaryIndex(array, value),\n            other = array[index];\n\n        if (value === value ? (value === other) : (other !== other)) {\n          return index;\n        }\n        return -1;\n      }\n      return baseIndexOf(array, value, fromIndex || 0);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      return dropRight(array, 1);\n    }\n\n    /**\n     * Creates an array of unique values in all provided arrays using `SameValueZero`\n     * for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of shared values.\n     * @example\n     * _.intersection([1, 2], [4, 2], [2, 1]);\n     * // => [2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = [],\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf;\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null);\n        }\n      }\n      argsLength = args.length;\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [],\n          seen = caches[0];\n\n      outer:\n      while (++index < length) {\n        value = array[index];\n        if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {\n          argsIndex = argsLength;\n          while (--argsIndex) {\n            var cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(value);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array ? array.length : 0;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n     *  or `true` to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // using `fromIndex`\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     *\n     * // performing a binary search\n     * _.lastIndexOf([1, 1, 2, 2], 2, true);\n     * // => 3\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n      } else if (fromIndex) {\n        index = binaryIndex(array, value, true) - 1;\n        var other = array[index];\n        if (value === value ? (value === other) : (other !== other)) {\n          return index;\n        }\n        return -1;\n      }\n      if (value !== value) {\n        return indexOfNaN(array, index, true);\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from `array` using `SameValueZero` for equality\n     * comparisons.\n     *\n     * **Notes:**\n     *  - Unlike `_.without`, this method mutates `array`\n     *  - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     *    comparisons are like strict equality comparisons, e.g. `===`, except\n     *    that `NaN` matches `NaN`\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     *\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull() {\n      var args = arguments,\n          array = args[0];\n\n      if (!(array && array.length)) {\n        return array;\n      }\n      var index = 0,\n          indexOf = getIndexOf(),\n          length = args.length;\n\n      while (++index < length) {\n        var fromIndex = 0,\n            value = args[index];\n\n        while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to the given indexes and returns\n     * an array of the removed elements. Indexes may be specified as an array of\n     * indexes or as individual arguments.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [5, 10, 15, 20];\n     * var evens = _.pullAt(array, 1, 3);\n     *\n     * console.log(array);\n     * // => [5, 15]\n     *\n     * console.log(evens);\n     * // => [10, 20]\n     */\n    var pullAt = restParam(function(array, indexes) {\n      array || (array = []);\n      indexes = baseFlatten(indexes);\n\n      var length = indexes.length,\n          result = baseAt(array, indexes);\n\n      indexes.sort(baseCompareAscending);\n      while (length--) {\n        var index = parseFloat(indexes[length]);\n        if (index != previous && isIndex(index)) {\n          var previous = index;\n          splice.call(array, index, 1);\n        }\n      }\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      predicate = getCallback(predicate, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias tail\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function rest(array) {\n      return drop(array, 1);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This function is used instead of `Array#slice` to support node\n     * lists in IE < 9 and to ensure dense arrays are returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value` should\n     * be inserted into `array` in order to maintain its sort order. If an iteratee\n     * function is provided it is invoked for `value` and each element of `array`\n     * to compute their sort ranking. The iteratee is bound to `thisArg` and\n     * invoked with one argument; (value).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     *\n     * _.sortedIndex([4, 4, 5, 5], 5);\n     * // => 2\n     *\n     * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n     *\n     * // using an iteratee function\n     * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n     *   return this.data[word];\n     * }, dict);\n     * // => 1\n     *\n     * // using the `_.property` callback shorthand\n     * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 1\n     */\n    var sortedIndex = createSortedIndex();\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 4, 5, 5], 5);\n     * // => 4\n     */\n    var sortedLastIndex = createSortedIndex(true);\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n     * and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active', false), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false},\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active', false), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([1, 2], [4, 2], [2, 1]);\n     * // => [1, 2, 4]\n     */\n    var union = restParam(function(arrays) {\n      return baseUniq(baseFlatten(arrays, false, true));\n    });\n\n    /**\n     * Creates a duplicate-value-free version of an array using `SameValueZero`\n     * for equality comparisons. Providing `true` for `isSorted` performs a faster\n     * search algorithm for sorted arrays. If an iteratee function is provided it\n     * is invoked for each value in the array to generate the criterion by which\n     * uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {boolean} [isSorted] Specify the array is sorted.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1]);\n     * // => [1, 2]\n     *\n     * // using `isSorted`\n     * _.uniq([1, 1, 2], true);\n     * // => [1, 2]\n     *\n     * // using an iteratee function\n     * _.uniq([1, 2.5, 1.5, 2], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => [1, 2.5]\n     *\n     * // using the `_.property` callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, iteratee, thisArg) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (isSorted != null && typeof isSorted != 'boolean') {\n        thisArg = iteratee;\n        iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;\n        isSorted = false;\n      }\n      var func = getCallback();\n      if (!(func === baseCallback && iteratee == null)) {\n        iteratee = func(iteratee, thisArg, 3);\n      }\n      return (isSorted && getIndexOf() == baseIndexOf)\n        ? sortedUniq(array, iteratee)\n        : baseUniq(array, iteratee);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-`_.zip`\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['fred', 'barney'], [30, 40], [true, false]]\n     */\n    function unzip(array) {\n      var index = -1,\n          length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = arrayMap(array, baseProperty(index));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all provided values using `SameValueZero` for\n     * equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to filter.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 3], 1, 2);\n     * // => [3]\n     */\n    var without = restParam(function(array, values) {\n      return (isArray(array) || isArguments(array))\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the provided arrays.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of values.\n     * @example\n     *\n     * _.xor([1, 2], [4, 2]);\n     * // => [1, 4]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseDifference(result, array).concat(baseDifference(array, result))\n            : array;\n        }\n      }\n      return result ? baseUniq(result) : [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second elements\n     * of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    var zip = restParam(unzip);\n\n    /**\n     * The inverse of `_.pairs`; this method returns an object composed from arrays\n     * of property names and values. Provide either a single two dimensional array,\n     * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names\n     * and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Array\n     * @param {Array} props The property names.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject([['fred', 30], ['barney', 40]]);\n     * // => { 'fred': 30, 'barney': 40 }\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(props, values) {\n      var index = -1,\n          length = props ? props.length : 0,\n          result = {};\n\n      if (length && !values && !isArray(props[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = props[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps `value` with explicit method\n     * chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(users)\n     *   .sortBy('age')\n     *   .map(function(chr) {\n     *     return chr.user + ' is ' + chr.age;\n     *   })\n     *   .first()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor is\n     * bound to `thisArg` and invoked with one argument; (value). The purpose of\n     * this method is to \"tap into\" a method chain in order to perform operations\n     * on intermediate results within the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor, thisArg) {\n      interceptor.call(thisArg, value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor, thisArg) {\n      return interceptor.call(thisArg, value);\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(users).first();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(users).chain()\n     *   .first()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chained sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapper = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapper = wrapper.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapper.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Creates a clone of the chained sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapper = _(array).map(function(value) {\n     *   return Math.pow(value, 2);\n     * });\n     *\n     * var other = [3, 4];\n     * var otherWrapper = wrapper.plant(other);\n     *\n     * otherWrapper.value();\n     * // => [9, 16]\n     *\n     * wrapper.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * Reverses the wrapped array so the first element becomes the last, the\n     * second element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new reversed `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        if (this.__actions__.length) {\n          value = new LazyWrapper(this);\n        }\n        return new LodashWrapper(value.reverse(), this.__chain__);\n      }\n      return this.thru(function(value) {\n        return value.reverse();\n      });\n    }\n\n    /**\n     * Produces the result of coercing the unwrapped value to a string.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chain\n     * @returns {string} Returns the coerced string value.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return (this.value() + '');\n    }\n\n    /**\n     * Executes the chained sequence to extract the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @alias run, toJSON, valueOf\n     * @category Chain\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements corresponding to the given keys, or indexes,\n     * of `collection`. Keys may be specified as individual arguments or as arrays\n     * of keys.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [props] The property names\n     *  or indexes of elements to pick, specified individually or in arrays.\n     * @returns {Array} Returns the new array of picked elements.\n     * @example\n     *\n     * _.at(['a', 'b', 'c'], [0, 2]);\n     * // => ['a', 'c']\n     *\n     * _.at(['barney', 'fred', 'pebbles'], 0, 2);\n     * // => ['barney', 'pebbles']\n     */\n    var at = restParam(function(collection, props) {\n      var length = collection ? collection.length : 0;\n      if (isLength(length)) {\n        collection = toIterable(collection);\n      }\n      return baseAt(collection, baseFlatten(props));\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the number of times the key was returned by `iteratee`.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * The predicate is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': false },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.every(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = null;\n      }\n      if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.filter([4, 5, 6], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [4, 6]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.filter(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.filter(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function filter(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.result(_.find(users, function(chr) {\n     *   return chr.age < 40;\n     * }), 'user');\n     * // => 'barney'\n     *\n     * // using the `_.matches` callback shorthand\n     * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.result(_.find(users, 'active', false), 'user');\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.result(_.find(users, 'active'), 'user');\n     * // => 'barney'\n     */\n    var find = createFind(baseEach);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(baseEachRight, true);\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning the first element that has equivalent property\n     * values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');\n     * // => 'barney'\n     *\n     * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');\n     * // => 'fred'\n     */\n    function findWhere(collection, source) {\n      return find(collection, baseMatches(source));\n    }\n\n    /**\n     * Iterates over elements of `collection` invoking `iteratee` for each element.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection). Iterator functions may exit iteration early\n     * by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEach(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from left to right and returns the array\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n     *   console.log(n, key);\n     * });\n     * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n     */\n    var forEach = createForEach(arrayEach, baseEach);\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEachRight(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from right to left and returns the array\n     */\n    var forEachRight = createForEach(arrayEachRight, baseEachRight);\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using the `_.property` callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        result[key] = [value];\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection` using `SameValueZero` for equality\n     * comparisons. If `fromIndex` is negative, it is used as the offset from\n     * the end of `collection`.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @alias contains, include\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {*} target The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n     * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.includes('pebbles', 'eb');\n     * // => true\n     */\n    function includes(collection, target, fromIndex, guard) {\n      var length = collection ? collection.length : 0;\n      if (!isLength(length)) {\n        collection = values(collection);\n        length = collection.length;\n      }\n      if (!length) {\n        return false;\n      }\n      if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {\n        fromIndex = 0;\n      } else {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);\n      }\n      return (typeof collection == 'string' || !isArray(collection) && isString(collection))\n        ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1)\n        : (getIndexOf(collection, target, fromIndex) > -1);\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the last element responsible for generating the key. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keyData = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keyData, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return String.fromCharCode(object.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return this.fromCharCode(object.code);\n     * }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in `collection`,\n     * returning an array of the results of each invoked method. Any additional\n     * arguments are provided to each invoked method. If `methodName` is a function\n     * it is invoked for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invoke = restParam(function(collection, methodName, args) {\n      var index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = isLength(length) ? Array(length) : [];\n\n      baseEach(collection, function(value) {\n        var func = isFunc ? methodName : (value != null && value[methodName]);\n        result[++index] = func ? func.apply(value, args) : undefined;\n      });\n      return result;\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` through\n     * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * Many lodash methods are guarded to work as interatees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,\n     * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,\n     * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,\n     * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     *  create a `_.property` or `_.matches` style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function timesThree(n) {\n     *   return n * 3;\n     * }\n     *\n     * _.map([1, 2], timesThree);\n     * // => [3, 6]\n     *\n     * _.map({ 'a': 1, 'b': 2 }, timesThree);\n     * // => [3, 6] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee, thisArg) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      iteratee = getCallback(iteratee, thisArg, 3);\n      return func(collection, iteratee);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, while the second of which\n     * contains elements `predicate` returns falsey for. The predicate is bound\n     * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * _.partition([1, 2, 3], function(n) {\n     *   return n % 2;\n     * });\n     * // => [[1, 3], [2]]\n     *\n     * _.partition([1.2, 2.3, 3.4], function(n) {\n     *   return this.floor(n) % 2;\n     * }, Math);\n     * // => [[1.2, 3.4], [2.3]]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * var mapper = function(array) {\n     *   return _.pluck(array, 'user');\n     * };\n     *\n     * // using the `_.matches` callback shorthand\n     * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n     * // => [['pebbles'], ['barney', 'fred']]\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.map(_.partition(users, 'active', false), mapper);\n     * // => [['barney', 'pebbles'], ['fred']]\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(_.partition(users, 'active'), mapper);\n     * // => [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Gets the value of `key` from all elements in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} key The key of the property to pluck.\n     * @returns {Array} Returns the property values.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(users, 'user');\n     * // => ['barney', 'fred']\n     *\n     * var userIndex = _.indexBy(users, 'user');\n     * _.pluck(userIndex, 'age');\n     * // => [36, 40] (iteration order is not guaranteed)\n     */\n    function pluck(collection, key) {\n      return map(collection, baseProperty(key));\n    }\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` through `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not provided the first element of `collection` is used as the initial\n     * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as interatees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * });\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n     */\n    var reduce = createReduce(arrayReduce, baseEach);\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    var reduceRight =  createReduce(arrayReduceRight, baseEachRight);\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.reject([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [1, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.reject(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.reject(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function reject(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, function(value, index, collection) {\n        return !predicate(value, index, collection);\n      });\n    }\n\n    /**\n     * Gets a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {*} Returns the random sample(s).\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (guard ? isIterateeCall(collection, n, guard) : n == null) {\n        collection = toIterable(collection);\n        var length = collection.length;\n        return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      collection = toIterable(collection);\n\n      var index = -1,\n          length = collection.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var rand = baseRandom(0, index);\n        if (index != rand) {\n          result[index] = result[rand];\n        }\n        result[rand] = collection[index];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the size of `collection`.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return isLength(length) ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * The function returns as soon as it finds a passing value and does not iterate\n     * over the entire collection. The predicate is bound to `thisArg` and invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.some(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = null;\n      }\n      if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through `iteratee`. This method performs\n     * a stable sort, that is, it preserves the original sort order of equal elements.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [iteratee=_.identity] The function\n     *  invoked per iteration. If a property name or an object is provided it is\n     *  used to create a `_.property` or `_.matches` style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return Math.sin(n);\n     * });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return this.sin(n);\n     * }, Math);\n     * // => [3, 1, 2]\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'pebbles' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.sortBy(users, 'user'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function sortBy(collection, iteratee, thisArg) {\n      if (collection == null) {\n        return [];\n      }\n      var index = -1,\n          length = collection.length,\n          result = isLength(length) ? Array(length) : [];\n\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = null;\n      }\n      iteratee = getCallback(iteratee, thisArg, 3);\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = { 'criteria': iteratee(value, key, collection), 'index': index, 'value': value };\n      });\n      return baseSortBy(result, compareAscending);\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it sorts by property names\n     * instead of an iteratee function.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(string|string[])} props The property names to sort by,\n     *  specified as individual property names or arrays of property names.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 26 },\n     *   { 'user': 'fred',   'age': 30 }\n     * ];\n     *\n     * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n     * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortByAll() {\n      var args = arguments,\n          collection = args[0],\n          guard = args[3],\n          index = 0,\n          length = args.length - 1;\n\n      if (collection == null) {\n        return [];\n      }\n      var props = Array(length);\n      while (index < length) {\n        props[index] = args[++index];\n      }\n      if (guard && isIterateeCall(args[1], args[2], guard)) {\n        props = args[1];\n      }\n      return baseSortByOrder(collection, baseFlatten(props), []);\n    }\n\n    /**\n     * This method is like `_.sortByAll` except that it allows specifying the\n     * sort orders of the property names to sort by. A truthy value in `orders`\n     * will sort the corresponding property name in ascending order while a\n     * falsey value will sort it in descending order.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string[]} props The property names to sort by.\n     * @param {boolean[]} orders The sort orders of `props`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 26 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 }\n     * ];\n     *\n     * // sort by `user` in ascending order and by `age` in descending order\n     * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values);\n     * // => [['barney', 36], ['barney', 26], ['fred', 40], ['fred', 30]]\n     */\n    function sortByOrder(collection, props, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (guard && isIterateeCall(props, orders, guard)) {\n        orders = null;\n      }\n      if (!isArray(props)) {\n        props = props == null ? [] : [props];\n      }\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseSortByOrder(collection, props, orders);\n    }\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },\n     *   { 'user': 'fred',   'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n     * // => ['fred']\n     */\n    function where(collection, source) {\n      return filter(collection, baseMatches(source));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Date\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => logs the number of milliseconds it took for the deferred function to be invoked\n     */\n    var now = nativeNow || function() {\n      return new Date().getTime();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it is called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'done saving!' after the two async saves have completed\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      n = nativeIsFinite(n = +n) ? n : 0;\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that accepts up to `n` arguments ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      if (guard && isIterateeCall(func, n, guard)) {\n        n = null;\n      }\n      n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);\n      return createWrapper(func, ARY_FLAG, null, null, null, null, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it is called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery('#add').on('click', _.before(5, addContactToList));\n     * // => allows adding up to 4 contacts to the list\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        } else {\n          func = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and prepends any additional `_.bind` arguments to those provided to the\n     * bound function.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind` this method does not set the `length`\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var greet = function(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * };\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // using placeholders\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = restParam(function(func, thisArg, partials) {\n      var bitmask = BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bind.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all enumerable function\n     * properties, own and inherited, of `object` are bound.\n     *\n     * **Note:** This method does not set the `length` property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} [methodNames] The object method names to bind,\n     *  specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs' when the element is clicked\n     */\n    var bindAll = restParam(function(object, methodNames) {\n      methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);\n\n      var index = -1,\n          length = methodNames.length;\n\n      while (++index < length) {\n        var key = methodNames[index];\n        object[key] = createWrapper(object[key], BIND_FLAG, object);\n      }\n      return object;\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` and prepends\n     * any additional `_.bindKey` arguments to those provided to the bound function.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist.\n     * See [Peter Michaux's article](http://michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // using placeholders\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = restParam(function(object, key, partials) {\n      var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bindKey.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts one or more arguments of `func` that when\n     * called either invokes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` may be specified\n     * if `func.length` is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    var curry = createCurry(CURRY_FLAG);\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    var curryRight = createCurry(CURRY_RIGHT_FLAG);\n\n    /**\n     * Creates a function that delays invoking `func` until after `wait` milliseconds\n     * have elapsed since the last time it was invoked. The created function comes\n     * with a `cancel` method to cancel delayed invocations. Provide an options\n     * object to indicate that `func` should be invoked on the leading and/or\n     * trailing edge of the `wait` timeout. Subsequent calls to the debounced\n     * function return the result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n     *  delayed before it is invoked.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // ensure `batchLog` is invoked once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }));\n     *\n     * // cancel a debounced call\n     * var todoChanges = _.debounce(batchLog, 1000);\n     * Object.observe(models.todo, todoChanges);\n     *\n     * Object.observe(models, function(changes) {\n     *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n     *     todoChanges.cancel();\n     *   }\n     * }, ['delete']);\n     *\n     * // ...at some point `models.todo` is changed\n     * models.todo.completed = true;\n     *\n     * // ...before 1 second has passed `models.todo` is deleted\n     * // which cancels the debounced `todoChanges` call\n     * delete models.todo;\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = wait < 0 ? 0 : (+wait || 0);\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n\n      function cancel() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        if (maxTimeoutId) {\n          clearTimeout(maxTimeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n      }\n\n      function delayed() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0 || remaining > wait) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      }\n\n      function maxDelayed() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      }\n\n      function debounced() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0 || remaining > maxWait;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    var defer = restParam(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    var delay = restParam(function(func, wait, args) {\n      return baseDelay(func, wait, args);\n    });\n\n    /**\n     * Creates a function that returns the result of invoking the provided\n     * functions with the `this` binding of the created function, where each\n     * successive invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow(_.add, square);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the provided functions from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias backflow, compose\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight(square, _.add);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is coerced to a string and used as the\n     * cache key. The `func` is invoked with the `this` binding of the memoized\n     * function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)\n     * method interface of `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var upperCase = _.memoize(function(string) {\n     *   return string.toUpperCase();\n     * });\n     *\n     * upperCase('fred');\n     * // => 'FRED'\n     *\n     * // modifying the result cache\n     * upperCase.cache.set('fred', 'BARNEY');\n     * upperCase('fred');\n     * // => 'BARNEY'\n     *\n     * // replacing `_.memoize.Cache`\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'barney' };\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'fred' }\n     *\n     * _.memoize.Cache = WeakMap;\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'barney' }\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            cache = memoized.cache,\n            key = resolver ? resolver.apply(this, args) : args[0];\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        cache.set(key, result);\n        return result;\n      };\n      memoized.cache = new memoize.Cache;\n      return memoized;\n    }\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        return !predicate.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first call. The `func` is invoked\n     * with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` invokes `createApplication` once\n     */\n    function once(func) {\n      return before(func, 2);\n    }\n\n    /**\n     * Creates a function that invokes `func` with `partial` arguments prepended\n     * to those provided to the new function. This method is like `_.bind` except\n     * it does **not** alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // using placeholders\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = createPartial(PARTIAL_FLAG);\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to those provided to the new function.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // using placeholders\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = createPartial(PARTIAL_RIGHT_FLAG);\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified indexes where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, 2, 0, 1);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     *\n     * var map = _.rearg(_.map, [1, 0]);\n     * map(function(n) {\n     *   return n * 3;\n     * }, [1, 2, 3]);\n     * // => [3, 6, 9]\n     */\n    var rearg = restParam(function(func, indexes) {\n      return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes));\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as an array.\n     *\n     * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.restParam(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function restParam(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            rest = Array(length);\n\n        while (++index < length) {\n          rest[index] = args[start + index];\n        }\n        switch (start) {\n          case 0: return func.call(this, rest);\n          case 1: return func.call(this, args[0], rest);\n          case 2: return func.call(this, args[0], args[1], rest);\n        }\n        var otherArgs = Array(start + 1);\n        index = -1;\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = rest;\n        return func.apply(this, otherArgs);\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the created\n     * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).\n     *\n     * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * // with a Promise\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function(array) {\n        return func.apply(this, array);\n      };\n    }\n\n    /**\n     * Creates a function that only invokes `func` at most once per every `wait`\n     * milliseconds. The created function comes with a `cancel` method to cancel\n     * delayed invocations. Provide an options object to indicate that `func`\n     * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n     * Subsequent calls to the throttled function return the result of the last\n     * `func` call.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     *\n     * // cancel a trailing throttled call\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = +wait;\n      debounceOptions.trailing = trailing;\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Any additional arguments provided to the function are\n     * appended to those provided to the wrapper function. The wrapper is invoked\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      wrapper = wrapper == null ? identity : wrapper;\n      return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n     * otherwise they are assigned by reference. If `customizer` is provided it is\n     * invoked to produce the cloned values. If `customizer` returns `undefined`\n     * cloning is handled by the method instead. The `customizer` is bound to\n     * `thisArg` and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var shallow = _.clone(users);\n     * shallow[0] === users[0];\n     * // => true\n     *\n     * var deep = _.clone(users, true);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.clone(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, customizer, thisArg) {\n      if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n        isDeep = false;\n      }\n      else if (typeof isDeep == 'function') {\n        thisArg = customizer;\n        customizer = isDeep;\n        isDeep = false;\n      }\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n      return baseClone(value, isDeep, customizer);\n    }\n\n    /**\n     * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n     * to produce the cloned values. If `customizer` returns `undefined` cloning\n     * is handled by the method instead. The `customizer` is bound to `thisArg`\n     * and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var deep = _.cloneDeep(users);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.cloneDeep(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 20\n     */\n    function cloneDeep(value, customizer, thisArg) {\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n      return baseClone(value, true, customizer);\n    }\n\n    /**\n     * Checks if `value` is classified as an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      var length = isObjectLike(value) ? value.length : undefined;\n      return isLength(length) && objToString.call(value) == argsTag;\n    }\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(function() { return arguments; }());\n     * // => false\n     */\n    var isArray = nativeIsArray || function(value) {\n      return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n    };\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    function isDate(value) {\n      return isObjectLike(value) && objToString.call(value) == dateTag;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return !!value && value.nodeType === 1 && isObjectLike(value) &&\n        (objToString.call(value).indexOf('Element') > -1);\n    }\n    // Fallback for environments without DOM support.\n    if (!support.dom) {\n      isElement = function(value) {\n        return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n      };\n    }\n\n    /**\n     * Checks if `value` is empty. A value is considered empty unless it is an\n     * `arguments` object, array, string, or jQuery-like collection with a length\n     * greater than `0` or an object with own enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      var length = value.length;\n      if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||\n          (isObjectLike(value) && isFunction(value.splice)))) {\n        return !length;\n      }\n      return !keys(value).length;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent. If `customizer` is provided it is invoked to compare values.\n     * If `customizer` returns `undefined` comparisons are handled by the method\n     * instead. The `customizer` is bound to `thisArg` and invoked with three\n     * arguments: (value, other [, index|key]).\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. Functions and DOM nodes\n     * are **not** supported. Provide a customizer function to extend support\n     * for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'fred' };\n     *\n     * object == other;\n     * // => false\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * // using a customizer callback\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqual(array, other, function(value, other) {\n     *   if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n     *     return true;\n     *   }\n     * });\n     * // => true\n     */\n    function isEqual(value, other, customizer, thisArg) {\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n      if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {\n        return value === other;\n      }\n      var result = customizer ? customizer(value, other) : undefined;\n      return typeof result == 'undefined' ? baseIsEqual(value, other, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(10);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => false\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite(Object(10));\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    var isFinite = nativeNumIsFinite || function(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    };\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) {\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in older versions of Chrome and Safari which return 'function' for regexes\n      // and Safari 8 equivalents which return 'object' for typed array constructors.\n      return objToString.call(value) == funcTag;\n    };\n\n    /**\n     * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // Avoid a V8 JIT bug in Chrome 19-20.\n      // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n      var type = typeof value;\n      return type == 'function' || (!!value && type == 'object');\n    }\n\n    /**\n     * Performs a deep comparison between `object` and `source` to determine if\n     * `object` contains equivalent property values. If `customizer` is provided\n     * it is invoked to compare values. If `customizer` returns `undefined`\n     * comparisons are handled by the method instead. The `customizer` is bound\n     * to `thisArg` and invoked with three arguments: (value, other, index|key).\n     *\n     * **Note:** This method supports comparing properties of arrays, booleans,\n     * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n     * and DOM nodes are **not** supported. Provide a customizer function to extend\n     * support for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.isMatch(object, { 'age': 40 });\n     * // => true\n     *\n     * _.isMatch(object, { 'age': 36 });\n     * // => false\n     *\n     * // using a customizer callback\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatch(object, source, function(value, other) {\n     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n     * });\n     * // => true\n     */\n    function isMatch(object, source, customizer, thisArg) {\n      var props = keys(source),\n          length = props.length;\n\n      if (!length) {\n        return true;\n      }\n      if (object == null) {\n        return false;\n      }\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n      if (!customizer && length == 1) {\n        var key = props[0],\n            value = source[key];\n\n        if (isStrictComparable(value)) {\n          return value === object[key] && (typeof value != 'undefined' || (key in toObject(object)));\n        }\n      }\n      var values = Array(length),\n          strictCompareFlags = Array(length);\n\n      while (length--) {\n        value = values[length] = source[props[length]];\n        strictCompareFlags[length] = isStrictComparable(value);\n      }\n      return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n     * which returns `true` for `undefined` and other non-numeric values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (value == null) {\n        return false;\n      }\n      if (objToString.call(value) == funcTag) {\n        return reNative.test(fnToString.call(value));\n      }\n      return isObjectLike(value) && reHostCtor.test(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n     * as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4);\n     * // => true\n     *\n     * _.isNumber(NaN);\n     * // => true\n     *\n     * _.isNumber('8.4');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * **Note:** This method assumes objects created by the `Object` constructor\n     * have no inherited enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && objToString.call(value) == objectTag)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    function isRegExp(value) {\n      return (isObjectLike(value) && objToString.call(value) == regexpTag) || false;\n    }\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    function isTypedArray(value) {\n      return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * (function() {\n     *   return _.toArray(arguments).slice(1);\n     * }(1, 2, 3));\n     * // => [2, 3]\n     */\n    function toArray(value) {\n      var length = value ? value.length : 0;\n      if (!isLength(length)) {\n        return values(value);\n      }\n      if (!length) {\n        return [];\n      }\n      return arrayCopy(value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable\n     * properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return baseCopy(value, keysIn(value));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources overwrite property assignments of previous sources.\n     * If `customizer` is provided it is invoked to produce the assigned values.\n     * The `customizer` is bound to `thisArg` and invoked with five arguments:\n     * (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using a customizer callback\n     * var defaults = _.partialRight(_.assign, function(value, other) {\n     *   return typeof value == 'undefined' ? other : value;\n     * });\n     *\n     * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var assign = createAssigner(baseAssign);\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties, guard) {\n      var result = baseCreate(prototype);\n      if (guard && isIterateeCall(prototype, properties, guard)) {\n        properties = null;\n      }\n      return properties ? baseCopy(properties, result, keys(properties)) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional values of the same property are ignored.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var defaults = restParam(function(args) {\n      var object = args[0];\n      if (object == null) {\n        return object;\n      }\n      args.push(assignDefaults);\n      return assign.apply(undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    var findKey = createFindKey(baseForOwn);\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles` assuming `_.findKey` returns `barney`\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    var findLastKey = createFindKey(baseForOwnRight);\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object invoking\n     * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments: (value, key, object). Iterator functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n     */\n    var forIn = createForIn(baseFor);\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n     */\n    var forInRight = createForIn(baseForRight);\n\n    /**\n     * Iterates over own enumerable properties of an object invoking `iteratee`\n     * for each property. The `iteratee` is bound to `thisArg` and invoked with\n     * three arguments: (value, key, object). Iterator functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a' and 'b' (iteration order is not guaranteed)\n     */\n    var forOwn = createForOwn(baseForOwn);\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n     */\n    var forOwnRight = createForOwn(baseForOwnRight);\n\n    /**\n     * Creates an array of function property names from all enumerable properties,\n     * own and inherited, of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of property names.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['after', 'ary', 'assign', ...]\n     */\n    function functions(object) {\n      return baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Checks if `key` exists as a direct property of `object` instead of an\n     * inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` is a direct property, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 3 };\n     *\n     * _.has(object, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite property\n     * assignments of previous values unless `multiValue` is `true`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {boolean} [multiValue] Allow multiple values per key.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     *\n     * // with `multiValue`\n     * _.invert(object, true);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function invert(object, multiValue, guard) {\n      if (guard && isIterateeCall(object, multiValue, guard)) {\n        multiValue = null;\n      }\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key];\n\n        if (multiValue) {\n          if (hasOwnProperty.call(result, value)) {\n            result[value].push(key);\n          } else {\n            result[value] = [key];\n          }\n        }\n        else {\n          result[value] = key;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (object) {\n        var Ctor = object.constructor,\n            length = object.length;\n      }\n      if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n          (typeof object != 'function' && (length && isLength(length)))) {\n        return shimKeys(object);\n      }\n      return isObject(object) ? nativeKeys(object) : [];\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      if (object == null) {\n        return [];\n      }\n      if (!isObject(object)) {\n        object = Object(object);\n      }\n      var length = object.length;\n      length = (length && isLength(length) &&\n        (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0;\n\n      var Ctor = object.constructor,\n          index = -1,\n          isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n          result = Array(length),\n          skipIndexes = length > 0;\n\n      while (++index < length) {\n        result[index] = (index + '');\n      }\n      for (var key in object) {\n        if (!(skipIndexes && isIndex(key, length)) &&\n            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through `iteratee`. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, key, object).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the new mapped object.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n     *   return n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using the `_.property` callback shorthand\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee, thisArg) {\n      var result = {};\n      iteratee = getCallback(iteratee, thisArg, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        result[key] = iteratee(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * overwrite property assignments of previous sources. If `customizer` is\n     * provided it is invoked to produce the merged values of the destination and\n     * source properties. If `customizer` returns `undefined` merging is handled\n     * by the method instead. The `customizer` is bound to `thisArg` and invoked\n     * with five arguments: (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var users = {\n     *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n     * };\n     *\n     * var ages = {\n     *   'data': [{ 'age': 36 }, { 'age': 40 }]\n     * };\n     *\n     * _.merge(users, ages);\n     * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n     *\n     * // using a customizer callback\n     * var object = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var other = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(object, other, function(a, b) {\n     *   if (_.isArray(a)) {\n     *     return a.concat(b);\n     *   }\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n     */\n    var merge = createAssigner(baseMerge);\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable properties of `object` that are not omitted.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If `predicate` is provided it is invoked for each property\n     * of `object` omitting the properties `predicate` returns truthy for. The\n     * predicate is bound to `thisArg` and invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to omit, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.omit(object, 'age');\n     * // => { 'user': 'fred' }\n     *\n     * _.omit(object, _.isNumber);\n     * // => { 'user': 'fred' }\n     */\n    var omit = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      if (typeof props[0] != 'function') {\n        var props = arrayMap(baseFlatten(props), String);\n        return pickByArray(object, baseDifference(keysIn(object), props));\n      }\n      var predicate = bindCallback(props[0], props[1], 3);\n      return pickByCallback(object, function(value, key, object) {\n        return !predicate(value, key, object);\n      });\n    });\n\n    /**\n     * Creates a two dimensional array of the key-value pairs for `object`,\n     * e.g. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties. Property\n     * names may be specified as individual arguments or as arrays of property\n     * names. If `predicate` is provided it is invoked for each property of `object`\n     * picking the properties `predicate` returns truthy for. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.pick(object, 'user');\n     * // => { 'user': 'fred' }\n     *\n     * _.pick(object, _.isString);\n     * // => { 'user': 'fred' }\n     */\n    var pick = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      return typeof props[0] == 'function'\n        ? pickByCallback(object, bindCallback(props[0], props[1], 3))\n        : pickByArray(object, baseFlatten(props));\n    });\n\n    /**\n     * Resolves the value of property `key` on `object`. If the value of `key` is\n     * a function it is invoked with the `this` binding of `object` and its result\n     * is returned, else the property value is returned. If the property value is\n     * `undefined` the `defaultValue` is used in its place.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to resolve.\n     * @param {*} [defaultValue] The value returned if the property value\n     *  resolves to `undefined`.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': _.constant(40) };\n     *\n     * _.result(object, 'user');\n     * // => 'fred'\n     *\n     * _.result(object, 'age');\n     * // => 40\n     *\n     * _.result(object, 'status', 'busy');\n     * // => 'busy'\n     *\n     * _.result(object, 'status', _.constant('busy'));\n     * // => 'busy'\n     */\n    function result(object, key, defaultValue) {\n      var value = object == null ? undefined : object[key];\n      if (typeof value == 'undefined') {\n        value = defaultValue;\n      }\n      return isFunction(value) ? value.call(object) : value;\n    }\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own enumerable\n     * properties through `iteratee`, with each invocation potentially mutating\n     * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n     * with four arguments: (accumulator, value, key, object). Iterator functions\n     * may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * });\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     */\n    function transform(object, iteratee, accumulator, thisArg) {\n      var isArr = isArray(object) || isTypedArray(object);\n      iteratee = getCallback(iteratee, thisArg, 4);\n\n      if (accumulator == null) {\n        if (isArr || isObject(object)) {\n          var Ctor = object.constructor;\n          if (isArr) {\n            accumulator = isArray(object) ? new Ctor : [];\n          } else {\n            accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype);\n          }\n        } else {\n          accumulator = {};\n        }\n      }\n      (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Creates an array of the own enumerable property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property values\n     * of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `n` is between `start` and up to but not including, `end`. If\n     * `end` is not specified it is set to `start` with `start` then set to `0`.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} n The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     */\n    function inRange(value, start, end) {\n      start = +start || 0;\n      if (typeof end === 'undefined') {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      return value >= start && value < end;\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number is returned.\n     * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n     * number is returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      if (floating && isIterateeCall(min, max, floating)) {\n        max = floating = null;\n      }\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (noMax && typeof min == 'boolean') {\n          floating = min;\n          min = 1;\n        }\n        else if (typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n        noMax = false;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__foo_bar__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);\n    });\n\n    /**\n     * Capitalizes the first character of `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('fred');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      string = baseToString(string);\n      return string && (string.charAt(0).toUpperCase() + string.slice(1));\n    }\n\n    /**\n     * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = baseToString(string);\n      return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search from.\n     * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = baseToString(string);\n      target = (target + '');\n\n      var length = string.length;\n      position = typeof position == 'undefined'\n        ? length\n        : nativeMin(position < 0 ? 0 : (+position || 0), length);\n\n      position -= target.length;\n      return position >= 0 && string.indexOf(target, position) == position;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n     * their corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional characters\n     * use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't require escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value.\n     * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * Backticks are escaped because in Internet Explorer < 9, they can break out\n     * of attribute values or HTML comments. See [#102](https://html5sec.org/#102),\n     * [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of\n     * the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.\n     *\n     * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n     * to reduce XSS vectors.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n      string = baseToString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n     * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n     */\n    function escapeRegExp(string) {\n      string = baseToString(string);\n      return (string && reHasRegExpChars.test(string))\n        ? string.replace(reRegExpChars, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__foo_bar__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Pads `string` on the left and right sides if it is shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = baseToString(string);\n      length = +length;\n\n      var strLength = string.length;\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return string;\n      }\n      var mid = (length - strLength) / 2,\n          leftLength = floor(mid),\n          rightLength = ceil(mid);\n\n      chars = createPadding('', rightLength, chars);\n      return chars.slice(0, leftLength) + string + chars;\n    }\n\n    /**\n     * Pads `string` on the left side if it is shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padLeft('abc', 6);\n     * // => '   abc'\n     *\n     * _.padLeft('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padLeft('abc', 3);\n     * // => 'abc'\n     */\n    var padLeft = createPadDir();\n\n    /**\n     * Pads `string` on the right side if it is shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padRight('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padRight('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padRight('abc', 3);\n     * // => 'abc'\n     */\n    var padRight = createPadDir(true);\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n     * in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n     * of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard && isIterateeCall(string, radix, guard)) {\n        radix = 0;\n      }\n      return nativeParseInt(string, radix);\n    }\n    // Fallback for environments with pre-ES5 implementations.\n    if (nativeParseInt(whitespace + '08') != 8) {\n      parseInt = function(string, radix, guard) {\n        // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n        // Chrome fails to trim leading <BOM> whitespace characters.\n        // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n        if (guard ? isIterateeCall(string, radix, guard) : radix == null) {\n          radix = 0;\n        } else if (radix) {\n          radix = +radix;\n        }\n        string = trim(string);\n        return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10));\n      };\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=0] The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n) {\n      var result = '';\n      string = baseToString(string);\n      n = +n;\n      if (n < 1 || !string || !nativeIsFinite(n)) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = floor(n / 2);\n        string += string;\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--foo-bar');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__foo_bar__');\n     * // => 'Foo Bar'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = baseToString(string);\n      position = position == null\n        ? 0\n        : nativeMin(position < 0 ? 0 : (+position || 0), string.length);\n\n      return string.lastIndexOf(target, position) == position;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is provided it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [options.variable] The data object variable name.\n     * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // using the HTML \"escape\" delimiter to escape data property values\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to execute JavaScript and generate HTML\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using the ES delimiter as an alternative to the default \"interpolate\" delimiter\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // using custom template delimiters\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using backslashes to treat delimiters as plain text\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // using the `imports` option to import `jQuery` as `jq`\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, otherOptions) {\n      // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (otherOptions && isIterateeCall(string, options, otherOptions)) {\n        options = otherOptions = null;\n      }\n      string = baseToString(string);\n      options = baseAssign(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);\n\n      var imports = baseAssign(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);\n      }\n      chars = (chars + '');\n      return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimLeft('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimLeft('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimLeft(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string));\n      }\n      return string.slice(charsLeftIndex(string, (chars + '')));\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimRight('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimRight('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimRight(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(0, trimmedRightIndex(string) + 1);\n      }\n      return string.slice(0, charsRightIndex(string, (chars + '')) + 1);\n    }\n\n    /**\n     * Truncates `string` if it is longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object|number} [options] The options object or maximum string length.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.trunc('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', 24);\n     * // => 'hi-diddly-ho there, n...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function trunc(string, options, guard) {\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = null;\n      }\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (options != null) {\n        if (isObject(options)) {\n          var separator = 'separator' in options ? options.separator : separator;\n          length = 'length' in options ? (+options.length || 0) : length;\n          omission = 'omission' in options ? baseToString(options.omission) : omission;\n        } else {\n          length = +options || 0;\n        }\n      }\n      string = baseToString(string);\n      if (length >= string.length) {\n        return string;\n      }\n      var end = length - omission.length;\n      if (end < 1) {\n        return omission;\n      }\n      var result = string.slice(0, end);\n      if (separator == null) {\n        return result + omission;\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              newEnd,\n              substring = string.slice(0, end);\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            newEnd = match.index;\n          }\n          result = result.slice(0, newEnd == null ? end : newEnd);\n        }\n      } else if (string.indexOf(separator, end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their\n     * corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional HTML\n     * entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = baseToString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      if (guard && isIterateeCall(string, pattern, guard)) {\n        pattern = null;\n      }\n      string = baseToString(string);\n      return string.match(pattern || reWords) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function} func The function to attempt.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // avoid throwing errors for invalid selectors\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = restParam(function(func, args) {\n      try {\n        return func.apply(undefined, args);\n      } catch(e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and arguments of the created function. If `func` is a property name the\n     * created callback returns the property value for a given element. If `func`\n     * is an object the created callback returns `true` for elements that contain\n     * the equivalent object properties, otherwise it returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias iteratee\n     * @category Utility\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);\n     *   if (!match) {\n     *     return callback(func, thisArg);\n     *   }\n     *   return function(object) {\n     *     return match[2] == 'gt'\n     *       ? object[match[1]] > match[3]\n     *       : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(users, 'age__gt36');\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     */\n    function callback(func, thisArg, guard) {\n      if (guard && isIterateeCall(func, thisArg, guard)) {\n        thisArg = null;\n      }\n      return isObjectLike(func)\n        ? matches(func)\n        : baseCallback(func, thisArg);\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var getter = _.constant(object);\n     *\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function which performs a deep comparison between a given object\n     * and `source`, returning `true` if the given object has equivalent property\n     * values, else `false`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, _.matches({ 'age': 40, 'active': false }));\n     * // => [{ 'user': 'fred', 'age': 40, 'active': false }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, true));\n    }\n\n    /**\n     * Creates a function which compares the property value of `key` on a given\n     * object to `value`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} key The key of the property to get.\n     * @param {*} value The value to compare.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * _.find(users, _.matchesProperty('user', 'fred'));\n     * // => { 'user': 'fred' }\n     */\n    function matchesProperty(key, value) {\n      return baseMatchesProperty(key + '', baseClone(value, true));\n    }\n\n    /**\n     * Adds all own enumerable function properties of a source object to the\n     * destination object. If `object` is a function then methods are added to\n     * its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function\n     * for mixins to avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function|Object} [object=this] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added\n     *  are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * // use `_.runInContext` to avoid conflicts (esp. in Node.js)\n     * var _ = require('lodash').runInContext();\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      if (options == null) {\n        var isObj = isObject(source),\n            props = isObj && keys(source),\n            methodNames = props && props.length && baseFunctions(source, props);\n\n        if (!(methodNames ? methodNames.length : isObj)) {\n          methodNames = false;\n          options = source;\n          source = object;\n          object = this;\n        }\n      }\n      if (!methodNames) {\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = true,\n          index = -1,\n          isFunc = isFunction(object),\n          length = methodNames.length;\n\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      while (++index < length) {\n        var methodName = methodNames[index],\n            func = source[methodName];\n\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = (function(func) {\n            return function() {\n              var chainAll = this.__chain__;\n              if (chain || chainAll) {\n                var result = object(this.__wrapped__),\n                    actions = result.__actions__ = arrayCopy(this.__actions__);\n\n                actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n                result.__chain__ = chainAll;\n                return result;\n              }\n              var args = [this.value()];\n              push.apply(args, arguments);\n              return func.apply(object, args);\n            };\n          }(func));\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function which returns `undefined` regardless of the\n     * arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function which returns the property value of `key` on a given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * var getName = _.property('user');\n     *\n     * _.map(users, getName);\n     * // => ['fred', 'barney']\n     *\n     * _.pluck(_.sortBy(users, getName), 'user');\n     * // => ['barney', 'fred']\n     */\n    function property(key) {\n      return baseProperty(key + '');\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function which returns\n     * the property value of a given key on `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} object The object to inspect.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'a': 3, 'b': 1, 'c': 2 };\n     *\n     * _.map(['a', 'c'], _.propertyOf(object));\n     * // => [3, 2]\n     *\n     * _.sortBy(['a', 'b', 'c'], _.propertyOf(object));\n     * // => ['b', 'c', 'a']\n     */\n    function propertyOf(object) {\n      return function(key) {\n        return object == null ? undefined : object[key];\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. If `end` is not specified it is\n     * set to `start` with `start` then set to `0`. If `start` is less than `end`\n     * a zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the new array of numbers.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      if (step && isIterateeCall(start, end, step)) {\n        end = step = null;\n      }\n      start = +start || 0;\n      step = step == null ? 1 : (+step || 0);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.\n      // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.\n      var index = -1,\n          length = nativeMax(ceil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Invokes the iteratee function `n` times, returning an array of the results\n     * of each invocation. The `iteratee` is bound to `thisArg` and invoked with\n     * one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) {\n     *   mage.castSpell(n);\n     * });\n     * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) {\n     *   this.cast(n);\n     * }, mage);\n     * // => also invokes `mage.castSpell(n)` three times\n     */\n    function times(n, iteratee, thisArg) {\n      n = +n;\n\n      // Exit early to avoid a JSC JIT bug in Safari 8\n      // where `Array(0)` is treated as `Array(1)`.\n      if (n < 1 || !nativeIsFinite(n)) {\n        return [];\n      }\n      var index = -1,\n          result = Array(nativeMin(n, MAX_ARRAY_LENGTH));\n\n      iteratee = bindCallback(iteratee, thisArg, 1);\n      while (++index < n) {\n        if (index < MAX_ARRAY_LENGTH) {\n          result[index] = iteratee(index);\n        } else {\n          iteratee(index);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID is appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return baseToString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} augend The first number to add.\n     * @param {number} addend The second number to add.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    function add(augend, addend) {\n      return augend + addend;\n    }\n\n    /**\n     * Gets the maximum value of `collection`. If `collection` is empty or falsey\n     * `-Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => -Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.max(users, 'age');\n     * // => { 'user': 'fred', 'age': 40 }\n     */\n    var max = createExtremum(arrayMax);\n\n    /**\n     * Gets the minimum value of `collection`. If `collection` is empty or falsey\n     * `Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.min(users, 'age');\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var min = createExtremum(arrayMin, true);\n\n    /**\n     * Gets the sum of the values in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 6]);\n     * // => 10\n     *\n     * _.sum({ 'a': 4, 'b': 6 });\n     * // => 10\n     *\n     * var objects = [\n     *   { 'n': 4 },\n     *   { 'n': 6 }\n     * ];\n     *\n     * _.sum(objects, function(object) {\n     *   return object.n;\n     * });\n     * // => 10\n     *\n     * // using the `_.property` callback shorthand\n     * _.sum(objects, 'n');\n     * // => 10\n     */\n    function sum(collection, iteratee, thisArg) {\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = null;\n      }\n      var func = getCallback(),\n          noIteratee = iteratee == null;\n\n      if (!(func === baseCallback && noIteratee)) {\n        noIteratee = false;\n        iteratee = func(iteratee, thisArg, 3);\n      }\n      return noIteratee\n        ? arraySum(isArray(collection) ? collection : toIterable(collection))\n        : baseSum(collection, iteratee);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    // Add functions to the `Map` cache.\n    MapCache.prototype['delete'] = mapDelete;\n    MapCache.prototype.get = mapGet;\n    MapCache.prototype.has = mapHas;\n    MapCache.prototype.set = mapSet;\n\n    // Add functions to the `Set` cache.\n    SetCache.prototype.push = cachePush;\n\n    // Assign cache to `_.memoize`.\n    memoize.Cache = MapCache;\n\n    // Add functions that return wrapped values when chaining.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.callback = callback;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.restParam = restParam;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortByAll = sortByAll;\n    lodash.sortByOrder = sortByOrder;\n    lodash.spread = spread;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.unzip = unzip;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // Add aliases.\n    lodash.backflow = flowRight;\n    lodash.collect = map;\n    lodash.compose = flowRight;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.iteratee = callback;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n\n    // Add functions to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions that return unwrapped values when chaining.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.deburr = deburr;\n    lodash.endsWith = endsWith;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.findWhere = findWhere;\n    lodash.first = first;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isMatch = isMatch;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.max = max;\n    lodash.min = min;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padLeft = padLeft;\n    lodash.padRight = padRight;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.sum = sum;\n    lodash.template = template;\n    lodash.trim = trim;\n    lodash.trimLeft = trimLeft;\n    lodash.trimRight = trimRight;\n    lodash.trunc = trunc;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.words = words;\n\n    // Add aliases.\n    lodash.all = every;\n    lodash.any = some;\n    lodash.contains = includes;\n    lodash.detect = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.head = first;\n    lodash.include = includes;\n    lodash.inject = reduce;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), false);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions capable of returning wrapped and unwrapped values when chaining.\n    lodash.sample = sample;\n\n    lodash.prototype.sample = function(n) {\n      if (!this.__chain__ && n == null) {\n        return sample(this.value());\n      }\n      return this.thru(function(value) {\n        return sample(value, n);\n      });\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) {\n      var isFilter = type != LAZY_MAP_FLAG,\n          isDropWhile = type == LAZY_DROP_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {\n        var filtered = this.__filtered__,\n            result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(),\n            iteratees = result.__iteratees__ || (result.__iteratees__ = []);\n\n        iteratees.push({\n          'done': false,\n          'count': 0,\n          'index': 0,\n          'iteratee': getCallback(iteratee, thisArg, 1),\n          'limit': -1,\n          'type': type\n        });\n\n        result.__filtered__ = filtered || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      var whileName = methodName + 'While';\n\n      LazyWrapper.prototype[methodName] = function(n) {\n        var filtered = this.__filtered__,\n            result = (filtered && !index) ? this.dropWhile() : this.clone();\n\n        n = n == null ? 1 : nativeMax(floor(n) || 0, 0);\n        if (filtered) {\n          if (index) {\n            result.__takeCount__ = nativeMin(result.__takeCount__, n);\n          } else {\n            last(result.__iteratees__).limit = n;\n          }\n        } else {\n          var views = result.__views__ || (result.__views__ = []);\n          views.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n\n      LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) {\n        return this.reverse()[whileName](predicate, thisArg).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.first` and `_.last`.\n    arrayEach(['first', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.rest`.\n    arrayEach(['initial', 'rest'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[dropName](1);\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.pluck` and `_.where`.\n    arrayEach(['pluck', 'where'], function(methodName, index) {\n      var operationName = index ? 'filter' : 'map',\n          createCallback = index ? baseMatches : baseProperty;\n\n      LazyWrapper.prototype[methodName] = function(value) {\n        return this[operationName](createCallback(value));\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.reject = function(predicate, thisArg) {\n      predicate = getCallback(predicate, thisArg, 1);\n      return this.filter(function(value) {\n        return !predicate(value);\n      });\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = start == null ? 0 : (+start || 0);\n      var result = start < 0 ? this.takeRight(-start) : this.drop(start);\n\n      if (typeof end != 'undefined') {\n        end = (+end || 0);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.drop(0);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (!lodashFunc) {\n        return;\n      }\n      var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),\n          retUnwrapped = /^(?:first|last)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments,\n            length = args.length,\n            chainAll = this.__chain__,\n            value = this.__wrapped__,\n            isHybrid = !!this.__actions__.length,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // avoid lazy use if the iteratee has a `length` other than `1`\n          isLazy = useLazy = false;\n        }\n        var onlyLazy = isLazy && !isHybrid;\n        if (retUnwrapped && !chainAll) {\n          return onlyLazy\n            ? func.call(value)\n            : lodashFunc.call(lodash, this.value());\n        }\n        var interceptor = function(value) {\n          var otherArgs = [value];\n          push.apply(otherArgs, args);\n          return lodashFunc.apply(lodash, otherArgs);\n        };\n        if (useLazy) {\n          var wrapper = onlyLazy ? value : new LazyWrapper(this),\n              result = func.apply(wrapper, args);\n\n          if (!retUnwrapped && (isHybrid || result.__actions__)) {\n            var actions = result.__actions__ || (result.__actions__ = []);\n            actions.push({ 'func': thru, 'args': [interceptor], 'thisArg': lodash });\n          }\n          return new LodashWrapper(result, chainAll);\n        }\n        return this.thru(interceptor);\n      };\n    });\n\n    // Add `Array` and `String` methods to `lodash.prototype`.\n    arrayEach(['concat', 'join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {\n      var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          return func.apply(this.value(), args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(value, args);\n        });\n      };\n    });\n\n    // Map minified function names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name,\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }];\n\n    // Add functions to the lazy wrapper.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chaining functions to the `lodash` wrapper.\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add function aliases to the `lodash` wrapper.\n    lodash.prototype.collect = lodash.prototype.map;\n    lodash.prototype.head = lodash.prototype.first;\n    lodash.prototype.select = lodash.prototype.filter;\n    lodash.prototype.tail = lodash.prototype.rest;\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers like r.js check for condition patterns like the following:\n  if (true) {\n    // Expose lodash to the global object when an AMD loader is present to avoid\n    // errors in cases where lodash is loaded by a script tag and not intended\n    // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for\n    // more details.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n  else if (freeExports && freeModule) {\n    // Export for Node.js or RingoJS.\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // Export for Narwhal or Rhino -require.\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // Export for a browser or Rhino.\n    root._ = _;\n  }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module), __webpack_require__(17)))\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getProgressValues = exports.getProgressBars = exports.getTargetStatus = exports.getTargetText = exports.isTargetValid = exports.isBetweenTarget = exports.isNumeric = exports.isKPITargetsEnabled = exports.isTargetGraph = exports.targetStatuses = exports.targetTypes = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar formatNumberComma = _utils2.default.formatNumberComma;\nvar targetTypes = exports.targetTypes = {\n    Above: 'above',\n    Below: 'below',\n    Between: 'between'\n};\nvar targetStatuses = exports.targetStatuses = {\n    onTarget: 'On Target',\n    onTrack: 'On Track',\n    needsFocus: 'Needs Focus'\n};\nvar isTargetGraph = exports.isTargetGraph = function isTargetGraph(graphType) {\n    return graphType === 'bar' || graphType === 'line';\n};\nvar isKPITargetsEnabled = exports.isKPITargetsEnabled = function isKPITargetsEnabled(entity) {\n    return _lodash2.default.some(entity.attributes.feature_permissions, function (fp) {\n        return fp == 'kpi_targets';\n    });\n};\nvar isNumeric = exports.isNumeric = function isNumeric(n) {\n    return !isNaN(parseFloat(n)) && isFinite(n);\n};\nvar isBetweenTarget = exports.isBetweenTarget = function isBetweenTarget(type) {\n    return type === targetTypes.Between;\n};\nvar isTargetValid = exports.isTargetValid = function isTargetValid(target) {\n    return !!target && !!target.get('type') && (isBetweenTarget(target.get('type')) ? isNumeric(target.getIn(['value', 'from'])) && isNumeric(target.getIn(['value', 'to'])) : isNumeric(target.get('value')));\n};\nvar getTargetText = exports.getTargetText = function getTargetText(target) {\n    if (target.get('type') === targetTypes.Between) {\n        return 'Between ' + formatNumberComma(target.getIn(['value', 'from'])) + ' - ' + formatNumberComma(target.getIn(['value', 'to']));\n    }\n    return _lodash2.default.capitalize(target.get('type')) + ' ' + formatNumberComma(target.get('value'));\n};\nvar getTargetStatus = exports.getTargetStatus = function getTargetStatus(target, current) {\n    var value = target.get('value');\n    var warning = target.get('warning') || value; // Default warning to target\n    var type = target.get('type');\n    switch (type) {\n        case targetTypes.Between:\n            if (current >= value.get('from') && current <= value.get('to')) {\n                return 'onTarget';\n            }\n            if (current >= warning.get('from') && current <= warning.get('to')) {\n                return 'onTrack';\n            }\n            return 'needsFocus';\n        case targetTypes.Below:\n            if (current <= value) {\n                return 'onTarget';\n            }\n            if (current <= warning) {\n                return 'onTrack';\n            }\n            return 'needsFocus';\n        case targetTypes.Above:\n        default:\n            if (current >= value) {\n                return 'onTarget';\n            }\n            if (current >= warning) {\n                return 'onTrack';\n            }\n            return 'needsFocus';\n    }\n};\nvar getProgressBars = exports.getProgressBars = function getProgressBars(type) {\n    switch (type) {\n        case targetTypes.Between:\n            return ['needsFocus', 'onTrack', 'onTarget', 'onTrack', 'needsFocus'];\n        case targetTypes.Below:\n            return ['onTarget', 'onTrack', 'needsFocus'];\n        case targetTypes.Above:\n        default:\n            return ['needsFocus', 'onTrack', 'onTarget'];\n    }\n};\nvar getProgressValues = exports.getProgressValues = function getProgressValues(type, value, warning) {\n    switch (type) {\n        case targetTypes.Between:\n            return [{ amount: warning.from, placeholder: 300 }, { amount: value.from, placeholder: 500 }, { amount: value.to, placeholder: 1000 }, { amount: warning.to, placeholder: 1200 }];\n        case targetTypes.Below:\n            return [{ amount: value, placeholder: 500 }, { amount: warning, placeholder: 1000 }];\n        case targetTypes.Above:\n        default:\n            return [{ amount: warning, placeholder: 500 }, { amount: value, placeholder: 1000 }];\n    }\n};\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleTransition = __webpack_require__(1011);\nvar StyleDeclaration = __webpack_require__(1012);\nvar styleSpec = __webpack_require__(543);\nvar validateStyle = __webpack_require__(544);\nvar parseColor = __webpack_require__(542);\nvar Evented = __webpack_require__(55);\n\nmodule.exports = StyleLayer;\n\nvar TRANSITION_SUFFIX = '-transition';\n\nStyleLayer.create = function(layer, refLayer) {\n    var Classes = {\n        background: __webpack_require__(1021),\n        circle: __webpack_require__(1022),\n        fill: __webpack_require__(1023),\n        line: __webpack_require__(1024),\n        raster: __webpack_require__(1025),\n        symbol: __webpack_require__(1026)\n    };\n    return new Classes[(refLayer || layer).type](layer, refLayer);\n};\n\nfunction StyleLayer(layer, refLayer) {\n    this.set(layer, refLayer);\n}\n\nStyleLayer.prototype = util.inherit(Evented, {\n\n    set: function(layer, refLayer) {\n        this.id = layer.id;\n        this.ref = layer.ref;\n        this.metadata = layer.metadata;\n        this.type = (refLayer || layer).type;\n        this.source = (refLayer || layer).source;\n        this.sourceLayer = (refLayer || layer)['source-layer'];\n        this.minzoom = (refLayer || layer).minzoom;\n        this.maxzoom = (refLayer || layer).maxzoom;\n        this.filter = (refLayer || layer).filter;\n\n        this.paint = {};\n        this.layout = {};\n\n        this._paintSpecifications = styleSpec['paint_' + this.type];\n        this._layoutSpecifications = styleSpec['layout_' + this.type];\n\n        this._paintTransitions = {}; // {[propertyName]: StyleTransition}\n        this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}}\n        this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}}\n        this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration}\n        this._layoutFunctions = {}; // {[propertyName]: Boolean}\n\n        var paintName, layoutName;\n\n        // Resolve paint declarations\n        for (var key in layer) {\n            var match = key.match(/^paint(?:\\.(.*))?$/);\n            if (match) {\n                var klass = match[1] || '';\n                for (paintName in layer[key]) {\n                    this.setPaintProperty(paintName, layer[key][paintName], klass);\n                }\n            }\n        }\n\n        // Resolve layout declarations\n        if (this.ref) {\n            this._layoutDeclarations = refLayer._layoutDeclarations;\n        } else {\n            for (layoutName in layer.layout) {\n                this.setLayoutProperty(layoutName, layer.layout[layoutName]);\n            }\n        }\n\n        // set initial layout/paint values\n        for (paintName in this._paintSpecifications) {\n            this.paint[paintName] = this.getPaintValue(paintName);\n        }\n        for (layoutName in this._layoutSpecifications) {\n            this._updateLayoutValue(layoutName);\n        }\n    },\n\n    setLayoutProperty: function(name, value) {\n\n        if (value == null) {\n            delete this._layoutDeclarations[name];\n        } else {\n            var key = 'layers.' + this.id + '.layout.' + name;\n            if (this._handleErrors(validateStyle.layoutProperty, key, name, value)) return;\n            this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value);\n        }\n        this._updateLayoutValue(name);\n    },\n\n    getLayoutProperty: function(name) {\n        return (\n            this._layoutDeclarations[name] &&\n            this._layoutDeclarations[name].value\n        );\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        var specification = this._layoutSpecifications[name];\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.calculate(globalProperties, featureProperties);\n        } else {\n            return specification.default;\n        }\n    },\n\n    setPaintProperty: function(name, value, klass) {\n        var validateStyleKey = 'layers.' + this.id + (klass ? '[\"paint.' + klass + '\"].' : '.paint.') + name;\n\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            if (!this._paintTransitionOptions[klass || '']) {\n                this._paintTransitionOptions[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintTransitionOptions[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintTransitionOptions[klass || ''][name] = value;\n            }\n        } else {\n            if (!this._paintDeclarations[klass || '']) {\n                this._paintDeclarations[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintDeclarations[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value);\n            }\n        }\n    },\n\n    getPaintProperty: function(name, klass) {\n        klass = klass || '';\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            return (\n                this._paintTransitionOptions[klass] &&\n                this._paintTransitionOptions[klass][name]\n            );\n        } else {\n            return (\n                this._paintDeclarations[klass] &&\n                this._paintDeclarations[klass][name] &&\n                this._paintDeclarations[klass][name].value\n            );\n        }\n    },\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var specification = this._paintSpecifications[name];\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.calculate(globalProperties, featureProperties);\n        } else if (specification.type === 'color' && specification.default) {\n            return parseColor(specification.default);\n        } else {\n            return specification.default;\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        var transition = this._paintTransitions[name];\n        if (transition) {\n            return transition.declaration.stopZoomLevels;\n        } else {\n            return [];\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        var transition = this._paintTransitions[name];\n        return transition.declaration.calculateInterpolationT({ zoom: zoom });\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isZoomConstant;\n        } else {\n            return true;\n        }\n    },\n\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n        if (this.paint[this.type + '-opacity'] === 0) return true;\n        return false;\n    },\n\n    updatePaintTransitions: function(classes, options, globalOptions, animationLoop) {\n        var declarations = util.extend({}, this._paintDeclarations['']);\n        for (var i = 0; i < classes.length; i++) {\n            util.extend(declarations, this._paintDeclarations[classes[i]]);\n        }\n\n        var name;\n        for (name in declarations) { // apply new declarations\n            this._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop);\n        }\n        for (name in this._paintTransitions) {\n            if (!(name in declarations)) // apply removed declarations\n                this._applyPaintDeclaration(name, null, options, globalOptions, animationLoop);\n        }\n    },\n\n    updatePaintTransition: function(name, classes, options, globalOptions, animationLoop) {\n        var declaration = this._paintDeclarations[''][name];\n        for (var i = 0; i < classes.length; i++) {\n            var classPaintDeclarations = this._paintDeclarations[classes[i]];\n            if (classPaintDeclarations && classPaintDeclarations[name]) {\n                declaration = classPaintDeclarations[name];\n            }\n        }\n        this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop);\n    },\n\n    // update all zoom-dependent layout/paint values\n    recalculate: function(zoom, zoomHistory) {\n        for (var paintName in this._paintTransitions) {\n            this.paint[paintName] = this.getPaintValue(paintName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n        for (var layoutName in this._layoutFunctions) {\n            this.layout[layoutName] = this.getLayoutValue(layoutName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n    },\n\n    serialize: function(options) {\n        var output = {\n            'id': this.id,\n            'ref': this.ref,\n            'metadata': this.metadata,\n            'minzoom': this.minzoom,\n            'maxzoom': this.maxzoom\n        };\n\n        for (var klass in this._paintDeclarations) {\n            var key = klass === '' ? 'paint' : 'paint.' + klass;\n            output[key] = util.mapObject(this._paintDeclarations[klass], getDeclarationValue);\n        }\n\n        if (!this.ref || (options && options.includeRefProperties)) {\n            util.extend(output, {\n                'type': this.type,\n                'source': this.source,\n                'source-layer': this.sourceLayer,\n                'filter': this.filter,\n                'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue)\n            });\n        }\n\n        return util.filterObject(output, function(value, key) {\n            return value !== undefined && !(key === 'layout' && !Object.keys(value).length);\n        });\n    },\n\n    // set paint transition based on a given paint declaration\n    _applyPaintDeclaration: function (name, declaration, options, globalOptions, animationLoop) {\n        var oldTransition = options.transition ? this._paintTransitions[name] : undefined;\n        var spec = this._paintSpecifications[name];\n\n        if (declaration === null || declaration === undefined) {\n            declaration = new StyleDeclaration(spec, spec.default);\n        }\n\n        if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n        var transitionOptions = util.extend({\n            duration: 300,\n            delay: 0\n        }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX));\n\n        var newTransition = this._paintTransitions[name] =\n            new StyleTransition(spec, declaration, oldTransition, transitionOptions);\n\n        if (!newTransition.instant()) {\n            newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n        }\n        if (oldTransition) {\n            animationLoop.cancel(oldTransition.loopID);\n        }\n    },\n\n    // update layout value if it's constant, or mark it as zoom-dependent\n    _updateLayoutValue: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration && declaration.isFunction) {\n            this._layoutFunctions[name] = true;\n        } else {\n            delete this._layoutFunctions[name];\n            this.layout[name] = this.getLayoutValue(name);\n        }\n    },\n\n    _handleErrors: function(validate, key, name, value) {\n        return validateStyle.emitErrors(this, validate.call(validateStyle, {\n            key: key,\n            layerType: this.type,\n            objectKey: name,\n            value: value,\n            styleSpec: styleSpec,\n            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n            style: {glyphs: true, sprite: true}\n        }));\n    }\n});\n\nfunction getDeclarationValue(declaration) {\n    return declaration.value;\n}\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\nvar extend = __webpack_require__(546);\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n//   for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n//   high level object that needs to be descended into deeper or a simple\n//   scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n\nmodule.exports = function validate(options) {\n\n    var validateFunction = __webpack_require__(547);\n    var validateObject = __webpack_require__(149);\n    var VALIDATORS = {\n        '*': function() {\n            return [];\n        },\n        'array': __webpack_require__(548),\n        'boolean': __webpack_require__(1016),\n        'number': __webpack_require__(549),\n        'color': __webpack_require__(1017),\n        'constants': __webpack_require__(545),\n        'enum': __webpack_require__(274),\n        'filter': __webpack_require__(275),\n        'function': __webpack_require__(547),\n        'layer': __webpack_require__(550),\n        'object': __webpack_require__(149),\n        'source': __webpack_require__(553),\n        'light': __webpack_require__(554),\n        'string': __webpack_require__(555)\n    };\n\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (getType(value) === 'string' && value[0] === '@') {\n        if (styleSpec.$version > 7) {\n            return [new ValidationError(key, value, 'constants have been deprecated as of v8')];\n        }\n        if (!(value in style.constants)) {\n            return [new ValidationError(key, value, 'constant \"%s\" not found', value)];\n        }\n        options = extend({}, options, { value: style.constants[value] });\n    }\n\n    if (valueSpec.function && getType(value) === 'object') {\n        return validateFunction(options);\n\n    } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n        return VALIDATORS[valueSpec.type](options);\n\n    } else {\n        return validateObject(extend({}, options, {\n            valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n        }));\n    }\n};\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Note: all \"sizes\" are measured in bytes\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = StructArrayType;\n\nvar viewTypes = {\n    'Int8': Int8Array,\n    'Uint8': Uint8Array,\n    'Uint8Clamped': Uint8ClampedArray,\n    'Int16': Int16Array,\n    'Uint16': Uint16Array,\n    'Int32': Int32Array,\n    'Uint32': Uint32Array,\n    'Float32': Float32Array,\n    'Float64': Float64Array\n};\n\n/**\n * @typedef StructMember\n * @private\n * @property {string} name\n * @property {string} type\n * @property {number} components\n */\n\nvar structArrayTypeCache = {};\n\n/**\n * `StructArrayType` is used to create new `StructArray` types.\n *\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like\n * an array of typed structs. A StructArray is comprised of elements. Each element has a set of\n * members that are defined when the `StructArrayType` is created.\n *\n * StructArrays useful for creating large arrays that:\n * - can be transferred from workers as a Transferable object\n * - can be copied cheaply\n * - use less memory for lower-precision members\n * - can be used as buffers in WebGL.\n *\n * @class StructArrayType\n * @param {Array.<StructMember>}\n * @param options\n * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1.\n *\n * @example\n *\n * var PointArrayType = new StructArrayType({\n *  members: [\n *      { type: 'Int16', name: 'x' },\n *      { type: 'Int16', name: 'y' }\n *  ]});\n *\n *  var pointArray = new PointArrayType();\n *  pointArray.emplaceBack(10, 15);\n *  pointArray.emplaceBack(20, 35);\n *\n *  point = pointArray.get(0);\n *  assert(point.x === 10);\n *  assert(point.y === 15);\n *\n * @private\n */\nfunction StructArrayType(options) {\n\n    var key = JSON.stringify(options);\n    if (structArrayTypeCache[key]) {\n        return structArrayTypeCache[key];\n    }\n\n    if (options.alignment === undefined) options.alignment = 1;\n\n    function StructType() {\n        Struct.apply(this, arguments);\n    }\n\n    StructType.prototype = Object.create(Struct.prototype);\n\n    var offset = 0;\n    var maxSize = 0;\n    var usedTypes = ['Uint8'];\n\n    StructType.prototype.members = options.members.map(function(member) {\n        member = {\n            name: member.name,\n            type: member.type,\n            components: member.components || 1\n        };\n\n        assert(member.name.length);\n        assert(member.type in viewTypes);\n\n        if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type);\n\n        var typeSize = sizeOf(member.type);\n        maxSize = Math.max(maxSize, typeSize);\n        member.offset = offset = align(offset, Math.max(options.alignment, typeSize));\n\n        for (var c = 0; c < member.components; c++) {\n            Object.defineProperty(StructType.prototype, member.name + (member.components === 1 ? '' : c), {\n                get: createGetter(member, c),\n                set: createSetter(member, c)\n            });\n        }\n\n        offset += typeSize * member.components;\n\n        return member;\n    });\n\n    StructType.prototype.alignment = options.alignment;\n    StructType.prototype.size = align(offset, Math.max(maxSize, options.alignment));\n\n    function StructArrayType() {\n        StructArray.apply(this, arguments);\n        this.members = StructType.prototype.members;\n    }\n\n    StructArrayType.serialize = serializeStructArrayType;\n\n    StructArrayType.prototype = Object.create(StructArray.prototype);\n    StructArrayType.prototype.StructType = StructType;\n    StructArrayType.prototype.bytesPerElement = StructType.prototype.size;\n    StructArrayType.prototype.emplaceBack = createEmplaceBack(StructType.prototype.members, StructType.prototype.size);\n    StructArrayType.prototype._usedTypes = usedTypes;\n\n\n    structArrayTypeCache[key] = StructArrayType;\n\n    return StructArrayType;\n}\n\n/**\n * Serialize the StructArray type. This serializes the *type* not an instance of the type.\n * @private\n */\nfunction serializeStructArrayType() {\n    return {\n        members: this.prototype.StructType.prototype.members,\n        alignment: this.prototype.StructType.prototype.alignment,\n        bytesPerElement: this.prototype.bytesPerElement\n    };\n}\n\n\nfunction align(offset, size) {\n    return Math.ceil(offset / size) * size;\n}\n\nfunction sizeOf(type) {\n    return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction getArrayViewName(type) {\n    return type.toLowerCase();\n}\n\n\n/*\n * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming\n * > elementIndex to i) (likely due to v8 inlining heuristics).\n * - lucaswoj\n */\nfunction createEmplaceBack(members, bytesPerElement) {\n    var usedTypeSizes = [];\n    var argNames = [];\n    var body = '' +\n    'var i = this.length;\\n' +\n    'this.resize(this.length + 1);\\n';\n\n    for (var m = 0; m < members.length; m++) {\n        var member = members[m];\n        var size = sizeOf(member.type);\n\n        if (usedTypeSizes.indexOf(size) < 0) {\n            usedTypeSizes.push(size);\n            body += 'var o' + size.toFixed(0) + ' = i * ' + (bytesPerElement / size).toFixed(0) + ';\\n';\n        }\n\n        for (var c = 0; c < member.components; c++) {\n            var argName = 'v' + argNames.length;\n            var index = 'o' + size.toFixed(0) + ' + ' + (member.offset / size + c).toFixed(0);\n            body += 'this.' + getArrayViewName(member.type) + '[' + index + '] = ' + argName + ';\\n';\n            argNames.push(argName);\n        }\n    }\n\n    body += 'return i;';\n\n    return new Function(argNames, body);\n}\n\nfunction createMemberComponentString(member, component) {\n    var elementOffset = 'this._pos' + sizeOf(member.type).toFixed(0);\n    var componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0);\n    var index = elementOffset + ' + ' + componentOffset;\n    return 'this._structArray.' + getArrayViewName(member.type) + '[' + index + ']';\n\n}\n\nfunction createGetter(member, c) {\n    return new Function([], 'return ' + createMemberComponentString(member, c) + ';');\n}\n\nfunction createSetter(member, c) {\n    return new Function(['x'], createMemberComponentString(member, c) + ' = x;');\n}\n\n/**\n * @class Struct\n * @param {StructArray} structArray The StructArray the struct is stored in\n * @param {number} index The index of the struct in the StructArray.\n * @private\n */\nfunction Struct(structArray, index) {\n    this._structArray = structArray;\n    this._pos1 = index * this.size;\n    this._pos2 = this._pos1 / 2;\n    this._pos4 = this._pos1 / 4;\n    this._pos8 = this._pos1 / 8;\n}\n\n/**\n * @class StructArray\n * The StructArray class is inherited by the custom StructArrayType classes created with\n * `new StructArrayType(members, options)`.\n * @private\n */\nfunction StructArray(serialized) {\n    if (serialized !== undefined) {\n    // Create from an serialized StructArray\n        this.arrayBuffer = serialized.arrayBuffer;\n        this.length = serialized.length;\n        this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement;\n        this._refreshViews();\n\n    // Create a new StructArray\n    } else {\n        this.capacity = -1;\n        this.resize(0);\n    }\n}\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.DEFAULT_CAPACITY = 128;\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.RESIZE_MULTIPLIER = 5;\n\n/**\n * Serialize this StructArray instance\n * @private\n */\nStructArray.prototype.serialize = function() {\n    this.trim();\n    return {\n        length: this.length,\n        arrayBuffer: this.arrayBuffer\n    };\n};\n\n/**\n * Return the Struct at the given location in the array.\n * @private\n * @param {number} index The index of the element.\n */\nStructArray.prototype.get = function(index) {\n    return new this.StructType(this, index);\n};\n\n/**\n * Resize the array to discard unused capacity.\n * @private\n */\nStructArray.prototype.trim = function() {\n    if (this.length !== this.capacity) {\n        this.capacity = this.length;\n        this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n        this._refreshViews();\n    }\n};\n\n/**\n * Resize the array.\n * If `n` is greater than the current length then additional elements with undefined values are added.\n * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n * @param {number} n The new size of the array.\n */\nStructArray.prototype.resize = function(n) {\n    this.length = n;\n    if (n > this.capacity) {\n        this.capacity = Math.max(n, Math.floor(this.capacity * this.RESIZE_MULTIPLIER), this.DEFAULT_CAPACITY);\n        this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n        var oldUint8Array = this.uint8;\n        this._refreshViews();\n        if (oldUint8Array) this.uint8.set(oldUint8Array);\n    }\n};\n\n/**\n * Create TypedArray views for the current ArrayBuffer.\n * @private\n */\nStructArray.prototype._refreshViews = function() {\n    for (var t = 0; t < this._usedTypes.length; t++) {\n        var type = this._usedTypes[t];\n        this[getArrayViewName(type)] = new viewTypes[type](this.arrayBuffer);\n    }\n};\n\n/**\n * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting\n * @param {number} startIndex\n * @param {number} endIndex\n * @private\n */\nStructArray.prototype.toArray = function(startIndex, endIndex) {\n    var array = [];\n\n    for (var i = startIndex; i < endIndex; i++) {\n        var struct = this.get(i);\n        array.push(struct);\n    }\n\n    return array;\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleTransition = __webpack_require__(1341);\nvar StyleDeclaration = __webpack_require__(1342);\nvar styleSpec = __webpack_require__(626);\nvar validateStyle = __webpack_require__(628);\nvar parseColor = __webpack_require__(625);\nvar Evented = __webpack_require__(47);\n\nmodule.exports = StyleLayer;\n\nvar TRANSITION_SUFFIX = '-transition';\n\nStyleLayer.create = function(layer, refLayer) {\n    var Classes = {\n        background: __webpack_require__(1348),\n        circle: __webpack_require__(1349),\n        fill: __webpack_require__(1350),\n        line: __webpack_require__(1351),\n        raster: __webpack_require__(1352),\n        symbol: __webpack_require__(1353)\n    };\n    return new Classes[(refLayer || layer).type](layer, refLayer);\n};\n\nfunction StyleLayer(layer, refLayer) {\n    this.set(layer, refLayer);\n}\n\nStyleLayer.prototype = util.inherit(Evented, {\n\n    set: function(layer, refLayer) {\n        this.id = layer.id;\n        this.ref = layer.ref;\n        this.metadata = layer.metadata;\n        this.type = (refLayer || layer).type;\n        this.source = (refLayer || layer).source;\n        this.sourceLayer = (refLayer || layer)['source-layer'];\n        this.minzoom = (refLayer || layer).minzoom;\n        this.maxzoom = (refLayer || layer).maxzoom;\n        this.filter = (refLayer || layer).filter;\n\n        this.paint = {};\n        this.layout = {};\n\n        this._paintSpecifications = styleSpec['paint_' + this.type];\n        this._layoutSpecifications = styleSpec['layout_' + this.type];\n\n        this._paintTransitions = {}; // {[propertyName]: StyleTransition}\n        this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}}\n        this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}}\n        this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration}\n        this._layoutFunctions = {}; // {[propertyName]: Boolean}\n\n        var paintName, layoutName;\n\n        // Resolve paint declarations\n        for (var key in layer) {\n            var match = key.match(/^paint(?:\\.(.*))?$/);\n            if (match) {\n                var klass = match[1] || '';\n                for (paintName in layer[key]) {\n                    this.setPaintProperty(paintName, layer[key][paintName], klass);\n                }\n            }\n        }\n\n        // Resolve layout declarations\n        if (this.ref) {\n            this._layoutDeclarations = refLayer._layoutDeclarations;\n        } else {\n            for (layoutName in layer.layout) {\n                this.setLayoutProperty(layoutName, layer.layout[layoutName]);\n            }\n        }\n\n        // set initial layout/paint values\n        for (paintName in this._paintSpecifications) {\n            this.paint[paintName] = this.getPaintValue(paintName);\n        }\n        for (layoutName in this._layoutSpecifications) {\n            this._updateLayoutValue(layoutName);\n        }\n    },\n\n    setLayoutProperty: function(name, value) {\n\n        if (value == null) {\n            delete this._layoutDeclarations[name];\n        } else {\n            var key = 'layers.' + this.id + '.layout.' + name;\n            if (this._handleErrors(validateStyle.layoutProperty, key, name, value)) return;\n            this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value);\n        }\n        this._updateLayoutValue(name);\n    },\n\n    getLayoutProperty: function(name) {\n        return (\n            this._layoutDeclarations[name] &&\n            this._layoutDeclarations[name].value\n        );\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        var specification = this._layoutSpecifications[name];\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.calculate(globalProperties, featureProperties);\n        } else {\n            return specification.default;\n        }\n    },\n\n    setPaintProperty: function(name, value, klass) {\n        var validateStyleKey = 'layers.' + this.id + (klass ? '[\"paint.' + klass + '\"].' : '.paint.') + name;\n\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            if (!this._paintTransitionOptions[klass || '']) {\n                this._paintTransitionOptions[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintTransitionOptions[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintTransitionOptions[klass || ''][name] = value;\n            }\n        } else {\n            if (!this._paintDeclarations[klass || '']) {\n                this._paintDeclarations[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintDeclarations[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value);\n            }\n        }\n    },\n\n    getPaintProperty: function(name, klass) {\n        klass = klass || '';\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            return (\n                this._paintTransitionOptions[klass] &&\n                this._paintTransitionOptions[klass][name]\n            );\n        } else {\n            return (\n                this._paintDeclarations[klass] &&\n                this._paintDeclarations[klass][name] &&\n                this._paintDeclarations[klass][name].value\n            );\n        }\n    },\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var specification = this._paintSpecifications[name];\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.calculate(globalProperties, featureProperties);\n        } else if (specification.type === 'color' && specification.default) {\n            return parseColor(specification.default);\n        } else {\n            return specification.default;\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        var transition = this._paintTransitions[name];\n        if (transition) {\n            return transition.declaration.stopZoomLevels;\n        } else {\n            return [];\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        var transition = this._paintTransitions[name];\n        return transition.declaration.calculateInterpolationT({ zoom: zoom });\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isLayoutValueFeatureConstant: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isZoomConstant;\n        } else {\n            return true;\n        }\n    },\n\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n        if (this.isPaintValueFeatureConstant(this.type + '-opacity') && this.paint[this.type + '-opacity'] === 0) return true;\n        if (this.isPaintValueFeatureConstant(this.type + '-color') && this.paint[this.type + '-color'] && this.paint[this.type + '-color'][3] === 0) return true;\n\n        return false;\n    },\n\n    updatePaintTransitions: function(classes, options, globalOptions, animationLoop) {\n        var declarations = util.extend({}, this._paintDeclarations['']);\n        for (var i = 0; i < classes.length; i++) {\n            util.extend(declarations, this._paintDeclarations[classes[i]]);\n        }\n\n        var name;\n        for (name in declarations) { // apply new declarations\n            this._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop);\n        }\n        for (name in this._paintTransitions) {\n            if (!(name in declarations)) // apply removed declarations\n                this._applyPaintDeclaration(name, null, options, globalOptions, animationLoop);\n        }\n    },\n\n    updatePaintTransition: function(name, classes, options, globalOptions, animationLoop) {\n        var declaration = this._paintDeclarations[''][name];\n        for (var i = 0; i < classes.length; i++) {\n            var classPaintDeclarations = this._paintDeclarations[classes[i]];\n            if (classPaintDeclarations && classPaintDeclarations[name]) {\n                declaration = classPaintDeclarations[name];\n            }\n        }\n        this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop);\n    },\n\n    // update all zoom-dependent layout/paint values\n    recalculate: function(zoom, zoomHistory) {\n        for (var paintName in this._paintTransitions) {\n            this.paint[paintName] = this.getPaintValue(paintName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n        for (var layoutName in this._layoutFunctions) {\n            this.layout[layoutName] = this.getLayoutValue(layoutName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n    },\n\n    serialize: function(options) {\n        var output = {\n            'id': this.id,\n            'ref': this.ref,\n            'metadata': this.metadata,\n            'minzoom': this.minzoom,\n            'maxzoom': this.maxzoom\n        };\n\n        for (var klass in this._paintDeclarations) {\n            var key = klass === '' ? 'paint' : 'paint.' + klass;\n            output[key] = util.mapObject(this._paintDeclarations[klass], getDeclarationValue);\n        }\n\n        if (!this.ref || (options && options.includeRefProperties)) {\n            util.extend(output, {\n                'type': this.type,\n                'source': this.source,\n                'source-layer': this.sourceLayer,\n                'filter': this.filter,\n                'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue)\n            });\n        }\n\n        return util.filterObject(output, function(value, key) {\n            return value !== undefined && !(key === 'layout' && !Object.keys(value).length);\n        });\n    },\n\n    // set paint transition based on a given paint declaration\n    _applyPaintDeclaration: function (name, declaration, options, globalOptions, animationLoop) {\n        var oldTransition = options.transition ? this._paintTransitions[name] : undefined;\n        var spec = this._paintSpecifications[name];\n\n        if (declaration === null || declaration === undefined) {\n            declaration = new StyleDeclaration(spec, spec.default);\n        }\n\n        if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n        var transitionOptions = util.extend({\n            duration: 300,\n            delay: 0\n        }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX));\n\n        var newTransition = this._paintTransitions[name] =\n            new StyleTransition(spec, declaration, oldTransition, transitionOptions);\n\n        if (!newTransition.instant()) {\n            newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n        }\n        if (oldTransition) {\n            animationLoop.cancel(oldTransition.loopID);\n        }\n    },\n\n    // update layout value if it's constant, or mark it as zoom-dependent\n    _updateLayoutValue: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration && declaration.isFunction) {\n            this._layoutFunctions[name] = true;\n        } else {\n            delete this._layoutFunctions[name];\n            this.layout[name] = this.getLayoutValue(name);\n        }\n    },\n\n    _handleErrors: function(validate, key, name, value) {\n        return validateStyle.emitErrors(this, validate.call(validateStyle, {\n            key: key,\n            layerType: this.type,\n            objectKey: name,\n            value: value,\n            styleSpec: styleSpec,\n            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n            style: {glyphs: true, sprite: true}\n        }));\n    }\n});\n\nfunction getDeclarationValue(declaration) {\n    return declaration.value;\n}\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Note: all \"sizes\" are measured in bytes\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = StructArrayType;\n\nvar viewTypes = {\n    'Int8': Int8Array,\n    'Uint8': Uint8Array,\n    'Uint8Clamped': Uint8ClampedArray,\n    'Int16': Int16Array,\n    'Uint16': Uint16Array,\n    'Int32': Int32Array,\n    'Uint32': Uint32Array,\n    'Float32': Float32Array,\n    'Float64': Float64Array\n};\n\n/**\n * @typedef StructMember\n * @private\n * @property {string} name\n * @property {string} type\n * @property {number} components\n */\n\nvar structArrayTypeCache = {};\n\n/**\n * `StructArrayType` is used to create new `StructArray` types.\n *\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like\n * an array of typed structs. A StructArray is comprised of elements. Each element has a set of\n * members that are defined when the `StructArrayType` is created.\n *\n * StructArrays useful for creating large arrays that:\n * - can be transferred from workers as a Transferable object\n * - can be copied cheaply\n * - use less memory for lower-precision members\n * - can be used as buffers in WebGL.\n *\n * @class StructArrayType\n * @param {Array.<StructMember>}\n * @param options\n * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1.\n *\n * @example\n *\n * var PointArrayType = new StructArrayType({\n *  members: [\n *      { type: 'Int16', name: 'x' },\n *      { type: 'Int16', name: 'y' }\n *  ]});\n *\n *  var pointArray = new PointArrayType();\n *  pointArray.emplaceBack(10, 15);\n *  pointArray.emplaceBack(20, 35);\n *\n *  point = pointArray.get(0);\n *  assert(point.x === 10);\n *  assert(point.y === 15);\n *\n * @private\n */\nfunction StructArrayType(options) {\n\n    var key = JSON.stringify(options);\n    if (structArrayTypeCache[key]) {\n        return structArrayTypeCache[key];\n    }\n\n    if (options.alignment === undefined) options.alignment = 1;\n\n    function StructType() {\n        Struct.apply(this, arguments);\n    }\n\n    StructType.prototype = Object.create(Struct.prototype);\n\n    var offset = 0;\n    var maxSize = 0;\n    var usedTypes = ['Uint8'];\n\n    StructType.prototype.members = options.members.map(function(member) {\n        member = {\n            name: member.name,\n            type: member.type,\n            components: member.components || 1\n        };\n\n        assert(member.name.length);\n        assert(member.type in viewTypes);\n\n        if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type);\n\n        var typeSize = sizeOf(member.type);\n        maxSize = Math.max(maxSize, typeSize);\n        member.offset = offset = align(offset, Math.max(options.alignment, typeSize));\n\n        for (var c = 0; c < member.components; c++) {\n            Object.defineProperty(StructType.prototype, member.name + (member.components === 1 ? '' : c), {\n                get: createGetter(member, c),\n                set: createSetter(member, c)\n            });\n        }\n\n        offset += typeSize * member.components;\n\n        return member;\n    });\n\n    StructType.prototype.alignment = options.alignment;\n    StructType.prototype.size = align(offset, Math.max(maxSize, options.alignment));\n\n    function StructArrayType() {\n        StructArray.apply(this, arguments);\n        this.members = StructType.prototype.members;\n    }\n\n    StructArrayType.serialize = serializeStructArrayType;\n\n    StructArrayType.prototype = Object.create(StructArray.prototype);\n    StructArrayType.prototype.StructType = StructType;\n    StructArrayType.prototype.bytesPerElement = StructType.prototype.size;\n    StructArrayType.prototype.emplaceBack = createEmplaceBack(StructType.prototype.members, StructType.prototype.size);\n    StructArrayType.prototype._usedTypes = usedTypes;\n\n\n    structArrayTypeCache[key] = StructArrayType;\n\n    return StructArrayType;\n}\n\n/**\n * Serialize the StructArray type. This serializes the *type* not an instance of the type.\n * @private\n */\nfunction serializeStructArrayType() {\n    return {\n        members: this.prototype.StructType.prototype.members,\n        alignment: this.prototype.StructType.prototype.alignment,\n        bytesPerElement: this.prototype.bytesPerElement\n    };\n}\n\n\nfunction align(offset, size) {\n    return Math.ceil(offset / size) * size;\n}\n\nfunction sizeOf(type) {\n    return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction getArrayViewName(type) {\n    return type.toLowerCase();\n}\n\n\n/*\n * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming\n * > elementIndex to i) (likely due to v8 inlining heuristics).\n * - lucaswoj\n */\nfunction createEmplaceBack(members, bytesPerElement) {\n    var usedTypeSizes = [];\n    var argNames = [];\n    var body = '' +\n    'var i = this.length;\\n' +\n    'this.resize(this.length + 1);\\n';\n\n    for (var m = 0; m < members.length; m++) {\n        var member = members[m];\n        var size = sizeOf(member.type);\n\n        // array offsets to the end of current data for each type size\n        // var o{SIZE} = i * ROUNDED(bytesPerElement / size);\n        if (usedTypeSizes.indexOf(size) < 0) {\n            usedTypeSizes.push(size);\n            body += 'var o' + size.toFixed(0) + ' = i * ' + (bytesPerElement / size).toFixed(0) + ';\\n';\n        }\n\n        for (var c = 0; c < member.components; c++) {\n            // arguments v0, v1, v2, ... are, in order, the components of\n            // member 0, then the components of member 1, etc.\n            var argName = 'v' + argNames.length;\n            // The index for `member` component `c` into the appropriate type array is:\n            // this.{TYPE}[o{SIZE} + MEMBER_OFFSET + {c}] = v{X}\n            // where MEMBER_OFFSET = ROUND(member.offset / size) is the per-element\n            // offset of this member into the array\n            var index = 'o' + size.toFixed(0) + ' + ' + (member.offset / size + c).toFixed(0);\n            body += 'this.' + getArrayViewName(member.type) + '[' + index + '] = ' + argName + ';\\n';\n            argNames.push(argName);\n        }\n    }\n\n    body += 'return i;';\n\n    return new Function(argNames, body);\n}\n\nfunction createMemberComponentString(member, component) {\n    var elementOffset = 'this._pos' + sizeOf(member.type).toFixed(0);\n    var componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0);\n    var index = elementOffset + ' + ' + componentOffset;\n    return 'this._structArray.' + getArrayViewName(member.type) + '[' + index + ']';\n\n}\n\nfunction createGetter(member, c) {\n    return new Function([], 'return ' + createMemberComponentString(member, c) + ';');\n}\n\nfunction createSetter(member, c) {\n    return new Function(['x'], createMemberComponentString(member, c) + ' = x;');\n}\n\n/**\n * @class Struct\n * @param {StructArray} structArray The StructArray the struct is stored in\n * @param {number} index The index of the struct in the StructArray.\n * @private\n */\nfunction Struct(structArray, index) {\n    this._structArray = structArray;\n    this._pos1 = index * this.size;\n    this._pos2 = this._pos1 / 2;\n    this._pos4 = this._pos1 / 4;\n    this._pos8 = this._pos1 / 8;\n}\n\n/**\n * @class StructArray\n * The StructArray class is inherited by the custom StructArrayType classes created with\n * `new StructArrayType(members, options)`.\n * @private\n */\nfunction StructArray(serialized) {\n    if (serialized !== undefined) {\n    // Create from an serialized StructArray\n        this.arrayBuffer = serialized.arrayBuffer;\n        this.length = serialized.length;\n        this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement;\n        this._refreshViews();\n\n    // Create a new StructArray\n    } else {\n        this.capacity = -1;\n        this.resize(0);\n    }\n}\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.DEFAULT_CAPACITY = 128;\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.RESIZE_MULTIPLIER = 5;\n\n/**\n * Serialize this StructArray instance\n * @private\n */\nStructArray.prototype.serialize = function() {\n    this.trim();\n    return {\n        length: this.length,\n        arrayBuffer: this.arrayBuffer\n    };\n};\n\n/**\n * Return the Struct at the given location in the array.\n * @private\n * @param {number} index The index of the element.\n */\nStructArray.prototype.get = function(index) {\n    return new this.StructType(this, index);\n};\n\n/**\n * Resize the array to discard unused capacity.\n * @private\n */\nStructArray.prototype.trim = function() {\n    if (this.length !== this.capacity) {\n        this.capacity = this.length;\n        this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n        this._refreshViews();\n    }\n};\n\n/**\n * Resize the array.\n * If `n` is greater than the current length then additional elements with undefined values are added.\n * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n * @param {number} n The new size of the array.\n */\nStructArray.prototype.resize = function(n) {\n    this.length = n;\n    if (n > this.capacity) {\n        this.capacity = Math.max(n, Math.floor(this.capacity * this.RESIZE_MULTIPLIER), this.DEFAULT_CAPACITY);\n        this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n        var oldUint8Array = this.uint8;\n        this._refreshViews();\n        if (oldUint8Array) this.uint8.set(oldUint8Array);\n    }\n};\n\n/**\n * Create TypedArray views for the current ArrayBuffer.\n * @private\n */\nStructArray.prototype._refreshViews = function() {\n    for (var t = 0; t < this._usedTypes.length; t++) {\n        var type = this._usedTypes[t];\n        this[getArrayViewName(type)] = new viewTypes[type](this.arrayBuffer);\n    }\n};\n\n/**\n * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting\n * @param {number} startIndex\n * @param {number} endIndex\n * @private\n */\nStructArray.prototype.toArray = function(startIndex, endIndex) {\n    var array = [];\n\n    for (var i = startIndex; i < endIndex; i++) {\n        var struct = this.get(i);\n        array.push(struct);\n    }\n\n    return array;\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(688);\nvar enumBugKeys = __webpack_require__(327);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(67);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(13);\nvar dPs = __webpack_require__(689);\nvar enumBugKeys = __webpack_require__(327);\nvar IE_PROTO = __webpack_require__(326)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(324)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(328).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(688);\nvar hiddenKeys = __webpack_require__(327).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(16);\nvar dP = __webpack_require__(31);\nvar DESCRIPTORS = __webpack_require__(27);\nvar SPECIES = __webpack_require__(23)('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(65);\nvar call = __webpack_require__(701);\nvar isArrayIter = __webpack_require__(339);\nvar anObject = __webpack_require__(13);\nvar toLength = __webpack_require__(25);\nvar getIterFn = __webpack_require__(341);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar redefine = __webpack_require__(50);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(20);\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar analytics = {};\nvar injectRavenPayload;\nvar handleDispatcherAction;\nvar lastKnownActionPayload = null;\n\nvar ga = __webpack_require__(841);\nvar heap = __webpack_require__(842);\nvar type = __webpack_require__(843);\nvar Raven = __webpack_require__(844);\nvar uuid = __webpack_require__(503);\nvar location = __webpack_require__(845);\nvar assign = __webpack_require__(846);\nvar Dispatcher = __webpack_require__(15).Dispatcher;\n\nvar subdomains = location.hostname.split('.');\nvar baseDomain = subdomains.slice(1).join('.');\n\nvar defaults = {\n  role: null,\n  userId: null,\n  ravenDSN: '',\n  RavenConfig: {},\n  userEntityId: null,\n  webPropertyId: null\n};\n\nanalytics.initialize = function (options) {\n\n  if (analytics.didInitialize) {\n    throw new Error('Analytics has already initialized');\n  }\n\n  var config = {};\n  analytics.didInitialize = true;\n  ga.initialize();\n\n  config = assign(config, defaults, options);\n\n  if (window.gon) {\n    config.role = gon.role || config.role;\n    config.userId = gon.userId || config.userId;\n    config.ravenDSN = gon.ravenDSN || config.ravenDSN;\n    config.userEntityId = gon.userEntityId || config.userEntityId;\n    config.webPropertyId = gon.gaPropertyId || config.webPropertyId;\n    config.heapProjectId = gon.heapProjectId || config.heapProjectId;\n  }\n\n  analytics.config = config;\n  analytics.pageId = uuid.generate();\n\n  analytics.Raven = Raven;\n  window.Raven = Raven;\n\n  analytics.Raven.config(config.ravenDSN, assign({ dataCallback: injectRavenPayload }, config.RavenConfig)).install();\n\n  Dispatcher.register(handleDispatcherAction);\n  heap.initialize(config.heapProjectId);\n\n  analytics.ga('create', config.webPropertyId);\n  analytics.setUserId(config.userId);\n  analytics.setEntityId(config.userEntityId);\n  analytics.setRole(config.role);\n  analytics.setSubdomain(subdomains[0]);\n  analytics.setBaseDomain(baseDomain);\n  analytics.ga('send', 'pageview');\n};\n\nanalytics.updateSentryUser = function (user) {\n\n  var defaults = {\n    role: analytics.config.role,\n    id: analytics.config.userId\n  };\n  // setUser is Removed/Deprecated in 1.1.16, but npm doesn't have the updated version\n  var ravenUserSetter = analytics.Raven.setUserContext ? analytics.Raven.setUserContext : analytics.Raven.setUser;\n\n  ravenUserSetter(assign(defaults, user || {}));\n};\n\nanalytics.ga = function () {\n\n  if (analytics.config.webPropertyId) {\n    ga.ga.apply(window, arguments);\n  }\n};\n\n/**\n * pushes an event to google analytics\n *\n * @deprecated\n * @param category\n * @param action\n * @param label\n * @param value\n */\nanalytics.pushEvent = function (category, action, label, value) {\n  analytics.ga('send', 'event', category, action, label, value);\n};\n\n/**\n * pushes a page view to both google analytics\n *\n * @param url\n */\nanalytics.pushPageView = function (url) {\n  analytics.ga('send', 'pageview', url);\n};\n\nanalytics.setReportId = function (reportId) {\n  analytics.ga('set', 'dimension6', reportId);\n};\n\nanalytics.setUserId = function (userId) {\n  analytics.config.userId = userId;\n  analytics.ga('set', '&uid', userId);\n  analytics.ga('set', 'dimension1', userId);\n  analytics.updateSentryUser();\n};\n\nanalytics.setEntityId = function (entityId) {\n  analytics.config.entityId = entityId;\n  analytics.ga('set', 'dimension2', entityId);\n};\n\nanalytics.setSubdomain = function (subdomain) {\n  analytics.ga('set', 'dimension3', subdomain);\n};\n\nanalytics.setRole = function (role) {\n  analytics.config.role = role;\n  analytics.ga('set', 'dimension4', role);\n  analytics.updateSentryUser();\n};\n\nanalytics.setBaseDomain = function (baseDomain) {\n  analytics.ga('set', 'dimension5', baseDomain);\n};\n\n/**\n * extracts primitive data from the dispatcher payload\n *\n * @param payload\n */\nhandleDispatcherAction = function handleDispatcherAction(payload) {\n  var actionPayload = {};\n  var action = payload.action;\n\n  var serialize = function serialize(value) {\n\n    var isPrimitive = type.isUndefined(value) || type.isNull(value) || type.isBoolean(value) || type.isNumber(value) || type.isString(value);\n\n    if (isPrimitive) {\n      return value;\n    } else if (type.isObject(value) || type.isArray(value)) {\n      return value && value.id ? '_id:' + value.id : '[object Object]';\n    }\n  };\n\n  for (var key in action) {\n    if (action.hasOwnProperty(key)) {\n\n      var value = action[key];\n\n      if (type.isArray(value)) {\n        var more = value.length - 3;\n        actionPayload[key] = value.map(serialize).slice(0, 3);\n        actionPayload[key].push('...' + (more > 0 ? more : 0) + ' more');\n      } else {\n        actionPayload[key] = serialize(value);\n      }\n    }\n  }\n\n  lastKnownActionPayload = actionPayload;\n};\n\n/**\n * Injects the raven payload on every request with\n * analytics data using the 'extra' field\n *\n * @param payload\n * @returns {*}\n */\ninjectRavenPayload = function injectRavenPayload(payload) {\n\n  var defaults = {\n    lastAction: lastKnownActionPayload,\n    isDispatching: Dispatcher.isDispatching(),\n    userId: analytics.config.userId,\n    pageId: analytics.pageId\n  };\n\n  payload.event_id = uuid.generate().replace(/-/g, '');\n  payload.extra = assign({}, defaults, payload.extra);\n\n  return payload;\n};\n\nmodule.exports = analytics;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar invariant = __webpack_require__(26);\nvar canUseDOM = __webpack_require__(181);\n\nvar History = {\n\n  /**\n   * The current number of entries in the history.\n   *\n   * Note: This property is read-only.\n   */\n  length: 1,\n\n  /**\n   * Sends the browser back one entry in the history.\n   */\n  back: function back() {\n    invariant(canUseDOM, 'Cannot use History.back without a DOM');\n\n    // Do this first so that History.length will\n    // be accurate in location change listeners.\n    History.length -= 1;\n\n    window.history.back();\n  }\n\n};\n\nmodule.exports = History;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.assetPath = assetPath;\nvar basePath = gon.asset_path || '';\nvar assetManifest = gon.asset_manifest;\nfunction assetPath(assetName) {\n    if (assetManifest) {\n        assetName = assetManifest[assetName];\n    }\n    return basePath + '/' + assetName;\n}\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getAmountExtractorFor = getAmountExtractorFor;\nexports.createValueExtractorForType = createValueExtractorForType;\nexports.findColumnByName = findColumnByName;\nexports.getColumnTypeByName = getColumnTypeByName;\nexports.hasMapColumns = hasMapColumns;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getAmountExtractorFor(schema) {\n    var amountColumn = schema.get('amountColumn');\n    return function (d) {\n        return d[amountColumn];\n    };\n}\nfunction createValueExtractorForType(schema, type) {\n    var columns = schema.get('columns');\n    var column = columns.find(function (c) {\n        return c.get('type') == type;\n    });\n    return function (r) {\n        return r && r[column.get('name')] && parseFloat(r[column.get('name')]);\n    };\n}\nfunction findColumnByName(schema, columnName) {\n    return schema.get('columns').find(function (c) {\n        return c.get('name') === columnName;\n    });\n}\nfunction getColumnTypeByName(schema, columnName) {\n    var column = findColumnByName(schema, columnName);\n    return column ? column.get('type') : null;\n}\nfunction hasMapColumns(schema) {\n    return schema.get('columns').some(function (column) {\n        return _lodash2.default.includes(_map_constants.AllMapDataTypes, column.get('type'));\n    });\n}\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/**\r\n * Returns a call to the Intercom Api registering a tracked event.\r\n * @param   {String} eventName       The name of the event to be tracked. Preferably of the format: 'update-report'.\r\n * @param   {Object} event metadata to be passed along with the tracked event\r\n */\nvar trackIntercomEvent = exports.trackIntercomEvent = function trackIntercomEvent(eventName, eventMetadata) {\n  return window.Intercom && window.Intercom('trackEvent', eventName, eventMetadata);\n};\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar config = __webpack_require__(556);\nvar browser = __webpack_require__(39);\n\nfunction normalizeURL(url, pathPrefix, accessToken) {\n    accessToken = accessToken || config.ACCESS_TOKEN;\n\n    if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {\n        throw new Error('An API access token is required to use Mapbox GL. ' +\n            'See https://www.mapbox.com/developers/api/#access-tokens');\n    }\n\n    url = url.replace(/^mapbox:\\/\\//, config.API_URL + pathPrefix);\n    url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';\n\n    if (config.REQUIRE_ACCESS_TOKEN) {\n        if (accessToken[0] === 's') {\n            throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +\n                'See https://www.mapbox.com/developers/api/#access-tokens');\n        }\n\n        url += accessToken;\n    }\n\n    return url;\n}\n\nmodule.exports.normalizeStyleURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\/styles\\//))\n        return url;\n\n    var split = url.split('/');\n    var user = split[3];\n    var style = split[4];\n    var draft = split[5] ? '/draft' : '';\n    return normalizeURL('mapbox://' + user + '/' + style + draft, '/styles/v1/', accessToken);\n};\n\nmodule.exports.normalizeSourceURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\//))\n        return url;\n\n    // TileJSON requests need a secure flag appended to their URLs so\n    // that the server knows to send SSL-ified resource references.\n    return normalizeURL(url + '.json', '/v4/', accessToken) + '&secure';\n};\n\nmodule.exports.normalizeGlyphsURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\//))\n        return url;\n\n    var user = url.split('/')[3];\n    return normalizeURL('mapbox://' + user + '/{fontstack}/{range}.pbf', '/fonts/v1/', accessToken);\n};\n\nmodule.exports.normalizeSpriteURL = function(url, format, ext, accessToken) {\n    if (!url.match(/^mapbox:\\/\\/sprites\\//))\n        return url + format + ext;\n\n    var split = url.split('/');\n    var user = split[3];\n    var style = split[4];\n    var draft = split[5] ? '/draft' : '';\n    return normalizeURL('mapbox://' + user + '/' + style + draft + '/sprite' + format + ext, '/styles/v1/', accessToken);\n};\n\nmodule.exports.normalizeTileURL = function(url, sourceUrl, tileSize) {\n    if (!sourceUrl || !sourceUrl.match(/^mapbox:\\/\\//))\n        return url;\n\n    // The v4 mapbox tile API supports 512x512 image tiles only when @2x\n    // is appended to the tile URL. If `tileSize: 512` is specified for\n    // a Mapbox raster source force the @2x suffix even if a non hidpi\n    // device.\n    url = url.replace(/([?&]access_token=)tk\\.[^&]+/, '$1' + config.ACCESS_TOKEN);\n    var extension = browser.supportsWebp ? 'webp' : '$1';\n    return url.replace(/\\.((?:png|jpg)\\d*)(?=$|\\?)/, browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x.' + extension : '.' + extension);\n};\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nmodule.exports = Pbf;\n\nvar Buffer = global.Buffer || __webpack_require__(1031);\n\nfunction Pbf(buf) {\n    this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf;\n    this.pos = 0;\n    this.length = this.buf.length;\n}\n\nPbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\nPbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32,\n    POW_2_63 = Math.pow(2, 63);\n\nPbf.prototype = {\n\n    destroy: function() {\n        this.buf = null;\n    },\n\n    // === READING =================================================================\n\n    readFields: function(readField, result, end) {\n        end = end || this.length;\n\n        while (this.pos < end) {\n            var val = this.readVarint(),\n                tag = val >> 3,\n                startPos = this.pos;\n\n            readField(tag, result, this);\n\n            if (this.pos === startPos) this.skip(val);\n        }\n        return result;\n    },\n\n    readMessage: function(readField, result) {\n        return this.readFields(readField, result, this.readVarint() + this.pos);\n    },\n\n    readFixed32: function() {\n        var val = this.buf.readUInt32LE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    readSFixed32: function() {\n        var val = this.buf.readInt32LE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n    readFixed64: function() {\n        var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readSFixed64: function() {\n        var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readFloat: function() {\n        var val = this.buf.readFloatLE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    readDouble: function() {\n        var val = this.buf.readDoubleLE(this.pos);\n        this.pos += 8;\n        return val;\n    },\n\n    readVarint: function() {\n        var buf = this.buf,\n            val, b;\n\n        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;\n\n        return readVarintRemainder(val, this);\n    },\n\n    readVarint64: function() {\n        var startPos = this.pos,\n            val = this.readVarint();\n\n        if (val < POW_2_63) return val;\n\n        var pos = this.pos - 2;\n        while (this.buf[pos] === 0xff) pos--;\n        if (pos < startPos) pos = startPos;\n\n        val = 0;\n        for (var i = 0; i < pos - startPos + 1; i++) {\n            var b = ~this.buf[startPos + i] & 0x7f;\n            val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7);\n        }\n\n        return -val - 1;\n    },\n\n    readSVarint: function() {\n        var num = this.readVarint();\n        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n    },\n\n    readBoolean: function() {\n        return Boolean(this.readVarint());\n    },\n\n    readString: function() {\n        var end = this.readVarint() + this.pos,\n            str = this.buf.toString('utf8', this.pos, end);\n        this.pos = end;\n        return str;\n    },\n\n    readBytes: function() {\n        var end = this.readVarint() + this.pos,\n            buffer = this.buf.slice(this.pos, end);\n        this.pos = end;\n        return buffer;\n    },\n\n    // verbose for performance reasons; doesn't affect gzipped size\n\n    readPackedVarint: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readVarint());\n        return arr;\n    },\n    readPackedSVarint: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSVarint());\n        return arr;\n    },\n    readPackedBoolean: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readBoolean());\n        return arr;\n    },\n    readPackedFloat: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFloat());\n        return arr;\n    },\n    readPackedDouble: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readDouble());\n        return arr;\n    },\n    readPackedFixed32: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFixed32());\n        return arr;\n    },\n    readPackedSFixed32: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSFixed32());\n        return arr;\n    },\n    readPackedFixed64: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFixed64());\n        return arr;\n    },\n    readPackedSFixed64: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSFixed64());\n        return arr;\n    },\n\n    skip: function(val) {\n        var type = val & 0x7;\n        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}\n        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;\n        else if (type === Pbf.Fixed32) this.pos += 4;\n        else if (type === Pbf.Fixed64) this.pos += 8;\n        else throw new Error('Unimplemented type: ' + type);\n    },\n\n    // === WRITING =================================================================\n\n    writeTag: function(tag, type) {\n        this.writeVarint((tag << 3) | type);\n    },\n\n    realloc: function(min) {\n        var length = this.length || 16;\n\n        while (length < this.pos + min) length *= 2;\n\n        if (length !== this.length) {\n            var buf = new Buffer(length);\n            this.buf.copy(buf);\n            this.buf = buf;\n            this.length = length;\n        }\n    },\n\n    finish: function() {\n        this.length = this.pos;\n        this.pos = 0;\n        return this.buf.slice(0, this.length);\n    },\n\n    writeFixed32: function(val) {\n        this.realloc(4);\n        this.buf.writeUInt32LE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeSFixed32: function(val) {\n        this.realloc(4);\n        this.buf.writeInt32LE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeFixed64: function(val) {\n        this.realloc(8);\n        this.buf.writeInt32LE(val & -1, this.pos);\n        this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeSFixed64: function(val) {\n        this.realloc(8);\n        this.buf.writeInt32LE(val & -1, this.pos);\n        this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeVarint: function(val) {\n        val = +val;\n\n        if (val > 0xfffffff) {\n            writeBigVarint(val, this);\n            return;\n        }\n\n        this.realloc(4);\n\n        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] =   (val >>> 7) & 0x7f;\n    },\n\n    writeSVarint: function(val) {\n        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n    },\n\n    writeBoolean: function(val) {\n        this.writeVarint(Boolean(val));\n    },\n\n    writeString: function(str) {\n        str = String(str);\n        var bytes = Buffer.byteLength(str);\n        this.writeVarint(bytes);\n        this.realloc(bytes);\n        this.buf.write(str, this.pos);\n        this.pos += bytes;\n    },\n\n    writeFloat: function(val) {\n        this.realloc(4);\n        this.buf.writeFloatLE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeDouble: function(val) {\n        this.realloc(8);\n        this.buf.writeDoubleLE(val, this.pos);\n        this.pos += 8;\n    },\n\n    writeBytes: function(buffer) {\n        var len = buffer.length;\n        this.writeVarint(len);\n        this.realloc(len);\n        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n    },\n\n    writeRawMessage: function(fn, obj) {\n        this.pos++; // reserve 1 byte for short message length\n\n        // write the message directly to the buffer and see how much was written\n        var startPos = this.pos;\n        fn(obj, this);\n        var len = this.pos - startPos;\n\n        if (len >= 0x80) reallocForRawMessage(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    },\n\n    writeMessage: function(tag, fn, obj) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeRawMessage(fn, obj);\n    },\n\n    writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },\n    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },\n    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },\n    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },\n    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },\n    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },\n    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },\n    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },\n    writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },\n\n    writeBytesField: function(tag, buffer) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeBytes(buffer);\n    },\n    writeFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFixed32(val);\n    },\n    writeSFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeSFixed32(val);\n    },\n    writeFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeFixed64(val);\n    },\n    writeSFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeSFixed64(val);\n    },\n    writeVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeVarint(val);\n    },\n    writeSVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeSVarint(val);\n    },\n    writeStringField: function(tag, str) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeString(str);\n    },\n    writeFloatField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFloat(val);\n    },\n    writeDoubleField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeDouble(val);\n    },\n    writeBooleanField: function(tag, val) {\n        this.writeVarintField(tag, Boolean(val));\n    }\n};\n\nfunction readVarintRemainder(val, pbf) {\n    var buf = pbf.buf, b;\n\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x10000000;         if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x800000000;        if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x40000000000;      if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x2000000000000;    if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x100000000000000;  if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val;\n\n    throw new Error('Expected varint not more than 10 bytes');\n}\n\nfunction writeBigVarint(val, pbf) {\n    pbf.realloc(10);\n\n    var maxPos = pbf.pos + 10;\n\n    while (val >= 1) {\n        if (pbf.pos >= maxPos) throw new Error('Given varint doesn\\'t fit into 10 bytes');\n        var b = val & 0xff;\n        pbf.buf[pbf.pos++] = b | (val >= 0x80 ? 0x80 : 0);\n        val /= 0x80;\n    }\n}\n\nfunction reallocForRawMessage(startPos, len, pbf) {\n    var extraLen =\n        len <= 0x3fff ? 1 :\n        len <= 0x1fffff ? 2 :\n        len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));\n\n    // if 1 byte isn't enough for encoding message length, shift the data to the right\n    pbf.realloc(extraLen);\n    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];\n}\n\nfunction writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }\nfunction writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }\nfunction writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }\nfunction writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }\nfunction writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }\nfunction writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }\nfunction writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }\nfunction writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }\nfunction writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = createFilter;\n\nvar types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\n/**\n * Given a filter expressed as nested arrays, return a new function\n * that evaluates whether a given feature (with a .properties or .tags property)\n * passes its test.\n *\n * @param {Array} filter mapbox gl filter\n * @returns {Function} filter-evaluating function\n */\nfunction createFilter(filter) {\n    return new Function('f', 'var p = (f && f.properties || {}); return ' + compile(filter));\n}\n\nfunction compile(filter) {\n    if (!filter) return 'true';\n    var op = filter[0];\n    if (filter.length <= 1) return op === 'any' ? 'false' : 'true';\n    var str =\n        op === '==' ? compileComparisonOp(filter[1], filter[2], '===', false) :\n        op === '!=' ? compileComparisonOp(filter[1], filter[2], '!==', false) :\n        op === '<' ||\n        op === '>' ||\n        op === '<=' ||\n        op === '>=' ? compileComparisonOp(filter[1], filter[2], op, true) :\n        op === 'any' ? compileLogicalOp(filter.slice(1), '||') :\n        op === 'all' ? compileLogicalOp(filter.slice(1), '&&') :\n        op === 'none' ? compileNegation(compileLogicalOp(filter.slice(1), '||')) :\n        op === 'in' ? compileInOp(filter[1], filter.slice(2)) :\n        op === '!in' ? compileNegation(compileInOp(filter[1], filter.slice(2))) :\n        op === 'has' ? compileHasOp(filter[1]) :\n        op === '!has' ? compileNegation(compileHasOp([filter[1]])) :\n        'true';\n    return '(' + str + ')';\n}\n\nfunction compilePropertyReference(property) {\n    return property === '$type' ? 'f.type' :\n        property === '$id' ? 'f.id' :\n        'p[' + JSON.stringify(property) + ']';\n}\n\nfunction compileComparisonOp(property, value, op, checkType) {\n    var left = compilePropertyReference(property);\n    var right = property === '$type' ? types.indexOf(value) : JSON.stringify(value);\n    return (checkType ? 'typeof ' + left + '=== typeof ' + right + '&&' : '') + left + op + right;\n}\n\nfunction compileLogicalOp(expressions, op) {\n    return expressions.map(compile).join(op);\n}\n\nfunction compileInOp(property, values) {\n    if (property === '$type') values = values.map(function(value) { return types.indexOf(value); });\n    var left = JSON.stringify(values.sort(compare));\n    var right = compilePropertyReference(property);\n\n    if (values.length <= 200) return left + '.indexOf(' + right + ') !== -1';\n\n    return 'function(v, a, i, j) {' +\n        'while (i <= j) { var m = (i + j) >> 1;' +\n        '    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;' +\n        '}' +\n    'return false; }(' + right + ', ' + left + ',0,' + (values.length - 1) + ')';\n}\n\nfunction compileHasOp(property) {\n    return JSON.stringify(property) + ' in p';\n}\n\nfunction compileNegation(expression) {\n    return '!(' + expression + ')';\n}\n\n// Comparison function to sort numbers and strings\nfunction compare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar PI = Math.PI;\nvar pow = Math.pow;\nvar tan = Math.tan;\nvar log = Math.log;\nvar atan = Math.atan;\nvar exp = Math.exp;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nfunction radians(value) {\n  return value * DEGREES_TO_RADIANS;\n}\nfunction degrees(value) {\n  return value * RADIANS_TO_DEGREES;\n}\n// see: https://en.wikipedia.org/wiki/Web_Mercator\nfunction ViewportMercator(opts) {\n  var scale = (opts.tileSize || 512) * 0.5 / PI * pow(2, opts.zoom);\n  var lamda = radians(opts.longitude);\n  var phi = radians(opts.latitude);\n  var x = scale * (lamda + PI);\n  var y = scale * (PI - log(tan(PI * 0.25 + phi * 0.5)));\n  var offsetX = opts.width * 0.5 - x;\n  var offsetY = opts.height * 0.5 - y;\n\n  function project(lnglat2) {\n    var lamda2 = lnglat2[0] * DEGREES_TO_RADIANS;\n    var phi2 = lnglat2[1] * DEGREES_TO_RADIANS;\n    var x2 = scale * (lamda2 + PI);\n    var y2 = scale * (PI - log(tan(PI * 0.25 + phi2 * 0.5)));\n    return [x2 + offsetX, y2 + offsetY];\n  }\n\n  function unproject(xy) {\n    var x2 = xy[0] - offsetX;\n    var y2 = xy[1] - offsetY;\n    var lamda2 = x2 / scale - PI;\n    var phi2 = 2 * (atan(exp(PI - y2 / scale)) - PI * 0.25);\n    return [degrees(lamda2), degrees(phi2)];\n  }\n\n  function contains(lnglat2) {\n    var xy = project(lnglat2);\n    var x = xy[0];\n    var y = xy[1];\n    return (\n      x >= 0 && x <= opts.width &&\n      y >= 0 && y <= opts.height\n    );\n  }\n\n  return {project: project, unproject: unproject, contains: contains};\n}\n\nmodule.exports = ViewportMercator;\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(1202),\n    getPrototype = __webpack_require__(1207),\n    isObjectLike = __webpack_require__(1209);\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar getType = __webpack_require__(72);\nvar extend = __webpack_require__(630);\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n//   for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n//   high level object that needs to be descended into deeper or a simple\n//   scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n\nmodule.exports = function validate(options) {\n\n    var validateFunction = __webpack_require__(631);\n    var validateObject = __webpack_require__(160);\n    var VALIDATORS = {\n        '*': function() {\n            return [];\n        },\n        'array': __webpack_require__(632),\n        'boolean': __webpack_require__(1345),\n        'number': __webpack_require__(633),\n        'color': __webpack_require__(1346),\n        'constants': __webpack_require__(629),\n        'enum': __webpack_require__(310),\n        'filter': __webpack_require__(311),\n        'function': __webpack_require__(631),\n        'layer': __webpack_require__(634),\n        'object': __webpack_require__(160),\n        'source': __webpack_require__(637),\n        'string': __webpack_require__(638)\n    };\n\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (getType(value) === 'string' && value[0] === '@') {\n        if (styleSpec.$version > 7) {\n            return [new ValidationError(key, value, 'constants have been deprecated as of v8')];\n        }\n        if (!(value in style.constants)) {\n            return [new ValidationError(key, value, 'constant \"%s\" not found', value)];\n        }\n        options = extend({}, options, { value: style.constants[value] });\n    }\n\n    if (valueSpec.function && getType(value) === 'object') {\n        return validateFunction(options);\n\n    } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n        return VALIDATORS[valueSpec.type](options);\n\n    } else {\n        return validateObject(extend({}, options, {\n            valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n        }));\n    }\n};\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar config = __webpack_require__(639);\nvar browser = __webpack_require__(37);\nvar URL = __webpack_require__(1355);\nvar util = __webpack_require__(6);\n\nfunction normalizeURL(url, pathPrefix, accessToken) {\n    accessToken = accessToken || config.ACCESS_TOKEN;\n\n    if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {\n        throw new Error('An API access token is required to use Mapbox GL. ' +\n            'See https://www.mapbox.com/developers/api/#access-tokens');\n    }\n\n    url = url.replace(/^mapbox:\\/\\//, config.API_URL + pathPrefix);\n    url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';\n\n    if (config.REQUIRE_ACCESS_TOKEN) {\n        if (accessToken[0] === 's') {\n            throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +\n                'See https://www.mapbox.com/developers/api/#access-tokens');\n        }\n\n        url += accessToken;\n    }\n\n    return url;\n}\n\nmodule.exports.normalizeStyleURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        return normalizeURL(\n            'mapbox:/' + urlObject.pathname + formatQuery(urlObject.query),\n            '/styles/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeSourceURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        // TileJSON requests need a secure flag appended to their URLs so\n        // that the server knows to send SSL-ified resource references.\n        return normalizeURL(\n            url + '.json',\n            '/v4/',\n            accessToken\n        ) + '&secure';\n    }\n\n};\n\nmodule.exports.normalizeGlyphsURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        var user = urlObject.pathname.split('/')[1];\n        return normalizeURL(\n            'mapbox://' + user + '/{fontstack}/{range}.pbf' + formatQuery(urlObject.query),\n            '/fonts/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeSpriteURL = function(url, format, extension, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        urlObject.pathname += format + extension;\n        return URL.format(urlObject);\n    } else {\n        return normalizeURL(\n            'mapbox:/' + urlObject.pathname + '/sprite' + format + extension + formatQuery(urlObject.query),\n            '/styles/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeTileURL = function(tileURL, sourceURL, tileSize) {\n    var tileURLObject = URL.parse(tileURL, true);\n    if (!sourceURL) return tileURL;\n    var sourceURLObject = URL.parse(sourceURL);\n    if (sourceURLObject.protocol !== 'mapbox:') return tileURL;\n\n    // The v4 mapbox tile API supports 512x512 image tiles only when @2x\n    // is appended to the tile URL. If `tileSize: 512` is specified for\n    // a Mapbox raster source force the @2x suffix even if a non hidpi\n    // device.\n\n    var extension = browser.supportsWebp ? '.webp' : '$1';\n    var resolution = (browser.devicePixelRatio >= 2 || tileSize === 512) ? '@2x' : '';\n\n    return URL.format({\n        protocol: tileURLObject.protocol,\n        hostname: tileURLObject.hostname,\n        pathname: tileURLObject.pathname.replace(/(\\.(?:png|jpg)\\d*)/, resolution + extension),\n        query: replaceTempAccessToken(tileURLObject.query)\n    });\n};\n\nfunction formatQuery(query) {\n    return (query ? '?' + query : '');\n}\n\nfunction replaceTempAccessToken(query) {\n    if (query.access_token && query.access_token.slice(0, 3) === 'tk.') {\n        return util.extend({}, query, {\n            'access_token': config.ACCESS_TOKEN\n        });\n    } else {\n        return query;\n    }\n}\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.calculateLengthFromValueWithUnit = exports.LENGTH_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _NodeContainer = __webpack_require__(225);\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar LENGTH_WITH_UNIT = /([\\d.]+)(px|r?em|%)/i;\n\nvar LENGTH_TYPE = exports.LENGTH_TYPE = {\n    PX: 0,\n    PERCENTAGE: 1\n};\n\nvar Length = function () {\n    function Length(value) {\n        _classCallCheck(this, Length);\n\n        this.type = value.substr(value.length - 1) === '%' ? LENGTH_TYPE.PERCENTAGE : LENGTH_TYPE.PX;\n        var parsedValue = parseFloat(value);\n        if (false) {\n            console.error('Invalid value given for Length: \"' + value + '\"');\n        }\n        this.value = isNaN(parsedValue) ? 0 : parsedValue;\n    }\n\n    _createClass(Length, [{\n        key: 'isPercentage',\n        value: function isPercentage() {\n            return this.type === LENGTH_TYPE.PERCENTAGE;\n        }\n    }, {\n        key: 'getAbsoluteValue',\n        value: function getAbsoluteValue(parentLength) {\n            return this.isPercentage() ? parentLength * (this.value / 100) : this.value;\n        }\n    }], [{\n        key: 'create',\n        value: function create(v) {\n            return new Length(v);\n        }\n    }]);\n\n    return Length;\n}();\n\nexports.default = Length;\n\n\nvar getRootFontSize = function getRootFontSize(container) {\n    var parent = container.parent;\n    return parent ? getRootFontSize(parent) : parseFloat(container.style.font.fontSize);\n};\n\nvar calculateLengthFromValueWithUnit = exports.calculateLengthFromValueWithUnit = function calculateLengthFromValueWithUnit(container, value, unit) {\n    switch (unit) {\n        case 'px':\n        case '%':\n            return new Length(value + unit);\n        case 'em':\n        case 'rem':\n            var length = new Length(value);\n            length.value *= unit === 'em' ? parseFloat(container.style.font.fontSize) : getRootFontSize(container);\n            return length;\n        default:\n            // TODO: handle correctly if unknown unit is used\n            return new Length('0');\n    }\n};\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(31).f;\nvar has = __webpack_require__(57);\nvar TAG = __webpack_require__(23)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(66);\nvar TAG = __webpack_require__(23)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar defined = __webpack_require__(74);\nvar fails = __webpack_require__(19);\nvar spaces = __webpack_require__(330);\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n  var exp = {};\n  var FORCE = fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  });\n  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n  if (ALIAS) exp[ALIAS] = fn;\n  $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(828);\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EventEmitter = function () {\n\tfunction EventEmitter() {\n\t\t_classCallCheck(this, EventEmitter);\n\n\t\tthis.observers = {};\n\t}\n\n\tEventEmitter.prototype.on = function on(events, listener) {\n\t\tvar _this = this;\n\n\t\tevents.split(' ').forEach(function (event) {\n\t\t\t_this.observers[event] = _this.observers[event] || [];\n\t\t\t_this.observers[event].push(listener);\n\t\t});\n\t};\n\n\tEventEmitter.prototype.off = function off(event, listener) {\n\t\tvar _this2 = this;\n\n\t\tif (!this.observers[event]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observers[event].forEach(function () {\n\t\t\tif (!listener) {\n\t\t\t\tdelete _this2.observers[event];\n\t\t\t} else {\n\t\t\t\tvar index = _this2.observers[event].indexOf(listener);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\t_this2.observers[event].splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tEventEmitter.prototype.emit = function emit(event) {\n\t\tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\t\targs[_key - 1] = arguments[_key];\n\t\t}\n\n\t\tif (this.observers[event]) {\n\t\t\tthis.observers[event].forEach(function (observer) {\n\t\t\t\tobserver.apply(undefined, args);\n\t\t\t});\n\t\t}\n\n\t\tif (this.observers['*']) {\n\t\t\tthis.observers['*'].forEach(function (observer) {\n\t\t\t\tvar _ref;\n\n\t\t\t\tobserver.apply(observer, (_ref = [event]).concat.apply(_ref, args));\n\t\t\t});\n\t\t}\n\t};\n\n\treturn EventEmitter;\n}();\n\nexports.default = EventEmitter;\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeString = makeString;\nexports.copy = copy;\nexports.setPath = setPath;\nexports.pushPath = pushPath;\nexports.getPath = getPath;\nexports.deepExtend = deepExtend;\nexports.regexEscape = regexEscape;\nexports.escape = escape;\nfunction makeString(object) {\n  if (object == null) return '';\n  return '' + object;\n}\n\nfunction copy(a, s, t) {\n  a.forEach(function (m) {\n    if (s[m]) t[m] = s[m];\n  });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n  function cleanKey(key) {\n    return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n  }\n\n  var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n  while (stack.length > 1) {\n    if (!object) return {};\n\n    var key = cleanKey(stack.shift());\n    if (!object[key] && Empty) object[key] = new Empty();\n    object = object[key];\n  }\n\n  if (!object) return {};\n  return {\n    obj: object,\n    k: cleanKey(stack.shift())\n  };\n}\n\nfunction setPath(object, path, newValue) {\n  var _getLastOfPath = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath.obj;\n  var k = _getLastOfPath.k;\n\n\n  obj[k] = newValue;\n}\n\nfunction pushPath(object, path, newValue, concat) {\n  var _getLastOfPath2 = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath2.obj;\n  var k = _getLastOfPath2.k;\n\n\n  obj[k] = obj[k] || [];\n  if (concat) obj[k] = obj[k].concat(newValue);\n  if (!concat) obj[k].push(newValue);\n}\n\nfunction getPath(object, path) {\n  var _getLastOfPath3 = getLastOfPath(object, path);\n\n  var obj = _getLastOfPath3.obj;\n  var k = _getLastOfPath3.k;\n\n\n  if (!obj) return undefined;\n  return obj[k];\n}\n\nfunction deepExtend(target, source, overwrite) {\n  for (var prop in source) {\n    if (prop in target) {\n      // If we reached a leaf string in target or source then replace with source or skip depending on the 'overwrite' switch\n      if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n        if (overwrite) target[prop] = source[prop];\n      } else {\n        deepExtend(target[prop], source[prop], overwrite);\n      }\n    } else {\n      target[prop] = source[prop];\n    }\n  }return target;\n}\n\nfunction regexEscape(str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\n\n/* eslint-disable */\nvar _entityMap = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  \"/\": '&#x2F;'\n};\n/* eslint-enable */\n\nfunction escape(data) {\n  if (typeof data === 'string') {\n    return data.replace(/[&<>\"'\\/]/g, function (s) {\n      return _entityMap[s];\n    });\n  } else {\n    return data;\n  }\n}\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Actions that modify the URL.\n */\n\n\nvar LocationActions = {\n\n  /**\n   * Indicates a new location is being pushed to the history stack.\n   */\n  PUSH: 'push',\n\n  /**\n   * Indicates the current location should be replaced.\n   */\n  REPLACE: 'replace',\n\n  /**\n   * Indicates the most recent entry should be removed from the history stack.\n   */\n  POP: 'pop'\n\n};\n\nmodule.exports = LocationActions;\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Field = {\n  propTypes: {\n    name: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.arrayOf(_propTypes2.default.string)]).isRequired,\n    label: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.component]),\n    hint: _propTypes2.default.string,\n    description: _propTypes2.default.string,\n    required: _propTypes2.default.bool\n  },\n\n  renderFieldSet: function renderFieldSet(control) {\n    var validationError = this.getValidationError();\n\n    var _props = this.props,\n        maxLength = _props.maxLength,\n        value = _props.value,\n        name = _props.name,\n        description = _props.description,\n        label = _props.label,\n        hint = _props.hint,\n        required = _props.required;\n\n    var currentLength = value ? value.length : 0;\n\n    if (maxLength && currentLength > maxLength) {\n      validationError = label + ' has a maximum length of ' + maxLength + ' characters';\n    }\n\n    var classes = {\n      'ui-form': true,\n      required: required,\n      whoops: !!validationError\n    };\n\n    // Add a special class to assist with finding fields while testing.\n    classes['wd-' + name] = true;\n\n    return _react2.default.createElement('fieldset', { className: (0, _classnames2.default)(classes) }, _react2.default.createElement('label', null, label, ' ', maxLength ? _react2.default.createElement('span', { className: 'hint' }, currentLength, '/', maxLength, ' characters') : null), description ? _react2.default.createElement('p', null, description) : null, control, _react2.default.createElement('p', { className: 'hint' }, validationError || hint));\n  },\n  getValidationError: function getValidationError() {\n    var _props2 = this.props,\n        errors = _props2.errors,\n        label = _props2.label;\n\n    if (!errors) {\n      return '';\n    }\n    return errors.map(function (error) {\n      return label + ' ' + error;\n    }).join('<b>');\n  }\n};\n\nexports.default = Field;\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _CSSTransitionGroup = __webpack_require__(813);\n\nvar _CSSTransitionGroup2 = _interopRequireDefault(_CSSTransitionGroup);\n\nvar _TransitionGroup = __webpack_require__(497);\n\nvar _TransitionGroup2 = _interopRequireDefault(_TransitionGroup);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = {\n  TransitionGroup: _TransitionGroup2.default,\n  CSSTransitionGroup: _CSSTransitionGroup2.default\n};\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _report = __webpack_require__(254);\n\nvar _report2 = _interopRequireDefault(_report);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Reports = _backbone2.default.Collection.extend({\n    url: '/api/v1/reports?limit=1000',\n    model: _report2.default,\n    parse: function parse(resp) {\n        return resp.reports;\n    },\n    getFirst: function getFirst() {\n        return this.first();\n    },\n    findParentReportsByChildId: function findParentReportsByChildId(id) {\n        return this.filter(function (report) {\n            var reportJSON = report.toJSON();\n            return report.get('report_type') !== 'grid' && reportJSON.associated_report_ids && reportJSON.associated_report_ids.indexOf(id) !== -1;\n        }, this);\n    },\n\n    // Find a report in this collection that has the given 'id'.\n    // This differs from get() in that it also supports finding models\n    // if given a legacy ID (ex: annual, ytd, balance).\n    findById: function findById(id) {\n        return this.get(id) || this.findWhere({ report_type: id });\n    }\n});\nwindow.Reports = Reports;\nexports.default = Reports;\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.EventObserver = undefined;\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EventObserverBase = {\n    listenToProp: function listenToProp(propName, event, callback) {\n        event = event || 'all';\n        callback = callback || function () {\n            this.forceUpdate();\n        };\n        this._listenToProps || (this._listenToProps = {});\n        var propListeners = this._listenToProps[propName] || (this._listenToProps[propName] = []);\n        var listener = { event: event, callback: callback };\n        propListeners.push(listener);\n        this._bindProp(this.props[propName], listener);\n    },\n    _bindProp: function _bindProp(propObject, listener) {\n        if (propObject) {\n            propObject.on(listener.event, listener.callback, this);\n        }\n    },\n    _unbindProp: function _unbindProp(propObject, listener) {\n        if (propObject) {\n            propObject.off(listener.event, listener.callback, this);\n        }\n    },\n    _rebindPropListeners: function _rebindPropListeners(prevPropObject, nextPropObject, listeners) {\n        _lodash2.default.each(listeners, _lodash2.default.bind(function (listener) {\n            this._unbindProp(prevPropObject, listener);\n            this._bindProp(nextPropObject, listener);\n        }, this));\n    },\n    _unbindPropListeners: function _unbindPropListeners(propObject, listeners) {\n        _lodash2.default.each(listeners, _lodash2.default.bind(function (listener) {\n            this._unbindProp(propObject, listener);\n        }, this));\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (!this._listenToProps) {\n            return;\n        }\n        for (var propName in this._listenToProps) {\n            var nextProp = nextProps[propName];\n            var prevProp = this.props[propName];\n            var listeners = this._listenToProps[propName];\n            this._rebindPropListeners(prevProp, nextProp, listeners);\n        }\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        for (var propName in this._listenToProps) {\n            var prop = this.props[propName];\n            var listeners = this._listenToProps[propName];\n            this._unbindPropListeners(prop, listeners);\n        }\n        delete this._listenToProps;\n    }\n};\nvar EventObserver = exports.EventObserver = _lodash2.default.extendWith(EventObserverBase, _backbone2.default.Events);\nexports.default = EventObserver;\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.isProjectionDataset = isProjectionDataset;\nexports.isBudgetType = isBudgetType;\nexports.isActualType = isActualType;\nexports.isProjectionType = isProjectionType;\nexports.getSortingIndex = getSortingIndex;\nexports.fixProjectedDataSets = fixProjectedDataSets;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n* isProjectionDataset(dataSet) figure out if dataSet is of a projection type\r\n*/\nfunction isProjectionDataset(dataSet) {\n    return isProjectionType(dataSet.type);\n}\n/**\r\n* isBudgetType(type) return if type is a budget one\r\n*/\nfunction isBudgetType(type) {\n    return type === 'budget';\n}\n/**\r\n* isActualType(type) return if type is a actuals one\r\n*/\nfunction isActualType(type) {\n    return type === 'actual';\n}\n/**\r\n* isProjectionType(type) return if type is a projection one\r\n*/\nfunction isProjectionType(type) {\n    return type === 'system_projection' || type === 'projection';\n}\n/**\r\n * getSortingIndex(type) sorting order for datasets for visualization:\r\n * actuals <-- projections <-- budgets\r\n */\nfunction getSortingIndex(type) {\n    switch (type) {\n        case 'actual':\n            return 1;\n        case 'budget':\n            return 0;\n        case 'projection':\n        case 'system_projection':\n            return 2;\n        default:\n            return 0;\n    }\n}\n/**\r\n* fixProjectedDataSets(dataSets) returns fixed dataset\r\n* in regard to the projected dataSet\r\n* it's a temp function, until we fix the data on back-end\r\n*/\nfunction fixProjectedDataSets(dataSets) {\n    return _lodash2.default.map(dataSets, function (dataSet) {\n        // temp massage of the data\n        if (~['3_year_avg', '4_year_avg', '2_year_avg', '1_year_avg', 'auto_year_avg'].indexOf(dataSet.label)) {\n            // fix dataSet\n            dataSet.type = 'projection';\n            dataSet.description = 'Projection';\n        }\n        // NOTE: patch for these datasets that do not have label but are still system projections\n        // we basically fall to auto_year_avg by default\n        if (isProjectionType(dataSet.type) && !dataSet.label) {\n            dataSet.label = 'auto_year_avg';\n        }\n        return dataSet;\n    });\n}\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n  var loc = node && node.loc,\n      line = undefined,\n      column = undefined;\n  if (loc) {\n    line = loc.start.line;\n    column = loc.start.column;\n\n    message += ' - ' + line + ':' + column;\n  }\n\n  var tmp = Error.prototype.constructor.call(this, message);\n\n  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n  for (var idx = 0; idx < errorProps.length; idx++) {\n    this[errorProps[idx]] = tmp[errorProps[idx]];\n  }\n\n  /* istanbul ignore else */\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, Exception);\n  }\n\n  try {\n    if (loc) {\n      this.lineNumber = line;\n\n      // Work around issue under safari where we can't directly set the column value\n      /* istanbul ignore next */\n      if (Object.defineProperty) {\n        Object.defineProperty(this, 'column', {\n          value: column,\n          enumerable: true\n        });\n      } else {\n        this.column = column;\n      }\n    }\n  } catch (nop) {\n    /* Ignore if the browser is very particular */\n  }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSTtBQUNGLFFBQUksR0FBRyxFQUFFO0FBQ1AsVUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7QUFJdkIsVUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFO0FBQ3pCLGNBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxlQUFLLEVBQUUsTUFBTTtBQUNiLG9CQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7T0FDSixNQUFNO0FBQ0wsWUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7T0FDdEI7S0FDRjtHQUNGLENBQUMsT0FBTyxHQUFHLEVBQUU7O0dBRWI7Q0FDRjs7QUFFRCxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7O3FCQUVuQixTQUFTIiwiZmlsZSI6ImV4Y2VwdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107XG5cbmZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7XG4gIGxldCBsb2MgPSBub2RlICYmIG5vZGUubG9jLFxuICAgICAgbGluZSxcbiAgICAgIGNvbHVtbjtcbiAgaWYgKGxvYykge1xuICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICBsZXQgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcblxuICAgICAgLy8gV29yayBhcm91bmQgaXNzdWUgdW5kZXIgc2FmYXJpIHdoZXJlIHdlIGNhbid0IGRpcmVjdGx5IHNldCB0aGUgY29sdW1uIHZhbHVlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKG5vcCkge1xuICAgIC8qIElnbm9yZSBpZiB0aGUgYnJvd3NlciBpcyB2ZXJ5IHBhcnRpY3VsYXIgKi9cbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4Y2VwdGlvbjtcbiJdfQ==\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * numeral.js\n * version : 1.5.3\n * author : Adam Draper\n * license : MIT\n * http://adamwdraper.github.com/Numeral-js/\n */\n\n(function () {\n\n    /************************************\n        Constants\n    ************************************/\n\n    var numeral,\n        VERSION = '1.5.3',\n        // internal storage for language config files\n        languages = {},\n        currentLanguage = 'en',\n        zeroFormat = null,\n        defaultFormat = '0,0',\n        // check for nodeJS\n        hasModule = (typeof module !== 'undefined' && module.exports);\n\n\n    /************************************\n        Constructors\n    ************************************/\n\n\n    // Numeral prototype object\n    function Numeral (number) {\n        this._value = number;\n    }\n\n    /**\n     * Implementation of toFixed() that treats floats more like decimals\n     *\n     * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\n     * problems for accounting- and finance-related software.\n     */\n    function toFixed (value, precision, roundingFunction, optionals) {\n        var power = Math.pow(10, precision),\n            optionalsRegExp,\n            output;\n            \n        //roundingFunction = (roundingFunction !== undefined ? roundingFunction : Math.round);\n        // Multiply up by precision, round accurately, then divide and use native toFixed():\n        output = (roundingFunction(value * power) / power).toFixed(precision);\n\n        if (optionals) {\n            optionalsRegExp = new RegExp('0{1,' + optionals + '}$');\n            output = output.replace(optionalsRegExp, '');\n        }\n\n        return output;\n    }\n\n    /************************************\n        Formatting\n    ************************************/\n\n    // determine what type of formatting we need to do\n    function formatNumeral (n, format, roundingFunction) {\n        var output;\n\n        // figure out what kind of format we are dealing with\n        if (format.indexOf('$') > -1) { // currency!!!!!\n            output = formatCurrency(n, format, roundingFunction);\n        } else if (format.indexOf('%') > -1) { // percentage\n            output = formatPercentage(n, format, roundingFunction);\n        } else if (format.indexOf(':') > -1) { // time\n            output = formatTime(n, format);\n        } else { // plain ol' numbers or bytes\n            output = formatNumber(n._value, format, roundingFunction);\n        }\n\n        // return string\n        return output;\n    }\n\n    // revert to number\n    function unformatNumeral (n, string) {\n        var stringOriginal = string,\n            thousandRegExp,\n            millionRegExp,\n            billionRegExp,\n            trillionRegExp,\n            suffixes = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n            bytesMultiplier = false,\n            power;\n\n        if (string.indexOf(':') > -1) {\n            n._value = unformatTime(string);\n        } else {\n            if (string === zeroFormat) {\n                n._value = 0;\n            } else {\n                if (languages[currentLanguage].delimiters.decimal !== '.') {\n                    string = string.replace(/\\./g,'').replace(languages[currentLanguage].delimiters.decimal, '.');\n                }\n\n                // see if abbreviations are there so that we can multiply to the correct number\n                thousandRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.thousand + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                millionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.million + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                billionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.billion + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                trillionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.trillion + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n\n                // see if bytes are there so that we can multiply to the correct number\n                for (power = 0; power <= suffixes.length; power++) {\n                    bytesMultiplier = (string.indexOf(suffixes[power]) > -1) ? Math.pow(1024, power + 1) : false;\n\n                    if (bytesMultiplier) {\n                        break;\n                    }\n                }\n\n                // do some math to create our number\n                n._value = ((bytesMultiplier) ? bytesMultiplier : 1) * ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) * ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) * ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) * ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) * ((string.indexOf('%') > -1) ? 0.01 : 1) * (((string.split('-').length + Math.min(string.split('(').length-1, string.split(')').length-1)) % 2)? 1: -1) * Number(string.replace(/[^0-9\\.]+/g, ''));\n\n                // round if we are talking about bytes\n                n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value;\n            }\n        }\n        return n._value;\n    }\n\n    function formatCurrency (n, format, roundingFunction) {\n        var symbolIndex = format.indexOf('$'),\n            openParenIndex = format.indexOf('('),\n            minusSignIndex = format.indexOf('-'),\n            space = '',\n            spliceIndex,\n            output;\n\n        // check for space before or after currency\n        if (format.indexOf(' $') > -1) {\n            space = ' ';\n            format = format.replace(' $', '');\n        } else if (format.indexOf('$ ') > -1) {\n            space = ' ';\n            format = format.replace('$ ', '');\n        } else {\n            format = format.replace('$', '');\n        }\n\n        // format the number\n        output = formatNumber(n._value, format, roundingFunction);\n\n        // position the symbol\n        if (symbolIndex <= 1) {\n            if (output.indexOf('(') > -1 || output.indexOf('-') > -1) {\n                output = output.split('');\n                spliceIndex = 1;\n                if (symbolIndex < openParenIndex || symbolIndex < minusSignIndex){\n                    // the symbol appears before the \"(\" or \"-\"\n                    spliceIndex = 0;\n                }\n                output.splice(spliceIndex, 0, languages[currentLanguage].currency.symbol + space);\n                output = output.join('');\n            } else {\n                output = languages[currentLanguage].currency.symbol + space + output;\n            }\n        } else {\n            if (output.indexOf(')') > -1) {\n                output = output.split('');\n                output.splice(-1, 0, space + languages[currentLanguage].currency.symbol);\n                output = output.join('');\n            } else {\n                output = output + space + languages[currentLanguage].currency.symbol;\n            }\n        }\n\n        return output;\n    }\n\n    function formatPercentage (n, format, roundingFunction) {\n        var space = '',\n            output,\n            value = n._value * 100;\n\n        // check for space before %\n        if (format.indexOf(' %') > -1) {\n            space = ' ';\n            format = format.replace(' %', '');\n        } else {\n            format = format.replace('%', '');\n        }\n\n        output = formatNumber(value, format, roundingFunction);\n        \n        if (output.indexOf(')') > -1 ) {\n            output = output.split('');\n            output.splice(-1, 0, space + '%');\n            output = output.join('');\n        } else {\n            output = output + space + '%';\n        }\n\n        return output;\n    }\n\n    function formatTime (n) {\n        var hours = Math.floor(n._value/60/60),\n            minutes = Math.floor((n._value - (hours * 60 * 60))/60),\n            seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60));\n        return hours + ':' + ((minutes < 10) ? '0' + minutes : minutes) + ':' + ((seconds < 10) ? '0' + seconds : seconds);\n    }\n\n    function unformatTime (string) {\n        var timeArray = string.split(':'),\n            seconds = 0;\n        // turn hours and minutes into seconds and add them all up\n        if (timeArray.length === 3) {\n            // hours\n            seconds = seconds + (Number(timeArray[0]) * 60 * 60);\n            // minutes\n            seconds = seconds + (Number(timeArray[1]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[2]);\n        } else if (timeArray.length === 2) {\n            // minutes\n            seconds = seconds + (Number(timeArray[0]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[1]);\n        }\n        return Number(seconds);\n    }\n\n    function formatNumber (value, format, roundingFunction) {\n        var negP = false,\n            signed = false,\n            optDec = false,\n            abbr = '',\n            abbrK = false, // force abbreviation to thousands\n            abbrM = false, // force abbreviation to millions\n            abbrB = false, // force abbreviation to billions\n            abbrT = false, // force abbreviation to trillions\n            abbrForce = false, // force abbreviation\n            bytes = '',\n            ord = '',\n            abs = Math.abs(value),\n            suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n            min,\n            max,\n            power,\n            w,\n            precision,\n            thousands,\n            d = '',\n            neg = false;\n\n        // check if number is zero and a custom zero format has been set\n        if (value === 0 && zeroFormat !== null) {\n            return zeroFormat;\n        } else {\n            // see if we should use parentheses for negative number or if we should prefix with a sign\n            // if both are present we default to parentheses\n            if (format.indexOf('(') > -1) {\n                negP = true;\n                format = format.slice(1, -1);\n            } else if (format.indexOf('+') > -1) {\n                signed = true;\n                format = format.replace(/\\+/g, '');\n            }\n\n            // see if abbreviation is wanted\n            if (format.indexOf('a') > -1) {\n                // check if abbreviation is specified\n                abbrK = format.indexOf('aK') >= 0;\n                abbrM = format.indexOf('aM') >= 0;\n                abbrB = format.indexOf('aB') >= 0;\n                abbrT = format.indexOf('aT') >= 0;\n                abbrForce = abbrK || abbrM || abbrB || abbrT;\n\n                // check for space before abbreviation\n                if (format.indexOf(' a') > -1) {\n                    abbr = ' ';\n                    format = format.replace(' a', '');\n                } else {\n                    format = format.replace('a', '');\n                }\n\n                if (abs >= Math.pow(10, 12) && !abbrForce || abbrT) {\n                    // trillion\n                    abbr = abbr + languages[currentLanguage].abbreviations.trillion;\n                    value = value / Math.pow(10, 12);\n                } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9) && !abbrForce || abbrB) {\n                    // billion\n                    abbr = abbr + languages[currentLanguage].abbreviations.billion;\n                    value = value / Math.pow(10, 9);\n                } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6) && !abbrForce || abbrM) {\n                    // million\n                    abbr = abbr + languages[currentLanguage].abbreviations.million;\n                    value = value / Math.pow(10, 6);\n                } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3) && !abbrForce || abbrK) {\n                    // thousand\n                    abbr = abbr + languages[currentLanguage].abbreviations.thousand;\n                    value = value / Math.pow(10, 3);\n                }\n            }\n\n            // see if we are formatting bytes\n            if (format.indexOf('b') > -1) {\n                // check for space before\n                if (format.indexOf(' b') > -1) {\n                    bytes = ' ';\n                    format = format.replace(' b', '');\n                } else {\n                    format = format.replace('b', '');\n                }\n\n                for (power = 0; power <= suffixes.length; power++) {\n                    min = Math.pow(1024, power);\n                    max = Math.pow(1024, power+1);\n\n                    if (value >= min && value < max) {\n                        bytes = bytes + suffixes[power];\n                        if (min > 0) {\n                            value = value / min;\n                        }\n                        break;\n                    }\n                }\n            }\n\n            // see if ordinal is wanted\n            if (format.indexOf('o') > -1) {\n                // check for space before\n                if (format.indexOf(' o') > -1) {\n                    ord = ' ';\n                    format = format.replace(' o', '');\n                } else {\n                    format = format.replace('o', '');\n                }\n\n                ord = ord + languages[currentLanguage].ordinal(value);\n            }\n\n            if (format.indexOf('[.]') > -1) {\n                optDec = true;\n                format = format.replace('[.]', '.');\n            }\n\n            w = value.toString().split('.')[0];\n            precision = format.split('.')[1];\n            thousands = format.indexOf(',');\n\n            if (precision) {\n                if (precision.indexOf('[') > -1) {\n                    precision = precision.replace(']', '');\n                    precision = precision.split('[');\n                    d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);\n                } else {\n                    d = toFixed(value, precision.length, roundingFunction);\n                }\n\n                w = d.split('.')[0];\n\n                if (d.split('.')[1].length) {\n                    d = languages[currentLanguage].delimiters.decimal + d.split('.')[1];\n                } else {\n                    d = '';\n                }\n\n                if (optDec && Number(d.slice(1)) === 0) {\n                    d = '';\n                }\n            } else {\n                w = toFixed(value, null, roundingFunction);\n            }\n\n            // format number\n            if (w.indexOf('-') > -1) {\n                w = w.slice(1);\n                neg = true;\n            }\n\n            if (thousands > -1) {\n                w = w.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + languages[currentLanguage].delimiters.thousands);\n            }\n\n            if (format.indexOf('.') === 0) {\n                w = '';\n            }\n\n            return ((negP && neg) ? '(' : '') + ((!negP && neg) ? '-' : '') + ((!neg && signed) ? '+' : '') + w + d + ((ord) ? ord : '') + ((abbr) ? abbr : '') + ((bytes) ? bytes : '') + ((negP && neg) ? ')' : '');\n        }\n    }\n\n    /************************************\n        Top Level Functions\n    ************************************/\n\n    numeral = function (input) {\n        if (numeral.isNumeral(input)) {\n            input = input.value();\n        } else if (input === 0 || typeof input === 'undefined') {\n            input = 0;\n        } else if (!Number(input)) {\n            input = numeral.fn.unformat(input);\n        }\n\n        return new Numeral(Number(input));\n    };\n\n    // version number\n    numeral.version = VERSION;\n\n    // compare numeral object\n    numeral.isNumeral = function (obj) {\n        return obj instanceof Numeral;\n    };\n\n    // This function will load languages and then set the global language.  If\n    // no arguments are passed in, it will simply return the current global\n    // language key.\n    numeral.language = function (key, values) {\n        if (!key) {\n            return currentLanguage;\n        }\n\n        if (key && !values) {\n            if(!languages[key]) {\n                throw new Error('Unknown language : ' + key);\n            }\n            currentLanguage = key;\n        }\n\n        if (values || !languages[key]) {\n            loadLanguage(key, values);\n        }\n\n        return numeral;\n    };\n    \n    // This function provides access to the loaded language data.  If\n    // no arguments are passed in, it will simply return the current\n    // global language object.\n    numeral.languageData = function (key) {\n        if (!key) {\n            return languages[currentLanguage];\n        }\n        \n        if (!languages[key]) {\n            throw new Error('Unknown language : ' + key);\n        }\n        \n        return languages[key];\n    };\n\n    numeral.language('en', {\n        delimiters: {\n            thousands: ',',\n            decimal: '.'\n        },\n        abbreviations: {\n            thousand: 'k',\n            million: 'm',\n            billion: 'b',\n            trillion: 't'\n        },\n        ordinal: function (number) {\n            var b = number % 10;\n            return (~~ (number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n        },\n        currency: {\n            symbol: '$'\n        }\n    });\n\n    numeral.zeroFormat = function (format) {\n        zeroFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numeral.defaultFormat = function (format) {\n        defaultFormat = typeof(format) === 'string' ? format : '0.0';\n    };\n\n    /************************************\n        Helpers\n    ************************************/\n\n    function loadLanguage(key, values) {\n        languages[key] = values;\n    }\n\n    /************************************\n        Floating-point helpers\n    ************************************/\n\n    // The floating-point helper functions and implementation\n    // borrows heavily from sinful.js: http://guipn.github.io/sinful.js/\n\n    /**\n     * Array.prototype.reduce for browsers that don't support it\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Compatibility\n     */\n    if ('function' !== typeof Array.prototype.reduce) {\n        Array.prototype.reduce = function (callback, opt_initialValue) {\n            'use strict';\n            \n            if (null === this || 'undefined' === typeof this) {\n                // At the moment all modern browsers, that support strict mode, have\n                // native implementation of Array.prototype.reduce. For instance, IE8\n                // does not support strict mode, so this check is actually useless.\n                throw new TypeError('Array.prototype.reduce called on null or undefined');\n            }\n            \n            if ('function' !== typeof callback) {\n                throw new TypeError(callback + ' is not a function');\n            }\n\n            var index,\n                value,\n                length = this.length >>> 0,\n                isValueSet = false;\n\n            if (1 < arguments.length) {\n                value = opt_initialValue;\n                isValueSet = true;\n            }\n\n            for (index = 0; length > index; ++index) {\n                if (this.hasOwnProperty(index)) {\n                    if (isValueSet) {\n                        value = callback(value, this[index], index, this);\n                    } else {\n                        value = this[index];\n                        isValueSet = true;\n                    }\n                }\n            }\n\n            if (!isValueSet) {\n                throw new TypeError('Reduce of empty array with no initial value');\n            }\n\n            return value;\n        };\n    }\n\n    \n    /**\n     * Computes the multiplier necessary to make x >= 1,\n     * effectively eliminating miscalculations caused by\n     * finite precision.\n     */\n    function multiplier(x) {\n        var parts = x.toString().split('.');\n        if (parts.length < 2) {\n            return 1;\n        }\n        return Math.pow(10, parts[1].length);\n    }\n\n    /**\n     * Given a variable number of arguments, returns the maximum\n     * multiplier that must be used to normalize an operation involving\n     * all of them.\n     */\n    function correctionFactor() {\n        var args = Array.prototype.slice.call(arguments);\n        return args.reduce(function (prev, next) {\n            var mp = multiplier(prev),\n                mn = multiplier(next);\n        return mp > mn ? mp : mn;\n        }, -Infinity);\n    }        \n\n\n    /************************************\n        Numeral Prototype\n    ************************************/\n\n\n    numeral.fn = Numeral.prototype = {\n\n        clone : function () {\n            return numeral(this);\n        },\n\n        format : function (inputString, roundingFunction) {\n            return formatNumeral(this, \n                  inputString ? inputString : defaultFormat, \n                  (roundingFunction !== undefined) ? roundingFunction : Math.round\n              );\n        },\n\n        unformat : function (inputString) {\n            if (Object.prototype.toString.call(inputString) === '[object Number]') { \n                return inputString; \n            }\n            return unformatNumeral(this, inputString ? inputString : defaultFormat);\n        },\n\n        value : function () {\n            return this._value;\n        },\n\n        valueOf : function () {\n            return this._value;\n        },\n\n        set : function (value) {\n            this._value = Number(value);\n            return this;\n        },\n\n        add : function (value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n            function cback(accum, curr, currI, O) {\n                return accum + corrFactor * curr;\n            }\n            this._value = [this._value, value].reduce(cback, 0) / corrFactor;\n            return this;\n        },\n\n        subtract : function (value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n            function cback(accum, curr, currI, O) {\n                return accum - corrFactor * curr;\n            }\n            this._value = [value].reduce(cback, this._value * corrFactor) / corrFactor;            \n            return this;\n        },\n\n        multiply : function (value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) * (curr * corrFactor) /\n                    (corrFactor * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback, 1);\n            return this;\n        },\n\n        divide : function (value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) / (curr * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback);            \n            return this;\n        },\n\n        difference : function (value) {\n            return Math.abs(numeral(this._value).subtract(value).value());\n        }\n\n    };\n\n    /************************************\n        Exposing Numeral\n    ************************************/\n\n    // CommonJS module is defined\n    if (hasModule) {\n        module.exports = numeral;\n    }\n\n    /*global ender:false */\n    if (typeof ender === 'undefined') {\n        // here, `this` means `window` in the browser, or `global` on the server\n        // add `numeral` as a global object via a string identifier,\n        // for Closure Compiler 'advanced' mode\n        this['numeral'] = numeral;\n    }\n\n    /*global define:false */\n    if (true) {\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n            return numeral;\n        }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    }\n}).call(this);\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.maxNumberOfSavedViewsReturned = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _immutabilityHelper = __webpack_require__(185);\n\nvar _immutabilityHelper2 = _interopRequireDefault(_immutabilityHelper);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar maxNumberOfSavedViewsReturned = exports.maxNumberOfSavedViewsReturned = 1000;\n// Clear the active saved view if any of these properties of\n// the current report state differs from the saved view's state.\n// See the \"REPORT_STATE_CHANGE\" action handler for more details.\nvar CLEAR_SAVED_VIEW_PROPERTIES = ['breakdown_id', 'ledger', 'selection'];\n/**\r\n * A store for managing a collection of saved views.\r\n * Handles management tasks such as creating, editing, and deleting saved views.\r\n * It's also responsible for fetching saved views when the user views a report.\r\n */\n\nvar SavedViewsStore = function (_BaseStore) {\n    _inherits(SavedViewsStore, _BaseStore);\n\n    function SavedViewsStore() {\n        _classCallCheck(this, SavedViewsStore);\n\n        // A collection of saved views for the current rendered report.\n        var _this = _possibleConstructorReturn(this, (SavedViewsStore.__proto__ || Object.getPrototypeOf(SavedViewsStore)).call(this));\n\n        _this._views = [];\n        // Active saved view the user is currently viewing.\n        _this._activeView = null;\n        // A new or existing saved view the user is currently editing.\n        _this._editView = null;\n        // A flag to track if there is a pending request to sync the edit view to the server.\n        _this._editViewSyncing = false;\n        // A collection of saved views the user has visited.\n        _this._visitedViews = [];\n        _og_flux.Dispatcher.register(function (payload) {\n            _this._handleAction(payload.action);\n        });\n        return _this;\n    }\n    /**\r\n     * Get the collection of saved views for the current report sorted by position.\r\n     * @returns {Array}\r\n     */\n\n\n    _createClass(SavedViewsStore, [{\n        key: 'getSortedViews',\n        value: function getSortedViews() {\n            return this._views;\n        }\n        /**\r\n         * Returns an array of saved view ids which have been visited by the user.\r\n         * @returns {Array} An array of saved view ids.\r\n         */\n\n    }, {\n        key: 'getVisitedViews',\n        value: function getVisitedViews() {\n            return this._visitedViews;\n        }\n        /**\r\n         * Get the saved views count currently loaded.\r\n         * @returns {number}\r\n         */\n\n    }, {\n        key: 'getSavedViewsCount',\n        value: function getSavedViewsCount() {\n            return this._views.length;\n        }\n        /**\r\n         * Get the currently active saved view the user is viewing.\r\n         * @returns {Object}\r\n         */\n\n    }, {\n        key: 'getActiveView',\n        value: function getActiveView() {\n            return this._activeView;\n        }\n        /**\r\n         * Get the current saved view being edited by the user.\r\n         * @returns {Object} - The saved view\r\n         */\n\n    }, {\n        key: 'getEditView',\n        value: function getEditView() {\n            return this._editView;\n        }\n        /**\r\n         * Check if the edit view has a pending request to sync it with the server.\r\n         * @returns {boolean} - True if there is a pending request.\r\n         */\n\n    }, {\n        key: 'isEditViewSyncing',\n        value: function isEditViewSyncing() {\n            return this._editViewSyncing;\n        }\n        /**\r\n         * Get the saved view the user is currently dragging to a new position.\r\n         * @returns {Object}\r\n         */\n\n    }, {\n        key: 'getDragView',\n        value: function getDragView() {\n            return this.findViewById(this._dragViewId);\n        }\n        /**\r\n         * Finds a saved view by its 'id'.\r\n         * @returns {Object}\r\n         */\n\n    }, {\n        key: 'findViewById',\n        value: function findViewById(id) {\n            return _lodash2.default.find(this._views, function (view) {\n                return view.id === id;\n            });\n        }\n        /**\r\n         * Appends a new saved view to the collection.\r\n         * @private\r\n         * @param {Object} savedView\r\n         */\n\n    }, {\n        key: '_addSavedView',\n        value: function _addSavedView(savedView) {\n            this._views = (0, _immutabilityHelper2.default)(this._views, {\n                $push: [savedView]\n            });\n        }\n        /**\r\n         * Removes the saved view from the collection.\r\n         * @private\r\n         * @param {number|Object} id - The 'id' of the view to be removed. May also be the actual view instance.\r\n         */\n\n    }, {\n        key: '_removeSavedView',\n        value: function _removeSavedView(id) {\n            var index = _lodash2.default.findIndex(this._views, function (view) {\n                return view === id || view.id === id;\n            });\n            this._views = (0, _immutabilityHelper2.default)(this._views, {\n                $splice: [[index, 1]]\n            });\n        }\n        /**\r\n         * Replace a saved view with a new copy.\r\n         * @private\r\n         * @param {Object} oldView - Current copy of saved view in the collection.\r\n         * @param {Object} newView - New copy of saved view to insert into collection.\r\n         */\n\n    }, {\n        key: '_replaceSavedView',\n        value: function _replaceSavedView(oldView, newView) {\n            var index = _lodash2.default.findIndex(this._views, function (view) {\n                return view === oldView;\n            });\n            this._views = (0, _immutabilityHelper2.default)(this._views, {\n                $splice: [[index, 1, newView]]\n            });\n            if (this._activeView === oldView) {\n                this._activeView = newView;\n            }\n        }\n        /**\r\n         * Move a saved view to a position after another view in the collection.\r\n         * @private\r\n         * @param {number} id - The 'id' of the saved view to move.\r\n         * @param {number} afterId - The 'id' of the other saved view to position the view after.\r\n         */\n\n    }, {\n        key: '_moveSavedView',\n        value: function _moveSavedView(id, afterId) {\n            var view = this.findViewById(id);\n            var afterView = this.findViewById(afterId);\n            var viewIndex = this._views.indexOf(view);\n            var afterViewIndex = this._views.indexOf(afterView);\n            var updatedView = _lodash2.default.assign({}, view, { position: afterViewIndex + 1 });\n            if (this._activeView && this._activeView.id === id) {\n                this._activeView = updatedView;\n            }\n            this._views = (0, _immutabilityHelper2.default)(this._views, {\n                $splice: [[viewIndex, 1], [afterViewIndex, 0, updatedView]]\n            });\n        }\n        /**\r\n         * Mark the saved view as being visited by the user.\r\n         * @param {Object} view - The saved view to be marked as visited.\r\n         */\n\n    }, {\n        key: '_markViewAsVisited',\n        value: function _markViewAsVisited(view) {\n            this._visitedViews = (0, _immutabilityHelper2.default)(this._visitedViews, {\n                $push: [view.id]\n            });\n        }\n        /**\r\n         * Prepare a new saved view item and make it the current edit view.\r\n         * @param {Object} view - The new saved view item\r\n         */\n\n    }, {\n        key: '_newView',\n        value: function _newView(view) {\n            this._editView = _lodash2.default.clone(view);\n        }\n        /**\r\n         * Clear the edit view state and also the pending request flag if it is set.\r\n         */\n\n    }, {\n        key: '_clearEditView',\n        value: function _clearEditView() {\n            this._editView = null;\n            this._editViewSyncing = false;\n        }\n        /**\r\n         * Load a collection of saved views from the server for a report.\r\n         * @private\r\n         * @param {number} reportId - The 'id' of the report to fetch saved views for.\r\n         */\n\n    }, {\n        key: '_fetchSavedViews',\n        value: function _fetchSavedViews(reportId) {\n            var _this2 = this;\n\n            _og_api2.default.get('saved_views', { report_id: reportId, limit: maxNumberOfSavedViewsReturned }).end().then(function (res) {\n                _this2._views = res.body.saved_views;\n                _this2.emitChange();\n            });\n        }\n    }, {\n        key: '_handleAction',\n        value: function _handleAction(action) {\n            var view = void 0;\n            switch (action.actionType) {\n                case 'REPORT_LOADED':\n                    this._fetchSavedViews(action.report.id);\n                    this._activeView = null;\n                    this._clearEditView();\n                    this._visitedViews = [];\n                    this.emitChange();\n                    break;\n                case 'REPORT_STATE_RESET':\n                    this._activeView = null;\n                    this._visitedViews = [];\n                    this.emitChange();\n                    break;\n                case 'REPORT_STATE_CHANGE':\n                    // Clear the active saved view if the user navigates away from it.\n                    // For example if they make a selection change we will clear the active view.\n                    if (this._activeView) {\n                        var viewState = _lodash2.default.pick(this._activeView.view_state, CLEAR_SAVED_VIEW_PROPERTIES);\n                        var reportState = _lodash2.default.pick(action.state, CLEAR_SAVED_VIEW_PROPERTIES);\n                        if (!_lodash2.default.isEqual(viewState, reportState)) {\n                            this._activeView = null;\n                            this.emitChange();\n                        }\n                    }\n                    break;\n                case 'SAVED_VIEW_SELECTED':\n                    this._activeView = action.savedView;\n                    this._markViewAsVisited(this._activeView);\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_NEW':\n                    this._newView(action.savedView);\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_CANCEL':\n                    this._clearEditView();\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_CREATE':\n                    this._editView = _lodash2.default.assign({}, action.savedView, { __clientId: action.requestId });\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_CREATE_SUCCESS':\n                    this._addSavedView(action.savedView);\n                    this._activeView = action.savedView;\n                    this._clearEditView();\n                    this._markViewAsVisited(this._activeView);\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_CREATE_ERROR':\n                    view = this._editView = _lodash2.default.omit(this._editView, '__clientId');\n                    view.__error = 'There was an error creating the saved view. Please try again.';\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_EDIT':\n                    this._editView = this.findViewById(action.savedViewId);\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_UPDATE':\n                    view = _lodash2.default.assign({}, this.findViewById(action.savedViewId), action.updatedAttributes);\n                    this._editView = view;\n                    this._editViewSyncing = true;\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_UPDATE_SUCCESS':\n                    var oldView = this.findViewById(action.savedViewId);\n                    var newView = this._editView;\n                    this._replaceSavedView(oldView, newView);\n                    this._clearEditView();\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_UPDATE_ERROR':\n                    this._editView = _lodash2.default.assign({}, this._editView, { __error: 'There was an error updating the saved view. Please try again.' });\n                    this._editViewSyncing = false;\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DELETE':\n                    this._editViewSyncing = true;\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DELETE_SUCCESS':\n                    this._removeSavedView(action.savedViewId);\n                    this._clearEditView();\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DELETE_ERROR':\n                    this._editView = _lodash2.default.assign({}, this._editView, { __error: 'There was an error deleting this saved view. Please try again.' });\n                    this._editViewSyncing = false;\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DRAG_START':\n                    this._dragViewId = action.savedViewId;\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DRAG_AFTER':\n                    this._moveSavedView(this._dragViewId, action.savedViewId);\n                    this.emitChange();\n                    break;\n                case 'SAVED_VIEW_DROP':\n                    break;\n            }\n        }\n    }]);\n\n    return SavedViewsStore;\n}(_og_flux.BaseStore);\n\nvar store = new SavedViewsStore();\nstore.__class = SavedViewsStore;\nexports.default = store;\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar CheckSettings = exports.CheckSettings = {\n    checkbookDomain: 'ohiocheckbook.com',\n    pdfPath: '/downloads/check_image.pdf',\n    requiredFields: ['check_date', 'check_no', 'amount', 'expense_type', 'paid_to', 'department'],\n    descriptionFields: [{ key: 'entity', label: 'Paid By', type: 'description', format: 'capitalize' }, { key: 'paid_to', label: 'Paid To', type: 'description', filter: true }, { key: 'amount', label: 'Payment Amount', type: 'description', format: 'money' }, { key: 'vendor_city', label: 'Vendor City', type: 'description' }, { key: 'voucher_id', label: 'Voucher ID', type: 'description', filter: true }, { key: '__zz0x_document_id', label: 'Document ID', type: 'description', filter: true, requiresFeaturePermission: 'west_virginia_check_fields' }, { key: '__zz0x_expense', label: 'Expense', type: 'description', filter: true, requiresFeaturePermission: 'west_virginia_check_fields' }, { key: 'vendor_state', label: 'Vendor State', type: 'description' }, { key: 'check_no', label: 'Check Number', type: 'description', filter: true }, { key: 'vendor_zip', label: 'Vendor Zip', type: 'description' }, { key: 'check_date', label: 'Payment Date', type: 'description', format: 'date' }, { key: '', label: '' }, { key: 'expense_type', label: 'Expense Type', type: 'description', filter: true }, { key: 'fund', label: 'Funds', type: 'money', filter: true }, { key: 'program', label: 'Program', type: 'money', filter: true }, { key: 'department', label: 'Department', hidden: true, filter: true }]\n};\nvar GriddleSettings = exports.GriddleSettings = {\n    ignoredFields: ['id', 'quasi_id', 'all']\n};\nvar result = {};\nif (gon.config) {\n    result = gon.config;\n}\nresult.GriddleSettings = GriddleSettings;\nresult.CheckSettings = CheckSettings;\nexports.default = result;\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.buildObjectsFromGeoResponse = exports.parseGeoJson = exports.locationColumn = exports.ingestRowsForMap = exports.HeatmapExtractorsMap = exports.mapAmountField = exports.transformRowsToFeatures = exports.filterRowsWithoutLocation = exports.boundsIntersect = exports.featureLocationsVirtuallyIdentical = exports.BOUNDS_NEAR_EQUAL_DIFF_RATIO = exports.MINIMUM_POINT_DIFF = exports.DEFAULT_BOUNDS_PADDING = undefined;\n\nvar _HeatmapExtractorsMap;\n\nexports.buildFeatureCollection = buildFeatureCollection;\nexports.getBounds = getBounds;\nexports.getFeatureLongitude = getFeatureLongitude;\nexports.getFeatureLatitude = getFeatureLatitude;\nexports.getBoundsForFeatures = getBoundsForFeatures;\nexports.padBounds = padBounds;\nexports.shouldIgnoreLngLat = shouldIgnoreLngLat;\nexports.boundsNearlyEqual = boundsNearlyEqual;\nexports.getHeatmapIntensityForAmount = getHeatmapIntensityForAmount;\nexports.getHeatmapSizeForAmount = getHeatmapSizeForAmount;\nexports.lngLatExtractor = lngLatExtractor;\nexports.getLngLatFromFeature = getLngLatFromFeature;\nexports.getFeatureCoordinates = getFeatureCoordinates;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _immutable = __webpack_require__(14);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction buildFeatureCollection(data) {\n    return {\n        type: 'FeatureCollection',\n        features: data\n    };\n}\nfunction isInvalid(num) {\n    return !_lodash2.default.isNumber(num) && !num;\n}\nfunction isValid(num) {\n    return !isInvalid(num);\n}\nfunction getBounds(arr, getLng, getLat) {\n    var lngs = arr.map(getLng).filter(isValid);\n    var lats = arr.map(getLat).filter(isValid);\n    var ne = { lng: _lodash2.default.max(lngs), lat: _lodash2.default.max(lats) };\n    var sw = { lng: _lodash2.default.min(lngs), lat: _lodash2.default.min(lats) };\n    return padBounds((0, _immutable.List)([(0, _immutable.List)([sw.lng, sw.lat]), (0, _immutable.List)([ne.lng, ne.lat])]));\n}\nfunction getFeatureLongitude(feature) {\n    return feature.geometry.coordinates[0];\n}\nfunction getFeatureLatitude(feature) {\n    return feature.geometry.coordinates[1];\n}\nfunction getBoundsForFeatures(features) {\n    return getBounds(features, getFeatureLongitude, getFeatureLatitude);\n}\nvar DEFAULT_BOUNDS_PADDING = exports.DEFAULT_BOUNDS_PADDING = 0.25;\nvar MINIMUM_POINT_DIFF = exports.MINIMUM_POINT_DIFF = 0.01;\nfunction padBounds(bounds) {\n    var paddingRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_BOUNDS_PADDING;\n\n    var ne = bounds.get(0);\n    var sw = bounds.get(1);\n    // To avoid invalid bounds where NE and SW are equal\n    // due to stacked features, we implement a minimum diff\n    var lngDiff = _lodash2.default.max([ne.get(0) - sw.get(0), MINIMUM_POINT_DIFF]);\n    var latDiff = _lodash2.default.max([ne.get(1) - sw.get(1), MINIMUM_POINT_DIFF]);\n    var lngPadding = lngDiff * paddingRatio / 2;\n    var latPadding = latDiff * paddingRatio / 2;\n    return bounds.set(0, (0, _immutable.List)([ne.get(0) + lngPadding, ne.get(1) + latPadding])).set(1, (0, _immutable.List)([sw.get(0) - lngPadding, sw.get(1) - latPadding]));\n}\nfunction coordinateIsInvalid(num) {\n    return !_lodash2.default.isNumber(num) && !num || num == Infinity || num == -Infinity;\n}\nfunction shouldIgnoreLngLat(lngLat) {\n    return !lngLat || _lodash2.default.some(lngLat, coordinateIsInvalid);\n}\n// When returning to a saved state mapbox-gl fits the saved bounds with\n// variable accuracy proportional to zoom level. If we check actual equality it\n// will resave the view/grid state every time it's loaded with no\n// perceivable difference\nvar BOUNDS_NEAR_EQUAL_DIFF_RATIO = exports.BOUNDS_NEAR_EQUAL_DIFF_RATIO = 1 / 25;\nfunction boundsNearlyEqual(boundsA, boundsB) {\n    if (!boundsA || !boundsB) {\n        return false;\n    }\n    var ne = boundsA.get(0);\n    var sw = boundsA.get(1);\n    var lngDiff = Math.abs(ne.get(0) - sw.get(0));\n    var latDiff = Math.abs(ne.get(1) - sw.get(1));\n    return boundsA.every(function (coords, lngLatIndex) {\n        return coords.every(function (num, coordIndex) {\n            var boundsDiff = Math.abs(boundsB.getIn([lngLatIndex, coordIndex]) - num);\n            var maxDiff = BOUNDS_NEAR_EQUAL_DIFF_RATIO * (coordIndex == 0 ? lngDiff : latDiff);\n            return boundsDiff < maxDiff;\n        });\n    });\n}\nvar featureLocationsVirtuallyIdentical = exports.featureLocationsVirtuallyIdentical = function featureLocationsVirtuallyIdentical(features) {\n    if (features && features.length && features.length == 1) {\n        return true;\n    }\n    var firstCoord = features && features.length > 0 && features[0] && features[0].geometry.coordinates;\n    return firstCoord && !_lodash2.default.some(_lodash2.default.drop(features, 1), function (f) {\n        return f.geometry.coordinates[0] != firstCoord[0] || f.geometry.coordinates[1] != firstCoord[1];\n    });\n};\nvar boundsIntersect = exports.boundsIntersect = function boundsIntersect(boundsA, boundsB) {\n    return !(boundsB.get('x1') > boundsA.get('x2') || boundsB.get('x2') < boundsA.get('x1') || boundsB.get('y1') > boundsA.get('y2') || boundsB.get('y2') < boundsA.get('y1'));\n};\nvar filterRowsWithoutLocation = exports.filterRowsWithoutLocation = function filterRowsWithoutLocation(rows) {\n    return _lodash2.default.filter(rows, lngLatExtractor);\n};\nvar transformRowsToFeatures = exports.transformRowsToFeatures = function transformRowsToFeatures(rows) {\n    return _lodash2.default.map(rows, function (row) {\n        var coords = lngLatExtractor(row);\n        return {\n            type: 'Feature',\n            properties: row,\n            geometry: {\n                type: 'Point',\n                coordinates: coords\n            }\n        };\n    });\n};\nfunction getHeatmapIntensityForAmount(row, amountColumn, dataMax) {\n    var intensityExponent = _map_constants.MapTypes.Heatmap.configuration.intensityExponent;\n\n    var parsedNumber = parseFloat(row.properties[amountColumn].replace(/\\$|,/g, ''));\n    return Math.pow(parsedNumber, intensityExponent) / Math.pow(dataMax, intensityExponent);\n}\nfunction getHeatmapSizeForAmount(row, amountColumn, dataMax) {\n    var _MapTypes$Heatmap$con = _map_constants.MapTypes.Heatmap.configuration,\n        radius = _MapTypes$Heatmap$con.radius,\n        sizeExponent = _MapTypes$Heatmap$con.sizeExponent;\n\n    var parsedNumber = parseFloat(row.properties[amountColumn].replace(/\\$|,/g, ''));\n    return Math.pow(Math.log(parsedNumber) / Math.log(dataMax), sizeExponent) * radius;\n}\nvar mapAmountField = exports.mapAmountField = function mapAmountField(row, amountColumn, dataMax) {\n    return Object.assign(row, {\n        properties: Object.assign(row.properties, {\n            __heatmapIntensity: getHeatmapIntensityForAmount(row, amountColumn, dataMax),\n            __heatmapSize: getHeatmapSizeForAmount(row, amountColumn, dataMax)\n        })\n    });\n};\nvar HeatmapExtractorsMap = exports.HeatmapExtractorsMap = (_HeatmapExtractorsMap = {}, _defineProperty(_HeatmapExtractorsMap, _map_constants.MapTypes.Heatmap.types.amount, {\n    intensityExtractor: function intensityExtractor(row) {\n        return row.properties.__heatmapIntensity;\n    },\n    sizeExtractor: function sizeExtractor(row) {\n        return row.properties.__heatmapSize;\n    }\n}), _defineProperty(_HeatmapExtractorsMap, _map_constants.MapTypes.Heatmap.types.density, {}), _HeatmapExtractorsMap);\nvar ingestRowsForMap = exports.ingestRowsForMap = function ingestRowsForMap(rows, currentMapType, amountColumn, dataMax) {\n    var transformedRows = transformRowsToFeatures(filterRowsWithoutLocation(rows));\n    if (currentMapType === _map_constants.MapTypes.Heatmap.name) {\n        return transformedRows.map(function (row) {\n            return mapAmountField(row, amountColumn, dataMax);\n        });\n    }\n    return transformedRows;\n};\nfunction lngLatExtractor(r) {\n    // the location_json field from the API is standard GeoJSON which comes with LngLat coords in this specific format\n    return r && r[locationColumn] && r[locationColumn].coordinates && r[locationColumn].coordinates.length == 2 && r[locationColumn].coordinates;\n}\nfunction getLngLatFromFeature(feature) {\n    return { lng: feature.geometry.coordinates[0], lat: feature.geometry.coordinates[1] };\n}\nfunction getFeatureCoordinates(feature) {\n    return feature.geometry.coordinates;\n}\nvar locationColumn = exports.locationColumn = 'location_json';\nvar objectFromKeyArray = function objectFromKeyArray(columns) {\n    return function (row) {\n        return _lodash2.default.reduce(columns, function (object, column, index) {\n            return _lodash2.default.assign(object, _defineProperty({}, column, row[index]));\n        }, {});\n    };\n};\nvar buildObjectsFromArrays = function buildObjectsFromArrays(arrays, keys) {\n    return _lodash2.default.map(arrays, objectFromKeyArray(keys));\n};\nvar parseGeoJson = exports.parseGeoJson = function parseGeoJson(row) {\n    return _lodash2.default.mapValues(row, function (value, key) {\n        return key == locationColumn ? JSON.parse(value) : value;\n    });\n};\nvar buildObjectsFromGeoResponse = exports.buildObjectsFromGeoResponse = function buildObjectsFromGeoResponse(result) {\n    return _lodash2.default.map(buildObjectsFromArrays(result.body.query_results, result.body.query_header), parseGeoJson);\n};\n\n/***/ }),\n/* 148 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__translate__ = __webpack_require__(960);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"translate\", function() { return __WEBPACK_IMPORTED_MODULE_0__translate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__I18n__ = __webpack_require__(523);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"I18n\", function() { return __WEBPACK_IMPORTED_MODULE_1__I18n__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Interpolate__ = __webpack_require__(962);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Interpolate\", function() { return __WEBPACK_IMPORTED_MODULE_2__Interpolate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Trans__ = __webpack_require__(963);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Trans\", function() { return __WEBPACK_IMPORTED_MODULE_3__Trans__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__I18nextProvider__ = __webpack_require__(969);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"I18nextProvider\", function() { return __WEBPACK_IMPORTED_MODULE_4__I18nextProvider__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__loadNamespaces__ = __webpack_require__(970);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"loadNamespaces\", function() { return __WEBPACK_IMPORTED_MODULE_5__loadNamespaces__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__context__ = __webpack_require__(266);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"reactI18nextModule\", function() { return __WEBPACK_IMPORTED_MODULE_6__context__[\"c\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"setDefaults\", function() { return __WEBPACK_IMPORTED_MODULE_6__context__[\"d\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"getDefaults\", function() { return __WEBPACK_IMPORTED_MODULE_6__context__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"setI18n\", function() { return __WEBPACK_IMPORTED_MODULE_6__context__[\"e\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"getI18n\", function() { return __WEBPACK_IMPORTED_MODULE_6__context__[\"b\"]; });\n\n\n\n\n\n\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\nvar validateSpec = __webpack_require__(101);\n\nmodule.exports = function validateObject(options) {\n    var key = options.key;\n    var object = options.value;\n    var elementSpecs = options.valueSpec || {};\n    var elementValidators = options.objectElementValidators || {};\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var errors = [];\n\n    var type = getType(object);\n    if (type !== 'object') {\n        return [new ValidationError(key, object, 'object expected, %s found', type)];\n    }\n\n    for (var objectKey in object) {\n        var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n        var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n\n        var validateElement;\n        if (elementValidators[elementSpecKey]) {\n            validateElement = elementValidators[elementSpecKey];\n        } else if (elementSpecs[elementSpecKey]) {\n            validateElement = validateSpec;\n        } else if (elementValidators['*']) {\n            validateElement = elementValidators['*'];\n        } else if (elementSpecs['*']) {\n            validateElement = validateSpec;\n        } else {\n            errors.push(new ValidationError(key, object[objectKey], 'unknown property \"%s\"', objectKey));\n            continue;\n        }\n\n        errors = errors.concat(validateElement({\n            key: (key ? key + '.' : key) + objectKey,\n            value: object[objectKey],\n            valueSpec: elementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            object: object,\n            objectKey: objectKey\n        }));\n    }\n\n    for (elementSpecKey in elementSpecs) {\n        if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {\n            errors.push(new ValidationError(key, object, 'missing required property \"%s\"', elementSpecKey));\n        }\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nmodule.exports = function unbundle(value) {\n    if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n        return value.valueOf();\n    } else {\n        return value;\n    }\n};\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Buffer;\n\n/**\n * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n *\n * @class Buffer\n * @private\n * @param {object} array A serialized StructArray.\n * @param {object} arrayType A serialized StructArrayType.\n * @param {BufferType} type\n */\nfunction Buffer(array, arrayType, type) {\n    this.arrayBuffer = array.arrayBuffer;\n    this.length = array.length;\n    this.attributes = arrayType.members;\n    this.itemSize = arrayType.bytesPerElement;\n    this.type = type;\n    this.arrayType = arrayType;\n}\n\n/**\n * Bind this buffer to a WebGL context.\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.bind = function(gl) {\n    var type = gl[this.type];\n\n    if (!this.buffer) {\n        this.buffer = gl.createBuffer();\n        gl.bindBuffer(type, this.buffer);\n        gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW);\n\n        // dump array buffer once it's bound to gl\n        this.arrayBuffer = null;\n    } else {\n        gl.bindBuffer(type, this.buffer);\n    }\n};\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nvar AttributeType = {\n    Int8:   'BYTE',\n    Uint8:  'UNSIGNED_BYTE',\n    Int16:  'SHORT',\n    Uint16: 'UNSIGNED_SHORT'\n};\n\n/**\n * Set the attribute pointers in a WebGL context\n * @private\n * @param gl The WebGL context\n * @param program The active WebGL program\n */\nBuffer.prototype.setVertexAttribPointers = function(gl, program) {\n    for (var j = 0; j < this.attributes.length; j++) {\n        var member = this.attributes[j];\n        var attribIndex = program[member.name];\n\n        if (attribIndex !== undefined) {\n            gl.vertexAttribPointer(\n                attribIndex,\n                member.components,\n                gl[AttributeType[member.type]],\n                false,\n                this.arrayType.bytesPerElement,\n                member.offset\n            );\n        }\n    }\n};\n\n/**\n * Destroy the GL buffer bound to the given WebGL context\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.destroy = function(gl) {\n    if (this.buffer) {\n        gl.deleteBuffer(this.buffer);\n    }\n};\n\n/**\n * @enum {string} BufferType\n * @private\n * @readonly\n */\nBuffer.BufferType = {\n    VERTEX: 'ARRAY_BUFFER',\n    ELEMENT: 'ELEMENT_ARRAY_BUFFER'\n};\n\n/**\n * An `BufferType.ELEMENT` buffer holds indicies of a corresponding `BufferType.VERTEX` buffer.\n * These indicies are stored in the `BufferType.ELEMENT` buffer as `UNSIGNED_SHORT`s.\n *\n * @private\n * @readonly\n */\nBuffer.ELEMENT_ATTRIBUTE_TYPE = 'Uint16';\n\n/**\n * WebGL performs best if vertex attribute offsets are aligned to 4 byte boundaries.\n * @private\n * @readonly\n */\nBuffer.VERTEX_ATTRIBUTE_ALIGNMENT = 4;\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = VertexArrayObject;\n\nfunction VertexArrayObject() {\n    this.boundProgram = null;\n    this.boundVertexBuffer = null;\n    this.boundVertexBuffer2 = null;\n    this.boundElementBuffer = null;\n    this.vao = null;\n}\n\nVertexArrayObject.prototype.bind = function(gl, program, vertexBuffer, elementBuffer, vertexBuffer2) {\n\n    if (gl.extVertexArrayObject === undefined) {\n        gl.extVertexArrayObject = gl.getExtension(\"OES_vertex_array_object\");\n    }\n\n    var isFreshBindRequired = (\n        !this.vao ||\n        this.boundProgram !== program ||\n        this.boundVertexBuffer !== vertexBuffer ||\n        this.boundVertexBuffer2 !== vertexBuffer2 ||\n        this.boundElementBuffer !== elementBuffer\n    );\n\n    if (!gl.extVertexArrayObject || isFreshBindRequired) {\n        this.freshBind(gl, program, vertexBuffer, elementBuffer, vertexBuffer2);\n    } else {\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n    }\n};\n\nVertexArrayObject.prototype.freshBind = function(gl, program, vertexBuffer, elementBuffer, vertexBuffer2) {\n    var numPrevAttributes;\n    var numNextAttributes = program.numAttributes;\n\n    if (gl.extVertexArrayObject) {\n        if (this.vao) this.destroy(gl);\n        this.vao = gl.extVertexArrayObject.createVertexArrayOES();\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n        numPrevAttributes = 0;\n\n        // store the arguments so that we can verify them when the vao is bound again\n        this.boundProgram = program;\n        this.boundVertexBuffer = vertexBuffer;\n        this.boundVertexBuffer2 = vertexBuffer2;\n        this.boundElementBuffer = elementBuffer;\n\n    } else {\n        numPrevAttributes = gl.currentNumAttributes || 0;\n\n        // Disable all attributes from the previous program that aren't used in\n        // the new program. Note: attribute indices are *not* program specific!\n        for (var i = numNextAttributes; i < numPrevAttributes; i++) {\n            // WebGL breaks if you disable attribute 0.\n            // http://stackoverflow.com/questions/20305231\n            assert(i !== 0);\n            gl.disableVertexAttribArray(i);\n        }\n    }\n\n    // Enable all attributes for the new program.\n    for (var j = numPrevAttributes; j < numNextAttributes; j++) {\n        gl.enableVertexAttribArray(j);\n    }\n\n    vertexBuffer.bind(gl);\n    vertexBuffer.setVertexAttribPointers(gl, program);\n    if (vertexBuffer2) {\n        vertexBuffer2.bind(gl);\n        vertexBuffer2.setVertexAttribPointers(gl, program);\n    }\n    if (elementBuffer) {\n        elementBuffer.bind(gl);\n    }\n\n    gl.currentNumAttributes = numNextAttributes;\n};\n\nVertexArrayObject.prototype.unbind = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext) {\n        ext.bindVertexArrayOES(null);\n    }\n};\n\nVertexArrayObject.prototype.destroy = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext && this.vao) {\n        ext.deleteVertexArrayOES(this.vao);\n        this.vao = null;\n    }\n};\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\n\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar EXTENT_MIN = EXTENT * -2;\nvar EXTENT_MAX = (EXTENT * 2) - 1;\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @private\n */\nmodule.exports = function loadGeometry(feature) {\n    var scale = EXTENT / feature.extent;\n    var geometry = feature.loadGeometry();\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n        for (var p = 0; p < ring.length; p++) {\n            var point = ring[p];\n            // round here because mapbox-gl-native uses integers to represent\n            // points and we need to do the same to avoid renering differences.\n            point.x = Math.round(point.x * scale);\n            point.y = Math.round(point.y * scale);\n            if (\n                point.x < EXTENT_MIN ||\n                point.x > EXTENT_MAX ||\n                point.y < EXTENT_MIN ||\n                point.y > EXTENT_MAX) {\n                util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n            }\n        }\n    }\n    return geometry;\n};\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\nvar WhooTS = __webpack_require__(569);\nvar Coordinate = __webpack_require__(190);\n\nmodule.exports = TileCoord;\n\nfunction TileCoord(z, x, y, w) {\n    assert(!isNaN(z) && z >= 0 && z % 1 === 0);\n    assert(!isNaN(x) && x >= 0 && x % 1 === 0);\n    assert(!isNaN(y) && y >= 0 && y % 1 === 0);\n\n    if (isNaN(w)) w = 0;\n\n    this.z = +z;\n    this.x = +x;\n    this.y = +y;\n    this.w = +w;\n\n    // calculate id\n    w *= 2;\n    if (w < 0) w = w * -1 - 1;\n    var dim = 1 << this.z;\n    this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n\n    // for caching pos matrix calculation when rendering\n    this.posMatrix = null;\n}\n\nTileCoord.prototype.toString = function() {\n    return this.z + \"/\" + this.x + \"/\" + this.y;\n};\n\nTileCoord.prototype.toCoordinate = function(sourceMaxZoom) {\n    var zoom = Math.min(this.z, sourceMaxZoom);\n    var tileScale = Math.pow(2, zoom);\n    var row = this.y;\n    var column = this.x + tileScale * this.w;\n    return new Coordinate(column, row, zoom);\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n    var z = id % 32, dim = 1 << z;\n    var xy = ((id - z) / 32);\n    var x = xy % dim, y = ((xy - x) / dim) % dim;\n    var w = Math.floor(xy / (dim * dim));\n    if (w % 2 !== 0) w = w * -1 - 1;\n    w /= 2;\n    return new TileCoord(z, x, y, w);\n};\n\n// given a list of urls, choose a url template and return a tile URL\nTileCoord.prototype.url = function(urls, sourceMaxZoom, scheme) {\n    var bbox = WhooTS.getTileBBox(this.x, this.y, this.z);\n\n    return urls[(this.x + this.y) % urls.length]\n        .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n        .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n        .replace('{x}', this.x)\n        .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)\n        .replace('{bbox-epsg-3857}', bbox);\n};\n\n// Return the coordinate of the parent tile\nTileCoord.prototype.parent = function(sourceMaxZoom) {\n    if (this.z === 0) return null;\n\n    // the id represents an overscaled tile, return the same coordinates with a lower z\n    if (this.z > sourceMaxZoom) {\n        return new TileCoord(this.z - 1, this.x, this.y, this.w);\n    }\n\n    return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n};\n\nTileCoord.prototype.wrapped = function() {\n    return new TileCoord(this.z, this.x, this.y, 0);\n};\n\n// Return the coordinates of the tile's children\nTileCoord.prototype.children = function(sourceMaxZoom) {\n\n    if (this.z >= sourceMaxZoom) {\n        // return a single tile coord representing a an overscaled tile\n        return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n    }\n\n    var z = this.z + 1;\n    var x = this.x * 2;\n    var y = this.y * 2;\n    return [\n        new TileCoord(z, x, y, this.w),\n        new TileCoord(z, x + 1, y, this.w),\n        new TileCoord(z, x, y + 1, this.w),\n        new TileCoord(z, x + 1, y + 1, this.w)\n    ];\n};\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n    if (a.row > b.row) { var t = a; a = b; b = t; }\n    return {\n        x0: a.column,\n        y0: a.row,\n        x1: b.column,\n        y1: b.row,\n        dx: b.column - a.column,\n        dy: b.row - a.row\n    };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n    var y0 = Math.max(ymin, Math.floor(e1.y0));\n    var y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n    // sort edges by x-coordinate\n    if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n            (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n            (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n        var t = e0; e0 = e1; e1 = t;\n    }\n\n    // scan lines!\n    var m0 = e0.dx / e0.dy;\n    var m1 = e1.dx / e1.dy;\n    var d0 = e0.dx > 0; // use y + 1 to compute x0\n    var d1 = e1.dx < 0; // use y + 1 to compute x1\n    for (var y = y0; y < y1; y++) {\n        var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n        var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n        scanLine(Math.floor(x1), Math.ceil(x0), y);\n    }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n    var ab = edge(a, b),\n        bc = edge(b, c),\n        ca = edge(c, a);\n\n    var t;\n\n    // sort edges by y-length\n    if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n    if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n    if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n    // scan span! scan span!\n    if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n    if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ) {\n    var tiles = 1 << z;\n    var t = {};\n\n    function scanLine(x0, x1, y) {\n        var x, wx, coord;\n        if (y >= 0 && y <= tiles) {\n            for (x = x0; x < x1; x++) {\n                wx = (x % tiles + tiles) % tiles;\n                coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles));\n                t[coord.id] = coord;\n            }\n        }\n    }\n\n    // Divide the screen up in two triangles and scan each of them:\n    // +---/\n    // | / |\n    // /---+\n    scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n    scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n    return Object.keys(t).map(function(id) {\n        return t[id];\n    });\n};\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(40);\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @param {object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work\n * @param {number} pixelValue\n * @param {number} z\n * @returns {number} value in tile units\n * @private\n */\nmodule.exports = function(tile, pixelValue, z) {\n    return pixelValue * (Bucket.EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z)));\n};\n\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  if (path.length === 0) return '.';\n  var code = path.charCodeAt(0);\n  var hasRoot = code === 47 /*/*/;\n  var end = -1;\n  var matchedSlash = true;\n  for (var i = path.length - 1; i >= 1; --i) {\n    code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        if (!matchedSlash) {\n          end = i;\n          break;\n        }\n      } else {\n      // We saw the first non-path separator\n      matchedSlash = false;\n    }\n  }\n\n  if (end === -1) return hasRoot ? '/' : '.';\n  if (hasRoot && end === 1) {\n    // return '//';\n    // Backwards-compat fix:\n    return '/';\n  }\n  return path.slice(0, end);\n};\n\nfunction basename(path) {\n  if (typeof path !== 'string') path = path + '';\n\n  var start = 0;\n  var end = -1;\n  var matchedSlash = true;\n  var i;\n\n  for (i = path.length - 1; i >= 0; --i) {\n    if (path.charCodeAt(i) === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          start = i + 1;\n          break;\n        }\n      } else if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // path component\n      matchedSlash = false;\n      end = i + 1;\n    }\n  }\n\n  if (end === -1) return '';\n  return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n  var f = basename(path);\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\nexports.extname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  var startDot = -1;\n  var startPart = 0;\n  var end = -1;\n  var matchedSlash = true;\n  // Track the state of characters (if any) we see before our first dot and\n  // after any path separator we find\n  var preDotState = 0;\n  for (var i = path.length - 1; i >= 0; --i) {\n    var code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          startPart = i + 1;\n          break;\n        }\n        continue;\n      }\n    if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // extension\n      matchedSlash = false;\n      end = i + 1;\n    }\n    if (code === 46 /*.*/) {\n        // If this is our first dot, mark it as the start of our extension\n        if (startDot === -1)\n          startDot = i;\n        else if (preDotState !== 1)\n          preDotState = 1;\n    } else if (startDot !== -1) {\n      // We saw a non-dot and non-path separator before our dot, so we should\n      // have a good chance at having a non-empty extension\n      preDotState = -1;\n    }\n  }\n\n  if (startDot === -1 || end === -1 ||\n      // We saw a non-dot character immediately before the dot\n      preDotState === 0 ||\n      // The (right-most) trimmed path component is exactly '..'\n      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n    return '';\n  }\n  return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(116)))\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(602);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar getType = __webpack_require__(72);\nvar validate = __webpack_require__(127);\n\nmodule.exports = function validateObject(options) {\n    var key = options.key;\n    var object = options.value;\n    var valueSpec = options.valueSpec;\n    var objectElementValidators = options.objectElementValidators || {};\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var errors = [];\n\n    var type = getType(object);\n    if (type !== 'object') {\n        return [new ValidationError(key, object, 'object expected, %s found', type)];\n    }\n\n    for (var objectKey in object) {\n        var valueSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n        var objectElementSpec = valueSpec && (valueSpec[valueSpecKey] || valueSpec['*']);\n        var objectElementValidator = objectElementValidators[valueSpecKey] || objectElementValidators['*'];\n\n        if (objectElementSpec || objectElementValidator) {\n            errors = errors.concat((objectElementValidator || validate)({\n                key: (key ? key + '.' : key) + objectKey,\n                value: object[objectKey],\n                valueSpec: objectElementSpec,\n                style: style,\n                styleSpec: styleSpec,\n                object: object,\n                objectKey: objectKey\n            }));\n\n        // tolerate root-level extra keys & arbitrary layer properties\n        // TODO remove this layer-specific logic\n        } else if (key !== '' && key.split('.').length !== 1) {\n            errors.push(new ValidationError(key, object[objectKey], 'unknown property \"%s\"', objectKey));\n        }\n    }\n\n    for (valueSpecKey in valueSpec) {\n        if (valueSpec[valueSpecKey].required && valueSpec[valueSpecKey]['default'] === undefined && object[valueSpecKey] === undefined) {\n            errors.push(new ValidationError(key, object, 'missing required property \"%s\"', valueSpecKey));\n        }\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Buffer;\n\n/**\n * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n *\n * @class Buffer\n * @private\n * @param {object} array A serialized StructArray.\n * @param {object} arrayType A serialized StructArrayType.\n * @param {BufferType} type\n */\nfunction Buffer(array, arrayType, type) {\n    this.arrayBuffer = array.arrayBuffer;\n    this.length = array.length;\n    this.attributes = arrayType.members;\n    this.itemSize = arrayType.bytesPerElement;\n    this.type = type;\n    this.arrayType = arrayType;\n}\n\n/**\n * Bind this buffer to a WebGL context.\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.bind = function(gl) {\n    var type = gl[this.type];\n\n    if (!this.buffer) {\n        this.buffer = gl.createBuffer();\n        gl.bindBuffer(type, this.buffer);\n        gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW);\n\n        // dump array buffer once it's bound to gl\n        this.arrayBuffer = null;\n    } else {\n        gl.bindBuffer(type, this.buffer);\n    }\n};\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nvar AttributeType = {\n    Int8:   'BYTE',\n    Uint8:  'UNSIGNED_BYTE',\n    Int16:  'SHORT',\n    Uint16: 'UNSIGNED_SHORT'\n};\n\n/**\n * Set the attribute pointers in a WebGL context\n * @private\n * @param gl The WebGL context\n * @param program The active WebGL program\n */\nBuffer.prototype.setVertexAttribPointers = function(gl, program) {\n    for (var j = 0; j < this.attributes.length; j++) {\n        var member = this.attributes[j];\n        var attribIndex = program[member.name];\n\n        if (attribIndex !== undefined) {\n            gl.vertexAttribPointer(\n                attribIndex,\n                member.components,\n                gl[AttributeType[member.type]],\n                false,\n                this.arrayType.bytesPerElement,\n                member.offset\n            );\n        }\n    }\n};\n\n/**\n * Destroy the GL buffer bound to the given WebGL context\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.destroy = function(gl) {\n    if (this.buffer) {\n        gl.deleteBuffer(this.buffer);\n    }\n};\n\n/**\n * @enum {string} BufferType\n * @private\n * @readonly\n */\nBuffer.BufferType = {\n    VERTEX: 'ARRAY_BUFFER',\n    ELEMENT: 'ELEMENT_ARRAY_BUFFER'\n};\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = VertexArrayObject;\n\nfunction VertexArrayObject() {\n    this.boundProgram = null;\n    this.boundVertexBuffer = null;\n    this.boundVertexBuffer2 = null;\n    this.boundElementBuffer = null;\n    this.vao = null;\n}\n\nVertexArrayObject.prototype.bind = function(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2) {\n\n    if (gl.extVertexArrayObject === undefined) {\n        gl.extVertexArrayObject = gl.getExtension(\"OES_vertex_array_object\");\n    }\n\n    var isFreshBindRequired = (\n        !this.vao ||\n        this.boundProgram !== program ||\n        this.boundVertexBuffer !== layoutVertexBuffer ||\n        this.boundVertexBuffer2 !== vertexBuffer2 ||\n        this.boundElementBuffer !== elementBuffer\n    );\n\n    if (!gl.extVertexArrayObject || isFreshBindRequired) {\n        this.freshBind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2);\n    } else {\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n    }\n};\n\nVertexArrayObject.prototype.freshBind = function(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2) {\n    var numPrevAttributes;\n    var numNextAttributes = program.numAttributes;\n\n    if (gl.extVertexArrayObject) {\n        if (this.vao) this.destroy(gl);\n        this.vao = gl.extVertexArrayObject.createVertexArrayOES();\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n        numPrevAttributes = 0;\n\n        // store the arguments so that we can verify them when the vao is bound again\n        this.boundProgram = program;\n        this.boundVertexBuffer = layoutVertexBuffer;\n        this.boundVertexBuffer2 = vertexBuffer2;\n        this.boundElementBuffer = elementBuffer;\n\n    } else {\n        numPrevAttributes = gl.currentNumAttributes || 0;\n\n        // Disable all attributes from the previous program that aren't used in\n        // the new program. Note: attribute indices are *not* program specific!\n        for (var i = numNextAttributes; i < numPrevAttributes; i++) {\n            // WebGL breaks if you disable attribute 0.\n            // http://stackoverflow.com/questions/20305231\n            assert(i !== 0);\n            gl.disableVertexAttribArray(i);\n        }\n    }\n\n    // Enable all attributes for the new program.\n    for (var j = numPrevAttributes; j < numNextAttributes; j++) {\n        gl.enableVertexAttribArray(j);\n    }\n\n    layoutVertexBuffer.bind(gl);\n    layoutVertexBuffer.setVertexAttribPointers(gl, program);\n    if (vertexBuffer2) {\n        vertexBuffer2.bind(gl);\n        vertexBuffer2.setVertexAttribPointers(gl, program);\n    }\n    if (elementBuffer) {\n        elementBuffer.bind(gl);\n    }\n\n    gl.currentNumAttributes = numNextAttributes;\n};\n\nVertexArrayObject.prototype.unbind = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext) {\n        ext.bindVertexArrayOES(null);\n    }\n};\n\nVertexArrayObject.prototype.destroy = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext && this.vao) {\n        ext.deleteVertexArrayOES(this.vao);\n        this.vao = null;\n    }\n};\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar assert = __webpack_require__(35);\n\n\n// These bounds define the minimum and maximum supported coordinate values.\n// While visible coordinates are within [0, EXTENT], tiles may theoretically\n// contain cordinates within [-Infinity, Infinity]. Our range is limited by the\n// number of bits used to represent the coordinate.\nfunction createBounds(bits) {\n    return {\n        min: -1 * Math.pow(2, bits - 1),\n        max: Math.pow(2, bits - 1) - 1\n    };\n}\n\nvar boundsLookup = {\n    15: createBounds(15),\n    16: createBounds(16)\n};\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @param {VectorTileFeature} feature\n * @param {number} [bits=16] The number of signed integer bits available to store\n *   each coordinate. A warning will be issued if any coordinate will not fits\n *   in the specified number of bits.\n * @private\n */\nmodule.exports = function loadGeometry(feature, bits) {\n    var bounds = boundsLookup[bits || 16];\n    assert(bounds);\n\n    var scale = EXTENT / feature.extent;\n    var geometry = feature.loadGeometry();\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n        for (var p = 0; p < ring.length; p++) {\n            var point = ring[p];\n            // round here because mapbox-gl-native uses integers to represent\n            // points and we need to do the same to avoid renering differences.\n            point.x = Math.round(point.x * scale);\n            point.y = Math.round(point.y * scale);\n\n            if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) {\n                util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n            }\n        }\n    }\n    return geometry;\n};\n\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\nvar WhooTS = __webpack_require__(569);\nvar Coordinate = __webpack_require__(215);\n\nmodule.exports = TileCoord;\n\nfunction TileCoord(z, x, y, w) {\n    assert(!isNaN(z) && z >= 0 && z % 1 === 0);\n    assert(!isNaN(x) && x >= 0 && x % 1 === 0);\n    assert(!isNaN(y) && y >= 0 && y % 1 === 0);\n\n    if (isNaN(w)) w = 0;\n\n    this.z = +z;\n    this.x = +x;\n    this.y = +y;\n    this.w = +w;\n\n    // calculate id\n    w *= 2;\n    if (w < 0) w = w * -1 - 1;\n    var dim = 1 << this.z;\n    this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n\n    // for caching pos matrix calculation when rendering\n    this.posMatrix = null;\n}\n\nTileCoord.prototype.toString = function() {\n    return this.z + \"/\" + this.x + \"/\" + this.y;\n};\n\nTileCoord.prototype.toCoordinate = function(sourceMaxZoom) {\n    var zoom = Math.min(this.z, sourceMaxZoom);\n    var tileScale = Math.pow(2, zoom);\n    var row = this.y;\n    var column = this.x + tileScale * this.w;\n    return new Coordinate(column, row, zoom);\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n    var z = id % 32, dim = 1 << z;\n    var xy = ((id - z) / 32);\n    var x = xy % dim, y = ((xy - x) / dim) % dim;\n    var w = Math.floor(xy / (dim * dim));\n    if (w % 2 !== 0) w = w * -1 - 1;\n    w /= 2;\n    return new TileCoord(z, x, y, w);\n};\n\nfunction getQuadkey(z, x, y) {\n    var quadkey = '', mask;\n    for (var i = z; i > 0; i--) {\n        mask = 1 << (i - 1);\n        quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));\n    }\n    return quadkey;\n}\n\n// given a list of urls, choose a url template and return a tile URL\nTileCoord.prototype.url = function(urls, sourceMaxZoom, scheme) {\n    var bbox = WhooTS.getTileBBox(this.x, this.y, this.z);\n    var quadkey = getQuadkey(this.z, this.x, this.y);\n\n    return urls[(this.x + this.y) % urls.length]\n        .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n        .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n        .replace('{x}', this.x)\n        .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)\n        .replace('{quadkey}', quadkey)\n        .replace('{bbox-epsg-3857}', bbox);\n};\n\n// Return the coordinate of the parent tile\nTileCoord.prototype.parent = function(sourceMaxZoom) {\n    if (this.z === 0) return null;\n\n    // the id represents an overscaled tile, return the same coordinates with a lower z\n    if (this.z > sourceMaxZoom) {\n        return new TileCoord(this.z - 1, this.x, this.y, this.w);\n    }\n\n    return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n};\n\nTileCoord.prototype.wrapped = function() {\n    return new TileCoord(this.z, this.x, this.y, 0);\n};\n\n// Return the coordinates of the tile's children\nTileCoord.prototype.children = function(sourceMaxZoom) {\n\n    if (this.z >= sourceMaxZoom) {\n        // return a single tile coord representing a an overscaled tile\n        return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n    }\n\n    var z = this.z + 1;\n    var x = this.x * 2;\n    var y = this.y * 2;\n    return [\n        new TileCoord(z, x, y, this.w),\n        new TileCoord(z, x + 1, y, this.w),\n        new TileCoord(z, x, y + 1, this.w),\n        new TileCoord(z, x + 1, y + 1, this.w)\n    ];\n};\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n    if (a.row > b.row) { var t = a; a = b; b = t; }\n    return {\n        x0: a.column,\n        y0: a.row,\n        x1: b.column,\n        y1: b.row,\n        dx: b.column - a.column,\n        dy: b.row - a.row\n    };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n    var y0 = Math.max(ymin, Math.floor(e1.y0));\n    var y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n    // sort edges by x-coordinate\n    if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n            (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n            (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n        var t = e0; e0 = e1; e1 = t;\n    }\n\n    // scan lines!\n    var m0 = e0.dx / e0.dy;\n    var m1 = e1.dx / e1.dy;\n    var d0 = e0.dx > 0; // use y + 1 to compute x0\n    var d1 = e1.dx < 0; // use y + 1 to compute x1\n    for (var y = y0; y < y1; y++) {\n        var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n        var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n        scanLine(Math.floor(x1), Math.ceil(x0), y);\n    }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n    var ab = edge(a, b),\n        bc = edge(b, c),\n        ca = edge(c, a);\n\n    var t;\n\n    // sort edges by y-length\n    if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n    if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n    if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n    // scan span! scan span!\n    if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n    if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ) {\n    var tiles = 1 << z;\n    var t = {};\n\n    function scanLine(x0, x1, y) {\n        var x, wx, coord;\n        if (y >= 0 && y <= tiles) {\n            for (x = x0; x < x1; x++) {\n                wx = (x % tiles + tiles) % tiles;\n                coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles));\n                t[coord.id] = coord;\n            }\n        }\n    }\n\n    // Divide the screen up in two triangles and scan each of them:\n    // +---/\n    // | / |\n    // /---+\n    scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n    scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n    return Object.keys(t).map(function(id) {\n        return t[id];\n    });\n};\n\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(42);\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @param {object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work\n * @param {number} pixelValue\n * @param {number} z\n * @returns {number} value in tile units\n * @private\n */\nmodule.exports = function(tile, pixelValue, z) {\n    return pixelValue * (Bucket.EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z)));\n};\n\n\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar Evented = __webpack_require__(47);\nmodule.exports = Control;\n\n/**\n * The base class for map-related interface elements.\n *\n * The `Control` class mixes in [`Evented`](#Evented) methods.\n *\n * @class Control\n */\nfunction Control() {}\n\nControl.prototype = {\n    /**\n     * Adds the control to a map.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the control to.\n     * @returns {Control} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        var container = this._container = this.onAdd(map);\n        if (this.options && this.options.position) {\n            var pos = this.options.position;\n            var corner = map._controlCorners[pos];\n            container.className += ' mapboxgl-ctrl';\n            if (pos.indexOf('bottom') !== -1) {\n                corner.insertBefore(container, corner.firstChild);\n            } else {\n                corner.appendChild(container);\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Removes the control from the map it has been added to.\n     *\n     * @returns {Control} `this`\n     */\n    remove: function() {\n        this._container.parentNode.removeChild(this._container);\n        if (this.onRemove) this.onRemove(this._map);\n        this._map = null;\n        return this;\n    }\n};\n\nutil.extend(Control.prototype, Evented);\n\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar pushHash = function pushHash(hash) {\n  hash = hash ? hash.indexOf('#') === 0 ? hash : '#' + hash : '';\n\n  if (history.pushState) {\n    var loc = window.location;\n    history.pushState(null, null, hash ? hash\n    // remove hash\n    : loc.pathname + loc.search);\n  } else {\n    location.hash = hash;\n  }\n};\n\nvar getHash = function getHash() {\n  return window.location.hash.replace(/^#/, '');\n};\n\nvar filterElementInContainer = function filterElementInContainer(container) {\n  return function (element) {\n    return container.contains ? container != element && container.contains(element) : !!(container.compareDocumentPosition(element) & 16);\n  };\n};\n\nvar scrollOffset = function scrollOffset(c, t) {\n  return c === document ? t.getBoundingClientRect().top + (window.scrollY || window.pageYOffset) : getComputedStyle(c).position === \"relative\" ? t.offsetTop : t.getBoundingClientRect().top + c.scrollTop;\n};\n\nexports.default = {\n  pushHash: pushHash,\n  getHash: getHash,\n  filterElementInContainer: filterElementInContainer,\n  scrollOffset: scrollOffset\n};\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar contains = exports.contains = function contains(bit, value) {\n    return (bit & value) !== 0;\n};\n\nvar distance = exports.distance = function distance(a, b) {\n    return Math.sqrt(a * a + b * b);\n};\n\nvar copyCSSStyles = exports.copyCSSStyles = function copyCSSStyles(style, target) {\n    // Edge does not provide value for cssText\n    for (var i = style.length - 1; i >= 0; i--) {\n        var property = style.item(i);\n        // Safari shows pseudoelements if content is set\n        if (property !== 'content') {\n            target.style.setProperty(property, style.getPropertyValue(property));\n        }\n    }\n    return target;\n};\n\nvar SMALL_IMAGE = exports.SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(64);\nvar global = __webpack_require__(16);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(94) ? 'pure' : 'global',\n  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(66);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(13);\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(13);\nvar aFunction = __webpack_require__(46);\nvar SPECIES = __webpack_require__(23)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Cookies.js - 0.4.0\n *\n * Copyright (c) 2014, Scott Hamper\n * Licensed under the MIT license,\n * http://www.opensource.org/licenses/MIT\n */\n(function (undefined) {\n    'use strict';\n\n    var Cookies = function (key, value, options) {\n        return arguments.length === 1 ?\n            Cookies.get(key) : Cookies.set(key, value, options);\n    };\n\n    // Allows for setter injection in unit tests\n    Cookies._document = document;\n    Cookies._navigator = navigator;\n\n    Cookies.defaults = {\n        path: '/'\n    };\n\n    Cookies.get = function (key) {\n        if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\n            Cookies._renewCache();\n        }\n\n        return Cookies._cache[key];\n    };\n\n    Cookies.set = function (key, value, options) {\n        options = Cookies._getExtendedOptions(options);\n        options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\n\n        Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\n\n        return Cookies;\n    };\n\n    Cookies.expire = function (key, options) {\n        return Cookies.set(key, undefined, options);\n    };\n\n    Cookies._getExtendedOptions = function (options) {\n        return {\n            path: options && options.path || Cookies.defaults.path,\n            domain: options && options.domain || Cookies.defaults.domain,\n            expires: options && options.expires || Cookies.defaults.expires,\n            secure: options && options.secure !== undefined ?  options.secure : Cookies.defaults.secure\n        };\n    };\n\n    Cookies._isValidDate = function (date) {\n        return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\n    };\n\n    Cookies._getExpiresDate = function (expires, now) {\n        now = now || new Date();\n        switch (typeof expires) {\n            case 'number': expires = new Date(now.getTime() + expires * 1000); break;\n            case 'string': expires = new Date(expires); break;\n        }\n\n        if (expires && !Cookies._isValidDate(expires)) {\n            throw new Error('`expires` parameter cannot be converted to a valid Date instance');\n        }\n\n        return expires;\n    };\n\n    Cookies._generateCookieString = function (key, value, options) {\n        key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\n        key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n        value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\n        options = options || {};\n\n        var cookieString = key + '=' + value;\n        cookieString += options.path ? ';path=' + options.path : '';\n        cookieString += options.domain ? ';domain=' + options.domain : '';\n        cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\n        cookieString += options.secure ? ';secure' : '';\n\n        return cookieString;\n    };\n\n    Cookies._getCookieObjectFromString = function (documentCookie) {\n        var cookieObject = {};\n        var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\n\n        for (var i = 0; i < cookiesArray.length; i++) {\n            var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\n\n            if (cookieObject[cookieKvp.key] === undefined) {\n                cookieObject[cookieKvp.key] = cookieKvp.value;\n            }\n        }\n\n        return cookieObject;\n    };\n\n    Cookies._getKeyValuePairFromCookieString = function (cookieString) {\n        // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\n        var separatorIndex = cookieString.indexOf('=');\n\n        // IE omits the \"=\" when the cookie value is an empty string\n        separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\n\n        return {\n            key: decodeURIComponent(cookieString.substr(0, separatorIndex)),\n            value: decodeURIComponent(cookieString.substr(separatorIndex + 1))\n        };\n    };\n\n    Cookies._renewCache = function () {\n        Cookies._cache = Cookies._getCookieObjectFromString(Cookies._document.cookie);\n        Cookies._cachedDocumentCookie = Cookies._document.cookie;\n    };\n\n    Cookies._areEnabled = function () {\n        var testKey = 'cookies.js';\n        var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\n        Cookies.expire(testKey);\n        return areEnabled;\n    };\n\n    Cookies.enabled = Cookies._areEnabled();\n\n    // AMD support\n    if (true) {\n        !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { return Cookies; }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    // CommonJS and Node.js module support.\n    } else if (typeof exports !== 'undefined') {\n        // Support Node.js specific `module.exports` (which can be a function)\n        if (typeof module !== 'undefined' && module.exports) {\n            exports = module.exports = Cookies;\n        }\n        // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)\n        exports.Cookies = Cookies;\n    } else {\n        window.Cookies = Cookies;\n    }\n})();\n\n/***/ }),\n/* 175 */,\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.shouldTranslate = exports.currentLanguage = exports.getPreferredLanguage = undefined;\n\nvar _i18next = __webpack_require__(727);\n\nvar _i18next2 = _interopRequireDefault(_i18next);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar getPreferredLanguage = exports.getPreferredLanguage = function getPreferredLanguage() {\n    return window.gon && window.gon.preferred_language;\n};\nvar currentLanguage = exports.currentLanguage = getPreferredLanguage();\nvar shouldTranslate = exports.shouldTranslate = function shouldTranslate() {\n    return window.gon.standalone && currentLanguage && currentLanguage.toLowerCase().indexOf('en') !== 0;\n};\n_i18next2.default.init({\n    resources: {\n        'es': {\n            'report': __webpack_require__(738)\n        },\n        'en': {\n            'report': __webpack_require__(739)\n        }\n    },\n    lng: currentLanguage || 'en',\n    lowerCaseLng: true,\n    nonExplicitWhitelist: true,\n    whitelist: ['en', 'es'],\n    fallbackLng: 'en',\n    // have a report namespace used around the full app\n    ns: ['report'],\n    defaultNS: 'report',\n    debug: false,\n    interpolation: {\n        escapeValue: false // not needed for react!!\n    }\n}).changeLanguage(currentLanguage);\nexports.default = _i18next2.default;\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (false) {\n  validateFormat = function validateFormat(format) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n  validateFormat(format);\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(format.replace(/%s/g, function () {\n        return args[argIndex++];\n      }));\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n}\n\nmodule.exports = invariant;\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.DefaultRoute = __webpack_require__(354);\nexports.Link = __webpack_require__(757);\nexports.NotFoundRoute = __webpack_require__(356);\nexports.Redirect = __webpack_require__(357);\nexports.Route = __webpack_require__(180);\nexports.ActiveHandler = __webpack_require__(179);\nexports.RouteHandler = exports.ActiveHandler;\n\nexports.HashLocation = __webpack_require__(358);\nexports.HistoryLocation = __webpack_require__(250);\nexports.RefreshLocation = __webpack_require__(359);\nexports.StaticLocation = __webpack_require__(360);\nexports.TestLocation = __webpack_require__(758);\n\nexports.ImitateBrowserBehavior = __webpack_require__(361);\nexports.ScrollToTopBehavior = __webpack_require__(759);\n\nexports.History = __webpack_require__(118);\nexports.Navigation = __webpack_require__(760);\nexports.State = __webpack_require__(761);\n\nexports.createRoute = __webpack_require__(97).createRoute;\nexports.createDefaultRoute = __webpack_require__(97).createDefaultRoute;\nexports.createNotFoundRoute = __webpack_require__(97).createNotFoundRoute;\nexports.createRedirect = __webpack_require__(97).createRedirect;\nexports.createRoutesFromReactChildren = __webpack_require__(362);\n\nexports.create = __webpack_require__(363);\nexports.run = __webpack_require__(770);\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = __webpack_require__(0);\nvar ContextWrapper = __webpack_require__(756);\nvar assign = __webpack_require__(77);\nvar PropTypes = __webpack_require__(78);\n\nvar REF_NAME = \"__routeHandler__\";\n\n/**\n * A <RouteHandler> component renders the active child route handler\n * when routes are nested.\n */\n\nvar RouteHandler = (function (_React$Component) {\n  _inherits(RouteHandler, _React$Component);\n\n  function RouteHandler() {\n    _classCallCheck(this, RouteHandler);\n\n    _get(Object.getPrototypeOf(RouteHandler.prototype), \"constructor\", this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(RouteHandler, [{\n    key: \"getChildContext\",\n    value: function getChildContext() {\n      return {\n        routeDepth: this.context.routeDepth + 1\n      };\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this._updateRouteComponent(this[REF_NAME]);\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      this._updateRouteComponent(this[REF_NAME]);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this._updateRouteComponent(null);\n    }\n  }, {\n    key: \"_updateRouteComponent\",\n    value: function _updateRouteComponent(component) {\n      this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component);\n    }\n  }, {\n    key: \"getRouteDepth\",\n    value: function getRouteDepth() {\n      return this.context.routeDepth;\n    }\n  }, {\n    key: \"createChildRouteHandler\",\n    value: function createChildRouteHandler(props) {\n      var _this = this;\n\n      var route = this.context.router.getRouteAtDepth(this.getRouteDepth());\n\n      if (route == null) return null;\n\n      var childProps = assign({}, props || this.props, {\n        ref: function ref(_ref) {\n          return _this[REF_NAME] = _ref;\n        },\n        params: this.context.router.getCurrentParams(),\n        query: this.context.router.getCurrentQuery()\n      });\n\n      return React.createElement(route.handler, childProps);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var handler = this.createChildRouteHandler();\n      // <script/> for things like <CSSTransitionGroup/> that don't like null\n      return handler ? React.createElement(\n        ContextWrapper,\n        null,\n        handler\n      ) : React.createElement(\"script\", null);\n    }\n  }]);\n\n  return RouteHandler;\n})(React.Component);\n\nRouteHandler.contextTypes = {\n  routeDepth: PropTypes.number.isRequired,\n  router: PropTypes.router.isRequired\n};\n\nRouteHandler.childContextTypes = {\n  routeDepth: PropTypes.number.isRequired\n};\n\nmodule.exports = RouteHandler;\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = __webpack_require__(0);\nvar invariant = __webpack_require__(26);\nvar PropTypes = __webpack_require__(78);\nvar RouteHandler = __webpack_require__(179);\n\n/**\n * <Route> components specify components that are rendered to the page when the\n * URL matches a given pattern.\n *\n * Routes are arranged in a nested tree structure. When a new URL is requested,\n * the tree is searched depth-first to find a route whose path matches the URL.\n * When one is found, all routes in the tree that lead to it are considered\n * \"active\" and their components are rendered into the DOM, nested in the same\n * order as they are in the tree.\n *\n * The preferred way to configure a router is using JSX. The XML-like syntax is\n * a great way to visualize how routes are laid out in an application.\n *\n *   var routes = [\n *     <Route handler={App}>\n *       <Route name=\"login\" handler={Login}/>\n *       <Route name=\"logout\" handler={Logout}/>\n *       <Route name=\"about\" handler={About}/>\n *     </Route>\n *   ];\n *   \n *   Router.run(routes, function (Handler) {\n *     React.render(<Handler/>, document.body);\n *   });\n *\n * Handlers for Route components that contain children can render their active\n * child route using a <RouteHandler> element.\n *\n *   var App = React.createClass({\n *     render: function () {\n *       return (\n *         <div className=\"application\">\n *           <RouteHandler/>\n *         </div>\n *       );\n *     }\n *   });\n *\n * If no handler is provided for the route, it will render a matched child route.\n */\n\nvar Route = (function (_React$Component) {\n  _inherits(Route, _React$Component);\n\n  function Route() {\n    _classCallCheck(this, Route);\n\n    _get(Object.getPrototypeOf(Route.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(Route, [{\n    key: 'render',\n    value: function render() {\n      invariant(false, '%s elements are for router configuration only and should not be rendered', this.constructor.name);\n    }\n  }]);\n\n  return Route;\n})(React.Component);\n\nRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.string,\n  handler: PropTypes.func,\n  ignoreScrollBehavior: PropTypes.bool\n};\n\nRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = Route;\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports) {\n\nvar canUseDOM = !!(\n  typeof window !== 'undefined' &&\n  window.document &&\n  window.document.createElement\n);\n\nmodule.exports = canUseDOM;\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nvar _events = __webpack_require__(368);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));\n  }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar overlayEvents = new _events2.default();\nvar overlayItems = {};\n\nvar _show = function _show(key, component) {\n  overlayItems = _lodash2.default.clone(overlayItems);\n  overlayItems[key] = component;\n  overlayEvents.emit('change');\n  return true;\n};\n\nvar _hide = function _hide(key) {\n  overlayItems = _lodash2.default.omit(overlayItems, key);\n  overlayEvents.emit('change');\n  return true;\n};\n\nvar Overlays = function (_React$Component) {\n  _inherits(Overlays, _React$Component);\n\n  function Overlays() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Overlays);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Overlays.__proto__ || Object.getPrototypeOf(Overlays)).call.apply(_ref, [this].concat(args))), _this), _this.state = {\n      items: overlayItems\n    }, _this.handleChange = function () {\n      _this.setState({\n        items: overlayItems\n      });\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Overlays, [{\n    key: 'show',\n    value: function show() {\n      _show.apply(undefined, arguments);\n    }\n  }, {\n    key: 'hide',\n    value: function hide() {\n      _hide.apply(undefined, arguments);\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      overlayEvents.on('change', this.handleChange);\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      overlayEvents.removeListener('change', this.handleChange);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement('span', { className: 'ui-overlays' }, _lodash2.default.toArray(this.state.items));\n    }\n  }], [{\n    key: 'show',\n    value: function show() {\n      _show.apply(undefined, arguments);\n    }\n  }, {\n    key: 'hide',\n    value: function hide() {\n      _hide.apply(undefined, arguments);\n    }\n  }]);\n\n  return Overlays;\n}(_react2.default.Component);\n\nexports.default = Overlays;\n\n/***/ }),\n/* 183 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Module dependencies.\n */\n\nvar Emitter = __webpack_require__(831);\nvar reduce = __webpack_require__(832);\n\n/**\n * Root reference for iframes.\n */\n\nvar root = 'undefined' == typeof window\n  ? (this || self)\n  : window;\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * TODO: future proof, move to compoent land\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isHost(obj) {\n  var str = {}.toString.call(obj);\n\n  switch (str) {\n    case '[object File]':\n    case '[object Blob]':\n    case '[object FormData]':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n  if (root.XMLHttpRequest\n      && (!root.location || 'file:' != root.location.protocol\n          || !root.ActiveXObject)) {\n    return new XMLHttpRequest;\n  } else {\n    try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n  }\n  return false;\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n  ? function(s) { return s.trim(); }\n  : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n  return obj === Object(obj);\n}\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n  if (!isObject(obj)) return obj;\n  var pairs = [];\n  for (var key in obj) {\n    if (null != obj[key]) {\n      pairs.push(encodeURIComponent(key)\n        + '=' + encodeURIComponent(obj[key]));\n    }\n  }\n  return pairs.join('&');\n}\n\n/**\n * Expose serialization method.\n */\n\n request.serializeObject = serialize;\n\n /**\n  * Parse the given x-www-form-urlencoded `str`.\n  *\n  * @param {String} str\n  * @return {Object}\n  * @api private\n  */\n\nfunction parseString(str) {\n  var obj = {};\n  var pairs = str.split('&');\n  var parts;\n  var pair;\n\n  for (var i = 0, len = pairs.length; i < len; ++i) {\n    pair = pairs[i];\n    parts = pair.split('=');\n    obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);\n  }\n\n  return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n *     superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n  html: 'text/html',\n  json: 'application/json',\n  xml: 'application/xml',\n  urlencoded: 'application/x-www-form-urlencoded',\n  'form': 'application/x-www-form-urlencoded',\n  'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n *     superagent.serialize['application/xml'] = function(obj){\n *       return 'generated xml here';\n *     };\n *\n */\n\n request.serialize = {\n   'application/x-www-form-urlencoded': serialize,\n   'application/json': JSON.stringify\n };\n\n /**\n  * Default parsers.\n  *\n  *     superagent.parse['application/xml'] = function(str){\n  *       return { object parsed from str };\n  *     };\n  *\n  */\n\nrequest.parse = {\n  'application/x-www-form-urlencoded': parseString,\n  'application/json': JSON.parse\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n  var lines = str.split(/\\r?\\n/);\n  var fields = {};\n  var index;\n  var line;\n  var field;\n  var val;\n\n  lines.pop(); // trailing CRLF\n\n  for (var i = 0, len = lines.length; i < len; ++i) {\n    line = lines[i];\n    index = line.indexOf(':');\n    field = line.slice(0, index).toLowerCase();\n    val = trim(line.slice(index + 1));\n    fields[field] = val;\n  }\n\n  return fields;\n}\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction type(str){\n  return str.split(/ *; */).shift();\n};\n\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction params(str){\n  return reduce(str.split(/ *; */), function(obj, str){\n    var parts = str.split(/ *= */)\n      , key = parts.shift()\n      , val = parts.shift();\n\n    if (key && val) obj[key] = val;\n    return obj;\n  }, {});\n};\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n *  - set flags (.ok, .error, etc)\n *  - parse header\n *\n * Examples:\n *\n *  Aliasing `superagent` as `request` is nice:\n *\n *      request = superagent;\n *\n *  We can use the promise-like API, or pass callbacks:\n *\n *      request.get('/').end(function(res){});\n *      request.get('/', function(res){});\n *\n *  Sending data can be chained:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' })\n *        .end(function(res){});\n *\n *  Or passed to `.send()`:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' }, function(res){});\n *\n *  Or passed to `.post()`:\n *\n *      request\n *        .post('/user', { name: 'tj' })\n *        .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n *      request\n *        .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req, options) {\n  options = options || {};\n  this.req = req;\n  this.xhr = this.req.xhr;\n  // responseText is accessible only if responseType is '' or 'text' and on older browsers\n  this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n     ? this.xhr.responseText\n     : null;\n  this.statusText = this.req.xhr.statusText;\n  this.setStatusProperties(this.xhr.status);\n  this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n  // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n  // getResponseHeader still works. so we get content-type even if getting\n  // other headers fails.\n  this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n  this.setHeaderProperties(this.header);\n  this.body = this.req.method != 'HEAD'\n    ? this.parseBody(this.text ? this.text : this.xhr.response)\n    : null;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponse.prototype.get = function(field){\n  return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n *   - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponse.prototype.setHeaderProperties = function(header){\n  // content-type\n  var ct = this.header['content-type'] || '';\n  this.type = type(ct);\n\n  // params\n  var obj = params(ct);\n  for (var key in obj) this[key] = obj[key];\n};\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype.parseBody = function(str){\n  var parse = request.parse[this.type];\n  return parse && str && (str.length || str instanceof Object)\n    ? parse(str)\n    : null;\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n *   - .noContent\n *   - .badRequest\n *   - .unauthorized\n *   - .notAcceptable\n *   - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponse.prototype.setStatusProperties = function(status){\n  // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n  if (status === 1223) {\n    status = 204;\n  }\n\n  var type = status / 100 | 0;\n\n  // status / class\n  this.status = status;\n  this.statusType = type;\n\n  // basics\n  this.info = 1 == type;\n  this.ok = 2 == type;\n  this.clientError = 4 == type;\n  this.serverError = 5 == type;\n  this.error = (4 == type || 5 == type)\n    ? this.toError()\n    : false;\n\n  // sugar\n  this.accepted = 202 == status;\n  this.noContent = 204 == status;\n  this.badRequest = 400 == status;\n  this.unauthorized = 401 == status;\n  this.notAcceptable = 406 == status;\n  this.notFound = 404 == status;\n  this.forbidden = 403 == status;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n  var req = this.req;\n  var method = req.method;\n  var url = req.url;\n\n  var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n  var err = new Error(msg);\n  err.status = this.status;\n  err.method = method;\n  err.url = url;\n\n  return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n  var self = this;\n  Emitter.call(this);\n  this._query = this._query || [];\n  this.method = method;\n  this.url = url;\n  this.header = {};\n  this._header = {};\n  this.on('end', function(){\n    var err = null;\n    var res = null;\n\n    try {\n      res = new Response(self);\n    } catch(e) {\n      err = new Error('Parser is unable to parse the response');\n      err.parse = true;\n      err.original = e;\n      return self.callback(err);\n    }\n\n    self.emit('response', res);\n\n    if (err) {\n      return self.callback(err, res);\n    }\n\n    if (res.status >= 200 && res.status < 300) {\n      return self.callback(err, res);\n    }\n\n    var new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n    new_err.original = err;\n    new_err.response = res;\n    new_err.status = res.status;\n\n    self.callback(err || new_err, res);\n  });\n}\n\n/**\n * Mixin `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Allow for extension\n */\n\nRequest.prototype.use = function(fn) {\n  fn(this);\n  return this;\n}\n\n/**\n * Set timeout to `ms`.\n *\n * @param {Number} ms\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.timeout = function(ms){\n  this._timeout = ms;\n  return this;\n};\n\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.clearTimeout = function(){\n  this._timeout = 0;\n  clearTimeout(this._timer);\n  return this;\n};\n\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request}\n * @api public\n */\n\nRequest.prototype.abort = function(){\n  if (this.aborted) return;\n  this.aborted = true;\n  this.xhr.abort();\n  this.clearTimeout();\n  this.emit('abort');\n  return this;\n};\n\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n *\n * Examples:\n *\n *      req.get('/')\n *        .set('Accept', 'application/json')\n *        .set('X-API-Key', 'foobar')\n *        .end(callback);\n *\n *      req.get('/')\n *        .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n *        .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.set = function(field, val){\n  if (isObject(field)) {\n    for (var key in field) {\n      this.set(key, field[key]);\n    }\n    return this;\n  }\n  this._header[field.toLowerCase()] = val;\n  this.header[field] = val;\n  return this;\n};\n\n/**\n * Remove header `field`.\n *\n * Example:\n *\n *      req.get('/')\n *        .unset('User-Agent')\n *        .end(callback);\n *\n * @param {String} field\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.unset = function(field){\n  delete this._header[field.toLowerCase()];\n  delete this.header[field];\n  return this;\n};\n\n/**\n * Get case-insensitive header `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api private\n */\n\nRequest.prototype.getHeader = function(field){\n  return this._header[field.toLowerCase()];\n};\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.xml = 'application/xml';\n *\n *      request.post('/')\n *        .type('xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n *      request.post('/')\n *        .type('application/xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n  this.set('Content-Type', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.json = 'application/json';\n *\n *      request.get('/agent')\n *        .accept('json')\n *        .end(callback);\n *\n *      request.get('/agent')\n *        .accept('application/json')\n *        .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n  this.set('Accept', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} pass\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass){\n  var str = btoa(user + ':' + pass);\n  this.set('Authorization', 'Basic ' + str);\n  return this;\n};\n\n/**\n* Add query-string `val`.\n*\n* Examples:\n*\n*   request.get('/shoes')\n*     .query('size=10')\n*     .query({ color: 'blue' })\n*\n* @param {Object|String} val\n* @return {Request} for chaining\n* @api public\n*/\n\nRequest.prototype.query = function(val){\n  if ('string' != typeof val) val = serialize(val);\n  if (val) this._query.push(val);\n  return this;\n};\n\n/**\n * Write the field `name` and `val` for \"multipart/form-data\"\n * request bodies.\n *\n * ``` js\n * request.post('/upload')\n *   .field('foo', 'bar')\n *   .end(callback);\n * ```\n *\n * @param {String} name\n * @param {String|Blob|File} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.field = function(name, val){\n  if (!this._formData) this._formData = new root.FormData();\n  this._formData.append(name, val);\n  return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `filename`.\n *\n * ``` js\n * request.post('/upload')\n *   .attach(new Blob(['<a id=\"a\"><b id=\"b\">hey!</b></a>'], { type: \"text/html\"}))\n *   .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String} filename\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, filename){\n  if (!this._formData) this._formData = new root.FormData();\n  this._formData.append(field, file, filename);\n  return this;\n};\n\n/**\n * Send `data`, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n *       // querystring\n *       request.get('/search')\n *         .end(callback)\n *\n *       // multiple data \"writes\"\n *       request.get('/search')\n *         .send({ search: 'query' })\n *         .send({ range: '1..5' })\n *         .send({ order: 'desc' })\n *         .end(callback)\n *\n *       // manual json\n *       request.post('/user')\n *         .type('json')\n *         .send('{\"name\":\"tj\"})\n *         .end(callback)\n *\n *       // auto json\n *       request.post('/user')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // manual x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send('name=tj')\n *         .end(callback)\n *\n *       // auto x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // defaults to x-www-form-urlencoded\n  *      request.post('/user')\n  *        .send('name=tobi')\n  *        .send('species=ferret')\n  *        .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.send = function(data){\n  var obj = isObject(data);\n  var type = this.getHeader('Content-Type');\n\n  // merge\n  if (obj && isObject(this._data)) {\n    for (var key in data) {\n      this._data[key] = data[key];\n    }\n  } else if ('string' == typeof data) {\n    if (!type) this.type('form');\n    type = this.getHeader('Content-Type');\n    if ('application/x-www-form-urlencoded' == type) {\n      this._data = this._data\n        ? this._data + '&' + data\n        : data;\n    } else {\n      this._data = (this._data || '') + data;\n    }\n  } else {\n    this._data = data;\n  }\n\n  if (!obj || isHost(data)) return this;\n  if (!type) this.type('json');\n  return this;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n  var fn = this._callback;\n  this.clearTimeout();\n  fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n  var err = new Error('Origin is not allowed by Access-Control-Allow-Origin');\n  err.crossDomain = true;\n  this.callback(err);\n};\n\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\nRequest.prototype.timeoutError = function(){\n  var timeout = this._timeout;\n  var err = new Error('timeout of ' + timeout + 'ms exceeded');\n  err.timeout = timeout;\n  this.callback(err);\n};\n\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\nRequest.prototype.withCredentials = function(){\n  this._withCredentials = true;\n  return this;\n};\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n  var self = this;\n  var xhr = this.xhr = request.getXHR();\n  var query = this._query.join('&');\n  var timeout = this._timeout;\n  var data = this._formData || this._data;\n\n  // store callback\n  this._callback = fn || noop;\n\n  // state change\n  xhr.onreadystatechange = function(){\n    if (4 != xhr.readyState) return;\n\n    // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n    // result in the error \"Could not complete the operation due to error c00c023f\"\n    var status;\n    try { status = xhr.status } catch(e) { status = 0; }\n\n    if (0 == status) {\n      if (self.timedout) return self.timeoutError();\n      if (self.aborted) return;\n      return self.crossDomainError();\n    }\n    self.emit('end');\n  };\n\n  // progress\n  var handleProgress = function(e){\n    if (e.total > 0) {\n      e.percent = e.loaded / e.total * 100;\n    }\n    self.emit('progress', e);\n  };\n  if (this.hasListeners('progress')) {\n    xhr.onprogress = handleProgress;\n  }\n  try {\n    if (xhr.upload && this.hasListeners('progress')) {\n      xhr.upload.onprogress = handleProgress;\n    }\n  } catch(e) {\n    // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n    // Reported here:\n    // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n  }\n\n  // timeout\n  if (timeout && !this._timer) {\n    this._timer = setTimeout(function(){\n      self.timedout = true;\n      self.abort();\n    }, timeout);\n  }\n\n  // querystring\n  if (query) {\n    query = request.serializeObject(query);\n    this.url += ~this.url.indexOf('?')\n      ? '&' + query\n      : '?' + query;\n  }\n\n  // initiate request\n  xhr.open(this.method, this.url, true);\n\n  // CORS\n  if (this._withCredentials) xhr.withCredentials = true;\n\n  // body\n  if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) {\n    // serialize stuff\n    var serialize = request.serialize[this.getHeader('Content-Type')];\n    if (serialize) data = serialize(data);\n  }\n\n  // set header fields\n  for (var field in this.header) {\n    if (null == this.header[field]) continue;\n    xhr.setRequestHeader(field, this.header[field]);\n  }\n\n  // send stuff\n  this.emit('request', this);\n  xhr.send(data);\n  return this;\n};\n\n/**\n * Expose `Request`.\n */\n\nrequest.Request = Request;\n\n/**\n * Issue a request:\n *\n * Examples:\n *\n *    request('GET', '/users').end(callback)\n *    request('/users').end(callback)\n *    request('/users', callback)\n *\n * @param {String} method\n * @param {String|Function} url or callback\n * @return {Request}\n * @api public\n */\n\nfunction request(method, url) {\n  // callback\n  if ('function' == typeof url) {\n    return new Request('GET', method).end(url);\n  }\n\n  // url first\n  if (1 == arguments.length) {\n    return new Request('GET', method);\n  }\n\n  return new Request(method, url);\n}\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn){\n  var req = request('GET', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.query(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn){\n  var req = request('HEAD', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * DELETE `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.del = function(url, fn){\n  var req = request('DELETE', url);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn){\n  var req = request('PATCH', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn){\n  var req = request('POST', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn){\n  var req = request('PUT', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * Expose `request`.\n */\n\nmodule.exports = request;\n\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = {\n    transitionEnterTimeout: 500,\n    transitionLeaveTimeout: 500\n};\n\n/***/ }),\n/* 185 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar invariant = __webpack_require__(26);\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar splice = Array.prototype.splice;\n\nvar toString = Object.prototype.toString\nvar type = function(obj) {\n  return toString.call(obj).slice(8, -1);\n}\n\nvar assign = Object.assign || /* istanbul ignore next */ function assign(target, source) {\n  getAllKeys(source).forEach(function(key) {\n    if (hasOwnProperty.call(source, key)) {\n      target[key] = source[key];\n    }\n  });\n  return target;\n};\n\nvar getAllKeys = typeof Object.getOwnPropertySymbols === 'function' ?\n  function(obj) { return Object.keys(obj).concat(Object.getOwnPropertySymbols(obj)) } :\n  /* istanbul ignore next */ function(obj) { return Object.keys(obj) };\n\n/* istanbul ignore next */\nfunction copy(object) {\n  if (Array.isArray(object)) {\n    return assign(object.constructor(object.length), object)\n  } else if (type(object) === 'Map') {\n    return new Map(object)\n  } else if (type(object) === 'Set') {\n    return new Set(object)\n  } else if (object && typeof object === 'object') {\n    var prototype = object.constructor && object.constructor.prototype\n    return assign(Object.create(prototype || null), object);\n  } else {\n    return object;\n  }\n}\n\nfunction newContext() {\n  var commands = assign({}, defaultCommands);\n  update.extend = function(directive, fn) {\n    commands[directive] = fn;\n  };\n  update.isEquals = function(a, b) { return a === b; };\n\n  return update;\n\n  function update(object, spec) {\n    if (typeof spec === 'function') {\n      return spec(object);\n    }\n\n    if (!(Array.isArray(object) && Array.isArray(spec))) {\n      invariant(\n        !Array.isArray(spec),\n        'update(): You provided an invalid spec to update(). The spec may ' +\n        'not contain an array except as the value of $set, $push, $unshift, ' +\n        '$splice or any custom command allowing an array value.'\n      );\n    }\n\n    invariant(\n      typeof spec === 'object' && spec !== null,\n      'update(): You provided an invalid spec to update(). The spec and ' +\n      'every included key path must be plain objects containing one of the ' +\n      'following commands: %s.',\n      Object.keys(commands).join(', ')\n    );\n\n    var nextObject = object;\n    var index, key;\n    getAllKeys(spec).forEach(function(key) {\n      if (hasOwnProperty.call(commands, key)) {\n        var objectWasNextObject = object === nextObject;\n        nextObject = commands[key](spec[key], nextObject, spec, object);\n        if (objectWasNextObject && update.isEquals(nextObject, object)) {\n          nextObject = object;\n        }\n      } else {\n        var nextValueForKey =\n          type(object) === 'Map'\n            ? update(object.get(key), spec[key])\n            : update(object[key], spec[key]);\n        if (!update.isEquals(nextValueForKey, nextObject[key]) || typeof nextValueForKey === 'undefined' && !hasOwnProperty.call(object, key)) {\n          if (nextObject === object) {\n            nextObject = copy(object);\n          }\n          if (type(nextObject) === 'Map') {\n            nextObject.set(key, nextValueForKey);\n          } else {\n            nextObject[key] = nextValueForKey;\n          }\n        }\n      }\n    })\n    return nextObject;\n  }\n\n}\n\nvar defaultCommands = {\n  $push: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$push');\n    return value.length ? nextObject.concat(value) : nextObject;\n  },\n  $unshift: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$unshift');\n    return value.length ? value.concat(nextObject) : nextObject;\n  },\n  $splice: function(value, nextObject, spec, originalObject) {\n    invariantSplices(nextObject, spec);\n    value.forEach(function(args) {\n      invariantSplice(args);\n      if (nextObject === originalObject && args.length) nextObject = copy(originalObject);\n      splice.apply(nextObject, args);\n    });\n    return nextObject;\n  },\n  $set: function(value, nextObject, spec) {\n    invariantSet(spec);\n    return value;\n  },\n  $toggle: function(targets, nextObject) {\n    invariantSpecArray(targets, '$toggle');\n    var nextObjectCopy = targets.length ? copy(nextObject) : nextObject;\n\n    targets.forEach(function(target) {\n      nextObjectCopy[target] = !nextObject[target];\n    });\n\n    return nextObjectCopy;\n  },\n  $unset: function(value, nextObject, spec, originalObject) {\n    invariantSpecArray(value, '$unset');\n    value.forEach(function(key) {\n      if (Object.hasOwnProperty.call(nextObject, key)) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        delete nextObject[key];\n      }\n    });\n    return nextObject;\n  },\n  $add: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$add');\n    invariantSpecArray(value, '$add');\n    if (type(nextObject) === 'Map') {\n      value.forEach(function(pair) {\n        var key = pair[0];\n        var value = pair[1];\n        if (nextObject === originalObject && nextObject.get(key) !== value) nextObject = copy(originalObject);\n        nextObject.set(key, value);\n      });\n    } else {\n      value.forEach(function(value) {\n        if (nextObject === originalObject && !nextObject.has(value)) nextObject = copy(originalObject);\n        nextObject.add(value);\n      });\n    }\n    return nextObject;\n  },\n  $remove: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$remove');\n    invariantSpecArray(value, '$remove');\n    value.forEach(function(key) {\n      if (nextObject === originalObject && nextObject.has(key)) nextObject = copy(originalObject);\n      nextObject.delete(key);\n    });\n    return nextObject;\n  },\n  $merge: function(value, nextObject, spec, originalObject) {\n    invariantMerge(nextObject, value);\n    getAllKeys(value).forEach(function(key) {\n      if (value[key] !== nextObject[key]) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        nextObject[key] = value[key];\n      }\n    });\n    return nextObject;\n  },\n  $apply: function(value, original) {\n    invariantApply(value);\n    return value(original);\n  }\n};\n\nvar contextForExport = newContext();\n\nmodule.exports = contextForExport;\nmodule.exports.default = contextForExport;\nmodule.exports.newContext = newContext;\n\n// invariants\n\nfunction invariantPushAndUnshift(value, spec, command) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected target of %s to be an array; got %s.',\n    command,\n    value\n  );\n  invariantSpecArray(spec[command], command)\n}\n\nfunction invariantSpecArray(spec, command) {\n  invariant(\n    Array.isArray(spec),\n    'update(): expected spec of %s to be an array; got %s. ' +\n    'Did you forget to wrap your parameter in an array?',\n    command,\n    spec\n  );\n}\n\nfunction invariantSplices(value, spec) {\n  invariant(\n    Array.isArray(value),\n    'Expected $splice target to be an array; got %s',\n    value\n  );\n  invariantSplice(spec['$splice']);\n}\n\nfunction invariantSplice(value) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected spec of $splice to be an array of arrays; got %s. ' +\n    'Did you forget to wrap your parameters in an array?',\n    value\n  );\n}\n\nfunction invariantApply(fn) {\n  invariant(\n    typeof fn === 'function',\n    'update(): expected spec of $apply to be a function; got %s.',\n    fn\n  );\n}\n\nfunction invariantSet(spec) {\n  invariant(\n    Object.keys(spec).length === 1,\n    'Cannot have more than one key in an object with $set'\n  );\n}\n\nfunction invariantMerge(target, specValue) {\n  invariant(\n    specValue && typeof specValue === 'object',\n    'update(): $merge expects a spec of type \\'object\\'; got %s',\n    specValue\n  );\n  invariant(\n    target && typeof target === 'object',\n    'update(): $merge expects a target of type \\'object\\'; got %s',\n    target\n  );\n}\n\nfunction invariantMapOrSet(target, command) {\n  var typeOfTarget = type(target);\n  invariant(\n    typeOfTarget === 'Map' || typeOfTarget === 'Set',\n    'update(): %s expects a target of type Set or Map; got %s',\n    command,\n    typeOfTarget\n  );\n}\n\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar colors = [0x4781BF, 0xA1BBE5, 0xE59539, 0xE8CE8B, 0x6F5DA8, 0xCDABDB, 0x3D9990, 0x7CCFB4, 0x4C5FB5, 0x979ACC, 0xCC5E69, 0xEDA19F, 0x4692B0, 0x8BD4D6, 0xE0694F, 0xF5A482, 0x549970, 0x9AD9A4, 0x9C4174, 0xCF7C92];\nvar moreColor = 0xBDBDBD;\nvar axisColor = 0x666666;\nvar htmlColors = colors.map(function (color) {\n    return intToHtmlColor(color);\n});\nfunction intToHtmlColor(color) {\n    var hex = color.toString(16);\n    for (var i = hex.length; i < 6; i++) {\n        hex = '0' + hex;\n    }\n    return '#' + hex;\n}\nexports.default = {\n    getColor: function getColor(index) {\n        return colors[index % colors.length];\n    },\n    getHtmlColor: function getHtmlColor(index) {\n        return htmlColors[index % colors.length];\n    },\n\n    moreColor: moreColor,\n    moreHtmlColor: intToHtmlColor(moreColor),\n    axisColor: axisColor,\n    axisHtmlColor: intToHtmlColor(axisColor),\n    colors: colors,\n    htmlColors: htmlColors,\n    intToHtmlColor: intToHtmlColor\n};\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _saved_views_store = __webpack_require__(145);\n\nvar _saved_views_store2 = _interopRequireDefault(_saved_views_store);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction generateRequestId() {\n    return _lodash2.default.uniqueId('saved_view');\n}\nexports.default = {\n    /**\r\n     * User has selected a different active view to display.\r\n     * @params {Object} savedView - The newly selected saved view to activate.\r\n     */\n    selectView: function selectView(savedView) {\n        if (_saved_views_store2.default.getActiveView() !== savedView) {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'SAVED_VIEW_SELECTED',\n                savedView: savedView\n            });\n            if (_report_view_store2.default.isGridReport()) {\n                // we pass true as the second parameter because we want the history to be updated\n                _grid_report_actions2.default.loadGridState(savedView.view_state, true);\n            }\n        }\n    },\n\n    /**\r\n     * User wants to create a new saved view that captures the current report's state.\r\n     */\n    newView: function newView() {\n        var report = _report_view_store2.default.getRenderedReport();\n        var state = void 0;\n        if (_report_view_store2.default.isGridReport()) {\n            state = {\n                query: _grid_report_store2.default.getState().get('savedStateId')\n            };\n        } else {\n            state = _summary_report_store2.default.generateSummaryReportState();\n        }\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_NEW',\n            savedView: {\n                report_id: report.get('id'),\n                view_state: state\n            }\n        });\n    },\n\n    /**\r\n     * User wants to cancel out of the edit saved view modal.\r\n     */\n    cancelView: function cancelView() {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_CANCEL'\n        });\n    },\n\n    /**\r\n     * User wants to add the new saved view to the report.\r\n     * They have entered in a description and it is ready to be sent to the server.\r\n     *\r\n     * @param {string} description - A description text for the new saved view.\r\n     */\n    createView: function createView(description) {\n        var savedView = _lodash2.default.assign({}, _saved_views_store2.default.getEditView(), {\n            description: description\n        });\n        var req = _og_api2.default.post('saved_views', savedView).end();\n        var requestId = generateRequestId();\n        req.done(function (res) {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_CREATE_SUCCESS',\n                savedView: res.body,\n                requestId: requestId\n            });\n        });\n        req.catch(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_CREATE_ERROR',\n                requestId: requestId\n            });\n        });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_CREATE',\n            savedView: savedView,\n            requestId: requestId\n        });\n    },\n\n    /**\r\n     * User wants to make changes to a saved view.\r\n     *\r\n     * @param {number} id - Id of the saved view to edit.\r\n     */\n    editView: function editView(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_EDIT',\n            savedViewId: id\n        });\n    },\n\n    /**\r\n     * Apply updates to a saved view made by the user.\r\n     * @param {number} id - The 'id' of the saved view to update.\r\n     * @param {Object} updatedAttributes - A hash of attributes to update.\r\n     */\n    updateView: function updateView(id, updatedAttributes) {\n        var req = _og_api2.default.put('saved_views', id, updatedAttributes).end();\n        req.done(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_UPDATE_SUCCESS',\n                savedViewId: id,\n                updatedAttributes: updatedAttributes\n            });\n        });\n        req.catch(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_UPDATE_ERROR',\n                savedViewId: id\n            });\n        });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_UPDATE',\n            savedViewId: id,\n            updatedAttributes: updatedAttributes\n        });\n    },\n\n    /**\r\n     * User wants to delete a saved view.\r\n     * @param {number} id - The 'id' of the saved view to delete.\r\n     */\n    deleteView: function deleteView(id) {\n        var req = _og_api2.default.del('saved_views', id).end();\n        req.done(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_DELETE_SUCCESS',\n                savedViewId: id\n            });\n        });\n        req.catch(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_DELETE_ERROR'\n            });\n        });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_DELETE',\n            savedViewId: id\n        });\n    },\n\n    /**\r\n     * User has started a drag operation to reposition a saved view in the collection.\r\n     * @param {number} id - The id of the saved view to reposition.\r\n     */\n    startViewDrag: function startViewDrag(id) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_DRAG_START',\n            savedViewId: id\n        });\n    },\n\n    /**\r\n     * User has dragged a saved view to a new position in the collection.\r\n     * @params {number} afterId - The id of another saved view to position the view being moved.\r\n     */\n    dragViewAfter: function dragViewAfter(afterId) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_DRAG_AFTER',\n            savedViewId: afterId\n        });\n    },\n\n    /**\r\n     * User has dropped a saved view into a new position in the collection.\r\n     * This ends the reposition drag operation and syncs the new position to the server.\r\n     */\n    dropView: function dropView() {\n        var view = _saved_views_store2.default.getDragView();\n        var req = _og_api2.default.put('saved_views', view.id, _lodash2.default.pick(view, 'position')).end();\n        req.then(function () {\n            _og_flux.Dispatcher.handleServerAction({\n                actionType: 'SAVED_VIEW_DROP_SUCCESS'\n            });\n        });\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'SAVED_VIEW_DROP'\n        });\n    }\n};\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShareIcon = function (_Component) {\n    _inherits(ShareIcon, _Component);\n\n    function ShareIcon() {\n        _classCallCheck(this, ShareIcon);\n\n        return _possibleConstructorReturn(this, (ShareIcon.__proto__ || Object.getPrototypeOf(ShareIcon)).apply(this, arguments));\n    }\n\n    _createClass(ShareIcon, [{\n        key: 'renderPrivate',\n        value: function renderPrivate() {\n            return _react2.default.createElement(\"g\", null, _react2.default.createElement(\"path\", { className: \"share-icon__background\", d: \"M12.5,2C6.7,2,2,6.7,2,12.5S6.7,23,12.5,23S23,18.3,23,12.5S18.3,2,12.5,2z M17.6,17.2c0,0.1-0.1,0.2-0.2,0.2H8c-0.1,0-0.2-0.1-0.2-0.2v-4.7c0-0.1,0.1-0.2,0.2-0.2h9.4c0.1,0,0.2,0.1,0.2,0.2V17.2z\" }), _react2.default.createElement(\"path\", { className: \"share-icon__foreground\", d: \"M17.4,11.3h-1.2V9c0-1.9-1.6-3.5-3.5-3.5S9.2,7,9.2,9v2.3H8c-0.6,0-1.2,0.5-1.2,1.2v4.7c0,0.6,0.5,1.2,1.2,1.2h9.4c0.6,0,1.2-0.5,1.2-1.2v-4.7C18.6,11.9,18,11.3,17.4,11.3z M10.4,9c0-1.3,1.1-2.3,2.3-2.3c1.3,0,2.3,1.1,2.3,2.3v2.3h-4.7V9z M17.6,17.2c0,0.1-0.1,0.2-0.2,0.2H8c-0.1,0-0.2-0.1-0.2-0.2v-4.7c0-0.1,0.1-0.2,0.2-0.2h9.4c0.1,0,0.2,0.1,0.2,0.2V17.2z\" }), _react2.default.createElement(\"path\", { className: \"share-icon__foreground\", d: \"M12.5,2C18.3,2,23,6.7,23,12.5C23,18.3,18.3,23,12.5,23S2,18.3,2,12.5C2,6.7,6.7,2,12.5,2 M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0L12.5,0z\" }));\n        }\n    }, {\n        key: 'renderOrg',\n        value: function renderOrg() {\n            return _react2.default.createElement(\"g\", null, _react2.default.createElement(\"path\", { className: \"share-icon__background\", d: \"M5.2,13.2c-1.4,0-2.5,1.1-2.5,2.5v0.6C2.3,15.1,2,13.8,2,12.5C2,6.7,6.7,2,12.5,2S23,6.7,23,12.5c0,0.9-0.1,1.8-0.4,2.7c-0.2-1.1-1.2-2-2.4-2h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1.4-1.1-2.5-2.5-2.5c0-0.7-0.3-1.3-0.7-1.8c-0.5-0.5-1.1-0.7-1.8-0.7c0-1.4-1.1-2.5-2.5-2.5c-1.4,0-2.5,1.1-2.5,2.5C8.8,6.5,7.7,7.6,7.7,9C7,9,6.4,9.3,5.9,9.7s-0.7,1.1-0.7,1.8c0,0.7,0.2,1.2,0.6,1.7H5.2z\" }), _react2.default.createElement(\"path\", { className: \"share-icon__foreground\", d: \"M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0z M12.5,2C18.3,2,23,6.7,23,12.5c0,0.9-0.1,1.8-0.4,2.6c-0.2-1.1-1.2-2-2.4-2h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1.4-1.1-2.5-2.5-2.5v0c0-1.4-1.1-2.5-2.5-2.5c0-1.4-1.1-2.5-2.5-2.5s-2.5,1.1-2.5,2.5C8.8,6.5,7.7,7.6,7.7,9v0c-1.4,0-2.5,1.1-2.5,2.5c0,0.6,0.2,1.2,0.6,1.7H5.2c-1.4,0-2.5,1.1-2.5,2.5v0.6C2.3,15.1,2,13.8,2,12.5C2,6.7,6.7,2,12.5,2z M15.9,13.2h-0.6h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1-0.6-1.9-1.5-2.3c0-0.1,0-0.1,0-0.2c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5v0.2c-0.9,0.4-1.5,1.3-1.5,2.3C15.2,12.1,15.5,12.7,15.9,13.2z M10.9,13.2h-0.6H9.6c0.4-0.4,0.6-1,0.6-1.7c0-1-0.6-1.9-1.5-2.3V9c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5c0,0.1,0,0.1,0,0.2c-0.9,0.4-1.5,1.3-1.5,2.3C10.2,12.1,10.5,12.7,10.9,13.2z M9.2,11.5c0,0.8-0.7,1.5-1.5,1.5s-1.5-0.7-1.5-1.5S6.9,10,7.7,10S9.2,10.7,9.2,11.5z M11.2,6.7V6.5c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5v0.2C13.3,7.1,12.7,8,12.7,9C12.7,8,12.1,7.1,11.2,6.7z M12.7,10c0.8,0,1.5,0.7,1.5,1.5S13.5,13,12.7,13s-1.5-0.7-1.5-1.5S11.9,10,12.7,10z M17.7,10c0.8,0,1.5,0.7,1.5,1.5S18.5,13,17.7,13s-1.5-0.7-1.5-1.5S16.9,10,17.7,10z M3.7,18.2v-2.6c0-0.8,0.7-1.5,1.5-1.5h3c-0.3,0.4-0.5,0.9-0.5,1.5v6.2C6.1,21,4.7,19.7,3.7,18.2z M8.7,22.3v-6.6c0-0.8,0.7-1.5,1.5-1.5h5c0.8,0,1.5,0.7,1.5,1.5v6.4C15.4,22.7,14,23,12.5,23C11.2,23,9.9,22.7,8.7,22.3z M17.7,21.6v-5.9c0-0.6-0.2-1.1-0.5-1.5h3c0.8,0,1.5,0.7,1.5,1.5v1.9C20.8,19.2,19.4,20.6,17.7,21.6z\" }));\n        }\n    }, {\n        key: 'renderNetwork',\n        value: function renderNetwork() {\n            return _react2.default.createElement(\"g\", null, _react2.default.createElement(\"path\", { className: \"share-icon__background\", d: \"M17.3,0.9c0.1,0.6,0.1,1.2,0.1,1.8c0,8.1-6.6,14.7-14.7,14.7c-0.6,0-1.2,0-1.8-0.1C2.8,21.8,7.3,25,12.5,25C19.4,25,25,19.4,25,12.5C25,7.3,21.8,2.8,17.3,0.9z\" }), _react2.default.createElement(\"path\", { className: \"share-icon__foreground\", d: \"M24,7.7C22.1,3,17.6,0,12.5,0c-1.6,0-3.3,0.3-4.8,1C1.3,3.6-1.7,10.9,1,17.3C2.9,22,7.4,25,12.5,25c1.6,0,3.3-0.3,4.8-1C23.7,21.4,26.7,14.1,24,7.7z M6.3,16.7c1.3-0.2,2.9-0.5,4.5-1.1c0.7,1.5,1.5,2.9,2.3,4.1c-1.3,0.4-2.6,0.6-3.7,0.7C8.2,19.5,7.2,18.2,6.3,16.7z M2.4,15.6C2,14.2,1.9,12.7,2,11.3c0.3,0.2,0.7,0.3,1.3,0.3c0.3,0,0.6,0,0.9-0.1c0.2,1.3,0.5,2.7,1.1,4.1c0.1,0.3,0.2,0.5,0.3,0.8C3.9,16.5,2.8,16.2,2.4,15.6z M5.6,5.6c0,0,0.1,0,0.1,0c0.2,0,0.4,0,0.6,0c0.4,0,0.8-0.1,1.2-0.2c0.1,1.4,0.6,3,1.1,4.6c-1.3,0.5-2.6,0.8-3.7,1c-0.1,0-0.2,0-0.2,0C4.5,8.9,4.8,7,5.6,5.6z M17.3,5.5C16,4,14.4,2.8,12.8,2.3c0.1-0.1,0.1-0.2,0.1-0.3c2.1,0.1,4,0.8,5.7,1.9C18.6,4.2,18.3,4.7,17.3,5.5z M16.7,22.2c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0-0.2,0.1c0,0,0,0,0,0c-0.6,0-1.5-0.9-2.5-2.3c0.5-0.2,1-0.4,1.5-0.6c0.5-0.2,1-0.4,1.5-0.7C17.2,20.6,17.1,21.8,16.7,22.2z M15.2,19c-0.5,0.2-1.1,0.4-1.6,0.6c-0.7-1.1-1.5-2.5-2.3-4.1c0.7-0.2,1.4-0.5,2.1-0.8c0.7-0.3,1.4-0.6,2.1-0.9c0.6,1.7,1,3.2,1.3,4.5C16.3,18.5,15.7,18.8,15.2,19z M13.2,14.2c-0.7,0.3-1.4,0.6-2.1,0.8c-0.2-0.5-0.5-1.1-0.7-1.6c-0.5-1.1-0.9-2.2-1.2-3.2c0.7-0.2,1.4-0.5,2.1-0.8c0.7-0.3,1.4-0.6,2-0.9c0.5,1,1,2,1.4,3.1c0.2,0.6,0.5,1.1,0.7,1.7C14.7,13.6,14,13.9,13.2,14.2z M8.5,2.8c0.1,0,0.1,0,0.2,0c0.4,0,0.9,0.4,1.5,1C9.8,3.9,9.5,4.1,9.1,4.2C8.7,4.4,8.3,4.5,8,4.6C7.9,3.6,8.1,3,8.5,2.8z M9.4,2.5c0.4-0.1,0.7-0.1,1.1-0.1c0.5,0,0.9,0.1,1.4,0.2c-0.3,0.3-0.7,0.6-1.3,0.9C10.2,3,9.8,2.7,9.4,2.5z M9.3,4.7c0.4-0.2,0.8-0.4,1.2-0.6c0.8,0.9,1.7,2.3,2.5,4c-0.6,0.3-1.3,0.6-2,0.9c-0.7,0.3-1.4,0.5-2,0.8C8.5,8,8.1,6.4,8,5.1C8.4,5,8.8,4.9,9.3,4.7z M15.1,11.5c-0.4-1-0.9-2.1-1.4-3.1C15,7.7,16.1,7,17,6.4c0.1-0.1,0.2-0.1,0.2-0.2c0.8,1,1.5,2.2,2.1,3.5c0.1,0.3,0.2,0.6,0.4,0.9c-1,0.8-2.3,1.6-3.9,2.4C15.5,12.5,15.3,11.9,15.1,11.5z M16.8,6c-0.9,0.6-2,1.3-3.3,1.9c-0.8-1.6-1.7-3-2.5-4c0.7-0.4,1.2-0.8,1.6-1.2c1.6,0.5,3.1,1.6,4.5,3.1C16.9,5.9,16.8,5.9,16.8,6z M12.3,2.1C12.1,2.1,11.9,2,11.6,2c0.3,0,0.5,0,0.8,0C12.4,2,12.4,2.1,12.3,2.1z M5.3,5C5.2,5,5.2,5,5.1,5c0.2-0.2,0.4-0.3,0.5-0.5C5.5,4.7,5.4,4.8,5.3,5z M7.6,3.3C7.5,3.7,7.4,4.2,7.5,4.8C7,4.9,6.6,5,6.3,5.1c-0.2,0-0.3,0-0.4,0C6.3,4.3,6.9,3.7,7.6,3.3z M4.9,11.4c1.1-0.2,2.4-0.5,3.8-1c0.4,1.2,0.8,2.3,1.2,3.2c0.2,0.5,0.5,1.1,0.7,1.6c-1.6,0.5-3.2,0.9-4.5,1.1C6,16,5.8,15.7,5.7,15.4c-0.5-1.3-0.9-2.7-1-3.9C4.8,11.4,4.8,11.4,4.9,11.4z M13.4,20.2c0.8,1.1,1.5,2,2.2,2.4c-0.4,0.1-0.7,0.1-1.1,0.1c-1.5,0-3.1-0.6-4.6-1.7C11,20.8,12.2,20.6,13.4,20.2z M17.4,21.8c0.2-0.8,0.1-1.9-0.1-3.2c1.1-0.6,2.1-1.3,3-1.9C20,18.9,19,20.7,17.4,21.8z M17.2,18.1c-0.3-1.5-0.8-3.1-1.3-4.5c1.5-0.8,2.8-1.6,3.9-2.4c0.5,1.7,0.7,3.3,0.6,4.8C19.5,16.7,18.4,17.4,17.2,18.1z M20.2,10.8c1-0.8,1.7-1.6,2-2.4c0,0,0,0,0,0C22.8,9.7,23,11,23,12.3c-0.2,1-1,2.1-2.1,3.2C21,14,20.7,12.4,20.2,10.8z M21.8,7.6c0.2,0.6-0.4,1.6-1.8,2.7c-0.1-0.3-0.2-0.5-0.3-0.8c-0.6-1.3-1.3-2.6-2.1-3.6c0.8-0.6,1.3-1.2,1.4-1.7C20.2,5.1,21.1,6.3,21.8,7.6z M4.8,5.3C4.9,5.4,5,5.4,5.1,5.5c-0.3,0.6-0.6,1.3-0.7,2C4.1,8.6,4.1,9.8,4.1,11c-1.3,0.1-1.9,0-2-0.3C2.5,8.7,3.4,6.8,4.8,5.3z M2.8,16.5C2.8,16.5,2.8,16.5,2.8,16.5c0.5,0.2,1.1,0.3,1.9,0.3c0.3,0,0.7,0,1.1-0.1c0.8,1.5,1.7,2.7,2.8,3.8c-0.3,0-0.5,0-0.8,0c-1.3,0-2.3-0.3-3-0.8C4,18.9,3.3,17.8,2.8,16.5z M5.9,20.8C6.5,20.9,7.1,21,7.9,21c0.1,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8-0.1c1.2,1,2.6,1.7,4,2c-0.2,0-0.4,0-0.6,0C10.1,23.1,7.8,22.2,5.9,20.8z M19.5,20.4c0.5-0.8,1-1.8,1.2-2.9c0.1-0.4,0.2-0.9,0.2-1.3c0.9-0.8,1.6-1.6,2.1-2.5C22.7,16.3,21.4,18.7,19.5,20.4z\" }));\n        }\n    }, {\n        key: 'renderPublic',\n        value: function renderPublic() {\n            return _react2.default.createElement(\"g\", null, _react2.default.createElement(\"path\", { className: \"share-icon__background\", d: \"M7.5,11.4c0.1-2.5,2.1-4.5,4.6-4.7v-2c0-0.2,0.2-0.4,0.4-0.4c0.2,0,0.4,0.2,0.4,0.4v2c2.5,0.2,4.5,2.2,4.6,4.7h7.4C24.4,5,19,0,12.5,0C6,0,0.6,5,0.1,11.4H7.5z\" }), _react2.default.createElement(\"path\", { className: \"share-icon__foreground\", d: \"M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0z M10.5,22.8c-0.8-0.2-1.6-0.4-2.3-0.7v-7.3h2.3V22.8z M8.2,14l4.3-2.5l4.3,2.5H8.2z M8.3,11.4c0.1-2.2,1.9-3.9,4.2-3.9l0,0c0,0,0,0,0,0c2.2,0,4,1.7,4.2,3.9h-2.5l-1.4-0.8c-0.1-0.1-0.3-0.1-0.4,0l-1.4,0.8H8.3z M16.6,14.8v7.3c-0.7,0.3-1.4,0.5-2.2,0.7v-8H16.6z M22.8,14h-4.4L17,13.1h5.8V14z M12.5,2c5.4,0,9.9,4.2,10.4,9.4h-5.4c-0.1-2.5-2.1-4.5-4.6-4.7v-2c0-0.2-0.2-0.4-0.4-0.4c-0.2,0-0.4,0.2-0.4,0.4v2c-2.5,0.2-4.5,2.2-4.6,4.7H2.1C2.6,6.2,7.1,2,12.5,2z M8,13.1L6.5,14H2.2v-0.8H8z M2.3,14.8h5.2v6.9C4.8,20.3,2.9,17.8,2.3,14.8z M11.4,22.9v-8.1h2.2v8.1c-0.4,0-0.7,0.1-1.1,0.1C12.1,23,11.8,23,11.4,22.9z M17.5,21.7v-6.9h5.3C22.1,17.8,20.1,20.3,17.5,21.7z\" }));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var type = this.props.type;\n\n            return _react2.default.createElement(\"svg\", { className: \"share-icon\", width: this.props.size + 'px', height: this.props.size + 'px', viewBox: \"0 0 25 25\" }, type === 'private' ? this.renderPrivate() : null, type === 'my_organization' ? this.renderOrg() : null, type === 'network' ? this.renderNetwork() : null, type === 'public' ? this.renderPublic() : null);\n        }\n    }]);\n\n    return ShareIcon;\n}(_react.Component);\n\nexports.default = ShareIcon;\n\nShareIcon.propTypes = {\n    type: _propTypes2.default.oneOf(['private', 'my_organization', 'network', 'public']).isRequired,\n    size: _propTypes2.default.number\n};\nShareIcon.defaultProps = {\n    size: 28\n};\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n    childContextTypes: true,\n    contextTypes: true,\n    defaultProps: true,\n    displayName: true,\n    getDefaultProps: true,\n    getDerivedStateFromProps: true,\n    mixins: true,\n    propTypes: true,\n    type: true\n};\n\nvar KNOWN_STATICS = {\n    name: true,\n    length: true,\n    prototype: true,\n    caller: true,\n    callee: true,\n    arguments: true,\n    arity: true\n};\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = getPrototypeOf && getPrototypeOf(Object);\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components\n\n        if (objectPrototype) {\n            var inheritedComponent = getPrototypeOf(sourceComponent);\n            if (inheritedComponent && inheritedComponent !== objectPrototype) {\n                hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n            }\n        }\n\n        var keys = getOwnPropertyNames(sourceComponent);\n\n        if (getOwnPropertySymbols) {\n            keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n        }\n\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!REACT_STATICS[key] && !KNOWN_STATICS[key] && (!blacklist || !blacklist[key])) {\n                var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n                try { // Avoid failures from read-only properties\n                    defineProperty(targetComponent, key, descriptor);\n                } catch (e) {}\n            }\n        }\n\n        return targetComponent;\n    }\n\n    return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Coordinate;\n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nfunction Coordinate(column, row, zoom) {\n    this.column = column;\n    this.row = row;\n    this.zoom = zoom;\n}\n\nCoordinate.prototype = {\n\n    /**\n     * Create a clone of this coordinate that can be mutated without\n     * changing the original coordinate\n     *\n     * @returns {Coordinate} clone\n     * @private\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.clone();\n     * // since coord is cloned, modifying a property of c2 does\n     * // not modify it.\n     * c2.zoom = 2;\n     */\n    clone: function() {\n        return new Coordinate(this.column, this.row, this.zoom);\n    },\n\n    /**\n     * Zoom this coordinate to a given zoom level. This returns a new\n     * coordinate object, not mutating the old one.\n     *\n     * @param {number} zoom\n     * @returns {Coordinate} zoomed coordinate\n     * @private\n     * @example\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.zoomTo(1);\n     * c2 // equals new Coordinate(0, 0, 1);\n     */\n    zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); },\n\n    /**\n     * Subtract the column and row values of this coordinate from those\n     * of another coordinate. The other coordinat will be zoomed to the\n     * same level as `this` before the subtraction occurs\n     *\n     * @param {Coordinate} c other coordinate\n     * @returns {Coordinate} result\n     * @private\n     */\n    sub: function(c) { return this.clone()._sub(c); },\n\n    _zoomTo: function(zoom) {\n        var scale = Math.pow(2, zoom - this.zoom);\n        this.column *= scale;\n        this.row *= scale;\n        this.zoom = zoom;\n        return this;\n    },\n\n    _sub: function(c) {\n        c = c.zoomTo(this.zoom);\n        this.column -= c.column;\n        this.row -= c.row;\n        return this;\n    }\n};\n\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n    return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t)\n    ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t),\n        interpolate(from[2], to[2], t),\n        interpolate(from[3], to[3], t)\n    ];\n};\n\ninterpolate.array = function(from, to, t) {\n    return from.map(function(d, i) {\n        return interpolate(d, to[i], t);\n    });\n};\n\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports) {\n\n// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"rebeccapurple\": [102,51,153,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function (global, factory) {\n     true ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.ShelfPack = factory());\n}(this, function () {\n\n/**\n * Create a new ShelfPack bin allocator.\n *\n * Uses the Shelf Best Height Fit algorithm from\n * http://clb.demon.fi/files/RectangleBinPack.pdf\n *\n * @class  ShelfPack\n * @param  {number}  [w=64]  Initial width of the sprite\n * @param  {number}  [h=64]  Initial width of the sprite\n * @param  {Object}  [options]\n * @param  {boolean} [options.autoResize=false]  If `true`, the sprite will automatically grow\n * @example\n * var sprite = new ShelfPack(64, 64, { autoResize: false });\n */\nfunction ShelfPack(w, h, options) {\n    options = options || {};\n    this.w = w || 64;\n    this.h = h || 64;\n    this.autoResize = !!options.autoResize;\n    this.shelves = [];\n    this.stats = {};\n    this.count = function(h) {\n        this.stats[h] = (this.stats[h] | 0) + 1;\n    };\n}\n\n/**\n * Batch pack multiple bins into the sprite.\n *\n * @param   {Array}   bins Array of requested bins - each object should have `width`, `height` (or `w`, `h`) properties\n * @param   {Object}  [options]\n * @param   {boolean} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` properties\n * @returns {Array}   Array of allocated bins - each bin is an object with `x`, `y`, `w`, `h` properties\n * @example\n * var bins = [\n *     { id: 'a', width: 12, height: 12 },\n *     { id: 'b', width: 12, height: 16 },\n *     { id: 'c', width: 12, height: 24 }\n * ];\n * var results = sprite.pack(bins, { inPlace: false });\n */\nShelfPack.prototype.pack = function(bins, options) {\n    bins = [].concat(bins);\n    options = options || {};\n\n    var results = [],\n        w, h, allocation;\n\n    for (var i = 0; i < bins.length; i++) {\n        w = bins[i].w || bins[i].width;\n        h = bins[i].h || bins[i].height;\n        if (w && h) {\n            allocation = this.packOne(w, h);\n            if (!allocation) {\n                continue;\n            }\n            if (options.inPlace) {\n                bins[i].x = allocation.x;\n                bins[i].y = allocation.y;\n            }\n            results.push(allocation);\n        }\n    }\n\n    // Shrink the width/height of the sprite to the bare minimum.\n    // Since shelf-pack doubles first width, then height when running out of shelf space\n    // this can result in fairly large unused space both in width and height if that happens\n    // towards the end of bin packing.\n    if (this.shelves.length > 0) {\n        var w2 = 0;\n        var h2 = 0;\n\n        for (var j = 0; j < this.shelves.length; j++) {\n            var shelf = this.shelves[j];\n            h2 += shelf.h;\n            w2 = Math.max(shelf.w - shelf.free, w2);\n        }\n\n        this.resize(w2, h2);\n    }\n\n    return results;\n};\n\n/**\n * Pack a single bin into the sprite.\n *\n * @param   {number}  w   Width of the bin to allocate\n * @param   {number}  h   Height of the bin to allocate\n * @returns {Object}  Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * var results = sprite.packOne(12, 16);\n */\nShelfPack.prototype.packOne = function(w, h) {\n    var y = 0,\n        best = { shelf: -1, waste: Infinity },\n        shelf, waste;\n\n    // find the best shelf\n    for (var i = 0; i < this.shelves.length; i++) {\n        shelf = this.shelves[i];\n        y += shelf.h;\n\n        // exactly the right height with width to spare, pack it..\n        if (h === shelf.h && w <= shelf.free) {\n            this.count(h);\n            return shelf.alloc(w, h);\n        }\n        // not enough height or width, skip it..\n        if (h > shelf.h || w > shelf.free) {\n            continue;\n        }\n        // maybe enough height or width, minimize waste..\n        if (h < shelf.h && w <= shelf.free) {\n            waste = shelf.h - h;\n            if (waste < best.waste) {\n                best.waste = waste;\n                best.shelf = i;\n            }\n        }\n    }\n\n    if (best.shelf !== -1) {\n        shelf = this.shelves[best.shelf];\n        this.count(h);\n        return shelf.alloc(w, h);\n    }\n\n    // add shelf..\n    if (h <= (this.h - y) && w <= this.w) {\n        shelf = new Shelf(y, this.w, h);\n        this.shelves.push(shelf);\n        this.count(h);\n        return shelf.alloc(w, h);\n    }\n\n    // no more space..\n    // If `autoResize` option is set, grow the sprite as follows:\n    //  * double whichever sprite dimension is smaller (`w1` or `h1`)\n    //  * if sprite dimensions are equal, grow width before height\n    //  * accomodate very large bin requests (big `w` or `h`)\n    if (this.autoResize) {\n        var h1, h2, w1, w2;\n\n        h1 = h2 = this.h;\n        w1 = w2 = this.w;\n\n        if (w1 <= h1 || w > w1) {   // grow width..\n            w2 = Math.max(w, w1) * 2;\n        }\n        if (h1 < w1 || h > h1) {    // grow height..\n            h2 = Math.max(h, h1) * 2;\n        }\n\n        this.resize(w2, h2);\n        return this.packOne(w, h);  // retry\n    }\n\n    return null;\n};\n\n/**\n * Clear the sprite.\n *\n * @example\n * sprite.clear();\n */\nShelfPack.prototype.clear = function() {\n    this.shelves = [];\n    this.stats = {};\n};\n\n/**\n * Resize the sprite.\n *\n * @param   {number}  w  Requested new sprite width\n * @param   {number}  h  Requested new sprite height\n * @returns {boolean} `true` if resize succeeded, `false` if failed\n * @example\n * sprite.resize(256, 256);\n */\nShelfPack.prototype.resize = function(w, h) {\n    this.w = w;\n    this.h = h;\n    for (var i = 0; i < this.shelves.length; i++) {\n        this.shelves[i].resize(w);\n    }\n    return true;\n};\n\n\n\n/**\n * Create a new Shelf.\n *\n * @private\n * @class  Shelf\n * @param  {number}  y   Top coordinate of the new shelf\n * @param  {number}  w   Width of the new shelf\n * @param  {number}  h   Height of the new shelf\n * @example\n * var shelf = new Shelf(64, 512, 24);\n */\nfunction Shelf(y, w, h) {\n    this.x = 0;\n    this.y = y;\n    this.w = this.free = w;\n    this.h = h;\n}\n\n/**\n * Allocate a single bin into the shelf.\n *\n * @private\n * @param   {number}  w   Width of the bin to allocate\n * @param   {number}  h   Height of the bin to allocate\n * @returns {Object}  Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * shelf.alloc(12, 16);\n */\nShelf.prototype.alloc = function(w, h) {\n    if (w > this.free || h > this.h) {\n        return null;\n    }\n    var x = this.x;\n    this.x += w;\n    this.free -= w;\n    return { x: x, y: this.y, w: w, h: h, width: w, height: h };\n};\n\n/**\n * Resize the shelf.\n *\n * @private\n * @param   {number}  w  Requested new width of the shelf\n * @returns {boolean} true if resize succeeded, false if failed\n * @example\n * shelf.resize(512);\n */\nShelf.prototype.resize = function(w) {\n    this.free += (w - this.w);\n    this.w = w;\n    return true;\n};\n\nreturn ShelfPack;\n\n}));\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar ajax = __webpack_require__(88);\nvar browser = __webpack_require__(39);\nvar TilePyramid = __webpack_require__(195);\nvar normalizeURL = __webpack_require__(122).normalizeSourceURL;\nvar TileCoord = __webpack_require__(154);\n\nexports._loadTileJSON = function(options) {\n    var loaded = function(err, tileJSON) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        util.extend(this, util.pick(tileJSON,\n            ['tiles', 'minzoom', 'maxzoom', 'attribution']));\n\n        if (tileJSON.vector_layers) {\n            this.vectorLayers = tileJSON.vector_layers;\n            this.vectorLayerIds = this.vectorLayers.map(function(layer) { return layer.id; });\n        }\n\n        this._pyramid = new TilePyramid({\n            tileSize: this.tileSize,\n            minzoom: this.minzoom,\n            maxzoom: this.maxzoom,\n            roundZoom: this.roundZoom,\n            reparseOverscaled: this.reparseOverscaled,\n            load: this._loadTile.bind(this),\n            abort: this._abortTile.bind(this),\n            unload: this._unloadTile.bind(this),\n            add: this._addTile.bind(this),\n            remove: this._removeTile.bind(this),\n            redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined\n        });\n\n        this.fire('load');\n    }.bind(this);\n\n    if (options.url) {\n        ajax.getJSON(normalizeURL(options.url), loaded);\n    } else {\n        browser.frame(loaded.bind(this, null, options));\n    }\n};\n\nexports.redoPlacement = function() {\n    if (!this._pyramid) {\n        return;\n    }\n\n    var ids = this._pyramid.orderedIDs();\n    for (var i = 0; i < ids.length; i++) {\n        var tile = this._pyramid.getTile(ids[i]);\n        this._redoTilePlacement(tile);\n    }\n};\n\nexports._getTile = function(coord) {\n    return this._pyramid.getTile(coord.id);\n};\n\nexports._getVisibleCoordinates = function() {\n    if (!this._pyramid) return [];\n    else return this._pyramid.renderedIDs().map(TileCoord.fromID);\n};\n\nfunction sortTilesIn(a, b) {\n    var coordA = a.coord;\n    var coordB = b.coord;\n    return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles) {\n    var result = tiles[0] || {};\n    for (var i = 1; i < tiles.length; i++) {\n        var tile = tiles[i];\n        for (var layerID in tile) {\n            var tileFeatures = tile[layerID];\n            var resultFeatures = result[layerID];\n            if (resultFeatures === undefined) {\n                resultFeatures = result[layerID] = tileFeatures;\n            } else {\n                for (var f = 0; f < tileFeatures.length; f++) {\n                    resultFeatures.push(tileFeatures[f]);\n                }\n            }\n        }\n    }\n    return result;\n}\n\nexports._queryRenderedVectorFeatures = function(queryGeometry, params, zoom, bearing) {\n    if (!this._pyramid || !this.map)\n        return [];\n\n    var tilesIn = this._pyramid.tilesIn(queryGeometry);\n\n    tilesIn.sort(sortTilesIn);\n\n    var styleLayers = this.map.style._layers;\n\n    var renderedFeatureLayers = [];\n    for (var r = 0; r < tilesIn.length; r++) {\n        var tileIn = tilesIn[r];\n        if (!tileIn.tile.featureIndex) continue;\n\n        renderedFeatureLayers.push(tileIn.tile.featureIndex.query({\n            queryGeometry: tileIn.queryGeometry,\n            scale: tileIn.scale,\n            tileSize: tileIn.tile.tileSize,\n            bearing: bearing,\n            params: params\n        }, styleLayers));\n    }\n    return mergeRenderedFeatureLayers(renderedFeatureLayers);\n};\n\nexports._querySourceFeatures = function(params) {\n    if (!this._pyramid) {\n        return [];\n    }\n\n    var pyramid = this._pyramid;\n    var tiles = pyramid.renderedIDs().map(function(id) {\n        return pyramid.getTile(id);\n    });\n\n    var result = [];\n\n    var dataTiles = {};\n    for (var i = 0; i < tiles.length; i++) {\n        var tile = tiles[i];\n        var dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id;\n        if (!dataTiles[dataID]) {\n            dataTiles[dataID] = true;\n            tile.querySourceFeatures(result, params);\n        }\n    }\n\n    return result;\n};\n\n/*\n * Create a tiled data source instance given an options object\n *\n * @param {Object} options\n * @param {string} options.type Either `raster` or `vector`.\n * @param {string} options.url A tile source URL. This should either be `mapbox://{mapid}` or a full `http[s]` url that points to a TileJSON endpoint.\n * @param {Array} options.tiles An array of tile sources. If `url` is not specified, `tiles` can be used instead to specify tile sources, as in the TileJSON spec. Other TileJSON keys such as `minzoom` and `maxzoom` can be specified in a source object if `tiles` is used.\n * @param {string} options.id An optional `id` to assign to the source\n * @param {number} [options.tileSize=512] Optional tile size (width and height in pixels, assuming tiles are square). This option is only configurable for raster sources\n * @example\n * var sourceObj = new mapboxgl.Source.create({\n *    type: 'vector',\n *    url: 'mapbox://mapbox.mapbox-streets-v5'\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nexports.create = function(source) {\n    // This is not at file scope in order to avoid a circular require.\n    var sources = {\n        vector: __webpack_require__(570),\n        raster: __webpack_require__(571),\n        geojson: __webpack_require__(277),\n        video: __webpack_require__(278),\n        image: __webpack_require__(279)\n    };\n\n    return exports.is(source) ? source : new sources[source.type](source);\n};\n\nexports.is = function(source) {\n    // This is not at file scope in order to avoid a circular require.\n    var sources = {\n        vector: __webpack_require__(570),\n        raster: __webpack_require__(571),\n        geojson: __webpack_require__(277),\n        video: __webpack_require__(278),\n        image: __webpack_require__(279)\n    };\n\n    for (var type in sources) {\n        if (source instanceof sources[type]) {\n            return true;\n        }\n    }\n\n    return false;\n};\n\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Tile = __webpack_require__(276);\nvar TileCoord = __webpack_require__(154);\nvar Point = __webpack_require__(11);\nvar Cache = __webpack_require__(1058);\nvar Coordinate = __webpack_require__(190);\nvar util = __webpack_require__(10);\nvar EXTENT = __webpack_require__(40).EXTENT;\n\nmodule.exports = TilePyramid;\n\n/**\n * A tile pyramid is a specialized cache and datastructure\n * that contains tiles. It's used by sources to manage their\n * data.\n *\n * @param {Object} options\n * @param {number} options.tileSize\n * @param {number} options.minzoom\n * @param {number} options.maxzoom\n * @private\n */\nfunction TilePyramid(options) {\n    this.tileSize = options.tileSize;\n    this.minzoom = options.minzoom;\n    this.maxzoom = options.maxzoom;\n    this.roundZoom = options.roundZoom;\n    this.reparseOverscaled = options.reparseOverscaled;\n\n    this._load = options.load;\n    this._abort = options.abort;\n    this._unload = options.unload;\n    this._add = options.add;\n    this._remove = options.remove;\n    this._redoPlacement = options.redoPlacement;\n\n    this._tiles = {};\n    this._cache = new Cache(0, function(tile) { return this._unload(tile); }.bind(this));\n\n    this._filterRendered = this._filterRendered.bind(this);\n}\n\n\nTilePyramid.maxOverzooming = 10;\nTilePyramid.maxUnderzooming = 3;\n\nTilePyramid.prototype = {\n    /**\n     * Confirm that every tracked tile is loaded.\n     * @returns {boolean} whether all tiles are loaded.\n     * @private\n     */\n    loaded: function() {\n        for (var t in this._tiles) {\n            if (!this._tiles[t].loaded && !this._tiles[t].errored)\n                return false;\n        }\n        return true;\n    },\n\n    /**\n     * Return all tile ids ordered with z-order, and cast to numbers\n     * @returns {Array<number>} ids\n     * @private\n     */\n    orderedIDs: function() {\n        return Object.keys(this._tiles).map(Number).sort(compareKeyZoom);\n    },\n\n    renderedIDs: function() {\n        return this.orderedIDs().filter(this._filterRendered);\n    },\n\n    _filterRendered: function(id) {\n        return this._tiles[id].loaded && !this._coveredTiles[id];\n    },\n\n    reload: function() {\n        this._cache.reset();\n        for (var i in this._tiles) {\n            this._load(this._tiles[i]);\n        }\n    },\n\n    /**\n     * Get a specific tile by id\n     * @param {string|number} id tile id\n     * @returns {Object} tile\n     * @private\n     */\n    getTile: function(id) {\n        return this._tiles[id];\n    },\n\n    /**\n     * get the zoom level adjusted for the difference in map and source tilesizes\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    getZoom: function(transform) {\n        return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2;\n    },\n\n    /**\n     * Return a zoom level that will cover all tiles in a given transform\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    coveringZoomLevel: function(transform) {\n        return (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n    },\n\n    /**\n     * Given a transform, return all coordinates that could cover that\n     * transform for a covering zoom level.\n     * @param {Object} transform\n     * @returns {Array<Tile>} tiles\n     * @private\n     */\n    coveringTiles: function(transform) {\n        var z = this.coveringZoomLevel(transform);\n        var actualZ = z;\n\n        if (z < this.minzoom) return [];\n        if (z > this.maxzoom) z = this.maxzoom;\n\n        var tr = transform,\n            tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z),\n            centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5);\n\n        return TileCoord.cover(z, [\n            tr.pointCoordinate(new Point(0, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z),\n            tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z)\n        ], this.reparseOverscaled ? actualZ : z).sort(function(a, b) {\n            return centerPoint.dist(a) - centerPoint.dist(b);\n        });\n    },\n\n    /**\n     * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n     * adds found tiles to retain object; returns true if any child is found.\n     *\n     * @param {Coordinate} coord\n     * @param {number} maxCoveringZoom\n     * @param {boolean} retain\n     * @returns {boolean} whether the operation was complete\n     * @private\n     */\n    findLoadedChildren: function(coord, maxCoveringZoom, retain) {\n        var found = false;\n\n        for (var id in this._tiles) {\n            var tile = this._tiles[id];\n\n            // only consider loaded tiles on higher zoom levels (up to maxCoveringZoom)\n            if (retain[id] || !tile.loaded || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue;\n\n            // disregard tiles that are not descendants of the given tile coordinate\n            var z2 = Math.pow(2, Math.min(tile.coord.z, this.maxzoom) - Math.min(coord.z, this.maxzoom));\n            if (Math.floor(tile.coord.x / z2) !== coord.x ||\n                Math.floor(tile.coord.y / z2) !== coord.y)\n                continue;\n\n            // found loaded child\n            retain[id] = true;\n            found = true;\n\n            // loop through parents; retain the topmost loaded one if found\n            while (tile && tile.coord.z - 1 > coord.z) {\n                var parentId = tile.coord.parent(this.maxzoom).id;\n                tile = this._tiles[parentId];\n\n                if (tile && tile.loaded) {\n                    delete retain[id];\n                    retain[parentId] = true;\n                }\n            }\n        }\n        return found;\n    },\n\n    /**\n     * Find a loaded parent of the given tile (up to minCoveringZoom);\n     * adds the found tile to retain object and returns the tile if found\n     *\n     * @param {Coordinate} coord\n     * @param {number} minCoveringZoom\n     * @param {boolean} retain\n     * @returns {Tile} tile object\n     * @private\n     */\n    findLoadedParent: function(coord, minCoveringZoom, retain) {\n        for (var z = coord.z - 1; z >= minCoveringZoom; z--) {\n            coord = coord.parent(this.maxzoom);\n            var tile = this._tiles[coord.id];\n            if (tile && tile.loaded) {\n                retain[coord.id] = true;\n                return tile;\n            }\n            if (this._cache.has(coord.id)) {\n                this.addTile(coord);\n                retain[coord.id] = true;\n                return this._tiles[coord.id];\n            }\n        }\n    },\n\n    /**\n     * Resizes the tile cache based on the current viewport's size.\n     *\n     * Larger viewports use more tiles and need larger caches. Larger viewports\n     * are more likely to be found on devices with more memory and on pages where\n     * the map is more important.\n     *\n     * @private\n     */\n    updateCacheSize: function(transform) {\n        var widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1;\n        var heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1;\n        var approxTilesInView = widthInTiles * heightInTiles;\n        var commonZoomRange = 5;\n        this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange));\n    },\n\n    /**\n     * Removes tiles that are outside the viewport and adds new tiles that\n     * are inside the viewport.\n     * @private\n     */\n    update: function(used, transform, fadeDuration) {\n        var i;\n        var coord;\n        var tile;\n\n        this.updateCacheSize(transform);\n\n        // Determine the overzooming/underzooming amounts.\n        var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n        var minCoveringZoom = Math.max(zoom - TilePyramid.maxOverzooming, this.minzoom);\n        var maxCoveringZoom = Math.max(zoom + TilePyramid.maxUnderzooming,  this.minzoom);\n\n        // Retain is a list of tiles that we shouldn't delete, even if they are not\n        // the most ideal tile for the current viewport. This may include tiles like\n        // parent or child tiles that are *already* loaded.\n        var retain = {};\n        var now = new Date().getTime();\n\n        // Covered is a list of retained tiles who's areas are full covered by other,\n        // better, retained tiles. They are not drawn separately.\n        this._coveredTiles = {};\n\n        var required = used ? this.coveringTiles(transform) : [];\n        for (i = 0; i < required.length; i++) {\n            coord = required[i];\n            tile = this.addTile(coord);\n\n            retain[coord.id] = true;\n\n            if (tile.loaded)\n                continue;\n\n            // The tile we require is not yet loaded.\n            // Retain child or parent tiles that cover the same area.\n            if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                this.findLoadedParent(coord, minCoveringZoom, retain);\n            }\n        }\n\n        var parentsForFading = {};\n\n        var ids = Object.keys(retain);\n        for (var k = 0; k < ids.length; k++) {\n            var id = ids[k];\n            coord = TileCoord.fromID(id);\n            tile = this._tiles[id];\n            if (tile && tile.timeAdded > now - (fadeDuration || 0)) {\n                // This tile is still fading in. Find tiles to cross-fade with it.\n                if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                    retain[id] = true;\n                }\n                this.findLoadedParent(coord, minCoveringZoom, parentsForFading);\n            }\n        }\n\n        var fadedParent;\n        for (fadedParent in parentsForFading) {\n            if (!retain[fadedParent]) {\n                // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n                this._coveredTiles[fadedParent] = true;\n            }\n        }\n        for (fadedParent in parentsForFading) {\n            retain[fadedParent] = true;\n        }\n\n        // Remove the tiles we don't need anymore.\n        var remove = util.keysDifference(this._tiles, retain);\n        for (i = 0; i < remove.length; i++) {\n            this.removeTile(+remove[i]);\n        }\n\n        this.transform = transform;\n    },\n\n    /**\n     * Add a tile, given its coordinate, to the pyramid.\n     * @param {Coordinate} coord\n     * @returns {Coordinate} the coordinate.\n     * @private\n     */\n    addTile: function(coord) {\n        var tile = this._tiles[coord.id];\n        if (tile)\n            return tile;\n\n        var wrapped = coord.wrapped();\n        tile = this._tiles[wrapped.id];\n\n        if (!tile) {\n            tile = this._cache.get(wrapped.id);\n            if (tile && this._redoPlacement) {\n                this._redoPlacement(tile);\n            }\n        }\n\n        if (!tile) {\n            var zoom = coord.z;\n            var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1;\n            tile = new Tile(wrapped, this.tileSize * overscaling, this.maxzoom);\n            this._load(tile);\n        }\n\n        tile.uses++;\n        this._tiles[coord.id] = tile;\n        this._add(tile, coord);\n\n        return tile;\n    },\n\n    /**\n     * Remove a tile, given its id, from the pyramid\n     * @param {string|number} id tile id\n     * @returns {undefined} nothing\n     * @private\n     */\n    removeTile: function(id) {\n        var tile = this._tiles[id];\n        if (!tile)\n            return;\n\n        tile.uses--;\n        delete this._tiles[id];\n        this._remove(tile);\n\n        if (tile.uses > 0)\n            return;\n\n        if (tile.loaded) {\n            this._cache.add(tile.coord.wrapped().id, tile);\n        } else {\n            this._abort(tile);\n            this._unload(tile);\n        }\n    },\n\n    /**\n     * Remove all tiles from this pyramid\n     * @private\n     */\n    clearTiles: function() {\n        for (var id in this._tiles)\n            this.removeTile(id);\n        this._cache.reset();\n    },\n\n    /**\n     * Search through our current tiles and attempt to find the tiles that\n     * cover the given bounds.\n     * @param {Array<Coordinate>} queryGeometry coordinates of the corners of bounding rectangle\n     * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.\n     * @private\n     */\n    tilesIn: function(queryGeometry) {\n        var tileResults = {};\n        var ids = this.orderedIDs();\n\n        var minX = Infinity;\n        var minY = Infinity;\n        var maxX = -Infinity;\n        var maxY = -Infinity;\n        var z = queryGeometry[0].zoom;\n\n        for (var k = 0; k < queryGeometry.length; k++) {\n            var p = queryGeometry[k];\n            minX = Math.min(minX, p.column);\n            minY = Math.min(minY, p.row);\n            maxX = Math.max(maxX, p.column);\n            maxY = Math.max(maxY, p.row);\n        }\n\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this._tiles[ids[i]];\n            var coord = TileCoord.fromID(ids[i]);\n\n            var tileSpaceBounds = [\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)),\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z))\n            ];\n\n            if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT &&\n                tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) {\n\n                var tileSpaceQueryGeometry = [];\n                for (var j = 0; j < queryGeometry.length; j++) {\n                    tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j]));\n                }\n\n                var tileResult = tileResults[tile.coord.id];\n                if (tileResult === undefined) {\n                    tileResult = tileResults[tile.coord.id] = {\n                        tile: tile,\n                        coord: coord,\n                        queryGeometry: [],\n                        scale: Math.pow(2, this.transform.zoom - tile.coord.z)\n                    };\n                }\n\n                // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts\n                tileResult.queryGeometry.push(tileSpaceQueryGeometry);\n            }\n        }\n\n        var results = [];\n        for (var t in tileResults) {\n            results.push(tileResults[t]);\n        }\n        return results;\n    }\n};\n\n/**\n * Convert a coordinate to a point in a tile's coordinate space.\n * @param {Coordinate} tileCoord\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\nfunction coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) {\n    var zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom));\n    return {\n        x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT,\n        y: (zoomedCoord.row - tileCoord.y) * EXTENT\n    };\n\n}\n\nfunction compareKeyZoom(a, b) {\n    return (a % 32) - (b % 32);\n}\n\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports.VectorTile = __webpack_require__(1052);\nmodule.exports.VectorTileFeature = __webpack_require__(567);\nmodule.exports.VectorTileLayer = __webpack_require__(566);\n\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StructArrayType = __webpack_require__(102);\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    gl.enable(gl.DEPTH_TEST);\n    painter.depthMask(true);\n\n    // Change depth function to prevent double drawing in areas where tiles overlap.\n    gl.depthFunc(gl.LESS);\n\n    var minTileZ = coords.length && coords[0].z;\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n        painter.setDepthSublayer(coord.z - minTileZ);\n        drawRasterTile(painter, source, layer, coord);\n    }\n\n    gl.depthFunc(gl.LEQUAL);\n}\n\ndrawRaster.RasterBoundsArray = new StructArrayType({\n    members: [\n        { name: 'a_pos', type: 'Int16', components: 2 },\n        { name: 'a_texture_pos', type: 'Int16', components: 2 }\n    ]\n});\n\nfunction drawRasterTile(painter, source, layer, coord) {\n\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n\n    var tile = source.getTile(coord);\n    var posMatrix = painter.transform.calculatePosMatrix(coord, source.maxzoom);\n\n    var program = painter.useProgram('raster');\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    // color parameters\n    gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']);\n    gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']);\n    gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n    gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n    gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n    var parentTile = tile.source && tile.source._pyramid.findLoadedParent(coord, 0, {}),\n        opacities = getOpacities(tile, parentTile, layer, painter.transform);\n\n    var parentScaleBy, parentTL;\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n    gl.activeTexture(gl.TEXTURE1);\n\n    if (parentTile) {\n        gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n        parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n        parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n        opacities[1] = 0;\n    }\n\n    // cross-fade parameters\n    gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]);\n    gl.uniform1f(program.u_scale_parent, parentScaleBy || 1);\n    gl.uniform1f(program.u_buffer_scale, 1);\n    gl.uniform1f(program.u_opacity0, opacities[0]);\n    gl.uniform1f(program.u_opacity1, opacities[1]);\n    gl.uniform1i(program.u_image0, 0);\n    gl.uniform1i(program.u_image1, 1);\n\n    var buffer = tile.boundsBuffer || painter.rasterBoundsBuffer;\n    var vao = tile.boundsVAO || painter.rasterBoundsVAO;\n    vao.bind(gl, program, buffer);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length);\n}\n\nfunction spinWeights(angle) {\n    angle *= Math.PI / 180;\n    var s = Math.sin(angle);\n    var c = Math.cos(angle);\n    return [\n        (2 * c + 1) / 3,\n        (-Math.sqrt(3) * s - c + 1) / 3,\n        (Math.sqrt(3) * s - c + 1) / 3\n    ];\n}\n\nfunction contrastFactor(contrast) {\n    return contrast > 0 ?\n        1 / (1 - contrast) :\n        1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n    return saturation > 0 ?\n        1 - 1 / (1.001 - saturation) :\n        -saturation;\n}\n\nfunction getOpacities(tile, parentTile, layer, transform) {\n    var opacity = [1, 0];\n    var fadeDuration = layer.paint['raster-fade-duration'];\n\n    if (tile.source && fadeDuration > 0) {\n        var now = new Date().getTime();\n\n        var sinceTile = (now - tile.timeAdded) / fadeDuration;\n        var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n        var idealZ = tile.source._pyramid.coveringZoomLevel(transform);\n        var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false;\n\n        if (!parentTile || parentFurther) {\n            // if no parent or parent is older\n            opacity[0] = util.clamp(sinceTile, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        } else {\n            // parent is younger, zooming out\n            opacity[0] = util.clamp(1 - sinceParent, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        }\n    }\n\n    var op = layer.paint['raster-opacity'];\n    opacity[0] *= op;\n    opacity[1] *= op;\n\n    return opacity;\n}\n\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LngLatBounds;\n\nvar LngLat = __webpack_require__(89);\n\n/**\n * Creates a bounding box from the given pair of points. If parameteres are omitted, a `null` bounding box is created.\n *\n * @class LngLatBounds\n * @classdesc A representation of rectangular box on the earth, defined by its southwest and northeast points in longitude and latitude.\n * @param {LngLat} sw southwest\n * @param {LngLat} ne northeast\n * @example\n * var sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * var ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * var llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nfunction LngLatBounds(sw, ne) {\n    if (!sw) {\n        return;\n    } else if (ne) {\n        this.extend(sw).extend(ne);\n    } else if (sw.length === 4) {\n        this.extend([sw[0], sw[1]]).extend([sw[2], sw[3]]);\n    } else {\n        this.extend(sw[0]).extend(sw[1]);\n    }\n}\n\nLngLatBounds.prototype = {\n\n    /**\n     * Extend the bounds to include a given LngLat or LngLatBounds.\n     *\n     * @param {LngLat|LngLatBounds} obj object to extend to\n     * @returns {LngLatBounds} `this`\n     */\n    extend: function(obj) {\n        var sw = this._sw,\n            ne = this._ne,\n            sw2, ne2;\n\n        if (obj instanceof LngLat) {\n            sw2 = obj;\n            ne2 = obj;\n\n        } else if (obj instanceof LngLatBounds) {\n            sw2 = obj._sw;\n            ne2 = obj._ne;\n\n            if (!sw2 || !ne2) return this;\n\n        } else {\n            return obj ? this.extend(LngLat.convert(obj) || LngLatBounds.convert(obj)) : this;\n        }\n\n        if (!sw && !ne) {\n            this._sw = new LngLat(sw2.lng, sw2.lat);\n            this._ne = new LngLat(ne2.lng, ne2.lat);\n\n        } else {\n            sw.lng = Math.min(sw2.lng, sw.lng);\n            sw.lat = Math.min(sw2.lat, sw.lat);\n            ne.lng = Math.max(ne2.lng, ne.lng);\n            ne.lat = Math.max(ne2.lat, ne.lat);\n        }\n\n        return this;\n    },\n\n    /**\n     * Get the point equidistant from this box's corners\n     * @returns {LngLat} centerpoint\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n     */\n    getCenter: function() {\n        return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n    },\n\n    /**\n     * Get southwest corner\n     * @returns {LngLat} southwest\n     */\n    getSouthWest: function() { return this._sw; },\n\n    /**\n     * Get northeast corner\n     * @returns {LngLat} northeast\n     */\n    getNorthEast: function() { return this._ne; },\n\n    /**\n     * Get northwest corner\n     * @returns {LngLat} northwest\n     */\n    getNorthWest: function() { return new LngLat(this.getWest(), this.getNorth()); },\n\n    /**\n     * Get southeast corner\n     * @returns {LngLat} southeast\n     */\n    getSouthEast: function() { return new LngLat(this.getEast(), this.getSouth()); },\n\n    /**\n     * Get west edge longitude\n     * @returns {number} west\n     */\n    getWest:  function() { return this._sw.lng; },\n\n    /**\n     * Get south edge latitude\n     * @returns {number} south\n     */\n    getSouth: function() { return this._sw.lat; },\n\n    /**\n     * Get east edge longitude\n     * @returns {number} east\n     */\n    getEast:  function() { return this._ne.lng; },\n\n    /**\n     * Get north edge latitude\n     * @returns {number} north\n     */\n    getNorth: function() { return this._ne.lat; },\n\n    /**\n     * Return a `LngLatBounds` as an array\n     *\n     * @returns {array} [lng, lat]\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n     */\n    toArray: function () {\n        return [this._sw.toArray(), this._ne.toArray()];\n    },\n\n    /**\n     * Return a `LngLatBounds` as a string\n     *\n     * @returns {string} \"LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))\"\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n     */\n    toString: function () {\n        return 'LngLatBounds(' + this._sw.toString() + ', ' + this._ne.toString() + ')';\n    }\n};\n\n/**\n * Convert an array to a `LngLatBounds` object, or return an existing\n * `LngLatBounds` object unchanged.\n *\n * Calls `LngLat#convert` internally to convert arrays as `LngLat` values.\n *\n * @param {LngLatBounds|Array<number>|Array<Array<number>>} input input to convert to a LngLatBounds\n * @returns {LngLatBounds} LngLatBounds object or original input\n * @example\n * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n * var llb = mapboxgl.LngLatBounds.convert(arr);\n * llb;   // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n */\nLngLatBounds.convert = function (input) {\n    if (!input || input instanceof LngLatBounds) return input;\n    return new LngLatBounds(input);\n};\n\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Evented = __webpack_require__(55);\nmodule.exports = Control;\n\n/**\n * A base class for map-related interface elements.\n *\n * @class Control\n */\nfunction Control() {}\n\nControl.prototype = {\n    /**\n     * Add this control to the map, returning the control itself\n     * for chaining. This will insert the control's DOM element into\n     * the map's DOM element if the control has a `position` specified.\n     *\n     * @param {Map} map\n     * @returns {Control} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        var container = this._container = this.onAdd(map);\n        if (this.options && this.options.position) {\n            var pos = this.options.position;\n            var corner = map._controlCorners[pos];\n            container.className += ' mapboxgl-ctrl';\n            if (pos.indexOf('bottom') !== -1) {\n                corner.insertBefore(container, corner.firstChild);\n            } else {\n                corner.appendChild(container);\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Remove this control from the map it has been added to.\n     *\n     * @returns {Control} `this`\n     */\n    remove: function() {\n        this._container.parentNode.removeChild(this._container);\n        if (this.onRemove) this.onRemove(this._map);\n        this._map = null;\n        return this;\n    }\n};\n\nutil.extend(Control.prototype, Evented);\n\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.END_DRAG = exports.DROP = exports.HOVER = exports.PUBLISH_DRAG_SOURCE = exports.BEGIN_DRAG = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.beginDrag = beginDrag;\nexports.publishDragSource = publishDragSource;\nexports.hover = hover;\nexports.drop = drop;\nexports.endDrag = endDrag;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = __webpack_require__(158);\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _isObject = __webpack_require__(283);\n\nvar _isObject2 = _interopRequireDefault(_isObject);\n\nvar _matchesType = __webpack_require__(585);\n\nvar _matchesType2 = _interopRequireDefault(_matchesType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BEGIN_DRAG = exports.BEGIN_DRAG = 'dnd-core/BEGIN_DRAG';\nvar PUBLISH_DRAG_SOURCE = exports.PUBLISH_DRAG_SOURCE = 'dnd-core/PUBLISH_DRAG_SOURCE';\nvar HOVER = exports.HOVER = 'dnd-core/HOVER';\nvar DROP = exports.DROP = 'dnd-core/DROP';\nvar END_DRAG = exports.END_DRAG = 'dnd-core/END_DRAG';\n\nfunction beginDrag(sourceIds) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { publishSource: true, clientOffset: null };\n\tvar publishSource = options.publishSource,\n\t    clientOffset = options.clientOffset,\n\t    getSourceClientOffset = options.getSourceClientOffset;\n\n\t(0, _invariant2.default)((0, _isArray2.default)(sourceIds), 'Expected sourceIds to be an array.');\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(!monitor.isDragging(), 'Cannot call beginDrag while dragging.');\n\n\tfor (var i = 0; i < sourceIds.length; i++) {\n\t\t(0, _invariant2.default)(registry.getSource(sourceIds[i]), 'Expected sourceIds to be registered.');\n\t}\n\n\tvar sourceId = null;\n\tfor (var _i = sourceIds.length - 1; _i >= 0; _i--) {\n\t\tif (monitor.canDragSource(sourceIds[_i])) {\n\t\t\tsourceId = sourceIds[_i];\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (sourceId === null) {\n\t\treturn;\n\t}\n\n\tvar sourceClientOffset = null;\n\tif (clientOffset) {\n\t\t(0, _invariant2.default)(typeof getSourceClientOffset === 'function', 'When clientOffset is provided, getSourceClientOffset must be a function.');\n\t\tsourceClientOffset = getSourceClientOffset(sourceId);\n\t}\n\n\tvar source = registry.getSource(sourceId);\n\tvar item = source.beginDrag(monitor, sourceId);\n\t(0, _invariant2.default)((0, _isObject2.default)(item), 'Item must be an object.');\n\n\tregistry.pinSource(sourceId);\n\n\tvar itemType = registry.getSourceType(sourceId);\n\treturn {\n\t\ttype: BEGIN_DRAG,\n\t\titemType: itemType,\n\t\titem: item,\n\t\tsourceId: sourceId,\n\t\tclientOffset: clientOffset,\n\t\tsourceClientOffset: sourceClientOffset,\n\t\tisSourcePublic: publishSource\n\t};\n}\n\nfunction publishDragSource() {\n\tvar monitor = this.getMonitor();\n\tif (!monitor.isDragging()) {\n\t\treturn;\n\t}\n\n\treturn { type: PUBLISH_DRAG_SOURCE };\n}\n\nfunction hover(targetIdsArg) {\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t    _ref$clientOffset = _ref.clientOffset,\n\t    clientOffset = _ref$clientOffset === undefined ? null : _ref$clientOffset;\n\n\t(0, _invariant2.default)((0, _isArray2.default)(targetIdsArg), 'Expected targetIds to be an array.');\n\tvar targetIds = targetIdsArg.slice(0);\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call hover while not dragging.');\n\t(0, _invariant2.default)(!monitor.didDrop(), 'Cannot call hover after drop.');\n\n\t// First check invariants.\n\tfor (var i = 0; i < targetIds.length; i++) {\n\t\tvar targetId = targetIds[i];\n\t\t(0, _invariant2.default)(targetIds.lastIndexOf(targetId) === i, 'Expected targetIds to be unique in the passed array.');\n\n\t\tvar target = registry.getTarget(targetId);\n\t\t(0, _invariant2.default)(target, 'Expected targetIds to be registered.');\n\t}\n\n\tvar draggedItemType = monitor.getItemType();\n\n\t// Remove those targetIds that don't match the targetType.  This\n\t// fixes shallow isOver which would only be non-shallow because of\n\t// non-matching targets.\n\tfor (var _i2 = targetIds.length - 1; _i2 >= 0; _i2--) {\n\t\tvar _targetId = targetIds[_i2];\n\t\tvar targetType = registry.getTargetType(_targetId);\n\t\tif (!(0, _matchesType2.default)(targetType, draggedItemType)) {\n\t\t\ttargetIds.splice(_i2, 1);\n\t\t}\n\t}\n\n\t// Finally call hover on all matching targets.\n\tfor (var _i3 = 0; _i3 < targetIds.length; _i3++) {\n\t\tvar _targetId2 = targetIds[_i3];\n\t\tvar _target = registry.getTarget(_targetId2);\n\t\t_target.hover(monitor, _targetId2);\n\t}\n\n\treturn {\n\t\ttype: HOVER,\n\t\ttargetIds: targetIds,\n\t\tclientOffset: clientOffset\n\t};\n}\n\nfunction drop() {\n\tvar _this = this;\n\n\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call drop while not dragging.');\n\t(0, _invariant2.default)(!monitor.didDrop(), 'Cannot call drop twice during one drag operation.');\n\n\tvar targetIds = monitor.getTargetIds().filter(monitor.canDropOnTarget, monitor);\n\n\ttargetIds.reverse();\n\ttargetIds.forEach(function (targetId, index) {\n\t\tvar target = registry.getTarget(targetId);\n\n\t\tvar dropResult = target.drop(monitor, targetId);\n\t\t(0, _invariant2.default)(typeof dropResult === 'undefined' || (0, _isObject2.default)(dropResult), 'Drop result must either be an object or undefined.');\n\t\tif (typeof dropResult === 'undefined') {\n\t\t\tdropResult = index === 0 ? {} : monitor.getDropResult();\n\t\t}\n\n\t\t_this.store.dispatch({\n\t\t\ttype: DROP,\n\t\t\tdropResult: _extends({}, options, dropResult)\n\t\t});\n\t});\n}\n\nfunction endDrag() {\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call endDrag while not dragging.');\n\n\tvar sourceId = monitor.getSourceId();\n\tvar source = registry.getSource(sourceId, true);\n\tsource.endDrag(monitor, sourceId);\n\n\tregistry.unpinSource();\n\n\treturn { type: END_DRAG };\n}\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(202);\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsNative = __webpack_require__(1136),\n    getValue = __webpack_require__(1143);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(1137);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar eq = __webpack_require__(1151);\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isKeyable = __webpack_require__(1157);\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.addSource = addSource;\nexports.addTarget = addTarget;\nexports.removeSource = removeSource;\nexports.removeTarget = removeTarget;\nvar ADD_SOURCE = exports.ADD_SOURCE = 'dnd-core/ADD_SOURCE';\nvar ADD_TARGET = exports.ADD_TARGET = 'dnd-core/ADD_TARGET';\nvar REMOVE_SOURCE = exports.REMOVE_SOURCE = 'dnd-core/REMOVE_SOURCE';\nvar REMOVE_TARGET = exports.REMOVE_TARGET = 'dnd-core/REMOVE_TARGET';\n\nfunction addSource(sourceId) {\n\treturn {\n\t\ttype: ADD_SOURCE,\n\t\tsourceId: sourceId\n\t};\n}\n\nfunction addTarget(targetId) {\n\treturn {\n\t\ttype: ADD_TARGET,\n\t\ttargetId: targetId\n\t};\n}\n\nfunction removeSource(sourceId) {\n\treturn {\n\t\ttype: REMOVE_SOURCE,\n\t\tsourceId: sourceId\n\t};\n}\n\nfunction removeTarget(targetId) {\n\treturn {\n\t\ttype: REMOVE_TARGET,\n\t\ttargetId: targetId\n\t};\n}\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = checkDecoratorArguments;\nfunction checkDecoratorArguments(functionName, signature) {\n\tif (false) {\n\t\tfor (var i = 0; i < (arguments.length <= 2 ? 0 : arguments.length - 2); i += 1) {\n\t\t\tvar arg = arguments.length <= i + 2 ? undefined : arguments[i + 2];\n\t\t\tif (arg && arg.prototype && arg.prototype.render) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('You seem to be applying the arguments in the wrong order. ' + ('It should be ' + functionName + '(' + signature + ')(Component), not the other way around. ') + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#you-seem-to-be-applying-the-arguments-in-the-wrong-order');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsNative = __webpack_require__(1235),\n    getValue = __webpack_require__(1241);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(208);\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar eq = __webpack_require__(298);\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isKeyable = __webpack_require__(1278);\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _formatValue = __webpack_require__(622);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Amount = function Amount(_ref) {\n    var _ref$unit = _ref.unit,\n        unit = _ref$unit === undefined ? _numberTypes.numberTypes.none : _ref$unit,\n        _ref$abbreviated = _ref.abbreviated,\n        abbreviated = _ref$abbreviated === undefined ? false : _ref$abbreviated,\n        value = _ref.value,\n        noUnitSymbols = _ref.noUnitSymbols,\n        _ref$addSpace = _ref.addSpace,\n        addSpace = _ref$addSpace === undefined ? false : _ref$addSpace;\n\n    var space = addSpace ? ' ' : '';\n    if (!_lodash2.default.isNumber(value)) {\n        return _react2.default.createElement(\"span\", null, \"Null\");\n    }\n    if (noUnitSymbols) {\n        return _react2.default.createElement(\"span\", null, (0, _formatValue.formatValue)(unit.get('symbol'), value));\n    }\n    return _react2.default.createElement(\"span\", null, unit.get('formatter')((0, _formatValue.formatValue)(unit.get('symbol'), value, abbreviated), space));\n};\nexports.default = Amount;\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Coordinate;\n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nfunction Coordinate(column, row, zoom) {\n    this.column = column;\n    this.row = row;\n    this.zoom = zoom;\n}\n\nCoordinate.prototype = {\n\n    /**\n     * Create a clone of this coordinate that can be mutated without\n     * changing the original coordinate\n     *\n     * @returns {Coordinate} clone\n     * @private\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.clone();\n     * // since coord is cloned, modifying a property of c2 does\n     * // not modify it.\n     * c2.zoom = 2;\n     */\n    clone: function() {\n        return new Coordinate(this.column, this.row, this.zoom);\n    },\n\n    /**\n     * Zoom this coordinate to a given zoom level. This returns a new\n     * coordinate object, not mutating the old one.\n     *\n     * @param {number} zoom\n     * @returns {Coordinate} zoomed coordinate\n     * @private\n     * @example\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.zoomTo(1);\n     * c2 // equals new Coordinate(0, 0, 1);\n     */\n    zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); },\n\n    /**\n     * Subtract the column and row values of this coordinate from those\n     * of another coordinate. The other coordinat will be zoomed to the\n     * same level as `this` before the subtraction occurs\n     *\n     * @param {Coordinate} c other coordinate\n     * @returns {Coordinate} result\n     * @private\n     */\n    sub: function(c) { return this.clone()._sub(c); },\n\n    _zoomTo: function(zoom) {\n        var scale = Math.pow(2, zoom - this.zoom);\n        this.column *= scale;\n        this.row *= scale;\n        this.zoom = zoom;\n        return this;\n    },\n\n    _sub: function(c) {\n        c = c.zoomTo(this.zoom);\n        this.column -= c.column;\n        this.row -= c.row;\n        return this;\n    }\n};\n\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n    return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t)\n    ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t),\n        interpolate(from[2], to[2], t),\n        interpolate(from[3], to[3], t)\n    ];\n};\n\ninterpolate.array = function(from, to, t) {\n    return from.map(function(d, i) {\n        return interpolate(d, to[i], t);\n    });\n};\n\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nmodule.exports = function unbundle(value) {\n    if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n        return value.valueOf();\n    } else {\n        return value;\n    }\n};\n\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StructArrayType = __webpack_require__(104);\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    gl.enable(gl.DEPTH_TEST);\n    painter.depthMask(true);\n\n    // Change depth function to prevent double drawing in areas where tiles overlap.\n    gl.depthFunc(gl.LESS);\n\n    var minTileZ = coords.length && coords[0].z;\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n        painter.setDepthSublayer(coord.z - minTileZ);\n        drawRasterTile(painter, source, layer, coord);\n    }\n\n    gl.depthFunc(gl.LEQUAL);\n}\n\ndrawRaster.RasterBoundsArray = new StructArrayType({\n    members: [\n        { name: 'a_pos', type: 'Int16', components: 2 },\n        { name: 'a_texture_pos', type: 'Int16', components: 2 }\n    ]\n});\n\nfunction drawRasterTile(painter, source, layer, coord) {\n\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n\n    var tile = source.getTile(coord);\n    var posMatrix = painter.transform.calculatePosMatrix(coord, source.maxzoom);\n\n    var program = painter.useProgram('raster');\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    // color parameters\n    gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']);\n    gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']);\n    gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n    gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n    gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n    var parentTile = tile.source && tile.source.findLoadedParent(coord, 0, {}),\n        opacities = getOpacities(tile, parentTile, layer, painter.transform);\n\n    var parentScaleBy, parentTL;\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n    gl.activeTexture(gl.TEXTURE1);\n\n    if (parentTile) {\n        gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n        parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n        parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n        opacities[1] = 0;\n    }\n\n    // cross-fade parameters\n    gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]);\n    gl.uniform1f(program.u_scale_parent, parentScaleBy || 1);\n    gl.uniform1f(program.u_buffer_scale, 1);\n    gl.uniform1f(program.u_opacity0, opacities[0]);\n    gl.uniform1f(program.u_opacity1, opacities[1]);\n    gl.uniform1i(program.u_image0, 0);\n    gl.uniform1i(program.u_image1, 1);\n\n    var buffer = tile.boundsBuffer || painter.rasterBoundsBuffer;\n    var vao = tile.boundsVAO || painter.rasterBoundsVAO;\n    vao.bind(gl, program, buffer);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length);\n}\n\nfunction spinWeights(angle) {\n    angle *= Math.PI / 180;\n    var s = Math.sin(angle);\n    var c = Math.cos(angle);\n    return [\n        (2 * c + 1) / 3,\n        (-Math.sqrt(3) * s - c + 1) / 3,\n        (Math.sqrt(3) * s - c + 1) / 3\n    ];\n}\n\nfunction contrastFactor(contrast) {\n    return contrast > 0 ?\n        1 / (1 - contrast) :\n        1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n    return saturation > 0 ?\n        1 - 1 / (1.001 - saturation) :\n        -saturation;\n}\n\nfunction getOpacities(tile, parentTile, layer, transform) {\n    var opacity = [1, 0];\n    var fadeDuration = layer.paint['raster-fade-duration'];\n\n    if (tile.source && fadeDuration > 0) {\n        var now = new Date().getTime();\n\n        var sinceTile = (now - tile.timeAdded) / fadeDuration;\n        var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n        var idealZ = transform.coveringZoomLevel(tile.source);\n        var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false;\n\n        if (!parentTile || parentFurther) {\n            // if no parent or parent is older\n            opacity[0] = util.clamp(sinceTile, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        } else {\n            // parent is younger, zooming out\n            opacity[0] = util.clamp(1 - sinceParent, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        }\n    }\n\n    var op = layer.paint['raster-opacity'];\n    opacity[0] *= op;\n    opacity[1] *= op;\n\n    return opacity;\n}\n\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LngLatBounds;\n\nvar LngLat = __webpack_require__(82);\n\n/**\n * A `LngLatBounds` object represents a geographical bounding box,\n * defined by its southwest and northeast points in longitude and latitude.\n *\n * If no arguments are provided to the constructor, a `null` bounding box is created.\n *\n * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option\n * can also accept an `Array` of two [`LngLatLike`](#LngLatLike) constructs and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatBoundsLike`](#LngLatBoundsLike).\n *\n * @class LngLatBounds\n * @param {LngLatLike} sw The southwest corner of the bounding box.\n * @param {LngLatLike} ne The northeast corner of the bounding box.\n * @example\n * var sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * var ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * var llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nfunction LngLatBounds(sw, ne) {\n    if (!sw) {\n        return;\n    } else if (ne) {\n        this.setSouthWest(sw).setNorthEast(ne);\n    } else if (sw.length === 4) {\n        this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]);\n    } else {\n        this.setSouthWest(sw[0]).setNorthEast(sw[1]);\n    }\n}\n\nLngLatBounds.prototype = {\n\n    /**\n     * Set the northeast corner of the bounding box\n     *\n     * @param {LngLatLike} ne\n     * @returns {LngLatBounds} `this`\n     */\n    setNorthEast: function(ne) {\n        this._ne = LngLat.convert(ne);\n        return this;\n    },\n\n    /**\n     * Set the southwest corner of the bounding box\n     *\n     * @param {LngLatLike} sw\n     * @returns {LngLatBounds} `this`\n     */\n    setSouthWest: function(sw) {\n        this._sw = LngLat.convert(sw);\n        return this;\n    },\n\n    /**\n     * Extend the bounds to include a given LngLat or LngLatBounds.\n     *\n     * @param {LngLat|LngLatBounds} obj object to extend to\n     * @returns {LngLatBounds} `this`\n     */\n    extend: function(obj) {\n        var sw = this._sw,\n            ne = this._ne,\n            sw2, ne2;\n\n        if (obj instanceof LngLat) {\n            sw2 = obj;\n            ne2 = obj;\n\n        } else if (obj instanceof LngLatBounds) {\n            sw2 = obj._sw;\n            ne2 = obj._ne;\n\n            if (!sw2 || !ne2) return this;\n\n        } else {\n            return obj ? this.extend(LngLat.convert(obj) || LngLatBounds.convert(obj)) : this;\n        }\n\n        if (!sw && !ne) {\n            this._sw = new LngLat(sw2.lng, sw2.lat);\n            this._ne = new LngLat(ne2.lng, ne2.lat);\n\n        } else {\n            sw.lng = Math.min(sw2.lng, sw.lng);\n            sw.lat = Math.min(sw2.lat, sw.lat);\n            ne.lng = Math.max(ne2.lng, ne.lng);\n            ne.lat = Math.max(ne2.lat, ne.lat);\n        }\n\n        return this;\n    },\n\n    /**\n     * Returns the geographical coordinate equidistant from the bounding box's corners.\n     *\n     * @returns {LngLat} The bounding box's center.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n     */\n    getCenter: function() {\n        return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n    },\n\n    /**\n     * Returns the southwest corner of the bounding box.\n     *\n     * @returns {LngLat} The southwest corner of the bounding box.\n     */\n    getSouthWest: function() { return this._sw; },\n\n    /**\n    * Returns the northeast corner of the bounding box.\n    *\n    * @returns {LngLat} The northeast corner of the bounding box.\n     */\n    getNorthEast: function() { return this._ne; },\n\n    /**\n    * Returns the northwest corner of the bounding box.\n    *\n    * @returns {LngLat} The northwest corner of the bounding box.\n     */\n    getNorthWest: function() { return new LngLat(this.getWest(), this.getNorth()); },\n\n    /**\n    * Returns the southeast corner of the bounding box.\n    *\n    * @returns {LngLat} The southeast corner of the bounding box.\n     */\n    getSouthEast: function() { return new LngLat(this.getEast(), this.getSouth()); },\n\n    /**\n    * Returns the west edge of the bounding box.\n    *\n    * @returns {LngLat} The west edge of the bounding box.\n     */\n    getWest:  function() { return this._sw.lng; },\n\n    /**\n    * Returns the south edge of the bounding box.\n    *\n    * @returns {LngLat} The south edge of the bounding box.\n     */\n    getSouth: function() { return this._sw.lat; },\n\n    /**\n    * Returns the east edge of the bounding box.\n    *\n    * @returns {LngLat} The east edge of the bounding box.\n     */\n    getEast:  function() { return this._ne.lng; },\n\n    /**\n    * Returns the north edge of the bounding box.\n    *\n    * @returns {LngLat} The north edge of the bounding box.\n     */\n    getNorth: function() { return this._ne.lat; },\n\n    /**\n     * Returns the bounding box represented as an array.\n     *\n     * @returns {Array<Array<number>>} The bounding box represented as an array, consisting of the\n     *   southwest and northeast coordinates of the bounding represented as arrays of numbers.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n     */\n    toArray: function () {\n        return [this._sw.toArray(), this._ne.toArray()];\n    },\n\n    /**\n     * Return the bounding box represented as a string.\n     *\n     * @returns {string} The bounding box represents as a string of the format\n     *   `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n     */\n    toString: function () {\n        return 'LngLatBounds(' + this._sw.toString() + ', ' + this._ne.toString() + ')';\n    }\n};\n\n/**\n * Converts an array to a `LngLatBounds` object.\n *\n * If a `LngLatBounds` object is passed in, the function returns it unchanged.\n *\n * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.\n *\n * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.\n * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.\n * @example\n * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n * var llb = mapboxgl.LngLatBounds.convert(arr);\n * llb;   // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n */\nLngLatBounds.convert = function (input) {\n    if (!input || input instanceof LngLatBounds) return input;\n    return new LngLatBounds(input);\n};\n\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ShareList = (0, _createReactClass2.default)({\n    displayName: 'ShareList',\n\n    propTypes: {\n        linkHelper: _propTypes2.default.object.isRequired,\n        options: _propTypes2.default.object,\n        showShareMenu: _propTypes2.default.bool,\n        showDownloadItems: _propTypes2.default.bool\n    },\n    handleTwitter: function handleTwitter() {\n        this.props.linkHelper.shareTwitter();\n    },\n    handleFacebook: function handleFacebook() {\n        this.props.linkHelper.shareFacebook();\n    },\n    handleGoogle: function handleGoogle() {\n        this.props.linkHelper.shareGoogle();\n    },\n    handleEmail: function handleEmail() {\n        this.props.linkHelper.shareEmail();\n    },\n    handleCSVDownload: function handleCSVDownload() {\n        _report_actions2.default.downloadCSV();\n        this.props.options.downloadModel.downloadCsv(this.downloadData());\n    },\n    showDownloads: function showDownloads() {\n        _report_actions2.default.showDownloadModal();\n    },\n    viewData: function viewData() {\n        return {\n            hideImageDownload: !og.svgSupported()\n        };\n    },\n    tableHeader: function tableHeader(lines, maxDepth) {\n        var state = _summary_report_store2.default.getState();\n        var dataSets = _summary_report_store2.default.getRenderedDataSets(true);\n        var header = [];\n        var fiscalYearStartMonth = this.props.options.entity.get('fiscal_year_start_month');\n        _lodash2.default.forEach(_lodash2.default.range(maxDepth + 1), function (depth) {\n            header.push('');\n        });\n        _lodash2.default.forEach(dataSets, _lodash2.default.bind(function (dataSet, index) {\n            var label = _strings2.default.dataSetLabel(dataSet, this.props.options.athenaState.get('product'), state.get('currentYearPeriod'), state.get('currentYearAmount'), fiscalYearStartMonth, {\n                proration: state.get('proration')\n            }).replace(/\\n/g, ' ');\n            header.push(_strings2.default.nl2br(_underscore2.default.escapeHTML(label)));\n            var showVariance = !_lodash2.default.isUndefined(lines[0].amounts[index].variance);\n            if (showVariance) {\n                var fiscalYear = _strings2.default.fiscalYear(dataSet.year, fiscalYearStartMonth);\n                header.push(fiscalYear + ' Actual vs Budget Variance');\n                header.push(fiscalYear + ' Actual vs Budget % Variance');\n            }\n        }, this));\n        return header;\n    },\n    tableBody: function tableBody(lines, maxDepth) {\n        var rows = [];\n        var row = void 0;\n        var depthNames = {};\n        _lodash2.default.forEach(lines, function (line) {\n            row = [];\n            rows.push(row);\n            _lodash2.default.forEach(_lodash2.default.range(maxDepth + 1), function (depth) {\n                if (depth === line.depth) {\n                    depthNames[depth] = _strings2.default.nodeName(line);\n                }\n                row.push({ type: 'string', value: depth <= line.depth ? depthNames[depth] : '' });\n            });\n            _lodash2.default.forEach(line.amounts, function (amount) {\n                row.push({ type: _summary_report_store2.default.getAmountType(), value: amount.value });\n                if (!_lodash2.default.isUndefined(amount.variance)) {\n                    row.push({ type: _summary_report_store2.default.getAmountType(), value: amount.variance });\n                    row.push({ type: 'percent', value: amount.percentVariance });\n                }\n            });\n        });\n        return rows;\n    },\n    tableFooter: function tableFooter(totals, maxDepth) {\n        var budgetData = this.props.options.budgetData;\n        var accountType = budgetData.state.get('accountType');\n        var footer = [{ type: 'string', value: _strings2.default.aggregateRowLabel(accountType, budgetData.visibleAccounts) }];\n        _lodash2.default.forEach(_lodash2.default.range(maxDepth), function () {\n            footer.push({ type: 'string', value: '' });\n        });\n        _lodash2.default.forEach(totals, function (total) {\n            footer.push({ type: _summary_report_store2.default.getAmountType(), value: accountType === 'types' ? total.delta : total.amount });\n            if (!_lodash2.default.isUndefined(total.variance)) {\n                footer.push({ type: _summary_report_store2.default.getAmountType(), value: total.variance });\n                footer.push({ type: 'percent', value: total.percentVariance });\n            }\n        });\n        return footer;\n    },\n    downloadData: function downloadData() {\n        var budgetData = this.props.options.budgetData;\n        var data = _summary_report_store2.default.getRenderedData(false, true);\n        var maxDepth = _lodash2.default.maxBy(data.lines, 'depth').depth;\n        var breakdown = budgetData.state.get('breakdown');\n        var yAxisScale = _summary_report_store2.default.getState().get('yAxisScale');\n        var locale = _summary_report_store2.default.getState().get('locale');\n        var unitSymbol = _summary_report_store2.default.getReportAmountType().symbol;\n        var title = budgetData.titles(breakdown).primary.name;\n        title = yAxisScale ? title + ' - ' + yAxisScale.get('name') : title;\n        return {\n            title: title,\n            locale: locale,\n            unitSymbol: unitSymbol,\n            filterContext: JSON.stringify(budgetData.filterContext(breakdown)),\n            header: JSON.stringify(this.tableHeader(data.lines, maxDepth)),\n            data: JSON.stringify(this.tableBody(data.lines, maxDepth)),\n            footer: JSON.stringify(this.tableFooter(data.totals, maxDepth)),\n            exportDateString: _strings2.default.generateDownloadString(locale)\n        };\n    },\n    _renderShareItems: function _renderShareItems() {\n        return [_react2.default.createElement(\"li\", { key: 1, className: \"ui-nav-list__item no-hover\" }, _react2.default.createElement(\"h4\", null, \"Share\")), _react2.default.createElement(\"li\", { key: 2 }, _react2.default.createElement(\"button\", { className: \"icon-facebook-1\", onClick: this.handleFacebook }, \"Facebook\")), _react2.default.createElement(\"li\", { key: 4 }, _react2.default.createElement(\"button\", { className: \"icon-twitter-1\", onClick: this.handleTwitter }, \"Twitter\")), _react2.default.createElement(\"li\", { key: 5 }, _react2.default.createElement(\"button\", { className: \"icon-email-1\", onClick: this.handleEmail }, \"Email\"))];\n    },\n    _renderDownloadItems: function _renderDownloadItems() {\n        return [_react2.default.createElement(\"li\", { key: 1, className: \"ui-nav-list__item no-hover\" }, _react2.default.createElement(\"h4\", null, \"Download\")), _react2.default.createElement(\"li\", { key: 5 }, _react2.default.createElement(\"button\", { onClick: this.showDownloads }, \"Image (.png) \")), _react2.default.createElement(\"li\", { key: 4 }, _react2.default.createElement(\"button\", { onClick: this.handleCSVDownload }, \"Spreadsheet (.csv)\"))];\n    },\n    render: function render() {\n        return _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, !this.props.showShareMenu && this._renderShareItems(), this.props.showDownloadItems && this._renderDownloadItems());\n    }\n});\nexports.default = ShareList;\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SharedLinkHelper = {\n    create: function create(entity) {\n        var self = _lodash2.default.extend({}, this);\n        var location = this.getLocationProperties();\n        self.entity = entity;\n        self.hashtag = self.entity.get('name').split(' ').join('');\n        self.text = 'Explore #' + self.hashtag + ' finances on the @opengovinc platform #transparency';\n        self.location = location.location;\n        self.locationString = location.locationString;\n        self.title = document.title;\n        return self;\n    },\n    getLocationProperties: function getLocationProperties() {\n        return {\n            location: window.location.href,\n            locationString: window.location.toString()\n        };\n    },\n    updateUrl: function updateUrl() {\n        var location = this.getLocationProperties();\n        this.location = location.location;\n        this.locationString = location.locationString;\n    },\n    popup: function popup(uri, name, features) {\n        window.open(uri, name, features);\n    },\n    shareTwitter: function shareTwitter() {\n        this.updateUrl();\n        this.popup('https://twitter.com/share?url=' + encodeURIComponent(this.location) + '&text=' + encodeURIComponent(this.text), 'sharer', 'toolbar=0,status=0,width=655,height=260');\n    },\n    shareFacebook: function shareFacebook() {\n        this.updateUrl();\n        this.popup('https://www.facebook.com/sharer.php?u=' + encodeURIComponent(this.location) + '&t=' + encodeURIComponent(this.title), 'sharer', 'toolbar=0,status=0,width=655,height=250');\n    },\n    shareGoogle: function shareGoogle() {\n        this.updateUrl();\n        this.popup('https://plus.google.com/share?url=' + encodeURIComponent(this.location), 'sharer', 'menubar=no,resizable=yes,scrollbars=yes,toolbar=0,status=0,width=600,height=400');\n    },\n    shareEmail: function shareEmail() {\n        this.updateUrl();\n        window.location.href = 'mailto:?subject=Check out this visualization from OpenGov (' + this.entity.get('name') + ')&body=%0D%0A' + encodeURIComponent(this.location);\n    }\n};\nexports.default = SharedLinkHelper;\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = __webpack_require__(167);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _animateScroll = __webpack_require__(657);\n\nvar _animateScroll2 = _interopRequireDefault(_animateScroll);\n\nvar _scrollEvents = __webpack_require__(316);\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar __mapped = {};\nvar __activeLink = void 0;\n\nexports.default = {\n\n  unmount: function unmount() {\n    __mapped = {};\n  },\n\n  register: function register(name, element) {\n    __mapped[name] = element;\n  },\n\n  unregister: function unregister(name) {\n    delete __mapped[name];\n  },\n\n  get: function get(name) {\n    return __mapped[name] || document.getElementById(name) || document.getElementsByName(name)[0] || document.getElementsByClassName(name)[0];\n  },\n\n  setActiveLink: function setActiveLink(link) {\n    return __activeLink = link;\n  },\n\n  getActiveLink: function getActiveLink() {\n    return __activeLink;\n  },\n\n  scrollTo: function scrollTo(to, props) {\n\n    var target = this.get(to);\n\n    if (!target) {\n      console.warn(\"target Element not found\");\n      return;\n    }\n\n    props = _extends({}, props, { absolute: false });\n\n    var containerId = props.containerId;\n    var container = props.container;\n\n    var containerElement = void 0;\n    if (containerId) {\n      containerElement = document.getElementById(containerId);\n    } else if (container && container.nodeType) {\n      containerElement = container;\n    } else {\n      containerElement = document;\n    }\n\n    if (_scrollEvents2.default.registered.begin) {\n      _scrollEvents2.default.registered.begin(to, target);\n    }\n\n    props.absolute = true;\n\n    var scrollOffset = _utils2.default.scrollOffset(containerElement, target) + (props.offset || 0);\n\n    /*\r\n     * if animate is not provided just scroll into the view\r\n     */\n    if (!props.smooth) {\n      if (containerElement === document) {\n        window.scrollTo(0, scrollOffset);\n      } else {\n        containerElement.scrollTop = scrollOffset;\n      }\n\n      if (_scrollEvents2.default.registered['end']) {\n        _scrollEvents2.default.registered['end'](to, target);\n      }\n\n      return;\n    }\n\n    /*\r\n     * Animate scrolling\r\n     */\n\n    _animateScroll2.default.animateTopScroll(scrollOffset, props, to, target);\n  }\n};\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ExportModal = (0, _createReactClass2.default)({\n    displayName: 'ExportModal',\n\n    propTypes: {\n        title: _propTypes2.default.string.isRequired,\n        cancelable: _propTypes2.default.bool,\n        confirmable: _propTypes2.default.bool,\n        confirmText: _propTypes2.default.string,\n        cancelText: _propTypes2.default.string,\n        onClose: _propTypes2.default.func,\n        onConfirm: _propTypes2.default.func,\n        rightButtonClass: _propTypes2.default.string,\n        leftButtonClass: _propTypes2.default.string\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            confirmText: 'Confirm',\n            cancelText: 'Cancel'\n        };\n    },\n    render: function render() {\n        var _props = this.props,\n            onConfirm = _props.onConfirm,\n            onClose = _props.onClose,\n            confirmText = _props.confirmText,\n            cancelText = _props.cancelText,\n            confirmable = _props.confirmable,\n            cancelable = _props.cancelable,\n            children = _props.children,\n            title = _props.title;\n\n        var rightButtonClass = (0, _classnames2.default)('ui-button', this.props.rightButtonClass);\n        var leftButtonClass = (0, _classnames2.default)('ui-button', this.props.leftButtonClass);\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper\" }, _react2.default.createElement(\"div\", { className: \"ui-modal\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, title), _react2.default.createElement(\"button\", { className: \"ui-modal__close\", onClick: onClose, \"aria-label\": \"Close modal\" })), _react2.default.createElement(\"div\", { className: \"ui-modal__content export_report\" }, children), (cancelable || confirmable) && _react2.default.createElement(\"div\", { className: \"ui-modal__footer\" }, cancelable && _react2.default.createElement(\"button\", { className: leftButtonClass, onClick: onClose }, cancelText), _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, confirmable && _react2.default.createElement(\"button\", { className: rightButtonClass, onClick: onConfirm }, confirmText)))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n    }\n});\nexports.default = ExportModal;\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar PATH = exports.PATH = {\n    VECTOR: 0,\n    BEZIER_CURVE: 1,\n    CIRCLE: 2\n};\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Util = __webpack_require__(168);\n\nvar _background = __webpack_require__(226);\n\nvar _border = __webpack_require__(320);\n\nvar _borderRadius = __webpack_require__(1526);\n\nvar _display = __webpack_require__(1527);\n\nvar _float = __webpack_require__(1528);\n\nvar _font = __webpack_require__(1529);\n\nvar _letterSpacing = __webpack_require__(1530);\n\nvar _overflow = __webpack_require__(1531);\n\nvar _padding = __webpack_require__(670);\n\nvar _position = __webpack_require__(671);\n\nvar _textDecoration = __webpack_require__(319);\n\nvar _textShadow = __webpack_require__(1532);\n\nvar _textTransform = __webpack_require__(672);\n\nvar _transform = __webpack_require__(1533);\n\nvar _visibility = __webpack_require__(1534);\n\nvar _zIndex = __webpack_require__(1535);\n\nvar _Bounds = __webpack_require__(93);\n\nvar _Input = __webpack_require__(673);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\n\nvar NodeContainer = function () {\n    function NodeContainer(node, parent, resourceLoader, index) {\n        var _this = this;\n\n        _classCallCheck(this, NodeContainer);\n\n        this.parent = parent;\n        this.index = index;\n        this.childNodes = [];\n        var defaultView = node.ownerDocument.defaultView;\n        var scrollX = defaultView.pageXOffset;\n        var scrollY = defaultView.pageYOffset;\n        var style = defaultView.getComputedStyle(node, null);\n        var display = (0, _display.parseDisplay)(style.display);\n\n        var IS_INPUT = node.type === 'radio' || node.type === 'checkbox';\n\n        var position = (0, _position.parsePosition)(style.position);\n\n        this.style = {\n            background: IS_INPUT ? _Input.INPUT_BACKGROUND : (0, _background.parseBackground)(style, resourceLoader),\n            border: IS_INPUT ? _Input.INPUT_BORDERS : (0, _border.parseBorder)(style),\n            borderRadius: (node instanceof defaultView.HTMLInputElement || node instanceof HTMLInputElement) && IS_INPUT ? (0, _Input.getInputBorderRadius)(node) : (0, _borderRadius.parseBorderRadius)(style),\n            color: IS_INPUT ? _Input.INPUT_COLOR : new _Color2.default(style.color),\n            display: display,\n            float: (0, _float.parseCSSFloat)(style.float),\n            font: (0, _font.parseFont)(style),\n            letterSpacing: (0, _letterSpacing.parseLetterSpacing)(style.letterSpacing),\n            opacity: parseFloat(style.opacity),\n            overflow: INPUT_TAGS.indexOf(node.tagName) === -1 ? (0, _overflow.parseOverflow)(style.overflow) : _overflow.OVERFLOW.HIDDEN,\n            padding: (0, _padding.parsePadding)(style),\n            position: position,\n            textDecoration: (0, _textDecoration.parseTextDecoration)(style),\n            textShadow: (0, _textShadow.parseTextShadow)(style.textShadow),\n            textTransform: (0, _textTransform.parseTextTransform)(style.textTransform),\n            transform: (0, _transform.parseTransform)(style),\n            visibility: (0, _visibility.parseVisibility)(style.visibility),\n            zIndex: (0, _zIndex.parseZIndex)(position !== _position.POSITION.STATIC ? style.zIndex : 'auto')\n        };\n\n        if (this.isTransformed()) {\n            // getBoundingClientRect provides values post-transform, we want them without the transformation\n            node.style.transform = 'matrix(1,0,0,1,0,0)';\n        }\n\n        // TODO move bound retrieval for all nodes to a later stage?\n        if (node.tagName === 'IMG') {\n            node.addEventListener('load', function () {\n                _this.bounds = (0, _Bounds.parseBounds)(node, scrollX, scrollY);\n                _this.curvedBounds = (0, _Bounds.parseBoundCurves)(_this.bounds, _this.style.border, _this.style.borderRadius);\n            });\n        }\n        this.image = getImage(node, resourceLoader);\n        this.bounds = IS_INPUT ? (0, _Input.reformatInputBounds)((0, _Bounds.parseBounds)(node, scrollX, scrollY)) : (0, _Bounds.parseBounds)(node, scrollX, scrollY);\n        this.curvedBounds = (0, _Bounds.parseBoundCurves)(this.bounds, this.style.border, this.style.borderRadius);\n\n        if (false) {\n            this.name = '' + node.tagName.toLowerCase() + (node.id ? '#' + node.id : '') + node.className.toString().split(' ').map(function (s) {\n                return s.length ? '.' + s : '';\n            }).join('');\n        }\n    }\n\n    _createClass(NodeContainer, [{\n        key: 'getClipPaths',\n        value: function getClipPaths() {\n            var parentClips = this.parent ? this.parent.getClipPaths() : [];\n            var isClipped = this.style.overflow === _overflow.OVERFLOW.HIDDEN || this.style.overflow === _overflow.OVERFLOW.SCROLL;\n\n            return isClipped ? parentClips.concat([(0, _Bounds.calculatePaddingBoxPath)(this.curvedBounds)]) : parentClips;\n        }\n    }, {\n        key: 'isInFlow',\n        value: function isInFlow() {\n            return this.isRootElement() && !this.isFloating() && !this.isAbsolutelyPositioned();\n        }\n    }, {\n        key: 'isVisible',\n        value: function isVisible() {\n            return !(0, _Util.contains)(this.style.display, _display.DISPLAY.NONE) && this.style.opacity > 0 && this.style.visibility === _visibility.VISIBILITY.VISIBLE;\n        }\n    }, {\n        key: 'isAbsolutelyPositioned',\n        value: function isAbsolutelyPositioned() {\n            return this.style.position !== _position.POSITION.STATIC && this.style.position !== _position.POSITION.RELATIVE;\n        }\n    }, {\n        key: 'isPositioned',\n        value: function isPositioned() {\n            return this.style.position !== _position.POSITION.STATIC;\n        }\n    }, {\n        key: 'isFloating',\n        value: function isFloating() {\n            return this.style.float !== _float.FLOAT.NONE;\n        }\n    }, {\n        key: 'isRootElement',\n        value: function isRootElement() {\n            return this.parent === null;\n        }\n    }, {\n        key: 'isTransformed',\n        value: function isTransformed() {\n            return this.style.transform !== null;\n        }\n    }, {\n        key: 'isPositionedWithZIndex',\n        value: function isPositionedWithZIndex() {\n            return this.isPositioned() && !this.style.zIndex.auto;\n        }\n    }, {\n        key: 'isInlineLevel',\n        value: function isInlineLevel() {\n            return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_FLEX) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_GRID) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_LIST_ITEM) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE);\n        }\n    }, {\n        key: 'isInlineBlockOrInlineTable',\n        value: function isInlineBlockOrInlineTable() {\n            return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE);\n        }\n    }]);\n\n    return NodeContainer;\n}();\n\nexports.default = NodeContainer;\n\n\nvar getImage = function getImage(node, resourceLoader) {\n    if (node instanceof node.ownerDocument.defaultView.SVGSVGElement || node instanceof SVGSVGElement) {\n        var s = new XMLSerializer();\n        return resourceLoader.loadImage('data:image/svg+xml,' + encodeURIComponent(s.serializeToString(node)));\n    }\n    switch (node.tagName) {\n        case 'IMG':\n            // $FlowFixMe\n            var img = node;\n            return resourceLoader.loadImage(img.currentSrc || img.src);\n        case 'CANVAS':\n            // $FlowFixMe\n            var canvas = node;\n            return resourceLoader.loadCanvas(canvas);\n        case 'IFRAME':\n            var iframeKey = node.getAttribute('data-html2canvas-internal-iframe-key');\n            if (iframeKey) {\n                return iframeKey;\n            }\n            break;\n    }\n\n    return null;\n};\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBackgroundImage = exports.parseBackground = exports.calculateBackgroundRepeatPath = exports.calculateBackgroundPosition = exports.calculateBackgroungPositioningArea = exports.calculateBackgroungPaintingArea = exports.calculateGradientBackgroundSize = exports.calculateBackgroundSize = exports.BACKGROUND_ORIGIN = exports.BACKGROUND_CLIP = exports.BACKGROUND_SIZE = exports.BACKGROUND_REPEAT = undefined;\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Size = __webpack_require__(1524);\n\nvar _Size2 = _interopRequireDefault(_Size);\n\nvar _Vector = __webpack_require__(227);\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _Bounds = __webpack_require__(93);\n\nvar _padding = __webpack_require__(670);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar BACKGROUND_REPEAT = exports.BACKGROUND_REPEAT = {\n    REPEAT: 0,\n    NO_REPEAT: 1,\n    REPEAT_X: 2,\n    REPEAT_Y: 3\n};\n\nvar BACKGROUND_SIZE = exports.BACKGROUND_SIZE = {\n    AUTO: 0,\n    CONTAIN: 1,\n    COVER: 2,\n    LENGTH: 3\n};\n\nvar BACKGROUND_CLIP = exports.BACKGROUND_CLIP = {\n    BORDER_BOX: 0,\n    PADDING_BOX: 1,\n    CONTENT_BOX: 2\n};\n\nvar BACKGROUND_ORIGIN = exports.BACKGROUND_ORIGIN = BACKGROUND_CLIP;\n\nvar AUTO = 'auto';\n\nvar BackgroundSize = function BackgroundSize(size) {\n    _classCallCheck(this, BackgroundSize);\n\n    switch (size) {\n        case 'contain':\n            this.size = BACKGROUND_SIZE.CONTAIN;\n            break;\n        case 'cover':\n            this.size = BACKGROUND_SIZE.COVER;\n            break;\n        case 'auto':\n            this.size = BACKGROUND_SIZE.AUTO;\n            break;\n        default:\n            this.value = new _Length2.default(size);\n    }\n};\n\nvar calculateBackgroundSize = exports.calculateBackgroundSize = function calculateBackgroundSize(backgroundImage, image, bounds) {\n    var width = 0;\n    var height = 0;\n    var size = backgroundImage.size;\n    if (size[0].size === BACKGROUND_SIZE.CONTAIN || size[0].size === BACKGROUND_SIZE.COVER) {\n        var targetRatio = bounds.width / bounds.height;\n        var currentRatio = image.width / image.height;\n        return targetRatio < currentRatio !== (size[0].size === BACKGROUND_SIZE.COVER) ? new _Size2.default(bounds.width, bounds.width / currentRatio) : new _Size2.default(bounds.height * currentRatio, bounds.height);\n    }\n\n    if (size[0].value) {\n        width = size[0].value.getAbsoluteValue(bounds.width);\n    }\n\n    if (size[0].size === BACKGROUND_SIZE.AUTO && size[1].size === BACKGROUND_SIZE.AUTO) {\n        height = image.height;\n    } else if (size[1].size === BACKGROUND_SIZE.AUTO) {\n        height = width / image.width * image.height;\n    } else if (size[1].value) {\n        height = size[1].value.getAbsoluteValue(bounds.height);\n    }\n\n    if (size[0].size === BACKGROUND_SIZE.AUTO) {\n        width = height / image.height * image.width;\n    }\n\n    return new _Size2.default(width, height);\n};\n\nvar calculateGradientBackgroundSize = exports.calculateGradientBackgroundSize = function calculateGradientBackgroundSize(backgroundImage, bounds) {\n    var size = backgroundImage.size;\n    var width = size[0].value ? size[0].value.getAbsoluteValue(bounds.width) : bounds.width;\n    var height = size[1].value ? size[1].value.getAbsoluteValue(bounds.height) : size[0].value ? width : bounds.height;\n\n    return new _Size2.default(width, height);\n};\n\nvar AUTO_SIZE = new BackgroundSize(AUTO);\n\nvar calculateBackgroungPaintingArea = exports.calculateBackgroungPaintingArea = function calculateBackgroungPaintingArea(curves, clip) {\n    switch (clip) {\n        case BACKGROUND_CLIP.BORDER_BOX:\n            return (0, _Bounds.calculateBorderBoxPath)(curves);\n        case BACKGROUND_CLIP.PADDING_BOX:\n        default:\n            return (0, _Bounds.calculatePaddingBoxPath)(curves);\n    }\n};\n\nvar calculateBackgroungPositioningArea = exports.calculateBackgroungPositioningArea = function calculateBackgroungPositioningArea(backgroundOrigin, bounds, padding, border) {\n    var paddingBox = (0, _Bounds.calculatePaddingBox)(bounds, border);\n\n    switch (backgroundOrigin) {\n        case BACKGROUND_ORIGIN.BORDER_BOX:\n            return bounds;\n        case BACKGROUND_ORIGIN.CONTENT_BOX:\n            var paddingLeft = padding[_padding.PADDING_SIDES.LEFT].getAbsoluteValue(bounds.width);\n            var paddingRight = padding[_padding.PADDING_SIDES.RIGHT].getAbsoluteValue(bounds.width);\n            var paddingTop = padding[_padding.PADDING_SIDES.TOP].getAbsoluteValue(bounds.width);\n            var paddingBottom = padding[_padding.PADDING_SIDES.BOTTOM].getAbsoluteValue(bounds.width);\n            return new _Bounds.Bounds(paddingBox.left + paddingLeft, paddingBox.top + paddingTop, paddingBox.width - paddingLeft - paddingRight, paddingBox.height - paddingTop - paddingBottom);\n        case BACKGROUND_ORIGIN.PADDING_BOX:\n        default:\n            return paddingBox;\n    }\n};\n\nvar calculateBackgroundPosition = exports.calculateBackgroundPosition = function calculateBackgroundPosition(position, size, bounds) {\n    return new _Vector2.default(position[0].getAbsoluteValue(bounds.width - size.width), position[1].getAbsoluteValue(bounds.height - size.height));\n};\n\nvar calculateBackgroundRepeatPath = exports.calculateBackgroundRepeatPath = function calculateBackgroundRepeatPath(background, position, size, backgroundPositioningArea, bounds) {\n    var repeat = background.repeat;\n    switch (repeat) {\n        case BACKGROUND_REPEAT.REPEAT_X:\n            return [new _Vector2.default(Math.round(bounds.left), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(size.height + backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left), Math.round(size.height + backgroundPositioningArea.top + position.y))];\n        case BACKGROUND_REPEAT.REPEAT_Y:\n            return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.height + bounds.top))];\n        case BACKGROUND_REPEAT.NO_REPEAT:\n            return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y + size.height)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y + size.height))];\n        default:\n            return [new _Vector2.default(Math.round(bounds.left), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(bounds.left), Math.round(bounds.height + bounds.top))];\n    }\n};\n\nvar parseBackground = exports.parseBackground = function parseBackground(style, resourceLoader) {\n    return {\n        backgroundColor: new _Color2.default(style.backgroundColor),\n        backgroundImage: parseBackgroundImages(style, resourceLoader),\n        backgroundClip: parseBackgroundClip(style.backgroundClip),\n        backgroundOrigin: parseBackgroundOrigin(style.backgroundOrigin)\n    };\n};\n\nvar parseBackgroundClip = function parseBackgroundClip(backgroundClip) {\n    switch (backgroundClip) {\n        case 'padding-box':\n            return BACKGROUND_CLIP.PADDING_BOX;\n        case 'content-box':\n            return BACKGROUND_CLIP.CONTENT_BOX;\n    }\n    return BACKGROUND_CLIP.BORDER_BOX;\n};\n\nvar parseBackgroundOrigin = function parseBackgroundOrigin(backgroundOrigin) {\n    switch (backgroundOrigin) {\n        case 'padding-box':\n            return BACKGROUND_ORIGIN.PADDING_BOX;\n        case 'content-box':\n            return BACKGROUND_ORIGIN.CONTENT_BOX;\n    }\n    return BACKGROUND_ORIGIN.BORDER_BOX;\n};\n\nvar parseBackgroundRepeat = function parseBackgroundRepeat(backgroundRepeat) {\n    switch (backgroundRepeat.trim()) {\n        case 'no-repeat':\n            return BACKGROUND_REPEAT.NO_REPEAT;\n        case 'repeat-x':\n        case 'repeat no-repeat':\n            return BACKGROUND_REPEAT.REPEAT_X;\n        case 'repeat-y':\n        case 'no-repeat repeat':\n            return BACKGROUND_REPEAT.REPEAT_Y;\n        case 'repeat':\n            return BACKGROUND_REPEAT.REPEAT;\n    }\n\n    if (false) {\n        console.error('Invalid background-repeat value \"' + backgroundRepeat + '\"');\n    }\n\n    return BACKGROUND_REPEAT.REPEAT;\n};\n\nvar parseBackgroundImages = function parseBackgroundImages(style, resourceLoader) {\n    var sources = parseBackgroundImage(style.backgroundImage).map(function (backgroundImage) {\n        if (backgroundImage.method === 'url') {\n            var key = resourceLoader.loadImage(backgroundImage.args[0]);\n            backgroundImage.args = key ? [key] : [];\n        }\n        return backgroundImage;\n    });\n    var positions = style.backgroundPosition.split(',');\n    var repeats = style.backgroundRepeat.split(',');\n    var sizes = style.backgroundSize.split(',');\n\n    return sources.map(function (source, index) {\n        var size = (sizes[index] || AUTO).trim().split(' ').map(parseBackgroundSize);\n        var position = (positions[index] || AUTO).trim().split(' ').map(parseBackgoundPosition);\n\n        return {\n            source: source,\n            repeat: parseBackgroundRepeat(typeof repeats[index] === 'string' ? repeats[index] : repeats[0]),\n            size: size.length < 2 ? [size[0], AUTO_SIZE] : [size[0], size[1]],\n            position: position.length < 2 ? [position[0], position[0]] : [position[0], position[1]]\n        };\n    });\n};\n\nvar parseBackgroundSize = function parseBackgroundSize(size) {\n    return size === 'auto' ? AUTO_SIZE : new BackgroundSize(size);\n};\n\nvar parseBackgoundPosition = function parseBackgoundPosition(position) {\n    switch (position) {\n        case 'bottom':\n        case 'right':\n            return new _Length2.default('100%');\n        case 'left':\n        case 'top':\n            return new _Length2.default('0%');\n        case 'auto':\n            return new _Length2.default('0');\n    }\n    return new _Length2.default(position);\n};\n\nvar parseBackgroundImage = exports.parseBackgroundImage = function parseBackgroundImage(image) {\n    var whitespace = /^\\s$/;\n    var results = [];\n\n    var args = [];\n    var method = '';\n    var quote = null;\n    var definition = '';\n    var mode = 0;\n    var numParen = 0;\n\n    var appendResult = function appendResult() {\n        var prefix = '';\n        if (method) {\n            if (definition.substr(0, 1) === '\"') {\n                definition = definition.substr(1, definition.length - 2);\n            }\n\n            if (definition) {\n                args.push(definition.trim());\n            }\n\n            var prefix_i = method.indexOf('-', 1) + 1;\n            if (method.substr(0, 1) === '-' && prefix_i > 0) {\n                prefix = method.substr(0, prefix_i).toLowerCase();\n                method = method.substr(prefix_i);\n            }\n            method = method.toLowerCase();\n            if (method !== 'none') {\n                results.push({\n                    prefix: prefix,\n                    method: method,\n                    args: args\n                });\n            }\n        }\n        args = [];\n        method = definition = '';\n    };\n\n    image.split('').forEach(function (c) {\n        if (mode === 0 && whitespace.test(c)) {\n            return;\n        }\n        switch (c) {\n            case '\"':\n                if (!quote) {\n                    quote = c;\n                } else if (quote === c) {\n                    quote = null;\n                }\n                break;\n            case '(':\n                if (quote) {\n                    break;\n                } else if (mode === 0) {\n                    mode = 1;\n                    return;\n                } else {\n                    numParen++;\n                }\n                break;\n            case ')':\n                if (quote) {\n                    break;\n                } else if (mode === 1) {\n                    if (numParen === 0) {\n                        mode = 0;\n                        appendResult();\n                        return;\n                    } else {\n                        numParen--;\n                    }\n                }\n                break;\n\n            case ',':\n                if (quote) {\n                    break;\n                } else if (mode === 0) {\n                    appendResult();\n                    return;\n                } else if (mode === 1) {\n                    if (numParen === 0 && !method.match(/^url$/i)) {\n                        args.push(definition.trim());\n                        definition = '';\n                        return;\n                    }\n                }\n                break;\n        }\n\n        if (mode === 0) {\n            method += c;\n        } else {\n            definition += c;\n        }\n    });\n\n    appendResult();\n    return results;\n};\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _Path = __webpack_require__(224);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Vector = function Vector(x, y) {\n    _classCallCheck(this, Vector);\n\n    this.type = _Path.PATH.VECTOR;\n    this.x = x;\n    this.y = y;\n    if (false) {\n        if (isNaN(x)) {\n            console.error('Invalid x value given for Vector');\n        }\n        if (isNaN(y)) {\n            console.error('Invalid y value given for Vector');\n        }\n    }\n};\n\nexports.default = Vector;\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _ForeignObjectRenderer = __webpack_require__(675);\n\nvar testRangeBounds = function testRangeBounds(document) {\n    var TEST_HEIGHT = 123;\n\n    if (document.createRange) {\n        var range = document.createRange();\n        if (range.getBoundingClientRect) {\n            var testElement = document.createElement('boundtest');\n            testElement.style.height = TEST_HEIGHT + 'px';\n            testElement.style.display = 'block';\n            document.body.appendChild(testElement);\n\n            range.selectNode(testElement);\n            var rangeBounds = range.getBoundingClientRect();\n            var rangeHeight = Math.round(rangeBounds.height);\n            document.body.removeChild(testElement);\n            if (rangeHeight === TEST_HEIGHT) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n};\n\n// iOS 10.3 taints canvas with base64 images unless crossOrigin = 'anonymous'\nvar testBase64 = function testBase64(document, src) {\n    var img = new Image();\n    var canvas = document.createElement('canvas');\n    var ctx = canvas.getContext('2d');\n\n    return new Promise(function (resolve) {\n        // Single pixel base64 image renders fine on iOS 10.3???\n        img.src = src;\n\n        var onload = function onload() {\n            try {\n                ctx.drawImage(img, 0, 0);\n                canvas.toDataURL();\n            } catch (e) {\n                return resolve(false);\n            }\n\n            return resolve(true);\n        };\n\n        img.onload = onload;\n        img.onerror = function () {\n            return resolve(false);\n        };\n\n        if (img.complete === true) {\n            setTimeout(function () {\n                onload();\n            }, 500);\n        }\n    });\n};\n\nvar testCORS = function testCORS() {\n    return typeof new Image().crossOrigin !== 'undefined';\n};\n\nvar testResponseType = function testResponseType() {\n    return typeof new XMLHttpRequest().responseType === 'string';\n};\n\nvar testSVG = function testSVG(document) {\n    var img = new Image();\n    var canvas = document.createElement('canvas');\n    var ctx = canvas.getContext('2d');\n    img.src = 'data:image/svg+xml,<svg xmlns=\\'http://www.w3.org/2000/svg\\'></svg>';\n\n    try {\n        ctx.drawImage(img, 0, 0);\n        canvas.toDataURL();\n    } catch (e) {\n        return false;\n    }\n    return true;\n};\n\nvar isGreenPixel = function isGreenPixel(data) {\n    return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;\n};\n\nvar testForeignObject = function testForeignObject(document) {\n    var canvas = document.createElement('canvas');\n    var size = 100;\n    canvas.width = size;\n    canvas.height = size;\n    var ctx = canvas.getContext('2d');\n    ctx.fillStyle = 'rgb(0, 255, 0)';\n    ctx.fillRect(0, 0, size, size);\n\n    var img = new Image();\n    var greenImageSrc = canvas.toDataURL();\n    img.src = greenImageSrc;\n    var svg = (0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, img);\n    ctx.fillStyle = 'red';\n    ctx.fillRect(0, 0, size, size);\n\n    return (0, _ForeignObjectRenderer.loadSerializedSVG)(svg).then(function (img) {\n        ctx.drawImage(img, 0, 0);\n        var data = ctx.getImageData(0, 0, size, size).data;\n        ctx.fillStyle = 'red';\n        ctx.fillRect(0, 0, size, size);\n\n        var node = document.createElement('div');\n        node.style.backgroundImage = 'url(' + greenImageSrc + ')';\n        node.style.height = size + 'px';\n        // Firefox 55 does not render inline <img /> tags\n        return isGreenPixel(data) ? (0, _ForeignObjectRenderer.loadSerializedSVG)((0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, node)) : Promise.reject(false);\n    }).then(function (img) {\n        ctx.drawImage(img, 0, 0);\n        // Edge does not render background-images\n        return isGreenPixel(ctx.getImageData(0, 0, size, size).data);\n    }).catch(function (e) {\n        return false;\n    });\n};\n\nvar FEATURES = {\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_RANGE_BOUNDS() {\n        'use strict';\n\n        var value = testRangeBounds(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_SVG_DRAWING() {\n        'use strict';\n\n        var value = testSVG(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_BASE64_DRAWING() {\n        'use strict';\n\n        return function (src) {\n            var _value = testBase64(document, src);\n            Object.defineProperty(FEATURES, 'SUPPORT_BASE64_DRAWING', { value: function value() {\n                    return _value;\n                } });\n            return _value;\n        };\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_FOREIGNOBJECT_DRAWING() {\n        'use strict';\n\n        var value = typeof Array.from === 'function' && typeof window.fetch === 'function' ? testForeignObject(document) : Promise.resolve(false);\n        Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_CORS_IMAGES() {\n        'use strict';\n\n        var value = testCORS();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_RESPONSE_TYPE() {\n        'use strict';\n\n        var value = testResponseType();\n        Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_CORS_XHR() {\n        'use strict';\n\n        var value = 'withCredentials' in new XMLHttpRequest();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });\n        return value;\n    }\n};\n\nexports.default = FEATURES;\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(58);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(108);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(66);\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(67);\nvar defined = __webpack_require__(74);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(20);\nvar cof = __webpack_require__(66);\nvar MATCH = __webpack_require__(23)('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(23)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar classof = __webpack_require__(131);\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n  return builtinExec.call(R, S);\n};\n\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n__webpack_require__(705);\nvar redefine = __webpack_require__(50);\nvar hide = __webpack_require__(49);\nvar fails = __webpack_require__(19);\nvar defined = __webpack_require__(74);\nvar wks = __webpack_require__(23);\nvar regexpExec = __webpack_require__(345);\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(\n      defined,\n      SYMBOL,\n      ''[KEY],\n      function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n        if (regexp.exec === regexpExec) {\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n            // The native String method already delegates to @@method (this\n            // polyfilled function), leasing to infinite recursion.\n            // We avoid it by directly calling the native @@method method.\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n          }\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n        }\n        return { done: false };\n      }\n    );\n    var strfn = fns[0];\n    var rxfn = fns[1];\n\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(16);\nvar $export = __webpack_require__(4);\nvar redefine = __webpack_require__(50);\nvar redefineAll = __webpack_require__(114);\nvar meta = __webpack_require__(95);\nvar forOf = __webpack_require__(113);\nvar anInstance = __webpack_require__(112);\nvar isObject = __webpack_require__(20);\nvar fails = __webpack_require__(19);\nvar $iterDetect = __webpack_require__(234);\nvar setToStringTag = __webpack_require__(130);\nvar inheritIfRequired = __webpack_require__(331);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar hide = __webpack_require__(49);\nvar uid = __webpack_require__(106);\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n  'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n  if (Typed = global[TypedArrayConstructors[i++]]) {\n    hide(Typed.prototype, TYPED, true);\n    hide(Typed.prototype, VIEW, true);\n  } else CONSTR = false;\n}\n\nmodule.exports = {\n  ABV: ABV,\n  CONSTR: CONSTR,\n  TYPED: TYPED,\n  VIEW: VIEW\n};\n\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Forced replacement prototype accessors methods\nmodule.exports = __webpack_require__(94) || !__webpack_require__(19)(function () {\n  var K = Math.random();\n  // In FF throws only define methods\n  // eslint-disable-next-line no-undef, no-useless-call\n  __defineSetter__.call(null, K, function () { /* empty */ });\n  delete __webpack_require__(16)[K];\n});\n\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = __webpack_require__(4);\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { of: function of() {\n    var length = arguments.length;\n    var A = new Array(length);\n    while (length--) A[length] = arguments[length];\n    return new this(A);\n  } });\n};\n\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = __webpack_require__(4);\nvar aFunction = __webpack_require__(46);\nvar ctx = __webpack_require__(65);\nvar forOf = __webpack_require__(113);\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n    var mapFn = arguments[1];\n    var mapping, A, n, cb;\n    aFunction(this);\n    mapping = mapFn !== undefined;\n    if (mapping) aFunction(mapFn);\n    if (source == undefined) return new this();\n    A = [];\n    if (mapping) {\n      n = 0;\n      cb = ctx(mapFn, arguments[2], 2);\n      forOf(source, false, function (nextItem) {\n        A.push(cb(nextItem, n++));\n      });\n    } else {\n      forOf(source, false, A.push, A);\n    }\n    return new this(A);\n  } });\n};\n\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.__ControlPanelStore = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(98);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ControlPanelStore = function (_BaseStore) {\n  _inherits(ControlPanelStore, _BaseStore);\n\n  function ControlPanelStore() {\n    _classCallCheck(this, ControlPanelStore);\n\n    var _this = _possibleConstructorReturn(this, (ControlPanelStore.__proto__ || Object.getPrototypeOf(ControlPanelStore)).call(this));\n\n    _this.getApps = function () {\n      var selectedApp = _this.getSelectedAppId();\n      var session = _session_store2.default.getSession();\n      var entity = !_this.isOpenGov() ? session && session.entity && session.entity.toJSON() : _this.getSelectedEntity();\n      var isEntitySelected = !!entity;\n\n      var featurePermissions = entity && entity.feature_permissions;\n\n      // we check if ControlPanel is still loading to be sure we do not\n      // show any apps that are behind feature permissions before we\n      // are finished loading\n      var containsPermission = function containsPermission(menuItem) {\n        return !_this.isLoading() && _lodash2.default.contains(featurePermissions, menuItem.requires_feature_permission);\n      };\n\n      var menuItems = _this._menuItems.filter(function (mi) {\n        // if the app is selected, show it...\n        if (mi.id === selectedApp) {\n          return true;\n        }\n\n        // if requires feature permission and entity...\n        if (mi.requires_feature_permission && mi.requires_entity) {\n          return containsPermission(mi) && isEntitySelected; // check both\n        }\n\n        // if requires feature permission...\n        if (mi.requires_feature_permission) {\n          return containsPermission(mi); // check if entity has the permission\n        }\n\n        // if requires entity...\n        if (mi.requires_entity) {\n          return isEntitySelected; // check if an entity is selected\n        }\n\n        // allow the menu item\n        return true;\n      });\n\n      return menuItems.map(function (mi) {\n        return _lodash2.default.assign({}, mi, { entrypoint: _this._computeMIEntrypoint(mi, entity && entity.id) });\n      });\n    };\n\n    _this.getAppEntrypoint = function (app, entityId) {\n      return _this._computeMIEntrypoint(app, entityId);\n    };\n\n    _this._findAppById = function (id) {\n      return _lodash2.default.find(_this._apps, { id: id });\n    };\n\n    _this.getDefaultApp = function () {\n      if (_this._selectedEntity) {\n        return _this._findAppById('reports');\n      }\n\n      return _this._findAppById('portal');\n    };\n\n    _this.getLoadedApp = function () {\n      return _lodash2.default.find(_this._menuItems, { id: _this._loadedApp });\n    };\n\n    _this.getSelectedAppId = function () {\n      return _this._selectedApp;\n    };\n\n    _this.getSelectedEntity = function () {\n      return _this._selectedEntity || _session_store2.default.getEntity();\n    };\n\n    _this.isOpenGov = function () {\n      return _this._isOpenGov;\n    };\n\n    _this.isEntitySwitcherOpen = function () {\n      return _this._entitySwitcherOpen;\n    };\n\n    _this.isEntitySelected = function (id) {\n      return _this._selectedEntity && _this._selectedEntity.id === id;\n    };\n\n    _this.isLoading = function () {\n      return !_session_store2.default.getSession() || _this._entityLoading;\n    };\n\n    _this.isDirty = function () {\n      return _this._isDirty;\n    };\n\n    _this.getLeaveModal = function () {\n      return _this._leaveModal;\n    };\n\n    _this._menuItems = [];\n    _this._loadedApp = null;\n    _this._selectedApp = null;\n    _this._entitySwitcherOpen = false;\n    _this._selectedEntity = null;\n    _this._isOpenGov = false;\n    _this._isDirty = false;\n    _this._leaveModal = null;\n    _this._entityLoading = false;\n\n    _this._onEntityChange = null;\n\n    _this.LEAVE_MODAL_DEFAULTS = {\n      TITLE: 'Are you sure you want to navigate away?',\n      MESSAGE: 'Naviagating away will lose all of your current progress. This will result in no saved progress.'\n    };\n\n    _og_flux.Dispatcher.register(function (payload) {\n      return _this._handleAction(payload.action);\n    });\n    return _this;\n  }\n\n  _createClass(ControlPanelStore, [{\n    key: '_computeMIEntrypoint',\n\n\n    /**\n     * Builds the url for the menu items.\n     * @param  {Object} ui       The menu item\n     * @param  {String} entityId An entity subdomain, which is always the entity for the session\n     * @return {String}          The menu item's URL\n     */\n    value: function _computeMIEntrypoint(ui, entityId) {\n      // The entity in the URL should be selected with the following criteria:\n      // 1. If an entity subdomain is present in the URL (`_selectedEntity`)\n      // 2. If an entity is passed in (which is the current user's entity)\n      // 3. The entity should be 'opengov'\n      var entity = this._selectedEntity && this._selectedEntity.abilities && this._selectedEntity.abilities.switch_to && this._selectedEntity.id || entityId || 'opengov';\n      return _lodash2.default.template(ui.location_template)({ entity: entity });\n    }\n  }, {\n    key: '_loadApp',\n    value: function _loadApp(id) {\n      this._loadedApp = id;\n    }\n  }, {\n    key: '_selectApp',\n    value: function _selectApp(id) {\n      this._selectedApp = id;\n    }\n  }, {\n    key: '_selectEntity',\n    value: function _selectEntity(entity) {\n      if (this._onEntityChange) {\n        this._onEntityChange(entity);\n      }\n      this._selectedEntity = entity;\n      this._entityLoading = false;\n      this.emitChange();\n    }\n  }, {\n    key: '_handleAction',\n    value: function _handleAction(action) {\n      var _this2 = this;\n\n      switch (action.actionType) {\n        case 'CONTROL_PANEL_INITIALIZE':\n          this._loadApp(action.appId);\n          this._selectApp(action.selectedAppId);\n          this._onEntityChange = action.onEntityChange;\n          var leaveModal = action.leaveModal;\n          if (leaveModal) {\n            var isLeaveModalObject = (typeof leaveModal === 'undefined' ? 'undefined' : _typeof(leaveModal)) === 'object';\n            this._leaveModal = {\n              title: isLeaveModalObject ? leaveModal.title : this.LEAVE_MODAL_DEFAULTS.TITLE,\n              message: isLeaveModalObject ? leaveModal.message : this.LEAVE_MODAL_DEFAULTS.MESSAGE\n            };\n          }\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_LOAD_APP':\n          this._loadApp(action.appId);\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_ENTITY_SWITCHER_OPEN':\n          this._entitySwitcherOpen = true;\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE':\n          this._entitySwitcherOpen = false;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_LOADING':\n          this._entityLoading = true;\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_MAKE_DIRTY':\n          this._isDirty = true;\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_MAKE_CLEAN':\n          this._isDirty = false;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_SELECTED':\n          _jquery2.default.getJSON('/api/v1/entities/' + action.entity.entity_id, function (entity) {\n            _this2._selectEntity(entity);\n          });\n          break;\n\n        case 'SESSION_SYNC':\n          var session = action.session;\n\n          this._menuItems = session.get('control_panel_menu_items');\n\n          if (!this._selectedEntity && !this._isOpenGov && session.entity) {\n            if (session.entity.isGlobal()) {\n              this._isOpenGov = true;\n            } else {\n              // For entity users when we sync their session,\n              // automatically select the entity they belong to.\n              this._selectedEntity = session.entity.toJSON();\n            }\n          }\n\n          this.emitChange();\n          break;\n\n        default:\n        // do nothing\n      }\n    }\n  }]);\n\n  return ControlPanelStore;\n}(_og_flux.BaseStore);\n\nexports.default = new ControlPanelStore();\nvar __ControlPanelStore = exports.__ControlPanelStore = ControlPanelStore;\n\n/***/ }),\n/* 244 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (immutable) */ __webpack_exports__[\"default\"] = _;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return VERSION; });\n/* harmony export (immutable) */ __webpack_exports__[\"iteratee\"] = iteratee;\n/* harmony export (immutable) */ __webpack_exports__[\"restArguments\"] = restArguments;\n/* harmony export (immutable) */ __webpack_exports__[\"each\"] = each;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forEach\", function() { return each; });\n/* harmony export (immutable) */ __webpack_exports__[\"map\"] = map;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"collect\", function() { return map; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reduce\", function() { return reduce; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"foldl\", function() { return reduce; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"inject\", function() { return reduce; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reduceRight\", function() { return reduceRight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"foldr\", function() { return reduceRight; });\n/* harmony export (immutable) */ __webpack_exports__[\"find\"] = find;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"detect\", function() { return find; });\n/* harmony export (immutable) */ __webpack_exports__[\"filter\"] = filter;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return filter; });\n/* harmony export (immutable) */ __webpack_exports__[\"reject\"] = reject;\n/* harmony export (immutable) */ __webpack_exports__[\"every\"] = every;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"all\", function() { return every; });\n/* harmony export (immutable) */ __webpack_exports__[\"some\"] = some;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"any\", function() { return some; });\n/* harmony export (immutable) */ __webpack_exports__[\"contains\"] = contains;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"includes\", function() { return contains; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"include\", function() { return contains; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"invoke\", function() { return invoke; });\n/* harmony export (immutable) */ __webpack_exports__[\"pluck\"] = pluck;\n/* harmony export (immutable) */ __webpack_exports__[\"where\"] = where;\n/* harmony export (immutable) */ __webpack_exports__[\"findWhere\"] = findWhere;\n/* harmony export (immutable) */ __webpack_exports__[\"max\"] = max;\n/* harmony export (immutable) */ __webpack_exports__[\"min\"] = min;\n/* harmony export (immutable) */ __webpack_exports__[\"shuffle\"] = shuffle;\n/* harmony export (immutable) */ __webpack_exports__[\"sample\"] = sample;\n/* harmony export (immutable) */ __webpack_exports__[\"sortBy\"] = sortBy;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"groupBy\", function() { return groupBy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"indexBy\", function() { return indexBy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"countBy\", function() { return countBy; });\n/* harmony export (immutable) */ __webpack_exports__[\"toArray\"] = toArray;\n/* harmony export (immutable) */ __webpack_exports__[\"size\"] = size;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"partition\", function() { return partition; });\n/* harmony export (immutable) */ __webpack_exports__[\"first\"] = first;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"head\", function() { return first; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"take\", function() { return first; });\n/* harmony export (immutable) */ __webpack_exports__[\"initial\"] = initial;\n/* harmony export (immutable) */ __webpack_exports__[\"last\"] = last;\n/* harmony export (immutable) */ __webpack_exports__[\"rest\"] = rest;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tail\", function() { return rest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"drop\", function() { return rest; });\n/* harmony export (immutable) */ __webpack_exports__[\"compact\"] = compact;\n/* harmony export (immutable) */ __webpack_exports__[\"flatten\"] = flatten;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"without\", function() { return without; });\n/* harmony export (immutable) */ __webpack_exports__[\"uniq\"] = uniq;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return uniq; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"union\", function() { return union; });\n/* harmony export (immutable) */ __webpack_exports__[\"intersection\"] = intersection;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"difference\", function() { return difference; });\n/* harmony export (immutable) */ __webpack_exports__[\"unzip\"] = unzip;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return zip; });\n/* harmony export (immutable) */ __webpack_exports__[\"object\"] = object;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"findIndex\", function() { return findIndex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"findLastIndex\", function() { return findLastIndex; });\n/* harmony export (immutable) */ __webpack_exports__[\"sortedIndex\"] = sortedIndex;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return indexOf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lastIndexOf\", function() { return lastIndexOf; });\n/* harmony export (immutable) */ __webpack_exports__[\"range\"] = range;\n/* harmony export (immutable) */ __webpack_exports__[\"chunk\"] = chunk;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bind\", function() { return bind; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"partial\", function() { return partial; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindAll\", function() { return bindAll; });\n/* harmony export (immutable) */ __webpack_exports__[\"memoize\"] = memoize;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"delay\", function() { return delay; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defer\", function() { return defer; });\n/* harmony export (immutable) */ __webpack_exports__[\"throttle\"] = throttle;\n/* harmony export (immutable) */ __webpack_exports__[\"debounce\"] = debounce;\n/* harmony export (immutable) */ __webpack_exports__[\"wrap\"] = wrap;\n/* harmony export (immutable) */ __webpack_exports__[\"negate\"] = negate;\n/* harmony export (immutable) */ __webpack_exports__[\"compose\"] = compose;\n/* harmony export (immutable) */ __webpack_exports__[\"after\"] = after;\n/* harmony export (immutable) */ __webpack_exports__[\"before\"] = before;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"once\", function() { return once; });\n/* harmony export (immutable) */ __webpack_exports__[\"keys\"] = keys;\n/* harmony export (immutable) */ __webpack_exports__[\"allKeys\"] = allKeys;\n/* harmony export (immutable) */ __webpack_exports__[\"values\"] = values;\n/* harmony export (immutable) */ __webpack_exports__[\"mapObject\"] = mapObject;\n/* harmony export (immutable) */ __webpack_exports__[\"pairs\"] = pairs;\n/* harmony export (immutable) */ __webpack_exports__[\"invert\"] = invert;\n/* harmony export (immutable) */ __webpack_exports__[\"functions\"] = functions;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"methods\", function() { return functions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return extend; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"extendOwn\", function() { return extendOwn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"assign\", function() { return extendOwn; });\n/* harmony export (immutable) */ __webpack_exports__[\"findKey\"] = findKey;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pick\", function() { return pick; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"omit\", function() { return omit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return defaults; });\n/* harmony export (immutable) */ __webpack_exports__[\"create\"] = create;\n/* harmony export (immutable) */ __webpack_exports__[\"clone\"] = clone;\n/* harmony export (immutable) */ __webpack_exports__[\"tap\"] = tap;\n/* harmony export (immutable) */ __webpack_exports__[\"isMatch\"] = isMatch;\n/* harmony export (immutable) */ __webpack_exports__[\"isEqual\"] = isEqual;\n/* harmony export (immutable) */ __webpack_exports__[\"isEmpty\"] = isEmpty;\n/* harmony export (immutable) */ __webpack_exports__[\"isElement\"] = isElement;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return isArray; });\n/* harmony export (immutable) */ __webpack_exports__[\"isObject\"] = isObject;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isArguments\", function() { return isArguments; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return isFunction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return isString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return isNumber; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return isDate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return isRegExp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isError\", function() { return isError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSymbol\", function() { return isSymbol; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isMap\", function() { return isMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isWeakMap\", function() { return isWeakMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isSet\", function() { return isSet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isWeakSet\", function() { return isWeakSet; });\n/* harmony export (immutable) */ __webpack_exports__[\"isFinite\"] = isFinite;\n/* harmony export (immutable) */ __webpack_exports__[\"isNaN\"] = isNaN;\n/* harmony export (immutable) */ __webpack_exports__[\"isBoolean\"] = isBoolean;\n/* harmony export (immutable) */ __webpack_exports__[\"isNull\"] = isNull;\n/* harmony export (immutable) */ __webpack_exports__[\"isUndefined\"] = isUndefined;\n/* harmony export (immutable) */ __webpack_exports__[\"has\"] = has;\n/* harmony export (immutable) */ __webpack_exports__[\"identity\"] = identity;\n/* harmony export (immutable) */ __webpack_exports__[\"constant\"] = constant;\n/* harmony export (immutable) */ __webpack_exports__[\"noop\"] = noop;\n/* harmony export (immutable) */ __webpack_exports__[\"property\"] = property;\n/* harmony export (immutable) */ __webpack_exports__[\"propertyOf\"] = propertyOf;\n/* harmony export (immutable) */ __webpack_exports__[\"matcher\"] = matcher;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"matches\", function() { return matcher; });\n/* harmony export (immutable) */ __webpack_exports__[\"times\"] = times;\n/* harmony export (immutable) */ __webpack_exports__[\"random\"] = random;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"now\", function() { return now; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"escape\", function() { return escape; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unescape\", function() { return unescape; });\n/* harmony export (immutable) */ __webpack_exports__[\"result\"] = result;\n/* harmony export (immutable) */ __webpack_exports__[\"uniqueId\"] = uniqueId;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"templateSettings\", function() { return templateSettings; });\n/* harmony export (immutable) */ __webpack_exports__[\"template\"] = template;\n/* harmony export (immutable) */ __webpack_exports__[\"chain\"] = chain;\n/* harmony export (immutable) */ __webpack_exports__[\"mixin\"] = mixin;\n//     Underscore.js 1.10.2\n//     https://underscorejs.org\n//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n// Baseline setup\n// --------------\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = typeof self == 'object' && self.self === self && self ||\n          typeof global == 'object' && global.global === global && global ||\n          Function('return this')() ||\n          {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n    slice = ArrayProto.slice,\n    toString = ObjProto.toString,\n    hasOwnProperty = ObjProto.hasOwnProperty;\n\n// All **ECMAScript 5** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n    nativeKeys = Object.keys,\n    nativeCreate = Object.create;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = root.isNaN,\n    _isFinite = root.isFinite;\n\n// Naked function reference for surrogate-prototype-swapping.\nvar Ctor = function(){};\n\n// The Underscore object. All exported functions below are added to it in the\n// modules/index-all.js using the mixin function.\nfunction _(obj) {\n  if (obj instanceof _) return obj;\n  if (!(this instanceof _)) return new _(obj);\n  this._wrapped = obj;\n}\n\n// Current version.\nvar VERSION = _.VERSION = '1.10.2';\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n  if (context === void 0) return func;\n  switch (argCount == null ? 3 : argCount) {\n    case 1: return function(value) {\n      return func.call(context, value);\n    };\n    // The 2-argument case is omitted because we’re not using it.\n    case 3: return function(value, index, collection) {\n      return func.call(context, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(context, accumulator, value, index, collection);\n    };\n  }\n  return function() {\n    return func.apply(context, arguments);\n  };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n  if (value == null) return identity;\n  if (isFunction(value)) return optimizeCb(value, context, argCount);\n  if (isObject(value) && !isArray(value)) return matcher(value);\n  return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only argCount argument.\n_.iteratee = iteratee;\nfunction iteratee(value, context) {\n  return baseIteratee(value, context, Infinity);\n}\n\n// The function we actually call internally. It invokes _.iteratee if\n// overridden, otherwise baseIteratee.\nfunction cb(value, context, argCount) {\n  if (_.iteratee !== iteratee) return _.iteratee(value, context);\n  return baseIteratee(value, context, argCount);\n}\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nfunction restArguments(func, startIndex) {\n  startIndex = startIndex == null ? func.length - 1 : +startIndex;\n  return function() {\n    var length = Math.max(arguments.length - startIndex, 0),\n        rest = Array(length),\n        index = 0;\n    for (; index < length; index++) {\n      rest[index] = arguments[index + startIndex];\n    }\n    switch (startIndex) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, arguments[0], rest);\n      case 2: return func.call(this, arguments[0], arguments[1], rest);\n    }\n    var args = Array(startIndex + 1);\n    for (index = 0; index < startIndex; index++) {\n      args[index] = arguments[index];\n    }\n    args[startIndex] = rest;\n    return func.apply(this, args);\n  };\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n  if (!isObject(prototype)) return {};\n  if (nativeCreate) return nativeCreate(prototype);\n  Ctor.prototype = prototype;\n  var result = new Ctor;\n  Ctor.prototype = null;\n  return result;\n}\n\nfunction shallowProperty(key) {\n  return function(obj) {\n    return obj == null ? void 0 : obj[key];\n  };\n}\n\nfunction _has(obj, path) {\n  return obj != null && hasOwnProperty.call(obj, path);\n}\n\nfunction deepGet(obj, path) {\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    if (obj == null) return void 0;\n    obj = obj[path[i]];\n  }\n  return length ? obj : void 0;\n}\n\n// Helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nvar getLength = shallowProperty('length');\nfunction isArrayLike(collection) {\n  var length = getLength(collection);\n  return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n}\n\n// Collection Functions\n// --------------------\n\n// The cornerstone, an `each` implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nfunction each(obj, iteratee, context) {\n  iteratee = optimizeCb(iteratee, context);\n  var i, length;\n  if (isArrayLike(obj)) {\n    for (i = 0, length = obj.length; i < length; i++) {\n      iteratee(obj[i], i, obj);\n    }\n  } else {\n    var _keys = keys(obj);\n    for (i = 0, length = _keys.length; i < length; i++) {\n      iteratee(obj[_keys[i]], _keys[i], obj);\n    }\n  }\n  return obj;\n}\n\n\n// Return the results of applying the iteratee to each element.\nfunction map(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length,\n      results = Array(length);\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    results[index] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n\n// Create a reducing function iterating left or right.\nfunction createReduce(dir) {\n  // Wrap code that reassigns argument variables in a separate function than\n  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n  var reducer = function(obj, iteratee, memo, initial) {\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        index = dir > 0 ? 0 : length - 1;\n    if (!initial) {\n      memo = obj[_keys ? _keys[index] : index];\n      index += dir;\n    }\n    for (; index >= 0 && index < length; index += dir) {\n      var currentKey = _keys ? _keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  return function(obj, iteratee, memo, context) {\n    var initial = arguments.length >= 3;\n    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n  };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nvar reduce = createReduce(1);\n\n\n// The right-associative version of reduce, also known as `foldr`.\nvar reduceRight = createReduce(-1);\n\n\n// Return the first value which passes a truth test.\nfunction find(obj, predicate, context) {\n  var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n  var key = keyFinder(obj, predicate, context);\n  if (key !== void 0 && key !== -1) return obj[key];\n}\n\n\n// Return all the elements that pass a truth test.\nfunction filter(obj, predicate, context) {\n  var results = [];\n  predicate = cb(predicate, context);\n  each(obj, function(value, index, list) {\n    if (predicate(value, index, list)) results.push(value);\n  });\n  return results;\n}\n\n\n// Return all the elements for which a truth test fails.\nfunction reject(obj, predicate, context) {\n  return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements match a truth test.\nfunction every(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (!predicate(obj[currentKey], currentKey, obj)) return false;\n  }\n  return true;\n}\n\n\n// Determine if at least one element in the object matches a truth test.\nfunction some(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (predicate(obj[currentKey], currentKey, obj)) return true;\n  }\n  return false;\n}\n\n\n// Determine if the array or object contains a given item (using `===`).\nfunction contains(obj, item, fromIndex, guard) {\n  if (!isArrayLike(obj)) obj = values(obj);\n  if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n  return indexOf(obj, item, fromIndex) >= 0;\n}\n\n\n// Invoke a method (with arguments) on every item in a collection.\nvar invoke = restArguments(function(obj, path, args) {\n  var contextPath, func;\n  if (isFunction(path)) {\n    func = path;\n  } else if (isArray(path)) {\n    contextPath = path.slice(0, -1);\n    path = path[path.length - 1];\n  }\n  return map(obj, function(context) {\n    var method = func;\n    if (!method) {\n      if (contextPath && contextPath.length) {\n        context = deepGet(context, contextPath);\n      }\n      if (context == null) return void 0;\n      method = context[path];\n    }\n    return method == null ? method : method.apply(context, args);\n  });\n});\n\n// Convenience version of a common use case of `map`: fetching a property.\nfunction pluck(obj, key) {\n  return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `filter`: selecting only objects\n// containing specific `key:value` pairs.\nfunction where(obj, attrs) {\n  return filter(obj, matcher(attrs));\n}\n\n// Convenience version of a common use case of `find`: getting the first object\n// containing specific `key:value` pairs.\nfunction findWhere(obj, attrs) {\n  return find(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nfunction max(obj, iteratee, context) {\n  var result = -Infinity, lastComputed = -Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value > result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Return the minimum element (or element-based computation).\nfunction min(obj, iteratee, context) {\n  var result = Infinity, lastComputed = Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value < result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed < lastComputed || computed === Infinity && result === Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Shuffle a collection.\nfunction shuffle(obj) {\n  return sample(obj, Infinity);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `map`.\nfunction sample(obj, n, guard) {\n  if (n == null || guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    return obj[random(obj.length - 1)];\n  }\n  var sample = isArrayLike(obj) ? clone(obj) : values(obj);\n  var length = getLength(sample);\n  n = Math.max(Math.min(n, length), 0);\n  var last = length - 1;\n  for (var index = 0; index < n; index++) {\n    var rand = random(index, last);\n    var temp = sample[index];\n    sample[index] = sample[rand];\n    sample[rand] = temp;\n  }\n  return sample.slice(0, n);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nfunction sortBy(obj, iteratee, context) {\n  var index = 0;\n  iteratee = cb(iteratee, context);\n  return pluck(map(obj, function(value, key, list) {\n    return {\n      value: value,\n      index: index++,\n      criteria: iteratee(value, key, list)\n    };\n  }).sort(function(left, right) {\n    var a = left.criteria;\n    var b = right.criteria;\n    if (a !== b) {\n      if (a > b || a === void 0) return 1;\n      if (a < b || b === void 0) return -1;\n    }\n    return left.index - right.index;\n  }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n  return function(obj, iteratee, context) {\n    var result = partition ? [[], []] : {};\n    iteratee = cb(iteratee, context);\n    each(obj, function(value, index) {\n      var key = iteratee(value, index, obj);\n      behavior(result, value, key);\n    });\n    return result;\n  };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nvar groupBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `groupBy`, but for\n// when you know that your index values will be unique.\nvar indexBy = group(function(result, value, key) {\n  result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nvar countBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key]++; else result[key] = 1;\n});\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n// Safely create a real, live array from anything iterable.\nfunction toArray(obj) {\n  if (!obj) return [];\n  if (isArray(obj)) return slice.call(obj);\n  if (isString(obj)) {\n    // Keep surrogate pair characters together\n    return obj.match(reStrSymbol);\n  }\n  if (isArrayLike(obj)) return map(obj, identity);\n  return values(obj);\n}\n\n// Return the number of elements in an object.\nfunction size(obj) {\n  if (obj == null) return 0;\n  return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Split a collection into two arrays: one whose elements all satisfy the given\n// predicate, and one whose elements all do not satisfy the predicate.\nvar partition = group(function(result, value, pass) {\n  result[pass ? 0 : 1].push(value);\n}, true);\n\n// Array Functions\n// ---------------\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `map`.\nfunction first(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[0];\n  return initial(array, array.length - n);\n}\n\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nfunction initial(array, n, guard) {\n  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nfunction last(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[array.length - 1];\n  return rest(array, Math.max(0, array.length - n));\n}\n\n// Returns everything but the first entry of the array. Especially useful on\n// the arguments object. Passing an **n** will return the rest N values in the\n// array.\nfunction rest(array, n, guard) {\n  return slice.call(array, n == null || guard ? 1 : n);\n}\n\n\n// Trim out all falsy values from an array.\nfunction compact(array) {\n  return filter(array, Boolean);\n}\n\n// Internal implementation of a recursive `flatten` function.\nfunction _flatten(input, shallow, strict, output) {\n  output = output || [];\n  var idx = output.length;\n  for (var i = 0, length = getLength(input); i < length; i++) {\n    var value = input[i];\n    if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n      // Flatten current level of array or arguments object.\n      if (shallow) {\n        var j = 0, len = value.length;\n        while (j < len) output[idx++] = value[j++];\n      } else {\n        _flatten(value, shallow, strict, output);\n        idx = output.length;\n      }\n    } else if (!strict) {\n      output[idx++] = value;\n    }\n  }\n  return output;\n}\n\n// Flatten out an array, either recursively (by default), or just one level.\nfunction flatten(array, shallow) {\n  return _flatten(array, shallow, false);\n}\n\n// Return a version of the array that does not contain the specified value(s).\nvar without = restArguments(function(array, otherArrays) {\n  return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nfunction uniq(array, isSorted, iteratee, context) {\n  if (!isBoolean(isSorted)) {\n    context = iteratee;\n    iteratee = isSorted;\n    isSorted = false;\n  }\n  if (iteratee != null) iteratee = cb(iteratee, context);\n  var result = [];\n  var seen = [];\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var value = array[i],\n        computed = iteratee ? iteratee(value, i, array) : value;\n    if (isSorted && !iteratee) {\n      if (!i || seen !== computed) result.push(value);\n      seen = computed;\n    } else if (iteratee) {\n      if (!contains(seen, computed)) {\n        seen.push(computed);\n        result.push(value);\n      }\n    } else if (!contains(result, value)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nvar union = restArguments(function(arrays) {\n  return uniq(_flatten(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nfunction intersection(array) {\n  var result = [];\n  var argsLength = arguments.length;\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var item = array[i];\n    if (contains(result, item)) continue;\n    var j;\n    for (j = 1; j < argsLength; j++) {\n      if (!contains(arguments[j], item)) break;\n    }\n    if (j === argsLength) result.push(item);\n  }\n  return result;\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nvar difference = restArguments(function(array, rest) {\n  rest = _flatten(rest, true, true);\n  return filter(array, function(value){\n    return !contains(rest, value);\n  });\n});\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nfunction unzip(array) {\n  var length = array && max(array, getLength).length || 0;\n  var result = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    result[index] = pluck(array, index);\n  }\n  return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nvar zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of pairs.\nfunction object(list, values) {\n  var result = {};\n  for (var i = 0, length = getLength(list); i < length; i++) {\n    if (values) {\n      result[list[i]] = values[i];\n    } else {\n      result[list[i][0]] = list[i][1];\n    }\n  }\n  return result;\n}\n\n// Generator function to create the findIndex and findLastIndex functions.\nfunction createPredicateIndexFinder(dir) {\n  return function(array, predicate, context) {\n    predicate = cb(predicate, context);\n    var length = getLength(array);\n    var index = dir > 0 ? 0 : length - 1;\n    for (; index >= 0 && index < length; index += dir) {\n      if (predicate(array[index], index, array)) return index;\n    }\n    return -1;\n  };\n}\n\n// Returns the first index on an array-like that passes a predicate test.\nvar findIndex = createPredicateIndexFinder(1);\nvar findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nfunction sortedIndex(array, obj, iteratee, context) {\n  iteratee = cb(iteratee, context, 1);\n  var value = iteratee(obj);\n  var low = 0, high = getLength(array);\n  while (low < high) {\n    var mid = Math.floor((low + high) / 2);\n    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n  }\n  return low;\n}\n\n// Generator function to create the indexOf and lastIndexOf functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n  return function(array, item, idx) {\n    var i = 0, length = getLength(array);\n    if (typeof idx == 'number') {\n      if (dir > 0) {\n        i = idx >= 0 ? idx : Math.max(idx + length, i);\n      } else {\n        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n      }\n    } else if (sortedIndex && idx && length) {\n      idx = sortedIndex(array, item);\n      return array[idx] === item ? idx : -1;\n    }\n    if (item !== item) {\n      idx = predicateFind(slice.call(array, i, length), isNaN);\n      return idx >= 0 ? idx + i : -1;\n    }\n    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n      if (array[idx] === item) return idx;\n    }\n    return -1;\n  };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nvar indexOf = createIndexFinder(1, findIndex, sortedIndex);\nvar lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nfunction range(start, stop, step) {\n  if (stop == null) {\n    stop = start || 0;\n    start = 0;\n  }\n  if (!step) {\n    step = stop < start ? -1 : 1;\n  }\n\n  var length = Math.max(Math.ceil((stop - start) / step), 0);\n  var range = Array(length);\n\n  for (var idx = 0; idx < length; idx++, start += step) {\n    range[idx] = start;\n  }\n\n  return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nfunction chunk(array, count) {\n  if (count == null || count < 1) return [];\n  var result = [];\n  var i = 0, length = array.length;\n  while (i < length) {\n    result.push(slice.call(array, i, i += count));\n  }\n  return result;\n}\n\n// Function (ahem) Functions\n// ------------------\n\n// Determines whether to execute a function as a constructor\n// or a normal function with the provided arguments.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n  var self = baseCreate(sourceFunc.prototype);\n  var result = sourceFunc.apply(self, args);\n  if (isObject(result)) return result;\n  return self;\n}\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n// available.\nvar bind = restArguments(function(func, context, args) {\n  if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n  var bound = restArguments(function(callArgs) {\n    return executeBound(func, bound, context, this, args.concat(callArgs));\n  });\n  return bound;\n});\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. _ acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `partial.placeholder` for a custom placeholder argument.\nvar partial = restArguments(function(func, boundArgs) {\n  var placeholder = partial.placeholder;\n  var bound = function() {\n    var position = 0, length = boundArgs.length;\n    var args = Array(length);\n    for (var i = 0; i < length; i++) {\n      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n    }\n    while (position < arguments.length) args.push(arguments[position++]);\n    return executeBound(func, bound, this, this, args);\n  };\n  return bound;\n});\n\npartial.placeholder = _;\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nvar bindAll = restArguments(function(obj, _keys) {\n  _keys = _flatten(_keys, false, false);\n  var index = _keys.length;\n  if (index < 1) throw new Error('bindAll must be passed function names');\n  while (index--) {\n    var key = _keys[index];\n    obj[key] = bind(obj[key], obj);\n  }\n});\n\n// Memoize an expensive function by storing its results.\nfunction memoize(func, hasher) {\n  var memoize = function(key) {\n    var cache = memoize.cache;\n    var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n    if (!_has(cache, address)) cache[address] = func.apply(this, arguments);\n    return cache[address];\n  };\n  memoize.cache = {};\n  return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nvar delay = restArguments(function(func, wait, args) {\n  return setTimeout(function() {\n    return func.apply(null, args);\n  }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nvar defer = partial(delay, _, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nfunction throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function() {\n    var _now = now();\n    if (!previous && options.leading === false) previous = _now;\n    var remaining = wait - (_now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n      previous = _now;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n\n  throttled.cancel = function() {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\nfunction debounce(func, wait, immediate) {\n  var timeout, result;\n\n  var later = function(context, args) {\n    timeout = null;\n    if (args) result = func.apply(context, args);\n  };\n\n  var debounced = restArguments(function(args) {\n    if (timeout) clearTimeout(timeout);\n    if (immediate) {\n      var callNow = !timeout;\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(this, args);\n    } else {\n      timeout = delay(later, wait, this, args);\n    }\n\n    return result;\n  });\n\n  debounced.cancel = function() {\n    clearTimeout(timeout);\n    timeout = null;\n  };\n\n  return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nfunction wrap(func, wrapper) {\n  return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nfunction negate(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nfunction compose() {\n  var args = arguments;\n  var start = args.length - 1;\n  return function() {\n    var i = start;\n    var result = args[start].apply(this, arguments);\n    while (i--) result = args[i].call(this, result);\n    return result;\n  };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nfunction after(times, func) {\n  return function() {\n    if (--times < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\n// Returns a function that will only be executed up to (but not including) the Nth call.\nfunction before(times, func) {\n  var memo;\n  return function() {\n    if (--times > 0) {\n      memo = func.apply(this, arguments);\n    }\n    if (times <= 1) func = null;\n    return memo;\n  };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nvar once = partial(before, 2);\n\n// Object Functions\n// ----------------\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\nfunction collectNonEnumProps(obj, _keys) {\n  var nonEnumIdx = nonEnumerableProps.length;\n  var constructor = obj.constructor;\n  var proto = isFunction(constructor) && constructor.prototype || ObjProto;\n\n  // Constructor is a special case.\n  var prop = 'constructor';\n  if (_has(obj, prop) && !contains(_keys, prop)) _keys.push(prop);\n\n  while (nonEnumIdx--) {\n    prop = nonEnumerableProps[nonEnumIdx];\n    if (prop in obj && obj[prop] !== proto[prop] && !contains(_keys, prop)) {\n      _keys.push(prop);\n    }\n  }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nfunction keys(obj) {\n  if (!isObject(obj)) return [];\n  if (nativeKeys) return nativeKeys(obj);\n  var _keys = [];\n  for (var key in obj) if (_has(obj, key)) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve all the property names of an object.\nfunction allKeys(obj) {\n  if (!isObject(obj)) return [];\n  var _keys = [];\n  for (var key in obj) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve the values of an object's properties.\nfunction values(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var values = Array(length);\n  for (var i = 0; i < length; i++) {\n    values[i] = obj[_keys[i]];\n  }\n  return values;\n}\n\n// Returns the results of applying the iteratee to each element of the object.\n// In contrast to map it returns an object.\nfunction mapObject(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = keys(obj),\n      length = _keys.length,\n      results = {};\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys[index];\n    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of object.\nfunction pairs(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var pairs = Array(length);\n  for (var i = 0; i < length; i++) {\n    pairs[i] = [_keys[i], obj[_keys[i]]];\n  }\n  return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nfunction invert(obj) {\n  var result = {};\n  var _keys = keys(obj);\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    result[obj[_keys[i]]] = _keys[i];\n  }\n  return result;\n}\n\n// Return a sorted list of the function names available on the object.\nfunction functions(obj) {\n  var names = [];\n  for (var key in obj) {\n    if (isFunction(obj[key])) names.push(key);\n  }\n  return names.sort();\n}\n\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n  return function(obj) {\n    var length = arguments.length;\n    if (defaults) obj = Object(obj);\n    if (length < 2 || obj == null) return obj;\n    for (var index = 1; index < length; index++) {\n      var source = arguments[index],\n          _keys = keysFunc(source),\n          l = _keys.length;\n      for (var i = 0; i < l; i++) {\n        var key = _keys[i];\n        if (!defaults || obj[key] === void 0) obj[key] = source[key];\n      }\n    }\n    return obj;\n  };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nvar extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nvar extendOwn = createAssigner(keys);\n\n\n// Returns the first key on an object that passes a predicate test.\nfunction findKey(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = keys(obj), key;\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    key = _keys[i];\n    if (predicate(obj[key], key, obj)) return key;\n  }\n}\n\n// Internal pick helper function to determine if `obj` has key `key`.\nfunction keyInObj(value, key, obj) {\n  return key in obj;\n}\n\n// Return a copy of the object only containing the whitelisted properties.\nvar pick = restArguments(function(obj, _keys) {\n  var result = {}, iteratee = _keys[0];\n  if (obj == null) return result;\n  if (isFunction(iteratee)) {\n    if (_keys.length > 1) iteratee = optimizeCb(iteratee, _keys[1]);\n    _keys = allKeys(obj);\n  } else {\n    iteratee = keyInObj;\n    _keys = _flatten(_keys, false, false);\n    obj = Object(obj);\n  }\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    var key = _keys[i];\n    var value = obj[key];\n    if (iteratee(value, key, obj)) result[key] = value;\n  }\n  return result;\n});\n\n// Return a copy of the object without the blacklisted properties.\nvar omit = restArguments(function(obj, _keys) {\n  var iteratee = _keys[0], context;\n  if (isFunction(iteratee)) {\n    iteratee = negate(iteratee);\n    if (_keys.length > 1) context = _keys[1];\n  } else {\n    _keys = map(_flatten(_keys, false, false), String);\n    iteratee = function(value, key) {\n      return !contains(_keys, key);\n    };\n  }\n  return pick(obj, iteratee, context);\n});\n\n// Fill in a given object with default properties.\nvar defaults = createAssigner(allKeys, true);\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nfunction create(prototype, props) {\n  var result = baseCreate(prototype);\n  if (props) extendOwn(result, props);\n  return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nfunction clone(obj) {\n  if (!isObject(obj)) return obj;\n  return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes interceptor with the obj, and then returns obj.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nfunction tap(obj, interceptor) {\n  interceptor(obj);\n  return obj;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nfunction isMatch(object, attrs) {\n  var _keys = keys(attrs), length = _keys.length;\n  if (object == null) return !length;\n  var obj = Object(object);\n  for (var i = 0; i < length; i++) {\n    var key = _keys[i];\n    if (attrs[key] !== obj[key] || !(key in obj)) return false;\n  }\n  return true;\n}\n\n\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, aStack, bStack) {\n  // Identical objects are equal. `0 === -0`, but they aren't identical.\n  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n  if (a === b) return a !== 0 || 1 / a === 1 / b;\n  // `null` or `undefined` only equal to itself (strict comparison).\n  if (a == null || b == null) return false;\n  // `NaN`s are equivalent, but non-reflexive.\n  if (a !== a) return b !== b;\n  // Exhaust primitive checks\n  var type = typeof a;\n  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n  return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n  // Unwrap any wrapped objects.\n  if (a instanceof _) a = a._wrapped;\n  if (b instanceof _) b = b._wrapped;\n  // Compare `[[Class]]` names.\n  var className = toString.call(a);\n  if (className !== toString.call(b)) return false;\n  switch (className) {\n    // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n    case '[object RegExp]':\n    // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n    case '[object String]':\n      // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n      // equivalent to `new String(\"5\")`.\n      return '' + a === '' + b;\n    case '[object Number]':\n      // `NaN`s are equivalent, but non-reflexive.\n      // Object(NaN) is equivalent to NaN.\n      if (+a !== +a) return +b !== +b;\n      // An `egal` comparison is performed for other numeric values.\n      return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n    case '[object Date]':\n    case '[object Boolean]':\n      // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n      // millisecond representations. Note that invalid dates with millisecond representations\n      // of `NaN` are not equivalent.\n      return +a === +b;\n    case '[object Symbol]':\n      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n  }\n\n  var areArrays = className === '[object Array]';\n  if (!areArrays) {\n    if (typeof a != 'object' || typeof b != 'object') return false;\n\n    // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n    // from different frames are.\n    var aCtor = a.constructor, bCtor = b.constructor;\n    if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n                             isFunction(bCtor) && bCtor instanceof bCtor)\n                        && ('constructor' in a && 'constructor' in b)) {\n      return false;\n    }\n  }\n  // Assume equality for cyclic structures. The algorithm for detecting cyclic\n  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n  // Initializing stack of traversed objects.\n  // It's done here since we only need them for objects and arrays comparison.\n  aStack = aStack || [];\n  bStack = bStack || [];\n  var length = aStack.length;\n  while (length--) {\n    // Linear search. Performance is inversely proportional to the number of\n    // unique nested structures.\n    if (aStack[length] === a) return bStack[length] === b;\n  }\n\n  // Add the first object to the stack of traversed objects.\n  aStack.push(a);\n  bStack.push(b);\n\n  // Recursively compare objects and arrays.\n  if (areArrays) {\n    // Compare array lengths to determine if a deep comparison is necessary.\n    length = a.length;\n    if (length !== b.length) return false;\n    // Deep compare the contents, ignoring non-numeric properties.\n    while (length--) {\n      if (!eq(a[length], b[length], aStack, bStack)) return false;\n    }\n  } else {\n    // Deep compare objects.\n    var _keys = keys(a), key;\n    length = _keys.length;\n    // Ensure that both objects contain the same number of properties before comparing deep equality.\n    if (keys(b).length !== length) return false;\n    while (length--) {\n      // Deep compare each member\n      key = _keys[length];\n      if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n    }\n  }\n  // Remove the first object from the stack of traversed objects.\n  aStack.pop();\n  bStack.pop();\n  return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nfunction isEqual(a, b) {\n  return eq(a, b);\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nfunction isEmpty(obj) {\n  if (obj == null) return true;\n  if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;\n  return keys(obj).length === 0;\n}\n\n// Is a given value a DOM element?\nfunction isElement(obj) {\n  return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a toString-based type tester.\nfunction tagTester(name) {\n  return function(obj) {\n    return toString.call(obj) === '[object ' + name + ']';\n  };\n}\n\n// Is a given value an array?\n// Delegates to ECMA5's native Array.isArray\nvar isArray = nativeIsArray || tagTester('Array');\n\n// Is a given variable an object?\nfunction isObject(obj) {\n  var type = typeof obj;\n  return type === 'function' || type === 'object' && !!obj;\n}\n\n// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.\nvar isArguments = tagTester('Arguments');\nvar isFunction = tagTester('Function');\nvar isString = tagTester('String');\nvar isNumber = tagTester('Number');\nvar isDate = tagTester('Date');\nvar isRegExp = tagTester('RegExp');\nvar isError = tagTester('Error');\nvar isSymbol = tagTester('Symbol');\nvar isMap = tagTester('Map');\nvar isWeakMap = tagTester('WeakMap');\nvar isSet = tagTester('Set');\nvar isWeakSet = tagTester('WeakSet');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n  if (!isArguments(arguments)) {\n    isArguments = function(obj) {\n      return _has(obj, 'callee');\n    };\n  }\n}());\n\n// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n  isFunction = function(obj) {\n    return typeof obj == 'function' || false;\n  };\n}\n\n// Is a given object a finite number?\nfunction isFinite(obj) {\n  return !isSymbol(obj) && _isFinite(obj) && !_isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nfunction isNaN(obj) {\n  return isNumber(obj) && _isNaN(obj);\n}\n\n// Is a given value a boolean?\nfunction isBoolean(obj) {\n  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value equal to null?\nfunction isNull(obj) {\n  return obj === null;\n}\n\n// Is a given variable undefined?\nfunction isUndefined(obj) {\n  return obj === void 0;\n}\n\n// Shortcut function for checking if an object has a given property directly\n// on itself (in other words, not on a prototype).\nfunction has(obj, path) {\n  if (!isArray(path)) {\n    return _has(obj, path);\n  }\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    var key = path[i];\n    if (obj == null || !hasOwnProperty.call(obj, key)) {\n      return false;\n    }\n    obj = obj[key];\n  }\n  return !!length;\n}\n\n// Utility Functions\n// -----------------\n\n// Keep the identity function around for default iteratees.\nfunction identity(value) {\n  return value;\n}\n\n// Predicate-generating functions. Often useful outside of Underscore.\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nfunction noop(){}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indexes.\nfunction property(path) {\n  if (!isArray(path)) {\n    return shallowProperty(path);\n  }\n  return function(obj) {\n    return deepGet(obj, path);\n  };\n}\n\n// Generates a function for a given object that returns a given property.\nfunction propertyOf(obj) {\n  if (obj == null) {\n    return function(){};\n  }\n  return function(path) {\n    return !isArray(path) ? obj[path] : deepGet(obj, path);\n  };\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nfunction matcher(attrs) {\n  attrs = extendOwn({}, attrs);\n  return function(obj) {\n    return isMatch(obj, attrs);\n  };\n}\n\n\n// Run a function **n** times.\nfunction times(n, iteratee, context) {\n  var accum = Array(Math.max(0, n));\n  iteratee = optimizeCb(iteratee, context, 1);\n  for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n  return accum;\n}\n\n// Return a random integer between min and max (inclusive).\nfunction random(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nvar now = Date.now || function() {\n  return new Date().getTime();\n};\n\n// List of HTML entities for escaping.\nvar escapeMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n};\nvar unescapeMap = invert(escapeMap);\n\n// Functions for escaping and unescaping strings to/from HTML interpolation.\nfunction createEscaper(map) {\n  var escaper = function(match) {\n    return map[match];\n  };\n  // Regexes for identifying a key that needs to be escaped.\n  var source = '(?:' + keys(map).join('|') + ')';\n  var testRegexp = RegExp(source);\n  var replaceRegexp = RegExp(source, 'g');\n  return function(string) {\n    string = string == null ? '' : '' + string;\n    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n  };\n}\nvar escape = createEscaper(escapeMap);\nvar unescape = createEscaper(unescapeMap);\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nfunction result(obj, path, fallback) {\n  if (!isArray(path)) path = [path];\n  var length = path.length;\n  if (!length) {\n    return isFunction(fallback) ? fallback.call(obj) : fallback;\n  }\n  for (var i = 0; i < length; i++) {\n    var prop = obj == null ? void 0 : obj[path[i]];\n    if (prop === void 0) {\n      prop = fallback;\n      i = length; // Ensure we don't continue iterating.\n    }\n    obj = isFunction(prop) ? prop.call(obj) : prop;\n  }\n  return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nfunction uniqueId(prefix) {\n  var id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nvar templateSettings = _.templateSettings = {\n  evaluate: /<%([\\s\\S]+?)%>/g,\n  interpolate: /<%=([\\s\\S]+?)%>/g,\n  escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n  \"'\": \"'\",\n  '\\\\': '\\\\',\n  '\\r': 'r',\n  '\\n': 'n',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nvar escapeChar = function(match) {\n  return '\\\\' + escapes[match];\n};\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nfunction template(text, settings, oldSettings) {\n  if (!settings && oldSettings) settings = oldSettings;\n  settings = defaults({}, settings, _.templateSettings);\n\n  // Combine delimiters into one regular expression via alternation.\n  var matcher = RegExp([\n    (settings.escape || noMatch).source,\n    (settings.interpolate || noMatch).source,\n    (settings.evaluate || noMatch).source\n  ].join('|') + '|$', 'g');\n\n  // Compile the template source, escaping string literals appropriately.\n  var index = 0;\n  var source = \"__p+='\";\n  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n    index = offset + match.length;\n\n    if (escape) {\n      source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n    } else if (interpolate) {\n      source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n    } else if (evaluate) {\n      source += \"';\\n\" + evaluate + \"\\n__p+='\";\n    }\n\n    // Adobe VMs need the match returned to produce the correct offset.\n    return match;\n  });\n  source += \"';\\n\";\n\n  // If a variable is not specified, place data values in local scope.\n  if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n  source = \"var __t,__p='',__j=Array.prototype.join,\" +\n    \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n    source + 'return __p;\\n';\n\n  var render;\n  try {\n    render = new Function(settings.variable || 'obj', '_', source);\n  } catch (e) {\n    e.source = source;\n    throw e;\n  }\n\n  var template = function(data) {\n    return render.call(this, data, _);\n  };\n\n  // Provide the compiled source as a convenience for precompilation.\n  var argument = settings.variable || 'obj';\n  template.source = 'function(' + argument + '){\\n' + source + '}';\n\n  return template;\n}\n\n// Add a \"chain\" function. Start chaining a wrapped Underscore object.\nfunction chain(obj) {\n  var instance = _(obj);\n  instance._chain = true;\n  return instance;\n}\n\n// OOP\n// ---------------\n// If Underscore is called as a function, it returns a wrapped object that\n// can be used OO-style. This wrapper holds altered versions of all the\n// underscore functions. Wrapped objects may be chained.\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n  return instance._chain ? _(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nfunction mixin(obj) {\n  each(functions(obj), function(name) {\n    var func = _[name] = obj[name];\n    _.prototype[name] = function() {\n      var args = [this._wrapped];\n      push.apply(args, arguments);\n      return chainResult(this, func.apply(_, args));\n    };\n  });\n  return _;\n}\n\n// Add all mutator Array functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    var obj = this._wrapped;\n    method.apply(obj, arguments);\n    if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n    return chainResult(this, obj);\n  };\n});\n\n// Add all accessor Array functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    return chainResult(this, method.apply(this._wrapped, arguments));\n  };\n});\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n  return this._wrapped;\n};\n\n// Provide unwrapping proxy for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n  return String(this._wrapped);\n};\n\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(17)))\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar emptyObject = {};\n\nif (false) {\n  Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n  return function () {\n    return arg;\n  };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n  return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n  return arg;\n};\n\nmodule.exports = emptyFunction;\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n * \n */\n\n/*eslint-disable no-self-compare */\n\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  } else {\n    // Step 6.a: NaN == NaN\n    return x !== x && y !== y;\n  }\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nmodule.exports = shallowEqual;\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of https://github.com/facebook/react/tree/0.13-stable.\n * An additional grant of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule warning\n */\n\n\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = \"production\" !== 'production';\n\nvar warning = function warning() {};\n\nif (__DEV__) {\n  warning = function (condition, format) {\n    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n\n    if (format === undefined) {\n      throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n    }\n\n    if (format.length < 10 || /^[s\\W]*$/.test(format)) {\n      throw new Error('The warning format should be able to uniquely identify this ' + 'warning. Please, use a more descriptive format than: ' + format);\n    }\n\n    if (format.indexOf('Failed Composite propType: ') === 0) {\n      return; // Ignore CompositeComponent proptype check.\n    }\n\n    if (!condition) {\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      console.warn(message);\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch (x) {}\n    }\n  };\n}\n\nmodule.exports = warning;\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar invariant = __webpack_require__(26);\nvar assign = __webpack_require__(77);\nvar qs = __webpack_require__(752);\n\nvar paramCompileMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\\[\\]\\\\+|{}^$]/g;\nvar paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g;\nvar paramInjectTrailingSlashMatcher = /\\/\\/\\?|\\/\\?\\/|\\/\\?(?![^\\/=]+=.*$)/g;\nvar queryMatcher = /\\?(.*)$/;\n\nvar _compiledPatterns = {};\n\nfunction compilePattern(pattern) {\n  if (!(pattern in _compiledPatterns)) {\n    var paramNames = [];\n    var source = pattern.replace(paramCompileMatcher, function (match, paramName) {\n      if (paramName) {\n        paramNames.push(paramName);\n        return '([^/?#]+)';\n      } else if (match === '*') {\n        paramNames.push('splat');\n        return '(.*?)';\n      } else {\n        return '\\\\' + match;\n      }\n    });\n\n    _compiledPatterns[pattern] = {\n      matcher: new RegExp('^' + source + '$', 'i'),\n      paramNames: paramNames\n    };\n  }\n\n  return _compiledPatterns[pattern];\n}\n\nvar PathUtils = {\n\n  /**\n   * Returns true if the given path is absolute.\n   */\n  isAbsolute: function isAbsolute(path) {\n    return path.charAt(0) === '/';\n  },\n\n  /**\n   * Joins two URL paths together.\n   */\n  join: function join(a, b) {\n    return a.replace(/\\/*$/, '/') + b;\n  },\n\n  /**\n   * Returns an array of the names of all parameters in the given pattern.\n   */\n  extractParamNames: function extractParamNames(pattern) {\n    return compilePattern(pattern).paramNames;\n  },\n\n  /**\n   * Extracts the portions of the given URL path that match the given pattern\n   * and returns an object of param name => value pairs. Returns null if the\n   * pattern does not match the given path.\n   */\n  extractParams: function extractParams(pattern, path) {\n    var _compilePattern = compilePattern(pattern);\n\n    var matcher = _compilePattern.matcher;\n    var paramNames = _compilePattern.paramNames;\n\n    var match = path.match(matcher);\n\n    if (!match) return null;\n\n    var params = {};\n\n    paramNames.forEach(function (paramName, index) {\n      params[paramName] = match[index + 1];\n    });\n\n    return params;\n  },\n\n  /**\n   * Returns a version of the given route path with params interpolated. Throws\n   * if there is a dynamic segment of the route path for which there is no param.\n   */\n  injectParams: function injectParams(pattern, params) {\n    params = params || {};\n\n    var splatIndex = 0;\n\n    return pattern.replace(paramInjectMatcher, function (match, paramName) {\n      paramName = paramName || 'splat';\n\n      // If param is optional don't check for existence\n      if (paramName.slice(-1) === '?') {\n        paramName = paramName.slice(0, -1);\n\n        if (params[paramName] == null) return '';\n      } else {\n        invariant(params[paramName] != null, 'Missing \"%s\" parameter for path \"%s\"', paramName, pattern);\n      }\n\n      var segment;\n      if (paramName === 'splat' && Array.isArray(params[paramName])) {\n        segment = params[paramName][splatIndex++];\n\n        invariant(segment != null, 'Missing splat # %s for path \"%s\"', splatIndex, pattern);\n      } else {\n        segment = params[paramName];\n      }\n\n      return segment;\n    }).replace(paramInjectTrailingSlashMatcher, '/');\n  },\n\n  /**\n   * Returns an object that is the result of parsing any query string contained\n   * in the given path, null if the path contains no query string.\n   */\n  extractQuery: function extractQuery(path) {\n    var match = path.match(queryMatcher);\n    return match && qs.parse(match[1]);\n  },\n\n  /**\n   * Returns a version of the given path without the query string.\n   */\n  withoutQuery: function withoutQuery(path) {\n    return path.replace(queryMatcher, '');\n  },\n\n  /**\n   * Returns a version of the given path with the parameters in the given\n   * query merged into the query string.\n   */\n  withQuery: function withQuery(path, query) {\n    var existingQuery = PathUtils.extractQuery(path);\n\n    if (existingQuery) query = query ? assign(existingQuery, query) : existingQuery;\n\n    var queryString = qs.stringify(query, { arrayFormat: 'brackets' });\n\n    if (queryString) return PathUtils.withoutQuery(path) + '?' + queryString;\n\n    return PathUtils.withoutQuery(path);\n  }\n\n};\n\nmodule.exports = PathUtils;\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LocationActions = __webpack_require__(137);\nvar History = __webpack_require__(118);\n\nvar _listeners = [];\nvar _isListening = false;\n\nfunction notifyChange(type) {\n  var change = {\n    path: HistoryLocation.getCurrentPath(),\n    type: type\n  };\n\n  _listeners.forEach(function (listener) {\n    listener.call(HistoryLocation, change);\n  });\n}\n\nfunction onPopState(event) {\n  if (event.state === undefined) return; // Ignore extraneous popstate events in WebKit.\n\n  notifyChange(LocationActions.POP);\n}\n\n/**\n * A Location that uses HTML5 history.\n */\nvar HistoryLocation = {\n\n  addChangeListener: function addChangeListener(listener) {\n    _listeners.push(listener);\n\n    if (!_isListening) {\n      if (window.addEventListener) {\n        window.addEventListener('popstate', onPopState, false);\n      } else {\n        window.attachEvent('onpopstate', onPopState);\n      }\n\n      _isListening = true;\n    }\n  },\n\n  removeChangeListener: function removeChangeListener(listener) {\n    _listeners = _listeners.filter(function (l) {\n      return l !== listener;\n    });\n\n    if (_listeners.length === 0) {\n      if (window.addEventListener) {\n        window.removeEventListener('popstate', onPopState, false);\n      } else {\n        window.removeEvent('onpopstate', onPopState);\n      }\n\n      _isListening = false;\n    }\n  },\n\n  push: function push(path) {\n    window.history.pushState({ path: path }, '', path);\n    History.length += 1;\n    notifyChange(LocationActions.PUSH);\n  },\n\n  replace: function replace(path) {\n    window.history.replaceState({ path: path }, '', path);\n    notifyChange(LocationActions.REPLACE);\n  },\n\n  pop: History.back,\n\n  getCurrentPath: function getCurrentPath() {\n    return decodeURI(window.location.pathname + window.location.search);\n  },\n\n  toString: function toString() {\n    return '<HistoryLocation>';\n  }\n\n};\n\nmodule.exports = HistoryLocation;\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(98);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _entity = __webpack_require__(351);\n\nvar _entity2 = _interopRequireDefault(_entity);\n\nvar _entities = __webpack_require__(775);\n\nvar _entities2 = _interopRequireDefault(_entities);\n\nvar _control_panel_store = __webpack_require__(243);\n\nvar _control_panel_store2 = _interopRequireDefault(_control_panel_store);\n\nvar _entity_store = __webpack_require__(370);\n\nvar _entity_store2 = _interopRequireDefault(_entity_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n  selected: function selected(entity) {\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_SELECTED',\n      entity: entity\n    });\n  },\n  selectedById: function selectedById(id, forceReload) {\n    var _this = this;\n\n    if (_control_panel_store2.default.isEntitySelected(id) && !forceReload) {\n      return;\n    }\n\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE'\n    });\n\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_LOADING',\n      entityId: id\n    });\n\n    var entity = new _entity2.default({ id: id });\n    entity.fetch({\n      success: function success() {\n        return _this.selected(entity.toJSON());\n      },\n      error: function error(model, resp) {\n        return _this._onEntityError(resp);\n      }\n    });\n  },\n  startLoading: function startLoading() {\n    _og_flux.Dispatcher.handleServerAction({\n      actionType: 'ENTITIES_LOADING'\n    });\n  },\n  loadAll: function loadAll() {\n    var _this2 = this;\n\n    var entities = new _entities2.default();\n    entities.fetch({\n      success: function success() {\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITIES_LOADED',\n          entities: entities.toJSON()\n        });\n      },\n      error: function error(model, resp) {\n        return _this2._onEntitiesError(resp);\n      }\n    });\n  },\n  newEntity: function newEntity() {\n    var _this3 = this;\n\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_NEW',\n      entity: new _entity2.default()\n    });\n\n    this._fetchEntityTypes().then(function () {\n      return _this3._fetchCountries();\n    }).then(function () {\n      return _this3._fetchStates();\n    }).then(function () {\n      return _this3._fetchGroups();\n    });\n  },\n  submitEntityForm: function submitEntityForm() {\n    var _this4 = this;\n\n    var entity = _entity_store2.default.getNewEntity();\n    if (!entity) {\n      return;\n    }\n\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_FORM_SUBMIT'\n    });\n\n    entity.save(null, {\n      success: function success() {\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITY_CREATED',\n          entity: entity.toJSON()\n        });\n\n        _this4.loadAll();\n      },\n      error: function error(model, resp) {\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITY_CREATE_ERROR',\n          response: resp\n        });\n      }\n    });\n\n    this.loadAll();\n  },\n  cancelEntityForm: function cancelEntityForm() {\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_FORM_CANCEL'\n    });\n  },\n  countrySelected: function countrySelected(country) {\n    _og_flux.Dispatcher.handleViewAction({\n      actionType: 'ENTITY_COUNTRY_SELECTED',\n      country: country\n    });\n\n    this._fetchStates();\n  },\n  _fetchEntityTypes: function _fetchEntityTypes() {\n    if (!_lodash2.default.isEmpty(_entity_store2.default.getEntityTypes())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(function (resolve) {\n      _jquery2.default.getJSON('/api/v1/entities/entity_types.json', function (data) {\n        var entityTypes = data.entity_types;\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITY_TYPES_LOADED',\n          entityTypes: entityTypes\n        });\n      });\n      resolve();\n    });\n  },\n  _fetchCountries: function _fetchCountries() {\n    if (!_lodash2.default.isEmpty(_entity_store2.default.getCountries())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(function (resolve) {\n      _jquery2.default.getJSON('/api/v1/entities/countries.json', function (data) {\n        var countries = data.countries;\n\n\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITY_COUNTRIES_LOADED',\n          countries: countries\n        });\n        resolve();\n      });\n    });\n  },\n  _fetchStates: function _fetchStates() {\n    var country = _entity_store2.default.getSelectedCountry();\n    if (!country || !_lodash2.default.isEmpty(_entity_store2.default.getStates())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(function (resolve) {\n      _jquery2.default.getJSON('/api/v1/entities/states.json', { country: country }, function (data) {\n        var states = data.states;\n\n        _og_flux.Dispatcher.handleServerAction({\n          actionType: 'ENTITY_STATES_LOADED',\n          country: country,\n          states: states\n        });\n        resolve();\n      });\n    });\n  },\n  _fetchGroups: function _fetchGroups() {\n    if (!_lodash2.default.isEmpty(_entity_store2.default.getGroups())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(function (resolve) {\n      _jquery2.default.getJSON('/api/v1/entities/partners', function (rawGroups) {\n        var formattedGroups = rawGroups.map(function (group) {\n          return { option: group.name, value: group.id };\n        });\n        _og_flux.Dispatcher.handleViewAction({\n          actionType: 'ENTITY_GROUPS_LOADED',\n          groups: formattedGroups\n        });\n        resolve();\n      });\n    });\n  },\n  _onEntitiesError: function _onEntitiesError(resp) {\n    _og_flux.Dispatcher.handleServerAction({\n      actionType: 'ENTITIES_LOAD_ERROR',\n      response: resp\n    });\n  },\n  _onEntityError: function _onEntityError(resp) {\n    _og_flux.Dispatcher.handleServerAction({\n      actionType: 'ENTITY_LOAD_ERROR',\n      response: resp\n    });\n  }\n};\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _toggle_mixin = __webpack_require__(495);\n\nvar _toggle_mixin2 = _interopRequireDefault(_toggle_mixin);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Dropdown = (0, _createReactClass2.default)({\n  displayName: 'Dropdown',\n\n  mixins: [_toggle_mixin2.default],\n\n  propTypes: {\n    dropdownClass: _propTypes2.default.string,\n    label: _propTypes2.default.string,\n    title: _propTypes2.default.node,\n    description: _propTypes2.default.string,\n    position: _propTypes2.default.oneOf(['align-left', 'align-right', 'align-top']),\n    disabled: _propTypes2.default.bool,\n    onToggle: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      targetClass: \"ui-dropdown__target\",\n      position: \"align-left\",\n      onToggle: _lodash2.default.noop\n    };\n  },\n\n  render: function render() {\n    var dropdownClassMixin = (0, _classnames2.default)({\n      \"disabled\": this.props.disabled,\n      \"is-toggled\": this.state.open,\n      \"multiline\": this.props.description\n    });\n    var dropdownClass = 'ui-dropdown ' + this.props.dropdownClass + ' ' + dropdownClassMixin;\n    var targetClass = this.props.targetClass + ' ' + this.props.position;\n\n    return _react2.default.createElement('div', { className: dropdownClass,\n      title: this.props.titleAttribute,\n      'data-hint': this.props.hint,\n      'data-hint-position': this.props.hintPosition,\n      onClick: this.handleToggleClick\n    }, _react2.default.createElement('button', {\n      className: 'ui-dropdown__toggle ' + this.props.toggleClass,\n      disabled: this.props.disabled\n    }, this.props.label ? _react2.default.createElement('small', { className: 'ui-dropdown__label' }, this.props.label) : null, this.props.description ? _react2.default.createElement('span', null, _react2.default.createElement('strong', null, this.props.title), _react2.default.createElement('small', null, this.props.description)) : _react2.default.createElement('span', { className: 'ui-dropdown__title' }, this.props.title)), _react2.default.createElement('div', { className: targetClass,\n      style: { display: this.state.open ? 'block' : 'none' },\n      onClick: this.handleContentClick }, this.props.children));\n  },\n\n  onToggle: function onToggle(opening) {\n    this.props.onToggle(opening);\n  }\n});\n\nexports.default = Dropdown;\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports) {\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _gl_data_sets = __webpack_require__(500);\n\nvar _gl_data_sets2 = _interopRequireDefault(_gl_data_sets);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar legacyReportIds = ['annual', 'ytd', 'balance'];\nvar Report = _backbone2.default.Model.extend({\n    urlRoot: '/api/v1/reports',\n    defaultGraphType: 'stacked',\n    clone: function clone() {\n        var report = new this.constructor(this.attributes);\n        report.dataSets.reset(this.dataSets.models);\n        report.setAssocReport(this.associatedReport);\n        return report;\n    },\n    initialize: function initialize() {\n        this.initDataSets();\n        this.authorized = false;\n    },\n    defaults: function defaults() {\n        return {\n            properties: {},\n            locale: 'en_US'\n        };\n    },\n    graphType: function graphType() {\n        var props = this.get('properties');\n        if (props && props.graph) {\n            return props.graph;\n        }\n        return this.defaultGraphType;\n    },\n    parse: function parse(resp) {\n        if (resp) {\n            if (resp.associated_reports) {\n                //Currently only supporting linking single reports; response includes array though\n                if (resp.associated_reports[0]) {\n                    this.initAssocReport(resp.associated_reports[0].report);\n                    delete resp.associated_reports;\n                }\n            }\n            if (resp.data_sets) {\n                this.initDataSets();\n                this.dataSets.set(resp.data_sets.map(function (dataSet, index) {\n                    return {\n                        id: dataSet.id,\n                        order: index,\n                        name: dataSet.name,\n                        // this is seemingly by design that we want label to be dataSet.name\n                        label: dataSet.name,\n                        year: dataSet.year,\n                        month: dataSet.month,\n                        description: dataSet.description,\n                        type: dataSet.data_set_type\n                    };\n                }));\n                delete resp.data_sets;\n            }\n            resp.technical_name = resp.report_type;\n        }\n        return resp;\n    },\n    parseError: function parseError(resp) {\n        var json = resp.responseJSON;\n        if (!json) {\n            return {};\n        }\n        var errors = json.errors;\n        if (errors && errors.data_sets) {\n            errors.data_sets = this.dataSets.parseDataSetErrors(errors.data_sets);\n        }\n        return json;\n    },\n    toJSON: function toJSON() {\n        var attrs = _lodash2.default.clone(this.attributes);\n        attrs.data_sets = this.dataSets.map(function (dataSet, index) {\n            return { id: dataSet.id, name: dataSet.get('label'), order: index };\n        });\n        // Only serialize the associated report IDs back up to the server when\n        // we are linking a grid report inside a summary report.\n        // Grid reports may have multiple associated summary reports, so we do not want to\n        // wipe them out here (see REP-422)\n        if (this.get('report_type') !== 'grid') {\n            attrs.associated_report_ids = this.associatedReport ? [this.associatedReport.get('id')] : ['none'];\n        }\n        return attrs;\n    },\n    toImmutable: function toImmutable() {\n        return Immutable.fromJS(this.attributes).set('data_sets', Immutable.fromJS(this.dataSets.toJSON()));\n    },\n    initAssocReport: function initAssocReport(report) {\n        this.associatedReport = new Report(report);\n        this.listenTo(this.associatedReport, 'all', function (event) {\n            this.trigger('associatedReport:' + event, _lodash2.default.tail(arguments));\n        });\n    },\n    setAssocReport: function setAssocReport(report, options) {\n        var opts = options ? _lodash2.default.clone(options) : {};\n        if (report instanceof Report) {\n            this.associatedReport = report;\n            if (!opts.silent) {\n                this.trigger('associatedReport:change');\n            }\n        } else {\n            if (!this.associatedReport) {\n                this.initAssocReport(report);\n            } else {\n                this.associatedReport.set(report, opts);\n            }\n        }\n    },\n    unsetAssocReport: function unsetAssocReport(options) {\n        var opts = options ? _lodash2.default.clone(options) : {};\n        this.associatedReport = null;\n        if (!opts.silent) {\n            this.trigger('associatedReport:change');\n        }\n    },\n    initDataSets: function initDataSets() {\n        if (!this.dataSets) {\n            this.dataSets = new _gl_data_sets2.default();\n            // Emit data set collection events.\n            this.listenTo(this.dataSets, 'all', function (event) {\n                this.trigger('dataSets:' + event, _lodash2.default.tail(arguments));\n            });\n        }\n    },\n    setDataSets: function setDataSets(dataSets) {\n        _lodash2.default.each(dataSets, _lodash2.default.bind(function (dataSet, index) {\n            this.dataSets.at(index).set({\n                id: dataSet.id,\n                label: dataSet.label\n            });\n        }, this));\n    },\n    setDefaultState: function setDefaultState(state) {\n        // Merge default state changes into the current default state.\n        this.set('properties', _lodash2.default.assign({}, this.attributes.properties, state));\n    },\n    canEdit: function canEdit() {\n        return this.isNew() || !!_lodash2.default.result(this.get('abilities'), 'update');\n    },\n    canDelete: function canDelete() {\n        return !!_lodash2.default.result(this.get('abilities'), 'delete');\n    },\n    canRename: function canRename() {\n        return !!_lodash2.default.result(this.get('abilities'), 'update_name');\n    },\n    isLegacy: function isLegacy() {\n        return _lodash2.default.includes(legacyReportIds, this.id);\n    },\n    isDescriptionVisible: function isDescriptionVisible() {\n        return this.attributes.properties.description_visible;\n    },\n    isAuthorized: function isAuthorized() {\n        return this.canEdit() || _lodash2.default.isEmpty(this.attributes.access_code) || this.authorized;\n    },\n\n    /*\r\n      Actions\r\n    */\n    // Open a panel to view and edit the settings for this report.\n    editSettings: function editSettings() {\n        this.trigger('action:editSettings', this);\n    },\n\n    // Load this report and enter into WYSIWYG mode to edit its default state.\n    editDefaultState: function editDefaultState() {\n        this.trigger('action:editDefaultState', this);\n    },\n\n    // Open the panel to select the data for this report.\n    selectData: function selectData() {\n        this.trigger('action:selectData', this);\n    }\n});\nexports.default = Report;\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar initializeTracking = exports.initializeTracking = function initializeTracking(session, entity) {\n    if (session && session.id) {\n        // Segment Identity & Group Tracking\n        var email = session.email ? session.email : '';\n        var type = null;\n        if (entity.entity_type) {\n            if (typeof entity.entity_type === 'string') {\n                type = entity.entity_type;\n            } else if (entity.entity_type.name) {\n                type = entity.entity_type.name;\n            }\n        }\n        if (window.analytics) {\n            window.analytics.identify(session.id, {\n                user_id: session.id,\n                user_entity_id: entity.id,\n                user_roles: session.role ? [session.role.name] : [],\n                user_is_opengov_employee: email.split('@').slice(-1).toString() === 'opengov.com',\n                user_suite: 'rt',\n                user_department: session.department,\n                user_title: session.title,\n                user_entity_salesforce_id: entity.salesforce_id,\n                user_delphius_features: entity.feature_permissions,\n                email: email,\n                created_at: session.created_at,\n                internal_external: email.split('@').slice(-1).toString() === 'opengov.com',\n                user_hash: session.user_intercom_hash,\n                user_role: session.role ? session.role.name : null,\n                entity_id: session.entity.entity_id // To be deprecated\n            });\n            window.analytics.group(entity.salesforce_id, {\n                entity_bp_id: entity.id,\n                entity_rt_id: entity.id,\n                name: entity.name,\n                created_at: entity.created_at,\n                entity_salesforce_id: entity.salesforce_id,\n                entity_type: type,\n                entity_country: entity.country,\n                entity_state: entity.state\n            });\n        }\n    }\n};\nvar trackPage = exports.trackPage = function trackPage(pageName, pageTrackingProps) {\n    // Segment Identity & Group Tracking\n    var props = pageTrackingProps || {};\n    if (window.analytics) {\n        window.analytics.page(pageName, _extends({}, props));\n    }\n};\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process, global, setImmediate) {/* @preserve\n * The MIT License (MIT)\n * \n * Copyright (c) 2013-2015 Petka Antonov\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n * \n */\n/**\n * bluebird build version 2.11.0\n * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers\n*/\n!function(e){if(true)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_==\"function\"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_==\"function\"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar SomePromiseArray = Promise._SomePromiseArray;\nfunction any(promises) {\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(1);\n    ret.setUnwrap();\n    ret.init();\n    return promise;\n}\n\nPromise.any = function (promises) {\n    return any(promises);\n};\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n};\n\n},{}],2:[function(_dereq_,module,exports){\n\"use strict\";\nvar firstLineError;\ntry {throw new Error(); } catch (e) {firstLineError = e;}\nvar schedule = _dereq_(\"./schedule.js\");\nvar Queue = _dereq_(\"./queue.js\");\nvar util = _dereq_(\"./util.js\");\n\nfunction Async() {\n    this._isTickUsed = false;\n    this._lateQueue = new Queue(16);\n    this._normalQueue = new Queue(16);\n    this._trampolineEnabled = true;\n    var self = this;\n    this.drainQueues = function () {\n        self._drainQueues();\n    };\n    this._schedule =\n        schedule.isStatic ? schedule(this.drainQueues) : schedule;\n}\n\nAsync.prototype.disableTrampolineIfNecessary = function() {\n    if (util.hasDevTools) {\n        this._trampolineEnabled = false;\n    }\n};\n\nAsync.prototype.enableTrampoline = function() {\n    if (!this._trampolineEnabled) {\n        this._trampolineEnabled = true;\n        this._schedule = function(fn) {\n            setTimeout(fn, 0);\n        };\n    }\n};\n\nAsync.prototype.haveItemsQueued = function () {\n    return this._normalQueue.length() > 0;\n};\n\nAsync.prototype.throwLater = function(fn, arg) {\n    if (arguments.length === 1) {\n        arg = fn;\n        fn = function () { throw arg; };\n    }\n    if (typeof setTimeout !== \"undefined\") {\n        setTimeout(function() {\n            fn(arg);\n        }, 0);\n    } else try {\n        this._schedule(function() {\n            fn(arg);\n        });\n    } catch (e) {\n        throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/m3OTXk\\u000a\");\n    }\n};\n\nfunction AsyncInvokeLater(fn, receiver, arg) {\n    this._lateQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncInvoke(fn, receiver, arg) {\n    this._normalQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncSettlePromises(promise) {\n    this._normalQueue._pushOne(promise);\n    this._queueTick();\n}\n\nif (!util.hasDevTools) {\n    Async.prototype.invokeLater = AsyncInvokeLater;\n    Async.prototype.invoke = AsyncInvoke;\n    Async.prototype.settlePromises = AsyncSettlePromises;\n} else {\n    if (schedule.isStatic) {\n        schedule = function(fn) { setTimeout(fn, 0); };\n    }\n    Async.prototype.invokeLater = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvokeLater.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                setTimeout(function() {\n                    fn.call(receiver, arg);\n                }, 100);\n            });\n        }\n    };\n\n    Async.prototype.invoke = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvoke.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                fn.call(receiver, arg);\n            });\n        }\n    };\n\n    Async.prototype.settlePromises = function(promise) {\n        if (this._trampolineEnabled) {\n            AsyncSettlePromises.call(this, promise);\n        } else {\n            this._schedule(function() {\n                promise._settlePromises();\n            });\n        }\n    };\n}\n\nAsync.prototype.invokeFirst = function (fn, receiver, arg) {\n    this._normalQueue.unshift(fn, receiver, arg);\n    this._queueTick();\n};\n\nAsync.prototype._drainQueue = function(queue) {\n    while (queue.length() > 0) {\n        var fn = queue.shift();\n        if (typeof fn !== \"function\") {\n            fn._settlePromises();\n            continue;\n        }\n        var receiver = queue.shift();\n        var arg = queue.shift();\n        fn.call(receiver, arg);\n    }\n};\n\nAsync.prototype._drainQueues = function () {\n    this._drainQueue(this._normalQueue);\n    this._reset();\n    this._drainQueue(this._lateQueue);\n};\n\nAsync.prototype._queueTick = function () {\n    if (!this._isTickUsed) {\n        this._isTickUsed = true;\n        this._schedule(this.drainQueues);\n    }\n};\n\nAsync.prototype._reset = function () {\n    this._isTickUsed = false;\n};\n\nmodule.exports = new Async();\nmodule.exports.firstLineError = firstLineError;\n\n},{\"./queue.js\":28,\"./schedule.js\":31,\"./util.js\":38}],3:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise) {\nvar rejectThis = function(_, e) {\n    this._reject(e);\n};\n\nvar targetRejected = function(e, context) {\n    context.promiseRejectionQueued = true;\n    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n};\n\nvar bindingResolved = function(thisArg, context) {\n    if (this._isPending()) {\n        this._resolveCallback(context.target);\n    }\n};\n\nvar bindingRejected = function(e, context) {\n    if (!context.promiseRejectionQueued) this._reject(e);\n};\n\nPromise.prototype.bind = function (thisArg) {\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n    ret._propagateFrom(this, 1);\n    var target = this._target();\n\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        var context = {\n            promiseRejectionQueued: false,\n            promise: ret,\n            target: target,\n            bindingPromise: maybePromise\n        };\n        target._then(INTERNAL, targetRejected, ret._progress, ret, context);\n        maybePromise._then(\n            bindingResolved, bindingRejected, ret._progress, ret, context);\n    } else {\n        ret._resolveCallback(target);\n    }\n    return ret;\n};\n\nPromise.prototype._setBoundTo = function (obj) {\n    if (obj !== undefined) {\n        this._bitField = this._bitField | 131072;\n        this._boundTo = obj;\n    } else {\n        this._bitField = this._bitField & (~131072);\n    }\n};\n\nPromise.prototype._isBound = function () {\n    return (this._bitField & 131072) === 131072;\n};\n\nPromise.bind = function (thisArg, value) {\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        maybePromise._then(function() {\n            ret._resolveCallback(value);\n        }, ret._reject, ret._progress, ret, null);\n    } else {\n        ret._resolveCallback(value);\n    }\n    return ret;\n};\n};\n\n},{}],4:[function(_dereq_,module,exports){\n\"use strict\";\nvar old;\nif (typeof Promise !== \"undefined\") old = Promise;\nfunction noConflict() {\n    try { if (Promise === bluebird) Promise = old; }\n    catch (e) {}\n    return bluebird;\n}\nvar bluebird = _dereq_(\"./promise.js\")();\nbluebird.noConflict = noConflict;\nmodule.exports = bluebird;\n\n},{\"./promise.js\":23}],5:[function(_dereq_,module,exports){\n\"use strict\";\nvar cr = Object.create;\nif (cr) {\n    var callerCache = cr(null);\n    var getterCache = cr(null);\n    callerCache[\" size\"] = getterCache[\" size\"] = 0;\n}\n\nmodule.exports = function(Promise) {\nvar util = _dereq_(\"./util.js\");\nvar canEvaluate = util.canEvaluate;\nvar isIdentifier = util.isIdentifier;\n\nvar getMethodCaller;\nvar getGetter;\nif (false) {\nvar makeMethodCaller = function (methodName) {\n    return new Function(\"ensureMethod\", \"                                    \\n\\\n        return function(obj) {                                               \\n\\\n            'use strict'                                                     \\n\\\n            var len = this.length;                                           \\n\\\n            ensureMethod(obj, 'methodName');                                 \\n\\\n            switch(len) {                                                    \\n\\\n                case 1: return obj.methodName(this[0]);                      \\n\\\n                case 2: return obj.methodName(this[0], this[1]);             \\n\\\n                case 3: return obj.methodName(this[0], this[1], this[2]);    \\n\\\n                case 0: return obj.methodName();                             \\n\\\n                default:                                                     \\n\\\n                    return obj.methodName.apply(obj, this);                  \\n\\\n            }                                                                \\n\\\n        };                                                                   \\n\\\n        \".replace(/methodName/g, methodName))(ensureMethod);\n};\n\nvar makeGetter = function (propertyName) {\n    return new Function(\"obj\", \"                                             \\n\\\n        'use strict';                                                        \\n\\\n        return obj.propertyName;                                             \\n\\\n        \".replace(\"propertyName\", propertyName));\n};\n\nvar getCompiled = function(name, compiler, cache) {\n    var ret = cache[name];\n    if (typeof ret !== \"function\") {\n        if (!isIdentifier(name)) {\n            return null;\n        }\n        ret = compiler(name);\n        cache[name] = ret;\n        cache[\" size\"]++;\n        if (cache[\" size\"] > 512) {\n            var keys = Object.keys(cache);\n            for (var i = 0; i < 256; ++i) delete cache[keys[i]];\n            cache[\" size\"] = keys.length - 256;\n        }\n    }\n    return ret;\n};\n\ngetMethodCaller = function(name) {\n    return getCompiled(name, makeMethodCaller, callerCache);\n};\n\ngetGetter = function(name) {\n    return getCompiled(name, makeGetter, getterCache);\n};\n}\n\nfunction ensureMethod(obj, methodName) {\n    var fn;\n    if (obj != null) fn = obj[methodName];\n    if (typeof fn !== \"function\") {\n        var message = \"Object \" + util.classString(obj) + \" has no method '\" +\n            util.toString(methodName) + \"'\";\n        throw new Promise.TypeError(message);\n    }\n    return fn;\n}\n\nfunction caller(obj) {\n    var methodName = this.pop();\n    var fn = ensureMethod(obj, methodName);\n    return fn.apply(obj, this);\n}\nPromise.prototype.call = function (methodName) {\n    var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}\n    if (false) {\n        if (canEvaluate) {\n            var maybeCaller = getMethodCaller(methodName);\n            if (maybeCaller !== null) {\n                return this._then(\n                    maybeCaller, undefined, undefined, args, undefined);\n            }\n        }\n    }\n    args.push(methodName);\n    return this._then(caller, undefined, undefined, args, undefined);\n};\n\nfunction namedGetter(obj) {\n    return obj[this];\n}\nfunction indexedGetter(obj) {\n    var index = +this;\n    if (index < 0) index = Math.max(0, index + obj.length);\n    return obj[index];\n}\nPromise.prototype.get = function (propertyName) {\n    var isIndex = (typeof propertyName === \"number\");\n    var getter;\n    if (!isIndex) {\n        if (canEvaluate) {\n            var maybeGetter = getGetter(propertyName);\n            getter = maybeGetter !== null ? maybeGetter : namedGetter;\n        } else {\n            getter = namedGetter;\n        }\n    } else {\n        getter = indexedGetter;\n    }\n    return this._then(getter, undefined, undefined, propertyName, undefined);\n};\n};\n\n},{\"./util.js\":38}],6:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar errors = _dereq_(\"./errors.js\");\nvar async = _dereq_(\"./async.js\");\nvar CancellationError = errors.CancellationError;\n\nPromise.prototype._cancel = function (reason) {\n    if (!this.isCancellable()) return this;\n    var parent;\n    var promiseToReject = this;\n    while ((parent = promiseToReject._cancellationParent) !== undefined &&\n        parent.isCancellable()) {\n        promiseToReject = parent;\n    }\n    this._unsetCancellable();\n    promiseToReject._target()._rejectCallback(reason, false, true);\n};\n\nPromise.prototype.cancel = function (reason) {\n    if (!this.isCancellable()) return this;\n    if (reason === undefined) reason = new CancellationError();\n    async.invokeLater(this._cancel, this, reason);\n    return this;\n};\n\nPromise.prototype.cancellable = function () {\n    if (this._cancellable()) return this;\n    async.enableTrampoline();\n    this._setCancellable();\n    this._cancellationParent = undefined;\n    return this;\n};\n\nPromise.prototype.uncancellable = function () {\n    var ret = this.then();\n    ret._unsetCancellable();\n    return ret;\n};\n\nPromise.prototype.fork = function (didFulfill, didReject, didProgress) {\n    var ret = this._then(didFulfill, didReject, didProgress,\n                         undefined, undefined);\n\n    ret._setCancellable();\n    ret._cancellationParent = undefined;\n    return ret;\n};\n};\n\n},{\"./async.js\":2,\"./errors.js\":13}],7:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function() {\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar bluebirdFramePattern =\n    /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](main|debug|zalgo|instrumented)/;\nvar stackFramePattern = null;\nvar formatStack = null;\nvar indentStackFrames = false;\nvar warn;\n\nfunction CapturedTrace(parent) {\n    this._parent = parent;\n    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n    captureStackTrace(this, CapturedTrace);\n    if (length > 32) this.uncycle();\n}\nutil.inherits(CapturedTrace, Error);\n\nCapturedTrace.prototype.uncycle = function() {\n    var length = this._length;\n    if (length < 2) return;\n    var nodes = [];\n    var stackToIndex = {};\n\n    for (var i = 0, node = this; node !== undefined; ++i) {\n        nodes.push(node);\n        node = node._parent;\n    }\n    length = this._length = i;\n    for (var i = length - 1; i >= 0; --i) {\n        var stack = nodes[i].stack;\n        if (stackToIndex[stack] === undefined) {\n            stackToIndex[stack] = i;\n        }\n    }\n    for (var i = 0; i < length; ++i) {\n        var currentStack = nodes[i].stack;\n        var index = stackToIndex[currentStack];\n        if (index !== undefined && index !== i) {\n            if (index > 0) {\n                nodes[index - 1]._parent = undefined;\n                nodes[index - 1]._length = 1;\n            }\n            nodes[i]._parent = undefined;\n            nodes[i]._length = 1;\n            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n            if (index < length - 1) {\n                cycleEdgeNode._parent = nodes[index + 1];\n                cycleEdgeNode._parent.uncycle();\n                cycleEdgeNode._length =\n                    cycleEdgeNode._parent._length + 1;\n            } else {\n                cycleEdgeNode._parent = undefined;\n                cycleEdgeNode._length = 1;\n            }\n            var currentChildLength = cycleEdgeNode._length + 1;\n            for (var j = i - 2; j >= 0; --j) {\n                nodes[j]._length = currentChildLength;\n                currentChildLength++;\n            }\n            return;\n        }\n    }\n};\n\nCapturedTrace.prototype.parent = function() {\n    return this._parent;\n};\n\nCapturedTrace.prototype.hasParent = function() {\n    return this._parent !== undefined;\n};\n\nCapturedTrace.prototype.attachExtraTrace = function(error) {\n    if (error.__stackCleaned__) return;\n    this.uncycle();\n    var parsed = CapturedTrace.parseStackAndMessage(error);\n    var message = parsed.message;\n    var stacks = [parsed.stack];\n\n    var trace = this;\n    while (trace !== undefined) {\n        stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n        trace = trace._parent;\n    }\n    removeCommonRoots(stacks);\n    removeDuplicateOrEmptyJumps(stacks);\n    util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n    util.notEnumerableProp(error, \"__stackCleaned__\", true);\n};\n\nfunction reconstructStack(message, stacks) {\n    for (var i = 0; i < stacks.length - 1; ++i) {\n        stacks[i].push(\"From previous event:\");\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    if (i < stacks.length) {\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    return message + \"\\n\" + stacks.join(\"\\n\");\n}\n\nfunction removeDuplicateOrEmptyJumps(stacks) {\n    for (var i = 0; i < stacks.length; ++i) {\n        if (stacks[i].length === 0 ||\n            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {\n            stacks.splice(i, 1);\n            i--;\n        }\n    }\n}\n\nfunction removeCommonRoots(stacks) {\n    var current = stacks[0];\n    for (var i = 1; i < stacks.length; ++i) {\n        var prev = stacks[i];\n        var currentLastIndex = current.length - 1;\n        var currentLastLine = current[currentLastIndex];\n        var commonRootMeetPoint = -1;\n\n        for (var j = prev.length - 1; j >= 0; --j) {\n            if (prev[j] === currentLastLine) {\n                commonRootMeetPoint = j;\n                break;\n            }\n        }\n\n        for (var j = commonRootMeetPoint; j >= 0; --j) {\n            var line = prev[j];\n            if (current[currentLastIndex] === line) {\n                current.pop();\n                currentLastIndex--;\n            } else {\n                break;\n            }\n        }\n        current = prev;\n    }\n}\n\nfunction cleanStack(stack) {\n    var ret = [];\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        var isTraceLine = stackFramePattern.test(line) ||\n            \"    (No stack trace)\" === line;\n        var isInternalFrame = isTraceLine && shouldIgnore(line);\n        if (isTraceLine && !isInternalFrame) {\n            if (indentStackFrames && line.charAt(0) !== \" \") {\n                line = \"    \" + line;\n            }\n            ret.push(line);\n        }\n    }\n    return ret;\n}\n\nfunction stackFramesAsArray(error) {\n    var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        if (\"    (No stack trace)\" === line || stackFramePattern.test(line)) {\n            break;\n        }\n    }\n    if (i > 0) {\n        stack = stack.slice(i);\n    }\n    return stack;\n}\n\nCapturedTrace.parseStackAndMessage = function(error) {\n    var stack = error.stack;\n    var message = error.toString();\n    stack = typeof stack === \"string\" && stack.length > 0\n                ? stackFramesAsArray(error) : [\"    (No stack trace)\"];\n    return {\n        message: message,\n        stack: cleanStack(stack)\n    };\n};\n\nCapturedTrace.formatAndLogError = function(error, title) {\n    if (typeof console !== \"undefined\") {\n        var message;\n        if (typeof error === \"object\" || typeof error === \"function\") {\n            var stack = error.stack;\n            message = title + formatStack(stack, error);\n        } else {\n            message = title + String(error);\n        }\n        if (typeof warn === \"function\") {\n            warn(message);\n        } else if (typeof console.log === \"function\" ||\n            typeof console.log === \"object\") {\n            console.log(message);\n        }\n    }\n};\n\nCapturedTrace.unhandledRejection = function (reason) {\n    CapturedTrace.formatAndLogError(reason, \"^--- With additional stack trace: \");\n};\n\nCapturedTrace.isSupported = function () {\n    return typeof captureStackTrace === \"function\";\n};\n\nCapturedTrace.fireRejectionEvent =\nfunction(name, localHandler, reason, promise) {\n    var localEventFired = false;\n    try {\n        if (typeof localHandler === \"function\") {\n            localEventFired = true;\n            if (name === \"rejectionHandled\") {\n                localHandler(promise);\n            } else {\n                localHandler(reason, promise);\n            }\n        }\n    } catch (e) {\n        async.throwLater(e);\n    }\n\n    var globalEventFired = false;\n    try {\n        globalEventFired = fireGlobalEvent(name, reason, promise);\n    } catch (e) {\n        globalEventFired = true;\n        async.throwLater(e);\n    }\n\n    var domEventFired = false;\n    if (fireDomEvent) {\n        try {\n            domEventFired = fireDomEvent(name.toLowerCase(), {\n                reason: reason,\n                promise: promise\n            });\n        } catch (e) {\n            domEventFired = true;\n            async.throwLater(e);\n        }\n    }\n\n    if (!globalEventFired && !localEventFired && !domEventFired &&\n        name === \"unhandledRejection\") {\n        CapturedTrace.formatAndLogError(reason, \"Unhandled rejection \");\n    }\n};\n\nfunction formatNonError(obj) {\n    var str;\n    if (typeof obj === \"function\") {\n        str = \"[function \" +\n            (obj.name || \"anonymous\") +\n            \"]\";\n    } else {\n        str = obj.toString();\n        var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n        if (ruselessToString.test(str)) {\n            try {\n                var newStr = JSON.stringify(obj);\n                str = newStr;\n            }\n            catch(e) {\n\n            }\n        }\n        if (str.length === 0) {\n            str = \"(empty array)\";\n        }\n    }\n    return (\"(<\" + snip(str) + \">, no stack trace)\");\n}\n\nfunction snip(str) {\n    var maxChars = 41;\n    if (str.length < maxChars) {\n        return str;\n    }\n    return str.substr(0, maxChars - 3) + \"...\";\n}\n\nvar shouldIgnore = function() { return false; };\nvar parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\nfunction parseLineInfo(line) {\n    var matches = line.match(parseLineInfoRegex);\n    if (matches) {\n        return {\n            fileName: matches[1],\n            line: parseInt(matches[2], 10)\n        };\n    }\n}\nCapturedTrace.setBounds = function(firstLineError, lastLineError) {\n    if (!CapturedTrace.isSupported()) return;\n    var firstStackLines = firstLineError.stack.split(\"\\n\");\n    var lastStackLines = lastLineError.stack.split(\"\\n\");\n    var firstIndex = -1;\n    var lastIndex = -1;\n    var firstFileName;\n    var lastFileName;\n    for (var i = 0; i < firstStackLines.length; ++i) {\n        var result = parseLineInfo(firstStackLines[i]);\n        if (result) {\n            firstFileName = result.fileName;\n            firstIndex = result.line;\n            break;\n        }\n    }\n    for (var i = 0; i < lastStackLines.length; ++i) {\n        var result = parseLineInfo(lastStackLines[i]);\n        if (result) {\n            lastFileName = result.fileName;\n            lastIndex = result.line;\n            break;\n        }\n    }\n    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||\n        firstFileName !== lastFileName || firstIndex >= lastIndex) {\n        return;\n    }\n\n    shouldIgnore = function(line) {\n        if (bluebirdFramePattern.test(line)) return true;\n        var info = parseLineInfo(line);\n        if (info) {\n            if (info.fileName === firstFileName &&\n                (firstIndex <= info.line && info.line <= lastIndex)) {\n                return true;\n            }\n        }\n        return false;\n    };\n};\n\nvar captureStackTrace = (function stackDetection() {\n    var v8stackFramePattern = /^\\s*at\\s*/;\n    var v8stackFormatter = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if (error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    if (typeof Error.stackTraceLimit === \"number\" &&\n        typeof Error.captureStackTrace === \"function\") {\n        Error.stackTraceLimit = Error.stackTraceLimit + 6;\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        var captureStackTrace = Error.captureStackTrace;\n\n        shouldIgnore = function(line) {\n            return bluebirdFramePattern.test(line);\n        };\n        return function(receiver, ignoreUntil) {\n            Error.stackTraceLimit = Error.stackTraceLimit + 6;\n            captureStackTrace(receiver, ignoreUntil);\n            Error.stackTraceLimit = Error.stackTraceLimit - 6;\n        };\n    }\n    var err = new Error();\n\n    if (typeof err.stack === \"string\" &&\n        err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n        stackFramePattern = /@/;\n        formatStack = v8stackFormatter;\n        indentStackFrames = true;\n        return function captureStackTrace(o) {\n            o.stack = new Error().stack;\n        };\n    }\n\n    var hasStackAfterThrow;\n    try { throw new Error(); }\n    catch(e) {\n        hasStackAfterThrow = (\"stack\" in e);\n    }\n    if (!(\"stack\" in err) && hasStackAfterThrow &&\n        typeof Error.stackTraceLimit === \"number\") {\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        return function captureStackTrace(o) {\n            Error.stackTraceLimit = Error.stackTraceLimit + 6;\n            try { throw new Error(); }\n            catch(e) { o.stack = e.stack; }\n            Error.stackTraceLimit = Error.stackTraceLimit - 6;\n        };\n    }\n\n    formatStack = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if ((typeof error === \"object\" ||\n            typeof error === \"function\") &&\n            error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    return null;\n\n})([]);\n\nvar fireDomEvent;\nvar fireGlobalEvent = (function() {\n    if (util.isNode) {\n        return function(name, reason, promise) {\n            if (name === \"rejectionHandled\") {\n                return process.emit(name, promise);\n            } else {\n                return process.emit(name, reason, promise);\n            }\n        };\n    } else {\n        var customEventWorks = false;\n        var anyEventWorks = true;\n        try {\n            var ev = new self.CustomEvent(\"test\");\n            customEventWorks = ev instanceof CustomEvent;\n        } catch (e) {}\n        if (!customEventWorks) {\n            try {\n                var event = document.createEvent(\"CustomEvent\");\n                event.initCustomEvent(\"testingtheevent\", false, true, {});\n                self.dispatchEvent(event);\n            } catch (e) {\n                anyEventWorks = false;\n            }\n        }\n        if (anyEventWorks) {\n            fireDomEvent = function(type, detail) {\n                var event;\n                if (customEventWorks) {\n                    event = new self.CustomEvent(type, {\n                        detail: detail,\n                        bubbles: false,\n                        cancelable: true\n                    });\n                } else if (self.dispatchEvent) {\n                    event = document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, false, true, detail);\n                }\n\n                return event ? !self.dispatchEvent(event) : false;\n            };\n        }\n\n        var toWindowMethodNameMap = {};\n        toWindowMethodNameMap[\"unhandledRejection\"] = (\"on\" +\n            \"unhandledRejection\").toLowerCase();\n        toWindowMethodNameMap[\"rejectionHandled\"] = (\"on\" +\n            \"rejectionHandled\").toLowerCase();\n\n        return function(name, reason, promise) {\n            var methodName = toWindowMethodNameMap[name];\n            var method = self[methodName];\n            if (!method) return false;\n            if (name === \"rejectionHandled\") {\n                method.call(self, promise);\n            } else {\n                method.call(self, reason, promise);\n            }\n            return true;\n        };\n    }\n})();\n\nif (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n    warn = function (message) {\n        console.warn(message);\n    };\n    if (util.isNode && process.stderr.isTTY) {\n        warn = function(message) {\n            process.stderr.write(\"\\u001b[31m\" + message + \"\\u001b[39m\\n\");\n        };\n    } else if (!util.isNode && typeof (new Error().stack) === \"string\") {\n        warn = function(message) {\n            console.warn(\"%c\" + message, \"color: red\");\n        };\n    }\n}\n\nreturn CapturedTrace;\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],8:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(NEXT_FILTER) {\nvar util = _dereq_(\"./util.js\");\nvar errors = _dereq_(\"./errors.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar keys = _dereq_(\"./es5.js\").keys;\nvar TypeError = errors.TypeError;\n\nfunction CatchFilter(instances, callback, promise) {\n    this._instances = instances;\n    this._callback = callback;\n    this._promise = promise;\n}\n\nfunction safePredicate(predicate, e) {\n    var safeObject = {};\n    var retfilter = tryCatch(predicate).call(safeObject, e);\n\n    if (retfilter === errorObj) return retfilter;\n\n    var safeKeys = keys(safeObject);\n    if (safeKeys.length) {\n        errorObj.e = new TypeError(\"Catch filter must inherit from Error or be a simple predicate function\\u000a\\u000a    See http://goo.gl/o84o68\\u000a\");\n        return errorObj;\n    }\n    return retfilter;\n}\n\nCatchFilter.prototype.doFilter = function (e) {\n    var cb = this._callback;\n    var promise = this._promise;\n    var boundTo = promise._boundValue();\n    for (var i = 0, len = this._instances.length; i < len; ++i) {\n        var item = this._instances[i];\n        var itemIsErrorType = item === Error ||\n            (item != null && item.prototype instanceof Error);\n\n        if (itemIsErrorType && e instanceof item) {\n            var ret = tryCatch(cb).call(boundTo, e);\n            if (ret === errorObj) {\n                NEXT_FILTER.e = ret.e;\n                return NEXT_FILTER;\n            }\n            return ret;\n        } else if (typeof item === \"function\" && !itemIsErrorType) {\n            var shouldHandle = safePredicate(item, e);\n            if (shouldHandle === errorObj) {\n                e = errorObj.e;\n                break;\n            } else if (shouldHandle) {\n                var ret = tryCatch(cb).call(boundTo, e);\n                if (ret === errorObj) {\n                    NEXT_FILTER.e = ret.e;\n                    return NEXT_FILTER;\n                }\n                return ret;\n            }\n        }\n    }\n    NEXT_FILTER.e = e;\n    return NEXT_FILTER;\n};\n\nreturn CatchFilter;\n};\n\n},{\"./errors.js\":13,\"./es5.js\":14,\"./util.js\":38}],9:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, CapturedTrace, isDebugging) {\nvar contextStack = [];\nfunction Context() {\n    this._trace = new CapturedTrace(peekContext());\n}\nContext.prototype._pushContext = function () {\n    if (!isDebugging()) return;\n    if (this._trace !== undefined) {\n        contextStack.push(this._trace);\n    }\n};\n\nContext.prototype._popContext = function () {\n    if (!isDebugging()) return;\n    if (this._trace !== undefined) {\n        contextStack.pop();\n    }\n};\n\nfunction createContext() {\n    if (isDebugging()) return new Context();\n}\n\nfunction peekContext() {\n    var lastIndex = contextStack.length - 1;\n    if (lastIndex >= 0) {\n        return contextStack[lastIndex];\n    }\n    return undefined;\n}\n\nPromise.prototype._peekContext = peekContext;\nPromise.prototype._pushContext = Context.prototype._pushContext;\nPromise.prototype._popContext = Context.prototype._popContext;\n\nreturn createContext;\n};\n\n},{}],10:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, CapturedTrace) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar Warning = _dereq_(\"./errors.js\").Warning;\nvar util = _dereq_(\"./util.js\");\nvar canAttachTrace = util.canAttachTrace;\nvar unhandledRejectionHandled;\nvar possiblyUnhandledRejection;\nvar debugging = false || (util.isNode &&\n                    (!!Object({\"NODE_ENV\":\"production\"})[\"BLUEBIRD_DEBUG\"] ||\n                     \"production\" === \"development\"));\n\nif (util.isNode && Object({\"NODE_ENV\":\"production\"})[\"BLUEBIRD_DEBUG\"] == 0) debugging = false;\n\nif (debugging) {\n    async.disableTrampolineIfNecessary();\n}\n\nPromise.prototype._ignoreRejections = function() {\n    this._unsetRejectionIsUnhandled();\n    this._bitField = this._bitField | 16777216;\n};\n\nPromise.prototype._ensurePossibleRejectionHandled = function () {\n    if ((this._bitField & 16777216) !== 0) return;\n    this._setRejectionIsUnhandled();\n    async.invokeLater(this._notifyUnhandledRejection, this, undefined);\n};\n\nPromise.prototype._notifyUnhandledRejectionIsHandled = function () {\n    CapturedTrace.fireRejectionEvent(\"rejectionHandled\",\n                                  unhandledRejectionHandled, undefined, this);\n};\n\nPromise.prototype._notifyUnhandledRejection = function () {\n    if (this._isRejectionUnhandled()) {\n        var reason = this._getCarriedStackTrace() || this._settledValue;\n        this._setUnhandledRejectionIsNotified();\n        CapturedTrace.fireRejectionEvent(\"unhandledRejection\",\n                                      possiblyUnhandledRejection, reason, this);\n    }\n};\n\nPromise.prototype._setUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField | 524288;\n};\n\nPromise.prototype._unsetUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField & (~524288);\n};\n\nPromise.prototype._isUnhandledRejectionNotified = function () {\n    return (this._bitField & 524288) > 0;\n};\n\nPromise.prototype._setRejectionIsUnhandled = function () {\n    this._bitField = this._bitField | 2097152;\n};\n\nPromise.prototype._unsetRejectionIsUnhandled = function () {\n    this._bitField = this._bitField & (~2097152);\n    if (this._isUnhandledRejectionNotified()) {\n        this._unsetUnhandledRejectionIsNotified();\n        this._notifyUnhandledRejectionIsHandled();\n    }\n};\n\nPromise.prototype._isRejectionUnhandled = function () {\n    return (this._bitField & 2097152) > 0;\n};\n\nPromise.prototype._setCarriedStackTrace = function (capturedTrace) {\n    this._bitField = this._bitField | 1048576;\n    this._fulfillmentHandler0 = capturedTrace;\n};\n\nPromise.prototype._isCarryingStackTrace = function () {\n    return (this._bitField & 1048576) > 0;\n};\n\nPromise.prototype._getCarriedStackTrace = function () {\n    return this._isCarryingStackTrace()\n        ? this._fulfillmentHandler0\n        : undefined;\n};\n\nPromise.prototype._captureStackTrace = function () {\n    if (debugging) {\n        this._trace = new CapturedTrace(this._peekContext());\n    }\n    return this;\n};\n\nPromise.prototype._attachExtraTrace = function (error, ignoreSelf) {\n    if (debugging && canAttachTrace(error)) {\n        var trace = this._trace;\n        if (trace !== undefined) {\n            if (ignoreSelf) trace = trace._parent;\n        }\n        if (trace !== undefined) {\n            trace.attachExtraTrace(error);\n        } else if (!error.__stackCleaned__) {\n            var parsed = CapturedTrace.parseStackAndMessage(error);\n            util.notEnumerableProp(error, \"stack\",\n                parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n            util.notEnumerableProp(error, \"__stackCleaned__\", true);\n        }\n    }\n};\n\nPromise.prototype._warn = function(message) {\n    var warning = new Warning(message);\n    var ctx = this._peekContext();\n    if (ctx) {\n        ctx.attachExtraTrace(warning);\n    } else {\n        var parsed = CapturedTrace.parseStackAndMessage(warning);\n        warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n    }\n    CapturedTrace.formatAndLogError(warning, \"\");\n};\n\nPromise.onPossiblyUnhandledRejection = function (fn) {\n    var domain = getDomain();\n    possiblyUnhandledRejection =\n        typeof fn === \"function\" ? (domain === null ? fn : domain.bind(fn))\n                                 : undefined;\n};\n\nPromise.onUnhandledRejectionHandled = function (fn) {\n    var domain = getDomain();\n    unhandledRejectionHandled =\n        typeof fn === \"function\" ? (domain === null ? fn : domain.bind(fn))\n                                 : undefined;\n};\n\nPromise.longStackTraces = function () {\n    if (async.haveItemsQueued() &&\n        debugging === false\n   ) {\n        throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/DT1qyG\\u000a\");\n    }\n    debugging = CapturedTrace.isSupported();\n    if (debugging) {\n        async.disableTrampolineIfNecessary();\n    }\n};\n\nPromise.hasLongStackTraces = function () {\n    return debugging && CapturedTrace.isSupported();\n};\n\nif (!CapturedTrace.isSupported()) {\n    Promise.longStackTraces = function(){};\n    debugging = false;\n}\n\nreturn function() {\n    return debugging;\n};\n};\n\n},{\"./async.js\":2,\"./errors.js\":13,\"./util.js\":38}],11:[function(_dereq_,module,exports){\n\"use strict\";\nvar util = _dereq_(\"./util.js\");\nvar isPrimitive = util.isPrimitive;\n\nmodule.exports = function(Promise) {\nvar returner = function () {\n    return this;\n};\nvar thrower = function () {\n    throw this;\n};\nvar returnUndefined = function() {};\nvar throwUndefined = function() {\n    throw undefined;\n};\n\nvar wrapper = function (value, action) {\n    if (action === 1) {\n        return function () {\n            throw value;\n        };\n    } else if (action === 2) {\n        return function () {\n            return value;\n        };\n    }\n};\n\n\nPromise.prototype[\"return\"] =\nPromise.prototype.thenReturn = function (value) {\n    if (value === undefined) return this.then(returnUndefined);\n\n    if (isPrimitive(value)) {\n        return this._then(\n            wrapper(value, 2),\n            undefined,\n            undefined,\n            undefined,\n            undefined\n       );\n    } else if (value instanceof Promise) {\n        value._ignoreRejections();\n    }\n    return this._then(returner, undefined, undefined, value, undefined);\n};\n\nPromise.prototype[\"throw\"] =\nPromise.prototype.thenThrow = function (reason) {\n    if (reason === undefined) return this.then(throwUndefined);\n\n    if (isPrimitive(reason)) {\n        return this._then(\n            wrapper(reason, 1),\n            undefined,\n            undefined,\n            undefined,\n            undefined\n       );\n    }\n    return this._then(thrower, undefined, undefined, reason, undefined);\n};\n};\n\n},{\"./util.js\":38}],12:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseReduce = Promise.reduce;\n\nPromise.prototype.each = function (fn) {\n    return PromiseReduce(this, fn, null, INTERNAL);\n};\n\nPromise.each = function (promises, fn) {\n    return PromiseReduce(promises, fn, null, INTERNAL);\n};\n};\n\n},{}],13:[function(_dereq_,module,exports){\n\"use strict\";\nvar es5 = _dereq_(\"./es5.js\");\nvar Objectfreeze = es5.freeze;\nvar util = _dereq_(\"./util.js\");\nvar inherits = util.inherits;\nvar notEnumerableProp = util.notEnumerableProp;\n\nfunction subError(nameProperty, defaultMessage) {\n    function SubError(message) {\n        if (!(this instanceof SubError)) return new SubError(message);\n        notEnumerableProp(this, \"message\",\n            typeof message === \"string\" ? message : defaultMessage);\n        notEnumerableProp(this, \"name\", nameProperty);\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            Error.call(this);\n        }\n    }\n    inherits(SubError, Error);\n    return SubError;\n}\n\nvar _TypeError, _RangeError;\nvar Warning = subError(\"Warning\", \"warning\");\nvar CancellationError = subError(\"CancellationError\", \"cancellation error\");\nvar TimeoutError = subError(\"TimeoutError\", \"timeout error\");\nvar AggregateError = subError(\"AggregateError\", \"aggregate error\");\ntry {\n    _TypeError = TypeError;\n    _RangeError = RangeError;\n} catch(e) {\n    _TypeError = subError(\"TypeError\", \"type error\");\n    _RangeError = subError(\"RangeError\", \"range error\");\n}\n\nvar methods = (\"join pop push shift unshift slice filter forEach some \" +\n    \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\nfor (var i = 0; i < methods.length; ++i) {\n    if (typeof Array.prototype[methods[i]] === \"function\") {\n        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n    }\n}\n\nes5.defineProperty(AggregateError.prototype, \"length\", {\n    value: 0,\n    configurable: false,\n    writable: true,\n    enumerable: true\n});\nAggregateError.prototype[\"isOperational\"] = true;\nvar level = 0;\nAggregateError.prototype.toString = function() {\n    var indent = Array(level * 4 + 1).join(\" \");\n    var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n    level++;\n    indent = Array(level * 4 + 1).join(\" \");\n    for (var i = 0; i < this.length; ++i) {\n        var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n        var lines = str.split(\"\\n\");\n        for (var j = 0; j < lines.length; ++j) {\n            lines[j] = indent + lines[j];\n        }\n        str = lines.join(\"\\n\");\n        ret += str + \"\\n\";\n    }\n    level--;\n    return ret;\n};\n\nfunction OperationalError(message) {\n    if (!(this instanceof OperationalError))\n        return new OperationalError(message);\n    notEnumerableProp(this, \"name\", \"OperationalError\");\n    notEnumerableProp(this, \"message\", message);\n    this.cause = message;\n    this[\"isOperational\"] = true;\n\n    if (message instanceof Error) {\n        notEnumerableProp(this, \"message\", message.message);\n        notEnumerableProp(this, \"stack\", message.stack);\n    } else if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor);\n    }\n\n}\ninherits(OperationalError, Error);\n\nvar errorTypes = Error[\"__BluebirdErrorTypes__\"];\nif (!errorTypes) {\n    errorTypes = Objectfreeze({\n        CancellationError: CancellationError,\n        TimeoutError: TimeoutError,\n        OperationalError: OperationalError,\n        RejectionError: OperationalError,\n        AggregateError: AggregateError\n    });\n    notEnumerableProp(Error, \"__BluebirdErrorTypes__\", errorTypes);\n}\n\nmodule.exports = {\n    Error: Error,\n    TypeError: _TypeError,\n    RangeError: _RangeError,\n    CancellationError: errorTypes.CancellationError,\n    OperationalError: errorTypes.OperationalError,\n    TimeoutError: errorTypes.TimeoutError,\n    AggregateError: errorTypes.AggregateError,\n    Warning: Warning\n};\n\n},{\"./es5.js\":14,\"./util.js\":38}],14:[function(_dereq_,module,exports){\nvar isES5 = (function(){\n    \"use strict\";\n    return this === undefined;\n})();\n\nif (isES5) {\n    module.exports = {\n        freeze: Object.freeze,\n        defineProperty: Object.defineProperty,\n        getDescriptor: Object.getOwnPropertyDescriptor,\n        keys: Object.keys,\n        names: Object.getOwnPropertyNames,\n        getPrototypeOf: Object.getPrototypeOf,\n        isArray: Array.isArray,\n        isES5: isES5,\n        propertyIsWritable: function(obj, prop) {\n            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n            return !!(!descriptor || descriptor.writable || descriptor.set);\n        }\n    };\n} else {\n    var has = {}.hasOwnProperty;\n    var str = {}.toString;\n    var proto = {}.constructor.prototype;\n\n    var ObjectKeys = function (o) {\n        var ret = [];\n        for (var key in o) {\n            if (has.call(o, key)) {\n                ret.push(key);\n            }\n        }\n        return ret;\n    };\n\n    var ObjectGetDescriptor = function(o, key) {\n        return {value: o[key]};\n    };\n\n    var ObjectDefineProperty = function (o, key, desc) {\n        o[key] = desc.value;\n        return o;\n    };\n\n    var ObjectFreeze = function (obj) {\n        return obj;\n    };\n\n    var ObjectGetPrototypeOf = function (obj) {\n        try {\n            return Object(obj).constructor.prototype;\n        }\n        catch (e) {\n            return proto;\n        }\n    };\n\n    var ArrayIsArray = function (obj) {\n        try {\n            return str.call(obj) === \"[object Array]\";\n        }\n        catch(e) {\n            return false;\n        }\n    };\n\n    module.exports = {\n        isArray: ArrayIsArray,\n        keys: ObjectKeys,\n        names: ObjectKeys,\n        defineProperty: ObjectDefineProperty,\n        getDescriptor: ObjectGetDescriptor,\n        freeze: ObjectFreeze,\n        getPrototypeOf: ObjectGetPrototypeOf,\n        isES5: isES5,\n        propertyIsWritable: function() {\n            return true;\n        }\n    };\n}\n\n},{}],15:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseMap = Promise.map;\n\nPromise.prototype.filter = function (fn, options) {\n    return PromiseMap(this, fn, options, INTERNAL);\n};\n\nPromise.filter = function (promises, fn, options) {\n    return PromiseMap(promises, fn, options, INTERNAL);\n};\n};\n\n},{}],16:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {\nvar util = _dereq_(\"./util.js\");\nvar isPrimitive = util.isPrimitive;\nvar thrower = util.thrower;\n\nfunction returnThis() {\n    return this;\n}\nfunction throwThis() {\n    throw this;\n}\nfunction return$(r) {\n    return function() {\n        return r;\n    };\n}\nfunction throw$(r) {\n    return function() {\n        throw r;\n    };\n}\nfunction promisedFinally(ret, reasonOrValue, isFulfilled) {\n    var then;\n    if (isPrimitive(reasonOrValue)) {\n        then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);\n    } else {\n        then = isFulfilled ? returnThis : throwThis;\n    }\n    return ret._then(then, thrower, undefined, reasonOrValue, undefined);\n}\n\nfunction finallyHandler(reasonOrValue) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    var ret = promise._isBound()\n                    ? handler.call(promise._boundValue())\n                    : handler();\n\n    if (ret !== undefined) {\n        var maybePromise = tryConvertToPromise(ret, promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            return promisedFinally(maybePromise, reasonOrValue,\n                                    promise.isFulfilled());\n        }\n    }\n\n    if (promise.isRejected()) {\n        NEXT_FILTER.e = reasonOrValue;\n        return NEXT_FILTER;\n    } else {\n        return reasonOrValue;\n    }\n}\n\nfunction tapHandler(value) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    var ret = promise._isBound()\n                    ? handler.call(promise._boundValue(), value)\n                    : handler(value);\n\n    if (ret !== undefined) {\n        var maybePromise = tryConvertToPromise(ret, promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            return promisedFinally(maybePromise, value, true);\n        }\n    }\n    return value;\n}\n\nPromise.prototype._passThroughHandler = function (handler, isFinally) {\n    if (typeof handler !== \"function\") return this.then();\n\n    var promiseAndHandler = {\n        promise: this,\n        handler: handler\n    };\n\n    return this._then(\n            isFinally ? finallyHandler : tapHandler,\n            isFinally ? finallyHandler : undefined, undefined,\n            promiseAndHandler, undefined);\n};\n\nPromise.prototype.lastly =\nPromise.prototype[\"finally\"] = function (handler) {\n    return this._passThroughHandler(handler, true);\n};\n\nPromise.prototype.tap = function (handler) {\n    return this._passThroughHandler(handler, false);\n};\n};\n\n},{\"./util.js\":38}],17:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          apiRejection,\n                          INTERNAL,\n                          tryConvertToPromise) {\nvar errors = _dereq_(\"./errors.js\");\nvar TypeError = errors.TypeError;\nvar util = _dereq_(\"./util.js\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nvar yieldHandlers = [];\n\nfunction promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n    for (var i = 0; i < yieldHandlers.length; ++i) {\n        traceParent._pushContext();\n        var result = tryCatch(yieldHandlers[i])(value);\n        traceParent._popContext();\n        if (result === errorObj) {\n            traceParent._pushContext();\n            var ret = Promise.reject(errorObj.e);\n            traceParent._popContext();\n            return ret;\n        }\n        var maybePromise = tryConvertToPromise(result, traceParent);\n        if (maybePromise instanceof Promise) return maybePromise;\n    }\n    return null;\n}\n\nfunction PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n    var promise = this._promise = new Promise(INTERNAL);\n    promise._captureStackTrace();\n    this._stack = stack;\n    this._generatorFunction = generatorFunction;\n    this._receiver = receiver;\n    this._generator = undefined;\n    this._yieldHandlers = typeof yieldHandler === \"function\"\n        ? [yieldHandler].concat(yieldHandlers)\n        : yieldHandlers;\n}\n\nPromiseSpawn.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseSpawn.prototype._run = function () {\n    this._generator = this._generatorFunction.call(this._receiver);\n    this._receiver =\n        this._generatorFunction = undefined;\n    this._next(undefined);\n};\n\nPromiseSpawn.prototype._continue = function (result) {\n    if (result === errorObj) {\n        return this._promise._rejectCallback(result.e, false, true);\n    }\n\n    var value = result.value;\n    if (result.done === true) {\n        this._promise._resolveCallback(value);\n    } else {\n        var maybePromise = tryConvertToPromise(value, this._promise);\n        if (!(maybePromise instanceof Promise)) {\n            maybePromise =\n                promiseFromYieldHandler(maybePromise,\n                                        this._yieldHandlers,\n                                        this._promise);\n            if (maybePromise === null) {\n                this._throw(\n                    new TypeError(\n                        \"A value %s was yielded that could not be treated as a promise\\u000a\\u000a    See http://goo.gl/4Y4pDk\\u000a\\u000a\".replace(\"%s\", value) +\n                        \"From coroutine:\\u000a\" +\n                        this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")\n                    )\n                );\n                return;\n            }\n        }\n        maybePromise._then(\n            this._next,\n            this._throw,\n            undefined,\n            this,\n            null\n       );\n    }\n};\n\nPromiseSpawn.prototype._throw = function (reason) {\n    this._promise._attachExtraTrace(reason);\n    this._promise._pushContext();\n    var result = tryCatch(this._generator[\"throw\"])\n        .call(this._generator, reason);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._next = function (value) {\n    this._promise._pushContext();\n    var result = tryCatch(this._generator.next).call(this._generator, value);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromise.coroutine = function (generatorFunction, options) {\n    if (typeof generatorFunction !== \"function\") {\n        throw new TypeError(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/6Vqhm0\\u000a\");\n    }\n    var yieldHandler = Object(options).yieldHandler;\n    var PromiseSpawn$ = PromiseSpawn;\n    var stack = new Error().stack;\n    return function () {\n        var generator = generatorFunction.apply(this, arguments);\n        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,\n                                      stack);\n        spawn._generator = generator;\n        spawn._next(undefined);\n        return spawn.promise();\n    };\n};\n\nPromise.coroutine.addYieldHandler = function(fn) {\n    if (typeof fn !== \"function\") throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    yieldHandlers.push(fn);\n};\n\nPromise.spawn = function (generatorFunction) {\n    if (typeof generatorFunction !== \"function\") {\n        return apiRejection(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/6Vqhm0\\u000a\");\n    }\n    var spawn = new PromiseSpawn(generatorFunction, this);\n    var ret = spawn.promise();\n    spawn._run(Promise.spawn);\n    return ret;\n};\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],18:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar canEvaluate = util.canEvaluate;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar reject;\n\nif (false) {\nif (canEvaluate) {\n    var thenCallback = function(i) {\n        return new Function(\"value\", \"holder\", \"                             \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = value;                                           \\n\\\n            holder.checkFulfillment(this);                                   \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var caller = function(count) {\n        var values = [];\n        for (var i = 1; i <= count; ++i) values.push(\"holder.p\" + i);\n        return new Function(\"holder\", \"                                      \\n\\\n            'use strict';                                                    \\n\\\n            var callback = holder.fn;                                        \\n\\\n            return callback(values);                                         \\n\\\n            \".replace(/values/g, values.join(\", \")));\n    };\n    var thenCallbacks = [];\n    var callers = [undefined];\n    for (var i = 1; i <= 5; ++i) {\n        thenCallbacks.push(thenCallback(i));\n        callers.push(caller(i));\n    }\n\n    var Holder = function(total, fn) {\n        this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;\n        this.fn = fn;\n        this.total = total;\n        this.now = 0;\n    };\n\n    Holder.prototype.callers = callers;\n    Holder.prototype.checkFulfillment = function(promise) {\n        var now = this.now;\n        now++;\n        var total = this.total;\n        if (now >= total) {\n            var handler = this.callers[total];\n            promise._pushContext();\n            var ret = tryCatch(handler)(this);\n            promise._popContext();\n            if (ret === errorObj) {\n                promise._rejectCallback(ret.e, false, true);\n            } else {\n                promise._resolveCallback(ret);\n            }\n        } else {\n            this.now = now;\n        }\n    };\n\n    var reject = function (reason) {\n        this._reject(reason);\n    };\n}\n}\n\nPromise.join = function () {\n    var last = arguments.length - 1;\n    var fn;\n    if (last > 0 && typeof arguments[last] === \"function\") {\n        fn = arguments[last];\n        if (false) {\n            if (last < 6 && canEvaluate) {\n                var ret = new Promise(INTERNAL);\n                ret._captureStackTrace();\n                var holder = new Holder(last, fn);\n                var callbacks = thenCallbacks;\n                for (var i = 0; i < last; ++i) {\n                    var maybePromise = tryConvertToPromise(arguments[i], ret);\n                    if (maybePromise instanceof Promise) {\n                        maybePromise = maybePromise._target();\n                        if (maybePromise._isPending()) {\n                            maybePromise._then(callbacks[i], reject,\n                                               undefined, ret, holder);\n                        } else if (maybePromise._isFulfilled()) {\n                            callbacks[i].call(ret,\n                                              maybePromise._value(), holder);\n                        } else {\n                            ret._reject(maybePromise._reason());\n                        }\n                    } else {\n                        callbacks[i].call(ret, maybePromise, holder);\n                    }\n                }\n                return ret;\n            }\n        }\n    }\n    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}\n    if (fn) args.pop();\n    var ret = new PromiseArray(args).promise();\n    return fn !== undefined ? ret.spread(fn) : ret;\n};\n\n};\n\n},{\"./util.js\":38}],19:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar PENDING = {};\nvar EMPTY_ARRAY = [];\n\nfunction MappingPromiseArray(promises, fn, limit, _filter) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    var domain = getDomain();\n    this._callback = domain === null ? fn : domain.bind(fn);\n    this._preservedValues = _filter === INTERNAL\n        ? new Array(this.length())\n        : null;\n    this._limit = limit;\n    this._inFlight = 0;\n    this._queue = limit >= 1 ? [] : EMPTY_ARRAY;\n    async.invoke(init, this, undefined);\n}\nutil.inherits(MappingPromiseArray, PromiseArray);\nfunction init() {this._init$(undefined, -2);}\n\nMappingPromiseArray.prototype._init = function () {};\n\nMappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var limit = this._limit;\n    if (values[index] === PENDING) {\n        values[index] = value;\n        if (limit >= 1) {\n            this._inFlight--;\n            this._drainQueue();\n            if (this._isResolved()) return;\n        }\n    } else {\n        if (limit >= 1 && this._inFlight >= limit) {\n            values[index] = value;\n            this._queue.push(index);\n            return;\n        }\n        if (preservedValues !== null) preservedValues[index] = value;\n\n        var callback = this._callback;\n        var receiver = this._promise._boundValue();\n        this._promise._pushContext();\n        var ret = tryCatch(callback).call(receiver, value, index, length);\n        this._promise._popContext();\n        if (ret === errorObj) return this._reject(ret.e);\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (maybePromise._isPending()) {\n                if (limit >= 1) this._inFlight++;\n                values[index] = PENDING;\n                return maybePromise._proxyPromiseArray(this, index);\n            } else if (maybePromise._isFulfilled()) {\n                ret = maybePromise._value();\n            } else {\n                return this._reject(maybePromise._reason());\n            }\n        }\n        values[index] = ret;\n    }\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= length) {\n        if (preservedValues !== null) {\n            this._filter(values, preservedValues);\n        } else {\n            this._resolve(values);\n        }\n\n    }\n};\n\nMappingPromiseArray.prototype._drainQueue = function () {\n    var queue = this._queue;\n    var limit = this._limit;\n    var values = this._values;\n    while (queue.length > 0 && this._inFlight < limit) {\n        if (this._isResolved()) return;\n        var index = queue.pop();\n        this._promiseFulfilled(values[index], index);\n    }\n};\n\nMappingPromiseArray.prototype._filter = function (booleans, values) {\n    var len = values.length;\n    var ret = new Array(len);\n    var j = 0;\n    for (var i = 0; i < len; ++i) {\n        if (booleans[i]) ret[j++] = values[i];\n    }\n    ret.length = j;\n    this._resolve(ret);\n};\n\nMappingPromiseArray.prototype.preservedValues = function () {\n    return this._preservedValues;\n};\n\nfunction map(promises, fn, options, _filter) {\n    var limit = typeof options === \"object\" && options !== null\n        ? options.concurrency\n        : 0;\n    limit = typeof limit === \"number\" &&\n        isFinite(limit) && limit >= 1 ? limit : 0;\n    return new MappingPromiseArray(promises, fn, limit, _filter);\n}\n\nPromise.prototype.map = function (fn, options) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n\n    return map(this, fn, options, null).promise();\n};\n\nPromise.map = function (promises, fn, options, _filter) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    return map(promises, fn, options, _filter).promise();\n};\n\n\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],20:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\n\nPromise.method = function (fn) {\n    if (typeof fn !== \"function\") {\n        throw new Promise.TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    return function () {\n        var ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._pushContext();\n        var value = tryCatch(fn).apply(this, arguments);\n        ret._popContext();\n        ret._resolveFromSyncValue(value);\n        return ret;\n    };\n};\n\nPromise.attempt = Promise[\"try\"] = function (fn, args, ctx) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._pushContext();\n    var value = util.isArray(args)\n        ? tryCatch(fn).apply(ctx, args)\n        : tryCatch(fn).call(ctx, args);\n    ret._popContext();\n    ret._resolveFromSyncValue(value);\n    return ret;\n};\n\nPromise.prototype._resolveFromSyncValue = function (value) {\n    if (value === util.errorObj) {\n        this._rejectCallback(value.e, false, true);\n    } else {\n        this._resolveCallback(value, true);\n    }\n};\n};\n\n},{\"./util.js\":38}],21:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar util = _dereq_(\"./util.js\");\nvar async = _dereq_(\"./async.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction spreadAdapter(val, nodeback) {\n    var promise = this;\n    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n    var ret =\n        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nfunction successAdapter(val, nodeback) {\n    var promise = this;\n    var receiver = promise._boundValue();\n    var ret = val === undefined\n        ? tryCatch(nodeback).call(receiver, null)\n        : tryCatch(nodeback).call(receiver, null, val);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\nfunction errorAdapter(reason, nodeback) {\n    var promise = this;\n    if (!reason) {\n        var target = promise._target();\n        var newReason = target._getCarriedStackTrace();\n        newReason.cause = reason;\n        reason = newReason;\n    }\n    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nPromise.prototype.asCallback =\nPromise.prototype.nodeify = function (nodeback, options) {\n    if (typeof nodeback == \"function\") {\n        var adapter = successAdapter;\n        if (options !== undefined && Object(options).spread) {\n            adapter = spreadAdapter;\n        }\n        this._then(\n            adapter,\n            errorAdapter,\n            undefined,\n            this,\n            nodeback\n        );\n    }\n    return this;\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],22:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, PromiseArray) {\nvar util = _dereq_(\"./util.js\");\nvar async = _dereq_(\"./async.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nPromise.prototype.progressed = function (handler) {\n    return this._then(undefined, undefined, handler, undefined, undefined);\n};\n\nPromise.prototype._progress = function (progressValue) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._target()._progressUnchecked(progressValue);\n\n};\n\nPromise.prototype._progressHandlerAt = function (index) {\n    return index === 0\n        ? this._progressHandler0\n        : this[(index << 2) + index - 5 + 2];\n};\n\nPromise.prototype._doProgressWith = function (progression) {\n    var progressValue = progression.value;\n    var handler = progression.handler;\n    var promise = progression.promise;\n    var receiver = progression.receiver;\n\n    var ret = tryCatch(handler).call(receiver, progressValue);\n    if (ret === errorObj) {\n        if (ret.e != null &&\n            ret.e.name !== \"StopProgressPropagation\") {\n            var trace = util.canAttachTrace(ret.e)\n                ? ret.e : new Error(util.toString(ret.e));\n            promise._attachExtraTrace(trace);\n            promise._progress(ret.e);\n        }\n    } else if (ret instanceof Promise) {\n        ret._then(promise._progress, null, null, promise, undefined);\n    } else {\n        promise._progress(ret);\n    }\n};\n\n\nPromise.prototype._progressUnchecked = function (progressValue) {\n    var len = this._length();\n    var progress = this._progress;\n    for (var i = 0; i < len; i++) {\n        var handler = this._progressHandlerAt(i);\n        var promise = this._promiseAt(i);\n        if (!(promise instanceof Promise)) {\n            var receiver = this._receiverAt(i);\n            if (typeof handler === \"function\") {\n                handler.call(receiver, progressValue, promise);\n            } else if (receiver instanceof PromiseArray &&\n                       !receiver._isResolved()) {\n                receiver._promiseProgressed(progressValue, promise);\n            }\n            continue;\n        }\n\n        if (typeof handler === \"function\") {\n            async.invoke(this._doProgressWith, this, {\n                handler: handler,\n                promise: promise,\n                receiver: this._receiverAt(i),\n                value: progressValue\n            });\n        } else {\n            async.invoke(progress, promise, progressValue);\n        }\n    }\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],23:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function() {\nvar makeSelfResolutionError = function () {\n    return new TypeError(\"circular promise resolution chain\\u000a\\u000a    See http://goo.gl/LhFpo0\\u000a\");\n};\nvar reflect = function() {\n    return new Promise.PromiseInspection(this._target());\n};\nvar apiRejection = function(msg) {\n    return Promise.reject(new TypeError(msg));\n};\n\nvar util = _dereq_(\"./util.js\");\n\nvar getDomain;\nif (util.isNode) {\n    getDomain = function() {\n        var ret = process.domain;\n        if (ret === undefined) ret = null;\n        return ret;\n    };\n} else {\n    getDomain = function() {\n        return null;\n    };\n}\nutil.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\nvar UNDEFINED_BINDING = {};\nvar async = _dereq_(\"./async.js\");\nvar errors = _dereq_(\"./errors.js\");\nvar TypeError = Promise.TypeError = errors.TypeError;\nPromise.RangeError = errors.RangeError;\nPromise.CancellationError = errors.CancellationError;\nPromise.TimeoutError = errors.TimeoutError;\nPromise.OperationalError = errors.OperationalError;\nPromise.RejectionError = errors.OperationalError;\nPromise.AggregateError = errors.AggregateError;\nvar INTERNAL = function(){};\nvar APPLY = {};\nvar NEXT_FILTER = {e: null};\nvar tryConvertToPromise = _dereq_(\"./thenables.js\")(Promise, INTERNAL);\nvar PromiseArray =\n    _dereq_(\"./promise_array.js\")(Promise, INTERNAL,\n                                    tryConvertToPromise, apiRejection);\nvar CapturedTrace = _dereq_(\"./captured_trace.js\")();\nvar isDebugging = _dereq_(\"./debuggability.js\")(Promise, CapturedTrace);\n /*jshint unused:false*/\nvar createContext =\n    _dereq_(\"./context.js\")(Promise, CapturedTrace, isDebugging);\nvar CatchFilter = _dereq_(\"./catch_filter.js\")(NEXT_FILTER);\nvar PromiseResolver = _dereq_(\"./promise_resolver.js\");\nvar nodebackForPromise = PromiseResolver._nodebackForPromise;\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\n\nfunction Promise(resolver) {\n    if (typeof resolver !== \"function\") {\n        throw new TypeError(\"the promise constructor requires a resolver function\\u000a\\u000a    See http://goo.gl/EC22Yn\\u000a\");\n    }\n    if (this.constructor !== Promise) {\n        throw new TypeError(\"the promise constructor cannot be invoked directly\\u000a\\u000a    See http://goo.gl/KsIlge\\u000a\");\n    }\n    this._bitField = 0;\n    this._fulfillmentHandler0 = undefined;\n    this._rejectionHandler0 = undefined;\n    this._progressHandler0 = undefined;\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    this._settledValue = undefined;\n    if (resolver !== INTERNAL) this._resolveFromResolver(resolver);\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n    var len = arguments.length;\n    if (len > 1) {\n        var catchInstances = new Array(len - 1),\n            j = 0, i;\n        for (i = 0; i < len - 1; ++i) {\n            var item = arguments[i];\n            if (typeof item === \"function\") {\n                catchInstances[j++] = item;\n            } else {\n                return Promise.reject(\n                    new TypeError(\"Catch filter must inherit from Error or be a simple predicate function\\u000a\\u000a    See http://goo.gl/o84o68\\u000a\"));\n            }\n        }\n        catchInstances.length = j;\n        fn = arguments[i];\n        var catchFilter = new CatchFilter(catchInstances, fn, this);\n        return this._then(undefined, catchFilter.doFilter, undefined,\n            catchFilter, undefined);\n    }\n    return this._then(undefined, fn, undefined, undefined, undefined);\n};\n\nPromise.prototype.reflect = function () {\n    return this._then(reflect, reflect, undefined, this, undefined);\n};\n\nPromise.prototype.then = function (didFulfill, didReject, didProgress) {\n    if (isDebugging() && arguments.length > 0 &&\n        typeof didFulfill !== \"function\" &&\n        typeof didReject !== \"function\") {\n        var msg = \".then() only accepts functions but was passed: \" +\n                util.classString(didFulfill);\n        if (arguments.length > 1) {\n            msg += \", \" + util.classString(didReject);\n        }\n        this._warn(msg);\n    }\n    return this._then(didFulfill, didReject, didProgress,\n        undefined, undefined);\n};\n\nPromise.prototype.done = function (didFulfill, didReject, didProgress) {\n    var promise = this._then(didFulfill, didReject, didProgress,\n        undefined, undefined);\n    promise._setIsFinal();\n};\n\nPromise.prototype.spread = function (didFulfill, didReject) {\n    return this.all()._then(didFulfill, didReject, undefined, APPLY, undefined);\n};\n\nPromise.prototype.isCancellable = function () {\n    return !this.isResolved() &&\n        this._cancellable();\n};\n\nPromise.prototype.toJSON = function () {\n    var ret = {\n        isFulfilled: false,\n        isRejected: false,\n        fulfillmentValue: undefined,\n        rejectionReason: undefined\n    };\n    if (this.isFulfilled()) {\n        ret.fulfillmentValue = this.value();\n        ret.isFulfilled = true;\n    } else if (this.isRejected()) {\n        ret.rejectionReason = this.reason();\n        ret.isRejected = true;\n    }\n    return ret;\n};\n\nPromise.prototype.all = function () {\n    return new PromiseArray(this).promise();\n};\n\nPromise.prototype.error = function (fn) {\n    return this.caught(util.originatesFromRejection, fn);\n};\n\nPromise.getNewLibraryCopy = module.exports;\n\nPromise.is = function (val) {\n    return val instanceof Promise;\n};\n\nPromise.fromNode = function(fn) {\n    var ret = new Promise(INTERNAL);\n    var result = tryCatch(fn)(nodebackForPromise(ret));\n    if (result === errorObj) {\n        ret._rejectCallback(result.e, true, true);\n    }\n    return ret;\n};\n\nPromise.all = function (promises) {\n    return new PromiseArray(promises).promise();\n};\n\nPromise.defer = Promise.pending = function () {\n    var promise = new Promise(INTERNAL);\n    return new PromiseResolver(promise);\n};\n\nPromise.cast = function (obj) {\n    var ret = tryConvertToPromise(obj);\n    if (!(ret instanceof Promise)) {\n        var val = ret;\n        ret = new Promise(INTERNAL);\n        ret._fulfillUnchecked(val);\n    }\n    return ret;\n};\n\nPromise.resolve = Promise.fulfilled = Promise.cast;\n\nPromise.reject = Promise.rejected = function (reason) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._rejectCallback(reason, true);\n    return ret;\n};\n\nPromise.setScheduler = function(fn) {\n    if (typeof fn !== \"function\") throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    var prev = async._schedule;\n    async._schedule = fn;\n    return prev;\n};\n\nPromise.prototype._then = function (\n    didFulfill,\n    didReject,\n    didProgress,\n    receiver,\n    internalData\n) {\n    var haveInternalData = internalData !== undefined;\n    var ret = haveInternalData ? internalData : new Promise(INTERNAL);\n\n    if (!haveInternalData) {\n        ret._propagateFrom(this, 4 | 1);\n        ret._captureStackTrace();\n    }\n\n    var target = this._target();\n    if (target !== this) {\n        if (receiver === undefined) receiver = this._boundTo;\n        if (!haveInternalData) ret._setIsMigrated();\n    }\n\n    var callbackIndex = target._addCallbacks(didFulfill,\n                                             didReject,\n                                             didProgress,\n                                             ret,\n                                             receiver,\n                                             getDomain());\n\n    if (target._isResolved() && !target._isSettlePromisesQueued()) {\n        async.invoke(\n            target._settlePromiseAtPostResolution, target, callbackIndex);\n    }\n\n    return ret;\n};\n\nPromise.prototype._settlePromiseAtPostResolution = function (index) {\n    if (this._isRejectionUnhandled()) this._unsetRejectionIsUnhandled();\n    this._settlePromiseAt(index);\n};\n\nPromise.prototype._length = function () {\n    return this._bitField & 131071;\n};\n\nPromise.prototype._isFollowingOrFulfilledOrRejected = function () {\n    return (this._bitField & 939524096) > 0;\n};\n\nPromise.prototype._isFollowing = function () {\n    return (this._bitField & 536870912) === 536870912;\n};\n\nPromise.prototype._setLength = function (len) {\n    this._bitField = (this._bitField & -131072) |\n        (len & 131071);\n};\n\nPromise.prototype._setFulfilled = function () {\n    this._bitField = this._bitField | 268435456;\n};\n\nPromise.prototype._setRejected = function () {\n    this._bitField = this._bitField | 134217728;\n};\n\nPromise.prototype._setFollowing = function () {\n    this._bitField = this._bitField | 536870912;\n};\n\nPromise.prototype._setIsFinal = function () {\n    this._bitField = this._bitField | 33554432;\n};\n\nPromise.prototype._isFinal = function () {\n    return (this._bitField & 33554432) > 0;\n};\n\nPromise.prototype._cancellable = function () {\n    return (this._bitField & 67108864) > 0;\n};\n\nPromise.prototype._setCancellable = function () {\n    this._bitField = this._bitField | 67108864;\n};\n\nPromise.prototype._unsetCancellable = function () {\n    this._bitField = this._bitField & (~67108864);\n};\n\nPromise.prototype._setIsMigrated = function () {\n    this._bitField = this._bitField | 4194304;\n};\n\nPromise.prototype._unsetIsMigrated = function () {\n    this._bitField = this._bitField & (~4194304);\n};\n\nPromise.prototype._isMigrated = function () {\n    return (this._bitField & 4194304) > 0;\n};\n\nPromise.prototype._receiverAt = function (index) {\n    var ret = index === 0\n        ? this._receiver0\n        : this[\n            index * 5 - 5 + 4];\n    if (ret === UNDEFINED_BINDING) {\n        return undefined;\n    } else if (ret === undefined && this._isBound()) {\n        return this._boundValue();\n    }\n    return ret;\n};\n\nPromise.prototype._promiseAt = function (index) {\n    return index === 0\n        ? this._promise0\n        : this[index * 5 - 5 + 3];\n};\n\nPromise.prototype._fulfillmentHandlerAt = function (index) {\n    return index === 0\n        ? this._fulfillmentHandler0\n        : this[index * 5 - 5 + 0];\n};\n\nPromise.prototype._rejectionHandlerAt = function (index) {\n    return index === 0\n        ? this._rejectionHandler0\n        : this[index * 5 - 5 + 1];\n};\n\nPromise.prototype._boundValue = function() {\n    var ret = this._boundTo;\n    if (ret !== undefined) {\n        if (ret instanceof Promise) {\n            if (ret.isFulfilled()) {\n                return ret.value();\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return ret;\n};\n\nPromise.prototype._migrateCallbacks = function (follower, index) {\n    var fulfill = follower._fulfillmentHandlerAt(index);\n    var reject = follower._rejectionHandlerAt(index);\n    var progress = follower._progressHandlerAt(index);\n    var promise = follower._promiseAt(index);\n    var receiver = follower._receiverAt(index);\n    if (promise instanceof Promise) promise._setIsMigrated();\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, progress, promise, receiver, null);\n};\n\nPromise.prototype._addCallbacks = function (\n    fulfill,\n    reject,\n    progress,\n    promise,\n    receiver,\n    domain\n) {\n    var index = this._length();\n\n    if (index >= 131071 - 5) {\n        index = 0;\n        this._setLength(0);\n    }\n\n    if (index === 0) {\n        this._promise0 = promise;\n        if (receiver !== undefined) this._receiver0 = receiver;\n        if (typeof fulfill === \"function\" && !this._isCarryingStackTrace()) {\n            this._fulfillmentHandler0 =\n                domain === null ? fulfill : domain.bind(fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this._rejectionHandler0 =\n                domain === null ? reject : domain.bind(reject);\n        }\n        if (typeof progress === \"function\") {\n            this._progressHandler0 =\n                domain === null ? progress : domain.bind(progress);\n        }\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] = promise;\n        this[base + 4] = receiver;\n        if (typeof fulfill === \"function\") {\n            this[base + 0] =\n                domain === null ? fulfill : domain.bind(fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this[base + 1] =\n                domain === null ? reject : domain.bind(reject);\n        }\n        if (typeof progress === \"function\") {\n            this[base + 2] =\n                domain === null ? progress : domain.bind(progress);\n        }\n    }\n    this._setLength(index + 1);\n    return index;\n};\n\nPromise.prototype._setProxyHandlers = function (receiver, promiseSlotValue) {\n    var index = this._length();\n\n    if (index >= 131071 - 5) {\n        index = 0;\n        this._setLength(0);\n    }\n    if (index === 0) {\n        this._promise0 = promiseSlotValue;\n        this._receiver0 = receiver;\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] = promiseSlotValue;\n        this[base + 4] = receiver;\n    }\n    this._setLength(index + 1);\n};\n\nPromise.prototype._proxyPromiseArray = function (promiseArray, index) {\n    this._setProxyHandlers(promiseArray, index);\n};\n\nPromise.prototype._resolveCallback = function(value, shouldBind) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    if (value === this)\n        return this._rejectCallback(makeSelfResolutionError(), false, true);\n    var maybePromise = tryConvertToPromise(value, this);\n    if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n\n    var propagationFlags = 1 | (shouldBind ? 4 : 0);\n    this._propagateFrom(maybePromise, propagationFlags);\n    var promise = maybePromise._target();\n    if (promise._isPending()) {\n        var len = this._length();\n        for (var i = 0; i < len; ++i) {\n            promise._migrateCallbacks(this, i);\n        }\n        this._setFollowing();\n        this._setLength(0);\n        this._setFollowee(promise);\n    } else if (promise._isFulfilled()) {\n        this._fulfillUnchecked(promise._value());\n    } else {\n        this._rejectUnchecked(promise._reason(),\n            promise._getCarriedStackTrace());\n    }\n};\n\nPromise.prototype._rejectCallback =\nfunction(reason, synchronous, shouldNotMarkOriginatingFromRejection) {\n    if (!shouldNotMarkOriginatingFromRejection) {\n        util.markAsOriginatingFromRejection(reason);\n    }\n    var trace = util.ensureErrorObject(reason);\n    var hasStack = trace === reason;\n    this._attachExtraTrace(trace, synchronous ? hasStack : false);\n    this._reject(reason, hasStack ? undefined : trace);\n};\n\nPromise.prototype._resolveFromResolver = function (resolver) {\n    var promise = this;\n    this._captureStackTrace();\n    this._pushContext();\n    var synchronous = true;\n    var r = tryCatch(resolver)(function(value) {\n        if (promise === null) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }, function (reason) {\n        if (promise === null) return;\n        promise._rejectCallback(reason, synchronous);\n        promise = null;\n    });\n    synchronous = false;\n    this._popContext();\n\n    if (r !== undefined && r === errorObj && promise !== null) {\n        promise._rejectCallback(r.e, true, true);\n        promise = null;\n    }\n};\n\nPromise.prototype._settlePromiseFromHandler = function (\n    handler, receiver, value, promise\n) {\n    if (promise._isRejected()) return;\n    promise._pushContext();\n    var x;\n    if (receiver === APPLY && !this._isRejected()) {\n        x = tryCatch(handler).apply(this._boundValue(), value);\n    } else {\n        x = tryCatch(handler).call(receiver, value);\n    }\n    promise._popContext();\n\n    if (x === errorObj || x === promise || x === NEXT_FILTER) {\n        var err = x === promise ? makeSelfResolutionError() : x.e;\n        promise._rejectCallback(err, false, true);\n    } else {\n        promise._resolveCallback(x);\n    }\n};\n\nPromise.prototype._target = function() {\n    var ret = this;\n    while (ret._isFollowing()) ret = ret._followee();\n    return ret;\n};\n\nPromise.prototype._followee = function() {\n    return this._rejectionHandler0;\n};\n\nPromise.prototype._setFollowee = function(promise) {\n    this._rejectionHandler0 = promise;\n};\n\nPromise.prototype._cleanValues = function () {\n    if (this._cancellable()) {\n        this._cancellationParent = undefined;\n    }\n};\n\nPromise.prototype._propagateFrom = function (parent, flags) {\n    if ((flags & 1) > 0 && parent._cancellable()) {\n        this._setCancellable();\n        this._cancellationParent = parent;\n    }\n    if ((flags & 4) > 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n};\n\nPromise.prototype._fulfill = function (value) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._fulfillUnchecked(value);\n};\n\nPromise.prototype._reject = function (reason, carriedStackTrace) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._rejectUnchecked(reason, carriedStackTrace);\n};\n\nPromise.prototype._settlePromiseAt = function (index) {\n    var promise = this._promiseAt(index);\n    var isPromise = promise instanceof Promise;\n\n    if (isPromise && promise._isMigrated()) {\n        promise._unsetIsMigrated();\n        return async.invoke(this._settlePromiseAt, this, index);\n    }\n    var handler = this._isFulfilled()\n        ? this._fulfillmentHandlerAt(index)\n        : this._rejectionHandlerAt(index);\n\n    var carriedStackTrace =\n        this._isCarryingStackTrace() ? this._getCarriedStackTrace() : undefined;\n    var value = this._settledValue;\n    var receiver = this._receiverAt(index);\n    this._clearCallbackDataAtIndex(index);\n\n    if (typeof handler === \"function\") {\n        if (!isPromise) {\n            handler.call(receiver, value, promise);\n        } else {\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (receiver instanceof PromiseArray) {\n        if (!receiver._isResolved()) {\n            if (this._isFulfilled()) {\n                receiver._promiseFulfilled(value, promise);\n            }\n            else {\n                receiver._promiseRejected(value, promise);\n            }\n        }\n    } else if (isPromise) {\n        if (this._isFulfilled()) {\n            promise._fulfill(value);\n        } else {\n            promise._reject(value, carriedStackTrace);\n        }\n    }\n\n    if (index >= 4 && (index & 31) === 4)\n        async.invokeLater(this._setLength, this, 0);\n};\n\nPromise.prototype._clearCallbackDataAtIndex = function(index) {\n    if (index === 0) {\n        if (!this._isCarryingStackTrace()) {\n            this._fulfillmentHandler0 = undefined;\n        }\n        this._rejectionHandler0 =\n        this._progressHandler0 =\n        this._receiver0 =\n        this._promise0 = undefined;\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] =\n        this[base + 4] =\n        this[base + 0] =\n        this[base + 1] =\n        this[base + 2] = undefined;\n    }\n};\n\nPromise.prototype._isSettlePromisesQueued = function () {\n    return (this._bitField &\n            -1073741824) === -1073741824;\n};\n\nPromise.prototype._setSettlePromisesQueued = function () {\n    this._bitField = this._bitField | -1073741824;\n};\n\nPromise.prototype._unsetSettlePromisesQueued = function () {\n    this._bitField = this._bitField & (~-1073741824);\n};\n\nPromise.prototype._queueSettlePromises = function() {\n    async.settlePromises(this);\n    this._setSettlePromisesQueued();\n};\n\nPromise.prototype._fulfillUnchecked = function (value) {\n    if (value === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._rejectUnchecked(err, undefined);\n    }\n    this._setFulfilled();\n    this._settledValue = value;\n    this._cleanValues();\n\n    if (this._length() > 0) {\n        this._queueSettlePromises();\n    }\n};\n\nPromise.prototype._rejectUncheckedCheckError = function (reason) {\n    var trace = util.ensureErrorObject(reason);\n    this._rejectUnchecked(reason, trace === reason ? undefined : trace);\n};\n\nPromise.prototype._rejectUnchecked = function (reason, trace) {\n    if (reason === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._rejectUnchecked(err);\n    }\n    this._setRejected();\n    this._settledValue = reason;\n    this._cleanValues();\n\n    if (this._isFinal()) {\n        async.throwLater(function(e) {\n            if (\"stack\" in e) {\n                async.invokeFirst(\n                    CapturedTrace.unhandledRejection, undefined, e);\n            }\n            throw e;\n        }, trace === undefined ? reason : trace);\n        return;\n    }\n\n    if (trace !== undefined && trace !== reason) {\n        this._setCarriedStackTrace(trace);\n    }\n\n    if (this._length() > 0) {\n        this._queueSettlePromises();\n    } else {\n        this._ensurePossibleRejectionHandled();\n    }\n};\n\nPromise.prototype._settlePromises = function () {\n    this._unsetSettlePromisesQueued();\n    var len = this._length();\n    for (var i = 0; i < len; i++) {\n        this._settlePromiseAt(i);\n    }\n};\n\n\nutil.notEnumerableProp(Promise,\n                       \"_makeSelfResolutionError\",\n                       makeSelfResolutionError);\n\n_dereq_(\"./progress.js\")(Promise, PromiseArray);\n_dereq_(\"./method.js\")(Promise, INTERNAL, tryConvertToPromise, apiRejection);\n_dereq_(\"./bind.js\")(Promise, INTERNAL, tryConvertToPromise);\n_dereq_(\"./finally.js\")(Promise, NEXT_FILTER, tryConvertToPromise);\n_dereq_(\"./direct_resolve.js\")(Promise);\n_dereq_(\"./synchronous_inspection.js\")(Promise);\n_dereq_(\"./join.js\")(Promise, PromiseArray, tryConvertToPromise, INTERNAL);\nPromise.version = \"2.11.0\";\nPromise.Promise = Promise;\n_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);\n_dereq_('./cancel.js')(Promise);\n_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext);\n_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise);\n_dereq_('./nodeify.js')(Promise);\n_dereq_('./call_get.js')(Promise);\n_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\n_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\n_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);\n_dereq_('./settle.js')(Promise, PromiseArray);\n_dereq_('./some.js')(Promise, PromiseArray, apiRejection);\n_dereq_('./promisify.js')(Promise, INTERNAL);\n_dereq_('./any.js')(Promise);\n_dereq_('./each.js')(Promise, INTERNAL);\n_dereq_('./timers.js')(Promise, INTERNAL);\n_dereq_('./filter.js')(Promise, INTERNAL);\n                                                         \n    util.toFastProperties(Promise);                                          \n    util.toFastProperties(Promise.prototype);                                \n    function fillTypes(value) {                                              \n        var p = new Promise(INTERNAL);                                       \n        p._fulfillmentHandler0 = value;                                      \n        p._rejectionHandler0 = value;                                        \n        p._progressHandler0 = value;                                         \n        p._promise0 = value;                                                 \n        p._receiver0 = value;                                                \n        p._settledValue = value;                                             \n    }                                                                        \n    // Complete slack tracking, opt out of field-type tracking and           \n    // stabilize map                                                         \n    fillTypes({a: 1});                                                       \n    fillTypes({b: 2});                                                       \n    fillTypes({c: 3});                                                       \n    fillTypes(1);                                                            \n    fillTypes(function(){});                                                 \n    fillTypes(undefined);                                                    \n    fillTypes(false);                                                        \n    fillTypes(new Promise(INTERNAL));                                        \n    CapturedTrace.setBounds(async.firstLineError, util.lastLineError);       \n    return Promise;                                                          \n\n};\n\n},{\"./any.js\":1,\"./async.js\":2,\"./bind.js\":3,\"./call_get.js\":5,\"./cancel.js\":6,\"./captured_trace.js\":7,\"./catch_filter.js\":8,\"./context.js\":9,\"./debuggability.js\":10,\"./direct_resolve.js\":11,\"./each.js\":12,\"./errors.js\":13,\"./filter.js\":15,\"./finally.js\":16,\"./generators.js\":17,\"./join.js\":18,\"./map.js\":19,\"./method.js\":20,\"./nodeify.js\":21,\"./progress.js\":22,\"./promise_array.js\":24,\"./promise_resolver.js\":25,\"./promisify.js\":26,\"./props.js\":27,\"./race.js\":29,\"./reduce.js\":30,\"./settle.js\":32,\"./some.js\":33,\"./synchronous_inspection.js\":34,\"./thenables.js\":35,\"./timers.js\":36,\"./using.js\":37,\"./util.js\":38}],24:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise,\n    apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar isArray = util.isArray;\n\nfunction toResolutionValue(val) {\n    switch(val) {\n    case -2: return [];\n    case -3: return {};\n    }\n}\n\nfunction PromiseArray(values) {\n    var promise = this._promise = new Promise(INTERNAL);\n    var parent;\n    if (values instanceof Promise) {\n        parent = values;\n        promise._propagateFrom(parent, 1 | 4);\n    }\n    this._values = values;\n    this._length = 0;\n    this._totalResolved = 0;\n    this._init(undefined, -2);\n}\nPromiseArray.prototype.length = function () {\n    return this._length;\n};\n\nPromiseArray.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n    var values = tryConvertToPromise(this._values, this._promise);\n    if (values instanceof Promise) {\n        values = values._target();\n        this._values = values;\n        if (values._isFulfilled()) {\n            values = values._value();\n            if (!isArray(values)) {\n                var err = new Promise.TypeError(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\");\n                this.__hardReject__(err);\n                return;\n            }\n        } else if (values._isPending()) {\n            values._then(\n                init,\n                this._reject,\n                undefined,\n                this,\n                resolveValueIfEmpty\n           );\n            return;\n        } else {\n            this._reject(values._reason());\n            return;\n        }\n    } else if (!isArray(values)) {\n        this._promise._reject(apiRejection(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\")._reason());\n        return;\n    }\n\n    if (values.length === 0) {\n        if (resolveValueIfEmpty === -5) {\n            this._resolveEmptyArray();\n        }\n        else {\n            this._resolve(toResolutionValue(resolveValueIfEmpty));\n        }\n        return;\n    }\n    var len = this.getActualLength(values.length);\n    this._length = len;\n    this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n    var promise = this._promise;\n    for (var i = 0; i < len; ++i) {\n        var isResolved = this._isResolved();\n        var maybePromise = tryConvertToPromise(values[i], promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (isResolved) {\n                maybePromise._ignoreRejections();\n            } else if (maybePromise._isPending()) {\n                maybePromise._proxyPromiseArray(this, i);\n            } else if (maybePromise._isFulfilled()) {\n                this._promiseFulfilled(maybePromise._value(), i);\n            } else {\n                this._promiseRejected(maybePromise._reason(), i);\n            }\n        } else if (!isResolved) {\n            this._promiseFulfilled(maybePromise, i);\n        }\n    }\n};\n\nPromiseArray.prototype._isResolved = function () {\n    return this._values === null;\n};\n\nPromiseArray.prototype._resolve = function (value) {\n    this._values = null;\n    this._promise._fulfill(value);\n};\n\nPromiseArray.prototype.__hardReject__ =\nPromiseArray.prototype._reject = function (reason) {\n    this._values = null;\n    this._promise._rejectCallback(reason, false, true);\n};\n\nPromiseArray.prototype._promiseProgressed = function (progressValue, index) {\n    this._promise._progress({\n        index: index,\n        value: progressValue\n    });\n};\n\n\nPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n    }\n};\n\nPromiseArray.prototype._promiseRejected = function (reason, index) {\n    this._totalResolved++;\n    this._reject(reason);\n};\n\nPromiseArray.prototype.shouldCopyValues = function () {\n    return true;\n};\n\nPromiseArray.prototype.getActualLength = function (len) {\n    return len;\n};\n\nreturn PromiseArray;\n};\n\n},{\"./util.js\":38}],25:[function(_dereq_,module,exports){\n\"use strict\";\nvar util = _dereq_(\"./util.js\");\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar errors = _dereq_(\"./errors.js\");\nvar TimeoutError = errors.TimeoutError;\nvar OperationalError = errors.OperationalError;\nvar haveGetters = util.haveGetters;\nvar es5 = _dereq_(\"./es5.js\");\n\nfunction isUntypedError(obj) {\n    return obj instanceof Error &&\n        es5.getPrototypeOf(obj) === Error.prototype;\n}\n\nvar rErrorKey = /^(?:name|message|stack|cause)$/;\nfunction wrapAsOperationalError(obj) {\n    var ret;\n    if (isUntypedError(obj)) {\n        ret = new OperationalError(obj);\n        ret.name = obj.name;\n        ret.message = obj.message;\n        ret.stack = obj.stack;\n        var keys = es5.keys(obj);\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!rErrorKey.test(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    util.markAsOriginatingFromRejection(obj);\n    return obj;\n}\n\nfunction nodebackForPromise(promise) {\n    return function(err, value) {\n        if (promise === null) return;\n\n        if (err) {\n            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n            promise._attachExtraTrace(wrapped);\n            promise._reject(wrapped);\n        } else if (arguments.length > 2) {\n            var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}\n            promise._fulfill(args);\n        } else {\n            promise._fulfill(value);\n        }\n\n        promise = null;\n    };\n}\n\n\nvar PromiseResolver;\nif (!haveGetters) {\n    PromiseResolver = function (promise) {\n        this.promise = promise;\n        this.asCallback = nodebackForPromise(promise);\n        this.callback = this.asCallback;\n    };\n}\nelse {\n    PromiseResolver = function (promise) {\n        this.promise = promise;\n    };\n}\nif (haveGetters) {\n    var prop = {\n        get: function() {\n            return nodebackForPromise(this.promise);\n        }\n    };\n    es5.defineProperty(PromiseResolver.prototype, \"asCallback\", prop);\n    es5.defineProperty(PromiseResolver.prototype, \"callback\", prop);\n}\n\nPromiseResolver._nodebackForPromise = nodebackForPromise;\n\nPromiseResolver.prototype.toString = function () {\n    return \"[object PromiseResolver]\";\n};\n\nPromiseResolver.prototype.resolve =\nPromiseResolver.prototype.fulfill = function (value) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._resolveCallback(value);\n};\n\nPromiseResolver.prototype.reject = function (reason) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._rejectCallback(reason);\n};\n\nPromiseResolver.prototype.progress = function (value) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._progress(value);\n};\n\nPromiseResolver.prototype.cancel = function (err) {\n    this.promise.cancel(err);\n};\n\nPromiseResolver.prototype.timeout = function () {\n    this.reject(new TimeoutError(\"timeout\"));\n};\n\nPromiseResolver.prototype.isResolved = function () {\n    return this.promise.isResolved();\n};\n\nPromiseResolver.prototype.toJSON = function () {\n    return this.promise.toJSON();\n};\n\nmodule.exports = PromiseResolver;\n\n},{\"./errors.js\":13,\"./es5.js\":14,\"./util.js\":38}],26:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar THIS = {};\nvar util = _dereq_(\"./util.js\");\nvar nodebackForPromise = _dereq_(\"./promise_resolver.js\")\n    ._nodebackForPromise;\nvar withAppended = util.withAppended;\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar canEvaluate = util.canEvaluate;\nvar TypeError = _dereq_(\"./errors\").TypeError;\nvar defaultSuffix = \"Async\";\nvar defaultPromisified = {__isPromisified__: true};\nvar noCopyProps = [\n    \"arity\",    \"length\",\n    \"name\",\n    \"arguments\",\n    \"caller\",\n    \"callee\",\n    \"prototype\",\n    \"__isPromisified__\"\n];\nvar noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\nvar defaultFilter = function(name) {\n    return util.isIdentifier(name) &&\n        name.charAt(0) !== \"_\" &&\n        name !== \"constructor\";\n};\n\nfunction propsFilter(key) {\n    return !noCopyPropsPattern.test(key);\n}\n\nfunction isPromisified(fn) {\n    try {\n        return fn.__isPromisified__ === true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n\nfunction hasPromisified(obj, key, suffix) {\n    var val = util.getDataPropertyOrDefault(obj, key + suffix,\n                                            defaultPromisified);\n    return val ? isPromisified(val) : false;\n}\nfunction checkValid(ret, suffix, suffixRegexp) {\n    for (var i = 0; i < ret.length; i += 2) {\n        var key = ret[i];\n        if (suffixRegexp.test(key)) {\n            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n            for (var j = 0; j < ret.length; j += 2) {\n                if (ret[j] === keyWithoutAsyncSuffix) {\n                    throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\u000a\\u000a    See http://goo.gl/iWrZbw\\u000a\"\n                        .replace(\"%s\", suffix));\n                }\n            }\n        }\n    }\n}\n\nfunction promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n    var keys = util.inheritedDataKeys(obj);\n    var ret = [];\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var value = obj[key];\n        var passesDefaultFilter = filter === defaultFilter\n            ? true : defaultFilter(key, value, obj);\n        if (typeof value === \"function\" &&\n            !isPromisified(value) &&\n            !hasPromisified(obj, key, suffix) &&\n            filter(key, value, obj, passesDefaultFilter)) {\n            ret.push(key, value);\n        }\n    }\n    checkValid(ret, suffix, suffixRegexp);\n    return ret;\n}\n\nvar escapeIdentRegex = function(str) {\n    return str.replace(/([$])/, \"\\\\$\");\n};\n\nvar makeNodePromisifiedEval;\nif (false) {\nvar switchCaseArgumentOrder = function(likelyArgumentCount) {\n    var ret = [likelyArgumentCount];\n    var min = Math.max(0, likelyArgumentCount - 1 - 3);\n    for(var i = likelyArgumentCount - 1; i >= min; --i) {\n        ret.push(i);\n    }\n    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {\n        ret.push(i);\n    }\n    return ret;\n};\n\nvar argumentSequence = function(argumentCount) {\n    return util.filledRange(argumentCount, \"_arg\", \"\");\n};\n\nvar parameterDeclaration = function(parameterCount) {\n    return util.filledRange(\n        Math.max(parameterCount, 3), \"_arg\", \"\");\n};\n\nvar parameterCount = function(fn) {\n    if (typeof fn.length === \"number\") {\n        return Math.max(Math.min(fn.length, 1023 + 1), 0);\n    }\n    return 0;\n};\n\nmakeNodePromisifiedEval =\nfunction(callback, receiver, originalName, fn) {\n    var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n    var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n    var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n    function generateCallForArgumentCount(count) {\n        var args = argumentSequence(count).join(\", \");\n        var comma = count > 0 ? \", \" : \"\";\n        var ret;\n        if (shouldProxyThis) {\n            ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n        } else {\n            ret = receiver === undefined\n                ? \"ret = callback({{args}}, nodeback); break;\\n\"\n                : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n        }\n        return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n    }\n\n    function generateArgumentSwitchCase() {\n        var ret = \"\";\n        for (var i = 0; i < argumentOrder.length; ++i) {\n            ret += \"case \" + argumentOrder[i] +\":\" +\n                generateCallForArgumentCount(argumentOrder[i]);\n        }\n\n        ret += \"                                                             \\n\\\n        default:                                                             \\n\\\n            var args = new Array(len + 1);                                   \\n\\\n            var i = 0;                                                       \\n\\\n            for (var i = 0; i < len; ++i) {                                  \\n\\\n               args[i] = arguments[i];                                       \\n\\\n            }                                                                \\n\\\n            args[i] = nodeback;                                              \\n\\\n            [CodeForCall]                                                    \\n\\\n            break;                                                           \\n\\\n        \".replace(\"[CodeForCall]\", (shouldProxyThis\n                                ? \"ret = callback.apply(this, args);\\n\"\n                                : \"ret = callback.apply(receiver, args);\\n\"));\n        return ret;\n    }\n\n    var getFunctionCode = typeof callback === \"string\"\n                                ? (\"this != null ? this['\"+callback+\"'] : fn\")\n                                : \"fn\";\n\n    return new Function(\"Promise\",\n                        \"fn\",\n                        \"receiver\",\n                        \"withAppended\",\n                        \"maybeWrapAsError\",\n                        \"nodebackForPromise\",\n                        \"tryCatch\",\n                        \"errorObj\",\n                        \"notEnumerableProp\",\n                        \"INTERNAL\",\"'use strict';                            \\n\\\n        var ret = function (Parameters) {                                    \\n\\\n            'use strict';                                                    \\n\\\n            var len = arguments.length;                                      \\n\\\n            var promise = new Promise(INTERNAL);                             \\n\\\n            promise._captureStackTrace();                                    \\n\\\n            var nodeback = nodebackForPromise(promise);                      \\n\\\n            var ret;                                                         \\n\\\n            var callback = tryCatch([GetFunctionCode]);                      \\n\\\n            switch(len) {                                                    \\n\\\n                [CodeForSwitchCase]                                          \\n\\\n            }                                                                \\n\\\n            if (ret === errorObj) {                                          \\n\\\n                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n            }                                                                \\n\\\n            return promise;                                                  \\n\\\n        };                                                                   \\n\\\n        notEnumerableProp(ret, '__isPromisified__', true);                   \\n\\\n        return ret;                                                          \\n\\\n        \"\n        .replace(\"Parameters\", parameterDeclaration(newParameterCount))\n        .replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase())\n        .replace(\"[GetFunctionCode]\", getFunctionCode))(\n            Promise,\n            fn,\n            receiver,\n            withAppended,\n            maybeWrapAsError,\n            nodebackForPromise,\n            util.tryCatch,\n            util.errorObj,\n            util.notEnumerableProp,\n            INTERNAL\n        );\n};\n}\n\nfunction makeNodePromisifiedClosure(callback, receiver, _, fn) {\n    var defaultThis = (function() {return this;})();\n    var method = callback;\n    if (typeof method === \"string\") {\n        callback = fn;\n    }\n    function promisified() {\n        var _receiver = receiver;\n        if (receiver === THIS) _receiver = this;\n        var promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n        var cb = typeof method === \"string\" && this !== defaultThis\n            ? this[method] : callback;\n        var fn = nodebackForPromise(promise);\n        try {\n            cb.apply(_receiver, withAppended(arguments, fn));\n        } catch(e) {\n            promise._rejectCallback(maybeWrapAsError(e), true, true);\n        }\n        return promise;\n    }\n    util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n    return promisified;\n}\n\nvar makeNodePromisified = canEvaluate\n    ? makeNodePromisifiedEval\n    : makeNodePromisifiedClosure;\n\nfunction promisifyAll(obj, suffix, filter, promisifier) {\n    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n    var methods =\n        promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n    for (var i = 0, len = methods.length; i < len; i+= 2) {\n        var key = methods[i];\n        var fn = methods[i+1];\n        var promisifiedKey = key + suffix;\n        if (promisifier === makeNodePromisified) {\n            obj[promisifiedKey] =\n                makeNodePromisified(key, THIS, key, fn, suffix);\n        } else {\n            var promisified = promisifier(fn, function() {\n                return makeNodePromisified(key, THIS, key, fn, suffix);\n            });\n            util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n            obj[promisifiedKey] = promisified;\n        }\n    }\n    util.toFastProperties(obj);\n    return obj;\n}\n\nfunction promisify(callback, receiver) {\n    return makeNodePromisified(callback, receiver, undefined, callback);\n}\n\nPromise.promisify = function (fn, receiver) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    if (isPromisified(fn)) {\n        return fn;\n    }\n    var ret = promisify(fn, arguments.length < 2 ? THIS : receiver);\n    util.copyDescriptors(fn, ret, propsFilter);\n    return ret;\n};\n\nPromise.promisifyAll = function (target, options) {\n    if (typeof target !== \"function\" && typeof target !== \"object\") {\n        throw new TypeError(\"the target of promisifyAll must be an object or a function\\u000a\\u000a    See http://goo.gl/9ITlV0\\u000a\");\n    }\n    options = Object(options);\n    var suffix = options.suffix;\n    if (typeof suffix !== \"string\") suffix = defaultSuffix;\n    var filter = options.filter;\n    if (typeof filter !== \"function\") filter = defaultFilter;\n    var promisifier = options.promisifier;\n    if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n    if (!util.isIdentifier(suffix)) {\n        throw new RangeError(\"suffix must be a valid identifier\\u000a\\u000a    See http://goo.gl/8FZo5V\\u000a\");\n    }\n\n    var keys = util.inheritedDataKeys(target);\n    for (var i = 0; i < keys.length; ++i) {\n        var value = target[keys[i]];\n        if (keys[i] !== \"constructor\" &&\n            util.isClass(value)) {\n            promisifyAll(value.prototype, suffix, filter, promisifier);\n            promisifyAll(value, suffix, filter, promisifier);\n        }\n    }\n\n    return promisifyAll(target, suffix, filter, promisifier);\n};\n};\n\n\n},{\"./errors\":13,\"./promise_resolver.js\":25,\"./util.js\":38}],27:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, PromiseArray, tryConvertToPromise, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar isObject = util.isObject;\nvar es5 = _dereq_(\"./es5.js\");\n\nfunction PropertiesPromiseArray(obj) {\n    var keys = es5.keys(obj);\n    var len = keys.length;\n    var values = new Array(len * 2);\n    for (var i = 0; i < len; ++i) {\n        var key = keys[i];\n        values[i] = obj[key];\n        values[i + len] = key;\n    }\n    this.constructor$(values);\n}\nutil.inherits(PropertiesPromiseArray, PromiseArray);\n\nPropertiesPromiseArray.prototype._init = function () {\n    this._init$(undefined, -3) ;\n};\n\nPropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        var val = {};\n        var keyOffset = this.length();\n        for (var i = 0, len = this.length(); i < len; ++i) {\n            val[this._values[i + keyOffset]] = this._values[i];\n        }\n        this._resolve(val);\n    }\n};\n\nPropertiesPromiseArray.prototype._promiseProgressed = function (value, index) {\n    this._promise._progress({\n        key: this._values[index + this.length()],\n        value: value\n    });\n};\n\nPropertiesPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nPropertiesPromiseArray.prototype.getActualLength = function (len) {\n    return len >> 1;\n};\n\nfunction props(promises) {\n    var ret;\n    var castValue = tryConvertToPromise(promises);\n\n    if (!isObject(castValue)) {\n        return apiRejection(\"cannot await properties of a non-object\\u000a\\u000a    See http://goo.gl/OsFKC8\\u000a\");\n    } else if (castValue instanceof Promise) {\n        ret = castValue._then(\n            Promise.props, undefined, undefined, undefined, undefined);\n    } else {\n        ret = new PropertiesPromiseArray(castValue).promise();\n    }\n\n    if (castValue instanceof Promise) {\n        ret._propagateFrom(castValue, 4);\n    }\n    return ret;\n}\n\nPromise.prototype.props = function () {\n    return props(this);\n};\n\nPromise.props = function (promises) {\n    return props(promises);\n};\n};\n\n},{\"./es5.js\":14,\"./util.js\":38}],28:[function(_dereq_,module,exports){\n\"use strict\";\nfunction arrayMove(src, srcIndex, dst, dstIndex, len) {\n    for (var j = 0; j < len; ++j) {\n        dst[j + dstIndex] = src[j + srcIndex];\n        src[j + srcIndex] = void 0;\n    }\n}\n\nfunction Queue(capacity) {\n    this._capacity = capacity;\n    this._length = 0;\n    this._front = 0;\n}\n\nQueue.prototype._willBeOverCapacity = function (size) {\n    return this._capacity < size;\n};\n\nQueue.prototype._pushOne = function (arg) {\n    var length = this.length();\n    this._checkCapacity(length + 1);\n    var i = (this._front + length) & (this._capacity - 1);\n    this[i] = arg;\n    this._length = length + 1;\n};\n\nQueue.prototype._unshiftOne = function(value) {\n    var capacity = this._capacity;\n    this._checkCapacity(this.length() + 1);\n    var front = this._front;\n    var i = (((( front - 1 ) &\n                    ( capacity - 1) ) ^ capacity ) - capacity );\n    this[i] = value;\n    this._front = i;\n    this._length = this.length() + 1;\n};\n\nQueue.prototype.unshift = function(fn, receiver, arg) {\n    this._unshiftOne(arg);\n    this._unshiftOne(receiver);\n    this._unshiftOne(fn);\n};\n\nQueue.prototype.push = function (fn, receiver, arg) {\n    var length = this.length() + 3;\n    if (this._willBeOverCapacity(length)) {\n        this._pushOne(fn);\n        this._pushOne(receiver);\n        this._pushOne(arg);\n        return;\n    }\n    var j = this._front + length - 3;\n    this._checkCapacity(length);\n    var wrapMask = this._capacity - 1;\n    this[(j + 0) & wrapMask] = fn;\n    this[(j + 1) & wrapMask] = receiver;\n    this[(j + 2) & wrapMask] = arg;\n    this._length = length;\n};\n\nQueue.prototype.shift = function () {\n    var front = this._front,\n        ret = this[front];\n\n    this[front] = undefined;\n    this._front = (front + 1) & (this._capacity - 1);\n    this._length--;\n    return ret;\n};\n\nQueue.prototype.length = function () {\n    return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n    if (this._capacity < size) {\n        this._resizeTo(this._capacity << 1);\n    }\n};\n\nQueue.prototype._resizeTo = function (capacity) {\n    var oldCapacity = this._capacity;\n    this._capacity = capacity;\n    var front = this._front;\n    var length = this._length;\n    var moveItemsCount = (front + length) & (oldCapacity - 1);\n    arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n};\n\nmodule.exports = Queue;\n\n},{}],29:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar isArray = _dereq_(\"./util.js\").isArray;\n\nvar raceLater = function (promise) {\n    return promise.then(function(array) {\n        return race(array, promise);\n    });\n};\n\nfunction race(promises, parent) {\n    var maybePromise = tryConvertToPromise(promises);\n\n    if (maybePromise instanceof Promise) {\n        return raceLater(maybePromise);\n    } else if (!isArray(promises)) {\n        return apiRejection(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\");\n    }\n\n    var ret = new Promise(INTERNAL);\n    if (parent !== undefined) {\n        ret._propagateFrom(parent, 4 | 1);\n    }\n    var fulfill = ret._fulfill;\n    var reject = ret._reject;\n    for (var i = 0, len = promises.length; i < len; ++i) {\n        var val = promises[i];\n\n        if (val === undefined && !(i in promises)) {\n            continue;\n        }\n\n        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n    }\n    return ret;\n}\n\nPromise.race = function (promises) {\n    return race(promises, undefined);\n};\n\nPromise.prototype.race = function () {\n    return race(this, undefined);\n};\n\n};\n\n},{\"./util.js\":38}],30:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nfunction ReductionPromiseArray(promises, fn, accum, _each) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    this._preservedValues = _each === INTERNAL ? [] : null;\n    this._zerothIsAccum = (accum === undefined);\n    this._gotAccum = false;\n    this._reducingIndex = (this._zerothIsAccum ? 1 : 0);\n    this._valuesPhase = undefined;\n    var maybePromise = tryConvertToPromise(accum, this._promise);\n    var rejected = false;\n    var isPromise = maybePromise instanceof Promise;\n    if (isPromise) {\n        maybePromise = maybePromise._target();\n        if (maybePromise._isPending()) {\n            maybePromise._proxyPromiseArray(this, -1);\n        } else if (maybePromise._isFulfilled()) {\n            accum = maybePromise._value();\n            this._gotAccum = true;\n        } else {\n            this._reject(maybePromise._reason());\n            rejected = true;\n        }\n    }\n    if (!(isPromise || this._zerothIsAccum)) this._gotAccum = true;\n    var domain = getDomain();\n    this._callback = domain === null ? fn : domain.bind(fn);\n    this._accum = accum;\n    if (!rejected) async.invoke(init, this, undefined);\n}\nfunction init() {\n    this._init$(undefined, -5);\n}\nutil.inherits(ReductionPromiseArray, PromiseArray);\n\nReductionPromiseArray.prototype._init = function () {};\n\nReductionPromiseArray.prototype._resolveEmptyArray = function () {\n    if (this._gotAccum || this._zerothIsAccum) {\n        this._resolve(this._preservedValues !== null\n                        ? [] : this._accum);\n    }\n};\n\nReductionPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    values[index] = value;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var isEach = preservedValues !== null;\n    var gotAccum = this._gotAccum;\n    var valuesPhase = this._valuesPhase;\n    var valuesPhaseIndex;\n    if (!valuesPhase) {\n        valuesPhase = this._valuesPhase = new Array(length);\n        for (valuesPhaseIndex=0; valuesPhaseIndex<length; ++valuesPhaseIndex) {\n            valuesPhase[valuesPhaseIndex] = 0;\n        }\n    }\n    valuesPhaseIndex = valuesPhase[index];\n\n    if (index === 0 && this._zerothIsAccum) {\n        this._accum = value;\n        this._gotAccum = gotAccum = true;\n        valuesPhase[index] = ((valuesPhaseIndex === 0)\n            ? 1 : 2);\n    } else if (index === -1) {\n        this._accum = value;\n        this._gotAccum = gotAccum = true;\n    } else {\n        if (valuesPhaseIndex === 0) {\n            valuesPhase[index] = 1;\n        } else {\n            valuesPhase[index] = 2;\n            this._accum = value;\n        }\n    }\n    if (!gotAccum) return;\n\n    var callback = this._callback;\n    var receiver = this._promise._boundValue();\n    var ret;\n\n    for (var i = this._reducingIndex; i < length; ++i) {\n        valuesPhaseIndex = valuesPhase[i];\n        if (valuesPhaseIndex === 2) {\n            this._reducingIndex = i + 1;\n            continue;\n        }\n        if (valuesPhaseIndex !== 1) return;\n        value = values[i];\n        this._promise._pushContext();\n        if (isEach) {\n            preservedValues.push(value);\n            ret = tryCatch(callback).call(receiver, value, i, length);\n        }\n        else {\n            ret = tryCatch(callback)\n                .call(receiver, this._accum, value, i, length);\n        }\n        this._promise._popContext();\n\n        if (ret === errorObj) return this._reject(ret.e);\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (maybePromise._isPending()) {\n                valuesPhase[i] = 4;\n                return maybePromise._proxyPromiseArray(this, i);\n            } else if (maybePromise._isFulfilled()) {\n                ret = maybePromise._value();\n            } else {\n                return this._reject(maybePromise._reason());\n            }\n        }\n\n        this._reducingIndex = i + 1;\n        this._accum = ret;\n    }\n\n    this._resolve(isEach ? preservedValues : this._accum);\n};\n\nfunction reduce(promises, fn, initialValue, _each) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n    return array.promise();\n}\n\nPromise.prototype.reduce = function (fn, initialValue) {\n    return reduce(this, fn, initialValue, null);\n};\n\nPromise.reduce = function (promises, fn, initialValue, _each) {\n    return reduce(promises, fn, initialValue, _each);\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],31:[function(_dereq_,module,exports){\n\"use strict\";\nvar schedule;\nvar util = _dereq_(\"./util\");\nvar noAsyncScheduler = function() {\n    throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/m3OTXk\\u000a\");\n};\nif (util.isNode && typeof MutationObserver === \"undefined\") {\n    var GlobalSetImmediate = global.setImmediate;\n    var ProcessNextTick = process.nextTick;\n    schedule = util.isRecentNode\n                ? function(fn) { GlobalSetImmediate.call(global, fn); }\n                : function(fn) { ProcessNextTick.call(process, fn); };\n} else if ((typeof MutationObserver !== \"undefined\") &&\n          !(typeof window !== \"undefined\" &&\n            window.navigator &&\n            window.navigator.standalone)) {\n    schedule = function(fn) {\n        var div = document.createElement(\"div\");\n        var observer = new MutationObserver(fn);\n        observer.observe(div, {attributes: true});\n        return function() { div.classList.toggle(\"foo\"); };\n    };\n    schedule.isStatic = true;\n} else if (typeof setImmediate !== \"undefined\") {\n    schedule = function (fn) {\n        setImmediate(fn);\n    };\n} else if (typeof setTimeout !== \"undefined\") {\n    schedule = function (fn) {\n        setTimeout(fn, 0);\n    };\n} else {\n    schedule = noAsyncScheduler;\n}\nmodule.exports = schedule;\n\n},{\"./util\":38}],32:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\n    function(Promise, PromiseArray) {\nvar PromiseInspection = Promise.PromiseInspection;\nvar util = _dereq_(\"./util.js\");\n\nfunction SettledPromiseArray(values) {\n    this.constructor$(values);\n}\nutil.inherits(SettledPromiseArray, PromiseArray);\n\nSettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n    this._values[index] = inspection;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n    }\n};\n\nSettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 268435456;\n    ret._settledValue = value;\n    this._promiseResolved(index, ret);\n};\nSettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 134217728;\n    ret._settledValue = reason;\n    this._promiseResolved(index, ret);\n};\n\nPromise.settle = function (promises) {\n    return new SettledPromiseArray(promises).promise();\n};\n\nPromise.prototype.settle = function () {\n    return new SettledPromiseArray(this).promise();\n};\n};\n\n},{\"./util.js\":38}],33:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar RangeError = _dereq_(\"./errors.js\").RangeError;\nvar AggregateError = _dereq_(\"./errors.js\").AggregateError;\nvar isArray = util.isArray;\n\n\nfunction SomePromiseArray(values) {\n    this.constructor$(values);\n    this._howMany = 0;\n    this._unwrap = false;\n    this._initialized = false;\n}\nutil.inherits(SomePromiseArray, PromiseArray);\n\nSomePromiseArray.prototype._init = function () {\n    if (!this._initialized) {\n        return;\n    }\n    if (this._howMany === 0) {\n        this._resolve([]);\n        return;\n    }\n    this._init$(undefined, -5);\n    var isArrayResolved = isArray(this._values);\n    if (!this._isResolved() &&\n        isArrayResolved &&\n        this._howMany > this._canPossiblyFulfill()) {\n        this._reject(this._getRangeError(this.length()));\n    }\n};\n\nSomePromiseArray.prototype.init = function () {\n    this._initialized = true;\n    this._init();\n};\n\nSomePromiseArray.prototype.setUnwrap = function () {\n    this._unwrap = true;\n};\n\nSomePromiseArray.prototype.howMany = function () {\n    return this._howMany;\n};\n\nSomePromiseArray.prototype.setHowMany = function (count) {\n    this._howMany = count;\n};\n\nSomePromiseArray.prototype._promiseFulfilled = function (value) {\n    this._addFulfilled(value);\n    if (this._fulfilled() === this.howMany()) {\n        this._values.length = this.howMany();\n        if (this.howMany() === 1 && this._unwrap) {\n            this._resolve(this._values[0]);\n        } else {\n            this._resolve(this._values);\n        }\n    }\n\n};\nSomePromiseArray.prototype._promiseRejected = function (reason) {\n    this._addRejected(reason);\n    if (this.howMany() > this._canPossiblyFulfill()) {\n        var e = new AggregateError();\n        for (var i = this.length(); i < this._values.length; ++i) {\n            e.push(this._values[i]);\n        }\n        this._reject(e);\n    }\n};\n\nSomePromiseArray.prototype._fulfilled = function () {\n    return this._totalResolved;\n};\n\nSomePromiseArray.prototype._rejected = function () {\n    return this._values.length - this.length();\n};\n\nSomePromiseArray.prototype._addRejected = function (reason) {\n    this._values.push(reason);\n};\n\nSomePromiseArray.prototype._addFulfilled = function (value) {\n    this._values[this._totalResolved++] = value;\n};\n\nSomePromiseArray.prototype._canPossiblyFulfill = function () {\n    return this.length() - this._rejected();\n};\n\nSomePromiseArray.prototype._getRangeError = function (count) {\n    var message = \"Input array must contain at least \" +\n            this._howMany + \" items but contains only \" + count + \" items\";\n    return new RangeError(message);\n};\n\nSomePromiseArray.prototype._resolveEmptyArray = function () {\n    this._reject(this._getRangeError(0));\n};\n\nfunction some(promises, howMany) {\n    if ((howMany | 0) !== howMany || howMany < 0) {\n        return apiRejection(\"expecting a positive integer\\u000a\\u000a    See http://goo.gl/1wAmHx\\u000a\");\n    }\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(howMany);\n    ret.init();\n    return promise;\n}\n\nPromise.some = function (promises, howMany) {\n    return some(promises, howMany);\n};\n\nPromise.prototype.some = function (howMany) {\n    return some(this, howMany);\n};\n\nPromise._SomePromiseArray = SomePromiseArray;\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],34:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction PromiseInspection(promise) {\n    if (promise !== undefined) {\n        promise = promise._target();\n        this._bitField = promise._bitField;\n        this._settledValue = promise._settledValue;\n    }\n    else {\n        this._bitField = 0;\n        this._settledValue = undefined;\n    }\n}\n\nPromiseInspection.prototype.value = function () {\n    if (!this.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/hc1DLj\\u000a\");\n    }\n    return this._settledValue;\n};\n\nPromiseInspection.prototype.error =\nPromiseInspection.prototype.reason = function () {\n    if (!this.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/hPuiwB\\u000a\");\n    }\n    return this._settledValue;\n};\n\nPromiseInspection.prototype.isFulfilled =\nPromise.prototype._isFulfilled = function () {\n    return (this._bitField & 268435456) > 0;\n};\n\nPromiseInspection.prototype.isRejected =\nPromise.prototype._isRejected = function () {\n    return (this._bitField & 134217728) > 0;\n};\n\nPromiseInspection.prototype.isPending =\nPromise.prototype._isPending = function () {\n    return (this._bitField & 402653184) === 0;\n};\n\nPromiseInspection.prototype.isResolved =\nPromise.prototype._isResolved = function () {\n    return (this._bitField & 402653184) > 0;\n};\n\nPromise.prototype.isPending = function() {\n    return this._target()._isPending();\n};\n\nPromise.prototype.isRejected = function() {\n    return this._target()._isRejected();\n};\n\nPromise.prototype.isFulfilled = function() {\n    return this._target()._isFulfilled();\n};\n\nPromise.prototype.isResolved = function() {\n    return this._target()._isResolved();\n};\n\nPromise.prototype._value = function() {\n    return this._settledValue;\n};\n\nPromise.prototype._reason = function() {\n    this._unsetRejectionIsUnhandled();\n    return this._settledValue;\n};\n\nPromise.prototype.value = function() {\n    var target = this._target();\n    if (!target.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/hc1DLj\\u000a\");\n    }\n    return target._settledValue;\n};\n\nPromise.prototype.reason = function() {\n    var target = this._target();\n    if (!target.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/hPuiwB\\u000a\");\n    }\n    target._unsetRejectionIsUnhandled();\n    return target._settledValue;\n};\n\n\nPromise.PromiseInspection = PromiseInspection;\n};\n\n},{}],35:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar errorObj = util.errorObj;\nvar isObject = util.isObject;\n\nfunction tryConvertToPromise(obj, context) {\n    if (isObject(obj)) {\n        if (obj instanceof Promise) {\n            return obj;\n        }\n        else if (isAnyBluebirdPromise(obj)) {\n            var ret = new Promise(INTERNAL);\n            obj._then(\n                ret._fulfillUnchecked,\n                ret._rejectUncheckedCheckError,\n                ret._progressUnchecked,\n                ret,\n                null\n            );\n            return ret;\n        }\n        var then = util.tryCatch(getThen)(obj);\n        if (then === errorObj) {\n            if (context) context._pushContext();\n            var ret = Promise.reject(then.e);\n            if (context) context._popContext();\n            return ret;\n        } else if (typeof then === \"function\") {\n            return doThenable(obj, then, context);\n        }\n    }\n    return obj;\n}\n\nfunction getThen(obj) {\n    return obj.then;\n}\n\nvar hasProp = {}.hasOwnProperty;\nfunction isAnyBluebirdPromise(obj) {\n    return hasProp.call(obj, \"_promise0\");\n}\n\nfunction doThenable(x, then, context) {\n    var promise = new Promise(INTERNAL);\n    var ret = promise;\n    if (context) context._pushContext();\n    promise._captureStackTrace();\n    if (context) context._popContext();\n    var synchronous = true;\n    var result = util.tryCatch(then).call(x,\n                                        resolveFromThenable,\n                                        rejectFromThenable,\n                                        progressFromThenable);\n    synchronous = false;\n    if (promise && result === errorObj) {\n        promise._rejectCallback(result.e, true, true);\n        promise = null;\n    }\n\n    function resolveFromThenable(value) {\n        if (!promise) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }\n\n    function rejectFromThenable(reason) {\n        if (!promise) return;\n        promise._rejectCallback(reason, synchronous, true);\n        promise = null;\n    }\n\n    function progressFromThenable(value) {\n        if (!promise) return;\n        if (typeof promise._progress === \"function\") {\n            promise._progress(value);\n        }\n    }\n    return ret;\n}\n\nreturn tryConvertToPromise;\n};\n\n},{\"./util.js\":38}],36:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar TimeoutError = Promise.TimeoutError;\n\nvar afterTimeout = function (promise, message) {\n    if (!promise.isPending()) return;\n    \n    var err;\n    if(!util.isPrimitive(message) && (message instanceof Error)) {\n        err = message;\n    } else {\n        if (typeof message !== \"string\") {\n            message = \"operation timed out\";\n        }\n        err = new TimeoutError(message);\n    }\n    util.markAsOriginatingFromRejection(err);\n    promise._attachExtraTrace(err);\n    promise._cancel(err);\n};\n\nvar afterValue = function(value) { return delay(+this).thenReturn(value); };\nvar delay = Promise.delay = function (value, ms) {\n    if (ms === undefined) {\n        ms = value;\n        value = undefined;\n        var ret = new Promise(INTERNAL);\n        setTimeout(function() { ret._fulfill(); }, ms);\n        return ret;\n    }\n    ms = +ms;\n    return Promise.resolve(value)._then(afterValue, null, null, ms, undefined);\n};\n\nPromise.prototype.delay = function (ms) {\n    return delay(this, ms);\n};\n\nfunction successClear(value) {\n    var handle = this;\n    if (handle instanceof Number) handle = +handle;\n    clearTimeout(handle);\n    return value;\n}\n\nfunction failureClear(reason) {\n    var handle = this;\n    if (handle instanceof Number) handle = +handle;\n    clearTimeout(handle);\n    throw reason;\n}\n\nPromise.prototype.timeout = function (ms, message) {\n    ms = +ms;\n    var ret = this.then().cancellable();\n    ret._cancellationParent = this;\n    var handle = setTimeout(function timeoutTimeout() {\n        afterTimeout(ret, message);\n    }, ms);\n    return ret._then(successClear, failureClear, undefined, handle, undefined);\n};\n\n};\n\n},{\"./util.js\":38}],37:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function (Promise, apiRejection, tryConvertToPromise,\n    createContext) {\n    var TypeError = _dereq_(\"./errors.js\").TypeError;\n    var inherits = _dereq_(\"./util.js\").inherits;\n    var PromiseInspection = Promise.PromiseInspection;\n\n    function inspectionMapper(inspections) {\n        var len = inspections.length;\n        for (var i = 0; i < len; ++i) {\n            var inspection = inspections[i];\n            if (inspection.isRejected()) {\n                return Promise.reject(inspection.error());\n            }\n            inspections[i] = inspection._settledValue;\n        }\n        return inspections;\n    }\n\n    function thrower(e) {\n        setTimeout(function(){throw e;}, 0);\n    }\n\n    function castPreservingDisposable(thenable) {\n        var maybePromise = tryConvertToPromise(thenable);\n        if (maybePromise !== thenable &&\n            typeof thenable._isDisposable === \"function\" &&\n            typeof thenable._getDisposer === \"function\" &&\n            thenable._isDisposable()) {\n            maybePromise._setDisposable(thenable._getDisposer());\n        }\n        return maybePromise;\n    }\n    function dispose(resources, inspection) {\n        var i = 0;\n        var len = resources.length;\n        var ret = Promise.defer();\n        function iterator() {\n            if (i >= len) return ret.resolve();\n            var maybePromise = castPreservingDisposable(resources[i++]);\n            if (maybePromise instanceof Promise &&\n                maybePromise._isDisposable()) {\n                try {\n                    maybePromise = tryConvertToPromise(\n                        maybePromise._getDisposer().tryDispose(inspection),\n                        resources.promise);\n                } catch (e) {\n                    return thrower(e);\n                }\n                if (maybePromise instanceof Promise) {\n                    return maybePromise._then(iterator, thrower,\n                                              null, null, null);\n                }\n            }\n            iterator();\n        }\n        iterator();\n        return ret.promise;\n    }\n\n    function disposerSuccess(value) {\n        var inspection = new PromiseInspection();\n        inspection._settledValue = value;\n        inspection._bitField = 268435456;\n        return dispose(this, inspection).thenReturn(value);\n    }\n\n    function disposerFail(reason) {\n        var inspection = new PromiseInspection();\n        inspection._settledValue = reason;\n        inspection._bitField = 134217728;\n        return dispose(this, inspection).thenThrow(reason);\n    }\n\n    function Disposer(data, promise, context) {\n        this._data = data;\n        this._promise = promise;\n        this._context = context;\n    }\n\n    Disposer.prototype.data = function () {\n        return this._data;\n    };\n\n    Disposer.prototype.promise = function () {\n        return this._promise;\n    };\n\n    Disposer.prototype.resource = function () {\n        if (this.promise().isFulfilled()) {\n            return this.promise().value();\n        }\n        return null;\n    };\n\n    Disposer.prototype.tryDispose = function(inspection) {\n        var resource = this.resource();\n        var context = this._context;\n        if (context !== undefined) context._pushContext();\n        var ret = resource !== null\n            ? this.doDispose(resource, inspection) : null;\n        if (context !== undefined) context._popContext();\n        this._promise._unsetDisposable();\n        this._data = null;\n        return ret;\n    };\n\n    Disposer.isDisposer = function (d) {\n        return (d != null &&\n                typeof d.resource === \"function\" &&\n                typeof d.tryDispose === \"function\");\n    };\n\n    function FunctionDisposer(fn, promise, context) {\n        this.constructor$(fn, promise, context);\n    }\n    inherits(FunctionDisposer, Disposer);\n\n    FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n        var fn = this.data();\n        return fn.call(resource, resource, inspection);\n    };\n\n    function maybeUnwrapDisposer(value) {\n        if (Disposer.isDisposer(value)) {\n            this.resources[this.index]._setDisposable(value);\n            return value.promise();\n        }\n        return value;\n    }\n\n    Promise.using = function () {\n        var len = arguments.length;\n        if (len < 2) return apiRejection(\n                        \"you must pass at least 2 arguments to Promise.using\");\n        var fn = arguments[len - 1];\n        if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n\n        var input;\n        var spreadArgs = true;\n        if (len === 2 && Array.isArray(arguments[0])) {\n            input = arguments[0];\n            len = input.length;\n            spreadArgs = false;\n        } else {\n            input = arguments;\n            len--;\n        }\n        var resources = new Array(len);\n        for (var i = 0; i < len; ++i) {\n            var resource = input[i];\n            if (Disposer.isDisposer(resource)) {\n                var disposer = resource;\n                resource = resource.promise();\n                resource._setDisposable(disposer);\n            } else {\n                var maybePromise = tryConvertToPromise(resource);\n                if (maybePromise instanceof Promise) {\n                    resource =\n                        maybePromise._then(maybeUnwrapDisposer, null, null, {\n                            resources: resources,\n                            index: i\n                    }, undefined);\n                }\n            }\n            resources[i] = resource;\n        }\n\n        var promise = Promise.settle(resources)\n            .then(inspectionMapper)\n            .then(function(vals) {\n                promise._pushContext();\n                var ret;\n                try {\n                    ret = spreadArgs\n                        ? fn.apply(undefined, vals) : fn.call(undefined,  vals);\n                } finally {\n                    promise._popContext();\n                }\n                return ret;\n            })\n            ._then(\n                disposerSuccess, disposerFail, undefined, resources, undefined);\n        resources.promise = promise;\n        return promise;\n    };\n\n    Promise.prototype._setDisposable = function (disposer) {\n        this._bitField = this._bitField | 262144;\n        this._disposer = disposer;\n    };\n\n    Promise.prototype._isDisposable = function () {\n        return (this._bitField & 262144) > 0;\n    };\n\n    Promise.prototype._getDisposer = function () {\n        return this._disposer;\n    };\n\n    Promise.prototype._unsetDisposable = function () {\n        this._bitField = this._bitField & (~262144);\n        this._disposer = undefined;\n    };\n\n    Promise.prototype.disposer = function (fn) {\n        if (typeof fn === \"function\") {\n            return new FunctionDisposer(fn, this, createContext());\n        }\n        throw new TypeError();\n    };\n\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],38:[function(_dereq_,module,exports){\n\"use strict\";\nvar es5 = _dereq_(\"./es5.js\");\nvar canEvaluate = typeof navigator == \"undefined\";\nvar haveGetters = (function(){\n    try {\n        var o = {};\n        es5.defineProperty(o, \"f\", {\n            get: function () {\n                return 3;\n            }\n        });\n        return o.f === 3;\n    }\n    catch (e) {\n        return false;\n    }\n\n})();\n\nvar errorObj = {e: {}};\nvar tryCatchTarget;\nfunction tryCatcher() {\n    try {\n        var target = tryCatchTarget;\n        tryCatchTarget = null;\n        return target.apply(this, arguments);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n\nvar inherits = function(Child, Parent) {\n    var hasProp = {}.hasOwnProperty;\n\n    function T() {\n        this.constructor = Child;\n        this.constructor$ = Parent;\n        for (var propertyName in Parent.prototype) {\n            if (hasProp.call(Parent.prototype, propertyName) &&\n                propertyName.charAt(propertyName.length-1) !== \"$\"\n           ) {\n                this[propertyName + \"$\"] = Parent.prototype[propertyName];\n            }\n        }\n    }\n    T.prototype = Parent.prototype;\n    Child.prototype = new T();\n    return Child.prototype;\n};\n\n\nfunction isPrimitive(val) {\n    return val == null || val === true || val === false ||\n        typeof val === \"string\" || typeof val === \"number\";\n\n}\n\nfunction isObject(value) {\n    return !isPrimitive(value);\n}\n\nfunction maybeWrapAsError(maybeError) {\n    if (!isPrimitive(maybeError)) return maybeError;\n\n    return new Error(safeToString(maybeError));\n}\n\nfunction withAppended(target, appendee) {\n    var len = target.length;\n    var ret = new Array(len + 1);\n    var i;\n    for (i = 0; i < len; ++i) {\n        ret[i] = target[i];\n    }\n    ret[i] = appendee;\n    return ret;\n}\n\nfunction getDataPropertyOrDefault(obj, key, defaultValue) {\n    if (es5.isES5) {\n        var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n        if (desc != null) {\n            return desc.get == null && desc.set == null\n                    ? desc.value\n                    : defaultValue;\n        }\n    } else {\n        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n    }\n}\n\nfunction notEnumerableProp(obj, name, value) {\n    if (isPrimitive(obj)) return obj;\n    var descriptor = {\n        value: value,\n        configurable: true,\n        enumerable: false,\n        writable: true\n    };\n    es5.defineProperty(obj, name, descriptor);\n    return obj;\n}\n\nfunction thrower(r) {\n    throw r;\n}\n\nvar inheritedDataKeys = (function() {\n    var excludedPrototypes = [\n        Array.prototype,\n        Object.prototype,\n        Function.prototype\n    ];\n\n    var isExcludedProto = function(val) {\n        for (var i = 0; i < excludedPrototypes.length; ++i) {\n            if (excludedPrototypes[i] === val) {\n                return true;\n            }\n        }\n        return false;\n    };\n\n    if (es5.isES5) {\n        var getKeys = Object.getOwnPropertyNames;\n        return function(obj) {\n            var ret = [];\n            var visitedKeys = Object.create(null);\n            while (obj != null && !isExcludedProto(obj)) {\n                var keys;\n                try {\n                    keys = getKeys(obj);\n                } catch (e) {\n                    return ret;\n                }\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (visitedKeys[key]) continue;\n                    visitedKeys[key] = true;\n                    var desc = Object.getOwnPropertyDescriptor(obj, key);\n                    if (desc != null && desc.get == null && desc.set == null) {\n                        ret.push(key);\n                    }\n                }\n                obj = es5.getPrototypeOf(obj);\n            }\n            return ret;\n        };\n    } else {\n        var hasProp = {}.hasOwnProperty;\n        return function(obj) {\n            if (isExcludedProto(obj)) return [];\n            var ret = [];\n\n            /*jshint forin:false */\n            enumeration: for (var key in obj) {\n                if (hasProp.call(obj, key)) {\n                    ret.push(key);\n                } else {\n                    for (var i = 0; i < excludedPrototypes.length; ++i) {\n                        if (hasProp.call(excludedPrototypes[i], key)) {\n                            continue enumeration;\n                        }\n                    }\n                    ret.push(key);\n                }\n            }\n            return ret;\n        };\n    }\n\n})();\n\nvar thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\nfunction isClass(fn) {\n    try {\n        if (typeof fn === \"function\") {\n            var keys = es5.names(fn.prototype);\n\n            var hasMethods = es5.isES5 && keys.length > 1;\n            var hasMethodsOtherThanConstructor = keys.length > 0 &&\n                !(keys.length === 1 && keys[0] === \"constructor\");\n            var hasThisAssignmentAndStaticMethods =\n                thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n            if (hasMethods || hasMethodsOtherThanConstructor ||\n                hasThisAssignmentAndStaticMethods) {\n                return true;\n            }\n        }\n        return false;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction toFastProperties(obj) {\n    /*jshint -W027,-W055,-W031*/\n    function f() {}\n    f.prototype = obj;\n    var l = 8;\n    while (l--) new f();\n    return obj;\n    eval(obj);\n}\n\nvar rident = /^[a-z$_][a-z$_0-9]*$/i;\nfunction isIdentifier(str) {\n    return rident.test(str);\n}\n\nfunction filledRange(count, prefix, suffix) {\n    var ret = new Array(count);\n    for(var i = 0; i < count; ++i) {\n        ret[i] = prefix + i + suffix;\n    }\n    return ret;\n}\n\nfunction safeToString(obj) {\n    try {\n        return obj + \"\";\n    } catch (e) {\n        return \"[no string representation]\";\n    }\n}\n\nfunction markAsOriginatingFromRejection(e) {\n    try {\n        notEnumerableProp(e, \"isOperational\", true);\n    }\n    catch(ignore) {}\n}\n\nfunction originatesFromRejection(e) {\n    if (e == null) return false;\n    return ((e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError) ||\n        e[\"isOperational\"] === true);\n}\n\nfunction canAttachTrace(obj) {\n    return obj instanceof Error && es5.propertyIsWritable(obj, \"stack\");\n}\n\nvar ensureErrorObject = (function() {\n    if (!(\"stack\" in new Error())) {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            try {throw new Error(safeToString(value));}\n            catch(err) {return err;}\n        };\n    } else {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            return new Error(safeToString(value));\n        };\n    }\n})();\n\nfunction classString(obj) {\n    return {}.toString.call(obj);\n}\n\nfunction copyDescriptors(from, to, filter) {\n    var keys = es5.names(from);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        if (filter(key)) {\n            try {\n                es5.defineProperty(to, key, es5.getDescriptor(from, key));\n            } catch (ignore) {}\n        }\n    }\n}\n\nvar ret = {\n    isClass: isClass,\n    isIdentifier: isIdentifier,\n    inheritedDataKeys: inheritedDataKeys,\n    getDataPropertyOrDefault: getDataPropertyOrDefault,\n    thrower: thrower,\n    isArray: es5.isArray,\n    haveGetters: haveGetters,\n    notEnumerableProp: notEnumerableProp,\n    isPrimitive: isPrimitive,\n    isObject: isObject,\n    canEvaluate: canEvaluate,\n    errorObj: errorObj,\n    tryCatch: tryCatch,\n    inherits: inherits,\n    withAppended: withAppended,\n    maybeWrapAsError: maybeWrapAsError,\n    toFastProperties: toFastProperties,\n    filledRange: filledRange,\n    toString: safeToString,\n    canAttachTrace: canAttachTrace,\n    ensureErrorObject: ensureErrorObject,\n    originatesFromRejection: originatesFromRejection,\n    markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n    classString: classString,\n    copyDescriptors: copyDescriptors,\n    hasDevTools: typeof chrome !== \"undefined\" && chrome &&\n                 typeof chrome.loadTimes === \"function\",\n    isNode: typeof process !== \"undefined\" &&\n        classString(process).toLowerCase() === \"[object process]\"\n};\nret.isRecentNode = ret.isNode && (function() {\n    var version = process.versions.node.split(\".\").map(Number);\n    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);\n})();\n\nif (ret.isNode) ret.toFastProperties(process);\n\ntry {throw new Error(); } catch (e) {ret.lastLineError = e;}\nmodule.exports = ret;\n\n},{\"./es5.js\":14}]},{},[4])(4)\n});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(116), __webpack_require__(17), __webpack_require__(134).setImmediate))\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar initialModalState = Immutable.fromJS({\n    showHowTo: false,\n    showTOS: false,\n    showWelcome: null,\n    showBudget101: false,\n    showReportWelcome: true,\n    showTemplateModal: false,\n    showDownloadModal: false,\n    feedback: {\n        showFeedback: false,\n        saving: false,\n        showError: false,\n        errorMessage: null\n    },\n    onboardingTour: {\n        showTour: false,\n        currentStep: 0\n    }\n});\nvar ModalStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return initialModalState;\n    },\n\n    actions: {\n        SHOW_WELCOME: function SHOW_WELCOME() {\n            return initialModalState.mergeDeep({ showWelcome: true });\n        },\n        HIDE_WELCOME: function HIDE_WELCOME() {\n            return initialModalState.mergeDeep({ showWelcome: false });\n        },\n        SHOW_REPORT_WELCOME: function SHOW_REPORT_WELCOME(state) {\n            return state.mergeDeep({ showReportWelcome: true });\n        },\n        HIDE_REPORT_WELCOME: function HIDE_REPORT_WELCOME(state) {\n            return state.mergeDeep({ showReportWelcome: false });\n        },\n        SHOW_HOWTO: function SHOW_HOWTO() {\n            return initialModalState.mergeDeep({ showHowTo: true });\n        },\n        HIDE_HOWTO: function HIDE_HOWTO(state) {\n            return state.set('showHowTo', false);\n        },\n        SHOW_BUDGET_101: function SHOW_BUDGET_101(state, action) {\n            if (action && action.persistState) {\n                return state.mergeDeep({ showBudget101: true });\n            }\n            return initialModalState.mergeDeep({ showBudget101: true });\n        },\n        HIDE_BUDGET_101: function HIDE_BUDGET_101(state) {\n            return state.set('showBudget101', false);\n        },\n        SHOW_TOS: function SHOW_TOS() {\n            return initialModalState.mergeDeep({ showTOS: true });\n        },\n        HIDE_TOS: function HIDE_TOS(state) {\n            return state.set('showTOS', false);\n        },\n        SHOW_FEEDBACK_FORM: function SHOW_FEEDBACK_FORM() {\n            return initialModalState.mergeDeep({ feedback: { showFeedback: true } });\n        },\n        HIDE_FEEDBACK_FORM: function HIDE_FEEDBACK_FORM(state) {\n            return state.mergeDeep({ feedback: { showFeedback: false, showError: false } });\n        },\n        SHOW_FEEDBACK_ERROR: function SHOW_FEEDBACK_ERROR(state, action) {\n            return state.mergeDeep({ feedback: { showError: true, errorMessage: action.errorMessage } });\n        },\n        FEEDBACK_SAVING: function FEEDBACK_SAVING(state) {\n            return state.mergeDeep({ feedback: { saving: true } });\n        },\n        FEEDBACK_SAVED: function FEEDBACK_SAVED() {\n            return initialModalState;\n        },\n        SHOW_DOWNLOAD: function SHOW_DOWNLOAD() {\n            return initialModalState.mergeDeep({ showDownloadModal: true });\n        },\n        HIDE_DOWNLOAD: function HIDE_DOWNLOAD(state) {\n            return state.set('showDownloadModal', false);\n        }\n    }\n});\nexports.default = ModalStore;\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = og.View.extend({\n    template: 'modal-recoverable-error',\n    initialize: function initialize(options) {\n        this.suppressRemoval = options.suppressRemoval;\n    },\n    open: function open(message, subtext, buttons) {\n        this.isOpen = true;\n        this.message = message;\n        this.subtext = subtext;\n        this.buttons = buttons;\n        this.render();\n        var self = this;\n        setTimeout(function () {\n            self.$('.js-alert').addClass('active');\n        }, 1);\n    },\n    close: function close() {\n        if (this.isOpen) {\n            this.isOpen = false;\n            this.trigger('close');\n            this.$('.js-alert').removeClass('active');\n            var self = this;\n            setTimeout(function () {\n                self.remove();\n            }, 100);\n        }\n    },\n\n    events: {\n        'click .ui-modal__wrapper': function clickUiModal__wrapper(e) {\n            e.stopPropagation();\n        },\n        'click .js-close': function clickJsClose() {\n            this.close();\n        },\n        'click .js-button': function clickJsButton(e) {\n            this.trigger('button:click', (0, _jquery2.default)(e.currentTarget).data('index'));\n        }\n    }\n});\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n__webpack_require__(506);\nexports.default = {\n    'athena/download_menu': __webpack_require__(867),\n    'athena/filter-section': __webpack_require__(868),\n    'athena/griddle/panel_aggregates': __webpack_require__(869),\n    'athena/griddle/panel_columns': __webpack_require__(870),\n    'athena/griddle/panel_columns_sortable': __webpack_require__(871),\n    'athena/griddle/panel_filters': __webpack_require__(872),\n    'athena/griddle/select_box': __webpack_require__(873),\n    'athena/griddle_subpanels': __webpack_require__(874),\n    'athena/modal-budget101': __webpack_require__(875),\n    'athena/modal-faq': __webpack_require__(876),\n    'athena/modal-feedback': __webpack_require__(877),\n    'athena/modal-download': __webpack_require__(878),\n    'athena/modal-password': __webpack_require__(879),\n    'athena/modal-recoverable-error': __webpack_require__(880),\n    'athena/modal-tos': __webpack_require__(881),\n    'athena/modal-unrecoverable-error': __webpack_require__(882),\n    'athena/modal-welcome': __webpack_require__(883),\n    'athena/months': __webpack_require__(884),\n    'athena/querygrid/column': __webpack_require__(885),\n    'athena/querygrid/date': __webpack_require__(886),\n    'athena/querygrid/monetary': __webpack_require__(887),\n    'athena/querygrid/numeric': __webpack_require__(888),\n    'athena/querygrid/text': __webpack_require__(889)\n};\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar QueryModel = function () {\n    function QueryModel(q) {\n        _classCallCheck(this, QueryModel);\n\n        this._updates = 0;\n        this.setQuery(q, true);\n    }\n    /** Use this method when you want to update multiple parts of query triggering only single change event. Call `endUpdate` when you are done. */\n\n\n    _createClass(QueryModel, [{\n        key: 'beginUpdate',\n        value: function beginUpdate() {\n            this._updates += 1;\n        }\n        /** Call after you are done updating using `beginUpdate`. */\n\n    }, {\n        key: 'endUpdate',\n        value: function endUpdate(silent) {\n            this._updates -= 1;\n            this.triggerUpdate(silent);\n        }\n        /** Check if the query was changed and fire events if it was. Mainly used for internal purposes. */\n\n    }, {\n        key: 'triggerUpdate',\n        value: function triggerUpdate(silent, force) {\n            var q = this.toJSON();\n            if (this._updates <= 0 && (!_lodash2.default.isEqual(q, this._old_q) || force)) {\n                this._old_q = q;\n                this.trigger('change');\n                if (!silent) {\n                    this.trigger('load', q);\n                }\n            }\n        }\n        /** Set query JSON */\n\n    }, {\n        key: 'setQuery',\n        value: function setQuery(q, silent, force) {\n            this._q = _lodash2.default.extend({\n                fields: [],\n                filter: {},\n                sort: []\n            }, q);\n            this.triggerUpdate(silent, force);\n        }\n        /** Get query JSON */\n\n    }, {\n        key: 'getQuery',\n        value: function getQuery() {\n            return _lodash2.default.cloneDeep(this._q);\n        }\n        /** Get query JSON which is usable to serialize for remote API call */\n\n    }, {\n        key: 'toJSON',\n        value: function toJSON() {\n            var q = _lodash2.default.cloneDeep(this._q) || {};\n            _lodash2.default.each(q.filter || {}, function (val, key) {\n                // remove operators with empty values\n                _lodash2.default.each(val, function (value, op) {\n                    if (value === undefined || value === null || value === '') {\n                        delete q.filter[key][op];\n                    }\n                });\n                // remove fields with no operators\n                if (_lodash2.default.isEmpty(val)) {\n                    delete q.filter[key];\n                }\n            });\n            _lodash2.default.each(['fields', 'filter', 'sort'], function (attr) {\n                if (_lodash2.default.isEmpty(q[attr])) {\n                    delete q[attr];\n                }\n            });\n            return q;\n        }\n        /** Sets the account_code filter object {long_tree_id:[[acc_code],[acc_code2],...], long_tree_id2:[[acc_code],[acc_code2],...]} */\n\n    }, {\n        key: 'setAccountCodeQuery',\n        value: function setAccountCodeQuery(acobject) {\n            this._q.account_codes = acobject;\n            this.triggerUpdate();\n        }\n    }, {\n        key: 'getAccountCodeQuery',\n        value: function getAccountCodeQuery() {\n            return this._q.account_codes;\n        }\n    }, {\n        key: 'setLinkageNodes',\n        value: function setLinkageNodes(linkageNodes, maskNodesForLinkage) {\n            this._q.linkage_nodes = linkageNodes;\n            this._q.mask_nodes_for_linkage = maskNodesForLinkage;\n            this.triggerUpdate();\n        }\n        /** Sets the field clause */\n\n    }, {\n        key: 'fields',\n        value: function fields(_fields) {\n            this._q.fields = _fields;\n            this.triggerUpdate();\n        }\n        /** Gets the field clause */\n\n    }, {\n        key: 'getFields',\n        value: function getFields() {\n            return this._q.fields;\n        }\n        /** Sets the sort clause */\n\n    }, {\n        key: 'sort',\n        value: function sort(fields) {\n            this._q.sort = [];\n            if (fields && fields.length) {\n                this._q.sort = fields;\n            }\n            this.triggerUpdate();\n        }\n        /** Gets the sort clause */\n\n    }, {\n        key: 'getSort',\n        value: function getSort() {\n            return this._q.sort;\n        }\n        /** Gets parts of the query corresponding to the given column */\n\n    }, {\n        key: 'getColumnQuery',\n        value: function getColumnQuery(col) {\n            var ret = {};\n            var sort = _lodash2.default.filter(this._q.sort || [], function (x) {\n                return col in x;\n            });\n            if (sort.length) {\n                ret.sort = sort[0][col];\n            }\n            ret.filter = (this._q.filter || {})[col] || {};\n            return ret;\n        }\n        /** Sets given filter for column. If the value is `undefined`, then filter is removed. */\n\n    }, {\n        key: 'filterColumn',\n        value: function filterColumn(column, operator, value) {\n            var col = this._q.filter[column] = this._q.filter[column] || {};\n            if (value !== undefined) {\n                col[operator] = value;\n            } else {\n                delete col[operator];\n            }\n        }\n        /** Set sorting by a column */\n\n    }, {\n        key: 'sortColumn',\n        value: function sortColumn(field, order) {\n            // For now force only a single column to be sorted to avoid out-of-index sorting\n            if (order) {\n                var obj = {};\n                obj[field] = order;\n                this.sort([obj]);\n            } else {\n                this.sort([]);\n            }\n            this.triggerUpdate();\n        }\n        /** Clear all filters */\n\n    }, {\n        key: 'filterClear',\n        value: function filterClear() {\n            this._q.filter = {};\n            this.triggerUpdate();\n        }\n    }]);\n\n    return QueryModel;\n}();\n// mix-in Backbone Events\n\n\n_lodash2.default.extend(QueryModel.prototype, _backbone2.default.Events);\nexports.default = QueryModel;\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar currentLimits = exports.currentLimits = ['population_served', 'population', 'unemployment_rate', 'percent_in_labor_force', 'percent_individuals_poverty', 'median_income_household', 'mean_income_household', 'income_per_capita', 'burglaries', 'thefts', 'police_dept_civilians', 'police_officers', 'vehicle_thefts', 'assaults', 'robberies'];\nvar scaleLimit = exports.scaleLimit = ['population_served', 'population', 'police_officers'];\nvar compatibleReports = exports.compatibleReports = ['annual'];\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _cookiesJs = __webpack_require__(174);\n\nvar _cookiesJs2 = _interopRequireDefault(_cookiesJs);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar cookieHelper = {\n    setVisitedCookie: function setVisitedCookie(name) {\n        _cookiesJs2.default.set(name, true, { domain: this.parentDomain(), expires: 31556926 });\n    },\n    unsetVisitedCookie: function unsetVisitedCookie(name) {\n        _cookiesJs2.default.expire(name, { domain: this.parentDomain() });\n    },\n    parentDomain: function parentDomain() {\n        //get domain without subdomain\n        return document.domain.replace(/^[^\\.]+\\./, '');\n    }\n};\nexports.default = cookieHelper;\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @class RemoteModel */\nfunction RemoteModel(options) {\n    this.options = _lodash2.default.extend({}, this.options, options);\n    this.queryModel = options.queryModel;\n    this.data = {\n        length: 0\n    };\n}\n_lodash2.default.extend(RemoteModel.prototype, _backbone2.default.Events,\n/** @lends RemoteModel# */\n{\n    options: {\n        pageSize: 1000,\n        scrollOffset: 0,\n        lookaheadRatio: 0,\n        requestDelay: 50\n    },\n    requestHandle: null,\n    queryModel: null,\n    req: null,\n    /**\r\n     * Array-like object containing loaded data.\r\n     * @member\r\n     */\n    data: null,\n    count: null,\n    // dataLength keeps an accurate number of current rows\n    // data.length is indication for grid and contains some empty rows for buffer\n    dataLength: 0,\n    /**\r\n     * Clear stored data.\r\n     * It is useful when query changes and results need to be reloaded.\r\n     */\n    clear: function clear() {\n        for (var key in this.data) {\n            delete this.data[key];\n        }\n        this.dataLength = 0;\n        this.data.length = 0;\n        this.count = null;\n    },\n\n    /**\r\n     * Ensure that the data for a given range is available.\r\n     * If not then request is made. It is usefull to hook this method when viewport of the grid changes.\r\n     */\n    ensureData: function ensureData(from, to) {\n        var range = this.computeRange(from, to);\n        if (!range) {\n            return;\n        }\n        if (this.req) {\n            for (var i = this.req.range.fromPage; i <= this.req.range.toPage; i++) {\n                this.data[i * this.options.pageSize] = undefined;\n            }\n            this.req.abort();\n            this.req = null;\n        }\n        // get query with specified pagination\n        var q = _lodash2.default.extend(this.queryModel.toJSON(), {\n            offset: range.fromPage * this.options.pageSize,\n            limit: (range.toPage - range.fromPage + 1) * this.options.pageSize\n        });\n        this.processQuery(q);\n        if (this.requestHandle !== null) {\n            clearTimeout(this.requestHandle);\n        }\n        this.requestHandle = setTimeout(_lodash2.default.bind(this.sendRequest, this, q, range), this.options.requestDelay);\n    },\n    processQuery: function processQuery(q) {\n        // if there is a virtual `text` operator, replace it with `eq`\n        // then in onSuccess handler we will decide if we're gonna keep it\n        if (q.filter) {\n            for (var column in q.filter) {\n                var obj = q.filter[column];\n                if ('text' in obj) {\n                    obj.eq = obj.text;\n                    delete obj.text;\n                }\n            }\n        }\n    },\n\n    /**\r\n     * Computes pages that need to be load for a given viewport range.\r\n     * @protected\r\n     */\n    computeRange: function computeRange(from, to, lookahead) {\n        if (from < 0) {\n            from = 0;\n        }\n        var fromPage = Math.floor(from / this.options.pageSize);\n        var toPage = Math.floor(to / this.options.pageSize);\n        // skip already loaded pages\n        while (this.data[fromPage * this.options.pageSize] !== undefined && fromPage < toPage) {\n            fromPage++;\n        }\n        while (this.data[toPage * this.options.pageSize] !== undefined && fromPage < toPage) {\n            toPage--;\n        }\n        if (fromPage === toPage && this.data[fromPage * this.options.pageSize] !== undefined && this.dataLength >= to) {\n            if (!lookahead && to % this.options.pageSize > this.options.pageSize * this.options.lookaheadRatio) {\n                return this.computeRange(from + this.options.pageSize, to + this.options.pageSize, true);\n            }\n            return null;\n        }\n        return {\n            from: from < 0 ? 0 : from,\n            to: to,\n            toPage: toPage,\n            fromPage: fromPage\n        };\n    },\n\n    /**\r\n     * Send request for a given query using AJAX.\r\n     * @protected\r\n     */\n    sendRequest: function sendRequest(q, range) {\n        var _this = this;\n\n        for (var i = range.fromPage; i <= range.toPage; i++) {\n            // null indicates a 'this.requested but not available yet'\n            this.data[i * this.options.pageSize] = null;\n        }\n        this.trigger('loading', range);\n        this.req = this.options.endpoint(q, function (err, response) {\n            if (err) {\n                _this.onError(range, q);\n            } else {\n                _this.onSuccess(range, q, response.body);\n            }\n        });\n        this.req.range = range;\n    },\n\n    /**\r\n     * Handle successfull request.\r\n     * @protected\r\n     */\n    onSuccess: function onSuccess(range, q, resp) {\n        var from = range.fromPage * this.options.pageSize;\n        var to = from + resp.transactions.length;\n        // detect if there is a virtual `text` operator in query\n        // if it is and result is not empty, we keep it as `eq`\n        // otherwise change it to `contains` and do another query\n        q = this.queryModel.toJSON();\n        if (q.filter) {\n            for (var column in q.filter) {\n                var obj = q.filter[column];\n                if ('text' in obj) {\n                    if (resp.transactions.length === 0) {\n                        obj.contains = obj.text;\n                        delete obj.text;\n                        this.queryModel.setQuery(q);\n                        return;\n                    } else {\n                        obj.eq = obj.text;\n                        delete obj.text;\n                        this.queryModel.setQuery(q, true);\n                    }\n                }\n            }\n        }\n        if (resp.transactions.length > 0) {\n            // Don't use 'resp.count;' since the user could scroll to a very\n            // distant row which will take a while to query for. Add a scroll buffer to this length\n            this.dataLength = Math.max(to, this.dataLength);\n        }\n        this.data.length = this.dataLength;\n        if (resp.transactions.length < this.options.pageSize) {\n            // we've reached the end and have final count\n            this.count = this.data.length;\n        } else {\n            // add some empty rows to the bottom so user have a buffer for smoother scrolling\n            this.data.length += this.options.scrollOffset;\n        }\n        for (var i = 0; i < resp.transactions.length; i++) {\n            this.data[from + i] = resp.transactions[i];\n            this.data[from + i].index = from + i;\n        }\n        this.req = null;\n        this.trigger('loaded', {\n            from: from,\n            to: to,\n            reqsize: this.options.pageSize,\n            count: this.count,\n            total_count_estimate: resp.total_count_estimate,\n            q: q,\n            data: resp.transactions\n        });\n    },\n\n    /**\r\n     * Handle request error\r\n     * @protected\r\n     */\n    onError: function onError(range, q, status) {\n        if (status !== 'abort') {\n            this.trigger('error', range);\n        }\n        this.req = null;\n    }\n});\nexports.default = RemoteModel;\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @class ContextMenu */\nfunction ContextMenu(options) {\n    this.options = _lodash2.default.extend({\n        container: (0, _jquery2.default)('body')\n    }, options);\n    _lodash2.default.bindAll(this, 'handleContextMenu', 'handleClick', 'hideMenu');\n}\n_lodash2.default.extend(ContextMenu.prototype, _backbone2.default.Events,\n/** @lends ContextMenu# */\n{\n    queryModel: null,\n    grid: null,\n    handler: null,\n    menu: null,\n    choices: {\n        text: [{\n            label: 'Search for ',\n            operator: 'eq'\n        }],\n        date: [{\n            label: 'At or Before ',\n            operator: 'le'\n        }, {\n            label: 'On ',\n            operator: 'eq'\n        }, {\n            label: 'At or After ',\n            operator: 'ge'\n        }],\n        default: [{\n            label: 'At Most ',\n            operator: 'le'\n        }, {\n            label: 'Equal to ',\n            operator: 'eq'\n        }, {\n            label: 'At Least ',\n            operator: 'ge'\n        }],\n        blank: [{\n            label: 'Search for Blank Cells',\n            operator: 'null',\n            value: true\n        }, {\n            label: 'Search for Non-Blanks',\n            operator: 'notnull',\n            value: true\n        }]\n    },\n    /** Initialize the plugin, called by slicgrid when registering */\n    init: function init(grid) {\n        this.queryModel = this.options.queryModel;\n        this.grid = grid;\n        this.grid.on('click', this.handleContextMenu, this);\n    },\n\n    /** Destroy the plugin, called by slickgrid */\n    destroy: function destroy() {\n        this.menu.remove();\n    },\n\n    /** handler when the menu is clicked\r\n        @protected */\n    handleClick: function handleClick(ev) {\n        var data = (0, _jquery2.default)(ev.currentTarget).data();\n        _grid_report_actions2.default.filterColumn(data.column.id, data.operator, data.value);\n        this.trigger('action', 'filter-' + data.operator, data.column.id);\n        this.hideMenu();\n    },\n\n    /** handler when menu is invoked, renders and displays the menu\r\n        @protected */\n    handleContextMenu: function handleContextMenu(e) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        if (this.grid.options.showDropdown) {\n            this.hideMenu();\n            this.menu = (0, _jquery2.default)('<div class=\"ui-dropdown__target griddle-context-menu ready\"></div>');\n            var menu = this.menu;\n            var cell = this.grid.getCellFromEvent(e);\n            var column = this.grid.getColumns()[cell.cell];\n            var cellValue = this.grid.getDataItem(cell.row)[column.id];\n            var choices = this.choices[column.type] || this.choices['default'];\n            var formatter = _utils2.default.getSimpleFormatter(column, this.grid.locale);\n            if (cellValue == null) {\n                choices = this.choices.blank;\n            }\n            _lodash2.default.each(choices, function (choice) {\n                var elementData = _lodash2.default.extend({\n                    column: column\n                }, choice);\n                if (cellValue != null) {\n                    elementData.label += formatter(cellValue);\n                    elementData.value = cellValue;\n                }\n                (0, _jquery2.default)('<div class=\"dropdown__row js-select-option\"></div>').data(elementData).text(elementData.label).appendTo(menu);\n            });\n            this.grid.trigger('dropdownOpened', this);\n            this.menu.appendTo(this.options.container).on('click', '.js-select-option', this.handleClick).position({\n                of: e,\n                my: 'left top-10',\n                at: 'center middle',\n                collision: 'flipfit',\n                using: this.options.positionCallback ? this.options.positionCallback : null\n            }).css({ 'top': e.pageY }).addClass('open');\n        }\n    },\n\n    /** Hide the menu and remove its element from DOM */\n    hideMenu: function hideMenu() {\n        if (this.menu) {\n            this.menu.remove();\n            this.menu = null;\n        }\n    },\n    isInsideClicked: function isInsideClicked(ev) {\n        return this.menu && (0, _jquery2.default)(ev.target).parents().addBack().is(this.menu);\n    }\n});\nexports.default = ContextMenu;\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _selector = __webpack_require__(943);\n\nvar _selector2 = _interopRequireDefault(_selector);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _selector2.default.extend({\n    close: function close() {\n        _selector2.default.prototype.close.call(this);\n        var dropdown = this.$('.dropdown');\n        dropdown.removeClass('open');\n        setTimeout(function () {\n            dropdown.removeClass('ready');\n        }, 140);\n        (0, _jquery2.default)(this).removeClass('active');\n    },\n    open: function open() {\n        _selector2.default.prototype.open.call(this);\n        this.selfClicked = true;\n        var dropdown = this.$('.dropdown');\n        dropdown.addClass('ready');\n        setTimeout(function () {\n            dropdown.addClass('open');\n        }, 1);\n        (0, _jquery2.default)(this).addClass('active');\n    }\n});\n\n/***/ }),\n/* 266 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = setDefaults;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = getDefaults;\n/* harmony export (immutable) */ __webpack_exports__[\"e\"] = setI18n;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = getI18n;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return reactI18nextModule; });\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar defaultOptions = {\n  wait: false,\n  withRef: false,\n  bindI18n: 'languageChanged loaded',\n  bindStore: 'added removed',\n  translateFuncName: 't',\n  nsMode: 'default',\n  usePureComponent: false\n};\n\nvar i18n = void 0;\n\nfunction setDefaults(options) {\n  defaultOptions = _extends({}, defaultOptions, options);\n}\n\nfunction getDefaults() {\n  return defaultOptions;\n}\n\nfunction setI18n(instance) {\n  i18n = instance;\n}\n\nfunction getI18n() {\n  return i18n;\n}\n\nvar reactI18nextModule = {\n  type: '3rdParty',\n\n  init: function init(instance) {\n    setDefaults(instance.options.react);\n    setI18n(instance);\n  }\n};\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nif (typeof module !== 'undefined' && module.exports) {\n    module.exports = isSupported;\n} else if (window) {\n    window.mapboxgl = window.mapboxgl || {};\n    window.mapboxgl.supported = isSupported;\n}\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n    return !!(\n        isBrowser() &&\n        isArraySupported() &&\n        isFunctionSupported() &&\n        isObjectSupported() &&\n        isJSONSupported() &&\n        isWorkerSupported() &&\n        isUint8ClampedArraySupported() &&\n        isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)\n    );\n}\n\nfunction isBrowser() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isArraySupported() {\n    return (\n        Array.prototype &&\n        Array.prototype.every &&\n        Array.prototype.filter &&\n        Array.prototype.forEach &&\n        Array.prototype.indexOf &&\n        Array.prototype.lastIndexOf &&\n        Array.prototype.map &&\n        Array.prototype.some &&\n        Array.prototype.reduce &&\n        Array.prototype.reduceRight &&\n        Array.isArray\n    );\n}\n\nfunction isFunctionSupported() {\n    return Function.prototype && Function.prototype.bind;\n}\n\nfunction isObjectSupported() {\n    return (\n        Object.keys &&\n        Object.create &&\n        Object.getPrototypeOf &&\n        Object.getOwnPropertyNames &&\n        Object.isSealed &&\n        Object.isFrozen &&\n        Object.isExtensible &&\n        Object.getOwnPropertyDescriptor &&\n        Object.defineProperty &&\n        Object.defineProperties &&\n        Object.seal &&\n        Object.freeze &&\n        Object.preventExtensions\n    );\n}\n\nfunction isJSONSupported() {\n    return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n}\n\nfunction isWorkerSupported() {\n    return 'Worker' in window;\n}\n\n// IE11 only supports `Uint8ClampedArray` as of version\n// [KB2929437](https://support.microsoft.com/en-us/kb/2929437)\nfunction isUint8ClampedArraySupported() {\n    return 'Uint8ClampedArray' in window;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n    if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n        isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n    }\n\n    return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n    antialias: false,\n    alpha: true,\n    stencil: true,\n    depth: true\n};\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n\n    var canvas = document.createElement('canvas');\n\n    var attributes = Object.create(isSupported.webGLContextAttributes);\n    attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n    if (canvas.probablySupportsContext) {\n        return (\n            canvas.probablySupportsContext('webgl', attributes) ||\n            canvas.probablySupportsContext('experimental-webgl', attributes)\n        );\n\n    } else if (canvas.supportsContext) {\n        return (\n            canvas.supportsContext('webgl', attributes) ||\n            canvas.supportsContext('experimental-webgl', attributes)\n        );\n\n    } else {\n        return (\n            canvas.getContext('webgl', attributes) ||\n            canvas.getContext('experimental-webgl', attributes)\n        );\n    }\n}\n\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _function = __webpack_require__(534);\n\nvar _function2 = _interopRequireDefault(_function);\n\nexports['default'] = {\n  shouldComponentUpdate: _function2['default']\n};\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors ||\n  function getOwnPropertyDescriptors(obj) {\n    var keys = Object.keys(obj);\n    var descriptors = {};\n    for (var i = 0; i < keys.length; i++) {\n      descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n    }\n    return descriptors;\n  };\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  if (typeof process !== 'undefined' && process.noDeprecation === true) {\n    return fn;\n  }\n\n  // Allow for deprecating things in the process of starting up.\n  if (typeof process === 'undefined') {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = Object({\"NODE_ENV\":\"production\"}).NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = __webpack_require__(1004);\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = __webpack_require__(1005);\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined;\n\nexports.promisify = function promisify(original) {\n  if (typeof original !== 'function')\n    throw new TypeError('The \"original\" argument must be of type Function');\n\n  if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {\n    var fn = original[kCustomPromisifiedSymbol];\n    if (typeof fn !== 'function') {\n      throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');\n    }\n    Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n      value: fn, enumerable: false, writable: false, configurable: true\n    });\n    return fn;\n  }\n\n  function fn() {\n    var promiseResolve, promiseReject;\n    var promise = new Promise(function (resolve, reject) {\n      promiseResolve = resolve;\n      promiseReject = reject;\n    });\n\n    var args = [];\n    for (var i = 0; i < arguments.length; i++) {\n      args.push(arguments[i]);\n    }\n    args.push(function (err, value) {\n      if (err) {\n        promiseReject(err);\n      } else {\n        promiseResolve(value);\n      }\n    });\n\n    try {\n      original.apply(this, args);\n    } catch (err) {\n      promiseReject(err);\n    }\n\n    return promise;\n  }\n\n  Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n  if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n    value: fn, enumerable: false, writable: false, configurable: true\n  });\n  return Object.defineProperties(\n    fn,\n    getOwnPropertyDescriptors(original)\n  );\n}\n\nexports.promisify.custom = kCustomPromisifiedSymbol\n\nfunction callbackifyOnRejected(reason, cb) {\n  // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M).\n  // Because `null` is a special error value in callbacks which means \"no error\n  // occurred\", we error-wrap so the callback consumer can distinguish between\n  // \"the promise rejected with null\" or \"the promise fulfilled with undefined\".\n  if (!reason) {\n    var newReason = new Error('Promise was rejected with a falsy value');\n    newReason.reason = reason;\n    reason = newReason;\n  }\n  return cb(reason);\n}\n\nfunction callbackify(original) {\n  if (typeof original !== 'function') {\n    throw new TypeError('The \"original\" argument must be of type Function');\n  }\n\n  // We DO NOT return the promise as it gives the user a false sense that\n  // the promise is actually somehow related to the callback's execution\n  // and that the callback throwing will reject the promise.\n  function callbackified() {\n    var args = [];\n    for (var i = 0; i < arguments.length; i++) {\n      args.push(arguments[i]);\n    }\n\n    var maybeCb = args.pop();\n    if (typeof maybeCb !== 'function') {\n      throw new TypeError('The last argument must be of type Function');\n    }\n    var self = this;\n    var cb = function() {\n      return maybeCb.apply(self, arguments);\n    };\n    // In true node style we process the callback on `nextTick` with all the\n    // implications (stack, `uncaughtException`, `async_hooks`)\n    original.apply(this, args)\n      .then(function(ret) { process.nextTick(cb, null, ret) },\n            function(rej) { process.nextTick(callbackifyOnRejected, rej, cb) });\n  }\n\n  Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));\n  Object.defineProperties(callbackified,\n                          getOwnPropertyDescriptors(original));\n  return callbackified;\n}\nexports.callbackify = callbackify;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(116)))\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * @copyright 2015, Andrey Popp <8mayday@gmail.com>\n *\n * The decorator may be used on classes or methods\n * ```\n * @autobind\n * class FullBound {}\n *\n * class PartBound {\n *   @autobind\n *   method () {}\n * }\n * ```\n */\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\nexports['default'] = autobind;\n\nfunction autobind() {\n  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  if (args.length === 1) {\n    return boundClass.apply(undefined, args);\n  } else {\n    return boundMethod.apply(undefined, args);\n  }\n}\n\n/**\n * Use boundMethod to bind all methods on the target.prototype\n */\nfunction boundClass(target) {\n  // (Using reflect to get all keys including symbols)\n  var keys = undefined;\n  // Use Reflect if exists\n  if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') {\n    keys = Reflect.ownKeys(target.prototype);\n  } else {\n    keys = Object.getOwnPropertyNames(target.prototype);\n    // use symbols if support is provided\n    if (typeof Object.getOwnPropertySymbols === 'function') {\n      keys = keys.concat(Object.getOwnPropertySymbols(target.prototype));\n    }\n  }\n\n  keys.forEach(function (key) {\n    // Ignore special case target method\n    if (key === 'constructor') {\n      return;\n    }\n\n    var descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);\n\n    // Only methods need binding\n    if (typeof descriptor.value === 'function') {\n      Object.defineProperty(target.prototype, key, boundMethod(target, key, descriptor));\n    }\n  });\n  return target;\n}\n\n/**\n * Return a descriptor removing the value and returning a getter\n * The getter will return a .bind version of the function\n * and memoize the result against a symbol on the instance\n */\nfunction boundMethod(target, key, descriptor) {\n  var fn = descriptor.value;\n\n  if (typeof fn !== 'function') {\n    throw new Error('@autobind decorator can only be applied to methods not: ' + typeof fn);\n  }\n\n  // In IE11 calling Object.defineProperty has a side-effect of evaluating the\n  // getter for the property which is being replaced. This causes infinite\n  // recursion and an \"Out of stack space\" error.\n  var definingProperty = false;\n\n  return {\n    configurable: true,\n    get: function get() {\n      if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {\n        return fn;\n      }\n\n      var boundFn = fn.bind(this);\n      definingProperty = true;\n      Object.defineProperty(this, key, {\n        value: boundFn,\n        configurable: true,\n        writable: true\n      });\n      definingProperty = false;\n      return boundFn;\n    }\n  };\n}\nmodule.exports = exports['default'];\n\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;!function() {\n  var d3 = {\n    version: \"3.5.17\"\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = this.document;\n  function d3_documentElement(node) {\n    return node && (node.ownerDocument || node.document || node).documentElement;\n  }\n  function d3_window(node) {\n    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n  }\n  if (d3_document) {\n    try {\n      d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n    } catch (e) {\n      d3_array = function(list) {\n        var i = list.length, array = new Array(i);\n        while (i--) array[i] = list[i];\n        return array;\n      };\n    }\n  }\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  if (d3_document) {\n    try {\n      d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n    } catch (error) {\n      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n      d3_element_prototype.setAttribute = function(name, value) {\n        d3_element_setAttribute.call(this, name, value + \"\");\n      };\n      d3_element_prototype.setAttributeNS = function(space, local, value) {\n        d3_element_setAttributeNS.call(this, space, local, value + \"\");\n      };\n      d3_style_prototype.setProperty = function(name, value, priority) {\n        d3_style_setProperty.call(this, name, value + \"\", priority);\n      };\n    }\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    if (j) return s / j;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n  };\n  d3.variance = function(array, f) {\n    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    } else {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n    if (j > 1) return s / (j - 1);\n  };\n  d3.deviation = function() {\n    var v = d3.variance.apply(this, arguments);\n    return v ? Math.sqrt(v) : v;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array, i0, i1) {\n    if ((m = arguments.length) < 3) {\n      i1 = array.length;\n      if (m < 2) i0 = 0;\n    }\n    var m = i1 - i0, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.transpose = function(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  };\n  function d3_transposeLength(d) {\n    return d.length;\n  }\n  d3.zip = function() {\n    return d3.transpose(arguments);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object, f) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) {\n      object.forEach(function(key, value) {\n        map.set(key, value);\n      });\n    } else if (Array.isArray(object)) {\n      var i = -1, n = object.length, o;\n      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n    } else {\n      for (var key in object) map.set(key, object[key]);\n    }\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  function d3_identity(d) {\n    return d;\n  }\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatches = function(n, s) {\n    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n    d3_selectMatches = function(n, s) {\n      return d3_selectMatcher.call(n, s);\n    };\n    return d3_selectMatches(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3.select(d3_document.documentElement);\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: d3_nsXhtml,\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) {\n        var node = this.node();\n        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n      }\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    function create() {\n      var document = this.ownerDocument, namespace = this.namespaceURI;\n      return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n    }\n    function createNS() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    }\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(d3_selectionRemove);\n  };\n  function d3_selectionRemove() {\n    var parent = this.parentNode;\n    if (parent) parent.removeChild(this);\n  }\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (node = group[i]) {\n            if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n              exitNodes[i] = node;\n            } else {\n              nodeByKeyValue.set(keyValue, node);\n            }\n            keyValues[i] = keyValue;\n          }\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3.select = function(node) {\n    var group;\n    if (typeof node === \"string\") {\n      group = [ d3_select(node, d3_document) ];\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = [ node ];\n      group.parentNode = d3_documentElement(node);\n    }\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group;\n    if (typeof nodes === \"string\") {\n      group = d3_array(d3_selectAll(nodes, d3_document));\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = d3_array(nodes);\n      group.parentNode = null;\n    }\n    return d3_selection([ group ]);\n  };\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  if (d3_document) {\n    d3_selection_onFilters.forEach(function(k) {\n      if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n    });\n  }\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect, d3_event_dragId = 0;\n  function d3_event_dragSuppress(node) {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect == null) {\n      d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n    }\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        var off = function() {\n          w.on(click, null);\n        };\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0) {\n        var window = d3_window(container);\n        if (window.scrollX || window.scrollY) {\n          svg = d3.select(\"body\").append(\"svg\").style({\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            margin: 0,\n            padding: 0,\n            border: \"none\"\n          }, \"important\");\n          var ctm = svg[0][0].getScreenCTM();\n          d3_mouse_bug44083 = !(ctm.f || ctm.e);\n          svg.remove();\n        }\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n    if (d2 < ε2) {\n      S = Math.log(w1 / w0) / ρ;\n      i = function(t) {\n        return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n      };\n    } else {\n      var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n      S = (r1 - r0) / ρ;\n      i = function(t) {\n        var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      };\n    }\n    i.duration = S * 1e3;\n    return i;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    if (!d3_behavior_zoomWheel) {\n      d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n      }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return d3.event.wheelDelta;\n      }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n        return -d3.event.detail;\n      }, \"MozMousePixelScroll\");\n    }\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"interrupt.zoom\", function() {\n            zoomended(dispatch);\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: null\n      };\n      scaleTo(+_);\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.duration = function(_) {\n      if (!arguments.length) return duration;\n      duration = +_;\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function zoomTo(that, p, l, k) {\n      that.__chart__ = {\n        x: view.x,\n        y: view.y,\n        k: view.k\n      };\n      scaleTo(Math.pow(2, k));\n      translateTo(center0 = p, l);\n      that = d3.select(that);\n      if (duration > 0) that = that.transition().duration(duration);\n      that.call(zoom.event);\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      if (!zooming++) dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      if (!--zooming) dispatch({\n        type: \"zoomend\"\n      }), center0 = null;\n    }\n    function mousedowned() {\n      var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0];\n            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n            d3_eventPreventDefault();\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        d3_selection_interrupt.call(that);\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n      translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) {\n      return rgb(color.r, color.g, color.b);\n    }\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function() {\n    d3_timer.apply(this, arguments);\n  };\n  function d3_timer(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n    return timer;\n  }\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now(), timer = d3_timer_queueHead;\n    while (timer) {\n      if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n      timer = timer.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.c) {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      } else {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value = +value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x + pointRadius, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = xm; else x2 = xm;\n        if (below) y1 = ym; else y2 = ym;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      root.find = function(point) {\n        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n    var minDistance2 = Infinity, closestPoint;\n    (function find(node, x1, y1, x2, y2) {\n      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n      if (point = node.point) {\n        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n        if (distance2 < minDistance2) {\n          var distance = Math.sqrt(minDistance2 = distance2);\n          x0 = x - distance, y0 = y - distance;\n          x3 = x + distance, y3 = y + distance;\n          closestPoint = point;\n        }\n      }\n      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n        if (node = children[i & 3]) switch (i & 3) {\n         case 0:\n          find(node, x1, y1, xm, ym);\n          break;\n\n         case 1:\n          find(node, xm, y1, x2, ym);\n          break;\n\n         case 2:\n          find(node, x1, ym, xm, y2);\n          break;\n\n         case 3:\n          find(node, xm, ym, x2, y2);\n          break;\n        }\n      }\n    })(root, x0, y0, x3, y3);\n    return closestPoint;\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransformPop(s) {\n    return s.length ? s.pop() + \",\" : \"\";\n  }\n  function d3_interpolateTranslate(ta, tb, s, q) {\n    if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n      var i = s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    }\n  }\n  function d3_interpolateRotate(ra, rb, s, q) {\n    if (ra !== rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n    }\n  }\n  function d3_interpolateSkew(wa, wb, s, q) {\n    if (wa !== wb) {\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n    }\n  }\n  function d3_interpolateScale(ka, kb, s, q) {\n    if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n      var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] !== 1 || kb[1] !== 1) {\n      s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n    }\n  }\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [];\n    a = d3.transform(a), b = d3.transform(b);\n    d3_interpolateTranslate(a.translate, b.translate, s, q);\n    d3_interpolateRotate(a.rotate, b.rotate, s, q);\n    d3_interpolateSkew(a.skew, b.skew, s, q);\n    d3_interpolateScale(a.scale, b.scale, s, q);\n    a = b = null;\n    return function(t) {\n      var i = -1, n = q.length, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: groupSums[di]\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        timer = null;\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) {\n          alpha = x;\n        } else {\n          timer.c = null, timer.t = NaN, timer = null;\n          event.end({\n            type: \"end\",\n            alpha: alpha = 0\n          });\n        }\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        timer = d3_timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, l = candidates.length, x;\n        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n    function pie(data) {\n      var n = data.length, values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      index.forEach(function(i) {\n        arcs[i] = {\n          data: data[i],\n          value: v = values[i],\n          startAngle: a,\n          endAngle: a += v * k + pa,\n          padAngle: p\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(_) {\n      if (!arguments.length) return value;\n      value = _;\n      return pie;\n    };\n    pie.sort = function(_) {\n      if (!arguments.length) return sort;\n      sort = _;\n      return pie;\n    };\n    pie.startAngle = function(_) {\n      if (!arguments.length) return startAngle;\n      startAngle = _;\n      return pie;\n    };\n    pie.endAngle = function(_) {\n      if (!arguments.length) return endAngle;\n      endAngle = _;\n      return pie;\n    };\n    pie.padAngle = function(_) {\n      if (!arguments.length) return padAngle;\n      padAngle = _;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = root.y = 0;\n      if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    return domain;\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(1, base * n / scale.ticks().length);\n      return function(d) {\n        var i = d / pow(Math.round(log(d)));\n        if (i * base < base - .5) i *= base;\n        return i <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n      0) : (stop - start) / (domain.length - 1 + padding);\n      range = steps(start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundPoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n      0) : (stop - start) / (domain.length - 1 + padding) | 0;\n      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangeRoundPoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  function d3_zero() {\n    return 0;\n  }\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n    function arc() {\n      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n        if (!cw) p1 *= -1;\n        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n      }\n      if (r1) {\n        x0 = r1 * Math.cos(a0 + p1);\n        y0 = r1 * Math.sin(a0 + p1);\n        x1 = r1 * Math.cos(a1 - p1);\n        y1 = r1 * Math.sin(a1 - p1);\n        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n          var h1 = (a0 + a1) / 2;\n          x0 = r1 * Math.cos(h1);\n          y0 = r1 * Math.sin(h1);\n          x1 = y1 = null;\n        }\n      } else {\n        x0 = y0 = 0;\n      }\n      if (r0) {\n        x2 = r0 * Math.cos(a1 - p0);\n        y2 = r0 * Math.sin(a1 - p0);\n        x3 = r0 * Math.cos(a0 + p0);\n        y3 = r0 * Math.sin(a0 + p0);\n        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n          var h0 = (a0 + a1) / 2;\n          x2 = r0 * Math.cos(h0);\n          y2 = r0 * Math.sin(h0);\n          x3 = y3 = null;\n        }\n      } else {\n        x2 = y2 = 0;\n      }\n      if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n        cr = r0 < r1 ^ cw ? 0 : 1;\n        var rc1 = rc, rc0 = rc;\n        if (da < π) {\n          var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n          rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n          rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n        }\n        if (x1 != null) {\n          var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n          if (rc === rc1) {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n          } else {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n          }\n        } else {\n          path.push(\"M\", x0, \",\", y0);\n        }\n        if (x3 != null) {\n          var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n          if (rc === rc0) {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          } else {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          }\n        } else {\n          path.push(\"L\", x2, \",\", y2);\n        }\n      } else {\n        path.push(\"M\", x0, \",\", y0);\n        if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n        path.push(\"L\", x2, \",\", y2);\n        if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n      }\n      path.push(\"Z\");\n      return path.join(\"\");\n    }\n    function circleSegment(r1, cw) {\n      return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.cornerRadius = function(v) {\n      if (!arguments.length) return cornerRadius;\n      cornerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.padRadius = function(v) {\n      if (!arguments.length) return padRadius;\n      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.padAngle = function(v) {\n      if (!arguments.length) return padAngle;\n      padAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcAuto = \"auto\";\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function d3_svg_arcSweep(x0, y0, x1, y1) {\n    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n  }\n  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return points.join(\"L\") + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] - halfπ;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  d3_selectionPrototype.transition = function(name) {\n    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_selectionPrototype.interrupt = function(name) {\n    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n  };\n  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n  function d3_selection_interruptNS(ns) {\n    return function() {\n      var lock, activeId, active;\n      if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        if (--lock.count) delete lock[activeId]; else delete this[ns];\n        lock.active += .5;\n        active.event && active.event.interrupt.call(this, this.__data__, active.index);\n      }\n    };\n  }\n  function d3_transition(groups, ns, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.namespace = ns;\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection, name) {\n    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node[ns][id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.namespace, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node[ns][id].tween.remove(name);\n    } : function(node) {\n      node[ns][id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id, ns = groups.namespace;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node[ns][id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    var ns = this.namespace;\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node[ns][id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node[ns][id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node[ns][id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      try {\n        d3_transitionInheritId = id;\n        d3_selection_each(this, function(node, i, j) {\n          d3_transitionInherit = node[ns][id];\n          type.call(node, node.__data__, i, j);\n        });\n      } finally {\n        d3_transitionInherit = inherit;\n        d3_transitionInheritId = inheritId;\n      }\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node[ns][id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = node[ns][id0];\n          d3_transitionNode(node, i, ns, id1, {\n            time: transition.time,\n            ease: transition.ease,\n            delay: transition.delay + transition.duration,\n            duration: transition.duration\n          });\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id1);\n  };\n  function d3_transitionNamespace(name) {\n    return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n  }\n  function d3_transitionNode(node, i, ns, id, inherit) {\n    var lock = node[ns] || (node[ns] = {\n      active: 0,\n      count: 0\n    }), transition = lock[id], time, timer, duration, ease, tweens;\n    function schedule(elapsed) {\n      var delay = transition.delay;\n      timer.t = delay + time;\n      if (delay <= elapsed) return start(elapsed - delay);\n      timer.c = start;\n    }\n    function start(elapsed) {\n      var activeId = lock.active, active = lock[activeId];\n      if (active) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        --lock.count;\n        delete lock[activeId];\n        active.event && active.event.interrupt.call(node, node.__data__, active.index);\n      }\n      for (var cancelId in lock) {\n        if (+cancelId < id) {\n          var cancel = lock[cancelId];\n          cancel.timer.c = null;\n          cancel.timer.t = NaN;\n          --lock.count;\n          delete lock[cancelId];\n        }\n      }\n      timer.c = tick;\n      d3_timer(function() {\n        if (timer.c && tick(elapsed || 1)) {\n          timer.c = null;\n          timer.t = NaN;\n        }\n        return 1;\n      }, 0, time);\n      lock.active = id;\n      transition.event && transition.event.start.call(node, node.__data__, i);\n      tweens = [];\n      transition.tween.forEach(function(key, value) {\n        if (value = value.call(node, node.__data__, i)) {\n          tweens.push(value);\n        }\n      });\n      ease = transition.ease;\n      duration = transition.duration;\n    }\n    function tick(elapsed) {\n      var t = elapsed / duration, e = ease(t), n = tweens.length;\n      while (n > 0) {\n        tweens[--n].call(node, e);\n      }\n      if (t >= 1) {\n        transition.event && transition.event.end.call(node, node.__data__, i);\n        if (--lock.count) delete lock[id]; else delete node[ns];\n        return 1;\n      }\n    }\n    if (!transition) {\n      time = inherit.time;\n      timer = d3_timer(schedule, 0, time);\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        timer: timer,\n        delay: inherit.delay,\n        duration: inherit.duration,\n        ease: inherit.ease,\n        index: i\n      };\n      inherit = null;\n      ++lock.count;\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = d3_array(arguments);\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (true) this.d3 = d3, !(__WEBPACK_AMD_DEFINE_FACTORY__ = (d3),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// jshint -W079\nvar mapboxgl = module.exports = {};\n\nmapboxgl.version = __webpack_require__(1008).version;\n\nmapboxgl.Map = __webpack_require__(1009);\nmapboxgl.Control = __webpack_require__(199);\nmapboxgl.Navigation = __webpack_require__(1086);\nmapboxgl.Geolocate = __webpack_require__(1087);\nmapboxgl.Attribution = __webpack_require__(577);\nmapboxgl.Popup = __webpack_require__(1088);\n\nmapboxgl.GeoJSONSource = __webpack_require__(277);\nmapboxgl.VideoSource = __webpack_require__(278);\nmapboxgl.ImageSource = __webpack_require__(279);\n\nmapboxgl.Style = __webpack_require__(540);\n\nmapboxgl.LngLat = __webpack_require__(89);\nmapboxgl.LngLatBounds = __webpack_require__(198);\nmapboxgl.Point = __webpack_require__(11);\n\nmapboxgl.Evented = __webpack_require__(55);\nmapboxgl.util = __webpack_require__(10);\n\nmapboxgl.supported = __webpack_require__(39).supported;\n\nvar ajax = __webpack_require__(88);\nmapboxgl.util.getJSON = ajax.getJSON;\nmapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;\n\nvar config = __webpack_require__(556);\nmapboxgl.config = config;\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n    get: function() { return config.ACCESS_TOKEN; },\n    set: function(token) { config.ACCESS_TOKEN = token; }\n});\n\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar MapboxGLFunction = __webpack_require__(541);\n\nexports.interpolated = function(parameters) {\n    var inner = MapboxGLFunction.interpolated(parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports['piecewise-constant'] = function(parameters) {\n    var inner = MapboxGLFunction['piecewise-constant'](parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports.isFunctionDefinition = MapboxGLFunction.isFunctionDefinition;\n\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar unbundle = __webpack_require__(150);\n\nmodule.exports = function validateEnum(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var errors = [];\n\n    if (Array.isArray(valueSpec.values)) { // <=v7\n        if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value));\n        }\n    } else { // >=v8\n        if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', Object.keys(valueSpec.values).join(', '), value));\n        }\n    }\n    return errors;\n};\n\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar validateEnum = __webpack_require__(274);\nvar getType = __webpack_require__(63);\nvar unbundle = __webpack_require__(150);\n\nmodule.exports = function validateFilter(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var type;\n\n    var errors = [];\n\n    if (getType(value) !== 'array') {\n        return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n    }\n\n    if (value.length < 1) {\n        return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n    }\n\n    errors = errors.concat(validateEnum({\n        key: key + '[0]',\n        value: value[0],\n        valueSpec: styleSpec.filter_operator,\n        style: options.style,\n        styleSpec: options.styleSpec\n    }));\n\n    switch (unbundle(value[0])) {\n        case '<':\n        case '<=':\n        case '>':\n        case '>=':\n            if (value.length >= 2 && value[1] == '$type') {\n                errors.push(new ValidationError(key, value, '\"$type\" cannot be use with operator \"%s\"', value[0]));\n            }\n        /* falls through */\n        case '==':\n        case '!=':\n            if (value.length != 3) {\n                errors.push(new ValidationError(key, value, 'filter array for operator \"%s\" must have 3 elements', value[0]));\n            }\n        /* falls through */\n        case 'in':\n        case '!in':\n            if (value.length >= 2) {\n                type = getType(value[1]);\n                if (type !== 'string') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n                } else if (value[1][0] === '@') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n                }\n            }\n            for (var i = 2; i < value.length; i++) {\n                type = getType(value[i]);\n                if (value[1] == '$type') {\n                    errors = errors.concat(validateEnum({\n                        key: key + '[' + i + ']',\n                        value: value[i],\n                        valueSpec: styleSpec.geometry_type,\n                        style: options.style,\n                        styleSpec: options.styleSpec\n                    }));\n                } else if (type === 'string' && value[i][0] === '@') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'filter value cannot be a constant'));\n                } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'string, number, or boolean expected, %s found', type));\n                }\n            }\n            break;\n\n        case 'any':\n        case 'all':\n        case 'none':\n            for (i = 1; i < value.length; i++) {\n                errors = errors.concat(validateFilter({\n                    key: key + '[' + i + ']',\n                    value: value[i],\n                    style: options.style,\n                    styleSpec: options.styleSpec\n                }));\n            }\n            break;\n\n        case 'has':\n        case '!has':\n            type = getType(value[1]);\n            if (value.length !== 2) {\n                errors.push(new ValidationError(key, value, 'filter array for \"%s\" operator must have 2 elements', value[0]));\n            } else if (type !== 'string') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n            } else if (value[1][0] === '@') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n            }\n            break;\n\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Bucket = __webpack_require__(40);\nvar FeatureIndex = __webpack_require__(1050);\nvar vt = __webpack_require__(196);\nvar Protobuf = __webpack_require__(123);\nvar GeoJSONFeature = __webpack_require__(568);\nvar featureFilter = __webpack_require__(124);\nvar CollisionTile = __webpack_require__(1054);\nvar CollisionBoxArray = __webpack_require__(1055);\nvar SymbolInstancesArray = __webpack_require__(1056);\nvar SymbolQuadsArray = __webpack_require__(1057);\n\nmodule.exports = Tile;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @param {Coordinate} coord\n * @param {number} size\n * @private\n */\nfunction Tile(coord, size, sourceMaxZoom) {\n    this.coord = coord;\n    this.uid = util.uniqueId();\n    this.loaded = false; // TODO rename loaded\n    this.isUnloaded = false;\n    this.uses = 0;\n    this.tileSize = size;\n    this.sourceMaxZoom = sourceMaxZoom;\n    this.buckets = {};\n}\n\nTile.prototype = {\n\n    /**\n     * Given a data object with a 'buffers' property, load it into\n     * this tile's elementGroups and buffers properties and set loaded\n     * to true. If the data is null, like in the case of an empty\n     * GeoJSON tile, no-op but still set loaded to true.\n     * @param {Object} data\n     * @returns {undefined}\n     * @private\n     */\n    loadVectorData: function(data, style) {\n        this.loaded = true;\n\n        // empty GeoJSON tile\n        if (!data) return;\n\n        this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray);\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.symbolInstancesArray = new SymbolInstancesArray(data.symbolInstancesArray);\n        this.symbolQuadsArray = new SymbolQuadsArray(data.symbolQuadsArray);\n        this.featureIndex = new FeatureIndex(data.featureIndex, data.rawTileData, this.collisionTile);\n        this.rawTileData = data.rawTileData;\n        this.buckets = unserializeBuckets(data.buckets, style);\n    },\n\n    /**\n     * given a data object and a GL painter, destroy and re-create\n     * all of its buffers.\n     * @param {Object} data\n     * @param {Object} painter\n     * @returns {undefined}\n     * @private\n     */\n    reloadSymbolData: function(data, painter, style) {\n        if (this.isUnloaded) return;\n\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.featureIndex.setCollisionTile(this.collisionTile);\n\n        // Destroy and delete existing symbol buckets\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            if (bucket.type === 'symbol') {\n                bucket.destroy(painter.gl);\n                delete this.buckets[id];\n            }\n        }\n\n        // Add new symbol buckets\n        util.extend(this.buckets, unserializeBuckets(data.buckets, style));\n    },\n\n    /**\n     * Make sure that this tile doesn't own any data within a given\n     * painter, so that it doesn't consume any memory or maintain\n     * any references to the painter.\n     * @param {Object} painter gl painter object\n     * @returns {undefined}\n     * @private\n     */\n    unloadVectorData: function(painter) {\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            bucket.destroy(painter.gl);\n        }\n\n        this.collisionBoxArray = null;\n        this.symbolQuadsArray = null;\n        this.symbolInstancesArray = null;\n        this.collisionTile = null;\n        this.featureIndex = null;\n        this.rawTileData = null;\n        this.buckets = null;\n        this.loaded = false;\n        this.isUnloaded = true;\n    },\n\n    redoPlacement: function(source) {\n        if (!this.loaded || this.redoingPlacement) {\n            this.redoWhenDone = true;\n            return;\n        }\n\n        this.redoingPlacement = true;\n\n        source.dispatcher.send('redo placement', {\n            uid: this.uid,\n            source: source.id,\n            angle: source.map.transform.angle,\n            pitch: source.map.transform.pitch,\n            showCollisionBoxes: source.map.showCollisionBoxes\n        }, done.bind(this), this.workerID);\n\n        function done(_, data) {\n            this.reloadSymbolData(data, source.map.painter, source.map.style);\n            source.fire('tile.load', {tile: this});\n\n            this.redoingPlacement = false;\n            if (this.redoWhenDone) {\n                this.redoPlacement(source);\n                this.redoWhenDone = false;\n            }\n        }\n    },\n\n    getBucket: function(layer) {\n        return this.buckets && this.buckets[layer.ref || layer.id];\n    },\n\n    querySourceFeatures: function(result, params) {\n        if (!this.rawTileData) return;\n\n        if (!this.vtLayers) {\n            this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        }\n\n        var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer];\n\n        if (!layer) return;\n\n        var filter = featureFilter(params.filter);\n        var coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y };\n\n        for (var i = 0; i < layer.length; i++) {\n            var feature = layer.feature(i);\n            if (filter(feature)) {\n                var geojsonFeature = new GeoJSONFeature(feature, this.coord.z, this.coord.x, this.coord.y);\n                geojsonFeature.tile = coord;\n                result.push(geojsonFeature);\n            }\n        }\n    }\n};\n\nfunction unserializeBuckets(input, style) {\n    // Guard against the case where the map's style has been set to null while\n    // this bucket has been parsing.\n    if (!style) return;\n\n    var output = {};\n    for (var i = 0; i < input.length; i++) {\n        var layer = style.getLayer(input[i].layerId);\n        if (!layer) continue;\n\n        var bucket = Bucket.create(util.extend({\n            layer: layer,\n            childLayers: input[i].childLayerIds\n                .map(style.getLayer.bind(style))\n                .filter(function(layer) { return layer; })\n        }, input[i]));\n        output[bucket.id] = bucket;\n    }\n    return output;\n}\n\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Evented = __webpack_require__(55);\nvar TilePyramid = __webpack_require__(195);\nvar Source = __webpack_require__(194);\nvar urlResolve = __webpack_require__(572);\nvar EXTENT = __webpack_require__(40).EXTENT;\n\nmodule.exports = GeoJSONSource;\n\n/**\n * Create a GeoJSON data source instance given an options object\n * @class GeoJSONSource\n * @param {Object} [options]\n * @param {Object|string} options.data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n * @param {number} [options.maxzoom=18] Maximum zoom to preserve detail at.\n * @param {number} [options.buffer] Tile buffer on each side in pixels.\n * @param {number} [options.tolerance] Simplification tolerance (higher means simpler) in pixels.\n * @param {number} [options.cluster] If the data is a collection of point features, setting this to true clusters the points by radius into groups.\n * @param {number} [options.clusterRadius=50] Radius of each cluster when clustering points, in pixels.\n * @param {number} [options.clusterMaxZoom] Max zoom to cluster points on. Defaults to one zoom less than `maxzoom` (so that last zoom features are not clustered).\n\n * @example\n * var sourceObj = new mapboxgl.GeoJSONSource({\n *    data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [\n *                    -76.53063297271729,\n *                    39.18174077994108\n *                ]\n *            }\n *        }]\n *    }\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction GeoJSONSource(options) {\n    options = options || {};\n\n    this._data = options.data;\n\n    if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n\n    var scale = EXTENT / this.tileSize;\n\n    this.geojsonVtOptions = {\n        buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n        tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n        extent: EXTENT,\n        maxZoom: this.maxzoom\n    };\n\n    this.cluster = options.cluster || false;\n    this.superclusterOptions = {\n        maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom - 1) || (this.maxzoom - 1),\n        extent: EXTENT,\n        radius: (options.clusterRadius || 50) * scale,\n        log: false\n    };\n\n    this._pyramid = new TilePyramid({\n        tileSize: this.tileSize,\n        minzoom: this.minzoom,\n        maxzoom: this.maxzoom,\n        reparseOverscaled: true,\n        load: this._loadTile.bind(this),\n        abort: this._abortTile.bind(this),\n        unload: this._unloadTile.bind(this),\n        add: this._addTile.bind(this),\n        remove: this._removeTile.bind(this),\n        redoPlacement: this._redoTilePlacement.bind(this)\n    });\n}\n\nGeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */{\n    minzoom: 0,\n    maxzoom: 18,\n    tileSize: 512,\n    _dirty: true,\n    isTileClipped: true,\n\n    /**\n     * Update source geojson data and rerender map\n     *\n     * @param {Object|string} data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n     * @returns {GeoJSONSource} this\n     */\n    setData: function(data) {\n        this._data = data;\n        this._dirty = true;\n\n        this.fire('change');\n\n        if (this.map)\n            this.update(this.map.transform);\n\n        return this;\n    },\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._loaded && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._dirty) {\n            this._updateData();\n        }\n\n        if (this._loaded) {\n            this._pyramid.update(this.used, transform);\n        }\n    },\n\n    reload: function() {\n        if (this._loaded) {\n            this._pyramid.reload();\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'geojson',\n            data: this._data\n        };\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    queryRenderedFeatures: Source._queryRenderedVectorFeatures,\n    querySourceFeatures: Source._querySourceFeatures,\n\n    _updateData: function() {\n        this._dirty = false;\n        var options = {\n            tileSize: this.tileSize,\n            source: this.id,\n            geojsonVtOptions: this.geojsonVtOptions,\n            cluster: this.cluster,\n            superclusterOptions: this.superclusterOptions\n        };\n\n        var data = this._data;\n        if (typeof data === 'string') {\n            options.url = typeof window != 'undefined' ? urlResolve(window.location.href, data) : data;\n        } else {\n            options.data = JSON.stringify(data);\n        }\n        this.workerID = this.dispatcher.send('parse geojson', options, function(err) {\n            this._loaded = true;\n            if (err) {\n                this.fire('error', {error: err});\n            } else {\n                this._pyramid.reload();\n                this.fire('change');\n            }\n\n        }.bind(this));\n    },\n\n    _loadTile: function(tile) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            maxZoom: this.maxzoom,\n            tileSize: this.tileSize,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        tile.workerID = this.dispatcher.send('load geojson tile', params, function(err, data) {\n\n            tile.unloadVectorData(this.map.painter);\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                this.fire('tile.error', {tile: tile});\n                return;\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            this.fire('tile.load', {tile: tile});\n\n        }.bind(this), this.workerID);\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, function() {}, tile.workerID);\n    },\n\n    redoPlacement: Source.redoPlacement,\n\n    _redoTilePlacement: function(tile) {\n        tile.redoPlacement(this);\n    }\n});\n\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Tile = __webpack_require__(276);\nvar TileCoord = __webpack_require__(154);\nvar LngLat = __webpack_require__(89);\nvar Point = __webpack_require__(11);\nvar Evented = __webpack_require__(55);\nvar ajax = __webpack_require__(88);\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar RasterBoundsArray = __webpack_require__(197).RasterBoundsArray;\nvar Buffer = __webpack_require__(151);\nvar VertexArrayObject = __webpack_require__(152);\n\nmodule.exports = VideoSource;\n\n/**\n * Create a Video data source instance given an options object\n * @class VideoSource\n * @param {Object} options\n * @param {Array<string>} options.urls An array of URLs to video files\n * @param {Array} options.coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the video. Does not have to be a rectangle.\n * @example\n * var sourceObj = new mapboxgl.VideoSource({\n *    url: [\n *        'https://www.mapbox.com/videos/baltimore-smoke.mp4',\n *        'https://www.mapbox.com/videos/baltimore-smoke.webm'\n *    ],\n *    coordinates: [\n *        [-76.54335737228394, 39.18579907229748],\n *        [-76.52803659439087, 39.1838364847587],\n *        [-76.5295386314392, 39.17683392507606],\n *        [-76.54520273208618, 39.17876344106642]\n *    ]\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction VideoSource(options) {\n    this.urls = options.urls;\n    this.coordinates = options.coordinates;\n\n    ajax.getVideo(options.urls, function(err, video) {\n        // @TODO handle errors via event.\n        if (err) return;\n\n        this.video = video;\n        this.video.loop = true;\n\n        var loopID;\n\n        // start repainting when video starts playing\n        this.video.addEventListener('playing', function() {\n            loopID = this.map.style.animationLoop.set(Infinity);\n            this.map._rerender();\n        }.bind(this));\n\n        // stop repainting when video stops\n        this.video.addEventListener('pause', function() {\n            this.map.style.animationLoop.cancel(loopID);\n        }.bind(this));\n\n        this._loaded = true;\n\n        if (this.map) {\n            this.video.play();\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nVideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{\n    roundZoom: true,\n\n    /**\n     * Return the HTML video element.\n     *\n     * @returns {Object}\n     */\n    getVideo: function() {\n        return this.video;\n    },\n\n    onAdd: function(map) {\n        this.map = map;\n        if (this.video) {\n            this.video.play();\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Update video coordinates and rerender map\n     *\n     * @param {Array} coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the video. Does not have to be a rectangle.\n     * @returns {VideoSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n\n        var tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);\n        array.emplaceBack(tileCoords[1].x, tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile = new Tile(new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row));\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n\n        this.fire('change');\n\n        return this;\n    },\n\n    loaded: function() {\n        return this.video && this.video.readyState >= 2;\n    },\n\n    update: function() {\n        // noop\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    prepare: function() {\n        if (!this._loaded) return;\n        if (this.video.readyState < 2) return; // not enough data for current position\n\n        var gl = this.map.painter.gl;\n        if (!this.tile.texture) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        }\n\n        this._currentTime = this.video.currentTime;\n    },\n\n    getVisibleCoordinates: function() {\n        if (this.tile) return [this.tile.coord];\n        else return [];\n    },\n\n    getTile: function() {\n        return this.tile;\n    },\n\n    serialize: function() {\n        return {\n            type: 'video',\n            urls: this.urls,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Tile = __webpack_require__(276);\nvar TileCoord = __webpack_require__(154);\nvar LngLat = __webpack_require__(89);\nvar Point = __webpack_require__(11);\nvar Evented = __webpack_require__(55);\nvar ajax = __webpack_require__(88);\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar RasterBoundsArray = __webpack_require__(197).RasterBoundsArray;\nvar Buffer = __webpack_require__(151);\nvar VertexArrayObject = __webpack_require__(152);\n\nmodule.exports = ImageSource;\n\n/**\n * Create an Image source instance given an options object\n * @class ImageSource\n * @param {Object} options\n * @param {string} options.url A string URL of an image file\n * @param {Array} options.coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the image. Does not have to be a rectangle.\n * @example\n * var sourceObj = new mapboxgl.ImageSource({\n *    url: 'https://www.mapbox.com/images/foo.png',\n *    coordinates: [\n *        [-76.54335737228394, 39.18579907229748],\n *        [-76.52803659439087, 39.1838364847587],\n *        [-76.5295386314392, 39.17683392507606],\n *        [-76.54520273208618, 39.17876344106642]\n *    ]\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction ImageSource(options) {\n    this.url = options.url;\n    this.coordinates = options.coordinates;\n\n    ajax.getImage(options.url, function(err, image) {\n        // @TODO handle errors via event.\n        if (err) return;\n\n        this.image = image;\n\n        this.image.addEventListener('load', function() {\n            this.map._rerender();\n        }.bind(this));\n\n        this._loaded = true;\n\n        if (this.map) {\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nImageSource.prototype = util.inherit(Evented, /** @lends ImageSource.prototype */ {\n    onAdd: function(map) {\n        this.map = map;\n        if (this.image) {\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Update image coordinates and rerender map\n     *\n     * @param {Array} coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the image. Does not have to be a rectangle.\n     * @returns {ImageSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the image in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        var tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);\n        array.emplaceBack(tileCoords[1].x, tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile = new Tile(new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row));\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n\n        this.fire('change');\n\n        return this;\n    },\n\n    loaded: function() {\n        return this.image && this.image.complete;\n    },\n\n    update: function() {\n        // noop\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    prepare: function() {\n        if (!this._loaded || !this.loaded()) return;\n\n        var painter = this.map.painter;\n        var gl = painter.gl;\n\n        if (!this.tile.texture) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        }\n    },\n\n    getVisibleCoordinates: function() {\n        if (this.tile) return [this.tile.coord];\n        else return [];\n    },\n\n    getTile: function() {\n        return this.tile;\n    },\n\n    serialize: function() {\n        return {\n            type: 'image',\n            urls: this.url,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LngLat = __webpack_require__(89),\n    Point = __webpack_require__(11),\n    Coordinate = __webpack_require__(190),\n    wrap = __webpack_require__(10).wrap,\n    interp = __webpack_require__(191),\n    TileCoord = __webpack_require__(154),\n    EXTENT = __webpack_require__(40).EXTENT,\n    glmatrix = __webpack_require__(90);\n\nvar vec4 = glmatrix.vec4,\n    mat4 = glmatrix.mat4,\n    mat2 = glmatrix.mat2;\n\nmodule.exports = Transform;\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n *\n * @param {number} minZoom\n * @param {number} maxZoom\n * @private\n */\nfunction Transform(minZoom, maxZoom) {\n    this.tileSize = 512; // constant\n\n    this._minZoom = minZoom || 0;\n    this._maxZoom = maxZoom || 22;\n\n    this.latRange = [-85.05113, 85.05113];\n\n    this.width = 0;\n    this.height = 0;\n    this._center = new LngLat(0, 0);\n    this.zoom = 0;\n    this.angle = 0;\n    this._altitude = 1.5;\n    this._pitch = 0;\n    this._unmodified = true;\n}\n\nTransform.prototype = {\n    get minZoom() { return this._minZoom; },\n    set minZoom(zoom) {\n        if (this._minZoom === zoom) return;\n        this._minZoom = zoom;\n        this.zoom = Math.max(this.zoom, zoom);\n    },\n\n    get maxZoom() { return this._maxZoom; },\n    set maxZoom(zoom) {\n        if (this._maxZoom === zoom) return;\n        this._maxZoom = zoom;\n        this.zoom = Math.min(this.zoom, zoom);\n    },\n\n    get worldSize() {\n        return this.tileSize * this.scale;\n    },\n\n    get centerPoint() {\n        return this.size._div(2);\n    },\n\n    get size() {\n        return new Point(this.width, this.height);\n    },\n\n    get bearing() {\n        return -this.angle / Math.PI * 180;\n    },\n    set bearing(bearing) {\n        var b = -wrap(bearing, -180, 180) * Math.PI / 180;\n        if (this.angle === b) return;\n        this._unmodified = false;\n        this.angle = b;\n        this._calcMatrices();\n\n        // 2x2 matrix for rotating points\n        this.rotationMatrix = mat2.create();\n        mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n    },\n\n    get pitch() {\n        return this._pitch / Math.PI * 180;\n    },\n    set pitch(pitch) {\n        var p = Math.min(60, pitch) / 180 * Math.PI;\n        if (this._pitch === p) return;\n        this._unmodified = false;\n        this._pitch = p;\n        this._calcMatrices();\n    },\n\n    get altitude() {\n        return this._altitude;\n    },\n    set altitude(altitude) {\n        var a = Math.max(0.75, altitude);\n        if (this._altitude === a) return;\n        this._unmodified = false;\n        this._altitude = a;\n        this._calcMatrices();\n    },\n\n    get zoom() { return this._zoom; },\n    set zoom(zoom) {\n        var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n        if (this._zoom === z) return;\n        this._unmodified = false;\n        this._zoom = z;\n        this.scale = this.zoomScale(z);\n        this.tileZoom = Math.floor(z);\n        this.zoomFraction = z - this.tileZoom;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get center() { return this._center; },\n    set center(center) {\n        if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n        this._unmodified = false;\n        this._center = center;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    resize: function(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.pixelsToGLUnits = [2 / width, -2 / height];\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get unmodified() { return this._unmodified; },\n\n    zoomScale: function(zoom) { return Math.pow(2, zoom); },\n    scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; },\n\n    project: function(lnglat, worldSize) {\n        return new Point(\n            this.lngX(lnglat.lng, worldSize),\n            this.latY(lnglat.lat, worldSize));\n    },\n\n    unproject: function(point, worldSize) {\n        return new LngLat(\n            this.xLng(point.x, worldSize),\n            this.yLat(point.y, worldSize));\n    },\n\n    get x() { return this.lngX(this.center.lng); },\n    get y() { return this.latY(this.center.lat); },\n\n    get point() { return new Point(this.x, this.y); },\n\n    /**\n     * latitude to absolute x coord\n     * @param {number} lon\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    lngX: function(lng, worldSize) {\n        return (180 + lng) * (worldSize || this.worldSize) / 360;\n    },\n    /**\n     * latitude to absolute y coord\n     * @param {number} lat\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    latY: function(lat, worldSize) {\n        var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n        return (180 - y) * (worldSize || this.worldSize) / 360;\n    },\n\n    xLng: function(x, worldSize) {\n        return x * 360 / (worldSize || this.worldSize) - 180;\n    },\n    yLat: function(y, worldSize) {\n        var y2 = 180 - y * 360 / (worldSize || this.worldSize);\n        return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n    },\n\n    panBy: function(offset) {\n        var point = this.centerPoint._add(offset);\n        this.center = this.pointLocation(point);\n    },\n\n    setLocationAtPoint: function(lnglat, point) {\n        var c = this.locationCoordinate(lnglat);\n        var coordAtPoint = this.pointCoordinate(point);\n        var coordCenter = this.pointCoordinate(this.centerPoint);\n        var translate = coordAtPoint._sub(c);\n        this._unmodified = false;\n        this.center = this.coordinateLocation(coordCenter._sub(translate));\n    },\n\n    /**\n     * Given a location, return the screen point that corresponds to it\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint: function(lnglat) {\n        return this.coordinatePoint(this.locationCoordinate(lnglat));\n    },\n\n    /**\n     * Given a point on screen, return its lnglat\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation: function(p) {\n        return this.coordinateLocation(this.pointCoordinate(p));\n    },\n\n    /**\n     * Given a geographical lnglat, return an unrounded\n     * coordinate that represents it at this transform's zoom level and\n     * worldsize.\n     * @param {LngLat} lnglat\n     * @returns {Coordinate}\n     * @private\n     */\n    locationCoordinate: function(lnglat) {\n        var k = this.zoomScale(this.tileZoom) / this.worldSize,\n            ll = LngLat.convert(lnglat);\n\n        return new Coordinate(\n            this.lngX(ll.lng) * k,\n            this.latY(ll.lat) * k,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a Coordinate, return its geographical position.\n     * @param {Coordinate} coord\n     * @returns {LngLat} lnglat\n     * @private\n     */\n    coordinateLocation: function(coord) {\n        var worldSize = this.zoomScale(coord.zoom);\n        return new LngLat(\n            this.xLng(coord.column, worldSize),\n            this.yLat(coord.row, worldSize));\n    },\n\n    pointCoordinate: function(p) {\n\n        var targetZ = 0;\n        // since we don't know the correct projected z value for the point,\n        // unproject two points to get a line and then find the point on that\n        // line with z=0\n\n        var coord0 = [p.x, p.y, 0, 1];\n        var coord1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse);\n        vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse);\n\n        var w0 = coord0[3];\n        var w1 = coord1[3];\n        var x0 = coord0[0] / w0;\n        var x1 = coord1[0] / w1;\n        var y0 = coord0[1] / w0;\n        var y1 = coord1[1] / w1;\n        var z0 = coord0[2] / w0;\n        var z1 = coord1[2] / w1;\n\n\n        var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n        var scale = this.worldSize / this.zoomScale(this.tileZoom);\n\n        return new Coordinate(\n            interp(x0, x1, t) / scale,\n            interp(y0, y1, t) / scale,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a coordinate, return the screen point that corresponds to it\n     * @param {Coordinate} coord\n     * @returns {Point} screen point\n     * @private\n     */\n    coordinatePoint: function(coord) {\n        var scale = this.worldSize / this.zoomScale(coord.zoom);\n        var p = [coord.column * scale, coord.row * scale, 0, 1];\n        vec4.transformMat4(p, p, this.pixelMatrix);\n        return new Point(p[0] / p[3], p[1] / p[3]);\n    },\n\n    /**\n     * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.\n     * @param {TileCoord|Coordinate} coord\n     * @param {Number} maxZoom maximum source zoom to account for overscaling\n     * @private\n     */\n    calculatePosMatrix: function(coord, maxZoom) {\n        if (maxZoom === undefined) maxZoom = Infinity;\n        if (coord instanceof TileCoord) coord = coord.toCoordinate(maxZoom);\n\n        // Initialize model-view matrix that converts from the tile coordinates to screen coordinates.\n\n        // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n        // so calculate the matrix the maxzoom tile would use.\n        var z = Math.min(coord.zoom, maxZoom);\n\n        var scale = this.worldSize / Math.pow(2, z);\n        var posMatrix = new Float64Array(16);\n\n        mat4.identity(posMatrix);\n        mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]);\n        mat4.scale(posMatrix, posMatrix, [ scale / EXTENT, scale / EXTENT, 1 ]);\n        mat4.multiply(posMatrix, this.projMatrix, posMatrix);\n\n        return new Float32Array(posMatrix);\n    },\n\n    _constrain: function() {\n        if (!this.center || !this.width || !this.height || this._constraining) return;\n\n        this._constraining = true;\n\n        var minY, maxY, minX, maxX, sy, sx, x2, y2,\n            size = this.size,\n            unmodified = this._unmodified;\n\n        if (this.latRange) {\n            minY = this.latY(this.latRange[1]);\n            maxY = this.latY(this.latRange[0]);\n            sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n        }\n\n        if (this.lngRange) {\n            minX = this.lngX(this.lngRange[0]);\n            maxX = this.lngX(this.lngRange[1]);\n            sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n        }\n\n        // how much the map should scale to fit the screen into given latitude/longitude ranges\n        var s = Math.max(sx || 0, sy || 0);\n\n        if (s) {\n            this.center = this.unproject(new Point(\n                sx ? (maxX + minX) / 2 : this.x,\n                sy ? (maxY + minY) / 2 : this.y));\n            this.zoom += this.scaleZoom(s);\n            this._unmodified = unmodified;\n            this._constraining = false;\n            return;\n        }\n\n        if (this.latRange) {\n            var y = this.y,\n                h2 = size.y / 2;\n\n            if (y - h2 < minY) y2 = minY + h2;\n            if (y + h2 > maxY) y2 = maxY - h2;\n        }\n\n        if (this.lngRange) {\n            var x = this.x,\n                w2 = size.x / 2;\n\n            if (x - w2 < minX) x2 = minX + w2;\n            if (x + w2 > maxX) x2 = maxX - w2;\n        }\n\n        // pan the map if the screen goes off the range\n        if (x2 !== undefined || y2 !== undefined) {\n            this.center = this.unproject(new Point(\n                x2 !== undefined ? x2 : this.x,\n                y2 !== undefined ? y2 : this.y));\n        }\n\n        this._unmodified = unmodified;\n        this._constraining = false;\n    },\n\n    _calcMatrices: function() {\n        if (!this.height) return;\n\n        // Find the distance from the center point to the center top in altitude units using law of sines.\n        var halfFov = Math.atan(0.5 / this.altitude);\n        var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov);\n\n        // Calculate z value of the farthest fragment that should be rendered.\n        var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude;\n\n        // matrix for conversion from location to GL coordinates (-1 .. 1)\n        var m = new Float64Array(16);\n        mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ);\n        mat4.translate(m, m, [0, 0, -this.altitude]);\n\n        // After the rotateX, z values are in pixel units. Convert them to\n        // altitude units. 1 altitude unit = the screen height.\n        mat4.scale(m, m, [1, -1, 1 / this.height]);\n\n        mat4.rotateX(m, m, this._pitch);\n        mat4.rotateZ(m, m, this.angle);\n        mat4.translate(m, m, [-this.x, -this.y, 0]);\n\n        this.projMatrix = m;\n\n        // matrix for conversion from location to screen coordinates\n        m = mat4.create();\n        mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n        mat4.translate(m, m, [1, -1, 0]);\n        this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix);\n\n        // inverse matrix for conversion from screen coordinaes to location\n        m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n        if (!m) throw new Error(\"failed to invert matrix\");\n        this.pixelMatrixInverse = m;\n    }\n};\n\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = __webpack_require__(1092);\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n    doccy = document;\n} else {\n    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n}\n\nmodule.exports = doccy;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction HeatmapTexture(gl, params) {\n  var _ref, _ref1;\n  this.gl = gl;\n  if (params == null) {\n    params = {};\n  }\n  this.channels = this.gl[((_ref = params.channels) != null ? _ref : 'rgba').toUpperCase()];\n  if (typeof params.type === 'number') {\n    this.type = params.type;\n  } else {\n    this.type = this.gl[((_ref1 = params.type) != null ? _ref1 : 'unsigned_byte').toUpperCase()];\n  }\n  switch (this.channels) {\n    case this.gl.RGBA:\n      this.chancount = 4;\n      break;\n    case this.gl.RGB:\n      this.chancount = 3;\n      break;\n    case this.gl.LUMINANCE_ALPHA:\n      this.chancount = 2;\n      break;\n    default:\n      this.chancount = 1;\n  }\n  this.target = this.gl.TEXTURE_2D;\n  this.handle = this.gl.createTexture();\n}\n\nHeatmapTexture.prototype.destroy = function() {\n  return this.gl.deleteTexture(this.handle);\n};\n\nHeatmapTexture.prototype.bind = function(unit) {\n  if (unit == null) {\n    unit = 0;\n  }\n  if (unit > 15) {\n    throw 'Texture unit too large: ' + unit;\n  }\n  this.gl.activeTexture(this.gl.TEXTURE0 + unit);\n  this.gl.bindTexture(this.target, this.handle);\n  return this;\n};\n\nHeatmapTexture.prototype.setSize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  this.gl.texImage2D(this.target, 0, this.channels, this.width, this.height, 0, this.channels, this.type, null);\n  return this;\n};\n\nHeatmapTexture.prototype.upload = function(data) {\n  this.width = data.width;\n  this.height = data.height;\n  this.gl.texImage2D(this.target, 0, this.channels, this.channels, this.type, data);\n  return this;\n};\n\nHeatmapTexture.prototype.linear = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);\n  return this;\n};\n\nHeatmapTexture.prototype.nearest = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);\n  return this;\n};\n\nHeatmapTexture.prototype.clampToEdge = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n  return this;\n};\n\nHeatmapTexture.prototype.repeat = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.gl.REPEAT);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.gl.REPEAT);\n  return this;\n};\n\nmodule.exports = HeatmapTexture;\n\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MapCache = __webpack_require__(1132),\n    setCacheAdd = __webpack_require__(1161),\n    setCacheHas = __webpack_require__(1162);\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(203);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIndexOf = __webpack_require__(1163);\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports) {\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports) {\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar identity = __webpack_require__(590),\n    overRest = __webpack_require__(1167),\n    setToString = __webpack_require__(1169);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isArrayLike = __webpack_require__(1174),\n    isObjectLike = __webpack_require__(292);\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = shallowEqual;\nfunction shallowEqual(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports['default'] = isDisposable;\n\nfunction isDisposable(obj) {\n  return Boolean(obj && typeof obj.dispose === 'function');\n}\n\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar identity = __webpack_require__(600),\n    overRest = __webpack_require__(1229),\n    setToString = __webpack_require__(1231);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(297),\n    getRawTag = __webpack_require__(1236),\n    objectToString = __webpack_require__(1237);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(159);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports) {\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isFunction = __webpack_require__(601),\n    isLength = __webpack_require__(603);\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar FILE = exports.FILE = '__NATIVE_FILE__';\nvar URL = exports.URL = '__NATIVE_URL__';\nvar TEXT = exports.TEXT = '__NATIVE_TEXT__';\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseCreate = __webpack_require__(616),\n    baseLodash = __webpack_require__(303);\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__chain__ = !!chainAll;\n  this.__index__ = 0;\n  this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports) {\n\n/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n  // No operation performed.\n}\n\nmodule.exports = baseLodash;\n\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(305);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(1308);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseCreate = __webpack_require__(616),\n    baseLodash = __webpack_require__(303);\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__dir__ = 1;\n  this.__filtered__ = false;\n  this.__iteratees__ = [];\n  this.__takeCount__ = MAX_ARRAY_LENGTH;\n  this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar MapboxGLFunction = __webpack_require__(541);\n\nexports.interpolated = function(parameters) {\n    var inner = MapboxGLFunction.interpolated(parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports['piecewise-constant'] = function(parameters) {\n    var inner = MapboxGLFunction['piecewise-constant'](parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports.isFunctionDefinition = MapboxGLFunction.isFunctionDefinition;\n\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar unbundle = __webpack_require__(217);\n\nmodule.exports = function validateEnum(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var errors = [];\n\n    if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n        errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value));\n    }\n    return errors;\n};\n\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar validateEnum = __webpack_require__(310);\nvar getType = __webpack_require__(72);\nvar unbundle = __webpack_require__(217);\n\nmodule.exports = function validateFilter(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var type;\n\n    var errors = [];\n\n    if (getType(value) !== 'array') {\n        return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n    }\n\n    if (value.length < 1) {\n        return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n    }\n\n    errors = errors.concat(validateEnum({\n        key: key + '[0]',\n        value: value[0],\n        valueSpec: styleSpec.filter_operator,\n        style: options.style,\n        styleSpec: options.styleSpec\n    }));\n\n    switch (unbundle(value[0])) {\n        case '<':\n        case '<=':\n        case '>':\n        case '>=':\n            if (value.length >= 2 && value[1] == '$type') {\n                errors.push(new ValidationError(key, value, '\"$type\" cannot be use with operator \"%s\"', value[0]));\n            }\n        /* falls through */\n        case '==':\n        case '!=':\n            if (value.length != 3) {\n                errors.push(new ValidationError(key, value, 'filter array for operator \"%s\" must have 3 elements', value[0]));\n            }\n        /* falls through */\n        case 'in':\n        case '!in':\n            if (value.length >= 2) {\n                type = getType(value[1]);\n                if (type !== 'string') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n                } else if (value[1][0] === '@') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n                }\n            }\n            for (var i = 2; i < value.length; i++) {\n                type = getType(value[i]);\n                if (value[1] == '$type') {\n                    errors = errors.concat(validateEnum({\n                        key: key + '[' + i + ']',\n                        value: value[i],\n                        valueSpec: styleSpec.geometry_type,\n                        style: options.style,\n                        styleSpec: options.styleSpec\n                    }));\n                } else if (type === 'string' && value[i][0] === '@') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'filter value cannot be a constant'));\n                } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'string, number, or boolean expected, %s found', type));\n                }\n            }\n            break;\n\n        case 'any':\n        case 'all':\n        case 'none':\n            for (i = 1; i < value.length; i++) {\n                errors = errors.concat(validateFilter({\n                    key: key + '[' + i + ']',\n                    value: value[i],\n                    style: options.style,\n                    styleSpec: options.styleSpec\n                }));\n            }\n            break;\n\n        case 'has':\n        case '!has':\n            type = getType(value[1]);\n            if (value.length !== 2) {\n                errors.push(new ValidationError(key, value, 'filter array for \"%s\" operator must have 2 elements', value[0]));\n            } else if (type !== 'string') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n            } else if (value[1][0] === '@') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n            }\n            break;\n\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.STATES = undefined;\nexports.exportCurrentFilter = exportCurrentFilter;\nexports.getJobPollSteam = getJobPollSteam;\nexports.exportCurrentFilterWithJobPoll = exportCurrentFilterWithJobPoll;\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _superagent = __webpack_require__(183);\n\nvar _superagent2 = _interopRequireDefault(_superagent);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _rx = __webpack_require__(537);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar STATES = exports.STATES = {\n    FAILED: 'failed',\n    FINISHED: 'finished',\n    QUEUED: 'enqueued'\n};\nvar STOP_STATES = [STATES.FAILED, STATES.FINISHED];\nvar POLL_INTERVAL = 2000;\nfunction exportCurrentFilter(transactionsDataSetId, reportId, filter) {\n    var amountColumnState = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    return _rx.Observable.fromPromise(_og_api2.default.trapi.post('export', transactionsDataSetId, {\n        report_id: reportId,\n        query_params: { filter: filter },\n        amount_column_state: amountColumnState\n    }).end());\n}\nfunction getAsyncJobs(jobId, interval) {\n    var asyncJobsURL = window.location.origin ? window.location.origin + '/api/v2/async_jobs/' + jobId : 'api/v2/async_jobs/' + jobId;\n    var api = _superagent2.default.get(asyncJobsURL);\n    return _rx.Observable.interval(interval).flatMap(function () {\n        return _rx.Observable.fromNodeCallback(api.end, api)();\n    });\n}\nfunction getJobPollSteam(observableStream) {\n    return observableStream.filter(function (req) {\n        return STOP_STATES.includes(req.body.state);\n    }).take(1).map(function (req) {\n        return req.body;\n    });\n}\nfunction exportCurrentFilterWithJobPoll(transactionsDataSetId, reportId, filter) {\n    var amountColumnState = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n    _grid_report_actions2.default.updateFilteredExportJob(STATES.QUEUED);\n    return exportCurrentFilter(transactionsDataSetId, reportId, filter, amountColumnState).flatMap(function (res) {\n        return getJobPollSteam(getAsyncJobs(res.body.job_id, POLL_INTERVAL));\n    });\n}\nexports.default = {\n    exportCurrentFilter: exportCurrentFilter,\n    getJobPollSteam: getJobPollSteam,\n    exportCurrentFilterWithJobPoll: exportCurrentFilterWithJobPoll,\n    STATES: STATES\n};\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _utils = __webpack_require__(167);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _scrollSpy = __webpack_require__(314);\n\nvar _scrollSpy2 = _interopRequireDefault(_scrollSpy);\n\nvar _scroller = __webpack_require__(222);\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _scrollHash = __webpack_require__(658);\n\nvar _scrollHash2 = _interopRequireDefault(_scrollHash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar protoTypes = {\n  to: _propTypes2.default.string.isRequired,\n  containerId: _propTypes2.default.string,\n  container: _propTypes2.default.object,\n  activeClass: _propTypes2.default.string,\n  spy: _propTypes2.default.bool,\n  smooth: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string]),\n  offset: _propTypes2.default.number,\n  delay: _propTypes2.default.number,\n  isDynamic: _propTypes2.default.bool,\n  onClick: _propTypes2.default.func,\n  duration: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.func]),\n  absolute: _propTypes2.default.bool,\n  onSetActive: _propTypes2.default.func,\n  onSetInactive: _propTypes2.default.func,\n  ignoreCancelEvents: _propTypes2.default.bool,\n  hashSpy: _propTypes2.default.bool\n};\n\nexports.default = function (Component, customScroller) {\n\n  var scroller = customScroller || _scroller2.default;\n\n  var Link = function (_React$PureComponent) {\n    _inherits(Link, _React$PureComponent);\n\n    function Link(props) {\n      _classCallCheck(this, Link);\n\n      var _this = _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).call(this, props));\n\n      _initialiseProps.call(_this);\n\n      _this.state = {\n        active: false\n      };\n      return _this;\n    }\n\n    _createClass(Link, [{\n      key: 'getScrollSpyContainer',\n      value: function getScrollSpyContainer() {\n        var containerId = this.props.containerId;\n        var container = this.props.container;\n\n        if (containerId && !container) {\n          return document.getElementById(containerId);\n        }\n\n        if (container && container.nodeType) {\n          return container;\n        }\n\n        return document;\n      }\n    }, {\n      key: 'componentDidMount',\n      value: function componentDidMount() {\n        if (this.props.spy || this.props.hashSpy) {\n          var scrollSpyContainer = this.getScrollSpyContainer();\n\n          if (!_scrollSpy2.default.isMounted(scrollSpyContainer)) {\n            _scrollSpy2.default.mount(scrollSpyContainer);\n          }\n\n          if (this.props.hashSpy) {\n            if (!_scrollHash2.default.isMounted()) {\n              _scrollHash2.default.mount(scroller);\n            }\n            _scrollHash2.default.mapContainer(this.props.to, scrollSpyContainer);\n          }\n\n          _scrollSpy2.default.addSpyHandler(this.spyHandler, scrollSpyContainer);\n\n          this.setState({\n            container: scrollSpyContainer\n          });\n        }\n      }\n    }, {\n      key: 'componentWillUnmount',\n      value: function componentWillUnmount() {\n        _scrollSpy2.default.unmount(this.stateHandler, this.spyHandler);\n      }\n    }, {\n      key: 'render',\n      value: function render() {\n        var className = \"\";\n\n        if (this.state && this.state.active) {\n          className = ((this.props.className || \"\") + \" \" + (this.props.activeClass || \"active\")).trim();\n        } else {\n          className = this.props.className;\n        }\n\n        var props = _extends({}, this.props);\n\n        for (var prop in protoTypes) {\n          if (props.hasOwnProperty(prop)) {\n            delete props[prop];\n          }\n        }\n\n        props.className = className;\n        props.onClick = this.handleClick;\n\n        return _react2.default.createElement(Component, props);\n      }\n    }]);\n\n    return Link;\n  }(_react2.default.PureComponent);\n\n  var _initialiseProps = function _initialiseProps() {\n    var _this2 = this;\n\n    this.scrollTo = function (to, props) {\n      scroller.scrollTo(to, _extends({}, _this2.state, props));\n    };\n\n    this.handleClick = function (event) {\n\n      /*\r\n       * give the posibility to override onClick\r\n       */\n\n      if (_this2.props.onClick) {\n        _this2.props.onClick(event);\n      }\n\n      /*\r\n       * dont bubble the navigation\r\n       */\n\n      if (event.stopPropagation) event.stopPropagation();\n      if (event.preventDefault) event.preventDefault();\n\n      /*\r\n       * do the magic!\r\n       */\n      _this2.scrollTo(_this2.props.to, _this2.props);\n    };\n\n    this.spyHandler = function (y) {\n\n      var scrollSpyContainer = _this2.getScrollSpyContainer();\n\n      if (_scrollHash2.default.isMounted() && !_scrollHash2.default.isInitialized()) {\n        return;\n      }\n\n      var to = _this2.props.to;\n      var element = null;\n      var elemTopBound = 0;\n      var elemBottomBound = 0;\n      var containerTop = 0;\n\n      if (scrollSpyContainer.getBoundingClientRect) {\n        var containerCords = scrollSpyContainer.getBoundingClientRect();\n        containerTop = containerCords.top;\n      }\n\n      if (!element || _this2.props.isDynamic) {\n        element = scroller.get(to);\n        if (!element) {\n          return;\n        }\n\n        var cords = element.getBoundingClientRect();\n        elemTopBound = cords.top - containerTop + y;\n        elemBottomBound = elemTopBound + cords.height;\n      }\n\n      var offsetY = y - _this2.props.offset;\n      var isInside = offsetY >= Math.floor(elemTopBound) && offsetY < Math.floor(elemBottomBound);\n      var isOutside = offsetY < Math.floor(elemTopBound) || offsetY >= Math.floor(elemBottomBound);\n      var activeLink = scroller.getActiveLink();\n\n      if (isOutside) {\n        if (to === activeLink) {\n          scroller.setActiveLink(void 0);\n        }\n\n        if (_this2.props.hashSpy && _scrollHash2.default.getHash() === to) {\n          _scrollHash2.default.changeHash();\n        }\n\n        if (_this2.props.spy && _this2.state.active) {\n          _this2.setState({ active: false });\n          _this2.props.onSetInactive && _this2.props.onSetInactive(to, element);\n        }\n      }\n\n      if (isInside && (activeLink !== to || _this2.state.active === false)) {\n        scroller.setActiveLink(to);\n\n        _this2.props.hashSpy && _scrollHash2.default.changeHash(to);\n\n        if (_this2.props.spy) {\n          _this2.setState({ active: true });\n          _this2.props.onSetActive && _this2.props.onSetActive(to, element);\n        }\n      }\n    };\n  };\n\n  ;\n\n  Link.propTypes = protoTypes;\n\n  Link.defaultProps = { offset: 0 };\n\n  return Link;\n};\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(1439);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _passiveEventListeners = __webpack_require__(315);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The eventHandler will execute at a rate of 15fps\nvar eventThrottler = function eventThrottler(eventHandler) {\n  return (0, _lodash2.default)(eventHandler, 66);\n};\n\nvar scrollSpy = {\n\n  spyCallbacks: [],\n  spySetState: [],\n  scrollSpyContainers: [],\n\n  mount: function mount(scrollSpyContainer) {\n    if (scrollSpyContainer) {\n      var eventHandler = eventThrottler(function (event) {\n        scrollSpy.scrollHandler(scrollSpyContainer);\n      });\n      scrollSpy.scrollSpyContainers.push(scrollSpyContainer);\n      (0, _passiveEventListeners.addPassiveEventListener)(scrollSpyContainer, 'scroll', eventHandler);\n    }\n  },\n  isMounted: function isMounted(scrollSpyContainer) {\n    return scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer) !== -1;\n  },\n  currentPositionY: function currentPositionY(scrollSpyContainer) {\n    if (scrollSpyContainer === document) {\n      var supportPageOffset = window.pageXOffset !== undefined;\n      var isCSS1Compat = (document.compatMode || \"\") === \"CSS1Compat\";\n      return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;\n    } else {\n      return scrollSpyContainer.scrollTop;\n    }\n  },\n  scrollHandler: function scrollHandler(scrollSpyContainer) {\n    var callbacks = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)].spyCallbacks || [];\n    callbacks.forEach(function (c) {\n      return c(scrollSpy.currentPositionY(scrollSpyContainer));\n    });\n  },\n  addStateHandler: function addStateHandler(handler) {\n    scrollSpy.spySetState.push(handler);\n  },\n  addSpyHandler: function addSpyHandler(handler, scrollSpyContainer) {\n    var container = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)];\n\n    if (!container.spyCallbacks) {\n      container.spyCallbacks = [];\n    }\n\n    container.spyCallbacks.push(handler);\n\n    handler(scrollSpy.currentPositionY(scrollSpyContainer));\n  },\n  updateStates: function updateStates() {\n    scrollSpy.spySetState.forEach(function (s) {\n      return s();\n    });\n  },\n  unmount: function unmount(stateHandler, spyHandler) {\n    scrollSpy.scrollSpyContainers.forEach(function (c) {\n      return c.spyCallbacks && c.spyCallbacks.length && c.spyCallbacks.splice(c.spyCallbacks.indexOf(spyHandler), 1);\n    });\n\n    if (scrollSpy.spySetState && scrollSpy.spySetState.length) {\n      scrollSpy.spySetState.splice(scrollSpy.spySetState.indexOf(stateHandler), 1);\n    }\n\n    document.removeEventListener('scroll', scrollSpy.scrollHandler);\n  },\n\n\n  update: function update() {\n    return scrollSpy.scrollSpyContainers.forEach(function (c) {\n      return scrollSpy.scrollHandler(c);\n    });\n  }\n};\n\nexports.default = scrollSpy;\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/*\r\n * Tell the browser that the event listener won't prevent a scroll.\r\n * Allowing the browser to continue scrolling without having to\r\n * to wait for the listener to return.\r\n */\nvar addPassiveEventListener = exports.addPassiveEventListener = function addPassiveEventListener(target, eventName, listener) {\n  var supportsPassiveOption = function () {\n    var supportsPassiveOption = false;\n    try {\n      var opts = Object.defineProperty({}, 'passive', {\n        get: function get() {\n          supportsPassiveOption = true;\n        }\n      });\n      window.addEventListener('test', null, opts);\n    } catch (e) {}\n    return supportsPassiveOption;\n  }();\n  target.addEventListener(eventName, listener, supportsPassiveOption ? { passive: true } : false);\n};\n\nvar removePassiveEventListener = exports.removePassiveEventListener = function removePassiveEventListener(target, eventName, listener) {\n  target.removeEventListener(eventName, listener);\n};\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar Events = {\n\tregistered: {},\n\tscrollEvent: {\n\t\tregister: function register(evtName, callback) {\n\t\t\tEvents.registered[evtName] = callback;\n\t\t},\n\t\tremove: function remove(evtName) {\n\t\t\tEvents.registered[evtName] = null;\n\t\t}\n\t}\n};\n\nexports.default = Events;\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseParameters = parseParameters;\nexports.stringifyParameters = stringifyParameters;\nexports.trackPageview = trackPageview;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _og_analytics = __webpack_require__(117);\n\nvar _og_analytics2 = _interopRequireDefault(_og_analytics);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parseParameters(paramsText) {\n    paramsText = paramsText && _underscore2.default.trim(paramsText);\n    if (_lodash2.default.isEmpty(paramsText)) {\n        return {};\n    }\n    return _lodash2.default.fromPairs(_lodash2.default.map(paramsText.split('&'), function (pair) {\n        return _lodash2.default.map(pair.split('='), function (keyOrValue) {\n            return _underscore2.default.trim(keyOrValue);\n        });\n    }));\n}\nfunction stringifyParameters(parameters) {\n    // Transform the parameters into series of key=value pairs.\n    return _lodash2.default.transform(parameters, function (parts, value, key) {\n        !_lodash2.default.isUndefined(value) && parts.push(key + '=' + value);\n    }, []).join('&');\n}\nfunction trackPageview(params) {\n    if (params !== '') {\n        var url = window.location.pathname + '#' + params;\n        _og_analytics2.default.pushPageView(url);\n    }\n}\n/**\r\n* Athena from summary_report creates this router\r\n*/\nexports.default = _backbone2.default.Router.extend({\n    initialize: function initialize(options) {\n        /**\r\n        * this is athena_state in here\r\n        */\n        this.state = options.state;\n        /**\r\n        * This function updates the pushState in the browser\r\n        * It listens on the athena_state event 'renderData'\r\n        *\r\n        * this event is triggered from:\r\n        * athena_state events: change:legendSort change:graphType change:legendLimit\r\n        * summary_graph.componentWillReceiveProps if xAxisTitle is changed\r\n        * summary_report.updateDataSets\r\n        * summary_report.updateCoaMask\r\n        * budgetData.on('aggregation')\r\n        */\n        options.state.on('renderData', function updatePushState() {\n            var params = stringifyParameters(_summary_report_store2.default.hashState());\n            /**\r\n            * this event is captured in Athena (see summary_report) view\r\n            */\n            this.trigger('change:params', params);\n            this.storeRoute(params);\n        }, this);\n    },\n    trackPageview: function trackPageview(params) {\n        if (params !== '') {\n            var url = window.location.pathname + '#' + params;\n            _og_analytics2.default.pushPageView(url);\n        }\n    },\n    storeRoute: function storeRoute(params) {\n        var history = _report_view_store2.default.getHistory();\n        if (!history.length) {\n            // lets store initial state\n            var initialState = _summary_report_store2.default.hashState();\n            _summary_report_actions2.default.setInitialState(initialState);\n        }\n        var lastHistoryParams = _lodash2.default.last(history) ? parseParameters(_lodash2.default.last(history)) : {};\n        if (!_lodash2.default.isEqual(parseParameters(params), lastHistoryParams)) {\n            trackPageview(params);\n            _report_actions2.default.pushHistory(params);\n        }\n    },\n    backEnabled: function backEnabled() {\n        return _report_view_store2.default.getHistory().length > 1;\n    },\n    resetEnabled: function resetEnabled() {\n        var initialState = _summary_report_store2.default.getState().get('initialState');\n        if (initialState) {\n            var currentState = _summary_report_store2.default.hashState();\n            return this.backEnabled() && !_lodash2.default.isEqual(currentState, initialState);\n        }\n        return this.backEnabled();\n    },\n    back: function back() {\n        if (this.backEnabled()) {\n            _report_actions2.default.popHistory();\n            var lastHistory = _lodash2.default.last(_report_view_store2.default.getHistory());\n            var params = parseParameters(lastHistory);\n            // NOTE: there is some race condition in here. Long story short: this this.state.changeState(params) should be before SummaryReportActions.goBack(params)!!!\n            var mappedParams = (0, _summary_report_store.mapUrlParamsToState)(_summary_report_store2.default.getState(), params);\n            var replaceState = mappedParams.merge(params);\n            // NOTE: we should pass a mutable object into changeState - this is how athena_state was written\n            this.state.changeState(replaceState.toJS());\n            _summary_report_actions2.default.goBack(replaceState);\n        }\n    }\n});\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = exports.StoriesSidebarContent = exports.ControlPanelSidebarContent = exports.ReportsSidebarContent = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _report_config_buttons = __webpack_require__(1475);\n\nvar _report_config_buttons2 = _interopRequireDefault(_report_config_buttons);\n\nvar _entity_logo = __webpack_require__(1476);\n\nvar _entity_logo2 = _interopRequireDefault(_entity_logo);\n\nvar _report_list = __webpack_require__(1477);\n\nvar _report_list2 = _interopRequireDefault(_report_list);\n\nvar _toggle_panel = __webpack_require__(1478);\n\nvar _toggle_panel2 = _interopRequireDefault(_toggle_panel);\n\nvar _story_list = __webpack_require__(1483);\n\nvar _story_list2 = _interopRequireDefault(_story_list);\n\nvar _embed_utils = __webpack_require__(71);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SidebarTab = function SidebarTab(props) {\n    return _react2.default.createElement(\"div\", { tabIndex: 0, role: \"tab\", className: (0, _classnames2.default)('ui-nav-tabs__tab', { 'is-selected': props.selected }), onClick: props.onClick }, props.title);\n};\nvar ReportsSidebarContent = exports.ReportsSidebarContent = function ReportsSidebarContent(props) {\n    return !(0, _embed_utils.isEmbed)() && _react2.default.createElement(_react2.default.Fragment, null, _react2.default.createElement(_report_list2.default, { reports: props.reports, activeReport: props.report }), _react2.default.createElement(_toggle_panel2.default, { entity: props.entity, session: props.session, isGridReport: props.isGridReport, isControlPanel: props.embedded }, props.children));\n};\nvar ControlPanelSidebarContent = exports.ControlPanelSidebarContent = function ControlPanelSidebarContent(props) {\n    return !(0, _embed_utils.isEmbed)() && _react2.default.createElement(_react2.default.Fragment, null, _react2.default.createElement(\"div\", { className: \"ui-main__sidebar__scroll\" }, _react2.default.createElement(_toggle_panel2.default, { entity: props.entity, session: props.session, isGridReport: props.isGridReport, isControlPanel: props.embedded }, props.children)), _react2.default.createElement(_report_config_buttons2.default, { isNetwork: props.isNetwork, isGridReport: props.isGridReport, session: props.session, report: props.report, isEditingDefaultState: props.isEditingDefaultState, disableEditDefaultState: !!props.reportError || props.initialized === false, isControlPanel: props.embedded, entity: props.entity }));\n};\nvar StoriesSidebarContent = exports.StoriesSidebarContent = function StoriesSidebarContent(props) {\n    return _react2.default.createElement(_story_list2.default, { stories: props.stories, selectedStoryId: props.selectedStoryId });\n};\n\nvar Sidebar = function (_React$Component) {\n    _inherits(Sidebar, _React$Component);\n\n    function Sidebar() {\n        _classCallCheck(this, Sidebar);\n\n        var _this = _possibleConstructorReturn(this, (Sidebar.__proto__ || Object.getPrototypeOf(Sidebar)).apply(this, arguments));\n\n        _this.handleSelectReports = function () {\n            _report_actions2.default.selectSidebar('reports');\n        };\n        _this.handleSelectStories = function () {\n            _report_actions2.default.selectSidebar('stories');\n        };\n        return _this;\n    }\n\n    _createClass(Sidebar, [{\n        key: 'render',\n        value: function render() {\n            var initialized = this.props.isGridReport || this.props.initialized;\n            if (this.props.embedded) {\n                return _react2.default.createElement(ControlPanelSidebarContent, Object.assign({}, this.props, { initialized: initialized }));\n            }\n            var hasStories = this.props.stories && !this.props.stories.isEmpty();\n            return !(0, _embed_utils.isEmbed)() && _react2.default.createElement(_react2.default.Fragment, null, _react2.default.createElement(\"div\", { className: \"ui-main__sidebar__scroll\" }, _react2.default.createElement(_entity_logo2.default, { entity: this.props.entity }), hasStories && _react2.default.createElement(\"div\", { className: \"ui-nav-tabs minimal\", role: \"tablist\", style: { marginBottom: 14 } }, _react2.default.createElement(SidebarTab, { title: \"Reports\", selected: this.props.activeSidebar === 'reports', onClick: this.handleSelectReports }), _react2.default.createElement(SidebarTab, { title: \"Stories\", selected: this.props.activeSidebar === 'stories', onClick: this.handleSelectStories })), this.props.activeSidebar === 'reports' ? _react2.default.createElement(ReportsSidebarContent, Object.assign({}, this.props)) : _react2.default.createElement(StoriesSidebarContent, { stories: this.props.stories, selectedStoryId: this.props.selectedStoryId })), this.props.activeSidebar === 'reports' && _react2.default.createElement(_report_config_buttons2.default, { isNetwork: this.props.isNetwork, isGridReport: this.props.isGridReport, session: this.props.session, report: this.props.report, isEditingDefaultState: this.props.isEditingDefaultState, disableEditDefaultState: !!this.props.reportError || initialized === false, isControlPanel: this.props.embedded, entity: this.props.entity }));\n        }\n    }]);\n\n    return Sidebar;\n}(_react2.default.Component);\n\nexports.default = Sidebar;\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextDecoration = exports.TEXT_DECORATION_LINE = exports.TEXT_DECORATION = exports.TEXT_DECORATION_STYLE = undefined;\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TEXT_DECORATION_STYLE = exports.TEXT_DECORATION_STYLE = {\n    SOLID: 0,\n    DOUBLE: 1,\n    DOTTED: 2,\n    DASHED: 3,\n    WAVY: 4\n};\n\nvar TEXT_DECORATION = exports.TEXT_DECORATION = {\n    NONE: null\n};\n\nvar TEXT_DECORATION_LINE = exports.TEXT_DECORATION_LINE = {\n    UNDERLINE: 1,\n    OVERLINE: 2,\n    LINE_THROUGH: 3,\n    BLINK: 4\n};\n\nvar parseLine = function parseLine(line) {\n    switch (line) {\n        case 'underline':\n            return TEXT_DECORATION_LINE.UNDERLINE;\n        case 'overline':\n            return TEXT_DECORATION_LINE.OVERLINE;\n        case 'line-through':\n            return TEXT_DECORATION_LINE.LINE_THROUGH;\n    }\n    return TEXT_DECORATION_LINE.BLINK;\n};\n\nvar parseTextDecorationLine = function parseTextDecorationLine(line) {\n    if (line === 'none') {\n        return null;\n    }\n\n    return line.split(' ').map(parseLine);\n};\n\nvar parseTextDecorationStyle = function parseTextDecorationStyle(style) {\n    switch (style) {\n        case 'double':\n            return TEXT_DECORATION_STYLE.DOUBLE;\n        case 'dotted':\n            return TEXT_DECORATION_STYLE.DOTTED;\n        case 'dashed':\n            return TEXT_DECORATION_STYLE.DASHED;\n        case 'wavy':\n            return TEXT_DECORATION_STYLE.WAVY;\n    }\n    return TEXT_DECORATION_STYLE.SOLID;\n};\n\nvar parseTextDecoration = exports.parseTextDecoration = function parseTextDecoration(style) {\n    var textDecorationLine = parseTextDecorationLine(style.textDecorationLine ? style.textDecorationLine : style.textDecoration);\n    if (textDecorationLine === null) {\n        return TEXT_DECORATION.NONE;\n    }\n\n    var textDecorationColor = style.textDecorationColor ? new _Color2.default(style.textDecorationColor) : null;\n    var textDecorationStyle = parseTextDecorationStyle(style.textDecorationStyle);\n\n    return {\n        textDecorationLine: textDecorationLine,\n        textDecorationColor: textDecorationColor,\n        textDecorationStyle: textDecorationStyle\n    };\n};\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBorder = exports.BORDER_SIDES = exports.BORDER_STYLE = undefined;\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BORDER_STYLE = exports.BORDER_STYLE = {\n    NONE: 0,\n    SOLID: 1\n};\n\nvar BORDER_SIDES = exports.BORDER_SIDES = {\n    TOP: 0,\n    RIGHT: 1,\n    BOTTOM: 2,\n    LEFT: 3\n};\n\nvar SIDES = Object.keys(BORDER_SIDES).map(function (s) {\n    return s.toLowerCase();\n});\n\nvar parseBorderStyle = function parseBorderStyle(style) {\n    switch (style) {\n        case 'none':\n            return BORDER_STYLE.NONE;\n    }\n    return BORDER_STYLE.SOLID;\n};\n\nvar parseBorder = exports.parseBorder = function parseBorder(style) {\n    return SIDES.map(function (side) {\n        var borderColor = new _Color2.default(style.getPropertyValue('border-' + side + '-color'));\n        var borderStyle = parseBorderStyle(style.getPropertyValue('border-' + side + '-style'));\n        var borderWidth = parseFloat(style.getPropertyValue('border-' + side + '-width'));\n        return {\n            borderColor: borderColor,\n            borderStyle: borderStyle,\n            borderWidth: isNaN(borderWidth) ? 0 : borderWidth\n        };\n    });\n};\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _textTransform = __webpack_require__(672);\n\nvar _TextBounds = __webpack_require__(674);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TextContainer = function () {\n    function TextContainer(text, parent, bounds) {\n        _classCallCheck(this, TextContainer);\n\n        this.text = text;\n        this.parent = parent;\n        this.bounds = bounds;\n    }\n\n    _createClass(TextContainer, null, [{\n        key: 'fromTextNode',\n        value: function fromTextNode(node, parent) {\n            var text = transform(node.data, parent.style.textTransform);\n            return new TextContainer(text, parent, (0, _TextBounds.parseTextBounds)(text, parent, node));\n        }\n    }]);\n\n    return TextContainer;\n}();\n\nexports.default = TextContainer;\n\n\nvar CAPITALIZE = /(^|\\s|:|-|\\(|\\))([a-z])/g;\n\nvar transform = function transform(text, _transform) {\n    switch (_transform) {\n        case _textTransform.TEXT_TRANSFORM.LOWERCASE:\n            return text.toLowerCase();\n        case _textTransform.TEXT_TRANSFORM.CAPITALIZE:\n            return text.replace(CAPITALIZE, capitalize);\n        case _textTransform.TEXT_TRANSFORM.UPPERCASE:\n            return text.toUpperCase();\n        default:\n            return text;\n    }\n};\n\nfunction capitalize(m, p1, p2) {\n    if (m.length > 0) {\n        return p1 + p2.toUpperCase();\n    }\n\n    return m;\n}\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _machina = __webpack_require__(1558);\n\nvar _machina2 = _interopRequireDefault(_machina);\n\nvar _gl_data_sets = __webpack_require__(500);\n\nvar _gl_data_sets2 = _interopRequireDefault(_gl_data_sets);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BaseReportFlow = (0, _machina2.default)(_lodash2.default).Fsm.extend({\n    initialize: function initialize() {\n        this.ledgerDataSets = new _gl_data_sets2.default();\n    },\n    getStateComponent: function getStateComponent() {\n        var state = this.states[this.state];\n        return state._component.apply(this, arguments);\n    },\n    loadLedgerDataSets: function loadLedgerDataSets() {\n        return this.ledgerDataSets.fetch({\n            data: {\n                entity_id: this.entity.get('entity_id'),\n                coa_id: this.report.get('coa_id'),\n                data_set_type: 'budget,actual',\n                limit: 1024\n            }\n        });\n    },\n    loadTransactionDataSets: function loadTransactionDataSets() {\n        return _og_api2.default.trapi.get('data_sets', this.entity.id);\n    }\n});\nexports.default = BaseReportFlow;\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Loader = Ovid.Loader;\n\nvar Start = (0, _createReactClass2.default)({\n    displayName: 'Start',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderContent: function renderContent() {\n        return _react2.default.createElement(Loader, { message: \"Report data\" });\n    },\n    renderFooter: function renderFooter() {\n        return null;\n    },\n    isValid: function isValid() {\n        return false;\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = Start;\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(20);\nvar document = __webpack_require__(16).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar core = __webpack_require__(64);\nvar LIBRARY = __webpack_require__(94);\nvar wksExt = __webpack_require__(687);\nvar defineProperty = __webpack_require__(31).f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(169)('keys');\nvar uid = __webpack_require__(106);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(16).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(20);\nvar anObject = __webpack_require__(13);\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(65)(Function.call, __webpack_require__(59).f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports) {\n\nmodule.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n  '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(20);\nvar setPrototypeOf = __webpack_require__(329).set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toInteger = __webpack_require__(67);\nvar defined = __webpack_require__(74);\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports) {\n\n// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n  // eslint-disable-next-line no-self-compare\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports) {\n\n// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n  // Old FF bug\n  || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n  // Tor Browser bug\n  || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(94);\nvar $export = __webpack_require__(4);\nvar redefine = __webpack_require__(50);\nvar hide = __webpack_require__(49);\nvar Iterators = __webpack_require__(133);\nvar $iterCreate = __webpack_require__(336);\nvar setToStringTag = __webpack_require__(130);\nvar getPrototypeOf = __webpack_require__(60);\nvar ITERATOR = __webpack_require__(23)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(109);\nvar descriptor = __webpack_require__(105);\nvar setToStringTag = __webpack_require__(130);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(49)(IteratorPrototype, __webpack_require__(23)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(233);\nvar defined = __webpack_require__(74);\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(23)('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(133);\nvar ITERATOR = __webpack_require__(23)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(31);\nvar createDesc = __webpack_require__(105);\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(131);\nvar ITERATOR = __webpack_require__(23)('iterator');\nvar Iterators = __webpack_require__(133);\nmodule.exports = __webpack_require__(64).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(1687);\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(32);\nvar toAbsoluteIndex = __webpack_require__(108);\nvar toLength = __webpack_require__(25);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(96);\nvar step = __webpack_require__(704);\nvar Iterators = __webpack_require__(133);\nvar toIObject = __webpack_require__(58);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(335)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar regexpFlags = __webpack_require__(172);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar at = __webpack_require__(232)(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(65);\nvar invoke = __webpack_require__(694);\nvar html = __webpack_require__(328);\nvar cel = __webpack_require__(324);\nvar global = __webpack_require__(16);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(66)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar macrotask = __webpack_require__(347).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(66)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(46);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(16);\nvar DESCRIPTORS = __webpack_require__(27);\nvar LIBRARY = __webpack_require__(94);\nvar $typed = __webpack_require__(239);\nvar hide = __webpack_require__(49);\nvar redefineAll = __webpack_require__(114);\nvar fails = __webpack_require__(19);\nvar anInstance = __webpack_require__(112);\nvar toInteger = __webpack_require__(67);\nvar toLength = __webpack_require__(25);\nvar toIndex = __webpack_require__(714);\nvar gOPN = __webpack_require__(110).f;\nvar dP = __webpack_require__(31).f;\nvar arrayFill = __webpack_require__(343);\nvar setToStringTag = __webpack_require__(130);\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n  var buffer = new Array(nBytes);\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n  var i = 0;\n  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n  var e, m, c;\n  value = abs(value);\n  // eslint-disable-next-line no-self-compare\n  if (value != value || value === Infinity) {\n    // eslint-disable-next-line no-self-compare\n    m = value != value ? 1 : 0;\n    e = eMax;\n  } else {\n    e = floor(log(value) / LN2);\n    if (value * (c = pow(2, -e)) < 1) {\n      e--;\n      c *= 2;\n    }\n    if (e + eBias >= 1) {\n      value += rt / c;\n    } else {\n      value += rt * pow(2, 1 - eBias);\n    }\n    if (value * c >= 2) {\n      e++;\n      c /= 2;\n    }\n    if (e + eBias >= eMax) {\n      m = 0;\n      e = eMax;\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * pow(2, mLen);\n      e = e + eBias;\n    } else {\n      m = value * pow(2, eBias - 1) * pow(2, mLen);\n      e = 0;\n    }\n  }\n  for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n  e = e << mLen | m;\n  eLen += mLen;\n  for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n  buffer[--i] |= s * 128;\n  return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var nBits = eLen - 7;\n  var i = nBytes - 1;\n  var s = buffer[i--];\n  var e = s & 127;\n  var m;\n  s >>= 7;\n  for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n  m = e & (1 << -nBits) - 1;\n  e >>= -nBits;\n  nBits += mLen;\n  for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n  if (e === 0) {\n    e = 1 - eBias;\n  } else if (e === eMax) {\n    return m ? NaN : s ? -Infinity : Infinity;\n  } else {\n    m = m + pow(2, mLen);\n    e = e - eBias;\n  } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n  return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n  return [it & 0xff];\n}\nfunction packI16(it) {\n  return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n  return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n  return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n  return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n  dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = store.slice(start, start + bytes);\n  return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = conversion(+value);\n  for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n  $ArrayBuffer = function ArrayBuffer(length) {\n    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n    var byteLength = toIndex(length);\n    this._b = arrayFill.call(new Array(byteLength), 0);\n    this[$LENGTH] = byteLength;\n  };\n\n  $DataView = function DataView(buffer, byteOffset, byteLength) {\n    anInstance(this, $DataView, DATA_VIEW);\n    anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n    var bufferLength = buffer[$LENGTH];\n    var offset = toInteger(byteOffset);\n    if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n    if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n    this[$BUFFER] = buffer;\n    this[$OFFSET] = offset;\n    this[$LENGTH] = byteLength;\n  };\n\n  if (DESCRIPTORS) {\n    addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n    addGetter($DataView, BUFFER, '_b');\n    addGetter($DataView, BYTE_LENGTH, '_l');\n    addGetter($DataView, BYTE_OFFSET, '_o');\n  }\n\n  redefineAll($DataView[PROTOTYPE], {\n    getInt8: function getInt8(byteOffset) {\n      return get(this, 1, byteOffset)[0] << 24 >> 24;\n    },\n    getUint8: function getUint8(byteOffset) {\n      return get(this, 1, byteOffset)[0];\n    },\n    getInt16: function getInt16(byteOffset /* , littleEndian */) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n    },\n    getUint16: function getUint16(byteOffset /* , littleEndian */) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return bytes[1] << 8 | bytes[0];\n    },\n    getInt32: function getInt32(byteOffset /* , littleEndian */) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1]));\n    },\n    getUint32: function getUint32(byteOffset /* , littleEndian */) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n    },\n    getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n      return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n    },\n    getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n      return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n    },\n    setInt8: function setInt8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packF32, value, arguments[2]);\n    },\n    setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n      set(this, 8, byteOffset, packF64, value, arguments[2]);\n    }\n  });\n} else {\n  if (!fails(function () {\n    $ArrayBuffer(1);\n  }) || !fails(function () {\n    new $ArrayBuffer(-1); // eslint-disable-line no-new\n  }) || fails(function () {\n    new $ArrayBuffer(); // eslint-disable-line no-new\n    new $ArrayBuffer(1.5); // eslint-disable-line no-new\n    new $ArrayBuffer(NaN); // eslint-disable-line no-new\n    return $ArrayBuffer.name != ARRAY_BUFFER;\n  })) {\n    $ArrayBuffer = function ArrayBuffer(length) {\n      anInstance(this, $ArrayBuffer);\n      return new BaseBuffer(toIndex(length));\n    };\n    var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n    for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n      if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n    }\n    if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n  }\n  // iOS Safari 7.x bug\n  var view = new $DataView(new $ArrayBuffer(2));\n  var $setInt8 = $DataView[PROTOTYPE].setInt8;\n  view.setInt8(0, 2147483648);\n  view.setInt8(1, 2147483649);\n  if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n    setInt8: function setInt8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    }\n  }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n  urlRoot: '/api/v1/entities',\n\n  defaults: {\n    color: {\n      index: 0\n    },\n    fiscal_year_start_date_formatted: 'July 01',\n    country: 'US',\n    entity_type: 'city'\n  },\n\n  toJSON: function toJSON() {\n    return this.omit('logo');\n  },\n  isGlobal: function isGlobal() {\n    return this.id === 'controlpanel';\n  },\n  getRole: function getRole() {\n    return this.id === 'controlpanel' ? 'admin' : 'user';\n  },\n\n\n  // Returns the name of the entity stripping off any prefixed text.\n  // Example: \"the city of Palo Alto\" becomes \"Palo Alto\".\n  getName: function getName() {\n    var name = this.get('name') || '';\n    return name.replace('the City of', '');\n  }\n});\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n\n  processors: {},\n\n  addPostProcessor: function addPostProcessor(module) {\n    this.processors[module.name] = module;\n  },\n  handle: function handle(processors, value, key, options, translator) {\n    var _this = this;\n\n    processors.forEach(function (processor) {\n      if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n    });\n\n    return value;\n  }\n};\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.convertAPIOptions = convertAPIOptions;\nexports.convertJSONOptions = convertJSONOptions;\nexports.convertTOptions = convertTOptions;\nexports.appendBackwardsAPI = appendBackwardsAPI;\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction convertInterpolation(options) {\n\n  options.interpolation = {\n    unescapeSuffix: 'HTML'\n  };\n\n  options.interpolation.prefix = options.interpolationPrefix || '__';\n  options.interpolation.suffix = options.interpolationSuffix || '__';\n  options.interpolation.escapeValue = options.escapeInterpolation || false;\n\n  options.interpolation.nestingPrefix = options.reusePrefix || '$t(';\n  options.interpolation.nestingSuffix = options.reuseSuffix || ')';\n\n  return options;\n}\n\nfunction convertAPIOptions(options) {\n  if (options.resStore) options.resources = options.resStore;\n\n  if (options.ns && options.ns.defaultNs) {\n    options.defaultNS = options.ns.defaultNs;\n    options.ns = options.ns.namespaces;\n  } else {\n    options.defaultNS = options.ns || 'translation';\n  }\n\n  if (options.fallbackToDefaultNS && options.defaultNS) options.fallbackNS = options.defaultNS;\n\n  options.saveMissing = options.sendMissing;\n  options.saveMissingTo = options.sendMissingTo || 'current';\n  options.returnNull = options.fallbackOnNull ? false : true;\n  options.returnEmptyString = options.fallbackOnEmpty ? false : true;\n  options.returnObjects = options.returnObjectTrees;\n  options.joinArrays = '\\n';\n\n  options.returnedObjectHandler = options.objectTreeKeyHandler;\n  options.parseMissingKeyHandler = options.parseMissingKey;\n  options.appendNamespaceToMissingKey = true;\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  if (options.shortcutFunction === 'sprintf') {\n    options.overloadTranslationOptionHandler = function (args) {\n      var values = [];\n\n      for (var i = 1; i < args.length; i++) {\n        values.push(args[i]);\n      }\n\n      return {\n        postProcess: 'sprintf',\n        sprintf: values\n      };\n    };\n  }\n\n  options.whitelist = options.lngWhitelist;\n  options.preload = options.preload;\n  if (options.load === 'current') options.load = 'currentOnly';\n  if (options.load === 'unspecific') options.load = 'languageOnly';\n\n  // backend\n  options.backend = options.backend || {};\n  options.backend.loadPath = options.resGetPath || 'locales/__lng__/__ns__.json';\n  options.backend.addPath = options.resPostPath || 'locales/add/__lng__/__ns__';\n  options.backend.allowMultiLoading = options.dynamicLoad;\n\n  // cache\n  options.cache = options.cache || {};\n  options.cache.prefix = 'res_';\n  options.cache.expirationTime = 7 * 24 * 60 * 60 * 1000;\n  options.cache.enabled = options.useLocalStorage ? true : false;\n\n  options = convertInterpolation(options);\n  if (options.defaultVariables) options.interpolation.defaultVariables = options.defaultVariables;\n\n  // TODO: deprecation\n  // if (options.getAsync === false) throw deprecation error\n\n  return options;\n}\n\nfunction convertJSONOptions(options) {\n  options = convertInterpolation(options);\n  options.joinArrays = '\\n';\n\n  return options;\n}\n\nfunction convertTOptions(options) {\n  if (options.interpolationPrefix || options.interpolationSuffix || options.escapeInterpolation) {\n    options = convertInterpolation(options);\n  }\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  options.returnObjects = options.returnObjectTrees;\n\n  return options;\n}\n\nfunction appendBackwardsAPI(i18n) {\n  i18n.lng = function () {\n    _logger2.default.deprecate('i18next.lng() can be replaced by i18next.language for detected language or i18next.languages for languages ordered by translation lookup.');\n    return i18n.services.languageUtils.toResolveHierarchy(i18n.language)[0];\n  };\n\n  i18n.preload = function (lngs, cb) {\n    _logger2.default.deprecate('i18next.preload() can be replaced with i18next.loadLanguages()');\n    i18n.loadLanguages(lngs, cb);\n  };\n\n  i18n.setLng = function (lng, options, callback) {\n    _logger2.default.deprecate('i18next.setLng() can be replaced with i18next.changeLanguage() or i18next.getFixedT() to get a translation function with fixed language or namespace.');\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.fixLng === true) {\n      if (callback) return callback(null, i18n.getFixedT(lng));\n    }\n\n    i18n.changeLanguage(lng, callback);\n  };\n\n  i18n.addPostProcessor = function (name, fc) {\n    _logger2.default.deprecate('i18next.addPostProcessor() can be replaced by i18next.use({ type: \\'postProcessor\\', name: \\'name\\', process: fc })');\n    i18n.use({\n      type: 'postProcessor',\n      name: name,\n      process: fc\n    });\n  };\n}\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = __webpack_require__(78);\nvar RouteHandler = __webpack_require__(179);\nvar Route = __webpack_require__(180);\n\n/**\n * A <DefaultRoute> component is a special kind of <Route> that\n * renders when its parent matches but none of its siblings do.\n * Only one such route may be used at any given level in the\n * route hierarchy.\n */\n\nvar DefaultRoute = (function (_Route) {\n  _inherits(DefaultRoute, _Route);\n\n  function DefaultRoute() {\n    _classCallCheck(this, DefaultRoute);\n\n    _get(Object.getPrototypeOf(DefaultRoute.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return DefaultRoute;\n})(Route);\n\nDefaultRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.falsy,\n  children: PropTypes.falsy,\n  handler: PropTypes.func.isRequired\n};\n\nDefaultRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = DefaultRoute;\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports) {\n\n// Load modules\n\n\n// Declare internals\n\nvar internals = {};\n\n\nexports.arrayToObject = function (source) {\n\n    var obj = {};\n    for (var i = 0, il = source.length; i < il; ++i) {\n        if (typeof source[i] !== 'undefined') {\n\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\n\nexports.merge = function (target, source) {\n\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        }\n        else {\n            target[source] = true;\n        }\n\n        return target;\n    }\n\n    if (typeof target !== 'object') {\n        target = [target].concat(source);\n        return target;\n    }\n\n    if (Array.isArray(target) &&\n        !Array.isArray(source)) {\n\n        target = exports.arrayToObject(target);\n    }\n\n    var keys = Object.keys(source);\n    for (var k = 0, kl = keys.length; k < kl; ++k) {\n        var key = keys[k];\n        var value = source[key];\n\n        if (!target[key]) {\n            target[key] = value;\n        }\n        else {\n            target[key] = exports.merge(target[key], value);\n        }\n    }\n\n    return target;\n};\n\n\nexports.decode = function (str) {\n\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\n\nexports.compact = function (obj, refs) {\n\n    if (typeof obj !== 'object' ||\n        obj === null) {\n\n        return obj;\n    }\n\n    refs = refs || [];\n    var lookup = refs.indexOf(obj);\n    if (lookup !== -1) {\n        return refs[lookup];\n    }\n\n    refs.push(obj);\n\n    if (Array.isArray(obj)) {\n        var compacted = [];\n\n        for (var i = 0, il = obj.length; i < il; ++i) {\n            if (typeof obj[i] !== 'undefined') {\n                compacted.push(obj[i]);\n            }\n        }\n\n        return compacted;\n    }\n\n    var keys = Object.keys(obj);\n    for (i = 0, il = keys.length; i < il; ++i) {\n        var key = keys[i];\n        obj[key] = exports.compact(obj[key], refs);\n    }\n\n    return obj;\n};\n\n\nexports.isRegExp = function (obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\n\nexports.isBuffer = function (obj) {\n\n    if (obj === null ||\n        typeof obj === 'undefined') {\n\n        return false;\n    }\n\n    return !!(obj.constructor &&\n        obj.constructor.isBuffer &&\n        obj.constructor.isBuffer(obj));\n};\n\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = __webpack_require__(78);\nvar RouteHandler = __webpack_require__(179);\nvar Route = __webpack_require__(180);\n\n/**\n * A <NotFoundRoute> is a special kind of <Route> that\n * renders when the beginning of its parent's path matches\n * but none of its siblings do, including any <DefaultRoute>.\n * Only one such route may be used at any given level in the\n * route hierarchy.\n */\n\nvar NotFoundRoute = (function (_Route) {\n  _inherits(NotFoundRoute, _Route);\n\n  function NotFoundRoute() {\n    _classCallCheck(this, NotFoundRoute);\n\n    _get(Object.getPrototypeOf(NotFoundRoute.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return NotFoundRoute;\n})(Route);\n\nNotFoundRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.falsy,\n  children: PropTypes.falsy,\n  handler: PropTypes.func.isRequired\n};\n\nNotFoundRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = NotFoundRoute;\n\n/***/ }),\n/* 357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = __webpack_require__(78);\nvar Route = __webpack_require__(180);\n\n/**\n * A <Redirect> component is a special kind of <Route> that always\n * redirects to another route when it matches.\n */\n\nvar Redirect = (function (_Route) {\n  _inherits(Redirect, _Route);\n\n  function Redirect() {\n    _classCallCheck(this, Redirect);\n\n    _get(Object.getPrototypeOf(Redirect.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return Redirect;\n})(Route);\n\nRedirect.propTypes = {\n  path: PropTypes.string,\n  from: PropTypes.string, // Alias for path.\n  to: PropTypes.string,\n  handler: PropTypes.falsy\n};\n\n// Redirects should not have a default handler\nRedirect.defaultProps = {};\n\nmodule.exports = Redirect;\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LocationActions = __webpack_require__(137);\nvar History = __webpack_require__(118);\n\nvar _listeners = [];\nvar _isListening = false;\nvar _actionType;\n\nfunction notifyChange(type) {\n  if (type === LocationActions.PUSH) History.length += 1;\n\n  var change = {\n    path: HashLocation.getCurrentPath(),\n    type: type\n  };\n\n  _listeners.forEach(function (listener) {\n    listener.call(HashLocation, change);\n  });\n}\n\nfunction ensureSlash() {\n  var path = HashLocation.getCurrentPath();\n\n  if (path.charAt(0) === '/') return true;\n\n  HashLocation.replace('/' + path);\n\n  return false;\n}\n\nfunction onHashChange() {\n  if (ensureSlash()) {\n    // If we don't have an _actionType then all we know is the hash\n    // changed. It was probably caused by the user clicking the Back\n    // button, but may have also been the Forward button or manual\n    // manipulation. So just guess 'pop'.\n    var curActionType = _actionType;\n    _actionType = null;\n    notifyChange(curActionType || LocationActions.POP);\n  }\n}\n\n/**\n * A Location that uses `window.location.hash`.\n */\nvar HashLocation = {\n\n  addChangeListener: function addChangeListener(listener) {\n    _listeners.push(listener);\n\n    // Do this BEFORE listening for hashchange.\n    ensureSlash();\n\n    if (!_isListening) {\n      if (window.addEventListener) {\n        window.addEventListener('hashchange', onHashChange, false);\n      } else {\n        window.attachEvent('onhashchange', onHashChange);\n      }\n\n      _isListening = true;\n    }\n  },\n\n  removeChangeListener: function removeChangeListener(listener) {\n    _listeners = _listeners.filter(function (l) {\n      return l !== listener;\n    });\n\n    if (_listeners.length === 0) {\n      if (window.removeEventListener) {\n        window.removeEventListener('hashchange', onHashChange, false);\n      } else {\n        window.removeEvent('onhashchange', onHashChange);\n      }\n\n      _isListening = false;\n    }\n  },\n\n  push: function push(path) {\n    _actionType = LocationActions.PUSH;\n    window.location.hash = path;\n  },\n\n  replace: function replace(path) {\n    _actionType = LocationActions.REPLACE;\n    window.location.replace(window.location.pathname + window.location.search + '#' + path);\n  },\n\n  pop: function pop() {\n    _actionType = LocationActions.POP;\n    History.back();\n  },\n\n  getCurrentPath: function getCurrentPath() {\n    return decodeURI(\n    // We can't use window.location.hash here because it's not\n    // consistent across browsers - Firefox will pre-decode it!\n    window.location.href.split('#')[1] || '');\n  },\n\n  toString: function toString() {\n    return '<HashLocation>';\n  }\n\n};\n\nmodule.exports = HashLocation;\n\n/***/ }),\n/* 359 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar HistoryLocation = __webpack_require__(250);\nvar History = __webpack_require__(118);\n\n/**\n * A Location that uses full page refreshes. This is used as\n * the fallback for HistoryLocation in browsers that do not\n * support the HTML5 history API.\n */\nvar RefreshLocation = {\n\n  push: function push(path) {\n    window.location = path;\n  },\n\n  replace: function replace(path) {\n    window.location.replace(path);\n  },\n\n  pop: History.back,\n\n  getCurrentPath: HistoryLocation.getCurrentPath,\n\n  toString: function toString() {\n    return '<RefreshLocation>';\n  }\n\n};\n\nmodule.exports = RefreshLocation;\n\n/***/ }),\n/* 360 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = __webpack_require__(26);\n\nfunction throwCannotModify() {\n  invariant(false, 'You cannot modify a static location');\n}\n\n/**\n * A location that only ever contains a single path. Useful in\n * stateless environments like servers where there is no path history,\n * only the path that was used in the request.\n */\n\nvar StaticLocation = (function () {\n  function StaticLocation(path) {\n    _classCallCheck(this, StaticLocation);\n\n    this.path = path;\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(StaticLocation, [{\n    key: 'getCurrentPath',\n    value: function getCurrentPath() {\n      return this.path;\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      return '<StaticLocation path=\"' + this.path + '\">';\n    }\n  }]);\n\n  return StaticLocation;\n})();\n\nStaticLocation.prototype.push = throwCannotModify;\nStaticLocation.prototype.replace = throwCannotModify;\nStaticLocation.prototype.pop = throwCannotModify;\n\nmodule.exports = StaticLocation;\n\n/***/ }),\n/* 361 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LocationActions = __webpack_require__(137);\n\n/**\n * A scroll behavior that attempts to imitate the default behavior\n * of modern browsers.\n */\nvar ImitateBrowserBehavior = {\n\n  updateScrollPosition: function updateScrollPosition(position, actionType) {\n    switch (actionType) {\n      case LocationActions.PUSH:\n      case LocationActions.REPLACE:\n        window.scrollTo(0, 0);\n        break;\n      case LocationActions.POP:\n        if (position) {\n          window.scrollTo(position.x, position.y);\n        } else {\n          window.scrollTo(0, 0);\n        }\n        break;\n    }\n  }\n\n};\n\nmodule.exports = ImitateBrowserBehavior;\n\n/***/ }),\n/* 362 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* jshint -W084 */\n\n\nvar React = __webpack_require__(0);\nvar assign = __webpack_require__(77);\nvar warning = __webpack_require__(248);\nvar DefaultRoute = __webpack_require__(354);\nvar NotFoundRoute = __webpack_require__(356);\nvar Redirect = __webpack_require__(357);\nvar Route = __webpack_require__(97);\n\nfunction checkPropTypes(componentName, propTypes, props) {\n  componentName = componentName || 'UnknownComponent';\n\n  for (var propName in propTypes) {\n    if (propTypes.hasOwnProperty(propName)) {\n      // var error = propTypes[propName](props, propName, componentName);\n      var error = false;\n\n      if (error instanceof Error) warning(false, error.message);\n    }\n  }\n}\n\nfunction createRouteOptions(props) {\n  var options = assign({}, props);\n  var handler = options.handler;\n\n  if (handler) {\n    options.onEnter = handler.willTransitionTo;\n    options.onLeave = handler.willTransitionFrom;\n  }\n\n  return options;\n}\n\nfunction createRouteFromReactElement(element) {\n  if (!React.isValidElement(element)) return;\n\n  var type = element.type;\n  var props = assign({}, type.defaultProps, element.props);\n\n  if (type.propTypes) checkPropTypes(type.displayName, type.propTypes, props);\n\n  if (type === DefaultRoute) return Route.createDefaultRoute(createRouteOptions(props));\n\n  if (type === NotFoundRoute) return Route.createNotFoundRoute(createRouteOptions(props));\n\n  if (type === Redirect) return Route.createRedirect(createRouteOptions(props));\n\n  return Route.createRoute(createRouteOptions(props), function () {\n    if (props.children) createRoutesFromReactChildren(props.children);\n  });\n}\n\n/**\n * Creates and returns an array of routes created from the given\n * ReactChildren, all of which should be one of <Route>, <DefaultRoute>,\n * <NotFoundRoute>, or <Redirect>, e.g.:\n *\n *   var { createRoutesFromReactChildren, Route, Redirect } = require('react-router');\n *\n *   var routes = createRoutesFromReactChildren(\n *     <Route path=\"/\" handler={App}>\n *       <Route name=\"user\" path=\"/user/:userId\" handler={User}>\n *         <Route name=\"task\" path=\"tasks/:taskId\" handler={Task}/>\n *         <Redirect from=\"todos/:taskId\" to=\"task\"/>\n *       </Route>\n *     </Route>\n *   );\n */\nfunction createRoutesFromReactChildren(children) {\n  var routes = [];\n\n  React.Children.forEach(children, function (child) {\n    if (child = createRouteFromReactElement(child)) routes.push(child);\n  });\n\n  return routes;\n}\n\nmodule.exports = createRoutesFromReactChildren;\n\n/***/ }),\n/* 363 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* jshint -W058 */\n\n\nvar React = __webpack_require__(0);\nvar createReactClass = __webpack_require__(5);\nvar warning = __webpack_require__(248);\nvar invariant = __webpack_require__(26);\nvar canUseDOM = __webpack_require__(181);\nvar LocationActions = __webpack_require__(137);\nvar ImitateBrowserBehavior = __webpack_require__(361);\nvar HashLocation = __webpack_require__(358);\nvar HistoryLocation = __webpack_require__(250);\nvar RefreshLocation = __webpack_require__(359);\nvar StaticLocation = __webpack_require__(360);\nvar ScrollHistory = __webpack_require__(764);\nvar createRoutesFromReactChildren = __webpack_require__(362);\nvar isReactChildren = __webpack_require__(766);\nvar Transition = __webpack_require__(767);\nvar PropTypes = __webpack_require__(78);\nvar Redirect = __webpack_require__(365);\nvar History = __webpack_require__(118);\nvar Cancellation = __webpack_require__(364);\nvar Match = __webpack_require__(768);\nvar Route = __webpack_require__(97);\nvar supportsHistory = __webpack_require__(769);\nvar PathUtils = __webpack_require__(249);\n\n/**\n * The default location for new routers.\n */\nvar DEFAULT_LOCATION = canUseDOM ? HashLocation : '/';\n\n/**\n * The default scroll behavior for new routers.\n */\nvar DEFAULT_SCROLL_BEHAVIOR = canUseDOM ? ImitateBrowserBehavior : null;\n\nfunction hasProperties(object, properties) {\n  for (var propertyName in properties) if (properties.hasOwnProperty(propertyName) && object[propertyName] !== properties[propertyName]) return false;\n\n  return true;\n}\n\nfunction hasMatch(routes, route, prevParams, nextParams, prevQuery, nextQuery) {\n  return routes.some(function (r) {\n    if (r !== route) return false;\n\n    var paramNames = route.paramNames;\n    var paramName;\n\n    // Ensure that all params the route cares about did not change.\n    for (var i = 0, len = paramNames.length; i < len; ++i) {\n      paramName = paramNames[i];\n\n      if (nextParams[paramName] !== prevParams[paramName]) return false;\n    }\n\n    // Ensure the query hasn't changed.\n    return hasProperties(prevQuery, nextQuery) && hasProperties(nextQuery, prevQuery);\n  });\n}\n\nfunction addRoutesToNamedRoutes(routes, namedRoutes) {\n  var route;\n  for (var i = 0, len = routes.length; i < len; ++i) {\n    route = routes[i];\n\n    if (route.name) {\n      invariant(namedRoutes[route.name] == null, 'You may not have more than one route named \"%s\"', route.name);\n\n      namedRoutes[route.name] = route;\n    }\n\n    if (route.childRoutes) addRoutesToNamedRoutes(route.childRoutes, namedRoutes);\n  }\n}\n\nfunction routeIsActive(activeRoutes, routeName) {\n  return activeRoutes.some(function (route) {\n    return route.name === routeName;\n  });\n}\n\nfunction paramsAreActive(activeParams, params) {\n  for (var property in params) if (String(activeParams[property]) !== String(params[property])) return false;\n\n  return true;\n}\n\nfunction queryIsActive(activeQuery, query) {\n  for (var property in query) if (String(activeQuery[property]) !== String(query[property])) return false;\n\n  return true;\n}\n\n/**\n * Creates and returns a new router using the given options. A router\n * is a ReactComponent class that knows how to react to changes in the\n * URL and keep the contents of the page in sync.\n *\n * Options may be any of the following:\n *\n * - routes           (required) The route config\n * - location         The location to use. Defaults to HashLocation when\n *                    the DOM is available, \"/\" otherwise\n * - scrollBehavior   The scroll behavior to use. Defaults to ImitateBrowserBehavior\n *                    when the DOM is available, null otherwise\n * - onError          A function that is used to handle errors\n * - onAbort          A function that is used to handle aborted transitions\n *\n * When rendering in a server-side environment, the location should simply\n * be the URL path that was used in the request, including the query string.\n */\nfunction createRouter(options) {\n  options = options || {};\n\n  if (isReactChildren(options)) options = { routes: options };\n\n  var mountedComponents = [];\n  var location = options.location || DEFAULT_LOCATION;\n  var scrollBehavior = options.scrollBehavior || DEFAULT_SCROLL_BEHAVIOR;\n  var state = {};\n  var nextState = {};\n  var pendingTransition = null;\n  var dispatchHandler = null;\n\n  if (typeof location === 'string') location = new StaticLocation(location);\n\n  if (location instanceof StaticLocation) {\n    warning(!canUseDOM || \"production\" === 'test', 'You should not use a static location in a DOM environment because ' + 'the router will not be kept in sync with the current URL');\n  } else {\n    invariant(canUseDOM || location.needsDOM === false, 'You cannot use %s without a DOM', location);\n  }\n\n  // Automatically fall back to full page refreshes in\n  // browsers that don't support the HTML history API.\n  if (location === HistoryLocation && !supportsHistory()) location = RefreshLocation;\n\n  var Router = createReactClass({\n\n    displayName: 'Router',\n\n    statics: {\n\n      isRunning: false,\n\n      cancelPendingTransition: function cancelPendingTransition() {\n        if (pendingTransition) {\n          pendingTransition.cancel();\n          pendingTransition = null;\n        }\n      },\n\n      clearAllRoutes: function clearAllRoutes() {\n        Router.cancelPendingTransition();\n        Router.namedRoutes = {};\n        Router.routes = [];\n      },\n\n      /**\n       * Adds routes to this router from the given children object (see ReactChildren).\n       */\n      addRoutes: function addRoutes(routes) {\n        if (isReactChildren(routes)) routes = createRoutesFromReactChildren(routes);\n\n        addRoutesToNamedRoutes(routes, Router.namedRoutes);\n\n        Router.routes.push.apply(Router.routes, routes);\n      },\n\n      /**\n       * Replaces routes of this router from the given children object (see ReactChildren).\n       */\n      replaceRoutes: function replaceRoutes(routes) {\n        Router.clearAllRoutes();\n        Router.addRoutes(routes);\n        Router.refresh();\n      },\n\n      /**\n       * Performs a match of the given path against this router and returns an object\n       * with the { routes, params, pathname, query } that match. Returns null if no\n       * match can be made.\n       */\n      match: function match(path) {\n        return Match.findMatch(Router.routes, path);\n      },\n\n      /**\n       * Returns an absolute URL path created from the given route\n       * name, URL parameters, and query.\n       */\n      makePath: function makePath(to, params, query) {\n        var path;\n        if (PathUtils.isAbsolute(to)) {\n          path = to;\n        } else {\n          var route = to instanceof Route ? to : Router.namedRoutes[to];\n\n          invariant(route instanceof Route, 'Cannot find a route named \"%s\"', to);\n\n          path = route.path;\n        }\n\n        return PathUtils.withQuery(PathUtils.injectParams(path, params), query);\n      },\n\n      /**\n       * Returns a string that may safely be used as the href of a link\n       * to the route with the given name, URL parameters, and query.\n       */\n      makeHref: function makeHref(to, params, query) {\n        var path = Router.makePath(to, params, query);\n        return location === HashLocation ? '#' + path : path;\n      },\n\n      /**\n       * Transitions to the URL specified in the arguments by pushing\n       * a new URL onto the history stack.\n       */\n      transitionTo: function transitionTo(to, params, query) {\n        var path = Router.makePath(to, params, query);\n\n        if (pendingTransition) {\n          // Replace so pending location does not stay in history.\n          location.replace(path);\n        } else {\n          location.push(path);\n        }\n      },\n\n      /**\n       * Transitions to the URL specified in the arguments by replacing\n       * the current URL in the history stack.\n       */\n      replaceWith: function replaceWith(to, params, query) {\n        location.replace(Router.makePath(to, params, query));\n      },\n\n      /**\n       * Transitions to the previous URL if one is available. Returns true if the\n       * router was able to go back, false otherwise.\n       *\n       * Note: The router only tracks history entries in your application, not the\n       * current browser session, so you can safely call this function without guarding\n       * against sending the user back to some other site. However, when using\n       * RefreshLocation (which is the fallback for HistoryLocation in browsers that\n       * don't support HTML5 history) this method will *always* send the client back\n       * because we cannot reliably track history length.\n       */\n      goBack: function goBack() {\n        if (History.length > 1 || location === RefreshLocation) {\n          location.pop();\n          return true;\n        }\n\n        warning(false, 'goBack() was ignored because there is no router history');\n\n        return false;\n      },\n\n      handleAbort: options.onAbort || function (abortReason) {\n        if (location instanceof StaticLocation) throw new Error('Unhandled aborted transition! Reason: ' + abortReason);\n\n        if (abortReason instanceof Cancellation) {\n          return;\n        } else if (abortReason instanceof Redirect) {\n          location.replace(Router.makePath(abortReason.to, abortReason.params, abortReason.query));\n        } else {\n          location.pop();\n        }\n      },\n\n      handleError: options.onError || function (error) {\n        // Throw so we don't silently swallow async errors.\n        throw error; // This error probably originated in a transition hook.\n      },\n\n      handleLocationChange: function handleLocationChange(change) {\n        Router.dispatch(change.path, change.type);\n      },\n\n      /**\n       * Performs a transition to the given path and calls callback(error, abortReason)\n       * when the transition is finished. If both arguments are null the router's state\n       * was updated. Otherwise the transition did not complete.\n       *\n       * In a transition, a router first determines which routes are involved by beginning\n       * with the current route, up the route tree to the first parent route that is shared\n       * with the destination route, and back down the tree to the destination route. The\n       * willTransitionFrom hook is invoked on all route handlers we're transitioning away\n       * from, in reverse nesting order. Likewise, the willTransitionTo hook is invoked on\n       * all route handlers we're transitioning to.\n       *\n       * Both willTransitionFrom and willTransitionTo hooks may either abort or redirect the\n       * transition. To resolve asynchronously, they may use the callback argument. If no\n       * hooks wait, the transition is fully synchronous.\n       */\n      dispatch: function dispatch(path, action) {\n        Router.cancelPendingTransition();\n\n        var prevPath = state.path;\n        var isRefreshing = action == null;\n\n        if (prevPath === path && !isRefreshing) return; // Nothing to do!\n\n        // Record the scroll position as early as possible to\n        // get it before browsers try update it automatically.\n        if (prevPath && action === LocationActions.PUSH) Router.recordScrollPosition(prevPath);\n\n        var match = Router.match(path);\n\n        warning(match != null, 'No route matches path \"%s\". Make sure you have <Route path=\"%s\"> somewhere in your routes', path, path);\n\n        if (match == null) match = {};\n\n        var prevRoutes = state.routes || [];\n        var prevParams = state.params || {};\n        var prevQuery = state.query || {};\n\n        var nextRoutes = match.routes || [];\n        var nextParams = match.params || {};\n        var nextQuery = match.query || {};\n\n        var fromRoutes, toRoutes;\n        if (prevRoutes.length) {\n          fromRoutes = prevRoutes.filter(function (route) {\n            return !hasMatch(nextRoutes, route, prevParams, nextParams, prevQuery, nextQuery);\n          });\n\n          toRoutes = nextRoutes.filter(function (route) {\n            return !hasMatch(prevRoutes, route, prevParams, nextParams, prevQuery, nextQuery);\n          });\n        } else {\n          fromRoutes = [];\n          toRoutes = nextRoutes;\n        }\n\n        var transition = new Transition(path, Router.replaceWith.bind(Router, path));\n        pendingTransition = transition;\n\n        var fromComponents = mountedComponents.slice(prevRoutes.length - fromRoutes.length);\n\n        Transition.from(transition, fromRoutes, fromComponents, function (error) {\n          if (error || transition.abortReason) return dispatchHandler.call(Router, error, transition); // No need to continue.\n\n          Transition.to(transition, toRoutes, nextParams, nextQuery, function (error) {\n            dispatchHandler.call(Router, error, transition, {\n              path: path,\n              action: action,\n              pathname: match.pathname,\n              routes: nextRoutes,\n              params: nextParams,\n              query: nextQuery\n            });\n          });\n        });\n      },\n\n      /**\n       * Starts this router and calls callback(router, state) when the route changes.\n       *\n       * If the router's location is static (i.e. a URL path in a server environment)\n       * the callback is called only once. Otherwise, the location should be one of the\n       * Router.*Location objects (e.g. Router.HashLocation or Router.HistoryLocation).\n       */\n      run: function run(callback) {\n        invariant(!Router.isRunning, 'Router is already running');\n\n        dispatchHandler = function (error, transition, newState) {\n          if (error) Router.handleError(error);\n\n          if (pendingTransition !== transition) return;\n\n          pendingTransition = null;\n\n          if (transition.abortReason) {\n            Router.handleAbort(transition.abortReason);\n          } else {\n            callback.call(Router, Router, nextState = newState);\n          }\n        };\n\n        if (!(location instanceof StaticLocation)) {\n          if (location.addChangeListener) location.addChangeListener(Router.handleLocationChange);\n\n          Router.isRunning = true;\n        }\n\n        // Bootstrap using the current path.\n        Router.refresh();\n      },\n\n      refresh: function refresh() {\n        Router.dispatch(location.getCurrentPath(), null);\n      },\n\n      stop: function stop() {\n        Router.cancelPendingTransition();\n\n        if (location.removeChangeListener) location.removeChangeListener(Router.handleLocationChange);\n\n        Router.isRunning = false;\n      },\n\n      getLocation: function getLocation() {\n        return location;\n      },\n\n      getScrollBehavior: function getScrollBehavior() {\n        return scrollBehavior;\n      },\n\n      getRouteAtDepth: function getRouteAtDepth(routeDepth) {\n        var routes = state.routes;\n        return routes && routes[routeDepth];\n      },\n\n      setRouteComponentAtDepth: function setRouteComponentAtDepth(routeDepth, component) {\n        mountedComponents[routeDepth] = component;\n      },\n\n      /**\n       * Returns the current URL path + query string.\n       */\n      getCurrentPath: function getCurrentPath() {\n        return state.path;\n      },\n\n      /**\n       * Returns the current URL path without the query string.\n       */\n      getCurrentPathname: function getCurrentPathname() {\n        return state.pathname;\n      },\n\n      /**\n       * Returns an object of the currently active URL parameters.\n       */\n      getCurrentParams: function getCurrentParams() {\n        return state.params;\n      },\n\n      /**\n       * Returns an object of the currently active query parameters.\n       */\n      getCurrentQuery: function getCurrentQuery() {\n        return state.query;\n      },\n\n      /**\n       * Returns an array of the currently active routes.\n       */\n      getCurrentRoutes: function getCurrentRoutes() {\n        return state.routes;\n      },\n\n      /**\n       * Returns true if the given route, params, and query are active.\n       */\n      isActive: function isActive(to, params, query) {\n        if (PathUtils.isAbsolute(to)) return to === state.path;\n\n        return routeIsActive(state.routes, to) && paramsAreActive(state.params, params) && (query == null || queryIsActive(state.query, query));\n      }\n\n    },\n\n    mixins: [ScrollHistory],\n\n    propTypes: {\n      children: PropTypes.falsy\n    },\n\n    childContextTypes: {\n      routeDepth: PropTypes.number.isRequired,\n      router: PropTypes.router.isRequired\n    },\n\n    getChildContext: function getChildContext() {\n      return {\n        routeDepth: 1,\n        router: Router\n      };\n    },\n\n    getInitialState: function getInitialState() {\n      return state = nextState;\n    },\n\n    componentWillReceiveProps: function componentWillReceiveProps() {\n      this.setState(state = nextState);\n    },\n\n    componentWillUnmount: function componentWillUnmount() {\n      Router.stop();\n    },\n\n    render: function render() {\n      var route = Router.getRouteAtDepth(0);\n      return route ? React.createElement(route.handler, this.props) : null;\n    }\n\n  });\n\n  Router.clearAllRoutes();\n\n  if (options.routes) Router.addRoutes(options.routes);\n\n  return Router;\n}\n\nmodule.exports = createRouter;\n\n/***/ }),\n/* 364 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Represents a cancellation caused by navigating away\n * before the previous transition has fully resolved.\n */\n\n\nfunction Cancellation() {}\n\nmodule.exports = Cancellation;\n\n/***/ }),\n/* 365 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Encapsulates a redirect to the given route.\n */\n\n\nfunction Redirect(to, params, query) {\n  this.to = to;\n  this.params = params;\n  this.query = query;\n}\n\nmodule.exports = Redirect;\n\n/***/ }),\n/* 366 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * A mixin that allows a component to listen for store change events.\n * Construct this mixin and pass it each store the component should listen to.\n * Whenever any of the stores emits a change event, this mixin will invoke\n * the \"storeDidUpdate()\" callback function that the compnent should have implemented.\n *\n * This mixin handles setting up the listeners when the component mounts\n * and also cleans up listeners when it unmounts. The storeDidUpdate() callback\n * will only be called when the component is mounted.\n *\n * Example:\n *\n * React.createClass({\n *   mixins: [StoreListener(SomeStore)],\n *\n *   storeDidUpdate: function () {\n *     this.setState(SomeStore.getState());\n *   }\n * });\n */\n\nfunction handleChange() {\n  /*jshint validthis:true */\n\n  // The component may have been unmounted by another\n  // listener that was dispatched prior to our handler.\n  // We must check that the component is mounted before\n  // calling the handler.\n  if (this.storeDidUpdate && this._isMounted) {\n    this.storeDidUpdate();\n  }\n}\n\nmodule.exports = function () {\n  for (var _len = arguments.length, stores = Array(_len), _key = 0; _key < _len; _key++) {\n    stores[_key] = arguments[_key];\n  }\n\n  var handler;\n\n  return {\n    _isMounted: false,\n\n    componentDidMount: function componentDidMount() {\n      this._isMounted = true;\n      handler = handleChange.bind(this);\n      stores.forEach(function (store) {\n        return store.addChangeListener(handler);\n      });\n    },\n\n    componentWillUnmount: function componentWillUnmount() {\n      this._isMounted = false;\n      stores.forEach(function (store) {\n        return store.removeChangeListener(handler);\n      });\n    }\n  };\n};\n\n/***/ }),\n/* 367 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar assign = __webpack_require__(77);\n\nvar EventEmitter = __webpack_require__(368).EventEmitter;\n\nvar CHANGE_EVENT = 'change';\n\nvar BaseStore = function () {\n  function BaseStore() {\n    _classCallCheck(this, BaseStore);\n  }\n\n  _createClass(BaseStore, [{\n    key: 'addChangeListener',\n    value: function addChangeListener(listener) {\n      this.addListener(CHANGE_EVENT, listener);\n    }\n  }, {\n    key: 'removeChangeListener',\n    value: function removeChangeListener(listener) {\n      this.removeListener(CHANGE_EVENT, listener);\n    }\n  }, {\n    key: 'emitChange',\n    value: function emitChange() {\n      this.emit(CHANGE_EVENT);\n    }\n  }]);\n\n  return BaseStore;\n}();\n\nassign(BaseStore.prototype, EventEmitter.prototype);\n\nmodule.exports = BaseStore;\n\n/***/ }),\n/* 368 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function eventListener() {\n      if (errorListener !== undefined) {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n    var errorListener;\n\n    // Adding an error listener is not optional because\n    // if an error is thrown on an event emitter we cannot\n    // guarantee that the actual event we are waiting will\n    // be fired. The result could be a silent way to create\n    // memory or file descriptor leaks, which is something\n    // we should avoid.\n    if (name !== 'error') {\n      errorListener = function errorListener(err) {\n        emitter.removeListener(name, eventListener);\n        reject(err);\n      };\n\n      emitter.once('error', errorListener);\n    }\n\n    emitter.once(name, eventListener);\n  });\n}\n\n\n/***/ }),\n/* 369 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assign = __webpack_require__(77);\nvar Flux = __webpack_require__(773);\n\n/**\n* The global application dispatcher which routes actions to stores.\n* Based on the Flux dispatcher with a few custom methods.\n*\n* This API is mostly used by action creators for dispatching actions.\n* It's also a good place to inspect actions flowing through the\n* application for debugging, logging, and analytic purposes.\n*/\nmodule.exports = assign(new Flux.Dispatcher(), {\n  /**\n  * Dispatch an action which was directly triggered due to an user interaction.\n  */\n  handleViewAction: function handleViewAction(action) {\n    this.dispatch({\n      source: 'VIEW_ACTION',\n      action: action\n    });\n  },\n\n  /**\n  * Dispatch an action which is triggered by a server response.\n  * For example an API request that completes may dispatch a \"success\" or \"error\" action.\n  */\n  handleServerAction: function handleServerAction(action) {\n    this.dispatch({\n      source: 'SERVER_ACTION',\n      action: action\n    });\n  }\n});\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _ovid = __webpack_require__(8);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(98);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar EntityStore = function (_BaseStore) {\n  _inherits(EntityStore, _BaseStore);\n\n  function EntityStore() {\n    _classCallCheck(this, EntityStore);\n\n    var _this = _possibleConstructorReturn(this, (EntityStore.__proto__ || Object.getPrototypeOf(EntityStore)).call(this));\n\n    _this.getNewEntity = function () {\n      return _this._newEntity;\n    };\n\n    _this.getEntities = function () {\n      return _this._entities;\n    };\n\n    _this.getEntitiesLoading = function () {\n      return _this._entitiesLoading;\n    };\n\n    _this.getEntitiesLoadingFailed = function () {\n      return _this._entitiesLoadingFailed;\n    };\n\n    _this.getEntityTypes = function () {\n      return _this._entityTypes;\n    };\n\n    _this.getCountries = function () {\n      return _this._countries;\n    };\n\n    _this.getStates = function () {\n      return _this._states[_this._selectedCountry] || [];\n    };\n\n    _this.getGroups = function () {\n      return _this._groups;\n    };\n\n    _this.getSelectedCountry = function () {\n      return _this._selectedCountry;\n    };\n\n    _this._entities = [];\n    _this._entitiesLoading = false;\n    _this._entitiesLoadingFailed = false;\n    _this._entityTypes = [];\n    _this._countries = [];\n    _this._states = {};\n    _this._groups = [];\n    _this._newEntity = null;\n    _this._selectedCountry = null;\n\n    _og_flux.Dispatcher.register(function (payload) {\n      return _this._handleAction(payload.action);\n    });\n    return _this;\n  }\n\n  _createClass(EntityStore, [{\n    key: '_handleAction',\n    value: function _handleAction(action) {\n      switch (action.actionType) {\n        case 'ENTITIES_LOADING':\n          this._entitiesLoading = true;\n          this._entitiesLoadingFailed = false;\n          this.emitChange();\n          break;\n\n        case 'ENTITIES_LOADED':\n          var entities = action.entities;\n          this._entitiesLoading = false;\n          this._entities = entities.map(function (entity) {\n            return _lodash2.default.extend(entity, {\n              _all: [entity.name, entity.state, entity.country, entity.subdomain, entity.display_name, entity.entity_type && entity.entity_type.name].join(' ')\n            });\n          });\n          this.emitChange();\n          break;\n\n        case 'ENTITIES_LOAD_ERROR':\n          this._entitiesLoadingFailed = true;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_COUNTRY_SELECTED':\n          this._selectedCountry = action.country;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_TYPES_LOADED':\n          this._entityTypes = action.entityTypes;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_COUNTRIES_LOADED':\n          this._countries = action.countries;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_STATES_LOADED':\n          this._states[action.country] = action.states;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_GROUPS_LOADED':\n          this._groups = action.groups;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_NEW':\n          this._newEntity = action.entity;\n          this._selectedCountry = this._newEntity.get('country');\n          this.emitChange();\n          break;\n\n        case 'ENTITY_FORM_SUBMIT':\n          this._newEntity.state = 'SAVING';\n          this.emitChange();\n          break;\n\n        case 'ENTITY_FORM_CANCEL':\n          this._newEntity = null;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_CREATED':\n          this._entities = this._entities.concat(action.entity);\n          this._newEntity = null;\n          this.emitChange();\n          break;\n\n        case 'ENTITY_CREATE_ERROR':\n          var resp = action.response || {};\n          var json = resp.responseJSON || {};\n          this._newEntity = {};\n\n          if (resp.status === 422 && json.errors) {\n            this._newEntity.serverValidationErrors = json.errors;\n          } else {\n            _ovid.Alert.open({\n              title: 'Error creating entity.',\n              content: _react2.default.createElement(\n                'p',\n                null,\n                JSON.stringify(json, null, 2) || 'Please try again and if you continue having issues contact Engineering Support.'\n              )\n            });\n          }\n          this._newEntity.state = 'ERROR';\n          this.emitChange();\n          break;\n\n        case 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE':\n          if (this._newEntity) {\n            this._newEntity = null;\n            this.emitChange();\n          }\n          break;\n\n        default:\n        // do nothing\n      }\n    }\n  }]);\n\n  return EntityStore;\n}(_og_flux.BaseStore);\n\nexports.default = new EntityStore();\n\n/***/ }),\n/* 371 */\n/***/ (function(module, exports) {\n\n/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, {}))\n\n/***/ }),\n/* 372 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar af = moment.defineLocale('af', {\n    months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),\n    weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n    weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n    meridiemParse: /vm|nm/i,\n    isPM : function (input) {\n        return /^nm$/i.test(input);\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower ? 'vm' : 'VM';\n        } else {\n            return isLower ? 'nm' : 'NM';\n        }\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Vandag om] LT',\n        nextDay : '[Môre om] LT',\n        nextWeek : 'dddd [om] LT',\n        lastDay : '[Gister om] LT',\n        lastWeek : '[Laas] dddd [om] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'oor %s',\n        past : '%s gelede',\n        s : '\\'n paar sekondes',\n        ss : '%d sekondes',\n        m : '\\'n minuut',\n        mm : '%d minute',\n        h : '\\'n uur',\n        hh : '%d ure',\n        d : '\\'n dag',\n        dd : '%d dae',\n        M : '\\'n maand',\n        MM : '%d maande',\n        y : '\\'n jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter\n    },\n    week : {\n        dow : 1, // Maandag is die eerste dag van die week.\n        doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n    }\n});\n\nreturn af;\n\n})));\n\n\n/***/ }),\n/* 373 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '١',\n    '2': '٢',\n    '3': '٣',\n    '4': '٤',\n    '5': '٥',\n    '6': '٦',\n    '7': '٧',\n    '8': '٨',\n    '9': '٩',\n    '0': '٠'\n}, numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n}, pluralForm = function (n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n}, plurals = {\n    s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n}, pluralize = function (u) {\n    return function (number, withoutSuffix, string, isFuture) {\n        var f = pluralForm(number),\n            str = plurals[u][pluralForm(number)];\n        if (f === 2) {\n            str = str[withoutSuffix ? 0 : 1];\n        }\n        return str.replace(/%d/i, number);\n    };\n}, months = [\n    'يناير',\n    'فبراير',\n    'مارس',\n    'أبريل',\n    'مايو',\n    'يونيو',\n    'يوليو',\n    'أغسطس',\n    'سبتمبر',\n    'أكتوبر',\n    'نوفمبر',\n    'ديسمبر'\n];\n\nvar ar = moment.defineLocale('ar', {\n    months : months,\n    monthsShort : months,\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/\\u200FM/\\u200FYYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم عند الساعة] LT',\n        nextDay: '[غدًا عند الساعة] LT',\n        nextWeek: 'dddd [عند الساعة] LT',\n        lastDay: '[أمس عند الساعة] LT',\n        lastWeek: 'dddd [عند الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'بعد %s',\n        past : 'منذ %s',\n        s : pluralize('s'),\n        ss : pluralize('s'),\n        m : pluralize('m'),\n        mm : pluralize('m'),\n        h : pluralize('h'),\n        hh : pluralize('h'),\n        d : pluralize('d'),\n        dd : pluralize('d'),\n        M : pluralize('M'),\n        MM : pluralize('M'),\n        y : pluralize('y'),\n        yy : pluralize('y')\n    },\n    preparse: function (string) {\n        return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ar;\n\n})));\n\n\n/***/ }),\n/* 374 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arDz = moment.defineLocale('ar-dz', {\n    months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 4  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arDz;\n\n})));\n\n\n/***/ }),\n/* 375 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arKw = moment.defineLocale('ar-kw', {\n    months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arKw;\n\n})));\n\n\n/***/ }),\n/* 376 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '1',\n    '2': '2',\n    '3': '3',\n    '4': '4',\n    '5': '5',\n    '6': '6',\n    '7': '7',\n    '8': '8',\n    '9': '9',\n    '0': '0'\n}, pluralForm = function (n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n}, plurals = {\n    s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n}, pluralize = function (u) {\n    return function (number, withoutSuffix, string, isFuture) {\n        var f = pluralForm(number),\n            str = plurals[u][pluralForm(number)];\n        if (f === 2) {\n            str = str[withoutSuffix ? 0 : 1];\n        }\n        return str.replace(/%d/i, number);\n    };\n}, months = [\n    'يناير',\n    'فبراير',\n    'مارس',\n    'أبريل',\n    'مايو',\n    'يونيو',\n    'يوليو',\n    'أغسطس',\n    'سبتمبر',\n    'أكتوبر',\n    'نوفمبر',\n    'ديسمبر'\n];\n\nvar arLy = moment.defineLocale('ar-ly', {\n    months : months,\n    monthsShort : months,\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/\\u200FM/\\u200FYYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم عند الساعة] LT',\n        nextDay: '[غدًا عند الساعة] LT',\n        nextWeek: 'dddd [عند الساعة] LT',\n        lastDay: '[أمس عند الساعة] LT',\n        lastWeek: 'dddd [عند الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'بعد %s',\n        past : 'منذ %s',\n        s : pluralize('s'),\n        ss : pluralize('s'),\n        m : pluralize('m'),\n        mm : pluralize('m'),\n        h : pluralize('h'),\n        hh : pluralize('h'),\n        d : pluralize('d'),\n        dd : pluralize('d'),\n        M : pluralize('M'),\n        MM : pluralize('M'),\n        y : pluralize('y'),\n        yy : pluralize('y')\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arLy;\n\n})));\n\n\n/***/ }),\n/* 377 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arMa = moment.defineLocale('ar-ma', {\n    months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arMa;\n\n})));\n\n\n/***/ }),\n/* 378 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '١',\n    '2': '٢',\n    '3': '٣',\n    '4': '٤',\n    '5': '٥',\n    '6': '٦',\n    '7': '٧',\n    '8': '٨',\n    '9': '٩',\n    '0': '٠'\n}, numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n};\n\nvar arSa = moment.defineLocale('ar-sa', {\n    months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    preparse: function (string) {\n        return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arSa;\n\n})));\n\n\n/***/ }),\n/* 379 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arTn = moment.defineLocale('ar-tn', {\n    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'في %s',\n        past: 'منذ %s',\n        s: 'ثوان',\n        ss : '%d ثانية',\n        m: 'دقيقة',\n        mm: '%d دقائق',\n        h: 'ساعة',\n        hh: '%d ساعات',\n        d: 'يوم',\n        dd: '%d أيام',\n        M: 'شهر',\n        MM: '%d أشهر',\n        y: 'سنة',\n        yy: '%d سنوات'\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn arTn;\n\n})));\n\n\n/***/ }),\n/* 380 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    1: '-inci',\n    5: '-inci',\n    8: '-inci',\n    70: '-inci',\n    80: '-inci',\n    2: '-nci',\n    7: '-nci',\n    20: '-nci',\n    50: '-nci',\n    3: '-üncü',\n    4: '-üncü',\n    100: '-üncü',\n    6: '-ncı',\n    9: '-uncu',\n    10: '-uncu',\n    30: '-uncu',\n    60: '-ıncı',\n    90: '-ıncı'\n};\n\nvar az = moment.defineLocale('az', {\n    months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),\n    monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),\n    weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),\n    weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),\n    weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[bugün saat] LT',\n        nextDay : '[sabah saat] LT',\n        nextWeek : '[gələn həftə] dddd [saat] LT',\n        lastDay : '[dünən] LT',\n        lastWeek : '[keçən həftə] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s sonra',\n        past : '%s əvvəl',\n        s : 'birneçə saniyyə',\n        ss : '%d saniyə',\n        m : 'bir dəqiqə',\n        mm : '%d dəqiqə',\n        h : 'bir saat',\n        hh : '%d saat',\n        d : 'bir gün',\n        dd : '%d gün',\n        M : 'bir ay',\n        MM : '%d ay',\n        y : 'bir il',\n        yy : '%d il'\n    },\n    meridiemParse: /gecə|səhər|gündüz|axşam/,\n    isPM : function (input) {\n        return /^(gündüz|axşam)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'gecə';\n        } else if (hour < 12) {\n            return 'səhər';\n        } else if (hour < 17) {\n            return 'gündüz';\n        } else {\n            return 'axşam';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,\n    ordinal : function (number) {\n        if (number === 0) {  // special case for zero\n            return number + '-ıncı';\n        }\n        var a = number % 10,\n            b = number % 100 - a,\n            c = number >= 100 ? 100 : null;\n        return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn az;\n\n})));\n\n\n/***/ }),\n/* 381 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n        'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n        'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n        'dd': 'дзень_дні_дзён',\n        'MM': 'месяц_месяцы_месяцаў',\n        'yy': 'год_гады_гадоў'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'хвіліна' : 'хвіліну';\n    }\n    else if (key === 'h') {\n        return withoutSuffix ? 'гадзіна' : 'гадзіну';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\n\nvar be = moment.defineLocale('be', {\n    months : {\n        format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),\n        standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')\n    },\n    monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n    weekdays : {\n        format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),\n        standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),\n        isFormat: /\\[ ?[Вв] ?(?:мінулую|наступную)? ?\\] ?dddd/\n    },\n    weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY г.',\n        LLL : 'D MMMM YYYY г., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY г., HH:mm'\n    },\n    calendar : {\n        sameDay: '[Сёння ў] LT',\n        nextDay: '[Заўтра ў] LT',\n        lastDay: '[Учора ў] LT',\n        nextWeek: function () {\n            return '[У] dddd [ў] LT';\n        },\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 5:\n                case 6:\n                    return '[У мінулую] dddd [ў] LT';\n                case 1:\n                case 2:\n                case 4:\n                    return '[У мінулы] dddd [ў] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'праз %s',\n        past : '%s таму',\n        s : 'некалькі секунд',\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : relativeTimeWithPlural,\n        hh : relativeTimeWithPlural,\n        d : 'дзень',\n        dd : relativeTimeWithPlural,\n        M : 'месяц',\n        MM : relativeTimeWithPlural,\n        y : 'год',\n        yy : relativeTimeWithPlural\n    },\n    meridiemParse: /ночы|раніцы|дня|вечара/,\n    isPM : function (input) {\n        return /^(дня|вечара)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночы';\n        } else if (hour < 12) {\n            return 'раніцы';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечара';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n            case 'w':\n            case 'W':\n                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';\n            case 'D':\n                return number + '-га';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn be;\n\n})));\n\n\n/***/ }),\n/* 382 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar bg = moment.defineLocale('bg', {\n    months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),\n    weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n    weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'D.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay : '[Днес в] LT',\n        nextDay : '[Утре в] LT',\n        nextWeek : 'dddd [в] LT',\n        lastDay : '[Вчера в] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 6:\n                    return '[В изминалата] dddd [в] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[В изминалия] dddd [в] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'след %s',\n        past : 'преди %s',\n        s : 'няколко секунди',\n        ss : '%d секунди',\n        m : 'минута',\n        mm : '%d минути',\n        h : 'час',\n        hh : '%d часа',\n        d : 'ден',\n        dd : '%d дни',\n        M : 'месец',\n        MM : '%d месеца',\n        y : 'година',\n        yy : '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal : function (number) {\n        var lastDigit = number % 10,\n            last2Digits = number % 100;\n        if (number === 0) {\n            return number + '-ев';\n        } else if (last2Digits === 0) {\n            return number + '-ен';\n        } else if (last2Digits > 10 && last2Digits < 20) {\n            return number + '-ти';\n        } else if (lastDigit === 1) {\n            return number + '-ви';\n        } else if (lastDigit === 2) {\n            return number + '-ри';\n        } else if (lastDigit === 7 || lastDigit === 8) {\n            return number + '-ми';\n        } else {\n            return number + '-ти';\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bg;\n\n})));\n\n\n/***/ }),\n/* 383 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar bm = moment.defineLocale('bm', {\n    months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'),\n    monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n    weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n    weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n    weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'MMMM [tile] D [san] YYYY',\n        LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n        LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm'\n    },\n    calendar : {\n        sameDay : '[Bi lɛrɛ] LT',\n        nextDay : '[Sini lɛrɛ] LT',\n        nextWeek : 'dddd [don lɛrɛ] LT',\n        lastDay : '[Kunu lɛrɛ] LT',\n        lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s kɔnɔ',\n        past : 'a bɛ %s bɔ',\n        s : 'sanga dama dama',\n        ss : 'sekondi %d',\n        m : 'miniti kelen',\n        mm : 'miniti %d',\n        h : 'lɛrɛ kelen',\n        hh : 'lɛrɛ %d',\n        d : 'tile kelen',\n        dd : 'tile %d',\n        M : 'kalo kelen',\n        MM : 'kalo %d',\n        y : 'san kelen',\n        yy : 'san %d'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn bm;\n\n})));\n\n\n/***/ }),\n/* 384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '১',\n    '2': '২',\n    '3': '৩',\n    '4': '৪',\n    '5': '৫',\n    '6': '৬',\n    '7': '৭',\n    '8': '৮',\n    '9': '৯',\n    '0': '০'\n},\nnumberMap = {\n    '১': '1',\n    '২': '2',\n    '৩': '3',\n    '৪': '4',\n    '৫': '5',\n    '৬': '6',\n    '৭': '7',\n    '৮': '8',\n    '৯': '9',\n    '০': '0'\n};\n\nvar bn = moment.defineLocale('bn', {\n    months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),\n    monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),\n    weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),\n    weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n    weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm সময়',\n        LTS : 'A h:mm:ss সময়',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm সময়',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'\n    },\n    calendar : {\n        sameDay : '[আজ] LT',\n        nextDay : '[আগামীকাল] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[গতকাল] LT',\n        lastWeek : '[গত] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s পরে',\n        past : '%s আগে',\n        s : 'কয়েক সেকেন্ড',\n        ss : '%d সেকেন্ড',\n        m : 'এক মিনিট',\n        mm : '%d মিনিট',\n        h : 'এক ঘন্টা',\n        hh : '%d ঘন্টা',\n        d : 'এক দিন',\n        dd : '%d দিন',\n        M : 'এক মাস',\n        MM : '%d মাস',\n        y : 'এক বছর',\n        yy : '%d বছর'\n    },\n    preparse: function (string) {\n        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'রাত' && hour >= 4) ||\n                (meridiem === 'দুপুর' && hour < 5) ||\n                meridiem === 'বিকাল') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'রাত';\n        } else if (hour < 10) {\n            return 'সকাল';\n        } else if (hour < 17) {\n            return 'দুপুর';\n        } else if (hour < 20) {\n            return 'বিকাল';\n        } else {\n            return 'রাত';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bn;\n\n})));\n\n\n/***/ }),\n/* 385 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '༡',\n    '2': '༢',\n    '3': '༣',\n    '4': '༤',\n    '5': '༥',\n    '6': '༦',\n    '7': '༧',\n    '8': '༨',\n    '9': '༩',\n    '0': '༠'\n},\nnumberMap = {\n    '༡': '1',\n    '༢': '2',\n    '༣': '3',\n    '༤': '4',\n    '༥': '5',\n    '༦': '6',\n    '༧': '7',\n    '༨': '8',\n    '༩': '9',\n    '༠': '0'\n};\n\nvar bo = moment.defineLocale('bo', {\n    months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),\n    monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),\n    weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),\n    weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),\n    weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[དི་རིང] LT',\n        nextDay : '[སང་ཉིན] LT',\n        nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',\n        lastDay : '[ཁ་སང] LT',\n        lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ལ་',\n        past : '%s སྔན་ལ',\n        s : 'ལམ་སང',\n        ss : '%d སྐར་ཆ།',\n        m : 'སྐར་མ་གཅིག',\n        mm : '%d སྐར་མ',\n        h : 'ཆུ་ཚོད་གཅིག',\n        hh : '%d ཆུ་ཚོད',\n        d : 'ཉིན་གཅིག',\n        dd : '%d ཉིན་',\n        M : 'ཟླ་བ་གཅིག',\n        MM : '%d ཟླ་བ',\n        y : 'ལོ་གཅིག',\n        yy : '%d ལོ'\n    },\n    preparse: function (string) {\n        return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'མཚན་མོ' && hour >= 4) ||\n                (meridiem === 'ཉིན་གུང' && hour < 5) ||\n                meridiem === 'དགོང་དག') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'མཚན་མོ';\n        } else if (hour < 10) {\n            return 'ཞོགས་ཀས';\n        } else if (hour < 17) {\n            return 'ཉིན་གུང';\n        } else if (hour < 20) {\n            return 'དགོང་དག';\n        } else {\n            return 'མཚན་མོ';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bo;\n\n})));\n\n\n/***/ }),\n/* 386 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction relativeTimeWithMutation(number, withoutSuffix, key) {\n    var format = {\n        'mm': 'munutenn',\n        'MM': 'miz',\n        'dd': 'devezh'\n    };\n    return number + ' ' + mutation(format[key], number);\n}\nfunction specialMutationForYears(number) {\n    switch (lastNumber(number)) {\n        case 1:\n        case 3:\n        case 4:\n        case 5:\n        case 9:\n            return number + ' bloaz';\n        default:\n            return number + ' vloaz';\n    }\n}\nfunction lastNumber(number) {\n    if (number > 9) {\n        return lastNumber(number % 10);\n    }\n    return number;\n}\nfunction mutation(text, number) {\n    if (number === 2) {\n        return softMutation(text);\n    }\n    return text;\n}\nfunction softMutation(text) {\n    var mutationTable = {\n        'm': 'v',\n        'b': 'v',\n        'd': 'z'\n    };\n    if (mutationTable[text.charAt(0)] === undefined) {\n        return text;\n    }\n    return mutationTable[text.charAt(0)] + text.substring(1);\n}\n\nvar br = moment.defineLocale('br', {\n    months : 'Genver_C\\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),\n    monthsShort : 'Gen_C\\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n    weekdays : 'Sul_Lun_Meurzh_Merc\\'her_Yaou_Gwener_Sadorn'.split('_'),\n    weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n    weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h[e]mm A',\n        LTS : 'h[e]mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D [a viz] MMMM YYYY',\n        LLL : 'D [a viz] MMMM YYYY h[e]mm A',\n        LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'\n    },\n    calendar : {\n        sameDay : '[Hiziv da] LT',\n        nextDay : '[Warc\\'hoazh da] LT',\n        nextWeek : 'dddd [da] LT',\n        lastDay : '[Dec\\'h da] LT',\n        lastWeek : 'dddd [paset da] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'a-benn %s',\n        past : '%s \\'zo',\n        s : 'un nebeud segondennoù',\n        ss : '%d eilenn',\n        m : 'ur vunutenn',\n        mm : relativeTimeWithMutation,\n        h : 'un eur',\n        hh : '%d eur',\n        d : 'un devezh',\n        dd : relativeTimeWithMutation,\n        M : 'ur miz',\n        MM : relativeTimeWithMutation,\n        y : 'ur bloaz',\n        yy : specialMutationForYears\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n    ordinal : function (number) {\n        var output = (number === 1) ? 'añ' : 'vet';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn br;\n\n})));\n\n\n/***/ }),\n/* 387 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            if (number === 1) {\n                result += 'sekunda';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sekunde';\n            } else {\n                result += 'sekundi';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n        case 'mm':\n            if (number === 1) {\n                result += 'minuta';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'minute';\n            } else {\n                result += 'minuta';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'jedan sat' : 'jednog sata';\n        case 'hh':\n            if (number === 1) {\n                result += 'sat';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sata';\n            } else {\n                result += 'sati';\n            }\n            return result;\n        case 'dd':\n            if (number === 1) {\n                result += 'dan';\n            } else {\n                result += 'dana';\n            }\n            return result;\n        case 'MM':\n            if (number === 1) {\n                result += 'mjesec';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'mjeseca';\n            } else {\n                result += 'mjeseci';\n            }\n            return result;\n        case 'yy':\n            if (number === 1) {\n                result += 'godina';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'godine';\n            } else {\n                result += 'godina';\n            }\n            return result;\n    }\n}\n\nvar bs = moment.defineLocale('bs', {\n    months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danas u] LT',\n        nextDay  : '[sutra u] LT',\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[jučer u] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                    return '[prošlu] dddd [u] LT';\n                case 6:\n                    return '[prošle] [subote] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prošli] dddd [u] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'par sekundi',\n        ss     : translate,\n        m      : translate,\n        mm     : translate,\n        h      : translate,\n        hh     : translate,\n        d      : 'dan',\n        dd     : translate,\n        M      : 'mjesec',\n        MM     : translate,\n        y      : 'godinu',\n        yy     : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bs;\n\n})));\n\n\n/***/ }),\n/* 388 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ca = moment.defineLocale('ca', {\n    months : {\n        standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),\n        format: 'de gener_de febrer_de març_d\\'abril_de maig_de juny_de juliol_d\\'agost_de setembre_d\\'octubre_de novembre_de desembre'.split('_'),\n        isFormat: /D[oD]?(\\s)+MMMM/\n    },\n    monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),\n    weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n    weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM [de] YYYY',\n        ll : 'D MMM YYYY',\n        LLL : 'D MMMM [de] YYYY [a les] H:mm',\n        lll : 'D MMM YYYY, H:mm',\n        LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm',\n        llll : 'ddd D MMM YYYY, H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        nextDay : function () {\n            return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        lastDay : function () {\n            return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'd\\'aquí %s',\n        past : 'fa %s',\n        s : 'uns segons',\n        ss : '%d segons',\n        m : 'un minut',\n        mm : '%d minuts',\n        h : 'una hora',\n        hh : '%d hores',\n        d : 'un dia',\n        dd : '%d dies',\n        M : 'un mes',\n        MM : '%d mesos',\n        y : 'un any',\n        yy : '%d anys'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n    ordinal : function (number, period) {\n        var output = (number === 1) ? 'r' :\n            (number === 2) ? 'n' :\n            (number === 3) ? 'r' :\n            (number === 4) ? 't' : 'è';\n        if (period === 'w' || period === 'W') {\n            output = 'a';\n        }\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ca;\n\n})));\n\n\n/***/ }),\n/* 389 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),\n    monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');\nfunction plural(n) {\n    return (n > 1) && (n < 5) && (~~(n / 10) !== 1);\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':  // a few seconds / in a few seconds / a few seconds ago\n            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';\n        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'sekundy' : 'sekund');\n            } else {\n                return result + 'sekundami';\n            }\n            break;\n        case 'm':  // a minute / in a minute / a minute ago\n            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');\n        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'minuty' : 'minut');\n            } else {\n                return result + 'minutami';\n            }\n            break;\n        case 'h':  // an hour / in an hour / an hour ago\n            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');\n        case 'hh': // 9 hours / in 9 hours / 9 hours ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'hodiny' : 'hodin');\n            } else {\n                return result + 'hodinami';\n            }\n            break;\n        case 'd':  // a day / in a day / a day ago\n            return (withoutSuffix || isFuture) ? 'den' : 'dnem';\n        case 'dd': // 9 days / in 9 days / 9 days ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'dny' : 'dní');\n            } else {\n                return result + 'dny';\n            }\n            break;\n        case 'M':  // a month / in a month / a month ago\n            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';\n        case 'MM': // 9 months / in 9 months / 9 months ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'měsíce' : 'měsíců');\n            } else {\n                return result + 'měsíci';\n            }\n            break;\n        case 'y':  // a year / in a year / a year ago\n            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';\n        case 'yy': // 9 years / in 9 years / 9 years ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'roky' : 'let');\n            } else {\n                return result + 'lety';\n            }\n            break;\n    }\n}\n\nvar cs = moment.defineLocale('cs', {\n    months : months,\n    monthsShort : monthsShort,\n    monthsParse : (function (months, monthsShort) {\n        var i, _monthsParse = [];\n        for (i = 0; i < 12; i++) {\n            // use custom parser to solve problem with July (červenec)\n            _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');\n        }\n        return _monthsParse;\n    }(months, monthsShort)),\n    shortMonthsParse : (function (monthsShort) {\n        var i, _shortMonthsParse = [];\n        for (i = 0; i < 12; i++) {\n            _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');\n        }\n        return _shortMonthsParse;\n    }(monthsShort)),\n    longMonthsParse : (function (months) {\n        var i, _longMonthsParse = [];\n        for (i = 0; i < 12; i++) {\n            _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');\n        }\n        return _longMonthsParse;\n    }(months)),\n    weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n    weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),\n    weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),\n    longDateFormat : {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd D. MMMM YYYY H:mm',\n        l : 'D. M. YYYY'\n    },\n    calendar : {\n        sameDay: '[dnes v] LT',\n        nextDay: '[zítra v] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v neděli v] LT';\n                case 1:\n                case 2:\n                    return '[v] dddd [v] LT';\n                case 3:\n                    return '[ve středu v] LT';\n                case 4:\n                    return '[ve čtvrtek v] LT';\n                case 5:\n                    return '[v pátek v] LT';\n                case 6:\n                    return '[v sobotu v] LT';\n            }\n        },\n        lastDay: '[včera v] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[minulou neděli v] LT';\n                case 1:\n                case 2:\n                    return '[minulé] dddd [v] LT';\n                case 3:\n                    return '[minulou středu v] LT';\n                case 4:\n                case 5:\n                    return '[minulý] dddd [v] LT';\n                case 6:\n                    return '[minulou sobotu v] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : 'před %s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn cs;\n\n})));\n\n\n/***/ }),\n/* 390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar cv = moment.defineLocale('cv', {\n    months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),\n    monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),\n    weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),\n    weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),\n    weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',\n        LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n        LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'\n    },\n    calendar : {\n        sameDay: '[Паян] LT [сехетре]',\n        nextDay: '[Ыран] LT [сехетре]',\n        lastDay: '[Ӗнер] LT [сехетре]',\n        nextWeek: '[Ҫитес] dddd LT [сехетре]',\n        lastWeek: '[Иртнӗ] dddd LT [сехетре]',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : function (output) {\n            var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';\n            return output + affix;\n        },\n        past : '%s каялла',\n        s : 'пӗр-ик ҫеккунт',\n        ss : '%d ҫеккунт',\n        m : 'пӗр минут',\n        mm : '%d минут',\n        h : 'пӗр сехет',\n        hh : '%d сехет',\n        d : 'пӗр кун',\n        dd : '%d кун',\n        M : 'пӗр уйӑх',\n        MM : '%d уйӑх',\n        y : 'пӗр ҫул',\n        yy : '%d ҫул'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-мӗш/,\n    ordinal : '%d-мӗш',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn cv;\n\n})));\n\n\n/***/ }),\n/* 391 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar cy = moment.defineLocale('cy', {\n    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),\n    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),\n    weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),\n    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n    weekdaysParseExact : true,\n    // time formats are the same as en-gb\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[Heddiw am] LT',\n        nextDay: '[Yfory am] LT',\n        nextWeek: 'dddd [am] LT',\n        lastDay: '[Ddoe am] LT',\n        lastWeek: 'dddd [diwethaf am] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'mewn %s',\n        past: '%s yn ôl',\n        s: 'ychydig eiliadau',\n        ss: '%d eiliad',\n        m: 'munud',\n        mm: '%d munud',\n        h: 'awr',\n        hh: '%d awr',\n        d: 'diwrnod',\n        dd: '%d diwrnod',\n        M: 'mis',\n        MM: '%d mis',\n        y: 'blwyddyn',\n        yy: '%d flynedd'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n    ordinal: function (number) {\n        var b = number,\n            output = '',\n            lookup = [\n                '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed\n                'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed\n            ];\n        if (b > 20) {\n            if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n                output = 'fed'; // not 30ain, 70ain or 90ain\n            } else {\n                output = 'ain';\n            }\n        } else if (b > 0) {\n            output = lookup[b];\n        }\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn cy;\n\n})));\n\n\n/***/ }),\n/* 392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar da = moment.defineLocale('da', {\n    months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),\n    weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay : '[i dag kl.] LT',\n        nextDay : '[i morgen kl.] LT',\n        nextWeek : 'på dddd [kl.] LT',\n        lastDay : '[i går kl.] LT',\n        lastWeek : '[i] dddd[s kl.] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s siden',\n        s : 'få sekunder',\n        ss : '%d sekunder',\n        m : 'et minut',\n        mm : '%d minutter',\n        h : 'en time',\n        hh : '%d timer',\n        d : 'en dag',\n        dd : '%d dage',\n        M : 'en måned',\n        MM : '%d måneder',\n        y : 'et år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn da;\n\n})));\n\n\n/***/ }),\n/* 393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar de = moment.defineLocale('de', {\n    months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn de;\n\n})));\n\n\n/***/ }),\n/* 394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar deAt = moment.defineLocale('de-at', {\n    months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn deAt;\n\n})));\n\n\n/***/ }),\n/* 395 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar deCh = moment.defineLocale('de-ch', {\n    months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn deCh;\n\n})));\n\n\n/***/ }),\n/* 396 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'ޖެނުއަރީ',\n    'ފެބްރުއަރީ',\n    'މާރިޗު',\n    'އޭޕްރީލު',\n    'މޭ',\n    'ޖޫން',\n    'ޖުލައި',\n    'އޯގަސްޓު',\n    'ސެޕްޓެމްބަރު',\n    'އޮކްޓޯބަރު',\n    'ނޮވެމްބަރު',\n    'ޑިސެމްބަރު'\n], weekdays = [\n    'އާދިއްތަ',\n    'ހޯމަ',\n    'އަންގާރަ',\n    'ބުދަ',\n    'ބުރާސްފަތި',\n    'ހުކުރު',\n    'ހޮނިހިރު'\n];\n\nvar dv = moment.defineLocale('dv', {\n    months : months,\n    monthsShort : months,\n    weekdays : weekdays,\n    weekdaysShort : weekdays,\n    weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n    longDateFormat : {\n\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/M/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /މކ|މފ/,\n    isPM : function (input) {\n        return 'މފ' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'މކ';\n        } else {\n            return 'މފ';\n        }\n    },\n    calendar : {\n        sameDay : '[މިއަދު] LT',\n        nextDay : '[މާދަމާ] LT',\n        nextWeek : 'dddd LT',\n        lastDay : '[އިއްޔެ] LT',\n        lastWeek : '[ފާއިތުވި] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ތެރޭގައި %s',\n        past : 'ކުރިން %s',\n        s : 'ސިކުންތުކޮޅެއް',\n        ss : 'd% ސިކުންތު',\n        m : 'މިނިޓެއް',\n        mm : 'މިނިޓު %d',\n        h : 'ގަޑިއިރެއް',\n        hh : 'ގަޑިއިރު %d',\n        d : 'ދުވަހެއް',\n        dd : 'ދުވަސް %d',\n        M : 'މަހެއް',\n        MM : 'މަސް %d',\n        y : 'އަހަރެއް',\n        yy : 'އަހަރު %d'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 7,  // Sunday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn dv;\n\n})));\n\n\n/***/ }),\n/* 397 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\n\nvar el = moment.defineLocale('el', {\n    monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),\n    monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),\n    months : function (momentToFormat, format) {\n        if (!momentToFormat) {\n            return this._monthsNominativeEl;\n        } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'\n            return this._monthsGenitiveEl[momentToFormat.month()];\n        } else {\n            return this._monthsNominativeEl[momentToFormat.month()];\n        }\n    },\n    monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n    weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),\n    weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n    weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'μμ' : 'ΜΜ';\n        } else {\n            return isLower ? 'πμ' : 'ΠΜ';\n        }\n    },\n    isPM : function (input) {\n        return ((input + '').toLowerCase()[0] === 'μ');\n    },\n    meridiemParse : /[ΠΜ]\\.?Μ?\\.?/i,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendarEl : {\n        sameDay : '[Σήμερα {}] LT',\n        nextDay : '[Αύριο {}] LT',\n        nextWeek : 'dddd [{}] LT',\n        lastDay : '[Χθες {}] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 6:\n                    return '[το προηγούμενο] dddd [{}] LT';\n                default:\n                    return '[την προηγούμενη] dddd [{}] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    calendar : function (key, mom) {\n        var output = this._calendarEl[key],\n            hours = mom && mom.hours();\n        if (isFunction(output)) {\n            output = output.apply(mom);\n        }\n        return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));\n    },\n    relativeTime : {\n        future : 'σε %s',\n        past : '%s πριν',\n        s : 'λίγα δευτερόλεπτα',\n        ss : '%d δευτερόλεπτα',\n        m : 'ένα λεπτό',\n        mm : '%d λεπτά',\n        h : 'μία ώρα',\n        hh : '%d ώρες',\n        d : 'μία μέρα',\n        dd : '%d μέρες',\n        M : 'ένας μήνας',\n        MM : '%d μήνες',\n        y : 'ένας χρόνος',\n        yy : '%d χρόνια'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}η/,\n    ordinal: '%dη',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4st is the first week of the year.\n    }\n});\n\nreturn el;\n\n})));\n\n\n/***/ }),\n/* 398 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enAu = moment.defineLocale('en-au', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enAu;\n\n})));\n\n\n/***/ }),\n/* 399 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enCa = moment.defineLocale('en-ca', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'YYYY-MM-DD',\n        LL : 'MMMM D, YYYY',\n        LLL : 'MMMM D, YYYY h:mm A',\n        LLLL : 'dddd, MMMM D, YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\nreturn enCa;\n\n})));\n\n\n/***/ }),\n/* 400 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enGb = moment.defineLocale('en-gb', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enGb;\n\n})));\n\n\n/***/ }),\n/* 401 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enIe = moment.defineLocale('en-ie', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enIe;\n\n})));\n\n\n/***/ }),\n/* 402 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enIl = moment.defineLocale('en-il', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\nreturn enIl;\n\n})));\n\n\n/***/ }),\n/* 403 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enNz = moment.defineLocale('en-nz', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enNz;\n\n})));\n\n\n/***/ }),\n/* 404 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar eo = moment.defineLocale('eo', {\n    months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),\n    weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n    weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D[-a de] MMMM, YYYY',\n        LLL : 'D[-a de] MMMM, YYYY HH:mm',\n        LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm'\n    },\n    meridiemParse: /[ap]\\.t\\.m/i,\n    isPM: function (input) {\n        return input.charAt(0).toLowerCase() === 'p';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'p.t.m.' : 'P.T.M.';\n        } else {\n            return isLower ? 'a.t.m.' : 'A.T.M.';\n        }\n    },\n    calendar : {\n        sameDay : '[Hodiaŭ je] LT',\n        nextDay : '[Morgaŭ je] LT',\n        nextWeek : 'dddd [je] LT',\n        lastDay : '[Hieraŭ je] LT',\n        lastWeek : '[pasinta] dddd [je] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'post %s',\n        past : 'antaŭ %s',\n        s : 'sekundoj',\n        ss : '%d sekundoj',\n        m : 'minuto',\n        mm : '%d minutoj',\n        h : 'horo',\n        hh : '%d horoj',\n        d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo\n        dd : '%d tagoj',\n        M : 'monato',\n        MM : '%d monatoj',\n        y : 'jaro',\n        yy : '%d jaroj'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}a/,\n    ordinal : '%da',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn eo;\n\n})));\n\n\n/***/ }),\n/* 405 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];\nvar monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\nvar es = moment.defineLocale('es', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsRegex : monthsRegex,\n    monthsShortRegex : monthsRegex,\n    monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex : /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY H:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn es;\n\n})));\n\n\n/***/ }),\n/* 406 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];\nvar monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\nvar esDo = moment.defineLocale('es-do', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY h:mm A',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn esDo;\n\n})));\n\n\n/***/ }),\n/* 407 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar esUs = moment.defineLocale('es-us', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsParseExact : true,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'MM/DD/YYYY',\n        LL : 'MMMM [de] D [de] YYYY',\n        LLL : 'MMMM [de] D [de] YYYY h:mm A',\n        LLLL : 'dddd, MMMM [de] D [de] YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn esUs;\n\n})));\n\n\n/***/ }),\n/* 408 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n        'ss': [number + 'sekundi', number + 'sekundit'],\n        'm' : ['ühe minuti', 'üks minut'],\n        'mm': [number + ' minuti', number + ' minutit'],\n        'h' : ['ühe tunni', 'tund aega', 'üks tund'],\n        'hh': [number + ' tunni', number + ' tundi'],\n        'd' : ['ühe päeva', 'üks päev'],\n        'M' : ['kuu aja', 'kuu aega', 'üks kuu'],\n        'MM': [number + ' kuu', number + ' kuud'],\n        'y' : ['ühe aasta', 'aasta', 'üks aasta'],\n        'yy': [number + ' aasta', number + ' aastat']\n    };\n    if (withoutSuffix) {\n        return format[key][2] ? format[key][2] : format[key][1];\n    }\n    return isFuture ? format[key][0] : format[key][1];\n}\n\nvar et = moment.defineLocale('et', {\n    months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),\n    monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n    weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),\n    weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),\n    weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),\n    longDateFormat : {\n        LT   : 'H:mm',\n        LTS : 'H:mm:ss',\n        L    : 'DD.MM.YYYY',\n        LL   : 'D. MMMM YYYY',\n        LLL  : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[Täna,] LT',\n        nextDay  : '[Homme,] LT',\n        nextWeek : '[Järgmine] dddd LT',\n        lastDay  : '[Eile,] LT',\n        lastWeek : '[Eelmine] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s pärast',\n        past   : '%s tagasi',\n        s      : processRelativeTime,\n        ss     : processRelativeTime,\n        m      : processRelativeTime,\n        mm     : processRelativeTime,\n        h      : processRelativeTime,\n        hh     : processRelativeTime,\n        d      : processRelativeTime,\n        dd     : '%d päeva',\n        M      : processRelativeTime,\n        MM     : processRelativeTime,\n        y      : processRelativeTime,\n        yy     : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn et;\n\n})));\n\n\n/***/ }),\n/* 409 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar eu = moment.defineLocale('eu', {\n    months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),\n    monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),\n    weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),\n    weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'YYYY[ko] MMMM[ren] D[a]',\n        LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n        LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n        l : 'YYYY-M-D',\n        ll : 'YYYY[ko] MMM D[a]',\n        lll : 'YYYY[ko] MMM D[a] HH:mm',\n        llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'\n    },\n    calendar : {\n        sameDay : '[gaur] LT[etan]',\n        nextDay : '[bihar] LT[etan]',\n        nextWeek : 'dddd LT[etan]',\n        lastDay : '[atzo] LT[etan]',\n        lastWeek : '[aurreko] dddd LT[etan]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s barru',\n        past : 'duela %s',\n        s : 'segundo batzuk',\n        ss : '%d segundo',\n        m : 'minutu bat',\n        mm : '%d minutu',\n        h : 'ordu bat',\n        hh : '%d ordu',\n        d : 'egun bat',\n        dd : '%d egun',\n        M : 'hilabete bat',\n        MM : '%d hilabete',\n        y : 'urte bat',\n        yy : '%d urte'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn eu;\n\n})));\n\n\n/***/ }),\n/* 410 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '۱',\n    '2': '۲',\n    '3': '۳',\n    '4': '۴',\n    '5': '۵',\n    '6': '۶',\n    '7': '۷',\n    '8': '۸',\n    '9': '۹',\n    '0': '۰'\n}, numberMap = {\n    '۱': '1',\n    '۲': '2',\n    '۳': '3',\n    '۴': '4',\n    '۵': '5',\n    '۶': '6',\n    '۷': '7',\n    '۸': '8',\n    '۹': '9',\n    '۰': '0'\n};\n\nvar fa = moment.defineLocale('fa', {\n    months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    weekdays : 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split('_'),\n    weekdaysShort : 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split('_'),\n    weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /قبل از ظهر|بعد از ظهر/,\n    isPM: function (input) {\n        return /بعد از ظهر/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'قبل از ظهر';\n        } else {\n            return 'بعد از ظهر';\n        }\n    },\n    calendar : {\n        sameDay : '[امروز ساعت] LT',\n        nextDay : '[فردا ساعت] LT',\n        nextWeek : 'dddd [ساعت] LT',\n        lastDay : '[دیروز ساعت] LT',\n        lastWeek : 'dddd [پیش] [ساعت] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'در %s',\n        past : '%s پیش',\n        s : 'چند ثانیه',\n        ss : 'ثانیه d%',\n        m : 'یک دقیقه',\n        mm : '%d دقیقه',\n        h : 'یک ساعت',\n        hh : '%d ساعت',\n        d : 'یک روز',\n        dd : '%d روز',\n        M : 'یک ماه',\n        MM : '%d ماه',\n        y : 'یک سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/[۰-۹]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}م/,\n    ordinal : '%dم',\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn fa;\n\n})));\n\n\n/***/ }),\n/* 411 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),\n    numbersFuture = [\n        'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',\n        numbersPast[7], numbersPast[8], numbersPast[9]\n    ];\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = '';\n    switch (key) {\n        case 's':\n            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';\n        case 'ss':\n            return isFuture ? 'sekunnin' : 'sekuntia';\n        case 'm':\n            return isFuture ? 'minuutin' : 'minuutti';\n        case 'mm':\n            result = isFuture ? 'minuutin' : 'minuuttia';\n            break;\n        case 'h':\n            return isFuture ? 'tunnin' : 'tunti';\n        case 'hh':\n            result = isFuture ? 'tunnin' : 'tuntia';\n            break;\n        case 'd':\n            return isFuture ? 'päivän' : 'päivä';\n        case 'dd':\n            result = isFuture ? 'päivän' : 'päivää';\n            break;\n        case 'M':\n            return isFuture ? 'kuukauden' : 'kuukausi';\n        case 'MM':\n            result = isFuture ? 'kuukauden' : 'kuukautta';\n            break;\n        case 'y':\n            return isFuture ? 'vuoden' : 'vuosi';\n        case 'yy':\n            result = isFuture ? 'vuoden' : 'vuotta';\n            break;\n    }\n    result = verbalNumber(number, isFuture) + ' ' + result;\n    return result;\n}\nfunction verbalNumber(number, isFuture) {\n    return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;\n}\n\nvar fi = moment.defineLocale('fi', {\n    months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),\n    monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),\n    weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),\n    weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),\n    weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD.MM.YYYY',\n        LL : 'Do MMMM[ta] YYYY',\n        LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',\n        LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',\n        l : 'D.M.YYYY',\n        ll : 'Do MMM YYYY',\n        lll : 'Do MMM YYYY, [klo] HH.mm',\n        llll : 'ddd, Do MMM YYYY, [klo] HH.mm'\n    },\n    calendar : {\n        sameDay : '[tänään] [klo] LT',\n        nextDay : '[huomenna] [klo] LT',\n        nextWeek : 'dddd [klo] LT',\n        lastDay : '[eilen] [klo] LT',\n        lastWeek : '[viime] dddd[na] [klo] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s päästä',\n        past : '%s sitten',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fi;\n\n})));\n\n\n/***/ }),\n/* 412 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fo = moment.defineLocale('fo', {\n    months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n    weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),\n    weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n    weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D. MMMM, YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Í dag kl.] LT',\n        nextDay : '[Í morgin kl.] LT',\n        nextWeek : 'dddd [kl.] LT',\n        lastDay : '[Í gjár kl.] LT',\n        lastWeek : '[síðstu] dddd [kl] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'um %s',\n        past : '%s síðani',\n        s : 'fá sekund',\n        ss : '%d sekundir',\n        m : 'ein minutt',\n        mm : '%d minuttir',\n        h : 'ein tími',\n        hh : '%d tímar',\n        d : 'ein dagur',\n        dd : '%d dagar',\n        M : 'ein mánaði',\n        MM : '%d mánaðir',\n        y : 'eitt ár',\n        yy : '%d ár'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fo;\n\n})));\n\n\n/***/ }),\n/* 413 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fr = moment.defineLocale('fr', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // TODO: Return 'e' when day of month > 1. Move this case inside\n            // block for masculine words below.\n            // See https://github.com/moment/moment/issues/3375\n            case 'D':\n                return number + (number === 1 ? 'er' : '');\n\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fr;\n\n})));\n\n\n/***/ }),\n/* 414 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar frCa = moment.defineLocale('fr-ca', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'D':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    }\n});\n\nreturn frCa;\n\n})));\n\n\n/***/ }),\n/* 415 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar frCh = moment.defineLocale('fr-ch', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'D':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn frCh;\n\n})));\n\n\n/***/ }),\n/* 416 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n\nvar fy = moment.defineLocale('fy', {\n    months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n    monthsParseExact : true,\n    weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),\n    weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),\n    weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[hjoed om] LT',\n        nextDay: '[moarn om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[juster om] LT',\n        lastWeek: '[ôfrûne] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'oer %s',\n        past : '%s lyn',\n        s : 'in pear sekonden',\n        ss : '%d sekonden',\n        m : 'ien minút',\n        mm : '%d minuten',\n        h : 'ien oere',\n        hh : '%d oeren',\n        d : 'ien dei',\n        dd : '%d dagen',\n        M : 'ien moanne',\n        MM : '%d moannen',\n        y : 'ien jier',\n        yy : '%d jierren'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fy;\n\n})));\n\n\n/***/ }),\n/* 417 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'\n];\n\nvar monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];\n\nvar weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];\n\nvar weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];\n\nvar weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n\nvar gd = moment.defineLocale('gd', {\n    months : months,\n    monthsShort : monthsShort,\n    monthsParseExact : true,\n    weekdays : weekdays,\n    weekdaysShort : weekdaysShort,\n    weekdaysMin : weekdaysMin,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[An-diugh aig] LT',\n        nextDay : '[A-màireach aig] LT',\n        nextWeek : 'dddd [aig] LT',\n        lastDay : '[An-dè aig] LT',\n        lastWeek : 'dddd [seo chaidh] [aig] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ann an %s',\n        past : 'bho chionn %s',\n        s : 'beagan diogan',\n        ss : '%d diogan',\n        m : 'mionaid',\n        mm : '%d mionaidean',\n        h : 'uair',\n        hh : '%d uairean',\n        d : 'latha',\n        dd : '%d latha',\n        M : 'mìos',\n        MM : '%d mìosan',\n        y : 'bliadhna',\n        yy : '%d bliadhna'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(d|na|mh)/,\n    ordinal : function (number) {\n        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn gd;\n\n})));\n\n\n/***/ }),\n/* 418 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar gl = moment.defineLocale('gl', {\n    months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),\n    monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY H:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';\n        },\n        lastDay : function () {\n            return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';\n        },\n        lastWeek : function () {\n            return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : function (str) {\n            if (str.indexOf('un') === 0) {\n                return 'n' + str;\n            }\n            return 'en ' + str;\n        },\n        past : 'hai %s',\n        s : 'uns segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'unha hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn gl;\n\n})));\n\n\n/***/ }),\n/* 419 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's': ['thodde secondanim', 'thodde second'],\n        'ss': [number + ' secondanim', number + ' second'],\n        'm': ['eka mintan', 'ek minute'],\n        'mm': [number + ' mintanim', number + ' mintam'],\n        'h': ['eka horan', 'ek hor'],\n        'hh': [number + ' horanim', number + ' hor'],\n        'd': ['eka disan', 'ek dis'],\n        'dd': [number + ' disanim', number + ' dis'],\n        'M': ['eka mhoinean', 'ek mhoino'],\n        'MM': [number + ' mhoineanim', number + ' mhoine'],\n        'y': ['eka vorsan', 'ek voros'],\n        'yy': [number + ' vorsanim', number + ' vorsam']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar gomLatn = moment.defineLocale('gom-latn', {\n    months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'),\n    monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\\'var'.split('_'),\n    weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),\n    weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'A h:mm [vazta]',\n        LTS : 'A h:mm:ss [vazta]',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY A h:mm [vazta]',\n        LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]',\n        llll: 'ddd, D MMM YYYY, A h:mm [vazta]'\n    },\n    calendar : {\n        sameDay: '[Aiz] LT',\n        nextDay: '[Faleam] LT',\n        nextWeek: '[Ieta to] dddd[,] LT',\n        lastDay: '[Kal] LT',\n        lastWeek: '[Fatlo] dddd[,] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s',\n        past : '%s adim',\n        s : processRelativeTime,\n        ss : processRelativeTime,\n        m : processRelativeTime,\n        mm : processRelativeTime,\n        h : processRelativeTime,\n        hh : processRelativeTime,\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(er)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // the ordinal 'er' only applies to day of the month\n            case 'D':\n                return number + 'er';\n            default:\n            case 'M':\n            case 'Q':\n            case 'DDD':\n            case 'd':\n            case 'w':\n            case 'W':\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    },\n    meridiemParse: /rati|sokalli|donparam|sanje/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'rati') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'sokalli') {\n            return hour;\n        } else if (meridiem === 'donparam') {\n            return hour > 12 ? hour : hour + 12;\n        } else if (meridiem === 'sanje') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'rati';\n        } else if (hour < 12) {\n            return 'sokalli';\n        } else if (hour < 16) {\n            return 'donparam';\n        } else if (hour < 20) {\n            return 'sanje';\n        } else {\n            return 'rati';\n        }\n    }\n});\n\nreturn gomLatn;\n\n})));\n\n\n/***/ }),\n/* 420 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n        '1': '૧',\n        '2': '૨',\n        '3': '૩',\n        '4': '૪',\n        '5': '૫',\n        '6': '૬',\n        '7': '૭',\n        '8': '૮',\n        '9': '૯',\n        '0': '૦'\n    },\n    numberMap = {\n        '૧': '1',\n        '૨': '2',\n        '૩': '3',\n        '૪': '4',\n        '૫': '5',\n        '૬': '6',\n        '૭': '7',\n        '૮': '8',\n        '૯': '9',\n        '૦': '0'\n    };\n\nvar gu = moment.defineLocale('gu', {\n    months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'),\n    monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'),\n    weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),\n    weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),\n    longDateFormat: {\n        LT: 'A h:mm વાગ્યે',\n        LTS: 'A h:mm:ss વાગ્યે',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY, A h:mm વાગ્યે',\n        LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે'\n    },\n    calendar: {\n        sameDay: '[આજ] LT',\n        nextDay: '[કાલે] LT',\n        nextWeek: 'dddd, LT',\n        lastDay: '[ગઇકાલે] LT',\n        lastWeek: '[પાછલા] dddd, LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%s મા',\n        past: '%s પેહલા',\n        s: 'અમુક પળો',\n        ss: '%d સેકંડ',\n        m: 'એક મિનિટ',\n        mm: '%d મિનિટ',\n        h: 'એક કલાક',\n        hh: '%d કલાક',\n        d: 'એક દિવસ',\n        dd: '%d દિવસ',\n        M: 'એક મહિનો',\n        MM: '%d મહિનો',\n        y: 'એક વર્ષ',\n        yy: '%d વર્ષ'\n    },\n    preparse: function (string) {\n        return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Gujarati notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.\n    meridiemParse: /રાત|બપોર|સવાર|સાંજ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'રાત') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'સવાર') {\n            return hour;\n        } else if (meridiem === 'બપોર') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'સાંજ') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'રાત';\n        } else if (hour < 10) {\n            return 'સવાર';\n        } else if (hour < 17) {\n            return 'બપોર';\n        } else if (hour < 20) {\n            return 'સાંજ';\n        } else {\n            return 'રાત';\n        }\n    },\n    week: {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn gu;\n\n})));\n\n\n/***/ }),\n/* 421 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar he = moment.defineLocale('he', {\n    months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),\n    monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n    weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n    weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n    weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [ב]MMMM YYYY',\n        LLL : 'D [ב]MMMM YYYY HH:mm',\n        LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',\n        l : 'D/M/YYYY',\n        ll : 'D MMM YYYY',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[היום ב־]LT',\n        nextDay : '[מחר ב־]LT',\n        nextWeek : 'dddd [בשעה] LT',\n        lastDay : '[אתמול ב־]LT',\n        lastWeek : '[ביום] dddd [האחרון בשעה] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'בעוד %s',\n        past : 'לפני %s',\n        s : 'מספר שניות',\n        ss : '%d שניות',\n        m : 'דקה',\n        mm : '%d דקות',\n        h : 'שעה',\n        hh : function (number) {\n            if (number === 2) {\n                return 'שעתיים';\n            }\n            return number + ' שעות';\n        },\n        d : 'יום',\n        dd : function (number) {\n            if (number === 2) {\n                return 'יומיים';\n            }\n            return number + ' ימים';\n        },\n        M : 'חודש',\n        MM : function (number) {\n            if (number === 2) {\n                return 'חודשיים';\n            }\n            return number + ' חודשים';\n        },\n        y : 'שנה',\n        yy : function (number) {\n            if (number === 2) {\n                return 'שנתיים';\n            } else if (number % 10 === 0 && number !== 10) {\n                return number + ' שנה';\n            }\n            return number + ' שנים';\n        }\n    },\n    meridiemParse: /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n    isPM : function (input) {\n        return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 5) {\n            return 'לפנות בוקר';\n        } else if (hour < 10) {\n            return 'בבוקר';\n        } else if (hour < 12) {\n            return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n        } else if (hour < 18) {\n            return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n        } else {\n            return 'בערב';\n        }\n    }\n});\n\nreturn he;\n\n})));\n\n\n/***/ }),\n/* 422 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nvar hi = moment.defineLocale('hi', {\n    months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),\n    monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm बजे',\n        LTS : 'A h:mm:ss बजे',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm बजे',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[कल] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[कल] LT',\n        lastWeek : '[पिछले] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s में',\n        past : '%s पहले',\n        s : 'कुछ ही क्षण',\n        ss : '%d सेकंड',\n        m : 'एक मिनट',\n        mm : '%d मिनट',\n        h : 'एक घंटा',\n        hh : '%d घंटे',\n        d : 'एक दिन',\n        dd : '%d दिन',\n        M : 'एक महीने',\n        MM : '%d महीने',\n        y : 'एक वर्ष',\n        yy : '%d वर्ष'\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n    meridiemParse: /रात|सुबह|दोपहर|शाम/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'रात') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'सुबह') {\n            return hour;\n        } else if (meridiem === 'दोपहर') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'शाम') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'रात';\n        } else if (hour < 10) {\n            return 'सुबह';\n        } else if (hour < 17) {\n            return 'दोपहर';\n        } else if (hour < 20) {\n            return 'शाम';\n        } else {\n            return 'रात';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hi;\n\n})));\n\n\n/***/ }),\n/* 423 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            if (number === 1) {\n                result += 'sekunda';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sekunde';\n            } else {\n                result += 'sekundi';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n        case 'mm':\n            if (number === 1) {\n                result += 'minuta';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'minute';\n            } else {\n                result += 'minuta';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'jedan sat' : 'jednog sata';\n        case 'hh':\n            if (number === 1) {\n                result += 'sat';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sata';\n            } else {\n                result += 'sati';\n            }\n            return result;\n        case 'dd':\n            if (number === 1) {\n                result += 'dan';\n            } else {\n                result += 'dana';\n            }\n            return result;\n        case 'MM':\n            if (number === 1) {\n                result += 'mjesec';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'mjeseca';\n            } else {\n                result += 'mjeseci';\n            }\n            return result;\n        case 'yy':\n            if (number === 1) {\n                result += 'godina';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'godine';\n            } else {\n                result += 'godina';\n            }\n            return result;\n    }\n}\n\nvar hr = moment.defineLocale('hr', {\n    months : {\n        format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),\n        standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')\n    },\n    monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danas u] LT',\n        nextDay  : '[sutra u] LT',\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[jučer u] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                    return '[prošlu] dddd [u] LT';\n                case 6:\n                    return '[prošle] [subote] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prošli] dddd [u] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'par sekundi',\n        ss     : translate,\n        m      : translate,\n        mm     : translate,\n        h      : translate,\n        hh     : translate,\n        d      : 'dan',\n        dd     : translate,\n        M      : 'mjesec',\n        MM     : translate,\n        y      : 'godinu',\n        yy     : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hr;\n\n})));\n\n\n/***/ }),\n/* 424 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var num = number;\n    switch (key) {\n        case 's':\n            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';\n        case 'ss':\n            return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce';\n        case 'm':\n            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');\n        case 'mm':\n            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');\n        case 'h':\n            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');\n        case 'hh':\n            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');\n        case 'd':\n            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');\n        case 'dd':\n            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');\n        case 'M':\n            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n        case 'MM':\n            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n        case 'y':\n            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');\n        case 'yy':\n            return num + (isFuture || withoutSuffix ? ' év' : ' éve');\n    }\n    return '';\n}\nfunction week(isFuture) {\n    return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';\n}\n\nvar hu = moment.defineLocale('hu', {\n    months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),\n    monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),\n    weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),\n    weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),\n    weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'YYYY.MM.DD.',\n        LL : 'YYYY. MMMM D.',\n        LLL : 'YYYY. MMMM D. H:mm',\n        LLLL : 'YYYY. MMMM D., dddd H:mm'\n    },\n    meridiemParse: /de|du/i,\n    isPM: function (input) {\n        return input.charAt(1).toLowerCase() === 'u';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower === true ? 'de' : 'DE';\n        } else {\n            return isLower === true ? 'du' : 'DU';\n        }\n    },\n    calendar : {\n        sameDay : '[ma] LT[-kor]',\n        nextDay : '[holnap] LT[-kor]',\n        nextWeek : function () {\n            return week.call(this, true);\n        },\n        lastDay : '[tegnap] LT[-kor]',\n        lastWeek : function () {\n            return week.call(this, false);\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s múlva',\n        past : '%s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn hu;\n\n})));\n\n\n/***/ }),\n/* 425 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar hyAm = moment.defineLocale('hy-am', {\n    months : {\n        format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),\n        standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')\n    },\n    monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n    weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),\n    weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY թ.',\n        LLL : 'D MMMM YYYY թ., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY թ., HH:mm'\n    },\n    calendar : {\n        sameDay: '[այսօր] LT',\n        nextDay: '[վաղը] LT',\n        lastDay: '[երեկ] LT',\n        nextWeek: function () {\n            return 'dddd [օրը ժամը] LT';\n        },\n        lastWeek: function () {\n            return '[անցած] dddd [օրը ժամը] LT';\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s հետո',\n        past : '%s առաջ',\n        s : 'մի քանի վայրկյան',\n        ss : '%d վայրկյան',\n        m : 'րոպե',\n        mm : '%d րոպե',\n        h : 'ժամ',\n        hh : '%d ժամ',\n        d : 'օր',\n        dd : '%d օր',\n        M : 'ամիս',\n        MM : '%d ամիս',\n        y : 'տարի',\n        yy : '%d տարի'\n    },\n    meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n    isPM: function (input) {\n        return /^(ցերեկվա|երեկոյան)$/.test(input);\n    },\n    meridiem : function (hour) {\n        if (hour < 4) {\n            return 'գիշերվա';\n        } else if (hour < 12) {\n            return 'առավոտվա';\n        } else if (hour < 17) {\n            return 'ցերեկվա';\n        } else {\n            return 'երեկոյան';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'DDD':\n            case 'w':\n            case 'W':\n            case 'DDDo':\n                if (number === 1) {\n                    return number + '-ին';\n                }\n                return number + '-րդ';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hyAm;\n\n})));\n\n\n/***/ }),\n/* 426 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar id = moment.defineLocale('id', {\n    months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),\n    weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),\n    weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|siang|sore|malam/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'siang') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'sore' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'siang';\n        } else if (hours < 19) {\n            return 'sore';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Besok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kemarin pukul] LT',\n        lastWeek : 'dddd [lalu pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lalu',\n        s : 'beberapa detik',\n        ss : '%d detik',\n        m : 'semenit',\n        mm : '%d menit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn id;\n\n})));\n\n\n/***/ }),\n/* 427 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(n) {\n    if (n % 100 === 11) {\n        return true;\n    } else if (n % 10 === 1) {\n        return false;\n    }\n    return true;\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':\n            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';\n        case 'ss':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum');\n            }\n            return result + 'sekúnda';\n        case 'm':\n            return withoutSuffix ? 'mínúta' : 'mínútu';\n        case 'mm':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');\n            } else if (withoutSuffix) {\n                return result + 'mínúta';\n            }\n            return result + 'mínútu';\n        case 'hh':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');\n            }\n            return result + 'klukkustund';\n        case 'd':\n            if (withoutSuffix) {\n                return 'dagur';\n            }\n            return isFuture ? 'dag' : 'degi';\n        case 'dd':\n            if (plural(number)) {\n                if (withoutSuffix) {\n                    return result + 'dagar';\n                }\n                return result + (isFuture ? 'daga' : 'dögum');\n            } else if (withoutSuffix) {\n                return result + 'dagur';\n            }\n            return result + (isFuture ? 'dag' : 'degi');\n        case 'M':\n            if (withoutSuffix) {\n                return 'mánuður';\n            }\n            return isFuture ? 'mánuð' : 'mánuði';\n        case 'MM':\n            if (plural(number)) {\n                if (withoutSuffix) {\n                    return result + 'mánuðir';\n                }\n                return result + (isFuture ? 'mánuði' : 'mánuðum');\n            } else if (withoutSuffix) {\n                return result + 'mánuður';\n            }\n            return result + (isFuture ? 'mánuð' : 'mánuði');\n        case 'y':\n            return withoutSuffix || isFuture ? 'ár' : 'ári';\n        case 'yy':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');\n            }\n            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');\n    }\n}\n\nvar is = moment.defineLocale('is', {\n    months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),\n    weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),\n    weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),\n    weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] H:mm',\n        LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'\n    },\n    calendar : {\n        sameDay : '[í dag kl.] LT',\n        nextDay : '[á morgun kl.] LT',\n        nextWeek : 'dddd [kl.] LT',\n        lastDay : '[í gær kl.] LT',\n        lastWeek : '[síðasta] dddd [kl.] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'eftir %s',\n        past : 'fyrir %s síðan',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : 'klukkustund',\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn is;\n\n})));\n\n\n/***/ }),\n/* 428 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar it = moment.defineLocale('it', {\n    months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),\n    monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n    weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),\n    weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n    weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Oggi alle] LT',\n        nextDay: '[Domani alle] LT',\n        nextWeek: 'dddd [alle] LT',\n        lastDay: '[Ieri alle] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[la scorsa] dddd [alle] LT';\n                default:\n                    return '[lo scorso] dddd [alle] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : function (s) {\n            return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;\n        },\n        past : '%s fa',\n        s : 'alcuni secondi',\n        ss : '%d secondi',\n        m : 'un minuto',\n        mm : '%d minuti',\n        h : 'un\\'ora',\n        hh : '%d ore',\n        d : 'un giorno',\n        dd : '%d giorni',\n        M : 'un mese',\n        MM : '%d mesi',\n        y : 'un anno',\n        yy : '%d anni'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn it;\n\n})));\n\n\n/***/ }),\n/* 429 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ja = moment.defineLocale('ja', {\n    months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n    weekdaysShort : '日_月_火_水_木_金_土'.split('_'),\n    weekdaysMin : '日_月_火_水_木_金_土'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日 HH:mm dddd',\n        l : 'YYYY/MM/DD',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日 HH:mm dddd'\n    },\n    meridiemParse: /午前|午後/i,\n    isPM : function (input) {\n        return input === '午後';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return '午前';\n        } else {\n            return '午後';\n        }\n    },\n    calendar : {\n        sameDay : '[今日] LT',\n        nextDay : '[明日] LT',\n        nextWeek : '[来週]dddd LT',\n        lastDay : '[昨日] LT',\n        lastWeek : '[前週]dddd LT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}日/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '日';\n            default:\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s後',\n        past : '%s前',\n        s : '数秒',\n        ss : '%d秒',\n        m : '1分',\n        mm : '%d分',\n        h : '1時間',\n        hh : '%d時間',\n        d : '1日',\n        dd : '%d日',\n        M : '1ヶ月',\n        MM : '%dヶ月',\n        y : '1年',\n        yy : '%d年'\n    }\n});\n\nreturn ja;\n\n})));\n\n\n/***/ }),\n/* 430 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar jv = moment.defineLocale('jv', {\n    months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),\n    weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),\n    weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),\n    weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /enjing|siyang|sonten|ndalu/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'enjing') {\n            return hour;\n        } else if (meridiem === 'siyang') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'sonten' || meridiem === 'ndalu') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'enjing';\n        } else if (hours < 15) {\n            return 'siyang';\n        } else if (hours < 19) {\n            return 'sonten';\n        } else {\n            return 'ndalu';\n        }\n    },\n    calendar : {\n        sameDay : '[Dinten puniko pukul] LT',\n        nextDay : '[Mbenjang pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kala wingi pukul] LT',\n        lastWeek : 'dddd [kepengker pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'wonten ing %s',\n        past : '%s ingkang kepengker',\n        s : 'sawetawis detik',\n        ss : '%d detik',\n        m : 'setunggal menit',\n        mm : '%d menit',\n        h : 'setunggal jam',\n        hh : '%d jam',\n        d : 'sedinten',\n        dd : '%d dinten',\n        M : 'sewulan',\n        MM : '%d wulan',\n        y : 'setaun',\n        yy : '%d taun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn jv;\n\n})));\n\n\n/***/ }),\n/* 431 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ka = moment.defineLocale('ka', {\n    months : {\n        standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),\n        format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')\n    },\n    monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n    weekdays : {\n        standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),\n        format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),\n        isFormat: /(წინა|შემდეგ)/\n    },\n    weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n    weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[დღეს] LT[-ზე]',\n        nextDay : '[ხვალ] LT[-ზე]',\n        lastDay : '[გუშინ] LT[-ზე]',\n        nextWeek : '[შემდეგ] dddd LT[-ზე]',\n        lastWeek : '[წინა] dddd LT-ზე',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : function (s) {\n            return (/(წამი|წუთი|საათი|წელი)/).test(s) ?\n                s.replace(/ი$/, 'ში') :\n                s + 'ში';\n        },\n        past : function (s) {\n            if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {\n                return s.replace(/(ი|ე)$/, 'ის უკან');\n            }\n            if ((/წელი/).test(s)) {\n                return s.replace(/წელი$/, 'წლის უკან');\n            }\n        },\n        s : 'რამდენიმე წამი',\n        ss : '%d წამი',\n        m : 'წუთი',\n        mm : '%d წუთი',\n        h : 'საათი',\n        hh : '%d საათი',\n        d : 'დღე',\n        dd : '%d დღე',\n        M : 'თვე',\n        MM : '%d თვე',\n        y : 'წელი',\n        yy : '%d წელი'\n    },\n    dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n    ordinal : function (number) {\n        if (number === 0) {\n            return number;\n        }\n        if (number === 1) {\n            return number + '-ლი';\n        }\n        if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {\n            return 'მე-' + number;\n        }\n        return number + '-ე';\n    },\n    week : {\n        dow : 1,\n        doy : 7\n    }\n});\n\nreturn ka;\n\n})));\n\n\n/***/ }),\n/* 432 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-ші',\n    1: '-ші',\n    2: '-ші',\n    3: '-ші',\n    4: '-ші',\n    5: '-ші',\n    6: '-шы',\n    7: '-ші',\n    8: '-ші',\n    9: '-шы',\n    10: '-шы',\n    20: '-шы',\n    30: '-шы',\n    40: '-шы',\n    50: '-ші',\n    60: '-шы',\n    70: '-ші',\n    80: '-ші',\n    90: '-шы',\n    100: '-ші'\n};\n\nvar kk = moment.defineLocale('kk', {\n    months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),\n    monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n    weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),\n    weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n    weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бүгін сағат] LT',\n        nextDay : '[Ертең сағат] LT',\n        nextWeek : 'dddd [сағат] LT',\n        lastDay : '[Кеше сағат] LT',\n        lastWeek : '[Өткен аптаның] dddd [сағат] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ішінде',\n        past : '%s бұрын',\n        s : 'бірнеше секунд',\n        ss : '%d секунд',\n        m : 'бір минут',\n        mm : '%d минут',\n        h : 'бір сағат',\n        hh : '%d сағат',\n        d : 'бір күн',\n        dd : '%d күн',\n        M : 'бір ай',\n        MM : '%d ай',\n        y : 'бір жыл',\n        yy : '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n    ordinal : function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn kk;\n\n})));\n\n\n/***/ }),\n/* 433 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar km = moment.defineLocale('km', {\n    months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',\n        nextDay: '[ស្អែក ម៉ោង] LT',\n        nextWeek: 'dddd [ម៉ោង] LT',\n        lastDay: '[ម្សិលមិញ ម៉ោង] LT',\n        lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%sទៀត',\n        past: '%sមុន',\n        s: 'ប៉ុន្មានវិនាទី',\n        ss: '%d វិនាទី',\n        m: 'មួយនាទី',\n        mm: '%d នាទី',\n        h: 'មួយម៉ោង',\n        hh: '%d ម៉ោង',\n        d: 'មួយថ្ងៃ',\n        dd: '%d ថ្ងៃ',\n        M: 'មួយខែ',\n        MM: '%d ខែ',\n        y: 'មួយឆ្នាំ',\n        yy: '%d ឆ្នាំ'\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn km;\n\n})));\n\n\n/***/ }),\n/* 434 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '೧',\n    '2': '೨',\n    '3': '೩',\n    '4': '೪',\n    '5': '೫',\n    '6': '೬',\n    '7': '೭',\n    '8': '೮',\n    '9': '೯',\n    '0': '೦'\n},\nnumberMap = {\n    '೧': '1',\n    '೨': '2',\n    '೩': '3',\n    '೪': '4',\n    '೫': '5',\n    '೬': '6',\n    '೭': '7',\n    '೮': '8',\n    '೯': '9',\n    '೦': '0'\n};\n\nvar kn = moment.defineLocale('kn', {\n    months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'),\n    monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'),\n    weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),\n    weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[ಇಂದು] LT',\n        nextDay : '[ನಾಳೆ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ನಿನ್ನೆ] LT',\n        lastWeek : '[ಕೊನೆಯ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ನಂತರ',\n        past : '%s ಹಿಂದೆ',\n        s : 'ಕೆಲವು ಕ್ಷಣಗಳು',\n        ss : '%d ಸೆಕೆಂಡುಗಳು',\n        m : 'ಒಂದು ನಿಮಿಷ',\n        mm : '%d ನಿಮಿಷ',\n        h : 'ಒಂದು ಗಂಟೆ',\n        hh : '%d ಗಂಟೆ',\n        d : 'ಒಂದು ದಿನ',\n        dd : '%d ದಿನ',\n        M : 'ಒಂದು ತಿಂಗಳು',\n        MM : '%d ತಿಂಗಳು',\n        y : 'ಒಂದು ವರ್ಷ',\n        yy : '%d ವರ್ಷ'\n    },\n    preparse: function (string) {\n        return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ರಾತ್ರಿ') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {\n            return hour;\n        } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'ಸಂಜೆ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ರಾತ್ರಿ';\n        } else if (hour < 10) {\n            return 'ಬೆಳಿಗ್ಗೆ';\n        } else if (hour < 17) {\n            return 'ಮಧ್ಯಾಹ್ನ';\n        } else if (hour < 20) {\n            return 'ಸಂಜೆ';\n        } else {\n            return 'ರಾತ್ರಿ';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ನೇ)/,\n    ordinal : function (number) {\n        return number + 'ನೇ';\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn kn;\n\n})));\n\n\n/***/ }),\n/* 435 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ko = moment.defineLocale('ko', {\n    months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n    weekdaysShort : '일_월_화_수_목_금_토'.split('_'),\n    weekdaysMin : '일_월_화_수_목_금_토'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'YYYY.MM.DD.',\n        LL : 'YYYY년 MMMM D일',\n        LLL : 'YYYY년 MMMM D일 A h:mm',\n        LLLL : 'YYYY년 MMMM D일 dddd A h:mm',\n        l : 'YYYY.MM.DD.',\n        ll : 'YYYY년 MMMM D일',\n        lll : 'YYYY년 MMMM D일 A h:mm',\n        llll : 'YYYY년 MMMM D일 dddd A h:mm'\n    },\n    calendar : {\n        sameDay : '오늘 LT',\n        nextDay : '내일 LT',\n        nextWeek : 'dddd LT',\n        lastDay : '어제 LT',\n        lastWeek : '지난주 dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s 후',\n        past : '%s 전',\n        s : '몇 초',\n        ss : '%d초',\n        m : '1분',\n        mm : '%d분',\n        h : '한 시간',\n        hh : '%d시간',\n        d : '하루',\n        dd : '%d일',\n        M : '한 달',\n        MM : '%d달',\n        y : '일 년',\n        yy : '%d년'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(일|월|주)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '일';\n            case 'M':\n                return number + '월';\n            case 'w':\n            case 'W':\n                return number + '주';\n            default:\n                return number;\n        }\n    },\n    meridiemParse : /오전|오후/,\n    isPM : function (token) {\n        return token === '오후';\n    },\n    meridiem : function (hour, minute, isUpper) {\n        return hour < 12 ? '오전' : '오후';\n    }\n});\n\nreturn ko;\n\n})));\n\n\n/***/ }),\n/* 436 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-чү',\n    1: '-чи',\n    2: '-чи',\n    3: '-чү',\n    4: '-чү',\n    5: '-чи',\n    6: '-чы',\n    7: '-чи',\n    8: '-чи',\n    9: '-чу',\n    10: '-чу',\n    20: '-чы',\n    30: '-чу',\n    40: '-чы',\n    50: '-чү',\n    60: '-чы',\n    70: '-чи',\n    80: '-чи',\n    90: '-чу',\n    100: '-чү'\n};\n\nvar ky = moment.defineLocale('ky', {\n    months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),\n    monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),\n    weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),\n    weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бүгүн саат] LT',\n        nextDay : '[Эртең саат] LT',\n        nextWeek : 'dddd [саат] LT',\n        lastDay : '[Кече саат] LT',\n        lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ичинде',\n        past : '%s мурун',\n        s : 'бирнече секунд',\n        ss : '%d секунд',\n        m : 'бир мүнөт',\n        mm : '%d мүнөт',\n        h : 'бир саат',\n        hh : '%d саат',\n        d : 'бир күн',\n        dd : '%d күн',\n        M : 'бир ай',\n        MM : '%d ай',\n        y : 'бир жыл',\n        yy : '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(чи|чы|чү|чу)/,\n    ordinal : function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ky;\n\n})));\n\n\n/***/ }),\n/* 437 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eng Minutt', 'enger Minutt'],\n        'h': ['eng Stonn', 'enger Stonn'],\n        'd': ['een Dag', 'engem Dag'],\n        'M': ['ee Mount', 'engem Mount'],\n        'y': ['ee Joer', 'engem Joer']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\nfunction processFutureTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n    if (eifelerRegelAppliesToNumber(number)) {\n        return 'a ' + string;\n    }\n    return 'an ' + string;\n}\nfunction processPastTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n    if (eifelerRegelAppliesToNumber(number)) {\n        return 'viru ' + string;\n    }\n    return 'virun ' + string;\n}\n/**\n * Returns true if the word before the given number loses the '-n' ending.\n * e.g. 'an 10 Deeg' but 'a 5 Deeg'\n *\n * @param number {integer}\n * @returns {boolean}\n */\nfunction eifelerRegelAppliesToNumber(number) {\n    number = parseInt(number, 10);\n    if (isNaN(number)) {\n        return false;\n    }\n    if (number < 0) {\n        // Negative Number --> always true\n        return true;\n    } else if (number < 10) {\n        // Only 1 digit\n        if (4 <= number && number <= 7) {\n            return true;\n        }\n        return false;\n    } else if (number < 100) {\n        // 2 digits\n        var lastDigit = number % 10, firstDigit = number / 10;\n        if (lastDigit === 0) {\n            return eifelerRegelAppliesToNumber(firstDigit);\n        }\n        return eifelerRegelAppliesToNumber(lastDigit);\n    } else if (number < 10000) {\n        // 3 or 4 digits --> recursively check first digit\n        while (number >= 10) {\n            number = number / 10;\n        }\n        return eifelerRegelAppliesToNumber(number);\n    } else {\n        // Anything larger than 4 digits: recursively check first n-3 digits\n        number = number / 1000;\n        return eifelerRegelAppliesToNumber(number);\n    }\n}\n\nvar lb = moment.defineLocale('lb', {\n    months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),\n    weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),\n    weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm [Auer]',\n        LTS: 'H:mm:ss [Auer]',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm [Auer]',\n        LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'\n    },\n    calendar: {\n        sameDay: '[Haut um] LT',\n        sameElse: 'L',\n        nextDay: '[Muer um] LT',\n        nextWeek: 'dddd [um] LT',\n        lastDay: '[Gëschter um] LT',\n        lastWeek: function () {\n            // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule\n            switch (this.day()) {\n                case 2:\n                case 4:\n                    return '[Leschten] dddd [um] LT';\n                default:\n                    return '[Leschte] dddd [um] LT';\n            }\n        }\n    },\n    relativeTime : {\n        future : processFutureTime,\n        past : processPastTime,\n        s : 'e puer Sekonnen',\n        ss : '%d Sekonnen',\n        m : processRelativeTime,\n        mm : '%d Minutten',\n        h : processRelativeTime,\n        hh : '%d Stonnen',\n        d : processRelativeTime,\n        dd : '%d Deeg',\n        M : processRelativeTime,\n        MM : '%d Méint',\n        y : processRelativeTime,\n        yy : '%d Joer'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lb;\n\n})));\n\n\n/***/ }),\n/* 438 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar lo = moment.defineLocale('lo', {\n    months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'ວັນdddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n    isPM: function (input) {\n        return input === 'ຕອນແລງ';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ຕອນເຊົ້າ';\n        } else {\n            return 'ຕອນແລງ';\n        }\n    },\n    calendar : {\n        sameDay : '[ມື້ນີ້ເວລາ] LT',\n        nextDay : '[ມື້ອື່ນເວລາ] LT',\n        nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',\n        lastDay : '[ມື້ວານນີ້ເວລາ] LT',\n        lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ອີກ %s',\n        past : '%sຜ່ານມາ',\n        s : 'ບໍ່ເທົ່າໃດວິນາທີ',\n        ss : '%d ວິນາທີ' ,\n        m : '1 ນາທີ',\n        mm : '%d ນາທີ',\n        h : '1 ຊົ່ວໂມງ',\n        hh : '%d ຊົ່ວໂມງ',\n        d : '1 ມື້',\n        dd : '%d ມື້',\n        M : '1 ເດືອນ',\n        MM : '%d ເດືອນ',\n        y : '1 ປີ',\n        yy : '%d ປີ'\n    },\n    dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n    ordinal : function (number) {\n        return 'ທີ່' + number;\n    }\n});\n\nreturn lo;\n\n})));\n\n\n/***/ }),\n/* 439 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar units = {\n    'ss' : 'sekundė_sekundžių_sekundes',\n    'm' : 'minutė_minutės_minutę',\n    'mm': 'minutės_minučių_minutes',\n    'h' : 'valanda_valandos_valandą',\n    'hh': 'valandos_valandų_valandas',\n    'd' : 'diena_dienos_dieną',\n    'dd': 'dienos_dienų_dienas',\n    'M' : 'mėnuo_mėnesio_mėnesį',\n    'MM': 'mėnesiai_mėnesių_mėnesius',\n    'y' : 'metai_metų_metus',\n    'yy': 'metai_metų_metus'\n};\nfunction translateSeconds(number, withoutSuffix, key, isFuture) {\n    if (withoutSuffix) {\n        return 'kelios sekundės';\n    } else {\n        return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n    }\n}\nfunction translateSingular(number, withoutSuffix, key, isFuture) {\n    return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);\n}\nfunction special(number) {\n    return number % 10 === 0 || (number > 10 && number < 20);\n}\nfunction forms(key) {\n    return units[key].split('_');\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    if (number === 1) {\n        return result + translateSingular(number, withoutSuffix, key[0], isFuture);\n    } else if (withoutSuffix) {\n        return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n    } else {\n        if (isFuture) {\n            return result + forms(key)[1];\n        } else {\n            return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n        }\n    }\n}\nvar lt = moment.defineLocale('lt', {\n    months : {\n        format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),\n        standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),\n        isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/\n    },\n    monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n    weekdays : {\n        format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),\n        standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),\n        isFormat: /dddd HH:mm/\n    },\n    weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n    weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'YYYY [m.] MMMM D [d.]',\n        LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n        LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n        l : 'YYYY-MM-DD',\n        ll : 'YYYY [m.] MMMM D [d.]',\n        lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n        llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'\n    },\n    calendar : {\n        sameDay : '[Šiandien] LT',\n        nextDay : '[Rytoj] LT',\n        nextWeek : 'dddd LT',\n        lastDay : '[Vakar] LT',\n        lastWeek : '[Praėjusį] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'po %s',\n        past : 'prieš %s',\n        s : translateSeconds,\n        ss : translate,\n        m : translateSingular,\n        mm : translate,\n        h : translateSingular,\n        hh : translate,\n        d : translateSingular,\n        dd : translate,\n        M : translateSingular,\n        MM : translate,\n        y : translateSingular,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n    ordinal : function (number) {\n        return number + '-oji';\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lt;\n\n})));\n\n\n/***/ }),\n/* 440 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar units = {\n    'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n    'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    'h': 'stundas_stundām_stunda_stundas'.split('_'),\n    'hh': 'stundas_stundām_stunda_stundas'.split('_'),\n    'd': 'dienas_dienām_diena_dienas'.split('_'),\n    'dd': 'dienas_dienām_diena_dienas'.split('_'),\n    'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    'y': 'gada_gadiem_gads_gadi'.split('_'),\n    'yy': 'gada_gadiem_gads_gadi'.split('_')\n};\n/**\n * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n */\nfunction format(forms, number, withoutSuffix) {\n    if (withoutSuffix) {\n        // E.g. \"21 minūte\", \"3 minūtes\".\n        return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n    } else {\n        // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n        // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n        return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n    }\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    return number + ' ' + format(units[key], number, withoutSuffix);\n}\nfunction relativeTimeWithSingular(number, withoutSuffix, key) {\n    return format(units[key], number, withoutSuffix);\n}\nfunction relativeSeconds(number, withoutSuffix) {\n    return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n}\n\nvar lv = moment.defineLocale('lv', {\n    months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),\n    weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY.',\n        LL : 'YYYY. [gada] D. MMMM',\n        LLL : 'YYYY. [gada] D. MMMM, HH:mm',\n        LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'\n    },\n    calendar : {\n        sameDay : '[Šodien pulksten] LT',\n        nextDay : '[Rīt pulksten] LT',\n        nextWeek : 'dddd [pulksten] LT',\n        lastDay : '[Vakar pulksten] LT',\n        lastWeek : '[Pagājušā] dddd [pulksten] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'pēc %s',\n        past : 'pirms %s',\n        s : relativeSeconds,\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithSingular,\n        mm : relativeTimeWithPlural,\n        h : relativeTimeWithSingular,\n        hh : relativeTimeWithPlural,\n        d : relativeTimeWithSingular,\n        dd : relativeTimeWithPlural,\n        M : relativeTimeWithSingular,\n        MM : relativeTimeWithPlural,\n        y : relativeTimeWithSingular,\n        yy : relativeTimeWithPlural\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lv;\n\n})));\n\n\n/***/ }),\n/* 441 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['sekund', 'sekunda', 'sekundi'],\n        m: ['jedan minut', 'jednog minuta'],\n        mm: ['minut', 'minuta', 'minuta'],\n        h: ['jedan sat', 'jednog sata'],\n        hh: ['sat', 'sata', 'sati'],\n        dd: ['dan', 'dana', 'dana'],\n        MM: ['mjesec', 'mjeseca', 'mjeseci'],\n        yy: ['godina', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar me = moment.defineLocale('me', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact : true,\n    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[danas u] LT',\n        nextDay: '[sjutra u] LT',\n\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[juče u] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[prošle] [nedjelje] [u] LT',\n                '[prošlog] [ponedjeljka] [u] LT',\n                '[prošlog] [utorka] [u] LT',\n                '[prošle] [srijede] [u] LT',\n                '[prošlog] [četvrtka] [u] LT',\n                '[prošlog] [petka] [u] LT',\n                '[prošle] [subote] [u] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'nekoliko sekundi',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'dan',\n        dd     : translator.translate,\n        M      : 'mjesec',\n        MM     : translator.translate,\n        y      : 'godinu',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn me;\n\n})));\n\n\n/***/ }),\n/* 442 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mi = moment.defineLocale('mi', {\n    months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),\n    monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),\n    monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n    weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n    weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY [i] HH:mm',\n        LLLL: 'dddd, D MMMM YYYY [i] HH:mm'\n    },\n    calendar: {\n        sameDay: '[i teie mahana, i] LT',\n        nextDay: '[apopo i] LT',\n        nextWeek: 'dddd [i] LT',\n        lastDay: '[inanahi i] LT',\n        lastWeek: 'dddd [whakamutunga i] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'i roto i %s',\n        past: '%s i mua',\n        s: 'te hēkona ruarua',\n        ss: '%d hēkona',\n        m: 'he meneti',\n        mm: '%d meneti',\n        h: 'te haora',\n        hh: '%d haora',\n        d: 'he ra',\n        dd: '%d ra',\n        M: 'he marama',\n        MM: '%d marama',\n        y: 'he tau',\n        yy: '%d tau'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn mi;\n\n})));\n\n\n/***/ }),\n/* 443 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mk = moment.defineLocale('mk', {\n    months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),\n    weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n    weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'D.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay : '[Денес во] LT',\n        nextDay : '[Утре во] LT',\n        nextWeek : '[Во] dddd [во] LT',\n        lastDay : '[Вчера во] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 6:\n                    return '[Изминатата] dddd [во] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[Изминатиот] dddd [во] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'после %s',\n        past : 'пред %s',\n        s : 'неколку секунди',\n        ss : '%d секунди',\n        m : 'минута',\n        mm : '%d минути',\n        h : 'час',\n        hh : '%d часа',\n        d : 'ден',\n        dd : '%d дена',\n        M : 'месец',\n        MM : '%d месеци',\n        y : 'година',\n        yy : '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal : function (number) {\n        var lastDigit = number % 10,\n            last2Digits = number % 100;\n        if (number === 0) {\n            return number + '-ев';\n        } else if (last2Digits === 0) {\n            return number + '-ен';\n        } else if (last2Digits > 10 && last2Digits < 20) {\n            return number + '-ти';\n        } else if (lastDigit === 1) {\n            return number + '-ви';\n        } else if (lastDigit === 2) {\n            return number + '-ри';\n        } else if (lastDigit === 7 || lastDigit === 8) {\n            return number + '-ми';\n        } else {\n            return number + '-ти';\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn mk;\n\n})));\n\n\n/***/ }),\n/* 444 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ml = moment.defineLocale('ml', {\n    months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),\n    monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),\n    weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),\n    weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm -നു',\n        LTS : 'A h:mm:ss -നു',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm -നു',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'\n    },\n    calendar : {\n        sameDay : '[ഇന്ന്] LT',\n        nextDay : '[നാളെ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ഇന്നലെ] LT',\n        lastWeek : '[കഴിഞ്ഞ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s കഴിഞ്ഞ്',\n        past : '%s മുൻപ്',\n        s : 'അൽപ നിമിഷങ്ങൾ',\n        ss : '%d സെക്കൻഡ്',\n        m : 'ഒരു മിനിറ്റ്',\n        mm : '%d മിനിറ്റ്',\n        h : 'ഒരു മണിക്കൂർ',\n        hh : '%d മണിക്കൂർ',\n        d : 'ഒരു ദിവസം',\n        dd : '%d ദിവസം',\n        M : 'ഒരു മാസം',\n        MM : '%d മാസം',\n        y : 'ഒരു വർഷം',\n        yy : '%d വർഷം'\n    },\n    meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'രാത്രി' && hour >= 4) ||\n                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||\n                meridiem === 'വൈകുന്നേരം') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'രാത്രി';\n        } else if (hour < 12) {\n            return 'രാവിലെ';\n        } else if (hour < 17) {\n            return 'ഉച്ച കഴിഞ്ഞ്';\n        } else if (hour < 20) {\n            return 'വൈകുന്നേരം';\n        } else {\n            return 'രാത്രി';\n        }\n    }\n});\n\nreturn ml;\n\n})));\n\n\n/***/ }),\n/* 445 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nfunction relativeTimeMr(number, withoutSuffix, string, isFuture)\n{\n    var output = '';\n    if (withoutSuffix) {\n        switch (string) {\n            case 's': output = 'काही सेकंद'; break;\n            case 'ss': output = '%d सेकंद'; break;\n            case 'm': output = 'एक मिनिट'; break;\n            case 'mm': output = '%d मिनिटे'; break;\n            case 'h': output = 'एक तास'; break;\n            case 'hh': output = '%d तास'; break;\n            case 'd': output = 'एक दिवस'; break;\n            case 'dd': output = '%d दिवस'; break;\n            case 'M': output = 'एक महिना'; break;\n            case 'MM': output = '%d महिने'; break;\n            case 'y': output = 'एक वर्ष'; break;\n            case 'yy': output = '%d वर्षे'; break;\n        }\n    }\n    else {\n        switch (string) {\n            case 's': output = 'काही सेकंदां'; break;\n            case 'ss': output = '%d सेकंदां'; break;\n            case 'm': output = 'एका मिनिटा'; break;\n            case 'mm': output = '%d मिनिटां'; break;\n            case 'h': output = 'एका तासा'; break;\n            case 'hh': output = '%d तासां'; break;\n            case 'd': output = 'एका दिवसा'; break;\n            case 'dd': output = '%d दिवसां'; break;\n            case 'M': output = 'एका महिन्या'; break;\n            case 'MM': output = '%d महिन्यां'; break;\n            case 'y': output = 'एका वर्षा'; break;\n            case 'yy': output = '%d वर्षां'; break;\n        }\n    }\n    return output.replace(/%d/i, number);\n}\n\nvar mr = moment.defineLocale('mr', {\n    months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),\n    monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm वाजता',\n        LTS : 'A h:mm:ss वाजता',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm वाजता',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[उद्या] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[काल] LT',\n        lastWeek: '[मागील] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future: '%sमध्ये',\n        past: '%sपूर्वी',\n        s: relativeTimeMr,\n        ss: relativeTimeMr,\n        m: relativeTimeMr,\n        mm: relativeTimeMr,\n        h: relativeTimeMr,\n        hh: relativeTimeMr,\n        d: relativeTimeMr,\n        dd: relativeTimeMr,\n        M: relativeTimeMr,\n        MM: relativeTimeMr,\n        y: relativeTimeMr,\n        yy: relativeTimeMr\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'रात्री') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'सकाळी') {\n            return hour;\n        } else if (meridiem === 'दुपारी') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'सायंकाळी') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'रात्री';\n        } else if (hour < 10) {\n            return 'सकाळी';\n        } else if (hour < 17) {\n            return 'दुपारी';\n        } else if (hour < 20) {\n            return 'सायंकाळी';\n        } else {\n            return 'रात्री';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn mr;\n\n})));\n\n\n/***/ }),\n/* 446 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ms = moment.defineLocale('ms', {\n    months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'tengahari') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'petang' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'tengahari';\n        } else if (hours < 19) {\n            return 'petang';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Esok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kelmarin pukul] LT',\n        lastWeek : 'dddd [lepas pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lepas',\n        s : 'beberapa saat',\n        ss : '%d saat',\n        m : 'seminit',\n        mm : '%d minit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ms;\n\n})));\n\n\n/***/ }),\n/* 447 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar msMy = moment.defineLocale('ms-my', {\n    months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'tengahari') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'petang' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'tengahari';\n        } else if (hours < 19) {\n            return 'petang';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Esok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kelmarin pukul] LT',\n        lastWeek : 'dddd [lepas pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lepas',\n        s : 'beberapa saat',\n        ss : '%d saat',\n        m : 'seminit',\n        mm : '%d minit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn msMy;\n\n})));\n\n\n/***/ }),\n/* 448 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mt = moment.defineLocale('mt', {\n    months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'),\n    monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),\n    weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'),\n    weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),\n    weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Illum fil-]LT',\n        nextDay : '[Għada fil-]LT',\n        nextWeek : 'dddd [fil-]LT',\n        lastDay : '[Il-bieraħ fil-]LT',\n        lastWeek : 'dddd [li għadda] [fil-]LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'f’ %s',\n        past : '%s ilu',\n        s : 'ftit sekondi',\n        ss : '%d sekondi',\n        m : 'minuta',\n        mm : '%d minuti',\n        h : 'siegħa',\n        hh : '%d siegħat',\n        d : 'ġurnata',\n        dd : '%d ġranet',\n        M : 'xahar',\n        MM : '%d xhur',\n        y : 'sena',\n        yy : '%d sni'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn mt;\n\n})));\n\n\n/***/ }),\n/* 449 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '၁',\n    '2': '၂',\n    '3': '၃',\n    '4': '၄',\n    '5': '၅',\n    '6': '၆',\n    '7': '၇',\n    '8': '၈',\n    '9': '၉',\n    '0': '၀'\n}, numberMap = {\n    '၁': '1',\n    '၂': '2',\n    '၃': '3',\n    '၄': '4',\n    '၅': '5',\n    '၆': '6',\n    '၇': '7',\n    '၈': '8',\n    '၉': '9',\n    '၀': '0'\n};\n\nvar my = moment.defineLocale('my', {\n    months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),\n    monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),\n    weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),\n    weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n    weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[ယနေ.] LT [မှာ]',\n        nextDay: '[မနက်ဖြန်] LT [မှာ]',\n        nextWeek: 'dddd LT [မှာ]',\n        lastDay: '[မနေ.က] LT [မှာ]',\n        lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'လာမည့် %s မှာ',\n        past: 'လွန်ခဲ့သော %s က',\n        s: 'စက္ကန်.အနည်းငယ်',\n        ss : '%d စက္ကန့်',\n        m: 'တစ်မိနစ်',\n        mm: '%d မိနစ်',\n        h: 'တစ်နာရီ',\n        hh: '%d နာရီ',\n        d: 'တစ်ရက်',\n        dd: '%d ရက်',\n        M: 'တစ်လ',\n        MM: '%d လ',\n        y: 'တစ်နှစ်',\n        yy: '%d နှစ်'\n    },\n    preparse: function (string) {\n        return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn my;\n\n})));\n\n\n/***/ }),\n/* 450 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar nb = moment.defineLocale('nb', {\n    months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n    weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] HH:mm',\n        LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[i dag kl.] LT',\n        nextDay: '[i morgen kl.] LT',\n        nextWeek: 'dddd [kl.] LT',\n        lastDay: '[i går kl.] LT',\n        lastWeek: '[forrige] dddd [kl.] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s siden',\n        s : 'noen sekunder',\n        ss : '%d sekunder',\n        m : 'ett minutt',\n        mm : '%d minutter',\n        h : 'en time',\n        hh : '%d timer',\n        d : 'en dag',\n        dd : '%d dager',\n        M : 'en måned',\n        MM : '%d måneder',\n        y : 'ett år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nb;\n\n})));\n\n\n/***/ }),\n/* 451 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nvar ne = moment.defineLocale('ne', {\n    months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),\n    monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),\n    weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n    weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'Aको h:mm बजे',\n        LTS : 'Aको h:mm:ss बजे',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, Aको h:mm बजे',\n        LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'राति') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'बिहान') {\n            return hour;\n        } else if (meridiem === 'दिउँसो') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'साँझ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 3) {\n            return 'राति';\n        } else if (hour < 12) {\n            return 'बिहान';\n        } else if (hour < 16) {\n            return 'दिउँसो';\n        } else if (hour < 20) {\n            return 'साँझ';\n        } else {\n            return 'राति';\n        }\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[भोलि] LT',\n        nextWeek : '[आउँदो] dddd[,] LT',\n        lastDay : '[हिजो] LT',\n        lastWeek : '[गएको] dddd[,] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%sमा',\n        past : '%s अगाडि',\n        s : 'केही क्षण',\n        ss : '%d सेकेण्ड',\n        m : 'एक मिनेट',\n        mm : '%d मिनेट',\n        h : 'एक घण्टा',\n        hh : '%d घण्टा',\n        d : 'एक दिन',\n        dd : '%d दिन',\n        M : 'एक महिना',\n        MM : '%d महिना',\n        y : 'एक बर्ष',\n        yy : '%d बर्ष'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ne;\n\n})));\n\n\n/***/ }),\n/* 452 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');\n\nvar monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];\nvar monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\nvar nl = moment.defineLocale('nl', {\n    months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[vandaag om] LT',\n        nextDay: '[morgen om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[gisteren om] LT',\n        lastWeek: '[afgelopen] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'over %s',\n        past : '%s geleden',\n        s : 'een paar seconden',\n        ss : '%d seconden',\n        m : 'één minuut',\n        mm : '%d minuten',\n        h : 'één uur',\n        hh : '%d uur',\n        d : 'één dag',\n        dd : '%d dagen',\n        M : 'één maand',\n        MM : '%d maanden',\n        y : 'één jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nl;\n\n})));\n\n\n/***/ }),\n/* 453 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');\n\nvar monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];\nvar monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\nvar nlBe = moment.defineLocale('nl-be', {\n    months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[vandaag om] LT',\n        nextDay: '[morgen om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[gisteren om] LT',\n        lastWeek: '[afgelopen] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'over %s',\n        past : '%s geleden',\n        s : 'een paar seconden',\n        ss : '%d seconden',\n        m : 'één minuut',\n        mm : '%d minuten',\n        h : 'één uur',\n        hh : '%d uur',\n        d : 'één dag',\n        dd : '%d dagen',\n        M : 'één maand',\n        MM : '%d maanden',\n        y : 'één jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nlBe;\n\n})));\n\n\n/***/ }),\n/* 454 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar nn = moment.defineLocale('nn', {\n    months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n    weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n    weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),\n    weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] H:mm',\n        LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[I dag klokka] LT',\n        nextDay: '[I morgon klokka] LT',\n        nextWeek: 'dddd [klokka] LT',\n        lastDay: '[I går klokka] LT',\n        lastWeek: '[Føregåande] dddd [klokka] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s sidan',\n        s : 'nokre sekund',\n        ss : '%d sekund',\n        m : 'eit minutt',\n        mm : '%d minutt',\n        h : 'ein time',\n        hh : '%d timar',\n        d : 'ein dag',\n        dd : '%d dagar',\n        M : 'ein månad',\n        MM : '%d månader',\n        y : 'eit år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nn;\n\n})));\n\n\n/***/ }),\n/* 455 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '੧',\n    '2': '੨',\n    '3': '੩',\n    '4': '੪',\n    '5': '੫',\n    '6': '੬',\n    '7': '੭',\n    '8': '੮',\n    '9': '੯',\n    '0': '੦'\n},\nnumberMap = {\n    '੧': '1',\n    '੨': '2',\n    '੩': '3',\n    '੪': '4',\n    '੫': '5',\n    '੬': '6',\n    '੭': '7',\n    '੮': '8',\n    '੯': '9',\n    '੦': '0'\n};\n\nvar paIn = moment.defineLocale('pa-in', {\n    // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.\n    months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),\n    weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm ਵਜੇ',\n        LTS : 'A h:mm:ss ਵਜੇ',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'\n    },\n    calendar : {\n        sameDay : '[ਅਜ] LT',\n        nextDay : '[ਕਲ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ਕਲ] LT',\n        lastWeek : '[ਪਿਛਲੇ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ਵਿੱਚ',\n        past : '%s ਪਿਛਲੇ',\n        s : 'ਕੁਝ ਸਕਿੰਟ',\n        ss : '%d ਸਕਿੰਟ',\n        m : 'ਇਕ ਮਿੰਟ',\n        mm : '%d ਮਿੰਟ',\n        h : 'ਇੱਕ ਘੰਟਾ',\n        hh : '%d ਘੰਟੇ',\n        d : 'ਇੱਕ ਦਿਨ',\n        dd : '%d ਦਿਨ',\n        M : 'ਇੱਕ ਮਹੀਨਾ',\n        MM : '%d ਮਹੀਨੇ',\n        y : 'ਇੱਕ ਸਾਲ',\n        yy : '%d ਸਾਲ'\n    },\n    preparse: function (string) {\n        return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n    meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ਰਾਤ') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ਸਵੇਰ') {\n            return hour;\n        } else if (meridiem === 'ਦੁਪਹਿਰ') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'ਸ਼ਾਮ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ਰਾਤ';\n        } else if (hour < 10) {\n            return 'ਸਵੇਰ';\n        } else if (hour < 17) {\n            return 'ਦੁਪਹਿਰ';\n        } else if (hour < 20) {\n            return 'ਸ਼ਾਮ';\n        } else {\n            return 'ਰਾਤ';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn paIn;\n\n})));\n\n\n/***/ }),\n/* 456 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),\n    monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');\nfunction plural(n) {\n    return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);\n}\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            return result + (plural(number) ? 'sekundy' : 'sekund');\n        case 'm':\n            return withoutSuffix ? 'minuta' : 'minutę';\n        case 'mm':\n            return result + (plural(number) ? 'minuty' : 'minut');\n        case 'h':\n            return withoutSuffix  ? 'godzina'  : 'godzinę';\n        case 'hh':\n            return result + (plural(number) ? 'godziny' : 'godzin');\n        case 'MM':\n            return result + (plural(number) ? 'miesiące' : 'miesięcy');\n        case 'yy':\n            return result + (plural(number) ? 'lata' : 'lat');\n    }\n}\n\nvar pl = moment.defineLocale('pl', {\n    months : function (momentToFormat, format) {\n        if (!momentToFormat) {\n            return monthsNominative;\n        } else if (format === '') {\n            // Hack: if format empty we know this is used to generate\n            // RegExp by moment. Give then back both valid forms of months\n            // in RegExp ready format.\n            return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';\n        } else if (/D MMMM/.test(format)) {\n            return monthsSubjective[momentToFormat.month()];\n        } else {\n            return monthsNominative[momentToFormat.month()];\n        }\n    },\n    monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),\n    weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),\n    weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),\n    weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Dziś o] LT',\n        nextDay: '[Jutro o] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[W niedzielę o] LT';\n\n                case 2:\n                    return '[We wtorek o] LT';\n\n                case 3:\n                    return '[W środę o] LT';\n\n                case 6:\n                    return '[W sobotę o] LT';\n\n                default:\n                    return '[W] dddd [o] LT';\n            }\n        },\n        lastDay: '[Wczoraj o] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[W zeszłą niedzielę o] LT';\n                case 3:\n                    return '[W zeszłą środę o] LT';\n                case 6:\n                    return '[W zeszłą sobotę o] LT';\n                default:\n                    return '[W zeszły] dddd [o] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : '%s temu',\n        s : 'kilka sekund',\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : '1 dzień',\n        dd : '%d dni',\n        M : 'miesiąc',\n        MM : translate,\n        y : 'rok',\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn pl;\n\n})));\n\n\n/***/ }),\n/* 457 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar pt = moment.defineLocale('pt', {\n    months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n    weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY HH:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hoje às] LT',\n        nextDay: '[Amanhã às] LT',\n        nextWeek: 'dddd [às] LT',\n        lastDay: '[Ontem às] LT',\n        lastWeek: function () {\n            return (this.day() === 0 || this.day() === 6) ?\n                '[Último] dddd [às] LT' : // Saturday + Sunday\n                '[Última] dddd [às] LT'; // Monday - Friday\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'em %s',\n        past : 'há %s',\n        s : 'segundos',\n        ss : '%d segundos',\n        m : 'um minuto',\n        mm : '%d minutos',\n        h : 'uma hora',\n        hh : '%d horas',\n        d : 'um dia',\n        dd : '%d dias',\n        M : 'um mês',\n        MM : '%d meses',\n        y : 'um ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn pt;\n\n})));\n\n\n/***/ }),\n/* 458 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ptBr = moment.defineLocale('pt-br', {\n    months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n    weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hoje às] LT',\n        nextDay: '[Amanhã às] LT',\n        nextWeek: 'dddd [às] LT',\n        lastDay: '[Ontem às] LT',\n        lastWeek: function () {\n            return (this.day() === 0 || this.day() === 6) ?\n                '[Último] dddd [às] LT' : // Saturday + Sunday\n                '[Última] dddd [às] LT'; // Monday - Friday\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'em %s',\n        past : 'há %s',\n        s : 'poucos segundos',\n        ss : '%d segundos',\n        m : 'um minuto',\n        mm : '%d minutos',\n        h : 'uma hora',\n        hh : '%d horas',\n        d : 'um dia',\n        dd : '%d dias',\n        M : 'um mês',\n        MM : '%d meses',\n        y : 'um ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal : '%dº'\n});\n\nreturn ptBr;\n\n})));\n\n\n/***/ }),\n/* 459 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n            'ss': 'secunde',\n            'mm': 'minute',\n            'hh': 'ore',\n            'dd': 'zile',\n            'MM': 'luni',\n            'yy': 'ani'\n        },\n        separator = ' ';\n    if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {\n        separator = ' de ';\n    }\n    return number + separator + format[key];\n}\n\nvar ro = moment.defineLocale('ro', {\n    months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),\n    monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n    weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n    weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay: '[azi la] LT',\n        nextDay: '[mâine la] LT',\n        nextWeek: 'dddd [la] LT',\n        lastDay: '[ieri la] LT',\n        lastWeek: '[fosta] dddd [la] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'peste %s',\n        past : '%s în urmă',\n        s : 'câteva secunde',\n        ss : relativeTimeWithPlural,\n        m : 'un minut',\n        mm : relativeTimeWithPlural,\n        h : 'o oră',\n        hh : relativeTimeWithPlural,\n        d : 'o zi',\n        dd : relativeTimeWithPlural,\n        M : 'o lună',\n        MM : relativeTimeWithPlural,\n        y : 'un an',\n        yy : relativeTimeWithPlural\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ro;\n\n})));\n\n\n/***/ }),\n/* 460 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n        'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',\n        'hh': 'час_часа_часов',\n        'dd': 'день_дня_дней',\n        'MM': 'месяц_месяца_месяцев',\n        'yy': 'год_года_лет'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'минута' : 'минуту';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\nvar monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];\n\n// http://new.gramota.ru/spravka/rules/139-prop : § 103\n// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637\n// CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753\nvar ru = moment.defineLocale('ru', {\n    months : {\n        format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),\n        standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')\n    },\n    monthsShort : {\n        // по CLDR именно \"июл.\" и \"июн.\", но какой смысл менять букву на точку ?\n        format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),\n        standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')\n    },\n    weekdays : {\n        standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),\n        format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),\n        isFormat: /\\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\\] ?dddd/\n    },\n    weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки\n    monthsRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n    // копия предыдущего\n    monthsShortRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n    // полные названия с падежами\n    monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,\n\n    // Выражение, которое соотвествует только сокращённым формам\n    monthsShortStrictRegex: /^(янв\\.|февр?\\.|мар[т.]|апр\\.|ма[яй]|июн[ья.]|июл[ья.]|авг\\.|сент?\\.|окт\\.|нояб?\\.|дек\\.)/i,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY г.',\n        LLL : 'D MMMM YYYY г., H:mm',\n        LLLL : 'dddd, D MMMM YYYY г., H:mm'\n    },\n    calendar : {\n        sameDay: '[Сегодня в] LT',\n        nextDay: '[Завтра в] LT',\n        lastDay: '[Вчера в] LT',\n        nextWeek: function (now) {\n            if (now.week() !== this.week()) {\n                switch (this.day()) {\n                    case 0:\n                        return '[В следующее] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[В следующий] dddd [в] LT';\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[В следующую] dddd [в] LT';\n                }\n            } else {\n                if (this.day() === 2) {\n                    return '[Во] dddd [в] LT';\n                } else {\n                    return '[В] dddd [в] LT';\n                }\n            }\n        },\n        lastWeek: function (now) {\n            if (now.week() !== this.week()) {\n                switch (this.day()) {\n                    case 0:\n                        return '[В прошлое] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[В прошлый] dddd [в] LT';\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[В прошлую] dddd [в] LT';\n                }\n            } else {\n                if (this.day() === 2) {\n                    return '[Во] dddd [в] LT';\n                } else {\n                    return '[В] dddd [в] LT';\n                }\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'через %s',\n        past : '%s назад',\n        s : 'несколько секунд',\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : 'час',\n        hh : relativeTimeWithPlural,\n        d : 'день',\n        dd : relativeTimeWithPlural,\n        M : 'месяц',\n        MM : relativeTimeWithPlural,\n        y : 'год',\n        yy : relativeTimeWithPlural\n    },\n    meridiemParse: /ночи|утра|дня|вечера/i,\n    isPM : function (input) {\n        return /^(дня|вечера)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночи';\n        } else if (hour < 12) {\n            return 'утра';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечера';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го|я)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n                return number + '-й';\n            case 'D':\n                return number + '-го';\n            case 'w':\n            case 'W':\n                return number + '-я';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ru;\n\n})));\n\n\n/***/ }),\n/* 461 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'جنوري',\n    'فيبروري',\n    'مارچ',\n    'اپريل',\n    'مئي',\n    'جون',\n    'جولاءِ',\n    'آگسٽ',\n    'سيپٽمبر',\n    'آڪٽوبر',\n    'نومبر',\n    'ڊسمبر'\n];\nvar days = [\n    'آچر',\n    'سومر',\n    'اڱارو',\n    'اربع',\n    'خميس',\n    'جمع',\n    'ڇنڇر'\n];\n\nvar sd = moment.defineLocale('sd', {\n    months : months,\n    monthsShort : months,\n    weekdays : days,\n    weekdaysShort : days,\n    weekdaysMin : days,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM : function (input) {\n        return 'شام' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'صبح';\n        }\n        return 'شام';\n    },\n    calendar : {\n        sameDay : '[اڄ] LT',\n        nextDay : '[سڀاڻي] LT',\n        nextWeek : 'dddd [اڳين هفتي تي] LT',\n        lastDay : '[ڪالهه] LT',\n        lastWeek : '[گزريل هفتي] dddd [تي] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s پوء',\n        past : '%s اڳ',\n        s : 'چند سيڪنڊ',\n        ss : '%d سيڪنڊ',\n        m : 'هڪ منٽ',\n        mm : '%d منٽ',\n        h : 'هڪ ڪلاڪ',\n        hh : '%d ڪلاڪ',\n        d : 'هڪ ڏينهن',\n        dd : '%d ڏينهن',\n        M : 'هڪ مهينو',\n        MM : '%d مهينا',\n        y : 'هڪ سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sd;\n\n})));\n\n\n/***/ }),\n/* 462 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar se = moment.defineLocale('se', {\n    months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),\n    monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n    weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),\n    weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n    weekdaysMin : 's_v_m_g_d_b_L'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'MMMM D. [b.] YYYY',\n        LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',\n        LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[otne ti] LT',\n        nextDay: '[ihttin ti] LT',\n        nextWeek: 'dddd [ti] LT',\n        lastDay: '[ikte ti] LT',\n        lastWeek: '[ovddit] dddd [ti] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s geažes',\n        past : 'maŋit %s',\n        s : 'moadde sekunddat',\n        ss: '%d sekunddat',\n        m : 'okta minuhta',\n        mm : '%d minuhtat',\n        h : 'okta diimmu',\n        hh : '%d diimmut',\n        d : 'okta beaivi',\n        dd : '%d beaivvit',\n        M : 'okta mánnu',\n        MM : '%d mánut',\n        y : 'okta jahki',\n        yy : '%d jagit'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn se;\n\n})));\n\n\n/***/ }),\n/* 463 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\n/*jshint -W100*/\nvar si = moment.defineLocale('si', {\n    months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),\n    monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),\n    weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),\n    weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n    weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'a h:mm',\n        LTS : 'a h:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY MMMM D',\n        LLL : 'YYYY MMMM D, a h:mm',\n        LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'\n    },\n    calendar : {\n        sameDay : '[අද] LT[ට]',\n        nextDay : '[හෙට] LT[ට]',\n        nextWeek : 'dddd LT[ට]',\n        lastDay : '[ඊයේ] LT[ට]',\n        lastWeek : '[පසුගිය] dddd LT[ට]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%sකින්',\n        past : '%sකට පෙර',\n        s : 'තත්පර කිහිපය',\n        ss : 'තත්පර %d',\n        m : 'මිනිත්තුව',\n        mm : 'මිනිත්තු %d',\n        h : 'පැය',\n        hh : 'පැය %d',\n        d : 'දිනය',\n        dd : 'දින %d',\n        M : 'මාසය',\n        MM : 'මාස %d',\n        y : 'වසර',\n        yy : 'වසර %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n    ordinal : function (number) {\n        return number + ' වැනි';\n    },\n    meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n    isPM : function (input) {\n        return input === 'ප.ව.' || input === 'පස් වරු';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'ප.ව.' : 'පස් වරු';\n        } else {\n            return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n        }\n    }\n});\n\nreturn si;\n\n})));\n\n\n/***/ }),\n/* 464 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),\n    monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\nfunction plural(n) {\n    return (n > 1) && (n < 5);\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':  // a few seconds / in a few seconds / a few seconds ago\n            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';\n        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'sekundy' : 'sekúnd');\n            } else {\n                return result + 'sekundami';\n            }\n            break;\n        case 'm':  // a minute / in a minute / a minute ago\n            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');\n        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'minúty' : 'minút');\n            } else {\n                return result + 'minútami';\n            }\n            break;\n        case 'h':  // an hour / in an hour / an hour ago\n            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');\n        case 'hh': // 9 hours / in 9 hours / 9 hours ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'hodiny' : 'hodín');\n            } else {\n                return result + 'hodinami';\n            }\n            break;\n        case 'd':  // a day / in a day / a day ago\n            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';\n        case 'dd': // 9 days / in 9 days / 9 days ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'dni' : 'dní');\n            } else {\n                return result + 'dňami';\n            }\n            break;\n        case 'M':  // a month / in a month / a month ago\n            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';\n        case 'MM': // 9 months / in 9 months / 9 months ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'mesiace' : 'mesiacov');\n            } else {\n                return result + 'mesiacmi';\n            }\n            break;\n        case 'y':  // a year / in a year / a year ago\n            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';\n        case 'yy': // 9 years / in 9 years / 9 years ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'roky' : 'rokov');\n            } else {\n                return result + 'rokmi';\n            }\n            break;\n    }\n}\n\nvar sk = moment.defineLocale('sk', {\n    months : months,\n    monthsShort : monthsShort,\n    weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n    weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),\n    weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),\n    longDateFormat : {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay: '[dnes o] LT',\n        nextDay: '[zajtra o] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v nedeľu o] LT';\n                case 1:\n                case 2:\n                    return '[v] dddd [o] LT';\n                case 3:\n                    return '[v stredu o] LT';\n                case 4:\n                    return '[vo štvrtok o] LT';\n                case 5:\n                    return '[v piatok o] LT';\n                case 6:\n                    return '[v sobotu o] LT';\n            }\n        },\n        lastDay: '[včera o] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[minulú nedeľu o] LT';\n                case 1:\n                case 2:\n                    return '[minulý] dddd [o] LT';\n                case 3:\n                    return '[minulú stredu o] LT';\n                case 4:\n                case 5:\n                    return '[minulý] dddd [o] LT';\n                case 6:\n                    return '[minulú sobotu o] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : 'pred %s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sk;\n\n})));\n\n\n/***/ }),\n/* 465 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':\n            return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';\n        case 'ss':\n            if (number === 1) {\n                result += withoutSuffix ? 'sekundo' : 'sekundi';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n            } else {\n                result += withoutSuffix || isFuture ? 'sekund' : 'sekund';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'ena minuta' : 'eno minuto';\n        case 'mm':\n            if (number === 1) {\n                result += withoutSuffix ? 'minuta' : 'minuto';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n            } else {\n                result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'ena ura' : 'eno uro';\n        case 'hh':\n            if (number === 1) {\n                result += withoutSuffix ? 'ura' : 'uro';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'uri' : 'urama';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'ure' : 'urami';\n            } else {\n                result += withoutSuffix || isFuture ? 'ur' : 'urami';\n            }\n            return result;\n        case 'd':\n            return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n        case 'dd':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n            } else {\n                result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n            }\n            return result;\n        case 'M':\n            return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n        case 'MM':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n            } else {\n                result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n            }\n            return result;\n        case 'y':\n            return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n        case 'yy':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'leto' : 'letom';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'leta' : 'leti';\n            } else {\n                result += withoutSuffix || isFuture ? 'let' : 'leti';\n            }\n            return result;\n    }\n}\n\nvar sl = moment.defineLocale('sl', {\n    months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n    weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n    weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danes ob] LT',\n        nextDay  : '[jutri ob] LT',\n\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v] [nedeljo] [ob] LT';\n                case 3:\n                    return '[v] [sredo] [ob] LT';\n                case 6:\n                    return '[v] [soboto] [ob] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[v] dddd [ob] LT';\n            }\n        },\n        lastDay  : '[včeraj ob] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[prejšnjo] [nedeljo] [ob] LT';\n                case 3:\n                    return '[prejšnjo] [sredo] [ob] LT';\n                case 6:\n                    return '[prejšnjo] [soboto] [ob] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prejšnji] dddd [ob] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'čez %s',\n        past   : 'pred %s',\n        s      : processRelativeTime,\n        ss     : processRelativeTime,\n        m      : processRelativeTime,\n        mm     : processRelativeTime,\n        h      : processRelativeTime,\n        hh     : processRelativeTime,\n        d      : processRelativeTime,\n        dd     : processRelativeTime,\n        M      : processRelativeTime,\n        MM     : processRelativeTime,\n        y      : processRelativeTime,\n        yy     : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sl;\n\n})));\n\n\n/***/ }),\n/* 466 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sq = moment.defineLocale('sq', {\n    months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),\n    monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),\n    weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),\n    weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),\n    weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),\n    weekdaysParseExact : true,\n    meridiemParse: /PD|MD/,\n    isPM: function (input) {\n        return input.charAt(0) === 'M';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        return hours < 12 ? 'PD' : 'MD';\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Sot në] LT',\n        nextDay : '[Nesër në] LT',\n        nextWeek : 'dddd [në] LT',\n        lastDay : '[Dje në] LT',\n        lastWeek : 'dddd [e kaluar në] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'në %s',\n        past : '%s më parë',\n        s : 'disa sekonda',\n        ss : '%d sekonda',\n        m : 'një minutë',\n        mm : '%d minuta',\n        h : 'një orë',\n        hh : '%d orë',\n        d : 'një ditë',\n        dd : '%d ditë',\n        M : 'një muaj',\n        MM : '%d muaj',\n        y : 'një vit',\n        yy : '%d vite'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sq;\n\n})));\n\n\n/***/ }),\n/* 467 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['sekunda', 'sekunde', 'sekundi'],\n        m: ['jedan minut', 'jedne minute'],\n        mm: ['minut', 'minute', 'minuta'],\n        h: ['jedan sat', 'jednog sata'],\n        hh: ['sat', 'sata', 'sati'],\n        dd: ['dan', 'dana', 'dana'],\n        MM: ['mesec', 'meseca', 'meseci'],\n        yy: ['godina', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar sr = moment.defineLocale('sr', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[danas u] LT',\n        nextDay: '[sutra u] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedelju] [u] LT';\n                case 3:\n                    return '[u] [sredu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[juče u] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[prošle] [nedelje] [u] LT',\n                '[prošlog] [ponedeljka] [u] LT',\n                '[prošlog] [utorka] [u] LT',\n                '[prošle] [srede] [u] LT',\n                '[prošlog] [četvrtka] [u] LT',\n                '[prošlog] [petka] [u] LT',\n                '[prošle] [subote] [u] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'pre %s',\n        s      : 'nekoliko sekundi',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'dan',\n        dd     : translator.translate,\n        M      : 'mesec',\n        MM     : translator.translate,\n        y      : 'godinu',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sr;\n\n})));\n\n\n/***/ }),\n/* 468 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['секунда', 'секунде', 'секунди'],\n        m: ['један минут', 'једне минуте'],\n        mm: ['минут', 'минуте', 'минута'],\n        h: ['један сат', 'једног сата'],\n        hh: ['сат', 'сата', 'сати'],\n        dd: ['дан', 'дана', 'дана'],\n        MM: ['месец', 'месеца', 'месеци'],\n        yy: ['година', 'године', 'година']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar srCyrl = moment.defineLocale('sr-cyrl', {\n    months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),\n    monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n    weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n    weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[данас у] LT',\n        nextDay: '[сутра у] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[у] [недељу] [у] LT';\n                case 3:\n                    return '[у] [среду] [у] LT';\n                case 6:\n                    return '[у] [суботу] [у] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[у] dddd [у] LT';\n            }\n        },\n        lastDay  : '[јуче у] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[прошле] [недеље] [у] LT',\n                '[прошлог] [понедељка] [у] LT',\n                '[прошлог] [уторка] [у] LT',\n                '[прошле] [среде] [у] LT',\n                '[прошлог] [четвртка] [у] LT',\n                '[прошлог] [петка] [у] LT',\n                '[прошле] [суботе] [у] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'за %s',\n        past   : 'пре %s',\n        s      : 'неколико секунди',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'дан',\n        dd     : translator.translate,\n        M      : 'месец',\n        MM     : translator.translate,\n        y      : 'годину',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn srCyrl;\n\n})));\n\n\n/***/ }),\n/* 469 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ss = moment.defineLocale('ss', {\n    months : \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split('_'),\n    monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n    weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),\n    weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n    weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Namuhla nga] LT',\n        nextDay : '[Kusasa nga] LT',\n        nextWeek : 'dddd [nga] LT',\n        lastDay : '[Itolo nga] LT',\n        lastWeek : 'dddd [leliphelile] [nga] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'nga %s',\n        past : 'wenteka nga %s',\n        s : 'emizuzwana lomcane',\n        ss : '%d mzuzwana',\n        m : 'umzuzu',\n        mm : '%d emizuzu',\n        h : 'lihora',\n        hh : '%d emahora',\n        d : 'lilanga',\n        dd : '%d emalanga',\n        M : 'inyanga',\n        MM : '%d tinyanga',\n        y : 'umnyaka',\n        yy : '%d iminyaka'\n    },\n    meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'ekuseni';\n        } else if (hours < 15) {\n            return 'emini';\n        } else if (hours < 19) {\n            return 'entsambama';\n        } else {\n            return 'ebusuku';\n        }\n    },\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ekuseni') {\n            return hour;\n        } else if (meridiem === 'emini') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n            if (hour === 0) {\n                return 0;\n            }\n            return hour + 12;\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : '%d',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ss;\n\n})));\n\n\n/***/ }),\n/* 470 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sv = moment.defineLocale('sv', {\n    months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n    weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n    weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [kl.] HH:mm',\n        LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Idag] LT',\n        nextDay: '[Imorgon] LT',\n        lastDay: '[Igår] LT',\n        nextWeek: '[På] dddd LT',\n        lastWeek: '[I] dddd[s] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : 'för %s sedan',\n        s : 'några sekunder',\n        ss : '%d sekunder',\n        m : 'en minut',\n        mm : '%d minuter',\n        h : 'en timme',\n        hh : '%d timmar',\n        d : 'en dag',\n        dd : '%d dagar',\n        M : 'en månad',\n        MM : '%d månader',\n        y : 'ett år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(e|a)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'e' :\n            (b === 1) ? 'a' :\n            (b === 2) ? 'a' :\n            (b === 3) ? 'e' : 'e';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sv;\n\n})));\n\n\n/***/ }),\n/* 471 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sw = moment.defineLocale('sw', {\n    months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),\n    weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n    weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[leo saa] LT',\n        nextDay : '[kesho saa] LT',\n        nextWeek : '[wiki ijayo] dddd [saat] LT',\n        lastDay : '[jana] LT',\n        lastWeek : '[wiki iliyopita] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s baadaye',\n        past : 'tokea %s',\n        s : 'hivi punde',\n        ss : 'sekunde %d',\n        m : 'dakika moja',\n        mm : 'dakika %d',\n        h : 'saa limoja',\n        hh : 'masaa %d',\n        d : 'siku moja',\n        dd : 'masiku %d',\n        M : 'mwezi mmoja',\n        MM : 'miezi %d',\n        y : 'mwaka mmoja',\n        yy : 'miaka %d'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sw;\n\n})));\n\n\n/***/ }),\n/* 472 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '௧',\n    '2': '௨',\n    '3': '௩',\n    '4': '௪',\n    '5': '௫',\n    '6': '௬',\n    '7': '௭',\n    '8': '௮',\n    '9': '௯',\n    '0': '௦'\n}, numberMap = {\n    '௧': '1',\n    '௨': '2',\n    '௩': '3',\n    '௪': '4',\n    '௫': '5',\n    '௬': '6',\n    '௭': '7',\n    '௮': '8',\n    '௯': '9',\n    '௦': '0'\n};\n\nvar ta = moment.defineLocale('ta', {\n    months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),\n    weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),\n    weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, HH:mm',\n        LLLL : 'dddd, D MMMM YYYY, HH:mm'\n    },\n    calendar : {\n        sameDay : '[இன்று] LT',\n        nextDay : '[நாளை] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[நேற்று] LT',\n        lastWeek : '[கடந்த வாரம்] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s இல்',\n        past : '%s முன்',\n        s : 'ஒரு சில விநாடிகள்',\n        ss : '%d விநாடிகள்',\n        m : 'ஒரு நிமிடம்',\n        mm : '%d நிமிடங்கள்',\n        h : 'ஒரு மணி நேரம்',\n        hh : '%d மணி நேரம்',\n        d : 'ஒரு நாள்',\n        dd : '%d நாட்கள்',\n        M : 'ஒரு மாதம்',\n        MM : '%d மாதங்கள்',\n        y : 'ஒரு வருடம்',\n        yy : '%d ஆண்டுகள்'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n    ordinal : function (number) {\n        return number + 'வது';\n    },\n    preparse: function (string) {\n        return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // refer http://ta.wikipedia.org/s/1er1\n    meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 2) {\n            return ' யாமம்';\n        } else if (hour < 6) {\n            return ' வைகறை';  // வைகறை\n        } else if (hour < 10) {\n            return ' காலை'; // காலை\n        } else if (hour < 14) {\n            return ' நண்பகல்'; // நண்பகல்\n        } else if (hour < 18) {\n            return ' எற்பாடு'; // எற்பாடு\n        } else if (hour < 22) {\n            return ' மாலை'; // மாலை\n        } else {\n            return ' யாமம்';\n        }\n    },\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'யாமம்') {\n            return hour < 2 ? hour : hour + 12;\n        } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n            return hour;\n        } else if (meridiem === 'நண்பகல்') {\n            return hour >= 10 ? hour : hour + 12;\n        } else {\n            return hour + 12;\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ta;\n\n})));\n\n\n/***/ }),\n/* 473 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar te = moment.defineLocale('te', {\n    months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),\n    monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),\n    weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n    weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[నేడు] LT',\n        nextDay : '[రేపు] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[నిన్న] LT',\n        lastWeek : '[గత] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s లో',\n        past : '%s క్రితం',\n        s : 'కొన్ని క్షణాలు',\n        ss : '%d సెకన్లు',\n        m : 'ఒక నిమిషం',\n        mm : '%d నిమిషాలు',\n        h : 'ఒక గంట',\n        hh : '%d గంటలు',\n        d : 'ఒక రోజు',\n        dd : '%d రోజులు',\n        M : 'ఒక నెల',\n        MM : '%d నెలలు',\n        y : 'ఒక సంవత్సరం',\n        yy : '%d సంవత్సరాలు'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}వ/,\n    ordinal : '%dవ',\n    meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'రాత్రి') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ఉదయం') {\n            return hour;\n        } else if (meridiem === 'మధ్యాహ్నం') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'సాయంత్రం') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'రాత్రి';\n        } else if (hour < 10) {\n            return 'ఉదయం';\n        } else if (hour < 17) {\n            return 'మధ్యాహ్నం';\n        } else if (hour < 20) {\n            return 'సాయంత్రం';\n        } else {\n            return 'రాత్రి';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn te;\n\n})));\n\n\n/***/ }),\n/* 474 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tet = moment.defineLocale('tet', {\n    months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),\n    monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n    weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n    weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Ohin iha] LT',\n        nextDay: '[Aban iha] LT',\n        nextWeek: 'dddd [iha] LT',\n        lastDay: '[Horiseik iha] LT',\n        lastWeek: 'dddd [semana kotuk] [iha] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'iha %s',\n        past : '%s liuba',\n        s : 'minutu balun',\n        ss : 'minutu %d',\n        m : 'minutu ida',\n        mm : 'minutu %d',\n        h : 'oras ida',\n        hh : 'oras %d',\n        d : 'loron ida',\n        dd : 'loron %d',\n        M : 'fulan ida',\n        MM : 'fulan %d',\n        y : 'tinan ida',\n        yy : 'tinan %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tet;\n\n})));\n\n\n/***/ }),\n/* 475 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-ум',\n    1: '-ум',\n    2: '-юм',\n    3: '-юм',\n    4: '-ум',\n    5: '-ум',\n    6: '-ум',\n    7: '-ум',\n    8: '-ум',\n    9: '-ум',\n    10: '-ум',\n    12: '-ум',\n    13: '-ум',\n    20: '-ум',\n    30: '-юм',\n    40: '-ум',\n    50: '-ум',\n    60: '-ум',\n    70: '-ум',\n    80: '-ум',\n    90: '-ум',\n    100: '-ум'\n};\n\nvar tg = moment.defineLocale('tg', {\n    months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),\n    monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'),\n    weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),\n    weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Имрӯз соати] LT',\n        nextDay : '[Пагоҳ соати] LT',\n        lastDay : '[Дирӯз соати] LT',\n        nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT',\n        lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'баъди %s',\n        past : '%s пеш',\n        s : 'якчанд сония',\n        m : 'як дақиқа',\n        mm : '%d дақиқа',\n        h : 'як соат',\n        hh : '%d соат',\n        d : 'як рӯз',\n        dd : '%d рӯз',\n        M : 'як моҳ',\n        MM : '%d моҳ',\n        y : 'як сол',\n        yy : '%d сол'\n    },\n    meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'шаб') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'субҳ') {\n            return hour;\n        } else if (meridiem === 'рӯз') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'бегоҳ') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'шаб';\n        } else if (hour < 11) {\n            return 'субҳ';\n        } else if (hour < 16) {\n            return 'рӯз';\n        } else if (hour < 19) {\n            return 'бегоҳ';\n        } else {\n            return 'шаб';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ум|юм)/,\n    ordinal: function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1th is the first week of the year.\n    }\n});\n\nreturn tg;\n\n})));\n\n\n/***/ }),\n/* 476 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar th = moment.defineLocale('th', {\n    months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),\n    monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n    weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference\n    weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY เวลา H:mm',\n        LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'\n    },\n    meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n    isPM: function (input) {\n        return input === 'หลังเที่ยง';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ก่อนเที่ยง';\n        } else {\n            return 'หลังเที่ยง';\n        }\n    },\n    calendar : {\n        sameDay : '[วันนี้ เวลา] LT',\n        nextDay : '[พรุ่งนี้ เวลา] LT',\n        nextWeek : 'dddd[หน้า เวลา] LT',\n        lastDay : '[เมื่อวานนี้ เวลา] LT',\n        lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'อีก %s',\n        past : '%sที่แล้ว',\n        s : 'ไม่กี่วินาที',\n        ss : '%d วินาที',\n        m : '1 นาที',\n        mm : '%d นาที',\n        h : '1 ชั่วโมง',\n        hh : '%d ชั่วโมง',\n        d : '1 วัน',\n        dd : '%d วัน',\n        M : '1 เดือน',\n        MM : '%d เดือน',\n        y : '1 ปี',\n        yy : '%d ปี'\n    }\n});\n\nreturn th;\n\n})));\n\n\n/***/ }),\n/* 477 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tlPh = moment.defineLocale('tl-ph', {\n    months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),\n    monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n    weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),\n    weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n    weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'MM/D/YYYY',\n        LL : 'MMMM D, YYYY',\n        LLL : 'MMMM D, YYYY HH:mm',\n        LLLL : 'dddd, MMMM DD, YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: 'LT [ngayong araw]',\n        nextDay: '[Bukas ng] LT',\n        nextWeek: 'LT [sa susunod na] dddd',\n        lastDay: 'LT [kahapon]',\n        lastWeek: 'LT [noong nakaraang] dddd',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'sa loob ng %s',\n        past : '%s ang nakalipas',\n        s : 'ilang segundo',\n        ss : '%d segundo',\n        m : 'isang minuto',\n        mm : '%d minuto',\n        h : 'isang oras',\n        hh : '%d oras',\n        d : 'isang araw',\n        dd : '%d araw',\n        M : 'isang buwan',\n        MM : '%d buwan',\n        y : 'isang taon',\n        yy : '%d taon'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : function (number) {\n        return number;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tlPh;\n\n})));\n\n\n/***/ }),\n/* 478 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\nfunction translateFuture(output) {\n    var time = output;\n    time = (output.indexOf('jaj') !== -1) ?\n    time.slice(0, -3) + 'leS' :\n    (output.indexOf('jar') !== -1) ?\n    time.slice(0, -3) + 'waQ' :\n    (output.indexOf('DIS') !== -1) ?\n    time.slice(0, -3) + 'nem' :\n    time + ' pIq';\n    return time;\n}\n\nfunction translatePast(output) {\n    var time = output;\n    time = (output.indexOf('jaj') !== -1) ?\n    time.slice(0, -3) + 'Hu’' :\n    (output.indexOf('jar') !== -1) ?\n    time.slice(0, -3) + 'wen' :\n    (output.indexOf('DIS') !== -1) ?\n    time.slice(0, -3) + 'ben' :\n    time + ' ret';\n    return time;\n}\n\nfunction translate(number, withoutSuffix, string, isFuture) {\n    var numberNoun = numberAsNoun(number);\n    switch (string) {\n        case 'ss':\n            return numberNoun + ' lup';\n        case 'mm':\n            return numberNoun + ' tup';\n        case 'hh':\n            return numberNoun + ' rep';\n        case 'dd':\n            return numberNoun + ' jaj';\n        case 'MM':\n            return numberNoun + ' jar';\n        case 'yy':\n            return numberNoun + ' DIS';\n    }\n}\n\nfunction numberAsNoun(number) {\n    var hundred = Math.floor((number % 1000) / 100),\n    ten = Math.floor((number % 100) / 10),\n    one = number % 10,\n    word = '';\n    if (hundred > 0) {\n        word += numbersNouns[hundred] + 'vatlh';\n    }\n    if (ten > 0) {\n        word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';\n    }\n    if (one > 0) {\n        word += ((word !== '') ? ' ' : '') + numbersNouns[one];\n    }\n    return (word === '') ? 'pagh' : word;\n}\n\nvar tlh = moment.defineLocale('tlh', {\n    months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),\n    monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[DaHjaj] LT',\n        nextDay: '[wa’leS] LT',\n        nextWeek: 'LLL',\n        lastDay: '[wa’Hu’] LT',\n        lastWeek: 'LLL',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : translateFuture,\n        past : translatePast,\n        s : 'puS lup',\n        ss : translate,\n        m : 'wa’ tup',\n        mm : translate,\n        h : 'wa’ rep',\n        hh : translate,\n        d : 'wa’ jaj',\n        dd : translate,\n        M : 'wa’ jar',\n        MM : translate,\n        y : 'wa’ DIS',\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tlh;\n\n})));\n\n\n/***/ }),\n/* 479 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\nvar suffixes = {\n    1: '\\'inci',\n    5: '\\'inci',\n    8: '\\'inci',\n    70: '\\'inci',\n    80: '\\'inci',\n    2: '\\'nci',\n    7: '\\'nci',\n    20: '\\'nci',\n    50: '\\'nci',\n    3: '\\'üncü',\n    4: '\\'üncü',\n    100: '\\'üncü',\n    6: '\\'ncı',\n    9: '\\'uncu',\n    10: '\\'uncu',\n    30: '\\'uncu',\n    60: '\\'ıncı',\n    90: '\\'ıncı'\n};\n\nvar tr = moment.defineLocale('tr', {\n    months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),\n    monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),\n    weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),\n    weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),\n    weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[bugün saat] LT',\n        nextDay : '[yarın saat] LT',\n        nextWeek : '[gelecek] dddd [saat] LT',\n        lastDay : '[dün] LT',\n        lastWeek : '[geçen] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s sonra',\n        past : '%s önce',\n        s : 'birkaç saniye',\n        ss : '%d saniye',\n        m : 'bir dakika',\n        mm : '%d dakika',\n        h : 'bir saat',\n        hh : '%d saat',\n        d : 'bir gün',\n        dd : '%d gün',\n        M : 'bir ay',\n        MM : '%d ay',\n        y : 'bir yıl',\n        yy : '%d yıl'\n    },\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'Do':\n            case 'DD':\n                return number;\n            default:\n                if (number === 0) {  // special case for zero\n                    return number + '\\'ıncı';\n                }\n                var a = number % 10,\n                    b = number % 100 - a,\n                    c = number >= 100 ? 100 : null;\n                return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tr;\n\n})));\n\n\n/***/ }),\n/* 480 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\n// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.\n// This is currently too difficult (maybe even impossible) to add.\nvar tzl = moment.defineLocale('tzl', {\n    months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),\n    monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),\n    weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),\n    weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),\n    weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM [dallas] YYYY',\n        LLL : 'D. MMMM [dallas] YYYY HH.mm',\n        LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'\n    },\n    meridiemParse: /d\\'o|d\\'a/i,\n    isPM : function (input) {\n        return 'd\\'o' === input.toLowerCase();\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'd\\'o' : 'D\\'O';\n        } else {\n            return isLower ? 'd\\'a' : 'D\\'A';\n        }\n    },\n    calendar : {\n        sameDay : '[oxhi à] LT',\n        nextDay : '[demà à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[ieiri à] LT',\n        lastWeek : '[sür el] dddd [lasteu à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'osprei %s',\n        past : 'ja%s',\n        s : processRelativeTime,\n        ss : processRelativeTime,\n        m : processRelativeTime,\n        mm : processRelativeTime,\n        h : processRelativeTime,\n        hh : processRelativeTime,\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's': ['viensas secunds', '\\'iensas secunds'],\n        'ss': [number + ' secunds', '' + number + ' secunds'],\n        'm': ['\\'n míut', '\\'iens míut'],\n        'mm': [number + ' míuts', '' + number + ' míuts'],\n        'h': ['\\'n þora', '\\'iensa þora'],\n        'hh': [number + ' þoras', '' + number + ' þoras'],\n        'd': ['\\'n ziua', '\\'iensa ziua'],\n        'dd': [number + ' ziuas', '' + number + ' ziuas'],\n        'M': ['\\'n mes', '\\'iens mes'],\n        'MM': [number + ' mesen', '' + number + ' mesen'],\n        'y': ['\\'n ar', '\\'iens ar'],\n        'yy': [number + ' ars', '' + number + ' ars']\n    };\n    return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);\n}\n\nreturn tzl;\n\n})));\n\n\n/***/ }),\n/* 481 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tzm = moment.defineLocale('tzm', {\n    months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',\n        nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',\n        nextWeek: 'dddd [ⴴ] LT',\n        lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',\n        lastWeek: 'dddd [ⴴ] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',\n        past : 'ⵢⴰⵏ %s',\n        s : 'ⵉⵎⵉⴽ',\n        ss : '%d ⵉⵎⵉⴽ',\n        m : 'ⵎⵉⵏⵓⴺ',\n        mm : '%d ⵎⵉⵏⵓⴺ',\n        h : 'ⵙⴰⵄⴰ',\n        hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',\n        d : 'ⴰⵙⵙ',\n        dd : '%d oⵙⵙⴰⵏ',\n        M : 'ⴰⵢoⵓⵔ',\n        MM : '%d ⵉⵢⵢⵉⵔⵏ',\n        y : 'ⴰⵙⴳⴰⵙ',\n        yy : '%d ⵉⵙⴳⴰⵙⵏ'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tzm;\n\n})));\n\n\n/***/ }),\n/* 482 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tzmLatn = moment.defineLocale('tzm-latn', {\n    months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[asdkh g] LT',\n        nextDay: '[aska g] LT',\n        nextWeek: 'dddd [g] LT',\n        lastDay: '[assant g] LT',\n        lastWeek: 'dddd [g] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'dadkh s yan %s',\n        past : 'yan %s',\n        s : 'imik',\n        ss : '%d imik',\n        m : 'minuḍ',\n        mm : '%d minuḍ',\n        h : 'saɛa',\n        hh : '%d tassaɛin',\n        d : 'ass',\n        dd : '%d ossan',\n        M : 'ayowr',\n        MM : '%d iyyirn',\n        y : 'asgas',\n        yy : '%d isgasn'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tzmLatn;\n\n})));\n\n\n/***/ }),\n/* 483 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js language configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ugCn = moment.defineLocale('ug-cn', {\n    months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n        '_'\n    ),\n    monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n        '_'\n    ),\n    weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(\n        '_'\n    ),\n    weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'YYYY-MM-DD',\n        LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n        LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n        LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm'\n    },\n    meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (\n            meridiem === 'يېرىم كېچە' ||\n            meridiem === 'سەھەر' ||\n            meridiem === 'چۈشتىن بۇرۇن'\n        ) {\n            return hour;\n        } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n            return hour + 12;\n        } else {\n            return hour >= 11 ? hour : hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return 'يېرىم كېچە';\n        } else if (hm < 900) {\n            return 'سەھەر';\n        } else if (hm < 1130) {\n            return 'چۈشتىن بۇرۇن';\n        } else if (hm < 1230) {\n            return 'چۈش';\n        } else if (hm < 1800) {\n            return 'چۈشتىن كېيىن';\n        } else {\n            return 'كەچ';\n        }\n    },\n    calendar: {\n        sameDay: '[بۈگۈن سائەت] LT',\n        nextDay: '[ئەتە سائەت] LT',\n        nextWeek: '[كېلەركى] dddd [سائەت] LT',\n        lastDay: '[تۆنۈگۈن] LT',\n        lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%s كېيىن',\n        past: '%s بۇرۇن',\n        s: 'نەچچە سېكونت',\n        ss: '%d سېكونت',\n        m: 'بىر مىنۇت',\n        mm: '%d مىنۇت',\n        h: 'بىر سائەت',\n        hh: '%d سائەت',\n        d: 'بىر كۈن',\n        dd: '%d كۈن',\n        M: 'بىر ئاي',\n        MM: '%d ئاي',\n        y: 'بىر يىل',\n        yy: '%d يىل'\n    },\n\n    dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '-كۈنى';\n            case 'w':\n            case 'W':\n                return number + '-ھەپتە';\n            default:\n                return number;\n        }\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week: {\n        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n        dow: 1, // Monday is the first day of the week.\n        doy: 7 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ugCn;\n\n})));\n\n\n/***/ }),\n/* 484 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n        'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n        'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n        'dd': 'день_дні_днів',\n        'MM': 'місяць_місяці_місяців',\n        'yy': 'рік_роки_років'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'хвилина' : 'хвилину';\n    }\n    else if (key === 'h') {\n        return withoutSuffix ? 'година' : 'годину';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\nfunction weekdaysCaseReplace(m, format) {\n    var weekdays = {\n        'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),\n        'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),\n        'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')\n    };\n\n    if (!m) {\n        return weekdays['nominative'];\n    }\n\n    var nounCase = (/(\\[[ВвУу]\\]) ?dddd/).test(format) ?\n        'accusative' :\n        ((/\\[?(?:минулої|наступної)? ?\\] ?dddd/).test(format) ?\n            'genitive' :\n            'nominative');\n    return weekdays[nounCase][m.day()];\n}\nfunction processHoursFunction(str) {\n    return function () {\n        return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n    };\n}\n\nvar uk = moment.defineLocale('uk', {\n    months : {\n        'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),\n        'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')\n    },\n    monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),\n    weekdays : weekdaysCaseReplace,\n    weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY р.',\n        LLL : 'D MMMM YYYY р., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY р., HH:mm'\n    },\n    calendar : {\n        sameDay: processHoursFunction('[Сьогодні '),\n        nextDay: processHoursFunction('[Завтра '),\n        lastDay: processHoursFunction('[Вчора '),\n        nextWeek: processHoursFunction('[У] dddd ['),\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 5:\n                case 6:\n                    return processHoursFunction('[Минулої] dddd [').call(this);\n                case 1:\n                case 2:\n                case 4:\n                    return processHoursFunction('[Минулого] dddd [').call(this);\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'за %s',\n        past : '%s тому',\n        s : 'декілька секунд',\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : 'годину',\n        hh : relativeTimeWithPlural,\n        d : 'день',\n        dd : relativeTimeWithPlural,\n        M : 'місяць',\n        MM : relativeTimeWithPlural,\n        y : 'рік',\n        yy : relativeTimeWithPlural\n    },\n    // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n    meridiemParse: /ночі|ранку|дня|вечора/,\n    isPM: function (input) {\n        return /^(дня|вечора)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночі';\n        } else if (hour < 12) {\n            return 'ранку';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечора';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n            case 'w':\n            case 'W':\n                return number + '-й';\n            case 'D':\n                return number + '-го';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn uk;\n\n})));\n\n\n/***/ }),\n/* 485 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'جنوری',\n    'فروری',\n    'مارچ',\n    'اپریل',\n    'مئی',\n    'جون',\n    'جولائی',\n    'اگست',\n    'ستمبر',\n    'اکتوبر',\n    'نومبر',\n    'دسمبر'\n];\nvar days = [\n    'اتوار',\n    'پیر',\n    'منگل',\n    'بدھ',\n    'جمعرات',\n    'جمعہ',\n    'ہفتہ'\n];\n\nvar ur = moment.defineLocale('ur', {\n    months : months,\n    monthsShort : months,\n    weekdays : days,\n    weekdaysShort : days,\n    weekdaysMin : days,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM : function (input) {\n        return 'شام' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'صبح';\n        }\n        return 'شام';\n    },\n    calendar : {\n        sameDay : '[آج بوقت] LT',\n        nextDay : '[کل بوقت] LT',\n        nextWeek : 'dddd [بوقت] LT',\n        lastDay : '[گذشتہ روز بوقت] LT',\n        lastWeek : '[گذشتہ] dddd [بوقت] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s بعد',\n        past : '%s قبل',\n        s : 'چند سیکنڈ',\n        ss : '%d سیکنڈ',\n        m : 'ایک منٹ',\n        mm : '%d منٹ',\n        h : 'ایک گھنٹہ',\n        hh : '%d گھنٹے',\n        d : 'ایک دن',\n        dd : '%d دن',\n        M : 'ایک ماہ',\n        MM : '%d ماہ',\n        y : 'ایک سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ur;\n\n})));\n\n\n/***/ }),\n/* 486 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar uz = moment.defineLocale('uz', {\n    months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),\n    monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n    weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n    weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бугун соат] LT [да]',\n        nextDay : '[Эртага] LT [да]',\n        nextWeek : 'dddd [куни соат] LT [да]',\n        lastDay : '[Кеча соат] LT [да]',\n        lastWeek : '[Утган] dddd [куни соат] LT [да]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'Якин %s ичида',\n        past : 'Бир неча %s олдин',\n        s : 'фурсат',\n        ss : '%d фурсат',\n        m : 'бир дакика',\n        mm : '%d дакика',\n        h : 'бир соат',\n        hh : '%d соат',\n        d : 'бир кун',\n        dd : '%d кун',\n        M : 'бир ой',\n        MM : '%d ой',\n        y : 'бир йил',\n        yy : '%d йил'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn uz;\n\n})));\n\n\n/***/ }),\n/* 487 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar uzLatn = moment.defineLocale('uz-latn', {\n    months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'),\n    monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),\n    weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'),\n    weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),\n    weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar : {\n        sameDay : '[Bugun soat] LT [da]',\n        nextDay : '[Ertaga] LT [da]',\n        nextWeek : 'dddd [kuni soat] LT [da]',\n        lastDay : '[Kecha soat] LT [da]',\n        lastWeek : '[O\\'tgan] dddd [kuni soat] LT [da]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'Yaqin %s ichida',\n        past : 'Bir necha %s oldin',\n        s : 'soniya',\n        ss : '%d soniya',\n        m : 'bir daqiqa',\n        mm : '%d daqiqa',\n        h : 'bir soat',\n        hh : '%d soat',\n        d : 'bir kun',\n        dd : '%d kun',\n        M : 'bir oy',\n        MM : '%d oy',\n        y : 'bir yil',\n        yy : '%d yil'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn uzLatn;\n\n})));\n\n\n/***/ }),\n/* 488 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar vi = moment.defineLocale('vi', {\n    months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),\n    monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),\n    weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysParseExact : true,\n    meridiemParse: /sa|ch/i,\n    isPM : function (input) {\n        return /^ch$/i.test(input);\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower ? 'sa' : 'SA';\n        } else {\n            return isLower ? 'ch' : 'CH';\n        }\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM [năm] YYYY',\n        LLL : 'D MMMM [năm] YYYY HH:mm',\n        LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',\n        l : 'DD/M/YYYY',\n        ll : 'D MMM YYYY',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hôm nay lúc] LT',\n        nextDay: '[Ngày mai lúc] LT',\n        nextWeek: 'dddd [tuần tới lúc] LT',\n        lastDay: '[Hôm qua lúc] LT',\n        lastWeek: 'dddd [tuần rồi lúc] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s tới',\n        past : '%s trước',\n        s : 'vài giây',\n        ss : '%d giây' ,\n        m : 'một phút',\n        mm : '%d phút',\n        h : 'một giờ',\n        hh : '%d giờ',\n        d : 'một ngày',\n        dd : '%d ngày',\n        M : 'một tháng',\n        MM : '%d tháng',\n        y : 'một năm',\n        yy : '%d năm'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : function (number) {\n        return number;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn vi;\n\n})));\n\n\n/***/ }),\n/* 489 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar xPseudo = moment.defineLocale('x-pseudo', {\n    months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),\n    monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),\n    weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n    weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[T~ódá~ý át] LT',\n        nextDay : '[T~ómó~rró~w át] LT',\n        nextWeek : 'dddd [át] LT',\n        lastDay : '[Ý~ést~érdá~ý át] LT',\n        lastWeek : '[L~ást] dddd [át] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'í~ñ %s',\n        past : '%s á~gó',\n        s : 'á ~féw ~sécó~ñds',\n        ss : '%d s~écóñ~ds',\n        m : 'á ~míñ~úté',\n        mm : '%d m~íñú~tés',\n        h : 'á~ñ hó~úr',\n        hh : '%d h~óúrs',\n        d : 'á ~dáý',\n        dd : '%d d~áýs',\n        M : 'á ~móñ~th',\n        MM : '%d m~óñt~hs',\n        y : 'á ~ýéár',\n        yy : '%d ý~éárs'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn xPseudo;\n\n})));\n\n\n/***/ }),\n/* 490 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar yo = moment.defineLocale('yo', {\n    months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),\n    monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),\n    weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),\n    weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),\n    weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Ònì ni] LT',\n        nextDay : '[Ọ̀la ni] LT',\n        nextWeek : 'dddd [Ọsẹ̀ tón\\'bọ] [ni] LT',\n        lastDay : '[Àna ni] LT',\n        lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ní %s',\n        past : '%s kọjá',\n        s : 'ìsẹjú aayá die',\n        ss :'aayá %d',\n        m : 'ìsẹjú kan',\n        mm : 'ìsẹjú %d',\n        h : 'wákati kan',\n        hh : 'wákati %d',\n        d : 'ọjọ́ kan',\n        dd : 'ọjọ́ %d',\n        M : 'osù kan',\n        MM : 'osù %d',\n        y : 'ọdún kan',\n        yy : 'ọdún %d'\n    },\n    dayOfMonthOrdinalParse : /ọjọ́\\s\\d{1,2}/,\n    ordinal : 'ọjọ́ %d',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn yo;\n\n})));\n\n\n/***/ }),\n/* 491 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhCn = moment.defineLocale('zh-cn', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日Ah点mm分',\n        LLLL : 'YYYY年M月D日ddddAh点mm分',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' ||\n                meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        } else {\n            // '中午'\n            return hour >= 11 ? hour : hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '日';\n            case 'M':\n                return number + '月';\n            case 'w':\n            case 'W':\n                return number + '周';\n            default:\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s内',\n        past : '%s前',\n        s : '几秒',\n        ss : '%d 秒',\n        m : '1 分钟',\n        mm : '%d 分钟',\n        h : '1 小时',\n        hh : '%d 小时',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 个月',\n        MM : '%d 个月',\n        y : '1 年',\n        yy : '%d 年'\n    },\n    week : {\n        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn zhCn;\n\n})));\n\n\n/***/ }),\n/* 492 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhHk = moment.defineLocale('zh-hk', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日dddd HH:mm',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '中午') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd' :\n            case 'D' :\n            case 'DDD' :\n                return number + '日';\n            case 'M' :\n                return number + '月';\n            case 'w' :\n            case 'W' :\n                return number + '週';\n            default :\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s內',\n        past : '%s前',\n        s : '幾秒',\n        ss : '%d 秒',\n        m : '1 分鐘',\n        mm : '%d 分鐘',\n        h : '1 小時',\n        hh : '%d 小時',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 個月',\n        MM : '%d 個月',\n        y : '1 年',\n        yy : '%d 年'\n    }\n});\n\nreturn zhHk;\n\n})));\n\n\n/***/ }),\n/* 493 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//! moment.js locale configuration\n\n;(function (global, factory) {\n    true ? factory(__webpack_require__(2)) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhTw = moment.defineLocale('zh-tw', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日dddd HH:mm',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '中午') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd' :\n            case 'D' :\n            case 'DDD' :\n                return number + '日';\n            case 'M' :\n                return number + '月';\n            case 'w' :\n            case 'W' :\n                return number + '週';\n            default :\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s內',\n        past : '%s前',\n        s : '幾秒',\n        ss : '%d 秒',\n        m : '1 分鐘',\n        mm : '%d 分鐘',\n        h : '1 小時',\n        hh : '%d 小時',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 個月',\n        MM : '%d 個月',\n        y : '1 年',\n        yy : '%d 年'\n    }\n});\n\nreturn zhTw;\n\n})));\n\n\n/***/ }),\n/* 494 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar selectionModes = ['days', 'months', 'years'];\n\nvar Calendar = (0, _createReactClass2.default)({\n  displayName: 'Calendar',\n\n  propTypes: {\n    yearsPerPage: _propTypes2.default.number,\n    date: _propTypes2.default.any,\n    minYear: _propTypes2.default.any,\n    maxYear: _propTypes2.default.any,\n    minSelectionMode: _propTypes2.default.oneOf(selectionModes),\n    onDateSelected: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      yearsPerPage: 9,\n      minYear: '1/1/1000',\n      maxYear: '1/1/5000',\n      date: new Date(),\n      minSelectionMode: 'days'\n    };\n  },\n\n  getInitialState: function getInitialState() {\n    var initMoment = (0, _moment2.default)(this.props.date).locale('en');\n    var initSelMode = this.props.minSelectionMode;\n\n    return {\n      selectionMode: initSelMode,\n      selectedMoment: initMoment,\n      visibleMoment: initMoment\n    };\n  },\n\n  componentDidMount: function componentDidMount() {\n    //Fire this onmount so parent components can initialize with a default value\n    if (this.props.onDateSelected) {\n      this.props.onDateSelected(this.state.selectedMoment, this.state.selectionMode);\n    }\n  },\n\n  componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n    if (nextProps.minSelectionMode != this.state.selectionMode && _lodash2.default.contains(selectionModes, nextProps.minSelectionMode)) {\n      this.setState({ selectionMode: nextProps.minSelectionMode }, function () {\n        if (this.props.onDateSelected) {\n          this.props.onDateSelected(this.state.selectedMoment, nextProps.minSelectionMode);\n        }\n      });\n    }\n\n    if (!this.state.selectedMoment.isSame(nextProps.date)) {\n      this.setState({ selectedMoment: (0, _moment2.default)(nextProps.date) });\n    }\n  },\n\n  /**\n   * Given a moment date, generates an array of days (annotated with classes based on whether they are currently selected or\n   * from a previous/next month.  The resulting array gets passed to renderDays()\n   * @param {moment} date\n   * @returns {*}\n   */\n  getDays: function getDays(date) {\n    var currentMoment = this.state.selectedMoment;\n    var firstDay = date.clone().startOf('month');\n    var firstDayOffset = firstDay.weekday();\n\n    return _lodash2.default.chain(_lodash2.default.range(42)).map(function (i) {\n      var momentCursor = firstDay.clone().add('days', i - firstDayOffset);\n      var isBeforeMonth = i < firstDayOffset;\n      var isAfterMonth = i >= date.daysInMonth() + firstDayOffset;\n      return {\n        day: momentCursor,\n        classes: {\n          day: true,\n          'ui-datepicker__day': true,\n          old: isBeforeMonth,\n          active: currentMoment.isSame(momentCursor, 'day') && !isAfterMonth && !isBeforeMonth,\n          new: isAfterMonth\n        }\n      };\n    }).value();\n  },\n\n  /**\n   * Given a moment date, generates an array of months to be passed to the renderMonths function\n   * @param {moment} date\n   * @returns {*}\n   */\n  getMonths: function getMonths(date) {\n    var currentMoment = this.state.selectedMoment;\n\n    return _lodash2.default.map(_lodash2.default.range(12), function (i) {\n      var momentCursor = (0, _moment2.default)([date.year(), i]);\n      return {\n        month: momentCursor,\n        classes: {\n          month: true,\n          'ui-datepicker__month': true,\n          active: currentMoment.isSame(momentCursor, 'month')\n        }\n      };\n    });\n  },\n\n  /**\n   * Given a moment date, generates an array of years to be passed to the renderYears function\n   * @param {moment} date\n   * @returns {*}\n   */\n  getYears: function getYears(date) {\n    var currentMoment = this.state.selectedMoment;\n    var range = this.getYearRange(date);\n\n    var minYear = (0, _moment2.default)(this.props.minYear).year();\n    var maxYear = (0, _moment2.default)(this.props.maxYear).year();\n\n    return _lodash2.default.map(_lodash2.default.range(range.start, range.end), function (i) {\n      var momentCursor = (0, _moment2.default)([i]);\n      return {\n        year: momentCursor,\n        classes: {\n          year: true,\n          'ui-datepicker__year': true,\n          old: i < minYear || i > maxYear,\n          active: currentMoment.isSame(momentCursor, 'year')\n        }\n      };\n    });\n  },\n\n  /**\n   * Computes the start and ending years for generating a 'page' of years surrounding a given moment date's year\n   * @param {moment} date\n   * @returns {{start: number, end: number}}\n   */\n  getYearRange: function getYearRange(date) {\n    var ypp = this.props.yearsPerPage;\n    var start = Math.floor(date.year() / ypp) * ypp;\n    var end = start + ypp;\n\n    return { start: start, end: end };\n  },\n\n  handleNext: function handleNext() {\n    this._navigateVisibleMomentForward(true);\n  },\n\n  handlePrev: function handlePrev() {\n    this._navigateVisibleMomentForward(false);\n  },\n\n  handleNavigateDownMode: function handleNavigateDownMode(newday) {\n    this.setState({ visibleMoment: newday });\n    this._decrementSelectionMode(function () {\n      if (this.props.onDateSelected) {\n        this.props.onDateSelected(newday, this.state.selectionMode);\n      }\n      this.setState({ selectedMoment: newday });\n    }.bind(this));\n  },\n\n  handleNavigateUpMode: function handleNavigateUpMode() {\n    this._incrementSelectionMode();\n  },\n\n  _navigateVisibleMomentForward: function _navigateVisibleMomentForward(isforward) {\n    var direction = isforward ? 1 : -1;\n    var selMode = this.state.selectionMode;\n\n    var visibleMoment = this.state.visibleMoment.clone();\n\n    switch (selMode) {\n      case 'days':\n        this.setState({ visibleMoment: visibleMoment.add('months', direction) });\n        break;\n      case 'months':\n        this.setState({ visibleMoment: visibleMoment.add('years', direction) });\n        break;\n      case 'years':\n        this.setState({ visibleMoment: visibleMoment.add('years', this.props.yearsPerPage * direction) });\n        break;\n    }\n  },\n\n  _incrementSelectionMode: function _incrementSelectionMode() {\n    var modeUp = _lodash2.default.indexOf(selectionModes, this.state.selectionMode) + 1;\n    if (modeUp <= 2) {\n      this.setState({ selectionMode: selectionModes[modeUp] });\n    }\n  },\n\n  _decrementSelectionMode: function _decrementSelectionMode(handleMinModeReached) {\n    var minMode = _lodash2.default.indexOf(selectionModes, this.props.minSelectionMode);\n    var curMode = _lodash2.default.indexOf(selectionModes, this.state.selectionMode);\n    if (curMode - 1 >= 0 && curMode - 1 >= minMode) {\n      this.setState({ selectionMode: selectionModes[curMode - 1] });\n    }\n    if (curMode === minMode) {\n      handleMinModeReached();\n    }\n  },\n\n  /**\n   * Outputs calendar header text based on the current mode (day/month/year)\n   * @returns {string}\n   */\n  getHeaderText: function getHeaderText() {\n    var headerText = '';\n\n    switch (this.state.selectionMode) {\n      case 'days':\n        headerText = this.state.visibleMoment.format('MMMM YYYY');\n        break;\n      case 'months':\n        headerText = this.state.visibleMoment.format('YYYY');\n        break;\n      case 'years':\n        var range = this.getYearRange(this.state.visibleMoment);\n        headerText = range.start + '-' + (range.end - 1);\n        break;\n    }\n    return headerText;\n  },\n\n  renderDOWHeader: function renderDOWHeader() {\n    return _react2.default.createElement('tr', null, ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map(function (d) {\n      return _react2.default.createElement('th', { key: d, className: 'ui-datepicker__dow' }, d);\n    }));\n  },\n\n  renderYears: function renderYears(years) {\n    var _this = this;\n\n    return _lodash2.default.map(years, function (year) {\n      return _react2.default.createElement('span', {\n        key: year.year.toString(),\n        onClick: !year.classes.old ? _this.handleNavigateDownMode.bind(null, year.year) : null,\n        className: (0, _classnames2.default)(year.classes)\n      }, year.year.format('YYYY'));\n    });\n  },\n\n  renderMonths: function renderMonths(months) {\n    var _this2 = this;\n\n    return _lodash2.default.map(months, function (month) {\n      return _react2.default.createElement('span', {\n        key: month.month.toString(),\n        onClick: _this2.handleNavigateDownMode.bind(null, month.month),\n        className: (0, _classnames2.default)(month.classes)\n      }, month.month.format('MMM'));\n    });\n  },\n\n  renderDays: function renderDays(days) {\n    var _this3 = this;\n\n    return _lodash2.default.chain(days).map(function (d, i) {\n      return { day: d, row: Math.ceil((i + 1) / 7) };\n    }).groupBy('row').map(function (week, i) {\n      return _react2.default.createElement('tr', { key: 'week-' + i }, _lodash2.default.map(week, function (d) {\n        return _react2.default.createElement('td', { key: d.day.day.date(), onClick: _this3.handleNavigateDownMode.bind(null, d.day.day), className: (0, _classnames2.default)(d.day.classes) }, d.day.day.date());\n      }));\n    }).value();\n  },\n\n  render: function render() {\n    return _react2.default.createElement('div', { className: 'ui-datepicker' }, _react2.default.createElement('table', null, _react2.default.createElement('thead', null, _react2.default.createElement('tr', { className: 'ui-datepicker__pagination' }, _react2.default.createElement('th', { onClick: this.handlePrev, className: 'ui-datepicker__pagination__prev icon-left-1' }), _react2.default.createElement('th', { onClick: this.handleNavigateUpMode, className: 'ui-datepicker__switch', colSpan: '5' }, this.getHeaderText()), _react2.default.createElement('th', { onClick: this.handleNext, className: 'ui-datepicker__pagination__next icon-right-1' })), this.state.selectionMode === 'days' ? this.renderDOWHeader() : null), this.state.selectionMode === 'days' ? _react2.default.createElement('tbody', null, this.renderDays(this.getDays(this.state.visibleMoment))) : null, this.state.selectionMode === 'months' ? _react2.default.createElement('tbody', null, _react2.default.createElement('tr', null, _react2.default.createElement('td', { colSpan: '7' }, this.renderMonths(this.getMonths(this.state.visibleMoment))))) : null, this.state.selectionMode === 'years' ? _react2.default.createElement('tbody', null, _react2.default.createElement('tr', null, _react2.default.createElement('td', { colSpan: '7' }, this.renderYears(this.getYears(this.state.visibleMoment))))) : null));\n  }\n});\n\nexports.default = Calendar;\n\n/***/ }),\n/* 495 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nexports.default = {\n  getInitialState: function getInitialState() {\n    return {\n      open: false\n    };\n  },\n\n  componentDidMount: function componentDidMount() {\n    document.addEventListener('click', this.handleDocumentClick);\n  },\n\n  componentWillUnmount: function componentWillUnmount() {\n    document.removeEventListener('click', this.handleDocumentClick);\n  },\n\n  handleToggleClick: function handleToggleClick(e) {\n    if (this.props.disabled) {\n      return;\n    }\n\n    if (!this.ignoreToggle) {\n      this.toggle();\n    }\n    this.ignoreClick = true;\n    this.ignoreToggle = false;\n  },\n\n  handleContentClick: function handleContentClick(e) {\n    if (this.props.ignoreContentClicks) {\n      this.ignoreToggle = true;\n    }\n  },\n\n  handleDocumentClick: function handleDocumentClick() {\n    if (this.props.ignoreDocumentClicks) {\n      return;\n    }\n\n    var self = this;\n\n    // Allow the handleClick handler a chance to run first\n    // before checking if we should toggle the menu closed.\n    // It isn't defined what order the click handlers will run.\n    _lodash2.default.defer(function () {\n      if (!self.ignoreClick && self.state.open) {\n        self.toggle();\n      }\n      self.ignoreClick = !self.ignoreClick;\n    });\n  },\n\n  // When calling this from a click event listener be sure to\n  // pass true for ignoreClick otherwise the menu will never open.\n  toggle: function toggle(ignoreClick) {\n    var opening = !this.state.open;\n    this.setState({ open: opening });\n\n    var onToggle = this.onToggle;\n    if (onToggle) {\n      onToggle(opening);\n    }\n\n    this.ignoreClick = ignoreClick;\n  }\n};\n\n/***/ }),\n/* 496 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n  componentWillMount: function componentWillMount() {\n    this.timeouts = [];\n    this.intervals = [];\n  },\n\n  setInterval: function (_setInterval) {\n    function setInterval() {\n      return _setInterval.apply(this, arguments);\n    }\n\n    setInterval.toString = function () {\n      return _setInterval.toString();\n    };\n\n    return setInterval;\n  }(function () {\n    this.intervals.push(setInterval.apply(null, arguments));\n  }),\n\n  setTimeout: function (_setTimeout) {\n    function setTimeout(_x, _x2) {\n      return _setTimeout.apply(this, arguments);\n    }\n\n    setTimeout.toString = function () {\n      return _setTimeout.toString();\n    };\n\n    return setTimeout;\n  }(function (cb, delay) {\n    var self = this;\n\n    var timeout = setTimeout(function () {\n      cb();\n      self.removeTimeout(timeout);\n    }, delay);\n\n    this.timeouts.push(timeout);\n\n    return timeout;\n  }),\n\n  clearTimeout: function (_clearTimeout) {\n    function clearTimeout(_x3) {\n      return _clearTimeout.apply(this, arguments);\n    }\n\n    clearTimeout.toString = function () {\n      return _clearTimeout.toString();\n    };\n\n    return clearTimeout;\n  }(function (timeout) {\n    this.removeTimeout(timeout);\n    clearTimeout(timeout);\n  }),\n\n  removeTimeout: function removeTimeout(timeout) {\n    var index = this.timeouts.indexOf(timeout);\n    if (index !== -1) {\n      this.timeouts.slice(index, 1);\n    }\n  },\n\n  componentWillUnmount: function componentWillUnmount() {\n    var i, len;\n\n    for (i = 0, len = this.intervals.length; i < len; ++i) {\n      clearInterval(this.intervals[i]);\n    }\n    for (i = 0, len = this.timeouts.length; i < len; ++i) {\n      clearTimeout(this.timeouts[i]);\n    }\n  }\n};\n\n/***/ }),\n/* 497 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _chainFunction = __webpack_require__(814);\n\nvar _chainFunction2 = _interopRequireDefault(_chainFunction);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _warning = __webpack_require__(815);\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _ChildMapping = __webpack_require__(816);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar propTypes = {\n  component: _propTypes2.default.any,\n  childFactory: _propTypes2.default.func,\n  children: _propTypes2.default.node\n};\n\nvar defaultProps = {\n  component: 'span',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n\nvar TransitionGroup = function (_React$Component) {\n  _inherits(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    _classCallCheck(this, TransitionGroup);\n\n    var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));\n\n    _this.performAppear = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillAppear) {\n        component.componentWillAppear(_this._handleDoneAppearing.bind(_this, key, component));\n      } else {\n        _this._handleDoneAppearing(key, component);\n      }\n    };\n\n    _this._handleDoneAppearing = function (key, component) {\n      if (component.componentDidAppear) {\n        component.componentDidAppear();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (!currentChildMapping || !currentChildMapping.hasOwnProperty(key)) {\n        // This was removed before it had fully appeared. Remove it.\n        _this.performLeave(key, component);\n      }\n    };\n\n    _this.performEnter = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillEnter) {\n        component.componentWillEnter(_this._handleDoneEntering.bind(_this, key, component));\n      } else {\n        _this._handleDoneEntering(key, component);\n      }\n    };\n\n    _this._handleDoneEntering = function (key, component) {\n      if (component.componentDidEnter) {\n        component.componentDidEnter();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (!currentChildMapping || !currentChildMapping.hasOwnProperty(key)) {\n        // This was removed before it had fully entered. Remove it.\n        _this.performLeave(key, component);\n      }\n    };\n\n    _this.performLeave = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillLeave) {\n        component.componentWillLeave(_this._handleDoneLeaving.bind(_this, key, component));\n      } else {\n        // Note that this is somewhat dangerous b/c it calls setState()\n        // again, effectively mutating the component before all the work\n        // is done.\n        _this._handleDoneLeaving(key, component);\n      }\n    };\n\n    _this._handleDoneLeaving = function (key, component) {\n      if (component.componentDidLeave) {\n        component.componentDidLeave();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (currentChildMapping && currentChildMapping.hasOwnProperty(key)) {\n        // This entered again before it fully left. Add it again.\n        _this.keysToEnter.push(key);\n      } else {\n        _this.setState(function (state) {\n          var newChildren = _extends({}, state.children);\n          delete newChildren[key];\n          return { children: newChildren };\n        });\n      }\n    };\n\n    _this.childRefs = Object.create(null);\n\n    _this.state = {\n      children: (0, _ChildMapping.getChildMapping)(props.children)\n    };\n    return _this;\n  }\n\n  TransitionGroup.prototype.componentWillMount = function componentWillMount() {\n    this.currentlyTransitioningKeys = {};\n    this.keysToEnter = [];\n    this.keysToLeave = [];\n  };\n\n  TransitionGroup.prototype.componentDidMount = function componentDidMount() {\n    var initialChildMapping = this.state.children;\n    for (var key in initialChildMapping) {\n      if (initialChildMapping[key]) {\n        this.performAppear(key, this.childRefs[key]);\n      }\n    }\n  };\n\n  TransitionGroup.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var nextChildMapping = (0, _ChildMapping.getChildMapping)(nextProps.children);\n    var prevChildMapping = this.state.children;\n\n    this.setState({\n      children: (0, _ChildMapping.mergeChildMappings)(prevChildMapping, nextChildMapping)\n    });\n\n    for (var key in nextChildMapping) {\n      var hasPrev = prevChildMapping && prevChildMapping.hasOwnProperty(key);\n      if (nextChildMapping[key] && !hasPrev && !this.currentlyTransitioningKeys[key]) {\n        this.keysToEnter.push(key);\n      }\n    }\n\n    for (var _key in prevChildMapping) {\n      var hasNext = nextChildMapping && nextChildMapping.hasOwnProperty(_key);\n      if (prevChildMapping[_key] && !hasNext && !this.currentlyTransitioningKeys[_key]) {\n        this.keysToLeave.push(_key);\n      }\n    }\n\n    // If we want to someday check for reordering, we could do it here.\n  };\n\n  TransitionGroup.prototype.componentDidUpdate = function componentDidUpdate() {\n    var _this2 = this;\n\n    var keysToEnter = this.keysToEnter;\n    this.keysToEnter = [];\n    keysToEnter.forEach(function (key) {\n      return _this2.performEnter(key, _this2.childRefs[key]);\n    });\n\n    var keysToLeave = this.keysToLeave;\n    this.keysToLeave = [];\n    keysToLeave.forEach(function (key) {\n      return _this2.performLeave(key, _this2.childRefs[key]);\n    });\n  };\n\n  TransitionGroup.prototype.render = function render() {\n    var _this3 = this;\n\n    // TODO: we could get rid of the need for the wrapper node\n    // by cloning a single child\n    var childrenToRender = [];\n\n    var _loop = function _loop(key) {\n      var child = _this3.state.children[key];\n      if (child) {\n        var isCallbackRef = typeof child.ref !== 'string';\n        var factoryChild = _this3.props.childFactory(child);\n        var ref = function ref(r) {\n          _this3.childRefs[key] = r;\n        };\n\n         false ? (0, _warning2.default)(isCallbackRef, 'string refs are not supported on children of TransitionGroup and will be ignored. ' + 'Please use a callback ref instead: https://facebook.github.io/react/docs/refs-and-the-dom.html#the-ref-callback-attribute') : void 0;\n\n        // Always chaining the refs leads to problems when the childFactory\n        // wraps the child. The child ref callback gets called twice with the\n        // wrapper and the child. So we only need to chain the ref if the\n        // factoryChild is not different from child.\n        if (factoryChild === child && isCallbackRef) {\n          ref = (0, _chainFunction2.default)(child.ref, ref);\n        }\n\n        // You may need to apply reactive updates to a child as it is leaving.\n        // The normal React way to do it won't work since the child will have\n        // already been removed. In case you need this behavior you can provide\n        // a childFactory function to wrap every child, even the ones that are\n        // leaving.\n        childrenToRender.push(_react2.default.cloneElement(factoryChild, {\n          key: key,\n          ref: ref\n        }));\n      }\n    };\n\n    for (var key in this.state.children) {\n      _loop(key);\n    }\n\n    // Do not forward TransitionGroup props to primitive DOM nodes\n    var props = _extends({}, this.props);\n    delete props.transitionLeave;\n    delete props.transitionName;\n    delete props.transitionAppear;\n    delete props.transitionEnter;\n    delete props.childFactory;\n    delete props.transitionLeaveTimeout;\n    delete props.transitionEnterTimeout;\n    delete props.transitionAppearTimeout;\n    delete props.component;\n\n    return _react2.default.createElement(this.props.component, props, childrenToRender);\n  };\n\n  return TransitionGroup;\n}(_react2.default.Component);\n\nTransitionGroup.displayName = 'TransitionGroup';\n\n\nTransitionGroup.propTypes =  false ? propTypes : {};\nTransitionGroup.defaultProps = defaultProps;\n\nexports.default = TransitionGroup;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 498 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _default = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 499 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.nameShape = undefined;\nexports.transitionTimeout = transitionTimeout;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction transitionTimeout(transitionType) {\n  var timeoutPropName = 'transition' + transitionType + 'Timeout';\n  var enabledPropName = 'transition' + transitionType;\n\n  return function (props) {\n    // If the transition is enabled\n    if (props[enabledPropName]) {\n      // If no timeout duration is provided\n      if (props[timeoutPropName] == null) {\n        return new Error(timeoutPropName + ' wasn\\'t supplied to CSSTransitionGroup: ' + 'this can cause unreliable animations and won\\'t be supported in ' + 'a future version of React. See ' + 'https://fb.me/react-animation-transition-group-timeout for more ' + 'information.');\n\n        // If the duration isn't a number\n      } else if (typeof props[timeoutPropName] !== 'number') {\n        return new Error(timeoutPropName + ' must be a number (in milliseconds)');\n      }\n    }\n\n    return null;\n  };\n}\n\nvar nameShape = exports.nameShape = _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  leave: _propTypes2.default.string,\n  active: _propTypes2.default.string\n}), _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  enterActive: _propTypes2.default.string,\n  leave: _propTypes2.default.string,\n  leaveActive: _propTypes2.default.string,\n  appear: _propTypes2.default.string,\n  appearActive: _propTypes2.default.string\n})]);\n\n/***/ }),\n/* 500 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _gl_data_set = __webpack_require__(824);\n\nvar _gl_data_set2 = _interopRequireDefault(_gl_data_set);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Collection.extend({\n    url: '/api/v1/data_sets',\n    model: _gl_data_set2.default,\n    parse: function parse(resp) {\n        return resp.data_sets;\n    },\n    parseDataSetErrors: function parseDataSetErrors(errors) {\n        return errors.reduce(function (result, err, index) {\n            var dataSetId = Object.keys(err)[0];\n            result[dataSetId] = { errors: err[dataSetId], order: index };\n            return result;\n        }, {});\n    },\n\n    sortFields: ['year', 'month', ['data_set_type', -1], 'updated'],\n    comparator: function comparator(a, b) {\n        if (a.has('order') && b.has('order')) {\n            return a.get('order') - b.get('order');\n        }\n        var fields = this.sortFields;\n        for (var i = 0; i < fields.length; i++) {\n            var field = fields[i];\n            var direction = 1;\n            if (_lodash2.default.isArray(field)) {\n                direction = field[1];\n                field = field[0];\n            }\n            // Handles undefined as a sort attribute\n            var aval = a.get(field) || 0;\n            var bval = b.get(field) || 0;\n            if (aval < bval) {\n                return -1 * direction;\n            } else if (aval > bval) {\n                return 1 * direction;\n            }\n        }\n        return 0;\n    },\n    getChartOfAccountsIds: function getChartOfAccountsIds() {\n        return _lodash2.default.uniq(this.pluck('coa_id'));\n    }\n});\n\n/***/ }),\n/* 501 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    urlRoot: '/api/v1/entities',\n    defaults: {\n        color: {\n            index: 0\n        },\n        fiscal_year_start_date_formatted: 'July 01',\n        country: 'US',\n        entity_type: 'city'\n    },\n    toJSON: function toJSON() {\n        return this.omit('logo');\n    },\n    isGlobal: function isGlobal() {\n        return this.id === 'controlpanel';\n    },\n    getRole: function getRole() {\n        return this.id === 'controlpanel' ? 'admin' : 'user';\n    },\n\n    // Returns the name of the entity stripping off any prefixed text.\n    // Example: \"the city of Palo Alto\" becomes \"Palo Alto\".\n    getName: function getName() {\n        var name = this.get('name') || '';\n        return name.replace('the City of', '');\n    }\n});\n\n/***/ }),\n/* 502 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _chart_of_account = __webpack_require__(826);\n\nvar _chart_of_account2 = _interopRequireDefault(_chart_of_account);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Collection.extend({\n    url: '/api/v1/chart_of_accounts',\n    model: _chart_of_account2.default,\n    parse: function parse(resp) {\n        return resp.chart_of_accounts;\n    },\n    filterWithDataSets: function filterWithDataSets() {\n        return this.filter(function (coa) {\n            return !_lodash2.default.isEmpty(coa.get('ledger_data_set_ids'));\n        });\n    }\n});\n\n/***/ }),\n/* 503 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(833);\n\n/***/ }),\n/* 504 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BreakdownModel = _backbone2.default.Model.extend({\n    isAccountType: function isAccountType() {\n        return this.get('isAccountType');\n    },\n    getTree: function getTree(index) {\n        var trees = this.get('trees');\n        return trees && trees[index];\n    },\n    findTree: function findTree(predicate, context) {\n        var trees = this.get('trees');\n        return trees && _lodash2.default.find(trees, predicate, context || this);\n    },\n    toHash: function toHash() {\n        var trees = this.get('trees') || [];\n        if (trees.length > 1) {\n            return 'types';\n        } else {\n            return _lodash2.default.head(trees).get('long_id');\n        }\n    }\n});\nvar BreakdownCollection = _backbone2.default.Collection.extend({\n    model: BreakdownModel,\n    sort_key: 'display_order',\n    comparator: function comparator(item) {\n        return item.get('trees')[0].get(this.sort_key);\n    },\n    filterByValidAggregations: function filterByValidAggregations(aggregations, suppressHidden) {\n        return this.filter(function (breakdown) {\n            if (suppressHidden && !breakdown.get('visible')) {\n                return false;\n            }\n            return breakdown.isAccountType() || _lodash2.default.every(breakdown.get('trees'), function (tree) {\n                return tree.valid_aggregations && _lodash2.default.some(aggregations, function (aggregation) {\n                    return tree.valid_aggregations[aggregation];\n                });\n            });\n        });\n    },\n\n    // Find a breakdown by tree ID which can be in short or long form.\n    mapTreeId: function mapTreeId(treeId) {\n        if (!treeId) {\n            return treeId;\n        }\n        // Search for a breakdown with a tree having a matching short or long ID.\n        var breakdown = this.find(function (breakdown) {\n            return breakdown.findTree(function (tree) {\n                return tree.id === treeId || tree.get('long_id') === treeId;\n            });\n        });\n        // If no breakdown is found default to aggregating by account type.\n        return breakdown && breakdown.get('visible') ? breakdown.id : 'types';\n    },\n    findDefault: function findDefault() {\n        var deptBreakdown = this.findWhere({ name: 'Departments' });\n        if (deptBreakdown) {\n            // Use the departments breakdown by default if one exists.\n            return deptBreakdown;\n        } else if (this.length > 1) {\n            // The next best department like tree will be ordered second.\n            return this.at(1);\n        } else {\n            // If all else fails just pick the first breakdown tree.\n            return this.first();\n        }\n    }\n});\nexports.default = {\n    Model: BreakdownModel,\n    Collection: BreakdownCollection\n};\n\n/***/ }),\n/* 505 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _recoverable_error = __webpack_require__(258);\n\nvar _recoverable_error2 = _interopRequireDefault(_recoverable_error);\n\nvar _breakdown = __webpack_require__(504);\n\nvar _breakdown2 = _interopRequireDefault(_breakdown);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _saved_views_store = __webpack_require__(145);\n\nvar _saved_views_store2 = _interopRequireDefault(_saved_views_store);\n\nvar _saved_view_actions = __webpack_require__(187);\n\nvar _saved_view_actions2 = _interopRequireDefault(_saved_view_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _og_colors = __webpack_require__(186);\n\nvar _og_colors2 = _interopRequireDefault(_og_colors);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    legendLimit: 8,\n    legendLimitStep: 8,\n    defaults: {\n        vsGraphType: 'line',\n        graph: 'stacked',\n        sortOrder: 'desc',\n        legendLimit: 8,\n        showAnnotations: false,\n        projections: false,\n        projectionType: 'auto_year_avg',\n        selectedDataSetIndex: null\n    },\n    // Mapping of state aliases to their real names.\n    // Useful for changing the name of a state without breaking legacy hashes.\n    stateAliases: {\n        graph: 'graphType'\n    },\n    initialize: function initialize(options) {\n        var report = this.report = options.report;\n        var settings = report.get('properties');\n        this.recoverableErrorModal = new _recoverable_error2.default({ suppressRemoval: true });\n        this.set('graphType', report.graphType());\n        this.defaults.graphType = settings.graph || this.defaults.graph;\n        this.defaults.sortOrder = settings.sort_order || this.defaults.sortOrder;\n        this.defaults.selectedDataSetIndex = settings.selected_data_set_index || this.defaults.selectedDataSetIndex;\n        this.defaults.projections = settings.projections || this.defaults.projections;\n        this.defaults.projectionType = settings.projection_type || this.defaults.projectionType;\n        this.breakdowns = new _breakdown2.default.Collection();\n        this.selectedDataSetIndex = null;\n        var color = options.entity.color ? options.entity.color.color : null;\n        if (color) {\n            this.color = parseInt(color.slice(1), 16);\n        } else {\n            this.color = 0;\n        }\n        this.on('change:legendSort change:graphType change:legendLimit change:selectedDataSetIndex', _lodash2.default.partial(this.triggerRenderData, false), this);\n    },\n    triggerRenderData: function triggerRenderData(skipGraph) {\n        if (!this.pausedRendering) {\n            this.trigger('renderData', skipGraph);\n        }\n    },\n    pauseRendering: function pauseRendering() {\n        this.pausedRendering = true;\n    },\n    resumeRendering: function resumeRendering() {\n        this.pausedRendering = false;\n    },\n    selectionChange: function selectionChange() {\n        if (!this.pausedRendering) {\n            this.trigger('change');\n            this.recoverableErrorModal.close();\n        }\n    },\n    initBudgetData: function initBudgetData(budgetData) {\n        this.pauseRendering();\n        this.budgetData = budgetData;\n        var visibleAccounts = void 0;\n        var product = this.report.get('technical_name');\n        var properties = this.report.get('properties');\n        if (product === 'balance') {\n            visibleAccounts = ['assets', 'liabilities'];\n        } else if (properties.ledger_types) {\n            visibleAccounts = properties.ledger_types;\n        } else {\n            visibleAccounts = ['revenues', 'expenses'];\n        }\n        this.breakdowns.reset(this.budgetData.breakdowns.filterByValidAggregations(visibleAccounts, true));\n        this.budgetData.setVisibleAccounts(visibleAccounts);\n        this.initSelectionState();\n        this.resumeRendering();\n        budgetData.on('selectionChange', _lodash2.default.partial(this.selectionChange, false), this);\n        budgetData.on('aggregation', function (aggregations) {\n            var _this = this;\n\n            if (!aggregations.checked_nodes) {\n                this.set('selection', aggregations.selection);\n            }\n            this.resetMore();\n            this.triggerRenderData(aggregations.skipGraph);\n            _lodash2.default.defer(function () {\n                _this.trigger('doneRendering');\n            });\n        }, this);\n        /**\r\n        * NOTE: Please be aware this function suppresses logs for reporting-classic-app on production env\r\n        */\n        this.budgetData.on('aggregation:error', function (error) {\n            var self = this;\n            if (error.requestResponse && error.requestResponse.status >= 400 && error.requestResponse.status < 500) {\n                this.recoverableErrorModal.open('Sorry that data is no longer available.', '', ['Explore Other Data']);\n                this.recoverableErrorModal.once('button:click', function () {\n                    /*jshint validthis:true */\n                    self.changeState({ selection: null });\n                    _summary_report_actions2.default.getAggregations();\n                    this.close();\n                });\n            } else {\n                this.recoverableErrorModal.open('Unable to request data from server.', 'Please try again in a moment.', ['Retry']);\n                this.recoverableErrorModal.once('button:click', function () {\n                    /*jshint validthis:true */\n                    budgetData.triggerSelectionChange();\n                    this.close();\n                });\n                Raven.captureException(error);\n            }\n            this.recoverableErrorModal.once('close', function () {\n                // Clear any button click listeners when closing modal.\n                this.off('button:click');\n            });\n            if (window.gon.env && window.gon.env === 'development' && console.error) {\n                console.error(error);\n            }\n        }, this);\n    },\n    getLeafAccountCodeTreeMap: function getLeafAccountCodeTreeMap() {\n        var product = this.get('product');\n        return this.budgetData.selectedLeafCodesByTree(product);\n    },\n    initSelectionState: function initSelectionState() {\n        var budgetData = this.budgetData;\n        this.initSorts(budgetData);\n    },\n    initSorts: function initSorts() {\n        this.treeSorts = {};\n        _lodash2.default.each(this.budgetData.trees, _lodash2.default.bind(function (tree) {\n            this.treeSorts[tree.id] = 'alpha';\n        }, this));\n        this.set('legendSort', this.defaults.sortOrder);\n    },\n    getTreeSort: function getTreeSort(tree) {\n        return this.treeSorts[tree];\n    },\n    setTreeSort: function setTreeSort(tree, sortMethod) {\n        var oldSortMethod = this.treeSorts[tree];\n        if (oldSortMethod !== sortMethod) {\n            this.treeSorts[tree] = sortMethod;\n            this.budgetData.sortTree(tree, sortMethod);\n            this.trigger('change:treeSort');\n        }\n    },\n    legendExpanded: function legendExpanded() {\n        return this.get('legendLimit') > this.legendLimit;\n    },\n    limitRenderedData: function limitRenderedData(lines) {\n        lines = this.legendSortMethods.desc(lines);\n        this.moreLine = null;\n        var limit = this.get('legendLimit');\n        if (lines.length < limit + 4) {\n            return lines;\n        }\n        var moreLines = [];\n        while (lines.length > limit) {\n            moreLines.push(lines.pop());\n        }\n        this.moreLine = {\n            id: '_moreLine',\n            name: 'More (' + moreLines.length + ' grouped)',\n            childless: true,\n            amounts: _lodash2.default.map(moreLines[0].amounts, function (dataSet) {\n                return {\n                    value: 0,\n                    type: dataSet.type\n                };\n            }),\n            color: _og_colors2.default.moreColor,\n            types: moreLines[0].types,\n            lines: moreLines\n        };\n        var total = 0;\n        _lodash2.default.each(moreLines, _lodash2.default.bind(function (line) {\n            _lodash2.default.each(line.amounts, _lodash2.default.bind(function (amount, i) {\n                this.moreLine.amounts[i].value += amount.value;\n                total += amount.value;\n            }, this));\n        }, this));\n        this.moreLine.average = total / moreLines[0].amounts.length;\n        return lines;\n    },\n    expandMore: function expandMore() {\n        var limit = this.get('legendLimit');\n        this.set('legendLimit', limit + this.legendLimitStep);\n    },\n    collapseMore: function collapseMore() {\n        var limit = this.get('legendLimit');\n        this.set('legendLimit', limit - this.legendLimitStep);\n    },\n    resetMore: function resetMore() {\n        this.set('legendLimit', this.legendLimit);\n    },\n\n    colorAssigner: function colorAssigner(lines) {\n        _lodash2.default.each(lines, _lodash2.default.bind(function (line) {\n            var node = this.budgetData.nodes[line.id];\n            if (node) {\n                if (!line.color) {\n                    node.color = line.assignNextColor(this.color);\n                }\n            }\n        }, this));\n    },\n    /**\r\n    * this is called from:\r\n    * 1) summary_graph.update\r\n    * 2) summary_report_store.getRenderedData\r\n    * 3)\r\n    */\n    renderedData: function renderedData(reportState, fiscalYearStartMonth, isTable, limit, expanded) {\n        var sortMethod = this.get('legendSort');\n        var data = this.budgetData.renderedData(reportState, fiscalYearStartMonth, isTable, expanded);\n        if (data.lines.length) {\n            if (limit) {\n                data.lines = this.limitRenderedData(data.lines);\n            }\n            // for versusViews, we always need fixed order for parent nodes, so skipping sort for those\n            // in case of balanceSheet, assets should always be displayed above liabilities\n            // in case of revenuesVersusExpenses, revenues should always be displayed above expeneses\n            if (!reportState.get('versusView')) {\n                data.lines = this.legendSortMethods[sortMethod](data.lines);\n            }\n            this.colorAssigner(data.lines);\n            _lodash2.default.each(data.sublines, _lodash2.default.bind(function (sublines, key, holder) {\n                holder[key] = this.legendSortMethods[sortMethod](sublines);\n                this.colorAssigner(sublines);\n            }, this));\n            if (limit && this.moreLine) {\n                data.lines.push(this.moreLine);\n            }\n            if (expanded) {\n                var recursiveExpander = function recursiveExpander(sublines, depth, line, index, group) {\n                    line.depth = depth;\n                    // Help store the expansion markers while we're iterating over the expansion groups\n                    line.expanded = !_lodash2.default.isEmpty(sublines[line.id]);\n                    line.fixed = !!data.fixed[line.id];\n                    line.lastExpanded = depth > 0 && index + 1 === group.length;\n                    // return our line plus the expanded lines below this one\n                    return [line].concat(_lodash2.default.map(sublines[line.id] || [], function () {\n                        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                            args[_key] = arguments[_key];\n                        }\n\n                        return recursiveExpander.apply(undefined, [sublines, depth + 1].concat(args));\n                    }));\n                };\n                data.expandedLines = _lodash2.default.map(data.lines, function () {\n                    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                        args[_key2] = arguments[_key2];\n                    }\n\n                    return recursiveExpander.apply(undefined, [data.sublines, 0].concat(args));\n                });\n                data.lines = _lodash2.default.flattenDeep(data.expandedLines);\n            }\n        }\n        return data;\n    },\n\n    // Change the currently displayed product and state of Athena.\n    // The call comes from summary_report.Athena.renderPackage\n    // Options expects an optional hash.\n    changeProduct: function changeProduct(product, options) {\n        options = options || {};\n        // Dismiss any error modals since they no longer apply once we change state.\n        this.recoverableErrorModal.close();\n        if (this.budgetData) {\n            var visibleAccounts = void 0;\n            if (product.technical_name === 'balance') {\n                visibleAccounts = ['assets', 'liabilities'];\n            } else if (product.properties.ledger_types) {\n                visibleAccounts = product.properties.ledger_types;\n            } else {\n                visibleAccounts = ['revenues', 'expenses', 'fteCount'];\n            }\n            this.breakdowns.reset(this.budgetData.breakdowns.filterByValidAggregations(visibleAccounts, true));\n            this.budgetData.setVisibleAccounts(visibleAccounts);\n        }\n        this.set('product', product);\n        this.changeState(options.hash);\n    },\n\n    /**\r\n    * this is called from this.changeProduct\r\n    * when URL params are updated, we call this method from summary_report.js Athena.updateParams\r\n    */\n    changeState: function changeState(state, defaults) {\n        this.pauseRendering();\n        defaults = defaults || this.defaultState(this.get('product'));\n        var aliases = this.stateAliases;\n        // Convert aliased states to their real names.\n        state = _lodash2.default.reduce(state, function (result, value, key) {\n            result[aliases[key] || key] = value;\n            return result;\n        }, {});\n        // Fill in any missing parameters with a default value.\n        _lodash2.default.defaults(state, defaults);\n        if (state.selection) {\n            this.loadSelection(state.selection);\n        } else {\n            this.budgetData.defaultSelectionState();\n        }\n        if (state.saved_view) {\n            var view = _saved_views_store2.default.findViewById(parseInt(state.saved_view));\n            if (view) {\n                _lodash2.default.defer(function () {\n                    _saved_view_actions2.default.selectView(view);\n                });\n            }\n        }\n        // If month is empty then use the most recent month.\n        // For example saved views do not capture the selected month.\n        // So when you load a saved view, the month value will be empty.\n        if (_lodash2.default.isEmpty(state.month)) {\n            state.month = this.budgetData.mostRecentMonthWithActuals();\n        }\n        if (!state.year) {\n            state.year = this.budgetData.mostRecentYearWithMonthlyActuals();\n        }\n        // this is a nesty fix for projections boolean coming from the URL, which is reflected as a String\n        state.projections = state.projections === true || state.projections === 'true';\n        this.set(_lodash2.default.pick(state, 'graphType', 'month', 'legendSort', 'saved_view', 'year', 'selectedDataSetIndex', 'projections', 'projectionType'));\n        this.resumeRendering();\n        if (this.budgetData) {\n            this.budgetData.triggerSelectionChange();\n        }\n    },\n    resetState: function resetState() {\n        return this.changeState({}, this.defaultState(this.get('product')));\n    },\n    defaultState: function defaultState() {\n        var defaults = this.report.get('properties');\n        var state = {};\n        state.selection = defaults.selection;\n        state.graphType = defaults.graph || this.defaults.graphType;\n        state.legendSort = defaults.sort_order || this.defaults.sortOrder;\n        state.selectedDataSetIndex = defaults.selected_data_set_index || this.defaults.selectedDataSetIndex;\n        state.projections = defaults.projections || this.defaults.projections;\n        state.projectionType = defaults.projectionType || this.defaults.projectionType;\n        state.saved_view = defaults.saved_view;\n        if (defaults.fiscal_year_range) {\n            state.fiscal_start = defaults.fiscal_year_range.start;\n            state.fiscal_end = defaults.fiscal_year_range.end;\n        }\n        return state;\n    },\n\n    // Load a selection of data using a stable lookup key.\n    // The next aggregations request will use this key so\n    // the transparency server can figure out the correct set\n    // of checked nodes to use for aggregating line data.\n    loadSelection: function loadSelection(selection) {\n        this.pendingSelection = selection;\n        this.set('selection', selection);\n    },\n\n    legendSortMethods: {\n        asc: function asc(lines) {\n            return _lodash2.default.sortBy(lines, 'average');\n        },\n        desc: function desc(lines) {\n            return _lodash2.default.sortBy(lines, 'average').reverse();\n        },\n        alpha: function alpha(lines) {\n            return _lodash2.default.sortBy(lines, 'name');\n        },\n        coa: function coa(lines) {\n            return _lodash2.default.sortBy(lines, 'order');\n        }\n    }\n});\n\n/***/ }),\n/* 506 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _runtime = __webpack_require__(24);\n\nvar _runtime2 = _interopRequireDefault(_runtime);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _templates = __webpack_require__(259);\n\nvar _templates2 = _interopRequireDefault(_templates);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_runtime2.default.registerHelper('let', function (options) {\n    for (var prop in options.hash) {\n        this[prop] = options.hash[prop];\n    }\n});\n_runtime2.default.registerHelper('unless_eq', function (a, b, options) {\n    if (a !== b) {\n        return options.fn(this);\n    }\n});\n_runtime2.default.registerHelper('eq', function (a, b, options) {\n    if (a === b) {\n        return options.fn(this);\n    }\n});\n_runtime2.default.registerHelper('asset_path', function (asset) {\n    return (0, _asset_helpers.assetPath)(asset);\n});\n_runtime2.default.registerHelper('get', function () {\n    var key = void 0;\n    var value = arguments[0];\n    var i = 1;\n    var len = arguments.length - 1;\n    for (; i < len; ++i) {\n        key = arguments[i];\n        if (key < 0 && _lodash2.default.isArray(value)) {\n            key = value.length + key;\n        }\n        value = value[key];\n    }\n    return value;\n});\n_runtime2.default.registerHelper('currency', function (object) {\n    return '$' + _underscore2.default.numberFormat(object, 2);\n});\n_runtime2.default.registerHelper('currencyNoDollars', function (object) {\n    return _strings2.default.currencyNoDollar(object);\n});\n_runtime2.default.registerHelper('percentage', function (object) {\n    return _strings2.default.percentage(object);\n});\n_runtime2.default.registerHelper('template', function (name, data_id) {\n    var id = arguments.length > 2 ? name + '__' + data_id : name;\n    var templateId = id ? ' id=\"template-' + id + '\"' : '';\n    var templateContent = '';\n    var placeHolderDiv = '<div' + templateId + '>' + templateContent + '</div>';\n    return new _runtime2.default.SafeString(placeHolderDiv);\n});\n_runtime2.default.registerHelper('render', function (name) {\n    var template = _templates2.default['athena/' + name];\n    return new _runtime2.default.SafeString(template(this));\n});\n// Iterator that wraps each item in an object with the following fields\n//    isLast\n//    isOdd\n//    data\n_runtime2.default.registerHelper('metaDataEach', function (items, options) {\n    var buffer = [];\n    var wrap = {};\n    for (var i = 0, len = items.length; i < len; ++i) {\n        wrap.isLast = i === len - 1;\n        wrap.isOdd = i % 2 !== 0;\n        wrap.data = items[i];\n        buffer.push(options.fn(wrap));\n    }\n    return buffer.join('');\n});\n\n/***/ }),\n/* 507 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HandlebarsEnvironment = HandlebarsEnvironment;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = __webpack_require__(79);\n\nvar _exception = __webpack_require__(143);\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _helpers = __webpack_require__(853);\n\nvar _decorators = __webpack_require__(861);\n\nvar _logger = __webpack_require__(863);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar VERSION = '4.1.2';\nexports.VERSION = VERSION;\nvar COMPILER_REVISION = 7;\n\nexports.COMPILER_REVISION = COMPILER_REVISION;\nvar REVISION_CHANGES = {\n  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n  2: '== 1.0.0-rc.3',\n  3: '== 1.0.0-rc.4',\n  4: '== 1.x.x',\n  5: '== 2.0.0-alpha.x',\n  6: '>= 2.0.0-beta.1',\n  7: '>= 4.0.0'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials, decorators) {\n  this.helpers = helpers || {};\n  this.partials = partials || {};\n  this.decorators = decorators || {};\n\n  _helpers.registerDefaultHelpers(this);\n  _decorators.registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n  constructor: HandlebarsEnvironment,\n\n  logger: _logger2['default'],\n  log: _logger2['default'].log,\n\n  registerHelper: function registerHelper(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple helpers');\n      }\n      _utils.extend(this.helpers, name);\n    } else {\n      this.helpers[name] = fn;\n    }\n  },\n  unregisterHelper: function unregisterHelper(name) {\n    delete this.helpers[name];\n  },\n\n  registerPartial: function registerPartial(name, partial) {\n    if (_utils.toString.call(name) === objectType) {\n      _utils.extend(this.partials, name);\n    } else {\n      if (typeof partial === 'undefined') {\n        throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n      }\n      this.partials[name] = partial;\n    }\n  },\n  unregisterPartial: function unregisterPartial(name) {\n    delete this.partials[name];\n  },\n\n  registerDecorator: function registerDecorator(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple decorators');\n      }\n      _utils.extend(this.decorators, name);\n    } else {\n      this.decorators[name] = fn;\n    }\n  },\n  unregisterDecorator: function unregisterDecorator(name) {\n    delete this.decorators[name];\n  }\n};\n\nvar log = _logger2['default'].log;\n\nexports.log = log;\nexports.createFrame = _utils.createFrame;\nexports.logger = _logger2['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4xLjInO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n/***/ }),\n/* 508 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar conversions = __webpack_require__(893);\n\nvar exports = {};\nmodule.exports = exports;\n\nfor (var func in conversions) {\n  // export rgb2hslRaw\n  exports[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  exports[from] = exports[from] || {};\n\n  exports[from][to] = exports[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n/***/ }),\n/* 509 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.FeatureLayerTypes = undefined;\n\nvar _LayerMapperMap;\n\nexports.getLayerForMapType = getLayerForMapType;\n\nvar _immutable = __webpack_require__(14);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _MapTypes$Bubble$conf = _map_constants.MapTypes.Bubble.configuration,\n    minBubbleRadius = _MapTypes$Bubble$conf.minBubbleRadius,\n    maxBubbleRadius = _MapTypes$Bubble$conf.maxBubbleRadius;\nvar FeatureLayerTypes = exports.FeatureLayerTypes = [_map_constants.MapTypes.Bubble.name, _map_constants.MapTypes.Point.name];\nfunction mapStateToCircleColor(state) {\n    var colorMap = state.getIn(['map', 'legendColorMap']);\n    var colorProperty = state.getIn(['visualization', 'breakdown']);\n    var transform = state.getIn(['visualization', 'currentMapType']) === _map_constants.MapTypes.Bubble.name && _map_constants.bubbleColorTransform;\n    var colorStops = _lodash2.default.reduce(colorMap[colorProperty], function (arr, color, label) {\n        var colorForPoint = transform ? transform(color) : color;\n        return arr.concat([[label, colorForPoint]]);\n    }, []);\n    return {\n        property: colorProperty,\n        type: 'categorical',\n        stops: colorStops\n    };\n}\nvar LayerMapperMap = (_LayerMapperMap = {}, _defineProperty(_LayerMapperMap, _map_constants.MapTypes.Bubble.name, function (state) {\n    return (0, _immutable.fromJS)({\n        id: 'feature-layer',\n        source: 'feature-source',\n        type: _map_constants.MapTypes.Bubble.layerType,\n        paint: {\n            'circle-radius': {\n                property: state.getIn(['visualization', 'mapAmountColumn']),\n                type: 'exponential',\n                base: 1,\n                stops: [[{ zoom: 0, value: state.getIn(['map', 'dataStats', 'minAmount']) }, minBubbleRadius], [{ zoom: 0, value: state.getIn(['map', 'dataStats', 'maxAmount']) }, maxBubbleRadius]]\n            },\n            'circle-blur': -0.8,\n            'circle-opacity': 1,\n            'circle-color': mapStateToCircleColor(state)\n        }\n    });\n}), _defineProperty(_LayerMapperMap, _map_constants.MapTypes.Point.name, function (state) {\n    return (0, _immutable.fromJS)({\n        id: 'feature-layer',\n        source: 'feature-source',\n        type: _map_constants.MapTypes.Point.layerType,\n        paint: {\n            // this makes circles larger as the user zooms from zoom 9 to zoom 20\n            'circle-radius': {\n                'base': 1.75,\n                'stops': [[9, 3], [20, 90]]\n            },\n            'circle-opacity': 0.8,\n            'circle-color': mapStateToCircleColor(state)\n        }\n    });\n}), _LayerMapperMap);\nfunction getLayerForMapType(mapType, state) {\n    var layerMapper = LayerMapperMap[mapType];\n    if (!layerMapper) {\n        return state;\n    }\n    return layerMapper(state);\n}\n\n/***/ }),\n/* 510 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {\n  if (true) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (a0) {\n      return (root['DateRange'] = factory(a0));\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"moment\"));\n  } else {\n    root['DateRange'] = factory(moment);\n  }\n}(this, function (moment) {\n\n//-----------------------------------------------------------------------------\n// Contstants\n//-----------------------------------------------------------------------------\n\n\n\nvar INTERVALS = {\n  year:   true,\n  month:  true,\n  week:   true,\n  day:    true,\n  hour:   true,\n  minute: true,\n  second: true\n};\n\n\n//-----------------------------------------------------------------------------\n// Date Ranges\n//-----------------------------------------------------------------------------\n\n/**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {(Moment|Date)} start Start of interval\n * @param {(Moment|Date)} end End of interval\n *//**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {!Array} range Array containing start and end dates.\n *//**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {!String} range String formatted as an IS0 8601 time interval\n */\nfunction DateRange(start, end) {\n  var parts;\n  var s = start;\n  var e = end;\n\n  if (arguments.length === 1 || end === undefined) {\n    if (typeof start === 'object' && start.length === 2) {\n      s = start[0];\n      e = start[1];\n    }\n    else if (typeof start === 'string') {\n      parts = start.split('/');\n      s = parts[0];\n      e = parts[1];\n    }\n  }\n\n  this.start = (s === null) ? moment(-8640000000000000) : moment(s);\n  this.end   = (e === null) ? moment(8640000000000000) : moment(e);\n}\n\n/**\n * Constructor for prototype.\n *\n * @type {DateRange}\n */\nDateRange.prototype.constructor = DateRange;\n\n/**\n * Deep clone range.\n *\n * @return {!DateRange}\n */\nDateRange.prototype.clone = function() {\n  return moment().range(this.start, this.end);\n};\n\n/**\n * Determine if the current interval contains a given moment/date/range.\n *\n * @param {(Moment|Date|DateRange)} other Date to check\n * @param {!boolean} exclusive True if the to value is exclusive\n *\n * @return {!boolean}\n */\nDateRange.prototype.contains = function(other, exclusive) {\n  var start = this.start;\n  var end   = this.end;\n\n  if (other instanceof DateRange) {\n    return start <= other.start && (end > other.end || (end.isSame(other.end) && !exclusive));\n  }\n  else {\n    return start <= other && (end > other || (end.isSame(other) && !exclusive));\n  }\n};\n\n/**\n * Determine if the current date range overlaps a given date range.\n *\n * @param {!DateRange} range Date range to check\n *\n * @return {!boolean}\n */\nDateRange.prototype.overlaps = function(range) {\n  return this.intersect(range) !== null;\n};\n\n/**\n * Determine the intersecting periods from one or more date ranges.\n *\n * @param {!DateRange} other A date range to intersect with this one\n *\n * @return {DateRange} Returns the intersecting date or `null` if the ranges do\n *                     not intersect\n */\nDateRange.prototype.intersect = function(other) {\n  var start = this.start;\n  var end   = this.end;\n\n  if ((start <= other.start) && (other.start < end) && (end < other.end)) {\n    return new DateRange(other.start, end);\n  }\n  else if ((other.start < start) && (start < other.end) && (other.end <= end)) {\n    return new DateRange(start, other.end);\n  }\n  else if ((other.start < start) && (start <= end) && (end < other.end)) {\n    return this;\n  }\n  else if ((start <= other.start) && (other.start <= other.end) && (other.end <= end)) {\n    return other;\n  }\n\n  return null;\n};\n\n/**\n * Merge date ranges if they intersect.\n *\n * @param {!DateRange} other A date range to add to this one\n *\n * @return {DateRange} Returns the new `DateRange` or `null` if they do not\n *                     overlap\n */\nDateRange.prototype.add = function(other) {\n  if (this.overlaps(other)) {\n    return new DateRange(moment.min(this.start, other.start), moment.max(this.end, other.end));\n  }\n\n  return null;\n};\n\n/**\n * Subtract one range from another.\n *\n * @param {!DateRange} other A date range to substract from this one\n *\n * @return {!Array<DateRange>}\n */\nDateRange.prototype.subtract = function(other) {\n  var start = this.start;\n  var end   = this.end;\n\n  if (this.intersect(other) === null) {\n    return [this];\n  }\n  else if ((other.start <= start) && (start < end) && (end <= other.end)) {\n    return [];\n  }\n  else if ((other.start <= start) && (start < other.end) && (other.end < end)) {\n    return [new DateRange(other.end, end)];\n  }\n  else if ((start < other.start) && (other.start < end) && (end <= other.end)) {\n    return [new DateRange(start, other.start)];\n  }\n  else if ((start < other.start) && (other.start < other.end) && (other.end < end)) {\n    return [new DateRange(start, other.start), new DateRange(other.end, end)];\n  }\n  else if ((start < other.start) && (other.start < end) && (other.end < end)) {\n    return [new DateRange(start, other.start), new DateRange(other.start, end)];\n  }\n};\n\n/**\n * Build a n array of dates.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n *                                    shorthand string (shorthands:\n *                                    http://momentjs.com/docs/#/manipulating/add/)\n * @param {!boolean} exclusive Indicate that the end of the range should not\n *                             be included in the iter.\n *\n * @return {!Array}\n */\nDateRange.prototype.toArray = function(by, exclusive) {\n  var acc = [];\n  this.by(by, function(unit) {\n    acc.push(unit);\n  }, exclusive);\n  return acc;\n};\n\n/**\n * Iterate over the date range by a given date range, executing a function\n * for each sub-range.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n *                                    shorthand string (shorthands:\n *                                    http://momentjs.com/docs/#/manipulating/add/)\n * @param {!DateRange~by} hollaback Callback\n * @param {!boolean} exclusive Indicate that the end of the range should not\n *                             be included in the iter.\n *\n * @return {DateRange} `this`\n */\nDateRange.prototype.by = function(range, hollaback, exclusive) {\n  if (typeof range === 'string') {\n    _byString.call(this, range, hollaback, exclusive);\n  }\n  else {\n    _byRange.call(this, range, hollaback, exclusive);\n  }\n  return this;\n};\n\n\n/**\n * Callback executed for each sub-range.\n *\n * @callback DateRange~by\n *\n * @param {!Moment} current Current moment object for iteration\n */\n\n/**\n * @private\n */\nfunction _byString(interval, hollaback, exclusive) {\n  var current = moment(this.start);\n\n  while (this.contains(current, exclusive)) {\n    hollaback.call(this, current.clone());\n    current.add(1, interval);\n  }\n}\n\n/**\n * @private\n */\nfunction _byRange(interval, hollaback, exclusive) {\n  var div = this / interval;\n  var l = Math.floor(div);\n\n  if (l === Infinity) { return; }\n  if (l === div && exclusive) {\n    l--;\n  }\n\n  for (var i = 0; i <= l; i++) {\n    hollaback.call(this, moment(this.start.valueOf() + interval.valueOf() * i));\n  }\n}\n\n/**\n * Date range formatted as an [ISO8601 Time\n * Interval](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals).\n *\n * @return {!String}\n */\nDateRange.prototype.toString = function() {\n  return this.start.format() + '/' + this.end.format();\n};\n\n/**\n * Date range in milliseconds. Allows basic coercion math of date ranges.\n *\n * @return {!number}\n */\nDateRange.prototype.valueOf = function() {\n  return this.end - this.start;\n};\n\n/**\n * Center date of the range.\n *\n * @return {!Moment}\n */\nDateRange.prototype.center = function() {\n  var center = this.start + this.diff() / 2;\n  return moment(center);\n};\n\n/**\n * Date range toDate\n *\n * @return {!Array<Date>}\n */\nDateRange.prototype.toDate = function() {\n  return [this.start.toDate(), this.end.toDate()];\n};\n\n/**\n * Determine if this date range is the same as another.\n *\n * @param {!DateRange} other Another date range to compare to\n *\n * @return {!boolean}\n */\nDateRange.prototype.isSame = function(other) {\n  return this.start.isSame(other.start) && this.end.isSame(other.end);\n};\n\n/**\n * The difference of the end vs start.\n *\n * @param {number} unit Unit of difference, if no unit is passed in\n *                      milliseconds are returned. E.g.: `\"days\"`, `\"months\"`,\n *                      etc...\n *\n * @return {!number}\n */\nDateRange.prototype.diff = function(unit) {\n  return this.end.diff(this.start, unit);\n};\n\n\n//-----------------------------------------------------------------------------\n// Moment Extensions\n//-----------------------------------------------------------------------------\n\n/**\n * Build a date range.\n *\n * @param {(Moment|Date)} start Start of range\n * @param {(Moment|Date)} end End of range\n *\n * @this {Moment}\n *\n * @return {!DateRange}\n */\nmoment.range = function(start, end) {\n  if (start in INTERVALS) {\n    return new DateRange(moment(this).startOf(start), moment(this).endOf(start));\n  }\n  else {\n    return new DateRange(start, end);\n  }\n};\n\n/**\n * Expose constructor\n *\n * @const\n */\nmoment.range.constructor = DateRange;\n\n/**\n * @deprecated\n */\nmoment.fn.range = moment.range;\n\n/**\n * Check if the current moment is within a given date range.\n *\n * @param {!DateRange} range Date range to check\n *\n * @this {Moment}\n *\n * @return {!boolean}\n */\nmoment.fn.within = function(range) {\n  return range.contains(this._d);\n};\n\n\n//-----------------------------------------------------------------------------\n// Export\n//-----------------------------------------------------------------------------\n\n\n\nreturn DateRange;\n\n}));\n\n\n/***/ }),\n/* 511 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.isCurrentUserOwner = isCurrentUserOwner;\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _search_utils = __webpack_require__(899);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isCurrentUserOwner(state) {\n    var sessionId = _session_store2.default.getSession().get('id');\n    var reportOwner = state.get('reportOwner');\n    return reportOwner.get('id') === sessionId;\n}\nvar InvitesStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return _immutable2.default.fromJS({\n            inviteeSearchQuery: '',\n            currentInvitedUsers: _immutable2.default.List(),\n            currentUser: _immutable2.default.Map(),\n            error: null,\n            invitableUsersById: _immutable2.default.OrderedMap(),\n            invitedUsers: _immutable2.default.OrderedSet(),\n            messageUsers: _immutable2.default.OrderedSet(),\n            reportRoles: _immutable2.default.OrderedMap(),\n            userReportRoles: _immutable2.default.OrderedMap(),\n            pendingUser: null,\n            activePanel: 'message',\n            message: '',\n            isNotificationOpen: false,\n            userPreferences: null,\n            isLoadingUsers: true,\n            reportOwner: _immutable2.default.Map()\n        });\n    },\n\n    actions: {\n        INVITABLE_USERS_LOADED: function INVITABLE_USERS_LOADED(state, _ref) {\n            var users = _ref.users;\n\n            var usersById = users.reduce(function (map, user) {\n                return map.set(user.id, _immutable2.default.fromJS(user));\n            }, _immutable2.default.OrderedMap());\n            var initialMessageUsers = [];\n            if (isCurrentUserOwner(state)) {\n                var reportOwner = state.get('reportOwner');\n                initialMessageUsers.push(reportOwner);\n                state = state.set('currentUser', reportOwner);\n            } else {\n                state = state.set('currentUser', _immutable2.default.Map());\n            }\n            return state.set('invitableUsersById', usersById).set('isLoadingUsers', false).set('messageUsers', _immutable2.default.OrderedSet(initialMessageUsers));\n        },\n        INVITED_USERS_LOADED: function INVITED_USERS_LOADED(state, _ref2) {\n            var invites = _ref2.invites;\n\n            var userReportRoles = invites.reduce(function (map, invite) {\n                return map.set(invite.id, _immutable2.default.fromJS({ userId: invite.id, role: invite.role }));\n            }, _immutable2.default.OrderedMap());\n            var userIds = userReportRoles.keySeq().toJSON();\n            return state.set('userReportRoles', _immutable2.default.OrderedMap(userReportRoles)).set('invitedUsers', _immutable2.default.OrderedSet(userIds)).set('currentInvitedUsers', _immutable2.default.List(_immutable2.default.fromJS(invites)));\n        },\n        REPORT_ROLES_LOADED: function REPORT_ROLES_LOADED(state, _ref3) {\n            var report_roles = _ref3.report_roles;\n\n            return state.set('reportRoles', _immutable2.default.fromJS(report_roles));\n        },\n        REPORT_INVITE_ROLE_UPDATED: function REPORT_INVITE_ROLE_UPDATED(state, _ref4) {\n            var invite = _ref4.invite;\n\n            return state.updateIn(['userReportRoles', invite.id], function (item) {\n                return item.set('role', invite.role);\n            });\n        },\n        REPORT_ADD_USER_ERROR: function REPORT_ADD_USER_ERROR(state, _ref5) {\n            var errorType = _ref5.errorType;\n\n            return state.set('pendingUser', null).set('error', errorType);\n        },\n        REPORT_UPDATE_ROLE_ERROR: function REPORT_UPDATE_ROLE_ERROR(state, _ref6) {\n            var errorType = _ref6.errorType;\n\n            return state.set('error', errorType);\n        },\n        REPORT_INVITE_DISMISS_ERROR: function REPORT_INVITE_DISMISS_ERROR(state) {\n            return state.set('error', null);\n        },\n        UPDATE_INVITEE_SEARCH_QUERY: function UPDATE_INVITEE_SEARCH_QUERY(state, _ref7) {\n            var query = _ref7.query;\n\n            return state.set('inviteeSearchQuery', query);\n        },\n        SET_USER_PREFERENCES: function SET_USER_PREFERENCES(state, _ref8) {\n            var userPreferences = _ref8.userPreferences;\n\n            return state.set('userPreferences', userPreferences);\n        },\n        ADD_USER_TO_MESSAGE_USERS: function ADD_USER_TO_MESSAGE_USERS(state, _ref9) {\n            var user = _ref9.user;\n\n            return state.update('messageUsers', function (users) {\n                return users.add(user);\n            }).set('inviteeSearchQuery', '');\n        },\n        ADD_ALL_USERS_TO_MESSAGE_USERS: function ADD_ALL_USERS_TO_MESSAGE_USERS(state) {\n            return state.set('messageUsers', state.get('currentInvitedUsers').toSeq().toOrderedSet().add(state.get('reportOwner'))).set('inviteeSearchQuery', '');\n        },\n        REMOVE_USER_FROM_MESSAGE_USERS: function REMOVE_USER_FROM_MESSAGE_USERS(state, _ref10) {\n            var user = _ref10.user;\n\n            return state.update('messageUsers', function (users) {\n                return users.delete(user);\n            });\n        },\n        ADDING_USER_TO_INVITES: function ADDING_USER_TO_INVITES(state, _ref11) {\n            var user = _ref11.user;\n\n            return state.set('inviteeSearchQuery', '').set('pendingUser', user);\n        },\n        ADD_USER_TO_INVITES: function ADD_USER_TO_INVITES(state, _ref12) {\n            var user = _ref12.user;\n\n            var userId = user.get('id');\n            var role = user.get('role');\n            return state.update('invitedUsers', function (users) {\n                return users.add(userId);\n            }).set('pendingUser', null).setIn(['userReportRoles', userId], _immutable2.default.fromJS({ role: role })).set('inviteeSearchQuery', '').update('currentInvitedUsers', function (users) {\n                return users.push(user);\n            });\n        },\n        REMOVE_USER_FROM_INVITES: function REMOVE_USER_FROM_INVITES(state, _ref13) {\n            var user = _ref13.user;\n\n            return state.update('invitedUsers', function (users) {\n                return users.remove(user.get('id'));\n            }).update('currentInvitedUsers', function (users) {\n                return users.filter(function (eachUser) {\n                    return eachUser.get('id') !== user.get('id');\n                });\n            });\n        },\n        REPORT_HEADER_SET_SHARE_PANEL: function REPORT_HEADER_SET_SHARE_PANEL(state, _ref14) {\n            var panel = _ref14.panel;\n\n            return state.set('activePanel', panel);\n        },\n        REPORT_SHARE_UPDATE_MESSAGE: function REPORT_SHARE_UPDATE_MESSAGE(state, _ref15) {\n            var message = _ref15.message;\n\n            return state.set('message', message);\n        },\n        REPORT_SHARE_SHOW_SENDING: function REPORT_SHARE_SHOW_SENDING(state) {\n            return state.set('isSendingMessage', true);\n        },\n        REPORT_SHARE_HIDE_SENDING: function REPORT_SHARE_HIDE_SENDING(state) {\n            return state.set('isSendingMessage', false);\n        },\n        REPORT_SHARE_RESET: function REPORT_SHARE_RESET(state) {\n            var messageUsers = [];\n            if (isCurrentUserOwner(state)) {\n                var reportOwner = state.get('reportOwner');\n                messageUsers.push(reportOwner);\n            }\n            return state.set('isSendingMessage', false).set('messageUsers', _immutable2.default.OrderedSet(messageUsers)).set('message', '');\n        },\n        REPORT_SHARE_OPEN_NOTIFICATION: function REPORT_SHARE_OPEN_NOTIFICATION(state) {\n            return state.set('isNotificationOpen', true);\n        },\n        REPORT_SHARE_CLOSE_NOTIFICATION: function REPORT_SHARE_CLOSE_NOTIFICATION(state) {\n            return state.set('isNotificationOpen', false);\n        },\n        SAVED_VIEW_CREATE_SUCCESS: function SAVED_VIEW_CREATE_SUCCESS() {\n            return InviteActions.openNotification();\n        },\n        REPORT_LOADED: function REPORT_LOADED(state, _ref16) {\n            var report = _ref16.report;\n\n            var reportOwner = report.get('owner');\n            reportOwner.full_name += ' (You)';\n            return state.set('reportOwner', _immutable2.default.fromJS(reportOwner));\n        }\n    },\n    getSearchResults: function getSearchResults() {\n        var users = this.getState().get('invitableUsersById');\n        var query = this.getState().get('inviteeSearchQuery');\n        var userArray = _lodash2.default.map(users.toJS(), function (u) {\n            return u;\n        });\n        var filteredUsers = (0, _search_utils.filterItems)(userArray, ['first_name', 'last_name', 'email'], query);\n        return _immutable2.default.fromJS(filteredUsers).valueSeq();\n    },\n    getInviteError: function getInviteError() {\n        return this.getState().get('error');\n    },\n    getReportRoles: function getReportRoles() {\n        return this.getState().get('reportRoles');\n    },\n    getPendingUser: function getPendingUser() {\n        return this.getState().get('pendingUser');\n    },\n    getInvitedUsers: function getInvitedUsers() {\n        var userIds = this.getState().get('invitedUsers');\n        var users = this.getState().get('invitableUsersById');\n        var userReportRoles = this.getState().get('userReportRoles');\n        if (users.isEmpty()) {\n            return _immutable2.default.OrderedSet();\n        }\n        return userIds.map(function (id) {\n            return users.get(id) ? users.get(id).set('reportRole', userReportRoles.get(id).get('role')) : null;\n        }).filter(function (id) {\n            return id !== null;\n        });\n    },\n    getCurrentInvitedUsers: function getCurrentInvitedUsers() {\n        return this.getState().get('currentInvitedUsers');\n    },\n    getCurrentUser: function getCurrentUser() {\n        return this.getState().get('currentUser');\n    },\n    getIsLoadingUsers: function getIsLoadingUsers() {\n        return this.getState().get('isLoadingUsers');\n    },\n    getMessage: function getMessage() {\n        return this.getState().get('message');\n    },\n    getMessageUsers: function getMessageUsers() {\n        return this.getState().get('messageUsers');\n    },\n    getIsSendingMessage: function getIsSendingMessage() {\n        return this.getState().get('isSendingMessage');\n    },\n    getUserPreferences: function getUserPreferences() {\n        return this.getState().get('userPreferences');\n    },\n    getIsNotificationOpen: function getIsNotificationOpen() {\n        return this.getState().get('isNotificationOpen');\n    }\n});\nexports.default = InvitesStore;\n\n/***/ }),\n/* 512 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar vizColorValueOrder = exports.vizColorValueOrder = {\n  300: [300, 700, 400, 800, 200, 600, 100, 500, 900],\n  400: [400, 600, 300, 800, 100, 700, 200, 500, 900],\n  500: [500, 100, 800, 200, 700, 300, 600, 900, 400],\n  600: [600, 200, 800, 300, 700, 100, 400, 900, 500]\n};\n\nvar vizColorHueOrder = exports.vizColorHueOrder = [\"opengov\", \"periwinkle\", \"orange\", \"yellow\", \"violet\", \"purple\", \"teal\", \"jade\", \"royal\", \"indigo\", \"ruby\", \"port\", \"cerulean\", \"turquoise\", \"red\", \"terracotta\", \"sage\", \"pear\", \"magenta\", \"rose\"];\n\nvar vizColor_hoverOpacity = exports.vizColor_hoverOpacity = 0.25;\nvar vizColor_hoverfilter = exports.vizColor_hoverfilter = \"grayscale(80%)\";\n\nvar vizColors = exports.vizColors = {\n  pear: {\n    50: \"#EBFFEE\",\n    100: \"#D7FADD\",\n    200: \"#B9EBC2\",\n    300: \"#9AD9A4\",\n    400: \"#77C785\",\n    500: \"#53B062\",\n    600: \"#3C964B\",\n    700: \"#257D34\",\n    800: \"#1A5924\",\n    900: \"#083B11\",\n    1000: \"#012608\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"magenta\"\n  },\n  sage: {\n    50: \"#EDFAF2\",\n    100: \"#DDF0E4\",\n    200: \"#C3E3D0\",\n    300: \"#A3D1B5\",\n    400: \"#88C29F\",\n    500: \"#74B28D\",\n    600: \"#549970\",\n    700: \"#3E7D57\",\n    800: \"#2E5C40\",\n    900: \"#20402D\",\n    1000: \"#172E20\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"rose\"\n  },\n  jade: {\n    50: \"#EBFCF7\",\n    100: \"#CBF5E8\",\n    200: \"#ADE0D0\",\n    300: \"#7CCFB4\",\n    400: \"#56BA9A\",\n    500: \"#2FA882\",\n    600: \"#1E8F6B\",\n    700: \"#147556\",\n    800: \"#0C573F\",\n    900: \"#033827\",\n    1000: \"#002418\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"ruby\"\n  },\n  teal: {\n    50: \"#EBF7F6\",\n    100: \"#D3F0ED\",\n    200: \"#B8E0DC\",\n    300: \"#9BD1CC\",\n    400: \"#79C9C1\",\n    500: \"#57B5AC\",\n    600: \"#3D9990\",\n    700: \"#2E8077\",\n    800: \"#21665E\",\n    900: \"#13453F\",\n    1000: \"#0A2925\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"jade\"\n  },\n  turquoise: {\n    50: \"#EBFCFC\",\n    100: \"#CEF3F5\",\n    200: \"#AEE4E5\",\n    300: \"#8BD4D6\",\n    400: \"#6DBFC2\",\n    500: \"#45AAAD\",\n    600: \"#299094\",\n    700: \"#1D7578\",\n    800: \"#0F595C\",\n    900: \"#033B3D\",\n    1000: \"#002021\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"red\"\n  },\n  cerulean: {\n    50: \"#E8F5FA\",\n    100: \"#D0EAF5\",\n    200: \"#B1D7E5\",\n    300: \"#97CADE\",\n    400: \"#7CBED9\",\n    500: \"#5FABC9\",\n    600: \"#4692B0\",\n    700: \"#367791\",\n    800: \"#275D73\",\n    900: \"#164152\",\n    1000: \"#0B242E\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"terracotta\"\n  },\n  opengov: {\n    50: \"#F0F7FF\",\n    100: \"#D9EBFF\",\n    200: \"#B4D6FA\",\n    300: \"#91C0F2\",\n    400: \"#75AEEB\",\n    500: \"#5B98D9\",\n    600: \"#4781BF\",\n    700: \"#2E6299\",\n    800: \"#1D4673\",\n    900: \"#0F2D4D\",\n    1000: \"#001933\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"yellow\"\n  },\n  periwinkle: {\n    50: \"#EBF0F7\",\n    100: \"#D8E1F0\",\n    200: \"#BED0ED\",\n    300: \"#A1BBE5\",\n    400: \"#82A3D9\",\n    500: \"#6A92D4\",\n    600: \"#5079BA\",\n    700: \"#3D6099\",\n    800: \"#2E4873\",\n    900: \"#1D3254\",\n    1000: \"#0C1E3B\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"orange\"\n  },\n  royal: {\n    50: \"#EDF0FF\",\n    100: \"#E0E6FF\",\n    200: \"#BDC9FF\",\n    300: \"#9DADF5\",\n    400: \"#7D90E3\",\n    500: \"#6579CF\",\n    600: \"#4C5FB5\",\n    700: \"#324494\",\n    800: \"#1C2A6B\",\n    900: \"#0D1A52\",\n    1000: \"#040D36\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"port\"\n  },\n  indigo: {\n    50: \"#EDEEFA\",\n    100: \"#E1E2F5\",\n    200: \"#CCCEF0\",\n    300: \"#B1B4DE\",\n    400: \"#979ACC\",\n    500: \"#797CB8\",\n    600: \"#5C5F99\",\n    700: \"#484B85\",\n    800: \"#3A3C6B\",\n    900: \"#292B4C\",\n    1000: \"#10112E\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"ruby\"\n  },\n  violet: {\n    50: \"#EFEBFF\",\n    100: \"#E6DEFF\",\n    200: \"#D4C8FA\",\n    300: \"#C0B1F2\",\n    400: \"#A492E0\",\n    500: \"#8D7ACC\",\n    600: \"#6F5DA8\",\n    700: \"#54438A\",\n    800: \"#3E2E73\",\n    900: \"#241554\",\n    1000: \"#110538\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"jade\"\n  },\n  purple: {\n    50: \"#F5EBFA\",\n    100: \"#ECD7F5\",\n    200: \"#E5C7F2\",\n    300: \"#CDABDB\",\n    400: \"#B38FC2\",\n    500: \"#A07BB0\",\n    600: \"#885F99\",\n    700: \"#6B477A\",\n    800: \"#543461\",\n    900: \"#3B2445\",\n    1000: \"#231429\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"teal\"\n  },\n  magenta: {\n    50: \"#FFE5F4\",\n    100: \"#FFCCE9\",\n    200: \"#F2B6D8\",\n    300: \"#E096C0\",\n    400: \"#C476A2\",\n    500: \"#B55E8F\",\n    600: \"#9C4174\",\n    700: \"#802458\",\n    800: \"#630F3F\",\n    900: \"#47062B\",\n    1000: \"#2E001A\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"periwinkle\"\n  },\n  rose: {\n    50: \"#FAEBEF\",\n    100: \"#FAD4DE\",\n    200: \"#EDBECA\",\n    300: \"#E09DAF\",\n    400: \"#CF7C92\",\n    500: \"#BD5E78\",\n    600: \"#9E465D\",\n    700: \"#7D3347\",\n    800: \"#632938\",\n    900: \"#4A1E2A\",\n    1000: \"#30141B\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"opengov\"\n  },\n  ruby: {\n    50: \"#FFE5E8\",\n    100: \"#FFD4D9\",\n    200: \"#FABBC2\",\n    300: \"#ED9AA2\",\n    400: \"#DE7882\",\n    500: \"#CC5E69\",\n    600: \"#B24954\",\n    700: \"#992F3A\",\n    800: \"#801B25\",\n    900: \"#660B14\",\n    1000: \"#4C0108\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"turquoise\"\n  },\n  port: {\n    50: \"#FFEBEB\",\n    100: \"#FFD5D4\",\n    200: \"#FABBB9\",\n    300: \"#EDA19F\",\n    400: \"#D98784\",\n    500: \"#C76E6B\",\n    600: \"#B85854\",\n    700: \"#994946\",\n    800: \"#783937\",\n    900: \"#5C2C2A\",\n    1000: \"#401E1D\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"cerulean\"\n  },\n  red: {\n    50: \"#FFECE8\",\n    100: \"#FFDAD1\",\n    200: \"#FABDAF\",\n    300: \"#F59D89\",\n    400: \"#E87E66\",\n    500: \"#E0694F\",\n    600: \"#D15336\",\n    700: \"#B23E24\",\n    800: \"#942A12\",\n    900: \"#6B1C0B\",\n    1000: \"#4C0E00\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"pear\"\n  },\n  terracotta: {\n    50: \"#FFEDE5\",\n    100: \"#FFDBCC\",\n    200: \"#FAC4AC\",\n    300: \"#F5A482\",\n    400: \"#ED8A5F\",\n    500: \"#E07446\",\n    600: \"#D16B3F\",\n    700: \"#B85830\",\n    800: \"#9C441F\",\n    900: \"#802F0D\",\n    1000: \"#662408\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"sage\"\n  },\n  orange: {\n    50: \"#FFEEDB\",\n    100: \"#FFE0BD\",\n    200: \"#FFCF99\",\n    300: \"#FABD78\",\n    400: \"#F0AB5D\",\n    500: \"#E59539\",\n    600: \"#DB831F\",\n    700: \"#C77110\",\n    800: \"#B06209\",\n    900: \"#995303\",\n    1000: \"#703C00\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"purple\"\n  },\n  yellow: {\n    50: \"#FFFAED\",\n    100: \"#FFF3D4\",\n    200: \"#FCE9B8\",\n    300: \"#F0DBA8\",\n    400: \"#E8CE8B\",\n    500: \"#E3C476\",\n    600: \"#D9B55B\",\n    700: \"#BF9E49\",\n    800: \"#B29240\",\n    900: \"#8F773B\",\n    1000: \"#756233\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"violet\"\n  }\n};\n\n/***/ }),\n/* 513 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getUpdatedKeywords = exports.concatKeywords = exports.spliceKeywords = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//Creates the footer class with isEditingDefaultState\nvar spliceKeywords = exports.spliceKeywords = function spliceKeywords(updateStateKeywords, deletedKeywords, keyword, reportId, action) {\n    if (_lodash2.default.includes(deletedKeywords, keyword)) {\n        var index = deletedKeywords.indexOf(keyword);\n        deletedKeywords.splice(index, 1);\n        updateStateKeywords(deletedKeywords, reportId, action);\n    }\n};\nvar concatKeywords = exports.concatKeywords = function concatKeywords(updateStateKeywords, assignedKeywords, keyword, reportId, action) {\n    if (!_lodash2.default.includes(assignedKeywords, keyword)) {\n        var updated = assignedKeywords.concat([keyword]);\n        updateStateKeywords(updated, reportId, action);\n    }\n};\nvar getUpdatedKeywords = exports.getUpdatedKeywords = function getUpdatedKeywords(reportId, assignedKeywords, addedKeywordsReportState, deletedKeywordsReportState) {\n    var updatedKeywords = assignedKeywords;\n    if (addedKeywordsReportState.reportId === reportId) {\n        updatedKeywords = _lodash2.default.uniq(addedKeywordsReportState.keywords);\n    }\n    if (deletedKeywordsReportState.reportId === reportId) {\n        updatedKeywords = _lodash2.default.difference(updatedKeywords, deletedKeywordsReportState.keywords);\n    }\n    return updatedKeywords;\n};\n\n/***/ }),\n/* 514 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _src = __webpack_require__(924);\n\nObject.keys(_src).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _src[key];\n    }\n  });\n});\n\nvar _ldclientJs = __webpack_require__(515);\n\nObject.keys(_ldclientJs).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _ldclientJs[key];\n    }\n  });\n});\n\n/***/ }),\n/* 515 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"initialize\", function() { return initialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"version\", function() { return version; });\nfunction createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var base64=createCommonjsModule(function(e,t){!function(){var e=t,n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";function r(e){this.message=e}r.prototype=new Error,r.prototype.name=\"InvalidCharacterError\",e.btoa||(e.btoa=function(e){for(var t,o,a=String(e),i=0,s=n,c=\"\";a.charAt(0|i)||(s=\"=\",i%1);c+=s.charAt(63&t>>8-i%1*8)){if((o=a.charCodeAt(i+=.75))>255)throw new r(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\");t=t<<8|o}return c}),e.atob||(e.atob=function(e){var t=String(e).replace(/[=]+$/,\"\");if(t.length%4==1)throw new r(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var o,a,i=0,s=0,c=\"\";a=t.charAt(s++);~a&&(o=i%4?64*o+a:a,i++%4)?c+=String.fromCharCode(255&o>>(-2*i&6)):0)a=n.indexOf(a);return c})}()}),_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function btoa(e){return base64.btoa(unescape(encodeURIComponent(e)))}function base64URLEncode(e){return btoa(e).replace(/=/g,\"\").replace(/\\+/g,\"-\").replace(/\\//g,\"_\")}function clone(e){return JSON.parse(JSON.stringify(e))}function onNextTick(e){setTimeout(e,0)}function wrapPromiseCallback(e,t){var n=e.then(function(e){return t&&setTimeout(function(){t(null,e)},0),e},function(e){if(!t)return Promise.reject(e);setTimeout(function(){t(e,null)},0)});return t?void 0:n}function transformValuesToVersionedValues(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]={value:e[n],version:0});return t}function chunkUserEventsForUrl(e,t){for(var n=t.slice(0),r=[],o=e,a=void 0;n.length>0;){for(a=[];o>0;){var i=n.shift();if(!i)break;(o-=base64URLEncode(JSON.stringify(i)).length)<0&&a.length>0?n.unshift(i):a.push(i)}o=e,r.push(a)}return r}function getLDUserAgentString(){return\"JSClient/2.4.0\"}function addLDHeaders(e){e.setRequestHeader(\"X-LaunchDarkly-User-Agent\",getLDUserAgentString())}function extend(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce(function(e,t){return _extends({},e,t)},{})}var MAX_URL_LENGTH=2e3;function EventSender(e,t,n,r){var o=void 0,a=e+\"/events/bulk/\"+t,i=e+\"/a/\"+t+\".gif\",s={};function c(e,t){var n=new Image;t&&n.addEventListener(\"load\",t),n.src=e}function u(e,t,n){var o=r||c,s=function(r){if(t){var s=new XMLHttpRequest;s.open(\"POST\",a,!n),addLDHeaders(s),s.setRequestHeader(\"Content-Type\",\"application/json\"),s.setRequestHeader(\"X-LaunchDarkly-Event-Schema\",\"3\"),n||s.addEventListener(\"load\",function(){r(function(e){var t={status:e.status},n=e.getResponseHeader(\"Date\");if(n){var r=Date.parse(n);r&&(t.serverTime=r)}return t}(s))}),s.send(JSON.stringify(e))}else{var c=i+\"?d=\"+base64URLEncode(JSON.stringify(e));o(c,n?null:r)}};if(!n)return new Promise(function(e){s(e)});s()}return s.sendEvents=function(t,r){void 0===o&&(o=void 0===n?\"withCredentials\"in new XMLHttpRequest:n);var a=void 0!==r&&r,i=void 0;i=o?[t]:chunkUserEventsForUrl(MAX_URL_LENGTH-e.length,t);for(var s=[],c=0;c<i.length;c++)s.push(u(i[c],o,a));return r?Promise.resolve():Promise.all(s)},s}function EventSummarizer(){var e={},t=0,n=0,r={};return e.summarizeEvent=function(e){if(\"feature\"===e.kind){var o=e.key+\":\"+(null!==e.variation&&void 0!==e.variation?e.variation:\"\")+\":\"+(null!==e.version&&void 0!==e.version?e.version:\"\"),a=r[o];a?a.count=a.count+1:r[o]={count:1,key:e.key,variation:e.variation,version:e.version,value:e.value,default:e.default},(0===t||e.creationDate<t)&&(t=e.creationDate),e.creationDate>n&&(n=e.creationDate)}},e.getSummary=function(){var e={},o=!0;for(var a in r){var i=r[a],s=e[i.key];s||(s={default:i.default,counters:[]},e[i.key]=s);var c={value:i.value,count:i.count};void 0!==i.variation&&null!==i.variation&&(c.variation=i.variation),i.version?c.version=i.version:c.unknown=!0,s.counters.push(c),o=!1}return o?null:{startDate:t,endDate:n,features:e}},e.clearSummary=function(){t=0,n=0,r={}},e}var docLink=\" Please see https://docs.launchdarkly.com/docs/js-sdk-reference#section-initializing-the-client for instructions on SDK initialization.\",localStorageUnavailable=function(){return\"localStorage is unavailable\"},unknownCustomEventKey=function(e){return'Custom event \"'+e+'\" does not exist'},environmentNotFound=function(){return\"environment not found.\"+docLink},environmentNotSpecified=function(){return\"No environment specified.\"+docLink},errorFetchingFlags=function(e){return\"Error fetching flag settings: \"+(e.message||e)},userNotSpecified=function(){return\"No user specified.\"+docLink},invalidUser=function(){return\"Invalid user specified.\"+docLink},deprecated=function(e,t){return'[LaunchDarkly] \"'+e+'\" is deprecated, please use \"'+t+'\"'},httpErrorMessage=function(e,t,n){return\"Received error \"+e+(401===e?\" (invalid SDK key)\":\"\")+\" for \"+t+\" - \"+(errors.isHttpErrorRecoverable(e)?n:\"giving up permanently\")};function UserFilter(e){var t={},n=void 0!==e.allAttributesPrivate?e.allAttributesPrivate:e.all_attributes_private,r=(void 0!==e.privateAttributeNames?e.privateAttributeNames:e.private_attribute_names)||[],o={key:!0,custom:!0,anonymous:!0},a={key:!0,secondary:!0,ip:!0,country:!0,email:!0,firstName:!0,lastName:!0,avatar:!0,name:!0,anonymous:!0,custom:!0};return void 0!==e.all_attributes_private&&console&&console.warn&&console.warn(deprecated(\"all_attributes_private\",\"allAttributesPrivate\")),void 0!==e.private_attribute_names&&console&&console.warn&&console.warn(deprecated(\"private_attribute_names\",\"privateAttributeNames\")),t.filterUser=function(e){if(!e)return null;var t=e.privateAttributeNames||[],i=function(e,a){return Object.keys(e).reduce(function(i,s){var c=i;return a(s)&&(!function(e){return!o[e]&&(n||-1!==t.indexOf(e)||-1!==r.indexOf(e))}(s)?c[0][s]=e[s]:c[1][s]=!0),c},[{},{}])},s=i(e,function(e){return a[e]}),c=s[0],u=s[1];if(e.custom){var l=i(e.custom,function(){return!0});c.custom=l[0],u=extend({},u,l[1])}var v=Object.keys(u);return v.length&&(v.sort(),c.privateAttrs=v),c},t}function createCustomError(e){function t(e,t){Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.message=e,this.code=t}return t.prototype=new Error,t.prototype.name=e,t.prototype.constructor=t,t}var LDUnexpectedResponseError=createCustomError(\"LaunchDarklyUnexpectedResponseError\"),LDInvalidEnvironmentIdError=createCustomError(\"LaunchDarklyInvalidEnvironmentIdError\"),LDInvalidUserError=createCustomError(\"LaunchDarklyInvalidUserError\"),LDInvalidEventKeyError=createCustomError(\"LaunchDarklyInvalidEventKeyError\"),LDInvalidArgumentError=createCustomError(\"LaunchDarklyInvalidArgumentError\"),LDFlagFetchError=createCustomError(\"LaunchDarklyFlagFetchError\");function isHttpErrorRecoverable(e){return!(e>=400&&e<500)||(408===e||429===e)}function EventProcessor(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o={},a=(arguments.length>4&&void 0!==arguments[4]?arguments[4]:null)||EventSender(e,t),i=EventSummarizer(),s=UserFilter(n),c=!!n.inlineUsersInEvents,u=[],l=void 0,v=void 0,d=0,f=!1,p=void 0;function g(e){onNextTick(function(){r&&r.maybeReportError(new LDInvalidArgumentError(e))})}function m(){return 0===v||0===Math.floor(Math.random()*v)}return void 0!==n.samplingInterval&&(isNaN(n.samplingInterval)||n.samplingInterval<0)?(v=0,g(\"Invalid sampling interval configured. Sampling interval must be an integer >= 0.\")):v=n.samplingInterval||0,void 0!==n.flushInterval&&(isNan(n.flushInterval)||n.flushInterval<2e3)?(l=2e3,g(\"Invalid flush interval configured. Must be an integer >= 2000 (milliseconds).\")):l=n.flushInterval||2e3,o.enqueue=function(e){if(!f){var t,n=!1,r=!1;if(i.summarizeEvent(e),\"feature\"===e.kind?m()&&(n=!!e.trackEvents,r=!!(t=e).debugEventsUntilDate&&t.debugEventsUntilDate>d&&t.debugEventsUntilDate>(new Date).getTime()):n=m(),n&&u.push(function(e){var t=extend({},e);return c||\"identify\"===e.kind?t.user=s.filterUser(e.user):(t.userKey=e.user.key,delete t.user),\"feature\"===e.kind&&(delete t.trackEvents,delete t.debugEventsUntilDate),t}(e)),r){var o=extend({},e,{kind:\"debug\"});delete o.trackEvents,delete o.debugEventsUntilDate,delete o.variation,u.push(o)}}},o.flush=function(e){if(f)return Promise.resolve();var t=u,n=i.getSummary();return i.clearSummary(),n&&(n.kind=\"summary\",t.push(n)),0===t.length?Promise.resolve():(u=[],a.sendEvents(t,e).then(function(e){e&&(e.serverTime&&(d=e.serverTime),isHttpErrorRecoverable(e.status)||(f=!0),e.status>=400&&onNextTick(function(){r.maybeReportError(new LDUnexpectedResponseError(httpErrorMessage(e.status,\"event posting\",\"some events were dropped\")))}))}))},o.start=function(){p=setTimeout(function e(){o.flush(),p=setTimeout(e,l)},l)},o.stop=function(){clearTimeout(p)},o}function EventEmitter(){var e={},t={};return e.on=function(e,n,r){t[e]=t[e]||[],t[e]=t[e].concat({handler:n,context:r})},e.off=function(e,n,r){if(t[e])for(var o=0;o<t[e].length;o++)t[e][o].handler===n&&t[e][o].context===r&&(t[e]=t[e].slice(0,o).concat(t[e].slice(o+1)))},e.emit=function(e){if(t[e])for(var n=0;n<t[e].length;n++)t[e][n].handler.apply(t[e][n].context,Array.prototype.slice.call(arguments,1))},e.maybeReportError=function(e){e&&(t[\"error\"]?this.emit(\"error\",e):console.error(e.message))},e}var matchOperatorsRe=/[|\\\\{}()[\\]^$+*?.]/g,escapeStringRegexp=function(e){if(\"string\"!=typeof e)throw new TypeError(\"Expected a string\");return e.replace(matchOperatorsRe,\"\\\\$&\")};function doesUrlMatch(e,t,n,r){var o=t.replace(n,\"\").replace(r,\"\"),a=void 0,i=void 0;switch(e.kind){case\"exact\":i=t,a=new RegExp(\"^\"+escapeStringRegexp(e.url)+\"/?$\");break;case\"canonical\":i=o,a=new RegExp(\"^\"+escapeStringRegexp(e.url)+\"/?$\");break;case\"substring\":i=o,a=new RegExp(\".*\"+escapeStringRegexp(e.substring)+\".*$\");break;case\"regex\":i=o,a=new RegExp(e.pattern);break;default:return!1}return a.test(i)}function findGoalsForClick(e,t){for(var n=[],r=0;r<t.length;r++)for(var o=e.target,a=t[r],i=a.selector,s=document.querySelectorAll(i);o&&s.length>0;){for(var c=0;c<s.length;c++)o===s[c]&&n.push(a);o=o.parentNode}return n}function GoalTracker(e,t){for(var n={},r=null,o=[],a=0;a<e.length;a++)for(var i=e[a],s=i.urls||[],c=0;c<s.length;c++)if(doesUrlMatch(s[c],location.href,location.search,location.hash)){\"pageview\"===i.kind?t(\"pageview\",i):(o.push(i),t(\"click_pageview\",i));break}return o.length>0&&(r=function(e){for(var n=findGoalsForClick(e,o),r=0;r<n.length;r++)t(\"click\",n[r])},document.addEventListener(\"click\",r)),n.dispose=function(){document.removeEventListener(\"click\",r)},n}function Store(e,t,n){var r={};function o(){var r=\"\",o=n.getUser();return o&&(r=t||btoa(JSON.stringify(o))),\"ld:\"+e+\":\"+r}return r.loadFlags=function(){var e=o(),t=void 0,n=void 0;try{t=localStorage.getItem(e)}catch(e){return console.warn(localStorageUnavailable()),null}try{n=JSON.parse(t)}catch(e){return r.clearFlags(),null}if(n){var a=n.$schema;(void 0===a||a<1)&&(n=transformValuesToVersionedValues(n))}return n},r.saveFlags=function(e){var t=o(),n=extend({},e,{$schema:1});try{localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn(localStorageUnavailable())}},r.clearFlags=function(){var e=o();try{localStorage.removeItem(e)}catch(e){}},r}function Stream(e,t,n,r){var o={},a=e+\"/eval/\"+t+\"/\",i=null;return o.connect=function(o,s){if(\"undefined\"!=typeof EventSource){var c=void 0;for(var u in r?c=e+\"/ping/\"+t:(c=a+base64URLEncode(JSON.stringify(o)),null!==n&&void 0!==n&&(c=c+\"?h=\"+n)),i=new window.EventSource(c),s)s.hasOwnProperty(u)&&i.addEventListener(u,s[u])}},o.disconnect=function(){i&&i.close()},o.isConnected=function(){return i&&(i.readyState===EventSource.OPEN||i.readyState===EventSource.CONNECTING)},o}var json=\"application/json\";function fetchJSON(e,t,n){var r=new XMLHttpRequest;return r.addEventListener(\"load\",function(){200===r.status&&r.getResponseHeader(\"Content-type\")&&0===r.getResponseHeader(\"Content-Type\").lastIndexOf(json)?n(null,JSON.parse(r.responseText)):n(getResponseError(r))}),r.addEventListener(\"error\",function(){n(getResponseError(r))}),t?(r.open(\"REPORT\",e),r.setRequestHeader(\"Content-Type\",\"application/json\"),addLDHeaders(r),r.send(JSON.stringify(t))):(r.open(\"GET\",e),addLDHeaders(r),r.send()),r}function getResponseError(e){return 404===e.status?new LDInvalidEnvironmentIdError(environmentNotFound()):e.statusText}function Requestor(e,t,n){var r=void 0,o=void 0,a={fetchFlagSettings:function(a,i,s){var c=void 0,u=void 0,l=void 0,v=void 0;n?(u=[e,\"/sdk/evalx/\",t,\"/user\",i?\"?h=\"+i:\"\"].join(\"\"),l=a):(c=base64URLEncode(JSON.stringify(a)),u=[e,\"/sdk/evalx/\",t,\"/users/\",c,i?\"?h=\"+i:\"\"].join(\"\"));var d,f,p=(d=s,function(e,t){d(e,t),r=null,o=null});r?(r.abort(),f=o,v=function(){f&&f.apply(null,arguments),p.apply(null,arguments)}):v=p,o=v,r=fetchJSON(u,l,v)},fetchGoals:function(n){fetchJSON([e,\"/sdk/goals/\",t].join(\"\"),null,n)}};return a}function sanitizeUser(e){var t=clone(e);return t.key&&(t.key=t.key.toString()),t}function Identity(e,t){var n={},r=void 0;return n.setUser=function(e){r=sanitizeUser(e),t(clone(r))},n.getUser=function(){return r?clone(r):null},e&&n.setUser(e),n}var _typeof=\"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},readyEvent=\"ready\",changeEvent=\"change\",goalsEvent=\"goalsReady\",locationWatcherInterval=300;function initialize(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.baseUrl||\"https://app.launchdarkly.com\",o=n.eventsUrl||\"https://events.launchdarkly.com\",a=n.streamUrl||\"https://clientstream.launchdarkly.com\",i=n.hash,s=void 0===n.sendEvents||n.sendEvents,c=!!n.allowFrequentDuplicateEvents,u=!!n.sendEventsOnlyForVariation,l=e,v=EventEmitter(),d=Stream(a,l,i,n.useReport),f=n.eventProcessor||EventProcessor(o,l,n,v),p=Requestor(r,l,n.useReport),g={},m=\"object\"===_typeof(n.bootstrap)?transformValuesToVersionedValues(n.bootstrap):{},h=void 0,y=void 0,E=void 0,k=void 0,b=!0;function w(){return s&&!function(){var e=void 0;e=navigator&&void 0!==navigator.doNotTrack?navigator.doNotTrack:navigator&&void 0!==navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack;return\"1\"===e||\"yes\"===e}()}function S(e){e.user?(b=!1,w()&&f.enqueue(e)):b&&(console&&console.warn&&console.warn(\"Be sure to call `identify` in the LaunchDarkly client: http://docs.launchdarkly.com/docs/running-an-ab-test#include-the-client-side-snippet\"),b=!1)}var L=Identity(t,function(e){e&&S({kind:\"identify\",key:e.key,user:e,creationDate:(new Date).getTime()})}),U=Store(l,i,L);function D(e,t,n){var r=L.getUser(),o=new Date;if(!c){var a=JSON.stringify(t)+(r&&r.key?r.key:\"\")+e,i=g[a];if(i&&o-i<3e5)return;g[a]=o}var s={kind:\"feature\",key:e,user:r,value:t,default:n,creationDate:o.getTime()},u=m[e];u&&(s.version=u.flagVersion?u.flagVersion:u.version,s.variation=u.variation,s.trackEvents=u.trackEvents,s.debugEventsUntilDate=u.debugEventsUntilDate),S(s)}function R(e,t){var n={kind:e,key:t.key,data:null,url:window.location.href,user:L.getUser(),creationDate:(new Date).getTime()};return\"click\"===e&&(n.selector=t.selector),S(n)}function N(e,t,n){var r=void 0;return r=m&&m.hasOwnProperty(e)&&m[e]&&!m[e].deleted?null===m[e].value?t:m[e].value:t,n&&D(e,r,t),r}function x(){L.getUser()&&(d.disconnect(),d.connect(L.getUser(),{ping:function(){p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),F(t)})},put:function(e){F(JSON.parse(e.data))},patch:function(e){var t=JSON.parse(e.data),n=m[t.key];if(!n||!n.version||!t.version||n.version<t.version){var r={},o=extend({},t);delete o.key,m[t.key]=o,r[t.key]=n?{previous:n.value,current:t.value}:{current:t.value},T(r)}},delete:function(e){var t=JSON.parse(e.data);if(!m[t.key]||m[t.key].version<t.version){var n={};m[t.key]&&!m[t.key].deleted&&(n[t.key]={previous:m[t.key].value}),m[t.key]={version:t.version,deleted:!0},T(n)}}}))}function F(e){var t={};if(e){for(var n in m)m.hasOwnProperty(n)&&m[n]&&(e[n]&&e[n].value!==m[n].value?t[n]={previous:m[n].value,current:e[n].value}:e[n]&&!e[n].deleted||(t[n]={previous:m[n].value}));for(var r in e)e.hasOwnProperty(r)&&e[r]&&(!m[r]||m[r].deleted)&&(t[r]={current:e[r].value});m=e,T(t)}}function T(e){var t=Object.keys(e);y&&U.saveFlags(m),t.length>0&&(t.forEach(function(t){v.emit(changeEvent+\":\"+t,e[t].current,e[t].previous)}),v.emit(changeEvent,e),u||t.forEach(function(t){D(t,e[t].current)}))}function I(){h&&h.dispose(),E&&E.length&&(h=GoalTracker(E,R))}function O(){s&&f.start()}e||onNextTick(function(){v.maybeReportError(new LDInvalidEnvironmentIdError(environmentNotSpecified()))}),t?t.key||onNextTick(function(){v.maybeReportError(new LDInvalidUserError(invalidUser()))}):onNextTick(function(){v.maybeReportError(new LDInvalidUserError(userNotSpecified()))}),\"object\"===_typeof(n.bootstrap)?onNextTick(function(){v.emit(readyEvent)}):\"string\"==typeof n.bootstrap&&\"LOCALSTORAGE\"===n.bootstrap.toUpperCase()&&localStorage?(y=!0,null===(m=U.loadFlags())?(m={},p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),t?(m=t,U.saveFlags(m)):m={},v.emit(readyEvent)})):(onNextTick(function(){v.emit(readyEvent)}),p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),t&&U.saveFlags(t)}))):p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),m=t||{},v.emit(readyEvent)}),p.fetchGoals(function(e,t){e&&v.maybeReportError(new LDUnexpectedResponseError((e.message,e.message))),t&&t.length>0&&(h=GoalTracker(E=t,R),function(e,t){var n=location.href,r=void 0;function o(){(r=location.href)!==n&&(n=r,t())}!function e(t,n){t(),setTimeout(function(){e(t,n)},n)}(o,e),window.history&&history.pushState?window.addEventListener(\"popstate\",o):window.addEventListener(\"hashchange\",o)}(locationWatcherInterval,I)),v.emit(goalsEvent)}),\"complete\"!==document.readyState?window.addEventListener(\"load\",O):O(),window.addEventListener(\"beforeunload\",function(){s&&(f.stop(),f.flush(!0))}),window.addEventListener(\"message\",function(e){if(e.origin===r&&\"SYN\"===e.data.type){window.editorClientBaseUrl=r;var t=document.createElement(\"script\");t.type=\"text/javascript\",t.async=!0,t.src=r+e.data.editorClientUrl;var n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(t,n)}});var C=new Promise(function(e){var t=v.on(readyEvent,function(){v.off(readyEvent,t),e()})}),P=new Promise(function(e){var t=v.on(goalsEvent,function(){v.off(goalsEvent,t),e()})});return{waitUntilReady:function(){return C},waitUntilGoalsReady:function(){return P},identify:function(e,t,n){return y&&U.clearFlags(),wrapPromiseCallback(new Promise(function(n,r){if(e&&null!==e.key&&void 0!==e.key)L.setUser(e),p.fetchFlagSettings(L.getUser(),t,function(e,t){if(e)return v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),r(e);t&&F(t),n(t),k&&x()});else{var o=new LDInvalidUserError(e?invalidUser():userNotSpecified());v.maybeReportError(o),r(o)}}),n)},variation:function(e,t){return N(e,t,!0)},track:function(e,t){\"string\"==typeof e?(E&&!function(e){if(!E||0===E.length)return!1;for(var t=0;t<E.length;t++)if(\"custom\"===E[t].kind&&E[t].key===e)return!0;return!1}(e)&&console.warn(unknownCustomEventKey(e)),S({kind:\"custom\",key:e,data:t,user:L.getUser(),url:window.location.href,creationDate:(new Date).getTime()})):v.maybeReportError(new LDInvalidEventKeyError(unknownCustomEventKey(e)))},on:function(e,t,n){e.substr(0,changeEvent.length)===changeEvent?(k=!0,d.isConnected()||x(),v.on.apply(v,[e,t,n])):v.on.apply(v,Array.prototype.slice.call(arguments))},off:function(e){e===changeEvent&&(k=!0)&&(k=!1,d.disconnect()),v.off.apply(v,Array.prototype.slice.call(arguments))},flush:function(e){return wrapPromiseCallback(new Promise(function(e){return s?e(f.flush()):e()},e))},allFlags:function(){var e={};if(!m)return e;for(var t in m)m.hasOwnProperty(t)&&(e[t]=N(t,null,!u));return e}}}var version=\"2.4.0\";function deprecatedInitialize(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return console&&console.warn&&console.warn(deprecated(\"default export\",\"named LDClient export\")),initialize(e,t,n)}var index={initialize:deprecatedInitialize,version:version};/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n//# sourceMappingURL=ldclient.es.js.map\n\n\n/***/ }),\n/* 516 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* global Slick */\n\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _config = __webpack_require__(146);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_backbone2.default.$ = window.jQuery = _jquery2.default;\n\n__webpack_require__(929);\n__webpack_require__(930);\n__webpack_require__(933);\n__webpack_require__(934);\n__webpack_require__(935);\n__webpack_require__(936);\n__webpack_require__(937);\n__webpack_require__(938);\n__webpack_require__(939);\n__webpack_require__(940);\nvar defaultGridOptions = {\n    enableColumnReorder: true,\n    // For now force only a single column to be sorted to avoid out-of-index sorting\n    multiColumnSort: false,\n    syncColumnCellResize: true,\n    enableAddRow: false,\n    editable: false,\n    enableCellNavigation: true,\n    asyncEditorLoading: false,\n    autoEdit: false,\n    // prevent flashing of white background while scrolling fast\n    forceSyncScrolling: true,\n    rowHeight: 42\n};\nvar defaultOptions = {\n    defaultMinWidth: 40,\n    cellPadding: 40,\n    characterWidth: 7,\n    autoWidth: false,\n    showDropdown: true,\n    sendVisibleFieldsOnly: false\n};\nfunction annotateSlickgridColumns(columns, locale) {\n    return _lodash2.default.map(columns, function (x) {\n        return _lodash2.default.extend({}, x, {\n            id: x.id || x.name,\n            field: x.field || x.name,\n            name: x.label || x.name,\n            sortable: true,\n            formatter: _utils2.default.getFormatter(x, locale),\n            cssClass: x.type === 'monetary' || x.type === 'numeric' ? 'numericalData' : ''\n            //type is inherited (text, numeric, monetary)\n        });\n    });\n}\n/** @class Griddle\r\n    @extends SlickGrid */\nfunction griddle(options, locale) {\n    options.container = (0, _jquery2.default)(options.container);\n    options.gridOptions = _lodash2.default.extend({}, defaultGridOptions, options.gridOptions);\n    var grid = new Slick.Grid(options.container, options.loader.data, options.columns, options.gridOptions);\n    // slap it onto the slick.grid black box\n    grid.locale = locale;\n    _lodash2.default.extend(grid, _backbone2.default.Events, GridPrototype);\n    grid.initialize(options, locale);\n    return grid;\n}\nvar GridPrototype =\n/** @lends Grid# */\n{\n    initialize: function initialize(options, locale) {\n        this.options = _lodash2.default.extend({}, defaultOptions, options);\n        this.loader = options.loader;\n        this.queryModel = options.queryModel;\n        this._slickEvents = {};\n        //store the required columns\n        this.requiredColumns = [];\n        this.setAllColumns(options.columns, locale);\n        _lodash2.default.bindAll(this, 'handleSort', 'handleDataLoaded', 'handleQueryChange', 'handleColumnsReordered', 'handleColumnsResized', 'handleBodyClicked');\n        // show tooltip for a cell when content is too wide\n        this.registerPlugin(new Slick.AutoTooltips({ enableForHeaderCells: true }));\n        // Allow to select and copy cells\n        // Do not enable on touch devices as it prevents scrolling, detection condition taken from Modernizr\n        // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js\n        if (!('ontouchstart' in window || window.DocumentTouch && document instanceof DocumentTouch)) {\n            this.setSelectionModel(new Slick.CellSelectionModel());\n            this.registerPlugin(new Slick.CellExternalCopyManager());\n        } else {\n            // set dummy selection model for touch devices so that slickgrid does not throw exceptions when a selection model is missing\n            this.setSelectionModel({\n                init: function init() {},\n                destroy: function destroy() {},\n\n                onSelectedRangesChanged: new Slick.Event(),\n                setSelectedRanges: function setSelectedRanges() {},\n                getSelectedRanges: function getSelectedRanges() {\n                    return [];\n                }\n            });\n        }\n        // When user clicks on header to changes sorting then update query model\n        this.onSort.subscribe(this.handleSort);\n        // Track column order when user reorders them with dragging\n        this.onColumnsReordered.subscribe(this.handleColumnsReordered);\n        // handle when columns are resized to apply width adjustments\n        this.onColumnsResized.subscribe(this.handleColumnsResized);\n        // Re-render when data is loaded\n        this.loader.on('loaded', this.handleDataLoaded);\n        // Update columns when query changes\n        this.queryModel.on('change', this.handleQueryChange);\n        (0, _jquery2.default)('body').on('click', this.handleBodyClicked);\n        this.listenTo(this, 'selectedRowsChanged', this.handleSelectedRowsChanged, this);\n        this.listenTo(this, 'dropdownOpened', this.handleDropdownOpened, this);\n        this.setColumns(this.getVisibleColumns());\n    },\n    destroy: function destroy() {\n        Slick.Grid.grid.prototype.destroy.call(this);\n        (0, _jquery2.default)('body').off('click', this.handleBodyClicked);\n        this.stopListening();\n    },\n    handleBodyClicked: function handleBodyClicked(ev) {\n        // deselect rows when outside of the grid is clicked\n        if (!(0, _jquery2.default)(ev.target).parents().addBack().is(this.getContainerNode())) {\n            this.deselectRows();\n        }\n        // hide dropdown if user clicks outside\n        if (this.currentDropdown && (!this.currentDropdown.isInsideClicked || !this.currentDropdown.isInsideClicked(ev))) {\n            this.trigger('dropdownOpened', null);\n        }\n    },\n    handleSelectedRowsChanged: function handleSelectedRowsChanged(ev, data) {\n        if (data.rows.length > 0) {\n            // user selected rows using drag, hide dropdowns\n            this.trigger('dropdownOpened', null);\n        }\n    },\n    handleDropdownOpened: function handleDropdownOpened(view) {\n        if (this.currentDropdown && this.currentDropdown !== view) {\n            this.currentDropdown.hideMenu();\n        }\n        this.currentDropdown = view;\n        // deselect rows when dropdown is opened\n        if (view !== null) {\n            this.deselectRows();\n        }\n    },\n    handleViewportChanged: function handleViewportChanged() {\n        var vp = this.getViewport();\n        this.loader.ensureData(vp.top, vp.bottom);\n    },\n    handleSort: function handleSort(e, args) {\n        var cols = args.sortCols;\n        if (!cols) {\n            // grid is in single sort mode\n            cols = [args];\n        }\n        _lodash2.default.each(cols, _lodash2.default.bind(function (x) {\n            var id = x.sortCol.id;\n            var query = this.queryModel.getColumnQuery(id);\n            var order = void 0;\n            switch (query.sort) {\n                case 'asc':\n                    order = 'desc';\n                    break;\n                case 'desc':\n                    order = '';\n                    break;\n                default:\n                    order = 'asc';\n            }\n            this.trigger('action', 'sort-' + order, id);\n            this.queryModel.sortColumn(id, order);\n        }, this));\n    },\n    handleDataLoaded: function handleDataLoaded() {\n        // when we get a first batch of data we compute column widths\n        var columns = this.getAllColumns();\n        var rowData = this.getData();\n        var firstRow = rowData && rowData[0];\n        if (this.options.autoWidth && columns && columns.length && !columns[0].autoWidth) {\n            this.computeColumnWidths(this.getData());\n            this.setColumns(this.getVisibleColumns());\n        }\n        var visibleColumns = this.getVisibleColumns();\n        var uploadColumnIndex = visibleColumns.findIndex(function (c) {\n            return c.id === '__GDAPI_UPLOAD_ID';\n        });\n        if (firstRow && firstRow.__gdapi_upload_id && uploadColumnIndex > -1) {\n            var newColumns = visibleColumns;\n            newColumns[uploadColumnIndex] = _extends({}, visibleColumns[uploadColumnIndex], {\n                field: visibleColumns[uploadColumnIndex].field.toLowerCase()\n            });\n            this.setColumns(newColumns);\n        }\n        var vp = this.getViewport();\n        // when we scroll more than there are available results, scroll back to display the results\n        if (vp.top >= this.getDataLength()) {\n            this.scrollRowIntoView(this.getDataLength() - 1, true);\n            // we scrolled too far away and have no data. lets clear and start from beginning\n            if (this.getDataLength() === 0) {\n                this.loader.clear();\n            }\n        }\n        this.invalidate();\n    },\n    handleQueryChange: function handleQueryChange() {\n        if (this.options.sendVisibleFieldsOnly) {\n            this.queryModel.fields(this.getVisibleColumns().map(function (column) {\n                return column.id;\n            }));\n        }\n        this.setSortColumns(_lodash2.default.map(this.queryModel.getSort(), function (x) {\n            for (var col in x) {\n                return {\n                    columnId: col,\n                    sortAsc: x[col] === 'asc'\n                };\n            }\n        }));\n        this.deselectRows();\n    },\n    handleColumnsReordered: function handleColumnsReordered() {\n        // Because columns can be reordered, we have to update the `columns`\n        // to reflect the new order, however we can't just take `grid.getColumns()`,\n        // as it does not include columns currently hidden by the picker.\n        // We create a new `columns` structure by leaving currently-hidden\n        // columns in their original ordinal position and interleaving the results\n        // of the current column sort.\n        var current = this.getColumns().slice(0);\n        var columns = this.fixedColumns;\n        var ordered = new Array(columns.length);\n        for (var i = 0; i < ordered.length; i++) {\n            if (_lodash2.default.isUndefined(this.getColumnIndex(columns[i].id))) {\n                // If the column doesn't return a value from getColumnIndex,\n                // it is hidden. Leave it in this position.\n                ordered[i] = columns[i];\n            } else {\n                // Otherwise, grab the next visible column.\n                ordered[i] = current.shift();\n            }\n        }\n        this.fixedColumns = ordered;\n        this.adjustHeader();\n        this.trigger('action', 'columns-reordered');\n    },\n    handleColumnsResized: function handleColumnsResized() {\n        _lodash2.default.each(this.getColumns(), _lodash2.default.bind(function (column) {\n            if (column.width !== column.previousWidth) {\n                // column has been resized by user, override automatically detected value\n                column.autoWidth = column.width;\n                // update querygrid's copy too\n                var col = _lodash2.default.find(this.fixedColumns, { id: column.id });\n                col.autoWidth = col.width = column.width;\n            }\n        }, this));\n        this.adjustHeader();\n    },\n\n    /** Resize columns to fill the grid viewport\r\n      * and make sure the grid header extend over scrollbar. */\n    adjustHeader: function adjustHeader() {\n        var container = (0, _jquery2.default)(this.getContainerNode());\n        var viewport = container.find('.slick-viewport').get(0);\n        var scrollbarWidth = viewport.offsetWidth - viewport.clientWidth;\n        var lastColumn = container.find('.slick-header-column:last');\n        var columns = this.getColumns();\n        // set minimum with to a width of content\n        _lodash2.default.each(columns, function (column) {\n            column.minWidth = column.autoWidth;\n        });\n        // let SlickGrid autosize the columns\n        this.autosizeColumns();\n        // extend last column header over scrollbar\n        lastColumn.width(lastColumn.width() + scrollbarWidth);\n        // set minWidth to default so that user can shrink columns\n        _lodash2.default.each(columns, _lodash2.default.bind(function (column) {\n            column.minWidth = this.options.defaultMinWidth;\n        }, this));\n    },\n\n    /** Go through rows of data and compute column widths to fit the content */\n    computeColumnWidths: function computeColumnWidths(data) {\n        /* jshint -W041 */\n        _lodash2.default.each(this.getAllColumns(), _lodash2.default.bind(function (column) {\n            var len = 0;\n            var count = 0;\n            var width = this.options.defaultMinWidth;\n            if (column.type === 'date') {\n                // optimization - date has always length of 10 - MM/DD/YYYY\n                len = 10;\n                count = 1;\n            } else {\n                // get average number of characters in data\n                for (var i = 0; data[i] != null; i += 1) {\n                    var value = data[i][column.id];\n                    if (value == null) {\n                        continue;\n                    }\n                    value = column.formatter(null, null, value);\n                    // discard short outliers with this condition\n                    if (value.length > 1) {\n                        count += 1;\n                        len += value.length;\n                    }\n                }\n            }\n            if (count > 0) {\n                // compute average with of column with padding\n                width = Math.floor(len / count * this.options.characterWidth) + this.options.cellPadding;\n            }\n            width = Math.max(width, column.label.length * this.options.characterWidth + this.options.cellPadding);\n            column.minWidth = this.options.defaultMinWidth;\n            column.width = column.autoWidth = width;\n        }, this));\n    },\n    deselectRows: function deselectRows() {\n        if (this.getSelectedRows().length > 0) {\n            this.setSelectedRows([]);\n        }\n    },\n    setAllColumns: function setAllColumns(columns, locale) {\n        columns = annotateSlickgridColumns(columns, locale);\n        var metaData = this.options.meta;\n        var requiredColumns = [];\n        var columnsByVisibility = _lodash2.default.groupBy(columns, function (column) {\n            //Set the isRequired field for checkbox\n            //if date column is computed, then exclude it from mandatory column\n            column.isRequired = column.id == metaData.date_column && column.computed ? false : column.id == metaData.amount_column || column.id == metaData.date_column;\n            if (column.isRequired && !_lodash2.default.includes(requiredColumns, column.id)) {\n                requiredColumns.push(column.id);\n            }\n            // Group invisible columns apart from the rest of the columns\n            if (_lodash2.default.includes(_config.GriddleSettings.ignoredFields, column.id)) {\n                return 'invisible';\n            }\n            return column.visible ? 'visible' : 'hidden';\n        });\n        this.requiredColumns = requiredColumns;\n        // Fix the position of any columns visible by default\n        this.fixedColumns = !!columnsByVisibility.visible ? columnsByVisibility.visible : [];\n        this.auxColumns = columnsByVisibility.hidden; // Would be more efficient as a set.. but we should be okay for now\n        this.invisibleColumns = columnsByVisibility.invisible;\n        this.setColumns(this.getVisibleColumns());\n        this.adjustHeader();\n        this.trigger('columnsVisibilityChanged');\n    },\n    getAllColumns: function getAllColumns() {\n        return _lodash2.default.union(this.fixedColumns, this.auxColumns);\n    },\n\n    /** Get only visible columns */\n    getVisibleColumns: function getVisibleColumns() {\n        return _lodash2.default.filter(this.fixedColumns, function (column) {\n            return column.visible;\n        });\n    },\n\n    //set visibility in the column data -> column.visible\n    setColumnVisibility: function setColumnVisibility(columnId) {\n        var column = void 0;\n        //disable toggle of the required column\n        if (_lodash2.default.includes(this.requiredColumns, columnId)) {\n            return;\n        }\n        column = _lodash2.default.find(this.fixedColumns, function (column) {\n            return columnId === column.id;\n        });\n        if (!column) {\n            column = _lodash2.default.remove(this.auxColumns, function (column) {\n                return columnId === column.id;\n            })[0];\n            this.fixedColumns.push(column);\n        }\n        column.visible = !column.visible;\n    },\n\n    //apply visibility in the grid\n    applyColumnVisibility: function applyColumnVisibility() {\n        this.setColumns(this.getVisibleColumns());\n        this.adjustHeader();\n        this.trigger('columnsVisibilityChanged');\n    },\n\n    //toggle the individual columns\n    toggleColumnVisibility: function toggleColumnVisibility(columnId) {\n        this.setColumnVisibility(columnId);\n        this.applyColumnVisibility();\n    },\n\n    //toggle the columns using the selectAll\n    //argument can be array of columns or array of columnIds\n    toggleAllColumnVisibility: function toggleAllColumnVisibility(columns) {\n        var grid = this;\n        _lodash2.default.each(columns, function (column) {\n            var columnId = column.id || column;\n            grid.setColumnVisibility(columnId);\n        });\n        this.applyColumnVisibility();\n    },\n    reorderColumns: function reorderColumns(columnIds) {\n        var unordered = this.fixedColumns;\n        var ordered = new Array(unordered.length);\n        for (var i = 0, length = unordered.length; i < length; i++) {\n            ordered[columnIds.indexOf(unordered[i].id)] = unordered[i];\n        }\n        this.fixedColumns = ordered;\n        this.adjustHeader();\n        this.trigger('columnsReordered');\n    },\n\n    // wrap Slickgrid to Backbone events interface\n    on: function on(name) {\n        var slickName = 'on' + _utils2.default.capitalize(name);\n        if (slickName in this && !(name in this._slickEvents)) {\n            // lazily bind slick events\n            var handler = _lodash2.default.bind(function () {\n                var args = [].slice.call(arguments);\n                args.unshift(name);\n                this.trigger.apply(this, args);\n            }, this);\n            this._slickEvents[name] = handler;\n            this[slickName].subscribe(handler);\n        }\n        _backbone2.default.Events.on.apply(this, arguments);\n    }\n};\nexports.default = griddle;\n\n/***/ }),\n/* 517 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar jQuery = __webpack_require__(9);\n\n/*!\n * jQuery UI Widget 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\tslice = Array.prototype.slice,\n\t_cleanData = $.cleanData;\n$.cleanData = function( elems ) {\n\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\ttry {\n\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t// http://bugs.jquery.com/ticket/8235\n\t\t} catch( e ) {}\n\t}\n\t_cleanData( elems );\n};\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n};\n\n$.widget.extend = function( target ) {\n\tvar input = slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t// 1.9 BC for #7810\n\t\t\t// TODO remove dual storage\n\t\t\t.removeData( this.widgetName )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\t// accept selectors, DOM elements\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^(\\w+)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\n})( jQuery );\n\n\n/***/ }),\n/* 518 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _templates = __webpack_require__(259);\n\nvar _templates2 = _interopRequireDefault(_templates);\n\nvar _bootstrapDatepicker = __webpack_require__(519);\n\nvar _bootstrapDatepicker2 = _interopRequireDefault(_bootstrapDatepicker);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @class HeaderMenu */\n\n//require('jquery.ui.position');\nfunction HeaderMenu(options) {\n    this.options = _lodash2.default.merge({\n        template: 'column',\n        container: (0, _jquery2.default)('body'),\n        features: {\n            filter: true,\n            sort: true,\n            filterBlanks: false,\n            hideColumn: true\n        }\n    }, options);\n    _lodash2.default.bindAll(this, 'handleHeaderCellRendered', 'handleBeforeHeaderCellDestroy', 'handleMenuClick', 'updateFilterIndicators', 'updateColumnFilterIndicator', 'handleOkClick', 'handleClearClick', 'handleClearInputClick', 'updateQueryState', 'hideMenu');\n}\n_lodash2.default.extend(HeaderMenu.prototype, _backbone2.default.Events,\n/** @lends HeaderMenu# */\n{\n    options: null,\n    grid: null,\n    queryModel: null,\n    handler: null,\n    currentColumn: null,\n    $menu: null,\n    $activeHeaderColumn: null,\n    handleOkClick: function handleOkClick() {\n        this.hideMenu();\n    },\n    handleClearClick: function handleClearClick() {\n        var q = this.queryModel.getQuery();\n        var col = this.currentColumn.id;\n        q.sort = _lodash2.default.filter(q.sort, function (x) {\n            return !(col in x);\n        });\n        delete q.filter[col];\n        this.queryModel.setQuery(q);\n        this.render();\n    },\n    handleClearInputClick: function handleClearInputClick(ev) {\n        ev.stopPropagation();\n        (0, _jquery2.default)(ev.currentTarget).prev('input').val('');\n        this.updateQueryState();\n    },\n\n    /** Creates element for a given column to be inserted into header element */\n    buttonFactory: function buttonFactory(column) {\n        return (0, _jquery2.default)('<div></div>').addClass('slick-header__menubutton').data('column', column);\n    },\n\n    /** Initialize the plugin, called by slickgrid when registering */\n    init: function init(grid) {\n        this.queryModel = this.options.queryModel;\n        this.grid = grid;\n        this.grid.on('headerCellRendered', this.handleHeaderCellRendered);\n        this.grid.on('beforeHeaderCellDestroy', this.handleBeforeHeaderCellDestroy);\n        // hide menu when dragging columns around\n        (0, _jquery2.default)(this.grid.getContainerNode()).find('.slick-header .ui-sortable').on('sortstart', this.hideMenu);\n        this.queryModel.on('change', this.handleQueryChanged, this);\n        // Force the grid to re-render the header now that the events are hooked up.\n        this.grid.setColumns(this.grid.getColumns(), true);\n        this.updateFilterIndicators();\n        this.queryModel.on('change', this.updateFilterIndicators);\n    },\n\n    /** Destroy the plugin, called by slickgrid */\n    destroy: function destroy() {\n        this.queryModel.off('change', this.updateFilterIndicators);\n    },\n\n    /** Hook to attach events when header is rendered\r\n        @protected */\n    handleHeaderCellRendered: function handleHeaderCellRendered(e, args) {\n        var self = this;\n        var $button = this.buttonFactory(args.column);\n        $button.appendTo(args.node);\n        (0, _jquery2.default)(args.node).on('contextmenu', function (ev) {\n            ev.preventDefault();\n            self.trigger('action', 'open-using-rightclick', args.column.id);\n            self.showMenu(ev, (0, _jquery2.default)(args.node).find('.slick-header__menubutton'));\n        }).on('click', function (ev) {\n            if (!(0, _jquery2.default)(ev.target).is('.slick-resizable-handle')) {\n                self.trigger('action', 'open-using-icon', args.column.id);\n                self.showMenu(ev, $button);\n            }\n        });\n        this.updateColumnFilterIndicator(args.node);\n    },\n\n    /** Hook to detach events when header is destroyed\r\n        @protected */\n    handleBeforeHeaderCellDestroy: function handleBeforeHeaderCellDestroy(e, args) {\n        var column = args.column;\n        if (column.header && column.header.menu) {\n            (0, _jquery2.default)(args.node).find('.slick-header__menubutton').remove();\n        }\n    },\n    isInsideClicked: function isInsideClicked(ev) {\n        return this.$menu && (0, _jquery2.default)(ev.target).parents().addBack().is(this.$menu);\n    },\n\n    /** Handle click on the menu. Runs associated actions.\r\n        @protected */\n    handleMenuClick: function handleMenuClick(ev) {\n        // handle other menu actions\n        var action = (0, _jquery2.default)(ev.currentTarget).data('action');\n        if (action) {\n            this.trigger('action', action, this.currentColumn.id);\n            if (action === 'sort-asc' || action === 'sort-desc' || action === 'sort-clear') {\n                var sort = action === 'sort-asc' ? 'asc' : action === 'sort-desc' ? 'desc' : '';\n                this.queryModel.beginUpdate();\n                this.updateQueryState();\n                this.queryModel.sortColumn(this.currentColumn.id, sort);\n                this.queryModel.endUpdate();\n            } else if (action === 'blank' || action === 'non-blank' || action === 'blank-clear') {\n                var blank = action === 'blank' ? true : action === 'non-blank' ? false : undefined;\n                this.queryModel.beginUpdate();\n                this.updateQueryState();\n                this.queryModel.filterColumn(this.currentColumn.id, 'null', blank);\n                this.queryModel.endUpdate();\n            }\n            if (action === 'hide') {\n                if (this.currentColumn.visible) {\n                    this.grid.toggleColumnVisibility(this.currentColumn.id);\n                    this.hideMenu();\n                }\n            } else if (action === 'ok') {\n                this.handleOkClick();\n            } else if (action === 'clear') {\n                this.handleClearClick();\n            }\n        }\n    },\n    handleQueryChanged: function handleQueryChanged() {\n        if (this.$menu) {\n            _lodash2.default.defer(_lodash2.default.bind(this.render, this));\n        }\n    },\n\n    /** Handle values from inputs when menu is getting hidden.\r\n        @protected */\n    updateQueryState: function updateQueryState() {\n        var locale = this.options.locale;\n        var m = (0, _moment2.default)();\n        m.locale(locale);\n        var format = m.localeData().longDateFormat(_utils2.default.DATE_FORMAT);\n        // A text filter can be either `eq` or `contains`\n        var pastFilter = this.queryModel._q.filter;\n        var pastOperator = void 0;\n        if (pastFilter) {\n            var filter = pastFilter[this.currentColumn.id];\n            if (filter) {\n                if (filter.hasOwnProperty('eq')) {\n                    pastOperator = 'eq';\n                }\n                if (filter.hasOwnProperty('contains')) {\n                    pastOperator = 'contains';\n                }\n            }\n        }\n        var val = void 0;\n        var from_val = void 0;\n        var to_val = void 0;\n        this.queryModel.beginUpdate();\n        from_val = this.$menu.find('.filter-from').val();\n        from_val = from_val ? _utils2.default.parseValue(from_val, this.currentColumn.type, format) : undefined;\n        to_val = this.$menu.find('.filter-to').val();\n        to_val = to_val ? _utils2.default.parseValue(to_val, this.currentColumn.type, format) : undefined;\n        val = from_val === to_val ? from_val : undefined;\n        this.queryModel.filterColumn(this.currentColumn.id, 'eq', val);\n        val = from_val !== to_val ? from_val : undefined;\n        this.queryModel.filterColumn(this.currentColumn.id, 'ge', val);\n        val = from_val !== to_val ? to_val : undefined;\n        this.queryModel.filterColumn(this.currentColumn.id, 'le', val);\n        if (this.currentColumn.type === 'text') {\n            val = this.$menu.find('.filter-search').val() || undefined;\n            if (pastOperator === 'eq') {\n                this.queryModel.filterColumn(this.currentColumn.id, 'eq', val);\n            } else {\n                this.queryModel.filterColumn(this.currentColumn.id, 'contains', val);\n            }\n        }\n        this.queryModel.endUpdate();\n    },\n\n    /** Update indication whether there is a filter on all columns */\n    updateFilterIndicators: function updateFilterIndicators() {\n        var self = this;\n        (0, _jquery2.default)(this.grid.getContainerNode()).find('.slick-header-column').each(function () {\n            self.updateColumnFilterIndicator(this);\n        });\n    },\n\n    /** Update indication whether there is a filter on a single column */\n    updateColumnFilterIndicator: function updateColumnFilterIndicator(el) {\n        var column = (0, _jquery2.default)(el).data('column');\n        var hasFilters = column && column.id !== undefined && !_lodash2.default.isEmpty(this.queryModel.getColumnQuery(column.id).filter);\n        (0, _jquery2.default)(el)[hasFilters ? 'addClass' : 'removeClass']('slick-header-column-has-filters');\n    },\n\n    /** Create the menu element */\n    createMenu: function createMenu() {\n        this.$menu = (0, _jquery2.default)(\"<div class='ui-dropdown__target ready'></div>\").hide().appendTo(this.options.container);\n        this.$menu.on('click', '.dropdown__row', this.handleMenuClick);\n        this.$menu.on('click', '.js-ok', this.handleOkClick);\n        this.$menu.on('click', '.js-clear', this.handleClearClick);\n        this.$menu.on('click', '.js-clear-input', this.handleClearInputClick);\n        this.$menu.column = this.currentColumn;\n        var self = this;\n        this.$menu.on('keydown', 'input', function (ev) {\n            if (ev.keyCode === 13) {\n                self.updateQueryState();\n            } else if (ev.keyCode === 27) {\n                self.hideMenu();\n            }\n        });\n    },\n\n    /** Render and show the menu */\n    showMenu: function showMenu(e, $menuButton) {\n        // stop propagation so that event does not bubble to sorting handler when just the filter icon is clicked\n        if (!e || !(0, _jquery2.default)(e.target).is('.slick-sort-indicator')) {\n            e.stopPropagation();\n        }\n        var column = $menuButton.data('column');\n        if (this.currentColumn === column) {\n            this.hideMenu();\n        } else {\n            this.hideMenu();\n            this.currentColumn = column;\n            this.queryBackup = this.queryModel.toJSON();\n            // Mark the header as active to keep the highlighting.\n            this.$activeHeaderColumn = $menuButton.closest('.slick-header-column');\n            this.$activeHeaderColumn.addClass('slick-header-column-active');\n            this.render();\n            this.$menu.find('input[type=text]').first().focus();\n        }\n    },\n    render: function render() {\n        var locale = this.options.locale;\n        if (!this.currentColumn) {\n            return;\n        }\n        var self = this;\n        var isAlreadyOpened = true;\n        if (!this.$menu) {\n            this.createMenu();\n            isAlreadyOpened = false;\n        }\n        var vals = this.queryModel.getColumnQuery(this.currentColumn.id);\n        vals = _lodash2.default.extend({\n            showSortAsc: vals.sort !== 'asc',\n            showSortDesc: vals.sort !== 'desc',\n            sorting: !!vals.sort,\n            showBlankFilter: vals.filter['null'] === undefined || !vals.filter['null'],\n            showNonBlankFilter: vals.filter['null'] === undefined || vals.filter['null'],\n            blankFiltered: vals.filter['null'] !== undefined,\n            features: this.options.features\n        }, vals);\n        vals[this.currentColumn.type + 'Column'] = true;\n        var formatter = _utils2.default.getInputFormatter(this.currentColumn, locale);\n        if ((vals.filter.le !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n            vals.to = formatter(vals.filter.le === undefined ? vals.filter.eq : vals.filter.le);\n        }\n        if ((vals.filter.ge !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n            vals.from = formatter(vals.filter.ge === undefined ? vals.filter.eq : vals.filter.ge);\n        }\n        if ((vals.filter.text !== undefined || vals.filter.contains !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n            vals.contains = formatter(vals.filter.text || vals.filter.contains || vals.filter.eq);\n        }\n        this.cleanupElements();\n        this.$menu.html(_templates2.default['athena/querygrid/' + this.options.template](vals));\n        this.grid.trigger('dropdownOpened', this);\n        if (!isAlreadyOpened) {\n            this.$menu.css({ display: 'block', 'min-width': 200 }).position({\n                of: this.$activeHeaderColumn,\n                my: 'center top',\n                at: 'center bottom+5',\n                collision: 'flipfit'\n            }).addClass('open');\n            // On open, focus to the first input box\n            this.$menu.find('.dropdown__row__input').first().focus();\n        }\n        if (this.currentColumn.type === 'date') {\n            var _locale = this.options.locale;\n            var inputs = this.$menu.find('input[type=text]');\n            _bootstrapDatepicker2.default.create(inputs, {\n                viewMode: 'years',\n                changeMonth: true,\n                changeYear: true,\n                locale: _locale\n            }).data('datepicker').hide();\n            inputs.on('changeDate', function (ev) {\n                var period = (0, _jquery2.default)(this).data('selectDatePeriod');\n                var viewPeriod = ev.viewMode.replace(/s$/, '');\n                if (period) {\n                    self.$menu.find('.filter-from').val((0, _moment2.default)(ev.date).startOf(viewPeriod).format(_utils2.default.DATE_FORMAT));\n                    self.$menu.find('.filter-to').val((0, _moment2.default)(ev.date).endOf(viewPeriod).format(_utils2.default.DATE_FORMAT));\n                    if (period === viewPeriod) {\n                        (0, _jquery2.default)(this).data('selectDatePeriod', null).data('datepicker').hide();\n                    }\n                } else {\n                    var method = (0, _jquery2.default)(this).is('.filter-from') ? 'startOf' : 'endOf';\n                    var m = (0, _moment2.default)(new Date(ev.date))[method](viewPeriod);\n                    m.locale(_locale);\n                    var value = m.format(_utils2.default.DATE_FORMAT);\n                    (0, _jquery2.default)(this).data('datepicker').setValue(value);\n                    (0, _jquery2.default)(this).val(value);\n                    if (ev.viewMode === 'days') {\n                        (0, _jquery2.default)(this).data('datepicker').hide();\n                    }\n                }\n            }).each(function () {\n                _lodash2.default.extend((0, _jquery2.default)(this).data('datepicker'), {\n                    place: function place() {\n                        this.picker.position({\n                            my: 'center top',\n                            at: 'center bottom',\n                            of: (this.compoment || this.element).parent('.dropdown__row_input'),\n                            collision: 'flipfit'\n                        });\n                    },\n                    set: function set() {}\n                });\n            });\n            this.$menu.find('.js-datepicker').on('click', function () {\n                (0, _jquery2.default)(this).prev().data('datepicker').show();\n            });\n        }\n    },\n    cleanupElements: function cleanupElements() {\n        if (this.currentColumn.type === 'date') {\n            // remove datepicker instances so they are not dangling in the DOM\n            this.$menu.find('input[type=text]').each(function () {\n                (0, _jquery2.default)(this).data('datepicker').picker.remove();\n            });\n        }\n    },\n\n    /** Hide menu and remove from DOM */\n    hideMenu: function hideMenu() {\n        if (this.$menu) {\n            this.cleanupElements();\n            this.updateQueryState();\n            this.$menu.remove();\n            this.$menu = null;\n            this.currentColumn = null;\n            this.$activeHeaderColumn.removeClass('slick-header-column-active');\n        }\n    }\n});\nexports.default = HeaderMenu;\n\n/***/ }),\n/* 519 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /* =========================================================\r\n                                                                                                                                                                                                                                                                               * bootstrap-datepicker.js\r\n                                                                                                                                                                                                                                                                               * http://www.eyecon.ro/bootstrap-datepicker\r\n                                                                                                                                                                                                                                                                               * =========================================================\r\n                                                                                                                                                                                                                                                                               * Copyright 2012 Stefan Petre\r\n                                                                                                                                                                                                                                                                               *\r\n                                                                                                                                                                                                                                                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n                                                                                                                                                                                                                                                                               * you may not use this file except in compliance with the License.\r\n                                                                                                                                                                                                                                                                               * You may obtain a copy of the License at\r\n                                                                                                                                                                                                                                                                               *\r\n                                                                                                                                                                                                                                                                               * http://www.apache.org/licenses/LICENSE-2.0\r\n                                                                                                                                                                                                                                                                               *\r\n                                                                                                                                                                                                                                                                               * Unless required by applicable law or agreed to in writing, software\r\n                                                                                                                                                                                                                                                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n                                                                                                                                                                                                                                                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n                                                                                                                                                                                                                                                                               * See the License for the specific language governing permissions and\r\n                                                                                                                                                                                                                                                                               * limitations under the License.\r\n                                                                                                                                                                                                                                                                               * ========================================================= */\n// highly modified for i18n by CK\n\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Datepicker = function Datepicker(element, options) {\n    this.element = (0, _jquery2.default)(element);\n    this.locale = options.locale;\n    this.picker = (0, _jquery2.default)(DPGlobal.template).appendTo('body').on({ click: _jquery2.default.proxy(this.click, this) });\n    this.isInput = this.element.is('input');\n    this.component = this.element.is('.date') ? this.element.find('.add-on') : false;\n    if (this.isInput) {\n        this.element.on({\n            keyup: _jquery2.default.proxy(this.update, this)\n        });\n    } else {\n        if (this.component) {\n            this.component.on('click', _jquery2.default.proxy(this.show, this));\n        } else {\n            this.element.on('click', _jquery2.default.proxy(this.show, this));\n        }\n    }\n    this.minViewMode = options.minViewMode || this.element.data('date-minviewmode') || 0;\n    if (typeof this.minViewMode === 'string') {\n        switch (this.minViewMode) {\n            case 'months':\n                this.minViewMode = 1;\n                break;\n            case 'years':\n                this.minViewMode = 2;\n                break;\n            default:\n                this.minViewMode = 0;\n                break;\n        }\n    }\n    this.viewMode = options.viewMode || this.element.data('date-viewmode') || 0;\n    if (typeof this.viewMode === 'string') {\n        switch (this.viewMode) {\n            case 'months':\n                this.viewMode = 1;\n                break;\n            case 'years':\n                this.viewMode = 2;\n                break;\n            default:\n                this.viewMode = 0;\n                break;\n        }\n    }\n    this.startViewMode = this.viewMode;\n    this.weekStart = options.weekStart || this.element.data('date-weekstart') || 0;\n    this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;\n    this.onRender = options.onRender;\n    this.fillDow();\n    this.fillMonths();\n    this.update();\n    this.showMode();\n};\nDatepicker.prototype = {\n    constructor: Datepicker,\n    show: function show(e) {\n        this.picker.show();\n        this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();\n        this.place();\n        (0, _jquery2.default)(window).on('resize', _jquery2.default.proxy(this.place, this));\n        if (e) {\n            e.stopPropagation();\n            e.preventDefault();\n        }\n        var that = this;\n        (0, _jquery2.default)(document).on('mousedown', function (ev) {\n            if ((0, _jquery2.default)(ev.target).closest('.datepicker').length == 0) {\n                that.hide();\n            }\n        });\n        this.element.trigger({\n            type: 'show',\n            date: this.date\n        });\n    },\n    hide: function hide() {\n        this.picker.hide();\n        (0, _jquery2.default)(window).off('resize', this.place);\n        this.viewMode = this.startViewMode;\n        this.showMode();\n        if (!this.isInput) {\n            (0, _jquery2.default)(document).off('mousedown', this.hide);\n        }\n        //this.set();\n        this.element.trigger({\n            type: 'hide',\n            date: this.date\n        });\n    },\n    set: function set() {\n        var enM = (0, _moment2.default)(this.date, _utils2.default.DATE_FORMAT, 'en_US');\n        var localeFormated = enM.locale(this.locale).format(_utils2.default.DATE_FORMAT);\n        this.applyDateStringtoInput(localeFormated);\n    },\n    applyDateStringtoInput: function applyDateStringtoInput(dateString) {\n        if (!this.isInput) {\n            if (this.component) {\n                this.element.find('input').prop('value', dateString);\n            }\n            this.element.data('date', dateString);\n        } else {\n            this.element.prop('value', dateString);\n        }\n    },\n    setValue: function setValue(newDate) {\n        var m = _utils2.default.localeDateStringToMoment(newDate, this.locale);\n        this.date = _utils2.default.momentToLocaleDate(m, 'en_US');\n        this.set();\n        this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n        this.fill();\n    },\n    place: function place() {\n        var offset = this.component ? this.component.offset() : this.element.offset();\n        this.picker.css({\n            top: offset.top + this.height,\n            left: offset.left\n        });\n    },\n    update: function update(newDate) {\n        if (typeof newDate === 'string') {\n            this.date = _utils2.default.localeDateStringToMoment(newDate, this.locale).toDate();\n        } else if (this.isInput && this.element.prop('value')) {\n            this.date = _utils2.default.localeDateStringToMoment(this.element.prop('value'), this.locale).toDate();\n        } else {\n            this.date = (0, _moment2.default)(this.element.data('date')).toDate();\n        }\n        this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n        this.fill();\n    },\n    fillDow: function fillDow() {\n        var dowCnt = this.weekStart;\n        var html = '<tr>';\n        while (dowCnt < this.weekStart + 7) {\n            html += '<th class=\"dow\">' + DPGlobal.dates.daysMin[dowCnt++ % 7] + '</th>';\n        }\n        html += '</tr>';\n        this.picker.find('.datepicker-days thead').append(html);\n    },\n    fillMonths: function fillMonths() {\n        var html = '';\n        var i = 0;\n        while (i < 12) {\n            html += '<span class=\"month\">' + DPGlobal.dates.monthsShort[i++] + '</span>';\n        }\n        this.picker.find('.datepicker-months td').append(html);\n    },\n    fill: function fill() {\n        var d = new Date(this.viewDate);\n        var year = d.getFullYear();\n        var month = d.getMonth();\n        var currentDate = this.date.valueOf();\n        this.picker.find('.datepicker-days th:eq(1)').text(DPGlobal.dates.months[month] + ' ' + year);\n        var prevMonth = new Date(year, month - 1, 28, 0, 0, 0, 0);\n        var day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());\n        prevMonth.setDate(day);\n        prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7) % 7);\n        var nextMonth = new Date(prevMonth);\n        nextMonth.setDate(nextMonth.getDate() + 42);\n        nextMonth = nextMonth.valueOf();\n        var html = [];\n        var clsName = void 0;\n        var prevY = void 0;\n        var prevM = void 0;\n        while (prevMonth.valueOf() < nextMonth) {\n            if (prevMonth.getDay() === this.weekStart) {\n                html.push('<tr>');\n            }\n            clsName = this.onRender(prevMonth);\n            prevY = prevMonth.getFullYear();\n            prevM = prevMonth.getMonth();\n            if (prevM < month && prevY === year || prevY < year) {\n                clsName += ' old';\n            } else if (prevM > month && prevY === year || prevY > year) {\n                clsName += ' new';\n            }\n            if (prevMonth.valueOf() === currentDate) {\n                clsName += ' active';\n            }\n            html.push('<td class=\"day ' + clsName + '\">' + prevMonth.getDate() + '</td>');\n            if (prevMonth.getDay() === this.weekEnd) {\n                html.push('</tr>');\n            }\n            prevMonth.setDate(prevMonth.getDate() + 1);\n        }\n        this.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n        var currentYear = this.date.getFullYear();\n        var months = this.picker.find('.datepicker-months').find('th:eq(1)').text(year).end().find('span').removeClass('active');\n        if (currentYear === year) {\n            months.eq(this.date.getMonth()).addClass('active');\n        }\n        html = '';\n        year = parseInt(year / 10 + '', 10) * 10;\n        var yearCont = this.picker.find('.datepicker-years').find('th:eq(1)').text(year + '-' + (year + 9)).end().find('td');\n        year -= 1;\n        for (var i = -1; i < 11; i++) {\n            html += '<span class=\"year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + '\">' + year + '</span>';\n            year += 1;\n        }\n        yearCont.html(html);\n    },\n    click: function click(e) {\n        e.stopPropagation();\n        e.preventDefault();\n        var target = (0, _jquery2.default)(e.target).closest('span, td, th');\n        if (target.length === 1) {\n            if (target.is('.js-close')) {\n                this.hide();\n                return;\n            }\n            switch (target[0].nodeName.toLowerCase()) {\n                case 'th':\n                    switch (target[0].className) {\n                        case 'switch':\n                            this.showMode(1);\n                            break;\n                        case 'prev':\n                        case 'next':\n                            this.viewDate['set' + DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate, this.viewDate['get' + DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1));\n                            this.fill();\n                            this.set();\n                            break;\n                    }\n                    break;\n                case 'span':\n                    if (target.is('.month')) {\n                        var month = target.parent().find('span').index(target);\n                        this.viewDate.setMonth(month);\n                    } else {\n                        var year = parseInt(target.text(), 10) || 0;\n                        this.viewDate.setFullYear(year);\n                    }\n                    if (this.viewMode !== 0) {\n                        this.date = new Date(this.viewDate);\n                        this.element.trigger({\n                            type: 'changeDate',\n                            date: this.date,\n                            viewMode: DPGlobal.modes[this.viewMode].clsName\n                        });\n                    }\n                    this.showMode(-1);\n                    this.fill();\n                    this.set();\n                    break;\n                case 'td':\n                    if (target.is('.day') && !target.is('.disabled')) {\n                        var day = parseInt(target.text(), 10) || 1;\n                        var _month = this.viewDate.getMonth();\n                        if (target.is('.old')) {\n                            _month -= 1;\n                        } else if (target.is('.new')) {\n                            _month += 1;\n                        }\n                        var _year = this.viewDate.getFullYear();\n                        this.date = new Date(_year, _month, day, 0, 0, 0, 0);\n                        this.viewDate = new Date(_year, _month, Math.min(28, day), 0, 0, 0, 0);\n                        this.fill();\n                        this.set();\n                        this.element.trigger({\n                            type: 'changeDate',\n                            date: this.date,\n                            viewMode: DPGlobal.modes[this.viewMode].clsName\n                        });\n                    }\n                    break;\n            }\n        }\n    },\n    mousedown: function mousedown(e) {\n        e.stopPropagation();\n        e.preventDefault();\n    },\n    showMode: function showMode(dir) {\n        if (dir) {\n            this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));\n        }\n        this.picker.find('>div').hide().filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName).show();\n    }\n};\nDatepicker.create = function (element, option, val) {\n    return element.each(function () {\n        var $this = (0, _jquery2.default)(this);\n        var data = $this.data('datepicker');\n        var options = (typeof option === 'undefined' ? 'undefined' : _typeof(option)) === 'object' && option;\n        if (!data) {\n            $this.data('datepicker', data = new Datepicker(this, _jquery2.default.extend({}, Datepicker.defaults, options)));\n        }\n        if (typeof option === 'string') data[option](val);\n    });\n};\nDatepicker.defaults = {\n    onRender: function onRender() {\n        return '';\n    }\n};\nvar DPGlobal = {\n    modes: [{\n        clsName: 'days',\n        navFnc: 'Month',\n        navStep: 1\n    }, {\n        clsName: 'months',\n        navFnc: 'FullYear',\n        navStep: 1\n    }, {\n        clsName: 'years',\n        navFnc: 'FullYear',\n        navStep: 10\n    }],\n    dates: {\n        days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],\n        daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n        daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],\n        months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n        monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n    },\n    isLeapYear: function isLeapYear(year) {\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n    getDaysInMonth: function getDaysInMonth(year, month) {\n        return [31, DPGlobal.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    headTemplate: '<thead>' + '<tr>' + '<th class=\"prev\">&lsaquo;</th>' + '<th colspan=\"5\" class=\"switch\"></th>' + '<th class=\"next\">&rsaquo;</th>' + '</tr>' + '</thead>',\n    contTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n    footTemplate: '<span class=\"datepicker__close-button js-close\">close</span>'\n};\nDPGlobal.template = '<div class=\"datepicker dropdown-menu\">' + '<div class=\"datepicker-days\">' + '<table class=\" table-condensed\">' + DPGlobal.headTemplate + '<tbody></tbody>' + '</table>' + DPGlobal.footTemplate + '</div>' + '<div class=\"datepicker-months\">' + '<table class=\"table-condensed\">' + DPGlobal.headTemplate + DPGlobal.contTemplate + '</table>' + DPGlobal.footTemplate + '</div>' + '<div class=\"datepicker-years\">' + '<table class=\"table-condensed\">' + DPGlobal.headTemplate + DPGlobal.contTemplate + '</table>' + DPGlobal.footTemplate + '</div>' + '</div>';\nexports.default = Datepicker;\n\n/***/ }),\n/* 520 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _header = __webpack_require__(955);\n\nvar _header2 = _interopRequireDefault(_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Header = function (_React$Component) {\n    _inherits(Header, _React$Component);\n\n    function Header() {\n        _classCallCheck(this, Header);\n\n        return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));\n    }\n\n    _createClass(Header, [{\n        key: 'render',\n        value: function render() {\n            if (this.props.headerOptions && this.props.embedded) {\n                if (this.props.isNetwork) {\n                    return _react2.default.createElement(_header2.default, Object.assign({}, this.props, this.props.headerOptions));\n                }\n                return _react2.default.createElement(\"header\", { className: \"ui-main__header\" }, _react2.default.createElement(\"nav\", { className: \"ui-breadcrumbs\" }, _react2.default.createElement(\"a\", { className: \"ui-breadcrumbs__item icon-app-reports\", href: '#' + this.props.entity.id + '/reports' }, \"Reports\"), _react2.default.createElement(\"span\", { className: \"ui-breadcrumbs__item\" }, this.props.report.get('name'))));\n            }\n            return null;\n        }\n    }]);\n\n    return Header;\n}(_react2.default.Component);\n\nexports.default = Header;\n\n/***/ }),\n/* 521 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _social_networking = __webpack_require__(956);\n\nvar _social_networking2 = _interopRequireDefault(_social_networking);\n\nvar _embed_utils = __webpack_require__(71);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Footer = function (_React$Component) {\n    _inherits(Footer, _React$Component);\n\n    function Footer() {\n        _classCallCheck(this, Footer);\n\n        var _this = _possibleConstructorReturn(this, (Footer.__proto__ || Object.getPrototypeOf(Footer)).apply(this, arguments));\n\n        _this.showFeedback = function (e) {\n            e.preventDefault();\n            _report_actions2.default.showFeedback();\n        };\n        _this.showTos = function (e) {\n            e.preventDefault();\n            _report_actions2.default.showTOS();\n        };\n        return _this;\n    }\n\n    _createClass(Footer, [{\n        key: 'render',\n        value: function render() {\n            var name = this.props.entity.get('name');\n            var entityNameCapitalized = _underscore2.default.capitalize(name);\n            var entityHashtag = name.split(' ').join('');\n            var entityUrl = this.props.entity.get('homepage_url');\n            return !(0, _embed_utils.isEmbed)() && _react2.default.createElement(\"footer\", { className: \"footer\" }, _react2.default.createElement(\"a\", { className: \"footer__logo\" }, _react2.default.createElement(Ovid.OpenGovLogo, { height: 24 })), _react2.default.createElement(\"nav\", { className: \"footer__nav\" }, _react2.default.createElement(\"a\", { className: \"footer__nav__item\", href: \"http://opengov.com\", target: \"_blank\" }, \"About OpenGov\"), _react2.default.createElement(\"button\", { id: \"entity-feedback\", className: \"footer__nav__item\", onClick: this.showFeedback, \"data-modal\": \"feedback\" }, \"Contact \", name), _react2.default.createElement(\"a\", { className: \"footer__nav__item\", href: entityUrl }, entityNameCapitalized + \"'s\", \" homepage\"), _react2.default.createElement(\"button\", { id: \"tos\", className: \"footer__nav__item\", onClick: this.showTos, \"data-modal\": \"tos\" }, \"Terms of Service\")), _react2.default.createElement(\"div\", { className: \"footer__social\" }, _react2.default.createElement(_social_networking2.default, { entityHashtag: entityHashtag })));\n        }\n    }]);\n\n    return Footer;\n}(_react2.default.Component);\n\nexports.default = Footer;\n\n/***/ }),\n/* 522 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _autolinker = __webpack_require__(958);\n\nvar _autolinker2 = _interopRequireDefault(_autolinker);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportDescription = (0, _createReactClass2.default)({\n    displayName: 'ReportDescription',\n\n    propTypes: {\n        report: _propTypes2.default.object.isRequired\n    },\n    render: function render() {\n        var report = this.props.report;\n        var description = report.get('description');\n        if (!report.getIn(['properties', 'description_visible']) || !description) {\n            return null;\n        }\n        description = _autolinker2.default.link(_underscore2.default.escapeHTML(description));\n        return _react2.default.createElement(\"div\", { className: \"report-description\", ref: \"description\" }, _react2.default.createElement(\"small\", { dangerouslySetInnerHTML: { __html: description } }));\n    }\n});\nexports.default = ReportDescription;\n\n/***/ }),\n/* 523 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__context__ = __webpack_require__(266);\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar removedIsInitialSSR = false;\n\nvar I18n = function (_Component) {\n  _inherits(I18n, _Component);\n\n  function I18n(props, context) {\n    _classCallCheck(this, I18n);\n\n    var _this = _possibleConstructorReturn(this, (I18n.__proto__ || Object.getPrototypeOf(I18n)).call(this, props, context));\n\n    _this.i18n = props.i18n || context.i18n || Object(__WEBPACK_IMPORTED_MODULE_2__context__[\"b\" /* getI18n */])();\n    _this.namespaces = props.ns || _this.i18n.options && _this.i18n.options.defaultNS;\n    if (typeof _this.namespaces === 'string') _this.namespaces = [_this.namespaces];\n\n    var i18nOptions = _this.i18n && _this.i18n.options && _this.i18n.options.react || {};\n    _this.options = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_2__context__[\"a\" /* getDefaults */])(), i18nOptions, props);\n\n    // nextjs SSR: getting data from next.js or other ssr stack\n    if (props.initialI18nStore) {\n      _this.i18n.services.resourceStore.data = props.initialI18nStore;\n      _this.options.wait = false; // we got all passed down already\n    }\n    if (props.initialLanguage) {\n      _this.i18n.changeLanguage(props.initialLanguage);\n    }\n\n    // provider SSR: data was set in provider and ssr flag was set\n    if (_this.i18n.options && _this.i18n.options.isInitialSSR) {\n      _this.options.wait = false;\n    }\n\n    var language = _this.i18n.languages && _this.i18n.languages[0];\n    var ready = !!language && _this.namespaces.every(function (ns) {\n      return _this.i18n.hasResourceBundle(language, ns);\n    });\n\n    _this.state = {\n      i18nLoadedAt: null,\n      ready: ready\n    };\n\n    _this.t = _this.getI18nTranslate();\n\n    _this.onI18nChanged = _this.onI18nChanged.bind(_this);\n    _this.getI18nTranslate = _this.getI18nTranslate.bind(_this);\n    return _this;\n  }\n\n  _createClass(I18n, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return {\n        t: this.t,\n        i18n: this.i18n\n      };\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var bind = function bind() {\n        if (_this2.options.bindI18n && _this2.i18n) _this2.i18n.on(_this2.options.bindI18n, _this2.onI18nChanged);\n        if (_this2.options.bindStore && _this2.i18n.store) _this2.i18n.store.on(_this2.options.bindStore, _this2.onI18nChanged);\n      };\n\n      this.mounted = true;\n      this.i18n.loadNamespaces(this.namespaces, function () {\n        var ready = function ready() {\n          if (_this2.mounted && !_this2.state.ready) _this2.setState({ ready: true });\n          if (_this2.options.wait && _this2.mounted) bind();\n        };\n\n        if (_this2.i18n.isInitialized) {\n          ready();\n        } else {\n          var initialized = function initialized() {\n            // due to emitter removing issue in i18next we need to delay remove\n            setTimeout(function () {\n              _this2.i18n.off('initialized', initialized);\n            }, 1000);\n            ready();\n          };\n\n          _this2.i18n.on('initialized', initialized);\n        }\n      });\n\n      if (!this.options.wait) bind();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      var _this3 = this;\n\n      this.mounted = false;\n      if (this.onI18nChanged) {\n        if (this.options.bindI18n) {\n          var p = this.options.bindI18n.split(' ');\n          p.forEach(function (f) {\n            return _this3.i18n.off(f, _this3.onI18nChanged);\n          });\n        }\n        if (this.options.bindStore) {\n          var _p = this.options.bindStore.split(' ');\n          _p.forEach(function (f) {\n            return _this3.i18n.store && _this3.i18n.store.off(f, _this3.onI18nChanged);\n          });\n        }\n      }\n    }\n  }, {\n    key: 'onI18nChanged',\n    value: function onI18nChanged() {\n      if (!this.mounted) return;\n\n      this.t = this.getI18nTranslate();\n      this.setState({ i18nLoadedAt: new Date() }); // rerender\n    }\n  }, {\n    key: 'getI18nTranslate',\n    value: function getI18nTranslate() {\n      return this.i18n.getFixedT(null, this.options.nsMode === 'fallback' ? this.namespaces : this.namespaces[0]);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var children = this.props.children;\n      var ready = this.state.ready;\n\n\n      if (!ready && this.options.wait) return null;\n\n      // remove ssr flag set by provider - first render was done from now on wait if set to wait\n      if (this.i18n.options && this.i18n.options.isInitialSSR && !removedIsInitialSSR) {\n        removedIsInitialSSR = true;\n        setTimeout(function () {\n          delete _this4.i18n.options.isInitialSSR;\n        }, 100);\n      }\n\n      return children(this.t, {\n        i18n: this.i18n,\n        t: this.t,\n        ready: ready\n      });\n    }\n  }]);\n\n  return I18n;\n}(__WEBPACK_IMPORTED_MODULE_0_react__[\"Component\"]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (I18n);\n\n\nI18n.contextTypes = {\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object\n};\n\nI18n.childContextTypes = {\n  t: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired,\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object\n};\n\n/***/ }),\n/* 524 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportUpdatedInfo = function (_React$Component) {\n    _inherits(ReportUpdatedInfo, _React$Component);\n\n    function ReportUpdatedInfo() {\n        _classCallCheck(this, ReportUpdatedInfo);\n\n        return _possibleConstructorReturn(this, (ReportUpdatedInfo.__proto__ || Object.getPrototypeOf(ReportUpdatedInfo)).apply(this, arguments));\n    }\n\n    _createClass(ReportUpdatedInfo, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"small\", null, this.props.description, _react2.default.createElement(\"strong\", null, (0, _moment2.default)(this.props.timeStamp).format('D MMM, YYYY')));\n        }\n    }]);\n\n    return ReportUpdatedInfo;\n}(_react2.default.Component);\n\nexports.default = ReportUpdatedInfo;\n\n/***/ }),\n/* 525 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ReportHeaderRowCount = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportHeaderRowCount = exports.ReportHeaderRowCount = (0, _createReactClass2.default)({\n    displayName: 'ReportHeaderRowCount',\n    render: function render() {\n        var _props = this.props,\n            className = _props.className,\n            count = _props.count,\n            estimate = _props.estimate,\n            limit = _props.limit;\n\n        var adj = '';\n        var countText = '';\n        if (count == null && estimate != null) {\n            adj = '~';\n            count = estimate;\n        }\n        if (count != null) {\n            countText = adj + _utils2.default.formatNumberComma(count);\n        }\n        var noResults = _react2.default.createElement(\"span\", null, _react2.default.createElement(\"b\", { className: \"number-display_emphasize\" }, \"No Results\"));\n        var reachedLimit = _react2.default.createElement(\"span\", null, \"Showing \", _react2.default.createElement(\"span\", { className: \"number-display_emphasize\" }, _utils2.default.formatNumberComma(limit)), \" out of\", ' ', _react2.default.createElement(\"span\", { className: \"number-display_emphasize\" }, countText), \" rows\");\n        var lessThanLimit = _react2.default.createElement(\"span\", null, \"Showing \", _react2.default.createElement(\"span\", { className: \"number-display_emphasize\" }, countText), \" rows\");\n        if (count == null && !countText) {\n            return null;\n        }\n        return _react2.default.createElement(\"span\", { className: (0, _classnames2.default)('page-title__report-title', className), \"data-test\": \"grid-report-row-count\" }, count === 0 ? noResults : count > limit ? reachedLimit : lessThanLimit);\n    }\n});\n/**\r\n * Renders the current row count for a grid report.\r\n */\n\nReportHeaderRowCount.defaultProps = {\n    limit: 1000\n};\n\n/***/ }),\n/* 526 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ErrorContainer = function (_React$Component) {\n    _inherits(ErrorContainer, _React$Component);\n\n    function ErrorContainer() {\n        _classCallCheck(this, ErrorContainer);\n\n        return _possibleConstructorReturn(this, (ErrorContainer.__proto__ || Object.getPrototypeOf(ErrorContainer)).apply(this, arguments));\n    }\n\n    _createClass(ErrorContainer, [{\n        key: \"render\",\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), this.props.message);\n        }\n    }]);\n\n    return ErrorContainer;\n}(_react2.default.Component);\n\nexports.default = ErrorContainer;\n\n/***/ }),\n/* 527 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PanelData = function (_React$Component) {\n    _inherits(PanelData, _React$Component);\n\n    function PanelData() {\n        _classCallCheck(this, PanelData);\n\n        return _possibleConstructorReturn(this, (PanelData.__proto__ || Object.getPrototypeOf(PanelData)).apply(this, arguments));\n    }\n\n    _createClass(PanelData, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var column = this.props.column;\n\n            var toggleColumnVisibility = function toggleColumnVisibility(e) {\n                return _this2.props.toggleColumnVisibility(column, false, e);\n            };\n            var isVisible = column.get('visible');\n            return _react2.default.createElement(\"li\", { className: 'drop-item js-column-toggle ' + (isVisible ? 'active' : '') }, _react2.default.createElement(\"div\", { className: \"visibility-panel-data drop-item__bar\", onClick: toggleColumnVisibility }, _react2.default.createElement(\"span\", { className: \"drop-item__text has-no-hover\" }, column.get('label'))), _react2.default.createElement(\"div\", { className: \"drop-item__buttons\", onClick: toggleColumnVisibility }, _react2.default.createElement(\"button\", { role: \"checkbox\", className: 'drop-item__checkbox ' + (isVisible ? 'checked' : '') }, _react2.default.createElement(\"i\", { className: \"fonticon checkmark-icon\" }))));\n        }\n    }]);\n\n    return PanelData;\n}(_react2.default.Component);\n\nexports.default = PanelData;\n\n/***/ }),\n/* 528 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PanelHeader = function (_React$Component) {\n    _inherits(PanelHeader, _React$Component);\n\n    function PanelHeader() {\n        _classCallCheck(this, PanelHeader);\n\n        return _possibleConstructorReturn(this, (PanelHeader.__proto__ || Object.getPrototypeOf(PanelHeader)).apply(this, arguments));\n    }\n\n    _createClass(PanelHeader, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", null, this.props.panelType == 'Amount' ? _react2.default.createElement(\"div\", { className: \"visibility-panel-header\" }, \"Select the \", _react2.default.createElement(\"strong\", null, \"amount\"), \" columns from the dataset that can be shown as amount totals in the report.\") : _react2.default.createElement(\"div\", { className: \"visibility-panel-header\" }, \"Select the \", _react2.default.createElement(\"strong\", null, \"text\"), \" columns from the dataset that can be used to breakdown or pivot the report.\"), _react2.default.createElement(\"div\", { className: \"visibility-panel-button ui-button small no-color\", onClick: this.props.toggleAllColumnVisibility }, _react2.default.createElement(\"i\", { className: \"fonticon icon-confirm-1\" }), \"All\"));\n        }\n    }]);\n\n    return PanelHeader;\n}(_react2.default.Component);\n\nexports.default = PanelHeader;\n\n/***/ }),\n/* 529 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getVisibilityPanelClass = exports.getFooterClass = undefined;\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//Creates the footer class with isEditingDefaultState\nvar getFooterClass = exports.getFooterClass = function getFooterClass(isEditingDefaultState) {\n    return (0, _classnames2.default)('ui-panel__footer', {\n        'editing_default_state': isEditingDefaultState\n    });\n};\n//Creates the visibility panel class with isEditingDefaultState\nvar getVisibilityPanelClass = exports.getVisibilityPanelClass = function getVisibilityPanelClass(isEditingDefaultState) {\n    return (0, _classnames2.default)('visibility-panel', 'ui-container_scroll', 'ui-panel__content', {\n        'editing_default_state': isEditingDefaultState\n    });\n};\n\n/***/ }),\n/* 530 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _highcharts = __webpack_require__(980);\n\nvar _highcharts2 = _interopRequireDefault(_highcharts);\n\nvar _treemap = __webpack_require__(981);\n\nvar _treemap2 = _interopRequireDefault(_treemap);\n\nvar _exporting = __webpack_require__(982);\n\nvar _exporting2 = _interopRequireDefault(_exporting);\n\nvar _highchartsPatternFill = __webpack_require__(983);\n\nvar _highchartsPatternFill2 = _interopRequireDefault(_highchartsPatternFill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//[dz] shim all of highcharts functionality and modules, ensuring we load highcharts once (avoiding hc error 16)\n//note: all specific extending of Highcharts functionality is done when instantiating library (see graph.js)\n(0, _treemap2.default)(_highcharts2.default);\n(0, _exporting2.default)(_highcharts2.default);\n(0, _highchartsPatternFill2.default)(_highcharts2.default);\nexports.default = _highcharts2.default;\n\n/***/ }),\n/* 531 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_RESULT__;/*\n Highcharts JS v8.1.2 (2020-06-16)\n\n (c) 2009-2018 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(T,O){\"object\"===typeof module&&module.exports?(O[\"default\"]=O,module.exports=T.document?O(T):O): true?!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){return O(T)}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):(T.Highcharts&&T.Highcharts.error(16,!0),T.Highcharts=O(T))})(\"undefined\"!==typeof window?window:this,function(T){function O(g,c,R,y){g.hasOwnProperty(c)||(g[c]=y.apply(null,R))}var q={};O(q,\"parts/Globals.js\",[],function(){var g=\"undefined\"!==typeof T?T:\"undefined\"!==typeof window?window:{},c=g.document,\nR=g.navigator&&g.navigator.userAgent||\"\",y=c&&c.createElementNS&&!!c.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect,q=/(edge|msie|trident)/i.test(R)&&!g.opera,H=-1!==R.indexOf(\"Firefox\"),D=-1!==R.indexOf(\"Chrome\"),J=H&&4>parseInt(R.split(\"Firefox/\")[1],10);return{product:\"Highcharts\",version:\"8.1.2\",deg2rad:2*Math.PI/360,doc:c,hasBidiBug:J,hasTouch:!!g.TouchEvent,isMS:q,isWebKit:-1!==R.indexOf(\"AppleWebKit\"),isFirefox:H,isChrome:D,isSafari:!D&&-1!==R.indexOf(\"Safari\"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(R),\nSVG_NS:\"http://www.w3.org/2000/svg\",chartCount:0,seriesTypes:{},symbolSizes:{},svg:y,win:g,marginNames:[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],noop:function(){},charts:[],dateFormats:{}}});O(q,\"parts/Utilities.js\",[q[\"parts/Globals.js\"]],function(g){function c(b,h,e,z){var a=h?\"Highcharts error\":\"Highcharts warning\";32===b&&(b=a+\": Deprecated member\");var x=I(b),f=x?a+\" #\"+b+\": www.highcharts.com/errors/\"+b+\"/\":b.toString();a=function(){if(h)throw Error(f);G.console&&-1===c.messages.indexOf(f)&&\nconsole.log(f)};if(\"undefined\"!==typeof z){var d=\"\";x&&(f+=\"?\");W(z,function(b,h){d+=\"\\n - \"+h+\": \"+b;x&&(f+=encodeURI(h)+\"=\"+encodeURI(b))});f+=d}e?da(e,\"displayError\",{code:b,message:f,params:z},a):a();c.messages.push(f)}function R(){var b,h=arguments,e={},z=function(b,h){\"object\"!==typeof b&&(b={});W(h,function(e,a){!y(e,!0)||C(e)||r(e)?b[a]=h[a]:b[a]=z(b[a]||{},e)});return b};!0===h[0]&&(e=h[1],h=Array.prototype.slice.call(h,2));var a=h.length;for(b=0;b<a;b++)e=z(e,h[b]);return e}function y(b,\nh){return!!b&&\"object\"===typeof b&&(!h||!n(b))}function q(b,h,e){var a;K(h)?m(e)?b.setAttribute(h,e):b&&b.getAttribute&&((a=b.getAttribute(h))||\"class\"!==h||(a=b.getAttribute(h+\"Name\"))):W(h,function(h,e){b.setAttribute(e,h)});return a}function H(){for(var b=arguments,h=b.length,e=0;e<h;e++){var a=b[e];if(\"undefined\"!==typeof a&&null!==a)return a}}function D(b,h){if(!b)return h;var e=b.split(\".\").reverse();if(1===e.length)return h[b];for(b=e.pop();\"undefined\"!==typeof b&&\"undefined\"!==typeof h&&null!==\nh;)h=h[b],b=e.pop();return h}g.timers=[];var J=g.charts,t=g.doc,G=g.win;(c||(c={})).messages=[];g.error=c;var L=function(){function b(b,h,e){this.options=h;this.elem=b;this.prop=e}b.prototype.dSetter=function(){var b=this.paths,h=b&&b[0];b=b&&b[1];var e=[],a=this.now||0;if(1!==a&&h&&b)if(h.length===b.length&&1>a)for(var z=0;z<b.length;z++){for(var x=h[z],f=b[z],d=[],k=0;k<f.length;k++){var N=x[k],l=f[k];d[k]=\"number\"===typeof N&&\"number\"===typeof l&&(\"A\"!==f[0]||4!==k&&5!==k)?N+a*(l-N):l}e.push(d)}else e=\nb;else e=this.toD||[];this.elem.attr(\"d\",e,void 0,!0)};b.prototype.update=function(){var b=this.elem,h=this.prop,e=this.now,a=this.options.step;if(this[h+\"Setter\"])this[h+\"Setter\"]();else b.attr?b.element&&b.attr(h,e,null,!0):b.style[h]=e+this.unit;a&&a.call(b,e,this)};b.prototype.run=function(b,h,e){var a=this,z=a.options,x=function(b){return x.stopped?!1:a.step(b)},f=G.requestAnimationFrame||function(b){setTimeout(b,13)},d=function(){for(var b=0;b<g.timers.length;b++)g.timers[b]()||g.timers.splice(b--,\n1);g.timers.length&&f(d)};b!==h||this.elem[\"forceAnimate:\"+this.prop]?(this.startTime=+new Date,this.start=b,this.end=h,this.unit=e,this.now=this.start,this.pos=0,x.elem=this.elem,x.prop=this.prop,x()&&1===g.timers.push(x)&&f(d)):(delete z.curAnim[this.prop],z.complete&&0===Object.keys(z.curAnim).length&&z.complete.call(this.elem))};b.prototype.step=function(b){var h=+new Date,e=this.options,a=this.elem,z=e.complete,x=e.duration,f=e.curAnim;if(a.attr&&!a.element)b=!1;else if(b||h>=x+this.startTime){this.now=\nthis.end;this.pos=1;this.update();var d=f[this.prop]=!0;W(f,function(b){!0!==b&&(d=!1)});d&&z&&z.call(a);b=!1}else this.pos=e.easing((h-this.startTime)/x),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b};b.prototype.initPath=function(b,h,e){function a(b,h){for(;b.length<u;){var e=b[0],a=h[u-b.length];a&&\"M\"===e[0]&&(b[0]=\"C\"===a[0]?[\"C\",e[1],e[2],e[1],e[2],e[1],e[2]]:[\"L\",e[1],e[2]]);b.unshift(e);d&&b.push(b[b.length-1])}}function z(b,h){for(;b.length<u;)if(h=b[b.length/\nk-1].slice(),\"C\"===h[0]&&(h[1]=h[5],h[2]=h[6]),d){var e=b[b.length/k].slice();b.splice(b.length/2,0,h,e)}else b.push(h)}var x=b.startX,f=b.endX;h=h&&h.slice();e=e.slice();var d=b.isArea,k=d?2:1;if(!h)return[e,e];if(x&&f){for(b=0;b<x.length;b++)if(x[b]===f[0]){var N=b;break}else if(x[0]===f[f.length-x.length+b]){N=b;var l=!0;break}else if(x[x.length-1]===f[f.length-x.length+b]){N=x.length-b;break}\"undefined\"===typeof N&&(h=[])}if(h.length&&I(N)){var u=e.length+N*k;l?(a(h,e),z(e,h)):(a(e,h),z(h,e))}return[h,\ne]};b.prototype.fillSetter=function(){b.prototype.strokeSetter.apply(this,arguments)};b.prototype.strokeSetter=function(){this.elem.attr(this.prop,g.color(this.start).tweenTo(g.color(this.end),this.pos),null,!0)};return b}();g.Fx=L;g.merge=R;var v=g.pInt=function(b,h){return parseInt(b,h||10)},K=g.isString=function(b){return\"string\"===typeof b},n=g.isArray=function(b){b=Object.prototype.toString.call(b);return\"[object Array]\"===b||\"[object Array Iterator]\"===b};g.isObject=y;var r=g.isDOMElement=function(b){return y(b)&&\n\"number\"===typeof b.nodeType},C=g.isClass=function(b){var h=b&&b.constructor;return!(!y(b,!0)||r(b)||!h||!h.name||\"Object\"===h.name)},I=g.isNumber=function(b){return\"number\"===typeof b&&!isNaN(b)&&Infinity>b&&-Infinity<b},p=g.erase=function(b,h){for(var e=b.length;e--;)if(b[e]===h){b.splice(e,1);break}},m=g.defined=function(b){return\"undefined\"!==typeof b&&null!==b};g.attr=q;var d=g.splat=function(b){return n(b)?b:[b]},l=g.syncTimeout=function(b,h,e){if(0<h)return setTimeout(b,h,e);b.call(0,e);return-1},\nk=g.clearTimeout=function(b){m(b)&&clearTimeout(b)},f=g.extend=function(b,h){var e;b||(b={});for(e in h)b[e]=h[e];return b};g.pick=H;var a=g.css=function(b,h){g.isMS&&!g.svg&&h&&\"undefined\"!==typeof h.opacity&&(h.filter=\"alpha(opacity=\"+100*h.opacity+\")\");f(b.style,h)},A=g.createElement=function(b,h,e,z,x){b=t.createElement(b);h&&f(b,h);x&&a(b,{padding:\"0\",border:\"none\",margin:\"0\"});e&&a(b,e);z&&z.appendChild(b);return b},u=g.extendClass=function(b,h){var e=function(){};e.prototype=new b;f(e.prototype,\nh);return e},E=g.pad=function(b,h,e){return Array((h||2)+1-String(b).replace(\"-\",\"\").length).join(e||\"0\")+b},P=g.relativeLength=function(b,h,e){return/%$/.test(b)?h*parseFloat(b)/100+(e||0):parseFloat(b)},w=g.wrap=function(b,h,e){var a=b[h];b[h]=function(){var b=Array.prototype.slice.call(arguments),h=arguments,z=this;z.proceed=function(){a.apply(z,arguments.length?arguments:h)};b.unshift(a);b=e.apply(this,b);z.proceed=null;return b}},M=g.format=function(b,h,e){var a=\"{\",z=!1,x=[],f=/f$/,d=/\\.([0-9])/,\nk=g.defaultOptions.lang,N=e&&e.time||g.time;for(e=e&&e.numberFormatter||Y;b;){var l=b.indexOf(a);if(-1===l)break;var u=b.slice(0,l);if(z){u=u.split(\":\");a=D(u.shift()||\"\",h);if(u.length&&\"number\"===typeof a)if(u=u.join(\":\"),f.test(u)){var m=parseInt((u.match(d)||[\"\",\"-1\"])[1],10);null!==a&&(a=e(a,m,k.decimalPoint,-1<u.indexOf(\",\")?k.thousandsSep:\"\"))}else a=N.dateFormat(u,a);x.push(a)}else x.push(u);b=b.slice(l+1);a=(z=!z)?\"}\":\"{\"}x.push(b);return x.join(\"\")},F=g.getMagnitude=function(b){return Math.pow(10,\nMath.floor(Math.log(b)/Math.LN10))},Q=g.normalizeTickInterval=function(b,h,e,a,z){var x=b;e=H(e,1);var f=b/e;h||(h=z?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===a&&(1===e?h=h.filter(function(b){return 0===b%1}):.1>=e&&(h=[1/e])));for(a=0;a<h.length&&!(x=h[a],z&&x*e>=b||!z&&f<=(h[a]+(h[a+1]||h[a]))/2);a++);return x=N(x*e,-Math.round(Math.log(.001)/Math.LN10))},e=g.stableSort=function(b,h){var e=b.length,a,z;for(z=0;z<e;z++)b[z].safeI=z;b.sort(function(b,e){a=h(b,e);return 0===a?b.safeI-e.safeI:\na});for(z=0;z<e;z++)delete b[z].safeI},b=g.arrayMin=function(b){for(var h=b.length,e=b[0];h--;)b[h]<e&&(e=b[h]);return e},h=g.arrayMax=function(b){for(var h=b.length,e=b[0];h--;)b[h]>e&&(e=b[h]);return e},z=g.destroyObjectProperties=function(b,h){W(b,function(e,a){e&&e!==h&&e.destroy&&e.destroy();delete b[a]})},x=g.discardElement=function(b){var h=g.garbageBin;h||(h=A(\"div\"));b&&h.appendChild(b);h.innerHTML=\"\"},N=g.correctFloat=function(b,h){return parseFloat(b.toPrecision(h||14))},aa=g.setAnimation=\nfunction(b,h){h.renderer.globalAnimation=H(b,h.options.chart.animation,!0)},Z=g.animObject=function(b){return y(b)?R(b):{duration:b?500:0}},V=g.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5},Y=g.numberFormat=function(b,h,e,a){b=+b||0;h=+h;var z=g.defaultOptions.lang,x=(b.toString().split(\".\")[1]||\"\").split(\"e\")[0].length,f=b.toString().split(\"e\");if(-1===h)h=Math.min(x,20);else if(!I(h))h=2;else if(h&&f[1]&&0>f[1]){var d=h+ +f[1];0<=d?(f[0]=\n(+f[0]).toExponential(d).split(\"e\")[0],h=d):(f[0]=f[0].split(\".\")[0]||0,b=20>h?(f[0]*Math.pow(10,f[1])).toFixed(h):0,f[1]=0)}var k=(Math.abs(f[1]?f[0]:b)+Math.pow(10,-Math.max(h,x)-1)).toFixed(h);x=String(v(k));d=3<x.length?x.length%3:0;e=H(e,z.decimalPoint);a=H(a,z.thousandsSep);b=(0>b?\"-\":\"\")+(d?x.substr(0,d)+a:\"\");b+=x.substr(d).replace(/(\\d{3})(?=\\d)/g,\"$1\"+a);h&&(b+=e+k.slice(-h));f[1]&&0!==+b&&(b+=\"e\"+f[1]);return b};Math.easeInOutSine=function(b){return-.5*(Math.cos(Math.PI*b)-1)};var ba=g.getStyle=\nfunction(b,h,e){if(\"width\"===h)return h=Math.min(b.offsetWidth,b.scrollWidth),e=b.getBoundingClientRect&&b.getBoundingClientRect().width,e<h&&e>=h-1&&(h=Math.floor(e)),Math.max(0,h-g.getStyle(b,\"padding-left\")-g.getStyle(b,\"padding-right\"));if(\"height\"===h)return Math.max(0,Math.min(b.offsetHeight,b.scrollHeight)-g.getStyle(b,\"padding-top\")-g.getStyle(b,\"padding-bottom\"));G.getComputedStyle||c(27,!0);if(b=G.getComputedStyle(b,void 0))b=b.getPropertyValue(h),H(e,\"opacity\"!==h)&&(b=v(b));return b},\nU=g.inArray=function(b,h,e){c(32,!1,void 0,{\"Highcharts.inArray\":\"use Array.indexOf\"});return h.indexOf(b,e)},X=g.find=Array.prototype.find?function(b,h){return b.find(h)}:function(b,h){var e,a=b.length;for(e=0;e<a;e++)if(h(b[e],e))return b[e]};g.keys=function(b){c(32,!1,void 0,{\"Highcharts.keys\":\"use Object.keys\"});return Object.keys(b)};var ia=g.offset=function(b){var h=t.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0};return{top:b.top+(G.pageYOffset||h.scrollTop)-\n(h.clientTop||0),left:b.left+(G.pageXOffset||h.scrollLeft)-(h.clientLeft||0)}},S=g.stop=function(b,h){for(var e=g.timers.length;e--;)g.timers[e].elem!==b||h&&h!==g.timers[e].prop||(g.timers[e].stopped=!0)},W=g.objectEach=function(b,h,e){for(var a in b)Object.hasOwnProperty.call(b,a)&&h.call(e||b[a],b[a],a,b)};W({map:\"map\",each:\"forEach\",grep:\"filter\",reduce:\"reduce\",some:\"some\"},function(b,h){g[h]=function(e){var a;c(32,!1,void 0,(a={},a[\"Highcharts.\"+h]=\"use Array.\"+b,a));return Array.prototype[b].apply(e,\n[].slice.call(arguments,1))}});var ja=g.addEvent=function(b,h,e,a){void 0===a&&(a={});var z=b.addEventListener||g.addEventListenerPolyfill;var x=\"function\"===typeof b&&b.prototype?b.prototype.protoEvents=b.prototype.protoEvents||{}:b.hcEvents=b.hcEvents||{};g.Point&&b instanceof g.Point&&b.series&&b.series.chart&&(b.series.chart.runTrackerClick=!0);z&&z.call(b,h,e,!1);x[h]||(x[h]=[]);x[h].push({fn:e,order:\"number\"===typeof a.order?a.order:Infinity});x[h].sort(function(b,h){return b.order-h.order});\nreturn function(){ea(b,h,e)}},ea=g.removeEvent=function(b,h,e){function a(h,e){var a=b.removeEventListener||g.removeEventListenerPolyfill;a&&a.call(b,h,e,!1)}function z(e){var z;if(b.nodeName){if(h){var x={};x[h]=!0}else x=e;W(x,function(b,h){if(e[h])for(z=e[h].length;z--;)a(h,e[h][z].fn)})}}var x;[\"protoEvents\",\"hcEvents\"].forEach(function(f,d){var k=(d=d?b:b.prototype)&&d[f];k&&(h?(x=k[h]||[],e?(k[h]=x.filter(function(b){return e!==b.fn}),a(h,e)):(z(k),k[h]=[])):(z(k),d[f]={}))})},da=g.fireEvent=\nfunction(b,h,e,a){var z;e=e||{};if(t.createEvent&&(b.dispatchEvent||b.fireEvent)){var x=t.createEvent(\"Events\");x.initEvent(h,!0,!0);f(x,e);b.dispatchEvent?b.dispatchEvent(x):b.fireEvent(h,x)}else e.target||f(e,{preventDefault:function(){e.defaultPrevented=!0},target:b,type:h}),function(h,a){void 0===h&&(h=[]);void 0===a&&(a=[]);var x=0,f=0,d=h.length+a.length;for(z=0;z<d;z++)!1===(h[x]?a[f]?h[x].order<=a[f].order?h[x++]:a[f++]:h[x++]:a[f++]).fn.call(b,e)&&e.preventDefault()}(b.protoEvents&&b.protoEvents[h],\nb.hcEvents&&b.hcEvents[h]);a&&!e.defaultPrevented&&a.call(b,e)},ka=g.animate=function(b,h,e){var a,z=\"\",x,f;if(!y(e)){var d=arguments;e={duration:d[2],easing:d[3],complete:d[4]}}I(e.duration)||(e.duration=400);e.easing=\"function\"===typeof e.easing?e.easing:Math[e.easing]||Math.easeInOutSine;e.curAnim=R(h);W(h,function(d,k){S(b,k);f=new L(b,e,k);x=null;\"d\"===k&&n(h.d)?(f.paths=f.initPath(b,b.pathArray,h.d),f.toD=h.d,a=0,x=1):b.attr?a=b.attr(k):(a=parseFloat(ba(b,k))||0,\"opacity\"!==k&&(z=\"px\"));x||\n(x=d);x&&x.match&&x.match(\"px\")&&(x=x.replace(/px/g,\"\"));f.run(a,x,z)})},la=g.seriesType=function(b,h,e,a,x){var z=fa(),f=g.seriesTypes;z.plotOptions[b]=R(z.plotOptions[h],e);f[b]=u(f[h]||function(){},a);f[b].prototype.type=b;x&&(f[b].prototype.pointClass=u(g.Point,x));return f[b]},ca,ha=g.uniqueKey=function(){var b=Math.random().toString(36).substring(2,9)+\"-\",h=0;return function(){return\"highcharts-\"+(ca?\"\":b)+h++}}(),ma=g.useSerialIds=function(b){return ca=H(b,ca)},O=g.isFunction=function(b){return\"function\"===\ntypeof b},fa=g.getOptions=function(){return g.defaultOptions},na=g.setOptions=function(b){g.defaultOptions=R(!0,g.defaultOptions,b);(b.time||b.global)&&g.time.update(R(g.defaultOptions.global,g.defaultOptions.time,b.global,b.time));return g.defaultOptions};G.jQuery&&(G.jQuery.fn.highcharts=function(){var b=[].slice.call(arguments);if(this[0])return b[0]?(new (g[K(b[0])?b.shift():\"Chart\"])(this[0],b[0],b[1]),this):J[q(this[0],\"data-highcharts-chart\")]});return{Fx:g.Fx,addEvent:ja,animate:ka,animObject:Z,\narrayMax:h,arrayMin:b,attr:q,clamp:function(b,h,e){return b>h?b<e?b:e:h},clearTimeout:k,correctFloat:N,createElement:A,css:a,defined:m,destroyObjectProperties:z,discardElement:x,erase:p,error:c,extend:f,extendClass:u,find:X,fireEvent:da,format:M,getMagnitude:F,getNestedProperty:D,getOptions:fa,getStyle:ba,inArray:U,isArray:n,isClass:C,isDOMElement:r,isFunction:O,isNumber:I,isObject:y,isString:K,merge:R,normalizeTickInterval:Q,numberFormat:Y,objectEach:W,offset:ia,pad:E,pick:H,pInt:v,relativeLength:P,\nremoveEvent:ea,seriesType:la,setAnimation:aa,setOptions:na,splat:d,stableSort:e,stop:S,syncTimeout:l,timeUnits:V,uniqueKey:ha,useSerialIds:ma,wrap:w}});O(q,\"parts/Color.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var R=c.isNumber,y=c.merge,q=c.pInt;c=function(){function c(g){this.parsers=[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(c){return[q(c[1]),q(c[2]),q(c[3]),parseFloat(c[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\nparse:function(c){return[q(c[1]),q(c[2]),q(c[3]),1]}}];this.rgba=[];if(!(this instanceof c))return new c(g);this.init(g)}c.parse=function(g){return new c(g)};c.prototype.init=function(g){var J,t;if((this.input=g=c.names[g&&g.toLowerCase?g.toLowerCase():\"\"]||g)&&g.stops)this.stops=g.stops.map(function(v){return new c(v[1])});else{if(g&&g.charAt&&\"#\"===g.charAt()){var G=g.length;g=parseInt(g.substr(1),16);7===G?J=[(g&16711680)>>16,(g&65280)>>8,g&255,1]:4===G&&(J=[(g&3840)>>4|(g&3840)>>8,(g&240)>>4|\ng&240,(g&15)<<4|g&15,1])}if(!J)for(t=this.parsers.length;t--&&!J;){var L=this.parsers[t];(G=L.regex.exec(g))&&(J=L.parse(G))}}this.rgba=J||[]};c.prototype.get=function(c){var g=this.input,t=this.rgba;if(\"undefined\"!==typeof this.stops){var G=y(g);G.stops=[].concat(G.stops);this.stops.forEach(function(g,v){G.stops[v]=[G.stops[v][0],g.get(c)]})}else G=t&&R(t[0])?\"rgb\"===c||!c&&1===t[3]?\"rgb(\"+t[0]+\",\"+t[1]+\",\"+t[2]+\")\":\"a\"===c?t[3]:\"rgba(\"+t.join(\",\")+\")\":g;return G};c.prototype.brighten=function(c){var g,\nt=this.rgba;if(this.stops)this.stops.forEach(function(g){g.brighten(c)});else if(R(c)&&0!==c)for(g=0;3>g;g++)t[g]+=q(255*c),0>t[g]&&(t[g]=0),255<t[g]&&(t[g]=255);return this};c.prototype.setOpacity=function(c){this.rgba[3]=c;return this};c.prototype.tweenTo=function(c,g){var t=this.rgba,G=c.rgba;G.length&&t&&t.length?(c=1!==G[3]||1!==t[3],g=(c?\"rgba(\":\"rgb(\")+Math.round(G[0]+(t[0]-G[0])*(1-g))+\",\"+Math.round(G[1]+(t[1]-G[1])*(1-g))+\",\"+Math.round(G[2]+(t[2]-G[2])*(1-g))+(c?\",\"+(G[3]+(t[3]-G[3])*(1-\ng)):\"\")+\")\"):g=c.input||\"none\";return g};c.names={white:\"#ffffff\",black:\"#000000\"};return c}();g.Color=c;g.color=c.parse;return g.Color});O(q,\"parts/SVGElement.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){var y=c.deg2rad,B=c.doc,H=c.hasTouch,D=c.isFirefox,J=c.noop,t=c.svg,G=c.SVG_NS,L=c.win,v=q.animate,K=q.animObject,n=q.attr,r=q.createElement,C=q.css,I=q.defined,p=q.erase,m=q.extend,d=q.fireEvent,l=q.isArray,k=q.isFunction,f=q.isNumber,a=q.isString,A=q.merge,\nu=q.objectEach,E=q.pick,P=q.pInt,w=q.stop,M=q.uniqueKey;\"\";q=function(){function F(){this.height=this.element=void 0;this.opacity=1;this.renderer=void 0;this.SVG_NS=G;this.symbolCustomAttribs=\"x y width height r start end innerR anchorX anchorY rounded\".split(\" \");this.width=void 0}F.prototype._defaultGetter=function(a){a=E(this[a+\"Value\"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a};F.prototype._defaultSetter=function(a,e,b){b.setAttribute(e,\na)};F.prototype.add=function(a){var e=this.renderer,b=this.element;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;\"undefined\"!==typeof this.textStr&&\"text\"===this.element.nodeName&&e.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)var h=this.zIndexSetter();h||(a?a.element:e.box).appendChild(b);if(this.onAdd)this.onAdd();return this};F.prototype.addClass=function(a,e){var b=e?\"\":this.attr(\"class\")||\"\";a=(a||\"\").split(/ /g).reduce(function(h,e){-1===b.indexOf(e)&&h.push(e);return h},\nb?[b]:[]).join(\" \");a!==b&&this.attr(\"class\",a);return this};F.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};F.prototype.align=function(f,e,b){var h,z={};var x=this.renderer;var d=x.alignedObjects;var k,l;if(f){if(this.alignOptions=f,this.alignByTranslate=e,!b||a(b))this.alignTo=h=b||\"renderer\",p(d,this),d.push(this),b=void 0}else f=this.alignOptions,e=this.alignByTranslate,h=this.alignTo;b=E(b,x[h],x);h=f.align;x=f.verticalAlign;d=(b.x||0)+(f.x||\n0);var u=(b.y||0)+(f.y||0);\"right\"===h?k=1:\"center\"===h&&(k=2);k&&(d+=(b.width-(f.width||0))/k);z[e?\"translateX\":\"x\"]=Math.round(d);\"bottom\"===x?l=1:\"middle\"===x&&(l=2);l&&(u+=(b.height-(f.height||0))/l);z[e?\"translateY\":\"y\"]=Math.round(u);this[this.placed?\"animate\":\"attr\"](z);this.placed=!0;this.alignAttr=z;return this};F.prototype.alignSetter=function(a){var e={left:\"start\",center:\"middle\",right:\"end\"};e[a]&&(this.alignValue=a,this.element.setAttribute(\"text-anchor\",e[a]))};F.prototype.animate=\nfunction(a,e,b){var h=K(E(e,this.renderer.globalAnimation,!0));E(B.hidden,B.msHidden,B.webkitHidden,!1)&&(h.duration=0);0!==h.duration?(b&&(h.complete=b),v(this,a,h)):(this.attr(a,void 0,b),u(a,function(b,e){h.step&&h.step.call(this,b,{prop:e,pos:1})},this));return this};F.prototype.applyTextOutline=function(a){var e=this.element,b;-1!==a.indexOf(\"contrast\")&&(a=a.replace(/contrast/g,this.renderer.getContrast(e.style.fill)));a=a.split(\" \");var h=a[a.length-1];if((b=a[0])&&\"none\"!==b&&c.svg){this.fakeTS=\n!0;a=[].slice.call(e.getElementsByTagName(\"tspan\"));this.ySetter=this.xSetter;b=b.replace(/(^[\\d\\.]+)(.*?)$/g,function(b,h,e){return 2*h+e});this.removeTextOutline(a);var z=e.textContent?/^[\\u0591-\\u065F\\u066A-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC]/.test(e.textContent):!1;var x=e.firstChild;a.forEach(function(a,f){0===f&&(a.setAttribute(\"x\",e.getAttribute(\"x\")),f=e.getAttribute(\"y\"),a.setAttribute(\"y\",f||0),null===f&&e.setAttribute(\"y\",0));f=a.cloneNode(!0);n(z&&!D?a:f,{\"class\":\"highcharts-text-outline\",\nfill:h,stroke:h,\"stroke-width\":b,\"stroke-linejoin\":\"round\"});e.insertBefore(f,x)});z&&D&&a[0]&&(a=a[0].cloneNode(!0),a.textContent=\" \",e.insertBefore(a,x))}};F.prototype.attr=function(a,e,b,h){var z=this.element,x,f=this,d,k,l=this.symbolCustomAttribs;if(\"string\"===typeof a&&\"undefined\"!==typeof e){var m=a;a={};a[m]=e}\"string\"===typeof a?f=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,z):(u(a,function(b,e){d=!1;h||w(this,e);this.symbolName&&-1!==l.indexOf(e)&&(x||(this.symbolAttr(a),x=!0),d=\n!0);!this.rotation||\"x\"!==e&&\"y\"!==e||(this.doTransform=!0);d||(k=this[e+\"Setter\"]||this._defaultSetter,k.call(this,b,e,z),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(e)&&this.updateShadows(e,b,k))},this),this.afterSetters());b&&b.call(this);return f};F.prototype.clip=function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")};F.prototype.crisp=function(a,e){e=e||a.strokeWidth||0;var b=Math.round(e)%2/2;a.x=Math.floor(a.x||\nthis.x||0)+b;a.y=Math.floor(a.y||this.y||0)+b;a.width=Math.floor((a.width||this.width||0)-2*b);a.height=Math.floor((a.height||this.height||0)-2*b);I(a.strokeWidth)&&(a.strokeWidth=e);return a};F.prototype.complexColor=function(a,e,b){var h=this.renderer,z,x,f,k,m,p,w,C,Q,r,E=[],S;d(this.renderer,\"complexColor\",{args:arguments},function(){a.radialGradient?x=\"radialGradient\":a.linearGradient&&(x=\"linearGradient\");if(x){f=a[x];m=h.gradients;p=a.stops;Q=b.radialReference;l(f)&&(a[x]=f={x1:f[0],y1:f[1],\nx2:f[2],y2:f[3],gradientUnits:\"userSpaceOnUse\"});\"radialGradient\"===x&&Q&&!I(f.gradientUnits)&&(k=f,f=A(f,h.getRadialAttr(Q,k),{gradientUnits:\"userSpaceOnUse\"}));u(f,function(b,h){\"id\"!==h&&E.push(h,b)});u(p,function(b){E.push(b)});E=E.join(\",\");if(m[E])r=m[E].attr(\"id\");else{f.id=r=M();var d=m[E]=h.createElement(x).attr(f).add(h.defs);d.radAttr=k;d.stops=[];p.forEach(function(b){0===b[1].indexOf(\"rgba\")?(z=g.parse(b[1]),w=z.get(\"rgb\"),C=z.get(\"a\")):(w=b[1],C=1);b=h.createElement(\"stop\").attr({offset:b[0],\n\"stop-color\":w,\"stop-opacity\":C}).add(d);d.stops.push(b)})}S=\"url(\"+h.url+\"#\"+r+\")\";b.setAttribute(e,S);b.gradient=E;a.toString=function(){return S}}})};F.prototype.css=function(a){var e=this.styles,b={},h=this.element,z=\"\",x=!e,f=[\"textOutline\",\"textOverflow\",\"width\"];a&&a.color&&(a.fill=a.color);e&&u(a,function(h,a){e&&e[a]!==h&&(b[a]=h,x=!0)});if(x){e&&(a=m(e,b));if(a)if(null===a.width||\"auto\"===a.width)delete this.textWidth;else if(\"text\"===h.nodeName.toLowerCase()&&a.width)var d=this.textWidth=\nP(a.width);this.styles=a;d&&!t&&this.renderer.forExport&&delete a.width;if(h.namespaceURI===this.SVG_NS){var k=function(b,h){return\"-\"+h.toLowerCase()};u(a,function(b,h){-1===f.indexOf(h)&&(z+=h.replace(/([A-Z])/g,k)+\":\"+b+\";\")});z&&n(h,\"style\",z)}else C(h,a);this.added&&(\"text\"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline))}return this};F.prototype.dashstyleSetter=function(a){var e=this[\"stroke-width\"];\"inherit\"===e&&(e=1);if(a=a&&a.toLowerCase()){var b=\na.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(a=b.length;a--;)b[a]=\"\"+P(b[a])*E(e,NaN);a=b.join(\",\").replace(/NaN/g,\"none\");this.element.setAttribute(\"stroke-dasharray\",a)}};F.prototype.destroy=function(){var a=this,e=a.element||{},b=a.renderer,h=b.isSVG&&\"SPAN\"===e.nodeName&&a.parentGroup||void 0,z=e.ownerSVGElement;\ne.onclick=e.onmouseout=e.onmouseover=e.onmousemove=e.point=null;w(a);if(a.clipPath&&z){var x=a.clipPath;[].forEach.call(z.querySelectorAll(\"[clip-path],[CLIP-PATH]\"),function(b){-1<b.getAttribute(\"clip-path\").indexOf(x.element.id)&&b.removeAttribute(\"clip-path\")});a.clipPath=x.destroy()}if(a.stops){for(z=0;z<a.stops.length;z++)a.stops[z].destroy();a.stops.length=0;a.stops=void 0}a.safeRemoveChild(e);for(b.styledMode||a.destroyShadows();h&&h.div&&0===h.div.childNodes.length;)e=h.parentGroup,a.safeRemoveChild(h.div),\ndelete h.div,h=e;a.alignTo&&p(b.alignedObjects,a);u(a,function(b,h){a[h]&&a[h].parentGroup===a&&a[h].destroy&&a[h].destroy();delete a[h]})};F.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0};F.prototype.destroyTextPath=function(a,e){var b=a.getElementsByTagName(\"text\")[0];if(b){if(b.removeAttribute(\"dx\"),b.removeAttribute(\"dy\"),e.element.setAttribute(\"id\",\"\"),this.textPathWrapper&&b.getElementsByTagName(\"textPath\").length){for(a=\nthis.textPathWrapper.element.childNodes;a.length;)b.appendChild(a[0]);b.removeChild(this.textPathWrapper.element)}}else if(a.getAttribute(\"dx\")||a.getAttribute(\"dy\"))a.removeAttribute(\"dx\"),a.removeAttribute(\"dy\");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};F.prototype.dSetter=function(a,e,b){l(a)&&(\"string\"===typeof a[0]&&(a=this.renderer.pathToSegments(a)),this.pathArray=a,a=a.reduce(function(b,a,e){return a&&a.join?(e?b+\" \":\"\")+a.join(\" \"):(a||\"\").toString()},\"\"));\n/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");this[e]!==a&&(b.setAttribute(e,a),this[e]=a)};F.prototype.fadeOut=function(a){var e=this;e.animate({opacity:0},{duration:E(a,150),complete:function(){e.attr({y:-9999}).hide()}})};F.prototype.fillSetter=function(a,e,b){\"string\"===typeof a?b.setAttribute(e,a):a&&this.complexColor(a,e,b)};F.prototype.getBBox=function(a,e){var b,h=this.renderer,z=this.element,x=this.styles,f=this.textStr,d=h.cache,l=h.cacheKeys,u=z.namespaceURI===this.SVG_NS;e=E(e,this.rotation,0);\nvar A=h.styledMode?z&&F.prototype.getStyle.call(z,\"font-size\"):x&&x.fontSize;if(I(f)){var p=f.toString();-1===p.indexOf(\"<\")&&(p=p.replace(/[0-9]/g,\"0\"));p+=[\"\",e,A,this.textWidth,x&&x.textOverflow,x&&x.fontWeight].join()}p&&!a&&(b=d[p]);if(!b){if(u||h.forExport){try{var w=this.fakeTS&&function(b){[].forEach.call(z.querySelectorAll(\".highcharts-text-outline\"),function(h){h.style.display=b})};k(w)&&w(\"none\");b=z.getBBox?m({},z.getBBox()):{width:z.offsetWidth,height:z.offsetHeight};k(w)&&w(\"\")}catch(X){\"\"}if(!b||\n0>b.width)b={width:0,height:0}}else b=this.htmlGetBBox();h.isSVG&&(a=b.width,h=b.height,u&&(b.height=h={\"11px,17\":14,\"13px,20\":16}[x&&x.fontSize+\",\"+Math.round(h)]||h),e&&(x=e*y,b.width=Math.abs(h*Math.sin(x))+Math.abs(a*Math.cos(x)),b.height=Math.abs(h*Math.cos(x))+Math.abs(a*Math.sin(x))));if(p&&0<b.height){for(;250<l.length;)delete d[l.shift()];d[p]||l.push(p);d[p]=b}}return b};F.prototype.getStyle=function(a){return L.getComputedStyle(this.element||this,\"\").getPropertyValue(a)};F.prototype.hasClass=\nfunction(a){return-1!==(\"\"+this.attr(\"class\")).split(\" \").indexOf(a)};F.prototype.hide=function(a){a?this.attr({y:-9999}):this.attr({visibility:\"hidden\"});return this};F.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};F.prototype.init=function(a,e){this.element=\"span\"===e?r(e):B.createElementNS(this.SVG_NS,e);this.renderer=a;d(this,\"afterInit\")};F.prototype.invert=function(a){this.inverted=a;this.updateTransform();return this};F.prototype.on=function(a,e){var b,h,z=this.element,\nx;H&&\"click\"===a?(z.ontouchstart=function(a){b=a.touches[0].clientX;h=a.touches[0].clientY},z.ontouchend=function(a){b&&4<=Math.sqrt(Math.pow(b-a.changedTouches[0].clientX,2)+Math.pow(h-a.changedTouches[0].clientY,2))||e.call(z,a);x=!0;a.preventDefault()},z.onclick=function(b){x||e.call(z,b)}):z[\"on\"+a]=e;return this};F.prototype.opacitySetter=function(a,e,b){this[e]=a;b.setAttribute(e,a)};F.prototype.removeClass=function(f){return this.attr(\"class\",(\"\"+this.attr(\"class\")).replace(a(f)?new RegExp(\"(^| )\"+\nf+\"( |$)\"):f,\" \").replace(/ +/g,\" \").trim())};F.prototype.removeTextOutline=function(a){for(var e=a.length,b;e--;)b=a[e],\"highcharts-text-outline\"===b.getAttribute(\"class\")&&p(a,this.element.removeChild(b))};F.prototype.safeRemoveChild=function(a){var e=a.parentNode;e&&e.removeChild(a)};F.prototype.setRadialReference=function(a){var e=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=a;e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(a,e.radAttr));\nreturn this};F.prototype.setTextPath=function(a,e){var b=this.element,h={textAnchor:\"text-anchor\"},z=!1,x=this.textPathWrapper,d=!x;e=A(!0,{enabled:!0,attributes:{dy:-5,startOffset:\"50%\",textAnchor:\"middle\"}},e);var k=e.attributes;if(a&&e&&e.enabled){x&&null===x.element.parentNode?(d=!0,x=x.destroy()):x&&this.removeTextOutline.call(x.parentGroup,[].slice.call(b.getElementsByTagName(\"tspan\")));this.options&&this.options.padding&&(k.dx=-this.options.padding);x||(this.textPathWrapper=x=this.renderer.createElement(\"textPath\"),\nz=!0);var l=x.element;(e=a.element.getAttribute(\"id\"))||a.element.setAttribute(\"id\",e=M());if(d)for(a=b.getElementsByTagName(\"tspan\");a.length;)a[0].setAttribute(\"y\",0),f(k.dx)&&a[0].setAttribute(\"x\",-k.dx),l.appendChild(a[0]);z&&x&&x.add({element:this.text?this.text.element:b});l.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",this.renderer.url+\"#\"+e);I(k.dy)&&(l.parentNode.setAttribute(\"dy\",k.dy),delete k.dy);I(k.dx)&&(l.parentNode.setAttribute(\"dx\",k.dx),delete k.dx);u(k,function(b,a){l.setAttribute(h[a]||\na,b)});b.removeAttribute(\"transform\");this.removeTextOutline.call(x,[].slice.call(b.getElementsByTagName(\"tspan\")));this.text&&!this.renderer.styledMode&&this.attr({fill:\"none\",\"stroke-width\":0});this.applyTextOutline=this.updateTransform=J}else x&&(delete this.updateTransform,delete this.applyTextOutline,this.destroyTextPath(b,a),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};F.prototype.shadow=function(a,e,b){var h=\n[],z=this.element,x=!1,f=this.oldShadowOptions;var d={color:\"#000000\",offsetX:1,offsetY:1,opacity:.15,width:3};var k;!0===a?k=d:\"object\"===typeof a&&(k=m(d,a));k&&(k&&f&&u(k,function(b,h){b!==f[h]&&(x=!0)}),x&&this.destroyShadows(),this.oldShadowOptions=k);if(!k)this.destroyShadows();else if(!this.shadows){var l=k.opacity/k.width;var A=this.parentInverted?\"translate(-1,-1)\":\"translate(\"+k.offsetX+\", \"+k.offsetY+\")\";for(d=1;d<=k.width;d++){var p=z.cloneNode(!1);var w=2*k.width+1-2*d;n(p,{stroke:a.color||\n\"#000000\",\"stroke-opacity\":l*d,\"stroke-width\":w,transform:A,fill:\"none\"});p.setAttribute(\"class\",(p.getAttribute(\"class\")||\"\")+\" highcharts-shadow\");b&&(n(p,\"height\",Math.max(n(p,\"height\")-w,0)),p.cutHeight=w);e?e.element.appendChild(p):z.parentNode&&z.parentNode.insertBefore(p,z);h.push(p)}this.shadows=h}return this};F.prototype.show=function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})};F.prototype.strokeSetter=function(a,e,b){this[e]=a;this.stroke&&this[\"stroke-width\"]?(F.prototype.fillSetter.call(this,\nthis.stroke,\"stroke\",b),b.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0):\"stroke-width\"===e&&0===a&&this.hasStroke?(b.removeAttribute(\"stroke\"),this.hasStroke=!1):this.renderer.styledMode&&this[\"stroke-width\"]&&(b.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0)};F.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this[\"stroke-width\"]||0;var a=this.getStyle(\"stroke-width\"),e=0;if(a.indexOf(\"px\")===a.length-2)e=P(a);else if(\"\"!==a){var b=\nB.createElementNS(G,\"rect\");n(b,{width:a,\"stroke-width\":0});this.element.parentNode.appendChild(b);e=b.getBBox().width;b.parentNode.removeChild(b)}return e};F.prototype.symbolAttr=function(a){var e=this;\"x y r start end width height innerR anchorX anchorY clockwise\".split(\" \").forEach(function(b){e[b]=E(a[b],e[b])});e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})};F.prototype.textSetter=function(a){a!==this.textStr&&(delete this.textPxLength,this.textStr=a,this.added&&this.renderer.buildText(this))};\nF.prototype.titleSetter=function(a){var e=this.element.getElementsByTagName(\"title\")[0];e||(e=B.createElementNS(this.SVG_NS,\"title\"),this.element.appendChild(e));e.firstChild&&e.removeChild(e.firstChild);e.appendChild(B.createTextNode(String(E(a,\"\")).replace(/<[^>]*>/g,\"\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\")))};F.prototype.toFront=function(){var a=this.element;a.parentNode.appendChild(a);return this};F.prototype.translate=function(a,e){return this.attr({translateX:a,translateY:e})};F.prototype.updateShadows=\nfunction(a,e,b){var h=this.shadows;if(h)for(var z=h.length;z--;)b.call(h[z],\"height\"===a?Math.max(e-(h[z].cutHeight||0),0):\"d\"===a?this.d:e,a,h[z])};F.prototype.updateTransform=function(){var a=this.translateX||0,e=this.translateY||0,b=this.scaleX,h=this.scaleY,z=this.inverted,x=this.rotation,f=this.matrix,d=this.element;z&&(a+=this.width,e+=this.height);a=[\"translate(\"+a+\",\"+e+\")\"];I(f)&&a.push(\"matrix(\"+f.join(\",\")+\")\");z?a.push(\"rotate(90) scale(-1,1)\"):x&&a.push(\"rotate(\"+x+\" \"+E(this.rotationOriginX,\nd.getAttribute(\"x\"),0)+\" \"+E(this.rotationOriginY,d.getAttribute(\"y\")||0)+\")\");(I(b)||I(h))&&a.push(\"scale(\"+E(b,1)+\" \"+E(h,1)+\")\");a.length&&d.setAttribute(\"transform\",a.join(\" \"))};F.prototype.visibilitySetter=function(a,e,b){\"inherit\"===a?b.removeAttribute(e):this[e]!==a&&b.setAttribute(e,a);this[e]=a};F.prototype.xGetter=function(a){\"circle\"===this.element.nodeName&&(\"x\"===a?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)};F.prototype.zIndexSetter=function(a,e){var b=this.renderer,h=this.parentGroup,\nz=(h||b).element||b.box,x=this.element,f=!1;b=z===b.box;var d=this.added;var k;I(a)?(x.setAttribute(\"data-z-index\",a),a=+a,this[e]===a&&(d=!1)):I(this[e])&&x.removeAttribute(\"data-z-index\");this[e]=a;if(d){(a=this.zIndex)&&h&&(h.handleZ=!0);e=z.childNodes;for(k=e.length-1;0<=k&&!f;k--){h=e[k];d=h.getAttribute(\"data-z-index\");var l=!I(d);if(h!==x)if(0>a&&l&&!b&&!k)z.insertBefore(x,e[k]),f=!0;else if(P(d)<=a||l&&(!I(a)||0<=a))z.insertBefore(x,e[k+1]||null),f=!0}f||(z.insertBefore(x,e[b?3:0]||null),\nf=!0)}return f};return F}();q.prototype[\"stroke-widthSetter\"]=q.prototype.strokeSetter;q.prototype.yGetter=q.prototype.xGetter;q.prototype.matrixSetter=q.prototype.rotationOriginXSetter=q.prototype.rotationOriginYSetter=q.prototype.rotationSetter=q.prototype.scaleXSetter=q.prototype.scaleYSetter=q.prototype.translateXSetter=q.prototype.translateYSetter=q.prototype.verticalAlignSetter=function(a,f){this[f]=a;this.doTransform=!0};c.SVGElement=q;return c.SVGElement});O(q,\"parts/SVGLabel.js\",[q[\"parts/SVGElement.js\"],\nq[\"parts/Utilities.js\"]],function(g,c){var q=this&&this.__extends||function(){var c=function(g,L){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,g){c.__proto__=g}||function(c,g){for(var n in g)g.hasOwnProperty(n)&&(c[n]=g[n])};return c(g,L)};return function(g,L){function v(){this.constructor=g}c(g,L);g.prototype=null===L?Object.create(L):(v.prototype=L.prototype,new v)}}(),y=c.defined,B=c.extend,H=c.isNumber,D=c.merge,J=c.removeEvent;return function(c){function t(g,v,K,n,r,C,\nI,p,m,d){var l=c.call(this)||this;l.init(g,\"g\");l.textStr=v;l.x=K;l.y=n;l.anchorX=C;l.anchorY=I;l.baseline=m;l.className=d;\"button\"!==d&&l.addClass(\"highcharts-label\");d&&l.addClass(\"highcharts-\"+d);l.text=g.text(\"\",0,0,p).attr({zIndex:1});if(\"string\"===typeof r){var k=/^url\\((.*?)\\)$/.test(r);if(l.renderer.symbols[r]||k)l.symbolKey=r}l.bBox=t.emptyBBox;l.padding=3;l.paddingLeft=0;l.baselineOffset=0;l.needsBox=g.styledMode||k;l.deferredAttr={};l.alignFactor=0;return l}q(t,c);t.prototype.alignSetter=\nfunction(c){c={left:0,center:.5,right:1}[c];c!==this.alignFactor&&(this.alignFactor=c,this.bBox&&H(this.xSetting)&&this.attr({x:this.xSetting}))};t.prototype.anchorXSetter=function(c,g){this.anchorX=c;this.boxAttr(g,Math.round(c)-this.getCrispAdjust()-this.xSetting)};t.prototype.anchorYSetter=function(c,g){this.anchorY=c;this.boxAttr(g,c-this.ySetting)};t.prototype.boxAttr=function(c,g){this.box?this.box.attr(c,g):this.deferredAttr[c]=g};t.prototype.css=function(c){if(c){var v={};c=D(c);t.textProps.forEach(function(n){\"undefined\"!==\ntypeof c[n]&&(v[n]=c[n],delete c[n])});this.text.css(v);var L=\"fontSize\"in v||\"fontWeight\"in v;if(\"width\"in v||L)this.updateBoxSize(),L&&this.updateTextPadding()}return g.prototype.css.call(this,c)};t.prototype.destroy=function(){J(this.element,\"mouseenter\");J(this.element,\"mouseleave\");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());g.prototype.destroy.call(this)};t.prototype.fillSetter=function(c,g){c&&(this.needsBox=!0);this.fill=c;this.boxAttr(g,c)};t.prototype.getBBox=\nfunction(){var c=this.bBox,g=this.padding;return{width:c.width+2*g,height:c.height+2*g,x:c.x-g,y:c.y-g}};t.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this[\"stroke-width\"]?parseInt(this[\"stroke-width\"],10):0)%2/2};t.prototype.heightSetter=function(c){this.heightSetting=c};t.prototype.on=function(c,v){var t=this,n=t.text,r=n&&\"SPAN\"===n.element.tagName?n:void 0;if(r){var C=function(C){(\"mouseenter\"===c||\"mouseleave\"===c)&&C.relatedTarget instanceof\nElement&&(t.element.contains(C.relatedTarget)||r.element.contains(C.relatedTarget))||v.call(t.element,C)};r.on(c,C)}g.prototype.on.call(t,c,C||v);return t};t.prototype.onAdd=function(){var c=this.textStr;this.text.add(this);this.attr({text:y(c)?c:\"\",x:this.x,y:this.y});this.box&&y(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};t.prototype.paddingSetter=function(c){y(c)&&c!==this.padding&&(this.padding=c,this.updateTextPadding())};t.prototype.paddingLeftSetter=function(c){y(c)&&\nc!==this.paddingLeft&&(this.paddingLeft=c,this.updateTextPadding())};t.prototype.rSetter=function(c,g){this.boxAttr(g,c)};t.prototype.shadow=function(c){c&&!this.renderer.styledMode&&(this.updateBoxSize(),this.box&&this.box.shadow(c));return this};t.prototype.strokeSetter=function(c,g){this.stroke=c;this.boxAttr(g,c)};t.prototype[\"stroke-widthSetter\"]=function(c,g){c&&(this.needsBox=!0);this[\"stroke-width\"]=c;this.boxAttr(g,c)};t.prototype[\"text-alignSetter\"]=function(c){this.textAlign=c};t.prototype.textSetter=\nfunction(c){\"undefined\"!==typeof c&&this.text.attr({text:c});this.updateBoxSize();this.updateTextPadding()};t.prototype.updateBoxSize=function(){var c=this.text.element.style,g={},G=this.padding,n=this.paddingLeft,r=H(this.widthSetting)&&H(this.heightSetting)&&!this.textAlign||!y(this.text.textStr)?t.emptyBBox:this.text.getBBox();this.width=(this.widthSetting||r.width||0)+2*G+n;this.height=(this.heightSetting||r.height||0)+2*G;this.baselineOffset=G+Math.min(this.renderer.fontMetrics(c&&c.fontSize,\nthis.text).b,r.height||Infinity);this.needsBox&&(this.box||(c=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),c.addClass((\"button\"===this.className?\"\":\"highcharts-label-box\")+(this.className?\" highcharts-\"+this.className+\"-box\":\"\")),c.add(this),c=this.getCrispAdjust(),g.x=c,g.y=(this.baseline?-this.baselineOffset:0)+c),g.width=Math.round(this.width),g.height=Math.round(this.height),this.box.attr(B(g,this.deferredAttr)),this.deferredAttr={});this.bBox=r};t.prototype.updateTextPadding=\nfunction(){var c=this.text,g=this.baseline?0:this.baselineOffset,t=this.paddingLeft+this.padding;y(this.widthSetting)&&this.bBox&&(\"center\"===this.textAlign||\"right\"===this.textAlign)&&(t+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(t!==c.x||g!==c.y)c.attr(\"x\",t),c.hasBoxWidthChanged&&(this.bBox=c.getBBox(!0),this.updateBoxSize()),\"undefined\"!==typeof g&&c.attr(\"y\",g);c.x=t;c.y=g};t.prototype.widthSetter=function(c){this.widthSetting=H(c)?c:void 0};t.prototype.xSetter=\nfunction(c){this.x=c;this.alignFactor&&(c-=this.alignFactor*((this.widthSetting||this.bBox.width)+2*this.padding),this[\"forceAnimate:x\"]=!0);this.xSetting=Math.round(c);this.attr(\"translateX\",this.xSetting)};t.prototype.ySetter=function(c){this.ySetting=this.y=Math.round(c);this.attr(\"translateY\",this.ySetting)};t.emptyBBox={width:0,height:0,x:0,y:0};t.textProps=\"color cursor direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width\".split(\" \");\nreturn t}(g)});O(q,\"parts/SVGRenderer.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/SVGElement.js\"],q[\"parts/SVGLabel.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B){var H=B.addEvent,D=B.attr,J=B.createElement,t=B.css,G=B.defined,L=B.destroyObjectProperties,v=B.extend,K=B.isArray,n=B.isNumber,r=B.isObject,C=B.isString,I=B.merge,p=B.objectEach,m=B.pick,d=B.pInt,l=B.splat,k=B.uniqueKey,f=c.charts,a=c.deg2rad,A=c.doc,u=c.isFirefox,E=c.isMS,P=c.isWebKit;B=c.noop;var w=c.svg,M=c.SVG_NS,F=c.symbolSizes,\nQ=c.win,e=function(){function b(b,a,e,f,d,k,l){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(b,a,e,f,d,k,l)}b.prototype.init=function(b,a,e,f,d,k,l){var h=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"});l||h.css(this.getStyle(f));f=h.element;b.appendChild(f);D(b,\"dir\",\"ltr\");-1===b.innerHTML.indexOf(\"xmlns\")&&\nD(f,\"xmlns\",this.SVG_NS);this.isSVG=!0;this.box=f;this.boxWrapper=h;this.alignedObjects=[];this.url=(u||P)&&A.getElementsByTagName(\"base\").length?Q.location.href.split(\"#\")[0].replace(/<[^>]*>/g,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(A.createTextNode(\"Created with Highcharts 8.1.2\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=k;this.forExport=d;this.styledMode=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=\n0;this.setSize(a,e,!1);var x;u&&b.getBoundingClientRect&&(a=function(){t(b,{left:0,top:0});x=b.getBoundingClientRect();t(b,{left:Math.ceil(x.left)-x.left+\"px\",top:Math.ceil(x.top)-x.top+\"px\"})},a(),this.unSubPixelFix=H(Q,\"resize\",a))};b.prototype.definition=function(b){function h(b,e){var f;l(b).forEach(function(b){var x=a.createElement(b.tagName),z={};p(b,function(b,h){\"tagName\"!==h&&\"children\"!==h&&\"textContent\"!==h&&(z[h]=b)});x.attr(z);x.add(e||a.defs);b.textContent&&x.element.appendChild(A.createTextNode(b.textContent));\nh(b.children||[],x);f=x});return f}var a=this;return h(b)};b.prototype.getStyle=function(b){return this.style=v({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',fontSize:\"12px\"},b)};b.prototype.setStyle=function(b){this.boxWrapper.css(this.getStyle(b))};b.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};b.prototype.destroy=function(){var b=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();L(this.gradients||{});this.gradients=null;\nb&&(this.defs=b.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};b.prototype.createElement=function(b){var h=new this.Element;h.init(this,b);return h};b.prototype.getRadialAttr=function(b,a){return{cx:b[0]-b[2]/2+a.cx*b[2],cy:b[1]-b[2]/2+a.cy*b[2],r:a.r*b[2]}};b.prototype.truncate=function(b,a,e,f,d,k,l){var h=this,x=b.rotation,z,u=f?1:0,N=(e||f).length,m=N,p=[],w=function(b){a.firstChild&&a.removeChild(a.firstChild);b&&a.appendChild(A.createTextNode(b))},c=function(x,\nz){z=z||x;if(\"undefined\"===typeof p[z])if(a.getSubStringLength)try{p[z]=d+a.getSubStringLength(0,f?z+1:z)}catch(ha){\"\"}else h.getSpanWidth&&(w(l(e||f,x)),p[z]=d+h.getSpanWidth(b,a));return p[z]},C;b.rotation=0;var r=c(a.textContent.length);if(C=d+r>k){for(;u<=N;)m=Math.ceil((u+N)/2),f&&(z=l(f,m)),r=c(m,z&&z.length-1),u===N?u=N+1:r>k?N=m-1:u=m;0===N?w(\"\"):e&&N===e.length-1||w(z||l(e||f,m))}f&&f.splice(0,m);b.actualWidth=r;b.rotation=x;return C};b.prototype.buildText=function(b){var h=b.element,a=this,\ne=a.forExport,f=m(b.textStr,\"\").toString(),k=-1!==f.indexOf(\"<\"),l=h.childNodes,u,c=D(h,\"x\"),r=b.styles,E=b.textWidth,n=r&&r.lineHeight,S=r&&r.textOutline,g=r&&\"ellipsis\"===r.textOverflow,I=r&&\"nowrap\"===r.whiteSpace,F=r&&r.fontSize,P,v=l.length;r=E&&!b.added&&this.box;var G=function(b){var e;a.styledMode||(e=/(px|em)$/.test(b&&b.style.fontSize)?b.style.fontSize:F||a.style.fontSize||12);return n?d(n):a.fontMetrics(e,b.getAttribute(\"style\")?b:h).h},Q=function(b,h){p(a.escapes,function(a,e){h&&-1!==\nh.indexOf(a)||(b=b.toString().replace(new RegExp(a,\"g\"),e))});return b},q=function(b,h){var a=b.indexOf(\"<\");b=b.substring(a,b.indexOf(\">\")-a);a=b.indexOf(h+\"=\");if(-1!==a&&(a=a+h.length+1,h=b.charAt(a),'\"'===h||\"'\"===h))return b=b.substring(a+1),b.substring(0,b.indexOf(h))},K=/<br.*?>/g;var J=[f,g,I,n,S,F,E].join();if(J!==b.textCache){for(b.textCache=J;v--;)h.removeChild(l[v]);k||S||g||E||-1!==f.indexOf(\" \")&&(!I||K.test(f))?(r&&r.appendChild(h),k?(f=a.styledMode?f.replace(/<(b|strong)>/g,'<span class=\"highcharts-strong\">').replace(/<(i|em)>/g,\n'<span class=\"highcharts-emphasized\">'):f.replace(/<(b|strong)>/g,'<span style=\"font-weight:bold\">').replace(/<(i|em)>/g,'<span style=\"font-style:italic\">'),f=f.replace(/<a/g,\"<span\").replace(/<\\/(b|strong|i|em|a)>/g,\"</span>\").split(K)):f=[f],f=f.filter(function(b){return\"\"!==b}),f.forEach(function(f,x){var z=0,d=0;f=f.replace(/^\\s+|\\s+$/g,\"\").replace(/<span/g,\"|||<span\").replace(/<\\/span>/g,\"</span>|||\");var k=f.split(\"|||\");k.forEach(function(f){if(\"\"!==f||1===k.length){var l={},N=A.createElementNS(a.SVG_NS,\n\"tspan\"),m,p;(m=q(f,\"class\"))&&D(N,\"class\",m);if(m=q(f,\"style\"))m=m.replace(/(;| |^)color([ :])/,\"$1fill$2\"),D(N,\"style\",m);if((p=q(f,\"href\"))&&!e&&-1===p.split(\":\")[0].toLowerCase().indexOf(\"javascript\")){var C=A.createElementNS(a.SVG_NS,\"a\");D(C,\"href\",p);D(N,\"class\",\"highcharts-anchor\");C.appendChild(N);a.styledMode||t(N,{cursor:\"pointer\"})}f=Q(f.replace(/<[a-zA-Z\\/](.|\\n)*?>/g,\"\")||\" \");if(\" \"!==f){N.appendChild(A.createTextNode(f));z?l.dx=0:x&&null!==c&&(l.x=c);D(N,l);h.appendChild(C||N);!z&&\nP&&(!w&&e&&t(N,{display:\"block\"}),D(N,\"dy\",G(N)));if(E){var r=f.replace(/([^\\^])-/g,\"$1- \").split(\" \");l=!I&&(1<k.length||x||1<r.length);C=0;p=G(N);if(g)u=a.truncate(b,N,f,void 0,0,Math.max(0,E-parseInt(F||12,10)),function(b,h){return b.substring(0,h)+\"\\u2026\"});else if(l)for(;r.length;)r.length&&!I&&0<C&&(N=A.createElementNS(M,\"tspan\"),D(N,{dy:p,x:c}),m&&D(N,\"style\",m),N.appendChild(A.createTextNode(r.join(\" \").replace(/- /g,\"-\"))),h.appendChild(N)),a.truncate(b,N,null,r,0===C?d:0,E,function(b,h){return r.slice(0,\nh).join(\" \").replace(/- /g,\"-\")}),d=b.actualWidth,C++}z++}}});P=P||h.childNodes.length}),g&&u&&b.attr(\"title\",Q(b.textStr||\"\",[\"&lt;\",\"&gt;\"])),r&&r.removeChild(h),C(S)&&b.applyTextOutline&&b.applyTextOutline(S)):h.appendChild(A.createTextNode(Q(f)))}};b.prototype.getContrast=function(b){b=g.parse(b).rgba;b[0]*=1;b[1]*=1.2;b[2]*=.5;return 459<b[0]+b[1]+b[2]?\"#000000\":\"#FFFFFF\"};b.prototype.button=function(b,a,e,f,d,k,l,u,m,p){var h=this.label(b,a,e,m,void 0,void 0,p,void 0,\"button\"),x=0,z=this.styledMode;\nb=d&&d.style||{};d&&d.style&&delete d.style;h.attr(I({padding:8,r:2},d));if(!z){d=I({fill:\"#f7f7f7\",stroke:\"#cccccc\",\"stroke-width\":1,style:{color:\"#333333\",cursor:\"pointer\",fontWeight:\"normal\"}},{style:b},d);var N=d.style;delete d.style;k=I(d,{fill:\"#e6e6e6\"},k);var A=k.style;delete k.style;l=I(d,{fill:\"#e6ebf5\",style:{color:\"#000000\",fontWeight:\"bold\"}},l);var w=l.style;delete l.style;u=I(d,{style:{color:\"#cccccc\"}},u);var c=u.style;delete u.style}H(h.element,E?\"mouseover\":\"mouseenter\",function(){3!==\nx&&h.setState(1)});H(h.element,E?\"mouseout\":\"mouseleave\",function(){3!==x&&h.setState(x)});h.setState=function(b){1!==b&&(h.state=x=b);h.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][b||0]);z||h.attr([d,k,l,u][b||0]).css([N,A,w,c][b||0])};z||h.attr(d).css(v({cursor:\"default\"},N));return h.on(\"click\",function(b){3!==x&&f.call(h,b)})};b.prototype.crispLine=function(b,a,e){void 0===e&&(e=\"round\");var h=b[0],f=b[1];\nh[1]===f[1]&&(h[1]=f[1]=Math[e](h[1])-a%2/2);h[2]===f[2]&&(h[2]=f[2]=Math[e](h[2])+a%2/2);return b};b.prototype.path=function(b){var h=this.styledMode?{}:{fill:\"none\"};K(b)?h.d=b:r(b)&&v(h,b);return this.createElement(\"path\").attr(h)};b.prototype.circle=function(b,a,e){b=r(b)?b:\"undefined\"===typeof b?{}:{x:b,y:a,r:e};a=this.createElement(\"circle\");a.xSetter=a.ySetter=function(b,h,a){a.setAttribute(\"c\"+h,b)};return a.attr(b)};b.prototype.arc=function(b,a,e,f,d,k){r(b)?(f=b,a=f.y,e=f.r,b=f.x):f={innerR:f,\nstart:d,end:k};b=this.symbol(\"arc\",b,a,e,e,f);b.r=e;return b};b.prototype.rect=function(b,a,e,f,d,k){d=r(b)?b.r:d;var h=this.createElement(\"rect\");b=r(b)?b:\"undefined\"===typeof b?{}:{x:b,y:a,width:Math.max(e,0),height:Math.max(f,0)};this.styledMode||(\"undefined\"!==typeof k&&(b.strokeWidth=k,b=h.crisp(b)),b.fill=\"none\");d&&(b.r=d);h.rSetter=function(b,a,e){h.r=b;D(e,{rx:b,ry:b})};h.rGetter=function(){return h.r};return h.attr(b)};b.prototype.setSize=function(b,a,e){var h=this.alignedObjects,f=h.length;\nthis.width=b;this.height=a;for(this.boxWrapper.animate({width:b,height:a},{step:function(){this.attr({viewBox:\"0 0 \"+this.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:m(e,!0)?void 0:0});f--;)h[f].align()};b.prototype.g=function(b){var h=this.createElement(\"g\");return b?h.attr({\"class\":\"highcharts-\"+b}):h};b.prototype.image=function(b,a,e,f,d,k){var h={preserveAspectRatio:\"none\"},x=function(b,h){b.setAttributeNS?b.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",h):b.setAttribute(\"hc-svg-href\",\nh)},z=function(h){x(l.element,b);k.call(l,h)};1<arguments.length&&v(h,{x:a,y:e,width:f,height:d});var l=this.createElement(\"image\").attr(h);k?(x(l.element,\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"),h=new Q.Image,H(h,\"load\",z),h.src=b,h.complete&&z({})):x(l.element,b);return l};b.prototype.symbol=function(b,a,e,d,k,l){var h=this,x=/^url\\((.*?)\\)$/,z=x.test(b),u=!z&&(this.symbols[b]?b:\"circle\"),N=u&&this.symbols[u],p;if(N){\"number\"===typeof a&&(p=N.call(this.symbols,\nMath.round(a||0),Math.round(e||0),d||0,k||0,l));var w=this.path(p);h.styledMode||w.attr(\"fill\",\"none\");v(w,{symbolName:u,x:a,y:e,width:d,height:k});l&&v(w,l)}else if(z){var c=b.match(x)[1];w=this.image(c);w.imgwidth=m(F[c]&&F[c].width,l&&l.width);w.imgheight=m(F[c]&&F[c].height,l&&l.height);var C=function(){w.attr({width:w.width,height:w.height})};[\"width\",\"height\"].forEach(function(b){w[b+\"Setter\"]=function(b,h){var a={},e=this[\"img\"+h],f=\"width\"===h?\"translateX\":\"translateY\";this[h]=b;G(e)&&(l&&\n\"within\"===l.backgroundSize&&this.width&&this.height&&(e=Math.round(e*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(h,e),this.alignByTranslate||(a[f]=((this[h]||0)-e)/2,this.attr(a)))}});G(a)&&w.attr({x:a,y:e});w.isImg=!0;G(w.imgwidth)&&G(w.imgheight)?C():(w.attr({width:0,height:0}),J(\"img\",{onload:function(){var b=f[h.chartIndex];0===this.width&&(t(this,{position:\"absolute\",top:\"-999em\"}),A.body.appendChild(this));F[c]={width:this.width,height:this.height};\nw.imgwidth=this.width;w.imgheight=this.height;w.element&&C();this.parentNode&&this.parentNode.removeChild(this);h.imgCount--;if(!h.imgCount&&b&&!b.hasLoaded)b.onload()},src:c}),this.imgCount++)}return w};b.prototype.clipRect=function(b,a,e,f){var h=k()+\"-\",x=this.createElement(\"clipPath\").attr({id:h}).add(this.defs);b=this.rect(b,a,e,f,0).add(x);b.id=h;b.clipPath=x;b.count=0;return b};b.prototype.text=function(b,a,e,f){var h={};if(f&&(this.allowHTML||!this.forExport))return this.html(b,a,e);h.x=Math.round(a||\n0);e&&(h.y=Math.round(e));G(b)&&(h.text=b);b=this.createElement(\"text\").attr(h);f||(b.xSetter=function(b,h,a){var e=a.getElementsByTagName(\"tspan\"),f=a.getAttribute(h),x;for(x=0;x<e.length;x++){var d=e[x];d.getAttribute(h)===f&&d.setAttribute(h,b)}a.setAttribute(h,b)});return b};b.prototype.fontMetrics=function(b,a){b=!this.styledMode&&/px/.test(b)||!Q.getComputedStyle?b||a&&a.style&&a.style.fontSize||this.style&&this.style.fontSize:a&&q.prototype.getStyle.call(a,\"font-size\");b=/px/.test(b)?d(b):\n12;a=24>b?b+3:Math.round(1.2*b);return{h:a,b:Math.round(.8*a),f:b}};b.prototype.rotCorr=function(b,e,f){var h=b;e&&f&&(h=Math.max(h*Math.cos(e*a),4));return{x:-b/3*Math.sin(e*a),y:h}};b.prototype.pathToSegments=function(b){for(var h=[],a=[],e={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},f=0;f<b.length;f++)C(a[0])&&n(b[f])&&a.length===e[a[0].toUpperCase()]&&b.splice(f,0,a[0].replace(\"M\",\"L\").replace(\"m\",\"l\")),\"string\"===typeof b[f]&&(a.length&&h.push(a.slice(0)),a.length=0),a.push(b[f]);h.push(a.slice(0));\nreturn h};b.prototype.label=function(b,a,e,f,d,k,l,u,m){return new y(this,b,a,e,f,d,k,l,u,m)};return b}();e.prototype.Element=q;e.prototype.SVG_NS=M;e.prototype.draw=B;e.prototype.escapes={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"};e.prototype.symbols={circle:function(b,h,a,e){return this.arc(b+a/2,h+e/2,a/2,e/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},square:function(b,h,a,e){return[[\"M\",b,h],[\"L\",b+a,h],[\"L\",b+a,h+e],[\"L\",b,h+e],[\"Z\"]]},triangle:function(b,h,a,e){return[[\"M\",\nb+a/2,h],[\"L\",b+a,h+e],[\"L\",b,h+e],[\"Z\"]]},\"triangle-down\":function(b,h,a,e){return[[\"M\",b,h],[\"L\",b+a,h],[\"L\",b+a/2,h+e],[\"Z\"]]},diamond:function(b,h,a,e){return[[\"M\",b+a/2,h],[\"L\",b+a,h+e/2],[\"L\",b+a/2,h+e],[\"L\",b,h+e/2],[\"Z\"]]},arc:function(b,h,a,e,f){var d=[];if(f){var x=f.start||0,k=f.end||0,z=f.r||a;a=f.r||e||a;var l=.001>Math.abs(k-x-2*Math.PI);k-=.001;e=f.innerR;l=m(f.open,l);var u=Math.cos(x),p=Math.sin(x),N=Math.cos(k),A=Math.sin(k);x=m(f.longArc,.001>k-x-Math.PI?0:1);d.push([\"M\",b+z*u,\nh+a*p],[\"A\",z,a,0,x,m(f.clockwise,1),b+z*N,h+a*A]);G(e)&&d.push(l?[\"M\",b+e*N,h+e*A]:[\"L\",b+e*N,h+e*A],[\"A\",e,e,0,x,G(f.clockwise)?1-f.clockwise:0,b+e*u,h+e*p]);l||d.push([\"Z\"])}return d},callout:function(b,h,a,e,f){var d=Math.min(f&&f.r||0,a,e),k=d+6,x=f&&f.anchorX||0;f=f&&f.anchorY||0;var z=[[\"M\",b+d,h],[\"L\",b+a-d,h],[\"C\",b+a,h,b+a,h,b+a,h+d],[\"L\",b+a,h+e-d],[\"C\",b+a,h+e,b+a,h+e,b+a-d,h+e],[\"L\",b+d,h+e],[\"C\",b,h+e,b,h+e,b,h+e-d],[\"L\",b,h+d],[\"C\",b,h,b,h,b+d,h]];x&&x>a?f>h+k&&f<h+e-k?z.splice(3,1,\n[\"L\",b+a,f-6],[\"L\",b+a+6,f],[\"L\",b+a,f+6],[\"L\",b+a,h+e-d]):z.splice(3,1,[\"L\",b+a,e/2],[\"L\",x,f],[\"L\",b+a,e/2],[\"L\",b+a,h+e-d]):x&&0>x?f>h+k&&f<h+e-k?z.splice(7,1,[\"L\",b,f+6],[\"L\",b-6,f],[\"L\",b,f-6],[\"L\",b,h+d]):z.splice(7,1,[\"L\",b,e/2],[\"L\",x,f],[\"L\",b,e/2],[\"L\",b,h+d]):f&&f>e&&x>b+k&&x<b+a-k?z.splice(5,1,[\"L\",x+6,h+e],[\"L\",x,h+e+6],[\"L\",x-6,h+e],[\"L\",b+d,h+e]):f&&0>f&&x>b+k&&x<b+a-k&&z.splice(1,1,[\"L\",x-6,h],[\"L\",x,h-6],[\"L\",x+6,h],[\"L\",a-d,h]);return z}};c.SVGRenderer=e;c.Renderer=c.SVGRenderer;\nreturn c.Renderer});O(q,\"parts/Html.js\",[q[\"parts/Globals.js\"],q[\"parts/SVGElement.js\"],q[\"parts/SVGRenderer.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=y.attr,H=y.createElement,D=y.css,J=y.defined,t=y.extend,G=y.pick,L=y.pInt,v=g.isFirefox,K=g.isMS,n=g.isWebKit,r=g.win;t(c.prototype,{htmlCss:function(c){var r=\"SPAN\"===this.element.tagName&&c&&\"width\"in c,p=G(r&&c.width,void 0);if(r){delete c.width;this.textWidth=p;var m=!0}c&&\"ellipsis\"===c.textOverflow&&(c.whiteSpace=\"nowrap\",c.overflow=\n\"hidden\");this.styles=t(this.styles,c);D(this.element,c);m&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var c=this.element;return{x:c.offsetLeft,y:c.offsetTop,width:c.offsetWidth,height:c.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var c=this.renderer,r=this.element,p=this.translateX||0,m=this.translateY||0,d=this.x||0,l=this.y||0,k=this.textAlign||\"left\",f={left:0,center:.5,right:1}[k],a=this.styles,A=a&&a.whiteSpace;D(r,{marginLeft:p,marginTop:m});!c.styledMode&&\nthis.shadows&&this.shadows.forEach(function(a){D(a,{marginLeft:p+1,marginTop:m+1})});this.inverted&&[].forEach.call(r.childNodes,function(a){c.invertChild(a,r)});if(\"SPAN\"===r.tagName){a=this.rotation;var u=this.textWidth&&L(this.textWidth),E=[a,k,r.innerHTML,this.textWidth,this.textAlign].join(),n;(n=u!==this.oldTextWidth)&&!(n=u>this.oldTextWidth)&&((n=this.textPxLength)||(D(r,{width:\"\",whiteSpace:A||\"nowrap\"}),n=r.offsetWidth),n=n>u);n&&(/[ \\-]/.test(r.textContent||r.innerText)||\"ellipsis\"===r.style.textOverflow)?\n(D(r,{width:u+\"px\",display:\"block\",whiteSpace:A||\"normal\"}),this.oldTextWidth=u,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;E!==this.cTT&&(A=c.fontMetrics(r.style.fontSize,r).b,!J(a)||a===(this.oldRotation||0)&&k===this.oldAlign||this.setSpanRotation(a,f,A),this.getSpanCorrection(!J(a)&&this.textPxLength||r.offsetWidth,A,f,a,k));D(r,{left:d+(this.xCorr||0)+\"px\",top:l+(this.yCorr||0)+\"px\"});this.cTT=E;this.oldRotation=a;this.oldAlign=k}}else this.alignOnAdd=!0},setSpanRotation:function(c,\nr,p){var m={},d=this.renderer.getTransformKey();m[d]=m.transform=\"rotate(\"+c+\"deg)\";m[d+(v?\"Origin\":\"-origin\")]=m.transformOrigin=100*r+\"% \"+p+\"px\";D(this.element,m)},getSpanCorrection:function(c,r,p){this.xCorr=-c*p;this.yCorr=-r}});t(q.prototype,{getTransformKey:function(){return K&&!/Edge/.test(r.navigator.userAgent)?\"-ms-transform\":n?\"-webkit-transform\":v?\"MozTransform\":r.opera?\"-o-transform\":\"\"},html:function(r,n,p){var m=this.createElement(\"span\"),d=m.element,l=m.renderer,k=l.isSVG,f=function(a,\nf){[\"opacity\",\"visibility\"].forEach(function(d){a[d+\"Setter\"]=function(k,l,u){var m=a.div?a.div.style:f;c.prototype[d+\"Setter\"].call(this,k,l,u);m&&(m[l]=k)}});a.addedSetters=!0};m.textSetter=function(a){a!==d.innerHTML&&(delete this.bBox,delete this.oldTextWidth);this.textStr=a;d.innerHTML=G(a,\"\");m.doTransform=!0};k&&f(m,m.element.style);m.xSetter=m.ySetter=m.alignSetter=m.rotationSetter=function(a,f){\"align\"===f&&(f=\"textAlign\");m[f]=a;m.doTransform=!0};m.afterSetters=function(){this.doTransform&&\n(this.htmlUpdateTransform(),this.doTransform=!1)};m.attr({text:r,x:Math.round(n),y:Math.round(p)}).css({position:\"absolute\"});l.styledMode||m.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});d.style.whiteSpace=\"nowrap\";m.css=m.htmlCss;k&&(m.add=function(a){var k=l.box.parentNode,u=[];if(this.parentGroup=a){var p=a.div;if(!p){for(;a;)u.push(a),a=a.parentGroup;u.reverse().forEach(function(a){function d(f,e){a[e]=f;\"translateX\"===e?A.left=f+\"px\":A.top=f+\"px\";a.doTransform=!0}var l=\nB(a.element,\"class\");p=a.div=a.div||H(\"div\",l?{className:l}:void 0,{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},p||k);var A=p.style;t(a,{classSetter:function(a){return function(e){this.element.setAttribute(\"class\",e);a.className=e}}(p),on:function(){u[0].div&&m.on.apply({element:u[0].div},arguments);return a},translateXSetter:d,translateYSetter:d});a.addedSetters||f(a)})}}else p=k;p.appendChild(d);\nm.added=!0;m.alignOnAdd&&m.htmlUpdateTransform();return m});return m}})});O(q,\"parts/Tick.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.clamp,y=c.correctFloat,B=c.defined,H=c.destroyObjectProperties,D=c.extend,J=c.fireEvent,t=c.isNumber,G=c.merge,L=c.objectEach,v=c.pick,K=g.deg2rad;c=function(){function c(c,C,n,p,m){this.isNewLabel=this.isNew=!0;this.axis=c;this.pos=C;this.type=n||\"\";this.parameters=m||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=\nthis.parameters.options;J(this,\"init\");n||p||this.addLabel()}c.prototype.addLabel=function(){var c=this,C=c.axis,n=C.options,p=C.chart,m=C.categories,d=C.logarithmic,l=C.names,k=c.pos,f=v(c.options&&c.options.labels,n.labels),a=C.tickPositions,A=k===a[0],u=k===a[a.length-1];l=this.parameters.category||(m?v(m[k],l[k],k):k);var E=c.label;m=(!f.step||1===f.step)&&1===C.tickInterval;a=a.info;var g,w;if(C.dateTime&&a){var M=p.time.resolveDTLFormat(n.dateTimeLabelFormats[!n.grid&&a.higherRanks[k]||a.unitName]);\nvar F=M.main}c.isFirst=A;c.isLast=u;c.formatCtx={axis:C,chart:p,isFirst:A,isLast:u,dateTimeLabelFormat:F,tickPositionInfo:a,value:d?y(d.lin2log(l)):l,pos:k};n=C.labelFormatter.call(c.formatCtx,this.formatCtx);if(w=M&&M.list)c.shortenLabel=function(){for(g=0;g<w.length;g++)if(E.attr({text:C.labelFormatter.call(D(c.formatCtx,{dateTimeLabelFormat:w[g]}))}),E.getBBox().width<C.getSlotWidth(c)-2*v(f.padding,5))return;E.attr({text:\"\"})};m&&C._addedPlotLB&&C.isXAxis&&c.moveLabel(n,f);B(E)||c.movedLabel?\nE&&E.textStr!==n&&!m&&(!E.textWidth||f.style&&f.style.width||E.styles.width||E.css({width:null}),E.attr({text:n}),E.textPxLength=E.getBBox().width):(c.label=E=c.createLabel({x:0,y:0},n,f),c.rotation=0)};c.prototype.createLabel=function(c,C,n){var p=this.axis,m=p.chart;if(c=B(C)&&n.enabled?m.renderer.text(C,c.x,c.y,n.useHTML).add(p.labelGroup):null)m.styledMode||c.css(G(n.style)),c.textPxLength=c.getBBox().width;return c};c.prototype.destroy=function(){H(this,this.axis)};c.prototype.getPosition=function(c,\nC,n,p){var m=this.axis,d=m.chart,l=p&&d.oldChartHeight||d.chartHeight;c={x:c?y(m.translate(C+n,null,null,p)+m.transB):m.left+m.offset+(m.opposite?(p&&d.oldChartWidth||d.chartWidth)-m.right-m.left:0),y:c?l-m.bottom+m.offset-(m.opposite?m.height:0):y(l-m.translate(C+n,null,null,p)-m.transB)};c.y=q(c.y,-1E5,1E5);J(this,\"afterGetPosition\",{pos:c});return c};c.prototype.getLabelPosition=function(c,C,n,p,m,d,l,k){var f=this.axis,a=f.transA,A=f.isLinked&&f.linkedParent?f.linkedParent.reversed:f.reversed,\nu=f.staggerLines,r=f.tickRotCorr||{x:0,y:0},g=m.y,w=p||f.reserveSpaceDefault?0:-f.labelOffset*(\"center\"===f.labelAlign?.5:1),M={};B(g)||(g=0===f.side?n.rotation?-8:-n.getBBox().height:2===f.side?r.y+8:Math.cos(n.rotation*K)*(r.y-n.getBBox(!1,0).height/2));c=c+m.x+w+r.x-(d&&p?d*a*(A?-1:1):0);C=C+g-(d&&!p?d*a*(A?1:-1):0);u&&(n=l/(k||1)%u,f.opposite&&(n=u-n-1),C+=f.labelOffset/u*n);M.x=c;M.y=Math.round(C);J(this,\"afterGetLabelPosition\",{pos:M,tickmarkOffset:d,index:l});return M};c.prototype.getLabelSize=\nfunction(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0};c.prototype.getMarkPath=function(c,C,n,p,m,d){return d.crispLine([[\"M\",c,C],[\"L\",c+(m?0:-n),C+(m?n:0)]],p)};c.prototype.handleOverflow=function(c){var r=this.axis,n=r.options.labels,p=c.x,m=r.chart.chartWidth,d=r.chart.spacing,l=v(r.labelLeft,Math.min(r.pos,d[3]));d=v(r.labelRight,Math.max(r.isRadial?0:r.pos+r.len,m-d[1]));var k=this.label,f=this.rotation,a={left:0,center:.5,right:1}[r.labelAlign||k.attr(\"align\")],\nA=k.getBBox().width,u=r.getSlotWidth(this),E=u,g=1,w,M={};if(f||\"justify\"!==v(n.overflow,\"justify\"))0>f&&p-a*A<l?w=Math.round(p/Math.cos(f*K)-l):0<f&&p+a*A>d&&(w=Math.round((m-p)/Math.cos(f*K)));else if(m=p+(1-a)*A,p-a*A<l?E=c.x+E*(1-a)-l:m>d&&(E=d-c.x+E*a,g=-1),E=Math.min(u,E),E<u&&\"center\"===r.labelAlign&&(c.x+=g*(u-E-a*(u-Math.min(A,E)))),A>E||r.autoRotation&&(k.styles||{}).width)w=E;w&&(this.shortenLabel?this.shortenLabel():(M.width=Math.floor(w)+\"px\",(n.style||{}).textOverflow||(M.textOverflow=\n\"ellipsis\"),k.css(M)))};c.prototype.moveLabel=function(c,C){var r=this,p=r.label,m=!1,d=r.axis,l=d.reversed,k=d.chart.inverted;p&&p.textStr===c?(r.movedLabel=p,m=!0,delete r.label):L(d.ticks,function(a){m||a.isNew||a===r||!a.label||a.label.textStr!==c||(r.movedLabel=a.label,m=!0,a.labelPos=r.movedLabel.xy,delete a.label)});if(!m&&(r.labelPos||p)){var f=r.labelPos||p.xy;p=k?f.x:l?0:d.width+d.left;d=k?l?d.width+d.left:0:f.y;r.movedLabel=r.createLabel({x:p,y:d},c,C);r.movedLabel&&r.movedLabel.attr({opacity:0})}};\nc.prototype.render=function(c,C,n){var p=this.axis,m=p.horiz,d=this.pos,l=v(this.tickmarkOffset,p.tickmarkOffset);d=this.getPosition(m,d,l,C);l=d.x;var k=d.y;p=m&&l===p.pos+p.len||!m&&k===p.pos?-1:1;n=v(n,1);this.isActive=!0;this.renderGridLine(C,n,p);this.renderMark(d,n,p);this.renderLabel(d,C,n,c);this.isNew=!1;J(this,\"afterRender\")};c.prototype.renderGridLine=function(c,C,n){var p=this.axis,m=p.options,d=this.gridLine,l={},k=this.pos,f=this.type,a=v(this.tickmarkOffset,p.tickmarkOffset),A=p.chart.renderer,\nu=f?f+\"Grid\":\"grid\",r=m[u+\"LineWidth\"],g=m[u+\"LineColor\"];m=m[u+\"LineDashStyle\"];d||(p.chart.styledMode||(l.stroke=g,l[\"stroke-width\"]=r,m&&(l.dashstyle=m)),f||(l.zIndex=1),c&&(C=0),this.gridLine=d=A.path().attr(l).addClass(\"highcharts-\"+(f?f+\"-\":\"\")+\"grid-line\").add(p.gridGroup));if(d&&(n=p.getPlotLinePath({value:k+a,lineWidth:d.strokeWidth()*n,force:\"pass\",old:c})))d[c||this.isNew?\"attr\":\"animate\"]({d:n,opacity:C})};c.prototype.renderMark=function(c,n,g){var p=this.axis,m=p.options,d=p.chart.renderer,\nl=this.type,k=l?l+\"Tick\":\"tick\",f=p.tickSize(k),a=this.mark,A=!a,u=c.x;c=c.y;var r=v(m[k+\"Width\"],!l&&p.isXAxis?1:0);m=m[k+\"Color\"];f&&(p.opposite&&(f[0]=-f[0]),A&&(this.mark=a=d.path().addClass(\"highcharts-\"+(l?l+\"-\":\"\")+\"tick\").add(p.axisGroup),p.chart.styledMode||a.attr({stroke:m,\"stroke-width\":r})),a[A?\"attr\":\"animate\"]({d:this.getMarkPath(u,c,f[0],a.strokeWidth()*g,p.horiz,d),opacity:n}))};c.prototype.renderLabel=function(c,n,g,p){var m=this.axis,d=m.horiz,l=m.options,k=this.label,f=l.labels,\na=f.step;m=v(this.tickmarkOffset,m.tickmarkOffset);var A=!0,u=c.x;c=c.y;k&&t(u)&&(k.xy=c=this.getLabelPosition(u,c,k,d,f,m,p,a),this.isFirst&&!this.isLast&&!v(l.showFirstLabel,1)||this.isLast&&!this.isFirst&&!v(l.showLastLabel,1)?A=!1:!d||f.step||f.rotation||n||0===g||this.handleOverflow(c),a&&p%a&&(A=!1),A&&t(c.y)?(c.opacity=g,k[this.isNewLabel?\"attr\":\"animate\"](c),this.isNewLabel=!1):(k.attr(\"y\",-9999),this.isNewLabel=!0))};c.prototype.replaceMovedLabel=function(){var c=this.label,n=this.axis,g=\nn.reversed,p=this.axis.chart.inverted;if(c&&!this.isNew){var m=p?c.xy.x:g?n.left:n.width+n.left;g=p?g?n.width+n.top:n.top:c.xy.y;c.animate({x:m,y:g,opacity:0},void 0,c.destroy);delete this.label}n.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return c}();g.Tick=c;return g.Tick});O(q,\"parts/Time.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.defined,y=c.error,B=c.extend,H=c.isObject,D=c.merge,J=c.objectEach,t=c.pad,G=c.pick,L=c.splat,v=c.timeUnits,K=g.win;\nc=function(){function c(c){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=K.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(c)}c.prototype.get=function(c,n){if(this.variableTimezone||this.timezoneOffset){var r=n.getTime(),p=r-this.getTimezoneOffset(n);n.setTime(p);c=n[\"getUTC\"+c]();n.setTime(r);return c}return this.useUTC?n[\"getUTC\"+c]():n[\"get\"+c]()};c.prototype.set=function(c,n,g){if(this.variableTimezone||this.timezoneOffset){if(\"Milliseconds\"===c||\"Seconds\"===\nc||\"Minutes\"===c)return n[\"setUTC\"+c](g);var p=this.getTimezoneOffset(n);p=n.getTime()-p;n.setTime(p);n[\"setUTC\"+c](g);c=this.getTimezoneOffset(n);p=n.getTime()+c;return n.setTime(p)}return this.useUTC?n[\"setUTC\"+c](g):n[\"set\"+c](g)};c.prototype.update=function(c){var n=G(c&&c.useUTC,!0);this.options=c=D(!0,this.options||{},c);this.Date=c.Date||K.Date||Date;this.timezoneOffset=(this.useUTC=n)&&c.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();this.variableTimezone=!(n&&!c.getTimezoneOffset&&\n!c.timezone)};c.prototype.makeTime=function(c,n,t,p,m,d){if(this.useUTC){var l=this.Date.UTC.apply(0,arguments);var k=this.getTimezoneOffset(l);l+=k;var f=this.getTimezoneOffset(l);k!==f?l+=f-k:k-36E5!==this.getTimezoneOffset(l-36E5)||g.isSafari||(l-=36E5)}else l=(new this.Date(c,n,G(t,1),G(p,0),G(m,0),G(d,0))).getTime();return l};c.prototype.timezoneOffsetFunction=function(){var c=this,n=this.options,g=K.moment;if(!this.useUTC)return function(c){return 6E4*(new Date(c.toString())).getTimezoneOffset()};\nif(n.timezone){if(g)return function(c){return 6E4*-g.tz(c,n.timezone).utcOffset()};y(25)}return this.useUTC&&n.getTimezoneOffset?function(c){return 6E4*n.getTimezoneOffset(c.valueOf())}:function(){return 6E4*(c.timezoneOffset||0)}};c.prototype.dateFormat=function(c,n,v){var p;if(!q(n)||isNaN(n))return(null===(p=g.defaultOptions.lang)||void 0===p?void 0:p.invalidDate)||\"\";c=G(c,\"%Y-%m-%d %H:%M:%S\");var m=this;p=new this.Date(n);var d=this.get(\"Hours\",p),l=this.get(\"Day\",p),k=this.get(\"Date\",p),f=this.get(\"Month\",\np),a=this.get(\"FullYear\",p),A=g.defaultOptions.lang,u=null===A||void 0===A?void 0:A.weekdays,E=null===A||void 0===A?void 0:A.shortWeekdays;p=B({a:E?E[l]:u[l].substr(0,3),A:u[l],d:t(k),e:t(k,2,\" \"),w:l,b:A.shortMonths[f],B:A.months[f],m:t(f+1),o:f+1,y:a.toString().substr(2,2),Y:a,H:t(d),k:d,I:t(d%12||12),l:d%12||12,M:t(this.get(\"Minutes\",p)),p:12>d?\"AM\":\"PM\",P:12>d?\"am\":\"pm\",S:t(p.getSeconds()),L:t(Math.floor(n%1E3),3)},g.dateFormats);J(p,function(a,f){for(;-1!==c.indexOf(\"%\"+f);)c=c.replace(\"%\"+f,\n\"function\"===typeof a?a.call(m,n):a)});return v?c.substr(0,1).toUpperCase()+c.substr(1):c};c.prototype.resolveDTLFormat=function(c){return H(c,!0)?c:(c=L(c),{main:c[0],from:c[1],to:c[2]})};c.prototype.getTimeTicks=function(c,n,g,p){var m=this,d=[],l={};var k=new m.Date(n);var f=c.unitRange,a=c.count||1,A;p=G(p,1);if(q(n)){m.set(\"Milliseconds\",k,f>=v.second?0:a*Math.floor(m.get(\"Milliseconds\",k)/a));f>=v.second&&m.set(\"Seconds\",k,f>=v.minute?0:a*Math.floor(m.get(\"Seconds\",k)/a));f>=v.minute&&m.set(\"Minutes\",\nk,f>=v.hour?0:a*Math.floor(m.get(\"Minutes\",k)/a));f>=v.hour&&m.set(\"Hours\",k,f>=v.day?0:a*Math.floor(m.get(\"Hours\",k)/a));f>=v.day&&m.set(\"Date\",k,f>=v.month?1:Math.max(1,a*Math.floor(m.get(\"Date\",k)/a)));if(f>=v.month){m.set(\"Month\",k,f>=v.year?0:a*Math.floor(m.get(\"Month\",k)/a));var u=m.get(\"FullYear\",k)}f>=v.year&&m.set(\"FullYear\",k,u-u%a);f===v.week&&(u=m.get(\"Day\",k),m.set(\"Date\",k,m.get(\"Date\",k)-u+p+(u<p?-7:0)));u=m.get(\"FullYear\",k);p=m.get(\"Month\",k);var E=m.get(\"Date\",k),r=m.get(\"Hours\",\nk);n=k.getTime();m.variableTimezone&&(A=g-n>4*v.month||m.getTimezoneOffset(n)!==m.getTimezoneOffset(g));n=k.getTime();for(k=1;n<g;)d.push(n),n=f===v.year?m.makeTime(u+k*a,0):f===v.month?m.makeTime(u,p+k*a):!A||f!==v.day&&f!==v.week?A&&f===v.hour&&1<a?m.makeTime(u,p,E,r+k*a):n+f*a:m.makeTime(u,p,E+k*a*(f===v.day?1:7)),k++;d.push(n);f<=v.hour&&1E4>d.length&&d.forEach(function(a){0===a%18E5&&\"000000000\"===m.dateFormat(\"%H%M%S%L\",a)&&(l[a]=\"day\")})}d.info=B(c,{higherRanks:l,totalRange:f*a});return d};\nreturn c}();g.Time=c;return g.Time});O(q,\"parts/Options.js\",[q[\"parts/Globals.js\"],q[\"parts/Time.js\"],q[\"parts/Color.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){q=q.parse;y=y.merge;g.defaultOptions={colors:\"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1\".split(\" \"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),\nshortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),weekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:{styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},\nposition:{align:\"right\",x:-10,y:10}},width:null,height:null,borderColor:\"#335cad\",backgroundColor:\"#ffffff\",plotBorderColor:\"#cccccc\"},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},caption:{margin:15,text:\"\",align:\"left\",verticalAlign:\"bottom\"},plotOptions:{},labels:{style:{position:\"absolute\",color:\"#333333\"}},legend:{enabled:!0,align:\"center\",alignColumns:!0,layout:\"horizontal\",labelFormatter:function(){return this.name},borderColor:\"#999999\",\nborderRadius:0,navigation:{activeColor:\"#003399\",inactiveColor:\"#cccccc\"},itemStyle:{color:\"#333333\",cursor:\"pointer\",fontSize:\"12px\",fontWeight:\"bold\",textOverflow:\"ellipsis\"},itemHoverStyle:{color:\"#000000\"},itemHiddenStyle:{color:\"#cccccc\"},shadow:!1,itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"45%\"},style:{position:\"absolute\",\nbackgroundColor:\"#ffffff\",opacity:.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:g.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},footerFormat:\"\",padding:8,snap:g.isTouchDevice?25:10,headerFormat:'<span style=\"font-size: 10px\">{point.key}</span><br/>',pointFormat:'<span style=\"color:{point.color}\">\\u25cf</span> {series.name}: <b>{point.y}</b><br/>',\nbackgroundColor:q(\"#f7f7f7\").setOpacity(.85).get(),borderWidth:1,shadow:!0,style:{color:\"#333333\",cursor:\"default\",fontSize:\"12px\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,href:\"https://www.highcharts.com?credits\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#999999\",fontSize:\"9px\"},text:\"Highcharts.com\"}};\"\";g.time=new c(y(g.defaultOptions.global,g.defaultOptions.time));g.dateFormat=function(c,q,y){return g.time.dateFormat(c,q,y)};return{dateFormat:g.dateFormat,\ndefaultOptions:g.defaultOptions,time:g.time}});O(q,\"parts/Axis.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Tick.js\"],q[\"parts/Utilities.js\"],q[\"parts/Options.js\"]],function(g,c,q,y,B){var H=y.addEvent,D=y.animObject,J=y.arrayMax,t=y.arrayMin,G=y.clamp,L=y.correctFloat,v=y.defined,K=y.destroyObjectProperties,n=y.error,r=y.extend,C=y.fireEvent,I=y.format,p=y.getMagnitude,m=y.isArray,d=y.isFunction,l=y.isNumber,k=y.isString,f=y.merge,a=y.normalizeTickInterval,A=y.objectEach,u=y.pick,E=y.relativeLength,\nP=y.removeEvent,w=y.splat,M=y.syncTimeout,F=B.defaultOptions,Q=c.deg2rad;y=function(){function e(b,a){this.zoomEnabled=this.width=this.visible=this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=\nthis.options=this.oldMin=this.oldMax=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.coll=this.closestPointRange=this.chart=this.categories=this.bottom=this.alternateBands=void 0;this.init(b,a)}e.prototype.init=function(b,a){var h=a.isX,e=this;e.chart=b;e.horiz=b.inverted&&!e.isZAxis?!h:h;e.isXAxis=h;e.coll=\ne.coll||(h?\"xAxis\":\"yAxis\");C(this,\"init\",{userOptions:a});e.opposite=a.opposite;e.side=a.side||(e.horiz?e.opposite?0:2:e.opposite?1:3);e.setOptions(a);var f=this.options,k=f.type;e.labelFormatter=f.labels.formatter||e.defaultLabelFormatter;e.userOptions=a;e.minPixelPadding=0;e.reversed=f.reversed;e.visible=!1!==f.visible;e.zoomEnabled=!1!==f.zoomEnabled;e.hasNames=\"category\"===k||!0===f.categories;e.categories=f.categories||e.hasNames;e.names||(e.names=[],e.names.keys={});e.plotLinesAndBandsGroups=\n{};e.positiveValuesOnly=!(!e.logarithmic||f.allowNegativeLog);e.isLinked=v(f.linkedTo);e.ticks={};e.labelEdge=[];e.minorTicks={};e.plotLinesAndBands=[];e.alternateBands={};e.len=0;e.minRange=e.userMinRange=f.minRange||f.maxZoom;e.range=f.range;e.offset=f.offset||0;e.max=null;e.min=null;e.crosshair=u(f.crosshair,w(b.options.tooltip.crosshairs)[h?0:1],!1);a=e.options.events;-1===b.axes.indexOf(e)&&(h?b.axes.splice(b.xAxis.length,0,e):b.axes.push(e),b[e.coll].push(e));e.series=e.series||[];b.inverted&&\n!e.isZAxis&&h&&\"undefined\"===typeof e.reversed&&(e.reversed=!0);e.labelRotation=e.options.labels.rotation;A(a,function(b,a){d(b)&&H(e,a,b)});C(this,\"afterInit\")};e.prototype.setOptions=function(b){this.options=f(e.defaultOptions,\"yAxis\"===this.coll&&e.defaultYAxisOptions,[e.defaultTopAxisOptions,e.defaultRightAxisOptions,e.defaultBottomAxisOptions,e.defaultLeftAxisOptions][this.side],f(F[this.coll],b));C(this,\"afterSetOptions\",{userOptions:b})};e.prototype.defaultLabelFormatter=function(){var b=this.axis,\na=l(this.value)?this.value:NaN,e=b.chart.time,f=b.categories,d=this.dateTimeLabelFormat,k=F.lang,c=k.numericSymbols;k=k.numericSymbolMagnitude||1E3;var u=c&&c.length,m=b.options.labels.format;b=b.logarithmic?Math.abs(a):b.tickInterval;var p=this.chart,A=p.numberFormatter;if(m)var w=I(m,this,p);else if(f)w=\"\"+this.value;else if(d)w=e.dateFormat(d,a);else if(u&&1E3<=b)for(;u--&&\"undefined\"===typeof w;)e=Math.pow(k,u+1),b>=e&&0===10*a%e&&null!==c[u]&&0!==a&&(w=A(a/e,-1)+c[u]);\"undefined\"===typeof w&&\n(w=1E4<=Math.abs(a)?A(a,-1):A(a,-1,void 0,\"\"));return w};e.prototype.getSeriesExtremes=function(){var b=this,a=b.chart,e;C(this,\"getSeriesExtremes\",null,function(){b.hasVisibleSeries=!1;b.dataMin=b.dataMax=b.threshold=null;b.softThreshold=!b.isXAxis;b.stacking&&b.stacking.buildStacks();b.series.forEach(function(h){if(h.visible||!a.options.chart.ignoreHiddenSeries){var f=h.options,d=f.threshold;b.hasVisibleSeries=!0;b.positiveValuesOnly&&0>=d&&(d=null);if(b.isXAxis){if(f=h.xData,f.length){e=h.getXExtremes(f);\nvar k=e.min;var x=e.max;l(k)||k instanceof Date||(f=f.filter(l),e=h.getXExtremes(f),k=e.min,x=e.max);f.length&&(b.dataMin=Math.min(u(b.dataMin,k),k),b.dataMax=Math.max(u(b.dataMax,x),x))}}else if(h=h.applyExtremes(),l(h.dataMin)&&(k=h.dataMin,b.dataMin=Math.min(u(b.dataMin,k),k)),l(h.dataMax)&&(x=h.dataMax,b.dataMax=Math.max(u(b.dataMax,x),x)),v(d)&&(b.threshold=d),!f.softThreshold||b.positiveValuesOnly)b.softThreshold=!1}})});C(this,\"afterGetSeriesExtremes\")};e.prototype.translate=function(b,a,e,\nf,d,k){var h=this.linkedParent||this,x=1,z=0,c=f?h.oldTransA:h.transA;f=f?h.oldMin:h.min;var u=h.minPixelPadding;d=(h.isOrdinal||h.brokenAxis&&h.brokenAxis.hasBreaks||h.logarithmic&&d)&&h.lin2val;c||(c=h.transA);e&&(x*=-1,z=h.len);h.reversed&&(x*=-1,z-=x*(h.sector||h.len));a?(b=(b*x+z-u)/c+f,d&&(b=h.lin2val(b))):(d&&(b=h.val2lin(b)),b=l(f)?x*(b-f)*c+z+x*u+(l(k)?c*k:0):void 0);return b};e.prototype.toPixels=function(b,a){return this.translate(b,!1,!this.horiz,null,!0)+(a?0:this.pos)};e.prototype.toValue=\nfunction(b,a){return this.translate(b-(a?0:this.pos),!0,!this.horiz,null,!0)};e.prototype.getPlotLinePath=function(b){function a(b,a,h){if(\"pass\"!==w&&b<a||b>h)w?b=G(b,a,h):t=!0;return b}var e=this,f=e.chart,d=e.left,k=e.top,c=b.old,m=b.value,p=b.translatedValue,A=b.lineWidth,w=b.force,n,g,E,r,M=c&&f.oldChartHeight||f.chartHeight,F=c&&f.oldChartWidth||f.chartWidth,t,v=e.transB;b={value:m,lineWidth:A,old:c,force:w,acrossPanes:b.acrossPanes,translatedValue:p};C(this,\"getPlotLinePath\",b,function(b){p=\nu(p,e.translate(m,null,null,c));p=G(p,-1E5,1E5);n=E=Math.round(p+v);g=r=Math.round(M-p-v);l(p)?e.horiz?(g=k,r=M-e.bottom,n=E=a(n,d,d+e.width)):(n=d,E=F-e.right,g=r=a(g,k,k+e.height)):(t=!0,w=!1);b.path=t&&!w?null:f.renderer.crispLine([[\"M\",n,g],[\"L\",E,r]],A||1)});return b.path};e.prototype.getLinearTickPositions=function(b,a,e){var h=L(Math.floor(a/b)*b);e=L(Math.ceil(e/b)*b);var f=[],d;L(h+b)===h&&(d=20);if(this.single)return[a];for(a=h;a<=e;){f.push(a);a=L(a+b,d);if(a===k)break;var k=a}return f};\ne.prototype.getMinorTickInterval=function(){var b=this.options;return!0===b.minorTicks?u(b.minorTickInterval,\"auto\"):!1===b.minorTicks?null:b.minorTickInterval};e.prototype.getMinorTickPositions=function(){var b=this.options,a=this.tickPositions,e=this.minorTickInterval,f=[],d=this.pointRangePadding||0,k=this.min-d;d=this.max+d;var c=d-k;if(c&&c/e<this.len/3){var l=this.logarithmic;if(l)this.paddedTicks.forEach(function(b,a,h){a&&f.push.apply(f,l.getLogTickPositions(e,h[a-1],h[a],!0))});else if(this.dateTime&&\n\"auto\"===this.getMinorTickInterval())f=f.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(e),k,d,b.startOfWeek));else for(b=k+(a[0]-k)%e;b<=d&&b!==f[0];b+=e)f.push(b)}0!==f.length&&this.trimTicks(f);return f};e.prototype.adjustForMinRange=function(){var b=this.options,a=this.min,e=this.max,f=this.logarithmic,d,k,c,l,m;this.isXAxis&&\"undefined\"===typeof this.minRange&&!f&&(v(b.min)||v(b.max)?this.minRange=null:(this.series.forEach(function(b){l=b.xData;for(k=m=b.xIncrement?1:l.length-\n1;0<k;k--)if(c=l[k]-l[k-1],\"undefined\"===typeof d||c<d)d=c}),this.minRange=Math.min(5*d,this.dataMax-this.dataMin)));if(e-a<this.minRange){var p=this.dataMax-this.dataMin>=this.minRange;var A=this.minRange;var w=(A-e+a)/2;w=[a-w,u(b.min,a-w)];p&&(w[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);a=J(w);e=[a+A,u(b.max,a+A)];p&&(e[2]=f?f.log2lin(this.dataMax):this.dataMax);e=t(e);e-a<A&&(w[0]=e-A,w[1]=u(b.min,e-A),a=J(w))}this.min=a;this.max=e};e.prototype.getClosest=function(){var b;\nthis.categories?b=1:this.series.forEach(function(a){var h=a.closestPointRange,e=a.visible||!a.chart.options.chart.ignoreHiddenSeries;!a.noSharedTooltip&&v(h)&&e&&(b=v(b)?Math.min(b,h):h)});return b};e.prototype.nameToX=function(b){var a=m(this.categories),e=a?this.categories:this.names,f=b.options.x;b.series.requireSorting=!1;v(f)||(f=!1===this.options.uniqueNames?b.series.autoIncrement():a?e.indexOf(b.name):u(e.keys[b.name],-1));if(-1===f){if(!a)var d=e.length}else d=f;\"undefined\"!==typeof d&&(this.names[d]=\nb.name,this.names.keys[b.name]=d);return d};e.prototype.updateNames=function(){var b=this,a=this.names;0<a.length&&(Object.keys(a.keys).forEach(function(b){delete a.keys[b]}),a.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(a){a.xIncrement=null;if(!a.points||a.isDirtyData)b.max=Math.max(b.max,a.xData.length-1),a.processData(),a.generatePoints();a.data.forEach(function(h,e){if(h&&h.options&&\"undefined\"!==typeof h.name){var f=b.nameToX(h);\"undefined\"!==typeof f&&f!==h.x&&\n(h.x=f,a.xData[e]=f)}})}))};e.prototype.setAxisTranslation=function(b){var a=this,e=a.max-a.min,f=a.axisPointRange||0,d=0,c=0,l=a.linkedParent,m=!!a.categories,p=a.transA,A=a.isXAxis;if(A||m||f){var w=a.getClosest();l?(d=l.minPointOffset,c=l.pointRangePadding):a.series.forEach(function(b){var h=m?1:A?u(b.options.pointRange,w,0):a.axisPointRange||0,e=b.options.pointPlacement;f=Math.max(f,h);if(!a.single||m)b=b.is(\"xrange\")?!A:A,d=Math.max(d,b&&k(e)?0:h/2),c=Math.max(c,b&&\"on\"===e?0:h)});l=a.ordinal&&\na.ordinal.slope&&w?a.ordinal.slope/w:1;a.minPointOffset=d*=l;a.pointRangePadding=c*=l;a.pointRange=Math.min(f,a.single&&m?1:e);A&&(a.closestPointRange=w)}b&&(a.oldTransA=p);a.translationSlope=a.transA=p=a.staticScale||a.len/(e+c||1);a.transB=a.horiz?a.left:a.bottom;a.minPixelPadding=p*d;C(this,\"afterSetAxisTranslation\")};e.prototype.minFromRange=function(){return this.max-this.range};e.prototype.setTickInterval=function(b){var h=this,e=h.chart,f=h.logarithmic,d=h.options,k=h.isXAxis,c=h.isLinked,\nm=d.maxPadding,A=d.minPadding,w=d.tickInterval,g=d.tickPixelInterval,E=h.categories,r=l(h.threshold)?h.threshold:null,S=h.softThreshold;h.dateTime||E||c||this.getTickAmount();var M=u(h.userMin,d.min);var F=u(h.userMax,d.max);if(c){h.linkedParent=e[h.coll][d.linkedTo];var t=h.linkedParent.getExtremes();h.min=u(t.min,t.dataMin);h.max=u(t.max,t.dataMax);d.type!==h.linkedParent.options.type&&n(11,1,e)}else{if(!S&&v(r))if(h.dataMin>=r)t=r,A=0;else if(h.dataMax<=r){var P=r;m=0}h.min=u(M,t,h.dataMin);h.max=\nu(F,P,h.dataMax)}f&&(h.positiveValuesOnly&&!b&&0>=Math.min(h.min,u(h.dataMin,h.min))&&n(10,1,e),h.min=L(f.log2lin(h.min),16),h.max=L(f.log2lin(h.max),16));h.range&&v(h.max)&&(h.userMin=h.min=M=Math.max(h.dataMin,h.minFromRange()),h.userMax=F=h.max,h.range=null);C(h,\"foundExtremes\");h.beforePadding&&h.beforePadding();h.adjustForMinRange();!(E||h.axisPointRange||h.stacking&&h.stacking.usePercentage||c)&&v(h.min)&&v(h.max)&&(e=h.max-h.min)&&(!v(M)&&A&&(h.min-=e*A),!v(F)&&m&&(h.max+=e*m));l(h.userMin)||\n(l(d.softMin)&&d.softMin<h.min&&(h.min=M=d.softMin),l(d.floor)&&(h.min=Math.max(h.min,d.floor)));l(h.userMax)||(l(d.softMax)&&d.softMax>h.max&&(h.max=F=d.softMax),l(d.ceiling)&&(h.max=Math.min(h.max,d.ceiling)));S&&v(h.dataMin)&&(r=r||0,!v(M)&&h.min<r&&h.dataMin>=r?h.min=h.options.minRange?Math.min(r,h.max-h.minRange):r:!v(F)&&h.max>r&&h.dataMax<=r&&(h.max=h.options.minRange?Math.max(r,h.min+h.minRange):r));h.tickInterval=h.min===h.max||\"undefined\"===typeof h.min||\"undefined\"===typeof h.max?1:c&&\n!w&&g===h.linkedParent.options.tickPixelInterval?w=h.linkedParent.tickInterval:u(w,this.tickAmount?(h.max-h.min)/Math.max(this.tickAmount-1,1):void 0,E?1:(h.max-h.min)*g/Math.max(h.len,g));k&&!b&&h.series.forEach(function(b){b.processData(h.min!==h.oldMin||h.max!==h.oldMax)});h.setAxisTranslation(!0);C(this,\"initialAxisTranslation\");h.pointRange&&!w&&(h.tickInterval=Math.max(h.pointRange,h.tickInterval));b=u(d.minTickInterval,h.dateTime&&!h.series.some(function(b){return b.noSharedTooltip})?h.closestPointRange:\n0);!w&&h.tickInterval<b&&(h.tickInterval=b);h.dateTime||h.logarithmic||w||(h.tickInterval=a(h.tickInterval,void 0,p(h.tickInterval),u(d.allowDecimals,.5>h.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(h.tickInterval=h.unsquish());this.setTickPositions()};e.prototype.setTickPositions=function(){var b=this.options,a=b.tickPositions;var e=this.getMinorTickInterval();var f=b.tickPositioner,d=this.hasVerticalPanning(),k=\"colorAxis\"===this.coll,c=(k||!d)&&b.startOnTick;d=\n(k||!d)&&b.endOnTick;this.tickmarkOffset=this.categories&&\"between\"===b.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===e&&this.tickInterval?this.tickInterval/5:e;this.single=this.min===this.max&&v(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==b.allowDecimals);this.tickPositions=e=a&&a.slice();!e&&(this.ordinal&&this.ordinal.positions||!((this.max-this.min)/this.tickInterval>Math.max(2*this.len,200))?e=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,\nb.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max):(e=[this.min,this.max],n(19,!1,this.chart)),e.length>this.len&&(e=[e[0],e.pop()],e[0]===e[1]&&(e.length=1)),this.tickPositions=e,f&&(f=f.apply(this,[this.min,this.max])))&&(this.tickPositions=e=f);this.paddedTicks=e.slice(0);this.trimTicks(e,\nc,d);this.isLinked||(this.single&&2>e.length&&!this.categories&&!this.series.some(function(b){return b.is(\"heatmap\")&&\"between\"===b.options.pointPlacement})&&(this.min-=.5,this.max+=.5),a||f||this.adjustTickAmount());C(this,\"afterSetTickPositions\")};e.prototype.trimTicks=function(b,a,e){var h=b[0],f=b[b.length-1],d=!this.isOrdinal&&this.minPointOffset||0;C(this,\"trimTicks\");if(!this.isLinked){if(a&&-Infinity!==h)this.min=h;else for(;this.min-d>b[0];)b.shift();if(e)this.max=f;else for(;this.max+d<\nb[b.length-1];)b.pop();0===b.length&&v(h)&&!this.options.tickPositions&&b.push((f+h)/2)}};e.prototype.alignToOthers=function(){var b={},a,e=this.options;!1===this.chart.options.chart.alignTicks||!1===e.alignTicks||!1===e.startOnTick||!1===e.endOnTick||this.logarithmic||this.chart[this.coll].forEach(function(h){var e=h.options;e=[h.horiz?e.left:e.top,e.width,e.height,e.pane].join();h.series.length&&(b[e]?a=!0:b[e]=1)});return a};e.prototype.getTickAmount=function(){var b=this.options,a=b.tickAmount,\ne=b.tickPixelInterval;!v(b.tickInterval)&&!a&&this.len<e&&!this.isRadial&&!this.logarithmic&&b.startOnTick&&b.endOnTick&&(a=2);!a&&this.alignToOthers()&&(a=Math.ceil(this.len/e)+1);4>a&&(this.finalTickAmt=a,a=5);this.tickAmount=a};e.prototype.adjustTickAmount=function(){var b=this.options,a=this.tickInterval,e=this.tickPositions,f=this.tickAmount,d=this.finalTickAmt,k=e&&e.length,c=u(this.threshold,this.softThreshold?0:null),l;if(this.hasData()){if(k<f){for(l=this.min;e.length<f;)e.length%2||l===\nc?e.push(L(e[e.length-1]+a)):e.unshift(L(e[0]-a));this.transA*=(k-1)/(f-1);this.min=b.startOnTick?e[0]:Math.min(this.min,e[0]);this.max=b.endOnTick?e[e.length-1]:Math.max(this.max,e[e.length-1])}else k>f&&(this.tickInterval*=2,this.setTickPositions());if(v(d)){for(a=b=e.length;a--;)(3===d&&1===a%2||2>=d&&0<a&&a<b-1)&&e.splice(a,1);this.finalTickAmt=void 0}}};e.prototype.setScale=function(){var b,a=!1,e=!1;this.series.forEach(function(b){var h;a=a||b.isDirtyData||b.isDirty;e=e||(null===(h=b.xAxis)||\nvoid 0===h?void 0:h.isDirty)||!1});this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();(b=this.len!==this.oldAxisLength)||a||e||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||\nthis.max!==this.oldMax)):this.stacking&&this.stacking.cleanStacks();a&&this.panningState&&(this.panningState.isDirty=!0);C(this,\"afterSetScale\")};e.prototype.setExtremes=function(b,a,e,f,d){var h=this,k=h.chart;e=u(e,!0);h.series.forEach(function(b){delete b.kdTree});d=r(d,{min:b,max:a});C(h,\"setExtremes\",d,function(){h.userMin=b;h.userMax=a;h.eventArgs=d;e&&k.redraw(f)})};e.prototype.zoom=function(b,a){var e=this,h=this.dataMin,f=this.dataMax,d=this.options,k=Math.min(h,u(d.min,h)),c=Math.max(f,\nu(d.max,f));b={newMin:b,newMax:a};C(this,\"zoom\",b,function(b){var a=b.newMin,d=b.newMax;if(a!==e.min||d!==e.max)e.allowZoomOutside||(v(h)&&(a<k&&(a=k),a>c&&(a=c)),v(f)&&(d<k&&(d=k),d>c&&(d=c))),e.displayBtn=\"undefined\"!==typeof a||\"undefined\"!==typeof d,e.setExtremes(a,d,!1,void 0,{trigger:\"zoom\"});b.zoomed=!0});return b.zoomed};e.prototype.setAxisSize=function(){var b=this.chart,a=this.options,e=a.offsets||[0,0,0,0],f=this.horiz,d=this.width=Math.round(E(u(a.width,b.plotWidth-e[3]+e[1]),b.plotWidth)),\nk=this.height=Math.round(E(u(a.height,b.plotHeight-e[0]+e[2]),b.plotHeight)),c=this.top=Math.round(E(u(a.top,b.plotTop+e[0]),b.plotHeight,b.plotTop));a=this.left=Math.round(E(u(a.left,b.plotLeft+e[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-k-c;this.right=b.chartWidth-d-a;this.len=Math.max(f?d:k,0);this.pos=f?a:c};e.prototype.getExtremes=function(){var b=this.logarithmic;return{min:b?L(b.lin2log(this.min)):this.min,max:b?L(b.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,\nuserMin:this.userMin,userMax:this.userMax}};e.prototype.getThreshold=function(b){var a=this.logarithmic,e=a?a.lin2log(this.min):this.min;a=a?a.lin2log(this.max):this.max;null===b||-Infinity===b?b=e:Infinity===b?b=a:e>b?b=e:a<b&&(b=a);return this.translate(b,0,1,0,1)};e.prototype.autoLabelAlign=function(b){var a=(u(b,0)-90*this.side+720)%360;b={align:\"center\"};C(this,\"autoLabelAlign\",b,function(b){15<a&&165>a?b.align=\"right\":195<a&&345>a&&(b.align=\"left\")});return b.align};e.prototype.tickSize=function(b){var a=\nthis.options,e=a[\"tick\"===b?\"tickLength\":\"minorTickLength\"],f=u(a[\"tick\"===b?\"tickWidth\":\"minorTickWidth\"],\"tick\"===b&&this.isXAxis&&!this.categories?1:0);if(f&&e){\"inside\"===a[b+\"Position\"]&&(e=-e);var d=[e,f]}b={tickSize:d};C(this,\"afterTickSize\",b);return b.tickSize};e.prototype.labelMetrics=function(){var b=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[b]&&this.ticks[b].label)};e.prototype.unsquish=\nfunction(){var b=this.options.labels,a=this.horiz,e=this.tickInterval,f=e,d=this.len/(((this.categories?1:0)+this.max-this.min)/e),k,c=b.rotation,l=this.labelMetrics(),m,p=Number.MAX_VALUE,A,w=this.max-this.min,n=function(b){var a=b/(d||1);a=1<a?Math.ceil(a):1;a*e>w&&Infinity!==b&&Infinity!==d&&w&&(a=Math.ceil(w/e));return L(a*e)};a?(A=!b.staggerLines&&!b.step&&(v(c)?[c]:d<u(b.autoRotationLimit,80)&&b.autoRotation))&&A.forEach(function(b){if(b===c||b&&-90<=b&&90>=b){m=n(Math.abs(l.h/Math.sin(Q*b)));\nvar a=m+Math.abs(b/360);a<p&&(p=a,k=b,f=m)}}):b.step||(f=n(l.h));this.autoRotation=A;this.labelRotation=u(k,c);return f};e.prototype.getSlotWidth=function(b){var a,e=this.chart,f=this.horiz,d=this.options.labels,k=Math.max(this.tickPositions.length-(this.categories?0:1),1),c=e.margin[3];if(b&&l(b.slotWidth))return b.slotWidth;if(f&&d&&2>(d.step||0))return d.rotation?0:(this.staggerLines||1)*this.len/k;if(!f){b=null===(a=null===d||void 0===d?void 0:d.style)||void 0===a?void 0:a.width;if(void 0!==b)return parseInt(b,\n10);if(c)return c-e.spacing[3]}return.33*e.chartWidth};e.prototype.renderUnsquish=function(){var b=this.chart,a=b.renderer,e=this.tickPositions,f=this.ticks,d=this.options.labels,c=d&&d.style||{},l=this.horiz,u=this.getSlotWidth(),m=Math.max(1,Math.round(u-2*(d.padding||5))),p={},A=this.labelMetrics(),w=d.style&&d.style.textOverflow,n=0;k(d.rotation)||(p.rotation=d.rotation||0);e.forEach(function(b){b=f[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>n&&(n=b.label.textPxLength)});\nthis.maxLabelLength=n;if(this.autoRotation)n>m&&n>A.h?p.rotation=this.labelRotation:this.labelRotation=0;else if(u){var g=m;if(!w){var E=\"clip\";for(m=e.length;!l&&m--;){var r=e[m];if(r=f[r].label)r.styles&&\"ellipsis\"===r.styles.textOverflow?r.css({textOverflow:\"clip\"}):r.textPxLength>u&&r.css({width:u+\"px\"}),r.getBBox().height>this.len/e.length-(A.h-A.f)&&(r.specificTextOverflow=\"ellipsis\")}}}p.rotation&&(g=n>.5*b.chartHeight?.33*b.chartHeight:n,w||(E=\"ellipsis\"));if(this.labelAlign=d.align||this.autoLabelAlign(this.labelRotation))p.align=\nthis.labelAlign;e.forEach(function(b){var a=(b=f[b])&&b.label,e=c.width,h={};a&&(a.attr(p),b.shortenLabel?b.shortenLabel():g&&!e&&\"nowrap\"!==c.whiteSpace&&(g<a.textPxLength||\"SPAN\"===a.element.tagName)?(h.width=g+\"px\",w||(h.textOverflow=a.specificTextOverflow||E),a.css(h)):a.styles&&a.styles.width&&!h.width&&!e&&a.css({width:null}),delete a.specificTextOverflow,b.rotation=p.rotation)},this);this.tickRotCorr=a.rotCorr(A.b,this.labelRotation||0,0!==this.side)};e.prototype.hasData=function(){return this.series.some(function(b){return b.hasData()})||\nthis.options.showEmpty&&v(this.min)&&v(this.max)};e.prototype.addTitle=function(b){var a=this.chart.renderer,e=this.horiz,d=this.opposite,k=this.options.title,c,l=this.chart.styledMode;this.axisTitle||((c=k.textAlign)||(c=(e?{low:\"left\",middle:\"center\",high:\"right\"}:{low:d?\"right\":\"left\",middle:\"center\",high:d?\"left\":\"right\"})[k.align]),this.axisTitle=a.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:c}).addClass(\"highcharts-axis-title\"),l||this.axisTitle.css(f(k.style)),this.axisTitle.add(this.axisGroup),\nthis.axisTitle.isNew=!0);l||k.style.width||this.isRadial||this.axisTitle.css({width:this.len+\"px\"});this.axisTitle[b?\"show\":\"hide\"](b)};e.prototype.generateTick=function(b){var a=this.ticks;a[b]?a[b].addLabel():a[b]=new q(this,b)};e.prototype.getOffset=function(){var b=this,a=b.chart,e=a.renderer,f=b.options,d=b.tickPositions,k=b.ticks,c=b.horiz,l=b.side,m=a.inverted&&!b.isZAxis?[1,0,3,2][l]:l,p,w=0,n=0,g=f.title,E=f.labels,r=0,M=a.axisOffset;a=a.clipOffset;var F=[-1,1,1,-1][l],t=f.className,P=b.axisParent;\nvar I=b.hasData();b.showAxis=p=I||u(f.showEmpty,!0);b.staggerLines=b.horiz&&E.staggerLines;b.axisGroup||(b.gridGroup=e.g(\"grid\").attr({zIndex:f.gridZIndex||1}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-grid \"+(t||\"\")).add(P),b.axisGroup=e.g(\"axis\").attr({zIndex:f.zIndex||2}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\" \"+(t||\"\")).add(P),b.labelGroup=e.g(\"axis-labels\").attr({zIndex:E.zIndex||7}).addClass(\"highcharts-\"+b.coll.toLowerCase()+\"-labels \"+(t||\"\")).add(P));I||b.isLinked?(d.forEach(function(a,\ne){b.generateTick(a,e)}),b.renderUnsquish(),b.reserveSpaceDefault=0===l||2===l||{1:\"left\",3:\"right\"}[l]===b.labelAlign,u(E.reserveSpace,\"center\"===b.labelAlign?!0:null,b.reserveSpaceDefault)&&d.forEach(function(b){r=Math.max(k[b].getLabelSize(),r)}),b.staggerLines&&(r*=b.staggerLines),b.labelOffset=r*(b.opposite?-1:1)):A(k,function(b,a){b.destroy();delete k[a]});if(g&&g.text&&!1!==g.enabled&&(b.addTitle(p),p&&!1!==g.reserveSpace)){b.titleOffset=w=b.axisTitle.getBBox()[c?\"height\":\"width\"];var q=g.offset;\nn=v(q)?0:u(g.margin,c?5:10)}b.renderLine();b.offset=F*u(f.offset,M[l]?M[l]+(f.margin||0):0);b.tickRotCorr=b.tickRotCorr||{x:0,y:0};e=0===l?-b.labelMetrics().h:2===l?b.tickRotCorr.y:0;n=Math.abs(r)+n;r&&(n=n-e+F*(c?u(E.y,b.tickRotCorr.y+8*F):E.x));b.axisTitleMargin=u(q,n);b.getMaxLabelDimensions&&(b.maxLabelDimensions=b.getMaxLabelDimensions(k,d));c=this.tickSize(\"tick\");M[l]=Math.max(M[l],b.axisTitleMargin+w+F*b.offset,n,d&&d.length&&c?c[0]+F*b.offset:0);f=f.offset?0:2*Math.floor(b.axisLine.strokeWidth()/\n2);a[m]=Math.max(a[m],f);C(this,\"afterGetOffset\")};e.prototype.getLinePath=function(b){var a=this.chart,e=this.opposite,f=this.offset,d=this.horiz,k=this.left+(e?this.width:0)+f;f=a.chartHeight-this.bottom-(e?this.height:0)+f;e&&(b*=-1);return a.renderer.crispLine([[\"M\",d?this.left:k,d?f:this.top],[\"L\",d?a.chartWidth-this.right:k,d?f:a.chartHeight-this.bottom]],b)};e.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup),\nthis.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,\"stroke-width\":this.options.lineWidth,zIndex:7}))};e.prototype.getTitlePosition=function(){var b=this.horiz,a=this.left,e=this.top,f=this.len,d=this.options.title,k=b?a:e,c=this.opposite,l=this.offset,u=d.x||0,m=d.y||0,p=this.axisTitle,A=this.chart.renderer.fontMetrics(d.style&&d.style.fontSize,p);p=Math.max(p.getBBox(null,0).height-A.h-1,0);f={low:k+(b?0:f),middle:k+f/2,high:k+(b?f:0)}[d.align];a=(b?e+this.height:a)+(b?1:-1)*\n(c?-1:1)*this.axisTitleMargin+[-p,p,A.f,-p][this.side];b={x:b?f+u:a+(c?this.width:0)+l+u,y:b?a+m-(c?this.height:0)+l:f+m};C(this,\"afterGetTitlePosition\",{titlePosition:b});return b};e.prototype.renderMinorTick=function(b){var a=this.chart.hasRendered&&l(this.oldMin),e=this.minorTicks;e[b]||(e[b]=new q(this,b,\"minor\"));a&&e[b].isNew&&e[b].render(null,!0);e[b].render(null,!1,1)};e.prototype.renderTick=function(b,a){var e=this.isLinked,h=this.ticks,f=this.chart.hasRendered&&l(this.oldMin);if(!e||b>=\nthis.min&&b<=this.max)h[b]||(h[b]=new q(this,b)),f&&h[b].isNew&&h[b].render(a,!0,-1),h[b].render(a)};e.prototype.render=function(){var b=this,a=b.chart,e=b.logarithmic,f=b.options,d=b.isLinked,k=b.tickPositions,u=b.axisTitle,m=b.ticks,p=b.minorTicks,w=b.alternateBands,n=f.stackLabels,g=f.alternateGridColor,E=b.tickmarkOffset,r=b.axisLine,F=b.showAxis,t=D(a.renderer.globalAnimation),v,P;b.labelEdge.length=0;b.overlap=!1;[m,p,w].forEach(function(b){A(b,function(b){b.isActive=!1})});if(b.hasData()||\nd)b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(a){b.renderMinorTick(a)}),k.length&&(k.forEach(function(a,e){b.renderTick(a,e)}),E&&(0===b.min||b.single)&&(m[-1]||(m[-1]=new q(b,-1,null,!0)),m[-1].render(-1))),g&&k.forEach(function(h,f){P=\"undefined\"!==typeof k[f+1]?k[f+1]+E:b.max-E;0===f%2&&h<b.max&&P<=b.max+(a.polar?-E:E)&&(w[h]||(w[h]=new c.PlotLineOrBand(b)),v=h+E,w[h].options={from:e?e.lin2log(v):v,to:e?e.lin2log(P):P,color:g,className:\"highcharts-alternate-grid\"},\nw[h].render(),w[h].isActive=!0)}),b._addedPlotLB||((f.plotLines||[]).concat(f.plotBands||[]).forEach(function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);[m,p,w].forEach(function(b){var e,h=[],f=t.duration;A(b,function(b,a){b.isActive||(b.render(a,!1,0),b.isActive=!1,h.push(a))});M(function(){for(e=h.length;e--;)b[h[e]]&&!b[h[e]].isActive&&(b[h[e]].destroy(),delete b[h[e]])},b!==w&&a.hasRendered&&f?f:0)});r&&(r[r.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(r.strokeWidth())}),r.isPlaced=!0,r[F?\n\"show\":\"hide\"](F));u&&F&&(f=b.getTitlePosition(),l(f.y)?(u[u.isNew?\"attr\":\"animate\"](f),u.isNew=!1):(u.attr(\"y\",-9999),u.isNew=!0));n&&n.enabled&&b.stacking&&b.stacking.renderStackTotals();b.isDirty=!1;C(this,\"afterRender\")};e.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(b){b.render()}));this.series.forEach(function(b){b.isDirty=!0})};e.prototype.getKeepProps=function(){return this.keepProps||e.keepProps};e.prototype.destroy=function(b){var a=this,\ne=a.plotLinesAndBands,f;C(this,\"destroy\",{keepEvents:b});b||P(a);[a.ticks,a.minorTicks,a.alternateBands].forEach(function(b){K(b)});if(e)for(b=e.length;b--;)e[b].destroy();\"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar\".split(\" \").forEach(function(b){a[b]&&(a[b]=a[b].destroy())});for(f in a.plotLinesAndBandsGroups)a.plotLinesAndBandsGroups[f]=a.plotLinesAndBandsGroups[f].destroy();A(a,function(b,e){-1===a.getKeepProps().indexOf(e)&&delete a[e]})};e.prototype.drawCrosshair=function(b,\na){var e=this.crosshair,h=u(e.snap,!0),f,d=this.cross,k=this.chart;C(this,\"drawCrosshair\",{e:b,point:a});b||(b=this.cross&&this.cross.e);if(this.crosshair&&!1!==(v(a)||!h)){h?v(a)&&(f=u(\"colorAxis\"!==this.coll?a.crosshairPos:null,this.isXAxis?a.plotX:this.len-a.plotY)):f=b&&(this.horiz?b.chartX-this.pos:this.len-b.chartY+this.pos);if(v(f)){var c={value:a&&(this.isXAxis?a.x:u(a.stackY,a.y)),translatedValue:f};k.polar&&r(c,{isCrosshair:!0,chartX:b&&b.chartX,chartY:b&&b.chartY,point:a});c=this.getPlotLinePath(c)||\nnull}if(!v(c)){this.hideCrosshair();return}h=this.categories&&!this.isRadial;d||(this.cross=d=k.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+(h?\"category \":\"thin \")+e.className).attr({zIndex:u(e.zIndex,2)}).add(),k.styledMode||(d.attr({stroke:e.color||(h?g.parse(\"#ccd6eb\").setOpacity(.25).get():\"#cccccc\"),\"stroke-width\":u(e.width,1)}).css({\"pointer-events\":\"none\"}),e.dashStyle&&d.attr({dashstyle:e.dashStyle})));d.show().attr({d:c});h&&!e.width&&d.attr({\"stroke-width\":this.transA});\nthis.cross.e=b}else this.hideCrosshair();C(this,\"afterDrawCrosshair\",{e:b,point:a})};e.prototype.hideCrosshair=function(){this.cross&&this.cross.hide();C(this,\"afterHideCrosshair\")};e.prototype.hasVerticalPanning=function(){var b,a;return/y/.test((null===(a=null===(b=this.chart.options.chart)||void 0===b?void 0:b.panning)||void 0===a?void 0:a.type)||\"\")};e.defaultOptions={dateTimeLabelFormats:{millisecond:{main:\"%H:%M:%S.%L\",range:!1},second:{main:\"%H:%M:%S\",range:!1},minute:{main:\"%H:%M\",range:!1},\nhour:{main:\"%H:%M\",range:!1},day:{main:\"%e. %b\"},week:{main:\"%e. %b\"},month:{main:\"%b '%y\"},year:{main:\"%Y\"}},endOnTick:!1,labels:{enabled:!0,indentation:10,x:0,style:{color:\"#666666\",cursor:\"default\",fontSize:\"11px\"}},maxPadding:.01,minorTickLength:2,minorTickPosition:\"outside\",minPadding:.01,showEmpty:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:\"between\",tickPosition:\"outside\",title:{align:\"middle\",style:{color:\"#666666\"}},type:\"linear\",minorGridLineColor:\"#f2f2f2\",\nminorGridLineWidth:1,minorTickColor:\"#999999\",lineColor:\"#ccd6eb\",lineWidth:1,gridLineColor:\"#e6e6e6\",tickColor:\"#ccd6eb\"};e.defaultYAxisOptions={endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{allowOverlap:!1,enabled:!1,crop:!0,overflow:\"justify\",formatter:function(){var b=this.axis.chart.numberFormatter;return b(this.total,-1)},style:{color:\"#000000\",fontSize:\"11px\",fontWeight:\"bold\",textOutline:\"1px contrast\"}},\ngridLineWidth:1,lineWidth:0};e.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};e.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};e.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.keepProps=\"extKey hcEvents names series userMax userMin\".split(\" \");return e}();c.Axis=y;return c.Axis});O(q,\"parts/DateTimeAxis.js\",[q[\"parts/Axis.js\"],q[\"parts/Utilities.js\"]],\nfunction(g,c){var q=c.addEvent,y=c.getMagnitude,B=c.normalizeTickInterval,H=c.timeUnits,D=function(){function c(c){this.axis=c}c.prototype.normalizeTimeTickInterval=function(c,g){var t=g||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]];g=t[t.length-1];var v=H[g[0]],q=g[1],n;for(n=0;n<t.length&&!(g=t[n],v=H[g[0]],q=g[1],t[n+1]&&c<=(v*q[q.length-1]+H[t[n+\n1][0]])/2);n++);v===H.year&&c<5*v&&(q=[1,2,5]);c=B(c/v,q,\"year\"===g[0]?Math.max(y(c/v),1):1);return{unitRange:v,count:c,unitName:g[0]}};return c}();c=function(){function c(){}c.compose=function(c){c.keepProps.push(\"dateTime\");c.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};q(c,\"init\",function(c){\"datetime\"!==c.userOptions.type?this.dateTime=void 0:this.dateTime||(this.dateTime=new D(this))})};c.AdditionsClass=D;return c}();c.compose(g);return c});\nO(q,\"parts/LogarithmicAxis.js\",[q[\"parts/Axis.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.getMagnitude,B=c.normalizeTickInterval,H=c.pick,D=function(){function c(c){this.axis=c}c.prototype.getLogTickPositions=function(c,g,q,v){var t=this.axis,n=t.len,r=t.options,C=[];v||(this.minorAutoInterval=void 0);if(.5<=c)c=Math.round(c),C=t.getLinearTickPositions(c,g,q);else if(.08<=c){r=Math.floor(g);var I,p;for(n=.3<c?[1,2,4]:.15<c?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];r<q+1&&!p;r++){var m=\nn.length;for(I=0;I<m&&!p;I++){var d=this.log2lin(this.lin2log(r)*n[I]);d>g&&(!v||l<=q)&&\"undefined\"!==typeof l&&C.push(l);l>q&&(p=!0);var l=d}}}else g=this.lin2log(g),q=this.lin2log(q),c=v?t.getMinorTickInterval():r.tickInterval,c=H(\"auto\"===c?null:c,this.minorAutoInterval,r.tickPixelInterval/(v?5:1)*(q-g)/((v?n/t.tickPositions.length:n)||1)),c=B(c,void 0,y(c)),C=t.getLinearTickPositions(c,g,q).map(this.log2lin),v||(this.minorAutoInterval=c/5);v||(t.tickInterval=c);return C};c.prototype.lin2log=function(c){return Math.pow(10,\nc)};c.prototype.log2lin=function(c){return Math.log(c)/Math.LN10};return c}();c=function(){function c(){}c.compose=function(c){c.keepProps.push(\"logarithmic\");var g=c.prototype,t=D.prototype;g.log2lin=t.log2lin;g.lin2log=t.lin2log;q(c,\"init\",function(c){var g=this.logarithmic;\"logarithmic\"!==c.userOptions.type?this.logarithmic=void 0:(g||(g=this.logarithmic=new D(this)),this.log2lin!==g.log2lin&&(g.log2lin=this.log2lin.bind(this)),this.lin2log!==g.lin2log&&(g.lin2log=this.lin2log.bind(this)))});q(c,\n\"afterInit\",function(){var c=this.logarithmic;c&&(this.lin2val=function(g){return c.lin2log(g)},this.val2lin=function(g){return c.log2lin(g)})})};return c}();c.compose(g);return c});O(q,\"parts/PlotLineOrBand.js\",[q[\"parts/Axis.js\"],q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){var y=q.arrayMax,B=q.arrayMin,H=q.defined,D=q.destroyObjectProperties,J=q.erase,t=q.extend,G=q.merge,L=q.objectEach,v=q.pick,K=function(){function n(c,n){this.axis=c;n&&(this.options=n,this.id=n.id)}n.prototype.render=\nfunction(){c.fireEvent(this,\"render\");var n=this,g=n.axis,t=g.horiz,p=g.logarithmic,m=n.options,d=m.label,l=n.label,k=m.to,f=m.from,a=m.value,A=H(f)&&H(k),u=H(a),E=n.svgElem,P=!E,w=[],M=m.color,F=v(m.zIndex,0),q=m.events;w={\"class\":\"highcharts-plot-\"+(A?\"band \":\"line \")+(m.className||\"\")};var e={},b=g.chart.renderer,h=A?\"bands\":\"lines\";p&&(f=p.log2lin(f),k=p.log2lin(k),a=p.log2lin(a));g.chart.styledMode||(u?(w.stroke=M||\"#999999\",w[\"stroke-width\"]=v(m.width,1),m.dashStyle&&(w.dashstyle=m.dashStyle)):\nA&&(w.fill=M||\"#e6ebf5\",m.borderWidth&&(w.stroke=m.borderColor,w[\"stroke-width\"]=m.borderWidth)));e.zIndex=F;h+=\"-\"+F;(p=g.plotLinesAndBandsGroups[h])||(g.plotLinesAndBandsGroups[h]=p=b.g(\"plot-\"+h).attr(e).add());P&&(n.svgElem=E=b.path().attr(w).add(p));if(u)w=g.getPlotLinePath({value:a,lineWidth:E.strokeWidth(),acrossPanes:m.acrossPanes});else if(A)w=g.getPlotBandPath(f,k,m);else return;!n.eventsAdded&&q&&(L(q,function(b,a){E.on(a,function(b){q[a].apply(n,[b])})}),n.eventsAdded=!0);(P||!E.d)&&w&&\nw.length?E.attr({d:w}):E&&(w?(E.show(!0),E.animate({d:w})):E.d&&(E.hide(),l&&(n.label=l=l.destroy())));d&&(H(d.text)||H(d.formatter))&&w&&w.length&&0<g.width&&0<g.height&&!w.isFlat?(d=G({align:t&&A&&\"center\",x:t?!A&&4:10,verticalAlign:!t&&A&&\"middle\",y:t?A?16:10:A?6:-4,rotation:t&&!A&&90},d),this.renderLabel(d,w,A,F)):l&&l.hide();return n};n.prototype.renderLabel=function(c,n,g,p){var m=this.label,d=this.axis.chart.renderer;m||(m={align:c.textAlign||c.align,rotation:c.rotation,\"class\":\"highcharts-plot-\"+\n(g?\"band\":\"line\")+\"-label \"+(c.className||\"\")},m.zIndex=p,p=this.getLabelText(c),this.label=m=d.text(p,0,0,c.useHTML).attr(m).add(),this.axis.chart.styledMode||m.css(c.style));d=n.xBounds||[n[0][1],n[1][1],g?n[2][1]:n[0][1]];n=n.yBounds||[n[0][2],n[1][2],g?n[2][2]:n[0][2]];g=B(d);p=B(n);m.align(c,!1,{x:g,y:p,width:y(d)-g,height:y(n)-p});m.show(!0)};n.prototype.getLabelText=function(c){return H(c.formatter)?c.formatter.call(this):c.text};n.prototype.destroy=function(){J(this.axis.plotLinesAndBands,\nthis);delete this.axis;D(this)};return n}();t(g.prototype,{getPlotBandPath:function(c,g){var n=this.getPlotLinePath({value:g,force:!0,acrossPanes:this.options.acrossPanes}),r=this.getPlotLinePath({value:c,force:!0,acrossPanes:this.options.acrossPanes}),p=[],m=this.horiz,d=1;c=c<this.min&&g<this.min||c>this.max&&g>this.max;if(r&&n){if(c){var l=r.toString()===n.toString();d=0}for(c=0;c<r.length;c+=2){g=r[c];var k=r[c+1],f=n[c],a=n[c+1];\"M\"!==g[0]&&\"L\"!==g[0]||\"M\"!==k[0]&&\"L\"!==k[0]||\"M\"!==f[0]&&\"L\"!==\nf[0]||\"M\"!==a[0]&&\"L\"!==a[0]||(m&&f[1]===g[1]?(f[1]+=d,a[1]+=d):m||f[2]!==g[2]||(f[2]+=d,a[2]+=d),p.push([\"M\",g[1],g[2]],[\"L\",k[1],k[2]],[\"L\",a[1],a[2]],[\"L\",f[1],f[2]],[\"Z\"]));p.isFlat=l}}return p},addPlotBand:function(c){return this.addPlotBandOrLine(c,\"plotBands\")},addPlotLine:function(c){return this.addPlotBandOrLine(c,\"plotLines\")},addPlotBandOrLine:function(c,g){var n=(new K(this,c)).render(),r=this.userOptions;if(n){if(g){var p=r[g]||[];p.push(c);r[g]=p}this.plotLinesAndBands.push(n);this._addedPlotLB=\n!0}return n},removePlotBandOrLine:function(c){for(var n=this.plotLinesAndBands,g=this.options,t=this.userOptions,p=n.length;p--;)n[p].id===c&&n[p].destroy();[g.plotLines||[],t.plotLines||[],g.plotBands||[],t.plotBands||[]].forEach(function(m){for(p=m.length;p--;)(m[p]||{}).id===c&&J(m,m[p])})},removePlotBand:function(c){this.removePlotBandOrLine(c)},removePlotLine:function(c){this.removePlotBandOrLine(c)}});c.PlotLineOrBand=K;return c.PlotLineOrBand});O(q,\"parts/Tooltip.js\",[q[\"parts/Globals.js\"],\nq[\"parts/Utilities.js\"]],function(g,c){var q=g.doc,y=c.clamp,B=c.css,H=c.defined,D=c.discardElement,J=c.extend,t=c.fireEvent,G=c.format,L=c.isNumber,v=c.isString,K=c.merge,n=c.pick,r=c.splat,C=c.syncTimeout,I=c.timeUnits;\"\";var p=function(){function m(d,c){this.container=void 0;this.crosshairs=[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=d;this.init(d,c)}m.prototype.applyFilter=function(){var d=this.chart;d.renderer.definition({tagName:\"filter\",\nid:\"drop-shadow-\"+d.index,opacity:.5,children:[{tagName:\"feGaussianBlur\",\"in\":\"SourceAlpha\",stdDeviation:1},{tagName:\"feOffset\",dx:1,dy:1},{tagName:\"feComponentTransfer\",children:[{tagName:\"feFuncA\",type:\"linear\",slope:.3}]},{tagName:\"feMerge\",children:[{tagName:\"feMergeNode\"},{tagName:\"feMergeNode\",\"in\":\"SourceGraphic\"}]}]});d.renderer.definition({tagName:\"style\",textContent:\".highcharts-tooltip-\"+d.index+\"{filter:url(#drop-shadow-\"+d.index+\")}\"})};m.prototype.bodyFormatter=function(d){return d.map(function(d){var k=\nd.series.tooltipOptions;return(k[(d.point.formatPrefix||\"point\")+\"Formatter\"]||d.point.tooltipFormatter).call(d.point,k[(d.point.formatPrefix||\"point\")+\"Format\"]||\"\")})};m.prototype.cleanSplit=function(d){this.chart.series.forEach(function(c){var k=c&&c.tt;k&&(!k.isActive||d?c.tt=k.destroy():k.isActive=!1)})};m.prototype.defaultFormatter=function(d){var c=this.points||r(this);var k=[d.tooltipFooterHeaderFormatter(c[0])];k=k.concat(d.bodyFormatter(c));k.push(d.tooltipFooterHeaderFormatter(c[0],!0));\nreturn k};m.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),D(this.container));c.clearTimeout(this.hideTimer);c.clearTimeout(this.tooltipTimeout)};m.prototype.getAnchor=function(d,c){var k=this.chart,f=k.pointer,a=k.inverted,l=k.plotTop,u=k.plotLeft,m=0,p=0,w,n;d=r(d);this.followPointer&&c?(\"undefined\"===typeof c.chartX&&(c=f.normalize(c)),\nd=[c.chartX-u,c.chartY-l]):d[0].tooltipPos?d=d[0].tooltipPos:(d.forEach(function(f){w=f.series.yAxis;n=f.series.xAxis;m+=f.plotX+(!a&&n?n.left-u:0);p+=(f.plotLow?(f.plotLow+f.plotHigh)/2:f.plotY)+(!a&&w?w.top-l:0)}),m/=d.length,p/=d.length,d=[a?k.plotWidth-p:m,this.shared&&!a&&1<d.length&&c?c.chartY-l:a?k.plotHeight-m:p]);return d.map(Math.round)};m.prototype.getDateFormat=function(d,c,k,f){var a=this.chart.time,l=a.dateFormat(\"%m-%d %H:%M:%S.%L\",c),u={millisecond:15,second:12,minute:9,hour:6,day:3},\nm=\"millisecond\";for(p in I){if(d===I.week&&+a.dateFormat(\"%w\",c)===k&&\"00:00:00.000\"===l.substr(6)){var p=\"week\";break}if(I[p]>d){p=m;break}if(u[p]&&l.substr(u[p])!==\"01-01 00:00:00.000\".substr(u[p]))break;\"week\"!==p&&(m=p)}if(p)var w=a.resolveDTLFormat(f[p]).main;return w};m.prototype.getLabel=function(){var d,c,k=this,f=this.chart.renderer,a=this.chart.styledMode,m=this.options,u=\"tooltip\"+(H(m.className)?\" \"+m.className:\"\"),p=(null===(d=m.style)||void 0===d?void 0:d.pointerEvents)||(!this.followPointer&&\nm.stickOnContact?\"auto\":\"none\"),n;d=function(){k.inContact=!0};var w=function(){var a=k.chart.hoverSeries;k.inContact=!1;if(a&&a.onMouseOut)a.onMouseOut()};if(!this.label){this.outside&&(this.container=n=g.doc.createElement(\"div\"),n.className=\"highcharts-tooltip-container\",B(n,{position:\"absolute\",top:\"1px\",pointerEvents:p,zIndex:3}),g.doc.body.appendChild(n),this.renderer=f=new g.Renderer(n,0,0,null===(c=this.chart.options.chart)||void 0===c?void 0:c.style,void 0,void 0,f.styledMode));this.split?\nthis.label=f.g(u):(this.label=f.label(\"\",0,0,m.shape||\"callout\",null,null,m.useHTML,null,u).attr({padding:m.padding,r:m.borderRadius}),a||this.label.attr({fill:m.backgroundColor,\"stroke-width\":m.borderWidth}).css(m.style).css({pointerEvents:p}).shadow(m.shadow));a&&(this.applyFilter(),this.label.addClass(\"highcharts-tooltip-\"+this.chart.index));if(k.outside&&!k.split){var r=this.label,F=r.xSetter,t=r.ySetter;r.xSetter=function(a){F.call(r,k.distance);n.style.left=a+\"px\"};r.ySetter=function(a){t.call(r,\nk.distance);n.style.top=a+\"px\"}}this.label.on(\"mouseenter\",d).on(\"mouseleave\",w).attr({zIndex:8}).add()}return this.label};m.prototype.getPosition=function(d,c,k){var f=this.chart,a=this.distance,l={},m=f.inverted&&k.h||0,p,g=this.outside,w=g?q.documentElement.clientWidth-2*a:f.chartWidth,r=g?Math.max(q.body.scrollHeight,q.documentElement.scrollHeight,q.body.offsetHeight,q.documentElement.offsetHeight,q.documentElement.clientHeight):f.chartHeight,F=f.pointer.getChartPosition(),t=f.containerScaling,\ne=function(b){return t?b*t.scaleX:b},b=function(b){return t?b*t.scaleY:b},h=function(h){var l=\"x\"===h;return[h,l?w:r,l?d:c].concat(g?[l?e(d):b(c),l?F.left-a+e(k.plotX+f.plotLeft):F.top-a+b(k.plotY+f.plotTop),0,l?w:r]:[l?d:c,l?k.plotX+f.plotLeft:k.plotY+f.plotTop,l?f.plotLeft:f.plotTop,l?f.plotLeft+f.plotWidth:f.plotTop+f.plotHeight])},z=h(\"y\"),x=h(\"x\"),C=!this.followPointer&&n(k.ttBelow,!f.inverted===!!k.negative),v=function(h,f,d,c,k,u,p){var x=\"y\"===h?b(a):e(a),w=(d-c)/2,n=c<k-a,A=k+a+c<f,g=k-x-\nd+w;k=k+x-w;if(C&&A)l[h]=k;else if(!C&&n)l[h]=g;else if(n)l[h]=Math.min(p-c,0>g-m?g:g-m);else if(A)l[h]=Math.max(u,k+m+d>f?k:k+m);else return!1},I=function(b,e,h,f,d){var c;d<a||d>e-a?c=!1:l[b]=d<h/2?1:d>e-f/2?e-f-2:d-h/2;return c},V=function(b){var a=z;z=x;x=a;p=b},G=function(){!1!==v.apply(0,z)?!1!==I.apply(0,x)||p||(V(!0),G()):p?l.x=l.y=0:(V(!0),G())};(f.inverted||1<this.len)&&V();G();return l};m.prototype.getXDateFormat=function(d,c,k){c=c.dateTimeLabelFormats;var f=k&&k.closestPointRange;return(f?\nthis.getDateFormat(f,d.x,k.options.startOfWeek,c):c.day)||c.year};m.prototype.hide=function(d){var l=this;c.clearTimeout(this.hideTimer);d=n(d,this.options.hideDelay,500);this.isHidden||(this.hideTimer=C(function(){l.getLabel().fadeOut(d?void 0:d);l.isHidden=!0},d))};m.prototype.init=function(d,c){this.chart=d;this.options=c;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=c.split&&!d.inverted&&!d.polar;this.shared=c.shared||this.split;this.outside=n(c.outside,!(!d.scrollablePixelsX&&\n!d.scrollablePixelsY))};m.prototype.isStickyOnContact=function(){return!(this.followPointer||!this.options.stickOnContact||!this.inContact)};m.prototype.move=function(d,l,k,f){var a=this,m=a.now,u=!1!==a.options.animation&&!a.isHidden&&(1<Math.abs(d-m.x)||1<Math.abs(l-m.y)),p=a.followPointer||1<a.len;J(m,{x:u?(2*m.x+d)/3:d,y:u?(m.y+l)/2:l,anchorX:p?void 0:u?(2*m.anchorX+k)/3:k,anchorY:p?void 0:u?(m.anchorY+f)/2:f});a.getLabel().attr(m);a.drawTracker();u&&(c.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=\nsetTimeout(function(){a&&a.move(d,l,k,f)},32))};m.prototype.refresh=function(d,l){var k=this.chart,f=this.options,a=d,m={},u=[],p=f.formatter||this.defaultFormatter;m=this.shared;var g=k.styledMode;if(f.enabled){c.clearTimeout(this.hideTimer);this.followPointer=r(a)[0].series.tooltipOptions.followPointer;var w=this.getAnchor(a,l);l=w[0];var M=w[1];!m||a.series&&a.series.noSharedTooltip?m=a.getLabelConfig():(k.pointer.applyInactiveState(a),a.forEach(function(a){a.setState(\"hover\");u.push(a.getLabelConfig())}),\nm={x:a[0].category,y:a[0].y},m.points=u,a=a[0]);this.len=u.length;k=p.call(m,this);p=a.series;this.distance=n(p.tooltipOptions.distance,16);!1===k?this.hide():(this.split?this.renderSplit(k,r(d)):(d=this.getLabel(),f.style.width&&!g||d.css({width:this.chart.spacingBox.width+\"px\"}),d.attr({text:k&&k.join?k.join(\"\"):k}),d.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+n(a.colorIndex,p.colorIndex)),g||d.attr({stroke:f.borderColor||a.color||p.color||\"#666666\"}),this.updatePosition({plotX:l,\nplotY:M,negative:a.negative,ttBelow:a.ttBelow,h:w[2]||0})),this.isHidden&&this.label&&this.label.attr({opacity:1}).show(),this.isHidden=!1);t(this,\"refresh\")}};m.prototype.renderSplit=function(d,c){function k(b,a,e,h,f){void 0===f&&(f=!0);e?(a=V?0:D,b=y(b-h/2,q.left,q.right-h)):(a-=G,b=f?b-h-z:b+z,b=y(b,f?b:q.left,q.right));return{x:b,y:a}}var f=this,a=f.chart,l=f.chart,m=l.plotHeight,p=l.plotLeft,r=l.plotTop,w=l.pointer,M=l.renderer,F=l.scrollablePixelsY,t=void 0===F?0:F;F=l.scrollingContainer;F=\nvoid 0===F?{scrollLeft:0,scrollTop:0}:F;var e=F.scrollLeft,b=F.scrollTop,h=l.styledMode,z=f.distance,x=f.options,C=f.options.positioner,q={left:e,right:e+l.chartWidth,top:b,bottom:b+l.chartHeight},I=f.getLabel(),V=!(!a.xAxis[0]||!a.xAxis[0].opposite),G=r+b,K=0,D=m-t;v(d)&&(d=[!1,d]);d=d.slice(0,c.length+1).reduce(function(a,e,d){if(!1!==e&&\"\"!==e){d=c[d-1]||{isHeader:!0,plotX:c[0].plotX,plotY:m,series:{}};var l=d.isHeader,u=l?f:d.series,w=u.tt,g=d.isHeader;var A=d.series;var E=\"highcharts-color-\"+\nn(d.colorIndex,A.colorIndex,\"none\");w||(w={padding:x.padding,r:x.borderRadius},h||(w.fill=x.backgroundColor,w[\"stroke-width\"]=x.borderWidth),w=M.label(\"\",0,0,x[g?\"headerShape\":\"shape\"]||\"callout\",void 0,void 0,x.useHTML).addClass((g?\"highcharts-tooltip-header \":\"\")+\"highcharts-tooltip-box \"+E).attr(w).add(I));w.isActive=!0;w.attr({text:e});h||w.css(x.style).shadow(x.shadow).attr({stroke:x.borderColor||d.color||A.color||\"#333333\"});e=u.tt=w;g=e.getBBox();u=g.width+e.strokeWidth();l&&(K=g.height,D+=\nK,V&&(G-=K));A=d.plotX;A=void 0===A?0:A;E=d.plotY;E=void 0===E?0:E;var F=d.series;if(d.isHeader){A=p+A;var S=r+m/2}else w=F.xAxis,F=F.yAxis,A=w.pos+y(A,-z,w.len+z),F.pos+E>=b+r&&F.pos+E<=b+r+m-t&&(S=F.pos+E);A=y(A,q.left-z,q.right+z);\"number\"===typeof S?(g=g.height+1,E=C?C.call(f,u,g,d):k(A,S,l,u),a.push({align:C?0:void 0,anchorX:A,anchorY:S,boxWidth:u,point:d,rank:n(E.rank,l?1:0),size:g,target:E.y,tt:e,x:E.x})):e.isActive=!1}return a},[]);!C&&d.some(function(b){return b.x<q.left})&&(d=d.map(function(b){var a=\nk(b.anchorX,b.anchorY,b.point.isHeader,b.boxWidth,!1);return J(b,{target:a.y,x:a.x})}));f.cleanSplit();g.distribute(d,D);d.forEach(function(b){var a=b.pos;b.tt.attr({visibility:\"undefined\"===typeof a?\"hidden\":\"inherit\",x:b.x,y:a+G,anchorX:b.anchorX,anchorY:b.anchorY})});d=f.container;a=f.renderer;f.outside&&d&&a&&(l=I.getBBox(),a.setSize(l.width+l.x,l.height+l.y,!1),w=w.getChartPosition(),d.style.left=w.left+\"px\",d.style.top=w.top+\"px\")};m.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&\nthis.tracker.destroy();else{var d=this.chart,c=this.label,k=d.hoverPoint;if(c&&k){var f={x:0,y:0,width:0,height:0};k=this.getAnchor(k);var a=c.getBBox();k[0]+=d.plotLeft-c.translateX;k[1]+=d.plotTop-c.translateY;f.x=Math.min(0,k[0]);f.y=Math.min(0,k[1]);f.width=0>k[0]?Math.max(Math.abs(k[0]),a.width-k[0]):Math.max(Math.abs(k[0]),a.width);f.height=0>k[1]?Math.max(Math.abs(k[1]),a.height-Math.abs(k[1])):Math.max(Math.abs(k[1]),a.height);this.tracker?this.tracker.attr(f):(this.tracker=c.renderer.rect(f).addClass(\"highcharts-tracker\").add(c),\nd.styledMode||this.tracker.attr({fill:\"rgba(0,0,0,0)\"}))}}};m.prototype.styledModeFormat=function(d){return d.replace('style=\"font-size: 10px\"','class=\"highcharts-header\"').replace(/style=\"color:{(point|series)\\.color}\"/g,'class=\"highcharts-color-{$1.colorIndex}\"')};m.prototype.tooltipFooterHeaderFormatter=function(d,c){var k=c?\"footer\":\"header\",f=d.series,a=f.tooltipOptions,l=a.xDateFormat,m=f.xAxis,p=m&&\"datetime\"===m.options.type&&L(d.key),n=a[k+\"Format\"];c={isFooter:c,labelConfig:d};t(this,\"headerFormatter\",\nc,function(c){p&&!l&&(l=this.getXDateFormat(d,a,m));p&&l&&(d.point&&d.point.tooltipDateKeys||[\"key\"]).forEach(function(a){n=n.replace(\"{point.\"+a+\"}\",\"{point.\"+a+\":\"+l+\"}\")});f.chart.styledMode&&(n=this.styledModeFormat(n));c.text=G(n,{point:d,series:f},this.chart)});return c.text};m.prototype.update=function(d){this.destroy();K(!0,this.chart.options.tooltip.userOptions,d);this.init(this.chart,K(!0,this.options,d))};m.prototype.updatePosition=function(d){var c=this.chart,k=c.pointer,f=this.getLabel(),\na=d.plotX+c.plotLeft,m=d.plotY+c.plotTop;k=k.getChartPosition();d=(this.options.positioner||this.getPosition).call(this,f.width,f.height,d);if(this.outside){var p=(this.options.borderWidth||0)+2*this.distance;this.renderer.setSize(f.width+p,f.height+p,!1);if(c=c.containerScaling)B(this.container,{transform:\"scale(\"+c.scaleX+\", \"+c.scaleY+\")\"}),a*=c.scaleX,m*=c.scaleY;a+=k.left-d.x;m+=k.top-d.y}this.move(Math.round(d.x),Math.round(d.y||0),a,m)};return m}();g.Tooltip=p;return g.Tooltip});O(q,\"parts/Pointer.js\",\n[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Tooltip.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=g.parse,H=c.charts,D=c.noop,J=y.addEvent,t=y.attr,G=y.css,L=y.defined,v=y.extend,K=y.find,n=y.fireEvent,r=y.isNumber,C=y.isObject,I=y.objectEach,p=y.offset,m=y.pick,d=y.splat;\"\";g=function(){function l(d,f){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.chart=d;this.hasDragged=!1;this.options=f;this.unbindContainerMouseLeave=function(){};this.init(d,f)}l.prototype.applyInactiveState=\nfunction(d){var f=[],a;(d||[]).forEach(function(d){a=d.series;f.push(a);a.linkedParent&&f.push(a.linkedParent);a.linkedSeries&&(f=f.concat(a.linkedSeries));a.navigatorSeries&&f.push(a.navigatorSeries)});this.chart.series.forEach(function(a){-1===f.indexOf(a)?a.setState(\"inactive\",!0):a.options.inactiveOtherPoints&&a.setAllPointsToState(\"inactive\")})};l.prototype.destroy=function(){var d=this;\"undefined\"!==typeof d.unDocMouseMove&&d.unDocMouseMove();this.unbindContainerMouseLeave();c.chartCount||(c.unbindDocumentMouseUp&&\n(c.unbindDocumentMouseUp=c.unbindDocumentMouseUp()),c.unbindDocumentTouchEnd&&(c.unbindDocumentTouchEnd=c.unbindDocumentTouchEnd()));clearInterval(d.tooltipTimeout);I(d,function(f,a){d[a]=void 0})};l.prototype.drag=function(d){var f=this.chart,a=f.options.chart,c=d.chartX,k=d.chartY,l=this.zoomHor,m=this.zoomVert,p=f.plotLeft,n=f.plotTop,g=f.plotWidth,r=f.plotHeight,e=this.selectionMarker,b=this.mouseDownX||0,h=this.mouseDownY||0,z=C(a.panning)?a.panning&&a.panning.enabled:a.panning,x=a.panKey&&d[a.panKey+\n\"Key\"];if(!e||!e.touch)if(c<p?c=p:c>p+g&&(c=p+g),k<n?k=n:k>n+r&&(k=n+r),this.hasDragged=Math.sqrt(Math.pow(b-c,2)+Math.pow(h-k,2)),10<this.hasDragged){var t=f.isInsidePlot(b-p,h-n);f.hasCartesianSeries&&(this.zoomX||this.zoomY)&&t&&!x&&!e&&(this.selectionMarker=e=f.renderer.rect(p,n,l?1:g,m?1:r,0).attr({\"class\":\"highcharts-selection-marker\",zIndex:7}).add(),f.styledMode||e.attr({fill:a.selectionMarkerFill||B(\"#335cad\").setOpacity(.25).get()}));e&&l&&(c-=b,e.attr({width:Math.abs(c),x:(0<c?0:c)+b}));\ne&&m&&(c=k-h,e.attr({height:Math.abs(c),y:(0<c?0:c)+h}));t&&!e&&z&&f.pan(d,a.panning)}};l.prototype.dragStart=function(d){var f=this.chart;f.mouseIsDown=d.type;f.cancelClick=!1;f.mouseDownX=this.mouseDownX=d.chartX;f.mouseDownY=this.mouseDownY=d.chartY};l.prototype.drop=function(d){var f=this,a=this.chart,c=this.hasPinched;if(this.selectionMarker){var k={originalEvent:d,xAxis:[],yAxis:[]},l=this.selectionMarker,m=l.attr?l.attr(\"x\"):l.x,p=l.attr?l.attr(\"y\"):l.y,g=l.attr?l.attr(\"width\"):l.width,F=l.attr?\nl.attr(\"height\"):l.height,t;if(this.hasDragged||c)a.axes.forEach(function(a){if(a.zoomEnabled&&L(a.min)&&(c||f[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[a.coll]])&&r(m)&&r(p)){var b=a.horiz,e=\"touchend\"===d.type?a.minPixelPadding:0,l=a.toValue((b?m:p)+e);b=a.toValue((b?m+g:p+F)-e);k[a.coll].push({axis:a,min:Math.min(l,b),max:Math.max(l,b)});t=!0}}),t&&n(a,\"selection\",k,function(e){a.zoom(v(e,c?{animation:!1}:null))});r(a.index)&&(this.selectionMarker=this.selectionMarker.destroy());c&&this.scaleGroups()}a&&r(a.index)&&\n(G(a.container,{cursor:a._cursor}),a.cancelClick=10<this.hasDragged,a.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};l.prototype.findNearestKDPoint=function(d,f,a){var c=this.chart,k=c.hoverPoint;c=c.tooltip;if(k&&c&&c.isStickyOnContact())return k;var l;d.forEach(function(d){var c=!(d.noSharedTooltip&&f)&&0>d.options.findNearestPointBy.indexOf(\"y\");d=d.searchPoint(a,c);if((c=C(d,!0))&&!(c=!C(l,!0))){c=l.distX-d.distX;var k=l.dist-d.dist,m=(d.series.group&&d.series.group.zIndex)-\n(l.series.group&&l.series.group.zIndex);c=0<(0!==c&&f?c:0!==k?k:0!==m?m:l.series.index>d.series.index?-1:1)}c&&(l=d)});return l};l.prototype.getChartCoordinatesFromPoint=function(d,f){var a=d.series,c=a.xAxis;a=a.yAxis;var k=m(d.clientX,d.plotX),l=d.shapeArgs;if(c&&a)return f?{chartX:c.len+c.pos-k,chartY:a.len+a.pos-d.plotY}:{chartX:k+c.pos,chartY:d.plotY+a.pos};if(l&&l.x&&l.y)return{chartX:l.x,chartY:l.y}};l.prototype.getChartPosition=function(){return this.chartPosition||(this.chartPosition=p(this.chart.container))};\nl.prototype.getCoordinates=function(d){var f={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(a){f[a.isXAxis?\"xAxis\":\"yAxis\"].push({axis:a,value:a.toValue(d[a.horiz?\"chartX\":\"chartY\"])})});return f};l.prototype.getHoverData=function(d,f,a,c,l,p){var k,u=[];c=!(!c||!d);var g=f&&!f.stickyTracking,A={chartX:p?p.chartX:void 0,chartY:p?p.chartY:void 0,shared:l};n(this,\"beforeGetHoverData\",A);g=g?[f]:a.filter(function(a){return A.filter?A.filter(a):a.visible&&!(!l&&a.directTouch)&&m(a.options.enableMouseTracking,\n!0)&&a.stickyTracking});f=(k=c||!p?d:this.findNearestKDPoint(g,l,p))&&k.series;k&&(l&&!f.noSharedTooltip?(g=a.filter(function(a){return A.filter?A.filter(a):a.visible&&!(!l&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),g.forEach(function(a){var e=K(a.points,function(b){return b.x===k.x&&!b.isNull});C(e)&&(a.chart.isBoosting&&(e=a.getPoint(e)),u.push(e))})):u.push(k));A={hoverPoint:k};n(this,\"afterGetHoverData\",A);return{hoverPoint:A.hoverPoint,hoverSeries:f,hoverPoints:u}};\nl.prototype.getPointFromEvent=function(d){d=d.target;for(var f;d&&!f;)f=d.point,d=d.parentNode;return f};l.prototype.onTrackerMouseOut=function(d){d=d.relatedTarget||d.toElement;var f=this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!f||!d||f.stickyTracking||this.inClass(d,\"highcharts-tooltip\")||this.inClass(d,\"highcharts-series-\"+f.index)&&this.inClass(d,\"highcharts-tracker\")))f.onMouseOut()};l.prototype.inClass=function(d,f){for(var a;d;){if(a=t(d,\"class\")){if(-1!==a.indexOf(f))return!0;if(-1!==\na.indexOf(\"highcharts-container\"))return!1}d=d.parentNode}};l.prototype.init=function(d,f){this.options=f;this.chart=d;this.runChartClick=f.chart.events&&!!f.chart.events.click;this.pinchDown=[];this.lastValidTouch={};q&&(d.tooltip=new q(d,f.tooltip),this.followTouchMove=m(f.tooltip.followTouchMove,!0));this.setDOMEvents()};l.prototype.normalize=function(d,f){var a=d.touches,c=a?a.length?a.item(0):m(a.changedTouches,d.changedTouches)[0]:d;f||(f=this.getChartPosition());a=c.pageX-f.left;f=c.pageY-\nf.top;if(c=this.chart.containerScaling)a/=c.scaleX,f/=c.scaleY;return v(d,{chartX:Math.round(a),chartY:Math.round(f)})};l.prototype.onContainerClick=function(d){var f=this.chart,a=f.hoverPoint;d=this.normalize(d);var c=f.plotLeft,k=f.plotTop;f.cancelClick||(a&&this.inClass(d.target,\"highcharts-tracker\")?(n(a.series,\"click\",v(d,{point:a})),f.hoverPoint&&a.firePointEvent(\"click\",d)):(v(d,this.getCoordinates(d)),f.isInsidePlot(d.chartX-c,d.chartY-k)&&n(f,\"click\",d)))};l.prototype.onContainerMouseDown=\nfunction(d){d=this.normalize(d);if(c.isFirefox&&0!==d.button)this.onContainerMouseMove(d);if(\"undefined\"===typeof d.button||1===((d.buttons||d.button)&1))this.zoomOption(d),this.dragStart(d)};l.prototype.onContainerMouseLeave=function(d){var f=H[m(c.hoverChartIndex,-1)],a=this.chart.tooltip;d=this.normalize(d);f&&(d.relatedTarget||d.toElement)&&(f.pointer.reset(),f.pointer.chartPosition=void 0);a&&!a.isHidden&&this.reset()};l.prototype.onContainerMouseMove=function(d){var f=this.chart;d=this.normalize(d);\nthis.setHoverChartIndex();d.preventDefault||(d.returnValue=!1);\"mousedown\"===f.mouseIsDown&&this.drag(d);f.openMenu||!this.inClass(d.target,\"highcharts-tracker\")&&!f.isInsidePlot(d.chartX-f.plotLeft,d.chartY-f.plotTop)||this.runPointActions(d)};l.prototype.onDocumentTouchEnd=function(d){H[c.hoverChartIndex]&&H[c.hoverChartIndex].pointer.drop(d)};l.prototype.onContainerTouchMove=function(d){this.touch(d)};l.prototype.onContainerTouchStart=function(d){this.zoomOption(d);this.touch(d,!0)};l.prototype.onDocumentMouseMove=\nfunction(d){var f=this.chart,a=this.chartPosition;d=this.normalize(d,a);var c=f.tooltip;!a||c&&c.isStickyOnContact()||f.isInsidePlot(d.chartX-f.plotLeft,d.chartY-f.plotTop)||this.inClass(d.target,\"highcharts-tracker\")||this.reset()};l.prototype.onDocumentMouseUp=function(d){var f=H[m(c.hoverChartIndex,-1)];f&&f.pointer.drop(d)};l.prototype.pinch=function(d){var f=this,a=f.chart,c=f.pinchDown,k=d.touches||[],l=k.length,p=f.lastValidTouch,n=f.hasZoom,g=f.selectionMarker,r={},t=1===l&&(f.inClass(d.target,\n\"highcharts-tracker\")&&a.runTrackerClick||f.runChartClick),e={};1<l&&(f.initiated=!0);n&&f.initiated&&!t&&d.preventDefault();[].map.call(k,function(b){return f.normalize(b)});\"touchstart\"===d.type?([].forEach.call(k,function(b,a){c[a]={chartX:b.chartX,chartY:b.chartY}}),p.x=[c[0].chartX,c[1]&&c[1].chartX],p.y=[c[0].chartY,c[1]&&c[1].chartY],a.axes.forEach(function(b){if(b.zoomEnabled){var e=a.bounds[b.horiz?\"h\":\"v\"],f=b.minPixelPadding,d=b.toPixels(Math.min(m(b.options.min,b.dataMin),b.dataMin)),\nc=b.toPixels(Math.max(m(b.options.max,b.dataMax),b.dataMax)),k=Math.max(d,c);e.min=Math.min(b.pos,Math.min(d,c)-f);e.max=Math.max(b.pos+b.len,k+f)}}),f.res=!0):f.followTouchMove&&1===l?this.runPointActions(f.normalize(d)):c.length&&(g||(f.selectionMarker=g=v({destroy:D,touch:!0},a.plotBox)),f.pinchTranslate(c,k,r,g,e,p),f.hasPinched=n,f.scaleGroups(r,e),f.res&&(f.res=!1,this.reset(!1,0)))};l.prototype.pinchTranslate=function(d,f,a,c,l,m){this.zoomHor&&this.pinchTranslateDirection(!0,d,f,a,c,l,m);\nthis.zoomVert&&this.pinchTranslateDirection(!1,d,f,a,c,l,m)};l.prototype.pinchTranslateDirection=function(d,f,a,c,l,m,p,n){var k=this.chart,u=d?\"x\":\"y\",g=d?\"X\":\"Y\",e=\"chart\"+g,b=d?\"width\":\"height\",h=k[\"plot\"+(d?\"Left\":\"Top\")],w,x,A=n||1,r=k.inverted,E=k.bounds[d?\"h\":\"v\"],t=1===f.length,C=f[0][e],v=a[0][e],q=!t&&f[1][e],I=!t&&a[1][e];a=function(){\"number\"===typeof I&&20<Math.abs(C-q)&&(A=n||Math.abs(v-I)/Math.abs(C-q));x=(h-v)/A+C;w=k[\"plot\"+(d?\"Width\":\"Height\")]/A};a();f=x;if(f<E.min){f=E.min;var P=\n!0}else f+w>E.max&&(f=E.max-w,P=!0);P?(v-=.8*(v-p[u][0]),\"number\"===typeof I&&(I-=.8*(I-p[u][1])),a()):p[u]=[v,I];r||(m[u]=x-h,m[b]=w);m=r?1/A:A;l[b]=w;l[u]=f;c[r?d?\"scaleY\":\"scaleX\":\"scale\"+g]=A;c[\"translate\"+g]=m*h+(v-m*C)};l.prototype.reset=function(c,f){var a=this.chart,k=a.hoverSeries,l=a.hoverPoint,m=a.hoverPoints,p=a.tooltip,n=p&&p.shared?m:l;c&&n&&d(n).forEach(function(a){a.series.isCartesian&&\"undefined\"===typeof a.plotX&&(c=!1)});if(c)p&&n&&d(n).length&&(p.refresh(n),p.shared&&m?m.forEach(function(a){a.setState(a.state,\n!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,a),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):l&&(l.setState(l.state,!0),a.axes.forEach(function(a){a.crosshair&&l.series[a.coll]===a&&a.drawCrosshair(null,l)})));else{if(l)l.onMouseOut();m&&m.forEach(function(a){a.setState()});if(k)k.onMouseOut();p&&p.hide(f);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());a.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=a.hoverPoints=\na.hoverPoint=null}};l.prototype.runPointActions=function(d,f){var a=this.chart,k=a.tooltip&&a.tooltip.options.enabled?a.tooltip:void 0,l=k?k.shared:!1,p=f||a.hoverPoint,n=p&&p.series||a.hoverSeries;n=this.getHoverData(p,n,a.series,(!d||\"touchmove\"!==d.type)&&(!!f||n&&n.directTouch&&this.isDirectTouch),l,d);p=n.hoverPoint;var g=n.hoverPoints;f=(n=n.hoverSeries)&&n.tooltipOptions.followPointer;l=l&&n&&!n.noSharedTooltip;if(p&&(p!==a.hoverPoint||k&&k.isHidden)){(a.hoverPoints||[]).forEach(function(a){-1===\ng.indexOf(a)&&a.setState()});if(a.hoverSeries!==n)n.onMouseOver();this.applyInactiveState(g);(g||[]).forEach(function(a){a.setState(\"hover\")});a.hoverPoint&&a.hoverPoint.firePointEvent(\"mouseOut\");if(!p.series)return;a.hoverPoints=g;a.hoverPoint=p;p.firePointEvent(\"mouseOver\");k&&k.refresh(l?g:p,d)}else f&&k&&!k.isHidden&&(p=k.getAnchor([{}],d),k.updatePosition({plotX:p[0],plotY:p[1]}));this.unDocMouseMove||(this.unDocMouseMove=J(a.container.ownerDocument,\"mousemove\",function(a){var f=H[c.hoverChartIndex];\nif(f)f.pointer.onDocumentMouseMove(a)}));a.axes.forEach(function(f){var c=m((f.crosshair||{}).snap,!0),k;c&&((k=a.hoverPoint)&&k.series[f.coll]===f||(k=K(g,function(a){return a.series[f.coll]===f})));k||!c?f.drawCrosshair(d,k):f.hideCrosshair()})};l.prototype.scaleGroups=function(d,f){var a=this.chart,c;a.series.forEach(function(k){c=d||k.getPlotBox();k.xAxis&&k.xAxis.zoomEnabled&&k.group&&(k.group.attr(c),k.markerGroup&&(k.markerGroup.attr(c),k.markerGroup.clip(f?a.clipRect:null)),k.dataLabelsGroup&&\nk.dataLabelsGroup.attr(c))});a.clipRect.attr(f||a.clipBox)};l.prototype.setDOMEvents=function(){var d=this.chart.container,f=d.ownerDocument;d.onmousedown=this.onContainerMouseDown.bind(this);d.onmousemove=this.onContainerMouseMove.bind(this);d.onclick=this.onContainerClick.bind(this);this.unbindContainerMouseLeave=J(d,\"mouseleave\",this.onContainerMouseLeave.bind(this));c.unbindDocumentMouseUp||(c.unbindDocumentMouseUp=J(f,\"mouseup\",this.onDocumentMouseUp.bind(this)));c.hasTouch&&(J(d,\"touchstart\",\nthis.onContainerTouchStart.bind(this)),J(d,\"touchmove\",this.onContainerTouchMove.bind(this)),c.unbindDocumentTouchEnd||(c.unbindDocumentTouchEnd=J(f,\"touchend\",this.onDocumentTouchEnd.bind(this))))};l.prototype.setHoverChartIndex=function(){var d=this.chart,f=c.charts[m(c.hoverChartIndex,-1)];if(f&&f!==d)f.pointer.onContainerMouseLeave({relatedTarget:!0});f&&f.mouseIsDown||(c.hoverChartIndex=d.index)};l.prototype.touch=function(d,f){var a=this.chart,c;this.setHoverChartIndex();if(1===d.touches.length)if(d=\nthis.normalize(d),(c=a.isInsidePlot(d.chartX-a.plotLeft,d.chartY-a.plotTop))&&!a.openMenu){f&&this.runPointActions(d);if(\"touchmove\"===d.type){f=this.pinchDown;var k=f[0]?4<=Math.sqrt(Math.pow(f[0].chartX-d.chartX,2)+Math.pow(f[0].chartY-d.chartY,2)):!1}m(k,!0)&&this.pinch(d)}else f&&this.reset();else 2===d.touches.length&&this.pinch(d)};l.prototype.zoomOption=function(d){var f=this.chart,a=f.options.chart,c=a.zoomType||\"\";f=f.inverted;/touch/.test(d.type)&&(c=m(a.pinchType,c));this.zoomX=d=/x/.test(c);\nthis.zoomY=c=/y/.test(c);this.zoomHor=d&&!f||c&&f;this.zoomVert=c&&!f||d&&f;this.hasZoom=d||c};return l}();return c.Pointer=g});O(q,\"parts/MSPointer.js\",[q[\"parts/Globals.js\"],q[\"parts/Pointer.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){function y(){var c=[];c.item=function(c){return this[c]};v(n,function(n){c.push({pageX:n.pageX,pageY:n.pageY,target:n.target})});return c}function B(c,n,p,m){\"touch\"!==c.pointerType&&c.pointerType!==c.MSPOINTER_TYPE_TOUCH||!D[g.hoverChartIndex]||(m(c),m=D[g.hoverChartIndex].pointer,\nm[n]({type:p,target:c.currentTarget,preventDefault:t,touches:y()}))}var H=this&&this.__extends||function(){var c=function(n,p){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,d){c.__proto__=d}||function(c,d){for(var l in d)d.hasOwnProperty(l)&&(c[l]=d[l])};return c(n,p)};return function(n,p){function m(){this.constructor=n}c(n,p);n.prototype=null===p?Object.create(p):(m.prototype=p.prototype,new m)}}(),D=g.charts,J=g.doc,t=g.noop,G=q.addEvent,L=q.css,v=q.objectEach,K=q.removeEvent,\nn={},r=!!g.win.PointerEvent;return function(c){function g(){return null!==c&&c.apply(this,arguments)||this}H(g,c);g.prototype.batchMSEvents=function(c){c(this.chart.container,r?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);c(this.chart.container,r?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);c(J,r?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)};g.prototype.destroy=function(){this.batchMSEvents(K);c.prototype.destroy.call(this)};g.prototype.init=function(p,m){c.prototype.init.call(this,\np,m);this.hasZoom&&L(p.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})};g.prototype.onContainerPointerDown=function(c){B(c,\"onContainerTouchStart\",\"touchstart\",function(c){n[c.pointerId]={pageX:c.pageX,pageY:c.pageY,target:c.currentTarget}})};g.prototype.onContainerPointerMove=function(c){B(c,\"onContainerTouchMove\",\"touchmove\",function(c){n[c.pointerId]={pageX:c.pageX,pageY:c.pageY};n[c.pointerId].target||(n[c.pointerId].target=c.currentTarget)})};g.prototype.onDocumentPointerUp=function(c){B(c,\n\"onDocumentTouchEnd\",\"touchend\",function(c){delete n[c.pointerId]})};g.prototype.setDOMEvents=function(){c.prototype.setDOMEvents.call(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(G)};return g}(c)});O(q,\"parts/Legend.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.animObject,B=c.css,H=c.defined,D=c.discardElement,J=c.find,t=c.fireEvent,G=c.format,L=c.isNumber,v=c.merge,K=c.pick,n=c.relativeLength,r=c.setAnimation,C=c.stableSort,I=c.syncTimeout;\nc=c.wrap;var p=g.isFirefox,m=g.marginNames,d=g.win,l=function(){function d(d,a){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=this.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=this.itemHeight=this.initialItemY=0;this.options={};this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=void 0;this.widthOption=this.totalItemWidth=\nthis.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=d;this.init(d,a)}d.prototype.init=function(d,a){this.chart=d;this.setOptions(a);a.enabled&&(this.render(),q(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=q(this.chart,\"render\",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};d.prototype.setOptions=function(d){var a=K(d.padding,8);this.options=d;this.chart.styledMode||\n(this.itemStyle=d.itemStyle,this.itemHiddenStyle=v(this.itemStyle,d.itemHiddenStyle));this.itemMarginTop=d.itemMarginTop||0;this.itemMarginBottom=d.itemMarginBottom||0;this.padding=a;this.initialItemY=a-5;this.symbolWidth=K(d.symbolWidth,16);this.pages=[];this.proximate=\"proximate\"===d.layout&&!this.chart.inverted;this.baseline=void 0};d.prototype.update=function(d,a){var f=this.chart;this.setOptions(v(!0,this.options,d));this.destroy();f.isDirtyLegend=f.isDirtyBox=!0;K(a,!0)&&f.redraw();t(this,\"afterUpdate\")};\nd.prototype.colorizeItem=function(d,a){d.legendGroup[a?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\");if(!this.chart.styledMode){var f=this.options,c=d.legendItem,l=d.legendLine,k=d.legendSymbol,m=this.itemHiddenStyle.color;f=a?f.itemStyle.color:m;var p=a?d.color||m:m,n=d.options&&d.options.marker,g={fill:p};c&&c.css({fill:f,color:f});l&&l.attr({stroke:p});k&&(n&&k.isMarker&&(g=d.pointAttribs(),a||(g.stroke=g.fill=m)),k.attr(g))}t(this,\"afterColorizeItem\",{item:d,visible:a})};d.prototype.positionItems=\nfunction(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};d.prototype.positionItem=function(d){var a=this,f=this.options,c=f.symbolPadding,k=!f.rtl,l=d._legendItemPos;f=l[0];l=l[1];var m=d.checkbox,p=d.legendGroup;p&&p.element&&(c={translateX:k?f:this.legendWidth-f-2*c-4,translateY:l},k=function(){t(a,\"afterPositionItem\",{item:d})},H(p.translateY)?p.animate(c,{complete:k}):(p.attr(c),k()));m&&(m.x=f,m.y=l)};d.prototype.destroyItem=function(d){var a=\nd.checkbox;[\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"].forEach(function(a){d[a]&&(d[a]=d[a].destroy())});a&&D(d.checkbox)};d.prototype.destroy=function(){function d(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(a){[\"legendItem\",\"legendGroup\"].forEach(d,a)});\"clipRect up down pager nav box title group\".split(\" \").forEach(d,this);this.display=null};d.prototype.positionCheckboxes=function(){var d=this.group&&this.group.alignAttr,a=this.clipHeight||this.legendHeight,\nc=this.titleHeight;if(d){var l=d.translateY;this.allItems.forEach(function(f){var k=f.checkbox;if(k){var m=l+c+k.y+(this.scrollOffset||0)+3;B(k,{left:d.translateX+f.checkboxOffset+k.x-20+\"px\",top:m+\"px\",display:this.proximate||m>l-6&&m<l+a-6?\"\":\"none\"})}},this)}};d.prototype.renderTitle=function(){var d=this.options,a=this.padding,c=d.title,k=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,a-3,a-4,null,null,null,d.useHTML,null,\"legend-title\").attr({zIndex:1}),this.chart.styledMode||\nthis.title.css(c.style),this.title.add(this.group)),c.width||this.title.css({width:this.maxLegendWidth+\"px\"}),d=this.title.getBBox(),k=d.height,this.offsetWidth=d.width,this.contentGroup.attr({translateY:k}));this.titleHeight=k};d.prototype.setText=function(d){var a=this.options;d.legendItem.attr({text:a.labelFormat?G(a.labelFormat,d,this.chart):a.labelFormatter.call(d)})};d.prototype.renderItem=function(d){var a=this.chart,f=a.renderer,c=this.options,k=this.symbolWidth,l=c.symbolPadding,m=this.itemStyle,\np=this.itemHiddenStyle,n=\"horizontal\"===c.layout?K(c.itemDistance,20):0,g=!c.rtl,e=d.legendItem,b=!d.series,h=!b&&d.series.drawLegendSymbol?d.series:d,z=h.options;z=this.createCheckboxForItem&&z&&z.showCheckbox;n=k+l+n+(z?20:0);var x=c.useHTML,r=d.options.className;e||(d.legendGroup=f.g(\"legend-item\").addClass(\"highcharts-\"+h.type+\"-series highcharts-color-\"+d.colorIndex+(r?\" \"+r:\"\")+(b?\" highcharts-series-\"+d.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),d.legendItem=e=f.text(\"\",g?k+l:-l,this.baseline||\n0,x),a.styledMode||e.css(v(d.visible?m:p)),e.attr({align:g?\"left\":\"right\",zIndex:2}).add(d.legendGroup),this.baseline||(this.fontMetrics=f.fontMetrics(a.styledMode?12:m.fontSize,e),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,e.attr(\"y\",this.baseline)),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,h.drawLegendSymbol(this,d),this.setItemEvents&&this.setItemEvents(d,e,x));z&&!d.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(d);this.colorizeItem(d,d.visible);!a.styledMode&&\nm.width||e.css({width:(c.itemWidth||this.widthOption||a.spacingBox.width)-n+\"px\"});this.setText(d);a=e.getBBox();d.itemWidth=d.checkboxOffset=c.itemWidth||d.legendItemWidth||a.width+n;this.maxItemWidth=Math.max(this.maxItemWidth,d.itemWidth);this.totalItemWidth+=d.itemWidth;this.itemHeight=d.itemHeight=Math.round(d.legendItemHeight||a.height||this.symbolHeight)};d.prototype.layoutItem=function(d){var a=this.options,f=this.padding,c=\"horizontal\"===a.layout,k=d.itemHeight,l=this.itemMarginBottom,m=\nthis.itemMarginTop,p=c?K(a.itemDistance,20):0,n=this.maxLegendWidth;a=a.alignColumns&&this.totalItemWidth>n?this.maxItemWidth:d.itemWidth;c&&this.itemX-f+a>n&&(this.itemX=f,this.lastLineHeight&&(this.itemY+=m+this.lastLineHeight+l),this.lastLineHeight=0);this.lastItemY=m+this.itemY+l;this.lastLineHeight=Math.max(k,this.lastLineHeight);d._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=a:(this.itemY+=m+k+l,this.lastLineHeight=k);this.offsetWidth=this.widthOption||Math.max((c?this.itemX-f-(d.checkbox?\n0:p):a)+f,this.offsetWidth)};d.prototype.getAllItems=function(){var d=[];this.chart.series.forEach(function(a){var f=a&&a.options;a&&K(f.showInLegend,H(f.linkedTo)?!1:void 0,!0)&&(d=d.concat(a.legendItems||(\"point\"===f.legendType?a.data:a)))});t(this,\"afterGetAllItems\",{allItems:d});return d};d.prototype.getAlignment=function(){var d=this.options;return this.proximate?d.align.charAt(0)+\"tv\":d.floating?\"\":d.align.charAt(0)+d.verticalAlign.charAt(0)+d.layout.charAt(0)};d.prototype.adjustMargins=function(d,\na){var c=this.chart,f=this.options,k=this.getAlignment();k&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(l,p){l.test(k)&&!H(d[p])&&(c[m[p]]=Math.max(c[m[p]],c.legend[(p+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][p]*f[p%2?\"x\":\"y\"]+K(f.margin,12)+a[p]+(c.titleOffset[p]||0)))})};d.prototype.proximatePositions=function(){var d=this.chart,a=[],c=\"left\"===this.options.align;this.allItems.forEach(function(f){var k=c;if(f.yAxis&&f.points){f.xAxis.options.reversed&&(k=\n!k);var l=J(k?f.points:f.points.slice(0).reverse(),function(a){return L(a.plotY)});k=this.itemMarginTop+f.legendItem.getBBox().height+this.itemMarginBottom;var m=f.yAxis.top-d.plotTop;f.visible?(l=l?l.plotY:f.yAxis.height,l+=m-.3*k):l=m+f.yAxis.height;a.push({target:l,size:k,item:f})}},this);g.distribute(a,d.plotHeight);a.forEach(function(a){a.item._legendItemPos[1]=d.plotTop-d.spacing[0]+a.pos})};d.prototype.render=function(){var d=this.chart,a=d.renderer,c=this.group,k=this.box,l=this.options,m=\nthis.padding;this.itemX=m;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=n(l.width,d.spacingBox.width-m);var p=d.spacingBox.width-2*m-l.x;-1<[\"rm\",\"lm\"].indexOf(this.getAlignment().substring(0,2))&&(p/=2);this.maxLegendWidth=this.widthOption||p;c||(this.group=c=a.g(\"legend\").attr({zIndex:7}).add(),this.contentGroup=a.g().attr({zIndex:1}).add(c),this.scrollGroup=a.g().add(this.contentGroup));this.renderTitle();var g=this.getAllItems();C(g,function(a,e){return(a.options&&\na.options.legendIndex||0)-(e.options&&e.options.legendIndex||0)});l.reversed&&g.reverse();this.allItems=g;this.display=p=!!g.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;g.forEach(this.renderItem,this);g.forEach(this.layoutItem,this);g=(this.widthOption||this.offsetWidth)+m;var r=this.lastItemY+this.lastLineHeight+this.titleHeight;r=this.handleOverflow(r);r+=m;k||(this.box=k=a.rect().addClass(\"highcharts-legend-box\").attr({r:l.borderRadius}).add(c),k.isNew=!0);\nd.styledMode||k.attr({stroke:l.borderColor,\"stroke-width\":l.borderWidth||0,fill:l.backgroundColor||\"none\"}).shadow(l.shadow);0<g&&0<r&&(k[k.isNew?\"attr\":\"animate\"](k.crisp.call({},{x:0,y:0,width:g,height:r},k.strokeWidth())),k.isNew=!1);k[p?\"show\":\"hide\"]();d.styledMode&&\"none\"===c.getStyle(\"display\")&&(g=r=0);this.legendWidth=g;this.legendHeight=r;p&&this.align();this.proximate||this.positionItems();t(this,\"afterRender\")};d.prototype.align=function(d){void 0===d&&(d=this.chart.spacingBox);var a=\nthis.chart,c=this.options,f=d.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<a.titleOffset[0]?f+=a.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<a.titleOffset[2]&&(f-=a.titleOffset[2]);f!==d.y&&(d=v(d,{y:f}));this.group.align(v(c,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?\"top\":c.verticalAlign}),!0,d)};d.prototype.handleOverflow=function(d){var a=this,c=this.chart,f=c.renderer,k=this.options,l=k.y,m=this.padding;l=c.spacingBox.height+(\"top\"===k.verticalAlign?\n-l:l)-m;var p=k.maxHeight,n,g=this.clipRect,e=k.navigation,b=K(e.animation,!0),h=e.arrowSize||12,z=this.nav,x=this.pages,r,t=this.allItems,v=function(b){\"number\"===typeof b?g.attr({height:b}):g&&(a.clipRect=g.destroy(),a.contentGroup.clip());a.contentGroup.div&&(a.contentGroup.div.style.clip=b?\"rect(\"+m+\"px,9999px,\"+(m+b)+\"px,0)\":\"auto\")},q=function(b){a[b]=f.circle(0,0,1.3*h).translate(h/2,h/2).add(z);c.styledMode||a[b].attr(\"fill\",\"rgba(0,0,0,0.0001)\");return a[b]};\"horizontal\"!==k.layout||\"middle\"===\nk.verticalAlign||k.floating||(l/=2);p&&(l=Math.min(l,p));x.length=0;d>l&&!1!==e.enabled?(this.clipHeight=n=Math.max(l-20-this.titleHeight-m,0),this.currentPage=K(this.currentPage,1),this.fullHeight=d,t.forEach(function(b,a){var e=b._legendItemPos[1],d=Math.round(b.legendItem.getBBox().height),h=x.length;if(!h||e-x[h-1]>n&&(r||e)!==x[h-1])x.push(r||e),h++;b.pageIx=h-1;r&&(t[a-1].pageIx=h-1);a===t.length-1&&e+d-x[h-1]>n&&e!==r&&(x.push(e),b.pageIx=h);e!==r&&(r=e)}),g||(g=a.clipRect=f.clipRect(0,m,9999,\n0),a.contentGroup.clip(g)),v(n),z||(this.nav=z=f.g().attr({zIndex:1}).add(this.group),this.up=f.symbol(\"triangle\",0,0,h,h).add(z),q(\"upTracker\").on(\"click\",function(){a.scroll(-1,b)}),this.pager=f.text(\"\",15,10).addClass(\"highcharts-legend-navigation\"),c.styledMode||this.pager.css(e.style),this.pager.add(z),this.down=f.symbol(\"triangle-down\",0,0,h,h).add(z),q(\"downTracker\").on(\"click\",function(){a.scroll(1,b)})),a.scroll(0),d=l):z&&(v(),this.nav=z.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=\n0);return d};d.prototype.scroll=function(d,a){var c=this,f=this.chart,k=this.pages,l=k.length,m=this.currentPage+d;d=this.clipHeight;var p=this.options.navigation,n=this.pager,g=this.padding;m>l&&(m=l);0<m&&(\"undefined\"!==typeof a&&r(a,f),this.nav.attr({translateX:g,translateY:d+this.padding+7+this.titleHeight,visibility:\"visible\"}),[this.up,this.upTracker].forEach(function(a){a.attr({\"class\":1===m?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})}),n.attr({text:m+\"/\"+l}),[this.down,\nthis.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,\"class\":m===l?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})},this),f.styledMode||(this.up.attr({fill:1===m?p.inactiveColor:p.activeColor}),this.upTracker.css({cursor:1===m?\"default\":\"pointer\"}),this.down.attr({fill:m===l?p.inactiveColor:p.activeColor}),this.downTracker.css({cursor:m===l?\"default\":\"pointer\"})),this.scrollOffset=-k[m-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),\nthis.currentPage=m,this.positionCheckboxes(),a=y(K(a,f.renderer.globalAnimation,!0)),I(function(){t(c,\"afterScroll\",{currentPage:m})},a.duration||0))};return d}();(/Trident\\/7\\.0/.test(d.navigator&&d.navigator.userAgent)||p)&&c(l.prototype,\"positionItem\",function(d,c){var a=this,f=function(){c._legendItemPos&&d.call(a,c)};f();a.bubbleLegend||setTimeout(f)});g.Legend=l;return g.Legend});O(q,\"parts/Chart.js\",[q[\"parts/Axis.js\"],q[\"parts/Globals.js\"],q[\"parts/Legend.js\"],q[\"parts/MSPointer.js\"],q[\"parts/Options.js\"],\nq[\"parts/Pointer.js\"],q[\"parts/Time.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H,D,J){var t=c.charts,G=c.doc,L=c.seriesTypes,v=c.win,K=B.defaultOptions,n=J.addEvent,r=J.animate,C=J.animObject,I=J.attr,p=J.createElement,m=J.css,d=J.defined,l=J.discardElement,k=J.erase,f=J.error,a=J.extend,A=J.find,u=J.fireEvent,E=J.getStyle,P=J.isArray,w=J.isFunction,M=J.isNumber,F=J.isObject,Q=J.isString,e=J.merge,b=J.numberFormat,h=J.objectEach,z=J.pick,x=J.pInt,N=J.relativeLength,aa=J.removeEvent,Z=J.setAnimation,\nV=J.splat,Y=J.syncTimeout,ba=J.uniqueKey,U=c.marginNames,X=function(){function B(b,a,e){this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.container=this.colorCounter=this.clipBox=this.chartWidth=\nthis.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.getArgs(b,a,e)}B.prototype.getArgs=function(b,a,e){Q(b)||b.nodeName?(this.renderTo=b,this.init(a,e)):this.init(b,a)};B.prototype.init=function(a,d){var f,l=a.series,k=a.plotOptions||{};u(this,\"init\",{args:arguments},function(){a.series=null;f=e(K,a);var m=f.chart||{};h(f.plotOptions,function(b,a){F(b)&&(b.tooltip=k[a]&&e(k[a].tooltip)||void 0)});f.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;f.series=\na.series=l;this.userOptions=a;var p=m.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=d;this.isResizing=0;this.options=f;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new D(a.time):c.time;this.numberFormatter=m.numberFormatter||b;this.styledMode=m.styledMode;this.hasCartesianSeries=m.showAxes;var g=this;g.index=t.length;t.push(g);c.chartCount++;p&&h(p,function(b,a){w(b)&&n(g,a,b)});g.xAxis=[];g.yAxis=[];g.pointCount=g.colorCounter=\ng.symbolCounter=0;u(g,\"afterInit\");g.firstRender()})};B.prototype.initSeries=function(b){var a=this.options.chart;a=b.type||a.type||a.defaultSeriesType;var e=L[a];e||f(17,!0,this,{missingModuleFor:a});a=new e;a.init(this,b);return a};B.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(b){b.points||b.data||!b.enabledDataSorting||b.setData(b.options.data,!1)})};B.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(b,a){return b.linkedSeries.length||\na.linkedSeries.length?a.linkedSeries.length-b.linkedSeries.length:0})};B.prototype.orderSeries=function(b){var a=this.series;for(b=b||0;b<a.length;b++)a[b]&&(a[b].index=b,a[b].name=a[b].getName())};B.prototype.isInsidePlot=function(b,a,e){var d=e?a:b;b=e?b:a;d={x:d,y:b,isInsidePlot:0<=d&&d<=this.plotWidth&&0<=b&&b<=this.plotHeight};u(this,\"afterIsInsidePlot\",d);return d.isInsidePlot};B.prototype.redraw=function(b){u(this,\"beforeRedraw\");var e=this,d=e.axes,h=e.series,c=e.pointer,f=e.legend,l=e.userOptions.legend,\nk=e.isDirtyLegend,m=e.hasCartesianSeries,p=e.isDirtyBox,g=e.renderer,n=g.isHidden(),x=[];e.setResponsive&&e.setResponsive(!1);Z(e.hasRendered?b:!1,e);n&&e.temporaryDisplay();e.layOutTitles();for(b=h.length;b--;){var z=h[b];if(z.options.stacking){var w=!0;if(z.isDirty){var r=!0;break}}}if(r)for(b=h.length;b--;)z=h[b],z.options.stacking&&(z.isDirty=!0);h.forEach(function(b){b.isDirty&&(\"point\"===b.options.legendType?(b.updateTotals&&b.updateTotals(),k=!0):l&&(l.labelFormatter||l.labelFormat)&&(k=!0));\nb.isDirtyData&&u(b,\"updatedData\")});k&&f&&f.options.enabled&&(f.render(),e.isDirtyLegend=!1);w&&e.getStacks();m&&d.forEach(function(b){e.isResizing&&M(b.min)||(b.updateNames(),b.setScale())});e.getMargins();m&&(d.forEach(function(b){b.isDirty&&(p=!0)}),d.forEach(function(b){var e=b.min+\",\"+b.max;b.extKey!==e&&(b.extKey=e,x.push(function(){u(b,\"afterSetExtremes\",a(b.eventArgs,b.getExtremes()));delete b.eventArgs}));(p||w)&&b.redraw()}));p&&e.drawChartBox();u(e,\"predraw\");h.forEach(function(b){(p||\nb.isDirty)&&b.visible&&b.redraw();b.isDirtyData=!1});c&&c.reset(!0);g.draw();u(e,\"redraw\");u(e,\"render\");n&&e.temporaryDisplay(!0);x.forEach(function(b){b.call()})};B.prototype.get=function(b){function a(a){return a.id===b||a.options&&a.options.id===b}var e=this.series,d;var h=A(this.axes,a)||A(this.series,a);for(d=0;!h&&d<e.length;d++)h=A(e[d].points||[],a);return h};B.prototype.getAxes=function(){var b=this,a=this.options,e=a.xAxis=V(a.xAxis||{});a=a.yAxis=V(a.yAxis||{});u(this,\"getAxes\");e.forEach(function(b,\na){b.index=a;b.isX=!0});a.forEach(function(b,a){b.index=a});e.concat(a).forEach(function(a){new g(b,a)});u(this,\"afterGetAxes\")};B.prototype.getSelectedPoints=function(){var b=[];this.series.forEach(function(a){b=b.concat(a.getPointsCollection().filter(function(b){return z(b.selectedStaging,b.selected)}))});return b};B.prototype.getSelectedSeries=function(){return this.series.filter(function(b){return b.selected})};B.prototype.setTitle=function(b,a,e){this.applyDescription(\"title\",b);this.applyDescription(\"subtitle\",\na);this.applyDescription(\"caption\",void 0);this.layOutTitles(e)};B.prototype.applyDescription=function(b,a){var d=this,h=\"title\"===b?{color:\"#333333\",fontSize:this.options.isStock?\"16px\":\"18px\"}:{color:\"#666666\"};h=this.options[b]=e(!this.styledMode&&{style:h},this.options[b],a);var c=this[b];c&&a&&(this[b]=c=c.destroy());h&&!c&&(c=this.renderer.text(h.text,0,0,h.useHTML).attr({align:h.align,\"class\":\"highcharts-\"+b,zIndex:h.zIndex||4}).add(),c.update=function(a){d[{title:\"setTitle\",subtitle:\"setSubtitle\",\ncaption:\"setCaption\"}[b]](a)},this.styledMode||c.css(h.style),this[b]=c)};B.prototype.layOutTitles=function(b){var e=[0,0,0],d=this.renderer,h=this.spacingBox;[\"title\",\"subtitle\",\"caption\"].forEach(function(b){var c=this[b],f=this.options[b],l=f.verticalAlign||\"top\";b=\"title\"===b?-3:\"top\"===l?e[0]+2:0;if(c){if(!this.styledMode)var k=f.style.fontSize;k=d.fontMetrics(k,c).b;c.css({width:(f.width||h.width+(f.widthAdjust||0))+\"px\"});var m=Math.round(c.getBBox(f.useHTML).height);c.align(a({y:\"bottom\"===\nl?k:b+k,height:m},f),!1,\"spacingBox\");f.floating||(\"top\"===l?e[0]=Math.ceil(e[0]+m):\"bottom\"===l&&(e[2]=Math.ceil(e[2]+m)))}},this);e[0]&&\"top\"===(this.options.title.verticalAlign||\"top\")&&(e[0]+=this.options.title.margin);e[2]&&\"bottom\"===this.options.caption.verticalAlign&&(e[2]+=this.options.caption.margin);var c=!this.titleOffset||this.titleOffset.join(\",\")!==e.join(\",\");this.titleOffset=e;u(this,\"afterLayOutTitles\");!this.isDirtyBox&&c&&(this.isDirtyBox=this.isDirtyLegend=c,this.hasRendered&&\nz(b,!0)&&this.isDirtyBox&&this.redraw())};B.prototype.getChartSize=function(){var b=this.options.chart,a=b.width;b=b.height;var e=this.renderTo;d(a)||(this.containerWidth=E(e,\"width\"));d(b)||(this.containerHeight=E(e,\"height\"));this.chartWidth=Math.max(0,a||this.containerWidth||600);this.chartHeight=Math.max(0,N(b,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};B.prototype.temporaryDisplay=function(b){var a=this.renderTo;if(b)for(;a&&a.style;)a.hcOrigStyle&&(m(a,a.hcOrigStyle),\ndelete a.hcOrigStyle),a.hcOrigDetached&&(G.body.removeChild(a),a.hcOrigDetached=!1),a=a.parentNode;else for(;a&&a.style;){G.body.contains(a)||a.parentNode||(a.hcOrigDetached=!0,G.body.appendChild(a));if(\"none\"===E(a,\"display\",!1)||a.hcOricDetached)a.hcOrigStyle={display:a.style.display,height:a.style.height,overflow:a.style.overflow},b={display:\"block\",overflow:\"hidden\"},a!==this.renderTo&&(b.height=0),m(a,b),a.offsetWidth||a.style.setProperty(\"display\",\"block\",\"important\");a=a.parentNode;if(a===\nG.body)break}};B.prototype.setClassName=function(b){this.container.className=\"highcharts-container \"+(b||\"\")};B.prototype.getContainer=function(){var b=this.options,e=b.chart;var d=this.renderTo;var h=ba(),l,k;d||(this.renderTo=d=e.renderTo);Q(d)&&(this.renderTo=d=G.getElementById(d));d||f(13,!0,this);var g=x(I(d,\"data-highcharts-chart\"));M(g)&&t[g]&&t[g].hasRendered&&t[g].destroy();I(d,\"data-highcharts-chart\",this.index);d.innerHTML=\"\";e.skipClone||d.offsetWidth||this.temporaryDisplay();this.getChartSize();\ng=this.chartWidth;var n=this.chartHeight;m(d,{overflow:\"hidden\"});this.styledMode||(l=a({position:\"relative\",overflow:\"hidden\",width:g+\"px\",height:n+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\",userSelect:\"none\"},e.style));this.container=d=p(\"div\",{id:h},l,d);this._cursor=d.style.cursor;this.renderer=new (c[e.renderer]||c.Renderer)(d,g,n,null,e.forExport,b.exporting&&b.exporting.allowHTML,this.styledMode);Z(void 0,this);this.setClassName(e.className);\nif(this.styledMode)for(k in b.defs)this.renderer.definition(b.defs[k]);else this.renderer.setStyle(e.style);this.renderer.chartIndex=this.index;u(this,\"afterGetContainer\")};B.prototype.getMargins=function(b){var a=this.spacing,e=this.margin,h=this.titleOffset;this.resetMargins();h[0]&&!d(e[0])&&(this.plotTop=Math.max(this.plotTop,h[0]+a[0]));h[2]&&!d(e[2])&&(this.marginBottom=Math.max(this.marginBottom,h[2]+a[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(e,a);u(this,\"getMargins\");\nb||this.getAxisMargins()};B.prototype.getAxisMargins=function(){var b=this,a=b.axisOffset=[0,0,0,0],e=b.colorAxis,h=b.margin,c=function(b){b.forEach(function(b){b.visible&&b.getOffset()})};b.hasCartesianSeries?c(b.axes):e&&e.length&&c(e);U.forEach(function(e,c){d(h[c])||(b[e]+=a[c])});b.setChartSize()};B.prototype.reflow=function(b){var a=this,e=a.options.chart,h=a.renderTo,c=d(e.width)&&d(e.height),f=e.width||E(h,\"width\");e=e.height||E(h,\"height\");h=b?b.target:v;if(!c&&!a.isPrinting&&f&&e&&(h===\nv||h===G)){if(f!==a.containerWidth||e!==a.containerHeight)J.clearTimeout(a.reflowTimeout),a.reflowTimeout=Y(function(){a.container&&a.setSize(void 0,void 0,!1)},b?100:0);a.containerWidth=f;a.containerHeight=e}};B.prototype.setReflow=function(b){var a=this;!1===b||this.unbindReflow?!1===b&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=n(v,\"resize\",function(b){a.options&&a.reflow(b)}),n(this,\"destroy\",this.unbindReflow))};B.prototype.setSize=function(b,a,e){var d=this,\nh=d.renderer;d.isResizing+=1;Z(e,d);e=h.globalAnimation;d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;\"undefined\"!==typeof b&&(d.options.chart.width=b);\"undefined\"!==typeof a&&(d.options.chart.height=a);d.getChartSize();d.styledMode||(e?r:m)(d.container,{width:d.chartWidth+\"px\",height:d.chartHeight+\"px\"},e);d.setChartSize(!0);h.setSize(d.chartWidth,d.chartHeight,e);d.axes.forEach(function(b){b.isDirty=!0;b.setScale()});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();\nd.redraw(e);d.oldChartHeight=null;u(d,\"resize\");Y(function(){d&&u(d,\"endResize\",null,function(){--d.isResizing})},C(e).duration||0)};B.prototype.setChartSize=function(b){var a=this.inverted,e=this.renderer,d=this.chartWidth,h=this.chartHeight,c=this.options.chart,f=this.spacing,l=this.clipOffset,k,m,p,g;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=p=Math.max(0,Math.round(d-k-this.marginRight));this.plotHeight=g=Math.max(0,Math.round(h-m-this.marginBottom));\nthis.plotSizeX=a?g:p;this.plotSizeY=a?p:g;this.plotBorderWidth=c.plotBorderWidth||0;this.spacingBox=e.spacingBox={x:f[3],y:f[0],width:d-f[3]-f[1],height:h-f[0]-f[2]};this.plotBox=e.plotBox={x:k,y:m,width:p,height:g};d=2*Math.floor(this.plotBorderWidth/2);a=Math.ceil(Math.max(d,l[3])/2);e=Math.ceil(Math.max(d,l[0])/2);this.clipBox={x:a,y:e,width:Math.floor(this.plotSizeX-Math.max(d,l[1])/2-a),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(d,l[2])/2-e))};b||this.axes.forEach(function(b){b.setAxisSize();\nb.setAxisTranslation()});u(this,\"afterSetChartSize\",{skipAxes:b})};B.prototype.resetMargins=function(){u(this,\"resetMargins\");var b=this,a=b.options.chart;[\"margin\",\"spacing\"].forEach(function(e){var d=a[e],h=F(d)?d:[d,d,d,d];[\"Top\",\"Right\",\"Bottom\",\"Left\"].forEach(function(d,c){b[e][c]=z(a[e+d],h[c])})});U.forEach(function(a,e){b[a]=z(b.margin[e],b.spacing[e])});b.axisOffset=[0,0,0,0];b.clipOffset=[0,0,0,0]};B.prototype.drawChartBox=function(){var b=this.options.chart,a=this.renderer,e=this.chartWidth,\nd=this.chartHeight,h=this.chartBackground,c=this.plotBackground,f=this.plotBorder,l=this.styledMode,k=this.plotBGImage,m=b.backgroundColor,p=b.plotBackgroundColor,g=b.plotBackgroundImage,n,x=this.plotLeft,z=this.plotTop,w=this.plotWidth,r=this.plotHeight,t=this.plotBox,A=this.clipRect,v=this.clipBox,q=\"animate\";h||(this.chartBackground=h=a.rect().addClass(\"highcharts-background\").add(),q=\"attr\");if(l)var C=n=h.strokeWidth();else{C=b.borderWidth||0;n=C+(b.shadow?8:0);m={fill:m||\"none\"};if(C||h[\"stroke-width\"])m.stroke=\nb.borderColor,m[\"stroke-width\"]=C;h.attr(m).shadow(b.shadow)}h[q]({x:n/2,y:n/2,width:e-n-C%2,height:d-n-C%2,r:b.borderRadius});q=\"animate\";c||(q=\"attr\",this.plotBackground=c=a.rect().addClass(\"highcharts-plot-background\").add());c[q](t);l||(c.attr({fill:p||\"none\"}).shadow(b.plotShadow),g&&(k?(g!==k.attr(\"href\")&&k.attr(\"href\",g),k.animate(t)):this.plotBGImage=a.image(g,x,z,w,r).add()));A?A.animate({width:v.width,height:v.height}):this.clipRect=a.clipRect(v);q=\"animate\";f||(q=\"attr\",this.plotBorder=\nf=a.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());l||f.attr({stroke:b.plotBorderColor,\"stroke-width\":b.plotBorderWidth||0,fill:\"none\"});f[q](f.crisp({x:x,y:z,width:w,height:r},-f.strokeWidth()));this.isDirtyBox=!1;u(this,\"afterDrawChartBox\")};B.prototype.propFromSeries=function(){var b=this,a=b.options.chart,e,d=b.options.series,h,c;[\"inverted\",\"angular\",\"polar\"].forEach(function(f){e=L[a.type||a.defaultSeriesType];c=a[f]||e&&e.prototype[f];for(h=d&&d.length;!c&&h--;)(e=L[d[h].type])&&\ne.prototype[f]&&(c=!0);b[f]=c})};B.prototype.linkSeries=function(){var b=this,a=b.series;a.forEach(function(b){b.linkedSeries.length=0});a.forEach(function(a){var e=a.options.linkedTo;Q(e)&&(e=\":previous\"===e?b.series[a.index-1]:b.get(e))&&e.linkedParent!==a&&(e.linkedSeries.push(a),a.linkedParent=e,e.enabledDataSorting&&a.setDataSortingOptions(),a.visible=z(a.options.visible,e.options.visible,a.visible))});u(this,\"afterLinkSeries\")};B.prototype.renderSeries=function(){this.series.forEach(function(b){b.translate();\nb.render()})};B.prototype.renderLabels=function(){var b=this,e=b.options.labels;e.items&&e.items.forEach(function(d){var h=a(e.style,d.style),c=x(h.left)+b.plotLeft,f=x(h.top)+b.plotTop+12;delete h.left;delete h.top;b.renderer.text(d.html,c,f).attr({zIndex:2}).css(h).add()})};B.prototype.render=function(){var b=this.axes,a=this.colorAxis,e=this.renderer,d=this.options,h=0,c=function(b){b.forEach(function(b){b.visible&&b.render()})};this.setTitle();this.legend=new q(this,d.legend);this.getStacks&&\nthis.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;b.some(function(b){if(b.horiz&&b.visible&&b.options.labels.enabled&&b.series.length)return h=21,!0});var f=this.plotHeight=Math.max(this.plotHeight-h,0);b.forEach(function(b){b.setScale()});this.getAxisMargins();var l=1.1<d/this.plotWidth;var k=1.05<f/this.plotHeight;if(l||k)b.forEach(function(b){(b.horiz&&l||!b.horiz&&k)&&b.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?c(b):a&&a.length&&\nc(a);this.seriesGroup||(this.seriesGroup=e.g(\"series-group\").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.updateContainerScaling();this.hasRendered=!0};B.prototype.addCredits=function(b){var a=this,d=e(!0,this.options.credits,b);d.enabled&&!this.credits&&(this.credits=this.renderer.text(d.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){d.href&&(v.location.href=d.href)}).attr({align:d.position.align,\nzIndex:8}),a.styledMode||this.credits.css(d.style),this.credits.add().align(d.position),this.credits.update=function(b){a.credits=a.credits.destroy();a.addCredits(b)})};B.prototype.updateContainerScaling=function(){var b=this.container;if(2<b.offsetWidth&&2<b.offsetHeight&&b.getBoundingClientRect){var a=b.getBoundingClientRect(),e=a.width/b.offsetWidth;b=a.height/b.offsetHeight;1!==e||1!==b?this.containerScaling={scaleX:e,scaleY:b}:delete this.containerScaling}};B.prototype.destroy=function(){var b=\nthis,a=b.axes,e=b.series,d=b.container,f,m=d&&d.parentNode;u(b,\"destroy\");b.renderer.forExport?k(t,b):t[b.index]=void 0;c.chartCount--;b.renderTo.removeAttribute(\"data-highcharts-chart\");aa(b);for(f=a.length;f--;)a[f]=a[f].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(f=e.length;f--;)e[f]=e[f].destroy();\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \").forEach(function(a){var e=\nb[a];e&&e.destroy&&(b[a]=e.destroy())});d&&(d.innerHTML=\"\",aa(d),m&&l(d));h(b,function(a,e){delete b[e]})};B.prototype.firstRender=function(){var b=this,a=b.options;if(!b.isReadyToRender||b.isReadyToRender()){b.getContainer();b.resetMargins();b.setChartSize();b.propFromSeries();b.getAxes();(P(a.series)?a.series:[]).forEach(function(a){b.initSeries(a)});b.linkSeries();b.setSeriesData();u(b,\"beforeRender\");H&&(b.pointer=c.hasTouch||!v.PointerEvent&&!v.MSPointerEvent?new H(b,a):new y(b,a));b.render();\nif(!b.renderer.imgCount&&!b.hasLoaded)b.onload();b.temporaryDisplay(!0)}};B.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(b){b&&\"undefined\"!==typeof this.index&&b.apply(this,[this])},this);u(this,\"load\");u(this,\"render\");d(this.index)&&this.setReflow(this.options.chart.reflow);this.hasLoaded=!0};return B}();X.prototype.callbacks=[];c.chart=function(b,a,e){return new X(b,a,e)};return c.Chart=X});O(q,\"parts/ScrollablePlotArea.js\",[q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],\nq[\"parts/Utilities.js\"]],function(g,c,q){var y=q.addEvent,B=q.createElement,H=q.pick,D=q.stop;\"\";y(g,\"afterSetChartSize\",function(g){var t=this.options.chart.scrollablePlotArea,q=t&&t.minWidth;t=t&&t.minHeight;if(!this.renderer.forExport){if(q){if(this.scrollablePixelsX=q=Math.max(0,q-this.chartWidth)){this.plotWidth+=q;this.inverted?(this.clipBox.height+=q,this.plotBox.height+=q):(this.clipBox.width+=q,this.plotBox.width+=q);var y={1:{name:\"right\",value:q}}}}else t&&(this.scrollablePixelsY=q=Math.max(0,\nt-this.chartHeight))&&(this.plotHeight+=q,this.inverted?(this.clipBox.width+=q,this.plotBox.width+=q):(this.clipBox.height+=q,this.plotBox.height+=q),y={2:{name:\"bottom\",value:q}});y&&!g.skipAxes&&this.axes.forEach(function(g){y[g.side]?g.getPlotLinePath=function(){var t=y[g.side].name,n=this[t];this[t]=n-y[g.side].value;var r=c.Axis.prototype.getPlotLinePath.apply(this,arguments);this[t]=n;return r}:(g.setAxisSize(),g.setAxisTranslation())})}});y(g,\"render\",function(){this.scrollablePixelsX||this.scrollablePixelsY?\n(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});g.prototype.setUpScrolling=function(){var c=this,g={WebkitOverflowScrolling:\"touch\",overflowX:\"hidden\",overflowY:\"hidden\"};this.scrollablePixelsX&&(g.overflowX=\"auto\");this.scrollablePixelsY&&(g.overflowY=\"auto\");this.scrollingContainer=B(\"div\",{className:\"highcharts-scrolling\"},g,this.renderTo);y(this.scrollingContainer,\"scroll\",function(){c.pointer&&delete c.pointer.chartPosition});this.innerContainer=\nB(\"div\",{className:\"highcharts-inner-container\"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};g.prototype.moveFixedElements=function(){var c=this.container,g=this.fixedRenderer,q=\".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-scrollbar .highcharts-subtitle .highcharts-title\".split(\" \"),\ny;this.scrollablePixelsX&&!this.inverted?y=\".highcharts-yaxis\":this.scrollablePixelsX&&this.inverted?y=\".highcharts-xaxis\":this.scrollablePixelsY&&!this.inverted?y=\".highcharts-xaxis\":this.scrollablePixelsY&&this.inverted&&(y=\".highcharts-yaxis\");q.push(y,y+\"-labels\");q.forEach(function(t){[].forEach.call(c.querySelectorAll(t),function(c){(c.namespaceURI===g.SVG_NS?g.box:g.box.parentNode).appendChild(c);c.style.pointerEvents=\"auto\"})})};g.prototype.applyFixed=function(){var g,t,q=!this.fixedDiv,L=\nthis.options.chart.scrollablePlotArea;q?(this.fixedDiv=B(\"div\",{className:\"highcharts-fixed\"},{position:\"absolute\",overflow:\"hidden\",pointerEvents:\"none\",zIndex:2},null,!0),this.renderTo.insertBefore(this.fixedDiv,this.renderTo.firstChild),this.renderTo.style.overflow=\"visible\",this.fixedRenderer=t=new c.Renderer(this.fixedDiv,this.chartWidth,this.chartHeight,null===(g=this.options.chart)||void 0===g?void 0:g.style),this.scrollableMask=t.path().attr({fill:this.options.chart.backgroundColor||\"#fff\",\n\"fill-opacity\":H(L.opacity,.85),zIndex:-1}).addClass(\"highcharts-scrollable-mask\").add(),this.moveFixedElements(),y(this,\"afterShowResetZoom\",this.moveFixedElements),y(this,\"afterLayOutTitles\",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);g=this.chartWidth+(this.scrollablePixelsX||0);t=this.chartHeight+(this.scrollablePixelsY||0);D(this.container);this.container.style.width=g+\"px\";this.container.style.height=t+\"px\";this.renderer.boxWrapper.attr({width:g,height:t,\nviewBox:[0,0,g,t].join(\" \")});this.chartBackground.attr({width:g,height:t});this.scrollingContainer.style.height=this.chartHeight+\"px\";q&&(L.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*L.scrollPositionX),L.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*L.scrollPositionY));t=this.axisOffset;q=this.plotTop-t[0]-1;L=this.plotLeft-t[3]-1;g=this.plotTop+this.plotHeight+t[2]+1;t=this.plotLeft+this.plotWidth+t[1]+1;var v=this.plotLeft+this.plotWidth-\n(this.scrollablePixelsX||0),K=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);q=this.scrollablePixelsX?[[\"M\",0,q],[\"L\",this.plotLeft-1,q],[\"L\",this.plotLeft-1,g],[\"L\",0,g],[\"Z\"],[\"M\",v,q],[\"L\",this.chartWidth,q],[\"L\",this.chartWidth,g],[\"L\",v,g],[\"Z\"]]:this.scrollablePixelsY?[[\"M\",L,0],[\"L\",L,this.plotTop-1],[\"L\",t,this.plotTop-1],[\"L\",t,0],[\"Z\"],[\"M\",L,K],[\"L\",L,this.chartHeight],[\"L\",t,this.chartHeight],[\"L\",t,K],[\"Z\"]]:[[\"M\",0,0]];\"adjustHeight\"!==this.redrawTrigger&&this.scrollableMask.attr({d:q})}});\nO(q,\"parts/StackingAxis.js\",[q[\"parts/Utilities.js\"]],function(g){var c=g.addEvent,q=g.destroyObjectProperties,y=g.fireEvent,B=g.objectEach,H=g.pick,D=function(){function c(c){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=c}c.prototype.buildStacks=function(){var c=this.axis,g=c.series,q=H(c.options.reversedStacks,!0),v=g.length,D;if(!c.isXAxis){this.usePercentage=!1;for(D=v;D--;){var n=g[q?D:v-D-1];n.setStackedPoints();n.setGroupedPoints()}for(D=0;D<v;D++)g[D].modifyStacks();y(c,\n\"afterBuildStacks\")}};c.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var c=this.stacks=this.oldStacks;B(c,function(c){B(c,function(c){c.cumulative=c.total})})}};c.prototype.resetStacks=function(){var c=this,g=c.stacks;c.axis.isXAxis||B(g,function(g){B(g,function(q,t){q.touched<c.stacksTouched?(q.destroy(),delete g[t]):(q.total=null,q.cumulative=null)})})};c.prototype.renderStackTotals=function(){var c=this.axis.chart,g=c.renderer,q=this.stacks,v=this.stackTotalGroup=this.stackTotalGroup||\ng.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add();v.translate(c.plotLeft,c.plotTop);B(q,function(c){B(c,function(c){c.render(v)})})};return c}();return function(){function g(){}g.compose=function(q){c(q,\"init\",g.onInit);c(q,\"destroy\",g.onDestroy)};g.onDestroy=function(){var c=this.stacking;if(c){var g=c.stacks;B(g,function(c,t){q(c);g[t]=null});c&&c.stackTotalGroup&&c.stackTotalGroup.destroy()}};g.onInit=function(){this.stacking||(this.stacking=new D(this))};return g}()});O(q,\"mixins/legend-symbol.js\",\n[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.merge,y=c.pick;g.LegendSymbolMixin={drawRectangle:function(c,g){var q=c.symbolHeight,B=c.options.squareSymbol;g.legendSymbol=this.chart.renderer.rect(B?(c.symbolWidth-q)/2:0,c.baseline-q+1,B?q:c.symbolWidth,q,y(c.options.symbolRadius,q/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(g.legendGroup)},drawLineMarker:function(c){var g=this.options,D=g.marker,B=c.symbolWidth,t=c.symbolHeight,G=t/2,L=this.chart.renderer,v=this.legendGroup;\nc=c.baseline-Math.round(.3*c.fontMetrics.b);var K={};this.chart.styledMode||(K={\"stroke-width\":g.lineWidth||0},g.dashStyle&&(K.dashstyle=g.dashStyle));this.legendLine=L.path([\"M\",0,c,\"L\",B,c]).addClass(\"highcharts-graph\").attr(K).add(v);D&&!1!==D.enabled&&B&&(g=Math.min(y(D.radius,G),G),0===this.symbol.indexOf(\"url\")&&(D=q(D,{width:t,height:t}),g=0),this.legendSymbol=D=L.symbol(this.symbol,B/2-g,c-g,2*g,2*g,D).addClass(\"highcharts-point\").add(v),D.isMarker=!0)}};return g.LegendSymbolMixin});O(q,\"parts/Point.js\",\n[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.animObject,y=c.defined,B=c.erase,H=c.extend,D=c.fireEvent,J=c.format,t=c.getNestedProperty,G=c.isArray,L=c.isNumber,v=c.isObject,K=c.syncTimeout,n=c.pick,r=c.removeEvent,C=c.uniqueKey;\"\";c=function(){function c(){this.colorIndex=this.category=void 0;this.formatPrefix=\"point\";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}c.prototype.animateBeforeDestroy=\nfunction(){var c=this,m={x:c.startXPos,opacity:0},d,l=c.getGraphicalProps();l.singular.forEach(function(l){d=\"dataLabel\"===l;c[l]=c[l].animate(d?{x:c[l].startXPos,y:c[l].startYPos,opacity:0}:m)});l.plural.forEach(function(d){c[d].forEach(function(d){d.element&&d.animate(H({x:c.startXPos},d.startYPos?{x:d.startXPos,y:d.startYPos}:{}))})})};c.prototype.applyOptions=function(p,m){var d=this.series,l=d.options.pointValKey||d.pointValKey;p=c.prototype.optionsToObject.call(this,p);H(this,p);this.options=\nthis.options?H(this.options,p):p;p.group&&delete this.group;p.dataLabels&&delete this.dataLabels;l&&(this.y=c.prototype.getNestedProperty.call(this,l));this.formatPrefix=(this.isNull=n(this.isValid&&!this.isValid(),null===this.x||!L(this.y)))?\"null\":\"point\";this.selected&&(this.state=\"select\");\"name\"in this&&\"undefined\"===typeof m&&d.xAxis&&d.xAxis.hasNames&&(this.x=d.xAxis.nameToX(this));\"undefined\"===typeof this.x&&d&&(this.x=\"undefined\"===typeof m?d.autoIncrement(this):m);return this};c.prototype.destroy=\nfunction(){function c(){if(m.graphic||m.dataLabel||m.dataLabels)r(m),m.destroyElements();for(a in m)m[a]=null}var m=this,d=m.series,l=d.chart;d=d.options.dataSorting;var k=l.hoverPoints,f=q(m.series.chart.renderer.globalAnimation),a;m.legendItem&&l.legend.destroyItem(m);k&&(m.setState(),B(k,m),k.length||(l.hoverPoints=null));if(m===l.hoverPoint)m.onMouseOut();d&&d.enabled?(this.animateBeforeDestroy(),K(c,f.duration)):c();l.pointCount--};c.prototype.destroyElements=function(c){var m=this;c=m.getGraphicalProps(c);\nc.singular.forEach(function(d){m[d]=m[d].destroy()});c.plural.forEach(function(d){m[d].forEach(function(d){d.element&&d.destroy()});delete m[d]})};c.prototype.firePointEvent=function(c,m,d){var l=this,k=this.series.options;(k.point.events[c]||l.options&&l.options.events&&l.options.events[c])&&l.importEvents();\"click\"===c&&k.allowPointSelect&&(d=function(d){l.select&&l.select(null,d.ctrlKey||d.metaKey||d.shiftKey)});D(l,c,m,d)};c.prototype.getClassName=function(){return\"highcharts-point\"+(this.selected?\n\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(\"undefined\"!==typeof this.colorIndex?\" highcharts-color-\"+this.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")};c.prototype.getGraphicalProps=function(c){var m=this,d=[],l,k={singular:[],plural:[]};c=c||{graphic:1,dataLabel:1};c.graphic&&d.push(\"graphic\",\"shadowGroup\");\nc.dataLabel&&d.push(\"dataLabel\",\"dataLabelUpper\",\"connector\");for(l=d.length;l--;){var f=d[l];m[f]&&k.singular.push(f)}[\"dataLabel\",\"connector\"].forEach(function(a){var d=a+\"s\";c[a]&&m[d]&&k.plural.push(d)});return k};c.prototype.getLabelConfig=function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};c.prototype.getNestedProperty=function(c){if(c)return 0===\nc.indexOf(\"custom.\")?t(c,this.options):this[c]};c.prototype.getZone=function(){var c=this.series,m=c.zones;c=c.zoneAxis||\"y\";var d=0,l;for(l=m[d];this[c]>=l.value;)l=m[++d];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=l&&l.color&&!this.options.color?l.color:this.nonZonedColor;return l};c.prototype.hasNewShapeType=function(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};c.prototype.init=function(c,m,d){this.series=c;this.applyOptions(m,\nd);this.id=y(this.id)?this.id:C();this.resolveColor();c.chart.pointCount++;D(this,\"afterInit\");return this};c.prototype.optionsToObject=function(g){var m={},d=this.series,l=d.options.keys,k=l||d.pointArrayMap||[\"y\"],f=k.length,a=0,p=0;if(L(g)||null===g)m[k[0]]=g;else if(G(g))for(!l&&g.length>f&&(d=typeof g[0],\"string\"===d?m.name=g[0]:\"number\"===d&&(m.x=g[0]),a++);p<f;)l&&\"undefined\"===typeof g[a]||(0<k[p].indexOf(\".\")?c.prototype.setNestedProperty(m,g[a],k[p]):m[k[p]]=g[a]),a++,p++;else\"object\"===\ntypeof g&&(m=g,g.dataLabels&&(d._hasPointLabels=!0),g.marker&&(d._hasPointMarkers=!0));return m};c.prototype.resolveColor=function(){var c=this.series;var m=c.chart.options.chart.colorCount;var d=c.chart.styledMode;delete this.nonZonedColor;d||this.options.color||(this.color=c.color);c.options.colorByPoint?(d||(m=c.options.colors||c.chart.options.colors,this.color=this.color||m[c.colorCounter],m=m.length),d=c.colorCounter,c.colorCounter++,c.colorCounter===m&&(c.colorCounter=0)):d=c.colorIndex;this.colorIndex=\nn(this.colorIndex,d)};c.prototype.setNestedProperty=function(c,m,d){d.split(\".\").reduce(function(d,c,f,a){d[c]=a.length-1===f?m:v(d[c],!0)?d[c]:{};return d[c]},c);return c};c.prototype.tooltipFormatter=function(c){var m=this.series,d=m.tooltipOptions,l=n(d.valueDecimals,\"\"),k=d.valuePrefix||\"\",f=d.valueSuffix||\"\";m.chart.styledMode&&(c=m.chart.tooltip.styledModeFormat(c));(m.pointArrayMap||[\"y\"]).forEach(function(a){a=\"{point.\"+a;if(k||f)c=c.replace(RegExp(a+\"}\",\"g\"),k+a+\"}\"+f);c=c.replace(RegExp(a+\n\"}\",\"g\"),a+\":,.\"+l+\"f}\")});return J(c,{point:this,series:this.series},m.chart)};return c}();return g.Point=c});O(q,\"parts/Series.js\",[q[\"parts/Globals.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/SVGElement.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H){var D=q.defaultOptions,J=H.addEvent,t=H.animObject,G=H.arrayMax,L=H.arrayMin,v=H.clamp,K=H.correctFloat,n=H.defined,r=H.erase,C=H.error,I=H.extend,p=H.find,m=H.fireEvent,d=H.getNestedProperty,l=H.isArray,\nk=H.isFunction,f=H.isNumber,a=H.isString,A=H.merge,u=H.objectEach,E=H.pick,P=H.removeEvent;q=H.seriesType;var w=H.splat,M=H.syncTimeout;\"\";var F=g.seriesTypes,Q=g.win;g.Series=q(\"line\",null,{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:\"#ffffff\",lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:\"#cccccc\",lineColor:\"#000000\",\nlineWidth:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){var a=this.series.chart.numberFormatter;return\"number\"!==typeof this.y?\"\":a(this.y,-1)},padding:5,style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"contrast\",textOutline:\"1px contrast\"},verticalAlign:\"bottom\",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},\ninactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"},{axisTypes:[\"xAxis\",\"yAxis\"],coll:\"series\",colorCounter:0,cropShoulder:1,directTouch:!1,eventsToUnbind:[],isCartesian:!0,parallelArrays:[\"x\",\"y\"],pointClass:y,requireSorting:!0,sorted:!0,init:function(a,b){m(this,\"init\",{options:b});var e=this,d=a.series,c;this.eventOptions=this.eventOptions||{};e.chart=a;e.options=b=e.setOptions(b);e.linkedSeries=[];e.bindAxes();I(e,{name:b.name,state:\"\",visible:!1!==\nb.visible,selected:!0===b.selected});var f=b.events;u(f,function(b,a){k(b)&&e.eventOptions[a]!==b&&(k(e.eventOptions[a])&&P(e,a,e.eventOptions[a]),e.eventOptions[a]=b,J(e,a,b))});if(f&&f.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;e.getColor();e.getSymbol();e.parallelArrays.forEach(function(b){e[b+\"Data\"]||(e[b+\"Data\"]=[])});e.isCartesian&&(a.hasCartesianSeries=!0);d.length&&(c=d[d.length-1]);e._i=E(c&&c._i,-1)+1;e.opacity=e.options.opacity;a.orderSeries(this.insert(d));\nb.dataSorting&&b.dataSorting.enabled?e.setDataSortingOptions():e.points||e.data||e.setData(b.data,!1);m(this,\"afterInit\")},is:function(a){return F[a]&&this instanceof F[a]},insert:function(a){var b=this.options.index,e;if(f(b)){for(e=a.length;e--;)if(b>=E(a[e].options.index,a[e]._i)){a.splice(e+1,0,this);break}-1===e&&a.unshift(this);e+=1}else a.push(this);return E(e,a.length-1)},bindAxes:function(){var a=this,b=a.options,d=a.chart,c;m(this,\"bindAxes\",null,function(){(a.axisTypes||[]).forEach(function(e){d[e].forEach(function(d){c=\nd.options;if(b[e]===c.index||\"undefined\"!==typeof b[e]&&b[e]===c.id||\"undefined\"===typeof b[e]&&0===c.index)a.insert(d.series),a[e]=d,d.isDirty=!0});a[e]||a.optionalAxis===e||C(18,!0,d)})});m(this,\"afterBindAxes\")},updateParallelArrays:function(a,b){var e=a.series,d=arguments,c=f(b)?function(d){var c=\"y\"===d&&e.toYData?e.toYData(a):a[d];e[d+\"Data\"][b]=c}:function(a){Array.prototype[b].apply(e[a+\"Data\"],Array.prototype.slice.call(d,2))};e.parallelArrays.forEach(c)},hasData:function(){return this.visible&&\n\"undefined\"!==typeof this.dataMax&&\"undefined\"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length},autoIncrement:function(){var a=this.options,b=this.xIncrement,d,c=a.pointIntervalUnit,f=this.chart.time;b=E(b,a.pointStart,0);this.pointInterval=d=E(this.pointInterval,a.pointInterval,1);c&&(a=new f.Date(b),\"day\"===c?f.set(\"Date\",a,f.get(\"Date\",a)+d):\"month\"===c?f.set(\"Month\",a,f.get(\"Month\",a)+d):\"year\"===c&&f.set(\"FullYear\",a,f.get(\"FullYear\",a)+d),d=a.getTime()-b);this.xIncrement=\nb+d;return b},setDataSortingOptions:function(){var a=this.options;I(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});n(a.pointRange)||(a.pointRange=1)},setOptions:function(a){var b=this.chart,e=b.options,d=e.plotOptions,c=b.userOptions||{};a=A(a);b=b.styledMode;var f={plotOptions:d,userOptions:a};m(this,\"setOptions\",f);var l=f.plotOptions[this.type],k=c.plotOptions||{};this.userOptions=f.userOptions;c=A(l,d.series,c.plotOptions&&c.plotOptions[this.type],a);this.tooltipOptions=\nA(D.tooltip,D.plotOptions.series&&D.plotOptions.series.tooltip,D.plotOptions[this.type].tooltip,e.tooltip.userOptions,d.series&&d.series.tooltip,d[this.type].tooltip,a.tooltip);this.stickyTracking=E(a.stickyTracking,k[this.type]&&k[this.type].stickyTracking,k.series&&k.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:c.stickyTracking);null===l.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;e=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||\n(d={value:c[this.zoneAxis+\"Threshold\"]||c.threshold||0,className:\"highcharts-negative\"},b||(d.color=c.negativeColor,d.fillColor=c.negativeFillColor),e.push(d));e.length&&n(e[e.length-1].value)&&e.push(b?{}:{color:this.color,fillColor:this.fillColor});m(this,\"afterSetOptions\",{options:c});return c},getName:function(){return E(this.options.name,\"Series \"+(this.index+1))},getCyclic:function(a,b,d){var e=this.chart,c=this.userOptions,h=a+\"Index\",f=a+\"Counter\",l=d?d.length:E(e.options.chart[a+\"Count\"],\ne[a+\"Count\"]);if(!b){var k=E(c[h],c[\"_\"+h]);n(k)||(e.series.length||(e[f]=0),c[\"_\"+h]=k=e[f]%l,e[f]+=1);d&&(b=d[k])}\"undefined\"!==typeof k&&(this[h]=k);this[a]=b},getColor:function(){this.chart.styledMode?this.getCyclic(\"color\"):this.options.colorByPoint?this.options.color=null:this.getCyclic(\"color\",this.options.color||D.plotOptions[this.type].color,this.chart.options.colors)},getPointsCollection:function(){return(this.hasGroupedData?this.points:this.data)||[]},getSymbol:function(){this.getCyclic(\"symbol\",\nthis.options.marker.symbol,this.chart.options.symbols)},findPointIndex:function(a,b){var e=a.id,d=a.x,c=this.points,l,k=this.options.dataSorting;if(e)var m=this.chart.get(e);else if(this.linkedParent||this.enabledDataSorting){var g=k&&k.matchByName?\"name\":\"index\";m=p(c,function(b){return!b.touched&&b[g]===a[g]});if(!m)return}if(m){var n=m&&m.index;\"undefined\"!==typeof n&&(l=!0)}\"undefined\"===typeof n&&f(d)&&(n=this.xData.indexOf(d,b));-1!==n&&\"undefined\"!==typeof n&&this.cropped&&(n=n>=this.cropStart?\nn-this.cropStart:n);!l&&c[n]&&c[n].touched&&(n=void 0);return n},drawLegendSymbol:c.drawLineMarker,updateData:function(a,b){var e=this.options,d=e.dataSorting,c=this.points,l=[],k,m,g,p=this.requireSorting,u=a.length===c.length,w=!0;this.xIncrement=null;a.forEach(function(b,a){var h=n(b)&&this.pointClass.prototype.optionsToObject.call({series:this},b)||{};var m=h.x;if(h.id||f(m)){if(m=this.findPointIndex(h,g),-1===m||\"undefined\"===typeof m?l.push(b):c[m]&&b!==e.data[m]?(c[m].update(b,!1,null,!1),\nc[m].touched=!0,p&&(g=m+1)):c[m]&&(c[m].touched=!0),!u||a!==m||d&&d.enabled||this.hasDerivedData)k=!0}else l.push(b)},this);if(k)for(a=c.length;a--;)(m=c[a])&&!m.touched&&m.remove&&m.remove(!1,b);else!u||d&&d.enabled?w=!1:(a.forEach(function(b,a){c[a].update&&b!==c[a].y&&c[a].update(b,!1,null,!1)}),l.length=0);c.forEach(function(b){b&&(b.touched=!1)});if(!w)return!1;l.forEach(function(b){this.addPoint(b,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=\nG(this.xData),this.autoIncrement());return!0},setData:function(e,b,d,c){var h=this,k=h.points,m=k&&k.length||0,g,p=h.options,n=h.chart,u=p.dataSorting,w=null,z=h.xAxis;w=p.turboThreshold;var r=this.xData,q=this.yData,A=(g=h.pointArrayMap)&&g.length,t=p.keys,v=0,F=1,M;e=e||[];g=e.length;b=E(b,!0);u&&u.enabled&&(e=this.sortData(e));!1!==c&&g&&m&&!h.cropped&&!h.hasGroupedData&&h.visible&&!h.isSeriesBoosting&&(M=this.updateData(e,d));if(!M){h.xIncrement=null;h.colorCounter=0;this.parallelArrays.forEach(function(b){h[b+\n\"Data\"].length=0});if(w&&g>w)if(w=h.getFirstValidPoint(e),f(w))for(d=0;d<g;d++)r[d]=this.autoIncrement(),q[d]=e[d];else if(l(w))if(A)for(d=0;d<g;d++)c=e[d],r[d]=c[0],q[d]=c.slice(1,A+1);else for(t&&(v=t.indexOf(\"x\"),F=t.indexOf(\"y\"),v=0<=v?v:0,F=0<=F?F:1),d=0;d<g;d++)c=e[d],r[d]=c[v],q[d]=c[F];else C(12,!1,n);else for(d=0;d<g;d++)\"undefined\"!==typeof e[d]&&(c={series:h},h.pointClass.prototype.applyOptions.apply(c,[e[d]]),h.updateParallelArrays(c,d));q&&a(q[0])&&C(14,!0,n);h.data=[];h.options.data=\nh.userOptions.data=e;for(d=m;d--;)k[d]&&k[d].destroy&&k[d].destroy();z&&(z.minRange=z.userMinRange);h.isDirty=n.isDirtyBox=!0;h.isDirtyData=!!k;d=!1}\"point\"===p.legendType&&(this.processData(),this.generatePoints());b&&n.redraw(d)},sortData:function(a){var b=this,e=b.options.dataSorting.sortKey||\"y\",c=function(b,a){return n(a)&&b.pointClass.prototype.optionsToObject.call({series:b},a)||{}};a.forEach(function(e,d){a[d]=c(b,e);a[d].index=d},this);a.concat().sort(function(b,a){b=d(e,b);a=d(e,a);return a<\nb?-1:a>b?1:0}).forEach(function(b,a){b.x=a},this);b.linkedSeries&&b.linkedSeries.forEach(function(b){var e=b.options,d=e.data;e.dataSorting&&e.dataSorting.enabled||!d||(d.forEach(function(e,h){d[h]=c(b,e);a[h]&&(d[h].x=a[h].x,d[h].index=h)}),b.setData(d,!1))});return a},getProcessedData:function(a){var b=this.xData,e=this.yData,d=b.length;var c=0;var f=this.xAxis,l=this.options;var k=l.cropThreshold;var m=a||this.getExtremesFromAll||l.getExtremesFromAll,g=this.isCartesian;a=f&&f.val2lin;l=!(!f||!f.logarithmic);\nvar p=this.requireSorting;if(f){f=f.getExtremes();var n=f.min;var w=f.max}if(g&&this.sorted&&!m&&(!k||d>k||this.forceCrop))if(b[d-1]<n||b[0]>w)b=[],e=[];else if(this.yData&&(b[0]<n||b[d-1]>w)){c=this.cropData(this.xData,this.yData,n,w);b=c.xData;e=c.yData;c=c.start;var u=!0}for(k=b.length||1;--k;)if(d=l?a(b[k])-a(b[k-1]):b[k]-b[k-1],0<d&&(\"undefined\"===typeof r||d<r))var r=d;else 0>d&&p&&(C(15,!1,this.chart),p=!1);return{xData:b,yData:e,cropped:u,cropStart:c,closestPointRange:r}},processData:function(a){var b=\nthis.xAxis;if(this.isCartesian&&!this.isDirty&&!b.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange},cropData:function(a,b,d,c,f){var e=a.length,h=0,k=e,l;f=E(f,this.cropShoulder);for(l=0;l<e;l++)if(a[l]>=d){h=Math.max(0,l-f);break}for(d=l;d<e;d++)if(a[d]>c){k=d+f;break}return{xData:a.slice(h,k),yData:b.slice(h,k),\nstart:h,end:k}},generatePoints:function(){var a=this.options,b=a.data,d=this.data,c,f=this.processedXData,k=this.processedYData,l=this.pointClass,g=f.length,p=this.cropStart||0,n=this.hasGroupedData;a=a.keys;var u=[],r;d||n||(d=[],d.length=b.length,d=this.data=d);a&&n&&(this.options.keys=!1);for(r=0;r<g;r++){var q=p+r;if(n){var A=(new l).init(this,[f[r]].concat(w(k[r])));A.dataGroup=this.groupMap[r];A.dataGroup.options&&(A.options=A.dataGroup.options,I(A,A.dataGroup.options),delete A.dataLabels)}else(A=\nd[q])||\"undefined\"===typeof b[q]||(d[q]=A=(new l).init(this,b[q],f[r]));A&&(A.index=q,u[r]=A)}this.options.keys=a;if(d&&(g!==(c=d.length)||n))for(r=0;r<c;r++)r!==p||n||(r+=g),d[r]&&(d[r].destroyElements(),d[r].plotX=void 0);this.data=d;this.points=u;m(this,\"afterGeneratePoints\")},getXExtremes:function(a){return{min:L(a),max:G(a)}},getExtremes:function(a,b){var d=this.xAxis,e=this.yAxis,c=this.processedXData||this.xData,k=[],g=0,p=0;var n=0;var w=this.requireSorting?this.cropShoulder:0,u=e?e.positiveValuesOnly:\n!1,r;a=a||this.stackedYData||this.processedYData||[];e=a.length;d&&(n=d.getExtremes(),p=n.min,n=n.max);for(r=0;r<e;r++){var q=c[r];var A=a[r];var t=(f(A)||l(A))&&(A.length||0<A||!u);q=b||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!d||(c[r+w]||q)>=p&&(c[r-w]||q)<=n;if(t&&q)if(t=A.length)for(;t--;)f(A[t])&&(k[g++]=A[t]);else k[g++]=A}a={dataMin:L(k),dataMax:G(k)};m(this,\"afterGetExtremes\",{dataExtremes:a});return a},applyExtremes:function(){var a=this.getExtremes();this.dataMin=\na.dataMin;this.dataMax=a.dataMax;return a},getFirstValidPoint:function(a){for(var b=null,d=a.length,e=0;null===b&&e<d;)b=a[e],e++;return b},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,c=d.categories,k=this.enabledDataSorting,g=this.yAxis,p=this.points,w=p.length,u=!!this.modifyValue,r,q=this.pointPlacementToXValue(),A=!!q,t=a.threshold,C=a.startFromThreshold?t:0,F,M=this.zoneAxis||\"y\",y=Number.MAX_VALUE;for(r=0;r<\nw;r++){var I=p[r],D=I.x,B=I.y,G=I.low,P=b&&g.stacking&&g.stacking.stacks[(this.negStacks&&B<(C?0:t)?\"-\":\"\")+this.stackKey];g.positiveValuesOnly&&null!==B&&0>=B&&(I.isNull=!0);I.plotX=F=K(v(d.translate(D,0,0,0,1,q,\"flags\"===this.type),-1E5,1E5));if(b&&this.visible&&P&&P[D]){var H=this.getStackIndicator(H,D,this.index);if(!I.isNull){var Q=P[D];var J=Q.points[H.key]}}l(J)&&(G=J[0],B=J[1],G===C&&H.key===P[D].base&&(G=E(f(t)&&t,g.min)),g.positiveValuesOnly&&0>=G&&(G=null),I.total=I.stackTotal=Q.total,\nI.percentage=Q.total&&I.y/Q.total*100,I.stackY=B,this.irregularWidths||Q.setOffset(this.pointXOffset||0,this.barW||0));I.yBottom=n(G)?v(g.translate(G,0,1,0,1),-1E5,1E5):null;u&&(B=this.modifyValue(B,I));I.plotY=\"number\"===typeof B&&Infinity!==B?v(g.translate(B,0,1,0,1),-1E5,1E5):void 0;I.isInside=this.isPointInside(I);I.clientX=A?K(d.translate(D,0,0,0,1,q)):F;I.negative=I[M]<(a[M+\"Threshold\"]||t||0);I.category=c&&\"undefined\"!==typeof c[I.x]?c[I.x]:I.x;if(!I.isNull&&!1!==I.visible){\"undefined\"!==typeof L&&\n(y=Math.min(y,Math.abs(F-L)));var L=F}I.zone=this.zones.length&&I.getZone();!I.graphic&&this.group&&k&&(I.isNew=!0)}this.closestPointRangePx=y;m(this,\"afterTranslate\")},getValidPoints:function(a,b,d){var e=this.chart;return(a||this.points||[]).filter(function(a){return b&&!e.isInsidePlot(a.plotX,a.plotY,e.inverted)?!1:!1!==a.visible&&(d||!a.isNull)})},getClipBox:function(a,b){var d=this.options,e=this.chart,c=e.inverted,f=this.xAxis,k=f&&this.yAxis,l=e.options.chart.scrollablePlotArea||{};a&&!1===\nd.clip&&k?a=c?{y:-e.chartWidth+k.len+k.pos,height:e.chartWidth,width:e.chartHeight,x:-e.chartHeight+f.len+f.pos}:{y:-k.pos,height:e.chartHeight,width:e.chartWidth,x:-f.pos}:(a=this.clipBox||e.clipBox,b&&(a.width=e.plotSizeX,a.x=(e.scrollablePixelsX||0)*(l.scrollPositionX||0)));return b?{width:a.width,x:a.x}:a},setClip:function(a){var b=this.chart,d=this.options,e=b.renderer,c=b.inverted,f=this.clipBox,k=this.getClipBox(a),l=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,k.height,d.xAxis,\nd.yAxis].join(),m=b[l],g=b[l+\"m\"];a&&(k.width=0,c&&(k.x=b.plotHeight+(!1!==d.clip?0:b.plotTop)));m?b.hasLoaded||m.attr(k):(a&&(b[l+\"m\"]=g=e.clipRect(c?b.plotSizeX+99:-99,c?-b.plotLeft:-b.plotTop,99,c?b.chartWidth:b.chartHeight)),b[l]=m=e.clipRect(k),m.count={length:0});a&&!m.count[this.index]&&(m.count[this.index]=!0,m.count.length+=1);if(!1!==d.clip||a)this.group.clip(a||f?m:b.clipRect),this.markerGroup.clip(g),this.sharedClipKey=l;a||(m.count[this.index]&&(delete m.count[this.index],--m.count.length),\n0===m.count.length&&l&&b[l]&&(f||(b[l]=b[l].destroy()),b[l+\"m\"]&&(b[l+\"m\"]=b[l+\"m\"].destroy())))},animate:function(a){var b=this.chart,d=t(this.options.animation);if(!b.hasRendered)if(a)this.setClip(d);else{var e=this.sharedClipKey;a=b[e];var c=this.getClipBox(d,!0);a&&a.animate(c,d);b[e+\"m\"]&&b[e+\"m\"].animate({width:c.width+99,x:c.x-(b.inverted?0:99)},d)}},afterAnimate:function(){this.setClip();m(this,\"afterAnimate\");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,\nd,c,f=this.options.marker,k=this[this.specialGroup]||this.markerGroup,l=this.xAxis,m=E(f.enabled,!l||l.isRadial?!0:null,this.closestPointRangePx>=f.enabledThreshold*f.radius);if(!1!==f.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++){var g=a[d];var p=(c=g.graphic)?\"animate\":\"attr\";var n=g.marker||{};var w=!!g.marker;if((m&&\"undefined\"===typeof n.enabled||n.enabled)&&!g.isNull&&!1!==g.visible){var u=E(n.symbol,this.symbol);var r=this.markerAttribs(g,g.selected&&\"select\");this.enabledDataSorting&&\n(g.startXPos=l.reversed?-r.width:l.width);var q=!1!==g.isInside;c?c[q?\"show\":\"hide\"](q).animate(r):q&&(0<r.width||g.hasImage)&&(g.graphic=c=b.renderer.symbol(u,r.x,r.y,r.width,r.height,w?n:f).add(k),this.enabledDataSorting&&b.hasRendered&&(c.attr({x:g.startXPos}),p=\"animate\"));c&&\"animate\"===p&&c[q?\"show\":\"hide\"](q).animate(r);if(c&&!b.styledMode)c[p](this.pointAttribs(g,g.selected&&\"select\"));c&&c.addClass(g.getClassName(),!0)}else c&&(g.graphic=c.destroy())}},markerAttribs:function(a,b){var d=this.options,\ne=d.marker,c=a.marker||{},f=c.symbol||e.symbol,k=E(c.radius,e.radius);b&&(e=e.states[b],b=c.states&&c.states[b],k=E(b&&b.radius,e&&e.radius,k+(e&&e.radiusPlus||0)));a.hasImage=f&&0===f.indexOf(\"url\");a.hasImage&&(k=0);a={x:d.crisp?Math.floor(a.plotX)-k:a.plotX-k,y:a.plotY-k};k&&(a.width=a.height=2*k);return a},pointAttribs:function(a,b){var d=this.options.marker,e=a&&a.options,c=e&&e.marker||{},f=this.color,k=e&&e.color,l=a&&a.color;e=E(c.lineWidth,d.lineWidth);var m=a&&a.zone&&a.zone.color;a=1;f=\nk||m||l||f;k=c.fillColor||d.fillColor||f;f=c.lineColor||d.lineColor||f;b=b||\"normal\";d=d.states[b];b=c.states&&c.states[b]||{};e=E(b.lineWidth,d.lineWidth,e+E(b.lineWidthPlus,d.lineWidthPlus,0));k=b.fillColor||d.fillColor||k;f=b.lineColor||d.lineColor||f;a=E(b.opacity,d.opacity,a);return{stroke:f,\"stroke-width\":e,fill:k,opacity:a}},destroy:function(a){var b=this,d=b.chart,e=/AppleWebKit\\/533/.test(Q.navigator.userAgent),c,f,k=b.data||[],l,g;m(b,\"destroy\");this.removeEvents(a);(b.axisTypes||[]).forEach(function(a){(g=\nb[a])&&g.series&&(r(g.series,b),g.isDirty=g.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(f=k.length;f--;)(l=k[f])&&l.destroy&&l.destroy();b.points=null;H.clearTimeout(b.animationTimeout);u(b,function(b,a){b instanceof B&&!b.survive&&(c=e&&\"group\"===a?\"hide\":\"destroy\",b[c]())});d.hoverSeries===b&&(d.hoverSeries=null);r(d.series,b);d.orderSeries();u(b,function(d,e){a&&\"hcEvents\"===e||delete b[e]})},getGraphPath:function(a,b,d){var e=this,c=e.options,f=c.step,h,k=[],l=[],m;a=a||\ne.points;(h=a.reversed)&&a.reverse();(f={right:1,center:2}[f]||f&&3)&&h&&(f=4-f);a=this.getValidPoints(a,!1,!(c.connectNulls&&!b&&!d));a.forEach(function(h,g){var p=h.plotX,r=h.plotY,w=a[g-1];(h.leftCliff||w&&w.rightCliff)&&!d&&(m=!0);h.isNull&&!n(b)&&0<g?m=!c.connectNulls:h.isNull&&!b?m=!0:(0===g||m?g=[[\"M\",h.plotX,h.plotY]]:e.getPointSpline?g=[e.getPointSpline(a,h,g)]:f?(g=1===f?[[\"L\",w.plotX,r]]:2===f?[[\"L\",(w.plotX+p)/2,w.plotY],[\"L\",(w.plotX+p)/2,r]]:[[\"L\",p,w.plotY]],g.push([\"L\",p,r])):g=[[\"L\",\np,r]],l.push(h.x),f&&(l.push(h.x),2===f&&l.push(h.x)),k.push.apply(k,g),m=!1)});k.xMap=l;return e.graphPath=k},drawGraph:function(){var a=this,b=this.options,d=(this.gappedPath||this.getGraphPath).call(this),c=this.chart.styledMode,f=[[\"graph\",\"highcharts-graph\"]];c||f[0].push(b.lineColor||this.color||\"#cccccc\",b.dashStyle);f=a.getZonesGraphs(f);f.forEach(function(e,f){var h=e[0],k=a[h],l=k?\"animate\":\"attr\";k?(k.endX=a.preventGraphAnimation?null:d.xMap,k.animate({d:d})):d.length&&(a[h]=k=a.chart.renderer.path(d).addClass(e[1]).attr({zIndex:1}).add(a.group));\nk&&!c&&(h={stroke:e[2],\"stroke-width\":b.lineWidth,fill:a.fillGraph&&a.color||\"none\"},e[3]?h.dashstyle=e[3]:\"square\"!==b.linecap&&(h[\"stroke-linecap\"]=h[\"stroke-linejoin\"]=\"round\"),k[l](h).shadow(2>f&&b.shadow));k&&(k.startX=d.xMap,k.isArea=d.isArea)})},getZonesGraphs:function(a){this.zones.forEach(function(b,d){d=[\"zone-graph-\"+d,\"highcharts-graph highcharts-zone-graph-\"+d+\" \"+(b.className||\"\")];this.chart.styledMode||d.push(b.color||this.color,b.dashStyle||this.options.dashStyle);a.push(d)},this);\nreturn a},applyZones:function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,f,k,l=this.clips||[],m,g=this.graph,p=this.area,n=Math.max(b.chartWidth,b.chartHeight),r=this[(this.zoneAxis||\"y\")+\"Axis\"],w=b.inverted,u,q,A,t=!1,C,F;if(c.length&&(g||p)&&r&&\"undefined\"!==typeof r.min){var M=r.reversed;var I=r.horiz;g&&!this.showLine&&g.hide();p&&p.hide();var y=r.getExtremes();c.forEach(function(e,c){f=M?I?b.plotWidth:0:I?0:r.toPixels(y.min)||0;f=v(E(k,f),0,n);k=v(Math.round(r.toPixels(E(e.value,y.max),\n!0)||0),0,n);t&&(f=k=r.toPixels(y.max));u=Math.abs(f-k);q=Math.min(f,k);A=Math.max(f,k);r.isXAxis?(m={x:w?A:q,y:0,width:u,height:n},I||(m.x=b.plotHeight-m.x)):(m={x:0,y:w?A:q,width:n,height:u},I&&(m.y=b.plotWidth-m.y));w&&d.isVML&&(m=r.isXAxis?{x:0,y:M?q:A,height:m.width,width:b.chartWidth}:{x:m.y-b.plotLeft-b.spacingBox.x,y:0,width:m.height,height:b.chartHeight});l[c]?l[c].animate(m):l[c]=d.clipRect(m);C=a[\"zone-area-\"+c];F=a[\"zone-graph-\"+c];g&&F&&F.clip(l[c]);p&&C&&C.clip(l[c]);t=e.value>y.max;\na.resetZones&&0===k&&(k=void 0)});this.clips=l}else a.visible&&(g&&g.show(!0),p&&p.show(!0))},invertGroups:function(a){function b(){[\"group\",\"markerGroup\"].forEach(function(b){d[b]&&(e.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,d[b].height=d.xAxis.len,d[b].invert(d.isRadialSeries?!1:a))})}var d=this,e=d.chart;d.xAxis&&(d.eventsToUnbind.push(J(e,\"resize\",b)),b(),d.invertGroups=b)},plotGroup:function(a,b,d,c,f){var e=this[a],h=!e;d={visibility:d,zIndex:c||\n.1};\"undefined\"===typeof this.opacity||this.chart.styledMode||(d.opacity=this.opacity);h&&(this[a]=e=this.chart.renderer.g().add(f));e.addClass(\"highcharts-\"+b+\" highcharts-series-\"+this.index+\" highcharts-\"+this.type+\"-series \"+(n(this.colorIndex)?\"highcharts-color-\"+this.colorIndex+\" \":\"\")+(this.options.className||\"\")+(e.hasClass(\"highcharts-tracker\")?\" highcharts-tracker\":\"\"),!0);e.attr(d)[h?\"attr\":\"animate\"](this.getPlotBox());return e},getPlotBox:function(){var a=this.chart,b=this.xAxis,d=this.yAxis;\na.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}},removeEvents:function(a){a?this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(b){b()}),this.eventsToUnbind.length=0):P(this)},render:function(){var a=this,b=a.chart,d=a.options,c=!a.finishedAnimating&&b.renderer.isSVG&&t(d.animation).duration,f=a.visible?\"inherit\":\"hidden\",k=d.zIndex,l=a.hasRendered,g=b.seriesGroup,p=b.inverted;m(this,\"render\");var n=a.plotGroup(\"group\",\n\"series\",f,k,g);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",f,k,g);c&&a.animate&&a.animate(!0);n.inverted=a.isCartesian||a.invertable?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);!1===d.clip||a.sharedClipKey||l||n.clip(b.clipRect);c&&a.animate&&a.animate();l||(a.animationTimeout=M(function(){a.afterAnimate()},\nc||0));a.isDirty=!1;a.hasRendered=!0;m(a,\"afterRender\")},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,d=this.group,c=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:E(c&&c.left,a.plotLeft),translateY:E(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var d=this.xAxis,e=this.yAxis,c=this.chart.inverted;return this.searchKDTree({clientX:c?\nd.len-a.chartY+d.pos:a.chartX-d.pos,plotY:c?e.len-a.chartX+e.pos:a.chartY-e.pos},b,a)},buildKDTree:function(a){function b(a,e,c){var f;if(f=a&&a.length){var h=d.kdAxisArray[e%c];a.sort(function(a,b){return a[h]-b[h]});f=Math.floor(f/2);return{point:a[f],left:b(a.slice(0,f),e+1,c),right:b(a.slice(f+1),e+1,c)}}}this.buildingKdTree=!0;var d=this,e=-1<d.options.findNearestPointBy.indexOf(\"y\")?2:1;delete d.kdTree;M(function(){d.kdTree=b(d.getValidPoints(null,!d.directTouch),e,e);d.buildingKdTree=!1},d.options.kdNow||\na&&\"touchstart\"===a.type?0:1)},searchKDTree:function(a,b,d){function e(a,b,d,l){var m=b.point,g=c.kdAxisArray[d%l],p=m;var r=n(a[f])&&n(m[f])?Math.pow(a[f]-m[f],2):null;var w=n(a[h])&&n(m[h])?Math.pow(a[h]-m[h],2):null;w=(r||0)+(w||0);m.dist=n(w)?Math.sqrt(w):Number.MAX_VALUE;m.distX=n(r)?Math.sqrt(r):Number.MAX_VALUE;g=a[g]-m[g];w=0>g?\"left\":\"right\";r=0>g?\"right\":\"left\";b[w]&&(w=e(a,b[w],d+1,l),p=w[k]<p[k]?w:m);b[r]&&Math.sqrt(g*g)<p[k]&&(a=e(a,b[r],d+1,l),p=a[k]<p[k]?a:p);return p}var c=this,f=\nthis.kdAxisArray[0],h=this.kdAxisArray[1],k=b?\"distX\":\"dist\";b=-1<c.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(d);if(this.kdTree)return e(a,this.kdTree,b,b)},pointPlacementToXValue:function(){var a=this.options,b=a.pointRange,d=this.xAxis;a=a.pointPlacement;\"between\"===a&&(a=d.reversed?-.5:.5);return f(a)?a*E(b,d.pointRange):0},isPointInside:function(a){return\"undefined\"!==typeof a.plotY&&\"undefined\"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=this.yAxis.len&&\n0<=a.plotX&&a.plotX<=this.xAxis.len}});\"\"});O(q,\"parts/Stacking.js\",[q[\"parts/Axis.js\"],q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/StackingAxis.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B){var H=B.correctFloat,D=B.defined,J=B.destroyObjectProperties,t=B.format,G=B.isNumber,L=B.pick;\"\";var v=q.Series,K=function(){function c(c,g,n,p,m){var d=c.chart.inverted;this.axis=c;this.isNegative=n;this.options=g=g||{};this.x=p;this.total=null;this.points={};this.hasValidPoints=!1;this.stack=m;this.rightCliff=\nthis.leftCliff=0;this.alignOptions={align:g.align||(d?n?\"left\":\"right\":\"center\"),verticalAlign:g.verticalAlign||(d?\"middle\":n?\"bottom\":\"top\"),y:g.y,x:g.x};this.textAlign=g.textAlign||(d?n?\"right\":\"left\":\"center\")}c.prototype.destroy=function(){J(this,this.axis)};c.prototype.render=function(c){var g=this.axis.chart,n=this.options,p=n.format;p=p?t(p,this,g):n.formatter.call(this);this.label?this.label.attr({text:p,visibility:\"hidden\"}):(this.label=g.renderer.label(p,null,null,n.shape,null,null,n.useHTML,\n!1,\"stack-labels\"),p={r:n.borderRadius||0,text:p,rotation:n.rotation,padding:L(n.padding,5),visibility:\"hidden\"},g.styledMode||(p.fill=n.backgroundColor,p.stroke=n.borderColor,p[\"stroke-width\"]=n.borderWidth,this.label.css(n.style)),this.label.attr(p),this.label.added||this.label.add(c));this.label.labelrank=g.plotHeight};c.prototype.setOffset=function(c,g,n,p,m){var d=this.axis,l=d.chart;p=d.translate(d.stacking.usePercentage?100:p?p:this.total,0,0,0,1);n=d.translate(n?n:0);n=D(p)&&Math.abs(p-n);\nc=L(m,l.xAxis[0].translate(this.x))+c;d=D(p)&&this.getStackBox(l,this,c,p,g,n,d);g=this.label;n=this.isNegative;c=\"justify\"===L(this.options.overflow,\"justify\");var k=this.textAlign;g&&d&&(m=g.getBBox(),p=g.padding,k=\"left\"===k?l.inverted?-p:p:\"right\"===k?m.width:l.inverted&&\"center\"===k?m.width/2:l.inverted?n?m.width+p:-p:m.width/2,n=l.inverted?m.height/2:n?-p:m.height,this.alignOptions.x=L(this.options.x,0),this.alignOptions.y=L(this.options.y,0),d.x-=k,d.y-=n,g.align(this.alignOptions,null,d),\nl.isInsidePlot(g.alignAttr.x+k-this.alignOptions.x,g.alignAttr.y+n-this.alignOptions.y)?g.show():(g.alignAttr.y=-9999,c=!1),c&&v.prototype.justifyDataLabel.call(this.axis,g,this.alignOptions,g.alignAttr,m,d),g.attr({x:g.alignAttr.x,y:g.alignAttr.y}),L(!c&&this.options.crop,!0)&&((l=G(g.x)&&G(g.y)&&l.isInsidePlot(g.x-p+g.width,g.y)&&l.isInsidePlot(g.x+p,g.y))||g.hide()))};c.prototype.getStackBox=function(c,g,n,p,m,d,l){var k=g.axis.reversed,f=c.inverted,a=l.height+l.pos-(f?c.plotLeft:c.plotTop);g=\ng.isNegative&&!k||!g.isNegative&&k;return{x:f?g?p-l.right:p-d+l.pos-c.plotLeft:n+c.xAxis[0].transB-c.plotLeft,y:f?l.height-n-m:g?a-p-d:a-p,width:f?d:m,height:f?m:d}};return c}();c.prototype.getStacks=function(){var c=this,g=c.inverted;c.yAxis.forEach(function(c){c.stacking&&c.stacking.stacks&&c.hasVisibleSeries&&(c.stacking.oldStacks=c.stacking.stacks)});c.series.forEach(function(n){var r=n.xAxis&&n.xAxis.options||{};!n.options.stacking||!0!==n.visible&&!1!==c.options.chart.ignoreHiddenSeries||(n.stackKey=\n[n.type,L(n.options.stack,\"\"),g?r.top:r.left,g?r.height:r.width].join())})};y.compose(g);v.prototype.setGroupedPoints=function(){this.options.centerInCategory&&(this.is(\"column\")||this.is(\"columnrange\"))&&!this.options.stacking&&1<this.chart.series.length&&v.prototype.setStackedPoints.call(this,\"group\")};v.prototype.setStackedPoints=function(c){var g=c||this.options.stacking;if(g&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var n=this.processedXData,q=this.processedYData,\np=[],m=q.length,d=this.options,l=d.threshold,k=L(d.startFromThreshold&&l,0);d=d.stack;c=c?this.type+\",\"+g:this.stackKey;var f=\"-\"+c,a=this.negStacks,A=this.yAxis,u=A.stacking.stacks,t=A.stacking.oldStacks,v,w;A.stacking.stacksTouched+=1;for(w=0;w<m;w++){var M=n[w];var F=q[w];var y=this.getStackIndicator(y,M,this.index);var e=y.key;var b=(v=a&&F<(k?0:l))?f:c;u[b]||(u[b]={});u[b][M]||(t[b]&&t[b][M]?(u[b][M]=t[b][M],u[b][M].total=null):u[b][M]=new K(A,A.options.stackLabels,v,M,d));b=u[b][M];null!==F?\n(b.points[e]=b.points[this.index]=[L(b.cumulative,k)],D(b.cumulative)||(b.base=e),b.touched=A.stacking.stacksTouched,0<y.index&&!1===this.singleStacks&&(b.points[e][0]=b.points[this.index+\",\"+M+\",0\"][0])):b.points[e]=b.points[this.index]=null;\"percent\"===g?(v=v?c:f,a&&u[v]&&u[v][M]?(v=u[v][M],b.total=v.total=Math.max(v.total,b.total)+Math.abs(F)||0):b.total=H(b.total+(Math.abs(F)||0))):\"group\"===g?null!==F&&(b.total=(b.total||0)+1):b.total=H(b.total+(F||0));b.cumulative=\"group\"===g?(b.total||1)-1:\nL(b.cumulative,k)+(F||0);null!==F&&(b.points[e].push(b.cumulative),p[w]=b.cumulative,b.hasValidPoints=!0)}\"percent\"===g&&(A.stacking.usePercentage=!0);\"group\"!==g&&(this.stackedYData=p);A.stacking.oldStacks={}}};v.prototype.modifyStacks=function(){var c=this,g=c.stackKey,q=c.yAxis.stacking.stacks,t=c.processedXData,p,m=c.options.stacking;c[m+\"Stacker\"]&&[g,\"-\"+g].forEach(function(d){for(var l=t.length,k,f;l--;)if(k=t[l],p=c.getStackIndicator(p,k,c.index,d),f=(k=q[d]&&q[d][k])&&k.points[p.key])c[m+\n\"Stacker\"](f,k,l)})};v.prototype.percentStacker=function(c,g,q){g=g.total?100/g.total:0;c[0]=H(c[0]*g);c[1]=H(c[1]*g);this.stackedYData[q]=c[1]};v.prototype.getStackIndicator=function(c,g,q,t){!D(c)||c.x!==g||t&&c.key!==t?c={x:g,index:0,key:t}:c.index++;c.key=[q,g,c.index].join();return c};q.StackItem=K;return q.StackItem});O(q,\"parts/Dynamics.js\",[q[\"parts/Axis.js\"],q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/Time.js\"],q[\"parts/Utilities.js\"]],function(g,\nc,q,y,B,H,D){var J=y.time,t=D.addEvent,G=D.animate,L=D.createElement,v=D.css,K=D.defined,n=D.erase,r=D.error,C=D.extend,I=D.fireEvent,p=D.isArray,m=D.isNumber,d=D.isObject,l=D.isString,k=D.merge,f=D.objectEach,a=D.pick,A=D.relativeLength,u=D.setAnimation,E=D.splat;y=q.Series;var P=q.seriesTypes;q.cleanRecursively=function(a,c){var k={};f(a,function(f,e){if(d(a[e],!0)&&!a.nodeType&&c[e])f=q.cleanRecursively(a[e],c[e]),Object.keys(f).length&&(k[e]=f);else if(d(a[e])||a[e]!==c[e])k[e]=a[e]});return k};\nC(c.prototype,{addSeries:function(d,c,f){var k,e=this;d&&(c=a(c,!0),I(e,\"addSeries\",{options:d},function(){k=e.initSeries(d);e.isDirtyLegend=!0;e.linkSeries();k.enabledDataSorting&&k.setData(d.data,!1);I(e,\"afterAddSeries\",{series:k});c&&e.redraw(f)}));return k},addAxis:function(a,d,c,f){return this.createAxis(d?\"xAxis\":\"yAxis\",{axis:a,redraw:c,animation:f})},addColorAxis:function(a,d,c){return this.createAxis(\"colorAxis\",{axis:a,redraw:d,animation:c})},createAxis:function(d,c){var f=this.options,\nl=\"colorAxis\"===d,e=c.redraw,b=c.animation;c=k(c.axis,{index:this[d].length,isX:\"xAxis\"===d});var h=l?new q.ColorAxis(this,c):new g(this,c);f[d]=E(f[d]||{});f[d].push(c);l&&(this.isDirtyLegend=!0,this.axes.forEach(function(a){a.series=[]}),this.series.forEach(function(a){a.bindAxes();a.isDirtyData=!0}));a(e,!0)&&this.redraw(b);return h},showLoading:function(d){var c=this,f=c.options,k=c.loadingDiv,e=f.loading,b=function(){k&&v(k,{left:c.plotLeft+\"px\",top:c.plotTop+\"px\",width:c.plotWidth+\"px\",height:c.plotHeight+\n\"px\"})};k||(c.loadingDiv=k=L(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,c.container),c.loadingSpan=L(\"span\",{className:\"highcharts-loading-inner\"},null,k),t(c,\"redraw\",b));k.className=\"highcharts-loading\";c.loadingSpan.innerHTML=a(d,f.lang.loading,\"\");c.styledMode||(v(k,C(e.style,{zIndex:10})),v(c.loadingSpan,e.labelStyle),c.loadingShown||(v(k,{opacity:0,display:\"\"}),G(k,{opacity:e.style.opacity||.5},{duration:e.showDuration||0})));c.loadingShown=!0;b()},hideLoading:function(){var a=\nthis.options,d=this.loadingDiv;d&&(d.className=\"highcharts-loading highcharts-loading-hidden\",this.styledMode||G(d,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){v(d,{display:\"none\"})}}));this.loadingShown=!1},propsRequireDirtyBox:\"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),propsRequireReflow:\"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft\".split(\" \"),\npropsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip\".split(\" \"),collectionsWithUpdate:[\"xAxis\",\"yAxis\",\"zAxis\",\"series\"],update:function(d,c,g,p){var e=this,b={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\",caption:\"setCaption\"},h,n,u,r=d.isResponsiveOptions,w=[];I(e,\"update\",{options:d});r||e.setResponsive(!1,!0);d=q.cleanRecursively(d,e.options);k(!0,e.userOptions,d);if(h=d.chart){k(!0,e.options.chart,h);\"className\"in\nh&&e.setClassName(h.className);\"reflow\"in h&&e.setReflow(h.reflow);if(\"inverted\"in h||\"polar\"in h||\"type\"in h){e.propFromSeries();var t=!0}\"alignTicks\"in h&&(t=!0);f(h,function(a,b){-1!==e.propsRequireUpdateSeries.indexOf(\"chart.\"+b)&&(n=!0);-1!==e.propsRequireDirtyBox.indexOf(b)&&(e.isDirtyBox=!0);-1!==e.propsRequireReflow.indexOf(b)&&(r?e.isDirtyBox=!0:u=!0)});!e.styledMode&&\"style\"in h&&e.renderer.setStyle(h.style)}!e.styledMode&&d.colors&&(this.options.colors=d.colors);d.plotOptions&&k(!0,this.options.plotOptions,\nd.plotOptions);d.time&&this.time===J&&(this.time=new H(d.time));f(d,function(a,d){if(e[d]&&\"function\"===typeof e[d].update)e[d].update(a,!1);else if(\"function\"===typeof e[b[d]])e[b[d]](a);\"chart\"!==d&&-1!==e.propsRequireUpdateSeries.indexOf(d)&&(n=!0)});this.collectionsWithUpdate.forEach(function(b){if(d[b]){if(\"series\"===b){var c=[];e[b].forEach(function(b,d){b.options.isInternal||c.push(a(b.options.index,d))})}E(d[b]).forEach(function(a,d){var f=K(a.id),h;f&&(h=e.get(a.id));h||(h=e[b][c?c[d]:d])&&\nf&&K(h.options.id)&&(h=void 0);h&&h.coll===b&&(h.update(a,!1),g&&(h.touched=!0));!h&&g&&e.collectionsWithInit[b]&&(e.collectionsWithInit[b][0].apply(e,[a].concat(e.collectionsWithInit[b][1]||[]).concat([!1])).touched=!0)});g&&e[b].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:w.push(a)})}});w.forEach(function(a){a.remove&&a.remove(!1)});t&&e.axes.forEach(function(a){a.update({},!1)});n&&e.getSeriesOrderByLinks().forEach(function(a){a.chart&&a.update({},!1)},this);d.loading&&\nk(!0,e.options.loading,d.loading);t=h&&h.width;h=h&&h.height;l(h)&&(h=A(h,t||e.chartWidth));u||m(t)&&t!==e.chartWidth||m(h)&&h!==e.chartHeight?e.setSize(t,h,p):a(c,!0)&&e.redraw(p);I(e,\"afterUpdate\",{options:d,redraw:c,animation:p})},setSubtitle:function(a,d){this.applyDescription(\"subtitle\",a);this.layOutTitles(d)},setCaption:function(a,d){this.applyDescription(\"caption\",a);this.layOutTitles(d)}});c.prototype.collectionsWithInit={xAxis:[c.prototype.addAxis,[!0]],yAxis:[c.prototype.addAxis,[!1]],\nseries:[c.prototype.addSeries]};C(B.prototype,{update:function(c,f,k,l){function e(){b.applyOptions(c);var e=g&&b.hasDummyGraphic;e=null===b.y?!e:e;g&&e&&(b.graphic=g.destroy(),delete b.hasDummyGraphic);d(c,!0)&&(g&&g.element&&c&&c.marker&&\"undefined\"!==typeof c.marker.symbol&&(b.graphic=g.destroy()),c&&c.dataLabels&&b.dataLabel&&(b.dataLabel=b.dataLabel.destroy()),b.connector&&(b.connector=b.connector.destroy()));m=b.index;h.updateParallelArrays(b,m);n.data[m]=d(n.data[m],!0)||d(c,!0)?b.options:\na(c,n.data[m]);h.isDirty=h.isDirtyData=!0;!h.fixedBox&&h.hasCartesianSeries&&(p.isDirtyBox=!0);\"point\"===n.legendType&&(p.isDirtyLegend=!0);f&&p.redraw(k)}var b=this,h=b.series,g=b.graphic,m,p=h.chart,n=h.options;f=a(f,!0);!1===l?e():b.firePointEvent(\"update\",{options:c},e)},remove:function(a,d){this.series.removePoint(this.series.data.indexOf(this),a,d)}});C(y.prototype,{addPoint:function(d,c,f,k,e){var b=this.options,h=this.data,l=this.chart,g=this.xAxis;g=g&&g.hasNames&&g.names;var m=b.data,p=\nthis.xData,n;c=a(c,!0);var u={series:this};this.pointClass.prototype.applyOptions.apply(u,[d]);var r=u.x;var w=p.length;if(this.requireSorting&&r<p[w-1])for(n=!0;w&&p[w-1]>r;)w--;this.updateParallelArrays(u,\"splice\",w,0,0);this.updateParallelArrays(u,w);g&&u.name&&(g[r]=u.name);m.splice(w,0,d);n&&(this.data.splice(w,0,null),this.processData());\"point\"===b.legendType&&this.generatePoints();f&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(u,\"shift\"),m.shift()));!1!==e&&I(this,\n\"addPoint\",{point:u});this.isDirtyData=this.isDirty=!0;c&&l.redraw(k)},removePoint:function(d,c,f){var k=this,e=k.data,b=e[d],h=k.points,l=k.chart,g=function(){h&&h.length===e.length&&h.splice(d,1);e.splice(d,1);k.options.data.splice(d,1);k.updateParallelArrays(b||{series:k},\"splice\",d,1);b&&b.destroy();k.isDirty=!0;k.isDirtyData=!0;c&&l.redraw()};u(f,l);c=a(c,!0);b?b.firePointEvent(\"remove\",null,g):g()},remove:function(d,c,f,k){function e(){b.destroy(k);b.remove=null;h.isDirtyLegend=h.isDirtyBox=\n!0;h.linkSeries();a(d,!0)&&h.redraw(c)}var b=this,h=b.chart;!1!==f?I(b,\"remove\",null,e):e()},update:function(d,c){d=q.cleanRecursively(d,this.userOptions);I(this,\"update\",{options:d});var f=this,l=f.chart,e=f.userOptions,b=f.initialType||f.type,h=d.type||e.type||l.options.chart.type,g=!(this.hasDerivedData||d.dataGrouping||h&&h!==this.type||\"undefined\"!==typeof d.pointStart||d.pointInterval||d.pointIntervalUnit||d.keys),m=P[b].prototype,p,n=[\"eventOptions\",\"navigatorSeries\",\"baseSeries\"],u=f.finishedAnimating&&\n{animation:!1},w={};g&&(n.push(\"data\",\"isDirtyData\",\"points\",\"processedXData\",\"processedYData\",\"xIncrement\",\"cropped\",\"_hasPointMarkers\",\"_hasPointLabels\",\"mapMap\",\"mapData\",\"minY\",\"maxY\",\"minX\",\"maxX\"),!1!==d.visible&&n.push(\"area\",\"graph\"),f.parallelArrays.forEach(function(a){n.push(a+\"Data\")}),d.data&&(d.dataSorting&&C(f.options.dataSorting,d.dataSorting),this.setData(d.data,!1)));d=k(e,u,{index:\"undefined\"===typeof e.index?f.index:e.index,pointStart:a(e.pointStart,f.xData[0])},!g&&{data:f.options.data},\nd);g&&d.data&&(d.data=f.options.data);n=[\"group\",\"markerGroup\",\"dataLabelsGroup\",\"transformGroup\"].concat(n);n.forEach(function(a){n[a]=f[a];delete f[a]});f.remove(!1,null,!1,!0);for(p in m)f[p]=void 0;P[h||b]?C(f,P[h||b].prototype):r(17,!0,l,{missingModuleFor:h||b});n.forEach(function(a){f[a]=n[a]});f.init(l,d);if(g&&this.points){var A=f.options;!1===A.visible?(w.graphic=1,w.dataLabel=1):f._hasPointLabels||(d=A.marker,e=A.dataLabels,d&&(!1===d.enabled||\"symbol\"in d)&&(w.graphic=1),e&&!1===e.enabled&&\n(w.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(w).length&&a.destroyElements(w),!1===A.showInLegend&&a.legendItem&&l.legend.destroyItem(a))},this)}f.initialType=b;l.linkSeries();I(this,\"afterUpdate\");a(c,!0)&&l.redraw(g?void 0:!1)},setName:function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0}});C(g.prototype,{update:function(d,c){var l=this.chart,g=d&&d.events||{};d=k(this.userOptions,d);l.options[this.coll].indexOf&&\n(l.options[this.coll][l.options[this.coll].indexOf(this.userOptions)]=d);f(l.options[this.coll].events,function(a,b){\"undefined\"===typeof g[b]&&(g[b]=void 0)});this.destroy(!0);this.init(l,C(d,{events:g}));l.isDirtyBox=!0;a(c,!0)&&l.redraw()},remove:function(d){for(var c=this.chart,f=this.coll,k=this.series,e=k.length;e--;)k[e]&&k[e].remove(!1);n(c.axes,this);n(c[f],this);p(c.options[f])?c.options[f].splice(this.options.index,1):delete c.options[f];c[f].forEach(function(a,d){a.options.index=a.userOptions.index=\nd});this.destroy();c.isDirtyBox=!0;a(d,!0)&&c.redraw()},setTitle:function(a,d){this.update({title:a},d)},setCategories:function(a,d){this.update({categories:a},d)}})});O(q,\"parts/AreaSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Color.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=c.parse,H=y.objectEach,D=y.pick;c=y.seriesType;var J=g.Series;c(\"area\",\"line\",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(c){var g=[],q=[],t=this.xAxis,y=this.yAxis,\nn=y.stacking.stacks[this.stackKey],r={},C=this.index,I=y.series,p=I.length,m=D(y.options.reversedStacks,!0)?1:-1,d;c=c||this.points;if(this.options.stacking){for(d=0;d<c.length;d++)c[d].leftNull=c[d].rightNull=void 0,r[c[d].x]=c[d];H(n,function(d,c){null!==d.total&&q.push(c)});q.sort(function(d,c){return d-c});var l=I.map(function(d){return d.visible});q.forEach(function(c,f){var a=0,k,u;if(r[c]&&!r[c].isNull)g.push(r[c]),[-1,1].forEach(function(a){var g=1===a?\"rightNull\":\"leftNull\",w=0,A=n[q[f+a]];\nif(A)for(d=C;0<=d&&d<p;)k=A.points[d],k||(d===C?r[c][g]=!0:l[d]&&(u=n[c].points[d])&&(w-=u[1]-u[0])),d+=m;r[c][1===a?\"rightCliff\":\"leftCliff\"]=w});else{for(d=C;0<=d&&d<p;){if(k=n[c].points[d]){a=k[1];break}d+=m}a=y.translate(a,0,1,0,1);g.push({isNull:!0,plotX:t.translate(c,0,0,0,1),x:c,plotY:a,yBottom:a})}})}return g},getGraphPath:function(c){var g=J.prototype.getGraphPath,q=this.options,t=q.stacking,y=this.yAxis,n,r=[],C=[],I=this.index,p=y.stacking.stacks[this.stackKey],m=q.threshold,d=Math.round(y.getThreshold(q.threshold));\nq=D(q.connectNulls,\"percent\"===t);var l=function(a,k,l){var g=c[a];a=t&&p[g.x].points[I];var n=g[l+\"Null\"]||0;l=g[l+\"Cliff\"]||0;g=!0;if(l||n){var u=(n?a[0]:a[1])+l;var q=a[0]+l;g=!!n}else!t&&c[k]&&c[k].isNull&&(u=q=m);\"undefined\"!==typeof u&&(C.push({plotX:f,plotY:null===u?d:y.getThreshold(u),isNull:g,isCliff:!0}),r.push({plotX:f,plotY:null===q?d:y.getThreshold(q),doCurve:!1}))};c=c||this.points;t&&(c=this.getStackPoints(c));for(n=0;n<c.length;n++){t||(c[n].leftCliff=c[n].rightCliff=c[n].leftNull=\nc[n].rightNull=void 0);var k=c[n].isNull;var f=D(c[n].rectPlotX,c[n].plotX);var a=D(c[n].yBottom,d);if(!k||q)q||l(n,n-1,\"left\"),k&&!t&&q||(C.push(c[n]),r.push({x:n,plotX:f,plotY:a})),q||l(n,n+1,\"right\")}n=g.call(this,C,!0,!0);r.reversed=!0;k=g.call(this,r,!0,!0);(a=k[0])&&\"M\"===a[0]&&(k[0]=[\"L\",a[1],a[2]]);k=n.concat(k);g=g.call(this,C,!1,q);k.xMap=n.xMap;this.areaPath=k;return g},drawGraph:function(){this.areaPath=[];J.prototype.drawGraph.apply(this);var c=this,g=this.areaPath,q=this.options,v=[[\"area\",\n\"highcharts-area\",this.color,q.fillColor]];this.zones.forEach(function(g,n){v.push([\"zone-area-\"+n,\"highcharts-area highcharts-zone-area-\"+n+\" \"+g.className,g.color||c.color,g.fillColor||q.fillColor])});v.forEach(function(t){var n=t[0],r=c[n],v=r?\"animate\":\"attr\",y={};r?(r.endX=c.preventGraphAnimation?null:g.xMap,r.animate({d:g})):(y.zIndex=0,r=c[n]=c.chart.renderer.path(g).addClass(t[1]).add(c.group),r.isArea=!0);c.chart.styledMode||(y.fill=D(t[3],B(t[2]).setOpacity(D(q.fillOpacity,.75)).get()));\nr[v](y);r.startX=g.xMap;r.shiftUnit=q.step?2:1})},drawLegendSymbol:q.drawRectangle});\"\"});O(q,\"parts/SplineSeries.js\",[q[\"parts/Utilities.js\"]],function(g){var c=g.pick;g=g.seriesType;g(\"spline\",\"line\",{},{getPointSpline:function(g,q,B){var y=q.plotX||0,D=q.plotY||0,J=g[B-1];B=g[B+1];if(J&&!J.isNull&&!1!==J.doCurve&&!q.isCliff&&B&&!B.isNull&&!1!==B.doCurve&&!q.isCliff){g=J.plotY||0;var t=B.plotX||0;B=B.plotY||0;var G=0;var L=(1.5*y+(J.plotX||0))/2.5;var v=(1.5*D+g)/2.5;t=(1.5*y+t)/2.5;var K=(1.5*\nD+B)/2.5;t!==L&&(G=(K-v)*(t-y)/(t-L)+D-K);v+=G;K+=G;v>g&&v>D?(v=Math.max(g,D),K=2*D-v):v<g&&v<D&&(v=Math.min(g,D),K=2*D-v);K>B&&K>D?(K=Math.max(B,D),v=2*D-K):K<B&&K<D&&(K=Math.min(B,D),v=2*D-K);q.rightContX=t;q.rightContY=K}q=[\"C\",c(J.rightContX,J.plotX,0),c(J.rightContY,J.plotY,0),c(L,y,0),c(v,D,0),y,D];J.rightContX=J.rightContY=void 0;return q}});\"\"});O(q,\"parts/AreaSplineSeries.js\",[q[\"parts/Globals.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Options.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,\ny){y=y.seriesType;g=g.seriesTypes.area.prototype;y(\"areaspline\",\"spline\",q.defaultOptions.plotOptions.area,{getStackPoints:g.getStackPoints,getGraphPath:g.getGraphPath,drawGraph:g.drawGraph,drawLegendSymbol:c.drawRectangle});\"\"});O(q,\"parts/ColumnSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Color.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){\"\";var B=c.parse,H=y.animObject,D=y.clamp,J=y.defined,t=y.extend,G=y.isNumber,L=y.merge,v=y.pick;c=y.seriesType;var K=g.Series;c(\"column\",\n\"line\",{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:\"#cccccc\",borderColor:\"#000000\"}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:\"#ffffff\"},{cropShoulder:0,directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){K.prototype.init.apply(this,\narguments);var c=this,g=c.chart;g.hasRendered&&g.series.forEach(function(g){g.type===c.type&&(g.isDirty=!0)})},getColumnMetrics:function(){var c=this,g=c.options,q=c.xAxis,t=c.yAxis,p=q.options.reversedStacks;p=q.reversed&&!p||!q.reversed&&p;var m,d={},l=0;!1===g.grouping?l=1:c.chart.series.forEach(function(a){var f=a.yAxis,k=a.options;if(a.type===c.type&&(a.visible||!c.chart.options.chart.ignoreHiddenSeries)&&t.len===f.len&&t.pos===f.pos){if(k.stacking&&\"group\"!==k.stacking){m=a.stackKey;\"undefined\"===\ntypeof d[m]&&(d[m]=l++);var g=d[m]}else!1!==k.grouping&&(g=l++);a.columnIndex=g}});var k=Math.min(Math.abs(q.transA)*(q.ordinal&&q.ordinal.slope||g.pointRange||q.closestPointRange||q.tickInterval||1),q.len),f=k*g.groupPadding,a=(k-2*f)/(l||1);g=Math.min(g.maxPointWidth||q.len,v(g.pointWidth,a*(1-2*g.pointPadding)));c.columnMetrics={width:g,offset:(a-g)/2+(f+((c.columnIndex||0)+(p?1:0))*a-k/2)*(p?-1:1),paddedWidth:a,columnCount:l};return c.columnMetrics},crispCol:function(c,g,q,t){var p=this.chart,\nm=this.borderWidth,d=-(m%2?.5:0);m=m%2?.5:1;p.inverted&&p.renderer.isVML&&(m+=1);this.options.crisp&&(q=Math.round(c+q)+d,c=Math.round(c)+d,q-=c);t=Math.round(g+t)+m;d=.5>=Math.abs(g)&&.5<t;g=Math.round(g)+m;t-=g;d&&t&&(--g,t+=1);return{x:c,y:g,width:q,height:t}},adjustForMissingColumns:function(c,q,t,v){var p=this,m=this.options.stacking;if(!t.isNull&&1<v.columnCount){var d=0,l=0;Highcharts.objectEach(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(c){if(\"number\"===typeof t.x&&(c=c[t.x.toString()])){var f=\nc.points[p.index],a=c.total;m?(f&&(d=l),c.hasValidPoints&&l++):g.isArray(f)&&(d=f[1],l=a||0)}});c=(t.plotX||0)+((l-1)*v.paddedWidth+q)/2-q-d*v.paddedWidth}return c},translate:function(){var c=this,g=c.chart,q=c.options,t=c.dense=2>c.closestPointRange*c.xAxis.transA;t=c.borderWidth=v(q.borderWidth,t?0:1);var p=c.xAxis,m=c.yAxis,d=q.threshold,l=c.translatedThreshold=m.getThreshold(d),k=v(q.minPointLength,5),f=c.getColumnMetrics(),a=f.width,A=c.barW=Math.max(a,1+2*t),u=c.pointXOffset=f.offset,E=c.dataMin,\ny=c.dataMax;g.inverted&&(l-=.5);q.pointPadding&&(A=Math.ceil(A));K.prototype.translate.apply(c);c.points.forEach(function(n){var r=v(n.yBottom,l),w=999+Math.abs(r),t=a,e=n.plotX||0;w=D(n.plotY,-w,m.len+w);var b=e+u,h=A,z=Math.min(w,r),x=Math.max(w,r)-z;if(k&&Math.abs(x)<k){x=k;var C=!m.reversed&&!n.negative||m.reversed&&n.negative;G(d)&&G(y)&&n.y===d&&y<=d&&(m.min||0)<d&&E!==y&&(C=!C);z=Math.abs(z-l)>k?r-k:l-(C?k:0)}J(n.options.pointWidth)&&(t=h=Math.ceil(n.options.pointWidth),b-=Math.round((t-a)/\n2));q.centerInCategory&&(b=c.adjustForMissingColumns(b,t,n,f));n.barX=b;n.pointWidth=t;n.tooltipPos=g.inverted?[m.len+m.pos-g.plotLeft-w,p.len+p.pos-g.plotTop-(e||0)-u-h/2,x]:[b+h/2,w+m.pos-g.plotTop,x];n.shapeType=c.pointClass.prototype.shapeType||\"rect\";n.shapeArgs=c.crispCol.apply(c,n.isNull?[b,l,h,0]:[b,z,h,x])})},getSymbol:g.noop,drawLegendSymbol:q.drawRectangle,drawGraph:function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")},pointAttribs:function(c,g){var n=this.options,\nq=this.pointAttrToOptions||{};var p=q.stroke||\"borderColor\";var m=q[\"stroke-width\"]||\"borderWidth\",d=c&&c.color||this.color,l=c&&c[p]||n[p]||this.color||d,k=c&&c[m]||n[m]||this[m]||0;q=c&&c.options.dashStyle||n.dashStyle;var f=v(c&&c.opacity,n.opacity,1);if(c&&this.zones.length){var a=c.getZone();d=c.options.color||a&&(a.color||c.nonZonedColor)||this.color;a&&(l=a.borderColor||l,q=a.dashStyle||q,k=a.borderWidth||k)}g&&c&&(c=L(n.states[g],c.options.states&&c.options.states[g]||{}),g=c.brightness,d=\nc.color||\"undefined\"!==typeof g&&B(d).brighten(c.brightness).get()||d,l=c[p]||l,k=c[m]||k,q=c.dashStyle||q,f=v(c.opacity,f));p={fill:d,stroke:l,\"stroke-width\":k,opacity:f};q&&(p.dashstyle=q);return p},drawPoints:function(){var c=this,g=this.chart,q=c.options,t=g.renderer,p=q.animationLimit||250,m;c.points.forEach(function(d){var l=d.graphic,k=!!l,f=l&&g.pointCount<p?\"animate\":\"attr\";if(G(d.plotY)&&null!==d.y){m=d.shapeArgs;l&&d.hasNewShapeType()&&(l=l.destroy());c.enabledDataSorting&&(d.startXPos=\nc.xAxis.reversed?-(m?m.width:0):c.xAxis.width);l||(d.graphic=l=t[d.shapeType](m).add(d.group||c.group))&&c.enabledDataSorting&&g.hasRendered&&g.pointCount<p&&(l.attr({x:d.startXPos}),k=!0,f=\"animate\");if(l&&k)l[f](L(m));if(q.borderRadius)l[f]({r:q.borderRadius});g.styledMode||l[f](c.pointAttribs(d,d.selected&&\"select\")).shadow(!1!==d.allowShadow&&q.shadow,null,q.stacking&&!q.borderRadius);l.addClass(d.getClassName(),!0)}else l&&(d.graphic=l.destroy())})},animate:function(c){var g=this,n=this.yAxis,\nq=g.options,p=this.chart.inverted,m={},d=p?\"translateX\":\"translateY\";if(c)m.scaleY=.001,c=D(n.toPixels(q.threshold),n.pos,n.pos+n.len),p?m.translateX=c-n.len:m.translateY=c,g.clipBox&&g.setClip(),g.group.attr(m);else{var l=g.group.attr(d);g.group.animate({scaleY:1},t(H(g.options.animation),{step:function(c,f){g.group&&(m[d]=l+f.pos*(n.pos-l),g.group.attr(m))}}))}},remove:function(){var c=this,g=c.chart;g.hasRendered&&g.series.forEach(function(g){g.type===c.type&&(g.isDirty=!0)});K.prototype.remove.apply(c,\narguments)}});\"\"});O(q,\"parts/BarSeries.js\",[q[\"parts/Utilities.js\"]],function(g){g=g.seriesType;g(\"bar\",\"column\",null,{inverted:!0});\"\"});O(q,\"parts/ScatterSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent;c=c.seriesType;var y=g.Series;c(\"scatter\",\"line\",{lineWidth:0,findNearestPointBy:\"xy\",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style=\"color:{point.color}\">\\u25cf</span> <span style=\"font-size: 10px\"> {series.name}</span><br/>',pointFormat:\"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>\"}},\n{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&y.prototype.drawGraph.call(this)},applyJitter:function(){var c=this,g=this.options.jitter,q=this.points.length;g&&this.points.forEach(function(y,t){[\"x\",\"y\"].forEach(function(D,B){var v=\"plot\"+D.toUpperCase();if(g[D]&&!y.isNull){var G=c[D+\"Axis\"];var n=g[D]*G.transA;if(G&&!G.isLog){var r=Math.max(0,y[v]-n);G=Math.min(G.len,y[v]+\nn);B=1E4*Math.sin(t+B*q);y[v]=r+(G-r)*(B-Math.floor(B));\"x\"===D&&(y.clientX=y.plotX)}}})})}});q(y,\"afterTranslate\",function(){this.applyJitter&&this.applyJitter()});\"\"});O(q,\"mixins/centered-series.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.isNumber,y=c.pick,B=c.relativeLength,H=g.deg2rad;g.CenteredSeriesMixin={getCenter:function(){var c=this.options,q=this.chart,t=2*(c.slicedOffset||0),G=q.plotWidth-2*t,H=q.plotHeight-2*t,v=c.center,K=Math.min(G,H),n=c.size,r=c.innerSize||\n0;\"string\"===typeof n&&(n=parseFloat(n));\"string\"===typeof r&&(r=parseFloat(r));c=[y(v[0],\"50%\"),y(v[1],\"50%\"),y(n&&0>n?void 0:c.size,\"100%\"),y(r&&0>r?void 0:c.innerSize||0,\"0%\")];!q.angular||this instanceof g.Series||(c[3]=0);for(v=0;4>v;++v)n=c[v],q=2>v||2===v&&/%$/.test(n),c[v]=B(n,[G,H,K,c[2]][v])+(q?t:0);c[3]>c[2]&&(c[3]=c[2]);return c},getStartAndEndRadians:function(c,g){c=q(c)?c:0;g=q(g)&&g>c&&360>g-c?g:c+360;return{start:H*(c+-90),end:H*(g+-90)}}}});O(q,\"parts/PieSeries.js\",[q[\"parts/Globals.js\"],\nq[\"mixins/legend-symbol.js\"],q[\"parts/Point.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=y.addEvent,H=y.clamp,D=y.defined,J=y.fireEvent,t=y.isNumber,G=y.merge,L=y.pick,v=y.relativeLength,K=y.seriesType,n=y.setAnimation;y=g.CenteredSeriesMixin;var r=y.getStartAndEndRadians,C=g.noop,I=g.Series;K(\"pie\",\"line\",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:\"fixedOffset\",crookDistance:\"70%\",distance:30,enabled:!0,formatter:function(){return this.point.isNull?\nvoid 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:\"#ffffff\",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttribs:g.seriesTypes.column.prototype.pointAttribs,animate:function(c){var g=\nthis,d=g.points,l=g.startAngleRad;c||d.forEach(function(d){var c=d.graphic,a=d.shapeArgs;c&&a&&(c.attr({r:L(d.startR,g.center&&g.center[3]/2),start:l,end:l}),c.animate({r:a.r,start:a.start,end:a.end},g.options.animation))})},hasData:function(){return!!this.processedXData.length},updateTotals:function(){var c,g=0,d=this.points,l=d.length,k=this.options.ignoreHiddenPoint;for(c=0;c<l;c++){var f=d[c];g+=k&&!f.visible?0:f.isNull?0:f.y}this.total=g;for(c=0;c<l;c++)f=d[c],f.percentage=0<g&&(f.visible||!k)?\nf.y/g*100:0,f.total=g},generatePoints:function(){I.prototype.generatePoints.call(this);this.updateTotals()},getX:function(c,g,d){var l=this.center,k=this.radii?this.radii[d.index]:l[2]/2;c=Math.asin(H((c-l[1])/(k+d.labelDistance),-1,1));return l[0]+(g?-1:1)*Math.cos(c)*(k+d.labelDistance)+(0<d.labelDistance?(g?-1:1)*this.options.dataLabels.padding:0)},translate:function(c){this.generatePoints();var g=0,d=this.options,l=d.slicedOffset,k=l+(d.borderWidth||0),f=r(d.startAngle,d.endAngle),a=this.startAngleRad=\nf.start;f=(this.endAngleRad=f.end)-a;var p=this.points,n=d.dataLabels.distance;d=d.ignoreHiddenPoint;var q,t=p.length;c||(this.center=c=this.getCenter());for(q=0;q<t;q++){var w=p[q];var y=a+g*f;if(!d||w.visible)g+=w.percentage/100;var F=a+g*f;w.shapeType=\"arc\";w.shapeArgs={x:c[0],y:c[1],r:c[2]/2,innerR:c[3]/2,start:Math.round(1E3*y)/1E3,end:Math.round(1E3*F)/1E3};w.labelDistance=L(w.options.dataLabels&&w.options.dataLabels.distance,n);w.labelDistance=v(w.labelDistance,w.shapeArgs.r);this.maxLabelDistance=\nMath.max(this.maxLabelDistance||0,w.labelDistance);F=(F+y)/2;F>1.5*Math.PI?F-=2*Math.PI:F<-Math.PI/2&&(F+=2*Math.PI);w.slicedTranslation={translateX:Math.round(Math.cos(F)*l),translateY:Math.round(Math.sin(F)*l)};var C=Math.cos(F)*c[2]/2;var e=Math.sin(F)*c[2]/2;w.tooltipPos=[c[0]+.7*C,c[1]+.7*e];w.half=F<-Math.PI/2||F>Math.PI/2?1:0;w.angle=F;y=Math.min(k,w.labelDistance/5);w.labelPosition={natural:{x:c[0]+C+Math.cos(F)*w.labelDistance,y:c[1]+e+Math.sin(F)*w.labelDistance},\"final\":{},alignment:0>\nw.labelDistance?\"center\":w.half?\"right\":\"left\",connectorPosition:{breakAt:{x:c[0]+C+Math.cos(F)*y,y:c[1]+e+Math.sin(F)*y},touchingSliceAt:{x:c[0]+C,y:c[1]+e}}}}J(this,\"afterTranslate\")},drawEmpty:function(){var c=this.startAngleRad,g=this.endAngleRad,d=this.options;if(0===this.total){var l=this.center[0];var k=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(l,k,this.center[1]/2,0,c,g).addClass(\"highcharts-empty-series\").add(this.group));this.graph.attr({d:Highcharts.SVGRenderer.prototype.symbols.arc(l,\nk,this.center[2]/2,0,{start:c,end:g,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({\"stroke-width\":d.borderWidth,fill:d.fillColor||\"none\",stroke:d.color||\"#cccccc\"})}else this.graph&&(this.graph=this.graph.destroy())},redrawPoints:function(){var c=this,g=c.chart,d=g.renderer,l,k,f,a,n=c.options.shadow;this.drawEmpty();!n||c.shadowGroup||g.styledMode||(c.shadowGroup=d.g(\"shadow\").attr({zIndex:-1}).add(c.group));c.points.forEach(function(m){var p={};k=m.graphic;if(!m.isNull&&k){a=\nm.shapeArgs;l=m.getTranslate();if(!g.styledMode){var q=m.shadowGroup;n&&!q&&(q=m.shadowGroup=d.g(\"shadow\").add(c.shadowGroup));q&&q.attr(l);f=c.pointAttribs(m,m.selected&&\"select\")}m.delayedRendering?(k.setRadialReference(c.center).attr(a).attr(l),g.styledMode||k.attr(f).attr({\"stroke-linejoin\":\"round\"}).shadow(n,q),m.delayedRendering=!1):(k.setRadialReference(c.center),g.styledMode||G(!0,p,f),G(!0,p,a,l),k.animate(p));k.attr({visibility:m.visible?\"inherit\":\"hidden\"});k.addClass(m.getClassName())}else k&&\n(m.graphic=k.destroy())})},drawPoints:function(){var c=this.chart.renderer;this.points.forEach(function(g){g.graphic&&g.hasNewShapeType()&&(g.graphic=g.graphic.destroy());g.graphic||(g.graphic=c[g.shapeType](g.shapeArgs).add(g.series.group),g.delayedRendering=!0)})},searchPoint:C,sortByAngle:function(c,g){c.sort(function(c,l){return\"undefined\"!==typeof c.angle&&(l.angle-c.angle)*g})},drawLegendSymbol:c.drawRectangle,getCenter:y.getCenter,getSymbol:C,drawGraph:null},{init:function(){q.prototype.init.apply(this,\narguments);var c=this;c.name=L(c.name,\"Slice\");var g=function(d){c.slice(\"select\"===d.type)};B(c,\"select\",g);B(c,\"unselect\",g);return c},isValid:function(){return t(this.y)&&0<=this.y},setVisible:function(c,g){var d=this,l=d.series,k=l.chart,f=l.options.ignoreHiddenPoint;g=L(g,f);c!==d.visible&&(d.visible=d.options.visible=c=\"undefined\"===typeof c?!d.visible:c,l.options.data[l.data.indexOf(d)]=d.options,[\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"].forEach(function(a){if(d[a])d[a][c?\"show\":\"hide\"](!0)}),\nd.legendItem&&k.legend.colorizeItem(d,c),c||\"hover\"!==d.state||d.setState(\"\"),f&&(l.isDirty=!0),g&&k.redraw())},slice:function(c,g,d){var l=this.series;n(d,l.chart);L(g,!0);this.sliced=this.options.sliced=D(c)?c:!this.sliced;l.options.data[l.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(c){var g=\nthis.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(g.x,g.y,g.r+c,g.r+c,{innerR:g.r-1,start:g.start,end:g.end})},connectorShapes:{fixedOffset:function(c,g,d){var l=g.breakAt;g=g.touchingSliceAt;return[[\"M\",c.x,c.y],d.softConnector?[\"C\",c.x+(\"left\"===c.alignment?-5:5),c.y,2*l.x-g.x,2*l.y-g.y,l.x,l.y]:[\"L\",l.x,l.y],[\"L\",g.x,g.y]]},straight:function(c,g){g=g.touchingSliceAt;return[[\"M\",c.x,c.y],[\"L\",g.x,g.y]]},crookedLine:function(c,g,d){g=g.touchingSliceAt;var l=\nthis.series,k=l.center[0],f=l.chart.plotWidth,a=l.chart.plotLeft;l=c.alignment;var m=this.shapeArgs.r;d=v(d.crookDistance,1);f=\"left\"===l?k+m+(f+a-k-m)*(1-d):a+(k-m)*d;d=[\"L\",f,c.y];k=!0;if(\"left\"===l?f>c.x||f<g.x:f<c.x||f>g.x)k=!1;c=[[\"M\",c.x,c.y]];k&&c.push(d);c.push([\"L\",g.x,g.y]);return c}},getConnectorPath:function(){var c=this.labelPosition,g=this.series.options.dataLabels,d=g.connectorShape,l=this.connectorShapes;l[d]&&(d=l[d]);return d.call(this,{x:c.final.x,y:c.final.y,alignment:c.alignment},\nc.connectorPosition,g)}});\"\"});O(q,\"parts/DataLabels.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=g.noop,y=g.seriesTypes,B=c.animObject,H=c.arrayMax,D=c.clamp,J=c.defined,t=c.extend,G=c.fireEvent,L=c.format,v=c.isArray,K=c.merge,n=c.objectEach,r=c.pick,C=c.relativeLength,I=c.splat,p=c.stableSort,m=g.Series;g.distribute=function(c,l,k){function d(a,c){return a.target-c.target}var a,m=!0,n=c,q=[];var t=0;var w=n.reducedLen||l;for(a=c.length;a--;)t+=c[a].size;if(t>w){p(c,function(a,\nc){return(c.rank||0)-(a.rank||0)});for(t=a=0;t<=w;)t+=c[a].size,a++;q=c.splice(a-1,c.length)}p(c,d);for(c=c.map(function(a){return{size:a.size,targets:[a.target],align:r(a.align,.5)}});m;){for(a=c.length;a--;)m=c[a],t=(Math.min.apply(0,m.targets)+Math.max.apply(0,m.targets))/2,m.pos=D(t-m.size*m.align,0,l-m.size);a=c.length;for(m=!1;a--;)0<a&&c[a-1].pos+c[a-1].size>c[a].pos&&(c[a-1].size+=c[a].size,c[a-1].targets=c[a-1].targets.concat(c[a].targets),c[a-1].align=.5,c[a-1].pos+c[a-1].size>l&&(c[a-1].pos=\nl-c[a-1].size),c.splice(a,1),m=!0)}n.push.apply(n,q);a=0;c.some(function(c){var d=0;if(c.targets.some(function(){n[a].pos=c.pos+d;if(\"undefined\"!==typeof k&&Math.abs(n[a].pos-n[a].target)>k)return n.slice(0,a+1).forEach(function(a){delete a.pos}),n.reducedLen=(n.reducedLen||l)-.1*l,n.reducedLen>.1*l&&g.distribute(n,l,k),!0;d+=n[a].size;a++}))return!0});p(n,d)};m.prototype.drawDataLabels=function(){function c(a,c){var b=c.filter;return b?(c=b.operator,a=a[b.property],b=b.value,\">\"===c&&a>b||\"<\"===\nc&&a<b||\">=\"===c&&a>=b||\"<=\"===c&&a<=b||\"==\"===c&&a==b||\"===\"===c&&a===b?!0:!1):!0}function g(a,c){var b=[],d;if(v(a)&&!v(c))b=a.map(function(a){return K(a,c)});else if(v(c)&&!v(a))b=c.map(function(b){return K(a,b)});else if(v(a)||v(c))for(d=Math.max(a.length,c.length);d--;)b[d]=K(a[d],c[d]);else b=K(a,c);return b}var k=this,f=k.chart,a=k.options,m=a.dataLabels,p=k.points,q,t=k.hasRendered||0,w=B(a.animation).duration,y=Math.min(w,200),F=!f.renderer.forExport&&r(m.defer,0<y),C=f.renderer;m=g(g(f.options.plotOptions&&\nf.options.plotOptions.series&&f.options.plotOptions.series.dataLabels,f.options.plotOptions&&f.options.plotOptions[k.type]&&f.options.plotOptions[k.type].dataLabels),m);G(this,\"drawDataLabels\");if(v(m)||m.enabled||k._hasPointLabels){var e=k.plotGroup(\"dataLabelsGroup\",\"data-labels\",F&&!t?\"hidden\":\"inherit\",m.zIndex||6);F&&(e.attr({opacity:+t}),t||setTimeout(function(){var b=k.dataLabelsGroup;b&&(k.visible&&e.show(!0),b[a.animation?\"animate\":\"attr\"]({opacity:1},{duration:y}))},w-y));p.forEach(function(b){q=\nI(g(m,b.dlOptions||b.options&&b.options.dataLabels));q.forEach(function(d,g){var h=d.enabled&&(!b.isNull||b.dataLabelOnNull)&&c(b,d),l=b.dataLabels?b.dataLabels[g]:b.dataLabel,m=b.connectors?b.connectors[g]:b.connector,p=r(d.distance,b.labelDistance),q=!l;if(h){var u=b.getLabelConfig();var w=r(d[b.formatPrefix+\"Format\"],d.format);u=J(w)?L(w,u,f):(d[b.formatPrefix+\"Formatter\"]||d.formatter).call(u,d);w=d.style;var t=d.rotation;f.styledMode||(w.color=r(d.color,w.color,k.color,\"#000000\"),\"contrast\"===\nw.color?(b.contrastColor=C.getContrast(b.color||k.color),w.color=!J(p)&&d.inside||0>p||a.stacking?b.contrastColor:\"#000000\"):delete b.contrastColor,a.cursor&&(w.cursor=a.cursor));var A={r:d.borderRadius||0,rotation:t,padding:d.padding,zIndex:1};f.styledMode||(A.fill=d.backgroundColor,A.stroke=d.borderColor,A[\"stroke-width\"]=d.borderWidth);n(A,function(a,b){\"undefined\"===typeof a&&delete A[b]})}!l||h&&J(u)?h&&J(u)&&(l?A.text=u:(b.dataLabels=b.dataLabels||[],l=b.dataLabels[g]=t?C.text(u,0,-9999,d.useHTML).addClass(\"highcharts-data-label\"):\nC.label(u,0,-9999,d.shape,null,null,d.useHTML,null,\"data-label\"),g||(b.dataLabel=l),l.addClass(\" highcharts-data-label-color-\"+b.colorIndex+\" \"+(d.className||\"\")+(d.useHTML?\" highcharts-tracker\":\"\"))),l.options=d,l.attr(A),f.styledMode||l.css(w).shadow(d.shadow),l.added||l.add(e),d.textPath&&!d.useHTML&&(l.setTextPath(b.getDataLabelPath&&b.getDataLabelPath(l)||b.graphic,d.textPath),b.dataLabelPath&&!d.textPath.enabled&&(b.dataLabelPath=b.dataLabelPath.destroy())),k.alignDataLabel(b,l,d,null,q)):(b.dataLabel=\nb.dataLabel&&b.dataLabel.destroy(),b.dataLabels&&(1===b.dataLabels.length?delete b.dataLabels:delete b.dataLabels[g]),g||delete b.dataLabel,m&&(b.connector=b.connector.destroy(),b.connectors&&(1===b.connectors.length?delete b.connectors:delete b.connectors[g])))})})}G(this,\"afterDrawDataLabels\")};m.prototype.alignDataLabel=function(c,g,k,f,a){var d=this,l=this.chart,m=this.isCartesian&&l.inverted,n=this.enabledDataSorting,p=r(c.dlBox&&c.dlBox.centerX,c.plotX,-9999),q=r(c.plotY,-9999),v=g.getBBox(),\ny=k.rotation,e=k.align,b=l.isInsidePlot(p,Math.round(q),m),h=\"justify\"===r(k.overflow,n?\"none\":\"justify\"),z=this.visible&&!1!==c.visible&&(c.series.forceDL||n&&!h||b||k.inside&&f&&l.isInsidePlot(p,m?f.x+1:f.y+f.height-1,m));var x=function(e){n&&d.xAxis&&!h&&d.setDataLabelStartPos(c,g,a,b,e)};if(z){var C=l.renderer.fontMetrics(l.styledMode?void 0:k.style.fontSize,g).b;f=t({x:m?this.yAxis.len-q:p,y:Math.round(m?this.xAxis.len-p:q),width:0,height:0},f);t(k,{width:v.width,height:v.height});y?(h=!1,p=\nl.renderer.rotCorr(C,y),p={x:f.x+(k.x||0)+f.width/2+p.x,y:f.y+(k.y||0)+{top:0,middle:.5,bottom:1}[k.verticalAlign]*f.height},x(p),g[a?\"attr\":\"animate\"](p).attr({align:e}),x=(y+720)%360,x=180<x&&360>x,\"left\"===e?p.y-=x?v.height:0:\"center\"===e?(p.x-=v.width/2,p.y-=v.height/2):\"right\"===e&&(p.x-=v.width,p.y-=x?0:v.height),g.placed=!0,g.alignAttr=p):(x(f),g.align(k,null,f),p=g.alignAttr);h&&0<=f.height?this.justifyDataLabel(g,k,p,v,f,a):r(k.crop,!0)&&(z=l.isInsidePlot(p.x,p.y)&&l.isInsidePlot(p.x+v.width,\np.y+v.height));if(k.shape&&!y)g[a?\"attr\":\"animate\"]({anchorX:m?l.plotWidth-c.plotY:c.plotX,anchorY:m?l.plotHeight-c.plotX:c.plotY})}a&&n&&(g.placed=!1);z||n&&!h||(g.hide(!0),g.placed=!1)};m.prototype.setDataLabelStartPos=function(c,g,k,f,a){var d=this.chart,l=d.inverted,m=this.xAxis,n=m.reversed,p=l?g.height/2:g.width/2;c=(c=c.pointWidth)?c/2:0;m=l?a.x:n?-p-c:m.width-p+c;a=l?n?this.yAxis.height-p+c:-p-c:a.y;g.startXPos=m;g.startYPos=a;f?\"hidden\"===g.visibility&&(g.show(),g.attr({opacity:0}).animate({opacity:1})):\ng.attr({opacity:1}).animate({opacity:0},void 0,g.hide);d.hasRendered&&(k&&g.attr({x:g.startXPos,y:g.startYPos}),g.placed=!0)};m.prototype.justifyDataLabel=function(c,g,k,f,a,m){var d=this.chart,l=g.align,n=g.verticalAlign,p=c.box?0:c.padding||0,q=g.x;q=void 0===q?0:q;var r=g.y;var t=void 0===r?0:r;r=k.x+p;if(0>r){\"right\"===l&&0<=q?(g.align=\"left\",g.inside=!0):q-=r;var e=!0}r=k.x+f.width-p;r>d.plotWidth&&(\"left\"===l&&0>=q?(g.align=\"right\",g.inside=!0):q+=d.plotWidth-r,e=!0);r=k.y+p;0>r&&(\"bottom\"===\nn&&0<=t?(g.verticalAlign=\"top\",g.inside=!0):t-=r,e=!0);r=k.y+f.height-p;r>d.plotHeight&&(\"top\"===n&&0>=t?(g.verticalAlign=\"bottom\",g.inside=!0):t+=d.plotHeight-r,e=!0);e&&(g.x=q,g.y=t,c.placed=!m,c.align(g,void 0,a));return e};y.pie&&(y.pie.prototype.dataLabelPositioners={radialDistributionY:function(c){return c.top+c.distributeBox.pos},radialDistributionX:function(c,g,k,f){return c.getX(k<g.top+2||k>g.bottom-2?f:k,g.half,g)},justify:function(c,g,k){return k[0]+(c.half?-1:1)*(g+c.labelDistance)},\nalignToPlotEdges:function(c,g,k,f){c=c.getBBox().width;return g?c+f:k-c-f},alignToConnectors:function(c,g,k,f){var a=0,d;c.forEach(function(c){d=c.dataLabel.getBBox().width;d>a&&(a=d)});return g?a+f:k-a-f}},y.pie.prototype.drawDataLabels=function(){var c=this,l=c.data,k,f=c.chart,a=c.options.dataLabels||{},n=a.connectorPadding,p,q=f.plotWidth,t=f.plotHeight,w=f.plotLeft,v=Math.round(f.chartWidth/3),y,C=c.center,e=C[2]/2,b=C[1],h,z,x,B,D=[[],[]],G,I,L,O,U=[0,0,0,0],R=c.dataLabelPositioners,T;c.visible&&\n(a.enabled||c._hasPointLabels)&&(l.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),m.prototype.drawDataLabels.apply(c),l.forEach(function(b){b.dataLabel&&(b.visible?(D[b.half].push(b),b.dataLabel._pos=null,!J(a.style.width)&&!J(b.options.dataLabels&&b.options.dataLabels.style&&b.options.dataLabels.style.width)&&b.dataLabel.getBBox().width>v&&(b.dataLabel.css({width:Math.round(.7*\nv)+\"px\"}),b.dataLabel.shortened=!0)):(b.dataLabel=b.dataLabel.destroy(),b.dataLabels&&1===b.dataLabels.length&&delete b.dataLabels))}),D.forEach(function(d,l){var m=d.length,p=[],u;if(m){c.sortByAngle(d,l-.5);if(0<c.maxLabelDistance){var v=Math.max(0,b-e-c.maxLabelDistance);var A=Math.min(b+e+c.maxLabelDistance,f.plotHeight);d.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,b-e-a.labelDistance),a.bottom=Math.min(b+e+a.labelDistance,f.plotHeight),u=a.dataLabel.getBBox().height||\n21,a.distributeBox={target:a.labelPosition.natural.y-a.top+u/2,size:u,rank:a.y},p.push(a.distributeBox))});v=A+u-v;g.distribute(p,v,v/5)}for(O=0;O<m;O++){k=d[O];x=k.labelPosition;h=k.dataLabel;L=!1===k.visible?\"hidden\":\"inherit\";I=v=x.natural.y;p&&J(k.distributeBox)&&(\"undefined\"===typeof k.distributeBox.pos?L=\"hidden\":(B=k.distributeBox.size,I=R.radialDistributionY(k)));delete k.positionIndex;if(a.justify)G=R.justify(k,e,C);else switch(a.alignTo){case \"connectors\":G=R.alignToConnectors(d,l,q,w);\nbreak;case \"plotEdges\":G=R.alignToPlotEdges(h,l,q,w);break;default:G=R.radialDistributionX(c,k,I,v)}h._attr={visibility:L,align:x.alignment};T=k.options.dataLabels||{};h._pos={x:G+r(T.x,a.x)+({left:n,right:-n}[x.alignment]||0),y:I+r(T.y,a.y)-10};x.final.x=G;x.final.y=I;r(a.crop,!0)&&(z=h.getBBox().width,v=null,G-z<n&&1===l?(v=Math.round(z-G+n),U[3]=Math.max(v,U[3])):G+z>q-n&&0===l&&(v=Math.round(G+z-q+n),U[1]=Math.max(v,U[1])),0>I-B/2?U[0]=Math.max(Math.round(-I+B/2),U[0]):I+B/2>t&&(U[2]=Math.max(Math.round(I+\nB/2-t),U[2])),h.sideOverflow=v)}}}),0===H(U)||this.verifyDataLabelOverflow(U))&&(this.placeDataLabels(),this.points.forEach(function(b){T=K(a,b.options.dataLabels);if(p=r(T.connectorWidth,1)){var d;y=b.connector;if((h=b.dataLabel)&&h._pos&&b.visible&&0<b.labelDistance){L=h._attr.visibility;if(d=!y)b.connector=y=f.renderer.path().addClass(\"highcharts-data-label-connector  highcharts-color-\"+b.colorIndex+(b.className?\" \"+b.className:\"\")).add(c.dataLabelsGroup),f.styledMode||y.attr({\"stroke-width\":p,\nstroke:T.connectorColor||b.color||\"#666666\"});y[d?\"attr\":\"animate\"]({d:b.getConnectorPath()});y.attr(\"visibility\",L)}else y&&(b.connector=y.destroy())}}))},y.pie.prototype.placeDataLabels=function(){this.points.forEach(function(c){var d=c.dataLabel,g;d&&c.visible&&((g=d._pos)?(d.sideOverflow&&(d._attr.width=Math.max(d.getBBox().width-d.sideOverflow,0),d.css({width:d._attr.width+\"px\",textOverflow:(this.options.dataLabels.style||{}).textOverflow||\"ellipsis\"}),d.shortened=!0),d.attr(d._attr),d[d.moved?\n\"animate\":\"attr\"](g),d.moved=!0):d&&d.attr({y:-9999}));delete c.distributeBox},this)},y.pie.prototype.alignDataLabel=q,y.pie.prototype.verifyDataLabelOverflow=function(c){var d=this.center,g=this.options,f=g.center,a=g.minSize||80,m=null!==g.size;if(!m){if(null!==f[0])var n=Math.max(d[2]-Math.max(c[1],c[3]),a);else n=Math.max(d[2]-c[1]-c[3],a),d[0]+=(c[3]-c[1])/2;null!==f[1]?n=D(n,a,d[2]-Math.max(c[0],c[2])):(n=D(n,a,d[2]-c[0]-c[2]),d[1]+=(c[0]-c[2])/2);n<d[2]?(d[2]=n,d[3]=Math.min(C(g.innerSize||\n0,n),n),this.translate(d),this.drawDataLabels&&this.drawDataLabels()):m=!0}return m});y.column&&(y.column.prototype.alignDataLabel=function(c,g,k,f,a){var d=this.chart.inverted,l=c.series,n=c.dlBox||c.shapeArgs,p=r(c.below,c.plotY>r(this.translatedThreshold,l.yAxis.len)),q=r(k.inside,!!this.options.stacking);n&&(f=K(n),0>f.y&&(f.height+=f.y,f.y=0),n=f.y+f.height-l.yAxis.len,0<n&&n<f.height&&(f.height-=n),d&&(f={x:l.yAxis.len-f.y-f.height,y:l.xAxis.len-f.x-f.width,width:f.height,height:f.width}),q||\n(d?(f.x+=p?0:f.width,f.width=0):(f.y+=p?f.height:0,f.height=0)));k.align=r(k.align,!d||q?\"center\":p?\"right\":\"left\");k.verticalAlign=r(k.verticalAlign,d||q?\"middle\":p?\"top\":\"bottom\");m.prototype.alignDataLabel.call(this,c,g,k,f,a);k.inside&&c.contrastColor&&g.css({color:c.contrastColor})})});O(q,\"modules/overlapping-datalabels.src.js\",[q[\"parts/Chart.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.fireEvent,B=c.isArray,H=c.isNumber,D=c.objectEach,J=c.pick;q(g,\"render\",function(){var c=\n[];(this.labelCollectors||[]).forEach(function(g){c=c.concat(g())});(this.yAxis||[]).forEach(function(g){g.stacking&&g.options.stackLabels&&!g.options.stackLabels.allowOverlap&&D(g.stacking.stacks,function(g){D(g,function(g){c.push(g.label)})})});(this.series||[]).forEach(function(g){var q=g.options.dataLabels;g.visible&&(!1!==q.enabled||g._hasPointLabels)&&(g.nodes||g.points).forEach(function(g){g.visible&&(B(g.dataLabels)?g.dataLabels:g.dataLabel?[g.dataLabel]:[]).forEach(function(q){var n=q.options;\nq.labelrank=J(n.labelrank,g.labelrank,g.shapeArgs&&g.shapeArgs.height);n.allowOverlap||c.push(q)})})});this.hideOverlappingLabels(c)});g.prototype.hideOverlappingLabels=function(c){var g=this,q=c.length,t=g.renderer,B,n,r,C=!1;var D=function(c){var d,g=c.box?0:c.padding||0,f=d=0,a;if(c&&(!c.alignAttr||c.placed)){var m=c.alignAttr||{x:c.attr(\"x\"),y:c.attr(\"y\")};var n=c.parentGroup;c.width||(d=c.getBBox(),c.width=d.width,c.height=d.height,d=t.fontMetrics(null,c.element).h);var p=c.width-2*g;(a={left:\"0\",\ncenter:\"0.5\",right:\"1\"}[c.alignValue])?f=+a*p:H(c.x)&&Math.round(c.x)!==c.translateX&&(f=c.x-c.translateX);return{x:m.x+(n.translateX||0)+g-f,y:m.y+(n.translateY||0)+g-d,width:c.width-2*g,height:c.height-2*g}}};for(n=0;n<q;n++)if(B=c[n])B.oldOpacity=B.opacity,B.newOpacity=1,B.absoluteBox=D(B);c.sort(function(c,g){return(g.labelrank||0)-(c.labelrank||0)});for(n=0;n<q;n++){var p=(D=c[n])&&D.absoluteBox;for(B=n+1;B<q;++B){var m=(r=c[B])&&r.absoluteBox;!p||!m||D===r||0===D.newOpacity||0===r.newOpacity||\nm.x>p.x+p.width||m.x+m.width<p.x||m.y>p.y+p.height||m.y+m.height<p.y||((D.labelrank<r.labelrank?D:r).newOpacity=0)}}c.forEach(function(c){if(c){var d=c.newOpacity;c.oldOpacity!==d&&(c.alignAttr&&c.placed?(c[d?\"removeClass\":\"addClass\"](\"highcharts-data-label-hidden\"),C=!0,c.alignAttr.opacity=d,c[c.isOld?\"animate\":\"attr\"](c.alignAttr,null,function(){g.styledMode||c.css({pointerEvents:d?\"auto\":\"none\"});c.visibility=d?\"inherit\":\"hidden\";c.placed=!!d}),y(g,\"afterHideOverlappingLabel\")):c.attr({opacity:d}));\nc.isOld=!0}});C&&y(g,\"afterHideAllOverlappingLabels\")}});O(q,\"parts/Interaction.js\",[q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/Legend.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H){var D=y.defaultOptions,J=H.addEvent,t=H.createElement,G=H.css,L=H.defined,v=H.extend,K=H.fireEvent,n=H.isArray,r=H.isFunction,C=H.isNumber,I=H.isObject,p=H.merge,m=H.objectEach,d=H.pick,l=c.hasTouch;y=c.Series;H=c.seriesTypes;var k=c.svg;var f=c.TrackerMixin={drawTrackerPoint:function(){var a=\nthis,c=a.chart,d=c.pointer,f=function(a){var c=d.getPointFromEvent(a);\"undefined\"!==typeof c&&(d.isDirectTouch=!0,c.onMouseOver(a))},g;a.points.forEach(function(a){g=n(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);g.forEach(function(c){c.div?c.div.point=a:c.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(g){if(a[g]){a[g].addClass(\"highcharts-tracker\").on(\"mouseover\",f).on(\"mouseout\",function(a){d.onTrackerMouseOut(a)});if(l)a[g].on(\"touchstart\",\nf);!c.styledMode&&a.options.cursor&&a[g].css(G).css({cursor:a.options.cursor})}}),a._hasTracking=!0);K(this,\"afterDrawTracker\")},drawTrackerGraph:function(){var a=this,c=a.options,d=c.trackByArea,f=[].concat(d?a.areaPath:a.graphPath),g=a.chart,m=g.pointer,n=g.renderer,p=g.options.tooltip.snap,q=a.tracker,e=function(b){if(g.hoverSeries!==a)a.onMouseOver()},b=\"rgba(192,192,192,\"+(k?.0001:.002)+\")\";q?q.attr({d:f}):a.graph&&(a.tracker=n.path(f).attr({visibility:a.visible?\"visible\":\"hidden\",zIndex:2}).addClass(d?\n\"highcharts-tracker-area\":\"highcharts-tracker-line\").add(a.group),g.styledMode||a.tracker.attr({\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",stroke:b,fill:d?b:\"none\",\"stroke-width\":a.graph.strokeWidth()+(d?0:2*p)}),[a.tracker,a.markerGroup].forEach(function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",e).on(\"mouseout\",function(a){m.onTrackerMouseOut(a)});c.cursor&&!g.styledMode&&a.css({cursor:c.cursor});if(l)a.on(\"touchstart\",e)}));K(this,\"afterDrawTracker\")}};H.column&&(H.column.prototype.drawTracker=\nf.drawTrackerPoint);H.pie&&(H.pie.prototype.drawTracker=f.drawTrackerPoint);H.scatter&&(H.scatter.prototype.drawTracker=f.drawTrackerPoint);v(q.prototype,{setItemEvents:function(a,c,d){var f=this,g=f.chart.renderer.boxWrapper,k=a instanceof B,l=\"highcharts-legend-\"+(k?\"point\":\"series\")+\"-active\",m=f.chart.styledMode;(d?[c,a.legendSymbol]:[a.legendGroup]).forEach(function(d){if(d)d.on(\"mouseover\",function(){a.visible&&f.allItems.forEach(function(c){a!==c&&c.setState(\"inactive\",!k)});a.setState(\"hover\");\na.visible&&g.addClass(l);m||c.css(f.options.itemHoverStyle)}).on(\"mouseout\",function(){f.chart.styledMode||c.css(p(a.visible?f.itemStyle:f.itemHiddenStyle));f.allItems.forEach(function(c){a!==c&&c.setState(\"\",!k)});g.removeClass(l);a.setState()}).on(\"click\",function(c){var b=function(){a.setVisible&&a.setVisible();f.allItems.forEach(function(b){a!==b&&b.setState(a.visible?\"inactive\":\"\",!k)})};g.removeClass(l);c={browserEvent:c};a.firePointEvent?a.firePointEvent(\"legendItemClick\",c,b):K(a,\"legendItemClick\",\nc,b)})})},createCheckboxForItem:function(a){a.checkbox=t(\"input\",{type:\"checkbox\",className:\"highcharts-legend-checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);J(a.checkbox,\"click\",function(c){K(a.series||a,\"checkboxClick\",{checked:c.target.checked,item:a},function(){a.select()})})}});v(g.prototype,{showResetZoom:function(){function a(){c.zoomOut()}var c=this,d=D.lang,f=c.options.chart.resetZoomButton,g=f.theme,k=g.states,l=\"chart\"===f.relativeTo||\n\"spaceBox\"===f.relativeTo?null:\"plotBox\";K(this,\"beforeShowResetZoom\",null,function(){c.resetZoomButton=c.renderer.button(d.resetZoom,null,null,a,g,k&&k.hover).attr({align:f.position.align,title:d.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(f.position,!1,l)});K(this,\"afterShowResetZoom\")},zoomOut:function(){K(this,\"selection\",{resetSelection:!0},this.zoom)},zoom:function(a){var c=this,f,g=c.pointer,k=!1,l=c.inverted?g.mouseDownX:g.mouseDownY;!a||a.resetSelection?(c.axes.forEach(function(a){f=\na.zoom()}),g.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var d=a.axis,e=c.inverted?d.left:d.top,b=c.inverted?e+d.width:e+d.height,h=d.isXAxis,m=!1;if(!h&&l>=e&&l<=b||h||!L(l))m=!0;g[h?\"zoomX\":\"zoomY\"]&&m&&(f=d.zoom(a.min,a.max),d.displayBtn&&(k=!0))});var m=c.resetZoomButton;k&&!m?c.showResetZoom():!k&&I(m)&&(c.resetZoomButton=m.destroy());f&&c.redraw(d(c.options.chart.animation,a&&a.animation,100>c.pointCount))},pan:function(a,d){var f=this,g=f.hoverPoints,k=f.options.chart,l=f.options.mapNavigation&&\nf.options.mapNavigation.enabled,m;d=\"object\"===typeof d?d:{enabled:d,type:\"x\"};k&&k.panning&&(k.panning=d);var n=d.type;K(this,\"pan\",{originalEvent:a},function(){g&&g.forEach(function(a){a.setState()});var d=[1];\"xy\"===n?d=[1,0]:\"y\"===n&&(d=[0]);d.forEach(function(d){var b=f[d?\"xAxis\":\"yAxis\"][0],e=b.horiz,g=a[e?\"chartX\":\"chartY\"];e=e?\"mouseDownX\":\"mouseDownY\";var k=f[e],p=(b.pointRange||0)/2,q=b.reversed&&!f.inverted||!b.reversed&&f.inverted?-1:1,r=b.getExtremes(),u=b.toValue(k-g,!0)+p*q;q=b.toValue(k+\nb.len-g,!0)-p*q;var t=q<u;k=t?q:u;u=t?u:q;var w=b.hasVerticalPanning(),v=b.panningState;b.series.forEach(function(a){if(w&&!d&&(!v||v.isDirty)){var b=a.getProcessedData(!0);a=a.getExtremes(b.yData,!0);v||(v={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});C(a.dataMin)&&C(a.dataMax)&&(v.startMin=Math.min(a.dataMin,v.startMin),v.startMax=Math.max(a.dataMax,v.startMax))}});q=Math.min(c.pick(null===v||void 0===v?void 0:v.startMin,r.dataMin),p?r.min:b.toValue(b.toPixels(r.min)-b.minPixelPadding));\np=Math.max(c.pick(null===v||void 0===v?void 0:v.startMax,r.dataMax),p?r.max:b.toValue(b.toPixels(r.max)+b.minPixelPadding));b.panningState=v;b.isOrdinal||(t=q-k,0<t&&(u+=t,k=q),t=u-p,0<t&&(u=p,k-=t),b.series.length&&k!==r.min&&u!==r.max&&k>=q&&u<=p&&(b.setExtremes(k,u,!1,!1,{trigger:\"pan\"}),f.resetZoomButton||l||k===q||u===p||!n.match(\"y\")||(f.showResetZoom(),b.displayBtn=!1),m=!0),f[e]=g)});m&&f.redraw(!1);G(f.container,{cursor:\"move\"})})}});v(B.prototype,{select:function(a,c){var f=this,g=f.series,\nk=g.chart;this.selectedStaging=a=d(a,!f.selected);f.firePointEvent(a?\"select\":\"unselect\",{accumulate:c},function(){f.selected=f.options.selected=a;g.options.data[g.data.indexOf(f)]=f.options;f.setState(a&&\"select\");c||k.getSelectedPoints().forEach(function(a){var c=a.series;a.selected&&a!==f&&(a.selected=a.options.selected=!1,c.options.data[c.data.indexOf(a)]=a.options,a.setState(k.hoverPoints&&c.options.inactiveOtherPoints?\"inactive\":\"\"),a.firePointEvent(\"unselect\"))})});delete this.selectedStaging},\nonMouseOver:function(a){var c=this.series.chart,d=c.pointer;a=a?d.normalize(a):d.getChartCoordinatesFromPoint(this,c.inverted);d.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");this.series.options.inactiveOtherPoints||(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=this,c=p(a.series.options.point,a.options).events;a.events=c;m(c,function(c,d){r(c)&&\nJ(a,d,c)});this.hasImportedEvents=!0}},setState:function(a,c){var f=this.series,g=this.state,k=f.options.states[a||\"normal\"]||{},l=D.plotOptions[f.type].marker&&f.options.marker,m=l&&!1===l.enabled,n=l&&l.states&&l.states[a||\"normal\"]||{},p=!1===n.enabled,e=f.stateMarkerGraphic,b=this.marker||{},h=f.chart,q=f.halo,r,t=l&&f.markerAttribs;a=a||\"\";if(!(a===this.state&&!c||this.selected&&\"select\"!==a||!1===k.enabled||a&&(p||m&&!1===n.enabled)||a&&b.states&&b.states[a]&&!1===b.states[a].enabled)){this.state=\na;t&&(r=f.markerAttribs(this,a));if(this.graphic){g&&this.graphic.removeClass(\"highcharts-point-\"+g);a&&this.graphic.addClass(\"highcharts-point-\"+a);if(!h.styledMode){var y=f.pointAttribs(this,a);var A=d(h.options.chart.animation,k.animation);f.options.inactiveOtherPoints&&y.opacity&&((this.dataLabels||[]).forEach(function(a){a&&a.animate({opacity:y.opacity},A)}),this.connector&&this.connector.animate({opacity:y.opacity},A));this.graphic.animate(y,A)}r&&this.graphic.animate(r,d(h.options.chart.animation,\nn.animation,l.animation));e&&e.hide()}else{if(a&&n){g=b.symbol||f.symbol;e&&e.currentSymbol!==g&&(e=e.destroy());if(r)if(e)e[c?\"animate\":\"attr\"]({x:r.x,y:r.y});else g&&(f.stateMarkerGraphic=e=h.renderer.symbol(g,r.x,r.y,r.width,r.height).add(f.markerGroup),e.currentSymbol=g);!h.styledMode&&e&&e.attr(f.pointAttribs(this,a))}e&&(e[a&&this.isInside?\"show\":\"hide\"](),e.element.point=this)}a=k.halo;k=(e=this.graphic||e)&&e.visibility||\"inherit\";a&&a.size&&e&&\"hidden\"!==k&&!this.isCluster?(q||(f.halo=q=\nh.renderer.path().add(e.parentGroup)),q.show()[c?\"animate\":\"attr\"]({d:this.haloPath(a.size)}),q.attr({\"class\":\"highcharts-halo highcharts-color-\"+d(this.colorIndex,f.colorIndex)+(this.className?\" \"+this.className:\"\"),visibility:k,zIndex:-1}),q.point=this,h.styledMode||q.attr(v({fill:this.color||f.color,\"fill-opacity\":a.opacity},a.attributes))):q&&q.point&&q.point.haloPath&&q.animate({d:q.point.haloPath(0)},null,q.hide);K(this,\"afterSetState\")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-\na,this.plotY-a,2*a,2*a)}});v(y.prototype,{onMouseOver:function(){var a=this.chart,c=a.hoverSeries;a.pointer.setHoverChartIndex();if(c&&c!==this)c.onMouseOut();this.options.events.mouseOver&&K(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,c=this.chart,d=c.tooltip,f=c.hoverPoint;c.hoverSeries=null;if(f)f.onMouseOut();this&&a.events.mouseOut&&K(this,\"mouseOut\");!d||this.stickyTracking||d.shared&&!this.noSharedTooltip||d.hide();c.series.forEach(function(a){a.setState(\"\",\n!0)})},setState:function(a,c){var f=this,g=f.options,k=f.graph,l=g.inactiveOtherPoints,m=g.states,n=g.lineWidth,p=g.opacity,e=d(m[a||\"normal\"]&&m[a||\"normal\"].animation,f.chart.options.chart.animation);g=0;a=a||\"\";if(f.state!==a&&([f.group,f.markerGroup,f.dataLabelsGroup].forEach(function(b){b&&(f.state&&b.removeClass(\"highcharts-series-\"+f.state),a&&b.addClass(\"highcharts-series-\"+a))}),f.state=a,!f.chart.styledMode)){if(m[a]&&!1===m[a].enabled)return;a&&(n=m[a].lineWidth||n+(m[a].lineWidthPlus||\n0),p=d(m[a].opacity,p));if(k&&!k.dashstyle)for(m={\"stroke-width\":n},k.animate(m,e);f[\"zone-graph-\"+g];)f[\"zone-graph-\"+g].attr(m),g+=1;l||[f.group,f.markerGroup,f.dataLabelsGroup,f.labelBySeries].forEach(function(a){a&&a.animate({opacity:p},e)})}c&&l&&f.points&&f.setAllPointsToState(a)},setAllPointsToState:function(a){this.points.forEach(function(c){c.setState&&c.setState(a)})},setVisible:function(a,c){var d=this,f=d.chart,g=d.legendItem,k=f.options.chart.ignoreHiddenSeries,l=d.visible;var m=(d.visible=\na=d.options.visible=d.userOptions.visible=\"undefined\"===typeof a?!l:a)?\"show\":\"hide\";[\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"].forEach(function(a){if(d[a])d[a][m]()});if(f.hoverSeries===d||(f.hoverPoint&&f.hoverPoint.series)===d)d.onMouseOut();g&&f.legend.colorizeItem(d,a);d.isDirty=!0;d.options.stacking&&f.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d.linkedSeries.forEach(function(c){c.setVisible(a,!1)});k&&(f.isDirtyBox=!0);K(d,m);!1!==c&&f.redraw()},\nshow:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=this.options.selected=\"undefined\"===typeof a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);K(this,a?\"select\":\"unselect\")},drawTracker:f.drawTrackerGraph})});O(q,\"parts/Responsive.js\",[q[\"parts/Chart.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.find,y=c.isArray,B=c.isObject,H=c.merge,D=c.objectEach,J=c.pick,t=c.splat,G=c.uniqueKey;g.prototype.setResponsive=function(c,g){var t=\nthis.options.responsive,n=[],r=this.currentResponsive;!g&&t&&t.rules&&t.rules.forEach(function(c){\"undefined\"===typeof c._id&&(c._id=G());this.matchResponsiveRule(c,n)},this);g=H.apply(0,n.map(function(c){return q(t.rules,function(g){return g._id===c}).chartOptions}));g.isResponsiveOptions=!0;n=n.toString()||void 0;n!==(r&&r.ruleIds)&&(r&&this.update(r.undoOptions,c,!0),n?(r=this.currentOptions(g),r.isResponsiveOptions=!0,this.currentResponsive={ruleIds:n,mergedOptions:g,undoOptions:r},this.update(g,\nc,!0)):this.currentResponsive=void 0)};g.prototype.matchResponsiveRule=function(c,g){var q=c.condition;(q.callback||function(){return this.chartWidth<=J(q.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=J(q.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=J(q.minWidth,0)&&this.chartHeight>=J(q.minHeight,0)}).call(this)&&g.push(c._id)};g.prototype.currentOptions=function(c){function g(c,n,v,p){var m;D(c,function(c,l){if(!p&&-1<q.collectionsWithUpdate.indexOf(l))for(c=t(c),v[l]=[],m=0;m<Math.max(c.length,\nn[l].length);m++)n[l][m]&&(void 0===c[m]?v[l][m]=n[l][m]:(v[l][m]={},g(c[m],n[l][m],v[l][m],p+1)));else B(c)?(v[l]=y(c)?[]:{},g(c,n[l]||{},v[l],p+1)):v[l]=\"undefined\"===typeof n[l]?null:n[l]})}var q=this,n={};g(c,this.options,n,0);return n}});O(q,\"masters/highcharts.src.js\",[q[\"parts/Globals.js\"]],function(g){return g});q[\"masters/highcharts.src.js\"]._modules=q;return q[\"masters/highcharts.src.js\"]});\n//# sourceMappingURL=highcharts.js.map\n\n/***/ }),\n/* 532 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SummaryTooltip = function (_React$Component) {\n    _inherits(SummaryTooltip, _React$Component);\n\n    function SummaryTooltip() {\n        _classCallCheck(this, SummaryTooltip);\n\n        return _possibleConstructorReturn(this, (SummaryTooltip.__proto__ || Object.getPrototypeOf(SummaryTooltip)).apply(this, arguments));\n    }\n\n    _createClass(SummaryTooltip, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                left = _props.left,\n                top = _props.top,\n                color = _props.color,\n                children = _props.children;\n\n            var wrapperStyle = {\n                position: 'absolute',\n                left: left,\n                top: top\n            };\n            var contentStyle = {\n                borderColor: color\n            };\n            return _react2.default.createElement(\"div\", { ref: \"wrapper\", className: \"graph-tooltip__wrapper\", style: wrapperStyle }, _react2.default.createElement(\"div\", { ref: \"tooltip\", className: \"graph-tooltip\", style: contentStyle }, children));\n        }\n    }, {\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            this.adjustPosition();\n        }\n    }, {\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate() {\n            this.adjustPosition();\n        }\n        // Using ugly DOM manipulation instead of state to avoid potential infinite\n        // updates if the size calculation keeps changing up/down state on update\n\n    }, {\n        key: 'adjustPosition',\n        value: function adjustPosition() {\n            var $wrapper = (0, _jquery2.default)(this.refs.wrapper);\n            var $tooltip = (0, _jquery2.default)(this.refs.tooltip);\n            var topDelta = $wrapper.height() - this.props.top;\n            var direction = topDelta >= 0 ? 'down' : 'up';\n            if (direction === 'down') {\n                $wrapper.addClass('down');\n                $wrapper.removeClass('up');\n                $tooltip.addClass('down');\n                $tooltip.removeClass('up');\n            } else {\n                $wrapper.addClass('up');\n                $wrapper.removeClass('down');\n                $tooltip.addClass('up');\n                $tooltip.removeClass('down');\n            }\n        }\n    }]);\n\n    return SummaryTooltip;\n}(_react2.default.Component);\n\nexports.default = SummaryTooltip;\n\nSummaryTooltip.propTypes = {\n    top: _propTypes2.default.number.isRequired,\n    left: _propTypes2.default.number.isRequired,\n    color: _propTypes2.default.string\n};\n\n/***/ }),\n/* 533 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _mixin = __webpack_require__(268);\n\nvar _mixin2 = _interopRequireDefault(_mixin);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _document_mixin = __webpack_require__(985);\n\nvar _document_mixin2 = _interopRequireDefault(_document_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PieSlider = (0, _createReactClass2.default)({\n    displayName: 'PieSlider',\n\n    mixins: [_document_mixin2.default, _mixin2.default],\n    propTypes: {\n        items: _propTypes2.default.array,\n        initialSelection: _propTypes2.default.string,\n        minTickWidth: _propTypes2.default.number,\n        sliderWidth: _propTypes2.default.number,\n        graphType: _propTypes2.default.string,\n        onChange: _propTypes2.default.func.isRequired\n    },\n    getInitialState: function getInitialState() {\n        return {\n            sliderLocked: true\n        };\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            minTickWidth: 70,\n            sliderWidth: 600\n        };\n    },\n    componentDidMount: function componentDidMount() {\n        var _props = this.props,\n            initialSelection = _props.initialSelection,\n            items = _props.items;\n\n        this.onDocument('mouseup', this.handleSliderBlur);\n        this.onDocument('mousemove', this.handleSliderChange);\n        //Note below does not get called as `this.props.items` is empty on the first pass\n        //gets called when switching from graph with year to one without year\n        if (items && items.length > 1) {\n            this.handleTickSelection(this.getData().items, initialSelection);\n        }\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps) {\n        var _props2 = this.props,\n            items = _props2.items,\n            initialSelection = _props2.initialSelection;\n\n        if (!items || items.length <= 1) {\n            return;\n        }\n        var itemsDidUpdate = !prevProps.items || prevProps.items.length !== items.length;\n        var selectionDidUpdate = prevProps.initialSelection !== initialSelection;\n        //initialSelection -> final selected item, if want item in middle of selection need to use this.state.selected\n        if (itemsDidUpdate || selectionDidUpdate) {\n            var index = initialSelection; //not using `this.state.selected.index` as on first load it's not defined yet\n            // we pass false as the last parameter because we do not want to call the onChange prop\n            this.handleTickSelection(this.getData().items, index);\n        }\n        this.setState({\n            maximumLabelHeight: this.computeMaximumLabelHeight()\n        });\n    },\n    render: function render() {\n        var _this = this;\n\n        if (!this.props.items || !this.props.items.length) {\n            return null;\n        }\n        var data = this.getData();\n        var items = data.items;\n        var tickStyle = { width: data.tickWidth, marginLeft: (data.itemWidth - data.tickWidth) / 2 };\n        return items.length > 1 ? _react2.default.createElement(\"div\", { className: \"pie-slider\", style: { width: this.props.sliderWidth } }, _react2.default.createElement(\"ul\", { className: \"pie-slider__years js-slider-years\", ref: \"sliderTicks\" }, items.map(function (item, index) {\n            //Ternary is essentail as undefined on initial load\n            var i = _typeof(_this.state.selected) === 'object' ? _this.state.selected.index : _this.state.selected;\n            var isSelected = i === item.index; //temporary measure, the use of i....\n            var labelClassName = (0, _classnames2.default)({\n                'pie-slider__year__text': true,\n                'is-selected': isSelected\n            });\n            return _react2.default.createElement(\"li\", { key: index, className: \"pie-slider__year\", style: { width: data.itemWidth }, onClick: _lodash2.default.partial(_this.handleTickSelection, items, item.index) }, _react2.default.createElement(\"span\", { style: tickStyle, className: labelClassName, dangerouslySetInnerHTML: { __html: item.html } }), item.isVisible ? //Only showing year tick marker if item.isVisible === true; meaning that there is enough space\n            !isSelected ? _react2.default.createElement(\"span\", { className: \"pie-slider__year__marker\" }) : null : null);\n        })), _react2.default.createElement(\"div\", { style: { marginBottom: this.state.maximumLabelHeight } }, _react2.default.createElement(\"div\", { className: \"pie-slider__bar js-slider-bar\", ref: \"sliderBar\" }, _react2.default.createElement(\"div\", { className: \"pie-slider__handle js-slider-handle\", ref: \"sliderHandle\", style: { left: this.state.sliderPosition }, onMouseDown: this.handleSliderFocus }, _react2.default.createElement(\"span\", { className: \"icon-lefthead-2\" }), _react2.default.createElement(\"span\", { className: \"icon-righthead-2\" }))))) : null;\n    },\n    getData: function getData() {\n        var data = {};\n        var items = this.props.items;\n        var minTickWidth = this.props.minTickWidth;\n        var sliderWidth = this.props.sliderWidth - minTickWidth / 2;\n        var itemWidth = sliderWidth / items.length;\n        var tickWidth = itemWidth < minTickWidth ? minTickWidth : itemWidth;\n        var visibleTicks = Math.round(sliderWidth / tickWidth);\n        var tickInterval = Math.round(items.length / visibleTicks);\n        data.items = items.map(function (item, index) {\n            return {\n                index: item.key,\n                value: item.value,\n                minPosition: index * itemWidth,\n                html: _strings2.default.nl2br(_underscore2.default.escapeHTML(item.value)),\n                maxPosition: index * itemWidth + itemWidth,\n                isVisible: (items.length - 1 - index) % tickInterval === 0,\n                centerPosition: index * itemWidth + itemWidth / 2\n            };\n        });\n        data.itemWidth = itemWidth;\n        data.tickWidth = tickWidth;\n        return data;\n    },\n    getHandleCenter: function getHandleCenter(pageX) {\n        var $bar = (0, _jquery2.default)(this.refs.sliderBar);\n        var sliderOffsetX = $bar.offset().left;\n        var position = pageX - sliderOffsetX;\n        position = position < 0 ? 0 : position;\n        position = position > this.props.sliderWidth ? this.props.sliderWidth : position;\n        return position;\n    },\n    getItemFromPosition: function getItemFromPosition(items, pageX) {\n        var handleCenter = this.getHandleCenter(pageX, this.props.sliderWidth);\n        return _lodash2.default.head(_lodash2.default.filter(items, function (value) {\n            return handleCenter >= value.minPosition && handleCenter <= value.maxPosition;\n        }));\n    },\n    handleTickSelection: function handleTickSelection(items, index, position) {\n        var shouldCallOnChange = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n        var shouldSaveState = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\n        var selected = _lodash2.default.find(items, _lodash2.default.bind(function (item) {\n            if (item.index === index) {\n                return item;\n            }\n        }, this));\n        // if we happen to have no selected item, just give us the last one\n        // and set index to a number and not Infinity\n        if (!selected) {\n            selected = _lodash2.default.last(items);\n            index = items.length - 1;\n        }\n        this.setState({\n            selected: selected,\n            sliderPosition: position || selected.centerPosition\n        });\n        if (shouldCallOnChange) {\n            this.props.onChange(index, shouldSaveState);\n        }\n    },\n    handleSliderChange: function handleSliderChange(event) {\n        if (!this.state.sliderLocked) {\n            event.preventDefault();\n            var position = this.getHandleCenter(event.pageX);\n            var item = this.getItemFromPosition(this.getData().items, event.pageX);\n            var selected = item ? item : this.state.selected; //this value is in realtime, if want to do realtime changing of bar data do check for this.state.selected\n            // we pass true and false here because we want to call the onChange prop but do not want to save grid state\n            this.handleTickSelection(this.getData().items, selected.index, position, true, false);\n        }\n    },\n    handleSliderBlur: function handleSliderBlur() {\n        if (!this.state.sliderLocked) {\n            this.setState({ sliderLocked: true });\n            var selected = this.state.selected;\n\n            this.handleTickSelection(this.getData().items, selected.index, selected.centerPosition, true, true);\n        }\n    },\n    handleSliderFocus: function handleSliderFocus() {\n        this.setState({ sliderLocked: false });\n    },\n    computeMaximumLabelHeight: function computeMaximumLabelHeight() {\n        return (0, _jquery2.default)(this.refs.sliderTicks).outerHeight() + 14;\n    }\n});\nexports.default = PieSlider;\n\n/***/ }),\n/* 534 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports['default'] = shouldPureComponentUpdate;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _shallowEqual = __webpack_require__(984);\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nfunction shouldPureComponentUpdate(nextProps, nextState) {\n  return !(0, _shallowEqual2['default'])(this.props, nextProps) || !(0, _shallowEqual2['default'])(this.state, nextState);\n}\n\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 535 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getAnimationDuration = exports.SHADES_MULTIPLIER = exports.HIGHLIGHT_OPACITY = exports.FAINT_OPACITY = exports.MIDDLE_OPACITY = exports.REGULAR_OPACITY = exports.ANIMATION_DURATION = undefined;\nexports.setColorOpacityForDataSetType = setColorOpacityForDataSetType;\nexports.getFillOpacity = getFillOpacity;\nexports.getColorForDatasetType = getColorForDatasetType;\nexports.getDashStyleForDatasetType = getDashStyleForDatasetType;\nexports.setPointStateForSeries = setPointStateForSeries;\nexports.getPatternFillForColor = getPatternFillForColor;\nexports.getPatternFillForColors = getPatternFillForColors;\nexports.getPatternStringForColor = getPatternStringForColor;\nexports.filterSelectedSeries = filterSelectedSeries;\nexports.matchColor = matchColor;\nexports.saturateAndDarken = saturateAndDarken;\nexports.brightenSVGArea = brightenSVGArea;\nexports.brightenSeries = brightenSeries;\nexports.sortLegendData = sortLegendData;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _chromaJs = __webpack_require__(990);\n\nvar _chromaJs2 = _interopRequireDefault(_chromaJs);\n\nvar _dataset_utils = __webpack_require__(142);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ANIMATION_DURATION = exports.ANIMATION_DURATION = 350;\nvar REGULAR_OPACITY = exports.REGULAR_OPACITY = 0.75;\nvar MIDDLE_OPACITY = exports.MIDDLE_OPACITY = 0.55;\nvar FAINT_OPACITY = exports.FAINT_OPACITY = 0.35;\nvar HIGHLIGHT_OPACITY = exports.HIGHLIGHT_OPACITY = 0.1;\nvar SHADES_MULTIPLIER = exports.SHADES_MULTIPLIER = 2;\n/**\r\n * Returns an animation configuration object for Highcharts.\r\n * @return {Object} Animation config\r\n */\nvar getAnimationDuration = exports.getAnimationDuration = function getAnimationDuration() {\n    return {\n        animation: ANIMATION_DURATION\n    };\n};\n/**\r\n * Returns an RGB color based on a hex color and an opacity.\r\n * @param   {String} color       The hex value of the color\r\n * @param   {Number} fillOpacity The opacity with which the color should be set\r\n * @returns {String} An RGBA value to be consumed by Highcharts\r\n */\nfunction setColorOpacityForDataSetType(color, fillOpacity) {\n    var dataSetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n    return (0, _dataset_utils.isProjectionType)(dataSetType) || (0, _dataset_utils.isBudgetType)(dataSetType) ? color : (0, _chromaJs2.default)(color).alpha(fillOpacity).css();\n}\n/**\r\n * Returns the fill opacity based on the dataset type and graph type.\r\n * @param  {String} dataSetType The dataset type\r\n * @param  {String} graphType   The current graphType\r\n * @return {Number} Opacity\r\n */\nfunction getFillOpacity(dataSetType, graphType) {\n    if ((0, _dataset_utils.isActualType)(dataSetType)) {\n        return REGULAR_OPACITY;\n    }\n    return graphType === 'column' ? FAINT_OPACITY * 2 : FAINT_OPACITY;\n}\n/**\r\n * Returns a color for a dataset based on its original color and dataset type.\r\n * @param  {String} color       The hex value of the color\r\n * @param  {String} dataSetType The type of the dataset, e.g. budget, projection\r\n * @return {String} The value of the color\r\n */\nfunction getColorForDatasetType(color, dataSetType) {\n    if ((0, _dataset_utils.isProjectionType)(dataSetType) || (0, _dataset_utils.isBudgetType)(dataSetType)) {\n        return getPatternStringForColor(color, dataSetType);\n    }\n    return setColorOpacityForDataSetType(color, REGULAR_OPACITY);\n}\n/**\r\n * Returns the style of the dataset based on its type.\r\n * @param  {String} dataSetType The dataset type, e.g. budget, actual, etc.\r\n * @return {String} The dash style for the dataset\r\n */\nfunction getDashStyleForDatasetType(dataSetType) {\n    if ((0, _dataset_utils.isBudgetType)(dataSetType)) {\n        return 'shortdash';\n    } else if ((0, _dataset_utils.isProjectionType)(dataSetType)) {\n        return 'dash';\n    } else if ((0, _dataset_utils.isActualType)(dataSetType)) {\n        return '';\n    }\n}\n/**\r\n * Sets the point state of a series.\r\n * @param {Array<Object>} seriesList The array of series\r\n * @param {String}        state  Optional parameter with which the state of the series will be set to\r\n */\nfunction setPointStateForSeries(seriesList) {\n    var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _lodash2.default.each(seriesList, function (serie) {\n        _lodash2.default.each(serie.data, function (point) {\n            return point.setState(state);\n        });\n    });\n}\n/**\r\n * Generates a pattern fill based on a hex color and an opacity.\r\n * The current SVG pattern is a striped line.\r\n * @param  {String}  color          The hex string\r\n * @param  {Number}  fillOpacity    The opacity of the fill behind the stroke\r\n * @param  {Boolean} isHighlighting If we are highlighting or not\r\n * @return {Object}  The patternfill object that the Highcharts pattern fill plugin will consume\r\n */\nfunction getPatternFillForColor(color, dataSetType) {\n    var isHighlighting = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n    var strokeWidth = void 0;\n    var strokeOpacity = REGULAR_OPACITY;\n    var fillOpacity = isHighlighting ? MIDDLE_OPACITY : FAINT_OPACITY;\n    var height = 10;\n    var width = 10;\n    var delta = 1;\n    if ((0, _dataset_utils.isBudgetType)(dataSetType)) {\n        strokeWidth = 4;\n    } else if ((0, _dataset_utils.isProjectionType)(dataSetType)) {\n        strokeWidth = 2;\n    }\n    return {\n        id: dataSetType + '-' + color,\n        path: {\n            d: 'M 0 ' + height + ' L ' + width + ' 0 M ' + -delta + ' ' + delta + ' L ' + delta + ' ' + -delta + ' M ' + (width - delta) + ' ' + (height + delta) + ' L ' + (width + delta) + ' ' + (height - delta),\n            stroke: setColorOpacityForDataSetType(color, strokeOpacity),\n            strokeWidth: strokeWidth,\n            fill: setColorOpacityForDataSetType(color, fillOpacity)\n        }\n    };\n}\n/**\r\n * Generates pattern fills for an array of colors.\r\n * @param  {Array<String>} colors      An array of colors represented as hex\r\n * @return {Array<Object>} An array of pattern fill objects that the Highcharts pattern fill plugin will consume\r\n */\nfunction getPatternFillForColors(colors, dataSetType) {\n    var allColors = _lodash2.default.map(colors, function (color) {\n        return getPatternFillForColor(color, dataSetType);\n    });\n    var isHighlighting = true;\n    return allColors.concat(_lodash2.default.map(colors, function (color) {\n        return getPatternFillForColor(saturateAndDarken(color).hex(), dataSetType, isHighlighting);\n    }));\n}\n/**\r\n * Generates the string needed to specify which Highcharts pattern should be accessed.\r\n * @param  {String} color The color represented as hex\r\n * @return {String} The pattern string\r\n */\nfunction getPatternStringForColor(color, dataSetType) {\n    return 'url(#' + dataSetType + '-' + color + ')';\n}\n/**\r\n * Takes an array of data series and returns the selected series.\r\n * @param  {Array}  series   The array of series for the chart\r\n * @param  {Number} seriesId The id of the series to be selected\r\n * @return {Object} The selected series\r\n */\nfunction filterSelectedSeries(series, seriesId) {\n    return _lodash2.default.filter(series, function (s) {\n        return s.options.id === seriesId;\n    });\n}\n/**\r\n * Returns a match for hex color code.\r\n * @param  {string} color String to be matched for a hex color\r\n * @return {string}       The matched color\r\n */\nfunction matchColor(color) {\n    var colorMatch = color.match(/\\b[0-9A-F]{6}\\b/gi);\n    return colorMatch && colorMatch[0];\n}\n/**\r\n * Return a color that has been saturated and darkened.\r\n * @param  {string} color Any color string that chroma-js accepts\r\n * @return {object}       A chroma js color object\r\n */\nfunction saturateAndDarken(color) {\n    return (0, _chromaJs2.default)(color).saturate(0.5).darken(0.1);\n}\n/**\r\n * Brightens an SVG area by setting the fill value to a derived color.\r\n * @param  {Object} area          The SVG area\r\n * @param  {Number} alpha         The alpha with which to alter the area fill\r\n * @param  {String} originalColor The original color of the SVG\r\n * @param  {String} dataType      The data type we are working with\r\n */\nfunction brightenSVGArea(area, alpha, originalColor) {\n    var dataType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var areaFill = _lodash2.default.get(area, 'element.attributes.fill');\n    if (areaFill) {\n        var areaFillColorMatch = matchColor(areaFill.value);\n        var color = saturateAndDarken(areaFillColorMatch || areaFill.value).css();\n        if ((0, _dataset_utils.isProjectionType)(dataType) || (0, _dataset_utils.isBudgetType)(dataType)) {\n            var matchedHex = saturateAndDarken(matchColor(originalColor)).hex();\n            color = getPatternStringForColor(matchedHex, dataType);\n        }\n        var isHighlighting = alpha > 0;\n        area.element.attributes.fill.value = isHighlighting ? color : originalColor;\n    }\n}\n/**\r\n * Brightens a Highchart series.\r\n * @param  {Array<Object>} seriesList The array of series in our chart\r\n * @param  {Number}        alpha  The alpha with which to alter the area fill\r\n * @param  {String}        state  Optional parameter with which the state of the series will be set to\r\n */\nfunction brightenSeries(seriesList, alpha) {\n    var state = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n    var series_id = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    _lodash2.default.each(seriesList, function (s) {\n        var chartType = s.userOptions.type;\n        s.setState(state);\n        if (chartType === 'column') {\n            _lodash2.default.each(s.data, function (d) {\n                var columnColor = d.color;\n                brightenSVGArea(d.graphic, alpha, columnColor, d.dataType);\n            });\n        } else if (chartType === 'pie' || chartType === 'treemap' || chartType === 'bar') {\n            (0, _lodash2.default)(s.data).filter(function (d) {\n                return d.series_id === series_id;\n            }).each(function (d) {\n                brightenSVGArea(d.graphic, alpha, d.color, d.dataType);\n            });\n        } else {\n            // NOTE: we get the last data item dataType, because that's the actual data type for the serie's area\n            // regarding to our algorithm, we overlap the area data type with the previous serie.\n            // FIXME: ehh, probably needs to be fixed in report v2.\n            brightenSVGArea(s.area, alpha, s.color, s.data[s.data.length - 1].dataType);\n        }\n    });\n}\n/**\r\n * Sorts a Highchart series legend data.\r\n * @param  {Array<Object>} seriesData The array of series data in our chart, by default accepts array sorted in ascending order of total/amount\r\n * @param  {String}        sortBy  Sort order for array data\r\n */\nfunction sortLegendData(seriesData, sortBy) {\n    if (sortBy == 'desc') {\n        seriesData = seriesData.reverse();\n    }\n    if (sortBy == 'alpha') {\n        seriesData = _lodash2.default.sortBy(seriesData, function (series) {\n            return series.name;\n        });\n    }\n    if (sortBy == 'alpha_rev') {\n        seriesData = _lodash2.default.sortBy(seriesData, function (series) {\n            return series.name;\n        }).reverse();\n    }\n    var show_more = _lodash2.default.remove(seriesData, function (series) {\n        return series.name == 'Show More';\n    });\n    seriesData.push(show_more);\n    seriesData = _lodash2.default.flattenDeep(seriesData);\n    return seriesData;\n}\n\n/***/ }),\n/* 536 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MiniLoader = function MiniLoader(_ref) {\n    var isError = _ref.isError,\n        isLoading = _ref.isLoading;\n\n    return isError ? _react2.default.createElement(\"div\", { className: \"aggregate-viz__status negative\" }, _react2.default.createElement(\"div\", { className: \"aggregate-viz__status__icon icon-exclamation-1\" }), _react2.default.createElement(\"strong\", null, \"Something is wrong\"), \" visualization is out of sync\") : isLoading ? _react2.default.createElement(\"div\", { className: \"aggregate-viz__status\" }, _react2.default.createElement(\"div\", { className: \"aggregate-viz__status__spinner\" }), _react2.default.createElement(\"strong\", null, \"Loading\")) : _react2.default.createElement(\"noscript\", null) /*TODO: update this to be null once we upgrade react*/;\n};\nMiniLoader.propTypes = {\n    isError: _propTypes2.default.bool,\n    isLoading: _propTypes2.default.bool\n};\nexports.default = MiniLoader;\n\n/***/ }),\n/* 537 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module, global, process) {var __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Diposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an array using Array.observe.\n   * @param {Array} array An array to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n   */\n  Observable.ofArrayChanges = function(array) {\n    if (!Array.isArray(array)) { throw new TypeError('Array.observe only accepts arrays.'); }\n    if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n      \n      Array.observe(array, observerFn);\n\n      return function () {\n        Array.unobserve(array, observerFn);\n      };\n    });\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an object using Object.observe.\n   * @param {Object} obj An object to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n   */\n  Observable.ofObjectChanges = function(obj) {\n    if (obj == null) { throw new TypeError('object must not be null or undefined.'); }\n    if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') { throw new TypeError('Object.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n\n      Object.observe(obj, observerFn);\n\n      return function () {\n        Object.unobserve(obj, observerFn);\n      };\n    });\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (true) {\n    root.Rx = Rx;\n\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return Rx;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module), __webpack_require__(17), __webpack_require__(116)))\n\n/***/ }),\n/* 538 */\n/***/ (function(module, exports) {\n\n/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\n\nmodule.exports = UnitBezier;\n\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n    this.cx = 3.0 * p1x;\n    this.bx = 3.0 * (p2x - p1x) - this.cx;\n    this.ax = 1.0 - this.cx - this.bx;\n\n    this.cy = 3.0 * p1y;\n    this.by = 3.0 * (p2y - p1y) - this.cy;\n    this.ay = 1.0 - this.cy - this.by;\n\n    this.p1x = p1x;\n    this.p1y = p2y;\n    this.p2x = p2x;\n    this.p2y = p2y;\n}\n\nUnitBezier.prototype.sampleCurveX = function(t) {\n    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n    return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\n\nUnitBezier.prototype.sampleCurveY = function(t) {\n    return ((this.ay * t + this.by) * t + this.cy) * t;\n};\n\nUnitBezier.prototype.sampleCurveDerivativeX = function(t) {\n    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\n\nUnitBezier.prototype.solveCurveX = function(x, epsilon) {\n    if (typeof epsilon === 'undefined') epsilon = 1e-6;\n\n    var t0, t1, t2, x2, i;\n\n    // First try a few iterations of Newton's method -- normally very fast.\n    for (t2 = x, i = 0; i < 8; i++) {\n\n        x2 = this.sampleCurveX(t2) - x;\n        if (Math.abs(x2) < epsilon) return t2;\n\n        var d2 = this.sampleCurveDerivativeX(t2);\n        if (Math.abs(d2) < 1e-6) break;\n\n        t2 = t2 - x2 / d2;\n    }\n\n    // Fall back to the bisection method for reliability.\n    t0 = 0.0;\n    t1 = 1.0;\n    t2 = x;\n\n    if (t2 < t0) return t0;\n    if (t2 > t1) return t1;\n\n    while (t0 < t1) {\n\n        x2 = this.sampleCurveX(t2);\n        if (Math.abs(x2 - x) < epsilon) return t2;\n\n        if (x > x2) {\n            t0 = t2;\n        } else {\n            t1 = t2;\n        }\n\n        t2 = (t1 - t0) * 0.5 + t0;\n    }\n\n    // Failure.\n    return t2;\n};\n\nUnitBezier.prototype.solve = function(x, epsilon) {\n    return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\n\n\n/***/ }),\n/* 539 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nif (typeof module !== 'undefined' && module.exports) {\n    module.exports = isSupported;\n} else if (window) {\n    window.mapboxgl = window.mapboxgl || {};\n    window.mapboxgl.supported = isSupported;\n}\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n    return !!(\n        isBrowser() &&\n        isArraySupported() &&\n        isFunctionSupported() &&\n        isObjectSupported() &&\n        isJSONSupported() &&\n        isWorkerSupported() &&\n        isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)\n    );\n}\n\nfunction isBrowser() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isArraySupported() {\n    return (\n        Array.prototype &&\n        Array.prototype.every &&\n        Array.prototype.filter &&\n        Array.prototype.forEach &&\n        Array.prototype.indexOf &&\n        Array.prototype.lastIndexOf &&\n        Array.prototype.map &&\n        Array.prototype.some &&\n        Array.prototype.reduce &&\n        Array.prototype.reduceRight &&\n        Array.isArray\n    );\n}\n\nfunction isFunctionSupported() {\n    return Function.prototype && Function.prototype.bind;\n}\n\nfunction isObjectSupported() {\n    return (\n        Object.keys &&\n        Object.create &&\n        Object.getPrototypeOf &&\n        Object.getOwnPropertyNames &&\n        Object.isSealed &&\n        Object.isFrozen &&\n        Object.isExtensible &&\n        Object.getOwnPropertyDescriptor &&\n        Object.defineProperty &&\n        Object.defineProperties &&\n        Object.seal &&\n        Object.freeze &&\n        Object.preventExtensions\n    );\n}\n\nfunction isJSONSupported() {\n    return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n}\n\nfunction isWorkerSupported() {\n    return 'Worker' in window;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n    if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n        isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n    }\n\n    return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n    antialias: false,\n    alpha: true,\n    stencil: true,\n    depth: true\n};\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n\n    var canvas = document.createElement('canvas');\n\n    var attributes = Object.create(isSupported.webGLContextAttributes);\n    attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n    if (canvas.probablySupportsContext) {\n        return (\n            canvas.probablySupportsContext('webgl', attributes) ||\n            canvas.probablySupportsContext('experimental-webgl', attributes)\n        );\n\n    } else if (canvas.supportsContext) {\n        return (\n            canvas.supportsContext('webgl', attributes) ||\n            canvas.supportsContext('experimental-webgl', attributes)\n        );\n\n    } else {\n        return (\n            canvas.getContext('webgl', attributes) ||\n            canvas.getContext('experimental-webgl', attributes)\n        );\n    }\n}\n\n\n/***/ }),\n/* 540 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(55);\nvar StyleLayer = __webpack_require__(100);\nvar ImageSprite = __webpack_require__(1027);\nvar GlyphSource = __webpack_require__(1028);\nvar SpriteAtlas = __webpack_require__(1033);\nvar LineAtlas = __webpack_require__(1034);\nvar util = __webpack_require__(10);\nvar ajax = __webpack_require__(88);\nvar normalizeURL = __webpack_require__(122).normalizeStyleURL;\nvar browser = __webpack_require__(39);\nvar Dispatcher = __webpack_require__(1035);\nvar AnimationLoop = __webpack_require__(559);\nvar validateStyle = __webpack_require__(544);\nvar Source = __webpack_require__(194);\nvar styleSpec = __webpack_require__(543);\nvar StyleFunction = __webpack_require__(273);\n\nmodule.exports = Style;\n\nfunction Style(stylesheet, animationLoop, workerCount) {\n    this.animationLoop = animationLoop || new AnimationLoop();\n    this.dispatcher = new Dispatcher(workerCount || 1, this);\n    this.spriteAtlas = new SpriteAtlas(512, 512);\n    this.lineAtlas = new LineAtlas(256, 512);\n\n    this._layers = {};\n    this._order  = [];\n    this._groups = [];\n    this.sources = {};\n    this.zoomHistory = {};\n\n    util.bindAll([\n        '_forwardSourceEvent',\n        '_forwardTileEvent',\n        '_forwardLayerEvent',\n        '_redoPlacement'\n    ], this);\n\n    this._resetUpdates();\n\n    var loaded = function(err, stylesheet) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        if (validateStyle.emitErrors(this, validateStyle(stylesheet))) return;\n\n        this._loaded = true;\n        this.stylesheet = stylesheet;\n\n        this.updateClasses();\n\n        var sources = stylesheet.sources;\n        for (var id in sources) {\n            this.addSource(id, sources[id]);\n        }\n\n        if (stylesheet.sprite) {\n            this.sprite = new ImageSprite(stylesheet.sprite);\n            this.sprite.on('load', this.fire.bind(this, 'change'));\n        }\n\n        this.glyphSource = new GlyphSource(stylesheet.glyphs);\n        this._resolve();\n        this.fire('load');\n    }.bind(this);\n\n    if (typeof stylesheet === 'string') {\n        ajax.getJSON(normalizeURL(stylesheet), loaded);\n    } else {\n        browser.frame(loaded.bind(this, null, stylesheet));\n    }\n\n    this.on('source.load', function(event) {\n        var source = event.source;\n        if (source && source.vectorLayerIds) {\n            for (var layerId in this._layers) {\n                var layer = this._layers[layerId];\n                if (layer.source === source.id) {\n                    this._validateLayer(layer);\n                }\n            }\n        }\n    });\n}\n\nStyle.prototype = util.inherit(Evented, {\n    _loaded: false,\n\n    _validateLayer: function(layer) {\n        var source = this.sources[layer.source];\n\n        if (!layer.sourceLayer) return;\n        if (!source) return;\n        if (!source.vectorLayerIds) return;\n\n        if (source.vectorLayerIds.indexOf(layer.sourceLayer) === -1) {\n            this.fire('error', {\n                error: new Error(\n                    'Source layer \"' + layer.sourceLayer + '\" ' +\n                    'does not exist on source \"' + source.id + '\" ' +\n                    'as specified by style layer \"' + layer.id + '\"'\n                )\n            });\n        }\n    },\n\n    loaded: function() {\n        if (!this._loaded)\n            return false;\n\n        for (var id in this.sources)\n            if (!this.sources[id].loaded())\n                return false;\n\n        if (this.sprite && !this.sprite.loaded())\n            return false;\n\n        return true;\n    },\n\n    _resolve: function() {\n        var layer, layerJSON;\n\n        this._layers = {};\n        this._order  = this.stylesheet.layers.map(function(layer) {\n            return layer.id;\n        });\n\n        // resolve all layers WITHOUT a ref\n        for (var i = 0; i < this.stylesheet.layers.length; i++) {\n            layerJSON = this.stylesheet.layers[i];\n            if (layerJSON.ref) continue;\n            layer = StyleLayer.create(layerJSON);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        // resolve all layers WITH a ref\n        for (var j = 0; j < this.stylesheet.layers.length; j++) {\n            layerJSON = this.stylesheet.layers[j];\n            if (!layerJSON.ref) continue;\n            var refLayer = this.getLayer(layerJSON.ref);\n            layer = StyleLayer.create(layerJSON, refLayer);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        this._groupLayers();\n        this._updateWorkerLayers();\n    },\n\n    _groupLayers: function() {\n        var group;\n\n        this._groups = [];\n\n        // Split into groups of consecutive top-level layers with the same source.\n        for (var i = 0; i < this._order.length; ++i) {\n            var layer = this._layers[this._order[i]];\n\n            if (!group || layer.source !== group.source) {\n                group = [];\n                group.source = layer.source;\n                this._groups.push(group);\n            }\n\n            group.push(layer);\n        }\n    },\n\n    _updateWorkerLayers: function(ids) {\n        this.dispatcher.broadcast(ids ? 'update layers' : 'set layers', this._serializeLayers(ids));\n    },\n\n    _serializeLayers: function(ids) {\n        ids = ids || this._order;\n        var serialized = [];\n        var options = {includeRefProperties: true};\n        for (var i = 0; i < ids.length; i++) {\n            serialized.push(this._layers[ids[i]].serialize(options));\n        }\n        return serialized;\n    },\n\n    _applyClasses: function(classes, options) {\n        if (!this._loaded) return;\n\n        classes = classes || [];\n        options = options || {transition: true};\n        var transition = this.stylesheet.transition || {};\n\n        var layers = this._updates.allPaintProps ? this._layers : this._updates.paintProps;\n\n        for (var id in layers) {\n            var layer = this._layers[id];\n            var props = this._updates.paintProps[id];\n\n            if (this._updates.allPaintProps || props.all) {\n                layer.updatePaintTransitions(classes, options, transition, this.animationLoop);\n            } else {\n                for (var paintName in props) {\n                    this._layers[id].updatePaintTransition(paintName, classes, options, transition, this.animationLoop);\n                }\n            }\n        }\n    },\n\n    _recalculate: function(z) {\n        for (var sourceId in this.sources)\n            this.sources[sourceId].used = false;\n\n        this._updateZoomHistory(z);\n\n        this.rasterFadeDuration = 300;\n        for (var layerId in this._layers) {\n            var layer = this._layers[layerId];\n\n            layer.recalculate(z, this.zoomHistory);\n            if (!layer.isHidden(z) && layer.source) {\n                this.sources[layer.source].used = true;\n            }\n        }\n\n        var maxZoomTransitionDuration = 300;\n        if (Math.floor(this.z) !== Math.floor(z)) {\n            this.animationLoop.set(maxZoomTransitionDuration);\n        }\n\n        this.z = z;\n        this.fire('zoom');\n    },\n\n    _updateZoomHistory: function(z) {\n\n        var zh = this.zoomHistory;\n\n        if (zh.lastIntegerZoom === undefined) {\n            // first time\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = 0;\n            zh.lastZoom = z;\n        }\n\n        // check whether an integer zoom level as passed since the last frame\n        // and if yes, record it with the time. Used for transitioning patterns.\n        if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = Date.now();\n\n        } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z + 1);\n            zh.lastIntegerZoomTime = Date.now();\n        }\n\n        zh.lastZoom = z;\n    },\n\n    _checkLoaded: function () {\n        if (!this._loaded) {\n            throw new Error('Style is not done loading');\n        }\n    },\n\n    /**\n     * Apply queued style updates in a batch\n     * @private\n     */\n    update: function(classes, options) {\n        if (!this._updates.changed) return this;\n\n        if (this._updates.allLayers) {\n            this._groupLayers();\n            this._updateWorkerLayers();\n        } else {\n            var updatedIds = Object.keys(this._updates.layers);\n            if (updatedIds.length) {\n                this._updateWorkerLayers(updatedIds);\n            }\n        }\n\n        var updatedSourceIds = Object.keys(this._updates.sources);\n        var i;\n        for (i = 0; i < updatedSourceIds.length; i++) {\n            this._reloadSource(updatedSourceIds[i]);\n        }\n\n        for (i = 0; i < this._updates.events.length; i++) {\n            var args = this._updates.events[i];\n            this.fire(args[0], args[1]);\n        }\n\n        this._applyClasses(classes, options);\n\n        if (this._updates.changed) {\n            this.fire('change');\n        }\n\n        this._resetUpdates();\n\n        return this;\n    },\n\n    _resetUpdates: function() {\n        this._updates = {\n            events: [],\n            layers: {},\n            sources: {},\n            paintProps: {}\n        };\n    },\n\n    addSource: function(id, source) {\n        this._checkLoaded();\n        if (this.sources[id] !== undefined) {\n            throw new Error('There is already a source with this ID');\n        }\n        if (!Source.is(source) && this._handleErrors(validateStyle.source, 'sources.' + id, source)) return this;\n\n        source = Source.create(source);\n        this.sources[id] = source;\n        source.id = id;\n        source.style = this;\n        source.dispatcher = this.dispatcher;\n        source\n            .on('load', this._forwardSourceEvent)\n            .on('error', this._forwardSourceEvent)\n            .on('change', this._forwardSourceEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.load', this._forwardTileEvent)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.add', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Remove a source from this stylesheet, given its id.\n     * @param {string} id id of the source to remove\n     * @returns {Style} this style\n     * @throws {Error} if no source is found with the given ID\n     * @private\n     */\n    removeSource: function(id) {\n        this._checkLoaded();\n\n        if (this.sources[id] === undefined) {\n            throw new Error('There is no source with this ID');\n        }\n        var source = this.sources[id];\n        delete this.sources[id];\n        source\n            .off('load', this._forwardSourceEvent)\n            .off('error', this._forwardSourceEvent)\n            .off('change', this._forwardSourceEvent)\n            .off('tile.add', this._forwardTileEvent)\n            .off('tile.load', this._forwardTileEvent)\n            .off('tile.error', this._forwardTileEvent)\n            .off('tile.remove', this._forwardTileEvent)\n            .off('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.remove', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Get a source by id.\n     * @param {string} id id of the desired source\n     * @returns {Object} source\n     * @private\n     */\n    getSource: function(id) {\n        return this.sources[id];\n    },\n\n    /**\n     * Add a layer to the map style. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Style} `this`\n     * @private\n     */\n    addLayer: function(layer, before) {\n        this._checkLoaded();\n\n        if (!(layer instanceof StyleLayer)) {\n            // this layer is not in the style.layers array, so we pass an impossible array index\n            if (this._handleErrors(validateStyle.layer,\n                    'layers.' + layer.id, layer, false, {arrayIndex: -1})) return this;\n\n            var refLayer = layer.ref && this.getLayer(layer.ref);\n            layer = StyleLayer.create(layer, refLayer);\n        }\n        this._validateLayer(layer);\n\n        layer.on('error', this._forwardLayerEvent);\n\n        this._layers[layer.id] = layer;\n        this._order.splice(before ? this._order.indexOf(before) : Infinity, 0, layer.id);\n\n        this._updates.allLayers = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.events.push(['layer.add', {layer: layer}]);\n\n        return this.updateClasses(layer.id);\n    },\n\n    /**\n     * Remove a layer from this stylesheet, given its id.\n     * @param {string} id id of the layer to remove\n     * @returns {Style} this style\n     * @throws {Error} if no layer is found with the given ID\n     * @private\n     */\n    removeLayer: function(id) {\n        this._checkLoaded();\n\n        var layer = this._layers[id];\n        if (layer === undefined) {\n            throw new Error('There is no layer with this ID');\n        }\n        for (var i in this._layers) {\n            if (this._layers[i].ref === id) {\n                this.removeLayer(i);\n            }\n        }\n\n        layer.off('error', this._forwardLayerEvent);\n\n        delete this._layers[id];\n        this._order.splice(this._order.indexOf(id), 1);\n\n        this._updates.allLayers = true;\n        this._updates.events.push(['layer.remove', {layer: layer}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id - id of the desired layer\n     * @returns {?Object} a layer, if one with the given `id` exists\n     * @private\n     */\n    getLayer: function(id) {\n        return this._layers[id];\n    },\n\n    /**\n     * If a layer has a `ref` property that makes it derive some values\n     * from another layer, return that referent layer. Otherwise,\n     * returns the layer itself.\n     * @param {string} id the layer's id\n     * @returns {Layer} the referent layer or the layer itself\n     * @private\n     */\n    getReferentLayer: function(id) {\n        var layer = this.getLayer(id);\n        if (layer.ref) {\n            layer = this.getLayer(layer.ref);\n        }\n        return layer;\n    },\n\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return this;\n\n        if (minzoom != null) {\n            layer.minzoom = minzoom;\n        }\n        if (maxzoom != null) {\n            layer.maxzoom = maxzoom;\n        }\n        return this._updateLayer(layer);\n    },\n\n    setFilter: function(layerId, filter) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (this._handleErrors(validateStyle.filter, 'layers.' + layer.id + '.filter', filter)) return this;\n\n        if (util.deepEqual(layer.filter, filter)) return this;\n        layer.filter = util.clone(filter);\n\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layer's filter object\n     * @param {string} layer the layer to inspect\n     * @returns {*} the layer's filter, if any\n     * @private\n     */\n    getFilter: function(layer) {\n        return this.getReferentLayer(layer).filter;\n    },\n\n    setLayoutProperty: function(layerId, name, value) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (util.deepEqual(layer.getLayoutProperty(name), value)) return this;\n\n        layer.setLayoutProperty(name, value);\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layout property's value from a given layer\n     * @param {string} layer the layer to inspect\n     * @param {string} name the name of the layout property\n     * @returns {*} the property value\n     * @private\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.getReferentLayer(layer).getLayoutProperty(name);\n    },\n\n    setPaintProperty: function(layerId, name, value, klass) {\n        this._checkLoaded();\n\n        var layer = this.getLayer(layerId);\n\n        if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return this;\n\n        var wasFeatureConstant = layer.isPaintValueFeatureConstant(name);\n        layer.setPaintProperty(name, value, klass);\n\n        var isFeatureConstant = !(\n            value &&\n            StyleFunction.isFunctionDefinition(value) &&\n            value.property !== '$zoom' &&\n            value.property !== undefined\n        );\n\n        if (!isFeatureConstant || !wasFeatureConstant) {\n            this._updates.layers[layerId] = true;\n            if (layer.source) {\n                this._updates.sources[layer.source] = true;\n            }\n        }\n\n        return this.updateClasses(layerId, name);\n    },\n\n    getPaintProperty: function(layer, name, klass) {\n        return this.getLayer(layer).getPaintProperty(name, klass);\n    },\n\n    updateClasses: function (layerId, paintName) {\n        this._updates.changed = true;\n        if (!layerId) {\n            this._updates.allPaintProps = true;\n        } else {\n            var props = this._updates.paintProps;\n            if (!props[layerId]) props[layerId] = {};\n            props[layerId][paintName || 'all'] = true;\n        }\n        return this;\n    },\n\n    serialize: function() {\n        return util.filterObject({\n            version: this.stylesheet.version,\n            name: this.stylesheet.name,\n            metadata: this.stylesheet.metadata,\n            center: this.stylesheet.center,\n            zoom: this.stylesheet.zoom,\n            bearing: this.stylesheet.bearing,\n            pitch: this.stylesheet.pitch,\n            sprite: this.stylesheet.sprite,\n            glyphs: this.stylesheet.glyphs,\n            transition: this.stylesheet.transition,\n            sources: util.mapObject(this.sources, function(source) {\n                return source.serialize();\n            }),\n            layers: this._order.map(function(id) {\n                return this._layers[id].serialize();\n            }, this)\n        }, function(value) { return value !== undefined; });\n    },\n\n    _updateLayer: function (layer) {\n        this._updates.layers[layer.id] = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.changed = true;\n        return this;\n    },\n\n    _flattenRenderedFeatures: function(sourceResults) {\n        var features = [];\n        for (var l = this._order.length - 1; l >= 0; l--) {\n            var layerID = this._order[l];\n            for (var s = 0; s < sourceResults.length; s++) {\n                var layerFeatures = sourceResults[s][layerID];\n                if (layerFeatures) {\n                    for (var f = 0; f < layerFeatures.length; f++) {\n                        features.push(layerFeatures[f]);\n                    }\n                }\n            }\n        }\n        return features;\n    },\n\n    queryRenderedFeatures: function(queryGeometry, params, zoom, bearing) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true);\n        }\n\n        var sourceResults = [];\n        for (var id in this.sources) {\n            var source = this.sources[id];\n            if (source.queryRenderedFeatures) {\n                sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing));\n            }\n        }\n        return this._flattenRenderedFeatures(sourceResults);\n    },\n\n    querySourceFeatures: function(sourceID, params) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'querySourceFeatures.filter', params.filter, true);\n        }\n        var source = this.getSource(sourceID);\n        return source && source.querySourceFeatures ? source.querySourceFeatures(params) : [];\n    },\n\n    _handleErrors: function(validate, key, value, throws, props) {\n        var action = throws ? validateStyle.throwErrors : validateStyle.emitErrors;\n        var result = validate.call(validateStyle, util.extend({\n            key: key,\n            style: this.serialize(),\n            value: value,\n            styleSpec: styleSpec\n        }, props));\n        return action.call(validateStyle, this, result);\n    },\n\n    _remove: function() {\n        this.dispatcher.remove();\n    },\n\n    _reloadSource: function(id) {\n        this.sources[id].reload();\n    },\n\n    _updateSources: function(transform) {\n        for (var id in this.sources) {\n            this.sources[id].update(transform);\n        }\n    },\n\n    _redoPlacement: function() {\n        for (var id in this.sources) {\n            if (this.sources[id].redoPlacement) this.sources[id].redoPlacement();\n        }\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire('source.' + e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire('layer.' + e.type, util.extend({layer: {id: e.target.id}}, e));\n    },\n\n    // Callbacks from web workers\n\n    'get sprite json': function(params, callback) {\n        var sprite = this.sprite;\n        if (sprite.loaded()) {\n            callback(null, { sprite: sprite.data, retina: sprite.retina });\n        } else {\n            sprite.on('load', function() {\n                callback(null, { sprite: sprite.data, retina: sprite.retina });\n            });\n        }\n    },\n\n    'get icons': function(params, callback) {\n        var sprite = this.sprite;\n        var spriteAtlas = this.spriteAtlas;\n        if (sprite.loaded()) {\n            spriteAtlas.setSprite(sprite);\n            spriteAtlas.addIcons(params.icons, callback);\n        } else {\n            sprite.on('load', function() {\n                spriteAtlas.setSprite(sprite);\n                spriteAtlas.addIcons(params.icons, callback);\n            });\n        }\n    },\n\n    'get glyphs': function(params, callback) {\n        var stacks = params.stacks,\n            remaining = Object.keys(stacks).length,\n            allGlyphs = {};\n\n        for (var fontName in stacks) {\n            this.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done);\n        }\n\n        function done(err, glyphs, fontName) {\n            if (err) console.error(err);\n\n            allGlyphs[fontName] = glyphs;\n            remaining--;\n\n            if (remaining === 0)\n                callback(null, allGlyphs);\n        }\n    }\n});\n\n\n/***/ }),\n/* 541 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction createFunction(parameters, defaultType) {\n    var fun;\n\n    if (!isFunctionDefinition(parameters)) {\n        fun = function() { return parameters; };\n        fun.isFeatureConstant = true;\n        fun.isZoomConstant = true;\n\n    } else {\n        var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\n        var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n        var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n        var type = parameters.type || defaultType || 'exponential';\n\n        var innerFun;\n        if (type === 'exponential') {\n            innerFun = evaluateExponentialFunction;\n        } else if (type === 'interval') {\n            innerFun = evaluateIntervalFunction;\n        } else if (type === 'categorical') {\n            innerFun = evaluateCategoricalFunction;\n        } else if (type === 'identity') {\n            innerFun = evaluateIdentityFunction;\n        } else {\n            throw new Error('Unknown function type \"' + type + '\"');\n        }\n\n        if (zoomAndFeatureDependent) {\n            var featureFunctions = {};\n            var featureFunctionStops = [];\n            for (var s = 0; s < parameters.stops.length; s++) {\n                var stop = parameters.stops[s];\n                if (featureFunctions[stop[0].zoom] === undefined) {\n                    featureFunctions[stop[0].zoom] = {\n                        zoom: stop[0].zoom,\n                        type: parameters.type,\n                        property: parameters.property,\n                        stops: []\n                    };\n                }\n                featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]);\n            }\n\n            for (var z in featureFunctions) {\n                featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z])]);\n            }\n            fun = function(zoom, feature) {\n                return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, zoom)(zoom, feature);\n            };\n            fun.isFeatureConstant = false;\n            fun.isZoomConstant = false;\n\n        } else if (zoomDependent) {\n            fun = function(zoom) {\n                return innerFun(parameters, zoom);\n            };\n            fun.isFeatureConstant = true;\n            fun.isZoomConstant = false;\n        } else {\n            fun = function(zoom, feature) {\n                return innerFun(parameters, feature[parameters.property]);\n            };\n            fun.isFeatureConstant = false;\n            fun.isZoomConstant = true;\n        }\n    }\n\n    return fun;\n}\n\nfunction evaluateCategoricalFunction(parameters, input) {\n    for (var i = 0; i < parameters.stops.length; i++) {\n        if (input === parameters.stops[i][0]) {\n            return parameters.stops[i][1];\n        }\n    }\n    return parameters.stops[0][1];\n}\n\nfunction evaluateIntervalFunction(parameters, input) {\n    for (var i = 0; i < parameters.stops.length; i++) {\n        if (input < parameters.stops[i][0]) break;\n    }\n    return parameters.stops[Math.max(i - 1, 0)][1];\n}\n\nfunction evaluateExponentialFunction(parameters, input) {\n    var base = parameters.base !== undefined ? parameters.base : 1;\n\n    var i = 0;\n    while (true) {\n        if (i >= parameters.stops.length) break;\n        else if (input <= parameters.stops[i][0]) break;\n        else i++;\n    }\n\n    if (i === 0) {\n        return parameters.stops[i][1];\n\n    } else if (i === parameters.stops.length) {\n        return parameters.stops[i - 1][1];\n\n    } else {\n        return interpolate(\n            input,\n            base,\n            parameters.stops[i - 1][0],\n            parameters.stops[i][0],\n            parameters.stops[i - 1][1],\n            parameters.stops[i][1]\n        );\n    }\n}\n\nfunction evaluateIdentityFunction(parameters, input) {\n    return input;\n}\n\n\nfunction interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    if (typeof outputLower === 'function') {\n        return function() {\n            var evaluatedLower = outputLower.apply(undefined, arguments);\n            var evaluatedUpper = outputUpper.apply(undefined, arguments);\n            return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper);\n        };\n    } else if (outputLower.length) {\n        return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper);\n    } else {\n        return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper);\n    }\n}\n\nfunction interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    var difference =  inputUpper - inputLower;\n    var progress = input - inputLower;\n\n    var ratio;\n    if (base === 1) {\n        ratio = progress / difference;\n    } else {\n        ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n    }\n\n    return (outputLower * (1 - ratio)) + (outputUpper * ratio);\n}\n\nfunction interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    var output = [];\n    for (var i = 0; i < outputLower.length; i++) {\n        output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]);\n    }\n    return output;\n}\n\nfunction isFunctionDefinition(value) {\n    return typeof value === 'object' && (value.stops || value.type === 'identity');\n}\n\n\nmodule.exports.isFunctionDefinition = isFunctionDefinition;\n\nmodule.exports.interpolated = function(parameters) {\n    return createFunction(parameters, 'exponential');\n};\n\nmodule.exports['piecewise-constant'] = function(parameters) {\n    return createFunction(parameters, 'interval');\n};\n\n\n/***/ }),\n/* 542 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar parseColorString = __webpack_require__(192).parseCSSColor;\nvar util = __webpack_require__(10);\nvar StyleFunction = __webpack_require__(273);\n\nvar cache = {};\n\nmodule.exports = function parseColor(input) {\n\n    if (StyleFunction.isFunctionDefinition(input)) {\n\n        return util.extend({}, input, {\n            stops: input.stops.map(function(stop) {\n                return [stop[0], parseColor(stop[1])];\n            })\n        });\n\n    } else if (typeof input === 'string') {\n\n        if (!cache[input]) {\n            var rgba = parseColorString(input);\n            if (!rgba) { throw new Error('Invalid color ' + input); }\n\n            // GL expects all components to be in the range [0, 1] and to be\n            // multipled by the alpha value.\n            cache[input] = [\n                rgba[0] / 255 * rgba[3],\n                rgba[1] / 255 * rgba[3],\n                rgba[2] / 255 * rgba[3],\n                rgba[3]\n            ];\n        }\n\n        return cache[input];\n\n    } else {\n        throw new Error('Invalid color ' + input);\n    }\n};\n\n\n/***/ }),\n/* 543 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = __webpack_require__(1013);\n\n\n/***/ }),\n/* 544 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = __webpack_require__(1015);\n\nmodule.exports.emitErrors = function throwErrors(emitter, errors) {\n    if (errors && errors.length) {\n        for (var i = 0; i < errors.length; i++) {\n            emitter.fire('error', { error: new Error(errors[i].message) });\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\nmodule.exports.throwErrors = function throwErrors(emitter, errors) {\n    if (errors) {\n        for (var i = 0; i < errors.length; i++) {\n            throw new Error(errors[i].message);\n        }\n    }\n};\n\n\n/***/ }),\n/* 545 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\n\nmodule.exports = function validateConstants(options) {\n    var key = options.key;\n    var constants = options.value;\n    var styleSpec = options.styleSpec;\n\n    if (styleSpec.$version > 7) {\n        if (constants) {\n            return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n        } else {\n            return [];\n        }\n    } else {\n        var type = getType(constants);\n        if (type !== 'object') {\n            return [new ValidationError(key, constants, 'object expected, %s found', type)];\n        }\n\n        var errors = [];\n        for (var constantName in constants) {\n            if (constantName[0] !== '@') {\n                errors.push(new ValidationError(key + '.' + constantName, constants[constantName], 'constants must start with \"@\"'));\n            }\n        }\n        return errors;\n    }\n\n};\n\n\n/***/ }),\n/* 546 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (output) {\n    for (var i = 1; i < arguments.length; i++) {\n        var input = arguments[i];\n        for (var k in input) {\n            output[k] = input[k];\n        }\n    }\n    return output;\n};\n\n\n/***/ }),\n/* 547 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\nvar validate = __webpack_require__(101);\nvar validateObject = __webpack_require__(149);\nvar validateArray = __webpack_require__(548);\nvar validateNumber = __webpack_require__(549);\nvar unbundle = __webpack_require__(150);\n\nmodule.exports = function validateFunction(options) {\n    var functionValueSpec = options.valueSpec;\n    var functionType = unbundle(options.value.type);\n    var stopKeyType;\n    var stopDomainValues = {};\n    var previousStopDomainValue;\n    var previousStopDomainZoom;\n\n    var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n    var isPropertyFunction = !isZoomFunction;\n    var isZoomAndPropertyFunction =\n        getType(options.value.stops) === 'array' &&\n        getType(options.value.stops[0]) === 'array' &&\n        getType(options.value.stops[0][0]) === 'object';\n\n    var errors = validateObject({\n        key: options.key,\n        value: options.value,\n        valueSpec: options.styleSpec.function,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: { stops: validateFunctionStops }\n    });\n\n    if (functionType !== 'identity' && !options.value.stops) {\n        errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n    }\n\n    if (functionType === 'exponential' && options.valueSpec['function'] === 'piecewise-constant') {\n        errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n    }\n\n    if (options.styleSpec.$version >= 8) {\n       if (isPropertyFunction && !options.valueSpec['property-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n       } else if (isZoomFunction && !options.valueSpec['zoom-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n       }\n    }\n\n    if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n        errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n    }\n\n    return errors;\n\n    function validateFunctionStops(options) {\n        if (functionType === 'identity') {\n            return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n        }\n\n        var errors = [];\n        var value = options.value;\n\n        errors = errors.concat(validateArray({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec,\n            arrayElementValidator: validateFunctionStop\n        }));\n\n        if (getType(value) === 'array' && value.length === 0) {\n            errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n        }\n\n        return errors;\n    }\n\n    function validateFunctionStop(options) {\n        var errors = [];\n        var value = options.value;\n        var key = options.key;\n\n        if (getType(value) !== 'array') {\n            return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n        }\n\n        if (value.length !== 2) {\n            return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)];\n        }\n\n        if (isZoomAndPropertyFunction) {\n            if (getType(value[0]) !== 'object') {\n                return [new ValidationError(key, value, 'object expected, %s found', getType(value[0]))];\n            }\n            if (value[0].zoom === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have zoom')];\n            }\n            if (value[0].value === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have value')];\n            }\n            if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {\n                return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n            }\n            if (unbundle(value[0].zoom) !== previousStopDomainZoom) {\n                previousStopDomainZoom = unbundle(value[0].zoom);\n                previousStopDomainValue = undefined;\n            }\n            errors = errors.concat(validateObject({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: { zoom: {} },\n                style: options.style,\n                styleSpec: options.styleSpec,\n                objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue }\n            }));\n        } else {\n            errors = errors.concat(validateStopDomainValue({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: {},\n                style: options.style,\n                styleSpec: options.styleSpec\n            }));\n        }\n\n        errors = errors.concat(validate({\n            key: key + '[1]',\n            value: value[1],\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        }));\n\n        if (getType(value[0]) === 'number') {\n            if (functionValueSpec.function === 'piecewise-constant' && value[0] % 1 !== 0) {\n                errors.push(new ValidationError(key + '[0]', value[0], 'zoom level for piecewise-constant functions must be an integer'));\n            }\n        }\n\n        return errors;\n    }\n\n    function validateStopDomainValue(options) {\n        var type = getType(options.value);\n        var value = unbundle(options.value);\n\n        if (!stopKeyType) {\n            stopKeyType = type;\n            if (!functionType && type === 'string') {\n                functionType = 'categorical';\n            }\n        } else if (type !== stopKeyType) {\n            return [new ValidationError(options.key, options.value, '%s stop domain type must match previous stop domain type %s', type, stopKeyType)];\n        }\n\n        if (type !== 'number' && type !== 'string') {\n            return [new ValidationError(options.key, options.value, 'property value must be a number or string')];\n        }\n\n        if (type !== 'number' && functionType !== 'categorical') {\n            return [new ValidationError(options.key, options.value, 'number expected, %s found', type)];\n        }\n\n        if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {\n            return [new ValidationError(options.key, options.value, 'integer expected, found %s', value)];\n        }\n\n        if (type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n            return [new ValidationError(options.key, options.value, 'stop domain values must appear in ascending order')];\n        } else {\n            previousStopDomainValue = value;\n        }\n\n        if (functionType === 'categorical' && value in stopDomainValues) {\n            return [new ValidationError(options.key, options.value, 'stop domain values must be unique')];\n        } else {\n            stopDomainValues[value] = true;\n        }\n\n        return [];\n    }\n\n};\n\n\n/***/ }),\n/* 548 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(63);\nvar validate = __webpack_require__(101);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validateArray(options) {\n    var array = options.value;\n    var arraySpec = options.valueSpec;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var key = options.key;\n    var validateArrayElement = options.arrayElementValidator || validate;\n\n    if (getType(array) !== 'array') {\n        return [new ValidationError(key, array, 'array expected, %s found', getType(array))];\n    }\n\n    if (arraySpec.length && array.length !== arraySpec.length) {\n        return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)];\n    }\n\n    if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n        return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)];\n    }\n\n    var arrayElementSpec = {\n        \"type\": arraySpec.value\n    };\n\n    if (styleSpec.$version < 7) {\n        arrayElementSpec.function = arraySpec.function;\n    }\n\n    if (getType(arraySpec.value) === 'object') {\n        arrayElementSpec = arraySpec.value;\n    }\n\n    var errors = [];\n    for (var i = 0; i < array.length; i++) {\n        errors = errors.concat(validateArrayElement({\n            array: array,\n            arrayIndex: i,\n            value: array[i],\n            valueSpec: arrayElementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            key: key + '[' + i + ']'\n        }));\n    }\n    return errors;\n};\n\n\n/***/ }),\n/* 549 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(63);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validateNumber(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var type = getType(value);\n\n    if (type !== 'number') {\n        return [new ValidationError(key, value, 'number expected, %s found', type)];\n    }\n\n    if ('minimum' in valueSpec && value < valueSpec.minimum) {\n        return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)];\n    }\n\n    if ('maximum' in valueSpec && value > valueSpec.maximum) {\n        return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 550 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar unbundle = __webpack_require__(150);\nvar validateObject = __webpack_require__(149);\nvar validateFilter = __webpack_require__(275);\nvar validatePaintProperty = __webpack_require__(551);\nvar validateLayoutProperty = __webpack_require__(552);\nvar extend = __webpack_require__(546);\n\nmodule.exports = function validateLayer(options) {\n    var errors = [];\n\n    var layer = options.value;\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n\n    if (!layer.type && !layer.ref) {\n        errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n    }\n    var type = unbundle(layer.type);\n    var ref = unbundle(layer.ref);\n\n    if (layer.id) {\n        for (var i = 0; i < options.arrayIndex; i++) {\n            var otherLayer = style.layers[i];\n            if (unbundle(otherLayer.id) === unbundle(layer.id)) {\n                errors.push(new ValidationError(key, layer.id, 'duplicate layer id \"%s\", previously used at line %d', layer.id, otherLayer.id.__line__));\n            }\n        }\n    }\n\n    if ('ref' in layer) {\n        ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n            if (p in layer) {\n                errors.push(new ValidationError(key, layer[p], '\"%s\" is prohibited for ref layers', p));\n            }\n        });\n\n        var parent;\n\n        style.layers.forEach(function(layer) {\n            if (layer.id == ref) parent = layer;\n        });\n\n        if (!parent) {\n            errors.push(new ValidationError(key, layer.ref, 'ref layer \"%s\" not found', ref));\n        } else if (parent.ref) {\n            errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n        } else {\n            type = unbundle(parent.type);\n        }\n    } else if (type !== 'background') {\n        if (!layer.source) {\n            errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n        } else {\n            var source = style.sources && style.sources[layer.source];\n            if (!source) {\n                errors.push(new ValidationError(key, layer.source, 'source \"%s\" not found', layer.source));\n            } else if (source.type == 'vector' && type == 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a raster source', layer.id));\n            } else if (source.type == 'raster' && type != 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a vector source', layer.id));\n            } else if (source.type == 'vector' && !layer['source-layer']) {\n                errors.push(new ValidationError(key, layer, 'layer \"%s\" must specify a \"source-layer\"', layer.id));\n            }\n        }\n    }\n\n    errors = errors.concat(validateObject({\n        key: key,\n        value: layer,\n        valueSpec: styleSpec.layer,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            '*': function() {\n                return [];\n            },\n            filter: validateFilter,\n            layout: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validateLayoutProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            },\n            paint: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validatePaintProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            }\n        }\n    }));\n\n    return errors;\n};\n\n\n/***/ }),\n/* 551 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validate = __webpack_require__(101);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validatePaintProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['paint_' + options.layerType];\n\n    if (!layerSpec) return [];\n\n    var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n\n    if (transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n        return validate({\n            key: key,\n            value: value,\n            valueSpec: styleSpec.transition,\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else if (options.valueSpec || layerSpec[propertyKey]) {\n        return validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n/***/ }),\n/* 552 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validate = __webpack_require__(101);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validateLayoutProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['layout_' + options.layerType];\n\n    if (!layerSpec) return [];\n\n    if (options.valueSpec || layerSpec[propertyKey]) {\n        var errors = [];\n\n        if (options.layerType === 'symbol') {\n            if (propertyKey === 'icon-image' && style && !style.sprite) {\n                errors.push(new ValidationError(key, value, 'use of \"icon-image\" requires a style \"sprite\" property'));\n            } else if (propertyKey === 'text-field' && style && !style.glyphs) {\n                errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n            }\n        }\n\n        return errors.concat(validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        }));\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n/***/ }),\n/* 553 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar unbundle = __webpack_require__(150);\nvar validateObject = __webpack_require__(149);\nvar validateEnum = __webpack_require__(274);\n\nmodule.exports = function validateSource(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (!value.type) {\n        return [new ValidationError(key, value, '\"type\" is required')];\n    }\n\n    var type = unbundle(value.type);\n    switch (type) {\n        case 'vector':\n        case 'raster':\n            var errors = [];\n            errors = errors.concat(validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_tile,\n                style: options.style,\n                styleSpec: styleSpec\n            }));\n            if ('url' in value) {\n                for (var prop in value) {\n                    if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n                        errors.push(new ValidationError(key + '.' + prop, value[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop));\n                    }\n                }\n            }\n            return errors;\n\n        case 'geojson':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_geojson,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'video':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_video,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'image':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_image,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        default:\n            return validateEnum({\n                key: key + '.type',\n                value: value.type,\n                valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image']},\n                style: style,\n                styleSpec: styleSpec\n            });\n    }\n};\n\n\n/***/ }),\n/* 554 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\nvar validate = __webpack_require__(101);\n\nmodule.exports = function validateLight(options) {\n    var light = options.value;\n    var styleSpec = options.styleSpec;\n    var lightSpec = styleSpec.light;\n    var style = options.style;\n\n    var errors = [];\n\n    var rootType = getType(light);\n    if (light === undefined) {\n        return errors;\n    } else if (rootType !== 'object') {\n        errors = errors.concat([new ValidationError('light', light, 'object expected, %s found', rootType)]);\n        return errors;\n    }\n\n    for (var key in light) {\n        var transitionMatch = key.match(/^(.*)-transition$/);\n\n        if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n            errors = errors.concat(validate({\n                key: key,\n                value: light[key],\n                valueSpec: styleSpec.transition,\n                style: style,\n                styleSpec: styleSpec\n            }));\n        } else if (lightSpec[key]) {\n            errors = errors.concat(validate({\n                key: key,\n                value: light[key],\n                valueSpec: lightSpec[key],\n                style: style,\n                styleSpec: styleSpec\n            }));\n        } else {\n            errors = errors.concat([new ValidationError(key, light[key], 'unknown property \"%s\"', key)]);\n        }\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 555 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(63);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validateString(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'string expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 556 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n    API_URL: 'https://api.mapbox.com',\n    REQUIRE_ACCESS_TOKEN: true\n};\n\n\n/***/ }),\n/* 557 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// See the explanation for this file's existence in `webpack.config.js` in the root of the project\nmodule.exports = function (worker) {\n  __webpack_require__.p = gon.asset_path + '/javascripts/';\n  return worker();\n};\n\n/***/ }),\n/* 558 */\n/***/ (function(module, exports) {\n\n// http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string\r\n\r\nvar URL = window.URL || window.webkitURL;\r\nmodule.exports = function(content, url) {\r\n\ttry {\r\n\t\ttry {\r\n\t\t\tvar blob;\r\n\t\t\ttry { // BlobBuilder = Deprecated, but widely implemented\r\n\t\t\t\tvar BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\r\n\t\t\t\tblob = new BlobBuilder();\r\n\t\t\t\tblob.append(content);\r\n\t\t\t\tblob = blob.getBlob();\r\n\t\t\t} catch(e) { // The proposed API\r\n\t\t\t\tblob = new Blob([content]);\r\n\t\t\t}\r\n\t\t\treturn new Worker(URL.createObjectURL(blob));\r\n\t\t} catch(e) {\r\n\t\t\treturn new Worker('data:application/javascript,' + encodeURIComponent(content));\r\n\t\t}\r\n\t} catch(e) {\r\n\t\treturn new Worker(url);\r\n\t}\r\n}\n\n/***/ }),\n/* 559 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = AnimationLoop;\n\nfunction AnimationLoop() {\n    this.n = 0;\n    this.times = [];\n}\n\n// Are all animations done?\nAnimationLoop.prototype.stopped = function() {\n    this.times = this.times.filter(function(t) {\n        return t.time >= (new Date()).getTime();\n    });\n    return !this.times.length;\n};\n\n// Add a new animation that will run t milliseconds\n// Returns an id that can be used to cancel it layer\nAnimationLoop.prototype.set = function(t) {\n    this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n    return this.n++;\n};\n\n// Cancel an animation\nAnimationLoop.prototype.cancel = function(n) {\n    this.times = this.times.filter(function(t) {\n        return t.id !== n;\n    });\n};\n\n\n/***/ }),\n/* 560 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n    var p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n\n        // filter collinear points around the cuts\n        filterPoints(outerNode, outerNode.next);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n\n\n/***/ }),\n/* 561 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.quickselect = factory());\n}(this, (function () { 'use strict';\n\nfunction quickselect(arr, k, left, right, compare) {\n    quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n    while (right > left) {\n        if (right - left > 600) {\n            var n = right - left + 1;\n            var m = k - left + 1;\n            var z = Math.log(n);\n            var s = 0.5 * Math.exp(2 * z / 3);\n            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            quickselectStep(arr, k, newLeft, newRight, compare);\n        }\n\n        var t = arr[k];\n        var i = left;\n        var j = right;\n\n        swap(arr, left, k);\n        if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n        while (i < j) {\n            swap(arr, i, j);\n            i++;\n            j--;\n            while (compare(arr[i], t) < 0) i++;\n            while (compare(arr[j], t) > 0) j--;\n        }\n\n        if (compare(arr[left], t) === 0) swap(arr, left, j);\n        else {\n            j++;\n            swap(arr, j, right);\n        }\n\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n}\n\nfunction swap(arr, i, j) {\n    var tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nreturn quickselect;\n\n})));\n\n\n/***/ }),\n/* 562 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = Anchor;\n\nfunction Anchor(x, y, angle, segment) {\n    this.x = x;\n    this.y = y;\n    this.angle = angle;\n\n    if (segment !== undefined) {\n        this.segment = segment;\n    }\n}\n\nAnchor.prototype = Object.create(Point.prototype);\n\nAnchor.prototype.clone = function() {\n    return new Anchor(this.x, this.y, this.angle, this.segment);\n};\n\n\n/***/ }),\n/* 563 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties, text) {\n    return text.replace(/{([^{}]+)}/g, function(match, key) {\n        return key in properties ? properties[key] : '';\n    });\n}\n\n\n/***/ }),\n/* 564 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = {\n    getIconQuads: getIconQuads,\n    getGlyphQuads: getGlyphQuads,\n    SymbolQuad: SymbolQuad\n};\n\nvar minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} angle The angle of the label at it's center, not the angle of this quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, angle, minScale, maxScale) {\n    this.anchorPoint = anchorPoint;\n    this.tl = tl;\n    this.tr = tr;\n    this.bl = bl;\n    this.br = br;\n    this.tex = tex;\n    this.angle = angle;\n    this.minScale = minScale;\n    this.maxScale = maxScale;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layout, alongLine) {\n\n    var rect = shapedIcon.image.rect;\n\n    var border = 1;\n    var left = shapedIcon.left - border;\n    var right = left + rect.w / shapedIcon.image.pixelRatio;\n    var top = shapedIcon.top - border;\n    var bottom = top + rect.h / shapedIcon.image.pixelRatio;\n    var tl = new Point(left, top);\n    var tr = new Point(right, top);\n    var br = new Point(right, bottom);\n    var bl = new Point(left, bottom);\n\n    var angle = layout['icon-rotate'] * Math.PI / 180;\n    if (alongLine) {\n        var prev = line[anchor.segment];\n        if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) {\n            var next = line[anchor.segment + 1];\n            angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI;\n        } else {\n            angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n        }\n    }\n\n    if (angle) {\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle),\n            matrix = [cos, -sin, sin, cos];\n\n        tl = tl.matMult(matrix);\n        tr = tr.matMult(matrix);\n        bl = bl.matMult(matrix);\n        br = br.matMult(matrix);\n    }\n\n    return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layout, alongLine) {\n\n    var textRotate = layout['text-rotate'] * Math.PI / 180;\n    var keepUpright = layout['text-keep-upright'];\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n    var quads = [];\n\n    for (var k = 0; k < positionedGlyphs.length; k++) {\n        var positionedGlyph = positionedGlyphs[k];\n        var glyph = positionedGlyph.glyph;\n        var rect = glyph.rect;\n\n        if (!rect) continue;\n\n        var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n        var glyphInstances;\n        var labelMinScale = minScale;\n        if (alongLine) {\n            glyphInstances = [];\n            labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n            if (keepUpright) {\n                labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n            }\n\n        } else {\n            glyphInstances = [{\n                anchorPoint: new Point(anchor.x, anchor.y),\n                offset: 0,\n                angle: 0,\n                maxScale: Infinity,\n                minScale: minScale\n            }];\n        }\n\n        var x1 = positionedGlyph.x + glyph.left,\n            y1 = positionedGlyph.y - glyph.top,\n            x2 = x1 + rect.w,\n            y2 = y1 + rect.h,\n\n            otl = new Point(x1, y1),\n            otr = new Point(x2, y1),\n            obl = new Point(x1, y2),\n            obr = new Point(x2, y2);\n\n        for (var i = 0; i < glyphInstances.length; i++) {\n\n            var instance = glyphInstances[i],\n                tl = otl,\n                tr = otr,\n                bl = obl,\n                br = obr,\n                angle = instance.angle + textRotate;\n\n            if (angle) {\n                var sin = Math.sin(angle),\n                    cos = Math.cos(angle),\n                    matrix = [cos, -sin, sin, cos];\n\n                tl = tl.matMult(matrix);\n                tr = tr.matMult(matrix);\n                bl = bl.matMult(matrix);\n                br = br.matMult(matrix);\n            }\n\n            // Prevent label from extending past the end of the line\n            var glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n            var glyphAngle = (anchor.angle + textRotate + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, glyphAngle, glyphMinScale, instance.maxScale));\n\n        }\n    }\n\n    return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array<Object>} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array<Point>} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array<Object>} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n    var upsideDown = !forward;\n\n    if (offset < 0) forward = !forward;\n\n    if (forward) segment++;\n\n    var newAnchorPoint = new Point(anchor.x, anchor.y);\n    var end = line[segment];\n    var prevScale = Infinity;\n\n    offset = Math.abs(offset);\n\n    var placementScale = minScale;\n\n    while (true) {\n        var distance = newAnchorPoint.dist(end);\n        var scale = offset / distance;\n\n        // Get the angle of the line segment\n        var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n        if (!forward) angle += Math.PI;\n        if (upsideDown) angle += Math.PI;\n\n        glyphs.push({\n            anchorPoint: newAnchorPoint,\n            offset: upsideDown ? Math.PI : 0,\n            minScale: scale,\n            maxScale: prevScale,\n            angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n        });\n\n        if (scale <= placementScale) break;\n\n        newAnchorPoint = end;\n\n        // skip duplicate nodes\n        while (newAnchorPoint.equals(end)) {\n            segment += forward ? 1 : -1;\n            end = line[segment];\n            if (!end) {\n                return scale;\n            }\n        }\n\n        var unit = end.sub(newAnchorPoint)._unit();\n        newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n        prevScale = scale;\n    }\n\n    return placementScale;\n}\n\n\n/***/ }),\n/* 565 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n    var cells = this.cells = [];\n\n    if (extent instanceof ArrayBuffer) {\n        this.arrayBuffer = extent;\n        var array = new Int32Array(this.arrayBuffer);\n        extent = array[0];\n        n = array[1];\n        padding = array[2];\n\n        this.d = n + 2 * padding;\n        for (var k = 0; k < this.d * this.d; k++) {\n            var start = array[NUM_PARAMS + k];\n            var end = array[NUM_PARAMS + k + 1];\n            cells.push(start === end ?\n                    null :\n                    array.subarray(start, end));\n        }\n        var keysOffset = array[NUM_PARAMS + cells.length];\n        var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n        this.keys = array.subarray(keysOffset, bboxesOffset);\n        this.bboxes = array.subarray(bboxesOffset);\n\n        this.insert = this._insertReadonly;\n\n    } else {\n        this.d = n + 2 * padding;\n        for (var i = 0; i < this.d * this.d; i++) {\n            cells.push([]);\n        }\n        this.keys = [];\n        this.bboxes = [];\n    }\n\n    this.n = n;\n    this.extent = extent;\n    this.padding = padding;\n    this.scale = n / extent;\n    this.uid = 0;\n\n    var p = (padding / n) * extent;\n    this.min = -p;\n    this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n    this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n    this.keys.push(key);\n    this.bboxes.push(x1);\n    this.bboxes.push(y1);\n    this.bboxes.push(x2);\n    this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n    throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n    this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2) {\n    var min = this.min;\n    var max = this.max;\n    if (x1 <= min && y1 <= min && max <= x2 && max <= y2) {\n        return this.keys.slice();\n\n    } else {\n        var result = [];\n        var seenUids = {};\n        this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids);\n        return result;\n    }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids) {\n    var cell = this.cells[cellIndex];\n    if (cell !== null) {\n        var keys = this.keys;\n        var bboxes = this.bboxes;\n        for (var u = 0; u < cell.length; u++) {\n            var uid = cell[u];\n            if (seenUids[uid] === undefined) {\n                var offset = uid * 4;\n                if ((x1 <= bboxes[offset + 2]) &&\n                    (y1 <= bboxes[offset + 3]) &&\n                    (x2 >= bboxes[offset + 0]) &&\n                    (y2 >= bboxes[offset + 1])) {\n                    seenUids[uid] = true;\n                    result.push(keys[uid]);\n                } else {\n                    seenUids[uid] = false;\n                }\n            }\n        }\n    }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2) {\n    var cx1 = this._convertToCellCoord(x1);\n    var cy1 = this._convertToCellCoord(y1);\n    var cx2 = this._convertToCellCoord(x2);\n    var cy2 = this._convertToCellCoord(y2);\n    for (var x = cx1; x <= cx2; x++) {\n        for (var y = cy1; y <= cy2; y++) {\n            var cellIndex = this.d * y + x;\n            if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2)) return;\n        }\n    }\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n    return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n    if (this.arrayBuffer) return this.arrayBuffer;\n\n    var cells = this.cells;\n\n    var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n    var totalCellLength = 0;\n    for (var i = 0; i < this.cells.length; i++) {\n        totalCellLength += this.cells[i].length;\n    }\n\n    var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n    array[0] = this.extent;\n    array[1] = this.n;\n    array[2] = this.padding;\n\n    var offset = metadataLength;\n    for (var k = 0; k < cells.length; k++) {\n        var cell = cells[k];\n        array[NUM_PARAMS + k] = offset;\n        array.set(cell, offset);\n        offset += cell.length;\n    }\n\n    array[NUM_PARAMS + cells.length] = offset;\n    array.set(this.keys, offset);\n    offset += this.keys.length;\n\n    array[NUM_PARAMS + cells.length + 1] = offset;\n    array.set(this.bboxes, offset);\n    offset += this.bboxes.length;\n\n    return array.buffer;\n};\n\n\n/***/ }),\n/* 566 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar VectorTileFeature = __webpack_require__(567);\n\nmodule.exports = VectorTileLayer;\n\nfunction VectorTileLayer(pbf, end) {\n    // Public\n    this.version = 1;\n    this.name = null;\n    this.extent = 4096;\n    this.length = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._keys = [];\n    this._values = [];\n    this._features = [];\n\n    pbf.readFields(readLayer, this, end);\n\n    this.length = this._features.length;\n}\n\nfunction readLayer(tag, layer, pbf) {\n    if (tag === 15) layer.version = pbf.readVarint();\n    else if (tag === 1) layer.name = pbf.readString();\n    else if (tag === 5) layer.extent = pbf.readVarint();\n    else if (tag === 2) layer._features.push(pbf.pos);\n    else if (tag === 3) layer._keys.push(pbf.readString());\n    else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\nfunction readValueMessage(pbf) {\n    var value = null,\n        end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var tag = pbf.readVarint() >> 3;\n\n        value = tag === 1 ? pbf.readString() :\n            tag === 2 ? pbf.readFloat() :\n            tag === 3 ? pbf.readDouble() :\n            tag === 4 ? pbf.readVarint64() :\n            tag === 5 ? pbf.readVarint() :\n            tag === 6 ? pbf.readSVarint() :\n            tag === 7 ? pbf.readBoolean() : null;\n    }\n\n    return value;\n}\n\n// return feature `i` from this layer as a `VectorTileFeature`\nVectorTileLayer.prototype.feature = function(i) {\n    if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n    this._pbf.pos = this._features[i];\n\n    var end = this._pbf.readVarint() + this._pbf.pos;\n    return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n};\n\n\n/***/ }),\n/* 567 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = VectorTileFeature;\n\nfunction VectorTileFeature(pbf, end, extent, keys, values) {\n    // Public\n    this.properties = {};\n    this.extent = extent;\n    this.type = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._geometry = -1;\n    this._keys = keys;\n    this._values = values;\n\n    pbf.readFields(readFeature, this, end);\n}\n\nfunction readFeature(tag, feature, pbf) {\n    if (tag == 1) feature.id = pbf.readVarint();\n    else if (tag == 2) readTag(pbf, feature);\n    else if (tag == 3) feature.type = pbf.readVarint();\n    else if (tag == 4) feature._geometry = pbf.pos;\n}\n\nfunction readTag(pbf, feature) {\n    var end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var key = feature._keys[pbf.readVarint()],\n            value = feature._values[pbf.readVarint()];\n        feature.properties[key] = value;\n    }\n}\n\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nVectorTileFeature.prototype.loadGeometry = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        lines = [],\n        line;\n\n    while (pbf.pos < end) {\n        if (!length) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n\n            if (cmd === 1) { // moveTo\n                if (line) lines.push(line);\n                line = [];\n            }\n\n            line.push(new Point(x, y));\n\n        } else if (cmd === 7) {\n\n            // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n            if (line) {\n                line.push(line[0].clone()); // closePolygon\n            }\n\n        } else {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    if (line) lines.push(line);\n\n    return lines;\n};\n\nVectorTileFeature.prototype.bbox = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        x1 = Infinity,\n        x2 = -Infinity,\n        y1 = Infinity,\n        y2 = -Infinity;\n\n    while (pbf.pos < end) {\n        if (!length) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n            if (x < x1) x1 = x;\n            if (x > x2) x2 = x;\n            if (y < y1) y1 = y;\n            if (y > y2) y2 = y;\n\n        } else if (cmd !== 7) {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    return [x1, y1, x2, y2];\n};\n\nVectorTileFeature.prototype.toGeoJSON = function(x, y, z) {\n    var size = this.extent * Math.pow(2, z),\n        x0 = this.extent * x,\n        y0 = this.extent * y,\n        coords = this.loadGeometry(),\n        type = VectorTileFeature.types[this.type],\n        i, j;\n\n    function project(line) {\n        for (var j = 0; j < line.length; j++) {\n            var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;\n            line[j] = [\n                (p.x + x0) * 360 / size - 180,\n                360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90\n            ];\n        }\n    }\n\n    switch (this.type) {\n    case 1:\n        var points = [];\n        for (i = 0; i < coords.length; i++) {\n            points[i] = coords[i][0];\n        }\n        coords = points;\n        project(coords);\n        break;\n\n    case 2:\n        for (i = 0; i < coords.length; i++) {\n            project(coords[i]);\n        }\n        break;\n\n    case 3:\n        coords = classifyRings(coords);\n        for (i = 0; i < coords.length; i++) {\n            for (j = 0; j < coords[i].length; j++) {\n                project(coords[i][j]);\n            }\n        }\n        break;\n    }\n\n    if (coords.length === 1) {\n        coords = coords[0];\n    } else {\n        type = 'Multi' + type;\n    }\n\n    var result = {\n        type: \"Feature\",\n        geometry: {\n            type: type,\n            coordinates: coords\n        },\n        properties: this.properties\n    };\n\n    if ('id' in this) {\n        result.id = this.id;\n    }\n\n    return result;\n};\n\n// classifies an array of rings into polygons with outer rings and holes\n\nfunction classifyRings(rings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = signedArea(rings[i]);\n        if (area === 0) continue;\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    return polygons;\n}\n\nfunction signedArea(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\n\n/***/ }),\n/* 568 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Feature;\n\nfunction Feature(vectorTileFeature, z, x, y) {\n    this._vectorTileFeature = vectorTileFeature;\n    vectorTileFeature._z = z;\n    vectorTileFeature._x = x;\n    vectorTileFeature._y = y;\n\n    this.properties = vectorTileFeature.properties;\n\n    if (vectorTileFeature._id) {\n        this.id = vectorTileFeature._id;\n    }\n}\n\nFeature.prototype = {\n    type: \"Feature\",\n\n    get geometry() {\n        if (this._geometry === undefined) {\n            this._geometry = this._vectorTileFeature.toGeoJSON(\n                this._vectorTileFeature._x,\n                this._vectorTileFeature._y,\n                this._vectorTileFeature._z).geometry;\n        }\n        return this._geometry;\n    },\n\n    set geometry(g) {\n        this._geometry = g;\n    },\n\n    toJSON: function() {\n        var json = {};\n        for (var i in this) {\n            if (i === '_geometry' || i === '_vectorTileFeature' || i === 'toJSON') continue;\n            json[i] = this[i];\n        }\n        return json;\n    }\n};\n\n\n/***/ }),\n/* 569 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function (global, factory) {\n     true ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (factory((global.WhooTS = global.WhooTS || {})));\n}(this, function (exports) {\n\n/**\n * getURL\n *\n * @param    {String}  baseUrl  Base url of the WMS server\n * @param    {String}  layer    Layer name\n * @param    {Number}  x        Tile coordinate x\n * @param    {Number}  y        Tile coordinate y\n * @param    {Number}  z        Tile zoom\n * @param    {Object}  [options]\n * @param    {String}  [options.format='image/png']\n * @param    {String}  [options.service='WMS']\n * @param    {String}  [options.version='1.1.1']\n * @param    {String}  [options.request='GetMap']\n * @param    {String}  [options.srs='EPSG:3857']\n * @param    {Number}  [options.width='256']\n * @param    {Number}  [options.height='256']\n * @returns  {String}  url\n * @example\n * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';\n * var layer = 'Natural2015';\n * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);\n */\nfunction getURL(baseUrl, layer, x, y, z, options) {\n    options = options || {};\n\n    var url = baseUrl + '?' + [\n        'bbox='    + getTileBBox(x, y, z),\n        'format='  + (options.format || 'image/png'),\n        'service=' + (options.service || 'WMS'),\n        'version=' + (options.version || '1.1.1'),\n        'request=' + (options.request || 'GetMap'),\n        'srs='     + (options.srs || 'EPSG:3857'),\n        'width='   + (options.width || 256),\n        'height='  + (options.height || 256),\n        'layers='  + layer\n    ].join('&');\n\n    return url;\n}\n\n\n/**\n * getTileBBox\n *\n * @param    {Number}  x  Tile coordinate x\n * @param    {Number}  y  Tile coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {String}  String of the bounding box\n */\nfunction getTileBBox(x, y, z) {\n    // for Google/OSM tile scheme we need to alter the y\n    y = (Math.pow(2, z) - y - 1);\n\n    var min = getMercCoords(x * 256, y * 256, z),\n        max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);\n\n    return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];\n}\n\n\n/**\n * getMercCoords\n *\n * @param    {Number}  x  Pixel coordinate x\n * @param    {Number}  y  Pixel coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {Array}   [x, y]\n */\nfunction getMercCoords(x, y, z) {\n    var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),\n        merc_x = (x * resolution - 2 * Math.PI  * 6378137 / 2.0),\n        merc_y = (y * resolution - 2 * Math.PI  * 6378137 / 2.0);\n\n    return [merc_x, merc_y];\n}\n\nexports.getURL = getURL;\nexports.getTileBBox = getTileBBox;\nexports.getMercCoords = getMercCoords;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n}));\n\n/***/ }),\n/* 570 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar Evented = __webpack_require__(55);\nvar Source = __webpack_require__(194);\nvar normalizeURL = __webpack_require__(122).normalizeTileURL;\n\nmodule.exports = VectorTileSource;\n\nfunction VectorTileSource(options) {\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    this._options = util.extend({ type: 'vector' }, options);\n\n    if (this.tileSize !== 512) {\n        throw new Error('vector tile sources must have a tileSize of 512');\n    }\n\n    Source._loadTileJSON.call(this, options);\n}\n\nVectorTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    scheme: 'xyz',\n    tileSize: 512,\n    reparseOverscaled: true,\n    _loaded: false,\n    isTileClipped: true,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._pyramid && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._pyramid) {\n            this._pyramid.update(this.used, transform);\n        }\n    },\n\n    reload: function() {\n        if (this._pyramid) {\n            this._pyramid.reload();\n        }\n    },\n\n    serialize: function() {\n        return util.extend({}, this._options);\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    queryRenderedFeatures: Source._queryRenderedVectorFeatures,\n    querySourceFeatures: Source._querySourceFeatures,\n\n    _loadTile: function(tile) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url),\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            tileSize: this.tileSize * overscaling,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        if (tile.workerID) {\n            params.rawTileData = tile.rawTileData;\n            this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID);\n        } else {\n            tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile));\n        }\n    },\n\n    _tileLoaded: function(tile, err, data) {\n        if (tile.aborted)\n            return;\n\n        if (err) {\n            tile.errored = true;\n            this.fire('tile.error', {tile: tile, error: err});\n            return;\n        }\n\n        tile.loadVectorData(data, this.map.style);\n\n        if (tile.redoWhenDone) {\n            tile.redoWhenDone = false;\n            tile.redoPlacement(this);\n        }\n\n        this.fire('tile.load', {tile: tile});\n        this.fire('tile.stats', data.bucketStats);\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n        this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    redoPlacement: Source.redoPlacement,\n\n    _redoTilePlacement: function(tile) {\n        tile.redoPlacement(this);\n    }\n});\n\n\n/***/ }),\n/* 571 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar ajax = __webpack_require__(88);\nvar Evented = __webpack_require__(55);\nvar Source = __webpack_require__(194);\nvar normalizeURL = __webpack_require__(122).normalizeTileURL;\n\nmodule.exports = RasterTileSource;\n\nfunction RasterTileSource(options) {\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n\n    Source._loadTileJSON.call(this, options);\n}\n\nRasterTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    roundZoom: true,\n    scheme: 'xyz',\n    tileSize: 512,\n    _loaded: false,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._pyramid && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._pyramid) {\n            this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration);\n        }\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    serialize: function() {\n        return {\n            type: 'raster',\n            url: this.url,\n            tileSize: this.tileSize\n        };\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    _loadTile: function(tile) {\n        var url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize);\n\n        tile.request = ajax.getImage(url, done.bind(this));\n\n        function done(err, img) {\n            delete tile.request;\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                tile.errored = true;\n                this.fire('tile.error', {tile: tile, error: err});\n                return;\n            }\n\n            var gl = this.map.painter.gl;\n            tile.texture = this.map.painter.getTexture(img.width);\n            if (tile.texture) {\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n            } else {\n                tile.texture = gl.createTexture();\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n                tile.texture.size = img.width;\n            }\n            gl.generateMipmap(gl.TEXTURE_2D);\n\n            tile.timeAdded = new Date().getTime();\n            this.map.animationLoop.set(this.style.rasterFadeDuration);\n\n            tile.source = this;\n            tile.loaded = true;\n\n            this.fire('tile.load', {tile: tile});\n        }\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n\n        if (tile.request) {\n            tile.request.abort();\n            delete tile.request;\n        }\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        if (tile.texture) this.map.painter.saveTexture(tile.texture);\n    }\n});\n\n\n/***/ }),\n/* 572 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell\r\n// X11 (“MIT”) Licensed. (See LICENSE.)\r\n\r\nvoid (function(root, factory) {\r\n  if (true) {\r\n    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n  } else if (typeof exports === \"object\") {\r\n    module.exports = factory()\r\n  } else {\r\n    root.resolveUrl = factory()\r\n  }\r\n}(this, function() {\r\n\r\n  function resolveUrl(/* ...urls */) {\r\n    var numUrls = arguments.length\r\n\r\n    if (numUrls === 0) {\r\n      throw new Error(\"resolveUrl requires at least one argument; got none.\")\r\n    }\r\n\r\n    var base = document.createElement(\"base\")\r\n    base.href = arguments[0]\r\n\r\n    if (numUrls === 1) {\r\n      return base.href\r\n    }\r\n\r\n    var head = document.getElementsByTagName(\"head\")[0]\r\n    head.insertBefore(base, head.firstChild)\r\n\r\n    var a = document.createElement(\"a\")\r\n    var resolved\r\n\r\n    for (var index = 1; index < numUrls; index++) {\r\n      a.href = arguments[index]\r\n      resolved = a.href\r\n      base.href = resolved\r\n    }\r\n\r\n    head.removeChild(base)\r\n\r\n    return resolved\r\n  }\r\n\r\n  return resolveUrl\r\n\r\n}));\r\n\n\n/***/ }),\n/* 573 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\nvar mat3 = {};\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\nmat3.fromMat4 = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\nmat3.fromValues = function(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\nmat3.set = function(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b01 = a22 * a11 - a12 * a21,\n        b11 = -a22 * a10 + a12 * a20,\n        b21 = a21 * a10 - a11 * a20,\n\n        // Calculate the determinant\n        det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    out[0] = (a11 * a22 - a12 * a21);\n    out[1] = (a02 * a21 - a01 * a22);\n    out[2] = (a01 * a12 - a02 * a11);\n    out[3] = (a12 * a20 - a10 * a22);\n    out[4] = (a00 * a22 - a02 * a20);\n    out[5] = (a02 * a10 - a00 * a12);\n    out[6] = (a10 * a21 - a11 * a20);\n    out[7] = (a01 * a20 - a00 * a21);\n    out[8] = (a00 * a11 - a01 * a10);\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b00 = b[0], b01 = b[1], b02 = b[2],\n        b10 = b[3], b11 = b[4], b12 = b[5],\n        b20 = b[6], b21 = b[7], b22 = b[8];\n\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n        x = v[0], y = v[1];\n\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n    var x = v[0], y = v[1];\n\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\nmat3.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\nmat3.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n\n    return out;\n};\n\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\nmat3.normalFromMat4 = function (out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n    return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n                    a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat3.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)))\n};\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n};\n\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\nmat3.sub = mat3.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nmat3.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n};\n\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\nmat3.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    return out;\n};\n\n/*\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && \n           a[3] === b[3] && a[4] === b[4] && a[5] === b[5] &&\n           a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = a[6], b7 = b[7], b8 = b[8];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)));\n};\n\n\nmodule.exports = mat3;\n\n\n/***/ }),\n/* 574 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to ceil\n * @returns {vec3} out\n */\nvec3.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to floor\n * @returns {vec3} out\n */\nvec3.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to round\n * @returns {vec3} out\n */\nvec3.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n};\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nvec3.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nvec3.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    var len = x*x + y*y + z*z;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n        out[2] = a[2] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2],\n        bx = b[0], by = b[1], bz = b[2];\n\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n};\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.hermite = function (out, a, b, c, d, t) {\n  var factorTimes2 = t * t,\n      factor1 = factorTimes2 * (2 * t - 3) + 1,\n      factor2 = factorTimes2 * (t - 2) + t,\n      factor3 = factorTimes2 * (t - 1),\n      factor4 = factorTimes2 * (3 - 2 * t);\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.bezier = function (out, a, b, c, d, t) {\n  var inverseFactor = 1 - t,\n      inverseFactorTimesTwo = inverseFactor * inverseFactor,\n      factorTimes2 = t * t,\n      factor1 = inverseFactorTimesTwo * inverseFactor,\n      factor2 = 3 * t * inverseFactorTimesTwo,\n      factor3 = 3 * factorTimes2 * inverseFactor,\n      factor4 = factorTimes2 * t;\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\nvec3.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    var z = (glMatrix.RANDOM() * 2.0) - 1.0;\n    var zScale = Math.sqrt(1.0-z*z) * scale;\n\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2],\n        w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat3 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n    // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations\n\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    return out;\n};\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateX = function(out, a, b, c){\n   var p = [], r=[];\n\t  //Translate point to the origin\n\t  p[0] = a[0] - b[0];\n\t  p[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n\n\t  //perform rotation\n\t  r[0] = p[0];\n\t  r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c);\n\t  r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c);\n\n\t  //translate to correct position\n\t  out[0] = r[0] + b[0];\n\t  out[1] = r[1] + b[1];\n\t  out[2] = r[2] + b[2];\n\n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateY = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c);\n  \tr[1] = p[1];\n  \tr[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c);\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateZ = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c);\n  \tr[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c);\n  \tr[2] = p[2];\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n    var vec = vec3.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 3;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nvec3.angle = function(a, b) {\n   \n    var tempA = vec3.fromValues(a[0], a[1], a[2]);\n    var tempB = vec3.fromValues(b[0], b[1], b[2]);\n \n    vec3.normalize(tempA, tempA);\n    vec3.normalize(tempB, tempB);\n \n    var cosine = vec3.dot(tempA, tempB);\n\n    if(cosine > 1.0){\n        return 0;\n    } else {\n        return Math.acos(cosine);\n    }     \n};\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n    return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)));\n};\n\nmodule.exports = vec3;\n\n\n/***/ }),\n/* 575 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to ceil\n * @returns {vec4} out\n */\nvec4.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to floor\n * @returns {vec4} out\n */\nvec4.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to round\n * @returns {vec4} out\n */\nvec4.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    out[3] = Math.round(a[3]);\n    return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nvec4.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\nvec4.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    var len = x*x + y*y + z*z + w*w;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        out[0] = x * len;\n        out[1] = y * len;\n        out[2] = z * len;\n        out[3] = w * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\nvec4.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    //TODO: This is a pretty awful way of doing this. Find something better.\n    out[0] = glMatrix.RANDOM();\n    out[1] = glMatrix.RANDOM();\n    out[2] = glMatrix.RANDOM();\n    out[3] = glMatrix.RANDOM();\n    vec4.normalize(out, out);\n    vec4.scale(out, out, scale);\n    return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n    var vec = vec4.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 4;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n    return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\nmodule.exports = vec4;\n\n\n/***/ }),\n/* 576 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = function(uniforms) {\n    var pragmas = { define: {}, initialize: {} };\n\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        assert(uniform.name.slice(0, 2) === 'u_');\n\n        var type = '{precision} ' + (uniform.components === 1 ? 'float' : 'vec' + uniform.components);\n        pragmas.define[uniform.name.slice(2)] = 'uniform ' + type + ' ' + uniform.name + ';\\n';\n        pragmas.initialize[uniform.name.slice(2)] = type + ' ' + uniform.name.slice(2) + ' = ' + uniform.name + ';\\n';\n    }\n\n    return pragmas;\n};\n\n\n/***/ }),\n/* 577 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(199);\nvar DOM = __webpack_require__(62);\nvar util = __webpack_require__(10);\n\nmodule.exports = Attribution;\n\n/**\n * Creates an attribution control\n * @class Attribution\n * @param {Object} [options]\n * @param {string} [options.position='bottom-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * var map = new mapboxgl.Map({attributionControl: false})\n *     .addControl(new mapboxgl.Attribution({position: 'top-left'}));\n */\nfunction Attribution(options) {\n    util.setOptions(this, options);\n}\n\nAttribution.createAttributionString = function(sources) {\n    var attributions = [];\n\n    for (var id in sources) {\n        var source = sources[id];\n        if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n            attributions.push(source.attribution);\n        }\n    }\n\n    // remove any entries that are substrings of another entry.\n    // first sort by length so that substrings come first\n    attributions.sort(function (a, b) { return a.length - b.length; });\n    attributions = attributions.filter(function (attrib, i) {\n        for (var j = i + 1; j < attributions.length; j++) {\n            if (attributions[j].indexOf(attrib) >= 0) { return false; }\n        }\n        return true;\n    });\n\n    return attributions.join(' | ');\n};\n\nAttribution.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-attrib',\n            container = this._container = DOM.create('div', className, map.getContainer());\n\n        this._update();\n        map.on('source.load', this._update.bind(this));\n        map.on('source.change', this._update.bind(this));\n        map.on('source.remove', this._update.bind(this));\n        map.on('moveend', this._updateEditLink.bind(this));\n\n        return container;\n    },\n\n    _update: function() {\n        if (this._map.style) {\n            this._container.innerHTML = Attribution.createAttributionString(this._map.style.sources);\n        }\n\n        this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0];\n        this._updateEditLink();\n    },\n\n    _updateEditLink: function() {\n        if (this._editLink) {\n            var center = this._map.getCenter();\n            this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' +\n                    center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1);\n        }\n    }\n});\n\n\n/***/ }),\n/* 578 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _bowser = __webpack_require__(1089);\n\nvar _bowser2 = _interopRequireDefault(_bowser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PREFIX = _bowser2.default.webkit ? '-webkit-' : _bowser2.default.gecko ? '-moz-' : ''; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nexports.default = {\n  DEFAULTS: {},\n  MAPBOX_API_ACCESS_TOKEN: null,\n  CURSOR: {\n    GRABBING: PREFIX + 'grabbing',\n    GRAB: PREFIX + 'grab'\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWcuanMiXSwibmFtZXMiOlsiUFJFRklYIiwiYnJvd3NlciIsIndlYmtpdCIsImdlY2tvIiwiREVGQVVMVFMiLCJNQVBCT1hfQVBJX0FDQ0VTU19UT0tFTiIsIkNVUlNPUiIsIkdSQUJCSU5HIiwiR1JBQiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBb0JBOzs7Ozs7QUFFQSxJQUFNQSxTQUNKQyxpQkFBUUMsTUFBUixHQUFpQixVQUFqQixHQUNBRCxpQkFBUUUsS0FBUixHQUFnQixPQUFoQixHQUNBLEVBSEYsQyxDQXRCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a0JBU2U7QUFDYkMsWUFBVSxFQURHO0FBRWJDLDJCQUF5QixJQUZaO0FBR2JDLFVBQVE7QUFDTkMsY0FBYVAsTUFBYixhQURNO0FBRU5RLFVBQVNSLE1BQVQ7QUFGTTtBQUhLLEMiLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnYm93c2VyJztcblxuY29uc3QgUFJFRklYID1cbiAgYnJvd3Nlci53ZWJraXQgPyAnLXdlYmtpdC0nIDpcbiAgYnJvd3Nlci5nZWNrbyA/ICctbW96LScgOlxuICAnJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBERUZBVUxUUzoge30sXG4gIE1BUEJPWF9BUElfQUNDRVNTX1RPS0VOOiBudWxsLFxuICBDVVJTT1I6IHtcbiAgICBHUkFCQklORzogYCR7UFJFRklYfWdyYWJiaW5nYCxcbiAgICBHUkFCOiBgJHtQUkVGSVh9Z3JhYmBcbiAgfVxufTtcbiJdfQ==\n\n/***/ }),\n/* 579 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = noop;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction noop() {}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub29wLmpzIl0sIm5hbWVzIjpbIm5vb3AiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQW9Cd0JBLEk7QUFwQnhCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlLFNBQVNBLElBQVQsR0FBZ0IsQ0FDOUIiLCJmaWxlIjoibm9vcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vb3AoKSB7XG59XG4iXX0=\n\n/***/ }),\n/* 580 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction HeatmapShader(gl, _arg) {\n  var fragment, vertex;\n  this.gl = gl;\n  vertex = _arg.vertex, fragment = _arg.fragment;\n  this.program = this.gl.createProgram();\n  this.vs = this.gl.createShader(this.gl.VERTEX_SHADER);\n  this.fs = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n  this.gl.attachShader(this.program, this.vs);\n  this.gl.attachShader(this.program, this.fs);\n  this.compileShader(this.vs, vertex);\n  this.compileShader(this.fs, fragment);\n  this.link();\n  this.value_cache = {};\n  this.uniform_cache = {};\n  this.attribCache = {};\n}\n\nHeatmapShader.prototype.attribLocation = function(name) {\n  var location;\n  location = this.attribCache[name];\n  if (location === void 0) {\n    location = this.attribCache[name] = this.gl.getAttribLocation(this.program, name);\n  }\n  return location;\n};\n\nHeatmapShader.prototype.compileShader = function(shader, source) {\n  this.gl.shaderSource(shader, source);\n  this.gl.compileShader(shader);\n  if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n    throw \"Shader Compile Error: \" + (this.gl.getShaderInfoLog(shader));\n  }\n};\n\nHeatmapShader.prototype.link = function() {\n  this.gl.linkProgram(this.program);\n  if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) {\n    throw \"Shader Link Error: \" + (this.gl.getProgramInfoLog(this.program));\n  }\n};\n\nHeatmapShader.prototype.use = function() {\n  this.gl.useProgram(this.program);\n  return this;\n};\n\nHeatmapShader.prototype.uniformLoc = function(name) {\n  var location;\n  location = this.uniform_cache[name];\n  if (location === void 0) {\n    location = this.uniform_cache[name] = this.gl.getUniformLocation(this.program, name);\n  }\n  return location;\n};\n\nHeatmapShader.prototype.int = function(name, value) {\n  var cached, loc;\n  cached = this.value_cache[name];\n  if (cached !== value) {\n    this.value_cache[name] = value;\n    loc = this.uniformLoc(name);\n    if (loc) {\n      this.gl.uniform1i(loc, value);\n    }\n  }\n  return this;\n};\n\nHeatmapShader.prototype.vec2 = function(name, a, b) {\n  var loc;\n  loc = this.uniformLoc(name);\n  if (loc) {\n    this.gl.uniform2f(loc, a, b);\n  }\n  return this;\n};\n\nHeatmapShader.prototype.float = function(name, value) {\n  var cached, loc;\n  cached = this.value_cache[name];\n  if (cached !== value) {\n    this.value_cache[name] = value;\n    loc = this.uniformLoc(name);\n    if (loc) {\n      this.gl.uniform1f(loc, value);\n    }\n  }\n  return this;\n};\n\nmodule.exports = HeatmapShader;\n\n\n/***/ }),\n/* 581 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _DragDropContext = __webpack_require__(582);\n\nObject.defineProperty(exports, 'DragDropContext', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropContext).default;\n  }\n});\n\nvar _DragDropContextProvider = __webpack_require__(1200);\n\nObject.defineProperty(exports, 'DragDropContextProvider', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropContextProvider).default;\n  }\n});\n\nvar _DragLayer = __webpack_require__(1201);\n\nObject.defineProperty(exports, 'DragLayer', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragLayer).default;\n  }\n});\n\nvar _DragSource = __webpack_require__(1210);\n\nObject.defineProperty(exports, 'DragSource', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragSource).default;\n  }\n});\n\nvar _DropTarget = __webpack_require__(1221);\n\nObject.defineProperty(exports, 'DropTarget', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DropTarget).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 582 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.unpackBackendForEs5Users = exports.createChildContext = exports.CHILD_CONTEXT_TYPES = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = DragDropContext;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _dndCore = __webpack_require__(1114);\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _hoistNonReactStatics = __webpack_require__(189);\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _checkDecoratorArguments = __webpack_require__(207);\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CHILD_CONTEXT_TYPES = exports.CHILD_CONTEXT_TYPES = {\n\tdragDropManager: _propTypes2.default.object.isRequired\n};\n\nvar createChildContext = exports.createChildContext = function createChildContext(backend, context) {\n\treturn {\n\t\tdragDropManager: new _dndCore.DragDropManager(backend, context)\n\t};\n};\n\nvar unpackBackendForEs5Users = exports.unpackBackendForEs5Users = function unpackBackendForEs5Users(backendOrModule) {\n\t// Auto-detect ES6 default export for people still using ES5\n\tvar backend = backendOrModule;\n\tif ((typeof backend === 'undefined' ? 'undefined' : _typeof(backend)) === 'object' && typeof backend.default === 'function') {\n\t\tbackend = backend.default;\n\t}\n\t(0, _invariant2.default)(typeof backend === 'function', 'Expected the backend to be a function or an ES6 module exporting a default function. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html');\n\treturn backend;\n};\n\nfunction DragDropContext(backendOrModule) {\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragDropContext', 'backend'].concat(Array.prototype.slice.call(arguments))); // eslint-disable-line prefer-rest-params\n\n\tvar backend = unpackBackendForEs5Users(backendOrModule);\n\tvar childContext = createChildContext(backend);\n\n\treturn function decorateContext(DecoratedComponent) {\n\t\tvar _class, _temp;\n\n\t\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\t\tvar DragDropContextContainer = (_temp = _class = function (_Component) {\n\t\t\t_inherits(DragDropContextContainer, _Component);\n\n\t\t\tfunction DragDropContextContainer() {\n\t\t\t\t_classCallCheck(this, DragDropContextContainer);\n\n\t\t\t\treturn _possibleConstructorReturn(this, (DragDropContextContainer.__proto__ || Object.getPrototypeOf(DragDropContextContainer)).apply(this, arguments));\n\t\t\t}\n\n\t\t\t_createClass(DragDropContextContainer, [{\n\t\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\t\t(0, _invariant2.default)(this.child, 'In order to access an instance of the decorated component it can not be a stateless component.');\n\t\t\t\t\treturn this.child;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getManager',\n\t\t\t\tvalue: function getManager() {\n\t\t\t\t\treturn childContext.dragDropManager;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getChildContext',\n\t\t\t\tvalue: function getChildContext() {\n\t\t\t\t\treturn childContext;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'render',\n\t\t\t\tvalue: function render() {\n\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, {\n\t\t\t\t\t\tref: function ref(child) {\n\t\t\t\t\t\t\t_this2.child = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\treturn DragDropContextContainer;\n\t\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = 'DragDropContext(' + displayName + ')', _class.childContextTypes = CHILD_CONTEXT_TYPES, _temp);\n\n\n\t\treturn (0, _hoistNonReactStatics2.default)(DragDropContextContainer, DecoratedComponent);\n\t};\n}\n\n/***/ }),\n/* 583 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(1119);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 584 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = dragOffset;\nexports.getSourceClientOffset = getSourceClientOffset;\nexports.getDifferenceFromInitialOffset = getDifferenceFromInitialOffset;\n\nvar _dragDrop = __webpack_require__(200);\n\nvar initialState = {\n\tinitialSourceClientOffset: null,\n\tinitialClientOffset: null,\n\tclientOffset: null\n};\n\nfunction areOffsetsEqual(offsetA, offsetB) {\n\tif (offsetA === offsetB) {\n\t\treturn true;\n\t}\n\treturn offsetA && offsetB && offsetA.x === offsetB.x && offsetA.y === offsetB.y;\n}\n\nfunction dragOffset() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\t\treturn {\n\t\t\t\tinitialSourceClientOffset: action.sourceClientOffset,\n\t\t\t\tinitialClientOffset: action.clientOffset,\n\t\t\t\tclientOffset: action.clientOffset\n\t\t\t};\n\t\tcase _dragDrop.HOVER:\n\t\t\tif (areOffsetsEqual(state.clientOffset, action.clientOffset)) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn _extends({}, state, {\n\t\t\t\tclientOffset: action.clientOffset\n\t\t\t});\n\t\tcase _dragDrop.END_DRAG:\n\t\tcase _dragDrop.DROP:\n\t\t\treturn initialState;\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\nfunction getSourceClientOffset(state) {\n\tvar clientOffset = state.clientOffset,\n\t    initialClientOffset = state.initialClientOffset,\n\t    initialSourceClientOffset = state.initialSourceClientOffset;\n\n\tif (!clientOffset || !initialClientOffset || !initialSourceClientOffset) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tx: clientOffset.x + initialSourceClientOffset.x - initialClientOffset.x,\n\t\ty: clientOffset.y + initialSourceClientOffset.y - initialClientOffset.y\n\t};\n}\n\nfunction getDifferenceFromInitialOffset(state) {\n\tvar clientOffset = state.clientOffset,\n\t    initialClientOffset = state.initialClientOffset;\n\n\tif (!clientOffset || !initialClientOffset) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tx: clientOffset.x - initialClientOffset.x,\n\t\ty: clientOffset.y - initialClientOffset.y\n\t};\n}\n\n/***/ }),\n/* 585 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = matchesType;\n\nvar _isArray = __webpack_require__(158);\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction matchesType(targetType, draggedItemType) {\n\tif ((0, _isArray2.default)(targetType)) {\n\t\treturn targetType.some(function (t) {\n\t\t\treturn t === draggedItemType;\n\t\t});\n\t} else {\n\t\treturn targetType === draggedItemType;\n\t}\n}\n\n/***/ }),\n/* 586 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar SetCache = __webpack_require__(284),\n    arrayIncludes = __webpack_require__(286),\n    arrayIncludesWith = __webpack_require__(287),\n    arrayMap = __webpack_require__(288),\n    baseUnary = __webpack_require__(589),\n    cacheHas = __webpack_require__(289);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n\n\n/***/ }),\n/* 587 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(588),\n    isObject = __webpack_require__(283);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n/***/ }),\n/* 588 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(285),\n    getRawTag = __webpack_require__(1138),\n    objectToString = __webpack_require__(1139);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 589 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n/***/ }),\n/* 590 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n/***/ }),\n/* 591 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = dirtyHandlerIds;\nexports.areDirty = areDirty;\n\nvar _xor = __webpack_require__(1177);\n\nvar _xor2 = _interopRequireDefault(_xor);\n\nvar _intersection = __webpack_require__(1188);\n\nvar _intersection2 = _interopRequireDefault(_intersection);\n\nvar _dragDrop = __webpack_require__(200);\n\nvar _registry = __webpack_require__(206);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NONE = [];\nvar ALL = [];\n\nfunction dirtyHandlerIds() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : NONE;\n\tvar action = arguments[1];\n\tvar dragOperation = arguments[2];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.HOVER:\n\t\t\tbreak;\n\t\tcase _registry.ADD_SOURCE:\n\t\tcase _registry.ADD_TARGET:\n\t\tcase _registry.REMOVE_TARGET:\n\t\tcase _registry.REMOVE_SOURCE:\n\t\t\treturn NONE;\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\tcase _dragDrop.PUBLISH_DRAG_SOURCE:\n\t\tcase _dragDrop.END_DRAG:\n\t\tcase _dragDrop.DROP:\n\t\tdefault:\n\t\t\treturn ALL;\n\t}\n\n\tvar targetIds = action.targetIds;\n\tvar prevTargetIds = dragOperation.targetIds;\n\n\tvar result = (0, _xor2.default)(targetIds, prevTargetIds);\n\n\tvar didChange = false;\n\tif (result.length === 0) {\n\t\tfor (var i = 0; i < targetIds.length; i++) {\n\t\t\tif (targetIds[i] !== prevTargetIds[i]) {\n\t\t\t\tdidChange = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdidChange = true;\n\t}\n\n\tif (!didChange) {\n\t\treturn NONE;\n\t}\n\n\tvar prevInnermostTargetId = prevTargetIds[prevTargetIds.length - 1];\n\tvar innermostTargetId = targetIds[targetIds.length - 1];\n\n\tif (prevInnermostTargetId !== innermostTargetId) {\n\t\tif (prevInnermostTargetId) {\n\t\t\tresult.push(prevInnermostTargetId);\n\t\t}\n\t\tif (innermostTargetId) {\n\t\t\tresult.push(innermostTargetId);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction areDirty(state, handlerIds) {\n\tif (state === NONE) {\n\t\treturn false;\n\t}\n\n\tif (state === ALL || typeof handlerIds === 'undefined') {\n\t\treturn true;\n\t}\n\n\treturn (0, _intersection2.default)(handlerIds, state).length > 0;\n}\n\n/***/ }),\n/* 592 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n/***/ }),\n/* 593 */\n/***/ (function(module, exports) {\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n/***/ }),\n/* 594 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(1203);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 595 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = shallowEqualScalar;\nfunction shallowEqualScalar(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tif ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {\n\t\treturn false;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i])) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB || (typeof valA === 'undefined' ? 'undefined' : _typeof(valA)) === 'object' || (typeof valB === 'undefined' ? 'undefined' : _typeof(valB)) === 'object') {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/***/ }),\n/* 596 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = decorateHandler;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _disposables = __webpack_require__(1211);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _hoistNonReactStatics = __webpack_require__(189);\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _shallowEqual = __webpack_require__(293);\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _shallowEqualScalar = __webpack_require__(595);\n\nvar _shallowEqualScalar2 = _interopRequireDefault(_shallowEqualScalar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar isClassComponent = function isClassComponent(Comp) {\n\treturn Boolean(Comp && Comp.prototype && typeof Comp.prototype.render === 'function');\n};\n\nfunction decorateHandler(_ref) {\n\tvar _class, _temp;\n\n\tvar DecoratedComponent = _ref.DecoratedComponent,\n\t    createHandler = _ref.createHandler,\n\t    createMonitor = _ref.createMonitor,\n\t    createConnector = _ref.createConnector,\n\t    registerHandler = _ref.registerHandler,\n\t    containerDisplayName = _ref.containerDisplayName,\n\t    getType = _ref.getType,\n\t    collect = _ref.collect,\n\t    options = _ref.options;\n\tvar _options$arePropsEqua = options.arePropsEqual,\n\t    arePropsEqual = _options$arePropsEqua === undefined ? _shallowEqualScalar2.default : _options$arePropsEqua;\n\n\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\tvar DragDropContainer = (_temp = _class = function (_Component) {\n\t\t_inherits(DragDropContainer, _Component);\n\n\t\t_createClass(DragDropContainer, [{\n\t\t\tkey: 'getHandlerId',\n\t\t\tvalue: function getHandlerId() {\n\t\t\t\treturn this.handlerId;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\treturn this.decoratedComponentInstance;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'shouldComponentUpdate',\n\t\t\tvalue: function shouldComponentUpdate(nextProps, nextState) {\n\t\t\t\treturn !arePropsEqual(nextProps, this.props) || !(0, _shallowEqual2.default)(nextState, this.state);\n\t\t\t}\n\t\t}]);\n\n\t\tfunction DragDropContainer(props, context) {\n\t\t\t_classCallCheck(this, DragDropContainer);\n\n\t\t\tvar _this = _possibleConstructorReturn(this, (DragDropContainer.__proto__ || Object.getPrototypeOf(DragDropContainer)).call(this, props, context));\n\n\t\t\t_this.handleChange = _this.handleChange.bind(_this);\n\t\t\t_this.handleChildRef = _this.handleChildRef.bind(_this);\n\n\t\t\t(0, _invariant2.default)(_typeof(_this.context.dragDropManager) === 'object', 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to wrap the top-level component of your app with DragDropContext. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);\n\n\t\t\t_this.manager = _this.context.dragDropManager;\n\t\t\t_this.handlerMonitor = createMonitor(_this.manager);\n\t\t\t_this.handlerConnector = createConnector(_this.manager.getBackend());\n\t\t\t_this.handler = createHandler(_this.handlerMonitor);\n\n\t\t\t_this.disposable = new _disposables.SerialDisposable();\n\t\t\t_this.receiveProps(props);\n\t\t\t_this.state = _this.getCurrentState();\n\t\t\t_this.dispose();\n\t\t\treturn _this;\n\t\t}\n\n\t\t_createClass(DragDropContainer, [{\n\t\t\tkey: 'componentDidMount',\n\t\t\tvalue: function componentDidMount() {\n\t\t\t\tthis.isCurrentlyMounted = true;\n\t\t\t\tthis.disposable = new _disposables.SerialDisposable();\n\t\t\t\tthis.currentType = null;\n\t\t\t\tthis.receiveProps(this.props);\n\t\t\t\tthis.handleChange();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillReceiveProps',\n\t\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\t\tif (!arePropsEqual(nextProps, this.props)) {\n\t\t\t\t\tthis.receiveProps(nextProps);\n\t\t\t\t\tthis.handleChange();\n\t\t\t\t}\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillUnmount',\n\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\tthis.dispose();\n\t\t\t\tthis.isCurrentlyMounted = false;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.handler.receiveProps(props);\n\t\t\t\tthis.receiveType(getType(props));\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveType',\n\t\t\tvalue: function receiveType(type) {\n\t\t\t\tif (type === this.currentType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.currentType = type;\n\n\t\t\t\tvar _registerHandler = registerHandler(type, this.handler, this.manager),\n\t\t\t\t    handlerId = _registerHandler.handlerId,\n\t\t\t\t    unregister = _registerHandler.unregister;\n\n\t\t\t\tthis.handlerId = handlerId;\n\t\t\t\tthis.handlerMonitor.receiveHandlerId(handlerId);\n\t\t\t\tthis.handlerConnector.receiveHandlerId(handlerId);\n\n\t\t\t\tvar globalMonitor = this.manager.getMonitor();\n\t\t\t\tvar unsubscribe = globalMonitor.subscribeToStateChange(this.handleChange, { handlerIds: [handlerId] });\n\n\t\t\t\tthis.disposable.setDisposable(new _disposables.CompositeDisposable(new _disposables.Disposable(unsubscribe), new _disposables.Disposable(unregister)));\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'handleChange',\n\t\t\tvalue: function handleChange() {\n\t\t\t\tif (!this.isCurrentlyMounted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar nextState = this.getCurrentState();\n\t\t\t\tif (!(0, _shallowEqual2.default)(nextState, this.state)) {\n\t\t\t\t\tthis.setState(nextState);\n\t\t\t\t}\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'dispose',\n\t\t\tvalue: function dispose() {\n\t\t\t\tthis.disposable.dispose();\n\t\t\t\tthis.handlerConnector.receiveHandlerId(null);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'handleChildRef',\n\t\t\tvalue: function handleChildRef(component) {\n\t\t\t\tthis.decoratedComponentInstance = component;\n\t\t\t\tthis.handler.receiveComponent(component);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'getCurrentState',\n\t\t\tvalue: function getCurrentState() {\n\t\t\t\tvar nextState = collect(this.handlerConnector.hooks, this.handlerMonitor);\n\n\t\t\t\tif (false) {\n\t\t\t\t\t(0, _invariant2.default)((0, _isPlainObject2.default)(nextState), 'Expected `collect` specified as the second argument to ' + '%s for %s to return a plain object of props to inject. ' + 'Instead, received %s.', containerDisplayName, displayName, nextState);\n\t\t\t\t}\n\n\t\t\t\treturn nextState;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'render',\n\t\t\tvalue: function render() {\n\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, this.state, {\n\t\t\t\t\tref: isClassComponent(DecoratedComponent) ? this.handleChildRef : null\n\t\t\t\t}));\n\t\t\t}\n\t\t}]);\n\n\t\treturn DragDropContainer;\n\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = containerDisplayName + '(' + displayName + ')', _class.contextTypes = {\n\t\tdragDropManager: _propTypes2.default.object.isRequired\n\t}, _temp);\n\n\n\treturn (0, _hoistNonReactStatics2.default)(DragDropContainer, DecoratedComponent);\n}\n\n/***/ }),\n/* 597 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = wrapConnectorHooks;\n\nvar _react = __webpack_require__(0);\n\nvar _cloneWithRef = __webpack_require__(1219);\n\nvar _cloneWithRef2 = _interopRequireDefault(_cloneWithRef);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction throwIfCompositeComponentElement(element) {\n\t// Custom components can no longer be wrapped directly in React DnD 2.0\n\t// so that we don't need to depend on findDOMNode() from react-dom.\n\tif (typeof element.type === 'string') {\n\t\treturn;\n\t}\n\n\tvar displayName = element.type.displayName || element.type.name || 'the component';\n\n\tthrow new Error('Only native element nodes can now be passed to React DnD connectors.' + ('You can either wrap ' + displayName + ' into a <div>, or turn it into a ') + 'drag source or a drop target itself.');\n}\n\nfunction wrapHookToRecognizeElement(hook) {\n\treturn function () {\n\t\tvar elementOrNode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t// When passed a node, call the hook straight away.\n\t\tif (!(0, _react.isValidElement)(elementOrNode)) {\n\t\t\tvar node = elementOrNode;\n\t\t\thook(node, options);\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// If passed a ReactElement, clone it and attach this function as a ref.\n\t\t// This helps us achieve a neat API where user doesn't even know that refs\n\t\t// are being used under the hood.\n\t\tvar element = elementOrNode;\n\t\tthrowIfCompositeComponentElement(element);\n\n\t\t// When no options are passed, use the hook directly\n\t\tvar ref = options ? function (node) {\n\t\t\treturn hook(node, options);\n\t\t} : hook;\n\n\t\treturn (0, _cloneWithRef2.default)(element, ref);\n\t};\n}\n\nfunction wrapConnectorHooks(hooks) {\n\tvar wrappedHooks = {};\n\n\tObject.keys(hooks).forEach(function (key) {\n\t\tvar hook = hooks[key];\n\t\tvar wrappedHook = wrapHookToRecognizeElement(hook);\n\t\twrappedHooks[key] = function () {\n\t\t\treturn wrappedHook;\n\t\t};\n\t});\n\n\treturn wrappedHooks;\n}\n\n/***/ }),\n/* 598 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = areOptionsEqual;\n\nvar _shallowEqual = __webpack_require__(293);\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction areOptionsEqual(nextOptions, currentOptions) {\n\tif (currentOptions === nextOptions) {\n\t\treturn true;\n\t}\n\n\treturn currentOptions !== null && nextOptions !== null && (0, _shallowEqual2.default)(currentOptions, nextOptions);\n}\n\n/***/ }),\n/* 599 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = isValidType;\n\nvar _isArray = __webpack_require__(1220);\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isValidType(type, allowArray) {\n\treturn typeof type === 'string' || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'symbol' || allowArray && (0, _isArray2.default)(type) && type.every(function (t) {\n\t\treturn isValidType(t, false);\n\t});\n}\n\n/***/ }),\n/* 600 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n/***/ }),\n/* 601 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(296),\n    isObject = __webpack_require__(209);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n/***/ }),\n/* 602 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 603 */\n/***/ (function(module, exports) {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n/***/ }),\n/* 604 */\n/***/ (function(module, exports) {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n\n\n/***/ }),\n/* 605 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsArguments = __webpack_require__(1247),\n    isObjectLike = __webpack_require__(210);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n/***/ }),\n/* 606 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n/* 607 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n/***/ }),\n/* 608 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MapCache = __webpack_require__(609),\n    setCacheAdd = __webpack_require__(1282),\n    setCacheHas = __webpack_require__(1283);\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n/***/ }),\n/* 609 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar mapCacheClear = __webpack_require__(1263),\n    mapCacheDelete = __webpack_require__(1277),\n    mapCacheGet = __webpack_require__(1279),\n    mapCacheHas = __webpack_require__(1280),\n    mapCacheSet = __webpack_require__(1281);\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n/***/ }),\n/* 610 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIndexOf = __webpack_require__(1284);\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n/***/ }),\n/* 611 */\n/***/ (function(module, exports) {\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n/***/ }),\n/* 612 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n/***/ }),\n/* 613 */\n/***/ (function(module, exports) {\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n/***/ }),\n/* 614 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isArrayLike = __webpack_require__(299),\n    isObjectLike = __webpack_require__(210);\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n\n\n/***/ }),\n/* 615 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSafari = exports.isFirefox = undefined;\n\nvar _memoize = __webpack_require__(1294);\n\nvar _memoize2 = _interopRequireDefault(_memoize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isFirefox = exports.isFirefox = (0, _memoize2.default)(function () {\n  return (/firefox/i.test(navigator.userAgent)\n  );\n});\nvar isSafari = exports.isSafari = (0, _memoize2.default)(function () {\n  return Boolean(window.safari);\n});\n\n/***/ }),\n/* 616 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(302);\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n\n\n/***/ }),\n/* 617 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(304),\n    getRawTag = __webpack_require__(1311),\n    objectToString = __webpack_require__(1312);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 618 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsNative = __webpack_require__(1319),\n    getValue = __webpack_require__(1324);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n/***/ }),\n/* 619 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metaMap = __webpack_require__(1327),\n    noop = __webpack_require__(1329);\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n  return metaMap.get(func);\n};\n\nmodule.exports = getData;\n\n\n/***/ }),\n/* 620 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar realNames = __webpack_require__(1330);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n  var result = (func.name + ''),\n      array = realNames[result],\n      length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n  while (length--) {\n    var data = array[length],\n        otherFunc = data.func;\n    if (otherFunc == null || otherFunc == func) {\n      return data.name;\n    }\n  }\n  return result;\n}\n\nmodule.exports = getFuncName;\n\n\n/***/ }),\n/* 621 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _amount = __webpack_require__(214);\n\nvar _amount2 = _interopRequireDefault(_amount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar amountTypes = ['numeric', 'monetary'];\nvar isAmountType = function isAmountType(columnType) {\n    return _lodash2.default.includes(amountTypes, columnType);\n};\nvar getAmountTypeFor = function getAmountTypeFor(columnType, locale) {\n    return columnType === 'monetary' ? (0, _numberTypes.localeToCurrency)(locale) : _numberTypes.numberTypes.none;\n};\n\nvar TooltipValue = function (_React$Component) {\n    _inherits(TooltipValue, _React$Component);\n\n    function TooltipValue() {\n        _classCallCheck(this, TooltipValue);\n\n        return _possibleConstructorReturn(this, (TooltipValue.__proto__ || Object.getPrototypeOf(TooltipValue)).apply(this, arguments));\n    }\n\n    _createClass(TooltipValue, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                columnType = _props.columnType,\n                value = _props.value,\n                locale = _props.locale;\n\n            if (isAmountType(columnType)) {\n                var amountType = getAmountTypeFor(columnType, locale);\n                return _react2.default.createElement(_amount2.default, { value: parseFloat(value), unit: amountType });\n            }\n            return _react2.default.createElement(\"span\", null, value);\n        }\n    }]);\n\n    return TooltipValue;\n}(_react2.default.Component);\n\nexports.default = TooltipValue;\n\nTooltipValue.propTypes = {\n    locale: _propTypes2.default.string.isRequired,\n    columnName: _propTypes2.default.string.isRequired,\n    columnType: _propTypes2.default.string.isRequired,\n    value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]).isRequired\n};\n\n/***/ }),\n/* 622 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.formatValue = undefined;\n\nvar _numeral = __webpack_require__(144);\n\nvar _numeral2 = _interopRequireDefault(_numeral);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar formatValue = exports.formatValue = function formatValue(symbol, value, abbreviated) {\n    if (abbreviated && Math.abs(value) >= 10e3) {\n        return (0, _numeral2.default)(value).format('0,0.0[0]a').toUpperCase();\n    }\n    if (symbol === 'FTE') {\n        return _strings2.default.formatFTE(value);\n    }\n    return (0, _numeral2.default)(value).format('0,0');\n};\n\n/***/ }),\n/* 623 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(37);\n\n// jshint -W079\nvar mapboxgl = module.exports = {};\n\nmapboxgl.version = __webpack_require__(1338).version;\nmapboxgl.workerCount = Math.max(browser.hardwareConcurrency - 1, 1);\n\n\nmapboxgl.Map = __webpack_require__(1339);\nmapboxgl.Control = __webpack_require__(166);\nmapboxgl.Navigation = __webpack_require__(1422);\nmapboxgl.Geolocate = __webpack_require__(1423);\nmapboxgl.Attribution = __webpack_require__(654);\nmapboxgl.Scale = __webpack_require__(1424);\nmapboxgl.Popup = __webpack_require__(655);\nmapboxgl.Marker = __webpack_require__(1425);\n\nmapboxgl.Style = __webpack_require__(624);\n\nmapboxgl.LngLat = __webpack_require__(82);\nmapboxgl.LngLatBounds = __webpack_require__(219);\nmapboxgl.Point = __webpack_require__(11);\n\nmapboxgl.Evented = __webpack_require__(47);\nmapboxgl.util = __webpack_require__(6);\n\nmapboxgl.supported = __webpack_require__(37).supported;\n\nvar ajax = __webpack_require__(91);\nmapboxgl.util.getJSON = ajax.getJSON;\nmapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;\n\nvar config = __webpack_require__(639);\nmapboxgl.config = config;\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n    get: function() { return config.ACCESS_TOKEN; },\n    set: function(token) { config.ACCESS_TOKEN = token; }\n});\n\n/**\n * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/).\n *\n * @var {string} accessToken\n * @example\n * mapboxgl.accessToken = myAccessToken;\n */\n\n/**\n * The version of Mapbox GL JS in use as specified in `package.json`,\n * `CHANGELOG.md`, and the GitHub release.\n *\n * @var {string} version\n */\n\n/**\n * Returns a Boolean indicating whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js).\n *\n * @function supported\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,\n *   the function will return `false` if the performance of Mapbox GL JS would\n *   be dramatically worse than expected (i.e. a software renderer would be used).\n * @return {boolean}\n * @example\n * mapboxgl.supported() // = true\n */\n\n\n/***/ }),\n/* 624 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(47);\nvar StyleLayer = __webpack_require__(103);\nvar ImageSprite = __webpack_require__(1354);\nvar GlyphSource = __webpack_require__(1359);\nvar SpriteAtlas = __webpack_require__(1362);\nvar LineAtlas = __webpack_require__(1363);\nvar util = __webpack_require__(6);\nvar ajax = __webpack_require__(91);\nvar normalizeURL = __webpack_require__(128).normalizeStyleURL;\nvar browser = __webpack_require__(37);\nvar Dispatcher = __webpack_require__(1364);\nvar AnimationLoop = __webpack_require__(642);\nvar validateStyle = __webpack_require__(628);\nvar Source = __webpack_require__(643);\nvar QueryFeatures = __webpack_require__(1386);\nvar SourceCache = __webpack_require__(650);\nvar styleSpec = __webpack_require__(626);\nvar StyleFunction = __webpack_require__(309);\nvar getWorkerPool = __webpack_require__(1395);\n\nmodule.exports = Style;\n\nfunction Style(stylesheet, animationLoop) {\n    this.animationLoop = animationLoop || new AnimationLoop();\n    this.dispatcher = new Dispatcher(getWorkerPool(), this);\n    this.spriteAtlas = new SpriteAtlas(1024, 1024);\n    this.lineAtlas = new LineAtlas(256, 512);\n\n    this._layers = {};\n    this._order  = [];\n    this._groups = [];\n    this.sources = {};\n    this.zoomHistory = {};\n\n    util.bindAll([\n        '_forwardSourceEvent',\n        '_forwardTileEvent',\n        '_forwardLayerEvent',\n        '_redoPlacement'\n    ], this);\n\n    this._resetUpdates();\n\n    var stylesheetLoaded = function(err, stylesheet) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        if (validateStyle.emitErrors(this, validateStyle(stylesheet))) return;\n\n        this._loaded = true;\n        this.stylesheet = stylesheet;\n\n        this.updateClasses();\n\n        var sources = stylesheet.sources;\n        for (var id in sources) {\n            this.addSource(id, sources[id]);\n        }\n\n        if (stylesheet.sprite) {\n            this.sprite = new ImageSprite(stylesheet.sprite);\n            this.sprite.on('load', this.fire.bind(this, 'change'));\n        }\n\n        this.glyphSource = new GlyphSource(stylesheet.glyphs);\n        this._resolve();\n        this.fire('load');\n    }.bind(this);\n\n    if (typeof stylesheet === 'string') {\n        ajax.getJSON(normalizeURL(stylesheet), stylesheetLoaded);\n    } else {\n        browser.frame(stylesheetLoaded.bind(this, null, stylesheet));\n    }\n\n    this.on('source.load', function(event) {\n        var source = event.source;\n        if (source && source.vectorLayerIds) {\n            for (var layerId in this._layers) {\n                var layer = this._layers[layerId];\n                if (layer.source === source.id) {\n                    this._validateLayer(layer);\n                }\n            }\n        }\n    });\n}\n\nStyle.prototype = util.inherit(Evented, {\n    _loaded: false,\n\n    _validateLayer: function(layer) {\n        var source = this.sources[layer.source];\n\n        if (!layer.sourceLayer) return;\n        if (!source) return;\n        if (!source.vectorLayerIds) return;\n\n        if (source.vectorLayerIds.indexOf(layer.sourceLayer) === -1) {\n            this.fire('error', {\n                error: new Error(\n                    'Source layer \"' + layer.sourceLayer + '\" ' +\n                    'does not exist on source \"' + source.id + '\" ' +\n                    'as specified by style layer \"' + layer.id + '\"'\n                )\n            });\n        }\n    },\n\n    loaded: function() {\n        if (!this._loaded)\n            return false;\n\n        if (Object.keys(this._updates.sources).length)\n            return false;\n\n        for (var id in this.sources)\n            if (!this.sources[id].loaded())\n                return false;\n\n        if (this.sprite && !this.sprite.loaded())\n            return false;\n\n        return true;\n    },\n\n    _resolve: function() {\n        var layer, layerJSON;\n\n        this._layers = {};\n        this._order  = this.stylesheet.layers.map(function(layer) {\n            return layer.id;\n        });\n\n        // resolve all layers WITHOUT a ref\n        for (var i = 0; i < this.stylesheet.layers.length; i++) {\n            layerJSON = this.stylesheet.layers[i];\n            if (layerJSON.ref) continue;\n            layer = StyleLayer.create(layerJSON);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        // resolve all layers WITH a ref\n        for (var j = 0; j < this.stylesheet.layers.length; j++) {\n            layerJSON = this.stylesheet.layers[j];\n            if (!layerJSON.ref) continue;\n            var refLayer = this.getLayer(layerJSON.ref);\n            layer = StyleLayer.create(layerJSON, refLayer);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        this._groupLayers();\n        this._updateWorkerLayers();\n    },\n\n    _groupLayers: function() {\n        var group;\n\n        this._groups = [];\n\n        // Split into groups of consecutive top-level layers with the same source.\n        for (var i = 0; i < this._order.length; ++i) {\n            var layer = this._layers[this._order[i]];\n\n            if (!group || layer.source !== group.source) {\n                group = [];\n                group.source = layer.source;\n                this._groups.push(group);\n            }\n\n            group.push(layer);\n        }\n    },\n\n    _updateWorkerLayers: function(ids) {\n        this.dispatcher.broadcast(ids ? 'update layers' : 'set layers', this._serializeLayers(ids));\n    },\n\n    _serializeLayers: function(ids) {\n        ids = ids || this._order;\n        var serialized = [];\n        var options = {includeRefProperties: true};\n        for (var i = 0; i < ids.length; i++) {\n            serialized.push(this._layers[ids[i]].serialize(options));\n        }\n        return serialized;\n    },\n\n    _applyClasses: function(classes, options) {\n        if (!this._loaded) return;\n\n        classes = classes || [];\n        options = options || {transition: true};\n        var transition = this.stylesheet.transition || {};\n\n        var layers = this._updates.allPaintProps ? this._layers : this._updates.paintProps;\n\n        for (var id in layers) {\n            var layer = this._layers[id];\n            var props = this._updates.paintProps[id];\n\n            if (this._updates.allPaintProps || props.all) {\n                layer.updatePaintTransitions(classes, options, transition, this.animationLoop);\n            } else {\n                for (var paintName in props) {\n                    this._layers[id].updatePaintTransition(paintName, classes, options, transition, this.animationLoop);\n                }\n            }\n        }\n    },\n\n    _recalculate: function(z) {\n        for (var sourceId in this.sources)\n            this.sources[sourceId].used = false;\n\n        this._updateZoomHistory(z);\n\n        this.rasterFadeDuration = 300;\n        for (var layerId in this._layers) {\n            var layer = this._layers[layerId];\n\n            layer.recalculate(z, this.zoomHistory);\n            if (!layer.isHidden(z) && layer.source) {\n                this.sources[layer.source].used = true;\n            }\n        }\n\n        var maxZoomTransitionDuration = 300;\n        if (Math.floor(this.z) !== Math.floor(z)) {\n            this.animationLoop.set(maxZoomTransitionDuration);\n        }\n\n        this.z = z;\n        this.fire('zoom');\n    },\n\n    _updateZoomHistory: function(z) {\n\n        var zh = this.zoomHistory;\n\n        if (zh.lastIntegerZoom === undefined) {\n            // first time\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = 0;\n            zh.lastZoom = z;\n        }\n\n        // check whether an integer zoom level as passed since the last frame\n        // and if yes, record it with the time. Used for transitioning patterns.\n        if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = Date.now();\n\n        } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z + 1);\n            zh.lastIntegerZoomTime = Date.now();\n        }\n\n        zh.lastZoom = z;\n    },\n\n    _checkLoaded: function () {\n        if (!this._loaded) {\n            throw new Error('Style is not done loading');\n        }\n    },\n\n    /**\n     * Apply queued style updates in a batch\n     * @private\n     */\n    update: function(classes, options) {\n        if (!this._updates.changed) return this;\n\n        if (this._updates.allLayers) {\n            this._groupLayers();\n            this._updateWorkerLayers();\n        } else {\n            var updatedIds = Object.keys(this._updates.layers);\n            if (updatedIds.length) {\n                this._updateWorkerLayers(updatedIds);\n            }\n        }\n\n        var updatedSourceIds = Object.keys(this._updates.sources);\n        var i;\n        for (i = 0; i < updatedSourceIds.length; i++) {\n            this._reloadSource(updatedSourceIds[i]);\n        }\n\n        for (i = 0; i < this._updates.events.length; i++) {\n            var args = this._updates.events[i];\n            this.fire(args[0], args[1]);\n        }\n\n        this._applyClasses(classes, options);\n\n        if (this._updates.changed) {\n            this.fire('change');\n        }\n\n        this._resetUpdates();\n\n        return this;\n    },\n\n    _resetUpdates: function() {\n        this._updates = {\n            events: [],\n            layers: {},\n            sources: {},\n            paintProps: {}\n        };\n    },\n\n    addSource: function(id, source) {\n        this._checkLoaded();\n        if (this.sources[id] !== undefined) {\n            throw new Error('There is already a source with this ID');\n        }\n        if (!source.type) {\n            throw new Error('The type property must be defined, but the only the following properties were given: ' + Object.keys(source) + '.');\n        }\n        var builtIns = ['vector', 'raster', 'geojson', 'video', 'image'];\n        var shouldValidate = builtIns.indexOf(source.type) >= 0;\n        if (shouldValidate && this._handleErrors(validateStyle.source, 'sources.' + id, source)) return this;\n\n        source = new SourceCache(id, source, this.dispatcher);\n        this.sources[id] = source;\n        source.style = this;\n        source\n            .on('load', this._forwardSourceEvent)\n            .on('error', this._forwardSourceEvent)\n            .on('change', this._forwardSourceEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.load', this._forwardTileEvent)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.add', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Remove a source from this stylesheet, given its id.\n     * @param {string} id id of the source to remove\n     * @returns {Style} this style\n     * @throws {Error} if no source is found with the given ID\n     * @private\n     */\n    removeSource: function(id) {\n        this._checkLoaded();\n\n        if (this.sources[id] === undefined) {\n            throw new Error('There is no source with this ID');\n        }\n        var source = this.sources[id];\n        delete this.sources[id];\n        delete this._updates.sources[id];\n        source\n            .off('load', this._forwardSourceEvent)\n            .off('error', this._forwardSourceEvent)\n            .off('change', this._forwardSourceEvent)\n            .off('tile.add', this._forwardTileEvent)\n            .off('tile.load', this._forwardTileEvent)\n            .off('tile.error', this._forwardTileEvent)\n            .off('tile.remove', this._forwardTileEvent)\n            .off('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.remove', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Get a source by id.\n     * @param {string} id id of the desired source\n     * @returns {Object} source\n     * @private\n     */\n    getSource: function(id) {\n        return this.sources[id] && this.sources[id].getSource();\n    },\n\n    /**\n     * Add a layer to the map style. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Style} `this`\n     * @private\n     */\n    addLayer: function(layer, before) {\n        this._checkLoaded();\n\n        if (!(layer instanceof StyleLayer)) {\n            // this layer is not in the style.layers array, so we pass an impossible array index\n            if (this._handleErrors(validateStyle.layer,\n                    'layers.' + layer.id, layer, false, {arrayIndex: -1})) return this;\n\n            var refLayer = layer.ref && this.getLayer(layer.ref);\n            layer = StyleLayer.create(layer, refLayer);\n        }\n        this._validateLayer(layer);\n\n        layer.on('error', this._forwardLayerEvent);\n\n        this._layers[layer.id] = layer;\n        this._order.splice(before ? this._order.indexOf(before) : Infinity, 0, layer.id);\n\n        this._updates.allLayers = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.events.push(['layer.add', {layer: layer}]);\n\n        return this.updateClasses(layer.id);\n    },\n\n    /**\n     * Remove a layer from this stylesheet, given its id.\n     * @param {string} id id of the layer to remove\n     * @returns {Style} this style\n     * @throws {Error} if no layer is found with the given ID\n     * @private\n     */\n    removeLayer: function(id) {\n        this._checkLoaded();\n\n        var layer = this._layers[id];\n        if (layer === undefined) {\n            throw new Error('There is no layer with this ID');\n        }\n        for (var i in this._layers) {\n            if (this._layers[i].ref === id) {\n                this.removeLayer(i);\n            }\n        }\n\n        layer.off('error', this._forwardLayerEvent);\n\n        delete this._layers[id];\n        delete this._updates.layers[id];\n        delete this._updates.paintProps[id];\n        this._order.splice(this._order.indexOf(id), 1);\n\n        this._updates.allLayers = true;\n        this._updates.events.push(['layer.remove', {layer: layer}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id - id of the desired layer\n     * @returns {?Object} a layer, if one with the given `id` exists\n     * @private\n     */\n    getLayer: function(id) {\n        return this._layers[id];\n    },\n\n    /**\n     * If a layer has a `ref` property that makes it derive some values\n     * from another layer, return that referent layer. Otherwise,\n     * returns the layer itself.\n     * @param {string} id the layer's id\n     * @returns {Layer} the referent layer or the layer itself\n     * @private\n     */\n    getReferentLayer: function(id) {\n        var layer = this.getLayer(id);\n        if (layer.ref) {\n            layer = this.getLayer(layer.ref);\n        }\n        return layer;\n    },\n\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return this;\n\n        if (minzoom != null) {\n            layer.minzoom = minzoom;\n        }\n        if (maxzoom != null) {\n            layer.maxzoom = maxzoom;\n        }\n        return this._updateLayer(layer);\n    },\n\n    setFilter: function(layerId, filter) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (filter !== null && this._handleErrors(validateStyle.filter, 'layers.' + layer.id + '.filter', filter)) return this;\n\n        if (util.deepEqual(layer.filter, filter)) return this;\n        layer.filter = util.clone(filter);\n\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layer's filter object\n     * @param {string} layer the layer to inspect\n     * @returns {*} the layer's filter, if any\n     * @private\n     */\n    getFilter: function(layer) {\n        return this.getReferentLayer(layer).filter;\n    },\n\n    setLayoutProperty: function(layerId, name, value) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (util.deepEqual(layer.getLayoutProperty(name), value)) return this;\n\n        layer.setLayoutProperty(name, value);\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layout property's value from a given layer\n     * @param {string} layer the layer to inspect\n     * @param {string} name the name of the layout property\n     * @returns {*} the property value\n     * @private\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.getReferentLayer(layer).getLayoutProperty(name);\n    },\n\n    setPaintProperty: function(layerId, name, value, klass) {\n        this._checkLoaded();\n\n        var layer = this.getLayer(layerId);\n\n        if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return this;\n\n        var wasFeatureConstant = layer.isPaintValueFeatureConstant(name);\n        layer.setPaintProperty(name, value, klass);\n\n        var isFeatureConstant = !(\n            value &&\n            StyleFunction.isFunctionDefinition(value) &&\n            value.property !== '$zoom' &&\n            value.property !== undefined\n        );\n\n        if (!isFeatureConstant || !wasFeatureConstant) {\n            this._updates.layers[layerId] = true;\n            if (layer.source) {\n                this._updates.sources[layer.source] = true;\n            }\n        }\n\n        return this.updateClasses(layerId, name);\n    },\n\n    getPaintProperty: function(layer, name, klass) {\n        return this.getLayer(layer).getPaintProperty(name, klass);\n    },\n\n    updateClasses: function (layerId, paintName) {\n        this._updates.changed = true;\n        if (!layerId) {\n            this._updates.allPaintProps = true;\n        } else {\n            var props = this._updates.paintProps;\n            if (!props[layerId]) props[layerId] = {};\n            props[layerId][paintName || 'all'] = true;\n        }\n        return this;\n    },\n\n    serialize: function() {\n        return util.filterObject({\n            version: this.stylesheet.version,\n            name: this.stylesheet.name,\n            metadata: this.stylesheet.metadata,\n            center: this.stylesheet.center,\n            zoom: this.stylesheet.zoom,\n            bearing: this.stylesheet.bearing,\n            pitch: this.stylesheet.pitch,\n            sprite: this.stylesheet.sprite,\n            glyphs: this.stylesheet.glyphs,\n            transition: this.stylesheet.transition,\n            sources: util.mapObject(this.sources, function(source) {\n                return source.serialize();\n            }),\n            layers: this._order.map(function(id) {\n                return this._layers[id].serialize();\n            }, this)\n        }, function(value) { return value !== undefined; });\n    },\n\n    _updateLayer: function (layer) {\n        this._updates.layers[layer.id] = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.changed = true;\n        return this;\n    },\n\n    _flattenRenderedFeatures: function(sourceResults) {\n        var features = [];\n        for (var l = this._order.length - 1; l >= 0; l--) {\n            var layerID = this._order[l];\n            for (var s = 0; s < sourceResults.length; s++) {\n                var layerFeatures = sourceResults[s][layerID];\n                if (layerFeatures) {\n                    for (var f = 0; f < layerFeatures.length; f++) {\n                        features.push(layerFeatures[f]);\n                    }\n                }\n            }\n        }\n        return features;\n    },\n\n    queryRenderedFeatures: function(queryGeometry, params, zoom, bearing) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true);\n        }\n\n        var includedSources = {};\n        if (params && params.layers) {\n            for (var i = 0; i < params.layers.length; i++) {\n                var layerId = params.layers[i];\n                includedSources[this._layers[layerId].source] = true;\n            }\n        }\n\n        var sourceResults = [];\n        for (var id in this.sources) {\n            if (params.layers && !includedSources[id]) continue;\n            var source = this.sources[id];\n            var results = QueryFeatures.rendered(source, this._layers, queryGeometry, params, zoom, bearing);\n            sourceResults.push(results);\n        }\n        return this._flattenRenderedFeatures(sourceResults);\n    },\n\n    querySourceFeatures: function(sourceID, params) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'querySourceFeatures.filter', params.filter, true);\n        }\n        var source = this.sources[sourceID];\n        return source ? QueryFeatures.source(source, params) : [];\n    },\n\n    addSourceType: function (name, SourceType, callback) {\n        if (Source.getType(name)) {\n            return callback(new Error('A source type called \"' + name + '\" already exists.'));\n        }\n\n        Source.setType(name, SourceType);\n\n        if (!SourceType.workerSourceURL) {\n            return callback(null, null);\n        }\n\n        this.dispatcher.broadcast('load worker source', {\n            name: name,\n            url: SourceType.workerSourceURL\n        }, callback);\n    },\n\n    _handleErrors: function(validate, key, value, throws, props) {\n        var action = throws ? validateStyle.throwErrors : validateStyle.emitErrors;\n        var result = validate.call(validateStyle, util.extend({\n            key: key,\n            style: this.serialize(),\n            value: value,\n            styleSpec: styleSpec\n        }, props));\n        return action.call(validateStyle, this, result);\n    },\n\n    _remove: function() {\n        this.dispatcher.remove();\n    },\n\n    _reloadSource: function(id) {\n        this.sources[id].reload();\n    },\n\n    _updateSources: function(transform) {\n        for (var id in this.sources) {\n            this.sources[id].update(transform);\n        }\n    },\n\n    _redoPlacement: function() {\n        for (var id in this.sources) {\n            if (this.sources[id].redoPlacement) this.sources[id].redoPlacement();\n        }\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire('source.' + e.type, util.extend({source: e.target.getSource()}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire('layer.' + e.type, util.extend({layer: {id: e.target.id}}, e));\n    },\n\n    // Callbacks from web workers\n\n    'get sprite json': function(mapId, params, callback) {\n        var sprite = this.sprite;\n        if (sprite.loaded()) {\n            callback(null, { sprite: sprite.data, retina: sprite.retina });\n        } else {\n            sprite.on('load', function() {\n                callback(null, { sprite: sprite.data, retina: sprite.retina });\n            });\n        }\n    },\n\n    'get icons': function(mapId, params, callback) {\n        var sprite = this.sprite;\n        var spriteAtlas = this.spriteAtlas;\n        if (sprite.loaded()) {\n            spriteAtlas.setSprite(sprite);\n            spriteAtlas.addIcons(params.icons, callback);\n        } else {\n            sprite.on('load', function() {\n                spriteAtlas.setSprite(sprite);\n                spriteAtlas.addIcons(params.icons, callback);\n            });\n        }\n    },\n\n    'get glyphs': function(mapId, params, callback) {\n        var stacks = params.stacks,\n            remaining = Object.keys(stacks).length,\n            allGlyphs = {};\n\n        for (var fontName in stacks) {\n            this.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done);\n        }\n\n        function done(err, glyphs, fontName) {\n            if (err) console.error(err);\n\n            allGlyphs[fontName] = glyphs;\n            remaining--;\n\n            if (remaining === 0)\n                callback(null, allGlyphs);\n        }\n    }\n});\n\n\n\n/***/ }),\n/* 625 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar parseColorString = __webpack_require__(192).parseCSSColor;\nvar util = __webpack_require__(6);\nvar StyleFunction = __webpack_require__(309);\n\nvar cache = {};\n\nmodule.exports = function parseColor(input) {\n\n    if (StyleFunction.isFunctionDefinition(input)) {\n\n        return util.extend({}, input, {\n            stops: input.stops.map(function(stop) {\n                return [stop[0], parseColor(stop[1])];\n            })\n        });\n\n    } else if (typeof input === 'string') {\n\n        if (!cache[input]) {\n            var rgba = parseColorString(input);\n            if (!rgba) { throw new Error('Invalid color ' + input); }\n\n            // GL expects all components to be in the range [0, 1] and to be\n            // multipled by the alpha value.\n            cache[input] = [\n                rgba[0] / 255 * rgba[3],\n                rgba[1] / 255 * rgba[3],\n                rgba[2] / 255 * rgba[3],\n                rgba[3]\n            ];\n        }\n\n        return cache[input];\n\n    } else {\n        throw new Error('Invalid color ' + input);\n    }\n};\n\n\n/***/ }),\n/* 626 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = __webpack_require__(627);\n\n\n/***/ }),\n/* 627 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1343);\n\n\n/***/ }),\n/* 628 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = __webpack_require__(1344);\n\nmodule.exports.emitErrors = function throwErrors(emitter, errors) {\n    if (errors && errors.length) {\n        for (var i = 0; i < errors.length; i++) {\n            emitter.fire('error', { error: new Error(errors[i].message) });\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\nmodule.exports.throwErrors = function throwErrors(emitter, errors) {\n    if (errors) {\n        for (var i = 0; i < errors.length; i++) {\n            throw new Error(errors[i].message);\n        }\n    }\n};\n\n\n/***/ }),\n/* 629 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar getType = __webpack_require__(72);\n\nmodule.exports = function validateConstants(options) {\n    var key = options.key;\n    var constants = options.value;\n    var styleSpec = options.styleSpec;\n\n    if (styleSpec.$version > 7) {\n        if (constants) {\n            return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n        } else {\n            return [];\n        }\n    } else {\n        var type = getType(constants);\n        if (type !== 'object') {\n            return [new ValidationError(key, constants, 'object expected, %s found', type)];\n        }\n\n        var errors = [];\n        for (var constantName in constants) {\n            if (constantName[0] !== '@') {\n                errors.push(new ValidationError(key + '.' + constantName, constants[constantName], 'constants must start with \"@\"'));\n            }\n        }\n        return errors;\n    }\n\n};\n\n\n/***/ }),\n/* 630 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (output) {\n    for (var i = 1; i < arguments.length; i++) {\n        var input = arguments[i];\n        for (var k in input) {\n            output[k] = input[k];\n        }\n    }\n    return output;\n};\n\n\n/***/ }),\n/* 631 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar getType = __webpack_require__(72);\nvar validate = __webpack_require__(127);\nvar validateObject = __webpack_require__(160);\nvar validateArray = __webpack_require__(632);\nvar validateNumber = __webpack_require__(633);\n\nmodule.exports = function validateFunction(options) {\n    var functionValueSpec = options.valueSpec;\n    var stopKeyType;\n\n    var isPropertyFunction = options.value.property !== undefined || stopKeyType === 'object';\n    var isZoomFunction = options.value.property === undefined || stopKeyType === 'object';\n\n    var errors = validateObject({\n        key: options.key,\n        value: options.value,\n        valueSpec: options.styleSpec.function,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: { stops: validateFunctionStops }\n    });\n\n    if (options.styleSpec.$version >= 8) {\n       if (isPropertyFunction && !options.valueSpec['property-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n       } else if (isZoomFunction && !options.valueSpec['zoom-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n       }\n    }\n\n    return errors;\n\n    function validateFunctionStops(options) {\n        var errors = [];\n        var value = options.value;\n\n        errors = errors.concat(validateArray({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec,\n            arrayElementValidator: validateFunctionStop\n        }));\n\n        if (getType(value) === 'array' && value.length === 0) {\n            errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n        }\n\n        return errors;\n    }\n\n    function validateFunctionStop(options) {\n        var errors = [];\n        var value = options.value;\n        var key = options.key;\n\n        if (getType(value) !== 'array') {\n            return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n        }\n\n        if (value.length !== 2) {\n            return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)];\n        }\n\n        var type = getType(value[0]);\n        if (!stopKeyType) stopKeyType = type;\n        if (type !== stopKeyType) {\n            return [new ValidationError(key, value, '%s stop key type must match previous stop key type %s', type, stopKeyType)];\n        }\n\n        if (type === 'object') {\n            if (value[0].zoom === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have zoom')];\n            }\n            if (value[0].value === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have value')];\n            }\n            errors = errors.concat(validateObject({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: { zoom: {} },\n                style: options.style,\n                styleSpec: options.styleSpec,\n                objectElementValidators: { zoom: validateNumber, value: validateValue }\n            }));\n        } else {\n            errors = errors.concat((isZoomFunction ? validateNumber : validateValue)({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: {},\n                style: options.style,\n                styleSpec: options.styleSpec\n            }));\n        }\n\n        errors = errors.concat(validate({\n            key: key + '[1]',\n            value: value[1],\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        }));\n\n        if (getType(value[0]) === 'number') {\n            if (functionValueSpec.function === 'piecewise-constant' && value[0] % 1 !== 0) {\n                errors.push(new ValidationError(key + '[0]', value[0], 'zoom level for piecewise-constant functions must be an integer'));\n            }\n\n            if (options.arrayIndex !== 0) {\n                if (value[0] < options.array[options.arrayIndex - 1][0]) {\n                    errors.push(new ValidationError(key + '[0]', value[0], 'array stops must appear in ascending order'));\n                }\n            }\n        }\n\n        return errors;\n    }\n\n    function validateValue(options) {\n        var errors = [];\n        var type = getType(options.value);\n        if (type !== 'number' && type !== 'string' && type !== 'array') {\n            errors.push(new ValidationError(options.key, options.value, 'property value must be a number, string or array'));\n        }\n        return errors;\n    }\n\n};\n\n\n/***/ }),\n/* 632 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(72);\nvar validate = __webpack_require__(127);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validateArray(options) {\n    var array = options.value;\n    var arraySpec = options.valueSpec;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var key = options.key;\n    var validateArrayElement = options.arrayElementValidator || validate;\n\n    if (getType(array) !== 'array') {\n        return [new ValidationError(key, array, 'array expected, %s found', getType(array))];\n    }\n\n    if (arraySpec.length && array.length !== arraySpec.length) {\n        return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)];\n    }\n\n    if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n        return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)];\n    }\n\n    var arrayElementSpec = {\n        \"type\": arraySpec.value\n    };\n\n    if (styleSpec.$version < 7) {\n        arrayElementSpec.function = arraySpec.function;\n    }\n\n    if (getType(arraySpec.value) === 'object') {\n        arrayElementSpec = arraySpec.value;\n    }\n\n    var errors = [];\n    for (var i = 0; i < array.length; i++) {\n        errors = errors.concat(validateArrayElement({\n            array: array,\n            arrayIndex: i,\n            value: array[i],\n            valueSpec: arrayElementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            key: key + '[' + i + ']'\n        }));\n    }\n    return errors;\n};\n\n\n/***/ }),\n/* 633 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(72);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validateNumber(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var type = getType(value);\n\n    if (type !== 'number') {\n        return [new ValidationError(key, value, 'number expected, %s found', type)];\n    }\n\n    if ('minimum' in valueSpec && value < valueSpec.minimum) {\n        return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)];\n    }\n\n    if ('maximum' in valueSpec && value > valueSpec.maximum) {\n        return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 634 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar unbundle = __webpack_require__(217);\nvar validateObject = __webpack_require__(160);\nvar validateFilter = __webpack_require__(311);\nvar validatePaintProperty = __webpack_require__(635);\nvar validateLayoutProperty = __webpack_require__(636);\nvar extend = __webpack_require__(630);\n\nmodule.exports = function validateLayer(options) {\n    var errors = [];\n\n    var layer = options.value;\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n\n    if (!layer.type && !layer.ref) {\n        errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n    }\n    var type = unbundle(layer.type);\n    var ref = unbundle(layer.ref);\n\n    if (layer.id) {\n        for (var i = 0; i < options.arrayIndex; i++) {\n            var otherLayer = style.layers[i];\n            if (unbundle(otherLayer.id) === unbundle(layer.id)) {\n                errors.push(new ValidationError(key, layer.id, 'duplicate layer id \"%s\", previously used at line %d', layer.id, otherLayer.id.__line__));\n            }\n        }\n    }\n\n    if ('ref' in layer) {\n        ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n            if (p in layer) {\n                errors.push(new ValidationError(key, layer[p], '\"%s\" is prohibited for ref layers', p));\n            }\n        });\n\n        var parent;\n\n        style.layers.forEach(function(layer) {\n            if (layer.id == ref) parent = layer;\n        });\n\n        if (!parent) {\n            errors.push(new ValidationError(key, layer.ref, 'ref layer \"%s\" not found', ref));\n        } else if (parent.ref) {\n            errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n        } else {\n            type = unbundle(parent.type);\n        }\n    } else if (type !== 'background') {\n        if (!layer.source) {\n            errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n        } else {\n            var source = style.sources && style.sources[layer.source];\n            if (!source) {\n                errors.push(new ValidationError(key, layer.source, 'source \"%s\" not found', layer.source));\n            } else if (source.type == 'vector' && type == 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a raster source', layer.id));\n            } else if (source.type == 'raster' && type != 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a vector source', layer.id));\n            } else if (source.type == 'vector' && !layer['source-layer']) {\n                errors.push(new ValidationError(key, layer, 'layer \"%s\" must specify a \"source-layer\"', layer.id));\n            }\n        }\n    }\n\n    errors = errors.concat(validateObject({\n        key: key,\n        value: layer,\n        valueSpec: styleSpec.layer,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            filter: validateFilter,\n            layout: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validateLayoutProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            },\n            paint: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validatePaintProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            }\n        }\n    }));\n\n    return errors;\n};\n\n\n/***/ }),\n/* 635 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validate = __webpack_require__(127);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validatePaintProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['paint_' + options.layerType];\n\n    var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n\n    if (transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n        return validate({\n            key: key,\n            value: value,\n            valueSpec: styleSpec.transition,\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else if (options.valueSpec || layerSpec[propertyKey]) {\n        return validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n/***/ }),\n/* 636 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validate = __webpack_require__(127);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validateLayoutProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['layout_' + options.layerType];\n\n    if (options.valueSpec || layerSpec[propertyKey]) {\n        var errors = [];\n\n        if (options.layerType === 'symbol') {\n            if (propertyKey === 'icon-image' && style && !style.sprite) {\n                errors.push(new ValidationError(key, value, 'use of \"icon-image\" requires a style \"sprite\" property'));\n            } else if (propertyKey === 'text-field' && style && !style.glyphs) {\n                errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n            }\n        }\n\n        return errors.concat(validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        }));\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n/***/ }),\n/* 637 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar unbundle = __webpack_require__(217);\nvar validateObject = __webpack_require__(160);\nvar validateEnum = __webpack_require__(310);\n\nmodule.exports = function validateSource(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (!value.type) {\n        return [new ValidationError(key, value, '\"type\" is required')];\n    }\n\n    var type = unbundle(value.type);\n    switch (type) {\n        case 'vector':\n        case 'raster':\n            var errors = [];\n            errors = errors.concat(validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_tile,\n                style: options.style,\n                styleSpec: styleSpec\n            }));\n            if ('url' in value) {\n                for (var prop in value) {\n                    if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n                        errors.push(new ValidationError(key + '.' + prop, value[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop));\n                    }\n                }\n            }\n            return errors;\n\n        case 'geojson':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_geojson,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'video':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_video,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'image':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_image,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        default:\n            return validateEnum({\n                key: key + '.type',\n                value: value.type,\n                valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image']},\n                style: style,\n                styleSpec: styleSpec\n            });\n    }\n};\n\n\n/***/ }),\n/* 638 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(72);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validateString(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'string expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 639 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n    API_URL: 'https://api.mapbox.com',\n    REQUIRE_ACCESS_TOKEN: true\n};\n\n\n/***/ }),\n/* 640 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t    counter = 0,\n\t\t    length = string.length,\n\t\t    value,\n\t\t    extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t//  0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t    inputLength = input.length,\n\t\t    out,\n\t\t    i = 0,\n\t\t    n = initialN,\n\t\t    bias = initialBias,\n\t\t    basic,\n\t\t    j,\n\t\t    index,\n\t\t    oldi,\n\t\t    w,\n\t\t    k,\n\t\t    digit,\n\t\t    t,\n\t\t    /** Cached calculation results */\n\t\t    baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t    delta,\n\t\t    handledCPCount,\n\t\t    basicLength,\n\t\t    bias,\n\t\t    j,\n\t\t    m,\n\t\t    q,\n\t\t    k,\n\t\t    t,\n\t\t    currentValue,\n\t\t    output = [],\n\t\t    /** `inputLength` will hold the number of code points in `input`. */\n\t\t    inputLength,\n\t\t    /** Cached calculation results */\n\t\t    handledCPCountPlusOne,\n\t\t    baseMinusT,\n\t\t    qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttrue\n\t) {\n\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n\t\t\treturn punycode;\n\t\t}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module), __webpack_require__(17)))\n\n/***/ }),\n/* 641 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.decode = exports.parse = __webpack_require__(1357);\nexports.encode = exports.stringify = __webpack_require__(1358);\n\n\n/***/ }),\n/* 642 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = AnimationLoop;\n\nfunction AnimationLoop() {\n    this.n = 0;\n    this.times = [];\n}\n\n// Are all animations done?\nAnimationLoop.prototype.stopped = function() {\n    this.times = this.times.filter(function(t) {\n        return t.time >= (new Date()).getTime();\n    });\n    return !this.times.length;\n};\n\n// Add a new animation that will run t milliseconds\n// Returns an id that can be used to cancel it layer\nAnimationLoop.prototype.set = function(t) {\n    this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n    return this.n++;\n};\n\n// Cancel an animation\nAnimationLoop.prototype.cancel = function(n) {\n    this.times = this.times.filter(function(t) {\n        return t.id !== n;\n    });\n};\n\n\n/***/ }),\n/* 643 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\n\nvar sourceTypes = {\n    'vector': __webpack_require__(1366),\n    'raster': __webpack_require__(1367),\n    'geojson': __webpack_require__(1368),\n    'video': __webpack_require__(1384),\n    'image': __webpack_require__(1385)\n};\n\n/*\n * Creates a tiled data source instance given an options object.\n *\n * @param {string} id\n * @param {Object} source A source definition object compliant with [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, with that type's requirements.\n * @param {string} options.type A source type like `raster`, `vector`, `video`, etc.\n * @param {Dispatcher} dispatcher\n * @returns {Source}\n */\nexports.create = function(id, source, dispatcher) {\n    source = new sourceTypes[source.type](id, source, dispatcher);\n\n    if (source.id !== id) {\n        throw new Error('Expected Source id to be ' + id + ' instead of ' + source.id);\n    }\n\n    util.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);\n    return source;\n};\n\nexports.getType = function (name) {\n    return sourceTypes[name];\n};\n\nexports.setType = function (name, type) {\n    sourceTypes[name] = type;\n};\n\n/**\n * The `Source` interface must be implemented by each source type, including \"core\" types (`vector`, `raster`, `video`, etc.) and all custom, third-party types.\n *\n * @class Source\n * @private\n *\n * @param {string} id The id for the source. Must not be used by any existing source.\n * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always required).\n * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}.\n * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers.\n *\n * @fires load to indicate source data has been loaded, so that it's okay to call `loadTile`\n * @fires change to indicate source data has changed, so that any current caches should be flushed\n * @property {string} id The id for the source.  Must match the id passed to the constructor.\n * @property {number} minzoom\n * @property {number} maxzoom\n * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot.\n * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom level, `false` if not.\n * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false` if they are floor-ed to the nearest integer.\n */\n\n/**\n * An optional URL to a script which, when run by a Worker, registers a {@link WorkerSource} implementation for this Source type by calling `self.registerWorkerSource(workerSource: WorkerSource)`.\n *\n * @member {URL|undefined} workerSourceURL\n * @memberof Source\n * @static\n */\n\n/**\n * @method\n * @name loadTile\n * @param {Tile} tile\n * @param {Funtion} callback Called when tile has been loaded\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name abortTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name unloadTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name serialize\n * @returns {Object} A plain (stringifiable) JS object representing the current state of the source. Creating a source using the returned object as the `options` should result in a Source that is equivalent to this one.\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name prepare\n * @memberof Source\n * @instance\n */\n\n\n\n/**\n * May be implemented by custom source types to provide code that can be run on\n * the WebWorkers. In addition to providing a custom\n * {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource`\n * implementation may also be targeted by the {@link Source} via\n * `dispatcher.send('source-type.methodname', params, callback)`.\n *\n * @see {@link Map#addSourceType}\n * @private\n *\n * @class WorkerSource\n * @param {Actor} actor\n * @param {object} styleLayers An accessor provided by the Worker to get the current style layers and layer families.\n * @param {Function} styleLayers.getLayers\n * @param {Function} styleLayers.getLayerFamilies\n */\n\n/**\n * Loads a tile from the given params and parse it into buckets ready to send\n * back to the main thread for rendering.  Should call the callback with:\n * `{ buckets, featureIndex, collisionTile, symbolInstancesArray, symbolQuadsArray, rawTileData}`.\n *\n * @method\n * @name loadTile\n * @param {object} params Parameters sent by the main-thread Source identifying the tile to load.\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Re-parses a tile that has already been loaded.  Yields the same data as\n * {@link WorkerSource#loadTile}.\n *\n * @method\n * @name reloadTile\n * @param {object} params\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Aborts loading a tile that is in progress.\n * @method\n * @name abortTile\n * @param {object} params\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Removes this tile from any local caches.\n * @method\n * @name removeTile\n * @memberof WorkerSource\n * @instance\n */\n\n\n/***/ }),\n/* 644 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar util = __webpack_require__(6);\nvar ajax = __webpack_require__(91);\nvar browser = __webpack_require__(37);\nvar normalizeURL = __webpack_require__(128).normalizeSourceURL;\n\nmodule.exports = function(options, callback) {\n    var loaded = function(err, tileJSON) {\n        if (err) {\n            return callback(err);\n        }\n\n        var result = util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution']);\n\n        if (tileJSON.vector_layers) {\n            result.vectorLayers = tileJSON.vector_layers;\n            result.vectorLayerIds = result.vectorLayers.map(function(layer) { return layer.id; });\n        }\n\n        callback(null, result);\n    };\n\n    if (options.url) {\n        ajax.getJSON(normalizeURL(options.url), loaded);\n    } else {\n        browser.frame(loaded.bind(null, null, options));\n    }\n};\n\n\n\n/***/ }),\n/* 645 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar quickselect = __webpack_require__(561);\nvar calculateSignedArea = __webpack_require__(6).calculateSignedArea;\n\n// classifies an array of rings into polygons with outer rings and holes\nmodule.exports = function classifyRings(rings, maxRings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        rings[i].area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrages with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (var j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n};\n\nfunction compareAreas(a, b) {\n    return b.area - a.area;\n}\n\n\n/***/ }),\n/* 646 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = Anchor;\n\nfunction Anchor(x, y, angle, segment) {\n    this.x = x;\n    this.y = y;\n    this.angle = angle;\n\n    if (segment !== undefined) {\n        this.segment = segment;\n    }\n}\n\nAnchor.prototype = Object.create(Point.prototype);\n\nAnchor.prototype.clone = function() {\n    return new Anchor(this.x, this.y, this.angle, this.segment);\n};\n\n\n/***/ }),\n/* 647 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties, text) {\n    return text.replace(/{([^{}]+)}/g, function(match, key) {\n        return key in properties ? properties[key] : '';\n    });\n}\n\n\n/***/ }),\n/* 648 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = {\n    getIconQuads: getIconQuads,\n    getGlyphQuads: getGlyphQuads,\n    SymbolQuad: SymbolQuad\n};\n\nvar minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} anchorAngle The angle of the label at it's center, not the angle of this quad.\n * @param {number} glyphAngle The angle of the glyph to be positioned in the quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, anchorAngle, glyphAngle, minScale, maxScale) {\n    this.anchorPoint = anchorPoint;\n    this.tl = tl;\n    this.tr = tr;\n    this.bl = bl;\n    this.br = br;\n    this.tex = tex;\n    this.anchorAngle = anchorAngle;\n    this.glyphAngle = glyphAngle;\n    this.minScale = minScale;\n    this.maxScale = maxScale;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @param {Shaping} shapedText Shaping for corresponding text\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shapedText, globalProperties, featureProperties) {\n    var rect = shapedIcon.image.rect;\n    var layout = layer.layout;\n\n    var border = 1;\n    var left = shapedIcon.left - border;\n    var right = left + rect.w / shapedIcon.image.pixelRatio;\n    var top = shapedIcon.top - border;\n    var bottom = top + rect.h / shapedIcon.image.pixelRatio;\n    var tl, tr, br, bl;\n\n    // text-fit mode\n    if (layout['icon-text-fit'] !== 'none' && shapedText) {\n        var iconWidth = (right - left),\n            iconHeight = (bottom - top),\n            size = layout['text-size'] / 24,\n            textLeft = shapedText.left * size,\n            textRight = shapedText.right * size,\n            textTop = shapedText.top * size,\n            textBottom = shapedText.bottom * size,\n            textWidth = textRight - textLeft,\n            textHeight = textBottom - textTop,\n            padT = layout['icon-text-fit-padding'][0],\n            padR = layout['icon-text-fit-padding'][1],\n            padB = layout['icon-text-fit-padding'][2],\n            padL = layout['icon-text-fit-padding'][3],\n            offsetY = layout['icon-text-fit'] === 'width' ? (textHeight - iconHeight) * 0.5 : 0,\n            offsetX = layout['icon-text-fit'] === 'height' ? (textWidth - iconWidth) * 0.5 : 0,\n            width = layout['icon-text-fit'] === 'width' || layout['icon-text-fit'] === 'both' ? textWidth : iconWidth,\n            height = layout['icon-text-fit'] === 'height' || layout['icon-text-fit'] === 'both' ? textHeight : iconHeight;\n        tl = new Point(textLeft + offsetX - padL,         textTop + offsetY - padT);\n        tr = new Point(textLeft + offsetX + padR + width, textTop + offsetY - padT);\n        br = new Point(textLeft + offsetX + padR + width, textTop + offsetY + padB + height);\n        bl = new Point(textLeft + offsetX - padL,         textTop + offsetY + padB + height);\n    // Normal icon size mode\n    } else {\n        tl = new Point(left, top);\n        tr = new Point(right, top);\n        br = new Point(right, bottom);\n        bl = new Point(left, bottom);\n    }\n\n    var angle = layer.getLayoutValue('icon-rotate', globalProperties, featureProperties) * Math.PI / 180;\n    if (alongLine) {\n        var prev = line[anchor.segment];\n        if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) {\n            var next = line[anchor.segment + 1];\n            angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI;\n        } else {\n            angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n        }\n    }\n\n    if (angle) {\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle),\n            matrix = [cos, -sin, sin, cos];\n\n        tl = tl.matMult(matrix);\n        tr = tr.matMult(matrix);\n        bl = bl.matMult(matrix);\n        br = br.matMult(matrix);\n    }\n\n    return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine) {\n\n    var textRotate = layer.layout['text-rotate'] * Math.PI / 180;\n    var keepUpright = layer.layout['text-keep-upright'];\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n    var quads = [];\n\n    for (var k = 0; k < positionedGlyphs.length; k++) {\n        var positionedGlyph = positionedGlyphs[k];\n        var glyph = positionedGlyph.glyph;\n        var rect = glyph.rect;\n\n        if (!rect) continue;\n\n        var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n        var glyphInstances;\n        var labelMinScale = minScale;\n        if (alongLine) {\n            glyphInstances = [];\n            labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n            if (keepUpright) {\n                labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n            }\n\n        } else {\n            glyphInstances = [{\n                anchorPoint: new Point(anchor.x, anchor.y),\n                offset: 0,\n                angle: 0,\n                maxScale: Infinity,\n                minScale: minScale\n            }];\n        }\n\n        var x1 = positionedGlyph.x + glyph.left,\n            y1 = positionedGlyph.y - glyph.top,\n            x2 = x1 + rect.w,\n            y2 = y1 + rect.h,\n\n            otl = new Point(x1, y1),\n            otr = new Point(x2, y1),\n            obl = new Point(x1, y2),\n            obr = new Point(x2, y2);\n\n        for (var i = 0; i < glyphInstances.length; i++) {\n\n            var instance = glyphInstances[i],\n                tl = otl,\n                tr = otr,\n                bl = obl,\n                br = obr;\n\n            if (textRotate) {\n                var sin = Math.sin(textRotate),\n                    cos = Math.cos(textRotate),\n                    matrix = [cos, -sin, sin, cos];\n\n                tl = tl.matMult(matrix);\n                tr = tr.matMult(matrix);\n                bl = bl.matMult(matrix);\n                br = br.matMult(matrix);\n            }\n\n            // Prevent label from extending past the end of the line\n            var glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n            var anchorAngle = (anchor.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            var glyphAngle = (instance.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, anchorAngle, glyphAngle, glyphMinScale, instance.maxScale));\n        }\n    }\n\n    return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array<Object>} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array<Point>} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array<Object>} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n    var upsideDown = !forward;\n\n    if (offset < 0) forward = !forward;\n\n    if (forward) segment++;\n\n    var newAnchorPoint = new Point(anchor.x, anchor.y);\n    var end = line[segment];\n    var prevScale = Infinity;\n\n    offset = Math.abs(offset);\n\n    var placementScale = minScale;\n\n    while (true) {\n        var distance = newAnchorPoint.dist(end);\n        var scale = offset / distance;\n\n        // Get the angle of the line segment\n        var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n        if (!forward) angle += Math.PI;\n\n        glyphs.push({\n            anchorPoint: newAnchorPoint,\n            offset: upsideDown ? Math.PI : 0,\n            minScale: scale,\n            maxScale: prevScale,\n            angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n        });\n\n        if (scale <= placementScale) break;\n\n        newAnchorPoint = end;\n\n        // skip duplicate nodes\n        while (newAnchorPoint.equals(end)) {\n            segment += forward ? 1 : -1;\n            end = line[segment];\n            if (!end) {\n                return scale;\n            }\n        }\n\n        var unit = end.sub(newAnchorPoint)._unit();\n        newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n        prevScale = scale;\n    }\n\n    return placementScale;\n}\n\n\n/***/ }),\n/* 649 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar isCounterClockwise = __webpack_require__(6).isCounterClockwise;\n\nmodule.exports = {\n    multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint,\n    multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon,\n    multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine,\n    distToSegmentSquared: distToSegmentSquared\n};\n\nfunction multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) {\n    for (var j = 0; j < multiPolygon.length; j++) {\n        var polygon = multiPolygon[j];\n        for (var i = 0; i < rings.length; i++) {\n            var ring = rings[i];\n            for (var k = 0; k < ring.length; k++) {\n                var point = ring[k];\n                if (polygonContainsPoint(polygon, point)) return true;\n                if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) {\n\n    if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) {\n        return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]);\n    }\n\n    for (var m = 0; m < multiPolygonB.length; m++) {\n        var ring = multiPolygonB[m];\n        for (var n = 0; n < ring.length; n++) {\n            if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true;\n        }\n    }\n\n    for (var j = 0; j < multiPolygonA.length; j++) {\n        var polygon = multiPolygonA[j];\n        for (var i = 0; i < polygon.length; i++) {\n            if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true;\n        }\n\n        for (var k = 0; k < multiPolygonB.length; k++) {\n            if (lineIntersectsLine(polygon, multiPolygonB[k])) return true;\n        }\n    }\n\n    return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) {\n    for (var i = 0; i < multiLine.length; i++) {\n        var line = multiLine[i];\n\n        for (var j = 0; j < multiPolygon.length; j++) {\n            var polygon = multiPolygon[j];\n\n            if (polygon.length >= 3) {\n                for (var k = 0; k < line.length; k++) {\n                    if (polygonContainsPoint(polygon, line[k])) return true;\n                }\n            }\n\n            if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA, lineB, radius) {\n\n    if (lineA.length > 1) {\n        if (lineIntersectsLine(lineA, lineB)) return true;\n\n        // Check whether any point in either line is within radius of the other line\n        for (var j = 0; j < lineB.length; j++) {\n            if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n        }\n    }\n\n    for (var k = 0; k < lineA.length; k++) {\n        if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n    }\n\n    return false;\n}\n\nfunction lineIntersectsLine(lineA, lineB) {\n    for (var i = 0; i < lineA.length - 1; i++) {\n        var a0 = lineA[i];\n        var a1 = lineA[i + 1];\n        for (var j = 0; j < lineB.length - 1; j++) {\n            var b0 = lineB[j];\n            var b1 = lineB[j + 1];\n            if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {\n    return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n        isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p, line, radius) {\n    var radiusSquared = radius * radius;\n\n    if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n    for (var i = 1; i < line.length; i++) {\n        // Find line segments that have a distance <= radius^2 to p\n        // In that case, we treat the line as \"containing point p\".\n        var v = line[i - 1], w = line[i];\n        if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n    }\n    return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n    var l2 = v.distSqr(w);\n    if (l2 === 0) return p.distSqr(v);\n    var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n    if (t < 0) return p.distSqr(v);\n    if (t > 1) return p.distSqr(w);\n    return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings, p) {\n    var c = false,\n        ring, p1, p2;\n\n    for (var k = 0; k < rings.length; k++) {\n        ring = rings[k];\n        for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            p1 = ring[i];\n            p2 = ring[j];\n            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n                c = !c;\n            }\n        }\n    }\n    return c;\n}\n\nfunction polygonContainsPoint(ring, p) {\n    var c = false;\n    for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        var p1 = ring[i];\n        var p2 = ring[j];\n        if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n            c = !c;\n        }\n    }\n    return c;\n}\n\n\n/***/ }),\n/* 650 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Source = __webpack_require__(643);\nvar Tile = __webpack_require__(1387);\nvar Evented = __webpack_require__(47);\nvar TileCoord = __webpack_require__(164);\nvar Cache = __webpack_require__(1394);\nvar Coordinate = __webpack_require__(215);\nvar util = __webpack_require__(6);\nvar EXTENT = __webpack_require__(42).EXTENT;\n\nmodule.exports = SourceCache;\n\n/**\n * A tile pyramid is a specialized cache and datastructure\n * that contains tiles. It's used by sources to manage their\n * data.\n *\n * @param {Object} options\n * @private\n */\nfunction SourceCache(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n\n    var source = this._source = Source.create(id, options, dispatcher)\n    .on('load', function () {\n        if (this.map && this._source.onAdd) { this._source.onAdd(this.map); }\n\n        this._sourceLoaded = true;\n\n        this.tileSize = source.tileSize;\n        this.minzoom = source.minzoom;\n        this.maxzoom = source.maxzoom;\n        this.roundZoom = source.roundZoom;\n        this.reparseOverscaled = source.reparseOverscaled;\n        this.isTileClipped = source.isTileClipped;\n        this.attribution = source.attribution;\n\n        this.vectorLayerIds = source.vectorLayerIds;\n\n        this.fire('load');\n    }.bind(this))\n    .on('error', function (e) {\n        this._sourceErrored = true;\n        this.fire('error', e);\n    }.bind(this))\n    .on('change', function () {\n        this.reload();\n        if (this.transform) {\n            this.update(this.transform, this.map && this.map.style.rasterFadeDuration);\n        }\n        this.fire('change');\n    }.bind(this));\n\n    this._tiles = {};\n    this._cache = new Cache(0, this.unloadTile.bind(this));\n\n    this._isIdRenderable = this._isIdRenderable.bind(this);\n}\n\n\nSourceCache.maxOverzooming = 10;\nSourceCache.maxUnderzooming = 3;\n\nSourceCache.prototype = util.inherit(Evented, {\n    onAdd: function (map) {\n        this.map = map;\n        if (this._source && this._source.onAdd) {\n            this._source.onAdd(map);\n        }\n    },\n\n    /**\n     * Return true if no tile data is pending, tiles will not change unless\n     * an additional API call is received.\n     * @returns {boolean}\n     * @private\n     */\n    loaded: function() {\n        if (this._sourceErrored) { return true; }\n        if (!this._sourceLoaded) { return false; }\n        for (var t in this._tiles) {\n            var tile = this._tiles[t];\n            if (tile.state !== 'loaded' && tile.state !== 'errored')\n                return false;\n        }\n        return true;\n    },\n\n    /**\n     * @returns {Source} The underlying source object\n     * @private\n     */\n    getSource: function () {\n        return this._source;\n    },\n\n    loadTile: function (tile, callback) {\n        return this._source.loadTile(tile, callback);\n    },\n\n    unloadTile: function (tile) {\n        if (this._source.unloadTile)\n            return this._source.unloadTile(tile);\n    },\n\n    abortTile: function (tile) {\n        if (this._source.abortTile)\n            return this._source.abortTile(tile);\n    },\n\n    serialize: function () {\n        return this._source.serialize();\n    },\n\n    prepare: function () {\n        if (this._sourceLoaded && this._source.prepare)\n            return this._source.prepare();\n    },\n\n    /**\n     * Return all tile ids ordered with z-order, and cast to numbers\n     * @returns {Array<number>} ids\n     * @private\n     */\n    getIds: function() {\n        return Object.keys(this._tiles).map(Number).sort(compareKeyZoom);\n    },\n\n    getRenderableIds: function() {\n        return this.getIds().filter(this._isIdRenderable);\n    },\n\n    _isIdRenderable: function(id) {\n        return this._tiles[id].isRenderable() && !this._coveredTiles[id];\n    },\n\n    reload: function() {\n        this._cache.reset();\n        for (var i in this._tiles) {\n            var tile = this._tiles[i];\n\n            // The difference between \"loading\" tiles and \"reloading\" tiles is\n            // that \"reloading\" tiles are \"renderable\". Therefore, a \"loading\"\n            // tile cannot become a \"reloading\" tile without first becoming\n            // a \"loaded\" tile.\n            if (tile.state !== 'loading') {\n                tile.state = 'reloading';\n            }\n\n            this.loadTile(this._tiles[i], this._tileLoaded.bind(this, this._tiles[i]));\n        }\n    },\n\n    _tileLoaded: function (tile, err) {\n        if (err) {\n            tile.state = 'errored';\n            this.fire('tile.error', {tile: tile, error: err});\n            this._source.fire('tile.error', {tile: tile, error: err});\n            return;\n        }\n\n        tile.source = this;\n        tile.timeAdded = new Date().getTime();\n        this.fire('tile.load', {tile: tile});\n        this._source.fire('tile.load', {tile: tile});\n    },\n\n    /**\n     * Get a specific tile by TileCoordinate\n     * @param {TileCoordinate} coord\n     * @returns {Object} tile\n     * @private\n     */\n    getTile: function(coord) {\n        return this.getTileByID(coord.id);\n    },\n\n    /**\n     * Get a specific tile by id\n     * @param {number|string} id\n     * @returns {Object} tile\n     * @private\n     */\n    getTileByID: function(id) {\n        return this._tiles[id];\n    },\n\n    /**\n     * get the zoom level adjusted for the difference in map and source tilesizes\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    getZoom: function(transform) {\n        return transform.zoom + transform.scaleZoom(transform.tileSize / this.tileSize);\n    },\n\n    /**\n     * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n     * adds found tiles to retain object; returns true if any child is found.\n     *\n     * @param {Coordinate} coord\n     * @param {number} maxCoveringZoom\n     * @param {boolean} retain\n     * @returns {boolean} whether the operation was complete\n     * @private\n     */\n    findLoadedChildren: function(coord, maxCoveringZoom, retain) {\n        var found = false;\n\n        for (var id in this._tiles) {\n            var tile = this._tiles[id];\n\n            // only consider renderable tiles on higher zoom levels (up to maxCoveringZoom)\n            if (retain[id] || !tile.isRenderable() || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue;\n\n            // disregard tiles that are not descendants of the given tile coordinate\n            var z2 = Math.pow(2, Math.min(tile.coord.z, this.maxzoom) - Math.min(coord.z, this.maxzoom));\n            if (Math.floor(tile.coord.x / z2) !== coord.x ||\n                Math.floor(tile.coord.y / z2) !== coord.y)\n                continue;\n\n            // found loaded child\n            retain[id] = true;\n            found = true;\n\n            // loop through parents; retain the topmost loaded one if found\n            while (tile && tile.coord.z - 1 > coord.z) {\n                var parentId = tile.coord.parent(this.maxzoom).id;\n                tile = this._tiles[parentId];\n\n                if (tile && tile.isRenderable()) {\n                    delete retain[id];\n                    retain[parentId] = true;\n                }\n            }\n        }\n        return found;\n    },\n\n    /**\n     * Find a loaded parent of the given tile (up to minCoveringZoom);\n     * adds the found tile to retain object and returns the tile if found\n     *\n     * @param {Coordinate} coord\n     * @param {number} minCoveringZoom\n     * @param {boolean} retain\n     * @returns {Tile} tile object\n     * @private\n     */\n    findLoadedParent: function(coord, minCoveringZoom, retain) {\n        for (var z = coord.z - 1; z >= minCoveringZoom; z--) {\n            coord = coord.parent(this.maxzoom);\n            var tile = this._tiles[coord.id];\n            if (tile && tile.isRenderable()) {\n                retain[coord.id] = true;\n                return tile;\n            }\n            if (this._cache.has(coord.id)) {\n                this.addTile(coord);\n                retain[coord.id] = true;\n                return this._tiles[coord.id];\n            }\n        }\n    },\n\n    /**\n     * Resizes the tile cache based on the current viewport's size.\n     *\n     * Larger viewports use more tiles and need larger caches. Larger viewports\n     * are more likely to be found on devices with more memory and on pages where\n     * the map is more important.\n     *\n     * @private\n     */\n    updateCacheSize: function(transform) {\n        var widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1;\n        var heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1;\n        var approxTilesInView = widthInTiles * heightInTiles;\n        var commonZoomRange = 5;\n        this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange));\n    },\n\n    /**\n     * Removes tiles that are outside the viewport and adds new tiles that\n     * are inside the viewport.\n     * @private\n     */\n    update: function(transform, fadeDuration) {\n        if (!this._sourceLoaded) { return; }\n        var i;\n        var coord;\n        var tile;\n\n        this.updateCacheSize(transform);\n\n        // Determine the overzooming/underzooming amounts.\n        var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n        var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this.minzoom);\n        var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming,  this.minzoom);\n\n        // Retain is a list of tiles that we shouldn't delete, even if they are not\n        // the most ideal tile for the current viewport. This may include tiles like\n        // parent or child tiles that are *already* loaded.\n        var retain = {};\n        var now = new Date().getTime();\n\n        // Covered is a list of retained tiles who's areas are full covered by other,\n        // better, retained tiles. They are not drawn separately.\n        this._coveredTiles = {};\n\n        var required = this.used ? transform.coveringTiles(this._source) : [];\n        for (i = 0; i < required.length; i++) {\n            coord = required[i];\n            tile = this.addTile(coord);\n\n            retain[coord.id] = true;\n\n            if (tile.isRenderable())\n                continue;\n\n            // The tile we require is not yet loaded.\n            // Retain child or parent tiles that cover the same area.\n            if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                this.findLoadedParent(coord, minCoveringZoom, retain);\n            }\n        }\n\n        var parentsForFading = {};\n\n        var ids = Object.keys(retain);\n        for (var k = 0; k < ids.length; k++) {\n            var id = ids[k];\n            coord = TileCoord.fromID(id);\n            tile = this._tiles[id];\n            if (tile && tile.timeAdded > now - (fadeDuration || 0)) {\n                // This tile is still fading in. Find tiles to cross-fade with it.\n                if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                    retain[id] = true;\n                }\n                this.findLoadedParent(coord, minCoveringZoom, parentsForFading);\n            }\n        }\n\n        var fadedParent;\n        for (fadedParent in parentsForFading) {\n            if (!retain[fadedParent]) {\n                // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n                this._coveredTiles[fadedParent] = true;\n            }\n        }\n        for (fadedParent in parentsForFading) {\n            retain[fadedParent] = true;\n        }\n\n        // Remove the tiles we don't need anymore.\n        var remove = util.keysDifference(this._tiles, retain);\n        for (i = 0; i < remove.length; i++) {\n            this.removeTile(+remove[i]);\n        }\n\n        this.transform = transform;\n    },\n\n    /**\n     * Add a tile, given its coordinate, to the pyramid.\n     * @param {Coordinate} coord\n     * @returns {Coordinate} the coordinate.\n     * @private\n     */\n    addTile: function(coord) {\n        var tile = this._tiles[coord.id];\n        if (tile)\n            return tile;\n\n        var wrapped = coord.wrapped();\n        tile = this._tiles[wrapped.id];\n\n        if (!tile) {\n            tile = this._cache.get(wrapped.id);\n            if (tile && this._redoPlacement) {\n                this._redoPlacement(tile);\n            }\n        }\n\n        if (!tile) {\n            var zoom = coord.z;\n            var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1;\n            tile = new Tile(wrapped, this.tileSize * overscaling, this.maxzoom);\n            this.loadTile(tile, this._tileLoaded.bind(this, tile));\n        }\n\n        tile.uses++;\n        this._tiles[coord.id] = tile;\n        this.fire('tile.add', {tile: tile});\n        this._source.fire('tile.add', {tile: tile});\n\n        return tile;\n    },\n\n    /**\n     * Remove a tile, given its id, from the pyramid\n     * @param {string|number} id tile id\n     * @returns {undefined} nothing\n     * @private\n     */\n    removeTile: function(id) {\n        var tile = this._tiles[id];\n        if (!tile)\n            return;\n\n        tile.uses--;\n        delete this._tiles[id];\n        this.fire('tile.remove', {tile: tile});\n        this._source.fire('tile.remove', {tile: tile});\n\n        if (tile.uses > 0)\n            return;\n\n        if (tile.isRenderable()) {\n            this._cache.add(tile.coord.wrapped().id, tile);\n        } else {\n            tile.aborted = true;\n            this.abortTile(tile);\n            this.unloadTile(tile);\n        }\n    },\n\n    /**\n     * Remove all tiles from this pyramid\n     * @private\n     */\n    clearTiles: function() {\n        for (var id in this._tiles)\n            this.removeTile(id);\n        this._cache.reset();\n    },\n\n    /**\n     * Search through our current tiles and attempt to find the tiles that\n     * cover the given bounds.\n     * @param {Array<Coordinate>} queryGeometry coordinates of the corners of bounding rectangle\n     * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.\n     * @private\n     */\n    tilesIn: function(queryGeometry) {\n        var tileResults = {};\n        var ids = this.getIds();\n\n        var minX = Infinity;\n        var minY = Infinity;\n        var maxX = -Infinity;\n        var maxY = -Infinity;\n        var z = queryGeometry[0].zoom;\n\n        for (var k = 0; k < queryGeometry.length; k++) {\n            var p = queryGeometry[k];\n            minX = Math.min(minX, p.column);\n            minY = Math.min(minY, p.row);\n            maxX = Math.max(maxX, p.column);\n            maxY = Math.max(maxY, p.row);\n        }\n\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this._tiles[ids[i]];\n            var coord = TileCoord.fromID(ids[i]);\n\n            var tileSpaceBounds = [\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)),\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z))\n            ];\n\n            if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT &&\n                tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) {\n\n                var tileSpaceQueryGeometry = [];\n                for (var j = 0; j < queryGeometry.length; j++) {\n                    tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j]));\n                }\n\n                var tileResult = tileResults[tile.coord.id];\n                if (tileResult === undefined) {\n                    tileResult = tileResults[tile.coord.id] = {\n                        tile: tile,\n                        coord: coord,\n                        queryGeometry: [],\n                        scale: Math.pow(2, this.transform.zoom - tile.coord.z)\n                    };\n                }\n\n                // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts\n                tileResult.queryGeometry.push(tileSpaceQueryGeometry);\n            }\n        }\n\n        var results = [];\n        for (var t in tileResults) {\n            results.push(tileResults[t]);\n        }\n        return results;\n    },\n\n    redoPlacement: function () {\n        var ids = this.getIds();\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this.getTileByID(ids[i]);\n            tile.redoPlacement(this);\n        }\n    },\n\n    getVisibleCoordinates: function () {\n        return this.getRenderableIds().map(TileCoord.fromID);\n    }\n});\n\n/**\n * Convert a coordinate to a point in a tile's coordinate space.\n * @param {Coordinate} tileCoord\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\nfunction coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) {\n    var zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom));\n    return {\n        x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT,\n        y: (zoomedCoord.row - tileCoord.y) * EXTENT\n    };\n\n}\n\nfunction compareKeyZoom(a, b) {\n    return (a % 32) - (b % 32);\n}\n\n\n/***/ }),\n/* 651 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n    var cells = this.cells = [];\n\n    if (extent instanceof ArrayBuffer) {\n        this.arrayBuffer = extent;\n        var array = new Int32Array(this.arrayBuffer);\n        extent = array[0];\n        n = array[1];\n        padding = array[2];\n\n        this.d = n + 2 * padding;\n        for (var k = 0; k < this.d * this.d; k++) {\n            var start = array[NUM_PARAMS + k];\n            var end = array[NUM_PARAMS + k + 1];\n            cells.push(start === end ?\n                    null :\n                    array.subarray(start, end));\n        }\n        var keysOffset = array[NUM_PARAMS + cells.length];\n        var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n        this.keys = array.subarray(keysOffset, bboxesOffset);\n        this.bboxes = array.subarray(bboxesOffset);\n\n        this.insert = this._insertReadonly;\n\n    } else {\n        this.d = n + 2 * padding;\n        for (var i = 0; i < this.d * this.d; i++) {\n            cells.push([]);\n        }\n        this.keys = [];\n        this.bboxes = [];\n    }\n\n    this.n = n;\n    this.extent = extent;\n    this.padding = padding;\n    this.scale = n / extent;\n    this.uid = 0;\n\n    var p = (padding / n) * extent;\n    this.min = -p;\n    this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n    this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n    this.keys.push(key);\n    this.bboxes.push(x1);\n    this.bboxes.push(y1);\n    this.bboxes.push(x2);\n    this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n    throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n    this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) {\n    var min = this.min;\n    var max = this.max;\n    if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {\n        // We use `Array#slice` because `this.keys` may be a `Int32Array` and\n        // some browsers (Safari and IE) do not support `TypedArray#slice`\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility\n        return Array.prototype.slice.call(this.keys);\n\n    } else {\n        var result = [];\n        var seenUids = {};\n        this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);\n        return result;\n    }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {\n    var cell = this.cells[cellIndex];\n    if (cell !== null) {\n        var keys = this.keys;\n        var bboxes = this.bboxes;\n        for (var u = 0; u < cell.length; u++) {\n            var uid = cell[u];\n            if (seenUids[uid] === undefined) {\n                var offset = uid * 4;\n                if (intersectionTest ?\n                    intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :\n                    ((x1 <= bboxes[offset + 2]) &&\n                    (y1 <= bboxes[offset + 3]) &&\n                    (x2 >= bboxes[offset + 0]) &&\n                    (y2 >= bboxes[offset + 1]))) {\n                    seenUids[uid] = true;\n                    result.push(keys[uid]);\n                } else {\n                    seenUids[uid] = false;\n                }\n            }\n        }\n    }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {\n    var cx1 = this._convertToCellCoord(x1);\n    var cy1 = this._convertToCellCoord(y1);\n    var cx2 = this._convertToCellCoord(x2);\n    var cy2 = this._convertToCellCoord(y2);\n    for (var x = cx1; x <= cx2; x++) {\n        for (var y = cy1; y <= cy2; y++) {\n            var cellIndex = this.d * y + x;\n            if (intersectionTest && !intersectionTest(\n                        this._convertFromCellCoord(x),\n                        this._convertFromCellCoord(y),\n                        this._convertFromCellCoord(x + 1),\n                        this._convertFromCellCoord(y + 1))) continue;\n            if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) return;\n        }\n    }\n};\n\nGridIndex.prototype._convertFromCellCoord = function(x) {\n    return (x - this.padding) / this.scale;\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n    return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n    if (this.arrayBuffer) return this.arrayBuffer;\n\n    var cells = this.cells;\n\n    var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n    var totalCellLength = 0;\n    for (var i = 0; i < this.cells.length; i++) {\n        totalCellLength += this.cells[i].length;\n    }\n\n    var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n    array[0] = this.extent;\n    array[1] = this.n;\n    array[2] = this.padding;\n\n    var offset = metadataLength;\n    for (var k = 0; k < cells.length; k++) {\n        var cell = cells[k];\n        array[NUM_PARAMS + k] = offset;\n        array.set(cell, offset);\n        offset += cell.length;\n    }\n\n    array[NUM_PARAMS + cells.length] = offset;\n    array.set(this.keys, offset);\n    offset += this.keys.length;\n\n    array[NUM_PARAMS + cells.length + 1] = offset;\n    array.set(this.bboxes, offset);\n    offset += this.bboxes.length;\n\n    return array.buffer;\n};\n\n\n/***/ }),\n/* 652 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Feature;\n\nfunction Feature(vectorTileFeature, z, x, y) {\n    this._vectorTileFeature = vectorTileFeature;\n    vectorTileFeature._z = z;\n    vectorTileFeature._x = x;\n    vectorTileFeature._y = y;\n\n    this.properties = vectorTileFeature.properties;\n\n    if (vectorTileFeature.id != null) {\n        this.id = vectorTileFeature.id;\n    }\n}\n\nFeature.prototype = {\n    type: \"Feature\",\n\n    get geometry() {\n        if (this._geometry === undefined) {\n            this._geometry = this._vectorTileFeature.toGeoJSON(\n                this._vectorTileFeature._x,\n                this._vectorTileFeature._y,\n                this._vectorTileFeature._z).geometry;\n        }\n        return this._geometry;\n    },\n\n    set geometry(g) {\n        this._geometry = g;\n    },\n\n    toJSON: function() {\n        var json = {};\n        for (var i in this) {\n            if (i === '_geometry' || i === '_vectorTileFeature' || i === 'toJSON') continue;\n            json[i] = this[i];\n        }\n        return json;\n    }\n};\n\n\n/***/ }),\n/* 653 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = function(uniforms) {\n    var pragmas = { define: {}, initialize: {} };\n\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        assert(uniform.name.slice(0, 2) === 'u_');\n\n        var type = '{precision} ' + (uniform.components === 1 ? 'float' : 'vec' + uniform.components);\n        pragmas.define[uniform.name.slice(2)] = 'uniform ' + type + ' ' + uniform.name + ';\\n';\n        pragmas.initialize[uniform.name.slice(2)] = type + ' ' + uniform.name.slice(2) + ' = ' + uniform.name + ';\\n';\n    }\n\n    return pragmas;\n};\n\n\n/***/ }),\n/* 654 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(166);\nvar DOM = __webpack_require__(48);\nvar util = __webpack_require__(6);\n\nmodule.exports = Attribution;\n\n/**\n * An `Attribution` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/).\n * Extends [`Control`](#Control).\n *\n * @class Attribution\n * @param {Object} [options]\n * @param {string} [options.position='bottom-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * var map = new mapboxgl.Map({attributionControl: false})\n *     .addControl(new mapboxgl.Attribution({position: 'top-left'}));\n */\nfunction Attribution(options) {\n    util.setOptions(this, options);\n}\n\nAttribution.createAttributionString = function(sources) {\n    var attributions = [];\n\n    for (var id in sources) {\n        var source = sources[id];\n        if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n            attributions.push(source.attribution);\n        }\n    }\n\n    // remove any entries that are substrings of another entry.\n    // first sort by length so that substrings come first\n    attributions.sort(function (a, b) { return a.length - b.length; });\n    attributions = attributions.filter(function (attrib, i) {\n        for (var j = i + 1; j < attributions.length; j++) {\n            if (attributions[j].indexOf(attrib) >= 0) { return false; }\n        }\n        return true;\n    });\n\n    return attributions.join(' | ');\n};\n\nAttribution.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-attrib',\n            container = this._container = DOM.create('div', className, map.getContainer());\n\n        this._update();\n        map.on('source.load', this._update.bind(this));\n        map.on('source.change', this._update.bind(this));\n        map.on('source.remove', this._update.bind(this));\n        map.on('moveend', this._updateEditLink.bind(this));\n\n        return container;\n    },\n\n    _update: function() {\n        if (this._map.style) {\n            this._container.innerHTML = Attribution.createAttributionString(this._map.style.sources);\n        }\n\n        this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0];\n        this._updateEditLink();\n    },\n\n    _updateEditLink: function() {\n        if (this._editLink) {\n            var center = this._map.getCenter();\n            this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' +\n                    center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1);\n        }\n    }\n});\n\n\n/***/ }),\n/* 655 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Popup;\n\nvar util = __webpack_require__(6);\nvar Evented = __webpack_require__(47);\nvar DOM = __webpack_require__(48);\nvar LngLat = __webpack_require__(82);\nvar Point = __webpack_require__(11);\n\n/**\n * A popup component.\n *\n * @class Popup\n * @param {Object} [options]\n * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the\n *   top right corner of the popup.\n * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the\n *   map is clicked.\n * @param {string} [options.anchor] - A string indicating the popup's location relative to\n *   the coordinate set via [Popup#setLngLat](#Popup#setLngLat).\n *   Options are `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,\n *   `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be\n *   dynamically set to ensure the popup falls within the map container with a preference\n *   for `'bottom'`.\n * @param {number|PointLike|{[position: string]: PointLike}} [options.offset] -\n *  A pixel offset applied to the popup's location specified as:\n *   - a single number specifying a distance from the popup's location\n *   - a [`PointLike`](#PointLike) specifying a constant offset\n *   - an object of [`PointLike`](#PointLike)s specifing an offset for each anchor position\n *  Negative offsets indicate left and up.\n * @example\n * var popup = new mapboxgl.Popup()\n *   .setLngLat(e.lngLat)\n *   .setHTML(\"<h1>Hello World!</h1>\")\n *   .addTo(map);\n */\nfunction Popup(options) {\n    util.setOptions(this, options);\n    util.bindAll([\n        '_update',\n        '_onClickClose'],\n        this);\n}\n\nPopup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{\n    options: {\n        closeButton: true,\n        closeOnClick: true\n    },\n\n    /**\n     * Adds the popup to a map.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the popup to.\n     * @returns {Popup} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        this._map.on('move', this._update);\n        if (this.options.closeOnClick) {\n            this._map.on('click', this._onClickClose);\n        }\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the popup from the map it has been added to.\n     *\n     * @example\n     * var popup = new mapboxgl.Popup().addTo(map);\n     * popup.remove();\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map.off('click', this._onClickClose);\n            delete this._map;\n        }\n\n        /**\n         * Fired when the popup is closed manually or programatically.\n         *\n         * @event close\n         * @memberof Popup\n         * @instance\n         * @type {Object}\n         * @property {Popup} popup object that was closed\n         */\n        this.fire('close');\n\n        return this;\n    },\n\n    /**\n     * Returns the geographical location of the popup's anchor.\n     *\n     * @returns {LngLat} The geographical location of the popup's anchor.\n     */\n    getLngLat: function() {\n        return this._lngLat;\n    },\n\n    /**\n     * Sets the geographical location of the popup's anchor, and moves the popup to it.\n     *\n     * @param {LngLatLike} lnglat The geographical location to set as the popup's anchor.\n     * @returns {Popup} `this`\n     */\n    setLngLat: function(lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Sets the popup's content to a string of text.\n     *\n     * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,\n     * so it cannot insert raw HTML. Use this method for security against XSS\n     * if the popup content is user-provided.\n     *\n     * @param {string} text Textual content for the popup.\n     * @returns {Popup} `this`\n     * @example\n     * var popup = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setText('Hello, world!')\n     *   .addTo(map);\n     */\n    setText: function(text) {\n        return this.setDOMContent(document.createTextNode(text));\n    },\n\n    /**\n     * Sets the popup's content to the HTML provided as a string.\n     *\n     * @param {string} html A string representing HTML content for the popup.\n     * @returns {Popup} `this`\n     */\n    setHTML: function(html) {\n        var frag = document.createDocumentFragment();\n        var temp = document.createElement('body'), child;\n        temp.innerHTML = html;\n        while (true) {\n            child = temp.firstChild;\n            if (!child) break;\n            frag.appendChild(child);\n        }\n\n        return this.setDOMContent(frag);\n    },\n\n    /**\n     * Sets the popup's content to the element provided as a DOM node.\n     *\n     * @param {Node} htmlNode A DOM node to be used as content for the popup.\n     * @returns {Popup} `this`\n     * @example\n     * // create an element with the popup content\n     * var div = document.createElement('div');\n     * div.innerHTML = 'Hello, world!';\n     * var popup = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setDOMContent(div)\n     *   .addTo(map);\n     */\n    setDOMContent: function(htmlNode) {\n        this._createContent();\n        this._content.appendChild(htmlNode);\n        this._update();\n        return this;\n    },\n\n    _createContent: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        this._content = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n        if (this.options.closeButton) {\n            this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content);\n            this._closeButton.type = 'button';\n            this._closeButton.innerHTML = '&#215;';\n            this._closeButton.addEventListener('click', this._onClickClose);\n        }\n    },\n\n    _update: function() {\n        if (!this._map || !this._lngLat || !this._content) { return; }\n\n        if (!this._container) {\n            this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n            this._tip       = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n            this._container.appendChild(this._content);\n        }\n\n        var anchor = this.options.anchor;\n        var offset = normalizeOffset(this.options.offset);\n        var pos = this._map.project(this._lngLat).round();\n\n        if (!anchor) {\n            var width = this._container.offsetWidth,\n                height = this._container.offsetHeight;\n\n            if (pos.y + offset.bottom[1] - height < 0) {\n                anchor = ['top'];\n            } else if (pos.y + offset.top[1] + height > this._map.transform.height) {\n                anchor = ['bottom'];\n            } else {\n                anchor = [];\n            }\n\n            if (pos.x < width / 2) {\n                anchor.push('left');\n            } else if (pos.x > this._map.transform.width - width / 2) {\n                anchor.push('right');\n            }\n\n            if (anchor.length === 0) {\n                anchor = 'bottom';\n            } else {\n                anchor = anchor.join('-');\n            }\n        }\n\n        var offsetedPos = pos.add(offset[anchor]);\n\n        var anchorTranslate = {\n            'top': 'translate(-50%,0)',\n            'top-left': 'translate(0,0)',\n            'top-right': 'translate(-100%,0)',\n            'bottom': 'translate(-50%,-100%)',\n            'bottom-left': 'translate(0,-100%)',\n            'bottom-right': 'translate(-100%,-100%)',\n            'left': 'translate(0,-50%)',\n            'right': 'translate(-100%,-50%)'\n        };\n\n        var classList = this._container.classList;\n        for (var key in anchorTranslate) {\n            classList.remove('mapboxgl-popup-anchor-' + key);\n        }\n        classList.add('mapboxgl-popup-anchor-' + anchor);\n\n        DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + offsetedPos.x + 'px,' + offsetedPos.y + 'px)');\n    },\n\n    _onClickClose: function() {\n        this.remove();\n    }\n});\n\nfunction normalizeOffset(offset) {\n\n    if (!offset) {\n        return normalizeOffset(new Point(0, 0));\n\n    } else if (typeof offset === 'number') {\n        // input specifies a radius from which to calculate offsets at all positions\n        var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));\n        return {\n            'top': new Point(0, offset),\n            'top-left': new Point(cornerOffset, cornerOffset),\n            'top-right': new Point(-cornerOffset, cornerOffset),\n            'bottom': new Point(0, -offset),\n            'bottom-left': new Point(cornerOffset, -cornerOffset),\n            'bottom-right': new Point(-cornerOffset, -cornerOffset),\n            'left': new Point(offset, 0),\n            'right': new Point(-offset, 0)\n        };\n\n    } else if (isPointLike(offset)) {\n        // input specifies a single offset to be applied to all positions\n        var convertedOffset = Point.convert(offset);\n        return {\n            'top': convertedOffset,\n            'top-left': convertedOffset,\n            'top-right': convertedOffset,\n            'bottom': convertedOffset,\n            'bottom-left': convertedOffset,\n            'bottom-right': convertedOffset,\n            'left': convertedOffset,\n            'right': convertedOffset\n        };\n\n    } else {\n        // input specifies an offset per position\n        return {\n            'top': Point.convert(offset['top']),\n            'top-left': Point.convert(offset['top-left']),\n            'top-right': Point.convert(offset['top-right']),\n            'bottom': Point.convert(offset['bottom']),\n            'bottom-left': Point.convert(offset['bottom-left']),\n            'bottom-right': Point.convert(offset['bottom-right']),\n            'left': Point.convert(offset['left']),\n            'right': Point.convert(offset['right'])\n        };\n    }\n}\n\nfunction isPointLike(input) {\n    return input instanceof Point || Array.isArray(input);\n}\n\n\n/***/ }),\n/* 656 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactRouter = __webpack_require__(178);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _reactTether = __webpack_require__(1429);\n\nvar _reactTether2 = _interopRequireDefault(_reactTether);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nvar _invites_store = __webpack_require__(511);\n\nvar _invites_store2 = _interopRequireDefault(_invites_store);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _share_message = __webpack_require__(1432);\n\nvar _share_message2 = _interopRequireDefault(_share_message);\n\nvar _share_notification = __webpack_require__(1445);\n\nvar _share_notification2 = _interopRequireDefault(_share_notification);\n\nvar _change_report_permission = __webpack_require__(1446);\n\nvar _change_report_permission2 = _interopRequireDefault(_change_report_permission);\n\nvar _share_options_content = __webpack_require__(1448);\n\nvar _share_options_content2 = _interopRequireDefault(_share_options_content);\n\nvar _report_permission_options = __webpack_require__(660);\n\nvar _report_permission_options2 = _interopRequireDefault(_report_permission_options);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportPublicOption = {\n    name: 'Public',\n    id: 'public',\n    icon: 'icon-share-public',\n    description: 'This report is published to your OpenGov transparency site and can be seen by people outside your organization.',\n    readonly: true\n};\nfunction mapStateToProps() {\n    var state = _invites_store2.default.getState();\n    var report = _report_view_store2.default.getRenderedReport();\n    var session = _session_store2.default.getSession();\n    return {\n        invites: {\n            search: {\n                query: state.get('inviteeSearchQuery'),\n                results: _invites_store2.default.getSearchResults()\n            },\n            users: _invites_store2.default.getInvitedUsers(),\n            currentInvitedUsers: _invites_store2.default.getCurrentInvitedUsers(),\n            currentUser: _invites_store2.default.getCurrentUser(),\n            messageUsers: _invites_store2.default.getMessageUsers(),\n            owner: report.get('owner'),\n            reportRoles: _invites_store2.default.getReportRoles(),\n            pendingUser: _invites_store2.default.getPendingUser(),\n            error: _invites_store2.default.getInviteError(),\n            message: _invites_store2.default.getMessage(),\n            isSendingMessage: _invites_store2.default.getIsSendingMessage(),\n            isLoadingUsers: _invites_store2.default.getIsLoadingUsers()\n        },\n        sessionId: session ? session.get('id') : null,\n        activePanel: state.get('activePanel'),\n        updateMessage: InviteActions.updateMessage,\n        sendMessage: InviteActions.sendMessage,\n        cancel: InviteActions.resetShareMessagePanel,\n        isNotificationOpen: state.get('isNotificationOpen')\n    };\n}\nvar Transitionable = function Transitionable(Component) {\n    return (0, _createReactClass2.default)({\n        mixins: [_reactRouter.Navigation],\n        render: function render() {\n            return _react2.default.createElement(Component, Object.assign({ transitionTo: this.transitionTo }, this.props));\n        }\n    });\n};\nvar TransitionableShareOptionsContent = Transitionable(_share_options_content2.default);\n\nvar ShareOptions = function (_Component) {\n    _inherits(ShareOptions, _Component);\n\n    function ShareOptions() {\n        _classCallCheck(this, ShareOptions);\n\n        var _this = _possibleConstructorReturn(this, (ShareOptions.__proto__ || Object.getPrototypeOf(ShareOptions)).apply(this, arguments));\n\n        _this.onCancel = function () {\n            _this.props.cancel();\n            _this.closeDropdown();\n        };\n        _this.onSend = function () {\n            InviteActions.showSending();\n            var userIds = _this.props.invites.messageUsers.map(function (user) {\n                return user.get('id');\n            });\n            var message = _this.props.invites.message;\n            _this.props.sendMessage({ userIds: userIds, message: message }, _this.closeDropdown);\n        };\n        _this.onNotificationNo = function () {\n            InviteActions.closeNotification();\n        };\n        _this.onNotificationYes = function () {\n            _this.refs.shareToggle.toggle(true);\n        };\n        _this.onNotificationNever = function () {\n            InviteActions.closeAndNeverShowNotification();\n        };\n        _this.handleDropdownToggle = function (isOpen) {\n            if (isOpen) {\n                InviteActions.closeNotification();\n            }\n        };\n        _this.onSavePermissionChange = function () {\n            _this.showOverview();\n        };\n        _this.onCancelPermissionChange = function () {\n            _this.showOverview();\n        };\n        return _this;\n    }\n\n    _createClass(ShareOptions, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            InviteActions.loadEntityUsers();\n            InviteActions.loadReportRoles();\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            if (_invites_store2.default.getIsNotificationOpen()) {\n                InviteActions.closeNotification();\n                InviteActions.resetShareMessagePanel();\n            }\n        }\n    }, {\n        key: 'closeDropdown',\n        value: function closeDropdown() {\n            document.body.click();\n        }\n    }, {\n        key: 'renderSharePanel',\n        value: function renderSharePanel(permission) {\n            switch (this.props.activePanel) {\n                case 'overview':\n                    return _react2.default.createElement(TransitionableShareOptionsContent, { currentPermission: permission, reportId: this.props.report.get('id'), entity: this.props.report.get('entity'), onBack: InviteActions.goToMessagePanel, onEditPermission: InviteActions.goToPermissionPanel, sessionId: this.props.sessionId, isLoadingUsers: this.props.invites.isLoadingUsers, error: this.props.invites.error, invites: this.props.invites });\n                case 'permission':\n                    return _react2.default.createElement(_change_report_permission2.default, { initialPermission: permission, onSave: InviteActions.goToOverviewPanel, onCancel: InviteActions.goToOverviewPanel });\n                case 'message':\n                default:\n                    return _react2.default.createElement(_share_message2.default, Object.assign({}, this.props.invites.search, { showOverview: InviteActions.goToOverviewPanel, currentUser: this.props.invites.currentUser, currentInvitedUsers: this.props.invites.currentInvitedUsers, messageUsers: this.props.invites.messageUsers, permission: permission, message: this.props.invites.message, isSendingMessage: this.props.invites.isSendingMessage, isLoadingUsers: this.props.invites.isLoadingUsers, send: this.onSend, cancel: this.onCancel, updateMessage: this.props.updateMessage, addUser: InviteActions.addMessageUser, removeUser: InviteActions.removeMessageUser, reportId: this.props.report.get('id'), reportOwner: this.props.report.get('owner'), disableSearch: false }));\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            if (!this.props.report) return null;\n            var reportVisibility = this.props.report.get('visibility');\n            var isVisibleOnTransparency = reportVisibility === 'public';\n            var permission = isVisibleOnTransparency ? ReportPublicOption : _lodash2.default.find(_report_permission_options2.default, { id: reportVisibility });\n            // Choose the icon for the dropdown button based on the visibliity of the report.\n            // For reports published on transparency show the nice looking \"globe\" icon. If it's private put a lock on it.\n            // If the entire organization can see it then we use the team icon.\n            var dropdownIcon = isVisibleOnTransparency ? 'icon-share-public' : permission.icon;\n            return _react2.default.createElement(_reactTether2.default, { attachment: \"top right\", targetAttachment: \"bottom right\", constraints: [{\n                    to: 'scrollParent',\n                    attachment: 'together'\n                }] }, _react2.default.createElement(_ovid.Dropdown, { title: \"Share\", ref: \"shareToggle\", position: \"align-right\", onToggle: this.handleDropdownToggle, dropdownClass: \"ui-nav-bar__item report-share-menu\", toggleClass: 'share__toggle ui-button primary small ' + dropdownIcon, targetClass: \"share__dropdown ui-dropdown__target\", ignoreContentClicks: true }, _react2.default.createElement(\"div\", { className: \"share\" }, _react2.default.createElement(\"header\", { className: \"ui-dropdown__header\" }, _react2.default.createElement(\"h4\", null, \"Share Report\")), this.renderSharePanel(permission))), this.props.isNotificationOpen && _react2.default.createElement(_share_notification2.default, { onYes: this.onNotificationYes, onNo: this.onNotificationNo, onNever: this.onNotificationNever }));\n        }\n    }]);\n\n    return ShareOptions;\n}(_react.Component);\n\nShareOptions.propTypes = {\n    report: _propTypes2.default.object\n};\nexports.default = (0, _og_flux.Connect)(mapStateToProps, _invites_store2.default, _report_view_store2.default)(ShareOptions);\n\n/***/ }),\n/* 657 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = __webpack_require__(167);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _smooth = __webpack_require__(1440);\n\nvar _smooth2 = _interopRequireDefault(_smooth);\n\nvar _cancelEvents = __webpack_require__(1441);\n\nvar _cancelEvents2 = _interopRequireDefault(_cancelEvents);\n\nvar _scrollEvents = __webpack_require__(316);\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\r\n * Gets the easing type from the smooth prop within options.\r\n */\nvar getAnimationType = function getAnimationType(options) {\n  return _smooth2.default[options.smooth] || _smooth2.default.defaultEasing;\n};\n/*\r\n * Function helper\r\n */\nvar functionWrapper = function functionWrapper(value) {\n  return typeof value === 'function' ? value : function () {\n    return value;\n  };\n};\n/*\r\n * Wraps window properties to allow server side rendering\r\n */\nvar currentWindowProperties = function currentWindowProperties() {\n  if (typeof window !== 'undefined') {\n    return window.requestAnimationFrame || window.webkitRequestAnimationFrame;\n  }\n};\n\n/*\r\n * Helper function to never extend 60fps on the webpage.\r\n */\nvar requestAnimationFrameHelper = function () {\n  return currentWindowProperties() || function (callback, element, delay) {\n    window.setTimeout(callback, delay || 1000 / 60, new Date().getTime());\n  };\n}();\n\nvar makeData = function makeData() {\n  return {\n    currentPositionY: 0,\n    startPositionY: 0,\n    targetPositionY: 0,\n    progress: 0,\n    duration: 0,\n    cancel: false,\n\n    target: null,\n    containerElement: null,\n    to: null,\n    start: null,\n    deltaTop: null,\n    percent: null,\n    delayTimeout: null\n  };\n};\n\nvar currentPositionY = function currentPositionY(options) {\n  var containerElement = options.data.containerElement;\n  if (containerElement && containerElement !== document && containerElement !== document.body) {\n    return containerElement.scrollTop;\n  } else {\n    var supportPageOffset = window.pageXOffset !== undefined;\n    var isCSS1Compat = (document.compatMode || \"\") === \"CSS1Compat\";\n    return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;\n  }\n};\n\nvar scrollContainerHeight = function scrollContainerHeight(options) {\n  var containerElement = options.data.containerElement;\n  if (containerElement && containerElement !== document && containerElement !== document.body) {\n    return Math.max(containerElement.scrollHeight, containerElement.offsetHeight, containerElement.clientHeight);\n  } else {\n    var body = document.body;\n    var html = document.documentElement;\n\n    return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n  }\n};\n\nvar animateScroll = function animateScroll(easing, options, timestamp) {\n  var data = options.data;\n\n  // Cancel on specific events\n  if (!options.ignoreCancelEvents && data.cancel) {\n    if (_scrollEvents2.default.registered['end']) {\n      _scrollEvents2.default.registered['end'](data.to, data.target, data.currentPositionY);\n    }\n    return;\n  };\n\n  data.deltaTop = Math.round(data.targetPositionY - data.startPositionY);\n\n  if (data.start === null) {\n    data.start = timestamp;\n  }\n\n  data.progress = timestamp - data.start;\n\n  data.percent = data.progress >= data.duration ? 1 : easing(data.progress / data.duration);\n\n  data.currentPositionY = data.startPositionY + Math.ceil(data.deltaTop * data.percent);\n\n  if (data.containerElement && data.containerElement !== document && data.containerElement !== document.body) {\n    data.containerElement.scrollTop = data.currentPositionY;\n  } else {\n    window.scrollTo(0, data.currentPositionY);\n  }\n\n  if (data.percent < 1) {\n    var easedAnimate = animateScroll.bind(null, easing, options);\n    requestAnimationFrameHelper.call(window, easedAnimate);\n    return;\n  }\n\n  if (_scrollEvents2.default.registered['end']) {\n    _scrollEvents2.default.registered['end'](data.to, data.target, data.currentPositionY);\n  }\n};\n\nvar setContainer = function setContainer(options) {\n  options.data.containerElement = !options ? null : options.containerId ? document.getElementById(options.containerId) : options.container && options.container.nodeType ? options.container : document;\n};\n\nvar animateTopScroll = function animateTopScroll(y, options, to, target) {\n  options.data = options.data || makeData();\n\n  window.clearTimeout(options.data.delayTimeout);\n\n  _cancelEvents2.default.subscribe(function () {\n    options.data.cancel = true;\n  });\n\n  setContainer(options);\n\n  options.data.start = null;\n  options.data.cancel = false;\n  options.data.startPositionY = currentPositionY(options);\n  options.data.targetPositionY = options.absolute ? y : y + options.data.startPositionY;\n\n  if (options.data.startPositionY === options.data.targetPositionY) {\n    if (_scrollEvents2.default.registered['end']) {\n      _scrollEvents2.default.registered['end'](options.data.to, options.data.target, options.data.currentPositionY);\n    }\n    return;\n  }\n\n  options.data.deltaTop = Math.round(options.data.targetPositionY - options.data.startPositionY);\n\n  options.data.duration = functionWrapper(options.duration)(options.data.deltaTop);\n  options.data.duration = isNaN(parseFloat(options.data.duration)) ? 1000 : parseFloat(options.data.duration);\n  options.data.to = to;\n  options.data.target = target;\n\n  var easing = getAnimationType(options);\n  var easedAnimate = animateScroll.bind(null, easing, options);\n\n  if (options && options.delay > 0) {\n    options.data.delayTimeout = window.setTimeout(function () {\n      requestAnimationFrameHelper.call(window, easedAnimate);\n    }, options.delay);\n    return;\n  }\n\n  requestAnimationFrameHelper.call(window, easedAnimate);\n};\n\nvar proceedOptions = function proceedOptions(options) {\n  options = _extends({}, options);\n  options.data = options.data || makeData();\n  options.absolute = true;\n  return options;\n};\n\nvar scrollToTop = function scrollToTop(options) {\n  animateTopScroll(0, proceedOptions(options));\n};\n\nvar scrollTo = function scrollTo(toY, options) {\n  animateTopScroll(toY, proceedOptions(options));\n};\n\nvar scrollToBottom = function scrollToBottom(options) {\n  options = proceedOptions(options);\n  setContainer(options);\n  animateTopScroll(scrollContainerHeight(options), options);\n};\n\nvar scrollMore = function scrollMore(toY, options) {\n  options = proceedOptions(options);\n  setContainer(options);\n  animateTopScroll(currentPositionY(options) + toY, options);\n};\n\nexports.default = {\n  animateTopScroll: animateTopScroll,\n  getAnimationType: getAnimationType,\n  scrollToTop: scrollToTop,\n  scrollToBottom: scrollToBottom,\n  scrollTo: scrollTo,\n  scrollMore: scrollMore\n};\n\n/***/ }),\n/* 658 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _passiveEventListeners = __webpack_require__(315);\n\nvar _utils = __webpack_require__(167);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar scrollHash = {\n  mountFlag: false,\n  initialized: false,\n  scroller: null,\n  containers: {},\n\n  mount: function mount(scroller) {\n    this.scroller = scroller;\n\n    this.handleHashChange = this.handleHashChange.bind(this);\n    window.addEventListener('hashchange', this.handleHashChange);\n\n    this.initStateFromHash();\n    this.mountFlag = true;\n  },\n  mapContainer: function mapContainer(to, container) {\n    this.containers[to] = container;\n  },\n  isMounted: function isMounted() {\n    return this.mountFlag;\n  },\n  isInitialized: function isInitialized() {\n    return this.initialized;\n  },\n  initStateFromHash: function initStateFromHash() {\n    var _this = this;\n\n    var hash = this.getHash();\n    if (hash) {\n      window.setTimeout(function () {\n        _this.scrollTo(hash, true);\n        _this.initialized = true;\n      }, 10);\n    } else {\n      this.initialized = true;\n    }\n  },\n  scrollTo: function scrollTo(to, isInit) {\n    var scroller = this.scroller;\n    var element = scroller.get(to);\n    if (element && (isInit || to !== scroller.getActiveLink())) {\n      var container = this.containers[to] || document;\n      scroller.scrollTo(to, { container: container });\n    }\n  },\n  getHash: function getHash() {\n    return _utils2.default.getHash();\n  },\n  changeHash: function changeHash(to) {\n    if (this.isInitialized()) {\n      _utils2.default.pushHash(to);\n    }\n  },\n  handleHashChange: function handleHashChange() {\n    this.scrollTo(this.getHash());\n  },\n  unmount: function unmount() {\n    this.scroller = null;\n    this.containers = null;\n    window.removeEventListener('hashchange', this.handleHashChange);\n  }\n};\n\nexports.default = scrollHash;\n\n/***/ }),\n/* 659 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _scroller = __webpack_require__(222);\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nexports.default = function (Component) {\n  var Element = function (_React$Component) {\n    _inherits(Element, _React$Component);\n\n    function Element(props) {\n      _classCallCheck(this, Element);\n\n      var _this = _possibleConstructorReturn(this, (Element.__proto__ || Object.getPrototypeOf(Element)).call(this, props));\n\n      _this.childBindings = {\n        domNode: null\n      };\n      return _this;\n    }\n\n    _createClass(Element, [{\n      key: 'componentDidMount',\n      value: function componentDidMount() {\n        if (typeof window === 'undefined') {\n          return false;\n        }\n        this.registerElems(this.props.name);\n      }\n    }, {\n      key: 'componentWillReceiveProps',\n      value: function componentWillReceiveProps(nextProps) {\n        if (this.props.name !== nextProps.name) {\n          this.registerElems(nextProps.name);\n        }\n      }\n    }, {\n      key: 'componentWillUnmount',\n      value: function componentWillUnmount() {\n        if (typeof window === 'undefined') {\n          return false;\n        }\n        _scroller2.default.unregister(this.props.name);\n      }\n    }, {\n      key: 'registerElems',\n      value: function registerElems(name) {\n        _scroller2.default.register(name, this.childBindings.domNode);\n      }\n    }, {\n      key: 'render',\n      value: function render() {\n        return _react2.default.createElement(Component, _extends({}, this.props, { parentBindings: this.childBindings }));\n      }\n    }]);\n\n    return Element;\n  }(_react2.default.Component);\n\n  ;\n\n  Element.propTypes = {\n    name: _propTypes2.default.string,\n    id: _propTypes2.default.string\n  };\n\n  return Element;\n};\n\n/***/ }),\n/* 660 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar ReportPermissionOptions = [{\n    id: 'private',\n    name: 'Private',\n    icon: 'icon-share-private',\n    description: 'Visible to you and invited members from your organization.'\n}, {\n    id: 'my_organization',\n    name: 'My organization',\n    icon: 'icon-share-my-org',\n    description: 'This report can be seen by anyone in your organization and can be added to your Transparency Portal.'\n}, {\n    id: 'network',\n    name: 'Network',\n    icon: 'icon-app-network',\n    description: 'This report can be seen by anyone in your organization as well as other users in the OpenGov Network.'\n}];\nexports.default = ReportPermissionOptions;\n\n/***/ }),\n/* 661 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getHostname = exports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _embed_utils = __webpack_require__(71);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TransparencyLoginButton = function (_React$Component) {\n    _inherits(TransparencyLoginButton, _React$Component);\n\n    function TransparencyLoginButton() {\n        _classCallCheck(this, TransparencyLoginButton);\n\n        return _possibleConstructorReturn(this, (TransparencyLoginButton.__proto__ || Object.getPrototypeOf(TransparencyLoginButton)).apply(this, arguments));\n    }\n\n    _createClass(TransparencyLoginButton, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                entityId = _props.entityId,\n                transparencyUrl = _props.transparencyUrl;\n\n            var embedStyle = (0, _embed_utils.isEmbed)() ? { display: 'none' } : {};\n            var locationHost = getHostname(transparencyUrl, entityId);\n            var locationHash = window.location.hash.replace('#/', entityId + '/');\n            var protocol = window.location.protocol;\n            var redirectUrl = protocol + '//' + locationHost + '/reports#/' + locationHash;\n            var link = '//' + locationHost + '/auth/validate?redirect_url=' + global.escape(redirectUrl);\n            return _react2.default.createElement(\"a\", { style: embedStyle, className: \"ui-button login small ghost no-color\", key: \"login\", href: link }, \" Login\");\n        }\n    }]);\n\n    return TransparencyLoginButton;\n}(_react2.default.Component);\n\nexports.default = TransparencyLoginButton;\n\nTransparencyLoginButton.propTypes = {\n    entityId: _propTypes2.default.string,\n    transparencyUrl: _propTypes2.default.string\n};\nvar getHostname = exports.getHostname = function getHostname(href, entityId) {\n    var linkedElement = document.createElement('a');\n    linkedElement.href = href ? href : 'http://controlpanel.opengov.com';\n    return linkedElement.hostname.replace('' + entityId, 'controlpanel');\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 662 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FeedbackModal = function (_React$Component) {\n    _inherits(FeedbackModal, _React$Component);\n\n    function FeedbackModal() {\n        _classCallCheck(this, FeedbackModal);\n\n        var _this = _possibleConstructorReturn(this, (FeedbackModal.__proto__ || Object.getPrototypeOf(FeedbackModal)).apply(this, arguments));\n\n        _this.state = {\n            name: '',\n            phone: '',\n            email: '',\n            message: ''\n        };\n        _this.close = function () {\n            _report_actions2.default.hideFeedback();\n        };\n        _this.sendFeedback = function (e) {\n            e.preventDefault();\n            _report_actions2.default.sendFeedback(_this.state.name, _this.state.phone, _this.state.email, _this.state.message, _this.props.reportId, _this.props.entityId);\n        };\n        _this.handleChange = function (prop, value) {\n            _this.setState(_defineProperty({}, prop, value));\n        };\n        return _this;\n    }\n\n    _createClass(FeedbackModal, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open\", id: \"overlay-modal_feedback\" }, _react2.default.createElement(\"div\", { className: \"ui-modal\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"Contact \", this.props.entityDisplayName), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", \"data-modal\": \"feedback\", onClick: this.close })), _react2.default.createElement(\"form\", { id: \"feedback-form\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, !!this.props.showError ? _react2.default.createElement(\"div\", { className: \"ui-alert-box\" }, this.props.errorMessage) : null, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Name\"), _react2.default.createElement(\"input\", { type: \"text\", className: \"overlay-form__input\", name: \"name\", ref: \"name\", disabled: !!this.props.feedbackSaving, value: this.state.name, onChange: function onChange(e) {\n                    return _this2.handleChange('name', e.target.value);\n                } })), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Phone\"), _react2.default.createElement(\"input\", { type: \"text\", className: \"overlay-form__input\", name: \"phone\", ref: \"phone\", disabled: !!this.props.feedbackSaving, value: this.state.phone, onChange: function onChange(e) {\n                    return _this2.handleChange('phone', e.target.value);\n                } })), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Email\"), _react2.default.createElement(\"input\", { type: \"email\", className: \"overlay-form__input\", name: \"email\", ref: \"email\", disabled: !!this.props.feedbackSaving, value: this.state.email, onChange: function onChange(e) {\n                    return _this2.handleChange('email', e.target.value);\n                } })), _react2.default.createElement(\"fieldset\", { className: \"ui-form required\" }, _react2.default.createElement(\"label\", { className: \"overlay-form__label\" }, \"Message\"), _react2.default.createElement(\"textarea\", { id: \"message\", name: \"message\", ref: \"message\", disabled: !!this.props.feedbackSaving, value: this.state.message, onChange: function onChange(e) {\n                    return _this2.handleChange('message', e.target.value);\n                } }))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", \"data-modal\": \"feedback\", onClick: this.sendFeedback, disabled: !!this.props.feedbackSaving }, \"Send\"))))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n        }\n    }]);\n\n    return FeedbackModal;\n}(_react2.default.Component);\n\nexports.default = FeedbackModal;\n\n/***/ }),\n/* 663 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction iconType(extension) {\n    switch (extension) {\n        case '.pdf':\n            return 'pdf';\n        case '.doc':\n        case '.docx':\n            return 'doc';\n        case '.zip':\n            return 'zip';\n        case '.txt':\n            return 'txt';\n        case '.csv':\n            return 'csv';\n        case '.xls':\n        case '.xlsx':\n            return 'xls';\n    }\n}\n\nvar DocumentList = function (_React$Component) {\n    _inherits(DocumentList, _React$Component);\n\n    function DocumentList() {\n        _classCallCheck(this, DocumentList);\n\n        return _possibleConstructorReturn(this, (DocumentList.__proto__ || Object.getPrototypeOf(DocumentList)).apply(this, arguments));\n    }\n\n    _createClass(DocumentList, [{\n        key: 'render',\n        value: function render() {\n            var documents = this.props.entity.get('documents');\n            if (_lodash2.default.isEmpty(documents)) {\n                return null;\n            }\n            var sortedDocuments = _lodash2.default.sortBy(documents, _lodash2.default.bind(function (d) {\n                return d.position;\n            }, this)).map(function (d) {\n                return {\n                    name: d.name || d.file_name,\n                    icon_type: iconType(d.file_extension),\n                    tooltip_name: d.name + ' (' + d.extension + ')',\n                    url: d.file_url\n                };\n            });\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Documents\"), _react2.default.createElement(\"nav\", { className: \"ui-nav-list\" }, sortedDocuments.map(function (d) {\n                return _react2.default.createElement(\"a\", { key: d.name, href: '' + d.url, className: \"ui-nav-list__item\", target: \"_blank\" }, _react2.default.createElement(\"div\", { className: \"product-icon\" }, _react2.default.createElement(\"span\", { className: 'icon-' + d.icon_type + '-1' })), _react2.default.createElement(\"span\", { className: \"ui-nav-list__item__text\", title: '' + d.tooltip_name }, d.name));\n            })));\n        }\n    }]);\n\n    return DocumentList;\n}(_react2.default.Component);\n\nexports.default = DocumentList;\n\n/***/ }),\n/* 664 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TermsOfService = function (_React$Component) {\n    _inherits(TermsOfService, _React$Component);\n\n    function TermsOfService() {\n        _classCallCheck(this, TermsOfService);\n\n        return _possibleConstructorReturn(this, (TermsOfService.__proto__ || Object.getPrototypeOf(TermsOfService)).apply(this, arguments));\n    }\n\n    _createClass(TermsOfService, [{\n        key: 'handleClose',\n        value: function handleClose(e) {\n            e.preventDefault();\n            _grid_report_actions2.default.hideTOS();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open ready\", id: \"overlay-modal_tos\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"OpenGov Site Terms of Use\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", onClick: this.handleClose })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"article\", { className: \"terms-of-service\" }, _react2.default.createElement(\"p\", null, _react2.default.createElement(\"em\", null, \"Last revised on: January 11, 2016\")), _react2.default.createElement(\"p\", null, \"Welcome to this OpenGov website! This website (the \\\"\", _react2.default.createElement(\"strong\", null, \"Site\"), \"\\\") is a copyrighted work belonging to OpenGov, Inc. (\\\"\", _react2.default.createElement(\"strong\", null, \"OpenGov\"), \"\\\", \\\"\", _react2.default.createElement(\"strong\", null, \"us\"), \"\\\", \\\"\", _react2.default.createElement(\"strong\", null, \"our\"), \"\\\", and \\\"\", _react2.default.createElement(\"strong\", null, \"we\"), \"\\\").  OpenGov makes available public domain data that it has aggregated and processed on behalf of governments on websites for public consumption (collectively, with all other services provided through the Site, the \\\"Services\\\"). Certain features of the Services or Site may be subject to additional guidelines, terms, or rules, which will be posted on the Service or Site in connection with such features.  All such additional terms, guidelines, and rules are incorporated by reference into this Agreement.\"), _react2.default.createElement(\"p\", null, \"These Terms of Use (\\\"Agreement\\\") sets forth the legally binding terms for your use of the Site and Services. By accessing or using the Site or Services, you are accepting this Agreement and you represent and warrant that you have the right, authority, and capacity to enter into this Agreement. If you do not agree with all of the provisions of this Agreement, do not access and/or use the Site or Services. If you are using the Site or Services on behalf of a company, entity, or organization, you represent and warrant that you are an authorized representative of such company, entity, or organization with the authority to bind it to this Agreement.\"), _react2.default.createElement(\"h3\", null, \"1. Site\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"1.1 License.\"), \" Subject to the terms of this Agreement, OpenGov grants you a non-transferable, non-exclusive, license to use the Site and Services for your personal, noncommercial use.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"1.2 Certain Restrictions.\"), \" The rights granted to you in this Agreement with regards to any content or information on the site that is not in the public domain are subject to the following restrictions: (a) you shall not license, sell, rent, lease, transfer, assign, distribute, host, or otherwise commercially exploit any portion of the Site or Services; (b) you shall not modify, make derivative works of, disassemble, reverse compile or reverse engineer any portion of the Site or Services; (c) you shall not access the Site or Services in order to build a similar or competitive service; and (d) except as expressly stated herein, no potion of the Site or Services may be copied, reproduced, distributed, republished, downloaded, displayed, posted or transmitted in any form or by any means.  Any future release, update, or other addition to functionality of the Site or Services shall be subject to the terms of this Agreement. All copyright and other proprietary notices on any Site or Services content must be retained on all copies thereof.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"1.3 Modification.\"), \" OpenGov reserves the right, at any time, to modify, suspend, or discontinue the Site or Services or any part thereof with or without notice. You agree that OpenGov will not be liable to you or to any third party for any modification, suspension, or discontinuance of the Site or Services or any part thereof.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"1.4 Ownership.\"), \" Excluding the public domain data made available on the site, you acknowledge that all the intellectual property rights, including copyrights, patents, trade marks, and trade secrets, in the Site and Services are owned by OpenGov or OpenGov's licensors. The provision of the Site and Services does not transfer to you or any third party any rights, title or interest in or to such intellectual property rights. OpenGov and its suppliers reserve all rights not granted in this Agreement.\"), _react2.default.createElement(\"h3\", null, \"2. Acceptable Use Policy.\"), _react2.default.createElement(\"p\", null, \"You agree not to use the Site or Services to: (a) upload, transmit, or distribute any computer viruses, worms, or any software intended to damage or alter a computer system or data; (b) interfere with, disrupt, or create an undue burden on servers or networks connected to the Site or Services or violate the regulations, policies or procedures of such networks; (c) attempt to gain unauthorized access to the Site or Services, other computer systems or networks connected to or used together with the Site or Services; (d) harass or interfere with another user's use and enjoyment of the Site or Services; or (e) introduce software or automated agents or scripts to the Site or Services so as to generate automated searches, requests and queries, or to strip, scrape, or mine data from the Site or Services.\"), _react2.default.createElement(\"h3\", null, \"3. Indemnity.\"), _react2.default.createElement(\"p\", null, \"You agree to indemnify and hold OpenGov (and its officers, employees, and agents) harmless, including costs and attorneys' fees, from any claim or demand made by any third party due to or arising out of (i) your use of the Site or Services, (ii) your violation of this Agreement; or (iii) your violation of applicable laws or regulations.  OpenGov reserves the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us and you agree to cooperate with our defense of these claims.  You agree not to settle any matter without the prior written consent of OpenGov.  OpenGov will use reasonable efforts to notify you of any such claim, action or proceeding upon becoming aware of it.\"), _react2.default.createElement(\"h3\", null, \"4. Third Party Sites.\"), _react2.default.createElement(\"p\", null, \"The Site might contain links to third party websites and services for third parties (collectively, \\\"Third Party Sites\\\").  Such Third Party Sites are not under the control of OpenGov and OpenGov is not responsible for any Third Party Sites.  OpenGov provides these Third Party Sites only as a convenience and does not review, approve, monitor, endorse, warrant, or make any representations with respect to Third Party Sites.  You use all Third Party Sites at your own risk. When you link to a Third Party Site, the applicable third party's terms and policies apply, including the third party's privacy and data gathering practices.  You should make whatever investigation you feel necessary or appropriate before proceeding with any transaction in connection with such Third Party Sites.\"), _react2.default.createElement(\"h3\", null, \"5. Disclaimers.\"), _react2.default.createElement(\"p\", null, \"THE SITE AND SERVICES ARE PROVIDED \\\"AS-IS\\\" AND \\\"AS AVAILABLE\\\" AND WE (AND OUR SUPPLIERS) EXPRESSLY DISCLAIM ANY WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OR CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, QUIET ENJOYMENT, ACCURACY, OR NON-INFRINGEMENT.  WE (AND OUR SUPPLIERS) MAKE NO WARRANTY THAT THE SITE OR SERVICES: (A) WILL MEET YOUR REQUIREMENTS; (B) WILL BE AVAILABLE ON AN UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE BASIS; OR (C) WILL BE ACCURATE, RELIABLE, FREE OF VIRUSES OR OTHER HARMFUL CODE,  COMPLETE, LEGAL, OR SAFE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.\"), _react2.default.createElement(\"h3\", null, \"6. Limitation on Liability.\"), _react2.default.createElement(\"p\", null, \"IN NO EVENT SHALL WE (AND OUR SUPPLIERS) BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY LOST PROFIT OR ANY INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL OR PUNITIVE DAMAGES ARISING FROM OR RELATING TO THIS AGREEMENT OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR SERVICES, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ACCESS TO, AND USE OF, THE SITE AND SERVICES ARE AT YOUR OWN DISCRETION AND RISK, AND YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA RESULTING THEREFROM. NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED HEREIN, OUR (AND OUR SUPPLIERS') LIABILITY TO YOU FOR ANY DAMAGES ARISING FROM OR RELATED TO THIS AGREEMENT (FOR ANY CAUSE WHATSOEVER AND REGARDLESS OF THE FORM OF THE ACTION), WILL AT ALL TIMES BE LIMITED TO FIFTY US DOLLARS ($50). THE EXISTENCE OF MORE THAN ONE CLAIM WILL NOT ENLARGE THIS LIMIT. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OF CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU AND YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM JURISDICTION TO JURISDICTION.\"), _react2.default.createElement(\"h3\", null, \"7. Term and Termination.\"), _react2.default.createElement(\"p\", null, 'Subject to this Section, this Agreement will remain in full force and effect while you use the Site or Services.  We may (a) suspend your rights to use the Site and/or Services or (b) terminate this Agreement, at any time for any reason at our sole discretion, including for any use of the Site or Services in violation of this Agreement.  Upon termination of this Agreement, your right to access and use the Site and Services will terminate immediately.  OpenGov will not have any liability whatsoever to you for any termination of this Agreement.  Even after this Agreement is terminated, the following provisions of this Agreement will remain in effect: Sections 2\\u20138.'), _react2.default.createElement(\"h3\", null, \"8. General\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"8.1 Changes to Terms of Use.\"), \" This Agreement is subject to occasional revision, and if we make any substantial changes, we may notify you by prominently posting notice of the changes on our Site.  Any changes to this agreement will be effective thirty (30) calendar days following our posting of notice of the changes on our Site. Continued use of our Site or Services following notice of such changes shall indicate your acknowledgement of such changes and agreement to be bound by the terms and conditions of such changes.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"8.2 Choice of Law.\"), \" The Agreement is made under and shall be governed by and construed in accordance with the laws of the State of California, without giving effect to any principles that provide for the application of the law of another jurisdiction. Any action at law or in equity will be commenced in a federal or state court located in the County of Santa Clara, California and you and OpenGov consent to the venue and jurisdiction of such courts.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"8.3 Entire Agreement.\"), \" This Agreement constitutes the entire agreement between you and us regarding the use of the Site and Services. Our failure to exercise or enforce any right or provision of this Agreement shall not operate as a waiver of such right or provision. The section titles in this Agreement are for convenience only and have no legal or contractual effect. The word including means including without limitation. If any provision of this Agreement is, for any reason, held to be invalid or unenforceable, the other provisions of this Agreement will be unimpaired and the invalid or unenforceable provision will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law.  Your relationship to OpenGov is that of an independent contractor, and neither party is an agent or partner of the other. This Agreement, and your rights and obligations herein, may not be assigned, subcontracted, delegated, or otherwise transferred by you without OpenGov's prior written consent, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void.  The terms of this Agreement shall be binding upon assignees.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"8.4 Copyright/Trademark Information.\"), ' Copyright \\xA9 2013, OpenGov, Inc. All rights reserved.  All trademarks, logos and service marks (\"', _react2.default.createElement(\"strong\", null, \"Marks\"), \"\\\") displayed on the Site are our property or the property of other third parties. You are not permitted to use these Marks without our prior written consent or the consent of such third party which may own the Marks.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"8.5 Contact Information:\")), _react2.default.createElement(\"p\", null, \"OpenGov, Inc.\", _react2.default.createElement(\"br\", null), \"955 Charter Street\", _react2.default.createElement(\"br\", null), \"Redwood City, CA 94063\", _react2.default.createElement(\"br\", null), \"650-336-7167\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.handleClose }, \"Done\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\", onClick: this.handleClose }));\n        }\n    }]);\n\n    return TermsOfService;\n}(_react2.default.Component);\n\nexports.default = TermsOfService;\n\n/***/ }),\n/* 665 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Budget101 = (0, _createReactClass2.default)({\n    displayName: 'Budget101',\n    handleClose: function handleClose(e) {\n        e.preventDefault();\n        _grid_report_actions2.default.hideBudget101();\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open\", id: \"overlay-modal_budget101\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"Multi-Fund Accounting 101\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close js-modal-close\", onClick: this.handleClose })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"article\", { className: \"budget101-content\" }, _react2.default.createElement(\"h3\", { className: \"budget101-content__subtitle\" }, \"A Short Guide to Multi-fund Accounting\"), _react2.default.createElement(\"p\", { className: \"budget101-content__graphic-desc\" }, \"OpenGov helps governments describe how funds flow through their organization, including where revenues come from, how it is distributed across departments, and where it is ultimately spent.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/budget101/1.png'), className: \"budget101-content__graphic\", alt: \"Diagram of a multi-fund accounting system\" }), _react2.default.createElement(\"p\", { className: \"budget101-content__graphic-desc\" }, \"Many organizations manage their budget and finances by using a \\\"multi-fund\\\" accounting system in which revenue is disbursed to different funds. Those funds may be directed toward specific purposes, though some funds - often called general funds - can flow into multiple departments.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/budget101/2.png'), className: \"budget101-content__graphic\", alt: \"Diagram showing how funds are passed down from departments to divisions\" }), _react2.default.createElement(\"p\", { className: \"budget101-content__graphic-desc\" }, \"Many organizations are divided at their highest level into departments, which may then be divided into divisions.  Some organizations have multiple layers below the division level.  Some organizations track programs that may span multiple departments and divisions.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/budget101/3.png'), className: \"budget101-content__graphic\", alt: \"Diagram describing how revenue is split into funds\" }), _react2.default.createElement(\"p\", { className: \"budget101-content__graphic-desc\" }, \"In multi-fund environments, revenue streams can feed into multiple funds. Taxes, for example, may be allocated across a government to pay for a variety of services.  Other revenue sources, like parking tickets, may go directly to a specific department, division, or program.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/budget101/4.png'), className: \"budget101-content__graphic\", alt: \"Diagram showing the relationship between departments and expense types\" }), _react2.default.createElement(\"p\", { className: \"budget101-content__graphic-desc\" }, \"Departments often spend resources across many expense types.  These may range from buying office supplies and electricity to paying off debt.  Many departments share the same expense types, such as money spent on salaries and benefits for employees.\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, \" \", _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary js-modal-close\", onClick: this.handleClose }, \"Done\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\", onClick: this.handleClose }));\n    }\n});\nexports.default = Budget101;\n\n/***/ }),\n/* 666 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SummaryWelcome = (0, _createReactClass2.default)({\n    displayName: 'SummaryWelcome',\n\n    propTypes: {\n        showBudget101: _propTypes2.default.bool,\n        entity: _propTypes2.default.object\n    },\n    showHowTo: function showHowTo(isTallahasseeFl) {\n        if (isTallahasseeFl) {\n            _report_actions2.default.hideWelcomeModal();\n            _grid_report_actions2.default.showHowToModal();\n        } else {\n            _report_actions2.default.showHowTo();\n        }\n    },\n    showBudget101: function showBudget101(isTallahasseeFl, evt) {\n        evt.stopPropagation();\n        if (isTallahasseeFl) {\n            _report_actions2.default.hideWelcomeModal();\n            _report_actions2.default.showBudget101(true);\n        } else {\n            _report_actions2.default.showBudget101();\n        }\n    },\n    render: function render() {\n        var entity = this.props.entity;\n\n        var entityDisplayName = entity.get('display_name');\n        var entityName = entity.get('name');\n        var isTallahasseeFl = entity && entity.get('subdomain') === 'tallahasseefl';\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper modal_welcome open\", id: \"overlay-modal_welcome\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"h1\", { className: \"welcome__title\" }, \"Welcome to \", entityDisplayName + '\\'s', \" Financial Reporting Platform\"), _react2.default.createElement(\"p\", null, \"This site is designed to help you understand more about the operations and performance of \", entityName, \". Start exploring with these visualization and analytics tools to learn more.\"), _react2.default.createElement(\"p\", null, this.props.entity.get('budget_101') ? _react2.default.createElement(\"small\", null, \"You can read about \", _react2.default.createElement(\"a\", { id: \"welcome-budget-101\", onClick: _lodash2.default.partial(this.showBudget101, isTallahasseeFl) }, \"Multi-Fund Accounting\"), \" or view other topics in the Help menu.\") : _react2.default.createElement(\"small\", null, \"You can read about other topics in the Help menu.\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"button\", { id: \"welcome-how-to\", className: \"ui-button\", onClick: _lodash2.default.partial(this.showHowTo, isTallahasseeFl) }, \"How To Use This Report\"), _react2.default.createElement(\"div\", { className: \"ui-modal__actions ui-flex-1\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: _report_actions2.default.hideWelcomeModal }, \"View Report\")))), _react2.default.createElement(\"div\", { className: \"pointer-arrow_reports\" }), _react2.default.createElement(\"div\", { className: \"pointer-arrow_filter\" }), _react2.default.createElement(\"div\", { className: \"pointer-arrow_export\" }), _react2.default.createElement(\"div\", { className: \"pointer-arrow_legend\" }), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n    }\n});\nexports.default = SummaryWelcome;\n\n/***/ }),\n/* 667 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.validGraphTypes = exports.isValidGraphType = exports.Graph = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _highchartsOg = __webpack_require__(530);\n\nvar _highchartsOg2 = _interopRequireDefault(_highchartsOg);\n\nvar _numeral = __webpack_require__(144);\n\nvar _numeral2 = _interopRequireDefault(_numeral);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _formatValue = __webpack_require__(622);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _measure_text = __webpack_require__(1500);\n\nvar _measure_text2 = _interopRequireDefault(_measure_text);\n\nvar _chart_utils = __webpack_require__(535);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar fontStyle = {\n    fontSize: '13px',\n    fontFamily: 'ProximaNova'\n};\n\nvar Graph = exports.Graph = function () {\n    function Graph(container, reportEvents, budgetData, athenaState, handleTooltip) {\n        _classCallCheck(this, Graph);\n\n        this.reportEvents = reportEvents;\n        this.budgetData = budgetData;\n        this.athenaState = athenaState;\n        this.container = container;\n        this.annotations = {};\n        this.handleTooltip = handleTooltip;\n        this.textStyle = _lodash2.default.extend({ color: axisTextColor }, fontStyle);\n        // Currently rendered graph type\n        this.currentGraph = 'stacked';\n        this.athenaState.on('change:selectedDataSetIndex', function (state, index) {\n            // Update pie chart series when switching between data sets.\n            // Important for pie chart to pie chart changes\n            if (this.chart && !_lodash2.default.isEmpty(this.pieSeries)) {\n                this.lastGraph = 'pie';\n                this.removeAllSeries();\n                this.chart.addSeries(this.pieSeries[index], false);\n            }\n        }, this);\n        _highchartsOg2.default.setOptions({\n            lang: {\n                numericSymbols: ['k', 'M', 'B', 'T']\n            }\n        });\n        // Based on approach in http://stackoverflow.com/questions/11618075/highcharts-stop-chart-from-trapping-mouse-events-or-capture-mouse-click-on-the\n        _highchartsOg2.default.wrap(_highchartsOg2.default.Pointer.prototype, 'onContainerClick', function clickShim(original, e) {\n            var parent = this.chart.container.parentNode;\n            // Call the original event\n            original.apply(this, Array.prototype.slice.call(arguments, 1));\n            // Trigger the event on the container's parent (to bubble the event out of highcharts)\n            if (parent) {\n                (0, _jquery2.default)(parent).trigger('click', e);\n            }\n        });\n        _highchartsOg2.default.wrap(_highchartsOg2.default.Chart.prototype, 'render', function (proceed) {\n            if (this.options.plotOptions.column.stacking === false) {\n                this.series = _lodash2.default.sortBy(this.series, 'name');\n            }\n            return proceed.apply(this);\n        });\n        // Drop labels along the x-axis that don't fit\n        _highchartsOg2.default.wrap(_highchartsOg2.default.Axis.prototype, 'setTickPositions', function (proceed) {\n            proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n            if (this.isXAxis) {\n                var labelWidthSum = 0;\n                var labelBuffer = 20;\n                var ticks = this.ticks;\n                Object.keys(ticks).forEach(function (tick) {\n                    if (ticks[tick].label) {\n                        labelWidthSum += ticks[tick].label.getBBox().width;\n                    }\n                });\n                var averageWidth = labelWidthSum / Object.keys(ticks).length + labelBuffer;\n                var width = averageWidth || 60;\n                var oldPositions = this.tickPositions;\n                var numberOfTickLabels = Math.floor(this.width / width);\n                var tickInterval = Math.ceil(oldPositions.length / numberOfTickLabels);\n                var result = _lodash2.default.filter((0, _lodash2.default)(oldPositions).reverse().value(), _lodash2.default.bind(function (v, i) {\n                    return i % tickInterval === 0;\n                }, this));\n                this.tickPositions = (0, _lodash2.default)(result).reverse().value();\n            }\n        });\n        // Halo not positioned correctly when using grouped data\n        // https://github.com/highslide-software/highcharts.com/blob/fd4cd1caef6ae590774de15bcfb26034f2b36fb6/js/parts/Interaction.js#L588\n        _highchartsOg2.default.wrap(_highchartsOg2.default.Point.prototype, 'haloPath', function (proceed, size) {\n            var series = this.series;\n            var chart = series.chart;\n            var plotBox = series.getPlotBox();\n            var inverted = chart.inverted;\n            var plotX = this.barX ? this.barX + this.pointWidth / 2 : this.plotX;\n            return chart.renderer.symbols.circle(plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : plotX) - size, plotBox.translateY + (inverted ? series.xAxis.len - plotX : this.plotY) - size, size * 2, size * 2);\n        });\n    }\n\n    _createClass(Graph, [{\n        key: 'year',\n        value: function year(yearId) {\n            if (!_lodash2.default.isUndefined(yearId)) {\n                if (this.currentGraph !== 'pie' || !this.graph || this.startYear) {\n                    this.startYear = yearId;\n                } else {\n                    var idx = _lodash2.default.indexOf(this.yearOrder, yearId);\n                    if (idx === -1) {\n                        idx = this.yearOrder.length - 1;\n                    }\n                    this.positionPieSlider(idx);\n                }\n            } else {\n                if (!_lodash2.default.isUndefined(this.startYear)) {\n                    return this.startYear;\n                } else if (this.graph && _lodash2.default.isNumber(this.chart.pos) && this.yearOrder) {\n                    return this.yearOrder[this.chart.pos];\n                } else {\n                    return null;\n                }\n            }\n        }\n        // Render the graph\n\n    }, {\n        key: 'update',\n        value: function update(data, totals, graphType, accountType, xAxisTitle, yearLabels, showAggregates, isSameData, yAxisScale, metricData, overlay) {\n            var self = this;\n            var lastGraph = graphType;\n            var highchartsChartType = graphType;\n            var stacking = 'normal';\n            var yUnit = _summary_report_store2.default.getAmountUnit();\n            var startOnTick = true;\n            var minPadding = 0;\n            var maxPadding = 0;\n            var groupPadding = 0.08;\n            var pointPadding = 0;\n            var xAxisMargin = void 0;\n            var options = void 0;\n            this.overlay = overlay;\n            this.metricData = metricData;\n            self.showAggregates = showAggregates;\n            this.data = data;\n            this.totals = totals;\n            this.accountType = accountType;\n            this.graphType = graphType;\n            this.yearLabels = _lodash2.default.map(yearLabels, function (label) {\n                return label.replace(/\\n/g, '<br/>');\n            });\n            var labelHeights = _lodash2.default.map(this.yearLabels, function (label) {\n                return (0, _measure_text2.default)(fontStyle, label)[1];\n            });\n            var tallestLabelHeight = _lodash2.default.max(labelHeights);\n            xAxisMargin = tallestLabelHeight;\n            if (!this.chart && !graphType) {\n                graphType = 'stacked';\n            }\n            if (!graphType) {\n                graphType = this.currentGraph;\n            }\n            if (this.points) {\n                delete this.points;\n            }\n            // we cannot display regular area charts for a single year, so we display as a full-width column\n            if (yearLabels.length === 1 && (graphType === 'stacked' || graphType === 'percentage')) {\n                groupPadding = 0;\n                pointPadding = 0;\n                if (graphType === 'percentage') {\n                    stacking = 'percent';\n                    yUnit = '%';\n                } else if (graphType === 'line') {\n                    stacking = '';\n                }\n                graphType = 'bar';\n            }\n            //ISSUE(LELAND) -> in stacked bar chart -> excessive negatives forces down chart\n            //Afterlooking at JSFiddles -> issues is highcharts adds all columns up to find the total (not absolute)...NEED to change HC source\n            switch (graphType) {\n                case 'line':\n                    stacking = '';\n                    break;\n                case 'stacked':\n                    highchartsChartType = 'area';\n                    stacking = 'normal';\n                    break;\n                case 'percentage':\n                    highchartsChartType = 'area';\n                    stacking = 'percent';\n                    yUnit = '%';\n                    break;\n                case 'bar':\n                    highchartsChartType = 'column';\n                    startOnTick = false;\n                    minPadding = maxPadding = 1 / (2 * yearLabels.length);\n                    break;\n            }\n            var grouping = this.graphType === 'bar' && accountType === 'types';\n            if (grouping) {\n                stacking = false;\n            }\n            options = {\n                graphType: graphType,\n                type: highchartsChartType,\n                stacking: stacking,\n                grouping: grouping,\n                groupPadding: groupPadding,\n                pointPadding: pointPadding,\n                xText: xAxisTitle,\n                xAxisMargin: xAxisMargin,\n                minPadding: minPadding,\n                maxPadding: maxPadding,\n                startOnTick: startOnTick,\n                yAxisScale: yAxisScale,\n                yUnit: yUnit\n            };\n            this.options = options;\n            if (this.chart) {\n                this.chart.options.plotOptions.column.grouping = options.grouping;\n                this.chart.options.plotOptions.column.stacking = options.stacking;\n            }\n            this.removeAllOverlays(false);\n            if (this.chart && lastGraph === this.lastGraph) {\n                this.sameTypeDifferentData(options);\n            } else {\n                if (this.chart && lastGraph === 'pie') {\n                    // we reset the selected dataset index every time we change the chart type.\n                    if (!(this.chart.pos && this.chart.pos < this.yearLabels.length)) {\n                        this.chart.pos = this.yearLabels.length - 1;\n                        this.athenaState.set('selectedDataSetIndex', this.yearLabels.length - 1);\n                    }\n                }\n            }\n            //Ensures that all axes and labels from previous graphs are cleared\n            //when new chart is constructed every time.\n            this.buildChart(options);\n            this.constructOverlay(this.overlay, this.metricData);\n            switch (graphType) {\n                case 'bar':\n                    // ensures dashed border\n                    (0, _chart_utils.setPointStateForSeries)(this.chart.series);\n                    break;\n                case 'stacked':\n                case 'percentage':\n                    this.attachAreaEvents(this.chart.series);\n                    break;\n                case 'line':\n                    if (yearLabels.length === 1) {\n                        this.addPlotLines();\n                    }\n                    break;\n                case 'pie':\n                    break;\n            }\n            this.lastGraph = lastGraph;\n            this.currentGraph = graphType;\n            this.removeAnnotations();\n            this.addAnnotations();\n        }\n    }, {\n        key: 'getPointsFromSeries',\n        value: function getPointsFromSeries(id) {\n            var _this = this;\n\n            var selectedSeries = (0, _chart_utils.filterSelectedSeries)(this.chart.series, id);\n            return _lodash2.default.flatten(_lodash2.default.map(selectedSeries, function (series) {\n                if (series.options.stack > 0 && _this.graphType !== 'bar') {\n                    return _lodash2.default.tail(series.data);\n                } else {\n                    return series.data;\n                }\n            }));\n        }\n    }, {\n        key: 'constructNewSeries',\n        value: function constructNewSeries(type, stacking, index) {\n            var data = this.data;\n            var yearLabels = this.yearLabels;\n            var colors = this.colors();\n            var point_id = 0;\n            var newSeries = [];\n            var self = this;\n            var seriesData = void 0;\n            var color = void 0;\n            var generateLine = void 0;\n            var generatePie = void 0;\n            var name = void 0;\n            var series_id = void 0;\n            var childless = void 0;\n            var amt = void 0;\n            var seriesInLine = void 0;\n            var currentDataType = void 0;\n            var seriesDataType = void 0;\n            var prev = void 0;\n            var annotation = void 0;\n            var dataTypes = this.dataTypes();\n            var seriesAnimation = (0, _chart_utils.getAnimationDuration)();\n            switch (type) {\n                // for line and area graphs we have to make separate series for actual data\n                // and budget data in order to display the dashed line\n                case 'line':\n                case 'area':\n                    generateLine = function generateLine(d, _i, g) {\n                        seriesData = [];\n                        seriesInLine = 0;\n                        seriesDataType = _lodash2.default.head(dataTypes);\n                        name = _strings2.default.nodeName(d);\n                        series_id = d.id;\n                        childless = d.childless && _lodash2.default.size(g) === 1;\n                        for (var _i2 = 0; _i2 < dataTypes.length; _i2++) {\n                            if (d.amounts[_i2]) {\n                                amt = d.amounts[_i2].value;\n                                annotation = d.amounts[_i2].annotation;\n                            }\n                            currentDataType = dataTypes[_i2];\n                            if (currentDataType === seriesDataType) {\n                                seriesData.push({\n                                    x: _i2,\n                                    y: amt,\n                                    id: point_id++,\n                                    dataType: d.amounts[_i2].type,\n                                    series_id: series_id,\n                                    seriesName: name,\n                                    childless: childless,\n                                    annotation: annotation\n                                });\n                            } else {\n                                color = colors[d.id];\n                                prev = _lodash2.default.last(seriesData);\n                                newSeries.push({\n                                    name: name,\n                                    type: type,\n                                    stacking: stacking,\n                                    id: series_id,\n                                    color: (0, _chart_utils.getColorForDatasetType)(color, seriesDataType),\n                                    fillColor: (0, _chart_utils.getColorForDatasetType)(color, seriesDataType),\n                                    data: seriesData,\n                                    dashStyle: (0, _chart_utils.getDashStyleForDatasetType)(seriesDataType),\n                                    fillOpacity: (0, _chart_utils.getFillOpacity)(seriesDataType),\n                                    stack: seriesInLine,\n                                    animation: seriesAnimation,\n                                    pointPlacement: 'on',\n                                    showInLegend: seriesInLine === 0,\n                                    overlay: false\n                                });\n                                seriesInLine++;\n                                seriesData = [prev];\n                                seriesDataType = currentDataType;\n                                seriesData.push({\n                                    x: _i2,\n                                    y: amt,\n                                    id: point_id++,\n                                    dataType: d.amounts[_i2].type,\n                                    series_id: series_id,\n                                    seriesName: name,\n                                    childless: childless,\n                                    annotation: annotation\n                                });\n                            }\n                        }\n                        // Make sure to add the last series\n                        color = colors[d.id];\n                        newSeries.push({\n                            name: name,\n                            type: type,\n                            stacking: stacking,\n                            id: series_id,\n                            color: (0, _chart_utils.getColorForDatasetType)(color, seriesDataType),\n                            fillColor: (0, _chart_utils.getColorForDatasetType)(color, seriesDataType),\n                            data: seriesData,\n                            dashStyle: (0, _chart_utils.getDashStyleForDatasetType)(seriesDataType),\n                            fillOpacity: (0, _chart_utils.getFillOpacity)(seriesDataType),\n                            stack: seriesInLine,\n                            animation: seriesAnimation,\n                            pointPlacement: 'on',\n                            showInLegend: seriesInLine === 0,\n                            overlay: false\n                        });\n                    };\n                    _lodash2.default.each(data, generateLine);\n                    break;\n                case 'column':\n                    data.forEach(function (dataSet, index, g) {\n                        var seriesName = _strings2.default.nodeName(dataSet);\n                        var series = {\n                            animation: seriesAnimation,\n                            borderWidth: 0,\n                            childless: dataSet.childless && _lodash2.default.size(g) === 1,\n                            color: (0, _chart_utils.getColorForDatasetType)(colors[dataSet.id], _lodash2.default.head(dataTypes)),\n                            data: [],\n                            id: dataSet.id,\n                            name: seriesName,\n                            showInLegend: true,\n                            type: 'column',\n                            overlay: false\n                        };\n                        dataSet.amounts.forEach(function (dataPoint, index) {\n                            series.data.push({\n                                annotation: dataPoint.annotation,\n                                color: (0, _chart_utils.getColorForDatasetType)(colors[dataSet.id], dataPoint.type),\n                                dashStyle: (0, _chart_utils.getDashStyleForDatasetType)(dataPoint.type),\n                                dataType: dataPoint.type,\n                                id: index,\n                                series_id: dataSet.id,\n                                seriesName: seriesName,\n                                x: index,\n                                y: dataPoint.value\n                            });\n                        });\n                        newSeries.push(series);\n                    });\n                    break;\n                case 'pie':\n                    self.pieSeries = [];\n                    generatePie = function generatePie(d, _i, g) {\n                        color = colors[d.id];\n                        amt = d.amounts[i].value;\n                        seriesDataType = d.amounts[i].type;\n                        var annotation = d.amounts[i].annotation;\n                        var isPositive = amt > 0;\n                        if (!isPositive) {\n                            amt = -1 * amt;\n                            color = (0, _chart_utils.setColorOpacityForDataSetType)(color, _chart_utils.FAINT_OPACITY / 2, seriesDataType);\n                        } else {\n                            color = (0, _chart_utils.setColorOpacityForDataSetType)(color, _chart_utils.REGULAR_OPACITY, seriesDataType);\n                        }\n                        return {\n                            name: _strings2.default.nodeName(d),\n                            series_id: d.id,\n                            childless: d.childless && _lodash2.default.size(g) === 1,\n                            // NOTE: color here has already been assigned by the if statement above\n                            // all we do here is make sure that we return either color or pattern for projection and budget\n                            color: (0, _chart_utils.getColorForDatasetType)(color, seriesDataType),\n                            y: amt,\n                            dataType: d.amounts[i].type,\n                            annotation: annotation,\n                            positive: isPositive\n                        };\n                    };\n                    for (var i = 0; i < _lodash2.default.head(data).amounts.length; i++) {\n                        seriesData = _lodash2.default.map(data, generatePie);\n                        self.pieSeries.push({\n                            name: yearLabels[i],\n                            data: seriesData,\n                            type: type,\n                            animation: false,\n                            borderWidth: 0,\n                            overlay: false\n                        });\n                    }\n                    var pieSeries = self.getPieSeries(index); //index becomes the key...\n                    pieSeries.animation = seriesAnimation;\n                    newSeries.push(pieSeries);\n                    break;\n            }\n            return newSeries;\n        }\n    }, {\n        key: 'removeAllSeries',\n        value: function removeAllSeries() {\n            var _this2 = this;\n\n            var chart = this.chart;\n            var yAxis = void 0;\n            if (chart) {\n                _lodash2.default.each(chart && chart.series, function (series) {\n                    _this2.unhighlightSeries(series.options.id);\n                });\n                while (chart.series && chart.series.length > 0) {\n                    _lodash2.default.head(chart.series).remove(false);\n                }\n                yAxis = _lodash2.default.head(chart && chart.yAxis);\n                _lodash2.default.each(chart && chart.plotLines, function (line) {\n                    yAxis.removePlotLine(line);\n                });\n                chart.plotLines = [];\n            }\n        }\n    }, {\n        key: 'removeAllOverlays',\n        value: function removeAllOverlays(redraw) {\n            if (this.chart && this.chart.series && this.chart.yAxis && this.metricData.size > 0) {\n                var somethingRemoved = false;\n                _lodash2.default.forEach(this.chart.series, function (serie) {\n                    if (serie && serie.userOptions.overlay) {\n                        serie.remove(false);\n                        somethingRemoved = true;\n                    }\n                });\n                _lodash2.default.forEach(this.chart.yAxis, function (yAxis) {\n                    if (yAxis.userOptions.overlay) {\n                        yAxis.remove(false);\n                        somethingRemoved = true;\n                    }\n                });\n                var shouldRedraw = _lodash2.default.isUndefined(redraw) ? true : redraw;\n                if (somethingRemoved && shouldRedraw) {\n                    this.chart.redraw();\n                }\n            }\n        }\n    }, {\n        key: 'constructOverlay',\n        value: function constructOverlay(overlay, metricData) {\n            var _this3 = this;\n\n            this.overlay = overlay;\n            this.metricData = metricData;\n            var selectedOverlay = overlay.getIn(['selected', 0]);\n            var graphType = this.options.graphType;\n            var overlayCompatibleCharts = overlay.get('overlayCompatibleCharts');\n            if (_lodash2.default.isNull(selectedOverlay) || !overlayCompatibleCharts.includes(graphType)) {\n                return;\n            }\n            var selectedData = metricData.get(selectedOverlay);\n            if (!_lodash2.default.isUndefined(selectedData)) {\n                var fiscalYearRange = _summary_report_store2.default.getState().get('fiscalYearRange');\n                var years = selectedData.get('years');\n                var dataSets = _lodash2.default.filter(this.athenaState.get('report').attributes.data_sets, function (ds) {\n                    return ds.year >= fiscalYearRange.get(0) && ds.year <= fiscalYearRange.get(1);\n                });\n                var yearData = _lodash2.default.map(dataSets, function (ds, i) {\n                    var year = parseInt(ds.year);\n                    var currentItem = years.find(function (yr) {\n                        return yr.get('year') === year;\n                    });\n                    var interpolate = currentItem.get('interpolate_display');\n                    var fillColor = interpolate ? 'white' : 'black';\n                    return {\n                        x: i,\n                        y: currentItem.get('value'),\n                        year: year,\n                        interpolate: interpolate,\n                        marker: {\n                            fillColor: fillColor,\n                            lineWidth: 2,\n                            lineColor: 'black'\n                        },\n                        seriesName: selectedData.get('metric_type'),\n                        series_id: selectedData.get('metric_type'),\n                        childless: true\n                    };\n                });\n                var yearDataPartitioned = [];\n                var segment = [];\n                var previous = yearData[0].interpolate;\n                _lodash2.default.forEach(yearData, function (year) {\n                    if (previous === year.interpolate) {\n                        segment.push(year);\n                    } else {\n                        yearDataPartitioned.push(segment);\n                        segment = [year];\n                    }\n                    previous = year.interpolate;\n                });\n                if (_lodash2.default.size(segment) > 0) {\n                    yearDataPartitioned.push(segment); //pushing the last segment\n                }\n                var constructOverlaySeries = function constructOverlaySeries(data, dashStyle) {\n                    return {\n                        data: data,\n                        type: 'line',\n                        dashStyle: dashStyle,\n                        name: 'overlay',\n                        color: 'black',\n                        stacking: '',\n                        yAxis: 1,\n                        overlay: true,\n                        id: selectedData.get('metric_type')\n                    };\n                };\n                var seriesPartitioned = [];\n                var seriesSegment = [];\n                _lodash2.default.forEach(yearDataPartitioned, function (partition) {\n                    if (_lodash2.default.isUndefined(_lodash2.default.head(partition).interpolate) && _lodash2.default.size(partition) >= 2) {\n                        seriesPartitioned.push(constructOverlaySeries(partition, 'none'));\n                        seriesSegment.push(_lodash2.default.head(partition));\n                        seriesPartitioned.push(constructOverlaySeries(seriesSegment, 'solid'));\n                        seriesSegment = [_lodash2.default.last(partition)];\n                    } else {\n                        _lodash2.default.forEach(partition, function (part) {\n                            seriesSegment.push(part);\n                        });\n                    }\n                });\n                if (_lodash2.default.size(seriesSegment) > 0) {\n                    seriesPartitioned.push(constructOverlaySeries(seriesSegment, 'solid'));\n                }\n                var axisExtremes = this.calculateAxisExtremes('line', seriesPartitioned, '');\n                var overlayAxis = {\n                    labels: {\n                        style: _extends({ color: axisTextColor }, fontStyle),\n                        formatter: this.yAxisLabelFormatter(this.options)\n                    },\n                    title: {\n                        text: selectedData.get('name') + ' (' + selectedData.get('units') + ')',\n                        style: _extends({ color: axisTextColor, fontWeight: 'bold' }, fontStyle),\n                        rotation: 270\n                    },\n                    opposite: true,\n                    gridLineWidth: 0,\n                    overlay: true,\n                    min: axisExtremes.min,\n                    max: axisExtremes.max\n                };\n                this.chart.addAxis(overlayAxis, false);\n                _lodash2.default.forEach(seriesPartitioned, function (series) {\n                    _this3.chart.addSeries(series, false); //not redrawing when adding the series until the end to save performance\n                });\n                this.chart.redraw((0, _chart_utils.getAnimationDuration)());\n            }\n        }\n    }, {\n        key: 'buildChart',\n        value: function buildChart(options) {\n            var graphType = options.graphType;\n            var type = options.type;\n            var stacking = options.stacking;\n            var chartOptions = void 0;\n            var graphPos = void 0;\n            var idx = void 0;\n            var hasZeroLine = void 0;\n            var axisExtremes = void 0;\n            chartOptions = this.chartOptions(options);\n            var selectedDataSetIndex = Number(this.athenaState.attributes.selectedDataSetIndex);\n            // chart.pos is clobbered by the slider/chart init process\n            // so we need a place holder\n            if (!_lodash2.default.isUndefined(this.startYear)) {\n                idx = _lodash2.default.indexOf(this.yearOrder, this.startYear);\n                graphPos = ~idx ? idx : this.yearOrder.length - 1;\n            } else if (selectedDataSetIndex < this.yearLabels.length && selectedDataSetIndex >= 0) {\n                // Important for navigation between charts of any kind to pie chart and\n                // Important for refreshes and for direct URLs to a specific pie chart\n                graphPos = selectedDataSetIndex;\n            } else {\n                graphPos = this.yearLabels.length - 1;\n            }\n            this.currentGraph = graphType;\n            chartOptions.series = this.constructNewSeries(type, stacking, graphPos);\n            hasZeroLine = false;\n            axisExtremes = this.calculateAxisExtremes(this.currentGraph, chartOptions.series, stacking);\n            chartOptions.yAxis.min = axisExtremes.min;\n            chartOptions.yAxis.max = axisExtremes.max;\n            if (axisExtremes.min < 0) {\n                chartOptions.yAxis.plotLines = [{\n                    value: 0,\n                    width: 2,\n                    color: axisColor,\n                    id: 'zero-plot-line'\n                }];\n                hasZeroLine = true;\n            }\n            if (this.chart) {\n                this.chart.destroy();\n            }\n            // @ts-ignore https://github.com/highcharts/highcharts/issues/12663\n            _highchartsOg2.default.seriesTypes.pie.prototype.drawEmpty = function () {};\n            this.chart = new _highchartsOg2.default.Chart(chartOptions, function () {\n                this.hasZeroLine = hasZeroLine;\n                this.plotLines = [];\n                this.pos = graphPos;\n                this.container.style.overflow = this.renderer.box.style.overflow = 'visible';\n            });\n            if (type === 'pie') {\n                this.getPieSeries(graphPos).animation = false;\n            }\n        }\n    }, {\n        key: 'chartOptions',\n        value: function chartOptions(options) {\n            var graphType = options.graphType;\n            var self = this;\n            var plotOptions = void 0;\n            plotOptions = {\n                area: {\n                    lineWidth: 1\n                },\n                column: {\n                    stacking: options.stacking,\n                    grouping: options.grouping,\n                    cursor: 'pointer',\n                    groupPadding: options.groupPadding,\n                    pointPadding: options.pointPadding\n                },\n                pie: {\n                    dataLabels: {\n                        formatter: function formatter() {\n                            var reportAmountType = _summary_report_store2.default.getReportAmountType();\n                            var str = reportAmountType.formatter((0, _formatValue.formatValue)(reportAmountType.symbol, this.y));\n                            var percentage = '(' + (this.y / this.total * 100).toFixed(1) + '%)';\n                            return '<strong>' + this.key + '</strong> <br/> <span>' + str + ' ' + percentage + '</span>';\n                        },\n\n                        overflow: 'none',\n                        useHTML: true,\n                        style: fontStyle\n                    },\n                    startAngle: 135\n                },\n                series: {\n                    marker: {\n                        symbol: 'circle'\n                    },\n                    states: {\n                        hover: {\n                            // NOTE: we removed halo effect because the highchart's native halo was overlapping\n                            // with our patterns.\n                            enabled: false\n                        },\n                        inactive: {\n                            opacity: 1\n                        }\n                    },\n                    point: {\n                        events: {\n                            click: function click() {\n                                if (!this.options.childless) {\n                                    _summary_report_actions2.default.drill(this.options.series_id);\n                                }\n                            },\n                            mouseOver: function mouseOver() {\n                                var series_id = this.options.series_id;\n\n                                var index = graphType === 'pie' ? self.chart.pos : this.x;\n                                self.handleTooltip('highlightNodeAmount', series_id, index);\n                                if (graphType !== 'pie') {\n                                    var selectedSeries = (0, _chart_utils.filterSelectedSeries)(self.chart.series, series_id);\n                                    (0, _chart_utils.brightenSeries)(selectedSeries, _chart_utils.HIGHLIGHT_OPACITY, 'hover');\n                                } else {\n                                    (0, _chart_utils.brightenSeries)(self.chart.series, _chart_utils.HIGHLIGHT_OPACITY, 'hover', series_id);\n                                }\n                                (0, _jquery2.default)('#legend_' + series_id).addClass('hover');\n                            },\n                            mouseOut: function mouseOut() {\n                                var series_id = this.options.series_id;\n\n                                self.handleTooltip();\n                                if (graphType !== 'pie') {\n                                    var selectedSeries = (0, _chart_utils.filterSelectedSeries)(self.chart.series, series_id);\n                                    (0, _chart_utils.brightenSeries)(selectedSeries, -_chart_utils.HIGHLIGHT_OPACITY);\n                                } else {\n                                    (0, _chart_utils.brightenSeries)(self.chart.series, -_chart_utils.HIGHLIGHT_OPACITY, null, series_id);\n                                }\n                                (0, _jquery2.default)('#legend_' + series_id).removeClass('hover');\n                            }\n                        }\n                    }\n                }\n            };\n            var patternColors = (0, _chart_utils.getPatternFillForColors)(this.colors(), 'projection');\n            patternColors = patternColors.concat((0, _chart_utils.getPatternFillForColors)(this.colors(), 'budget'));\n            return {\n                chart: {\n                    spacingLeft: 0,\n                    renderTo: this.container,\n                    borderRadius: 0,\n                    animation: (0, _chart_utils.getAnimationDuration)(),\n                    events: {\n                        redraw: function redraw() {\n                            self.addAnnotations();\n                        }\n                    }\n                },\n                style: fontStyle,\n                credits: {\n                    enabled: false\n                },\n                colors: _lodash2.default.map(this.colors(), function (i) {\n                    return i;\n                }),\n                defs: {\n                    // NOTE: this is where we initialize patterns\n                    patterns: patternColors\n                },\n                plotOptions: plotOptions,\n                title: {\n                    text: '',\n                    useHTML: true\n                },\n                legend: {\n                    enabled: false,\n                    useHTML: true\n                },\n                exporting: {\n                    enabled: false\n                },\n                xAxis: {\n                    title: {\n                        text: options.xText,\n                        useHTML: true,\n                        margin: options.xAxisMargin,\n                        style: _lodash2.default.extend({ color: axisTextColor, fontWeight: 'bold' }, fontStyle)\n                    },\n                    labels: {\n                        step: 1,\n                        useHTML: true,\n                        style: _lodash2.default.extend({\n                            width: '100%',\n                            color: axisTextColor,\n                            textAlign: 'center'\n                        }, fontStyle),\n                        formatter: function formatter() {\n                            if (graphType !== 'bar') {\n                                if (this.value == _lodash2.default.head(this.axis.categories)) {\n                                    return '<div style=\"text-align: left;float:left;margin-left:50px;\">' + this.value + '</div>';\n                                } else if (this.value == _lodash2.default.last(this.axis.categories)) {\n                                    return '<div style=\"text-align: right;float:right;margin-right:50px;\">' + this.value + '</div>';\n                                }\n                            }\n                            return this.value;\n                        }\n                    },\n                    tickmarkPlacement: 'on',\n                    categories: this.yearLabels,\n                    minPadding: options.minPadding,\n                    maxPadding: options.maxPadding,\n                    startOnTick: options.startOnTick,\n                    lineWidth: 2,\n                    lineColor: axisColor,\n                    tickWidth: 0\n                },\n                yAxis: [{\n                    title: {\n                        text: _strings2.default.yAxis({ units: options.yUnit, yAxisScale: options.yAxisScale }),\n                        useHTML: true,\n                        offset: options.yAxisScale ? null : 65,\n                        style: _lodash2.default.extend({ color: axisTextColor, fontWeight: 'bold' }, fontStyle)\n                    },\n                    labels: {\n                        style: _lodash2.default.extend({ color: axisTextColor }, fontStyle),\n                        useHTML: true,\n                        formatter: this.yAxisLabelFormatter(options)\n                    },\n                    maxPadding: 0,\n                    minPadding: 0,\n                    endOnTick: false,\n                    lineWidth: 0,\n                    gridLineWidth: 0,\n                    plotLines: []\n                }],\n                tooltip: {\n                    enabled: false,\n                    useHTML: true,\n                    snap: 0\n                },\n                series: []\n            };\n        }\n    }, {\n        key: 'yAxisLabelFormatter',\n        value: function yAxisLabelFormatter(options) {\n            return function () {\n                if (options.yAxisScale) {\n                    if (options.yAxisScale.type === 'monetary') {\n                        return _strings2.default.yAxisLabel(this.value, options.yAxisScale);\n                    }\n                }\n                return (0, _numeral2.default)(this.value).format('0.0a').toUpperCase();\n            };\n        }\n    }, {\n        key: 'sameTypeDifferentData',\n        value: function sameTypeDifferentData(options) {\n            var chart = this.chart;\n            var newSeries = void 0;\n            this.removeAllSeries();\n            chart.xAxis[0].setCategories(this.yearLabels);\n            chart.xAxis[0].setTitle(options.xText);\n            chart.xAxis[0].setTitle({\n                text: options.xText,\n                margin: options.xAxisMargin,\n                style: this.textStyle\n            }, false);\n            chart.yAxis[0].setTitle({\n                text: _strings2.default.yAxis({ units: options.yUnit, yAxisScale: options.yAxisScale })\n            });\n            chart.yAxis[0].update({\n                title: {\n                    offset: options.yAxisScale ? null : 65\n                },\n                labels: {\n                    formatter: this.yAxisLabelFormatter(options)\n                }\n            });\n            newSeries = this.constructNewSeries(options.type, options.stacking, chart.pos);\n            _lodash2.default.each(newSeries, function (s) {\n                chart.addSeries(s, false);\n            });\n            this.setAxisExtremes(_lodash2.default.head(chart.yAxis), chart.series, options.stacking);\n            // rebuild patterns\n            var patternColors = (0, _chart_utils.getPatternFillForColors)(this.colors(), 'projection');\n            patternColors = patternColors.concat((0, _chart_utils.getPatternFillForColors)(this.colors(), 'budget'));\n            var highChartRenderer = chart.renderer;\n            _lodash2.default.each(patternColors, function (pattern) {\n                return highChartRenderer.addPattern(pattern.id, pattern);\n            });\n            chart.redraw();\n            if (options.graphType === 'pie') {\n                this.getPieSeries(chart.pos).animation = false;\n            }\n        }\n    }, {\n        key: 'animateTransition',\n        value: function animateTransition(options) {\n            var chart = this.chart;\n            var data = this.data;\n            var totals = this.totals;\n            var graphType = options.graphType;\n            var type = options.type;\n            var stacking = options.stacking;\n            var yUnit = options.yUnit;\n            var yAxisScale = options.yAxisScale;\n            var self = this;\n            var values = {};\n            var dataLine = void 0;\n            var row = void 0;\n            var id = void 0;\n            var prev = void 0;\n            var offset = void 0;\n            var index = void 0;\n            var divisor = void 0;\n            var yAxis = void 0;\n            var callback = void 0;\n            if (this.lastGraph === 'line') {\n                id = _lodash2.default.head(data).id;\n                // calculate stacked offset of each point\n                row = _lodash2.default.map(_lodash2.default.head(data), function () {\n                    return 0;\n                });\n                prev = values[id] = row;\n                for (var _i3 = 1; _i3 < data.length; _i3++) {\n                    dataLine = data[_i3];\n                    id = dataLine.id;\n                    if (values[id]) {\n                        row = values[id];\n                    } else {\n                        row = [];\n                        values[id] = row;\n                    }\n                    for (var j = 0; j < dataLine.amounts.length; j++) {\n                        offset = data[_i3 - 1].amounts[j].value;\n                        if (offset) {\n                            row[j] = prev[j] + offset;\n                        }\n                    }\n                    prev = row;\n                }\n                // update each point to stacked total or percentage, for animation purposes\n                _lodash2.default.each(chart.series, function (s) {\n                    _lodash2.default.each(s.data, function (point) {\n                        id = point.options.series_id;\n                        row = values[id];\n                        index = point.x;\n                        if (graphType === 'percentage') {\n                            divisor = totals[index].absoluteAmount / 100;\n                        } else {\n                            divisor = 1;\n                        }\n                        if (totals && row) {\n                            point.update((totals[index].amount - row[index]) / divisor, false);\n                        }\n                    });\n                });\n            } else if (graphType === 'line' || graphType === 'stacked') {\n                _lodash2.default.each(chart.series, function (s) {\n                    if (graphType === 'line') {\n                        _lodash2.default.each(s.data, function (point) {\n                            point.update(point.stackY, false);\n                        });\n                    } else {\n                        _lodash2.default.each(s.data, function (point) {\n                            point.update(point.percentage, false);\n                        });\n                    }\n                    s.update({\n                        type: type,\n                        stacking: stacking\n                    }, false);\n                });\n                chart.redraw();\n                _lodash2.default.each(chart.series, function (s) {\n                    dataLine = _lodash2.default.find(data, function (d) {\n                        return d.id === s.options.id;\n                    });\n                    _lodash2.default.each(s.data, function (point) {\n                        if (dataLine) {\n                            point.update(dataLine.amounts[point.x].value, false);\n                        }\n                    });\n                });\n            } else {\n                _lodash2.default.each(chart.series, function (s) {\n                    _lodash2.default.each(s.data, function (point) {\n                        point.update(100 * (point.y / totals[point.x].absoluteAmount), false);\n                    });\n                });\n            }\n            this.currentGraph = graphType;\n            yAxis = _lodash2.default.head(chart.yAxis);\n            yAxis.setTitle({ text: _strings2.default.yAxis({ units: yUnit, yAxisScale: yAxisScale }) }, false);\n            this.setAxisExtremes(yAxis, chart.series, stacking);\n            chart.redraw();\n            if (this.lastGraph === 'line' || this.lastGraph === 'stacked') {\n                callback = function callback() {\n                    _lodash2.default.each(chart.series, function (s) {\n                        dataLine = _lodash2.default.find(data, function (d) {\n                            return d.id === s.options.id;\n                        });\n                        _lodash2.default.each(s.data, function (point) {\n                            if (dataLine) {\n                                point.update(dataLine.amounts[point.x].value, false);\n                            }\n                        });\n                        delete self.points;\n                        s.update({\n                            type: type,\n                            stacking: stacking\n                        }, false);\n                    });\n                    self.chart.redraw();\n                    if (type === 'area') {\n                        self.attachAreaEvents(chart.series);\n                    }\n                };\n                _lodash2.default.each(chart.series, function (s) {\n                    s.isDirty = true;\n                }); // ensure that redraw is actually fired\n                chart.redraw(_extends({}, (0, _chart_utils.getAnimationDuration)(), {\n                    complete: callback\n                }));\n            }\n        }\n    }, {\n        key: 'setAxisExtremes',\n        value: function setAxisExtremes(yAxis, series, stacking) {\n            var extremes = this.calculateAxisExtremes(this.currentGraph, series, stacking);\n            var min = extremes.min;\n            var max = extremes.max;\n            // we only want a plot line when the extreme is below zero for non-pie type charts\n            if (min < 0 && this.graphType !== 'pie') {\n                if (!this.chart.hasZeroLine) {\n                    yAxis.addPlotLine({\n                        value: 0,\n                        width: 2,\n                        color: axisColor,\n                        id: 'zero-plot-line'\n                    });\n                    this.chart.hasZeroLine = true;\n                }\n            } else {\n                if (this.chart.hasZeroLine) {\n                    yAxis.removePlotLine('zero-plot-line');\n                    this.chart.hasZeroLine = false;\n                }\n            }\n            yAxis.setExtremes(min, max, false);\n        }\n    }, {\n        key: 'calculateAxisExtremes',\n        value: function calculateAxisExtremes(currentGraph, series, stacking) {\n            var totals = this.totals; //array of total data associated with each x-axis item\n            var minVal = 0;\n            var maxVal = 0;\n            var data = [];\n            if (currentGraph !== 'stacked' && stacking !== 'normal') {\n                var updateMinMax = function updateMinMax(d) {\n                    if (d.y < minVal) {\n                        minVal = d.y;\n                    }\n                    if (d.y > maxVal) {\n                        maxVal = d.y;\n                    }\n                };\n                var updateBySeries = function updateBySeries(s) {\n                    data = [];\n                    if (s.data.length > 0) {\n                        data = s.data;\n                    } else if (s.options.data.length > 0) {\n                        data = s.options.data;\n                    }\n                    _lodash2.default.each(data, updateMinMax);\n                };\n                if (stacking === 'normal') {\n                    maxVal = _lodash2.default.maxBy(totals, 'amount').amount;\n                }\n                _lodash2.default.each(series, updateBySeries);\n            }\n            if (currentGraph === 'stacked' || stacking === 'normal') {\n                //Stacked graphs -> need to find max / mins of columns (rather than individual series)\n                maxVal = _lodash2.default.maxBy(totals, 'pos_only').pos_only;\n                minVal = _lodash2.default.minBy(totals, 'neg_only').neg_only;\n            }\n            if (stacking === 'percent') {\n                minVal = minVal < 0 ? -100 : 0;\n                maxVal = 100;\n            }\n            return {\n                min: minVal,\n                max: maxVal + 0.5 // if we don't increase the max slightly, point markers get cut off\n            };\n        }\n    }, {\n        key: 'addPlotLines',\n        value: function addPlotLines() {\n            var colors = this.colors();\n            var chart = this.chart;\n            var yAxis = _lodash2.default.head(chart.yAxis);\n            var series = chart.series;\n            var self = this;\n            var point = void 0;\n            var id = void 0;\n            _lodash2.default.each(series, function (s) {\n                point = _lodash2.default.head(s.data);\n                id = s.options.id;\n                yAxis.addPlotLine({\n                    value: point.y,\n                    color: colors[id],\n                    width: 2,\n                    id: id,\n                    childless: point.options.childless,\n                    events: {\n                        click: function click() {\n                            if (!this.options.childless) {\n                                _summary_report_actions2.default.drill(this.id);\n                            }\n                        },\n                        mouseover: function mouseover() {\n                            self.highlightSeries(this.id);\n                            (0, _jquery2.default)('#legend_' + this.id).addClass('hover');\n                        },\n                        mouseout: function mouseout() {\n                            self.unhighlightSeries(this.id);\n                            (0, _jquery2.default)('#legend_' + this.id).removeClass('hover');\n                        }\n                    }\n                });\n                chart.plotLines.push(id);\n            });\n        }\n    }, {\n        key: 'size',\n        value: function size(width, height) {\n            if (this.chart) {\n                this.chart.setSize(width, height); //, false);\n            }\n        }\n        // Highcharts does not support events on filled areas\n\n    }, {\n        key: 'attachAreaEvents',\n        value: function attachAreaEvents(series) {\n            var _this4 = this;\n\n            _lodash2.default.each(series, function (s) {\n                if (!_lodash2.default.isUndefined(s.area)) {\n                    s.area.element.onclick = function () {\n                        var point = _lodash2.default.head(s.points);\n                        if (!point.options.childless) {\n                            _summary_report_actions2.default.drill(s.options.id);\n                        }\n                    };\n                    s.area.element.onmouseover = function () {\n                        var id = s.options.id;\n                        var selectedSeries = (0, _chart_utils.filterSelectedSeries)(_this4.chart.series, id);\n                        if (!(_this4.chart.hoverPoint && _this4.chart.hoverPoint.options.series_id === id)) {\n                            _this4.chart.pointer.reset(false);\n                            (0, _chart_utils.brightenSeries)(selectedSeries, _chart_utils.HIGHLIGHT_OPACITY, 'hover');\n                            _this4.handleTooltip('highlightNode', id);\n                        } else {\n                            _this4.handleTooltip();\n                        }\n                        (0, _jquery2.default)('#legend_' + id).addClass('hover');\n                    };\n                    s.area.element.onmouseout = function () {\n                        var id = s.options.id;\n                        var selectedSeries = (0, _chart_utils.filterSelectedSeries)(_this4.chart.series, id);\n                        if (!(_this4.chart.hoverPoint && _this4.chart.hoverPoint.options.series_id === id)) {\n                            (0, _chart_utils.brightenSeries)(selectedSeries, -_chart_utils.HIGHLIGHT_OPACITY);\n                        }\n                        _this4.handleTooltip();\n                        (0, _jquery2.default)('#legend_' + id).removeClass('hover');\n                    };\n                }\n            });\n        }\n    }, {\n        key: 'colors',\n        value: function colors() {\n            var lines = _summary_report_store2.default.getRenderedData(true).lines;\n            var map = {};\n            // from pythia.Color\n            _lodash2.default.each(lines, function (line) {\n                var hex = line.color.toString(16);\n                for (var _i4 = hex.length; _i4 < 6; _i4++) {\n                    hex = '0' + hex;\n                }\n                map[line.id] = '#' + hex;\n            });\n            return map;\n        }\n    }, {\n        key: 'highlightSeries',\n        value: function highlightSeries(series_id) {\n            this.highlightedSeries = series_id;\n            if (this.currentGraph === 'pie') {\n                var slice = this.getSeriesSlice(series_id);\n                if (slice) {\n                    slice.setState('hover');\n                }\n            } else {\n                var selectedSeries = (0, _chart_utils.filterSelectedSeries)(this.chart.series, series_id);\n                (0, _chart_utils.brightenSeries)(selectedSeries, _chart_utils.HIGHLIGHT_OPACITY, 'hover');\n                (0, _chart_utils.setPointStateForSeries)(selectedSeries, 'hover');\n            }\n        }\n    }, {\n        key: 'getSeriesSlice',\n        value: function getSeriesSlice(seriesId) {\n            if (_lodash2.default.isEmpty(this.chart.series)) {\n                return;\n            }\n            return _lodash2.default.find(_lodash2.default.head(this.chart.series).data, function (d) {\n                return d.options.series_id === seriesId;\n            });\n        }\n    }, {\n        key: 'unhighlightSeries',\n        value: function unhighlightSeries(series_id) {\n            if (this.currentGraph === 'pie') {\n                var slice = this.getSeriesSlice(series_id);\n                if (slice) {\n                    slice.setState();\n                }\n            } else {\n                var selectedSeries = (0, _chart_utils.filterSelectedSeries)(this.chart.series, series_id);\n                (0, _chart_utils.brightenSeries)(selectedSeries, -_chart_utils.HIGHLIGHT_OPACITY);\n                (0, _chart_utils.setPointStateForSeries)(selectedSeries);\n            }\n            this.highlightedSeries = null;\n        }\n    }, {\n        key: 'addAnnotations',\n        value: function addAnnotations() {\n            this.removeAnnotations();\n            if (!_summary_report_store2.default.getState().get('isAnnotationsPanelOpen')) {\n                return;\n            }\n            _lodash2.default.each(this.chart.series, _lodash2.default.bind(this.annotateSeries, this));\n        }\n    }, {\n        key: 'annotateSeries',\n        value: function annotateSeries(series) {\n            _lodash2.default.each(series.data, _lodash2.default.bind(this.annotatePoint, this));\n        }\n    }, {\n        key: 'annotatePoint',\n        value: function annotatePoint(point) {\n            if (!point.annotation) {\n                return;\n            }\n            if (!this.points) {\n                var series = this.chart.series;\n                var pointsArray = [];\n                _lodash2.default.each(series, function (s) {\n                    _lodash2.default.each(s.data, function (point) {\n                        pointsArray[point.id] = point;\n                    });\n                });\n                this.points = pointsArray;\n            }\n            var point_id = point.id;\n            var htmlAnnotation = (0, _jquery2.default)('<div class=\"graph__annotation\"><div class=\"graph__annotation__pulse\"></div></div>');\n            htmlAnnotation.css({ position: 'absolute' });\n            (0, _jquery2.default)('#graph').append(htmlAnnotation);\n            var width = htmlAnnotation.width();\n            var height = htmlAnnotation.height();\n            if (!_lodash2.default.isUndefined(point.plotX)) {\n                htmlAnnotation.css({\n                    position: 'absolute',\n                    left: this.chart.plotLeft + point.plotX - width / 2,\n                    top: this.chart.plotTop + point.plotY - height\n                });\n            } else {\n                htmlAnnotation.css({\n                    position: 'absolute',\n                    left: this.chart.plotLeft + point.dataLabel.translateX + point.dataLabel.width + width / 2,\n                    top: this.chart.plotTop + point.dataLabel.translateY + height\n                });\n            }\n            _lodash2.default.each(point.annotation, function (annotation) {\n                htmlAnnotation.addClass('annotation-' + annotation.id);\n            });\n            var self = this;\n            htmlAnnotation.on('mouseover', function () {\n                _lodash2.default.each(point.annotation, function (annotation) {\n                    (0, _jquery2.default)('.annotation').addClass('hide');\n                    (0, _jquery2.default)('.annotation-' + annotation.id).addClass('hover');\n                });\n            });\n            htmlAnnotation.on('mouseout', function () {\n                _lodash2.default.each(point.annotation, function (annotation) {\n                    (0, _jquery2.default)('.annotation').removeClass('hide');\n                    (0, _jquery2.default)('.annotation-' + annotation.id).removeClass('hover');\n                });\n            });\n            htmlAnnotation.on('click', function () {\n                self.reportEvents.trigger('scrollToAnnotationNode', point.annotation[0].primaryNode.id);\n            });\n            var oldAnnotation = this.annotations[point_id];\n            if (oldAnnotation) {\n                oldAnnotation.remove();\n            }\n            this.annotations[point_id] = htmlAnnotation;\n        }\n    }, {\n        key: 'removeAnnotations',\n        value: function removeAnnotations() {\n            _lodash2.default.each(this.annotations, _lodash2.default.bind(function (annotation, id) {\n                annotation.remove();\n                delete this.annotations[id];\n            }, this));\n        }\n    }, {\n        key: 'removeAnnotation',\n        value: function removeAnnotation(point_id) {\n            if (this.annotations[point_id]) {\n                this.annotations[point_id].remove();\n                delete this.annotations[point_id];\n            }\n        }\n    }, {\n        key: 'dataTypes',\n        value: function dataTypes() {\n            return this.data && this.data[0] && this.data[0].types;\n        }\n    }, {\n        key: 'getPieSeries',\n        value: function getPieSeries(index) {\n            index = Math.min(this.pieSeries.length - 1, index); //removes indexes that do not exist anymore\n            return _lodash2.default.find(this.pieSeries, function (item, i) {\n                if (i === index) {\n                    return item;\n                }\n            });\n        }\n    }]);\n\n    return Graph;\n}();\n\nexports.default = Graph;\nvar isValidGraphType = exports.isValidGraphType = function isValidGraphType(graphType) {\n    return _lodash2.default.includes(validGraphTypes, graphType);\n};\nvar axisColor = '#737373';\nvar axisTextColor = '#737373';\nvar validGraphTypes = exports.validGraphTypes = ['percentage', 'stacked', 'line', 'pie', 'bar'];\n\n/***/ }),\n/* 668 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Path = __webpack_require__(224);\n\nvar _textDecoration = __webpack_require__(319);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar addColorStops = function addColorStops(gradient, canvasGradient) {\n    var maxStop = Math.max.apply(null, gradient.colorStops.map(function (colorStop) {\n        return colorStop.stop;\n    }));\n    var f = 1 / Math.max(1, maxStop);\n    gradient.colorStops.forEach(function (colorStop) {\n        canvasGradient.addColorStop(f * colorStop.stop, colorStop.color.toString());\n    });\n};\n\nvar CanvasRenderer = function () {\n    function CanvasRenderer(canvas) {\n        _classCallCheck(this, CanvasRenderer);\n\n        this.canvas = canvas ? canvas : document.createElement('canvas');\n    }\n\n    _createClass(CanvasRenderer, [{\n        key: 'render',\n        value: function render(options) {\n            this.ctx = this.canvas.getContext('2d');\n            this.options = options;\n            this.canvas.width = Math.floor(options.width * options.scale);\n            this.canvas.height = Math.floor(options.height * options.scale);\n            this.canvas.style.width = options.width + 'px';\n            this.canvas.style.height = options.height + 'px';\n\n            this.ctx.scale(this.options.scale, this.options.scale);\n            this.ctx.translate(-options.x, -options.y);\n            this.ctx.textBaseline = 'bottom';\n            options.logger.log('Canvas renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + this.options.scale);\n        }\n    }, {\n        key: 'clip',\n        value: function clip(clipPaths, callback) {\n            var _this = this;\n\n            if (clipPaths.length) {\n                this.ctx.save();\n                clipPaths.forEach(function (path) {\n                    _this.path(path);\n                    _this.ctx.clip();\n                });\n            }\n\n            callback();\n\n            if (clipPaths.length) {\n                this.ctx.restore();\n            }\n        }\n    }, {\n        key: 'drawImage',\n        value: function drawImage(image, source, destination) {\n            this.ctx.drawImage(image, source.left, source.top, source.width, source.height, destination.left, destination.top, destination.width, destination.height);\n        }\n    }, {\n        key: 'drawShape',\n        value: function drawShape(path, color) {\n            this.path(path);\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fill();\n        }\n    }, {\n        key: 'fill',\n        value: function fill(color) {\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fill();\n        }\n    }, {\n        key: 'getTarget',\n        value: function getTarget() {\n            return Promise.resolve(this.canvas);\n        }\n    }, {\n        key: 'path',\n        value: function path(_path) {\n            var _this2 = this;\n\n            this.ctx.beginPath();\n            if (Array.isArray(_path)) {\n                _path.forEach(function (point, index) {\n                    var start = point.type === _Path.PATH.VECTOR ? point : point.start;\n                    if (index === 0) {\n                        _this2.ctx.moveTo(start.x, start.y);\n                    } else {\n                        _this2.ctx.lineTo(start.x, start.y);\n                    }\n\n                    if (point.type === _Path.PATH.BEZIER_CURVE) {\n                        _this2.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);\n                    }\n                });\n            } else {\n                this.ctx.arc(_path.x + _path.radius, _path.y + _path.radius, _path.radius, 0, Math.PI * 2, true);\n            }\n\n            this.ctx.closePath();\n        }\n    }, {\n        key: 'rectangle',\n        value: function rectangle(x, y, width, height, color) {\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fillRect(x, y, width, height);\n        }\n    }, {\n        key: 'renderLinearGradient',\n        value: function renderLinearGradient(bounds, gradient) {\n            var linearGradient = this.ctx.createLinearGradient(bounds.left + gradient.direction.x1, bounds.top + gradient.direction.y1, bounds.left + gradient.direction.x0, bounds.top + gradient.direction.y0);\n\n            addColorStops(gradient, linearGradient);\n            this.ctx.fillStyle = linearGradient;\n            this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height);\n        }\n    }, {\n        key: 'renderRadialGradient',\n        value: function renderRadialGradient(bounds, gradient) {\n            var _this3 = this;\n\n            var x = bounds.left + gradient.center.x;\n            var y = bounds.top + gradient.center.y;\n\n            var radialGradient = this.ctx.createRadialGradient(x, y, 0, x, y, gradient.radius.x);\n            if (!radialGradient) {\n                return;\n            }\n\n            addColorStops(gradient, radialGradient);\n            this.ctx.fillStyle = radialGradient;\n\n            if (gradient.radius.x !== gradient.radius.y) {\n                // transforms for elliptical radial gradient\n                var midX = bounds.left + 0.5 * bounds.width;\n                var midY = bounds.top + 0.5 * bounds.height;\n                var f = gradient.radius.y / gradient.radius.x;\n                var invF = 1 / f;\n\n                this.transform(midX, midY, [1, 0, 0, f, 0, 0], function () {\n                    return _this3.ctx.fillRect(bounds.left, invF * (bounds.top - midY) + midY, bounds.width, bounds.height * invF);\n                });\n            } else {\n                this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height);\n            }\n        }\n    }, {\n        key: 'renderRepeat',\n        value: function renderRepeat(path, image, imageSize, offsetX, offsetY) {\n            this.path(path);\n            this.ctx.fillStyle = this.ctx.createPattern(this.resizeImage(image, imageSize), 'repeat');\n            this.ctx.translate(offsetX, offsetY);\n            this.ctx.fill();\n            this.ctx.translate(-offsetX, -offsetY);\n        }\n    }, {\n        key: 'renderTextNode',\n        value: function renderTextNode(textBounds, color, font, textDecoration, textShadows) {\n            var _this4 = this;\n\n            this.ctx.font = [font.fontStyle, font.fontVariant, font.fontWeight, font.fontSize, font.fontFamily].join(' ');\n\n            textBounds.forEach(function (text) {\n                _this4.ctx.fillStyle = color.toString();\n                if (textShadows && text.text.trim().length) {\n                    textShadows.slice(0).reverse().forEach(function (textShadow) {\n                        _this4.ctx.shadowColor = textShadow.color.toString();\n                        _this4.ctx.shadowOffsetX = textShadow.offsetX * _this4.options.scale;\n                        _this4.ctx.shadowOffsetY = textShadow.offsetY * _this4.options.scale;\n                        _this4.ctx.shadowBlur = textShadow.blur;\n\n                        _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\n                    });\n                } else {\n                    _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\n                }\n\n                if (textDecoration !== null) {\n                    var textDecorationColor = textDecoration.textDecorationColor || color;\n                    textDecoration.textDecorationLine.forEach(function (textDecorationLine) {\n                        switch (textDecorationLine) {\n                            case _textDecoration.TEXT_DECORATION_LINE.UNDERLINE:\n                                // Draws a line at the baseline of the font\n                                // TODO As some browsers display the line as more than 1px if the font-size is big,\n                                // need to take that into account both in position and size\n                                var _options$fontMetrics$ = _this4.options.fontMetrics.getMetrics(font),\n                                    baseline = _options$fontMetrics$.baseline;\n\n                                _this4.rectangle(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1, textDecorationColor);\n                                break;\n                            case _textDecoration.TEXT_DECORATION_LINE.OVERLINE:\n                                _this4.rectangle(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1, textDecorationColor);\n                                break;\n                            case _textDecoration.TEXT_DECORATION_LINE.LINE_THROUGH:\n                                // TODO try and find exact position for line-through\n                                var _options$fontMetrics$2 = _this4.options.fontMetrics.getMetrics(font),\n                                    middle = _options$fontMetrics$2.middle;\n\n                                _this4.rectangle(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1, textDecorationColor);\n                                break;\n                        }\n                    });\n                }\n            });\n        }\n    }, {\n        key: 'resizeImage',\n        value: function resizeImage(image, size) {\n            if (image.width === size.width && image.height === size.height) {\n                return image;\n            }\n\n            var canvas = this.canvas.ownerDocument.createElement('canvas');\n            canvas.width = size.width;\n            canvas.height = size.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height);\n            return canvas;\n        }\n    }, {\n        key: 'setOpacity',\n        value: function setOpacity(opacity) {\n            this.ctx.globalAlpha = opacity;\n        }\n    }, {\n        key: 'transform',\n        value: function transform(offsetX, offsetY, matrix, callback) {\n            this.ctx.save();\n            this.ctx.translate(offsetX, offsetY);\n            this.ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n            this.ctx.translate(-offsetX, -offsetY);\n\n            callback();\n\n            this.ctx.restore();\n        }\n    }]);\n\n    return CanvasRenderer;\n}();\n\nexports.default = CanvasRenderer;\n\n/***/ }),\n/* 669 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Logger = function () {\n    function Logger(enabled, id, start) {\n        _classCallCheck(this, Logger);\n\n        this.enabled = enabled;\n        this.start = start ? start : Date.now();\n        this.id = id;\n    }\n\n    _createClass(Logger, [{\n        key: 'child',\n        value: function child(id) {\n            return new Logger(this.enabled, id, this.start);\n        }\n\n        // eslint-disable-next-line flowtype/no-weak-types\n\n    }, {\n        key: 'log',\n        value: function log() {\n            if (this.enabled && window.console && window.console.log) {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                    args[_key] = arguments[_key];\n                }\n\n                Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0)));\n            }\n        }\n\n        // eslint-disable-next-line flowtype/no-weak-types\n\n    }, {\n        key: 'error',\n        value: function error() {\n            if (this.enabled && window.console && window.console.error) {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                Function.prototype.bind.call(window.console.error, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0)));\n            }\n        }\n    }]);\n\n    return Logger;\n}();\n\nexports.default = Logger;\n\n/***/ }),\n/* 670 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parsePadding = exports.PADDING_SIDES = undefined;\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PADDING_SIDES = exports.PADDING_SIDES = {\n    TOP: 0,\n    RIGHT: 1,\n    BOTTOM: 2,\n    LEFT: 3\n};\n\nvar SIDES = ['top', 'right', 'bottom', 'left'];\n\nvar parsePadding = exports.parsePadding = function parsePadding(style) {\n    return SIDES.map(function (side) {\n        return new _Length2.default(style.getPropertyValue('padding-' + side));\n    });\n};\n\n/***/ }),\n/* 671 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar POSITION = exports.POSITION = {\n    STATIC: 0,\n    RELATIVE: 1,\n    ABSOLUTE: 2,\n    FIXED: 3,\n    STICKY: 4\n};\n\nvar parsePosition = exports.parsePosition = function parsePosition(position) {\n    switch (position) {\n        case 'relative':\n            return POSITION.RELATIVE;\n        case 'absolute':\n            return POSITION.ABSOLUTE;\n        case 'fixed':\n            return POSITION.FIXED;\n        case 'sticky':\n            return POSITION.STICKY;\n    }\n\n    return POSITION.STATIC;\n};\n\n/***/ }),\n/* 672 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar TEXT_TRANSFORM = exports.TEXT_TRANSFORM = {\n    NONE: 0,\n    LOWERCASE: 1,\n    UPPERCASE: 2,\n    CAPITALIZE: 3\n};\n\nvar parseTextTransform = exports.parseTextTransform = function parseTextTransform(textTransform) {\n    switch (textTransform) {\n        case 'uppercase':\n            return TEXT_TRANSFORM.UPPERCASE;\n        case 'lowercase':\n            return TEXT_TRANSFORM.LOWERCASE;\n        case 'capitalize':\n            return TEXT_TRANSFORM.CAPITALIZE;\n    }\n\n    return TEXT_TRANSFORM.NONE;\n};\n\n/***/ }),\n/* 673 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.reformatInputBounds = exports.inlineSelectElement = exports.inlineTextAreaElement = exports.inlineInputElement = exports.getInputBorderRadius = exports.INPUT_BACKGROUND = exports.INPUT_BORDERS = exports.INPUT_COLOR = undefined;\n\nvar _TextContainer = __webpack_require__(321);\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _background = __webpack_require__(226);\n\nvar _border = __webpack_require__(320);\n\nvar _Circle = __webpack_require__(1536);\n\nvar _Circle2 = _interopRequireDefault(_Circle);\n\nvar _Vector = __webpack_require__(227);\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Bounds = __webpack_require__(93);\n\nvar _TextBounds = __webpack_require__(674);\n\nvar _Util = __webpack_require__(168);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar INPUT_COLOR = exports.INPUT_COLOR = new _Color2.default([42, 42, 42]);\nvar INPUT_BORDER_COLOR = new _Color2.default([165, 165, 165]);\nvar INPUT_BACKGROUND_COLOR = new _Color2.default([222, 222, 222]);\nvar INPUT_BORDER = {\n    borderWidth: 1,\n    borderColor: INPUT_BORDER_COLOR,\n    borderStyle: _border.BORDER_STYLE.SOLID\n};\nvar INPUT_BORDERS = exports.INPUT_BORDERS = [INPUT_BORDER, INPUT_BORDER, INPUT_BORDER, INPUT_BORDER];\nvar INPUT_BACKGROUND = exports.INPUT_BACKGROUND = {\n    backgroundColor: INPUT_BACKGROUND_COLOR,\n    backgroundImage: [],\n    backgroundClip: _background.BACKGROUND_CLIP.PADDING_BOX,\n    backgroundOrigin: _background.BACKGROUND_ORIGIN.PADDING_BOX\n};\n\nvar RADIO_BORDER_RADIUS = new _Length2.default('50%');\nvar RADIO_BORDER_RADIUS_TUPLE = [RADIO_BORDER_RADIUS, RADIO_BORDER_RADIUS];\nvar INPUT_RADIO_BORDER_RADIUS = [RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE];\n\nvar CHECKBOX_BORDER_RADIUS = new _Length2.default('3px');\nvar CHECKBOX_BORDER_RADIUS_TUPLE = [CHECKBOX_BORDER_RADIUS, CHECKBOX_BORDER_RADIUS];\nvar INPUT_CHECKBOX_BORDER_RADIUS = [CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE];\n\nvar getInputBorderRadius = exports.getInputBorderRadius = function getInputBorderRadius(node) {\n    return node.type === 'radio' ? INPUT_RADIO_BORDER_RADIUS : INPUT_CHECKBOX_BORDER_RADIUS;\n};\n\nvar inlineInputElement = exports.inlineInputElement = function inlineInputElement(node, container) {\n    if (node.type === 'radio' || node.type === 'checkbox') {\n        if (node.checked) {\n            var size = Math.min(container.bounds.width, container.bounds.height);\n            container.childNodes.push(node.type === 'checkbox' ? [new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79), new _Vector2.default(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549), new _Vector2.default(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071), new _Vector2.default(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649), new _Vector2.default(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23), new _Vector2.default(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085), new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)] : new _Circle2.default(container.bounds.left + size / 4, container.bounds.top + size / 4, size / 4));\n        }\n    } else {\n        inlineFormElement(getInputValue(node), node, container, false);\n    }\n};\n\nvar inlineTextAreaElement = exports.inlineTextAreaElement = function inlineTextAreaElement(node, container) {\n    inlineFormElement(node.value, node, container, true);\n};\n\nvar inlineSelectElement = exports.inlineSelectElement = function inlineSelectElement(node, container) {\n    var option = node.options[node.selectedIndex || 0];\n    inlineFormElement(option ? option.text || '' : '', node, container, false);\n};\n\nvar reformatInputBounds = exports.reformatInputBounds = function reformatInputBounds(bounds) {\n    if (bounds.width > bounds.height) {\n        bounds.left += (bounds.width - bounds.height) / 2;\n        bounds.width = bounds.height;\n    } else if (bounds.width < bounds.height) {\n        bounds.top += (bounds.height - bounds.width) / 2;\n        bounds.height = bounds.width;\n    }\n    return bounds;\n};\n\nvar inlineFormElement = function inlineFormElement(value, node, container, allowLinebreak) {\n    var body = node.ownerDocument.body;\n    if (value.length > 0 && body) {\n        var wrapper = node.ownerDocument.createElement('html2canvaswrapper');\n        (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node, null), wrapper);\n        wrapper.style.position = 'fixed';\n        wrapper.style.left = container.bounds.left + 'px';\n        wrapper.style.top = container.bounds.top + 'px';\n        if (!allowLinebreak) {\n            wrapper.style.whiteSpace = 'nowrap';\n        }\n        var text = node.ownerDocument.createTextNode(value);\n        wrapper.appendChild(text);\n        body.appendChild(wrapper);\n        container.childNodes.push(_TextContainer2.default.fromTextNode(text, container));\n        body.removeChild(wrapper);\n    }\n};\n\nvar getInputValue = function getInputValue(node) {\n    var value = node.type === 'password' ? new Array(node.value.length + 1).join('\\u2022') : node.value;\n\n    return value.length === 0 ? node.placeholder || '' : value;\n};\n\n/***/ }),\n/* 674 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextBounds = exports.TextBounds = undefined;\n\nvar _punycode = __webpack_require__(640);\n\nvar _Bounds = __webpack_require__(93);\n\nvar _textDecoration = __webpack_require__(319);\n\nvar _Feature = __webpack_require__(228);\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar UNICODE = /[^\\u0000-\\u00ff]/;\n\nvar hasUnicodeCharacters = function hasUnicodeCharacters(text) {\n    return UNICODE.test(text);\n};\n\nvar encodeCodePoint = function encodeCodePoint(codePoint) {\n    return _punycode.ucs2.encode([codePoint]);\n};\n\nvar TextBounds = exports.TextBounds = function TextBounds(text, bounds) {\n    _classCallCheck(this, TextBounds);\n\n    this.text = text;\n    this.bounds = bounds;\n};\n\nvar parseTextBounds = exports.parseTextBounds = function parseTextBounds(value, parent, node) {\n    var codePoints = _punycode.ucs2.decode(value);\n    var letterRendering = parent.style.letterSpacing !== 0 || hasUnicodeCharacters(value);\n    var textList = letterRendering ? codePoints.map(encodeCodePoint) : splitWords(codePoints);\n    var length = textList.length;\n    var defaultView = node.parentNode ? node.parentNode.ownerDocument.defaultView : null;\n    var scrollX = defaultView ? defaultView.pageXOffset : 0;\n    var scrollY = defaultView ? defaultView.pageYOffset : 0;\n    var textBounds = [];\n    var offset = 0;\n    for (var i = 0; i < length; i++) {\n        var text = textList[i];\n        if (parent.style.textDecoration !== _textDecoration.TEXT_DECORATION.NONE || text.trim().length > 0) {\n            if (_Feature2.default.SUPPORT_RANGE_BOUNDS) {\n                textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length, scrollX, scrollY)));\n            } else {\n                var replacementNode = node.splitText(text.length);\n                textBounds.push(new TextBounds(text, getWrapperBounds(node, scrollX, scrollY)));\n                node = replacementNode;\n            }\n        } else if (!_Feature2.default.SUPPORT_RANGE_BOUNDS) {\n            node = node.splitText(text.length);\n        }\n        offset += text.length;\n    }\n    return textBounds;\n};\n\nvar getWrapperBounds = function getWrapperBounds(node, scrollX, scrollY) {\n    var wrapper = node.ownerDocument.createElement('html2canvaswrapper');\n    wrapper.appendChild(node.cloneNode(true));\n    var parentNode = node.parentNode;\n    if (parentNode) {\n        parentNode.replaceChild(wrapper, node);\n        var bounds = (0, _Bounds.parseBounds)(wrapper, scrollX, scrollY);\n        if (wrapper.firstChild) {\n            parentNode.replaceChild(wrapper.firstChild, wrapper);\n        }\n        return bounds;\n    }\n    return new _Bounds.Bounds(0, 0, 0, 0);\n};\n\nvar getRangeBounds = function getRangeBounds(node, offset, length, scrollX, scrollY) {\n    var range = node.ownerDocument.createRange();\n    range.setStart(node, offset);\n    range.setEnd(node, offset + length);\n    return _Bounds.Bounds.fromClientRect(range.getBoundingClientRect(), scrollX, scrollY);\n};\n\nvar splitWords = function splitWords(codePoints) {\n    var words = [];\n    var i = 0;\n    var onWordBoundary = false;\n    var word = void 0;\n    while (codePoints.length) {\n        if (isWordBoundary(codePoints[i]) === onWordBoundary) {\n            word = codePoints.splice(0, i);\n            if (word.length) {\n                words.push(_punycode.ucs2.encode(word));\n            }\n            onWordBoundary = !onWordBoundary;\n            i = 0;\n        } else {\n            i++;\n        }\n\n        if (i >= codePoints.length) {\n            word = codePoints.splice(0, i);\n            if (word.length) {\n                words.push(_punycode.ucs2.encode(word));\n            }\n        }\n    }\n    return words;\n};\n\nvar isWordBoundary = function isWordBoundary(characterCode) {\n    return [32, // <space>\n    13, // \\r\n    10, // \\n\n    9, // \\t\n    45 // -\n    ].indexOf(characterCode) !== -1;\n};\n\n/***/ }),\n/* 675 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ForeignObjectRenderer = function () {\n    function ForeignObjectRenderer(element) {\n        _classCallCheck(this, ForeignObjectRenderer);\n\n        this.element = element;\n    }\n\n    _createClass(ForeignObjectRenderer, [{\n        key: 'render',\n        value: function render(options) {\n            var _this = this;\n\n            this.options = options;\n            this.canvas = document.createElement('canvas');\n            this.ctx = this.canvas.getContext('2d');\n            this.canvas.width = Math.floor(options.width) * options.scale;\n            this.canvas.height = Math.floor(options.height) * options.scale;\n            this.canvas.style.width = options.width + 'px';\n            this.canvas.style.height = options.height + 'px';\n\n            options.logger.log('ForeignObject renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + options.scale);\n            var svg = createForeignObjectSVG(Math.max(options.windowWidth, options.width) * options.scale, Math.max(options.windowHeight, options.height) * options.scale, options.scrollX * options.scale, options.scrollY * options.scale, this.element);\n\n            return loadSerializedSVG(svg).then(function (img) {\n                if (options.backgroundColor) {\n                    _this.ctx.fillStyle = options.backgroundColor.toString();\n                    _this.ctx.fillRect(0, 0, options.width * options.scale, options.height * options.scale);\n                }\n\n                _this.ctx.drawImage(img, -options.x * options.scale, -options.y * options.scale);\n                return _this.canvas;\n            });\n        }\n    }]);\n\n    return ForeignObjectRenderer;\n}();\n\nexports.default = ForeignObjectRenderer;\nvar createForeignObjectSVG = exports.createForeignObjectSVG = function createForeignObjectSVG(width, height, x, y, node) {\n    var xmlns = 'http://www.w3.org/2000/svg';\n    var svg = document.createElementNS(xmlns, 'svg');\n    var foreignObject = document.createElementNS(xmlns, 'foreignObject');\n    svg.setAttributeNS(null, 'width', width);\n    svg.setAttributeNS(null, 'height', height);\n\n    foreignObject.setAttributeNS(null, 'width', '100%');\n    foreignObject.setAttributeNS(null, 'height', '100%');\n    foreignObject.setAttributeNS(null, 'x', x);\n    foreignObject.setAttributeNS(null, 'y', y);\n    foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');\n    svg.appendChild(foreignObject);\n\n    foreignObject.appendChild(node);\n\n    return svg;\n};\n\nvar loadSerializedSVG = exports.loadSerializedSVG = function loadSerializedSVG(svg) {\n    return new Promise(function (resolve, reject) {\n        var img = new Image();\n        img.onload = function () {\n            return resolve(img);\n        };\n        img.onerror = reject;\n\n        img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\n    });\n};\n\n/***/ }),\n/* 676 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.FontMetrics = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Util = __webpack_require__(168);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SAMPLE_TEXT = 'Hidden Text';\n\nvar FontMetrics = exports.FontMetrics = function () {\n    function FontMetrics(document) {\n        _classCallCheck(this, FontMetrics);\n\n        this._data = {};\n        this._document = document;\n    }\n\n    _createClass(FontMetrics, [{\n        key: '_parseMetrics',\n        value: function _parseMetrics(font) {\n            var container = this._document.createElement('div');\n            var img = this._document.createElement('img');\n            var span = this._document.createElement('span');\n\n            var body = this._document.body;\n            if (!body) {\n                throw new Error( false ? 'No document found for font metrics' : '');\n            }\n\n            container.style.visibility = 'hidden';\n            container.style.fontFamily = font.fontFamily;\n            container.style.fontSize = font.fontSize;\n            container.style.margin = '0';\n            container.style.padding = '0';\n\n            body.appendChild(container);\n\n            img.src = _Util.SMALL_IMAGE;\n            img.width = 1;\n            img.height = 1;\n\n            img.style.margin = '0';\n            img.style.padding = '0';\n            img.style.verticalAlign = 'baseline';\n\n            span.style.fontFamily = font.fontFamily;\n            span.style.fontSize = font.fontSize;\n            span.style.margin = '0';\n            span.style.padding = '0';\n\n            span.appendChild(this._document.createTextNode(SAMPLE_TEXT));\n            container.appendChild(span);\n            container.appendChild(img);\n            var baseline = img.offsetTop - span.offsetTop + 2;\n\n            container.removeChild(span);\n            container.appendChild(this._document.createTextNode(SAMPLE_TEXT));\n\n            container.style.lineHeight = 'normal';\n            img.style.verticalAlign = 'super';\n\n            var middle = img.offsetTop - container.offsetTop + 2;\n\n            body.removeChild(container);\n\n            return { baseline: baseline, middle: middle };\n        }\n    }, {\n        key: 'getMetrics',\n        value: function getMetrics(font) {\n            var key = font.fontFamily + ' ' + font.fontSize;\n            if (this._data[key] === undefined) {\n                this._data[key] = this._parseMetrics(font);\n            }\n\n            return this._data[key];\n        }\n    }]);\n\n    return FontMetrics;\n}();\n\n/***/ }),\n/* 677 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Proxy = undefined;\n\nvar _Feature = __webpack_require__(228);\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Proxy = exports.Proxy = function Proxy(src, options) {\n    if (!options.proxy) {\n        return Promise.reject( false ? 'No proxy defined' : null);\n    }\n    var proxy = options.proxy;\n\n    return new Promise(function (resolve, reject) {\n        var responseType = _Feature2.default.SUPPORT_CORS_XHR && _Feature2.default.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';\n        var xhr = _Feature2.default.SUPPORT_CORS_XHR ? new XMLHttpRequest() : new XDomainRequest();\n        xhr.onload = function () {\n            if (xhr instanceof XMLHttpRequest) {\n                if (xhr.status === 200) {\n                    if (responseType === 'text') {\n                        resolve(xhr.response);\n                    } else {\n                        var reader = new FileReader();\n                        // $FlowFixMe\n                        reader.addEventListener('load', function () {\n                            return resolve(reader.result);\n                        }, false);\n                        // $FlowFixMe\n                        reader.addEventListener('error', function (e) {\n                            return reject(e);\n                        }, false);\n                        reader.readAsDataURL(xhr.response);\n                    }\n                } else {\n                    reject( false ? 'Failed to proxy resource ' + src.substring(0, 256) + ' with status code ' + xhr.status : '');\n                }\n            } else {\n                resolve(xhr.responseText);\n            }\n        };\n\n        xhr.onerror = reject;\n        xhr.open('GET', proxy + '?url=' + encodeURIComponent(src) + '&responseType=' + responseType);\n\n        if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {\n            xhr.responseType = responseType;\n        }\n\n        if (options.imageTimeout) {\n            var timeout = options.imageTimeout;\n            xhr.timeout = timeout;\n            xhr.ontimeout = function () {\n                return reject( false ? 'Timed out (' + timeout + 'ms) proxying ' + src.substring(0, 256) : '');\n            };\n        }\n\n        xhr.send();\n    });\n};\n\n/***/ }),\n/* 678 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _mixin = __webpack_require__(268);\n\nvar _mixin2 = _interopRequireDefault(_mixin);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _amount = __webpack_require__(214);\n\nvar _amount2 = _interopRequireDefault(_amount);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _summary_table_head = __webpack_require__(1551);\n\nvar _summary_table_head2 = _interopRequireDefault(_summary_table_head);\n\nvar _dataset_utils = __webpack_require__(142);\n\nvar DataSetUtils = _interopRequireWildcard(_dataset_utils);\n\nvar _summary_table_utils = __webpack_require__(1552);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar getVarianceClassNames = function getVarianceClassNames(highlighting, highlightingVariance, percentVariance, unit, accountType, formulas) {\n    return (0, _classnames2.default)('variance_cell', unit.isCurrency ? 'currency' : 'number', highlighting && unit.isCurrency ? (0, _summary_table_utils.getHighlightingClass)(accountType, highlightingVariance, percentVariance, formulas) : null);\n};\nvar updateScrollState = _lodash2.default.throttle(function (_this, state) {\n    // This function throttles and bounces a state update out of the\n    // current stack to address the inability to scroll the table in IE-\n    // In IE, the act of changing the position of something during\n    // a scroll will stop the scroll action so, when we synchronously\n    // modify the position of the table header on scroll we stop the\n    // scroll, making scrolling impossible in IE\n    // This function makes sure that it happens asynchronously and does\n    // not interrupt the scroll\n    setTimeout(function () {\n        _this.setState(state);\n    }, 1);\n}, 1000 / 60); // throttled to 60FPS\n\nvar SummaryTable = function (_React$Component) {\n    _inherits(SummaryTable, _React$Component);\n\n    function SummaryTable() {\n        _classCallCheck(this, SummaryTable);\n\n        var _this2 = _possibleConstructorReturn(this, (SummaryTable.__proto__ || Object.getPrototypeOf(SummaryTable)).apply(this, arguments));\n\n        _this2.state = _this2.getViewData();\n        /**\r\n         * listens to renderData event from athenaState\r\n         * Please see router.js for who triggers this event\r\n         */\n        _this2.setViewState = function () {\n            return _this2.setState(_this2.getViewData());\n        };\n        _this2.handleAllExpansion = function () {\n            if (_lodash2.default.some(_this2.state.trueLines, 'expanded')) {\n                _summary_report_actions2.default.summarySetExpandedNodes({});\n            } else {\n                _summary_report_actions2.default.summarySetExpandedNodes(_lodash2.default.map(_this2.state.trueLines, 'id'));\n            }\n            _this2.props.athenaState.pendingSelection = null;\n        };\n        _this2.handleOnScroll = function (event) {\n            updateScrollState(_this2, {\n                scrollTop: event.target.scrollTop,\n                scrollLeft: event.target.scrollLeft\n            });\n        };\n        return _this2;\n    }\n\n    _createClass(SummaryTable, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this.props.athenaState.on('renderData', this.setViewState);\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this.props.athenaState.off('renderData', this.setViewState);\n        }\n    }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n            if (this.props.projections !== nextProps.projections || this.props.projectionType !== nextProps.projectionType) {\n                this.setState(this.getViewData());\n            }\n        }\n    }, {\n        key: 'getFixedCellStyle',\n        value: function getFixedCellStyle(customStyles) {\n            return Object.assign({\n                borderRightWidth: this.state.scrollLeft ? '1px' : 0,\n                left: this.state.scrollLeft,\n                position: 'relative'\n            }, customStyles);\n        }\n    }, {\n        key: 'handleDrillDown',\n        value: function handleDrillDown(line) {\n            if (!line.childless) {\n                _summary_report_actions2.default.drill(line.id);\n            }\n        }\n    }, {\n        key: '_renderLine',\n        value: function _renderLine(hideUnitSymbol, unit, _ref) {\n            var _this3 = this;\n\n            var _ref2 = _toArray(_ref),\n                line = _ref2[0],\n                sublines = _ref2.slice(1);\n\n            var expanded = this.props.expandedNodes[line.id];\n            // Override the expanded state in the store for fixed, expanded lines.\n            // This is needed in Revenue & Expense view where we want the top depth node always expanded.\n            // Ex:\n            //    - Revenues  <----------- expanded & fixed\n            //        - Revenues              |\n            //        - Transfers In          |\n            //    - Expenses  <---------------|\n            //        - Expenses\n            //        - Transfers Out\n            if (line.fixed && line.expanded) {\n                expanded = 'expanded';\n            }\n            var lines = [_react2.default.createElement(SummaryTableRow, { key: line.id, accountType: this.props.accountType, highlighting: this.props.highlighting, highlightingVariance: this.props.highlightingVariance, athenaState: this.props.athenaState, reportEvents: this.props.reportEvents, hideUnitSymbol: hideUnitSymbol, addSpace: true, unit: unit, line: line, yAxisScale: this.props.yAxisScale, expanded: expanded, scrollLeft: this.state.scrollLeft })];\n            if (expanded) {\n                return lines.concat(_lodash2.default.map(sublines, function (line) {\n                    return _this3._renderLine(true, unit, line);\n                }));\n            } else {\n                return lines;\n            }\n        }\n    }, {\n        key: 'renderBody',\n        value: function renderBody() {\n            var _this4 = this;\n\n            var reportUnit = _summary_report_store2.default.getReportAmountType();\n            return _react2.default.createElement(\"tbody\", null, _lodash2.default.flatten(_lodash2.default.map(this.state.expandedLines, _lodash2.default.bind(function (line, idx) {\n                return _this4._renderLine(idx !== 0, reportUnit, line);\n            }, this))));\n        }\n    }, {\n        key: 'renderFooter',\n        value: function renderFooter() {\n            var _this5 = this;\n\n            var totals = this.state.totals;\n            var reportUnit = _summary_report_store2.default.getReportAmountType();\n            var overlayRow = this._generateMetricRow('Overlay', this.props.overlay);\n            var scaleRow = this._generateMetricRow('Scale By', this.props.scale);\n            var customFooterStyles = this.props.isBalanceSheetReport ? { borderTop: 0, paddingLeft: '24px' } : {};\n            return _react2.default.createElement(\"tfoot\", null, _react2.default.createElement(\"tr\", { className: \"position-relative\", key: \"footer\" }, _lodash2.default.reduce(totals, _lodash2.default.bind(function (agg, total, key) {\n                agg.push(_react2.default.createElement(SummaryTableCell, Object.assign({ isBalanceSheetReport: _this5.props.isBalanceSheetReport, key: key + 'cell' }, total, { addSpace: true, hideUnitSymbol: false, unit: reportUnit })));\n                if (total.showVariance) {\n                    agg.push(_react2.default.createElement(\"td\", { key: key + 'currency', className: getVarianceClassNames(_this5.props.highlighting, _this5.props.highlightingVariance, total.percentVariance, reportUnit, _this5.props.accountType, _this5.props.athenaState.budgetData.formulas), style: _this5.props.isBalanceSheetReport ? { borderTop: 0 } : {} }, _strings2.default.currencyNoDollar(total.variance)));\n                    agg.push(_react2.default.createElement(\"td\", { key: key + 'percent', style: _this5.props.balanceSheetReport ? { borderTop: 0 } : {}, className: \"number\" }, _strings2.default.percentage(total.percentVariance)));\n                }\n                return agg;\n            }, this), [_react2.default.createElement(\"th\", { style: this.getFixedCellStyle(customFooterStyles), className: \"row-header\", key: \"aggregateRowLabel\" }, this.state.aggregateRowLabel)])), overlayRow, scaleRow);\n        }\n    }, {\n        key: '_generateMetricRow',\n        value: function _generateMetricRow(name, items) {\n            var _this6 = this;\n\n            var selectedItem = items.getIn(['selected', 0]);\n            var selectedData = this.props.metricData.getIn(['data', selectedItem]);\n            if (selectedItem) {\n                if (selectedData) {\n                    var years = selectedData.get('years');\n                    // Matching data to the correct year, as columns are not necessarily linear\n                    var yearData = _lodash2.default.map(this.state.dataSets, function (ds, i) {\n                        var year = parseInt(ds.yearNum);\n                        var currentYear = years.find(function (yr) {\n                            return yr.get('year') === year;\n                        });\n                        var total = _this6.state.totals[i] || null;\n                        return {\n                            year: year,\n                            value: currentYear.get('value'),\n                            interpolate_display: currentYear.get('interpolate_display'),\n                            showVariance: total && total.showVariance || false\n                        };\n                    });\n                    var firstCol = _react2.default.createElement(\"th\", { className: \"row-header\", style: this.getFixedCellStyle() }, name, \": \", selectedData.get('name'));\n                    var metricRow = _react2.default.createElement(\"tr\", { className: \"position-relative\" }, _lodash2.default.reduce(yearData, _lodash2.default.bind(function (agg, year) {\n                        var unit = _lodash2.default.isUndefined(year.interpolate_display) ? _numberTypes.numberTypes.none : _numberTypes.numberTypes.interpolated;\n                        agg.push(_react2.default.createElement(SummaryTableCell, Object.assign({}, year, { unit: unit, noUnitSymbols: true })));\n                        if (year.showVariance) {\n                            // Add in a spacer to skip over the variance columns when rendering the populations for each year.\n                            agg.push(_react2.default.createElement(\"td\", { colSpan: 2 }));\n                        }\n                        return agg;\n                    }, this), [firstCol]));\n                    return metricRow;\n                } else {\n                    // If we have no metric data for populations fallback to the entity population setting.\n                    var entity = this.props.athenaState.get('entity');\n                    return _react2.default.createElement(\"tr\", { className: \"position-relative\" }, _react2.default.createElement(\"td\", null), _lodash2.default.flatten(_lodash2.default.map(this.state.totals, function (total) {\n                        return [_react2.default.createElement(SummaryTableCell, { value: entity.population, unit: _numberTypes.numberTypes.none, noUnitSymbols: true }), total.showVariance ? _react2.default.createElement(\"td\", { colSpan: 2 }) : null];\n                    })));\n                }\n            }\n        }\n    }, {\n        key: 'getViewData',\n        value: function getViewData() {\n            var _this7 = this;\n\n            var athenaState = this.props.athenaState;\n            var budgetData = athenaState.budgetData;\n            var product = athenaState.get('product');\n            var renderedData = _summary_report_store2.default.getRenderedData(false, true);\n            var lines = renderedData.lines;\n            var expandedLines = renderedData.expandedLines;\n            var sublines = renderedData.sublines;\n            // report setting to enable or disable the application of prorated budgets\n            var proration = _summary_report_store2.default.getState().get('proration');\n            var dataSets = _summary_report_store2.default.getRenderedDataSets();\n            var totals = renderedData.totals;\n            dataSets = _lodash2.default.map(dataSets, _lodash2.default.bind(function (dataSet, index) {\n                var defaultLabel = _strings2.default.summaryHeaderLabel(dataSet, product ? product.technical_name : '', _this7.props.fiscalYearStartMonth);\n                // in case of projections, we must push defaultLabel, worded by strings module\n                var titleLabel = DataSetUtils.isProjectionDataset(dataSet) ? defaultLabel : dataSet.label || defaultLabel;\n                // if proration setting is enabled, and the report is YTD, and the data does not have month set\n                // and the current year is not cumulative, and the period is not in months, then prorate the budget amounts.\n                var prorated = proration // report setting\n                && product && product.technical_name === 'ytd' && !dataSet.month && !(product.properties.current_year_amount === 'cumulative' && product.properties.current_year_period === 'months');\n                return {\n                    prorated: prorated,\n                    label: _underscore2.default.escapeHTML(dataSet.label),\n                    title: _strings2.default.nl2br(_underscore2.default.escapeHTML(titleLabel)),\n                    type: dataSet.type,\n                    description: dataSet.description,\n                    year: _strings2.default.fiscalYear(dataSet.year, _this7.props.fiscalYearStartMonth),\n                    yearNum: dataSet.year,\n                    varianceBaseType: index ? dataSets[index - 1].type : null\n                };\n            }, this));\n            // Account for variance columns in the table that have no totals\n            // and insert empty total columns so totals that follow are properly offset.\n            var accountType = this.props.accountType;\n            totals = _lodash2.default.map(totals, function (total, index) {\n                var showVariance = dataSets[index].showVariance = !_lodash2.default.isUndefined(total.variance);\n                return _lodash2.default.assign({}, {\n                    value: accountType === 'types' ? total.delta : total.amount,\n                    variance: total.variance,\n                    percentVariance: total.percentVariance,\n                    type: total.type,\n                    showVariance: showVariance\n                });\n            });\n            var trueLines = _lodash2.default.reject(lines, 'fixed');\n            // this calculates how many extra lines of text are in the header label\n            var extraLines = Math.max.apply(null, dataSets.map(function (dataSet) {\n                var lines = (dataSet.label || dataSet.title).split(/\\n/);\n                if (lines[lines.length - 1] === '') {\n                    // the last line is empty, return two less than the number of lines\n                    return lines.length - 2;\n                }\n                // return one less than the number of lines\n                return lines.length - 1;\n            }));\n            // the header height is 35px for the first line and 28px for each subsequent line of text\n            var headerHeight = 35 + 28 * extraLines;\n            return {\n                aggregateRowLabel: _strings2.default.aggregateRowLabel(accountType, budgetData.visibleAccounts, this.props.isBalanceSheetReport),\n                dataSets: dataSets,\n                lines: lines,\n                expandedLines: expandedLines,\n                trueLines: trueLines,\n                trueLinesExpanded: _lodash2.default.some(trueLines, function (line) {\n                    return _this7.props.expandedNodes[line.id];\n                }),\n                sublines: sublines,\n                totals: totals,\n                headerHeight: headerHeight,\n                scrollTop: 0,\n                scrollLeft: 0\n            };\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var pendingExpandAll = _lodash2.default.some(this.props.expandedNodes, function (node) {\n                return node === 'pendingAll';\n            });\n            return _react2.default.createElement(\"div\", { className: \"summary-table-container\" }, _react2.default.createElement(\"div\", { className: \"summary-table ui-table js-table-container layout_expansion\", onScroll: this.handleOnScroll }, _react2.default.createElement(\"table\", { className: \"table summary_table\", id: \"table\" }, _react2.default.createElement(_summary_table_head2.default, { dataSets: this.state.dataSets, handleAllExpansion: this.handleAllExpansion, expandedLines: this.state.expandedLines, expandedNodes: this.props.expandedNodes, trueLines: this.state.trueLines, lines: this.state.lines, stickyHeader: true, scrollTop: this.state.scrollTop || 0, scrollLeft: this.state.scrollLeft || 0, headerHeight: this.state.headerHeight, pendingExpandAll: pendingExpandAll }), this.renderBody(), this.renderFooter())));\n        }\n    }]);\n\n    return SummaryTable;\n}(_react2.default.Component);\n\nSummaryTable.propTypes = {\n    isBalanceSheetReport: _propTypes2.default.bool,\n    athenaState: _propTypes2.default.object.isRequired,\n    reportEvents: _propTypes2.default.object.isRequired,\n    expandedNodes: _propTypes2.default.object.isRequired,\n    accountType: _propTypes2.default.string.isRequired,\n    yAxisScale: _propTypes2.default.object,\n    overlay: _propTypes2.default.object,\n    scale: _propTypes2.default.object,\n    metricData: _propTypes2.default.object,\n    stickyHeader: _propTypes2.default.bool,\n    highlighting: _propTypes2.default.bool,\n    highlightingVariance: _propTypes2.default.number,\n    projections: _propTypes2.default.bool,\n    projectionType: _propTypes2.default.string\n};\n\nvar SummaryTableRow = (0, _createReactClass2.default)({\n    displayName: 'SummaryTableRow',\n\n    mixins: [_mixin2.default],\n    _onExpandRow: function _onExpandRow() {\n        var line = this.props.line;\n\n        if (!line.childless && !line.fixed) {\n            _summary_report_actions2.default.summaryToggleNode(line.id);\n            this.props.athenaState.pendingSelection = null;\n            // Tell athena to skip rerendering the graph\n            this.props.athenaState.selectionChange(true);\n        }\n    },\n    _onAnnotationMouseOver: function _onAnnotationMouseOver(amount) {\n        _lodash2.default.each(this._getAnnotationClasses(amount), function (cls) {\n            (0, _jquery2.default)('.annotation').addClass('hide');\n            (0, _jquery2.default)('.' + cls).addClass('hover');\n        });\n    },\n    _onAnnotationMouseOut: function _onAnnotationMouseOut(amount) {\n        _lodash2.default.each(this._getAnnotationClasses(amount), function (cls) {\n            (0, _jquery2.default)('.annotation').removeClass('hide');\n            (0, _jquery2.default)('.' + cls).removeClass('hover');\n        });\n    },\n    _onAnnotationClick: function _onAnnotationClick(amount) {\n        _report_actions2.default.openAnnotationsPanel();\n        this.props.reportEvents.trigger('scrollToAnnotationNode', amount.annotation[0].primaryNode.id);\n        var annotationClasses = this._getAnnotationClasses(amount);\n        setTimeout(function () {\n            _lodash2.default.each(annotationClasses, function (cls) {\n                (0, _jquery2.default)('.' + cls).addClass('flash');\n            });\n            setTimeout(function () {\n                _lodash2.default.each(annotationClasses, function (cls) {\n                    (0, _jquery2.default)('.' + cls).removeClass('flash');\n                });\n            }, 300);\n        }, 100);\n    },\n    _generateAnnotation: function _generateAnnotation(amount) {\n        if (amount.annotation) {\n            return _react2.default.createElement(\"span\", { onClick: this._onAnnotationClick.bind(this, amount), onMouseOver: this._onAnnotationMouseOver.bind(this, amount), onMouseOut: this._onAnnotationMouseOut.bind(null, amount), className: 'icon-annotation-1 table__cell__annotation js-annotation js-table-annotation ' + this._getAnnotationClasses(amount).join(' ') });\n        }\n    },\n    _getAnnotationClasses: function _getAnnotationClasses(amount) {\n        var annotationIds = _lodash2.default.map(amount.annotation, 'id');\n        return annotationIds.map(function (id) {\n            return 'annotation-' + id;\n        });\n    },\n    getFixedCellStyle: function getFixedCellStyle(customStyles) {\n        return Object.assign({\n            borderRightWidth: this.props.scrollLeft ? '1px' : 0,\n            left: this.props.scrollLeft,\n            position: 'relative'\n        }, customStyles);\n    },\n    render: function render() {\n        var _this8 = this;\n\n        var _props = this.props,\n            line = _props.line,\n            hideUnitSymbol = _props.hideUnitSymbol,\n            addSpace = _props.addSpace,\n            unit = _props.unit;\n\n        var expandIconEnabled = !line.childless && !line.fixed && line.depth < 6;\n        var interactable = !line.childless && !line.fixed;\n        var rowClassName = (0, _classnames2.default)('position-relative', {\n            expanded: this.props.expanded === 'expanded',\n            loading: this.props.expanded === 'pending',\n            'expanded-end': line.lastExpanded\n        });\n        var thClasses = (0, _classnames2.default)('row-title', 'row-header', 'indented-' + line.depth, { 'js-drill': interactable });\n        // Restrict colored elements to those that are visible in the graph\n        var lineStyle = line.fixedColor ? { color: og.colorIntTohtmlRGB(line.color) } : {};\n        var dropItemIcon = (0, _classnames2.default)({\n            'ui-drop-item__icon': !line.childless,\n            'ui-drop-item__placeholder': line.childless,\n            'is-disabled': !expandIconEnabled\n        });\n        var lineNameClassName = (0, _classnames2.default)({\n            'ui-table__cell__link': true,\n            childless: !interactable\n        });\n        return _react2.default.createElement(\"tr\", { className: rowClassName, key: line.id }, _react2.default.createElement(\"th\", { onClick: _lodash2.default.debounce(this._onExpandRow, 250), className: thClasses, style: this.getFixedCellStyle(lineStyle), \"data-id\": line.id, key: line.id + '-th' }, interactable && _react2.default.createElement(\"button\", { className: \"ui-drop-item__button\" }, _react2.default.createElement(\"span\", { className: dropItemIcon }), _react2.default.createElement(\"span\", { className: lineNameClassName }, _strings2.default.nodeName(line))), !interactable && _react2.default.createElement(\"div\", null, _react2.default.createElement(\"span\", { className: dropItemIcon }), _react2.default.createElement(\"span\", { className: lineNameClassName }, _strings2.default.nodeName(line)))), _lodash2.default.map(line.amounts, _lodash2.default.bind(function (amount, index) {\n            var showVariance = !_lodash2.default.isUndefined(amount.variance);\n            return [_react2.default.createElement(SummaryTableCell, Object.assign({}, amount, { hideUnitSymbol: hideUnitSymbol, addSpace: addSpace, unit: unit, key: line.id + '-' + index }), _this8._generateAnnotation(amount)), showVariance ? _react2.default.createElement(_react2.default.Fragment, null, _react2.default.createElement(\"td\", { className: getVarianceClassNames(_this8.props.highlighting, _this8.props.highlightingVariance, amount.percentVariance, unit, _this8.props.accountType, _this8.props.athenaState.budgetData.formulas), key: line.id + '-' + index }, _strings2.default.currencyNoDollar(amount.variance)), _react2.default.createElement(\"td\", { className: \"number\", key: line.id + '-' + index }, _strings2.default.percentage(amount.percentVariance))) : null];\n        }, this)));\n    }\n});\nvar SummaryTableCell = (0, _createReactClass2.default)({\n    displayName: 'SummaryTableCell',\n\n    propTypes: {\n        isBalanceSheetReport: _propTypes2.default.bool,\n        type: _propTypes2.default.string.isRequired,\n        hideUnitSymbol: _propTypes2.default.bool.isRequired,\n        addSpace: _propTypes2.default.bool,\n        unit: _propTypes2.default.shape({\n            formatter: _propTypes2.default.func.isRequired,\n            isCurrency: _propTypes2.default.bool.isRequired,\n            symbol: _propTypes2.default.string.isRequired\n        })\n    },\n    render: function render() {\n        var _props2 = this.props,\n            unit = _props2.unit,\n            type = _props2.type,\n            children = _props2.children,\n            _props2$hideUnitSymbo = _props2.hideUnitSymbol,\n            hideUnitSymbol = _props2$hideUnitSymbo === undefined ? true : _props2$hideUnitSymbo,\n            _props2$addSpace = _props2.addSpace,\n            addSpace = _props2$addSpace === undefined ? false : _props2$addSpace,\n            isBalanceSheetReport = _props2.isBalanceSheetReport;\n\n        var iconStyle = {\n            position: 'relative',\n            top: '1.5px'\n        };\n        return _react2.default.createElement(\"td\", { className: (0, _classnames2.default)({\n                currency: unit.isCurrency,\n                number: !unit.isCurrency,\n                uncertain: type === 'budget'\n            }), style: isBalanceSheetReport ? { borderTop: 0 } : {} }, children, _react2.default.createElement(_amount2.default, Object.assign({ noUnitSymbols: hideUnitSymbol, addSpace: addSpace }, this.props)), unit.label === 'Interpolated' ? _react2.default.createElement(\"button\", { className: \"ui-table__cell__label icon-info-1\", \"data-hint\": \"Interpolated\", \"data-hint-position\": \"right\", \"data-hint-align\": \"right\", style: iconStyle }) : null);\n    }\n});\nexports.default = SummaryTable;\n\n/***/ }),\n/* 679 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n      descriptor.value = null;\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function(object) {\n      var index, iterable = object, result = [];\n      if (!iterable) return result;\n      if (!(objectTypes[typeof object])) return result;\n        for (index in iterable) {\n          if (hasOwnProperty.call(iterable, index)) {\n            result.push(index);\n          }\n        }\n      return result\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        for (index in iterable) {\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * https://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.2';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (true) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module), __webpack_require__(17)))\n\n/***/ }),\n/* 680 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction defaultState() {\n    return Immutable.fromJS({\n        isOpen: false,\n        activeCategory: null,\n        updatedReport: _report_view_store2.default.getRenderedReport(),\n        saving: false,\n        errors: {},\n        deleteStatus: null\n    });\n}\nfunction swapDataSets(dataSets, from, to) {\n    return dataSets.remove(to).splice(from, 0, dataSets.get(to)).map(function (dataSet, i) {\n        return dataSet.set('order', i);\n    });\n}\nexports.default = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return defaultState();\n    },\n\n    actions: {\n        REPORT_LOADED: function REPORT_LOADED() {\n            return defaultState();\n        },\n        // REPORT_UPDATED: (state, {changes}) => state.mergeIn(['report'], changes),\n        REPORT_DELETED: function REPORT_DELETED(state) {\n            return state.set('isOpen', false);\n        },\n        REPORT_OPEN_SETTINGS_PANEL: function REPORT_OPEN_SETTINGS_PANEL() {\n            return defaultState().set('isOpen', true);\n        },\n        REPORT_OPEN_EDIT_DATA: function REPORT_OPEN_EDIT_DATA(state) {\n            return state.set('isOpen', false);\n        },\n        REPORT_OPEN_EDIT_LINKAGE: function REPORT_OPEN_EDIT_LINKAGE(state) {\n            return state.set('isOpen', false);\n        },\n        REPORT_SETTINGS_SELECT_CATEGORY: function REPORT_SETTINGS_SELECT_CATEGORY(state, _ref) {\n            var category = _ref.category;\n            return state.set('activeCategory', Immutable.Map(category));\n        },\n        REPORT_SETTINGS_GO_BACK: function REPORT_SETTINGS_GO_BACK(state) {\n            return state.set('isOpen', true) // We may need to re-open the settings panel if we are backing out of report data wizard.\n            .set('activeCategory', null);\n        },\n        REPORT_SETTINGS_CANCEL: function REPORT_SETTINGS_CANCEL(state) {\n            return state.set('isOpen', false);\n        },\n        REPORT_SETTINGS_SAVE: function REPORT_SETTINGS_SAVE(state) {\n            return state.set('saving', true);\n        },\n        REPORT_SETTINGS_SAVE_SUCCESS: function REPORT_SETTINGS_SAVE_SUCCESS(state) {\n            return state.set('errors', Immutable.Map());\n        },\n        REPORT_SETTINGS_SAVE_ERROR: function REPORT_SETTINGS_SAVE_ERROR(state, _ref2) {\n            var errors = _ref2.errors;\n            return state.set('errors', Immutable.fromJS(errors));\n        },\n        REPORT_SETTINGS_SAVE_DONE: function REPORT_SETTINGS_SAVE_DONE(state) {\n            return state.set('saving', false);\n        },\n        REPORT_SETTINGS_CHANGE_ATTRIBUTE: function REPORT_SETTINGS_CHANGE_ATTRIBUTE(state, _ref3) {\n            var fieldPath = _ref3.fieldPath,\n                newValue = _ref3.newValue;\n            return state.setIn(['updatedReport'].concat(fieldPath), newValue);\n        },\n        REPORT_SETTINGS_DELETE_REPORT: function REPORT_SETTINGS_DELETE_REPORT(state) {\n            return state.set('deleteStatus', 'confirm');\n        },\n        REPORT_SETTINGS_DELETE_REPORT_CONFIRMED: function REPORT_SETTINGS_DELETE_REPORT_CONFIRMED(state) {\n            return state.set('deleteStatus', 'pending');\n        },\n        REPORT_SETTINGS_DELETE_REPORT_CANCELED: function REPORT_SETTINGS_DELETE_REPORT_CANCELED(state) {\n            return state.set('deleteStatus', null);\n        },\n        REPORT_SETTINGS_DELETE_REPORT_SUCCESS: function REPORT_SETTINGS_DELETE_REPORT_SUCCESS(state) {\n            return state.set('deleteStatus', 'completed');\n        },\n        REPORT_SETTINGS_DELETE_REPORT_ERROR: function REPORT_SETTINGS_DELETE_REPORT_ERROR(state) {\n            return state.set('deleteStatus', 'failed');\n        },\n        REPORT_SETTINGS_DELETE_REPORT_FINISHED: function REPORT_SETTINGS_DELETE_REPORT_FINISHED(state) {\n            return state.set('deleteStatus', null).set('isOpen', false);\n        },\n        REPORT_SETTINGS_CHANGE_DATA_SET_ORDER: function REPORT_SETTINGS_CHANGE_DATA_SET_ORDER(state, _ref4) {\n            var from = _ref4.from,\n                to = _ref4.to;\n\n            return state.updateIn(['updatedReport', 'data_sets'], function (dataSets) {\n                return swapDataSets(dataSets, from, to);\n            });\n        },\n        REPORT_SETTINGS_RENAME_DATA_SET: function REPORT_SETTINGS_RENAME_DATA_SET(state, _ref5) {\n            var dataSetIndex = _ref5.dataSetIndex,\n                name = _ref5.name;\n            return state.setIn(['updatedReport', 'data_sets', dataSetIndex, 'name'], name);\n        },\n        REPORT_SETTINGS_CHANGE_XAXIS_LABEL: function REPORT_SETTINGS_CHANGE_XAXIS_LABEL(state, _ref6) {\n            var label = _ref6.label;\n            return state.setIn(['updatedReport', 'properties', 'fiscal_year_text'], label || null);\n        }\n    },\n    isDirty: function isDirty() {\n        return !this.getState().get('updatedReport').equals(_report_view_store2.default.getRenderedReport());\n    },\n    isTitleTooLong: function isTitleTooLong() {\n        var name = this.getState().getIn(['updatedReport', 'name']);\n        return _underscore2.default.clean(name).length > 20;\n    }\n});\n\n/***/ }),\n/* 681 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _check_dataset_subset = __webpack_require__(1561);\n\nvar _check_dataset_subset2 = _interopRequireDefault(_check_dataset_subset);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Table = Ovid.Table;\nvar CollectionSearch = Ovid.CollectionSearch;\n\nvar ChooseDataSets = (0, _createReactClass2.default)({\n    displayName: 'ChooseDataSets',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            coaDataSets: [],\n            loading: true,\n            sortBy: 'year'\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Choose data to include in this report\");\n    },\n\n    sortFields: {\n        monthText: 'month'\n    },\n    renderContent: function renderContent() {\n        var sortField = this.sortFields[this.state.sortBy] || this.state.sortBy;\n        if (sortField === 'date_updated') {\n            sortField = function sortField(dataSet) {\n                return Date.parse(dataSet.updated);\n            };\n        }\n        var coaDataSets = _lodash2.default.sortBy(this.state.filteredDataSets, sortField);\n        if (!this.state.sortAsc) {\n            coaDataSets.reverse();\n        }\n        var dataSetErrors = this.props.errors && this.props.errors.data_sets;\n        //In case of search, check if all the coaDataSets are included in the rports dataset\n        var isAllChecked = (0, _check_dataset_subset2.default)(this.state.filteredDataSets, this.state.selectedDataSets);\n        var columns = [new Ovid.CheckboxColumn({\n            key: 'select',\n            onCheckAll: this.handleSelectAll,\n            checkedRows: this.state.selectedDataSets.toJSON(),\n            isAllChecked: isAllChecked\n        }), { key: 'year', name: 'Year', sortable: true }, { key: 'monthText', name: 'Month', sortable: true }, { key: 'data_set_type', name: 'Type', sortable: true }, { key: 'date_updated', name: 'Date Updated', sortable: true }, { key: 'date_created', name: 'Date Created', sortable: true }, { key: 'name', name: 'Name', sortable: true }, { key: 'description', name: 'Description', sortable: true }, { key: 'file_name', name: 'File name', sortable: true }];\n        return _react2.default.createElement(\"div\", null, this.props.errors && this.props.errors.data_sets ? _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), \" Some of the data sets could not be added to the report.\") : null, _react2.default.createElement(\"div\", { className: \"ui-card\" }, _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, _react2.default.createElement(CollectionSearch, { collection: this.state.coaDataSets, fields: ['year', 'monthText', 'data_set_type', 'name', 'date_uploaded', 'description'], onChange: this.handleSearchChange, placeholder: 'Search data sets' })), _react2.default.createElement(\"div\", { className: \"data-table__scroll-container\" }, _react2.default.createElement(Table, { columns: columns, rows: coaDataSets, rowErrors: dataSetErrors, onSort: this.handleSort, onRowClick: this.handleRowClick, sortBy: this.state.sortBy, sortAsc: this.state.sortAsc }))));\n    },\n\n    componentDidMount: function componentDidMount() {\n        this.props.report.dataSets.on('all', this.handleChange, this);\n        // TODO: After DATA-1675, remove this pre-filtering. The line should\n        // revert to var rawDataSets = this.props.dataSets;\n        var rawDataSets = this.props.dataSets.filter(function (dataSet) {\n            return dataSet.data_set_type === 'budget' || dataSet.data_set_type === 'actual';\n        });\n        this.setState({\n            coaDataSets: rawDataSets,\n            filteredDataSets: rawDataSets,\n            loading: false,\n            selectedDataSets: this.props.report.dataSets\n        });\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        // If we are receiving validation errors for data sets,\n        // remove them from the selected data set collection.\n        // For example if the data set no longer exists, the user should\n        // just be able to hit \"next\" to continue on with the selected data sets.\n        var dataSetErrors = nextProps.errors && nextProps.errors.data_sets;\n        if (dataSetErrors) {\n            nextProps.report.dataSets.remove(Object.keys(dataSetErrors));\n        }\n    },\n    isValid: function isValid() {\n        return !this.props.report.dataSets.isEmpty();\n    },\n    handleRowClick: function handleRowClick(dataSet) {\n        var dataSets = this.state.selectedDataSets;\n        if (!dataSets.get(dataSet)) {\n            dataSets.add(dataSet);\n        } else {\n            dataSets.remove(dataSet);\n        }\n        this.setState({ selectedDataSets: dataSets });\n        this.props.report.dataSets = dataSets;\n    },\n    handleSelectAll: function handleSelectAll(isChecked) {\n        var dataSets = this.state.selectedDataSets;\n        var coaDataSets = this.state.filteredDataSets;\n        if (isChecked) {\n            dataSets.add(this.state.filteredDataSets);\n        } else {\n            if (dataSets.length === coaDataSets.length) {\n                //Reset dataset to uncheck all\n                dataSets.reset();\n            } else {\n                //uncheck the data sets in the filtered view and remove it from the reports\n                _lodash2.default.forEach(coaDataSets, function (coaDataSet) {\n                    dataSets.remove(coaDataSet);\n                });\n            }\n        }\n        this.setState({ selectedDataSets: dataSets });\n        this.props.report.dataSets = dataSets;\n    },\n    handleSort: function handleSort(sortBy, ascending) {\n        this.setState({ sortBy: sortBy, sortAsc: ascending });\n    },\n    handleSearchChange: function handleSearchChange(items) {\n        this.setState({ filteredDataSets: items });\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = ChooseDataSets;\n\n/***/ }),\n/* 682 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Table = Ovid.Table;\nvar CollectionSearch = Ovid.CollectionSearch;\n\nvar ChooseDataSets = (0, _createReactClass2.default)({\n    displayName: 'ChooseDataSets',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            coaDataSets: [],\n            loading: true,\n            sortBy: 'year'\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Choose transactions data to include in the report\");\n    },\n    renderContent: function renderContent() {\n        var selectedSet = this.getSelected();\n        var txDataSets = _lodash2.default.sortBy(this.state.filteredDataSets, this.state.sortBy);\n        if (this.state.sortAsc) {\n            txDataSets.reverse();\n        }\n        var columns = [new Ovid.RadioColumn({\n            key: 'select',\n            selectedRow: selectedSet\n        }), { key: 'title', name: 'Title' }, { key: 'id', name: 'ID' }, { key: 'chart_id', name: 'Chart ID' }];\n        return _react2.default.createElement(\"div\", null, this.props.errors && this.props.errors.coa ? _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"p\", null, _react2.default.createElement(\"i\", { className: \"icon-exclamation-1\" }), \" Chart of Accounts linked to transactions data set not found.\")) : null, _react2.default.createElement(\"div\", { className: \"ui-card ui-container_scroll\" }, _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, _react2.default.createElement(CollectionSearch, { collection: this.state.coaDataSets, fields: ['title'], onChange: this.handleSearchChange, placeholder: 'Search datasets' })), _lodash2.default.isEmpty(txDataSets) ? _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No data for that query\")) : _react2.default.createElement(Table, { columns: columns, rows: txDataSets, onSort: this.handleSort, onRowClick: this.handleSelect, sortBy: this.state.sortBy, sortAsc: this.state.sortAsc })));\n    },\n    componentDidMount: function componentDidMount() {\n        var _this = this;\n\n        this.props.report.dataSets.on('all', this.handleChange, this);\n        _og_api2.default.trapi.get('data_sets', this.props.entity.get('id')).end().then(function (result) {\n            var rawDataSets = result.body.data_sets;\n            _this.setState({\n                coaDataSets: rawDataSets,\n                filteredDataSets: rawDataSets,\n                loading: false,\n                error: false\n            });\n        }).catch(function () {\n            _this.setState({\n                coaDataSets: null,\n                filteredDataSets: null,\n                loading: false,\n                error: true\n            });\n        });\n    },\n    handleSort: function handleSort(sortBy, ascending) {\n        this.setState({ sortBy: sortBy, sortAsc: ascending });\n    },\n    handleSearchChange: function handleSearchChange(items) {\n        this.setState({ filteredDataSets: items });\n    },\n    getSelected: function getSelected() {\n        return this.props.report.get('transaction_id');\n    },\n    isValid: function isValid() {\n        return this.props.report.has('transaction_id');\n    },\n    handleSelect: function handleSelect(transaction) {\n        this.props.report.set({\n            transaction_id: transaction.id,\n            coa_id: transaction.chart_id,\n            properties: {} // reset the state when switching datasets so we don't trigger invalid query\n        });\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = ChooseDataSets;\n\n/***/ }),\n/* 683 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _settings_panel_header_text = __webpack_require__(1579);\n\nvar _settings_panel_header_text2 = _interopRequireDefault(_settings_panel_header_text);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar getProperty = function getProperty(report, propertyName) {\n    return report && report.get(propertyName) || null;\n};\n\nvar SettingsPanelHeader = function (_React$Component) {\n    _inherits(SettingsPanelHeader, _React$Component);\n\n    function SettingsPanelHeader() {\n        _classCallCheck(this, SettingsPanelHeader);\n\n        var _this = _possibleConstructorReturn(this, (SettingsPanelHeader.__proto__ || Object.getPrototypeOf(SettingsPanelHeader)).apply(this, arguments));\n\n        _this._renderHeader = function () {\n            var _this$props = _this.props,\n                report = _this$props.report,\n                oneVisibleCategory = _this$props.oneVisibleCategory;\n\n            if (oneVisibleCategory) {\n                return _react2.default.createElement(\"h3\", null, _react2.default.createElement(\"span\", { className: \"icon-settings-1\" }), \" \", oneVisibleCategory.props.title);\n            }\n            return _react2.default.createElement(_settings_panel_header_text2.default, { additionalHeadingText: getProperty(report, 'name'), additionalHeadingDescription: getProperty(report, 'report_type_name') });\n        };\n        return _this;\n    }\n\n    _createClass(SettingsPanelHeader, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, this._renderHeader(), _react2.default.createElement(\"button\", { className: \"ui-panel__close\", onClick: _settings_panel_actions2.default.cancel }));\n        }\n    }]);\n\n    return SettingsPanelHeader;\n}(_react2.default.Component);\n\nexports.default = SettingsPanelHeader;\n\nSettingsPanelHeader.propTypes = {\n    report: _propTypes2.default.object\n};\n\n/***/ }),\n/* 684 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.fetchStories = fetchStories;\nexports.selectStoryToView = selectStoryToView;\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar api = new _og_api.OgApi(gon.ogOperateHost + '/api/stories/v1');\nvar PORTAL_STORIES_LIMIT = 1000;\nfunction fetchStories(entityId) {\n    api.get('public/portal-stories?entity_id=' + entityId + '&per_page=' + PORTAL_STORIES_LIMIT).end().then(function (res) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'STORIES_LOADED',\n            stories: res.body.data\n        });\n    });\n}\nfunction selectStoryToView(storyId) {\n    _og_flux.Dispatcher.handleViewAction({\n        actionType: 'STORIES_VIEW_STORY',\n        storyId: storyId\n    });\n}\n\n/***/ }),\n/* 685 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _og_flux = __webpack_require__(15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar StoriesStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return _immutable2.default.fromJS({\n            stories: _immutable2.default.List(),\n            selectedStoryId: null\n        });\n    },\n    selectedStoryPublicURL: function selectedStoryPublicURL() {\n        var state = this.getState();\n        var stories = state.get('stories');\n        var selectedStoryId = state.get('selectedStoryId');\n        if (stories.isEmpty() || !selectedStoryId) {\n            return null;\n        }\n        var story = stories.find(function (s) {\n            return s.get('_id') === selectedStoryId;\n        });\n        return story && story.get('public_url');\n    },\n\n    actions: {\n        STORIES_LOADED: function STORIES_LOADED(state, action) {\n            var stories = _immutable2.default.fromJS(action.stories.map(function (s) {\n                return _extends({}, s.story, { order: s.order });\n            }));\n            return state.set('stories', stories);\n        },\n        STORIES_VIEW_STORY: function STORIES_VIEW_STORY(state, action) {\n            return state.set('selectedStoryId', action.storyId);\n        }\n    }\n});\nexports.default = StoriesStore;\n\n/***/ }),\n/* 686 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(27) && !__webpack_require__(19)(function () {\n  return Object.defineProperty(__webpack_require__(324)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 687 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(23);\n\n\n/***/ }),\n/* 688 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(57);\nvar toIObject = __webpack_require__(58);\nvar arrayIndexOf = __webpack_require__(229)(false);\nvar IE_PROTO = __webpack_require__(326)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 689 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(31);\nvar anObject = __webpack_require__(13);\nvar getKeys = __webpack_require__(107);\n\nmodule.exports = __webpack_require__(27) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 690 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(58);\nvar gOPN = __webpack_require__(110).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 691 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(27);\nvar getKeys = __webpack_require__(107);\nvar gOPS = __webpack_require__(230);\nvar pIE = __webpack_require__(171);\nvar toObject = __webpack_require__(32);\nvar IObject = __webpack_require__(170);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(19)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 692 */\n/***/ (function(module, exports) {\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n/***/ }),\n/* 693 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar aFunction = __webpack_require__(46);\nvar isObject = __webpack_require__(20);\nvar invoke = __webpack_require__(694);\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n  if (!(len in factories)) {\n    for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n    // eslint-disable-next-line no-new-func\n    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n  var fn = aFunction(this);\n  var partArgs = arraySlice.call(arguments, 1);\n  var bound = function (/* args... */) {\n    var args = partArgs.concat(arraySlice.call(arguments));\n    return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n  };\n  if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n  return bound;\n};\n\n\n/***/ }),\n/* 694 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 695 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $parseInt = __webpack_require__(16).parseInt;\nvar $trim = __webpack_require__(132).trim;\nvar ws = __webpack_require__(330);\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n  var string = $trim(String(str), 3);\n  return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n\n\n/***/ }),\n/* 696 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $parseFloat = __webpack_require__(16).parseFloat;\nvar $trim = __webpack_require__(132).trim;\n\nmodule.exports = 1 / $parseFloat(__webpack_require__(330) + '-0') !== -Infinity ? function parseFloat(str) {\n  var string = $trim(String(str), 3);\n  var result = $parseFloat(string);\n  return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n\n\n/***/ }),\n/* 697 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar cof = __webpack_require__(66);\nmodule.exports = function (it, msg) {\n  if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n  return +it;\n};\n\n\n/***/ }),\n/* 698 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(20);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n/***/ }),\n/* 699 */\n/***/ (function(module, exports) {\n\n// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n\n\n/***/ }),\n/* 700 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.16 Math.fround(x)\nvar sign = __webpack_require__(333);\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n  var $abs = Math.abs(x);\n  var $sign = sign(x);\n  var a, result;\n  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n  a = (1 + EPSILON32 / EPSILON) * $abs;\n  result = a - (a - $abs);\n  // eslint-disable-next-line no-self-compare\n  if (result > MAX32 || result != result) return $sign * Infinity;\n  return $sign * result;\n};\n\n\n/***/ }),\n/* 701 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(13);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 702 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar aFunction = __webpack_require__(46);\nvar toObject = __webpack_require__(32);\nvar IObject = __webpack_require__(170);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n  aFunction(callbackfn);\n  var O = toObject(that);\n  var self = IObject(O);\n  var length = toLength(O.length);\n  var index = isRight ? length - 1 : 0;\n  var i = isRight ? -1 : 1;\n  if (aLen < 2) for (;;) {\n    if (index in self) {\n      memo = self[index];\n      index += i;\n      break;\n    }\n    index += i;\n    if (isRight ? index < 0 : length <= index) {\n      throw TypeError('Reduce of empty array with no initial value');\n    }\n  }\n  for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n    memo = callbackfn(memo, self[index], index, O);\n  }\n  return memo;\n};\n\n\n/***/ }),\n/* 703 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(32);\nvar toAbsoluteIndex = __webpack_require__(108);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n/***/ }),\n/* 704 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 705 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar regexpExec = __webpack_require__(345);\n__webpack_require__(4)({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n\n\n/***/ }),\n/* 706 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(27) && /./g.flags != 'g') __webpack_require__(31).f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(172)\n});\n\n\n/***/ }),\n/* 707 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 708 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(13);\nvar isObject = __webpack_require__(20);\nvar newPromiseCapability = __webpack_require__(349);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 709 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(710);\nvar validate = __webpack_require__(115);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(238)(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n/***/ }),\n/* 710 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar dP = __webpack_require__(31).f;\nvar create = __webpack_require__(109);\nvar redefineAll = __webpack_require__(114);\nvar ctx = __webpack_require__(65);\nvar anInstance = __webpack_require__(112);\nvar forOf = __webpack_require__(113);\nvar $iterDefine = __webpack_require__(335);\nvar step = __webpack_require__(704);\nvar setSpecies = __webpack_require__(111);\nvar DESCRIPTORS = __webpack_require__(27);\nvar fastKey = __webpack_require__(95).fastKey;\nvar validate = __webpack_require__(115);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n/***/ }),\n/* 711 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(710);\nvar validate = __webpack_require__(115);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(238)(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n/***/ }),\n/* 712 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(16);\nvar each = __webpack_require__(76)(0);\nvar redefine = __webpack_require__(50);\nvar meta = __webpack_require__(95);\nvar assign = __webpack_require__(691);\nvar weak = __webpack_require__(713);\nvar isObject = __webpack_require__(20);\nvar validate = __webpack_require__(115);\nvar NATIVE_WEAK_MAP = __webpack_require__(115);\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(238)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n/***/ }),\n/* 713 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefineAll = __webpack_require__(114);\nvar getWeak = __webpack_require__(95).getWeak;\nvar anObject = __webpack_require__(13);\nvar isObject = __webpack_require__(20);\nvar anInstance = __webpack_require__(112);\nvar forOf = __webpack_require__(113);\nvar createArrayMethod = __webpack_require__(76);\nvar $has = __webpack_require__(57);\nvar validate = __webpack_require__(115);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n/***/ }),\n/* 714 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = __webpack_require__(67);\nvar toLength = __webpack_require__(25);\nmodule.exports = function (it) {\n  if (it === undefined) return 0;\n  var number = toInteger(it);\n  var length = toLength(number);\n  if (number !== length) throw RangeError('Wrong length!');\n  return length;\n};\n\n\n/***/ }),\n/* 715 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(110);\nvar gOPS = __webpack_require__(230);\nvar anObject = __webpack_require__(13);\nvar Reflect = __webpack_require__(16).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n/* 716 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar isArray = __webpack_require__(231);\nvar isObject = __webpack_require__(20);\nvar toLength = __webpack_require__(25);\nvar ctx = __webpack_require__(65);\nvar IS_CONCAT_SPREADABLE = __webpack_require__(23)('isConcatSpreadable');\n\nfunction flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n  var targetIndex = start;\n  var sourceIndex = 0;\n  var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;\n  var element, spreadable;\n\n  while (sourceIndex < sourceLen) {\n    if (sourceIndex in source) {\n      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n      spreadable = false;\n      if (isObject(element)) {\n        spreadable = element[IS_CONCAT_SPREADABLE];\n        spreadable = spreadable !== undefined ? !!spreadable : isArray(element);\n      }\n\n      if (spreadable && depth > 0) {\n        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n      } else {\n        if (targetIndex >= 0x1fffffffffffff) throw TypeError();\n        target[targetIndex] = element;\n      }\n\n      targetIndex++;\n    }\n    sourceIndex++;\n  }\n  return targetIndex;\n}\n\nmodule.exports = flattenIntoArray;\n\n\n/***/ }),\n/* 717 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(25);\nvar repeat = __webpack_require__(332);\nvar defined = __webpack_require__(74);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n/***/ }),\n/* 718 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(27);\nvar getKeys = __webpack_require__(107);\nvar toIObject = __webpack_require__(58);\nvar isEnum = __webpack_require__(171).f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) {\n      key = keys[i++];\n      if (!DESCRIPTORS || isEnum.call(O, key)) {\n        result.push(isEntries ? [key, O[key]] : O[key]);\n      }\n    }\n    return result;\n  };\n};\n\n\n/***/ }),\n/* 719 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = __webpack_require__(131);\nvar from = __webpack_require__(720);\nmodule.exports = function (NAME) {\n  return function toJSON() {\n    if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n    return from(this);\n  };\n};\n\n\n/***/ }),\n/* 720 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar forOf = __webpack_require__(113);\n\nmodule.exports = function (iter, ITERATOR) {\n  var result = [];\n  forOf(iter, false, result.push, result, ITERATOR);\n  return result;\n};\n\n\n/***/ }),\n/* 721 */\n/***/ (function(module, exports) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {\n  if (\n    arguments.length === 0\n      // eslint-disable-next-line no-self-compare\n      || x != x\n      // eslint-disable-next-line no-self-compare\n      || inLow != inLow\n      // eslint-disable-next-line no-self-compare\n      || inHigh != inHigh\n      // eslint-disable-next-line no-self-compare\n      || outLow != outLow\n      // eslint-disable-next-line no-self-compare\n      || outHigh != outHigh\n  ) return NaN;\n  if (x === Infinity || x === -Infinity) return x;\n  return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;\n};\n\n\n/***/ }),\n/* 722 */,\n/* 723 */,\n/* 724 */,\n/* 725 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__index_default_js__ = __webpack_require__(726);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return __WEBPACK_IMPORTED_MODULE_0__index_default_js__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__index_js__ = __webpack_require__(244);\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"VERSION\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"VERSION\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"iteratee\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"iteratee\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"restArguments\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"restArguments\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"each\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"each\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"forEach\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"forEach\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"map\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"map\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"collect\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"collect\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"reduce\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"reduce\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"foldl\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"foldl\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"inject\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"inject\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"reduceRight\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"reduceRight\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"foldr\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"foldr\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"find\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"find\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"detect\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"detect\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"filter\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"filter\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"select\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"select\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"reject\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"reject\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"every\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"every\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"all\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"all\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"some\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"some\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"any\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"any\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"contains\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"contains\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"includes\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"includes\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"include\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"include\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"invoke\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"invoke\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"pluck\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"pluck\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"where\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"where\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"findWhere\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"findWhere\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"max\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"max\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"min\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"min\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"shuffle\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"sample\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"sample\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"sortBy\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"sortBy\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"groupBy\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"groupBy\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"indexBy\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"indexBy\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"countBy\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"countBy\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"toArray\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"toArray\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"size\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"size\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"partition\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"partition\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"first\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"first\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"head\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"head\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"take\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"take\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"initial\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"initial\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"last\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"last\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"rest\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"rest\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"tail\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"tail\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"drop\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"drop\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"compact\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"compact\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"flatten\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"flatten\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"without\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"without\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"uniq\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"uniq\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"unique\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"union\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"union\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"intersection\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"intersection\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"difference\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"difference\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"unzip\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"unzip\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"zip\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"object\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"object\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"findIndex\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"findIndex\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"findLastIndex\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"findLastIndex\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"sortedIndex\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"sortedIndex\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"indexOf\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"lastIndexOf\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"lastIndexOf\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"range\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"chunk\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"chunk\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"bind\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"bind\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"partial\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"partial\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"bindAll\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"bindAll\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"memoize\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"memoize\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"delay\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"delay\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"defer\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"defer\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"throttle\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"debounce\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"wrap\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"wrap\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"negate\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"negate\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"compose\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"after\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"after\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"before\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"before\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"once\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"once\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"keys\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"allKeys\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"allKeys\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"values\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"values\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"mapObject\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"mapObject\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"pairs\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"pairs\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"invert\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"invert\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"functions\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"functions\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"methods\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"methods\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"extend\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"extendOwn\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"extendOwn\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"assign\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"assign\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"findKey\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"findKey\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"pick\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"pick\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"omit\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"omit\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"defaults\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"defaults\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"create\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"clone\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"clone\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"tap\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"tap\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isMatch\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isMatch\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isEqual\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isEqual\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isEmpty\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isElement\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isElement\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isArray\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isObject\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isObject\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isArguments\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isArguments\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isFunction\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isString\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isNumber\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isDate\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isRegExp\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isError\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isError\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isSymbol\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isSymbol\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isMap\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isMap\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isWeakMap\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isWeakMap\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isSet\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isSet\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isWeakSet\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isWeakSet\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isFinite\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isFinite\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isNaN\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isNaN\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isBoolean\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isBoolean\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isNull\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isNull\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"isUndefined\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"isUndefined\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"has\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"has\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"identity\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"constant\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"constant\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"noop\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"property\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"propertyOf\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"propertyOf\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"matcher\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"matcher\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"matches\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"matches\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"times\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"times\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"random\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"random\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"now\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"now\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"escape\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"escape\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"unescape\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"unescape\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"result\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"result\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"uniqueId\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"uniqueId\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"templateSettings\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"templateSettings\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"template\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"template\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"chain\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"chain\"]; });\n/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, \"mixin\", function() { return __WEBPACK_IMPORTED_MODULE_1__index_js__[\"mixin\"]; });\n\n\n\n\n/***/ }),\n/* 726 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__index_js__ = __webpack_require__(244);\n\n\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = Object(__WEBPACK_IMPORTED_MODULE_0__index_js__[\"mixin\"])(__WEBPACK_IMPORTED_MODULE_0__index_js__);\n// Legacy Node.js API\n_._ = _;\n// Export the Underscore API.\n/* harmony default export */ __webpack_exports__[\"a\"] = (_);\n\n\n/***/ }),\n/* 727 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(728).default;\n\n\n/***/ }),\n/* 728 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _i18next = __webpack_require__(729);\n\nvar _i18next2 = _interopRequireDefault(_i18next);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _i18next2.default;\n\n/***/ }),\n/* 729 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = __webpack_require__(135);\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _ResourceStore = __webpack_require__(730);\n\nvar _ResourceStore2 = _interopRequireDefault(_ResourceStore);\n\nvar _Translator = __webpack_require__(731);\n\nvar _Translator2 = _interopRequireDefault(_Translator);\n\nvar _LanguageUtils = __webpack_require__(732);\n\nvar _LanguageUtils2 = _interopRequireDefault(_LanguageUtils);\n\nvar _PluralResolver = __webpack_require__(733);\n\nvar _PluralResolver2 = _interopRequireDefault(_PluralResolver);\n\nvar _Interpolator = __webpack_require__(734);\n\nvar _Interpolator2 = _interopRequireDefault(_Interpolator);\n\nvar _BackendConnector = __webpack_require__(735);\n\nvar _BackendConnector2 = _interopRequireDefault(_BackendConnector);\n\nvar _CacheConnector = __webpack_require__(736);\n\nvar _CacheConnector2 = _interopRequireDefault(_CacheConnector);\n\nvar _defaults2 = __webpack_require__(737);\n\nvar _postProcessor = __webpack_require__(352);\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = __webpack_require__(353);\n\nvar compat = _interopRequireWildcard(_v);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar I18n = function (_EventEmitter) {\n  _inherits(I18n, _EventEmitter);\n\n  function I18n() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    _classCallCheck(this, I18n);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.options = (0, _defaults2.transformOptions)(options);\n    _this.services = {};\n    _this.logger = _logger2.default;\n    _this.modules = {};\n\n    if (callback && !_this.isInitialized) _this.init(options, callback);\n    return _this;\n  }\n\n  I18n.prototype.init = function init(options, callback) {\n    var _this2 = this;\n\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.compatibilityAPI === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertAPIOptions(options)), {});\n    } else if (options.compatibilityJSON === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertJSONOptions(options)), {});\n    } else {\n      this.options = _extends({}, (0, _defaults2.get)(), this.options, (0, _defaults2.transformOptions)(options));\n    }\n    if (!callback) callback = function callback() {};\n\n    function createClassOnDemand(ClassOrObject) {\n      if (!ClassOrObject) return;\n      if (typeof ClassOrObject === 'function') return new ClassOrObject();\n      return ClassOrObject;\n    }\n\n    // init services\n    if (!this.options.isClone) {\n      if (this.modules.logger) {\n        _logger2.default.init(createClassOnDemand(this.modules.logger), this.options);\n      } else {\n        _logger2.default.init(null, this.options);\n      }\n\n      var lu = new _LanguageUtils2.default(this.options);\n      this.store = new _ResourceStore2.default(this.options.resources, this.options);\n\n      var s = this.services;\n      s.logger = _logger2.default;\n      s.resourceStore = this.store;\n      s.resourceStore.on('added removed', function (lng, ns) {\n        s.cacheConnector.save();\n      });\n      s.languageUtils = lu;\n      s.pluralResolver = new _PluralResolver2.default(lu, { prepend: this.options.pluralSeparator, compatibilityJSON: this.options.compatibilityJSON });\n      s.interpolator = new _Interpolator2.default(this.options);\n\n      s.backendConnector = new _BackendConnector2.default(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.backendConnector.on('*', function (event) {\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      s.backendConnector.on('loaded', function (loaded) {\n        s.cacheConnector.save();\n      });\n\n      s.cacheConnector = new _CacheConnector2.default(createClassOnDemand(this.modules.cache), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.cacheConnector.on('*', function (event) {\n        for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n          args[_key2 - 1] = arguments[_key2];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      if (this.modules.languageDetector) {\n        s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n        s.languageDetector.init(s, this.options.detection, this.options);\n      }\n\n      this.translator = new _Translator2.default(this.services, this.options);\n      // pipe events from translator\n      this.translator.on('*', function (event) {\n        for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n          args[_key3 - 1] = arguments[_key3];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n    }\n\n    // append api\n    var storeApi = ['getResource', 'addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle', 'hasResourceBundle', 'getResourceBundle'];\n    storeApi.forEach(function (fcName) {\n      _this2[fcName] = function () {\n        return this.store[fcName].apply(this.store, arguments);\n      };\n    });\n\n    // TODO: COMPATIBILITY remove this\n    if (this.options.compatibilityAPI === 'v1') compat.appendBackwardsAPI(this);\n\n    setTimeout(function () {\n      _this2.changeLanguage(_this2.options.lng, function (err, t) {\n        _this2.emit('initialized', _this2.options);\n        _this2.logger.log('initialized', _this2.options);\n\n        callback(err, t);\n      });\n    }, 10);\n\n    return this;\n  };\n\n  I18n.prototype.loadResources = function loadResources(callback) {\n    var _this3 = this;\n\n    if (!callback) callback = function callback() {};\n\n    if (!this.options.resources) {\n      var _ret = function () {\n        if (_this3.language && _this3.language.toLowerCase() === 'cimode') return {\n            v: callback()\n          }; // avoid loading resources for cimode\n\n        var toLoad = [];\n\n        var append = function append(lng) {\n          var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n          lngs.forEach(function (l) {\n            if (toLoad.indexOf(l) < 0) toLoad.push(l);\n          });\n        };\n\n        append(_this3.language);\n\n        if (_this3.options.preload) {\n          _this3.options.preload.forEach(function (l) {\n            append(l);\n          });\n        }\n\n        _this3.services.cacheConnector.load(toLoad, _this3.options.ns, function () {\n          _this3.services.backendConnector.load(toLoad, _this3.options.ns, callback);\n        });\n      }();\n\n      if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n    } else {\n      callback(null);\n    }\n  };\n\n  I18n.prototype.use = function use(module) {\n    if (module.type === 'backend') {\n      this.modules.backend = module;\n    }\n\n    if (module.type === 'cache') {\n      this.modules.cache = module;\n    }\n\n    if (module.type === 'logger' || module.log && module.warn && module.warn) {\n      this.modules.logger = module;\n    }\n\n    if (module.type === 'languageDetector') {\n      this.modules.languageDetector = module;\n    }\n\n    if (module.type === 'postProcessor') {\n      _postProcessor2.default.addPostProcessor(module);\n    }\n\n    return this;\n  };\n\n  I18n.prototype.changeLanguage = function changeLanguage(lng, callback) {\n    var _this4 = this;\n\n    var done = function done(err) {\n      if (lng) {\n        _this4.emit('languageChanged', lng);\n        _this4.logger.log('languageChanged', lng);\n      }\n\n      if (callback) callback(err, function () {\n        for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n          args[_key4] = arguments[_key4];\n        }\n\n        return _this4.t.apply(_this4, args);\n      });\n    };\n\n    if (!lng && this.services.languageDetector) lng = this.services.languageDetector.detect();\n\n    if (lng) {\n      this.language = lng;\n      this.languages = this.services.languageUtils.toResolveHierarchy(lng);\n\n      this.translator.changeLanguage(lng);\n\n      if (this.services.languageDetector) this.services.languageDetector.cacheUserLanguage(lng);\n    }\n\n    this.loadResources(function (err) {\n      done(err);\n    });\n  };\n\n  I18n.prototype.getFixedT = function getFixedT(lng, ns) {\n    var _this5 = this;\n\n    var fixedT = function fixedT(key, options) {\n      options = options || {};\n      options.lng = options.lng || fixedT.lng;\n      options.ns = options.ns || fixedT.ns;\n      return _this5.t(key, options);\n    };\n    fixedT.lng = lng;\n    fixedT.ns = ns;\n    return fixedT;\n  };\n\n  I18n.prototype.t = function t() {\n    return this.translator && this.translator.translate.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.exists = function exists() {\n    return this.translator && this.translator.exists.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.setDefaultNamespace = function setDefaultNamespace(ns) {\n    this.options.defaultNS = ns;\n  };\n\n  I18n.prototype.loadNamespaces = function loadNamespaces(ns, callback) {\n    var _this6 = this;\n\n    if (!this.options.ns) return callback && callback();\n    if (typeof ns === 'string') ns = [ns];\n\n    ns.forEach(function (n) {\n      if (_this6.options.ns.indexOf(n) < 0) _this6.options.ns.push(n);\n    });\n\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.loadLanguages = function loadLanguages(lngs, callback) {\n    if (typeof lngs === 'string') lngs = [lngs];\n    var preloaded = this.options.preload || [];\n\n    var newLngs = lngs.filter(function (lng) {\n      return preloaded.indexOf(lng) < 0;\n    });\n    // Exit early if all given languages are already preloaded\n    if (!newLngs.length) return callback();\n\n    this.options.preload = preloaded.concat(newLngs);\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.dir = function dir(lng) {\n    if (!lng) lng = this.language;\n\n    var ltrLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam'];\n\n    return ltrLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) ? 'ltr' : 'rtl';\n  };\n\n  I18n.prototype.createInstance = function createInstance() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    return new I18n(options, callback);\n  };\n\n  I18n.prototype.cloneInstance = function cloneInstance() {\n    var _this7 = this;\n\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    var clone = new I18n(_extends({}, options, this.options, { isClone: true }), callback);\n    var membersToCopy = ['store', 'translator', 'services', 'language'];\n    membersToCopy.forEach(function (m) {\n      clone[m] = _this7[m];\n    });\n\n    return clone;\n  };\n\n  return I18n;\n}(_EventEmitter3.default);\n\nexports.default = new I18n();\n\n/***/ }),\n/* 730 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _EventEmitter2 = __webpack_require__(135);\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _utils = __webpack_require__(136);\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar ResourceStore = function (_EventEmitter) {\n  _inherits(ResourceStore, _EventEmitter);\n\n  function ResourceStore() {\n    var data = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { ns: ['translation'], defaultNS: 'translation' } : arguments[1];\n\n    _classCallCheck(this, ResourceStore);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.data = data;\n    _this.options = options;\n    return _this;\n  }\n\n  ResourceStore.prototype.addNamespaces = function addNamespaces(ns) {\n    if (this.options.ns.indexOf(ns) < 0) {\n      this.options.ns.push(ns);\n    }\n  };\n\n  ResourceStore.prototype.removeNamespaces = function removeNamespaces(ns) {\n    var index = this.options.ns.indexOf(ns);\n    if (index > -1) {\n      this.options.ns.splice(index, 1);\n    }\n  };\n\n  ResourceStore.prototype.getResource = function getResource(lng, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    var keySeparator = options.keySeparator || this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key && typeof key !== 'string') path = path.concat(key);\n    if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n    }\n\n    return utils.getPath(this.data, path);\n  };\n\n  ResourceStore.prototype.addResource = function addResource(lng, ns, key, value) {\n    var options = arguments.length <= 4 || arguments[4] === undefined ? { silent: false } : arguments[4];\n\n    var keySeparator = this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      value = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    utils.setPath(this.data, path, value);\n\n    if (!options.silent) this.emit('added', lng, ns, key, value);\n  };\n\n  ResourceStore.prototype.addResources = function addResources(lng, ns, resources) {\n    for (var m in resources) {\n      if (typeof resources[m] === 'string') this.addResource(lng, ns, m, resources[m], { silent: true });\n    }\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.addResourceBundle = function addResourceBundle(lng, ns, resources, deep, overwrite) {\n    var path = [lng, ns];\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      deep = resources;\n      resources = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    var pack = utils.getPath(this.data, path) || {};\n\n    if (deep) {\n      utils.deepExtend(pack, resources, overwrite);\n    } else {\n      pack = _extends({}, pack, resources);\n    }\n\n    utils.setPath(this.data, path, pack);\n\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.removeResourceBundle = function removeResourceBundle(lng, ns) {\n    if (this.hasResourceBundle(lng, ns)) {\n      delete this.data[lng][ns];\n    }\n    this.removeNamespaces(ns);\n\n    this.emit('removed', lng, ns);\n  };\n\n  ResourceStore.prototype.hasResourceBundle = function hasResourceBundle(lng, ns) {\n    return this.getResource(lng, ns) !== undefined;\n  };\n\n  ResourceStore.prototype.getResourceBundle = function getResourceBundle(lng, ns) {\n    if (!ns) ns = this.options.defaultNS;\n\n    // TODO: COMPATIBILITY remove extend in v2.1.0\n    if (this.options.compatibilityAPI === 'v1') return _extends({}, this.getResource(lng, ns));\n\n    return this.getResource(lng, ns);\n  };\n\n  ResourceStore.prototype.toJSON = function toJSON() {\n    return this.data;\n  };\n\n  return ResourceStore;\n}(_EventEmitter3.default);\n\nexports.default = ResourceStore;\n\n/***/ }),\n/* 731 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = __webpack_require__(135);\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _postProcessor = __webpack_require__(352);\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = __webpack_require__(353);\n\nvar compat = _interopRequireWildcard(_v);\n\nvar _utils = __webpack_require__(136);\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Translator = function (_EventEmitter) {\n  _inherits(Translator, _EventEmitter);\n\n  function Translator(services) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Translator);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    utils.copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector'], services, _this);\n\n    _this.options = options;\n    _this.logger = _logger2.default.create('translator');\n    return _this;\n  }\n\n  Translator.prototype.changeLanguage = function changeLanguage(lng) {\n    if (lng) this.language = lng;\n  };\n\n  Translator.prototype.exists = function exists(key) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { interpolation: {} } : arguments[1];\n\n    if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    return this.resolve(key, options) !== undefined;\n  };\n\n  Translator.prototype.extractFromKey = function extractFromKey(key, options) {\n    var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n    if (nsSeparator === undefined) nsSeparator = ':';\n\n    var namespaces = options.ns || this.options.defaultNS;\n    if (nsSeparator && key.indexOf(nsSeparator) > -1) {\n      var parts = key.split(nsSeparator);\n      namespaces = parts[0];\n      key = parts[1];\n    }\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    return {\n      key: key,\n      namespaces: namespaces\n    };\n  };\n\n  Translator.prototype.translate = function translate(keys) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {\n      options = this.options.overloadTranslationOptionHandler(arguments);\n    } else if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    // non valid keys handling\n    if (keys === undefined || keys === null || keys === '') return '';\n    if (typeof keys === 'number') keys = String(keys);\n    if (typeof keys === 'string') keys = [keys];\n\n    // return key on CIMode\n    var lng = options.lng || this.language;\n    if (lng && lng.toLowerCase() === 'cimode') return keys[keys.length - 1];\n\n    // separators\n    var keySeparator = options.keySeparator || this.options.keySeparator || '.';\n\n    // get namespace(s)\n\n    var _extractFromKey = this.extractFromKey(keys[keys.length - 1], options);\n\n    var key = _extractFromKey.key;\n    var namespaces = _extractFromKey.namespaces;\n\n    var namespace = namespaces[namespaces.length - 1];\n\n    // resolve from store\n    var res = this.resolve(keys, options);\n\n    var resType = Object.prototype.toString.apply(res);\n    var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n    var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n\n    // object\n    if (res && typeof res !== 'string' && noObject.indexOf(resType) < 0 && !(joinArrays && resType === '[object Array]')) {\n      if (!options.returnObjects && !this.options.returnObjects) {\n        this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n        return this.options.returnedObjectHandler ? this.options.returnedObjectHandler(key, res, options) : 'key \\'' + key + ' (' + this.language + ')\\' returned an object instead of string.';\n      }\n\n      var copy = resType === '[object Array]' ? [] : {}; // apply child translation on a copy\n\n      for (var m in res) {\n        copy[m] = this.translate('' + key + keySeparator + m, _extends({ joinArrays: false, ns: namespaces }, options));\n      }\n      res = copy;\n    }\n    // array special treatment\n    else if (joinArrays && resType === '[object Array]') {\n        res = res.join(joinArrays);\n        if (res) res = this.extendTranslation(res, key, options);\n      }\n      // string, empty or null\n      else {\n          var usedDefault = false,\n              usedKey = false;\n\n          // fallback value\n          if (!this.isValidLookup(res) && options.defaultValue) {\n            usedDefault = true;\n            res = options.defaultValue;\n          }\n          if (!this.isValidLookup(res)) {\n            usedKey = true;\n            res = key;\n          }\n\n          // save missing\n          if (usedKey || usedDefault) {\n            this.logger.log('missingKey', lng, namespace, key, res);\n\n            if (this.options.saveMissing) {\n              var lngs = [];\n              if (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng && this.options.fallbackLng[0]) {\n                for (var i = 0; i < this.options.fallbackLng.length; i++) {\n                  lngs.push(this.options.fallbackLng[i]);\n                }\n              } else if (this.options.saveMissingTo === 'all') {\n                lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n              } else {\n                //(this.options.saveMissingTo === 'current' || (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng[0] === false) ) {\n                lngs.push(options.lng || this.language);\n              }\n\n              if (this.options.missingKeyHandler) {\n                this.options.missingKeyHandler(lngs, namespace, key, res);\n              } else if (this.backendConnector && this.backendConnector.saveMissing) {\n                this.backendConnector.saveMissing(lngs, namespace, key, res);\n              }\n\n              this.emit('missingKey', lngs, namespace, key, res);\n            }\n          }\n\n          // extend\n          res = this.extendTranslation(res, key, options);\n\n          // append namespace if still key\n          if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = namespace + ':' + key;\n\n          // parseMissingKeyHandler\n          if (usedKey && this.options.parseMissingKeyHandler) res = this.options.parseMissingKeyHandler(res);\n        }\n\n    // return\n    return res;\n  };\n\n  Translator.prototype.extendTranslation = function extendTranslation(res, key, options) {\n    var _this2 = this;\n\n    if (options.interpolation) this.interpolator.init(options);\n\n    // interpolate\n    var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n    if (this.options.interpolation.defaultVariables) data = _extends({}, this.options.interpolation.defaultVariables, data);\n    res = this.interpolator.interpolate(res, data);\n\n    // nesting\n    res = this.interpolator.nest(res, function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this2.translate.apply(_this2, args);\n    }, options);\n\n    if (options.interpolation) this.interpolator.reset();\n\n    // post process\n    var postProcess = options.postProcess || this.options.postProcess;\n    var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n    if (res !== undefined && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n      res = _postProcessor2.default.handle(postProcessorNames, res, key, options, this);\n    }\n\n    return res;\n  };\n\n  Translator.prototype.resolve = function resolve(keys) {\n    var _this3 = this;\n\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var found = void 0;\n\n    if (typeof keys === 'string') keys = [keys];\n\n    // forEach possible key\n    keys.forEach(function (k) {\n      if (_this3.isValidLookup(found)) return;\n\n      var _extractFromKey2 = _this3.extractFromKey(k, options);\n\n      var key = _extractFromKey2.key;\n      var namespaces = _extractFromKey2.namespaces;\n\n      if (_this3.options.fallbackNS) namespaces = namespaces.concat(_this3.options.fallbackNS);\n\n      var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n      var needsContextHandling = options.context !== undefined && typeof options.context === 'string' && options.context !== '';\n\n      var codes = options.lngs ? options.lngs : _this3.languageUtils.toResolveHierarchy(options.lng || _this3.language);\n\n      namespaces.forEach(function (ns) {\n        if (_this3.isValidLookup(found)) return;\n\n        codes.forEach(function (code) {\n          if (_this3.isValidLookup(found)) return;\n\n          var finalKey = key;\n          var finalKeys = [finalKey];\n\n          var pluralSuffix = void 0;\n          if (needsPluralHandling) pluralSuffix = _this3.pluralResolver.getSuffix(code, options.count);\n\n          // fallback for plural if context not found\n          if (needsPluralHandling && needsContextHandling) finalKeys.push(finalKey + pluralSuffix);\n\n          // get key for context if needed\n          if (needsContextHandling) finalKeys.push(finalKey += '' + _this3.options.contextSeparator + options.context);\n\n          // get key for plural if needed\n          if (needsPluralHandling) finalKeys.push(finalKey += pluralSuffix);\n\n          // iterate over finalKeys starting with most specific pluralkey (-> contextkey only) -> singularkey only\n          var possibleKey = void 0;\n          while (possibleKey = finalKeys.pop()) {\n            if (_this3.isValidLookup(found)) continue;\n            found = _this3.getResource(code, ns, possibleKey, options);\n          }\n        });\n      });\n    });\n\n    return found;\n  };\n\n  Translator.prototype.isValidLookup = function isValidLookup(res) {\n    return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n  };\n\n  Translator.prototype.getResource = function getResource(code, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    return this.resourceStore.getResource(code, ns, key, options);\n  };\n\n  return Translator;\n}(_EventEmitter3.default);\n\nexports.default = Translator;\n\n/***/ }),\n/* 732 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction capitalize(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n  function LanguageUtil(options) {\n    _classCallCheck(this, LanguageUtil);\n\n    this.options = options;\n\n    this.whitelist = this.options.whitelist || false;\n    this.logger = _logger2.default.create('languageUtils');\n  }\n\n  LanguageUtil.prototype.getLanguagePartFromCode = function getLanguagePartFromCode(code) {\n    if (code.indexOf('-') < 0) return code;\n\n    var specialCases = ['NB-NO', 'NN-NO', 'nb-NO', 'nn-NO', 'nb-no', 'nn-no'];\n    var p = code.split('-');\n    return this.formatLanguageCode(specialCases.indexOf(code) > -1 ? p[1].toLowerCase() : p[0]);\n  };\n\n  LanguageUtil.prototype.formatLanguageCode = function formatLanguageCode(code) {\n    // http://www.iana.org/assignments/language-tags/language-tags.xhtml\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n      var p = code.split('-');\n\n      if (this.options.lowerCaseLng) {\n        p = p.map(function (part) {\n          return part.toLowerCase();\n        });\n      } else if (p.length === 2) {\n        p[0] = p[0].toLowerCase();\n        p[1] = p[1].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n      } else if (p.length === 3) {\n        p[0] = p[0].toLowerCase();\n\n        // if lenght 2 guess it's a country\n        if (p[1].length === 2) p[1] = p[1].toUpperCase();\n        if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n        if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n      }\n\n      return p.join('-');\n    } else {\n      return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n    }\n  };\n\n  LanguageUtil.prototype.isWhitelisted = function isWhitelisted(code) {\n    if (this.options.load === 'languageOnly') code = this.getLanguagePartFromCode(code);\n    return !this.whitelist || !this.whitelist.length || this.whitelist.indexOf(code) > -1 ? true : false;\n  };\n\n  LanguageUtil.prototype.toResolveHierarchy = function toResolveHierarchy(code, fallbackCode) {\n    var _this = this;\n\n    fallbackCode = fallbackCode || this.options.fallbackLng || [];\n    if (typeof fallbackCode === 'string') fallbackCode = [fallbackCode];\n\n    var codes = [];\n    var addCode = function addCode(code) {\n      if (_this.isWhitelisted(code)) {\n        codes.push(code);\n      } else {\n        _this.logger.warn('rejecting non-whitelisted language code: ' + code);\n      }\n    };\n\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n      if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n    } else if (typeof code === 'string') {\n      addCode(this.formatLanguageCode(code));\n    }\n\n    fallbackCode.forEach(function (fc) {\n      if (codes.indexOf(fc) < 0) addCode(_this.formatLanguageCode(fc));\n    });\n\n    return codes;\n  };\n\n  return LanguageUtil;\n}();\n\n;\n\nexports.default = LanguageUtil;\n\n/***/ }),\n/* 733 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// definition http://translate.sourceforge.net/wiki/l10n/pluralforms\n/* eslint-disable */\nvar sets = [{ lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'tg', 'ti', 'tr', 'uz', 'wa'], nr: [1, 2], fc: 1 }, { lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'es_ar', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'he', 'hi', 'hu', 'hy', 'ia', 'it', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt', 'pt_br', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], nr: [1, 2], fc: 2 }, { lngs: ['ay', 'bo', 'cgg', 'fa', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], nr: [1], fc: 3 }, { lngs: ['be', 'bs', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 }, { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 }, { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 }, { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 }, { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 }, { lngs: ['fr'], nr: [1, 2], fc: 9 }, { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 }, { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 }, { lngs: ['is'], nr: [1, 2], fc: 12 }, { lngs: ['jv'], nr: [0, 1], fc: 13 }, { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 }, { lngs: ['lt'], nr: [1, 2, 10], fc: 15 }, { lngs: ['lv'], nr: [1, 2, 0], fc: 16 }, { lngs: ['mk'], nr: [1, 2], fc: 17 }, { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 }, { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 }, { lngs: ['or'], nr: [2, 1], fc: 2 }, { lngs: ['ro'], nr: [1, 2, 20], fc: 20 }, { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 }];\n\nvar _rulesPluralsTypes = {\n  1: function _(n) {\n    return Number(n > 1);\n  },\n  2: function _(n) {\n    return Number(n != 1);\n  },\n  3: function _(n) {\n    return 0;\n  },\n  4: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  5: function _(n) {\n    return Number(n === 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n  },\n  6: function _(n) {\n    return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n  },\n  7: function _(n) {\n    return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  8: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n  },\n  9: function _(n) {\n    return Number(n >= 2);\n  },\n  10: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n  },\n  11: function _(n) {\n    return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n  },\n  12: function _(n) {\n    return Number(n % 10 != 1 || n % 100 == 11);\n  },\n  13: function _(n) {\n    return Number(n !== 0);\n  },\n  14: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n  },\n  15: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  16: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n  },\n  17: function _(n) {\n    return Number(n == 1 || n % 10 == 1 ? 0 : 1);\n  },\n  18: function _(n) {\n    return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n  },\n  19: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n  },\n  20: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n  },\n  21: function _(n) {\n    return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n  }\n};\n/* eslint-enable */\n\nfunction createRules() {\n  var l,\n      rules = {};\n  sets.forEach(function (set) {\n    set.lngs.forEach(function (l) {\n      return rules[l] = {\n        numbers: set.nr,\n        plurals: _rulesPluralsTypes[set.fc]\n      };\n    });\n  });\n  return rules;\n}\n\nvar PluralResolver = function () {\n  function PluralResolver(languageUtils) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, PluralResolver);\n\n    this.languageUtils = languageUtils;\n    this.options = options;\n\n    this.logger = _logger2.default.create('pluralResolver');\n\n    this.rules = createRules();\n  }\n\n  PluralResolver.prototype.addRule = function addRule(lng, obj) {\n    this.rules[lng] = obj;\n  };\n\n  PluralResolver.prototype.getRule = function getRule(code) {\n    return this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n  };\n\n  PluralResolver.prototype.needsPlural = function needsPlural(code) {\n    var rule = this.getRule(code);\n\n    return rule && rule.numbers.length <= 1 ? false : true;\n  };\n\n  PluralResolver.prototype.getSuffix = function getSuffix(code, count) {\n    var rule = this.getRule(code);\n\n    if (rule) {\n      if (rule.numbers.length === 1) return ''; // only singular\n\n      var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n      var suffix = rule.numbers[idx];\n\n      // special treatment for lngs only having singular and plural\n      if (rule.numbers.length === 2 && rule.numbers[0] === 1) {\n        if (suffix === 2) {\n          suffix = 'plural';\n        } else if (suffix === 1) {\n          suffix = '';\n        }\n      }\n\n      // COMPATIBILITY JSON\n      if (this.options.compatibilityJSON === 'v1') {\n        if (suffix === 1) return '';\n        if (typeof suffix === 'number') return '_plural_' + suffix.toString();\n      }\n\n      return this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString();\n    } else {\n      this.logger.warn('no plural rule found for: ' + code);\n      return '';\n    }\n  };\n\n  return PluralResolver;\n}();\n\n;\n\nexports.default = PluralResolver;\n\n/***/ }),\n/* 734 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _utils = __webpack_require__(136);\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Interpolator = function () {\n  function Interpolator() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    _classCallCheck(this, Interpolator);\n\n    this.logger = _logger2.default.create('interpolator');\n\n    this.init(options, true);\n  }\n\n  Interpolator.prototype.init = function init() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var reset = arguments[1];\n\n    if (reset) this.options = options;\n    if (!options.interpolation) options.interpolation = { escapeValue: true };\n\n    var iOpts = options.interpolation;\n\n    this.escapeValue = iOpts.escapeValue;\n\n    this.prefix = iOpts.prefix ? utils.regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n    this.suffix = iOpts.suffix ? utils.regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n\n    this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n    this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n\n    this.nestingPrefix = iOpts.nestingPrefix ? utils.regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || utils.regexEscape('$t(');\n    this.nestingSuffix = iOpts.nestingSuffix ? utils.regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || utils.regexEscape(')');\n\n    // the regexp\n    var regexpStr = this.prefix + '(.+?)' + this.suffix;\n    this.regexp = new RegExp(regexpStr, 'g');\n\n    var regexpUnescapeStr = this.prefix + this.unescapePrefix + '(.+?)' + this.unescapeSuffix + this.suffix;\n    this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n\n    var nestingRegexpStr = this.nestingPrefix + '(.+?)' + this.nestingSuffix;\n    this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n  };\n\n  Interpolator.prototype.reset = function reset() {\n    if (this.options) this.init(this.options);\n  };\n\n  Interpolator.prototype.interpolate = function interpolate(str, data) {\n    var match = void 0,\n        value = void 0;\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    // unescape if has unescapePrefix/Suffix\n    while (match = this.regexpUnescape.exec(str)) {\n      var _value = utils.getPath(data, match[1].trim());\n      str = str.replace(match[0], _value);\n    }\n\n    // regular escape on demand\n    while (match = this.regexp.exec(str)) {\n      value = utils.getPath(data, match[1].trim());\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  Interpolator.prototype.nest = function nest(str, fc) {\n    var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n    var match = void 0,\n        value = void 0;\n\n    var clonedOptions = JSON.parse(JSON.stringify(options));\n    clonedOptions.applyPostProcessor = false; // avoid post processing on nested lookup\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    // if value is something like \"myKey\": \"lorem $(anotherKey, { \"count\": {{aValueInOptions}} })\"\n    function handleHasOptions(key) {\n      if (key.indexOf(',') < 0) return key;\n\n      var p = key.split(',');\n      key = p.shift();\n      var optionsString = p.join(',');\n      optionsString = this.interpolate(optionsString, clonedOptions);\n\n      try {\n        clonedOptions = JSON.parse(optionsString);\n      } catch (e) {\n        this.logger.error('failed parsing options string in nesting for key ' + key, e);\n      }\n\n      return key;\n    }\n\n    // regular escape on demand\n    while (match = this.nestingRegexp.exec(str)) {\n      value = fc(handleHasOptions.call(this, match[1].trim()), clonedOptions);\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  return Interpolator;\n}();\n\nexports.default = Interpolator;\n\n/***/ }),\n/* 735 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _utils = __webpack_require__(136);\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = __webpack_require__(135);\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nfunction remove(arr, what) {\n  var found = arr.indexOf(what);\n\n  while (found !== -1) {\n    arr.splice(found, 1);\n    found = arr.indexOf(what);\n  }\n}\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(backend, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.backend = backend;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('backendConnector');\n\n    _this.state = {};\n    _this.queue = [];\n\n    _this.backend && _this.backend.init && _this.backend.init(services, options.backend, options);\n    return _this;\n  }\n\n  Connector.prototype.queueLoad = function queueLoad(languages, namespaces, callback) {\n    var _this2 = this;\n\n    // find what needs to be loaded\n    var toLoad = [],\n        pending = [],\n        toLoadLanguages = [],\n        toLoadNamespaces = [];\n\n    languages.forEach(function (lng) {\n      var hasAllNamespaces = true;\n\n      namespaces.forEach(function (ns) {\n        var name = lng + '|' + ns;\n\n        if (_this2.store.hasResourceBundle(lng, ns)) {\n          _this2.state[name] = 2; // loaded\n        } else if (_this2.state[name] < 0) {\n            // nothing to do for err\n          } else if (_this2.state[name] === 1) {\n              if (pending.indexOf(name) < 0) pending.push(name);\n            } else {\n              _this2.state[name] = 1; // pending\n\n              hasAllNamespaces = false;\n\n              if (pending.indexOf(name) < 0) pending.push(name);\n              if (toLoad.indexOf(name) < 0) toLoad.push(name);\n              if (toLoadNamespaces.indexOf(ns) < 0) toLoadNamespaces.push(ns);\n            }\n      });\n\n      if (!hasAllNamespaces) toLoadLanguages.push(lng);\n    });\n\n    if (toLoad.length || pending.length) {\n      this.queue.push({\n        pending: pending,\n        loaded: {},\n        errors: [],\n        callback: callback\n      });\n    }\n\n    return {\n      toLoad: toLoad,\n      pending: pending,\n      toLoadLanguages: toLoadLanguages,\n      toLoadNamespaces: toLoadNamespaces\n    };\n  };\n\n  Connector.prototype.loaded = function loaded(name, err, data) {\n    var _this3 = this;\n\n    var _name$split = name.split('|');\n\n    var _name$split2 = _slicedToArray(_name$split, 2);\n\n    var lng = _name$split2[0];\n    var ns = _name$split2[1];\n\n\n    if (err) this.emit('failedLoading', lng, ns, err);\n\n    if (data) {\n      this.store.addResourceBundle(lng, ns, data);\n    }\n\n    // set loaded\n    this.state[name] = err ? -1 : 2;\n    // callback if ready\n    this.queue.forEach(function (q) {\n      utils.pushPath(q.loaded, [lng], ns);\n      remove(q.pending, name);\n\n      if (err) q.errors.push(err);\n\n      if (q.pending.length === 0 && !q.done) {\n        q.errors.length ? q.callback(q.errors) : q.callback();\n        _this3.emit('loaded', q.loaded);\n        q.done = true;\n      }\n    });\n\n    // remove done load requests\n    this.queue = this.queue.filter(function (q) {\n      return !q.done;\n    });\n  };\n\n  Connector.prototype.read = function read(lng, ns, fcName, tried, wait, callback) {\n    var _this4 = this;\n\n    if (!tried) tried = 0;\n    if (!wait) wait = 250;\n\n    if (!lng.length) return callback(null, {}); // noting to load\n\n    this.backend[fcName](lng, ns, function (err, data) {\n      if (err && data /* = retryFlag */ && tried < 5) {\n        setTimeout(function () {\n          _this4.read.call(_this4, lng, ns, fcName, ++tried, wait * 2, callback);\n        }, wait);\n        return;\n      }\n      callback(err, data);\n    });\n  };\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this5 = this;\n\n    if (!this.backend) {\n      this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n      return callback && callback();\n    }\n    var options = _extends({}, this.backend.options, this.options.backend);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    var toLoad = this.queueLoad(languages, namespaces, callback);\n    if (!toLoad.toLoad.length) {\n      if (!toLoad.pending.length) callback(); // nothing to load and no pendings...callback now\n      return; // pendings will trigger callback\n    }\n\n    // load with multi-load\n    if (options.allowMultiLoading && this.backend.readMulti) {\n      this.read(toLoad.toLoadLanguages, toLoad.toLoadNamespaces, 'readMulti', null, null, function (err, data) {\n        if (err) _this5.logger.warn('loading namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading failed', err);\n        if (!err && data) _this5.logger.log('loaded namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading', data);\n\n        toLoad.toLoad.forEach(function (name) {\n          var _name$split3 = name.split('|');\n\n          var _name$split4 = _slicedToArray(_name$split3, 2);\n\n          var l = _name$split4[0];\n          var n = _name$split4[1];\n\n\n          var bundle = utils.getPath(data, [l, n]);\n          if (bundle) {\n            _this5.loaded(name, err, bundle);\n          } else {\n            var _err = 'loading namespace ' + n + ' for language ' + l + ' via multiloading failed';\n            _this5.loaded(name, _err);\n            _this5.logger.error(_err);\n          }\n        });\n      });\n    }\n\n    // load one by one\n    else {\n        (function () {\n          var read = function read(name) {\n            var _this6 = this;\n\n            var _name$split5 = name.split('|');\n\n            var _name$split6 = _slicedToArray(_name$split5, 2);\n\n            var lng = _name$split6[0];\n            var ns = _name$split6[1];\n\n\n            this.read(lng, ns, 'read', null, null, function (err, data) {\n              if (err) _this6.logger.warn('loading namespace ' + ns + ' for language ' + lng + ' failed', err);\n              if (!err && data) _this6.logger.log('loaded namespace ' + ns + ' for language ' + lng, data);\n\n              _this6.loaded(name, err, data);\n            });\n          };\n\n          ;\n\n          toLoad.toLoad.forEach(function (name) {\n            read.call(_this5, name);\n          });\n        })();\n      }\n  };\n\n  Connector.prototype.saveMissing = function saveMissing(languages, namespace, key, fallbackValue) {\n    if (this.backend && this.backend.create) this.backend.create(languages, namespace, key, fallbackValue);\n\n    // write to store to avoid resending\n    this.store.addResource(languages[0], namespace, key, fallbackValue);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n\n/***/ }),\n/* 736 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = __webpack_require__(136);\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = __webpack_require__(86);\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = __webpack_require__(135);\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(cache, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.cache = cache;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('cacheConnector');\n\n    _this.cache && _this.cache.init && _this.cache.init(services, options.cache, options);\n    return _this;\n  }\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this2 = this;\n\n    if (!this.cache) return callback && callback();\n    var options = _extends({}, this.cache.options, this.options.cache);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    if (options.enabled) {\n      this.cache.load(languages, function (err, data) {\n        if (err) _this2.logger.error('loading languages ' + languages.join(', ') + ' from cache failed', err);\n        if (data) {\n          for (var l in data) {\n            for (var n in data[l]) {\n              if (n === 'i18nStamp') continue;\n              var bundle = data[l][n];\n              if (bundle) _this2.store.addResourceBundle(l, n, bundle);\n            }\n          }\n        }\n        if (callback) callback();\n      });\n    } else {\n      if (callback) callback();\n    }\n  };\n\n  Connector.prototype.save = function save() {\n    if (this.cache && this.options.cache && this.options.cache.enabled) this.cache.save(this.store.data);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n\n/***/ }),\n/* 737 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.get = get;\nexports.transformOptions = transformOptions;\nfunction get() {\n  return {\n    debug: false,\n\n    ns: ['translation'],\n    defaultNS: ['translation'],\n    fallbackLng: ['dev'],\n    fallbackNS: false, // string or array of namespaces\n\n    whitelist: false, // array with whitelisted languages\n    load: 'all', // | currentOnly | languageOnly\n    preload: false, // array with preload languages\n\n    keySeparator: '.',\n    nsSeparator: ':',\n    pluralSeparator: '_',\n    contextSeparator: '_',\n\n    saveMissing: false, // enable to send missing values\n    saveMissingTo: 'fallback', // 'current' || 'all'\n    missingKeyHandler: false, // function(lng, ns, key, fallbackValue) -> override if prefer on handling\n\n    postProcess: false, // string or array of postProcessor names\n    returnNull: true, // allows null value as valid translation\n    returnEmptyString: true, // allows empty string value as valid translation\n    returnObjects: false,\n    joinArrays: false, // or string to join array\n    returnedObjectHandler: function returnedObjectHandler() {}, // function(key, value, options) triggered if key returns object but returnObjects is set to false\n    parseMissingKeyHandler: false, // function(key) parsed a key that was not found in t() before returning\n    appendNamespaceToMissingKey: false,\n    overloadTranslationOptionHandler: function overloadTranslationOptionHandler(args) {\n      return { defaultValue: args[1] };\n    },\n\n    interpolation: {\n      escapeValue: true,\n      prefix: '{{',\n      suffix: '}}',\n      // prefixEscaped: '{{',\n      // suffixEscaped: '}}',\n      // unescapeSuffix: '',\n      unescapePrefix: '-',\n\n      nestingPrefix: '$t(',\n      nestingSuffix: ')',\n      // nestingPrefixEscaped: '$t(',\n      // nestingSuffixEscaped: ')',\n      defaultVariables: undefined // object that can have values to interpolate on - extends passed in interpolation data\n    }\n  };\n}\n\nfunction transformOptions(options) {\n  // create namespace object if namespace is passed in as string\n  if (typeof options.ns === 'string') options.ns = [options.ns];\n  if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n  if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n  // extend whitelist with cimode\n  if (options.whitelist && options.whitelist.indexOf('cimode') < 0) options.whitelist.push('cimode');\n\n  return options;\n}\n\n/***/ }),\n/* 738 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"components\":{\"FilterPanel\":{\"searchPlaceholder\":\"Filtrar\"}},\"strings\":{\"placeholders\":{\"search_in_table\":\"Buscar en la tabla\"},\"accountTypeBreakdowns\":{\"revenues\":\"Tipo de ingresos\",\"expenses\":\"Tipo de gasto\",\"assets\":\"Tipo de activo\",\"liabilities\":\"La responsabilidad y la equidad Tipo\",\"revAndExp\":\"Los ingresos y gastos Tipo\",\"assetAndLiability\":\"Activos, Responsabilidad & Equidad\",\"fteCount\":\"FTE Tipo Conde\"},\"accountTypeCategories\":{\"revenues\":\"Ingresos\",\"expenses\":\"Gastos\",\"assets\":\"Activos\",\"liabilities\":\"Responsabilidad & Equidad\",\"revAndExp\":\"Ingresos & Gastos\",\"assetAndLiability\":\"Activos, Responsabilidad & Equidad\"},\"tableTotalFooters\":{\"variance\":\"Varianza\",\"revLessExp\":\"Los ingresos menos gastos\",\"total\":\"Total\",\"balanceSheet\":\"Calculated Change in Fund Balance / Net Assets\"},\"versusViews\":{\"balanceSheet\":\"Hoja de balance\",\"revenuesVersusExpenses\":\"Los ingresos frente a los gastos\"},\"graph\":{\"types\":{\"table\":\"Ver Tabla\",\"line\":\"Gráfico de líneas\",\"stacked\":\"Gráfico apilado\",\"horizontal_stacked\":\"Gráfico apilado Horizonal\",\"percentage\":\"Gráfico porcentaje\",\"pie\":\"Gráfico de torta\",\"bar\":\"Gráfico de barras\",\"treemap\":\"Treemap\",\"map\":\"Mapa\"}},\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]}}\n\n/***/ }),\n/* 739 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"components\":{\"FilterPanel\":{\"searchPlaceholder\":\"Filter\"}},\"strings\":{\"placeholders\":{\"search_in_table\":\"Search in table\"},\"accountTypeBreakdowns\":{\"revenues\":\"Revenue Type\",\"expenses\":\"Expense Type\",\"assets\":\"Asset Type\",\"liabilities\":\"Liability & Equity Type\",\"revAndExp\":\"Revenue & Expense Type\",\"assetAndLiability\":\"Assets, Liabilities & Equities\",\"fteCount\":\"FTE Count Type\"},\"accountTypeCategories\":{\"revenues\":\"Revenues\",\"expenses\":\"Expenses\",\"assets\":\"Assets\",\"liabilities\":\"Liabilities & Equities\",\"revAndExp\":\"Revenues & Expenses\",\"assetAndLiability\":\"Assets, Liabilities & Equities\"},\"tableTotalFooters\":{\"variance\":\"Variance\",\"revLessExp\":\"Revenues Less Expenses\",\"total\":\"Total\",\"balanceSheet\":\"Calculated Change in Fund Balance / Net Assets\"},\"versusViews\":{\"balanceSheet\":\"Balance Sheet\",\"revenuesVersusExpenses\":\"Revenues vs Expenses\"},\"graph\":{\"types\":{\"table\":\"Table View\",\"line\":\"Line Graph\",\"stacked\":\"Stacked Graph\",\"horizontal_stacked\":\"Horizontal Stacked Chart\",\"percentage\":\"Percentage Graph\",\"pie\":\"Pie Graph\",\"bar\":\"Bar Graph\",\"treemap\":\"Treemap\",\"map\":\"Map\"}},\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]}}\n\n/***/ }),\n/* 740 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.externalRoutes = exports.internalRoutes = undefined;\nexports.createRouter = createRouter;\nexports.createRunCallback = createRunCallback;\nexports.getControlPanelPropsFromState = getControlPanelPropsFromState;\nexports.createStandalonePropExtractor = createStandalonePropExtractor;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _reactRouter = __webpack_require__(178);\n\nvar _reactRouter2 = _interopRequireDefault(_reactRouter);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _entity_actions = __webpack_require__(251);\n\nvar _entity_actions2 = _interopRequireDefault(_entity_actions);\n\nvar _report_app = __webpack_require__(823);\n\nvar _report_app2 = _interopRequireDefault(_report_app);\n\nvar _report_index = __webpack_require__(825);\n\nvar _report_index2 = _interopRequireDefault(_report_index);\n\nvar _report_view = __webpack_require__(925);\n\nvar _report_view2 = _interopRequireDefault(_report_view);\n\nvar _story_view = __webpack_require__(1592);\n\nvar _story_view2 = _interopRequireDefault(_story_view);\n\nvar _entity = __webpack_require__(501);\n\nvar _entity2 = _interopRequireDefault(_entity);\n\nvar _reports = __webpack_require__(140);\n\nvar _reports2 = _interopRequireDefault(_reports);\n\nvar _reactI18next = __webpack_require__(148);\n\nvar _i18n = __webpack_require__(176);\n\nvar _i18n2 = _interopRequireDefault(_i18n);\n\nvar _report_utils = __webpack_require__(1594);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// as we build ourself via webpack\nvar internalRoutes = exports.internalRoutes = _react2.default.createElement(_reactRouter.Route, { path: \"/:entity?\", handler: _report_app2.default, ignoreScrollBehavior: true }, _react2.default.createElement(_reactRouter.DefaultRoute, { name: \"report-index\", handler: _report_index2.default }), _react2.default.createElement(_reactRouter.Redirect, { path: \"reports\", to: \"report-index\" }), _react2.default.createElement(_reactRouter.Redirect, { path: \"reports/:report\", to: \"report\" }), _react2.default.createElement(_reactRouter.Redirect, { path: \"reports/:report/:reportParams?\", to: \"reportWithParams\" }), _react2.default.createElement(_reactRouter.Route, { name: \"new\", handler: _report_view2.default }), _react2.default.createElement(_reactRouter.Route, { name: \"report\", path: \":report\", handler: _report_view2.default }), _react2.default.createElement(_reactRouter.Route, { name: \"reportWithParams\", path: \":report/:reportParams?\", handler: _report_view2.default }));\nvar externalRoutes = exports.externalRoutes = _react2.default.createElement(_reactRouter.Route, { ignoreScrollBehavior: true }, _react2.default.createElement(_reactRouter.DefaultRoute, { handler: _report_view2.default }), _react2.default.createElement(_reactRouter.Route, { path: \"/stories/:storyId\", handler: _story_view2.default }), _react2.default.createElement(_reactRouter.Route, { path: \"/:reportId\", handler: _report_view2.default }), _react2.default.createElement(_reactRouter.Route, { path: \"/:reportId/:reportParams?\", handler: _report_view2.default }));\nfunction createRouter(routes) {\n    return _reactRouter2.default.create({\n        routes: routes,\n        onError: function onError(err) {\n            console.log(err);\n        }\n    });\n}\nfunction createRunCallback(router, targetElement, getPropsFromState) {\n    return function (Root, state) {\n        var propsForRoot = getPropsFromState(state, router);\n        _reactDom2.default.render(_react2.default.createElement(_reactI18next.I18nextProvider, { i18n: _i18n2.default }, _react2.default.createElement(Root, Object.assign({}, propsForRoot))), targetElement);\n    };\n}\n/**\r\n* this function is called for control_panel.js\r\n*/\nfunction getControlPanelPropsFromState(state) {\n    if (state.params.entity) {\n        _entity_actions2.default.selectedById(state.params.entity);\n    }\n    return {\n        routes: state.params.routes,\n        translation: false,\n        reportParams: state.params.reportParams\n    };\n}\n/**\r\n* this function is only called for standalone.js\r\n*/\nfunction createStandalonePropExtractor() {\n    var entity = new _entity2.default(gon.entity);\n    var reports = new _reports2.default({ reports: (0, _report_utils.getSortedReports)(gon.reports) }, { parse: true });\n    var firstReport = reports.getFirst();\n    return function (state, router) {\n        var report = reports.findById(state.params.reportId) || firstReport;\n        function handleRouteChange(reportId, reportParams) {\n            var route = '/' + reportId + '/' + (reportParams || '');\n            if (_lodash2.default.isEmpty(router.getCurrentParams().splat)) {\n                router.replaceWith(route);\n            } else {\n                router.transitionTo(route);\n            }\n        }\n        return {\n            entity: entity,\n            translation: true,\n            report: report,\n            reports: reports,\n            reportParams: state.params.reportParams,\n            onRouteChange: handleRouteChange\n        };\n    };\n}\n\n/***/ }),\n/* 741 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/** @license React v16.3.2\n * react.production.min.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar m=__webpack_require__(742),n=__webpack_require__(177),p=__webpack_require__(245),q=__webpack_require__(246),r=\"function\"===typeof Symbol&&Symbol[\"for\"],t=r?Symbol[\"for\"](\"react.element\"):60103,u=r?Symbol[\"for\"](\"react.portal\"):60106,v=r?Symbol[\"for\"](\"react.fragment\"):60107,w=r?Symbol[\"for\"](\"react.strict_mode\"):60108,x=r?Symbol[\"for\"](\"react.provider\"):60109,y=r?Symbol[\"for\"](\"react.context\"):60110,z=r?Symbol[\"for\"](\"react.async_mode\"):60111,A=r?Symbol[\"for\"](\"react.forward_ref\"):\n60112,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=arguments.length-1,e=\"http://reactjs.org/docs/error-decoder.html?invariant\\x3d\"+a,c=0;c<b;c++)e+=\"\\x26args[]\\x3d\"+encodeURIComponent(arguments[c+1]);n(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",e)}var D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};\nfunction E(a,b,e){this.props=a;this.context=b;this.refs=p;this.updater=e||D}E.prototype.isReactComponent={};E.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?C(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=p;this.updater=e||D}var H=G.prototype=new F;\nH.constructor=G;m(H,E.prototype);H.isPureReactComponent=!0;var I={current:null},J=Object.prototype.hasOwnProperty,K={key:!0,ref:!0,__self:!0,__source:!0};\nfunction L(a,b,e){var c=void 0,d={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)J.call(b,c)&&!K.hasOwnProperty(c)&&(d[c]=b[c]);var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){for(var k=Array(f),l=0;l<f;l++)k[l]=arguments[l+2];d.children=k}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===d[c]&&(d[c]=f[c]);return{$$typeof:t,type:a,key:g,ref:h,props:d,_owner:I.current}}\nfunction M(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===t}function escape(a){var b={\"\\x3d\":\"\\x3d0\",\":\":\"\\x3d2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var N=/\\/+/g,O=[];function P(a,b,e,c){if(O.length){var d=O.pop();d.result=a;d.keyPrefix=b;d.func=e;d.context=c;d.count=0;return d}return{result:a,keyPrefix:b,func:e,context:c,count:0}}function Q(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>O.length&&O.push(a)}\nfunction R(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case t:case u:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+S(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){d=a[h];var f=b+S(d,h);g+=R(d,f,e,c)}else if(null===a||\"undefined\"===typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),\nh=0;!(d=a.next()).done;)d=d.value,f=b+S(d,h++),g+=R(d,f,e,c);else\"object\"===d&&(e=\"\"+a,C(\"31\",\"[object Object]\"===e?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":e,\"\"));return g}function S(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function T(a,b){a.func.call(a.context,b,a.count++)}\nfunction U(a,b,e){var c=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?V(a,c,e,q.thatReturnsArgument):null!=a&&(M(a)&&(b=d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(N,\"$\\x26/\")+\"/\")+e,a={$$typeof:t,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}),c.push(a))}function V(a,b,e,c,d){var g=\"\";null!=e&&(g=(\"\"+e).replace(N,\"$\\x26/\")+\"/\");b=P(b,g,c,d);null==a||R(a,\"\",U,b);Q(b)}\nvar W={Children:{map:function(a,b,e){if(null==a)return a;var c=[];V(a,c,null,b,e);return c},forEach:function(a,b,e){if(null==a)return a;b=P(null,null,b,e);null==a||R(a,\"\",T,b);Q(b)},count:function(a){return null==a?0:R(a,\"\",q.thatReturnsNull,null)},toArray:function(a){var b=[];V(a,b,null,q.thatReturnsArgument);return b},only:function(a){M(a)?void 0:C(\"143\");return a}},createRef:function(){return{current:null}},Component:E,PureComponent:G,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:y,\n_calculateChangedBits:b,_defaultValue:a,_currentValue:a,_changedBits:0,Provider:null,Consumer:null};a.Provider={$$typeof:x,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:A,render:a}},Fragment:v,StrictMode:w,unstable_AsyncMode:z,createElement:L,cloneElement:function(a,b,e){null===a||void 0===a?C(\"267\",a):void 0;var c=void 0,d=m({},a.props),g=a.key,h=a.ref,f=a._owner;if(null!=b){void 0!==b.ref&&(h=b.ref,f=I.current);void 0!==b.key&&(g=\"\"+b.key);var k=void 0;a.type&&a.type.defaultProps&&\n(k=a.type.defaultProps);for(c in b)J.call(b,c)&&!K.hasOwnProperty(c)&&(d[c]=void 0===b[c]&&void 0!==k?k[c]:b[c])}c=arguments.length-2;if(1===c)d.children=e;else if(1<c){k=Array(c);for(var l=0;l<c;l++)k[l]=arguments[l+2];d.children=k}return{$$typeof:t,type:a.type,key:g,ref:h,props:d,_owner:f}},createFactory:function(a){var b=L.bind(null,a);b.type=a;return b},isValidElement:M,version:\"16.3.2\",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:I,assign:m}},X=Object.freeze({default:W}),\nY=X&&W||X;module.exports=Y[\"default\"]?Y[\"default\"]:Y;\n\n\n/***/ }),\n/* 742 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 743 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/** @license React v16.3.2\n * react-dom.production.min.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\nvar ba=__webpack_require__(177),ea=__webpack_require__(0),m=__webpack_require__(744),A=__webpack_require__(745),C=__webpack_require__(246),fa=__webpack_require__(746),ha=__webpack_require__(247),ja=__webpack_require__(747),ka=__webpack_require__(245);\nfunction D(a){for(var b=arguments.length-1,c=\"http://reactjs.org/docs/error-decoder.html?invariant\\x3d\"+a,d=0;d<b;d++)c+=\"\\x26args[]\\x3d\"+encodeURIComponent(arguments[d+1]);ba(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",c)}ea?void 0:D(\"227\");\nfunction ma(a,b,c,d,e,f,h,g,k){this._hasCaughtError=!1;this._caughtError=null;var v=Array.prototype.slice.call(arguments,3);try{b.apply(c,v)}catch(l){this._caughtError=l,this._hasCaughtError=!0}}\nvar E={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,invokeGuardedCallback:function(a,b,c,d,e,f,h,g,k){ma.apply(E,arguments)},invokeGuardedCallbackAndCatchFirstError:function(a,b,c,d,e,f,h,g,k){E.invokeGuardedCallback.apply(this,arguments);if(E.hasCaughtError()){var v=E.clearCaughtError();E._hasRethrowError||(E._hasRethrowError=!0,E._rethrowError=v)}},rethrowCaughtError:function(){return na.apply(E,arguments)},hasCaughtError:function(){return E._hasCaughtError},clearCaughtError:function(){if(E._hasCaughtError){var a=\nE._caughtError;E._caughtError=null;E._hasCaughtError=!1;return a}D(\"198\")}};function na(){if(E._hasRethrowError){var a=E._rethrowError;E._rethrowError=null;E._hasRethrowError=!1;throw a;}}var oa=null,pa={};\nfunction qa(){if(oa)for(var a in pa){var b=pa[a],c=oa.indexOf(a);-1<c?void 0:D(\"96\",a);if(!ra[c]){b.extractEvents?void 0:D(\"97\",a);ra[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],h=b,g=d;sa.hasOwnProperty(g)?D(\"99\",g):void 0;sa[g]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ta(k[e],h,g);e=!0}else f.registrationName?(ta(f.registrationName,h,g),e=!0):e=!1;e?void 0:D(\"98\",d,a)}}}}\nfunction ta(a,b,c){ua[a]?D(\"100\",a):void 0;ua[a]=b;va[a]=b.eventTypes[c].dependencies}var ra=[],sa={},ua={},va={};function wa(a){oa?D(\"101\"):void 0;oa=Array.prototype.slice.call(a);qa()}function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];pa.hasOwnProperty(c)&&pa[c]===d||(pa[c]?D(\"102\",c):void 0,pa[c]=d,b=!0)}b&&qa()}\nvar Ca=Object.freeze({plugins:ra,eventNameDispatchConfigs:sa,registrationNameModules:ua,registrationNameDependencies:va,possibleRegistrationNames:null,injectEventPluginOrder:wa,injectEventPluginsByName:xa}),Da=null,Ea=null,Fa=null;function Ga(a,b,c,d){b=a.type||\"unknown-event\";a.currentTarget=Fa(d);E.invokeGuardedCallbackAndCatchFirstError(b,c,void 0,a);a.currentTarget=null}\nfunction Ha(a,b){null==b?D(\"30\"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Ia(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Ja=null;\nfunction Ka(a,b){if(a){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;e<c.length&&!a.isPropagationStopped();e++)Ga(a,b,c[e],d[e]);else c&&Ga(a,b,c,d);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function La(a){return Ka(a,!0)}function Ma(a){return Ka(a,!1)}var Na={injectEventPluginOrder:wa,injectEventPluginsByName:xa};\nfunction Oa(a,b){var c=a.stateNode;if(!c)return null;var d=Da(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;c&&\"function\"!==typeof c?D(\"231\",b,typeof c):void 0;\nreturn c}function Pa(a,b){null!==a&&(Ja=Ha(Ja,a));a=Ja;Ja=null;a&&(b?Ia(a,La):Ia(a,Ma),Ja?D(\"95\"):void 0,E.rethrowCaughtError())}function Qa(a,b,c,d){for(var e=null,f=0;f<ra.length;f++){var h=ra[f];h&&(h=h.extractEvents(a,b,c,d))&&(e=Ha(e,h))}Pa(e,!1)}var Ra=Object.freeze({injection:Na,getListener:Oa,runEventsInBatch:Pa,runExtractedEventsInBatch:Qa}),Sa=Math.random().toString(36).slice(2),F=\"__reactInternalInstance$\"+Sa,Ta=\"__reactEventHandlers$\"+Sa;\nfunction Ua(a){if(a[F])return a[F];for(;!a[F];)if(a.parentNode)a=a.parentNode;else return null;a=a[F];return 5===a.tag||6===a.tag?a:null}function Va(a){if(5===a.tag||6===a.tag)return a.stateNode;D(\"33\")}function Xa(a){return a[Ta]||null}var bb=Object.freeze({precacheFiberNode:function(a,b){b[F]=a},getClosestInstanceFromNode:Ua,getInstanceFromNode:function(a){a=a[F];return!a||5!==a.tag&&6!==a.tag?null:a},getNodeFromInstance:Va,getFiberCurrentPropsFromNode:Xa,updateFiberProps:function(a,b){a[Ta]=b}});\nfunction L(a){do a=a[\"return\"];while(a&&5!==a.tag);return a?a:null}function cb(a,b,c){for(var d=[];a;)d.push(a),a=L(a);for(a=d.length;0<a--;)b(d[a],\"captured\",c);for(a=0;a<d.length;a++)b(d[a],\"bubbled\",c)}function db(a,b,c){if(b=Oa(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=Ha(c._dispatchListeners,b),c._dispatchInstances=Ha(c._dispatchInstances,a)}function eb(a){a&&a.dispatchConfig.phasedRegistrationNames&&cb(a._targetInst,db,a)}\nfunction fb(a){if(a&&a.dispatchConfig.phasedRegistrationNames){var b=a._targetInst;b=b?L(b):null;cb(b,db,a)}}function gb(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Oa(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=Ha(c._dispatchListeners,b),c._dispatchInstances=Ha(c._dispatchInstances,a))}function hb(a){a&&a.dispatchConfig.registrationName&&gb(a._targetInst,null,a)}function ib(a){Ia(a,eb)}\nfunction jb(a,b,c,d){if(c&&d)a:{var e=c;for(var f=d,h=0,g=e;g;g=L(g))h++;g=0;for(var k=f;k;k=L(k))g++;for(;0<h-g;)e=L(e),h--;for(;0<g-h;)f=L(f),g--;for(;h--;){if(e===f||e===f.alternate)break a;e=L(e);f=L(f)}e=null}else e=null;f=e;for(e=[];c&&c!==f;){h=c.alternate;if(null!==h&&h===f)break;e.push(c);c=L(c)}for(c=[];d&&d!==f;){h=d.alternate;if(null!==h&&h===f)break;c.push(d);d=L(d)}for(d=0;d<e.length;d++)gb(e[d],\"bubbled\",a);for(a=c.length;0<a--;)gb(c[a],\"captured\",b)}\nvar kb=Object.freeze({accumulateTwoPhaseDispatches:ib,accumulateTwoPhaseDispatchesSkipTarget:function(a){Ia(a,fb)},accumulateEnterLeaveDispatches:jb,accumulateDirectDispatches:function(a){Ia(a,hb)}}),lb=null;function mb(){!lb&&m.canUseDOM&&(lb=\"textContent\"in document.documentElement?\"textContent\":\"innerText\");return lb}var M={_root:null,_startText:null,_fallbackText:null};\nfunction nb(){if(M._fallbackText)return M._fallbackText;var a,b=M._startText,c=b.length,d,e=ob(),f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var h=c-a;for(d=1;d<=h&&b[c-d]===e[f-d];d++);M._fallbackText=e.slice(a,1<d?1-d:void 0);return M._fallbackText}function ob(){return\"value\"in M._root?M._root.value:M._root[mb()]}\nvar pb=\"dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances\".split(\" \"),qb={type:null,target:null,currentTarget:C.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nfunction N(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?C.thatReturnsTrue:C.thatReturnsFalse;this.isPropagationStopped=C.thatReturnsFalse;return this}\nA(N.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=C.thatReturnsTrue)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=C.thatReturnsTrue)},persist:function(){this.isPersistent=C.thatReturnsTrue},isPersistent:C.thatReturnsFalse,\ndestructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;for(a=0;a<pb.length;a++)this[pb[a]]=null}});N.Interface=qb;N.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;A(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=A({},d.Interface,a);c.extend=d.extend;rb(c);return c};rb(N);\nfunction sb(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function tb(a){a instanceof this?void 0:D(\"223\");a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function rb(a){a.eventPool=[];a.getPooled=sb;a.release=tb}var ub=N.extend({data:null}),vb=N.extend({data:null}),wb=[9,13,27,32],xb=m.canUseDOM&&\"CompositionEvent\"in window,yb=null;m.canUseDOM&&\"documentMode\"in document&&(yb=document.documentMode);\nvar zb=m.canUseDOM&&\"TextEvent\"in window&&!yb,Ab=m.canUseDOM&&(!xb||yb&&8<yb&&11>=yb),Bb=String.fromCharCode(32),Kb={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")}},Lb=!1;\nfunction Mb(a,b){switch(a){case \"topKeyUp\":return-1!==wb.indexOf(b.keyCode);case \"topKeyDown\":return 229!==b.keyCode;case \"topKeyPress\":case \"topMouseDown\":case \"topBlur\":return!0;default:return!1}}function Nb(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Ob=!1;function Pb(a,b){switch(a){case \"topCompositionEnd\":return Nb(b);case \"topKeyPress\":if(32!==b.which)return null;Lb=!0;return Bb;case \"topTextInput\":return a=b.data,a===Bb&&Lb?null:a;default:return null}}\nfunction Qb(a,b){if(Ob)return\"topCompositionEnd\"===a||!xb&&Mb(a,b)?(a=nb(),M._root=null,M._startText=null,M._fallbackText=null,Ob=!1,a):null;switch(a){case \"topPaste\":return null;case \"topKeyPress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"topCompositionEnd\":return Ab?null:b.data;default:return null}}\nvar Rb={eventTypes:Kb,extractEvents:function(a,b,c,d){var e=void 0;var f=void 0;if(xb)b:{switch(a){case \"topCompositionStart\":e=Kb.compositionStart;break b;case \"topCompositionEnd\":e=Kb.compositionEnd;break b;case \"topCompositionUpdate\":e=Kb.compositionUpdate;break b}e=void 0}else Ob?Mb(a,c)&&(e=Kb.compositionEnd):\"topKeyDown\"===a&&229===c.keyCode&&(e=Kb.compositionStart);e?(Ab&&(Ob||e!==Kb.compositionStart?e===Kb.compositionEnd&&Ob&&(f=nb()):(M._root=d,M._startText=ob(),Ob=!0)),e=ub.getPooled(e,\nb,c,d),f?e.data=f:(f=Nb(c),null!==f&&(e.data=f)),ib(e),f=e):f=null;(a=zb?Pb(a,c):Qb(a,c))?(b=vb.getPooled(Kb.beforeInput,b,c,d),b.data=a,ib(b)):b=null;return null===f?b:null===b?f:[f,b]}},Sb=null,Tb={injectFiberControlledHostComponent:function(a){Sb=a}},Ub=null,Vb=null;function Wb(a){if(a=Ea(a)){Sb&&\"function\"===typeof Sb.restoreControlledState?void 0:D(\"194\");var b=Da(a.stateNode);Sb.restoreControlledState(a.stateNode,a.type,b)}}function Xb(a){Ub?Vb?Vb.push(a):Vb=[a]:Ub=a}\nfunction Yb(){return null!==Ub||null!==Vb}function Zb(){if(Ub){var a=Ub,b=Vb;Vb=Ub=null;Wb(a);if(b)for(a=0;a<b.length;a++)Wb(b[a])}}var $b=Object.freeze({injection:Tb,enqueueStateRestore:Xb,needsStateRestore:Yb,restoreStateIfNeeded:Zb});function ac(a,b){return a(b)}function bc(a,b,c){return a(b,c)}function cc(){}var dc=!1;function ec(a,b){if(dc)return a(b);dc=!0;try{return ac(a,b)}finally{dc=!1,Yb()&&(cc(),Zb())}}\nvar fc={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function gc(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!fc[a.type]:\"textarea\"===b?!0:!1}function hc(a){a=a.target||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}\nfunction ic(a,b){if(!m.canUseDOM||b&&!(\"addEventListener\"in document))return!1;a=\"on\"+a;b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}function jc(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction kc(a){var b=jc(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"function\"===typeof c.get&&\"function\"===typeof c.set)return Object.defineProperty(a,b,{configurable:!0,get:function(){return c.get.call(this)},set:function(a){d=\"\"+a;c.set.call(this,a)}}),Object.defineProperty(a,b,{enumerable:c.enumerable}),{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}\nfunction lc(a){a._valueTracker||(a._valueTracker=kc(a))}function mc(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=jc(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}\nvar nc=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,O=\"function\"===typeof Symbol&&Symbol[\"for\"],oc=O?Symbol[\"for\"](\"react.element\"):60103,pc=O?Symbol[\"for\"](\"react.call\"):60104,qc=O?Symbol[\"for\"](\"react.return\"):60105,rc=O?Symbol[\"for\"](\"react.portal\"):60106,sc=O?Symbol[\"for\"](\"react.fragment\"):60107,tc=O?Symbol[\"for\"](\"react.strict_mode\"):60108,uc=O?Symbol[\"for\"](\"react.provider\"):60109,vc=O?Symbol[\"for\"](\"react.context\"):60110,wc=O?Symbol[\"for\"](\"react.async_mode\"):60111,\nxc=O?Symbol[\"for\"](\"react.forward_ref\"):60112,yc=\"function\"===typeof Symbol&&Symbol.iterator;function zc(a){if(null===a||\"undefined\"===typeof a)return null;a=yc&&a[yc]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Ac(a){a=a.type;if(\"function\"===typeof a)return a.displayName||a.name;if(\"string\"===typeof a)return a;switch(a){case sc:return\"ReactFragment\";case rc:return\"ReactPortal\";case pc:return\"ReactCall\";case qc:return\"ReactReturn\"}if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case xc:return a=a.render.displayName||a.render.name||\"\",\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\"}return null}\nfunction Bc(a){var b=\"\";do{a:switch(a.tag){case 0:case 1:case 2:case 5:var c=a._debugOwner,d=a._debugSource;var e=Ac(a);var f=null;c&&(f=Ac(c));c=d;e=\"\\n    in \"+(e||\"Unknown\")+(c?\" (at \"+c.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+c.lineNumber+\")\":f?\" (created by \"+f+\")\":\"\");break a;default:e=\"\"}b+=e;a=a[\"return\"]}while(a);return b}\nvar Cc=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,Dc={},Ec={};function Fc(a){if(Ec.hasOwnProperty(a))return!0;if(Dc.hasOwnProperty(a))return!1;if(Cc.test(a))return Ec[a]=!0;Dc[a]=!0;return!1}\nfunction Gc(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}function Hc(a,b,c,d){if(null===b||\"undefined\"===typeof b||Gc(a,b,c,d))return!0;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}\nfunction U(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var V={};\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){V[a]=new U(a,0,!1,a,null)});\n[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];V[b]=new U(b,1,!1,a[1],null)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){V[a]=new U(a,2,!1,a.toLowerCase(),null)});[\"autoReverse\",\"externalResourcesRequired\",\"preserveAlpha\"].forEach(function(a){V[a]=new U(a,2,!1,a,null)});\n\"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){V[a]=new U(a,3,!1,a.toLowerCase(),null)});[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){V[a]=new U(a,3,!0,a.toLowerCase(),null)});[\"capture\",\"download\"].forEach(function(a){V[a]=new U(a,4,!1,a.toLowerCase(),null)});\n[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){V[a]=new U(a,6,!1,a.toLowerCase(),null)});[\"rowSpan\",\"start\"].forEach(function(a){V[a]=new U(a,5,!1,a.toLowerCase(),null)});var Sc=/[\\-:]([a-z])/g;function Tc(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(Sc,\nTc);V[b]=new U(b,1,!1,a,null)});\"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(Sc,Tc);V[b]=new U(b,1,!1,a,\"http://www.w3.org/1999/xlink\")});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(Sc,Tc);V[b]=new U(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\")});V.tabIndex=new U(\"tabIndex\",1,!1,\"tabindex\",null);\nfunction Uc(a,b,c,d){var e=V.hasOwnProperty(b)?V[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(Hc(b,c,e,d)&&(c=null),d||null===e?Fc(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction Vc(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Wc(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Xc(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Yc(a,b){b=b.checked;null!=b&&Uc(a,\"checked\",b,!1)}\nfunction Zc(a,b){Yc(a,b);var c=Xc(b.value);if(null!=c)if(\"number\"===b.type){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);b.hasOwnProperty(\"value\")?$c(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&$c(a,b.type,Xc(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction ad(a,b){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\"))\"\"===a.value&&(a.value=\"\"+a._wrapperState.initialValue),a.defaultValue=\"\"+a._wrapperState.initialValue;b=a.name;\"\"!==b&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!a.defaultChecked;\"\"!==b&&(a.name=b)}function $c(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}\nfunction Xc(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}var bd={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange\".split(\" \")}};function cd(a,b,c){a=N.getPooled(bd.change,a,b,c);a.type=\"change\";Xb(c);ib(a);return a}var dd=null,ed=null;function fd(a){Pa(a,!1)}\nfunction gd(a){var b=Va(a);if(mc(b))return a}function hd(a,b){if(\"topChange\"===a)return b}var id=!1;m.canUseDOM&&(id=ic(\"input\")&&(!document.documentMode||9<document.documentMode));function jd(){dd&&(dd.detachEvent(\"onpropertychange\",kd),ed=dd=null)}function kd(a){\"value\"===a.propertyName&&gd(ed)&&(a=cd(ed,a,hc(a)),ec(fd,a))}function ld(a,b,c){\"topFocus\"===a?(jd(),dd=b,ed=c,dd.attachEvent(\"onpropertychange\",kd)):\"topBlur\"===a&&jd()}\nfunction md(a){if(\"topSelectionChange\"===a||\"topKeyUp\"===a||\"topKeyDown\"===a)return gd(ed)}function nd(a,b){if(\"topClick\"===a)return gd(b)}function od(a,b){if(\"topInput\"===a||\"topChange\"===a)return gd(b)}\nvar pd={eventTypes:bd,_isInputEventSupported:id,extractEvents:function(a,b,c,d){var e=b?Va(b):window,f=void 0,h=void 0,g=e.nodeName&&e.nodeName.toLowerCase();\"select\"===g||\"input\"===g&&\"file\"===e.type?f=hd:gc(e)?id?f=od:(f=md,h=ld):(g=e.nodeName)&&\"input\"===g.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(f=nd);if(f&&(f=f(a,b)))return cd(f,c,d);h&&h(a,e,b);\"topBlur\"===a&&null!=b&&(a=b._wrapperState||e._wrapperState)&&a.controlled&&\"number\"===e.type&&$c(e,\"number\",e.value)}},qd=N.extend({view:null,\ndetail:null}),rd={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function sd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=rd[a])?!!b[a]:!1}function td(){return sd}\nvar ud=qd.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:td,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)}}),vd={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"topMouseOut\",\"topMouseOver\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"topMouseOut\",\"topMouseOver\"]}},wd={eventTypes:vd,extractEvents:function(a,\nb,c,d){if(\"topMouseOver\"===a&&(c.relatedTarget||c.fromElement)||\"topMouseOut\"!==a&&\"topMouseOver\"!==a)return null;var e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;\"topMouseOut\"===a?(a=b,b=(b=c.relatedTarget||c.toElement)?Ua(b):null):a=null;if(a===b)return null;var f=null==a?e:Va(a);e=null==b?e:Va(b);var h=ud.getPooled(vd.mouseLeave,a,c,d);h.type=\"mouseleave\";h.target=f;h.relatedTarget=e;c=ud.getPooled(vd.mouseEnter,b,c,d);c.type=\"mouseenter\";c.target=e;c.relatedTarget=\nf;jb(h,c,a,b);return[h,c]}};function xd(a){var b=a;if(a.alternate)for(;b[\"return\"];)b=b[\"return\"];else{if(0!==(b.effectTag&2))return 1;for(;b[\"return\"];)if(b=b[\"return\"],0!==(b.effectTag&2))return 1}return 3===b.tag?2:3}function yd(a){return(a=a._reactInternalFiber)?2===xd(a):!1}function zd(a){2!==xd(a)?D(\"188\"):void 0}\nfunction Ad(a){var b=a.alternate;if(!b)return b=xd(a),3===b?D(\"188\"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c[\"return\"],f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var h=e.child;h;){if(h===c)return zd(e),a;if(h===d)return zd(e),b;h=h.sibling}D(\"188\")}if(c[\"return\"]!==d[\"return\"])c=e,d=f;else{h=!1;for(var g=e.child;g;){if(g===c){h=!0;c=e;d=f;break}if(g===d){h=!0;d=e;c=f;break}g=g.sibling}if(!h){for(g=f.child;g;){if(g===c){h=!0;c=f;d=e;break}if(g===d){h=!0;d=f;c=e;break}g=g.sibling}h?\nvoid 0:D(\"189\")}}c.alternate!==d?D(\"190\"):void 0}3!==c.tag?D(\"188\"):void 0;return c.stateNode.current===c?a:b}function Bd(a){a=Ad(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null}\nfunction Cd(a){a=Ad(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child&&4!==b.tag)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null}var Dd=N.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Ed=N.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Fd=qd.extend({relatedTarget:null});\nfunction Gd(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar Hd={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Id={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Jd=qd.extend({key:function(a){if(a.key){var b=Hd[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=Gd(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Id[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:td,charCode:function(a){return\"keypress\"===\na.type?Gd(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?Gd(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Kd=ud.extend({dataTransfer:null}),Ld=qd.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:td}),Md=N.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),Nd=ud.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),Od={},Pd={};function Qd(a,b){var c=a[0].toUpperCase()+a.slice(1),d=\"on\"+c;c=\"top\"+c;b={phasedRegistrationNames:{bubbled:d,captured:d+\"Capture\"},dependencies:[c],isInteractive:b};Od[a]=b;Pd[c]=b}\n\"blur cancel click close contextMenu copy cut doubleClick dragEnd dragStart drop focus input invalid keyDown keyPress keyUp mouseDown mouseUp paste pause play rateChange reset seeked submit touchCancel touchEnd touchStart volumeChange\".split(\" \").forEach(function(a){Qd(a,!0)});\n\"abort animationEnd animationIteration animationStart canPlay canPlayThrough drag dragEnter dragExit dragLeave dragOver durationChange emptied encrypted ended error load loadedData loadedMetadata loadStart mouseMove mouseOut mouseOver playing progress scroll seeking stalled suspend timeUpdate toggle touchMove transitionEnd waiting wheel\".split(\" \").forEach(function(a){Qd(a,!1)});\nvar Rd={eventTypes:Od,isInteractiveTopLevelEventType:function(a){a=Pd[a];return void 0!==a&&!0===a.isInteractive},extractEvents:function(a,b,c,d){var e=Pd[a];if(!e)return null;switch(a){case \"topKeyPress\":if(0===Gd(c))return null;case \"topKeyDown\":case \"topKeyUp\":a=Jd;break;case \"topBlur\":case \"topFocus\":a=Fd;break;case \"topClick\":if(2===c.button)return null;case \"topDoubleClick\":case \"topMouseDown\":case \"topMouseMove\":case \"topMouseUp\":case \"topMouseOut\":case \"topMouseOver\":case \"topContextMenu\":a=\nud;break;case \"topDrag\":case \"topDragEnd\":case \"topDragEnter\":case \"topDragExit\":case \"topDragLeave\":case \"topDragOver\":case \"topDragStart\":case \"topDrop\":a=Kd;break;case \"topTouchCancel\":case \"topTouchEnd\":case \"topTouchMove\":case \"topTouchStart\":a=Ld;break;case \"topAnimationEnd\":case \"topAnimationIteration\":case \"topAnimationStart\":a=Dd;break;case \"topTransitionEnd\":a=Md;break;case \"topScroll\":a=qd;break;case \"topWheel\":a=Nd;break;case \"topCopy\":case \"topCut\":case \"topPaste\":a=Ed;break;default:a=\nN}b=a.getPooled(e,b,c,d);ib(b);return b}},Sd=Rd.isInteractiveTopLevelEventType,Td=[];function Ud(a){var b=a.targetInst;do{if(!b){a.ancestors.push(b);break}var c;for(c=b;c[\"return\"];)c=c[\"return\"];c=3!==c.tag?null:c.stateNode.containerInfo;if(!c)break;a.ancestors.push(b);b=Ua(c)}while(b);for(c=0;c<a.ancestors.length;c++)b=a.ancestors[c],Qa(a.topLevelType,b,a.nativeEvent,hc(a.nativeEvent))}var Vd=!0;function Wd(a){Vd=!!a}\nfunction W(a,b,c){if(!c)return null;a=(Sd(a)?Xd:Yd).bind(null,a);c.addEventListener(b,a,!1)}function Zd(a,b,c){if(!c)return null;a=(Sd(a)?Xd:Yd).bind(null,a);c.addEventListener(b,a,!0)}function Xd(a,b){bc(Yd,a,b)}\nfunction Yd(a,b){if(Vd){var c=hc(b);c=Ua(c);null!==c&&\"number\"===typeof c.tag&&2!==xd(c)&&(c=null);if(Td.length){var d=Td.pop();d.topLevelType=a;d.nativeEvent=b;d.targetInst=c;a=d}else a={topLevelType:a,nativeEvent:b,targetInst:c,ancestors:[]};try{ec(Ud,a)}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,10>Td.length&&Td.push(a)}}}\nvar $d=Object.freeze({get _enabled(){return Vd},setEnabled:Wd,isEnabled:function(){return Vd},trapBubbledEvent:W,trapCapturedEvent:Zd,dispatchEvent:Yd});function ae(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;c[\"ms\"+a]=\"MS\"+b;c[\"O\"+a]=\"o\"+b.toLowerCase();return c}\nvar be={animationend:ae(\"Animation\",\"AnimationEnd\"),animationiteration:ae(\"Animation\",\"AnimationIteration\"),animationstart:ae(\"Animation\",\"AnimationStart\"),transitionend:ae(\"Transition\",\"TransitionEnd\")},ce={},de={};m.canUseDOM&&(de=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete be.animationend.animation,delete be.animationiteration.animation,delete be.animationstart.animation),\"TransitionEvent\"in window||delete be.transitionend.transition);\nfunction ee(a){if(ce[a])return ce[a];if(!be[a])return a;var b=be[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in de)return ce[a]=b[c];return a}\nvar fe={topAnimationEnd:ee(\"animationend\"),topAnimationIteration:ee(\"animationiteration\"),topAnimationStart:ee(\"animationstart\"),topBlur:\"blur\",topCancel:\"cancel\",topChange:\"change\",topClick:\"click\",topClose:\"close\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",\ntopDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topLoad:\"load\",topLoadStart:\"loadstart\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topScroll:\"scroll\",topSelectionChange:\"selectionchange\",topTextInput:\"textInput\",topToggle:\"toggle\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",\ntopTouchStart:\"touchstart\",topTransitionEnd:ee(\"transitionend\"),topWheel:\"wheel\"},ge={topAbort:\"abort\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topSeeked:\"seeked\",topSeeking:\"seeking\",\ntopStalled:\"stalled\",topSuspend:\"suspend\",topTimeUpdate:\"timeupdate\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\"},he={},ie=0,je=\"_reactListenersID\"+(\"\"+Math.random()).slice(2);function ke(a){Object.prototype.hasOwnProperty.call(a,je)||(a[je]=ie++,he[a[je]]={});return he[a[je]]}function le(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction me(a,b){var c=le(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=le(c)}}function ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&\"text\"===a.type||\"textarea\"===b||\"true\"===a.contentEditable)}\nvar oe=m.canUseDOM&&\"documentMode\"in document&&11>=document.documentMode,pe={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange\".split(\" \")}},qe=null,re=null,se=null,te=!1;\nfunction ue(a,b){if(te||null==qe||qe!==fa())return null;var c=qe;\"selectionStart\"in c&&ne(c)?c={start:c.selectionStart,end:c.selectionEnd}:window.getSelection?(c=window.getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}):c=void 0;return se&&ha(se,c)?null:(se=c,a=N.getPooled(pe.select,re,a,b),a.type=\"select\",a.target=qe,ib(a),a)}\nvar ve={eventTypes:pe,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=ke(e);f=va.onSelect;for(var h=0;h<f.length;h++){var g=f[h];if(!e.hasOwnProperty(g)||!e[g]){e=!1;break a}}e=!0}f=!e}if(f)return null;e=b?Va(b):window;switch(a){case \"topFocus\":if(gc(e)||\"true\"===e.contentEditable)qe=e,re=b,se=null;break;case \"topBlur\":se=re=qe=null;break;case \"topMouseDown\":te=!0;break;case \"topContextMenu\":case \"topMouseUp\":return te=!1,ue(c,d);case \"topSelectionChange\":if(oe)break;\ncase \"topKeyDown\":case \"topKeyUp\":return ue(c,d)}return null}};Na.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));Da=bb.getFiberCurrentPropsFromNode;Ea=bb.getInstanceFromNode;Fa=bb.getNodeFromInstance;Na.injectEventPluginsByName({SimpleEventPlugin:Rd,EnterLeaveEventPlugin:wd,ChangeEventPlugin:pd,SelectEventPlugin:ve,BeforeInputEventPlugin:Rb});\nfunction xe(a,b,c,d){this.tag=a;this.key=c;this.stateNode=this.type=null;this.sibling=this.child=this[\"return\"]=null;this.index=0;this.ref=null;this.pendingProps=b;this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.expirationTime=0;this.alternate=null}\nfunction ze(a,b,c){var d=a.alternate;null===d?(d=new xe(a.tag,b,a.key,a.mode),d.type=a.type,d.stateNode=a.stateNode,d.alternate=a,a.alternate=d):(d.pendingProps=b,d.effectTag=0,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null);d.expirationTime=c;d.child=a.child;d.memoizedProps=a.memoizedProps;d.memoizedState=a.memoizedState;d.updateQueue=a.updateQueue;d.sibling=a.sibling;d.index=a.index;d.ref=a.ref;return d}\nfunction Ae(a,b,c){var d=a.type,e=a.key;a=a.props;var f=void 0;if(\"function\"===typeof d)f=d.prototype&&d.prototype.isReactComponent?2:0;else if(\"string\"===typeof d)f=5;else switch(d){case sc:return Be(a.children,b,c,e);case wc:f=11;b|=3;break;case tc:f=11;b|=2;break;case pc:f=7;break;case qc:f=9;break;default:if(\"object\"===typeof d&&null!==d)switch(d.$$typeof){case uc:f=13;break;case vc:f=12;break;case xc:f=14;break;default:if(\"number\"===typeof d.tag)return b=d,b.pendingProps=a,b.expirationTime=c,\nb;D(\"130\",null==d?d:typeof d,\"\")}else D(\"130\",null==d?d:typeof d,\"\")}b=new xe(f,a,e,b);b.type=d;b.expirationTime=c;return b}function Be(a,b,c,d){a=new xe(10,a,d,b);a.expirationTime=c;return a}function Ce(a,b,c){a=new xe(6,a,null,b);a.expirationTime=c;return a}function De(a,b,c){b=new xe(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}var Ee=null,Fe=null;\nfunction Ge(a){return function(b){try{return a(b)}catch(c){}}}function He(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Ee=Ge(function(a){return b.onCommitFiberRoot(c,a)});Fe=Ge(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}function Ie(a){\"function\"===typeof Ee&&Ee(a)}function Je(a){\"function\"===typeof Fe&&Fe(a)}new Set;\nfunction Ke(a){return{baseState:a,expirationTime:0,first:null,last:null,callbackList:null,hasForceUpdate:!1,isInitialized:!1,capturedValues:null}}function Le(a,b){null===a.last?a.first=a.last=b:(a.last.next=b,a.last=b);if(0===a.expirationTime||a.expirationTime>b.expirationTime)a.expirationTime=b.expirationTime}var Me=void 0,Ne=void 0;\nfunction Oe(a){Me=Ne=null;var b=a.alternate,c=a.updateQueue;null===c&&(c=a.updateQueue=Ke(null));null!==b?(a=b.updateQueue,null===a&&(a=b.updateQueue=Ke(null))):a=null;Me=c;Ne=a!==c?a:null}function Pe(a,b){Oe(a);a=Me;var c=Ne;null===c?Le(a,b):null===a.last||null===c.last?(Le(a,b),Le(c,b)):(Le(a,b),c.last=b)}function Qe(a,b,c,d){a=a.partialState;return\"function\"===typeof a?a.call(b,c,d):a}\nfunction Re(a,b,c,d,e,f){null!==a&&a.updateQueue===c&&(c=b.updateQueue={baseState:c.baseState,expirationTime:c.expirationTime,first:c.first,last:c.last,isInitialized:c.isInitialized,capturedValues:c.capturedValues,callbackList:null,hasForceUpdate:!1});c.expirationTime=0;c.isInitialized?a=c.baseState:(a=c.baseState=b.memoizedState,c.isInitialized=!0);for(var h=!0,g=c.first,k=!1;null!==g;){var v=g.expirationTime;if(v>f){var l=c.expirationTime;if(0===l||l>v)c.expirationTime=v;k||(k=!0,c.baseState=a)}else{k||\n(c.first=g.next,null===c.first&&(c.last=null));if(g.isReplace)a=Qe(g,d,a,e),h=!0;else if(v=Qe(g,d,a,e))a=h?A({},a,v):A(a,v),h=!1;g.isForced&&(c.hasForceUpdate=!0);null!==g.callback&&(v=c.callbackList,null===v&&(v=c.callbackList=[]),v.push(g));null!==g.capturedValue&&(v=c.capturedValues,null===v?c.capturedValues=[g.capturedValue]:v.push(g.capturedValue))}g=g.next}null!==c.callbackList?b.effectTag|=32:null!==c.first||c.hasForceUpdate||null!==c.capturedValues||(b.updateQueue=null);k||(c.baseState=a);\nreturn a}function Se(a,b){var c=a.callbackList;if(null!==c)for(a.callbackList=null,a=0;a<c.length;a++){var d=c[a],e=d.callback;d.callback=null;\"function\"!==typeof e?D(\"191\",e):void 0;e.call(b)}}\nfunction Te(a,b,c,d,e){function f(a,b,c,d,e,f){if(null===b||null!==a.updateQueue&&a.updateQueue.hasForceUpdate)return!0;var n=a.stateNode;a=a.type;return\"function\"===typeof n.shouldComponentUpdate?n.shouldComponentUpdate(c,e,f):a.prototype&&a.prototype.isPureReactComponent?!ha(b,c)||!ha(d,e):!0}function h(a,b){b.updater=r;a.stateNode=b;b._reactInternalFiber=a}function g(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&\nb.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&r.enqueueReplaceState(b,b.state,null)}function k(a,b,c,d){a=a.type;if(\"function\"===typeof a.getDerivedStateFromProps)return a.getDerivedStateFromProps.call(null,c,d)}var v=a.cacheContext,l=a.getMaskedContext,p=a.getUnmaskedContext,z=a.isContextConsumer,B=a.hasContextChanged,r={isMounted:yd,enqueueSetState:function(a,d,e){a=a._reactInternalFiber;e=void 0===e?null:e;var f=c(a);Pe(a,{expirationTime:f,partialState:d,callback:e,isReplace:!1,isForced:!1,\ncapturedValue:null,next:null});b(a,f)},enqueueReplaceState:function(a,d,e){a=a._reactInternalFiber;e=void 0===e?null:e;var f=c(a);Pe(a,{expirationTime:f,partialState:d,callback:e,isReplace:!0,isForced:!1,capturedValue:null,next:null});b(a,f)},enqueueForceUpdate:function(a,d){a=a._reactInternalFiber;d=void 0===d?null:d;var e=c(a);Pe(a,{expirationTime:e,partialState:null,callback:d,isReplace:!1,isForced:!0,capturedValue:null,next:null});b(a,e)}};return{adoptClassInstance:h,callGetDerivedStateFromProps:k,\nconstructClassInstance:function(a,b){var c=a.type,d=p(a),e=z(a),f=e?l(a,d):ka;c=new c(b,f);var n=null!==c.state&&void 0!==c.state?c.state:null;h(a,c);a.memoizedState=n;b=k(a,c,b,n);null!==b&&void 0!==b&&(a.memoizedState=A({},a.memoizedState,b));e&&v(a,d,f);return c},mountClassInstance:function(a,b){var c=a.type,d=a.alternate,e=a.stateNode,f=a.pendingProps,n=p(a);e.props=f;e.state=a.memoizedState;e.refs=ka;e.context=l(a,n);\"function\"===typeof c.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\n\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(c=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),c!==e.state&&r.enqueueReplaceState(e,e.state,null),c=a.updateQueue,null!==c&&(e.state=Re(d,a,c,e,f,b)));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)},resumeMountClassInstance:function(a,b){var c=a.type,n=a.stateNode;n.props=a.memoizedProps;n.state=\na.memoizedState;var h=a.memoizedProps,r=a.pendingProps,z=n.context,q=p(a);q=l(a,q);(c=\"function\"===typeof c.getDerivedStateFromProps||\"function\"===typeof n.getSnapshotBeforeUpdate)||\"function\"!==typeof n.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof n.componentWillReceiveProps||(h!==r||z!==q)&&g(a,n,r,q);z=a.memoizedState;b=null!==a.updateQueue?Re(null,a,a.updateQueue,n,r,b):z;var u=void 0;h!==r&&(u=k(a,n,r,b));if(null!==u&&void 0!==u){b=null===b||void 0===b?u:A({},b,u);var t=a.updateQueue;\nnull!==t&&(t.baseState=A({},t.baseState,u))}if(!(h!==r||z!==b||B()||null!==a.updateQueue&&a.updateQueue.hasForceUpdate))return\"function\"===typeof n.componentDidMount&&(a.effectTag|=4),!1;(h=f(a,h,r,z,b,q))?(c||\"function\"!==typeof n.UNSAFE_componentWillMount&&\"function\"!==typeof n.componentWillMount||(\"function\"===typeof n.componentWillMount&&n.componentWillMount(),\"function\"===typeof n.UNSAFE_componentWillMount&&n.UNSAFE_componentWillMount()),\"function\"===typeof n.componentDidMount&&(a.effectTag|=\n4)):(\"function\"===typeof n.componentDidMount&&(a.effectTag|=4),d(a,r),e(a,b));n.props=r;n.state=b;n.context=q;return h},updateClassInstance:function(a,b,c){var n=b.type,x=b.stateNode;x.props=b.memoizedProps;x.state=b.memoizedState;var h=b.memoizedProps,r=b.pendingProps,q=x.context,u=p(b);u=l(b,u);(n=\"function\"===typeof n.getDerivedStateFromProps||\"function\"===typeof x.getSnapshotBeforeUpdate)||\"function\"!==typeof x.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof x.componentWillReceiveProps||\n(h!==r||q!==u)&&g(b,x,r,u);q=b.memoizedState;c=null!==b.updateQueue?Re(a,b,b.updateQueue,x,r,c):q;var t=void 0;h!==r&&(t=k(b,x,r,c));if(null!==t&&void 0!==t){c=null===c||void 0===c?t:A({},c,t);var y=b.updateQueue;null!==y&&(y.baseState=A({},y.baseState,t))}if(!(h!==r||q!==c||B()||null!==b.updateQueue&&b.updateQueue.hasForceUpdate))return\"function\"!==typeof x.componentDidUpdate||h===a.memoizedProps&&q===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof x.getSnapshotBeforeUpdate||h===a.memoizedProps&&\nq===a.memoizedState||(b.effectTag|=2048),!1;(t=f(b,h,r,q,c,u))?(n||\"function\"!==typeof x.UNSAFE_componentWillUpdate&&\"function\"!==typeof x.componentWillUpdate||(\"function\"===typeof x.componentWillUpdate&&x.componentWillUpdate(r,c,u),\"function\"===typeof x.UNSAFE_componentWillUpdate&&x.UNSAFE_componentWillUpdate(r,c,u)),\"function\"===typeof x.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof x.getSnapshotBeforeUpdate&&(b.effectTag|=2048)):(\"function\"!==typeof x.componentDidUpdate||h===a.memoizedProps&&\nq===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof x.getSnapshotBeforeUpdate||h===a.memoizedProps&&q===a.memoizedState||(b.effectTag|=2048),d(b,r),e(b,c));x.props=r;x.state=c;x.context=u;return t}}}var Ue=Array.isArray;\nfunction Ve(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(2!==c.tag?D(\"110\"):void 0,d=c.stateNode);d?void 0:D(\"147\",a);var e=\"\"+a;if(null!==b&&null!==b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs===ka?d.refs={}:d.refs;null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}\"string\"!==typeof a?D(\"148\"):void 0;c._owner?void 0:D(\"254\",a)}return a}\nfunction We(a,b){\"textarea\"!==a.type&&D(\"31\",\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\")}\nfunction Xe(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=ze(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function h(b){a&&null===b.alternate&&(b.effectTag=2);return b}function g(a,b,c,d){if(null===b||6!==b.tag)return b=Ce(c,a.mode,d),b[\"return\"]=a,b;b=e(b,c,d);b[\"return\"]=a;return b}function k(a,b,c,d){if(null!==b&&b.type===c.type)return d=e(b,c.props,d),d.ref=Ve(a,b,c),d[\"return\"]=a,d;d=Ae(c,a.mode,d);d.ref=Ve(a,b,c);d[\"return\"]=a;return d}function v(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=\nDe(c,a.mode,d),b[\"return\"]=a,b;b=e(b,c.children||[],d);b[\"return\"]=a;return b}function l(a,b,c,d,f){if(null===b||10!==b.tag)return b=Be(c,a.mode,d,f),b[\"return\"]=a,b;b=e(b,c,d);b[\"return\"]=a;return b}function p(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Ce(\"\"+b,a.mode,c),b[\"return\"]=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case oc:return c=Ae(b,a.mode,c),c.ref=Ve(a,null,b),c[\"return\"]=a,c;case rc:return b=De(b,a.mode,c),b[\"return\"]=a,b}if(Ue(b)||zc(b))return b=Be(b,\na.mode,c,null),b[\"return\"]=a,b;We(a,b)}return null}function z(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:g(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case oc:return c.key===e?c.type===sc?l(a,b,c.props.children,d,e):k(a,b,c,d):null;case rc:return c.key===e?v(a,b,c,d):null}if(Ue(c)||zc(c))return null!==e?null:l(a,b,c,d,null);We(a,c)}return null}function B(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=a.get(c)||\nnull,g(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case oc:return a=a.get(null===d.key?c:d.key)||null,d.type===sc?l(b,a,d.props.children,e,d.key):k(b,a,d,e);case rc:return a=a.get(null===d.key?c:d.key)||null,v(b,a,d,e)}if(Ue(d)||zc(d))return a=a.get(c)||null,l(b,a,d,e,null);We(b,d)}return null}function r(e,l,g,h){for(var r=null,k=null,q=l,u=l=0,t=null;null!==q&&u<g.length;u++){q.index>u?(t=q,q=null):t=q.sibling;var n=z(e,q,g[u],h);if(null===n){null===q&&(q=t);break}a&&q&&null===\nn.alternate&&b(e,q);l=f(n,l,u);null===k?r=n:k.sibling=n;k=n;q=t}if(u===g.length)return c(e,q),r;if(null===q){for(;u<g.length;u++)if(q=p(e,g[u],h))l=f(q,l,u),null===k?r=q:k.sibling=q,k=q;return r}for(q=d(e,q);u<g.length;u++)if(t=B(q,e,u,g[u],h)){if(a&&null!==t.alternate)q[\"delete\"](null===t.key?u:t.key);l=f(t,l,u);null===k?r=t:k.sibling=t;k=t}a&&q.forEach(function(a){return b(e,a)});return r}function Q(e,l,g,h){var r=zc(g);\"function\"!==typeof r?D(\"150\"):void 0;g=r.call(g);null==g?D(\"151\"):void 0;for(var k=\nr=null,q=l,u=l=0,t=null,n=g.next();null!==q&&!n.done;u++,n=g.next()){q.index>u?(t=q,q=null):t=q.sibling;var H=z(e,q,n.value,h);if(null===H){q||(q=t);break}a&&q&&null===H.alternate&&b(e,q);l=f(H,l,u);null===k?r=H:k.sibling=H;k=H;q=t}if(n.done)return c(e,q),r;if(null===q){for(;!n.done;u++,n=g.next())n=p(e,n.value,h),null!==n&&(l=f(n,l,u),null===k?r=n:k.sibling=n,k=n);return r}for(q=d(e,q);!n.done;u++,n=g.next())if(n=B(q,e,u,n.value,h),null!==n){if(a&&null!==n.alternate)q[\"delete\"](null===n.key?u:n.key);\nl=f(n,l,u);null===k?r=n:k.sibling=n;k=n}a&&q.forEach(function(a){return b(e,a)});return r}return function(a,d,f,l){\"object\"===typeof f&&null!==f&&f.type===sc&&null===f.key&&(f=f.props.children);var g=\"object\"===typeof f&&null!==f;if(g)switch(f.$$typeof){case oc:a:{var k=f.key;for(g=d;null!==g;){if(g.key===k)if(10===g.tag?f.type===sc:g.type===f.type){c(a,g.sibling);d=e(g,f.type===sc?f.props.children:f.props,l);d.ref=Ve(a,g,f);d[\"return\"]=a;a=d;break a}else{c(a,g);break}else b(a,g);g=g.sibling}f.type===\nsc?(d=Be(f.props.children,a.mode,l,f.key),d[\"return\"]=a,a=d):(l=Ae(f,a.mode,l),l.ref=Ve(a,d,f),l[\"return\"]=a,a=l)}return h(a);case rc:a:{for(g=f.key;null!==d;){if(d.key===g)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],l);d[\"return\"]=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=De(f,a.mode,l);d[\"return\"]=a;a=d}return h(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&\n6===d.tag?(c(a,d.sibling),d=e(d,f,l),d[\"return\"]=a,a=d):(c(a,d),d=Ce(f,a.mode,l),d[\"return\"]=a,a=d),h(a);if(Ue(f))return r(a,d,f,l);if(zc(f))return Q(a,d,f,l);g&&We(a,f);if(\"undefined\"===typeof f)switch(a.tag){case 2:case 1:l=a.type,D(\"152\",l.displayName||l.name||\"Component\")}return c(a,d)}}var Ye=Xe(!0),Ze=Xe(!1);\nfunction $e(a,b,c,d,e,f,h){function g(a,b,c){k(a,b,c,b.expirationTime)}function k(a,b,c,d){b.child=null===a?Ze(b,null,c,d):Ye(b,a.child,c,d)}function v(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function l(a,b,c,d,e,f){v(a,b);if(!c&&!e)return d&&y(b,!1),r(a,b);c=b.stateNode;nc.current=b;var l=e?null:c.render();b.effectTag|=1;e&&(k(a,b,null,f),b.child=null);k(a,b,l,f);b.memoizedState=c.state;b.memoizedProps=c.props;d&&y(b,!0);return b.child}function p(a){var b=a.stateNode;\nb.pendingContext?t(a,b.pendingContext,b.pendingContext!==b.context):b.context&&t(a,b.context,!1);Y(a,b.containerInfo)}function z(a,b,c,d){var e=a.child;for(null!==e&&(e[\"return\"]=a);null!==e;){switch(e.tag){case 12:var f=e.stateNode|0;if(e.type===b&&0!==(f&c)){for(f=e;null!==f;){var l=f.alternate;if(0===f.expirationTime||f.expirationTime>d)f.expirationTime=d,null!==l&&(0===l.expirationTime||l.expirationTime>d)&&(l.expirationTime=d);else if(null!==l&&(0===l.expirationTime||l.expirationTime>d))l.expirationTime=\nd;else break;f=f[\"return\"]}f=null}else f=e.child;break;case 13:f=e.type===a.type?null:e.child;break;default:f=e.child}if(null!==f)f[\"return\"]=e;else for(f=e;null!==f;){if(f===a){f=null;break}e=f.sibling;if(null!==e){f=e;break}f=f[\"return\"]}e=f}}function B(a,b,c){var d=b.type._context,e=b.pendingProps,f=b.memoizedProps;if(!q()&&f===e)return b.stateNode=0,G(b),r(a,b);var l=e.value;b.memoizedProps=e;if(null===f)l=1073741823;else if(f.value===e.value){if(f.children===e.children)return b.stateNode=0,G(b),\nr(a,b);l=0}else{var h=f.value;if(h===l&&(0!==h||1/h===1/l)||h!==h&&l!==l){if(f.children===e.children)return b.stateNode=0,G(b),r(a,b);l=0}else if(l=\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,l):1073741823,l|=0,0===l){if(f.children===e.children)return b.stateNode=0,G(b),r(a,b)}else z(b,d,l,c)}b.stateNode=l;G(b);g(a,b,e.children);return b.child}function r(a,b){null!==a&&b.child!==a.child?D(\"153\"):void 0;if(null!==b.child){a=b.child;var c=ze(a,a.pendingProps,a.expirationTime);\nb.child=c;for(c[\"return\"]=b;null!==a.sibling;)a=a.sibling,c=c.sibling=ze(a,a.pendingProps,a.expirationTime),c[\"return\"]=b;c.sibling=null}return b.child}var Q=a.shouldSetTextContent,n=a.shouldDeprioritizeSubtree,x=b.pushHostContext,Y=b.pushHostContainer,G=d.pushProvider,R=c.getMaskedContext,S=c.getUnmaskedContext,q=c.hasContextChanged,u=c.pushContextProvider,t=c.pushTopLevelContextObject,y=c.invalidateContextProvider,H=e.enterHydrationState,Wa=e.resetHydrationState,Cb=e.tryToClaimNextHydratableInstance;\na=Te(c,f,h,function(a,b){a.memoizedProps=b},function(a,b){a.memoizedState=b});var Jc=a.adoptClassInstance,Kc=a.callGetDerivedStateFromProps,Lc=a.constructClassInstance,Db=a.mountClassInstance,Mc=a.resumeMountClassInstance,Eb=a.updateClassInstance;return{beginWork:function(a,b,c){if(0===b.expirationTime||b.expirationTime>c){switch(b.tag){case 3:p(b);break;case 2:u(b);break;case 4:Y(b,b.stateNode.containerInfo);break;case 13:G(b)}return null}switch(b.tag){case 0:null!==a?D(\"155\"):void 0;var d=b.type,\ne=b.pendingProps,f=S(b);f=R(b,f);d=d(e,f);b.effectTag|=1;\"object\"===typeof d&&null!==d&&\"function\"===typeof d.render&&void 0===d.$$typeof?(f=b.type,b.tag=2,b.memoizedState=null!==d.state&&void 0!==d.state?d.state:null,\"function\"===typeof f.getDerivedStateFromProps&&(e=Kc(b,d,e,b.memoizedState),null!==e&&void 0!==e&&(b.memoizedState=A({},b.memoizedState,e))),e=u(b),Jc(b,d),Db(b,c),a=l(a,b,!0,e,!1,c)):(b.tag=1,g(a,b,d),b.memoizedProps=e,a=b.child);return a;case 1:return e=b.type,c=b.pendingProps,q()||\nb.memoizedProps!==c?(d=S(b),d=R(b,d),e=e(c,d),b.effectTag|=1,g(a,b,e),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 2:e=u(b);null===a?null===b.stateNode?(Lc(b,b.pendingProps),Db(b,c),d=!0):d=Mc(b,c):d=Eb(a,b,c);f=!1;var h=b.updateQueue;null!==h&&null!==h.capturedValues&&(f=d=!0);return l(a,b,d,e,f,c);case 3:a:if(p(b),d=b.updateQueue,null!==d){f=b.memoizedState;e=Re(a,b,d,null,null,c);b.memoizedState=e;d=b.updateQueue;if(null!==d&&null!==d.capturedValues)d=null;else if(f===e){Wa();a=r(a,b);break a}else d=\ne.element;f=b.stateNode;(null===a||null===a.child)&&f.hydrate&&H(b)?(b.effectTag|=2,b.child=Ze(b,null,d,c)):(Wa(),g(a,b,d));b.memoizedState=e;a=b.child}else Wa(),a=r(a,b);return a;case 5:a:{x(b);null===a&&Cb(b);e=b.type;h=b.memoizedProps;d=b.pendingProps;f=null!==a?a.memoizedProps:null;if(!q()&&h===d){if(h=b.mode&1&&n(e,d))b.expirationTime=1073741823;if(!h||1073741823!==c){a=r(a,b);break a}}h=d.children;Q(e,d)?h=null:f&&Q(e,f)&&(b.effectTag|=16);v(a,b);1073741823!==c&&b.mode&1&&n(e,d)?(b.expirationTime=\n1073741823,b.memoizedProps=d,a=null):(g(a,b,h),b.memoizedProps=d,a=b.child)}return a;case 6:return null===a&&Cb(b),b.memoizedProps=b.pendingProps,null;case 8:b.tag=7;case 7:return e=b.pendingProps,q()||b.memoizedProps!==e||(e=b.memoizedProps),d=e.children,b.stateNode=null===a?Ze(b,b.stateNode,d,c):Ye(b,a.stateNode,d,c),b.memoizedProps=e,b.stateNode;case 9:return null;case 4:return Y(b,b.stateNode.containerInfo),e=b.pendingProps,q()||b.memoizedProps!==e?(null===a?b.child=Ye(b,null,e,c):g(a,b,e),b.memoizedProps=\ne,a=b.child):a=r(a,b),a;case 14:return c=b.type.render,c=c(b.pendingProps,b.ref),g(a,b,c),b.memoizedProps=c,b.child;case 10:return c=b.pendingProps,q()||b.memoizedProps!==c?(g(a,b,c),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 11:return c=b.pendingProps.children,q()||null!==c&&b.memoizedProps!==c?(g(a,b,c),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 13:return B(a,b,c);case 12:a:{d=b.type;f=b.pendingProps;h=b.memoizedProps;e=d._currentValue;var t=d._changedBits;if(q()||0!==t||h!==f){b.memoizedProps=\nf;var k=f.unstable_observedBits;if(void 0===k||null===k)k=1073741823;b.stateNode=k;if(0!==(t&k))z(b,d,t,c);else if(h===f){a=r(a,b);break a}c=f.children;c=c(e);g(a,b,c);a=b.child}else a=r(a,b)}return a;default:D(\"156\")}}}}\nfunction af(a,b,c,d,e){function f(a){a.effectTag|=4}var h=a.createInstance,g=a.createTextInstance,k=a.appendInitialChild,v=a.finalizeInitialChildren,l=a.prepareUpdate,p=a.persistence,z=b.getRootHostContainer,B=b.popHostContext,r=b.getHostContext,Q=b.popHostContainer,n=c.popContextProvider,x=c.popTopLevelContextObject,Y=d.popProvider,G=e.prepareToHydrateHostInstance,R=e.prepareToHydrateHostTextInstance,S=e.popHydrationState,q=void 0,u=void 0,t=void 0;a.mutation?(q=function(){},u=function(a,b,c){(b.updateQueue=\nc)&&f(b)},t=function(a,b,c,d){c!==d&&f(b)}):p?D(\"235\"):D(\"236\");return{completeWork:function(a,b,c){var d=b.pendingProps;switch(b.tag){case 1:return null;case 2:return n(b),a=b.stateNode,d=b.updateQueue,null!==d&&null!==d.capturedValues&&(b.effectTag&=-65,\"function\"===typeof a.componentDidCatch?b.effectTag|=256:d.capturedValues=null),null;case 3:Q(b);x(b);d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)S(b),b.effectTag&=-3;q(b);a=b.updateQueue;\nnull!==a&&null!==a.capturedValues&&(b.effectTag|=256);return null;case 5:B(b);c=z();var e=b.type;if(null!==a&&null!=b.stateNode){var p=a.memoizedProps,H=b.stateNode,y=r();H=l(H,e,p,d,c,y);u(a,b,H,e,p,d,c,y);a.ref!==b.ref&&(b.effectTag|=128)}else{if(!d)return null===b.stateNode?D(\"166\"):void 0,null;a=r();if(S(b))G(b,c,a)&&f(b);else{p=h(e,d,c,a,b);a:for(y=b.child;null!==y;){if(5===y.tag||6===y.tag)k(p,y.stateNode);else if(4!==y.tag&&null!==y.child){y.child[\"return\"]=y;y=y.child;continue}if(y===b)break;\nfor(;null===y.sibling;){if(null===y[\"return\"]||y[\"return\"]===b)break a;y=y[\"return\"]}y.sibling[\"return\"]=y[\"return\"];y=y.sibling}v(p,e,d,c,a)&&f(b);b.stateNode=p}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)t(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d)return null===b.stateNode?D(\"166\"):void 0,null;a=z();c=r();S(b)?R(b)&&f(b):b.stateNode=g(d,a,c,b)}return null;case 7:(d=b.memoizedProps)?void 0:D(\"165\");b.tag=8;e=[];a:for((p=b.stateNode)&&(p[\"return\"]=b);null!==\np;){if(5===p.tag||6===p.tag||4===p.tag)D(\"247\");else if(9===p.tag)e.push(p.pendingProps.value);else if(null!==p.child){p.child[\"return\"]=p;p=p.child;continue}for(;null===p.sibling;){if(null===p[\"return\"]||p[\"return\"]===b)break a;p=p[\"return\"]}p.sibling[\"return\"]=p[\"return\"];p=p.sibling}p=d.handler;d=p(d.props,e);b.child=Ye(b,null!==a?a.child:null,d,c);return b.child;case 8:return b.tag=7,null;case 9:return null;case 14:return null;case 10:return null;case 11:return null;case 4:return Q(b),q(b),null;\ncase 13:return Y(b),null;case 12:return null;case 0:D(\"167\");default:D(\"156\")}}}}\nfunction bf(a,b,c,d,e){var f=a.popHostContainer,h=a.popHostContext,g=b.popContextProvider,k=b.popTopLevelContextObject,v=c.popProvider;return{throwException:function(a,b,c){b.effectTag|=512;b.firstEffect=b.lastEffect=null;b={value:c,source:b,stack:Bc(b)};do{switch(a.tag){case 3:Oe(a);a.updateQueue.capturedValues=[b];a.effectTag|=1024;return;case 2:if(c=a.stateNode,0===(a.effectTag&64)&&null!==c&&\"function\"===typeof c.componentDidCatch&&!e(c)){Oe(a);c=a.updateQueue;var d=c.capturedValues;null===d?\nc.capturedValues=[b]:d.push(b);a.effectTag|=1024;return}}a=a[\"return\"]}while(null!==a)},unwindWork:function(a){switch(a.tag){case 2:g(a);var b=a.effectTag;return b&1024?(a.effectTag=b&-1025|64,a):null;case 3:return f(a),k(a),b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 5:return h(a),null;case 4:return f(a),null;case 13:return v(a),null;default:return null}},unwindInterruptedWork:function(a){switch(a.tag){case 2:g(a);break;case 3:f(a);k(a);break;case 5:h(a);break;case 4:f(a);break;case 13:v(a)}}}}\nfunction cf(a,b){var c=b.source;null===b.stack&&Bc(c);null!==c&&Ac(c);b=b.value;null!==a&&2===a.tag&&Ac(a);try{b&&b.suppressReactErrorLogging||console.error(b)}catch(d){d&&d.suppressReactErrorLogging||console.error(d)}}\nfunction df(a,b,c,d,e){function f(a){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(t){b(a,t)}else c.current=null}function h(a){\"function\"===typeof Je&&Je(a);switch(a.tag){case 2:f(a);var c=a.stateNode;if(\"function\"===typeof c.componentWillUnmount)try{c.props=a.memoizedProps,c.state=a.memoizedState,c.componentWillUnmount()}catch(t){b(a,t)}break;case 5:f(a);break;case 7:g(a.stateNode);break;case 4:p&&v(a)}}function g(a){for(var b=a;;)if(h(b),null===b.child||p&&4===b.tag){if(b===\na)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}else b.child[\"return\"]=b,b=b.child}function k(a){return 5===a.tag||3===a.tag||4===a.tag}function v(a){for(var b=a,c=!1,d=void 0,e=void 0;;){if(!c){c=b[\"return\"];a:for(;;){null===c?D(\"160\"):void 0;switch(c.tag){case 5:d=c.stateNode;e=!1;break a;case 3:d=c.stateNode.containerInfo;e=!0;break a;case 4:d=c.stateNode.containerInfo;e=!0;break a}c=c[\"return\"]}c=!0}if(5===\nb.tag||6===b.tag)g(b),e?S(d,b.stateNode):R(d,b.stateNode);else if(4===b.tag?d=b.stateNode.containerInfo:h(b),null!==b.child){b.child[\"return\"]=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"];4===b.tag&&(c=!1)}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}var l=a.getPublicInstance,p=a.mutation;a=a.persistence;p||(a?D(\"235\"):D(\"236\"));var z=p.commitMount,B=p.commitUpdate,r=p.resetTextContent,Q=p.commitTextUpdate,n=p.appendChild,\nx=p.appendChildToContainer,Y=p.insertBefore,G=p.insertInContainerBefore,R=p.removeChild,S=p.removeChildFromContainer;return{commitBeforeMutationLifeCycles:function(a,b){switch(b.tag){case 2:if(b.effectTag&2048&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;a.props=b.memoizedProps;a.state=b.memoizedState;b=a.getSnapshotBeforeUpdate(c,d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:break;default:D(\"163\")}},commitResetTextContent:function(a){r(a.stateNode)},\ncommitPlacement:function(a){a:{for(var b=a[\"return\"];null!==b;){if(k(b)){var c=b;break a}b=b[\"return\"]}D(\"160\");c=void 0}var d=b=void 0;switch(c.tag){case 5:b=c.stateNode;d=!1;break;case 3:b=c.stateNode.containerInfo;d=!0;break;case 4:b=c.stateNode.containerInfo;d=!0;break;default:D(\"161\")}c.effectTag&16&&(r(b),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c[\"return\"]||k(c[\"return\"])){c=null;break a}c=c[\"return\"]}c.sibling[\"return\"]=c[\"return\"];for(c=c.sibling;5!==c.tag&&6!==\nc.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;else c.child[\"return\"]=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){if(5===e.tag||6===e.tag)c?d?G(b,e.stateNode,c):Y(b,e.stateNode,c):d?x(b,e.stateNode):n(b,e.stateNode);else if(4!==e.tag&&null!==e.child){e.child[\"return\"]=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e[\"return\"]||e[\"return\"]===a)return;e=e[\"return\"]}e.sibling[\"return\"]=e[\"return\"];e=e.sibling}},commitDeletion:function(a){v(a);\na[\"return\"]=null;a.child=null;a.alternate&&(a.alternate.child=null,a.alternate[\"return\"]=null)},commitWork:function(a,b){switch(b.tag){case 2:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps;a=null!==a?a.memoizedProps:d;var e=b.type,f=b.updateQueue;b.updateQueue=null;null!==f&&B(c,f,e,a,d,b)}break;case 6:null===b.stateNode?D(\"162\"):void 0;c=b.memoizedProps;Q(b.stateNode,null!==a?a.memoizedProps:c,c);break;case 3:break;default:D(\"163\")}},commitLifeCycles:function(a,b,c){switch(c.tag){case 2:a=\nc.stateNode;if(c.effectTag&4)if(null===b)a.props=c.memoizedProps,a.state=c.memoizedState,a.componentDidMount();else{var d=b.memoizedProps;b=b.memoizedState;a.props=c.memoizedProps;a.state=c.memoizedState;a.componentDidUpdate(d,b,a.__reactInternalSnapshotBeforeUpdate)}c=c.updateQueue;null!==c&&Se(c,a);break;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=l(c.child.stateNode);break;case 2:a=c.child.stateNode}Se(b,a)}break;case 5:a=c.stateNode;null===b&&c.effectTag&\n4&&z(a,c.type,c.memoizedProps,c);break;case 6:break;case 4:break;default:D(\"163\")}},commitErrorLogging:function(a,b){switch(a.tag){case 2:var c=a.type;b=a.stateNode;var d=a.updateQueue;null===d||null===d.capturedValues?D(\"264\"):void 0;var f=d.capturedValues;d.capturedValues=null;\"function\"!==typeof c.getDerivedStateFromCatch&&e(b);b.props=a.memoizedProps;b.state=a.memoizedState;for(c=0;c<f.length;c++){d=f[c];var l=d.value,g=d.stack;cf(a,d);b.componentDidCatch(l,{componentStack:null!==g?g:\"\"})}break;\ncase 3:c=a.updateQueue;null===c||null===c.capturedValues?D(\"264\"):void 0;f=c.capturedValues;c.capturedValues=null;for(c=0;c<f.length;c++)d=f[c],cf(a,d),b(d.value);break;default:D(\"265\")}},commitAttachRef:function(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=l(c);break;default:a=c}\"function\"===typeof b?b(a):b.current=a}},commitDetachRef:function(a){a=a.ref;null!==a&&(\"function\"===typeof a?a(null):a.current=null)}}}var ef={};\nfunction ff(a,b){function c(a){a===ef?D(\"174\"):void 0;return a}var d=a.getChildHostContext,e=a.getRootHostContext;a=b.createCursor;var f=b.push,h=b.pop,g=a(ef),k=a(ef),v=a(ef);return{getHostContext:function(){return c(g.current)},getRootHostContainer:function(){return c(v.current)},popHostContainer:function(a){h(g,a);h(k,a);h(v,a)},popHostContext:function(a){k.current===a&&(h(g,a),h(k,a))},pushHostContainer:function(a,b){f(v,b,a);f(k,a,a);f(g,ef,a);b=e(b);h(g,a);f(g,b,a)},pushHostContext:function(a){var b=\nc(v.current),e=c(g.current);b=d(e,a.type,b);e!==b&&(f(k,a,a),f(g,b,a))}}}\nfunction gf(a){function b(a,b){var c=new xe(5,null,null,0);c.type=\"DELETED\";c.stateNode=b;c[\"return\"]=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function c(a,b){switch(a.tag){case 5:return b=f(b,a.type,a.pendingProps),null!==b?(a.stateNode=b,!0):!1;case 6:return b=h(b,a.pendingProps),null!==b?(a.stateNode=b,!0):!1;default:return!1}}function d(a){for(a=a[\"return\"];null!==a&&5!==a.tag&&3!==a.tag;)a=a[\"return\"];p=a}var e=a.shouldSetTextContent;\na=a.hydration;if(!a)return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){D(\"175\")},prepareToHydrateHostTextInstance:function(){D(\"176\")},popHydrationState:function(){return!1}};var f=a.canHydrateInstance,h=a.canHydrateTextInstance,g=a.getNextHydratableSibling,k=a.getFirstHydratableChild,v=a.hydrateInstance,l=a.hydrateTextInstance,p=null,z=null,B=!1;return{enterHydrationState:function(a){z=\nk(a.stateNode.containerInfo);p=a;return B=!0},resetHydrationState:function(){z=p=null;B=!1},tryToClaimNextHydratableInstance:function(a){if(B){var d=z;if(d){if(!c(a,d)){d=g(d);if(!d||!c(a,d)){a.effectTag|=2;B=!1;p=a;return}b(p,z)}p=a;z=k(d)}else a.effectTag|=2,B=!1,p=a}},prepareToHydrateHostInstance:function(a,b,c){b=v(a.stateNode,a.type,a.memoizedProps,b,c,a);a.updateQueue=b;return null!==b?!0:!1},prepareToHydrateHostTextInstance:function(a){return l(a.stateNode,a.memoizedProps,a)},popHydrationState:function(a){if(a!==\np)return!1;if(!B)return d(a),B=!0,!1;var c=a.type;if(5!==a.tag||\"head\"!==c&&\"body\"!==c&&!e(c,a.memoizedProps))for(c=z;c;)b(a,c),c=g(c);d(a);z=p?g(a.stateNode):null;return!0}}}\nfunction hf(a){function b(a,b,c){a=a.stateNode;a.__reactInternalMemoizedUnmaskedChildContext=b;a.__reactInternalMemoizedMaskedChildContext=c}function c(a){return 2===a.tag&&null!=a.type.childContextTypes}function d(a,b){var c=a.stateNode,d=a.type.childContextTypes;if(\"function\"!==typeof c.getChildContext)return b;c=c.getChildContext();for(var e in c)e in d?void 0:D(\"108\",Ac(a)||\"Unknown\",e);return A({},b,c)}var e=a.createCursor,f=a.push,h=a.pop,g=e(ka),k=e(!1),v=ka;return{getUnmaskedContext:function(a){return c(a)?\nv:g.current},cacheContext:b,getMaskedContext:function(a,c){var d=a.type.contextTypes;if(!d)return ka;var e=a.stateNode;if(e&&e.__reactInternalMemoizedUnmaskedChildContext===c)return e.__reactInternalMemoizedMaskedChildContext;var f={},g;for(g in d)f[g]=c[g];e&&b(a,c,f);return f},hasContextChanged:function(){return k.current},isContextConsumer:function(a){return 2===a.tag&&null!=a.type.contextTypes},isContextProvider:c,popContextProvider:function(a){c(a)&&(h(k,a),h(g,a))},popTopLevelContextObject:function(a){h(k,\na);h(g,a)},pushTopLevelContextObject:function(a,b,c){null!=g.cursor?D(\"168\"):void 0;f(g,b,a);f(k,c,a)},processChildContext:d,pushContextProvider:function(a){if(!c(a))return!1;var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||ka;v=g.current;f(g,b,a);f(k,k.current,a);return!0},invalidateContextProvider:function(a,b){var c=a.stateNode;c?void 0:D(\"169\");if(b){var e=d(a,v);c.__reactInternalMemoizedMergedChildContext=e;h(k,a);h(g,a);f(g,e,a)}else h(k,a);f(k,b,a)},findCurrentUnmaskedContext:function(a){for(2!==\nxd(a)||2!==a.tag?D(\"170\"):void 0;3!==a.tag;){if(c(a))return a.stateNode.__reactInternalMemoizedMergedChildContext;(a=a[\"return\"])?void 0:D(\"171\")}return a.stateNode.context}}}\nfunction jf(a){var b=a.createCursor,c=a.push,d=a.pop,e=b(null),f=b(null),h=b(0);return{pushProvider:function(a){var b=a.type._context;c(h,b._changedBits,a);c(f,b._currentValue,a);c(e,a,a);b._currentValue=a.pendingProps.value;b._changedBits=a.stateNode},popProvider:function(a){var b=h.current,c=f.current;d(e,a);d(f,a);d(h,a);a=a.type._context;a._currentValue=c;a._changedBits=b}}}\nfunction kf(){var a=[],b=-1;return{createCursor:function(a){return{current:a}},isEmpty:function(){return-1===b},pop:function(c){0>b||(c.current=a[b],a[b]=null,b--)},push:function(c,d){b++;a[b]=c.current;c.current=d},checkThatStackIsEmpty:function(){},resetStackAfterFatalErrorInDev:function(){}}}\nfunction lf(a){function b(){if(null!==I)for(var a=I[\"return\"];null!==a;)Lc(a),a=a[\"return\"];Ya=null;Z=0;I=null;Nc=!1}function c(a){return null!==ya&&ya.has(a)}function d(a){for(;;){var b=a.alternate,c=a[\"return\"],d=a.sibling;if(0===(a.effectTag&512)){b=Cb(b,a,Z);var e=a;if(1073741823===Z||1073741823!==e.expirationTime){b:switch(e.tag){case 3:case 2:var f=e.updateQueue;f=null===f?0:f.expirationTime;break b;default:f=0}for(var g=e.child;null!==g;)0!==g.expirationTime&&(0===f||f>g.expirationTime)&&(f=\ng.expirationTime),g=g.sibling;e.expirationTime=f}if(null!==b)return b;null!==c&&0===(c.effectTag&512)&&(null===c.firstEffect&&(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1<a.effectTag&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a));if(null!==d)return d;if(null!==c)a=c;else{Nc=!0;break}}else{a=Kc(a);if(null!==a)return a.effectTag&=2559,a;null!==c&&(c.firstEffect=c.lastEffect=\nnull,c.effectTag|=512);if(null!==d)return d;if(null!==c)a=c;else break}}return null}function e(a){var b=Wa(a.alternate,a,Z);null===b&&(b=d(a));nc.current=null;return b}function f(a,c,f){ca?D(\"243\"):void 0;ca=!0;if(c!==Z||a!==Ya||null===I)b(),Ya=a,Z=c,I=ze(Ya.current,null,Z),a.pendingCommitExpirationTime=0;var g=!1;do{try{if(f)for(;null!==I&&!S();)I=e(I);else for(;null!==I;)I=e(I)}catch(Oc){if(null===I){g=!0;q(Oc);break}f=I;var h=f[\"return\"];if(null===h){g=!0;q(Oc);break}Jc(h,f,Oc);I=d(f)}break}while(1);\nca=!1;if(g||null!==I)return null;if(Nc)return a.pendingCommitExpirationTime=c,a.current.alternate;D(\"262\")}function h(a,b,c,d){a={value:c,source:a,stack:Bc(a)};Pe(b,{expirationTime:d,partialState:null,callback:null,isReplace:!1,isForced:!1,capturedValue:a,next:null});v(b,d)}function g(a,b){a:{ca&&!Za?D(\"263\"):void 0;for(var d=a[\"return\"];null!==d;){switch(d.tag){case 2:var e=d.stateNode;if(\"function\"===typeof d.type.getDerivedStateFromCatch||\"function\"===typeof e.componentDidCatch&&!c(e)){h(a,d,b,\n1);a=void 0;break a}break;case 3:h(a,d,b,1);a=void 0;break a}d=d[\"return\"]}3===a.tag&&h(a,a,b,1);a=void 0}return a}function k(a){a=0!==ia?ia:ca?Za?1:Z:a.mode&1?za?10*(((l()+15)/10|0)+1):25*(((l()+500)/25|0)+1):1;za&&(0===da||a>da)&&(da=a);return a}function v(a,c){a:{for(;null!==a;){if(0===a.expirationTime||a.expirationTime>c)a.expirationTime=c;null!==a.alternate&&(0===a.alternate.expirationTime||a.alternate.expirationTime>c)&&(a.alternate.expirationTime=c);if(null===a[\"return\"])if(3===a.tag){var d=\na.stateNode;!ca&&0!==Z&&c<Z&&b();ca&&!Za&&Ya===d||B(d,c);Fb>xg&&D(\"185\")}else{c=void 0;break a}a=a[\"return\"]}c=void 0}return c}function l(){ye=Ic()-Pc;return yg=(ye/10|0)+2}function p(a,b,c,d,e){var f=ia;ia=1;try{return a(b,c,d,e)}finally{ia=f}}function z(a){if(0!==Gb){if(a>Gb)return;mg(Qc)}var b=Ic()-Pc;Gb=a;Qc=lg(Q,{timeout:10*(a-2)-b})}function B(a,b){if(null===a.nextScheduledRoot)a.remainingExpirationTime=b,null===K?(la=K=a,a.nextScheduledRoot=a):(K=K.nextScheduledRoot=a,K.nextScheduledRoot=la);\nelse{var c=a.remainingExpirationTime;if(0===c||b<c)a.remainingExpirationTime=b}T||(J?Hb&&(aa=a,P=1,G(a,1,!1)):1===b?n():z(b))}function r(){var a=0,b=null;if(null!==K)for(var c=K,d=la;null!==d;){var e=d.remainingExpirationTime;if(0===e){null===c||null===K?D(\"244\"):void 0;if(d===d.nextScheduledRoot){la=K=d.nextScheduledRoot=null;break}else if(d===la)la=e=d.nextScheduledRoot,K.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===K){K=c;K.nextScheduledRoot=la;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=\nd.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{if(0===a||e<a)a=e,b=d;if(d===K)break;c=d;d=d.nextScheduledRoot}}c=aa;null!==c&&c===b&&1===a?Fb++:Fb=0;aa=b;P=a}function Q(a){x(0,!0,a)}function n(){x(1,!1,null)}function x(a,b,c){$a=c;r();if(b)for(;null!==aa&&0!==P&&(0===a||a>=P)&&(!Ib||l()>=P);)G(aa,P,!Ib),r();else for(;null!==aa&&0!==P&&(0===a||a>=P);)G(aa,P,!1),r();null!==$a&&(Gb=0,Qc=-1);0!==P&&z(P);$a=null;Ib=!1;Y()}function Y(){Fb=0;if(null!==Aa){var a=Aa;Aa=null;for(var b=\n0;b<a.length;b++){var c=a[b];try{c._onComplete()}catch(wg){Ba||(Ba=!0,Jb=wg)}}}if(Ba)throw a=Jb,Jb=null,Ba=!1,a;}function G(a,b,c){T?D(\"245\"):void 0;T=!0;c?(c=a.finishedWork,null!==c?R(a,c,b):(a.finishedWork=null,c=f(a,b,!0),null!==c&&(S()?a.finishedWork=c:R(a,c,b)))):(c=a.finishedWork,null!==c?R(a,c,b):(a.finishedWork=null,c=f(a,b,!1),null!==c&&R(a,c,b)));T=!1}function R(a,b,c){var d=a.firstBatch;if(null!==d&&d._expirationTime<=c&&(null===Aa?Aa=[d]:Aa.push(d),d._defer)){a.finishedWork=b;a.remainingExpirationTime=\n0;return}a.finishedWork=null;Za=ca=!0;c=b.stateNode;c.current===b?D(\"177\"):void 0;d=c.pendingCommitExpirationTime;0===d?D(\"261\"):void 0;c.pendingCommitExpirationTime=0;var e=l();nc.current=null;if(1<b.effectTag)if(null!==b.lastEffect){b.lastEffect.nextEffect=b;var f=b.firstEffect}else f=b;else f=b.firstEffect;zg(c.containerInfo);for(w=f;null!==w;){var h=!1,k=void 0;try{for(;null!==w;)w.effectTag&2048&&Db(w.alternate,w),w=w.nextEffect}catch(ab){h=!0,k=ab}h&&(null===w?D(\"178\"):void 0,g(w,k),null!==\nw&&(w=w.nextEffect))}for(w=f;null!==w;){h=!1;k=void 0;try{for(;null!==w;){var p=w.effectTag;p&16&&Mc(w);if(p&128){var n=w.alternate;null!==n&&kg(n)}switch(p&14){case 2:Eb(w);w.effectTag&=-3;break;case 6:Eb(w);w.effectTag&=-3;we(w.alternate,w);break;case 4:we(w.alternate,w);break;case 8:gg(w)}w=w.nextEffect}}catch(ab){h=!0,k=ab}h&&(null===w?D(\"178\"):void 0,g(w,k),null!==w&&(w=w.nextEffect))}Ag(c.containerInfo);c.current=b;for(w=f;null!==w;){p=!1;n=void 0;try{for(f=c,h=e,k=d;null!==w;){var r=w.effectTag;\nr&36&&hg(f,w.alternate,w,h,k);r&256&&ig(w,q);r&128&&jg(w);var t=w.nextEffect;w.nextEffect=null;w=t}}catch(ab){p=!0,n=ab}p&&(null===w?D(\"178\"):void 0,g(w,n),null!==w&&(w=w.nextEffect))}ca=Za=!1;\"function\"===typeof Ie&&Ie(b.stateNode);b=c.current.expirationTime;0===b&&(ya=null);a.remainingExpirationTime=b}function S(){return null===$a||$a.timeRemaining()>Bg?!1:Ib=!0}function q(a){null===aa?D(\"246\"):void 0;aa.remainingExpirationTime=0;Ba||(Ba=!0,Jb=a)}var u=kf(),t=ff(a,u),y=hf(u);u=jf(u);var H=gf(a),\nWa=$e(a,t,y,u,H,v,k).beginWork,Cb=af(a,t,y,u,H).completeWork;t=bf(t,y,u,v,c);var Jc=t.throwException,Kc=t.unwindWork,Lc=t.unwindInterruptedWork;t=df(a,g,v,k,function(a){null===ya?ya=new Set([a]):ya.add(a)},l);var Db=t.commitBeforeMutationLifeCycles,Mc=t.commitResetTextContent,Eb=t.commitPlacement,gg=t.commitDeletion,we=t.commitWork,hg=t.commitLifeCycles,ig=t.commitErrorLogging,jg=t.commitAttachRef,kg=t.commitDetachRef,Ic=a.now,lg=a.scheduleDeferredCallback,mg=a.cancelDeferredCallback,zg=a.prepareForCommit,\nAg=a.resetAfterCommit,Pc=Ic(),yg=2,ye=Pc,Rc=0,ia=0,ca=!1,I=null,Ya=null,Z=0,w=null,Za=!1,Nc=!1,ya=null,la=null,K=null,Gb=0,Qc=-1,T=!1,aa=null,P=0,da=0,Ib=!1,Ba=!1,Jb=null,$a=null,J=!1,Hb=!1,za=!1,Aa=null,xg=1E3,Fb=0,Bg=1;return{recalculateCurrentTime:l,computeExpirationForFiber:k,scheduleWork:v,requestWork:B,flushRoot:function(a,b){T?D(\"253\"):void 0;aa=a;P=b;G(a,b,!1);n();Y()},batchedUpdates:function(a,b){var c=J;J=!0;try{return a(b)}finally{(J=c)||T||n()}},unbatchedUpdates:function(a,b){if(J&&!Hb){Hb=\n!0;try{return a(b)}finally{Hb=!1}}return a(b)},flushSync:function(a,b){T?D(\"187\"):void 0;var c=J;J=!0;try{return p(a,b)}finally{J=c,n()}},flushControlled:function(a){var b=J;J=!0;try{p(a)}finally{(J=b)||T||x(1,!1,null)}},deferredUpdates:function(a){var b=ia;ia=25*(((l()+500)/25|0)+1);try{return a()}finally{ia=b}},syncUpdates:p,interactiveUpdates:function(a,b,c){if(za)return a(b,c);J||T||0===da||(x(da,!1,null),da=0);var d=za,e=J;J=za=!0;try{return a(b,c)}finally{za=d,(J=e)||T||n()}},flushInteractiveUpdates:function(){T||\n0===da||(x(da,!1,null),da=0)},computeUniqueAsyncExpiration:function(){var a=25*(((l()+500)/25|0)+1);a<=Rc&&(a=Rc+1);return Rc=a},legacyContext:y}}\nfunction mf(a){function b(a,b,c,d,e,h){d=b.current;if(c){c=c._reactInternalFiber;var l=g(c);c=k(c)?v(c,l):l}else c=ka;null===b.context?b.context=c:b.pendingContext=c;b=h;Pe(d,{expirationTime:e,partialState:{element:a},callback:void 0===b?null:b,isReplace:!1,isForced:!1,capturedValue:null,next:null});f(d,e);return e}var c=a.getPublicInstance;a=lf(a);var d=a.recalculateCurrentTime,e=a.computeExpirationForFiber,f=a.scheduleWork,h=a.legacyContext,g=h.findCurrentUnmaskedContext,k=h.isContextProvider,v=\nh.processChildContext;return{createContainer:function(a,b,c){b=new xe(3,null,null,b?3:0);a={current:b,containerInfo:a,pendingChildren:null,pendingCommitExpirationTime:0,finishedWork:null,context:null,pendingContext:null,hydrate:c,remainingExpirationTime:0,firstBatch:null,nextScheduledRoot:null};return b.stateNode=a},updateContainer:function(a,c,f,h){var g=c.current,k=d();g=e(g);return b(a,c,f,k,g,h)},updateContainerAtExpirationTime:function(a,c,e,f,g){var h=d();return b(a,c,e,h,f,g)},flushRoot:a.flushRoot,\nrequestWork:a.requestWork,computeUniqueAsyncExpiration:a.computeUniqueAsyncExpiration,batchedUpdates:a.batchedUpdates,unbatchedUpdates:a.unbatchedUpdates,deferredUpdates:a.deferredUpdates,syncUpdates:a.syncUpdates,interactiveUpdates:a.interactiveUpdates,flushInteractiveUpdates:a.flushInteractiveUpdates,flushControlled:a.flushControlled,flushSync:a.flushSync,getPublicRootInstance:function(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return c(a.child.stateNode);default:return a.child.stateNode}},\nfindHostInstance:function(a){var b=a._reactInternalFiber;void 0===b&&(\"function\"===typeof a.render?D(\"188\"):D(\"268\",Object.keys(a)));a=Bd(b);return null===a?null:a.stateNode},findHostInstanceWithNoPortals:function(a){a=Cd(a);return null===a?null:a.stateNode},injectIntoDevTools:function(a){var b=a.findFiberByHostInstance;return He(A({},a,{findHostInstanceByFiber:function(a){a=Bd(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null}}))}}}\nvar nf=Object.freeze({default:mf}),of=nf&&mf||nf,pf=of[\"default\"]?of[\"default\"]:of;function qf(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:rc,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}var rf=\"object\"===typeof performance&&\"function\"===typeof performance.now,sf=void 0;sf=rf?function(){return performance.now()}:function(){return Date.now()};var tf=void 0,uf=void 0;\nif(m.canUseDOM)if(\"function\"!==typeof requestIdleCallback||\"function\"!==typeof cancelIdleCallback){var vf=null,wf=!1,xf=-1,yf=!1,zf=0,Af=33,Bf=33,Cf=void 0;Cf=rf?{didTimeout:!1,timeRemaining:function(){var a=zf-performance.now();return 0<a?a:0}}:{didTimeout:!1,timeRemaining:function(){var a=zf-Date.now();return 0<a?a:0}};var Df=\"__reactIdleCallback$\"+Math.random().toString(36).slice(2);window.addEventListener(\"message\",function(a){if(a.source===window&&a.data===Df){wf=!1;a=sf();if(0>=zf-a)if(-1!==\nxf&&xf<=a)Cf.didTimeout=!0;else{yf||(yf=!0,requestAnimationFrame(Ef));return}else Cf.didTimeout=!1;xf=-1;a=vf;vf=null;null!==a&&a(Cf)}},!1);var Ef=function(a){yf=!1;var b=a-zf+Bf;b<Bf&&Af<Bf?(8>b&&(b=8),Bf=b<Af?Af:b):Af=b;zf=a+Bf;wf||(wf=!0,window.postMessage(Df,\"*\"))};tf=function(a,b){vf=a;null!=b&&\"number\"===typeof b.timeout&&(xf=sf()+b.timeout);yf||(yf=!0,requestAnimationFrame(Ef));return 0};uf=function(){vf=null;wf=!1;xf=-1}}else tf=window.requestIdleCallback,uf=window.cancelIdleCallback;else tf=\nfunction(a){return setTimeout(function(){a({timeRemaining:function(){return Infinity},didTimeout:!1})})},uf=function(a){clearTimeout(a)};function Ff(a){var b=\"\";ea.Children.forEach(a,function(a){null==a||\"string\"!==typeof a&&\"number\"!==typeof a||(b+=a)});return b}function Gf(a,b){a=A({children:void 0},b);if(b=Ff(b.children))a.children=b;return a}\nfunction Hf(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+c;b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction If(a,b){var c=b.value;a._wrapperState={initialValue:null!=c?c:b.defaultValue,wasMultiple:!!b.multiple}}function Jf(a,b){null!=b.dangerouslySetInnerHTML?D(\"91\"):void 0;return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Kf(a,b){var c=b.value;null==c&&(c=b.defaultValue,b=b.children,null!=b&&(null!=c?D(\"92\"):void 0,Array.isArray(b)&&(1>=b.length?void 0:D(\"93\"),b=b[0]),c=\"\"+b),null==c&&(c=\"\"));a._wrapperState={initialValue:\"\"+c}}\nfunction Lf(a,b){var c=b.value;null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=b.defaultValue)}function Mf(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var Nf={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Of(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Pf(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Of(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Qf=void 0,Rf=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Nf.svg||\"innerHTML\"in a)a.innerHTML=b;else{Qf=Qf||document.createElement(\"div\");Qf.innerHTML=\"\\x3csvg\\x3e\"+b+\"\\x3c/svg\\x3e\";for(b=Qf.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Sf(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar Tf={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,\nstopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Uf=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Tf).forEach(function(a){Uf.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Tf[b]=Tf[a]})});\nfunction Vf(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\");var e=c;var f=b[c];e=null==f||\"boolean\"===typeof f||\"\"===f?\"\":d||\"number\"!==typeof f||0===f||Tf.hasOwnProperty(e)&&Tf[e]?(\"\"+f).trim():f+\"px\";\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Wf=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Xf(a,b,c){b&&(Wf[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?D(\"137\",a,c()):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?D(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:D(\"61\")),null!=b.style&&\"object\"!==typeof b.style?D(\"62\",c()):void 0)}\nfunction Yf(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var Zf=C.thatReturns(\"\");\nfunction $f(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=ke(a);b=va[b];for(var d=0;d<b.length;d++){var e=b[d];c.hasOwnProperty(e)&&c[e]||(\"topScroll\"===e?Zd(\"topScroll\",\"scroll\",a):\"topFocus\"===e||\"topBlur\"===e?(Zd(\"topFocus\",\"focus\",a),Zd(\"topBlur\",\"blur\",a),c.topBlur=!0,c.topFocus=!0):\"topCancel\"===e?(ic(\"cancel\",!0)&&Zd(\"topCancel\",\"cancel\",a),c.topCancel=!0):\"topClose\"===e?(ic(\"close\",!0)&&Zd(\"topClose\",\"close\",a),c.topClose=!0):fe.hasOwnProperty(e)&&W(e,fe[e],a),c[e]=!0)}}\nfunction ag(a,b,c,d){c=9===c.nodeType?c:c.ownerDocument;d===Nf.html&&(d=Of(a));d===Nf.html?\"script\"===a?(a=c.createElement(\"div\"),a.innerHTML=\"\\x3cscript\\x3e\\x3c/script\\x3e\",a=a.removeChild(a.firstChild)):a=\"string\"===typeof b.is?c.createElement(a,{is:b.is}):c.createElement(a):a=c.createElementNS(d,a);return a}function bg(a,b){return(9===b.nodeType?b:b.ownerDocument).createTextNode(a)}\nfunction cg(a,b,c,d){var e=Yf(b,c);switch(b){case \"iframe\":case \"object\":W(\"topLoad\",\"load\",a);var f=c;break;case \"video\":case \"audio\":for(f in ge)ge.hasOwnProperty(f)&&W(f,ge[f],a);f=c;break;case \"source\":W(\"topError\",\"error\",a);f=c;break;case \"img\":case \"image\":case \"link\":W(\"topError\",\"error\",a);W(\"topLoad\",\"load\",a);f=c;break;case \"form\":W(\"topReset\",\"reset\",a);W(\"topSubmit\",\"submit\",a);f=c;break;case \"details\":W(\"topToggle\",\"toggle\",a);f=c;break;case \"input\":Wc(a,c);f=Vc(a,c);W(\"topInvalid\",\n\"invalid\",a);$f(d,\"onChange\");break;case \"option\":f=Gf(a,c);break;case \"select\":If(a,c);f=A({},c,{value:void 0});W(\"topInvalid\",\"invalid\",a);$f(d,\"onChange\");break;case \"textarea\":Kf(a,c);f=Jf(a,c);W(\"topInvalid\",\"invalid\",a);$f(d,\"onChange\");break;default:f=c}Xf(b,f,Zf);var h=f,g;for(g in h)if(h.hasOwnProperty(g)){var k=h[g];\"style\"===g?Vf(a,k,Zf):\"dangerouslySetInnerHTML\"===g?(k=k?k.__html:void 0,null!=k&&Rf(a,k)):\"children\"===g?\"string\"===typeof k?(\"textarea\"!==b||\"\"!==k)&&Sf(a,k):\"number\"===typeof k&&\nSf(a,\"\"+k):\"suppressContentEditableWarning\"!==g&&\"suppressHydrationWarning\"!==g&&\"autoFocus\"!==g&&(ua.hasOwnProperty(g)?null!=k&&$f(d,g):null!=k&&Uc(a,g,k,e))}switch(b){case \"input\":lc(a);ad(a,c);break;case \"textarea\":lc(a);Mf(a,c);break;case \"option\":null!=c.value&&a.setAttribute(\"value\",c.value);break;case \"select\":a.multiple=!!c.multiple;b=c.value;null!=b?Hf(a,!!c.multiple,b,!1):null!=c.defaultValue&&Hf(a,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof f.onClick&&(a.onclick=C)}}\nfunction dg(a,b,c,d,e){var f=null;switch(b){case \"input\":c=Vc(a,c);d=Vc(a,d);f=[];break;case \"option\":c=Gf(a,c);d=Gf(a,d);f=[];break;case \"select\":c=A({},c,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":c=Jf(a,c);d=Jf(a,d);f=[];break;default:\"function\"!==typeof c.onClick&&\"function\"===typeof d.onClick&&(a.onclick=C)}Xf(b,d,Zf);b=a=void 0;var h=null;for(a in c)if(!d.hasOwnProperty(a)&&c.hasOwnProperty(a)&&null!=c[a])if(\"style\"===a){var g=c[a];for(b in g)g.hasOwnProperty(b)&&(h||\n(h={}),h[b]=\"\")}else\"dangerouslySetInnerHTML\"!==a&&\"children\"!==a&&\"suppressContentEditableWarning\"!==a&&\"suppressHydrationWarning\"!==a&&\"autoFocus\"!==a&&(ua.hasOwnProperty(a)?f||(f=[]):(f=f||[]).push(a,null));for(a in d){var k=d[a];g=null!=c?c[a]:void 0;if(d.hasOwnProperty(a)&&k!==g&&(null!=k||null!=g))if(\"style\"===a)if(g){for(b in g)!g.hasOwnProperty(b)||k&&k.hasOwnProperty(b)||(h||(h={}),h[b]=\"\");for(b in k)k.hasOwnProperty(b)&&g[b]!==k[b]&&(h||(h={}),h[b]=k[b])}else h||(f||(f=[]),f.push(a,h)),\nh=k;else\"dangerouslySetInnerHTML\"===a?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(f=f||[]).push(a,\"\"+k)):\"children\"===a?g===k||\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(a,\"\"+k):\"suppressContentEditableWarning\"!==a&&\"suppressHydrationWarning\"!==a&&(ua.hasOwnProperty(a)?(null!=k&&$f(e,a),f||g===k||(f=[])):(f=f||[]).push(a,k))}h&&(f=f||[]).push(\"style\",h);return f}\nfunction eg(a,b,c,d,e){\"input\"===c&&\"radio\"===e.type&&null!=e.name&&Yc(a,e);Yf(c,d);d=Yf(c,e);for(var f=0;f<b.length;f+=2){var h=b[f],g=b[f+1];\"style\"===h?Vf(a,g,Zf):\"dangerouslySetInnerHTML\"===h?Rf(a,g):\"children\"===h?Sf(a,g):Uc(a,h,g,d)}switch(c){case \"input\":Zc(a,e);break;case \"textarea\":Lf(a,e);break;case \"select\":a._wrapperState.initialValue=void 0,b=a._wrapperState.wasMultiple,a._wrapperState.wasMultiple=!!e.multiple,c=e.value,null!=c?Hf(a,!!e.multiple,c,!1):b!==!!e.multiple&&(null!=e.defaultValue?\nHf(a,!!e.multiple,e.defaultValue,!0):Hf(a,!!e.multiple,e.multiple?[]:\"\",!1))}}\nfunction fg(a,b,c,d,e){switch(b){case \"iframe\":case \"object\":W(\"topLoad\",\"load\",a);break;case \"video\":case \"audio\":for(var f in ge)ge.hasOwnProperty(f)&&W(f,ge[f],a);break;case \"source\":W(\"topError\",\"error\",a);break;case \"img\":case \"image\":case \"link\":W(\"topError\",\"error\",a);W(\"topLoad\",\"load\",a);break;case \"form\":W(\"topReset\",\"reset\",a);W(\"topSubmit\",\"submit\",a);break;case \"details\":W(\"topToggle\",\"toggle\",a);break;case \"input\":Wc(a,c);W(\"topInvalid\",\"invalid\",a);$f(e,\"onChange\");break;case \"select\":If(a,\nc);W(\"topInvalid\",\"invalid\",a);$f(e,\"onChange\");break;case \"textarea\":Kf(a,c),W(\"topInvalid\",\"invalid\",a),$f(e,\"onChange\")}Xf(b,c,Zf);d=null;for(var h in c)c.hasOwnProperty(h)&&(f=c[h],\"children\"===h?\"string\"===typeof f?a.textContent!==f&&(d=[\"children\",f]):\"number\"===typeof f&&a.textContent!==\"\"+f&&(d=[\"children\",\"\"+f]):ua.hasOwnProperty(h)&&null!=f&&$f(e,h));switch(b){case \"input\":lc(a);ad(a,c);break;case \"textarea\":lc(a);Mf(a,c);break;case \"select\":case \"option\":break;default:\"function\"===typeof c.onClick&&\n(a.onclick=C)}return d}function ng(a,b){return a.nodeValue!==b}\nvar og=Object.freeze({createElement:ag,createTextNode:bg,setInitialProperties:cg,diffProperties:dg,updateProperties:eg,diffHydratedProperties:fg,diffHydratedText:ng,warnForUnmatchedText:function(){},warnForDeletedHydratableElement:function(){},warnForDeletedHydratableText:function(){},warnForInsertedHydratedElement:function(){},warnForInsertedHydratedText:function(){},restoreControlledState:function(a,b,c){switch(b){case \"input\":Zc(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=\nc.parentNode;c=c.querySelectorAll(\"input[name\\x3d\"+JSON.stringify(\"\"+b)+'][type\\x3d\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Xa(d);e?void 0:D(\"90\");mc(d);Zc(d,e)}}}break;case \"textarea\":Lf(a,c);break;case \"select\":b=c.value,null!=b&&Hf(a,!!c.multiple,b,!1)}}});Tb.injectFiberControlledHostComponent(og);var pg=null,qg=null;\nfunction rg(a){this._expirationTime=X.computeUniqueAsyncExpiration();this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}rg.prototype.render=function(a){this._defer?void 0:D(\"250\");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new sg;X.updateContainerAtExpirationTime(a,b,null,c,d._onCommit);return d};\nrg.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nrg.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:D(\"251\");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?D(\"251\"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;X.flushRoot(a,c);b=this._next;this._next=null;b=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=\nnull,this._defer=!1};rg.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function sg(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}sg.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nsg.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];\"function\"!==typeof c?D(\"191\",c):void 0;c()}}};function tg(a,b,c){this._internalRoot=X.createContainer(a,b,c)}tg.prototype.render=function(a,b){var c=this._internalRoot,d=new sg;b=void 0===b?null:b;null!==b&&d.then(b);X.updateContainer(a,c,null,d._onCommit);return d};\ntg.prototype.unmount=function(a){var b=this._internalRoot,c=new sg;a=void 0===a?null:a;null!==a&&c.then(a);X.updateContainer(null,b,null,c._onCommit);return c};tg.prototype.legacy_renderSubtreeIntoContainer=function(a,b,c){var d=this._internalRoot,e=new sg;c=void 0===c?null:c;null!==c&&e.then(c);X.updateContainer(b,d,a,e._onCommit);return e};\ntg.prototype.createBatch=function(){var a=new rg(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime<=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function ug(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}\nfunction vg(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nvar X=pf({getRootHostContext:function(a){var b=a.nodeType;switch(b){case 9:case 11:a=(a=a.documentElement)?a.namespaceURI:Pf(null,\"\");break;default:b=8===b?a.parentNode:a,a=b.namespaceURI||null,b=b.tagName,a=Pf(a,b)}return a},getChildHostContext:function(a,b){return Pf(a,b)},getPublicInstance:function(a){return a},prepareForCommit:function(){pg=Vd;var a=fa();if(ne(a)){if(\"selectionStart\"in a)var b={start:a.selectionStart,end:a.selectionEnd};else a:{var c=window.getSelection&&window.getSelection();\nif(c&&0!==c.rangeCount){b=c.anchorNode;var d=c.anchorOffset,e=c.focusNode;c=c.focusOffset;try{b.nodeType,e.nodeType}catch(B){b=null;break a}var f=0,h=-1,g=-1,k=0,v=0,l=a,p=null;b:for(;;){for(var z;;){l!==b||0!==d&&3!==l.nodeType||(h=f+d);l!==e||0!==c&&3!==l.nodeType||(g=f+c);3===l.nodeType&&(f+=l.nodeValue.length);if(null===(z=l.firstChild))break;p=l;l=z}for(;;){if(l===a)break b;p===b&&++k===d&&(h=f);p===e&&++v===c&&(g=f);if(null!==(z=l.nextSibling))break;l=p;p=l.parentNode}l=z}b=-1===h||-1===g?null:\n{start:h,end:g}}else b=null}b=b||{start:0,end:0}}else b=null;qg={focusedElem:a,selectionRange:b};Wd(!1)},resetAfterCommit:function(){var a=qg,b=fa(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&ja(document.documentElement,c)){if(ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(window.getSelection){b=window.getSelection();var e=c[mb()].length;a=Math.min(d.start,e);d=void 0===d.end?a:Math.min(d.end,e);!b.extend&&a>\nd&&(e=d,d=a,a=e);e=me(c,a);var f=me(c,d);if(e&&f&&(1!==b.rangeCount||b.anchorNode!==e.node||b.anchorOffset!==e.offset||b.focusNode!==f.node||b.focusOffset!==f.offset)){var h=document.createRange();h.setStart(e.node,e.offset);b.removeAllRanges();a>d?(b.addRange(h),b.extend(f.node,f.offset)):(h.setEnd(f.node,f.offset),b.addRange(h))}}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,\na.element.scrollTop=a.top}qg=null;Wd(pg);pg=null},createInstance:function(a,b,c,d,e){a=ag(a,b,c,d);a[F]=e;a[Ta]=b;return a},appendInitialChild:function(a,b){a.appendChild(b)},finalizeInitialChildren:function(a,b,c,d){cg(a,b,c,d);return vg(b,c)},prepareUpdate:function(a,b,c,d,e){return dg(a,b,c,d,e)},shouldSetTextContent:function(a,b){return\"textarea\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&\"string\"===\ntypeof b.dangerouslySetInnerHTML.__html},shouldDeprioritizeSubtree:function(a,b){return!!b.hidden},createTextInstance:function(a,b,c,d){a=bg(a,b);a[F]=d;return a},now:sf,mutation:{commitMount:function(a,b,c){vg(b,c)&&a.focus()},commitUpdate:function(a,b,c,d,e){a[Ta]=e;eg(a,b,c,d,e)},resetTextContent:function(a){Sf(a,\"\")},commitTextUpdate:function(a,b,c){a.nodeValue=c},appendChild:function(a,b){a.appendChild(b)},appendChildToContainer:function(a,b){8===a.nodeType?a.parentNode.insertBefore(b,a):a.appendChild(b)},\ninsertBefore:function(a,b,c){a.insertBefore(b,c)},insertInContainerBefore:function(a,b,c){8===a.nodeType?a.parentNode.insertBefore(b,c):a.insertBefore(b,c)},removeChild:function(a,b){a.removeChild(b)},removeChildFromContainer:function(a,b){8===a.nodeType?a.parentNode.removeChild(b):a.removeChild(b)}},hydration:{canHydrateInstance:function(a,b){return 1!==a.nodeType||b.toLowerCase()!==a.nodeName.toLowerCase()?null:a},canHydrateTextInstance:function(a,b){return\"\"===b||3!==a.nodeType?null:a},getNextHydratableSibling:function(a){for(a=\na.nextSibling;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a},getFirstHydratableChild:function(a){for(a=a.firstChild;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a},hydrateInstance:function(a,b,c,d,e,f){a[F]=f;a[Ta]=c;return fg(a,b,c,e,d)},hydrateTextInstance:function(a,b,c){a[F]=c;return ng(a,b)},didNotMatchHydratedContainerTextInstance:function(){},didNotMatchHydratedTextInstance:function(){},didNotHydrateContainerInstance:function(){},didNotHydrateInstance:function(){},\ndidNotFindHydratableContainerInstance:function(){},didNotFindHydratableContainerTextInstance:function(){},didNotFindHydratableInstance:function(){},didNotFindHydratableTextInstance:function(){}},scheduleDeferredCallback:tf,cancelDeferredCallback:uf}),Cg=X;ac=Cg.batchedUpdates;bc=Cg.interactiveUpdates;cc=Cg.flushInteractiveUpdates;\nfunction Dg(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new tg(a,!1,b)}\nfunction Eg(a,b,c,d,e){ug(c)?void 0:D(\"200\");var f=c._reactRootContainer;if(f){if(\"function\"===typeof e){var h=e;e=function(){var a=X.getPublicRootInstance(f._internalRoot);h.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Dg(c,d);if(\"function\"===typeof e){var g=e;e=function(){var a=X.getPublicRootInstance(f._internalRoot);g.call(a)}}X.unbatchedUpdates(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return X.getPublicRootInstance(f._internalRoot)}\nfunction Fg(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;ug(b)?void 0:D(\"200\");return qf(a,b,null,c)}\nvar Gg={createPortal:Fg,findDOMNode:function(a){return null==a?null:1===a.nodeType?a:X.findHostInstance(a)},hydrate:function(a,b,c){return Eg(null,a,b,!0,c)},render:function(a,b,c){return Eg(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){null==a||void 0===a._reactInternalFiber?D(\"38\"):void 0;return Eg(a,b,c,!1,d)},unmountComponentAtNode:function(a){ug(a)?void 0:D(\"40\");return a._reactRootContainer?(X.unbatchedUpdates(function(){Eg(null,null,a,!1,function(){a._reactRootContainer=\nnull})}),!0):!1},unstable_createPortal:function(){return Fg.apply(void 0,arguments)},unstable_batchedUpdates:X.batchedUpdates,unstable_deferredUpdates:X.deferredUpdates,flushSync:X.flushSync,unstable_flushControlled:X.flushControlled,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{EventPluginHub:Ra,EventPluginRegistry:Ca,EventPropagators:kb,ReactControlledComponent:$b,ReactDOMComponentTree:bb,ReactDOMEventListener:$d},unstable_createRoot:function(a,b){return new tg(a,!0,null!=b&&!0===b.hydrate)}};\nX.injectIntoDevTools({findFiberByHostInstance:Ua,bundleType:0,version:\"16.3.2\",rendererPackageName:\"react-dom\"});var Hg=Object.freeze({default:Gg}),Ig=Hg&&Gg||Hg;module.exports=Ig[\"default\"]?Ig[\"default\"]:Ig;\n\n\n/***/ }),\n/* 744 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n  canUseDOM: canUseDOM,\n\n  canUseWorkers: typeof Worker !== 'undefined',\n\n  canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n  canUseViewport: canUseDOM && !!window.screen,\n\n  isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n\n/***/ }),\n/* 745 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 746 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/* eslint-disable fb-www/typeof-undefined */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not\n * yet defined.\n *\n * @param {?DOMDocument} doc Defaults to current document.\n * @return {?DOMElement}\n */\nfunction getActiveElement(doc) /*?DOMElement*/{\n  doc = doc || (typeof document !== 'undefined' ? document : undefined);\n  if (typeof doc === 'undefined') {\n    return null;\n  }\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\n\nmodule.exports = getActiveElement;\n\n/***/ }),\n/* 747 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nvar isTextNode = __webpack_require__(748);\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n */\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nmodule.exports = containsNode;\n\n/***/ }),\n/* 748 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar isNode = __webpack_require__(749);\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n  return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n\n/***/ }),\n/* 749 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\nfunction isNode(object) {\n  var doc = object ? object.ownerDocument || object : document;\n  var defaultView = doc.defaultView || window;\n  return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;\n\n/***/ }),\n/* 750 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = __webpack_require__(751);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n\n\n/***/ }),\n/* 751 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n/***/ }),\n/* 752 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(753);\n\n\n/***/ }),\n/* 753 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Load modules\n\nvar Stringify = __webpack_require__(754);\nvar Parse = __webpack_require__(755);\n\n\n// Declare internals\n\nvar internals = {};\n\n\nmodule.exports = {\n    stringify: Stringify,\n    parse: Parse\n};\n\n\n/***/ }),\n/* 754 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Load modules\n\nvar Utils = __webpack_require__(355);\n\n\n// Declare internals\n\nvar internals = {\n    delimiter: '&',\n    arrayPrefixGenerators: {\n        brackets: function (prefix, key) {\n            return prefix + '[]';\n        },\n        indices: function (prefix, key) {\n            return prefix + '[' + key + ']';\n        },\n        repeat: function (prefix, key) {\n            return prefix;\n        }\n    }\n};\n\n\ninternals.stringify = function (obj, prefix, generateArrayPrefix) {\n\n    if (Utils.isBuffer(obj)) {\n        obj = obj.toString();\n    }\n    else if (obj instanceof Date) {\n        obj = obj.toISOString();\n    }\n    else if (obj === null) {\n        obj = '';\n    }\n\n    if (typeof obj === 'string' ||\n        typeof obj === 'number' ||\n        typeof obj === 'boolean') {\n\n        return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys = Object.keys(obj);\n    for (var i = 0, il = objKeys.length; i < il; ++i) {\n        var key = objKeys[i];\n        if (Array.isArray(obj)) {\n            values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix));\n        }\n        else {\n            values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix));\n        }\n    }\n\n    return values;\n};\n\n\nmodule.exports = function (obj, options) {\n\n    options = options || {};\n    var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;\n\n    var keys = [];\n\n    if (typeof obj !== 'object' ||\n        obj === null) {\n\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in internals.arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    }\n    else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    }\n    else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];\n\n    var objKeys = Object.keys(obj);\n    for (var i = 0, il = objKeys.length; i < il; ++i) {\n        var key = objKeys[i];\n        keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix));\n    }\n\n    return keys.join(delimiter);\n};\n\n\n/***/ }),\n/* 755 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Load modules\n\nvar Utils = __webpack_require__(355);\n\n\n// Declare internals\n\nvar internals = {\n    delimiter: '&',\n    depth: 5,\n    arrayLimit: 20,\n    parameterLimit: 1000\n};\n\n\ninternals.parseValues = function (str, options) {\n\n    var obj = {};\n    var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);\n\n    for (var i = 0, il = parts.length; i < il; ++i) {\n        var part = parts[i];\n        var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;\n\n        if (pos === -1) {\n            obj[Utils.decode(part)] = '';\n        }\n        else {\n            var key = Utils.decode(part.slice(0, pos));\n            var val = Utils.decode(part.slice(pos + 1));\n\n            if (Object.prototype.hasOwnProperty(key)) {\n                continue;\n            }\n\n            if (!obj.hasOwnProperty(key)) {\n                obj[key] = val;\n            }\n            else {\n                obj[key] = [].concat(obj[key]).concat(val);\n            }\n        }\n    }\n\n    return obj;\n};\n\n\ninternals.parseObject = function (chain, val, options) {\n\n    if (!chain.length) {\n        return val;\n    }\n\n    var root = chain.shift();\n\n    var obj = {};\n    if (root === '[]') {\n        obj = [];\n        obj = obj.concat(internals.parseObject(chain, val, options));\n    }\n    else {\n        var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;\n        var index = parseInt(cleanRoot, 10);\n        var indexString = '' + index;\n        if (!isNaN(index) &&\n            root !== cleanRoot &&\n            indexString === cleanRoot &&\n            index >= 0 &&\n            index <= options.arrayLimit) {\n\n            obj = [];\n            obj[index] = internals.parseObject(chain, val, options);\n        }\n        else {\n            obj[cleanRoot] = internals.parseObject(chain, val, options);\n        }\n    }\n\n    return obj;\n};\n\n\ninternals.parseKeys = function (key, val, options) {\n\n    if (!key) {\n        return;\n    }\n\n    // The regex chunks\n\n    var parent = /^([^\\[\\]]*)/;\n    var child = /(\\[[^\\[\\]]*\\])/g;\n\n    // Get the parent\n\n    var segment = parent.exec(key);\n\n    // Don't allow them to overwrite object prototype properties\n\n    if (Object.prototype.hasOwnProperty(segment[1])) {\n        return;\n    }\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (segment[1]) {\n        keys.push(segment[1]);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n\n        ++i;\n        if (!Object.prototype.hasOwnProperty(segment[1].replace(/\\[|\\]/g, ''))) {\n            keys.push(segment[1]);\n        }\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return internals.parseObject(keys, val, options);\n};\n\n\nmodule.exports = function (str, options) {\n\n    if (str === '' ||\n        str === null ||\n        typeof str === 'undefined') {\n\n        return {};\n    }\n\n    options = options || {};\n    options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;\n\n    var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;\n    var obj = {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0, il = keys.length; i < il; ++i) {\n        var key = keys[i];\n        var newObj = internals.parseKeys(key, tempObj[key], options);\n        obj = Utils.merge(obj, newObj);\n    }\n\n    return Utils.compact(obj);\n};\n\n\n/***/ }),\n/* 756 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * This component is necessary to get around a context warning\n * present in React 0.13.0. It sovles this by providing a separation\n * between the \"owner\" and \"parent\" contexts.\n */\n\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = __webpack_require__(0);\n\nvar ContextWrapper = (function (_React$Component) {\n  _inherits(ContextWrapper, _React$Component);\n\n  function ContextWrapper() {\n    _classCallCheck(this, ContextWrapper);\n\n    _get(Object.getPrototypeOf(ContextWrapper.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  _createClass(ContextWrapper, [{\n    key: 'render',\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n\n  return ContextWrapper;\n})(React.Component);\n\nmodule.exports = ContextWrapper;\n\n/***/ }),\n/* 757 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = __webpack_require__(0);\nvar assign = __webpack_require__(77);\nvar PropTypes = __webpack_require__(78);\n\nfunction isLeftClickEvent(event) {\n  return event.button === 0;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\n/**\n * <Link> components are used to create an <a> element that links to a route.\n * When that route is active, the link gets an \"active\" class name (or the\n * value of its `activeClassName` prop).\n *\n * For example, assuming you have the following route:\n *\n *   <Route name=\"showPost\" path=\"/posts/:postID\" handler={Post}/>\n *\n * You could use the following component to link to that route:\n *\n *   <Link to=\"showPost\" params={{ postID: \"123\" }} />\n *\n * In addition to params, links may pass along query string parameters\n * using the `query` prop.\n *\n *   <Link to=\"showPost\" params={{ postID: \"123\" }} query={{ show:true }}/>\n */\n\nvar Link = (function (_React$Component) {\n  _inherits(Link, _React$Component);\n\n  function Link() {\n    _classCallCheck(this, Link);\n\n    _get(Object.getPrototypeOf(Link.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(Link, [{\n    key: 'handleClick',\n    value: function handleClick(event) {\n      var allowTransition = true;\n      var clickResult;\n\n      if (this.props.onClick) clickResult = this.props.onClick(event);\n\n      if (isModifiedEvent(event) || !isLeftClickEvent(event)) return;\n\n      if (clickResult === false || event.defaultPrevented === true) allowTransition = false;\n\n      event.preventDefault();\n\n      if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query);\n    }\n\n    /**\n     * Returns the value of the \"href\" attribute to use on the DOM element.\n     */\n  }, {\n    key: 'getHref',\n    value: function getHref() {\n      return this.context.router.makeHref(this.props.to, this.props.params, this.props.query);\n    }\n\n    /**\n     * Returns the value of the \"class\" attribute to use on the DOM element, which contains\n     * the value of the activeClassName property when this <Link> is active.\n     */\n  }, {\n    key: 'getClassName',\n    value: function getClassName() {\n      var className = this.props.className;\n\n      if (this.getActiveState()) className += ' ' + this.props.activeClassName;\n\n      return className;\n    }\n  }, {\n    key: 'getActiveState',\n    value: function getActiveState() {\n      return this.context.router.isActive(this.props.to, this.props.params, this.props.query);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var props = assign({}, this.props, {\n        href: this.getHref(),\n        className: this.getClassName(),\n        onClick: this.handleClick.bind(this)\n      });\n\n      if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle;\n\n      delete props.to;\n      delete props.params;\n      delete props.query;\n      delete props.activeClassName;\n      delete props.activeStyle;\n\n      return React.DOM.a(props, this.props.children);\n    }\n  }]);\n\n  return Link;\n})(React.Component);\n\nLink.contextTypes = {\n  router: PropTypes.router.isRequired\n};\n\nLink.propTypes = {\n  activeClassName: PropTypes.string.isRequired,\n  to: PropTypes.oneOfType([PropTypes.string, PropTypes.route]).isRequired,\n  params: PropTypes.object,\n  query: PropTypes.object,\n  activeStyle: PropTypes.object,\n  onClick: PropTypes.func\n};\n\nLink.defaultProps = {\n  activeClassName: 'active',\n  className: ''\n};\n\nmodule.exports = Link;\n\n/***/ }),\n/* 758 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = __webpack_require__(26);\nvar LocationActions = __webpack_require__(137);\nvar History = __webpack_require__(118);\n\n/**\n * A location that is convenient for testing and does not require a DOM.\n */\n\nvar TestLocation = (function () {\n  function TestLocation(history) {\n    _classCallCheck(this, TestLocation);\n\n    this.history = history || [];\n    this.listeners = [];\n    this.needsDOM = false;\n    this._updateHistoryLength();\n  }\n\n  _createClass(TestLocation, [{\n    key: '_updateHistoryLength',\n    value: function _updateHistoryLength() {\n      History.length = this.history.length;\n    }\n  }, {\n    key: '_notifyChange',\n    value: function _notifyChange(type) {\n      var change = {\n        path: this.getCurrentPath(),\n        type: type\n      };\n\n      for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change);\n    }\n  }, {\n    key: 'addChangeListener',\n    value: function addChangeListener(listener) {\n      this.listeners.push(listener);\n    }\n  }, {\n    key: 'removeChangeListener',\n    value: function removeChangeListener(listener) {\n      this.listeners = this.listeners.filter(function (l) {\n        return l !== listener;\n      });\n    }\n  }, {\n    key: 'push',\n    value: function push(path) {\n      this.history.push(path);\n      this._updateHistoryLength();\n      this._notifyChange(LocationActions.PUSH);\n    }\n  }, {\n    key: 'replace',\n    value: function replace(path) {\n      invariant(this.history.length, 'You cannot replace the current path with no history');\n\n      this.history[this.history.length - 1] = path;\n\n      this._notifyChange(LocationActions.REPLACE);\n    }\n  }, {\n    key: 'pop',\n    value: function pop() {\n      this.history.pop();\n      this._updateHistoryLength();\n      this._notifyChange(LocationActions.POP);\n    }\n  }, {\n    key: 'getCurrentPath',\n    value: function getCurrentPath() {\n      return this.history[this.history.length - 1];\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      return '<TestLocation>';\n    }\n  }]);\n\n  return TestLocation;\n})();\n\nmodule.exports = TestLocation;\n\n/***/ }),\n/* 759 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * A scroll behavior that always scrolls to the top of the page\n * after a transition.\n */\n\n\nvar ScrollToTopBehavior = {\n\n  updateScrollPosition: function updateScrollPosition() {\n    window.scrollTo(0, 0);\n  }\n\n};\n\nmodule.exports = ScrollToTopBehavior;\n\n/***/ }),\n/* 760 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PropTypes = __webpack_require__(78);\n\n/**\n * A mixin for components that modify the URL.\n *\n * Example:\n *\n *   var MyLink = React.createClass({\n *     mixins: [ Router.Navigation ],\n *     handleClick(event) {\n *       event.preventDefault();\n *       this.transitionTo('aRoute', { the: 'params' }, { the: 'query' });\n *     },\n *     render() {\n *       return (\n *         <a onClick={this.handleClick}>Click me!</a>\n *       );\n *     }\n *   });\n */\nvar Navigation = {\n\n  contextTypes: {\n    router: PropTypes.router.isRequired\n  },\n\n  /**\n   * Returns an absolute URL path created from the given route\n   * name, URL parameters, and query values.\n   */\n  makePath: function makePath(to, params, query) {\n    return this.context.router.makePath(to, params, query);\n  },\n\n  /**\n   * Returns a string that may safely be used as the href of a\n   * link to the route with the given name.\n   */\n  makeHref: function makeHref(to, params, query) {\n    return this.context.router.makeHref(to, params, query);\n  },\n\n  /**\n   * Transitions to the URL specified in the arguments by pushing\n   * a new URL onto the history stack.\n   */\n  transitionTo: function transitionTo(to, params, query) {\n    this.context.router.transitionTo(to, params, query);\n  },\n\n  /**\n   * Transitions to the URL specified in the arguments by replacing\n   * the current URL in the history stack.\n   */\n  replaceWith: function replaceWith(to, params, query) {\n    this.context.router.replaceWith(to, params, query);\n  },\n\n  /**\n   * Transitions to the previous URL.\n   */\n  goBack: function goBack() {\n    return this.context.router.goBack();\n  }\n\n};\n\nmodule.exports = Navigation;\n\n/***/ }),\n/* 761 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar PropTypes = __webpack_require__(78);\n\n/**\n * A mixin for components that need to know the path, routes, URL\n * params and query that are currently active.\n *\n * Example:\n *\n *   var AboutLink = React.createClass({\n *     mixins: [ Router.State ],\n *     render() {\n *       var className = this.props.className;\n *\n *       if (this.isActive('about'))\n *         className += ' is-active';\n *\n *       return React.DOM.a({ className: className }, this.props.children);\n *     }\n *   });\n */\nvar State = {\n\n  contextTypes: {\n    router: PropTypes.router.isRequired\n  },\n\n  /**\n   * Returns the current URL path.\n   */\n  getPath: function getPath() {\n    return this.context.router.getCurrentPath();\n  },\n\n  /**\n   * Returns the current URL path without the query string.\n   */\n  getPathname: function getPathname() {\n    return this.context.router.getCurrentPathname();\n  },\n\n  /**\n   * Returns an object of the URL params that are currently active.\n   */\n  getParams: function getParams() {\n    return this.context.router.getCurrentParams();\n  },\n\n  /**\n   * Returns an object of the query params that are currently active.\n   */\n  getQuery: function getQuery() {\n    return this.context.router.getCurrentQuery();\n  },\n\n  /**\n   * Returns an array of the routes that are currently active.\n   */\n  getRoutes: function getRoutes() {\n    return this.context.router.getCurrentRoutes();\n  },\n\n  /**\n   * A helper method to determine if a given route, params, and query\n   * are active.\n   */\n  isActive: function isActive(to, params, query) {\n    return this.context.router.isActive(to, params, query);\n  }\n\n};\n\nmodule.exports = State;\n\n/***/ }),\n/* 762 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar _assign = __webpack_require__(763);\n\nvar emptyObject = __webpack_require__(245);\nvar _invariant = __webpack_require__(177);\n\nif (false) {\n  var warning = require('fbjs/lib/warning');\n}\n\nvar MIXINS_KEY = 'mixins';\n\n// Helper function to allow the creation of anonymous functions which do not\n// have .name set to the name of the variable being assigned to.\nfunction identity(fn) {\n  return fn;\n}\n\nvar ReactPropTypeLocationNames;\nif (false) {\n  ReactPropTypeLocationNames = {\n    prop: 'prop',\n    context: 'context',\n    childContext: 'child context'\n  };\n} else {\n  ReactPropTypeLocationNames = {};\n}\n\nfunction factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {\n  /**\n   * Policies that describe methods in `ReactClassInterface`.\n   */\n\n  var injectedMixins = [];\n\n  /**\n   * Composite components are higher-level components that compose other composite\n   * or host components.\n   *\n   * To create a new type of `ReactClass`, pass a specification of\n   * your new class to `React.createClass`. The only requirement of your class\n   * specification is that you implement a `render` method.\n   *\n   *   var MyComponent = React.createClass({\n   *     render: function() {\n   *       return <div>Hello World</div>;\n   *     }\n   *   });\n   *\n   * The class specification supports a specific protocol of methods that have\n   * special meaning (e.g. `render`). See `ReactClassInterface` for\n   * more the comprehensive protocol. Any other properties and methods in the\n   * class specification will be available on the prototype.\n   *\n   * @interface ReactClassInterface\n   * @internal\n   */\n  var ReactClassInterface = {\n    /**\n     * An array of Mixin objects to include when defining your component.\n     *\n     * @type {array}\n     * @optional\n     */\n    mixins: 'DEFINE_MANY',\n\n    /**\n     * An object containing properties and methods that should be defined on\n     * the component's constructor instead of its prototype (static methods).\n     *\n     * @type {object}\n     * @optional\n     */\n    statics: 'DEFINE_MANY',\n\n    /**\n     * Definition of prop types for this component.\n     *\n     * @type {object}\n     * @optional\n     */\n    propTypes: 'DEFINE_MANY',\n\n    /**\n     * Definition of context types for this component.\n     *\n     * @type {object}\n     * @optional\n     */\n    contextTypes: 'DEFINE_MANY',\n\n    /**\n     * Definition of context types this component sets for its children.\n     *\n     * @type {object}\n     * @optional\n     */\n    childContextTypes: 'DEFINE_MANY',\n\n    // ==== Definition methods ====\n\n    /**\n     * Invoked when the component is mounted. Values in the mapping will be set on\n     * `this.props` if that prop is not specified (i.e. using an `in` check).\n     *\n     * This method is invoked before `getInitialState` and therefore cannot rely\n     * on `this.state` or use `this.setState`.\n     *\n     * @return {object}\n     * @optional\n     */\n    getDefaultProps: 'DEFINE_MANY_MERGED',\n\n    /**\n     * Invoked once before the component is mounted. The return value will be used\n     * as the initial value of `this.state`.\n     *\n     *   getInitialState: function() {\n     *     return {\n     *       isOn: false,\n     *       fooBaz: new BazFoo()\n     *     }\n     *   }\n     *\n     * @return {object}\n     * @optional\n     */\n    getInitialState: 'DEFINE_MANY_MERGED',\n\n    /**\n     * @return {object}\n     * @optional\n     */\n    getChildContext: 'DEFINE_MANY_MERGED',\n\n    /**\n     * Uses props from `this.props` and state from `this.state` to render the\n     * structure of the component.\n     *\n     * No guarantees are made about when or how often this method is invoked, so\n     * it must not have side effects.\n     *\n     *   render: function() {\n     *     var name = this.props.name;\n     *     return <div>Hello, {name}!</div>;\n     *   }\n     *\n     * @return {ReactComponent}\n     * @required\n     */\n    render: 'DEFINE_ONCE',\n\n    // ==== Delegate methods ====\n\n    /**\n     * Invoked when the component is initially created and about to be mounted.\n     * This may have side effects, but any external subscriptions or data created\n     * by this method must be cleaned up in `componentWillUnmount`.\n     *\n     * @optional\n     */\n    componentWillMount: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component has been mounted and has a DOM representation.\n     * However, there is no guarantee that the DOM node is in the document.\n     *\n     * Use this as an opportunity to operate on the DOM when the component has\n     * been mounted (initialized and rendered) for the first time.\n     *\n     * @param {DOMElement} rootNode DOM element representing the component.\n     * @optional\n     */\n    componentDidMount: 'DEFINE_MANY',\n\n    /**\n     * Invoked before the component receives new props.\n     *\n     * Use this as an opportunity to react to a prop transition by updating the\n     * state using `this.setState`. Current props are accessed via `this.props`.\n     *\n     *   componentWillReceiveProps: function(nextProps, nextContext) {\n     *     this.setState({\n     *       likesIncreasing: nextProps.likeCount > this.props.likeCount\n     *     });\n     *   }\n     *\n     * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n     * transition may cause a state change, but the opposite is not true. If you\n     * need it, you are probably looking for `componentWillUpdate`.\n     *\n     * @param {object} nextProps\n     * @optional\n     */\n    componentWillReceiveProps: 'DEFINE_MANY',\n\n    /**\n     * Invoked while deciding if the component should be updated as a result of\n     * receiving new props, state and/or context.\n     *\n     * Use this as an opportunity to `return false` when you're certain that the\n     * transition to the new props/state/context will not require a component\n     * update.\n     *\n     *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n     *     return !equal(nextProps, this.props) ||\n     *       !equal(nextState, this.state) ||\n     *       !equal(nextContext, this.context);\n     *   }\n     *\n     * @param {object} nextProps\n     * @param {?object} nextState\n     * @param {?object} nextContext\n     * @return {boolean} True if the component should update.\n     * @optional\n     */\n    shouldComponentUpdate: 'DEFINE_ONCE',\n\n    /**\n     * Invoked when the component is about to update due to a transition from\n     * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n     * and `nextContext`.\n     *\n     * Use this as an opportunity to perform preparation before an update occurs.\n     *\n     * NOTE: You **cannot** use `this.setState()` in this method.\n     *\n     * @param {object} nextProps\n     * @param {?object} nextState\n     * @param {?object} nextContext\n     * @param {ReactReconcileTransaction} transaction\n     * @optional\n     */\n    componentWillUpdate: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component's DOM representation has been updated.\n     *\n     * Use this as an opportunity to operate on the DOM when the component has\n     * been updated.\n     *\n     * @param {object} prevProps\n     * @param {?object} prevState\n     * @param {?object} prevContext\n     * @param {DOMElement} rootNode DOM element representing the component.\n     * @optional\n     */\n    componentDidUpdate: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component is about to be removed from its parent and have\n     * its DOM representation destroyed.\n     *\n     * Use this as an opportunity to deallocate any external resources.\n     *\n     * NOTE: There is no `componentDidUnmount` since your component will have been\n     * destroyed by that point.\n     *\n     * @optional\n     */\n    componentWillUnmount: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillMount`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillMount: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillReceiveProps`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillUpdate`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillUpdate: 'DEFINE_MANY',\n\n    // ==== Advanced methods ====\n\n    /**\n     * Updates the component's currently mounted DOM representation.\n     *\n     * By default, this implements React's rendering and reconciliation algorithm.\n     * Sophisticated clients may wish to override this.\n     *\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     * @overridable\n     */\n    updateComponent: 'OVERRIDE_BASE'\n  };\n\n  /**\n   * Similar to ReactClassInterface but for static methods.\n   */\n  var ReactClassStaticInterface = {\n    /**\n     * This method is invoked after a component is instantiated and when it\n     * receives new props. Return an object to update state in response to\n     * prop changes. Return null to indicate no change to state.\n     *\n     * If an object is returned, its keys will be merged into the existing state.\n     *\n     * @return {object || null}\n     * @optional\n     */\n    getDerivedStateFromProps: 'DEFINE_MANY_MERGED'\n  };\n\n  /**\n   * Mapping from class specification keys to special processing functions.\n   *\n   * Although these are declared like instance properties in the specification\n   * when defining classes using `React.createClass`, they are actually static\n   * and are accessible on the constructor instead of the prototype. Despite\n   * being static, they must be defined outside of the \"statics\" key under\n   * which all other static methods are defined.\n   */\n  var RESERVED_SPEC_KEYS = {\n    displayName: function(Constructor, displayName) {\n      Constructor.displayName = displayName;\n    },\n    mixins: function(Constructor, mixins) {\n      if (mixins) {\n        for (var i = 0; i < mixins.length; i++) {\n          mixSpecIntoComponent(Constructor, mixins[i]);\n        }\n      }\n    },\n    childContextTypes: function(Constructor, childContextTypes) {\n      if (false) {\n        validateTypeDef(Constructor, childContextTypes, 'childContext');\n      }\n      Constructor.childContextTypes = _assign(\n        {},\n        Constructor.childContextTypes,\n        childContextTypes\n      );\n    },\n    contextTypes: function(Constructor, contextTypes) {\n      if (false) {\n        validateTypeDef(Constructor, contextTypes, 'context');\n      }\n      Constructor.contextTypes = _assign(\n        {},\n        Constructor.contextTypes,\n        contextTypes\n      );\n    },\n    /**\n     * Special case getDefaultProps which should move into statics but requires\n     * automatic merging.\n     */\n    getDefaultProps: function(Constructor, getDefaultProps) {\n      if (Constructor.getDefaultProps) {\n        Constructor.getDefaultProps = createMergedResultFunction(\n          Constructor.getDefaultProps,\n          getDefaultProps\n        );\n      } else {\n        Constructor.getDefaultProps = getDefaultProps;\n      }\n    },\n    propTypes: function(Constructor, propTypes) {\n      if (false) {\n        validateTypeDef(Constructor, propTypes, 'prop');\n      }\n      Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);\n    },\n    statics: function(Constructor, statics) {\n      mixStaticSpecIntoComponent(Constructor, statics);\n    },\n    autobind: function() {}\n  };\n\n  function validateTypeDef(Constructor, typeDef, location) {\n    for (var propName in typeDef) {\n      if (typeDef.hasOwnProperty(propName)) {\n        // use a warning instead of an _invariant so components\n        // don't show up in prod but only in __DEV__\n        if (false) {\n          warning(\n            typeof typeDef[propName] === 'function',\n            '%s: %s type `%s` is invalid; it must be a function, usually from ' +\n              'React.PropTypes.',\n            Constructor.displayName || 'ReactClass',\n            ReactPropTypeLocationNames[location],\n            propName\n          );\n        }\n      }\n    }\n  }\n\n  function validateMethodOverride(isAlreadyDefined, name) {\n    var specPolicy = ReactClassInterface.hasOwnProperty(name)\n      ? ReactClassInterface[name]\n      : null;\n\n    // Disallow overriding of base class methods unless explicitly allowed.\n    if (ReactClassMixin.hasOwnProperty(name)) {\n      _invariant(\n        specPolicy === 'OVERRIDE_BASE',\n        'ReactClassInterface: You are attempting to override ' +\n          '`%s` from your class specification. Ensure that your method names ' +\n          'do not overlap with React methods.',\n        name\n      );\n    }\n\n    // Disallow defining methods more than once unless explicitly allowed.\n    if (isAlreadyDefined) {\n      _invariant(\n        specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',\n        'ReactClassInterface: You are attempting to define ' +\n          '`%s` on your component more than once. This conflict may be due ' +\n          'to a mixin.',\n        name\n      );\n    }\n  }\n\n  /**\n   * Mixin helper which handles policy validation and reserved\n   * specification keys when building React classes.\n   */\n  function mixSpecIntoComponent(Constructor, spec) {\n    if (!spec) {\n      if (false) {\n        var typeofSpec = typeof spec;\n        var isMixinValid = typeofSpec === 'object' && spec !== null;\n\n        if (process.env.NODE_ENV !== 'production') {\n          warning(\n            isMixinValid,\n            \"%s: You're attempting to include a mixin that is either null \" +\n              'or not an object. Check the mixins included by the component, ' +\n              'as well as any mixins they include themselves. ' +\n              'Expected object but got %s.',\n            Constructor.displayName || 'ReactClass',\n            spec === null ? null : typeofSpec\n          );\n        }\n      }\n\n      return;\n    }\n\n    _invariant(\n      typeof spec !== 'function',\n      \"ReactClass: You're attempting to \" +\n        'use a component class or function as a mixin. Instead, just use a ' +\n        'regular object.'\n    );\n    _invariant(\n      !isValidElement(spec),\n      \"ReactClass: You're attempting to \" +\n        'use a component as a mixin. Instead, just use a regular object.'\n    );\n\n    var proto = Constructor.prototype;\n    var autoBindPairs = proto.__reactAutoBindPairs;\n\n    // By handling mixins before any other properties, we ensure the same\n    // chaining order is applied to methods with DEFINE_MANY policy, whether\n    // mixins are listed before or after these methods in the spec.\n    if (spec.hasOwnProperty(MIXINS_KEY)) {\n      RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n    }\n\n    for (var name in spec) {\n      if (!spec.hasOwnProperty(name)) {\n        continue;\n      }\n\n      if (name === MIXINS_KEY) {\n        // We have already handled mixins in a special case above.\n        continue;\n      }\n\n      var property = spec[name];\n      var isAlreadyDefined = proto.hasOwnProperty(name);\n      validateMethodOverride(isAlreadyDefined, name);\n\n      if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n        RESERVED_SPEC_KEYS[name](Constructor, property);\n      } else {\n        // Setup methods on prototype:\n        // The following member methods should not be automatically bound:\n        // 1. Expected ReactClass methods (in the \"interface\").\n        // 2. Overridden methods (that were mixed in).\n        var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n        var isFunction = typeof property === 'function';\n        var shouldAutoBind =\n          isFunction &&\n          !isReactClassMethod &&\n          !isAlreadyDefined &&\n          spec.autobind !== false;\n\n        if (shouldAutoBind) {\n          autoBindPairs.push(name, property);\n          proto[name] = property;\n        } else {\n          if (isAlreadyDefined) {\n            var specPolicy = ReactClassInterface[name];\n\n            // These cases should already be caught by validateMethodOverride.\n            _invariant(\n              isReactClassMethod &&\n                (specPolicy === 'DEFINE_MANY_MERGED' ||\n                  specPolicy === 'DEFINE_MANY'),\n              'ReactClass: Unexpected spec policy %s for key %s ' +\n                'when mixing in component specs.',\n              specPolicy,\n              name\n            );\n\n            // For methods which are defined more than once, call the existing\n            // methods before calling the new property, merging if appropriate.\n            if (specPolicy === 'DEFINE_MANY_MERGED') {\n              proto[name] = createMergedResultFunction(proto[name], property);\n            } else if (specPolicy === 'DEFINE_MANY') {\n              proto[name] = createChainedFunction(proto[name], property);\n            }\n          } else {\n            proto[name] = property;\n            if (false) {\n              // Add verbose displayName to the function, which helps when looking\n              // at profiling tools.\n              if (typeof property === 'function' && spec.displayName) {\n                proto[name].displayName = spec.displayName + '_' + name;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  function mixStaticSpecIntoComponent(Constructor, statics) {\n    if (!statics) {\n      return;\n    }\n\n    for (var name in statics) {\n      var property = statics[name];\n      if (!statics.hasOwnProperty(name)) {\n        continue;\n      }\n\n      var isReserved = name in RESERVED_SPEC_KEYS;\n      _invariant(\n        !isReserved,\n        'ReactClass: You are attempting to define a reserved ' +\n          'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' +\n          'as an instance property instead; it will still be accessible on the ' +\n          'constructor.',\n        name\n      );\n\n      var isAlreadyDefined = name in Constructor;\n      if (isAlreadyDefined) {\n        var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)\n          ? ReactClassStaticInterface[name]\n          : null;\n\n        _invariant(\n          specPolicy === 'DEFINE_MANY_MERGED',\n          'ReactClass: You are attempting to define ' +\n            '`%s` on your component more than once. This conflict may be ' +\n            'due to a mixin.',\n          name\n        );\n\n        Constructor[name] = createMergedResultFunction(Constructor[name], property);\n\n        return;\n      }\n\n      Constructor[name] = property;\n    }\n  }\n\n  /**\n   * Merge two objects, but throw if both contain the same key.\n   *\n   * @param {object} one The first object, which is mutated.\n   * @param {object} two The second object\n   * @return {object} one after it has been mutated to contain everything in two.\n   */\n  function mergeIntoWithNoDuplicateKeys(one, two) {\n    _invariant(\n      one && two && typeof one === 'object' && typeof two === 'object',\n      'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'\n    );\n\n    for (var key in two) {\n      if (two.hasOwnProperty(key)) {\n        _invariant(\n          one[key] === undefined,\n          'mergeIntoWithNoDuplicateKeys(): ' +\n            'Tried to merge two objects with the same key: `%s`. This conflict ' +\n            'may be due to a mixin; in particular, this may be caused by two ' +\n            'getInitialState() or getDefaultProps() methods returning objects ' +\n            'with clashing keys.',\n          key\n        );\n        one[key] = two[key];\n      }\n    }\n    return one;\n  }\n\n  /**\n   * Creates a function that invokes two functions and merges their return values.\n   *\n   * @param {function} one Function to invoke first.\n   * @param {function} two Function to invoke second.\n   * @return {function} Function that invokes the two argument functions.\n   * @private\n   */\n  function createMergedResultFunction(one, two) {\n    return function mergedResult() {\n      var a = one.apply(this, arguments);\n      var b = two.apply(this, arguments);\n      if (a == null) {\n        return b;\n      } else if (b == null) {\n        return a;\n      }\n      var c = {};\n      mergeIntoWithNoDuplicateKeys(c, a);\n      mergeIntoWithNoDuplicateKeys(c, b);\n      return c;\n    };\n  }\n\n  /**\n   * Creates a function that invokes two functions and ignores their return vales.\n   *\n   * @param {function} one Function to invoke first.\n   * @param {function} two Function to invoke second.\n   * @return {function} Function that invokes the two argument functions.\n   * @private\n   */\n  function createChainedFunction(one, two) {\n    return function chainedFunction() {\n      one.apply(this, arguments);\n      two.apply(this, arguments);\n    };\n  }\n\n  /**\n   * Binds a method to the component.\n   *\n   * @param {object} component Component whose method is going to be bound.\n   * @param {function} method Method to be bound.\n   * @return {function} The bound method.\n   */\n  function bindAutoBindMethod(component, method) {\n    var boundMethod = method.bind(component);\n    if (false) {\n      boundMethod.__reactBoundContext = component;\n      boundMethod.__reactBoundMethod = method;\n      boundMethod.__reactBoundArguments = null;\n      var componentName = component.constructor.displayName;\n      var _bind = boundMethod.bind;\n      boundMethod.bind = function(newThis) {\n        for (\n          var _len = arguments.length,\n            args = Array(_len > 1 ? _len - 1 : 0),\n            _key = 1;\n          _key < _len;\n          _key++\n        ) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        // User is trying to bind() an autobound method; we effectively will\n        // ignore the value of \"this\" that the user is trying to use, so\n        // let's warn.\n        if (newThis !== component && newThis !== null) {\n          if (process.env.NODE_ENV !== 'production') {\n            warning(\n              false,\n              'bind(): React component methods may only be bound to the ' +\n                'component instance. See %s',\n              componentName\n            );\n          }\n        } else if (!args.length) {\n          if (process.env.NODE_ENV !== 'production') {\n            warning(\n              false,\n              'bind(): You are binding a component method to the component. ' +\n                'React does this for you automatically in a high-performance ' +\n                'way, so you can safely remove this call. See %s',\n              componentName\n            );\n          }\n          return boundMethod;\n        }\n        var reboundMethod = _bind.apply(boundMethod, arguments);\n        reboundMethod.__reactBoundContext = component;\n        reboundMethod.__reactBoundMethod = method;\n        reboundMethod.__reactBoundArguments = args;\n        return reboundMethod;\n      };\n    }\n    return boundMethod;\n  }\n\n  /**\n   * Binds all auto-bound methods in a component.\n   *\n   * @param {object} component Component whose method is going to be bound.\n   */\n  function bindAutoBindMethods(component) {\n    var pairs = component.__reactAutoBindPairs;\n    for (var i = 0; i < pairs.length; i += 2) {\n      var autoBindKey = pairs[i];\n      var method = pairs[i + 1];\n      component[autoBindKey] = bindAutoBindMethod(component, method);\n    }\n  }\n\n  var IsMountedPreMixin = {\n    componentDidMount: function() {\n      this.__isMounted = true;\n    }\n  };\n\n  var IsMountedPostMixin = {\n    componentWillUnmount: function() {\n      this.__isMounted = false;\n    }\n  };\n\n  /**\n   * Add more to the ReactClass base class. These are all legacy features and\n   * therefore not already part of the modern ReactComponent.\n   */\n  var ReactClassMixin = {\n    /**\n     * TODO: This will be deprecated because state should always keep a consistent\n     * type signature and the only use case for this, is to avoid that.\n     */\n    replaceState: function(newState, callback) {\n      this.updater.enqueueReplaceState(this, newState, callback);\n    },\n\n    /**\n     * Checks whether or not this composite component is mounted.\n     * @return {boolean} True if mounted, false otherwise.\n     * @protected\n     * @final\n     */\n    isMounted: function() {\n      if (false) {\n        warning(\n          this.__didWarnIsMounted,\n          '%s: isMounted is deprecated. Instead, make sure to clean up ' +\n            'subscriptions and pending requests in componentWillUnmount to ' +\n            'prevent memory leaks.',\n          (this.constructor && this.constructor.displayName) ||\n            this.name ||\n            'Component'\n        );\n        this.__didWarnIsMounted = true;\n      }\n      return !!this.__isMounted;\n    }\n  };\n\n  var ReactClassComponent = function() {};\n  _assign(\n    ReactClassComponent.prototype,\n    ReactComponent.prototype,\n    ReactClassMixin\n  );\n\n  /**\n   * Creates a composite component class given a class specification.\n   * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass\n   *\n   * @param {object} spec Class specification (which must define `render`).\n   * @return {function} Component constructor function.\n   * @public\n   */\n  function createClass(spec) {\n    // To keep our warnings more understandable, we'll use a little hack here to\n    // ensure that Constructor.name !== 'Constructor'. This makes sure we don't\n    // unnecessarily identify a class without displayName as 'Constructor'.\n    var Constructor = identity(function(props, context, updater) {\n      // This constructor gets overridden by mocks. The argument is used\n      // by mocks to assert on what gets mounted.\n\n      if (false) {\n        warning(\n          this instanceof Constructor,\n          'Something is calling a React component directly. Use a factory or ' +\n            'JSX instead. See: https://fb.me/react-legacyfactory'\n        );\n      }\n\n      // Wire up auto-binding\n      if (this.__reactAutoBindPairs.length) {\n        bindAutoBindMethods(this);\n      }\n\n      this.props = props;\n      this.context = context;\n      this.refs = emptyObject;\n      this.updater = updater || ReactNoopUpdateQueue;\n\n      this.state = null;\n\n      // ReactClasses doesn't have constructors. Instead, they use the\n      // getInitialState and componentWillMount methods for initialization.\n\n      var initialState = this.getInitialState ? this.getInitialState() : null;\n      if (false) {\n        // We allow auto-mocks to proceed as if they're returning null.\n        if (\n          initialState === undefined &&\n          this.getInitialState._isMockFunction\n        ) {\n          // This is probably bad practice. Consider warning here and\n          // deprecating this convenience.\n          initialState = null;\n        }\n      }\n      _invariant(\n        typeof initialState === 'object' && !Array.isArray(initialState),\n        '%s.getInitialState(): must return an object or null',\n        Constructor.displayName || 'ReactCompositeComponent'\n      );\n\n      this.state = initialState;\n    });\n    Constructor.prototype = new ReactClassComponent();\n    Constructor.prototype.constructor = Constructor;\n    Constructor.prototype.__reactAutoBindPairs = [];\n\n    injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n    mixSpecIntoComponent(Constructor, IsMountedPreMixin);\n    mixSpecIntoComponent(Constructor, spec);\n    mixSpecIntoComponent(Constructor, IsMountedPostMixin);\n\n    // Initialize the defaultProps property after all mixins have been merged.\n    if (Constructor.getDefaultProps) {\n      Constructor.defaultProps = Constructor.getDefaultProps();\n    }\n\n    if (false) {\n      // This is a tag to indicate that the use of these method names is ok,\n      // since it's used with createClass. If it's not, then it's likely a\n      // mistake so we'll warn you to use the static property, property\n      // initializer or constructor respectively.\n      if (Constructor.getDefaultProps) {\n        Constructor.getDefaultProps.isReactClassApproved = {};\n      }\n      if (Constructor.prototype.getInitialState) {\n        Constructor.prototype.getInitialState.isReactClassApproved = {};\n      }\n    }\n\n    _invariant(\n      Constructor.prototype.render,\n      'createClass(...): Class specification must implement a `render` method.'\n    );\n\n    if (false) {\n      warning(\n        !Constructor.prototype.componentShouldUpdate,\n        '%s has a method called ' +\n          'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +\n          'The name is phrased as a question because the function is ' +\n          'expected to return a value.',\n        spec.displayName || 'A component'\n      );\n      warning(\n        !Constructor.prototype.componentWillRecieveProps,\n        '%s has a method called ' +\n          'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',\n        spec.displayName || 'A component'\n      );\n      warning(\n        !Constructor.prototype.UNSAFE_componentWillRecieveProps,\n        '%s has a method called UNSAFE_componentWillRecieveProps(). ' +\n          'Did you mean UNSAFE_componentWillReceiveProps()?',\n        spec.displayName || 'A component'\n      );\n    }\n\n    // Reduce time spent doing lookups by setting these on the prototype.\n    for (var methodName in ReactClassInterface) {\n      if (!Constructor.prototype[methodName]) {\n        Constructor.prototype[methodName] = null;\n      }\n    }\n\n    return Constructor;\n  }\n\n  return createClass;\n}\n\nmodule.exports = factory;\n\n\n/***/ }),\n/* 763 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 764 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar invariant = __webpack_require__(26);\nvar canUseDOM = __webpack_require__(181);\nvar getWindowScrollPosition = __webpack_require__(765);\n\nfunction shouldUpdateScroll(state, prevState) {\n  if (!prevState) return true;\n\n  // Don't update scroll position when only the query has changed.\n  if (state.pathname === prevState.pathname) return false;\n\n  var routes = state.routes;\n  var prevRoutes = prevState.routes;\n\n  var sharedAncestorRoutes = routes.filter(function (route) {\n    return prevRoutes.indexOf(route) !== -1;\n  });\n\n  return !sharedAncestorRoutes.some(function (route) {\n    return route.ignoreScrollBehavior;\n  });\n}\n\n/**\n * Provides the router with the ability to manage window scroll position\n * according to its scroll behavior.\n */\nvar ScrollHistory = {\n\n  statics: {\n\n    /**\n     * Records curent scroll position as the last known position for the given URL path.\n     */\n    recordScrollPosition: function recordScrollPosition(path) {\n      if (!this.scrollHistory) this.scrollHistory = {};\n\n      this.scrollHistory[path] = getWindowScrollPosition();\n    },\n\n    /**\n     * Returns the last known scroll position for the given URL path.\n     */\n    getScrollPosition: function getScrollPosition(path) {\n      if (!this.scrollHistory) this.scrollHistory = {};\n\n      return this.scrollHistory[path] || null;\n    }\n\n  },\n\n  componentWillMount: function componentWillMount() {\n    invariant(this.constructor.getScrollBehavior() == null || canUseDOM, 'Cannot use scroll behavior without a DOM');\n  },\n\n  componentDidMount: function componentDidMount() {\n    this._updateScroll();\n  },\n\n  componentDidUpdate: function componentDidUpdate(prevProps, prevState) {\n    this._updateScroll(prevState);\n  },\n\n  _updateScroll: function _updateScroll(prevState) {\n    if (!shouldUpdateScroll(this.state, prevState)) return;\n\n    var scrollBehavior = this.constructor.getScrollBehavior();\n\n    if (scrollBehavior) scrollBehavior.updateScrollPosition(this.constructor.getScrollPosition(this.state.path), this.state.action);\n  }\n\n};\n\nmodule.exports = ScrollHistory;\n\n/***/ }),\n/* 765 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar invariant = __webpack_require__(26);\nvar canUseDOM = __webpack_require__(181);\n\n/**\n * Returns the current scroll position of the window as { x, y }.\n */\nfunction getWindowScrollPosition() {\n  invariant(canUseDOM, 'Cannot get current scroll position without a DOM');\n\n  return {\n    x: window.pageXOffset || document.documentElement.scrollLeft,\n    y: window.pageYOffset || document.documentElement.scrollTop\n  };\n}\n\nmodule.exports = getWindowScrollPosition;\n\n/***/ }),\n/* 766 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar React = __webpack_require__(0);\n\nfunction isValidChild(object) {\n  return object == null || React.isValidElement(object);\n}\n\nfunction isReactChildren(object) {\n  return isValidChild(object) || Array.isArray(object) && object.every(isValidChild);\n}\n\nmodule.exports = isReactChildren;\n\n/***/ }),\n/* 767 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* jshint -W058 */\n\n\n\nvar Cancellation = __webpack_require__(364);\nvar Redirect = __webpack_require__(365);\n\n/**\n * Encapsulates a transition to a given path.\n *\n * The willTransitionTo and willTransitionFrom handlers receive\n * an instance of this class as their first argument.\n */\nfunction Transition(path, retry) {\n  this.path = path;\n  this.abortReason = null;\n  // TODO: Change this to router.retryTransition(transition)\n  this.retry = retry.bind(this);\n}\n\nTransition.prototype.abort = function (reason) {\n  if (this.abortReason == null) this.abortReason = reason || 'ABORT';\n};\n\nTransition.prototype.redirect = function (to, params, query) {\n  this.abort(new Redirect(to, params, query));\n};\n\nTransition.prototype.cancel = function () {\n  this.abort(new Cancellation());\n};\n\nTransition.from = function (transition, routes, components, callback) {\n  routes.reduce(function (callback, route, index) {\n    return function (error) {\n      if (error || transition.abortReason) {\n        callback(error);\n      } else if (route.onLeave) {\n        try {\n          route.onLeave(transition, components[index], callback);\n\n          // If there is no callback in the argument list, call it automatically.\n          if (route.onLeave.length < 3) callback();\n        } catch (e) {\n          callback(e);\n        }\n      } else {\n        callback();\n      }\n    };\n  }, callback)();\n};\n\nTransition.to = function (transition, routes, params, query, callback) {\n  routes.reduceRight(function (callback, route) {\n    return function (error) {\n      if (error || transition.abortReason) {\n        callback(error);\n      } else if (route.onEnter) {\n        try {\n          route.onEnter(transition, params, query, callback);\n\n          // If there is no callback in the argument list, call it automatically.\n          if (route.onEnter.length < 4) callback();\n        } catch (e) {\n          callback(e);\n        }\n      } else {\n        callback();\n      }\n    };\n  }, callback)();\n};\n\nmodule.exports = Transition;\n\n/***/ }),\n/* 768 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* jshint -W084 */\n\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar PathUtils = __webpack_require__(249);\n\nfunction deepSearch(route, pathname, query) {\n  // Check the subtree first to find the most deeply-nested match.\n  var childRoutes = route.childRoutes;\n  if (childRoutes) {\n    var match, childRoute;\n    for (var i = 0, len = childRoutes.length; i < len; ++i) {\n      childRoute = childRoutes[i];\n\n      if (childRoute.isDefault || childRoute.isNotFound) continue; // Check these in order later.\n\n      if (match = deepSearch(childRoute, pathname, query)) {\n        // A route in the subtree matched! Add this route and we're done.\n        match.routes.unshift(route);\n        return match;\n      }\n    }\n  }\n\n  // No child routes matched; try the default route.\n  var defaultRoute = route.defaultRoute;\n  if (defaultRoute && (params = PathUtils.extractParams(defaultRoute.path, pathname))) return new Match(pathname, params, query, [route, defaultRoute]);\n\n  // Does the \"not found\" route match?\n  var notFoundRoute = route.notFoundRoute;\n  if (notFoundRoute && (params = PathUtils.extractParams(notFoundRoute.path, pathname))) return new Match(pathname, params, query, [route, notFoundRoute]);\n\n  // Last attempt: check this route.\n  var params = PathUtils.extractParams(route.path, pathname);\n  if (params) return new Match(pathname, params, query, [route]);\n\n  return null;\n}\n\nvar Match = (function () {\n  _createClass(Match, null, [{\n    key: 'findMatch',\n\n    /**\n     * Attempts to match depth-first a route in the given route's\n     * subtree against the given path and returns the match if it\n     * succeeds, null if no match can be made.\n     */\n    value: function findMatch(routes, path) {\n      var pathname = PathUtils.withoutQuery(path);\n      var query = PathUtils.extractQuery(path);\n      var match = null;\n\n      for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query);\n\n      return match;\n    }\n  }]);\n\n  function Match(pathname, params, query, routes) {\n    _classCallCheck(this, Match);\n\n    this.pathname = pathname;\n    this.params = params;\n    this.query = query;\n    this.routes = routes;\n  }\n\n  return Match;\n})();\n\nmodule.exports = Match;\n\n/***/ }),\n/* 769 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction supportsHistory() {\n  /*! taken from modernizr\n   * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n   * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n   * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586\n   */\n  var ua = navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) {\n    return false;\n  }\n  return window.history && 'pushState' in window.history;\n}\n\nmodule.exports = supportsHistory;\n\n/***/ }),\n/* 770 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar createRouter = __webpack_require__(363);\n\n/**\n * A high-level convenience method that creates, configures, and\n * runs a router in one shot. The method signature is:\n *\n *   Router.run(routes[, location ], callback);\n *\n * Using `window.location.hash` to manage the URL, you could do:\n *\n *   Router.run(routes, function (Handler) {\n *     React.render(<Handler/>, document.body);\n *   });\n * \n * Using HTML5 history and a custom \"cursor\" prop:\n * \n *   Router.run(routes, Router.HistoryLocation, function (Handler) {\n *     React.render(<Handler cursor={cursor}/>, document.body);\n *   });\n *\n * Returns the newly created router.\n *\n * Note: If you need to specify further options for your router such\n * as error/abort handling or custom scroll behavior, use Router.create\n * instead.\n *\n *   var router = Router.create(options);\n *   router.run(function (Handler) {\n *     // ...\n *   });\n */\nfunction runRouter(routes, location, callback) {\n  if (typeof location === 'function') {\n    callback = location;\n    location = null;\n  }\n\n  var router = createRouter({\n    routes: routes,\n    location: location\n  });\n\n  router.run(callback);\n\n  return router;\n}\n\nmodule.exports = runRouter;\n\n/***/ }),\n/* 771 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = function (mapStateToProps) {\n  for (var _len = arguments.length, stores = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    stores[_key - 1] = arguments[_key];\n  }\n\n  function computeStateProps(props) {\n    return _extends({}, props, mapStateToProps());\n  }\n\n  return function (WrappedComponent) {\n    var Connect = (0, _createReactClass2.default)({\n      displayName: 'Connect',\n\n      mixins: [_store_listener2.default.apply(undefined, stores)],\n\n      getInitialState: function getInitialState() {\n        return { props: computeStateProps(this.props) };\n      },\n      storeDidUpdate: function storeDidUpdate() {\n        this.setState({\n          props: computeStateProps(this.props)\n        });\n      },\n      render: function render() {\n        return _react2.default.createElement(WrappedComponent, this.state.props);\n      }\n    });\n    return Connect;\n  };\n};\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _store_listener = __webpack_require__(366);\n\nvar _store_listener2 = _interopRequireDefault(_store_listener);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 772 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Immutable = __webpack_require__(14);\nvar assign = __webpack_require__(77);\n\nvar BaseStore = __webpack_require__(367);\nvar Dispatcher = __webpack_require__(369);\n\nvar ImmutableStore = function (_BaseStore) {\n  _inherits(ImmutableStore, _BaseStore);\n\n  function ImmutableStore(config) {\n    _classCallCheck(this, ImmutableStore);\n\n    var _this = _possibleConstructorReturn(this, (ImmutableStore.__proto__ || Object.getPrototypeOf(ImmutableStore)).call(this));\n\n    assign(_this, config);\n\n    _this._handlers = Immutable.Map();\n    _this._state = _this._toImmutable(_this.getInitialState());\n\n    Dispatcher.register(function (payload) {\n      var nextState = _this._handle(_this._state, payload.action);\n      if (nextState && nextState !== _this._state) {\n        _this._state = nextState;\n        _this.emitChange();\n      }\n    });\n\n    _this._bindActions();\n\n    _this.initialize();\n    return _this;\n  }\n\n  _createClass(ImmutableStore, [{\n    key: 'getInitialState',\n    value: function getInitialState() {\n      return Immutable.Map();\n    }\n\n    /**\n     * Stores may override this to perform setup operations such as\n     * adding action handlers or initialize the state.\n     */\n\n  }, {\n    key: 'initialize',\n    value: function initialize() {}\n  }, {\n    key: 'getState',\n    value: function getState() {\n      return this._state;\n    }\n  }, {\n    key: '_handle',\n    value: function _handle(currentState, action) {\n      var nextState = currentState;\n      var handler = this._handlers.get(action.actionType);\n      if (typeof handler === 'function') {\n        nextState = this._toImmutable(handler.call(this, currentState, action));\n      }\n      return nextState;\n    }\n\n    /**\n     * Binds an action type to a handler function.\n     * Whenever this type of action is dispatched the handler\n     * funciton will be called passing it the current state and action payload.\n     */\n\n  }, {\n    key: 'on',\n    value: function on(actionType, handler) {\n      this._handlers = this._handlers.set(actionType, handler);\n    }\n  }, {\n    key: '_bindActions',\n    value: function _bindActions() {\n      var actions = this.actions;\n\n\n      if (!actions) {\n        return;\n      }\n\n      for (var key in actions) {\n        var handler = actions[key];\n        if (!handler) {\n          continue;\n        }\n        this.on(key, handler);\n      }\n    }\n  }, {\n    key: '_toImmutable',\n    value: function _toImmutable(state) {\n      return Immutable.Iterable.isIterable(state) ? state : Immutable.fromJS(state);\n    }\n  }]);\n\n  return ImmutableStore;\n}(BaseStore);\n\nmodule.exports = ImmutableStore;\n\n/***/ }),\n/* 773 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = __webpack_require__(774);\n\n\n/***/ }),\n/* 774 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * \n * @preventMunge\n */\n\n\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = __webpack_require__(177);\n\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n *   1) Callbacks are not subscribed to particular events. Every payload is\n *      dispatched to every registered callback.\n *   2) Callbacks can be deferred in whole or part until other callbacks have\n *      been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n *   var flightDispatcher = new Dispatcher();\n *\n *   // Keeps track of which country is selected\n *   var CountryStore = {country: null};\n *\n *   // Keeps track of which city is selected\n *   var CityStore = {city: null};\n *\n *   // Keeps track of the base flight price of the selected city\n *   var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'city-update',\n *     selectedCity: 'paris'\n *   });\n *\n * This payload is digested by `CityStore`:\n *\n *   flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'city-update') {\n *       CityStore.city = payload.selectedCity;\n *     }\n *   });\n *\n * When the user selects a country, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'country-update',\n *     selectedCountry: 'australia'\n *   });\n *\n * This payload is digested by both stores:\n *\n *   CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       CountryStore.country = payload.selectedCountry;\n *     }\n *   });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n *   CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       // `CountryStore.country` may not be updated.\n *       flightDispatcher.waitFor([CountryStore.dispatchToken]);\n *       // `CountryStore.country` is now guaranteed to be updated.\n *\n *       // Select the default city for the new country\n *       CityStore.city = getDefaultCityForCountry(CountryStore.country);\n *     }\n *   });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n *   FlightPriceStore.dispatchToken =\n *     flightDispatcher.register(function(payload) {\n *       switch (payload.actionType) {\n *         case 'country-update':\n *         case 'city-update':\n *           flightDispatcher.waitFor([CityStore.dispatchToken]);\n *           FlightPriceStore.price =\n *             getFlightPriceStore(CountryStore.country, CityStore.city);\n *           break;\n *     }\n *   });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\nvar Dispatcher = (function () {\n  function Dispatcher() {\n    _classCallCheck(this, Dispatcher);\n\n    this._callbacks = {};\n    this._isDispatching = false;\n    this._isHandled = {};\n    this._isPending = {};\n    this._lastID = 1;\n  }\n\n  /**\n   * Registers a callback to be invoked with every dispatched payload. Returns\n   * a token that can be used with `waitFor()`.\n   */\n\n  Dispatcher.prototype.register = function register(callback) {\n    var id = _prefix + this._lastID++;\n    this._callbacks[id] = callback;\n    return id;\n  };\n\n  /**\n   * Removes a callback based on its token.\n   */\n\n  Dispatcher.prototype.unregister = function unregister(id) {\n    !this._callbacks[id] ?  false ? invariant(false, 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined;\n    delete this._callbacks[id];\n  };\n\n  /**\n   * Waits for the callbacks specified to be invoked before continuing execution\n   * of the current callback. This method should only be used by a callback in\n   * response to a dispatched payload.\n   */\n\n  Dispatcher.prototype.waitFor = function waitFor(ids) {\n    !this._isDispatching ?  false ? invariant(false, 'Dispatcher.waitFor(...): Must be invoked while dispatching.') : invariant(false) : undefined;\n    for (var ii = 0; ii < ids.length; ii++) {\n      var id = ids[ii];\n      if (this._isPending[id]) {\n        !this._isHandled[id] ?  false ? invariant(false, 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id) : invariant(false) : undefined;\n        continue;\n      }\n      !this._callbacks[id] ?  false ? invariant(false, 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined;\n      this._invokeCallback(id);\n    }\n  };\n\n  /**\n   * Dispatches a payload to all registered callbacks.\n   */\n\n  Dispatcher.prototype.dispatch = function dispatch(payload) {\n    !!this._isDispatching ?  false ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : undefined;\n    this._startDispatching(payload);\n    try {\n      for (var id in this._callbacks) {\n        if (this._isPending[id]) {\n          continue;\n        }\n        this._invokeCallback(id);\n      }\n    } finally {\n      this._stopDispatching();\n    }\n  };\n\n  /**\n   * Is this Dispatcher currently dispatching.\n   */\n\n  Dispatcher.prototype.isDispatching = function isDispatching() {\n    return this._isDispatching;\n  };\n\n  /**\n   * Call the callback stored with the given id. Also do some internal\n   * bookkeeping.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._invokeCallback = function _invokeCallback(id) {\n    this._isPending[id] = true;\n    this._callbacks[id](this._pendingPayload);\n    this._isHandled[id] = true;\n  };\n\n  /**\n   * Set up bookkeeping needed when dispatching.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._startDispatching = function _startDispatching(payload) {\n    for (var id in this._callbacks) {\n      this._isPending[id] = false;\n      this._isHandled[id] = false;\n    }\n    this._pendingPayload = payload;\n    this._isDispatching = true;\n  };\n\n  /**\n   * Clear bookkeeping used for dispatching.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._stopDispatching = function _stopDispatching() {\n    delete this._pendingPayload;\n    this._isDispatching = false;\n  };\n\n  return Dispatcher;\n})();\n\nmodule.exports = Dispatcher;\n\n/***/ }),\n/* 775 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _entity = __webpack_require__(351);\n\nvar _entity2 = _interopRequireDefault(_entity);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Collection.extend({\n  url: '/api/v1/entities?limit=10000&managed_entities=true&fields=id,name,entity_id,state,country,subdomain,display_name',\n  model: _entity2.default,\n\n  parse: function parse(response) {\n    return response.entities;\n  },\n  initialize: function initialize() {\n    var _this = this;\n\n    this.selected = new _entity2.default();\n    this.nullEntity = new _entity2.default();\n    this.nullEntity.set({\n      id: 'opengov',\n      name: 'OpenGov',\n      logo: '/assets/@opengov/ovid/dist/images/default-logo@2x.png',\n      entity_id: '*',\n      color: {\n        index: 0\n      },\n      isGlobal: true\n    });\n    this.nullEntity.fetched = true;\n\n    this.on('reset', function () {\n      _this.select(_this.selected.get('id'));\n    });\n  },\n  select: function select(id) {\n    if (id === 'opengov') {\n      return this.nullEntity;\n    }\n\n    return this.get(id) || new _entity2.default({ id: id });\n  },\n  getDraft: function getDraft() {\n    var draft = this.draftEntity || new _entity2.default();\n    this.draftEntity = draft;\n    return draft;\n  },\n  discardDraft: function discardDraft() {\n    this.draftEntity = null;\n  }\n});\n\n/***/ }),\n/* 776 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _lodashDeep = __webpack_require__(777);\n\nvar _lodashDeep2 = _interopRequireDefault(_lodashDeep);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Form = (0, _createReactClass2.default)({\n  displayName: 'Form',\n\n  propTypes: {\n    initialValues: _propTypes2.default.object,\n    errors: _propTypes2.default.object,\n    onSubmit: _propTypes2.default.func,\n    onChange: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      initialValues: {},\n      onChange: _lodash2.default.noop,\n      onSubmit: _lodash2.default.noop,\n      errors: {}\n    };\n  },\n  getInitialState: function getInitialState() {\n    return {};\n  },\n  render: function render() {\n    var _this = this;\n\n    var _props = this.props,\n        errors = _props.errors,\n        formClass = _props.formClass,\n        onSubmit = _props.onSubmit,\n        children = _props.children;\n\n    return _react2.default.createElement('form', { className: formClass, onSubmit: onSubmit }, _react2.default.Children.map(children, function (field) {\n      if (!field) {\n        return;\n      }\n\n      var name = field.props.name;\n\n      if (name) {\n        field = _react2.default.cloneElement(field, {\n          value: _this.currentFieldValue(name),\n          onChange: _this.handleChange.bind(_this, name),\n          errors: errors[name]\n        });\n      }\n\n      return field;\n    }, this));\n  },\n  currentFieldValue: function currentFieldValue(fieldName) {\n    var value = _lodashDeep2.default.deepGet(this.state, fieldName);\n    if (value == null) {\n      value = _lodashDeep2.default.deepGet(this.props.initialValues, fieldName);\n    }\n    return value;\n  },\n  handleChange: function handleChange(fieldName, newValue) {\n    var newState = _lodash2.default.clone(this.state);\n    _lodashDeep2.default.deepSet(newState, fieldName, newValue);\n    this.setState(newState);\n    this.props.onChange(fieldName, newValue);\n  },\n  values: function values() {\n    return _lodash2.default.clone(this.state);\n  },\n  reset: function reset() {\n    this.replaceState({});\n  }\n});\n\nexports.default = Form;\n\n/***/ }),\n/* 777 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n * Lodash mixins for (deep) object accessing / manipulation.\r\n * @author Mark Lagendijk <mark@lagendijk.info>\r\n * @license MIT\r\n */\r\n(function(root, factory){\r\n    if(true){\r\n        // AMD. Register as an anonymous module.\r\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n    }\r\n    else if(typeof exports === 'object'){\r\n        // Node. Does not work with strict CommonJS, but\r\n        // only CommonJS-like environments that support module.exports,\r\n        // like Node.\r\n        module.exports = factory(require('lodash').runInContext());\r\n    }\r\n    else{\r\n        // Browser globals (root is window)\r\n        root._.mixin(factory(root._));\r\n    }\r\n}(this, function(_, undefined){\r\n    'use strict';\r\n\r\n    var mixins = /** @lends _ */ {\r\n        /**\r\n         * Executes a deep check for the existence of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepIn: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            for(var i = 0; i < properties.length; i++){\r\n                var property = properties[i];\r\n                if(_.has(collection, property) ||\r\n                    _.isObject(collection) && property in collection){\r\n                    collection = collection[property];\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        },\r\n        /**\r\n         * Executes a deep check for the existence of a own property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepHas: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            for(var i = 0; i < properties.length; i++){\r\n                var property = properties[i];\r\n                if(_.has(collection, property)){\r\n                    collection = collection[property];\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        },\r\n        /**\r\n         * Retrieves the own value of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*} - The value, or undefined if it doesn't exists.\r\n         */\r\n        deepOwn: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.deepHas(collection, properties)){\r\n                return _.reduce(properties, function(object, property){\r\n                    return object[property];\r\n                }, collection);\r\n            }\r\n        },\r\n        /**\r\n         * Retrieves the value of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*} - The value, or undefined if it doesn't exists.\r\n         */\r\n        deepGet: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.deepIn(collection, properties)){\r\n                return _.reduce(properties, function(object, property){\r\n                    return object[property];\r\n                }, collection);\r\n            }\r\n        },\r\n        /**\r\n         * Sets a value of a property in an object tree. Any missing objects/arrays will be created.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @param {*} value - The value to set.\r\n         * @returns {Object} The object.\r\n         */\r\n        deepSet: function(collection, propertyPath, value){\r\n            var properties = getProperties(propertyPath);\r\n            var currentObject = collection;\r\n            _.forEach(properties, function(property, index){\r\n                if(index + 1 === properties.length){\r\n                    currentObject[property] = value;\r\n                }\r\n                else if(!_.isObject(currentObject[property])){\r\n                    currentObject[property] = isArrayKey(properties[index + 1]) ? [] : {};\r\n                }\r\n                currentObject = currentObject[property];\r\n            });\r\n\r\n            return collection;\r\n        },\r\n        /**\r\n         * Checks if the value at the propertyPath resolves to undefined, and sets it to defaultValue if this is the\r\n         * case.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {*} defaultValue - The default value.\r\n         * @returns {*} Either the existing, unchanged value, or the new (default) value.\r\n         */\r\n        deepDefault: function(collection, propertyPath, defaultValue){\r\n            var value = _.deepGet(collection, propertyPath);\r\n            if(_.isUndefined(value)){\r\n                _.deepSet(collection, propertyPath, defaultValue);\r\n                return defaultValue;\r\n            }\r\n            else{\r\n                return value;\r\n            }\r\n        },\r\n        /**\r\n         * Calls a function located at the specified property path, if it exists.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {Object} [thisArg] - The 'this' argument the function should be executed with.\r\n         * @param {...*} [arg] - One of the arguments the function should be executed with. Can occur 0..n times.\r\n         * @returns {*} The result of executing the function, or undefined if it doesn't exist.\r\n         */\r\n        deepCall: function(collection, propertyPath, thisArg, arg){\r\n            var args = Array.prototype.slice.call(arguments, 3);\r\n            return _.deepApply(collection, propertyPath, thisArg, args);\r\n        },\r\n        /**\r\n         * Applies a function located at the specified property path, if it exists.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {Object} [thisArg] - The 'this' argument the function should be executed with.\r\n         * @param {Array} [args] - An array of the arguments the function should be executed with.\r\n         * @returns {*} The result of executing the function, or undefined if it doesn't exist.\r\n         */\r\n        deepApply: function(collection, propertyPath, thisArg, args){\r\n            var func = _.deepGet(collection, propertyPath);\r\n            if(_.isFunction(func)){\r\n                return func.apply(thisArg, args);\r\n            }\r\n        },\r\n        /**\r\n         * Escapes a property name for usage in a string based property path.\r\n         * @param {string} propertyName - The name / key of the property.\r\n         * @returns {string}\r\n         */\r\n        deepEscapePropertyName: function(propertyName){\r\n            return propertyName\r\n                .replace(/\\\\/g, '\\\\\\\\')\r\n                .replace(/(\\.|\\[|\\])/g, '\\\\$1');\r\n        },\r\n        /**\r\n         * Maps all values in an object tree and returns a new object with the same structure as the original.\r\n         * @param {Object} object - The object to map.\r\n         * @param {Function} callback - The function to be called per iteration on any non-object value in the tree.\r\n         *   Callback is invoked with 2 arguments: (value, propertyPath)\r\n         *   propertyPath is the path of the current property, in array format.\r\n         * @returns {Object}\r\n         */\r\n        deepMapValues: function(object, callback, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.isArray(object)){\r\n                return _.map(object, deepMapValuesIteratee);\r\n            }\r\n            else if(_.isObject(object) && !_.isDate(object) && !_.isRegExp(object)){\r\n                return _.extend({}, object, _.mapValues(object, deepMapValuesIteratee));\r\n            }\r\n            else{\r\n                return callback(object, properties);\r\n            }\r\n\r\n            function deepMapValuesIteratee(value, key){\r\n                return _.deepMapValues(value, callback, _.flatten([properties, key]));\r\n            }\r\n        },\r\n        /**\r\n         * @function\r\n         * Executes a deep pluck on an collection of object trees.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepPluck: createDeepPluckStyleCallback(_.map),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findIndex _.findIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepFindIndex: createDeepPluckStyleCallback(_.findIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findLastIndex _.findLastIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepFindLastIndex: createDeepPluckStyleCallback(_.findLastIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#first _.first} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepFirst: createDeepPluckStyleCallback(_.first),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#flatten _.flatten} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepFlatten: createDeepPluckStyleCallback(_.flatten),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#initial _.initial} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepInitial: createDeepPluckStyleCallback(_.initial),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#last _.last} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepLast: createDeepPluckStyleCallback(_.last),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#lastIndexOf _.lastIndexOf} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepLastIndexOf: createDeepPluckStyleCallback(_.lastIndexOf),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#remove _.remove} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepRemove: createDeepPluckStyleCallback(_.remove),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#rest _.rest} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepRest: createDeepPluckStyleCallback(_.rest),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#sortedIndex _.sortedIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepSortedIndex: createDeepPluckStyleCallback(_.sortedIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#uniq _.uniq} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepUniq: createDeepPluckStyleCallback(_.uniq),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#countBy _.countBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepCountBy: createDeepPluckStyleCallback(_.countBy),\r\n        /**\r\n         * @function\r\n         * Executes{@link https://lodash.com/docs#every _.every} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepEvery: createDeepPluckStyleCallback(_.every),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#filter _.filter} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepFilter: createDeepPluckStyleCallback(_.filter),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#find _.find} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepFind: createDeepPluckStyleCallback(_.find),\r\n        /**\r\n         * @function\r\n         * Executes{@link https://lodash.com/docs#groupBy _.groupBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepGroupBy: createDeepPluckStyleCallback(_.groupBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#indexBy _.indexBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepIndexBy: createDeepPluckStyleCallback(_.indexBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#max _.max} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepMax: createDeepPluckStyleCallback(_.max),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#min _.min} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepMin: createDeepPluckStyleCallback(_.min),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#reject _.reject} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepReject: createDeepPluckStyleCallback(_.reject),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#some _.some} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepSome: createDeepPluckStyleCallback(_.some),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#sortBy _.sortBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepSortBy: createDeepPluckStyleCallback(_.sortBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findKey _.findKey} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {string|undefined}\r\n         */\r\n        deepFindKey: createDeepPluckStyleCallback(_.findKey),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findLastKey _.findLastKey} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {string|undefined}\r\n         */\r\n        deepFindLastKey: createDeepPluckStyleCallback(_.findLastKey)\r\n    };\r\n\r\n    // Support pre 1.2.0 function names\r\n    mixins.deepSetValue = mixins.deepSet;\r\n    mixins.deepGetValue = mixins.deepGet;\r\n    mixins.deepGetOwnValue = mixins.deepOwn;\r\n\r\n    _.mixin(mixins);\r\n\r\n    /**\r\n     * Returns the property path as array.\r\n     * @param {string|Array} propertyPath\r\n     * @returns {Array}\r\n     */\r\n    function getProperties(propertyPath){\r\n        if(_.isArray(propertyPath)){\r\n            return propertyPath;\r\n        }\r\n\r\n        if(!_.isString(propertyPath)){\r\n            return [];\r\n        }\r\n\r\n        return parseStringPropertyPath(propertyPath);\r\n    }\r\n\r\n    /**\r\n     * Parses a string based propertyPath\r\n     * @param {string} propertyPath\r\n     * @returns {Array}\r\n     */\r\n    function parseStringPropertyPath(propertyPath){\r\n        var character = '';\r\n        var parsedPropertyPath = [];\r\n        var parsedPropertyPathPart = '';\r\n        var escapeNextCharacter = false;\r\n        var isSpecialCharacter = false;\r\n        var insideBrackets = false;\r\n\r\n        // Walk through the path and find backslashes that escape periods or other backslashes, and split on unescaped\r\n        // periods and brackets.\r\n        for(var i = 0; i < propertyPath.length; i++){\r\n            character = propertyPath[i];\r\n            isSpecialCharacter = (character === '\\\\' || character === '[' || character === ']' || character === '.');\r\n\r\n            if(isSpecialCharacter && !escapeNextCharacter){\r\n                if(insideBrackets && character !== ']'){\r\n                    throw new SyntaxError('unexpected \"' + character + '\" within brackets at character ' + i + ' in property path ' + propertyPath);\r\n                }\r\n\r\n                switch(character){\r\n                case '\\\\':\r\n                    escapeNextCharacter = true;\r\n                    break;\r\n                case ']':\r\n                    insideBrackets = false;\r\n                    break;\r\n                case '[':\r\n                    insideBrackets = true;\r\n                    /* falls through */\r\n                case '.':\r\n                    parsedPropertyPath.push(parsedPropertyPathPart);\r\n                    parsedPropertyPathPart = '';\r\n                    break;\r\n                }\r\n            }\r\n            else{\r\n                parsedPropertyPathPart += character;\r\n                escapeNextCharacter = false;\r\n            }\r\n        }\r\n\r\n        if(parsedPropertyPath[0] === ''){\r\n            //allow '[0]', or '.0'\r\n            parsedPropertyPath.splice(0, 1);\r\n        }\r\n\r\n        // capture the final part\r\n        parsedPropertyPath.push(parsedPropertyPathPart);\r\n        return parsedPropertyPath;\r\n    }\r\n\r\n    /**\r\n     * Creates a function which executes the originalFunction with a \"_.deepPluck\" style callback.\r\n     * @param {Function} originalFunction - The orignal (Lodash) function.\r\n     * @returns {Function}\r\n     */\r\n    function createDeepPluckStyleCallback(originalFunction){\r\n        return function(collection, propertyPath){\r\n            return originalFunction(collection, function(item){\r\n                return _.deepGet(item, propertyPath);\r\n            });\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Checks whether key is a valid array key\r\n     * @param key\r\n     * @returns {boolean}\r\n     */\r\n    function isArrayKey(key){\r\n        var array = [];\r\n        array[key] = null;\r\n        return array.length > 0;\r\n    }\r\n\r\n    return mixins;\r\n}));\r\n\n\n/***/ }),\n/* 778 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _field = __webpack_require__(138);\n\nvar _field2 = _interopRequireDefault(_field);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar InputField = (0, _createReactClass2.default)({\n  displayName: 'InputField',\n\n  mixins: [_field2.default],\n\n  propTypes: {\n    disabled: _propTypes2.default.bool,\n    type: _propTypes2.default.string,\n    placeholder: _propTypes2.default.string\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      disabled: false,\n      type: 'text',\n      placeholder: ''\n    };\n  },\n  render: function render() {\n    var _this = this;\n\n    return this.renderFieldSet(_react2.default.createElement('input', {\n      disabled: this.props.disabled,\n      value: this.props.value,\n      onChange: function onChange(e) {\n        return _this.props.onChange(e.target.value);\n      },\n      type: this.props.type,\n      placeholder: this.props.placeholder }));\n  }\n});\n\nexports.default = InputField;\n\n/***/ }),\n/* 779 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _field = __webpack_require__(138);\n\nvar _field2 = _interopRequireDefault(_field);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Toggle = (0, _createReactClass2.default)({\n  displayName: 'Toggle',\n\n  mixins: [_field2.default],\n\n  propTypes: {\n    toggleLabel: _propTypes2.default.object,\n    toggleLabelIcon: _propTypes2.default.object,\n    disabled: _propTypes2.default.bool,\n    handleToggle: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      toggleLabel: { true: 'Enabled', false: 'Disabled' },\n      toggleLabelIcon: {},\n      disabled: false,\n      handleToggle: function handleToggle() {}\n    };\n  },\n  render: function render() {\n    var _props = this.props,\n        value = _props.value,\n        disabled = _props.disabled,\n        toggleLabelIcon = _props.toggleLabelIcon,\n        toggleLabel = _props.toggleLabel,\n        onChange = _props.onChange;\n\n    var toggleClasses = (0, _classnames2.default)({\n      'ui-toggle': true,\n      'is-true': value,\n      disabled: disabled\n    });\n\n    return this.renderFieldSet(_react2.default.createElement('fieldset', { className: 'ui-toggle__wrapper' }, _react2.default.createElement('button', {\n      type: 'button',\n      role: 'checkbox',\n      className: toggleClasses,\n      onClick: function onClick() {\n        return onChange(!value);\n      },\n      onKeyPress: function onKeyPress() {\n        return onChange(!value);\n      },\n      'aria-checked': value,\n      disabled: disabled\n    }, _react2.default.createElement('div', { className: 'ui-toggle__handle' }, _react2.default.createElement('div', { className: 'ui-toggle__knob' }), _react2.default.createElement('div', { className: 'ui-toggle__track' })), _react2.default.createElement('div', { className: 'ui-toggle__label' }, _react2.default.createElement('span', { className: toggleLabelIcon[value ? 'true' : 'false'] }), toggleLabel[value ? 'true' : 'false']))));\n  }\n});\n\nexports.default = Toggle;\n\n/***/ }),\n/* 780 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _field = __webpack_require__(138);\n\nvar _field2 = _interopRequireDefault(_field);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar TextAreaField = (0, _createReactClass2.default)({\n  displayName: 'TextAreaField',\n\n  mixins: [_field2.default],\n\n  propTypes: {\n    placeholder: _propTypes2.default.string\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      type: 'text',\n      placeholder: ''\n    };\n  },\n  render: function render() {\n    var _props = this.props,\n        value = _props.value,\n        placeholder = _props.placeholder,\n        _onChange = _props.onChange;\n\n    return this.renderFieldSet(_react2.default.createElement('textarea', { value: value, placeholder: placeholder, onChange: function onChange(e) {\n        return _onChange(e.target.value);\n      } }));\n  }\n});\n\nexports.default = TextAreaField;\n\n/***/ }),\n/* 781 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _field = __webpack_require__(138);\n\nvar _field2 = _interopRequireDefault(_field);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar SelectField = (0, _createReactClass2.default)({\n  displayName: 'SelectField',\n\n  mixins: [_field2.default],\n\n  propTypes: {\n    items: _propTypes2.default.arrayOf(_propTypes2.default.shape({\n      option: _propTypes2.default.any.isRequired,\n      value: _propTypes2.default.any,\n      disabled: _propTypes2.default.bool\n    })),\n    disabled: _propTypes2.default.bool\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return { items: [] };\n  },\n  render: function render() {\n    var _props = this.props,\n        name = _props.name,\n        value = _props.value,\n        _onChange = _props.onChange,\n        disabled = _props.disabled,\n        items = _props.items;\n\n    return this.renderFieldSet(_react2.default.createElement('select', { value: value, onChange: function onChange(e) {\n        return _onChange(e.target.value);\n      }, disabled: disabled }, items.map(function (item) {\n      return _react2.default.createElement('option', { key: item.value, value: item.value, disabled: item.disabled }, item.option);\n    })));\n  }\n});\n\nexports.default = SelectField;\n\n/***/ }),\n/* 782 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _calendar = __webpack_require__(494);\n\nvar _calendar2 = _interopRequireDefault(_calendar);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _dropdown = __webpack_require__(252);\n\nvar _dropdown2 = _interopRequireDefault(_dropdown);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar selectionModes = { days: 'MMM Do YYYY', months: 'MMM YYYY', years: 'YYYY' };\n\nvar DatePicker = (0, _createReactClass2.default)({\n  displayName: 'DatePicker',\n\n  propTypes: {\n    date: _propTypes2.default.any,\n    minYear: _propTypes2.default.any,\n    maxYear: _propTypes2.default.any,\n    minSelectionMode: _propTypes2.default.oneOf(Object.keys(selectionModes)),\n    onDateSelected: _propTypes2.default.func,\n    formatDisplayDate: _propTypes2.default.func\n  },\n\n  getInitialState: function getInitialState() {\n    return { selectedText: '' };\n  },\n\n  componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n    if (nextProps.date) {\n      this.setSelectedText((0, _moment2.default)(nextProps.date), this.props.minSelectionMode);\n    }\n  },\n\n  handleDateChanged: function handleDateChanged(date, mode) {\n    this.setSelectedText(date, mode);\n    if (this.props.onDateSelected) {\n      this.props.onDateSelected(date, mode);\n    }\n  },\n\n  setSelectedText: function setSelectedText(date, mode) {\n    //If a formatDisplayDate function isn't provided, use a default formatting (based on mode day/month/year)\n    if (!this.props.formatDisplayDate) {\n      this.setState({ selectedText: date.format(selectionModes[mode]) });\n    } else {\n      this.setState({ selectedText: this.props.formatDisplayDate(date) });\n    }\n  },\n\n  render: function render() {\n    return _react2.default.createElement(_dropdown2.default, {\n      dropdownClass: 'ui-dropdown',\n      toggleClass: 'ui-dropdown__toggle ui-button icon-calendar-1',\n      targetClass: 'ui-dropdown__target ui-datepicker__wrapper',\n      title: this.state.selectedText,\n      disabled: false,\n      ignoreContentClicks: true\n    }, _react2.default.createElement(_calendar2.default, {\n      minYear: this.props.minYear,\n      maxYear: this.props.maxYear,\n      date: this.props.date,\n      minSelectionMode: this.props.minSelectionMode,\n      onDateSelected: this.handleDateChanged\n    }));\n  }\n});\n\nexports.default = DatePicker;\n\n/***/ }),\n/* 783 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./af\": 372,\n\t\"./af.js\": 372,\n\t\"./ar\": 373,\n\t\"./ar-dz\": 374,\n\t\"./ar-dz.js\": 374,\n\t\"./ar-kw\": 375,\n\t\"./ar-kw.js\": 375,\n\t\"./ar-ly\": 376,\n\t\"./ar-ly.js\": 376,\n\t\"./ar-ma\": 377,\n\t\"./ar-ma.js\": 377,\n\t\"./ar-sa\": 378,\n\t\"./ar-sa.js\": 378,\n\t\"./ar-tn\": 379,\n\t\"./ar-tn.js\": 379,\n\t\"./ar.js\": 373,\n\t\"./az\": 380,\n\t\"./az.js\": 380,\n\t\"./be\": 381,\n\t\"./be.js\": 381,\n\t\"./bg\": 382,\n\t\"./bg.js\": 382,\n\t\"./bm\": 383,\n\t\"./bm.js\": 383,\n\t\"./bn\": 384,\n\t\"./bn.js\": 384,\n\t\"./bo\": 385,\n\t\"./bo.js\": 385,\n\t\"./br\": 386,\n\t\"./br.js\": 386,\n\t\"./bs\": 387,\n\t\"./bs.js\": 387,\n\t\"./ca\": 388,\n\t\"./ca.js\": 388,\n\t\"./cs\": 389,\n\t\"./cs.js\": 389,\n\t\"./cv\": 390,\n\t\"./cv.js\": 390,\n\t\"./cy\": 391,\n\t\"./cy.js\": 391,\n\t\"./da\": 392,\n\t\"./da.js\": 392,\n\t\"./de\": 393,\n\t\"./de-at\": 394,\n\t\"./de-at.js\": 394,\n\t\"./de-ch\": 395,\n\t\"./de-ch.js\": 395,\n\t\"./de.js\": 393,\n\t\"./dv\": 396,\n\t\"./dv.js\": 396,\n\t\"./el\": 397,\n\t\"./el.js\": 397,\n\t\"./en-au\": 398,\n\t\"./en-au.js\": 398,\n\t\"./en-ca\": 399,\n\t\"./en-ca.js\": 399,\n\t\"./en-gb\": 400,\n\t\"./en-gb.js\": 400,\n\t\"./en-ie\": 401,\n\t\"./en-ie.js\": 401,\n\t\"./en-il\": 402,\n\t\"./en-il.js\": 402,\n\t\"./en-nz\": 403,\n\t\"./en-nz.js\": 403,\n\t\"./eo\": 404,\n\t\"./eo.js\": 404,\n\t\"./es\": 405,\n\t\"./es-do\": 406,\n\t\"./es-do.js\": 406,\n\t\"./es-us\": 407,\n\t\"./es-us.js\": 407,\n\t\"./es.js\": 405,\n\t\"./et\": 408,\n\t\"./et.js\": 408,\n\t\"./eu\": 409,\n\t\"./eu.js\": 409,\n\t\"./fa\": 410,\n\t\"./fa.js\": 410,\n\t\"./fi\": 411,\n\t\"./fi.js\": 411,\n\t\"./fo\": 412,\n\t\"./fo.js\": 412,\n\t\"./fr\": 413,\n\t\"./fr-ca\": 414,\n\t\"./fr-ca.js\": 414,\n\t\"./fr-ch\": 415,\n\t\"./fr-ch.js\": 415,\n\t\"./fr.js\": 413,\n\t\"./fy\": 416,\n\t\"./fy.js\": 416,\n\t\"./gd\": 417,\n\t\"./gd.js\": 417,\n\t\"./gl\": 418,\n\t\"./gl.js\": 418,\n\t\"./gom-latn\": 419,\n\t\"./gom-latn.js\": 419,\n\t\"./gu\": 420,\n\t\"./gu.js\": 420,\n\t\"./he\": 421,\n\t\"./he.js\": 421,\n\t\"./hi\": 422,\n\t\"./hi.js\": 422,\n\t\"./hr\": 423,\n\t\"./hr.js\": 423,\n\t\"./hu\": 424,\n\t\"./hu.js\": 424,\n\t\"./hy-am\": 425,\n\t\"./hy-am.js\": 425,\n\t\"./id\": 426,\n\t\"./id.js\": 426,\n\t\"./is\": 427,\n\t\"./is.js\": 427,\n\t\"./it\": 428,\n\t\"./it.js\": 428,\n\t\"./ja\": 429,\n\t\"./ja.js\": 429,\n\t\"./jv\": 430,\n\t\"./jv.js\": 430,\n\t\"./ka\": 431,\n\t\"./ka.js\": 431,\n\t\"./kk\": 432,\n\t\"./kk.js\": 432,\n\t\"./km\": 433,\n\t\"./km.js\": 433,\n\t\"./kn\": 434,\n\t\"./kn.js\": 434,\n\t\"./ko\": 435,\n\t\"./ko.js\": 435,\n\t\"./ky\": 436,\n\t\"./ky.js\": 436,\n\t\"./lb\": 437,\n\t\"./lb.js\": 437,\n\t\"./lo\": 438,\n\t\"./lo.js\": 438,\n\t\"./lt\": 439,\n\t\"./lt.js\": 439,\n\t\"./lv\": 440,\n\t\"./lv.js\": 440,\n\t\"./me\": 441,\n\t\"./me.js\": 441,\n\t\"./mi\": 442,\n\t\"./mi.js\": 442,\n\t\"./mk\": 443,\n\t\"./mk.js\": 443,\n\t\"./ml\": 444,\n\t\"./ml.js\": 444,\n\t\"./mr\": 445,\n\t\"./mr.js\": 445,\n\t\"./ms\": 446,\n\t\"./ms-my\": 447,\n\t\"./ms-my.js\": 447,\n\t\"./ms.js\": 446,\n\t\"./mt\": 448,\n\t\"./mt.js\": 448,\n\t\"./my\": 449,\n\t\"./my.js\": 449,\n\t\"./nb\": 450,\n\t\"./nb.js\": 450,\n\t\"./ne\": 451,\n\t\"./ne.js\": 451,\n\t\"./nl\": 452,\n\t\"./nl-be\": 453,\n\t\"./nl-be.js\": 453,\n\t\"./nl.js\": 452,\n\t\"./nn\": 454,\n\t\"./nn.js\": 454,\n\t\"./pa-in\": 455,\n\t\"./pa-in.js\": 455,\n\t\"./pl\": 456,\n\t\"./pl.js\": 456,\n\t\"./pt\": 457,\n\t\"./pt-br\": 458,\n\t\"./pt-br.js\": 458,\n\t\"./pt.js\": 457,\n\t\"./ro\": 459,\n\t\"./ro.js\": 459,\n\t\"./ru\": 460,\n\t\"./ru.js\": 460,\n\t\"./sd\": 461,\n\t\"./sd.js\": 461,\n\t\"./se\": 462,\n\t\"./se.js\": 462,\n\t\"./si\": 463,\n\t\"./si.js\": 463,\n\t\"./sk\": 464,\n\t\"./sk.js\": 464,\n\t\"./sl\": 465,\n\t\"./sl.js\": 465,\n\t\"./sq\": 466,\n\t\"./sq.js\": 466,\n\t\"./sr\": 467,\n\t\"./sr-cyrl\": 468,\n\t\"./sr-cyrl.js\": 468,\n\t\"./sr.js\": 467,\n\t\"./ss\": 469,\n\t\"./ss.js\": 469,\n\t\"./sv\": 470,\n\t\"./sv.js\": 470,\n\t\"./sw\": 471,\n\t\"./sw.js\": 471,\n\t\"./ta\": 472,\n\t\"./ta.js\": 472,\n\t\"./te\": 473,\n\t\"./te.js\": 473,\n\t\"./tet\": 474,\n\t\"./tet.js\": 474,\n\t\"./tg\": 475,\n\t\"./tg.js\": 475,\n\t\"./th\": 476,\n\t\"./th.js\": 476,\n\t\"./tl-ph\": 477,\n\t\"./tl-ph.js\": 477,\n\t\"./tlh\": 478,\n\t\"./tlh.js\": 478,\n\t\"./tr\": 479,\n\t\"./tr.js\": 479,\n\t\"./tzl\": 480,\n\t\"./tzl.js\": 480,\n\t\"./tzm\": 481,\n\t\"./tzm-latn\": 482,\n\t\"./tzm-latn.js\": 482,\n\t\"./tzm.js\": 481,\n\t\"./ug-cn\": 483,\n\t\"./ug-cn.js\": 483,\n\t\"./uk\": 484,\n\t\"./uk.js\": 484,\n\t\"./ur\": 485,\n\t\"./ur.js\": 485,\n\t\"./uz\": 486,\n\t\"./uz-latn\": 487,\n\t\"./uz-latn.js\": 487,\n\t\"./uz.js\": 486,\n\t\"./vi\": 488,\n\t\"./vi.js\": 488,\n\t\"./x-pseudo\": 489,\n\t\"./x-pseudo.js\": 489,\n\t\"./yo\": 490,\n\t\"./yo.js\": 490,\n\t\"./zh-cn\": 491,\n\t\"./zh-cn.js\": 491,\n\t\"./zh-hk\": 492,\n\t\"./zh-hk.js\": 492,\n\t\"./zh-tw\": 493,\n\t\"./zh-tw.js\": 493\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 783;\n\n/***/ }),\n/* 784 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactAddonsPureRenderMixin = __webpack_require__(785);\n\nvar _reactAddonsPureRenderMixin2 = _interopRequireDefault(_reactAddonsPureRenderMixin);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _event_utils = __webpack_require__(786);\n\nvar _event_utils2 = _interopRequireDefault(_event_utils);\n\nvar _slider_handle = __webpack_require__(787);\n\nvar _slider_handle2 = _interopRequireDefault(_slider_handle);\n\nvar _slider_range = __webpack_require__(788);\n\nvar _slider_range2 = _interopRequireDefault(_slider_range);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Slider = (0, _createReactClass2.default)({\n  displayName: 'Slider',\n\n  mixins: [_reactAddonsPureRenderMixin2.default],\n\n  propTypes: {\n    min: _propTypes2.default.number,\n    max: _propTypes2.default.number,\n    value: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.arrayOf(_propTypes2.default.number)]),\n    step: _propTypes2.default.number,\n    handleClasses: _propTypes2.default.object,\n\n    // Override component measurements here (ex: range width, label width)\n    // This is mainly used for testing, but may be useful elsewhere.\n    rangeWidth: _propTypes2.default.number,\n    labelWidth: _propTypes2.default.number,\n\n    // Called when the user has selected a new value or range.\n    onChange: _propTypes2.default.func,\n\n    // Called when the user interacts with the slider handles.\n    // Provides notifications when a \"slide\" starts, moves, and ends.\n    onSliderStart: _propTypes2.default.func,\n    onSliderMove: _propTypes2.default.func,\n    onSliderEnd: _propTypes2.default.func,\n\n    // Called when the user clicks a slider handle label.\n    onSliderClick: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      min: 0,\n      max: 100,\n      value: 0,\n      step: 1\n    };\n  },\n\n  getInitialState: function getInitialState() {\n    return {\n      handles: [{ position: 0 }],\n      focusedHandle: null\n    };\n  },\n\n  componentDidMount: function componentDidMount() {\n    var _this = this;\n\n    this.$document = (0, _jquery2.default)(document);\n\n    this.rangeWidth = this.props.rangeWidth || this.el.offsetWidth;\n    this.handleWidth = this['handle_0'].offsetWidth;\n    this.labelWidth = this.props.labelWidth || this['handle_label_0'].offsetWidth;\n    this.grabX = this.handleWidth / 2;\n\n    this.setState({\n      handles: this.getValues().map(function (value) {\n        return { position: _this.getPositionFromValue(value) };\n      })\n    });\n  },\n\n  componentDidUpdate: function componentDidUpdate(prevProps) {\n    var _this2 = this;\n\n    this.rangeWidth = this.props.rangeWidth || this.el.offsetWidth;\n    this.handleWidth = this['handle_0'].offsetWidth;\n    this.labelWidth = this.props.labelWidth || this['handle_label_0'].offsetWidth;\n    this.grabX = this.handleWidth / 2;\n\n    if (this.props.value !== prevProps.value) {\n      this.setState({\n        handles: this.getValues().map(function (value) {\n          return { position: _this2.getPositionFromValue(value) };\n        })\n      });\n    }\n  },\n\n  render: function render() {\n    var _this3 = this;\n\n    var values = this.getValues();\n\n    var handles = this.state.handles.map(function (handle, index) {\n      var value = values[index];\n\n      var zindex;\n      if (value === _this3.props.min) {\n        zindex = index === 0 ? 10 : 100;\n      } else {\n        zindex = index === 0 ? 100 : 10;\n      }\n\n      var label = _this3.getValueFromPosition(handle.position);\n\n      return _react2.default.createElement(_slider_handle2.default, {\n        key: index,\n        sliderRef: function sliderRef(el) {\n          return _this3['handle_' + index] = el;\n        },\n        labelRef: function labelRef(el) {\n          return _this3['handle_label_' + index] = el;\n        },\n        position: handle.position,\n        zindex: zindex,\n        handleClasses: _lodash2.default.result(_this3.props.handleClasses, index),\n        onDown: _lodash2.default.partial(_this3.handleDown, index)\n      }, label);\n    });\n\n    var sliderClasses = (0, _classnames2.default)({\n      'ui-slider': true,\n      'is-overlapping': this.state.overlapping\n    });\n\n    return _react2.default.createElement('div', { className: sliderClasses, ref: function ref(el) {\n        return _this3.el = el;\n      } }, handles, this.state.handles.length === 2 ? _react2.default.createElement(_slider_range2.default, { start: this.state.handles[0].position, end: this.state.handles[1].position }) : null);\n  },\n\n  handleDown: function handleDown(index) {\n    this.$document.on('mousemove', this.handleMove);\n    this.$document.one('mouseup', this.handleUp);\n\n    this.setState({\n      focusedHandle: index\n    });\n  },\n\n  handleUp: function handleUp(e) {\n    var focusedHandle = this.state.focusedHandle;\n\n    this.$document.off('mousemove', this.handleMove);\n\n    if (this.state.sliding) {\n      this.notifySliderEnd(focusedHandle);\n\n      var value = this.getValueFromPosition(this.state.handles[focusedHandle].position);\n      this.updateValueAtIndex(focusedHandle, value);\n\n      this.setHandlePosition(focusedHandle, this.getPositionFromValue(value));\n\n      this.setState({\n        focusedHandle: null,\n        sliding: false\n      });\n    } else {\n      this.notifySliderClick(focusedHandle, this.getHandlePosition(focusedHandle));\n    }\n  },\n\n  handleMove: function handleMove(e) {\n    e.preventDefault();\n\n    var focusedHandle = this.state.focusedHandle;\n\n    if (!this.state.sliding) {\n      this.setState({\n        sliding: true\n      });\n\n      this.notifySliderStart(focusedHandle);\n    }\n\n    var newPosition = this.limitHandlePosition(this.getRelativePosition(e) - this.grabX, focusedHandle);\n\n    this.setHandlePosition(focusedHandle, newPosition);\n\n    this.notifySliderMove(focusedHandle, newPosition);\n  },\n\n  limitHandlePosition: function limitHandlePosition(pos, index) {\n    var min = index === 0 ? 0 : this.getHandlePosition(0);\n    var max = index === 0 ? this.getHandlePosition(1) : this.rangeWidth;\n\n    if (pos < min) {\n      return min;\n    }\n    if (pos > max) {\n      return max;\n    }\n\n    return pos;\n  },\n\n  normalizeValue: function normalizeValue(value) {\n    return _lodash2.default.isArray(value) ? value : [value];\n  },\n\n  getValues: function getValues() {\n    return this.normalizeValue(this.props.value);\n  },\n\n  getMinValue: function getMinValue() {\n    return _lodash2.default.first(this.getValues());\n  },\n\n  getMaxValue: function getMaxValue() {\n    return _lodash2.default.last(this.getValues());\n  },\n\n  setHandlePosition: function setHandlePosition(index, position) {\n    var handles = this.state.handles.slice(0);\n    handles[index].position = position;\n    this.setState({\n      handles: handles,\n      overlapping: this.willHandleOverlap(index, position)\n    });\n  },\n\n  updateValueAtIndex: function updateValueAtIndex(index, newValue) {\n    if (_lodash2.default.isArray(this.props.value)) {\n      var valueCopy = this.props.value.slice(0);\n      valueCopy[index] = newValue;\n      this.notifyChange(valueCopy);\n    } else {\n      this.notifyChange(newValue);\n    }\n  },\n\n  getHandlePosition: function getHandlePosition(index) {\n    return this.getPositionFromValue(index === 0 ? this.getMinValue() : this.getMaxValue());\n  },\n\n  getRelativePosition: function getRelativePosition(e) {\n    var rangeX = this.el.getBoundingClientRect().left;\n    return _event_utils2.default.getXPosition(e) - rangeX;\n  },\n\n  getValueFromPosition: function getValueFromPosition(pos) {\n    var percentage, value;\n    percentage = pos / (this.rangeWidth || 1);\n    value = this.props.step * Math.round(percentage * (this.props.max - this.props.min) / this.props.step) + this.props.min;\n    return Number(value.toFixed(2));\n  },\n\n  getPositionFromValue: function getPositionFromValue(value) {\n    var percentage, pos;\n    percentage = (value - this.props.min) / (this.props.max - this.props.min);\n    pos = percentage * this.rangeWidth;\n    return pos;\n  },\n\n  willHandleOverlap: function willHandleOverlap(index, position) {\n    var otherHandle = this.state.handles[index === 0 ? 1 : 0];\n    var distance = Math.abs(otherHandle.position - position);\n    return distance < this.labelWidth;\n  },\n\n  notifySliderStart: function notifySliderStart(index) {\n    if (this.props.onSliderStart) {\n      this.props.onSliderStart(index);\n    }\n  },\n\n  notifySliderMove: function notifySliderMove(index, position) {\n    if (this.props.onSliderMove) {\n      this.props.onSliderMove(index, position, this.getValueFromPosition(position));\n    }\n  },\n\n  notifySliderEnd: function notifySliderEnd(index) {\n    if (this.props.onSliderEnd) {\n      this.props.onSliderEnd(index);\n    }\n  },\n\n  notifyChange: function notifyChange(newValue) {\n    if (this.props.onChange) {\n      this.props.onChange(newValue);\n    }\n  },\n\n  notifySliderClick: function notifySliderClick(index, position) {\n    if (this.props.onSliderClick) {\n      this.props.onSliderClick(index, position);\n    }\n  }\n});\n\nexports.default = Slider;\n\n/***/ }),\n/* 785 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar shallowEqual = __webpack_require__(247);\n\nmodule.exports = {\n  shouldComponentUpdate: function(nextProps, nextState) {\n    return (\n      !shallowEqual(this.props, nextProps) ||\n      !shallowEqual(this.state, nextState)\n    );\n  }\n};\n\n\n/***/ }),\n/* 786 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction getXPosition(e) {\n  return e.pageX || e.originalEvent && (e.originalEvent.clientX || e.originalEvent.touches && e.originalEvent.touches[0] && e.originalEvent.touches[0].clientX || e.originalEvent.clientX) || e.currentPoint && e.currentPoint.x || 0;\n};\n\nexports.default = {\n  getXPosition: getXPosition\n};\n\n/***/ }),\n/* 787 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar SliderHandle = (0, _createReactClass2.default)({\n  displayName: 'SliderHandle',\n\n  propTypes: {\n    position: _propTypes2.default.number.isRequired,\n    onDown: _propTypes2.default.func,\n    onClick: _propTypes2.default.func,\n    sliderRef: _propTypes2.default.func,\n    labelRef: _propTypes2.default.func\n  },\n\n  handleMouseDown: function handleMouseDown(e) {\n    if (e.button === 0 && this.props.onDown) {\n      this.props.onDown();\n    }\n  },\n  render: function render() {\n    var style = {\n      left: this.props.position + 'px',\n      zIndex: this.props.zindex\n    };\n\n    var classes = _lodash2.default.extend({\n      'ui-slider__handle': true\n\n    }, this.props.handleClasses);\n\n    return _react2.default.createElement('div', { ref: this.props.sliderRef, className: (0, _classnames2.default)(classes), style: style, onMouseDown: this.handleMouseDown }, _react2.default.createElement('div', { ref: this.props.labelRef, className: 'ui-slider__handle__label' }, this.props.children));\n  }\n});\n\nexports.default = SliderHandle;\n\n/***/ }),\n/* 788 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar SliderRange = (0, _createReactClass2.default)({\n  displayName: 'SliderRange',\n  render: function render() {\n    var styles = {\n      left: this.props.start,\n      width: this.props.end - this.props.start\n    };\n\n    return _react2.default.createElement('div', { className: 'ui-slider__range', style: styles });\n  }\n});\n\nexports.default = SliderRange;\n\n/***/ }),\n/* 789 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _search_dropdown = __webpack_require__(790);\n\nvar _search_dropdown2 = _interopRequireDefault(_search_dropdown);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));\n  }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar Search = function (_Component) {\n  _inherits(Search, _Component);\n\n  function Search(props) {\n    _classCallCheck(this, Search);\n\n    var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, props));\n\n    _this.onInputChange = function (e) {\n      var value = e.target.value;\n      _this.setState({ value: value });\n      _this.notifyInputChange(value);\n    };\n\n    _this.onKeyDown = function (e) {\n      switch (e.key) {\n        case 'ArrowDown':\n          _this.highlightNextItem();\n          break;\n\n        case 'ArrowUp':\n          _this.highlightPrevItem();\n          break;\n\n        case 'Enter':\n          _this.selectHighlightedItem();\n          break;\n\n        default:\n          return;\n      }\n\n      e.preventDefault();\n    };\n\n    _this.onBlur = function () {\n      // Hack to delay the blur a bit to allow any click events on the\n      // search result items to be dispatched. Blur events fire before any click events.\n      setTimeout(function () {\n        _this.setState({ index: 0, value: '' });\n        _this.notifyInputChange('');\n      }, 150);\n    };\n\n    _this.onHoverResult = function (index) {\n      _this.setState({ index: index });\n    };\n\n    _this.onClickResult = function () {\n      _this.selectHighlightedItem();\n    };\n\n    _this.state = {\n      index: 0,\n      value: props.initialValue\n    };\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: 'highlightPrevItem',\n    value: function highlightPrevItem() {\n      var _this2 = this;\n\n      this.setState(function (prevState) {\n        var index = prevState.index;\n\n        return { index: index !== 0 ? index - 1 : 0 };\n      }, function () {\n        return _this2.scrollToResult(_this2.state.index);\n      });\n    }\n  }, {\n    key: 'highlightNextItem',\n    value: function highlightNextItem() {\n      var _this3 = this;\n\n      this.setState(function (prevState, currentProps) {\n        var index = prevState.index;\n        var results = currentProps.results;\n\n        var items = results && results.items;\n        return { index: items && index !== items.length - 1 ? index + 1 : index };\n      }, function () {\n        return _this3.scrollToResult(_this3.state.index);\n      });\n    }\n  }, {\n    key: 'selectHighlightedItem',\n    value: function selectHighlightedItem() {\n      var onSelectResult = this.props.onSelectResult;\n\n      if (onSelectResult) {\n        onSelectResult(this.state.index);\n      }\n      this.setState({ value: '' });\n    }\n  }, {\n    key: 'scrollToResult',\n    value: function scrollToResult(index) {\n      var containerNode = (0, _jquery2.default)((0, _react.findDOMNode)(this._resultsContainer));\n      var containerHeight = containerNode.height();\n      var itemNode = (0, _jquery2.default)(containerNode.children().get(index));\n      var itemHeight = itemNode.height();\n\n      var scrollTop = containerNode.scrollTop();\n\n      // The item top position value is not correct, so we just compute this ourselves.\n      var itemTop = index * itemHeight - scrollTop;\n      var itemBottom = itemTop + itemHeight;\n\n      if (itemTop < 0) {\n        scrollTop += itemTop;\n      } else if (itemBottom > containerHeight) {\n        scrollTop += itemBottom - containerHeight;\n      } else {\n        return;\n      }\n\n      containerNode.stop(true).animate({ scrollTop: scrollTop });\n    }\n  }, {\n    key: 'notifyInputChange',\n    value: function notifyInputChange(newValue) {\n      var onInputChange = this.props.onInputChange;\n\n      if (onInputChange) {\n        onInputChange(newValue);\n      }\n    }\n  }, {\n    key: 'focusInput',\n    value: function focusInput() {\n      this.refs.input.focus();\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      if (!nextProps.results || nextProps.results.length === 0) {\n        this.setState({ index: 0 });\n      } else if (nextProps.results.length <= this.state.index) {\n        this.setState({ index: nextProps.results.length - 1 });\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var _props = this.props,\n          initialValue = _props.initialValue,\n          placeholder = _props.placeholder,\n          results = _props.results;\n      var value = this.state.value;\n\n      return _react2.default.createElement('div', { className: 'ui-search' }, _react2.default.createElement('span', { className: 'icon-search-1' }), _react2.default.createElement('input', {\n        ref: 'input',\n        type: 'search',\n        placeholder: placeholder,\n        value: value,\n        onChange: this.onInputChange,\n        onKeyDown: this.onKeyDown,\n        onBlur: this.onBlur\n      }), _react2.default.createElement(_search_dropdown2.default, {\n        results: results,\n        activeIndex: this.state.index,\n        onHoverResult: this.onHoverResult,\n        onClickResult: this.onClickResult,\n        resultsRef: function resultsRef(ref) {\n          return _this4._resultsContainer = ref;\n        }\n      }));\n    }\n  }]);\n\n  return Search;\n}(_react.Component);\n\nSearch.propTypes = {\n  initialValue: _propTypes2.default.string,\n  results: _search_dropdown2.default.propTypes.results,\n  onInputChange: _propTypes2.default.func,\n  onSelectResult: _propTypes2.default.func\n};\nexports.default = Search;\n\n/***/ }),\n/* 790 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _search_results = __webpack_require__(791);\n\nvar _search_results2 = _interopRequireDefault(_search_results);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));\n  }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar SearchDropdown = function (_Component) {\n  _inherits(SearchDropdown, _Component);\n\n  function SearchDropdown() {\n    _classCallCheck(this, SearchDropdown);\n\n    return _possibleConstructorReturn(this, (SearchDropdown.__proto__ || Object.getPrototypeOf(SearchDropdown)).apply(this, arguments));\n  }\n\n  _createClass(SearchDropdown, [{\n    key: 'render',\n    value: function render() {\n      if (!this.props.results) {\n        return null;\n      }\n\n      var _props = this.props,\n          activeIndex = _props.activeIndex,\n          onHoverResult = _props.onHoverResult,\n          onClickResult = _props.onClickResult,\n          resultsRef = _props.resultsRef;\n      var _props$results = this.props.results,\n          heading = _props$results.heading,\n          items = _props$results.items;\n\n      return _react2.default.createElement('div', { className: 'ui-search__dropdown' }, _react2.default.createElement('header', { className: 'ui-search__header' }, _react2.default.createElement('small', null, heading)), _react2.default.createElement(_search_results2.default, {\n        items: items,\n        activeIndex: activeIndex,\n        resultsRef: resultsRef,\n        onHoverResult: onHoverResult,\n        onClickResult: onClickResult\n      }));\n    }\n  }]);\n\n  return SearchDropdown;\n}(_react.Component);\n\nSearchDropdown.propTypes = {\n  results: _propTypes2.default.shape({\n    heading: _propTypes2.default.string,\n    items: _search_results2.default.propTypes.items\n  }),\n  onHoverResult: _propTypes2.default.func,\n  onClickResult: _propTypes2.default.func\n};\nexports.default = SearchDropdown;\n\n/***/ }),\n/* 791 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _search_result_item = __webpack_require__(792);\n\nvar _search_result_item2 = _interopRequireDefault(_search_result_item);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));\n  }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar SearchResults = function (_Component) {\n  _inherits(SearchResults, _Component);\n\n  function SearchResults() {\n    _classCallCheck(this, SearchResults);\n\n    return _possibleConstructorReturn(this, (SearchResults.__proto__ || Object.getPrototypeOf(SearchResults)).apply(this, arguments));\n  }\n\n  _createClass(SearchResults, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          items = _props.items,\n          activeIndex = _props.activeIndex,\n          onHoverResult = _props.onHoverResult,\n          onClickResult = _props.onClickResult,\n          resultsRef = _props.resultsRef;\n\n      if (!items) {\n        return null;\n      }\n      return _react2.default.createElement('ul', { className: 'ui-search__results', ref: resultsRef }, items.map(function (item, i) {\n        return _react2.default.createElement(_search_result_item2.default, {\n          key: i,\n          item: item,\n          isActive: i === activeIndex,\n          onHover: function onHover() {\n            return onHoverResult(i);\n          },\n          onClick: onClickResult\n        });\n      }));\n    }\n  }]);\n\n  return SearchResults;\n}(_react.Component);\n\nSearchResults.propTypes = {\n  items: _propTypes2.default.arrayOf(_search_result_item2.default.propTypes.item),\n  onHoverResult: _propTypes2.default.func,\n  onClickResult: _propTypes2.default.func\n};\nexports.default = SearchResults;\n\n/***/ }),\n/* 792 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof(call)) === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof(superClass)));\n  }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar SearchResultItem = function (_Component) {\n  _inherits(SearchResultItem, _Component);\n\n  function SearchResultItem() {\n    _classCallCheck(this, SearchResultItem);\n\n    return _possibleConstructorReturn(this, (SearchResultItem.__proto__ || Object.getPrototypeOf(SearchResultItem)).apply(this, arguments));\n  }\n\n  _createClass(SearchResultItem, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          item = _props.item,\n          isActive = _props.isActive,\n          onHover = _props.onHover,\n          onClick = _props.onClick;\n\n      return _react2.default.createElement('li', { onMouseEnter: onHover, onClick: onClick }, _react2.default.createElement('a', { className: 'ui-search__results__item ' + (isActive ? 'is-active' : '') }, _react2.default.createElement('span', { className: 'ui-search__results__title' }, item.title), item.type ? _react2.default.createElement('small', { className: 'ui-search__results__type' }, item.type) : null));\n    }\n  }]);\n\n  return SearchResultItem;\n}(_react.Component);\n\nSearchResultItem.propTypes = {\n  item: _propTypes2.default.shape({\n    title: _propTypes2.default.string.isRequired,\n    type: _propTypes2.default.string\n  }),\n  isActive: _propTypes2.default.bool,\n  onHover: _propTypes2.default.func,\n  onClick: _propTypes2.default.func\n};\nexports.default = SearchResultItem;\n\n/***/ }),\n/* 793 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar ToggleSwitch = (0, _createReactClass2.default)({\n  displayName: 'ToggleSwitch',\n\n  propTypes: {\n    state: _propTypes2.default.oneOf(['on', 'off']),\n    size: _propTypes2.default.oneOf(['small']),\n    children: _propTypes2.default.node,\n    onToggle: _propTypes2.default.func,\n    disabled: _propTypes2.default.bool\n  },\n\n  render: function render() {\n    var toggleClasses = (0, _classnames2.default)({\n      'ui-toggle': true,\n      'is-true': this.props.state === 'on',\n      'small': this.props.size === 'small',\n      'disabled': this.props.disabled\n    });\n\n    var checked = this.props.state === 'on' ? true : false;\n\n    return _react2.default.createElement('fieldset', { className: 'ui-toggle__wrapper' }, _react2.default.createElement('button', {\n      type: 'button',\n      role: 'checkbox',\n      className: toggleClasses,\n      onClick: this.props.disabled ? null : this.props.onToggle,\n      onKeyPress: this.props.disabled ? null : this.props.onToggle,\n      'aria-checked': checked,\n      disabled: this.props.disabled\n    }, _react2.default.createElement('div', { className: 'ui-toggle__handle' }, _react2.default.createElement('div', { className: 'ui-toggle__knob' }), _react2.default.createElement('div', { className: 'ui-toggle__track' })), _react2.default.createElement('div', { className: 'ui-toggle__label' }, this.props.children)));\n  }\n});\n\nexports.default = ToggleSwitch;\n\n/***/ }),\n/* 794 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar CheckButton = (0, _createReactClass2.default)({\n  displayName: 'CheckButton',\n\n  propTypes: {\n    state: _propTypes2.default.oneOf(['unchecked', 'checked', 'intermediate']),\n    onToggle: _propTypes2.default.func\n  },\n\n  render: function render() {\n    var checkButtonClasses = (0, _classnames2.default)({\n      'ui-form__checkbox': true,\n      'is-checked': this.props.state === 'checked',\n      'is-intermediate': this.props.state === 'intermediate'\n    });\n\n    return _react2.default.createElement('div', { className: 'ui-form' }, _react2.default.createElement('label', { className: 'ui-form__checkbox-label', onClick: this.props.onToggle }, _react2.default.createElement('div', { className: checkButtonClasses }), this.props.children));\n  }\n});\n\nexports.default = CheckButton;\n\n/***/ }),\n/* 795 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DropdownListItem = exports.DropdownList = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _dropdown = __webpack_require__(252);\n\nvar _dropdown2 = _interopRequireDefault(_dropdown);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\n/**\n * Usage:\n *  <DropdownList defaultTitle=\"Select a pill Neo...\" onChange={() => { }}>\n *    <DropdownListItem value=\"blue\" title=\"Blue\" description=\"the story ends...\" />\n *    <DropdownListItem value=\"red\" title=\"Red\" description=\"you stay in Wonderland...\" />\n *  </DropdownList>\n */\nvar DropdownList = exports.DropdownList = (0, _createReactClass2.default)({\n  displayName: 'DropdownList',\n\n  propTypes: {\n    toggleClass: _propTypes2.default.string,\n    defaultTitle: _propTypes2.default.string,\n    defaultDescription: _propTypes2.default.string,\n    value: _propTypes2.default.any,\n    onChange: _propTypes2.default.func,\n    disabled: _propTypes2.default.bool,\n    position: _propTypes2.default.oneOf(['align-left', 'align-right', 'align-top'])\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      defaultTitle: '---'\n    };\n  },\n  render: function render() {\n    var _this = this;\n\n    var selectedItem = {\n      title: this.props.defaultTitle,\n      description: this.props.defaultDescription\n    };\n\n    var items = _react2.default.Children.map(this.props.children, function (item) {\n      var selected = item.props.value === _this.props.value;\n      if (selected) {\n        selectedItem.title = item.props.title;\n        selectedItem.description = item.props.description;\n      }\n      return _react2.default.cloneElement(item, { key: item.key, selected: selected, onClick: _this.props.onChange });\n    });\n\n    return _react2.default.createElement(_dropdown2.default, {\n      toggleClass: this.props.toggleClass,\n      title: selectedItem.title,\n      description: selectedItem.description,\n      disabled: this.props.disabled,\n      label: this.props.label,\n      position: this.props.position }, _react2.default.createElement('div', { className: 'ui-container_scroll' }, _react2.default.createElement('ul', { className: 'ui-dropdown__list' }, items)));\n  }\n});\n\nvar DropdownListItem = exports.DropdownListItem = (0, _createReactClass2.default)({\n  displayName: 'DropdownListItem',\n\n  propTypes: {\n    value: _propTypes2.default.any,\n    title: _propTypes2.default.node,\n    description: _propTypes2.default.node\n  },\n\n  _onClick: function _onClick(e) {\n    e.preventDefault();\n    if (this.props.onClick) {\n      this.props.onClick(this.props.value);\n    }\n  },\n  render: function render() {\n    return _react2.default.createElement('li', { onClick: this._onClick }, _react2.default.createElement('button', { className: this.props.selected ? 'is-selected' : '' }, this.props.description ? _react2.default.createElement('span', null, _react2.default.createElement('strong', null, this.props.title), _react2.default.createElement('small', null, this.props.description)) : this.props.title));\n  }\n});\n\n/***/ }),\n/* 796 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _overlays = __webpack_require__(182);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Alert = (0, _createReactClass2.default)({\n  displayName: 'Alert',\n\n  propTypes: {\n    title: _propTypes2.default.string.isRequired,\n    cancelable: _propTypes2.default.bool,\n    confirmText: _propTypes2.default.string,\n    confirmButtonModifiers: _propTypes2.default.object,\n    onConfirm: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      cancelable: false,\n      confirmText: 'Okay',\n      confirmButtonModifiers: { primary: true },\n      onConfirm: function onConfirm() {}\n    };\n  },\n  render: function render() {\n    var confirmButtonClasses = (0, _classnames2.default)(_lodash2.default.assign({ 'ui-button': true }, this.props.confirmButtonModifiers));\n\n    return _react2.default.createElement('div', { className: 'ui-modal__wrapper' }, _react2.default.createElement('div', { className: 'ui-modal ' + this.props.size }, _react2.default.createElement('header', { className: 'ui-modal__header' }, _react2.default.createElement('h3', null, this.props.title), _react2.default.createElement('span', { className: 'ui-modal__close', onClick: _lodash2.default.partial(this.handleConfirm, false) })), _react2.default.createElement('div', { className: 'ui-modal__content' }, this.props.children), _react2.default.createElement('footer', { className: 'ui-modal__footer' }, _react2.default.createElement('div', { className: 'ui-modal__actions' }, this.props.cancelable ? _react2.default.createElement('a', { onClick: _lodash2.default.partial(this.handleConfirm, false) }, 'Cancel') : null, _react2.default.createElement('button', { className: confirmButtonClasses, onClick: _lodash2.default.partial(this.handleConfirm, true) }, this.props.confirmText)))), _react2.default.createElement('div', { className: 'ui-modal__background' }));\n  },\n  handleConfirm: function handleConfirm(confirmed) {\n    var onConfirm = this.props.onConfirm;\n\n    if (onConfirm) {\n      onConfirm(confirmed);\n    }\n    Alert.close();\n  },\n\n  statics: {\n    open: function open(options) {\n      var modal = _react2.default.createElement(Alert, { title: options.title }, options.content);\n      _overlays2.default.show('alert', modal);\n    },\n    confirm: function confirm(title, message, cb) {\n      _overlays2.default.show('alert', _react2.default.createElement(Alert, { title: title, cancelable: true, onConfirm: cb }, message));\n    },\n    promptMultiline: function promptMultiline(title, cb) {\n      _overlays2.default.show('alert', _react2.default.createElement(MultiLinePrompt, { title: title, onConfirm: cb }));\n    },\n    danger: function danger(title, message, action, cb) {\n      var alert = _react2.default.createElement(Alert, { title: title, confirmText: action, confirmButtonModifiers: { negative: true }, cancelable: true, onConfirm: cb }, message);\n      _overlays2.default.show('alert', alert);\n    },\n    unexpectedError: function unexpectedError() {\n      _overlays2.default.show('alert', _react2.default.createElement(Alert, { title: 'Unexpected error' }, _react2.default.createElement('span', null, 'An unexpected error occurred. Please try again. If the problem persists contact us at '), _react2.default.createElement('a', { href: 'mailto:support@opengov.com' }, 'support@opengov.com')));\n    },\n    close: function close() {\n      _overlays2.default.hide('alert');\n    }\n  }\n});\n\nvar MultiLinePrompt = (0, _createReactClass2.default)({\n  displayName: 'MultiLinePrompt',\n\n  propTypes: {\n    title: _propTypes2.default.string.isRequired,\n    onConfirm: _propTypes2.default.func\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      onConfirm: function onConfirm() {}\n    };\n  },\n  setTextareaRef: function setTextareaRef(textarea) {\n    this.textarea = textarea;\n  },\n  render: function render() {\n    return _react2.default.createElement(Alert, { title: this.props.title, cancelable: true, onConfirm: this.handleConfirm }, _react2.default.createElement('fieldset', { className: 'ui-form' }, _react2.default.createElement('textarea', { ref: this.setTextareaRef })));\n  },\n  handleConfirm: function handleConfirm(success) {\n    if (success) {\n      this.props.onConfirm(this.textarea.value);\n    }\n  },\n  componentDidMount: function componentDidMount() {\n    this.textarea.focus();\n  }\n});\n\nexports.default = Alert;\n\n/***/ }),\n/* 797 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _overlays = __webpack_require__(182);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Flash = (0, _createReactClass2.default)({\n  displayName: 'Flash',\n\n  propTypes: {\n    flashIcon: _propTypes2.default.string,\n    title: _propTypes2.default.string.isRequired,\n    message: _propTypes2.default.string,\n    modifiers: _propTypes2.default.object,\n    button: _propTypes2.default.string\n  },\n\n  render: function render() {\n    var flashClasses = (0, _classnames2.default)(_lodash2.default.assign({ 'ui-flash': true }, this.props.modifiers));\n\n    return _react2.default.createElement('div', { className: flashClasses }, _react2.default.createElement('span', { className: 'ui-flash__close', onClick: this.closeFlash }), this.props.flashIcon ? _react2.default.createElement('span', { className: (0, _classnames2.default)('ui-flash__icon', this.props.flashIcon) }) : null, _react2.default.createElement('div', { className: 'ui-flash__body' }, _react2.default.createElement('h4', null, this.props.title), this.props.message ? _react2.default.createElement('p', null, this.props.message) : null, this.props.button ? _react2.default.createElement('button', { className: 'ui-button small', onClick: this.closeFlash }, this.props.button) : null));\n  },\n\n  statics: {\n    show: function show(options) {\n      _overlays2.default.show('flash', _react2.default.createElement(Flash, {\n        modifiers: options.modifiers,\n        title: options.title,\n        flashIcon: options.flashIcon,\n        message: options.message,\n        button: options.button\n      }));\n\n      if (!options.noTimeout) {\n        setTimeout(function () {\n          _overlays2.default.hide('flash');\n        }, options.timeout || 5000);\n      }\n    },\n\n    ftw: function ftw(options) {\n      Flash.show(_lodash2.default.assign({ modifiers: { ftw: true } }, options));\n    }\n  },\n\n  closeFlash: function closeFlash() {\n    _overlays2.default.hide('flash');\n  }\n});\n\nexports.default = Flash;\n\n/***/ }),\n/* 798 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _overlays = __webpack_require__(182);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Overlay = (0, _createReactClass2.default)({\n  displayName: 'Overlay',\n\n  propTypes: {\n    id: _propTypes2.default.string.isRequired\n  },\n\n  componentDidMount: function componentDidMount() {\n    _overlays2.default.show(this.props.id, this.props.children);\n  },\n  componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n    if (this.props.id !== nextProps.id) {\n      _overlays2.default.hide(this.props.id);\n    }\n    _overlays2.default.show(nextProps.id, nextProps.children);\n  },\n  componentWillUnmount: function componentWillUnmount() {\n    _overlays2.default.hide(this.props.id);\n  },\n  render: function render() {\n    return null;\n  }\n});\n\nexports.default = Overlay;\n\n/***/ }),\n/* 799 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar GlobalAlert = (0, _createReactClass2.default)({\n  displayName: 'GlobalAlert',\n\n  propTypes: {\n    message: _propTypes2.default.string.isRequired,\n    action: _propTypes2.default.string.isRequired,\n    type: _propTypes2.default.string.isRequired,\n    onAction: _propTypes2.default.func,\n    onCancel: _propTypes2.default.func\n  },\n\n  renderBackButton: function renderBackButton() {\n    return _react2.default.createElement('button', { className: 'ui-alert__back-button', onClick: this.props.onClick }, _react2.default.createElement('span', { className: 'icon-lefthead-2' }), 'Back');\n  },\n  render: function render() {\n    var alertClass = 'ui-alert ' + this.props.type;\n\n    return _react2.default.createElement('div', { className: alertClass }, this.props.onBack ? this.renderBackButton() : null, _react2.default.createElement('p', { className: 'ui-alert__message' }, _react2.default.createElement('strong', null, this.props.message), ' ', this.props.subMessage), _react2.default.createElement('div', { className: 'ui-alert__actions' }, _react2.default.createElement('a', { href: '#', onClick: this.handleCancel }, 'Cancel'), _react2.default.createElement('button', { className: 'ui-button small', onClick: this.props.onAction }, this.props.action)));\n  },\n\n  handleCancel: function handleCancel(e) {\n    e.preventDefault();\n    this.props.onCancel && this.props.onCancel();\n  }\n});\n\nexports.default = GlobalAlert;\n\n/***/ }),\n/* 800 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Loader = (0, _createReactClass2.default)({\n  displayName: 'Loader',\n\n  propTypes: {\n    message: _propTypes2.default.string\n  },\n\n  render: function render() {\n    return _react2.default.createElement('div', { className: 'ui-loader' }, _react2.default.createElement('div', { className: 'ui-loading' }), _react2.default.createElement('div', { className: 'ui-loader__message' }, _react2.default.createElement('small', null, 'Loading'), _react2.default.createElement('strong', null, this.props.message)));\n  }\n});\n\nexports.default = Loader;\n\n/***/ }),\n/* 801 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar ProgressBar = (0, _createReactClass2.default)({\n  displayName: 'ProgressBar',\n\n  propTypes: {\n    percent: _propTypes2.default.number,\n    isProcessing: _propTypes2.default.bool\n  },\n\n  render: function render() {\n    var progressClass = (0, _classnames2.default)({\n      'ui-progress': true,\n      'is-processing': this.props.isProcessing\n    });\n\n    return _react2.default.createElement('div', { className: progressClass }, _react2.default.createElement('div', { className: 'ui-progress__fill', style: { width: this.props.percent + \"%\" } }));\n  }\n});\n\nexports.default = ProgressBar;\n\n/***/ }),\n/* 802 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Table = (0, _createReactClass2.default)({\n  displayName: 'Table',\n\n  propTypes: {\n    columns: _propTypes2.default.arrayOf(_propTypes2.default.object).isRequired,\n    rows: _propTypes2.default.arrayOf(_propTypes2.default.object).isRequired,\n    rowErrors: _propTypes2.default.object,\n    sortBy: _propTypes2.default.string,\n    sortAsc: _propTypes2.default.bool,\n    onSort: _propTypes2.default.func,\n    onRowClick: _propTypes2.default.func,\n    layout: _propTypes2.default.oneOf(['scale', 'data'])\n  },\n\n  handleColumnClick: function handleColumnClick(column) {\n    if (column.sortable && this.props.onSort) {\n      this.props.onSort(column.key, this.props.sortBy == column.key && !this.props.sortAsc);\n    }\n  },\n\n  handleRowClick: function handleRowClick(row, e) {\n    if (this.props.onRowClick) {\n      this.props.onRowClick(row);\n    }\n  },\n\n  render: function render() {\n    var self = this;\n    var columns = this.props.columns;\n    var sortBy = this.props.sortBy;\n    var rowErrors = this.props.rowErrors;\n    var tableClasses = (0, _classnames2.default)({\n      'layout_scale-cells': this.props.layout === 'scale',\n      layout_data: this.props.layout === 'data',\n      'ui-table': true\n    });\n\n    var headers = columns.map(function (column) {\n      return _react2.default.createElement('th', {\n        key: 'col_' + column.key,\n        'data-columnkey': column.key,\n        className: column.sortable ? null : 'no-sort',\n        onClick: self.handleColumnClick.bind(self, column)\n      }, column.name, sortBy == column.key ? _react2.default.createElement('i', { className: self.props.sortAsc ? 'icon-uphead-1' : 'icon-downhead-1' }) : null);\n    });\n\n    var rows = this.props.rows.map(function (row, index) {\n      var rowError = _lodash2.default.result(rowErrors, row.id);\n      var rowTitle = rowError ? _lodash2.default.first(rowError.errors) : null;\n\n      var cells = columns.map(function (column) {\n        var key = 'cell_' + row.id + '_' + column.key;\n        var value = row[column.key] || '';\n\n        if (column.formatter) {\n          value = column.formatter(row, value, rowError);\n        }\n\n        return _react2.default.createElement('td', { key: key }, value);\n      });\n\n      var rowClasses = (0, _classnames2.default)({\n        'data-row': true,\n        whoops: !!rowError\n      });\n\n      return _react2.default.createElement('tr', {\n        key: row.id,\n        'data-rowid': row.id,\n        className: rowClasses,\n        onClick: this.handleRowClick.bind(this, row),\n        title: rowTitle\n      }, cells);\n    }, this);\n\n    return _react2.default.createElement('div', { className: tableClasses }, _react2.default.createElement('table', null, _react2.default.createElement('thead', null, _react2.default.createElement('tr', null, headers)), _react2.default.createElement('tbody', null, rows)));\n  }\n});\n\nexports.default = Table;\n\n/***/ }),\n/* 803 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.RadioColumn = exports.CheckboxColumn = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar CheckboxCell = (0, _createReactClass2.default)({\n  displayName: 'CheckboxCell',\n\n  render: function render() {\n    return _react2.default.createElement('span', { className: 'ui-form' }, _react2.default.createElement('input', { type: this.props.type, checked: this.props.checked, onChange: this.props.onChange }));\n  }\n});\n\nfunction CheckboxColumn(opts) {\n  this.key = opts.key;\n  this.type = 'checkbox';\n  this.name = _react2.default.createElement(CheckboxCell, { type: this.type, checked: opts.isAllChecked, onChange: this.handleCheckAll.bind(this) });\n  this.checkedRows = opts.checkedRows || [];\n  this.onCheck = opts.onCheck || _lodash2.default.noop;\n  this.onCheckAll = opts.onCheckAll;\n}\n\nCheckboxColumn.prototype.formatter = function (row, value, rowError) {\n  var isChecked = !!_lodash2.default.find(this.checkedRows, { id: row.id });\n  var handleChange = this.handleCheck.bind(this, row);\n\n  if (rowError) {\n    return _react2.default.createElement('span', { className: 'icon-exclamation-1' });\n  }\n\n  return _react2.default.createElement(CheckboxCell, { type: this.type, checked: isChecked, onChange: handleChange });\n};\n\nCheckboxColumn.prototype.handleCheck = function (row, e) {\n  this.onCheck(row, e.target.checked);\n};\n\nCheckboxColumn.prototype.handleCheckAll = function (e) {\n  this.onCheckAll(e.target.checked);\n};\n\nfunction RadioColumn(opts) {\n  this.key = opts.key;\n  this.selectedRow = opts.selectedRow;\n  this.onSelect = opts.onSelect || _lodash2.default.noop;\n}\n\nRadioColumn.prototype.formatter = function (row) {\n  var type = \"radio\";\n  var isSelected = this.selectedRow && this.selectedRow === row.id;\n  var handleChange = this.handleSelect.bind(this, row);\n  return _react2.default.createElement(CheckboxCell, { type: type, checked: isSelected, onChange: handleChange });\n};\n\nRadioColumn.prototype.handleSelect = function (row, e) {\n  if (e.target.checked) {\n    this.onSelect(row);\n  }\n};\n\nexports.CheckboxColumn = CheckboxColumn;\nexports.RadioColumn = RadioColumn;\n\n/***/ }),\n/* 804 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar CollectionSearch = (0, _createReactClass2.default)({\n  displayName: 'CollectionSearch',\n\n  propTypes: {\n    collection: _propTypes2.default.arrayOf(_propTypes2.default.object).isRequired,\n    fields: _propTypes2.default.arrayOf(_propTypes2.default.string),\n    placeholder: _propTypes2.default.string,\n    onChange: _propTypes2.default.func.isRequired\n  },\n\n  render: function render() {\n    return _react2.default.createElement('div', { className: 'ui-search' }, _react2.default.createElement('span', { className: 'icon-search-1' }), _react2.default.createElement('input', { type: 'search', placeholder: this.props.placeholder, onChange: this.handleChange }));\n  },\n  handleChange: function handleChange(e) {\n    var text = e.target.value;\n    var regex = new RegExp(text, 'i');\n    var _props = this.props,\n        collection = _props.collection,\n        fields = _props.fields,\n        onChange = _props.onChange;\n\n    var items = collection.filter(function (item) {\n      return _lodash2.default.any(fields, function (field) {\n        return regex.test(item[field]);\n      });\n    });\n    onChange(items);\n  }\n});\n\nexports.default = CollectionSearch;\n\n/***/ }),\n/* 805 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar MainPanel = (0, _createReactClass2.default)({\n  displayName: 'MainPanel',\n\n  mixins: [__webpack_require__(496)],\n\n  render: function render() {\n    return _react2.default.createElement('aside', {\n      className: (0, _classnames2.default)({\n        'ui-main__sidebar js-scroll-position': true,\n        'unhidden-on-hover': this.state.unhideOnHover\n      })\n    }, _react2.default.createElement('div', { className: 'ui-mainpanel' }, this.props.children));\n  },\n  getInitialState: function getInitialState() {\n    return {\n      isVisible: true,\n      unhideOnHover: false\n    };\n  },\n  componentWillUnmount: function componentWillUnmount() {\n    (0, _jquery2.default)('body').removeClass('mainpanel-hidden');\n  },\n  toggleVisibility: function toggleVisibility() {\n    var _this = this;\n\n    var isVisible = !this.state.isVisible;\n\n    if (isVisible) {\n      (0, _jquery2.default)('body').removeClass('mainpanel-hidden');\n      this.setTimeout(function () {\n        _this.setState({ unhideOnHover: false });\n      }, 1000);\n    } else {\n      (0, _jquery2.default)('body').addClass('mainpanel-hidden');\n      this.setTimeout(function () {\n        _this.setState({ unhideOnHover: true });\n      }, 1000);\n    }\n\n    this.setState({ isVisible: isVisible });\n\n    // Delay the resize event to allow the CSS translation to complete.\n    this.setTimeout(function () {\n      (0, _jquery2.default)(window).trigger('resize');\n    }, 250);\n  }\n});\n\nexports.default = MainPanel;\n\n/***/ }),\n/* 806 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Tab = exports.Container = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(44);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\n/**\n * <Tabs> provides a tabbed container.  It can only be passed <Tab> components as direct children.\n *\n *\n * @example\n *\n *  <Tabs.Container>\n *    <Tabs.Tab title=\"First Tab\">\n *      <div> First drawer content </div>\n *    </Tabs.Tab>\n *    <Tabs.Tab title=\"Second Tab\">\n *      <div> Second drawer content </div>\n *    </Tabs.Tab>\n *  </Tabs.Container>\n *\n *\n **/\n\nvar Container = exports.Container = (0, _createReactClass2.default)({\n  displayName: 'Container',\n\n  propTypes: {\n    selectedTabIndex: _propTypes2.default.number,\n    selectedTabHandler: _propTypes2.default.func,\n    actionButtonLabel: _propTypes2.default.string,\n    actionButtonIcon: _propTypes2.default.string,\n    actionButtonHandler: _propTypes2.default.func,\n    minimal: _propTypes2.default.bool\n  },\n\n  getInitialState: function getInitialState() {\n    return {\n      selectedTabIndex: this.props.selectedTabIndex || 0\n    };\n  },\n  componentDidMount: function componentDidMount() {\n    //Attach DOM event handlers\n    (0, _jquery2.default)(document).on('keyup', this.handleKeyUp);\n    (0, _jquery2.default)(window).on('resize', this.handleWindowResize);\n\n    this.handleWindowResize();\n  },\n  componentWillUnmount: function componentWillUnmount() {\n    //Cleanup DOM event handlers\n    (0, _jquery2.default)(document).off('keyup', this.handleKeyUp);\n    (0, _jquery2.default)(window).off('resize', this.handleWindowResize);\n  },\n  componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n    //Handle the condition when the visible tab is unmounted\n    //by switching to the first one\n    if (!nextProps.children[this.state.selectedTabIndex]) {\n      this.setState({ selectedTabIndex: this.state.selectedTabIndex });\n    }\n\n    if (nextProps.selectedTabIndex && this.state.selectedTabIndex != nextProps.selectedTabIndex) {\n      this.setState({ selectedTabIndex: nextProps.selectedTabIndex });\n    }\n  },\n  handleTab: function handleTab(i) {\n    this.setState({ selectedTabIndex: i });\n\n    // Pass selectedTabIndex back to the parent component\n    if (this.props.selectedTabHandler) {\n      this.props.selectedTabHandler(i);\n    }\n  },\n  handleWindowResize: function handleWindowResize() {\n    var width = (0, _jquery2.default)(this.tabContainer).width();\n    this.setState({ width: width });\n  },\n  render: function render() {\n    var _this = this;\n\n    var drawerHeight = (0, _jquery2.default)(window).height() - this.state.top;\n    var actionButtonClass = 'ui-button small ghost pull-right ' + this.props.actionButtonIcon;\n\n    return _react2.default.createElement('div', { className: 'ui-tabs' }, _react2.default.createElement('header', { className: 'ui-tabs__header' }, _react2.default.createElement('div', { role: 'tablist', ref: function ref(el) {\n        return _this.tabContainer = el;\n      }, className: (0, _classnames2.default)('ui-nav-tabs', { 'minimal': this.props.minimal }) }, _lodash2.default.map(this.props.children, function (t, i) {\n      return t ? _react2.default.createElement('button', {\n        role: 'tab',\n        key: i,\n        onClick: this.handleTab.bind(null, i),\n        'aria-selected': this.state.selectedTabIndex == i ? true : false,\n        className: this.state.selectedTabIndex == i ? 'ui-nav-tabs__tab is-selected' : 'ui-nav-tabs__tab'\n      }, t.props.title, _react2.default.createElement('span', { className: 'ui-badge' }, t.props.tabCount)) : null;\n    }, this), this.props.actionButtonLabel ? _react2.default.createElement('a', { onClick: this.props.actionButtonHandler, className: actionButtonClass }, this.props.actionButtonLabel) : null), _react2.default.createElement('div', { className: 'ui-nav-tabs-shadow-container' }, _react2.default.createElement('div', { className: 'ui-nav-tabs-shadow' }))), _lodash2.default.map(this.props.children, function (t, i) {\n      return t ? _react2.default.createElement('div', {\n        key: i,\n        className: t.props.tabPanelClasses,\n        style: { display: this.state.selectedTabIndex === i ? 'block' : 'none' }\n      }, _react2.default.Children.map(t.props.children, function (c) {\n        var props = { isvisible: this.state.selectedTabIndex === i ? 'true' : 'false' };\n\n        if (c.key) {\n          props.key = c.key;\n        }\n\n        return _react2.default.cloneElement(c, props);\n      }, this)) : null;\n    }, this));\n  }\n});\n\n/**\n *  Acts as a container to hold content within a tab, and to also\n *  provide the tab with a title (and optionally css classes to be applied to the container for a single tab panel.\n *  These should be the only types of component children of the  <TabbedDrawer> component\n */\n\nvar Tab = exports.Tab = (0, _createReactClass2.default)({\n  displayName: 'Tab',\n\n  propTypes: {\n    title: _propTypes2.default.string.isRequired,\n    tabPanelClasses: _propTypes2.default.string,\n    tabCount: _propTypes2.default.string\n  },\n\n  render: function render() {\n    return this.props.children;\n  }\n});\n\nexports.default = {\n  Tab: Tab,\n  Container: Container\n};\n\n/***/ }),\n/* 807 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar Avatar = (0, _createReactClass2.default)({\n  displayName: 'Avatar',\n\n  propTypes: {\n    size: _propTypes2.default.oneOf(['small', 'medium', 'large']),\n    firstName: _propTypes2.default.string,\n    lastName: _propTypes2.default.string,\n    url: _propTypes2.default.string\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      size: 'medium',\n      firstName: '',\n      lastName: '',\n      url: ''\n    };\n  },\n\n  // Renders the correct Avatar content by priority\n  //  1)Image\n  //  2)Initials\n  //  3)Anonymous\n\n  render: function render() {\n    var _props = this.props,\n        firstName = _props.firstName,\n        lastName = _props.lastName,\n        size = _props.size,\n        url = _props.url;\n\n    var avatarClassName = (0, _classnames2.default)('ui-avatar', size);\n    var userImage = url ? { backgroundImage: 'url(\"' + url + '\")' } : null;\n    var firstInitial = firstName ? firstName[0].toUpperCase() : '';\n    var lastInitial = lastName ? lastName[0].toUpperCase() : '';\n\n    if (url || firstInitial || lastInitial) {\n      return _react2.default.createElement('div', { className: avatarClassName }, _react2.default.createElement('div', { className: 'ui-avatar__image', ref: function ref() {\n          return 'avatarImage';\n        }, style: userImage }), _react2.default.createElement('span', { className: 'ui-avatar__initials' }, firstInitial + lastInitial));\n    }\n\n    return _react2.default.createElement('div', { className: avatarClassName }, _react2.default.createElement('span', { className: 'ui-avatar__anonymous-icon icon-user-1' }));\n  }\n});\n\nexports.default = Avatar;\n\n/***/ }),\n/* 808 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\n// Use `children` to pass in the share icon\n\nvar ReportCard = (0, _createReactClass2.default)({\n  displayName: 'ReportCard',\n\n  propTypes: {\n    title: _propTypes2.default.string,\n    link: _propTypes2.default.string,\n    type: _propTypes2.default.oneOf(['line', 'stacked', 'percentage', 'pie', 'bar', 'grid']),\n    description: _propTypes2.default.string,\n    descriptionLabel: _propTypes2.default.string\n  },\n\n  render: function render() {\n    var permission = this.props.permission || {};\n    var reportCardClassName = 'ui-report-card__thumbnail ' + this.props.type;\n    var permissionDescription = (0, _classnames2.default)({\n      \"This report is private\": permission.name === 'Private',\n      \"Shared with my organization\": permission.name === 'My organization',\n      \"Published to your OpenGov transparency site\": permission.name === 'Public'\n    });\n\n    return _react2.default.createElement('a', { className: 'ui-report-card', href: this.props.link }, _react2.default.createElement('div', { className: reportCardClassName }), _react2.default.createElement('div', { className: 'ui-report-card__details' }, _react2.default.createElement('div', { className: 'ui-row' }, _react2.default.createElement('div', { className: this.props.children ? \"ui-col-5of6\" : \"ui-col-6of6\" }, _react2.default.createElement('div', { className: 'ui-report-card__title' }, _react2.default.createElement('h4', null, this.props.title)), _react2.default.createElement('small', null, this.props.descriptionLabel ? this.props.descriptionLabel : null, _react2.default.createElement('strong', null, ' ', this.props.description))), this.props.children ? _react2.default.createElement('div', { className: 'ui-col-1of6' }, this.props.children) : null)));\n  }\n});\n\nexports.default = ReportCard;\n\n/***/ }),\n/* 809 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _numberToWords = __webpack_require__(810);\n\nvar _numberToWords2 = _interopRequireDefault(_numberToWords);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar FilterLink = (0, _createReactClass2.default)({\n  displayName: 'FilterLink',\n\n  PropTypes: {\n    itemKey: _propTypes2.default.string.isRequired,\n    value: _propTypes2.default.string.isRequired,\n    handleFilter: _propTypes2.default.func.isRequired\n  },\n\n  handleFilter: function handleFilter(e) {\n    e.preventDefault();\n\n    this.props.handleFilter(this.props.itemKey, this.props.value);\n  },\n  render: function render() {\n    return _react2.default.createElement('a', { href: '#', className: 'check-mock__filter', onClick: this.handleFilter }, this.props.value);\n  }\n});\n\nvar CheckMock = (0, _createReactClass2.default)({\n  displayName: 'CheckMock',\n\n  PropTypes: {\n    entity: _propTypes2.default.string,\n    issuer: _propTypes2.default.string,\n    checkDate: _propTypes2.default.string,\n    checkNumber: _propTypes2.default.string,\n    recipient: _propTypes2.default.string,\n    dollarAmount: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n    centsAmount: _propTypes2.default.number,\n    memo: _propTypes2.default.string,\n    disclaimer: _propTypes2.default.string\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      disclaimer: \"This check image represents a payment made with public funds.\"\n    };\n  },\n\n  handleFilter: function handleFilter(key, value) {\n    this.props.handleFilter({ value: value, key: key });\n  },\n\n  render: function render() {\n    var dollarsNoFormat = typeof this.props.dollarAmount === \"string\" ? parseInt(this.props.dollarAmount.replace(/,/g, \"\"), 10) : this.props.dollarAmount;\n\n    var centsNoFormat = typeof this.props.centsAmount === \"string\" ? parseInt(this.props.centsAmount, 10) : this.props.centsAmount;\n\n    return _react2.default.createElement('div', { className: 'check-mock' }, _react2.default.createElement('div', { className: 'check-mock__container' }, _react2.default.createElement('header', { className: 'check-mock__header' }, _react2.default.createElement('dl', null, _react2.default.createElement('dt', null, this.props.entity), _react2.default.createElement('dd', null, _react2.default.createElement(FilterLink, { itemKey: 'department', value: this.props.issuer, handleFilter: this.handleFilter }))), _react2.default.createElement('div', { className: 'pull-right' }, this.props.checkDate ? _react2.default.createElement('dl', null, _react2.default.createElement('dt', null, 'Check date'), _react2.default.createElement('dd', null, this.props.checkDate)) : null, this.props.checkNumber ? _react2.default.createElement('dl', null, _react2.default.createElement('dt', null, 'Check Number'), _react2.default.createElement('dd', null, _react2.default.createElement(FilterLink, { itemKey: 'check_no', value: this.props.checkNumber, handleFilter: this.handleFilter }))) : null)), _react2.default.createElement('div', { className: 'check-mock__body' }, _react2.default.createElement('div', { className: 'ui-row' }, _react2.default.createElement('dl', { className: 'ui-col-6of6' }, _react2.default.createElement('dt', null, 'Pay to the order of'), _react2.default.createElement('dd', { className: 'check-mock__underline' }, _react2.default.createElement(FilterLink, { itemKey: 'paid_to', value: this.props.recipient ? this.props.recipient : 'Unknown recipient', handleFilter: this.handleFilter })))), _react2.default.createElement('div', { className: 'ui-row' }, _react2.default.createElement('strong', { className: 'check-mock__amount-words check-mock__underline' }, this.props.dollarAmount ? _react2.default.createElement('span', null, _numberToWords2.default.toWords(dollarsNoFormat), ' dollars ') : null, this.props.centsAmount !== 0 ? _react2.default.createElement('span', null, 'and ', _numberToWords2.default.toWords(centsNoFormat), ' cents') : _react2.default.createElement('span', null, 'even')), _react2.default.createElement('strong', { className: 'check-mock__amount-numbers check-mock__box' }, this.props.dollarAmount || this.props.centsAmount ? _react2.default.createElement('span', null, '$', this.props.dollarAmount, '.', this.props.centsAmount !== 0 ? this.props.centsAmount : '00') : null))), _react2.default.createElement('footer', { className: 'check-mock__footer ui-row' }, _react2.default.createElement('dl', { className: 'ui-col-3of6' }, _react2.default.createElement('dt', null, 'Memo'), _react2.default.createElement('dd', { className: 'check-mock__underline' }, _react2.default.createElement(FilterLink, { itemKey: 'expense_type', value: this.props.memo, handleFilter: this.handleFilter }))), _react2.default.createElement('div', { className: 'check-mock__disclaimer ui-col-3of6' }, _react2.default.createElement('p', null, this.props.disclaimer)))));\n  }\n});\n\nexports.default = CheckMock;\n\n/***/ }),\n/* 810 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {!function(){\"use strict\";function e(e){return!(\"number\"!=typeof e||e!==e||e===1/0||e===-(1/0))}function t(e){return h.test(e)||s.test(e)?e+\"th\":u.test(e)?e.replace(u,\"ieth\"):a.test(e)?e.replace(a,n):e}function n(e,t){return d[t]}function o(t){var n=parseInt(t,10);if(!e(n))throw new TypeError(\"Not a finite number: \"+t+\" (\"+typeof t+\")\");var o=String(n),r=n%100,i=r>=11&&13>=r,f=o.charAt(o.length-1);return o+(i?\"th\":\"1\"===f?\"st\":\"2\"===f?\"nd\":\"3\"===f?\"rd\":\"th\")}function r(n,o){var r,f=parseInt(n,10);if(!e(f))throw new TypeError(\"Not a finite number: \"+n+\" (\"+typeof n+\")\");return r=i(f),o?t(r):r}function i(e){var t,n,o=arguments[1];return 0===e?o?o.join(\" \").replace(/,$/,\"\"):\"zero\":(o||(o=[]),0>e&&(o.push(\"minus\"),e=Math.abs(e)),20>e?(t=0,n=x[e]):p>e?(t=e%v,n=M[Math.floor(e/v)],t&&(n+=\"-\"+x[t],t=0)):y>e?(t=e%p,n=i(Math.floor(e/p))+\" hundred\"):c>e?(t=e%y,n=i(Math.floor(e/y))+\" thousand,\"):b>e?(t=e%c,n=i(Math.floor(e/c))+\" million,\"):g>e?(t=e%b,n=i(Math.floor(e/b))+\" billion,\"):m>e?(t=e%g,n=i(Math.floor(e/g))+\" trillion,\"):w>=e&&(t=e%m,n=i(Math.floor(e/m))+\" quadrillion,\"),o.push(n),i(t,o))}function f(e){var n=r(e);return t(n)}var l=\"object\"==typeof self&&self.self===self&&self||\"object\"==typeof global&&global.global===global&&global||this,h=/(hundred|thousand|(m|b|tr|quadr)illion)$/,s=/teen$/,u=/y$/,a=/(zero|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)$/,d={zero:\"zeroth\",one:\"first\",two:\"second\",three:\"third\",four:\"fourth\",five:\"fifth\",six:\"sixth\",seven:\"seventh\",eight:\"eighth\",nine:\"ninth\",ten:\"tenth\",eleven:\"eleventh\",twelve:\"twelfth\"},v=10,p=100,y=1e3,c=1e6,b=1e9,g=1e12,m=1e15,w=9007199254740992,x=[\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"ten\",\"eleven\",\"twelve\",\"thirteen\",\"fourteen\",\"fifteen\",\"sixteen\",\"seventeen\",\"eighteen\",\"nineteen\"],M=[\"zero\",\"ten\",\"twenty\",\"thirty\",\"forty\",\"fifty\",\"sixty\",\"seventy\",\"eighty\",\"ninety\"],z={toOrdinal:o,toWords:r,toWordsOrdinal:f}; true?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=z),exports.numberToWords=z):l.numberToWords=z}();\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 811 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\nvar OpenGovLogo = (0, _createReactClass2.default)({\n  displayName: 'OpenGovLogo',\n\n  propTypes: {\n    width: _propTypes2.default.number,\n    height: _propTypes2.default.number,\n    color: _propTypes2.default.string\n  },\n\n  getDefaultProps: function getDefaultProps() {\n    return {\n      width: 100,\n      height: 100,\n      color: '#3192c7'\n    };\n  },\n  render: function render() {\n    var logoHeight = this.props.height ? this.props.height + 'px' : null;\n    var logoWidth = this.props.width ? this.props.width + 'px' : null;\n\n    return _react2.default.createElement('svg', {\n      version: '1.1',\n      viewBox: '0 0 456 100',\n      className: 'ui-opengov-logo',\n      height: logoHeight,\n      width: logoWidth,\n      fill: this.props.color\n    }, this.renderGraphic(this.props.color));\n  },\n  renderGraphic: function renderGraphic() {\n    return _react2.default.createElement('g', null, _react2.default.createElement('path', { d: 'M50,0C22.4,0,0,22.4,0,50c0,27.6,22.4,50,50,50c27.6,0,50-22.4,50-50C100,22.4,77.6,0,50,0z M50,88.1C29,88.1,11.9,71,11.9,50S29,11.9,50,11.9C71,11.9,88.1,29,88.1,50S71,88.1,50,88.1z' }), _react2.default.createElement('path', { d: 'M71.7,37.1c-0.3-0.6-0.9-0.9-1.6-0.9H29.9c-0.8,0-1.5,0.5-1.7,1.3c-0.2,0.8,0.1,1.6,0.8,2l19.3,11.8v21.5c0,0.8,0.6,1.5,1.3,1.7c0.2,0,0.3,0.1,0.5,0.1c0.6,0,1.2-0.3,1.6-0.9l20.1-34.9C72,38.3,72,37.6,71.7,37.1z' }), _react2.default.createElement('path', { d: 'M163,64c0,4.9-1.8,9.1-5.3,12.5c-3.6,3.4-7.8,5.2-12.8,5.2h-2.5c-5,0-9.3-1.8-12.9-5.2c-3.6-3.4-5.3-7.7-5.3-12.5V33.7c0-4.9,1.8-9,5.3-12.4c3.6-3.4,7.9-5.1,12.9-5.1h2.5c5,0,9.2,1.7,12.8,5.1c3.6,3.4,5.3,7.6,5.3,12.4V64z M149.4,35.7c0-4.1-2.7-7.2-5.7-7.2c-3,0-5.8,3.1-5.8,7.2v26.8c0,4.1,2.9,7,5.8,7c3.1,0,5.7-2.9,5.7-7V35.7z' }), _react2.default.createElement('path', { d: 'M212,38.1c0,4.9-1.8,9-5.3,12.4c-3.4,3.4-7.7,5.1-12.8,5.1h-5.6c-0.7,0-1,0.3-1,1v21c0,1.7-1.5,3.1-3.3,3.1h-6.9c-1.8,0-3.1-1.4-3.1-3.1V20.1c0-2,1-3,3.1-3H194c5,0,9.3,1.8,12.8,5.2c3.5,3.4,5.3,7.6,5.3,12.4V38.1z M198.5,33.9c0-2.8-2.5-5-5.4-5h-4.4c-0.8,0-1.2,0.3-1.2,0.9v13.5c0,0.6,0.4,1,1.2,1h4.4c3,0,5.4-2.3,5.4-5.1V33.9z' }), _react2.default.createElement('path', { d: 'M256.1,77.6c0,1.7-1.6,3.3-3.4,3.3h-26.9c-1.8,0-3.4-1.6-3.4-3.3V20.3c0-1.8,1.4-3.3,3.4-3.3h26.1c1.8,0,3.4,1.4,3.4,3.3v5.4c0,1.7-1.6,3.3-3.4,3.3h-15.1c-0.8,0-1.2,0.3-1.2,1v10.5c0,0.6,0.4,1,1.2,1h11.4c1.8,0,3.4,1.4,3.4,3.3v5.3c0,1.7-1.6,3.3-3.4,3.3h-11.4c-0.8,0-1.2,0.4-1.2,1.1v13c0,0.7,0.4,1.1,1.2,1.1h15.9c1.8,0,3.4,1.6,3.4,3.3V77.6z' }), _react2.default.createElement('path', { d: 'M306.7,77.7c0,1.7-1.4,3.1-3.3,3.1h-6.2c-1.4,0-2.6-0.9-3.3-2.6l-14.3-30.8v30.3c0,1.7-1.5,3.1-3.3,3.1h-6.5c-1.8,0-3.1-1.4-3.1-3.1V20.3c0-1.8,1.3-3.2,3.1-3.2h6.5c1.7,0,2.9,1,3.7,2.8l13.8,29.7V20.3c0-1.8,1.6-3.3,3.4-3.3h6.2c1.8,0,3.3,1.4,3.3,3.3V77.7z' }), _react2.default.createElement('path', { d: 'M356.4,77.6c0,1.7-1.4,3.3-3.3,3.3h-1.2c-1.5,0-2.8-1.3-3.7-3.8c0,0.1,0,0.2-0.1,0.2c-2.3,2.9-5.7,4.5-10,4.5h-1.4c-5.7,0-10.2-1.8-13.7-5.4c-3.4-3.6-5.2-8-5.2-13.2V34.5c0-5,1.8-9.3,5.5-12.9c3.7-3.6,8.2-5.4,13.4-5.4h0.7c5.2,0,9.6,1.8,13.2,5.4c3.7,3.6,5.5,7.9,5.5,12.9v2.6c0,1.8-1.5,3.3-3.3,3.3h-6.1c-1.8,0-3.4-1.8-3.4-3.3v-0.9c0-4.2-2.9-7.6-6-7.6c-3.2,0-6,3.4-6,7.6v25.7c0,4.5,2.2,7.4,6,7.4c4,0,6-2.5,6-7.4v-2.6c0-0.7-0.4-1-1.1-1h-3.3c-1.7,0-3.4-1.5-3.4-3.4v-4.1c0-1.7,1.5-3.3,3.4-3.3h14.3c1.9,0,3.3,1.8,3.3,3.3V77.6z' }), _react2.default.createElement('path', { d: 'M406.3,64c0,4.9-1.8,9.1-5.3,12.5c-3.6,3.4-7.8,5.2-12.8,5.2h-2.5c-5,0-9.3-1.8-12.9-5.2c-3.6-3.4-5.3-7.7-5.3-12.5V33.7c0-4.9,1.8-9,5.3-12.4c3.6-3.4,7.9-5.1,12.9-5.1h2.5c5,0,9.2,1.7,12.8,5.1c3.6,3.4,5.3,7.6,5.3,12.4V64z M392.6,35.7c0-4.1-2.7-7.2-5.7-7.2c-2.9,0-5.8,3.1-5.8,7.2v26.8c0,4.1,2.9,7,5.8,7c3.1,0,5.7-2.9,5.7-7V35.7z' }), _react2.default.createElement('path', { d: 'M443.6,77.9c-0.4,2-1.5,3-3.3,3h-9.5c-1.7,0-2.8-1-3.2-3l-12.4-57.1c-0.1-0.2-0.1-0.6-0.1-0.8c0-2,1-3,2.8-3h6.6c1.8,0,2.9,0.9,3.3,2.6l7.8,38.2l7.7-38.2c0.4-1.7,1.5-2.6,3.3-2.6h6.6c1.8,0,2.7,0.9,2.7,2.6c0,0.3-0.1,0.7-0.2,1.1L443.6,77.9z' }));\n  }\n});\n\nexports.default = OpenGovLogo;\n\n/***/ }),\n/* 812 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactTransitionGroup = __webpack_require__(139);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : { default: obj };\n}\n\n// Onboarding tooltips example\n// var waypoints = [\n//   {title: 'Title', description: 'Description', node: '#foo'},\n//   {title: 'Title', description: 'Description', node: '.bar:first-child .bat'},\n//   {title: 'Title', description: 'Description', left: 10, top: 10},\n//   {title: 'Title', description: 'Description', right: 30, top: 0, position: 'bottom', align: 'right'}\n// ];\n\nvar Waypoint = (0, _createReactClass2.default)({\n  displayName: 'Waypoint',\n\n  propTypes: {\n    title: _propTypes2.default.string,\n    description: _propTypes2.default.string,\n    node: _propTypes2.default.string,\n    xPos: _propTypes2.default.number,\n    yPos: _propTypes2.default.number,\n    position: _propTypes2.default.oneOf(['bottom']),\n    align: _propTypes2.default.oneOf(['right'])\n  },\n\n  componentWillMount: function componentWillMount() {\n    (0, _jquery2.default)('body').css('overflow', 'hidden');\n  },\n\n  componentWillUnmount: function componentWillUnmount() {\n    (0, _jquery2.default)('body').css('overflow', 'auto');\n  },\n\n  render: function render() {\n    var waypointClassName = (0, _classnames2.default)({\n      'ui-onboarding__waypoint': true,\n      'is-selected': this.props.selected,\n      position_bottom: this.props.data.position === 'bottom',\n      align_right: this.props.data.align === 'right'\n    });\n\n    var target = (0, _jquery2.default)(this.props.data.node);\n    var targetPosition = target.offset();\n    var targetTop = targetPosition ? targetPosition.top + target.height() / 2 : this.props.data.top;\n    var targetLeft = targetPosition ? targetPosition.left + target.width() / 2 : this.props.data.left;\n    var waypointStyles = {\n      top: targetTop,\n      left: targetLeft,\n      right: this.props.data.right\n    };\n\n    var buttonLabel = this.props.isLast ? 'Got it!' : 'Next Tip';\n\n    return _react2.default.createElement('div', { className: waypointClassName, style: waypointStyles }, _react2.default.createElement('div', { className: 'ui-onboarding__bubble', onClick: this.props.bubbleClick }), _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, { transitionName: 'onboarding-waypoint' }, this.props.selected ? _react2.default.createElement('div', { className: 'ui-onboarding__tooltip' }, _react2.default.createElement('h4', { ref: 'title' }, this.props.data.title), _react2.default.createElement('p', null, this.props.data.description), _react2.default.createElement('footer', { className: 'ui-onboarding__footer' }, !this.props.isLast ? _react2.default.createElement('a', { className: 'ui-onboarding__skip', onClick: this.props.cancelClick }, 'Skip these tips') : null, _react2.default.createElement('a', { className: 'ui-onboarding__next ui-button small', onClick: this.props.nextClick }, buttonLabel))) : null));\n  }\n});\n\nvar Onboarding = (0, _createReactClass2.default)({\n  displayName: 'Onboarding',\n\n  propTypes: {\n    waypoints: _propTypes2.default.array,\n    onCancel: _propTypes2.default.func,\n    currentWaypoint: _propTypes2.default.number.isRequired,\n    setCurrentWaypoint: _propTypes2.default.func.isRequired\n  },\n\n  bubbleClick: function bubbleClick(i) {\n    this.props.setCurrentWaypoint(i);\n  },\n\n  nextClick: function nextClick() {\n    this.props.setCurrentWaypoint(this.props.currentWaypoint + 1);\n  },\n\n  cancelClick: function cancelClick() {\n    this.props.onCancel();\n  },\n\n  render: function render() {\n    return _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, { transitionName: 'onboarding' }, this.props.currentWaypoint < this.props.waypoints.length ? _react2.default.createElement('div', { className: 'ui-onboarding__container' }, this.props.waypoints.map(function (waypoint, i) {\n      var selected = i === this.props.currentWaypoint ? true : false;\n      var isLast = this.props.currentWaypoint === this.props.waypoints.length - 1 ? true : false;\n      return _react2.default.createElement(Waypoint, {\n        key: i,\n        ref: 'waypoint_' + i,\n        selected: selected,\n        data: waypoint,\n        bubbleClick: this.bubbleClick.bind(null, i),\n        nextClick: this.nextClick,\n        cancelClick: this.cancelClick,\n        isLast: isLast\n      });\n    }.bind(this))) : null);\n  }\n});\n\nexports.default = Onboarding;\n\n/***/ }),\n/* 813 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _TransitionGroup = __webpack_require__(497);\n\nvar _TransitionGroup2 = _interopRequireDefault(_TransitionGroup);\n\nvar _CSSTransitionGroupChild = __webpack_require__(817);\n\nvar _CSSTransitionGroupChild2 = _interopRequireDefault(_CSSTransitionGroupChild);\n\nvar _PropTypes = __webpack_require__(499);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar propTypes = {\n  transitionName: _PropTypes.nameShape.isRequired,\n\n  transitionAppear: _propTypes2.default.bool,\n  transitionEnter: _propTypes2.default.bool,\n  transitionLeave: _propTypes2.default.bool,\n  transitionAppearTimeout: (0, _PropTypes.transitionTimeout)('Appear'),\n  transitionEnterTimeout: (0, _PropTypes.transitionTimeout)('Enter'),\n  transitionLeaveTimeout: (0, _PropTypes.transitionTimeout)('Leave')\n};\n\nvar defaultProps = {\n  transitionAppear: false,\n  transitionEnter: true,\n  transitionLeave: true\n};\n\nvar CSSTransitionGroup = function (_React$Component) {\n  _inherits(CSSTransitionGroup, _React$Component);\n\n  function CSSTransitionGroup() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, CSSTransitionGroup);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this._wrapChild = function (child) {\n      return _react2.default.createElement(_CSSTransitionGroupChild2.default, {\n        name: _this.props.transitionName,\n        appear: _this.props.transitionAppear,\n        enter: _this.props.transitionEnter,\n        leave: _this.props.transitionLeave,\n        appearTimeout: _this.props.transitionAppearTimeout,\n        enterTimeout: _this.props.transitionEnterTimeout,\n        leaveTimeout: _this.props.transitionLeaveTimeout\n      }, child);\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  // We need to provide this childFactory so that\n  // ReactCSSTransitionGroupChild can receive updates to name, enter, and\n  // leave while it is leaving.\n\n\n  CSSTransitionGroup.prototype.render = function render() {\n    return _react2.default.createElement(_TransitionGroup2.default, _extends({}, this.props, { childFactory: this._wrapChild }));\n  };\n\n  return CSSTransitionGroup;\n}(_react2.default.Component);\n\nCSSTransitionGroup.displayName = 'CSSTransitionGroup';\n\n\nCSSTransitionGroup.propTypes =  false ? propTypes : {};\nCSSTransitionGroup.defaultProps = defaultProps;\n\nexports.default = CSSTransitionGroup;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 814 */\n/***/ (function(module, exports) {\n\n\nmodule.exports = function chain(){\n  var len = arguments.length\n  var args = [];\n\n  for (var i = 0; i < len; i++)\n    args[i] = arguments[i]\n\n  args = args.filter(function(fn){ return fn != null })\n\n  if (args.length === 0) return undefined\n  if (args.length === 1) return args[0]\n\n  return args.reduce(function(current, next){\n    return function chainedFunction() {\n      current.apply(this, arguments);\n      next.apply(this, arguments);\n    };\n  })\n}\n\n\n/***/ }),\n/* 815 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (false) {\n  warning = function(condition, format, args) {\n    var len = arguments.length;\n    args = new Array(len > 2 ? len - 2 : 0);\n    for (var key = 2; key < len; key++) {\n      args[key - 2] = arguments[key];\n    }\n    if (format === undefined) {\n      throw new Error(\n        '`warning(condition, format, ...args)` requires a warning ' +\n        'message argument'\n      );\n    }\n\n    if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n      throw new Error(\n        'The warning format should be able to uniquely identify this ' +\n        'warning. Please, use a more descriptive format than: ' + format\n      );\n    }\n\n    if (!condition) {\n      var argIndex = 0;\n      var message = 'Warning: ' +\n        format.replace(/%s/g, function() {\n          return args[argIndex++];\n        });\n      if (typeof console !== 'undefined') {\n        console.error(message);\n      }\n      try {\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch(x) {}\n    }\n  };\n}\n\nmodule.exports = warning;\n\n\n/***/ }),\n/* 816 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\n\nvar _react = __webpack_require__(0);\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children) {\n  if (!children) {\n    return children;\n  }\n  var result = {};\n  _react.Children.map(children, function (child) {\n    return child;\n  }).forEach(function (child) {\n    result[child.key] = child;\n  });\n  return result;\n}\n\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\nfunction mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    if (next.hasOwnProperty(key)) {\n      return next[key];\n    }\n\n    return prev[key];\n  }\n\n  // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n  var nextKeysPending = {};\n\n  var pendingKeys = [];\n  for (var prevKey in prev) {\n    if (next.hasOwnProperty(prevKey)) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i = void 0;\n  var childMapping = {};\n  for (var nextKey in next) {\n    if (nextKeysPending.hasOwnProperty(nextKey)) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n    childMapping[nextKey] = getValueForKey(nextKey);\n  }\n\n  // Finally, add the keys which didn't appear before any key in `next`\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\n/***/ }),\n/* 817 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _addClass = __webpack_require__(818);\n\nvar _addClass2 = _interopRequireDefault(_addClass);\n\nvar _removeClass = __webpack_require__(820);\n\nvar _removeClass2 = _interopRequireDefault(_removeClass);\n\nvar _requestAnimationFrame = __webpack_require__(821);\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _properties = __webpack_require__(822);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _PropTypes = __webpack_require__(499);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar events = [];\nif (_properties.transitionEnd) events.push(_properties.transitionEnd);\nif (_properties.animationEnd) events.push(_properties.animationEnd);\n\nfunction addEndListener(node, listener) {\n  if (events.length) {\n    events.forEach(function (e) {\n      return node.addEventListener(e, listener, false);\n    });\n  } else {\n    setTimeout(listener, 0);\n  }\n\n  return function () {\n    if (!events.length) return;\n    events.forEach(function (e) {\n      return node.removeEventListener(e, listener, false);\n    });\n  };\n}\n\nvar propTypes = {\n  children: _propTypes2.default.node,\n  name: _PropTypes.nameShape.isRequired,\n\n  // Once we require timeouts to be specified, we can remove the\n  // boolean flags (appear etc.) and just accept a number\n  // or a bool for the timeout flags (appearTimeout etc.)\n  appear: _propTypes2.default.bool,\n  enter: _propTypes2.default.bool,\n  leave: _propTypes2.default.bool,\n  appearTimeout: _propTypes2.default.number,\n  enterTimeout: _propTypes2.default.number,\n  leaveTimeout: _propTypes2.default.number\n};\n\nvar CSSTransitionGroupChild = function (_React$Component) {\n  _inherits(CSSTransitionGroupChild, _React$Component);\n\n  function CSSTransitionGroupChild() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, CSSTransitionGroupChild);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.componentWillAppear = function (done) {\n      if (_this.props.appear) {\n        _this.transition('appear', done, _this.props.appearTimeout);\n      } else {\n        done();\n      }\n    }, _this.componentWillEnter = function (done) {\n      if (_this.props.enter) {\n        _this.transition('enter', done, _this.props.enterTimeout);\n      } else {\n        done();\n      }\n    }, _this.componentWillLeave = function (done) {\n      if (_this.props.leave) {\n        _this.transition('leave', done, _this.props.leaveTimeout);\n      } else {\n        done();\n      }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  CSSTransitionGroupChild.prototype.componentWillMount = function componentWillMount() {\n    this.classNameAndNodeQueue = [];\n    this.transitionTimeouts = [];\n  };\n\n  CSSTransitionGroupChild.prototype.componentWillUnmount = function componentWillUnmount() {\n    this.unmounted = true;\n\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n    this.transitionTimeouts.forEach(function (timeout) {\n      clearTimeout(timeout);\n    });\n\n    this.classNameAndNodeQueue.length = 0;\n  };\n\n  CSSTransitionGroupChild.prototype.transition = function transition(animationType, finishCallback, timeout) {\n    var node = (0, _reactDom.findDOMNode)(this);\n\n    if (!node) {\n      if (finishCallback) {\n        finishCallback();\n      }\n      return;\n    }\n\n    var className = this.props.name[animationType] || this.props.name + '-' + animationType;\n    var activeClassName = this.props.name[animationType + 'Active'] || className + '-active';\n    var timer = null;\n    var removeListeners = void 0;\n\n    (0, _addClass2.default)(node, className);\n\n    // Need to do this to actually trigger a transition.\n    this.queueClassAndNode(activeClassName, node);\n\n    // Clean-up the animation after the specified delay\n    var finish = function finish(e) {\n      if (e && e.target !== node) {\n        return;\n      }\n\n      clearTimeout(timer);\n      if (removeListeners) removeListeners();\n\n      (0, _removeClass2.default)(node, className);\n      (0, _removeClass2.default)(node, activeClassName);\n\n      if (removeListeners) removeListeners();\n\n      // Usually this optional callback is used for informing an owner of\n      // a leave animation and telling it to remove the child.\n      if (finishCallback) {\n        finishCallback();\n      }\n    };\n\n    if (timeout) {\n      timer = setTimeout(finish, timeout);\n      this.transitionTimeouts.push(timer);\n    } else if (_properties.transitionEnd) {\n      removeListeners = addEndListener(node, finish);\n    }\n  };\n\n  CSSTransitionGroupChild.prototype.queueClassAndNode = function queueClassAndNode(className, node) {\n    var _this2 = this;\n\n    this.classNameAndNodeQueue.push({\n      className: className,\n      node: node\n    });\n\n    if (!this.rafHandle) {\n      this.rafHandle = (0, _requestAnimationFrame2.default)(function () {\n        return _this2.flushClassNameAndNodeQueue();\n      });\n    }\n  };\n\n  CSSTransitionGroupChild.prototype.flushClassNameAndNodeQueue = function flushClassNameAndNodeQueue() {\n    if (!this.unmounted) {\n      this.classNameAndNodeQueue.forEach(function (obj) {\n        // This is for to force a repaint,\n        // which is necessary in order to transition styles when adding a class name.\n        /* eslint-disable no-unused-expressions */\n        obj.node.scrollTop;\n        /* eslint-enable no-unused-expressions */\n        (0, _addClass2.default)(obj.node, obj.className);\n      });\n    }\n    this.classNameAndNodeQueue.length = 0;\n    this.rafHandle = null;\n  };\n\n  CSSTransitionGroupChild.prototype.render = function render() {\n    var props = _extends({}, this.props);\n    delete props.name;\n    delete props.appear;\n    delete props.enter;\n    delete props.leave;\n    delete props.appearTimeout;\n    delete props.enterTimeout;\n    delete props.leaveTimeout;\n    delete props.children;\n    return _react2.default.cloneElement(_react2.default.Children.only(this.props.children), props);\n  };\n\n  return CSSTransitionGroupChild;\n}(_react2.default.Component);\n\nCSSTransitionGroupChild.displayName = 'CSSTransitionGroupChild';\n\n\nCSSTransitionGroupChild.propTypes =  false ? propTypes : {};\n\nexports.default = CSSTransitionGroupChild;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 818 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _interopRequireDefault = __webpack_require__(253);\n\nexports.__esModule = true;\nexports.default = addClass;\n\nvar _hasClass = _interopRequireDefault(__webpack_require__(819));\n\nfunction addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!(0, _hasClass.default)(element, className)) if (typeof element.className === 'string') element.className = element.className + ' ' + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + ' ' + className);\n}\n\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 819 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = hasClass;\n\nfunction hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);else return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 820 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp('(^|\\\\s)' + classToRemove + '(?:\\\\s|$)', 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nmodule.exports = function removeClass(element, className) {\n  if (element.classList) element.classList.remove(className);else if (typeof element.className === 'string') element.className = replaceClassName(element.className, className);else element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n};\n\n/***/ }),\n/* 821 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _interopRequireDefault = __webpack_require__(253);\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _inDOM = _interopRequireDefault(__webpack_require__(498));\n\nvar vendors = ['', 'webkit', 'moz', 'o', 'ms'];\nvar cancel = 'clearTimeout';\nvar raf = fallback;\nvar compatRaf;\n\nvar getKey = function getKey(vendor, k) {\n  return vendor + (!vendor ? k : k[0].toUpperCase() + k.substr(1)) + 'AnimationFrame';\n};\n\nif (_inDOM.default) {\n  vendors.some(function (vendor) {\n    var rafKey = getKey(vendor, 'request');\n\n    if (rafKey in window) {\n      cancel = getKey(vendor, 'cancel');\n      return raf = function raf(cb) {\n        return window[rafKey](cb);\n      };\n    }\n  });\n}\n/* https://github.com/component/raf */\n\n\nvar prev = new Date().getTime();\n\nfunction fallback(fn) {\n  var curr = new Date().getTime(),\n      ms = Math.max(0, 16 - (curr - prev)),\n      req = setTimeout(fn, ms);\n  prev = curr;\n  return req;\n}\n\ncompatRaf = function compatRaf(cb) {\n  return raf(cb);\n};\n\ncompatRaf.cancel = function (id) {\n  window[cancel] && typeof window[cancel] === 'function' && window[cancel](id);\n};\n\nvar _default = compatRaf;\nexports.default = _default;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 822 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _interopRequireDefault = __webpack_require__(253);\n\nexports.__esModule = true;\nexports.default = exports.animationEnd = exports.animationDelay = exports.animationTiming = exports.animationDuration = exports.animationName = exports.transitionEnd = exports.transitionDuration = exports.transitionDelay = exports.transitionTiming = exports.transitionProperty = exports.transform = void 0;\n\nvar _inDOM = _interopRequireDefault(__webpack_require__(498));\n\nvar transform = 'transform';\nexports.transform = transform;\nvar prefix, transitionEnd, animationEnd;\nexports.animationEnd = animationEnd;\nexports.transitionEnd = transitionEnd;\nvar transitionProperty, transitionDuration, transitionTiming, transitionDelay;\nexports.transitionDelay = transitionDelay;\nexports.transitionTiming = transitionTiming;\nexports.transitionDuration = transitionDuration;\nexports.transitionProperty = transitionProperty;\nvar animationName, animationDuration, animationTiming, animationDelay;\nexports.animationDelay = animationDelay;\nexports.animationTiming = animationTiming;\nexports.animationDuration = animationDuration;\nexports.animationName = animationName;\n\nif (_inDOM.default) {\n  var _getTransitionPropert = getTransitionProperties();\n\n  prefix = _getTransitionPropert.prefix;\n  exports.transitionEnd = transitionEnd = _getTransitionPropert.transitionEnd;\n  exports.animationEnd = animationEnd = _getTransitionPropert.animationEnd;\n  exports.transform = transform = prefix + \"-\" + transform;\n  exports.transitionProperty = transitionProperty = prefix + \"-transition-property\";\n  exports.transitionDuration = transitionDuration = prefix + \"-transition-duration\";\n  exports.transitionDelay = transitionDelay = prefix + \"-transition-delay\";\n  exports.transitionTiming = transitionTiming = prefix + \"-transition-timing-function\";\n  exports.animationName = animationName = prefix + \"-animation-name\";\n  exports.animationDuration = animationDuration = prefix + \"-animation-duration\";\n  exports.animationTiming = animationTiming = prefix + \"-animation-delay\";\n  exports.animationDelay = animationDelay = prefix + \"-animation-timing-function\";\n}\n\nvar _default = {\n  transform: transform,\n  end: transitionEnd,\n  property: transitionProperty,\n  timing: transitionTiming,\n  delay: transitionDelay,\n  duration: transitionDuration\n};\nexports.default = _default;\n\nfunction getTransitionProperties() {\n  var style = document.createElement('div').style;\n  var vendorMap = {\n    O: function O(e) {\n      return \"o\" + e.toLowerCase();\n    },\n    Moz: function Moz(e) {\n      return e.toLowerCase();\n    },\n    Webkit: function Webkit(e) {\n      return \"webkit\" + e;\n    },\n    ms: function ms(e) {\n      return \"MS\" + e;\n    }\n  };\n  var vendors = Object.keys(vendorMap);\n  var transitionEnd, animationEnd;\n  var prefix = '';\n\n  for (var i = 0; i < vendors.length; i++) {\n    var vendor = vendors[i];\n\n    if (vendor + \"TransitionProperty\" in style) {\n      prefix = \"-\" + vendor.toLowerCase();\n      transitionEnd = vendorMap[vendor]('TransitionEnd');\n      animationEnd = vendorMap[vendor]('AnimationEnd');\n      break;\n    }\n  }\n\n  if (!transitionEnd && 'transitionProperty' in style) transitionEnd = 'transitionend';\n  if (!animationEnd && 'animationName' in style) animationEnd = 'animationend';\n  style = null;\n  return {\n    animationEnd: animationEnd,\n    transitionEnd: transitionEnd,\n    prefix: prefix\n  };\n}\n\n/***/ }),\n/* 823 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _reactRouter = __webpack_require__(178);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _control_panel_store = __webpack_require__(243);\n\nvar _control_panel_store2 = _interopRequireDefault(_control_panel_store);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _reports = __webpack_require__(140);\n\nvar _reports2 = _interopRequireDefault(_reports);\n\nvar _entity = __webpack_require__(501);\n\nvar _entity2 = _interopRequireDefault(_entity);\n\nvar _tracking = __webpack_require__(255);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportApp = (0, _createReactClass2.default)({\n    displayName: 'ReportApp',\n\n    mixins: [(0, _og_flux.StoreListener)(_control_panel_store2.default, _session_store2.default), _reactRouter.Navigation, _reactRouter.State],\n    getInitialState: function getInitialState() {\n        return _extends({\n            settingsPanelOpen: false,\n            reports: new _reports2.default()\n        }, this.getStateFromStore());\n    },\n    getStateFromStore: function getStateFromStore() {\n        var entity = _control_panel_store2.default.getSelectedEntity();\n        if (gon.session && entity) {\n            (0, _tracking.initializeTracking)(gon.session, entity);\n        }\n        return {\n            entity: entity && new _entity2.default(entity),\n            session: _session_store2.default.getSession(),\n            loading: _control_panel_store2.default.isLoading()\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        var nextState = this.getStateFromStore();\n        var currentEntity = this.state.entity;\n        var nextEntity = nextState.entity;\n        var shouldLoadReports = !gon.isNetwork && nextEntity && (!currentEntity || currentEntity.id !== nextEntity.id) && !this.isActive('report-index'); // if we are loading the reports index, that component will load the reports\n        if (shouldLoadReports) {\n            this.loadReports(nextEntity);\n        }\n        this.setState(nextState);\n    },\n    handleMakeDefaultReport: function handleMakeDefaultReport(reportId) {\n        var self = this;\n        reportId = reportId || this.state.report.id;\n        var report = this.state.reports.get(reportId);\n        Ovid.Alert.confirm('Change the default report', _lodash2.default.template('Make \"${name}\" the default report?', { name: report.get('name') }), function (confirmed) {\n            if (confirmed) {\n                self.makeDefaultReport(reportId);\n            }\n        });\n    },\n    handleOpenSettingsPanel: function handleOpenSettingsPanel() {\n        this.setState({ settingsPanelOpen: true });\n    },\n    handleCloseSettingsPanel: function handleCloseSettingsPanel() {\n        this.setState({ settingsPanelOpen: false });\n    },\n    makeDefaultReport: function makeDefaultReport(reportId) {\n        this.state.entity.save({ default_report_id: reportId }, {\n            success: function success() {\n                Ovid.Flash.ftw({\n                    title: 'Success!',\n                    message: 'This report is now the default report'\n                });\n            },\n            error: function error(model, resp) {\n                var json = resp.responseJSON;\n                var msg = json.message || 'There was an error updating the default report.';\n                Ovid.Alert.open({\n                    title: 'Error Updating Default Report',\n                    content: _react2.default.createElement(\"p\", null, msg)\n                });\n                // Revert the default report ID change if the request fails.\n                model.set('default_report_id', model.previous('default_report_id'));\n            }\n        });\n    },\n    loadReports: function loadReports(entity) {\n        this.state.reports.fetch({\n            data: { entity_id: entity.get('entity_id'), embed: 'associated_reports' },\n            success: this.handleReportsLoaded\n        });\n    },\n    loadLegacyReport: function loadLegacyReport() {\n        // Attempt to find a report with a type that matches the legeacy report ID.\n        var report = this.state.reports.findWhere({ report_type: this.props.report.id });\n        if (report) {\n            this.loadReport(report);\n            this.setReportRoute(report);\n        } else {\n            // If no report is found with that type fallback to loading the default.\n            this.loadDefaultReport();\n        }\n    },\n    handleReportsLoaded: function handleReportsLoaded(reports) {\n        if (!this._isMounted) {\n            return;\n        }\n        this.setState({ reports: reports });\n        if (this.props.report) {\n            // Handle loading reports with legeacy IDs (ex: annual, balance, ytd).\n            if (this.props.report.isLegacy()) {\n                this.loadLegacyReport();\n            }\n        }\n    },\n    handleRouteChange: function handleRouteChange(report, reportParams) {\n        var entity = this.state.entity.id;\n        if (report === 'new') {\n            this.transitionTo('report-index', { entity: entity });\n        } else {\n            var params = { report: report, reportParams: reportParams, entity: entity };\n            if (this.isActive('report')) {\n                // When navigating to a report from the index page,\n                // we want to replace the initial route with the params\n                // version. This way you can click back once to return to the index page.\n                this.replaceWith('reportWithParams', params);\n            } else {\n                // All other route updates due to param changes should push a new history item.\n                // User should be able to click the native back button to return to the previous state.\n                this.transitionTo('reportWithParams', params);\n            }\n        }\n    },\n    render: function render() {\n        if (this.state.loading) {\n            return _react2.default.createElement(\"div\", { className: \"ui-loading\" });\n        }\n        if (!this.state.entity) {\n            return _react2.default.createElement(\"div\", { className: \"report-index\" }, _react2.default.createElement(\"header\", { className: \"ui-main__header\" }, _react2.default.createElement(\"nav\", { className: \"ui-breadcrumbs\" }, _react2.default.createElement(\"span\", { className: \"ui-breadcrumbs__item\" }, _react2.default.createElement(\"span\", { className: \"icon-px-reports-20\" }), \"Reports\"))), _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No entity selected.\"), \"Please select an entity above to get started.\"));\n        }\n        return _react2.default.createElement(_reactRouter.RouteHandler, { report: this.props.report, reportParams: this.props.reportParams, reports: this.state.reports, session: this.state.session, entity: this.state.entity, isControlPanel: true, onCloseSettingsPanel: this.handleCloseSettingsPanel, onOpenSettingsPanel: this.handleOpenSettingsPanel, settingsPanelOpen: this.state.settingsPanelOpen, onMakeDefaultReport: this.handleMakeDefaultReport, onRouteChange: this.handleRouteChange });\n    }\n});\nexports.default = ReportApp;\n\n/***/ }),\n/* 824 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    parse: function parse(resp) {\n        return _lodash2.default.extend(resp, {\n            type: resp.data_set_type,\n            monthText: resp.month ? (0, _moment2.default)(resp.month, 'M').format('MMMM') : '',\n            date_updated: (0, _moment2.default)(resp.updated).format('MMM D YYYY hh:mm A'),\n            date_created: (0, _moment2.default)(resp.created).format('MMM D YYYY hh:mm A')\n        });\n    }\n});\n\n/***/ }),\n/* 825 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _chart_of_accounts = __webpack_require__(502);\n\nvar _chart_of_accounts2 = _interopRequireDefault(_chart_of_accounts);\n\nvar _async = __webpack_require__(827);\n\nvar _async2 = _interopRequireDefault(_async);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _cookiesJs = __webpack_require__(174);\n\nvar _cookiesJs2 = _interopRequireDefault(_cookiesJs);\n\nvar _report_preferences_actions = __webpack_require__(829);\n\nvar _report_preferences_actions2 = _interopRequireDefault(_report_preferences_actions);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _reactTransitionGroup = __webpack_require__(139);\n\nvar _css_transition_defaults = __webpack_require__(184);\n\nvar _css_transition_defaults2 = _interopRequireDefault(_css_transition_defaults);\n\nvar _immutabilityHelper = __webpack_require__(185);\n\nvar _immutabilityHelper2 = _interopRequireDefault(_immutabilityHelper);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _reactTreeview = __webpack_require__(835);\n\nvar _reactTreeview2 = _interopRequireDefault(_reactTreeview);\n\nvar _event_observer_mixin = __webpack_require__(141);\n\nvar _event_observer_mixin2 = _interopRequireDefault(_event_observer_mixin);\n\nvar _reports = __webpack_require__(140);\n\nvar _reports2 = _interopRequireDefault(_reports);\n\nvar _locked_report_creation_modal = __webpack_require__(836);\n\nvar _locked_report_creation_modal2 = _interopRequireDefault(_locked_report_creation_modal);\n\nvar _create_new_report_button = __webpack_require__(837);\n\nvar _create_new_report_button2 = _interopRequireDefault(_create_new_report_button);\n\nvar _link_to_civicdashboards_button = __webpack_require__(838);\n\nvar _link_to_civicdashboards_button2 = _interopRequireDefault(_link_to_civicdashboards_button);\n\nvar _modal_store = __webpack_require__(257);\n\nvar _modal_store2 = _interopRequireDefault(_modal_store);\n\nvar _report_preferences_store = __webpack_require__(839);\n\nvar _report_preferences_store2 = _interopRequireDefault(_report_preferences_store);\n\nvar _report_welcome_modal = __webpack_require__(840);\n\nvar _report_welcome_modal2 = _interopRequireDefault(_report_welcome_modal);\n\nvar _template_fixtures = __webpack_require__(901);\n\nvar _template_fixtures2 = _interopRequireDefault(_template_fixtures);\n\nvar _report_index_nav = __webpack_require__(902);\n\nvar _report_index_nav2 = _interopRequireDefault(_report_index_nav);\n\nvar _header = __webpack_require__(912);\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _search = __webpack_require__(913);\n\nvar _search2 = _interopRequireDefault(_search);\n\nvar _filter = __webpack_require__(914);\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _sort = __webpack_require__(916);\n\nvar _sort2 = _interopRequireDefault(_sort);\n\nvar _list = __webpack_require__(917);\n\nvar _list2 = _interopRequireDefault(_list);\n\nvar _show = __webpack_require__(918);\n\nvar _show2 = _interopRequireDefault(_show);\n\nvar _report_index_item = __webpack_require__(919);\n\nvar _report_index_item2 = _interopRequireDefault(_report_index_item);\n\nvar _toggle_edit_keyword = __webpack_require__(923);\n\nvar _toggle_edit_keyword2 = _interopRequireDefault(_toggle_edit_keyword);\n\nvar _report_keywords_utils = __webpack_require__(513);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _launchdarkly = __webpack_require__(514);\n\nvar _tracking = __webpack_require__(255);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar cookieExpires = new Date(new Date().setFullYear(new Date().getFullYear() + 1));\nvar confirmationMessage = 'It looks like you have been editing something. If you leave before saving, your changes will be lost.';\n\nvar ReportNavActions = (0, _createReactClass2.default)({\n    displayName: 'ReportNavActions',\n    render: function render() {\n        var _props = this.props,\n            civicDashboardsEnabled = _props.civicDashboardsEnabled,\n            coas = _props.coas,\n            canCreateReport = _props.canCreateReport,\n            newReportHref = _props.newReportHref,\n            toggleLockedReportCreation = _props.toggleLockedReportCreation;\n\n        return _react2.default.createElement(\"div\", { className: \"report-nav-actions\" }, civicDashboardsEnabled && _react2.default.createElement(_link_to_civicdashboards_button2.default, null), coas, _react2.default.createElement(_create_new_report_button2.default, { canCreateReport: canCreateReport, onClick: toggleLockedReportCreation, newReportHref: newReportHref }));\n    }\n});\nvar ReportIndex = (0, _createReactClass2.default)({\n    displayName: 'ReportIndex',\n\n    mixins: [_event_observer_mixin2.default, (0, _og_flux.StoreListener)(_modal_store2.default, _report_preferences_store2.default)],\n    render: function render() {\n        if (!this.state.loaded) {\n            return _react2.default.createElement(\"div\", { className: \"report-index\" }, _react2.default.createElement(\"div\", { className: \"ui-loading\" }));\n        }\n        var userRole = this.props.session.attributes.role.name;\n        var dashboardsEnabled = _lodash2.default.some(this.props.entity.attributes.feature_permissions, function (fp) {\n            return fp == 'dashboards';\n        });\n        var civicDashboardsEnabled = _lodash2.default.some(this.props.entity.attributes.feature_permissions, function (fp) {\n            return fp == 'civicdashboards';\n        });\n        var newReportHref = '#/' + this.props.entity.id + '/reports/new';\n        var canCreateReport = this.props.session.can('create', 'report');\n        var coas = this.coas.length > 1 ? _react2.default.createElement(\"select\", { className: \"coa-switcher\", onChange: this.handleCoaChange, value: this.state.coa.id }, this.coas.map(function (coa) {\n            return _react2.default.createElement(\"option\", { key: coa.id, value: coa.id }, coa.get('name'), coa.get('is_default') ? ' (default)' : '');\n        })) : null;\n        var chartId = this.state.coa ? this.state.coa.id : null;\n        var reports = this.state.filteredReports.filter(function (report) {\n            return report.get('coa_id') === chartId || report.get('coa_id') === null;\n        });\n        var templatesLabel = _react2.default.createElement(\"span\", { className: \"node\", onClick: this.handleShowTemplates }, \"Report Templates\");\n        var reportIndexClassnames = (0, _classnames2.default)({ 'reports-index': true, 'dashboards-enabled': dashboardsEnabled });\n        var sortedReports = _lodash2.default.orderBy(reports, [function (report) {\n            return report.get('name').toLowerCase();\n        }, function (report) {\n            return report.get('name');\n        }], [this.state.sortBy, this.state.sortBy]);\n        var reportViewType = this.state.reportViewType;\n        return _react2.default.createElement(\"div\", { className: reportIndexClassnames }, _react2.default.createElement(_report_index_nav2.default, { dashboardsEnabled: dashboardsEnabled, entityId: this.props.entity.id, newReportingEnabled: this.state.newReportingEnabled }, _react2.default.createElement(\"div\", { className: \"performance-header__container\" }, _react2.default.createElement(\"h1\", { className: \"header-text\" }, \"Reports\"), _react2.default.createElement(ReportNavActions, { coas: coas, civicDashboardsEnabled: civicDashboardsEnabled, canCreateReport: canCreateReport, toggleLockedReportCreation: this.toggleLockedReportCreation, newReportHref: newReportHref })), _react2.default.createElement(_header2.default, null, _react2.default.createElement(_search2.default, { searchInput: this.state.searchInput, onHandleUserInput: this.handleUserInput }), _react2.default.createElement(_sort2.default, { handleSorting: this.setSortOrder, sortOrder: this.state.sortBy }), _react2.default.createElement(_filter2.default, { keywords: this.state.keywords, checkedKeywords: this.state.checkedKeywords, userRole: userRole, onHandleManageKeywords: this.handleManageKeywords, onHandleChangeKeywords: this.handleChangeKeywords }), _react2.default.createElement(_show2.default, { visibility: this.state.visibility, onHandleChangeVisibility: this.handleChangeVisibility }), _react2.default.createElement(_list2.default, { reportViewType: reportViewType, changeReportViewType: this.changeReportViewType }))), _react2.default.createElement(\"div\", { className: \"reports-list\" }, _react2.default.createElement(ReportIndexListColumnHeaders, { reports: reports, reportViewType: reportViewType, toggleEditKeywordsMode: this.toggleEditKeywordsMode, isEditKeywordsMode: this.state.isEditKeywordsMode, userRole: userRole }), reports.length > 0 ? this.renderReports(sortedReports, canCreateReport) : _react2.default.createElement(\"div\", { className: \"no-reports-found\" }, \"No reports found\"), canCreateReport && !this.state.loadingHideTemplates && _react2.default.createElement(_reactTreeview2.default, { key: \"entity_report_templates\", nodeLabel: templatesLabel, collapsed: this.state.showTemplates, onClick: this.handleShowTemplates }, _react2.default.createElement(\"div\", { className: \"tree-template_title\" }, \"Report Templates are \", _react2.default.createElement(\"b\", null, \"examples\"), \" of the most popular reports being created by other governments on OpenGov. You can view examples of the report and download the template for step-by-step instructions to create the report for your organization.\"), this.renderReportTemplates(_template_fixtures2.default))), _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, Object.assign({ transitionName: \"ui-overlays\" }, _css_transition_defaults2.default), this.state.lockedReportCreationModal ? _react2.default.createElement(_locked_report_creation_modal2.default, { closeModal: this.toggleLockedReportCreation }) : null, this.state.showReportWelcome ? _react2.default.createElement(_report_welcome_modal2.default, { entityName: this.props.entity.get('name'), entityDisplayName: this.props.entity.get('display_name'), userRole: userRole }) : null));\n    },\n    buildCookieName: function buildCookieName(type) {\n        return 'report_index_filter_' + type + '_u' + this.props.session.attributes.id + '_e' + this.props.entity.attributes.entity_id;\n    },\n    changeReportViewType: function changeReportViewType(reportViewType) {\n        this.setState({\n            reportViewType: reportViewType\n        });\n        _cookiesJs2.default.set(this.buildCookieName('view'), reportViewType, { expires: cookieExpires });\n    },\n    formatSearchInput: function formatSearchInput(searchInput) {\n        return searchInput.toLowerCase().replace(/[^a-zA-Z0-9]/ig, '');\n    },\n    handleUserInput: function handleUserInput(searchInput) {\n        var filteredReports = this.performFiltering(searchInput, this.state.visibility, this.state.checkedKeywords);\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            filteredReports: { $set: filteredReports },\n            searchInput: { $set: searchInput }\n        }));\n    },\n    handleChangeVisibility: function handleChangeVisibility(visibility) {\n        var filteredReports = this.performFiltering(this.state.searchInput, visibility, this.state.checkedKeywords);\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            filteredReports: { $set: filteredReports },\n            visibility: { $set: visibility }\n        }));\n        _cookiesJs2.default.set(this.buildCookieName('visibility'), visibility, { expires: cookieExpires });\n    },\n    performFiltering: function performFiltering(searchInput, visibility, keywords) {\n        var _this = this;\n\n        var filteredReports = this.state.reports;\n        // First, search by search filter\n        filteredReports = filteredReports.filter(function (report) {\n            return _lodash2.default.includes(_this.formatSearchInput(report.get('name')), _this.formatSearchInput(searchInput)) || _lodash2.default.includes(_this.formatSearchInput(report.get('owner').first_name + ' ' + report.get('owner').last_name), _this.formatSearchInput(searchInput)) || _lodash2.default.includes(_this.formatSearchInput(report.get('visibility')), _this.formatSearchInput(searchInput));\n        });\n        // Next, filter by visibility\n        if (visibility == 'my_reports') {\n            filteredReports = filteredReports.filter(function (report) {\n                return report.get('owner').id == _this.props.session.attributes.id;\n            });\n        }\n        if (visibility == 'shared') {\n            filteredReports = filteredReports.filter(function (report) {\n                return report.get('visibility') == 'private' && report.get('owner').id != _this.props.session.attributes.id;\n            });\n        }\n        // Next, filter by keywords\n        if (keywords && keywords.length > 0) {\n            filteredReports = filteredReports.filter(function (report) {\n                var length = _lodash2.default.intersection(report.get('keywords'), keywords).length;\n                return length > 0 ? true : false;\n            });\n        }\n        return filteredReports;\n    },\n    positionMainPanel: function positionMainPanel() {\n        var initialTop = void 0;\n        var $window = (0, _jquery2.default)(window);\n        this.scrollCallback = function () {\n            var $node = (0, _jquery2.default)('.ui-main__sidebar');\n            if (!initialTop) {\n                initialTop = parseInt($node.css('top'), 10);\n            }\n            if ($node) {\n                var windowTop = $window.scrollTop();\n                var mainPanelTop = Math.max(initialTop - windowTop, 0);\n                $node.css('top', mainPanelTop);\n            }\n        };\n        (0, _jquery2.default)(document).on('scroll', this.scrollCallback);\n    },\n    handleCoaChange: function handleCoaChange(e) {\n        this.setState({\n            coa: this.coas.get(e.target.value)\n        });\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (this.props.entity.id !== nextProps.entity.id) {\n            this.fetchReports(nextProps.entity);\n            this.updateDocumentTitle(nextProps.entity);\n        }\n    },\n    getUniqueKeywords: function getUniqueKeywords(reports) {\n        var keys = [];\n        reports.map(function (report) {\n            keys = report.get('keywords') ? keys.concat(report.get('keywords')) : keys;\n        });\n        return _lodash2.default.uniq(keys);\n    },\n    toggleEditKeywordsMode: function toggleEditKeywordsMode() {\n        if (this.state.isEditKeywordsMode) {\n            this.saveKeywordsOnDone();\n        }\n        this.setState({ isEditKeywordsMode: !this.state.isEditKeywordsMode });\n    },\n    saveKeywordsOnDone: function saveKeywordsOnDone() {\n        var reportId = this.getActiveReportId();\n        if (reportId !== 0) {\n            var unSavedKeywords = this.isUnsavedKeywords();\n            if (unSavedKeywords) {\n                this.saveKeywordsAction();\n                this.updateReport(reportId, 'saveOnDone');\n                this.postSaveKeywords();\n            }\n        }\n    },\n    getActiveReportId: function getActiveReportId() {\n        var reportId = 0;\n        if (!_lodash2.default.isEmpty(this.state.addedKeywordsReport.keywords)) {\n            reportId = this.state.addedKeywordsReport.reportId;\n        }\n        if (!_lodash2.default.isEmpty(this.state.deletedKeywordsReport.keywords)) {\n            reportId = this.state.deletedKeywordsReport.reportId;\n        }\n        return reportId;\n    },\n    handleManageKeywords: function handleManageKeywords() {\n        this.setState({ isEditKeywordsMode: true });\n        this.changeReportViewType('list');\n    },\n    updateStateKeywords: function updateStateKeywords(keywords, id, action) {\n        if (action == 'add') {\n            this.setState({ addedKeywordsReport: { reportId: id, keywords: keywords } });\n        } else if (action == 'remove') {\n            this.setState({ deletedKeywordsReport: { reportId: id, keywords: keywords } });\n        }\n    },\n    saveKeywords: function saveKeywords(reportId) {\n        var unSavedKeywords = this.isUnsavedKeywords();\n        if (unSavedKeywords) {\n            this.saveKeywordsAction();\n            this.updateReport(reportId);\n            this.postSaveKeywords();\n        }\n    },\n    isUnsavedKeywords: function isUnsavedKeywords() {\n        var addKeywords = this.state.addedKeywordsReport.keywords;\n        var deleteKeywords = this.state.deletedKeywordsReport.keywords;\n        var unSavedKeywords = false;\n        if (!_lodash2.default.isEmpty(addKeywords) || !_lodash2.default.isEmpty(deleteKeywords)) {\n            unSavedKeywords = true;\n        }\n        return unSavedKeywords;\n    },\n    saveKeywordsAction: function saveKeywordsAction() {\n        var addKeywords = this.state.addedKeywordsReport.keywords;\n        var deleteKeywords = this.state.deletedKeywordsReport.keywords;\n        _report_preferences_actions2.default.updateKeywords(this.state.addedKeywordsReport.reportId, addKeywords);\n        _report_preferences_actions2.default.deleteKeywords(this.state.deletedKeywordsReport.reportId, deleteKeywords);\n    },\n    postSaveKeywords: function postSaveKeywords() {\n        this.updateKeywords();\n        this.setState({ addedKeywordsReport: { reportId: 0, keywords: [] } });\n        this.setState({ deletedKeywordsReport: { reportId: 0, keywords: [] } });\n    },\n    setUpdatedReportKeywords: function setUpdatedReportKeywords(reportId, keywords) {\n        this.setState({ updatedReportKeywords: { reportId: reportId, keywords: keywords } });\n    },\n    updateReport: function updateReport(reportId) {\n        var _this2 = this;\n\n        var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'saveKeywords';\n\n        var updatedKeywords = void 0;\n        this.state.reports.models.map(function (report) {\n            if (report.id == reportId) {\n                if (action == 'saveOnDone') {\n                    var assignedKeywords = report.attributes.keywords;\n                    updatedKeywords = (0, _report_keywords_utils.getUpdatedKeywords)(reportId, assignedKeywords, _this2.state.addedKeywordsReport, _this2.state.deletedKeywordsReport);\n                }\n                report.attributes.keywords = action == 'saveOnDone' ? updatedKeywords : _this2.state.updatedReportKeywords.keywords;\n            }\n        });\n    },\n    handleChangeKeywords: function handleChangeKeywords(checkedKeywords) {\n        var filteredReports = this.performFiltering(this.state.searchInput, this.state.visibility, checkedKeywords);\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            filteredReports: { $set: filteredReports },\n            checkedKeywords: { $set: checkedKeywords }\n        }));\n        _cookiesJs2.default.set(this.buildCookieName('checked_keywords'), checkedKeywords, { expires: cookieExpires });\n    },\n    renderReports: function renderReports(reports, canCreateReport) {\n        var _this3 = this;\n\n        var reportViewType = this.state.reportViewType;\n        var wrapperClass = reports.length > 0 && reportViewType == 'list' ? 'ui-row report-list-box' : 'ui-row';\n        var isEditKeywordsMode = this.state.isEditKeywordsMode;\n        var addedKeywordsReport = this.state.addedKeywordsReport;\n        var deletedKeywordsReport = this.state.deletedKeywordsReport;\n        var isNotFiltering = this.state.searchInput == '' && this.state.visibility == 'all' && _lodash2.default.isEmpty(this.state.checkedKeywords);\n        var shouldShowWelcome = reports.length < 3 && reportViewType === 'grid' && isNotFiltering;\n        return _react2.default.createElement(\"div\", { className: wrapperClass }, shouldShowWelcome && _react2.default.createElement(ReportTemplateWelcomeItem, { canCreateReport: canCreateReport }), reports.map(function (report) {\n            return _react2.default.createElement(_report_index_item2.default, Object.assign({}, _this3.props, { key: report.id, report: report, entity: _this3.props.entity, isDefault: report.position === 0, reportViewType: reportViewType, onMouseLeave: _this3.handleMouseLeave, onMakeDefaultReport: _this3.props.onMakeDefaultReport, onMouseEnter: _lodash2.default.partial(_this3.handleMouseEnter, report), isEditKeywordsMode: isEditKeywordsMode, addedKeywordsReport: addedKeywordsReport, deletedKeywordsReport: deletedKeywordsReport, updateStateKeywords: _this3.updateStateKeywords, saveKeywords: _this3.saveKeywords, keywords: _this3.state.keywords, setUpdatedReportKeywords: _this3.setUpdatedReportKeywords }));\n        }));\n    },\n    renderReportTemplates: function renderReportTemplates(templates) {\n        return _react2.default.createElement(\"div\", { className: \"ui-row\" }, templates.map(function (template) {\n            return _react2.default.createElement(ReportTemplateItem, { key: template.id, template: template });\n        }));\n    },\n    handleShowTemplates: function handleShowTemplates() {\n        var userId = this.props.session && this.props.session.id;\n        _report_preferences_actions2.default.hideTemplates(userId, !this.state.showTemplates);\n    },\n    getTemplatePreferences: function getTemplatePreferences() {\n        var userId = this.props.session && this.props.session.id;\n        _report_preferences_actions2.default.getTemplatePreferences(userId);\n    },\n    getInitialState: function getInitialState() {\n        var checkedKeywordsCookies = _cookiesJs2.default.get(this.buildCookieName('checked_keywords'));\n        return {\n            hoveredReport: null,\n            loaded: false,\n            lockedReportCreationModal: false,\n            showReportWelcome: _modal_store2.default.getState().get('showReportWelcome') && !_cookiesJs2.default.get('reports_visited'),\n            showTemplates: null,\n            loadingHideTemplates: _report_preferences_store2.default.getState().get('loadingHideTemplates'),\n            sortBy: _cookiesJs2.default.get(this.buildCookieName('sort')) || 'asc',\n            reportViewType: _cookiesJs2.default.get(this.buildCookieName('view')) || 'grid',\n            filteredReports: [],\n            searchInput: '',\n            visibility: _cookiesJs2.default.get(this.buildCookieName('visibility')) || 'all',\n            keywords: [],\n            checkedKeywords: checkedKeywordsCookies ? checkedKeywordsCookies.split(',') : [],\n            isEditKeywordsMode: false,\n            addedKeywordsReport: { reportId: 0, keywords: [] },\n            deletedKeywordsReport: { reportId: 0, keywords: [] },\n            updatedReportKeywords: { reportId: 0, keywords: [] },\n            confirmUnsavedChanges: false\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            showReportWelcome: {\n                $set: _modal_store2.default.getState().get('showReportWelcome') && !_cookiesJs2.default.get('reports_visited')\n            },\n            showTemplates: {\n                $set: _report_preferences_store2.default.getState().get('hideTemplates')\n            },\n            loadingHideTemplates: {\n                $set: _report_preferences_store2.default.getState().get('loadingHideTemplates')\n            }\n        }));\n    },\n    setSortOrder: function setSortOrder(value) {\n        this.setState({ sortBy: value });\n        _cookiesJs2.default.set(this.buildCookieName('sort'), value, { expires: cookieExpires });\n    },\n    componentDidMount: function componentDidMount() {\n        var _this4 = this;\n\n        this.fetchReports(this.props.entity);\n        this.positionMainPanel();\n        this.updateDocumentTitle(this.props.entity);\n        this.getTemplatePreferences();\n        window.addEventListener('beforeunload', this.beforeUnload);\n        (0, _tracking.trackPage)('Reporting Classic: Report Index');\n        // not interested in realtime changes at this time\n        var ldChangeHandler = function ldChangeHandler() {};\n        var ldIt = (0, _launchdarkly.ldInitialize)(true, gon.launchDarklyKey, ldChangeHandler);\n        if (!this.props.session || !this.props.session.toJSON) {\n            return;\n        }\n        var ldParams = {\n            session: _extends({}, this.props.session.toJSON(), { entity: this.props.entity.toJSON() }),\n            currentEntityId: this.props.entity.get('subdomain')\n        };\n        ldIt(ldParams).then(function (client) {\n            var newReportingEnabled = client.variation('feature-new-reporting', false);\n            _this4.setState((0, _immutabilityHelper2.default)(_this4.state, { newReportingEnabled: { $set: newReportingEnabled } }));\n        });\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        (0, _jquery2.default)(document).off('scroll', this.scrollCallback);\n        window.removeEventListener('beforeunload', this.beforeUnload);\n    },\n\n    statics: {\n        willTransitionFrom: function willTransitionFrom(transition, component) {\n            if (component.state.isEditKeywordsMode) {\n                if (!component.confirmUnsavedChanges()) {\n                    transition.abort();\n                } else {\n                    component.setState({ confirmUnsavedChanges: true });\n                }\n            }\n        }\n    },\n    beforeUnload: function beforeUnload(e) {\n        if (this.state.isEditKeywordsMode) {\n            (e || window.event).returnValue = confirmationMessage; //Gecko + IE\n            return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.\n        }\n    },\n    confirmUnsavedChanges: function confirmUnsavedChanges() {\n        if (!this.state.confirmUnsavedChanges) {\n            return confirm(confirmationMessage);\n        } else {\n            return true;\n        }\n    },\n    updateDocumentTitle: function updateDocumentTitle(entity) {\n        document.title = entity.getName() + ' / Reports';\n    },\n    updateKeywords: function updateKeywords() {\n        var uniqueKeywords = this.getUniqueKeywords(this.state.reports);\n        var checkedKeywords = _lodash2.default.intersection(uniqueKeywords, this.state.checkedKeywords);\n        var filteredReports = this.performFiltering(this.state.searchInput, this.state.visibility, checkedKeywords);\n        this.setState({ keywords: uniqueKeywords,\n            checkedKeywords: checkedKeywords,\n            filteredReports: filteredReports\n        });\n    },\n    fetchReports: function fetchReports(entity) {\n        var _this5 = this;\n\n        this.setState({ loaded: false });\n        this.state.reports = new _reports2.default();\n        this.coas = new _chart_of_accounts2.default();\n        _async2.default.parallel([function (cb) {\n            _this5.state.reports.fetch({\n                data: {\n                    entity_id: entity.get('entity_id'),\n                    embed: 'is_geo_enabled',\n                    fields: [\n                    //'abilities',\n                    'access_code', 'coa_id', 'coa_mask_id', 'created',\n                    //'data_sets',\n                    'description', 'entity', 'entity_id',\n                    //'extra_files',\n                    'hidden', 'id', 'is_default', 'is_geo_enabled', 'is_private', 'name', 'owner', 'position', 'properties', 'report_type', 'report_type_name', 'updated', 'data_updated_at',\n                    //'user_abilities',\n                    'visibility', 'keywords'].join(',')\n                },\n                success: function success() {\n                    _this5.updateKeywords();\n                    cb();\n                }\n            });\n        }, function (cb) {\n            _this5.coas.fetch({\n                data: { entity_id: entity.get('entity_id') },\n                success: function success() {\n                    cb();\n                }\n            });\n        }], function (error) {\n            if (!error && _this5._isMounted) {\n                _this5.setState({\n                    loaded: true,\n                    coa: _this5.coas.findWhere({ is_default: true }) || _this5.coas.first()\n                });\n            }\n        });\n    },\n    handleMouseLeave: function handleMouseLeave() {\n        this.setState({ hoveredReport: null });\n    },\n    handleMouseEnter: function handleMouseEnter(report) {\n        this.setState({ hoveredReport: report });\n    },\n    toggleLockedReportCreation: function toggleLockedReportCreation() {\n        this.setState({ lockedReportCreationModal: !this.state.lockedReportCreationModal });\n    }\n});\nvar ReportIndexListColumnHeaders = (0, _createReactClass2.default)({\n    displayName: 'ReportIndexListColumnHeaders',\n    render: function render() {\n        if (this.props.reports.length > 0 && this.props.reportViewType == 'list') {\n            return _react2.default.createElement(\"div\", { className: \"ui-col-12of12 list-view-header\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of12\" }, \"REPORT NAME\"), _react2.default.createElement(\"div\", { className: \"ui-col-3of12 keywords\" }, \"KEYWORDS\", _react2.default.createElement(_toggle_edit_keyword2.default, { toggleEditKeywordsMode: this.props.toggleEditKeywordsMode, isEditKeywordsMode: this.props.isEditKeywordsMode, userRole: this.props.userRole })), _react2.default.createElement(\"div\", { className: \"ui-col-2of12\" }, \"LAST UPDATED\"), _react2.default.createElement(\"div\", { className: \"ui-col-2of12\" }, \"REPORT OWNER\"), _react2.default.createElement(\"div\", { className: \"ui-col-2of12\" }, \"VISIBILITY\"));\n        }\n        return null;\n    }\n});\nvar ReportTemplateItem = (0, _createReactClass2.default)({\n    displayName: 'ReportTemplateItem',\n    render: function render() {\n        var template = this.props.template;\n        return _react2.default.createElement(\"div\", { className: \"ui-col-3of12\" }, _react2.default.createElement(\"div\", { className: \"ui-report-card template-card\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)(template.imageUrl) }), _react2.default.createElement(\"div\", { className: \"ui-report-card__details\" }, _react2.default.createElement(\"div\", { className: \"ui-row\" }, _react2.default.createElement(\"button\", { className: \"ui-button tiny small no-hover\" }, \"Template\"), _react2.default.createElement(\"h5\", { className: \"template-title\" }, template.title), _react2.default.createElement(\"div\", { className: \"template-description\" }, template.description), _react2.default.createElement(\"div\", { className: \"ui-report-card__title\" }, _react2.default.createElement(\"a\", { className: \"ui-button primary small left\", target: \"_blank\", href: template.exampleUrl }, \"View Example\"), _react2.default.createElement(\"a\", { className: \"ui-button small right\", href: template.downloadUrl }, _react2.default.createElement(\"span\", { className: \"icon-download-1\" }), \"Template\"))))));\n    }\n});\nvar ReportTemplateWelcomeItem = (0, _createReactClass2.default)({\n    displayName: 'ReportTemplateWelcomeItem',\n    render: function render() {\n        var canCreateReport = this.props.canCreateReport;\n        return _react2.default.createElement(\"div\", { className: \"ui-col-3of12\" }, _react2.default.createElement(\"div\", { className: \"ui-report-card welcome-card\" }, _react2.default.createElement(\"div\", { className: \"title\" }, \"Welcome to Reports!\"), canCreateReport ? _react2.default.createElement(\"div\", { className: \"paragraph\" }, 'This is where the reports you create are stored. Explore these example report templates to see what you can create with OpenGov, then download the template to make your own. When you\\u2019re ready to add a report, click on ', _react2.default.createElement(\"strong\", null, \"Create Report\"), \" in the upper right hand corner.\") : _react2.default.createElement(\"div\", { className: \"paragraph\" }, \"This is where your organization's reports are stored. Click on a Report to explore information and create personalized Saved Views.\")));\n    }\n});\nexports.default = ReportIndex;\n\n/***/ }),\n/* 826 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    parse: function parse(resp) {\n        return _lodash2.default.extend(resp, {\n            date_created: (0, _moment2.default)(resp.created).format('MMM D YYYY hh:mm A'),\n            date_updated: (0, _moment2.default)(resp.updated).format('MMM D YYYY hh:mm A')\n        });\n    }\n});\n\n/***/ }),\n/* 827 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process, setImmediate) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * async\n * https://github.com/caolan/async\n *\n * Copyright 2010-2014 Caolan McMahon\n * Released under the MIT license\n */\n/*jshint onevar: false, indent:4 */\n/*global setImmediate: false, setTimeout: false, console: false */\n(function () {\n\n    var async = {};\n\n    // global on the server, window in the browser\n    var root, previous_async;\n\n    root = this;\n    if (root != null) {\n      previous_async = root.async;\n    }\n\n    async.noConflict = function () {\n        root.async = previous_async;\n        return async;\n    };\n\n    function only_once(fn) {\n        var called = false;\n        return function() {\n            if (called) throw new Error(\"Callback was already called.\");\n            called = true;\n            fn.apply(root, arguments);\n        }\n    }\n\n    //// cross-browser compatiblity functions ////\n\n    var _toString = Object.prototype.toString;\n\n    var _isArray = Array.isArray || function (obj) {\n        return _toString.call(obj) === '[object Array]';\n    };\n\n    var _each = function (arr, iterator) {\n        for (var i = 0; i < arr.length; i += 1) {\n            iterator(arr[i], i, arr);\n        }\n    };\n\n    var _map = function (arr, iterator) {\n        if (arr.map) {\n            return arr.map(iterator);\n        }\n        var results = [];\n        _each(arr, function (x, i, a) {\n            results.push(iterator(x, i, a));\n        });\n        return results;\n    };\n\n    var _reduce = function (arr, iterator, memo) {\n        if (arr.reduce) {\n            return arr.reduce(iterator, memo);\n        }\n        _each(arr, function (x, i, a) {\n            memo = iterator(memo, x, i, a);\n        });\n        return memo;\n    };\n\n    var _keys = function (obj) {\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                keys.push(k);\n            }\n        }\n        return keys;\n    };\n\n    //// exported async module functions ////\n\n    //// nextTick implementation with browser-compatible fallback ////\n    if (typeof process === 'undefined' || !(process.nextTick)) {\n        if (typeof setImmediate === 'function') {\n            async.nextTick = function (fn) {\n                // not a direct alias for IE10 compatibility\n                setImmediate(fn);\n            };\n            async.setImmediate = async.nextTick;\n        }\n        else {\n            async.nextTick = function (fn) {\n                setTimeout(fn, 0);\n            };\n            async.setImmediate = async.nextTick;\n        }\n    }\n    else {\n        async.nextTick = process.nextTick;\n        if (typeof setImmediate !== 'undefined') {\n            async.setImmediate = function (fn) {\n              // not a direct alias for IE10 compatibility\n              setImmediate(fn);\n            };\n        }\n        else {\n            async.setImmediate = async.nextTick;\n        }\n    }\n\n    async.each = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        _each(arr, function (x) {\n            iterator(x, only_once(done) );\n        });\n        function done(err) {\n          if (err) {\n              callback(err);\n              callback = function () {};\n          }\n          else {\n              completed += 1;\n              if (completed >= arr.length) {\n                  callback();\n              }\n          }\n        }\n    };\n    async.forEach = async.each;\n\n    async.eachSeries = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        var iterate = function () {\n            iterator(arr[completed], function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed >= arr.length) {\n                        callback();\n                    }\n                    else {\n                        iterate();\n                    }\n                }\n            });\n        };\n        iterate();\n    };\n    async.forEachSeries = async.eachSeries;\n\n    async.eachLimit = function (arr, limit, iterator, callback) {\n        var fn = _eachLimit(limit);\n        fn.apply(null, [arr, iterator, callback]);\n    };\n    async.forEachLimit = async.eachLimit;\n\n    var _eachLimit = function (limit) {\n\n        return function (arr, iterator, callback) {\n            callback = callback || function () {};\n            if (!arr.length || limit <= 0) {\n                return callback();\n            }\n            var completed = 0;\n            var started = 0;\n            var running = 0;\n\n            (function replenish () {\n                if (completed >= arr.length) {\n                    return callback();\n                }\n\n                while (running < limit && started < arr.length) {\n                    started += 1;\n                    running += 1;\n                    iterator(arr[started - 1], function (err) {\n                        if (err) {\n                            callback(err);\n                            callback = function () {};\n                        }\n                        else {\n                            completed += 1;\n                            running -= 1;\n                            if (completed >= arr.length) {\n                                callback();\n                            }\n                            else {\n                                replenish();\n                            }\n                        }\n                    });\n                }\n            })();\n        };\n    };\n\n\n    var doParallel = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.each].concat(args));\n        };\n    };\n    var doParallelLimit = function(limit, fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [_eachLimit(limit)].concat(args));\n        };\n    };\n    var doSeries = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.eachSeries].concat(args));\n        };\n    };\n\n\n    var _asyncMap = function (eachfn, arr, iterator, callback) {\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        if (!callback) {\n            eachfn(arr, function (x, callback) {\n                iterator(x.value, function (err) {\n                    callback(err);\n                });\n            });\n        } else {\n            var results = [];\n            eachfn(arr, function (x, callback) {\n                iterator(x.value, function (err, v) {\n                    results[x.index] = v;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n    async.map = doParallel(_asyncMap);\n    async.mapSeries = doSeries(_asyncMap);\n    async.mapLimit = function (arr, limit, iterator, callback) {\n        return _mapLimit(limit)(arr, iterator, callback);\n    };\n\n    var _mapLimit = function(limit) {\n        return doParallelLimit(limit, _asyncMap);\n    };\n\n    // reduce only has a series version, as doing reduce in parallel won't\n    // work in many situations.\n    async.reduce = function (arr, memo, iterator, callback) {\n        async.eachSeries(arr, function (x, callback) {\n            iterator(memo, x, function (err, v) {\n                memo = v;\n                callback(err);\n            });\n        }, function (err) {\n            callback(err, memo);\n        });\n    };\n    // inject alias\n    async.inject = async.reduce;\n    // foldl alias\n    async.foldl = async.reduce;\n\n    async.reduceRight = function (arr, memo, iterator, callback) {\n        var reversed = _map(arr, function (x) {\n            return x;\n        }).reverse();\n        async.reduce(reversed, memo, iterator, callback);\n    };\n    // foldr alias\n    async.foldr = async.reduceRight;\n\n    var _filter = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.filter = doParallel(_filter);\n    async.filterSeries = doSeries(_filter);\n    // select alias\n    async.select = async.filter;\n    async.selectSeries = async.filterSeries;\n\n    var _reject = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (!v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.reject = doParallel(_reject);\n    async.rejectSeries = doSeries(_reject);\n\n    var _detect = function (eachfn, arr, iterator, main_callback) {\n        eachfn(arr, function (x, callback) {\n            iterator(x, function (result) {\n                if (result) {\n                    main_callback(x);\n                    main_callback = function () {};\n                }\n                else {\n                    callback();\n                }\n            });\n        }, function (err) {\n            main_callback();\n        });\n    };\n    async.detect = doParallel(_detect);\n    async.detectSeries = doSeries(_detect);\n\n    async.some = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (v) {\n                    main_callback(true);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(false);\n        });\n    };\n    // any alias\n    async.any = async.some;\n\n    async.every = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (!v) {\n                    main_callback(false);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(true);\n        });\n    };\n    // all alias\n    async.all = async.every;\n\n    async.sortBy = function (arr, iterator, callback) {\n        async.map(arr, function (x, callback) {\n            iterator(x, function (err, criteria) {\n                if (err) {\n                    callback(err);\n                }\n                else {\n                    callback(null, {value: x, criteria: criteria});\n                }\n            });\n        }, function (err, results) {\n            if (err) {\n                return callback(err);\n            }\n            else {\n                var fn = function (left, right) {\n                    var a = left.criteria, b = right.criteria;\n                    return a < b ? -1 : a > b ? 1 : 0;\n                };\n                callback(null, _map(results.sort(fn), function (x) {\n                    return x.value;\n                }));\n            }\n        });\n    };\n\n    async.auto = function (tasks, callback) {\n        callback = callback || function () {};\n        var keys = _keys(tasks);\n        var remainingTasks = keys.length\n        if (!remainingTasks) {\n            return callback();\n        }\n\n        var results = {};\n\n        var listeners = [];\n        var addListener = function (fn) {\n            listeners.unshift(fn);\n        };\n        var removeListener = function (fn) {\n            for (var i = 0; i < listeners.length; i += 1) {\n                if (listeners[i] === fn) {\n                    listeners.splice(i, 1);\n                    return;\n                }\n            }\n        };\n        var taskComplete = function () {\n            remainingTasks--\n            _each(listeners.slice(0), function (fn) {\n                fn();\n            });\n        };\n\n        addListener(function () {\n            if (!remainingTasks) {\n                var theCallback = callback;\n                // prevent final callback from calling itself if it errors\n                callback = function () {};\n\n                theCallback(null, results);\n            }\n        });\n\n        _each(keys, function (k) {\n            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];\n            var taskCallback = function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (args.length <= 1) {\n                    args = args[0];\n                }\n                if (err) {\n                    var safeResults = {};\n                    _each(_keys(results), function(rkey) {\n                        safeResults[rkey] = results[rkey];\n                    });\n                    safeResults[k] = args;\n                    callback(err, safeResults);\n                    // stop subsequent errors hitting callback multiple times\n                    callback = function () {};\n                }\n                else {\n                    results[k] = args;\n                    async.setImmediate(taskComplete);\n                }\n            };\n            var requires = task.slice(0, Math.abs(task.length - 1)) || [];\n            var ready = function () {\n                return _reduce(requires, function (a, x) {\n                    return (a && results.hasOwnProperty(x));\n                }, true) && !results.hasOwnProperty(k);\n            };\n            if (ready()) {\n                task[task.length - 1](taskCallback, results);\n            }\n            else {\n                var listener = function () {\n                    if (ready()) {\n                        removeListener(listener);\n                        task[task.length - 1](taskCallback, results);\n                    }\n                };\n                addListener(listener);\n            }\n        });\n    };\n\n    async.retry = function(times, task, callback) {\n        var DEFAULT_TIMES = 5;\n        var attempts = [];\n        // Use defaults if times not passed\n        if (typeof times === 'function') {\n            callback = task;\n            task = times;\n            times = DEFAULT_TIMES;\n        }\n        // Make sure times is a number\n        times = parseInt(times, 10) || DEFAULT_TIMES;\n        var wrappedTask = function(wrappedCallback, wrappedResults) {\n            var retryAttempt = function(task, finalAttempt) {\n                return function(seriesCallback) {\n                    task(function(err, result){\n                        seriesCallback(!err || finalAttempt, {err: err, result: result});\n                    }, wrappedResults);\n                };\n            };\n            while (times) {\n                attempts.push(retryAttempt(task, !(times-=1)));\n            }\n            async.series(attempts, function(done, data){\n                data = data[data.length - 1];\n                (wrappedCallback || callback)(data.err, data.result);\n            });\n        }\n        // If a callback is passed, run this as a controll flow\n        return callback ? wrappedTask() : wrappedTask\n    };\n\n    async.waterfall = function (tasks, callback) {\n        callback = callback || function () {};\n        if (!_isArray(tasks)) {\n          var err = new Error('First argument to waterfall must be an array of functions');\n          return callback(err);\n        }\n        if (!tasks.length) {\n            return callback();\n        }\n        var wrapIterator = function (iterator) {\n            return function (err) {\n                if (err) {\n                    callback.apply(null, arguments);\n                    callback = function () {};\n                }\n                else {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    var next = iterator.next();\n                    if (next) {\n                        args.push(wrapIterator(next));\n                    }\n                    else {\n                        args.push(callback);\n                    }\n                    async.setImmediate(function () {\n                        iterator.apply(null, args);\n                    });\n                }\n            };\n        };\n        wrapIterator(async.iterator(tasks))();\n    };\n\n    var _parallel = function(eachfn, tasks, callback) {\n        callback = callback || function () {};\n        if (_isArray(tasks)) {\n            eachfn.map(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            eachfn.each(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.parallel = function (tasks, callback) {\n        _parallel({ map: async.map, each: async.each }, tasks, callback);\n    };\n\n    async.parallelLimit = function(tasks, limit, callback) {\n        _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);\n    };\n\n    async.series = function (tasks, callback) {\n        callback = callback || function () {};\n        if (_isArray(tasks)) {\n            async.mapSeries(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            async.eachSeries(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.iterator = function (tasks) {\n        var makeCallback = function (index) {\n            var fn = function () {\n                if (tasks.length) {\n                    tasks[index].apply(null, arguments);\n                }\n                return fn.next();\n            };\n            fn.next = function () {\n                return (index < tasks.length - 1) ? makeCallback(index + 1): null;\n            };\n            return fn;\n        };\n        return makeCallback(0);\n    };\n\n    async.apply = function (fn) {\n        var args = Array.prototype.slice.call(arguments, 1);\n        return function () {\n            return fn.apply(\n                null, args.concat(Array.prototype.slice.call(arguments))\n            );\n        };\n    };\n\n    var _concat = function (eachfn, arr, fn, callback) {\n        var r = [];\n        eachfn(arr, function (x, cb) {\n            fn(x, function (err, y) {\n                r = r.concat(y || []);\n                cb(err);\n            });\n        }, function (err) {\n            callback(err, r);\n        });\n    };\n    async.concat = doParallel(_concat);\n    async.concatSeries = doSeries(_concat);\n\n    async.whilst = function (test, iterator, callback) {\n        if (test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.whilst(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doWhilst = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            var args = Array.prototype.slice.call(arguments, 1);\n            if (test.apply(null, args)) {\n                async.doWhilst(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.until = function (test, iterator, callback) {\n        if (!test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.until(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doUntil = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            var args = Array.prototype.slice.call(arguments, 1);\n            if (!test.apply(null, args)) {\n                async.doUntil(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.queue = function (worker, concurrency) {\n        if (concurrency === undefined) {\n            concurrency = 1;\n        }\n        function _insert(q, data, pos, callback) {\n          if (!q.started){\n            q.started = true;\n          }\n          if (!_isArray(data)) {\n              data = [data];\n          }\n          if(data.length == 0) {\n             // call drain immediately if there are no tasks\n             return async.setImmediate(function() {\n                 if (q.drain) {\n                     q.drain();\n                 }\n             });\n          }\n          _each(data, function(task) {\n              var item = {\n                  data: task,\n                  callback: typeof callback === 'function' ? callback : null\n              };\n\n              if (pos) {\n                q.tasks.unshift(item);\n              } else {\n                q.tasks.push(item);\n              }\n\n              if (q.saturated && q.tasks.length === q.concurrency) {\n                  q.saturated();\n              }\n              async.setImmediate(q.process);\n          });\n        }\n\n        var workers = 0;\n        var q = {\n            tasks: [],\n            concurrency: concurrency,\n            saturated: null,\n            empty: null,\n            drain: null,\n            started: false,\n            paused: false,\n            push: function (data, callback) {\n              _insert(q, data, false, callback);\n            },\n            kill: function () {\n              q.drain = null;\n              q.tasks = [];\n            },\n            unshift: function (data, callback) {\n              _insert(q, data, true, callback);\n            },\n            process: function () {\n                if (!q.paused && workers < q.concurrency && q.tasks.length) {\n                    var task = q.tasks.shift();\n                    if (q.empty && q.tasks.length === 0) {\n                        q.empty();\n                    }\n                    workers += 1;\n                    var next = function () {\n                        workers -= 1;\n                        if (task.callback) {\n                            task.callback.apply(task, arguments);\n                        }\n                        if (q.drain && q.tasks.length + workers === 0) {\n                            q.drain();\n                        }\n                        q.process();\n                    };\n                    var cb = only_once(next);\n                    worker(task.data, cb);\n                }\n            },\n            length: function () {\n                return q.tasks.length;\n            },\n            running: function () {\n                return workers;\n            },\n            idle: function() {\n                return q.tasks.length + workers === 0;\n            },\n            pause: function () {\n                if (q.paused === true) { return; }\n                q.paused = true;\n            },\n            resume: function () {\n                if (q.paused === false) { return; }\n                q.paused = false;\n                // Need to call q.process once per concurrent\n                // worker to preserve full concurrency after pause\n                for (var w = 1; w <= q.concurrency; w++) {\n                    async.setImmediate(q.process);\n                }\n            }\n        };\n        return q;\n    };\n\n    async.priorityQueue = function (worker, concurrency) {\n\n        function _compareTasks(a, b){\n          return a.priority - b.priority;\n        };\n\n        function _binarySearch(sequence, item, compare) {\n          var beg = -1,\n              end = sequence.length - 1;\n          while (beg < end) {\n            var mid = beg + ((end - beg + 1) >>> 1);\n            if (compare(item, sequence[mid]) >= 0) {\n              beg = mid;\n            } else {\n              end = mid - 1;\n            }\n          }\n          return beg;\n        }\n\n        function _insert(q, data, priority, callback) {\n          if (!q.started){\n            q.started = true;\n          }\n          if (!_isArray(data)) {\n              data = [data];\n          }\n          if(data.length == 0) {\n             // call drain immediately if there are no tasks\n             return async.setImmediate(function() {\n                 if (q.drain) {\n                     q.drain();\n                 }\n             });\n          }\n          _each(data, function(task) {\n              var item = {\n                  data: task,\n                  priority: priority,\n                  callback: typeof callback === 'function' ? callback : null\n              };\n\n              q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);\n\n              if (q.saturated && q.tasks.length === q.concurrency) {\n                  q.saturated();\n              }\n              async.setImmediate(q.process);\n          });\n        }\n\n        // Start with a normal queue\n        var q = async.queue(worker, concurrency);\n\n        // Override push to accept second parameter representing priority\n        q.push = function (data, priority, callback) {\n          _insert(q, data, priority, callback);\n        };\n\n        // Remove unshift function\n        delete q.unshift;\n\n        return q;\n    };\n\n    async.cargo = function (worker, payload) {\n        var working     = false,\n            tasks       = [];\n\n        var cargo = {\n            tasks: tasks,\n            payload: payload,\n            saturated: null,\n            empty: null,\n            drain: null,\n            drained: true,\n            push: function (data, callback) {\n                if (!_isArray(data)) {\n                    data = [data];\n                }\n                _each(data, function(task) {\n                    tasks.push({\n                        data: task,\n                        callback: typeof callback === 'function' ? callback : null\n                    });\n                    cargo.drained = false;\n                    if (cargo.saturated && tasks.length === payload) {\n                        cargo.saturated();\n                    }\n                });\n                async.setImmediate(cargo.process);\n            },\n            process: function process() {\n                if (working) return;\n                if (tasks.length === 0) {\n                    if(cargo.drain && !cargo.drained) cargo.drain();\n                    cargo.drained = true;\n                    return;\n                }\n\n                var ts = typeof payload === 'number'\n                            ? tasks.splice(0, payload)\n                            : tasks.splice(0, tasks.length);\n\n                var ds = _map(ts, function (task) {\n                    return task.data;\n                });\n\n                if(cargo.empty) cargo.empty();\n                working = true;\n                worker(ds, function () {\n                    working = false;\n\n                    var args = arguments;\n                    _each(ts, function (data) {\n                        if (data.callback) {\n                            data.callback.apply(null, args);\n                        }\n                    });\n\n                    process();\n                });\n            },\n            length: function () {\n                return tasks.length;\n            },\n            running: function () {\n                return working;\n            }\n        };\n        return cargo;\n    };\n\n    var _console_fn = function (name) {\n        return function (fn) {\n            var args = Array.prototype.slice.call(arguments, 1);\n            fn.apply(null, args.concat([function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (typeof console !== 'undefined') {\n                    if (err) {\n                        if (console.error) {\n                            console.error(err);\n                        }\n                    }\n                    else if (console[name]) {\n                        _each(args, function (x) {\n                            console[name](x);\n                        });\n                    }\n                }\n            }]));\n        };\n    };\n    async.log = _console_fn('log');\n    async.dir = _console_fn('dir');\n    /*async.info = _console_fn('info');\n    async.warn = _console_fn('warn');\n    async.error = _console_fn('error');*/\n\n    async.memoize = function (fn, hasher) {\n        var memo = {};\n        var queues = {};\n        hasher = hasher || function (x) {\n            return x;\n        };\n        var memoized = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            var key = hasher.apply(null, args);\n            if (key in memo) {\n                async.nextTick(function () {\n                    callback.apply(null, memo[key]);\n                });\n            }\n            else if (key in queues) {\n                queues[key].push(callback);\n            }\n            else {\n                queues[key] = [callback];\n                fn.apply(null, args.concat([function () {\n                    memo[key] = arguments;\n                    var q = queues[key];\n                    delete queues[key];\n                    for (var i = 0, l = q.length; i < l; i++) {\n                      q[i].apply(null, arguments);\n                    }\n                }]));\n            }\n        };\n        memoized.memo = memo;\n        memoized.unmemoized = fn;\n        return memoized;\n    };\n\n    async.unmemoize = function (fn) {\n      return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n      };\n    };\n\n    async.times = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.map(counter, iterator, callback);\n    };\n\n    async.timesSeries = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.mapSeries(counter, iterator, callback);\n    };\n\n    async.seq = function (/* functions... */) {\n        var fns = arguments;\n        return function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            async.reduce(fns, args, function (newargs, fn, cb) {\n                fn.apply(that, newargs.concat([function () {\n                    var err = arguments[0];\n                    var nextargs = Array.prototype.slice.call(arguments, 1);\n                    cb(err, nextargs);\n                }]))\n            },\n            function (err, results) {\n                callback.apply(that, [err].concat(results));\n            });\n        };\n    };\n\n    async.compose = function (/* functions... */) {\n      return async.seq.apply(null, Array.prototype.reverse.call(arguments));\n    };\n\n    var _applyEach = function (eachfn, fns /*args...*/) {\n        var go = function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            return eachfn(fns, function (fn, cb) {\n                fn.apply(that, args.concat([cb]));\n            },\n            callback);\n        };\n        if (arguments.length > 2) {\n            var args = Array.prototype.slice.call(arguments, 2);\n            return go.apply(this, args);\n        }\n        else {\n            return go;\n        }\n    };\n    async.applyEach = doParallel(_applyEach);\n    async.applyEachSeries = doSeries(_applyEach);\n\n    async.forever = function (fn, callback) {\n        function next(err) {\n            if (err) {\n                if (callback) {\n                    return callback(err);\n                }\n                throw err;\n            }\n            fn(next);\n        }\n        next();\n    };\n\n    // Node.js\n    if (typeof module !== 'undefined' && module.exports) {\n        module.exports = async;\n    }\n    // AMD / RequireJS\n    else if (true) {\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n            return async;\n        }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    }\n    // included directly via <script> tag\n    else {\n        root.async = async;\n    }\n\n}());\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(116), __webpack_require__(134).setImmediate))\n\n/***/ }),\n/* 828 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17), __webpack_require__(116)))\n\n/***/ }),\n/* 829 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _superagent = __webpack_require__(183);\n\nvar _superagent2 = _interopRequireDefault(_superagent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportPreferencesActions = {\n    hideTemplates: function hideTemplates(userId, value) {\n        _og_flux.Dispatcher.handleViewAction({\n            actionType: 'HIDE_TEMPLATES',\n            value: value\n        });\n        var reports_preferences = {\n            collapsed_preview_templates: value\n        };\n        userId && _og_api2.default.put('users/' + userId + '/application_preferences', {\n            reports_preferences: reports_preferences\n        }).end();\n    },\n    getTemplatePreferences: function getTemplatePreferences(userId) {\n        if (userId) {\n            _og_api2.default.get('users/' + userId + '/application_preferences').end().then(function (response) {\n                _og_flux.Dispatcher.handleViewAction({\n                    actionType: 'HIDE_TEMPLATES',\n                    value: response.body.reports_preferences && response.body.reports_preferences.collapsed_preview_templates\n                });\n            }).catch(function () {\n                _og_flux.Dispatcher.handleViewAction({\n                    actionType: 'HIDE_TEMPLATES',\n                    value: false\n                });\n            });\n        } else {\n            _og_flux.Dispatcher.handleViewAction({\n                actionType: 'HIDE_TEMPLATES',\n                value: false\n            });\n        }\n    },\n    updateKeywords: function updateKeywords(reportId, keywords) {\n        _superagent2.default.post('api/v3/reports/' + reportId + '/keywords', {\n            keywords: keywords\n        }).end();\n    },\n    deleteKeywords: function deleteKeywords(reportId, keywords) {\n        var deleteKeywords = keywords.map(function (keyword) {\n            return 'keywords[]=' + encodeURIComponent(keyword);\n        });\n        var deleteKeywordParams = deleteKeywords.join('&');\n        _superagent2.default.del('api/v3/reports/' + reportId + '/keywords/destroy_multiple?' + deleteKeywordParams).end();\n    }\n};\nexports.default = ReportPreferencesActions;\n\n/***/ }),\n/* 830 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar request = __webpack_require__(183);\nvar Promise = __webpack_require__(256);\nvar uuid = __webpack_require__(503);\nvar _ = __webpack_require__(3);\n\nvar OgApi = function () {\n  function OgApi(url) {\n    _classCallCheck(this, OgApi);\n\n    if (!url) {\n      throw new Error('OgApi requires a url');\n    }\n\n    this._apiUrl = url;\n    this._middleware = [];\n  }\n\n  _createClass(OgApi, [{\n    key: 'get',\n    value: function get() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return this._request('get', args);\n    }\n  }, {\n    key: 'post',\n    value: function post() {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return this._request('post', args);\n    }\n  }, {\n    key: 'put',\n    value: function put() {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return this._request('put', args);\n    }\n  }, {\n    key: 'del',\n    value: function del() {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return this._request('del', args);\n    }\n  }, {\n    key: 'use',\n    value: function use(middleware) {\n      this._middleware.push(middleware);\n      return this;\n    }\n  }, {\n    key: '_request',\n    value: function _request(method, args) {\n      var _this = this;\n\n      var lastIndex = args.length;\n      var data;\n      var callback;\n\n      function lastArgument() {\n        return lastIndex ? args[lastIndex - 1] : null;\n      }\n\n      function popArgument() {\n        var arg = lastArgument();\n        if (lastIndex) {\n          lastIndex -= 1;\n        }\n        return arg;\n      }\n\n      if (_.isFunction(lastArgument())) {\n        callback = popArgument();\n      }\n\n      if (_.isObject(lastArgument())) {\n        data = popArgument();\n      }\n\n      var url = this._apiUrl;\n\n      if (lastIndex) {\n        url += '/' + args.slice(0, lastIndex).join('/');\n      }\n\n      var req = request[method](url).set('Accept', 'application/json').set('X-REQUEST-ID', uuid.generate());\n\n      req.use(function (context) {\n        _this._middleware.forEach(function (middleware) {\n          if (_.isFunction(middleware)) {\n            middleware(context);\n          }\n        });\n      });\n\n      if (data) {\n        switch (method) {\n          case 'get':\n          case 'del':\n            req.query(data);\n            break;\n          case 'post':\n          case 'put':\n            req.send(data);\n            break;\n          default:\n            throw new Error('OgApi: Unsupported HTTP request method: ' + method);\n        }\n      }\n\n      /**\n       * returns a promise that is rejected on socket errors and responses\n       * that have a 4xx or 5xx status code\n       *\n       * @param cb\n       */\n      var createPromise = function createPromise(cb) {\n        return new Promise(function (resolve, reject) {\n          cb(function (requestError, requestResponse) {\n            if (requestError) {\n              reject({ requestError: requestError, requestResponse: requestResponse });\n            } else {\n              resolve(requestResponse);\n            }\n          });\n        });\n      };\n\n      if (callback) {\n        return req.end(callback);\n      }\n\n      var end = req.end.bind(req);\n      req.end = function (cb) {\n        return cb ? end(cb) : createPromise(end);\n      };\n      return req;\n    }\n  }]);\n\n  return OgApi;\n}();\n\nmodule.exports = OgApi;\n\n/***/ }),\n/* 831 */\n/***/ (function(module, exports) {\n\n\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n\n\n/***/ }),\n/* 832 */\n/***/ (function(module, exports) {\n\n\n/**\n * Reduce `arr` with `fn`.\n *\n * @param {Array} arr\n * @param {Function} fn\n * @param {Mixed} initial\n *\n * TODO: combatible error handling?\n */\n\nmodule.exports = function(arr, fn, initial){  \n  var idx = 0;\n  var len = arr.length;\n  var curr = arguments.length == 3\n    ? initial\n    : arr[idx++];\n\n  while (idx < len) {\n    curr = fn.call(null, curr, arr[idx], ++idx, arr);\n  }\n  \n  return curr;\n};\n\n/***/ }),\n/* 833 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports = module.exports;\n\n/**\n * Generates a UUID\n * @returns {string}\n */\nexports.generate = function () {\n  var lut = [];\n  for(var i = 0; i < 256; i++) {\n    lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n  }\n\n  var d0 = Math.random() * 0xffffffff | 0;\n  var d1 = Math.random() * 0xffffffff | 0;\n  var d2 = Math.random() * 0xffffffff | 0;\n  var d3 = Math.random() * 0xffffffff | 0;\n\n  return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +\n    lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +\n    lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n    lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];\n};\n\n/***/ }),\n/* 834 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Hijacks request.prototype.end to enabled request retries.\n * intervalFunction will default to exponential back-off.\n *\n * usage:\n * middleware(maxAttempts, intervalFunction, retryCondition)\n * middleware(maxAttempts, intervalFunction)\n * middleware(maxAttempts);\n * middleware()\n *\n * @param [maxAttempts=3]\n * @param [intervalFunction]\n * @param [retryCondition]\n * @returns {Function}\n */\nvar middleware = function middleware(maxAttempts, intervalFunction, retryCondition) {\n  maxAttempts = maxAttempts || 3;\n\n  return function (context) {\n    var interval;\n    var request = {};\n    var attempts = 0;\n\n    /**\n     * exponentially increases the interval between retries\n     *\n     * @param currentAttempts\n     * @returns {number}\n     */\n    var exponential = function exponential(currentAttempts) {\n      return Math.pow(2, currentAttempts) * 1000;\n    };\n\n    var nextInterval = intervalFunction || exponential;\n\n    /**\n     * Makes another request using the original request function\n     *\n     * @private\n     */\n    var tick = function tick() {\n\n      if (doRetry()) {\n\n        attempts += 1;\n        request.context.url = request.url;\n\n        request.end(function (error, response) {\n          request.response = response;\n          request.error = error;\n\n          if (response && response.ok || !doRetry()) {\n            complete();\n          }\n        });\n      } else {\n        complete();\n      }\n    };\n\n    /**\n     * Prevents future attempts and invokes the callback\n     * from the original request\n     *\n     * @private\n     */\n    var complete = function complete() {\n\n      request.callback.call(request.context, request.error, request.response);\n\n      clearTimeout(interval);\n    };\n\n    /**\n     * Determines if a retry should be done, attempts to use the retryCondition\n     * supplied on initialization.\n     *\n     * @private\n     * @returns {boolean}\n     */\n    var doRetry = function doRetry() {\n\n      var attemptsRemaining = attempts < maxAttempts;\n\n      if (retryCondition) {\n        return attemptsRemaining && retryCondition(request);\n      }\n\n      var isSocketError = !request.response;\n      var isPost = request.context.method === 'POST';\n      var isServerError = request.response && request.response.serverError;\n      var isClientError = request.response && request.response.status === 429;\n\n      return attemptsRemaining && !isPost && (isSocketError || isServerError || isClientError);\n    };\n\n    var end = context.end.bind(context);\n    var url = context.url;\n\n    context.end = function (callback) {\n\n      end(function (error, response) {\n\n        request = {\n          url: url,\n          end: end,\n          error: error,\n          context: context,\n          callback: callback,\n          response: response\n        };\n\n        if (response && response.ok) {\n          return complete();\n        }\n\n        var initTick = function initTick() {\n          interval = setTimeout(initTick, nextInterval(attempts));\n          tick();\n        };\n\n        initTick();\n      });\n\n      return context;\n    };\n  };\n};\n\nmodule.exports = middleware;\n\n/***/ }),\n/* 835 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar TreeView = (function (_React$PureComponent) {\n  _inherits(TreeView, _React$PureComponent);\n\n  function TreeView(props) {\n    _classCallCheck(this, TreeView);\n\n    _get(Object.getPrototypeOf(TreeView.prototype), 'constructor', this).call(this, props);\n\n    this.state = {\n      collapsed: props.defaultCollapsed\n    };\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  _createClass(TreeView, [{\n    key: 'handleClick',\n    value: function handleClick() {\n      this.setState({ collapsed: !this.state.collapsed });\n      if (this.props.onClick) {\n        var _props;\n\n        (_props = this.props).onClick.apply(_props, arguments);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props;\n      var _props2$collapsed = _props2.collapsed;\n      var collapsed = _props2$collapsed === undefined ? this.state.collapsed : _props2$collapsed;\n      var _props2$className = _props2.className;\n      var className = _props2$className === undefined ? '' : _props2$className;\n      var _props2$itemClassName = _props2.itemClassName;\n      var itemClassName = _props2$itemClassName === undefined ? '' : _props2$itemClassName;\n      var _props2$treeViewClassName = _props2.treeViewClassName;\n      var treeViewClassName = _props2$treeViewClassName === undefined ? '' : _props2$treeViewClassName;\n      var _props2$childrenClassName = _props2.childrenClassName;\n      var childrenClassName = _props2$childrenClassName === undefined ? '' : _props2$childrenClassName;\n      var nodeLabel = _props2.nodeLabel;\n      var children = _props2.children;\n      var defaultCollapsed = _props2.defaultCollapsed;\n\n      var rest = _objectWithoutProperties(_props2, ['collapsed', 'className', 'itemClassName', 'treeViewClassName', 'childrenClassName', 'nodeLabel', 'children', 'defaultCollapsed']);\n\n      var arrowClassName = 'tree-view_arrow';\n      var containerClassName = 'tree-view_children';\n      if (collapsed) {\n        arrowClassName += ' tree-view_arrow-collapsed';\n        containerClassName += ' tree-view_children-collapsed';\n      }\n\n      var arrow = _react2['default'].createElement('div', _extends({}, rest, {\n        className: className + ' ' + arrowClassName,\n        onClick: this.handleClick\n      }));\n\n      return _react2['default'].createElement(\n        'div',\n        { className: 'tree-view ' + treeViewClassName },\n        _react2['default'].createElement(\n          'div',\n          { className: 'tree-view_item ' + itemClassName },\n          arrow,\n          nodeLabel\n        ),\n        _react2['default'].createElement(\n          'div',\n          { className: containerClassName + ' ' + childrenClassName },\n          collapsed ? null : children\n        )\n      );\n    }\n  }]);\n\n  return TreeView;\n})(_react2['default'].PureComponent);\n\nexports['default'] = TreeView;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 836 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IconBlock = (0, _createReactClass2.default)({\n    displayName: 'IconBlock',\n    render: function render() {\n        return _react2.default.createElement(\"span\", null, _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-graphtype-line-1\" }), _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-px-balance-1\" }), _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-graphtype-stacked-bar\" }), _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-graphtype-pie\" }), _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-graphtype-stacked\" }), _react2.default.createElement(\"span\", { className: \"locked-feature__graphic icon-table-1\" }));\n    }\n});\nvar LockedReportCreationModal = (0, _createReactClass2.default)({\n    displayName: 'LockedReportCreationModal',\n    getInitialState: function getInitialState() {\n        return {\n            interest: false\n        };\n    },\n    handleInterest: function handleInterest() {\n        this.setState({ interest: true });\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper\" }, _react2.default.createElement(\"div\", { className: \"ui-modal locked-feature__modal\" }, _react2.default.createElement(\"div\", { className: \"locked-feature__graphics__wrapper\" }, _react2.default.createElement(\"h2\", null, \"Create a New Report\"), _react2.default.createElement(\"div\", { className: \"locked-feature__graphics\" }, _lodash2.default.times(20, function (i) {\n            return _react2.default.createElement(IconBlock, { key: i });\n        }))), !this.state.interest ? _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"p\", null, 'This feature enables you to create new reports with your financial data. For example, the City of Sausalito recently used this feature to create their Treasurer\\u2019s Report.\\xA0', _react2.default.createElement(\"strong\", null, _react2.default.createElement(\"a\", { href: \"https://controlpanel.opengov.com/network/reports#/sausalitoca/1209/breakdown=types&accountType=assets&graph=pie&selection=05C54EA43974269FEC39797745B31713&legendSort=desc&saved_view=null&selectedDataSetIndex=11&fiscal_start=earliest&fiscal_end=latest\", target: \"_blank\" }, 'View the Sausalito Treasurer\\u2019s Report'))), _react2.default.createElement(\"p\", null, \"You can use this feature to create any financial report, including your long-term financial plan, balance sheets, and many others. Ready to create a new report?\")) : _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"h3\", null, \"Great, thanks for your interest!\"), _react2.default.createElement(\"p\", null, \"Please contact your internal OpenGov administrator to receive access.\")), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, !this.state.interest ? _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: this.props.closeModal }, \"No, thanks\"), _react2.default.createElement(\"button\", { id: \"click_locked_report\", className: \"ui-button primary\", onClick: this.handleInterest }, \"Yes, tell me more!\")) : _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.props.closeModal }, \"Okay\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n    }\n});\nexports.default = LockedReportCreationModal;\n\n/***/ }),\n/* 837 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar creatReportButtonText = 'Create New Report';\nvar CreateNewReportButton = function CreateNewReportButton(_ref) {\n    var canCreateReport = _ref.canCreateReport,\n        onClick = _ref.onClick,\n        newReportHref = _ref.newReportHref;\n\n    return canCreateReport ? _react2.default.createElement(\"a\", { href: newReportHref, className: \"ui-button primary\" }, creatReportButtonText) : _react2.default.createElement(\"a\", { className: \"ui-button icon-lock-1\", onClick: onClick }, '\\xA0', creatReportButtonText);\n};\nexports.default = CreateNewReportButton;\n\n/***/ }),\n/* 838 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Redirect to auth url to trigger login.\nvar authCallbackURI = 'https://opengov.civicdashboards.com/auth/opengov/callback';\nvar styles = {\n    buttonStyle: {\n        position: 'relative',\n        marginRight: 10,\n        border: 'none',\n        boxShadow: 'none',\n        background: 'none'\n    },\n    svgStyle: {\n        marginBottom: '-0.1678em',\n        marginLeft: 2\n    },\n    svgPathStyle: {\n        fill: 'currentColor',\n        opacity: 0.42\n    }\n};\nvar LinkToCivicDashboardsButton = function LinkToCivicDashboardsButton() {\n    return _react2.default.createElement(\"a\", { href: '' + authCallbackURI, className: \"ui-button default civic-dashboards-link\", style: styles.buttonStyle, target: \"blank\", id: \"civicdashboards-link\" }, \"Performance Dashboards\", _react2.default.createElement(\"svg\", { version: \"1.1\", id: \"Layer_1\", xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", xmlSpace: \"preserve\", viewBox: \"0 0 100 125\", x: \"0px\", y: \"0px\", height: \"15px\", width: \"15px\", style: styles.svgStyle }, _react2.default.createElement(\"g\", null, _react2.default.createElement(\"path\", { style: styles.svgPathStyle, d: \"M90.5,15H61.8c-2.3,0-4.2,1.9-4.2,4.2s1.9,4.2,4.2,4.2h19.1L40,64.2c-1.6,1.6-1.6,4.3,0,5.9c0.8,0.8,1.9,1.2,2.9,1.2s2.1-0.4,2.9-1.2l40.4-40.4v18.2c0,2.3,1.9,4.2,4.2,4.2s4.2-1.9,4.2-4.2V19.2C94.6,16.9,92.8,15,90.5,15z\" }), _react2.default.createElement(\"path\", { style: styles.svgPathStyle, d: \"M76.1,57c-2.3,0-4.2,1.9-4.2,4.2V94c0,1.5-1.3,2.8-2.8,2.8H16c-1.5,0-2.8-1.3-2.8-2.8V40.9c0-1.5,1.3-2.8,2.8-2.8h33c2.3,0,4.2-1.9,4.2-4.2c0-2.3-1.9-4.2-4.2-4.2H16c-6.1,0-11.1,5-11.1,11.1V94c0,6.1,5,11.1,11.1,11.1h53.1c6.1,0,11.1-5,11.1-11.1V61.1C80.2,58.8,78.4,57,76.1,57z\" }))));\n};\nexports.default = LinkToCivicDashboardsButton;\n\n/***/ }),\n/* 839 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar initialPreferencesState = _immutable2.default.fromJS({\n    hideTemplates: null,\n    loadingHideTemplates: true\n});\nvar ReportPreferencesStore = new _og_flux.ImmutableStore({\n    getInitialState: function getInitialState() {\n        return initialPreferencesState;\n    },\n\n    actions: {\n        HIDE_TEMPLATES: function HIDE_TEMPLATES(state, action) {\n            return state.mergeDeep((0, _immutable.fromJS)({\n                hideTemplates: action.value,\n                loadingHideTemplates: false\n            }));\n        }\n    }\n});\nexports.default = ReportPreferencesStore;\n\n/***/ }),\n/* 840 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _cookie_helper = __webpack_require__(262);\n\nvar _cookie_helper2 = _interopRequireDefault(_cookie_helper);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportWelcome = (0, _createReactClass2.default)({\n    displayName: 'ReportWelcome',\n\n    propTypes: {\n        entityName: _propTypes2.default.string,\n        entityDisplayName: _propTypes2.default.string,\n        userRole: _propTypes2.default.string\n    },\n    _hideModal: function _hideModal() {\n        _cookie_helper2.default.setVisitedCookie('reports_visited');\n        _report_actions2.default.hideReportWelcomeModal();\n    },\n    _includesAdmin: function _includesAdmin(userRole) {\n        return userRole.indexOf('admin') > -1;\n    },\n    render: function render() {\n        var entityAdminContent = _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-row\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/share.svg'), className: \"welcome_row_image\" }), \"Consolidate accounting and performance data\"), _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/multi-report.svg'), className: \"welcome_row_image\" }), \"Create and share interactive reports\")), _react2.default.createElement(\"div\", { className: \"ui-row\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/visualize.svg'), className: \"welcome_row_image\" }), \"Explore data and gain meaningful insights\"), _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/report.svg'), className: \"welcome_row_image\" }), \"Compare yourself to other governments\")));\n        var entityUserContent = _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-row\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/multi-report.svg'), className: \"welcome_row_image\" }), \"Review your current operating results\"), _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/report.svg'), className: \"welcome_row_image\" }), \"Compare yourself to other governments\")), _react2.default.createElement(\"div\", { className: \"ui-row\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/table.svg'), className: \"welcome_row_image\" }), \"Research historical budgets and actuals\"), _react2.default.createElement(\"div\", { className: \"ui-col-3of6\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/checks.svg'), className: \"welcome_row_image\" }), \"Explore vendor and check details\")));\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper modal_report_welcome open\", id: \"overlay-modal_welcome\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"div\", { className: \"welcome_report_sidebar\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/modal/og-logo-01.svg'), className: \"welcome_sidebar_logo\" })), _react2.default.createElement(\"div\", { className: \"welcome_report_content\" }, _react2.default.createElement(\"p\", { className: \"welcome_report_city_title\" }, this.props.entityDisplayName.toUpperCase()), _react2.default.createElement(\"p\", { className: \"welcome_report_title\" }, _react2.default.createElement(\"b\", null, \"Welcome to OpenGov,\"), \" \", this.props.entityDisplayName + '\\'s', \" platform for analyzing, sharing, and comparing financial and performance data.\"), this._includesAdmin(this.props.userRole) ? entityAdminContent : entityUserContent, _react2.default.createElement(\"div\", { className: \"welcome_report_action\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this._hideModal }, \"Get Started\", _react2.default.createElement(\"i\", { className: \"icon-righthead-3\" })))))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\", onClick: this._hideModal }));\n    }\n});\nexports.default = ReportWelcome;\n\n/***/ }),\n/* 841 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n  initialize: function initialize() {\n    /* jshint ignore:start */\n    (function (i, s, o, g, r, a, m) {\n      i['GoogleAnalyticsObject'] = r;\n      i[r] = i[r] || function () {\n        (i[r].q = i[r].q || []).push(arguments);\n      }, i[r].l = 1 * new Date();\n      a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n      a.async = 1;\n      a.src = g;\n      m.parentNode.insertBefore(a, m);\n    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\n    /* jshint ignore:end */\n  },\n\n  ga: function ga() {\n    window.ga.apply(window, arguments);\n  }\n};\n\n/***/ }),\n/* 842 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.initialize = function (projectId) {\n  /* jshint ignore:start */\n  window.heap = window.heap || [], heap.load = function (e, t) {\n    window.heap.appid = e, window.heap.config = t = t || {};var r = t.forceSSL || \"https:\" === document.location.protocol,\n        a = document.createElement(\"script\");a.type = \"text/javascript\", a.async = !0, a.src = (r ? \"https:\" : \"http:\") + \"//cdn.heapanalytics.com/js/heap-\" + e + \".js\";var n = document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(a, n);for (var o = function o(e) {\n      return function () {\n        heap.push([e].concat(Array.prototype.slice.call(arguments, 0)));\n      };\n    }, p = [\"addEventProperties\", \"addUserProperties\", \"clearEventProperties\", \"identify\", \"removeEventProperty\", \"setEventProperties\", \"track\", \"unsetEventProperty\"], c = 0; c < p.length; c++) {\n      heap[p[c]] = o(p[c]);\n    }\n  };\n\n  heap.load(projectId);\n  /* jshint ignore:end */\n};\n\n/***/ }),\n/* 843 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar isObjectTypeTag = function isObjectTypeTag(value, tag) {\n  return (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' || false) && Object.prototype.toString.call(value) == tag;\n};\n\nmodule.exports = {\n\n  isNull: function isNull(value) {\n    return value === null;\n  },\n\n  isArray: function isArray(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === '[object Array]';\n  },\n\n  isNumber: function isNumber(value) {\n    return typeof value == 'number' || isObjectTypeTag(value, '[object Number]') || false;\n  },\n\n  isString: function isString(value) {\n    return typeof value == 'string' || isObjectTypeTag(value, '[object String]') || false;\n  },\n\n  isObject: function isObject(value) {\n    return typeof value == 'function' || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' || false;\n  },\n\n  isBoolean: function isBoolean(value) {\n    return value === true || value === false || isObjectTypeTag(value, '[object Boolean]') || false;\n  },\n\n  isUndefined: function isUndefined(value) {\n    return typeof value == 'undefined';\n  }\n\n};\n\n/***/ }),\n/* 844 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! Raven.js 1.3.0 (768fdca) | github.com/getsentry/raven-js */\n\n/*\n * Includes TraceKit\n * https://github.com/getsentry/TraceKit\n *\n * Copyright 2015 Matt Robenolt and other contributors\n * Released under the BSD license\n * https://github.com/getsentry/raven-js/blob/master/LICENSE\n *\n */\n;(function(window, undefined){\n'use strict';\n\n/*\n TraceKit - Cross brower stack traces - github.com/occ/TraceKit\n MIT license\n*/\n\nvar TraceKit = {\n    remoteFetching: false,\n    collectWindowErrors: true,\n    // 3 lines before, the offending line, 3 lines after\n    linesOfContext: 7,\n    debug: false\n};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n\nfunction getLocationHref() {\n    if (typeof document === 'undefined')\n        return '';\n\n    return document.location.href;\n};\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *              on top frame; column number is not guaranteed\n *   - Opera:   full stack trace with line and column numbers\n *   - Chrome:  full stack trace with line and column numbers\n *   - Safari:  line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *   - IE:      line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Remove all crash handlers.\n     */\n    function unsubscribeAll() {\n        uninstallGlobalHandler();\n        handlers = [];\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {Object.<string, *>} stack\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (hasKey(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error\n     * occurred.\n     * @param {?(number|string)} colNo The column number at which the error\n     * occurred.\n     * @param {?Error} ex The actual Error object.\n     */\n    function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n            processLastException();\n        } else if (ex) {\n            // New chrome and blink send along a real error object\n            // Let's just report that like a normal error.\n            // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n            stack = TraceKit.computeStackTrace(ex);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n                'url': url,\n                'line': lineNo,\n                'column': colNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n                'message': message,\n                'url': getLocationHref(),\n                'stack': [location]\n            };\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    function installGlobalHandler ()\n    {\n        if (_onErrorHandlerInstalled) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    function uninstallGlobalHandler ()\n    {\n        if (!_onErrorHandlerInstalled) {\n            return;\n        }\n        window.onerror = _oldOnerrorHandler;\n        _onErrorHandlerInstalled = false;\n        _oldOnerrorHandler = undefined;\n    }\n\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @param {?boolean} rethrow If false, do not re-throw the exception.\n     * Only used for window.onerror to not cause an infinite loop of\n     * rethrowing.\n     */\n    function report(ex, rethrow) {\n        var args = _slice.call(arguments, 1);\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = args;\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        if (rethrow !== false) {\n            throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n        }\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    report.uninstall = unsubscribeAll;\n    return report;\n}());\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n *   s.name              - exception name\n *   s.message           - exception message\n *   s.stack[i].url      - JavaScript or HTML file URL\n *   s.stack[i].func     - function name, or empty for anonymous functions (if guessing did not work)\n *   s.stack[i].args     - arguments passed to the function, if known\n *   s.stack[i].line     - line number, if known\n *   s.stack[i].column   - column number, if known\n *   s.stack[i].context  - an array of source code lines; the middle element corresponds to the correct line#\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     */\n    function getSource(url) {\n        if (!isString(url)) return [];\n        if (!hasKey(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            var source = '';\n            var domain = '';\n            try { domain = document.domain; } catch (e) {}\n            if (url.indexOf(domain) !== -1) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     */\n    function findSourceByFunctionBody(func) {\n        if (typeof document === 'undefined')\n            return;\n\n        var urls = [window.location.href],\n            scripts = document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (isUndefined(ex.stack) || !ex.stack) return;\n\n        var chrome = /^\\s*at (.*?) ?\\(?((?:(?:file|https?|chrome-extension):.*?)|<anonymous>):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?@((?:file|https?|chrome).*?):(\\d+)(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|http|https):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : '',\n                    'line': +parts[4],\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else if ((parts = chrome.exec(lines[i]))) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = winjs.exec(lines[i]))) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10 uses this property.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (isUndefined(ex.stacktrace) || !ex.stacktrace) return;\n\n        var testRE = / line (\\d+), column (\\d+) in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\) in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var i = 0, j = lines.length; i < j; i += 2) {\n            if ((parts = testRE.exec(lines[i]))) {\n                var element = {\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : [],\n                    'url': parts[6]\n                };\n\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[i + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack information.\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = document.getElementsByTagName('script'),\n            inlineScriptBlocks = [],\n            parts,\n            i,\n            len,\n            source;\n\n        for (i in scripts) {\n            if (hasKey(scripts, i) && !scripts[i].src) {\n                inlineScriptBlocks.push(scripts[i]);\n            }\n        }\n\n        for (i = 2, len = lines.length; i < len; i += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[i]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'line': +parts[1]\n                };\n            } else if ((parts = lineRE2.exec(lines[i]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4]\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[i]))) {\n                var url = window.location.href.replace(/#.*$/, ''),\n                    line = parts[1];\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i + 1]));\n                source = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'line': source ? source.line : line,\n                    'func': ''\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[i + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[i + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'name': ex.name,\n            'message': lines[0],\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {Object.<string, *>} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref()\n        };\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n\n    return computeStackTrace;\n}());\n\n'use strict';\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nvar _Raven = window.Raven,\n    hasJSON = !!(typeof JSON === 'object' && JSON.stringify),\n    // Raven can run in contexts where there's no document (react-native)\n    hasDocument = typeof document !== 'undefined',\n    lastCapturedException,\n    lastEventId,\n    globalServer,\n    globalKey,\n    globalProject,\n    globalContext = {},\n    globalOptions = {\n        logger: 'javascript',\n        ignoreErrors: [],\n        ignoreUrls: [],\n        whitelistUrls: [],\n        includePaths: [],\n        crossOrigin: 'anonymous',\n        collectWindowErrors: true,\n        maxMessageLength: 100\n    },\n    isRavenInstalled = false,\n    objectPrototype = Object.prototype,\n    // capture references to window.console *and* all its methods first\n    // before the console plugin has a chance to monkey patch\n    originalConsole = window.console || {},\n    originalConsoleMethods = {},\n    plugins = [],\n    startTime = now();\n\nfor (var method in originalConsole) {\n  originalConsoleMethods[method] = originalConsole[method];\n}\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\nvar Raven = {\n    VERSION: '1.3.0',\n\n    debug: false,\n\n    /*\n     * Allow multiple versions of Raven to be installed.\n     * Strip Raven from the global context and returns the instance.\n     *\n     * @return {Raven}\n     */\n    noConflict: function() {\n        window.Raven = _Raven;\n        return Raven;\n    },\n\n    /*\n     * Configure Raven with a DSN and extra options\n     *\n     * @param {string} dsn The public Sentry DSN\n     * @param {object} options Optional set of of global options [optional]\n     * @return {Raven}\n     */\n    config: function(dsn, options) {\n        if (globalServer) {\n            logDebug('error', 'Error: Raven has already been configured');\n            return Raven;\n        }\n        if (!dsn) return Raven;\n\n        var uri = parseDSN(dsn),\n            lastSlash = uri.path.lastIndexOf('/'),\n            path = uri.path.substr(1, lastSlash);\n\n        // merge in options\n        if (options) {\n            each(options, function(key, value){\n                // tags and extra are special and need to be put into context\n                if (key == 'tags' || key == 'extra') {\n                    globalContext[key] = value;\n                } else {\n                    globalOptions[key] = value;\n                }\n            });\n        }\n\n        // \"Script error.\" is hard coded into browsers for errors that it can't read.\n        // this is the result of a script being pulled in from an external domain and CORS.\n        globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n        globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n        // join regexp rules into one big rule\n        globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n        globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp(globalOptions.ignoreUrls) : false;\n        globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp(globalOptions.whitelistUrls) : false;\n        globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n\n        globalKey = uri.user;\n        globalProject = uri.path.substr(lastSlash + 1);\n\n        // assemble the endpoint from the uri pieces\n        globalServer = '//' + uri.host +\n                      (uri.port ? ':' + uri.port : '') +\n                      '/' + path + 'api/' + globalProject + '/store/';\n\n        if (uri.protocol) {\n            globalServer = uri.protocol + ':' + globalServer;\n        }\n\n        if (globalOptions.fetchContext) {\n            TraceKit.remoteFetching = true;\n        }\n\n        if (globalOptions.linesOfContext) {\n            TraceKit.linesOfContext = globalOptions.linesOfContext;\n        }\n\n        TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n        // return for chaining\n        return Raven;\n    },\n\n    /*\n     * Installs a global window.onerror error handler\n     * to capture and report uncaught exceptions.\n     * At this point, install() is required to be called due\n     * to the way TraceKit is set up.\n     *\n     * @return {Raven}\n     */\n    install: function() {\n        if (isSetup() && !isRavenInstalled) {\n            TraceKit.report.subscribe(handleStackInfo);\n\n            // Install all of the plugins\n            each(plugins, function(_, plugin) {\n                plugin();\n            });\n\n            isRavenInstalled = true;\n        }\n\n        return Raven;\n    },\n\n    /*\n     * Wrap code within a context so Raven can capture errors\n     * reliably across domains that is executed immediately.\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The callback to be immediately executed within the context\n     * @param {array} args An array of arguments to be called with the callback [optional]\n     */\n    context: function(options, func, args) {\n        if (isFunction(options)) {\n            args = func || [];\n            func = options;\n            options = undefined;\n        }\n\n        return Raven.wrap(options, func).apply(this, args);\n    },\n\n    /*\n     * Wrap code within a context and returns back a new function to be executed\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The function to be wrapped in a new context\n     * @return {function} The newly wrapped functions with a context\n     */\n    wrap: function(options, func) {\n        // 1 argument has been passed, and it's not a function\n        // so just return it\n        if (isUndefined(func) && !isFunction(options)) {\n            return options;\n        }\n\n        // options is optional\n        if (isFunction(options)) {\n            func = options;\n            options = undefined;\n        }\n\n        // At this point, we've passed along 2 arguments, and the second one\n        // is not a function either, so we'll just return the second argument.\n        if (!isFunction(func)) {\n            return func;\n        }\n\n        // We don't wanna wrap it twice!\n        if (func.__raven__) {\n            return func;\n        }\n\n        function wrapped() {\n            var args = [], i = arguments.length,\n                deep = !options || options && options.deep !== false;\n            // Recursively wrap all of a function's arguments that are\n            // functions themselves.\n\n            while(i--) args[i] = deep ? Raven.wrap(options, arguments[i]) : arguments[i];\n\n            try {\n                /*jshint -W040*/\n                return func.apply(this, args);\n            } catch(e) {\n                Raven.captureException(e, options);\n                throw e;\n            }\n        }\n\n        // copy over properties of the old function\n        for (var property in func) {\n            if (hasKey(func, property)) {\n                wrapped[property] = func[property];\n            }\n        }\n        wrapped.prototype = func.prototype;\n\n        // Signal that this function has been wrapped already\n        // for both debugging and to prevent it to being wrapped twice\n        wrapped.__raven__ = true;\n        wrapped.__inner__ = func;\n\n        return wrapped;\n    },\n\n    /*\n     * Uninstalls the global error handler.\n     *\n     * @return {Raven}\n     */\n    uninstall: function() {\n        TraceKit.report.uninstall();\n        isRavenInstalled = false;\n\n        return Raven;\n    },\n\n    /*\n     * Manually capture an exception and send it over to Sentry\n     *\n     * @param {error} ex An exception to be logged\n     * @param {object} options A specific set of options for this error [optional]\n     * @return {Raven}\n     */\n    captureException: function(ex, options) {\n        // If not an Error is passed through, recall as a message instead\n        if (!isError(ex)) return Raven.captureMessage(ex, options);\n\n        // Store the raw exception object for potential debugging and introspection\n        lastCapturedException = ex;\n\n        // TraceKit.report will re-raise any exception passed to it,\n        // which means you have to wrap it in try/catch. Instead, we\n        // can wrap it here and only re-raise if TraceKit.report\n        // raises an exception different from the one we asked to\n        // report on.\n        try {\n            var stack = TraceKit.computeStackTrace(ex);\n            handleStackInfo(stack, options);\n        } catch(ex1) {\n            if(ex !== ex1) {\n                throw ex1;\n            }\n        }\n\n        return Raven;\n    },\n\n    /*\n     * Manually send a message to Sentry\n     *\n     * @param {string} msg A plain message to be captured in Sentry\n     * @param {object} options A specific set of options for this message [optional]\n     * @return {Raven}\n     */\n    captureMessage: function(msg, options) {\n        // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n        // early call; we'll error on the side of logging anything called before configuration since it's\n        // probably something you should see:\n        if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(msg)) {\n            return;\n        }\n\n        // Fire away!\n        send(\n            objectMerge({\n                message: msg + ''  // Make sure it's actually a string\n            }, options)\n        );\n\n        return Raven;\n    },\n\n    addPlugin: function(plugin) {\n        plugins.push(plugin);\n        if (isRavenInstalled) plugin();\n        return Raven;\n    },\n\n    /*\n     * Set/clear a user to be sent along with the payload.\n     *\n     * @param {object} user An object representing user data [optional]\n     * @return {Raven}\n     */\n    setUserContext: function(user) {\n        // Intentionally do not merge here since that's an unexpected behavior.\n        globalContext.user = user;\n\n        return Raven;\n    },\n\n    /*\n     * Merge extra attributes to be sent along with the payload.\n     *\n     * @param {object} extra An object representing extra data [optional]\n     * @return {Raven}\n     */\n    setExtraContext: function(extra) {\n        mergeContext('extra', extra);\n\n        return Raven;\n    },\n\n    /*\n     * Merge tags to be sent along with the payload.\n     *\n     * @param {object} tags An object representing tags [optional]\n     * @return {Raven}\n     */\n    setTagsContext: function(tags) {\n        mergeContext('tags', tags);\n\n        return Raven;\n    },\n\n    /*\n     * Clear all of the context.\n     *\n     * @return {Raven}\n     */\n    clearContext: function() {\n        globalContext = {};\n\n        return Raven;\n    },\n\n    /*\n     * Get a copy of the current context. This cannot be mutated.\n     *\n     * @return {object} copy of context\n     */\n    getContext: function() {\n        // lol javascript\n        return JSON.parse(JSON.stringify(globalContext));\n    },\n\n    /*\n     * Set release version of application\n     *\n     * @param {string} release Typically something like a git SHA to identify version\n     * @return {Raven}\n     */\n    setRelease: function(release) {\n        globalOptions.release = release;\n\n        return Raven;\n    },\n\n    /*\n     * Set the dataCallback option\n     *\n     * @param {function} callback The callback to run which allows the\n     *                            data blob to be mutated before sending\n     * @return {Raven}\n     */\n    setDataCallback: function(callback) {\n        globalOptions.dataCallback = callback;\n\n        return Raven;\n    },\n\n    /*\n     * Set the shouldSendCallback option\n     *\n     * @param {function} callback The callback to run which allows\n     *                            introspecting the blob before sending\n     * @return {Raven}\n     */\n    setShouldSendCallback: function(callback) {\n        globalOptions.shouldSendCallback = callback;\n\n        return Raven;\n    },\n\n    /**\n     * Override the default HTTP transport mechanism that transmits data\n     * to the Sentry server.\n     *\n     * @param {function} transport Function invoked instead of the default\n     *                             `makeRequest` handler.\n     *\n     * @return {Raven}\n     */\n    setTransport: function(transport) {\n        globalOptions.transport = transport;\n\n        return Raven;\n    },\n\n    /*\n     * Get the latest raw exception that was captured by Raven.\n     *\n     * @return {error}\n     */\n    lastException: function() {\n        return lastCapturedException;\n    },\n\n    /*\n     * Get the last event id\n     *\n     * @return {string}\n     */\n    lastEventId: function() {\n        return lastEventId;\n    },\n\n    /*\n     * Determine if Raven is setup and ready to go.\n     *\n     * @return {boolean}\n     */\n    isSetup: function() {\n        return isSetup();\n    }\n};\n\n// Deprecations\nRaven.setUser = Raven.setUserContext;\nRaven.setReleaseContext = Raven.setRelease;\n\nfunction triggerEvent(eventType, options) {\n    // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n    var evt, key;\n\n    if (!hasDocument)\n        return;\n\n    options = options || {};\n\n    eventType = 'raven' + eventType.substr(0,1).toUpperCase() + eventType.substr(1);\n\n    if (document.createEvent) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(eventType, true, true);\n    } else {\n        evt = document.createEventObject();\n        evt.eventType = eventType;\n    }\n\n    for (key in options) if (hasKey(options, key)) {\n        evt[key] = options[key];\n    }\n\n    if (document.createEvent) {\n        // IE9 if standards\n        document.dispatchEvent(evt);\n    } else {\n        // IE8 regardless of Quirks or Standards\n        // IE9 if quirks\n        try {\n            document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n        } catch(e) {}\n    }\n}\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n    dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction RavenConfigError(message) {\n    this.name = 'RavenConfigError';\n    this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\n/**** Private functions ****/\nfunction parseDSN(str) {\n    var m = dsnPattern.exec(str),\n        dsn = {},\n        i = 7;\n\n    try {\n        while (i--) dsn[dsnKeys[i]] = m[i] || '';\n    } catch(e) {\n        throw new RavenConfigError('Invalid DSN: ' + str);\n    }\n\n    if (dsn.pass)\n        throw new RavenConfigError('Do not specify your private key in the DSN!');\n\n    return dsn;\n}\n\nfunction isUndefined(what) {\n    return what === void 0;\n}\n\nfunction isFunction(what) {\n    return typeof what === 'function';\n}\n\nfunction isString(what) {\n    return objectPrototype.toString.call(what) === '[object String]';\n}\n\nfunction isObject(what) {\n    return typeof what === 'object' && what !== null;\n}\n\nfunction isEmptyObject(what) {\n    for (var k in what) return false;\n    return true;\n}\n\n// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560\n// with some tiny modifications\nfunction isError(what) {\n    return isObject(what) &&\n        objectPrototype.toString.call(what) === '[object Error]' ||\n        what instanceof Error;\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n    return objectPrototype.hasOwnProperty.call(object, key);\n}\n\nfunction each(obj, callback) {\n    var i, j;\n\n    if (isUndefined(obj.length)) {\n        for (i in obj) {\n            if (hasKey(obj, i)) {\n                callback.call(null, i, obj[i]);\n            }\n        }\n    } else {\n        j = obj.length;\n        if (j) {\n            for (i = 0; i < j; i++) {\n                callback.call(null, i, obj[i]);\n            }\n        }\n    }\n}\n\nfunction handleStackInfo(stackInfo, options) {\n    var frames = [];\n\n    if (stackInfo.stack && stackInfo.stack.length) {\n        each(stackInfo.stack, function(i, stack) {\n            var frame = normalizeFrame(stack);\n            if (frame) {\n                frames.push(frame);\n            }\n        });\n    }\n\n    triggerEvent('handle', {\n        stackInfo: stackInfo,\n        options: options\n    });\n\n    processException(\n        stackInfo.name,\n        stackInfo.message,\n        stackInfo.url,\n        stackInfo.lineno,\n        frames,\n        options\n    );\n}\n\nfunction normalizeFrame(frame) {\n    if (!frame.url) return;\n\n    // normalize the frames data\n    var normalized = {\n        filename:   frame.url,\n        lineno:     frame.line,\n        colno:      frame.column,\n        'function': frame.func || '?'\n    }, context = extractContextFromFrame(frame), i;\n\n    if (context) {\n        var keys = ['pre_context', 'context_line', 'post_context'];\n        i = 3;\n        while (i--) normalized[keys[i]] = context[i];\n    }\n\n    normalized.in_app = !( // determine if an exception came from outside of our app\n        // first we check the global includePaths list.\n        (!!globalOptions.includePaths.test && !globalOptions.includePaths.test(normalized.filename)) ||\n        // Now we check for fun, if the function name is Raven or TraceKit\n        /(Raven|TraceKit)\\./.test(normalized['function']) ||\n        // finally, we do a last ditch effort and check for raven.min.js\n        /raven\\.(min\\.)?js$/.test(normalized.filename)\n    );\n\n    return normalized;\n}\n\nfunction extractContextFromFrame(frame) {\n    // immediately check if we should even attempt to parse a context\n    if (!frame.context || !globalOptions.fetchContext) return;\n\n    var context = frame.context,\n        pivot = ~~(context.length / 2),\n        i = context.length, isMinified = false;\n\n    while (i--) {\n        // We're making a guess to see if the source is minified or not.\n        // To do that, we make the assumption if *any* of the lines passed\n        // in are greater than 300 characters long, we bail.\n        // Sentry will see that there isn't a context\n        if (context[i].length > 300) {\n            isMinified = true;\n            break;\n        }\n    }\n\n    if (isMinified) {\n        // The source is minified and we don't know which column. Fuck it.\n        if (isUndefined(frame.column)) return;\n\n        // If the source is minified and has a frame column\n        // we take a chunk of the offending line to hopefully shed some light\n        return [\n            [],  // no pre_context\n            context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column\n            []   // no post_context\n        ];\n    }\n\n    return [\n        context.slice(0, pivot),    // pre_context\n        context[pivot],             // context_line\n        context.slice(pivot + 1)    // post_context\n    ];\n}\n\nfunction processException(type, message, fileurl, lineno, frames, options) {\n    var stacktrace, i, fullMessage;\n\n    if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(message)) return;\n\n    message += '';\n    fullMessage = type + ': ' + message;\n\n    if (frames && frames.length) {\n        fileurl = frames[0].filename || fileurl;\n        // Sentry expects frames oldest to newest\n        // and JS sends them as newest to oldest\n        frames.reverse();\n        stacktrace = {frames: frames};\n    } else if (fileurl) {\n        stacktrace = {\n            frames: [{\n                filename: fileurl,\n                lineno: lineno,\n                in_app: true\n            }]\n        };\n    }\n\n    if (!!globalOptions.ignoreUrls.test && globalOptions.ignoreUrls.test(fileurl)) return;\n    if (!!globalOptions.whitelistUrls.test && !globalOptions.whitelistUrls.test(fileurl)) return;\n\n    // Fire away!\n    send(\n        objectMerge({\n            // sentry.interfaces.Exception\n            exception: {\n                values: [{\n                    type: type,\n                    value: message,\n                    stacktrace: stacktrace\n                }]\n            },\n            culprit: fileurl,\n            message: fullMessage\n        }, options)\n    );\n}\n\nfunction objectMerge(obj1, obj2) {\n    if (!obj2) {\n        return obj1;\n    }\n    each(obj2, function(key, value){\n        obj1[key] = value;\n    });\n    return obj1;\n}\n\nfunction truncate(str, max) {\n    return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\nfunction trimPacket(data) {\n    // For now, we only want to truncate the two different messages\n    // but this could/should be expanded to just trim everything\n    var max = globalOptions.maxMessageLength;\n    data.message = truncate(data.message, max);\n    if (data.exception) {\n        var exception = data.exception.values[0];\n        exception.value = truncate(exception.value, max);\n    }\n\n    return data;\n}\n\nfunction now() {\n    return +new Date();\n}\n\nfunction getHttpData() {\n    if (!hasDocument || !document.location || !document.location.href) {\n        return;\n    }\n\n    var httpData = {\n        headers: {\n            'User-Agent': navigator.userAgent\n        }\n    };\n\n    httpData.url = document.location.href;\n\n    if (document.referrer) {\n        httpData.headers.Referer = document.referrer;\n    }\n\n    return httpData;\n}\n\nfunction send(data) {\n    var baseData = {\n        project: globalProject,\n        logger: globalOptions.logger,\n        platform: 'javascript'\n    }, httpData = getHttpData();\n\n    if (httpData) {\n        baseData.request = httpData;\n    }\n\n    data = objectMerge(baseData, data);\n\n    // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n    data.tags = objectMerge(objectMerge({}, globalContext.tags), data.tags);\n    data.extra = objectMerge(objectMerge({}, globalContext.extra), data.extra);\n\n    // Send along our own collected metadata with extra\n    data.extra['session:duration'] = now() - startTime;\n\n    // If there are no tags/extra, strip the key from the payload alltogther.\n    if (isEmptyObject(data.tags)) delete data.tags;\n\n    if (globalContext.user) {\n        // sentry.interfaces.User\n        data.user = globalContext.user;\n    }\n\n    // Include the release if it's defined in globalOptions\n    if (globalOptions.release) data.release = globalOptions.release;\n    // Include server_name if it's defined in globalOptions\n    if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n    if (isFunction(globalOptions.dataCallback)) {\n        data = globalOptions.dataCallback(data) || data;\n    }\n\n    // Why??????????\n    if (!data || isEmptyObject(data)) {\n        return;\n    }\n\n    // Check if the request should be filtered or not\n    if (isFunction(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) {\n        return;\n    }\n\n    // Send along an event_id if not explicitly passed.\n    // This event_id can be used to reference the error within Sentry itself.\n    // Set lastEventId after we know the error should actually be sent\n    lastEventId = data.event_id || (data.event_id = uuid4());\n\n    // Try and clean up the packet before sending by truncating long values\n    data = trimPacket(data);\n\n    logDebug('debug', 'Raven about to send:', data);\n\n    if (!isSetup()) return;\n\n    (globalOptions.transport || makeRequest)({\n        url: globalServer,\n        auth: {\n            sentry_version: '7',\n            sentry_client: 'raven-js/' + Raven.VERSION,\n            sentry_key: globalKey\n        },\n        data: data,\n        options: globalOptions,\n        onSuccess: function success() {\n            triggerEvent('success', {\n                data: data,\n                src: globalServer\n            });\n        },\n        onError: function failure() {\n            triggerEvent('failure', {\n                data: data,\n                src: globalServer\n            });\n        }\n    });\n}\n\nfunction makeRequest(opts) {\n    // Tack on sentry_data to auth options, which get urlencoded\n    opts.auth.sentry_data = JSON.stringify(opts.data);\n\n    var img = newImage(),\n        src = opts.url + '?' + urlencode(opts.auth),\n        crossOrigin = opts.options.crossOrigin;\n\n    if (crossOrigin || crossOrigin === '') {\n        img.crossOrigin = crossOrigin;\n    }\n    img.onload = opts.onSuccess;\n    img.onerror = img.onabort = opts.onError;\n    img.src = src;\n}\n\n// Note: this is shitty, but I can't figure out how to get\n// sinon to stub document.createElement without breaking everything\n// so this wrapper is just so I can stub it for tests.\nfunction newImage() {\n    return document.createElement('img');\n}\n\nvar ravenNotConfiguredError;\n\nfunction isSetup() {\n    if (!hasJSON) return false;  // needs JSON support\n    if (!globalServer) {\n        if (!ravenNotConfiguredError)\n          logDebug('error', 'Error: Raven has not been configured.');\n        ravenNotConfiguredError = true;\n        return false;\n    }\n    return true;\n}\n\nfunction joinRegExp(patterns) {\n    // Combine an array of regular expressions and strings into one large regexp\n    // Be mad.\n    var sources = [],\n        i = 0, len = patterns.length,\n        pattern;\n\n    for (; i < len; i++) {\n        pattern = patterns[i];\n        if (isString(pattern)) {\n            // If it's a string, we need to escape it\n            // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n            sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\"));\n        } else if (pattern && pattern.source) {\n            // If it's a regexp already, we want to extract the source\n            sources.push(pattern.source);\n        }\n        // Intentionally skip other cases\n    }\n    return new RegExp(sources.join('|'), 'i');\n}\n\nfunction uuid4() {\n    var crypto = window.crypto || window.msCrypto;\n\n    if (!isUndefined(crypto) && crypto.getRandomValues) {\n        // Use window.crypto API if available\n        var arr = new Uint16Array(8);\n        crypto.getRandomValues(arr);\n\n        // set 4 in byte 7\n        arr[3] = arr[3] & 0xFFF | 0x4000;\n        // set 2 most significant bits of byte 9 to '10'\n        arr[4] = arr[4] & 0x3FFF | 0x8000;\n\n        var pad = function(num) {\n            var v = num.toString(16);\n            while (v.length < 4) {\n                v = '0' + v;\n            }\n            return v;\n        };\n\n        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) +\n        pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n    } else {\n        // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n        return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n            var r = Math.random()*16|0,\n                v = c == 'x' ? r : (r&0x3|0x8);\n            return v.toString(16);\n        });\n    }\n}\n\nfunction logDebug(level) {\n    if (originalConsoleMethods[level] && Raven.debug) {\n        // _slice is coming from vendor/TraceKit/tracekit.js\n        // so it's accessible globally\n        originalConsoleMethods[level].apply(originalConsole, _slice.call(arguments, 1));\n    }\n}\n\nfunction afterLoad() {\n    // Attempt to initialize Raven on load\n    var RavenConfig = window.RavenConfig;\n    if (RavenConfig) {\n        Raven.config(RavenConfig.dsn, RavenConfig.config).install();\n    }\n}\n\nfunction urlencode(o) {\n    var pairs = [];\n    each(o, function(key, value) {\n        pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n    });\n    return pairs.join('&');\n}\n\nfunction mergeContext(key, context) {\n    if (isUndefined(context)) {\n        delete globalContext[key];\n    } else {\n        globalContext[key] = objectMerge(globalContext[key] || {}, context);\n    }\n}\n\nafterLoad();\n\n// This is being exposed no matter what because there are too many weird\n// usecases for how people use Raven. If this is really a problem, I'm sorry.\nwindow.Raven = Raven;\n\n// Expose Raven to the world\nif (true) {\n    // AMD\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return Raven;\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n} else if (typeof module === 'object') {\n    // browserify\n    module.exports = Raven;\n} else if (typeof exports === 'object') {\n    // CommonJS\n    exports = Raven;\n}\n\n})(typeof window !== 'undefined' ? window : this);\n\n\n/***/ }),\n/* 845 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar location = module.exports = {\n  hostname: window.location.hostname,\n  pathname: window.location.pathname,\n  hash: window.location.hash\n};\n\n/***/ }),\n/* 846 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 847 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MaskActions = {\n    getMasks: function getMasks(coaId) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'MASK_GET_MASKS',\n            coa: coaId\n        });\n        _og_api2.default.get('coa_masks', {\n            coa: coaId,\n            limit: 250 // certain customers have more than 32 masks\n        }).end().then(function (response) {\n            MaskActions.getMasksComplete(response.body.coa_masks);\n        });\n    },\n    getMasksComplete: function getMasksComplete(masks) {\n        _og_flux.Dispatcher.handleServerAction({\n            actionType: 'MASK_GET_MASKS_COMPLETE',\n            masks: masks\n        });\n    }\n};\nexports.default = MaskActions;\n\n/***/ }),\n/* 848 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.LineTotalType = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _immutable = __webpack_require__(14);\n\nvar _render_line = __webpack_require__(849);\n\nvar _render_line2 = _interopRequireDefault(_render_line);\n\nvar _budget_node = __webpack_require__(850);\n\nvar _budget_node2 = _interopRequireDefault(_budget_node);\n\nvar _breakdown = __webpack_require__(504);\n\nvar _breakdown2 = _interopRequireDefault(_breakdown);\n\nvar _formulas = __webpack_require__(851);\n\nvar _formulas2 = _interopRequireDefault(_formulas);\n\nvar _dataset_utils = __webpack_require__(142);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar LineTotalType = exports.LineTotalType = undefined;\n(function (LineTotalType) {\n    LineTotalType[\"Budget\"] = \"budget\";\n    LineTotalType[\"Actual\"] = \"actual\";\n})(LineTotalType || (exports.LineTotalType = LineTotalType = {}));\nexports.default = _backbone2.default.Model.extend({\n    revenueLineColor: 0x6fbea4,\n    expenseLineColor: 0xeb8e7e,\n    defaultNodeSortBy: 'name',\n    initialize: function initialize(options) {\n        this.entity = options.entity;\n        this.fiscalYearStartMonth = this.entity.fiscal_year_start_month;\n        this.report = options.report;\n        this.onError = options.onError;\n        this.pkg = options.pkg;\n        this.nodes = [];\n        this.buildTrees(this.pkg);\n        this.buildDataSets(this.pkg);\n        this.currentColor = -1;\n        this.annotatedNodes = {};\n        this.mask = options.mask;\n        this.formulas = new _formulas2.default(this.entity.report_preferences);\n        this.store = options.store;\n        this.store.addChangeListener(this.syncStoreState.bind(this));\n        this.syncStoreState();\n    },\n    syncStoreState: function syncStoreState() {\n        this.state = this.store.getState();\n    },\n    toggleSelect: function toggleSelect(id) {\n        var node = this.nodes[id];\n        node.setSelectionState(!node.selected);\n    },\n    exclusiveSelect: function exclusiveSelect(id) {\n        var node = this.nodes[id];\n        var ancestors = node.ancestorNodes();\n        if (node.ungrouped) {\n            return;\n        }\n        this.uncheckSiblings(node);\n        _lodash2.default.each(ancestors, _lodash2.default.bind(this.uncheckSiblings, this));\n        node.setSelectionState(true);\n    },\n    treeSelect: function treeSelect(id, state) {\n        var tree = this.trees[id];\n        if (_lodash2.default.isUndefined(state)) {\n            state = !tree.selected;\n        }\n        tree.setSelectionState(state);\n    },\n    selectNodes: function selectNodes(nodeIds) {\n        _lodash2.default.each(nodeIds, _lodash2.default.bind(function (id) {\n            var node = this.nodes[id] || this.trees[id];\n            if (node) {\n                node.select();\n            }\n        }, this));\n    },\n    sortTree: function sortTree(treeId, method) {\n        var tree = this.trees[treeId];\n        switch (method) {\n            case 'alpha':\n                this.sortByName(tree);\n                break;\n            case 'coa':\n                this.sortByCoa(tree);\n                break;\n            default:\n                return;\n        }\n        this.trigger('sort', treeId);\n    },\n    sortByName: function sortByName(node) {\n        node.children = _lodash2.default.sortBy(node.children, 'name');\n        _lodash2.default.each(node.children, _lodash2.default.bind(this.sortByName, this));\n    },\n    sortByCoa: function sortByCoa(node) {\n        node.children = _lodash2.default.sortBy(node.children, 'order');\n        _lodash2.default.each(node.children, _lodash2.default.bind(this.sortByCoa, this));\n    },\n    hasNoAggregations: function hasNoAggregations() {\n        return !this.aggregations || _lodash2.default.size(this.aggregations.amounts.expenses) === 0 && _lodash2.default.size(this.aggregations.amounts.revenues) === 0;\n    },\n    defaultSelectionState: function defaultSelectionState() {\n        var excludeNodes = ['Transfers In', 'Transfers Out'];\n        _lodash2.default.each(this.trees, function (tree) {\n            if (tree.isAccountTypeTree || tree.id === 'types') {\n                _lodash2.default.each(tree.children, function (node) {\n                    if (!_lodash2.default.includes(excludeNodes, node.name)) {\n                        node.select();\n                    }\n                });\n            } else {\n                tree.select();\n            }\n        });\n    },\n    nodesGroupedByDepth: function nodesGroupedByDepth(breakdown, test) {\n        var tree = this.trees[breakdown];\n        var depths = {};\n        if (test(tree)) {\n            depths[0] = [this.trees[breakdown]];\n        }\n        _lodash2.default.each(this.nodes, _lodash2.default.bind(function (node) {\n            if (node.tree_id === breakdown) {\n                if (test(node)) {\n                    var depth = node.depth;\n                    var depthStore = depths[depth] = depths[depth] || [];\n                    depthStore.push(node);\n                }\n            }\n        }, this));\n        return depths;\n    },\n    eachDescendant: function eachDescendant(node, iter) {\n        var eachDescendant = function eachDescendant(node, i, c) {\n            iter(node, i, c);\n            _lodash2.default.each(node.children, _lodash2.default.bind(eachDescendant, this));\n        };\n        _lodash2.default.each(node.children, _lodash2.default.bind(eachDescendant, this));\n    },\n    eachAggregationNode: function eachAggregationNode(iter) {\n        var self = this;\n        if (this.aggregations && this.aggregations.amounts) {\n            _lodash2.default.each(this.aggregations.amounts, function (account) {\n                _lodash2.default.each(account, function (amounts, id) {\n                    iter(self.nodes[id]);\n                });\n            });\n        }\n    },\n    getBreakdownTree: function getBreakdownTree(breakdown) {\n        return this.trees[breakdown === 'types' ? this.state.get('accountType') : breakdown];\n    },\n    primaryTitle: function primaryTitle(breakdownId) {\n        var primary = { breakdownId: breakdownId };\n        var accountType = this.state.get('accountType');\n        var breakdown = this.breakdowns.get(breakdownId);\n        var tree = void 0;\n        var titleNode = void 0;\n        if (breakdown) {\n            if (breakdown.isAccountType()) {\n                if (accountType === 'types') {\n                    primary.name = breakdown.get('name');\n                } else {\n                    tree = this.trees[accountType];\n                }\n            } else {\n                tree = breakdown.getTree(0);\n            }\n        }\n        if (tree) {\n            titleNode = tree.titleNode();\n            // If the title node is the breakdown tree use the name from\n            // the breakdown so the naming is consistent with what is shown\n            // in the breakdown dropdown and filter menu titles.\n            if (titleNode === tree) {\n                primary.name = breakdown.get('name');\n            } else {\n                primary.name = titleNode.name;\n            }\n            primary.partiallySelected = titleNode.partiallySelected;\n        }\n        return primary;\n    },\n    secondaryTitle: function secondaryTitle(breakdownId) {\n        var self = this;\n        var secondary = [];\n        var showAllAccounts = this.state.get('accountType') === 'types';\n        var breakdownByAccount = breakdownId === 'types';\n        _lodash2.default.each(this.treeList, function (tree) {\n            // Don't display tree in secondary titles if...\n            //  - The tree is hidden from view.\n            //  - Tree is an account tree and we are breaking down by account types.\n            //  - The tree is included in the current breakdown (unless showing by account type).\n            if (!tree.visible || tree.isAccountTypeTree && breakdownByAccount || !showAllAccounts && tree.breakdownId === breakdownId) {\n                return;\n            }\n            var node = tree.titleNode();\n            if (node.name && (node.parent || node.partiallySelected)) {\n                if (!node.aggregationGroup || self.state.get('accountType') === 'types' || node.aggregationGroup === self.state.get('accountType')) {\n                    secondary.push({ node: node, breakdownId: tree.breakdownId });\n                }\n            }\n        });\n        return secondary;\n    },\n\n    // List the names of top level checked nodes for each tree\n    filterContext: function filterContext(breakdownId) {\n        var accountType = this.state.get('accountType');\n        var results = [];\n        _lodash2.default.each(this.treeList, _lodash2.default.bind(function (tree) {\n            if (!tree.visible) {\n                return;\n            }\n            if (tree.isAccountTypeTree) {\n                if (accountType !== 'types') {\n                    if (tree.id !== accountType) {\n                        return;\n                    }\n                }\n            }\n            // The legend and title already describe the current breakdown\n            if (tree.breakdownId === breakdownId) {\n                return;\n            }\n            // It's not interesting to list a tree if it is fully checked.\n            if (tree.selected) {\n                return;\n            }\n            results.push({\n                name: tree.name,\n                nodes: _lodash2.default.map(tree.selectRootMostCheckedNodes(), 'name')\n            });\n        }, this));\n        return results;\n    },\n    titles: function titles(breakdownId) {\n        return {\n            primary: this.primaryTitle(breakdownId),\n            secondary: this.secondaryTitle(breakdownId)\n        };\n    },\n    triggerSelectionChange: function triggerSelectionChange() {\n        this.trigger('selectionChange', this);\n    },\n    uncheckSiblings: function uncheckSiblings(node) {\n        var siblings = node.siblingNodes();\n        for (var i = 0, len = siblings.length; i < len; ++i) {\n            siblings[i].deselect();\n        }\n    },\n    deselectAll: function deselectAll() {\n        _lodash2.default.each(this.trees, _lodash2.default.bind(function (tree) {\n            tree.setSelectionState(false);\n        }, this));\n    },\n    selectedLeavesByTree: function selectedLeavesByTree(leafReducer, product) {\n        var trees = this.pkg.trees;\n        var currentAccountType = this.state.get('accountType');\n        // If leafReducer is supplied, it will be passed a leaf node preceded by that leaf's tree accumulator\n        return _lodash2.default.reduce(this.nodeList, function (lookup, node) {\n            var accum = void 0;\n            // Ensure we're only collecting selected leaf nodes\n            if (node.children.length > 0 || !node.selected) {\n                return lookup;\n            }\n            if (trees.hasOwnProperty(node.tree_id) && trees[node.tree_id].isAccountTypeTree) {\n                if (currentAccountType === 'revenues' && node.tree_id !== 'revenues') {\n                    return lookup;\n                }\n                if (currentAccountType === 'expenses' && node.tree_id !== 'expenses') {\n                    return lookup;\n                }\n                if (product.report_type !== 'balance') {\n                    if (currentAccountType === 'types' && node.tree_id !== 'expenses' && node.tree_id !== 'revenues') {\n                        return lookup;\n                    }\n                }\n            }\n            // Filter out account type nodes that aren't relevant in the current context\n            accum = lookup[trees[node.tree_id].long_id.toLowerCase()];\n            if (!accum) {\n                accum = lookup[trees[node.tree_id].long_id.toLowerCase()] = [];\n            }\n            if (leafReducer) {\n                leafReducer(accum, node);\n            } else {\n                accum.push(node);\n            }\n            return lookup;\n        }, {});\n    },\n    selectedLeafCodesByTree: function selectedLeafCodesByTree(product) {\n        return this.selectedLeavesByTree(function (accum, leaf) {\n            _lodash2.default.each(leaf.accountCodeChains, function (chain) {\n                accum.push(chain);\n            });\n        }, product);\n    },\n    minimalSelectedNodeList: function minimalSelectedNodeList(includedLedgerTypes) {\n        function collectSelectedNodes(nodes, selectedNodes) {\n            _lodash2.default.each(nodes, function (node) {\n                if (node.selected) {\n                    selectedNodes.push(node);\n                } else if (node.partiallySelected) {\n                    collectSelectedNodes(node.children, selectedNodes);\n                }\n            });\n        }\n        var selectedNodes = [];\n        var trees;\n        trees = _lodash2.default.filter(this.trees, function (tree) {\n            // Do not include the account types tree.\n            if (tree.id === 'types') {\n                return false;\n            }\n            if (tree.isAccountTypeTree) {\n                return !includedLedgerTypes || _lodash2.default.includes(includedLedgerTypes, tree.id);\n            }\n            return true;\n        });\n        collectSelectedNodes(trees, selectedNodes);\n        return selectedNodes;\n    },\n    annualDataSets: function annualDataSets() {\n        return _lodash2.default.filter(this.dataSets, function (dataSet) {\n            return !dataSet.month;\n        });\n    },\n\n    /**\r\n    * chainProjectedDataSets(dataSets, fiscalYearStartMonth, projectionType) chains projected datasets of a specified projection type\r\n    * based on the fiscal year start month\r\n    * starts month -->  6       7       8      ...     12      1     2     3     4     5\r\n    *                   2015 <- 2015 <- 2015   ... <-  2015 <- 2015 ...\r\n    *                   2016 <- 2016 <- 2016   ... <-  2016 <- 2016 ...\r\n    */\n    chainProjectedDataSets: function chainProjectedDataSets(dataSets, fiscalYearStartMonth, projectionType) {\n        var projectedDataSetsByYear = _lodash2.default.chain(dataSets).filter(function (ds) {\n            return (0, _dataset_utils.isProjectionType)(ds.type) && ds.month && ds.label === projectionType;\n        }).groupBy('month').value();\n        var previousDataSetIdByYearAndMonth = {};\n        var previousMonthIndex = null;\n        eachFiscalMonth(fiscalYearStartMonth, function (monthIndex) {\n            if (!previousDataSetIdByYearAndMonth[monthIndex]) previousDataSetIdByYearAndMonth[monthIndex] = {};\n            _lodash2.default.each(projectedDataSetsByYear[monthIndex], function (ds) {\n                previousDataSetIdByYearAndMonth[monthIndex][ds.year] = ds.id;\n                if (previousMonthIndex && previousDataSetIdByYearAndMonth[previousMonthIndex][ds.year]) {\n                    ds.prevProjectedDataSetId = previousDataSetIdByYearAndMonth[previousMonthIndex][ds.year];\n                }\n            });\n            previousMonthIndex = monthIndex;\n        });\n    },\n\n    /**\r\n    * chainProjectedDataSetsToActuals(dataSets, fiscalYearStartMonth, projectionType)\r\n    * chains projection datasets to the last actual in the current fiscal year\r\n    */\n    chainProjectedDataSetsToActuals: function chainProjectedDataSetsToActuals(dataSets, fiscalYearStartMonth, projectionType) {\n        var sortedDataSetsByYear = _lodash2.default.chain(dataSets).sortBy(function (ds) {\n            return (0, _dataset_utils.getSortingIndex)(ds.type);\n        }).filter(function (ds) {\n            return ds.month && (!(0, _dataset_utils.isProjectionType)(ds.type) || (0, _dataset_utils.isProjectionType)(ds.type) && ds.label === projectionType);\n        }).groupBy('month').value();\n        var actualsByYear = {};\n        var overlappingProjectionsByYear = {};\n        eachFiscalMonth(fiscalYearStartMonth, function (monthIndex) {\n            _lodash2.default.each(sortedDataSetsByYear[monthIndex], function (ds) {\n                if (!actualsByYear[ds.year]) {\n                    actualsByYear[ds.year] = [];\n                }\n                if (!overlappingProjectionsByYear[ds.year]) {\n                    overlappingProjectionsByYear[ds.year] = [];\n                }\n                if ((0, _dataset_utils.isActualType)(ds.type)) {\n                    actualsByYear[ds.year].push(ds);\n                }\n                if ((0, _dataset_utils.isProjectionType)(ds.type)) {\n                    if (actualsByYear[ds.year].length && ds.month === actualsByYear[ds.year][actualsByYear[ds.year].length - 1].month) {\n                        overlappingProjectionsByYear[ds.year].push(ds);\n                    }\n                }\n            });\n        });\n        eachFiscalMonth(fiscalYearStartMonth, function (monthIndex) {\n            _lodash2.default.each(sortedDataSetsByYear[monthIndex], function (ds) {\n                if ((0, _dataset_utils.isProjectionType)(ds.type)) {\n                    if (actualsByYear[ds.year].length) {\n                        ds.lastActualDataSetId = actualsByYear[ds.year][actualsByYear[ds.year].length - 1].id;\n                    }\n                    if (overlappingProjectionsByYear[ds.year].length) {\n                        ds.lastOverlappingProjectionDataSetId = overlappingProjectionsByYear[ds.year][overlappingProjectionsByYear[ds.year].length - 1].id;\n                    }\n                }\n            });\n        });\n    },\n\n    /**\r\n    * renderedDataSets(eportState, fiscalYearStartMonth) massage and filter the data based on the reportState\r\n    * filter out dataSets that we don't need\r\n    * massage projections data if present byt projection type, and by the report state\r\n    * link projected dataSets to each other based on the fiscalYearStartMonth\r\n    * this function is called from:\r\n    * 1) SummaryReportStore.getRenderedDataSets\r\n    * 2) this.renderedData\r\n    * 3) this.filterActiveAnnotations\r\n    */\n    renderedDataSets: function renderedDataSets(reportState, fiscalYearStartMonth) {\n        var _this = this;\n\n        var fiscalYearRange = {\n            start: reportState.getIn(['fiscalYearRange', 0]),\n            end: reportState.getIn(['fiscalYearRange', 1])\n        };\n        var month = Number(reportState.get('month'));\n        var reportType = reportState.get('reportType');\n        var year = Number(reportState.get('year'));\n        var currentYearPeriod = reportState.get('currentYearPeriod');\n        var athenaState = reportState.get('athenaState');\n        var isProjectionsEnabled = athenaState && athenaState.get('projections');\n        var projectionType = athenaState && athenaState.get('projectionType');\n        /**\r\n        * fix dataSets with projections.\r\n        * NOTE: it's a temp patch here. Once projections on the backend are done, we will remove it\r\n        */\n        var dataSets = (0, _dataset_utils.fixProjectedDataSets)(this.dataSets);\n        // we massage projections data and chain projected dataSets\n        this.chainProjectedDataSets(this.dataSets, fiscalYearStartMonth, projectionType);\n        this.chainProjectedDataSetsToActuals(this.dataSets, fiscalYearStartMonth, projectionType);\n        var filteredDataSets = _lodash2.default.filter(dataSets, function (dataSet) {\n            // filter out projections if user didn't enable them\n            if ((0, _dataset_utils.isProjectionType)(dataSet.type) && !isProjectionsEnabled) {\n                return false;\n                // filter projections by the selected projection type\n            } else if ((0, _dataset_utils.isProjectionType)(dataSet.type) && dataSet.label !== projectionType) {\n                return false;\n            }\n            if (reportType === 'ytd') {\n                // Year over year option\n                if (currentYearPeriod === 'years') {\n                    // filter out datasets with the month present but not the month selected\n                    if (dataSet.month && dataSet.month != month) {\n                        return false;\n                    }\n                    // filter out datasets where the month is not present but the month and year is present in other datasets of this type\n                    if (!dataSet.month) {\n                        if (_this.monthlyDataSetExists(dataSet.type, dataSet.year, month)) {\n                            return false;\n                        }\n                        // filter out projections for year over year period where month is not present\n                        if ((0, _dataset_utils.isProjectionType)(dataSet.type)) {\n                            return false;\n                        }\n                    }\n                }\n                // Month over month period\n                if (currentYearPeriod === 'months') {\n                    // Only include data sets for the currently selected period.\n                    if (dataSet.year !== year) {\n                        return false;\n                    }\n                    // Only include annual budgets. Do not include annual actuals.\n                    if (dataSet.type !== 'budget' && !dataSet.month) {\n                        return false;\n                    }\n                }\n            }\n            if (reportType === 'balance' && (dataSet.month || dataSet.type === 'budget')) {\n                return false;\n            }\n            if (!(currentYearPeriod === 'months' && reportType === 'ytd')) {\n                if (dataSet.year < fiscalYearRange.start || dataSet.year > fiscalYearRange.end) {\n                    return false;\n                }\n            }\n            return true;\n        });\n        var returnDataSets = filteredDataSets;\n        if (reportType === 'ytd') {\n            var orderedDataSets = [];\n            if (currentYearPeriod === 'months') {\n                // Group datasets by their month. Any annuals will be thrown into their own group.\n                var dataSetsByMonth = _lodash2.default.groupBy(filteredDataSets, function (dataSet) {\n                    return dataSet.month || 'annual';\n                });\n                // what actual months are present\n                var existingActualMonths = [];\n                eachFiscalMonth(fiscalYearStartMonth, function (monthIndex) {\n                    _lodash2.default.each(dataSetsByMonth[monthIndex], _lodash2.default.bind(function (ds) {\n                        if (ds.type === 'actual') {\n                            existingActualMonths.push(ds.month);\n                        }\n                    }, _this));\n                });\n                eachFiscalMonth(fiscalYearStartMonth, function (monthIndex) {\n                    _lodash2.default.each(dataSetsByMonth[monthIndex], _lodash2.default.bind(function (ds) {\n                        // we push only these projections that do not cross with actuals\n                        if (!(0, _dataset_utils.isProjectionType)(ds.type) || (0, _dataset_utils.isProjectionType)(ds.type) && !~existingActualMonths.indexOf(ds.month)) {\n                            orderedDataSets.push(ds);\n                        }\n                    }, _this));\n                });\n                _lodash2.default.each(dataSetsByMonth['annual'], function (ds) {\n                    orderedDataSets.push(ds);\n                });\n            } else if (currentYearPeriod === 'years') {\n                // filter out projected months if actual months are present\n                var lastActualYearPresent = 0;\n                orderedDataSets = _lodash2.default.filter(filteredDataSets, function (ds) {\n                    if ((0, _dataset_utils.isActualType)(ds.type)) {\n                        // update the last present actual year so that we can eliminate the projection dataset for the same year\n                        lastActualYearPresent = ds.year;\n                    }\n                    return !(0, _dataset_utils.isProjectionType)(ds.type) || (0, _dataset_utils.isProjectionType)(ds.type) && ds.year !== lastActualYearPresent;\n                });\n            }\n            //replace unordered datasets\n            returnDataSets = orderedDataSets;\n        }\n        return returnDataSets;\n    },\n    monthToPeriod: function monthToPeriod(month) {\n        return (12 + month - this.entity.fiscal_year_start_month) % 12 + 1;\n    },\n    hasAggregations: function hasAggregations() {\n        if (!this.aggregations || _lodash2.default.isEmpty(this.aggregations.amounts)) {\n            return false;\n        }\n        var accountType = this.state.get('accountType');\n        if (accountType !== 'types') {\n            var accountTypeAggregations = this.aggregations.amounts[accountType];\n            if (_lodash2.default.isEmpty(accountTypeAggregations)) {\n                return false;\n            }\n        }\n        return true;\n    },\n\n    /**\r\n    * The alignCategories optional argument will first move lines into sublines that aren't\r\n    * at the top (numerically lowest) depth. This is useful for expansion displays where we\r\n    * don't want all elements are the same depth/scope.\r\n    * this is called from:\r\n    * 1) athena_state.renderedData\r\n    * 2)\r\n    */\n    renderedData: function renderedData(reportState, fiscalYearStartMonth, isTable, alignCategories) {\n        var _this2 = this;\n\n        if (!this.hasAggregations()) {\n            return { lines: [], sublines: {}, fixed: {}, totals: [] };\n        }\n        var month = reportState.get('month');\n        var reportType = reportState.get('reportType');\n        var currentYearPeriod = reportState.get('currentYearPeriod');\n        var currentYearAmount = reportState.get('currentYearAmount');\n        var lines = [];\n        var sublines = {};\n        var fixed = {};\n        var totals = [];\n        var accountType = reportState.get('accountType');\n        var versusView = reportState.get('versusView');\n        var dataSets = this.renderedDataSets(reportState, fiscalYearStartMonth);\n        var amounts = _lodash2.default.clone(this.aggregations.amounts[accountType]);\n        var subamounts = _lodash2.default.clone(this.aggregations.subamounts) || {};\n        var colors = {};\n        var ytdMultiplier = void 0;\n        var deltaMultipliers = void 0;\n        var nodes = void 0;\n        var titleNodes = void 0;\n        var titleNodeIds = void 0;\n        var forcedDepth = void 0;\n        if (month && reportType === 'ytd') {\n            if (currentYearAmount === 'monthly') {\n                ytdMultiplier = 1 / 12;\n            } else if (currentYearPeriod === 'months') {\n                ytdMultiplier = 1;\n            } else if (currentYearAmount === 'cumulative' && currentYearPeriod === 'years') {\n                ytdMultiplier = this.monthToPeriod(month) / 12;\n            }\n        }\n        if (versusView) {\n            nodes = versusView.get('trees').map(function (tree) {\n                return _this2.trees[tree];\n            }).toArray();\n            forcedDepth = 1;\n            titleNodes = _lodash2.default.map(nodes, function (node) {\n                var title = node.titleNode();\n                return title.name ? title : node.children[0];\n            });\n            titleNodeIds = _lodash2.default.map(titleNodes, 'id');\n            colors = _lodash2.default.zipObject(titleNodeIds, _lodash2.default.map(nodes, 'color'));\n            deltaMultipliers = _lodash2.default.zipObject(titleNodeIds, _lodash2.default.map(nodes, 'deltaMultiplier'));\n            // Create a 'id' => [amounts] mapping immitating a normal select response\n            // We have to do a lot of manipulation to remap the tapi responses into the forms that tables\n            // and graphs expect while respecting our virtual nodes for versus view.\n            if (alignCategories) {\n                amounts = this.adjustVirtualAggregateNodeAmounts(this.aggregations.amounts, nodes, titleNodes, deltaMultipliers);\n            } else {\n                amounts = this.reaggregateBreakdownAmounts(this.aggregations.amounts, _lodash2.default.map(nodes, 'id'), titleNodeIds);\n            }\n        }\n        if (alignCategories) {\n            this.applyTitleColor(amounts, nodes, titleNodes, colors);\n            this.alignAmountsByDepth(amounts, subamounts, fixed, forcedDepth);\n        }\n        // If amounts for both revenues and expenses are present and expenses comes first\n        // we adjust the object fields so that revenues always displays before expenses in the summary table\n        var amountKeys = amounts && Object.keys(amounts);\n        if (versusView && alignCategories && amountKeys && amountKeys.length === 2 && this.nodes[amountKeys[0]].tree_id && this.nodes[amountKeys[0]].tree_id === 'expenses' && this.nodes[amountKeys[1]].tree_id && this.nodes[amountKeys[1]].tree_id === 'revenues') {\n            var _amounts;\n\n            amounts = (_amounts = {}, _defineProperty(_amounts, amountKeys[1], amounts[amountKeys[1]]), _defineProperty(_amounts, amountKeys[0], amounts[amountKeys[0]]), _amounts);\n        }\n        this.buildLines(reportState, lines, totals, amounts, dataSets, ytdMultiplier, colors, deltaMultipliers);\n        _lodash2.default.each(subamounts, _lodash2.default.bind(function (parentAmounts, parentId) {\n            // Fake totals and assign line results into sublines by parent id\n            this.buildLines(reportState, sublines[parentId] = [], [], parentAmounts, dataSets, ytdMultiplier, colors);\n        }, this));\n        return { lines: lines, sublines: sublines, fixed: fixed, totals: totals };\n    },\n    applyTitleColor: function applyTitleColor(amounts, nodes, titleNodes, colors) {\n        var self = this;\n        var selectedCheck = function selectedCheck(node) {\n            return node.selected || node.partiallySelected;\n        };\n        if (!nodes) {\n            nodes = _lodash2.default.map(_lodash2.default.keys(amounts), function (nodeId) {\n                return self.nodes[nodeId];\n            });\n        }\n        if (!titleNodes) {\n            titleNodes = nodes;\n        }\n        _lodash2.default.each(titleNodes, function (node) {\n            // Make sure we mark the node as colored\n            colors[node.id] = colors[node.id] || node.color;\n            while (node.parent && _lodash2.default.filter(node.parent.children, selectedCheck).length <= 1) {\n                colors[node.parent.id] = colors[node.id] || node.color;\n                node = node.parent;\n            }\n        });\n    },\n\n    // This function adjusts aggregates for virtual nodes to align properly and apply parent\n    // coloring and delta modifications.\n    adjustVirtualAggregateNodeAmounts: function adjustVirtualAggregateNodeAmounts(breakDownAmounts, nodes, titleNodes, deltaMultipliers) {\n        var amounts = {};\n        _lodash2.default.each(nodes, _lodash2.default.bind(function (node, index) {\n            var title = titleNodes[index];\n            var breakdown = breakDownAmounts[node.aggregationGroup || node.id];\n            _lodash2.default.each(node.children, function (child) {\n                deltaMultipliers[child.id] = node.deltaMultiplier;\n            });\n            deltaMultipliers[node.id] = node.deltaMultiplier;\n            // TAPI doesn't know about our virtual root nodes for account type trees, so we have to\n            // aggregate the child nodes when they are all present and below our virtual node's children.\n            if (title.depth > 0 && _lodash2.default.every(title.children, function (child) {\n                return child.disabled || _lodash2.default.has(breakdown, child.id);\n            })) {\n                breakdown = this.reaggregateBreakdownAmounts(breakDownAmounts, [node.id], [title.id]);\n            }\n            _lodash2.default.assign(amounts, breakdown);\n        }, this));\n        return amounts;\n    },\n\n    // Moves aggregates from breakdown/node ids to remapped node ids.\n    reaggregateBreakdownAmounts: function reaggregateBreakdownAmounts(amounts, originalIds, remapIds) {\n        return _lodash2.default.zipObject(remapIds, _lodash2.default.map(originalIds, _lodash2.default.bind(function (nodeId) {\n            return _lodash2.default.reduce(amounts[nodeId], _lodash2.default.bind(function (result, dsValues) {\n                _lodash2.default.each(dsValues, function (value, ds) {\n                    result[ds] = (result[ds] || 0) + value;\n                });\n                return result;\n            }, this), {});\n        }, this)), this);\n    },\n\n    // Move amounts that are at the top (numerically lowest) depth into subamounts\n    alignAmountsByDepth: function alignAmountsByDepth(amounts, subamounts, fixed, forcedDepth) {\n        var node = void 0;\n        var parent = void 0;\n        var nodes = this.nodes;\n        var minDepth = forcedDepth || _lodash2.default.chain(amounts).keys().map(function (nodeId) {\n            return nodes[nodeId].depth;\n        }).min().value();\n        var assignAmounts = function assignAmounts(currentAmounts, node, allowAccumulate, value, dataSetId) {\n            currentAmounts[node.id] = currentAmounts[node.id] || {};\n            var currentAmount = currentAmounts[node.id][dataSetId] || 0;\n            var depth = minDepth;\n            // If node is a parent, excluding virtual nodes (expenses/revenues), adjust depth so amounts get properly calculated\n            if (node.parent_id && (node.partialChildCount > 0 || node.selectedChildCount > 0)) {\n                depth += node.depth;\n            }\n            // If we are at the depth containing the \"virtual\" table rows which do not\n            // get their values from TAPI, we append the amount from the child rows. Otherwise\n            // we just assign the value into the amounts object.\n            if (node.depth <= depth) {\n                if (allowAccumulate) {\n                    currentAmounts[node.id][dataSetId] = currentAmount + value;\n                } else {\n                    currentAmounts[node.id][dataSetId] = currentAmount || value;\n                }\n            } else {\n                currentAmounts[node.id][dataSetId] = value;\n            }\n        };\n        _lodash2.default.each(_lodash2.default.keys(amounts), _lodash2.default.bind(function (nodeId) {\n            node = nodes[nodeId];\n            var leafAmounts = amounts[node.id];\n            while (node.depth !== minDepth) {\n                parent = node.parent;\n                if (!parent || !parent.id) {\n                    break;\n                }\n                // This accumulates \"leaf\" amounts into the amounts we'll see in the table.\n                // We use fixed here to inform us if the child was \"fixed\" already by this process. Since the leaf\n                // amounts are returned by the base TAPI v1 response, the subamounts are always less than or equal to the depth\n                // of the nodes from the base TAPI response. In the case of Revenues vs. Expenses views though, they can overlap on\n                // the same category.\n                //\n                // \"fixed\" is not set on the initial subamounts present in the TAPI v1 response, thus we should not double-accumulate them\n                // when they happen to overlap.\n                fixed[parent.id] = true;\n                subamounts[parent.id] = subamounts[parent.id] || {};\n                _lodash2.default.each(leafAmounts, _lodash2.default.bind(_lodash2.default.partial(assignAmounts, subamounts[parent.id], node, fixed[node.id]), this));\n                _lodash2.default.each(leafAmounts, _lodash2.default.bind(_lodash2.default.partial(assignAmounts, amounts, parent, true), this));\n                delete amounts[node.id];\n                node = parent;\n            }\n        }, this));\n    },\n\n    // Generates the RenderLine object and assigns all attributes required for rendering\n    buildLines: function buildLines(reportState, lines, totals, amounts, dataSets, ytdMultiplier, colors, deltaMultipliers) {\n        var _this3 = this;\n\n        var accountType = reportState.get('accountType');\n        var varianceFormula = void 0;\n        var includeDelta = !_lodash2.default.isUndefined(deltaMultipliers);\n        var proration = reportState.get('proration');\n        var athenaState = reportState.get('athenaState');\n        var projections = athenaState && athenaState.get('projections');\n        if (accountType !== 'types') {\n            varianceFormula = function varianceFormula(amounts) {\n                return _this3.formulas.budgetVsActualVariance({ accountType: accountType, amounts: amounts });\n            };\n        }\n        _lodash2.default.each(dataSets, function (dataSet, index) {\n            totals[index] = { amount: 0, type: dataSet.type, absoluteAmount: 0, delta: 0, pos_only: 0, neg_only: 0 };\n            //pos_only + neg_only is summation of values that are only +/- respectively in each x axis item\n        });\n        _lodash2.default.each(amounts, _lodash2.default.bind(function (nodeAmounts, nodeId) {\n            var _this4 = this;\n\n            var node = this.nodes[nodeId];\n            if (!node) {\n                return;\n            }\n            var renderLine = new _render_line2.default(node);\n            var aggregateAmounts = _lodash2.default.isArray(nodeAmounts) ? nodeAmounts : [nodeAmounts];\n            if (accountType === 'types') {\n                varianceFormula = function varianceFormula(amounts) {\n                    return _this4.formulas.budgetVsActualVariance({ accountType: node.aggregationGroup, amounts: amounts });\n                };\n            }\n            renderLine.aggregateData(aggregateAmounts, reportState.get('currentYearAmount'), reportState.get('currentYearPeriod'), dataSets, ytdMultiplier, this.annotatedNodes[nodeId], varianceFormula, reportState.get('amountUnit'), proration, projections);\n            var itemSelected = reportState.getIn(['scale', 'selected', 0]);\n            var dataSelected = reportState.getIn(['metricData', 'data', itemSelected]);\n            var scalesByYear = dataSelected && dataSelected.get('years').reduce(function (r, v) {\n                return r.set(v.get('year'), v.get('value'));\n            }, (0, _immutable.Map)());\n            if (reportState.get('yAxisScale')) {\n                var total = 0;\n                _lodash2.default.forEach(renderLine.amounts, function (renderLineAmount) {\n                    // If the metrics API did not have population data for each year fallback to\n                    // using the Delphius entity population setting for computing the scaled values.\n                    var scaleValue = scalesByYear && scalesByYear.get(renderLineAmount.year) || _this4.entity.population;\n                    var value = renderLineAmount.value / scaleValue;\n                    value = !_lodash2.default.isFinite(value) ? 0 : Math.floor(value * 100) / 100; //Making Infinity -> 0 (this happens when divide by 0)\n                    renderLineAmount.value = value;\n                    total += value;\n                    if (renderLineAmount.variance) {\n                        var varianceValue = renderLineAmount.variance / scaleValue;\n                        renderLineAmount.variance = Math.floor(varianceValue * 100) / 100;\n                    }\n                });\n                renderLine.total = total;\n            }\n            // Allow color fixing\n            if (_lodash2.default.has(colors, nodeId)) {\n                renderLine.fixedColor = true;\n                renderLine.color = colors[nodeId];\n            }\n            lines.push(renderLine);\n            _lodash2.default.each(renderLine.amounts, _lodash2.default.bind(function (amount, index) {\n                totals[index].amount += amount.value;\n                amount.value > 0 ? totals[index].pos_only += amount.value : totals[index].neg_only += amount.value;\n                totals[index].absoluteAmount += Math.abs(amount.value);\n                if (!_lodash2.default.isUndefined(amount.variance)) {\n                    totals[index].variance = 0;\n                }\n                if (includeDelta) {\n                    totals[index].delta += deltaMultipliers[nodeId] * amount.value;\n                }\n            }, this));\n        }, this));\n        this.computeVarianceTotals(totals, accountType, includeDelta);\n    },\n    computeVarianceTotals: function computeVarianceTotals(totals, accountType, includeDelta) {\n        var _this5 = this;\n\n        // Compute the Budget vs Actual variances for the totals.\n        // For Revenue vs Expense view we use the revenue variance formula to compute the total row variance.\n        var totalVarianceAccountType = accountType === 'types' ? 'revenues' : accountType;\n        totals.forEach(function (total, index) {\n            var isBudget = total.type === 'budget';\n            if (index && !_lodash2.default.isUndefined(total.variance)) {\n                // below is the ideal solution, but it relies on Lodash 4, and we're running Lodash 3.\n                // what we have now assumes a steady budget/actual/budget/actual cadence.\n                // when we update Lodash, uncomment the below line (and remove the one below it).\n                //const previousTotal = (_ as any).findLast(totals, t => t.type !== total.type, index - 1);\n                var previousTotal = totals[index - 1];\n                var currentTotalAmount = includeDelta ? total.delta : total.amount;\n                if (previousTotal) {\n                    var previousTotalAmount = includeDelta ? previousTotal.delta : previousTotal.amount;\n                    var variance = _this5.formulas.budgetVsActualVariance({\n                        accountType: totalVarianceAccountType,\n                        amounts: {\n                            budget: isBudget ? currentTotalAmount : previousTotalAmount,\n                            actual: isBudget ? previousTotalAmount : currentTotalAmount\n                        }\n                    });\n                    total.variance = variance.value;\n                    total.percentVariance = variance.percent;\n                }\n            }\n        });\n    },\n    buildDataSets: function buildDataSets() {\n        var _this6 = this;\n\n        var typeYearMonths = this.typeYearMonths = {};\n        var pkg = this.pkg;\n        var actualMonths = {};\n        var years = {};\n        this.report.dataSets.forEach(function (dataSet, order) {\n            var pkgDataSet = pkg.data_sets[dataSet.id];\n            if (pkgDataSet) {\n                years[pkgDataSet.year] = 1;\n                pkgDataSet.order = order;\n                pkgDataSet.name = dataSet.get('name');\n                pkgDataSet.label = dataSet.get('label');\n            }\n        });\n        // TODO remove/update when sorting made configurable per report\n        this.dataSets = this.multiFieldSort(_lodash2.default.values(pkg.data_sets), ['order', 'year', 'month', ['type', -1], 'created']);\n        _lodash2.default.forEach(this.dataSets, _lodash2.default.bind(function (dataSet) {\n            if (dataSet.month) {\n                var type = typeYearMonths[dataSet.type] = typeYearMonths[dataSet.type] || {};\n                var year = type[dataSet.year] = type[dataSet.year] || {};\n                year[dataSet.month] = dataSet.id;\n                actualMonths[dataSet.month] = true;\n            }\n        }, this));\n        this.months = this.sortMonthsByFiscalYear(_lodash2.default.keys(actualMonths));\n        this.years = _lodash2.default.sortBy(_lodash2.default.map(_lodash2.default.keys(years), function (i) {\n            return parseInt(i);\n        })).reverse();\n        _lodash2.default.forEach(this.dataSets, function (dataSet) {\n            if (dataSet.month) {\n                eachPreviousFiscalMonth(_this6.fiscalYearStartMonth, dataSet.month, function (i) {\n                    var type = dataSet.type;\n                    if (typeYearMonths[type]) {\n                        if (typeYearMonths[type][dataSet.year]) {\n                            if (typeYearMonths[type][dataSet.year][i]) {\n                                dataSet.previousDataSetId = typeYearMonths[type][dataSet.year][i];\n                                return false;\n                            }\n                        }\n                    }\n                });\n            }\n        });\n    },\n    multiFieldSort: function multiFieldSort(objArr, fields) {\n        objArr.sort(function (a, b) {\n            for (var i = 0; i < fields.length; i++) {\n                var field = fields[i];\n                var direction = 1;\n                if (_lodash2.default.isArray(field)) {\n                    direction = field[1];\n                    field = field[0];\n                }\n                // Handles undefined as a sort attribute\n                var aval = a[field] || 0;\n                var bval = b[field] || 0;\n                if (aval < bval) {\n                    return -1 * direction;\n                } else if (aval > bval) {\n                    return 1 * direction;\n                }\n            }\n            return 0;\n        });\n        return objArr;\n    },\n    hasMonthlyData: function hasMonthlyData() {\n        return this.months.length;\n    },\n    mostRecentMonthWithActuals: function mostRecentMonthWithActuals() {\n        if (_lodash2.default.isEmpty(this.typeYearMonths.actual)) {\n            return;\n        }\n        var year = this.mostRecentYearWithMonthlyActuals();\n        var months = _lodash2.default.keys(this.typeYearMonths.actual[year]);\n        months = this.sortMonthsByFiscalYear(months);\n        return _lodash2.default.last(months);\n    },\n    mostRecentYearWithMonthlyActuals: function mostRecentYearWithMonthlyActuals() {\n        return _lodash2.default.max(_lodash2.default.keys(this.typeYearMonths.actual));\n    },\n    sortMonthsByFiscalYear: function sortMonthsByFiscalYear(months) {\n        var self = this;\n        return _lodash2.default.sortBy(months, function (month) {\n            return self.monthToPeriod(month);\n        });\n    },\n    monthlyDataSetExists: function monthlyDataSetExists(type, year, month) {\n        // typeYearMonths contains the map of dataSets types => years => months => [dataSet.id]\n        var years = this.typeYearMonths[type];\n        if (!years) {\n            return false;\n        }\n        var months = years[year];\n        if (!months) {\n            return false;\n        }\n        return !!months[month];\n    },\n    buildTrees: function buildTrees(pkg) {\n        var self = this;\n        var sorted = _lodash2.default.sortBy(pkg.trees, 'order');\n        var breakdowns = [];\n        var accountTypeTree = void 0;\n        var treeDeltaMultipliers = { assets: 1, revenues: 1, liabilities: -1, expenses: -1 };\n        var treeColors = { assets: this.revenueLineColor, revenues: this.revenueLineColor,\n            liabilities: this.expenseLineColor, expenses: this.expenseLineColor };\n        this.trees = {};\n        this.treeList = [];\n        this.accountTrees = [];\n        _lodash2.default.each(sorted, function (tree) {\n            if (tree.isAccountTypeTree) {\n                accountTypeTree = self.trees[tree.id] = new _budget_node2.default(tree);\n                if (accountTypeTree.id === 'liabilities') {\n                    // Override name to include equities.\n                    accountTypeTree.set('name', 'Liabilities & Equities');\n                }\n                accountTypeTree.deltaMultiplier = treeDeltaMultipliers[tree.id];\n                accountTypeTree.color = treeColors[tree.id];\n                self.treeList.push(accountTypeTree);\n                self.accountTrees.push(accountTypeTree);\n            } else {\n                tree.breakdownId = tree.id;\n                var budgetTree = new _budget_node2.default(tree);\n                self.trees[tree.id] = budgetTree;\n                self.treeList.push(budgetTree);\n                breakdowns.push({\n                    id: tree.id,\n                    name: tree.name,\n                    trees: [budgetTree],\n                    visible: tree.visible\n                });\n            }\n        });\n        this.trees.types = new _budget_node2.default({ id: 'types', name: '' });\n        this.accountTrees.push(this.trees.types);\n        var visible = accountTypeTree ? accountTypeTree.visible : false;\n        var accountTypeBreakdown = this.accountTypeBreakdown = {\n            id: 'types',\n            name: 'Types',\n            isAccountType: true,\n            trees: this.accountTrees,\n            visible: visible\n        };\n        breakdowns.push(accountTypeBreakdown);\n        this.breakdowns = new _breakdown2.default.Collection(breakdowns);\n        this.buildNodes(pkg);\n    },\n    buildNodes: function buildNodes(pkg) {\n        this.nodes = pkg.nodes;\n        this.nodeList = [];\n        this.nodeByCode = {};\n        this.buildRootNodes(pkg);\n        _lodash2.default.each(this.trees, _lodash2.default.bind(function (tree) {\n            this.nodes[tree.id] = tree;\n        }, this));\n    },\n    nodeValidWithAccountType: function nodeValidWithAccountType(node, accountType) {\n        // All nodes are valid in 'types' mode.\n        if (accountType === 'types') {\n            return true;\n        }\n        // Nodes without an aggregation group are always valid\n        if (!node.aggregationGroup) {\n            return true;\n        }\n        // Node is valid if the aggregation group matches the accountType\n        if (node.aggregationGroup === accountType) {\n            return true;\n        }\n        return false;\n    },\n    findTreeByName: function findTreeByName(name) {\n        name = _underscore2.default.trim(name).toLowerCase();\n        return _lodash2.default.find(this.trees, function (tree) {\n            return _underscore2.default.trim(tree.name).toLowerCase() === name;\n        });\n    },\n\n    // Delete breakdowns and trees from the lists and objects that keep track of them\n    removeBreakdown: function removeBreakdown(id) {\n        var self = this;\n        this.breakdowns.remove(id);\n        this.treeList = _lodash2.default.filter(this.treeList, function (tree) {\n            if (tree.breakdownId === id) {\n                delete self.trees[tree.id];\n                return false;\n            }\n            return true;\n        });\n    },\n    updateEnabledState: function updateEnabledState(enabledNodes) {\n        _lodash2.default.each(this.nodes, function (node) {\n            node.disabled = true;\n        });\n        _lodash2.default.each(enabledNodes, _lodash2.default.bind(function (t, id) {\n            var node = this.nodes[id];\n            if (node) {\n                node.disabled = false;\n                while (node.parent && node.parent.disabled) {\n                    node.parent.disabled = false;\n                    node = node.parent;\n                }\n            }\n        }, this));\n        this.trigger('disableNodes');\n    },\n    activeAnnotations: function activeAnnotations() {\n        return this.get('activeAnnotations') || [];\n    },\n    filterActiveAnnotations: function filterActiveAnnotations(reportState, breakdown) {\n        var self = this;\n        this.annotatedNodes = {};\n        var annotations = reportState.get('annotations');\n        var athenaState = reportState.get('athenaState');\n        var entity = athenaState && athenaState.get('entity');\n        var dataSets = this.renderedDataSets(reportState, entity && entity.fiscal_year_start_month);\n        var accountType = this.state.get('accountType');\n        var activeAnnotations = _lodash2.default.filter(annotations, function (annotation) {\n            var subTree = false;\n            var codes = annotation.annotations_account_codes;\n            var codeIdentifier = void 0;\n            var nodes = [];\n            var active = _lodash2.default.every(codes, _lodash2.default.bind(function (code, index) {\n                if (!subTree) {\n                    codeIdentifier = code.tree_id;\n                }\n                codeIdentifier += '_' + code.account_code;\n                if (index < codes.length - 1) {\n                    if (codes[index + 1].tree_id === code.tree_id) {\n                        subTree = true;\n                        return true;\n                    }\n                }\n                var node = self.nodeByCode[codeIdentifier];\n                if (!node) {\n                    return false;\n                }\n                if (accountType !== 'types' && node.aggregationGroup && node.aggregationGroup !== accountType) {\n                    return false;\n                }\n                codeIdentifier = '';\n                subTree = false;\n                nodes.push(node);\n                return node.selected && !node.disabled;\n            }, this));\n            var query = {\n                year: annotation.year,\n                type: annotation.data_set_type\n            };\n            if (annotation.month) {\n                query.month = annotation.month;\n            }\n            var dataSet = _lodash2.default.find(dataSets, query);\n            if (_lodash2.default.isUndefined(dataSet)) {\n                active = false;\n            }\n            annotation.nodes = nodes;\n            annotation.dataSet = dataSet;\n            if (active) {\n                var primaryNode = void 0;\n                var secondaryNodes = [];\n                _lodash2.default.each(nodes, function (node) {\n                    if (node.tree_id === breakdown) {\n                        primaryNode = node;\n                    } else if (breakdown === 'types' && node.aggregationGroup) {\n                        primaryNode = node;\n                    } else {\n                        secondaryNodes.push(node);\n                    }\n                    while (node) {\n                        var _dataSets = self.annotatedNodes[node.id];\n                        if (!_dataSets) {\n                            _dataSets = self.annotatedNodes[node.id] = {};\n                        }\n                        var dataSetAnnotations = _dataSets[dataSet.id];\n                        if (!dataSetAnnotations) {\n                            dataSetAnnotations = _dataSets[dataSet.id] = [];\n                        }\n                        dataSetAnnotations.push(annotation);\n                        node = node.parent;\n                    }\n                });\n                annotation.primaryNode = primaryNode ? primaryNode : secondaryNodes.shift();\n                annotation.secondaryNodes = secondaryNodes;\n            }\n            return active;\n        });\n        activeAnnotations = _lodash2.default.sortBy(activeAnnotations, function (annotation) {\n            return annotation.primaryNode && annotation.primaryNode.id;\n        });\n        this.set('activeAnnotations', activeAnnotations);\n        return activeAnnotations;\n    },\n    error: function error(msg) {\n        this.onError(new Error(msg), msg);\n    },\n    buildRootNodes: function buildRootNodes(pkg) {\n        var sorted = _lodash2.default.sortBy(pkg.nodes, this.defaultNodeSortBy);\n        _lodash2.default.each(sorted, _lodash2.default.bind(function (node) {\n            if (!node.parent_id) {\n                var tree = this.trees[node.aggregationGroup || node.tree_id];\n                if (tree) {\n                    this.buildNode(node, tree);\n                }\n            }\n        }, this));\n    },\n    buildNode: function buildNode(attributes, parentNode, codesLineage) {\n        var node = parentNode.createChild(attributes);\n        var hasCodes = !_lodash2.default.isEmpty(attributes.account_codes);\n        this.nodeList.push(node);\n        this.nodes[node.id] = node;\n        // Push our account codes in lineage\n        if (hasCodes) {\n            codesLineage = codesLineage ? _lodash2.default.clone(codesLineage) : [];\n            codesLineage.push(attributes.account_codes);\n            node.accountCodeChains = [];\n            _lodash2.default.each(this.permuteArrays(codesLineage), _lodash2.default.bind(function (codeChain) {\n                var tree_id = this.trees[node.tree_id].long_id;\n                this.nodeByCode[tree_id + '_' + codeChain.join('_')] = node;\n                //this.nodeByCode[node.tree_id + '_' + codeChain.join('_')] = node;\n                node.accountCodeChains.push(codeChain);\n            }, this));\n        }\n        _lodash2.default.each(attributes.children, _lodash2.default.bind(function (childId) {\n            this.buildNode(this.nodes[childId], node, codesLineage);\n        }, this));\n        node.children = _lodash2.default.sortBy(node.children, this.defaultNodeSortBy);\n        return node;\n    },\n    permuteArrays: function permuteArrays(arrays) {\n        return _lodash2.default.reduce(arrays, function (accum, array) {\n            var perm = [];\n            for (var i = 0; i < accum.length; i++) {\n                for (var j = 0; j < array.length; j++) {\n                    perm.push(accum[i].concat(array[j]));\n                }\n            }\n            return perm;\n        }, [[]]);\n    },\n    setVisibleAccounts: function setVisibleAccounts(accounts) {\n        var trees = this.trees;\n        // For each visible account mark its tree as being visible to the user.\n        _lodash2.default.each(trees, function (tree) {\n            // Hide any trees for accounts which we want hidden.\n            // For example if we are in an Annual report we don't want the Balance Sheet\n            // account type trees to show up.\n            if (tree.isAccountTypeTree) {\n                tree.visible = _lodash2.default.includes(accounts, tree.id);\n            }\n        });\n        this.visibleAccounts = _lodash2.default.values(_lodash2.default.pickBy(trees, function (tree, key) {\n            return _lodash2.default.includes(accounts, key);\n        }));\n        this.invisibleAccounts = _lodash2.default.filter(_lodash2.default.values(_lodash2.default.omit(trees, accounts)), 'isAccountTypeTree');\n    },\n\n    // Get the current fiscal year range of data sets that should be rendered.\n    // Returns an empty object if no fiscal year range is currently set.\n    getFiscalYearRange: function getFiscalYearRange() {\n        var period = this.get('timePeriod');\n        if (_lodash2.default.isEmpty(period)) {\n            return {};\n        }\n        return { start: period[0], end: period[1] };\n    }\n});\n\nfunction eachFiscalMonth(fiscalYearStartMonth, cb) {\n    for (var i = 0; i < 12; ++i) {\n        var monthIndex = (i + fiscalYearStartMonth - 1) % 12 + 1;\n        if (cb(monthIndex) === false) {\n            break;\n        }\n    }\n}\nfunction eachPreviousFiscalMonth(fiscalYearStartMonth, initialMonth, cb) {\n    var i = (12 + initialMonth - fiscalYearStartMonth) % 12;\n    while (i > 0) {\n        i -= 1;\n        var monthIndex = (i + fiscalYearStartMonth - 1) % 12 + 1;\n        if (cb(monthIndex) === false) {\n            break;\n        }\n    }\n}\n\n/***/ }),\n/* 849 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _og_colors = __webpack_require__(186);\n\nvar _og_colors2 = _interopRequireDefault(_og_colors);\n\nvar _dataset_utils = __webpack_require__(142);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// A RenderLine representing a row in the table or a line on the graph. For a\n// given node it has aggregations, averages, and variances for each data-set\n// where appropriate. Used by tables, graphs, and exports\nexports.default = _backbone2.default.Model.extend({\n    initialize: function initialize(node) {\n        this.id = node.id;\n        this.category = node.depth;\n        this.name = node.name;\n        this.order = node.order;\n        this.color = node.color;\n        this.accountCodeChains = node.accountCodeChains;\n        this.childless = node.disabled || _lodash2.default.isEmpty(node.children);\n        this.ungrouped = node.ungrouped;\n        this.htmlColor = _og_colors2.default.intToHtmlColor(node.color || 0);\n    },\n\n    /**\r\n    * reset(dataSets, annotations) reset amounts, total, and types every time we recalculate aggregations.\r\n    * See aggregateData function\r\n    */\n    reset: function reset(dataSets, annotations) {\n        var _this = this;\n\n        this.amounts = [];\n        this.total = 0;\n        this.types = []; // TODO remove the need for this types;\n        _lodash2.default.each(dataSets, function (dataSet, index) {\n            var amount = _this.amounts[index] = { value: 0, type: dataSet.type, year: dataSet.year };\n            if (annotations && annotations[dataSet.id]) {\n                amount.annotation = annotations[dataSet.id];\n            }\n            if (dataSet.month) {\n                amount.month = dataSet.month;\n            }\n            _this.types[index] = dataSets[index].type;\n        });\n    },\n\n    /**\r\n    * Options are:\r\n    * nodeAggregations\r\n    * currentYearAmount\r\n    * currentYearPeriod\r\n    * dataSets\r\n    * ytdMultiplier\r\n    * varianceFormula\r\n    * amountUnit\r\n    * proration\r\n    * projections\r\n    * NOTE: dataSets are already pre-sorted here\r\n    */\n    aggregateNodeData: function aggregateNodeData() {\n        var _this2 = this;\n\n        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n        var lastActualDataSetId = null;\n        _lodash2.default.each(options.dataSets, function (dataSet, index) {\n            var value = _this2.normalizeValue(options.nodeAggregations[dataSet.id]);\n            var amount = _this2.amounts[index];\n            if (options.ytdMultiplier) {\n                var prorate = options.proration || amount.type === 'actual';\n                if (!dataSet.month && prorate) {\n                    value = value * options.ytdMultiplier;\n                }\n                // Incremental only\n                if (options.currentYearAmount === 'monthly' && dataSet.month) {\n                    var previousDataSetId = (0, _dataset_utils.isProjectionDataset)(dataSet) ? dataSet.prevProjectedDataSetId : dataSet.previousDataSetId;\n                    if (previousDataSetId) {\n                        var previousValue = options.nodeAggregations[previousDataSetId];\n                        if (previousValue) {\n                            value -= _this2.normalizeValue(previousValue);\n                        }\n                    }\n                }\n                if (options.currentYearAmount === 'cumulative' && options.currentYearPeriod === 'months') {\n                    // Account projections based on the last actual amount\n                    if (dataSet.type === 'actual' && dataSet.month) {\n                        lastActualDataSetId = dataSet.id;\n                    }\n                    /**\r\n                    * We switching from actual to projection dataSet.\r\n                    * We need this calculation only if we have actuals\r\n                    */\n                    if (lastActualDataSetId && (0, _dataset_utils.isProjectionDataset)(dataSet)) {\n                        var previousProjectedValue = options.nodeAggregations[dataSet.prevProjectedDataSetId];\n                        if (previousProjectedValue) {\n                            value -= _this2.normalizeValue(previousProjectedValue);\n                        }\n                        if (index) {\n                            var _previousAmount = _this2.amounts[index - 1];\n                            value += _previousAmount.value || 0;\n                        }\n                    }\n                }\n                if (options.currentYearAmount === 'cumulative' && options.currentYearPeriod === 'years') {\n                    if ((0, _dataset_utils.isProjectionType)(dataSet.type) && dataSet.lastActualDataSetId) {\n                        //trace back to find the value\n                        if (dataSet.lastOverlappingProjectionDataSetId) {\n                            value -= _this2.normalizeValue(options.nodeAggregations[dataSet.lastOverlappingProjectionDataSetId]);\n                        }\n                        value += _this2.normalizeValue(options.nodeAggregations[dataSet.lastActualDataSetId]);\n                    }\n                }\n                // Calculate variance and percent variance\n                if (index) {\n                    /**\r\n                    * It is tempting to simplify/reduce following previousAmount logic\r\n                    * along with removing findLastActualOrProjectedForThisYear piece to\r\n                    *\r\n                    * var previousAmount =  this.amounts[index - 1];\r\n                    *\r\n                    * However there's is a specific behavior for variances asked by product,\r\n                    * where variances for multiple budgets should be\r\n                    * computed and displayed based on earlier actual/projection column.\r\n                    * See below report (assuming it will be around, scroll to the rightmost end):\r\n                    * https://controlpanel.opengov.com/reports#/fortlauderdalefl/219/accountType=expenses&breakdown=911d1fb6-ca12-49e4-b8a4-d1a9e819e775&currentYearAmount=cumulative&currentYearPeriod=months&graph=bar&legendSort=desc&month=6&proration=true&saved_view=null&selection=803A263349A59870602D0DF5AD2E1391&fiscal_start=earliest&fiscal_end=latest\r\n                    */\n                    var previousAmount = (0, _dataset_utils.isBudgetType)(amount.type) ? _this2.findLastActualOrProjectedForThisYear(options.dataSets, dataSet.year, index) : _this2.amounts[index - 1];\n                    var showVariance = _this2.shouldComputeVariance(amount, previousAmount);\n                    if (showVariance) {\n                        var budget = (0, _dataset_utils.isBudgetType)(amount.type) ? value : previousAmount.value;\n                        var actual = (0, _dataset_utils.isBudgetType)(amount.type) ? previousAmount.value : value;\n                        var variance = options.varianceFormula({ budget: budget, actual: actual });\n                        amount.variance = variance.value;\n                        amount.percentVariance = variance.percent;\n                        amount.compareTo = previousAmount.type;\n                    }\n                }\n            }\n            amount.value += value;\n            _this2.total += value;\n        });\n    },\n\n    /**\r\n     * find the last actual or projected for the provided year through amounts chain\r\n     */\n    findLastActualOrProjectedForThisYear: function findLastActualOrProjectedForThisYear(dataSets, year, currentIndex) {\n        var index = currentIndex - 1;\n        while (index >= 0) {\n            var previous = this.amounts[index];\n            if (((0, _dataset_utils.isActualType)(previous.type) || (0, _dataset_utils.isProjectionType)(previous.type)) && dataSets[index].year === year) {\n                return previous;\n            }\n            index -= 1;\n        }\n    },\n\n    /* Decide if variance columns should be calculated */\n    shouldComputeVariance: function shouldComputeVariance(amount, previousAmount) {\n        /**\r\n        * Current defined variance display logic:\r\n        * if annual budget, compute variance if actual/projection follows budget for same year,\r\n        * if monthly budget, compute variance if actual/projection follows budget for same month/year,\r\n        * order of budget & actual/projection should not matter.\r\n        */\n        return previousAmount && _lodash2.default.intersection([previousAmount.type, amount.type], ['actual', 'projection']).length > 0 && _lodash2.default.intersection([previousAmount.type, amount.type], ['budget']).length > 0 && (!amount.month || !previousAmount.month || amount.month == previousAmount.month) && amount.year == previousAmount.year;\n    },\n    normalizeValue: function normalizeValue(value) {\n        return value / 100 || 0;\n    },\n\n    /**\r\n    * aggregateData(...args) goes through each aggregation, calculates amount, and updates a commulative total\r\n    * for all aggregations\r\n    * it is called from budget_date.buildLines function for every line\r\n    */\n    aggregateData: function aggregateData(aggregations, currentYearAmount, currentYearPeriod, dataSets, ytdMultiplier, annotations, varianceFormula, amountUnit, proration, projections) {\n        var _this3 = this;\n\n        this.reset(dataSets, annotations);\n        _lodash2.default.each(aggregations, function (nodeAggregations) {\n            return _this3.aggregateNodeData({\n                nodeAggregations: nodeAggregations,\n                currentYearAmount: currentYearAmount,\n                currentYearPeriod: currentYearPeriod,\n                dataSets: dataSets,\n                ytdMultiplier: ytdMultiplier,\n                varianceFormula: varianceFormula,\n                amountUnit: amountUnit,\n                proration: proration,\n                projections: projections\n            });\n        });\n        this.average = this.total / this.amounts.length;\n    },\n\n    /**\r\n    * assignNextColor(baseColor) find the color for the next aggregation\r\n    */\n    assignNextColor: function assignNextColor(baseColor) {\n        var colorCount = this.constructor.colors.length;\n        this.constructor.currentColor++;\n        var color = this.constructor.colors[this.constructor.currentColor % colorCount];\n        this.color = this.alphaBlend(color, baseColor, 0.08);\n        this.htmlColor = _og_colors2.default.intToHtmlColor(this.color);\n        return this.color;\n    },\n    alphaBlend: function alphaBlend(old, blend, alpha) {\n        var t = 1 - alpha;\n        var r = ((old & 0xFF0000) >> 16) * t;\n        var g = ((old & 0x00FF00) >> 8) * t;\n        var b = (old & 0x0000FF) * t;\n        r = Math.floor(r + ((blend & 0xFF0000) >> 16) * alpha);\n        g = Math.floor(g + ((blend & 0x00FF00) >> 8) * alpha);\n        b = Math.floor(b + (blend & 0x0000FF) * alpha);\n        return (r << 16) + (g << 8) + b;\n    }\n}, { colors: _og_colors2.default.colors, currentColor: -1 });\n\n/***/ }),\n/* 850 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BudgetNode = _backbone2.default.Model.extend({\n    initialize: function initialize(attributes, parent) {\n        _lodash2.default.assign(this, attributes);\n        this.children = [];\n        this.selectedChildCount = 0;\n        this.partialChildCount = 0;\n        this.partiallySelected = false;\n        this.selected = false;\n        if (parent) {\n            this.setParent(parent);\n        } else {\n            this.isTree = true;\n            this.tree_id = this.id;\n            this.depth = 0;\n        }\n    },\n    setParent: function setParent(parent) {\n        this.parent = parent;\n        this.depth = parent.depth + 1;\n        this.tree_id = parent.tree_id;\n    },\n    hasSelectedDescendants: function hasSelectedDescendants() {\n        return this.selected || this.partiallySelected;\n    },\n    selectRootMostCheckedNodes: function selectRootMostCheckedNodes(results) {\n        results = results || [];\n        for (var i = 0, len = this.children.length; i < len; ++i) {\n            var child = this.children[i];\n            if (child.selected) {\n                results.push(child);\n            } else {\n                child.selectRootMostCheckedNodes(results);\n            }\n        }\n        return results;\n    },\n    titleNode: function titleNode() {\n        if (this.selected) {\n            if (this.children.length === 1) {\n                return this.children[0].titleNode();\n            }\n            return this;\n        }\n        if (this.partiallySelected) {\n            var childCount = this.selectedChildCount + this.partialChildCount;\n            if (childCount > 1) {\n                return this;\n            }\n            if (childCount === 1) {\n                return this.findActiveChild().titleNode();\n            }\n        }\n        return {};\n    },\n    findActiveChild: function findActiveChild() {\n        for (var i = 0, len = this.children.length; i < len; ++i) {\n            var child = this.children[i];\n            if (child.selected || child.partiallySelected) {\n                return child;\n            }\n        }\n    },\n    createChild: function createChild(attributes) {\n        var node = new BudgetNode(attributes, this);\n        this.children.push(node);\n        return node;\n    },\n    ancestorNodes: function ancestorNodes() {\n        var ancestors = [];\n        var node = this;\n        while (node.parent) {\n            ancestors.push(node.parent);\n            node = node.parent;\n        }\n        return ancestors;\n    },\n    leaves: function leaves() {\n        return this.collectLeaves([]);\n    },\n    collectLeaves: function collectLeaves(accum) {\n        if (!_lodash2.default.isEmpty(this.children)) {\n            for (var i = 0; i < this.children.length; i++) {\n                this.children[i].collectLeaves(accum);\n            }\n        } else {\n            accum.push(this);\n        }\n        return accum;\n    },\n    siblingNodes: function siblingNodes() {\n        return this.parent ? this.parent.children : [];\n    },\n    deselect: function deselect() {\n        this.setSelectionState(false);\n    },\n    select: function select() {\n        this.setSelectionState(true);\n    },\n\n    // fromParent indicates whether this selection was made implicitly by its\n    // parent\n    setSelectionState: function setSelectionState(selected, fromParent) {\n        this.setChildSelectionStates(selected);\n        if (!fromParent) {\n            this.setParentSelectionStates();\n        }\n    },\n    setChildSelectionStates: function setChildSelectionStates(selected) {\n        this.setImplicitSelectionState(selected, false);\n        var children = this.children;\n        // DO NOT USE underscore/lodash here\n        // This is a tight recursive inner loop\n        for (var i = 0, len = children.length; i < len; ++i) {\n            children[i].setSelectionState(selected, true);\n        }\n    },\n    setParentSelectionStates: function setParentSelectionStates() {\n        var node = this.parent;\n        while (node) {\n            var selectedChildCount = node.selectedChildCount;\n            if (selectedChildCount === node.children.length) {\n                node.setImplicitSelectionState(true, false);\n            } else if (selectedChildCount || node.partialChildCount) {\n                node.setImplicitSelectionState(false, true);\n            } else {\n                node.setImplicitSelectionState(false, false);\n            }\n            node = node.parent;\n        }\n    },\n    setImplicitSelectionState: function setImplicitSelectionState(selected, partiallySelected) {\n        if (this.selected !== selected) {\n            this.selected = selected;\n            if (this.parent) {\n                if (selected) {\n                    this.parent.selectedChildCount++;\n                } else {\n                    this.parent.selectedChildCount--;\n                }\n            }\n        }\n        if (this.partiallySelected !== partiallySelected) {\n            this.partiallySelected = partiallySelected;\n            if (this.parent) {\n                if (partiallySelected) {\n                    this.parent.partialChildCount++;\n                } else {\n                    this.parent.partialChildCount--;\n                }\n            }\n        }\n    }\n});\nexports.default = BudgetNode;\n\n/***/ }),\n/* 851 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Formulas = function () {\n    function Formulas() {\n        var preferences = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n        _classCallCheck(this, Formulas);\n\n        this._preferences = preferences;\n    }\n    /*\r\n    * For Revenues: return true if revenue's actuals are under budget, otherwise return false\r\n    * For Expenses: return true if expenses's actuals are over budget, otherwise return false\r\n    * the main foc us here on preferences' formula\r\n    */\n\n\n    _createClass(Formulas, [{\n        key: 'isVarianceOverOrUnderBudget',\n        value: function isVarianceOverOrUnderBudget(accountType, variance) {\n            var formula = this._preferences[accountType + '_variance_formula'];\n            switch (accountType) {\n                case 'revenues':\n                    return formula === 'budget_minus_actual' ? variance > 0 : variance < 0;\n                case 'expenses':\n                    return formula === 'budget_minus_actual' ? variance < 0 : variance > 0;\n            }\n            return false;\n        }\n    }, {\n        key: 'budgetVsActualVariance',\n        value: function budgetVsActualVariance(_ref) {\n            var accountType = _ref.accountType,\n                _ref$amounts = _ref.amounts,\n                budget = _ref$amounts.budget,\n                actual = _ref$amounts.actual;\n\n            var formula = this._preferences[accountType + '_variance_formula'];\n            var value = void 0;\n            var percent = void 0;\n            if (formula === 'budget_minus_actual') {\n                value = budget - actual;\n            } else {\n                value = actual - budget;\n            }\n            percent = (value / Math.abs(budget) || 0) * 100;\n            return { value: value, percent: percent };\n        }\n    }]);\n\n    return Formulas;\n}();\n\nexports.default = Formulas;\n\n/***/ }),\n/* 852 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _handlebarsBase = __webpack_require__(507);\n\nvar base = _interopRequireWildcard(_handlebarsBase);\n\n// Each of these augment the Handlebars object. No need to setup here.\n// (This is done to easily share code between commonjs and browse envs)\n\nvar _handlebarsSafeString = __webpack_require__(864);\n\nvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\nvar _handlebarsException = __webpack_require__(143);\n\nvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\nvar _handlebarsUtils = __webpack_require__(79);\n\nvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\nvar _handlebarsRuntime = __webpack_require__(865);\n\nvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\nvar _handlebarsNoConflict = __webpack_require__(866);\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\n// For compatibility and usage outside of module systems, make the Handlebars object a namespace\nfunction create() {\n  var hb = new base.HandlebarsEnvironment();\n\n  Utils.extend(hb, base);\n  hb.SafeString = _handlebarsSafeString2['default'];\n  hb.Exception = _handlebarsException2['default'];\n  hb.Utils = Utils;\n  hb.escapeExpression = Utils.escapeExpression;\n\n  hb.VM = runtime;\n  hb.template = function (spec) {\n    return runtime.template(spec, hb);\n  };\n\n  return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst['default'] = inst;\n\nexports['default'] = inst;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n/***/ }),\n/* 853 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerDefaultHelpers = registerDefaultHelpers;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _helpersBlockHelperMissing = __webpack_require__(854);\n\nvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\nvar _helpersEach = __webpack_require__(855);\n\nvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\nvar _helpersHelperMissing = __webpack_require__(856);\n\nvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\nvar _helpersIf = __webpack_require__(857);\n\nvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\nvar _helpersLog = __webpack_require__(858);\n\nvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\nvar _helpersLookup = __webpack_require__(859);\n\nvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\nvar _helpersWith = __webpack_require__(860);\n\nvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\nfunction registerDefaultHelpers(instance) {\n  _helpersBlockHelperMissing2['default'](instance);\n  _helpersEach2['default'](instance);\n  _helpersHelperMissing2['default'](instance);\n  _helpersIf2['default'](instance);\n  _helpersLog2['default'](instance);\n  _helpersLookup2['default'](instance);\n  _helpersWith2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n/***/ }),\n/* 854 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(79);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('blockHelperMissing', function (context, options) {\n    var inverse = options.inverse,\n        fn = options.fn;\n\n    if (context === true) {\n      return fn(this);\n    } else if (context === false || context == null) {\n      return inverse(this);\n    } else if (_utils.isArray(context)) {\n      if (context.length > 0) {\n        if (options.ids) {\n          options.ids = [options.name];\n        }\n\n        return instance.helpers.each(context, options);\n      } else {\n        return inverse(this);\n      }\n    } else {\n      if (options.data && options.ids) {\n        var data = _utils.createFrame(options.data);\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n        options = { data: data };\n      }\n\n      return fn(context, options);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n/***/ }),\n/* 855 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = __webpack_require__(79);\n\nvar _exception = __webpack_require__(143);\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('each', function (context, options) {\n    if (!options) {\n      throw new _exception2['default']('Must pass iterator to #each');\n    }\n\n    var fn = options.fn,\n        inverse = options.inverse,\n        i = 0,\n        ret = '',\n        data = undefined,\n        contextPath = undefined;\n\n    if (options.data && options.ids) {\n      contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n    }\n\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    if (options.data) {\n      data = _utils.createFrame(options.data);\n    }\n\n    function execIteration(field, index, last) {\n      if (data) {\n        data.key = field;\n        data.index = index;\n        data.first = index === 0;\n        data.last = !!last;\n\n        if (contextPath) {\n          data.contextPath = contextPath + field;\n        }\n      }\n\n      ret = ret + fn(context[field], {\n        data: data,\n        blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n      });\n    }\n\n    if (context && typeof context === 'object') {\n      if (_utils.isArray(context)) {\n        for (var j = context.length; i < j; i++) {\n          if (i in context) {\n            execIteration(i, i, i === context.length - 1);\n          }\n        }\n      } else {\n        var priorKey = undefined;\n\n        for (var key in context) {\n          if (context.hasOwnProperty(key)) {\n            // We're running the iterations one step out of sync so we can detect\n            // the last iteration without have to scan the object twice and create\n            // an itermediate keys array.\n            if (priorKey !== undefined) {\n              execIteration(priorKey, i - 1);\n            }\n            priorKey = key;\n            i++;\n          }\n        }\n        if (priorKey !== undefined) {\n          execIteration(priorKey, i - 1, true);\n        }\n      }\n    }\n\n    if (i === 0) {\n      ret = inverse(this);\n    }\n\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ }),\n/* 856 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _exception = __webpack_require__(143);\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('helperMissing', function () /* [args, ]options */{\n    if (arguments.length === 1) {\n      // A missing field in a {{foo}} construct.\n      return undefined;\n    } else {\n      // Someone is actually trying to call something, blow up.\n      throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n/***/ }),\n/* 857 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(79);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('if', function (conditional, options) {\n    if (_utils.isFunction(conditional)) {\n      conditional = conditional.call(this);\n    }\n\n    // Default behavior is to render the positive path if the value is truthy and not empty.\n    // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n    // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n    if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n      return options.inverse(this);\n    } else {\n      return options.fn(this);\n    }\n  });\n\n  instance.registerHelper('unless', function (conditional, options) {\n    return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ }),\n/* 858 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('log', function () /* message, options */{\n    var args = [undefined],\n        options = arguments[arguments.length - 1];\n    for (var i = 0; i < arguments.length - 1; i++) {\n      args.push(arguments[i]);\n    }\n\n    var level = 1;\n    if (options.hash.level != null) {\n      level = options.hash.level;\n    } else if (options.data && options.data.level != null) {\n      level = options.data.level;\n    }\n    args[0] = level;\n\n    instance.log.apply(instance, args);\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n/***/ }),\n/* 859 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('lookup', function (obj, field) {\n    if (!obj) {\n      return obj;\n    }\n    if (field === 'constructor' && !obj.propertyIsEnumerable(field)) {\n      return undefined;\n    }\n    return obj[field];\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFFBQUksQ0FBQyxHQUFHLEVBQUU7QUFDUixhQUFPLEdBQUcsQ0FBQztLQUNaO0FBQ0QsUUFBSSxLQUFLLEtBQUssYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQy9ELGFBQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0QsV0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDbkIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9va3VwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uKG9iaiwgZmllbGQpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKGZpZWxkID09PSAnY29uc3RydWN0b3InICYmICFvYmoucHJvcGVydHlJc0VudW1lcmFibGUoZmllbGQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ }),\n/* 860 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(79);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('with', function (context, options) {\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    var fn = options.fn;\n\n    if (!_utils.isEmpty(context)) {\n      var data = options.data;\n      if (options.data && options.ids) {\n        data = _utils.createFrame(options.data);\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n      }\n\n      return fn(context, {\n        data: data,\n        blockParams: _utils.blockParams([context], [data && data.contextPath])\n      });\n    } else {\n      return options.inverse(this);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ }),\n/* 861 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerDefaultDecorators = registerDefaultDecorators;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _decoratorsInline = __webpack_require__(862);\n\nvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\nfunction registerDefaultDecorators(instance) {\n  _decoratorsInline2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n/***/ }),\n/* 862 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(79);\n\nexports['default'] = function (instance) {\n  instance.registerDecorator('inline', function (fn, props, container, options) {\n    var ret = fn;\n    if (!props.partials) {\n      props.partials = {};\n      ret = function (context, options) {\n        // Create a new partials stack frame prior to exec.\n        var original = container.partials;\n        container.partials = _utils.extend({}, original, props.partials);\n        var ret = fn(context, options);\n        container.partials = original;\n        return ret;\n      };\n    }\n\n    props.partials[options.args[0]] = options.fn;\n\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ }),\n/* 863 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _utils = __webpack_require__(79);\n\nvar logger = {\n  methodMap: ['debug', 'info', 'warn', 'error'],\n  level: 'info',\n\n  // Maps a given level value to the `methodMap` indexes above.\n  lookupLevel: function lookupLevel(level) {\n    if (typeof level === 'string') {\n      var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n      if (levelMap >= 0) {\n        level = levelMap;\n      } else {\n        level = parseInt(level, 10);\n      }\n    }\n\n    return level;\n  },\n\n  // Can be overridden in the host environment\n  log: function log(level) {\n    level = logger.lookupLevel(level);\n\n    if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n      var method = logger.methodMap[level];\n      if (!console[method]) {\n        // eslint-disable-line no-console\n        method = 'log';\n      }\n\n      for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        message[_key - 1] = arguments[_key];\n      }\n\n      console[method].apply(console, message); // eslint-disable-line no-console\n    }\n  }\n};\n\nexports['default'] = logger;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGVbbWV0aG9kXSguLi5tZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXI7XG4iXX0=\n\n\n/***/ }),\n/* 864 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Build out our basic SafeString type\n\n\nexports.__esModule = true;\nfunction SafeString(string) {\n  this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n  return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n/***/ }),\n/* 865 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _utils = __webpack_require__(79);\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _exception = __webpack_require__(143);\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _base = __webpack_require__(507);\n\nfunction checkRevision(compilerInfo) {\n  var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n      currentRevision = _base.COMPILER_REVISION;\n\n  if (compilerRevision !== currentRevision) {\n    if (compilerRevision < currentRevision) {\n      var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n          compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n      throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n    } else {\n      // Use the embedded version info since the runtime doesn't know about this revision yet\n      throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n    }\n  }\n}\n\nfunction template(templateSpec, env) {\n  /* istanbul ignore next */\n  if (!env) {\n    throw new _exception2['default']('No environment passed to template');\n  }\n  if (!templateSpec || !templateSpec.main) {\n    throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n  }\n\n  templateSpec.main.decorator = templateSpec.main_d;\n\n  // Note: Using env.VM references rather than local var references throughout this section to allow\n  // for external users to override these as psuedo-supported APIs.\n  env.VM.checkRevision(templateSpec.compiler);\n\n  function invokePartialWrapper(partial, context, options) {\n    if (options.hash) {\n      context = Utils.extend({}, context, options.hash);\n      if (options.ids) {\n        options.ids[0] = true;\n      }\n    }\n\n    partial = env.VM.resolvePartial.call(this, partial, context, options);\n    var result = env.VM.invokePartial.call(this, partial, context, options);\n\n    if (result == null && env.compile) {\n      options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n      result = options.partials[options.name](context, options);\n    }\n    if (result != null) {\n      if (options.indent) {\n        var lines = result.split('\\n');\n        for (var i = 0, l = lines.length; i < l; i++) {\n          if (!lines[i] && i + 1 === l) {\n            break;\n          }\n\n          lines[i] = options.indent + lines[i];\n        }\n        result = lines.join('\\n');\n      }\n      return result;\n    } else {\n      throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n    }\n  }\n\n  // Just add water\n  var container = {\n    strict: function strict(obj, name) {\n      if (!(name in obj)) {\n        throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n      }\n      return obj[name];\n    },\n    lookup: function lookup(depths, name) {\n      var len = depths.length;\n      for (var i = 0; i < len; i++) {\n        if (depths[i] && depths[i][name] != null) {\n          return depths[i][name];\n        }\n      }\n    },\n    lambda: function lambda(current, context) {\n      return typeof current === 'function' ? current.call(context) : current;\n    },\n\n    escapeExpression: Utils.escapeExpression,\n    invokePartial: invokePartialWrapper,\n\n    fn: function fn(i) {\n      var ret = templateSpec[i];\n      ret.decorator = templateSpec[i + '_d'];\n      return ret;\n    },\n\n    programs: [],\n    program: function program(i, data, declaredBlockParams, blockParams, depths) {\n      var programWrapper = this.programs[i],\n          fn = this.fn(i);\n      if (data || depths || blockParams || declaredBlockParams) {\n        programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n      } else if (!programWrapper) {\n        programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n      }\n      return programWrapper;\n    },\n\n    data: function data(value, depth) {\n      while (value && depth--) {\n        value = value._parent;\n      }\n      return value;\n    },\n    merge: function merge(param, common) {\n      var obj = param || common;\n\n      if (param && common && param !== common) {\n        obj = Utils.extend({}, common, param);\n      }\n\n      return obj;\n    },\n    // An empty object to use as replacement for null-contexts\n    nullContext: Object.seal({}),\n\n    noop: env.VM.noop,\n    compilerInfo: templateSpec.compiler\n  };\n\n  function ret(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var data = options.data;\n\n    ret._setup(options);\n    if (!options.partial && templateSpec.useData) {\n      data = initData(context, data);\n    }\n    var depths = undefined,\n        blockParams = templateSpec.useBlockParams ? [] : undefined;\n    if (templateSpec.useDepths) {\n      if (options.depths) {\n        depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n      } else {\n        depths = [context];\n      }\n    }\n\n    function main(context /*, options*/) {\n      return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n    }\n    main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n    return main(context, options);\n  }\n  ret.isTop = true;\n\n  ret._setup = function (options) {\n    if (!options.partial) {\n      container.helpers = container.merge(options.helpers, env.helpers);\n\n      if (templateSpec.usePartial) {\n        container.partials = container.merge(options.partials, env.partials);\n      }\n      if (templateSpec.usePartial || templateSpec.useDecorators) {\n        container.decorators = container.merge(options.decorators, env.decorators);\n      }\n    } else {\n      container.helpers = options.helpers;\n      container.partials = options.partials;\n      container.decorators = options.decorators;\n    }\n  };\n\n  ret._child = function (i, data, blockParams, depths) {\n    if (templateSpec.useBlockParams && !blockParams) {\n      throw new _exception2['default']('must pass block params');\n    }\n    if (templateSpec.useDepths && !depths) {\n      throw new _exception2['default']('must pass parent depths');\n    }\n\n    return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n  };\n  return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n  function prog(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var currentDepths = depths;\n    if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n      currentDepths = [context].concat(depths);\n    }\n\n    return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n  }\n\n  prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n  prog.program = i;\n  prog.depth = depths ? depths.length : 0;\n  prog.blockParams = declaredBlockParams || 0;\n  return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n  if (!partial) {\n    if (options.name === '@partial-block') {\n      partial = options.data['partial-block'];\n    } else {\n      partial = options.partials[options.name];\n    }\n  } else if (!partial.call && !options.name) {\n    // This is a dynamic partial that returned a string\n    options.name = partial;\n    partial = options.partials[partial];\n  }\n  return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n  // Use the current closure context to save the partial-block if this partial\n  var currentPartialBlock = options.data && options.data['partial-block'];\n  options.partial = true;\n  if (options.ids) {\n    options.data.contextPath = options.ids[0] || options.data.contextPath;\n  }\n\n  var partialBlock = undefined;\n  if (options.fn && options.fn !== noop) {\n    (function () {\n      options.data = _base.createFrame(options.data);\n      // Wrapper function to get access to currentPartialBlock from the closure\n      var fn = options.fn;\n      partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {\n        var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n        // Restore the partial-block from the closure for the execution of the block\n        // i.e. the part inside the block of the partial call.\n        options.data = _base.createFrame(options.data);\n        options.data['partial-block'] = currentPartialBlock;\n        return fn(context, options);\n      };\n      if (fn.partials) {\n        options.partials = Utils.extend({}, options.partials, fn.partials);\n      }\n    })();\n  }\n\n  if (partial === undefined && partialBlock) {\n    partial = partialBlock;\n  }\n\n  if (partial === undefined) {\n    throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n  } else if (partial instanceof Function) {\n    return partial(context, options);\n  }\n}\n\nfunction noop() {\n  return '';\n}\n\nfunction initData(context, data) {\n  if (!data || !('root' in data)) {\n    data = data ? _base.createFrame(data) : {};\n    data.root = context;\n  }\n  return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n  if (fn.decorator) {\n    var props = {};\n    prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n    Utils.extend(prog, props);\n  }\n  return prog;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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QUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUYsU0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7R0FDM0I7QUFDRCxTQUFPLElBQUksQ0FBQztDQUNiIiwiZmlsZSI6InJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHsgQ09NUElMRVJfUkVWSVNJT04sIFJFVklTSU9OX0NIQU5HRVMsIGNyZWF0ZUZyYW1lIH0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIGNvbnN0IGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXRcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ05vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZScpO1xuICB9XG4gIGlmICghdGVtcGxhdGVTcGVjIHx8ICF0ZW1wbGF0ZVNwZWMubWFpbikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICBsZXQgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgbGV0IGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uKG9iaiwgbmFtZSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbihkZXB0aHMsIG5hbWUpIHtcbiAgICAgIGNvbnN0IGxlbiA9IGRlcHRocy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBsYW1iZGE6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IHJldCA9IHRlbXBsYXRlU3BlY1tpXTtcbiAgICAgIHJldC5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWNbaSArICdfZCddO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICAgIGxldCBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sXG4gICAgICAgICAgZm4gPSB0aGlzLmZuKGkpO1xuICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7XG4gICAgfSxcblxuICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIGxldCBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLmV4dGVuZCh7fSwgY29tbW9uLCBwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICAvLyBBbiBlbXB0eSBvYmplY3QgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBudWxsLWNvbnRleHRzXG4gICAgbnVsbENvbnRleHQ6IE9iamVjdC5zZWFsKHt9KSxcblxuICAgIG5vb3A6IGVudi5WTS5ub29wLFxuICAgIGNvbXBpbGVySW5mbzogdGVtcGxhdGVTcGVjLmNvbXBpbGVyXG4gIH07XG5cbiAgZnVuY3Rpb24gcmV0KGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICBsZXQgZGVwdGhzLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBpZiAob3B0aW9ucy5kZXB0aHMpIHtcbiAgICAgICAgZGVwdGhzID0gY29udGV4dCAhPSBvcHRpb25zLmRlcHRoc1swXSA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogb3B0aW9ucy5kZXB0aHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aHMgPSBbY29udGV4dF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFpbihjb250ZXh0LyosIG9wdGlvbnMqLykge1xuICAgICAgcmV0dXJuICcnICsgdGVtcGxhdGVTcGVjLm1haW4oY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICB9XG4gICAgbWFpbiA9IGV4ZWN1dGVEZWNvcmF0b3JzKHRlbXBsYXRlU3BlYy5tYWluLCBtYWluLCBjb250YWluZXIsIG9wdGlvbnMuZGVwdGhzIHx8IFtdLCBkYXRhLCBibG9ja1BhcmFtcyk7XG4gICAgcmV0dXJuIG1haW4oY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsIHx8IHRlbXBsYXRlU3BlYy51c2VEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuZGVjb3JhdG9ycywgZW52LmRlY29yYXRvcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICB9XG4gIH07XG5cbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIHRlbXBsYXRlU3BlY1tpXSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREZXB0aHMgPSBkZXB0aHM7XG4gICAgaWYgKGRlcHRocyAmJiBjb250ZXh0ICE9IGRlcHRoc1swXSAmJiAhKGNvbnRleHQgPT09IGNvbnRhaW5lci5udWxsQ29udGV4dCAmJiBkZXB0aHNbMF0gPT09IG51bGwpKSB7XG4gICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmbihjb250YWluZXIsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsXG4gICAgICAgIG9wdGlvbnMuZGF0YSB8fCBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSxcbiAgICAgICAgY3VycmVudERlcHRocyk7XG4gIH1cblxuICBwcm9nID0gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcyk7XG5cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIC8vIFVzZSB0aGUgY3VycmVudCBjbG9zdXJlIGNvbnRleHQgdG8gc2F2ZSB0aGUgcGFydGlhbC1ibG9jayBpZiB0aGlzIHBhcnRpYWxcbiAgY29uc3QgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgbGV0IHBhcnRpYWxCbG9jaztcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG4gICAgcGFydGlhbEJsb2NrID0gb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBmdW5jdGlvbiBwYXJ0aWFsQmxvY2tXcmFwcGVyKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJ0aWFsLWJsb2NrIGZyb20gdGhlIGNsb3N1cmUgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IGN1cnJlbnRQYXJ0aWFsQmxvY2s7XG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAoZm4ucGFydGlhbHMpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykge1xuICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7IHJldHVybiAnJzsgfVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7XG4gIGlmIChmbi5kZWNvcmF0b3IpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iXX0=\n\n\n/***/ }),\n/* 866 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {/* global window */\n\n\nexports.__esModule = true;\n\nexports['default'] = function (Handlebars) {\n  /* istanbul ignore next */\n  var root = typeof global !== 'undefined' ? global : window,\n      $Handlebars = root.Handlebars;\n  /* istanbul ignore next */\n  Handlebars.noConflict = function () {\n    if (root.Handlebars === Handlebars) {\n      root.Handlebars = $Handlebars;\n    }\n    return Handlebars;\n  };\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 867 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"        <li><a id=\\\"image-download\\\">Image (.png)</a></li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-nav-bar__item ui-dropdown\\\">\\n  <a class=\\\"ui-nav-bar__item__toggle\\\" id=\\\"wd-download-menu\\\">Download</a>\\n  <div id=\\\"dropdown-download\\\" class=\\\"ui-dropdown__target align-right\\\">\\n    <header class=\\\"ui-dropdown__header\\\">\\n      <h4>This Graph</h4>\\n    </header>\\n    <ul class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.hideImageDownload : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"      <li><a id=\\\"table-download\\\">Table (.png)</a></li>\\n      <li><a id=\\\"csv-download\\\">Spreadsheet (.csv)</a></li>\\n    </ul>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 868 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"filter-toggle ui-button small js-show-filter\\n        \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.active : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n        \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isAccountType : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"\\n        id=\\\"filter-button_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n        data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n        <span class=\\\"filter-toggle__text js-filter-button-name\\n          \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isAccountType : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"\\n          id=\\\"filter-button-name_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n          data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n          \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n        </span>\\n        <div class=\\\"filter-toggle__actions\\\">\\n          <span class=\\\"filter-annotation\\\" id=\\\"filter-annotation_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"></span>\\n          <span class=\\\"ui-panel-toggle__close\\\"></span>\\n          <span class=\\\"ui-panel-toggle__open\\\"></span>\\n        </div>\\n      </div>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \" active_breakdown\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"js-accountTypeButton\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"js-accountType\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-mainpanel__section\\\"\\n  id=\\\"section-filter\\\">\\n  <div class=\\\"ui-mainpanel__section-header\\\">\\n    Filtered By\\n    <div class=\\\"ui-mainpanel__section-expand-all js-show-filter-all\\\" id=\\\"wd-filter-button-all\\\">\\n      All\\n      <span class=\\\"icon-righthead-2\\\"></span>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"ui-button-stack\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 869 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"    <button class=\\\"ui-button small ui-button_block primary js-recalculate\\\">\\n      <span class=\\\"ui-loading_button\\\"></span>\\n      <span class=\\\"content\\\">Calculate</span>\\n    </button>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"    <button class=\\\"ui-button small ui-button_block primary disabled js-recalculate\\\">\\n      <span class=\\\"ui-loading_button\\\"></span>\\n      <span class=\\\"content\\\">Recalculate</span>\\n    </button>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.rows : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"    <button class=\\\"aggregate-item js-select-group\\\"\\n      data-column=\\\"\"\n    + alias4(((helper = (helper = helpers.column_name || (depth0 != null ? depth0.column_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"column_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      data-group=\\\"\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      data-resolution=\\\"\"\n    + alias4(((helper = (helper = helpers.resolution || (depth0 != null ? depth0.resolution : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"resolution\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n      <div class=\\\"aggregate-item__label\\\" title=\\\"\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"aggregate-item__stat\\\" title=\\\"\"\n    + alias4(((helper = (helper = helpers.stat || (depth0 != null ? depth0.stat : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"stat\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\"\n    + alias4(((helper = (helper = helpers.stat || (depth0 != null ? depth0.stat : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"stat\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n    </button>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.initialLoad : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.program(11, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"9\":function(container,depth0,helpers,partials,data) {\n    return \"    <div class=\\\"no-aggregates\\\"></div>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \"    <div class=\\\"no-aggregates\\\">No aggregates are available for the current filter selection.</div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__group\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__sort\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__stat\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.initialLoad : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.rows : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(8, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\n\n/***/ }),\n/* 870 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <li class=\\\"drop-item js-column-toggle\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-column=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__text has-no-hover\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.program(8, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \" active\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \" (required)\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n\";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    return \"checked\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + container.escapeExpression((helpers.template || (depth0 && depth0.template) || helpers.helperMissing).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n</div>\\n\\n<ul class=\\\"drop-item__wrapper\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.columns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 871 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <li class=\\\"drop-item js-column-toggle active  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-column=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__handle icon-drag-n-drop-1\\\"></span>\\n      <span class=\\\"drop-item__text has-no-hover\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.program(6, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox checked\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \" (required)\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"  <li class=\\\"drop-item js-column-toggle\\\" data-column=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__text has-no-hover\\\">\"\n    + alias4(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + container.escapeExpression((helpers.template || (depth0 && depth0.template) || helpers.helperMissing).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n</div>\\n<ul class=\\\"drop-item__wrapper sortable-items\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.fixedColumns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n<hr>\\n<ul class=\\\"drop-item__wrapper\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.auxColumns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 872 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item js-filter\\\" data-index=\"\n    + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"index\",\"hash\":{},\"data\":data}) : helper)))\n    + \">\\n    <div class=\\\"filter-item__label\\\">\\n      <button class=\\\"filter-item__field js-field\\\">\"\n    + alias4(((helper = (helper = helpers.friendlyName || (depth0 != null ? depth0.friendlyName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"friendlyName\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</button>\\n      <span class=\\\"filter-item__is\\\">is</span>\\n      <button class=\\\"filter-item__operator js-operator\\\">\"\n    + alias4(((helper = (helper = helpers.operatorLabel || (depth0 != null ? depth0.operatorLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"operatorLabel\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</button>\\n    </div>\\n    <div>\\n      <input class=\\\"filter-item__input js-value\\\"\\n        type=\\\"text\\\"\\n        value=\\\"\"\n    + alias4(((helper = (helper = helpers.valueLabel || (depth0 != null ? depth0.valueLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"valueLabel\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n        placeholder=\\\"Filter\\\">\\n      <button aria-label=\\\"Remove filter\\\" class=\\\"filter-item__remove icon-remove-2 js-remove\\\"></button>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  <button class=\\\"ui-button small ui-button_block js-clear \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n    Clear\\n  </button>\\n</div>\\n\\n<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item\\\">\\n    <div class=\\\"filter-item__label\\\">Search Across All Data</div>\\n    <input class=\\\"filter-item__input js-search-input\\\"\\n      type=\\\"text\\\"\\n      value=\\\"\"\n    + alias3(((helper = (helper = helpers.searchAll || (depth0 != null ? depth0.searchAll : depth0)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"searchAll\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      placeholder=\\\"Search in table\\\">\\n  </div>\\n</div>\\n\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.filters : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item\\\">\\n\t \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  </div>\\n</div>\\n<div class=\\\"subpanel__content__row\\\">\\n  <button class=\\\"ui-button primary small ui-button_block js-apply \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.applyDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n    Apply\\n  </button>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 873 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"style=\\\"width: 74%;float: left;\\\"\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"        <button\\n          class=\\\"ui-dropdown__item \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" js-select-option\\\"\\n          data-val=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n          \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n        </button>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"is-visible\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"  <button class=\\\"subpanel_selectall ui-button small no-color\\\" style=\\\"width: 24%;float: right;\\\">\\n    <i class=\\\"fonticon icon-confirm-1\\\"></i>\\n    All\\n  </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"ui-dropdown select-box js-select\\\" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.enableAll : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n  <button class=\\\"ui-dropdown__toggle js-select-selected\\\">\\n    \"\n    + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.selected : depth0)) != null ? stack1.name : stack1), depth0))\n    + \"\\n  </button>\\n  <div class=\\\"ui-dropdown__target\\\">\\n    <ul class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </ul>\\n  </div>\\n</div>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.enableAll : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\n\n/***/ }),\n/* 874 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"    <div id=\\\"subpanel_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\" class=\\\"subpanel ui-panel js-subpanel\\\">\\n      <header class=\\\"ui-panel__header\\\">\\n        <h3>\"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</h3>\\n        <button class=\\\"ui-panel__close js-close-panel\\\" data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"></button>\\n      </header>\\n\\n      <div class=\\\"ui-panel__content\\\">\\n        <div class=\\\"subpanel__content\\\">\\n          \"\n    + alias4((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"subpanel\",(depth0 != null ? depth0.id : depth0),{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n        </div>\\n      </div>\\n    </div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"subpanels griddle-subpanels js-subpanels\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 875 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_budget101\\\">\\n  <div class=\\\"ui-modal wide\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n      <h3>Multi-Fund Accounting 101</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"budget101\\\"></span>\\n    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n      <article class=\\\"budget101-content\\\">\\n        <h3 class=\\\"budget101-content__subtitle\\\">\\n          A Short Guide to Multi-fund Accounting\\n        </h3>\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          OpenGov helps governments describe how funds flow through their organization, including where revenues come from, how it is distributed across departments, and where it is ultimately spent.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/1.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram of a multi-fund accounting system\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Many organizations manage their budget and finances by using a \\\"multi-fund\\\" accounting system in which revenue is disbursed to different funds. Those funds may be directed toward specific purposes, though some funds - often called general funds - can flow into multiple departments.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/2.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram showing how funds are passed down from departments to divisions\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Many organizations are divided at their highest level into departments, which may then be divided into divisions.  Some organizations have multiple layers below the division level.  Some organizations track programs that may span multiple departments and divisions.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/3.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram describing how revenue is split into funds\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          In multi-fund environments, revenue streams can feed into multiple funds. Taxes, for example, may be allocated across a government to pay for a variety of services.  Other revenue sources, like parking tickets, may go directly to a specific department, division, or program.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/4.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram showing the relationship between departments and expense types\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Departments often spend resources across many expense types.  These may range from buying office supplies and electricity to paying off debt.  Many departments share the same expense types, such as money spent on salaries and benefits for employees.\\n        </p>\\n      </article>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"budget101\\\">\\n          Done\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 876 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_faq\\\">\\n  <div class=\\\"ui-modal\\\">\\n    <header class=\\\"overlay-modal__header\\\">\\n      <h3>Frequently Asked Questions</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"faq\\\"></span>\\n    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n      <article class=\\\"faq\\\">\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n      </article>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__footer\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"faq\\\">\\n          Done\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n  <div class=\\\"ui-modal__wrapper\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 877 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_feedback\\\">\\n  <div class=\\\"ui-modal\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n      <h3>Contact \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.display_name : stack1), depth0))\n    + \"</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"feedback\\\"></span>\\n    </header>\\n    <form id=\\\"feedback-form\\\">\\n      <div class=\\\"ui-modal__content\\\">\\n        <div class=\\\"ui-alert-box feedback-form__error-message\\\">Please input a message</div>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_name\\\">Name</label>\\n          <input type=\\\"text\\\" class=\\\"overlay-form__input\\\" name=\\\"name\\\" id=\\\"feedback-form_name\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_phone\\\">Phone</label>\\n          <input type=\\\"text\\\" class=\\\"overlay-form__input\\\" name=\\\"phone\\\" id=\\\"feedback-form_form\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_email\\\">Email</label>\\n          <input type=\\\"email\\\" class=\\\"overlay-form__input\\\" name=\\\"email\\\" id=\\\"feedback-form_email\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form required\\\">\\n          <label class=\\\"overlay-form__label\\\" for=\\\"feedback-form_message\\\">Message</label>\\n          <textarea id=\\\"message\\\" name=\\\"message\\\" id=\\\"feedback-form_message\\\"></textarea>\\n        </fieldset>\\n        <input name=\\\"entity_id\\\" type=\\\"hidden\\\" value=\\\"\"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.entity_id : stack1), depth0))\n    + \"\\\">\\n      </div>\\n      <footer class=\\\"ui-modal__footer\\\">\\n        <div class=\\\"ui-modal__actions\\\">\\n          <input class=\\\"ui-button primary js-submit\\\"\\n            name=\\\"commit\\\"\\n            type=\\\"button\\\"\\n            value=\\\"Send\\\"\\n            data-modal=\\\"feedback\\\">\\n        </div>\\n      </footer>\\n    </form>\\n  </div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 878 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div className=\\\"ui-modal__wrapper open\\\" id=\\\"overlay-modal_download\\\">\\n<div className=\\\"ui-modal wide\\\">\\n\t<header className=\\\"ui-modal__header\\\">\\n\t\t<h3>Download</h3>\\n\t\t<span className=\\\"ui-modal__close\\\" onClick={ReportActions.hideDownloadModal}></span>\\n\t</header>\\n\t<div className=\\\"ui-modal__content\\\">\\n\t\t<div className=\\\"download_wrapper\\\">\\n\t\t</div>\\n\t</div>\\n\t<footer className=\\\"ui-modal__footer\\\">\\n\t\t<div className=\\\"ui-modal__actions\\\">\\n\t\t\t<button className=\\\"ui-button \\\" onClick={ReportActions.hideDownloadModal}>\\n\t\t\t\tCancel\\n\t\t\t</button>\\n\t\t</div>\\n\t</footer>\\n</div>\\n<div className=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 879 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"alert__overlay\\\" id=\\\"overlay-modal_password\\\">\\n  <div class=\\\"alert_full\\\">\\n    <div class=\\\"alert__close-btn\\\">\\n      <a href=\\\"/\\\" class=\\\"fonticon icon-remove-3\\\"></a>\\n    </div>\\n    <div class=\\\"alert__inner\\\" id=\\\"password-form\\\">\\n      <div class=\\\"alert__inner__text\\\">Limited Access: Password Required</div>\\n      <div class=\\\"alert__inner__subtext\\\" id=\\\"password-form__error-message\\\" style=\\\"display: none\\\">Password does not match</div>\\n      <div class=\\\"alert__inner__password-wrapper\\\">\\n        <label class=\\\"alert__inner__password-label\\\" for=\\\"password-form__input\\\">Password:</label>\\n        <input class=\\\"alert__inner__password-input\\\" id=\\\"password-form__input\\\" type=\\\"password\\\" name=\\\"password\\\" placeholder=\\\"•••••••\\\" autofocus=\\\"autofocus\\\">\\n        <div class=\\\"alert__inner__password-submit\\\" id=\\\"password-form__submit\\\" type=\\\"submit\\\" value=\\\"Submit\\\">\\n          Submit\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 880 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <h3>\"\n    + container.escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</h3>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"        <h3>Something went wrong</h3>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    return \"        <span class=\\\"ui-modal__close js-close\\\"></span>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <p>\"\n    + container.escapeExpression(((helper = (helper = helpers.subtext || (depth0 != null ? depth0.subtext : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"subtext\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</p>\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <p>\"\n    + container.escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</p>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.buttons : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(12, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"12\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=container.escapeExpression;\n\n  return \"            <button class=\\\"ui-button primary js-button\\\" data-index=\\\"\"\n    + alias1(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"index\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n              \"\n    + alias1(container.lambda(depth0, depth0))\n    + \"\\n            </button>\\n\";\n},\"14\":function(container,depth0,helpers,partials,data) {\n    return \"          <button class=\\\"ui-button primary js-close\\\">\\n            Okay\\n          </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"ui-modal__wrapper open\\\">\\n  <div class=\\\"ui-modal js-alert\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.subtext : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.suppressRemoval : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.subtext : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.program(9, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.buttons : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.program(14, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </div>\\n    </footer>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 881 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"ui-modal__wrapper open ready\\\" id=\\\"overlay-modal_tos\\\">\\n\t<div class=\\\"ui-modal wide\\\">\\n\t\t<header class=\\\"ui-modal__header\\\">\\n\t\t\t<h3>OpenGov Site Terms of Use</h3>\\n\t\t\t<span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"tos\\\"></span>\\n\t\t</header>\\n\t\t<div class=\\\"ui-modal__content\\\">\\n\t\t\t<article class=\\\"terms-of-service\\\">\\n\t\t\t\t<p><em>Last revised on: January 11, 2016</em></p>\\n\t\t\t\t<p>Welcome to this OpenGov website! This website (the \\\"<strong>Site</strong>\\\") is a copyrighted work belonging to OpenGov, Inc. (\\\"<strong>OpenGov</strong>\\\", \\\"<strong>us</strong>\\\", \\\"<strong>our</strong>\\\", and \\\"<strong>we</strong>\\\").  OpenGov makes available public domain data that it has aggregated and processed on behalf of governments on websites for public consumption (collectively, with all other services provided through the Site, the \\\"Services\\\"). Certain features of the Services or Site may be subject to additional guidelines, terms, or rules, which will be posted on the Service or Site in connection with such features.  All such additional terms, guidelines, and rules are incorporated by reference into this Agreement.</p>\\n\t\t\t\t<p>These Terms of Use (\\\"Agreement\\\") sets forth the legally binding terms for your use of the Site and Services. By accessing or using the Site or Services, you are accepting this Agreement and you represent and warrant that you have the right, authority, and capacity to enter into this Agreement. If you do not agree with all of the provisions of this Agreement, do not access and/or use the Site or Services. If you are using the Site or Services on behalf of a company, entity, or organization, you represent and warrant that you are an authorized representative of such company, entity, or organization with the authority to bind it to this Agreement.</p>\\n\t\t\t\t<h3>1. Site</h3>\\n\t\t\t\t<p><strong>1.1 License.</strong> Subject to the terms of this Agreement, OpenGov grants you a non-transferable, non-exclusive, license to use the Site and Services for your personal, noncommercial use.</p>\\n\t\t\t\t<p><strong>1.2 Certain Restrictions.</strong> The rights granted to you in this Agreement with regards to any content or information on the site that is not in the public domain are subject to the following restrictions: (a) you shall not license, sell, rent, lease, transfer, assign, distribute, host, or otherwise commercially exploit any portion of the Site or Services; (b) you shall not modify, make derivative works of, disassemble, reverse compile or reverse engineer any portion of the Site or Services; (c) you shall not access the Site or Services in order to build a similar or competitive service; and (d) except as expressly stated herein, no potion of the Site or Services may be copied, reproduced, distributed, republished, downloaded, displayed, posted or transmitted in any form or by any means.  Any future release, update, or other addition to functionality of the Site or Services shall be subject to the terms of this Agreement. All copyright and other proprietary notices on any Site or Services content must be retained on all copies thereof.</p>\\n\t\t\t\t<p><strong>1.3 Modification.</strong> OpenGov reserves the right, at any time, to modify, suspend, or discontinue the Site or Services or any part thereof with or without notice. You agree that OpenGov will not be liable to you or to any third party for any modification, suspension, or discontinuance of the Site or Services or any part thereof.</p>\\n\t\t\t\t<p><strong>1.4 Ownership.</strong> Excluding the public domain data made available on the site, you acknowledge that all the intellectual property rights, including copyrights, patents, trade marks, and trade secrets, in the Site and Services are owned by OpenGov or OpenGov's licensors. The provision of the Site and Services does not transfer to you or any third party any rights, title or interest in or to such intellectual property rights. OpenGov and its suppliers reserve all rights not granted in this Agreement.</p>\\n\t\t\t\t<h3>2. Acceptable Use Policy.</h3>\\n\t\t\t\t<p>You agree not to use the Site or Services to: (a) upload, transmit, or distribute any computer viruses, worms, or any software intended to damage or alter a computer system or data; (b) interfere with, disrupt, or create an undue burden on servers or networks connected to the Site or Services or violate the regulations, policies or procedures of such networks; (c) attempt to gain unauthorized access to the Site or Services, other computer systems or networks connected to or used together with the Site or Services; (d) harass or interfere with another user's use and enjoyment of the Site or Services; or (e) introduce software or automated agents or scripts to the Site or Services so as to generate automated searches, requests and queries, or to strip, scrape, or mine data from the Site or Services.</p>\\n\t\t\t\t<h3>3. Indemnity.</h3>\\n\t\t\t\t<p>You agree to indemnify and hold OpenGov (and its officers, employees, and agents) harmless, including costs and attorneys' fees, from any claim or demand made by any third party due to or arising out of (i) your use of the Site or Services, (ii) your violation of this Agreement; or (iii) your violation of applicable laws or regulations.  OpenGov reserves the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us and you agree to cooperate with our defense of these claims.  You agree not to settle any matter without the prior written consent of OpenGov.  OpenGov will use reasonable efforts to notify you of any such claim, action or proceeding upon becoming aware of it.</p>\\n\t\t\t\t<h3>4. Third Party Sites.</h3>\\n\t\t\t\t<p>The Site might contain links to third party websites and services for third parties (collectively, \\\"Third Party Sites\\\").  Such Third Party Sites are not under the control of OpenGov and OpenGov is not responsible for any Third Party Sites.  OpenGov provides these Third Party Sites only as a convenience and does not review, approve, monitor, endorse, warrant, or make any representations with respect to Third Party Sites.  You use all Third Party Sites at your own risk. When you link to a Third Party Site, the applicable third party's terms and policies apply, including the third party's privacy and data gathering practices.  You should make whatever investigation you feel necessary or appropriate before proceeding with any transaction in connection with such Third Party Sites.</p>\\n\t\t\t\t<h3>5. Disclaimers.</h3>\\n\t\t\t\t<p>THE SITE AND SERVICES ARE PROVIDED \\\"AS-IS\\\" AND \\\"AS AVAILABLE\\\" AND WE (AND OUR SUPPLIERS) EXPRESSLY DISCLAIM ANY WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OR CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, QUIET ENJOYMENT, ACCURACY, OR NON-INFRINGEMENT.  WE (AND OUR SUPPLIERS) MAKE NO WARRANTY THAT THE SITE OR SERVICES: (A) WILL MEET YOUR REQUIREMENTS; (B) WILL BE AVAILABLE ON AN UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE BASIS; OR (C) WILL BE ACCURATE, RELIABLE, FREE OF VIRUSES OR OTHER HARMFUL CODE,  COMPLETE, LEGAL, OR SAFE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.</p>\\n\t\t\t\t<h3>6. Limitation on Liability.</h3>\\n\t\t\t\t<p>IN NO EVENT SHALL WE (AND OUR SUPPLIERS) BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY LOST PROFIT OR ANY INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL OR PUNITIVE DAMAGES ARISING FROM OR RELATING TO THIS AGREEMENT OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR SERVICES, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ACCESS TO, AND USE OF, THE SITE AND SERVICES ARE AT YOUR OWN DISCRETION AND RISK, AND YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA RESULTING THEREFROM. NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED HEREIN, OUR (AND OUR SUPPLIERS') LIABILITY TO YOU FOR ANY DAMAGES ARISING FROM OR RELATED TO THIS AGREEMENT (FOR ANY CAUSE WHATSOEVER AND REGARDLESS OF THE FORM OF THE ACTION), WILL AT ALL TIMES BE LIMITED TO FIFTY US DOLLARS ($50). THE EXISTENCE OF MORE THAN ONE CLAIM WILL NOT ENLARGE THIS LIMIT. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OF CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU AND YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM JURISDICTION TO JURISDICTION.</p>\\n\t\t\t\t<h3>7. Term and Termination.</h3>\\n\t\t\t\t<p>Subject to this Section, this Agreement will remain in full force and effect while you use the Site or Services.  We may (a) suspend your rights to use the Site and/or Services or (b) terminate this Agreement, at any time for any reason at our sole discretion, including for any use of the Site or Services in violation of this Agreement.  Upon termination of this Agreement, your right to access and use the Site and Services will terminate immediately.  OpenGov will not have any liability whatsoever to you for any termination of this Agreement.  Even after this Agreement is terminated, the following provisions of this Agreement will remain in effect: Sections 2–8.</p>\\n\t\t\t\t<h3>8. General</h3>\\n\t\t\t\t<p><strong>8.1 Changes to Terms of Use.</strong> This Agreement is subject to occasional revision, and if we make any substantial changes, we may notify you by prominently posting notice of the changes on our Site.  Any changes to this agreement will be effective thirty (30) calendar days following our posting of notice of the changes on our Site. Continued use of our Site or Services following notice of such changes shall indicate your acknowledgement of such changes and agreement to be bound by the terms and conditions of such changes.</p>\\n\t\t\t\t<p><strong>8.2 Choice of Law.</strong> The Agreement is made under and shall be governed by and construed in accordance with the laws of the State of California, without giving effect to any principles that provide for the application of the law of another jurisdiction. Any action at law or in equity will be commenced in a federal or state court located in the County of Santa Clara, California and you and OpenGov consent to the venue and jurisdiction of such courts.</p>\\n\t\t\t\t<p><strong>8.3 Entire Agreement.</strong> This Agreement constitutes the entire agreement between you and us regarding the use of the Site and Services. Our failure to exercise or enforce any right or provision of this Agreement shall not operate as a waiver of such right or provision. The section titles in this Agreement are for convenience only and have no legal or contractual effect. The word including means including without limitation. If any provision of this Agreement is, for any reason, held to be invalid or unenforceable, the other provisions of this Agreement will be unimpaired and the invalid or unenforceable provision will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law.  Your relationship to OpenGov is that of an independent contractor, and neither party is an agent or partner of the other. This Agreement, and your rights and obligations herein, may not be assigned, subcontracted, delegated, or otherwise transferred by you without OpenGov's prior written consent, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void.  The terms of this Agreement shall be binding upon assignees.</p>\\n\t\t\t\t<p><strong>8.4 Copyright/Trademark Information.</strong> Copyright &copy; 2013, OpenGov, Inc. All rights reserved.  All trademarks, logos and service marks (\\\"<strong>Marks</strong>\\\") displayed on the Site are our property or the property of other third parties. You are not permitted to use these Marks without our prior written consent or the consent of such third party which may own the Marks.</p>\\n\t\t\t\t<p><strong>8.5 Contact Information:</strong></p>\\n\t\t\t\t<p>OpenGov, Inc.<br />\\n\t\t\t\t955 Charter Street<br />\\n\t\t\t\tRedwood City, CA 94063<br />\\n\t\t\t\t650-336-7167</p>\\n\t\t\t</article>\\n\t\t</div>\\n\\n\t\t<footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n  \t\t\t<button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"tos\\\">\\n          Done\\n        </button>\\n      </div>\\n\t\t</footer>\\n\t</div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 882 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"alert__overlay ready open\\\">\\n  <div class=\\\"alert_full active\\\">\\n    <div class=\\\"alert__inner\\\">\\n      <div class=\\\"alert__inner__text\\\">\"\n    + alias4(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"alert__inner__subtext\\\">\"\n    + alias4(((helper = (helper = helpers.subtext || (depth0 != null ? depth0.subtext : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"subtext\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"alert__inner__buttons-wrapper\\\">\\n        <div class=\\\"alert__inner__button js-reset\\\">\\n          <i class=\\\"fonticon icon-rotateright-1\\\"></i>\\n          Reset\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 883 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"      <button id=\\\"welcome-budget-101\\\" class=\\\"ui-button\\\">\\n        Budget 101\\n      </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper modal_welcome\\\" id=\\\"overlay-modal_welcome\\\">\\n  <div class=\\\"ui-modal wide\\\">\\n    <div class=\\\"ui-modal__content\\\">\\n      <h1 class=\\\"welcome__title\\\">\\n        Welcome to \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.display_name : stack1), depth0))\n    + \"'s Financial Reporting Platform\\n      </h1>\\n      <p>This site is designed to help you understand how \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.name : stack1), depth0))\n    + \" spends and receives money. Start exploring and learn about your government.</p>\\n      <p><small>You can also find these getting started topics in the Help menu.</small></p>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <button id=\\\"welcome-how-to\\\" class=\\\"ui-button\\\">\\n        How To\\n      </button>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showBudget101 : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      <div class=\\\"ui-modal__actions\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"welcome\\\">\\n          Get Started\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n\\n  <div class=\\\"pointer-arrow_reports\\\"></div>\\n  <div class=\\\"pointer-arrow_filter\\\"></div>\\n  <div class=\\\"pointer-arrow_export\\\"></div>\\n  <div class=\\\"pointer-arrow_legend\\\"></div>\\n\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 884 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"              <li>\\n                <a class=\\\"dropdown-select__row js-select-option js-item_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\" data-val=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n                  \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n                </a>\\n              </li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-mainpanel__section\\\">\\n  <div class=\\\"ui-mainpanel__section-header\\\">Fiscal year through</div>\\n\\n  <div class=\\\"ui-dropdown\\\">\\n    <div class=\\\"ui-dropdown__toggle js-select\\\">\\n      <span class=\\\"js-select-selected\\\">\"\n    + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.selected : depth0)) != null ? stack1.name : stack1), depth0))\n    + \"</span>\\n      <div class=\\\"ui-dropdown__target\\\">\\n          <ul class=\\\"ui-dropdown__list\\\">\\n        <div class=\\\"ui-container_scroll\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"        </div>\\n          </ul>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 885 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.dateColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.numericColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.monetaryColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.textColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.percentColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </div>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"dropdown__row_input icon-greater-equal-1\\\">\\n        <input class=\\\"filter-from dropdown__row__input\\\"\\n          type=\\\"text\\\"\\n          placeholder=\\\"From\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n          <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"dropdown__row_input icon-less-equal-1\\\">\\n        <input class=\\\"filter-to dropdown__row__input\\\"\\n          type=\\\"text\\\"\\n          placeholder=\\\"To\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n          <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"dropdown__row_input icon-greater-equal-1\\\">\\n        <input class=\\\"filter-from dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"From\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"dropdown__row_input icon-less-equal-1\\\">\\n        <input class=\\\"filter-to dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"To\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"      <div class=\\\"dropdown__row_input icon-search-1\\\">\\n        <input class=\\\"filter-search dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"Search\\\"\\n          value=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.contains || (depth0 != null ? depth0.contains : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"contains\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-uphead-3\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Sort Ascending</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Clear Sorting</span>\\n    </div>\\n\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-downhead-3\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(15, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Sort Descending</span>\\n    </div>\\n  </div>\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    return \" is-enabled\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-asc\\\"\";\n},\"13\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-clear\\\"\";\n},\"15\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-desc\\\"\";\n},\"17\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-hideblank-1\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(18, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(20, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Hide Blank</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Show All</span>\\n    </div>\\n\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-viewblank-1\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(22, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(20, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Show Only Blank</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Show All</span>\\n    </div>\\n  </div>\\n\";\n},\"18\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"non-blank\\\"\";\n},\"20\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"blank-clear\\\"\";\n},\"22\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"blank\\\"\";\n},\"24\":function(container,depth0,helpers,partials,data) {\n    return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div class=\\\"dropdown__row icon-hide-1\\\" data-action=\\\"hide\\\">\\n      <span class=\\\"dropdown__row__text\\\">Hide Column</span>\\n    </div>\\n  </div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.filter : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.sort : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.filterBlanks : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(17, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.hideColumn : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(24, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n<footer class=\\\"ui-dropdown__footer\\\">\\n  <button class=\\\"ui-button js-clear\\\">Clear</button>\\n  <button class=\\\"ui-button primary js-ok\\\">Okay</button>\\n</footer>\\n\\n<div class=\\\"clear\\\"></div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 886 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n        <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n        <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 887 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 888 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 889 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Handlebars = __webpack_require__(24);\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-search-1\\\"></i>\\n    <input class=\\\"filter-search dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"Search\\\" value=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.contains || (depth0 != null ? depth0.contains : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"contains\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n/***/ }),\n/* 890 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\n/**\r\n * filesize\r\n *\r\n * @copyright 2018 Jason Mulligan <jason.mulligan@avoidwork.com>\r\n * @license BSD-3-Clause\r\n * @version 3.6.1\r\n */\n(function (global) {\n\tvar b = /^(b|B)$/,\n\t    symbol = {\n\t\tiec: {\n\t\t\tbits: [\"b\", \"Kib\", \"Mib\", \"Gib\", \"Tib\", \"Pib\", \"Eib\", \"Zib\", \"Yib\"],\n\t\t\tbytes: [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"]\n\t\t},\n\t\tjedec: {\n\t\t\tbits: [\"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\", \"Pb\", \"Eb\", \"Zb\", \"Yb\"],\n\t\t\tbytes: [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\t\t}\n\t},\n\t    fullform = {\n\t\tiec: [\"\", \"kibi\", \"mebi\", \"gibi\", \"tebi\", \"pebi\", \"exbi\", \"zebi\", \"yobi\"],\n\t\tjedec: [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\", \"exa\", \"zetta\", \"yotta\"]\n\t};\n\n\t/**\r\n  * filesize\r\n  *\r\n  * @method filesize\r\n  * @param  {Mixed}   arg        String, Int or Float to transform\r\n  * @param  {Object}  descriptor [Optional] Flags\r\n  * @return {String}             Readable file size String\r\n  */\n\tfunction filesize(arg) {\n\t\tvar descriptor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar result = [],\n\t\t    val = 0,\n\t\t    e = void 0,\n\t\t    base = void 0,\n\t\t    bits = void 0,\n\t\t    ceil = void 0,\n\t\t    full = void 0,\n\t\t    fullforms = void 0,\n\t\t    neg = void 0,\n\t\t    num = void 0,\n\t\t    output = void 0,\n\t\t    round = void 0,\n\t\t    unix = void 0,\n\t\t    separator = void 0,\n\t\t    spacer = void 0,\n\t\t    standard = void 0,\n\t\t    symbols = void 0;\n\n\t\tif (isNaN(arg)) {\n\t\t\tthrow new Error(\"Invalid arguments\");\n\t\t}\n\n\t\tbits = descriptor.bits === true;\n\t\tunix = descriptor.unix === true;\n\t\tbase = descriptor.base || 2;\n\t\tround = descriptor.round !== void 0 ? descriptor.round : unix ? 1 : 2;\n\t\tseparator = descriptor.separator !== void 0 ? descriptor.separator || \"\" : \"\";\n\t\tspacer = descriptor.spacer !== void 0 ? descriptor.spacer : unix ? \"\" : \" \";\n\t\tsymbols = descriptor.symbols || descriptor.suffixes || {};\n\t\tstandard = base === 2 ? descriptor.standard || \"jedec\" : \"jedec\";\n\t\toutput = descriptor.output || \"string\";\n\t\tfull = descriptor.fullform === true;\n\t\tfullforms = descriptor.fullforms instanceof Array ? descriptor.fullforms : [];\n\t\te = descriptor.exponent !== void 0 ? descriptor.exponent : -1;\n\t\tnum = Number(arg);\n\t\tneg = num < 0;\n\t\tceil = base > 2 ? 1000 : 1024;\n\n\t\t// Flipping a negative number to determine the size\n\t\tif (neg) {\n\t\t\tnum = -num;\n\t\t}\n\n\t\t// Determining the exponent\n\t\tif (e === -1 || isNaN(e)) {\n\t\t\te = Math.floor(Math.log(num) / Math.log(ceil));\n\n\t\t\tif (e < 0) {\n\t\t\t\te = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Exceeding supported length, time to reduce & multiply\n\t\tif (e > 8) {\n\t\t\te = 8;\n\t\t}\n\n\t\t// Zero is now a special case because bytes divide by 1\n\t\tif (num === 0) {\n\t\t\tresult[0] = 0;\n\t\t\tresult[1] = unix ? \"\" : symbol[standard][bits ? \"bits\" : \"bytes\"][e];\n\t\t} else {\n\t\t\tval = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e));\n\n\t\t\tif (bits) {\n\t\t\t\tval = val * 8;\n\n\t\t\t\tif (val >= ceil && e < 8) {\n\t\t\t\t\tval = val / ceil;\n\t\t\t\t\te++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult[0] = Number(val.toFixed(e > 0 ? round : 0));\n\t\t\tresult[1] = base === 10 && e === 1 ? bits ? \"kb\" : \"kB\" : symbol[standard][bits ? \"bits\" : \"bytes\"][e];\n\n\t\t\tif (unix) {\n\t\t\t\tresult[1] = standard === \"jedec\" ? result[1].charAt(0) : e > 0 ? result[1].replace(/B$/, \"\") : result[1];\n\n\t\t\t\tif (b.test(result[1])) {\n\t\t\t\t\tresult[0] = Math.floor(result[0]);\n\t\t\t\t\tresult[1] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Decorating a 'diff'\n\t\tif (neg) {\n\t\t\tresult[0] = -result[0];\n\t\t}\n\n\t\t// Applying custom symbol\n\t\tresult[1] = symbols[result[1]] || result[1];\n\n\t\t// Returning Array, Object, or String (default)\n\t\tif (output === \"array\") {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (output === \"exponent\") {\n\t\t\treturn e;\n\t\t}\n\n\t\tif (output === \"object\") {\n\t\t\treturn { value: result[0], suffix: result[1], symbol: result[1] };\n\t\t}\n\n\t\tif (full) {\n\t\t\tresult[1] = fullforms[e] ? fullforms[e] : fullform[standard][e] + (bits ? \"bit\" : \"byte\") + (result[0] === 1 ? \"\" : \"s\");\n\t\t}\n\n\t\tif (separator.length > 0) {\n\t\t\tresult[0] = result[0].toString().replace(\".\", separator);\n\t\t}\n\n\t\treturn result.join(spacer);\n\t}\n\n\t// Partial application for functional programming\n\tfilesize.partial = function (opt) {\n\t\treturn function (arg) {\n\t\t\treturn filesize(arg, opt);\n\t\t};\n\t};\n\n\t// CommonJS, AMD, script tag\n\tif (true) {\n\t\tmodule.exports = filesize;\n\t} else if (typeof define === \"function\" && define.amd) {\n\t\tdefine(function () {\n\t\t\treturn filesize;\n\t\t});\n\t} else {\n\t\tglobal.filesize = filesize;\n\t}\n})(typeof window !== \"undefined\" ? window : global);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 891 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar setMomentDate = exports.setMomentDate = function setMomentDate(moment, date) {\n    return moment.set('date', date);\n};\nvar setMomentFormat = exports.setMomentFormat = function setMomentFormat(moment, format) {\n    return moment.format(format);\n};\n\n/***/ }),\n/* 892 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* MIT license */\nvar convert = __webpack_require__(508),\n    string = __webpack_require__(894);\n\nmodule.exports = function(cssString) {\n   return new Color(cssString);\n};\n\nvar Color = function(cssString) {\n   this.values = {\n      rgb: [0, 0, 0],\n      hsl: [0, 0, 0],\n      hsv: [0, 0, 0],\n      cmyk: [0, 0, 0, 0],\n      alpha: 1\n   }\n\n   // parse Color() argument\n   if (typeof cssString == \"string\") {\n      var vals = string.getRgba(cssString);\n      if (vals) {\n         this.setValues(\"rgb\", vals);\n      }\n      else if(vals = string.getHsla(cssString)) {\n         this.setValues(\"hsl\", vals);\n      }\n   }\n   else if (typeof cssString == \"object\") {\n      var vals = cssString;\n      if(vals[\"r\"] !== undefined || vals[\"red\"] !== undefined) {\n         this.setValues(\"rgb\", vals)\n      }\n      else if(vals[\"l\"] !== undefined || vals[\"lightness\"] !== undefined) {\n         this.setValues(\"hsl\", vals)\n      }\n      else if(vals[\"v\"] !== undefined || vals[\"value\"] !== undefined) {\n         this.setValues(\"hsv\", vals)\n      }\n      else if(vals[\"c\"] !== undefined || vals[\"cyan\"] !== undefined) {\n         this.setValues(\"cmyk\", vals)\n      }\n   }\n}\n\nColor.prototype = {\n   rgb: function (vals) {\n      return this.setSpace(\"rgb\", arguments);\n   },\n   hsl: function(vals) {\n      return this.setSpace(\"hsl\", arguments);\n   },\n   hsv: function(vals) {\n      return this.setSpace(\"hsv\", arguments);\n   },\n   cmyk: function(vals) {\n      return this.setSpace(\"cmyk\", arguments);\n   },\n\n   rgbArray: function() {\n      return this.values.rgb;\n   },\n   hslArray: function() {\n      return this.values.hsl;\n   },\n   hsvArray: function() {\n      return this.values.hsv;\n   },\n   cmykArray: function() {\n      return this.values.cmyk;\n   },\n   rgbaArray: function() {\n      var rgb = this.values.rgb;\n      return rgb.concat([this.values.alpha]);\n   },\n   hslaArray: function() {\n      var hsl = this.values.hsl;\n      return hsl.concat([this.values.alpha]);\n   },\n\n   alpha: function(val) {\n      if (val === undefined) {\n         return this.values.alpha;\n      }\n      this.setValues(\"alpha\", val);\n      return this;\n   },\n\n   red: function(val) {\n      return this.setChannel(\"rgb\", 0, val);\n   },\n   green: function(val) {\n      return this.setChannel(\"rgb\", 1, val);\n   },\n   blue: function(val) {\n      return this.setChannel(\"rgb\", 2, val);\n   },\n   hue: function(val) {\n      return this.setChannel(\"hsl\", 0, val);\n   },\n   saturation: function(val) {\n      return this.setChannel(\"hsl\", 1, val);\n   },\n   lightness: function(val) {\n      return this.setChannel(\"hsl\", 2, val);\n   },\n   saturationv: function(val) {\n      return this.setChannel(\"hsv\", 1, val);\n   },\n   value: function(val) {\n      return this.setChannel(\"hsv\", 2, val);\n   },\n   cyan: function(val) {\n      return this.setChannel(\"cmyk\", 0, val);\n   },\n   magenta: function(val) {\n      return this.setChannel(\"cmyk\", 1, val);\n   },\n   yellow: function(val) {\n      return this.setChannel(\"cmyk\", 2, val);\n   },\n   black: function(val) {\n      return this.setChannel(\"cmyk\", 3, val);\n   },\n\n   hexString: function() {\n      return string.hexString(this.values.rgb);\n   },\n   rgbString: function() {\n      return string.rgbString(this.values.rgb, this.values.alpha);\n   },\n   rgbaString: function() {\n      return string.rgbaString(this.values.rgb, this.values.alpha);\n   },\n   percentString: function() {\n      return string.percentString(this.values.rgb, this.values.alpha);\n   },\n   hslString: function() {\n      return string.hslString(this.values.hsl, this.values.alpha);\n   },\n   hslaString: function() {\n      return string.hslaString(this.values.hsl, this.values.alpha);\n   },\n   keyword: function() {\n      return string.keyword(this.values.rgb, this.values.alpha);\n   },\n\n   luminosity: function() {\n      // http://www.w3.org/TR/WCAG20/#relativeluminancedef\n      var rgb = this.values.rgb;\n      var lum = [];\n      for (var i = 0; i < rgb.length; i++) {\n         var chan = rgb[i] / 255;\n         lum[i] = (chan <= 0.03928) ? chan / 12.92\n                  : Math.pow(((chan + 0.055) / 1.055), 2.4)\n      }\n      return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n   },\n\n   contrast: function(color2) {\n      // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n      var lum1 = this.luminosity();\n      var lum2 = color2.luminosity();\n      if (lum1 > lum2) {\n         return (lum1 + 0.05) / (lum2 + 0.05)\n      };\n      return (lum2 + 0.05) / (lum1 + 0.05);\n   },\n\n   dark: function() {\n      // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n      var rgb = this.values.rgb,\n          yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n   \treturn yiq < 128;\n   },\n\n   light: function() {\n      return !this.dark();\n   },\n\n   negate: function() {\n      var rgb = []\n      for (var i = 0; i < 3; i++) {\n         rgb[i] = 255 - this.values.rgb[i];\n      }\n      this.setValues(\"rgb\", rgb);\n      return this;\n   },\n\n   lighten: function(ratio) {\n      this.values.hsl[2] += this.values.hsl[2] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   darken: function(ratio) {\n      this.values.hsl[2] -= this.values.hsl[2] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   saturate: function(ratio) {\n      this.values.hsl[1] += this.values.hsl[1] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   desaturate: function(ratio) {\n      this.values.hsl[1] -= this.values.hsl[1] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   greyscale: function() {\n      var rgb = this.values.rgb;\n      // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n      var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n      this.setValues(\"rgb\", [val, val, val]);\n      return this;\n   },\n\n   clearer: function(ratio) {\n      this.setValues(\"alpha\", this.values.alpha - (this.values.alpha * ratio));\n      return this;\n   },\n\n   opaquer: function(ratio) {\n      this.setValues(\"alpha\", this.values.alpha + (this.values.alpha * ratio));\n      return this;\n   },\n\n   rotate: function(degrees) {\n      var hue = this.values.hsl[0];\n      hue = (hue + degrees) % 360;\n      hue = hue < 0 ? 360 + hue : hue;\n      this.values.hsl[0] = hue;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   mix: function(color2, weight) {\n      weight = 1 - (weight == null ? 0.5 : weight);\n\n      // algorithm from Sass's mix(). Ratio of first color in mix is\n      // determined by the alphas of both colors and the weight\n      var t1 = weight * 2 - 1,\n          d = this.alpha() - color2.alpha();\n\n      var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2;\n      var weight2 = 1 - weight1;\n\n      var rgb = this.rgbArray();\n      var rgb2 = color2.rgbArray();\n\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2;\n      }\n      this.setValues(\"rgb\", rgb);\n\n      var alpha = this.alpha() * weight + color2.alpha() * (1 - weight);\n      this.setValues(\"alpha\", alpha);\n\n      return this;\n   },\n\n   toJSON: function() {\n     return this.rgb();\n   },\n\n   clone: function() {\n     return new Color(this.rgb());\n   },\n}\n\n\nColor.prototype.getValues = function(space) {\n   var vals = {};\n   for (var i = 0; i < space.length; i++) {\n      vals[space[i]] = this.values[space][i];\n   }\n   if (this.values.alpha != 1) {\n      vals[\"a\"] = this.values.alpha;\n   }\n   // {r: 255, g: 255, b: 255, a: 0.4}\n   return vals;\n}\n\nColor.prototype.setValues = function(space, vals) {\n   var spaces = {\n      \"rgb\": [\"red\", \"green\", \"blue\"],\n      \"hsl\": [\"hue\", \"saturation\", \"lightness\"],\n      \"hsv\": [\"hue\", \"saturation\", \"value\"],\n      \"cmyk\": [\"cyan\", \"magenta\", \"yellow\", \"black\"]\n   };\n\n   var maxes = {\n      \"rgb\": [255, 255, 255],\n      \"hsl\": [360, 100, 100],\n      \"hsv\": [360, 100, 100],\n      \"cmyk\": [100, 100, 100, 100],\n   };\n\n   var alpha = 1;\n   if (space == \"alpha\") {\n      alpha = vals;\n   }\n   else if (vals.length) {\n      // [10, 10, 10]\n      this.values[space] = vals.slice(0, space.length);\n      alpha = vals[space.length];\n   }\n   else if (vals[space[0]] !== undefined) {\n      // {r: 10, g: 10, b: 10}\n      for (var i = 0; i < space.length; i++) {\n        this.values[space][i] = vals[space[i]];\n      }\n      alpha = vals.a;\n   }\n   else if (vals[spaces[space][0]] !== undefined) {\n      // {red: 10, green: 10, blue: 10}\n      var chans = spaces[space];\n      for (var i = 0; i < space.length; i++) {\n        this.values[space][i] = vals[chans[i]];\n      }\n      alpha = vals.alpha;\n   }\n   this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha) ));\n   if (space == \"alpha\") {\n      return;\n   }\n\n   // convert to all the other color spaces\n   for (var sname in spaces) {\n      if (sname != space) {\n         this.values[sname] = convert[space][sname](this.values[space])\n      }\n\n      // cap values\n      for (var i = 0; i < sname.length; i++) {\n         var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i]));\n         this.values[sname][i] = Math.round(capped);\n      }\n   }\n   return true;\n}\n\nColor.prototype.setSpace = function(space, args) {\n   var vals = args[0];\n   if (vals === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof vals == \"number\") {\n      vals = Array.prototype.slice.call(args);\n   }\n   this.setValues(space, vals);\n   return this;\n}\n\nColor.prototype.setChannel = function(space, index, val) {\n   if (val === undefined) {\n      // color.red()\n      return this.values[space][index];\n   }\n   // color.red(100)\n   this.values[space][index] = val;\n   this.setValues(space, this.values[space]);\n   return this;\n}\n\n\n/***/ }),\n/* 893 */\n/***/ (function(module, exports) {\n\n/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2keyword: cmyk2keyword,\n  \n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2cmyk: keyword2cmyk,\n  \n  xyz2rgb: xyz2rgb,\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max) \n    h = (g - b) / delta; \n  else if (g == max)\n    h = 2 + (b - r) / delta; \n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max) \n    h = (g - b) / delta; \n  else if (g == max)\n    h = 2 + (b - r) / delta; \n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0) \n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n      \n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k);\n  m = (1 - g - k) / (1 - k);\n  y = (1 - b - k) / (1 - k);\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n  \n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n  \n  return [l, a, b];\n}\n\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n  \n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, s * 100, v * 100];\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;  \n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n        \n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = (r < 0) ? 0 : r;\n  g = (g < 0) ? 0 : g;\n  b = (b < 0) ? 0 : b;\n\n  return [r * 255, g * 255, b * 255];\n}\n\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n\n/***/ }),\n/* 894 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* MIT license */\nvar convert = __webpack_require__(508);\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/,\n       hex =  /^#([a-fA-F0-9]{6})$/,\n       rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)$/,\n       per = /^rgba?\\(\\s*([\\d\\.]+)\\%\\s*,\\s*([\\d\\.]+)\\%\\s*,\\s*([\\d\\.]+)\\%\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)$/,\n       keyword = /(\\D+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = convert.keyword2rgb(match[1]);\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb.push(a);\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*(\\d+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(parseFloat(match[4]) || 1, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getRgb(string) {\n   return getRgba(string).slice(0, 3);\n}\n\nfunction getHsl(string) {\n   return getHsla(string).slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\nfunction keyword(rgb) {\n   return convert.rgb2keyword(rgb.slice(0, 3));\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n/***/ }),\n/* 895 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.dateRangeFilter = exports.dateRangeExactlyOneYear = exports.dateRangeContainsLeapYear = exports.generateMonthPairList = exports.generateMonthPair = exports.getDateBounds = exports.getDateLimitsFromFilterState = exports.visAggQueryObject = exports.findAlternateDateColumnForPartitioning = exports.sortGroups = exports.createSumAcrossGroupsReducer = exports.parallelDateRangeFilterQueries = exports.partitionByMonthQueriesOnDateColumn = exports.parallelMonthQueriesOnDateColumn = exports.parallelYearQueriesOnDateColumn = exports.buildVisualAggregatesQueryPlan = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\n__webpack_require__(510);\n\nvar _numeral = __webpack_require__(144);\n\nvar _numeral2 = _interopRequireDefault(_numeral);\n\nvar _schema_utils = __webpack_require__(120);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _time_utils = __webpack_require__(896);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar MINIMUM_PARALLELISM = 4;\nvar POSTGRES_LIMIT = 2048;\nfunction buildVisualAggregatesQueryPlan(state) {\n    var queryPlannerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var schema = state.get('schema');\n    if (schema.get('amountColumn') == null) {\n        return null;\n    }\n    var fiscalYearStartMonth = schema.get('fiscalYearStartMonth');\n    var visualization = state.get('visualization');\n    var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n    var dateColumnName = schema.get('dateColumn');\n    var allowParallel = queryPlannerOptions && queryPlannerOptions.allowParallel;\n    var isSummaryTableQuery = queryPlannerOptions && queryPlannerOptions.isSummaryTableQuery;\n    var sort = 'desc';\n    var sumField = amountColumn + '_sum';\n    var limit = isSummaryTableQuery && allowParallel ? POSTGRES_LIMIT : visualization.get('limit');\n    var breakdownByField = visualization.get('breakdown');\n    var sorting = [_defineProperty({}, sumField, sort)];\n    //desc, sort by 'asc' for things that are negative -> such as min; server side make abs would be better(leland)\n    var gridState = (0, _grid_report_store.getGridState)(state);\n    var isBarGraph = visualization.get('graphType') === 'bar';\n    var isLineGraph = visualization.get('graphType') === 'line';\n    var hasMultipleTicks = isLineGraph || isBarGraph;\n    var filter = gridState.getIn(['query', 'filter']);\n    filter = filter && filter.toJS && filter.toJS() || {}; // in case we have no filter\n\n    var _getDateLimitsFromFil = getDateLimitsFromFilterState(filter, schema, dateColumnName),\n        ge = _getDateLimitsFromFil.ge,\n        le = _getDateLimitsFromFil.le,\n        min_value = _getDateLimitsFromFil.min_value,\n        max_value = _getDateLimitsFromFil.max_value;\n\n    var _getDateBounds = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value),\n        start = _getDateBounds.start,\n        end = _getDateBounds.end,\n        dateRange = _getDateBounds.dateRange,\n        dateRangeLength = _getDateBounds.dateRangeLength,\n        hasDateBoundsAdjusted = _getDateBounds.hasDateBoundsAdjusted;\n\n    var alternatePartitioningColumnName = findAlternateDateColumnForPartitioning(schema, filter);\n    var baseQuery = {\n        group: breakdownByField,\n        filter: filter,\n        sort: sorting,\n        fields: [amountColumn],\n        limit: limit,\n        group_by_year_month: null\n    };\n    var plan = {\n        queries: [],\n        strategy: null,\n        reducer: createSumAcrossGroupsReducer(breakdownByField, amountColumn, sorting, limit),\n        mapper: null,\n        planOptions: queryPlannerOptions,\n        branches: {\n            calendarAligned: false,\n            partitionColumnName: false,\n            allowParallel: allowParallel,\n            dateRangeLength: dateRangeLength,\n            hasMultipleTicks: hasMultipleTicks,\n            hasDateBoundsAdjusted: hasDateBoundsAdjusted,\n            isExactlyOneYear: false,\n            isFiscalYearAligned: false,\n            hasLeapDay: false\n        },\n        isSummaryTableQuery: isSummaryTableQuery\n    };\n    var group_by = 'group_by_fiscal_year';\n    var group_by_body = {\n        column: dateColumnName,\n        fiscal_year_start_month: fiscalYearStartMonth\n    };\n    // Toggle monthly view automatically if date range of dataset is less than 366 days\n    if (dateRangeLength <= 366) {\n        var isExactlyOneYear = dateRangeExactlyOneYear(dateRange);\n        var isFiscalYearAligned = parseInt(start.format('M')) === fiscalYearStartMonth;\n        var hasLeapDay = dateRangeContainsLeapYear(dateRange);\n        var hasMultipleFiscalYears = isExactlyOneYear && !isFiscalYearAligned && !hasDateBoundsAdjusted;\n        plan.branches.isExactlyOneYear = isExactlyOneYear;\n        plan.branches.isFiscalYearAligned = isFiscalYearAligned;\n        plan.branches.hasLeapDay = hasLeapDay;\n        // if we have exactly one year and starting month is aligned with fiscal year\n        // start month / the date bounds have been adjusted\n        if (isExactlyOneYear && (isFiscalYearAligned || hasDateBoundsAdjusted)) {\n            group_by_body['fiscal_year'] = start.year();\n            if (hasMultipleTicks) {\n                // if we have a bar / line graph\n                group_by = 'group_by_month';\n            } else {\n                group_by = 'group_by_fiscal_year';\n                // if we have a non bar graph with yearly data, we don't want to filter out\n                // the rest of the years within visual aggregates because it would remove those xAxis ticks\n                filter[dateColumnName] = dateRangeFilter([min_value, max_value]);\n                var nMonths = _moment2.default.range(min_value, max_value).toArray('months').length;\n                if (nMonths === 1 && alternatePartitioningColumnName) {\n                    plan.branches.partitionColumnName = alternatePartitioningColumnName;\n                }\n            }\n        }\n        // if we have exactly one year, and starting month is not aligned with fiscal\n        // year or start month & the date bounds have been not been adjusted,\n        // in that case, it actually belongs to multiple fiscal years and shouldn't have monthly view\n        // (And) if date range of dataset is less than 365 days or date range has a leap day,\n        // monthly view should be rendered\n        if (!hasMultipleFiscalYears && (dateRangeLength < 365 || hasLeapDay)) {\n            if (hasMultipleTicks) {\n                // if we have a bar / line graph\n                var monthPairList = generateMonthPairList(start, end);\n                group_by_body['year_month_pairs'] = monthPairList;\n                baseQuery = _extends({}, baseQuery, {\n                    group_by_year_month: group_by_body\n                });\n                if (allowParallel) {\n                    // NOTE: alternatePartitioningColumnName will not choose a column that already has a complex filter on it.\n                    if (monthPairList.length === 1 && alternatePartitioningColumnName) {\n                        plan.branches.partitionColumnName = alternatePartitioningColumnName;\n                        plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, alternatePartitioningColumnName);\n                        plan.mapper = createPartitionCompletenessMapper();\n                        plan.strategy = 'parallel_via_alternate_date_column_filter';\n                    } else {\n                        // Parallelize via group_by_year_month pairs\n                        plan.queries = parallelMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n                        plan.strategy = 'parallel_via_month_group_pairs';\n                    }\n                } else {\n                    plan.queries = [visAggQueryObject(baseQuery)];\n                    plan.strategy = 'single_query';\n                }\n                return plan;\n            } else {\n                // if we have non bar graph\n                if (dateRangeLength < 365) {\n                    // if the date range of dataset is less than 365 days\n                    group_by = 'group_by_fiscal_year';\n                    group_by_body['fiscal_year'] = start.year();\n                    // if we have a non bar graph with yearly data, we don't want to filter out\n                    // the rest of the years within visual aggregates because it would remove those xAxis ticks\n                    if (!filter[dateColumnName]) {\n                        filter[dateColumnName] = dateRangeFilter([min_value, max_value]);\n                    }\n                } else {\n                    group_by = 'group_by_month';\n                    group_by_body['fiscal_year'] = (0, _time_utils.fiscalYearForDatasetDateRange)(start, end, fiscalYearStartMonth);\n                    // if we have a non bar graph with monthly data, we don't want to filter out\n                    // the rest of the month within visual aggregates because it would remove those xAxis ticks\n                    filter[dateColumnName] = {\n                        ge: start.year() + '-01-01',\n                        le: start.year() + '-12-31'\n                    };\n                }\n            }\n        }\n    }\n    baseQuery[group_by] = group_by_body;\n    if (allowParallel) {\n        if (group_by === 'group_by_month') {\n            plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n            plan.strategy = 'parallel_via_month_filters';\n        } else if (group_by === 'group_by_fiscal_year' && plan.branches.partitionColumnName) {\n            plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, plan.branches.partitionColumnName);\n            plan.mapper = createPartitionCompletenessMapper();\n            plan.strategy = 'parallel_via_alternate_date_column_filter';\n        } else {\n            plan.queries = parallelYearQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n            plan.strategy = 'parallel_via_year_filters';\n        }\n    } else {\n        plan.queries = [visAggQueryObject(baseQuery)];\n        plan.strategy = 'single_query';\n    }\n    return plan;\n}\nfunction parallelYearQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName) {\n    var filter = baseQuery.filter;\n\n    var _getDateLimitsFromFil2 = getDateLimitsFromFilterState(filter, schema, dateColumnName),\n        ge = _getDateLimitsFromFil2.ge,\n        le = _getDateLimitsFromFil2.le,\n        min_value = _getDateLimitsFromFil2.min_value,\n        max_value = _getDateLimitsFromFil2.max_value;\n\n    var _getDateBounds2 = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value),\n        start = _getDateBounds2.start,\n        end = _getDateBounds2.end;\n\n    var yearPairs = (0, _time_utils.generateDateRangePairs)(start, end, schema.get('fiscalYearStartMonth'));\n    return parallelDateRangeFilterQueries(baseQuery, yearPairs, dateColumnName);\n}\nfunction parallelMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName) {\n    var filter = baseQuery.filter,\n        group_by_body = baseQuery.group_by_year_month;\n\n    var _getDateLimitsFromFil3 = getDateLimitsFromFilterState(filter, schema, dateColumnName),\n        ge = _getDateLimitsFromFil3.ge,\n        le = _getDateLimitsFromFil3.le,\n        min_value = _getDateLimitsFromFil3.min_value,\n        max_value = _getDateLimitsFromFil3.max_value;\n\n    var _getDateBounds3 = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value),\n        start = _getDateBounds3.start,\n        end = _getDateBounds3.end;\n\n    var monthPairList = generateMonthPairList(start, end);\n    return _lodash2.default.map(monthPairList, function (pair) {\n        return visAggQueryObject(_extends({}, baseQuery, {\n            group_by_year_month: _extends({}, group_by_body, {\n                year_month_pairs: [pair]\n            })\n        }));\n    });\n}\nfunction partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, partitioningDateColumnName) {\n    var filter = baseQuery.filter;\n\n    var _getDateLimitsFromFil4 = getDateLimitsFromFilterState(filter, schema, partitioningDateColumnName),\n        ge = _getDateLimitsFromFil4.ge,\n        le = _getDateLimitsFromFil4.le,\n        min_value = _getDateLimitsFromFil4.min_value,\n        max_value = _getDateLimitsFromFil4.max_value;\n\n    var _getDateBounds4 = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value),\n        start = _getDateBounds4.start,\n        end = _getDateBounds4.end;\n\n    var monthRanges = (0, _time_utils.generateDateRangePairs)(start, end, schema.get('fiscalYearStartMonth'), 'months');\n    // Parallelize via filters\n    return parallelDateRangeFilterQueries(baseQuery, monthRanges, partitioningDateColumnName);\n}\nfunction parallelDateRangeFilterQueries(baseQuery, ranges, dateColumnName) {\n    var filter = baseQuery.filter;\n\n    var queries = _lodash2.default.map(ranges, function (range) {\n        // If there was user-applied filter on dateColumn,\n        // then we need to merge that instead of overriding to not loose prevous filter selection\n        var appendedDateColumnFilter = filter[dateColumnName] ? _lodash2.default.assign({}, filter[dateColumnName], dateRangeFilter(range)) : dateRangeFilter(range);\n        return visAggQueryObject(_extends({}, baseQuery, {\n            filter: _extends({}, filter, _defineProperty({}, dateColumnName, appendedDateColumnFilter))\n        }));\n    });\n    // If there was no user or automatic filter applied to the date column, then we need one more query for IS NULL\n    if (!filter[dateColumnName]) {\n        queries.push(visAggQueryObject(_extends({}, baseQuery, {\n            filter: _extends({}, filter, _defineProperty({}, dateColumnName, { 'null': true }))\n        })));\n    }\n    return queries;\n}\n//\n// Mappers\n//\nfunction createPartitionCompletenessMapper() {\n    return function (partialTransactions) {\n        var anyMissed = _lodash2.default.some(partialTransactions, function (periodGroup) {\n            return periodGroup.total_count_estimate > periodGroup.transactions.length;\n        });\n        if (anyMissed) {\n            throw new Error('Groups missed. Running long query');\n        }\n        return partialTransactions;\n    };\n}\n//\n// Reducers\n//\n// NOTE: This does not support stddev or variance\nfunction createSumAcrossGroupsReducer(breakdownByField, amountColumn, sorting, limit) {\n    var sumField = amountColumn + '_sum';\n    var avgField = amountColumn + '_avg';\n    var minField = amountColumn + '_min';\n    var maxField = amountColumn + '_max';\n    var countField = 'count';\n    var totalField = 'total';\n    return function (transactions) {\n        // Combine same years by summing groups\n        var transactionsCleaned = _lodash2.default.flatten(_lodash2.default.filter(transactions, function (result) {\n            return result.transactions.length !== 0;\n        }));\n        var transactionsGrouped = _lodash2.default.groupBy(transactionsCleaned, function (g) {\n            return g.fiscal_year + '_' + g.year + '_' + g.month + '_' + g.start_day + '_' + g.end_day;\n        });\n        return _lodash2.default.map(transactionsGrouped, function (resultGroup) {\n            var retGroup = _extends({}, resultGroup[0], {\n                total_count_estimate: 0,\n                remaining: 0,\n                transactions: null\n            });\n            var groups = {};\n            // Sum Groups together\n            _lodash2.default.forEach(resultGroup, function (result) {\n                _lodash2.default.forEach(result.transactions, function (group) {\n                    var groupName = group[breakdownByField];\n                    if (!groups[groupName]) {\n                        groups[groupName] = group;\n                        return;\n                    }\n                    var accum = groups[groupName];\n                    _lodash2.default.forEach(group, function (v, k) {\n                        if (k === countField || k === totalField || k === sumField) {\n                            accum[k] = parseFloat(accum[k]) + parseFloat(v); // TODO: Might want to use integers here instead of floats.\n                        } else if (k === minField) {\n                            accum[k] = Math.min(accum[k], v);\n                        } else if (k === maxField) {\n                            accum[k] = Math.max(accum[k], v);\n                        }\n                    });\n                });\n                retGroup.total_count_estimate += result.total_count_estimate;\n                retGroup.remaining += result.remaining;\n            });\n            // Finalize amounts\n            _lodash2.default.forEach(groups, function (group) {\n                group[sumField] = _lodash2.default.round(group[sumField], 2); // TODO: i18n l10n Localization might want to customize this!\n                group[totalField] = (0, _numeral2.default)(group[sumField]).format('0.0000');\n                group[avgField] = group[sumField] / group.count;\n                // TODO: http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm\n            });\n            // Sort amounts using the specified sorting array\n            var sortedGroups = sortGroups(_lodash2.default.values(groups), sorting);\n            // Limit groups using limit parameter, put rest into \"Remaining\"\n            var aggregated = sortedGroups.slice(0, limit);\n            retGroup.transactions = aggregated;\n            retGroup.remaining += _lodash2.default.sumBy(sortedGroups.slice(limit), sumField);\n            retGroup.remaining = _lodash2.default.round(retGroup.remaining, 2); // TODO: i18n l10n Localization might want to customize this!\n            return retGroup;\n        });\n    };\n}\nfunction sortGroups(groups, sorting) {\n    var iteratees = _lodash2.default.flatten(_lodash2.default.map(sorting, _lodash2.default.keys));\n    var orders = _lodash2.default.flatten(_lodash2.default.map(sorting, _lodash2.default.values));\n    return _lodash2.default.orderBy(groups, iteratees, orders);\n}\nfunction visAggQueryObject(input) {\n    return _extends({\n        remaining: true,\n        count: true,\n        total: true\n    }, input);\n}\nfunction findAlternateDateColumnForPartitioning(schema, filter) {\n    var defaultDateColumn = schema.get('dateColumn');\n    var column = schema.get('columns').find(function (c) {\n        if (c.get('name') === defaultDateColumn) {\n            return;\n        }\n        if (c.get('type') !== 'date') {\n            return;\n        }\n        // We can deal with \"ge\" and \"le\", but other filters aren't so easy.\n        var trickyFilters = _lodash2.default.omit(filter[c.get('name')], ['ge', 'le']);\n        if (!_lodash2.default.isEmpty(trickyFilters)) {\n            return;\n        }\n        return (0, _time_utils.dateToMoment)(c.get('max_value')).diff((0, _time_utils.dateToMoment)(c.get('min_value')), 'months') >= MINIMUM_PARALLELISM;\n    });\n    return column && column.get('name');\n}\n//\n// Additional DateColumn Utils\n//\nfunction getDateLimitsFromFilterState(filter, schema, dateColumnName) {\n    var dateColumn = (0, _schema_utils.findColumnByName)(schema, dateColumnName);\n    var dateColumnFilter = filter && filter[dateColumnName];\n    var min_value = (0, _time_utils.dateToMoment)(dateColumn.get('min_value'));\n    var max_value = (0, _time_utils.dateToMoment)(dateColumn.get('max_value'));\n    var ge = dateColumnFilter && dateColumnFilter.hasOwnProperty('ge') ? (0, _time_utils.dateToMoment)(dateColumnFilter.ge) : min_value;\n    var le = dateColumnFilter && dateColumnFilter.hasOwnProperty('le') ? (0, _time_utils.dateToMoment)(dateColumnFilter.le) : max_value;\n    return { ge: ge, le: le, min_value: min_value, max_value: max_value };\n}\nfunction dateRangeFilter(rangeOfMoments) {\n    return {\n        ge: rangeOfMoments[0].format('YYYY-MM-DD'),\n        le: rangeOfMoments[1].format('YYYY-MM-DD')\n    };\n}\nfunction getDateBounds(hasMultipleTicks, ge, le, min_value, max_value) {\n    var schemaDateRange = _moment2.default.range(min_value, max_value);\n    var schemaDateRangeLength = schemaDateRange.toArray('days').length;\n    var start = ge.isAfter(min_value) ? ge : min_value; //To prevent going outside of date range\n    var end = le.isBefore(max_value) ? le : max_value;\n    var dateRange = _moment2.default.range(start, end);\n    var dateRangeLength = dateRange.toArray('days').length;\n    var hasDateBoundsAdjusted = false;\n    //The date range filter is adjusted above to prevent going outside of date range\n    //For non bar graphs, if the schema date range is greater than a year and\n    //the date range filter is less than a year, the year slider doesn't show\n    //As a workaround, we reset the date range to one year\n    if (!hasMultipleTicks && schemaDateRangeLength > 366 && dateRangeLength < 365) {\n        start = ge; // reset start to ge\n        end = (0, _moment2.default)(ge - 1).add(1, 'y'); // add 1 year but remove the extra day\n        dateRange = _moment2.default.range(start, end);\n        dateRangeLength = dateRange.toArray('days').length;\n        hasDateBoundsAdjusted = true;\n    }\n    return { start: start, end: end, dateRange: dateRange, dateRangeLength: dateRangeLength, hasDateBoundsAdjusted: hasDateBoundsAdjusted };\n}\nfunction generateMonthPair(date) {\n    var isStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    var isEnd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var monthPair = {\n        year: date.year(),\n        month: date.month() + 1,\n        start_day: null,\n        end_day: null\n    };\n    if (isStart || isEnd) {\n        var day = parseInt(date.format('D'));\n        if (isStart) monthPair.start_day = day;\n        if (isEnd) monthPair.end_day = day;\n    }\n    return monthPair;\n}\nfunction generateMonthPairList(start, end) {\n    var generated = (0, _time_utils.generateDateRangePairs)(start, end, 1, 'months');\n    var size = generated.length;\n    var monthPairList = generated.map(function (range) {\n        return generateMonthPair(range[0]);\n    });\n    // Start\n    monthPairList[0] = generateMonthPair(start, true);\n    // End\n    if (size === 1) {\n        monthPairList[0].end_day = parseInt(end.format('D')); // `parseInt` because our API doesn't want days as strings\n    } else {\n        monthPairList[size - 1] = generateMonthPair(end, false, true);\n    }\n    return monthPairList;\n}\n// Really checks for leap day, not only leap year.\nfunction dateRangeContainsLeapYear(dateRange) {\n    var startYear = dateRange.start.year();\n    var endYear = dateRange.end.year();\n    var containsLeapYear = false;\n    while (startYear <= endYear) {\n        containsLeapYear = (0, _moment2.default)(startYear, 'YYYY').isLeapYear() && dateRange.contains((0, _moment2.default)([startYear, 1, 29])) ? true : containsLeapYear;\n        startYear++;\n    }\n    return containsLeapYear;\n}\n// 365 days or 366 if includes Feb 29th\nfunction dateRangeExactlyOneYear(dateRange) {\n    var yearLength = dateRangeContainsLeapYear(dateRange) ? 366 : 365;\n    return yearLength == dateRange.toArray('days').length;\n}\nexports.buildVisualAggregatesQueryPlan = buildVisualAggregatesQueryPlan;\nexports.parallelYearQueriesOnDateColumn = parallelYearQueriesOnDateColumn;\nexports.parallelMonthQueriesOnDateColumn = parallelMonthQueriesOnDateColumn;\nexports.partitionByMonthQueriesOnDateColumn = partitionByMonthQueriesOnDateColumn;\nexports.parallelDateRangeFilterQueries = parallelDateRangeFilterQueries;\nexports.createSumAcrossGroupsReducer = createSumAcrossGroupsReducer;\nexports.sortGroups = sortGroups;\nexports.findAlternateDateColumnForPartitioning = findAlternateDateColumnForPartitioning;\nexports.visAggQueryObject = visAggQueryObject;\nexports.getDateLimitsFromFilterState = getDateLimitsFromFilterState;\nexports.getDateBounds = getDateBounds;\nexports.generateMonthPair = generateMonthPair;\nexports.generateMonthPairList = generateMonthPairList;\nexports.dateRangeContainsLeapYear = dateRangeContainsLeapYear;\nexports.dateRangeExactlyOneYear = dateRangeExactlyOneYear;\nexports.dateRangeFilter = dateRangeFilter;\n\n/***/ }),\n/* 896 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.generateDateRangePairs = generateDateRangePairs;\nexports.dateToMoment = dateToMoment;\nexports.fiscalYearForDatasetDateRange = fiscalYearForDatasetDateRange;\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\n__webpack_require__(510);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction generateDateRangePairs(startMoment, endMoment) {\n    var fiscalYearStartMonth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n    var granularity = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'years';\n\n    var currentMoment = startMoment;\n    var start = void 0;\n    var end = void 0;\n    var pairs = [];\n    var fiscalYearOffset = fiscalYearStartMonth - 1;\n    while (currentMoment.isSame(endMoment) || currentMoment.isBefore(endMoment)) {\n        start = currentMoment.clone().startOf(granularity);\n        if (granularity === 'years' && fiscalYearStartMonth > 1) {\n            start.add(fiscalYearOffset, 'months');\n            // Initial value needs to start in previous fiscal year\n            if (currentMoment === startMoment) {\n                start.subtract(1, 'years');\n            }\n        }\n        end = start.clone().add(1, granularity).subtract(1, 'days');\n        // Squeeze to absolute bounds\n        if (start.isBefore(startMoment)) {\n            start = startMoment;\n        }\n        if (end.isAfter(endMoment)) {\n            end = endMoment;\n        }\n        // Only add if we generated a valid range\n        if (start.isBefore(end) || start.isSame(end)) {\n            pairs.push([start, end]);\n        }\n        currentMoment = end.clone().add(1, 'day');\n    }\n    return pairs;\n}\nfunction dateToMoment(string) {\n    return (0, _moment2.default)(string, 'YYYY-MM-DD');\n}\n// NOTE: This function is only for use with a range of *at most* 365 days (leap year)\n// NOTE: This function assumes that the range of start & end were generated from a dataset implying:\n//          dataset year == 2017 & entity startMonth = 7 => a range of 07/2017 -> 06/2018\nfunction fiscalYearForDatasetDateRange(startMoment, endMoment, startMomentMonth) {\n    if (startMoment.isAfter(endMoment)) {\n        throw new Error('startMoment cannot be after endMoment');\n    }\n    var yearLength = (0, _moment2.default)(startMoment, 'YYYY').isLeapYear() ? 366 : 365;\n    // moment.js months are zero-indexed\n    if (_moment2.default.range(startMoment, endMoment).toArray('days').length <= yearLength && (endMoment.month() + 1) % 12 < startMomentMonth - 1) {\n        return startMoment.year() - 1;\n    }\n    return startMoment.year();\n}\n\n/***/ }),\n/* 897 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (uuid) {\n    var result = uuid;\n    if (result && result.length === 32) {\n        result = result.toLowerCase();\n        [20, 16, 12, 8].forEach(function (value) {\n            result = result.slice(0, value) + '-' + result.slice(value);\n        });\n    }\n    return result;\n};\n\n;\n\n/***/ }),\n/* 898 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _superagent = __webpack_require__(183);\n\nvar _superagent2 = _interopRequireDefault(_superagent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar googleTranslateAPI = function googleTranslateAPI(words) {\n    return new Promise(function (resolve, reject) {\n        _superagent2.default.post('/translate').set('Accept', 'application/json').set('Content-Type', 'application/json').send({ words: words }).end(function (err, res) {\n            if (err || !res.ok) {\n                reject(err);\n            } else {\n                resolve(res.body);\n            }\n        });\n    });\n};\nexports.default = googleTranslateAPI;\n\n/***/ }),\n/* 899 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.trimAndFilterText = trimAndFilterText;\nexports.filterItems = filterItems;\n\nvar _fuse = __webpack_require__(900);\n\nvar _fuse2 = _interopRequireDefault(_fuse);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction trimAndFilterText(text) {\n    return text.replace(/[^0-9a-zA-Z]+/g, ' ').trim();\n}\nfunction filterItems(items, keys, query) {\n    if (!items.length || query === '') {\n        return items;\n    }\n    // coerce fields to string to make searchable\n    var searchableItems = items.map(function (item) {\n        return _lodash2.default.reduce(item, function (acc, value, key) {\n            return _extends({}, acc, _defineProperty({}, key, keys.includes(key) ? String(value) : value));\n        }, {});\n    }, {});\n    var fuse = new _fuse2.default(searchableItems, {\n        keys: keys,\n        threshold: 0.8\n    });\n    return fuse.search(trimAndFilterText(query));\n}\n\n/***/ }),\n/* 900 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * @license\n * Fuse - Lightweight fuzzy-search\n *\n * Copyright (c) 2012-2016 Kirollos Risk <kirollos@gmail.com>.\n * All Rights Reserved. Apache Software License 2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n;(function (global) {\n  'use strict'\n\n  function log () {\n    console.log.apply(console, arguments)\n  }\n\n  var MULTI_CHAR_REGEX = / +/g\n\n  var defaultOptions = {\n    // The name of the identifier property. If specified, the returned result will be a list\n    // of the items' dentifiers, otherwise it will be a list of the items.\n    id: null,\n\n    // Indicates whether comparisons should be case sensitive.\n\n    caseSensitive: false,\n\n    // An array of values that should be included from the searcher's output. When this array\n    // contains elements, each result in the list will be of the form `{ item: ..., include1: ..., include2: ... }`.\n    // Values you can include are `score`, `matchedLocations`\n    include: [],\n\n    // Whether to sort the result list, by score\n    shouldSort: true,\n\n    // The search function to use\n    // Note that the default search function ([[Function]]) must conform to the following API:\n    //\n    //  @param pattern The pattern string to search\n    //  @param options The search option\n    //  [[Function]].constructor = function(pattern, options)\n    //\n    //  @param text: the string to search in for the pattern\n    //  @return Object in the form of:\n    //    - isMatch: boolean\n    //    - score: Int\n    //  [[Function]].prototype.search = function(text)\n    searchFn: BitapSearcher,\n\n    // Default sort function\n    sortFn: function (a, b) {\n      return a.score - b.score\n    },\n\n    // The get function to use when fetching an object's properties.\n    // The default will search nested paths *ie foo.bar.baz*\n    getFn: deepValue,\n\n    // List of properties that will be searched. This also supports nested properties.\n    keys: [],\n\n    // Will print to the console. Useful for debugging.\n    verbose: false,\n\n    // When true, the search algorithm will search individual words **and** the full string,\n    // computing the final score as a function of both. Note that when `tokenize` is `true`,\n    // the `threshold`, `distance`, and `location` are inconsequential for individual tokens.\n    tokenize: false\n  }\n\n  function Fuse (list, options) {\n    var i\n    var len\n    var key\n    var keys\n\n    this.list = list\n    this.options = options = options || {}\n\n    // Add boolean type options\n    for (i = 0, keys = ['sort', 'shouldSort', 'verbose', 'tokenize'], len = keys.length; i < len; i++) {\n      key = keys[i]\n      this.options[key] = key in options ? options[key] : defaultOptions[key]\n    }\n    // Add all other options\n    for (i = 0, keys = ['searchFn', 'sortFn', 'keys', 'getFn', 'include'], len = keys.length; i < len; i++) {\n      key = keys[i]\n      this.options[key] = options[key] || defaultOptions[key]\n    }\n  }\n\n  Fuse.VERSION = '2.2.0'\n\n  /**\n   * Sets a new list for Fuse to match against.\n   * @param {Array} list\n   * @return {Array} The newly set list\n   * @public\n   */\n  Fuse.prototype.set = function (list) {\n    this.list = list\n    return list\n  }\n\n  Fuse.prototype.search = function (pattern) {\n    if (this.options.verbose) log('\\nSearch term:', pattern, '\\n')\n\n    this.pattern = pattern\n    this.results = []\n    this.resultMap = {}\n    this._keyMap = null\n\n    this._prepareSearchers()\n    this._startSearch()\n    this._computeScore()\n    this._sort()\n\n    var output = this._format()\n    return output\n  }\n\n  Fuse.prototype._prepareSearchers = function () {\n    var options = this.options\n    var pattern = this.pattern\n    var searchFn = options.searchFn\n    var tokens = pattern.split(MULTI_CHAR_REGEX)\n    var i = 0\n    var len = tokens.length\n\n    if (this.options.tokenize) {\n      this.tokenSearchers = []\n      for (; i < len; i++) {\n        this.tokenSearchers.push(new searchFn(tokens[i], options))\n      }\n    }\n    this.fullSeacher = new searchFn(pattern, options)\n  }\n\n  Fuse.prototype._startSearch = function () {\n    var options = this.options\n    var getFn = options.getFn\n    var list = this.list\n    var listLen = list.length\n    var keys = this.options.keys\n    var keysLen = keys.length\n    var key\n    var weight\n    var item = null\n    var i\n    var j\n\n    // Check the first item in the list, if it's a string, then we assume\n    // that every item in the list is also a string, and thus it's a flattened array.\n    if (typeof list[0] === 'string') {\n      // Iterate over every item\n      for (i = 0; i < listLen; i++) {\n        this._analyze('', list[i], i, i)\n      }\n    } else {\n      this._keyMap = {}\n      // Otherwise, the first item is an Object (hopefully), and thus the searching\n      // is done on the values of the keys of each item.\n      // Iterate over every item\n      for (i = 0; i < listLen; i++) {\n        item = list[i]\n        // Iterate over every key\n        for (j = 0; j < keysLen; j++) {\n          key = keys[j]\n          if (typeof key !== 'string') {\n            weight = (1 - key.weight) || 1\n            this._keyMap[key.name] = {\n              weight: weight\n            }\n            if (key.weight <= 0 || key.weight > 1) {\n              throw new Error('Key weight has to be > 0 and <= 1')\n            }\n            key = key.name\n          } else {\n            this._keyMap[key] = {\n              weight: 1\n            }\n          }\n          this._analyze(key, getFn(item, key, []), item, i)\n        }\n      }\n    }\n  }\n\n  Fuse.prototype._analyze = function (key, text, entity, index) {\n    var options = this.options\n    var words\n    var scores\n    var exists = false\n    var tokenSearchers\n    var tokenSearchersLen\n    var existingResult\n    var averageScore\n    var finalScore\n    var scoresLen\n    var mainSearchResult\n    var tokenSearcher\n    var termScores\n    var word\n    var tokenSearchResult\n    var i\n    var j\n\n    // Check if the text can be searched\n    if (text === undefined || text === null) {\n      return\n    }\n\n    scores = []\n\n    if (typeof text === 'string') {\n      words = text.split(MULTI_CHAR_REGEX)\n\n      if (options.verbose) log('---------\\nKey:', key)\n      if (options.verbose) log('Record:', words)\n\n      if (this.options.tokenize) {\n        tokenSearchers = this.tokenSearchers\n        tokenSearchersLen = tokenSearchers.length\n\n        for (i = 0; i < this.tokenSearchers.length; i++) {\n          tokenSearcher = this.tokenSearchers[i]\n          termScores = []\n          for (j = 0; j < words.length; j++) {\n            word = words[j]\n            tokenSearchResult = tokenSearcher.search(word)\n            if (tokenSearchResult.isMatch) {\n              exists = true\n              termScores.push(tokenSearchResult.score)\n              scores.push(tokenSearchResult.score)\n            } else {\n              termScores.push(1)\n              scores.push(1)\n            }\n          }\n          if (options.verbose) log('Token scores:', termScores)\n        }\n\n        averageScore = scores[0]\n        scoresLen = scores.length\n        for (i = 1; i < scoresLen; i++) {\n          averageScore += scores[i]\n        }\n        averageScore = averageScore / scoresLen\n\n        if (options.verbose) log('Token score average:', averageScore)\n      }\n\n      // Get the result\n      mainSearchResult = this.fullSeacher.search(text)\n      if (options.verbose) log('Full text score:', mainSearchResult.score)\n\n      finalScore = mainSearchResult.score\n      if (averageScore !== undefined) {\n        finalScore = (finalScore + averageScore) / 2\n      }\n\n      if (options.verbose) log('Score average:', finalScore)\n\n      // If a match is found, add the item to <rawResults>, including its score\n      if (exists || mainSearchResult.isMatch) {\n        // Check if the item already exists in our results\n        existingResult = this.resultMap[index]\n\n        if (existingResult) {\n          // Use the lowest score\n          // existingResult.score, bitapResult.score\n          existingResult.output.push({\n            key: key,\n            score: finalScore,\n            matchedIndices: mainSearchResult.matchedIndices\n          })\n        } else {\n          // Add it to the raw result list\n          this.resultMap[index] = {\n            item: entity,\n            output: [{\n              key: key,\n              score: finalScore,\n              matchedIndices: mainSearchResult.matchedIndices\n            }]\n          }\n\n          this.results.push(this.resultMap[index])\n        }\n      }\n    } else if (isArray(text)) {\n      for (i = 0; i < text.length; i++) {\n        this._analyze(key, text[i], entity, index)\n      }\n    }\n  }\n\n  Fuse.prototype._computeScore = function () {\n    var i\n    var j\n    var keyMap = this._keyMap\n    var totalScore\n    var output\n    var scoreLen\n    var score\n    var weight\n    var results = this.results\n    var bestScore\n    var nScore\n\n    if (this.options.verbose) log('\\n\\nComputing score:\\n')\n\n    for (i = 0; i < results.length; i++) {\n      totalScore = 0\n      output = results[i].output\n      scoreLen = output.length\n\n      bestScore = 1\n\n      for (j = 0; j < scoreLen; j++) {\n        score = output[j].score\n        weight = keyMap ? keyMap[output[j].key].weight : 1\n\n        nScore = score * weight\n\n        if (weight !== 1) {\n          bestScore = Math.min(bestScore, nScore)\n        } else {\n          totalScore += nScore\n          output[j].nScore = nScore\n        }\n      }\n\n      if (bestScore === 1) {\n        results[i].score = totalScore / scoreLen\n      } else {\n        results[i].score = bestScore\n      }\n\n      if (this.options.verbose) log(results[i])\n    }\n  }\n\n  Fuse.prototype._sort = function () {\n    var options = this.options\n    if (options.shouldSort) {\n      if (options.verbose) log('\\n\\nSorting....')\n      this.results.sort(options.sortFn)\n    }\n  }\n\n  Fuse.prototype._format = function () {\n    var options = this.options\n    var getFn = options.getFn\n    var finalOutput = []\n    var item\n    var i\n    var len\n    var results = this.results\n    var replaceValue\n    var getItemAtIndex\n    var include = options.include\n\n    if (options.verbose) log('\\n\\nOutput:\\n\\n', results)\n\n    // Helper function, here for speed-up, which replaces the item with its value,\n    // if the options specifies it,\n    replaceValue = options.id ? function (index) {\n      results[index].item = getFn(results[index].item, options.id, [])[0]\n    } : function () {}\n\n    getItemAtIndex = function (index) {\n      var record = results[index]\n      var data\n      var includeVal\n      var j\n      var output\n      var _item\n      var _result\n\n      // If `include` has values, put the item in the result\n      if (include.length > 0) {\n        data = {\n          item: record.item\n        }\n        if (include.indexOf('matches') !== -1) {\n          output = record.output\n          data.matches = []\n          for (j = 0; j < output.length; j++) {\n            _item = output[j]\n            _result = {\n              indices: _item.matchedIndices\n            }\n            if (_item.key) {\n              _result.key = _item.key\n            }\n            data.matches.push(_result)\n          }\n        }\n\n        if (include.indexOf('score') !== -1) {\n          data.score = results[index].score\n        }\n\n      } else {\n        data = record.item\n      }\n\n      return data\n    }\n\n    // From the results, push into a new array only the item identifier (if specified)\n    // of the entire item.  This is because we don't want to return the <results>,\n    // since it contains other metadata\n    for (i = 0, len = results.length; i < len; i++) {\n      replaceValue(i)\n      item = getItemAtIndex(i)\n      finalOutput.push(item)\n    }\n\n    return finalOutput\n  }\n\n  // Helpers\n\n  function deepValue (obj, path, list) {\n    var firstSegment\n    var remaining\n    var dotIndex\n    var value\n    var i\n    var len\n\n    if (!path) {\n      // If there's no path left, we've gotten to the object we care about.\n      list.push(obj)\n    } else {\n      dotIndex = path.indexOf('.')\n\n      if (dotIndex !== -1) {\n        firstSegment = path.slice(0, dotIndex)\n        remaining = path.slice(dotIndex + 1)\n      } else {\n        firstSegment = path\n      }\n\n      value = obj[firstSegment]\n      if (value !== null && value !== undefined) {\n        if (!remaining && (typeof value === 'string' || typeof value === 'number')) {\n          list.push(value)\n        } else if (isArray(value)) {\n          // Search each item in the array.\n          for (i = 0, len = value.length; i < len; i++) {\n            deepValue(value[i], remaining, list)\n          }\n        } else if (remaining) {\n          // An object. Recurse further.\n          deepValue(value, remaining, list)\n        }\n      }\n    }\n\n    return list\n  }\n\n  function isArray (obj) {\n    return Object.prototype.toString.call(obj) === '[object Array]'\n  }\n\n  /**\n   * Adapted from \"Diff, Match and Patch\", by Google\n   *\n   *   http://code.google.com/p/google-diff-match-patch/\n   *\n   * Modified by: Kirollos Risk <kirollos@gmail.com>\n   * -----------------------------------------------\n   * Details: the algorithm and structure was modified to allow the creation of\n   * <Searcher> instances with a <search> method which does the actual\n   * bitap search. The <pattern> (the string that is searched for) is only defined\n   * once per instance and thus it eliminates redundant re-creation when searching\n   * over a list of strings.\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\")\n   * you may not use this file except in compliance with the License.\n   */\n  function BitapSearcher (pattern, options) {\n    options = options || {}\n    this.options = options\n    this.options.location = options.location || BitapSearcher.defaultOptions.location\n    this.options.distance = 'distance' in options ? options.distance : BitapSearcher.defaultOptions.distance\n    this.options.threshold = 'threshold' in options ? options.threshold : BitapSearcher.defaultOptions.threshold\n    this.options.maxPatternLength = options.maxPatternLength || BitapSearcher.defaultOptions.maxPatternLength\n\n    this.pattern = options.caseSensitive ? pattern : pattern.toLowerCase()\n    this.patternLen = pattern.length\n\n    if (this.patternLen <= this.options.maxPatternLength) {\n      this.matchmask = 1 << (this.patternLen - 1)\n      this.patternAlphabet = this._calculatePatternAlphabet()\n    }\n  }\n\n  BitapSearcher.defaultOptions = {\n    // Approximately where in the text is the pattern expected to be found?\n    location: 0,\n\n    // Determines how close the match must be to the fuzzy location (specified above).\n    // An exact letter match which is 'distance' characters away from the fuzzy location\n    // would score as a complete mismatch. A distance of '0' requires the match be at\n    // the exact location specified, a threshold of '1000' would require a perfect match\n    // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n    distance: 100,\n\n    // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n    // (of both letters and location), a threshold of '1.0' would match anything.\n    threshold: 0.6,\n\n    // Machine word size\n    maxPatternLength: 32\n  }\n\n  /**\n   * Initialize the alphabet for the Bitap algorithm.\n   * @return {Object} Hash of character locations.\n   * @private\n   */\n  BitapSearcher.prototype._calculatePatternAlphabet = function () {\n    var mask = {},\n      i = 0\n\n    for (i = 0; i < this.patternLen; i++) {\n      mask[this.pattern.charAt(i)] = 0\n    }\n\n    for (i = 0; i < this.patternLen; i++) {\n      mask[this.pattern.charAt(i)] |= 1 << (this.pattern.length - i - 1)\n    }\n\n    return mask\n  }\n\n  /**\n   * Compute and return the score for a match with `e` errors and `x` location.\n   * @param {number} errors Number of errors in match.\n   * @param {number} location Location of match.\n   * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n   * @private\n   */\n  BitapSearcher.prototype._bitapScore = function (errors, location) {\n    var accuracy = errors / this.patternLen,\n      proximity = Math.abs(this.options.location - location)\n\n    if (!this.options.distance) {\n      // Dodge divide by zero error.\n      return proximity ? 1.0 : accuracy\n    }\n    return accuracy + (proximity / this.options.distance)\n  }\n\n  /**\n   * Compute and return the result of the search\n   * @param {String} text The text to search in\n   * @return {Object} Literal containing:\n   *                          {Boolean} isMatch Whether the text is a match or not\n   *                          {Decimal} score Overall score for the match\n   * @public\n   */\n  BitapSearcher.prototype.search = function (text) {\n    var options = this.options\n    var i\n    var j\n    var textLen\n    var location\n    var threshold\n    var bestLoc\n    var binMin\n    var binMid\n    var binMax\n    var start, finish\n    var bitArr\n    var lastBitArr\n    var charMatch\n    var score\n    var locations\n    var matches\n    var isMatched\n    var matchMask\n    var matchedIndices\n    var matchesLen\n    var match\n\n    text = options.caseSensitive ? text : text.toLowerCase()\n\n    if (this.pattern === text) {\n      // Exact match\n      return {\n        isMatch: true,\n        score: 0,\n        matchedIndices: [[0, text.length - 1]]\n      }\n    }\n\n    // When pattern length is greater than the machine word length, just do a a regex comparison\n    if (this.patternLen > options.maxPatternLength) {\n      matches = text.match(new RegExp(this.pattern.replace(MULTI_CHAR_REGEX, '|')))\n      isMatched = !!matches\n\n      if (isMatched) {\n        matchedIndices = []\n        for (i = 0, matchesLen = matches.length; i < matchesLen; i++) {\n          match = matches[i]\n          matchedIndices.push([text.indexOf(match), match.length - 1])\n        }\n      }\n\n      return {\n        isMatch: isMatched,\n        // TODO: revisit this score\n        score: isMatched ? 0.5 : 1,\n        matchedIndices: matchedIndices\n      }\n    }\n\n    location = options.location\n    // Set starting location at beginning text and initialize the alphabet.\n    textLen = text.length\n    // Highest score beyond which we give up.\n    threshold = options.threshold\n    // Is there a nearby exact match? (speedup)\n    bestLoc = text.indexOf(this.pattern, location)\n\n    // a mask of the matches\n    matchMask = []\n    for (i = 0; i < textLen; i++) {\n      matchMask[i] = 0\n    }\n\n    if (bestLoc != -1) {\n      threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n      // What about in the other direction? (speed up)\n      bestLoc = text.lastIndexOf(this.pattern, location + this.patternLen)\n\n      if (bestLoc != -1) {\n        threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n      }\n    }\n\n    bestLoc = -1\n    score = 1\n    locations = []\n    binMax = this.patternLen + textLen\n\n    for (i = 0; i < this.patternLen; i++) {\n      // Scan for the best match; each iteration allows for one more error.\n      // Run a binary search to determine how far from the match location we can stray\n      // at this error level.\n      binMin = 0\n      binMid = binMax\n      while (binMin < binMid) {\n        if (this._bitapScore(i, location + binMid) <= threshold) {\n          binMin = binMid\n        } else {\n          binMax = binMid\n        }\n        binMid = Math.floor((binMax - binMin) / 2 + binMin)\n      }\n\n      // Use the result from this iteration as the maximum for the next.\n      binMax = binMid\n      start = Math.max(1, location - binMid + 1)\n      finish = Math.min(location + binMid, textLen) + this.patternLen\n\n      // Initialize the bit array\n      bitArr = Array(finish + 2)\n\n      bitArr[finish + 1] = (1 << i) - 1\n\n      for (j = finish; j >= start; j--) {\n        charMatch = this.patternAlphabet[text.charAt(j - 1)]\n\n        if (charMatch) {\n          matchMask[j - 1] = 1\n        }\n\n        if (i === 0) {\n          // First pass: exact match.\n          bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch\n        } else {\n          // Subsequent passes: fuzzy match.\n          bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch | (((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1) | lastBitArr[j + 1]\n        }\n        if (bitArr[j] & this.matchmask) {\n          score = this._bitapScore(i, j - 1)\n\n          // This match will almost certainly be better than any existing match.\n          // But check anyway.\n          if (score <= threshold) {\n            // Indeed it is\n            threshold = score\n            bestLoc = j - 1\n            locations.push(bestLoc)\n\n            if (bestLoc > location) {\n              // When passing loc, don't exceed our current distance from loc.\n              start = Math.max(1, 2 * location - bestLoc)\n            } else {\n              // Already passed loc, downhill from here on in.\n              break\n            }\n          }\n        }\n      }\n\n      // No hope for a (better) match at greater error levels.\n      if (this._bitapScore(i + 1, location) > threshold) {\n        break\n      }\n      lastBitArr = bitArr\n    }\n\n    matchedIndices = this._getMatchedIndices(matchMask)\n\n    // Count exact matches (those with a score of 0) to be \"almost\" exact\n    return {\n      isMatch: bestLoc >= 0,\n      score: score === 0 ? 0.001 : score,\n      matchedIndices: matchedIndices\n    }\n  }\n\n  BitapSearcher.prototype._getMatchedIndices = function (matchMask) {\n    var matchedIndices = []\n    var start = -1\n    var end = -1\n    var i = 0\n    var match\n    var len = len = matchMask.length\n    for (; i < len; i++) {\n      match = matchMask[i]\n      if (match && start === -1) {\n        start = i\n      } else if (!match && start !== -1) {\n        end = i - 1\n        matchedIndices.push([start, end])\n        start = -1\n      }\n    }\n    if (matchMask[i - 1]) {\n      matchedIndices.push([start, i - 1])\n    }\n    return matchedIndices\n  }\n\n  // Export to Common JS Loader\n  if (true) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = Fuse\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(function () {\n      return Fuse\n    })\n  } else {\n    // Browser globals (root is window)\n    global.Fuse = Fuse\n  }\n\n})(this)\n\n\n/***/ }),\n/* 901 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar TemplateFixture = [{\n    id: 0,\n    title: 'Checkbook Report',\n    description: 'Gain insights into transaction-level detail like vendors, invoices, and amounts.',\n    imageUrl: 'images/templates/Report-Templates-Checkbook.svg',\n    exampleUrl: 'https://huberheightsoh.opengov.com/data/#/1320/query=E2B9A625618381261420DD62CCBABCBB&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/203007066/Checkbook_Template__1_.xlsx'\n}, {\n    id: 1,\n    title: 'Water Consumption Report',\n    description: 'Analyze your government’s water consumption and production to identify trends.',\n    imageUrl: 'images/templates/Report-Templates-Valuations.svg',\n    exampleUrl: 'https://northglennco.opengov.com/data/#/2860/query=8DF0FF7DDB50AF7FB91DC46F53650C34&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/203039373/Water_Production_Consumption_Template.xlsx'\n}, {\n    id: 2,\n    title: 'Police Runs Report',\n    description: 'Explore the volume and types of police runs in your municipality.',\n    imageUrl: 'images/templates/Report-Templates-Police.svg',\n    exampleUrl: 'https://edgewoodky.opengov.com/data/#/4942/query=69677085DCBD478C39EEF4FA5EF4BFCC&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/202876126/Police_Run_Data_Template.xlsx'\n}];\nexports.default = TemplateFixture;\n\n/***/ }),\n/* 902 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _capital_tabs = __webpack_require__(903);\n\nvar _capital_badge = __webpack_require__(908);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexNav = function (_Component) {\n    _inherits(ReportIndexNav, _Component);\n\n    function ReportIndexNav() {\n        _classCallCheck(this, ReportIndexNav);\n\n        var _this = _possibleConstructorReturn(this, (ReportIndexNav.__proto__ || Object.getPrototypeOf(ReportIndexNav)).apply(this, arguments));\n\n        _this.onTabChange = function (index) {\n            if (!_this.props.newReportingEnabled && index === 1) {\n                return window.location.href = gon.ogOperateHost + '/dashboards/' + _this.props.entityId;\n            }\n            if (index === 1) {\n                window.location.href = gon.ogOperateHost + '/reporting/' + _this.props.entityId;\n            } else if (index === 2) {\n                window.location.href = gon.ogOperateHost + '/dashboards/' + _this.props.entityId;\n            }\n        };\n        return _this;\n    }\n\n    _createClass(ReportIndexNav, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                children = _props.children,\n                dashboardsEnabled = _props.dashboardsEnabled,\n                newReportingEnabled = _props.newReportingEnabled;\n\n            return _react2.default.createElement(\"header\", { className: \"performance-header\" }, _react2.default.createElement(_capital_tabs.Tab.Group, { activeTabIndex: 0, onTabIndexChanged: this.onTabChange }, _react2.default.createElement(_capital_tabs.Tab.Option, { dataTest: \"legacy-report-tab\" }, \"Reports\", newReportingEnabled && _react2.default.createElement(_capital_badge.Badge, { text: \"Classic\", variant: \"neutral\" })), newReportingEnabled && _react2.default.createElement(_capital_tabs.Tab.Option, { dataTest: \"new-report-tab\" }, \"Reports\", _react2.default.createElement(_capital_badge.Badge, { text: \"Next Gen\", variant: \"strong\" })), dashboardsEnabled && _react2.default.createElement(_capital_tabs.Tab.Option, { dataTest: \"dashboard-tab\" }, \"Dashboards\")), children);\n        }\n    }]);\n\n    return ReportIndexNav;\n}(_react.Component);\n\nexports.default = ReportIndexNav;\n\nReportIndexNav.propTypes = {\n    dashboardsEnabled: _propTypes2.default.bool.isRequired,\n    entityId: _propTypes2.default.string.isRequired,\n    newReportingEnabled: _propTypes2.default.bool\n};\n\n/***/ }),\n/* 903 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Tab = undefined;\n\nvar _Tab = __webpack_require__(904);\n\nvar _Tab2 = __webpack_require__(906);\n\nvar Tab = exports.Tab = {\n    Group: _Tab.TabGroup,\n    Option: _Tab2.TabOption\n};\n\n/***/ }),\n/* 904 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _Tab = __webpack_require__(905);\n\nObject.defineProperty(exports, 'TabGroup', {\n  enumerable: true,\n  get: function get() {\n    return _Tab.TabGroup;\n  }\n});\n\n/***/ }),\n/* 905 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.TabGroup = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TabGroup = exports.TabGroup = function (_React$Component) {\n    _inherits(TabGroup, _React$Component);\n\n    function TabGroup(props) {\n        _classCallCheck(this, TabGroup);\n\n        var _this = _possibleConstructorReturn(this, (TabGroup.__proto__ || Object.getPrototypeOf(TabGroup)).call(this, props));\n\n        _this.onTabClicked = function (tabIndexClicked) {\n            _this.setState({ activeTabIndex: tabIndexClicked });\n            if (_this.props.onTabIndexChanged) {\n                _this.props.onTabIndexChanged(tabIndexClicked);\n            }\n        };\n        _this.state = {\n            activeTabIndex: props.activeTabIndex\n        };\n        return _this;\n    }\n\n    _createClass(TabGroup, [{\n        key: \"render\",\n        value: function render() {\n            var _this2 = this;\n\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"nav\", { role: \"tablist\", \"data-test\": this.props.dataTest, className: \"Tab_GroupContainer\" }, _react2.default.Children.map(this.props.children, function (child, index) {\n                return child ? _react2.default.cloneElement(child, {\n                    activeTabIndex: _this2.state.activeTabIndex,\n                    key: index,\n                    index: index,\n                    numTabsInGroup: _react2.default.Children.count(_this2.props.children),\n                    onTabClicked: function onTabClicked(tabIndexClicked) {\n                        return _this2.onTabClicked(tabIndexClicked);\n                    }\n                }) : null;\n            }), _react2.default.createElement(\"div\", { className: \"Tab_NavShadowContainer\" }, _react2.default.createElement(\"div\", { className: \"Tab_NavShadow\" }))));\n        }\n    }]);\n\n    return TabGroup;\n}(_react2.default.Component);\n\n/***/ }),\n/* 906 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _Tab = __webpack_require__(907);\n\nObject.defineProperty(exports, 'TabOption', {\n  enumerable: true,\n  get: function get() {\n    return _Tab.TabOption;\n  }\n});\n\n/***/ }),\n/* 907 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.TabOption = undefined;\n\nvar _classnames2 = __webpack_require__(7);\n\nvar _classnames3 = _interopRequireDefault(_classnames2);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar TabOption = exports.TabOption = function TabOption(props) {\n    var _classnames;\n\n    var isFirstTab = props.index === 0;\n    var isActiveTab = props.activeTabIndex === props.index;\n    var isLeftOfActiveTab = props.index === props.activeTabIndex - 1;\n    var isRightOfActiveTab = props.index === props.activeTabIndex + 1;\n    var isInactiveTab = !isActiveTab && !isLeftOfActiveTab && !isRightOfActiveTab;\n    var classes = (0, _classnames3.default)((_classnames = {}, _defineProperty(_classnames, 'Tab_activeTab', isActiveTab), _defineProperty(_classnames, 'Tab_inactiveTab', isInactiveTab), _defineProperty(_classnames, 'Tab_firstInactiveTab', isFirstTab && !isActiveTab), _defineProperty(_classnames, 'Tab_leftOfActive', isLeftOfActiveTab), _defineProperty(_classnames, 'Tab_rightOfActive', isRightOfActiveTab), _classnames));\n    return _react2.default.createElement(\"div\", { role: \"presentation\" }, _react2.default.createElement(\"button\", { role: \"tab\", type: \"button\", tabIndex: 0, title: props.label, \"data-test\": props.dataTest, className: classes, onClick: function onClick() {\n            return props.onTabClicked(props.index);\n        } }, props.children));\n};\n\n/***/ }),\n/* 908 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _Badge = __webpack_require__(909);\n\nObject.defineProperty(exports, 'Badge', {\n  enumerable: true,\n  get: function get() {\n    return _Badge.Badge;\n  }\n});\n\n/***/ }),\n/* 909 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Badge = undefined;\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _capitalStyle = __webpack_require__(910);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Badge = exports.Badge = function Badge(props) {\n    var _variant;\n\n    // using an inline style to apply color tokens that are not exposed in CSS.\n    var inlineStyle = {};\n    if (props.variant === 'positive') {\n        inlineStyle = { backgroundColor: _capitalStyle.vizColors.jade[700] };\n    } else if (props.variant === 'negative') {\n        inlineStyle = { backgroundColor: _capitalStyle.vizColors.red[700] };\n    } else if (props.variant === 'warning') {\n        inlineStyle = { backgroundColor: _capitalStyle.vizColors.orange[200] };\n    }\n    var variant = (_variant = {}, _defineProperty(_variant, 'Badge_neutral', props.variant === 'neutral'), _defineProperty(_variant, 'Badge_warning', props.variant === 'warning'), _defineProperty(_variant, 'Badge_bright', props.variant === 'bright'), _defineProperty(_variant, 'Badge_strong', props.variant === 'strong'), _defineProperty(_variant, 'Badge_positive', props.variant === 'positive'), _defineProperty(_variant, 'Badge_negative', props.variant === 'negative'), _variant);\n    return _react2.default.createElement(\"span\", { className: (0, _classnames2.default)('Badge', variant), style: inlineStyle, \"data-test\": props.dataTest }, props.text);\n};\nBadge.defaultProps = {\n    text: '',\n    variant: 'neutral'\n};\n\n/***/ }),\n/* 910 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _colorUtils = __webpack_require__(911);\n\nObject.keys(_colorUtils).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _colorUtils[key];\n    }\n  });\n});\n\nvar _tokens = __webpack_require__(512);\n\nObject.keys(_tokens).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _tokens[key];\n    }\n  });\n});\n\n/***/ }),\n/* 911 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getMonochromeVizColors = getMonochromeVizColors;\nexports.getVizColors = getVizColors;\n\nvar _tokens = __webpack_require__(512);\n\nfunction getMonochromeVizColors(datapoints, startingHue) {\n  // datapoints: number of colors needed\n  // startingColor: if it should start at a certain color (monochrome only)\n\n  var colors = [];\n\n  // Set starting hue\n  if (startingHue == \"\") {\n    var currentHue = _tokens.vizColorValueOrder[0];\n  } else {\n    var currentHue = startingHue;\n  }\n\n  // Set counter variables\n  var hues = Math.ceil(datapoints / 9);\n  var currentData = 0;\n  var valueArray = [];\n  var startValue = _tokens.vizColors[currentHue].data;\n\n  // Loop through hues\n  for (var i = 0; i < hues; i++) {\n    // Append values of this hue to array and sort array\n    for (var y = 0; currentData < datapoints && y < 9; y++) {\n      currentData++;\n      valueArray.push(_tokens.vizColorValueOrder[startValue][y]);\n    }\n    valueArray = valueArray.sort();\n\n    // Append hex codes to colors array\n    var z = currentData - valueArray.length;\n    for (var x = 0; x < valueArray.length; x++) {\n      colors[z] = _tokens.vizColors[currentHue][valueArray[x]];\n      z++;\n    }\n\n    // Reset for next hue\n    valueArray = [];\n    currentHue = _tokens.vizColors[currentHue].nextHue;\n    startValue = _tokens.vizColors[currentHue].data;\n  }\n\n  return colors;\n}\n\nfunction getVizColors(datapoints) {\n  // datapoints: number of colors needed\n\n  var colors = [];\n  var orderRepeat = 0;\n  var currentHue = 0;\n\n  for (var i = 0; i < datapoints; i++) {\n    if ((i + 1) % 20 === 0) {\n      orderRepeat++;\n      currentHue = 0;\n    }\n    if (orderRepeat >= 9) {\n      orderRepeat = 0;\n    }\n    var hue = _tokens.vizColorHueOrder[currentHue];\n    var value = _tokens.vizColorValueOrder[_tokens.vizColors[hue].data][orderRepeat];\n    var baseColor = _tokens.vizColors[hue][value];\n    var hoverColor = _tokens.vizColors[hue][value + 100];\n    var highlightColor = _tokens.vizColors[hue][_tokens.vizColors[hue].highlight];\n    colors.push({ base: baseColor, hover: hoverColor, line: baseColor, highlight: highlightColor });\n    currentHue++;\n  }\n\n  return colors;\n}\n\n/***/ }),\n/* 912 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexHeader = function (_React$Component) {\n    _inherits(ReportIndexHeader, _React$Component);\n\n    function ReportIndexHeader() {\n        _classCallCheck(this, ReportIndexHeader);\n\n        return _possibleConstructorReturn(this, (ReportIndexHeader.__proto__ || Object.getPrototypeOf(ReportIndexHeader)).apply(this, arguments));\n    }\n\n    _createClass(ReportIndexHeader, [{\n        key: \"render\",\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"home-pageheader\" }, this.props.children);\n        }\n    }]);\n\n    return ReportIndexHeader;\n}(_react2.default.Component);\n\nexports.default = ReportIndexHeader;\n\n/***/ }),\n/* 913 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexSearch = function (_Component) {\n    _inherits(ReportIndexSearch, _Component);\n\n    function ReportIndexSearch() {\n        _classCallCheck(this, ReportIndexSearch);\n\n        var _this = _possibleConstructorReturn(this, (ReportIndexSearch.__proto__ || Object.getPrototypeOf(ReportIndexSearch)).apply(this, arguments));\n\n        _this.handleChange = function (e) {\n            _this.props.onHandleUserInput(e.target.value);\n        };\n        return _this;\n    }\n\n    _createClass(ReportIndexSearch, [{\n        key: \"componentDidMount\",\n        value: function componentDidMount() {\n            this.props.onHandleUserInput(this.props.searchInput);\n        }\n    }, {\n        key: \"render\",\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"header-item report-search\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"SEARCH:\"), _react2.default.createElement(\"div\", { className: \"ui-search\" }, _react2.default.createElement(\"input\", { type: \"search\", placeholder: \"Search for reports\", value: this.props.searchInput, onChange: this.handleChange }), _react2.default.createElement(\"span\", { className: \"icon-search-1\" }))));\n        }\n    }]);\n\n    return ReportIndexSearch;\n}(_react.Component);\n\nexports.default = ReportIndexSearch;\n\n/***/ }),\n/* 914 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _filter_options = __webpack_require__(915);\n\nvar _filter_options2 = _interopRequireDefault(_filter_options);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexFilter = function (_React$Component) {\n    _inherits(ReportIndexFilter, _React$Component);\n\n    function ReportIndexFilter() {\n        _classCallCheck(this, ReportIndexFilter);\n\n        var _this = _possibleConstructorReturn(this, (ReportIndexFilter.__proto__ || Object.getPrototypeOf(ReportIndexFilter)).apply(this, arguments));\n\n        _this.state = {\n            display: false\n        };\n        _this.toggleDropdown = function () {\n            _this.setState({ display: !_this.state.display });\n        };\n        _this.getCheckedKeywordCount = function () {\n            return _this.props.checkedKeywords.length > 0 ? _this.props.checkedKeywords.length : 'None';\n        };\n        return _this;\n    }\n\n    _createClass(ReportIndexFilter, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            return _react2.default.createElement(\"div\", { className: \"header-item report-filter\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"FILTER BY KEYWORD:\"), _react2.default.createElement(\"div\", { className: \"ui-dropdown\" }, _react2.default.createElement(\"a\", { className: \"ui-dropdown__toggle ui-button\", onClick: function onClick() {\n                    return _this2.toggleDropdown();\n                } }, _react2.default.createElement(\"small\", { className: \"ui-dropdown__label\" }), _react2.default.createElement(\"span\", null, this.getCheckedKeywordCount(), \" selected\")), this.state.display ? _react2.default.createElement(_filter_options2.default, Object.assign({}, this.props, { toggleDropdown: this.toggleDropdown })) : null)));\n        }\n    }]);\n\n    return ReportIndexFilter;\n}(_react2.default.Component);\n\nexports.default = ReportIndexFilter;\n\n/***/ }),\n/* 915 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _reactDom = __webpack_require__(28);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FilterOption = function (_React$Component) {\n    _inherits(FilterOption, _React$Component);\n\n    function FilterOption() {\n        _classCallCheck(this, FilterOption);\n\n        var _this = _possibleConstructorReturn(this, (FilterOption.__proto__ || Object.getPrototypeOf(FilterOption)).apply(this, arguments));\n\n        _this.state = {\n            mappedKeywords: [],\n            searchQuery: ''\n        };\n        _this.handleOptionCancel = function () {\n            _this.props.toggleDropdown();\n        };\n        _this.handleDocumentClick = function (e) {\n            var inContainer = _jquery2.default.contains((0, _reactDom.findDOMNode)(_this.targetDropdown), e.target);\n            if (!inContainer) {\n                _this.handleOptionCancel();\n            }\n        };\n        _this._unsubscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).off('click', _this.handleDocumentClick);\n        };\n        _this._subscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).on('click', _this.handleDocumentClick);\n        };\n        _this.generateKeywordsMap = function (keywords, selected) {\n            return _lodash2.default.map(keywords, function (keyword) {\n                return _lodash2.default.includes(selected, keyword) ? { 'title': keyword, 'checked': true } : { 'title': keyword, 'checked': false };\n            });\n        };\n        _this.handleChange = function (e) {\n            _this.setState({ searchQuery: e.target.value });\n        };\n        _this.toggleKeywords = function (keyword) {\n            var mappedKeywords = _lodash2.default.map(_this.state.mappedKeywords, function (obj) {\n                return obj.title === keyword ? { 'title': keyword, 'checked': !obj.checked } : obj;\n            });\n            _this.setState({ mappedKeywords: mappedKeywords });\n            var checkedKeywordsMap = _lodash2.default.filter(mappedKeywords, function (obj) {\n                return obj.checked;\n            });\n            var checkedKeywords = _lodash2.default.map(checkedKeywordsMap, _lodash2.default.bind(function (keyword) {\n                return keyword.title;\n            }, _this));\n            _this.props.onHandleChangeKeywords(checkedKeywords);\n        };\n        return _this;\n    }\n\n    _createClass(FilterOption, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this._subscribeDOMEvents();\n            var mappedKeywords = this.generateKeywordsMap(this.props.keywords, this.props.checkedKeywords);\n            this.setState({ mappedKeywords: mappedKeywords });\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._unsubscribeDOMEvents();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var dropDownStyle = { display: 'inline-block' };\n            var query = this.state.searchQuery;\n            var filteredKeywords = _lodash2.default.filter(this.state.mappedKeywords, function (obj) {\n                return _lodash2.default.includes(obj.title.toLowerCase(), query.toLowerCase());\n            });\n            var options = _lodash2.default.map(filteredKeywords, function (keyword) {\n                return _react2.default.createElement(\"label\", { key: keyword.title, className: \"ui-form__checkbox-label\", onClick: function onClick() {\n                        return _this2.toggleKeywords(keyword.title);\n                    } }, _react2.default.createElement(\"span\", { className: \"keyword_name\", title: keyword.title }, keyword.title), _react2.default.createElement(\"div\", { className: 'ui-form__checkbox ' + (keyword.checked ? 'is-checked' : '') }));\n            });\n            return _react2.default.createElement(\"div\", { ref: function ref(targetDropdown) {\n                    _this2.targetDropdown = targetDropdown;\n                }, className: \"ui-dropdown__target filter-options__target\", style: dropDownStyle }, _react2.default.createElement(\"div\", { className: \"ui-dropdown__list\" }, _react2.default.createElement(\"div\", { className: \"dropdown__row_input icon-search-1\" }, _react2.default.createElement(\"input\", { className: \"filter-search dropdown__row__input\", type: \"search\", placeholder: \"Search\", onChange: this.handleChange })), this.props.userRole == 'opengov_admin' || this.props.userRole == 'entity_admin' ? _react2.default.createElement(\"label\", { className: \"manage-keys\", onClick: function onClick() {\n                    return _this2.props.onHandleManageKeywords();\n                } }, \" Manage Keywords\") : null, _react2.default.createElement(\"div\", { className: \"ui-form reports__keywords_list \" }, options.length > 0 ? options : _react2.default.createElement(\"div\", { className: \"no-keywords-found\" }, this.props.keywords.length > 0 || this.state.searchQuery.length > 0 ? 'No matching keywords' : 'No keywords found'))));\n        }\n    }]);\n\n    return FilterOption;\n}(_react2.default.Component);\n\nexports.default = FilterOption;\n\n/***/ }),\n/* 916 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexSort = function (_React$Component) {\n    _inherits(ReportIndexSort, _React$Component);\n\n    function ReportIndexSort() {\n        _classCallCheck(this, ReportIndexSort);\n\n        var _this = _possibleConstructorReturn(this, (ReportIndexSort.__proto__ || Object.getPrototypeOf(ReportIndexSort)).apply(this, arguments));\n\n        _this.handleChange = function (value) {\n            _this.props.handleSorting(value);\n        };\n        return _this;\n    }\n\n    _createClass(ReportIndexSort, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            this.props.handleSorting(this.props.sortOrder);\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"header-item report-sort\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"SORT:\"), _react2.default.createElement(Ovid.DropdownList, { toggleClass: \"ui-button\", value: this.props.sortOrder, onChange: this.handleChange }, _react2.default.createElement(Ovid.DropdownListItem, { key: \"1\", value: \"asc\", title: \"A-Z\" }), _react2.default.createElement(Ovid.DropdownListItem, { key: \"2\", value: \"desc\", title: \"Z-A\" }))));\n        }\n    }]);\n\n    return ReportIndexSort;\n}(_react2.default.Component);\n\nexports.default = ReportIndexSort;\n\n/***/ }),\n/* 917 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexList = function (_React$Component) {\n    _inherits(ReportIndexList, _React$Component);\n\n    function ReportIndexList() {\n        _classCallCheck(this, ReportIndexList);\n\n        return _possibleConstructorReturn(this, (ReportIndexList.__proto__ || Object.getPrototypeOf(ReportIndexList)).apply(this, arguments));\n    }\n\n    _createClass(ReportIndexList, [{\n        key: \"render\",\n        value: function render() {\n            var _props = this.props,\n                reportViewType = _props.reportViewType,\n                changeReportViewType = _props.changeReportViewType;\n\n            return _react2.default.createElement(\"div\", { className: \"header-item report-list\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"SHOW HOW:\"), _react2.default.createElement(\"div\", { className: \"ui-button-group\" }, _react2.default.createElement(\"a\", { className: 'ui-button icon-view-grid-1 ' + (reportViewType == 'grid' ? 'is-selected' : ''), onClick: function onClick() {\n                    return changeReportViewType('grid');\n                } }), _react2.default.createElement(\"a\", { className: 'ui-button icon-view-list-1 ' + (reportViewType == 'list' ? 'is-selected' : ''), onClick: function onClick() {\n                    return changeReportViewType('list');\n                } }))));\n        }\n    }]);\n\n    return ReportIndexList;\n}(_react2.default.Component);\n\nexports.default = ReportIndexList;\n\n/***/ }),\n/* 918 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportIndexShow = function (_React$Component) {\n    _inherits(ReportIndexShow, _React$Component);\n\n    function ReportIndexShow() {\n        _classCallCheck(this, ReportIndexShow);\n\n        var _this = _possibleConstructorReturn(this, (ReportIndexShow.__proto__ || Object.getPrototypeOf(ReportIndexShow)).apply(this, arguments));\n\n        _this.handleClick = function (value) {\n            _this.props.onHandleChangeVisibility(value);\n        };\n        return _this;\n    }\n\n    _createClass(ReportIndexShow, [{\n        key: \"render\",\n        value: function render() {\n            var _this2 = this;\n\n            return _react2.default.createElement(\"div\", { className: \"header-item report-show\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"SHOW:\"), _react2.default.createElement(\"div\", { className: \"ui-button-group\" }, _react2.default.createElement(\"a\", { className: 'ui-button ' + (this.props.visibility == 'all' ? 'is-selected' : ''), onClick: function onClick() {\n                    return _this2.handleClick('all');\n                } }, \"All\"), _react2.default.createElement(\"a\", { className: 'ui-button ' + (this.props.visibility == 'my_reports' ? 'is-selected' : ''), onClick: function onClick() {\n                    return _this2.handleClick('my_reports');\n                } }, \"My Reports\"), _react2.default.createElement(\"a\", { className: 'ui-button ' + (this.props.visibility == 'shared' ? 'is-selected' : ''), onClick: function onClick() {\n                    return _this2.handleClick('shared');\n                } }, \"Shared With Me\"))));\n        }\n    }]);\n\n    return ReportIndexShow;\n}(_react2.default.Component);\n\nexports.default = ReportIndexShow;\n\n/***/ }),\n/* 919 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _share_icons = __webpack_require__(188);\n\nvar _share_icons2 = _interopRequireDefault(_share_icons);\n\nvar _report_list_view = __webpack_require__(920);\n\nvar _report_list_view2 = _interopRequireDefault(_report_list_view);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar permissionDescriptions = {\n    private: 'This report is private',\n    my_organization: 'Shared with my organization',\n    network: 'Shared with other users in the OpenGov Network',\n    public: 'Published to your OpenGov transparency site'\n};\nvar ReportIndexItem = function ReportIndexItem(props) {\n    var report = props.report,\n        isEditKeywordsMode = props.isEditKeywordsMode,\n        updateStateKeywords = props.updateStateKeywords,\n        saveKeywords = props.saveKeywords,\n        addedKeywordsReport = props.addedKeywordsReport,\n        deletedKeywordsReport = props.deletedKeywordsReport,\n        keywords = props.keywords,\n        setUpdatedReportKeywords = props.setUpdatedReportKeywords;\n\n    var reportViewType = props.reportViewType || 'grid';\n    var visibility = report.get('visibility');\n    var reportType = void 0;\n    if (report.get('report_type') === 'grid') {\n        reportType = report.get('is_geo_enabled') ? 'map' : 'grid';\n    } else {\n        reportType = report.graphType();\n    }\n    var permissionDescription = permissionDescriptions[visibility];\n    var reportKeywords = report.get('keywords') || [];\n    if (reportViewType == 'list') {\n        return _react2.default.createElement(_report_list_view2.default, { entityId: props.entity.id, report: report, visibility: visibility, isEditKeywordsMode: isEditKeywordsMode, updateStateKeywords: updateStateKeywords, saveKeywords: saveKeywords, addedKeywordsReport: addedKeywordsReport, deletedKeywordsReport: deletedKeywordsReport, keywords: keywords, setUpdatedReportKeywords: setUpdatedReportKeywords });\n    } else {\n        return _react2.default.createElement(\"div\", { className: \"ui-col-3of12\" }, _react2.default.createElement(Ovid.ReportCard, { title: report.get('name'), link: '#/' + props.entity.id + '/' + report.id, type: reportType, isDefault: props.isDefault, description: (0, _moment2.default)(report.get('data_updated_at')).format('LL'), descriptionLabel: \"Updated\" }, !_lodash2.default.isEmpty(reportKeywords) ? _react2.default.createElement(\"div\", { className: \"icon-tag-1 card-tag-icon\" }, _react2.default.createElement(\"span\", { className: \"tooltip-text\" }, _react2.default.createElement(\"b\", null, \"Keywords:\"), _react2.default.createElement(\"br\", null), reportKeywords.join(', '))) : null, _react2.default.createElement(\"div\", { className: \"card-share-icon\", \"data-hint\": permissionDescription, \"data-hint-position\": \"bottom\", \"data-hint-align\": \"right\" }, _react2.default.createElement(_share_icons2.default, { type: visibility }))));\n    }\n};\nexports.default = ReportIndexItem;\n\n/***/ }),\n/* 920 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _edit_keywords_panel = __webpack_require__(921);\n\nvar _edit_keywords_panel2 = _interopRequireDefault(_edit_keywords_panel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportListView = function (_React$Component) {\n    _inherits(ReportListView, _React$Component);\n\n    function ReportListView() {\n        _classCallCheck(this, ReportListView);\n\n        return _possibleConstructorReturn(this, (ReportListView.__proto__ || Object.getPrototypeOf(ReportListView)).apply(this, arguments));\n    }\n\n    _createClass(ReportListView, [{\n        key: 'buildKeywords',\n        value: function buildKeywords() {\n            var items = [];\n            _lodash2.default.each(this.props.keywords, function (keyword) {\n                items.push({ title: keyword });\n            });\n            return items;\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            if (!this.props.report) {\n                return _react2.default.createElement(\"noscript\", null);\n            }\n            var _props = this.props,\n                report = _props.report,\n                entityId = _props.entityId,\n                visibility = _props.visibility,\n                isEditKeywordsMode = _props.isEditKeywordsMode,\n                updateStateKeywords = _props.updateStateKeywords,\n                saveKeywords = _props.saveKeywords,\n                addedKeywordsReport = _props.addedKeywordsReport,\n                deletedKeywordsReport = _props.deletedKeywordsReport,\n                setUpdatedReportKeywords = _props.setUpdatedReportKeywords;\n\n            var reportName = report.get('name');\n            var reportKeywords = report.get('keywords') || [];\n            return _react2.default.createElement(\"div\", { className: \"ui-col-12of12 report-list-row\" }, _react2.default.createElement(\"div\", { className: \"ui-col-3of12 row-cell\" }, _react2.default.createElement(\"a\", { href: '#/' + entityId + '/' + report.id, className: \"report-name text-ellipse\", title: reportName }, reportName)), _react2.default.createElement(\"div\", { className: \"ui-col-3of12 row-cell keywords\" }, isEditKeywordsMode ? _react2.default.createElement(_edit_keywords_panel2.default, { reportId: report.id, updateStateKeywords: updateStateKeywords, saveKeywords: saveKeywords, addedKeywordsReport: addedKeywordsReport, deletedKeywordsReport: deletedKeywordsReport, assignedKeywords: reportKeywords, keywords: this.buildKeywords(), setUpdatedReportKeywords: setUpdatedReportKeywords }) : _react2.default.createElement(\"div\", { className: \"text-ellipse\", title: reportKeywords.join(', ') }, \" \", reportKeywords.join(', '), \" \")), _react2.default.createElement(\"div\", { className: \"ui-col-2of12 row-cell\" }, (0, _moment2.default)(report.get('data_updated_at')).format('D MMM, YYYY')), _react2.default.createElement(\"div\", { className: \"ui-col-2of12 row-cell\" }, report.get('owner').full_name), _react2.default.createElement(\"div\", { className: \"ui-col-2of12 row-cell\" }, visibility == 'my_organization' ? 'My Organization' : _lodash2.default.startCase(visibility)));\n        }\n    }]);\n\n    return ReportListView;\n}(_react2.default.Component);\n\nexports.default = ReportListView;\n\n/***/ }),\n/* 921 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _keywords_search = __webpack_require__(922);\n\nvar _keywords_search2 = _interopRequireDefault(_keywords_search);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _report_keywords_utils = __webpack_require__(513);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar EditKeywordsPanel = function (_React$Component) {\n    _inherits(EditKeywordsPanel, _React$Component);\n\n    function EditKeywordsPanel() {\n        _classCallCheck(this, EditKeywordsPanel);\n\n        var _this = _possibleConstructorReturn(this, (EditKeywordsPanel.__proto__ || Object.getPrototypeOf(EditKeywordsPanel)).apply(this, arguments));\n\n        _this.addedKeywords = function (keyword) {\n            var reportId = _this.props.reportId;\n            var addedKeywordsState = _this.props.addedKeywordsReport.keywords;\n            var deletedKeywords = _this.props.deletedKeywordsReport.keywords;\n            var assignedKeywords = _lodash2.default.isEmpty(addedKeywordsState) ? _this.props.assignedKeywords : addedKeywordsState;\n            //if earlier keyword was deleted, remove from sate and then add to state\n            (0, _report_keywords_utils.spliceKeywords)(_this.props.updateStateKeywords, deletedKeywords, keyword, reportId, 'remove');\n            (0, _report_keywords_utils.concatKeywords)(_this.props.updateStateKeywords, assignedKeywords, keyword, reportId, 'add');\n        };\n        _this.removedKeywords = function (keyword) {\n            var reportId = _this.props.reportId;\n            var addedKeywordsState = _this.props.addedKeywordsReport.keywords;\n            var assignedKeywords = _lodash2.default.isEmpty(addedKeywordsState) ? _this.props.assignedKeywords : addedKeywordsState;\n            var deletedKeywords = _this.props.deletedKeywordsReport.keywords;\n            if (reportId !== _this.props.deletedKeywordsReport.reportId) {\n                deletedKeywords = [];\n            }\n            if (reportId !== _this.props.addedKeywordsReport.reportId) {\n                assignedKeywords = _this.props.assignedKeywords;\n            }\n            //first remove this keyword from added list and then add to deleted list\n            (0, _report_keywords_utils.spliceKeywords)(_this.props.updateStateKeywords, assignedKeywords, keyword, reportId, 'add');\n            (0, _report_keywords_utils.concatKeywords)(_this.props.updateStateKeywords, deletedKeywords, keyword, reportId, 'remove');\n        };\n        _this.setUpdatedReportKeywords = function (reportId, keywords) {\n            _this.props.setUpdatedReportKeywords(reportId, keywords);\n        };\n        _this.saveKeywords = function () {\n            var _this$props = _this.props,\n                assignedKeywords = _this$props.assignedKeywords,\n                addedKeywordsReport = _this$props.addedKeywordsReport,\n                deletedKeywordsReport = _this$props.deletedKeywordsReport,\n                reportId = _this$props.reportId;\n\n            var updatedKeywords = (0, _report_keywords_utils.getUpdatedKeywords)(reportId, assignedKeywords, addedKeywordsReport, deletedKeywordsReport);\n            _this.setUpdatedReportKeywords(reportId, updatedKeywords);\n            _this.props.saveKeywords(_this.props.reportId);\n        };\n        return _this;\n    }\n\n    _createClass(EditKeywordsPanel, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                keywords = _props.keywords,\n                assignedKeywords = _props.assignedKeywords,\n                addedKeywordsReport = _props.addedKeywordsReport,\n                deletedKeywordsReport = _props.deletedKeywordsReport,\n                reportId = _props.reportId;\n\n            var updatedKeywords = _lodash2.default.isEmpty(this.props.addedKeywordsReport) ? this.props.assignedKeywords : (0, _report_keywords_utils.getUpdatedKeywords)(reportId, assignedKeywords, addedKeywordsReport, deletedKeywordsReport);\n            return _react2.default.createElement(_keywords_search2.default, { assignedKeywords: updatedKeywords, keywords: keywords, addKeywords: this.addedKeywords, removeKeywords: this.removedKeywords, saveKeywords: this.saveKeywords, reportId: reportId });\n        }\n    }]);\n\n    return EditKeywordsPanel;\n}(_react2.default.Component);\n\nexports.default = EditKeywordsPanel;\n\n/***/ }),\n/* 922 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar KeywordLabels = function (_React$Component) {\n    _inherits(KeywordLabels, _React$Component);\n\n    function KeywordLabels() {\n        _classCallCheck(this, KeywordLabels);\n\n        return _possibleConstructorReturn(this, (KeywordLabels.__proto__ || Object.getPrototypeOf(KeywordLabels)).apply(this, arguments));\n    }\n\n    _createClass(KeywordLabels, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                keyword = _props.keyword,\n                removeKeywords = _props.removeKeywords;\n\n            var keywordClasses = (0, _classnames2.default)('ui-button', 'small');\n            var keywordPillStyle = {\n                borderColor: '#ccc',\n                color: '#3192c7',\n                backgroundColor: '#f5f9fb',\n                backgroundImage: 'none',\n                fontWeight: 500,\n                height: '30px !important',\n                padding: '1px 0 0 4px',\n                width: 'auto',\n                whiteSpace: 'nowrap'\n            };\n            return _react2.default.createElement(\"span\", { id: \"keyword_labels\", title: keyword, style: keywordPillStyle, className: keywordClasses }, keyword, _react2.default.createElement(\"span\", { style: keywordPillStyle, className: \"icon-remove-4\", onClick: function onClick() {\n                    return removeKeywords(keyword);\n                } }));\n        }\n    }]);\n\n    return KeywordLabels;\n}(_react2.default.Component);\n\nvar KeywordSearch = function (_React$Component2) {\n    _inherits(KeywordSearch, _React$Component2);\n\n    function KeywordSearch() {\n        _classCallCheck(this, KeywordSearch);\n\n        var _this2 = _possibleConstructorReturn(this, (KeywordSearch.__proto__ || Object.getPrototypeOf(KeywordSearch)).apply(this, arguments));\n\n        _this2.state = {\n            keywords: [],\n            keywordExist: false\n        };\n        _this2.onInputChange = _lodash2.default.debounce(function (value) {\n            var keywords = _this2.props.keywords;\n\n            var keywordExist = void 0;\n            if (_lodash2.default.isEmpty(_lodash2.default.trim(value))) {\n                keywords = [];\n            } else {\n                keywords = _lodash2.default.filter(keywords, function (item) {\n                    return _lodash2.default.startsWith(item.title.toLowerCase(), value.toLowerCase());\n                });\n                keywordExist = _lodash2.default.find(keywords, function (item) {\n                    return item.title.toLowerCase() == value.toLowerCase() ? true : false;\n                });\n                if (keywordExist) {\n                    keywordExist = true;\n                    keywords.push({ title: '\"' + value + '\" already exists' });\n                } else {\n                    keywordExist = false;\n                    keywords.push({ title: 'Add \"' + value + '\" keyword' });\n                }\n            }\n            _this2.setState({\n                keywords: keywords,\n                keywordExist: keywordExist\n            });\n        }, 150);\n        _this2.handleSearchClick = function () {\n            _this2.searchRef.focusInput();\n        };\n        _this2.handleBackSpace = function (e) {\n            if (_lodash2.default.isEmpty(e.target.value)) {\n                var _this2$props = _this2.props,\n                    assignedKeywords = _this2$props.assignedKeywords,\n                    removeKeywords = _this2$props.removeKeywords;\n\n                if (e.keyCode === 8 || e.keyCode === 46) {\n                    removeKeywords(assignedKeywords.pop());\n                }\n            }\n        };\n        _this2.saveKeywords = function () {\n            _this2.props.saveKeywords();\n        };\n        _this2.onSelectResult = function (index) {\n            var keywords = _this2.state.keywords;\n\n            var title = keywords[index] && keywords[index].title;\n            if (title) {\n                var keyword = _lodash2.default.startsWith(title, 'Add \"') && _lodash2.default.endsWith(title, '\" keyword') ? title.replace(/.*Add \\\"(.*)\\\" keyword.*/, '$1') : title;\n                keyword = _lodash2.default.trim(keyword.replace(/\\s+/g, ' '));\n                _this2.handleSearchClick();\n                if (title != '\"' + _this2.searchRef.state.value + '\" already exists' && keyword != '') {\n                    _this2.props.addKeywords(keyword);\n                }\n                setTimeout(function () {\n                    _this2.labelBoxRef.scrollTop = _this2.labelBoxRef.scrollHeight;\n                    _this2.onInputChange();\n                    _this2.handleSearchClick();\n                }, 150);\n            }\n        };\n        _this2.renderKeywords = function () {\n            var _this2$props2 = _this2.props,\n                assignedKeywords = _this2$props2.assignedKeywords,\n                removeKeywords = _this2$props2.removeKeywords;\n\n            return assignedKeywords.map(function (keyword) {\n                return _react2.default.createElement(KeywordLabels, { key: keyword, keyword: keyword, removeKeywords: removeKeywords });\n            }, _this2);\n        };\n        _this2.getResults = function () {\n            if (!_lodash2.default.isEmpty(_this2.state.keywords)) {\n                return {\n                    items: _this2.state.keywords\n                };\n            } else {\n                return null;\n            }\n        };\n        _this2.handleOnBlur = function () {\n            setTimeout(function () {\n                if (!(0, _jquery2.default)((0, _jquery2.default)((0, _reactDom.findDOMNode)(_this2.searchRef))[0].childNodes[1]).is(':focus')) {\n                    _this2.props.saveKeywords();\n                }\n            }, 50);\n        };\n        return _this2;\n    }\n\n    _createClass(KeywordSearch, [{\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate() {\n            var keywordExist = this.state.keywordExist;\n\n            var searchItems = (0, _jquery2.default)('.ui-search__results li .ui-search__results__item');\n            var searchLastItem = (0, _jquery2.default)('.ui-search__results li:last-child .ui-search__results__item');\n            searchItems.css({ color: '#444' });\n            if (keywordExist) {\n                searchLastItem.css({\n                    color: 'grey',\n                    cursor: 'auto',\n                    fontStyle: 'italic'\n                });\n            } else {\n                searchLastItem.css({\n                    color: '#3192c7',\n                    cursor: 'pointer',\n                    fontStyle: 'unset'\n                });\n            }\n            searchLastItem.hover(function () {\n                if (keywordExist) {\n                    searchLastItem.css({ backgroundColor: 'white' });\n                } else {\n                    searchLastItem.css({ backgroundColor: '#d5e9f5' });\n                }\n            }, function () {\n                searchLastItem.css({ backgroundColor: 'white' });\n            });\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this3 = this;\n\n            var LabelBoxStyle = {\n                maxHeight: '100px',\n                paddingTop: '2px'\n            };\n            var keywordsSearchBox = {\n                margin: '-2px',\n                border: 'none',\n                boxShadow: 'none'\n            };\n            return _react2.default.createElement(\"div\", { className: \"ui-search ui-search-div label-box\", onBlur: this.handleOnBlur }, _react2.default.createElement(\"div\", { className: \"pill-container\", ref: function ref(_ref) {\n                    return _this3.labelBoxRef = _ref;\n                }, style: LabelBoxStyle, onClick: this.handleSearchClick }, _react2.default.createElement(\"div\", { id: \"keywords-pill-container\", className: \"keywords-pill-container\" }, this.renderKeywords())), _react2.default.createElement(\"div\", { style: keywordsSearchBox, className: \"ui-search ui-search-div keywords-pill-container\", onKeyDown: this.handleBackSpace }, _react2.default.createElement(_ovid.Search, { ref: function ref(_ref2) {\n                    return _this3.searchRef = _ref2;\n                }, results: this.getResults(), onInputChange: this.onInputChange, onSelectResult: this.onSelectResult })));\n        }\n    }]);\n\n    return KeywordSearch;\n}(_react2.default.Component);\n\nexports.default = KeywordSearch;\n\n/***/ }),\n/* 923 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ToggleEditSaveKeywords = function (_React$Component) {\n    _inherits(ToggleEditSaveKeywords, _React$Component);\n\n    function ToggleEditSaveKeywords() {\n        _classCallCheck(this, ToggleEditSaveKeywords);\n\n        return _possibleConstructorReturn(this, (ToggleEditSaveKeywords.__proto__ || Object.getPrototypeOf(ToggleEditSaveKeywords)).apply(this, arguments));\n    }\n\n    _createClass(ToggleEditSaveKeywords, [{\n        key: 'render',\n        value: function render() {\n            if (this.props.userRole == 'opengov_admin' || this.props.userRole == 'entity_admin') {\n                return _react2.default.createElement(\"span\", { className: \"edit-mode\" }, !this.props.isEditKeywordsMode ? _react2.default.createElement(\"a\", { onClick: this.props.toggleEditKeywordsMode }, \"EDIT\") : _react2.default.createElement(\"a\", { onClick: this.props.toggleEditKeywordsMode }, \"DONE\"));\n            }\n            return null;\n        }\n    }]);\n\n    return ToggleEditSaveKeywords;\n}(_react2.default.Component);\n\nexports.default = ToggleEditSaveKeywords;\n\n/***/ }),\n/* 924 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ldInitialize = exports.sessionToLDUser = undefined;\n\nvar _ldclientJs = __webpack_require__(515);\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar client = null;\nvar sessionToLDUser = exports.sessionToLDUser = function sessionToLDUser(params) {\n    var session = params.session,\n        currentEntityId = params.currentEntityId;\n\n    return {\n        key: currentEntityId + ':' + session.uuid,\n        name: session.full_name,\n        firstName: session.first_name,\n        lastName: session.last_name,\n        email: session.email,\n        custom: {\n            userEntityId: session.entity.id,\n            selectedEntityId: currentEntityId,\n            role: session.role.name\n        }\n    };\n};\nvar ldInitialize = exports.ldInitialize = function ldInitialize(isLdAvailable, ldEnvKey, changeHandler) {\n    return function () {\n        var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(session) {\n            return regeneratorRuntime.wrap(function _callee$(_context) {\n                while (1) {\n                    switch (_context.prev = _context.next) {\n                        case 0:\n                            if (isLdAvailable) {\n                                _context.next = 3;\n                                break;\n                            }\n\n                            if (false) {\n                                console.log('feature flag provider unavailable'); //tslint:disable-line:no-console\n                            }\n                            return _context.abrupt('return', Promise.reject(null));\n\n                        case 3:\n                            if (!client) {\n                                _context.next = 5;\n                                break;\n                            }\n\n                            return _context.abrupt('return', client.waitUntilReady().then(function () {\n                                return client;\n                            }));\n\n                        case 5:\n                            client = (0, _ldclientJs.initialize)(ldEnvKey, sessionToLDUser(session));\n                            client.on('change', changeHandler);\n                            return _context.abrupt('return', client.waitUntilReady().then(function () {\n                                return client;\n                            }));\n\n                        case 8:\n                        case 'end':\n                            return _context.stop();\n                    }\n                }\n            }, _callee, undefined);\n        }));\n\n        return function (_x) {\n            return _ref.apply(this, arguments);\n        };\n    }();\n};\n\n/***/ }),\n/* 925 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n// Loading in trapi_middleware to route between TrAPI v1 and v2\n\n\nexports.handleReportPropertiesUpdate = handleReportPropertiesUpdate;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _reactTransitionGroup = __webpack_require__(139);\n\nvar _css_transition_defaults = __webpack_require__(184);\n\nvar _css_transition_defaults2 = _interopRequireDefault(_css_transition_defaults);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _og_analytics = __webpack_require__(117);\n\nvar _og_analytics2 = _interopRequireDefault(_og_analytics);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _report = __webpack_require__(254);\n\nvar _report2 = _interopRequireDefault(_report);\n\nvar _grid_report = __webpack_require__(926);\n\nvar _summary_report = __webpack_require__(1485);\n\nvar _summary_report2 = _interopRequireDefault(_summary_report);\n\nvar _report_panel = __webpack_require__(1555);\n\nvar _report_panel2 = _interopRequireDefault(_report_panel);\n\nvar _password = __webpack_require__(1574);\n\nvar _password2 = _interopRequireDefault(_password);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _editor_footer = __webpack_require__(1575);\n\nvar _editor_footer2 = _interopRequireDefault(_editor_footer);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _handle_jquery_ajax_error = __webpack_require__(1576);\n\nvar _handle_jquery_ajax_error2 = _interopRequireDefault(_handle_jquery_ajax_error);\n\nvar _settings_panel = __webpack_require__(1577);\n\nvar _settings_panel2 = _interopRequireDefault(_settings_panel);\n\nvar _router = __webpack_require__(317);\n\nvar LegacyRouter = _interopRequireWildcard(_router);\n\nvar _event_observer_mixin = __webpack_require__(141);\n\nvar _event_observer_mixin2 = _interopRequireDefault(_event_observer_mixin);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nvar _stories_actions = __webpack_require__(684);\n\nvar StoryActions = _interopRequireWildcard(_stories_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _stories_store = __webpack_require__(685);\n\nvar _stories_store2 = _interopRequireDefault(_stories_store);\n\nvar _trapi_middleware = __webpack_require__(1591);\n\nvar _trapi_middleware2 = _interopRequireDefault(_trapi_middleware);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _launchdarkly = __webpack_require__(514);\n\nvar _tracking = __webpack_require__(255);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction handleReportPropertiesUpdate(loaded, report, renderedReport) {\n    if (!loaded || !report || !renderedReport) {\n        return;\n    }\n    var renderedProperties = renderedReport.get('properties').toJS();\n    var backboneReportProperties = report.get('properties');\n    if (!_lodash2.default.isEqual(renderedProperties, backboneReportProperties)) {\n        report.set('properties', renderedProperties);\n    }\n}\nvar ReportView = (0, _createReactClass2.default)({\n    displayName: 'ReportView',\n\n    mixins: [_event_observer_mixin2.default, (0, _og_flux.StoreListener)(_report_view_store2.default, _stories_store2.default)],\n    getStateFromStore: function getStateFromStore() {\n        return {\n            isGridReport: _report_view_store2.default.isGridReport(),\n            isEditingDefaultState: _report_view_store2.default.isEditingDefaultState(),\n            editingReport: _report_view_store2.default.isEditingData(),\n            wizardFlow: _report_view_store2.default.getWizardFlow(),\n            renderedReport: _report_view_store2.default.getRenderedReport(),\n            auditModeEnabled: _report_view_store2.default.getAuditModeEnabled(),\n            hasValidData: _report_view_store2.default.getHasValidData(),\n            activeSidebar: _report_view_store2.default.getActiveSidebar(),\n            stories: _stories_store2.default.getState().get('stories')\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState(this.getStateFromStore());\n    },\n    render: function render() {\n        var _this = this;\n\n        var _state = this.state,\n            loaded = _state.loaded,\n            creating = _state.creating,\n            reportEntity = _state.reportEntity,\n            report = _state.report;\n        var _props = this.props,\n            isControlPanel = _props.isControlPanel,\n            entity = _props.entity,\n            entities = _props.entities,\n            reports = _props.reports,\n            session = _props.session,\n            onMakeDefaultReport = _props.onMakeDefaultReport;\n\n        var isNetwork = gon.isNetwork;\n        var ReportComponent = 'div';\n        var reportClassName = (0, _classnames2.default)({\n            report_container: true,\n            'js-report-container': true,\n            'is-editing': this.state.isEditingDefaultState\n        });\n        if (this.state.loaded && !report.isNew()) {\n            ReportComponent = this.state.isGridReport ? _grid_report.GridReport : _summary_report2.default;\n        }\n        var configAlertMessage = this.state.isGridReport ? 'Save column order and visibility, column sort order, initial filtering, and more' : 'Select and save a default chart type, time range, filters, and more';\n        return _react2.default.createElement(\"div\", { className: reportClassName }, !loaded && creating ? _react2.default.createElement(\"div\", { className: \"ui-loader\" }, _react2.default.createElement(\"div\", { className: \"ui-loading\" }), _react2.default.createElement(\"div\", { className: \"ui-loader__message\" }, _react2.default.createElement(\"strong\", null, \"Creating report\"))) : null, _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, Object.assign({ transitionName: \"editor-footer\" }, _css_transition_defaults2.default), this.state.isEditingDefaultState ? _react2.default.createElement(_editor_footer2.default, { subMessage: configAlertMessage, onSave: this.handleSaveDefaultState, onCancel: _report_actions2.default.cancelEditDefaultStateMode }) : null), isControlPanel ? _react2.default.createElement(_report_panel2.default, { entities: entities, entity: entity, editReport: report, selectedReport: this.state.report, reports: reports, session: session, flowKey: this.state.wizardFlow, onWizardComplete: function onWizardComplete() {\n                return _lodash2.default.defer(_this.handleReportWizardComplete);\n            }, onMakeDefaultReport: onMakeDefaultReport, isOpen: this.state.editingReport, onClose: this.handleCloseReportPanel }) : null, _react2.default.createElement(_settings_panel2.default, { session: session, isControlPanel: isControlPanel, isNetwork: isNetwork, entity: entity, scalePerCapitaEnabled: this.state.scalePerCapitaEnabled }), _react2.default.createElement(\"div\", { key: entity.id + '.' + report.id + '.' + this.state.auditModeEnabled }, this.state.loaded && !report.isNew() && _react2.default.createElement(ReportComponent, { key: entity.id + '.' + report.id + '.' + this.state.auditModeEnabled + 'blah', ref: \"report\", router: this.props.router, reportParams: this.props.reportParams, editingDefaultState: this.state.isEditingDefaultState, onMakeDefaultReport: this.props.onMakeDefaultReport, onStateChange: this.handleStateChange, onDataSetChange: this.handleDataSetChange, onCoaMaskChange: this.handleCoaMaskChange, onOpenSettingsPanel: this.props.onOpenSettingsPanel, onParamsChange: this.setReportParams, onLoaded: this.handleReportLoaded, entity: reportEntity, session: session, report: report, isGridReport: this.state.isGridReport, isControlPanel: this.props.isControlPanel, reportState: this.state.reportState, renderedReport: this.state.renderedReport, reports: reports, auditModeEnabled: this.state.auditModeEnabled, hasValidData: this.state.hasValidData, embedded: this.props.isControlPanel, isNetwork: isNetwork, isReloaded: this.state.reloaded, activeSidebar: this.state.activeSidebar, stories: this.state.stories, scalePerCapitaEnabled: this.state.scalePerCapitaEnabled }), loaded && report.isNew() && reports && reports.isEmpty() ? _react2.default.createElement(\"p\", { className: \"ui-null align-center\" }, _react2.default.createElement(\"strong\", null, entity.get('name'), \" doesn't have reports yet.\"), session.can('create', 'report') ? _react2.default.createElement(\"a\", { href: '#' + entity.id + '/reports/new' }, \"Why not create the first report?\") : null) : null), this.state.showPasswordModal && _react2.default.createElement(_password2.default, { accessCode: report.get('access_code'), onSubmit: this.authorizeReport, onClose: function onClose() {\n                return _this.setState({ showPasswordModal: false });\n            } }));\n    },\n    getInitialState: function getInitialState() {\n        var report = void 0;\n        if (this.props.report) {\n            report = this.props.report;\n        } else if (this.props.params.report) {\n            report = new _report2.default({ id: this.props.params.report });\n        } else {\n            report = new _report2.default();\n        }\n        return _lodash2.default.assign({\n            showPasswordModal: false,\n            isEditingDefaultState: false,\n            isReportInitialized: false,\n            reportState: {},\n            report: report,\n            reportEntity: this.props.entity\n        }, this.getStateFromStore());\n    },\n    componentDidMount: function componentDidMount() {\n        var _this2 = this;\n\n        this._isMounted = true;\n        if (this.props.report) {\n            this.loadReport(this.props.report);\n        } else if (this.state.report) {\n            this.loadReport(this.state.report);\n        }\n        var reportTypeLabel = this.state.isGridReport ? 'Grid Report' : 'GL Report';\n        var reportApplicationLabel = this.props.isControlPanel ? 'Reporting Classic' : 'Transparency Classic';\n        (0, _tracking.trackPage)(reportApplicationLabel + ': ' + reportTypeLabel);\n        this.listenToProp('entity');\n        this.listenToProp('report', 'dataSets:add dataSets:remove');\n        this.scrollPosition();\n        _trapi_middleware2.default.setEntity(this.props.entity);\n        if (_lodash2.default.includes(this.props.entity.get('feature_permissions'), 'stories')) {\n            StoryActions.fetchStories(this.props.entity.get('entity_id'));\n        }\n        // not interested in realtime changes at this time\n        var ldChangeHandler = function ldChangeHandler() {};\n        var ldIt = (0, _launchdarkly.ldInitialize)(true, gon.launchDarklyKey, ldChangeHandler);\n        if (!this.props.session || !this.props.session.toJSON) {\n            return;\n        }\n        var ldParams = {\n            session: _extends({}, this.props.session.toJSON(), { entity: this.props.entity.toJSON() }),\n            currentEntityId: this.props.entity.get('subdomain')\n        };\n        ldIt(ldParams).then(function (client) {\n            var scalePerCapitaEnabled = client.variation('product-classic-reporting-feature-scale-per-capita', false);\n            _this2.setState({ scalePerCapitaEnabled: scalePerCapitaEnabled });\n        });\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this._isMounted = false;\n        this.props.reports.off();\n        (0, _jquery2.default)(document).off('scroll', this.scrollCallback);\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (nextProps.entity.id !== this.props.entity.id) {\n            this.setState({ loaded: false, report: new _report2.default(), reloaded: false });\n        }\n        if (nextProps.report) {\n            if (this.props.report !== nextProps.report) {\n                this.loadReport(nextProps.report);\n            } else if (_lodash2.default.result(_lodash2.default.last(nextProps.routes), 'name') === 'new') {\n                this.setState({ report: new _report2.default() });\n            }\n        } else if (nextProps.params.report) {\n            if (this.props.params.report !== nextProps.params.report) {\n                var report = new _report2.default({ id: nextProps.params.report });\n                this.loadReport(report);\n            } else if (_lodash2.default.result(_lodash2.default.last(nextProps.routes), 'name') === 'new') {\n                this.setState({ report: new _report2.default() });\n            }\n        }\n    },\n    componentDidUpdate: function componentDidUpdate() {\n        var _state2 = this.state,\n            loaded = _state2.loaded,\n            report = _state2.report,\n            renderedReport = _state2.renderedReport;\n\n        handleReportPropertiesUpdate(loaded, report, renderedReport);\n    },\n    loadReport: function loadReport(report) {\n        var self = this;\n        _og_analytics2.default.setReportId(report.id);\n        if (report.isNew()) {\n            report.set('entity_id', this.props.entity.get('entity_id'));\n            this.setState({\n                report: report,\n                loaded: false,\n                creating: false,\n                reloaded: false\n            });\n            // Display the currently rendered report in the document's title.\n            document.title = this.props.entity.getName() + ' > New Report';\n            _lodash2.default.defer(_report_actions2.default.newReport);\n            return;\n        }\n        // Do not try to load reports with a legacy ID (ex: annual).\n        // Once the list of available reports has loaded, we will find a\n        // report with a type that matches the legeacy ID (see loadLegacyReport()).\n        if (report.isLegacy()) {\n            return;\n        }\n        this.setState({ report: report, loaded: false, reloaded: false });\n        // TODO: Ideally this component should be given a pre-loaded report always.\n        report.fetch({\n            data: {\n                embed: this.props.isControlPanel ? 'associated_reports,invites' : 'associated_reports'\n            },\n            success: function success() {\n                if (self._isMounted && self.state.report.id === report.id) {\n                    var entityId = report.get('entity_id');\n                    if (self.props.entity.get('entity_id') === entityId) {\n                        // If the report already exists in the collection merge\n                        // the updates we just fetched including the data sets.\n                        // Exclude adding reports from other entities to this collection.\n                        var dataSets = report.dataSets;\n                        var collectionReport = self.props.reports.add(report, { merge: true });\n                        collectionReport.dataSets = dataSets;\n                    }\n                }\n                if (self.props.isControlPanel || report.isAuthorized()) {\n                    self.presentReport(report);\n                } else {\n                    self.setState({ showPasswordModal: true });\n                }\n            },\n            error: function error(model, resp) {\n                (0, _handle_jquery_ajax_error2.default)('Failed to load report', resp);\n            }\n        });\n    },\n\n    statics: {\n        /**\r\n        * if you transition into URL path which matches this route, this transition hook will fire\r\n        * before the route continues. Think middleware.\r\n        */\n        willTransitionTo: function willTransitionTo(transition, params, query, callback) {\n            _report_actions2.default.updateUrlParams(LegacyRouter.parseParameters(params.reportParams));\n            callback();\n        }\n    },\n    authorizeReport: function authorizeReport() {\n        this.state.report.authorized = true;\n        this.presentReport(this.state.report);\n    },\n    reportEntity: function reportEntity(report) {\n        var entityId = report.get('entity_id');\n        var entities = this.props.entities;\n        return entities ? entities.find(function (entity) {\n            return entity.get('entity_id') === entityId;\n        }) : this.props.entity;\n    },\n    presentReport: function presentReport(report) {\n        var reportEntity = this.reportEntity(report);\n        _report_actions2.default.loadedReport(report, reportEntity);\n        this.setState({\n            loaded: true,\n            reloaded: false,\n            reportEntity: reportEntity,\n            showPasswordModal: false\n        });\n        // Show that the user is creating a report in the document title.\n        document.title = reportEntity.getName() + ' / ' + report.get('name');\n    },\n    loadDefaultReport: function loadDefaultReport() {\n        var reports = this.props.reports;\n        if (reports.isEmpty()) {\n            this.setState({\n                loaded: true,\n                reloaded: false\n            });\n            this.props.router.director.setRoute(this.props.entity.id + '/reports');\n            this.props.onRouteChange('');\n            return;\n        }\n        var defaultReport = reports.get(this.props.entity.get('default_report_id')) || reports.getFirst();\n        if (defaultReport) {\n            this.loadReport(defaultReport);\n        }\n        this.setReportRoute(defaultReport);\n    },\n    handleCloseReportPanel: function handleCloseReportPanel() {\n        if (this.state.report.isNew()) {\n            this.setReportRoute(this.state.report);\n        }\n        if (this.state.editingReport) {\n            _report_actions2.default.closeEditData();\n        }\n    },\n    handleStateChange: function handleStateChange(state) {\n        _report_actions2.default.updateState(state);\n        this.setState({ reportState: state });\n    },\n    handleDataSetChange: function handleDataSetChange(dataSets) {\n        this.setState({ dataSets: dataSets });\n    },\n    handleCoaMaskChange: function handleCoaMaskChange() {\n        var _this3 = this;\n\n        var report = this.state.report;\n        // Toggle the loaded state to force Athena to reload the report.\n        this.setState({\n            loaded: false,\n            reloaded: false,\n            report: new _report2.default()\n        }, function () {\n            _this3.loadReport(report);\n        });\n    },\n    handleSaveDefaultState: function handleSaveDefaultState() {\n        var _this4 = this;\n\n        var report = this.state.renderedReport;\n        /**\r\n        * NOTE: why we are doing this? Because initially we never had a good propagation of summary report (GL) state into\r\n        * report state store. Grid report (which we are not touching here) handles it differently and perhaps better. However,\r\n        * summary report has athena state which is decoupled from the summary report state. We have to assemple the entire report\r\n        * state by using these two (summary report and athena) states. Weird huh? It's the reality. So, instead of relying on\r\n        * reportState for GL reports, we do the assembly by calling summary report store function (delegation).\r\n        */\n        var currentReportState = void 0;\n        if (_report_view_store2.default.isGridReport()) {\n            currentReportState = this.state.reportState;\n        } else {\n            currentReportState = _summary_report_store2.default.generateSummaryReportState();\n        }\n        var properties = _lodash2.default.assign(report.get('properties').toJS(), currentReportState);\n        _og_api2.default.put('reports', report.get('id'), { properties: properties }).end().then(function () {\n            Ovid.Flash.ftw({\n                title: 'Looking good!',\n                message: \"This report's default state has been updated\"\n            });\n            _this4.state.report.set('properties', properties);\n            _report_actions2.default.defaultStateUpdated(Immutable.fromJS(properties));\n        }).catch(function (e) {\n            Ovid.Alert.unexpectedError();\n            throw e;\n        });\n    },\n    handleReportWizardComplete: function handleReportWizardComplete() {\n        var _this5 = this;\n\n        _report_actions2.default.closeEditData();\n        var report = this.state.report;\n        var reportEntity = this.reportEntity(report);\n        var isEditingDataSets = this.state.wizardFlow === 'EditDatasets';\n        // Toggle the loaded state to force Athena to reload the report.\n        this.setState({\n            creating: true,\n            loaded: false,\n            reloaded: false,\n            report: new _report2.default()\n        }, function () {\n            _report_actions2.default.loadedReport(report, reportEntity).then(function () {\n                Ovid.Flash.ftw({\n                    title: 'Success!',\n                    message: 'New report successfully created!'\n                });\n                // We call this explicity because adding a dataset should open the\n                // share notification, but there is no unique event fired for it.\n                // TODO: GRA-454\n                if (isEditingDataSets) {\n                    InviteActions.openNotification();\n                }\n                if (report.get('report_type') == 'grid') {\n                    _grid_report_actions2.default.setLastCreatedReport(report);\n                    if (isEditingDataSets) {\n                        // Instruct grid report to reload properties which are cleared\n                        // by the dataset wizard after it completes.\n                        _grid_report_actions2.default.reloadProperties(report.get('properties'));\n                    }\n                    _this5.setReportRoute(report);\n                }\n                _this5.setState({\n                    creating: false,\n                    loaded: true,\n                    reloaded: true,\n                    report: report\n                });\n                _this5.props.reports.add(report);\n            });\n        });\n    },\n    handleReportLoaded: function handleReportLoaded(isTriggeredFromSummaryReport) {\n        this.setState({\n            isReportInitialized: true\n        });\n        // Once the report has loaded we need to re-compute the scroll position of the\n        // main panel since the scroll top of the footer will have changed.\n        if (isTriggeredFromSummaryReport) {\n            this.scrollCallback();\n        }\n        if (_summary_report_store2.default.getState().get('rebuilding') || _grid_report_store2.default.getState().get('rebuilding')) {\n            Ovid.Flash.ftw({\n                title: 'Processing data',\n                message: 'A new version of this report is being created. Check back in a few minutes to see the latest changes.',\n                button: 'Got it',\n                noTimeout: true\n            });\n        }\n    },\n    setReportRoute: function setReportRoute(report) {\n        if (!report) {\n            this.props.onRouteChange('');\n        } else if (report.isNew()) {\n            this.props.onRouteChange('new');\n        } else if (report.id) {\n            this.props.onRouteChange(report.id);\n        }\n    },\n    setReportParams: function setReportParams(params) {\n        this.props.onRouteChange(this.state.report.id, params);\n    },\n    scrollPosition: function scrollPosition() {\n        var _this6 = this;\n\n        var $window = (0, _jquery2.default)(window);\n        if (this.props.isControlPanel) {\n            var initialTop = void 0;\n            // In the control panel we re-position the main panel\n            // to align with the bottom of the header. As the user scrolls\n            // down the page and the header scrolls up and out of view,\n            // the main panel's top will be moved up to take up the space\n            // where the header was previously positioned.\n            this.scrollCallback = function () {\n                if (!_this6.refs.report) {\n                    return;\n                }\n                var $report = (0, _jquery2.default)(_reactDom2.default.findDOMNode(_this6.refs.report));\n                $report.find('.js-scroll-position').each(function () {\n                    if (!initialTop) {\n                        initialTop = parseInt((0, _jquery2.default)(this).css('top'), 10);\n                    }\n                    var windowTop = $window.scrollTop();\n                    var mainPanelTop = Math.max(initialTop - windowTop, 0);\n                    (0, _jquery2.default)(this).css('top', mainPanelTop);\n                });\n            };\n        } else {\n            // In standalone mode we have no header, but we do have a footer.\n            // So as the user scrolls down and the footer begins to come into\n            // view, we fix position the main panel so it does not overlap with\n            // the footer.\n            this.scrollCallback = function () {\n                if (!_this6.refs.report || !_this6.refs.footer) {\n                    return;\n                }\n                var $report = (0, _jquery2.default)(_reactDom2.default.findDOMNode(_this6.refs.report));\n                var $panel = $report.find('.ui-main__sidebar');\n                var $footer = (0, _jquery2.default)(_reactDom2.default.findDOMNode(_this6.refs.footer));\n                var viewportHeight = document.documentElement.clientHeight;\n                var footerTop = $footer.offset().top;\n                var triggerPoint = footerTop - viewportHeight;\n                var windowTop = $window.scrollTop();\n                if (windowTop > triggerPoint && triggerPoint >= 0) {\n                    $panel.css({ top: triggerPoint, position: 'absolute', height: '100%' });\n                } else {\n                    $panel.css({ top: 0, position: 'fixed' });\n                }\n            };\n        }\n        (0, _jquery2.default)(window).on('scroll', this.scrollCallback);\n    }\n});\nexports.default = ReportView;\n\n/***/ }),\n/* 926 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.GridReport = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _immutabilityHelper = __webpack_require__(185);\n\nvar _immutabilityHelper2 = _interopRequireDefault(_immutabilityHelper);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _og_analytics = __webpack_require__(117);\n\nvar _og_analytics2 = _interopRequireDefault(_og_analytics);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _griddle = __webpack_require__(927);\n\nvar _griddle2 = _interopRequireDefault(_griddle);\n\nvar _header = __webpack_require__(520);\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _footer = __webpack_require__(521);\n\nvar _footer2 = _interopRequireDefault(_footer);\n\nvar _report_header = __webpack_require__(957);\n\nvar _report_header2 = _interopRequireDefault(_report_header);\n\nvar _amounts_type_menu = __webpack_require__(974);\n\nvar _amounts_type_menu2 = _interopRequireDefault(_amounts_type_menu);\n\nvar _amount_menu = __webpack_require__(975);\n\nvar _amount_menu2 = _interopRequireDefault(_amount_menu);\n\nvar _aggregate_visualization = __webpack_require__(978);\n\nvar _aggregate_visualization2 = _interopRequireDefault(_aggregate_visualization);\n\nvar _visualization_button = __webpack_require__(1426);\n\nvar _visualization_button2 = _interopRequireDefault(_visualization_button);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _report_download_actions = __webpack_require__(312);\n\nvar _schema_utils = __webpack_require__(120);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _modal_store = __webpack_require__(257);\n\nvar _modal_store2 = _interopRequireDefault(_modal_store);\n\nvar _grid_header_actions = __webpack_require__(1427);\n\nvar _grid_header_actions2 = _interopRequireDefault(_grid_header_actions);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _feedback = __webpack_require__(662);\n\nvar _feedback2 = _interopRequireDefault(_feedback);\n\nvar _target_utils = __webpack_require__(99);\n\nvar _target_toggle = __webpack_require__(1456);\n\nvar _target_toggle2 = _interopRequireDefault(_target_toggle);\n\nvar _target_panel = __webpack_require__(1457);\n\nvar _target_panel2 = _interopRequireDefault(_target_panel);\n\nvar _target_status = __webpack_require__(1459);\n\nvar _target_status2 = _interopRequireDefault(_target_status);\n\nvar _document_list = __webpack_require__(663);\n\nvar _document_list2 = _interopRequireDefault(_document_list);\n\nvar _check_panel = __webpack_require__(1460);\n\nvar _check_panel2 = _interopRequireDefault(_check_panel);\n\nvar _modal_gridhowto = __webpack_require__(1461);\n\nvar _modal_gridhowto2 = _interopRequireDefault(_modal_gridhowto);\n\nvar _router = __webpack_require__(317);\n\nvar Router = _interopRequireWildcard(_router);\n\nvar _termsOfService = __webpack_require__(664);\n\nvar _termsOfService2 = _interopRequireDefault(_termsOfService);\n\nvar _banner = __webpack_require__(1462);\n\nvar _banner2 = _interopRequireDefault(_banner);\n\nvar _budget = __webpack_require__(665);\n\nvar _budget2 = _interopRequireDefault(_budget);\n\nvar _welcome_modal = __webpack_require__(1463);\n\nvar _welcome_modal2 = _interopRequireDefault(_welcome_modal);\n\nvar _summary_welcome = __webpack_require__(666);\n\nvar _summary_welcome2 = _interopRequireDefault(_summary_welcome);\n\nvar _cookiesJs = __webpack_require__(174);\n\nvar _cookiesJs2 = _interopRequireDefault(_cookiesJs);\n\nvar _cookie_helper = __webpack_require__(262);\n\nvar _cookie_helper2 = _interopRequireDefault(_cookie_helper);\n\nvar _config = __webpack_require__(146);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _grid_break_down_dropdown = __webpack_require__(1464);\n\nvar _grid_break_down_dropdown2 = _interopRequireDefault(_grid_break_down_dropdown);\n\nvar _grid_report_total = __webpack_require__(1468);\n\nvar _grid_report_total2 = _interopRequireDefault(_grid_report_total);\n\nvar _email_export_filter = __webpack_require__(1469);\n\nvar _email_export_filter2 = _interopRequireDefault(_email_export_filter);\n\nvar _summary_table = __webpack_require__(1474);\n\nvar _summary_table2 = _interopRequireDefault(_summary_table);\n\nvar _sidebar = __webpack_require__(318);\n\nvar _sidebar2 = _interopRequireDefault(_sidebar);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _filterButtons = __webpack_require__(1484);\n\nvar _filterButtons2 = _interopRequireDefault(_filterButtons);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar onboardingWaypoints = [{\n    title: 'Get back',\n    description: 'At any point you can go back to your previous filter state or reset the grid to the default report state.',\n    node: '.page-navigation .ui-button:first-child',\n    position: 'bottom'\n}, {\n    title: 'Search bar',\n    description: 'Search for any text across the report.',\n    node: '.icon-search-1',\n    position: 'bottom'\n}];\nvar GridReport = exports.GridReport = (0, _createReactClass2.default)({\n    displayName: 'GridReport',\n\n    mixins: [(0, _og_flux.StoreListener)(_grid_report_store2.default, _modal_store2.default, _session_store2.default, _report_view_store2.default)],\n    getInitialState: function getInitialState() {\n        var entity = this.props.entity.toJSON();\n        var report = this.props.report;\n        var state = _grid_report_store2.default.getState();\n        var griddle = this._griddle = new _griddle2.default({\n            entity: entity,\n            report: report,\n            embedded: this.props.embedded,\n            transaction_id: report.get('transaction_id'),\n            onStateChange: this.handleStateChange,\n            queryModel: state.get('queryModel'),\n            amountColumn: state.getIn(['visualization', 'amountColumn'])\n        });\n        this.transactionQueryToggle(0);\n        var logHeaderAction = this.createActionHandler('Header');\n        return {\n            currentWaypoint: 0,\n            gridReport: state,\n            map: {\n                data: []\n            },\n            embed: (0, _embed_utils.getEmbedType)(),\n            currentCheckData: null,\n            relatedTransactions: _grid_report_store2.default.getState().get('relatedTransactions'),\n            showHowToModal: _grid_report_store2.default.getState().get('showHowTo'),\n            showTOS: _grid_report_store2.default.getState().get('showTOS'),\n            showExportFilter: state.get('showExportFilter'),\n            showTargetPanel: state.get('showTargetPanel'),\n            showAmountColumnPanel: state.get('showAmountColumnPanel'),\n            showBreakdownsSettingsPanel: state.get('showBreakdownsSettingsPanel'),\n            onboardingTour: _grid_report_store2.default.getState().get('onboardingTour'),\n            welcomeModal: !this.props.embedded && this.showWelcome(),\n            headerOptions: {\n                embedded: this.props.embedded,\n                downloads: {\n                    fiscalYears: [],\n                    fullDataSet: null,\n                    isLoading: false\n                },\n                griddleState: griddle.griddleState.toJSON(),\n                queryModel: griddle.queryModel,\n                report: this.props.report,\n                entity: this.props.entity,\n                onAction: function onAction(action) {\n                    if (action === 'reset-filters') {\n                        _grid_report_actions2.default.reset();\n                    }\n                    logHeaderAction(action);\n                }\n            },\n            selectedTabIndex: 0\n        };\n    },\n    showWelcome: function showWelcome() {\n        return !(0, _embed_utils.isEmbed)() && !this.props.embedded && !_cookiesJs2.default.get('grid_visited');\n    },\n    entityHasWelcomeDisabled: function entityHasWelcomeDisabled() {\n        return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1;\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        var _this = this;\n\n        var params = void 0;\n        if (!_grid_report_store2.default.isLoading()) {\n            params = Router.stringifyParameters(_grid_report_store2.default.getUrlState());\n            // Avoid sending duplicate events since this can get called multiple times on a single user action.\n            if (params !== this.lastPageviewParams) {\n                // update browsing history\n                Router.trackPageview(params);\n                this.lastPageviewParams = params;\n            }\n            this.props.onParamsChange(params);\n        }\n        // Forgive me for my hacky and sinful JavaScript ways...\n        // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n        var isTallahasseeFl = this.props.entity && this.props.entity.get('subdomain') === 'tallahasseefl';\n        var welcomeModal = _grid_report_store2.default.getState().get('showWelcome') === null ? this.state.welcomeModal : _grid_report_store2.default.getState().get('showWelcome');\n        var summaryWelcomeModal = _modal_store2.default.getState().get('showWelcome') === null ? this.state.welcomeModal : _modal_store2.default.getState().get('showWelcome');\n        welcomeModal = isTallahasseeFl ? summaryWelcomeModal : welcomeModal;\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            grid: { $set: (0, _grid_report_store.getGridState)(_grid_report_store2.default.getState()) },\n            gridReport: { $set: _grid_report_store2.default.getState() },\n            map: { $set: _grid_report_store2.default.getMap() },\n            isMapEnabled: {\n                $set: (0, _grid_report_store.isMapEnabled)(_grid_report_store2.default.getState())\n            },\n            gridReportSchema: { $set: _grid_report_store2.default.getSchema() },\n            headerOptions: {\n                downloads: {\n                    $set: _grid_report_store2.default.getDownloads() || {}\n                },\n                canGoBack: {\n                    $set: _grid_report_store2.default.canGoBack()\n                },\n                canReset: {\n                    $set: _grid_report_store2.default.canReset()\n                }\n            },\n            currentCheckData: {\n                $set: _grid_report_store2.default.getState().get('currentCheckData')\n            },\n            visualization: {\n                $set: _grid_report_store2.default.getState().get('visualization')\n            },\n            showHowToModal: {\n                $set: _grid_report_store2.default.getState().get('showHowTo')\n            },\n            showTOS: {\n                $set: _grid_report_store2.default.getState().get('showTOS')\n            },\n            showExportFilter: {\n                $set: _grid_report_store2.default.getState().get('showExportFilter')\n            },\n            showTargetPanel: {\n                $set: _grid_report_store2.default.getState().get('showTargetPanel')\n            },\n            showAmountColumnPanel: {\n                $set: _grid_report_store2.default.getState().get('showAmountColumnPanel')\n            },\n            showBreakdownsSettingsPanel: {\n                $set: _grid_report_store2.default.getState().get('showBreakdownsSettingsPanel')\n            },\n            session: {\n                $set: _session_store2.default.getSession()\n            },\n            reportCurrentFilter: {\n                $set: _grid_report_store2.default.getSavedState().getIn(['query', 'filter'])\n            },\n            report: {\n                $set: _report_view_store2.default.getRenderedReport()\n            },\n            showBudget101: {\n                $set: _grid_report_store2.default.getState().get('showBudget101')\n            },\n            welcomeModal: {\n                $set: welcomeModal\n            },\n            showFeedback: {\n                $set: _modal_store2.default.getState().get('feedback').get('showFeedback')\n            },\n            feedbackSaving: {\n                $set: _modal_store2.default.getState().get('feedback').get('saving')\n            },\n            feedbackError: {\n                $set: _modal_store2.default.getState().get('feedback').get('showError')\n            },\n            feedbackErrorMessage: {\n                $set: _modal_store2.default.getState().get('feedback').get('errorMessage')\n            },\n            onboardingTour: {\n                $set: _grid_report_store2.default.getState().get('onboardingTour')\n            },\n            alert: {\n                $set: _grid_report_store2.default.getState().get('alert')\n            },\n            relatedTransactions: {\n                $set: _grid_report_store2.default.getState().get('relatedTransactions') && _grid_report_store2.default.getState().get('relatedTransactions').toJS()\n            },\n            loading: { $set: _grid_report_store2.default.isLoading() },\n            error: { $set: _grid_report_store2.default.hasError() }\n        }), function () {\n            // If we are editing the report's default state and we perform actions\n            // such as toggling visualizations on/off or changing the breakdown, we must\n            // manually trigger this method since these actions don't cause \"change\" events from griddle.\n            // We do this inside the setState callback since this method depends on having the latest component state.\n            // Need to execute this in a defer since an action may be dispatching here.\n            _lodash2.default.defer(function () {\n                return _this.handleDefaultStateChange();\n            });\n        });\n    },\n    componentDidMount: function componentDidMount() {\n        this._griddle.run();\n        this._griddle.griddleState.on('change', this.onGriddleStateChange);\n        if (this.state.welcomeModal) {\n            _cookie_helper2.default.setVisitedCookie('grid_visited');\n        }\n        // Load the grid state if there's a state ID in the URL\n        // Otherwise we will just load the configured default state for this report.\n        // If `isReloaded` is true ignore any state ID in the URL since the report is being\n        // reloaded after the dataset has been changed. Any previous state IDs will no longer be valid.\n        var params = !this.props.isReloaded ? Router.parseParameters(this.props.reportParams) : {};\n        if (!_grid_report_actions2.default.loadGridState(params, true)) {\n            this._griddle.once('gridInitialized', this.handleStateChange);\n        }\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this._griddle.griddleState.off();\n        this._griddle.loader.off();\n        this._griddle.queryModel.off();\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (nextProps.reportParams && this.props.reportParams !== nextProps.reportParams) {\n            _grid_report_actions2.default.loadGridState(Router.parseParameters(nextProps.reportParams));\n        }\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps, prevState) {\n        if (prevState.grid !== this.state.grid && (!prevState.grid || JSON.stringify(prevState.grid.get('query')) !== JSON.stringify(this.state.grid.get('query')) || JSON.stringify(prevState.grid.get('columns')) !== JSON.stringify(this.state.grid.get('columns')) || JSON.stringify(prevState.grid.get('amountColumn')) !== JSON.stringify(this.state.grid.get('amountColumn')) || JSON.stringify(prevState.grid.get('graphType')) !== JSON.stringify(this.state.grid.get('graphType')))) {\n            this._griddle.setReportState(this.state.grid.toJS(), true, true);\n        }\n        this._griddle.resize();\n    },\n    handleDefaultStateChange: function handleDefaultStateChange() {\n        //load the check panel if we have a quasi_id but the check panel is not visible\n        var currentCheckData = this.state.currentCheckData;\n        if (currentCheckData.get('quasiId') && !currentCheckData.get('loading') && !currentCheckData.get('data')) {\n            _grid_report_actions2.default.showCheckImagePanel(currentCheckData.get('quasiId'), this.state.headerOptions.queryModel._q, this.state.headerOptions.report.get('transaction_id'), false);\n            this._griddle.scrollToInitialRowPosition(currentCheckData.get('rowTop'));\n        }\n        if (this.props.editingDefaultState) {\n            this.props.onStateChange({\n                grid_state_id: this.state.gridReport.get('savedStateId')\n            });\n        }\n    },\n    handleStateChange: function handleStateChange() {\n        this.handleDefaultStateChange();\n        var currentGriddleState = Immutable.fromJS(this._griddle.getReportState());\n        var savedState = _grid_report_store2.default.getSavedState().merge(currentGriddleState);\n        _grid_report_actions2.default.saveGridState(savedState, true);\n    },\n    onGriddleStateChange: function onGriddleStateChange() {\n        if (!this.isFirstRenderComplete) {\n            this.isFirstRenderComplete = true;\n            this.props.onLoaded(false /*isTriggeredFromSummaryReport*/);\n        }\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            headerOptions: {\n                griddleState: {\n                    $set: this._griddle.griddleState.toJSON()\n                }\n            }\n        }));\n    },\n    createActionHandler: function createActionHandler(name) {\n        return function (action, column) {\n            _og_analytics2.default.pushEvent('Checkbook/' + name, action, column);\n        };\n    },\n    closeWelcomeModal: function closeWelcomeModal() {\n        _grid_report_actions2.default.hideWelcomeModal();\n    },\n    setCurrentWaypoint: function setCurrentWaypoint(index) {\n        if (index >= onboardingWaypoints.length) {\n            this.endTour();\n            return;\n        }\n        _grid_report_actions2.default.gotoTourStep(index);\n    },\n    endTour: function endTour() {\n        _grid_report_actions2.default.endTour();\n    },\n    startWelcomeTour: function startWelcomeTour() {\n        _grid_report_actions2.default.startWelcomeTour();\n    },\n    renderAlert: function renderAlert() {\n        switch (this.state.alert) {\n            case 'gridStateNotFound':\n                return _react2.default.createElement(GridStateNotFoundAlert, null);\n            case 'gridStateUnexpectedError':\n                return _react2.default.createElement(GridStateUnexpectedErrorAlert, null);\n            case 'checkLoadError':\n                return _react2.default.createElement(CheckLoadError, null);\n        }\n    },\n    calculateCurrentTotal: function calculateCurrentTotal(visualization, amountColumn) {\n        var isCumulative = visualization.get('amountsType') === _transactions_utils.AmountsTypes.Cumulative;\n        var renderedAggregates = isCumulative ? (0, _transactions_utils.convertToCumulativeAmounts)(visualization.get('aggregates'), visualization.get('breakdown'), amountColumn) : visualization.get('aggregates');\n        var current = renderedAggregates.last();\n        if (current) {\n            return _lodash2.default.sumBy(current.get('transactions').toJS(), function (o) {\n                return o[[amountColumn]];\n            });\n        }\n        return null;\n    },\n    generateTotalComponent: function generateTotalComponent(schema) {\n        var total_text_visible = this.props.renderedReport.getIn(['properties', 'total_text_visible']);\n        if (!total_text_visible) {\n            return null;\n        }\n        var dateColumn = (0, _schema_utils.findColumnByName)(schema, schema.get('dateColumn'));\n        var visualization = this.state.visualization;\n        var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n        var griddleStateAmount = this._griddle.griddleState.get('amount');\n        var calculatedTotal = (0, _transactions_utils.formatUnits)(schema, amountColumn, griddleStateAmount);\n        var totalString = _strings2.default.generateTotalLabel(visualization, dateColumn);\n        return _react2.default.createElement(_grid_report_total2.default, { totalString: totalString, calculatedTotal: calculatedTotal });\n    },\n    handleCloseDownloadPanel: function handleCloseDownloadPanel() {\n        _grid_report_actions2.default.hideExportFilter();\n        _grid_report_actions2.default.updateFilteredExportJob(_report_download_actions.STATES.QUEUED);\n    },\n    transactionQueryToggle: function transactionQueryToggle(selectedTabIndex) {\n        var gridTabIndex = this.props.renderedReport.getIn(['properties', 'summary_table_visible']) ? 1 : 0;\n        if (selectedTabIndex === gridTabIndex) {\n            this._griddle.griddleState.set({ 'isLazy': false });\n            this._griddle.queryModel.trigger('load');\n        } else {\n            this._griddle.griddleState.set({ 'isLazy': true });\n        }\n    },\n    selectedTabHandler: function selectedTabHandler(selectedTabIndex) {\n        this.transactionQueryToggle(selectedTabIndex);\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            selectedTabIndex: {\n                $set: selectedTabIndex\n            }\n        }));\n    },\n    columnOnClick: function columnOnClick(column, operator, value) {\n        _grid_report_actions2.default.filterColumn(column, operator, value);\n        this.selectedTabHandler(1);\n    },\n    render: function render() {\n        var _this2 = this;\n\n        var bannerHeight = !!this.refs.banner ? _reactDom2.default.findDOMNode(this.refs.banner).scrollHeight : null;\n        var visualization = this.state.visualization;\n        // Forgive me for my hacky and sinful JavaScript ways...\n        // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n        var isTallahasseeFl = this.props.entity && this.props.entity.get('subdomain') === 'tallahasseefl';\n        var WelcomeModalComponent = isTallahasseeFl ? _summary_welcome2.default : _welcome_modal2.default;\n        var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, this.state.gridReport.get('schema'));\n        var sumField = amountColumn + '_sum';\n        var currentTotal = visualization && this.calculateCurrentTotal(visualization, sumField);\n        var canShowSummaryTable = this.props.renderedReport.getIn(['properties', 'summary_table_visible']);\n        var breakdown = visualization && visualization.get('breakdown');\n        var isCumulative = visualization && visualization.get('amountsType') === _transactions_utils.AmountsTypes.Cumulative;\n        var tableAggregates = visualization && visualization.get('tableAggregates');\n        var renderedTableAggregates = isCumulative ? (0, _transactions_utils.convertToCumulativeAmounts)(tableAggregates, breakdown, sumField) : tableAggregates;\n        var selectedTabIndex = canShowSummaryTable ? this.state.selectedTabIndex : 1;\n        var tabName = canShowSummaryTable ? 'Details' : 'Records';\n        var isSummaryLoading = visualization && visualization.get('isSummaryLoading');\n        var embedMainContentStyle = (0, _embed_utils.isEmbed)() ? { paddingLeft: '0px' } : {};\n        var embedMainPanelStyle = (0, _embed_utils.isEmbed)() ? { visibility: 'hidden' } : {};\n        var embedTableStyle = (0, _embed_utils.hideTable)() ? { display: 'none' } : {};\n        var embedVizStyle = (0, _embed_utils.hideViz)() ? { display: 'none' } : {};\n        var feedbackModal = this.state.showFeedback ? _react2.default.createElement(_feedback2.default, { entityDisplayName: this.props.entity.get('display_name'), showError: this.state.feedbackError, errorMessage: this.state.feedbackErrorMessage, feedbackSaving: this.state.feedbackSaving, reportId: this.props.report.id, entityId: this.props.entity.get('entity_id') }) : null;\n        return _react2.default.createElement(\"div\", { className: \"report__container report_grid\" }, _config2.default.CheckSettings.checkbookDomain === _cookie_helper2.default.parentDomain() ? _react2.default.createElement(_banner2.default, { ref: \"banner\" }, _react2.default.createElement(\"div\", { className: \"banner__content ohio-banner\" }, _react2.default.createElement(\"a\", { href: \"http://ohiotreasurer.gov/\", className: \"ohio-banner__logo\" }), _react2.default.createElement(\"a\", { href: \"http://local.ohiocheckbook.com/\", className: \"ohio-banner__ohiocheckbook-logo\" }, _react2.default.createElement(\"strong\", null, \"OhioCheckbook.com\")))) : null, _react2.default.createElement(\"div\", { style: embedMainPanelStyle }, _react2.default.createElement(_ovid.MainPanel, { ref: \"sidebar\" }, _react2.default.createElement(_sidebar2.default, { entity: this.props.entity, report: this.props.report, session: this.props.session, reports: this.props.reports, embedded: this.props.embedded, stories: this.props.stories, activeSidebar: this.props.activeSidebar, isGridReport: this.props.isGridReport, isNetwork: this.props.isNetwork, reportError: this.state.reportError, isEditingDefaultState: this.props.editingDefaultState, isControlPanel: this.props.isControlPanel }, (0, _transactions_utils.isMultipleAmountColumnsEnabled)(this.props.entity) && visualization && _react2.default.createElement(_amount_menu2.default, { amountColumn: amountColumn, showAmountColumnPanel: this.state.showAmountColumnPanel, visualization: visualization, isControlPanel: this.props.embedded }), !!visualization && _react2.default.createElement(_grid_break_down_dropdown2.default, { visualization: visualization, showBreakdownsSettingsPanel: this.state.showBreakdownsSettingsPanel, isControlPanel: this.props.embedded }), _react2.default.createElement(_filterButtons2.default, { activeFilterIds: _grid_report_store2.default.getState().getIn(['filterState', 'activeFilterIds']), items: this._griddle.menuItems, toggleAll: function toggleAll() {\n                return _this2._griddle.view('filterMenu').toggleAll();\n            }, addFilter: function addFilter(id) {\n                return _this2._griddle.view('filterMenu').open(id);\n            }, removeFilter: function removeFilter(id) {\n                return _this2._griddle.view('filterMenu').closePanel(id);\n            } }), _react2.default.createElement(\"div\", { id: \"template-mainpanel\", key: \"templateMainPanel\" }), _react2.default.createElement(_amounts_type_menu2.default, { value: visualization && visualization.get('amountsType'), onChange: _grid_report_actions2.default.setAmountsType }), (0, _target_utils.isKPITargetsEnabled)(this.props.entity) && visualization && _react2.default.createElement(_target_toggle2.default, { isControlPanel: this.props.isControlPanel, isPanelOpen: this.state.showTargetPanel, graphType: visualization.get('graphType'), isVisShown: visualization.get('isVisible'), target: visualization.get('target') }), !!visualization && this.generateTotalComponent(this.state.gridReport.get('schema')), (0, _target_utils.isKPITargetsEnabled)(this.props.entity) && visualization && (0, _target_utils.isTargetValid)(visualization.get('target')) && _react2.default.createElement(_target_status2.default, { target: visualization.get('target'), current: currentTotal }), _react2.default.createElement(_document_list2.default, { entity: this.props.entity })))), _react2.default.createElement(\"div\", { id: \"template-subpanels\" }), this.state.showTargetPanel && visualization && _react2.default.createElement(_target_panel2.default, { target: visualization.get('target') }), _react2.default.createElement(_header2.default, { entity: this.props.entity, isNetwork: this.props.isNetwork, headerOptions: this.state.headerOptions, report: this.props.renderedReport, reports: this.props.reports, embedded: this.props.embedded }), _react2.default.createElement(\"main\", { style: embedMainContentStyle, className: \"ui-main__content\" }, this.renderAlert(), _react2.default.createElement(_grid_header_actions2.default, Object.assign({}, this.state.headerOptions, { embedded: this.props.embedded, showShareMenu: this.props.renderedReport.getIn(['abilities', 'update']), report: this.props.renderedReport }, this.state)), _react2.default.createElement(_report_header2.default, Object.assign({}, this.state.headerOptions, { renderedReport: this.props.renderedReport, schema: this._griddle.schema, columns: this.state.gridReport.get('schema').get('columns'), filterMenu: this._griddle.view('filterMenu'), isControlPanel: this.props.isControlPanel, breakdown: breakdown })), _react2.default.createElement(\"div\", { id: 'visualization_wrapper', style: embedVizStyle }, _react2.default.createElement(_visualization_button2.default, { isVisible: this.state.gridReport.getIn(['visualization', 'isVisible']) }), !!(visualization && visualization.get('isVisible')) && _react2.default.createElement(_aggregate_visualization2.default, { locale: this.state.gridReport.get('locale'), savedStateId: this.state.gridReport.get('savedStateId'), filter: this.state.grid.getIn(['query', 'filter']), visualization: visualization, map: this.state.map, schema: this.state.gridReportSchema, isMapEnabled: this.state.isMapEnabled, bannerHeight: bannerHeight, entity: this.props.entity })), _react2.default.createElement(\"div\", { id: 'table_wrapper', style: embedTableStyle }, _react2.default.createElement(\"section\", { className: \"report__section js-griddle-container\" }, _react2.default.createElement(\"h3\", { className: \"table-header\" }, \"Data\"), _react2.default.createElement(Ovid.Tabs.Container, { minimal: true, selectedTabIndex: selectedTabIndex, selectedTabHandler: this.selectedTabHandler }, canShowSummaryTable ? _react2.default.createElement(Ovid.Tabs.Tab, { title: \"Summary\", tabPanelClasses: \"table-tab-panel\" }, _react2.default.createElement(\"div\", { className: \"summary-grid\" }, _react2.default.createElement(\"div\", { id: \"loading-gif\", className: \"loading-gif-centered\" }), renderedTableAggregates && renderedTableAggregates.size > 0 && _react2.default.createElement(_summary_table2.default, { visualization: visualization, schema: this.state.gridReport.get('schema'), columnOnClick: this.columnOnClick, aggregatesData: renderedTableAggregates }))) : null, _react2.default.createElement(Ovid.Tabs.Tab, { title: tabName, tabPanelClasses: \"table-tab-panel\" }, _react2.default.createElement(QueryGrid, null))), _react2.default.createElement(\"div\", { id: \"template-modal-recoverable-error\" }), _react2.default.createElement(QueryGridLoader, { loading: this.state.loading, summaryLoading: isSummaryLoading, error: this.state.error ? 'Oops, Something Went Wrong' : null, canGoBack: this.state.headerOptions.canGoBack, selectedTabIndex: selectedTabIndex }))), !this.props.isControlPanel && !this.props.embedded ? _react2.default.createElement(_footer2.default, { ref: \"footer\", entity: this.props.entity }) : null, feedbackModal, this.state.onboardingTour.get('showTour') ? _react2.default.createElement(_ovid.Onboarding, { onCancel: _grid_report_actions2.default.endTour, currentWaypoint: this.state.onboardingTour.get('currentStep'), setCurrentWaypoint: this.setCurrentWaypoint, waypoints: onboardingWaypoints }) : null, this.state.welcomeModal && !this.entityHasWelcomeDisabled() ? _react2.default.createElement(WelcomeModalComponent, { entity: this.props.entity, closeWelcomeModal: this.closeWelcomeModal, startTour: this.startWelcomeTour }) : null, this.state.showHowToModal ? _react2.default.createElement(_modal_gridhowto2.default, null) : null, this.state.showBudget101 ? _react2.default.createElement(_budget2.default, null) : null, this.state.showTOS ? _react2.default.createElement(_termsOfService2.default, null) : null, this.state.showExportFilter ? _react2.default.createElement(_email_export_filter2.default, { state: this.state, griddleState: this._griddle.griddleState, handleCloseDownloadPanel: this.handleCloseDownloadPanel }) : null, _react2.default.createElement(_check_panel2.default, { checkData: this.state.currentCheckData && this.state.currentCheckData.toJS(), entity: this.props.entity, feedbackModal: feedbackModal, openFeedbackModal: function openFeedbackModal() {\n                return _report_actions2.default.showFeedback();\n            }, relatedTransactions: this.state.relatedTransactions, locale: this.state.gridReport.get('locale') })));\n    }\n});\nvar CheckLoadError = (0, _createReactClass2.default)({\n    displayName: 'CheckLoadError',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"report-state-alert ui-alert-box notice\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), _react2.default.createElement(\"strong\", null, \"Check Load Error\"), \" There was an error loading the selected check.\", _react2.default.createElement(\"a\", { className: \"ui-alert-box__close\", onClick: _grid_report_actions2.default.dismissAlert }));\n    }\n});\nvar GridStateNotFoundAlert = (0, _createReactClass2.default)({\n    displayName: 'GridStateNotFoundAlert',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"report-state-alert ui-alert-box notice\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), _react2.default.createElement(\"strong\", null, \"View not found\"), \" The link you visited may be incorrect.\", _react2.default.createElement(\"a\", { className: \"ui-alert-box__close\", onClick: _grid_report_actions2.default.dismissAlert }));\n    }\n});\nvar GridStateUnexpectedErrorAlert = (0, _createReactClass2.default)({\n    displayName: 'GridStateUnexpectedErrorAlert',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"report-state-alert ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), _react2.default.createElement(\"strong\", null, \"Unexpected error\"), \" There was an issue loading the view you requested. Please try again shortly.\", _react2.default.createElement(\"a\", { className: \"ui-alert-box__close\", onClick: _grid_report_actions2.default.dismissAlert }));\n    }\n});\nvar QueryGridLoader = (0, _createReactClass2.default)({\n    displayName: 'QueryGridLoader',\n\n    propTypes: {\n        loading: _propTypes2.default.bool,\n        summaryLoading: _propTypes2.default.bool,\n        error: _propTypes2.default.string,\n        canGoBack: _propTypes2.default.bool,\n        selectedTabIndex: _propTypes2.default.number\n    },\n    render: function render() {\n        var loading = this.props.selectedTabIndex == 1 ? this.props.loading : this.props.summaryLoading;\n        var styles = {\n            display: loading || this.props.error ? 'block' : 'none'\n        };\n        return _react2.default.createElement(\"div\", { className: 'querygrid-loader ajax-loader ' + (this.props.error ? 'error-state' : ''), style: styles }, _react2.default.createElement(\"div\", { className: \"querygrid-loader__icon_loading\" }), _react2.default.createElement(\"div\", { className: \"querygrid-loader__icon_error icon-exclamation-4\" }), _react2.default.createElement(\"div\", { className: \"querygrid-loader__text_loading\" }, \"Loading...\"), _react2.default.createElement(\"div\", { className: \"querygrid-loader__text_error\" }, this.props.error), _react2.default.createElement(\"div\", { className: 'querygrid-loader__button ' + (0, _classnames2.default)({ disabled: _grid_report_store2.default.getState().get('history').isEmpty() }), onClick: _grid_report_actions2.default.goBack }, \"Back\"), this.props.error ? _react2.default.createElement(\"div\", { className: 'querygrid-loader__button ' + (0, _classnames2.default)({ disabled: !this.props.canGoBack }), onClick: _grid_report_actions2.default.reset }, \"Reset\") : null);\n    }\n});\nvar QueryGrid = function QueryGrid() {\n    return _react2.default.createElement(\"div\", { className: \"querygrid\" }, _react2.default.createElement(\"div\", { id: \"loading-gif\", className: \"loading-gif-centered\" }));\n};\n\n/***/ }),\n/* 927 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.visibleColumnIds = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _og_analytics = __webpack_require__(117);\n\nvar _og_analytics2 = _interopRequireDefault(_og_analytics);\n\nvar _athena_state = __webpack_require__(505);\n\nvar _athena_state2 = _interopRequireDefault(_athena_state);\n\nvar _filter_menu = __webpack_require__(928);\n\nvar _filter_menu2 = _interopRequireDefault(_filter_menu);\n\nvar _recoverable_error = __webpack_require__(258);\n\nvar _recoverable_error2 = _interopRequireDefault(_recoverable_error);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _querygrid = __webpack_require__(516);\n\nvar _querygrid2 = _interopRequireDefault(_querygrid);\n\nvar _remotemodel = __webpack_require__(263);\n\nvar _remotemodel2 = _interopRequireDefault(_remotemodel);\n\nvar _checkbook_contextmenu = __webpack_require__(941);\n\nvar _checkbook_contextmenu2 = _interopRequireDefault(_checkbook_contextmenu);\n\nvar _contextmenu = __webpack_require__(264);\n\nvar _contextmenu2 = _interopRequireDefault(_contextmenu);\n\nvar _facetpanel = __webpack_require__(942);\n\nvar _facetpanel2 = _interopRequireDefault(_facetpanel);\n\nvar _headermenu = __webpack_require__(518);\n\nvar _headermenu2 = _interopRequireDefault(_headermenu);\n\nvar _filterspanel = __webpack_require__(944);\n\nvar _filterspanel2 = _interopRequireDefault(_filterspanel);\n\nvar _columnspanel = __webpack_require__(945);\n\nvar _columnspanel2 = _interopRequireDefault(_columnspanel);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _immutable = __webpack_require__(14);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar visibleColumnIds = exports.visibleColumnIds = function visibleColumnIds(columns, isCheckImageVisible) {\n    var result = columns.filter(function (c) {\n        return c.visible;\n    }).map(function (c) {\n        return c.id;\n    });\n    return isCheckImageVisible ? result.concat(['quasi_id']) : result;\n};\nvar Athena = og.View.extend({\n    el: 'body',\n    units: '',\n    initialize: function initialize(options) {\n        this.options = options;\n        this.queryModel = options.queryModel;\n        this.entity = options.entity;\n        this.state = new _athena_state2.default({\n            report: options.report,\n            entity: this.entity\n        });\n        this.griddleState = new _backbone2.default.Model();\n        this.menuItems = [{\n            name: 'Filters',\n            id: 'filters'\n        }, {\n            name: 'Columns',\n            id: 'columns'\n        }, {\n            name: 'Aggregates',\n            id: 'groups'\n        }];\n        // options for QueryGrid\n        this.gridOptions = {\n            container: '.querygrid',\n            gridOptions: {\n                enableAddRow: true\n            },\n            schema: [],\n            meta: {},\n            queryModel: options.queryModel,\n            loader: null,\n            columns: [],\n            characterWidth: 7,\n            cellPadding: 40,\n            autoWidth: true\n        };\n        if (options.initialRow) {\n            this.gridOptions.initialRow = options.initialRow;\n        }\n        this.errorModal = new _recoverable_error2.default({\n            suppressRemoval: true\n        });\n        this.schemaLoaded = false; // To prevent race conditions\n        this.amountColumn = null;\n        this._previousAmountColumn = null;\n        this.graphType = null;\n        this._previousGraphType = null;\n        this.viewCheckDetails = null;\n        this.on('changed:amountColumn', this.updateGriddle);\n        this.on('changed:graphType', this.updateGriddle);\n    },\n    run: function run() {\n        this.listenTo(this.queryModel, 'change', this.notifyStateChange);\n        this.loader = this.gridOptions.loader = new _remotemodel2.default({\n            endpoint: _lodash2.default.bind(this.fetchDataHandler, this),\n            queryModel: this.queryModel\n        });\n        var filterMenu = new _filter_menu2.default();\n        _lodash2.default.extend(filterMenu, {\n            template: 'griddle_subpanels',\n            placeholder: 'subpanels',\n            items: this.menuItems\n        });\n        this.view('filterMenu', filterMenu);\n        this.render();\n        // Bind to window resize even w/o grid loading\n        var resize = _lodash2.default.bind(this.resize, this);\n        resize();\n        this.handleResize = _lodash2.default.debounce(resize, 200);\n        (0, _jquery2.default)(window).resize(this.handleResize);\n        if (this.options.initialRow && this.options.initialRow > 0) {\n            this.scrollToInitialRowPosition(this.options.initialRow);\n        }\n        this.load();\n    },\n    load: function load() {\n        var self = this;\n        // load data via ajax and call init\n        og.api.trapi.get('schema', this.options.transaction_id, function (err, requestResponse) {\n            err = err || requestResponse.error;\n            if (err) {\n                self.showErrorModal(err);\n                return;\n            }\n            var response = requestResponse.body;\n            if (!_lodash2.default.find(response.schema, function (schema) {\n                return schema.name === response.meta.date_column;\n            })) {\n                self.showErrorModal({\n                    title: 'Error parsing dataset',\n                    message: 'The date column could not be found in your dataset. Please re-upload your data and make sure to select the correct date option when mapping your dataset.'\n                });\n                return;\n            }\n            _grid_report_actions2.default.transactionDownloadsLoaded(response.downloads);\n            _grid_report_actions2.default.setInSyncStatus(response.meta);\n            var reportAmountType = (0, _numberTypes.localeToCurrency)(self.state.get('report').get('locale'));\n            // append currency sign into label for monetary columns\n            _lodash2.default.each(response.schema, function (column) {\n                if (column.type === 'monetary') {\n                    column.label += ' (' + reportAmountType.symbol + ')';\n                    column.units = reportAmountType.label;\n                }\n                column.id = column.id || column.name;\n            });\n            self.schema = response.schema;\n            self.meta = response.meta;\n            self.gridOptions.columns = self.getColumnProperties(response.schema, self.options.report.get('properties').columns);\n            self.gridOptions.meta = response.meta;\n            _grid_report_actions2.default.setSchema(response.meta, response.schema, self.entity.fiscal_year_start_month);\n            self.initGrid();\n            var amountColumn = self.amountColumn || self.gridOptions.meta.amount_column;\n            og.api.trapi.post('total', self.options.transaction_id, { fields: [amountColumn] }, function (err, response) {\n                if (response) {\n                    var responseTotal = response.body || {};\n                    self.griddleState.set({\n                        count: responseTotal.count,\n                        amount: responseTotal.total\n                    });\n                    self.schemaLoaded = true; // schema loaded... we can call loadTotal()\n                    // refresh so that header does not display estimate instead of total\n                    self.loadTotal();\n                }\n            });\n        });\n    },\n    getColumnProperties: function getColumnProperties(schema) {\n        var columnSettings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n        var schemaColumns = _lodash2.default.keyBy(schema, 'id');\n        var columns = [];\n        // get columns in the order that was set in report settings\n        _lodash2.default.each(columnSettings, function (c) {\n            if (c.id in schemaColumns) {\n                columns.push(_lodash2.default.extend({}, schemaColumns[c.id], c));\n                delete schemaColumns[c.id];\n            }\n        });\n        // add the rest of the columns from schema\n        _lodash2.default.each(schema, function (c) {\n            if (c.id in schemaColumns) {\n                columns.push(_lodash2.default.extend({}, schemaColumns[c.id]));\n            }\n        });\n        return columns;\n    },\n    loadTotal: function loadTotal() {\n        var _this = this;\n\n        var refetchTransactions = false;\n        var gridReportState = _grid_report_store2.default.getState();\n        var timePeriodQuery = gridReportState.get('timePeriodQuery');\n        var chartTypePie = gridReportState.getIn(['visualization', 'graphType']) === 'pie';\n        // if the schema hasn't finished loading... don't proceed...\n        if (!this.schemaLoaded) {\n            return;\n        }\n        var query = this.queryModel.toJSON();\n        // Query is empty when switching charts, so if it's a pie chart and there's a timePeriodQuery set by\n        // the <SummaryPieSlider/> #componentDidUpdate 😬 then set the query to whatever it selected.\n        if (timePeriodQuery && chartTypePie && _lodash2.default.isEmpty(query)) {\n            query = _grid_report_store2.default.getState().get('timePeriodQuery');\n            refetchTransactions = true;\n        }\n        this.loader.processQuery(query);\n        var filter = query.filter;\n        // TODO: If the graph types are of the same type, depending on filters and\n        //       amount column we might not require to fetch totals from the API again\n        //       For example: bar / line graphs and pie / treemap / horizontal_stacked graphs\n        //       should show the same totals depending on filters and amount column\n        // only load when the filter changed or the amount column has changed or the graph type has changed\n        // (do not load when only sorting changed etc.)\n        if (_lodash2.default.isEqual(filter, this._previousFilter) && _lodash2.default.isEqual(this.amountColumn, this._previousAmountColumn) && _lodash2.default.isEqual(this.graphType, this._previousGraphType)) {\n            return;\n        }\n        this.griddleState.set({\n            count: null,\n            amount: null,\n            estimate: null\n        });\n        // abort previous request so that we don't end up with value that does not match selection\n        if (this._totalRequest) {\n            this._totalRequest.abort();\n        }\n        var amountColumn = this.amountColumn || this.gridOptions.meta.amount_column;\n        this._totalRequest = og.api.trapi.post('total', this.options.transaction_id, { filter: filter, fields: [amountColumn] }, function (err, resp) {\n            _this._totalRequest = null;\n            if (!err) {\n                var data = resp.body;\n                _this.griddleState.set({\n                    count: data.count,\n                    amount: data.total\n                });\n                if (refetchTransactions) {\n                    _this.loader.clear();\n                    _this.loader.ensureData(0, 1);\n                    _this.grid.onViewportChanged.notify();\n                    var savedState = _grid_report_store2.default.getSavedState().mergeDeep({ query: (0, _immutable.fromJS)(timePeriodQuery) });\n                    _grid_report_actions2.default.saveGridState(savedState, false);\n                }\n            }\n        });\n        this._previousFilter = filter;\n        this._previousAmountColumn = this.amountColumn;\n        this._previousGraphType = this.graphType;\n    },\n    initGrid: function initGrid() {\n        var locale = this.state.report.get('locale');\n        var grid = this.grid = new _querygrid2.default(this.gridOptions, locale);\n        var filterMenu = this.view('filterMenu');\n        // header menu plugin for filtering and querying\n        var headerMenuPlugin = new _headermenu2.default({\n            queryModel: this.queryModel,\n            locale: locale\n        });\n        grid.registerPlugin(headerMenuPlugin);\n        // plugin for right-click menu actions\n        this.viewCheckDetails = this.options.report.get('properties') && this.options.report.get('properties').check_image_visible;\n        this.contextMenuPlugin = this.createContextMenu(this.viewCheckDetails);\n        grid.registerPlugin(this.contextMenuPlugin);\n        var filtersPanel = new _filterspanel2.default({\n            queryModel: this.queryModel,\n            filterMenu: filterMenu\n        });\n        filterMenu.view('subpanel', 'filters', filtersPanel);\n        grid.registerPlugin(filtersPanel);\n        // update query when filterspanel is being closed\n        filterMenu.on('toggle', function (id, isOpened) {\n            if (id === 'filters' && !isOpened) {\n                filtersPanel.setFilters();\n            }\n        });\n        var columnsPanel = new _columnspanel2.default();\n        columnsPanel.viewData({ id: 'columns' });\n        filterMenu.view('subpanel', 'columns', columnsPanel);\n        grid.registerPlugin(columnsPanel);\n        columnsPanel.render();\n        // Facet panel in a sidebar\n        this.facetPanel = new _facetpanel2.default({\n            endpoint: _lodash2.default.bind(function (query, callback) {\n                return og.api.trapi.post('query', this.options.transaction_id, query, function (error, response) {\n                    if (error) {\n                        Raven.captureException(error);\n                    }\n                    callback(error, response);\n                });\n            }, this),\n            state: {\n                group: this.gridOptions.meta.amount_column,\n                value: this.gridOptions.meta.amount_column\n            },\n            grid: grid,\n            columns: this.gridOptions.columns\n        });\n        filterMenu.view('subpanel', 'groups', this.facetPanel);\n        grid.registerPlugin(this.facetPanel);\n        // hookup logging to google analytics\n        var widgets = {\n            ColumnsPanel: columnsPanel,\n            ContextMenu: this.contextMenuPlugin,\n            AggregatesPanel: this.facetPanel,\n            FiltersPanel: filtersPanel,\n            ColumnMenu: headerMenuPlugin,\n            Grid: grid\n        };\n        _lodash2.default.each(widgets, function (widget, name) {\n            widget.on('action', function (action, column) {\n                _og_analytics2.default.pushEvent('Checkbook/' + name, action, column);\n            });\n        });\n        this.listenTo(grid, 'viewportChanged', this.onViewportChanged, this);\n        this.listenTo(grid, 'columnsReordered columnsVisibilityChanged', this.notifyStateChange);\n        this.listenTo(this.options.report, 'change', function () {\n            var isCheckVisible = this.options.report.get('properties') && this.options.report.get('properties').check_image_visible;\n            if (this.viewCheckDetails != isCheckVisible) {\n                this.viewCheckDetails = isCheckVisible;\n                this.updateContextMenu(isCheckVisible);\n            }\n        }, this);\n        this.listenTo(this.loader, 'loading', _grid_report_actions2.default.loadingGridData);\n        this.listenTo(this.loader, 'error', _grid_report_actions2.default.errorLoadingGridData);\n        this.listenTo(this.loader, 'loaded', this.onDataLoaded, this);\n        this.listenTo(this.queryModel, 'load', function () {\n            this.loader.clear();\n            this.loader.ensureData(0, 1);\n            this.grid.onViewportChanged.notify();\n            this.loadTotal();\n        }, this);\n        // If we tried setting the report state earlier before the grid\n        // was loaded, go ahead and set that state now.\n        if (this._pendingReportState) {\n            this.setReportState.apply(this, _toConsumableArray(this._pendingReportState).concat([locale]));\n            this._pendingReportState = null;\n        }\n        // load the first page\n        this.loader.ensureData(0, 1);\n        this.trigger('gridInitialized');\n    },\n    destroy: function destroy() {\n        (0, _jquery2.default)(window).off('resize', this.handleResize);\n        // plugins are destroyed automatically by grid\n        this.grid.destroy();\n        // remove listeners\n        this.queryModel.off();\n        this.loader.off();\n        // clean up the backbone view\n        this.remove();\n    },\n    resize: function resize() {\n        var griddleContainer = (0, _jquery2.default)('.js-griddle-container');\n        var top = griddleContainer.offset().top;\n        var w = (0, _jquery2.default)(window);\n        var container = (0, _jquery2.default)(this.gridOptions.container);\n        var summaryGridContainer = (0, _jquery2.default)('.summary-grid');\n        var calculatedHeight = w.height() - top - 71; // subtract 71px for the tab height\n        var minHeight = 340; // The minimum height required to show 7 rows in the grid\n        calculatedHeight = calculatedHeight < minHeight ? minHeight : calculatedHeight;\n        var visibleColumnsCount = this.getVisibleColumnsCount();\n        // Height will need to reduce by 42px when the banner appears\n        container.css({\n            height: calculatedHeight + 'px',\n            width: griddleContainer.width() + 'px',\n            display: visibleColumnsCount > 0 ? 'block' : 'none'\n        });\n        summaryGridContainer.css({\n            height: calculatedHeight + 'px',\n            width: griddleContainer.width() + 'px',\n            display: visibleColumnsCount > 0 ? 'block' : 'none'\n        });\n        if (this.grid) {\n            this.grid.resizeCanvas();\n            this.onViewportChanged();\n            this.grid.adjustHeader();\n        }\n    },\n    getReportState: function getReportState() {\n        return {\n            columns: _lodash2.default.map(this.grid.getAllColumns(), function (c) {\n                return _lodash2.default.pick(c, 'id', 'visible');\n            }),\n            query: this.queryModel.toJSON()\n        };\n    },\n    setReportState: function setReportState(state, silent, force) {\n        if (!this.grid) {\n            this._pendingReportState = [state, silent, force];\n            return;\n        }\n        // We only want to trigger one state change event.\n        // So pause any notifications until we have updated both the\n        // column and filter state of the grid before firing them.\n        this._updatingState = true;\n        var locale = this.state.report.get('locale');\n        this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), state.columns), locale);\n        this.queryModel.setQuery(_lodash2.default.cloneDeep(state.query), false, force);\n        this.setAmountColumn(state.amountColumn);\n        this.setGraphType(state.graphType);\n        this._updatingState = false;\n        // If we triggered any grid state changes, fire off the notifications now.\n        if (!silent && this._didChangeState) {\n            this.notifyStateChange();\n            this._didChangeState = false;\n        }\n    },\n    onDataLoaded: function onDataLoaded(args) {\n        var count = args.count;\n        if (count === null && _lodash2.default.isUndefined(args.q.filter)) {\n            // there are no filters -> use total\n            count = this.griddleState.get('count');\n        }\n        this.griddleState.set('estimate', args.total_count_estimate);\n        this.onViewportChanged();\n        this.grid.adjustHeader();\n        _grid_report_actions2.default.loadedGridData();\n        if (count === 0 && !this.griddleState.get('isLazy')) {\n            this.errorModal.open('No data matched your filters', 'Try broadening your search by removing or simplifying filters.');\n        } else {\n            this.errorModal.close();\n        }\n    },\n    onViewportChanged: function onViewportChanged() {\n        var vp = this.grid.getViewport();\n        this.griddleState.set({\n            top: vp.top,\n            bottom: vp.bottom\n        });\n    },\n    resetFilters: function resetFilters() {\n        var queryModel = this.queryModel;\n        queryModel.beginUpdate();\n        queryModel.filterClear();\n        queryModel.sort([]);\n        queryModel.endUpdate();\n    },\n    scrollToInitialRowPosition: function scrollToInitialRowPosition(row) {\n        var scrollRow = function scrollRow() {\n            this.grid.scrollRowIntoView(row + 1);\n        };\n        var loadRows = function loadRows() {\n            this.loader.ensureData(row, row + 20);\n            this.listenToOnce(this.loader, 'loaded', scrollRow, this);\n        };\n        // load the data for the initial scroll position and then scroll there\n        // if the current pagesize is bigger than the row we need to ensure data.\n        // if the row is smaller than the current index, the grid will load data upon scrolling to that position\n        this.listenToOnce(this.loader, 'loaded', this.grid.loader.options.pageSize > row ? scrollRow : loadRows, this);\n    },\n    getState: function getState() {\n        return {\n            query: this.queryModel.toJSON()\n        };\n    },\n    showErrorModal: function showErrorModal(err) {\n        (0, _jquery2.default)('#loading-gif').hide();\n        if (err && err.status === 404) {\n            this.errorModal.open('No grid data', 'There is no data available for ' + this.entity.name + '.');\n        } else {\n            this.errorModal.open(_lodash2.default.get(err, 'title') || 'Error communicating with server', _lodash2.default.get(err, 'message') || 'Please try accessing this data again in a few minutes.');\n        }\n    },\n    notifyStateChange: function notifyStateChange() {\n        if (this._updatingState) {\n            this._didChangeState = true;\n        } else if (this.options.onStateChange) {\n            this.options.onStateChange(this.getReportState());\n        }\n    },\n    getVisibleColumnsCount: function getVisibleColumnsCount() {\n        return this.grid && this.grid.fixedColumns ? this.grid.fixedColumns.length : 0;\n    },\n    setAmountColumn: function setAmountColumn(amountColumn) {\n        this.amountColumn = amountColumn;\n        this.trigger('changed:amountColumn');\n    },\n    setGraphType: function setGraphType(graphType) {\n        this.graphType = graphType;\n        this.trigger('changed:graphType');\n    },\n    updateGriddle: function updateGriddle() {\n        // Update the aggregates panel\n        this.facetPanel.state.value = this.amountColumn || this.gridOptions.meta.amount_column;\n        this.facetPanel.render();\n        this.facetPanel.onQueryChange();\n        // Recalculate the total\n        this.loadTotal();\n    },\n    updateContextMenu: function updateContextMenu(isCheckVisible) {\n        // Update the Context Menu\n        this.contextMenuPlugin = this.createContextMenu(isCheckVisible);\n        this.grid.registerPlugin(this.contextMenuPlugin);\n    },\n    createContextMenu: function createContextMenu(isCheckImageVisible) {\n        var contextMenuPlugin = void 0;\n        if (isCheckImageVisible) {\n            contextMenuPlugin = new _checkbook_contextmenu2.default({\n                queryModel: this.queryModel\n            });\n        } else {\n            contextMenuPlugin = new _contextmenu2.default({\n                queryModel: this.queryModel\n            });\n        }\n        return contextMenuPlugin;\n    },\n    fetchDataHandler: function fetchDataHandler(query, callback) {\n        var gridReportState = _grid_report_store2.default.getState();\n        var timePeriodQuery = gridReportState.get('timePeriodQuery');\n        var chartTypePie = gridReportState.getIn(['visualization', 'graphType']) === 'pie';\n        if (timePeriodQuery && chartTypePie && query && _lodash2.default.isEmpty(query.filter)) {\n            query.filter = _grid_report_store2.default.getState().get('timePeriodQuery').filter;\n        }\n        // Do not query transactions when lazy loading\n        if (this.griddleState.get('isLazy')) {\n            return this.emptyTransactionsQuery(callback);\n        }\n        _grid_report_actions2.default.loadingGridData();\n        // optimization or not if there are no .fields then the query is going to fail\n        if ((0, _grid_report_store.isQueryOptimizationEnabled)() || !query.fields || query.fields.length === 0) {\n            query.fields = visibleColumnIds(this.grid.getAllColumns(), this.viewCheckDetails);\n        }\n        return og.api.trapi.post('query', this.options.transaction_id, query, function (error, response) {\n            if (error) {\n                Raven.captureException(error);\n            }\n            callback(error, response);\n        });\n    },\n    emptyTransactionsQuery: function emptyTransactionsQuery(callback) {\n        var response = { body: { transactions: [] } };\n        callback(null, response);\n        return _jquery2.default.ajax();\n    }\n});\nexports.default = Athena;\n\n/***/ }),\n/* 928 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = og.View.extend({\n    initialize: function initialize() {\n        this.openPanelCount = 0;\n        this.registerCloseItem(this.isSelfClick);\n    },\n\n    //Direct clicks on the container won't register as self clicks, since the container\n    //is larger than the contained panels\n    isSelfClick: function isSelfClick(e) {\n        return !(0, _jquery2.default)(e.target).hasClass('subpanels');\n    },\n    toggle: function toggle(id, state) {\n        console.log('toggle');\n        if (_lodash2.default.isUndefined(state)) {\n            state = !this.isOpen;\n        }\n        if (state) {\n            var item = _lodash2.default.find(this.items, { id: id });\n            this.open(item);\n        } else {\n            this.closePanel(id);\n        }\n    },\n    toggleAll: function toggleAll() {\n        var openPanels = this.$('.js-subpanel.open');\n        if (openPanels.length === _lodash2.default.reject(this.items, 'disabled').length) {\n            this.closeAll();\n        } else {\n            this.openAll();\n        }\n    },\n    openAll: function openAll() {\n        _lodash2.default.each(this.items, _lodash2.default.bind(function (item) {\n            this.open(item);\n        }, this));\n    },\n    closeAll: function closeAll() {\n        _lodash2.default.each(this.items, _lodash2.default.bind(function (item) {\n            this.closePanel(item.id);\n        }, this));\n    },\n    open: function open(item) {\n        var id = void 0;\n        // The item parameter can be either an object or ID string.\n        if (_lodash2.default.isString(item)) {\n            item = _lodash2.default.find(this.items, { id: item });\n        }\n        id = item.id;\n        var $panel = this.find('subpanel', id);\n        if (item.disabled || $panel.hasClass('open')) {\n            return;\n        }\n        this.isOpen = this.openPanelCount >= 0;\n        this.selfClicked = true;\n        $panel.addClass('ready');\n        (0, _jquery2.default)('.js-subpanels').addClass('is-expanded');\n        setTimeout(function () {\n            $panel.addClass('open');\n        }, 1);\n        this.openPanelCount++;\n        _grid_report_actions2.default.addActiveFilter(id);\n    },\n    close: function close() {\n        this.closeAll();\n    },\n    closePanel: function closePanel(id) {\n        this.openPanelCount = Math.max(this.openPanelCount - 1, 0);\n        this.isOpen = this.openPanelCount > 0;\n        this.selfClicked = true;\n        var $panel = this.find('subpanel', id);\n        $panel.removeClass('open');\n        if (this.openPanelCount === 0) {\n            (0, _jquery2.default)('.js-subpanels').removeClass('is-expanded');\n        }\n        setTimeout(function () {\n            $panel.removeClass('ready');\n        }, 150);\n        _grid_report_actions2.default.removeActiveFilter(id);\n    },\n\n    events: {\n        'click .js-close-panel': function clickJsClosePanel(evt) {\n            var id = (0, _jquery2.default)(evt.currentTarget).data('id');\n            this.closePanel(id);\n        }\n    }\n});\n\n/***/ }),\n/* 929 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar jQuery = __webpack_require__(9);\n\n/*!\n * jQuery UI Position 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n(function( $, undefined ) {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: isWindow ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t// force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t// clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t// normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t// if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !$.support.offsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem : elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t// adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t// element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t// element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t// element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t// too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t// element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t// element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t// element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t// too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n// fraction support test\n(function () {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\t$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n}( jQuery ) );\n\n\n/***/ }),\n/* 930 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar jQuery = __webpack_require__(9);\n__webpack_require__(931);\n__webpack_require__(932);\n__webpack_require__(517);\n\n/*!\n * jQuery UI Sortable 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/sortable/\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.mouse.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nfunction isOverAxis( x, reference, size ) {\n\treturn ( x > reference ) && ( x < ( reference + size ) );\n}\n\nfunction isFloating(item) {\n\treturn (/left|right/).test(item.css(\"float\")) || (/inline|table-cell/).test(item.css(\"display\"));\n}\n\n$.widget(\"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.10.4\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\t_create: function() {\n\n\t\tvar o = this.options;\n\t\tthis.containerCache = {};\n\t\tthis.element.addClass(\"ui-sortable\");\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine if the items are being displayed horizontally\n\t\tthis.floating = this.items.length ? o.axis === \"x\" || isFloating(this.items[0].item) : false;\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass(\"ui-sortable ui-sortable-disabled\");\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function(key, value){\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.options[ key ] = value;\n\n\t\t\tthis.widget().toggleClass( \"ui-sortable-disabled\", !!value );\n\t\t} else {\n\t\t\t// Don't call widget base _setOption for disable as it adds ui-state-disabled class\n\t\t\t$.Widget.prototype._setOption.apply(this, arguments);\n\t\t}\n\t},\n\n\t_mouseCapture: function(event, overrideHandle) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif (this.reverting) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.options.disabled || this.options.type === \"static\") {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems(event);\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$(event.target).parents().each(function() {\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\n\t\t\t\tcurrentItem = $(this);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\n\t\t\tcurrentItem = $(event.target);\n\t\t}\n\n\t\tif(!currentItem) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.options.handle && !overrideHandle) {\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\n\t\t\t\tif(this === event.target) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!validHandle) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event, overrideHandle, noActivation) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css(\"position\", \"absolute\");\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\n\n\t\t//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif(o.opacity) { // opacity option\n\t\t\tif (this.helper.css(\"opacity\")) {\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\n\t\t\t}\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\n\t\t}\n\n\t\tif(o.zIndex) { // zIndex option\n\t\t\tif (this.helper.css(\"zIndex\")) {\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\n\t\t\t}\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"start\", event, this._uiHash());\n\n\t\t//Recache the helper size\n\t\tif(!this._preserveHelperProportions) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\n\t\tthis._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function(event) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\tif (!this.lastPositionAbs) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif(this.options.scroll) {\n\t\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t\tif(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Set the helper position\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[i];\n\t\t\titemElement = item.item[0];\n\t\t\tintersection = this._intersectsWithPointer(item);\n\t\t\tif (!intersection) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter beetween the outer and inner container.\n\t\t\tif (item.instance !== this.currentContainer) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif (itemElement !== this.currentItem[0] &&\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\n\t\t\t\t\tthis._rearrange(event, item);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers(event);\n\n\t\t//Interconnect with droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"sort\", event, this._uiHash());\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function(event, noPropagation) {\n\n\t\tif(!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\t$.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\tif(this.options.revert) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\n\t\t\t\tthat._clear(event);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._clear(event, noPropagation);\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.dragging) {\n\n\t\t\tthis._mouseUp({ target: null });\n\n\t\t\tif(this.options.helper === \"original\") {\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (this.placeholder) {\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\t\tif(this.placeholder[0].parentNode) {\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\t\t\t}\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend(this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t});\n\n\t\t\tif(this.domPosition.prev) {\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\n\t\t\t} else {\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$(items).each(function() {\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (/(.+)[\\-=_](.+)/));\n\t\t\tif (res) {\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\n\t\t\t}\n\t\t});\n\n\t\tif(!str.length && o.key) {\n\t\t\tstr.push(o.key + \"=\");\n\t\t}\n\n\t\treturn str.join(\"&\");\n\n\t},\n\n\ttoArray: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function(item) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn (l < x1 + (this.helperProportions.width / 2) && // Right Half\n\t\t\t\tx2 - (this.helperProportions.width / 2) < r && // Left Half\n\t\t\t\tt < y1 + (this.helperProportions.height / 2) && // Bottom Half\n\t\t\t\ty2 - (this.helperProportions.height / 2) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function(item) {\n\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (!isOverElement) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.floating ?\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\n\n\t},\n\n\t_intersectsWithSides: function(item) {\n\n\t\tvar isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),\n\t\t\tisOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (this.floating && horizontalDirection) {\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\n\t\t} else {\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\n\t},\n\n\trefresh: function(event) {\n\t\tthis._refreshItems(event);\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function(connected) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && connected) {\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor (i = queries.length - 1; i >= 0; i--){\n\t\t\tqueries[i][0].each( addItems );\n\t\t}\n\n\t\treturn $(items);\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\n\n\t\tthis.items = $.grep(this.items, function (item) {\n\t\t\tfor (var j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === item.item[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t},\n\n\t_refreshItems: function(event) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [this];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\n\t\t\t\t\t\tthis.containers.push(inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\n\t\t\ttargetData = queries[i][1];\n\t\t\t_queries = queries[i][0];\n\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\n\t\t\t\titem = $(_queries[j]);\n\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); // Data for target checking (mouse manager)\n\n\t\t\t\titems.push({\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function(fast) {\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change\n\t\tif(this.offsetParent && this.helper) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\n\t\t\titem = this.items[i];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\n\n\t\t\tif (!fast) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\n\t\t\tthis.options.custom.refreshContainers.call(this);\n\t\t} else {\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tp = this.containers[i].element.offset();\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\n\t\t\t\tthis.containers[i].containerCache.width\t= this.containers[i].element.outerWidth();\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function(that) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[0] )\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\n\n\t\t\t\t\tif ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat.currentItem.children().each(function() {\n\t\t\t\t\t\t\t$( \"<td>&#160;</td>\", that.document[0] )\n\t\t\t\t\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t\t\t\t\t.appendTo( element );\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function(container, p) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after(that.placeholder);\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update(that, that.placeholder);\n\n\t},\n\n\t_contactContainers: function(event) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// get innermost container that intersects with item\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\n\n\t\t\t// never consider a container that's located within the item itself\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\n\n\t\t\t\t// if we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[i];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// if no intersecting containers found, return\n\t\tif(!innermostContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// move the item into the container if it's not there already\n\t\tif(this.containers.length === 1) {\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t//When entering a new container, we will find the item with the least distance and append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || isFloating(this.currentItem);\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\tbase = this.positionAbs[posProperty] + this.offset.click[posProperty];\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t\tcur += this.items[j][sizeProperty];\n\t\t\t\t}\n\n\t\t\t\tif(Math.abs(cur - base) < dist) {\n\t\t\t\t\tdist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\n\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t}\n\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\n\t\t}\n\n\t\tif(helper[0] === this.currentItem[0]) {\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\n\t\t}\n\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\n\t\t\thelper.width(this.currentItem.width());\n\t\t}\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\n\t\t\thelper.height(this.currentItem.height());\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this information\n\t\t// with an ugly IE fix\n\t\tif( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$(o.containment === \"document\" ? document : window).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t($(o.containment === \"document\" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(/^(document|window|parent)$/).test(o.containment)) {\n\t\t\tce = $(o.containment)[0];\n\t\t\tco = $(o.containment).offset();\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif(this.containment) {\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function(event, i, a, hardRefresh) {\n\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay(function() {\n\t\t\tif(counter === this.counter) {\n\t\t\t\tthis.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_clear: function(event, noPropagation) {\n\n\t\tthis.reverting = false;\n\t\t// We delay all events that have to be triggered to after the point where the placeholder has been removed and\n\t\t// everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\n\t\t\tthis.placeholder.before(this.currentItem);\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif(this.helper[0] === this.currentItem[0]) {\n\t\t\tfor(i in this._storedCSS) {\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\n\t\t\t\t\tthis._storedCSS[i] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif(this.fromOutside && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\n\t\t}\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif (this !== this.currentContainer) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); };  }).call(this, this.currentContainer));\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this));  }; }).call(this, this.currentContainer));\n\t\t\t}\n\t\t}\n\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\tif (!noPropagation) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif(this._storedOpacity) {\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\n\t\t}\n\t\tif(this._storedZIndex) {\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tif(this.cancelHelperRemoval) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t\t} //Trigger all delayed events\n\t\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t\t}\n\n\t\t\tthis.fromOutside = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tif(!noPropagation) {\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\n\t\tif(!noPropagation) {\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t} //Trigger all delayed events\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn true;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function(_inst) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $([]),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n});\n\n})(jQuery);\n\n\n/***/ }),\n/* 931 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar jQuery = __webpack_require__(9);\n\n/*!\n * jQuery UI Core 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\truniqueId = /^ui-id-\\d+$/;\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.10.4\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tNUMPAD_ADD: 107,\n\t\tNUMPAD_DECIMAL: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_SUBTRACT: 109,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.ui.ie && (/(static|relative)/).test(this.css(\"position\"))) || (/absolute/).test(this.css(\"position\"))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(relative|absolute|fixed)/).test($.css(this,\"position\")) && (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn (/fixed/).test(this.css(\"position\")) || !scrollParent.length ? $(document) : scrollParent;\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t},\n\n\tuniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.id ) {\n\t\t\t\tthis.id = \"ui-id-\" + (++uuid);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( runiqueId.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /input|select|textarea|button|object/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n\n\n\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.support.selectstart = \"onselectstart\" in document.createElement( \"div\" );\n$.fn.extend({\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t}\n});\n\n$.extend( $.ui, {\n\t// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n\tplugin: {\n\t\tadd: function( module, option, set ) {\n\t\t\tvar i,\n\t\t\t\tproto = $.ui[ module ].prototype;\n\t\t\tfor ( i in set ) {\n\t\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t\t}\n\t\t},\n\t\tcall: function( instance, name, args ) {\n\t\t\tvar i,\n\t\t\t\tset = instance.plugins[ name ];\n\t\t\tif ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// only used by resizable\n\thasScroll: function( el, a ) {\n\n\t\t//If overflow is hidden, the element might have extra content, but the user wants to hide it\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t}\n});\n\n})( jQuery );\n\n\n/***/ }),\n/* 932 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar jQuery = __webpack_require__(9);\n__webpack_require__(517);\n\n/*!\n * jQuery UI Mouse 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/mouse/\n *\n * Depends:\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\n$.widget(\"ui.mouse\", {\n\tversion: \"1.10.4\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\"+this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\"+this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\"+this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\t$(document)\n\t\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif( mouseHandled ) { return; }\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\t\t$(document)\n\t\t\t.bind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.bind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\treturn this._mouseUp(event);\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t$(document)\n\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(/* event */) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(/* event */) {},\n\t_mouseDrag: function(/* event */) {},\n\t_mouseStop: function(/* event */) {},\n\t_mouseCapture: function(/* event */) { return true; }\n});\n\n})(jQuery);\n\n\n/***/ }),\n/* 933 */\n/***/ (function(module, exports) {\n\n/*! \n * jquery.event.drag - v 2.2\n * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com\n * Open Source MIT License - http://threedubmedia.com/code/license\n */\n// Created: 2008-06-04 \n// Updated: 2012-05-21\n// REQUIRES: jquery 1.7.x\n\n;(function( $ ){\n\n// add the jquery instance method\n$.fn.drag = function( str, arg, opts ){\n\t// figure out the event type\n\tvar type = typeof str == \"string\" ? str : \"\",\n\t// figure out the event handler...\n\tfn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null;\n\t// fix the event type\n\tif ( type.indexOf(\"drag\") !== 0 ) \n\t\ttype = \"drag\"+ type;\n\t// were options passed\n\topts = ( str == fn ? arg : opts ) || {};\n\t// trigger or bind event handler\n\treturn fn ? this.bind( type, opts, fn ) : this.trigger( type );\n};\n\n// local refs (increase compression)\nvar $event = $.event, \n$special = $event.special,\n// configure the drag special event \ndrag = $special.drag = {\n\t\n\t// these are the default settings\n\tdefaults: {\n\t\twhich: 1, // mouse button pressed to start drag sequence\n\t\tdistance: 0, // distance dragged before dragstart\n\t\tnot: ':input', // selector to suppress dragging on target elements\n\t\thandle: null, // selector to match handle target elements\n\t\trelative: false, // true to use \"position\", false to use \"offset\"\n\t\tdrop: true, // false to suppress drop events, true or selector to allow\n\t\tclick: false // false to suppress click events after dragend (no proxy)\n\t},\n\t\n\t// the key name for stored drag data\n\tdatakey: \"dragdata\",\n\t\n\t// prevent bubbling for better performance\n\tnoBubble: true,\n\t\n\t// count bound related events\n\tadd: function( obj ){ \n\t\t// read the interaction data\n\t\tvar data = $.data( this, drag.datakey ),\n\t\t// read any passed options \n\t\topts = obj.data || {};\n\t\t// count another realted event\n\t\tdata.related += 1;\n\t\t// extend data options bound with this event\n\t\t// don't iterate \"opts\" in case it is a node \n\t\t$.each( drag.defaults, function( key, def ){\n\t\t\tif ( opts[ key ] !== undefined )\n\t\t\t\tdata[ key ] = opts[ key ];\n\t\t});\n\t},\n\t\n\t// forget unbound related events\n\tremove: function(){\n\t\t$.data( this, drag.datakey ).related -= 1;\n\t},\n\t\n\t// configure interaction, capture settings\n\tsetup: function(){\n\t\t// check for related events\n\t\tif ( $.data( this, drag.datakey ) ) \n\t\t\treturn;\n\t\t// initialize the drag data with copied defaults\n\t\tvar data = $.extend({ related:0 }, drag.defaults );\n\t\t// store the interaction data\n\t\t$.data( this, drag.datakey, data );\n\t\t// bind the mousedown event, which starts drag interactions\n\t\t$event.add( this, \"touchstart mousedown\", drag.init, data );\n\t\t// prevent image dragging in IE...\n\t\tif ( this.attachEvent ) \n\t\t\tthis.attachEvent(\"ondragstart\", drag.dontstart ); \n\t},\n\t\n\t// destroy configured interaction\n\tteardown: function(){\n\t\tvar data = $.data( this, drag.datakey ) || {};\n\t\t// check for related events\n\t\tif ( data.related ) \n\t\t\treturn;\n\t\t// remove the stored data\n\t\t$.removeData( this, drag.datakey );\n\t\t// remove the mousedown event\n\t\t$event.remove( this, \"touchstart mousedown\", drag.init );\n\t\t// enable text selection\n\t\tdrag.textselect( true ); \n\t\t// un-prevent image dragging in IE...\n\t\tif ( this.detachEvent ) \n\t\t\tthis.detachEvent(\"ondragstart\", drag.dontstart ); \n\t},\n\t\t\n\t// initialize the interaction\n\tinit: function( event ){ \n\t\t// sorry, only one touch at a time\n\t\tif ( drag.touched ) \n\t\t\treturn;\n\t\t// the drag/drop interaction data\n\t\tvar dd = event.data, results;\n\t\t// check the which directive\n\t\tif ( event.which != 0 && dd.which > 0 && event.which != dd.which ) \n\t\t\treturn; \n\t\t// check for suppressed selector\n\t\tif ( $( event.target ).is( dd.not ) ) \n\t\t\treturn;\n\t\t// check for handle selector\n\t\tif ( dd.handle && !$( event.target ).closest( dd.handle, event.currentTarget ).length ) \n\t\t\treturn;\n\n\t\tdrag.touched = event.type == 'touchstart' ? this : null;\n\t\tdd.propagates = 1;\n\t\tdd.mousedown = this;\n\t\tdd.interactions = [ drag.interaction( this, dd ) ];\n\t\tdd.target = event.target;\n\t\tdd.pageX = event.pageX;\n\t\tdd.pageY = event.pageY;\n\t\tdd.dragging = null;\n\t\t// handle draginit event... \n\t\tresults = drag.hijack( event, \"draginit\", dd );\n\t\t// early cancel\n\t\tif ( !dd.propagates )\n\t\t\treturn;\n\t\t// flatten the result set\n\t\tresults = drag.flatten( results );\n\t\t// insert new interaction elements\n\t\tif ( results && results.length ){\n\t\t\tdd.interactions = [];\n\t\t\t$.each( results, function(){\n\t\t\t\tdd.interactions.push( drag.interaction( this, dd ) );\n\t\t\t});\n\t\t}\n\t\t// remember how many interactions are propagating\n\t\tdd.propagates = dd.interactions.length;\n\t\t// locate and init the drop targets\n\t\tif ( dd.drop !== false && $special.drop ) \n\t\t\t$special.drop.handler( event, dd );\n\t\t// disable text selection\n\t\tdrag.textselect( false ); \n\t\t// bind additional events...\n\t\tif ( drag.touched )\n\t\t\t$event.add( drag.touched, \"touchmove touchend\", drag.handler, dd );\n\t\telse \n\t\t\t$event.add( document, \"mousemove mouseup\", drag.handler, dd );\n\t\t// helps prevent text selection or scrolling\n\t\tif ( !drag.touched || dd.live )\n\t\t\treturn false;\n\t},\t\n\t\n\t// returns an interaction object\n\tinteraction: function( elem, dd ){\n\t\tvar offset = $( elem )[ dd.relative ? \"position\" : \"offset\" ]() || { top:0, left:0 };\n\t\treturn {\n\t\t\tdrag: elem, \n\t\t\tcallback: new drag.callback(), \n\t\t\tdroppable: [],\n\t\t\toffset: offset\n\t\t};\n\t},\n\t\n\t// handle drag-releatd DOM events\n\thandler: function( event ){ \n\t\t// read the data before hijacking anything\n\t\tvar dd = event.data;\t\n\t\t// handle various events\n\t\tswitch ( event.type ){\n\t\t\t// mousemove, check distance, start dragging\n\t\t\tcase !dd.dragging && 'touchmove': \n\t\t\t\tevent.preventDefault();\n\t\t\tcase !dd.dragging && 'mousemove':\n\t\t\t\t//  drag tolerance, x≤ + y≤ = distance≤\n\t\t\t\tif ( Math.pow(  event.pageX-dd.pageX, 2 ) + Math.pow(  event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) ) \n\t\t\t\t\tbreak; // distance tolerance not reached\n\t\t\t\tevent.target = dd.target; // force target from \"mousedown\" event (fix distance issue)\n\t\t\t\tdrag.hijack( event, \"dragstart\", dd ); // trigger \"dragstart\"\n\t\t\t\tif ( dd.propagates ) // \"dragstart\" not rejected\n\t\t\t\t\tdd.dragging = true; // activate interaction\n\t\t\t// mousemove, dragging\n\t\t\tcase 'touchmove':\n\t\t\t\tevent.preventDefault();\n\t\t\tcase 'mousemove':\n\t\t\t\tif ( dd.dragging ){\n\t\t\t\t\t// trigger \"drag\"\t\t\n\t\t\t\t\tdrag.hijack( event, \"drag\", dd );\n\t\t\t\t\tif ( dd.propagates ){\n\t\t\t\t\t\t// manage drop events\n\t\t\t\t\t\tif ( dd.drop !== false && $special.drop )\n\t\t\t\t\t\t\t$special.drop.handler( event, dd ); // \"dropstart\", \"dropend\"\t\t\t\t\t\t\t\n\t\t\t\t\t\tbreak; // \"drag\" not rejected, stop\t\t\n\t\t\t\t\t}\n\t\t\t\t\tevent.type = \"mouseup\"; // helps \"drop\" handler behave\n\t\t\t\t}\n\t\t\t// mouseup, stop dragging\n\t\t\tcase 'touchend': \n\t\t\tcase 'mouseup': \n\t\t\tdefault:\n\t\t\t\tif ( drag.touched )\n\t\t\t\t\t$event.remove( drag.touched, \"touchmove touchend\", drag.handler ); // remove touch events\n\t\t\t\telse \n\t\t\t\t\t$event.remove( document, \"mousemove mouseup\", drag.handler ); // remove page events\t\n\t\t\t\tif ( dd.dragging ){\n\t\t\t\t\tif ( dd.drop !== false && $special.drop )\n\t\t\t\t\t\t$special.drop.handler( event, dd ); // \"drop\"\n\t\t\t\t\tdrag.hijack( event, \"dragend\", dd ); // trigger \"dragend\"\t\n\t\t\t\t}\n\t\t\t\tdrag.textselect( true ); // enable text selection\n\t\t\t\t// if suppressing click events...\n\t\t\t\tif ( dd.click === false && dd.dragging )\n\t\t\t\t\t$.data( dd.mousedown, \"suppress.click\", new Date().getTime() + 5 );\n\t\t\t\tdd.dragging = drag.touched = false; // deactivate element\t\n\t\t\t\tbreak;\n\t\t}\n\t},\n\t\t\n\t// re-use event object for custom events\n\thijack: function( event, type, dd, x, elem ){\n\t\t// not configured\n\t\tif ( !dd ) \n\t\t\treturn;\n\t\t// remember the original event and type\n\t\tvar orig = { event:event.originalEvent, type:event.type },\n\t\t// is the event drag related or drog related?\n\t\tmode = type.indexOf(\"drop\") ? \"drag\" : \"drop\",\n\t\t// iteration vars\n\t\tresult, i = x || 0, ia, $elems, callback,\n\t\tlen = !isNaN( x ) ? x : dd.interactions.length;\n\t\t// modify the event type\n\t\tevent.type = type;\n\t\t// remove the original event\n\t\tevent.originalEvent = null;\n\t\t// initialize the results\n\t\tdd.results = [];\n\t\t// handle each interacted element\n\t\tdo if ( ia = dd.interactions[ i ] ){\n\t\t\t// validate the interaction\n\t\t\tif ( type !== \"dragend\" && ia.cancelled )\n\t\t\t\tcontinue;\n\t\t\t// set the dragdrop properties on the event object\n\t\t\tcallback = drag.properties( event, dd, ia );\n\t\t\t// prepare for more results\n\t\t\tia.results = [];\n\t\t\t// handle each element\n\t\t\t$( elem || ia[ mode ] || dd.droppable ).each(function( p, subject ){\n\t\t\t\t// identify drag or drop targets individually\n\t\t\t\tcallback.target = subject;\n\t\t\t\t// force propagtion of the custom event\n\t\t\t\tevent.isPropagationStopped = function(){ return false; };\n\t\t\t\t// handle the event\t\n\t\t\t\tresult = subject ? $event.dispatch.call( subject, event, callback ) : null;\n\t\t\t\t// stop the drag interaction for this element\n\t\t\t\tif ( result === false ){\n\t\t\t\t\tif ( mode == \"drag\" ){\n\t\t\t\t\t\tia.cancelled = true;\n\t\t\t\t\t\tdd.propagates -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif ( type == \"drop\" ){\n\t\t\t\t\t\tia[ mode ][p] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// assign any dropinit elements\n\t\t\t\telse if ( type == \"dropinit\" )\n\t\t\t\t\tia.droppable.push( drag.element( result ) || subject );\n\t\t\t\t// accept a returned proxy element \n\t\t\t\tif ( type == \"dragstart\" )\n\t\t\t\t\tia.proxy = $( drag.element( result ) || ia.drag )[0];\n\t\t\t\t// remember this result\t\n\t\t\t\tia.results.push( result );\n\t\t\t\t// forget the event result, for recycling\n\t\t\t\tdelete event.result;\n\t\t\t\t// break on cancelled handler\n\t\t\t\tif ( type !== \"dropinit\" )\n\t\t\t\t\treturn result;\n\t\t\t});\t\n\t\t\t// flatten the results\t\n\t\t\tdd.results[ i ] = drag.flatten( ia.results );\t\n\t\t\t// accept a set of valid drop targets\n\t\t\tif ( type == \"dropinit\" )\n\t\t\t\tia.droppable = drag.flatten( ia.droppable );\n\t\t\t// locate drop targets\n\t\t\tif ( type == \"dragstart\" && !ia.cancelled )\n\t\t\t\tcallback.update(); \n\t\t}\n\t\twhile ( ++i < len )\n\t\t// restore the original event & type\n\t\tevent.type = orig.type;\n\t\tevent.originalEvent = orig.event;\n\t\t// return all handler results\n\t\treturn drag.flatten( dd.results );\n\t},\n\t\t\n\t// extend the callback object with drag/drop properties...\n\tproperties: function( event, dd, ia ){\t\t\n\t\tvar obj = ia.callback;\n\t\t// elements\n\t\tobj.drag = ia.drag;\n\t\tobj.proxy = ia.proxy || ia.drag;\n\t\t// starting mouse position\n\t\tobj.startX = dd.pageX;\n\t\tobj.startY = dd.pageY;\n\t\t// current distance dragged\n\t\tobj.deltaX = event.pageX - dd.pageX;\n\t\tobj.deltaY = event.pageY - dd.pageY;\n\t\t// original element position\n\t\tobj.originalX = ia.offset.left;\n\t\tobj.originalY = ia.offset.top;\n\t\t// adjusted element position\n\t\tobj.offsetX = obj.originalX + obj.deltaX; \n\t\tobj.offsetY = obj.originalY + obj.deltaY;\n\t\t// assign the drop targets information\n\t\tobj.drop = drag.flatten( ( ia.drop || [] ).slice() );\n\t\tobj.available = drag.flatten( ( ia.droppable || [] ).slice() );\n\t\treturn obj;\t\n\t},\n\t\n\t// determine is the argument is an element or jquery instance\n\telement: function( arg ){\n\t\tif ( arg && ( arg.jquery || arg.nodeType == 1 ) )\n\t\t\treturn arg;\n\t},\n\t\n\t// flatten nested jquery objects and arrays into a single dimension array\n\tflatten: function( arr ){\n\t\treturn $.map( arr, function( member ){\n\t\t\treturn member && member.jquery ? $.makeArray( member ) : \n\t\t\t\tmember && member.length ? drag.flatten( member ) : member;\n\t\t});\n\t},\n\t\n\t// toggles text selection attributes ON (true) or OFF (false)\n\ttextselect: function( bool ){ \n\t\t$( document )[ bool ? \"unbind\" : \"bind\" ](\"selectstart\", drag.dontstart )\n\t\t\t.css(\"MozUserSelect\", bool ? \"\" : \"none\" );\n\t\t// .attr(\"unselectable\", bool ? \"off\" : \"on\" )\n\t\tdocument.unselectable = bool ? \"off\" : \"on\"; \n\t},\n\t\n\t// suppress \"selectstart\" and \"ondragstart\" events\n\tdontstart: function(){ \n\t\treturn false; \n\t},\n\t\n\t// a callback instance contructor\n\tcallback: function(){}\n\t\n};\n\n// callback methods\ndrag.callback.prototype = {\n\tupdate: function(){\n\t\tif ( $special.drop && this.available.length )\n\t\t\t$.each( this.available, function( i ){\n\t\t\t\t$special.drop.locate( this, i );\n\t\t\t});\n\t}\n};\n\n// patch $.event.$dispatch to allow suppressing clicks\nvar $dispatch = $event.dispatch;\n$event.dispatch = function( event ){\n\tif ( $.data( this, \"suppress.\"+ event.type ) - new Date().getTime() > 0 ){\n\t\t$.removeData( this, \"suppress.\"+ event.type );\n\t\treturn;\n\t}\n\treturn $dispatch.apply( this, arguments );\n};\n\n// event fix hooks for touch events...\nvar touchHooks = \n$event.fixHooks.touchstart = \n$event.fixHooks.touchmove = \n$event.fixHooks.touchend =\n$event.fixHooks.touchcancel = {\n\tprops: \"clientX clientY pageX pageY screenX screenY\".split( \" \" ),\n\tfilter: function( event, orig ) {\n\t\tif ( orig ){\n\t\t\tvar touched = ( orig.touches && orig.touches[0] )\n\t\t\t\t|| ( orig.changedTouches && orig.changedTouches[0] )\n\t\t\t\t|| null; \n\t\t\t// iOS webkit: touchstart, touchmove, touchend\n\t\t\tif ( touched ) \n\t\t\t\t$.each( touchHooks.props, function( i, prop ){\n\t\t\t\t\tevent[ prop ] = touched[ prop ];\n\t\t\t\t});\n\t\t}\n\t\treturn event;\n\t}\n};\n\n// share the same special event configuration with related events...\n$special.draginit = $special.dragstart = $special.dragend = drag;\n\n})( jQuery );\n\n/***/ }),\n/* 934 */\n/***/ (function(module, exports) {\n\n/***\n * Contains core SlickGrid classes.\n * @module Core\n * @namespace Slick\n */\n\n(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"Event\": Event,\n      \"EventData\": EventData,\n      \"EventHandler\": EventHandler,\n      \"Range\": Range,\n      \"NonDataRow\": NonDataItem,\n      \"Group\": Group,\n      \"GroupTotals\": GroupTotals,\n      \"EditorLock\": EditorLock,\n\n      /***\n       * A global singleton editor lock.\n       * @class GlobalEditorLock\n       * @static\n       * @constructor\n       */\n      \"GlobalEditorLock\": new EditorLock()\n    }\n  });\n\n  /***\n   * An event object for passing data to event handlers and letting them control propagation.\n   * <p>This is pretty much identical to how W3C and jQuery implement events.</p>\n   * @class EventData\n   * @constructor\n   */\n  function EventData() {\n    var isPropagationStopped = false;\n    var isImmediatePropagationStopped = false;\n\n    /***\n     * Stops event from propagating up the DOM tree.\n     * @method stopPropagation\n     */\n    this.stopPropagation = function () {\n      isPropagationStopped = true;\n    };\n\n    /***\n     * Returns whether stopPropagation was called on this event object.\n     * @method isPropagationStopped\n     * @return {Boolean}\n     */\n    this.isPropagationStopped = function () {\n      return isPropagationStopped;\n    };\n\n    /***\n     * Prevents the rest of the handlers from being executed.\n     * @method stopImmediatePropagation\n     */\n    this.stopImmediatePropagation = function () {\n      isImmediatePropagationStopped = true;\n    };\n\n    /***\n     * Returns whether stopImmediatePropagation was called on this event object.\\\n     * @method isImmediatePropagationStopped\n     * @return {Boolean}\n     */\n    this.isImmediatePropagationStopped = function () {\n      return isImmediatePropagationStopped;\n    }\n  }\n\n  /***\n   * A simple publisher-subscriber implementation.\n   * @class Event\n   * @constructor\n   */\n  function Event() {\n    var handlers = [];\n\n    /***\n     * Adds an event handler to be called when the event is fired.\n     * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>\n     * object the event was fired with.<p>\n     * @method subscribe\n     * @param fn {Function} Event handler.\n     */\n    this.subscribe = function (fn) {\n      handlers.push(fn);\n    };\n\n    /***\n     * Removes an event handler added with <code>subscribe(fn)</code>.\n     * @method unsubscribe\n     * @param fn {Function} Event handler to be removed.\n     */\n    this.unsubscribe = function (fn) {\n      for (var i = handlers.length - 1; i >= 0; i--) {\n        if (handlers[i] === fn) {\n          handlers.splice(i, 1);\n        }\n      }\n    };\n\n    /***\n     * Fires an event notifying all subscribers.\n     * @method notify\n     * @param args {Object} Additional data object to be passed to all handlers.\n     * @param e {EventData}\n     *      Optional.\n     *      An <code>EventData</code> object to be passed to all handlers.\n     *      For DOM events, an existing W3C/jQuery event object can be passed in.\n     * @param scope {Object}\n     *      Optional.\n     *      The scope (\"this\") within which the handler will be executed.\n     *      If not specified, the scope will be set to the <code>Event</code> instance.\n     */\n    this.notify = function (args, e, scope) {\n      e = e || new EventData();\n      scope = scope || this;\n\n      var returnValue;\n      for (var i = 0; i < handlers.length && !(e.isPropagationStopped() || e.isImmediatePropagationStopped()); i++) {\n        returnValue = handlers[i].call(scope, e, args);\n      }\n\n      return returnValue;\n    };\n  }\n\n  function EventHandler() {\n    var handlers = [];\n\n    this.subscribe = function (event, handler) {\n      handlers.push({\n        event: event,\n        handler: handler\n      });\n      event.subscribe(handler);\n\n      return this;  // allow chaining\n    };\n\n    this.unsubscribe = function (event, handler) {\n      var i = handlers.length;\n      while (i--) {\n        if (handlers[i].event === event &&\n            handlers[i].handler === handler) {\n          handlers.splice(i, 1);\n          event.unsubscribe(handler);\n          return;\n        }\n      }\n\n      return this;  // allow chaining\n    };\n\n    this.unsubscribeAll = function () {\n      var i = handlers.length;\n      while (i--) {\n        handlers[i].event.unsubscribe(handlers[i].handler);\n      }\n      handlers = [];\n\n      return this;  // allow chaining\n    }\n  }\n\n  /***\n   * A structure containing a range of cells.\n   * @class Range\n   * @constructor\n   * @param fromRow {Integer} Starting row.\n   * @param fromCell {Integer} Starting cell.\n   * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.\n   * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.\n   */\n  function Range(fromRow, fromCell, toRow, toCell) {\n    if (toRow === undefined && toCell === undefined) {\n      toRow = fromRow;\n      toCell = fromCell;\n    }\n\n    /***\n     * @property fromRow\n     * @type {Integer}\n     */\n    this.fromRow = Math.min(fromRow, toRow);\n\n    /***\n     * @property fromCell\n     * @type {Integer}\n     */\n    this.fromCell = Math.min(fromCell, toCell);\n\n    /***\n     * @property toRow\n     * @type {Integer}\n     */\n    this.toRow = Math.max(fromRow, toRow);\n\n    /***\n     * @property toCell\n     * @type {Integer}\n     */\n    this.toCell = Math.max(fromCell, toCell);\n\n    /***\n     * Returns whether a range represents a single row.\n     * @method isSingleRow\n     * @return {Boolean}\n     */\n    this.isSingleRow = function () {\n      return this.fromRow == this.toRow;\n    };\n\n    /***\n     * Returns whether a range represents a single cell.\n     * @method isSingleCell\n     * @return {Boolean}\n     */\n    this.isSingleCell = function () {\n      return this.fromRow == this.toRow && this.fromCell == this.toCell;\n    };\n\n    /***\n     * Returns whether a range contains a given cell.\n     * @method contains\n     * @param row {Integer}\n     * @param cell {Integer}\n     * @return {Boolean}\n     */\n    this.contains = function (row, cell) {\n      return row >= this.fromRow && row <= this.toRow &&\n          cell >= this.fromCell && cell <= this.toCell;\n    };\n\n    /***\n     * Returns a readable representation of a range.\n     * @method toString\n     * @return {String}\n     */\n    this.toString = function () {\n      if (this.isSingleCell()) {\n        return \"(\" + this.fromRow + \":\" + this.fromCell + \")\";\n      }\n      else {\n        return \"(\" + this.fromRow + \":\" + this.fromCell + \" - \" + this.toRow + \":\" + this.toCell + \")\";\n      }\n    }\n  }\n\n\n  /***\n   * A base class that all special / non-data rows (like Group and GroupTotals) derive from.\n   * @class NonDataItem\n   * @constructor\n   */\n  function NonDataItem() {\n    this.__nonDataRow = true;\n  }\n\n\n  /***\n   * Information about a group of rows.\n   * @class Group\n   * @extends Slick.NonDataItem\n   * @constructor\n   */\n  function Group() {\n    this.__group = true;\n\n    /**\n     * Grouping level, starting with 0.\n     * @property level\n     * @type {Number}\n     */\n    this.level = 0;\n\n    /***\n     * Number of rows in the group.\n     * @property count\n     * @type {Integer}\n     */\n    this.count = 0;\n\n    /***\n     * Grouping value.\n     * @property value\n     * @type {Object}\n     */\n    this.value = null;\n\n    /***\n     * Formatted display value of the group.\n     * @property title\n     * @type {String}\n     */\n    this.title = null;\n\n    /***\n     * Whether a group is collapsed.\n     * @property collapsed\n     * @type {Boolean}\n     */\n    this.collapsed = false;\n\n    /***\n     * GroupTotals, if any.\n     * @property totals\n     * @type {GroupTotals}\n     */\n    this.totals = null;\n\n    /**\n     * Rows that are part of the group.\n     * @property rows\n     * @type {Array}\n     */\n    this.rows = [];\n\n    /**\n     * Sub-groups that are part of the group.\n     * @property groups\n     * @type {Array}\n     */\n    this.groups = null;\n\n    /**\n     * A unique key used to identify the group.  This key can be used in calls to DataView\n     * collapseGroup() or expandGroup().\n     * @property groupingKey\n     * @type {Object}\n     */\n    this.groupingKey = null;\n  }\n\n  Group.prototype = new NonDataItem();\n\n  /***\n   * Compares two Group instances.\n   * @method equals\n   * @return {Boolean}\n   * @param group {Group} Group instance to compare to.\n   */\n  Group.prototype.equals = function (group) {\n    return this.value === group.value &&\n        this.count === group.count &&\n        this.collapsed === group.collapsed &&\n        this.title === group.title;\n  };\n\n  /***\n   * Information about group totals.\n   * An instance of GroupTotals will be created for each totals row and passed to the aggregators\n   * so that they can store arbitrary data in it.  That data can later be accessed by group totals\n   * formatters during the display.\n   * @class GroupTotals\n   * @extends Slick.NonDataItem\n   * @constructor\n   */\n  function GroupTotals() {\n    this.__groupTotals = true;\n\n    /***\n     * Parent Group.\n     * @param group\n     * @type {Group}\n     */\n    this.group = null;\n\n    /***\n     * Whether the totals have been fully initialized / calculated.\n     * Will be set to false for lazy-calculated group totals.\n     * @param initialized\n     * @type {Boolean}\n     */\n    this.initialized = false;\n  }\n\n  GroupTotals.prototype = new NonDataItem();\n\n  /***\n   * A locking helper to track the active edit controller and ensure that only a single controller\n   * can be active at a time.  This prevents a whole class of state and validation synchronization\n   * issues.  An edit controller (such as SlickGrid) can query if an active edit is in progress\n   * and attempt a commit or cancel before proceeding.\n   * @class EditorLock\n   * @constructor\n   */\n  function EditorLock() {\n    var activeEditController = null;\n\n    /***\n     * Returns true if a specified edit controller is active (has the edit lock).\n     * If the parameter is not specified, returns true if any edit controller is active.\n     * @method isActive\n     * @param editController {EditController}\n     * @return {Boolean}\n     */\n    this.isActive = function (editController) {\n      return (editController ? activeEditController === editController : activeEditController !== null);\n    };\n\n    /***\n     * Sets the specified edit controller as the active edit controller (acquire edit lock).\n     * If another edit controller is already active, and exception will be thrown.\n     * @method activate\n     * @param editController {EditController} edit controller acquiring the lock\n     */\n    this.activate = function (editController) {\n      if (editController === activeEditController) { // already activated?\n        return;\n      }\n      if (activeEditController !== null) {\n        throw \"SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController\";\n      }\n      if (!editController.commitCurrentEdit) {\n        throw \"SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()\";\n      }\n      if (!editController.cancelCurrentEdit) {\n        throw \"SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()\";\n      }\n      activeEditController = editController;\n    };\n\n    /***\n     * Unsets the specified edit controller as the active edit controller (release edit lock).\n     * If the specified edit controller is not the active one, an exception will be thrown.\n     * @method deactivate\n     * @param editController {EditController} edit controller releasing the lock\n     */\n    this.deactivate = function (editController) {\n      if (activeEditController !== editController) {\n        throw \"SlickGrid.EditorLock.deactivate: specified editController is not the currently active one\";\n      }\n      activeEditController = null;\n    };\n\n    /***\n     * Attempts to commit the current edit by calling \"commitCurrentEdit\" method on the active edit\n     * controller and returns whether the commit attempt was successful (commit may fail due to validation\n     * errors, etc.).  Edit controller's \"commitCurrentEdit\" must return true if the commit has succeeded\n     * and false otherwise.  If no edit controller is active, returns true.\n     * @method commitCurrentEdit\n     * @return {Boolean}\n     */\n    this.commitCurrentEdit = function () {\n      return (activeEditController ? activeEditController.commitCurrentEdit() : true);\n    };\n\n    /***\n     * Attempts to cancel the current edit by calling \"cancelCurrentEdit\" method on the active edit\n     * controller and returns whether the edit was successfully cancelled.  If no edit controller is\n     * active, returns true.\n     * @method cancelCurrentEdit\n     * @return {Boolean}\n     */\n    this.cancelCurrentEdit = function cancelCurrentEdit() {\n      return (activeEditController ? activeEditController.cancelCurrentEdit() : true);\n    };\n  }\n})(jQuery);\n\n\n\n\n/***/ }),\n/* 935 */\n/***/ (function(module, exports) {\n\n/**\r\n * @license\r\n * (c) 2009-2013 Michael Leibman\r\n * michael{dot}leibman{at}gmail{dot}com\r\n * http://github.com/mleibman/slickgrid\r\n *\r\n * Distributed under MIT license.\r\n * All rights reserved.\r\n *\r\n * SlickGrid v2.2\r\n *\r\n * NOTES:\r\n *     Cell/row DOM manipulations are done directly bypassing jQuery's DOM manipulation methods.\r\n *     This increases the speed dramatically, but can only be done safely because there are no event handlers\r\n *     or data associated with any cell/row DOM nodes.  Cell editors must make sure they implement .destroy()\r\n *     and do proper cleanup.\r\n */\r\n\r\n// make sure required JavaScript modules are loaded\r\nif (typeof jQuery === \"undefined\") {\r\n  throw \"SlickGrid requires jquery module to be loaded\";\r\n}\r\nif (!jQuery.fn.drag) {\r\n  throw \"SlickGrid requires jquery.event.drag module to be loaded\";\r\n}\r\nif (typeof Slick === \"undefined\") {\r\n  throw \"slick.core.js not loaded\";\r\n}\r\n\r\n\r\n(function ($) {\r\n  // Slick.Grid\r\n  $.extend(true, window, {\r\n    Slick: {\r\n      Grid: SlickGrid\r\n    }\r\n  });\r\n\r\n  // shared across all grids on the page\r\n  var scrollbarDimensions;\r\n  var maxSupportedCssHeight;  // browser's breaking point\r\n\r\n  //////////////////////////////////////////////////////////////////////////////////////////////\r\n  // SlickGrid class implementation (available as Slick.Grid)\r\n\r\n  /**\r\n   * Creates a new instance of the grid.\r\n   * @class SlickGrid\r\n   * @constructor\r\n   * @param {Node}              container   Container node to create the grid in.\r\n   * @param {Array,Object}      data        An array of objects for databinding.\r\n   * @param {Array}             columns     An array of column definitions.\r\n   * @param {Object}            options     Grid options.\r\n   **/\r\n  function SlickGrid(container, data, columns, options) {\r\n    // settings\r\n    var defaults = {\r\n      explicitInitialization: false,\r\n      rowHeight: 25,\r\n      defaultColumnWidth: 80,\r\n      enableAddRow: false,\r\n      leaveSpaceForNewRows: false,\r\n      editable: false,\r\n      autoEdit: true,\r\n      enableCellNavigation: true,\r\n      enableColumnReorder: true,\r\n      asyncEditorLoading: false,\r\n      asyncEditorLoadDelay: 100,\r\n      forceFitColumns: false,\r\n      enableAsyncPostRender: false,\r\n      asyncPostRenderDelay: 50,\r\n      autoHeight: false,\r\n      editorLock: Slick.GlobalEditorLock,\r\n      showHeaderRow: false,\r\n      headerRowHeight: 25,\r\n      showTopPanel: false,\r\n      topPanelHeight: 25,\r\n      formatterFactory: null,\r\n      editorFactory: null,\r\n      cellFlashingCssClass: \"flashing\",\r\n      selectedCellCssClass: \"selected\",\r\n      multiSelect: true,\r\n      enableTextSelectionOnCells: false,\r\n      dataItemColumnValueExtractor: null,\r\n      fullWidthRows: false,\r\n      multiColumnSort: false,\r\n      defaultFormatter: defaultFormatter,\r\n      forceSyncScrolling: false,\r\n      addNewRowCssClass: \"new-row\"\r\n    };\r\n\r\n    var columnDefaults = {\r\n      name: \"\",\r\n      resizable: true,\r\n      sortable: false,\r\n      minWidth: 30,\r\n      rerenderOnResize: false,\r\n      headerCssClass: null,\r\n      defaultSortAsc: true,\r\n      focusable: true,\r\n      selectable: true\r\n    };\r\n\r\n    // scroller\r\n    var th;   // virtual height\r\n    var h;    // real scrollable height\r\n    var ph;   // page height\r\n    var n;    // number of pages\r\n    var cj;   // \"jumpiness\" coefficient\r\n\r\n    var page = 0;       // current page\r\n    var offset = 0;     // current page offset\r\n    var vScrollDir = 1;\r\n\r\n    // private\r\n    var initialized = false;\r\n    var $container;\r\n    var uid = \"slickgrid_\" + Math.round(1000000 * Math.random());\r\n    var self = this;\r\n    var $focusSink, $focusSink2;\r\n    var $headerScroller;\r\n    var $headers;\r\n    var $headerRow, $headerRowScroller, $headerRowSpacer;\r\n    var $topPanelScroller;\r\n    var $topPanel;\r\n    var $viewport;\r\n    var $canvas;\r\n    var $style;\r\n    var $boundAncestors;\r\n    var stylesheet, columnCssRulesL, columnCssRulesR;\r\n    var viewportH, viewportW;\r\n    var canvasWidth;\r\n    var viewportHasHScroll, viewportHasVScroll;\r\n    var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding\r\n        cellWidthDiff = 0, cellHeightDiff = 0;\r\n    var absoluteColumnMinWidth;\r\n\r\n    var tabbingDirection = 1;\r\n    var activePosX;\r\n    var activeRow, activeCell;\r\n    var activeCellNode = null;\r\n    var currentEditor = null;\r\n    var serializedEditorValue;\r\n    var editController;\r\n\r\n    var rowsCache = {};\r\n    var renderedRows = 0;\r\n    var numVisibleRows;\r\n    var prevScrollTop = 0;\r\n    var scrollTop = 0;\r\n    var lastRenderedScrollTop = 0;\r\n    var lastRenderedScrollLeft = 0;\r\n    var prevScrollLeft = 0;\r\n    var scrollLeft = 0;\r\n\r\n    var selectionModel;\r\n    var selectedRows = [];\r\n\r\n    var plugins = [];\r\n    var cellCssClasses = {};\r\n\r\n    var columnsById = {};\r\n    var sortColumns = [];\r\n    var columnPosLeft = [];\r\n    var columnPosRight = [];\r\n\r\n\r\n    // async call handles\r\n    var h_editorLoader = null;\r\n    var h_render = null;\r\n    var h_postrender = null;\r\n    var postProcessedRows = {};\r\n    var postProcessToRow = null;\r\n    var postProcessFromRow = null;\r\n\r\n    // perf counters\r\n    var counter_rows_rendered = 0;\r\n    var counter_rows_removed = 0;\r\n\r\n    // These two variables work around a bug with inertial scrolling in Webkit/Blink on Mac.\r\n    // See http://crbug.com/312427.\r\n    var rowNodeFromLastMouseWheelEvent;  // this node must not be deleted while inertial scrolling\r\n    var zombieRowNodeFromLastMouseWheelEvent;  // node that was hidden instead of getting deleted\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Initialization\r\n\r\n    function init() {\r\n      $container = $(container);\r\n      if ($container.length < 1) {\r\n        throw new Error(\"SlickGrid requires a valid container, \" + container + \" does not exist in the DOM.\");\r\n      }\r\n\r\n      // calculate these only once and share between grid instances\r\n      maxSupportedCssHeight = maxSupportedCssHeight || getMaxSupportedCssHeight();\r\n      scrollbarDimensions = scrollbarDimensions || measureScrollbar();\r\n\r\n      options = $.extend({}, defaults, options);\r\n      validateAndEnforceOptions();\r\n      columnDefaults.width = options.defaultColumnWidth;\r\n\r\n      columnsById = {};\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);\r\n        columnsById[m.id] = i;\r\n        if (m.minWidth && m.width < m.minWidth) {\r\n          m.width = m.minWidth;\r\n        }\r\n        if (m.maxWidth && m.width > m.maxWidth) {\r\n          m.width = m.maxWidth;\r\n        }\r\n      }\r\n\r\n      // validate loaded JavaScript modules against requested options\r\n      if (options.enableColumnReorder && !$.fn.sortable) {\r\n        throw new Error(\"SlickGrid's 'enableColumnReorder = true' option requires jquery-ui.sortable module to be loaded\");\r\n      }\r\n\r\n      editController = {\r\n        \"commitCurrentEdit\": commitCurrentEdit,\r\n        \"cancelCurrentEdit\": cancelCurrentEdit\r\n      };\r\n\r\n      $container\r\n          .empty()\r\n          .css(\"overflow\", \"hidden\")\r\n          .css(\"outline\", 0)\r\n          .addClass(uid)\r\n          .addClass(\"ui-widget\");\r\n\r\n      // set up a positioning container if needed\r\n      if (!/relative|absolute|fixed/.test($container.css(\"position\"))) {\r\n        $container.css(\"position\", \"relative\");\r\n      }\r\n\r\n      $focusSink = $(\"<div tabIndex='0' hideFocus style='position:fixed;width:0;height:0;top:0;left:0;outline:0;'></div>\").appendTo($container);\r\n\r\n      $headerScroller = $(\"<div class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $headers = $(\"<div class='slick-header-columns' style='left:-1000px' />\").appendTo($headerScroller);\r\n      $headers.width(getHeadersWidth());\r\n\r\n      $headerRowScroller = $(\"<div class='slick-headerrow ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $headerRow = $(\"<div class='slick-headerrow-columns' />\").appendTo($headerRowScroller);\r\n      $headerRowSpacer = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n          .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n          .appendTo($headerRowScroller);\r\n\r\n      $topPanelScroller = $(\"<div class='slick-top-panel-scroller ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $topPanel = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScroller);\r\n\r\n      if (!options.showTopPanel) {\r\n        $topPanelScroller.hide();\r\n      }\r\n\r\n      if (!options.showHeaderRow) {\r\n        $headerRowScroller.hide();\r\n      }\r\n\r\n      $viewport = $(\"<div class='slick-viewport' style='width:100%;overflow:auto;outline:0;position:relative;;'>\").appendTo($container);\r\n      $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n\r\n      $canvas = $(\"<div class='grid-canvas' />\").appendTo($viewport);\r\n\r\n      $focusSink2 = $focusSink.clone().appendTo($container);\r\n\r\n      if (!options.explicitInitialization) {\r\n        finishInitialization();\r\n      }\r\n    }\r\n\r\n    function finishInitialization() {\r\n      if (!initialized) {\r\n        initialized = true;\r\n\r\n        viewportW = parseFloat($.css($container[0], \"width\", true));\r\n\r\n        // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)\r\n        // calculate the diff so we can set consistent sizes\r\n        measureCellPaddingAndBorder();\r\n\r\n        // for usability reasons, all text selection in SlickGrid is disabled\r\n        // with the exception of input and textarea elements (selection must\r\n        // be enabled there so that editors work as expected); note that\r\n        // selection in grid cells (grid body) is already unavailable in\r\n        // all browsers except IE\r\n        disableSelection($headers); // disable all text selection in header (including input and textarea)\r\n\r\n        if (!options.enableTextSelectionOnCells) {\r\n          // disable text selection in grid cells except in input and textarea elements\r\n          // (this is IE-specific, because selectstart event will only fire in IE)\r\n          $viewport.bind(\"selectstart.ui\", function (event) {\r\n            return $(event.target).is(\"input,textarea\");\r\n          });\r\n        }\r\n\r\n        updateColumnCaches();\r\n        createColumnHeaders();\r\n        setupColumnSort();\r\n        createCssRules();\r\n        resizeCanvas();\r\n        bindAncestorScrollEvents();\r\n\r\n        $container\r\n            .bind(\"resize.slickgrid\", resizeCanvas);\r\n        $viewport\r\n            //.bind(\"click\", handleClick)\r\n            .bind(\"scroll\", handleScroll);\r\n        $headerScroller\r\n            .bind(\"contextmenu\", handleHeaderContextMenu)\r\n            .bind(\"click\", handleHeaderClick)\r\n            .delegate(\".slick-header-column\", \"mouseenter\", handleHeaderMouseEnter)\r\n            .delegate(\".slick-header-column\", \"mouseleave\", handleHeaderMouseLeave);\r\n        $headerRowScroller\r\n            .bind(\"scroll\", handleHeaderRowScroll);\r\n        $focusSink.add($focusSink2)\r\n            .bind(\"keydown\", handleKeyDown);\r\n        $canvas\r\n            .bind(\"keydown\", handleKeyDown)\r\n            .bind(\"click\", handleClick)\r\n            .bind(\"dblclick\", handleDblClick)\r\n            .bind(\"contextmenu\", handleContextMenu)\r\n            .bind(\"draginit\", handleDragInit)\r\n            .bind(\"dragstart\", {distance: 3}, handleDragStart)\r\n            .bind(\"drag\", handleDrag)\r\n            .bind(\"dragend\", handleDragEnd)\r\n            .delegate(\".slick-cell\", \"mouseenter\", handleMouseEnter)\r\n            .delegate(\".slick-cell\", \"mouseleave\", handleMouseLeave);\r\n\r\n        // Work around http://crbug.com/312427.\r\n        if (navigator.userAgent.toLowerCase().match(/webkit/) &&\r\n            navigator.userAgent.toLowerCase().match(/macintosh/)) {\r\n          $canvas.bind(\"mousewheel\", handleMouseWheel);\r\n        }\r\n      }\r\n    }\r\n\r\n    function registerPlugin(plugin) {\r\n      plugins.unshift(plugin);\r\n      plugin.init(self);\r\n    }\r\n\r\n    function unregisterPlugin(plugin) {\r\n      for (var i = plugins.length; i >= 0; i--) {\r\n        if (plugins[i] === plugin) {\r\n          if (plugins[i].destroy) {\r\n            plugins[i].destroy();\r\n          }\r\n          plugins.splice(i, 1);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    function setSelectionModel(model) {\r\n      if (selectionModel) {\r\n        selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);\r\n        if (selectionModel.destroy) {\r\n          selectionModel.destroy();\r\n        }\r\n      }\r\n\r\n      selectionModel = model;\r\n      if (selectionModel) {\r\n        selectionModel.init(self);\r\n        selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);\r\n      }\r\n    }\r\n\r\n    function getSelectionModel() {\r\n      return selectionModel;\r\n    }\r\n\r\n    function getCanvasNode() {\r\n      return $canvas[0];\r\n    }\r\n\r\n    function measureScrollbar() {\r\n      var $c = $(\"<div style='position:absolute; top:-10000px; left:-10000px; width:100px; height:100px; overflow:scroll;'></div>\").appendTo(\"body\");\r\n      var dim = {\r\n        width: $c.width() - $c[0].clientWidth,\r\n        height: $c.height() - $c[0].clientHeight\r\n      };\r\n      $c.remove();\r\n      return dim;\r\n    }\r\n\r\n    function getHeadersWidth() {\r\n      var headersWidth = 0;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        var width = columns[i].width;\r\n        headersWidth += width;\r\n      }\r\n      headersWidth += scrollbarDimensions.width;\r\n      return Math.max(headersWidth, viewportW) + 1000;\r\n    }\r\n\r\n    function getCanvasWidth() {\r\n      var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n      var rowWidth = 0;\r\n      var i = columns.length;\r\n      while (i--) {\r\n        rowWidth += columns[i].width;\r\n      }\r\n      return options.fullWidthRows ? Math.max(rowWidth, availableWidth) : rowWidth;\r\n    }\r\n\r\n    function updateCanvasWidth(forceColumnWidthsUpdate) {\r\n      var oldCanvasWidth = canvasWidth;\r\n      canvasWidth = getCanvasWidth();\r\n\r\n      if (canvasWidth != oldCanvasWidth) {\r\n        $canvas.width(canvasWidth);\r\n        $headerRow.width(canvasWidth);\r\n        $headers.width(getHeadersWidth());\r\n        viewportHasHScroll = (canvasWidth > viewportW - scrollbarDimensions.width);\r\n      }\r\n\r\n      $headerRowSpacer.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n\r\n      if (canvasWidth != oldCanvasWidth || forceColumnWidthsUpdate) {\r\n        applyColumnWidths();\r\n      }\r\n    }\r\n\r\n    function disableSelection($target) {\r\n      if ($target && $target.jquery) {\r\n        $target\r\n            .attr(\"unselectable\", \"on\")\r\n            .css(\"MozUserSelect\", \"none\")\r\n            .bind(\"selectstart.ui\", function () {\r\n              return false;\r\n            }); // from jquery:ui.core.js 1.7.2\r\n      }\r\n    }\r\n\r\n    function getMaxSupportedCssHeight() {\r\n      var supportedHeight = 1000000;\r\n      // FF reports the height back but still renders blank after ~6M px\r\n      var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\r\n      var div = $(\"<div style='display:none' />\").appendTo(document.body);\r\n\r\n      while (true) {\r\n        var test = supportedHeight * 2;\r\n        div.css(\"height\", test);\r\n        if (test > testUpTo || div.height() !== test) {\r\n          break;\r\n        } else {\r\n          supportedHeight = test;\r\n        }\r\n      }\r\n\r\n      div.remove();\r\n      return supportedHeight;\r\n    }\r\n\r\n    // TODO:  this is static.  need to handle page mutation.\r\n    function bindAncestorScrollEvents() {\r\n      var elem = $canvas[0];\r\n      while ((elem = elem.parentNode) != document.body && elem != null) {\r\n        // bind to scroll containers only\r\n        if (elem == $viewport[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {\r\n          var $elem = $(elem);\r\n          if (!$boundAncestors) {\r\n            $boundAncestors = $elem;\r\n          } else {\r\n            $boundAncestors = $boundAncestors.add($elem);\r\n          }\r\n          $elem.bind(\"scroll.\" + uid, handleActiveCellPositionChange);\r\n        }\r\n      }\r\n    }\r\n\r\n    function unbindAncestorScrollEvents() {\r\n      if (!$boundAncestors) {\r\n        return;\r\n      }\r\n      $boundAncestors.unbind(\"scroll.\" + uid);\r\n      $boundAncestors = null;\r\n    }\r\n\r\n    function updateColumnHeader(columnId, title, toolTip) {\r\n      if (!initialized) { return; }\r\n      var idx = getColumnIndex(columnId);\r\n      if (idx == null) {\r\n        return;\r\n      }\r\n\r\n      var columnDef = columns[idx];\r\n      var $header = $headers.children().eq(idx);\r\n      if ($header) {\r\n        if (title !== undefined) {\r\n          columns[idx].name = title;\r\n        }\r\n        if (toolTip !== undefined) {\r\n          columns[idx].toolTip = toolTip;\r\n        }\r\n\r\n        trigger(self.onBeforeHeaderCellDestroy, {\r\n          \"node\": $header[0],\r\n          \"column\": columnDef\r\n        });\r\n\r\n        $header\r\n            .attr(\"title\", toolTip || \"\")\r\n            .children().eq(0).html(title);\r\n\r\n        trigger(self.onHeaderCellRendered, {\r\n          \"node\": $header[0],\r\n          \"column\": columnDef\r\n        });\r\n      }\r\n    }\r\n\r\n    function getHeaderRow() {\r\n      return $headerRow[0];\r\n    }\r\n\r\n    function getHeaderRowColumn(columnId) {\r\n      var idx = getColumnIndex(columnId);\r\n      var $header = $headerRow.children().eq(idx);\r\n      return $header && $header[0];\r\n    }\r\n\r\n    function createColumnHeaders() {\r\n      function onMouseEnter() {\r\n        $(this).addClass(\"ui-state-hover\");\r\n      }\r\n\r\n      function onMouseLeave() {\r\n        $(this).removeClass(\"ui-state-hover\");\r\n      }\r\n\r\n      $headers.find(\".slick-header-column\")\r\n        .each(function() {\r\n          var columnDef = $(this).data(\"column\");\r\n          if (columnDef) {\r\n            trigger(self.onBeforeHeaderCellDestroy, {\r\n              \"node\": this,\r\n              \"column\": columnDef\r\n            });\r\n          }\r\n        });\r\n      $headers.empty();\r\n      $headers.width(getHeadersWidth());\r\n\r\n      $headerRow.find(\".slick-headerrow-column\")\r\n        .each(function() {\r\n          var columnDef = $(this).data(\"column\");\r\n          if (columnDef) {\r\n            trigger(self.onBeforeHeaderRowCellDestroy, {\r\n              \"node\": this,\r\n              \"column\": columnDef\r\n            });\r\n          }\r\n        });\r\n      $headerRow.empty();\r\n\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i];\r\n\r\n        var header = $(\"<div class='ui-state-default slick-header-column' />\")\r\n            .html(\"<span class='slick-column-name'>\" + m.name + \"</span>\")\r\n            .width(m.width - headerColumnWidthDiff)\r\n            .attr(\"id\", \"\" + uid + m.id)\r\n            .attr(\"title\", m.toolTip || \"\")\r\n            .data(\"column\", m)\r\n            .addClass(m.headerCssClass || \"\")\r\n            .appendTo($headers);\r\n\r\n        if (options.enableColumnReorder || m.sortable) {\r\n          header\r\n            .on('mouseenter', onMouseEnter)\r\n            .on('mouseleave', onMouseLeave);\r\n        }\r\n\r\n        if (m.sortable) {\r\n          header.addClass(\"slick-header-sortable\");\r\n          header.append(\"<span class='slick-sort-indicator' />\");\r\n        }\r\n\r\n        trigger(self.onHeaderCellRendered, {\r\n          \"node\": header[0],\r\n          \"column\": m\r\n        });\r\n\r\n        if (options.showHeaderRow) {\r\n          var headerRowCell = $(\"<div class='ui-state-default slick-headerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n              .data(\"column\", m)\r\n              .appendTo($headerRow);\r\n\r\n          trigger(self.onHeaderRowCellRendered, {\r\n            \"node\": headerRowCell[0],\r\n            \"column\": m\r\n          });\r\n        }\r\n      }\r\n\r\n      setSortColumns(sortColumns);\r\n      setupColumnResize();\r\n      if (options.enableColumnReorder) {\r\n        setupColumnReorder();\r\n      }\r\n    }\r\n\r\n    function setupColumnSort() {\r\n      $headers.click(function (e) {\r\n        // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)\r\n        e.metaKey = e.metaKey || e.ctrlKey;\r\n\r\n        if ($(e.target).hasClass(\"slick-resizable-handle\")) {\r\n          return;\r\n        }\r\n\r\n        var $col = $(e.target).closest(\".slick-header-column\");\r\n        if (!$col.length) {\r\n          return;\r\n        }\r\n\r\n        var column = $col.data(\"column\");\r\n        if (column.sortable) {\r\n          if (!getEditorLock().commitCurrentEdit()) {\r\n            return;\r\n          }\r\n\r\n          var sortOpts = null;\r\n          var i = 0;\r\n          for (; i < sortColumns.length; i++) {\r\n            if (sortColumns[i].columnId == column.id) {\r\n              sortOpts = sortColumns[i];\r\n              sortOpts.sortAsc = !sortOpts.sortAsc;\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (e.metaKey && options.multiColumnSort) {\r\n            if (sortOpts) {\r\n              sortColumns.splice(i, 1);\r\n            }\r\n          }\r\n          else {\r\n            if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {\r\n              sortColumns = [];\r\n            }\r\n\r\n            if (!sortOpts) {\r\n              sortOpts = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n              sortColumns.push(sortOpts);\r\n            } else if (sortColumns.length == 0) {\r\n              sortColumns.push(sortOpts);\r\n            }\r\n          }\r\n\r\n          setSortColumns(sortColumns);\r\n\r\n          if (!options.multiColumnSort) {\r\n            trigger(self.onSort, {\r\n              multiColumnSort: false,\r\n              sortCol: column,\r\n              sortAsc: sortOpts.sortAsc}, e);\r\n          } else {\r\n            trigger(self.onSort, {\r\n              multiColumnSort: true,\r\n              sortCols: $.map(sortColumns, function(col) {\r\n                return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };\r\n              })}, e);\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    function setupColumnReorder() {\r\n      $headers.filter(\":ui-sortable\").sortable(\"destroy\");\r\n      $headers.sortable({\r\n        containment: \"parent\",\r\n        distance: 3,\r\n        axis: \"x\",\r\n        cursor: \"default\",\r\n        tolerance: \"intersection\",\r\n        helper: \"clone\",\r\n        placeholder: \"slick-sortable-placeholder ui-state-default slick-header-column\",\r\n        start: function (e, ui) {\r\n          ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);\r\n          $(ui.helper).addClass(\"slick-header-column-active\");\r\n        },\r\n        beforeStop: function (e, ui) {\r\n          $(ui.helper).removeClass(\"slick-header-column-active\");\r\n        },\r\n        stop: function (e) {\r\n          if (!getEditorLock().commitCurrentEdit()) {\r\n            $(this).sortable(\"cancel\");\r\n            return;\r\n          }\r\n\r\n          var reorderedIds = $headers.sortable(\"toArray\");\r\n          var reorderedColumns = [];\r\n          for (var i = 0; i < reorderedIds.length; i++) {\r\n            reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n          }\r\n          setColumns(reorderedColumns);\r\n\r\n          trigger(self.onColumnsReordered, {});\r\n          e.stopPropagation();\r\n          setupColumnResize();\r\n        }\r\n      });\r\n    }\r\n\r\n    function setupColumnResize() {\r\n      var $col, j, c, pageX, columnElements, minPageX, maxPageX, firstResizable, lastResizable;\r\n      columnElements = $headers.children();\r\n      columnElements.find(\".slick-resizable-handle\").remove();\r\n      columnElements.each(function (i, e) {\r\n        if (columns[i].resizable) {\r\n          if (firstResizable === undefined) {\r\n            firstResizable = i;\r\n          }\r\n          lastResizable = i;\r\n        }\r\n      });\r\n      if (firstResizable === undefined) {\r\n        return;\r\n      }\r\n      columnElements.each(function (i, e) {\r\n        if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {\r\n          return;\r\n        }\r\n        $col = $(e);\r\n        $(\"<div class='slick-resizable-handle' />\")\r\n            .appendTo(e)\r\n            .bind(\"dragstart\", function (e, dd) {\r\n              if (!getEditorLock().commitCurrentEdit()) {\r\n                return false;\r\n              }\r\n              pageX = e.pageX;\r\n              $(this).parent().addClass(\"slick-header-column-active\");\r\n              var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n              // lock each column's width option to current width\r\n              columnElements.each(function (i, e) {\r\n                columns[i].previousWidth = $(e).outerWidth();\r\n              });\r\n              if (options.forceFitColumns) {\r\n                shrinkLeewayOnRight = 0;\r\n                stretchLeewayOnRight = 0;\r\n                // colums on right affect maxPageX/minPageX\r\n                for (j = i + 1; j < columnElements.length; j++) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    if (stretchLeewayOnRight !== null) {\r\n                      if (c.maxWidth) {\r\n                        stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n                      } else {\r\n                        stretchLeewayOnRight = null;\r\n                      }\r\n                    }\r\n                    shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                  }\r\n                }\r\n              }\r\n              var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n              for (j = 0; j <= i; j++) {\r\n                // columns on left only affect minPageX\r\n                c = columns[j];\r\n                if (c.resizable) {\r\n                  if (stretchLeewayOnLeft !== null) {\r\n                    if (c.maxWidth) {\r\n                      stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n                    } else {\r\n                      stretchLeewayOnLeft = null;\r\n                    }\r\n                  }\r\n                  shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                }\r\n              }\r\n              if (shrinkLeewayOnRight === null) {\r\n                shrinkLeewayOnRight = 100000;\r\n              }\r\n              if (shrinkLeewayOnLeft === null) {\r\n                shrinkLeewayOnLeft = 100000;\r\n              }\r\n              if (stretchLeewayOnRight === null) {\r\n                stretchLeewayOnRight = 100000;\r\n              }\r\n              if (stretchLeewayOnLeft === null) {\r\n                stretchLeewayOnLeft = 100000;\r\n              }\r\n              maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n              minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n            })\r\n            .bind(\"drag\", function (e, dd) {\r\n              var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;\r\n              if (d < 0) { // shrink column\r\n                x = d;\r\n                for (j = i; j >= 0; j--) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                    if (x && c.previousWidth + x < actualMinWidth) {\r\n                      x += c.previousWidth - actualMinWidth;\r\n                      c.width = actualMinWidth;\r\n                    } else {\r\n                      c.width = c.previousWidth + x;\r\n                      x = 0;\r\n                    }\r\n                  }\r\n                }\r\n\r\n                if (options.forceFitColumns) {\r\n                  x = -d;\r\n                  for (j = i + 1; j < columnElements.length; j++) {\r\n                    c = columns[j];\r\n                    if (c.resizable) {\r\n                      if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n                        x -= c.maxWidth - c.previousWidth;\r\n                        c.width = c.maxWidth;\r\n                      } else {\r\n                        c.width = c.previousWidth + x;\r\n                        x = 0;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              } else { // stretch column\r\n                x = d;\r\n                for (j = i; j >= 0; j--) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n                      x -= c.maxWidth - c.previousWidth;\r\n                      c.width = c.maxWidth;\r\n                    } else {\r\n                      c.width = c.previousWidth + x;\r\n                      x = 0;\r\n                    }\r\n                  }\r\n                }\r\n\r\n                if (options.forceFitColumns) {\r\n                  x = -d;\r\n                  for (j = i + 1; j < columnElements.length; j++) {\r\n                    c = columns[j];\r\n                    if (c.resizable) {\r\n                      actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                      if (x && c.previousWidth + x < actualMinWidth) {\r\n                        x += c.previousWidth - actualMinWidth;\r\n                        c.width = actualMinWidth;\r\n                      } else {\r\n                        c.width = c.previousWidth + x;\r\n                        x = 0;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              applyColumnHeaderWidths();\r\n              if (options.syncColumnCellResize) {\r\n                applyColumnWidths();\r\n              }\r\n            })\r\n            .bind(\"dragend\", function (e, dd) {\r\n              var newWidth;\r\n              $(this).parent().removeClass(\"slick-header-column-active\");\r\n              for (j = 0; j < columnElements.length; j++) {\r\n                c = columns[j];\r\n                newWidth = $(columnElements[j]).outerWidth();\r\n\r\n                if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n                  invalidateAllRows();\r\n                }\r\n              }\r\n              updateCanvasWidth(true);\r\n              render();\r\n              trigger(self.onColumnsResized, {});\r\n            });\r\n      });\r\n    }\r\n\r\n    function getVBoxDelta($el) {\r\n      var p = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n      var delta = 0;\r\n      $.each(p, function (n, val) {\r\n        delta += parseFloat($el.css(val)) || 0;\r\n      });\r\n      return delta;\r\n    }\r\n\r\n    function measureCellPaddingAndBorder() {\r\n      var el;\r\n      var h = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\"];\r\n      var v = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n\r\n      el = $(\"<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>\").appendTo($headers);\r\n      headerColumnWidthDiff = headerColumnHeightDiff = 0;\r\n      if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n        $.each(h, function (n, val) {\r\n          headerColumnWidthDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n        $.each(v, function (n, val) {\r\n          headerColumnHeightDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n      }\r\n      el.remove();\r\n\r\n      var r = $(\"<div class='slick-row' />\").appendTo($canvas);\r\n      el = $(\"<div class='slick-cell' id='' style='visibility:hidden'>-</div>\").appendTo(r);\r\n      cellWidthDiff = cellHeightDiff = 0;\r\n      if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n        $.each(h, function (n, val) {\r\n          cellWidthDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n        $.each(v, function (n, val) {\r\n          cellHeightDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n      }\r\n      r.remove();\r\n\r\n      absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);\r\n    }\r\n\r\n    function createCssRules() {\r\n      $style = $(\"<style type='text/css' rel='stylesheet' />\").appendTo($(\"head\"));\r\n      var rowHeight = (options.rowHeight - cellHeightDiff);\r\n      var rules = [\r\n        \".\" + uid + \" .slick-header-column { left: 1000px; }\",\r\n        \".\" + uid + \" .slick-top-panel { height:\" + options.topPanelHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-headerrow-columns { height:\" + options.headerRowHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-cell { height:\" + rowHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-row { height:\" + options.rowHeight + \"px; }\"\r\n      ];\r\n\r\n      for (var i = 0; i < columns.length; i++) {\r\n        rules.push(\".\" + uid + \" .l\" + i + \" { }\");\r\n        rules.push(\".\" + uid + \" .r\" + i + \" { }\");\r\n      }\r\n\r\n      if ($style[0].styleSheet) { // IE\r\n        $style[0].styleSheet.cssText = rules.join(\" \");\r\n      } else {\r\n        $style[0].appendChild(document.createTextNode(rules.join(\" \")));\r\n      }\r\n    }\r\n\r\n    function getColumnCssRules(idx) {\r\n      if (!stylesheet) {\r\n        var sheets = document.styleSheets;\r\n        for (var i = 0; i < sheets.length; i++) {\r\n          if ((sheets[i].ownerNode || sheets[i].owningElement) == $style[0]) {\r\n            stylesheet = sheets[i];\r\n            break;\r\n          }\r\n        }\r\n\r\n        // Workaround a bug in chrome where document.styleSheets may not contain all sheets.\r\n        if (!stylesheet) {\r\n          stylesheet = $style[0] && ($style[0].sheet || $style[0].styleSheet);\r\n        }\r\n\r\n        if (!stylesheet) {\r\n          throw new Error(\"Cannot find stylesheet.\");\r\n        }\r\n\r\n        // find and cache column CSS rules\r\n        columnCssRulesL = [];\r\n        columnCssRulesR = [];\r\n        var cssRules = (stylesheet.cssRules || stylesheet.rules);\r\n        var matches, columnIdx;\r\n        for (var i = 0; i < cssRules.length; i++) {\r\n          var selector = cssRules[i].selectorText;\r\n          if (matches = /\\.l\\d+/.exec(selector)) {\r\n            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n            columnCssRulesL[columnIdx] = cssRules[i];\r\n          } else if (matches = /\\.r\\d+/.exec(selector)) {\r\n            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n            columnCssRulesR[columnIdx] = cssRules[i];\r\n          }\r\n        }\r\n      }\r\n\r\n      return {\r\n        \"left\": columnCssRulesL[idx],\r\n        \"right\": columnCssRulesR[idx]\r\n      };\r\n    }\r\n\r\n    function removeCssRules() {\r\n      $style.remove();\r\n      stylesheet = null;\r\n    }\r\n\r\n    function destroy() {\r\n      getEditorLock().cancelCurrentEdit();\r\n\r\n      trigger(self.onBeforeDestroy, {});\r\n\r\n      var i = plugins.length;\r\n      while(i--) {\r\n        unregisterPlugin(plugins[i]);\r\n      }\r\n\r\n      if (options.enableColumnReorder) {\r\n          $headers.filter(\":ui-sortable\").sortable(\"destroy\");\r\n      }\r\n\r\n      unbindAncestorScrollEvents();\r\n      $container.unbind(\".slickgrid\");\r\n      removeCssRules();\r\n\r\n      $canvas.unbind(\"draginit dragstart dragend drag\");\r\n      $container.empty().removeClass(uid);\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // General\r\n\r\n    function trigger(evt, args, e) {\r\n      e = e || new Slick.EventData();\r\n      args = args || {};\r\n      args.grid = self;\r\n      return evt.notify(args, e, self);\r\n    }\r\n\r\n    function getEditorLock() {\r\n      return options.editorLock;\r\n    }\r\n\r\n    function getEditController() {\r\n      return editController;\r\n    }\r\n\r\n    function getColumnIndex(id) {\r\n      return columnsById[id];\r\n    }\r\n\r\n    function autosizeColumns() {\r\n      var i, c,\r\n          widths = [],\r\n          shrinkLeeway = 0,\r\n          total = 0,\r\n          prevTotal,\r\n          availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n\r\n      for (i = 0; i < columns.length; i++) {\r\n        c = columns[i];\r\n        widths.push(c.width);\r\n        total += c.width;\r\n        if (c.resizable) {\r\n          shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);\r\n        }\r\n      }\r\n\r\n      // shrink\r\n      prevTotal = total;\r\n      while (total > availWidth && shrinkLeeway) {\r\n        var shrinkProportion = (total - availWidth) / shrinkLeeway;\r\n        for (i = 0; i < columns.length && total > availWidth; i++) {\r\n          c = columns[i];\r\n          var width = widths[i];\r\n          if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {\r\n            continue;\r\n          }\r\n          var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);\r\n          var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;\r\n          shrinkSize = Math.min(shrinkSize, width - absMinWidth);\r\n          total -= shrinkSize;\r\n          shrinkLeeway -= shrinkSize;\r\n          widths[i] -= shrinkSize;\r\n        }\r\n        if (prevTotal <= total) {  // avoid infinite loop\r\n          break;\r\n        }\r\n        prevTotal = total;\r\n      }\r\n\r\n      // grow\r\n      prevTotal = total;\r\n      while (total < availWidth) {\r\n        var growProportion = availWidth / total;\r\n        for (i = 0; i < columns.length && total < availWidth; i++) {\r\n          c = columns[i];\r\n          var currentWidth = widths[i];\r\n          var growSize;\r\n\r\n          if (!c.resizable || c.maxWidth <= currentWidth) {\r\n            growSize = 0;\r\n          } else {\r\n            growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;\r\n          }\r\n          total += growSize;\r\n          widths[i] += growSize;\r\n        }\r\n        if (prevTotal >= total) {  // avoid infinite loop\r\n          break;\r\n        }\r\n        prevTotal = total;\r\n      }\r\n\r\n      var reRender = false;\r\n      for (i = 0; i < columns.length; i++) {\r\n        if (columns[i]) {\r\n          if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {\r\n            reRender = true;\r\n          }\r\n          columns[i].width = widths[i];\r\n        }\r\n      }\r\n\r\n      applyColumnHeaderWidths();\r\n      updateCanvasWidth(true);\r\n      if (reRender) {\r\n        invalidateAllRows();\r\n        render();\r\n      }\r\n    }\r\n\r\n    function applyColumnHeaderWidths() {\r\n      if (!initialized) { return; }\r\n      var h;\r\n      for (var i = 0, headers = $headers.children(), ii = headers.length; i < ii; i++) {\r\n        h = $(headers[i]);\r\n        if (h && columns[i] && h.width() !== columns[i].width - headerColumnWidthDiff) {\r\n          h.width(columns[i].width - headerColumnWidthDiff);\r\n        }\r\n      }\r\n\r\n      updateColumnCaches();\r\n    }\r\n\r\n    function applyColumnWidths() {\r\n      var x = 0, w, rule;\r\n      for (var i = 0; i < columns.length; i++) {\r\n        w = columns[i].width;\r\n\r\n        rule = getColumnCssRules(i);\r\n        rule.left.style.left = x + \"px\";\r\n        rule.right.style.right = (canvasWidth - x - w) + \"px\";\r\n\r\n        x += columns[i].width;\r\n      }\r\n    }\r\n\r\n    function setSortColumn(columnId, ascending) {\r\n      setSortColumns([{ columnId: columnId, sortAsc: ascending}]);\r\n    }\r\n\r\n    function setSortColumns(cols) {\r\n      sortColumns = cols;\r\n\r\n      var headerColumnEls = $headers.children();\r\n      headerColumnEls\r\n          .removeClass(\"slick-header-column-sorted\")\r\n          .find(\".slick-sort-indicator\")\r\n              .removeClass(\"slick-sort-indicator-asc slick-sort-indicator-desc\");\r\n\r\n      $.each(sortColumns, function(i, col) {\r\n        if (col.sortAsc == null) {\r\n          col.sortAsc = true;\r\n        }\r\n        var columnIndex = getColumnIndex(col.columnId);\r\n        if (columnIndex != null) {\r\n          headerColumnEls.eq(columnIndex)\r\n              .addClass(\"slick-header-column-sorted\")\r\n              .find(\".slick-sort-indicator\")\r\n                  .addClass(col.sortAsc ? \"slick-sort-indicator-asc\" : \"slick-sort-indicator-desc\");\r\n        }\r\n      });\r\n    }\r\n\r\n    function getSortColumns() {\r\n      return sortColumns;\r\n    }\r\n\r\n    function handleSelectedRangesChanged(e, ranges) {\r\n      selectedRows = [];\r\n      var hash = {};\r\n      for (var i = 0; i < ranges.length; i++) {\r\n        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n          if (!hash[j]) {  // prevent duplicates\r\n            selectedRows.push(j);\r\n            hash[j] = {};\r\n          }\r\n          for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\r\n            if (canCellBeSelected(j, k)) {\r\n              hash[j][columns[k].id] = options.selectedCellCssClass;\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      setCellCssStyles(options.selectedCellCssClass, hash);\r\n\r\n      trigger(self.onSelectedRowsChanged, {rows: getSelectedRows()}, e);\r\n    }\r\n\r\n    function getColumns() {\r\n      return columns;\r\n    }\r\n\r\n    function updateColumnCaches() {\r\n      // Pre-calculate cell boundaries.\r\n      columnPosLeft = [];\r\n      columnPosRight = [];\r\n      var x = 0;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        columnPosLeft[i] = x;\r\n        columnPosRight[i] = x + columns[i].width;\r\n        x += columns[i].width;\r\n      }\r\n    }\r\n\r\n    function setColumns(columnDefinitions) {\r\n      columns = columnDefinitions;\r\n\r\n      columnsById = {};\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);\r\n        columnsById[m.id] = i;\r\n        if (m.minWidth && m.width < m.minWidth) {\r\n          m.width = m.minWidth;\r\n        }\r\n        if (m.maxWidth && m.width > m.maxWidth) {\r\n          m.width = m.maxWidth;\r\n        }\r\n      }\r\n\r\n      updateColumnCaches();\r\n\r\n      if (initialized) {\r\n        invalidateAllRows();\r\n        createColumnHeaders();\r\n        removeCssRules();\r\n        createCssRules();\r\n        resizeCanvas();\r\n        applyColumnWidths();\r\n        handleScroll();\r\n      }\r\n    }\r\n\r\n    function getOptions() {\r\n      return options;\r\n    }\r\n\r\n    function setOptions(args) {\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return;\r\n      }\r\n\r\n      makeActiveCellNormal();\r\n\r\n      if (options.enableAddRow !== args.enableAddRow) {\r\n        invalidateRow(getDataLength());\r\n      }\r\n\r\n      options = $.extend(options, args);\r\n      validateAndEnforceOptions();\r\n\r\n      $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n      render();\r\n    }\r\n\r\n    function validateAndEnforceOptions() {\r\n      if (options.autoHeight) {\r\n        options.leaveSpaceForNewRows = false;\r\n      }\r\n    }\r\n\r\n    function setData(newData, scrollToTop) {\r\n      data = newData;\r\n      invalidateAllRows();\r\n      updateRowCount();\r\n      if (scrollToTop) {\r\n        scrollTo(0);\r\n      }\r\n    }\r\n\r\n    function getData() {\r\n      return data;\r\n    }\r\n\r\n    function getDataLength() {\r\n      if (data.getLength) {\r\n        return data.getLength();\r\n      } else {\r\n        return data.length;\r\n      }\r\n    }\r\n\r\n    function getDataLengthIncludingAddNew() {\r\n      return getDataLength() + (options.enableAddRow ? 1 : 0);\r\n    }\r\n\r\n    function getDataItem(i) {\r\n      if (data.getItem) {\r\n        return data.getItem(i);\r\n      } else {\r\n        return data[i];\r\n      }\r\n    }\r\n\r\n    function getTopPanel() {\r\n      return $topPanel[0];\r\n    }\r\n\r\n    function setTopPanelVisibility(visible) {\r\n      if (options.showTopPanel != visible) {\r\n        options.showTopPanel = visible;\r\n        if (visible) {\r\n          $topPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n        } else {\r\n          $topPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n        }\r\n      }\r\n    }\r\n\r\n    function setHeaderRowVisibility(visible) {\r\n      if (options.showHeaderRow != visible) {\r\n        options.showHeaderRow = visible;\r\n        if (visible) {\r\n          $headerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n        } else {\r\n          $headerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n        }\r\n      }\r\n    }\r\n\r\n    function getContainerNode() {\r\n      return $container.get(0);\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Rendering / Scrolling\r\n\r\n    function getRowTop(row) {\r\n      return options.rowHeight * row - offset;\r\n    }\r\n\r\n    function getRowFromPosition(y) {\r\n      return Math.floor((y + offset) / options.rowHeight);\r\n    }\r\n\r\n    function scrollTo(y) {\r\n      y = Math.max(y, 0);\r\n      y = Math.min(y, th - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0));\r\n\r\n      var oldOffset = offset;\r\n\r\n      page = Math.min(n - 1, Math.floor(y / ph));\r\n      offset = Math.round(page * cj);\r\n      var newScrollTop = y - offset;\r\n\r\n      if (offset != oldOffset) {\r\n        var range = getVisibleRange(newScrollTop);\r\n        cleanupRows(range);\r\n        updateRowPositions();\r\n      }\r\n\r\n      if (prevScrollTop != newScrollTop) {\r\n        vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;\r\n        $viewport[0].scrollTop = (lastRenderedScrollTop = scrollTop = prevScrollTop = newScrollTop);\r\n\r\n        trigger(self.onViewportChanged, {});\r\n      }\r\n    }\r\n\r\n    function defaultFormatter(row, cell, value, columnDef, dataContext) {\r\n      if (value == null) {\r\n        return \"\";\r\n      } else {\r\n        return (value + \"\").replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\");\r\n      }\r\n    }\r\n\r\n    function getFormatter(row, column) {\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n      // look up by id, then index\r\n      var columnOverrides = rowMetadata &&\r\n          rowMetadata.columns &&\r\n          (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);\r\n\r\n      return (columnOverrides && columnOverrides.formatter) ||\r\n          (rowMetadata && rowMetadata.formatter) ||\r\n          column.formatter ||\r\n          (options.formatterFactory && options.formatterFactory.getFormatter(column)) ||\r\n          options.defaultFormatter;\r\n    }\r\n\r\n    function getEditor(row, cell) {\r\n      var column = columns[cell];\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      var columnMetadata = rowMetadata && rowMetadata.columns;\r\n\r\n      if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {\r\n        return columnMetadata[column.id].editor;\r\n      }\r\n      if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {\r\n        return columnMetadata[cell].editor;\r\n      }\r\n\r\n      return column.editor || (options.editorFactory && options.editorFactory.getEditor(column));\r\n    }\r\n\r\n    function getDataItemValueForColumn(item, columnDef) {\r\n      if (options.dataItemColumnValueExtractor) {\r\n        return options.dataItemColumnValueExtractor(item, columnDef);\r\n      }\r\n      return item[columnDef.field];\r\n    }\r\n\r\n    function appendRowHtml(stringArray, row, range, dataLength) {\r\n      var d = getDataItem(row);\r\n      var dataLoading = row < dataLength && !d;\r\n      var rowCss = \"slick-row\" +\r\n          (dataLoading ? \" loading\" : \"\") +\r\n          (row === activeRow ? \" active\" : \"\") +\r\n          (row % 2 == 1 ? \" odd\" : \" even\");\r\n\r\n      if (!d) {\r\n        rowCss += \" \" + options.addNewRowCssClass;\r\n      }\r\n\r\n      var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n      if (metadata && metadata.cssClasses) {\r\n        rowCss += \" \" + metadata.cssClasses;\r\n      }\r\n\r\n      stringArray.push(\"<div class='ui-widget-content \" + rowCss + \"' style='top:\" + getRowTop(row) + \"px'>\");\r\n\r\n      var colspan, m;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        m = columns[i];\r\n        colspan = 1;\r\n        if (metadata && metadata.columns) {\r\n          var columnData = metadata.columns[m.id] || metadata.columns[i];\r\n          colspan = (columnData && columnData.colspan) || 1;\r\n          if (colspan === \"*\") {\r\n            colspan = ii - i;\r\n          }\r\n        }\r\n\r\n        // Do not render cells outside of the viewport.\r\n        if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n          if (columnPosLeft[i] > range.rightPx) {\r\n            // All columns to the right are outside the range.\r\n            break;\r\n          }\r\n\r\n          appendCellHtml(stringArray, row, i, colspan, d);\r\n        }\r\n\r\n        if (colspan > 1) {\r\n          i += (colspan - 1);\r\n        }\r\n      }\r\n\r\n      stringArray.push(\"</div>\");\r\n    }\r\n\r\n    function appendCellHtml(stringArray, row, cell, colspan, item) {\r\n      var m = columns[cell];\r\n      var cellCss = \"slick-cell l\" + cell + \" r\" + Math.min(columns.length - 1, cell + colspan - 1) +\r\n          (m.cssClass ? \" \" + m.cssClass : \"\");\r\n      if (row === activeRow && cell === activeCell) {\r\n        cellCss += (\" active\");\r\n      }\r\n\r\n      // TODO:  merge them together in the setter\r\n      for (var key in cellCssClasses) {\r\n        if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {\r\n          cellCss += (\" \" + cellCssClasses[key][row][m.id]);\r\n        }\r\n      }\r\n\r\n      stringArray.push(\"<div class='\" + cellCss + \"'>\");\r\n\r\n      // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)\r\n      if (item) {\r\n        var value = getDataItemValueForColumn(item, m);\r\n        stringArray.push(getFormatter(row, m)(row, cell, value, m, item));\r\n      }\r\n\r\n      stringArray.push(\"</div>\");\r\n\r\n      rowsCache[row].cellRenderQueue.push(cell);\r\n      rowsCache[row].cellColSpans[cell] = colspan;\r\n    }\r\n\r\n\r\n    function cleanupRows(rangeToKeep) {\r\n      for (var i in rowsCache) {\r\n        if (((i = parseInt(i, 10)) !== activeRow) && (i < rangeToKeep.top || i > rangeToKeep.bottom)) {\r\n          removeRowFromCache(i);\r\n        }\r\n      }\r\n    }\r\n\r\n    function invalidate() {\r\n      updateRowCount();\r\n      invalidateAllRows();\r\n      render();\r\n    }\r\n\r\n    function invalidateAllRows() {\r\n      if (currentEditor) {\r\n        makeActiveCellNormal();\r\n      }\r\n      for (var row in rowsCache) {\r\n        removeRowFromCache(row);\r\n      }\r\n    }\r\n\r\n    function removeRowFromCache(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (!cacheEntry) {\r\n        return;\r\n      }\r\n\r\n      if (rowNodeFromLastMouseWheelEvent == cacheEntry.rowNode) {\r\n        cacheEntry.rowNode.style.display = 'none';\r\n        zombieRowNodeFromLastMouseWheelEvent = rowNodeFromLastMouseWheelEvent;\r\n      } else {\r\n        $canvas[0].removeChild(cacheEntry.rowNode);\r\n      }\r\n\r\n      delete rowsCache[row];\r\n      delete postProcessedRows[row];\r\n      renderedRows--;\r\n      counter_rows_removed++;\r\n    }\r\n\r\n    function invalidateRows(rows) {\r\n      var i, rl;\r\n      if (!rows || !rows.length) {\r\n        return;\r\n      }\r\n      vScrollDir = 0;\r\n      for (i = 0, rl = rows.length; i < rl; i++) {\r\n        if (currentEditor && activeRow === rows[i]) {\r\n          makeActiveCellNormal();\r\n        }\r\n        if (rowsCache[rows[i]]) {\r\n          removeRowFromCache(rows[i]);\r\n        }\r\n      }\r\n    }\r\n\r\n    function invalidateRow(row) {\r\n      invalidateRows([row]);\r\n    }\r\n\r\n    function updateCell(row, cell) {\r\n      var cellNode = getCellNode(row, cell);\r\n      if (!cellNode) {\r\n        return;\r\n      }\r\n\r\n      var m = columns[cell], d = getDataItem(row);\r\n      if (currentEditor && activeRow === row && activeCell === cell) {\r\n        currentEditor.loadValue(d);\r\n      } else {\r\n        cellNode.innerHTML = d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d) : \"\";\r\n        invalidatePostProcessingResults(row);\r\n      }\r\n    }\r\n\r\n    function updateRow(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (!cacheEntry) {\r\n        return;\r\n      }\r\n\r\n      ensureCellNodesInRowsCache(row);\r\n\r\n      var d = getDataItem(row);\r\n\r\n      for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {\r\n        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {\r\n          continue;\r\n        }\r\n\r\n        columnIdx = columnIdx | 0;\r\n        var m = columns[columnIdx],\r\n            node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n\r\n        if (row === activeRow && columnIdx === activeCell && currentEditor) {\r\n          currentEditor.loadValue(d);\r\n        } else if (d) {\r\n          node.innerHTML = getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d);\r\n        } else {\r\n          node.innerHTML = \"\";\r\n        }\r\n      }\r\n\r\n      invalidatePostProcessingResults(row);\r\n    }\r\n\r\n    function getViewportHeight() {\r\n      return parseFloat($.css($container[0], \"height\", true)) -\r\n          parseFloat($.css($container[0], \"paddingTop\", true)) -\r\n          parseFloat($.css($container[0], \"paddingBottom\", true)) -\r\n          parseFloat($.css($headerScroller[0], \"height\")) - getVBoxDelta($headerScroller) -\r\n          (options.showTopPanel ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0) -\r\n          (options.showHeaderRow ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0);\r\n    }\r\n\r\n    function resizeCanvas() {\r\n      if (!initialized) { return; }\r\n      if (options.autoHeight) {\r\n        viewportH = options.rowHeight * getDataLengthIncludingAddNew();\r\n      } else {\r\n        viewportH = getViewportHeight();\r\n      }\r\n\r\n      numVisibleRows = Math.ceil(viewportH / options.rowHeight);\r\n      viewportW = parseFloat($.css($container[0], \"width\", true));\r\n      if (!options.autoHeight) {\r\n        $viewport.height(viewportH);\r\n      }\r\n\r\n      if (options.forceFitColumns) {\r\n        autosizeColumns();\r\n      }\r\n\r\n      updateRowCount();\r\n      handleScroll();\r\n      // Since the width has changed, force the render() to reevaluate virtually rendered cells.\r\n      lastRenderedScrollLeft = -1;\r\n      render();\r\n    }\r\n\r\n    function updateRowCount() {\r\n      if (!initialized) { return; }\r\n\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      var numberOfRows = dataLengthIncludingAddNew +\r\n          (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);\r\n\r\n      var oldViewportHasVScroll = viewportHasVScroll;\r\n      // with autoHeight, we do not need to accommodate the vertical scroll bar\r\n      viewportHasVScroll = !options.autoHeight && (numberOfRows * options.rowHeight > viewportH);\r\n\r\n      makeActiveCellNormal();\r\n\r\n      // remove the rows that are now outside of the data range\r\n      // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows\r\n      var l = dataLengthIncludingAddNew - 1;\r\n      for (var i in rowsCache) {\r\n        if (i >= l) {\r\n          removeRowFromCache(i);\r\n        }\r\n      }\r\n\r\n      if (activeCellNode && activeRow > l) {\r\n        resetActiveCell();\r\n      }\r\n\r\n      var oldH = h;\r\n      th = Math.max(options.rowHeight * numberOfRows, viewportH - scrollbarDimensions.height);\r\n      if (th < maxSupportedCssHeight) {\r\n        // just one page\r\n        h = ph = th;\r\n        n = 1;\r\n        cj = 0;\r\n      } else {\r\n        // break into pages\r\n        h = maxSupportedCssHeight;\r\n        ph = h / 100;\r\n        n = Math.floor(th / ph);\r\n        cj = (th - h) / (n - 1);\r\n      }\r\n\r\n      if (h !== oldH) {\r\n        $canvas.css(\"height\", h);\r\n        scrollTop = $viewport[0].scrollTop;\r\n      }\r\n\r\n      var oldScrollTopInRange = (scrollTop + offset <= th - viewportH);\r\n\r\n      if (th == 0 || scrollTop == 0) {\r\n        page = offset = 0;\r\n      } else if (oldScrollTopInRange) {\r\n        // maintain virtual position\r\n        scrollTo(scrollTop + offset);\r\n      } else {\r\n        // scroll to bottom\r\n        scrollTo(th - viewportH);\r\n      }\r\n\r\n      if (h != oldH && options.autoHeight) {\r\n        resizeCanvas();\r\n      }\r\n\r\n      if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {\r\n        autosizeColumns();\r\n      }\r\n      updateCanvasWidth(false);\r\n    }\r\n\r\n    function getVisibleRange(viewportTop, viewportLeft) {\r\n      if (viewportTop == null) {\r\n        viewportTop = scrollTop;\r\n      }\r\n      if (viewportLeft == null) {\r\n        viewportLeft = scrollLeft;\r\n      }\r\n\r\n      return {\r\n        top: getRowFromPosition(viewportTop),\r\n        bottom: getRowFromPosition(viewportTop + viewportH) + 1,\r\n        leftPx: viewportLeft,\r\n        rightPx: viewportLeft + viewportW\r\n      };\r\n    }\r\n\r\n    function getRenderedRange(viewportTop, viewportLeft) {\r\n      var range = getVisibleRange(viewportTop, viewportLeft);\r\n      var buffer = Math.round(viewportH / options.rowHeight);\r\n      var minBuffer = 3;\r\n\r\n      if (vScrollDir == -1) {\r\n        range.top -= buffer;\r\n        range.bottom += minBuffer;\r\n      } else if (vScrollDir == 1) {\r\n        range.top -= minBuffer;\r\n        range.bottom += buffer;\r\n      } else {\r\n        range.top -= minBuffer;\r\n        range.bottom += minBuffer;\r\n      }\r\n\r\n      range.top = Math.max(0, range.top);\r\n      range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);\r\n\r\n      range.leftPx -= viewportW;\r\n      range.rightPx += viewportW;\r\n\r\n      range.leftPx = Math.max(0, range.leftPx);\r\n      range.rightPx = Math.min(canvasWidth, range.rightPx);\r\n\r\n      return range;\r\n    }\r\n\r\n    function ensureCellNodesInRowsCache(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (cacheEntry) {\r\n        if (cacheEntry.cellRenderQueue.length) {\r\n          var lastChild = cacheEntry.rowNode.lastChild;\r\n          while (cacheEntry.cellRenderQueue.length) {\r\n            var columnIdx = cacheEntry.cellRenderQueue.pop();\r\n            cacheEntry.cellNodesByColumnIdx[columnIdx] = lastChild;\r\n            lastChild = lastChild.previousSibling;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function cleanUpCells(range, row) {\r\n      var totalCellsRemoved = 0;\r\n      var cacheEntry = rowsCache[row];\r\n\r\n      // Remove cells outside the range.\r\n      var cellsToRemove = [];\r\n      for (var i in cacheEntry.cellNodesByColumnIdx) {\r\n        // I really hate it when people mess with Array.prototype.\r\n        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(i)) {\r\n          continue;\r\n        }\r\n\r\n        // This is a string, so it needs to be cast back to a number.\r\n        i = i | 0;\r\n\r\n        var colspan = cacheEntry.cellColSpans[i];\r\n        if (columnPosLeft[i] > range.rightPx ||\r\n          columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {\r\n          if (!(row == activeRow && i == activeCell)) {\r\n            cellsToRemove.push(i);\r\n          }\r\n        }\r\n      }\r\n\r\n      var cellToRemove;\r\n      while ((cellToRemove = cellsToRemove.pop()) != null) {\r\n        cacheEntry.rowNode.removeChild(cacheEntry.cellNodesByColumnIdx[cellToRemove]);\r\n        delete cacheEntry.cellColSpans[cellToRemove];\r\n        delete cacheEntry.cellNodesByColumnIdx[cellToRemove];\r\n        if (postProcessedRows[row]) {\r\n          delete postProcessedRows[row][cellToRemove];\r\n        }\r\n        totalCellsRemoved++;\r\n      }\r\n    }\r\n\r\n    function cleanUpAndRenderCells(range) {\r\n      var cacheEntry;\r\n      var stringArray = [];\r\n      var processedRows = [];\r\n      var cellsAdded;\r\n      var totalCellsAdded = 0;\r\n      var colspan;\r\n\r\n      for (var row = range.top, btm = range.bottom; row <= btm; row++) {\r\n        cacheEntry = rowsCache[row];\r\n        if (!cacheEntry) {\r\n          continue;\r\n        }\r\n\r\n        // cellRenderQueue populated in renderRows() needs to be cleared first\r\n        ensureCellNodesInRowsCache(row);\r\n\r\n        cleanUpCells(range, row);\r\n\r\n        // Render missing cells.\r\n        cellsAdded = 0;\r\n\r\n        var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n        metadata = metadata && metadata.columns;\r\n\r\n        var d = getDataItem(row);\r\n\r\n        // TODO:  shorten this loop (index? heuristics? binary search?)\r\n        for (var i = 0, ii = columns.length; i < ii; i++) {\r\n          // Cells to the right are outside the range.\r\n          if (columnPosLeft[i] > range.rightPx) {\r\n            break;\r\n          }\r\n\r\n          // Already rendered.\r\n          if ((colspan = cacheEntry.cellColSpans[i]) != null) {\r\n            i += (colspan > 1 ? colspan - 1 : 0);\r\n            continue;\r\n          }\r\n\r\n          colspan = 1;\r\n          if (metadata) {\r\n            var columnData = metadata[columns[i].id] || metadata[i];\r\n            colspan = (columnData && columnData.colspan) || 1;\r\n            if (colspan === \"*\") {\r\n              colspan = ii - i;\r\n            }\r\n          }\r\n\r\n          if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n            appendCellHtml(stringArray, row, i, colspan, d);\r\n            cellsAdded++;\r\n          }\r\n\r\n          i += (colspan > 1 ? colspan - 1 : 0);\r\n        }\r\n\r\n        if (cellsAdded) {\r\n          totalCellsAdded += cellsAdded;\r\n          processedRows.push(row);\r\n        }\r\n      }\r\n\r\n      if (!stringArray.length) {\r\n        return;\r\n      }\r\n\r\n      var x = document.createElement(\"div\");\r\n      x.innerHTML = stringArray.join(\"\");\r\n\r\n      var processedRow;\r\n      var node;\r\n      while ((processedRow = processedRows.pop()) != null) {\r\n        cacheEntry = rowsCache[processedRow];\r\n        var columnIdx;\r\n        while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {\r\n          node = x.lastChild;\r\n          cacheEntry.rowNode.appendChild(node);\r\n          cacheEntry.cellNodesByColumnIdx[columnIdx] = node;\r\n        }\r\n      }\r\n    }\r\n\r\n    function renderRows(range) {\r\n      var parentNode = $canvas[0],\r\n          stringArray = [],\r\n          rows = [],\r\n          needToReselectCell = false,\r\n          dataLength = getDataLength();\r\n\r\n      for (var i = range.top, ii = range.bottom; i <= ii; i++) {\r\n        if (rowsCache[i]) {\r\n          continue;\r\n        }\r\n        renderedRows++;\r\n        rows.push(i);\r\n\r\n        // Create an entry right away so that appendRowHtml() can\r\n        // start populatating it.\r\n        rowsCache[i] = {\r\n          \"rowNode\": null,\r\n\r\n          // ColSpans of rendered cells (by column idx).\r\n          // Can also be used for checking whether a cell has been rendered.\r\n          \"cellColSpans\": [],\r\n\r\n          // Cell nodes (by column idx).  Lazy-populated by ensureCellNodesInRowsCache().\r\n          \"cellNodesByColumnIdx\": [],\r\n\r\n          // Column indices of cell nodes that have been rendered, but not yet indexed in\r\n          // cellNodesByColumnIdx.  These are in the same order as cell nodes added at the\r\n          // end of the row.\r\n          \"cellRenderQueue\": []\r\n        };\r\n\r\n        appendRowHtml(stringArray, i, range, dataLength);\r\n        if (activeCellNode && activeRow === i) {\r\n          needToReselectCell = true;\r\n        }\r\n        counter_rows_rendered++;\r\n      }\r\n\r\n      if (!rows.length) { return; }\r\n\r\n      var x = document.createElement(\"div\");\r\n      x.innerHTML = stringArray.join(\"\");\r\n\r\n      for (var i = 0, ii = rows.length; i < ii; i++) {\r\n        rowsCache[rows[i]].rowNode = parentNode.appendChild(x.firstChild);\r\n      }\r\n\r\n      if (needToReselectCell) {\r\n        activeCellNode = getCellNode(activeRow, activeCell);\r\n      }\r\n    }\r\n\r\n    function startPostProcessing() {\r\n      if (!options.enableAsyncPostRender) {\r\n        return;\r\n      }\r\n      clearTimeout(h_postrender);\r\n      h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n    }\r\n\r\n    function invalidatePostProcessingResults(row) {\r\n      delete postProcessedRows[row];\r\n      postProcessFromRow = Math.min(postProcessFromRow, row);\r\n      postProcessToRow = Math.max(postProcessToRow, row);\r\n      startPostProcessing();\r\n    }\r\n\r\n    function updateRowPositions() {\r\n      for (var row in rowsCache) {\r\n        rowsCache[row].rowNode.style.top = getRowTop(row) + \"px\";\r\n      }\r\n    }\r\n\r\n    function render() {\r\n      if (!initialized) { return; }\r\n      var visible = getVisibleRange();\r\n      var rendered = getRenderedRange();\r\n\r\n      // remove rows no longer in the viewport\r\n      cleanupRows(rendered);\r\n\r\n      // add new rows & missing cells in existing rows\r\n      if (lastRenderedScrollLeft != scrollLeft) {\r\n        cleanUpAndRenderCells(rendered);\r\n      }\r\n\r\n      // render missing rows\r\n      renderRows(rendered);\r\n\r\n      postProcessFromRow = visible.top;\r\n      postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);\r\n      startPostProcessing();\r\n\r\n      lastRenderedScrollTop = scrollTop;\r\n      lastRenderedScrollLeft = scrollLeft;\r\n      h_render = null;\r\n    }\r\n\r\n    function handleHeaderRowScroll() {\r\n      var scrollLeft = $headerRowScroller[0].scrollLeft;\r\n      if (scrollLeft != $viewport[0].scrollLeft) {\r\n        $viewport[0].scrollLeft = scrollLeft;\r\n      }\r\n    }\r\n\r\n    function handleScroll() {\r\n      scrollTop = $viewport[0].scrollTop;\r\n      scrollLeft = $viewport[0].scrollLeft;\r\n      var vScrollDist = Math.abs(scrollTop - prevScrollTop);\r\n      var hScrollDist = Math.abs(scrollLeft - prevScrollLeft);\r\n\r\n      if (hScrollDist) {\r\n        prevScrollLeft = scrollLeft;\r\n        $headerScroller[0].scrollLeft = scrollLeft;\r\n        $topPanelScroller[0].scrollLeft = scrollLeft;\r\n        $headerRowScroller[0].scrollLeft = scrollLeft;\r\n      }\r\n\r\n      if (vScrollDist) {\r\n        vScrollDir = prevScrollTop < scrollTop ? 1 : -1;\r\n        prevScrollTop = scrollTop;\r\n\r\n        // switch virtual pages if needed\r\n        if (vScrollDist < viewportH) {\r\n          scrollTo(scrollTop + offset);\r\n        } else {\r\n          var oldOffset = offset;\r\n          if (h == viewportH) {\r\n            page = 0;\r\n          } else {\r\n            page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));\r\n          }\r\n          offset = Math.round(page * cj);\r\n          if (oldOffset != offset) {\r\n            invalidateAllRows();\r\n          }\r\n        }\r\n      }\r\n\r\n      if (hScrollDist || vScrollDist) {\r\n        if (h_render) {\r\n          clearTimeout(h_render);\r\n        }\r\n\r\n        if (Math.abs(lastRenderedScrollTop - scrollTop) > 20 ||\r\n            Math.abs(lastRenderedScrollLeft - scrollLeft) > 20) {\r\n          if (options.forceSyncScrolling || (\r\n              Math.abs(lastRenderedScrollTop - scrollTop) < viewportH &&\r\n              Math.abs(lastRenderedScrollLeft - scrollLeft) < viewportW)) {\r\n            render();\r\n          } else {\r\n            h_render = setTimeout(render, 50);\r\n          }\r\n\r\n          trigger(self.onViewportChanged, {});\r\n        }\r\n      }\r\n\r\n      trigger(self.onScroll, {scrollLeft: scrollLeft, scrollTop: scrollTop});\r\n    }\r\n\r\n    function asyncPostProcessRows() {\r\n      var dataLength = getDataLength();\r\n      while (postProcessFromRow <= postProcessToRow) {\r\n        var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;\r\n        var cacheEntry = rowsCache[row];\r\n        if (!cacheEntry || row >= dataLength) {\r\n          continue;\r\n        }\r\n\r\n        if (!postProcessedRows[row]) {\r\n          postProcessedRows[row] = {};\r\n        }\r\n\r\n        ensureCellNodesInRowsCache(row);\r\n        for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {\r\n          if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {\r\n            continue;\r\n          }\r\n\r\n          columnIdx = columnIdx | 0;\r\n\r\n          var m = columns[columnIdx];\r\n          if (m.asyncPostRender && !postProcessedRows[row][columnIdx]) {\r\n            var node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n            if (node) {\r\n              m.asyncPostRender(node, row, getDataItem(row), m);\r\n            }\r\n            postProcessedRows[row][columnIdx] = true;\r\n          }\r\n        }\r\n\r\n        h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n        return;\r\n      }\r\n    }\r\n\r\n    function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {\r\n      var node, columnId, addedRowHash, removedRowHash;\r\n      for (var row in rowsCache) {\r\n        removedRowHash = removedHash && removedHash[row];\r\n        addedRowHash = addedHash && addedHash[row];\r\n\r\n        if (removedRowHash) {\r\n          for (columnId in removedRowHash) {\r\n            if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n              node = getCellNode(row, getColumnIndex(columnId));\r\n              if (node) {\r\n                $(node).removeClass(removedRowHash[columnId]);\r\n              }\r\n            }\r\n          }\r\n        }\r\n\r\n        if (addedRowHash) {\r\n          for (columnId in addedRowHash) {\r\n            if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n              node = getCellNode(row, getColumnIndex(columnId));\r\n              if (node) {\r\n                $(node).addClass(addedRowHash[columnId]);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function addCellCssStyles(key, hash) {\r\n      if (cellCssClasses[key]) {\r\n        throw \"addCellCssStyles: cell CSS hash with key '\" + key + \"' already exists.\";\r\n      }\r\n\r\n      cellCssClasses[key] = hash;\r\n      updateCellCssStylesOnRenderedRows(hash, null);\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash });\r\n    }\r\n\r\n    function removeCellCssStyles(key) {\r\n      if (!cellCssClasses[key]) {\r\n        return;\r\n      }\r\n\r\n      updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);\r\n      delete cellCssClasses[key];\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": null });\r\n    }\r\n\r\n    function setCellCssStyles(key, hash) {\r\n      var prevHash = cellCssClasses[key];\r\n\r\n      cellCssClasses[key] = hash;\r\n      updateCellCssStylesOnRenderedRows(hash, prevHash);\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash });\r\n    }\r\n\r\n    function getCellCssStyles(key) {\r\n      return cellCssClasses[key];\r\n    }\r\n\r\n    function flashCell(row, cell, speed) {\r\n      speed = speed || 100;\r\n      if (rowsCache[row]) {\r\n        var $cell = $(getCellNode(row, cell));\r\n\r\n        function toggleCellClass(times) {\r\n          if (!times) {\r\n            return;\r\n          }\r\n          setTimeout(function () {\r\n                $cell.queue(function () {\r\n                  $cell.toggleClass(options.cellFlashingCssClass).dequeue();\r\n                  toggleCellClass(times - 1);\r\n                });\r\n              },\r\n              speed);\r\n        }\r\n\r\n        toggleCellClass(4);\r\n      }\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Interactivity\r\n\r\n    function handleMouseWheel(e) {\r\n      var rowNode = $(e.target).closest(\".slick-row\")[0];\r\n      if (rowNode != rowNodeFromLastMouseWheelEvent) {\r\n        if (zombieRowNodeFromLastMouseWheelEvent && zombieRowNodeFromLastMouseWheelEvent != rowNode) {\r\n          $canvas[0].removeChild(zombieRowNodeFromLastMouseWheelEvent);\r\n          zombieRowNodeFromLastMouseWheelEvent = null;\r\n        }\r\n        rowNodeFromLastMouseWheelEvent = rowNode;\r\n      }\r\n    }\r\n\r\n    function handleDragInit(e, dd) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || !cellExists(cell.row, cell.cell)) {\r\n        return false;\r\n      }\r\n\r\n      var retval = trigger(self.onDragInit, dd, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return retval;\r\n      }\r\n\r\n      // if nobody claims to be handling drag'n'drop by stopping immediate propagation,\r\n      // cancel out of it\r\n      return false;\r\n    }\r\n\r\n    function handleDragStart(e, dd) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || !cellExists(cell.row, cell.cell)) {\r\n        return false;\r\n      }\r\n\r\n      var retval = trigger(self.onDragStart, dd, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return retval;\r\n      }\r\n\r\n      return false;\r\n    }\r\n\r\n    function handleDrag(e, dd) {\r\n      return trigger(self.onDrag, dd, e);\r\n    }\r\n\r\n    function handleDragEnd(e, dd) {\r\n      trigger(self.onDragEnd, dd, e);\r\n    }\r\n\r\n    function handleKeyDown(e) {\r\n      trigger(self.onKeyDown, {row: activeRow, cell: activeCell}, e);\r\n      var handled = e.isImmediatePropagationStopped();\r\n\r\n      if (!handled) {\r\n        if (!e.shiftKey && !e.altKey && !e.ctrlKey) {\r\n          if (e.which == 27) {\r\n            if (!getEditorLock().isActive()) {\r\n              return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)\r\n            }\r\n            cancelEditAndSetFocus();\r\n          } else if (e.which == 34) {\r\n            navigatePageDown();\r\n            handled = true;\r\n          } else if (e.which == 33) {\r\n            navigatePageUp();\r\n            handled = true;\r\n          } else if (e.which == 37) {\r\n            handled = navigateLeft();\r\n          } else if (e.which == 39) {\r\n            handled = navigateRight();\r\n          } else if (e.which == 38) {\r\n            handled = navigateUp();\r\n          } else if (e.which == 40) {\r\n            handled = navigateDown();\r\n          } else if (e.which == 9) {\r\n            handled = navigateNext();\r\n          } else if (e.which == 13) {\r\n            if (options.editable) {\r\n              if (currentEditor) {\r\n                // adding new row\r\n                if (activeRow === getDataLength()) {\r\n                  navigateDown();\r\n                } else {\r\n                  commitEditAndSetFocus();\r\n                }\r\n              } else {\r\n                if (getEditorLock().commitCurrentEdit()) {\r\n                  makeActiveCellEditable();\r\n                }\r\n              }\r\n            }\r\n            handled = true;\r\n          }\r\n        } else if (e.which == 9 && e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n          handled = navigatePrev();\r\n        }\r\n      }\r\n\r\n      if (handled) {\r\n        // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it\r\n        e.stopPropagation();\r\n        e.preventDefault();\r\n        try {\r\n          e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)\r\n        }\r\n        // ignore exceptions - setting the original event's keycode throws access denied exception for \"Ctrl\"\r\n        // (hitting control key only, nothing else), \"Shift\" (maybe others)\r\n        catch (error) {\r\n        }\r\n      }\r\n    }\r\n\r\n    function handleClick(e) {\r\n      if (!currentEditor) {\r\n        // if this click resulted in some cell child node getting focus,\r\n        // don't steal it back - keyboard events will still bubble up\r\n        // IE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.\r\n        if (e.target != document.activeElement || $(e.target).hasClass(\"slick-cell\")) {\r\n          setFocus();\r\n        }\r\n      }\r\n\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onClick, {row: cell.row, cell: cell.cell}, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return;\r\n      }\r\n\r\n      if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {\r\n        if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {\r\n          scrollRowIntoView(cell.row, false);\r\n          setActiveCellInternal(getCellNode(cell.row, cell.cell));\r\n        }\r\n      }\r\n    }\r\n\r\n    function handleContextMenu(e) {\r\n      var $cell = $(e.target).closest(\".slick-cell\", $canvas);\r\n      if ($cell.length === 0) {\r\n        return;\r\n      }\r\n\r\n      // are we editing this cell?\r\n      if (activeCellNode === $cell[0] && currentEditor !== null) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onContextMenu, {}, e);\r\n    }\r\n\r\n    function handleDblClick(e) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onDblClick, {row: cell.row, cell: cell.cell}, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return;\r\n      }\r\n\r\n      if (options.editable) {\r\n        gotoCell(cell.row, cell.cell, true);\r\n      }\r\n    }\r\n\r\n    function handleHeaderMouseEnter(e) {\r\n      trigger(self.onHeaderMouseEnter, {\r\n        \"column\": $(this).data(\"column\")\r\n      }, e);\r\n    }\r\n\r\n    function handleHeaderMouseLeave(e) {\r\n      trigger(self.onHeaderMouseLeave, {\r\n        \"column\": $(this).data(\"column\")\r\n      }, e);\r\n    }\r\n\r\n    function handleHeaderContextMenu(e) {\r\n      var $header = $(e.target).closest(\".slick-header-column\", \".slick-header-columns\");\r\n      var column = $header && $header.data(\"column\");\r\n      trigger(self.onHeaderContextMenu, {column: column}, e);\r\n    }\r\n\r\n    function handleHeaderClick(e) {\r\n      var $header = $(e.target).closest(\".slick-header-column\", \".slick-header-columns\");\r\n      var column = $header && $header.data(\"column\");\r\n      if (column) {\r\n        trigger(self.onHeaderClick, {column: column}, e);\r\n      }\r\n    }\r\n\r\n    function handleMouseEnter(e) {\r\n      trigger(self.onMouseEnter, {}, e);\r\n    }\r\n\r\n    function handleMouseLeave(e) {\r\n      trigger(self.onMouseLeave, {}, e);\r\n    }\r\n\r\n    function cellExists(row, cell) {\r\n      return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);\r\n    }\r\n\r\n    function getCellFromPoint(x, y) {\r\n      var row = getRowFromPosition(y);\r\n      var cell = 0;\r\n\r\n      var w = 0;\r\n      for (var i = 0; i < columns.length && w < x; i++) {\r\n        w += columns[i].width;\r\n        cell++;\r\n      }\r\n\r\n      if (cell < 0) {\r\n        cell = 0;\r\n      }\r\n\r\n      return {row: row, cell: cell - 1};\r\n    }\r\n\r\n    function getCellFromNode(cellNode) {\r\n      // read column number from .l<columnNumber> CSS class\r\n      var cls = /l\\d+/.exec(cellNode.className);\r\n      if (!cls) {\r\n        throw \"getCellFromNode: cannot get cell - \" + cellNode.className;\r\n      }\r\n      return parseInt(cls[0].substr(1, cls[0].length - 1), 10);\r\n    }\r\n\r\n    function getRowFromNode(rowNode) {\r\n      for (var row in rowsCache) {\r\n        if (rowsCache[row].rowNode === rowNode) {\r\n          return row | 0;\r\n        }\r\n      }\r\n\r\n      return null;\r\n    }\r\n\r\n    function getCellFromEvent(e) {\r\n      var $cell = $(e.target).closest(\".slick-cell\", $canvas);\r\n      if (!$cell.length) {\r\n        return null;\r\n      }\r\n\r\n      var row = getRowFromNode($cell[0].parentNode);\r\n      var cell = getCellFromNode($cell[0]);\r\n\r\n      if (row == null || cell == null) {\r\n        return null;\r\n      } else {\r\n        return {\r\n          \"row\": row,\r\n          \"cell\": cell\r\n        };\r\n      }\r\n    }\r\n\r\n    function getCellNodeBox(row, cell) {\r\n      if (!cellExists(row, cell)) {\r\n        return null;\r\n      }\r\n\r\n      var y1 = getRowTop(row);\r\n      var y2 = y1 + options.rowHeight - 1;\r\n      var x1 = 0;\r\n      for (var i = 0; i < cell; i++) {\r\n        x1 += columns[i].width;\r\n      }\r\n      var x2 = x1 + columns[cell].width;\r\n\r\n      return {\r\n        top: y1,\r\n        left: x1,\r\n        bottom: y2,\r\n        right: x2\r\n      };\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Cell switching\r\n\r\n    function resetActiveCell() {\r\n      setActiveCellInternal(null, false);\r\n    }\r\n\r\n    function setFocus() {\r\n      if (tabbingDirection == -1) {\r\n        $focusSink[0].focus();\r\n      } else {\r\n        $focusSink2[0].focus();\r\n      }\r\n    }\r\n\r\n    function scrollCellIntoView(row, cell, doPaging) {\r\n      scrollRowIntoView(row, doPaging);\r\n\r\n      var colspan = getColspan(row, cell);\r\n      var left = columnPosLeft[cell],\r\n        right = columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)],\r\n        scrollRight = scrollLeft + viewportW;\r\n\r\n      if (left < scrollLeft) {\r\n        $viewport.scrollLeft(left);\r\n        handleScroll();\r\n        render();\r\n      } else if (right > scrollRight) {\r\n        $viewport.scrollLeft(Math.min(left, right - $viewport[0].clientWidth));\r\n        handleScroll();\r\n        render();\r\n      }\r\n    }\r\n\r\n    function setActiveCellInternal(newCell, opt_editMode) {\r\n      if (activeCellNode !== null) {\r\n        makeActiveCellNormal();\r\n        $(activeCellNode).removeClass(\"active\");\r\n        if (rowsCache[activeRow]) {\r\n          $(rowsCache[activeRow].rowNode).removeClass(\"active\");\r\n        }\r\n      }\r\n\r\n      var activeCellChanged = (activeCellNode !== newCell);\r\n      activeCellNode = newCell;\r\n\r\n      if (activeCellNode != null) {\r\n        activeRow = getRowFromNode(activeCellNode.parentNode);\r\n        activeCell = activePosX = getCellFromNode(activeCellNode);\r\n\r\n        if (opt_editMode == null) {\r\n          opt_editMode = (activeRow == getDataLength()) || options.autoEdit;\r\n        }\r\n\r\n        $(activeCellNode).addClass(\"active\");\r\n        $(rowsCache[activeRow].rowNode).addClass(\"active\");\r\n\r\n        if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {\r\n          clearTimeout(h_editorLoader);\r\n\r\n          if (options.asyncEditorLoading) {\r\n            h_editorLoader = setTimeout(function () {\r\n              makeActiveCellEditable();\r\n            }, options.asyncEditorLoadDelay);\r\n          } else {\r\n            makeActiveCellEditable();\r\n          }\r\n        }\r\n      } else {\r\n        activeRow = activeCell = null;\r\n      }\r\n\r\n      if (activeCellChanged) {\r\n        trigger(self.onActiveCellChanged, getActiveCell());\r\n      }\r\n    }\r\n\r\n    function clearTextSelection() {\r\n      if (document.selection && document.selection.empty) {\r\n        try {\r\n          //IE fails here if selected element is not in dom\r\n          document.selection.empty();\r\n        } catch (e) { }\r\n      } else if (window.getSelection) {\r\n        var sel = window.getSelection();\r\n        if (sel && sel.removeAllRanges) {\r\n          sel.removeAllRanges();\r\n        }\r\n      }\r\n    }\r\n\r\n    function isCellPotentiallyEditable(row, cell) {\r\n      var dataLength = getDataLength();\r\n      // is the data for this row loaded?\r\n      if (row < dataLength && !getDataItem(row)) {\r\n        return false;\r\n      }\r\n\r\n      // are we in the Add New row?  can we create new from this cell?\r\n      if (columns[cell].cannotTriggerInsert && row >= dataLength) {\r\n        return false;\r\n      }\r\n\r\n      // does this cell have an editor?\r\n      if (!getEditor(row, cell)) {\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    }\r\n\r\n    function makeActiveCellNormal() {\r\n      if (!currentEditor) {\r\n        return;\r\n      }\r\n      trigger(self.onBeforeCellEditorDestroy, {editor: currentEditor});\r\n      currentEditor.destroy();\r\n      currentEditor = null;\r\n\r\n      if (activeCellNode) {\r\n        var d = getDataItem(activeRow);\r\n        $(activeCellNode).removeClass(\"editable invalid\");\r\n        if (d) {\r\n          var column = columns[activeCell];\r\n          var formatter = getFormatter(activeRow, column);\r\n          activeCellNode.innerHTML = formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d);\r\n          invalidatePostProcessingResults(activeRow);\r\n        }\r\n      }\r\n\r\n      // if there previously was text selected on a page (such as selected text in the edit cell just removed),\r\n      // IE can't set focus to anything else correctly\r\n      if (navigator.userAgent.toLowerCase().match(/msie/)) {\r\n        clearTextSelection();\r\n      }\r\n\r\n      getEditorLock().deactivate(editController);\r\n    }\r\n\r\n    function makeActiveCellEditable(editor) {\r\n      if (!activeCellNode) {\r\n        return;\r\n      }\r\n      if (!options.editable) {\r\n        throw \"Grid : makeActiveCellEditable : should never get called when options.editable is false\";\r\n      }\r\n\r\n      // cancel pending async call if there is one\r\n      clearTimeout(h_editorLoader);\r\n\r\n      if (!isCellPotentiallyEditable(activeRow, activeCell)) {\r\n        return;\r\n      }\r\n\r\n      var columnDef = columns[activeCell];\r\n      var item = getDataItem(activeRow);\r\n\r\n      if (trigger(self.onBeforeEditCell, {row: activeRow, cell: activeCell, item: item, column: columnDef}) === false) {\r\n        setFocus();\r\n        return;\r\n      }\r\n\r\n      getEditorLock().activate(editController);\r\n      $(activeCellNode).addClass(\"editable\");\r\n\r\n      // don't clear the cell if a custom editor is passed through\r\n      if (!editor) {\r\n        activeCellNode.innerHTML = \"\";\r\n      }\r\n\r\n      currentEditor = new (editor || getEditor(activeRow, activeCell))({\r\n        grid: self,\r\n        gridPosition: absBox($container[0]),\r\n        position: absBox(activeCellNode),\r\n        container: activeCellNode,\r\n        column: columnDef,\r\n        item: item || {},\r\n        commitChanges: commitEditAndSetFocus,\r\n        cancelChanges: cancelEditAndSetFocus\r\n      });\r\n\r\n      if (item) {\r\n        currentEditor.loadValue(item);\r\n      }\r\n\r\n      serializedEditorValue = currentEditor.serializeValue();\r\n\r\n      if (currentEditor.position) {\r\n        handleActiveCellPositionChange();\r\n      }\r\n    }\r\n\r\n    function commitEditAndSetFocus() {\r\n      // if the commit fails, it would do so due to a validation error\r\n      // if so, do not steal the focus from the editor\r\n      if (getEditorLock().commitCurrentEdit()) {\r\n        setFocus();\r\n        if (options.autoEdit) {\r\n          navigateDown();\r\n        }\r\n      }\r\n    }\r\n\r\n    function cancelEditAndSetFocus() {\r\n      if (getEditorLock().cancelCurrentEdit()) {\r\n        setFocus();\r\n      }\r\n    }\r\n\r\n    function absBox(elem) {\r\n      var box = {\r\n        top: elem.offsetTop,\r\n        left: elem.offsetLeft,\r\n        bottom: 0,\r\n        right: 0,\r\n        width: $(elem).outerWidth(),\r\n        height: $(elem).outerHeight(),\r\n        visible: true};\r\n      box.bottom = box.top + box.height;\r\n      box.right = box.left + box.width;\r\n\r\n      // walk up the tree\r\n      var offsetParent = elem.offsetParent;\r\n      while ((elem = elem.parentNode) != document.body) {\r\n        if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css(\"overflowY\") != \"visible\") {\r\n          box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;\r\n        }\r\n\r\n        if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css(\"overflowX\") != \"visible\") {\r\n          box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;\r\n        }\r\n\r\n        box.left -= elem.scrollLeft;\r\n        box.top -= elem.scrollTop;\r\n\r\n        if (elem === offsetParent) {\r\n          box.left += elem.offsetLeft;\r\n          box.top += elem.offsetTop;\r\n          offsetParent = elem.offsetParent;\r\n        }\r\n\r\n        box.bottom = box.top + box.height;\r\n        box.right = box.left + box.width;\r\n      }\r\n\r\n      return box;\r\n    }\r\n\r\n    function getActiveCellPosition() {\r\n      return absBox(activeCellNode);\r\n    }\r\n\r\n    function getGridPosition() {\r\n      return absBox($container[0])\r\n    }\r\n\r\n    function handleActiveCellPositionChange() {\r\n      if (!activeCellNode) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onActiveCellPositionChanged, {});\r\n\r\n      if (currentEditor) {\r\n        var cellBox = getActiveCellPosition();\r\n        if (currentEditor.show && currentEditor.hide) {\r\n          if (!cellBox.visible) {\r\n            currentEditor.hide();\r\n          } else {\r\n            currentEditor.show();\r\n          }\r\n        }\r\n\r\n        if (currentEditor.position) {\r\n          currentEditor.position(cellBox);\r\n        }\r\n      }\r\n    }\r\n\r\n    function getCellEditor() {\r\n      return currentEditor;\r\n    }\r\n\r\n    function getActiveCell() {\r\n      if (!activeCellNode) {\r\n        return null;\r\n      } else {\r\n        return {row: activeRow, cell: activeCell};\r\n      }\r\n    }\r\n\r\n    function getActiveCellNode() {\r\n      return activeCellNode;\r\n    }\r\n\r\n    function scrollRowIntoView(row, doPaging) {\r\n      var rowAtTop = row * options.rowHeight;\r\n      var rowAtBottom = (row + 1) * options.rowHeight - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0);\r\n\r\n      // need to page down?\r\n      if ((row + 1) * options.rowHeight > scrollTop + viewportH + offset) {\r\n        scrollTo(doPaging ? rowAtTop : rowAtBottom);\r\n        render();\r\n      }\r\n      // or page up?\r\n      else if (row * options.rowHeight < scrollTop + offset) {\r\n        scrollTo(doPaging ? rowAtBottom : rowAtTop);\r\n        render();\r\n      }\r\n    }\r\n\r\n    function scrollRowToTop(row) {\r\n      scrollTo(row * options.rowHeight);\r\n      render();\r\n    }\r\n\r\n    function scrollPage(dir) {\r\n      var deltaRows = dir * numVisibleRows;\r\n      scrollTo((getRowFromPosition(scrollTop) + deltaRows) * options.rowHeight);\r\n      render();\r\n\r\n      if (options.enableCellNavigation && activeRow != null) {\r\n        var row = activeRow + deltaRows;\r\n        var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n        if (row >= dataLengthIncludingAddNew) {\r\n          row = dataLengthIncludingAddNew - 1;\r\n        }\r\n        if (row < 0) {\r\n          row = 0;\r\n        }\r\n\r\n        var cell = 0, prevCell = null;\r\n        var prevActivePosX = activePosX;\r\n        while (cell <= activePosX) {\r\n          if (canCellBeActive(row, cell)) {\r\n            prevCell = cell;\r\n          }\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (prevCell !== null) {\r\n          setActiveCellInternal(getCellNode(row, prevCell));\r\n          activePosX = prevActivePosX;\r\n        } else {\r\n          resetActiveCell();\r\n        }\r\n      }\r\n    }\r\n\r\n    function navigatePageDown() {\r\n      scrollPage(1);\r\n    }\r\n\r\n    function navigatePageUp() {\r\n      scrollPage(-1);\r\n    }\r\n\r\n    function getColspan(row, cell) {\r\n      var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (!metadata || !metadata.columns) {\r\n        return 1;\r\n      }\r\n\r\n      var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];\r\n      var colspan = (columnData && columnData.colspan);\r\n      if (colspan === \"*\") {\r\n        colspan = columns.length - cell;\r\n      } else {\r\n        colspan = colspan || 1;\r\n      }\r\n\r\n      return colspan;\r\n    }\r\n\r\n    function findFirstFocusableCell(row) {\r\n      var cell = 0;\r\n      while (cell < columns.length) {\r\n        if (canCellBeActive(row, cell)) {\r\n          return cell;\r\n        }\r\n        cell += getColspan(row, cell);\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function findLastFocusableCell(row) {\r\n      var cell = 0;\r\n      var lastFocusableCell = null;\r\n      while (cell < columns.length) {\r\n        if (canCellBeActive(row, cell)) {\r\n          lastFocusableCell = cell;\r\n        }\r\n        cell += getColspan(row, cell);\r\n      }\r\n      return lastFocusableCell;\r\n    }\r\n\r\n    function gotoRight(row, cell, posX) {\r\n      if (cell >= columns.length) {\r\n        return null;\r\n      }\r\n\r\n      do {\r\n        cell += getColspan(row, cell);\r\n      }\r\n      while (cell < columns.length && !canCellBeActive(row, cell));\r\n\r\n      if (cell < columns.length) {\r\n        return {\r\n          \"row\": row,\r\n          \"cell\": cell,\r\n          \"posX\": cell\r\n        };\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function gotoLeft(row, cell, posX) {\r\n      if (cell <= 0) {\r\n        return null;\r\n      }\r\n\r\n      var firstFocusableCell = findFirstFocusableCell(row);\r\n      if (firstFocusableCell === null || firstFocusableCell >= cell) {\r\n        return null;\r\n      }\r\n\r\n      var prev = {\r\n        \"row\": row,\r\n        \"cell\": firstFocusableCell,\r\n        \"posX\": firstFocusableCell\r\n      };\r\n      var pos;\r\n      while (true) {\r\n        pos = gotoRight(prev.row, prev.cell, prev.posX);\r\n        if (!pos) {\r\n          return null;\r\n        }\r\n        if (pos.cell >= cell) {\r\n          return prev;\r\n        }\r\n        prev = pos;\r\n      }\r\n    }\r\n\r\n    function gotoDown(row, cell, posX) {\r\n      var prevCell;\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      while (true) {\r\n        if (++row >= dataLengthIncludingAddNew) {\r\n          return null;\r\n        }\r\n\r\n        prevCell = cell = 0;\r\n        while (cell <= posX) {\r\n          prevCell = cell;\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (canCellBeActive(row, prevCell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": prevCell,\r\n            \"posX\": posX\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    function gotoUp(row, cell, posX) {\r\n      var prevCell;\r\n      while (true) {\r\n        if (--row < 0) {\r\n          return null;\r\n        }\r\n\r\n        prevCell = cell = 0;\r\n        while (cell <= posX) {\r\n          prevCell = cell;\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (canCellBeActive(row, prevCell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": prevCell,\r\n            \"posX\": posX\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    function gotoNext(row, cell, posX) {\r\n      if (row == null && cell == null) {\r\n        row = cell = posX = 0;\r\n        if (canCellBeActive(row, cell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": cell,\r\n            \"posX\": cell\r\n          };\r\n        }\r\n      }\r\n\r\n      var pos = gotoRight(row, cell, posX);\r\n      if (pos) {\r\n        return pos;\r\n      }\r\n\r\n      var firstFocusableCell = null;\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      while (++row < dataLengthIncludingAddNew) {\r\n        firstFocusableCell = findFirstFocusableCell(row);\r\n        if (firstFocusableCell !== null) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": firstFocusableCell,\r\n            \"posX\": firstFocusableCell\r\n          };\r\n        }\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function gotoPrev(row, cell, posX) {\r\n      if (row == null && cell == null) {\r\n        row = getDataLengthIncludingAddNew() - 1;\r\n        cell = posX = columns.length - 1;\r\n        if (canCellBeActive(row, cell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": cell,\r\n            \"posX\": cell\r\n          };\r\n        }\r\n      }\r\n\r\n      var pos;\r\n      var lastSelectableCell;\r\n      while (!pos) {\r\n        pos = gotoLeft(row, cell, posX);\r\n        if (pos) {\r\n          break;\r\n        }\r\n        if (--row < 0) {\r\n          return null;\r\n        }\r\n\r\n        cell = 0;\r\n        lastSelectableCell = findLastFocusableCell(row);\r\n        if (lastSelectableCell !== null) {\r\n          pos = {\r\n            \"row\": row,\r\n            \"cell\": lastSelectableCell,\r\n            \"posX\": lastSelectableCell\r\n          };\r\n        }\r\n      }\r\n      return pos;\r\n    }\r\n\r\n    function navigateRight() {\r\n      return navigate(\"right\");\r\n    }\r\n\r\n    function navigateLeft() {\r\n      return navigate(\"left\");\r\n    }\r\n\r\n    function navigateDown() {\r\n      return navigate(\"down\");\r\n    }\r\n\r\n    function navigateUp() {\r\n      return navigate(\"up\");\r\n    }\r\n\r\n    function navigateNext() {\r\n      return navigate(\"next\");\r\n    }\r\n\r\n    function navigatePrev() {\r\n      return navigate(\"prev\");\r\n    }\r\n\r\n    /**\r\n     * @param {string} dir Navigation direction.\r\n     * @return {boolean} Whether navigation resulted in a change of active cell.\r\n     */\r\n    function navigate(dir) {\r\n      if (!options.enableCellNavigation) {\r\n        return false;\r\n      }\r\n\r\n      if (!activeCellNode && dir != \"prev\" && dir != \"next\") {\r\n        return false;\r\n      }\r\n\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return true;\r\n      }\r\n      setFocus();\r\n\r\n      var tabbingDirections = {\r\n        \"up\": -1,\r\n        \"down\": 1,\r\n        \"left\": -1,\r\n        \"right\": 1,\r\n        \"prev\": -1,\r\n        \"next\": 1\r\n      };\r\n      tabbingDirection = tabbingDirections[dir];\r\n\r\n      var stepFunctions = {\r\n        \"up\": gotoUp,\r\n        \"down\": gotoDown,\r\n        \"left\": gotoLeft,\r\n        \"right\": gotoRight,\r\n        \"prev\": gotoPrev,\r\n        \"next\": gotoNext\r\n      };\r\n      var stepFn = stepFunctions[dir];\r\n      var pos = stepFn(activeRow, activeCell, activePosX);\r\n      if (pos) {\r\n        var isAddNewRow = (pos.row == getDataLength());\r\n        scrollCellIntoView(pos.row, pos.cell, !isAddNewRow);\r\n        setActiveCellInternal(getCellNode(pos.row, pos.cell));\r\n        activePosX = pos.posX;\r\n        return true;\r\n      } else {\r\n        setActiveCellInternal(getCellNode(activeRow, activeCell));\r\n        return false;\r\n      }\r\n    }\r\n\r\n    function getCellNode(row, cell) {\r\n      if (rowsCache[row]) {\r\n        ensureCellNodesInRowsCache(row);\r\n        return rowsCache[row].cellNodesByColumnIdx[cell];\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function setActiveCell(row, cell) {\r\n      if (!initialized) { return; }\r\n      if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n        return;\r\n      }\r\n\r\n      if (!options.enableCellNavigation) {\r\n        return;\r\n      }\r\n\r\n      scrollCellIntoView(row, cell, false);\r\n      setActiveCellInternal(getCellNode(row, cell), false);\r\n    }\r\n\r\n    function canCellBeActive(row, cell) {\r\n      if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||\r\n          row < 0 || cell >= columns.length || cell < 0) {\r\n        return false;\r\n      }\r\n\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (rowMetadata && typeof rowMetadata.focusable === \"boolean\") {\r\n        return rowMetadata.focusable;\r\n      }\r\n\r\n      var columnMetadata = rowMetadata && rowMetadata.columns;\r\n      if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable === \"boolean\") {\r\n        return columnMetadata[columns[cell].id].focusable;\r\n      }\r\n      if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable === \"boolean\") {\r\n        return columnMetadata[cell].focusable;\r\n      }\r\n\r\n      return columns[cell].focusable;\r\n    }\r\n\r\n    function canCellBeSelected(row, cell) {\r\n      if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n        return false;\r\n      }\r\n\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (rowMetadata && typeof rowMetadata.selectable === \"boolean\") {\r\n        return rowMetadata.selectable;\r\n      }\r\n\r\n      var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);\r\n      if (columnMetadata && typeof columnMetadata.selectable === \"boolean\") {\r\n        return columnMetadata.selectable;\r\n      }\r\n\r\n      return columns[cell].selectable;\r\n    }\r\n\r\n    function gotoCell(row, cell, forceEdit) {\r\n      if (!initialized) { return; }\r\n      if (!canCellBeActive(row, cell)) {\r\n        return;\r\n      }\r\n\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return;\r\n      }\r\n\r\n      scrollCellIntoView(row, cell, false);\r\n\r\n      var newCell = getCellNode(row, cell);\r\n\r\n      // if selecting the 'add new' row, start editing right away\r\n      setActiveCellInternal(newCell, forceEdit || (row === getDataLength()) || options.autoEdit);\r\n\r\n      // if no editor was created, set the focus back on the grid\r\n      if (!currentEditor) {\r\n        setFocus();\r\n      }\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // IEditor implementation for the editor lock\r\n\r\n    function commitCurrentEdit() {\r\n      var item = getDataItem(activeRow);\r\n      var column = columns[activeCell];\r\n\r\n      if (currentEditor) {\r\n        if (currentEditor.isValueChanged()) {\r\n          var validationResults = currentEditor.validate();\r\n\r\n          if (validationResults.valid) {\r\n            if (activeRow < getDataLength()) {\r\n              var editCommand = {\r\n                row: activeRow,\r\n                cell: activeCell,\r\n                editor: currentEditor,\r\n                serializedValue: currentEditor.serializeValue(),\r\n                prevSerializedValue: serializedEditorValue,\r\n                execute: function () {\r\n                  this.editor.applyValue(item, this.serializedValue);\r\n                  updateRow(this.row);\r\n                  trigger(self.onCellChange, {\r\n                    row: activeRow,\r\n                    cell: activeCell,\r\n                    item: item\r\n                  });\r\n                },\r\n                undo: function () {\r\n                  this.editor.applyValue(item, this.prevSerializedValue);\r\n                  updateRow(this.row);\r\n                  trigger(self.onCellChange, {\r\n                    row: activeRow,\r\n                    cell: activeCell,\r\n                    item: item\r\n                  });\r\n                }\r\n              };\r\n\r\n              if (options.editCommandHandler) {\r\n                makeActiveCellNormal();\r\n                options.editCommandHandler(item, column, editCommand);\r\n              } else {\r\n                editCommand.execute();\r\n                makeActiveCellNormal();\r\n              }\r\n\r\n            } else {\r\n              var newItem = {};\r\n              currentEditor.applyValue(newItem, currentEditor.serializeValue());\r\n              makeActiveCellNormal();\r\n              trigger(self.onAddNewRow, {item: newItem, column: column});\r\n            }\r\n\r\n            // check whether the lock has been re-acquired by event handlers\r\n            return !getEditorLock().isActive();\r\n          } else {\r\n            // Re-add the CSS class to trigger transitions, if any.\r\n            $(activeCellNode).removeClass(\"invalid\");\r\n            $(activeCellNode).width();  // force layout\r\n            $(activeCellNode).addClass(\"invalid\");\r\n\r\n            trigger(self.onValidationError, {\r\n              editor: currentEditor,\r\n              cellNode: activeCellNode,\r\n              validationResults: validationResults,\r\n              row: activeRow,\r\n              cell: activeCell,\r\n              column: column\r\n            });\r\n\r\n            currentEditor.focus();\r\n            return false;\r\n          }\r\n        }\r\n\r\n        makeActiveCellNormal();\r\n      }\r\n      return true;\r\n    }\r\n\r\n    function cancelCurrentEdit() {\r\n      makeActiveCellNormal();\r\n      return true;\r\n    }\r\n\r\n    function rowsToRanges(rows) {\r\n      var ranges = [];\r\n      var lastCell = columns.length - 1;\r\n      for (var i = 0; i < rows.length; i++) {\r\n        ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n      }\r\n      return ranges;\r\n    }\r\n\r\n    function getSelectedRows() {\r\n      if (!selectionModel) {\r\n        throw \"Selection model is not set\";\r\n      }\r\n      return selectedRows;\r\n    }\r\n\r\n    function setSelectedRows(rows) {\r\n      if (!selectionModel) {\r\n        throw \"Selection model is not set\";\r\n      }\r\n      selectionModel.setSelectedRanges(rowsToRanges(rows));\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Debug\r\n\r\n    this.debug = function () {\r\n      var s = \"\";\r\n\r\n      s += (\"\\n\" + \"counter_rows_rendered:  \" + counter_rows_rendered);\r\n      s += (\"\\n\" + \"counter_rows_removed:  \" + counter_rows_removed);\r\n      s += (\"\\n\" + \"renderedRows:  \" + renderedRows);\r\n      s += (\"\\n\" + \"numVisibleRows:  \" + numVisibleRows);\r\n      s += (\"\\n\" + \"maxSupportedCssHeight:  \" + maxSupportedCssHeight);\r\n      s += (\"\\n\" + \"n(umber of pages):  \" + n);\r\n      s += (\"\\n\" + \"(current) page:  \" + page);\r\n      s += (\"\\n\" + \"page height (ph):  \" + ph);\r\n      s += (\"\\n\" + \"vScrollDir:  \" + vScrollDir);\r\n\r\n      alert(s);\r\n    };\r\n\r\n    // a debug helper to be able to access private members\r\n    this.eval = function (expr) {\r\n      return eval(expr);\r\n    };\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Public API\r\n\r\n    $.extend(this, {\r\n      \"slickGridVersion\": \"2.1\",\r\n\r\n      // Events\r\n      \"onScroll\": new Slick.Event(),\r\n      \"onSort\": new Slick.Event(),\r\n      \"onHeaderMouseEnter\": new Slick.Event(),\r\n      \"onHeaderMouseLeave\": new Slick.Event(),\r\n      \"onHeaderContextMenu\": new Slick.Event(),\r\n      \"onHeaderClick\": new Slick.Event(),\r\n      \"onHeaderCellRendered\": new Slick.Event(),\r\n      \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n      \"onHeaderRowCellRendered\": new Slick.Event(),\r\n      \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n      \"onMouseEnter\": new Slick.Event(),\r\n      \"onMouseLeave\": new Slick.Event(),\r\n      \"onClick\": new Slick.Event(),\r\n      \"onDblClick\": new Slick.Event(),\r\n      \"onContextMenu\": new Slick.Event(),\r\n      \"onKeyDown\": new Slick.Event(),\r\n      \"onAddNewRow\": new Slick.Event(),\r\n      \"onValidationError\": new Slick.Event(),\r\n      \"onViewportChanged\": new Slick.Event(),\r\n      \"onColumnsReordered\": new Slick.Event(),\r\n      \"onColumnsResized\": new Slick.Event(),\r\n      \"onCellChange\": new Slick.Event(),\r\n      \"onBeforeEditCell\": new Slick.Event(),\r\n      \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n      \"onBeforeDestroy\": new Slick.Event(),\r\n      \"onActiveCellChanged\": new Slick.Event(),\r\n      \"onActiveCellPositionChanged\": new Slick.Event(),\r\n      \"onDragInit\": new Slick.Event(),\r\n      \"onDragStart\": new Slick.Event(),\r\n      \"onDrag\": new Slick.Event(),\r\n      \"onDragEnd\": new Slick.Event(),\r\n      \"onSelectedRowsChanged\": new Slick.Event(),\r\n      \"onCellCssStylesChanged\": new Slick.Event(),\r\n\r\n      // Methods\r\n      \"registerPlugin\": registerPlugin,\r\n      \"unregisterPlugin\": unregisterPlugin,\r\n      \"getColumns\": getColumns,\r\n      \"setColumns\": setColumns,\r\n      \"getColumnIndex\": getColumnIndex,\r\n      \"updateColumnHeader\": updateColumnHeader,\r\n      \"setSortColumn\": setSortColumn,\r\n      \"setSortColumns\": setSortColumns,\r\n      \"getSortColumns\": getSortColumns,\r\n      \"autosizeColumns\": autosizeColumns,\r\n      \"getOptions\": getOptions,\r\n      \"setOptions\": setOptions,\r\n      \"getData\": getData,\r\n      \"getDataLength\": getDataLength,\r\n      \"getDataItem\": getDataItem,\r\n      \"setData\": setData,\r\n      \"getSelectionModel\": getSelectionModel,\r\n      \"setSelectionModel\": setSelectionModel,\r\n      \"getSelectedRows\": getSelectedRows,\r\n      \"setSelectedRows\": setSelectedRows,\r\n      \"getContainerNode\": getContainerNode,\r\n\r\n      \"render\": render,\r\n      \"invalidate\": invalidate,\r\n      \"invalidateRow\": invalidateRow,\r\n      \"invalidateRows\": invalidateRows,\r\n      \"invalidateAllRows\": invalidateAllRows,\r\n      \"updateCell\": updateCell,\r\n      \"updateRow\": updateRow,\r\n      \"getViewport\": getVisibleRange,\r\n      \"getRenderedRange\": getRenderedRange,\r\n      \"resizeCanvas\": resizeCanvas,\r\n      \"updateRowCount\": updateRowCount,\r\n      \"scrollRowIntoView\": scrollRowIntoView,\r\n      \"scrollRowToTop\": scrollRowToTop,\r\n      \"scrollCellIntoView\": scrollCellIntoView,\r\n      \"getCanvasNode\": getCanvasNode,\r\n      \"focus\": setFocus,\r\n\r\n      \"getCellFromPoint\": getCellFromPoint,\r\n      \"getCellFromEvent\": getCellFromEvent,\r\n      \"getActiveCell\": getActiveCell,\r\n      \"setActiveCell\": setActiveCell,\r\n      \"getActiveCellNode\": getActiveCellNode,\r\n      \"getActiveCellPosition\": getActiveCellPosition,\r\n      \"resetActiveCell\": resetActiveCell,\r\n      \"editActiveCell\": makeActiveCellEditable,\r\n      \"getCellEditor\": getCellEditor,\r\n      \"getCellNode\": getCellNode,\r\n      \"getCellNodeBox\": getCellNodeBox,\r\n      \"canCellBeSelected\": canCellBeSelected,\r\n      \"canCellBeActive\": canCellBeActive,\r\n      \"navigatePrev\": navigatePrev,\r\n      \"navigateNext\": navigateNext,\r\n      \"navigateUp\": navigateUp,\r\n      \"navigateDown\": navigateDown,\r\n      \"navigateLeft\": navigateLeft,\r\n      \"navigateRight\": navigateRight,\r\n      \"navigatePageUp\": navigatePageUp,\r\n      \"navigatePageDown\": navigatePageDown,\r\n      \"gotoCell\": gotoCell,\r\n      \"getTopPanel\": getTopPanel,\r\n      \"setTopPanelVisibility\": setTopPanelVisibility,\r\n      \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n      \"getHeaderRow\": getHeaderRow,\r\n      \"getHeaderRowColumn\": getHeaderRowColumn,\r\n      \"getGridPosition\": getGridPosition,\r\n      \"flashCell\": flashCell,\r\n      \"addCellCssStyles\": addCellCssStyles,\r\n      \"setCellCssStyles\": setCellCssStyles,\r\n      \"removeCellCssStyles\": removeCellCssStyles,\r\n      \"getCellCssStyles\": getCellCssStyles,\r\n\r\n      \"init\": finishInitialization,\r\n      \"destroy\": destroy,\r\n\r\n      // IEditor implementation\r\n      \"getEditorLock\": getEditorLock,\r\n      \"getEditController\": getEditController\r\n    });\r\n\r\n    init();\r\n  }\r\n}(jQuery));\r\n\n\n/***/ }),\n/* 936 */\n/***/ (function(module, exports) {\n\n(function ($) {\n  // Register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"AutoTooltips\": AutoTooltips\n    }\n  });\n\n  /**\n   * AutoTooltips plugin to show/hide tooltips when columns are too narrow to fit content.\n   * @constructor\n   * @param {boolean} [options.enableForCells=true]        - Enable tooltip for grid cells\n   * @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells\n   * @param {number}  [options.maxToolTipLength=null]      - The maximum length for a tooltip\n   */\n  function AutoTooltips(options) {\n    var _grid;\n    var _self = this;\n    var _defaults = {\n      enableForCells: true,\n      enableForHeaderCells: false,\n      maxToolTipLength: null\n    };\n    \n    /**\n     * Initialize plugin.\n     */\n    function init(grid) {\n      options = $.extend(true, {}, _defaults, options);\n      _grid = grid;\n      if (options.enableForCells) _grid.onMouseEnter.subscribe(handleMouseEnter);\n      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.subscribe(handleHeaderMouseEnter);\n    }\n    \n    /**\n     * Destroy plugin.\n     */\n    function destroy() {\n      if (options.enableForCells) _grid.onMouseEnter.unsubscribe(handleMouseEnter);\n      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.unsubscribe(handleHeaderMouseEnter);\n    }\n    \n    /**\n     * Handle mouse entering grid cell to add/remove tooltip.\n     * @param {jQuery.Event} e - The event\n     */\n    function handleMouseEnter(e) {\n      var cell = _grid.getCellFromEvent(e);\n      if (cell) {\n        var $node = $(_grid.getCellNode(cell.row, cell.cell));\n        var text;\n        if ($node.innerWidth() < $node[0].scrollWidth) {\n          text = $.trim($node.text());\n          if (options.maxToolTipLength && text.length > options.maxToolTipLength) {\n            text = text.substr(0, options.maxToolTipLength - 3) + \"...\";\n          }\n        } else {\n          text = \"\";\n        }\n        $node.attr(\"title\", text);\n      }\n    }\n    \n    /**\n     * Handle mouse entering header cell to add/remove tooltip.\n     * @param {jQuery.Event} e     - The event\n     * @param {object} args.column - The column definition\n     */\n    function handleHeaderMouseEnter(e, args) {\n      var column = args.column,\n          $node = $(e.target).closest(\".slick-header-column\");\n      if (column && !column.toolTip) {\n        $node.attr(\"title\", ($node.innerWidth() < $node[0].scrollWidth) ? column.name : \"\");\n      }\n    }\n    \n    // Public API\n    $.extend(this, {\n      \"init\": init,\n      \"destroy\": destroy\n    });\n  }\n})(jQuery);\n\n\n/***/ }),\n/* 937 */\n/***/ (function(module, exports) {\n\n(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellSelectionModel\": CellSelectionModel\n    }\n  });\n\n\n  function CellSelectionModel(options) {\n    var _grid;\n    var _canvas;\n    var _ranges = [];\n    var _self = this;\n    var _selector = new Slick.CellRangeSelector({\n      \"selectionCss\": {\n        \"border\": \"2px solid black\"\n      }\n    });\n    var _options;\n    var _defaults = {\n      selectActiveCell: true\n    };\n\n\n    function init(grid) {\n      _options = $.extend(true, {}, _defaults, options);\n      _grid = grid;\n      _canvas = _grid.getCanvasNode();\n      _grid.onActiveCellChanged.subscribe(handleActiveCellChange);\n      _grid.onKeyDown.subscribe(handleKeyDown);\n      grid.registerPlugin(_selector);\n      _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);\n      _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);\n    }\n\n    function destroy() {\n      _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);\n      _grid.onKeyDown.unsubscribe(handleKeyDown);\n      _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);\n      _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);\n      _grid.unregisterPlugin(_selector);\n    }\n\n    function removeInvalidRanges(ranges) {\n      var result = [];\n\n      for (var i = 0; i < ranges.length; i++) {\n        var r = ranges[i];\n        if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {\n          result.push(r);\n        }\n      }\n\n      return result;\n    }\n\n    function setSelectedRanges(ranges) {\n      _ranges = removeInvalidRanges(ranges);\n      _self.onSelectedRangesChanged.notify(_ranges);\n    }\n\n    function getSelectedRanges() {\n      return _ranges;\n    }\n\n    function handleBeforeCellRangeSelected(e, args) {\n      if (_grid.getEditorLock().isActive()) {\n        e.stopPropagation();\n        return false;\n      }\n    }\n\n    function handleCellRangeSelected(e, args) {\n      setSelectedRanges([args.range]);\n    }\n\n    function handleActiveCellChange(e, args) {\n      if (_options.selectActiveCell && args.row != null && args.cell != null) {\n        setSelectedRanges([new Slick.Range(args.row, args.cell)]);\n      }\n    }\n    \n    function handleKeyDown(e) {\n      /***\n       * Кey codes\n       * 37 left\n       * 38 up\n       * 39 right\n       * 40 down                     \n       */                                         \n      var ranges, last;\n      var active = _grid.getActiveCell(); \n\n      if ( active && e.shiftKey && !e.ctrlKey && !e.altKey && \n          (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {\n      \n        ranges = getSelectedRanges();\n        if (!ranges.length)\n         ranges.push(new Slick.Range(active.row, active.cell));\n         \n        // keyboard can work with last range only          \n        last = ranges.pop();\n        \n        // can't handle selection out of active cell\n        if (!last.contains(active.row, active.cell))\n          last = new Slick.Range(active.row, active.cell);\n        \n        var dRow = last.toRow - last.fromRow,\n            dCell = last.toCell - last.fromCell,\n            // walking direction\n            dirRow = active.row == last.fromRow ? 1 : -1,\n            dirCell = active.cell == last.fromCell ? 1 : -1;\n                 \n        if (e.which == 37) {\n          dCell -= dirCell; \n        } else if (e.which == 39) {\n          dCell += dirCell ; \n        } else if (e.which == 38) {\n          dRow -= dirRow; \n        } else if (e.which == 40) {\n          dRow += dirRow; \n        }\n        \n        // define new selection range \n        var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);\n        if (removeInvalidRanges([new_last]).length) {\n          ranges.push(new_last);\n          var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\n          var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\n         _grid.scrollRowIntoView(viewRow);\n         _grid.scrollCellIntoView(viewRow, viewCell);\n        }\n        else \n          ranges.push(last);\n\n        setSelectedRanges(ranges);  \n       \n        e.preventDefault();\n        e.stopPropagation();        \n      }           \n    }\n\n    $.extend(this, {\n      \"getSelectedRanges\": getSelectedRanges,\n      \"setSelectedRanges\": setSelectedRanges,\n\n      \"init\": init,\n      \"destroy\": destroy,\n\n      \"onSelectedRangesChanged\": new Slick.Event()\n    });\n  }\n})(jQuery);\n\n\n/***/ }),\n/* 938 */\n/***/ (function(module, exports) {\n\n(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellRangeSelector\": CellRangeSelector\n    }\n  });\n\n\n  function CellRangeSelector(options) {\n    var _grid;\n    var _canvas;\n    var _dragging;\n    var _decorator;\n    var _self = this;\n    var _handler = new Slick.EventHandler();\n    var _defaults = {\n      selectionCss: {\n        \"border\": \"2px dashed blue\"\n      }\n    };\n\n\n    function init(grid) {\n      options = $.extend(true, {}, _defaults, options);\n      _decorator = new Slick.CellRangeDecorator(grid, options);\n      _grid = grid;\n      _canvas = _grid.getCanvasNode();\n      _handler\n        .subscribe(_grid.onDragInit, handleDragInit)\n        .subscribe(_grid.onDragStart, handleDragStart)\n        .subscribe(_grid.onDrag, handleDrag)\n        .subscribe(_grid.onDragEnd, handleDragEnd);\n    }\n\n    function destroy() {\n      _handler.unsubscribeAll();\n    }\n\n    function handleDragInit(e, dd) {\n      // prevent the grid from cancelling drag'n'drop by default\n      e.stopImmediatePropagation();\n    }\n\n    function handleDragStart(e, dd) {\n      var cell = _grid.getCellFromEvent(e);\n      if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {\n        if (_grid.canCellBeSelected(cell.row, cell.cell)) {\n          _dragging = true;\n          e.stopImmediatePropagation();\n        }\n      }\n      if (!_dragging) {\n        return;\n      }\n\n      _grid.focus();\n\n      var start = _grid.getCellFromPoint(\n          dd.startX - $(_canvas).offset().left,\n          dd.startY - $(_canvas).offset().top);\n\n      dd.range = {start: start, end: {}};\n\n      return _decorator.show(new Slick.Range(start.row, start.cell));\n    }\n\n    function handleDrag(e, dd) {\n      if (!_dragging) {\n        return;\n      }\n      e.stopImmediatePropagation();\n\n      var end = _grid.getCellFromPoint(\n          e.pageX - $(_canvas).offset().left,\n          e.pageY - $(_canvas).offset().top);\n\n      if (!_grid.canCellBeSelected(end.row, end.cell)) {\n        return;\n      }\n\n      dd.range.end = end;\n      _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));\n    }\n\n    function handleDragEnd(e, dd) {\n      if (!_dragging) {\n        return;\n      }\n\n      _dragging = false;\n      e.stopImmediatePropagation();\n\n      _decorator.hide();\n      _self.onCellRangeSelected.notify({\n        range: new Slick.Range(\n            dd.range.start.row,\n            dd.range.start.cell,\n            dd.range.end.row,\n            dd.range.end.cell\n        )\n      });\n    }\n\n    $.extend(this, {\n      \"init\": init,\n      \"destroy\": destroy,\n\n      \"onBeforeCellRangeSelected\": new Slick.Event(),\n      \"onCellRangeSelected\": new Slick.Event()\n    });\n  }\n})(jQuery);\n\n/***/ }),\n/* 939 */\n/***/ (function(module, exports) {\n\n(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellRangeDecorator\": CellRangeDecorator\n    }\n  });\n\n  /***\n   * Displays an overlay on top of a given cell range.\n   *\n   * TODO:\n   * Currently, it blocks mouse events to DOM nodes behind it.\n   * Use FF and WebKit-specific \"pointer-events\" CSS style, or some kind of event forwarding.\n   * Could also construct the borders separately using 4 individual DIVs.\n   *\n   * @param {Grid} grid\n   * @param {Object} options\n   */\n  function CellRangeDecorator(grid, options) {\n    var _elem;\n    var _defaults = {\n      selectionCssClass: 'slick-range-decorator',\n      selectionCss: {\n        \"zIndex\": \"9999\",\n        \"border\": \"2px dashed red\"\n      }\n    };\n\n    options = $.extend(true, {}, _defaults, options);\n\n\n    function show(range) {\n      if (!_elem) {\n        _elem = $(\"<div></div>\", {css: options.selectionCss})\n            .addClass(options.selectionCssClass)\n            .css(\"position\", \"absolute\")\n            .appendTo(grid.getCanvasNode());\n      }\n\n      var from = grid.getCellNodeBox(range.fromRow, range.fromCell);\n      var to = grid.getCellNodeBox(range.toRow, range.toCell);\n\n      _elem.css({\n        top: from.top - 1,\n        left: from.left - 1,\n        height: to.bottom - from.top - 2,\n        width: to.right - from.left - 2\n      });\n\n      return _elem;\n    }\n\n    function hide() {\n      if (_elem) {\n        _elem.remove();\n        _elem = null;\n      }\n    }\n\n    $.extend(this, {\n      \"show\": show,\n      \"hide\": hide\n    });\n  }\n})(jQuery);\n\n\n/***/ }),\n/* 940 */\n/***/ (function(module, exports) {\n\n(function ($) {\n    // register namespace\n    $.extend(true, window, {\n      \"Slick\": {\n        \"CellExternalCopyManager\": CellExternalCopyManager\n      }\n    });\n  \n  \n    function CellExternalCopyManager(options) {\n      /*\n        This manager enables users to copy/paste data from/to an external Spreadsheet application\n        such as MS-Excel® or OpenOffice-Spreadsheet.\n        \n        Since it is not possible to access directly the clipboard in javascript, the plugin uses\n        a trick to do it's job. After detecting the keystroke, we dynamically create a textarea\n        where the browser copies/pastes the serialized data. \n        \n        options:\n          copiedCellStyle : sets the css className used for copied cells. default : \"copied\"\n          copiedCellStyleLayerKey : sets the layer key for setting css values of copied cells. default : \"copy-manager\"\n          dataItemColumnValueExtractor : option to specify a custom column value extractor function\n          dataItemColumnValueSetter : option to specify a custom column value setter function\n          clipboardCommandHandler : option to specify a custom handler for paste actions\n          includeHeaderWhenCopying : set to true and the plugin will take the name property from each column (which is usually what appears in your header) and put that as the first row of the text that's copied to the clipboard\n          bodyElement: option to specify a custom DOM element which to will be added the hidden textbox. It's useful if the grid is inside a modal dialog.\n          onCopyInit: optional handler to run when copy action initializes\n          onCopySuccess: optional handler to run when copy action is complete\n          newRowCreator: function to add rows to table if paste overflows bottom of table, if this function is not provided new rows will be ignored.\n          readOnlyMode: suppresses paste\n      */\n      var _grid;\n      var _self = this;\n      var _copiedRanges;\n      var _options = options || {};\n      var _copiedCellStyleLayerKey = _options.copiedCellStyleLayerKey || \"copy-manager\";\n      var _copiedCellStyle = _options.copiedCellStyle || \"copied\";\n      var _clearCopyTI = 0;\n      var _bodyElement = _options.bodyElement || document.body;\n      var _onCopyInit = _options.onCopyInit || null;\n      var _onCopySuccess = _options.onCopySuccess || null;\n      \n      var keyCodes = {\n        'C': 67,\n        'V': 86,\n        'ESC': 27,\n        'INSERT': 45\n      };\n  \n      function init(grid) {\n        _grid = grid;\n        _grid.onKeyDown.subscribe(handleKeyDown);\n        \n        // we need a cell selection model\n        var cellSelectionModel = grid.getSelectionModel();\n        if (!cellSelectionModel){\n          throw new Error(\"Selection model is mandatory for this plugin. Please set a selection model on the grid before adding this plugin: grid.setSelectionModel(new Slick.CellSelectionModel())\");\n        }\n        // we give focus on the grid when a selection is done on it.\n        // without this, if the user selects a range of cell without giving focus on a particular cell, the grid doesn't get the focus and key stroke handles (ctrl+c) don't work\n        cellSelectionModel.onSelectedRangesChanged.subscribe(function(e, args){\n          _grid.focus();\n        });\n      }\n  \n      function destroy() {\n        _grid.onKeyDown.unsubscribe(handleKeyDown);\n      }\n      \n      function getDataItemValueForColumn(item, columnDef) {\n        if (_options.dataItemColumnValueExtractor) {\n          var dataItemColumnValueExtractorValue = _options.dataItemColumnValueExtractor(item, columnDef);\n  \n          if (dataItemColumnValueExtractorValue)\n            return dataItemColumnValueExtractorValue;\n        }\n  \n        var retVal = '';\n  \n        // if a custom getter is not defined, we call serializeValue of the editor to serialize\n        if (columnDef.editor){\n          var editorArgs = {\n            'container':$(\"<p>\"),  // a dummy container\n            'column':columnDef,\n            'position':{'top':0, 'left':0},  // a dummy position required by some editors\n            'grid':_grid\n          };\n          var editor = new columnDef.editor(editorArgs);\n          editor.loadValue(item);\n          retVal = editor.serializeValue();\n          editor.destroy();\n        } else {\n          retVal = item[columnDef.field];\n        }\n  \n        return retVal;\n      }\n      \n      function setDataItemValueForColumn(item, columnDef, value) {\n        if (_options.dataItemColumnValueSetter) {\n          return _options.dataItemColumnValueSetter(item, columnDef, value);\n        }\n  \n        // if a custom setter is not defined, we call applyValue of the editor to unserialize\n        if (columnDef.editor){\n          var editorArgs = {\n            'container':$(\"body\"),  // a dummy container\n            'column':columnDef,\n            'position':{'top':0, 'left':0},  // a dummy position required by some editors\n            'grid':_grid\n          };\n          var editor = new columnDef.editor(editorArgs);\n          editor.loadValue(item);\n          editor.applyValue(item, value);\n          editor.destroy();\n        } else {\n          item[columnDef.field] = value;\n        }\n      }\n      \n      \n      function _createTextBox(innerText){\n        var ta = document.createElement('textarea');\n        ta.style.position = 'absolute';\n        ta.style.left = '-1000px';\n        ta.style.top = document.body.scrollTop + 'px';\n        ta.value = innerText;\n        _bodyElement.appendChild(ta);\n        ta.select();\n        \n        return ta;\n      }\n      \n      function _decodeTabularData(_grid, ta){\n        var columns = _grid.getColumns();\n        var clipText = ta.value;\n        var clipRows = clipText.split(/[\\n\\f\\r]/);\n        // trim trailing CR if present\n        if (clipRows[clipRows.length - 1]==\"\") { clipRows.pop(); }\n        \n        var clippedRange = [];\n        var j = 0;\n        \n        _bodyElement.removeChild(ta);\n        for (var i=0; i<clipRows.length; i++) {\n          if (clipRows[i]!=\"\")\n            clippedRange[j++] = clipRows[i].split(\"\\t\");\n            else\n            clippedRange[i] = [\"\"];\n        }\n        var selectedCell = _grid.getActiveCell();\n        var ranges = _grid.getSelectionModel().getSelectedRanges();\n        var selectedRange = ranges && ranges.length ? ranges[0] : null;   // pick only one selection\n        var activeRow = null;\n        var activeCell = null;\n        \n        if (selectedRange){\n          activeRow = selectedRange.fromRow;\n          activeCell = selectedRange.fromCell;\n        } else if (selectedCell){\n          activeRow = selectedCell.row;\n          activeCell = selectedCell.cell;\n        } else {\n          // we don't know where to paste\n          return;\n        }\n        \n        var oneCellToMultiple = false;\n        var destH = clippedRange.length;\n        var destW = clippedRange.length ? clippedRange[0].length : 0;\n        if (clippedRange.length == 1 && clippedRange[0].length == 1 && selectedRange){\n          oneCellToMultiple = true;\n          destH = selectedRange.toRow - selectedRange.fromRow +1;\n          destW = selectedRange.toCell - selectedRange.fromCell +1;\n        }\n        var availableRows = _grid.getData().length - activeRow;\n        var addRows = 0;\n  \n        // ignore new rows if we don't have a \"newRowCreator\"\n        if(availableRows < destH && _options.newRowCreator)\n        {\n          var d = _grid.getData();\n          for(addRows = 1; addRows <= destH - availableRows; addRows++)\n            d.push({});\n          _grid.setData(d);\n          _grid.render();\n        }\n  \n        var overflowsBottomOfGrid = activeRow + destH > _grid.getDataLength();\n  \n        if (_options.newRowCreator && overflowsBottomOfGrid) {\n  \n          var newRowsNeeded = activeRow + destH - _grid.getDataLength();\n  \n          _options.newRowCreator(newRowsNeeded);\n  \n        }\n  \n        var clipCommand = {\n  \n          isClipboardCommand: true,\n          clippedRange: clippedRange,\n          oldValues: [],\n          cellExternalCopyManager: _self,\n          _options: _options,\n          setDataItemValueForColumn: setDataItemValueForColumn,\n          markCopySelection: markCopySelection,\n          oneCellToMultiple: oneCellToMultiple,\n          activeRow: activeRow,\n          activeCell: activeCell,\n          destH: destH,\n          destW: destW,\n          maxDestY: _grid.getDataLength(),\n          maxDestX: _grid.getColumns().length,\n          h: 0,\n          w: 0,\n            \n          execute: function() {\n            this.h=0;\n            for (var y = 0; y < this.destH; y++){\n              this.oldValues[y] = [];\n              this.w=0;\n              this.h++;\n              for (var x = 0; x < this.destW; x++){\n                this.w++;\n                var desty = activeRow + y;\n                var destx = activeCell + x;\n                \n                if (desty < this.maxDestY && destx < this.maxDestX ) {\n                  var nd = _grid.getCellNode(desty, destx);\n                  var dt = _grid.getDataItem(desty);\n                  this.oldValues[y][x] = dt[columns[destx]['field']];\n                  if (oneCellToMultiple)\n                    this.setDataItemValueForColumn(dt, columns[destx], clippedRange[0][0]);\n                  else\n                    this.setDataItemValueForColumn(dt, columns[destx], clippedRange[y] ? clippedRange[y][x] : '');\n                  _grid.updateCell(desty, destx);\n                  _grid.onCellChange.notify({\n                      row: desty,\n                      cell: destx,\n                      item: dt,\n                      grid: _grid\n                  });\n  \n                }\n              }\n            }\n            \n            var bRange = {\n              'fromCell': activeCell,\n              'fromRow': activeRow,\n              'toCell': activeCell+this.w-1,\n              'toRow': activeRow+this.h-1\n            }\n  \n            this.markCopySelection([bRange]);\n            _grid.getSelectionModel().setSelectedRanges([bRange]);\n            this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});\n          },\n  \n          undo: function() {\n            for (var y = 0; y < this.destH; y++){\n              for (var x = 0; x < this.destW; x++){\n                var desty = activeRow + y;\n                var destx = activeCell + x;\n                \n                if (desty < this.maxDestY && destx < this.maxDestX ) {\n                  var nd = _grid.getCellNode(desty, destx);\n                  var dt = _grid.getDataItem(desty);\n                  if (oneCellToMultiple)\n                    this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[0][0]);\n                  else\n                    this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[y][x]);\n                  _grid.updateCell(desty, destx);\n                  _grid.onCellChange.notify({\n                      row: desty,\n                      cell: destx,\n                      item: dt,\n                      grid: _grid\n                  });\n                }\n              }\n            }\n            \n            var bRange = {\n              'fromCell': activeCell,\n              'fromRow': activeRow,\n              'toCell': activeCell+this.w-1,\n              'toRow': activeRow+this.h-1\n            }\n  \n            this.markCopySelection([bRange]);\n            _grid.getSelectionModel().setSelectedRanges([bRange]);\n            this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});\n            \n            if(addRows > 1){            \n              var d = _grid.getData();\n              for(; addRows > 1; addRows--)\n                d.splice(d.length - 1, 1);\n              _grid.setData(d);\n              _grid.render();\n            }\n          }\n        };\n  \n        if(_options.clipboardCommandHandler) {\n          _options.clipboardCommandHandler(clipCommand);\n        }\n        else {\n          clipCommand.execute();\n        }\n      }\n      \n      \n      function handleKeyDown(e, args) {\n        var ranges;\n        if (!_grid.getEditorLock().isActive() || _grid.getOptions().autoEdit) {\n          if (e.which == keyCodes.ESC) {\n            if (_copiedRanges) {\n              e.preventDefault();\n              clearCopySelection();\n              _self.onCopyCancelled.notify({ranges: _copiedRanges});\n              _copiedRanges = null;\n            }\n          }\n  \n          if ((e.which === keyCodes.C || e.which === keyCodes.INSERT) && (e.ctrlKey || e.metaKey) && !e.shiftKey) {    // CTRL+C or CTRL+INS\n            if (_onCopyInit) {\n              _onCopyInit.call();\n            }\n            ranges = _grid.getSelectionModel().getSelectedRanges();\n            if (ranges.length != 0) {\n              _copiedRanges = ranges;\n              markCopySelection(ranges);\n              _self.onCopyCells.notify({ranges: ranges});\n              \n              var columns = _grid.getColumns();\n              var clipText = \"\";\n  \n              for (var rg = 0; rg < ranges.length; rg++){\n                  var range = ranges[rg];\n                  var clipTextRows = [];\n                  for (var i=range.fromRow; i< range.toRow+1 ; i++){\n                      var clipTextCells = [];\n                      var dt = _grid.getDataItem(i);\n                      \n                      if (clipTextRows == \"\" && _options.includeHeaderWhenCopying) {\n                          var clipTextHeaders = [];\n                          for (var j = range.fromCell; j < range.toCell + 1 ; j++) {\n                              if (columns[j].name.length > 0)\n                                  clipTextHeaders.push(columns[j].name);\n                          }\n                          clipTextRows.push(clipTextHeaders.join(\"\\t\"));\n                      }\n  \n                      for (var j=range.fromCell; j< range.toCell+1 ; j++){\n                          clipTextCells.push(getDataItemValueForColumn(dt, columns[j]));\n                      }\n                      clipTextRows.push(clipTextCells.join(\"\\t\"));\n                  }\n                  clipText += clipTextRows.join(\"\\r\\n\") + \"\\r\\n\";\n              }\n              \n              if(window.clipboardData) {\n                  window.clipboardData.setData(\"Text\", clipText);\n                  return true;\n              }\n              else {\n                  var focusEl = document.activeElement;\n  \n                  var ta = _createTextBox(clipText);\n  \n                  ta.focus();\n                  \n                  setTimeout(function(){\n                       _bodyElement.removeChild(ta);\n                      // restore focus\n                      if (focusEl)\n                          focusEl.focus();\n                      else\n                          console.log(\"Not element to restore focus to after copy?\");\n  \n                  }, 100);\n  \n                  if (_onCopySuccess) {\n                      var rowCount = 0;\n                      // If it's cell selection, use the toRow/fromRow fields\n                      if (ranges.length === 1) {\n                          rowCount = (ranges[0].toRow + 1) - ranges[0].fromRow;\n                      }\n                      else {\n                          rowCount = ranges.length;\n                      }\n                      _onCopySuccess.call(this, rowCount);\n                  }\n  \n                  return false;\n              }\n            }\n          }\n  \n          if (!_options.readOnlyMode && (\n           (e.which === keyCodes.V && (e.ctrlKey || e.metaKey) && !e.shiftKey)\n            || (e.which === keyCodes.INSERT && e.shiftKey && !e.ctrlKey)\n           )) {    // CTRL+V or Shift+INS\n              var ta = _createTextBox('');\n              \n              setTimeout(function(){\n                  _decodeTabularData(_grid, ta);\n              }, 100);\n              \n              return false;\n          }\n        }\n      }\n  \n      function markCopySelection(ranges) {\n        clearCopySelection();\n        \n        var columns = _grid.getColumns();\n        var hash = {};\n        for (var i = 0; i < ranges.length; i++) {\n          for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n            hash[j] = {};\n            for (var k = ranges[i].fromCell; k <= ranges[i].toCell && k<columns.length; k++) {\n              hash[j][columns[k].id] = _copiedCellStyle;\n            }\n          }\n        }\n        _grid.setCellCssStyles(_copiedCellStyleLayerKey, hash);\n        clearTimeout(_clearCopyTI);\n        _clearCopyTI = setTimeout(function(){\n          _self.clearCopySelection();\n        }, 2000);\n      }\n  \n      function clearCopySelection() {\n        _grid.removeCellCssStyles(_copiedCellStyleLayerKey);\n      }\n  \n      $.extend(this, {\n        \"init\": init,\n        \"destroy\": destroy,\n        \"clearCopySelection\": clearCopySelection,\n        \"handleKeyDown\":handleKeyDown,\n        \n        \"onCopyCells\": new Slick.Event(),\n        \"onCopyCancelled\": new Slick.Event(),\n        \"onPasteCells\": new Slick.Event()\n      });\n    }\n  })(jQuery);\n\n/***/ }),\n/* 941 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _contextmenu = __webpack_require__(264);\n\nvar _contextmenu2 = _interopRequireDefault(_contextmenu);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _config = __webpack_require__(146);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction CheckbookContextMenu(options) {\n    _contextmenu2.default.call(this, options);\n}\n_lodash2.default.extend(CheckbookContextMenu.prototype, _contextmenu2.default.prototype, {\n    hasRequiredFields: function hasRequiredFields(data) {\n        if (!data) {\n            return false;\n        }\n        var requiredFields = _config2.default.CheckSettings.requiredFields;\n        //this will loop through all until it finds a false value\n        return requiredFields.every(function (field) {\n            return data.hasOwnProperty(field) && data[field];\n        });\n    },\n    handleClick: function handleClick(ev) {\n        var data = (0, _jquery2.default)(ev.currentTarget).data();\n        if (data.type === 'check') {\n            //call an action creator with the check data\n            _grid_report_actions2.default.showCheckImagePanel(data.value.quasiId, this.queryModel._q, this.grid.options.meta.id, true, data.value.row);\n            this.hideMenu();\n            return;\n        }\n        _contextmenu2.default.prototype.handleClick.call(this, ev);\n    },\n    handleContextMenu: function handleContextMenu(e) {\n        var cell = this.grid.getCellFromEvent(e);\n        var columns = this.grid.getColumns();\n        var column = columns[cell.cell];\n        var row = this.grid.getDataItem(cell.row);\n        var quasiId = row.quasi_id;\n        var amountColumn = _grid_report_store2.default.getState().getIn(['schema', 'amountColumn']);\n        var rowAmount = row[amountColumn] && _utils2.default.parseMonetary(row[amountColumn]);\n        _contextmenu2.default.prototype.handleContextMenu.call(this, e);\n        if (quasiId && typeof rowAmount === 'number' && rowAmount >= 0) {\n            var elementData = _lodash2.default.extend({\n                column: column\n            }, {\n                label: 'View Check Details',\n                operator: 'null',\n                type: 'check'\n            });\n            elementData.value = { quasiId: quasiId, row: cell.row };\n            (0, _jquery2.default)('<div class=\"dropdown__row check-image__toggle js-select-option\"></div>').data(elementData).text(elementData.label).appendTo(this.menu);\n        }\n    }\n});\nexports.default = CheckbookContextMenu;\n\n/***/ }),\n/* 942 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _querymodel = __webpack_require__(260);\n\nvar _querymodel2 = _interopRequireDefault(_querymodel);\n\nvar _remotemodel = __webpack_require__(263);\n\nvar _remotemodel2 = _interopRequireDefault(_remotemodel);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _sort_selector = __webpack_require__(265);\n\nvar _sort_selector2 = _interopRequireDefault(_sort_selector);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// also known as the Aggregates panel\n/** @class FacetPanel */\nvar FacetPanel = og.View.extend(\n/** @lends FacetPanel# */\n{\n    template: 'griddle/panel_aggregates',\n    placeholder: 'subpanel',\n    events: {\n        'click .js-select-group': 'onGroupClick',\n        'click .js-recalculate': 'onRecalculate'\n    },\n    stats: [{ id: 'count', name: 'Show Count' }, { id: 'sum', name: 'Show Total' }, { id: 'avg', name: 'Show Avg' }, { id: 'min', name: 'Show Min' }, { id: 'max', name: 'Show Max' }],\n    sorts: [{ id: 'name-asc', name: 'Sort A-Z' }, { id: 'name-desc', name: 'Sort Z-A' }, { id: 'value-asc', name: 'Sort 0-9' }, { id: 'value-desc', name: 'Sort 9-0' }],\n    initialize: function initialize(options) {\n        this.options = options;\n        this.state = _lodash2.default.extend({\n            group: 'Amount',\n            stat: 'count',\n            value: 'Amount',\n            sort: 'value-desc',\n            initialLoad: true,\n            scrollPosition: 0\n        }, options.state || {});\n        this.queryModel = new _querymodel2.default();\n        this.loader = new _remotemodel2.default({\n            endpoint: options.endpoint,\n            queryModel: this.queryModel\n        });\n        _lodash2.default.bindAll(this, 'onDataLoaded', 'onGroupChange', 'onSelectChange', 'onGroupClick');\n    },\n\n    /** Initialize the plugin, called by slickgrid when registering */\n    init: function init(grid) {\n        this.grid = grid;\n        this.previousStat = 'count';\n        this.listenTo(this.loader, 'loaded', this.onDataLoaded, this);\n        this.listenTo(this.loader, 'loading', this.onDataLoading, this);\n        this.listenTo(this.grid, 'group', this.onGroupChange, this);\n        this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n        this.listenTo(this.grid.loader.queryModel, 'change', this.onQueryChange, this);\n        this.queryModel.setQuery(this.getQuery(), true);\n        this.onDataLoaded({ q: this.getQuery(), initial: true });\n        this.render();\n    },\n\n    /** Render */\n    render: function render() {\n        var groups = _lodash2.default.sortBy(_lodash2.default.map(this.options.grid.getAllColumns(), function (col, idx) {\n            return { id: idx, field: col.id, name: col.label, visible: col.visible };\n        }), 'name');\n        this.view('group', 'group', new _sort_selector2.default({\n            template: 'griddle/select_box',\n            placeholder: 'select_box',\n            selected: _lodash2.default.find(groups, { field: this.state.group }).id,\n            items: groups\n        })).on('change', function (id) {\n            this.state.group = this.view('group__group').collection.get(id).get('field');\n            this.onQueryChange();\n            this.trigger('action', 'change-group', id);\n        }, this);\n        this.view('stat', 'stat', new _sort_selector2.default({\n            template: 'griddle/select_box',\n            placeholder: 'select_box',\n            className: 'select-box_half-right',\n            selected: this.state.stat,\n            items: this.stats\n        })).on('change', function (id) {\n            this.state.stat = id;\n            this.onQueryChange();\n            this.trigger('action', 'change-stat', id);\n        }, this);\n        this.view('sort', 'sort', new _sort_selector2.default({\n            template: 'griddle/select_box',\n            placeholder: 'select_box',\n            className: 'select-box_half-left',\n            selected: this.state.sort,\n            items: this.sorts\n        })).on('change', function (id) {\n            this.state.sort = id;\n            this.onQueryChange();\n            this.trigger('action', 'change-sort', id);\n        }, this);\n        og.View.prototype.render.call(this);\n    },\n\n    /** @protected */\n    onDataLoaded: function onDataLoaded(args) {\n        var state = this.state;\n        var grouping = {\n            column_name: args.q.group,\n            count: _utils2.default.formatNumberComma(args.count),\n            initialLoad: state.initialLoad,\n            rows: []\n        };\n        var fullColumn = _lodash2.default.find(this.options.columns, { name: args.q.group }) || {};\n        // Copy group by column information\n        for (var i = 0; i < this.loader.dataLength; i += 1) {\n            var row = this.loader.data[i];\n            var statRow = {\n                group_name: row[args.q.group] || row[_lodash2.default.head(args.q.fields)] || '<- Blank ->',\n                column_name: args.q.group,\n                resolution: row.resolution,\n                stat: null\n            };\n            if (state.stat === 'count') {\n                statRow.stat = row.count;\n            } else {\n                statRow.stat = _utils2.default.formatFloatNumberComma(row[state.value + '_' + state.stat]);\n            }\n            if (fullColumn.type === 'percent') {\n                statRow.group_name = _utils2.default.formatPercent(statRow.group_name);\n            }\n            grouping.rows.push(statRow);\n        }\n        if (this.loader.dataLength !== this.loader.data.length) {\n            grouping.rows.push({ group_name: '...' });\n        }\n        this._viewData = grouping;\n        this.render();\n        this.$el.parent().scrollTop(this.state.scrollPosition);\n        this.state.scrollPosition = 0;\n    },\n    onDataLoading: function onDataLoading() {\n        this.$el.find('.js-recalculate').addClass('loading');\n    },\n\n    /** Handle when groupin is changed\r\n        @protected */\n    onGroupChange: function onGroupChange(column) {\n        this.state.group = column;\n        this.queryModel.setQuery(this.getQuery());\n        this.loader.clear();\n        this.loader.ensureData(0, 1);\n        // TODO tie this object into a Backbone element of Athena\n        window.athena.filterMenu.open('groups', true);\n    },\n\n    /** @protected */\n    onSelectChange: function onSelectChange() {\n        this.queryModel.setQuery(this.getQuery());\n        this.loader.clear();\n        this.state.initialLoad = false;\n        this.loader.ensureData(0, 1);\n    },\n    onRecalculate: function onRecalculate(ev) {\n        // do not change when button is disabled\n        if ((0, _jquery2.default)(ev.target).is('.disabled')) {\n            return;\n        }\n        this.$el.find('.js-recalculate').addClass('disabled');\n        this.onSelectChange();\n        this.trigger('action', 'recalculate');\n        //  set previous stat on recalculate\n        this.previousStat = this.state.stat;\n    },\n    onQueryChange: function onQueryChange() {\n        //  Check if query is changed or the stat dropdown is changed\n        var diff = !_lodash2.default.isEqual(this.queryModel.toJSON(), this.getQuery()) || !_lodash2.default.isEqual(this.previousStat, this.state.stat);\n        this.$el.find('.js-select-group').toggleClass('aggregate-item_outdated', diff);\n        if (!this.state.initialLoad) {\n            this.$el.find('.js-recalculate').toggleClass('disabled', !diff);\n        }\n    },\n\n    /** @protected */\n    onGroupClick: function onGroupClick(e) {\n        var locale = this.grid.locale;\n        var data = (0, _jquery2.default)(e.currentTarget).data();\n        var fullColumn = _lodash2.default.find(this.options.columns, function (c) {\n            return c.name === data.column;\n        }) || {};\n        var eqVal = void 0;\n        var leVal = void 0;\n        var geVal = void 0;\n        switch (fullColumn.type) {\n            case 'text':\n                eqVal = data.group.toString();\n                break;\n            case 'date':\n                var formatter = _utils2.default.getInputFormatter(fullColumn, locale);\n                if (data.resolution === 'YYYY-MM-DD') {\n                    eqVal = formatter(data.group.toString(), data.resolution);\n                } else {\n                    geVal = formatter(data.group.toString(), data.resolution);\n                    var dateSplit = data.group.toString().split('-');\n                    dateSplit[dateSplit.length - 1] = (parseInt(dateSplit[dateSplit.length - 1], 10) + 1).toString();\n                    leVal = formatter(dateSplit.join('-'), data.resolution);\n                }\n                break;\n            case 'monetary':\n            case 'numeric':\n                var resolution = data.resolution === null || data.resolution === '' ? null : parseInt(data.resolution, 10);\n                var sign = resolution < 0 ? -1 : 1;\n                if (resolution === null) {\n                    eqVal = parseFloat(data.group);\n                } else if (resolution === 0) {\n                    eqVal = 0;\n                } else if (resolution === 1 || resolution === -1) {\n                    leVal = sign < 0 ? 0 : 1;\n                    geVal = sign < 0 ? -1 : 0;\n                } else {\n                    leVal = sign * Math.pow(10, Math.abs(resolution) + (sign < 0 ? -2 : -1));\n                    geVal = sign * Math.pow(10, Math.abs(resolution) + (sign < 0 ? -1 : -2));\n                }\n                break;\n            default:\n                // load more results\n                this.state.scrollPosition = this.$el.parent().scrollTop();\n                this.loader.ensureData(this.loader.dataLength, this.loader.dataLength + 1);\n                return;\n        }\n        this.grid.loader.queryModel.beginUpdate();\n        this.grid.loader.queryModel.filterColumn(data.column, 'contains', undefined);\n        this.grid.loader.queryModel.filterColumn(data.column, 'eq', eqVal);\n        this.grid.loader.queryModel.filterColumn(data.column, 'le', leVal);\n        this.grid.loader.queryModel.filterColumn(data.column, 'ge', geVal);\n        this.grid.loader.queryModel.endUpdate();\n        this.trigger('action', 'select-group');\n    },\n\n    /** Get query based on state */\n    getQuery: function getQuery() {\n        var q = _lodash2.default.extend(this.grid.loader.queryModel.toJSON(), {\n            fields: [this.state.value],\n            group: this.state.group,\n            sort: [{}]\n        });\n        var sorts = this.state.sort.split('-');\n        var sort_name = this.state.value + '_' + this.state.stat;\n        if (sorts[0] === 'name') {\n            sort_name = this.state.group;\n        } else if (this.state.stat === 'count') {\n            sort_name = 'count';\n        }\n        q.sort[0][sort_name] = sorts[1];\n        return q;\n    }\n});\nexports.default = FacetPanel;\n\n/***/ }),\n/* 943 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = og.View.extend({\n    noEscape: false,\n    initialize: function initialize(options) {\n        this.enabled = options.enabled || true;\n        this.enableAll = options.enableAll || false;\n        this.collection = this.collection || new _backbone2.default.Collection(options.items);\n        if (options.noEscape) {\n            this.noEscape = this.options.noEscape;\n        }\n        if (options.selected || options.selected === 0) {\n            this.setValue(options.selected);\n        }\n        this.registerCloseItem();\n        this.listenTo(this.collection, 'reset', this.onItemsChange);\n    },\n    setItems: function setItems(items) {\n        this.collection.reset(items);\n    },\n    onItemsChange: function onItemsChange() {\n        this.render();\n    },\n    close: function close() {\n        this.isOpen = false;\n        this.$('.js-select').removeClass('active');\n    },\n    open: function open() {\n        this.isOpen = true;\n        this.$('.js-select').addClass('active');\n    },\n    updateItem: function updateItem(id, attributes) {\n        this.collection.get(id).set(attributes);\n        this.onItemsChange();\n    },\n    setValue: function setValue(id) {\n        var prevSelected = this.selected;\n        var newlySelected = this.collection.get(id);\n        if (newlySelected && newlySelected !== prevSelected) {\n            if (prevSelected) {\n                prevSelected.set('active', false);\n            }\n            newlySelected.set('active', true);\n            this.selected = newlySelected;\n            this.renderSelected();\n        }\n    },\n    renderSelected: function renderSelected() {\n        var selected = this.selected;\n        var name = selected ? selected.get('name') : '';\n        var el = this.$('.js-select-selected');\n        this.noEscape ? el.html(name) : el.text(name);\n        this.$('.js-select-option').removeClass('active');\n        if (selected) {\n            this.$('.js-item_' + selected.id).addClass('active');\n        }\n    },\n    setTextSize: function setTextSize(size) {\n        this.$('.js-select').toggleClass('has-small-text', size === 'small');\n    },\n    viewData: function viewData() {\n        return _lodash2.default.assign({}, this, { items: this.collection.toJSON() });\n    },\n    render: function render() {\n        og.View.prototype.render.call(this);\n        this.renderSelected();\n    },\n\n    events: {\n        'click .js-select': function clickJsSelect(evt) {\n            if (!this.enabled) {\n                return;\n            }\n            this.selfClicked = true;\n            if ((0, _jquery2.default)(evt.currentTarget).hasClass('active')) {\n                this.close();\n            } else {\n                this.open();\n            }\n        },\n        'click .js-select-option': function clickJsSelectOption(evt) {\n            var id = (0, _jquery2.default)(evt.currentTarget).data('val');\n            this.setValue(id);\n            this.trigger('change', id);\n        }\n    }\n});\n\n/***/ }),\n/* 944 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _querymodel = __webpack_require__(260);\n\nvar _querymodel2 = _interopRequireDefault(_querymodel);\n\nvar _sort_selector = __webpack_require__(265);\n\nvar _sort_selector2 = _interopRequireDefault(_sort_selector);\n\nvar _bootstrapDatepicker = __webpack_require__(519);\n\nvar _bootstrapDatepicker2 = _interopRequireDefault(_bootstrapDatepicker);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FiltersPanel = og.View.extend({\n    template: 'griddle/panel_filters',\n    placeholder: 'subpanel',\n    events: {\n        'click .js-remove': 'onFilterRemove',\n        'click .js-clear': 'onFilterClear',\n        'click .js-field': 'onFilterField',\n        'click .js-operator': 'onFilterOperator',\n        'keyup .js-value': 'onFilterInput',\n        'keyup .js-search-input': 'allKeyup',\n        'click .js-search-clear': 'onSearchClear',\n        'click .js-apply': 'setFilters'\n    },\n    queryModel: null,\n    grid: null,\n    labels: {\n        eq: 'equal to',\n        ne: 'not',\n        gt: 'greater than',\n        ge: 'at least',\n        lt: 'less than',\n        le: 'at most',\n        null: 'blank',\n        notnull: 'not blank',\n        contains: 'contains',\n        fy: 'fiscal year',\n        xyz: 'within last # of days'\n    },\n    columnFilters: {\n        default: ['eq', 'ne', 'ge', 'le', 'null', 'notnull'],\n        date: ['eq', 'ne', 'ge', 'le', 'null', 'notnull', 'xyz'],\n        text: ['contains', 'eq', 'ne', 'null', 'notnull']\n    },\n    initialize: function initialize(options) {\n        this.options = options || {};\n        _lodash2.default.bindAll(this, 'update', 'onFilterAdd', 'onFilterRemove', 'onFilterClear', 'onFilterField', 'onFilterOperator', 'onMenuSelect', 'setFilters', 'onFilterInput', 'removeFilter');\n        this._viewData = {};\n    },\n\n    /** Initialize the plugin, called by slicgrid when registering */\n    init: function init(grid) {\n        this.queryModel = this.options.queryModel;\n        this.grid = grid;\n        this.listenTo(this.queryModel, 'change', this.update, this);\n        this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n        // we have extra querymodel to keep track of the internal filter state\n        this.stateQueryModel = new _querymodel2.default();\n        this.update();\n    },\n\n    /** Destroy the plugin, called by slickgrid */\n    destroy: function destroy() {\n        this.remove();\n    },\n    buildFilters: function buildFilters() {\n        var locale = this.grid.locale;\n        var filters = [];\n        var qmFilters = this.queryModel._q.filter;\n        _lodash2.default.each(qmFilters, _lodash2.default.bind(function (filter, field) {\n            _lodash2.default.each(filter, _lodash2.default.bind(function (value, operator) {\n                if (field === 'all') {\n                    return;\n                }\n                var column = this.getColumnById(field);\n                if (!column) {\n                    return;\n                }\n                var f = {\n                    field: field,\n                    friendlyName: column.name,\n                    operator: operator,\n                    value: value,\n                    valueLabel: _utils2.default.getInputFormatter(column, locale)(value),\n                    operatorLabel: this.labels[operator]\n                };\n                filters.push(f);\n            }, this));\n        }, this));\n        this._viewData.filters = filters;\n        this._viewData.searchAll = this.queryModel.getColumnQuery('all').filter.contains || '';\n        return filters;\n    },\n    updateFilterCount: function updateFilterCount() {\n        var count = _lodash2.default.size(this.filters) + (this.queryModel.getColumnQuery('all').filter.contains ? 1 : 0);\n        (0, _jquery2.default)('#filter-annotation_filters').text(count || '');\n    },\n    update: function update() {\n        // detect if a datepicker is shown and do not rerender if it is\n        var datepickerVisible = false;\n        this.$el.find('input').each(function () {\n            if ((0, _jquery2.default)(this).data('datepicker') && (0, _jquery2.default)(this).data('datepicker').picker.is(':visible')) {\n                datepickerVisible = true;\n            }\n        });\n        if (datepickerVisible) {\n            return;\n        }\n        // remove datepicker instances so they are not dangling in the DOM\n        this.$el.find('input').each(function () {\n            if ((0, _jquery2.default)(this).data('datepicker')) {\n                (0, _jquery2.default)(this).data('datepicker').picker.remove();\n            }\n        });\n        this.filters = this.buildFilters();\n        this.updateFilterCount();\n        this.render();\n    },\n    render: function render() {\n        var sortedColumns = _lodash2.default.sortBy(_lodash2.default.map(this.grid.getAllColumns(), function (col, idx) {\n            return { id: idx, field: col.id, name: col.label, visible: col.visible };\n        }), 'name');\n        this.view('add_filter', new _sort_selector2.default({\n            className: 'select-box-wrapper_inline select-box-wrapper_center',\n            template: 'griddle/select_box',\n            placeholder: 'select_box',\n            items: sortedColumns\n        })).on('change', this.onFilterAdd, this);\n        this.updateDirtyness();\n        og.View.prototype.render.call(this);\n        this.$('.js-select-selected').text('Add New Filter');\n        _lodash2.default.each(this.filters, _lodash2.default.bind(function (filter, idx) {\n            this.updateItem(idx);\n        }, this));\n    },\n    allKeyup: function allKeyup(ev) {\n        var inputValue = _utils2.default.strip((0, _jquery2.default)(ev.target).val());\n        this._viewData.searchAll = inputValue;\n        if (ev.which === 13) {\n            this.lastFocus = null;\n            this.setFilters();\n        } else {\n            this.setButtonsState();\n        }\n    },\n    onSearchClear: function onSearchClear() {\n        this.$('.js-search-input').val('');\n        this._viewData.searchAll = '';\n        this.setButtonsState();\n    },\n    getColumnById: function getColumnById(id) {\n        return _lodash2.default.filter(this.grid.getAllColumns(), function (col) {\n            return col.id === id;\n        })[0];\n    },\n    getColumnChoices: function getColumnChoices(id) {\n        var column = this.getColumnById(id);\n        return this.columnFilters[column.type] || this.columnFilters['default'];\n    },\n    setButtonsState: function setButtonsState() {\n        this.updateDirtyness();\n        (0, _jquery2.default)('.js-apply').toggleClass('disabled', this._viewData.applyDisabled);\n        (0, _jquery2.default)('.js-clear').toggleClass('disabled', this._viewData.clearDisabled);\n    },\n    updateDirtyness: function updateDirtyness() {\n        this.setFilters(this.stateQueryModel);\n        this._viewData.applyDisabled = _lodash2.default.isEqual(this.queryModel.toJSON().filter, this.stateQueryModel.toJSON().filter);\n        this._viewData.clearDisabled = this.filters.length === 0 && !this._viewData.searchAll;\n    },\n    onFilterInput: function onFilterInput(ev) {\n        var locale = this.grid.locale;\n        var idx = this.getIndex(ev.target);\n        var filter = this.filters[idx];\n        var column = this.getColumnById(filter.field) || { type: 'text' };\n        if (filter.operator === 'fy' || filter.operator === 'xyz') {\n            filter.valueLabel = filter.value = (0, _jquery2.default)(ev.target).val();\n        } else {\n            filter.value = _utils2.default.parseValue(_utils2.default.strip((0, _jquery2.default)(ev.target).val()), column.type);\n            filter.valueLabel = _utils2.default.getInputFormatter(column, locale)(filter.value);\n        }\n        this.lastFocus = filter;\n        if (ev.which === 13) {\n            this.lastFocus = null;\n            this.setFilters();\n        } else {\n            this.setButtonsState();\n        }\n    },\n    onFilterAdd: function onFilterAdd(idx) {\n        var name = this.view('add_filter').collection.get(idx).get('field');\n        var friendlyName = this.view('add_filter').collection.get(idx).get('name');\n        var operator = this.getColumnChoices(name)[0];\n        var val = {\n            field: name,\n            friendlyName: friendlyName,\n            operator: operator,\n            value: '',\n            operatorLabel: this.labels[operator]\n        };\n        this.lastFocus = val;\n        this.filters.push(val);\n        this.render();\n        this.trigger('action', 'filter-add', name);\n    },\n    onFilterRemove: function onFilterRemove(ev) {\n        var idx = this.getIndex(ev.target);\n        this.removeFilter(idx, false);\n    },\n    removeFilter: function removeFilter(idx, callSetFilter) {\n        var filter = this.filters[idx];\n        if (filter.allField) {\n            filter.value = '';\n            filter.valueLabel = '';\n        } else {\n            this.filters.splice(idx, 1);\n        }\n        this.lastFocus = null;\n        this.render();\n        this.trigger('action', 'filter-remove', filter.field);\n        if (callSetFilter) {\n            this.setFilters();\n        }\n    },\n    onFilterClear: function onFilterClear() {\n        this.lastFocus = null;\n        this.queryModel.filterClear();\n        this.filters = this.buildFilters();\n        this.render();\n        this.trigger('action', 'clear-all');\n    },\n    onFilterField: function onFilterField(ev) {\n        this.currentSelection = {\n            idx: this.getIndex(ev.target),\n            target: 'field'\n        };\n        var choices = _lodash2.default.sortBy(_lodash2.default.map(this.grid.getAllColumns(), function (col) {\n            return {\n                value: col.id,\n                label: col.label,\n                visible: col.visible\n            };\n        }), 'label');\n        this.createMenu(choices, ev.target);\n        this.lastFocus = this.filters[this.currentSelection.idx];\n    },\n    onFilterOperator: function onFilterOperator(ev) {\n        this.currentSelection = {\n            idx: this.getIndex(ev.target),\n            target: 'operator'\n        };\n        var self = this;\n        var choices = this.getColumnChoices(this.filters[this.currentSelection.idx].field);\n        choices = _lodash2.default.map(choices, function (x) {\n            return {\n                value: x,\n                label: self.labels[x]\n            };\n        });\n        this.createMenu(choices, ev.target);\n        this.lastFocus = this.filters[this.currentSelection.idx];\n    },\n    onMenuSelect: function onMenuSelect(ev) {\n        var sel = this.currentSelection;\n        var filter = this.filters[sel.idx];\n        var oldColumn = this.getColumnById(filter.field);\n        filter[sel.target] = (0, _jquery2.default)(ev.target).data('value');\n        var column = this.getColumnById(filter.field);\n        if (column.type !== oldColumn.type) {\n            // unset value of different types\n            filter.valueLabel = filter.value = '';\n        }\n        var choices = this.getColumnChoices(filter.field);\n        // make sure given field supports selected operator, otherwise set default one\n        if (_lodash2.default.indexOf(choices, filter.operator) === -1) {\n            filter.operator = choices[0];\n        }\n        filter.operatorLabel = this.labels[filter.operator];\n        filter.friendlyName = column.label; //Updating the friendlyName; Move this to where does filter.field gets updated.\n        this.hideMenu();\n        this.render();\n    },\n    getIndex: function getIndex(el) {\n        return (0, _jquery2.default)(el).closest('.js-filter').data('index');\n    },\n    setFilters: function setFilters(customQueryModel) {\n        var qm = customQueryModel instanceof _querymodel2.default ? customQueryModel : this.queryModel;\n        qm.beginUpdate();\n        qm.filterClear();\n        _lodash2.default.each(this.filters, _lodash2.default.bind(function (f) {\n            if (f.operator === 'null' || f.operator === 'notnull') {\n                f.value = true;\n            } else if (f.value === true || f.value === false) {\n                // This prevents a `true` or `false` from displaying in the search field when not filtering against blanks\n                f.valueLabel = f.value = null;\n            }\n            if (f.operator === 'xyz' && f.value) {\n                var end = (0, _moment2.default)().subtract(f.value, 'days').format('YYYY-MM-DD');\n                var today = (0, _moment2.default)().format('YYYY-MM-DD');\n                qm.filterColumn(f.field, 'ge', end);\n                qm.filterColumn(f.field, 'le', today);\n            } else if (f.operator === 'fy' && f.value) {\n                var fiscalYearStartMonth = _grid_report_store2.default.getState().getIn(['schema', 'fiscalYearStartMonth']);\n                var start = fiscalYearStartMonth === 1 ? (0, _moment2.default)(f.value, 'YYYY') : (0, _moment2.default)().set({ year: f.value - 1, month: fiscalYearStartMonth - 1 });\n                var _end = (0, _moment2.default)(start).add(12, 'months').subtract(1, 'day');\n                // Believe that it is not possible to have 2 updates at once...\n                qm.filterColumn(f.field, 'le', _end.format('YYYY-MM-DD'));\n                qm.filterColumn(f.field, 'ge', start.format('YYYY-MM-DD'));\n            } else {\n                qm.filterColumn(f.field, f.operator, f.value);\n            }\n        }, this));\n        qm.filterColumn('all', 'contains', this._viewData.searchAll);\n        qm.endUpdate();\n    },\n    createMenu: function createMenu(choices, el) {\n        var self = this;\n        this.hideMenu();\n        this.menu = (0, _jquery2.default)('<div class=\"ui-dropdown__target ready\"></div>');\n        _lodash2.default.each(choices, function (choice) {\n            (0, _jquery2.default)('<button class=\"dropdown__row js-select-option\"></button>').data('value', choice.value).text(choice.label).appendTo(self.menu).toggleClass('is-visible', choice.visible);\n        });\n        // Setup handler to close menu when clicking anywhrere in the window\n        // setTimeout hack is used to prevent firing with current event\n        _lodash2.default.defer(function () {\n            (0, _jquery2.default)('body').one('click', function (ev) {\n                if ((0, _jquery2.default)(ev.target).is('.js-field') || (0, _jquery2.default)(ev.target).is('.js-operator')) {\n                    return;\n                }\n                self.hideMenu();\n            });\n        });\n        this.menu.appendTo(this.$(el)).on('click', '.js-select-option', this.onMenuSelect).addClass('open');\n    },\n    updateItem: function updateItem(idx) {\n        var self = this;\n        var el = this.$el.find('.js-filter').eq(idx);\n        var filter = this.filters[idx];\n        var columnType = void 0;\n        var isNull = void 0;\n        var input = void 0;\n        columnType = this.getColumnById(filter.field).type;\n        isNull = filter.operator === 'null' || filter.operator === 'notnull';\n        input = el.find('.js-value');\n        if (this.lastFocus && this.lastFocus.field === filter.field && this.lastFocus.operator === filter.operator) {\n            this.setFocus(input);\n        }\n        input[isNull ? 'hide' : 'show']();\n        // Show or hide the 'is' qualifier\n        el.find('.filter-item__is')[filter.operator === 'contains' ? 'hide' : 'show']();\n        if (filter.operator === 'xyz') {\n            this.$('.filter-item__input.js-value')[0].placeholder = 'Number of Days';\n            return;\n        }\n        if (filter.operator === 'fy') return;\n        if (columnType === 'date') {\n            var locale = this.grid.locale;\n            _bootstrapDatepicker2.default.create(input, {\n                viewMode: 'years',\n                locale: locale\n            }).data('datepicker').hide();\n            input.on('changeDate', function (ev) {\n                var viewPeriod = ev.viewMode.replace(/s$/, '');\n                var m = (0, _moment2.default)(new Date(ev.date)).startOf(viewPeriod);\n                m.locale(locale);\n                var value = m.format(_utils2.default.DATE_FORMAT);\n                (0, _jquery2.default)(this).data('datepicker').setValue(value);\n                (0, _jquery2.default)(this).val(value);\n                if (ev.viewMode === 'days') {\n                    (0, _jquery2.default)(this).data('datepicker').hide();\n                }\n                var idx = self.getIndex(ev.target);\n                var filter = self.filters[idx];\n                // The current backend is expecting en_US formatted Dates\n                var enDate = m.locale('en_US');\n                filter.value = enDate.format('YYYY-MM-DD');\n                filter.valueLabel = value;\n                self.setButtonsState();\n            });\n            if (!isNull) {\n                input.after((0, _jquery2.default)('<span class=\"datepicker-handle icon-calendar-1\"></span>').on('click', function () {\n                    (0, _jquery2.default)(this).prev().data('datepicker').show();\n                }));\n            }\n        }\n    },\n    hideMenu: function hideMenu() {\n        if (this.menu) {\n            this.menu.remove();\n            this.menu = null;\n        }\n    },\n    setFocus: function setFocus(input) {\n        _lodash2.default.defer(function () {\n            // trick with setting empty value is to make the cursor appear at the end of the input\n            var value = input.val();\n            input.focus().val('').val(value);\n        });\n    }\n});\nexports.default = FiltersPanel;\n\n/***/ }),\n/* 945 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _sort_selector = __webpack_require__(265);\n\nvar _sort_selector2 = _interopRequireDefault(_sort_selector);\n\nvar _dragula = __webpack_require__(946);\n\nvar _dragula2 = _interopRequireDefault(_dragula);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @class ColumnsPanel */\nvar ColumnsPanel = og.View.extend(\n/** @lends ColumnsPanel# */\n{\n    template: 'griddle/panel_columns',\n    placeholder: 'subpanel',\n    events: {\n        'click .js-column-toggle': 'handleClick',\n        'click .subpanel_selectall': 'handleClickAll'\n    },\n    /** Initialize the plugin, called by slicgrid when registering */\n    init: function init(grid) {\n        this.grid = grid;\n        this.sorts = [{ id: 'name-asc', name: 'Sort A-Z', comp: _utils2.default.stringComparator }, { id: 'name-desc', name: 'Sort Z-A', comp: _utils2.default.stringComparatorReverse },\n        // this doesn't have a comparator because the report is already in the right order\n        { id: 'report-order', name: 'Sort by order of the report' }];\n        this.sortId = this.sorts[0].id;\n        var sortSelector = this.view('column_sort', new _sort_selector2.default({\n            template: 'griddle/select_box',\n            placeholder: 'select_box',\n            selected: this.sortId,\n            items: this.sorts,\n            enableAll: true\n        }));\n        this.listenTo(sortSelector, 'change', this.applySort, this);\n        this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n        this.render();\n    },\n    render: function render() {\n        og.View.prototype.render.call(this);\n        this.afterRender();\n    },\n\n    /** Destroy the plugin, called by slickgrid */\n    destroy: function destroy() {\n        this.remove();\n    },\n    applySort: function applySort(sortId) {\n        this.sortId = sortId || this.sortId;\n        this.sortable = sortId === 'report-order';\n        this.template = this.sortable ? 'griddle/panel_columns_sortable' : 'griddle/panel_columns';\n        this.render();\n        this.trigger('action', 'change-sorting');\n    },\n    viewData: function viewData(data) {\n        if (data) {\n            this._viewData = data;\n            return;\n        }\n        if (this._viewData) {\n            var sort = _lodash2.default.find(this.sorts, { 'id': this.sortId });\n            var cols = _lodash2.default.map(this.grid.getAllColumns(), function (c) {\n                return _lodash2.default.pick(c, 'id', 'label', 'visible', 'isRequired');\n            });\n            // only sort if there is a comparator, some sorts don't\n            if (sort.comp) {\n                cols.sort(sort.comp);\n            }\n            this._viewData.columns = cols;\n            this._viewData.fixedColumns = cols.filter(function (col) {\n                return col.visible;\n            });\n            this._viewData.auxColumns = cols.filter(function (col) {\n                return !col.visible;\n            });\n            this._viewData.sortable = this.sortable;\n            return this._viewData;\n        }\n        return this;\n    },\n    afterRender: function afterRender() {\n        var _this = this;\n\n        // make the columns sortable, if they should be\n        if (this.sortable) {\n            var columns = (0, _dragula2.default)({\n                containers: [this.el.querySelector('.sortable-items')],\n                direction: 'vertical'\n            });\n            columns.on('drag', function (el) {\n                return (0, _jquery2.default)(el).addClass('drop-item__dragged');\n            });\n            columns.on('drop', function (el) {\n                (0, _jquery2.default)(el).removeClass('drop-item__dragged');\n                var order = (0, _jquery2.default)(el).parent().children().map(function (index, element) {\n                    return element.attributes['data-column'].value;\n                });\n                _this.grid.reorderColumns(order.toArray());\n            });\n        }\n    },\n\n    /**\r\n     * @param {Event} ev\r\n     * @protected\r\n     */\n    handleClick: function handleClick(ev) {\n        var el = (0, _jquery2.default)(ev.currentTarget);\n        var columnId = el.data('column');\n        this.grid.toggleColumnVisibility(columnId);\n        this.trigger('action', 'click-column', columnId);\n    },\n    handleClickAll: function handleClickAll() {\n        var grid = this.grid;\n        //deselect-all if all are selected. Select-all if all are de-selected.\n        //this.grid.auxColumns and this.grid.fixedColumns is undefined if nothing is selected\n        if (this.grid.auxColumns === undefined || this.grid.fixedColumns === undefined) {\n            grid.toggleAllColumnVisibility(this.grid.getAllColumns());\n            return;\n        }\n        //select the de-selected column if anyone selected\n        //this.grid.auxColumns is not undefined if anyone is selected\n        var columnIds = [];\n        if (this.grid.auxColumns) {\n            _lodash2.default.each(this.grid.auxColumns, function (column) {\n                columnIds.push(column.id);\n            });\n            grid.toggleAllColumnVisibility(columnIds);\n        }\n    }\n});\nexports.default = ColumnsPanel;\n\n/***/ }),\n/* 946 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nvar emitter = __webpack_require__(947);\nvar crossvent = __webpack_require__(951);\nvar classes = __webpack_require__(954);\nvar doc = document;\nvar documentElement = doc.documentElement;\n\nfunction dragula (initialContainers, options) {\n  var len = arguments.length;\n  if (len === 1 && Array.isArray(initialContainers) === false) {\n    options = initialContainers;\n    initialContainers = [];\n  }\n  var _mirror; // mirror image\n  var _source; // source container\n  var _item; // item being dragged\n  var _offsetX; // reference x\n  var _offsetY; // reference y\n  var _moveX; // reference move x\n  var _moveY; // reference move y\n  var _initialSibling; // reference sibling when grabbed\n  var _currentSibling; // reference sibling now\n  var _copy; // item used for copying\n  var _renderTimer; // timer for setTimeout renderMirrorImage\n  var _lastDropTarget = null; // last container item was over\n  var _grabbed; // holds mousedown context until first mousemove\n\n  var o = options || {};\n  if (o.moves === void 0) { o.moves = always; }\n  if (o.accepts === void 0) { o.accepts = always; }\n  if (o.invalid === void 0) { o.invalid = invalidTarget; }\n  if (o.containers === void 0) { o.containers = initialContainers || []; }\n  if (o.isContainer === void 0) { o.isContainer = never; }\n  if (o.copy === void 0) { o.copy = false; }\n  if (o.copySortSource === void 0) { o.copySortSource = false; }\n  if (o.revertOnSpill === void 0) { o.revertOnSpill = false; }\n  if (o.removeOnSpill === void 0) { o.removeOnSpill = false; }\n  if (o.direction === void 0) { o.direction = 'vertical'; }\n  if (o.ignoreInputTextSelection === void 0) { o.ignoreInputTextSelection = true; }\n  if (o.mirrorContainer === void 0) { o.mirrorContainer = doc.body; }\n\n  var drake = emitter({\n    containers: o.containers,\n    start: manualStart,\n    end: end,\n    cancel: cancel,\n    remove: remove,\n    destroy: destroy,\n    canMove: canMove,\n    dragging: false\n  });\n\n  if (o.removeOnSpill === true) {\n    drake.on('over', spillOver).on('out', spillOut);\n  }\n\n  events();\n\n  return drake;\n\n  function isContainer (el) {\n    return drake.containers.indexOf(el) !== -1 || o.isContainer(el);\n  }\n\n  function events (remove) {\n    var op = remove ? 'remove' : 'add';\n    touchy(documentElement, op, 'mousedown', grab);\n    touchy(documentElement, op, 'mouseup', release);\n  }\n\n  function eventualMovements (remove) {\n    var op = remove ? 'remove' : 'add';\n    touchy(documentElement, op, 'mousemove', startBecauseMouseMoved);\n  }\n\n  function movements (remove) {\n    var op = remove ? 'remove' : 'add';\n    crossvent[op](documentElement, 'selectstart', preventGrabbed); // IE8\n    crossvent[op](documentElement, 'click', preventGrabbed);\n  }\n\n  function destroy () {\n    events(true);\n    release({});\n  }\n\n  function preventGrabbed (e) {\n    if (_grabbed) {\n      e.preventDefault();\n    }\n  }\n\n  function grab (e) {\n    _moveX = e.clientX;\n    _moveY = e.clientY;\n\n    var ignore = whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey;\n    if (ignore) {\n      return; // we only care about honest-to-god left clicks and touch events\n    }\n    var item = e.target;\n    var context = canStart(item);\n    if (!context) {\n      return;\n    }\n    _grabbed = context;\n    eventualMovements();\n    if (e.type === 'mousedown') {\n      if (isInput(item)) { // see also: https://github.com/bevacqua/dragula/issues/208\n        item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176\n      } else {\n        e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155\n      }\n    }\n  }\n\n  function startBecauseMouseMoved (e) {\n    if (!_grabbed) {\n      return;\n    }\n    if (whichMouseButton(e) === 0) {\n      release({});\n      return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope\n    }\n    // truthy check fixes #239, equality fixes #207\n    if (e.clientX !== void 0 && e.clientX === _moveX && e.clientY !== void 0 && e.clientY === _moveY) {\n      return;\n    }\n    if (o.ignoreInputTextSelection) {\n      var clientX = getCoord('clientX', e);\n      var clientY = getCoord('clientY', e);\n      var elementBehindCursor = doc.elementFromPoint(clientX, clientY);\n      if (isInput(elementBehindCursor)) {\n        return;\n      }\n    }\n\n    var grabbed = _grabbed; // call to end() unsets _grabbed\n    eventualMovements(true);\n    movements();\n    end();\n    start(grabbed);\n\n    var offset = getOffset(_item);\n    _offsetX = getCoord('pageX', e) - offset.left;\n    _offsetY = getCoord('pageY', e) - offset.top;\n\n    classes.add(_copy || _item, 'gu-transit');\n    renderMirrorImage();\n    drag(e);\n  }\n\n  function canStart (item) {\n    if (drake.dragging && _mirror) {\n      return;\n    }\n    if (isContainer(item)) {\n      return; // don't drag container itself\n    }\n    var handle = item;\n    while (getParent(item) && isContainer(getParent(item)) === false) {\n      if (o.invalid(item, handle)) {\n        return;\n      }\n      item = getParent(item); // drag target should be a top element\n      if (!item) {\n        return;\n      }\n    }\n    var source = getParent(item);\n    if (!source) {\n      return;\n    }\n    if (o.invalid(item, handle)) {\n      return;\n    }\n\n    var movable = o.moves(item, source, handle, nextEl(item));\n    if (!movable) {\n      return;\n    }\n\n    return {\n      item: item,\n      source: source\n    };\n  }\n\n  function canMove (item) {\n    return !!canStart(item);\n  }\n\n  function manualStart (item) {\n    var context = canStart(item);\n    if (context) {\n      start(context);\n    }\n  }\n\n  function start (context) {\n    if (isCopy(context.item, context.source)) {\n      _copy = context.item.cloneNode(true);\n      drake.emit('cloned', _copy, context.item, 'copy');\n    }\n\n    _source = context.source;\n    _item = context.item;\n    _initialSibling = _currentSibling = nextEl(context.item);\n\n    drake.dragging = true;\n    drake.emit('drag', _item, _source);\n  }\n\n  function invalidTarget () {\n    return false;\n  }\n\n  function end () {\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    drop(item, getParent(item));\n  }\n\n  function ungrab () {\n    _grabbed = false;\n    eventualMovements(true);\n    movements(true);\n  }\n\n  function release (e) {\n    ungrab();\n\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    var clientX = getCoord('clientX', e);\n    var clientY = getCoord('clientY', e);\n    var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY);\n    var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY);\n    if (dropTarget && ((_copy && o.copySortSource) || (!_copy || dropTarget !== _source))) {\n      drop(item, dropTarget);\n    } else if (o.removeOnSpill) {\n      remove();\n    } else {\n      cancel();\n    }\n  }\n\n  function drop (item, target) {\n    var parent = getParent(item);\n    if (_copy && o.copySortSource && target === _source) {\n      parent.removeChild(_item);\n    }\n    if (isInitialPlacement(target)) {\n      drake.emit('cancel', item, _source, _source);\n    } else {\n      drake.emit('drop', item, target, _source, _currentSibling);\n    }\n    cleanup();\n  }\n\n  function remove () {\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    var parent = getParent(item);\n    if (parent) {\n      parent.removeChild(item);\n    }\n    drake.emit(_copy ? 'cancel' : 'remove', item, parent, _source);\n    cleanup();\n  }\n\n  function cancel (revert) {\n    if (!drake.dragging) {\n      return;\n    }\n    var reverts = arguments.length > 0 ? revert : o.revertOnSpill;\n    var item = _copy || _item;\n    var parent = getParent(item);\n    var initial = isInitialPlacement(parent);\n    if (initial === false && reverts) {\n      if (_copy) {\n        if (parent) {\n          parent.removeChild(_copy);\n        }\n      } else {\n        _source.insertBefore(item, _initialSibling);\n      }\n    }\n    if (initial || reverts) {\n      drake.emit('cancel', item, _source, _source);\n    } else {\n      drake.emit('drop', item, parent, _source, _currentSibling);\n    }\n    cleanup();\n  }\n\n  function cleanup () {\n    var item = _copy || _item;\n    ungrab();\n    removeMirrorImage();\n    if (item) {\n      classes.rm(item, 'gu-transit');\n    }\n    if (_renderTimer) {\n      clearTimeout(_renderTimer);\n    }\n    drake.dragging = false;\n    if (_lastDropTarget) {\n      drake.emit('out', item, _lastDropTarget, _source);\n    }\n    drake.emit('dragend', item);\n    _source = _item = _copy = _initialSibling = _currentSibling = _renderTimer = _lastDropTarget = null;\n  }\n\n  function isInitialPlacement (target, s) {\n    var sibling;\n    if (s !== void 0) {\n      sibling = s;\n    } else if (_mirror) {\n      sibling = _currentSibling;\n    } else {\n      sibling = nextEl(_copy || _item);\n    }\n    return target === _source && sibling === _initialSibling;\n  }\n\n  function findDropTarget (elementBehindCursor, clientX, clientY) {\n    var target = elementBehindCursor;\n    while (target && !accepted()) {\n      target = getParent(target);\n    }\n    return target;\n\n    function accepted () {\n      var droppable = isContainer(target);\n      if (droppable === false) {\n        return false;\n      }\n\n      var immediate = getImmediateChild(target, elementBehindCursor);\n      var reference = getReference(target, immediate, clientX, clientY);\n      var initial = isInitialPlacement(target, reference);\n      if (initial) {\n        return true; // should always be able to drop it right back where it was\n      }\n      return o.accepts(_item, target, _source, reference);\n    }\n  }\n\n  function drag (e) {\n    if (!_mirror) {\n      return;\n    }\n    e.preventDefault();\n\n    var clientX = getCoord('clientX', e);\n    var clientY = getCoord('clientY', e);\n    var x = clientX - _offsetX;\n    var y = clientY - _offsetY;\n\n    _mirror.style.left = x + 'px';\n    _mirror.style.top = y + 'px';\n\n    var item = _copy || _item;\n    var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY);\n    var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY);\n    var changed = dropTarget !== null && dropTarget !== _lastDropTarget;\n    if (changed || dropTarget === null) {\n      out();\n      _lastDropTarget = dropTarget;\n      over();\n    }\n    var parent = getParent(item);\n    if (dropTarget === _source && _copy && !o.copySortSource) {\n      if (parent) {\n        parent.removeChild(item);\n      }\n      return;\n    }\n    var reference;\n    var immediate = getImmediateChild(dropTarget, elementBehindCursor);\n    if (immediate !== null) {\n      reference = getReference(dropTarget, immediate, clientX, clientY);\n    } else if (o.revertOnSpill === true && !_copy) {\n      reference = _initialSibling;\n      dropTarget = _source;\n    } else {\n      if (_copy && parent) {\n        parent.removeChild(item);\n      }\n      return;\n    }\n    if (\n      (reference === null && changed) ||\n      reference !== item &&\n      reference !== nextEl(item)\n    ) {\n      _currentSibling = reference;\n      dropTarget.insertBefore(item, reference);\n      drake.emit('shadow', item, dropTarget, _source);\n    }\n    function moved (type) { drake.emit(type, item, _lastDropTarget, _source); }\n    function over () { if (changed) { moved('over'); } }\n    function out () { if (_lastDropTarget) { moved('out'); } }\n  }\n\n  function spillOver (el) {\n    classes.rm(el, 'gu-hide');\n  }\n\n  function spillOut (el) {\n    if (drake.dragging) { classes.add(el, 'gu-hide'); }\n  }\n\n  function renderMirrorImage () {\n    if (_mirror) {\n      return;\n    }\n    var rect = _item.getBoundingClientRect();\n    _mirror = _item.cloneNode(true);\n    _mirror.style.width = getRectWidth(rect) + 'px';\n    _mirror.style.height = getRectHeight(rect) + 'px';\n    classes.rm(_mirror, 'gu-transit');\n    classes.add(_mirror, 'gu-mirror');\n    o.mirrorContainer.appendChild(_mirror);\n    touchy(documentElement, 'add', 'mousemove', drag);\n    classes.add(o.mirrorContainer, 'gu-unselectable');\n    drake.emit('cloned', _mirror, _item, 'mirror');\n  }\n\n  function removeMirrorImage () {\n    if (_mirror) {\n      classes.rm(o.mirrorContainer, 'gu-unselectable');\n      touchy(documentElement, 'remove', 'mousemove', drag);\n      getParent(_mirror).removeChild(_mirror);\n      _mirror = null;\n    }\n  }\n\n  function getImmediateChild (dropTarget, target) {\n    var immediate = target;\n    while (immediate !== dropTarget && getParent(immediate) !== dropTarget) {\n      immediate = getParent(immediate);\n    }\n    if (immediate === documentElement) {\n      return null;\n    }\n    return immediate;\n  }\n\n  function getReference (dropTarget, target, x, y) {\n    var horizontal = o.direction === 'horizontal';\n    var reference = target !== dropTarget ? inside() : outside();\n    return reference;\n\n    function outside () { // slower, but able to figure out any position\n      var len = dropTarget.children.length;\n      var i;\n      var el;\n      var rect;\n      for (i = 0; i < len; i++) {\n        el = dropTarget.children[i];\n        rect = el.getBoundingClientRect();\n        if (horizontal && (rect.left + rect.width / 2) > x) { return el; }\n        if (!horizontal && (rect.top + rect.height / 2) > y) { return el; }\n      }\n      return null;\n    }\n\n    function inside () { // faster, but only available if dropped inside a child element\n      var rect = target.getBoundingClientRect();\n      if (horizontal) {\n        return resolve(x > rect.left + getRectWidth(rect) / 2);\n      }\n      return resolve(y > rect.top + getRectHeight(rect) / 2);\n    }\n\n    function resolve (after) {\n      return after ? nextEl(target) : target;\n    }\n  }\n\n  function isCopy (item, container) {\n    return typeof o.copy === 'boolean' ? o.copy : o.copy(item, container);\n  }\n}\n\nfunction touchy (el, op, type, fn) {\n  var touch = {\n    mouseup: 'touchend',\n    mousedown: 'touchstart',\n    mousemove: 'touchmove'\n  };\n  var pointers = {\n    mouseup: 'pointerup',\n    mousedown: 'pointerdown',\n    mousemove: 'pointermove'\n  };\n  var microsoft = {\n    mouseup: 'MSPointerUp',\n    mousedown: 'MSPointerDown',\n    mousemove: 'MSPointerMove'\n  };\n  if (global.navigator.pointerEnabled) {\n    crossvent[op](el, pointers[type], fn);\n  } else if (global.navigator.msPointerEnabled) {\n    crossvent[op](el, microsoft[type], fn);\n  } else {\n    crossvent[op](el, touch[type], fn);\n    crossvent[op](el, type, fn);\n  }\n}\n\nfunction whichMouseButton (e) {\n  if (e.touches !== void 0) { return e.touches.length; }\n  if (e.which !== void 0 && e.which !== 0) { return e.which; } // see https://github.com/bevacqua/dragula/issues/261\n  if (e.buttons !== void 0) { return e.buttons; }\n  var button = e.button;\n  if (button !== void 0) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575\n    return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0);\n  }\n}\n\nfunction getOffset (el) {\n  var rect = el.getBoundingClientRect();\n  return {\n    left: rect.left + getScroll('scrollLeft', 'pageXOffset'),\n    top: rect.top + getScroll('scrollTop', 'pageYOffset')\n  };\n}\n\nfunction getScroll (scrollProp, offsetProp) {\n  if (typeof global[offsetProp] !== 'undefined') {\n    return global[offsetProp];\n  }\n  if (documentElement.clientHeight) {\n    return documentElement[scrollProp];\n  }\n  return doc.body[scrollProp];\n}\n\nfunction getElementBehindPoint (point, x, y) {\n  var p = point || {};\n  var state = p.className;\n  var el;\n  p.className += ' gu-hide';\n  el = doc.elementFromPoint(x, y);\n  p.className = state;\n  return el;\n}\n\nfunction never () { return false; }\nfunction always () { return true; }\nfunction getRectWidth (rect) { return rect.width || (rect.right - rect.left); }\nfunction getRectHeight (rect) { return rect.height || (rect.bottom - rect.top); }\nfunction getParent (el) { return el.parentNode === doc ? null : el.parentNode; }\nfunction isInput (el) { return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el); }\nfunction isEditable (el) {\n  if (!el) { return false; } // no parents were editable\n  if (el.contentEditable === 'false') { return false; } // stop the lookup\n  if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain\n  return isEditable(getParent(el)); // contentEditable is set to 'inherit'\n}\n\nfunction nextEl (el) {\n  return el.nextElementSibling || manually();\n  function manually () {\n    var sibling = el;\n    do {\n      sibling = sibling.nextSibling;\n    } while (sibling && sibling.nodeType !== 1);\n    return sibling;\n  }\n}\n\nfunction getEventHost (e) {\n  // on touchend event, we have to use `e.changedTouches`\n  // see http://stackoverflow.com/questions/7192563/touchend-event-properties\n  // see https://github.com/bevacqua/dragula/issues/34\n  if (e.targetTouches && e.targetTouches.length) {\n    return e.targetTouches[0];\n  }\n  if (e.changedTouches && e.changedTouches.length) {\n    return e.changedTouches[0];\n  }\n  return e;\n}\n\nfunction getCoord (coord, e) {\n  var host = getEventHost(e);\n  var missMap = {\n    pageX: 'clientX', // IE8\n    pageY: 'clientY' // IE8\n  };\n  if (coord in missMap && !(coord in host) && missMap[coord] in host) {\n    coord = missMap[coord];\n  }\n  return host[coord];\n}\n\nmodule.exports = dragula;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 947 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar atoa = __webpack_require__(948);\nvar debounce = __webpack_require__(949);\n\nmodule.exports = function emitter (thing, options) {\n  var opts = options || {};\n  var evt = {};\n  if (thing === undefined) { thing = {}; }\n  thing.on = function (type, fn) {\n    if (!evt[type]) {\n      evt[type] = [fn];\n    } else {\n      evt[type].push(fn);\n    }\n    return thing;\n  };\n  thing.once = function (type, fn) {\n    fn._once = true; // thing.off(fn) still works!\n    thing.on(type, fn);\n    return thing;\n  };\n  thing.off = function (type, fn) {\n    var c = arguments.length;\n    if (c === 1) {\n      delete evt[type];\n    } else if (c === 0) {\n      evt = {};\n    } else {\n      var et = evt[type];\n      if (!et) { return thing; }\n      et.splice(et.indexOf(fn), 1);\n    }\n    return thing;\n  };\n  thing.emit = function () {\n    var args = atoa(arguments);\n    return thing.emitterSnapshot(args.shift()).apply(this, args);\n  };\n  thing.emitterSnapshot = function (type) {\n    var et = (evt[type] || []).slice(0);\n    return function () {\n      var args = atoa(arguments);\n      var ctx = this || thing;\n      if (type === 'error' && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; }\n      et.forEach(function emitter (listen) {\n        if (opts.async) { debounce(listen, args, ctx); } else { listen.apply(ctx, args); }\n        if (listen._once) { thing.off(type, listen); }\n      });\n      return thing;\n    };\n  };\n  return thing;\n};\n\n\n/***/ }),\n/* 948 */\n/***/ (function(module, exports) {\n\nmodule.exports = function atoa (a, n) { return Array.prototype.slice.call(a, n); }\n\n\n/***/ }),\n/* 949 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ticky = __webpack_require__(950);\n\nmodule.exports = function debounce (fn, args, ctx) {\n  if (!fn) { return; }\n  ticky(function run () {\n    fn.apply(ctx || null, args || []);\n  });\n};\n\n\n/***/ }),\n/* 950 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(setImmediate) {var si = typeof setImmediate === 'function', tick;\nif (si) {\n  tick = function (fn) { setImmediate(fn); };\n} else {\n  tick = function (fn) { setTimeout(fn, 0); };\n}\n\nmodule.exports = tick;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(134).setImmediate))\n\n/***/ }),\n/* 951 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nvar customEvent = __webpack_require__(952);\nvar eventmap = __webpack_require__(953);\nvar doc = global.document;\nvar addEvent = addEventEasy;\nvar removeEvent = removeEventEasy;\nvar hardCache = [];\n\nif (!global.addEventListener) {\n  addEvent = addEventHard;\n  removeEvent = removeEventHard;\n}\n\nmodule.exports = {\n  add: addEvent,\n  remove: removeEvent,\n  fabricate: fabricateEvent\n};\n\nfunction addEventEasy (el, type, fn, capturing) {\n  return el.addEventListener(type, fn, capturing);\n}\n\nfunction addEventHard (el, type, fn) {\n  return el.attachEvent('on' + type, wrap(el, type, fn));\n}\n\nfunction removeEventEasy (el, type, fn, capturing) {\n  return el.removeEventListener(type, fn, capturing);\n}\n\nfunction removeEventHard (el, type, fn) {\n  var listener = unwrap(el, type, fn);\n  if (listener) {\n    return el.detachEvent('on' + type, listener);\n  }\n}\n\nfunction fabricateEvent (el, type, model) {\n  var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent();\n  if (el.dispatchEvent) {\n    el.dispatchEvent(e);\n  } else {\n    el.fireEvent('on' + type, e);\n  }\n  function makeClassicEvent () {\n    var e;\n    if (doc.createEvent) {\n      e = doc.createEvent('Event');\n      e.initEvent(type, true, true);\n    } else if (doc.createEventObject) {\n      e = doc.createEventObject();\n    }\n    return e;\n  }\n  function makeCustomEvent () {\n    return new customEvent(type, { detail: model });\n  }\n}\n\nfunction wrapperFactory (el, type, fn) {\n  return function wrapper (originalEvent) {\n    var e = originalEvent || global.event;\n    e.target = e.target || e.srcElement;\n    e.preventDefault = e.preventDefault || function preventDefault () { e.returnValue = false; };\n    e.stopPropagation = e.stopPropagation || function stopPropagation () { e.cancelBubble = true; };\n    e.which = e.which || e.keyCode;\n    fn.call(el, e);\n  };\n}\n\nfunction wrap (el, type, fn) {\n  var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn);\n  hardCache.push({\n    wrapper: wrapper,\n    element: el,\n    type: type,\n    fn: fn\n  });\n  return wrapper;\n}\n\nfunction unwrap (el, type, fn) {\n  var i = find(el, type, fn);\n  if (i) {\n    var wrapper = hardCache[i].wrapper;\n    hardCache.splice(i, 1); // free up a tad of memory\n    return wrapper;\n  }\n}\n\nfunction find (el, type, fn) {\n  var i, item;\n  for (i = 0; i < hardCache.length; i++) {\n    item = hardCache[i];\n    if (item.element === el && item.type === type && item.fn === fn) {\n      return i;\n    }\n  }\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 952 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {\nvar NativeCustomEvent = global.CustomEvent;\n\nfunction useNative () {\n  try {\n    var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });\n    return  'cat' === p.type && 'bar' === p.detail.foo;\n  } catch (e) {\n  }\n  return false;\n}\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n *\n * @public\n */\n\nmodule.exports = useNative() ? NativeCustomEvent :\n\n// IE >= 9\n'function' === typeof document.createEvent ? function CustomEvent (type, params) {\n  var e = document.createEvent('CustomEvent');\n  if (params) {\n    e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n  } else {\n    e.initCustomEvent(type, false, false, void 0);\n  }\n  return e;\n} :\n\n// IE <= 8\nfunction CustomEvent (type, params) {\n  var e = document.createEventObject();\n  e.type = type;\n  if (params) {\n    e.bubbles = Boolean(params.bubbles);\n    e.cancelable = Boolean(params.cancelable);\n    e.detail = params.detail;\n  } else {\n    e.bubbles = false;\n    e.cancelable = false;\n    e.detail = void 0;\n  }\n  return e;\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 953 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nvar eventmap = [];\nvar eventname = '';\nvar ron = /^on/;\n\nfor (eventname in global) {\n  if (ron.test(eventname)) {\n    eventmap.push(eventname.slice(2));\n  }\n}\n\nmodule.exports = eventmap;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 954 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar cache = {};\nvar start = '(?:^|\\\\s)';\nvar end = '(?:\\\\s|$)';\n\nfunction lookupClass (className) {\n  var cached = cache[className];\n  if (cached) {\n    cached.lastIndex = 0;\n  } else {\n    cache[className] = cached = new RegExp(start + className + end, 'g');\n  }\n  return cached;\n}\n\nfunction addClass (el, className) {\n  var current = el.className;\n  if (!current.length) {\n    el.className = className;\n  } else if (!lookupClass(className).test(current)) {\n    el.className += ' ' + className;\n  }\n}\n\nfunction rmClass (el, className) {\n  el.className = el.className.replace(lookupClass(className), ' ').trim();\n}\n\nmodule.exports = {\n  add: addClass,\n  rm: rmClass\n};\n\n\n/***/ }),\n/* 955 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _underscore = __webpack_require__(52);\n\nvar _underscore2 = _interopRequireDefault(_underscore);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NetworkHeader = (0, _createReactClass2.default)({\n    displayName: 'NetworkHeader',\n\n    propTypes: {\n        entity: _propTypes2.default.object,\n        report: _propTypes2.default.object,\n        reports: _propTypes2.default.object\n    },\n    getInitialState: function getInitialState() {\n        return {\n            dropdownOpen: false\n        };\n    },\n    onDropdownClick: function onDropdownClick() {\n        this.setState({ dropdownOpen: !this.state.dropdownOpen });\n    },\n    render: function render() {\n        var entityId = this.props.entity ? this.props.entity.attributes.subdomain : '';\n        var networkHomeUrl = '/network#/' + gon.entity.id;\n        var networkEntityUrl = networkHomeUrl + '/entities/' + entityId;\n        return _react2.default.createElement(\"header\", { className: \"ui-main__header\" }, _react2.default.createElement(\"nav\", { className: \"ui-breadcrumbs\" }, _react2.default.createElement(\"a\", { className: \"ui-breadcrumbs__item icon-app-network\", href: networkHomeUrl }, \"Network\"), _react2.default.createElement(\"a\", { className: \"ui-breadcrumbs__item\", href: networkEntityUrl }, _underscore2.default.capitalize(this.props.entity.attributes.display_name)), _react2.default.createElement(\"span\", { className: \"ui-breadcrumbs__item ui-breadcrumbs__dropdown-toggle\", onClick: this.onDropdownClick }, this.props.report.get('name'), this.state.dropdownOpen ? _react2.default.createElement(\"div\", { className: \"ui-dropdown__target\", style: { display: 'block' } }, _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, this.props.reports.sortBy('name').map(function (report) {\n            if (!report.get('hidden')) {\n                var reportPath = '/network/reports#/' + entityId + '/' + report.get('id');\n                var itemCss = {\n                    'ui-dropdown__item': true,\n                    active: report.get('id') === this.props.report.get('id')\n                };\n                return _react2.default.createElement(\"li\", { key: report.get('id') }, _react2.default.createElement(\"a\", { className: (0, _classnames2.default)(itemCss), href: reportPath }, report.get('name')));\n            }\n        }, this))) : null)));\n    }\n});\nexports.default = NetworkHeader;\n\n/***/ }),\n/* 956 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SocialNetworking = (0, _createReactClass2.default)({\n    displayName: 'SocialNetworking',\n    render: function render() {\n        return _react2.default.createElement(\"span\", null, _react2.default.createElement(Facebook, null), _react2.default.createElement(Twitter, { entityHashtag: this.props.entityHashtag }));\n    }\n});\nvar Twitter = (0, _createReactClass2.default)({\n    displayName: 'Twitter',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"footer__social__wrapper\", style: { position: 'relative', top: 1 } }, _react2.default.createElement(\"a\", { href: \"https://twitter.com/share\", className: \"twitter-share-button\", \"data-text\": 'Check out this #OpenData ' + this.props.entityHashtag + ' visualization from OpenGov.com' }, \"Tweet\"));\n    },\n    componentDidMount: function componentDidMount() {\n        !function (d, s, id) {\n            var js = void 0;\n            var fjs = d.getElementsByTagName(s)[0];\n            var p = /^http:/.test(d.location.toString()) ? 'http' : 'https';\n            if (!d.getElementById(id)) {\n                js = d.createElement(s);\n                js.id = id;\n                js.src = p + '://platform.twitter.com/widgets.js';\n                fjs.parentNode.insertBefore(js, fjs);\n            }\n        }(document, 'script', 'twitter-wjs');\n    }\n});\nvar Facebook = (0, _createReactClass2.default)({\n    displayName: 'Facebook',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"footer__social__wrapper\" }, _react2.default.createElement(\"div\", { id: \"fb-root\" }), _react2.default.createElement(\"div\", { className: \"fb-like\", \"data-href\": \"https://www.facebook.com/opengovinc?ref=br_tf\", \"data-layout\": \"button_count\", \"data-action\": \"like\", \"data-show-faces\": \"false\", \"data-share\": \"false\" }));\n    },\n    componentDidMount: function componentDidMount() {\n        /* jshint ignore:start */\n        (function (d, s, id) {\n            var js = void 0;\n            var fjs = d.getElementsByTagName(s)[0];\n            if (d.getElementById(id)) return;\n            js = d.createElement(s);\n            js.id = id;\n            js.src = '//connect.facebook.net/en_US/all.js#xfbml=1&appId=441421729313993';\n            fjs.parentNode.insertBefore(js, fjs);\n        })(document, 'script', 'facebook-jssdk');\n        /* jshint ignore:end */\n    }\n});\nexports.default = SocialNetworking;\n\n/***/ }),\n/* 957 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _report_description = __webpack_require__(522);\n\nvar _report_description2 = _interopRequireDefault(_report_description);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _autocomplete = __webpack_require__(959);\n\nvar _autocomplete2 = _interopRequireDefault(_autocomplete);\n\nvar _sub_report_header = __webpack_require__(971);\n\nvar _sub_report_header2 = _interopRequireDefault(_sub_report_header);\n\nvar _report_updated_info = __webpack_require__(524);\n\nvar _report_updated_info2 = _interopRequireDefault(_report_updated_info);\n\nvar _report_header_row_count = __webpack_require__(525);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportHeader = (0, _createReactClass2.default)({\n    displayName: 'ReportHeader',\n    getInitialState: function getInitialState() {\n        return {\n            searchValue: this.props.queryModel.getColumnQuery('all').filter.contains || ''\n        };\n    },\n    render: function render() {\n        var _this = this;\n\n        var _props = this.props,\n            report = _props.report,\n            griddleState = _props.griddleState,\n            schema = _props.schema,\n            queryModel = _props.queryModel,\n            renderedReport = _props.renderedReport,\n            isControlPanel = _props.isControlPanel;\n\n        var searchValue = this.props.queryModel.getColumnQuery('all').filter.contains || this.state.searchValue;\n        var embedHeaderStyle = (0, _embed_utils.isEmbed)() ? { left: 0 } : {};\n        return _react2.default.createElement(\"header\", { className: \"report__header\", style: embedHeaderStyle }, _react2.default.createElement(\"div\", { className: \"report__header__container\" }, !isControlPanel && !(0, _embed_utils.isEmbed)() && _react2.default.createElement(\"h1\", null, report.attributes.name), _react2.default.createElement(_report_description2.default, { report: renderedReport }), _react2.default.createElement(\"div\", { className: \"report__header_updated_on\" }, _react2.default.createElement(_report_updated_info2.default, { description: 'Updated On ', timeStamp: report.get('data_updated_at') })), this.isPredictiveSearchActive() ? _react2.default.createElement(_autocomplete2.default, { dataSetId: report.get('transaction_id'), columns: ['paid_to', 'agency', 'fund', 'expense_type', 'program', 'department'], schema: schema, queryModel: queryModel, ref: function ref(input) {\n                _this.gridSearchInput = input;\n            } }) : _react2.default.createElement(\"div\", { className: \"search__bar\" }, _react2.default.createElement(\"div\", { className: \"search__wrapper\" }, _react2.default.createElement(\"div\", { className: \"ui-search small\" }, _react2.default.createElement(\"span\", { className: \"icon-search-1\" }), _react2.default.createElement(\"input\", { type: \"search\", value: searchValue || '', placeholder: \"Search in table\", onKeyDown: this.handleSearchKeyDown, onChange: this.handleSearchChange })), _react2.default.createElement(\"button\", { className: 'ui-button small', onClick: this.handleSearchBtnClick }, \"Search\"))), griddleState ? _react2.default.createElement(_report_header_row_count.ReportHeaderRowCount, { className: 'grid-report-row-count ' + (isControlPanel ? 'pull-right' : ''), count: griddleState.count, estimate: griddleState.estimate }) : null), _react2.default.createElement(_sub_report_header2.default, Object.assign({}, this.props, { onClear: this.clearSearch })));\n    },\n    searchAll: function searchAll(value) {\n        _grid_report_actions2.default.filterColumn('all', 'contains', value || undefined);\n        this.props.onAction('search-all');\n    },\n    handleSearchKeyDown: function handleSearchKeyDown(ev) {\n        var text = _utils2.default.strip(ev.target.value);\n        if (ev.which === 13) {\n            if (text !== '') {\n                this.searchAll(text);\n            }\n        }\n    },\n    handleSearchChange: function handleSearchChange(ev) {\n        this.setState({\n            searchValue: ev.target.value\n        });\n        if (ev.target.value === '') {\n            this.searchAll('');\n        }\n    },\n    handleSearchBtnClick: function handleSearchBtnClick() {\n        var text = _utils2.default.strip(this.state.searchValue);\n        this.searchAll(text);\n    },\n    clearSearch: function clearSearch() {\n        this.setState({\n            searchValue: ''\n        });\n        this.searchAll('');\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        //update the state's searchValue if the querymodel filter is changed in other components\n        //like filterspanel, etc\n        var nextColumnQuery = nextProps.queryModel.getColumnQuery('all').filter;\n        if (!nextColumnQuery.contains || nextColumnQuery.contains !== this.state.searchValue) {\n            this.setState({\n                searchValue: nextProps.queryModel.getColumnQuery('all').contains || ''\n            });\n        }\n    },\n    isPredictiveSearchActive: function isPredictiveSearchActive() {\n        var _props2 = this.props,\n            report = _props2.report,\n            entity = _props2.entity;\n\n        var properties = report.get('properties') || {};\n        var reportProperties = properties.toJS && properties.toJS() || properties;\n        var entityFeatures = entity.get('feature_permissions');\n        var checkImageVisible = reportProperties.check_image_visible;\n        var hasOhioTosFlag = entityFeatures && entityFeatures.find(function (fp) {\n            return fp === 'ohio_tos';\n        });\n        return checkImageVisible && hasOhioTosFlag;\n    }\n});\nexports.default = ReportHeader;\n\n/***/ }),\n/* 958 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Autolinker.js\r\n * 0.11.2\r\n *\r\n * Copyright(c) 2014 Gregory Jacobs <greg@greg-jacobs.com>\r\n * MIT Licensed. http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * https://github.com/gregjacobs/Autolinker.js\r\n */\r\n/*global define, module */\r\n/*jshint undef:true, smarttabs:true */\r\n// Set up Autolinker appropriately for the environment.\r\n( function( root, factory ) {\r\n\tif( true ) {\r\n\t\t!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));             // Define as AMD module if an AMD loader is present (ex: RequireJS).\r\n\t} else if( typeof exports !== 'undefined' ) {\r\n\t\tmodule.exports = factory();    // Define as CommonJS module for Node.js, if available.\r\n\t} else {\r\n\t\troot.Autolinker = factory();   // Finally, define as a browser global if no module loader.\r\n\t}\r\n}( this, function() {\r\n\t\r\n\t/**\r\n\t * @class Autolinker\r\n\t * @extends Object\r\n\t * \r\n\t * Utility class used to process a given string of text, and wrap the URLs, email addresses, and Twitter handles in \r\n\t * the appropriate anchor (&lt;a&gt;) tags to turn them into links.\r\n\t * \r\n\t * Any of the configuration options may be provided in an Object (map) provided to the Autolinker constructor, which\r\n\t * will configure how the {@link #link link()} method will process the links.\r\n\t * \r\n\t * For example:\r\n\t * \r\n\t *     var autolinker = new Autolinker( {\r\n\t *         newWindow : false,\r\n\t *         truncate  : 30\r\n\t *     } );\r\n\t *     \r\n\t *     var html = autolinker.link( \"Joe went to www.yahoo.com\" );\r\n\t *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\r\n\t * \r\n\t * \r\n\t * The {@link #static-link static link()} method may also be used to inline options into a single call, which may\r\n\t * be more convenient for one-off uses. For example:\r\n\t * \r\n\t *     var html = Autolinker.link( \"Joe went to www.yahoo.com\", {\r\n\t *         newWindow : false,\r\n\t *         truncate  : 30\r\n\t *     } );\r\n\t *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\r\n\t * \r\n\t * @constructor\r\n\t * @param {Object} [config] The configuration options for the Autolinker instance, specified in an Object (map).\r\n\t */\r\n\tvar Autolinker = function( cfg ) {\r\n\t\tcfg = cfg || {};\r\n\t\t\r\n\t\t// Assign the properties of `cfg` onto the Autolinker instance\r\n\t\tfor( var prop in cfg )\r\n\t\t\tif( cfg.hasOwnProperty( prop ) ) this[ prop ] = cfg[ prop ];\r\n\t};\r\n\t\r\n\t\r\n\tAutolinker.prototype = {\r\n\t\tconstructor : Autolinker,  // fix constructor property\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} newWindow\r\n\t\t * \r\n\t\t * `true` if the links should open in a new window, `false` otherwise.\r\n\t\t */\r\n\t\tnewWindow : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} stripPrefix\r\n\t\t * \r\n\t\t * `true` if 'http://' or 'https://' and/or the 'www.' should be stripped from the beginning of links, `false` otherwise.\r\n\t\t */\r\n\t\tstripPrefix : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Number} truncate\r\n\t\t * \r\n\t\t * A number for how many characters long URLs/emails/twitter handles should be truncated to inside the text of \r\n\t\t * a link. If the URL/email/twitter is over this number of characters, it will be truncated to this length by \r\n\t\t * adding a two period ellipsis ('..') into the middle of the string.\r\n\t\t * \r\n\t\t * For example: A url like 'http://www.yahoo.com/some/long/path/to/a/file' truncated to 25 characters might look\r\n\t\t * something like this: 'http://www...th/to/a/file'\r\n\t\t */\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} twitter\r\n\t\t * \r\n\t\t * `true` if Twitter handles (\"@example\") should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\ttwitter : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} email\r\n\t\t * \r\n\t\t * `true` if email addresses should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\temail : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} urls\r\n\t\t * \r\n\t\t * `true` if miscellaneous URLs should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\turls : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {String} className\r\n\t\t * \r\n\t\t * A CSS class name to add to the generated links. This class will be added to all links, as well as this class\r\n\t\t * plus url/email/twitter suffixes for styling url/email/twitter links differently.\r\n\t\t * \r\n\t\t * For example, if this config is provided as \"myLink\", then:\r\n\t\t * \r\n\t\t * 1) URL links will have the CSS classes: \"myLink myLink-url\"\r\n\t\t * 2) Email links will have the CSS classes: \"myLink myLink-email\", and\r\n\t\t * 3) Twitter links will have the CSS classes: \"myLink myLink-twitter\"\r\n\t\t */\r\n\t\tclassName : \"\",\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} matcherRegex\r\n\t\t * \r\n\t\t * The regular expression that matches URLs, email addresses, and Twitter handles.\r\n\t\t * \r\n\t\t * This regular expression has the following capturing groups:\r\n\t\t * \r\n\t\t * 1. Group that is used to determine if there is a Twitter handle match (i.e. @someTwitterUser). Simply check for its \r\n\t\t *    existence to determine if there is a Twitter handle match. The next couple of capturing groups give information \r\n\t\t *    about the Twitter handle match.\r\n\t\t * 2. The whitespace character before the @sign in a Twitter handle. This is needed because there are no lookbehinds in\r\n\t\t *    JS regular expressions, and can be used to reconstruct the original string in a replace().\r\n\t\t * 3. The Twitter handle itself in a Twitter match. If the match is '@someTwitterUser', the handle is 'someTwitterUser'.\r\n\t\t * 4. Group that matches an email address. Used to determine if the match is an email address, as well as holding the full \r\n\t\t *    address. Ex: 'me@my.com'\r\n\t\t * 5. Group that matches a URL in the input text. Ex: 'http://google.com', 'www.google.com', or just 'google.com'.\r\n\t\t *    This also includes a path, url parameters, or hash anchors. Ex: google.com/path/to/file?q1=1&q2=2#myAnchor\r\n\t\t * 6. A protocol-relative ('//') match for the case of a 'www.' prefixed URL. Will be an empty string if it is not a \r\n\t\t *    protocol-relative match. We need to know the character before the '//' in order to determine if it is a valid match\r\n\t\t *    or the // was in a string we don't want to auto-link.\r\n\t\t * 7. A protocol-relative ('//') match for the case of a known TLD prefixed URL. Will be an empty string if it is not a \r\n\t\t *    protocol-relative match. See #6 for more info. \r\n\t\t */\r\n\t\tmatcherRegex : (function() {\r\n\t\t\tvar twitterRegex = /(^|[^\\w])@(\\w{1,15})/,              // For matching a twitter handle. Ex: @gregory_jacobs\r\n\t\t\t    \r\n\t\t\t    emailRegex = /(?:[\\-;:&=\\+\\$,\\w\\.]+@)/,             // something@ for email addresses (a.k.a. local-part)\r\n\t\t\t    \r\n\t\t\t    protocolRegex = /(?:[A-Za-z]{3,9}:(?:\\/\\/)?)/,      // match protocol, allow in format http:// or mailto:\r\n\t\t\t    wwwRegex = /(?:www\\.)/,                             // starting with 'www.'\r\n\t\t\t    domainNameRegex = /[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/,  // anything looking at all like a domain, non-unicode domains, not ending in a period\r\n\t\t\t    tldRegex = /\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/,   // match our known top level domains (TLDs)\r\n\t\t\t    \r\n\t\t\t    // Allow optional path, query string, and hash anchor, not ending in the following characters: \"!:,.;\"\r\n\t\t\t    // http://blog.codinghorror.com/the-problem-with-urls/\r\n\t\t\t    urlSuffixRegex = /(?:[\\-A-Za-z0-9+&@#\\/%?=~_()|!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|])?/;  // note: optional part of the full regex\r\n\t\t\t\r\n\t\t\treturn new RegExp( [\r\n\t\t\t\t'(',  // *** Capturing group $1, which can be used to check for a twitter handle match. Use group $3 for the actual twitter handle though. $2 may be used to reconstruct the original string in a replace() \r\n\t\t\t\t\t// *** Capturing group $2, which matches the whitespace character before the '@' sign (needed because of no lookbehinds), and \r\n\t\t\t\t\t// *** Capturing group $3, which matches the actual twitter handle\r\n\t\t\t\t\ttwitterRegex.source,\r\n\t\t\t\t')',\r\n\t\t\t\t\r\n\t\t\t\t'|',\r\n\t\t\t\t\r\n\t\t\t\t'(',  // *** Capturing group $4, which is used to determine an email match\r\n\t\t\t\t\temailRegex.source,\r\n\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\ttldRegex.source,\r\n\t\t\t\t')',\r\n\t\t\t\t\r\n\t\t\t\t'|',\r\n\t\t\t\t\r\n\t\t\t\t'(',  // *** Capturing group $5, which is used to match a URL\r\n\t\t\t\t\t'(?:', // parens to cover match for protocol (optional), and domain\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for a protocol-prefixed url (ex: http://google.com)\r\n\t\t\t\t\t\t\tprotocolRegex.source,\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'|',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for a 'www.' prefixed url (ex: www.google.com)\r\n\t\t\t\t\t\t\t'(.?//)?',  // *** Capturing group $6 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n\t\t\t\t\t\t\twwwRegex.source,\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'|',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for known a TLD url (ex: google.com)\r\n\t\t\t\t\t\t\t'(.?//)?',  // *** Capturing group $7 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t\ttldRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t')',\r\n\t\t\t\t\t\r\n\t\t\t\t\turlSuffixRegex.source,  // match for path, query string, and/or hash anchor\r\n\t\t\t\t')'\r\n\t\t\t].join( \"\" ), 'gi' );\r\n\t\t} )(),\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} protocolRelativeRegex\r\n\t\t * \r\n\t\t * The regular expression used to find protocol-relative URLs. A protocol-relative URL is, for example, \"//yahoo.com\"\r\n\t\t * \r\n\t\t * This regular expression needs to match the character before the '//', in order to determine if we should actually\r\n\t\t * autolink a protocol-relative URL. For instance, we want to autolink something like \"//google.com\", but we\r\n\t\t * don't want to autolink something like \"abc//google.com\"\r\n\t\t */\r\n\t\tprotocolRelativeRegex : /(.)?\\/\\//,\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} htmlRegex\r\n\t\t * \r\n\t\t * The regular expression used to pull out HTML tags from a string. Handles namespaced HTML tags and\r\n\t\t * attribute names, as specified by http://www.w3.org/TR/html-markup/syntax.html.\r\n\t\t * \r\n\t\t * Capturing groups:\r\n\t\t * \r\n\t\t * 1. If it is an end tag, this group will have the '/'.\r\n\t\t * 2. The tag name.\r\n\t\t */\r\n\t\thtmlRegex : (function() {\r\n\t\t\tvar tagNameRegex = /[0-9a-zA-Z:]+/,\r\n\t\t\t    attrNameRegex = /[^\\s\\0\"'>\\/=\\x01-\\x1F\\x7F]+/,   // the unicode range accounts for excluding control chars, and the delete char\r\n\t\t\t    attrValueRegex = /(?:\".*?\"|'.*?'|[^'\"=<>`\\s]+)/, // double quoted, single quoted, or unquoted attribute values\r\n\t\t\t    nameEqualsValueRegex = attrNameRegex.source + '(?:\\\\s*=\\\\s*' + attrValueRegex.source + ')?';  // optional '=[value]'\r\n\t\t\t\r\n\t\t\treturn new RegExp( [\r\n\t\t\t\t'<(?:!|(/))?',  // Beginning of a tag. Either '<' for a start tag, '</' for an end tag, or <! for the <!DOCTYPE ...> tag. The slash or an empty string is Capturing Group 1.\r\n\t\t\t\t\r\n\t\t\t\t\t// The tag name (Capturing Group 2)\r\n\t\t\t\t\t'(' + tagNameRegex.source + ')',\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Zero or more attributes following the tag name\r\n\t\t\t\t\t'(?:',\r\n\t\t\t\t\t\t'\\\\s+',  // one or more whitespace chars before an attribute\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Either:\r\n\t\t\t\t\t\t// A. tag=\"value\", or \r\n\t\t\t\t\t\t// B. \"value\" alone (for <!DOCTYPE> tag. Ex: <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">) \r\n\t\t\t\t\t\t'(?:', nameEqualsValueRegex, '|', attrValueRegex.source + ')',\r\n\t\t\t\t\t')*',\r\n\t\t\t\t\t\r\n\t\t\t\t\t'\\\\s*/?',  // any trailing spaces and optional '/' before the closing '>'\r\n\t\t\t\t'>'\r\n\t\t\t].join( \"\" ), 'g' );\r\n\t\t} )(),\r\n\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} urlPrefixRegex\r\n\t\t * \r\n\t\t * A regular expression used to remove the 'http://' or 'https://' and/or the 'www.' from URLs.\r\n\t\t */\r\n\t\turlPrefixRegex: /^(https?:\\/\\/)?(www\\.)?/i,\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n\t\t * Does not link URLs found within HTML tags.\r\n\t\t * \r\n\t\t * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n\t\t * will be `You should go to &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\r\n\t\t * \r\n\t\t * @method link\r\n\t\t * @param {String} textOrHtml The HTML or text to link URLs, email addresses, and Twitter handles within.\r\n\t\t * @return {String} The HTML, with URLs/emails/twitter handles automatically linked.\r\n\t\t */\r\n\t\tlink : function( textOrHtml ) {\r\n\t\t\treturn this.processHtml( textOrHtml );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Processes the given HTML to auto-link URLs/emails/Twitter handles.\r\n\t\t * \r\n\t\t * Finds the text around any HTML elements in the input `html`, which will be the text that is processed.\r\n\t\t * Any original HTML elements will be left as-is, as well as the text that is already wrapped in anchor tags.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @method processHtml\r\n\t\t * @param {String} html The input text or HTML to process in order to auto-link.\r\n\t\t * @return {String}\r\n\t\t */\r\n\t\tprocessHtml : function( html ) {\r\n\t\t\t// Loop over the HTML string, ignoring HTML tags, and processing the text that lies between them,\r\n\t\t\t// wrapping the URLs in anchor tags\r\n\t\t\tvar htmlRegex = this.htmlRegex,\r\n\t\t\t    currentResult,\r\n\t\t\t    inBetweenTagsText,\r\n\t\t\t    lastIndex = 0,\r\n\t\t\t    anchorTagStackCount = 0,\r\n\t\t\t    resultHtml = [];\r\n\t\t\t\r\n\t\t\twhile( ( currentResult = htmlRegex.exec( html ) ) !== null ) {\r\n\t\t\t\tvar tagText = currentResult[ 0 ],\r\n\t\t\t\t    tagName = currentResult[ 2 ],\r\n\t\t\t\t    isClosingTag = !!currentResult[ 1 ];\r\n\t\t\t\t\r\n\t\t\t\tinBetweenTagsText = html.substring( lastIndex, currentResult.index );\r\n\t\t\t\tlastIndex = currentResult.index + tagText.length;\r\n\t\t\t\t\r\n\t\t\t\t// Process around anchor tags, and any inner text / html they may have\r\n\t\t\t\tif( tagName === 'a' ) {\r\n\t\t\t\t\tif( !isClosingTag ) {  // it's the start <a> tag\r\n\t\t\t\t\t\tanchorTagStackCount++;\r\n\t\t\t\t\t\tresultHtml.push( this.processTextNode( inBetweenTagsText ) );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t} else {   // it's the end </a> tag\r\n\t\t\t\t\t\tanchorTagStackCount = Math.max( anchorTagStackCount - 1, 0 );  // attempt to handle extraneous </a> tags by making sure the stack count never goes below 0\r\n\t\t\t\t\t\tif( anchorTagStackCount === 0 ) {\r\n\t\t\t\t\t\t\tresultHtml.push( inBetweenTagsText );  // We hit the matching </a> tag, simply add all of the text from the start <a> tag to the end </a> tag without linking it\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t} else if( anchorTagStackCount === 0 ) {   // not within an anchor tag, link the \"in between\" text\r\n\t\t\t\t\tresultHtml.push( this.processTextNode( inBetweenTagsText ) );\r\n\t\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// if we have a tag that is in between anchor tags (ex: <a href=\"...\"><b>google.com</b></a>),\r\n\t\t\t\t\t// just append the inner text\r\n\t\t\t\t\tresultHtml.push( inBetweenTagsText );  \r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tresultHtml.push( tagText );  // now add the text of the tag itself verbatim\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Process any remaining text after the last HTML element. Will process all of the text if there were no HTML elements.\r\n\t\t\tif( lastIndex < html.length ) {\r\n\t\t\t\tvar processedTextNode = this.processTextNode( html.substring( lastIndex ) );\r\n\t\t\t\tresultHtml.push( processedTextNode );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn resultHtml.join( \"\" );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Process the text that lies inbetween HTML tags. This method does the actual wrapping of URLs with\r\n\t\t * anchor tags.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The text to auto-link.\r\n\t\t * @return {String} The text with anchor tags auto-filled.\r\n\t\t */\r\n\t\tprocessTextNode : function( text ) {\r\n\t\t\tvar me = this,  // for closures\r\n\t\t\t    matcherRegex = this.matcherRegex,\r\n\t\t\t    enableTwitter = this.twitter,\r\n\t\t\t    enableEmailAddresses = this.email,\r\n\t\t\t    enableUrls = this.urls;\r\n\t\t\t\r\n\t\t\treturn text.replace( matcherRegex, function( matchStr, $1, $2, $3, $4, $5, $6, $7 ) {\r\n\t\t\t\tvar twitterMatch = $1,\r\n\t\t\t\t    twitterHandlePrefixWhitespaceChar = $2,  // The whitespace char before the @ sign in a Twitter handle match. This is needed because of no lookbehinds in JS regexes\r\n\t\t\t\t    twitterHandle = $3,   // The actual twitterUser (i.e the word after the @ sign in a Twitter handle match)\r\n\t\t\t\t    emailAddress = $4,    // For both determining if it is an email address, and stores the actual email address\r\n\t\t\t\t    urlMatch = $5,        // The matched URL string\r\n\t\t\t\t    protocolRelativeMatch = $6 || $7,  // The '//' for a protocol-relative match, with the character that comes before the '//'\r\n\t\t\t\t    \r\n\t\t\t\t    prefixStr = \"\",       // A string to use to prefix the anchor tag that is created. This is needed for the Twitter handle match\r\n\t\t\t\t    suffixStr = \"\";       // A string to suffix the anchor tag that is created. This is used if there is a trailing parenthesis that should not be auto-linked.\r\n\t\t\t\t\r\n\t\t\t\t// Early exits with no replacements for:\r\n\t\t\t\t// 1) Disabled link types\r\n\t\t\t\t// 2) URL matches which do not have at least have one period ('.') in the domain name (effectively skipping over \r\n\t\t\t\t//    matches like \"abc:def\")\r\n\t\t\t\t// 3) A protocol-relative url match (a URL beginning with '//') whose previous character is a word character \r\n\t\t\t\t//    (effectively skipping over strings like \"abc//google.com\")\r\n\t\t\t\tif( \r\n\t\t\t\t    ( twitterMatch && !enableTwitter ) || ( emailAddress && !enableEmailAddresses ) || ( urlMatch && !enableUrls ) ||\r\n\t\t\t\t    ( urlMatch && urlMatch.indexOf( '.' ) === -1 ) ||  // At least one period ('.') must exist in the URL match for us to consider it an actual URL\r\n\t\t\t\t    ( urlMatch && /^[A-Za-z]{3,9}:/.test( urlMatch ) && !/:.*?[A-Za-z]/.test( urlMatch ) ) ||  // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\r\n\t\t\t\t    ( protocolRelativeMatch && /^[\\w]\\/\\//.test( protocolRelativeMatch ) )  // a protocol-relative match which has a word character in front of it (so we can skip something like \"abc//google.com\")\r\n\t\t\t\t) {\r\n\t\t\t\t\treturn matchStr;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t// Handle a closing parenthesis at the end of the match, and exclude it if there is not a matching open parenthesis\r\n\t\t\t\t// in the match. This handles cases like the string \"wikipedia.com/something_(disambiguation)\" (which should be auto-\r\n\t\t\t\t// linked, and when it is enclosed in parenthesis itself, such as: \"(wikipedia.com/something_(disambiguation))\" (in\r\n\t\t\t\t// which the outer parens should *not* be auto-linked.\r\n\t\t\t\tvar lastChar = matchStr.charAt( matchStr.length - 1 );\r\n\t\t\t\tif( lastChar === ')' ) {\r\n\t\t\t\t\tvar openParensMatch = matchStr.match( /\\(/g ),\r\n\t\t\t\t\t    closeParensMatch = matchStr.match( /\\)/g ),\r\n\t\t\t\t\t    numOpenParens = ( openParensMatch && openParensMatch.length ) || 0,\r\n\t\t\t\t\t    numCloseParens = ( closeParensMatch && closeParensMatch.length ) || 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif( numOpenParens < numCloseParens ) {\r\n\t\t\t\t\t\tmatchStr = matchStr.substr( 0, matchStr.length - 1 );  // remove the trailing \")\"\r\n\t\t\t\t\t\tsuffixStr = \")\";  // this will be added after the <a> tag\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tvar anchorHref = matchStr,  // initialize both of these\r\n\t\t\t\t    anchorText = matchStr,  // values as the full match\r\n\t\t\t\t    linkType;\r\n\r\n\t\t\t\t// Process the urls that are found. We need to change URLs like \"www.yahoo.com\" to \"http://www.yahoo.com\" (or the browser\r\n\t\t\t\t// will try to direct the user to \"http://current-domain.com/www.yahoo.com\"), and we need to prefix 'mailto:' to email addresses.\r\n\t\t\t\tif( twitterMatch ) {\r\n\t\t\t\t\tlinkType = 'twitter';\r\n\t\t\t\t\tprefixStr = twitterHandlePrefixWhitespaceChar;\r\n\t\t\t\t\tanchorHref = 'https://twitter.com/' + twitterHandle;\r\n\t\t\t\t\tanchorText = '@' + twitterHandle;\r\n\t\t\t\t\t\r\n\t\t\t\t} else if( emailAddress ) {\r\n\t\t\t\t\tlinkType = 'email';\r\n\t\t\t\t\tanchorHref = 'mailto:' + emailAddress;\r\n\t\t\t\t\tanchorText = emailAddress;\r\n\t\t\t\t\t\r\n\t\t\t\t} else {  // url match\r\n\t\t\t\t\tlinkType = 'url';\r\n\t\t\t\t\t\r\n\t\t\t\t\tif( protocolRelativeMatch ) {\r\n\t\t\t\t\t\t// Strip off any protocol-relative '//' from the anchor text (leaving the previous non-word character \r\n\t\t\t\t\t\t// intact, if there is one)\r\n\t\t\t\t\t\tvar protocolRelRegex = new RegExp( \"^\" + me.protocolRelativeRegex.source ),  // for this one, we want to only match at the beginning of the string\r\n\t\t\t\t\t\t    charBeforeMatch = protocolRelativeMatch.match( protocolRelRegex )[ 1 ] || \"\";\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tprefixStr = charBeforeMatch + prefixStr;  // re-add the character before the '//' to what will be placed before the <a> tag\r\n\t\t\t\t\t\tanchorHref = anchorHref.replace( protocolRelRegex, \"//\" );  // remove the char before the match for the href\r\n\t\t\t\t\t\tanchorText = anchorText.replace( protocolRelRegex, \"\" );    // remove both the char before the match and the '//' for the anchor text\r\n\r\n\t\t\t\t\t} else if( !/^[A-Za-z]{3,9}:/i.test( anchorHref ) ) {\r\n\t\t\t\t\t\t// url string doesn't begin with a protocol, assume http://\r\n\t\t\t\t\t\tanchorHref = 'http://' + anchorHref;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// wrap the match in an anchor tag\r\n\t\t\t\tvar anchorTag = me.createAnchorTag( linkType, anchorHref, anchorText );\r\n\t\t\t\treturn prefixStr + anchorTag + suffixStr;\r\n\t\t\t} );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Generates the actual anchor (&lt;a&gt;) tag to use in place of a source url/email/twitter link.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @param {String} anchorHref The href for the anchor tag.\r\n\t\t * @param {String} anchorText The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The full HTML for the anchor tag.\r\n\t\t */\r\n\t\tcreateAnchorTag : function( linkType, anchorHref, anchorText ) {\r\n\t\t\tvar attributesStr = this.createAnchorAttrsStr( linkType, anchorHref );\r\n\t\t\tanchorText = this.processAnchorText( anchorText );\r\n\t\t\t\r\n\t\t\treturn '<a ' + attributesStr + '>' + anchorText + '</a>';\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Creates the string which will be the HTML attributes for the anchor (&lt;a&gt;) tag being generated.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @param {String} href The href for the anchor tag.\r\n\t\t * @return {String} The anchor tag's attribute. Ex: `href=\"http://google.com\" class=\"myLink myLink-url\" target=\"_blank\"` \r\n\t\t */\r\n\t\tcreateAnchorAttrsStr : function( linkType, anchorHref ) {\r\n\t\t\tvar attrs = [ 'href=\"' + anchorHref + '\"' ];  // we'll always have the `href` attribute\r\n\t\t\t\r\n\t\t\tvar cssClass = this.createCssClass( linkType );\r\n\t\t\tif( cssClass ) {\r\n\t\t\t\tattrs.push( 'class=\"' + cssClass + '\"' );\r\n\t\t\t}\r\n\t\t\tif( this.newWindow ) {\r\n\t\t\t\tattrs.push( 'target=\"_blank\"' );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn attrs.join( \" \" );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Creates the CSS class that will be used for a given anchor tag, based on the `linkType` and the {@link #className}\r\n\t\t * config.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @return {String} The CSS class string for the link. Example return: \"myLink myLink-url\". If no {@link #className}\r\n\t\t *   was configured, returns an empty string.\r\n\t\t */\r\n\t\tcreateCssClass : function( linkType ) {\r\n\t\t\tvar className = this.className;\r\n\t\t\t\r\n\t\t\tif( !className ) \r\n\t\t\t\treturn \"\";\r\n\t\t\telse\r\n\t\t\t\treturn className + \" \" + className + \"-\" + linkType;  // ex: \"myLink myLink-url\", \"myLink myLink-email\", or \"myLink myLink-twitter\"\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Processes the `anchorText` by stripping the URL prefix (if {@link #stripPrefix} is `true`), removing\r\n\t\t * any trailing slash, and truncating the text according to the {@link #truncate} config.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} anchorText The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The processed `anchorText`.\r\n\t\t */\r\n\t\tprocessAnchorText : function( anchorText ) {\r\n\t\t\tif( this.stripPrefix ) {\r\n\t\t\t\tanchorText = this.stripUrlPrefix( anchorText );\r\n\t\t\t}\r\n\t\t\tanchorText = this.removeTrailingSlash( anchorText );  // remove trailing slash, if there is one\r\n\t\t\tanchorText = this.doTruncate( anchorText );\r\n\t\t\t\r\n\t\t\treturn anchorText;\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Strips the URL prefix (such as \"http://\" or \"https://\") from the given text.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The text of the anchor that is being generated, for which to strip off the\r\n\t\t *   url prefix (such as stripping off \"http://\")\r\n\t\t * @return {String} The `anchorText`, with the prefix stripped.\r\n\t\t */\r\n\t\tstripUrlPrefix : function( text ) {\r\n\t\t\treturn text.replace( this.urlPrefixRegex, '' );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Removes any trailing slash from the given `anchorText`, in prepration for the text to be displayed.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\r\n\t\t *   slash ('/') that may exist.\r\n\t\t * @return {String} The `anchorText`, with the trailing slash removed.\r\n\t\t */\r\n\t\tremoveTrailingSlash : function( anchorText ) {\r\n\t\t\tif( anchorText.charAt( anchorText.length - 1 ) === '/' ) {\r\n\t\t\t\tanchorText = anchorText.slice( 0, -1 );\r\n\t\t\t}\r\n\t\t\treturn anchorText;\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Performs the truncation of the `anchorText`, if the `anchorText` is longer than the {@link #truncate} option.\r\n\t\t * Truncates the text to 2 characters fewer than the {@link #truncate} option, and adds \"..\" to the end.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The truncated anchor text.\r\n\t\t */\r\n\t\tdoTruncate : function( anchorText ) {\r\n\t\t\tvar truncateLen = this.truncate;\r\n\t\t\t\r\n\t\t\t// Truncate the anchor text if it is longer than the provided 'truncate' option\r\n\t\t\tif( truncateLen && anchorText.length > truncateLen ) {\r\n\t\t\t\tanchorText = anchorText.substring( 0, truncateLen - 2 ) + '..';\r\n\t\t\t}\r\n\t\t\treturn anchorText;\r\n\t\t}\r\n\t\r\n\t};\r\n\t\r\n\t\r\n\t/**\r\n\t * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n\t * Does not link URLs found within HTML tags.\r\n\t * \r\n\t * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n\t * will be `You should go to &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\r\n\t * \r\n\t * Example:\r\n\t * \r\n\t *     var linkedText = Autolinker.link( \"Go to google.com\", { newWindow: false } );\r\n\t *     // Produces: \"Go to <a href=\"http://google.com\">google.com</a>\"\r\n\t * \r\n\t * @static\r\n\t * @method link\r\n\t * @param {String} html The HTML text to link URLs within.\r\n\t * @param {Object} [options] Any of the configuration options for the Autolinker class, specified in an Object (map).\r\n\t *   See the class description for an example call.\r\n\t * @return {String} The HTML text, with URLs automatically linked\r\n\t */\r\n\tAutolinker.link = function( text, options ) {\r\n\t\tvar autolinker = new Autolinker( options );\r\n\t\treturn autolinker.link( text );\r\n\t};\r\n\r\n\t\r\n\treturn Autolinker;\r\n\t\r\n} ) );\r\n\n\n/***/ }),\n/* 959 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.AutoComplete = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactI18next = __webpack_require__(148);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEBOUNCE_INTERVAL = 150;\nvar AutoComplete = exports.AutoComplete = (0, _createReactClass2.default)({\n    displayName: 'AutoComplete',\n\n    propTypes: {\n        columns: _propTypes2.default.array,\n        dataSetId: _propTypes2.default.string,\n        queryModel: _propTypes2.default.object,\n        schema: _propTypes2.default.array //The column schema associated with the dataset\n    },\n    getInitialState: function getInitialState() {\n        return {\n            isOpen: false,\n            isLoading: false,\n            hasError: false,\n            search: '',\n            focusedFilter: null,\n            allSearchApplied: false,\n            lastAppliedAction: null,\n            validColumnMap: null,\n            filters: [] //The fetched distinct filters for a given `search`\n        };\n    },\n    componentWillMount: function componentWillMount() {\n        //Debounce the fetch method to prevent spamming the server on every keystroke\n        this._debouncedFetchDistinctFilter = _lodash2.default.debounce(this._fetchDistinctFilters, DEBOUNCE_INTERVAL);\n        this.props.queryModel.on('change', this.handleQueryChange);\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this.props.queryModel.off('change', this.handleQueryChange);\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        var _this = this;\n\n        //Cache the computed map of valid columns in state when the schema array becomes available\n        if (nextProps.schema && !this.state.validColumnMap) {\n            var validColumnMap = (0, _lodash2.default)(nextProps.schema).filter(function (c) {\n                return c.type === 'text' && _lodash2.default.includes(_this.props.columns, c.name);\n            }).keyBy('name').value();\n            this.setState({\n                validColumnMap: validColumnMap\n            });\n        }\n    },\n    componentDidUpdate: function componentDidUpdate() {\n        if (this._focusedFilterReveal) {\n            if (this.refs.focused && this.refs.menu) {\n                var focusedDOM = _reactDom2.default.findDOMNode(this.refs.focused);\n                var menuDOM = _reactDom2.default.findDOMNode(this.refs.menu);\n                var focusedRect = focusedDOM.getBoundingClientRect();\n                var menuRect = menuDOM.getBoundingClientRect();\n                if (focusedRect.bottom > menuRect.bottom || focusedRect.top < menuRect.top) {\n                    menuDOM.scrollTop = focusedDOM.offsetTop + focusedDOM.clientHeight - menuDOM.offsetHeight;\n                }\n            }\n            this._focusedFilterReveal = false;\n        }\n    },\n    isFocusedFilterInFilters: function isFocusedFilterInFilters() {\n        var _state = this.state,\n            filters = _state.filters,\n            focusedFilter = _state.focusedFilter;\n\n        return _lodash2.default.includes(filters, focusedFilter);\n    },\n    handleQueryChange: function handleQueryChange() {\n        var q = this.props.queryModel.toJSON();\n        var allFilter = q.filter && q.filter.all && q.filter.all.contains;\n        var inputColumnFilterId = this.state.focusedFilter && this.state.focusedFilter.column;\n        var inputColumnFilter = inputColumnFilterId && this.state.focusedFilter.value;\n        var columnFilter = q.filter && q.filter[inputColumnFilterId] && q.filter[inputColumnFilterId].eq;\n        // We need to update the text field when we have no search and an all filter appears, when an\n        // all filter we're display changes, or when a column filter we're displaying changes.\n        // TODO tie this model closer to the QueryModel and avoid this logic\n        if (!this.state.search && allFilter || this.state.allSearchApplied && this.state.search !== allFilter) {\n            this.handleAllSearch(allFilter, true);\n        } else if (inputColumnFilterId && inputColumnFilter !== columnFilter) {\n            this.handleApplyFilter({ column: inputColumnFilterId, value: columnFilter }, true);\n        }\n    },\n    handleClearInput: function handleClearInput() {\n        var stateUpdate = {\n            search: '',\n            isOpen: false,\n            allSearchApplied: null\n        };\n        var _state2 = this.state,\n            lastAppliedAction = _state2.lastAppliedAction,\n            focusedFilter = _state2.focusedFilter,\n            allSearchApplied = _state2.allSearchApplied;\n\n        if (focusedFilter && lastAppliedAction === 'filter') {\n            this.props.queryModel.filterColumn(this.state.focusedFilter.column, 'eq', undefined);\n            this.props.queryModel.triggerUpdate();\n        }\n        if (allSearchApplied && lastAppliedAction === 'all') {\n            this.props.queryModel.filterColumn('all', 'contains', undefined);\n            this.props.queryModel.triggerUpdate();\n            stateUpdate.allSearchApplied = false;\n        }\n        this.setState(stateUpdate);\n    },\n    handleInputChange: function handleInputChange(e) {\n        var val = e.target.value;\n        var isOpen = val.length > 2;\n        var isEmpty = val.length === 0;\n        this.setState({\n            isOpen: isOpen,\n            search: val,\n            isLoading: isOpen\n        });\n        if (isEmpty) {\n            this.handleClearInput();\n        }\n        if (isOpen) {\n            this._debouncedFetchDistinctFilter();\n        }\n    },\n    handleEnter: function handleEnter() {\n        var _state3 = this.state,\n            focusedFilter = _state3.focusedFilter,\n            isOpen = _state3.isOpen,\n            search = _state3.search;\n\n        if (isOpen && focusedFilter && this.isFocusedFilterInFilters()) {\n            this.handleApplyFilter(focusedFilter);\n        } else {\n            this.handleAllSearch(search);\n        }\n    },\n    handleAllSearch: function handleAllSearch(search, skipFilterChange) {\n        var searchVal = search && _utils2.default.strip(search);\n        this.setState({\n            lastAppliedAction: 'all',\n            isOpen: false,\n            isLoading: false,\n            search: search,\n            allSearchApplied: true\n        }, function () {\n            if (!skipFilterChange) {\n                _grid_report_actions2.default.filterColumn('all', 'contains', searchVal);\n            }\n        });\n    },\n    handleApplyFilter: function handleApplyFilter(f, skipFilterChange) {\n        var searchVal = f.value && _utils2.default.strip(f.value);\n        this.setState({\n            lastAppliedAction: 'filter',\n            isOpen: false,\n            isLoading: false,\n            focusedFilter: f,\n            search: f.value,\n            allSearchApplied: false\n        }, function () {\n            if (!skipFilterChange) {\n                _grid_report_actions2.default.filterColumn(f.column, 'eq', searchVal);\n            }\n        });\n    },\n    handleMouseEnter: function handleMouseEnter(f) {\n        this.setState({\n            focusedFilter: f\n        });\n    },\n    handleKeyDown: function handleKeyDown(event) {\n        switch (event.keyCode) {\n            case 9:\n                // tab\n                if (event.shiftKey || !this.state.isOpen || !this.state.focusedFilter) {\n                    return;\n                }\n                this.handleEnter();\n                break;\n            case 13:\n                // enter\n                this.handleEnter();\n                break;\n            case 27:\n                // escape\n                this.handleClearInput();\n                break;\n            case 38:\n                // up\n                this.focusPreviousFilter();\n                break;\n            case 40:\n                // down\n                this.focusNextFilter();\n                break;\n            default:\n                return;\n        }\n        event.preventDefault();\n    },\n    focusNextFilter: function focusNextFilter() {\n        this._focusAdjacentFilter('next');\n    },\n    focusPreviousFilter: function focusPreviousFilter() {\n        this._focusAdjacentFilter('previous');\n    },\n    _focusAdjacentFilter: function _focusAdjacentFilter(dir) {\n        this._focusedFilterReveal = true;\n        var _state4 = this.state,\n            filters = _state4.filters,\n            focusedFilter = _state4.focusedFilter;\n\n        var focusedFilterIndex = _lodash2.default.findIndex(filters, function (filter) {\n            return _lodash2.default.isEqual(filter, focusedFilter);\n        });\n        focusedFilter = filters[0];\n        if (dir === 'next' && focusedFilterIndex > -1 && focusedFilterIndex < filters.length - 1) {\n            focusedFilter = filters[focusedFilterIndex + 1];\n        } else if (dir === 'previous') {\n            if (focusedFilterIndex > 0) {\n                focusedFilter = filters[focusedFilterIndex - 1];\n            } else {\n                focusedFilter = filters[filters.length - 1];\n            }\n        }\n        this.setState({\n            focusedFilter: focusedFilter\n        });\n    },\n    _fetchDistinctFilters: function _fetchDistinctFilters() {\n        var _this2 = this;\n\n        var _state5 = this.state,\n            validColumnMap = _state5.validColumnMap,\n            search = _state5.search;\n        var dataSetId = this.props.dataSetId;\n\n        var query = this._buildDistinctQuery(_lodash2.default.keys(validColumnMap), search, 15);\n        //Use pendingRequests array to queue up any 'lagging' in-flight requests\n        //and abort them to prevent overwriting the current filter dropdown with old results\n        this.pendingRequests = this.pendingRequests || [];\n        if (this.pendingRequests.length > 0) {\n            this.pendingRequests.forEach(function (req) {\n                return req.abort();\n            });\n        }\n        var request = _og_api2.default.trapi.post('distinct', dataSetId, query);\n        this.pendingRequests.push(request);\n        request.end().then(function (res) {\n            _this2.setState({\n                filters: _this2._flattenResponse(res.body),\n                isLoading: false,\n                hasError: false\n            });\n            _this2.pendingRequests = [];\n        }).catch(function () {\n            _this2.setState({\n                filters: [],\n                isLoading: false,\n                hasError: true\n            });\n        });\n    },\n    _flattenResponse: function _flattenResponse(groupedFilters) {\n        var filterArr = (0, _lodash2.default)(groupedFilters).map(function (vals, col) {\n            return _lodash2.default.map(vals, function (v) {\n                return {\n                    column: col,\n                    value: v\n                };\n            });\n        });\n        return filterArr.flatten().value();\n    },\n    _buildDistinctQuery: function _buildDistinctQuery(columns, contains, limit) {\n        return {\n            distinct: {\n                columns: columns,\n                contains: contains\n            },\n            limit: limit\n        };\n    },\n    render: function render() {\n        var _this3 = this;\n\n        var _state6 = this.state,\n            _state6$search = _state6.search,\n            search = _state6$search === undefined ? '' : _state6$search,\n            filters = _state6.filters,\n            focusedFilter = _state6.focusedFilter,\n            hasError = _state6.hasError,\n            isLoading = _state6.isLoading,\n            isOpen = _state6.isOpen,\n            validColumnMap = _state6.validColumnMap;\n        var t = this.props.t;\n\n        var clearButton = (0, _classnames2.default)({\n            'ui-search__spinner': isLoading,\n            'is-active': search && !isLoading,\n            'icon-remove-2': search && !isLoading\n        });\n        return _react2.default.createElement(\"div\", { className: \"search__bar\" }, _react2.default.createElement(\"div\", { className: \"search__wrapper\" }, _react2.default.createElement(\"div\", { className: \"ui-search small\" }, _react2.default.createElement(\"span\", { className: \"icon-search-1\" }), _react2.default.createElement(\"input\", { type: \"text\", tabIndex: 1, placeholder: t('strings.placeholders.search_in_table'), value: search, onKeyDown: this.handleKeyDown, onChange: this.handleInputChange }), _react2.default.createElement(\"span\", { className: clearButton, onClick: this.handleClearInput })), _react2.default.createElement(\"button\", { className: 'ui-button small', onClick: this.handleEnter }, \"Search\"), isOpen ? _react2.default.createElement(SearchDropdown, { query: search, hasResults: filters.length > 0, hasError: hasError }, filters.length > 0 ? _react2.default.createElement(SearchDropdownList, { ref: \"menu\" }, filters.map(function (f) {\n            return _react2.default.createElement(SearchDropdownListItem, { key: f.column + f.value, ref: _lodash2.default.isEqual(f, focusedFilter) ? 'focused' : null, isActive: _lodash2.default.isEqual(f, focusedFilter), category: validColumnMap[f.column].label, value: f.value, onApplyFilter: _this3.handleApplyFilter.bind(null, f, false), onMouseEnter: _this3.handleMouseEnter.bind(null, f) });\n        })) : null, _react2.default.createElement(\"a\", { className: \"ui-search__footer\", onClick: this.handleAllSearch.bind(null, this.state.search, false) }, \"Search entire table\")) : null));\n    }\n});\nvar SearchDropdown = (0, _createReactClass2.default)({\n    displayName: 'SearchDropdown',\n\n    propTypes: {\n        query: _propTypes2.default.string,\n        hasResults: _propTypes2.default.bool\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-search__dropdown\" }, _react2.default.createElement(\"header\", { className: \"ui-search__header\" }, this.props.hasError ? _react2.default.createElement(\"small\", null, \"Predictive search is currently unavailable\") : this.props.hasResults ? _react2.default.createElement(\"small\", null, \"Search results for \\\"\", this.props.query, \"\\\"\") : null), this.props.children);\n    }\n});\nvar SearchDropdownList = (0, _createReactClass2.default)({\n    displayName: 'SearchDropdownList',\n    render: function render() {\n        return _react2.default.createElement(\"ul\", { className: \"ui-search__results\" }, this.props.children);\n    }\n});\nvar SearchDropdownListItem = (0, _createReactClass2.default)({\n    displayName: 'SearchDropdownListItem',\n\n    propTypes: {\n        result: _propTypes2.default.string,\n        category: _propTypes2.default.string\n    },\n    render: function render() {\n        var itemStyle = (0, _classnames2.default)({\n            'ui-search__results__item': true,\n            'is-active': this.props.isActive\n        });\n        return _react2.default.createElement(\"li\", null, _react2.default.createElement(\"a\", { className: itemStyle, onClick: this.props.onApplyFilter, onMouseEnter: this.props.onMouseEnter }, _react2.default.createElement(\"span\", { className: \"ui-search__results__title\" }, this.props.value), this.props.category ? _react2.default.createElement(\"small\", { className: \"ui-search__results__type\" }, this.props.category) : null));\n    }\n});\nexports.default = (0, _reactI18next.translate)('report', { wait: true })(AutoComplete);\n\n/***/ }),\n/* 960 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = translate;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics__ = __webpack_require__(189);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__shallowEqual__ = __webpack_require__(961);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__context__ = __webpack_require__(266);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__I18n__ = __webpack_require__(523);\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\n\n\nfunction getDisplayName(component) {\n  return component.displayName || component.name || 'Component';\n}\n\nfunction translate(namespaceArg) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n  return function Wrapper(WrappedComponent) {\n    var Translate = function (_Component) {\n      _inherits(Translate, _Component);\n\n      function Translate(props, context) {\n        _classCallCheck(this, Translate);\n\n        var _this = _possibleConstructorReturn(this, (Translate.__proto__ || Object.getPrototypeOf(Translate)).call(this, props, context));\n\n        _this.i18n = props.i18n || options.i18n || context.i18n || Object(__WEBPACK_IMPORTED_MODULE_4__context__[\"b\" /* getI18n */])();\n        _this.namespaces = typeof namespaceArg === 'function' ? namespaceArg(props) : namespaceArg || _this.i18n.options && _this.i18n.options.defaultNS;\n        if (typeof _this.namespaces === 'string') _this.namespaces = [_this.namespaces];\n\n        var i18nOptions = _this.i18n && _this.i18n.options && _this.i18n.options.react || {};\n        _this.options = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__context__[\"a\" /* getDefaults */])(), i18nOptions, options);\n\n        _this.getWrappedInstance = _this.getWrappedInstance.bind(_this);\n        return _this;\n      }\n\n      _createClass(Translate, [{\n        key: 'shouldComponentUpdate',\n        value: function shouldComponentUpdate(nextProps) {\n          if (!this.options.usePureComponent) {\n            return true;\n          }\n\n          return !Object(__WEBPACK_IMPORTED_MODULE_3__shallowEqual__[\"a\" /* default */])(this.props, nextProps);\n        }\n      }, {\n        key: 'getWrappedInstance',\n        value: function getWrappedInstance() {\n          if (!this.options.withRef) {\n            // eslint-disable-next-line no-console\n            console.error('To access the wrapped instance, you need to specify ' + '{ withRef: true } as the second argument of the translate() call.');\n          }\n\n          /* eslint react/no-string-refs: 1 */\n          return this.wrappedInstance;\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          var _this2 = this;\n\n          var extraProps = {};\n\n          if (this.options.withRef) {\n            extraProps.ref = function (c) {\n              _this2.wrappedInstance = c;\n            };\n          }\n\n          return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__I18n__[\"a\" /* default */], _extends({ ns: this.namespaces }, this.options, this.props, { i18n: this.i18n }), function (t, _ref) {\n            var ready = _ref.ready,\n                context = _objectWithoutProperties(_ref, ['ready']);\n\n            return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(WrappedComponent, _extends({\n              tReady: ready\n            }, _this2.props, extraProps, context));\n          });\n        }\n      }]);\n\n      return Translate;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__[\"Component\"]);\n\n    Translate.WrappedComponent = WrappedComponent;\n\n    Translate.contextTypes = {\n      i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object\n    };\n\n    Translate.displayName = 'Translate(' + getDisplayName(WrappedComponent) + ')';\n\n    Translate.namespaces = namespaceArg;\n\n    return __WEBPACK_IMPORTED_MODULE_2_hoist_non_react_statics___default()(Translate, WrappedComponent);\n  };\n}\n\ntranslate.setDefaults = __WEBPACK_IMPORTED_MODULE_4__context__[\"d\" /* setDefaults */];\n\ntranslate.setI18n = __WEBPACK_IMPORTED_MODULE_4__context__[\"e\" /* setI18n */];\n\n/***/ }),\n/* 961 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = shallowEqual;\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @providesModule shallowEqual\n * @typechecks\n * \n */\n\n/* eslint-disable no-self-compare */\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/***/ }),\n/* 962 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar Interpolate = function (_Component) {\n  _inherits(Interpolate, _Component);\n\n  function Interpolate(props, context) {\n    _classCallCheck(this, Interpolate);\n\n    var _this = _possibleConstructorReturn(this, (Interpolate.__proto__ || Object.getPrototypeOf(Interpolate)).call(this, props, context));\n\n    _this.i18n = props.i18n || context.i18n;\n    _this.t = props.t || context.t;\n    return _this;\n  }\n\n  _createClass(Interpolate, [{\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var parent = this.props.parent || 'span';\n      var REGEXP = this.props.regexp || this.i18n.services.interpolator.regexp;\n      var _props = this.props,\n          className = _props.className,\n          style = _props.style;\n\n      // Set to true if you want to use raw HTML in translation values\n      // See https://github.com/i18next/react-i18next/issues/189\n\n      var useDangerouslySetInnerHTML = this.props.useDangerouslySetInnerHTML || false;\n      var dangerouslySetInnerHTMLPartElement = this.props.dangerouslySetInnerHTMLPartElement || 'span';\n\n      var tOpts = _extends({}, this.props.options, { interpolation: { prefix: '#$?', suffix: '?$#' } });\n      var format = this.t(this.props.i18nKey, tOpts);\n\n      if (!format || typeof format !== 'string') return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('noscript', null);\n\n      var children = [];\n\n      var handleFormat = function handleFormat(key, props) {\n        if (key.indexOf(_this2.i18n.options.interpolation.formatSeparator) < 0) {\n          if (props[key] === undefined) _this2.i18n.services.logger.warn('interpolator: missed to pass in variable ' + key + ' for interpolating ' + format);\n          return props[key];\n        }\n\n        var p = key.split(_this2.i18n.options.interpolation.formatSeparator);\n        var k = p.shift().trim();\n        var f = p.join(_this2.i18n.options.interpolation.formatSeparator).trim();\n\n        if (props[k] === undefined) _this2.i18n.services.logger.warn('interpolator: missed to pass in variable ' + k + ' for interpolating ' + format);\n        return _this2.i18n.options.interpolation.format(props[k], f, _this2.i18n.language);\n      };\n\n      format.split(REGEXP).reduce(function (memo, match, index) {\n        var child = void 0;\n\n        if (index % 2 === 0) {\n          if (match.length === 0) return memo;\n          if (useDangerouslySetInnerHTML) {\n            child = __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(dangerouslySetInnerHTMLPartElement, { dangerouslySetInnerHTML: { __html: match } });\n          } else {\n            child = match;\n          }\n        } else {\n          child = handleFormat(match, _this2.props);\n        }\n\n        memo.push(child);\n        return memo;\n      }, children);\n\n      var additionalProps = {};\n      if (this.i18n.options.react && this.i18n.options.react.exposeNamespace) {\n        var ns = typeof this.t.ns === 'string' ? this.t.ns : this.t.ns[0];\n        if (this.props.i18nKey && this.i18n.options.nsSeparator && this.props.i18nKey.indexOf(this.i18n.options.nsSeparator) > -1) {\n          var parts = this.props.i18nKey.split(this.i18n.options.nsSeparator);\n          ns = parts[0];\n        }\n        if (this.t.ns) additionalProps['data-i18next-options'] = JSON.stringify({ ns: ns });\n      }\n\n      if (className) additionalProps.className = className;\n      if (style) additionalProps.style = style;\n\n      return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement.apply(this, [parent, additionalProps].concat(children));\n    }\n  }]);\n\n  return Interpolate;\n}(__WEBPACK_IMPORTED_MODULE_0_react__[\"Component\"]);\n\nInterpolate.propTypes = {\n  className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string\n};\n\nInterpolate.defaultProps = {\n  className: ''\n};\n\nInterpolate.contextTypes = {\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired,\n  t: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Interpolate);\n\n/***/ }),\n/* 963 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_html_parse_stringify2__ = __webpack_require__(964);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_html_parse_stringify2___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_html_parse_stringify2__);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nfunction hasChildren(node) {\n  return node && (node.children || node.props && node.props.children);\n}\n\nfunction getChildren(node) {\n  return node && node.children ? node.children : node.props && node.props.children;\n}\n\nfunction nodesToString(mem, children, index) {\n  if (!children) return '';\n  if (Object.prototype.toString.call(children) !== '[object Array]') children = [children];\n\n  children.forEach(function (child, i) {\n    // const isElement = React.isValidElement(child);\n    // const elementKey = `${index !== 0 ? index + '-' : ''}${i}:${typeof child.type === 'function' ? child.type.name : child.type || 'var'}`;\n    var elementKey = '' + i;\n\n    if (typeof child === 'string') {\n      mem = '' + mem + child;\n    } else if (hasChildren(child)) {\n      mem = mem + '<' + elementKey + '>' + nodesToString('', getChildren(child), i + 1) + '</' + elementKey + '>';\n    } else if (__WEBPACK_IMPORTED_MODULE_0_react___default.a.isValidElement(child)) {\n      mem = mem + '<' + elementKey + '></' + elementKey + '>';\n    } else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') {\n      var clone = _extends({}, child);\n      var format = clone.format;\n      delete clone.format;\n\n      var keys = Object.keys(clone);\n      if (format && keys.length === 1) {\n        mem = mem + '<' + elementKey + '>{{' + keys[0] + ', ' + format + '}}</' + elementKey + '>';\n      } else if (keys.length === 1) {\n        mem = mem + '<' + elementKey + '>{{' + keys[0] + '}}</' + elementKey + '>';\n      } else if (console && console.warn) {\n        // not a valid interpolation object (can only contain one value plus format)\n        console.warn('react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.', child);\n      }\n    } else if (console && console.warn) {\n      console.warn('react-i18next: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.', child);\n    }\n  });\n\n  return mem;\n}\n\nfunction renderNodes(children, targetString, i18n) {\n  if (targetString === \"\") return [];\n  if (!children) return [targetString];\n\n  // parse ast from string with additional wrapper tag\n  // -> avoids issues in parser removing prepending text nodes\n  var ast = __WEBPACK_IMPORTED_MODULE_2_html_parse_stringify2___default.a.parse('<0>' + targetString + '</0>');\n\n  function mapAST(reactNodes, astNodes) {\n    if (Object.prototype.toString.call(reactNodes) !== '[object Array]') reactNodes = [reactNodes];\n    if (Object.prototype.toString.call(astNodes) !== '[object Array]') astNodes = [astNodes];\n\n    return astNodes.reduce(function (mem, node, i) {\n      if (node.type === 'tag') {\n        var child = reactNodes[parseInt(node.name, 10)] || {};\n        var isElement = __WEBPACK_IMPORTED_MODULE_0_react___default.a.isValidElement(child);\n\n        if (typeof child === 'string') {\n          mem.push(child);\n        } else if (hasChildren(child)) {\n          var inner = mapAST(getChildren(child), node.children);\n          if (child.dummy) child.children = inner; // needed on preact!\n          mem.push(__WEBPACK_IMPORTED_MODULE_0_react___default.a.cloneElement(child, _extends({}, child.props, { key: i }), inner));\n        } else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object' && !isElement) {\n          var interpolated = i18n.services.interpolator.interpolate(node.children[0].content, child, i18n.language);\n          mem.push(interpolated);\n        } else {\n          mem.push(child);\n        }\n      } else if (node.type === 'text') {\n        mem.push(node.content);\n      }\n      return mem;\n    }, []);\n  }\n\n  // call mapAST with having react nodes nested into additional node like\n  // we did for the string ast from translation\n  // return the children of that extra node to get expected result\n  var result = mapAST([{ dummy: true, children: children }], ast);\n  return getChildren(result[0]);\n}\n\nvar Trans = function (_React$Component) {\n  _inherits(Trans, _React$Component);\n\n  function Trans() {\n    _classCallCheck(this, Trans);\n\n    return _possibleConstructorReturn(this, (Trans.__proto__ || Object.getPrototypeOf(Trans)).apply(this, arguments));\n  }\n\n  _createClass(Trans, [{\n    key: 'render',\n    value: function render() {\n      var contextAndProps = _extends({ i18n: this.context.i18n, t: this.context.t }, this.props);\n\n      var children = contextAndProps.children,\n          count = contextAndProps.count,\n          parent = contextAndProps.parent,\n          i18nKey = contextAndProps.i18nKey,\n          tOptions = contextAndProps.tOptions,\n          namespace = contextAndProps.ns,\n          i18n = contextAndProps.i18n,\n          tFromContextAndProps = contextAndProps.t,\n          additionalProps = _objectWithoutProperties(contextAndProps, ['children', 'count', 'parent', 'i18nKey', 'tOptions', 'ns', 'i18n', 't']);\n\n      var t = tFromContextAndProps || i18n.t.bind(i18n);\n\n      var reactI18nextOptions = i18n.options && i18n.options.react || {};\n      var useAsParent = parent !== undefined ? parent : reactI18nextOptions.defaultTransParent;\n\n      var defaultValue = nodesToString('', children, 0);\n      var hashTransKey = reactI18nextOptions.hashTransKey;\n      var key = i18nKey || (hashTransKey ? hashTransKey(defaultValue) : defaultValue);\n      var translation = key ? t(key, _extends({}, tOptions, { interpolation: { prefix: '#$?', suffix: '?$#' }, defaultValue: defaultValue, count: count, ns: namespace })) : defaultValue;\n\n      if (reactI18nextOptions.exposeNamespace) {\n        var ns = typeof t.ns === 'string' ? t.ns : t.ns[0];\n        if (i18nKey && i18n.options && i18n.options.nsSeparator && i18nKey.indexOf(i18n.options.nsSeparator) > -1) {\n          var parts = i18nKey.split(i18n.options.nsSeparator);\n          ns = parts[0];\n        }\n        if (t.ns) additionalProps['data-i18next-options'] = JSON.stringify({ ns: ns });\n      }\n\n      if (!useAsParent) return renderNodes(children, translation, i18n);\n\n      return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(useAsParent, additionalProps, renderNodes(children, translation, i18n));\n    }\n  }]);\n\n  return Trans;\n}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Trans);\n\n\nTrans.propTypes = {\n  count: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n  parent: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node,\n  i18nKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,\n  t: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func\n};\n\n// Trans.defaultProps = {\n//   parent: 'div'\n// };\n\nTrans.contextTypes = {\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired,\n  t: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func\n};\n\n/***/ }),\n/* 964 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = {\n    parse: __webpack_require__(965),\n    stringify: __webpack_require__(968)\n};\n\n\n/***/ }),\n/* 965 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*jshint -W030 */\nvar tagRE = /(?:<!--[\\S\\s]*?-->|<(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\">])+>)/g;\nvar parseTag = __webpack_require__(966);\n// re-used obj for quick lookups of components\nvar empty = Object.create ? Object.create(null) : {};\n// common logic for pushing a child node onto a list\nfunction pushTextNode(list, html, level, start, ignoreWhitespace) {\n    // calculate correct end of the content slice in case there's\n    // no tag after the text node.\n    var end = html.indexOf('<', start);\n    var content = html.slice(start, end === -1 ? undefined : end);\n    // if a node is nothing but whitespace, collapse it as the spec states:\n    // https://www.w3.org/TR/html4/struct/text.html#h-9.1\n    if (/^\\s*$/.test(content)) {\n        content = ' ';\n    }\n    // don't add whitespace-only text nodes if they would be trailing text nodes\n    // or if they would be leading whitespace-only text nodes:\n    //  * end > -1 indicates this is not a trailing text node\n    //  * leading node is when level is -1 and list has length 0\n    if ((!ignoreWhitespace && end > -1 && level + list.length >= 0) || content !== ' ') {\n        list.push({\n            type: 'text',\n            content: content\n        });\n    }\n}\n\nmodule.exports = function parse(html, options) {\n    options || (options = {});\n    options.components || (options.components = empty);\n    var result = [];\n    var current;\n    var level = -1;\n    var arr = [];\n    var byTag = {};\n    var inComponent = false;\n\n    html.replace(tagRE, function (tag, index) {\n        if (inComponent) {\n            if (tag !== ('</' + current.name + '>')) {\n                return;\n            } else {\n                inComponent = false;\n            }\n        }\n\n        var isOpen = tag.charAt(1) !== '/';\n        var isComment = tag.indexOf('<!--') === 0;\n        var start = index + tag.length;\n        var nextChar = html.charAt(start);\n        var parent;\n\n        if (isOpen && !isComment) {\n            level++;\n\n            current = parseTag(tag);\n            if (current.type === 'tag' && options.components[current.name]) {\n                current.type = 'component';\n                inComponent = true;\n            }\n\n            if (!current.voidElement && !inComponent && nextChar && nextChar !== '<') {\n                pushTextNode(current.children, html, level, start, options.ignoreWhitespace);\n            }\n\n            byTag[current.tagName] = current;\n\n            // if we're at root, push new base node\n            if (level === 0) {\n                result.push(current);\n            }\n\n            parent = arr[level - 1];\n\n            if (parent) {\n                parent.children.push(current);\n            }\n\n            arr[level] = current;\n        }\n\n        if (isComment || !isOpen || current.voidElement) {\n            if (!isComment) {\n                level--;\n            }\n            if (!inComponent && nextChar !== '<' && nextChar) {\n                // trailing text node\n                // if we're at the root, push a base text node. otherwise add as\n                // a child to the current node.\n                parent = level === -1 ? result : arr[level].children;\n                pushTextNode(parent, html, level, start, options.ignoreWhitespace);\n            }\n        }\n    });\n\n    // If the \"html\" passed isn't actually html, add it as a text node.\n    if (!result.length && html.length) {\n        pushTextNode(result, html, 0, 0, options.ignoreWhitespace);\n    }\n\n    return result;\n};\n\n\n/***/ }),\n/* 966 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar attrRE = /([\\w-]+)|=|(['\"])([.\\s\\S]*?)\\2/g;\nvar voidElements = __webpack_require__(967);\n\nmodule.exports = function (tag) {\n    var i = 0;\n    var key;\n    var expectingValueAfterEquals = true;\n    var res = {\n        type: 'tag',\n        name: '',\n        voidElement: false,\n        attrs: {},\n        children: []\n    };\n\n    tag.replace(attrRE, function (match) {\n        if (match === '=') {\n            expectingValueAfterEquals = true;\n            i++;\n            return;\n        }\n\n        if (!expectingValueAfterEquals) {\n            if (key) {\n                res.attrs[key] = key; // boolean attribute\n            }\n            key=match;\n        } else {\n            if (i === 0) {\n                if (voidElements[match] || tag.charAt(tag.length - 2) === '/') {\n                    res.voidElement = true;\n                }\n                res.name = match;\n            } else {\n                res.attrs[key] = match.replace(/^['\"]|['\"]$/g, '');\n                key=undefined;\n            }\n        }\n        i++;\n        expectingValueAfterEquals = false;\n    });\n\n    return res;\n};\n\n\n/***/ }),\n/* 967 */\n/***/ (function(module, exports) {\n\n/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n  \"area\": true,\n  \"base\": true,\n  \"br\": true,\n  \"col\": true,\n  \"embed\": true,\n  \"hr\": true,\n  \"img\": true,\n  \"input\": true,\n  \"keygen\": true,\n  \"link\": true,\n  \"menuitem\": true,\n  \"meta\": true,\n  \"param\": true,\n  \"source\": true,\n  \"track\": true,\n  \"wbr\": true\n};\n\n\n/***/ }),\n/* 968 */\n/***/ (function(module, exports) {\n\nfunction attrString(attrs) {\n    var buff = [];\n    for (var key in attrs) {\n        buff.push(key + '=\"' + attrs[key] + '\"');\n    }\n    if (!buff.length) {\n        return '';\n    }\n    return ' ' + buff.join(' ');\n}\n\nfunction stringify(buff, doc) {\n    switch (doc.type) {\n    case 'text':\n        return buff + doc.content;\n    case 'tag':\n        buff += '<' + doc.name + (doc.attrs ? attrString(doc.attrs) : '') + (doc.voidElement ? '/>' : '>');\n        if (doc.voidElement) {\n            return buff;\n        }\n        return buff + doc.children.reduce(stringify, '') + '</' + doc.name + '>';\n    }\n}\n\nmodule.exports = function (doc) {\n    return doc.reduce(function (token, rootEl) {\n        return token + stringify('', rootEl);\n    }, '');\n};\n\n\n/***/ }),\n/* 969 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar I18nextProvider = function (_Component) {\n  _inherits(I18nextProvider, _Component);\n\n  function I18nextProvider(props, context) {\n    _classCallCheck(this, I18nextProvider);\n\n    var _this = _possibleConstructorReturn(this, (I18nextProvider.__proto__ || Object.getPrototypeOf(I18nextProvider)).call(this, props, context));\n\n    _this.i18n = props.i18n;\n    if (props.initialI18nStore) {\n      _this.i18n.services.resourceStore.data = props.initialI18nStore;\n      _this.i18n.options.isInitialSSR = true; // if set will be deleted on first render in translate hoc\n    }\n    if (props.initialLanguage) {\n      _this.i18n.changeLanguage(props.initialLanguage);\n    }\n    return _this;\n  }\n\n  _createClass(I18nextProvider, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return { i18n: this.i18n };\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.props.i18n !== nextProps.i18n) {\n        throw new Error('[react-i18next][I18nextProvider]does not support changing the i18n object.');\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var children = this.props.children;\n\n      return __WEBPACK_IMPORTED_MODULE_0_react__[\"Children\"].only(children);\n    }\n  }]);\n\n  return I18nextProvider;\n}(__WEBPACK_IMPORTED_MODULE_0_react__[\"Component\"]);\n\nI18nextProvider.propTypes = {\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired,\n  children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element.isRequired\n};\n\nI18nextProvider.childContextTypes = {\n  i18n: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (I18nextProvider);\n\n/***/ }),\n/* 970 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = loadNamespaces;\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// shim object entries\nif (!Object.entries) Object.entries = function (obj) {\n  var ownProps = Object.keys(obj),\n      i = ownProps.length,\n      resArray = new Array(i); // preallocate the Array\n  while (i--) {\n    resArray[i] = [ownProps[i], obj[ownProps[i]]];\n  }return resArray;\n};\n\n// Borrowed from https://github.com/Rezonans/redux-async-connect/blob/master/modules/ReduxAsyncConnect.js#L16\nfunction eachComponents(components, iterator) {\n  for (var i = 0, l = components.length; i < l; i++) {\n    // eslint-disable-line id-length\n    if (_typeof(components[i]) === 'object') {\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = Object.entries(components[i])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var _step$value = _slicedToArray(_step.value, 2),\n              key = _step$value[0],\n              value = _step$value[1];\n\n          iterator(value, i, key);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    } else {\n      iterator(components[i], i);\n    }\n  }\n}\n\nfunction filterAndFlattenComponents(components) {\n  var flattened = [];\n  eachComponents(components, function (Component) {\n    if (Component && Component.namespaces) {\n\n      Component.namespaces.forEach(function (namespace) {\n        if (flattened.indexOf(namespace) === -1) {\n          flattened.push(namespace);\n        }\n      });\n    }\n  });\n  return flattened;\n}\n\nfunction loadNamespaces(_ref) {\n  var components = _ref.components,\n      i18n = _ref.i18n;\n\n  var allNamespaces = filterAndFlattenComponents(components);\n\n  return new Promise(function (resolve) {\n    i18n.loadNamespaces(allNamespaces, resolve);\n  });\n}\n\n/***/ }),\n/* 971 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _filter_pill = __webpack_require__(972);\n\nvar _filter_pill2 = _interopRequireDefault(_filter_pill);\n\nvar _filters_utils = __webpack_require__(973);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//sub-panel for filter bubbles\nvar SubReportHeader = function SubReportHeader(props) {\n    var locale = props.report && props.report.attributes && props.report.attributes.locale;\n    var filters = [];\n    if (props.queryModel._q.filter) {\n        filters = (0, _filters_utils.getFormattedFilters)(props.queryModel._q.filter, props.columns, locale);\n    }\n    var handleReset = function handleReset() {\n        props.onAction('reset-filters');\n    };\n    var handleClickBack = function handleClickBack() {\n        _grid_report_actions2.default.goBack();\n    };\n    var breakdownLabel = void 0;\n    if (props.schema) {\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n            for (var _iterator = props.schema.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n                var value = _step.value;\n\n                if (value.name === props.breakdown) {\n                    breakdownLabel = value.label;\n                }\n                ;\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally {\n            try {\n                if (!_iteratorNormalCompletion && _iterator.return) {\n                    _iterator.return();\n                }\n            } finally {\n                if (_didIteratorError) {\n                    throw _iteratorError;\n                }\n            }\n        }\n    } else {\n        breakdownLabel = \"\";\n    }\n    return _react2.default.createElement(\"div\", { id: \"report-drilldown-title\", className: \"report__header__subpanel\" }, _react2.default.createElement(\"div\", { className: \"report-drilldown-controls\" }, _react2.default.createElement(\"div\", { className: \"page-navigation tile\" }, _react2.default.createElement(\"button\", { className: 'ui-button icon-left-1 small ' + (0, _classnames2.default)({ disabled: !props.canGoBack }), onClick: handleClickBack, disabled: !props.canGoBack }, \"Back\"), _react2.default.createElement(\"button\", { className: 'ui-button icon-rotateleft-1 small ' + (0, _classnames2.default)({ disabled: !props.canReset }), onClick: handleReset, disabled: !props.canReset }, \"Reset\"))), _react2.default.createElement(\"h2\", { className: \"grid_subtitle\" }, _react2.default.createElement(\"small\", null, \"Broken down by\"), breakdownLabel), filters.map(function (filterObj) {\n        var filterObjKey = filterObj.field + '_' + filterObj.operatorLabel;\n        return _react2.default.createElement(_filter_pill2.default, { filter: filterObj, filterMenu: props.filterMenu, key: filterObjKey, filterPanel: props.filterMenu && props.filterMenu.view('subpanel__filters'), clearSearch: props.onClear });\n    }));\n};\nexports.default = SubReportHeader;\n\n/***/ }),\n/* 972 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FilterPill = (0, _createReactClass2.default)({\n    displayName: 'FilterPill',\n    render: function render() {\n        var _props = this.props,\n            filter = _props.filter,\n            filterMenu = _props.filterMenu,\n            filterPanel = _props.filterPanel;\n\n        var dataHint = void 0;\n        var pillTextBody = void 0;\n        // On hover of filter bubble show a tooltip with the name of the column,\n        // the type of filter applied, and the full text of the filter.\n        if (filter.operatorLabel == 'blank' || filter.operatorLabel == 'not blank') {\n            pillTextBody = filter.operatorLabel.toUpperCase();\n            dataHint = filter.friendlyName + ' ' + filter.operatorDescription;\n        } else if (filter.valueLabel != '') {\n            pillTextBody = filter.valueLabel;\n            if (filter.operator == 'all') {\n                dataHint = filter.friendlyName + ' ' + filter.valueLabel + ' ' + filter.operatorDescription;\n            } else {\n                dataHint = filter.friendlyName + ' ' + filter.operatorDescription + ' ' + filter.valueLabel;\n            }\n        }\n        var pillFilterType = filter.operatorDisplay;\n        return _react2.default.createElement(\"div\", { className: \"tile\" }, _react2.default.createElement(\"span\", { className: \"page-title__filter-tag grid-report-filter\", \"data-hint\": dataHint, \"data-hint-position\": 'bottom' }, _react2.default.createElement(\"div\", { className: \"pill-closable small\" }, _react2.default.createElement(\"button\", { onClick: this.handleClick.bind(this, filterMenu), className: \"ui-button pill_value pill-text-ellipse\" }, _react2.default.createElement(\"span\", { className: \"filter-type\" }, \" \", pillFilterType, \" \"), _react2.default.createElement(\"span\", { className: \"filter-text\" }, pillTextBody)), _react2.default.createElement(\"button\", { \"aria-label\": \"Remove filter\", className: \"ui-button pill_close icon-remove-4\", onClick: this.handleFilterRemove.bind(this, filterPanel, filter.field, filter.value, filter.operator) }))));\n    },\n    handleClick: function handleClick(filterMenu) {\n        filterMenu.toggle('filters', true);\n    },\n    handleFilterRemove: function handleFilterRemove(filterPanel, field, value, operator) {\n        if (operator == 'all') {\n            this.props.clearSearch();\n        } else {\n            var index = _lodash2.default.findIndex(filterPanel.filters, { 'field': field, 'value': value });\n            filterPanel.removeFilter(index, true);\n        }\n    }\n});\nexports.default = FilterPill;\n\n/***/ }),\n/* 973 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getFormattedFilters = exports.getColumnById = undefined;\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * Returns the column object based on the fieldId passed\r\n *\r\n * @param {string} id - The id of the filter field\r\n * @param {Immutable.List} gridColumns - A collection of columns from the grid\r\n * @returns {<Object>}\r\n */\nvar getColumnById = exports.getColumnById = function getColumnById(id, columns) {\n    return columns.filter(function (column) {\n        return column.get('id') == id;\n    }).toJS()[0];\n};\n/**\r\n* Returns the formatted array of filters\r\n*\r\n* @param {Immutable.List} queryModelFilter - A collection of the filters from the grid query model\r\n* @param {Immutable.List} gridColumns - A collection of columns from the grid\r\n* @returns {array<Object>}\r\n*/\nvar getFormattedFilters = exports.getFormattedFilters = function getFormattedFilters(queryModelFilter, columns, locale) {\n    var labels = {\n        eq: ['equal to', '=', 'is equal to'],\n        ne: ['not', '≠', 'is not equal to'],\n        gt: ['greater than', '>', 'is greater than'],\n        ge: ['at least', '≥', 'is greater than or equal to'],\n        lt: ['less than', '<', 'is less than'],\n        le: ['at most', '≤', 'is less than or equal to'],\n        null: ['blank', '', 'is blank'],\n        notnull: ['not blank', '', 'is not blank'],\n        contains: ['contains', '{ }', 'contains'],\n        all: ['contains', '{ }', 'across all columns'],\n        fy: ['fiscal year', 'FY', ''],\n        xyz: ['within last # of days', '', '']\n    };\n    var filterArray = [];\n    _lodash2.default.each(queryModelFilter, function (filter, field) {\n        _lodash2.default.each(filter, function (value, operator) {\n            var column = void 0;\n            if (field === 'all') {\n                column = { label: 'Contains' };\n                operator = field;\n            } else {\n                column = getColumnById(field, columns);\n            }\n            if (!column) {\n                return;\n            }\n            // fix for OLY-395 :Filter bubble is getting created without filter\n            // if filter is not of type blank and not blank and still the value is empty, do not render the filter\n            if (operator != 'null' && operator != 'notnull' && !value) {\n                return;\n            }\n            var f = {\n                field: field,\n                friendlyName: column.label,\n                operator: operator,\n                value: value,\n                valueLabel: _utils2.default.getInputFormatter(column, locale)(value),\n                operatorLabel: labels[operator][0],\n                operatorDisplay: labels[operator][1],\n                operatorDescription: labels[operator][2]\n            };\n            filterArray.push(f);\n        });\n    });\n    return filterArray;\n};\n\n/***/ }),\n/* 974 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar _transactions_utils = __webpack_require__(54);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AmountsTypeMenu = function AmountsTypeMenu(_ref) {\n    var value = _ref.value,\n        onChange = _ref.onChange;\n    return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Amounts\"), _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(_ovid.DropdownList, { value: value, onChange: onChange }, _lodash2.default.map(_transactions_utils.AmountsTypes, function (value, key) {\n        return _react2.default.createElement(_ovid.DropdownListItem, { key: key, title: key, value: value });\n    }))));\n};\nexports.default = AmountsTypeMenu;\n\n/***/ }),\n/* 975 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = AmountMenu;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _amount_columns_settings_toggle = __webpack_require__(976);\n\nvar _amount_columns_settings_toggle2 = _interopRequireDefault(_amount_columns_settings_toggle);\n\nvar _amount_columns_settings_panel = __webpack_require__(977);\n\nvar _amount_columns_settings_panel2 = _interopRequireDefault(_amount_columns_settings_panel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction AmountMenu(props) {\n    var amountColumn = props.amountColumn,\n        visualization = props.visualization,\n        showAmountColumnPanel = props.showAmountColumnPanel,\n        isControlPanel = props.isControlPanel;\n\n    var amountColumnOptions = (0, _transactions_utils.filterAmountColumns)(visualization);\n    var amountColumns = !showAmountColumnPanel ? amountColumnOptions : visualization.get('amountColumns');\n    return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section amount_menu\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Show\", isControlPanel && _react2.default.createElement(_amount_columns_settings_toggle2.default, null)), showAmountColumnPanel && _react2.default.createElement(_amount_columns_settings_panel2.default, { columns: visualization.get('amountColumns'), panelType: \"Amount\", visualization: visualization, currentAmountColumn: amountColumn }), _react2.default.createElement(_ovid.DropdownList, { value: amountColumn, onChange: _grid_report_actions2.default.setAmountColumn }, amountColumns.map(function (column, i) {\n        return _react2.default.createElement(_ovid.DropdownListItem, { key: i, value: column.get('id'), title: column.get('label') });\n    }).toArray()));\n}\n\n/***/ }),\n/* 976 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = AmountColumnsPanelToggle;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction AmountColumnsPanelToggle() {\n    return _react2.default.createElement(\"div\", { className: \"visibility-settings-icon icon-settings-1 amount_column_toggle\", onClick: _grid_report_actions2.default.toggleColumnsSettingsPanel });\n}\n\n/***/ }),\n/* 977 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _error = __webpack_require__(526);\n\nvar _error2 = _interopRequireDefault(_error);\n\nvar _panel_data = __webpack_require__(527);\n\nvar _panel_data2 = _interopRequireDefault(_panel_data);\n\nvar _panel_header = __webpack_require__(528);\n\nvar _panel_header2 = _interopRequireDefault(_panel_header);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _visibility_utils = __webpack_require__(529);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar AmountColumnsPanelContainer = function (_React$Component) {\n    _inherits(AmountColumnsPanelContainer, _React$Component);\n\n    function AmountColumnsPanelContainer() {\n        _classCallCheck(this, AmountColumnsPanelContainer);\n\n        var _this = _possibleConstructorReturn(this, (AmountColumnsPanelContainer.__proto__ || Object.getPrototypeOf(AmountColumnsPanelContainer)).apply(this, arguments));\n\n        _this._subscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).on('click', _this.handleDocumentClickAmountColumns);\n        };\n        _this._unsubscribeDOMEvents = function () {\n            _this.resetColumns();\n            (0, _jquery2.default)(document).off('click', _this.handleDocumentClickAmountColumns);\n        };\n        _this.handleDocumentClickAmountColumns = function (e) {\n            var inContainer = _jquery2.default.contains((0, _reactDom.findDOMNode)(_this.columnsSettingsPanel), e.target);\n            var inAmountColumnSettingToggle = e.target.className.indexOf('amount_column_toggle');\n            //check if the click is not in the panel container and the gear toggle icon\n            if (!inContainer && inAmountColumnSettingToggle == -1) {\n                _this.handleColumnsSettingsCancel();\n            }\n        };\n        //Returns false if all columns are hidden\n        _this.isVisibilityValid = function () {\n            var visibleColumns = (0, _transactions_utils.getVisibleAmountColumns)(_this.props.columns);\n            return visibleColumns.length > 0 ? true : false;\n        };\n        _this.handleColumnsSettingsSave = function () {\n            _this.setCurrentAmountColumn();\n            _this.settingsColumns = [];\n            _grid_report_actions2.default.toggleColumnsSettingsPanel();\n        };\n        _this.resetColumns = function () {\n            if (_this.settingsColumns.length > 0) {\n                _grid_report_actions2.default.resetColumns(_this.settingsColumns, 'amount');\n            }\n        };\n        _this.handleColumnsSettingsCancel = function () {\n            _this.resetColumns();\n            _this.settingsColumns = [];\n            _grid_report_actions2.default.toggleColumnsSettingsPanel();\n        };\n        //Returns true if all the columns are checked\n        //the columns that will undergo a change in its visibility\n        _this.isAllColumnsVisible = function () {\n            var visibleColumns = (0, _transactions_utils.getVisibleAmountColumns)(_this.props.columns);\n            var isAllColumnChecked = visibleColumns.length === _this.props.columns.size;\n            var hiddenColumns = isAllColumnChecked ? _this.props.columns : _this.props.columns.filter(function (amountColumn) {\n                return !_lodash2.default.includes(visibleColumns, amountColumn.get('id'));\n            });\n            return { isAllColumnChecked: isAllColumnChecked, hiddenColumns: hiddenColumns };\n        };\n        _this.toggleAllColumnVisibility = function () {\n            var _this$isAllColumnsVis = _this.isAllColumnsVisible(),\n                isAllColumnChecked = _this$isAllColumnsVis.isAllColumnChecked,\n                hiddenColumns = _this$isAllColumnsVis.hiddenColumns;\n            //Update the settingsColumns used for reseting\n\n\n            var hiddenColumnsIds = _lodash2.default.map(hiddenColumns.toJS(), 'id');\n            _lodash2.default.each(hiddenColumnsIds, function (hiddenColumn) {\n                var index = _this.settingsColumns.indexOf(hiddenColumn);\n                _lodash2.default.includes(_this.settingsColumns, hiddenColumn) ? _this.settingsColumns.splice(index, 1) : _this.settingsColumns.push(hiddenColumn);\n            });\n            //if any one unchecked -> isVisibilityValid = true then check all.\n            var visibility = _this.isVisibilityValid() ? !isAllColumnChecked : false;\n            _grid_report_actions2.default.hideColumn(hiddenColumns, visibility, 'amount', true);\n        };\n        _this.toggleColumnVisibility = function (column, visibility) {\n            _lodash2.default.defer(function () {\n                _grid_report_actions2.default.hideColumn(column, visibility, 'amount', false);\n                var index = _this.settingsColumns.indexOf(column.get('id'));\n                _lodash2.default.includes(_this.settingsColumns, column.get('id')) ? _this.settingsColumns.splice(index, 1) : _this.settingsColumns.push(column.get('id'));\n            });\n        };\n        //set breakdown in the visualization\n        _this.setCurrentAmountColumn = function () {\n            var _this$props = _this.props,\n                currentAmountColumn = _this$props.currentAmountColumn,\n                visualization = _this$props.visualization;\n\n            var amountColumnOptions = (0, _transactions_utils.filterAmountColumns)(visualization);\n            var availableColumns = _lodash2.default.map(amountColumnOptions.toJS(), 'id');\n            if (availableColumns && availableColumns.length > 0 && !_lodash2.default.includes(availableColumns, currentAmountColumn)) {\n                // If the currently selected column is not present in the availableColumns\n                // we set the amount column as the first element\n                _grid_report_actions2.default.setAmountColumn(_lodash2.default.head(availableColumns));\n            }\n        };\n        return _this;\n    }\n\n    _createClass(AmountColumnsPanelContainer, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this._subscribeDOMEvents();\n            //settingsColumns holds the list of ids of changed columns.\n            //This is tracked to handle reset of columns in cancel\n            this.settingsColumns = [];\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._unsubscribeDOMEvents();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _props = this.props,\n                columns = _props.columns,\n                panelType = _props.panelType;\n\n            var isEditingDefaultState = _report_view_store2.default.isEditingDefaultState();\n            var footerClass = (0, _visibility_utils.getFooterClass)(isEditingDefaultState);\n            var visibilityPanelClass = (0, _visibility_utils.getVisibilityPanelClass)(isEditingDefaultState);\n            return _react2.default.createElement(\"div\", { ref: function ref(columnsSettingsPanel) {\n                    _this2.columnsSettingsPanel = columnsSettingsPanel;\n                }, className: \"subpanels js-subpanels is-expanded\" }, _react2.default.createElement(\"div\", { className: \"subpanel ui-panel js-subpanel ready open\" }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, panelType, \" Columns\"), _react2.default.createElement(\"span\", { className: \"ui-panel__close\", onClick: this.handleColumnsSettingsCancel })), _react2.default.createElement(\"footer\", { className: footerClass }, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost no-color visibility-panel-cancel\", onClick: this.handleColumnsSettingsCancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: 'ui-button primary ' + (!this.isVisibilityValid() ? 'disabled' : ''), onClick: this.handleColumnsSettingsSave }, \"Save\"))), _react2.default.createElement(\"div\", { className: visibilityPanelClass }, _react2.default.createElement(\"div\", { className: \"visibility-panel-sub-header subpanel__options\" }, !this.isVisibilityValid() ? _react2.default.createElement(_error2.default, { message: 'You must select at least one amount column' }) : null, _react2.default.createElement(_panel_header2.default, { panelType: panelType, toggleAllColumnVisibility: this.toggleAllColumnVisibility })), _react2.default.createElement(\"ul\", { className: \"visibility-panel-container drop-item1__wrapper sortable-items\" }, columns.map(function (column) {\n                return _react2.default.createElement(_panel_data2.default, { key: column, column: column, toggleColumnVisibility: _this2.toggleColumnVisibility });\n            })))));\n        }\n    }]);\n\n    return AmountColumnsPanelContainer;\n}(_react2.default.Component);\n\nexports.default = AmountColumnsPanelContainer;\n\n/***/ }),\n/* 978 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _mapboxGlSupported = __webpack_require__(267);\n\nvar _mapboxGlSupported2 = _interopRequireDefault(_mapboxGlSupported);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _aggregate_visualization_charts = __webpack_require__(979);\n\nvar _aggregate_visualization_charts2 = _interopRequireDefault(_aggregate_visualization_charts);\n\nvar _map_amount_menu = __webpack_require__(991);\n\nvar _map_amount_menu2 = _interopRequireDefault(_map_amount_menu);\n\nvar _map_type_menu = __webpack_require__(992);\n\nvar _map_type_menu2 = _interopRequireDefault(_map_type_menu);\n\nvar _grid_graph_type = __webpack_require__(993);\n\nvar _grid_graph_type2 = _interopRequireDefault(_grid_graph_type);\n\nvar _map_constants = __webpack_require__(45);\n\nvar _map_unsupported_message = __webpack_require__(994);\n\nvar _map_unsupported_message2 = _interopRequireDefault(_map_unsupported_message);\n\nvar _mini_loader = __webpack_require__(536);\n\nvar _mini_loader2 = _interopRequireDefault(_mini_loader);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar aggregateVizHeight = 350;\nvar mapHeight = 450;\n\nvar AggregateVisualization = function (_React$PureComponent) {\n    _inherits(AggregateVisualization, _React$PureComponent);\n\n    function AggregateVisualization() {\n        _classCallCheck(this, AggregateVisualization);\n\n        return _possibleConstructorReturn(this, (AggregateVisualization.__proto__ || Object.getPrototypeOf(AggregateVisualization)).apply(this, arguments));\n    }\n\n    _createClass(AggregateVisualization, [{\n        key: 'renderMap',\n        value: function renderMap(currentBreakdown, showLegend, filter, visualization) {\n            var _props = this.props,\n                isMapboxGlSupported = _props.isMapboxGlSupported,\n                map = _props.map,\n                locale = _props.locale;\n\n            if (!isMapboxGlSupported) {\n                return _react2.default.createElement(_map_unsupported_message2.default, { height: aggregateVizHeight });\n            }\n            if (!map.getIn(['dataStats', 'isInvalid']) && map.get('extractors')) {\n                var mapLegendPage = visualization.get('mapLegendPage');\n                var breakdown = visualization.get('breakdown');\n                var colorMap = map.get('legendColorMap') && map.get('legendColorMap')[breakdown];\n                var currentMapType = visualization.get('currentMapType');\n                var GLGridMap = __webpack_require__(995).default;\n                return _react2.default.createElement(GLGridMap, { height: mapHeight, data: map.get('data'), layer: map.get('layer'), stats: map.get('dataStats'), mapType: currentMapType, breakdown: currentBreakdown, legendPage: mapLegendPage, showLegend: showLegend, colorMap: colorMap, filter: filter, locale: locale, visualization: visualization, mapExtractors: map.get('extractors') });\n            }\n        }\n    }, {\n        key: 'renderTooltipEditStatus',\n        value: function renderTooltipEditStatus() {\n            return _react2.default.createElement(\"div\", { className: \"grid_report__tooltip_edit_notice\" }, _react2.default.createElement(\"h6\", null, \"TOOLTIP EDIT MODE\"), _react2.default.createElement(\"span\", null, \"You're editing your tooltip styling. Pick the information you'd like to appear in your tooltip and then click save.\"));\n        }\n    }, {\n        key: 'onMapTypeChange',\n        value: function onMapTypeChange(mapType) {\n            _grid_report_actions2.default.setMapType(mapType);\n            _grid_report_actions2.default.resetAndLoadMap();\n        }\n    }, {\n        key: 'renderStandardHeader',\n        value: function renderStandardHeader() {\n            var visualization = this.props.visualization;\n\n            var isLoading = visualization.get('isLoading') || visualization.get('mapLoading') || visualization.get('mapDataLoading');\n            var isError = visualization.get('isError');\n            var graphType = visualization.get('graphType');\n            var availableGraphTypes = visualization.get('availableGraphTypes');\n            var isMap = graphType === 'map';\n            var showLegend = visualization.get('showLegend');\n            var currentMapType = visualization.get('currentMapType');\n            var isTypeWithLegend = isMap && currentMapType !== _map_constants.MapTypes.Heatmap.name && !(graphType === 'treemap' || graphType === 'horizontal_stacked' || graphType === 'pie');\n            var isHeatmap = currentMapType === _map_constants.MapTypes.Heatmap.name;\n            var isDensityMap = isHeatmap && visualization.get('heatmapType') === _map_constants.MapTypes.Heatmap.types.density;\n            var isAmountMap = isHeatmap && visualization.get('heatmapType') === _map_constants.MapTypes.Heatmap.types.amount;\n            var isTypeWithAmount = isMap && (isAmountMap || currentMapType == _map_constants.MapTypes.Bubble.name);\n            var mapAmountColumn = visualization.get('mapAmountColumn');\n            var mapAmountColumnOptions = visualization.get('mapAmountColumnOptions');\n            var shouldShowMapAmountMenu = isTypeWithAmount && mapAmountColumnOptions && mapAmountColumn;\n            var availableMapTypes = visualization.get('availableMapTypes');\n            return _react2.default.createElement(\"header\", { className: \"aggregate-viz__header ui-flex\" }, isMap && _react2.default.createElement(_map_type_menu2.default, { currentMapType: currentMapType, mapTypes: availableMapTypes, onSelect: this.onMapTypeChange }), isHeatmap && _react2.default.createElement(\"div\", { className: \"aggregate-viz__heatmap_picker ui-button-group\" }, _react2.default.createElement(\"a\", { className: (0, _classnames2.default)('ui-button small', { 'is-selected': isDensityMap }), onClick: function onClick() {\n                    return _grid_report_actions2.default.setHeatmapType(_map_constants.MapTypes.Heatmap.types.density);\n                } }, \"Density\"), _react2.default.createElement(\"a\", { className: (0, _classnames2.default)('ui-button small', { 'is-selected': isAmountMap }), onClick: function onClick() {\n                    return _grid_report_actions2.default.setHeatmapType(_map_constants.MapTypes.Heatmap.types.amount);\n                } }, \"Amount\")), shouldShowMapAmountMenu && _react2.default.createElement(_map_amount_menu2.default, { amountChoices: mapAmountColumnOptions, currentAmount: mapAmountColumn, onSelect: _grid_report_actions2.default.setMapAmountColumn }), _react2.default.createElement(\"div\", { className: \"ui-flex-1 ui-flex ui-justify-content-end\" }, _react2.default.createElement(_mini_loader2.default, { isError: isError, isLoading: isLoading }), isTypeWithLegend && _react2.default.createElement(\"button\", { className: \"ui-button ghost aggregate-viz__legend-toggle\", onClick: _grid_report_actions2.default.toggleLegend }, _react2.default.createElement(\"span\", { className: \"icon-view-list-1\" }), \" \", showLegend ? 'Hide Legend' : 'Show Legend'), _react2.default.createElement(\"span\", { className: \"aggregate-viz__graphtype\" }, _react2.default.createElement(_grid_graph_type2.default, { graphTypes: availableGraphTypes.toJS(), graphType: graphType, isMapEnabled: this.props.isMapEnabled }))));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props2 = this.props,\n                visualization = _props2.visualization,\n                savedStateId = _props2.savedStateId,\n                schema = _props2.schema,\n                filter = _props2.filter;\n\n            var graphType = visualization.get('graphType');\n            var showLegend = visualization.get('showLegend');\n            var currentBreakdown = visualization.get('breakdown');\n            var editingTooltip = visualization.getIn(['mapTooltip', 'editing']);\n            var availableGraphTypes = visualization.get('availableGraphTypes').toJS();\n            if (_lodash2.default.indexOf(availableGraphTypes, graphType) === -1) {\n                return null;\n            }\n            return _react2.default.createElement(\"section\", { className: \"aggregate-viz\" }, graphType === 'map' && editingTooltip ? this.renderTooltipEditStatus() : this.renderStandardHeader(), graphType === 'map' ? this.renderMap(currentBreakdown, showLegend, filter, visualization) : _react2.default.createElement(_aggregate_visualization_charts2.default, { visualization: visualization, savedStateId: savedStateId, aggregateVizHeight: aggregateVizHeight, schema: schema, bannerHeight: 0 }));\n        }\n    }]);\n\n    return AggregateVisualization;\n}(_react2.default.PureComponent);\n\nexports.default = AggregateVisualization;\n\nAggregateVisualization.propTypes = {\n    isMapboxGlSupported: _propTypes2.default.bool\n};\nAggregateVisualization.defaultProps = {\n    isMapboxGlSupported: (0, _mapboxGlSupported2.default)()\n};\n\n/***/ }),\n/* 979 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _highchartsOg = __webpack_require__(530);\n\nvar _highchartsOg2 = _interopRequireDefault(_highchartsOg);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _summary_tooltip = __webpack_require__(532);\n\nvar _summary_tooltip2 = _interopRequireDefault(_summary_tooltip);\n\nvar _og_colors = __webpack_require__(186);\n\nvar _og_colors2 = _interopRequireDefault(_og_colors);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _summary_pie_slider = __webpack_require__(533);\n\nvar _summary_pie_slider2 = _interopRequireDefault(_summary_pie_slider);\n\nvar _target_utils = __webpack_require__(99);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _grid_legend = __webpack_require__(986);\n\nvar _grid_legend2 = _interopRequireDefault(_grid_legend);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _chart_utils = __webpack_require__(535);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar firstPass = 0;\nvar type = '';\nvar prevType = '';\nvar previousLength = 0;\nvar noSeriesName = '- Blank -';\n\nvar AggregateVisualizationCharts = function (_React$PureComponent) {\n    _inherits(AggregateVisualizationCharts, _React$PureComponent);\n\n    function AggregateVisualizationCharts() {\n        _classCallCheck(this, AggregateVisualizationCharts);\n\n        return _possibleConstructorReturn(this, (AggregateVisualizationCharts.__proto__ || Object.getPrototypeOf(AggregateVisualizationCharts)).apply(this, arguments));\n    }\n\n    _createClass(AggregateVisualizationCharts, [{\n        key: 'render',\n        value: function render() {\n            var visualization = this.props.visualization;\n            var graphType = visualization.get('graphType');\n            var tooltip = visualization.get('tooltip');\n            var legendSortBy = visualization.get('legendSortBy');\n            var embedStyle = (0, _embed_utils.isEmbed)() ? { width: '100%' } : {};\n            var graphWrapperClass = graphType == 'bar' || graphType == 'line' ? 'report__graph-wrapper' : '';\n            return _react2.default.createElement(\"div\", { style: embedStyle }, _react2.default.createElement(\"div\", { className: graphWrapperClass }, _react2.default.createElement(\"div\", { ref: \"highcharts\", key: \"highcharts\", className: \"aggregate-viz__graph\" }, tooltip.get('isVisible') ? _react2.default.createElement(_summary_tooltip2.default, { left: tooltip.get('left'), top: tooltip.get('top'), color: 'ffffff', key: 1 }, _react2.default.createElement(\"div\", { className: \"graph-tooltip__name\" }, _react2.default.createElement(\"strong\", null, tooltip.get('name'))), _react2.default.createElement(\"div\", null, tooltip.get('value')), _react2.default.createElement(\"div\", null, '(' + tooltip.get('percentage') + '%)')) : null), graphType !== 'bar' && graphType !== 'line' ? //try mounting the component then hide, rather than mount later????\n            _react2.default.createElement(_summary_pie_slider2.default, { ref: \"slider\", items: visualization.get('xAxis').map(function (axis) {\n                    return { key: axis.index && axis.index.toString(), value: axis && axis.value };\n                }).toArray(), initialSelection: visualization.get('index') && visualization.get('index').toString(), graphType: graphType,\n                //When this is created...the onChange is called....on the componentDidMount\n                onChange: _grid_report_actions2.default.setVisualizationYear }) : null, graphType == 'bar' || graphType == 'line' ? _react2.default.createElement(_grid_legend2.default, { lines: this.legendLines, legendSortBy: legendSortBy, onSortChange: this.handleLegendSortChange }) : null));\n        }\n        //check to see if the text will fit on the graph, is there a way to grab item rect dimensions? or is generate after dataLabels are defined\n\n    }, {\n        key: 'willFit',\n        value: function willFit(graphType, highchartsThis) {\n            var that = highchartsThis;\n            var styleBold = function styleBold(text) {\n                return '<span class=\"pie-data-labels-name\">' + text + '</span><br/>';\n            };\n            var style = function style(text) {\n                return '<span style=\"font-size:15px\">' + text + '</span>';\n            };\n            var w = (0, _jquery2.default)('.highcharts-background')[0].attributes.width.value;\n            var name = _strings2.default.truncateLabel(that.point.name);\n            var percentage = that.percentage;\n            var percentageStr = percentage ? percentage.toFixed(2) + '%' : '';\n            var value = that.point.isNeg && (graphType === 'treemap' || graphType === 'pie') ? -that.y : that.y;\n            var amountColumn = (0, _transactions_utils.getAmountColumn)(this.props.visualization, this.props.schema);\n            var valueStr = (0, _transactions_utils.formatUnits)(this.props.schema, amountColumn, value);\n            var defaultStyle = styleBold(name) + '<span class=\"pie-data-labels-amount\">' + valueStr + '<span class=\"pie-data-labels-percent\">' + percentageStr + '</span>';\n            var str = '';\n            var fullText = false; //all info is on dataLabel\n            switch (graphType) {\n                case 'treemap':\n                    if (percentageStr.length < percentage * w / 100) {\n                        str = defaultStyle;\n                        fullText = true;\n                    } else if (valueStr.length < percentage * w / 140) {\n                        str = '<br/>' + style(valueStr);\n                    }\n                    break;\n                case 'pie':\n                    str = defaultStyle;\n                    fullText = false;\n                    break;\n                case 'horizontal_stacked':\n                    percentage = this.calculatePercentage(that.y, that.point.yearTotal);\n                    if (percentage / 100 * w / 10 > name.length * 1.1 && percentage / 100 * w / 10 > valueStr.length * 0.8) {\n                        str = defaultStyle;\n                        fullText = true;\n                    } else if (percentage / 100 * w / 10 > valueStr.length * 1.2) {\n                        str = styleBold('_') + style(valueStr);\n                    }\n                case 'bar':\n                    var columnTotal = _lodash2.default.reduce(that.series.data, function (sum, item) {\n                        return sum + Math.abs(item.value);\n                    }, 0);\n                    percentage = this.calculatePercentage(this.y, columnTotal);\n                    break;\n            }\n            fullText = name === that.point.name ? fullText : false; //Checking to see if label has been truncated by strings.truncateLabel\n            return { str: str, fullText: fullText };\n        }\n    }, {\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate(prevProps) {\n            var previousVisualization = prevProps.visualization;\n            var visualization = this.props.visualization;\n\n            var didAmountsTypeChange = previousVisualization.get('amountsType') !== visualization.get('amountsType');\n            var didLegendSortByChange = previousVisualization.get('legendSortBy') !== visualization.get('legendSortBy');\n            var didTargetChange = !_immutable2.default.is(previousVisualization.get('target'), visualization.get('target'));\n            if (!_immutable2.default.is(previousVisualization.get('aggregates'), visualization.get('aggregates')) || didAmountsTypeChange || didTargetChange || didLegendSortByChange) {\n                while (this.chart.series.length) {\n                    firstPass = 0;\n                    this.chart.series[0].remove(false);\n                }\n            }\n            if (previousVisualization.get('showLegend') !== visualization.get('showLegend') || previousVisualization.get('graphType') !== visualization.get('graphType') || didLegendSortByChange) {\n                firstPass = 0;\n                this.initializeChart();\n            }\n            if (previousVisualization.get('showLegend') !== visualization.get('showLegend') || previousVisualization.get('graphType') !== visualization.get('graphType')\n            // indeces are only meaningful for non-bar charts,\n            // so make sure we don't have a bar chart before checking if the indeces were different\n            || previousVisualization.get('graphType') !== 'bar' && previousVisualization.get('index') !== visualization.get('index') || !_immutable2.default.is(previousVisualization.get('aggregates'), visualization.get('aggregates')) || didAmountsTypeChange || didTargetChange || didLegendSortByChange) {\n                this.updateChartSeries();\n            }\n            if (prevProps.bannerHeight !== this.props.bannerHeight && typeof this.props.bannerHeight === 'number') {\n                this.chart.setSize(null, this.props.this.props.aggregateVizHeight - this.props.bannerHeight);\n            }\n        }\n    }, {\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            //why does this get called on the back button? Going back is changing state, rather than just updating...\n            //Gets called whenever moving from table to chart, as component is mounting\n            this.colorIndex = 0;\n            this.colorCache = {};\n            this.legendLines = [];\n            this.initializeChart();\n            this.updateChartSeries();\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this.chart.destroy();\n        }\n    }, {\n        key: 'initializeChart',\n        value: function initializeChart() {\n            var _this2 = this;\n\n            _highchartsOg2.default.setOptions({\n                lang: {\n                    numericSymbols: ['k', 'M', 'B', 'T']\n                }\n            });\n            prevType = type;\n            var height = this.props.aggregateVizHeight;\n            var legendReversed = true;\n            var tooltipEnabled = true;\n            var showLegend = this.props.visualization.get('showLegend');\n            var graphType = this.props.visualization.get('graphType');\n            var labelsEnabled = true;\n            var lineColor = '#909090';\n            var lineWidth = 0;\n            switch (graphType) {\n                case 'treemap':\n                    type = 'treemap';\n                    showLegend = false;\n                    break;\n                case 'pie':\n                    type = 'pie';\n                    legendReversed = false;\n                    showLegend = false;\n                    height = 370; // need to increase pie chart size to display all labels when loading\n                    break;\n                case 'horizontal_stacked':\n                    type = 'bar';\n                    labelsEnabled = false;\n                    lineColor = '#f7f7f7';\n                    lineWidth = 10; //to hide\n                    showLegend = false;\n                    break;\n                case 'bar':\n                    type = 'column'; //if change to bar, then will be sideways orientated\n                    legendReversed = false;\n                    showLegend = false;\n                    break;\n                case 'line':\n                    type = 'line';\n                    legendReversed = false;\n                    showLegend = false;\n                    break;\n                default:\n                    break;\n            }\n            //for dynamic re-scaling\n            if (prevType !== type) {\n                firstPass = 0;\n            }\n            var self = this;\n            this.chart = new _highchartsOg2.default.Chart({\n                chart: {\n                    type: type,\n                    height: height,\n                    marginRight: 60,\n                    backgroundColor: '#ffffff',\n                    spacingLeft: 0,\n                    borderRadius: 0,\n                    renderTo: this.refs.highcharts,\n                    animation: {\n                        duration: 750 //animation duration\n                    },\n                    events: {\n                        redraw: function redraw() {\n                            var xAxis = _this2.chart.xAxis[0];\n                            _lodash2.default.each(xAxis.ticks, _lodash2.default.bind(function (tick) {\n                                if (tick.label) {\n                                    var $element = jQuery(tick.label.element);\n                                    $element.unbind('click');\n                                    $element.click(function () {\n                                        _grid_report_actions2.default.filterByFiscalYear(tick.pos);\n                                    });\n                                }\n                            }, _this2));\n                        }\n                    }\n                },\n                tooltip: {\n                    enabled: tooltipEnabled,\n                    useHTML: true,\n                    formatter: function formatter() {\n                        // The types for point don't include plotX, ployY, and tooltipPos so casting as any\n                        var point = this.point;\n                        var x = point.plotX;\n                        var y = point.plotY;\n                        var name = this.key;\n                        var value = this.y;\n                        value = point.negative === true ? -value : value;\n                        var amountColumn = (0, _transactions_utils.getAmountColumn)(self.props.visualization, self.props.schema);\n                        value = (0, _transactions_utils.formatUnits)(self.props.schema, amountColumn, value);\n                        var percentage = this.percentage;\n                        var showToolTip = !self.willFit(graphType, this).fullText; //note this is dependent on whether there is a datalabel or not\n                        switch (type) {\n                            case 'treemap':\n                                x = point.plotX;\n                                y = point.plotY;\n                                showToolTip = true;\n                                break;\n                            case 'column':\n                                x = point.plotX + this.series.chart.plotLeft;\n                                y = point.plotY + 2 * this.series.chart.plotTop;\n                                percentage = self.calculatePercentage(this.y, point.yearTotal);\n                                break;\n                            case 'pie':\n                                x = point.tooltipPos[0];\n                                y = point.tooltipPos[1] + 2 * this.series.chart.plotTop;\n                                break;\n                            case 'bar':\n                                x = point.tooltipPos[0] + this.series.chart.plotLeft; //how to get this centered???\n                                y = point.tooltipPos[1];\n                                percentage = self.calculatePercentage(this.y, point.yearTotal);\n                                break;\n                            case 'line':\n                                x = point.plotX + this.series.chart.plotLeft;\n                                y = point.plotY + this.series.chart.plotTop;\n                                percentage = self.calculatePercentage(this.y, point.yearTotal);\n                                break;\n                        }\n                        if (self.clearTooltips) {\n                            clearTimeout(self.clearTooltips);\n                        }\n                        if (showToolTip) {\n                            _grid_report_actions2.default.showVisualizationTooltip(x, y, name, value, percentage.toFixed(2));\n                        }\n                        if (!showToolTip) {\n                            _grid_report_actions2.default.hideVisualizationTooltip();\n                        }\n                        self.clearTooltips = null; //Note self refers to something else here than below....\n                        return false; //by returning null drilldown is broken...\n                    }\n                },\n                legend: {\n                    reversed: legendReversed,\n                    useHTML: true,\n                    enabled: showLegend,\n                    layout: 'vertical',\n                    align: 'right',\n                    verticalAlign: 'top',\n                    itemMarginBottom: 5,\n                    itemStyle: {\n                        fontWeight: 'normal',\n                        fontFamily: 'Benton Sans'\n                    }\n                },\n                xAxis: {\n                    showEmpty: false,\n                    tickColor: 'transparent',\n                    lineWidth: lineWidth,\n                    minorGridLineWidth: 0,\n                    lineColor: lineColor,\n                    labels: {\n                        enabled: labelsEnabled,\n                        useHTML: true,\n                        style: {\n                            color: '#737373',\n                            fontWeight: 'bold',\n                            fontFamily: 'Benton Sans',\n                            cursor: 'pointer'\n                        }\n                    },\n                    minorTickLength: 0,\n                    tickLength: 0\n                },\n                yAxis: {\n                    lineWidth: 0,\n                    showEmpty: false,\n                    lineColor: 'transparent',\n                    title: {\n                        text: null,\n                        useHTML: true\n                    },\n                    labels: {\n                        enabled: labelsEnabled,\n                        useHTML: true,\n                        style: {\n                            color: '#909090',\n                            fontFamily: 'Benton Sans'\n                        }\n                    },\n                    plotLines: [{\n                        value: 0,\n                        width: 2,\n                        color: _og_colors2.default.axisHtmlColor,\n                        id: 'zero-plot-line'\n                    }],\n                    plotBands: [],\n                    gridLineWidth: 0\n                },\n                plotOptions: {\n                    series: {\n                        marker: {\n                            symbol: 'circle'\n                        },\n                        states: {\n                            hover: {\n                                // NOTE: we removed halo effect because the highchart's native halo was overlapping\n                                // with our patterns.\n                                enabled: false\n                            },\n                            inactive: {\n                                opacity: 1\n                            }\n                        },\n                        point: {\n                            events: {\n                                mouseOver: function mouseOver() {\n                                    if (self.clearTooltips) {\n                                        clearTimeout(self.clearTooltips);\n                                    }\n                                    self.clearTooltips = null;\n                                    // Highcharts.PointOptionsObject does not include series_id for some reason\n                                    var series_id = this.options.series_id;\n\n                                    if (graphType !== 'bar') {\n                                        (0, _chart_utils.brightenSeries)(self.chart.series, _chart_utils.HIGHLIGHT_OPACITY, 'hover', series_id);\n                                    } else {\n                                        var selectedSeries = (0, _chart_utils.filterSelectedSeries)(self.chart.series, series_id);\n                                        (0, _chart_utils.brightenSeries)(selectedSeries, _chart_utils.HIGHLIGHT_OPACITY, 'hover');\n                                    }\n                                },\n                                mouseOut: function mouseOut() {\n                                    // Clear tooltip hackery is to allow this function to be\n                                    // invoked synchronously by highcarts in the middle of a\n                                    // dispatch\n                                    self.clearTooltips = setTimeout(function () {\n                                        _grid_report_actions2.default.hideVisualizationTooltip();\n                                        self.clearTooltips = null;\n                                    });\n                                    // Highcharts.PointOptionsObject does not include series_id for some reason\n                                    var series_id = this.options.series_id;\n\n                                    if (graphType !== 'bar') {\n                                        (0, _chart_utils.brightenSeries)(self.chart.series, -_chart_utils.HIGHLIGHT_OPACITY, 'hover', series_id);\n                                    } else {\n                                        var selectedSeries = (0, _chart_utils.filterSelectedSeries)(self.chart.series, series_id);\n                                        (0, _chart_utils.brightenSeries)(selectedSeries, -_chart_utils.HIGHLIGHT_OPACITY, 'hover');\n                                    }\n                                }\n                            }\n                        }\n                    },\n                    column: {\n                        stacking: 'normal',\n                        borderWidth: 0\n                    },\n                    pie: {\n                        borderWidth: 0,\n                        dataLabels: {\n                            //how to center align??\n                            formatter: function formatter() {\n                                return self.willFit(graphType, this).str;\n                            },\n\n                            useHTML: true,\n                            softConnector: false,\n                            distance: 35,\n                            padding: 1,\n                            y: -15,\n                            style: {\n                                color: 'rgba(0, 0, 0, 0.6)',\n                                fontFamily: 'Benton Sans',\n                                textAlign: 'center'\n                            }\n                        },\n                        showInLegend: true\n                    },\n                    bar: {\n                        borderWidth: 0,\n                        pointWidth: 150,\n                        dataLabels: {\n                            formatter: function formatter() {\n                                return self.willFit(graphType, this).str;\n                            },\n\n                            //rotation: -30, //this breaks other styling\n                            align: 'left',\n                            padding: 0,\n                            enabled: true,\n                            useHTML: true,\n                            inside: true,\n                            y: -150 / 2 - 25,\n                            style: {\n                                color: '#444444',\n                                fontWeight: '',\n                                fontFamily: 'Benton Sans'\n                            }\n                        }\n                    },\n                    treemap: {\n                        dataLabels: {\n                            formatter: function formatter() {\n                                return self.willFit(graphType, this).str;\n                            },\n\n                            align: 'left',\n                            verticalAlign: 'top',\n                            crop: false,\n                            useHTML: true,\n                            style: {\n                                color: 'rgba(0, 0, 0, 0.6)',\n                                fontWeight: '',\n                                fontFamily: 'Benton Sans'\n                            },\n                            padding: 7\n                        },\n                        showInLegend: true\n                    }\n                },\n                title: {\n                    text: '',\n                    useHTML: true\n                },\n                credits: {\n                    enabled: false\n                },\n                exporting: {\n                    buttons: {\n                        contextButton: {\n                            enabled: false\n                        }\n                    }\n                }\n            });\n        }\n    }, {\n        key: 'updateChartSeries',\n        value: function updateChartSeries() {\n            var _this3 = this;\n\n            var visualization = this.props.visualization;\n            var target_index = parseInt(visualization.get('index'));\n            var chart = this.chart;\n            var breakdown = visualization.get('breakdown');\n            var seriesMap = {};\n            var self = this;\n            var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, this.props.schema);\n            var sumField = amountColumn + '_sum';\n            var categories = visualization.get('xAxis').map(function (d) {\n                return d.value;\n            }).toJS();\n            var isCumulative = visualization.get('amountsType') === _transactions_utils.AmountsTypes.Cumulative;\n            var rawAggregates = visualization.get('aggregates');\n            var renderedAggregates = isCumulative ? (0, _transactions_utils.convertToCumulativeAmounts)(rawAggregates, breakdown, sumField) : rawAggregates;\n            var series = void 0;\n            var toVisualize = [];\n            var type = void 0;\n            var scopingToYear = true;\n            var graphType = visualization.get('graphType');\n            var target = visualization.get('target');\n            switch (graphType) {\n                case 'treemap':\n                    type = 'treemap';\n                    break;\n                case 'pie':\n                    type = 'pie';\n                    break;\n                case 'horizontal_stacked':\n                    type = 'bar';\n                    break;\n                case 'bar':\n                    type = 'column';\n                    scopingToYear = false;\n                    break;\n                case 'line':\n                    type = 'line';\n                    scopingToYear = false;\n                    break;\n                default:\n                    //is this necessary?\n                    break;\n            }\n            //because redrawing bar/horizontal-stacked -> setData issues\n            if (type === 'bar') {\n                while (chart.series.length) {\n                    chart.series[0].remove(false);\n                }\n            }\n            // remove any plotlines that may be present from the line graph\n            var yAxis = _lodash2.default.head(chart.yAxis);\n            _lodash2.default.each(chart.plotLines, function (line) {\n                yAxis.removePlotLine(line);\n            });\n            chart.plotLines = [];\n            // remove any plotbands that may be present\n            _lodash2.default.each(chart.plotBands, function (band) {\n                yAxis.removePlotBand(band);\n            });\n            chart.plotBands = [];\n            // Clear previous extremes set by targets\n            yAxis.setExtremes(null, null);\n            var index = 0;\n            renderedAggregates.forEach(function (yearData, i) {\n                if (!scopingToYear || i === target_index) {\n                    yearData.get('transactions').forEach(function (v) {\n                        var seriesName = v.get(breakdown);\n                        var sum = v.get(sumField);\n                        var isRemaining = v.get('isRemaining');\n                        var color = void 0;\n                        if (isRemaining) {\n                            color = _og_colors2.default.moreHtmlColor;\n                        } else {\n                            color = _this3.colorCache[seriesName] || _og_colors2.default.getHtmlColor(_this3.colorIndex++);\n                        }\n                        _this3.colorCache[seriesName] = color;\n                        var fillColor = (0, _chart_utils.setColorOpacityForDataSetType)(color, _chart_utils.REGULAR_OPACITY);\n                        seriesName = seriesName || noSeriesName;\n                        series = seriesMap[seriesName] = seriesMap[seriesName] || {\n                            cursor: 'pointer',\n                            id: seriesName,\n                            total: 0,\n                            //applies for treemap only\n                            layoutAlgorithm: 'squarified',\n                            name: seriesName,\n                            // we want the y-axis to be individual points not sums for a line chart\n                            stacking: type !== 'line',\n                            type: type,\n                            data: [],\n                            color: fillColor,\n                            events: {\n                                legendItemClick: onSeriesClick\n                            },\n                            isRemaining: isRemaining,\n                            point: {\n                                events: {\n                                    click: onSeriesClick\n                                }\n                            }\n                        };\n                        function onSeriesClick(clickedSeriesName) {\n                            _grid_report_actions2.default.hideVisualizationTooltip();\n                            self.clearTooltips = null;\n                            seriesName = this.name || clickedSeriesName;\n                            if (type === 'pie' || type === 'treemap') {\n                                isRemaining = seriesName === 'Show More' ? true : false;\n                            }\n                            if (isRemaining) {\n                                _grid_report_actions2.default.filterRemainingAggregates();\n                            } else if (seriesName === noSeriesName) {\n                                _grid_report_actions2.default.filterColumn(breakdown, null, true);\n                            } else {\n                                _grid_report_actions2.default.filterColumn(breakdown, 'eq', seriesName);\n                            }\n                            return false;\n                        }\n                        series.total += Math.abs(sum);\n                        if (type === 'pie' || type === 'treemap') {\n                            toVisualize.push({\n                                x: i,\n                                index: index,\n                                series_id: seriesName,\n                                isRemaining: isRemaining,\n                                name: seriesName,\n                                color: fillColor,\n                                value: Math.abs(sum),\n                                y: Math.abs(sum),\n                                isNeg: sum < 0 ? true : false\n                            });\n                            series.data = toVisualize;\n                        }\n                        if (type === 'bar' || type === 'column' || type === 'line') {\n                            series.data.push({\n                                x: i,\n                                index: index,\n                                series_id: seriesName,\n                                isRemaining: isRemaining,\n                                name: seriesName,\n                                color: fillColor,\n                                value: sum,\n                                y: sum\n                            });\n                        }\n                    });\n                    if (yearData.count()) {\n                        ++index;\n                    }\n                }\n            });\n            if (type === 'bar' || type === 'column' || type === 'line') {\n                //To calculate the yearly totals\n                var years = [];\n                _lodash2.default.each(seriesMap, function (seriesData) {\n                    _lodash2.default.each(seriesData.data, function (item) {\n                        years.push({\n                            year: item.x,\n                            value: item.value\n                        });\n                    });\n                });\n                var yearTotal = {}; //organizing + adding by year\n                _lodash2.default.each(years, _lodash2.default.bind(function (item) {\n                    if (item.year in yearTotal) {\n                        yearTotal[item.year] += Math.abs(item.value);\n                    } else {\n                        yearTotal[item.year] = Math.abs(item.value);\n                    }\n                }, this));\n                //Done calucating totals for each year\n                var sortedSeries = _lodash2.default.sortBy(seriesMap, _lodash2.default.bind(function (series) {\n                    _lodash2.default.each(series.data, function (item) {\n                        var year = item.x;\n                        item.yearTotal = yearTotal[year];\n                    });\n                    if (series.isRemaining) {\n                        return Infinity;\n                    }\n                    return series.total;\n                }, this));\n                this.sortedSeries = sortedSeries = (0, _chart_utils.sortLegendData)(sortedSeries, visualization.get('legendSortBy'));\n                if (type === 'column' || type === 'line' || firstPass < 1) {\n                    _lodash2.default.each(sortedSeries, function (seriesData) {\n                        chart.addSeries(seriesData, false);\n                    });\n                }\n                if (chart.xAxis && chart.xAxis[0]) {\n                    chart.xAxis[0].setCategories(categories, true);\n                    chart.redraw();\n                }\n                // Add plotlines if there is only one label in x-axis\n                if (type == 'line' && categories.length == 1) {\n                    var _self = this;\n                    var _yAxis = _lodash2.default.head(chart.yAxis);\n                    var _series = Array.from(sortedSeries).reverse();\n                    var point = void 0;\n                    var id = void 0;\n                    var events = void 0;\n                    var sum = 0;\n                    _lodash2.default.each(_series, function (s) {\n                        id = s.id;\n                        point = _lodash2.default.head(s.data);\n                        events = s.point.events;\n                        sum = sum + point.y;\n                        _yAxis.addPlotLine({\n                            value: sum,\n                            color: (0, _chart_utils.setColorOpacityForDataSetType)(_self.colorCache[s.name], _chart_utils.REGULAR_OPACITY),\n                            width: 2,\n                            id: id,\n                            events: {\n                                click: function click(e) {\n                                    events.click(e, s.name);\n                                }\n                            }\n                        });\n                        chart.plotLines.push(id);\n                    });\n                }\n                // Target Line/Band\n                if ((0, _target_utils.isTargetGraph)(graphType) && (0, _target_utils.isTargetValid)(target)) {\n                    var _yAxis2 = _lodash2.default.head(chart.yAxis);\n                    var targetType = target.get('type');\n                    var targetValue = target.get('value');\n                    // Scale graph to ensure target lines will fit in.\n                    var extremes = _yAxis2.getExtremes();\n                    var chartMax = void 0;\n                    if (extremes.dataMax) {\n                        chartMax = Math.max(extremes.dataMax, (0, _target_utils.isBetweenTarget)(targetType) ? targetValue.get('to') : targetValue);\n                        _yAxis2.setExtremes(null, chartMax);\n                    }\n                    if ((0, _target_utils.isBetweenTarget)(targetType)) {\n                        _yAxis2.addPlotBand({\n                            from: targetValue.get('from'),\n                            to: targetValue.get('to'),\n                            color: 'rgba(204, 204, 204, .3)',\n                            id: 'target',\n                            label: {\n                                style: {\n                                    fontFamily: 'Benton Sans',\n                                    color: '#ccc'\n                                },\n                                text: 'TARGET',\n                                align: 'right',\n                                x: 54,\n                                y: 4\n                            }\n                        });\n                        chart.plotBands.push('target');\n                    } else {\n                        // Add target line\n                        _yAxis2.addPlotLine({\n                            value: target.get('value'),\n                            color: '#ccc',\n                            width: 2,\n                            id: 'target',\n                            label: {\n                                style: {\n                                    fontFamily: 'Benton Sans',\n                                    color: '#ccc'\n                                },\n                                text: 'TARGET',\n                                align: 'right',\n                                x: 54,\n                                y: 4\n                            }\n                        });\n                        chart.plotLines.push('target');\n                    }\n                }\n            }\n            if (type === 'pie') {\n                //sorting by name so that when scrolling through years, item stay in same position\n                if (series && series.data) {\n                    series.data = _lodash2.default.sortBy(series.data, function (item) {\n                        if (item.isRemaining) {\n                            return Infinity;\n                        }\n                        return item.name;\n                    });\n                    if (chart.series.length !== 0) {\n                        //Conditionally trigger this....\n                        if (series.data.length !== previousLength) {\n                            chart.series[0].remove(false);\n                            chart.addSeries(series, false);\n                            chart.redraw();\n                            previousLength = series.data.length;\n                        } else {\n                            chart.series[0].setData(series.data);\n                        }\n                        // if we instantiate the chart and have series, add them\n                    } else {\n                        chart.addSeries(series, false);\n                        chart.redraw();\n                    }\n                }\n            }\n            if (type === 'treemap') {\n                while (chart.series.length > 0) {\n                    chart.series[0].remove(false);\n                }\n                chart.addSeries(series, false);\n                chart.redraw();\n            }\n            this.updateVisualization(this.sortedSeries);\n        }\n    }, {\n        key: 'calculatePercentage',\n        value: function calculatePercentage(pointPlotY, pointYearTotal) {\n            return Math.abs(pointPlotY / pointYearTotal * 100);\n        }\n    }, {\n        key: 'handleLegendSortChange',\n        value: function handleLegendSortChange(sortId) {\n            _grid_report_actions2.default.setLegendSortBy(sortId);\n        }\n    }, {\n        key: 'updateVisualization',\n        value: function updateVisualization(newSeries) {\n            if (!_lodash2.default.isEqual(this.legendLines, newSeries)) {\n                this.legendLines = newSeries;\n                this.forceUpdate();\n            }\n        }\n    }]);\n\n    return AggregateVisualizationCharts;\n}(_react2.default.PureComponent);\n\nexports.default = AggregateVisualizationCharts;\n\nAggregateVisualizationCharts.propTypes = {\n    visualization: _propTypes2.default.object.isRequired,\n    savedStateId: _propTypes2.default.string,\n    schema: _propTypes2.default.object.isRequired,\n    aggregateVizHeight: _propTypes2.default.number.isRequired,\n    bannerHeight: _propTypes2.default.number.isRequired\n};\n\n/***/ }),\n/* 980 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * (c) 2009-2018 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n(function (root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = root.document ?\n            factory(root) :\n            factory;\n    } else if (true) {\n        !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n            return factory(root);\n        }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    } else {\n        if (root.Highcharts) {\n            root.Highcharts.error(16, true);\n        }\n        root.Highcharts = factory(root);\n    }\n}(typeof window !== 'undefined' ? window : this, function (win) {\n    var _modules = {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'parts/Globals.js', [], function () {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /* globals Image, window */\n        /**\n         * Reference to the global SVGElement class as a workaround for a name conflict\n         * in the Highcharts namespace.\n         *\n         * @global\n         * @typedef {global.SVGElement} GlobalSVGElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n         */\n        // glob is a temporary fix to allow our es-modules to work.\n        var glob = ( // @todo UMD variable named `window`, and glob named `win`\n            typeof win !== 'undefined' ?\n                win :\n                typeof window !== 'undefined' ?\n                    window :\n                    {}), doc = glob.document, SVG_NS = 'http://www.w3.org/2000/svg', userAgent = (glob.navigator && glob.navigator.userAgent) || '', svg = (doc &&\n                doc.createElementNS &&\n                !!doc.createElementNS(SVG_NS, 'svg').createSVGRect), isMS = /(edge|msie|trident)/i.test(userAgent) && !glob.opera, isFirefox = userAgent.indexOf('Firefox') !== -1, isChrome = userAgent.indexOf('Chrome') !== -1, hasBidiBug = (isFirefox &&\n                parseInt(userAgent.split('Firefox/')[1], 10) < 4 // issue #38\n            );\n        var H = {\n                product: 'Highcharts',\n                version: '8.1.2',\n                deg2rad: Math.PI * 2 / 360,\n                doc: doc,\n                hasBidiBug: hasBidiBug,\n                hasTouch: !!glob.TouchEvent,\n                isMS: isMS,\n                isWebKit: userAgent.indexOf('AppleWebKit') !== -1,\n                isFirefox: isFirefox,\n                isChrome: isChrome,\n                isSafari: !isChrome && userAgent.indexOf('Safari') !== -1,\n                isTouchDevice: /(Mobile|Android|Windows Phone)/.test(userAgent),\n                SVG_NS: SVG_NS,\n                chartCount: 0,\n                seriesTypes: {},\n                symbolSizes: {},\n                svg: svg,\n                win: glob,\n                marginNames: ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n                noop: function () { },\n                /**\n                 * An array containing the current chart objects in the page. A chart's\n                 * position in the array is preserved throughout the page's lifetime. When\n                 * a chart is destroyed, the array item becomes `undefined`.\n                 *\n                 * @name Highcharts.charts\n                 * @type {Array<Highcharts.Chart|undefined>}\n                 */\n                charts: [],\n                /**\n                 * A hook for defining additional date format specifiers. New\n                 * specifiers are defined as key-value pairs by using the\n                 * specifier as key, and a function which takes the timestamp as\n                 * value. This function returns the formatted portion of the\n                 * date.\n                 *\n                 * @sample highcharts/global/dateformats/\n                 *         Adding support for week number\n                 *\n                 * @name Highcharts.dateFormats\n                 * @type {Highcharts.Dictionary<Highcharts.TimeFormatCallbackFunction>}\n                 */\n                dateFormats: {}\n            };\n\n        return H;\n    });\n    _registerModule(_modules, 'parts/Utilities.js', [_modules['parts/Globals.js']], function (H) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * An animation configuration. Animation configurations can also be defined as\n         * booleans, where `false` turns off animation and `true` defaults to a duration\n         * of 500ms.\n         *\n         * @interface Highcharts.AnimationOptionsObject\n         */ /**\n        * A callback function to exectute when the animation finishes.\n        * @name Highcharts.AnimationOptionsObject#complete\n        * @type {Function|undefined}\n        */ /**\n        * The animation duration in milliseconds.\n        * @name Highcharts.AnimationOptionsObject#duration\n        * @type {number|undefined}\n        */ /**\n        * The name of an easing function as defined on the `Math` object.\n        * @name Highcharts.AnimationOptionsObject#easing\n        * @type {string|Function|undefined}\n        */ /**\n        * A callback function to execute on each step of each attribute or CSS property\n        * that's being animated. The first argument contains information about the\n        * animation and progress.\n        * @name Highcharts.AnimationOptionsObject#step\n        * @type {Function|undefined}\n        */\n        /**\n         * Creates a frame for the animated SVG element.\n         *\n         * @callback Highcharts.AnimationStepCallbackFunction\n         *\n         * @param {Highcharts.SVGElement} this\n         *        The SVG element to animate.\n         *\n         * @return {void}\n         */\n        /**\n         * Interface description for a class.\n         *\n         * @interface Highcharts.Class<T>\n         * @extends Function\n         */ /**\n        * Class costructor.\n        * @function Highcharts.Class<T>#new\n        * @param {...Array<*>} args\n        *        Constructor arguments.\n        * @return {T}\n        *         Class instance.\n        */\n        /**\n         * A style object with camel case property names to define visual appearance of\n         * a SVG element or HTML element. The properties can be whatever styles are\n         * supported on the given SVG or HTML element.\n         *\n         * @example\n         * {\n         *    fontFamily: 'monospace',\n         *    fontSize: '1.2em'\n         * }\n         *\n         * @interface Highcharts.CSSObject\n         */ /**\n        * @name Highcharts.CSSObject#[key:string]\n        * @type {boolean|number|string|undefined}\n        */ /**\n        * Background style for the element.\n        * @name Highcharts.CSSObject#background\n        * @type {string|undefined}\n        */ /**\n        * Background color of the element.\n        * @name Highcharts.CSSObject#backgroundColor\n        * @type {Highcharts.ColorString|undefined}\n        */ /**\n        * Border style for the element.\n        * @name Highcharts.CSSObject#border\n        * @type {string|undefined}\n        */ /**\n        * Radius of the element border.\n        * @name Highcharts.CSSObject#borderRadius\n        * @type {number|undefined}\n        */ /**\n        * Color used in the element. The 'contrast' option is a Highcharts custom\n        * property that results in black or white, depending on the background of the\n        * element.\n        * @name Highcharts.CSSObject#color\n        * @type {'contrast'|Highcharts.ColorString|undefined}\n        */ /**\n        * Style of the mouse cursor when resting over the element.\n        * @name Highcharts.CSSObject#cursor\n        * @type {Highcharts.CursorValue|undefined}\n        */ /**\n        * Font family of the element text. Multiple values have to be in decreasing\n        * preference order and separated by comma.\n        * @name Highcharts.CSSObject#fontFamily\n        * @type {string|undefined}\n        */ /**\n        * Font size of the element text.\n        * @name Highcharts.CSSObject#fontSize\n        * @type {string|undefined}\n        */ /**\n        * Font weight of the element text.\n        * @name Highcharts.CSSObject#fontWeight\n        * @type {string|undefined}\n        */ /**\n        * Height of the element.\n        * @name Highcharts.CSSObject#height\n        * @type {number|undefined}\n        */ /**\n        * Width of the element border.\n        * @name Highcharts.CSSObject#lineWidth\n        * @type {number|undefined}\n        */ /**\n        * Opacity of the element.\n        * @name Highcharts.CSSObject#opacity\n        * @type {number|undefined}\n        */ /**\n        * Space around the element content.\n        * @name Highcharts.CSSObject#padding\n        * @type {string|undefined}\n        */ /**\n        * Behaviour of the element when the mouse cursor rests over it.\n        * @name Highcharts.CSSObject#pointerEvents\n        * @type {string|undefined}\n        */ /**\n        * Positioning of the element.\n        * @name Highcharts.CSSObject#position\n        * @type {string|undefined}\n        */ /**\n        * Alignment of the element text.\n        * @name Highcharts.CSSObject#textAlign\n        * @type {string|undefined}\n        */ /**\n        * Additional decoration of the element text.\n        * @name Highcharts.CSSObject#textDecoration\n        * @type {string|undefined}\n        */ /**\n        * Outline style of the element text.\n        * @name Highcharts.CSSObject#textOutline\n        * @type {string|undefined}\n        */ /**\n        * Line break style of the element text. Highcharts SVG elements support\n        * `ellipsis` when a `width` is set.\n        * @name Highcharts.CSSObject#textOverflow\n        * @type {string|undefined}\n        */ /**\n        * Top spacing of the element relative to the parent element.\n        * @name Highcharts.CSSObject#top\n        * @type {string|undefined}\n        */ /**\n        * Animated transition of selected element properties.\n        * @name Highcharts.CSSObject#transition\n        * @type {string|undefined}\n        */ /**\n        * Line break style of the element text.\n        * @name Highcharts.CSSObject#whiteSpace\n        * @type {string|undefined}\n        */ /**\n        * Width of the element.\n        * @name Highcharts.CSSObject#width\n        * @type {number|undefined}\n        */\n        /**\n         * All possible cursor styles.\n         *\n         * @typedef {'alias'|'all-scroll'|'auto'|'cell'|'col-resize'|'context-menu'|'copy'|'crosshair'|'default'|'e-resize'|'ew-resize'|'grab'|'grabbing'|'help'|'move'|'n-resize'|'ne-resize'|'nesw-resize'|'no-drop'|'none'|'not-allowed'|'ns-resize'|'nw-resize'|'nwse-resize'|'pointer'|'progress'|'row-resize'|'s-resize'|'se-resize'|'sw-resize'|'text'|'vertical-text'|'w-resize'|'wait'|'zoom-in'|'zoom-out'} Highcharts.CursorValue\n         */\n        /**\n         * All possible dash styles.\n         *\n         * @typedef {'Dash'|'DashDot'|'Dot'|'LongDash'|'LongDashDot'|'LongDashDotDot'|'ShortDash'|'ShortDashDot'|'ShortDashDotDot'|'ShortDot'|'Solid'} Highcharts.DashStyleValue\n         */\n        /**\n         * Generic dictionary in TypeScript notation.\n         * Use the native `Record<string, any>` instead.\n         *\n         * @deprecated\n         * @interface Highcharts.Dictionary<T>\n         */ /**\n        * @name Highcharts.Dictionary<T>#[key:string]\n        * @type {T}\n        */\n        /**\n         * The function callback to execute when the event is fired. The `this` context\n         * contains the instance, that fired the event.\n         *\n         * @callback Highcharts.EventCallbackFunction<T>\n         *\n         * @param {T} this\n         *\n         * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n         *        Event arguments.\n         *\n         * @return {boolean|void}\n         */\n        /**\n         * The event options for adding function callback.\n         *\n         * @interface Highcharts.EventOptionsObject\n         */ /**\n        * The order the event handler should be called. This opens for having one\n        * handler be called before another, independent of in which order they were\n        * added.\n        * @name Highcharts.EventOptionsObject#order\n        * @type {number}\n        */\n        /**\n         * Formats data as a string. Usually the data is accessible throught the `this`\n         * keyword.\n         *\n         * @callback Highcharts.FormatterCallbackFunction<T>\n         *\n         * @param {T} this\n         *        Context to format\n         *\n         * @return {string}\n         *         Formatted text\n         */\n        /**\n         * An object of key-value pairs for HTML attributes.\n         *\n         * @typedef {Highcharts.Dictionary<boolean|number|string|Function>} Highcharts.HTMLAttributes\n         */\n        /**\n         * An HTML DOM element. The type is a reference to the regular HTMLElement in\n         * the global scope.\n         *\n         * @typedef {global.HTMLElement} Highcharts.HTMLDOMElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement\n         */\n        /**\n         * The iterator callback.\n         *\n         * @callback Highcharts.ObjectEachCallbackFunction<T>\n         *\n         * @param {T} this\n         *        The context.\n         *\n         * @param {*} value\n         *        The property value.\n         *\n         * @param {string} key\n         *        The property key.\n         *\n         * @param {*} obj\n         *        The object that objectEach is being applied to.\n         */\n        /**\n         * An object containing `left` and `top` properties for the position in the\n         * page.\n         *\n         * @interface Highcharts.OffsetObject\n         */ /**\n        * Left distance to the page border.\n        * @name Highcharts.OffsetObject#left\n        * @type {number}\n        */ /**\n        * Top distance to the page border.\n        * @name Highcharts.OffsetObject#top\n        * @type {number}\n        */\n        /**\n         * Describes a range.\n         *\n         * @interface Highcharts.RangeObject\n         */ /**\n        * Maximum number of the range.\n        * @name Highcharts.RangeObject#max\n        * @type {number}\n        */ /**\n        * Minimum number of the range.\n        * @name Highcharts.RangeObject#min\n        * @type {number}\n        */\n        /**\n         * If a number is given, it defines the pixel length. If a percentage string is\n         * given, like for example `'50%'`, the setting defines a length relative to a\n         * base size, for example the size of a container.\n         *\n         * @typedef {number|string} Highcharts.RelativeSize\n         */\n        /**\n         * Proceed function to call original (wrapped) function.\n         *\n         * @callback Highcharts.WrapProceedFunction\n         *\n         * @param {*} [arg1]\n         *        Optional argument. Without any arguments defaults to first argument of\n         *        the wrapping function.\n         *\n         * @param {*} [arg2]\n         *        Optional argument. Without any arguments defaults to second argument\n         *        of the wrapping function.\n         *\n         * @param {*} [arg3]\n         *        Optional argument. Without any arguments defaults to third argument of\n         *        the wrapping function.\n         *\n         * @return {*}\n         *         Return value of the original function.\n         */\n        /**\n         * The Highcharts object is the placeholder for all other members, and various\n         * utility functions. The most important member of the namespace would be the\n         * chart constructor.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', { ... });\n         *\n         * @namespace Highcharts\n         */\n        H.timers = [];\n        var charts = H.charts,\n            doc = H.doc,\n            win = H.win;\n        /**\n         * Provide error messages for debugging, with links to online explanation. This\n         * function can be overridden to provide custom error handling.\n         *\n         * @sample highcharts/chart/highcharts-error/\n         *         Custom error handler\n         *\n         * @function Highcharts.error\n         *\n         * @param {number|string} code\n         *        The error code. See\n         *        [errors.xml](https://github.com/highcharts/highcharts/blob/master/errors/errors.xml)\n         *        for available codes. If it is a string, the error message is printed\n         *        directly in the console.\n         *\n         * @param {boolean} [stop=false]\n         *        Whether to throw an error or just log a warning in the console.\n         *\n         * @param {Highcharts.Chart} [chart]\n         *        Reference to the chart that causes the error. Used in 'debugger'\n         *        module to display errors directly on the chart.\n         *        Important note: This argument is undefined for errors that lack\n         *        access to the Chart instance.\n         *\n         * @param {Highcharts.Dictionary<string>} [params]\n         *        Additional parameters for the generated message.\n         *\n         * @return {void}\n         */\n        function error(code, stop, chart, params) {\n            var severity = stop ? 'Highcharts error' : 'Highcharts warning';\n            if (code === 32) {\n                code = severity + \": Deprecated member\";\n            }\n            var isCode = isNumber(code),\n                message = isCode ?\n                    severity + \" #\" + code + \": www.highcharts.com/errors/\" + code + \"/\" :\n                    code.toString(),\n                defaultHandler = function () {\n                    if (stop) {\n                        throw new Error(message);\n                }\n                // else ...\n                if (win.console &&\n                    error.messages.indexOf(message) === -1 // prevent console flooting\n                ) {\n                    console.log(message); // eslint-disable-line no-console\n                }\n            };\n            if (typeof params !== 'undefined') {\n                var additionalMessages_1 = '';\n                if (isCode) {\n                    message += '?';\n                }\n                objectEach(params, function (value, key) {\n                    additionalMessages_1 += \"\\n - \" + key + \": \" + value;\n                    if (isCode) {\n                        message += encodeURI(key) + '=' + encodeURI(value);\n                    }\n                });\n                message += additionalMessages_1;\n            }\n            if (chart) {\n                fireEvent(chart, 'displayError', { code: code, message: message, params: params }, defaultHandler);\n            }\n            else {\n                defaultHandler();\n            }\n            error.messages.push(message);\n        }\n        (function (error) {\n            error.messages = [];\n        })(error || (error = {}));\n        H.error = error;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * An animator object used internally. One instance applies to one property\n         * (attribute or style prop) on one element. Animation is always initiated\n         * through {@link SVGElement#animate}.\n         *\n         * @example\n         * var rect = renderer.rect(0, 0, 10, 10).add();\n         * rect.animate({ width: 100 });\n         *\n         * @private\n         * @class\n         * @name Highcharts.Fx\n         */\n        var Fx = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                /**\n                 *\n                 * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} elem\n                 *        The element to animate.\n                 *\n                 * @param {Highcharts.AnimationOptionsObject} options\n                 *        Animation options.\n                 *\n                 * @param {string} prop\n                 *        The single attribute or CSS property to animate.\n                 */\n                function Fx(elem, options, prop) {\n                    this.options = options;\n                this.elem = elem;\n                this.prop = prop;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set the current step of a path definition on SVGElement.\n             *\n             * @function Highcharts.Fx#dSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.dSetter = function () {\n                var paths = this.paths,\n                    start = paths && paths[0],\n                    end = paths && paths[1],\n                    path = [],\n                    now = this.now || 0;\n                // Land on the final path without adjustment points appended in the ends\n                if (now === 1 || !start || !end) {\n                    path = this.toD || [];\n                }\n                else if (start.length === end.length && now < 1) {\n                    for (var i = 0; i < end.length; i++) {\n                        // Tween between the start segment and the end segment. Start\n                        // with a copy of the end segment and tween the appropriate\n                        // numerics\n                        var startSeg = start[i];\n                        var endSeg = end[i];\n                        var tweenSeg = [];\n                        for (var j = 0; j < endSeg.length; j++) {\n                            var startItem = startSeg[j];\n                            var endItem = endSeg[j];\n                            // Tween numbers\n                            if (typeof startItem === 'number' &&\n                                typeof endItem === 'number' &&\n                                // Arc boolean flags\n                                !(endSeg[0] === 'A' && (j === 4 || j === 5))) {\n                                tweenSeg[j] = startItem + now * (endItem - startItem);\n                                // Strings, take directly from the end segment\n                            }\n                            else {\n                                tweenSeg[j] = endItem;\n                            }\n                        }\n                        path.push(tweenSeg);\n                    }\n                    // If animation is finished or length not matching, land on right value\n                }\n                else {\n                    path = end;\n                }\n                this.elem.attr('d', path, void 0, true);\n            };\n            /**\n             * Update the element with the current animation step.\n             *\n             * @function Highcharts.Fx#update\n             *\n             * @return {void}\n             */\n            Fx.prototype.update = function () {\n                var elem = this.elem,\n                    prop = this.prop, // if destroyed, it is null\n                    now = this.now,\n                    step = this.options.step;\n                // Animation setter defined from outside\n                if (this[prop + 'Setter']) {\n                    this[prop + 'Setter']();\n                    // Other animations on SVGElement\n                }\n                else if (elem.attr) {\n                    if (elem.element) {\n                        elem.attr(prop, now, null, true);\n                    }\n                    // HTML styles, raw HTML content like container size\n                }\n                else {\n                    elem.style[prop] = now + this.unit;\n                }\n                if (step) {\n                    step.call(elem, now, this);\n                }\n            };\n            /**\n             * Run an animation.\n             *\n             * @function Highcharts.Fx#run\n             *\n             * @param {number} from\n             *        The current value, value to start from.\n             *\n             * @param {number} to\n             *        The end value, value to land on.\n             *\n             * @param {string} unit\n             *        The property unit, for example `px`.\n             *\n             * @return {void}\n             */\n            Fx.prototype.run = function (from, to, unit) {\n                var self = this,\n                    options = self.options,\n                    timer = function (gotoEnd) {\n                        return timer.stopped ? false : self.step(gotoEnd);\n                }, requestAnimationFrame = win.requestAnimationFrame ||\n                    function (step) {\n                        setTimeout(step, 13);\n                    }, step = function () {\n                    for (var i = 0; i < H.timers.length; i++) {\n                        if (!H.timers[i]()) {\n                            H.timers.splice(i--, 1);\n                        }\n                    }\n                    if (H.timers.length) {\n                        requestAnimationFrame(step);\n                    }\n                };\n                if (from === to && !this.elem['forceAnimate:' + this.prop]) {\n                    delete options.curAnim[this.prop];\n                    if (options.complete && Object.keys(options.curAnim).length === 0) {\n                        options.complete.call(this.elem);\n                    }\n                }\n                else { // #7166\n                    this.startTime = +new Date();\n                    this.start = from;\n                    this.end = to;\n                    this.unit = unit;\n                    this.now = this.start;\n                    this.pos = 0;\n                    timer.elem = this.elem;\n                    timer.prop = this.prop;\n                    if (timer() && H.timers.push(timer) === 1) {\n                        requestAnimationFrame(step);\n                    }\n                }\n            };\n            /**\n             * Run a single step in the animation.\n             *\n             * @function Highcharts.Fx#step\n             *\n             * @param {boolean} [gotoEnd]\n             *        Whether to go to the endpoint of the animation after abort.\n             *\n             * @return {boolean}\n             *         Returns `true` if animation continues.\n             */\n            Fx.prototype.step = function (gotoEnd) {\n                var t = +new Date(),\n                    ret,\n                    done,\n                    options = this.options,\n                    elem = this.elem,\n                    complete = options.complete,\n                    duration = options.duration,\n                    curAnim = options.curAnim;\n                if (elem.attr && !elem.element) { // #2616, element is destroyed\n                    ret = false;\n                }\n                else if (gotoEnd || t >= duration + this.startTime) {\n                    this.now = this.end;\n                    this.pos = 1;\n                    this.update();\n                    curAnim[this.prop] = true;\n                    done = true;\n                    objectEach(curAnim, function (val) {\n                        if (val !== true) {\n                            done = false;\n                        }\n                    });\n                    if (done && complete) {\n                        complete.call(elem);\n                    }\n                    ret = false;\n                }\n                else {\n                    this.pos = options.easing((t - this.startTime) / duration);\n                    this.now = this.start + ((this.end - this.start) * this.pos);\n                    this.update();\n                    ret = true;\n                }\n                return ret;\n            };\n            /**\n             * Prepare start and end values so that the path can be animated one to one.\n             *\n             * @function Highcharts.Fx#initPath\n             *\n             * @param {Highcharts.SVGElement} elem\n             *        The SVGElement item.\n             *\n             * @param {Highcharts.SVGPathArray|undefined} fromD\n             *        Starting path definition.\n             *\n             * @param {Highcharts.SVGPathArray} toD\n             *        Ending path definition.\n             *\n             * @return {Array<Highcharts.SVGPathArray,Highcharts.SVGPathArray>}\n             *         An array containing start and end paths in array form so that\n             *         they can be animated in parallel.\n             */\n            Fx.prototype.initPath = function (elem, fromD, toD) {\n                var shift,\n                    startX = elem.startX,\n                    endX = elem.endX,\n                    fullLength,\n                    i,\n                    start = fromD && fromD.slice(), // copy\n                    end = toD.slice(), // copy\n                    isArea = elem.isArea,\n                    positionFactor = isArea ? 2 : 1,\n                    reverse;\n                if (!start) {\n                    return [end, end];\n                }\n                /**\n                 * If shifting points, prepend a dummy point to the end path.\n                 * @private\n                 * @param {Highcharts.SVGPathArray} arr - array\n                 * @param {Highcharts.SVGPathArray} other - array\n                 * @return {void}\n                 */\n                function prepend(arr, other) {\n                    while (arr.length < fullLength) {\n                        // Move to, line to or curve to?\n                        var moveSegment = arr[0],\n                            otherSegment = other[fullLength - arr.length];\n                        if (otherSegment && moveSegment[0] === 'M') {\n                            if (otherSegment[0] === 'C') {\n                                arr[0] = [\n                                    'C',\n                                    moveSegment[1],\n                                    moveSegment[2],\n                                    moveSegment[1],\n                                    moveSegment[2],\n                                    moveSegment[1],\n                                    moveSegment[2]\n                                ];\n                            }\n                            else {\n                                arr[0] = ['L', moveSegment[1], moveSegment[2]];\n                            }\n                        }\n                        // Prepend a copy of the first point\n                        arr.unshift(moveSegment);\n                        // For areas, the bottom path goes back again to the left, so we\n                        // need to append a copy of the last point.\n                        if (isArea) {\n                            arr.push(arr[arr.length - 1]);\n                        }\n                    }\n                }\n                /**\n                 * Copy and append last point until the length matches the end length.\n                 * @private\n                 * @param {Highcharts.SVGPathArray} arr - array\n                 * @param {Highcharts.SVGPathArray} other - array\n                 * @return {void}\n                 */\n                function append(arr, other) {\n                    while (arr.length < fullLength) {\n                        // Pull out the slice that is going to be appended or inserted.\n                        // In a line graph, the positionFactor is 1, and the last point\n                        // is sliced out. In an area graph, the positionFactor is 2,\n                        // causing the middle two points to be sliced out, since an area\n                        // path starts at left, follows the upper path then turns and\n                        // follows the bottom back.\n                        var segmentToAdd = arr[arr.length / positionFactor - 1].slice();\n                        // Disable the first control point of curve segments\n                        if (segmentToAdd[0] === 'C') {\n                            segmentToAdd[1] = segmentToAdd[5];\n                            segmentToAdd[2] = segmentToAdd[6];\n                        }\n                        if (!isArea) {\n                            arr.push(segmentToAdd);\n                        }\n                        else {\n                            var lowerSegmentToAdd = arr[arr.length / positionFactor].slice();\n                            arr.splice(arr.length / 2, 0, segmentToAdd, lowerSegmentToAdd);\n                        }\n                    }\n                }\n                // For sideways animation, find out how much we need to shift to get the\n                // start path Xs to match the end path Xs.\n                if (startX && endX) {\n                    for (i = 0; i < startX.length; i++) {\n                        // Moving left, new points coming in on right\n                        if (startX[i] === endX[0]) {\n                            shift = i;\n                            break;\n                            // Moving right\n                        }\n                        else if (startX[0] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = i;\n                            reverse = true;\n                            break;\n                            // Fixed from the right side, \"scaling\" left\n                        }\n                        else if (startX[startX.length - 1] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = startX.length - i;\n                            break;\n                        }\n                    }\n                    if (typeof shift === 'undefined') {\n                        start = [];\n                    }\n                }\n                if (start.length && isNumber(shift)) {\n                    // The common target length for the start and end array, where both\n                    // arrays are padded in opposite ends\n                    fullLength = end.length + shift * positionFactor;\n                    if (!reverse) {\n                        prepend(end, start);\n                        append(start, end);\n                    }\n                    else {\n                        prepend(start, end);\n                        append(end, start);\n                    }\n                }\n                return [start, end];\n            };\n            /**\n             * Handle animation of the color attributes directly.\n             *\n             * @function Highcharts.Fx#fillSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.fillSetter = function () {\n                Fx.prototype.strokeSetter.apply(this, arguments);\n            };\n            /**\n             * Handle animation of the color attributes directly.\n             *\n             * @function Highcharts.Fx#strokeSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.strokeSetter = function () {\n                this.elem.attr(this.prop, H.color(this.start).tweenTo(H.color(this.end), this.pos), null, true);\n            };\n            return Fx;\n        }());\n        H.Fx = Fx;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Utility function to deep merge two or more objects and return a third object.\n         * If the first argument is true, the contents of the second object is copied\n         * into the first object. The merge function can also be used with a single\n         * object argument to create a deep copy of an object.\n         *\n         * @function Highcharts.merge<T>\n         *\n         * @param {boolean} extend\n         *        Whether to extend the left-side object (a) or return a whole new\n         *        object.\n         *\n         * @param {T|undefined} a\n         *        The first object to extend. When only this is given, the function\n         *        returns a deep copy.\n         *\n         * @param {...Array<object|undefined>} [n]\n         *        An object to merge into the previous one.\n         *\n         * @return {T}\n         *         The merged object. If the first argument is true, the return is the\n         *         same as the second argument.\n         */ /**\n        * Utility function to deep merge two or more objects and return a third object.\n        * The merge function can also be used with a single object argument to create a\n        * deep copy of an object.\n        *\n        * @function Highcharts.merge<T>\n        *\n        * @param {T|undefined} a\n        *        The first object to extend. When only this is given, the function\n        *        returns a deep copy.\n        *\n        * @param {...Array<object|undefined>} [n]\n        *        An object to merge into the previous one.\n        *\n        * @return {T}\n        *         The merged object. If the first argument is true, the return is the\n        *         same as the second argument.\n        */\n        function merge() {\n            /* eslint-enable valid-jsdoc */\n            var i,\n                args = arguments,\n                len,\n                ret = {},\n                doCopy = function (copy,\n                original) {\n                    // An object is replacing a primitive\n                    if (typeof copy !== 'object') {\n                        copy = {};\n                }\n                objectEach(original, function (value, key) {\n                    // Copy the contents of objects, but not arrays or DOM nodes\n                    if (isObject(value, true) &&\n                        !isClass(value) &&\n                        !isDOMElement(value)) {\n                        copy[key] = doCopy(copy[key] || {}, value);\n                        // Primitives and arrays are copied over directly\n                    }\n                    else {\n                        copy[key] = original[key];\n                    }\n                });\n                return copy;\n            };\n            // If first argument is true, copy into the existing object. Used in\n            // setOptions.\n            if (args[0] === true) {\n                ret = args[1];\n                args = Array.prototype.slice.call(args, 2);\n            }\n            // For each argument, extend the return\n            len = args.length;\n            for (i = 0; i < len; i++) {\n                ret = doCopy(ret, args[i]);\n            }\n            return ret;\n        }\n        H.merge = merge;\n        /**\n         * Constrain a value to within a lower and upper threshold.\n         *\n         * @private\n         * @param {number} value The initial value\n         * @param {number} min The lower threshold\n         * @param {number} max The upper threshold\n         * @return {number} Returns a number value within min and max.\n         */\n        function clamp(value, min, max) {\n            return value > min ? value < max ? value : max : min;\n        }\n        /**\n         * Shortcut for parseInt\n         *\n         * @private\n         * @function Highcharts.pInt\n         *\n         * @param {*} s\n         *        any\n         *\n         * @param {number} [mag]\n         *        Magnitude\n         *\n         * @return {number}\n         *         number\n         */\n        var pInt = H.pInt = function pInt(s,\n            mag) {\n                return parseInt(s,\n            mag || 10);\n        };\n        /**\n         * Utility function to check for string type.\n         *\n         * @function Highcharts.isString\n         *\n         * @param {*} s\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a string.\n         */\n        var isString = H.isString = function isString(s) {\n                return typeof s === 'string';\n        };\n        /**\n         * Utility function to check if an item is an array.\n         *\n         * @function Highcharts.isArray\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is an array.\n         */\n        var isArray = H.isArray = function isArray(obj) {\n                var str = Object.prototype.toString.call(obj);\n            return str === '[object Array]' || str === '[object Array Iterator]';\n        };\n        /**\n         * Utility function to check if an item is of type object.\n         *\n         * @function Highcharts.isObject\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @param {boolean} [strict=false]\n         *        Also checks that the object is not an array.\n         *\n         * @return {boolean}\n         *         True if the argument is an object.\n         */\n        function isObject(obj, strict) {\n            return (!!obj &&\n                typeof obj === 'object' &&\n                (!strict || !isArray(obj))); // eslint-disable-line @typescript-eslint/no-explicit-any\n        }\n        H.isObject = isObject;\n        /**\n         * Utility function to check if an Object is a HTML Element.\n         *\n         * @function Highcharts.isDOMElement\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a HTML Element.\n         */\n        var isDOMElement = H.isDOMElement = function isDOMElement(obj) {\n                return isObject(obj) && typeof obj.nodeType === 'number';\n        };\n        /**\n         * Utility function to check if an Object is a class.\n         *\n         * @function Highcharts.isClass\n         *\n         * @param {object|undefined} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a class.\n         */\n        var isClass = H.isClass = function isClass(obj) {\n                var c = obj && obj.constructor;\n            return !!(isObject(obj, true) &&\n                !isDOMElement(obj) &&\n                (c && c.name && c.name !== 'Object'));\n        };\n        /**\n         * Utility function to check if an item is a number and it is finite (not NaN,\n         * Infinity or -Infinity).\n         *\n         * @function Highcharts.isNumber\n         *\n         * @param {*} n\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the item is a finite number\n         */\n        var isNumber = H.isNumber = function isNumber(n) {\n                return typeof n === 'number' && !isNaN(n) && n < Infinity && n > -Infinity;\n        };\n        /**\n         * Remove the last occurence of an item from an array.\n         *\n         * @function Highcharts.erase\n         *\n         * @param {Array<*>} arr\n         *        The array.\n         *\n         * @param {*} item\n         *        The item to remove.\n         *\n         * @return {void}\n         */\n        var erase = H.erase = function erase(arr,\n            item) {\n                var i = arr.length;\n            while (i--) {\n                if (arr[i] === item) {\n                    arr.splice(i, 1);\n                    break;\n                }\n            }\n        };\n        /**\n         * Check if an object is null or undefined.\n         *\n         * @function Highcharts.defined\n         *\n         * @param {*} obj\n         *        The object to check.\n         *\n         * @return {boolean}\n         *         False if the object is null or undefined, otherwise true.\n         */\n        var defined = H.defined = function defined(obj) {\n                return typeof obj !== 'undefined' && obj !== null;\n        };\n        /**\n         * Set or get an attribute or an object of attributes. To use as a setter, pass\n         * a key and a value, or let the second argument be a collection of keys and\n         * values. To use as a getter, pass only a string as the second argument.\n         *\n         * @function Highcharts.attr\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} elem\n         *        The DOM element to receive the attribute(s).\n         *\n         * @param {string|Highcharts.HTMLAttributes|Highcharts.SVGAttributes} [prop]\n         *        The property or an object of key-value pairs.\n         *\n         * @param {number|string} [value]\n         *        The value if a single property is set.\n         *\n         * @return {string|null|undefined}\n         *         When used as a getter, return the value.\n         */\n        function attr(elem, prop, value) {\n            var ret;\n            // if the prop is a string\n            if (isString(prop)) {\n                // set the value\n                if (defined(value)) {\n                    elem.setAttribute(prop, value);\n                    // get the value\n                }\n                else if (elem && elem.getAttribute) {\n                    ret = elem.getAttribute(prop);\n                    // IE7 and below cannot get class through getAttribute (#7850)\n                    if (!ret && prop === 'class') {\n                        ret = elem.getAttribute(prop + 'Name');\n                    }\n                }\n                // else if prop is defined, it is a hash of key/value pairs\n            }\n            else {\n                objectEach(prop, function (val, key) {\n                    elem.setAttribute(key, val);\n                });\n            }\n            return ret;\n        }\n        H.attr = attr;\n        /**\n         * Check if an element is an array, and if not, make it into an array.\n         *\n         * @function Highcharts.splat\n         *\n         * @param {*} obj\n         *        The object to splat.\n         *\n         * @return {Array}\n         *         The produced or original array.\n         */\n        var splat = H.splat = function splat(obj) {\n                return isArray(obj) ? obj : [obj];\n        };\n        /**\n         * Set a timeout if the delay is given, otherwise perform the function\n         * synchronously.\n         *\n         * @function Highcharts.syncTimeout\n         *\n         * @param {Function} fn\n         *        The function callback.\n         *\n         * @param {number} delay\n         *        Delay in milliseconds.\n         *\n         * @param {*} [context]\n         *        An optional context to send to the function callback.\n         *\n         * @return {number}\n         *         An identifier for the timeout that can later be cleared with\n         *         Highcharts.clearTimeout. Returns -1 if there is no timeout.\n         */\n        var syncTimeout = H.syncTimeout = function syncTimeout(fn,\n            delay,\n            context) {\n                if (delay > 0) {\n                    return setTimeout(fn,\n            delay,\n            context);\n            }\n            fn.call(0, context);\n            return -1;\n        };\n        /**\n         * Internal clear timeout. The function checks that the `id` was not removed\n         * (e.g. by `chart.destroy()`). For the details see\n         * [issue #7901](https://github.com/highcharts/highcharts/issues/7901).\n         *\n         * @function Highcharts.clearTimeout\n         *\n         * @param {number} id\n         *        Id of a timeout.\n         *\n         * @return {void}\n         */\n        var internalClearTimeout = H.clearTimeout = function (id) {\n                if (defined(id)) {\n                    clearTimeout(id);\n            }\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Utility function to extend an object with the members of another.\n         *\n         * @function Highcharts.extend<T>\n         *\n         * @param {T|undefined} a\n         *        The object to be extended.\n         *\n         * @param {object} b\n         *        The object to add to the first one.\n         *\n         * @return {T}\n         *         Object a, the original object.\n         */\n        var extend = H.extend = function extend(a,\n            b) {\n                /* eslint-enable valid-jsdoc */\n                var n;\n            if (!a) {\n                a = {};\n            }\n            for (n in b) { // eslint-disable-line guard-for-in\n                a[n] = b[n];\n            }\n            return a;\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Return the first value that is not null or undefined.\n         *\n         * @function Highcharts.pick<T>\n         *\n         * @param {...Array<T|null|undefined>} items\n         *        Variable number of arguments to inspect.\n         *\n         * @return {T}\n         *         The value of the first argument that is not null or undefined.\n         */\n        function pick() {\n            var args = arguments;\n            var length = args.length;\n            for (var i = 0; i < length; i++) {\n                var arg = args[i];\n                if (typeof arg !== 'undefined' && arg !== null) {\n                    return arg;\n                }\n            }\n        }\n        H.pick = pick;\n        /**\n         * Set CSS on a given element.\n         *\n         * @function Highcharts.css\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} el\n         *        An HTML DOM element.\n         *\n         * @param {Highcharts.CSSObject} styles\n         *        Style object with camel case property names.\n         *\n         * @return {void}\n         */\n        var css = H.css = function css(el,\n            styles) {\n                if (H.isMS && !H.svg) { // #2686\n                    if (styles && typeof styles.opacity !== 'undefined') {\n                        styles.filter =\n                            'alpha(opacity=' + (styles.opacity * 100) + ')';\n                }\n            }\n            extend(el.style, styles);\n        };\n        /**\n         * Utility function to create an HTML element with attributes and styles.\n         *\n         * @function Highcharts.createElement\n         *\n         * @param {string} tag\n         *        The HTML tag.\n         *\n         * @param {Highcharts.HTMLAttributes} [attribs]\n         *        Attributes as an object of key-value pairs.\n         *\n         * @param {Highcharts.CSSObject} [styles]\n         *        Styles as an object of key-value pairs.\n         *\n         * @param {Highcharts.HTMLDOMElement} [parent]\n         *        The parent HTML object.\n         *\n         * @param {boolean} [nopad=false]\n         *        If true, remove all padding, border and margin.\n         *\n         * @return {Highcharts.HTMLDOMElement}\n         *         The created DOM element.\n         */\n        var createElement = H.createElement = function createElement(tag,\n            attribs,\n            styles,\n            parent,\n            nopad) {\n                var el = doc.createElement(tag);\n            if (attribs) {\n                extend(el, attribs);\n            }\n            if (nopad) {\n                css(el, { padding: '0', border: 'none', margin: '0' });\n            }\n            if (styles) {\n                css(el, styles);\n            }\n            if (parent) {\n                parent.appendChild(el);\n            }\n            return el;\n        };\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Extend a prototyped class by new members.\n         *\n         * @function Highcharts.extendClass<T>\n         *\n         * @param {Highcharts.Class<T>} parent\n         *        The parent prototype to inherit.\n         *\n         * @param {Highcharts.Dictionary<*>} members\n         *        A collection of prototype members to add or override compared to the\n         *        parent prototype.\n         *\n         * @return {Highcharts.Class<T>}\n         *         A new prototype.\n         */\n        var extendClass = H.extendClass = function extendClass(parent,\n            members) {\n                var obj = (function () { });\n            obj.prototype = new parent(); // eslint-disable-line new-cap\n            extend(obj.prototype, members);\n            return obj;\n        };\n        /**\n         * Left-pad a string to a given length by adding a character repetetively.\n         *\n         * @function Highcharts.pad\n         *\n         * @param {number} number\n         *        The input string or number.\n         *\n         * @param {number} [length]\n         *        The desired string length.\n         *\n         * @param {string} [padder=0]\n         *        The character to pad with.\n         *\n         * @return {string}\n         *         The padded string.\n         */\n        var pad = H.pad = function pad(number, length, padder) {\n                return new Array((length || 2) +\n                    1 -\n                    String(number)\n                        .replace('-', '')\n                        .length).join(padder || '0') + number;\n        };\n        /**\n         * Return a length based on either the integer value, or a percentage of a base.\n         *\n         * @function Highcharts.relativeLength\n         *\n         * @param {Highcharts.RelativeSize} value\n         *        A percentage string or a number.\n         *\n         * @param {number} base\n         *        The full length that represents 100%.\n         *\n         * @param {number} [offset=0]\n         *        A pixel offset to apply for percentage values. Used internally in\n         *        axis positioning.\n         *\n         * @return {number}\n         *         The computed length.\n         */\n        var relativeLength = H.relativeLength = function relativeLength(value,\n            base,\n            offset) {\n                return (/%$/).test(value) ?\n                    (base * parseFloat(value) / 100) + (offset || 0) :\n                    parseFloat(value);\n        };\n        /**\n         * Wrap a method with extended functionality, preserving the original function.\n         *\n         * @function Highcharts.wrap\n         *\n         * @param {*} obj\n         *        The context object that the method belongs to. In real cases, this is\n         *        often a prototype.\n         *\n         * @param {string} method\n         *        The name of the method to extend.\n         *\n         * @param {Highcharts.WrapProceedFunction} func\n         *        A wrapper function callback. This function is called with the same\n         *        arguments as the original function, except that the original function\n         *        is unshifted and passed as the first argument.\n         */\n        var wrap = H.wrap = function wrap(obj,\n            method,\n            func) {\n                var proceed = obj[method];\n            obj[method] = function () {\n                var args = Array.prototype.slice.call(arguments),\n                    outerArgs = arguments,\n                    ctx = this,\n                    ret;\n                ctx.proceed = function () {\n                    proceed.apply(ctx, arguments.length ? arguments : outerArgs);\n                };\n                args.unshift(proceed);\n                ret = func.apply(this, args);\n                ctx.proceed = null;\n                return ret;\n            };\n        };\n        /**\n         * Format a string according to a subset of the rules of Python's String.format\n         * method.\n         *\n         * @example\n         * var s = Highcharts.format(\n         *     'The {color} fox was {len:.2f} feet long',\n         *     { color: 'red', len: Math.PI }\n         * );\n         * // => The red fox was 3.14 feet long\n         *\n         * @function Highcharts.format\n         *\n         * @param {string} str\n         *        The string to format.\n         *\n         * @param {Record<string, *>} ctx\n         *        The context, a collection of key-value pairs where each key is\n         *        replaced by its value.\n         *\n         * @param {Highcharts.Chart} [chart]\n         *        A `Chart` instance used to get numberFormatter and time.\n         *\n         * @return {string}\n         *         The formatted string.\n         */\n        var format = H.format = function (str,\n            ctx,\n            chart) {\n                var splitter = '{',\n            isInside = false,\n            segment,\n            valueAndFormat,\n            ret = [],\n            val,\n            index;\n            var floatRegex = /f$/;\n            var decRegex = /\\.([0-9])/;\n            var lang = H.defaultOptions.lang;\n            var time = chart && chart.time || H.time;\n            var numberFormatter = chart && chart.numberFormatter || numberFormat;\n            while (str) {\n                index = str.indexOf(splitter);\n                if (index === -1) {\n                    break;\n                }\n                segment = str.slice(0, index);\n                if (isInside) { // we're on the closing bracket looking back\n                    valueAndFormat = segment.split(':');\n                    val = getNestedProperty(valueAndFormat.shift() || '', ctx);\n                    // Format the replacement\n                    if (valueAndFormat.length && typeof val === 'number') {\n                        segment = valueAndFormat.join(':');\n                        if (floatRegex.test(segment)) { // float\n                            var decimals = parseInt((segment.match(decRegex) || ['', '-1'])[1], 10);\n                            if (val !== null) {\n                                val = numberFormatter(val, decimals, lang.decimalPoint, segment.indexOf(',') > -1 ? lang.thousandsSep : '');\n                            }\n                        }\n                        else {\n                            val = time.dateFormat(segment, val);\n                        }\n                    }\n                    // Push the result and advance the cursor\n                    ret.push(val);\n                }\n                else {\n                    ret.push(segment);\n                }\n                str = str.slice(index + 1); // the rest\n                isInside = !isInside; // toggle\n                splitter = isInside ? '}' : '{'; // now look for next matching bracket\n            }\n            ret.push(str);\n            return ret.join('');\n        };\n        /**\n         * Get the magnitude of a number.\n         *\n         * @function Highcharts.getMagnitude\n         *\n         * @param {number} num\n         *        The number.\n         *\n         * @return {number}\n         *         The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2 etc.\n         */\n        var getMagnitude = H.getMagnitude = function (num) {\n                return Math.pow(10,\n            Math.floor(Math.log(num) / Math.LN10));\n        };\n        /**\n         * Take an interval and normalize it to multiples of round numbers.\n         *\n         * @deprecated\n         * @function Highcharts.normalizeTickInterval\n         *\n         * @param {number} interval\n         *        The raw, un-rounded interval.\n         *\n         * @param {Array<*>} [multiples]\n         *        Allowed multiples.\n         *\n         * @param {number} [magnitude]\n         *        The magnitude of the number.\n         *\n         * @param {boolean} [allowDecimals]\n         *        Whether to allow decimals.\n         *\n         * @param {boolean} [hasTickAmount]\n         *        If it has tickAmount, avoid landing on tick intervals lower than\n         *        original.\n         *\n         * @return {number}\n         *         The normalized interval.\n         *\n         * @todo\n         * Move this function to the Axis prototype. It is here only for historical\n         * reasons.\n         */\n        var normalizeTickInterval = H.normalizeTickInterval = function (interval,\n            multiples,\n            magnitude,\n            allowDecimals,\n            hasTickAmount) {\n                var normalized,\n            i,\n            retInterval = interval;\n            // round to a tenfold of 1, 2, 2.5 or 5\n            magnitude = pick(magnitude, 1);\n            normalized = interval / magnitude;\n            // multiples for a linear scale\n            if (!multiples) {\n                multiples = hasTickAmount ?\n                    // Finer grained ticks when the tick amount is hard set, including\n                    // when alignTicks is true on multiple axes (#4580).\n                    [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n                    // Else, let ticks fall on rounder numbers\n                    [1, 2, 2.5, 5, 10];\n                // the allowDecimals option\n                if (allowDecimals === false) {\n                    if (magnitude === 1) {\n                        multiples = multiples.filter(function (num) {\n                            return num % 1 === 0;\n                        });\n                    }\n                    else if (magnitude <= 0.1) {\n                        multiples = [1 / magnitude];\n                    }\n                }\n            }\n            // normalize the interval to the nearest multiple\n            for (i = 0; i < multiples.length; i++) {\n                retInterval = multiples[i];\n                // only allow tick amounts smaller than natural\n                if ((hasTickAmount &&\n                    retInterval * magnitude >= interval) ||\n                    (!hasTickAmount &&\n                        (normalized <=\n                            (multiples[i] +\n                                (multiples[i + 1] || multiples[i])) / 2))) {\n                    break;\n                }\n            }\n            // Multiply back to the correct magnitude. Correct floats to appropriate\n            // precision (#6085).\n            retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));\n            return retInterval;\n        };\n        /**\n         * Sort an object array and keep the order of equal items. The ECMAScript\n         * standard does not specify the behaviour when items are equal.\n         *\n         * @function Highcharts.stableSort\n         *\n         * @param {Array<*>} arr\n         *        The array to sort.\n         *\n         * @param {Function} sortFunction\n         *        The function to sort it with, like with regular Array.prototype.sort.\n         *\n         * @return {void}\n         */\n        var stableSort = H.stableSort = function stableSort(arr,\n            sortFunction) {\n                // @todo It seems like Chrome since v70 sorts in a stable way internally,\n                // plus all other browsers do it, so over time we may be able to remove this\n                // function\n                var length = arr.length,\n            sortValue,\n            i;\n            // Add index to each item\n            for (i = 0; i < length; i++) {\n                arr[i].safeI = i; // stable sort index\n            }\n            arr.sort(function (a, b) {\n                sortValue = sortFunction(a, b);\n                return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n            });\n            // Remove index from items\n            for (i = 0; i < length; i++) {\n                delete arr[i].safeI; // stable sort index\n            }\n        };\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.min` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function Highcharts.arrayMin\n         *\n         * @param {Array<*>} data\n         *        An array of numbers.\n         *\n         * @return {number}\n         *         The lowest number.\n         */\n        var arrayMin = H.arrayMin = function arrayMin(data) {\n                var i = data.length,\n            min = data[0];\n            while (i--) {\n                if (data[i] < min) {\n                    min = data[i];\n                }\n            }\n            return min;\n        };\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.max` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function Highcharts.arrayMax\n         *\n         * @param {Array<*>} data\n         *        An array of numbers.\n         *\n         * @return {number}\n         *         The highest number.\n         */\n        var arrayMax = H.arrayMax = function arrayMax(data) {\n                var i = data.length,\n            max = data[0];\n            while (i--) {\n                if (data[i] > max) {\n                    max = data[i];\n                }\n            }\n            return max;\n        };\n        /**\n         * Utility method that destroys any SVGElement instances that are properties on\n         * the given object. It loops all properties and invokes destroy if there is a\n         * destroy method. The property is then delete.\n         *\n         * @function Highcharts.destroyObjectProperties\n         *\n         * @param {*} obj\n         *        The object to destroy properties on.\n         *\n         * @param {*} [except]\n         *        Exception, do not destroy this property, only delete it.\n         *\n         * @return {void}\n         */\n        var destroyObjectProperties = H.destroyObjectProperties =\n                function destroyObjectProperties(obj,\n            except) {\n                    objectEach(obj,\n            function (val,\n            n) {\n                        // If the object is non-null and destroy is defined\n                        if (val && val !== except && val.destroy) {\n                            // Invoke the destroy\n                            val.destroy();\n                    }\n                    // Delete the property from the object.\n                    delete obj[n];\n                });\n            };\n        /**\n         * Discard a HTML element by moving it to the bin and delete.\n         *\n         * @function Highcharts.discardElement\n         *\n         * @param {Highcharts.HTMLDOMElement} element\n         *        The HTML node to discard.\n         *\n         * @return {void}\n         */\n        var discardElement = H.discardElement = function discardElement(element) {\n                var garbageBin = H.garbageBin;\n            // create a garbage bin element, not part of the DOM\n            if (!garbageBin) {\n                garbageBin = createElement('div');\n            }\n            // move the node and empty bin\n            if (element) {\n                garbageBin.appendChild(element);\n            }\n            garbageBin.innerHTML = '';\n        };\n        /**\n         * Fix JS round off float errors.\n         *\n         * @function Highcharts.correctFloat\n         *\n         * @param {number} num\n         *        A float number to fix.\n         *\n         * @param {number} [prec=14]\n         *        The precision.\n         *\n         * @return {number}\n         *         The corrected float number.\n         */\n        var correctFloat = H.correctFloat = function correctFloat(num,\n            prec) {\n                return parseFloat(num.toPrecision(prec || 14));\n        };\n        /**\n         * Set the global animation to either a given value, or fall back to the given\n         * chart's animation option.\n         *\n         * @function Highcharts.setAnimation\n         *\n         * @param {boolean|Highcharts.AnimationOptionsObject|undefined} animation\n         *        The animation object.\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart instance.\n         *\n         * @return {void}\n         *\n         * @todo\n         * This function always relates to a chart, and sets a property on the renderer,\n         * so it should be moved to the SVGRenderer.\n         */\n        var setAnimation = H.setAnimation = function setAnimation(animation,\n            chart) {\n                chart.renderer.globalAnimation = pick(animation,\n            chart.options.chart.animation,\n            true);\n        };\n        /**\n         * Get the animation in object form, where a disabled animation is always\n         * returned as `{ duration: 0 }`.\n         *\n         * @function Highcharts.animObject\n         *\n         * @param {boolean|Highcharts.AnimationOptionsObject} [animation=0]\n         *        An animation setting. Can be an object with duration, complete and\n         *        easing properties, or a boolean to enable or disable.\n         *\n         * @return {Highcharts.AnimationOptionsObject}\n         *         An object with at least a duration property.\n         */\n        var animObject = H.animObject = function animObject(animation) {\n                return isObject(animation) ?\n                    merge(animation) :\n                    { duration: animation ? 500 : 0 };\n        };\n        /**\n         * The time unit lookup\n         *\n         * @ignore\n         */\n        var timeUnits = H.timeUnits = {\n                millisecond: 1,\n                second: 1000,\n                minute: 60000,\n                hour: 3600000,\n                day: 24 * 3600000,\n                week: 7 * 24 * 3600000,\n                month: 28 * 24 * 3600000,\n                year: 364 * 24 * 3600000\n            };\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @sample highcharts/members/highcharts-numberformat/\n         *         Custom number format\n         *\n         * @function Highcharts.numberFormat\n         *\n         * @param {number} number\n         *        The input number to format.\n         *\n         * @param {number} decimals\n         *        The amount of decimals. A value of -1 preserves the amount in the\n         *        input number.\n         *\n         * @param {string} [decimalPoint]\n         *        The decimal point, defaults to the one given in the lang options, or\n         *        a dot.\n         *\n         * @param {string} [thousandsSep]\n         *        The thousands separator, defaults to the one given in the lang\n         *        options, or a space character.\n         *\n         * @return {string}\n         *         The formatted number.\n         */\n        var numberFormat = H.numberFormat = function numberFormat(number,\n            decimals,\n            decimalPoint,\n            thousandsSep) {\n                number = +number || 0;\n            decimals = +decimals;\n            var lang = H.defaultOptions.lang, origDec = (number.toString().split('.')[1] || '').split('e')[0].length, strinteger, thousands, ret, roundedNumber, exponent = number.toString().split('e'), fractionDigits;\n            if (decimals === -1) {\n                // Preserve decimals. Not huge numbers (#3793).\n                decimals = Math.min(origDec, 20);\n            }\n            else if (!isNumber(decimals)) {\n                decimals = 2;\n            }\n            else if (decimals && exponent[1] && exponent[1] < 0) {\n                // Expose decimals from exponential notation (#7042)\n                fractionDigits = decimals + +exponent[1];\n                if (fractionDigits >= 0) {\n                    // remove too small part of the number while keeping the notation\n                    exponent[0] = (+exponent[0]).toExponential(fractionDigits)\n                        .split('e')[0];\n                    decimals = fractionDigits;\n                }\n                else {\n                    // fractionDigits < 0\n                    exponent[0] = exponent[0].split('.')[0] || 0;\n                    if (decimals < 20) {\n                        // use number instead of exponential notation (#7405)\n                        number = (exponent[0] * Math.pow(10, exponent[1]))\n                            .toFixed(decimals);\n                    }\n                    else {\n                        // or zero\n                        number = 0;\n                    }\n                    exponent[1] = 0;\n                }\n            }\n            // Add another decimal to avoid rounding errors of float numbers. (#4573)\n            // Then use toFixed to handle rounding.\n            roundedNumber = (Math.abs(exponent[1] ? exponent[0] : number) +\n                Math.pow(10, -Math.max(decimals, origDec) - 1)).toFixed(decimals);\n            // A string containing the positive integer component of the number\n            strinteger = String(pInt(roundedNumber));\n            // Leftover after grouping into thousands. Can be 0, 1 or 2.\n            thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n            // Language\n            decimalPoint = pick(decimalPoint, lang.decimalPoint);\n            thousandsSep = pick(thousandsSep, lang.thousandsSep);\n            // Start building the return\n            ret = number < 0 ? '-' : '';\n            // Add the leftover after grouping into thousands. For example, in the\n            // number 42 000 000, this line adds 42.\n            ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n            // Add the remaining thousands groups, joined by the thousands separator\n            ret += strinteger\n                .substr(thousands)\n                .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n            // Add the decimal point and the decimal component\n            if (decimals) {\n                // Get the decimal component\n                ret += decimalPoint + roundedNumber.slice(-decimals);\n            }\n            if (exponent[1] && +ret !== 0) {\n                ret += 'e' + exponent[1];\n            }\n            return ret;\n        };\n        /**\n         * Easing definition\n         *\n         * @private\n         * @function Math.easeInOutSine\n         *\n         * @param {number} pos\n         *        Current position, ranging from 0 to 1.\n         *\n         * @return {number}\n         *         Ease result\n         */\n        Math.easeInOutSine = function (pos) {\n            return -0.5 * (Math.cos(Math.PI * pos) - 1);\n        };\n        /**\n         * Returns the value of a property path on a given object.\n         *\n         * @private\n         * @function getNestedProperty\n         *\n         * @param {string} path\n         * Path to the property, for example `custom.myValue`.\n         *\n         * @param {unknown} obj\n         * Instance containing the property on the specific path.\n         *\n         * @return {unknown}\n         * The unknown property value.\n         */\n        function getNestedProperty(path, obj) {\n            if (!path) {\n                return obj;\n            }\n            var pathElements = path.split('.').reverse();\n            var subProperty = obj;\n            if (pathElements.length === 1) {\n                return subProperty[path];\n            }\n            var pathElement = pathElements.pop();\n            while (typeof pathElement !== 'undefined' &&\n                typeof subProperty !== 'undefined' &&\n                subProperty !== null) {\n                subProperty = subProperty[pathElement];\n                pathElement = pathElements.pop();\n            }\n            return subProperty;\n        }\n        /**\n         * Get the computed CSS value for given element and property, only for numerical\n         * properties. For width and height, the dimension of the inner box (excluding\n         * padding) is returned. Used for fitting the chart within the container.\n         *\n         * @function Highcharts.getStyle\n         *\n         * @param {Highcharts.HTMLDOMElement} el\n         *        An HTML element.\n         *\n         * @param {string} prop\n         *        The property name.\n         *\n         * @param {boolean} [toInt=true]\n         *        Parse to integer.\n         *\n         * @return {number|string}\n         *         The numeric value.\n         */\n        var getStyle = H.getStyle = function (el,\n            prop,\n            toInt) {\n                var style;\n            // For width and height, return the actual inner pixel size (#4913)\n            if (prop === 'width') {\n                var offsetWidth = Math.min(el.offsetWidth,\n                    el.scrollWidth);\n                // In flex boxes, we need to use getBoundingClientRect and floor it,\n                // because scrollWidth doesn't support subpixel precision (#6427) ...\n                var boundingClientRectWidth = el.getBoundingClientRect &&\n                        el.getBoundingClientRect().width;\n                // ...unless if the containing div or its parents are transform-scaled\n                // down, in which case the boundingClientRect can't be used as it is\n                // also scaled down (#9871, #10498).\n                if (boundingClientRectWidth < offsetWidth &&\n                    boundingClientRectWidth >= offsetWidth - 1) {\n                    offsetWidth = Math.floor(boundingClientRectWidth);\n                }\n                return Math.max(0, // #8377\n                (offsetWidth -\n                    H.getStyle(el, 'padding-left') -\n                    H.getStyle(el, 'padding-right')));\n            }\n            if (prop === 'height') {\n                return Math.max(0, // #8377\n                Math.min(el.offsetHeight, el.scrollHeight) -\n                    H.getStyle(el, 'padding-top') -\n                    H.getStyle(el, 'padding-bottom'));\n            }\n            if (!win.getComputedStyle) {\n                // SVG not supported, forgot to load oldie.js?\n                error(27, true);\n            }\n            // Otherwise, get the computed style\n            style = win.getComputedStyle(el, undefined); // eslint-disable-line no-undefined\n            if (style) {\n                style = style.getPropertyValue(prop);\n                if (pick(toInt, prop !== 'opacity')) {\n                    style = pInt(style);\n                }\n            }\n            return style;\n        };\n        /**\n         * Search for an item in an array.\n         *\n         * @function Highcharts.inArray\n         *\n         * @deprecated\n         *\n         * @param {*} item\n         *        The item to search for.\n         *\n         * @param {Array<*>} arr\n         *        The array or node collection to search in.\n         *\n         * @param {number} [fromIndex=0]\n         *        The index to start searching from.\n         *\n         * @return {number}\n         *         The index within the array, or -1 if not found.\n         */\n        var inArray = H.inArray = function (item,\n            arr,\n            fromIndex) {\n                error(32,\n            false,\n            void 0, { 'Highcharts.inArray': 'use Array.indexOf' });\n            return arr.indexOf(item, fromIndex);\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Return the value of the first element in the array that satisfies the\n         * provided testing function.\n         *\n         * @function Highcharts.find<T>\n         *\n         * @param {Array<T>} arr\n         *        The array to test.\n         *\n         * @param {Function} callback\n         *        The callback function. The function receives the item as the first\n         *        argument. Return `true` if this item satisfies the condition.\n         *\n         * @return {T|undefined}\n         *         The value of the element.\n         */\n        var find = H.find = Array.prototype.find ?\n                /* eslint-enable valid-jsdoc */\n                function (arr,\n            callback) {\n                    return arr.find(callback);\n            } :\n            // Legacy implementation. PhantomJS, IE <= 11 etc. #7223.\n            function (arr, callback) {\n                var i,\n                    length = arr.length;\n                for (i = 0; i < length; i++) {\n                    if (callback(arr[i], i)) { // eslint-disable-line callback-return\n                        return arr[i];\n                    }\n                }\n            };\n        /**\n         * Returns an array of a given object's own properties.\n         *\n         * @function Highcharts.keys\n         * @deprecated\n         *\n         * @param {*} obj\n         *        The object of which the properties are to be returned.\n         *\n         * @return {Array<string>}\n         *         An array of strings that represents all the properties.\n         */\n        H.keys = function (obj) {\n            error(32, false, void 0, { 'Highcharts.keys': 'use Object.keys' });\n            return Object.keys(obj);\n        };\n        /**\n         * Get the element's offset position, corrected for `overflow: auto`.\n         *\n         * @function Highcharts.offset\n         *\n         * @param {global.Element} el\n         *        The DOM element.\n         *\n         * @return {Highcharts.OffsetObject}\n         *         An object containing `left` and `top` properties for the position in\n         *         the page.\n         */\n        var offset = H.offset = function offset(el) {\n                var docElem = doc.documentElement,\n            box = (el.parentElement || el.parentNode) ?\n                    el.getBoundingClientRect() :\n                    { top: 0,\n            left: 0 };\n            return {\n                top: box.top + (win.pageYOffset || docElem.scrollTop) -\n                    (docElem.clientTop || 0),\n                left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n                    (docElem.clientLeft || 0)\n            };\n        };\n        /**\n         * Stop running animation.\n         *\n         * @function Highcharts.stop\n         *\n         * @param {Highcharts.SVGElement} el\n         *        The SVGElement to stop animation on.\n         *\n         * @param {string} [prop]\n         *        The property to stop animating. If given, the stop method will stop a\n         *        single property from animating, while others continue.\n         *\n         * @return {void}\n         *\n         * @todo\n         * A possible extension to this would be to stop a single property, when\n         * we want to continue animating others. Then assign the prop to the timer\n         * in the Fx.run method, and check for the prop here. This would be an\n         * improvement in all cases where we stop the animation from .attr. Instead of\n         * stopping everything, we can just stop the actual attributes we're setting.\n         */\n        var stop = H.stop = function (el,\n            prop) {\n                var i = H.timers.length;\n            // Remove timers related to this element (#4519)\n            while (i--) {\n                if (H.timers[i].elem === el && (!prop || prop === H.timers[i].prop)) {\n                    H.timers[i].stopped = true; // #4667\n                }\n            }\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Iterate over object key pairs in an object.\n         *\n         * @function Highcharts.objectEach<T>\n         *\n         * @param {*} obj\n         *        The object to iterate over.\n         *\n         * @param {Highcharts.ObjectEachCallbackFunction<T>} fn\n         *        The iterator callback. It passes three arguments:\n         *        * value - The property value.\n         *        * key - The property key.\n         *        * obj - The object that objectEach is being applied to.\n         *\n         * @param {T} [ctx]\n         *        The context.\n         *\n         * @return {void}\n         */\n        var objectEach = H.objectEach = function objectEach(obj,\n            fn,\n            ctx) {\n                /* eslint-enable valid-jsdoc */\n                for (var key in obj) {\n                    if (Object.hasOwnProperty.call(obj,\n            key)) {\n                        fn.call(ctx || obj[key],\n            obj[key],\n            key,\n            obj);\n                }\n            }\n        };\n        /**\n         * Iterate over an array.\n         *\n         * @deprecated\n         * @function Highcharts.each\n         *\n         * @param {Array<*>} arr\n         *        The array to iterate over.\n         *\n         * @param {Function} fn\n         *        The iterator callback. It passes three arguments:\n         *        - `item`: The array item.\n         *        - `index`: The item's index in the array.\n         *        - `arr`: The array that each is being applied to.\n         *\n         * @param {*} [ctx]\n         *        The context.\n         *\n         * @return {void}\n         */\n        /**\n         * Filter an array by a callback.\n         *\n         * @deprecated\n         * @function Highcharts.grep\n         *\n         * @param {Array<*>} arr\n         *        The array to filter.\n         *\n         * @param {Function} callback\n         *        The callback function. The function receives the item as the first\n         *        argument. Return `true` if the item is to be preserved.\n         *\n         * @return {Array<*>}\n         *         A new, filtered array.\n         */\n        /**\n         * Map an array by a callback.\n         *\n         * @deprecated\n         * @function Highcharts.map\n         *\n         * @param {Array<*>} arr\n         *        The array to map.\n         *\n         * @param {Function} fn\n         *        The callback function. Return the new value for the new array.\n         *\n         * @return {Array<*>}\n         *         A new array item with modified items.\n         */\n        /**\n         * Reduce an array to a single value.\n         *\n         * @deprecated\n         * @function Highcharts.reduce\n         *\n         * @param {Array<*>} arr\n         *        The array to reduce.\n         *\n         * @param {Function} fn\n         *        The callback function. Return the reduced value. Receives 4\n         *        arguments: Accumulated/reduced value, current value, current array\n         *        index, and the array.\n         *\n         * @param {*} initialValue\n         *        The initial value of the accumulator.\n         *\n         * @return {*}\n         *         The reduced value.\n         */\n        /**\n         * Test whether at least one element in the array passes the test implemented by\n         * the provided function.\n         *\n         * @deprecated\n         * @function Highcharts.some\n         *\n         * @param {Array<*>} arr\n         *        The array to test\n         *\n         * @param {Function} fn\n         *        The function to run on each item. Return truty to pass the test.\n         *        Receives arguments `currentValue`, `index` and `array`.\n         *\n         * @param {*} ctx\n         *        The context.\n         *\n         * @return {boolean}\n         */\n        objectEach({\n            map: 'map',\n            each: 'forEach',\n            grep: 'filter',\n            reduce: 'reduce',\n            some: 'some'\n        }, function (val, key) {\n            H[key] = function (arr) {\n                var _a;\n                error(32, false, void 0, (_a = {}, _a[\"Highcharts.\" + key] = \"use Array.\" + val, _a));\n                return Array.prototype[val].apply(arr, [].slice.call(arguments, 1));\n            };\n        });\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Add an event listener.\n         *\n         * @function Highcharts.addEvent<T>\n         *\n         * @param {Highcharts.Class<T>|T} el\n         *        The element or object to add a listener to. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         *\n         * @param {string} type\n         *        The event type.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>|Function} fn\n         *        The function callback to execute when the event is fired.\n         *\n         * @param {Highcharts.EventOptionsObject} [options]\n         *        Options for adding the event.\n         *\n         * @return {Function}\n         *         A callback function to remove the added event.\n         */\n        var addEvent = H.addEvent = function (el,\n            type,\n            fn,\n            options) {\n                if (options === void 0) { options = {}; }\n                /* eslint-enable valid-jsdoc */\n                var events,\n            addEventListener = (el.addEventListener || H.addEventListenerPolyfill);\n            // If we're setting events directly on the constructor, use a separate\n            // collection, `protoEvents` to distinguish it from the item events in\n            // `hcEvents`.\n            if (typeof el === 'function' && el.prototype) {\n                events = el.prototype.protoEvents = el.prototype.protoEvents || {};\n            }\n            else {\n                events = el.hcEvents = el.hcEvents || {};\n            }\n            // Allow click events added to points, otherwise they will be prevented by\n            // the TouchPointer.pinch function after a pinch zoom operation (#7091).\n            if (H.Point &&\n                el instanceof H.Point &&\n                el.series &&\n                el.series.chart) {\n                el.series.chart.runTrackerClick = true;\n            }\n            // Handle DOM events\n            if (addEventListener) {\n                addEventListener.call(el, type, fn, false);\n            }\n            if (!events[type]) {\n                events[type] = [];\n            }\n            var eventObject = {\n                    fn: fn,\n                    order: typeof options.order === 'number' ? options.order : Infinity\n                };\n            events[type].push(eventObject);\n            // Order the calls\n            events[type].sort(function (a, b) {\n                return a.order - b.order;\n            });\n            // Return a function that can be called to remove this event.\n            return function () {\n                removeEvent(el, type, fn);\n            };\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Remove an event that was added with {@link Highcharts#addEvent}.\n         *\n         * @function Highcharts.removeEvent<T>\n         *\n         * @param {Highcharts.Class<T>|T} el\n         *        The element to remove events on.\n         *\n         * @param {string} [type]\n         *        The type of events to remove. If undefined, all events are removed\n         *        from the element.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>} [fn]\n         *        The specific callback to remove. If undefined, all events that match\n         *        the element and optionally the type are removed.\n         *\n         * @return {void}\n         */\n        var removeEvent = H.removeEvent = function removeEvent(el,\n            type,\n            fn) {\n                /* eslint-enable valid-jsdoc */\n                var events;\n            /**\n             * @private\n             * @param {string} type - event type\n             * @param {Highcharts.EventCallbackFunction<T>} fn - callback\n             * @return {void}\n             */\n            function removeOneEvent(type, fn) {\n                var removeEventListener = (el.removeEventListener || H.removeEventListenerPolyfill);\n                if (removeEventListener) {\n                    removeEventListener.call(el, type, fn, false);\n                }\n            }\n            /**\n             * @private\n             * @param {any} eventCollection - collection\n             * @return {void}\n             */\n            function removeAllEvents(eventCollection) {\n                var types,\n                    len;\n                if (!el.nodeName) {\n                    return; // break on non-DOM events\n                }\n                if (type) {\n                    types = {};\n                    types[type] = true;\n                }\n                else {\n                    types = eventCollection;\n                }\n                objectEach(types, function (_val, n) {\n                    if (eventCollection[n]) {\n                        len = eventCollection[n].length;\n                        while (len--) {\n                            removeOneEvent(n, eventCollection[n][len].fn);\n                        }\n                    }\n                });\n            }\n            ['protoEvents', 'hcEvents'].forEach(function (coll, i) {\n                var eventElem = i ? el : el.prototype;\n                var eventCollection = eventElem && eventElem[coll];\n                if (eventCollection) {\n                    if (type) {\n                        events = (eventCollection[type] || []);\n                        if (fn) {\n                            eventCollection[type] = events.filter(function (obj) {\n                                return fn !== obj.fn;\n                            });\n                            removeOneEvent(type, fn);\n                        }\n                        else {\n                            removeAllEvents(eventCollection);\n                            eventCollection[type] = [];\n                        }\n                    }\n                    else {\n                        removeAllEvents(eventCollection);\n                        eventElem[coll] = {};\n                    }\n                }\n            });\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Fire an event that was registered with {@link Highcharts#addEvent}.\n         *\n         * @function Highcharts.fireEvent<T>\n         *\n         * @param {T} el\n         *        The object to fire the event on. It can be a {@link HTMLDOMElement},\n         *        an {@link SVGElement} or any other object.\n         *\n         * @param {string} type\n         *        The type of event.\n         *\n         * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n         *        Custom event arguments that are passed on as an argument to the event\n         *        handler.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>|Function} [defaultFunction]\n         *        The default function to execute if the other listeners haven't\n         *        returned false.\n         *\n         * @return {void}\n         */\n        var fireEvent = H.fireEvent = function (el,\n            type,\n            eventArguments,\n            defaultFunction) {\n                /* eslint-enable valid-jsdoc */\n                var e,\n            i;\n            eventArguments = eventArguments || {};\n            if (doc.createEvent &&\n                (el.dispatchEvent || el.fireEvent)) {\n                e = doc.createEvent('Events');\n                e.initEvent(type, true, true);\n                extend(e, eventArguments);\n                if (el.dispatchEvent) {\n                    el.dispatchEvent(e);\n                }\n                else {\n                    el.fireEvent(type, e);\n                }\n            }\n            else {\n                if (!eventArguments.target) {\n                    // We're running a custom event\n                    extend(eventArguments, {\n                        // Attach a simple preventDefault function to skip\n                        // default handler if called. The built-in\n                        // defaultPrevented property is not overwritable (#5112)\n                        preventDefault: function () {\n                            eventArguments.defaultPrevented = true;\n                        },\n                        // Setting target to native events fails with clicking\n                        // the zoom-out button in Chrome.\n                        target: el,\n                        // If the type is not set, we're running a custom event\n                        // (#2297). If it is set, we're running a browser event,\n                        // and setting it will cause en error in IE8 (#2465).\n                        type: type\n                    });\n                }\n                var fireInOrder = function (protoEvents,\n                    hcEvents) {\n                        if (protoEvents === void 0) { protoEvents = []; }\n                        if (hcEvents === void 0) { hcEvents = []; }\n                        var iA = 0;\n                    var iB = 0;\n                    var length = protoEvents.length + hcEvents.length;\n                    for (i = 0; i < length; i++) {\n                        var obj = (!protoEvents[iA] ?\n                                hcEvents[iB++] :\n                                !hcEvents[iB] ?\n                                    protoEvents[iA++] :\n                                    protoEvents[iA].order <= hcEvents[iB].order ?\n                                        protoEvents[iA++] :\n                                        hcEvents[iB++]);\n                        // If the event handler return false, prevent the default\n                        // handler from executing\n                        if (obj.fn.call(el, eventArguments) === false) {\n                            eventArguments.preventDefault();\n                        }\n                    }\n                };\n                fireInOrder(el.protoEvents && el.protoEvents[type], el.hcEvents && el.hcEvents[type]);\n            }\n            // Run the default if not prevented\n            if (defaultFunction && !eventArguments.defaultPrevented) {\n                defaultFunction.call(el, eventArguments);\n            }\n        };\n        /**\n         * The global animate method, which uses Fx to create individual animators.\n         *\n         * @function Highcharts.animate\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} el\n         *        The element to animate.\n         *\n         * @param {Highcharts.CSSObject|Highcharts.SVGAttributes} params\n         *        An object containing key-value pairs of the properties to animate.\n         *        Supports numeric as pixel-based CSS properties for HTML objects and\n         *        attributes for SVGElements.\n         *\n         * @param {Highcharts.AnimationOptionsObject} [opt]\n         *        Animation options.\n         *\n         * @return {void}\n         */\n        var animate = H.animate = function (el,\n            params,\n            opt) {\n                var start,\n            unit = '',\n            end,\n            fx,\n            args;\n            if (!isObject(opt)) { // Number or undefined/null\n                args = arguments;\n                opt = {\n                    duration: args[2],\n                    easing: args[3],\n                    complete: args[4]\n                };\n            }\n            if (!isNumber(opt.duration)) {\n                opt.duration = 400;\n            }\n            opt.easing = typeof opt.easing === 'function' ?\n                opt.easing :\n                (Math[opt.easing] || Math.easeInOutSine);\n            opt.curAnim = merge(params);\n            objectEach(params, function (val, prop) {\n                // Stop current running animation of this property\n                stop(el, prop);\n                fx = new Fx(el, opt, prop);\n                end = null;\n                if (prop === 'd' && isArray(params.d)) {\n                    fx.paths = fx.initPath(el, el.pathArray, params.d);\n                    fx.toD = params.d;\n                    start = 0;\n                    end = 1;\n                }\n                else if (el.attr) {\n                    start = el.attr(prop);\n                }\n                else {\n                    start = parseFloat(getStyle(el, prop)) || 0;\n                    if (prop !== 'opacity') {\n                        unit = 'px';\n                    }\n                }\n                if (!end) {\n                    end = val;\n                }\n                if (end && end.match && end.match('px')) {\n                    end = end.replace(/px/g, ''); // #4351\n                }\n                fx.run(start, end, unit);\n            });\n        };\n        /**\n         * Factory to create new series prototypes.\n         *\n         * @function Highcharts.seriesType\n         *\n         * @param {string} type\n         *        The series type name.\n         *\n         * @param {string} parent\n         *        The parent series type name. Use `line` to inherit from the basic\n         *        {@link Series} object.\n         *\n         * @param {Highcharts.SeriesOptionsType|Highcharts.Dictionary<*>} options\n         *        The additional default options that are merged with the parent's\n         *        options.\n         *\n         * @param {Highcharts.Dictionary<*>} [props]\n         *        The properties (functions and primitives) to set on the new\n         *        prototype.\n         *\n         * @param {Highcharts.Dictionary<*>} [pointProps]\n         *        Members for a series-specific extension of the {@link Point}\n         *        prototype if needed.\n         *\n         * @return {Highcharts.Series}\n         *         The newly created prototype as extended from {@link Series} or its\n         *         derivatives.\n         */\n        // docs: add to API + extending Highcharts\n        var seriesType = H.seriesType = function (type,\n            parent,\n            options,\n            props,\n            pointProps) {\n                var defaultOptions = getOptions(),\n            seriesTypes = H.seriesTypes;\n            // Merge the options\n            defaultOptions.plotOptions[type] = merge(defaultOptions.plotOptions[parent], options);\n            // Create the class\n            seriesTypes[type] = extendClass(seriesTypes[parent] || function () { }, props);\n            seriesTypes[type].prototype.type = type;\n            // Create the point class if needed\n            if (pointProps) {\n                seriesTypes[type].prototype.pointClass =\n                    extendClass(H.Point, pointProps);\n            }\n            return seriesTypes[type];\n        };\n        var serialMode;\n        /**\n         * Get a unique key for using in internal element id's and pointers. The key is\n         * composed of a random hash specific to this Highcharts instance, and a\n         * counter.\n         *\n         * @example\n         * var id = uniqueKey(); // => 'highcharts-x45f6hp-0'\n         *\n         * @function Highcharts.uniqueKey\n         *\n         * @return {string}\n         * A unique key.\n         */\n        var uniqueKey = H.uniqueKey = (function () {\n                var hash = Math.random().toString(36).substring(2, 9) + '-';\n            var id = 0;\n            return function () {\n                return 'highcharts-' + (serialMode ? '' : hash) + id++;\n            };\n        }());\n        /**\n         * Activates a serial mode for element IDs provided by\n         * {@link Highcharts.uniqueKey}. This mode can be used in automated tests, where\n         * a simple comparison of two rendered SVG graphics is needed.\n         *\n         * **Note:** This is only for testing purposes and will break functionality in\n         * webpages with multiple charts.\n         *\n         * @example\n         * if (\n         *   process &&\n         *   process.env.NODE_ENV === 'development'\n         * ) {\n         *   Highcharts.useSerialIds(true);\n         * }\n         *\n         * @function Highcharts.useSerialIds\n         *\n         * @param {boolean} [mode]\n         * Changes the state of serial mode.\n         *\n         * @return {boolean|undefined}\n         * State of the serial mode.\n         */\n        var useSerialIds = H.useSerialIds = function (mode) {\n                return (serialMode = pick(mode,\n            serialMode));\n        };\n        var isFunction = H.isFunction = function (obj) {\n                return typeof obj === 'function';\n        };\n        /**\n         * Get the updated default options. Until 3.0.7, merely exposing defaultOptions\n         * for outside modules wasn't enough because the setOptions method created a new\n         * object.\n         *\n         * @function Highcharts.getOptions\n         *\n         * @return {Highcharts.Options}\n         */\n        var getOptions = H.getOptions = function () {\n                return H.defaultOptions;\n        };\n        /**\n         * Merge the default options with custom options and return the new options\n         * structure. Commonly used for defining reusable templates.\n         *\n         * @sample highcharts/global/useutc-false Setting a global option\n         * @sample highcharts/members/setoptions Applying a global theme\n         *\n         * @function Highcharts.setOptions\n         *\n         * @param {Highcharts.Options} options\n         *        The new custom chart options.\n         *\n         * @return {Highcharts.Options}\n         *         Updated options.\n         */\n        var setOptions = H.setOptions = function (options) {\n                // Copy in the default options\n                H.defaultOptions = merge(true,\n            H.defaultOptions,\n            options);\n            // Update the time object\n            if (options.time || options.global) {\n                H.time.update(merge(H.defaultOptions.global, H.defaultOptions.time, options.global, options.time));\n            }\n            return H.defaultOptions;\n        };\n        // Register Highcharts as a plugin in jQuery\n        if (win.jQuery) {\n            /**\n             * Highcharts-extended JQuery.\n             *\n             * @external JQuery\n             */\n            /**\n             * Helper function to return the chart of the current JQuery selector\n             * element.\n             *\n             * @function external:JQuery#highcharts\n             *\n             * @return {Highcharts.Chart}\n             *         The chart that is linked to the JQuery selector element.\n             */ /**\n            * Factory function to create a chart in the current JQuery selector\n            * element.\n            *\n            * @function external:JQuery#highcharts\n            *\n            * @param {'Chart'|'Map'|'StockChart'|string} [className]\n            *        Name of the factory class in the Highcharts namespace.\n            *\n            * @param {Highcharts.Options} [options]\n            *        The chart options structure.\n            *\n            * @param {Highcharts.ChartCallbackFunction} [callback]\n            *        Function to run when the chart has loaded and and all external\n            *        images are loaded. Defining a\n            *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n            *        handler is equivalent.\n            *\n            * @return {JQuery}\n            *         The current JQuery selector.\n            */\n            win.jQuery.fn.highcharts = function () {\n                var args = [].slice.call(arguments);\n                if (this[0]) { // this[0] is the renderTo div\n                    // Create the chart\n                    if (args[0]) {\n                        new H[ // eslint-disable-line computed-property-spacing, no-new\n                        // Constructor defaults to Chart\n                        isString(args[0]) ? args.shift() : 'Chart'](this[0], args[0], args[1]);\n                        return this;\n                    }\n                    // When called without parameters or with the return argument,\n                    // return an existing chart\n                    return charts[attr(this[0], 'data-highcharts-chart')];\n                }\n            };\n        }\n        // TODO use named exports when supported.\n        var utilitiesModule = {\n                Fx: H.Fx,\n                addEvent: addEvent,\n                animate: animate,\n                animObject: animObject,\n                arrayMax: arrayMax,\n                arrayMin: arrayMin,\n                attr: attr,\n                clamp: clamp,\n                clearTimeout: internalClearTimeout,\n                correctFloat: correctFloat,\n                createElement: createElement,\n                css: css,\n                defined: defined,\n                destroyObjectProperties: destroyObjectProperties,\n                discardElement: discardElement,\n                erase: erase,\n                error: error,\n                extend: extend,\n                extendClass: extendClass,\n                find: find,\n                fireEvent: fireEvent,\n                format: format,\n                getMagnitude: getMagnitude,\n                getNestedProperty: getNestedProperty,\n                getOptions: getOptions,\n                getStyle: getStyle,\n                inArray: inArray,\n                isArray: isArray,\n                isClass: isClass,\n                isDOMElement: isDOMElement,\n                isFunction: isFunction,\n                isNumber: isNumber,\n                isObject: isObject,\n                isString: isString,\n                merge: merge,\n                normalizeTickInterval: normalizeTickInterval,\n                numberFormat: numberFormat,\n                objectEach: objectEach,\n                offset: offset,\n                pad: pad,\n                pick: pick,\n                pInt: pInt,\n                relativeLength: relativeLength,\n                removeEvent: removeEvent,\n                seriesType: seriesType,\n                setAnimation: setAnimation,\n                setOptions: setOptions,\n                splat: splat,\n                stableSort: stableSort,\n                stop: stop,\n                syncTimeout: syncTimeout,\n                timeUnits: timeUnits,\n                uniqueKey: uniqueKey,\n                useSerialIds: useSerialIds,\n                wrap: wrap\n            };\n\n        return utilitiesModule;\n    });\n    _registerModule(_modules, 'parts/Color.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * A valid color to be parsed and handled by Highcharts. Highcharts internally\n         * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n         * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n         * browsers and displayed correctly, but Highcharts is not able to process them\n         * and apply concepts like opacity and brightening.\n         *\n         * @typedef {string} Highcharts.ColorString\n         */\n        /**\n         * A valid color type than can be parsed and handled by Highcharts. It can be a\n         * color string, a gradient object, or a pattern object.\n         *\n         * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType\n         */\n        /**\n         * Gradient options instead of a solid color.\n         *\n         * @example\n         * // Linear gradient used as a color option\n         * color: {\n         *     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n         *     stops: [\n         *         [0, '#003399'], // start\n         *         [0.5, '#ffffff'], // middle\n         *         [1, '#3366AA'] // end\n         *     ]\n         * }\n         *\n         * @interface Highcharts.GradientColorObject\n         */ /**\n        * Holds an object that defines the start position and the end position relative\n        * to the shape.\n        * @name Highcharts.GradientColorObject#linearGradient\n        * @type {Highcharts.LinearGradientColorObject|undefined}\n        */ /**\n        * Holds an object that defines the center position and the radius.\n        * @name Highcharts.GradientColorObject#radialGradient\n        * @type {Highcharts.RadialGradientColorObject|undefined}\n        */ /**\n        * The first item in each tuple is the position in the gradient, where 0 is the\n        * start of the gradient and 1 is the end of the gradient. Multiple stops can be\n        * applied. The second item is the color for each stop. This color can also be\n        * given in the rgba format.\n        * @name Highcharts.GradientColorObject#stops\n        * @type {Array<Highcharts.GradientColorStopObject>}\n        */\n        /**\n         * Color stop tuple.\n         *\n         * @see Highcharts.GradientColorObject\n         *\n         * @interface Highcharts.GradientColorStopObject\n         */ /**\n        * @name Highcharts.GradientColorStopObject#0\n        * @type {number}\n        */ /**\n        * @name Highcharts.GradientColorStopObject#1\n        * @type {Highcharts.ColorString}\n        */ /**\n        * @name Highcharts.GradoentColorStopObject#color\n        * @type {Highcharts.Color|undefined}\n        */\n        /**\n         * Defines the start position and the end position for a gradient relative\n         * to the shape. Start position (x1, y1) and end position (x2, y2) are relative\n         * to the shape, where 0 means top/left and 1 is bottom/right.\n         *\n         * @interface Highcharts.LinearGradientColorObject\n         */ /**\n        * Start horizontal position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#x1\n        * @type {number}\n        */ /**\n        * End horizontal position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#x2\n        * @type {number}\n        */ /**\n        * Start vertical position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#y1\n        * @type {number}\n        */ /**\n        * End vertical position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#y2\n        * @type {number}\n        */\n        /**\n         * Defines the center position and the radius for a gradient.\n         *\n         * @interface Highcharts.RadialGradientColorObject\n         */ /**\n        * Center horizontal position relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#cx\n        * @type {number}\n        */ /**\n        * Center vertical position relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#cy\n        * @type {number}\n        */ /**\n        * Radius relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#r\n        * @type {number}\n        */\n        var isNumber = U.isNumber,\n            merge = U.merge,\n            pInt = U.pInt;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handle color operations. Some object methods are chainable.\n         *\n         * @class\n         * @name Highcharts.Color\n         *\n         * @param {Highcharts.ColorType} input\n         * The input color in either rbga or hex format\n         */\n        var Color = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Color(input) {\n                    // Collection of parsers. This can be extended from the outside by pushing\n                    // parsers to Highcharts.Color.prototype.parsers.\n                    this.parsers = [{\n                            // RGBA color\n                            // eslint-disable-next-line max-len\n                            regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n                            parse: function (result) {\n                                return [\n                                    pInt(result[1]),\n                                    pInt(result[2]),\n                                    pInt(result[3]),\n                                    parseFloat(result[4], 10)\n                                ];\n                        }\n                    }, {\n                        // RGB color\n                        regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n                        parse: function (result) {\n                            return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n                        }\n                    }];\n                this.rgba = [];\n                // Backwards compatibility, allow instanciation without new (#13053)\n                if (!(this instanceof Color)) {\n                    return new Color(input);\n                }\n                this.init(input);\n            }\n            /* *\n             *\n             *  Static Functions\n             *\n             * */\n            /**\n             * Creates a color instance out of a color string or object.\n             *\n             * @function Highcharts.Color.parse\n             *\n             * @param {Highcharts.ColorType} input\n             * The input color in either rbga or hex format.\n             *\n             * @return {Highcharts.Color}\n             * Color instance.\n             */\n            Color.parse = function (input) {\n                return new Color(input);\n            };\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Parse the input color to rgba array\n             *\n             * @private\n             * @function Highcharts.Color#init\n             *\n             * @param {Highcharts.ColorType} input\n             *        The input color in either rbga or hex format\n             *\n             * @return {void}\n             */\n            Color.prototype.init = function (input) {\n                var result,\n                    rgba,\n                    i,\n                    parser,\n                    len;\n                this.input = input = Color.names[input && input.toLowerCase ?\n                    input.toLowerCase() :\n                    ''] || input;\n                // Gradients\n                if (input && input.stops) {\n                    this.stops = input.stops.map(function (stop) {\n                        return new Color(stop[1]);\n                    });\n                    // Solid colors\n                }\n                else {\n                    // Bitmasking as input[0] is not working for legacy IE.\n                    if (input &&\n                        input.charAt &&\n                        input.charAt() === '#') {\n                        len = input.length;\n                        input = parseInt(input.substr(1), 16);\n                        // Handle long-form, e.g. #AABBCC\n                        if (len === 7) {\n                            rgba = [\n                                (input & 0xFF0000) >> 16,\n                                (input & 0xFF00) >> 8,\n                                (input & 0xFF),\n                                1\n                            ];\n                            // Handle short-form, e.g. #ABC\n                            // In short form, the value is assumed to be the same\n                            // for both nibbles for each component. e.g. #ABC = #AABBCC\n                        }\n                        else if (len === 4) {\n                            rgba = [\n                                (((input & 0xF00) >> 4) |\n                                    (input & 0xF00) >> 8),\n                                (((input & 0xF0) >> 4) |\n                                    (input & 0xF0)),\n                                ((input & 0xF) << 4) | (input & 0xF),\n                                1\n                            ];\n                        }\n                    }\n                    // Otherwise, check regex parsers\n                    if (!rgba) {\n                        i = this.parsers.length;\n                        while (i-- && !rgba) {\n                            parser = this.parsers[i];\n                            result = parser.regex.exec(input);\n                            if (result) {\n                                rgba = parser.parse(result);\n                            }\n                        }\n                    }\n                }\n                this.rgba = rgba || [];\n            };\n            /**\n             * Return the color or gradient stops in the specified format\n             *\n             * @function Highcharts.Color#get\n             *\n             * @param {string} [format]\n             *        Possible values are 'a', 'rgb', 'rgba' (default).\n             *\n             * @return {Highcharts.ColorType}\n             *         This color as a string or gradient stops.\n             */\n            Color.prototype.get = function (format) {\n                var input = this.input,\n                    rgba = this.rgba,\n                    ret;\n                if (typeof this.stops !== 'undefined') {\n                    ret = merge(input);\n                    ret.stops = [].concat(ret.stops);\n                    this.stops.forEach(function (stop, i) {\n                        ret.stops[i] = [\n                            ret.stops[i][0],\n                            stop.get(format)\n                        ];\n                    });\n                    // it's NaN if gradient colors on a column chart\n                }\n                else if (rgba && isNumber(rgba[0])) {\n                    if (format === 'rgb' || (!format && rgba[3] === 1)) {\n                        ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n                    }\n                    else if (format === 'a') {\n                        ret = rgba[3];\n                    }\n                    else {\n                        ret = 'rgba(' + rgba.join(',') + ')';\n                    }\n                }\n                else {\n                    ret = input;\n                }\n                return ret;\n            };\n            /**\n             * Brighten the color instance.\n             *\n             * @function Highcharts.Color#brighten\n             *\n             * @param {number} alpha\n             *        The alpha value.\n             *\n             * @return {Highcharts.Color}\n             *         This color with modifications.\n             */\n            Color.prototype.brighten = function (alpha) {\n                var i,\n                    rgba = this.rgba;\n                if (this.stops) {\n                    this.stops.forEach(function (stop) {\n                        stop.brighten(alpha);\n                    });\n                }\n                else if (isNumber(alpha) && alpha !== 0) {\n                    for (i = 0; i < 3; i++) {\n                        rgba[i] += pInt(alpha * 255);\n                        if (rgba[i] < 0) {\n                            rgba[i] = 0;\n                        }\n                        if (rgba[i] > 255) {\n                            rgba[i] = 255;\n                        }\n                    }\n                }\n                return this;\n            };\n            /**\n             * Set the color's opacity to a given alpha value.\n             *\n             * @function Highcharts.Color#setOpacity\n             *\n             * @param {number} alpha\n             *        Opacity between 0 and 1.\n             *\n             * @return {Highcharts.Color}\n             *         Color with modifications.\n             */\n            Color.prototype.setOpacity = function (alpha) {\n                this.rgba[3] = alpha;\n                return this;\n            };\n            /**\n             * Return an intermediate color between two colors.\n             *\n             * @function Highcharts.Color#tweenTo\n             *\n             * @param {Highcharts.Color} to\n             *        The color object to tween to.\n             *\n             * @param {number} pos\n             *        The intermediate position, where 0 is the from color (current\n             *        color item), and 1 is the `to` color.\n             *\n             * @return {Highcharts.ColorString}\n             *         The intermediate color in rgba notation.\n             */\n            Color.prototype.tweenTo = function (to, pos) {\n                // Check for has alpha, because rgba colors perform worse due to lack of\n                // support in WebKit.\n                var fromRgba = this.rgba,\n                    toRgba = to.rgba,\n                    hasAlpha,\n                    ret;\n                // Unsupported color, return to-color (#3920, #7034)\n                if (!toRgba.length || !fromRgba || !fromRgba.length) {\n                    ret = to.input || 'none';\n                    // Interpolate\n                }\n                else {\n                    hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1);\n                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +\n                        Math.round(toRgba[0] + (fromRgba[0] - toRgba[0]) * (1 - pos)) +\n                        ',' +\n                        Math.round(toRgba[1] + (fromRgba[1] - toRgba[1]) * (1 - pos)) +\n                        ',' +\n                        Math.round(toRgba[2] + (fromRgba[2] - toRgba[2]) * (1 - pos)) +\n                        (hasAlpha ?\n                            (',' +\n                                (toRgba[3] + (fromRgba[3] - toRgba[3]) * (1 - pos))) :\n                            '') +\n                        ')';\n                }\n                return ret;\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            // Collection of named colors. Can be extended from the outside by adding\n            // colors to Highcharts.Color.names.\n            Color.names = {\n                white: '#ffffff',\n                black: '#000000'\n            };\n            return Color;\n        }());\n        H.Color = Color;\n        /**\n         * Creates a color instance out of a color string.\n         *\n         * @function Highcharts.color\n         *\n         * @param {Highcharts.ColorType} input\n         *        The input color in either rbga or hex format\n         *\n         * @return {Highcharts.Color}\n         *         Color instance\n         */\n        H.color = Color.parse;\n\n        return H.Color;\n    });\n    _registerModule(_modules, 'parts/SVGElement.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Color, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var deg2rad = H.deg2rad,\n            doc = H.doc,\n            hasTouch = H.hasTouch,\n            isFirefox = H.isFirefox,\n            noop = H.noop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            win = H.win;\n        var animate = U.animate,\n            animObject = U.animObject,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            inArray = U.inArray,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            stop = U.stop,\n            uniqueKey = U.uniqueKey;\n        /**\n         * The horizontal alignment of an element.\n         *\n         * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n         */\n        /**\n         * Options to align the element relative to the chart or another box.\n         *\n         * @interface Highcharts.AlignObject\n         */ /**\n        * Horizontal alignment. Can be one of `left`, `center` and `right`.\n        *\n        * @name Highcharts.AlignObject#align\n        * @type {Highcharts.AlignValue|undefined}\n        *\n        * @default left\n        */ /**\n        * Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n        *\n        * @name Highcharts.AlignObject#verticalAlign\n        * @type {Highcharts.VerticalAlignValue|undefined}\n        *\n        * @default top\n        */ /**\n        * Horizontal pixel offset from alignment.\n        *\n        * @name Highcharts.AlignObject#x\n        * @type {number|undefined}\n        *\n        * @default 0\n        */ /**\n        * Vertical pixel offset from alignment.\n        *\n        * @name Highcharts.AlignObject#y\n        * @type {number|undefined}\n        *\n        * @default 0\n        */ /**\n        * Use the `transform` attribute with translateX and translateY custom\n        * attributes to align this elements rather than `x` and `y` attributes.\n        *\n        * @name Highcharts.AlignObject#alignByTranslate\n        * @type {boolean|undefined}\n        *\n        * @default false\n        */\n        /**\n         * Bounding box of an element.\n         *\n         * @interface Highcharts.BBoxObject\n         * @extends Highcharts.PositionObject\n         */ /**\n        * Height of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#height\n        * @type {number}\n        */ /**\n        * Width of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#width\n        * @type {number}\n        */ /**\n        * Horizontal position of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#x\n        * @type {number}\n        */ /**\n        * Vertical position of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#y\n        * @type {number}\n        */\n        /**\n         * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n         * elements for the most parts correspond to SVG, but some are specific to\n         * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n         * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n         * attributes containing a hyphen are _not_ camel-cased, they should be\n         * quoted to preserve the hyphen.\n         *\n         * @example\n         * {\n         *     'stroke': '#ff0000', // basic\n         *     'stroke-width': 2, // hyphenated\n         *     'rotation': 45 // custom\n         *     'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n         * }\n         *\n         * @interface Highcharts.SVGAttributes\n         */ /**\n        * @name Highcharts.SVGAttributes#[key:string]\n        * @type {*}\n        */ /**\n        * @name Highcharts.SVGAttributes#d\n        * @type {string|Highcharts.SVGPathArray|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#fill\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#inverted\n        * @type {boolean|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#matrix\n        * @type {Array<number>|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotation\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotationOriginX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotationOriginY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#scaleX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#scaleY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#stroke\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#style\n        * @type {string|Highcharts.CSSObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#translateX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#translateY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#zIndex\n        * @type {number|undefined}\n        */\n        /**\n         * An SVG DOM element. The type is a reference to the regular SVGElement in the\n         * global scope.\n         *\n         * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n         */\n        /**\n         * The vertical alignment of an element.\n         *\n         * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n         */\n        ''; // detach doclets above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n         * rendering layer of Highcharts. Combined with the\n         * {@link Highcharts.SVGRenderer}\n         * object, these prototypes allow freeform annotation in the charts or even in\n         * HTML pages without instanciating a chart. The SVGElement can also wrap HTML\n         * labels, when `text` or `label` elements are created with the `useHTML`\n         * parameter.\n         *\n         * The SVGElement instances are created through factory functions on the\n         * {@link Highcharts.SVGRenderer}\n         * object, like\n         * {@link Highcharts.SVGRenderer#rect|rect},\n         * {@link Highcharts.SVGRenderer#path|path},\n         * {@link Highcharts.SVGRenderer#text|text},\n         * {@link Highcharts.SVGRenderer#label|label},\n         * {@link Highcharts.SVGRenderer#g|g}\n         * and more.\n         *\n         * @class\n         * @name Highcharts.SVGElement\n         */\n        var SVGElement = /** @class */ (function () {\n                function SVGElement() {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.element = void 0;\n                this.height = void 0;\n                this.opacity = 1; // Default base for animation\n                this.renderer = void 0;\n                this.SVG_NS = SVG_NS;\n                // Custom attributes used for symbols, these should be filtered out when\n                // setting SVGElement attributes (#9375).\n                this.symbolCustomAttribs = [\n                    'x',\n                    'y',\n                    'width',\n                    'height',\n                    'r',\n                    'start',\n                    'end',\n                    'innerR',\n                    'anchorX',\n                    'anchorY',\n                    'rounded'\n                ];\n                this.width = void 0;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Get the current value of an attribute or pseudo attribute,\n             * used mainly for animation. Called internally from\n             * the {@link Highcharts.SVGRenderer#attr} function.\n             *\n             * @private\n             * @function Highcharts.SVGElement#_defaultGetter\n             *\n             * @param {string} key\n             *        Property key.\n             *\n             * @return {number|string}\n             *         Property value.\n             */\n            SVGElement.prototype._defaultGetter = function (key) {\n                var ret = pick(this[key + 'Value'], // align getter\n                    this[key],\n                    this.element ? this.element.getAttribute(key) : null, 0);\n                if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n                    ret = parseFloat(ret);\n                }\n                return ret;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#_defaultSetter\n             *\n             * @param {string} value\n             *\n             * @param {string} key\n             *\n             * @param {Highcharts.SVGDOMElement} element\n             *\n             * @return {void}\n             */\n            SVGElement.prototype._defaultSetter = function (value, key, element) {\n                element.setAttribute(key, value);\n            };\n            /**\n             * Add the element to the DOM. All elements must be added this way.\n             *\n             * @sample highcharts/members/renderer-g\n             *         Elements added to a group\n             *\n             * @function Highcharts.SVGElement#add\n             *\n             * @param {Highcharts.SVGElement} [parent]\n             *        The parent item to add it to. If undefined, the element is added\n             *        to the {@link Highcharts.SVGRenderer.box}.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.add = function (parent) {\n                var renderer = this.renderer,\n                    element = this.element,\n                    inserted;\n                if (parent) {\n                    this.parentGroup = parent;\n                }\n                // Mark as inverted\n                this.parentInverted = parent && parent.inverted;\n                // Build formatted text\n                if (typeof this.textStr !== 'undefined' &&\n                    this.element.nodeName === 'text' // Not for SVGLabel instances\n                ) {\n                    renderer.buildText(this);\n                }\n                // Mark as added\n                this.added = true;\n                // If we're adding to renderer root, or other elements in the group\n                // have a z index, we need to handle it\n                if (!parent || parent.handleZ || this.zIndex) {\n                    inserted = this.zIndexSetter();\n                }\n                // If zIndex is not handled, append at the end\n                if (!inserted) {\n                    (parent ?\n                        parent.element :\n                        renderer.box).appendChild(element);\n                }\n                // fire an event for internal hooks\n                if (this.onAdd) {\n                    this.onAdd();\n                }\n                return this;\n            };\n            /**\n             * Add a class name to an element.\n             *\n             * @function Highcharts.SVGElement#addClass\n             *\n             * @param {string} className\n             * The new class name to add.\n             *\n             * @param {boolean} [replace=false]\n             * When true, the existing class name(s) will be overwritten with the new\n             * one. When false, the new one is added.\n             *\n             * @return {Highcharts.SVGElement}\n             * Return the SVG element for chainability.\n             */\n            SVGElement.prototype.addClass = function (className, replace) {\n                var currentClassName = replace ? '' : (this.attr('class') || '');\n                // Trim the string and remove duplicates\n                className = (className || '')\n                    .split(/ /g)\n                    .reduce(function (newClassName, name) {\n                    if (currentClassName.indexOf(name) === -1) {\n                        newClassName.push(name);\n                    }\n                    return newClassName;\n                }, (currentClassName ?\n                    [currentClassName] :\n                    []))\n                    .join(' ');\n                if (className !== currentClassName) {\n                    this.attr('class', className);\n                }\n                return this;\n            };\n            /**\n             * This method is executed in the end of `attr()`, after setting all\n             * attributes in the hash. In can be used to efficiently consolidate\n             * multiple attributes in one SVG property -- e.g., translate, rotate and\n             * scale are merged in one \"transform\" attribute in the SVG node.\n             *\n             * @private\n             * @function Highcharts.SVGElement#afterSetters\n             */\n            SVGElement.prototype.afterSetters = function () {\n                // Update transform. Do this outside the loop to prevent redundant\n                // updating for batch setting of attributes.\n                if (this.doTransform) {\n                    this.updateTransform();\n                    this.doTransform = false;\n                }\n            };\n            /**\n             * Align the element relative to the chart or another box.\n             *\n             * @function Highcharts.SVGElement#align\n             *\n             * @param {Highcharts.AlignObject} [alignOptions]\n             *        The alignment options. The function can be called without this\n             *        parameter in order to re-align an element after the box has been\n             *        updated.\n             *\n             * @param {boolean} [alignByTranslate]\n             *        Align element by translation.\n             *\n             * @param {string|Highcharts.BBoxObject} [box]\n             *        The box to align to, needs a width and height. When the box is a\n             *        string, it refers to an object in the Renderer. For example, when\n             *        box is `spacingBox`, it refers to `Renderer.spacingBox` which\n             *        holds `width`, `height`, `x` and `y` properties.\n             *\n             * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.align = function (alignOptions, alignByTranslate, box) {\n                var align,\n                    vAlign,\n                    x,\n                    y,\n                    attribs = {},\n                    alignTo,\n                    renderer = this.renderer,\n                    alignedObjects = renderer.alignedObjects,\n                    alignFactor,\n                    vAlignFactor;\n                // First call on instanciate\n                if (alignOptions) {\n                    this.alignOptions = alignOptions;\n                    this.alignByTranslate = alignByTranslate;\n                    if (!box || isString(box)) {\n                        this.alignTo = alignTo = box || 'renderer';\n                        // prevent duplicates, like legendGroup after resize\n                        erase(alignedObjects, this);\n                        alignedObjects.push(this);\n                        box = void 0; // reassign it below\n                    }\n                    // When called on resize, no arguments are supplied\n                }\n                else {\n                    alignOptions = this.alignOptions;\n                    alignByTranslate = this.alignByTranslate;\n                    alignTo = this.alignTo;\n                }\n                box = pick(box, renderer[alignTo], renderer);\n                // Assign variables\n                align = alignOptions.align;\n                vAlign = alignOptions.verticalAlign;\n                // default: left align\n                x = (box.x || 0) + (alignOptions.x || 0);\n                // default: top align\n                y = (box.y || 0) + (alignOptions.y || 0);\n                // Align\n                if (align === 'right') {\n                    alignFactor = 1;\n                }\n                else if (align === 'center') {\n                    alignFactor = 2;\n                }\n                if (alignFactor) {\n                    x += (box.width - (alignOptions.width || 0)) /\n                        alignFactor;\n                }\n                attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n                // Vertical align\n                if (vAlign === 'bottom') {\n                    vAlignFactor = 1;\n                }\n                else if (vAlign === 'middle') {\n                    vAlignFactor = 2;\n                }\n                if (vAlignFactor) {\n                    y += (box.height - (alignOptions.height || 0)) /\n                        vAlignFactor;\n                }\n                attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n                // Animate only if already placed\n                this[this.placed ? 'animate' : 'attr'](attribs);\n                this.placed = true;\n                this.alignAttr = attribs;\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#alignSetter\n             * @param {\"left\"|\"center\"|\"right\"} value\n             */\n            SVGElement.prototype.alignSetter = function (value) {\n                var convert = {\n                        left: 'start',\n                        center: 'middle',\n                        right: 'end'\n                    };\n                if (convert[value]) {\n                    this.alignValue = value;\n                    this.element.setAttribute('text-anchor', convert[value]);\n                }\n            };\n            /**\n             * Animate to given attributes or CSS properties.\n             *\n             * @sample highcharts/members/element-on/\n             *         Setting some attributes by animation\n             *\n             * @function Highcharts.SVGElement#animate\n             *\n             * @param {Highcharts.SVGAttributes} params\n             *        SVG attributes or CSS to animate.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [options]\n             *        Animation options.\n             *\n             * @param {Function} [complete]\n             *        Function to perform at the end of animation.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.animate = function (params, options, complete) {\n                var animOptions = animObject(pick(options,\n                    this.renderer.globalAnimation,\n                    true));\n                // When the page is hidden save resources in the background by not\n                // running animation at all (#9749).\n                if (pick(doc.hidden, doc.msHidden, doc.webkitHidden, false)) {\n                    animOptions.duration = 0;\n                }\n                if (animOptions.duration !== 0) {\n                    // allows using a callback with the global animation without\n                    // overwriting it\n                    if (complete) {\n                        animOptions.complete = complete;\n                    }\n                    animate(this, params, animOptions);\n                }\n                else {\n                    this.attr(params, void 0, complete);\n                    // Call the end step synchronously\n                    objectEach(params, function (val, prop) {\n                        if (animOptions.step) {\n                            animOptions.step.call(this, val, { prop: prop, pos: 1 });\n                        }\n                    }, this);\n                }\n                return this;\n            };\n            /**\n             * Apply a text outline through a custom CSS property, by copying the text\n             * element and apply stroke to the copy. Used internally. Contrast checks at\n             * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n             *\n             * @example\n             * // Specific color\n             * text.css({\n             *    textOutline: '1px black'\n             * });\n             * // Automatic contrast\n             * text.css({\n             *    color: '#000000', // black text\n             *    textOutline: '1px contrast' // => white outline\n             * });\n             *\n             * @private\n             * @function Highcharts.SVGElement#applyTextOutline\n             *\n             * @param {string} textOutline\n             *        A custom CSS `text-outline` setting, defined by `width color`.\n             */\n            SVGElement.prototype.applyTextOutline = function (textOutline) {\n                var elem = this.element,\n                    tspans,\n                    hasContrast = textOutline.indexOf('contrast') !== -1,\n                    styles = {},\n                    color,\n                    strokeWidth,\n                    firstRealChild;\n                // When the text shadow is set to contrast, use dark stroke for light\n                // text and vice versa.\n                if (hasContrast) {\n                    styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n                }\n                // Extract the stroke width and color\n                textOutline = textOutline.split(' ');\n                color = textOutline[textOutline.length - 1];\n                strokeWidth = textOutline[0];\n                if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n                    this.fakeTS = true; // Fake text shadow\n                    tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n                    // In order to get the right y position of the clone,\n                    // copy over the y setter\n                    this.ySetter = this.xSetter;\n                    // Since the stroke is applied on center of the actual outline, we\n                    // need to double it to get the correct stroke-width outside the\n                    // glyphs.\n                    strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n                        return (2 * digit) + unit;\n                    });\n                    // Remove shadows from previous runs.\n                    this.removeTextOutline(tspans);\n                    // Check if the element contains RTL characters.\n                    // Comparing against Hebrew and Arabic characters,\n                    // excluding Arabic digits. Source:\n                    // https://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt\n                    var isRTL_1 = elem.textContent ?\n                            /^[\\u0591-\\u065F\\u066A-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC]/\n                                .test(elem.textContent) : false;\n                    // For each of the tspans, create a stroked copy behind it.\n                    firstRealChild = elem.firstChild;\n                    tspans.forEach(function (tspan, y) {\n                        var clone;\n                        // Let the first line start at the correct X position\n                        if (y === 0) {\n                            tspan.setAttribute('x', elem.getAttribute('x'));\n                            y = elem.getAttribute('y');\n                            tspan.setAttribute('y', y || 0);\n                            if (y === null) {\n                                elem.setAttribute('y', 0);\n                            }\n                        }\n                        // Create the clone and apply outline properties.\n                        // For RTL elements apply outline properties for orginal element\n                        // to prevent outline from overlapping the text.\n                        // For RTL in Firefox keep the orginal order (#10162).\n                        clone = tspan.cloneNode(true);\n                        attr((isRTL_1 && !isFirefox) ? tspan : clone, {\n                            'class': 'highcharts-text-outline',\n                            fill: color,\n                            stroke: color,\n                            'stroke-width': strokeWidth,\n                            'stroke-linejoin': 'round'\n                        });\n                        elem.insertBefore(clone, firstRealChild);\n                    });\n                    // Create a whitespace between tspan and clone,\n                    // to fix the display of Arabic characters in Firefox.\n                    if (isRTL_1 && isFirefox && tspans[0]) {\n                        var whitespace = tspans[0].cloneNode(true);\n                        whitespace.textContent = ' ';\n                        elem.insertBefore(whitespace, firstRealChild);\n                    }\n                }\n            };\n            /**\n             * @function Highcharts.SVGElement#attr\n             * @param {string} key\n             * @return {number|string}\n             */ /**\n            * Apply native and custom attributes to the SVG elements.\n            *\n            * In order to set the rotation center for rotation, set x and y to 0 and\n            * use `translateX` and `translateY` attributes to position the element\n            * instead.\n            *\n            * Attributes frequently used in Highcharts are `fill`, `stroke`,\n            * `stroke-width`.\n            *\n            * @sample highcharts/members/renderer-rect/\n            *         Setting some attributes\n            *\n            * @example\n            * // Set multiple attributes\n            * element.attr({\n            *     stroke: 'red',\n            *     fill: 'blue',\n            *     x: 10,\n            *     y: 10\n            * });\n            *\n            * // Set a single attribute\n            * element.attr('stroke', 'red');\n            *\n            * // Get an attribute\n            * element.attr('stroke'); // => 'red'\n            *\n            * @function Highcharts.SVGElement#attr\n            *\n            * @param {string|Highcharts.SVGAttributes} [hash]\n            *        The native and custom SVG attributes.\n            *\n            * @param {number|string|Highcharts.SVGPathArray} [val]\n            *        If the type of the first argument is `string`, the second can be a\n            *        value, which will serve as a single attribute setter. If the first\n            *        argument is a string and the second is undefined, the function\n            *        serves as a getter and the current value of the property is\n            *        returned.\n            *\n            * @param {Function} [complete]\n            *        A callback function to execute after setting the attributes. This\n            *        makes the function compliant and interchangeable with the\n            *        {@link SVGElement#animate} function.\n            *\n            * @param {boolean} [continueAnimation=true]\n            *        Used internally when `.attr` is called as part of an animation\n            *        step. Otherwise, calling `.attr` for an attribute will stop\n            *        animation for that attribute.\n            *\n            * @return {Highcharts.SVGElement}\n            *         If used as a setter, it returns the current\n            *         {@link Highcharts.SVGElement} so the calls can be chained. If\n            *         used as a getter, the current value of the attribute is returned.\n            */\n            SVGElement.prototype.attr = function (hash, val, complete, continueAnimation) {\n                var key,\n                    element = this.element,\n                    hasSetSymbolSize,\n                    ret = this,\n                    skipAttr,\n                    setter,\n                    symbolCustomAttribs = this.symbolCustomAttribs;\n                // single key-value pair\n                if (typeof hash === 'string' && typeof val !== 'undefined') {\n                    key = hash;\n                    hash = {};\n                    hash[key] = val;\n                }\n                // used as a getter: first argument is a string, second is undefined\n                if (typeof hash === 'string') {\n                    ret = (this[hash + 'Getter'] ||\n                        this._defaultGetter).call(this, hash, element);\n                    // setter\n                }\n                else {\n                    objectEach(hash, function eachAttribute(val, key) {\n                        skipAttr = false;\n                        // Unless .attr is from the animator update, stop current\n                        // running animation of this property\n                        if (!continueAnimation) {\n                            stop(this, key);\n                        }\n                        // Special handling of symbol attributes\n                        if (this.symbolName &&\n                            symbolCustomAttribs.indexOf(key) !== -1) {\n                            if (!hasSetSymbolSize) {\n                                this.symbolAttr(hash);\n                                hasSetSymbolSize = true;\n                            }\n                            skipAttr = true;\n                        }\n                        if (this.rotation && (key === 'x' || key === 'y')) {\n                            this.doTransform = true;\n                        }\n                        if (!skipAttr) {\n                            setter = (this[key + 'Setter'] ||\n                                this._defaultSetter);\n                            setter.call(this, val, key, element);\n                            // Let the shadow follow the main element\n                            if (!this.styledMode &&\n                                this.shadows &&\n                                /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n                                this.updateShadows(key, val, setter);\n                            }\n                        }\n                    }, this);\n                    this.afterSetters();\n                }\n                // In accordance with animate, run a complete callback\n                if (complete) {\n                    complete.call(this);\n                }\n                return ret;\n            };\n            /**\n             * Apply a clipping rectangle to this element.\n             *\n             * @function Highcharts.SVGElement#clip\n             *\n             * @param {Highcharts.ClipRectElement} [clipRect]\n             *        The clipping rectangle. If skipped, the current clip is removed.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVG element to allow chaining.\n             */\n            SVGElement.prototype.clip = function (clipRect) {\n                return this.attr('clip-path', clipRect ?\n                    'url(' + this.renderer.url + '#' + clipRect.id + ')' :\n                    'none');\n            };\n            /**\n             * Calculate the coordinates needed for drawing a rectangle crisply and\n             * return the calculated attributes.\n             *\n             * @function Highcharts.SVGElement#crisp\n             *\n             * @param {Highcharts.RectangleObject} rect\n             * Rectangle to crisp.\n             *\n             * @param {number} [strokeWidth]\n             * The stroke width to consider when computing crisp positioning. It can\n             * also be set directly on the rect parameter.\n             *\n             * @return {Highcharts.RectangleObject}\n             * The modified rectangle arguments.\n             */\n            SVGElement.prototype.crisp = function (rect, strokeWidth) {\n                var wrapper = this,\n                    normalizer;\n                strokeWidth = strokeWidth || rect.strokeWidth || 0;\n                // Math.round because strokeWidth can sometimes have roundoff errors\n                normalizer = Math.round(strokeWidth) % 2 / 2;\n                // normalize for crisp edges\n                rect.x = Math.floor(rect.x || wrapper.x || 0) + normalizer;\n                rect.y = Math.floor(rect.y || wrapper.y || 0) + normalizer;\n                rect.width = Math.floor((rect.width || wrapper.width || 0) - 2 * normalizer);\n                rect.height = Math.floor((rect.height || wrapper.height || 0) - 2 * normalizer);\n                if (defined(rect.strokeWidth)) {\n                    rect.strokeWidth = strokeWidth;\n                }\n                return rect;\n            };\n            /**\n             * Build and apply an SVG gradient out of a common JavaScript configuration\n             * object. This function is called from the attribute setters. An event\n             * hook is added for supporting other complex color types.\n             *\n             * @private\n             * @function Highcharts.SVGElement#complexColor\n             *\n             * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n             * The gradient or pattern options structure.\n             *\n             * @param {string} prop\n             * The property to apply, can either be `fill` or `stroke`.\n             *\n             * @param {Highcharts.SVGDOMElement} elem\n             * SVG element to apply the gradient on.\n             */\n            SVGElement.prototype.complexColor = function (colorOptions, prop, elem) {\n                var renderer = this.renderer,\n                    colorObject,\n                    gradName,\n                    gradAttr,\n                    radAttr,\n                    gradients,\n                    stops,\n                    stopColor,\n                    stopOpacity,\n                    radialReference,\n                    id,\n                    key = [],\n                    value;\n                fireEvent(this.renderer, 'complexColor', {\n                    args: arguments\n                }, function () {\n                    // Apply linear or radial gradients\n                    if (colorOptions.radialGradient) {\n                        gradName = 'radialGradient';\n                    }\n                    else if (colorOptions.linearGradient) {\n                        gradName = 'linearGradient';\n                    }\n                    if (gradName) {\n                        gradAttr = colorOptions[gradName];\n                        gradients = renderer.gradients;\n                        stops = colorOptions.stops;\n                        radialReference = elem.radialReference;\n                        // Keep < 2.2 kompatibility\n                        if (isArray(gradAttr)) {\n                            colorOptions[gradName] = gradAttr = {\n                                x1: gradAttr[0],\n                                y1: gradAttr[1],\n                                x2: gradAttr[2],\n                                y2: gradAttr[3],\n                                gradientUnits: 'userSpaceOnUse'\n                            };\n                        }\n                        // Correct the radial gradient for the radial reference system\n                        if (gradName === 'radialGradient' &&\n                            radialReference &&\n                            !defined(gradAttr.gradientUnits)) {\n                            // Save the radial attributes for updating\n                            radAttr = gradAttr;\n                            gradAttr = merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n                        }\n                        // Build the unique key to detect whether we need to create a\n                        // new element (#1282)\n                        objectEach(gradAttr, function (val, n) {\n                            if (n !== 'id') {\n                                key.push(n, val);\n                            }\n                        });\n                        objectEach(stops, function (val) {\n                            key.push(val);\n                        });\n                        key = key.join(',');\n                        // Check if a gradient object with the same config object is\n                        // created within this renderer\n                        if (gradients[key]) {\n                            id = gradients[key].attr('id');\n                        }\n                        else {\n                            // Set the id and create the element\n                            gradAttr.id = id = uniqueKey();\n                            var gradientObject_1 = gradients[key] =\n                                    renderer.createElement(gradName)\n                                        .attr(gradAttr)\n                                        .add(renderer.defs);\n                            gradientObject_1.radAttr = radAttr;\n                            // The gradient needs to keep a list of stops to be able to\n                            // destroy them\n                            gradientObject_1.stops = [];\n                            stops.forEach(function (stop) {\n                                var stopObject;\n                                if (stop[1].indexOf('rgba') === 0) {\n                                    colorObject = Color.parse(stop[1]);\n                                    stopColor = colorObject.get('rgb');\n                                    stopOpacity = colorObject.get('a');\n                                }\n                                else {\n                                    stopColor = stop[1];\n                                    stopOpacity = 1;\n                                }\n                                stopObject = renderer.createElement('stop').attr({\n                                    offset: stop[0],\n                                    'stop-color': stopColor,\n                                    'stop-opacity': stopOpacity\n                                }).add(gradientObject_1);\n                                // Add the stop element to the gradient\n                                gradientObject_1.stops.push(stopObject);\n                            });\n                        }\n                        // Set the reference to the gradient object\n                        value = 'url(' + renderer.url + '#' + id + ')';\n                        elem.setAttribute(prop, value);\n                        elem.gradient = key;\n                        // Allow the color to be concatenated into tooltips formatters\n                        // etc. (#2995)\n                        colorOptions.toString = function () {\n                            return value;\n                        };\n                    }\n                });\n            };\n            /**\n             * Set styles for the element. In addition to CSS styles supported by\n             * native SVG and HTML elements, there are also some custom made for\n             * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n             * elements.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Styled text\n             *\n             * @function Highcharts.SVGElement#css\n             *\n             * @param {Highcharts.CSSObject} styles\n             *        The new CSS styles.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Return the SVG element for chaining.\n             */\n            SVGElement.prototype.css = function (styles) {\n                var oldStyles = this.styles, newStyles = {}, elem = this.element, textWidth, serializedCss = '', hyphenate, hasNew = !oldStyles, \n                    // These CSS properties are interpreted internally by the SVG\n                    // renderer, but are not supported by SVG and should not be added to\n                    // the DOM. In styled mode, no CSS should find its way to the DOM\n                    // whatsoever (#6173, #6474).\n                    svgPseudoProps = ['textOutline', 'textOverflow', 'width'];\n                // convert legacy\n                if (styles && styles.color) {\n                    styles.fill = styles.color;\n                }\n                // Filter out existing styles to increase performance (#2640)\n                if (oldStyles) {\n                    objectEach(styles, function (style, n) {\n                        if (oldStyles && oldStyles[n] !== style) {\n                            newStyles[n] = style;\n                            hasNew = true;\n                        }\n                    });\n                }\n                if (hasNew) {\n                    // Merge the new styles with the old ones\n                    if (oldStyles) {\n                        styles = extend(oldStyles, newStyles);\n                    }\n                    // Get the text width from style\n                    if (styles) {\n                        // Previously set, unset it (#8234)\n                        if (styles.width === null || styles.width === 'auto') {\n                            delete this.textWidth;\n                            // Apply new\n                        }\n                        else if (elem.nodeName.toLowerCase() === 'text' &&\n                            styles.width) {\n                            textWidth = this.textWidth = pInt(styles.width);\n                        }\n                    }\n                    // store object\n                    this.styles = styles;\n                    if (textWidth && (!svg && this.renderer.forExport)) {\n                        delete styles.width;\n                    }\n                    // Serialize and set style attribute\n                    if (elem.namespaceURI === this.SVG_NS) { // #7633\n                        hyphenate = function (a, b) {\n                            return '-' + b.toLowerCase();\n                        };\n                        objectEach(styles, function (style, n) {\n                            if (svgPseudoProps.indexOf(n) === -1) {\n                                serializedCss +=\n                                    n.replace(/([A-Z])/g, hyphenate) + ':' +\n                                        style + ';';\n                            }\n                        });\n                        if (serializedCss) {\n                            attr(elem, 'style', serializedCss); // #1881\n                        }\n                    }\n                    else {\n                        css(elem, styles);\n                    }\n                    if (this.added) {\n                        // Rebuild text after added. Cache mechanisms in the buildText\n                        // will prevent building if there are no significant changes.\n                        if (this.element.nodeName === 'text') {\n                            this.renderer.buildText(this);\n                        }\n                        // Apply text outline after added\n                        if (styles && styles.textOutline) {\n                            this.applyTextOutline(styles.textOutline);\n                        }\n                    }\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#dashstyleSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.dashstyleSetter = function (value) {\n                var i,\n                    strokeWidth = this['stroke-width'];\n                // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n                // strokeWidth function, we should be able to use that instead.\n                if (strokeWidth === 'inherit') {\n                    strokeWidth = 1;\n                }\n                value = value && value.toLowerCase();\n                if (value) {\n                    var v = value\n                            .replace('shortdashdotdot', '3,1,1,1,1,1,')\n                            .replace('shortdashdot', '3,1,1,1')\n                            .replace('shortdot', '1,1,')\n                            .replace('shortdash', '3,1,')\n                            .replace('longdash', '8,3,')\n                            .replace(/dot/g, '1,3,')\n                            .replace('dash', '4,3,')\n                            .replace(/,$/, '')\n                            .split(','); // ending comma\n                        i = v.length;\n                    while (i--) {\n                        v[i] = '' + (pInt(v[i]) * pick(strokeWidth, NaN));\n                    }\n                    value = v.join(',').replace(/NaN/g, 'none'); // #3226\n                    this.element.setAttribute('stroke-dasharray', value);\n                }\n            };\n            /**\n             * Destroy the element and element wrapper and clear up the DOM and event\n             * hooks.\n             *\n             * @function Highcharts.SVGElement#destroy\n             */\n            SVGElement.prototype.destroy = function () {\n                var wrapper = this,\n                    element = wrapper.element || {},\n                    renderer = wrapper.renderer,\n                    parentToClean = (renderer.isSVG &&\n                        element.nodeName === 'SPAN' &&\n                        wrapper.parentGroup ||\n                        void 0),\n                    grandParent,\n                    ownerSVGElement = element.ownerSVGElement,\n                    i;\n                // remove events\n                element.onclick = element.onmouseout = element.onmouseover =\n                    element.onmousemove = element.point = null;\n                stop(wrapper); // stop running animations\n                if (wrapper.clipPath && ownerSVGElement) {\n                    var clipPath_1 = wrapper.clipPath;\n                    // Look for existing references to this clipPath and remove them\n                    // before destroying the element (#6196).\n                    // The upper case version is for Edge\n                    [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n                        var clipPathAttr = el.getAttribute('clip-path');\n                        if (clipPathAttr.indexOf(clipPath_1.element.id) > -1) {\n                            el.removeAttribute('clip-path');\n                        }\n                    });\n                    wrapper.clipPath = clipPath_1.destroy();\n                }\n                // Destroy stops in case this is a gradient object @todo old code?\n                if (wrapper.stops) {\n                    for (i = 0; i < wrapper.stops.length; i++) {\n                        wrapper.stops[i].destroy();\n                    }\n                    wrapper.stops.length = 0;\n                    wrapper.stops = void 0;\n                }\n                // remove element\n                wrapper.safeRemoveChild(element);\n                if (!renderer.styledMode) {\n                    wrapper.destroyShadows();\n                }\n                // In case of useHTML, clean up empty containers emulating SVG groups\n                // (#1960, #2393, #2697).\n                while (parentToClean &&\n                    parentToClean.div &&\n                    parentToClean.div.childNodes.length === 0) {\n                    grandParent = parentToClean.parentGroup;\n                    wrapper.safeRemoveChild(parentToClean.div);\n                    delete parentToClean.div;\n                    parentToClean = grandParent;\n                }\n                // remove from alignObjects\n                if (wrapper.alignTo) {\n                    erase(renderer.alignedObjects, wrapper);\n                }\n                objectEach(wrapper, function (val, key) {\n                    // Destroy child elements of a group\n                    if (wrapper[key] &&\n                        wrapper[key].parentGroup === wrapper &&\n                        wrapper[key].destroy) {\n                        wrapper[key].destroy();\n                    }\n                    // Delete all properties\n                    delete wrapper[key];\n                });\n                return;\n            };\n            /**\n             * Destroy shadows on the element.\n             *\n             * @private\n             * @function Highcharts.SVGElement#destroyShadows\n             *\n             * @return {void}\n             */\n            SVGElement.prototype.destroyShadows = function () {\n                (this.shadows || []).forEach(function (shadow) {\n                    this.safeRemoveChild(shadow);\n                }, this);\n                this.shadows = void 0;\n            };\n            /**\n             * @private\n             */\n            SVGElement.prototype.destroyTextPath = function (elem, path) {\n                var textElement = elem.getElementsByTagName('text')[0];\n                var tspans;\n                if (textElement) {\n                    // Remove textPath attributes\n                    textElement.removeAttribute('dx');\n                    textElement.removeAttribute('dy');\n                    // Remove ID's:\n                    path.element.setAttribute('id', '');\n                    // Check if textElement includes textPath,\n                    if (this.textPathWrapper &&\n                        textElement.getElementsByTagName('textPath').length) {\n                        // Move nodes to <text>\n                        tspans = this.textPathWrapper.element.childNodes;\n                        // Now move all <tspan>'s to the <textPath> node\n                        while (tspans.length) {\n                            textElement.appendChild(tspans[0]);\n                        }\n                        // Remove <textPath> from the DOM\n                        textElement.removeChild(this.textPathWrapper.element);\n                    }\n                }\n                else if (elem.getAttribute('dx') || elem.getAttribute('dy')) {\n                    // Remove textPath attributes from elem\n                    // to get correct text-outline position\n                    elem.removeAttribute('dx');\n                    elem.removeAttribute('dy');\n                }\n                if (this.textPathWrapper) {\n                    // Set textPathWrapper to undefined and destroy it\n                    this.textPathWrapper = this.textPathWrapper.destroy();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#dSettter\n             * @param {number|string|Highcharts.SVGPathArray} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.dSetter = function (value, key, element) {\n                if (isArray(value)) {\n                    // Backwards compatibility, convert one-dimensional array into an\n                    // array of segments\n                    if (typeof value[0] === 'string') {\n                        value = this.renderer.pathToSegments(value);\n                    }\n                    this.pathArray = value;\n                    value = value.reduce(function (acc, seg, i) {\n                        if (!seg || !seg.join) {\n                            return (seg || '').toString();\n                        }\n                        return (i ? acc + ' ' : '') + seg.join(' ');\n                    }, '');\n                }\n                if (/(NaN| {2}|^$)/.test(value)) {\n                    value = 'M 0 0';\n                }\n                // Check for cache before resetting. Resetting causes disturbance in the\n                // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n                // possible performance gain.\n                if (this[key] !== value) {\n                    element.setAttribute(key, value);\n                    this[key] = value;\n                }\n            };\n            /**\n             * Fade out an element by animating its opacity down to 0, and hide it on\n             * complete. Used internally for the tooltip.\n             *\n             * @function Highcharts.SVGElement#fadeOut\n             *\n             * @param {number} [duration=150]\n             * The fade duration in milliseconds.\n             */\n            SVGElement.prototype.fadeOut = function (duration) {\n                var elemWrapper = this;\n                elemWrapper.animate({\n                    opacity: 0\n                }, {\n                    duration: pick(duration, 150),\n                    complete: function () {\n                        // #3088, assuming we're only using this for tooltips\n                        elemWrapper.attr({ y: -9999 }).hide();\n                    }\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#fillSetter\n             * @param {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.fillSetter = function (value, key, element) {\n                if (typeof value === 'string') {\n                    element.setAttribute(key, value);\n                }\n                else if (value) {\n                    this.complexColor(value, key, element);\n                }\n            };\n            /**\n             * Get the bounding box (width, height, x and y) for the element. Generally\n             * used to get rendered text size. Since this is called a lot in charts,\n             * the results are cached based on text properties, in order to save DOM\n             * traffic. The returned bounding box includes the rotation, so for example\n             * a single text line of rotation 90 will report a greater height, and a\n             * width corresponding to the line-height.\n             *\n             * @sample highcharts/members/renderer-on-chart/\n             *         Draw a rectangle based on a text's bounding box\n             *\n             * @function Highcharts.SVGElement#getBBox\n             *\n             * @param {boolean} [reload]\n             *        Skip the cache and get the updated DOM bouding box.\n             *\n             * @param {number} [rot]\n             *        Override the element's rotation. This is internally used on axis\n             *        labels with a value of 0 to find out what the bounding box would\n             *        be have been if it were not rotated.\n             *\n             * @return {Highcharts.BBoxObject}\n             *         The bounding box with `x`, `y`, `width` and `height` properties.\n             */\n            SVGElement.prototype.getBBox = function (reload, rot) {\n                var wrapper = this,\n                    bBox, // = wrapper.bBox,\n                    renderer = wrapper.renderer,\n                    width,\n                    height,\n                    element = wrapper.element,\n                    styles = wrapper.styles,\n                    fontSize,\n                    textStr = wrapper.textStr,\n                    toggleTextShadowShim,\n                    cache = renderer.cache,\n                    cacheKeys = renderer.cacheKeys,\n                    isSVG = element.namespaceURI === wrapper.SVG_NS,\n                    cacheKey;\n                var rotation = pick(rot,\n                    wrapper.rotation, 0);\n                fontSize = renderer.styledMode ? (element &&\n                    SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles && styles.fontSize);\n                // Avoid undefined and null (#7316)\n                if (defined(textStr)) {\n                    cacheKey = textStr.toString();\n                    // Since numbers are monospaced, and numerical labels appear a lot\n                    // in a chart, we assume that a label of n characters has the same\n                    // bounding box as others of the same length. Unless there is inner\n                    // HTML in the label. In that case, leave the numbers as is (#5899).\n                    if (cacheKey.indexOf('<') === -1) {\n                        cacheKey = cacheKey.replace(/[0-9]/g, '0');\n                    }\n                    // Properties that affect bounding box\n                    cacheKey += [\n                        '',\n                        rotation,\n                        fontSize,\n                        wrapper.textWidth,\n                        styles && styles.textOverflow,\n                        styles && styles.fontWeight // #12163\n                    ].join(',');\n                }\n                if (cacheKey && !reload) {\n                    bBox = cache[cacheKey];\n                }\n                // No cache found\n                if (!bBox) {\n                    // SVG elements\n                    if (isSVG || renderer.forExport) {\n                        try { // Fails in Firefox if the container has display: none.\n                            // When the text shadow shim is used, we need to hide the\n                            // fake shadows to get the correct bounding box (#3872)\n                            toggleTextShadowShim = this.fakeTS && function (display) {\n                                [].forEach.call(element.querySelectorAll('.highcharts-text-outline'), function (tspan) {\n                                    tspan.style.display = display;\n                                });\n                            };\n                            // Workaround for #3842, Firefox reporting wrong bounding\n                            // box for shadows\n                            if (isFunction(toggleTextShadowShim)) {\n                                toggleTextShadowShim('none');\n                            }\n                            bBox = element.getBBox ?\n                                // SVG: use extend because IE9 is not allowed to change\n                                // width and height in case of rotation (below)\n                                extend({}, element.getBBox()) : {\n                                // Legacy IE in export mode\n                                width: element.offsetWidth,\n                                height: element.offsetHeight\n                            };\n                            // #3842\n                            if (isFunction(toggleTextShadowShim)) {\n                                toggleTextShadowShim('');\n                            }\n                        }\n                        catch (e) {\n                            '';\n                        }\n                        // If the bBox is not set, the try-catch block above failed. The\n                        // other condition is for Opera that returns a width of\n                        // -Infinity on hidden elements.\n                        if (!bBox || bBox.width < 0) {\n                            bBox = { width: 0, height: 0 };\n                        }\n                        // VML Renderer or useHTML within SVG\n                    }\n                    else {\n                        bBox = wrapper.htmlGetBBox();\n                    }\n                    // True SVG elements as well as HTML elements in modern browsers\n                    // using the .useHTML option need to compensated for rotation\n                    if (renderer.isSVG) {\n                        width = bBox.width;\n                        height = bBox.height;\n                        // Workaround for wrong bounding box in IE, Edge and Chrome on\n                        // Windows. With Highcharts' default font, IE and Edge report\n                        // a box height of 16.899 and Chrome rounds it to 17. If this\n                        // stands uncorrected, it results in more padding added below\n                        // the text than above when adding a label border or background.\n                        // Also vertical positioning is affected.\n                        // https://jsfiddle.net/highcharts/em37nvuj/\n                        // (#1101, #1505, #1669, #2568, #6213).\n                        if (isSVG) {\n                            bBox.height = height = ({\n                                '11px,17': 14,\n                                '13px,20': 16\n                            }[styles &&\n                                styles.fontSize + ',' + Math.round(height)] ||\n                                height);\n                        }\n                        // Adjust for rotated text\n                        if (rotation) {\n                            var rad = rotation * deg2rad;\n                            bBox.width = Math.abs(height * Math.sin(rad)) +\n                                Math.abs(width * Math.cos(rad));\n                            bBox.height = Math.abs(height * Math.cos(rad)) +\n                                Math.abs(width * Math.sin(rad));\n                        }\n                    }\n                    // Cache it. When loading a chart in a hidden iframe in Firefox and\n                    // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n                    if (cacheKey && bBox.height > 0) {\n                        // Rotate (#4681)\n                        while (cacheKeys.length > 250) {\n                            delete cache[cacheKeys.shift()];\n                        }\n                        if (!cache[cacheKey]) {\n                            cacheKeys.push(cacheKey);\n                        }\n                        cache[cacheKey] = bBox;\n                    }\n                }\n                return bBox;\n            };\n            /**\n             * Get the computed style. Only in styled mode.\n             *\n             * @example\n             * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n             *\n             * @function Highcharts.SVGElement#getStyle\n             *\n             * @param {string} prop\n             *        The property name to check for.\n             *\n             * @return {string}\n             *         The current computed value.\n             */\n            SVGElement.prototype.getStyle = function (prop) {\n                return win\n                    .getComputedStyle(this.element || this, '')\n                    .getPropertyValue(prop);\n            };\n            /**\n             * Check if an element has the given class name.\n             *\n             * @function Highcharts.SVGElement#hasClass\n             *\n             * @param {string} className\n             * The class name to check for.\n             *\n             * @return {boolean}\n             * Whether the class name is found.\n             */\n            SVGElement.prototype.hasClass = function (className) {\n                return ('' + this.attr('class'))\n                    .split(' ')\n                    .indexOf(className) !== -1;\n            };\n            /**\n             * Hide the element, similar to setting the `visibility` attribute to\n             * `hidden`.\n             *\n             * @function Highcharts.SVGElement#hide\n             *\n             * @param {boolean} [hideByTranslation=false]\n             *        The flag to determine if element should be hidden by moving out\n             *        of the viewport. Used for example for dataLabels.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.hide = function (hideByTranslation) {\n                if (hideByTranslation) {\n                    this.attr({ y: -9999 });\n                }\n                else {\n                    this.attr({ visibility: 'hidden' });\n                }\n                return this;\n            };\n            /**\n             * @private\n             */\n            SVGElement.prototype.htmlGetBBox = function () {\n                return { height: 0, width: 0, x: 0, y: 0 };\n            };\n            /**\n             * Initialize the SVG element. This function only exists to make the\n             * initialization process overridable. It should not be called directly.\n             *\n             * @function Highcharts.SVGElement#init\n             *\n             * @param {Highcharts.SVGRenderer} renderer\n             * The SVGRenderer instance to initialize to.\n             *\n             * @param {string} nodeName\n             * The SVG node name.\n             */\n            SVGElement.prototype.init = function (renderer, nodeName) {\n                /**\n                 * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n                 * node, but may also represent more nodes.\n                 *\n                 * @name Highcharts.SVGElement#element\n                 * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n                 */\n                this.element = nodeName === 'span' ?\n                    createElement(nodeName) :\n                    doc.createElementNS(this.SVG_NS, nodeName);\n                /**\n                 * The renderer that the SVGElement belongs to.\n                 *\n                 * @name Highcharts.SVGElement#renderer\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                this.renderer = renderer;\n                fireEvent(this, 'afterInit');\n            };\n            /**\n             * Invert a group, rotate and flip. This is used internally on inverted\n             * charts, where the points and graphs are drawn as if not inverted, then\n             * the series group elements are inverted.\n             *\n             * @function Highcharts.SVGElement#invert\n             *\n             * @param {boolean} inverted\n             *        Whether to invert or not. An inverted shape can be un-inverted by\n             *        setting it to false.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Return the SVGElement for chaining.\n             */\n            SVGElement.prototype.invert = function (inverted) {\n                var wrapper = this;\n                wrapper.inverted = inverted;\n                wrapper.updateTransform();\n                return wrapper;\n            };\n            /**\n             * Add an event listener. This is a simple setter that replaces all other\n             * events of the same type, opposed to the {@link Highcharts#addEvent}\n             * function.\n             *\n             * @sample highcharts/members/element-on/\n             *         A clickable rectangle\n             *\n             * @function Highcharts.SVGElement#on\n             *\n             * @param {string} eventType\n             * The event type. If the type is `click`, Highcharts will internally\n             * translate it to a `touchstart` event on touch devices, to prevent the\n             * browser from waiting for a click event from firing.\n             *\n             * @param {Function} handler\n             * The handler callback.\n             *\n             * @return {Highcharts.SVGElement}\n             * The SVGElement for chaining.\n             */\n            SVGElement.prototype.on = function (eventType, handler) {\n                var svgElement = this,\n                    element = svgElement.element,\n                    touchStartPos,\n                    touchEventFired;\n                // touch\n                if (hasTouch && eventType === 'click') {\n                    element.ontouchstart = function (e) {\n                        // save touch position for later calculation\n                        touchStartPos = {\n                            clientX: e.touches[0].clientX,\n                            clientY: e.touches[0].clientY\n                        };\n                    };\n                    // Instead of ontouchstart, event handlers should be called\n                    // on touchend - similar to how current mouseup events are called\n                    element.ontouchend = function (e) {\n                        // hasMoved is a boolean variable containing logic if page\n                        // was scrolled, so if touch position changed more than\n                        // ~4px (value borrowed from general touch handler)\n                        var hasMoved = touchStartPos.clientX ? Math.sqrt(Math.pow(touchStartPos.clientX - e.changedTouches[0].clientX, 2) +\n                                Math.pow(touchStartPos.clientY - e.changedTouches[0].clientY, 2)) >= 4 : false;\n                        if (!hasMoved) { // only call handlers if page was not scrolled\n                            handler.call(element, e);\n                        }\n                        touchEventFired = true;\n                        // prevent other events from being fired. #9682\n                        e.preventDefault();\n                    };\n                    element.onclick = function (e) {\n                        // Do not call onclick handler if touch event was fired already.\n                        if (!touchEventFired) {\n                            handler.call(element, e);\n                        }\n                    };\n                }\n                else {\n                    // simplest possible event model for internal use\n                    element['on' + eventType] = handler;\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#opacitySetter\n             * @param {string} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.opacitySetter = function (value, key, element) {\n                this[key] = value;\n                element.setAttribute(key, value);\n            };\n            /**\n             * Remove a class name from the element.\n             *\n             * @function Highcharts.SVGElement#removeClass\n             *\n             * @param {string|RegExp} className\n             *        The class name to remove.\n             *\n             * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n             */\n            SVGElement.prototype.removeClass = function (className) {\n                return this.attr('class', ('' + this.attr('class'))\n                    .replace(isString(className) ?\n                    new RegExp(\"(^| )\" + className + \"( |$)\") : // #12064, #13590\n                    className, ' ')\n                    .replace(/ +/g, ' ')\n                    .trim());\n            };\n            /**\n             * @private\n             * @param {Array<Highcharts.SVGDOMElement>} tspans\n             * Text spans.\n             */\n            SVGElement.prototype.removeTextOutline = function (tspans) {\n                // Iterate from the end to\n                // support removing items inside the cycle (#6472).\n                var i = tspans.length,\n                    tspan;\n                while (i--) {\n                    tspan = tspans[i];\n                    if (tspan.getAttribute('class') === 'highcharts-text-outline') {\n                        // Remove then erase\n                        erase(tspans, this.element.removeChild(tspan));\n                    }\n                }\n            };\n            /**\n             * Removes an element from the DOM.\n             *\n             * @private\n             * @function Highcharts.SVGElement#safeRemoveChild\n             *\n             * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n             * The DOM node to remove.\n             */\n            SVGElement.prototype.safeRemoveChild = function (element) {\n                var parentNode = element.parentNode;\n                if (parentNode) {\n                    parentNode.removeChild(element);\n                }\n            };\n            /**\n             * Set the coordinates needed to draw a consistent radial gradient across\n             * a shape regardless of positioning inside the chart. Used on pie slices\n             * to make all the slices have the same radial reference point.\n             *\n             * @function Highcharts.SVGElement#setRadialReference\n             *\n             * @param {Array<number>} coordinates\n             * The center reference. The format is `[centerX, centerY, diameter]` in\n             * pixels.\n             *\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.setRadialReference = function (coordinates) {\n                var existingGradient = (this.element.gradient &&\n                        this.renderer.gradients[this.element.gradient]);\n                this.element.radialReference = coordinates;\n                // On redrawing objects with an existing gradient, the gradient needs\n                // to be repositioned (#3801)\n                if (existingGradient && existingGradient.radAttr) {\n                    existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#setTextPath\n             * @param {Highcharts.SVGElement} path\n             * Path to follow.\n             * @param {Highcharts.DataLabelsTextPathOptionsObject} textPathOptions\n             * Options.\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.setTextPath = function (path, textPathOptions) {\n                var elem = this.element,\n                    attribsMap = {\n                        textAnchor: 'text-anchor'\n                    },\n                    attrs,\n                    adder = false,\n                    textPathElement,\n                    textPathId,\n                    textPathWrapper = this.textPathWrapper,\n                    tspans,\n                    firstTime = !textPathWrapper;\n                // Defaults\n                textPathOptions = merge(true, {\n                    enabled: true,\n                    attributes: {\n                        dy: -5,\n                        startOffset: '50%',\n                        textAnchor: 'middle'\n                    }\n                }, textPathOptions);\n                attrs = textPathOptions.attributes;\n                if (path && textPathOptions && textPathOptions.enabled) {\n                    // In case of fixed width for a text, string is rebuilt\n                    // (e.g. ellipsis is applied), so we need to rebuild textPath too\n                    if (textPathWrapper &&\n                        textPathWrapper.element.parentNode === null) {\n                        // When buildText functionality was triggered again\n                        // and deletes textPathWrapper parentNode\n                        firstTime = true;\n                        textPathWrapper = textPathWrapper.destroy();\n                    }\n                    else if (textPathWrapper) {\n                        // Case after drillup when spans were added into\n                        // the DOM outside the textPathWrapper parentGroup\n                        this.removeTextOutline.call(textPathWrapper.parentGroup, [].slice.call(elem.getElementsByTagName('tspan')));\n                    }\n                    // label() has padding, text() doesn't\n                    if (this.options && this.options.padding) {\n                        attrs.dx = -this.options.padding;\n                    }\n                    if (!textPathWrapper) {\n                        // Create <textPath>, defer the DOM adder\n                        this.textPathWrapper = textPathWrapper =\n                            this.renderer.createElement('textPath');\n                        adder = true;\n                    }\n                    textPathElement = textPathWrapper.element;\n                    // Set ID for the path\n                    textPathId = path.element.getAttribute('id');\n                    if (!textPathId) {\n                        path.element.setAttribute('id', textPathId = uniqueKey());\n                    }\n                    // Change DOM structure, by placing <textPath> tag in <text>\n                    if (firstTime) {\n                        tspans = elem.getElementsByTagName('tspan');\n                        // Now move all <tspan>'s to the <textPath> node\n                        while (tspans.length) {\n                            // Remove \"y\" from tspans, as Firefox translates them\n                            tspans[0].setAttribute('y', 0);\n                            // Remove \"x\" from tspans\n                            if (isNumber(attrs.dx)) {\n                                tspans[0].setAttribute('x', -attrs.dx);\n                            }\n                            textPathElement.appendChild(tspans[0]);\n                        }\n                    }\n                    // Add <textPath> to the DOM\n                    if (adder &&\n                        textPathWrapper) {\n                        textPathWrapper.add({\n                            // label() is placed in a group, text() is standalone\n                            element: this.text ? this.text.element : elem\n                        });\n                    }\n                    // Set basic options:\n                    // Use `setAttributeNS` because Safari needs this..\n                    textPathElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', this.renderer.url + '#' + textPathId);\n                    // Presentation attributes:\n                    // dx/dy options must by set on <text> (parent),\n                    // the rest should be set on <textPath>\n                    if (defined(attrs.dy)) {\n                        textPathElement.parentNode\n                            .setAttribute('dy', attrs.dy);\n                        delete attrs.dy;\n                    }\n                    if (defined(attrs.dx)) {\n                        textPathElement.parentNode\n                            .setAttribute('dx', attrs.dx);\n                        delete attrs.dx;\n                    }\n                    // Additional attributes\n                    objectEach(attrs, function (val, key) {\n                        textPathElement.setAttribute(attribsMap[key] || key, val);\n                    });\n                    // Remove translation, text that follows path does not need that\n                    elem.removeAttribute('transform');\n                    // Remove shadows and text outlines\n                    this.removeTextOutline.call(textPathWrapper, [].slice.call(elem.getElementsByTagName('tspan')));\n                    // Remove background and border for label(), see #10545\n                    // Alternatively, we can disable setting background rects in\n                    // series.drawDataLabels()\n                    if (this.text && !this.renderer.styledMode) {\n                        this.attr({\n                            fill: 'none',\n                            'stroke-width': 0\n                        });\n                    }\n                    // Disable some functions\n                    this.updateTransform = noop;\n                    this.applyTextOutline = noop;\n                }\n                else if (textPathWrapper) {\n                    // Reset to prototype\n                    delete this.updateTransform;\n                    delete this.applyTextOutline;\n                    // Restore DOM structure:\n                    this.destroyTextPath(elem, path);\n                    // Bring attributes back\n                    this.updateTransform();\n                    // Set textOutline back for text()\n                    if (this.options && this.options.rotation) {\n                        this.applyTextOutline(this.options.style.textOutline);\n                    }\n                }\n                return this;\n            };\n            /**\n             * Add a shadow to the element. Must be called after the element is added to\n             * the DOM. In styled mode, this method is not used, instead use `defs` and\n             * filters.\n             *\n             * @example\n             * renderer.rect(10, 100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .shadow(true);\n             *\n             * @function Highcharts.SVGElement#shadow\n             *\n             * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions]\n             *        The shadow options. If `true`, the default options are applied. If\n             *        `false`, the current shadow will be removed.\n             *\n             * @param {Highcharts.SVGElement} [group]\n             *        The SVG group element where the shadows will be applied. The\n             *        default is to add it to the same parent as the current element.\n             *        Internally, this is ised for pie slices, where all the shadows are\n             *        added to an element behind all the slices.\n             *\n             * @param {boolean} [cutOff]\n             *        Used internally for column shadows.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.shadow = function (shadowOptions, group, cutOff) {\n                var shadows = [],\n                    i,\n                    shadow,\n                    element = this.element,\n                    strokeWidth,\n                    shadowElementOpacity,\n                    update = false,\n                    oldShadowOptions = this.oldShadowOptions, \n                    // compensate for inverted plot area\n                    transform;\n                var defaultShadowOptions = {\n                        color: '#000000',\n                        offsetX: 1,\n                        offsetY: 1,\n                        opacity: 0.15,\n                        width: 3\n                    };\n                var options;\n                if (shadowOptions === true) {\n                    options = defaultShadowOptions;\n                }\n                else if (typeof shadowOptions === 'object') {\n                    options = extend(defaultShadowOptions, shadowOptions);\n                }\n                // Update shadow when options change (#12091).\n                if (options) {\n                    // Go over each key to look for change\n                    if (options && oldShadowOptions) {\n                        objectEach(options, function (value, key) {\n                            if (value !== oldShadowOptions[key]) {\n                                update = true;\n                            }\n                        });\n                    }\n                    if (update) {\n                        this.destroyShadows();\n                    }\n                    this.oldShadowOptions = options;\n                }\n                if (!options) {\n                    this.destroyShadows();\n                }\n                else if (!this.shadows) {\n                    shadowElementOpacity = options.opacity / options.width;\n                    transform = this.parentInverted ?\n                        'translate(-1,-1)' :\n                        \"translate(\" + options.offsetX + \", \" + options.offsetY + \")\";\n                    for (i = 1; i <= options.width; i++) {\n                        shadow = element.cloneNode(false);\n                        strokeWidth = (options.width * 2) + 1 - (2 * i);\n                        attr(shadow, {\n                            stroke: (shadowOptions.color ||\n                                '#000000'),\n                            'stroke-opacity': shadowElementOpacity * i,\n                            'stroke-width': strokeWidth,\n                            transform: transform,\n                            fill: 'none'\n                        });\n                        shadow.setAttribute('class', (shadow.getAttribute('class') || '') + ' highcharts-shadow');\n                        if (cutOff) {\n                            attr(shadow, 'height', Math.max(attr(shadow, 'height') - strokeWidth, 0));\n                            shadow.cutHeight = strokeWidth;\n                        }\n                        if (group) {\n                            group.element.appendChild(shadow);\n                        }\n                        else if (element.parentNode) {\n                            element.parentNode.insertBefore(shadow, element);\n                        }\n                        shadows.push(shadow);\n                    }\n                    this.shadows = shadows;\n                }\n                return this;\n            };\n            /**\n             * Show the element after it has been hidden.\n             *\n             * @function Highcharts.SVGElement#show\n             *\n             * @param {boolean} [inherit=false]\n             *        Set the visibility attribute to `inherit` rather than `visible`.\n             *        The difference is that an element with `visibility=\"visible\"`\n             *        will be visible even if the parent is hidden.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.show = function (inherit) {\n                return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n            };\n            /**\n             * WebKit and Batik have problems with a stroke-width of zero, so in this\n             * case we remove the stroke attribute altogether. #1270, #1369, #3065,\n             * #3072.\n             *\n             * @private\n             * @function Highcharts.SVGElement#strokeSetter\n             * @param {number|string} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.strokeSetter = function (value, key, element) {\n                this[key] = value;\n                // Only apply the stroke attribute if the stroke width is defined and\n                // larger than 0\n                if (this.stroke && this['stroke-width']) {\n                    // Use prototype as instance may be overridden\n                    SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element);\n                    element.setAttribute('stroke-width', this['stroke-width']);\n                    this.hasStroke = true;\n                }\n                else if (key === 'stroke-width' && value === 0 && this.hasStroke) {\n                    element.removeAttribute('stroke');\n                    this.hasStroke = false;\n                }\n                else if (this.renderer.styledMode && this['stroke-width']) {\n                    element.setAttribute('stroke-width', this['stroke-width']);\n                    this.hasStroke = true;\n                }\n            };\n            /**\n             * Get the computed stroke width in pixel values. This is used extensively\n             * when drawing shapes to ensure the shapes are rendered crisp and\n             * positioned correctly relative to each other. Using\n             * `shape-rendering: crispEdges` leaves us less control over positioning,\n             * for example when we want to stack columns next to each other, or position\n             * things pixel-perfectly within the plot box.\n             *\n             * The common pattern when placing a shape is:\n             * - Create the SVGElement and add it to the DOM. In styled mode, it will\n             *   now receive a stroke width from the style sheet. In classic mode we\n             *   will add the `stroke-width` attribute.\n             * - Read the computed `elem.strokeWidth()`.\n             * - Place it based on the stroke width.\n             *\n             * @function Highcharts.SVGElement#strokeWidth\n             *\n             * @return {number}\n             * The stroke width in pixels. Even if the given stroke widtch (in CSS or by\n             * attributes) is based on `em` or other units, the pixel size is returned.\n             */\n            SVGElement.prototype.strokeWidth = function () {\n                // In non-styled mode, read the stroke width as set by .attr\n                if (!this.renderer.styledMode) {\n                    return this['stroke-width'] || 0;\n                }\n                // In styled mode, read computed stroke width\n                var val = this.getStyle('stroke-width'),\n                    ret = 0,\n                    dummy;\n                // Read pixel values directly\n                if (val.indexOf('px') === val.length - 2) {\n                    ret = pInt(val);\n                    // Other values like em, pt etc need to be measured\n                }\n                else if (val !== '') {\n                    dummy = doc.createElementNS(SVG_NS, 'rect');\n                    attr(dummy, {\n                        width: val,\n                        'stroke-width': 0\n                    });\n                    this.element.parentNode.appendChild(dummy);\n                    ret = dummy.getBBox().width;\n                    dummy.parentNode.removeChild(dummy);\n                }\n                return ret;\n            };\n            /**\n             * If one of the symbol size affecting parameters are changed,\n             * check all the others only once for each call to an element's\n             * .attr() method\n             *\n             * @private\n             * @function Highcharts.SVGElement#symbolAttr\n             *\n             * @param {Highcharts.SVGAttributes} hash\n             * The attributes to set.\n             */\n            SVGElement.prototype.symbolAttr = function (hash) {\n                var wrapper = this;\n                [\n                    'x',\n                    'y',\n                    'r',\n                    'start',\n                    'end',\n                    'width',\n                    'height',\n                    'innerR',\n                    'anchorX',\n                    'anchorY',\n                    'clockwise'\n                ].forEach(function (key) {\n                    wrapper[key] = pick(hash[key], wrapper[key]);\n                });\n                wrapper.attr({\n                    d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#textSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.textSetter = function (value) {\n                if (value !== this.textStr) {\n                    // Delete size caches when the text changes\n                    // delete this.bBox; // old code in series-label\n                    delete this.textPxLength;\n                    this.textStr = value;\n                    if (this.added) {\n                        this.renderer.buildText(this);\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#titleSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.titleSetter = function (value) {\n                var titleNode = this.element.getElementsByTagName('title')[0];\n                if (!titleNode) {\n                    titleNode = doc.createElementNS(this.SVG_NS, 'title');\n                    this.element.appendChild(titleNode);\n                }\n                // Remove text content if it exists\n                if (titleNode.firstChild) {\n                    titleNode.removeChild(titleNode.firstChild);\n                }\n                titleNode.appendChild(doc.createTextNode(\n                // #3276, #3895\n                String(pick(value, ''))\n                    .replace(/<[^>]*>/g, '')\n                    .replace(/&lt;/g, '<')\n                    .replace(/&gt;/g, '>')));\n            };\n            /**\n             * Bring the element to the front. Alternatively, a new zIndex can be set.\n             *\n             * @sample highcharts/members/element-tofront/\n             *         Click an element to bring it to front\n             *\n             * @function Highcharts.SVGElement#toFront\n             *\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.toFront = function () {\n                var element = this.element;\n                element.parentNode.appendChild(element);\n                return this;\n            };\n            /**\n             * Move an object and its children by x and y values.\n             *\n             * @function Highcharts.SVGElement#translate\n             *\n             * @param {number} x\n             *        The x value.\n             *\n             * @param {number} y\n             *        The y value.\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            SVGElement.prototype.translate = function (x, y) {\n                return this.attr({\n                    translateX: x,\n                    translateY: y\n                });\n            };\n            /**\n             * Update the shadow elements with new attributes.\n             *\n             * @private\n             * @function Highcharts.SVGElement#updateShadows\n             *\n             * @param {string} key\n             * The attribute name.\n             *\n             * @param {number} value\n             * The value of the attribute.\n             *\n             * @param {Function} setter\n             * The setter function, inherited from the parent wrapper.\n             */\n            SVGElement.prototype.updateShadows = function (key, value, setter) {\n                var shadows = this.shadows;\n                if (shadows) {\n                    var i = shadows.length;\n                    while (i--) {\n                        setter.call(shadows[i], key === 'height' ?\n                            Math.max(value - (shadows[i].cutHeight || 0), 0) :\n                            key === 'd' ? this.d : value, key, shadows[i]);\n                    }\n                }\n            };\n            /**\n             * Update the transform attribute based on internal properties. Deals with\n             * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n             * attributes and updates the SVG `transform` attribute.\n             *\n             * @private\n             * @function Highcharts.SVGElement#updateTransform\n             */\n            SVGElement.prototype.updateTransform = function () {\n                var wrapper = this,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    scaleX = wrapper.scaleX,\n                    scaleY = wrapper.scaleY,\n                    inverted = wrapper.inverted,\n                    rotation = wrapper.rotation,\n                    matrix = wrapper.matrix,\n                    element = wrapper.element,\n                    transform;\n                // Flipping affects translate as adjustment for flipping around the\n                // group's axis\n                if (inverted) {\n                    translateX += wrapper.width;\n                    translateY += wrapper.height;\n                }\n                // Apply translate. Nearly all transformed elements have translation,\n                // so instead of checking for translate = 0, do it always (#1767,\n                // #1846).\n                transform = ['translate(' + translateX + ',' + translateY + ')'];\n                // apply matrix\n                if (defined(matrix)) {\n                    transform.push('matrix(' + matrix.join(',') + ')');\n                }\n                // apply rotation\n                if (inverted) {\n                    transform.push('rotate(90) scale(-1,1)');\n                }\n                else if (rotation) { // text rotation\n                    transform.push('rotate(' + rotation + ' ' +\n                        pick(this.rotationOriginX, element.getAttribute('x'), 0) +\n                        ' ' +\n                        pick(this.rotationOriginY, element.getAttribute('y') || 0) + ')');\n                }\n                // apply scale\n                if (defined(scaleX) || defined(scaleY)) {\n                    transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n                }\n                if (transform.length) {\n                    element.setAttribute('transform', transform.join(' '));\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#visibilitySetter\n             *\n             * @param {string} value\n             *\n             * @param {string} key\n             *\n             * @param {Highcharts.SVGDOMElement} element\n             *\n             * @return {void}\n             */\n            SVGElement.prototype.visibilitySetter = function (value, key, element) {\n                // IE9-11 doesn't handle visibilty:inherit well, so we remove the\n                // attribute instead (#2881, #3909)\n                if (value === 'inherit') {\n                    element.removeAttribute(key);\n                }\n                else if (this[key] !== value) { // #6747\n                    element.setAttribute(key, value);\n                }\n                this[key] = value;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#xGetter\n             *\n             * @param {string} key\n             *\n             * @return {number|string|null}\n             */\n            SVGElement.prototype.xGetter = function (key) {\n                if (this.element.nodeName === 'circle') {\n                    if (key === 'x') {\n                        key = 'cx';\n                    }\n                    else if (key === 'y') {\n                        key = 'cy';\n                    }\n                }\n                return this._defaultGetter(key);\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#zIndexSetter\n             * @param {number} [value]\n             * @param {string} [key]\n             * @return {boolean}\n             */\n            SVGElement.prototype.zIndexSetter = function (value, key) {\n                var renderer = this.renderer,\n                    parentGroup = this.parentGroup,\n                    parentWrapper = parentGroup || renderer,\n                    parentNode = parentWrapper.element || renderer.box,\n                    childNodes,\n                    otherElement,\n                    otherZIndex,\n                    element = this.element,\n                    inserted = false,\n                    undefinedOtherZIndex,\n                    svgParent = parentNode === renderer.box,\n                    run = this.added,\n                    i;\n                if (defined(value)) {\n                    // So we can read it for other elements in the group\n                    element.setAttribute('data-z-index', value);\n                    value = +value;\n                    if (this[key] === value) {\n                        // Only update when needed (#3865)\n                        run = false;\n                    }\n                }\n                else if (defined(this[key])) {\n                    element.removeAttribute('data-z-index');\n                }\n                this[key] = value;\n                // Insert according to this and other elements' zIndex. Before .add() is\n                // called, nothing is done. Then on add, or by later calls to\n                // zIndexSetter, the node is placed on the right place in the DOM.\n                if (run) {\n                    value = this.zIndex;\n                    if (value && parentGroup) {\n                        parentGroup.handleZ = true;\n                    }\n                    childNodes = parentNode.childNodes;\n                    for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n                        otherElement = childNodes[i];\n                        otherZIndex = otherElement.getAttribute('data-z-index');\n                        undefinedOtherZIndex = !defined(otherZIndex);\n                        if (otherElement !== element) {\n                            if (\n                            // Negative zIndex versus no zIndex:\n                            // On all levels except the highest. If the parent is\n                            // <svg>, then we don't want to put items before <desc>\n                            // or <defs>\n                            value < 0 &&\n                                undefinedOtherZIndex &&\n                                !svgParent &&\n                                !i) {\n                                parentNode.insertBefore(element, childNodes[i]);\n                                inserted = true;\n                            }\n                            else if (\n                            // Insert after the first element with a lower zIndex\n                            pInt(otherZIndex) <= value ||\n                                // If negative zIndex, add this before first undefined\n                                // zIndex element\n                                (undefinedOtherZIndex &&\n                                    (!defined(value) || value >= 0))) {\n                                parentNode.insertBefore(element, childNodes[i + 1] || null // null for oldIE export\n                                );\n                                inserted = true;\n                            }\n                        }\n                    }\n                    if (!inserted) {\n                        parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0] || null // null for oldIE\n                        );\n                        inserted = true;\n                    }\n                }\n                return inserted;\n            };\n            return SVGElement;\n        }());\n        // Some shared setters and getters\n        SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter;\n        SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n        SVGElement.prototype.matrixSetter =\n            SVGElement.prototype.rotationOriginXSetter =\n                SVGElement.prototype.rotationOriginYSetter =\n                    SVGElement.prototype.rotationSetter =\n                        SVGElement.prototype.scaleXSetter =\n                            SVGElement.prototype.scaleYSetter =\n                                SVGElement.prototype.translateXSetter =\n                                    SVGElement.prototype.translateYSetter =\n                                        SVGElement.prototype.verticalAlignSetter = function (value, key) {\n                                            this[key] = value;\n                                            this.doTransform = true;\n                                        };\n        H.SVGElement = SVGElement;\n\n        return H.SVGElement;\n    });\n    _registerModule(_modules, 'parts/SVGLabel.js', [_modules['parts/SVGElement.js'], _modules['parts/Utilities.js']], function (SVGElement, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var __extends = (this && this.__extends) || (function () {\n                var extendStatics = function (d,\n            b) {\n                    extendStatics = Object.setPrototypeOf ||\n                        ({ __proto__: [] } instanceof Array && function (d,\n            b) { d.__proto__ = b; }) ||\n                        function (d,\n            b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n                return extendStatics(d, b);\n            };\n            return function (d, b) {\n                extendStatics(d, b);\n                function __() { this.constructor = d; }\n                d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n            };\n        })();\n        var defined = U.defined,\n            extend = U.extend,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            removeEvent = U.removeEvent;\n        /**\n         * SVG label to render text.\n         * @private\n         * @class\n         * @name Highcharts.SVGLabel\n         * @augments Highcharts.SVGElement\n         */\n        var SVGLabel = /** @class */ (function (_super) {\n                __extends(SVGLabel, _super);\n            /* *\n             *\n             *  Constructors\n             *\n             * */\n            function SVGLabel(renderer, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n                var _this = _super.call(this) || this;\n                _this.init(renderer, 'g');\n                _this.textStr = str;\n                _this.x = x;\n                _this.y = y;\n                _this.anchorX = anchorX;\n                _this.anchorY = anchorY;\n                _this.baseline = baseline;\n                _this.className = className;\n                if (className !== 'button') {\n                    _this.addClass('highcharts-label');\n                }\n                if (className) {\n                    _this.addClass('highcharts-' + className);\n                }\n                _this.text = renderer.text('', 0, 0, useHTML)\n                    .attr({\n                    zIndex: 1\n                });\n                // Validate the shape argument\n                var hasBGImage;\n                if (typeof shape === 'string') {\n                    hasBGImage = /^url\\((.*?)\\)$/.test(shape);\n                    if (_this.renderer.symbols[shape] || hasBGImage) {\n                        _this.symbolKey = shape;\n                    }\n                }\n                _this.bBox = SVGLabel.emptyBBox;\n                _this.padding = 3;\n                _this.paddingLeft = 0;\n                _this.baselineOffset = 0;\n                _this.needsBox = renderer.styledMode || hasBGImage;\n                _this.deferredAttr = {};\n                _this.alignFactor = 0;\n                return _this;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            SVGLabel.prototype.alignSetter = function (value) {\n                var alignFactor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[value];\n                if (alignFactor !== this.alignFactor) {\n                    this.alignFactor = alignFactor;\n                    // Bounding box exists, means we're dynamically changing\n                    if (this.bBox && isNumber(this.xSetting)) {\n                        this.attr({ x: this.xSetting }); // #5134\n                    }\n                }\n            };\n            SVGLabel.prototype.anchorXSetter = function (value, key) {\n                this.anchorX = value;\n                this.boxAttr(key, Math.round(value) - this.getCrispAdjust() - this.xSetting);\n            };\n            SVGLabel.prototype.anchorYSetter = function (value, key) {\n                this.anchorY = value;\n                this.boxAttr(key, value - this.ySetting);\n            };\n            /*\n             * Set a box attribute, or defer it if the box is not yet created\n             */\n            SVGLabel.prototype.boxAttr = function (key, value) {\n                if (this.box) {\n                    this.box.attr(key, value);\n                }\n                else {\n                    this.deferredAttr[key] = value;\n                }\n            };\n            /*\n             * Pick up some properties and apply them to the text instead of the\n             * wrapper.\n             */\n            SVGLabel.prototype.css = function (styles) {\n                if (styles) {\n                    var textStyles = {},\n                        isWidth,\n                        isFontStyle;\n                    // Create a copy to avoid altering the original object\n                    // (#537)\n                    styles = merge(styles);\n                    SVGLabel.textProps.forEach(function (prop) {\n                        if (typeof styles[prop] !== 'undefined') {\n                            textStyles[prop] = styles[prop];\n                            delete styles[prop];\n                        }\n                    });\n                    this.text.css(textStyles);\n                    isWidth = 'width' in textStyles;\n                    isFontStyle = 'fontSize' in textStyles ||\n                        'fontWeight' in textStyles;\n                    // Update existing text, box (#9400, #12163)\n                    if (isWidth || isFontStyle) {\n                        this.updateBoxSize();\n                        // Keep updated (#9400, #12163)\n                        if (isFontStyle) {\n                            this.updateTextPadding();\n                        }\n                    }\n                }\n                return SVGElement.prototype.css.call(this, styles);\n            };\n            /*\n             * Destroy and release memory.\n             */\n            SVGLabel.prototype.destroy = function () {\n                // Added by button implementation\n                removeEvent(this.element, 'mouseenter');\n                removeEvent(this.element, 'mouseleave');\n                if (this.text) {\n                    this.text.destroy();\n                }\n                if (this.box) {\n                    this.box = this.box.destroy();\n                }\n                // Call base implementation to destroy the rest\n                SVGElement.prototype.destroy.call(this);\n                return void 0;\n            };\n            SVGLabel.prototype.fillSetter = function (value, key) {\n                if (value) {\n                    this.needsBox = true;\n                }\n                // for animation getter (#6776)\n                this.fill = value;\n                this.boxAttr(key, value);\n            };\n            /*\n             * Return the bounding box of the box, not the group.\n             */\n            SVGLabel.prototype.getBBox = function () {\n                var bBox = this.bBox;\n                var padding = this.padding;\n                return {\n                    width: bBox.width + 2 * padding,\n                    height: bBox.height + 2 * padding,\n                    x: bBox.x - padding,\n                    y: bBox.y - padding\n                };\n            };\n            SVGLabel.prototype.getCrispAdjust = function () {\n                return this.renderer.styledMode && this.box ?\n                    this.box.strokeWidth() % 2 / 2 :\n                    (this['stroke-width'] ? parseInt(this['stroke-width'], 10) : 0) % 2 / 2;\n            };\n            SVGLabel.prototype.heightSetter = function (value) {\n                this.heightSetting = value;\n            };\n            // Event handling. In case of useHTML, we need to make sure that events\n            // are captured on the span as well, and that mouseenter/mouseleave\n            // between the SVG group and the HTML span are not treated as real\n            // enter/leave events. #13310.\n            SVGLabel.prototype.on = function (eventType, handler) {\n                var label = this;\n                var text = label.text;\n                var span = text && text.element.tagName === 'SPAN' ? text : void 0;\n                var selectiveHandler;\n                if (span) {\n                    selectiveHandler = function (e) {\n                        if ((eventType === 'mouseenter' ||\n                            eventType === 'mouseleave') &&\n                            e.relatedTarget instanceof Element &&\n                            (label.element.contains(e.relatedTarget) ||\n                                span.element.contains(e.relatedTarget))) {\n                            return;\n                        }\n                        handler.call(label.element, e);\n                    };\n                    span.on(eventType, selectiveHandler);\n                }\n                SVGElement.prototype.on.call(label, eventType, selectiveHandler || handler);\n                return label;\n            };\n            /*\n             * After the text element is added, get the desired size of the border\n             * box and add it before the text in the DOM.\n             */\n            SVGLabel.prototype.onAdd = function () {\n                var str = this.textStr;\n                this.text.add(this);\n                this.attr({\n                    // Alignment is available now  (#3295, 0 not rendered if given\n                    // as a value)\n                    text: (defined(str) ? str : ''),\n                    x: this.x,\n                    y: this.y\n                });\n                if (this.box && defined(this.anchorX)) {\n                    this.attr({\n                        anchorX: this.anchorX,\n                        anchorY: this.anchorY\n                    });\n                }\n            };\n            SVGLabel.prototype.paddingSetter = function (value) {\n                if (defined(value) && value !== this.padding) {\n                    this.padding = value;\n                    this.updateTextPadding();\n                }\n            };\n            SVGLabel.prototype.paddingLeftSetter = function (value) {\n                if (defined(value) && value !== this.paddingLeft) {\n                    this.paddingLeft = value;\n                    this.updateTextPadding();\n                }\n            };\n            SVGLabel.prototype.rSetter = function (value, key) {\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype.shadow = function (b) {\n                if (b && !this.renderer.styledMode) {\n                    this.updateBoxSize();\n                    if (this.box) {\n                        this.box.shadow(b);\n                    }\n                }\n                return this;\n            };\n            SVGLabel.prototype.strokeSetter = function (value, key) {\n                // for animation getter (#6776)\n                this.stroke = value;\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype['stroke-widthSetter'] = function (value, key) {\n                if (value) {\n                    this.needsBox = true;\n                }\n                this['stroke-width'] = value;\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype['text-alignSetter'] = function (value) {\n                this.textAlign = value;\n            };\n            SVGLabel.prototype.textSetter = function (text) {\n                if (typeof text !== 'undefined') {\n                    // Must use .attr to ensure transforms are done (#10009)\n                    this.text.attr({ text: text });\n                }\n                this.updateBoxSize();\n                this.updateTextPadding();\n            };\n            /*\n             * This function runs after the label is added to the DOM (when the bounding\n             * box is available), and after the text of the label is updated to detect\n             * the new bounding box and reflect it in the border box.\n             */\n            SVGLabel.prototype.updateBoxSize = function () {\n                var style = this.text.element.style,\n                    crispAdjust,\n                    attribs = {};\n                var padding = this.padding;\n                var paddingLeft = this.paddingLeft;\n                // #12165 error when width is null (auto)\n                // #12163 when fontweight: bold, recalculate bBox withot cache\n                // #3295 && 3514 box failure when string equals 0\n                var bBox = ((!isNumber(this.widthSetting) || !isNumber(this.heightSetting) || this.textAlign) &&\n                        defined(this.text.textStr)) ?\n                        this.text.getBBox() : SVGLabel.emptyBBox;\n                this.width = ((this.widthSetting || bBox.width || 0) +\n                    2 * padding +\n                    paddingLeft);\n                this.height = (this.heightSetting || bBox.height || 0) + 2 * padding;\n                // Update the label-scoped y offset. Math.min because of inline\n                // style (#9400)\n                this.baselineOffset = padding + Math.min(this.renderer.fontMetrics(style && style.fontSize, this.text).b, \n                // When the height is 0, there is no bBox, so go with the font\n                // metrics. Highmaps CSS demos.\n                bBox.height || Infinity);\n                if (this.needsBox) {\n                    // Create the border box if it is not already present\n                    if (!this.box) {\n                        // Symbol definition exists (#5324)\n                        var box = this.box = this.symbolKey ?\n                                this.renderer.symbol(this.symbolKey) :\n                                this.renderer.rect();\n                        box.addClass(// Don't use label className for buttons\n                        (this.className === 'button' ? '' : 'highcharts-label-box') +\n                            (this.className ? ' highcharts-' + this.className + '-box' : ''));\n                        box.add(this);\n                        crispAdjust = this.getCrispAdjust();\n                        attribs.x = crispAdjust;\n                        attribs.y = (this.baseline ? -this.baselineOffset : 0) + crispAdjust;\n                    }\n                    // Apply the box attributes\n                    attribs.width = Math.round(this.width);\n                    attribs.height = Math.round(this.height);\n                    this.box.attr(extend(attribs, this.deferredAttr));\n                    this.deferredAttr = {};\n                }\n                this.bBox = bBox;\n            };\n            /*\n             * This function runs after setting text or padding, but only if padding\n             * is changed.\n             */\n            SVGLabel.prototype.updateTextPadding = function () {\n                var text = this.text;\n                // Determine y based on the baseline\n                var textY = this.baseline ? 0 : this.baselineOffset;\n                var textX = this.paddingLeft + this.padding;\n                // compensate for alignment\n                if (defined(this.widthSetting) &&\n                    this.bBox &&\n                    (this.textAlign === 'center' || this.textAlign === 'right')) {\n                    textX += { center: 0.5, right: 1 }[this.textAlign] *\n                        (this.widthSetting - this.bBox.width);\n                }\n                // update if anything changed\n                if (textX !== text.x || textY !== text.y) {\n                    text.attr('x', textX);\n                    // #8159 - prevent misplaced data labels in treemap\n                    // (useHTML: true)\n                    if (text.hasBoxWidthChanged) {\n                        this.bBox = text.getBBox(true);\n                        this.updateBoxSize();\n                    }\n                    if (typeof textY !== 'undefined') {\n                        text.attr('y', textY);\n                    }\n                }\n                // record current values\n                text.x = textX;\n                text.y = textY;\n            };\n            SVGLabel.prototype.widthSetter = function (value) {\n                // width:auto => null\n                this.widthSetting = isNumber(value) ? value : void 0;\n            };\n            SVGLabel.prototype.xSetter = function (value) {\n                this.x = value; // for animation getter\n                if (this.alignFactor) {\n                    value -= this.alignFactor * ((this.widthSetting || this.bBox.width) +\n                        2 * this.padding);\n                    // Force animation even when setting to the same value (#7898)\n                    this['forceAnimate:x'] = true;\n                }\n                this.xSetting = Math.round(value);\n                this.attr('translateX', this.xSetting);\n            };\n            SVGLabel.prototype.ySetter = function (value) {\n                this.ySetting = this.y = Math.round(value);\n                this.attr('translateY', this.ySetting);\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            SVGLabel.emptyBBox = { width: 0, height: 0, x: 0, y: 0 };\n            /* *\n             *\n             *  Properties\n             *\n             * */\n            /**\n             * For labels, these CSS properties are applied to the `text` node directly.\n             *\n             * @private\n             * @name Highcharts.SVGLabel#textProps\n             * @type {Array<string>}\n             */\n            SVGLabel.textProps = [\n                'color', 'cursor', 'direction', 'fontFamily', 'fontSize', 'fontStyle',\n                'fontWeight', 'lineHeight', 'textAlign', 'textDecoration',\n                'textOutline', 'textOverflow', 'width'\n            ];\n            return SVGLabel;\n        }(SVGElement));\n\n        return SVGLabel;\n    });\n    _registerModule(_modules, 'parts/SVGRenderer.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/SVGElement.js'], _modules['parts/SVGLabel.js'], _modules['parts/Utilities.js']], function (Color, H, SVGElement, SVGLabel, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            erase = U.erase,\n            extend = U.extend,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            removeEvent = U.removeEvent,\n            splat = U.splat,\n            stop = U.stop,\n            uniqueKey = U.uniqueKey;\n        /**\n         * A clipping rectangle that can be applied to one or more {@link SVGElement}\n         * instances. It is instanciated with the {@link SVGRenderer#clipRect} function\n         * and applied with the {@link SVGElement#clip} function.\n         *\n         * @example\n         * var circle = renderer.circle(100, 100, 100)\n         *     .attr({ fill: 'red' })\n         *     .add();\n         * var clipRect = renderer.clipRect(100, 100, 100, 100);\n         *\n         * // Leave only the lower right quarter visible\n         * circle.clip(clipRect);\n         *\n         * @typedef {Highcharts.SVGElement} Highcharts.ClipRectElement\n         */\n        /**\n         * The font metrics.\n         *\n         * @interface Highcharts.FontMetricsObject\n         */ /**\n        * The baseline relative to the top of the box.\n        *\n        * @name Highcharts.FontMetricsObject#b\n        * @type {number}\n        */ /**\n        * The font size.\n        *\n        * @name Highcharts.FontMetricsObject#f\n        * @type {number}\n        */ /**\n        * The line height.\n        *\n        * @name Highcharts.FontMetricsObject#h\n        * @type {number}\n        */\n        /**\n         * An object containing `x` and `y` properties for the position of an element.\n         *\n         * @interface Highcharts.PositionObject\n         */ /**\n        * X position of the element.\n        * @name Highcharts.PositionObject#x\n        * @type {number}\n        */ /**\n        * Y position of the element.\n        * @name Highcharts.PositionObject#y\n        * @type {number}\n        */\n        /**\n         * A rectangle.\n         *\n         * @interface Highcharts.RectangleObject\n         */ /**\n        * Height of the rectangle.\n        * @name Highcharts.RectangleObject#height\n        * @type {number}\n        */ /**\n        * Width of the rectangle.\n        * @name Highcharts.RectangleObject#width\n        * @type {number}\n        */ /**\n        * Horizontal position of the rectangle.\n        * @name Highcharts.RectangleObject#x\n        * @type {number}\n        */ /**\n        * Vertical position of the rectangle.\n        * @name Highcharts.RectangleObject#y\n        * @type {number}\n        */\n        /**\n         * The shadow options.\n         *\n         * @interface Highcharts.ShadowOptionsObject\n         */ /**\n        * The shadow color.\n        * @name    Highcharts.ShadowOptionsObject#color\n        * @type    {Highcharts.ColorString|undefined}\n        * @default #000000\n        */ /**\n        * The horizontal offset from the element.\n        *\n        * @name    Highcharts.ShadowOptionsObject#offsetX\n        * @type    {number|undefined}\n        * @default 1\n        */ /**\n        * The vertical offset from the element.\n        * @name    Highcharts.ShadowOptionsObject#offsetY\n        * @type    {number|undefined}\n        * @default 1\n        */ /**\n        * The shadow opacity.\n        *\n        * @name    Highcharts.ShadowOptionsObject#opacity\n        * @type    {number|undefined}\n        * @default 0.15\n        */ /**\n        * The shadow width or distance from the element.\n        * @name    Highcharts.ShadowOptionsObject#width\n        * @type    {number|undefined}\n        * @default 3\n        */\n        /**\n         * @interface Highcharts.SizeObject\n         */ /**\n        * @name Highcharts.SizeObject#height\n        * @type {number}\n        */ /**\n        * @name Highcharts.SizeObject#width\n        * @type {number}\n        */\n        /**\n         * Serialized form of an SVG definition, including children. Some key\n         * property names are reserved: tagName, textContent, and children.\n         *\n         * @interface Highcharts.SVGDefinitionObject\n         */ /**\n        * @name Highcharts.SVGDefinitionObject#[key:string]\n        * @type {boolean|number|string|Array<Highcharts.SVGDefinitionObject>|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#children\n        * @type {Array<Highcharts.SVGDefinitionObject>|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#tagName\n        * @type {string|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#textContent\n        * @type {string|undefined}\n        */\n        /**\n         * Array of path commands, that will go into the `d` attribute of an SVG\n         * element.\n         *\n         * @typedef {Array<Array<Highcharts.SVGPathCommand,number?,number?,number?,number?,number?,number?,number?>>} Highcharts.SVGPathArray\n         */\n        /**\n         * Possible path commands in an SVG path array. Valid values are `A`, `C`, `H`,\n         * `L`, `M`, `Q`, `S`, `T`, `V`, `Z`.\n         *\n         * @typedef {string} Highcharts.SVGPathCommand\n         * @validvalue [\"a\",\"c\",\"h\",\"l\",\"m\",\"q\",\"s\",\"t\",\"v\",\"z\",\"A\",\"C\",\"H\",\"L\",\"M\",\"Q\",\"S\",\"T\",\"V\",\"Z\"]\n         */\n        /**\n         * An extendable collection of functions for defining symbol paths. Symbols are\n         * used internally for point markers, button and label borders and backgrounds,\n         * or custom shapes. Extendable by adding to {@link SVGRenderer#symbols}.\n         *\n         * @interface Highcharts.SymbolDictionary\n         */ /**\n        * @name Highcharts.SymbolDictionary#[key:string]\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#arc\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#callout\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#circle\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#diamond\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#square\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#triangle\n        * @type {Function|undefined}\n        */\n        /**\n         * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`, `triangle`,\n         * and `triangle-down`. Symbols are used internally for point markers, button\n         * and label borders and backgrounds, or custom shapes. Extendable by adding to\n         * {@link SVGRenderer#symbols}.\n         *\n         * @typedef {\"arc\"|\"callout\"|\"circle\"|\"diamond\"|\"square\"|\"triangle\"|\"triangle-down\"} Highcharts.SymbolKeyValue\n         */\n        /**\n         * Additional options, depending on the actual symbol drawn.\n         *\n         * @interface Highcharts.SymbolOptionsObject\n         */ /**\n        * The anchor X position for the `callout` symbol. This is where the chevron\n        * points to.\n        *\n        * @name Highcharts.SymbolOptionsObject#anchorX\n        * @type {number|undefined}\n        */ /**\n        * The anchor Y position for the `callout` symbol. This is where the chevron\n        * points to.\n        *\n        * @name Highcharts.SymbolOptionsObject#anchorY\n        * @type {number|undefined}\n        */ /**\n        * The end angle of an `arc` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#end\n        * @type {number|undefined}\n        */ /**\n        * Whether to draw `arc` symbol open or closed.\n        *\n        * @name Highcharts.SymbolOptionsObject#open\n        * @type {boolean|undefined}\n        */ /**\n        * The radius of an `arc` symbol, or the border radius for the `callout` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#r\n        * @type {number|undefined}\n        */ /**\n        * The start angle of an `arc` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#start\n        * @type {number|undefined}\n        */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        var charts = H.charts,\n            deg2rad = H.deg2rad,\n            doc = H.doc,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            noop = H.noop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            symbolSizes = H.symbolSizes,\n            win = H.win;\n        /**\n         * Allows direct access to the Highcharts rendering layer in order to draw\n         * primitive shapes like circles, rectangles, paths or text directly on a chart,\n         * or independent from any chart. The SVGRenderer represents a wrapper object\n         * for SVG in modern browsers. Through the VMLRenderer, part of the `oldie.js`\n         * module, it also brings vector graphics to IE <= 8.\n         *\n         * An existing chart's renderer can be accessed through {@link Chart.renderer}.\n         * The renderer can also be used completely decoupled from a chart.\n         *\n         * @sample highcharts/members/renderer-on-chart\n         *         Annotating a chart programmatically.\n         * @sample highcharts/members/renderer-basic\n         *         Independent SVG drawing.\n         *\n         * @example\n         * // Use directly without a chart object.\n         * var renderer = new Highcharts.Renderer(parentNode, 600, 400);\n         *\n         * @class\n         * @name Highcharts.SVGRenderer\n         *\n         * @param {Highcharts.HTMLDOMElement} container\n         *        Where to put the SVG in the web page.\n         *\n         * @param {number} width\n         *        The width of the SVG.\n         *\n         * @param {number} height\n         *        The height of the SVG.\n         *\n         * @param {Highcharts.CSSObject} [style]\n         *        The box style, if not in styleMode\n         *\n         * @param {boolean} [forExport=false]\n         *        Whether the rendered content is intended for export.\n         *\n         * @param {boolean} [allowHTML=true]\n         *        Whether the renderer is allowed to include HTML text, which will be\n         *        projected on top of the SVG.\n         *\n         * @param {boolean} [styledMode=false]\n         *        Whether the renderer belongs to a chart that is in styled mode.\n         *        If it does, it will avoid setting presentational attributes in\n         *        some cases, but not when set explicitly through `.attr` and `.css`\n         *        etc.\n         */\n        var SVGRenderer = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function SVGRenderer(container, width, height, style, forExport, allowHTML, styledMode) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.alignedObjects = void 0;\n                /**\n                 * The root `svg` node of the renderer.\n                 *\n                 * @name Highcharts.SVGRenderer#box\n                 * @type {Highcharts.SVGDOMElement}\n                 */\n                this.box = void 0;\n                /**\n                 * The wrapper for the root `svg` node of the renderer.\n                 *\n                 * @name Highcharts.SVGRenderer#boxWrapper\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.boxWrapper = void 0;\n                this.cache = void 0;\n                this.cacheKeys = void 0;\n                this.chartIndex = void 0;\n                /**\n                 * A pointer to the `defs` node of the root SVG.\n                 *\n                 * @name Highcharts.SVGRenderer#defs\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.defs = void 0;\n                this.globalAnimation = void 0;\n                this.gradients = void 0;\n                this.height = void 0;\n                this.imgCount = void 0;\n                this.isSVG = void 0;\n                this.style = void 0;\n                /**\n                 * Page url used for internal references.\n                 *\n                 * @private\n                 * @name Highcharts.SVGRenderer#url\n                 * @type {string}\n                 */\n                this.url = void 0;\n                this.width = void 0;\n                this.init(container, width, height, style, forExport, allowHTML, styledMode);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Initialize the SVGRenderer. Overridable initializer function that takes\n             * the same parameters as the constructor.\n             *\n             * @function Highcharts.SVGRenderer#init\n             *\n             * @param {Highcharts.HTMLDOMElement} container\n             * Where to put the SVG in the web page.\n             *\n             * @param {number} width\n             * The width of the SVG.\n             *\n             * @param {number} height\n             * The height of the SVG.\n             *\n             * @param {Highcharts.CSSObject} [style]\n             * The box style, if not in styleMode\n             *\n             * @param {boolean} [forExport=false]\n             * Whether the rendered content is intended for export.\n             *\n             * @param {boolean} [allowHTML=true]\n             * Whether the renderer is allowed to include HTML text, which will be\n             * projected on top of the SVG.\n             *\n             * @param {boolean} [styledMode=false]\n             * Whether the renderer belongs to a chart that is in styled mode. If it\n             * does, it will avoid setting presentational attributes in some cases, but\n             * not when set explicitly through `.attr` and `.css` etc.\n             */\n            SVGRenderer.prototype.init = function (container, width, height, style, forExport, allowHTML, styledMode) {\n                var renderer = this,\n                    boxWrapper,\n                    element,\n                    desc;\n                boxWrapper = renderer.createElement('svg')\n                    .attr({\n                    version: '1.1',\n                    'class': 'highcharts-root'\n                });\n                if (!styledMode) {\n                    boxWrapper.css(this.getStyle(style));\n                }\n                element = boxWrapper.element;\n                container.appendChild(element);\n                // Always use ltr on the container, otherwise text-anchor will be\n                // flipped and text appear outside labels, buttons, tooltip etc (#3482)\n                attr(container, 'dir', 'ltr');\n                // For browsers other than IE, add the namespace attribute (#1978)\n                if (container.innerHTML.indexOf('xmlns') === -1) {\n                    attr(element, 'xmlns', this.SVG_NS);\n                }\n                // object properties\n                renderer.isSVG = true;\n                this.box = element;\n                this.boxWrapper = boxWrapper;\n                renderer.alignedObjects = [];\n                // #24, #672, #1070\n                this.url = ((isFirefox || isWebKit) &&\n                    doc.getElementsByTagName('base').length) ?\n                    win.location.href\n                        .split('#')[0] // remove the hash\n                        .replace(/<[^>]*>/g, '') // wing cut HTML\n                        // escape parantheses and quotes\n                        .replace(/([\\('\\)])/g, '\\\\$1')\n                        // replace spaces (needed for Safari only)\n                        .replace(/ /g, '%20') :\n                    '';\n                // Add description\n                desc = this.createElement('desc').add();\n                desc.element.appendChild(doc.createTextNode('Created with Highcharts 8.1.2'));\n                renderer.defs = this.createElement('defs').add();\n                renderer.allowHTML = allowHTML;\n                renderer.forExport = forExport;\n                renderer.styledMode = styledMode;\n                renderer.gradients = {}; // Object where gradient SvgElements are stored\n                renderer.cache = {}; // Cache for numerical bounding boxes\n                renderer.cacheKeys = [];\n                renderer.imgCount = 0;\n                renderer.setSize(width, height, false);\n                // Issue 110 workaround:\n                // In Firefox, if a div is positioned by percentage, its pixel position\n                // may land between pixels. The container itself doesn't display this,\n                // but an SVG element inside this container will be drawn at subpixel\n                // precision. In order to draw sharp lines, this must be compensated\n                // for. This doesn't seem to work inside iframes though (like in\n                // jsFiddle).\n                var subPixelFix,\n                    rect;\n                if (isFirefox && container.getBoundingClientRect) {\n                    subPixelFix = function () {\n                        css(container, { left: 0, top: 0 });\n                        rect = container.getBoundingClientRect();\n                        css(container, {\n                            left: (Math.ceil(rect.left) - rect.left) + 'px',\n                            top: (Math.ceil(rect.top) - rect.top) + 'px'\n                        });\n                    };\n                    // run the fix now\n                    subPixelFix();\n                    // run it on resize\n                    renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n                }\n            };\n            /**\n             * General method for adding a definition to the SVG `defs` tag. Can be used\n             * for gradients, fills, filters etc. Styled mode only. A hook for adding\n             * general definitions to the SVG's defs tag. Definitions can be referenced\n             * from the CSS by its `id`. Read more in\n             * [gradients, shadows and patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n             * Styled mode only.\n             *\n             * @function Highcharts.SVGRenderer#definition\n             *\n             * @param {Highcharts.SVGDefinitionObject} def\n             * A serialized form of an SVG definition, including children.\n             *\n             * @return {Highcharts.SVGElement}\n             * The inserted node.\n             */\n            SVGRenderer.prototype.definition = function (def) {\n                var ren = this;\n                /**\n                 * @private\n                 * @param {Highcharts.SVGDefinitionObject} config - SVG definition\n                 * @param {Highcharts.SVGElement} [parent] - parent node\n                 */\n                function recurse(config, parent) {\n                    var ret;\n                    splat(config).forEach(function (item) {\n                        var node = ren.createElement(item.tagName),\n                            attr = {};\n                        // Set attributes\n                        objectEach(item, function (val, key) {\n                            if (key !== 'tagName' &&\n                                key !== 'children' &&\n                                key !== 'textContent') {\n                                attr[key] = val;\n                            }\n                        });\n                        node.attr(attr);\n                        // Add to the tree\n                        node.add(parent || ren.defs);\n                        // Add text content\n                        if (item.textContent) {\n                            node.element.appendChild(doc.createTextNode(item.textContent));\n                        }\n                        // Recurse\n                        recurse(item.children || [], node);\n                        ret = node;\n                    });\n                    // Return last node added (on top level it's the only one)\n                    return ret;\n                }\n                return recurse(def);\n            };\n            /**\n             * Get the global style setting for the renderer.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#getStyle\n             *\n             * @param {Highcharts.CSSObject} style\n             * Style settings.\n             *\n             * @return {Highcharts.CSSObject}\n             * The style settings mixed with defaults.\n             */\n            SVGRenderer.prototype.getStyle = function (style) {\n                this.style = extend({\n                    fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", ' +\n                        'Arial, Helvetica, sans-serif',\n                    fontSize: '12px'\n                }, style);\n                return this.style;\n            };\n            /**\n             * Apply the global style on the renderer, mixed with the default styles.\n             *\n             * @function Highcharts.SVGRenderer#setStyle\n             *\n             * @param {Highcharts.CSSObject} style\n             * CSS to apply.\n             */\n            SVGRenderer.prototype.setStyle = function (style) {\n                this.boxWrapper.css(this.getStyle(style));\n            };\n            /**\n             * Detect whether the renderer is hidden. This happens when one of the\n             * parent elements has `display: none`. Used internally to detect when we\n             * needto render preliminarily in another div to get the text bounding boxes\n             * right.\n             *\n             * @function Highcharts.SVGRenderer#isHidden\n             *\n             * @return {boolean}\n             * True if it is hidden.\n             */\n            SVGRenderer.prototype.isHidden = function () {\n                return !this.boxWrapper.getBBox().width;\n            };\n            /**\n             * Destroys the renderer and its allocated members.\n             *\n             * @function Highcharts.SVGRenderer#destroy\n             *\n             * @return {null}\n             */\n            SVGRenderer.prototype.destroy = function () {\n                var renderer = this,\n                    rendererDefs = renderer.defs;\n                renderer.box = null;\n                renderer.boxWrapper = renderer.boxWrapper.destroy();\n                // Call destroy on all gradient elements\n                destroyObjectProperties(renderer.gradients || {});\n                renderer.gradients = null;\n                // Defs are null in VMLRenderer\n                // Otherwise, destroy them here.\n                if (rendererDefs) {\n                    renderer.defs = rendererDefs.destroy();\n                }\n                // Remove sub pixel fix handler (#982)\n                if (renderer.unSubPixelFix) {\n                    renderer.unSubPixelFix();\n                }\n                renderer.alignedObjects = null;\n                return null;\n            };\n            /**\n             * Create a wrapper for an SVG element. Serves as a factory for\n             * {@link SVGElement}, but this function is itself mostly called from\n             * primitive factories like {@link SVGRenderer#path}, {@link\n             * SVGRenderer#rect} or {@link SVGRenderer#text}.\n             *\n             * @function Highcharts.SVGRenderer#createElement\n             *\n             * @param {string} nodeName\n             * The node name, for example `rect`, `g` etc.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated SVGElement.\n             */\n            SVGRenderer.prototype.createElement = function (nodeName) {\n                var wrapper = new this.Element();\n                wrapper.init(this, nodeName);\n                return wrapper;\n            };\n            /**\n             * Get converted radial gradient attributes according to the radial\n             * reference. Used internally from the {@link SVGElement#colorGradient}\n             * function.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#getRadialAttr\n             */\n            SVGRenderer.prototype.getRadialAttr = function (radialReference, gradAttr) {\n                return {\n                    cx: (radialReference[0] - radialReference[2] / 2) +\n                        gradAttr.cx * radialReference[2],\n                    cy: (radialReference[1] - radialReference[2] / 2) +\n                        gradAttr.cy * radialReference[2],\n                    r: gradAttr.r * radialReference[2]\n                };\n            };\n            /**\n             * Truncate the text node contents to a given length. Used when the css\n             * width is set. If the `textOverflow` is `ellipsis`, the text is truncated\n             * character by character to the given length. If not, the text is\n             * word-wrapped line by line.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#truncate\n             *\n             * @return {boolean}\n             * True if tspan is too long.\n             */\n            SVGRenderer.prototype.truncate = function (wrapper, tspan, text, words, startAt, width, getString) {\n                var renderer = this,\n                    rotation = wrapper.rotation,\n                    str, \n                    // Word wrap can not be truncated to shorter than one word, ellipsis\n                    // text can be completely blank.\n                    minIndex = words ? 1 : 0,\n                    maxIndex = (text || words).length,\n                    currentIndex = maxIndex, \n                    // Cache the lengths to avoid checking the same twice\n                    lengths = [],\n                    updateTSpan = function (s) {\n                        if (tspan.firstChild) {\n                            tspan.removeChild(tspan.firstChild);\n                    }\n                    if (s) {\n                        tspan.appendChild(doc.createTextNode(s));\n                    }\n                }, getSubStringLength = function (charEnd, concatenatedEnd) {\n                    // charEnd is useed when finding the character-by-character\n                    // break for ellipsis, concatenatedEnd is used for word-by-word\n                    // break for word wrapping.\n                    var end = concatenatedEnd || charEnd;\n                    if (typeof lengths[end] === 'undefined') {\n                        // Modern browsers\n                        if (tspan.getSubStringLength) {\n                            // Fails with DOM exception on unit-tests/legend/members\n                            // of unknown reason. Desired width is 0, text content\n                            // is \"5\" and end is 1.\n                            try {\n                                lengths[end] = startAt +\n                                    tspan.getSubStringLength(0, words ? end + 1 : end);\n                            }\n                            catch (e) {\n                                '';\n                            }\n                            // Legacy\n                        }\n                        else if (renderer.getSpanWidth) { // #9058 jsdom\n                            updateTSpan(getString(text || words, charEnd));\n                            lengths[end] = startAt +\n                                renderer.getSpanWidth(wrapper, tspan);\n                        }\n                    }\n                    return lengths[end];\n                }, actualWidth, truncated;\n                wrapper.rotation = 0; // discard rotation when computing box\n                actualWidth = getSubStringLength(tspan.textContent.length);\n                truncated = startAt + actualWidth > width;\n                if (truncated) {\n                    // Do a binary search for the index where to truncate the text\n                    while (minIndex <= maxIndex) {\n                        currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n                        // When checking words for word-wrap, we need to build the\n                        // string and measure the subStringLength at the concatenated\n                        // word length.\n                        if (words) {\n                            str = getString(words, currentIndex);\n                        }\n                        actualWidth = getSubStringLength(currentIndex, str && str.length - 1);\n                        if (minIndex === maxIndex) {\n                            // Complete\n                            minIndex = maxIndex + 1;\n                        }\n                        else if (actualWidth > width) {\n                            // Too large. Set max index to current.\n                            maxIndex = currentIndex - 1;\n                        }\n                        else {\n                            // Within width. Set min index to current.\n                            minIndex = currentIndex;\n                        }\n                    }\n                    // If max index was 0 it means the shortest possible text was also\n                    // too large. For ellipsis that means only the ellipsis, while for\n                    // word wrap it means the whole first word.\n                    if (maxIndex === 0) {\n                        // Remove ellipsis\n                        updateTSpan('');\n                        // If the new text length is one less than the original, we don't\n                        // need the ellipsis\n                    }\n                    else if (!(text && maxIndex === text.length - 1)) {\n                        updateTSpan(str || getString(text || words, currentIndex));\n                    }\n                }\n                // When doing line wrapping, prepare for the next line by removing the\n                // items from this line.\n                if (words) {\n                    words.splice(0, currentIndex);\n                }\n                wrapper.actualWidth = actualWidth;\n                wrapper.rotation = rotation; // Apply rotation again.\n                return truncated;\n            };\n            /**\n             * Parse a simple HTML string into SVG tspans. Called internally when text\n             * is set on an SVGElement. The function supports a subset of HTML tags, CSS\n             * text features like `width`, `text-overflow`, `white-space`, and also\n             * attributes like `href` and `style`.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#buildText\n             *\n             * @param {Highcharts.SVGElement} wrapper\n             * The parent SVGElement.\n             */\n            SVGRenderer.prototype.buildText = function (wrapper) {\n                var textNode = wrapper.element, renderer = this, forExport = renderer.forExport, textStr = pick(wrapper.textStr, '').toString(), hasMarkup = textStr.indexOf('<') !== -1, lines, childNodes = textNode.childNodes, truncated, parentX = attr(textNode, 'x'), textStyles = wrapper.styles, width = wrapper.textWidth, textLineHeight = textStyles && textStyles.lineHeight, textOutline = textStyles && textStyles.textOutline, ellipsis = textStyles && textStyles.textOverflow === 'ellipsis', noWrap = textStyles && textStyles.whiteSpace === 'nowrap', fontSize = textStyles && textStyles.fontSize, textCache, isSubsequentLine, i = childNodes.length, tempParent = width && !wrapper.added && this.box, getLineHeight = function (tspan) {\n                        var fontSizeStyle;\n                    if (!renderer.styledMode) {\n                        fontSizeStyle =\n                            /(px|em)$/.test(tspan && tspan.style.fontSize) ?\n                                tspan.style.fontSize :\n                                (fontSize || renderer.style.fontSize || 12);\n                    }\n                    return textLineHeight ?\n                        pInt(textLineHeight) :\n                        renderer.fontMetrics(fontSizeStyle, \n                        // Get the computed size from parent if not explicit\n                        (tspan.getAttribute('style') ? tspan : textNode)).h;\n                }, unescapeEntities = function (inputStr, except) {\n                    objectEach(renderer.escapes, function (value, key) {\n                        if (!except || except.indexOf(value) === -1) {\n                            inputStr = inputStr.toString().replace(new RegExp(value, 'g'), key);\n                        }\n                    });\n                    return inputStr;\n                }, parseAttribute = function (s, attr) {\n                    var start,\n                        delimiter;\n                    start = s.indexOf('<');\n                    s = s.substring(start, s.indexOf('>') - start);\n                    start = s.indexOf(attr + '=');\n                    if (start !== -1) {\n                        start = start + attr.length + 1;\n                        delimiter = s.charAt(start);\n                        if (delimiter === '\"' || delimiter === \"'\") { // eslint-disable-line quotes\n                            s = s.substring(start + 1);\n                            return s.substring(0, s.indexOf(delimiter));\n                        }\n                    }\n                };\n                var regexMatchBreaks = /<br.*?>/g;\n                // The buildText code is quite heavy, so if we're not changing something\n                // that affects the text, skip it (#6113).\n                textCache = [\n                    textStr,\n                    ellipsis,\n                    noWrap,\n                    textLineHeight,\n                    textOutline,\n                    fontSize,\n                    width\n                ].join(',');\n                if (textCache === wrapper.textCache) {\n                    return;\n                }\n                wrapper.textCache = textCache;\n                // Remove old text\n                while (i--) {\n                    textNode.removeChild(childNodes[i]);\n                }\n                // Skip tspans, add text directly to text node. The forceTSpan is a hook\n                // used in text outline hack.\n                if (!hasMarkup &&\n                    !textOutline &&\n                    !ellipsis &&\n                    !width &&\n                    (textStr.indexOf(' ') === -1 ||\n                        (noWrap && !regexMatchBreaks.test(textStr)))) {\n                    textNode.appendChild(doc.createTextNode(unescapeEntities(textStr)));\n                    // Complex strings, add more logic\n                }\n                else {\n                    if (tempParent) {\n                        // attach it to the DOM to read offset width\n                        tempParent.appendChild(textNode);\n                    }\n                    if (hasMarkup) {\n                        lines = renderer.styledMode ? (textStr\n                            .replace(/<(b|strong)>/g, '<span class=\"highcharts-strong\">')\n                            .replace(/<(i|em)>/g, '<span class=\"highcharts-emphasized\">')) : (textStr\n                            .replace(/<(b|strong)>/g, '<span style=\"font-weight:bold\">')\n                            .replace(/<(i|em)>/g, '<span style=\"font-style:italic\">'));\n                        lines = lines\n                            .replace(/<a/g, '<span')\n                            .replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\n                            .split(regexMatchBreaks);\n                    }\n                    else {\n                        lines = [textStr];\n                    }\n                    // Trim empty lines (#5261)\n                    lines = lines.filter(function (line) {\n                        return line !== '';\n                    });\n                    // build the lines\n                    lines.forEach(function (line, lineNo) {\n                        var spans,\n                            spanNo = 0,\n                            lineLength = 0;\n                        line = line\n                            // Trim to prevent useless/costly process on the spaces\n                            // (#5258)\n                            .replace(/^\\s+|\\s+$/g, '')\n                            .replace(/<span/g, '|||<span')\n                            .replace(/<\\/span>/g, '</span>|||');\n                        spans = line.split('|||');\n                        spans.forEach(function buildTextSpans(span) {\n                            if (span !== '' || spans.length === 1) {\n                                var attributes = {},\n                                    tspan = doc.createElementNS(renderer.SVG_NS, 'tspan'),\n                                    a,\n                                    classAttribute,\n                                    styleAttribute, // #390\n                                    hrefAttribute;\n                                classAttribute = parseAttribute(span, 'class');\n                                if (classAttribute) {\n                                    attr(tspan, 'class', classAttribute);\n                                }\n                                styleAttribute = parseAttribute(span, 'style');\n                                if (styleAttribute) {\n                                    styleAttribute = styleAttribute.replace(/(;| |^)color([ :])/, '$1fill$2');\n                                    attr(tspan, 'style', styleAttribute);\n                                }\n                                // For anchors, wrap the tspan in an <a> tag and apply\n                                // the href attribute as is (#13559). Not for export\n                                // (#1529)\n                                hrefAttribute = parseAttribute(span, 'href');\n                                if (hrefAttribute && !forExport) {\n                                    if (\n                                    // Stop JavaScript links, vulnerable to XSS\n                                    hrefAttribute.split(':')[0].toLowerCase()\n                                        .indexOf('javascript') === -1) {\n                                        a = doc.createElementNS(renderer.SVG_NS, 'a');\n                                        attr(a, 'href', hrefAttribute);\n                                        attr(tspan, 'class', 'highcharts-anchor');\n                                        a.appendChild(tspan);\n                                        if (!renderer.styledMode) {\n                                            css(tspan, { cursor: 'pointer' });\n                                        }\n                                    }\n                                }\n                                // Strip away unsupported HTML tags (#7126)\n                                span = unescapeEntities(span.replace(/<[a-zA-Z\\/](.|\\n)*?>/g, '') || ' ');\n                                // Nested tags aren't supported, and cause crash in\n                                // Safari (#1596)\n                                if (span !== ' ') {\n                                    // add the text node\n                                    tspan.appendChild(doc.createTextNode(span));\n                                    // First span in a line, align it to the left\n                                    if (!spanNo) {\n                                        if (lineNo && parentX !== null) {\n                                            attributes.x = parentX;\n                                        }\n                                    }\n                                    else {\n                                        attributes.dx = 0; // #16\n                                    }\n                                    // add attributes\n                                    attr(tspan, attributes);\n                                    // Append it\n                                    textNode.appendChild(a || tspan);\n                                    // first span on subsequent line, add the line\n                                    // height\n                                    if (!spanNo && isSubsequentLine) {\n                                        // allow getting the right offset height in\n                                        // exporting in IE\n                                        if (!svg && forExport) {\n                                            css(tspan, { display: 'block' });\n                                        }\n                                        // Set the line height based on the font size of\n                                        // either the text element or the tspan element\n                                        attr(tspan, 'dy', getLineHeight(tspan));\n                                    }\n                                    // Check width and apply soft breaks or ellipsis\n                                    if (width) {\n                                        var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n                                            hasWhiteSpace = !noWrap && (spans.length > 1 ||\n                                                lineNo ||\n                                                words.length > 1),\n                                            wrapLineNo = 0,\n                                            dy = getLineHeight(tspan);\n                                        if (ellipsis) {\n                                            truncated = renderer.truncate(wrapper, tspan, span, void 0, 0, \n                                            // Target width\n                                            Math.max(0, \n                                            // Substract the font face to make\n                                            // room for the ellipsis itself\n                                            width - parseInt(fontSize || 12, 10)), \n                                            // Build the text to test for\n                                            function (text, currentIndex) {\n                                                return text.substring(0, currentIndex) + '\\u2026';\n                                            });\n                                        }\n                                        else if (hasWhiteSpace) {\n                                            while (words.length) {\n                                                // For subsequent lines, create tspans\n                                                // with the same style attributes as the\n                                                // parent text node.\n                                                if (words.length &&\n                                                    !noWrap &&\n                                                    wrapLineNo > 0) {\n                                                    tspan = doc.createElementNS(SVG_NS, 'tspan');\n                                                    attr(tspan, {\n                                                        dy: dy,\n                                                        x: parentX\n                                                    });\n                                                    if (styleAttribute) { // #390\n                                                        attr(tspan, 'style', styleAttribute);\n                                                    }\n                                                    // Start by appending the full\n                                                    // remaining text\n                                                    tspan.appendChild(doc.createTextNode(words.join(' ')\n                                                        .replace(/- /g, '-')));\n                                                    textNode.appendChild(tspan);\n                                                }\n                                                // For each line, truncate the remaining\n                                                // words into the line length.\n                                                renderer.truncate(wrapper, tspan, null, words, wrapLineNo === 0 ? lineLength : 0, width, \n                                                // Build the text to test for\n                                                function (text, currentIndex) {\n                                                    return words\n                                                        .slice(0, currentIndex)\n                                                        .join(' ')\n                                                        .replace(/- /g, '-');\n                                                });\n                                                lineLength = wrapper.actualWidth;\n                                                wrapLineNo++;\n                                            }\n                                        }\n                                    }\n                                    spanNo++;\n                                }\n                            }\n                        });\n                        // To avoid beginning lines that doesn't add to the textNode\n                        // (#6144)\n                        isSubsequentLine = (isSubsequentLine ||\n                            textNode.childNodes.length);\n                    });\n                    if (ellipsis && truncated) {\n                        wrapper.attr('title', unescapeEntities(wrapper.textStr || '', ['&lt;', '&gt;']) // #7179\n                        );\n                    }\n                    if (tempParent) {\n                        tempParent.removeChild(textNode);\n                    }\n                    // Apply the text outline\n                    if (isString(textOutline) && wrapper.applyTextOutline) {\n                        wrapper.applyTextOutline(textOutline);\n                    }\n                }\n            };\n            /**\n             * Returns white for dark colors and black for bright colors.\n             *\n             * @function Highcharts.SVGRenderer#getContrast\n             *\n             * @param {Highcharts.ColorString} rgba\n             * The color to get the contrast for.\n             *\n             * @return {Highcharts.ColorString}\n             * The contrast color, either `#000000` or `#FFFFFF`.\n             */\n            SVGRenderer.prototype.getContrast = function (rgba) {\n                rgba = Color.parse(rgba).rgba;\n                // The threshold may be discussed. Here's a proposal for adding\n                // different weight to the color channels (#6216)\n                rgba[0] *= 1; // red\n                rgba[1] *= 1.2; // green\n                rgba[2] *= 0.5; // blue\n                return rgba[0] + rgba[1] + rgba[2] >\n                    1.8 * 255 ?\n                    '#000000' :\n                    '#FFFFFF';\n            };\n            /**\n             * Create a button with preset states.\n             *\n             * @function Highcharts.SVGRenderer#button\n             *\n             * @param {string} text\n             * The text or HTML to draw.\n             *\n             * @param {number} x\n             * The x position of the button's left side.\n             *\n             * @param {number} y\n             * The y position of the button's top side.\n             *\n             * @param {Highcharts.EventCallbackFunction<Highcharts.SVGElement>} callback\n             * The function to execute on button click or touch.\n             *\n             * @param {Highcharts.SVGAttributes} [normalState]\n             * SVG attributes for the normal state.\n             *\n             * @param {Highcharts.SVGAttributes} [hoverState]\n             * SVG attributes for the hover state.\n             *\n             * @param {Highcharts.SVGAttributes} [pressedState]\n             * SVG attributes for the pressed state.\n             *\n             * @param {Highcharts.SVGAttributes} [disabledState]\n             * SVG attributes for the disabled state.\n             *\n             * @param {Highcharts.SymbolKeyValue} [shape=rect]\n             * The shape type.\n             *\n             * @param {boolean} [useHTML=false]\n             * Wether to use HTML to render the label.\n             *\n             * @return {Highcharts.SVGElement}\n             * The button element.\n             */\n            SVGRenderer.prototype.button = function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape, useHTML) {\n                var label = this.label(text,\n                    x,\n                    y,\n                    shape,\n                    void 0,\n                    void 0,\n                    useHTML,\n                    void 0, 'button'),\n                    curState = 0,\n                    styledMode = this.styledMode,\n                    userNormalStyle = normalState && normalState.style || {};\n                // Remove stylable attributes\n                if (normalState && normalState.style) {\n                    delete normalState.style;\n                }\n                // Default, non-stylable attributes\n                label.attr(merge({ padding: 8, r: 2 }, normalState));\n                if (!styledMode) {\n                    // Presentational\n                    var normalStyle,\n                        hoverStyle,\n                        pressedStyle,\n                        disabledStyle;\n                    // Normal state - prepare the attributes\n                    normalState = merge({\n                        fill: '#f7f7f7',\n                        stroke: '#cccccc',\n                        'stroke-width': 1,\n                        style: {\n                            color: '#333333',\n                            cursor: 'pointer',\n                            fontWeight: 'normal'\n                        }\n                    }, {\n                        style: userNormalStyle\n                    }, normalState);\n                    normalStyle = normalState.style;\n                    delete normalState.style;\n                    // Hover state\n                    hoverState = merge(normalState, {\n                        fill: '#e6e6e6'\n                    }, hoverState);\n                    hoverStyle = hoverState.style;\n                    delete hoverState.style;\n                    // Pressed state\n                    pressedState = merge(normalState, {\n                        fill: '#e6ebf5',\n                        style: {\n                            color: '#000000',\n                            fontWeight: 'bold'\n                        }\n                    }, pressedState);\n                    pressedStyle = pressedState.style;\n                    delete pressedState.style;\n                    // Disabled state\n                    disabledState = merge(normalState, {\n                        style: {\n                            color: '#cccccc'\n                        }\n                    }, disabledState);\n                    disabledStyle = disabledState.style;\n                    delete disabledState.style;\n                }\n                // Add the events. IE9 and IE10 need mouseover and mouseout to funciton\n                // (#667).\n                addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {\n                    if (curState !== 3) {\n                        label.setState(1);\n                    }\n                });\n                addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {\n                    if (curState !== 3) {\n                        label.setState(curState);\n                    }\n                });\n                label.setState = function (state) {\n                    // Hover state is temporary, don't record it\n                    if (state !== 1) {\n                        label.state = curState = state;\n                    }\n                    // Update visuals\n                    label\n                        .removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n                        .addClass('highcharts-button-' +\n                        ['normal', 'hover', 'pressed', 'disabled'][state || 0]);\n                    if (!styledMode) {\n                        label\n                            .attr([\n                            normalState,\n                            hoverState,\n                            pressedState,\n                            disabledState\n                        ][state || 0])\n                            .css([\n                            normalStyle,\n                            hoverStyle,\n                            pressedStyle,\n                            disabledStyle\n                        ][state || 0]);\n                    }\n                };\n                // Presentational attributes\n                if (!styledMode) {\n                    label\n                        .attr(normalState)\n                        .css(extend({ cursor: 'default' }, normalStyle));\n                }\n                return label\n                    .on('click', function (e) {\n                    if (curState !== 3) {\n                        callback.call(label, e);\n                    }\n                });\n            };\n            /**\n             * Make a straight line crisper by not spilling out to neighbour pixels.\n             *\n             * @function Highcharts.SVGRenderer#crispLine\n             *\n             * @param {Highcharts.SVGPathArray} points\n             *        The original points on the format `[['M', 0, 0], ['L', 100, 0]]`.\n             *\n             * @param {number} width\n             *        The width of the line.\n             *\n             * @param {string} roundingFunction\n             *        The rounding function name on the `Math` object, can be one of\n             *        `round`, `floor` or `ceil`.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The original points array, but modified to render crisply.\n             */\n            SVGRenderer.prototype.crispLine = function (points, width, roundingFunction) {\n                if (roundingFunction === void 0) { roundingFunction = 'round'; }\n                var start = points[0];\n                var end = points[1];\n                // Normalize to a crisp line\n                if (start[1] === end[1]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave\n                    // the same.\n                    start[1] = end[1] =\n                        Math[roundingFunction](start[1]) - (width % 2 / 2);\n                }\n                if (start[2] === end[2]) {\n                    start[2] = end[2] =\n                        Math[roundingFunction](start[2]) + (width % 2 / 2);\n                }\n                return points;\n            };\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             *\n             * @sample highcharts/members/renderer-path-on-chart/\n             *         Draw a path in a chart\n             * @sample highcharts/members/renderer-path/\n             *         Draw a path independent from a chart\n             *\n             * @example\n             * var path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n             *     .attr({ stroke: '#ff00ff' })\n             *     .add();\n             *\n             * @function Highcharts.SVGRenderer#path\n             *\n             * @param {Highcharts.SVGPathArray} [path]\n             * An SVG path definition in array form.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             *\n             */ /**\n            * Draw a path, wraps the SVG `path` element.\n            *\n            * @function Highcharts.SVGRenderer#path\n            *\n            * @param {Highcharts.SVGAttributes} [attribs]\n            * The initial attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.path = function (path) {\n                var attribs = (this.styledMode ? {} : {\n                        fill: 'none'\n                    });\n                if (isArray(path)) {\n                    attribs.d = path;\n                }\n                else if (isObject(path)) { // attributes\n                    extend(attribs, path);\n                }\n                return this.createElement('path').attr(attribs);\n            };\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             *\n             * @sample highcharts/members/renderer-circle/\n             *         Drawing a circle\n             *\n             * @function Highcharts.SVGRenderer#circle\n             *\n             * @param {number} [x]\n             * The center x position.\n             *\n             * @param {number} [y]\n             * The center y position.\n             *\n             * @param {number} [r]\n             * The radius.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw a circle, wraps the SVG `circle` element.\n            *\n            * @function Highcharts.SVGRenderer#circle\n            *\n            * @param {Highcharts.SVGAttributes} [attribs]\n            * The initial attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.circle = function (x, y, r) {\n                var attribs = (isObject(x) ?\n                        x :\n                        typeof x === 'undefined' ? {} : { x: x, y: y, r: r }), wrapper = this.createElement('circle');\n                // Setting x or y translates to cx and cy\n                wrapper.xSetter = wrapper.ySetter = function (value, key, element) {\n                    element.setAttribute('c' + key, value);\n                };\n                return wrapper.attr(attribs);\n            };\n            /**\n             * Draw and return an arc.\n             *\n             * @sample highcharts/members/renderer-arc/\n             *         Drawing an arc\n             *\n             * @function Highcharts.SVGRenderer#arc\n             *\n             * @param {number} [x=0]\n             * Center X position.\n             *\n             * @param {number} [y=0]\n             * Center Y position.\n             *\n             * @param {number} [r=0]\n             * The outer radius' of the arc.\n             *\n             * @param {number} [innerR=0]\n             * Inner radius like used in donut charts.\n             *\n             * @param {number} [start=0]\n             * The starting angle of the arc in radians, where 0 is to the right and\n             * `-Math.PI/2` is up.\n             *\n             * @param {number} [end=0]\n             * The ending angle of the arc in radians, where 0 is to the right and\n             * `-Math.PI/2` is up.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw and return an arc. Overloaded function that takes arguments object.\n            *\n            * @function Highcharts.SVGRenderer#arc\n            *\n            * @param {Highcharts.SVGAttributes} attribs\n            * Initial SVG attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.arc = function (x, y, r, innerR, start, end) {\n                var arc,\n                    options;\n                if (isObject(x)) {\n                    options = x;\n                    y = options.y;\n                    r = options.r;\n                    innerR = options.innerR;\n                    start = options.start;\n                    end = options.end;\n                    x = options.x;\n                }\n                else {\n                    options = {\n                        innerR: innerR,\n                        start: start,\n                        end: end\n                    };\n                }\n                // Arcs are defined as symbols for the ability to set\n                // attributes in attr and animate\n                arc = this.symbol('arc', x, y, r, r, options);\n                arc.r = r; // #959\n                return arc;\n            };\n            /**\n             * Draw and return a rectangle.\n             *\n             * @function Highcharts.SVGRenderer#rect\n             *\n             * @param {number} [x]\n             * Left position.\n             *\n             * @param {number} [y]\n             * Top position.\n             *\n             * @param {number} [width]\n             * Width of the rectangle.\n             *\n             * @param {number} [height]\n             * Height of the rectangle.\n             *\n             * @param {number} [r]\n             * Border corner radius.\n             *\n             * @param {number} [strokeWidth]\n             * A stroke width can be supplied to allow crisp drawing.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw and return a rectangle.\n            *\n            * @sample highcharts/members/renderer-rect-on-chart/\n            *         Draw a rectangle in a chart\n            * @sample highcharts/members/renderer-rect/\n            *         Draw a rectangle independent from a chart\n            *\n            * @function Highcharts.SVGRenderer#rect\n            *\n            * @param {Highcharts.SVGAttributes} [attributes]\n            * General SVG attributes for the rectangle.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.rect = function (x, y, width, height, r, strokeWidth) {\n                r = isObject(x) ? x.r : r;\n                var wrapper = this.createElement('rect'),\n                    attribs = isObject(x) ?\n                        x :\n                        typeof x === 'undefined' ?\n                            {} :\n                            {\n                                x: x,\n                                y: y,\n                                width: Math.max(width, 0),\n                                height: Math.max(height, 0)\n                            };\n                if (!this.styledMode) {\n                    if (typeof strokeWidth !== 'undefined') {\n                        attribs.strokeWidth = strokeWidth;\n                        attribs = wrapper.crisp(attribs);\n                    }\n                    attribs.fill = 'none';\n                }\n                if (r) {\n                    attribs.r = r;\n                }\n                wrapper.rSetter = function (value, key, element) {\n                    wrapper.r = value;\n                    attr(element, {\n                        rx: value,\n                        ry: value\n                    });\n                };\n                wrapper.rGetter = function () {\n                    return wrapper.r;\n                };\n                return wrapper.attr(attribs);\n            };\n            /**\n             * Resize the {@link SVGRenderer#box} and re-align all aligned child\n             * elements.\n             *\n             * @sample highcharts/members/renderer-g/\n             *         Show and hide grouped objects\n             *\n             * @function Highcharts.SVGRenderer#setSize\n             *\n             * @param {number} width\n             * The new pixel width.\n             *\n             * @param {number} height\n             * The new pixel height.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animate=true]\n             * Whether and how to animate.\n             */\n            SVGRenderer.prototype.setSize = function (width, height, animate) {\n                var renderer = this,\n                    alignedObjects = renderer.alignedObjects,\n                    i = alignedObjects.length;\n                renderer.width = width;\n                renderer.height = height;\n                renderer.boxWrapper.animate({\n                    width: width,\n                    height: height\n                }, {\n                    step: function () {\n                        this.attr({\n                            viewBox: '0 0 ' + this.attr('width') + ' ' +\n                                this.attr('height')\n                        });\n                    },\n                    duration: pick(animate, true) ? void 0 : 0\n                });\n                while (i--) {\n                    alignedObjects[i].align();\n                }\n            };\n            /**\n             * Create and return an svg group element. Child\n             * {@link Highcharts.SVGElement} objects are added to the group by using the\n             * group as the first parameter in {@link Highcharts.SVGElement#add|add()}.\n             *\n             * @function Highcharts.SVGRenderer#g\n             *\n             * @param {string} [name]\n             *        The group will be given a class name of `highcharts-{name}`. This\n             *        can be used for styling and scripting.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             */\n            SVGRenderer.prototype.g = function (name) {\n                var elem = this.createElement('g');\n                return name ?\n                    elem.attr({ 'class': 'highcharts-' + name }) :\n                    elem;\n            };\n            /**\n             * Display an image.\n             *\n             * @sample highcharts/members/renderer-image-on-chart/\n             *         Add an image in a chart\n             * @sample highcharts/members/renderer-image/\n             *         Add an image independent of a chart\n             *\n             * @function Highcharts.SVGRenderer#image\n             *\n             * @param {string} src\n             *        The image source.\n             *\n             * @param {number} [x]\n             *        The X position.\n             *\n             * @param {number} [y]\n             *        The Y position.\n             *\n             * @param {number} [width]\n             *        The image width. If omitted, it defaults to the image file width.\n             *\n             * @param {number} [height]\n             *        The image height. If omitted it defaults to the image file\n             *        height.\n             *\n             * @param {Function} [onload]\n             *        Event handler for image load.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             */\n            SVGRenderer.prototype.image = function (src, x, y, width, height, onload) {\n                var attribs = { preserveAspectRatio: 'none' }, elemWrapper, dummy, setSVGImageSource = function (el, src) {\n                        // Set the href in the xlink namespace\n                        if (el.setAttributeNS) {\n                            el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', src);\n                    }\n                    else {\n                        // could be exporting in IE\n                        // using href throws \"not supported\" in ie7 and under,\n                        // requries regex shim to fix later\n                        el.setAttribute('hc-svg-href', src);\n                    }\n                }, onDummyLoad = function (e) {\n                    setSVGImageSource(elemWrapper.element, src);\n                    onload.call(elemWrapper, e);\n                };\n                // optional properties\n                if (arguments.length > 1) {\n                    extend(attribs, {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                }\n                elemWrapper = this.createElement('image').attr(attribs);\n                // Add load event if supplied\n                if (onload) {\n                    // We have to use a dummy HTML image since IE support for SVG image\n                    // load events is very buggy. First set a transparent src, wait for\n                    // dummy to load, and then add the real src to the SVG image.\n                    setSVGImageSource(elemWrapper.element, 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' /* eslint-disable-line */);\n                    dummy = new win.Image();\n                    addEvent(dummy, 'load', onDummyLoad);\n                    dummy.src = src;\n                    if (dummy.complete) {\n                        onDummyLoad({});\n                    }\n                }\n                else {\n                    setSVGImageSource(elemWrapper.element, src);\n                }\n                return elemWrapper;\n            };\n            /**\n             * Draw a symbol out of pre-defined shape paths from\n             * {@link SVGRenderer#symbols}.\n             * It is used in Highcharts for point makers, which cake a `symbol` option,\n             * and label and button backgrounds like in the tooltip and stock flags.\n             *\n             * @function Highcharts.SVGRenderer#symbol\n             *\n             * @param {string} symbol\n             * The symbol name.\n             *\n             * @param {number} [x]\n             * The X coordinate for the top left position.\n             *\n             * @param {number} [y]\n             * The Y coordinate for the top left position.\n             *\n             * @param {number} [width]\n             * The pixel width.\n             *\n             * @param {number} [height]\n             * The pixel height.\n             *\n             * @param {Highcharts.SymbolOptionsObject} [options]\n             * Additional options, depending on the actual symbol drawn.\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            SVGRenderer.prototype.symbol = function (symbol, x, y, width, height, options) {\n                var ren = this,\n                    obj,\n                    imageRegex = /^url\\((.*?)\\)$/,\n                    isImage = imageRegex.test(symbol),\n                    sym = (!isImage && (this.symbols[symbol] ? symbol : 'circle')), \n                    // get the symbol definition function\n                    symbolFn = (sym && this.symbols[sym]),\n                    path,\n                    imageSrc,\n                    centerImage;\n                if (symbolFn) {\n                    // Check if there's a path defined for this symbol\n                    if (typeof x === 'number') {\n                        path = symbolFn.call(this.symbols, Math.round(x || 0), Math.round(y || 0), width || 0, height || 0, options);\n                    }\n                    obj = this.path(path);\n                    if (!ren.styledMode) {\n                        obj.attr('fill', 'none');\n                    }\n                    // expando properties for use in animate and attr\n                    extend(obj, {\n                        symbolName: sym,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                    if (options) {\n                        extend(obj, options);\n                    }\n                    // Image symbols\n                }\n                else if (isImage) {\n                    imageSrc = symbol.match(imageRegex)[1];\n                    // Create the image synchronously, add attribs async\n                    obj = this.image(imageSrc);\n                    // The image width is not always the same as the symbol width. The\n                    // image may be centered within the symbol, as is the case when\n                    // image shapes are used as label backgrounds, for example in flags.\n                    obj.imgwidth = pick(symbolSizes[imageSrc] && symbolSizes[imageSrc].width, options && options.width);\n                    obj.imgheight = pick(symbolSizes[imageSrc] && symbolSizes[imageSrc].height, options && options.height);\n                    /**\n                     * Set the size and position\n                     */\n                    centerImage = function () {\n                        obj.attr({\n                            width: obj.width,\n                            height: obj.height\n                        });\n                    };\n                    /**\n                     * Width and height setters that take both the image's physical size\n                     * and the label size into consideration, and translates the image\n                     * to center within the label.\n                     */\n                    ['width', 'height'].forEach(function (key) {\n                        obj[key + 'Setter'] = function (value, key) {\n                            var attribs = {}, imgSize = this['img' + key], trans = key === 'width' ? 'translateX' : 'translateY';\n                            this[key] = value;\n                            if (defined(imgSize)) {\n                                // Scale and center the image within its container.\n                                // The name `backgroundSize` is taken from the CSS spec,\n                                // but the value `within` is made up. Other possible\n                                // values in the spec, `cover` and `contain`, can be\n                                // implemented if needed.\n                                if (options &&\n                                    options.backgroundSize === 'within' &&\n                                    this.width &&\n                                    this.height) {\n                                    imgSize = Math.round(imgSize * Math.min(this.width / this.imgwidth, this.height / this.imgheight));\n                                }\n                                if (this.element) {\n                                    this.element.setAttribute(key, imgSize);\n                                }\n                                if (!this.alignByTranslate) {\n                                    attribs[trans] = ((this[key] || 0) - imgSize) / 2;\n                                    this.attr(attribs);\n                                }\n                            }\n                        };\n                    });\n                    if (defined(x)) {\n                        obj.attr({\n                            x: x,\n                            y: y\n                        });\n                    }\n                    obj.isImg = true;\n                    if (defined(obj.imgwidth) && defined(obj.imgheight)) {\n                        centerImage();\n                    }\n                    else {\n                        // Initialize image to be 0 size so export will still function\n                        // if there's no cached sizes.\n                        obj.attr({ width: 0, height: 0 });\n                        // Create a dummy JavaScript image to get the width and height.\n                        createElement('img', {\n                            onload: function () {\n                                var chart = charts[ren.chartIndex];\n                                // Special case for SVGs on IE11, the width is not\n                                // accessible until the image is part of the DOM\n                                // (#2854).\n                                if (this.width === 0) {\n                                    css(this, {\n                                        position: 'absolute',\n                                        top: '-999em'\n                                    });\n                                    doc.body.appendChild(this);\n                                }\n                                // Center the image\n                                symbolSizes[imageSrc] = {\n                                    width: this.width,\n                                    height: this.height\n                                };\n                                obj.imgwidth = this.width;\n                                obj.imgheight = this.height;\n                                if (obj.element) {\n                                    centerImage();\n                                }\n                                // Clean up after #2854 workaround.\n                                if (this.parentNode) {\n                                    this.parentNode.removeChild(this);\n                                }\n                                // Fire the load event when all external images are\n                                // loaded\n                                ren.imgCount--;\n                                if (!ren.imgCount && chart && !chart.hasLoaded) {\n                                    chart.onload();\n                                }\n                            },\n                            src: imageSrc\n                        });\n                        this.imgCount++;\n                    }\n                }\n                return obj;\n            };\n            /**\n             * Define a clipping rectangle. The clipping rectangle is later applied\n             * to {@link SVGElement} objects through the {@link SVGElement#clip}\n             * function.\n             *\n             * @example\n             * var circle = renderer.circle(100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .add();\n             * var clipRect = renderer.clipRect(100, 100, 100, 100);\n             *\n             * // Leave only the lower right quarter visible\n             * circle.clip(clipRect);\n             *\n             * @function Highcharts.SVGRenderer#clipRect\n             *\n             * @param {number} [x]\n             *\n             * @param {number} [y]\n             *\n             * @param {number} [width]\n             *\n             * @param {number} [height]\n             *\n             * @return {Highcharts.ClipRectElement}\n             *         A clipping rectangle.\n             */\n            SVGRenderer.prototype.clipRect = function (x, y, width, height) {\n                var wrapper, \n                    // Add a hyphen at the end to avoid confusion in testing indexes\n                    // -1 and -10, -11 etc (#6550)\n                    id = uniqueKey() + '-', clipPath = this.createElement('clipPath').attr({\n                        id: id\n                    }).add(this.defs);\n                wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n                wrapper.id = id;\n                wrapper.clipPath = clipPath;\n                wrapper.count = 0;\n                return wrapper;\n            };\n            /**\n             * Draw text. The text can contain a subset of HTML, like spans and anchors\n             * and some basic text styling of these. For more advanced features like\n             * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n             * To update the text after render, run `text.attr({ text: 'New text' })`.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Annotate the chart freely\n             * @sample highcharts/members/renderer-on-chart/\n             *         Annotate with a border and in response to the data\n             * @sample highcharts/members/renderer-text/\n             *         Formatted text\n             *\n             * @function Highcharts.SVGRenderer#text\n             *\n             * @param {string} [str]\n             * The text of (subset) HTML to draw.\n             *\n             * @param {number} [x]\n             * The x position of the text's lower left corner.\n             *\n             * @param {number} [y]\n             * The y position of the text's lower left corner.\n             *\n             * @param {boolean} [useHTML=false]\n             * Use HTML to render the text.\n             *\n             * @return {Highcharts.SVGElement}\n             * The text object.\n             */\n            SVGRenderer.prototype.text = function (str, x, y, useHTML) {\n                // declare variables\n                var renderer = this,\n                    wrapper,\n                    attribs = {};\n                if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n                    return renderer.html(str, x, y);\n                }\n                attribs.x = Math.round(x || 0); // X always needed for line-wrap logic\n                if (y) {\n                    attribs.y = Math.round(y);\n                }\n                if (defined(str)) {\n                    attribs.text = str;\n                }\n                wrapper = renderer.createElement('text')\n                    .attr(attribs);\n                if (!useHTML) {\n                    wrapper.xSetter = function (value, key, element) {\n                        var tspans = element.getElementsByTagName('tspan'),\n                            tspan,\n                            parentVal = element.getAttribute(key),\n                            i;\n                        for (i = 0; i < tspans.length; i++) {\n                            tspan = tspans[i];\n                            // If the x values are equal, the tspan represents a\n                            // linebreak\n                            if (tspan.getAttribute(key) === parentVal) {\n                                tspan.setAttribute(key, value);\n                            }\n                        }\n                        element.setAttribute(key, value);\n                    };\n                }\n                return wrapper;\n            };\n            /**\n             * Utility to return the baseline offset and total line height from the font\n             * size.\n             *\n             * @function Highcharts.SVGRenderer#fontMetrics\n             *\n             * @param {number|string} [fontSize]\n             *        The current font size to inspect. If not given, the font size\n             *        will be found from the DOM element.\n             *\n             * @param {Highcharts.SVGElement|Highcharts.SVGDOMElement} [elem]\n             *        The element to inspect for a current font size.\n             *\n             * @return {Highcharts.FontMetricsObject}\n             *         The font metrics.\n             */\n            SVGRenderer.prototype.fontMetrics = function (fontSize, elem) {\n                var lineHeight,\n                    baseline;\n                if ((this.styledMode || !/px/.test(fontSize)) &&\n                    win.getComputedStyle // old IE doesn't support it\n                ) {\n                    fontSize = elem && SVGElement.prototype.getStyle.call(elem, 'font-size');\n                }\n                else {\n                    fontSize = fontSize ||\n                        // When the elem is a DOM element (#5932)\n                        (elem && elem.style && elem.style.fontSize) ||\n                        // Fall back on the renderer style default\n                        (this.style && this.style.fontSize);\n                }\n                // Handle different units\n                if (/px/.test(fontSize)) {\n                    fontSize = pInt(fontSize);\n                }\n                else {\n                    fontSize = 12;\n                }\n                // Empirical values found by comparing font size and bounding box\n                // height. Applies to the default font family.\n                // https://jsfiddle.net/highcharts/7xvn7/\n                lineHeight = fontSize < 24 ? fontSize + 3 : Math.round(fontSize * 1.2);\n                baseline = Math.round(lineHeight * 0.8);\n                return {\n                    h: lineHeight,\n                    b: baseline,\n                    f: fontSize\n                };\n            };\n            /**\n             * Correct X and Y positioning of a label for rotation (#1764).\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#rotCorr\n             *\n             * @param {number} baseline\n             *\n             * @param {number} rotation\n             *\n             * @param {boolean} [alterY]\n             *\n             * @param {Highcharts.PositionObject}\n             */\n            SVGRenderer.prototype.rotCorr = function (baseline, rotation, alterY) {\n                var y = baseline;\n                if (rotation && alterY) {\n                    y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n                }\n                return {\n                    x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n                    y: y\n                };\n            };\n            /**\n             * Compatibility function to convert the legacy one-dimensional path array\n             * into an array of segments.\n             *\n             * It is used in maps to parse the `path` option, and in SVGRenderer.dSetter\n             * to support legacy paths from demos.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#pathToSegments\n             */\n            SVGRenderer.prototype.pathToSegments = function (path) {\n                var ret = [];\n                var segment = [];\n                var commandLength = {\n                        A: 8,\n                        C: 7,\n                        H: 2,\n                        L: 3,\n                        M: 3,\n                        Q: 5,\n                        S: 5,\n                        T: 3,\n                        V: 2\n                    };\n                // Short, non-typesafe parsing of the one-dimensional array. It splits\n                // the path on any string. This is not type checked against the tuple\n                // types, but is shorter, and doesn't require specific checks for any\n                // command type in SVG.\n                for (var i = 0; i < path.length; i++) {\n                    // Command skipped, repeat previous or insert L/l for M/m\n                    if (isString(segment[0]) &&\n                        isNumber(path[i]) &&\n                        segment.length === commandLength[(segment[0].toUpperCase())]) {\n                        path.splice(i, 0, segment[0].replace('M', 'L').replace('m', 'l'));\n                    }\n                    // Split on string\n                    if (typeof path[i] === 'string') {\n                        if (segment.length) {\n                            ret.push(segment.slice(0));\n                        }\n                        segment.length = 0;\n                    }\n                    segment.push(path[i]);\n                }\n                ret.push(segment.slice(0));\n                return ret;\n                /*\n                // Fully type-safe version where each tuple type is checked. The\n                // downside is filesize and a lack of flexibility for unsupported\n                // commands\n                const ret: SVGPath = [],\n                    commands = {\n                        A: 7,\n                        C: 6,\n                        H: 1,\n                        L: 2,\n                        M: 2,\n                        Q: 4,\n                        S: 4,\n                        T: 2,\n                        V: 1,\n                        Z: 0\n                    };\n\n                let i = 0,\n                    lastI = 0,\n                    lastCommand;\n\n                while (i < path.length) {\n                    const item = path[i];\n\n                    let command;\n\n                    if (typeof item === 'string') {\n                        command = item;\n                        i += 1;\n                    } else {\n                        command = lastCommand || 'M';\n                    }\n\n                    // Upper case\n                    const commandUC = command.toUpperCase();\n\n                    if (commandUC in commands) {\n\n                        // No numeric parameters\n                        if (command === 'Z' || command === 'z') {\n                            ret.push([command]);\n\n                        // One numeric parameter\n                        } else {\n                            const val0 = path[i];\n                            if (typeof val0 === 'number') {\n\n                                // Horizontal line to\n                                if (command === 'H' || command === 'h') {\n                                    ret.push([command, val0]);\n                                    i += 1;\n\n                                // Vertical line to\n                                } else if (command === 'V' || command === 'v') {\n                                    ret.push([command, val0]);\n                                    i += 1;\n\n                                // Two numeric parameters\n                                } else {\n                                    const val1 = path[i + 1];\n                                    if (typeof val1 === 'number') {\n                                        // lineTo\n                                        if (command === 'L' || command === 'l') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // moveTo\n                                        } else if (command === 'M' || command === 'm') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // Smooth quadratic bezier\n                                        } else if (command === 'T' || command === 't') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // Four numeric parameters\n                                        } else {\n                                            const val2 = path[i + 2],\n                                                val3 = path[i + 3];\n                                            if (\n                                                typeof val2 === 'number' &&\n                                                typeof val3 === 'number'\n                                            ) {\n                                                // Quadratic bezier to\n                                                if (\n                                                    command === 'Q' ||\n                                                    command === 'q'\n                                                ) {\n                                                    ret.push([\n                                                        command,\n                                                        val0,\n                                                        val1,\n                                                        val2,\n                                                        val3\n                                                    ]);\n                                                    i += 4;\n\n                                                // Smooth cubic bezier to\n                                                } else if (\n                                                    command === 'S' ||\n                                                    command === 's'\n                                                ) {\n                                                    ret.push([\n                                                        command,\n                                                        val0,\n                                                        val1,\n                                                        val2,\n                                                        val3\n                                                    ]);\n                                                    i += 4;\n\n                                                // Six numeric parameters\n                                                } else {\n                                                    const val4 = path[i + 4],\n                                                        val5 = path[i + 5];\n\n                                                    if (\n                                                        typeof val4 === 'number' &&\n                                                        typeof val5 === 'number'\n                                                    ) {\n                                                        // Curve to\n                                                        if (\n                                                            command === 'C' ||\n                                                            command === 'c'\n                                                        ) {\n                                                            ret.push([\n                                                                command,\n                                                                val0,\n                                                                val1,\n                                                                val2,\n                                                                val3,\n                                                                val4,\n                                                                val5\n                                                            ]);\n                                                            i += 6;\n\n                                                        // Seven numeric parameters\n                                                        } else {\n                                                            const val6 = path[i + 6];\n\n                                                            // Arc to\n                                                            if (\n                                                                typeof val6 ===\n                                                                'number' &&\n                                                                (\n                                                                    command === 'A' ||\n                                                                    command === 'a'\n                                                                )\n                                                            ) {\n                                                                ret.push([\n                                                                    command,\n                                                                    val0,\n                                                                    val1,\n                                                                    val2,\n                                                                    val3,\n                                                                    val4,\n                                                                    val5,\n                                                                    val6\n                                                                ]);\n                                                                i += 7;\n\n                                                            }\n\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n\n                                }\n                            }\n                        }\n                    }\n\n                    // An unmarked command following a moveTo is a lineTo\n                    lastCommand = command === 'M' ? 'L' : command;\n\n                    if (i === lastI) {\n                        break;\n                    }\n                    lastI = i;\n                }\n                return ret;\n                */\n            };\n            /**\n             * Draw a label, which is an extended text element with support for border\n             * and background. Highcharts creates a `g` element with a text and a `path`\n             * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n             * background are set through `stroke`, `stroke-width` and `fill` attributes\n             * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n             * text after render, run `label.attr({ text: 'New text' })`.\n             *\n             * @sample highcharts/members/renderer-label-on-chart/\n             *         A label on the chart\n             *\n             * @function Highcharts.SVGRenderer#label\n             *\n             * @param {string} str\n             *        The initial text string or (subset) HTML to render.\n             *\n             * @param {number} x\n             *        The x position of the label's left side.\n             *\n             * @param {number} [y]\n             *        The y position of the label's top side or baseline, depending on\n             *        the `baseline` parameter.\n             *\n             * @param {string} [shape='rect']\n             *        The shape of the label's border/background, if any. Defaults to\n             *        `rect`. Other possible values are `callout` or other shapes\n             *        defined in {@link Highcharts.SVGRenderer#symbols}.\n             *\n             * @param {number} [anchorX]\n             *        In case the `shape` has a pointer, like a flag, this is the\n             *        coordinates it should be pinned to.\n             *\n             * @param {number} [anchorY]\n             *        In case the `shape` has a pointer, like a flag, this is the\n             *        coordinates it should be pinned to.\n             *\n             * @param {boolean} [useHTML=false]\n             *        Wether to use HTML to render the label.\n             *\n             * @param {boolean} [baseline=false]\n             *        Whether to position the label relative to the text baseline,\n             *        like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n             *        upper border of the rectangle.\n             *\n             * @param {string} [className]\n             *        Class name for the group.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated label.\n             */\n            SVGRenderer.prototype.label = function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n                return new SVGLabel(this, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className);\n            };\n            return SVGRenderer;\n        }());\n        /**\n         * A pointer to the renderer's associated Element class. The VMLRenderer\n         * will have a pointer to VMLElement here.\n         *\n         * @name Highcharts.SVGRenderer#Element\n         * @type {Highcharts.SVGElement}\n         */\n        SVGRenderer.prototype.Element = SVGElement;\n        /**\n         * @private\n         */\n        SVGRenderer.prototype.SVG_NS = SVG_NS;\n        /**\n         * Dummy function for plugins, called every time the renderer is updated.\n         * Prior to Highcharts 5, this was used for the canvg renderer.\n         *\n         * @deprecated\n         * @function Highcharts.SVGRenderer#draw\n         */\n        SVGRenderer.prototype.draw = noop;\n        /**\n         * A collection of characters mapped to HTML entities. When `useHTML` on an\n         * element is true, these entities will be rendered correctly by HTML. In\n         * the SVG pseudo-HTML, they need to be unescaped back to simple characters,\n         * so for example `&lt;` will render as `<`.\n         *\n         * @example\n         * // Add support for unescaping quotes\n         * Highcharts.SVGRenderer.prototype.escapes['\"'] = '&quot;';\n         *\n         * @name Highcharts.SVGRenderer#escapes\n         * @type {Highcharts.Dictionary<string>}\n         */\n        SVGRenderer.prototype.escapes = {\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            \"'\": '&#39;',\n            '\"': '&quot;'\n        };\n        /**\n         * An extendable collection of functions for defining symbol paths.\n         *\n         * @name Highcharts.SVGRenderer#symbols\n         * @type {Highcharts.SymbolDictionary}\n         */\n        SVGRenderer.prototype.symbols = {\n            circle: function (x, y, w, h) {\n                // Return a full arc\n                return this.arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n                    start: Math.PI * 0.5,\n                    end: Math.PI * 2.5,\n                    open: false\n                });\n            },\n            square: function (x, y, w, h) {\n                return [\n                    ['M', x, y],\n                    ['L', x + w, y],\n                    ['L', x + w, y + h],\n                    ['L', x, y + h],\n                    ['Z']\n                ];\n            },\n            triangle: function (x, y, w, h) {\n                return [\n                    ['M', x + w / 2, y],\n                    ['L', x + w, y + h],\n                    ['L', x, y + h],\n                    ['Z']\n                ];\n            },\n            'triangle-down': function (x, y, w, h) {\n                return [\n                    ['M', x, y],\n                    ['L', x + w, y],\n                    ['L', x + w / 2, y + h],\n                    ['Z']\n                ];\n            },\n            diamond: function (x, y, w, h) {\n                return [\n                    ['M', x + w / 2, y],\n                    ['L', x + w, y + h / 2],\n                    ['L', x + w / 2, y + h],\n                    ['L', x, y + h / 2],\n                    ['Z']\n                ];\n            },\n            arc: function (x, y, w, h, options) {\n                var arc = [];\n                if (options) {\n                    var start = options.start || 0,\n                        end = options.end || 0,\n                        rx = options.r || w,\n                        ry = options.r || h || w,\n                        proximity = 0.001,\n                        fullCircle = Math.abs(end - start - 2 * Math.PI) <\n                            proximity, \n                        // Substract a small number to prevent cos and sin of start and\n                        // end from becoming equal on 360 arcs (related: #1561)\n                        end = end - proximity,\n                        innerRadius = options.innerR,\n                        open = pick(options.open,\n                        fullCircle),\n                        cosStart = Math.cos(start),\n                        sinStart = Math.sin(start),\n                        cosEnd = Math.cos(end),\n                        sinEnd = Math.sin(end), \n                        // Proximity takes care of rounding errors around PI (#6971)\n                        longArc = pick(options.longArc,\n                        end - start - Math.PI < proximity ? 0 : 1);\n                    arc.push([\n                        'M',\n                        x + rx * cosStart,\n                        y + ry * sinStart\n                    ], [\n                        'A',\n                        rx,\n                        ry,\n                        0,\n                        longArc,\n                        pick(options.clockwise, 1),\n                        x + rx * cosEnd,\n                        y + ry * sinEnd\n                    ]);\n                    if (defined(innerRadius)) {\n                        arc.push(open ?\n                            [\n                                'M',\n                                x + innerRadius * cosEnd,\n                                y + innerRadius * sinEnd\n                            ] : [\n                            'L',\n                            x + innerRadius * cosEnd,\n                            y + innerRadius * sinEnd\n                        ], [\n                            'A',\n                            innerRadius,\n                            innerRadius,\n                            0,\n                            longArc,\n                            // Clockwise - opposite to the outer arc clockwise\n                            defined(options.clockwise) ? 1 - options.clockwise : 0,\n                            x + innerRadius * cosStart,\n                            y + innerRadius * sinStart\n                        ]);\n                    }\n                    if (!open) {\n                        arc.push(['Z']);\n                    }\n                }\n                return arc;\n            },\n            /**\n             * Callout shape used for default tooltips, also used for rounded\n             * rectangles in VML\n             */\n            callout: function (x, y, w, h, options) {\n                var arrowLength = 6,\n                    halfDistance = 6,\n                    r = Math.min((options && options.r) || 0,\n                    w,\n                    h),\n                    safeDistance = r + halfDistance,\n                    anchorX = options && options.anchorX || 0,\n                    anchorY = options && options.anchorY || 0,\n                    path;\n                path = [\n                    ['M', x + r, y],\n                    ['L', x + w - r, y],\n                    ['C', x + w, y, x + w, y, x + w, y + r],\n                    ['L', x + w, y + h - r],\n                    ['C', x + w, y + h, x + w, y + h, x + w - r, y + h],\n                    ['L', x + r, y + h],\n                    ['C', x, y + h, x, y + h, x, y + h - r],\n                    ['L', x, y + r],\n                    ['C', x, y, x, y, x + r, y] // top-left corner\n                ];\n                // Anchor on right side\n                if (anchorX && anchorX > w) {\n                    // Chevron\n                    if (anchorY > y + safeDistance &&\n                        anchorY < y + h - safeDistance) {\n                        path.splice(3, 1, ['L', x + w, anchorY - halfDistance], ['L', x + w + arrowLength, anchorY], ['L', x + w, anchorY + halfDistance], ['L', x + w, y + h - r]);\n                        // Simple connector\n                    }\n                    else {\n                        path.splice(3, 1, ['L', x + w, h / 2], ['L', anchorX, anchorY], ['L', x + w, h / 2], ['L', x + w, y + h - r]);\n                    }\n                    // Anchor on left side\n                }\n                else if (anchorX && anchorX < 0) {\n                    // Chevron\n                    if (anchorY > y + safeDistance &&\n                        anchorY < y + h - safeDistance) {\n                        path.splice(7, 1, ['L', x, anchorY + halfDistance], ['L', x - arrowLength, anchorY], ['L', x, anchorY - halfDistance], ['L', x, y + r]);\n                        // Simple connector\n                    }\n                    else {\n                        path.splice(7, 1, ['L', x, h / 2], ['L', anchorX, anchorY], ['L', x, h / 2], ['L', x, y + r]);\n                    }\n                }\n                else if ( // replace bottom\n                anchorY &&\n                    anchorY > h &&\n                    anchorX > x + safeDistance &&\n                    anchorX < x + w - safeDistance) {\n                    path.splice(5, 1, ['L', anchorX + halfDistance, y + h], ['L', anchorX, y + h + arrowLength], ['L', anchorX - halfDistance, y + h], ['L', x + r, y + h]);\n                }\n                else if ( // replace top\n                anchorY &&\n                    anchorY < 0 &&\n                    anchorX > x + safeDistance &&\n                    anchorX < x + w - safeDistance) {\n                    path.splice(1, 1, ['L', anchorX - halfDistance, y], ['L', anchorX, y - arrowLength], ['L', anchorX + halfDistance, y], ['L', w - r, y]);\n                }\n                return path;\n            }\n        };\n        H.SVGRenderer = SVGRenderer;\n        H.Renderer = H.SVGRenderer;\n\n        return H.Renderer;\n    });\n    _registerModule(_modules, 'parts/Html.js', [_modules['parts/Globals.js'], _modules['parts/SVGElement.js'], _modules['parts/SVGRenderer.js'], _modules['parts/Utilities.js']], function (H, SVGElement, SVGRenderer, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            pick = U.pick,\n            pInt = U.pInt;\n        var isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            win = H.win;\n        /* eslint-disable valid-jsdoc */\n        // Extend SvgElement for useHTML option.\n        extend(SVGElement.prototype, /** @lends SVGElement.prototype */ {\n            /**\n             * Apply CSS to HTML elements. This is used in text within SVG rendering and\n             * by the VML renderer\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlCss\n             *\n             * @param {Highcharts.CSSObject} styles\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            htmlCss: function (styles) {\n                var wrapper = this,\n                    element = wrapper.element, \n                    // When setting or unsetting the width style, we need to update\n                    // transform (#8809)\n                    isSettingWidth = (element.tagName === 'SPAN' &&\n                        styles &&\n                        'width' in styles),\n                    textWidth = pick(isSettingWidth && styles.width,\n                    void 0),\n                    doTransform;\n                if (isSettingWidth) {\n                    delete styles.width;\n                    wrapper.textWidth = textWidth;\n                    doTransform = true;\n                }\n                if (styles && styles.textOverflow === 'ellipsis') {\n                    styles.whiteSpace = 'nowrap';\n                    styles.overflow = 'hidden';\n                }\n                wrapper.styles = extend(wrapper.styles, styles);\n                css(wrapper.element, styles);\n                // Now that all styles are applied, to the transform\n                if (doTransform) {\n                    wrapper.htmlUpdateTransform();\n                }\n                return wrapper;\n            },\n            /**\n             * VML and useHTML method for calculating the bounding box based on offsets.\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlGetBBox\n             *\n             * @param {boolean} refresh\n             *        Whether to force a fresh value from the DOM or to use the cached\n             *        value.\n             *\n             * @return {Highcharts.BBoxObject}\n             *         A hash containing values for x, y, width and height.\n             */\n            htmlGetBBox: function () {\n                var wrapper = this,\n                    element = wrapper.element;\n                return {\n                    x: element.offsetLeft,\n                    y: element.offsetTop,\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                };\n            },\n            /**\n             * VML override private method to update elements based on internal\n             * properties based on SVG transform.\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlUpdateTransform\n             * @return {void}\n             */\n            htmlUpdateTransform: function () {\n                // aligning non added elements is expensive\n                if (!this.added) {\n                    this.alignOnAdd = true;\n                    return;\n                }\n                var wrapper = this,\n                    renderer = wrapper.renderer,\n                    elem = wrapper.element,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    x = wrapper.x || 0,\n                    y = wrapper.y || 0,\n                    align = wrapper.textAlign || 'left',\n                    alignCorrection = {\n                        left: 0,\n                    center: 0.5,\n                    right: 1\n                    }[align],\n                    styles = wrapper.styles,\n                    whiteSpace = styles && styles.whiteSpace;\n                /**\n                 * @private\n                 * @return {number}\n                 */\n                function getTextPxLength() {\n                    // Reset multiline/ellipsis in order to read width (#4928,\n                    // #5417)\n                    css(elem, {\n                        width: '',\n                        whiteSpace: whiteSpace || 'nowrap'\n                    });\n                    return elem.offsetWidth;\n                }\n                // apply translate\n                css(elem, {\n                    marginLeft: translateX,\n                    marginTop: translateY\n                });\n                if (!renderer.styledMode && wrapper.shadows) { // used in labels/tooltip\n                    wrapper.shadows.forEach(function (shadow) {\n                        css(shadow, {\n                            marginLeft: translateX + 1,\n                            marginTop: translateY + 1\n                        });\n                    });\n                }\n                // apply inversion\n                if (wrapper.inverted) { // wrapper is a group\n                    [].forEach.call(elem.childNodes, function (child) {\n                        renderer.invertChild(child, elem);\n                    });\n                }\n                if (elem.tagName === 'SPAN') {\n                    var rotation = wrapper.rotation, baseline, textWidth = wrapper.textWidth && pInt(wrapper.textWidth), currentTextTransform = [\n                            rotation,\n                            align,\n                            elem.innerHTML,\n                            wrapper.textWidth,\n                            wrapper.textAlign\n                        ].join(',');\n                    // Update textWidth. Use the memoized textPxLength if possible, to\n                    // avoid the getTextPxLength function using elem.offsetWidth.\n                    // Calling offsetWidth affects rendering time as it forces layout\n                    // (#7656).\n                    if (textWidth !== wrapper.oldTextWidth &&\n                        ((textWidth > wrapper.oldTextWidth) ||\n                            (wrapper.textPxLength || getTextPxLength()) > textWidth) && (\n                    // Only set the width if the text is able to word-wrap, or\n                    // text-overflow is ellipsis (#9537)\n                    /[ \\-]/.test(elem.textContent || elem.innerText) ||\n                        elem.style.textOverflow === 'ellipsis')) { // #983, #1254\n                        css(elem, {\n                            width: textWidth + 'px',\n                            display: 'block',\n                            whiteSpace: whiteSpace || 'normal' // #3331\n                        });\n                        wrapper.oldTextWidth = textWidth;\n                        wrapper.hasBoxWidthChanged = true; // #8159\n                    }\n                    else {\n                        wrapper.hasBoxWidthChanged = false; // #8159\n                    }\n                    // Do the calculations and DOM access only if properties changed\n                    if (currentTextTransform !== wrapper.cTT) {\n                        baseline = renderer.fontMetrics(elem.style.fontSize, elem).b;\n                        // Renderer specific handling of span rotation, but only if we\n                        // have something to update.\n                        if (defined(rotation) &&\n                            ((rotation !== (wrapper.oldRotation || 0)) ||\n                                (align !== wrapper.oldAlign))) {\n                            wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n                        }\n                        wrapper.getSpanCorrection(\n                        // Avoid elem.offsetWidth if we can, it affects rendering\n                        // time heavily (#7656)\n                        ((!defined(rotation) && wrapper.textPxLength) || // #7920\n                            elem.offsetWidth), baseline, alignCorrection, rotation, align);\n                    }\n                    // apply position with correction\n                    css(elem, {\n                        left: (x + (wrapper.xCorr || 0)) + 'px',\n                        top: (y + (wrapper.yCorr || 0)) + 'px'\n                    });\n                    // record current text transform\n                    wrapper.cTT = currentTextTransform;\n                    wrapper.oldRotation = rotation;\n                    wrapper.oldAlign = align;\n                }\n            },\n            /**\n             * Set the rotation of an individual HTML span.\n             *\n             * @private\n             * @function Highcharts.SVGElement#setSpanRotation\n             * @param {number} rotation\n             * @param {number} alignCorrection\n             * @param {number} baseline\n             * @return {void}\n             */\n            setSpanRotation: function (rotation, alignCorrection, baseline) {\n                var rotationStyle = {},\n                    cssTransformKey = this.renderer.getTransformKey();\n                rotationStyle[cssTransformKey] = rotationStyle.transform =\n                    'rotate(' + rotation + 'deg)';\n                rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] =\n                    rotationStyle.transformOrigin =\n                        (alignCorrection * 100) + '% ' + baseline + 'px';\n                css(this.element, rotationStyle);\n            },\n            /**\n             * Get the correction in X and Y positioning as the element is rotated.\n             *\n             * @private\n             * @function Highcharts.SVGElement#getSpanCorrection\n             * @param {number} width\n             * @param {number} baseline\n             * @param {number} alignCorrection\n             * @return {void}\n             */\n            getSpanCorrection: function (width, baseline, alignCorrection) {\n                this.xCorr = -width * alignCorrection;\n                this.yCorr = -baseline;\n            }\n        });\n        // Extend SvgRenderer for useHTML option.\n        extend(SVGRenderer.prototype, /** @lends SVGRenderer.prototype */ {\n            /**\n             * @private\n             * @function Highcharts.SVGRenderer#getTransformKey\n             *\n             * @return {string}\n             */\n            getTransformKey: function () {\n                return isMS && !/Edge/.test(win.navigator.userAgent) ?\n                    '-ms-transform' :\n                    isWebKit ?\n                        '-webkit-transform' :\n                        isFirefox ?\n                            'MozTransform' :\n                            win.opera ?\n                                '-o-transform' :\n                                '';\n            },\n            /**\n             * Create HTML text node. This is used by the VML renderer as well as the\n             * SVG renderer through the useHTML option.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#html\n             *\n             * @param {string} str\n             *        The text of (subset) HTML to draw.\n             *\n             * @param {number} x\n             *        The x position of the text's lower left corner.\n             *\n             * @param {number} y\n             *        The y position of the text's lower left corner.\n             *\n             * @return {Highcharts.HTMLDOMElement}\n             */\n            html: function (str, x, y) {\n                var wrapper = this.createElement('span'), element = wrapper.element, renderer = wrapper.renderer, isSVG = renderer.isSVG, addSetters = function (gWrapper, style) {\n                        // These properties are set as attributes on the SVG group, and\n                        // as identical CSS properties on the div. (#3542)\n                        ['opacity', 'visibility'].forEach(function (prop) {\n                            gWrapper[prop + 'Setter'] = function (value, key, elem) {\n                                var styleObject = gWrapper.div ?\n                                    gWrapper.div.style :\n                                    style;\n                            SVGElement.prototype[prop + 'Setter']\n                                .call(this, value, key, elem);\n                            if (styleObject) {\n                                styleObject[key] = value;\n                            }\n                        };\n                    });\n                    gWrapper.addedSetters = true;\n                };\n                // Text setter\n                wrapper.textSetter = function (value) {\n                    if (value !== element.innerHTML) {\n                        delete this.bBox;\n                        delete this.oldTextWidth;\n                    }\n                    this.textStr = value;\n                    element.innerHTML = pick(value, '');\n                    wrapper.doTransform = true;\n                };\n                // Add setters for the element itself (#4938)\n                if (isSVG) { // #4938, only for HTML within SVG\n                    addSetters(wrapper, wrapper.element.style);\n                }\n                // Various setters which rely on update transform\n                wrapper.xSetter =\n                    wrapper.ySetter =\n                        wrapper.alignSetter =\n                            wrapper.rotationSetter =\n                                function (value, key) {\n                                    if (key === 'align') {\n                                        // Do not overwrite the SVGElement.align method. Same as VML.\n                                        key = 'textAlign';\n                                    }\n                                    wrapper[key] = value;\n                                    wrapper.doTransform = true;\n                                };\n                // Runs at the end of .attr()\n                wrapper.afterSetters = function () {\n                    // Update transform. Do this outside the loop to prevent redundant\n                    // updating for batch setting of attributes.\n                    if (this.doTransform) {\n                        this.htmlUpdateTransform();\n                        this.doTransform = false;\n                    }\n                };\n                // Set the default attributes\n                wrapper\n                    .attr({\n                    text: str,\n                    x: Math.round(x),\n                    y: Math.round(y)\n                })\n                    .css({\n                    position: 'absolute'\n                });\n                if (!renderer.styledMode) {\n                    wrapper.css({\n                        fontFamily: this.style.fontFamily,\n                        fontSize: this.style.fontSize\n                    });\n                }\n                // Keep the whiteSpace style outside the wrapper.styles collection\n                element.style.whiteSpace = 'nowrap';\n                // Use the HTML specific .css method\n                wrapper.css = wrapper.htmlCss;\n                // This is specific for HTML within SVG\n                if (isSVG) {\n                    wrapper.add = function (svgGroupWrapper) {\n                        var htmlGroup,\n                            container = renderer.box.parentNode,\n                            parentGroup,\n                            parents = [];\n                        this.parentGroup = svgGroupWrapper;\n                        // Create a mock group to hold the HTML elements\n                        if (svgGroupWrapper) {\n                            htmlGroup = svgGroupWrapper.div;\n                            if (!htmlGroup) {\n                                // Read the parent chain into an array and read from top\n                                // down\n                                parentGroup = svgGroupWrapper;\n                                while (parentGroup) {\n                                    parents.push(parentGroup);\n                                    // Move up to the next parent group\n                                    parentGroup = parentGroup.parentGroup;\n                                }\n                                // Ensure dynamically updating position when any parent\n                                // is translated\n                                parents.reverse().forEach(function (parentGroup) {\n                                    var htmlGroupStyle,\n                                        cls = attr(parentGroup.element, 'class');\n                                    /**\n                                     * Common translate setter for X and Y on the HTML\n                                     * group. Reverted the fix for #6957 du to\n                                     * positioning problems and offline export (#7254,\n                                     * #7280, #7529)\n                                     * @private\n                                     * @param {*} value\n                                     * @param {string} key\n                                     * @return {void}\n                                     */\n                                    function translateSetter(value, key) {\n                                        parentGroup[key] = value;\n                                        if (key === 'translateX') {\n                                            htmlGroupStyle.left = value + 'px';\n                                        }\n                                        else {\n                                            htmlGroupStyle.top = value + 'px';\n                                        }\n                                        parentGroup.doTransform = true;\n                                    }\n                                    // Create a HTML div and append it to the parent div\n                                    // to emulate the SVG group structure\n                                    htmlGroup =\n                                        parentGroup.div =\n                                            parentGroup.div || createElement('div', cls ? { className: cls } : void 0, {\n                                                position: 'absolute',\n                                                left: (parentGroup.translateX || 0) + 'px',\n                                                top: (parentGroup.translateY || 0) + 'px',\n                                                display: parentGroup.display,\n                                                opacity: parentGroup.opacity,\n                                                pointerEvents: (parentGroup.styles &&\n                                                    parentGroup.styles.pointerEvents) // #5595\n                                                // the top group is appended to container\n                                            }, htmlGroup || container);\n                                    // Shortcut\n                                    htmlGroupStyle = htmlGroup.style;\n                                    // Set listeners to update the HTML div's position\n                                    // whenever the SVG group position is changed.\n                                    extend(parentGroup, {\n                                        // (#7287) Pass htmlGroup to use\n                                        // the related group\n                                        classSetter: (function (htmlGroup) {\n                                            return function (value) {\n                                                this.element.setAttribute('class', value);\n                                                htmlGroup.className = value;\n                                            };\n                                        }(htmlGroup)),\n                                        on: function () {\n                                            if (parents[0].div) { // #6418\n                                                wrapper.on.apply({ element: parents[0].div }, arguments);\n                                            }\n                                            return parentGroup;\n                                        },\n                                        translateXSetter: translateSetter,\n                                        translateYSetter: translateSetter\n                                    });\n                                    if (!parentGroup.addedSetters) {\n                                        addSetters(parentGroup);\n                                    }\n                                });\n                            }\n                        }\n                        else {\n                            htmlGroup = container;\n                        }\n                        htmlGroup.appendChild(element);\n                        // Shared with VML:\n                        wrapper.added = true;\n                        if (wrapper.alignOnAdd) {\n                            wrapper.htmlUpdateTransform();\n                        }\n                        return wrapper;\n                    };\n                }\n                return wrapper;\n            }\n        });\n\n    });\n    _registerModule(_modules, 'parts/Tick.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Optional parameters for the tick.\n         * @private\n         * @interface Highcharts.TickParametersObject\n         */ /**\n        * Set category for the tick.\n        * @name Highcharts.TickParametersObject#category\n        * @type {string|undefined}\n        */ /**\n        * @name Highcharts.TickParametersObject#options\n        * @type {Highcharts.Dictionary<any>|undefined}\n        */ /**\n        * Set tickmarkOffset for the tick.\n        * @name Highcharts.TickParametersObject#tickmarkOffset\n        * @type {number|undefined}\n        */\n        var clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        var deg2rad = H.deg2rad;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Tick class.\n         *\n         * @class\n         * @name Highcharts.Tick\n         *\n         * @param {Highcharts.Axis} axis\n         * The axis of the tick.\n         *\n         * @param {number} pos\n         * The position of the tick on the axis in terms of axis values.\n         *\n         * @param {string} [type]\n         * The type of tick, either 'minor' or an empty string\n         *\n         * @param {boolean} [noLabel=false]\n         * Whether to disable the label or not. Defaults to false.\n         *\n         * @param {object} [parameters]\n         * Optional parameters for the tick.\n         */\n        var Tick = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Tick(axis, pos, type, noLabel, parameters) {\n                    this.isNew = true;\n                this.isNewLabel = true;\n                /**\n                 * The related axis of the tick.\n                 * @name Highcharts.Tick#axis\n                 * @type {Highcharts.Axis}\n                 */\n                this.axis = axis;\n                /**\n                 * The logical position of the tick on the axis in terms of axis values.\n                 * @name Highcharts.Tick#pos\n                 * @type {number}\n                 */\n                this.pos = pos;\n                /**\n                 * The tick type, which can be `\"minor\"`, or an empty string.\n                 * @name Highcharts.Tick#type\n                 * @type {string}\n                 */\n                this.type = type || '';\n                this.parameters = parameters || {};\n                /**\n                 * The mark offset of the tick on the axis. Usually `undefined`, numeric\n                 * for grid axes.\n                 * @name Highcharts.Tick#tickmarkOffset\n                 * @type {number|undefined}\n                 */\n                this.tickmarkOffset = this.parameters.tickmarkOffset;\n                this.options = this.parameters.options;\n                fireEvent(this, 'init');\n                if (!type && !noLabel) {\n                    this.addLabel();\n                }\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Write the tick label.\n             *\n             * @private\n             * @function Highcharts.Tick#addLabel\n             * @return {void}\n             */\n            Tick.prototype.addLabel = function () {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    chart = axis.chart,\n                    categories = axis.categories,\n                    log = axis.logarithmic,\n                    names = axis.names,\n                    pos = tick.pos,\n                    labelOptions = pick(tick.options && tick.options.labels,\n                    options.labels),\n                    str,\n                    tickPositions = axis.tickPositions,\n                    isFirst = pos === tickPositions[0],\n                    isLast = pos === tickPositions[tickPositions.length - 1],\n                    value = this.parameters.category || (categories ?\n                        pick(categories[pos],\n                    names[pos],\n                    pos) :\n                        pos),\n                    label = tick.label,\n                    animateLabels = (!labelOptions.step || labelOptions.step === 1) &&\n                        axis.tickInterval === 1,\n                    tickPositionInfo = tickPositions.info,\n                    dateTimeLabelFormat,\n                    dateTimeLabelFormats,\n                    i,\n                    list;\n                // Set the datetime label format. If a higher rank is set for this\n                // position, use that. If not, use the general format.\n                if (axis.dateTime && tickPositionInfo) {\n                    dateTimeLabelFormats = chart.time.resolveDTLFormat(options.dateTimeLabelFormats[(!options.grid &&\n                        tickPositionInfo.higherRanks[pos]) ||\n                        tickPositionInfo.unitName]);\n                    dateTimeLabelFormat = dateTimeLabelFormats.main;\n                }\n                // set properties for access in render method\n                /**\n                 * True if the tick is the first one on the axis.\n                 * @name Highcharts.Tick#isFirst\n                 * @readonly\n                 * @type {boolean|undefined}\n                 */\n                tick.isFirst = isFirst;\n                /**\n                 * True if the tick is the last one on the axis.\n                 * @name Highcharts.Tick#isLast\n                 * @readonly\n                 * @type {boolean|undefined}\n                 */\n                tick.isLast = isLast;\n                // Get the string\n                tick.formatCtx = {\n                    axis: axis,\n                    chart: chart,\n                    isFirst: isFirst,\n                    isLast: isLast,\n                    dateTimeLabelFormat: dateTimeLabelFormat,\n                    tickPositionInfo: tickPositionInfo,\n                    value: log ? correctFloat(log.lin2log(value)) : value,\n                    pos: pos\n                };\n                str = axis.labelFormatter.call(tick.formatCtx, this.formatCtx);\n                // Set up conditional formatting based on the format list if existing.\n                list = dateTimeLabelFormats && dateTimeLabelFormats.list;\n                if (list) {\n                    tick.shortenLabel = function () {\n                        for (i = 0; i < list.length; i++) {\n                            label.attr({\n                                text: axis.labelFormatter.call(extend(tick.formatCtx, { dateTimeLabelFormat: list[i] }))\n                            });\n                            if (label.getBBox().width <\n                                axis.getSlotWidth(tick) - 2 *\n                                    pick(labelOptions.padding, 5)) {\n                                return;\n                            }\n                        }\n                        label.attr({\n                            text: ''\n                        });\n                    };\n                }\n                // Call only after first render\n                if (animateLabels && axis._addedPlotLB && axis.isXAxis) {\n                    tick.moveLabel(str, labelOptions);\n                }\n                // First call\n                if (!defined(label) && !tick.movedLabel) {\n                    /**\n                     * The rendered text label of the tick.\n                     * @name Highcharts.Tick#label\n                     * @type {Highcharts.SVGElement|undefined}\n                     */\n                    tick.label = label = tick.createLabel({ x: 0, y: 0 }, str, labelOptions);\n                    // Base value to detect change for new calls to getBBox\n                    tick.rotation = 0;\n                    // update\n                }\n                else if (label && label.textStr !== str && !animateLabels) {\n                    // When resetting text, also reset the width if dynamically set\n                    // (#8809)\n                    if (label.textWidth &&\n                        !(labelOptions.style && labelOptions.style.width) &&\n                        !label.styles.width) {\n                        label.css({ width: null });\n                    }\n                    label.attr({ text: str });\n                    label.textPxLength = label.getBBox().width;\n                }\n            };\n            /**\n             * Render and return the label of the tick.\n             *\n             * @private\n             * @function Highcharts.Tick#createLabel\n             * @param {Highcharts.PositionObject} xy\n             * @param {string} str\n             * @param {Highcharts.XAxisLabelsOptions} labelOptions\n             * @return {Highcharts.SVGElement|undefined}\n             */\n            Tick.prototype.createLabel = function (xy, str, labelOptions) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    label = defined(str) && labelOptions.enabled ?\n                        chart.renderer\n                            .text(str,\n                    xy.x,\n                    xy.y,\n                    labelOptions.useHTML)\n                            .add(axis.labelGroup) :\n                        null;\n                // Un-rotated length\n                if (label) {\n                    // Without position absolute, IE export sometimes is wrong\n                    if (!chart.styledMode) {\n                        label.css(merge(labelOptions.style));\n                    }\n                    label.textPxLength = label.getBBox().width;\n                }\n                return label;\n            };\n            /**\n             * Destructor for the tick prototype\n             *\n             * @private\n             * @function Highcharts.Tick#destroy\n             * @return {void}\n             */\n            Tick.prototype.destroy = function () {\n                destroyObjectProperties(this, this.axis);\n            };\n            /**\n             * Gets the x and y positions for ticks in terms of pixels.\n             *\n             * @private\n             * @function Highcharts.Tick#getPosition\n             *\n             * @param {boolean} horiz\n             * Whether the tick is on an horizontal axis or not.\n             *\n             * @param {number} tickPos\n             * Position of the tick.\n             *\n             * @param {number} tickmarkOffset\n             * Tickmark offset for all ticks.\n             *\n             * @param {boolean} [old]\n             * Whether the axis has changed or not.\n             *\n             * @return {Highcharts.PositionObject}\n             * The tick position.\n             *\n             * @fires Highcharts.Tick#event:afterGetPosition\n             */\n            Tick.prototype.getPosition = function (horiz, tickPos, tickmarkOffset, old) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    pos;\n                pos = {\n                    x: horiz ?\n                        correctFloat(axis.translate(tickPos + tickmarkOffset, null, null, old) +\n                            axis.transB) :\n                        (axis.left +\n                            axis.offset +\n                            (axis.opposite ?\n                                (((old && chart.oldChartWidth) ||\n                                    chart.chartWidth) -\n                                    axis.right -\n                                    axis.left) :\n                                0)),\n                    y: horiz ?\n                        (cHeight -\n                            axis.bottom +\n                            axis.offset -\n                            (axis.opposite ? axis.height : 0)) :\n                        correctFloat(cHeight -\n                            axis.translate(tickPos + tickmarkOffset, null, null, old) -\n                            axis.transB)\n                };\n                // Chrome workaround for #10516\n                pos.y = clamp(pos.y, -1e5, 1e5);\n                fireEvent(this, 'afterGetPosition', { pos: pos });\n                return pos;\n            };\n            /**\n             * Get the x, y position of the tick label\n             *\n             * @private\n             * @return {Highcharts.PositionObject}\n             */\n            Tick.prototype.getLabelPosition = function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n                var axis = this.axis,\n                    transA = axis.transA,\n                    reversed = ( // #7911\n                    axis.isLinked && axis.linkedParent ?\n                        axis.linkedParent.reversed :\n                        axis.reversed),\n                    staggerLines = axis.staggerLines,\n                    rotCorr = axis.tickRotCorr || { x: 0,\n                    y: 0 },\n                    yOffset = labelOptions.y, \n                    // Adjust for label alignment if we use reserveSpace: true (#5286)\n                    labelOffsetCorrection = (!horiz && !axis.reserveSpaceDefault ?\n                        -axis.labelOffset * (axis.labelAlign === 'center' ? 0.5 : 1) :\n                        0),\n                    line,\n                    pos = {};\n                if (!defined(yOffset)) {\n                    if (axis.side === 0) {\n                        yOffset = label.rotation ? -8 : -label.getBBox().height;\n                    }\n                    else if (axis.side === 2) {\n                        yOffset = rotCorr.y + 8;\n                    }\n                    else {\n                        // #3140, #3140\n                        yOffset = Math.cos(label.rotation * deg2rad) *\n                            (rotCorr.y - label.getBBox(false, 0).height / 2);\n                    }\n                }\n                x = x +\n                    labelOptions.x +\n                    labelOffsetCorrection +\n                    rotCorr.x -\n                    (tickmarkOffset && horiz ?\n                        tickmarkOffset * transA * (reversed ? -1 : 1) :\n                        0);\n                y = y + yOffset - (tickmarkOffset && !horiz ?\n                    tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n                // Correct for staggered labels\n                if (staggerLines) {\n                    line = (index / (step || 1) % staggerLines);\n                    if (axis.opposite) {\n                        line = staggerLines - line - 1;\n                    }\n                    y += line * (axis.labelOffset / staggerLines);\n                }\n                pos.x = x;\n                pos.y = Math.round(y);\n                fireEvent(this, 'afterGetLabelPosition', { pos: pos, tickmarkOffset: tickmarkOffset, index: index });\n                return pos;\n            };\n            /**\n             * Get the offset height or width of the label\n             *\n             * @private\n             * @function Highcharts.Tick#getLabelSize\n             * @return {number}\n             */\n            Tick.prototype.getLabelSize = function () {\n                return this.label ?\n                    this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n                    0;\n            };\n            /**\n             * Extendible method to return the path of the marker\n             *\n             * @private\n             *\n             */\n            Tick.prototype.getMarkPath = function (x, y, tickLength, tickWidth, horiz, renderer) {\n                return renderer.crispLine([[\n                        'M',\n                        x,\n                        y\n                    ], [\n                        'L',\n                        x + (horiz ? 0 : -tickLength),\n                        y + (horiz ? tickLength : 0)\n                    ]], tickWidth);\n            };\n            /**\n             * Handle the label overflow by adjusting the labels to the left and right\n             * edge, or hide them if they collide into the neighbour label.\n             *\n             * @private\n             * @function Highcharts.Tick#handleOverflow\n             * @param {Highcharts.PositionObject} xy\n             * @return {void}\n             */\n            Tick.prototype.handleOverflow = function (xy) {\n                var tick = this,\n                    axis = this.axis,\n                    labelOptions = axis.options.labels,\n                    pxPos = xy.x,\n                    chartWidth = axis.chart.chartWidth,\n                    spacing = axis.chart.spacing,\n                    leftBound = pick(axis.labelLeft,\n                    Math.min(axis.pos,\n                    spacing[3])),\n                    rightBound = pick(axis.labelRight,\n                    Math.max(!axis.isRadial ? axis.pos + axis.len : 0,\n                    chartWidth - spacing[1])),\n                    label = this.label,\n                    rotation = this.rotation,\n                    factor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[axis.labelAlign || label.attr('align')],\n                    labelWidth = label.getBBox().width,\n                    slotWidth = axis.getSlotWidth(tick),\n                    modifiedSlotWidth = slotWidth,\n                    xCorrection = factor,\n                    goRight = 1,\n                    leftPos,\n                    rightPos,\n                    textWidth,\n                    css = {};\n                // Check if the label overshoots the chart spacing box. If it does, move\n                // it. If it now overshoots the slotWidth, add ellipsis.\n                if (!rotation &&\n                    pick(labelOptions.overflow, 'justify') === 'justify') {\n                    leftPos = pxPos - factor * labelWidth;\n                    rightPos = pxPos + (1 - factor) * labelWidth;\n                    if (leftPos < leftBound) {\n                        modifiedSlotWidth =\n                            xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n                    }\n                    else if (rightPos > rightBound) {\n                        modifiedSlotWidth =\n                            rightBound - xy.x + modifiedSlotWidth * factor;\n                        goRight = -1;\n                    }\n                    modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n                    if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n                        xy.x += (goRight *\n                            (slotWidth -\n                                modifiedSlotWidth -\n                                xCorrection * (slotWidth - Math.min(labelWidth, modifiedSlotWidth))));\n                    }\n                    // If the label width exceeds the available space, set a text width\n                    // to be picked up below. Also, if a width has been set before, we\n                    // need to set a new one because the reported labelWidth will be\n                    // limited by the box (#3938).\n                    if (labelWidth > modifiedSlotWidth ||\n                        (axis.autoRotation && (label.styles || {}).width)) {\n                        textWidth = modifiedSlotWidth;\n                    }\n                    // Add ellipsis to prevent rotated labels to be clipped against the edge\n                    // of the chart\n                }\n                else if (rotation < 0 &&\n                    pxPos - factor * labelWidth < leftBound) {\n                    textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n                }\n                else if (rotation > 0 &&\n                    pxPos + factor * labelWidth > rightBound) {\n                    textWidth = Math.round((chartWidth - pxPos) /\n                        Math.cos(rotation * deg2rad));\n                }\n                if (textWidth) {\n                    if (tick.shortenLabel) {\n                        tick.shortenLabel();\n                    }\n                    else {\n                        css.width = Math.floor(textWidth) + 'px';\n                        if (!(labelOptions.style || {}).textOverflow) {\n                            css.textOverflow = 'ellipsis';\n                        }\n                        label.css(css);\n                    }\n                }\n            };\n            /**\n             * Try to replace the label if the same one already exists.\n             *\n             * @private\n             * @function Highcharts.Tick#moveLabel\n             * @param {string} str\n             * @param {Highcharts.XAxisLabelsOptions} labelOptions\n             *\n             * @return {void}\n             */\n            Tick.prototype.moveLabel = function (str, labelOptions) {\n                var tick = this,\n                    label = tick.label,\n                    moved = false,\n                    xAxis = tick.axis,\n                    chart = xAxis.chart,\n                    labelPos,\n                    reversed = xAxis.reversed,\n                    inverted = chart.inverted,\n                    xPos,\n                    yPos;\n                if (label && label.textStr === str) {\n                    tick.movedLabel = label;\n                    moved = true;\n                    delete tick.label;\n                }\n                else { // Find a label with the same string\n                    objectEach(xAxis.ticks, function (currentTick) {\n                        if (!moved &&\n                            !currentTick.isNew &&\n                            currentTick !== tick &&\n                            currentTick.label &&\n                            currentTick.label.textStr === str) {\n                            tick.movedLabel = currentTick.label;\n                            moved = true;\n                            currentTick.labelPos = tick.movedLabel.xy;\n                            delete currentTick.label;\n                        }\n                    });\n                }\n                // Create new label if the actual one is moved\n                if (!moved && (tick.labelPos || label)) {\n                    labelPos = tick.labelPos || label.xy;\n                    xPos = inverted ?\n                        labelPos.x : (reversed ? 0 : xAxis.width + xAxis.left);\n                    yPos = inverted ?\n                        (reversed ? (xAxis.width + xAxis.left) : 0) : labelPos.y;\n                    tick.movedLabel = tick.createLabel({ x: xPos, y: yPos }, str, labelOptions);\n                    if (tick.movedLabel) {\n                        tick.movedLabel.attr({ opacity: 0 });\n                    }\n                }\n            };\n            /**\n             * Put everything in place\n             *\n             * @private\n             * @param {number} index\n             * @param {boolean} [old]\n             *        Use old coordinates to prepare an animation into new position\n             * @param {number} [opacity]\n             * @return {voids}\n             */\n            Tick.prototype.render = function (index, old, opacity) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    pos = tick.pos,\n                    tickmarkOffset = pick(tick.tickmarkOffset,\n                    axis.tickmarkOffset),\n                    xy = tick.getPosition(horiz,\n                    pos,\n                    tickmarkOffset,\n                    old),\n                    x = xy.x,\n                    y = xy.y,\n                    reverseCrisp = ((horiz && x === axis.pos + axis.len) ||\n                        (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n                    opacity = pick(opacity, 1);\n                this.isActive = true;\n                // Create the grid line\n                this.renderGridLine(old, opacity, reverseCrisp);\n                // create the tick mark\n                this.renderMark(xy, opacity, reverseCrisp);\n                // the label is created on init - now move it into place\n                this.renderLabel(xy, old, opacity, index);\n                tick.isNew = false;\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Renders the gridLine.\n             *\n             * @private\n             * @param {boolean} old  Whether or not the tick is old\n             * @param {number} opacity  The opacity of the grid line\n             * @param {number} reverseCrisp  Modifier for avoiding overlapping 1 or -1\n             * @return {void}\n             */\n            Tick.prototype.renderGridLine = function (old, opacity, reverseCrisp) {\n                var tick = this, axis = tick.axis, options = axis.options, gridLine = tick.gridLine, gridLinePath, attribs = {}, pos = tick.pos, type = tick.type, tickmarkOffset = pick(tick.tickmarkOffset, axis.tickmarkOffset), renderer = axis.chart.renderer, gridPrefix = type ? type + 'Grid' : 'grid', gridLineWidth = options[gridPrefix + 'LineWidth'], gridLineColor = options[gridPrefix + 'LineColor'], dashStyle = options[gridPrefix + 'LineDashStyle'];\n                if (!gridLine) {\n                    if (!axis.chart.styledMode) {\n                        attribs.stroke = gridLineColor;\n                        attribs['stroke-width'] = gridLineWidth;\n                        if (dashStyle) {\n                            attribs.dashstyle = dashStyle;\n                        }\n                    }\n                    if (!type) {\n                        attribs.zIndex = 1;\n                    }\n                    if (old) {\n                        opacity = 0;\n                    }\n                    /**\n                     * The rendered grid line of the tick.\n                     * @name Highcharts.Tick#gridLine\n                     * @type {Highcharts.SVGElement|undefined}\n                     */\n                    tick.gridLine = gridLine = renderer.path()\n                        .attr(attribs)\n                        .addClass('highcharts-' + (type ? type + '-' : '') + 'grid-line')\n                        .add(axis.gridGroup);\n                }\n                if (gridLine) {\n                    gridLinePath = axis.getPlotLinePath({\n                        value: pos + tickmarkOffset,\n                        lineWidth: gridLine.strokeWidth() * reverseCrisp,\n                        force: 'pass',\n                        old: old\n                    });\n                    // If the parameter 'old' is set, the current call will be followed\n                    // by another call, therefore do not do any animations this time\n                    if (gridLinePath) {\n                        gridLine[old || tick.isNew ? 'attr' : 'animate']({\n                            d: gridLinePath,\n                            opacity: opacity\n                        });\n                    }\n                }\n            };\n            /**\n             * Renders the tick mark.\n             *\n             * @private\n             * @param {Highcharts.PositionObject} xy  The position vector of the mark\n             * @param {number} opacity  The opacity of the mark\n             * @param {number} reverseCrisp  Modifier for avoiding overlapping 1 or -1\n             * @return {void}\n             */\n            Tick.prototype.renderMark = function (xy, opacity, reverseCrisp) {\n                var tick = this, axis = tick.axis, options = axis.options, renderer = axis.chart.renderer, type = tick.type, tickPrefix = type ? type + 'Tick' : 'tick', tickSize = axis.tickSize(tickPrefix), mark = tick.mark, isNewMark = !mark, x = xy.x, y = xy.y, tickWidth = pick(options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1\n                    tickColor = options[tickPrefix + 'Color'];\n                if (tickSize) {\n                    // negate the length\n                    if (axis.opposite) {\n                        tickSize[0] = -tickSize[0];\n                    }\n                    // First time, create it\n                    if (isNewMark) {\n                        /**\n                         * The rendered mark of the tick.\n                         * @name Highcharts.Tick#mark\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        tick.mark = mark = renderer.path()\n                            .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n                            .add(axis.axisGroup);\n                        if (!axis.chart.styledMode) {\n                            mark.attr({\n                                stroke: tickColor,\n                                'stroke-width': tickWidth\n                            });\n                        }\n                    }\n                    mark[isNewMark ? 'attr' : 'animate']({\n                        d: tick.getMarkPath(x, y, tickSize[0], mark.strokeWidth() * reverseCrisp, axis.horiz, renderer),\n                        opacity: opacity\n                    });\n                }\n            };\n            /**\n             * Renders the tick label.\n             * Note: The label should already be created in init(), so it should only\n             * have to be moved into place.\n             *\n             * @private\n             * @param {Highcharts.PositionObject} xy  The position vector of the label\n             * @param {boolean} old  Whether or not the tick is old\n             * @param {number} opacity  The opacity of the label\n             * @param {number} index  The index of the tick\n             * @return {void}\n             */\n            Tick.prototype.renderLabel = function (xy, old, opacity, index) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    options = axis.options,\n                    label = tick.label,\n                    labelOptions = options.labels,\n                    step = labelOptions.step,\n                    tickmarkOffset = pick(tick.tickmarkOffset,\n                    axis.tickmarkOffset),\n                    show = true,\n                    x = xy.x,\n                    y = xy.y;\n                if (label && isNumber(x)) {\n                    label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n                    // Apply show first and show last. If the tick is both first and\n                    // last, it is a single centered tick, in which case we show the\n                    // label anyway (#2100).\n                    if ((tick.isFirst &&\n                        !tick.isLast &&\n                        !pick(options.showFirstLabel, 1)) ||\n                        (tick.isLast &&\n                            !tick.isFirst &&\n                            !pick(options.showLastLabel, 1))) {\n                        show = false;\n                        // Handle label overflow and show or hide accordingly\n                    }\n                    else if (horiz &&\n                        !labelOptions.step &&\n                        !labelOptions.rotation &&\n                        !old &&\n                        opacity !== 0) {\n                        tick.handleOverflow(xy);\n                    }\n                    // apply step\n                    if (step && index % step) {\n                        // show those indices dividable by step\n                        show = false;\n                    }\n                    // Set the new position, and show or hide\n                    if (show && isNumber(xy.y)) {\n                        xy.opacity = opacity;\n                        label[tick.isNewLabel ? 'attr' : 'animate'](xy);\n                        tick.isNewLabel = false;\n                    }\n                    else {\n                        label.attr('y', -9999); // #1338\n                        tick.isNewLabel = true;\n                    }\n                }\n            };\n            /**\n             * Replace labels with the moved ones to perform animation. Additionally\n             * destroy unused labels.\n             *\n             * @private\n             * @function Highcharts.Tick#replaceMovedLabel\n             * @return {void}\n             */\n            Tick.prototype.replaceMovedLabel = function () {\n                var tick = this,\n                    label = tick.label,\n                    axis = tick.axis,\n                    reversed = axis.reversed,\n                    chart = tick.axis.chart,\n                    inverted = chart.inverted,\n                    x,\n                    y;\n                // Animate and destroy\n                if (label && !tick.isNew) {\n                    x = inverted ? label.xy.x : (reversed ? axis.left : axis.width + axis.left);\n                    y = inverted ?\n                        (reversed ? axis.width + axis.top : axis.top) :\n                        label.xy.y;\n                    label.animate({ x: x, y: y, opacity: 0 }, void 0, label.destroy);\n                    delete tick.label;\n                }\n                axis.isDirty = true;\n                tick.label = tick.movedLabel;\n                delete tick.movedLabel;\n            };\n            return Tick;\n        }());\n        H.Tick = Tick;\n\n        return H.Tick;\n    });\n    _registerModule(_modules, 'parts/Time.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Highcharts, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Normalized interval.\n         *\n         * @interface Highcharts.TimeNormalizedObject\n         */ /**\n        * The count.\n        *\n        * @name Highcharts.TimeNormalizedObject#count\n        * @type {number}\n        */ /**\n        * The interval in axis values (ms).\n        *\n        * @name Highcharts.TimeNormalizedObject#unitRange\n        * @type {number}\n        */\n        /**\n         * Function of an additional date format specifier.\n         *\n         * @callback Highcharts.TimeFormatCallbackFunction\n         *\n         * @param {number} timestamp\n         *        The time to format.\n         *\n         * @return {string}\n         *         The formatted portion of the date.\n         */\n        /**\n         * Additonal time tick information.\n         *\n         * @interface Highcharts.TimeTicksInfoObject\n         * @extends Highcharts.TimeNormalizedObject\n         */ /**\n        * @name Highcharts.TimeTicksInfoObject#higherRanks\n        * @type {Array<string>}\n        */ /**\n        * @name Highcharts.TimeTicksInfoObject#totalRange\n        * @type {number}\n        */\n        /**\n         * Time ticks.\n         *\n         * @interface Highcharts.AxisTickPositionsArray\n         * @extends global.Array<number>\n         */ /**\n        * @name Highcharts.AxisTickPositionsArray#info\n        * @type {Highcharts.TimeTicksInfoObject|undefined}\n        */\n        /**\n         * A callback to return the time zone offset for a given datetime. It\n         * takes the timestamp in terms of milliseconds since January 1 1970,\n         * and returns the timezone offset in minutes. This provides a hook\n         * for drawing time based charts in specific time zones using their\n         * local DST crossover dates, with the help of external libraries.\n         *\n         * @callback Highcharts.TimezoneOffsetCallbackFunction\n         *\n         * @param {number} timestamp\n         * Timestamp in terms of milliseconds since January 1 1970.\n         *\n         * @return {number}\n         * Timezone offset in minutes.\n         */\n        var defined = U.defined,\n            error = U.error,\n            extend = U.extend,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pad = U.pad,\n            pick = U.pick,\n            splat = U.splat,\n            timeUnits = U.timeUnits;\n        var H = Highcharts,\n            win = H.win;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Time class. Time settings are applied in general for each page using\n         * `Highcharts.setOptions`, or individually for each Chart item through the\n         * [time](https://api.highcharts.com/highcharts/time) options set.\n         *\n         * The Time object is available from {@link Highcharts.Chart#time},\n         * which refers to  `Highcharts.time` if no individual time settings are\n         * applied.\n         *\n         * @example\n         * // Apply time settings globally\n         * Highcharts.setOptions({\n         *     time: {\n         *         timezone: 'Europe/London'\n         *     }\n         * });\n         *\n         * // Apply time settings by instance\n         * var chart = Highcharts.chart('container', {\n         *     time: {\n         *         timezone: 'America/New_York'\n         *     },\n         *     series: [{\n         *         data: [1, 4, 3, 5]\n         *     }]\n         * });\n         *\n         * // Use the Time object\n         * console.log(\n         *        'Current time in New York',\n         *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n         * );\n         *\n         * @since 6.0.5\n         *\n         * @class\n         * @name Highcharts.Time\n         *\n         * @param {Highcharts.TimeOptions} options\n         * Time options as defined in [chart.options.time](/highcharts/time).\n         */\n        var Time = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Time(options) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.options = {};\n                this.useUTC = false;\n                this.variableTimezone = false;\n                this.Date = win.Date;\n                /**\n                 * Get the time zone offset based on the current timezone information as\n                 * set in the global options.\n                 *\n                 * @function Highcharts.Time#getTimezoneOffset\n                 *\n                 * @param {number} timestamp\n                 *        The JavaScript timestamp to inspect.\n                 *\n                 * @return {number}\n                 *         The timezone offset in minutes compared to UTC.\n                 */\n                this.getTimezoneOffset = this.timezoneOffsetFunction();\n                this.update(options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Time units used in `Time.get` and `Time.set`\n             *\n             * @typedef {\"Date\"|\"Day\"|\"FullYear\"|\"Hours\"|\"Milliseconds\"|\"Minutes\"|\"Month\"|\"Seconds\"} Highcharts.TimeUnitValue\n             */\n            /**\n             * Get the value of a date object in given units, and subject to the Time\n             * object's current timezone settings. This function corresponds directly to\n             * JavaScripts `Date.getXXX / Date.getUTCXXX`, so instead of calling\n             * `date.getHours()` or `date.getUTCHours()` we will call\n             * `time.get('Hours')`.\n             *\n             * @function Highcharts.Time#get\n             *\n             * @param {Highcharts.TimeUnitValue} unit\n             * @param {Date} date\n             *\n             * @return {number}\n             *        The given time unit\n             */\n            Time.prototype.get = function (unit, date) {\n                if (this.variableTimezone || this.timezoneOffset) {\n                    var realMs = date.getTime();\n                    var ms = realMs - this.getTimezoneOffset(date);\n                    date.setTime(ms); // Temporary adjust to timezone\n                    var ret = date['getUTC' + unit]();\n                    date.setTime(realMs); // Reset\n                    return ret;\n                }\n                // UTC time with no timezone handling\n                if (this.useUTC) {\n                    return date['getUTC' + unit]();\n                }\n                // Else, local time\n                return date['get' + unit]();\n            };\n            /**\n             * Set the value of a date object in given units, and subject to the Time\n             * object's current timezone settings. This function corresponds directly to\n             * JavaScripts `Date.setXXX / Date.setUTCXXX`, so instead of calling\n             * `date.setHours(0)` or `date.setUTCHours(0)` we will call\n             * `time.set('Hours', 0)`.\n             *\n             * @function Highcharts.Time#set\n             *\n             * @param {Highcharts.TimeUnitValue} unit\n             * @param {Date} date\n             * @param {number} value\n             *\n             * @return {number}\n             *        The epoch milliseconds of the updated date\n             */\n            Time.prototype.set = function (unit, date, value) {\n                // UTC time with timezone handling\n                if (this.variableTimezone || this.timezoneOffset) {\n                    // For lower order time units, just set it directly using UTC\n                    // time\n                    if (unit === 'Milliseconds' ||\n                        unit === 'Seconds' ||\n                        unit === 'Minutes') {\n                        return date['setUTC' + unit](value);\n                    }\n                    // Higher order time units need to take the time zone into\n                    // account\n                    // Adjust by timezone\n                    var offset = this.getTimezoneOffset(date);\n                    var ms = date.getTime() - offset;\n                    date.setTime(ms);\n                    date['setUTC' + unit](value);\n                    var newOffset = this.getTimezoneOffset(date);\n                    ms = date.getTime() + newOffset;\n                    return date.setTime(ms);\n                }\n                // UTC time with no timezone handling\n                if (this.useUTC) {\n                    return date['setUTC' + unit](value);\n                }\n                // Else, local time\n                return date['set' + unit](value);\n            };\n            /**\n             * Update the Time object with current options. It is called internally on\n             * initializing Highcharts, after running `Highcharts.setOptions` and on\n             * `Chart.update`.\n             *\n             * @private\n             * @function Highcharts.Time#update\n             *\n             * @param {Highcharts.TimeOptions} options\n             *\n             * @return {void}\n             */\n            Time.prototype.update = function (options) {\n                var useUTC = pick(options && options.useUTC,\n                    true),\n                    time = this;\n                this.options = options = merge(true, this.options || {}, options);\n                // Allow using a different Date class\n                this.Date = options.Date || win.Date || Date;\n                this.useUTC = useUTC;\n                this.timezoneOffset = (useUTC && options.timezoneOffset);\n                this.getTimezoneOffset = this.timezoneOffsetFunction();\n                /*\n                 * The time object has options allowing for variable time zones, meaning\n                 * the axis ticks or series data needs to consider this.\n                 */\n                this.variableTimezone = !!(!useUTC ||\n                    options.getTimezoneOffset ||\n                    options.timezone);\n            };\n            /**\n             * Make a time and returns milliseconds. Interprets the inputs as UTC time,\n             * local time or a specific timezone time depending on the current time\n             * settings.\n             *\n             * @function Highcharts.Time#makeTime\n             *\n             * @param {number} year\n             *        The year\n             *\n             * @param {number} month\n             *        The month. Zero-based, so January is 0.\n             *\n             * @param {number} [date=1]\n             *        The day of the month\n             *\n             * @param {number} [hours=0]\n             *        The hour of the day, 0-23.\n             *\n             * @param {number} [minutes=0]\n             *        The minutes\n             *\n             * @param {number} [seconds=0]\n             *        The seconds\n             *\n             * @return {number}\n             *         The time in milliseconds since January 1st 1970.\n             */\n            Time.prototype.makeTime = function (year, month, date, hours, minutes, seconds) {\n                var d,\n                    offset,\n                    newOffset;\n                if (this.useUTC) {\n                    d = this.Date.UTC.apply(0, arguments);\n                    offset = this.getTimezoneOffset(d);\n                    d += offset;\n                    newOffset = this.getTimezoneOffset(d);\n                    if (offset !== newOffset) {\n                        d += newOffset - offset;\n                        // A special case for transitioning from summer time to winter time.\n                        // When the clock is set back, the same time is repeated twice, i.e.\n                        // 02:30 am is repeated since the clock is set back from 3 am to\n                        // 2 am. We need to make the same time as local Date does.\n                    }\n                    else if (offset - 36e5 === this.getTimezoneOffset(d - 36e5) &&\n                        !H.isSafari) {\n                        d -= 36e5;\n                    }\n                }\n                else {\n                    d = new this.Date(year, month, pick(date, 1), pick(hours, 0), pick(minutes, 0), pick(seconds, 0)).getTime();\n                }\n                return d;\n            };\n            /**\n             * Sets the getTimezoneOffset function. If the `timezone` option is set, a\n             * default getTimezoneOffset function with that timezone is returned. If\n             * a `getTimezoneOffset` option is defined, it is returned. If neither are\n             * specified, the function using the `timezoneOffset` option or 0 offset is\n             * returned.\n             *\n             * @private\n             * @function Highcharts.Time#timezoneOffsetFunction\n             *\n             * @return {Function}\n             *         A getTimezoneOffset function\n             */\n            Time.prototype.timezoneOffsetFunction = function () {\n                var time = this,\n                    options = this.options,\n                    moment = win.moment;\n                if (!this.useUTC) {\n                    return function (timestamp) {\n                        return new Date(timestamp.toString()).getTimezoneOffset() * 60000;\n                    };\n                }\n                if (options.timezone) {\n                    if (!moment) {\n                        // getTimezoneOffset-function stays undefined because it depends\n                        // on Moment.js\n                        error(25);\n                    }\n                    else {\n                        return function (timestamp) {\n                            return -moment.tz(timestamp, options.timezone).utcOffset() * 60000;\n                        };\n                    }\n                }\n                // If not timezone is set, look for the getTimezoneOffset callback\n                if (this.useUTC && options.getTimezoneOffset) {\n                    return function (timestamp) {\n                        return options.getTimezoneOffset(timestamp.valueOf()) * 60000;\n                    };\n                }\n                // Last, use the `timezoneOffset` option if set\n                return function () {\n                    return (time.timezoneOffset || 0) * 60000;\n                };\n            };\n            /**\n             * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970)\n             * into a human readable date string. The available format keys are listed\n             * below. Additional formats can be given in the\n             * {@link Highcharts.dateFormats} hook.\n             *\n             * Supported format keys:\n             * - `%a`: Short weekday, like 'Mon'\n             * - `%A`: Long weekday, like 'Monday'\n             * - `%d`: Two digit day of the month, 01 to 31\n             * - `%e`: Day of the month, 1 through 31\n             * - `%w`: Day of the week, 0 through 6\n             * - `%b`: Short month, like 'Jan'\n             * - `%B`: Long month, like 'January'\n             * - `%m`: Two digit month number, 01 through 12\n             * - `%y`: Two digits year, like 09 for 2009\n             * - `%Y`: Four digits year, like 2009\n             * - `%H`: Two digits hours in 24h format, 00 through 23\n             * - `%k`: Hours in 24h format, 0 through 23\n             * - `%I`: Two digits hours in 12h format, 00 through 11\n             * - `%l`: Hours in 12h format, 1 through 12\n             * - `%M`: Two digits minutes, 00 through 59\n             * - `%p`: Upper case AM or PM\n             * - `%P`: Lower case AM or PM\n             * - `%S`: Two digits seconds, 00 through 59\n             * - `%L`: Milliseconds (naming from Ruby)\n             *\n             * @example\n             * const time = new Highcharts.Time();\n             * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));\n             * console.log(s); // => 2020-01-01 00:00:00\n             *\n             * @function Highcharts.Time#dateFormat\n             *\n             * @param {string} format\n             *        The desired format where various time representations are\n             *        prefixed with %.\n             *\n             * @param {number} timestamp\n             *        The JavaScript timestamp.\n             *\n             * @param {boolean} [capitalize=false]\n             *        Upper case first letter in the return.\n             *\n             * @return {string}\n             *         The formatted date.\n             */\n            Time.prototype.dateFormat = function (format, timestamp, capitalize) {\n                var _a;\n                if (!defined(timestamp) || isNaN(timestamp)) {\n                    return ((_a = H.defaultOptions.lang) === null || _a === void 0 ? void 0 : _a.invalidDate) || '';\n                }\n                format = pick(format, '%Y-%m-%d %H:%M:%S');\n                var time = this, date = new this.Date(timestamp), \n                    // get the basic time values\n                    hours = this.get('Hours', date), day = this.get('Day', date), dayOfMonth = this.get('Date', date), month = this.get('Month', date), fullYear = this.get('FullYear', date), lang = H.defaultOptions.lang, langWeekdays = lang === null || lang === void 0 ? void 0 : lang.weekdays, shortWeekdays = lang === null || lang === void 0 ? void 0 : lang.shortWeekdays, \n                    // List all format keys. Custom formats can be added from the\n                    // outside.\n                    replacements = extend({\n                        // Day\n                        // Short weekday, like 'Mon'\n                        a: shortWeekdays ?\n                            shortWeekdays[day] :\n                            langWeekdays[day].substr(0, 3),\n                        // Long weekday, like 'Monday'\n                        A: langWeekdays[day],\n                        // Two digit day of the month, 01 to 31\n                        d: pad(dayOfMonth),\n                        // Day of the month, 1 through 31\n                        e: pad(dayOfMonth, 2, ' '),\n                        // Day of the week, 0 through 6\n                        w: day,\n                        // Week (none implemented)\n                        // 'W': weekNumber(),\n                        // Month\n                        // Short month, like 'Jan'\n                        b: lang.shortMonths[month],\n                        // Long month, like 'January'\n                        B: lang.months[month],\n                        // Two digit month number, 01 through 12\n                        m: pad(month + 1),\n                        // Month number, 1 through 12 (#8150)\n                        o: month + 1,\n                        // Year\n                        // Two digits year, like 09 for 2009\n                        y: fullYear.toString().substr(2, 2),\n                        // Four digits year, like 2009\n                        Y: fullYear,\n                        // Time\n                        // Two digits hours in 24h format, 00 through 23\n                        H: pad(hours),\n                        // Hours in 24h format, 0 through 23\n                        k: hours,\n                        // Two digits hours in 12h format, 00 through 11\n                        I: pad((hours % 12) || 12),\n                        // Hours in 12h format, 1 through 12\n                        l: (hours % 12) || 12,\n                        // Two digits minutes, 00 through 59\n                        M: pad(this.get('Minutes', date)),\n                        // Upper case AM or PM\n                        p: hours < 12 ? 'AM' : 'PM',\n                        // Lower case AM or PM\n                        P: hours < 12 ? 'am' : 'pm',\n                        // Two digits seconds, 00 through  59\n                        S: pad(date.getSeconds()),\n                        // Milliseconds (naming from Ruby)\n                        L: pad(Math.floor(timestamp % 1000), 3)\n                    }, H.dateFormats);\n                // Do the replaces\n                objectEach(replacements, function (val, key) {\n                    // Regex would do it in one line, but this is faster\n                    while (format.indexOf('%' + key) !== -1) {\n                        format = format.replace('%' + key, typeof val === 'function' ? val.call(time, timestamp) : val);\n                    }\n                });\n                // Optionally capitalize the string and return\n                return capitalize ?\n                    (format.substr(0, 1).toUpperCase() +\n                        format.substr(1)) :\n                    format;\n            };\n            /**\n             * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into\n             * an object.\n             * @private\n             * @param {string|Array<T>|Highcharts.Dictionary<T>} f - General format description\n             * @return {Highcharts.Dictionary<T>} - The object definition\n             */\n            Time.prototype.resolveDTLFormat = function (f) {\n                if (!isObject(f, true)) { // check for string or array\n                    f = splat(f);\n                    return {\n                        main: f[0],\n                        from: f[1],\n                        to: f[2]\n                    };\n                }\n                return f;\n            };\n            /**\n             * Return an array with time positions distributed on round time values\n             * right and right after min and max. Used in datetime axes as well as for\n             * grouping data on a datetime axis.\n             *\n             * @function Highcharts.Time#getTimeTicks\n             *\n             * @param {Highcharts.TimeNormalizedObject} normalizedInterval\n             *        The interval in axis values (ms) and the count\n             *\n             * @param {number} [min]\n             *        The minimum in axis values\n             *\n             * @param {number} [max]\n             *        The maximum in axis values\n             *\n             * @param {number} [startOfWeek=1]\n             *\n             * @return {Highcharts.AxisTickPositionsArray}\n             */\n            Time.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {\n                var time = this,\n                    Date = time.Date,\n                    tickPositions = [],\n                    i,\n                    higherRanks = {},\n                    minYear, // used in months and years as a basis for Date.UTC()\n                    // When crossing DST, use the max. Resolves #6278.\n                    minDate = new Date(min),\n                    interval = normalizedInterval.unitRange,\n                    count = normalizedInterval.count || 1,\n                    variableDayLength,\n                    minDay;\n                startOfWeek = pick(startOfWeek, 1);\n                if (defined(min)) { // #1300\n                    time.set('Milliseconds', minDate, interval >= timeUnits.second ?\n                        0 : // #3935\n                        count * Math.floor(time.get('Milliseconds', minDate) / count)); // #3652, #3654\n                    if (interval >= timeUnits.second) { // second\n                        time.set('Seconds', minDate, interval >= timeUnits.minute ?\n                            0 : // #3935\n                            count * Math.floor(time.get('Seconds', minDate) / count));\n                    }\n                    if (interval >= timeUnits.minute) { // minute\n                        time.set('Minutes', minDate, interval >= timeUnits.hour ?\n                            0 :\n                            count * Math.floor(time.get('Minutes', minDate) / count));\n                    }\n                    if (interval >= timeUnits.hour) { // hour\n                        time.set('Hours', minDate, interval >= timeUnits.day ?\n                            0 :\n                            count * Math.floor(time.get('Hours', minDate) / count));\n                    }\n                    if (interval >= timeUnits.day) { // day\n                        time.set('Date', minDate, interval >= timeUnits.month ?\n                            1 :\n                            Math.max(1, count * Math.floor(time.get('Date', minDate) / count)));\n                    }\n                    if (interval >= timeUnits.month) { // month\n                        time.set('Month', minDate, interval >= timeUnits.year ? 0 :\n                            count * Math.floor(time.get('Month', minDate) / count));\n                        minYear = time.get('FullYear', minDate);\n                    }\n                    if (interval >= timeUnits.year) { // year\n                        minYear -= minYear % count;\n                        time.set('FullYear', minDate, minYear);\n                    }\n                    // week is a special case that runs outside the hierarchy\n                    if (interval === timeUnits.week) {\n                        // get start of current week, independent of count\n                        minDay = time.get('Day', minDate);\n                        time.set('Date', minDate, (time.get('Date', minDate) -\n                            minDay + startOfWeek +\n                            // We don't want to skip days that are before\n                            // startOfWeek (#7051)\n                            (minDay < startOfWeek ? -7 : 0)));\n                    }\n                    // Get basics for variable time spans\n                    minYear = time.get('FullYear', minDate);\n                    var minMonth = time.get('Month', minDate), minDateDate = time.get('Date', minDate), minHours = time.get('Hours', minDate);\n                    // Redefine min to the floored/rounded minimum time (#7432)\n                    min = minDate.getTime();\n                    // Handle local timezone offset\n                    if (time.variableTimezone) {\n                        // Detect whether we need to take the DST crossover into\n                        // consideration. If we're crossing over DST, the day length may\n                        // be 23h or 25h and we need to compute the exact clock time for\n                        // each tick instead of just adding hours. This comes at a cost,\n                        // so first we find out if it is needed (#4951).\n                        variableDayLength = (\n                        // Long range, assume we're crossing over.\n                        max - min > 4 * timeUnits.month ||\n                            // Short range, check if min and max are in different time\n                            // zones.\n                            time.getTimezoneOffset(min) !==\n                                time.getTimezoneOffset(max));\n                    }\n                    // Iterate and add tick positions at appropriate values\n                    var t = minDate.getTime();\n                    i = 1;\n                    while (t < max) {\n                        tickPositions.push(t);\n                        // if the interval is years, use Date.UTC to increase years\n                        if (interval === timeUnits.year) {\n                            t = time.makeTime(minYear + i * count, 0);\n                            // if the interval is months, use Date.UTC to increase months\n                        }\n                        else if (interval === timeUnits.month) {\n                            t = time.makeTime(minYear, minMonth + i * count);\n                            // if we're using global time, the interval is not fixed as it\n                            // jumps one hour at the DST crossover\n                        }\n                        else if (variableDayLength &&\n                            (interval === timeUnits.day || interval === timeUnits.week)) {\n                            t = time.makeTime(minYear, minMonth, minDateDate +\n                                i * count * (interval === timeUnits.day ? 1 : 7));\n                        }\n                        else if (variableDayLength &&\n                            interval === timeUnits.hour &&\n                            count > 1) {\n                            // make sure higher ranks are preserved across DST (#6797,\n                            // #7621)\n                            t = time.makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n                            // else, the interval is fixed and we use simple addition\n                        }\n                        else {\n                            t += interval * count;\n                        }\n                        i++;\n                    }\n                    // push the last time\n                    tickPositions.push(t);\n                    // Handle higher ranks. Mark new days if the time is on midnight\n                    // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold\n                    // to prevent looping over dense data grouping (#6156).\n                    if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n                        tickPositions.forEach(function (t) {\n                            if (\n                            // Speed optimization, no need to run dateFormat unless\n                            // we're on a full or half hour\n                            t % 1800000 === 0 &&\n                                // Check for local or global midnight\n                                time.dateFormat('%H%M%S%L', t) === '000000000') {\n                                higherRanks[t] = 'day';\n                            }\n                        });\n                    }\n                }\n                // record information on the chosen unit - for dynamic label formatter\n                tickPositions.info = extend(normalizedInterval, {\n                    higherRanks: higherRanks,\n                    totalRange: interval * count\n                });\n                return tickPositions;\n            };\n            return Time;\n        }());\n        H.Time = Time;\n\n        return H.Time;\n    });\n    _registerModule(_modules, 'parts/Options.js', [_modules['parts/Globals.js'], _modules['parts/Time.js'], _modules['parts/Color.js'], _modules['parts/Utilities.js']], function (H, Time, Color, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * @typedef {\"plotBox\"|\"spacingBox\"} Highcharts.ButtonRelativeToValue\n         */\n        /**\n         * Gets fired when a series is added to the chart after load time, using the\n         * `addSeries` method. Returning `false` prevents the series from being added.\n         *\n         * @callback Highcharts.ChartAddSeriesCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {Highcharts.ChartAddSeriesEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Contains common event information. Through the `options` property you can\n         * access the series options that were passed to the `addSeries` method.\n         *\n         * @interface Highcharts.ChartAddSeriesEventObject\n         */ /**\n        * The series options that were passed to the `addSeries` method.\n        * @name Highcharts.ChartAddSeriesEventObject#options\n        * @type {Highcharts.SeriesOptionsType}\n        */ /**\n        * Prevents the default behaviour of the event.\n        * @name Highcharts.ChartAddSeriesEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * The event target.\n        * @name Highcharts.ChartAddSeriesEventObject#target\n        * @type {Highcharts.Chart}\n        */ /**\n        * The event type.\n        * @name Highcharts.ChartAddSeriesEventObject#type\n        * @type {\"addSeries\"}\n        */\n        /**\n         * Gets fired when clicking on the plot background.\n         *\n         * @callback Highcharts.ChartClickCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {Highcharts.PointerEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Contains an axes of the clicked spot.\n         *\n         * @interface Highcharts.ChartClickEventAxisObject\n         */ /**\n        * Axis at the clicked spot.\n        * @name Highcharts.ChartClickEventAxisObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Axis value at the clicked spot.\n        * @name Highcharts.ChartClickEventAxisObject#value\n        * @type {number}\n        */\n        /**\n         * Contains information about the clicked spot on the chart. Remember the unit\n         * of a datetime axis is milliseconds since 1970-01-01 00:00:00.\n         *\n         * @interface Highcharts.ChartClickEventObject\n         * @extends Highcharts.PointerEventObject\n         */ /**\n        * Information about the x-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#xAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>}\n        */ /**\n        * Information about the y-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#yAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>}\n        */ /**\n        * Information about the z-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#zAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>|undefined}\n        */\n        /**\n         * Gets fired when the chart is finished loading.\n         *\n         * @callback Highcharts.ChartLoadCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Fires when the chart is redrawn, either after a call to `chart.redraw()` or\n         * after an axis, series or point is modified with the `redraw` option set to\n         * `true`.\n         *\n         * @callback Highcharts.ChartRedrawCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired after initial load of the chart (directly after the `load` event),\n         * and after each redraw (directly after the `redraw` event).\n         *\n         * @callback Highcharts.ChartRenderCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired when an area of the chart has been selected. The default action\n         * for the selection event is to zoom the chart to the selected area. It can be\n         * prevented by calling `event.preventDefault()` or return false.\n         *\n         * @callback Highcharts.ChartSelectionCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.ChartSelectionContextObject} event\n         *        Event informations\n         *\n         * @return {boolean|undefined}\n         *         Return false to prevent the default action, usually zoom.\n         */\n        /**\n         * The primary axes are `xAxis[0]` and `yAxis[0]`. Remember the unit of a\n         * datetime axis is milliseconds since 1970-01-01 00:00:00.\n         *\n         * @interface Highcharts.ChartSelectionContextObject\n         * @extends global.Event\n         */ /**\n        * Arrays containing the axes of each dimension and each axis' min and max\n        * values.\n        * @name Highcharts.ChartSelectionContextObject#xAxis\n        * @type {Array<Highcharts.ChartSelectionAxisContextObject>}\n        */ /**\n        * Arrays containing the axes of each dimension and each axis' min and max\n        * values.\n        * @name Highcharts.ChartSelectionContextObject#yAxis\n        * @type {Array<Highcharts.ChartSelectionAxisContextObject>}\n        */\n        /**\n         * Axis context of the selection.\n         *\n         * @interface Highcharts.ChartSelectionAxisContextObject\n         */ /**\n        * The selected Axis.\n        * @name Highcharts.ChartSelectionAxisContextObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * The maximum axis value, either automatic or set manually.\n        * @name Highcharts.ChartSelectionAxisContextObject#max\n        * @type {number}\n        */ /**\n        * The minimum axis value, either automatic or set manually.\n        * @name Highcharts.ChartSelectionAxisContextObject#min\n        * @type {number}\n        */\n        var color = Color.parse;\n        var merge = U.merge;\n        var isTouchDevice = H.isTouchDevice,\n            svg = H.svg;\n        /* ************************************************************************** *\n         * Handle the options                                                         *\n         * ************************************************************************** */\n        /**\n         * Global default settings.\n         *\n         * @name Highcharts.defaultOptions\n         * @type {Highcharts.Options}\n         */ /**\n        * @optionparent\n        */\n        H.defaultOptions = {\n            /**\n             * An array containing the default colors for the chart's series. When\n             * all colors are used, new colors are pulled from the start again.\n             *\n             * Default colors can also be set on a series or series.type basis,\n             * see [column.colors](#plotOptions.column.colors),\n             * [pie.colors](#plotOptions.pie.colors).\n             *\n             * In styled mode, the colors option doesn't exist. Instead, colors\n             * are defined in CSS and applied either through series or point class\n             * names, or through the [chart.colorCount](#chart.colorCount) option.\n             *\n             *\n             * ### Legacy\n             *\n             * In Highcharts 3.x, the default colors were:\n             * ```js\n             * colors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce',\n             *         '#492970', '#f28f43', '#77a1e5', '#c42525', '#a6c96a']\n             * ```\n             *\n             * In Highcharts 2.x, the default colors were:\n             * ```js\n             * colors: ['#4572A7', '#AA4643', '#89A54E', '#80699B', '#3D96AE',\n             *         '#DB843D', '#92A8CD', '#A47D7C', '#B5CA92']\n             * ```\n             *\n             * @sample {highcharts} highcharts/chart/colors/\n             *         Assign a global color theme\n             *\n             * @type    {Array<Highcharts.ColorString>}\n             * @default [\"#7cb5ec\", \"#434348\", \"#90ed7d\", \"#f7a35c\", \"#8085e9\",\n             *          \"#f15c80\", \"#e4d354\", \"#2b908f\", \"#f45b5b\", \"#91e8e1\"]\n             */\n            colors: '#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1'.split(' '),\n            /**\n             * Styled mode only. Configuration object for adding SVG definitions for\n             * reusable elements. See [gradients, shadows and\n             * patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns)\n             * for more information and code examples.\n             *\n             * @type      {*}\n             * @since     5.0.0\n             * @apioption defs\n             */\n            /**\n             * @ignore-option\n             */\n            symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n            /**\n             * The language object is global and it can't be set on each chart\n             * initialization. Instead, use `Highcharts.setOptions` to set it before any\n             * chart is initialized.\n             *\n             * ```js\n             * Highcharts.setOptions({\n             *     lang: {\n             *         months: [\n             *             'Janvier', 'Février', 'Mars', 'Avril',\n             *             'Mai', 'Juin', 'Juillet', 'Août',\n             *             'Septembre', 'Octobre', 'Novembre', 'Décembre'\n             *         ],\n             *         weekdays: [\n             *             'Dimanche', 'Lundi', 'Mardi', 'Mercredi',\n             *             'Jeudi', 'Vendredi', 'Samedi'\n             *         ]\n             *     }\n             * });\n             * ```\n             */\n            lang: {\n                /**\n                 * The loading text that appears when the chart is set into the loading\n                 * state following a call to `chart.showLoading`.\n                 */\n                loading: 'Loading...',\n                /**\n                 * An array containing the months names. Corresponds to the `%B` format\n                 * in `Highcharts.dateFormat()`.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n                 *          \"July\", \"August\", \"September\", \"October\", \"November\",\n                 *          \"December\"]\n                 */\n                months: [\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\n                    'August', 'September', 'October', 'November', 'December'\n                ],\n                /**\n                 * An array containing the months names in abbreviated form. Corresponds\n                 * to the `%b` format in `Highcharts.dateFormat()`.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n                 *          \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n                 */\n                shortMonths: [\n                    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n                    'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n                ],\n                /**\n                 * An array containing the weekday names.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\",\n                 *          \"Friday\", \"Saturday\"]\n                 */\n                weekdays: [\n                    'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n                    'Thursday', 'Friday', 'Saturday'\n                ],\n                /**\n                 * Short week days, starting Sunday. If not specified, Highcharts uses\n                 * the first three letters of the `lang.weekdays` option.\n                 *\n                 * @sample highcharts/lang/shortweekdays/\n                 *         Finnish two-letter abbreviations\n                 *\n                 * @type      {Array<string>}\n                 * @since     4.2.4\n                 * @apioption lang.shortWeekdays\n                 */\n                /**\n                 * What to show in a date field for invalid dates. Defaults to an empty\n                 * string.\n                 *\n                 * @type      {string}\n                 * @since     4.1.8\n                 * @product   highcharts highstock\n                 * @apioption lang.invalidDate\n                 */\n                /**\n                 * The title appearing on hovering the zoom in button. The text itself\n                 * defaults to \"+\" and can be changed in the button options.\n                 *\n                 * @type      {string}\n                 * @default   Zoom in\n                 * @product   highmaps\n                 * @apioption lang.zoomIn\n                 */\n                /**\n                 * The title appearing on hovering the zoom out button. The text itself\n                 * defaults to \"-\" and can be changed in the button options.\n                 *\n                 * @type      {string}\n                 * @default   Zoom out\n                 * @product   highmaps\n                 * @apioption lang.zoomOut\n                 */\n                /**\n                 * The default decimal point used in the `Highcharts.numberFormat`\n                 * method unless otherwise specified in the function arguments.\n                 *\n                 * @since 1.2.2\n                 */\n                decimalPoint: '.',\n                /**\n                 * [Metric prefixes](https://en.wikipedia.org/wiki/Metric_prefix) used\n                 * to shorten high numbers in axis labels. Replacing any of the\n                 * positions with `null` causes the full number to be written. Setting\n                 * `numericSymbols` to `null` disables shortening altogether.\n                 *\n                 * @sample {highcharts} highcharts/lang/numericsymbols/\n                 *         Replacing the symbols with text\n                 * @sample {highstock} highcharts/lang/numericsymbols/\n                 *         Replacing the symbols with text\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n                 * @since   2.3.0\n                 */\n                numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\n                /**\n                 * The magnitude of [numericSymbols](#lang.numericSymbol) replacements.\n                 * Use 10000 for Japanese, Korean and various Chinese locales, which\n                 * use symbols for 10^4, 10^8 and 10^12.\n                 *\n                 * @sample highcharts/lang/numericsymbolmagnitude/\n                 *         10000 magnitude for Japanese\n                 *\n                 * @type      {number}\n                 * @default   1000\n                 * @since     5.0.3\n                 * @apioption lang.numericSymbolMagnitude\n                 */\n                /**\n                 * The text for the label appearing when a chart is zoomed.\n                 *\n                 * @since 1.2.4\n                 */\n                resetZoom: 'Reset zoom',\n                /**\n                 * The tooltip title for the label appearing when a chart is zoomed.\n                 *\n                 * @since 1.2.4\n                 */\n                resetZoomTitle: 'Reset zoom level 1:1',\n                /**\n                 * The default thousands separator used in the `Highcharts.numberFormat`\n                 * method unless otherwise specified in the function arguments. Defaults\n                 * to a single space character, which is recommended in\n                 * [ISO 31-0](https://en.wikipedia.org/wiki/ISO_31-0#Numbers) and works\n                 * across Anglo-American and continental European languages.\n                 *\n                 * @default \\u0020\n                 * @since   1.2.2\n                 */\n                thousandsSep: ' '\n            },\n            /**\n             * Global options that don't apply to each chart. These options, like\n             * the `lang` options, must be set using the `Highcharts.setOptions`\n             * method.\n             *\n             * ```js\n             * Highcharts.setOptions({\n             *     global: {\n             *         useUTC: false\n             *     }\n             * });\n             * ```\n             */\n            /**\n             * _Canvg rendering for Android 2.x is removed as of Highcharts 5.0\\.\n             * Use the [libURL](#exporting.libURL) option to configure exporting._\n             *\n             * The URL to the additional file to lazy load for Android 2.x devices.\n             * These devices don't support SVG, so we download a helper file that\n             * contains [canvg](https://github.com/canvg/canvg), its dependency\n             * rbcolor, and our own CanVG Renderer class. To avoid hotlinking to\n             * our site, you can install canvas-tools.js on your own server and\n             * change this option accordingly.\n             *\n             * @deprecated\n             *\n             * @type      {string}\n             * @default   https://code.highcharts.com/{version}/modules/canvas-tools.js\n             * @product   highcharts highmaps\n             * @apioption global.canvasToolsURL\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.useUTC](#time.useUTC) that supports individual time settings\n             * per chart.\n             *\n             * @deprecated\n             *\n             * @type      {boolean}\n             * @apioption global.useUTC\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.Date](#time.Date) that supports individual time settings\n             * per chart.\n             *\n             * @deprecated\n             *\n             * @type      {Function}\n             * @product   highcharts highstock\n             * @apioption global.Date\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.getTimezoneOffset](#time.getTimezoneOffset) that supports\n             * individual time settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {Function}\n             * @product   highcharts highstock\n             * @apioption global.getTimezoneOffset\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.timezone](#time.timezone) that supports individual time\n             * settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {string}\n             * @product   highcharts highstock\n             * @apioption global.timezone\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.timezoneOffset](#time.timezoneOffset) that supports individual\n             * time settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {number}\n             * @product   highcharts highstock\n             * @apioption global.timezoneOffset\n             */\n            global: {},\n            /**\n             * Time options that can apply globally or to individual charts. These\n             * settings affect how `datetime` axes are laid out, how tooltips are\n             * formatted, how series\n             * [pointIntervalUnit](#plotOptions.series.pointIntervalUnit) works and how\n             * the Highstock range selector handles time.\n             *\n             * The common use case is that all charts in the same Highcharts object\n             * share the same time settings, in which case the global settings are set\n             * using `setOptions`.\n             *\n             * ```js\n             * // Apply time settings globally\n             * Highcharts.setOptions({\n             *     time: {\n             *         timezone: 'Europe/London'\n             *     }\n             * });\n             * // Apply time settings by instance\n             * var chart = Highcharts.chart('container', {\n             *     time: {\n             *         timezone: 'America/New_York'\n             *     },\n             *     series: [{\n             *         data: [1, 4, 3, 5]\n             *     }]\n             * });\n             *\n             * // Use the Time object\n             * console.log(\n             *        'Current time in New York',\n             *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n             * );\n             * ```\n             *\n             * Since v6.0.5, the time options were moved from the `global` obect to the\n             * `time` object, and time options can be set on each individual chart.\n             *\n             * @sample {highcharts|highstock}\n             *         highcharts/time/timezone/\n             *         Set the timezone globally\n             * @sample {highcharts}\n             *         highcharts/time/individual/\n             *         Set the timezone per chart instance\n             * @sample {highstock}\n             *         stock/time/individual/\n             *         Set the timezone per chart instance\n             *\n             * @since     6.0.5\n             * @optionparent time\n             */\n            time: {\n                /**\n                 * A custom `Date` class for advanced date handling. For example,\n                 * [JDate](https://github.com/tahajahangir/jdate) can be hooked in to\n                 * handle Jalali dates.\n                 *\n                 * @type      {*}\n                 * @since     4.0.4\n                 * @product   highcharts highstock gantt\n                 */\n                Date: void 0,\n                /**\n                 * A callback to return the time zone offset for a given datetime. It\n                 * takes the timestamp in terms of milliseconds since January 1 1970,\n                 * and returns the timezone offset in minutes. This provides a hook\n                 * for drawing time based charts in specific time zones using their\n                 * local DST crossover dates, with the help of external libraries.\n                 *\n                 * @see [global.timezoneOffset](#global.timezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/gettimezoneoffset/\n                 *         Use moment.js to draw Oslo time regardless of browser locale\n                 *\n                 * @type      {Highcharts.TimezoneOffsetCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 */\n                getTimezoneOffset: void 0,\n                /**\n                 * Requires [moment.js](https://momentjs.com/). If the timezone option\n                 * is specified, it creates a default\n                 * [getTimezoneOffset](#time.getTimezoneOffset) function that looks\n                 * up the specified timezone in moment.js. If moment.js is not included,\n                 * this throws a Highcharts error in the console, but does not crash the\n                 * chart.\n                 *\n                 * @see [getTimezoneOffset](#time.getTimezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/timezone/\n                 *         Europe/Oslo\n                 *\n                 * @type      {string}\n                 * @since     5.0.7\n                 * @product   highcharts highstock gantt\n                 */\n                timezone: void 0,\n                /**\n                 * The timezone offset in minutes. Positive values are west, negative\n                 * values are east of UTC, as in the ECMAScript\n                 * [getTimezoneOffset](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)\n                 * method. Use this to display UTC based data in a predefined time zone.\n                 *\n                 * @see [time.getTimezoneOffset](#time.getTimezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/timezoneoffset/\n                 *         Timezone offset\n                 *\n                 * @since     3.0.8\n                 * @product   highcharts highstock gantt\n                 */\n                timezoneOffset: 0,\n                /**\n                 * Whether to use UTC time for axis scaling, tickmark placement and\n                 * time display in `Highcharts.dateFormat`. Advantages of using UTC\n                 * is that the time displays equally regardless of the user agent's\n                 * time zone settings. Local time can be used when the data is loaded\n                 * in real time or when correct Daylight Saving Time transitions are\n                 * required.\n                 *\n                 * @sample {highcharts} highcharts/time/useutc-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/time/useutc-false/\n                 *         False\n                 */\n                useUTC: true\n            },\n            /**\n             * General options for the chart.\n             */\n            chart: {\n                /**\n                 * Default `mapData` for all series. If set to a string, it functions\n                 * as an index into the `Highcharts.maps` array. Otherwise it is\n                 * interpreted as map data.\n                 *\n                 * @see [mapData](#series.map.mapData)\n                 *\n                 * @sample    maps/demo/geojson\n                 *            Loading geoJSON data\n                 * @sample    maps/chart/topojson\n                 *            Loading topoJSON converted to geoJSON\n                 *\n                 * @type      {string|Array<*>|Highcharts.GeoJSON}\n                 * @since     5.0.0\n                 * @product   highmaps\n                 * @apioption chart.map\n                 */\n                /**\n                 * Set lat/lon transformation definitions for the chart. If not defined,\n                 * these are extracted from the map data.\n                 *\n                 * @type      {*}\n                 * @since     5.0.0\n                 * @product   highmaps\n                 * @apioption chart.mapTransforms\n                 */\n                /**\n                 * When using multiple axis, the ticks of two or more opposite axes\n                 * will automatically be aligned by adding ticks to the axis or axes\n                 * with the least ticks, as if `tickAmount` were specified.\n                 *\n                 * This can be prevented by setting `alignTicks` to false. If the grid\n                 * lines look messy, it's a good idea to hide them for the secondary\n                 * axis by setting `gridLineWidth` to 0.\n                 *\n                 * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n                 * then the `alignTicks ` will be disabled for the Axis.\n                 *\n                 * Disabled for logarithmic axes.\n                 *\n                 * @sample {highcharts} highcharts/chart/alignticks-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/alignticks-false/\n                 *         False\n                 * @sample {highstock} stock/chart/alignticks-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/alignticks-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption chart.alignTicks\n                 */\n                /**\n                 * Set the overall animation for all chart updating. Animation can be\n                 * disabled throughout the chart by setting it to false here. It can\n                 * be overridden for each individual API method as a function parameter.\n                 * The only animation not affected by this option is the initial series\n                 * animation, see [plotOptions.series.animation](\n                 * #plotOptions.series.animation).\n                 *\n                 * The animation can either be set as a boolean or a configuration\n                 * object. If `true`, it will use the 'swing' jQuery easing and a\n                 * duration of 500 ms. If used as a configuration object, the following\n                 * properties are supported:\n                 *\n                 * - **duration**: The duration of the animation in milliseconds.\n                 *\n                 * - **easing**: A string reference to an easing function set on the\n                 *   `Math` object. See\n                 *   [the easing demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-animation-easing/).\n                 *\n                 * When zooming on a series with less than 100 points, the chart redraw\n                 * will be done with animation, but in case of more data points, it is\n                 * necessary to set this option to ensure animation on zoom.\n                 *\n                 * @sample {highcharts} highcharts/chart/animation-none/\n                 *         Updating with no animation\n                 * @sample {highcharts} highcharts/chart/animation-duration/\n                 *         With a longer duration\n                 * @sample {highcharts} highcharts/chart/animation-easing/\n                 *         With a jQuery UI easing\n                 * @sample {highmaps} maps/chart/animation-none/\n                 *         Updating with no animation\n                 * @sample {highmaps} maps/chart/animation-duration/\n                 *         With a longer duration\n                 *\n                 * @type      {boolean|Highcharts.AnimationOptionsObject}\n                 * @default   undefined\n                 * @apioption chart.animation\n                 */\n                /**\n                 * A CSS class name to apply to the charts container `div`, allowing\n                 * unique CSS styling for each chart.\n                 *\n                 * @type      {string}\n                 * @apioption chart.className\n                 */\n                /**\n                 * Event listeners for the chart.\n                 *\n                 * @apioption chart.events\n                 */\n                /**\n                 * Fires when a series is added to the chart after load time, using the\n                 * `addSeries` method. One parameter, `event`, is passed to the\n                 * function, containing common event information. Through\n                 * `event.options` you can access the series options that were passed to\n                 * the `addSeries` method. Returning false prevents the series from\n                 * being added.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-addseries/\n                 *         Alert on add series\n                 * @sample {highstock} stock/chart/events-addseries/\n                 *         Alert on add series\n                 *\n                 * @type      {Highcharts.ChartAddSeriesCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.addSeries\n                 */\n                /**\n                 * Fires when clicking on the plot background. One parameter, `event`,\n                 * is passed to the function, containing common event information.\n                 *\n                 * Information on the clicked spot can be found through `event.xAxis`\n                 * and `event.yAxis`, which are arrays containing the axes of each\n                 * dimension and each axis' value at the clicked spot. The primary axes\n                 * are `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n                 * datetime axis is milliseconds since 1970-01-01 00:00:00.\n                 *\n                 * ```js\n                 * click: function(e) {\n                 *     console.log(\n                 *         Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),\n                 *         e.yAxis[0].value\n                 *     )\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/chart/events-click/\n                 *         Alert coordinates on click\n                 * @sample {highcharts} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 * @sample {highstock} stock/chart/events-click/\n                 *         Alert coordinates on click\n                 * @sample {highstock} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 * @sample {highmaps} maps/chart/events-click/\n                 *         Record coordinates on click\n                 * @sample {highmaps} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 *\n                 * @type      {Highcharts.ChartClickCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.click\n                 */\n                /**\n                 * Fires when the chart is finished loading. Since v4.2.2, it also waits\n                 * for images to be loaded, for example from point markers. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * There is also a second parameter to the chart constructor where a\n                 * callback function can be passed to be executed on chart.load.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-load/\n                 *         Alert on chart load\n                 * @sample {highstock} stock/chart/events-load/\n                 *         Alert on chart load\n                 * @sample {highmaps} maps/chart/events-load/\n                 *         Add series on chart load\n                 *\n                 * @type      {Highcharts.ChartLoadCallbackFunction}\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.load\n                 */\n                /**\n                 * Fires when the chart is redrawn, either after a call to\n                 * `chart.redraw()` or after an axis, series or point is modified with\n                 * the `redraw` option set to `true`. One parameter, `event`, is passed\n                 * to the function, containing common event information.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-redraw/\n                 *         Alert on chart redraw\n                 * @sample {highstock} stock/chart/events-redraw/\n                 *         Alert on chart redraw when adding a series or moving the\n                 *         zoomed range\n                 * @sample {highmaps} maps/chart/events-redraw/\n                 *         Set subtitle on chart redraw\n                 *\n                 * @type      {Highcharts.ChartRedrawCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.redraw\n                 */\n                /**\n                 * Fires after initial load of the chart (directly after the `load`\n                 * event), and after each redraw (directly after the `redraw` event).\n                 *\n                 * @type      {Highcharts.ChartRenderCallbackFunction}\n                 * @since     5.0.7\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.render\n                 */\n                /**\n                 * Fires when an area of the chart has been selected. Selection is\n                 * enabled by setting the chart's zoomType. One parameter, `event`, is\n                 * passed to the function, containing common event information. The\n                 * default action for the selection event is to zoom the chart to the\n                 * selected area. It can be prevented by calling\n                 * `event.preventDefault()` or return false.\n                 *\n                 * Information on the selected area can be found through `event.xAxis`\n                 * and `event.yAxis`, which are arrays containing the axes of each\n                 * dimension and each axis' min and max values. The primary axes are\n                 * `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n                 * datetime axis is milliseconds since 1970-01-01 00:00:00.\n                 *\n                 * ```js\n                 * selection: function(event) {\n                 *     // log the min and max of the primary, datetime x-axis\n                 *     console.log(\n                 *         Highcharts.dateFormat(\n                 *             '%Y-%m-%d %H:%M:%S',\n                 *             event.xAxis[0].min\n                 *         ),\n                 *         Highcharts.dateFormat(\n                 *             '%Y-%m-%d %H:%M:%S',\n                 *             event.xAxis[0].max\n                 *         )\n                 *     );\n                 *     // log the min and max of the y axis\n                 *     console.log(event.yAxis[0].min, event.yAxis[0].max);\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/chart/events-selection/\n                 *         Report on selection and reset\n                 * @sample {highcharts} highcharts/chart/events-selection-points/\n                 *         Select a range of points through a drag selection\n                 * @sample {highstock} stock/chart/events-selection/\n                 *         Report on selection and reset\n                 * @sample {highstock} highcharts/chart/events-selection-points/\n                 *         Select a range of points through a drag selection\n                 *         (Highcharts)\n                 *\n                 * @type      {Highcharts.ChartSelectionCallbackFunction}\n                 * @apioption chart.events.selection\n                 */\n                /**\n                 * The margin between the outer edge of the chart and the plot area.\n                 * The numbers in the array designate top, right, bottom and left\n                 * respectively. Use the options `marginTop`, `marginRight`,\n                 * `marginBottom` and `marginLeft` for shorthand setting of one option.\n                 *\n                 * By default there is no margin. The actual space is dynamically\n                 * calculated from the offset of axis labels, axis title, title,\n                 * subtitle and legend in addition to the `spacingTop`, `spacingRight`,\n                 * `spacingBottom` and `spacingLeft` options.\n                 *\n                 * @sample {highcharts} highcharts/chart/margins-zero/\n                 *         Zero margins\n                 * @sample {highstock} stock/chart/margin-zero/\n                 *         Zero margins\n                 *\n                 * @type      {number|Array<number>}\n                 * @apioption chart.margin\n                 */\n                /**\n                 * The margin between the bottom outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingBottom`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginbottom/\n                 *         100px bottom margin\n                 * @sample {highstock} stock/chart/marginbottom/\n                 *         100px bottom margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginBottom\n                 */\n                /**\n                 * The margin between the left outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingLeft`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginleft/\n                 *         150px left margin\n                 * @sample {highstock} stock/chart/marginleft/\n                 *         150px left margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginLeft\n                 */\n                /**\n                 * The margin between the right outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginright/\n                 *         100px right margin\n                 * @sample {highstock} stock/chart/marginright/\n                 *         100px right margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginRight\n                 */\n                /**\n                 * The margin between the top outer edge of the chart and the plot area.\n                 * Use this to set a fixed pixel value for the margin as opposed to\n                 * the default dynamic margin. See also `spacingTop`.\n                 *\n                 * @sample {highcharts} highcharts/chart/margintop/ 100px top margin\n                 * @sample {highstock} stock/chart/margintop/\n                 *         100px top margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginTop\n                 */\n                /**\n                 * Callback function to override the default function that formats all\n                 * the numbers in the chart. Returns a string with the formatted number.\n                 *\n                 * @sample highcharts/members/highcharts-numberformat\n                 *      Arabic digits in Highcharts\n                 * @type {Highcharts.NumberFormatterCallbackFunction}\n                 * @since 8.0.0\n                 * @apioption chart.numberFormatter\n                 */\n                /**\n                 * Allows setting a key to switch between zooming and panning. Can be\n                 * one of `alt`, `ctrl`, `meta` (the command key on Mac and Windows\n                 * key on Windows) or `shift`. The keys are mapped directly to the key\n                 * properties of the click event argument (`event.altKey`,\n                 * `event.ctrlKey`, `event.metaKey` and `event.shiftKey`).\n                 *\n                 * @type       {string}\n                 * @since      4.0.3\n                 * @product    highcharts gantt\n                 * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n                 * @apioption  chart.panKey\n                 */\n                /**\n                 * Allow panning in a chart. Best used with [panKey](#chart.panKey)\n                 * to combine zooming and panning.\n                 *\n                 * On touch devices, when the [tooltip.followTouchMove](\n                 * #tooltip.followTouchMove) option is `true` (default), panning\n                 * requires two fingers. To allow panning with one finger, set\n                 * `followTouchMove` to `false`.\n                 *\n                 * @sample  {highcharts} highcharts/chart/pankey/ Zooming and panning\n                 * @sample  {highstock} stock/chart/panning/ Zooming and xy panning\n                 *\n                 * @product highcharts highstock gantt\n                 * @apioption chart.panning\n                 */\n                /**\n                 * Enable or disable chart panning.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} true\n                 * @apioption chart.panning.enabled\n                 */\n                /**\n                 * Decides in what dimensions the user can pan the chart. Can be\n                 * one of `x`, `y`, or `xy`.\n                 *\n                 * @sample {highcharts} highcharts/chart/panning-type\n                 *         Zooming and xy panning\n                 *\n                 * @type    {string}\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @default x\n                 * @apioption chart.panning.type\n                 */\n                /**\n                 * Equivalent to [zoomType](#chart.zoomType), but for multitouch\n                 * gestures only. By default, the `pinchType` is the same as the\n                 * `zoomType` setting. However, pinching can be enabled separately in\n                 * some cases, for example in stock charts where a mouse drag pans the\n                 * chart, while pinching is enabled. When [tooltip.followTouchMove](\n                 * #tooltip.followTouchMove) is true, pinchType only applies to\n                 * two-finger touches.\n                 *\n                 * @type       {string}\n                 * @default    {highcharts} undefined\n                 * @default    {highstock} x\n                 * @since      3.0\n                 * @product    highcharts highstock gantt\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @apioption  chart.pinchType\n                 */\n                /**\n                 * Whether to apply styled mode. When in styled mode, no presentational\n                 * attributes or CSS are applied to the chart SVG. Instead, CSS rules\n                 * are required to style the chart. The default style sheet is\n                 * available from `https://code.highcharts.com/css/highcharts.css`.\n                 *\n                 * @type       {boolean}\n                 * @default    false\n                 * @since      7.0\n                 * @apioption  chart.styledMode\n                 */\n                styledMode: false,\n                /**\n                 * The corner radius of the outer chart border.\n                 *\n                 * @sample {highcharts} highcharts/chart/borderradius/\n                 *         20px radius\n                 * @sample {highstock} stock/chart/border/\n                 *         10px radius\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 */\n                borderRadius: 0,\n                /**\n                 * In styled mode, this sets how many colors the class names\n                 * should rotate between. With ten colors, series (or points) are\n                 * given class names like `highcharts-color-0`, `highcharts-color-0`\n                 * [...] `highcharts-color-9`. The equivalent in non-styled mode\n                 * is to set colors using the [colors](#colors) setting.\n                 *\n                 * @since      5.0.0\n                 */\n                colorCount: 10,\n                /**\n                 * Alias of `type`.\n                 *\n                 * @sample {highcharts} highcharts/chart/defaultseriestype/\n                 *         Bar\n                 *\n                 * @deprecated\n                 *\n                 * @product highcharts\n                 */\n                defaultSeriesType: 'line',\n                /**\n                 * If true, the axes will scale to the remaining visible series once\n                 * one series is hidden. If false, hiding and showing a series will\n                 * not affect the axes or the other series. For stacks, once one series\n                 * within the stack is hidden, the rest of the stack will close in\n                 * around it even if the axis is not affected.\n                 *\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-false/\n                 *         False\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-true-stacked/\n                 *         True with stack\n                 * @sample {highstock} stock/chart/ignorehiddenseries-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/ignorehiddenseries-false/\n                 *         False\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                ignoreHiddenSeries: true,\n                /**\n                 * Whether to invert the axes so that the x axis is vertical and y axis\n                 * is horizontal. When `true`, the x axis is [reversed](#xAxis.reversed)\n                 * by default.\n                 *\n                 * @productdesc {highcharts}\n                 * If a bar series is present in the chart, it will be inverted\n                 * automatically. Inverting the chart doesn't have an effect if there\n                 * are no cartesian series in the chart, or if the chart is\n                 * [polar](#chart.polar).\n                 *\n                 * @sample {highcharts} highcharts/chart/inverted/\n                 *         Inverted line\n                 * @sample {highstock} stock/navigator/inverted/\n                 *         Inverted stock chart\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @product   highcharts highstock gantt\n                 * @apioption chart.inverted\n                 */\n                /**\n                 * The distance between the outer edge of the chart and the content,\n                 * like title or legend, or axis title and labels if present. The\n                 * numbers in the array designate top, right, bottom and left\n                 * respectively. Use the options spacingTop, spacingRight, spacingBottom\n                 * and spacingLeft options for shorthand setting of one option.\n                 *\n                 * @type    {Array<number>}\n                 * @see     [chart.margin](#chart.margin)\n                 * @default [10, 10, 15, 10]\n                 * @since   3.0.6\n                 */\n                spacing: [10, 10, 15, 10],\n                /**\n                 * The button that appears after a selection zoom, allowing the user\n                 * to reset zoom.\n                 */\n                resetZoomButton: {\n                    /**\n                     * What frame the button placement should be related to. Can be\n                     * either `plotBox` or `spacingBox`.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n                     *         Relative to the chart\n                     * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n                     *         Relative to the chart\n                     *\n                     * @type       {Highcharts.ButtonRelativeToValue}\n                     * @default    plot\n                     * @since      2.2\n                     * @apioption  chart.resetZoomButton.relativeTo\n                     */\n                    /**\n                     * A collection of attributes for the button. The object takes SVG\n                     * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n                     * border radius. The theme also supports `style`, a collection of\n                     * CSS properties for the text. Equivalent attributes for the hover\n                     * state are given in `theme.states.hover`.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n                     *         Theming the button\n                     * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n                     *         Theming the button\n                     *\n                     * @type {Highcharts.SVGAttributes}\n                     * @since 2.2\n                     */\n                    theme: {\n                        /** @internal */\n                        zIndex: 6\n                    },\n                    /**\n                     * The position of the button.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     * @sample {highstock} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     *\n                     * @type  {Highcharts.AlignObject}\n                     * @since 2.2\n                     */\n                    position: {\n                        /**\n                         * The horizontal alignment of the button.\n                         */\n                        align: 'right',\n                        /**\n                         * The horizontal offset of the button.\n                         */\n                        x: -10,\n                        /**\n                         * The vertical alignment of the button.\n                         *\n                         * @type       {Highcharts.VerticalAlignValue}\n                         * @default    top\n                         * @apioption  chart.resetZoomButton.position.verticalAlign\n                         */\n                        /**\n                         * The vertical offset of the button.\n                         */\n                        y: 10\n                    }\n                },\n                /**\n                 * The pixel width of the plot area border.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotborderwidth/\n                 *         1px border\n                 * @sample {highstock} stock/chart/plotborder/\n                 *         2px border\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption chart.plotBorderWidth\n                 */\n                /**\n                 * Whether to apply a drop shadow to the plot area. Requires that\n                 * plotBackgroundColor be set. The shadow can be an object configuration\n                 * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotshadow/\n                 *         Plot shadow\n                 * @sample {highstock} stock/chart/plotshadow/\n                 *         Plot shadow\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type      {boolean|Highcharts.CSSObject}\n                 * @default   false\n                 * @apioption chart.plotShadow\n                 */\n                /**\n                 * When true, cartesian charts like line, spline, area and column are\n                 * transformed into the polar coordinate system. This produces _polar\n                 * charts_, also known as _radar charts_.\n                 *\n                 * @sample {highcharts} highcharts/demo/polar/\n                 *         Polar chart\n                 * @sample {highcharts} highcharts/demo/polar-wind-rose/\n                 *         Wind rose, stacked polar column chart\n                 * @sample {highcharts} highcharts/demo/polar-spider/\n                 *         Spider web chart\n                 * @sample {highcharts} highcharts/parallel-coordinates/polar/\n                 *         Star plot, multivariate data in a polar chart\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.3.0\n                 * @product   highcharts\n                 * @requires  highcharts-more\n                 * @apioption chart.polar\n                 */\n                /**\n                 * Whether to reflow the chart to fit the width of the container div\n                 * on resizing the window.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/reflow-false/\n                 *         False\n                 * @sample {highstock} stock/chart/reflow-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/reflow-false/\n                 *         False\n                 * @sample {highmaps} maps/chart/reflow-true/\n                 *         True by default\n                 * @sample {highmaps} maps/chart/reflow-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.1\n                 * @apioption chart.reflow\n                 */\n                /**\n                 * The HTML element where the chart will be rendered. If it is a string,\n                 * the element by that id is used. The HTML element can also be passed\n                 * by direct reference, or as the first argument of the chart\n                 * constructor, in which case the option is not needed.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         String\n                 * @sample {highcharts} highcharts/chart/renderto-object/\n                 *         Object reference\n                 * @sample {highcharts} highcharts/chart/renderto-jquery/\n                 *         Object reference through jQuery\n                 * @sample {highstock} stock/chart/renderto-string/\n                 *         String\n                 * @sample {highstock} stock/chart/renderto-object/\n                 *         Object reference\n                 * @sample {highstock} stock/chart/renderto-jquery/\n                 *         Object reference through jQuery\n                 *\n                 * @type      {string|Highcharts.HTMLDOMElement}\n                 * @apioption chart.renderTo\n                 */\n                /**\n                 * The background color of the marker square when selecting (zooming\n                 * in on) an area of the chart.\n                 *\n                 * @see In styled mode, the selection marker fill is set with the\n                 *      `.highcharts-selection-marker` class.\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @default   rgba(51,92,173,0.25)\n                 * @since     2.1.7\n                 * @apioption chart.selectionMarkerFill\n                 */\n                /**\n                 * Whether to apply a drop shadow to the outer chart area. Requires\n                 * that backgroundColor be set. The shadow can be an object\n                 * configuration containing `color`, `offsetX`, `offsetY`, `opacity` and\n                 * `width`.\n                 *\n                 * @sample {highcharts} highcharts/chart/shadow/\n                 *         Shadow\n                 * @sample {highstock} stock/chart/shadow/\n                 *         Shadow\n                 * @sample {highmaps} maps/chart/border/\n                 *         Chart border and shadow\n                 *\n                 * @type      {boolean|Highcharts.CSSObject}\n                 * @default   false\n                 * @apioption chart.shadow\n                 */\n                /**\n                 * Whether to show the axes initially. This only applies to empty charts\n                 * where series are added dynamically, as axes are automatically added\n                 * to cartesian series.\n                 *\n                 * @sample {highcharts} highcharts/chart/showaxes-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/chart/showaxes-true/\n                 *         True\n                 *\n                 * @type      {boolean}\n                 * @since     1.2.5\n                 * @product   highcharts gantt\n                 * @apioption chart.showAxes\n                 */\n                /**\n                 * The space between the bottom edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingbottom/\n                 *         Spacing bottom set to 100\n                 * @sample {highstock} stock/chart/spacingbottom/\n                 *         Spacing bottom set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   15\n                 * @since     2.1\n                 * @apioption chart.spacingBottom\n                 */\n                /**\n                 * The space between the left edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingleft/\n                 *         Spacing left set to 100\n                 * @sample {highstock} stock/chart/spacingleft/\n                 *         Spacing left set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingLeft\n                 */\n                /**\n                 * The space between the right edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingright-100/\n                 *         Spacing set to 100\n                 * @sample {highcharts} highcharts/chart/spacingright-legend/\n                 *         Legend in right position with default spacing\n                 * @sample {highstock} stock/chart/spacingright/\n                 *         Spacing set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingRight\n                 */\n                /**\n                 * The space between the top edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingtop-100/\n                 *         A top spacing of 100\n                 * @sample {highcharts} highcharts/chart/spacingtop-10/\n                 *         Floating chart title makes the plot area align to the default\n                 *         spacingTop of 10.\n                 * @sample {highstock} stock/chart/spacingtop/\n                 *         A top spacing of 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingTop\n                 */\n                /**\n                 * Additional CSS styles to apply inline to the container `div`. Note\n                 * that since the default font styles are applied in the renderer, it\n                 * is ignorant of the individual chart options and must be set globally.\n                 *\n                 * @see    In styled mode, general chart styles can be set with the\n                 *         `.highcharts-root` class.\n                 * @sample {highcharts} highcharts/chart/style-serif-font/\n                 *         Using a serif type font\n                 * @sample {highcharts} highcharts/css/em/\n                 *         Styled mode with relative font sizes\n                 * @sample {highstock} stock/chart/style/\n                 *         Using a serif type font\n                 * @sample {highmaps} maps/chart/style-serif-font/\n                 *         Using a serif type font\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"fontFamily\": \"\\\"Lucida Grande\\\", \\\"Lucida Sans Unicode\\\", Verdana, Arial, Helvetica, sans-serif\",\"fontSize\":\"12px\"}\n                 * @apioption chart.style\n                 */\n                /**\n                 * The default series type for the chart. Can be any of the chart types\n                 * listed under [plotOptions](#plotOptions) and [series](#series) or can\n                 * be a series provided by an additional module.\n                 *\n                 * In TypeScript this option has no effect in sense of typing and\n                 * instead the `type` option must always be set in the series.\n                 *\n                 * @sample {highcharts} highcharts/chart/type-bar/\n                 *         Bar\n                 * @sample {highstock} stock/chart/type/\n                 *         Areaspline\n                 * @sample {highmaps} maps/chart/type-mapline/\n                 *         Mapline\n                 *\n                 * @type       {string}\n                 * @default    {highcharts} line\n                 * @default    {highstock} line\n                 * @default    {highmaps} map\n                 * @since      2.1.0\n                 * @apioption  chart.type\n                 */\n                /**\n                 * Decides in what dimensions the user can zoom by dragging the mouse.\n                 * Can be one of `x`, `y` or `xy`.\n                 *\n                 * @see [panKey](#chart.panKey)\n                 *\n                 * @sample {highcharts} highcharts/chart/zoomtype-none/\n                 *         None by default\n                 * @sample {highcharts} highcharts/chart/zoomtype-x/\n                 *         X\n                 * @sample {highcharts} highcharts/chart/zoomtype-y/\n                 *         Y\n                 * @sample {highcharts} highcharts/chart/zoomtype-xy/\n                 *         Xy\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         None by default\n                 * @sample {highstock} stock/chart/zoomtype-x/\n                 *         X\n                 * @sample {highstock} stock/chart/zoomtype-y/\n                 *         Y\n                 * @sample {highstock} stock/chart/zoomtype-xy/\n                 *         Xy\n                 *\n                 * @type       {string}\n                 * @product    highcharts highstock gantt\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @apioption  chart.zoomType\n                 */\n                /**\n                 * An explicit width for the chart. By default (when `null`) the width\n                 * is calculated from the offset width of the containing element.\n                 *\n                 * @sample {highcharts} highcharts/chart/width/\n                 *         800px wide\n                 * @sample {highstock} stock/chart/width/\n                 *         800px wide\n                 * @sample {highmaps} maps/chart/size/\n                 *         Chart with explicit size\n                 *\n                 * @type {null|number|string}\n                 */\n                width: null,\n                /**\n                 * An explicit height for the chart. If a _number_, the height is\n                 * given in pixels. If given a _percentage string_ (for example\n                 * `'56%'`), the height is given as the percentage of the actual chart\n                 * width. This allows for preserving the aspect ratio across responsive\n                 * sizes.\n                 *\n                 * By default (when `null`) the height is calculated from the offset\n                 * height of the containing element, or 400 pixels if the containing\n                 * element's height is 0.\n                 *\n                 * @sample {highcharts} highcharts/chart/height/\n                 *         500px height\n                 * @sample {highstock} stock/chart/height/\n                 *         300px height\n                 * @sample {highmaps} maps/chart/size/\n                 *         Chart with explicit size\n                 * @sample highcharts/chart/height-percent/\n                 *         Highcharts with percentage height\n                 *\n                 * @type {null|number|string}\n                 */\n                height: null,\n                /**\n                 * The color of the outer chart border.\n                 *\n                 * @see In styled mode, the stroke is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/bordercolor/\n                 *         Brown border\n                 * @sample {highstock} stock/chart/border/\n                 *         Brown border\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                borderColor: '#335cad',\n                /**\n                 * The pixel width of the outer chart border.\n                 *\n                 * @see In styled mode, the stroke is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/borderwidth/\n                 *         5px border\n                 * @sample {highstock} stock/chart/border/\n                 *         2px border\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption chart.borderWidth\n                 */\n                /**\n                 * The background color or gradient for the outer chart area.\n                 *\n                 * @see In styled mode, the background is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highcharts} highcharts/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highstock} stock/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highstock} stock/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highmaps} maps/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highmaps} maps/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                backgroundColor: '#ffffff',\n                /**\n                 * The background color or gradient for the plot area.\n                 *\n                 * @see In styled mode, the plot background is set with the\n                 *      `.highcharts-plot-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highcharts} highcharts/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highstock} stock/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highstock} stock/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption chart.plotBackgroundColor\n                 */\n                /**\n                 * The URL for an image to use as the plot background. To set an image\n                 * as the background for the entire chart, set a CSS background image\n                 * to the container element. Note that for the image to be applied to\n                 * exported charts, its URL needs to be accessible by the export server.\n                 *\n                 * @see In styled mode, a plot background image can be set with the\n                 *      `.highcharts-plot-background` class and a [custom pattern](\n                 *      https://www.highcharts.com/docs/chart-design-and-style/\n                 *      gradients-shadows-and-patterns).\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbackgroundimage/\n                 *         Skies\n                 * @sample {highstock} stock/chart/plotbackgroundimage/\n                 *         Skies\n                 *\n                 * @type      {string}\n                 * @apioption chart.plotBackgroundImage\n                 */\n                /**\n                 * The color of the inner chart or plot area border.\n                 *\n                 * @see In styled mode, a plot border stroke can be set with the\n                 *      `.highcharts-plot-border` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbordercolor/\n                 *         Blue border\n                 * @sample {highstock} stock/chart/plotborder/\n                 *         Blue border\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                plotBorderColor: '#cccccc'\n            },\n            /**\n             * The chart's main title.\n             *\n             * @sample {highmaps} maps/title/title/\n             *         Title options demonstrated\n             */\n            title: {\n                /**\n                 * When the title is floating, the plot area will not move to make space\n                 * for it.\n                 *\n                 * @sample {highcharts} highcharts/chart/zoomtype-none/\n                 *         False by default\n                 * @sample {highcharts} highcharts/title/floating/\n                 *         True - title on top of the plot area\n                 * @sample {highstock} stock/chart/title-floating/\n                 *         True - title on top of the plot area\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption title.floating\n                 */\n                /**\n                 * CSS styles for the title. Use this for font styling, but use `align`,\n                 * `x` and `y` for text alignment.\n                 *\n                 * In styled mode, the title style is given in the `.highcharts-title`\n                 * class.\n                 *\n                 * @sample {highcharts} highcharts/title/style/\n                 *         Custom color and weight\n                 * @sample {highstock} stock/chart/title-style/\n                 *         Custom color and weight\n                 * @sample highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {highcharts|highmaps} { \"color\": \"#333333\", \"fontSize\": \"18px\" }\n                 * @default   {highstock} { \"color\": \"#333333\", \"fontSize\": \"16px\" }\n                 * @apioption title.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption title.useHTML\n                 */\n                /**\n                 * The vertical alignment of the title. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When a value is given, the title behaves\n                 * as if [floating](#title.floating) were `true`.\n                 *\n                 * @sample {highcharts} highcharts/title/verticalalign/\n                 *         Chart title in bottom right corner\n                 * @sample {highstock} stock/chart/title-verticalalign/\n                 *         Chart title in bottom right corner\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1\n                 * @apioption title.verticalAlign\n                 */\n                /**\n                 * The x position of the title relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/title/align/\n                 *         Aligned to the plot area (x = 70px = margin left - spacing\n                 *         left)\n                 * @sample {highstock} stock/chart/title-align/\n                 *         Aligned to the plot area (x = 50px = margin left - spacing\n                 *         left)\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption title.x\n                 */\n                /**\n                 * The y position of the title relative to the alignment within\n                 * [chart.spacingTop](#chart.spacingTop) and [chart.spacingBottom](\n                 * #chart.spacingBottom). By default it depends on the font size.\n                 *\n                 * @sample {highcharts} highcharts/title/y/\n                 *         Title inside the plot area\n                 * @sample {highstock} stock/chart/title-verticalalign/\n                 *         Chart title in bottom right corner\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption title.y\n                 */\n                /**\n                 * The title of the chart. To disable the title, set the `text` to\n                 * `undefined`.\n                 *\n                 * @sample {highcharts} highcharts/title/text/\n                 *         Custom title\n                 * @sample {highstock} stock/chart/title-text/\n                 *         Custom title\n                 *\n                 * @default {highcharts|highmaps} Chart title\n                 * @default {highstock} undefined\n                 */\n                text: 'Chart title',\n                /**\n                 * The horizontal alignment of the title. Can be one of \"left\", \"center\"\n                 * and \"right\".\n                 *\n                 * @sample {highcharts} highcharts/title/align/\n                 *         Aligned to the plot area (x = 70px = margin left - spacing\n                 *         left)\n                 * @sample {highstock} stock/chart/title-align/\n                 *         Aligned to the plot area (x = 50px = margin left - spacing\n                 *         left)\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * The margin between the title and the plot area, or if a subtitle\n                 * is present, the margin between the subtitle and the plot area.\n                 *\n                 * @sample {highcharts} highcharts/title/margin-50/\n                 *         A chart title margin of 50\n                 * @sample {highcharts} highcharts/title/margin-subtitle/\n                 *         The same margin applied with a subtitle\n                 * @sample {highstock} stock/chart/title-margin/\n                 *         A chart title margin of 50\n                 *\n                 * @since 2.1\n                 */\n                margin: 15,\n                /**\n                 * Adjustment made to the title width, normally to reserve space for\n                 * the exporting burger menu.\n                 *\n                 * @sample highcharts/title/widthadjust/\n                 *         Wider menu, greater padding\n                 *\n                 * @since 4.2.5\n                 */\n                widthAdjust: -44\n            },\n            /**\n             * The chart's subtitle. This can be used both to display a subtitle below\n             * the main title, and to display random text anywhere in the chart. The\n             * subtitle can be updated after chart initialization through the\n             * `Chart.setTitle` method.\n             *\n             * @sample {highmaps} maps/title/subtitle/\n             *         Subtitle options demonstrated\n             */\n            subtitle: {\n                /**\n                 * When the subtitle is floating, the plot area will not move to make\n                 * space for it.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/floating/\n                 *         Floating title and subtitle\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote floating at bottom right of plot area\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption subtitle.floating\n                 */\n                /**\n                 * CSS styles for the title.\n                 *\n                 * In styled mode, the subtitle style is given in the\n                 * `.highcharts-subtitle` class.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/style/\n                 *         Custom color and weight\n                 * @sample {highcharts} highcharts/css/titles/\n                 *         Styled mode\n                 * @sample {highstock} stock/chart/subtitle-style\n                 *         Custom color and weight\n                 * @sample {highstock} highcharts/css/titles/\n                 *         Styled mode\n                 * @sample {highmaps} highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"#666666\"}\n                 * @apioption subtitle.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption subtitle.useHTML\n                 */\n                /**\n                 * The vertical alignment of the title. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When middle, the subtitle behaves as\n                 * floating.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/verticalalign/\n                 *         Footnote at the bottom right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1\n                 * @apioption subtitle.verticalAlign\n                 */\n                /**\n                 * The x position of the subtitle relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/align/\n                 *         Footnote at right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption subtitle.x\n                 */\n                /**\n                 * The y position of the subtitle relative to the alignment within\n                 * `chart.spacingTop` and `chart.spacingBottom`. By default the subtitle\n                 * is laid out below the title unless the title is floating.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/verticalalign/\n                 *         Footnote at the bottom right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption subtitle.y\n                 */\n                /**\n                 * The subtitle of the chart.\n                 *\n                 * @sample {highcharts|highstock} highcharts/subtitle/text/\n                 *         Custom subtitle\n                 * @sample {highcharts|highstock} highcharts/subtitle/text-formatted/\n                 *         Formatted and linked text.\n                 */\n                text: '',\n                /**\n                 * The horizontal alignment of the subtitle. Can be one of \"left\",\n                 *  \"center\" and \"right\".\n                 *\n                 * @sample {highcharts} highcharts/subtitle/align/\n                 *         Footnote at right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at bottom right of plot area\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * Adjustment made to the subtitle width, normally to reserve space\n                 * for the exporting burger menu.\n                 *\n                 * @see [title.widthAdjust](#title.widthAdjust)\n                 *\n                 * @sample highcharts/title/widthadjust/\n                 *         Wider menu, greater padding\n                 *\n                 * @since 4.2.5\n                 */\n                widthAdjust: -44\n            },\n            /**\n             * The chart's caption, which will render below the chart and will be part\n             * of exported charts. The caption can be updated after chart initialization\n             * through the `Chart.update` or `Chart.caption.update` methods.\n             *\n             * @sample highcharts/caption/text/\n             *         A chart with a caption\n             * @since  7.2.0\n             */\n            caption: {\n                /**\n                 * When the caption is floating, the plot area will not move to make\n                 * space for it.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption caption.floating\n                 */\n                /**\n                 * The margin between the caption and the plot area.\n                 */\n                margin: 15,\n                /**\n                 * CSS styles for the caption.\n                 *\n                 * In styled mode, the caption style is given in the\n                 * `.highcharts-caption` class.\n                 *\n                 * @sample {highcharts} highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"#666666\"}\n                 * @apioption caption.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption caption.useHTML\n                 */\n                /**\n                 * The x position of the caption relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption caption.x\n                 */\n                /**\n                 * The y position of the caption relative to the alignment within\n                 * `chart.spacingTop` and `chart.spacingBottom`.\n                 *\n                 * @type      {number}\n                 * @apioption caption.y\n                 */\n                /**\n                 * The caption text of the chart.\n                 *\n                 * @sample {highcharts} highcharts/caption/text/\n                 *         Custom caption\n                 */\n                text: '',\n                /**\n                 * The horizontal alignment of the caption. Can be one of \"left\",\n                 *  \"center\" and \"right\".\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 */\n                align: 'left',\n                /**\n                 * The vertical alignment of the caption. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When middle, the caption behaves as\n                 * floating.\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 */\n                verticalAlign: 'bottom'\n            },\n            /**\n             * The plotOptions is a wrapper object for config objects for each series\n             * type. The config objects for each series can also be overridden for\n             * each series item as given in the series array.\n             *\n             * Configuration options for the series are given in three levels. Options\n             * for all series in a chart are given in the [plotOptions.series](\n             * #plotOptions.series) object. Then options for all series of a specific\n             * type are given in the plotOptions of that type, for example\n             * `plotOptions.line`. Next, options for one single series are given in\n             * [the series array](#series).\n             */\n            plotOptions: {},\n            /**\n             * HTML labels that can be positioned anywhere in the chart area.\n             *\n             * This option is deprecated since v7.1.2. Instead, use\n             * [annotations](#annotations) that support labels.\n             *\n             * @deprecated\n             * @product   highcharts highstock\n             */\n            labels: {\n                /**\n                 * An HTML label that can be positioned anywhere in the chart area.\n                 *\n                 * @deprecated\n                 * @type      {Array<*>}\n                 * @apioption labels.items\n                 */\n                /**\n                 * Inner HTML or text for the label.\n                 *\n                 * @deprecated\n                 * @type      {string}\n                 * @apioption labels.items.html\n                 */\n                /**\n                 * CSS styles for each label. To position the label, use left and top\n                 * like this:\n                 * ```js\n                 * style: {\n                 *     left: '100px',\n                 *     top: '100px'\n                 * }\n                 * ```\n                 *\n                 * @deprecated\n                 * @type      {Highcharts.CSSObject}\n                 * @apioption labels.items.style\n                 */\n                /**\n                 * Shared CSS styles for all labels.\n                 *\n                 * @deprecated\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#333333\", \"position\": \"absolute\"}\n                 */\n                style: {\n                    /**\n                     * @ignore-option\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore-option\n                     */\n                    color: '#333333'\n                }\n            },\n            /**\n             * The legend is a box containing a symbol and name for each series\n             * item or point item in the chart. Each series (or points in case\n             * of pie charts) is represented by a symbol and its name in the legend.\n             *\n             * It is possible to override the symbol creator function and create\n             * [custom legend symbols](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/studies/legend-custom-symbol/).\n             *\n             * @productdesc {highmaps}\n             * A Highmaps legend by default contains one legend item per series, but if\n             * a `colorAxis` is defined, the axis will be displayed in the legend.\n             * Either as a gradient, or as multiple legend items for `dataClasses`.\n             */\n            legend: {\n                /**\n                 * The background color of the legend.\n                 *\n                 * @see In styled mode, the legend background fill can be applied with\n                 *      the `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/backgroundcolor/\n                 *         Yellowish background\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption legend.backgroundColor\n                 */\n                /**\n                 * The width of the drawn border around the legend.\n                 *\n                 * @see In styled mode, the legend border stroke width can be applied\n                 *      with the `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/borderwidth/\n                 *         2px border width\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption legend.borderWidth\n                 */\n                /**\n                 * Enable or disable the legend. There is also a series-specific option,\n                 * [showInLegend](#plotOptions.series.showInLegend), that can hide the\n                 * series from the legend. In some series types this is `false` by\n                 * default, so it must set to `true` in order to show the legend for the\n                 * series.\n                 *\n                 * @sample {highcharts} highcharts/legend/enabled-false/ Legend disabled\n                 * @sample {highstock} stock/legend/align/ Various legend options\n                 * @sample {highmaps} maps/legend/enabled-false/ Legend disabled\n                 *\n                 * @default {highstock} false\n                 * @default {highmaps} true\n                 * @default {gantt} false\n                 */\n                enabled: true,\n                /**\n                 * The horizontal alignment of the legend box within the chart area.\n                 * Valid values are `left`, `center` and `right`.\n                 *\n                 * In the case that the legend is aligned in a corner position, the\n                 * `layout` option will determine whether to place it above/below\n                 * or on the side of the plot area.\n                 *\n                 * @sample {highcharts} highcharts/legend/align/\n                 *         Legend at the right of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * If the [layout](legend.layout) is `horizontal` and the legend items\n                 * span over two lines or more, whether to align the items into vertical\n                 * columns. Setting this to `false` makes room for more items, but will\n                 * look more messy.\n                 *\n                 * @since 6.1.0\n                 */\n                alignColumns: true,\n                /**\n                 * When the legend is floating, the plot area ignores it and is allowed\n                 * to be placed below it.\n                 *\n                 * @sample {highcharts} highcharts/legend/floating-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/legend/floating-true/\n                 *         True\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Floating legend\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption legend.floating\n                 */\n                /**\n                 * The layout of the legend items. Can be one of `horizontal` or\n                 * `vertical` or `proximate`. When `proximate`, the legend items will be\n                 * placed as close as possible to the graphs they're representing,\n                 * except in inverted charts or when the legend position doesn't allow\n                 * it.\n                 *\n                 * @sample {highcharts} highcharts/legend/layout-horizontal/\n                 *         Horizontal by default\n                 * @sample {highcharts} highcharts/legend/layout-vertical/\n                 *         Vertical\n                 * @sample highcharts/legend/layout-proximate\n                 *         Labels proximate to the data\n                 * @sample {highstock} stock/legend/layout-horizontal/\n                 *         Horizontal by default\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Vertical with data classes\n                 * @sample {highmaps} maps/legend/layout-vertical/\n                 *         Vertical with color axis gradient\n                 *\n                 * @validvalue [\"horizontal\", \"vertical\", \"proximate\"]\n                 */\n                layout: 'horizontal',\n                /**\n                 * In a legend with horizontal layout, the itemDistance defines the\n                 * pixel distance between each item.\n                 *\n                 * @sample {highcharts} highcharts/legend/layout-horizontal/\n                 *         50px item distance\n                 * @sample {highstock} highcharts/legend/layout-horizontal/\n                 *         50px item distance\n                 *\n                 * @type      {number}\n                 * @default   {highcharts} 20\n                 * @default   {highstock} 20\n                 * @default   {highmaps} 8\n                 * @since     3.0.3\n                 * @apioption legend.itemDistance\n                 */\n                /**\n                 * The pixel bottom margin for each legend item.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.0\n                 * @apioption legend.itemMarginBottom\n                 */\n                /**\n                 * The pixel top margin for each legend item.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.0\n                 * @apioption legend.itemMarginTop\n                 */\n                /**\n                 * The width for each legend item. By default the items are laid out\n                 * successively. In a [horizontal layout](legend.layout), if the items\n                 * are laid out across two rows or more, they will be vertically aligned\n                 * depending on the [legend.alignColumns](legend.alignColumns) option.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemwidth-default/\n                 *         Undefined by default\n                 * @sample {highcharts} highcharts/legend/itemwidth-80/\n                 *         80 for aligned legend items\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption legend.itemWidth\n                 */\n                /**\n                 * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                 * for each legend label. Available variables relates to properties on\n                 * the series, or the point in case of pies.\n                 *\n                 * @type      {string}\n                 * @default   {name}\n                 * @since     1.3\n                 * @apioption legend.labelFormat\n                 */\n                /* eslint-disable valid-jsdoc */\n                /**\n                 * Callback function to format each of the series' labels. The `this`\n                 * keyword refers to the series object, or the point object in case of\n                 * pie charts. By default the series or point name is printed.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps the context can also be a data class in case of a\n                 * `colorAxis`.\n                 *\n                 * @sample {highcharts} highcharts/legend/labelformatter/\n                 *         Add text\n                 * @sample {highmaps} maps/legend/labelformatter/\n                 *         Data classes with label formatter\n                 *\n                 * @type {Highcharts.FormatterCallbackFunction<Point|Series>}\n                 */\n                labelFormatter: function () {\n                    /** eslint-enable valid-jsdoc */\n                    return this.name;\n                },\n                /**\n                 * Line height for the legend items. Deprecated as of 2.1\\. Instead,\n                 * the line height for each item can be set using\n                 * `itemStyle.lineHeight`, and the padding between items using\n                 * `itemMarginTop` and `itemMarginBottom`.\n                 *\n                 * @sample {highcharts} highcharts/legend/lineheight/\n                 *         Setting padding\n                 *\n                 * @deprecated\n                 *\n                 * @type      {number}\n                 * @default   16\n                 * @since     2.0\n                 * @product   highcharts gantt\n                 * @apioption legend.lineHeight\n                 */\n                /**\n                 * If the plot area sized is calculated automatically and the legend is\n                 * not floating, the legend margin is the space between the legend and\n                 * the axis labels or plot area.\n                 *\n                 * @sample {highcharts} highcharts/legend/margin-default/\n                 *         12 pixels by default\n                 * @sample {highcharts} highcharts/legend/margin-30/\n                 *         30 pixels\n                 *\n                 * @type      {number}\n                 * @default   12\n                 * @since     2.1\n                 * @apioption legend.margin\n                 */\n                /**\n                 * Maximum pixel height for the legend. When the maximum height is\n                 * extended, navigation will show.\n                 *\n                 * @type      {number}\n                 * @since     2.3.0\n                 * @apioption legend.maxHeight\n                 */\n                /**\n                 * The color of the drawn border around the legend.\n                 *\n                 * @see In styled mode, the legend border stroke can be applied with the\n                 *      `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/bordercolor/\n                 *         Brown border\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                borderColor: '#999999',\n                /**\n                 * The border corner radius of the legend.\n                 *\n                 * @sample {highcharts} highcharts/legend/borderradius-default/\n                 *         Square by default\n                 * @sample {highcharts} highcharts/legend/borderradius-round/\n                 *         5px rounded\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 */\n                borderRadius: 0,\n                /**\n                 * Options for the paging or navigation appearing when the legend is\n                 * overflown. Navigation works well on screen, but not in static\n                 * exported images. One way of working around that is to\n                 * [increase the chart height in\n                 * export](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/navigation-enabled-false/).\n                 */\n                navigation: {\n                    /**\n                     * How to animate the pages when navigating up or down. A value of\n                     * `true` applies the default navigation given in the\n                     * `chart.animation` option. Additional options can be given as an\n                     * object containing values for easing and duration.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {boolean|Highcharts.AnimationOptionsObject}\n                     * @default   true\n                     * @since     2.2.4\n                     * @apioption legend.navigation.animation\n                     */\n                    /**\n                     * The pixel size of the up and down arrows in the legend paging\n                     * navigation.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {number}\n                     * @default   12\n                     * @since     2.2.4\n                     * @apioption legend.navigation.arrowSize\n                     */\n                    /**\n                     * Whether to enable the legend navigation. In most cases, disabling\n                     * the navigation results in an unwanted overflow.\n                     *\n                     * See also the [adapt chart to legend](\n                     * https://www.highcharts.com/products/plugin-registry/single/8/Adapt-Chart-To-Legend)\n                     * plugin for a solution to extend the chart height to make room for\n                     * the legend, optionally in exported charts only.\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     4.2.4\n                     * @apioption legend.navigation.enabled\n                     */\n                    /**\n                     * Text styles for the legend page navigation.\n                     *\n                     * @see In styled mode, the navigation items are styled with the\n                     *      `.highcharts-legend-navigation` class.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {Highcharts.CSSObject}\n                     * @since     2.2.4\n                     * @apioption legend.navigation.style\n                     */\n                    /**\n                     * The color for the active up or down arrow in the legend page\n                     * navigation.\n                     *\n                     * @see In styled mode, the active arrow be styled with the\n                     *      `.highcharts-legend-nav-active` class.\n                     *\n                     * @sample  {highcharts} highcharts/legend/navigation/\n                     *          Legend page navigation demonstrated\n                     * @sample  {highstock} highcharts/legend/navigation/\n                     *          Legend page navigation demonstrated\n                     *\n                     * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @since 2.2.4\n                     */\n                    activeColor: '#003399',\n                    /**\n                     * The color of the inactive up or down arrow in the legend page\n                     * navigation. .\n                     *\n                     * @see In styled mode, the inactive arrow be styled with the\n                     *      `.highcharts-legend-nav-inactive` class.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @since 2.2.4\n                     */\n                    inactiveColor: '#cccccc'\n                },\n                /**\n                 * The inner padding of the legend box.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   8\n                 * @since     2.2.0\n                 * @apioption legend.padding\n                 */\n                /**\n                 * Whether to reverse the order of the legend items compared to the\n                 * order of the series or points as defined in the configuration object.\n                 *\n                 * @see [yAxis.reversedStacks](#yAxis.reversedStacks),\n                 *      [series.legendIndex](#series.legendIndex)\n                 *\n                 * @sample {highcharts} highcharts/legend/reversed/\n                 *         Stacked bar with reversed legend\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     1.2.5\n                 * @apioption legend.reversed\n                 */\n                /**\n                 * Whether to show the symbol on the right side of the text rather than\n                 * the left side. This is common in Arabic and Hebraic.\n                 *\n                 * @sample {highcharts} highcharts/legend/rtl/\n                 *         Symbol to the right\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.2\n                 * @apioption legend.rtl\n                 */\n                /**\n                 * CSS styles for the legend area. In the 1.x versions the position\n                 * of the legend area was determined by CSS. In 2.x, the position is\n                 * determined by properties like `align`, `verticalAlign`, `x` and `y`,\n                 * but the styles are still parsed for backwards compatibility.\n                 *\n                 * @deprecated\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @product   highcharts highstock\n                 * @apioption legend.style\n                 */\n                /**\n                 * CSS styles for each legend item. Only a subset of CSS is supported,\n                 * notably those options related to text. The default `textOverflow`\n                 * property makes long texts truncate. Set it to `undefined` to wrap\n                 * text instead. A `width` property can be added to control the text\n                 * width.\n                 *\n                 * @see In styled mode, the legend items can be styled with the\n                 *      `.highcharts-legend-item` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemstyle/\n                 *         Bold black text\n                 * @sample {highmaps} maps/legend/itemstyle/\n                 *         Item text styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#333333\", \"cursor\": \"pointer\", \"fontSize\": \"12px\", \"fontWeight\": \"bold\", \"textOverflow\": \"ellipsis\"}\n                 */\n                itemStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#333333',\n                    /**\n                     * @ignore\n                     */\n                    cursor: 'pointer',\n                    /**\n                     * @ignore\n                     */\n                    fontSize: '12px',\n                    /**\n                     * @ignore\n                     */\n                    fontWeight: 'bold',\n                    /**\n                     * @ignore\n                     */\n                    textOverflow: 'ellipsis'\n                },\n                /**\n                 * CSS styles for each legend item in hover mode. Only a subset of\n                 * CSS is supported, notably those options related to text. Properties\n                 * are inherited from `style` unless overridden here.\n                 *\n                 * @see In styled mode, the hovered legend items can be styled with\n                 *      the `.highcharts-legend-item:hover` pesudo-class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemhoverstyle/\n                 *         Red on hover\n                 * @sample {highmaps} maps/legend/itemstyle/\n                 *         Item text styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#000000\"}\n                 */\n                itemHoverStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#000000'\n                },\n                /**\n                 * CSS styles for each legend item when the corresponding series or\n                 * point is hidden. Only a subset of CSS is supported, notably those\n                 * options related to text. Properties are inherited from `style`\n                 * unless overridden here.\n                 *\n                 * @see In styled mode, the hidden legend items can be styled with\n                 *      the `.highcharts-legend-item-hidden` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemhiddenstyle/\n                 *         Darker gray color\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#cccccc\"}\n                 */\n                itemHiddenStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#cccccc'\n                },\n                /**\n                 * Whether to apply a drop shadow to the legend. A `backgroundColor`\n                 * also needs to be applied for this to take effect. The shadow can be\n                 * an object configuration containing `color`, `offsetX`, `offsetY`,\n                 * `opacity` and `width`.\n                 *\n                 * @sample {highcharts} highcharts/legend/shadow/\n                 *         White background and drop shadow\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type {boolean|Highcharts.CSSObject}\n                 */\n                shadow: false,\n                /**\n                 * Default styling for the checkbox next to a legend item when\n                 * `showCheckbox` is true.\n                 *\n                 * @type {Highcharts.CSSObject}\n                 * @default {\"width\": \"13px\", \"height\": \"13px\", \"position\":\"absolute\"}\n                 */\n                itemCheckboxStyle: {\n                    /**\n                     * @ignore\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore\n                     */\n                    width: '13px',\n                    /**\n                     * @ignore\n                     */\n                    height: '13px'\n                },\n                // itemWidth: undefined,\n                /**\n                 * When this is true, the legend symbol width will be the same as\n                 * the symbol height, which in turn defaults to the font size of the\n                 * legend items.\n                 *\n                 * @since 5.0.0\n                 */\n                squareSymbol: true,\n                /**\n                 * The pixel height of the symbol for series types that use a rectangle\n                 * in the legend. Defaults to the font size of legend items.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, when the symbol is the gradient of a vertical color\n                 * axis, the height defaults to 200.\n                 *\n                 * @sample {highmaps} maps/legend/layout-vertical-sized/\n                 *         Sized vertical gradient\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         No distance between data classes\n                 *\n                 * @type      {number}\n                 * @since     3.0.8\n                 * @apioption legend.symbolHeight\n                 */\n                /**\n                 * The border radius of the symbol for series types that use a rectangle\n                 * in the legend. Defaults to half the `symbolHeight`.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 * @sample {highstock} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 * @sample {highmaps} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 *\n                 * @type      {number}\n                 * @since     3.0.8\n                 * @apioption legend.symbolRadius\n                 */\n                /**\n                 * The pixel width of the legend item symbol. When the `squareSymbol`\n                 * option is set, this defaults to the `symbolHeight`, otherwise 16.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, when the symbol is the gradient of a horizontal color\n                 * axis, the width defaults to 200.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolwidth/\n                 *         Greater symbol width and padding\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/layout-vertical-sized/\n                 *         Sized vertical gradient\n                 *\n                 * @type      {number}\n                 * @apioption legend.symbolWidth\n                 */\n                /**\n                 * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the legend item texts.\n                 *\n                 * Prior to 4.1.7, when using HTML, [legend.navigation](\n                 * #legend.navigation) was disabled.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption legend.useHTML\n                 */\n                /**\n                 * The width of the legend box. If a number is set, it translates to\n                 * pixels. Since v7.0.2 it allows setting a percent string of the full\n                 * chart width, for example `40%`.\n                 *\n                 * Defaults to the full chart width from legends below or above the\n                 * chart, half the chart width for legends to the left and right.\n                 *\n                 * @sample {highcharts} highcharts/legend/width/\n                 *         Aligned to the plot area\n                 * @sample {highcharts} highcharts/legend/width-percent/\n                 *         A percent of the chart width\n                 *\n                 * @type      {number|string}\n                 * @since     2.0\n                 * @apioption legend.width\n                 */\n                /**\n                 * The pixel padding between the legend item symbol and the legend\n                 * item text.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolpadding/\n                 *         Greater symbol width and padding\n                 */\n                symbolPadding: 5,\n                /**\n                 * The vertical alignment of the legend box. Can be one of `top`,\n                 * `middle` or `bottom`. Vertical position can be further determined\n                 * by the `y` option.\n                 *\n                 * In the case that the legend is aligned in a corner position, the\n                 * `layout` option will determine whether to place it above/below\n                 * or on the side of the plot area.\n                 *\n                 * When the [layout](#legend.layout) option is `proximate`, the\n                 * `verticalAlign` option doesn't apply.\n                 *\n                 * @sample {highcharts} highcharts/legend/verticalalign/\n                 *         Legend 100px from the top of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @type  {Highcharts.VerticalAlignValue}\n                 * @since 2.0\n                 */\n                verticalAlign: 'bottom',\n                // width: undefined,\n                /**\n                 * The x offset of the legend relative to its horizontal alignment\n                 * `align` within chart.spacingLeft and chart.spacingRight. Negative\n                 * x moves it to the left, positive x moves it to the right.\n                 *\n                 * @sample {highcharts} highcharts/legend/width/\n                 *         Aligned to the plot area\n                 *\n                 * @since 2.0\n                 */\n                x: 0,\n                /**\n                 * The vertical offset of the legend relative to it's vertical alignment\n                 * `verticalAlign` within chart.spacingTop and chart.spacingBottom.\n                 *  Negative y moves it up, positive y moves it down.\n                 *\n                 * @sample {highcharts} highcharts/legend/verticalalign/\n                 *         Legend 100px from the top of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @since 2.0\n                 */\n                y: 0,\n                /**\n                 * A title to be added on top of the legend.\n                 *\n                 * @sample {highcharts} highcharts/legend/title/\n                 *         Legend title\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend with title\n                 *\n                 * @since 3.0\n                 */\n                title: {\n                    /**\n                     * A text or HTML string for the title.\n                     *\n                     * @type      {string}\n                     * @since     3.0\n                     * @apioption legend.title.text\n                     */\n                    /**\n                     * Generic CSS styles for the legend title.\n                     *\n                     * @see In styled mode, the legend title is styled with the\n                     *      `.highcharts-legend-title` class.\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     * @default {\"fontWeight\": \"bold\"}\n                     * @since   3.0\n                     */\n                    style: {\n                        /**\n                         * @ignore\n                         */\n                        fontWeight: 'bold'\n                    }\n                }\n            },\n            /**\n             * The loading options control the appearance of the loading screen\n             * that covers the plot area on chart operations. This screen only\n             * appears after an explicit call to `chart.showLoading()`. It is a\n             * utility for developers to communicate to the end user that something\n             * is going on, for example while retrieving new data via an XHR connection.\n             * The \"Loading...\" text itself is not part of this configuration\n             * object, but part of the `lang` object.\n             */\n            loading: {\n                /**\n                 * The duration in milliseconds of the fade out effect.\n                 *\n                 * @sample highcharts/loading/hideduration/\n                 *         Fade in and out over a second\n                 *\n                 * @type      {number}\n                 * @default   100\n                 * @since     1.2.0\n                 * @apioption loading.hideDuration\n                 */\n                /**\n                 * The duration in milliseconds of the fade in effect.\n                 *\n                 * @sample highcharts/loading/hideduration/\n                 *         Fade in and out over a second\n                 *\n                 * @type      {number}\n                 * @default   100\n                 * @since     1.2.0\n                 * @apioption loading.showDuration\n                 */\n                /**\n                 * CSS styles for the loading label `span`.\n                 *\n                 * @see In styled mode, the loading label is styled with the\n                 *      `.highcharts-loading-inner` class.\n                 *\n                 * @sample {highcharts|highmaps} highcharts/loading/labelstyle/\n                 *         Vertically centered\n                 * @sample {highstock} stock/loading/general/\n                 *         Label styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"fontWeight\": \"bold\", \"position\": \"relative\", \"top\": \"45%\"}\n                 * @since   1.2.0\n                 */\n                labelStyle: {\n                    /**\n                     * @ignore\n                     */\n                    fontWeight: 'bold',\n                    /**\n                     * @ignore\n                     */\n                    position: 'relative',\n                    /**\n                     * @ignore\n                     */\n                    top: '45%'\n                },\n                /**\n                 * CSS styles for the loading screen that covers the plot area.\n                 *\n                 * In styled mode, the loading label is styled with the\n                 * `.highcharts-loading` class.\n                 *\n                 * @sample  {highcharts|highmaps} highcharts/loading/style/\n                 *          Gray plot area, white text\n                 * @sample  {highstock} stock/loading/general/\n                 *          Gray plot area, white text\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"position\": \"absolute\", \"backgroundColor\": \"#ffffff\", \"opacity\": 0.5, \"textAlign\": \"center\"}\n                 * @since   1.2.0\n                 */\n                style: {\n                    /**\n                     * @ignore\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore\n                     */\n                    backgroundColor: '#ffffff',\n                    /**\n                     * @ignore\n                     */\n                    opacity: 0.5,\n                    /**\n                     * @ignore\n                     */\n                    textAlign: 'center'\n                }\n            },\n            /**\n             * Options for the tooltip that appears when the user hovers over a\n             * series or point.\n             *\n             * @declare Highcharts.TooltipOptions\n             */\n            tooltip: {\n                /**\n                 * The color of the tooltip border. When `undefined`, the border takes\n                 * the color of the corresponding series or point.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         Follow series by default\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-black/\n                 *         Black border\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Styled tooltip\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption tooltip.borderColor\n                 */\n                /**\n                 * A CSS class name to apply to the tooltip's container div,\n                 * allowing unique CSS styling for each chart.\n                 *\n                 * @type      {string}\n                 * @apioption tooltip.className\n                 */\n                /**\n                 * Since 4.1, the crosshair definitions are moved to the Axis object\n                 * in order for a better separation from the tooltip. See\n                 * [xAxis.crosshair](#xAxis.crosshair).\n                 *\n                 * @sample {highcharts} highcharts/tooltip/crosshairs-x/\n                 *         Enable a crosshair for the x value\n                 *\n                 * @deprecated\n                 *\n                 * @type      {*}\n                 * @default   true\n                 * @apioption tooltip.crosshairs\n                 */\n                /**\n                 * Distance from point to tooltip in pixels.\n                 *\n                 * @type      {number}\n                 * @default   16\n                 * @apioption tooltip.distance\n                 */\n                /**\n                 * Whether the tooltip should follow the mouse as it moves across\n                 * columns, pie slices and other point types with an extent.\n                 * By default it behaves this way for pie, polygon, map, sankey\n                 * and wordcloud series by override in the `plotOptions`\n                 * for those series types.\n                 *\n                 * For touch moves to behave the same way, [followTouchMove](\n                 * #tooltip.followTouchMove) must be `true` also.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} false\n                 * @default   {highmaps} true\n                 * @since     3.0\n                 * @apioption tooltip.followPointer\n                 */\n                /**\n                 * Whether the tooltip should update as the finger moves on a touch\n                 * device. If this is `true` and [chart.panning](#chart.panning) is\n                 * set,`followTouchMove` will take over one-finger touches, so the user\n                 * needs to use two fingers for zooming and panning.\n                 *\n                 * Note the difference to [followPointer](#tooltip.followPointer) that\n                 * only defines the _position_ of the tooltip. If `followPointer` is\n                 * false in for example a column series, the tooltip will show above or\n                 * below the column, but as `followTouchMove` is true, the tooltip will\n                 * jump from column to column as the user swipes across the plot area.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} true\n                 * @default   {highstock} true\n                 * @default   {highmaps} false\n                 * @since     3.0.1\n                 * @apioption tooltip.followTouchMove\n                 */\n                /**\n                 * Callback function to format the text of the tooltip from scratch. In\n                 * case of single or [shared](#tooltip.shared) tooltips, a string should\n                 * be returned. In case of [split](#tooltip.split) tooltips, it should\n                 * return an array where the first item is the header, and subsequent\n                 * items are mapped to the points. Return `false` to disable tooltip for\n                 * a specific point on series.\n                 *\n                 * A subset of HTML is supported. Unless `useHTML` is true, the HTML of\n                 * the tooltip is parsed and converted to SVG, therefore this isn't a\n                 * complete HTML renderer. The following HTML tags are supported: `b`,\n                 * `br`, `em`, `i`, `span`, `strong`. Spans can be styled with a `style`\n                 * attribute, but only text-related CSS, that is shared with SVG, is\n                 * handled.\n                 *\n                 * The available data in the formatter differ a bit depending on whether\n                 * the tooltip is shared or split, or belongs to a single point. In a\n                 * shared/split tooltip, all properties except `x`, which is common for\n                 * all points, are kept in an array, `this.points`.\n                 *\n                 * Available data are:\n                 *\n                 * - **this.percentage (not shared) /**\n                 *   **this.points[i].percentage (shared)**:\n                 *   Stacked series and pies only. The point's percentage of the total.\n                 *\n                 * - **this.point (not shared) / this.points[i].point (shared)**:\n                 *   The point object. The point name, if defined, is available through\n                 *   `this.point.name`.\n                 *\n                 * - **this.points**:\n                 *   In a shared tooltip, this is an array containing all other\n                 *   properties for each point.\n                 *\n                 * - **this.series (not shared) / this.points[i].series (shared)**:\n                 *   The series object. The series name is available through\n                 *   `this.series.name`.\n                 *\n                 * - **this.total (not shared) / this.points[i].total (shared)**:\n                 *   Stacked series only. The total value at this point's x value.\n                 *\n                 * - **this.x**:\n                 *   The x value. This property is the same regardless of the tooltip\n                 *   being shared or not.\n                 *\n                 * - **this.y (not shared) / this.points[i].y (shared)**:\n                 *   The y value.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/formatter-simple/\n                 *         Simple string formatting\n                 * @sample {highcharts} highcharts/tooltip/formatter-shared/\n                 *         Formatting with shared tooltip\n                 * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n                 *         Formatting with split tooltip\n                 * @sample highcharts/tooltip/formatter-conditional-default/\n                 *         Extending default formatter\n                 * @sample {highstock} stock/tooltip/formatter/\n                 *         Formatting with shared tooltip\n                 * @sample {highmaps} maps/tooltip/formatter/\n                 *         String formatting\n                 *\n                 * @type      {Highcharts.TooltipFormatterCallbackFunction}\n                 * @apioption tooltip.formatter\n                 */\n                /**\n                 * Callback function to format the text of the tooltip for\n                 * visible null points.\n                 * Works analogously to [formatter](#tooltip.formatter).\n                 *\n                 * @sample highcharts/plotoptions/series-nullformat\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {Highcharts.TooltipFormatterCallbackFunction}\n                 * @apioption tooltip.nullFormatter\n                 */\n                /**\n                 * The number of milliseconds to wait until the tooltip is hidden when\n                 * mouse out from a point or chart.\n                 *\n                 * @type      {number}\n                 * @default   500\n                 * @since     3.0\n                 * @apioption tooltip.hideDelay\n                 */\n                /**\n                 * Whether to allow the tooltip to render outside the chart's SVG\n                 * element box. By default (`false`), the tooltip is rendered within the\n                 * chart's SVG element, which results in the tooltip being aligned\n                 * inside the chart area. For small charts, this may result in clipping\n                 * or overlapping. When `true`, a separate SVG element is created and\n                 * overlaid on the page, allowing the tooltip to be aligned inside the\n                 * page itself.\n                 *\n                 * Defaults to `true` if `chart.scrollablePlotArea` is activated,\n                 * otherwise `false`.\n                 *\n                 * @sample highcharts/tooltip/outside\n                 *         Small charts with tooltips outside\n                 *\n                 * @type      {boolean|undefined}\n                 * @default   undefined\n                 * @since     6.1.1\n                 * @apioption tooltip.outside\n                 */\n                /**\n                 * A callback function for formatting the HTML output for a single point\n                 * in the tooltip. Like the `pointFormat` string, but with more\n                 * flexibility.\n                 *\n                 * @type      {Highcharts.FormatterCallbackFunction<Highcharts.Point>}\n                 * @since     4.1.0\n                 * @context   Highcharts.Point\n                 * @apioption tooltip.pointFormatter\n                 */\n                /**\n                 * A callback function to place the tooltip in a default position. The\n                 * callback receives three parameters: `labelWidth`, `labelHeight` and\n                 * `point`, where point contains values for `plotX` and `plotY` telling\n                 * where the reference point is in the plot area. Add `chart.plotLeft`\n                 * and `chart.plotTop` to get the full coordinates.\n                 *\n                 * Since v7, when [tooltip.split](#tooltip.split) option is enabled,\n                 * positioner is called for each of the boxes separately, including\n                 * xAxis header. xAxis header is not a point, instead `point` argument\n                 * contains info:\n                 * `{ plotX: Number, plotY: Number, isHeader: Boolean }`\n                 *\n                 *\n                 * The return should be an object containing x and y values, for example\n                 * `{ x: 100, y: 100 }`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/positioner/\n                 *         A fixed tooltip position\n                 * @sample {highstock} stock/tooltip/positioner/\n                 *         A fixed tooltip position on top of the chart\n                 * @sample {highmaps} maps/tooltip/positioner/\n                 *         A fixed tooltip position\n                 * @sample {highstock} stock/tooltip/split-positioner/\n                 *         Split tooltip with fixed positions\n                 * @sample {highstock} stock/tooltip/positioner-scrollable-plotarea/\n                 *         Scrollable plot area combined with tooltip positioner\n                 *\n                 * @type      {Highcharts.TooltipPositionerCallbackFunction}\n                 * @since     2.2.4\n                 * @apioption tooltip.positioner\n                 */\n                /**\n                 * The name of a symbol to use for the border around the tooltip. Can\n                 * be one of: `\"callout\"`, `\"circle\"`, or `\"square\"`. When\n                 * [tooltip.split](#tooltip.split)\n                 * option is enabled, shape is applied to all boxes except header, which\n                 * is controlled by\n                 * [tooltip.headerShape](#tooltip.headerShape).\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n                 * [series.marker.symbol](plotOptions.line.marker.symbol).\n                 *\n                 * @type      {Highcharts.TooltipShapeValue}\n                 * @default   callout\n                 * @since     4.0\n                 * @apioption tooltip.shape\n                 */\n                /**\n                 * The name of a symbol to use for the border around the tooltip\n                 * header. Applies only when [tooltip.split](#tooltip.split) is\n                 * enabled.\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n                 * [series.marker.symbol](plotOptions.line.marker.symbol).\n                 *\n                 * @see [tooltip.shape](#tooltip.shape)\n                 *\n                 * @sample {highstock} stock/tooltip/split-positioner/\n                 *         Different shapes for header and split boxes\n                 *\n                 * @type       {Highcharts.TooltipShapeValue}\n                 * @default    callout\n                 * @validvalue [\"callout\", \"square\"]\n                 * @since      7.0\n                 * @apioption  tooltip.headerShape\n                 */\n                /**\n                 * When the tooltip is shared, the entire plot area will capture mouse\n                 * movement or touch events. Tooltip texts for series types with ordered\n                 * data (not pie, scatter, flags etc) will be shown in a single bubble.\n                 * This is recommended for single series charts and for tablet/mobile\n                 * optimized charts.\n                 *\n                 * See also [tooltip.split](#tooltip.split), that is better suited for\n                 * charts with many series, especially line-type series. The\n                 * `tooltip.split` option takes precedence over `tooltip.shared`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/shared-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/tooltip/shared-true/\n                 *         True\n                 * @sample {highcharts} highcharts/tooltip/shared-x-crosshair/\n                 *         True with x axis crosshair\n                 * @sample {highcharts} highcharts/tooltip/shared-true-mixed-types/\n                 *         True with mixed series types\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @product   highcharts highstock\n                 * @apioption tooltip.shared\n                 */\n                /**\n                 * Split the tooltip into one label per series, with the header close\n                 * to the axis. This is recommended over [shared](#tooltip.shared)\n                 * tooltips for charts with multiple line series, generally making them\n                 * easier to read. This option takes precedence over `tooltip.shared`.\n                 *\n                 * @productdesc {highstock} In Highstock, tooltips are split by default\n                 * since v6.0.0. Stock charts typically contain multi-dimension points\n                 * and multiple panes, making split tooltips the preferred layout over\n                 * the previous `shared` tooltip.\n                 *\n                 * @sample highcharts/tooltip/split/\n                 *         Split tooltip\n                 * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n                 *         Split tooltip and custom formatter callback\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} true\n                 * @since     5.0.0\n                 * @product   highcharts highstock\n                 * @apioption tooltip.split\n                 */\n                /**\n                 * Prevents the tooltip from switching or closing, when touched or\n                 * pointed.\n                 *\n                 * @sample highcharts/tooltip/stickoncontact/\n                 *         Tooltip sticks on pointer contact\n                 *\n                 * @type      {boolean}\n                 * @since     8.0.1\n                 * @apioption tooltip.stickOnContact\n                 */\n                /**\n                 * Use HTML to render the contents of the tooltip instead of SVG. Using\n                 * HTML allows advanced formatting like tables and images in the\n                 * tooltip. It is also recommended for rtl languages as it works around\n                 * rtl bugs in early Firefox.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n                 *         A table for value alignment\n                 * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n                 *         Full HTML tooltip\n                 * @sample {highmaps} maps/tooltip/usehtml/\n                 *         Pure HTML tooltip\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.2\n                 * @apioption tooltip.useHTML\n                 */\n                /**\n                 * How many decimals to show in each series' y value. This is\n                 * overridable in each series' tooltip options object. The default is to\n                 * preserve all decimals.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {number}\n                 * @since     2.2\n                 * @apioption tooltip.valueDecimals\n                 */\n                /**\n                 * A string to prepend to each series' y value. Overridable in each\n                 * series' tooltip options object.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {string}\n                 * @since     2.2\n                 * @apioption tooltip.valuePrefix\n                 */\n                /**\n                 * A string to append to each series' y value. Overridable in each\n                 * series' tooltip options object.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {string}\n                 * @since     2.2\n                 * @apioption tooltip.valueSuffix\n                 */\n                /**\n                 * The format for the date in the tooltip header if the X axis is a\n                 * datetime axis. The default is a best guess based on the smallest\n                 * distance between points in the chart.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/xdateformat/\n                 *         A different format\n                 *\n                 * @type      {string}\n                 * @product   highcharts highstock gantt\n                 * @apioption tooltip.xDateFormat\n                 */\n                /**\n                 * How many decimals to show for the `point.change` value when the\n                 * `series.compare` option is set. This is overridable in each series'\n                 * tooltip options object. The default is to preserve all decimals.\n                 *\n                 * @type      {number}\n                 * @since     1.0.1\n                 * @product   highstock\n                 * @apioption tooltip.changeDecimals\n                 */\n                /**\n                 * Enable or disable the tooltip.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/enabled/\n                 *         Disabled\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Disable tooltip and show values on chart instead\n                 */\n                enabled: true,\n                /**\n                 * Enable or disable animation of the tooltip.\n                 *\n                 * @type       {boolean}\n                 * @default    true\n                 * @since      2.3.0\n                 */\n                animation: svg,\n                /**\n                 * The radius of the rounded border corners.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         5px by default\n                 * @sample {highcharts} highcharts/tooltip/borderradius-0/\n                 *         Square borders\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 */\n                borderRadius: 3,\n                /**\n                 * For series on a datetime axes, the date format in the tooltip's\n                 * header will by default be guessed based on the closest data points.\n                 * This member gives the default string representations used for\n                 * each unit. For an overview of the replacement codes, see\n                 * [dateFormat](/class-reference/Highcharts#dateFormat).\n                 *\n                 * @see [xAxis.dateTimeLabelFormats](#xAxis.dateTimeLabelFormats)\n                 *\n                 * @type    {Highcharts.Dictionary<string>}\n                 * @product highcharts highstock gantt\n                 */\n                dateTimeLabelFormats: {\n                    /** @internal */\n                    millisecond: '%A, %b %e, %H:%M:%S.%L',\n                    /** @internal */\n                    second: '%A, %b %e, %H:%M:%S',\n                    /** @internal */\n                    minute: '%A, %b %e, %H:%M',\n                    /** @internal */\n                    hour: '%A, %b %e, %H:%M',\n                    /** @internal */\n                    day: '%A, %b %e, %Y',\n                    /** @internal */\n                    week: 'Week from %A, %b %e, %Y',\n                    /** @internal */\n                    month: '%B %Y',\n                    /** @internal */\n                    year: '%Y'\n                },\n                /**\n                 * A string to append to the tooltip format.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/footerformat/\n                 *         A table for value alignment\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @since 2.2\n                 */\n                footerFormat: '',\n                /**\n                 * Padding inside the tooltip, in pixels.\n                 *\n                 * @since      5.0.0\n                 */\n                padding: 8,\n                /**\n                 * Proximity snap for graphs or single points. It defaults to 10 for\n                 * mouse-powered devices and 25 for touch devices.\n                 *\n                 * Note that in most cases the whole plot area captures the mouse\n                 * movement, and in these cases `tooltip.snap` doesn't make sense. This\n                 * applies when [stickyTracking](#plotOptions.series.stickyTracking)\n                 * is `true` (default) and when the tooltip is [shared](#tooltip.shared)\n                 * or [split](#tooltip.split).\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         10 px by default\n                 * @sample {highcharts} highcharts/tooltip/snap-50/\n                 *         50 px on graph\n                 *\n                 * @type    {number}\n                 * @default 10/25\n                 * @since   1.2.0\n                 * @product highcharts highstock\n                 */\n                snap: isTouchDevice ? 25 : 10,\n                /**\n                 * The HTML of the tooltip header line. Variables are enclosed by\n                 * curly brackets. Available variables are `point.key`, `series.name`,\n                 * `series.color` and other members from the `point` and `series`\n                 * objects. The `point.key` variable contains the category name, x\n                 * value or datetime string depending on the type of axis. For datetime\n                 * axes, the `point.key` date format can be set using\n                 * `tooltip.xDateFormat`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/footerformat/\n                 *         An HTML table in the tooltip\n                 * @sample {highstock} highcharts/tooltip/footerformat/\n                 *         An HTML table in the tooltip\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @type       {string}\n                 * @apioption  tooltip.headerFormat\n                 */\n                headerFormat: '<span style=\"font-size: 10px\">{point.key}</span><br/>',\n                /**\n                 * The HTML of the null point's line in the tooltip. Works analogously\n                 * to [pointFormat](#tooltip.pointFormat).\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-nullformat\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {string}\n                 * @apioption tooltip.nullFormat\n                 */\n                /**\n                 * The HTML of the point's line in the tooltip. Variables are enclosed\n                 * by curly brackets. Available variables are point.x, point.y, series.\n                 * name and series.color and other properties on the same form.\n                 * Furthermore, `point.y` can be extended by the `tooltip.valuePrefix`\n                 * and `tooltip.valueSuffix` variables. This can also be overridden for\n                 * each series, which makes it a good hook for displaying units.\n                 *\n                 * In styled mode, the dot is colored by a class name rather\n                 * than the point color.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/pointformat/\n                 *         A different point format with value suffix\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @type       {string}\n                 * @since      2.2\n                 * @apioption  tooltip.pointFormat\n                 */\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.y}</b><br/>',\n                /**\n                 * The background color or gradient for the tooltip.\n                 *\n                 * In styled mode, the stroke width is set in the\n                 * `.highcharts-tooltip-box` class.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/backgroundcolor-solid/\n                 *         Yellowish background\n                 * @sample {highcharts} highcharts/tooltip/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highcharts} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Custom tooltip\n                 * @sample {highstock} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 * @sample {highmaps} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                backgroundColor: color('#f7f7f7')\n                    .setOpacity(0.85).get(),\n                /**\n                 * The pixel width of the tooltip border.\n                 *\n                 * In styled mode, the stroke width is set in the\n                 * `.highcharts-tooltip-box` class.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         2px by default\n                 * @sample {highcharts} highcharts/tooltip/borderwidth/\n                 *         No border (shadow only)\n                 * @sample {highcharts} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Custom tooltip\n                 * @sample {highstock} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 * @sample {highmaps} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 */\n                borderWidth: 1,\n                /**\n                 * Whether to apply a drop shadow to the tooltip.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         True by default\n                 * @sample {highcharts} highcharts/tooltip/shadow/\n                 *         False\n                 * @sample {highmaps} maps/tooltip/positioner/\n                 *         Fixed tooltip position, border and shadow disabled\n                 *\n                 * @type {boolean|Highcharts.ShadowOptionsObject}\n                 */\n                shadow: true,\n                /**\n                 * CSS styles for the tooltip. The tooltip can also be styled through\n                 * the CSS class `.highcharts-tooltip`.\n                 *\n                 * Note that the default `pointerEvents` style makes the tooltip ignore\n                 * mouse events, so in order to use clickable tooltips, this value must\n                 * be set to `auto`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/style/\n                 *         Greater padding, bold text\n                 *\n                 * @type {Highcharts.CSSObject}\n                 */\n                style: {\n                    /** @internal */\n                    color: '#333333',\n                    /** @internal */\n                    cursor: 'default',\n                    /** @internal */\n                    fontSize: '12px',\n                    /** @internal */\n                    whiteSpace: 'nowrap'\n                }\n            },\n            /**\n             * Highchart by default puts a credits label in the lower right corner\n             * of the chart. This can be changed using these options.\n             */\n            credits: {\n                /**\n                 * Credits for map source to be concatenated with conventional credit\n                 * text. By default this is a format string that collects copyright\n                 * information from the map if available.\n                 *\n                 * @see [mapTextFull](#credits.mapTextFull)\n                 * @see [text](#credits.text)\n                 *\n                 * @type      {string}\n                 * @default   \\u00a9 <a href=\"{geojson.copyrightUrl}\">{geojson.copyrightShort}</a>\n                 * @since     4.2.2\n                 * @product   highmaps\n                 * @apioption credits.mapText\n                 */\n                /**\n                 * Detailed credits for map source to be displayed on hover of credits\n                 * text. By default this is a format string that collects copyright\n                 * information from the map if available.\n                 *\n                 * @see [mapText](#credits.mapText)\n                 * @see [text](#credits.text)\n                 *\n                 * @type      {string}\n                 * @default   {geojson.copyright}\n                 * @since     4.2.2\n                 * @product   highmaps\n                 * @apioption credits.mapTextFull\n                 */\n                /**\n                 * Whether to show the credits text.\n                 *\n                 * @sample {highcharts} highcharts/credits/enabled-false/\n                 *         Credits disabled\n                 * @sample {highstock} stock/credits/enabled/\n                 *         Credits disabled\n                 * @sample {highmaps} maps/credits/enabled-false/\n                 *         Credits disabled\n                 */\n                enabled: true,\n                /**\n                 * The URL for the credits label.\n                 *\n                 * @sample {highcharts} highcharts/credits/href/\n                 *         Custom URL and text\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Custom URL and text\n                 */\n                href: 'https://www.highcharts.com?credits',\n                /**\n                 * Position configuration for the credits label.\n                 *\n                 * @sample {highcharts} highcharts/credits/position-left/\n                 *         Left aligned\n                 * @sample {highcharts} highcharts/credits/position-left/\n                 *         Left aligned\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Left aligned\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Left aligned\n                 *\n                 * @type    {Highcharts.AlignObject}\n                 * @since   2.1\n                 */\n                position: {\n                    /** @internal */\n                    align: 'right',\n                    /** @internal */\n                    x: -10,\n                    /** @internal */\n                    verticalAlign: 'bottom',\n                    /** @internal */\n                    y: -5\n                },\n                /**\n                 * CSS styles for the credits label.\n                 *\n                 * @see In styled mode, credits styles can be set with the\n                 *      `.highcharts-credits` class.\n                 *\n                 * @type {Highcharts.CSSObject}\n                 */\n                style: {\n                    /** @internal */\n                    cursor: 'pointer',\n                    /** @internal */\n                    color: '#999999',\n                    /** @internal */\n                    fontSize: '9px'\n                },\n                /**\n                 * The text for the credits label.\n                 *\n                 * @productdesc {highmaps}\n                 * If a map is loaded as GeoJSON, the text defaults to\n                 * `Highcharts @ {map-credits}`. Otherwise, it defaults to\n                 * `Highcharts.com`.\n                 *\n                 * @sample {highcharts} highcharts/credits/href/\n                 *         Custom URL and text\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Custom URL and text\n                 */\n                text: 'Highcharts.com'\n            }\n        };\n        /* eslint-disable spaced-comment */\n\n        '';\n        /**\n         * Global `Time` object with default options. Since v6.0.5, time settings can be\n         * applied individually for each chart. If no individual settings apply, this\n         * `Time` object is shared by all instances.\n         *\n         * @name Highcharts.time\n         * @type {Highcharts.Time}\n         */\n        H.time = new Time(merge(H.defaultOptions.global, H.defaultOptions.time));\n        /**\n         * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n         * human readable date string. The format is a subset of the formats for PHP's\n         * [strftime](https://www.php.net/manual/en/function.strftime.php) function.\n         * Additional formats can be given in the {@link Highcharts.dateFormats} hook.\n         *\n         * Since v6.0.5, all internal dates are formatted through the\n         * {@link Highcharts.Chart#time} instance to respect chart-level time settings.\n         * The `Highcharts.dateFormat` function only reflects global time settings set\n         * with `setOptions`.\n         *\n         * Supported format keys:\n         * - `%a`: Short weekday, like 'Mon'\n         * - `%A`: Long weekday, like 'Monday'\n         * - `%d`: Two digit day of the month, 01 to 31\n         * - `%e`: Day of the month, 1 through 31\n         * - `%w`: Day of the week, 0 through 6\n         * - `%b`: Short month, like 'Jan'\n         * - `%B`: Long month, like 'January'\n         * - `%m`: Two digit month number, 01 through 12\n         * - `%y`: Two digits year, like 09 for 2009\n         * - `%Y`: Four digits year, like 2009\n         * - `%H`: Two digits hours in 24h format, 00 through 23\n         * - `%k`: Hours in 24h format, 0 through 23\n         * - `%I`: Two digits hours in 12h format, 00 through 11\n         * - `%l`: Hours in 12h format, 1 through 12\n         * - `%M`: Two digits minutes, 00 through 59\n         * - `%p`: Upper case AM or PM\n         * - `%P`: Lower case AM or PM\n         * - `%S`: Two digits seconds, 00 through 59\n         * - `%L`: Milliseconds (naming from Ruby)\n         *\n         * @function Highcharts.dateFormat\n         *\n         * @param {string} format\n         *        The desired format where various time representations are prefixed\n         *        with `%`.\n         *\n         * @param {number} timestamp\n         *        The JavaScript timestamp.\n         *\n         * @param {boolean} [capitalize=false]\n         *        Upper case first letter in the return.\n         *\n         * @return {string}\n         *         The formatted date.\n         */\n        H.dateFormat = function (format, timestamp, capitalize) {\n            return H.time.dateFormat(format, timestamp, capitalize);\n        };\n        var optionsModule = {\n                dateFormat: H.dateFormat,\n                defaultOptions: H.defaultOptions,\n                time: H.time\n            };\n\n        return optionsModule;\n    });\n    _registerModule(_modules, 'parts/Axis.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Tick.js'], _modules['parts/Utilities.js'], _modules['parts/Options.js']], function (Color, H, Tick, U, O) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            getMagnitude = U.getMagnitude,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            normalizeTickInterval = U.normalizeTickInterval,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            removeEvent = U.removeEvent,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout;\n        /**\n         * Options for the path on the Axis to be calculated.\n         * @interface Highcharts.AxisPlotLinePathOptionsObject\n         */ /**\n        * Axis value.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#value\n        * @type {number|undefined}\n        */ /**\n        * Line width used for calculation crisp line coordinates. Defaults to 1.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#lineWidth\n        * @type {number|undefined}\n        */ /**\n        * If `false`, the function will return null when it falls outside the axis\n        * bounds. If `true`, the function will return a path aligned to the plot area\n        * sides if it falls outside. If `pass`, it will return a path outside.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#force\n        * @type {string|boolean|undefined}\n        */ /**\n        * Used in Highstock. When `true`, plot paths (crosshair, plotLines, gridLines)\n        * will be rendered on all axes when defined on the first axis.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#acrossPanes\n        * @type {boolean|undefined}\n        */ /**\n        * Use old coordinates (for resizing and rescaling).\n        * If not set, defaults to `false`.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#old\n        * @type {boolean|undefined}\n        */ /**\n        * If given, return the plot line path of a pixel position on the axis.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#translatedValue\n        * @type {number|undefined}\n        */ /**\n        * Used in Polar axes. Reverse the positions for concatenation of polygonal\n        * plot bands\n        * @name Highcharts.AxisPlotLinePathOptionsObject#reverse\n        * @type {boolean|undefined}\n        */\n        /**\n         * Options for crosshairs on axes.\n         *\n         * @product highstock\n         *\n         * @typedef {Highcharts.XAxisCrosshairOptions|Highcharts.YAxisCrosshairOptions} Highcharts.AxisCrosshairOptions\n         */\n        /**\n         * @typedef {\"navigator\"|\"pan\"|\"rangeSelectorButton\"|\"rangeSelectorInput\"|\"scrollbar\"|\"traverseUpButton\"|\"zoom\"} Highcharts.AxisExtremesTriggerValue\n         */\n        /**\n         * @callback Highcharts.AxisEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         */\n        /**\n         * @callback Highcharts.AxisLabelsFormatterCallbackFunction\n         *\n         * @param {Highcharts.AxisLabelsFormatterContextObject<number>} this\n         *\n         * @param {Highcharts.AxisLabelsFormatterContextObject<string>} that\n         *\n         * @return {string}\n         */\n        /**\n         * @interface Highcharts.AxisLabelsFormatterContextObject<T>\n         */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#chart\n        * @type {Highcharts.Chart}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#isFirst\n        * @type {boolean}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#isLast\n        * @type {boolean}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#pos\n        * @type {number}\n        */ /**\n        * This can be either a numeric value or a category string.\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#value\n        * @type {T}\n        */\n        /**\n         * Options for axes.\n         *\n         * @typedef {Highcharts.XAxisOptions|Highcharts.YAxisOptions|Highcharts.ZAxisOptions} Highcharts.AxisOptions\n         */\n        /**\n         * @callback Highcharts.AxisPointBreakEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @param {Highcharts.AxisPointBreakEventObject} evt\n         */\n        /**\n         * @interface Highcharts.AxisPointBreakEventObject\n         */ /**\n        * @name Highcharts.AxisPointBreakEventObject#brk\n        * @type {Highcharts.Dictionary<number>}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#target\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#type\n        * @type {\"pointBreak\"|\"pointInBreak\"}\n        */\n        /**\n         * @callback Highcharts.AxisSetExtremesEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @param {Highcharts.AxisSetExtremesEventObject} evt\n         */\n        /**\n         * @interface Highcharts.AxisSetExtremesEventObject\n         * @extends Highcharts.ExtremesObject\n         */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#target\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#trigger\n        * @type {Highcharts.AxisExtremesTriggerValue|string}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#type\n        * @type {\"setExtremes\"}\n        */\n        /**\n         * @callback Highcharts.AxisTickPositionerCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @return {Highcharts.AxisTickPositionsArray}\n         */\n        /**\n         * @interface Highcharts.AxisTickPositionsArray\n         * @augments Array<number>\n         */\n        /**\n         * @typedef {\"high\"|\"low\"|\"middle\"} Highcharts.AxisTitleAlignValue\n         */\n        /**\n         * @typedef {Highcharts.XAxisTitleOptions|Highcharts.YAxisTitleOptions|Highcharts.ZAxisTitleOptions} Highcharts.AxisTitleOptions\n         */\n        /**\n         * @typedef {\"linear\"|\"logarithmic\"|\"datetime\"|\"category\"|\"treegrid\"} Highcharts.AxisTypeValue\n         */\n        /**\n         * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n         * function.\n         *\n         * @interface Highcharts.ExtremesObject\n         */ /**\n        * The maximum value of the axis' associated series.\n        * @name Highcharts.ExtremesObject#dataMax\n        * @type {number}\n        */ /**\n        * The minimum value of the axis' associated series.\n        * @name Highcharts.ExtremesObject#dataMin\n        * @type {number}\n        */ /**\n        * The maximum axis value, either automatic or set manually. If the `max` option\n        * is not set, `maxPadding` is 0 and `endOnTick` is false, this value will be\n        * the same as `dataMax`.\n        * @name Highcharts.ExtremesObject#max\n        * @type {number}\n        */ /**\n        * The minimum axis value, either automatic or set manually. If the `min` option\n        * is not set, `minPadding` is 0 and `startOnTick` is false, this value will be\n        * the same as `dataMin`.\n        * @name Highcharts.ExtremesObject#min\n        * @type {number}\n        */ /**\n        * The user defined maximum, either from the `max` option or from a zoom or\n        * `setExtremes` action.\n        * @name Highcharts.ExtremesObject#userMax\n        * @type {number}\n        */ /**\n        * The user defined minimum, either from the `min` option or from a zoom or\n        * `setExtremes` action.\n        * @name Highcharts.ExtremesObject#userMin\n        * @type {number}\n        */\n        /**\n         * Formatter function for the text of a crosshair label.\n         *\n         * @callback Highcharts.XAxisCrosshairLabelFormatterCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *        Axis context\n         *\n         * @param {number} value\n         *        Y value of the data point\n         *\n         * @return {string}\n         */\n        var defaultOptions = O.defaultOptions;\n        var deg2rad = H.deg2rad;\n        /**\n         * Create a new axis object. Called internally when instanciating a new chart or\n         * adding axes by {@link Highcharts.Chart#addAxis}.\n         *\n         * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n         * series cartesian chart, there is one X axis and one Y axis.\n         *\n         * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n         * an array of Axis objects. If there is only one axis, it can be referenced\n         * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n         * pattern goes for Y axes.\n         *\n         * If you need to get the axes from a series object, use the `series.xAxis` and\n         * `series.yAxis` properties. These are not arrays, as one series can only be\n         * associated to one X and one Y axis.\n         *\n         * A third way to reference the axis programmatically is by `id`. Add an `id` in\n         * the axis configuration options, and get the axis by\n         * {@link Highcharts.Chart#get}.\n         *\n         * Configuration options for the axes are given in options.xAxis and\n         * options.yAxis.\n         *\n         * @class\n         * @name Highcharts.Axis\n         *\n         * @param {Highcharts.Chart} chart\n         * The Chart instance to apply the axis on.\n         *\n         * @param {Highcharts.AxisOptions} userOptions\n         * Axis options.\n         */\n        var Axis = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Axis(chart, userOptions) {\n                    this.alternateBands = void 0;\n                this.bottom = void 0;\n                this.categories = void 0;\n                this.chart = void 0;\n                this.closestPointRange = void 0;\n                this.coll = void 0;\n                this.hasNames = void 0;\n                this.hasVisibleSeries = void 0;\n                this.height = void 0;\n                this.isLinked = void 0;\n                this.labelEdge = void 0; // @todo\n                this.labelFormatter = void 0;\n                this.left = void 0;\n                this.len = void 0;\n                this.max = void 0;\n                this.maxLabelLength = void 0;\n                this.min = void 0;\n                this.minorTickInterval = void 0;\n                this.minorTicks = void 0;\n                this.minPixelPadding = void 0;\n                this.names = void 0;\n                this.offset = void 0;\n                this.oldMax = void 0;\n                this.oldMin = void 0;\n                this.options = void 0;\n                this.overlap = void 0;\n                this.paddedTicks = void 0;\n                this.plotLinesAndBands = void 0;\n                this.plotLinesAndBandsGroups = void 0;\n                this.pointRange = void 0;\n                this.pointRangePadding = void 0;\n                this.pos = void 0;\n                this.positiveValuesOnly = void 0;\n                this.right = void 0;\n                this.series = void 0;\n                this.side = void 0;\n                this.tickAmount = void 0;\n                this.tickInterval = void 0;\n                this.tickmarkOffset = void 0;\n                this.tickPositions = void 0;\n                this.tickRotCorr = void 0;\n                this.ticks = void 0;\n                this.top = void 0;\n                this.transA = void 0;\n                this.transB = void 0;\n                this.translationSlope = void 0;\n                this.userOptions = void 0;\n                this.visible = void 0;\n                this.width = void 0;\n                this.zoomEnabled = void 0;\n                this.init(chart, userOptions);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Overrideable function to initialize the axis.\n             *\n             * @see {@link Axis}\n             *\n             * @function Highcharts.Axis#init\n             *\n             * @param {Highcharts.Chart} chart\n             * The Chart instance to apply the axis on.\n             *\n             * @param {Highcharts.AxisOptions} userOptions\n             * Axis options.\n             *\n             * @fires Highcharts.Axis#event:afterInit\n             * @fires Highcharts.Axis#event:init\n             */\n            Axis.prototype.init = function (chart, userOptions) {\n                var isXAxis = userOptions.isX,\n                    axis = this;\n                /**\n                 * The Chart that the axis belongs to.\n                 *\n                 * @name Highcharts.Axis#chart\n                 * @type {Highcharts.Chart}\n                 */\n                axis.chart = chart;\n                /**\n                 * Whether the axis is horizontal.\n                 *\n                 * @name Highcharts.Axis#horiz\n                 * @type {boolean|undefined}\n                 */\n                axis.horiz = chart.inverted && !axis.isZAxis ? !isXAxis : isXAxis;\n                /**\n                 * Whether the axis is the x-axis.\n                 *\n                 * @name Highcharts.Axis#isXAxis\n                 * @type {boolean|undefined}\n                 */\n                axis.isXAxis = isXAxis;\n                /**\n                 * The collection where the axis belongs, for example `xAxis`, `yAxis`\n                 * or `colorAxis`. Corresponds to properties on Chart, for example\n                 * {@link Chart.xAxis}.\n                 *\n                 * @name Highcharts.Axis#coll\n                 * @type {string}\n                 */\n                axis.coll = axis.coll || (isXAxis ? 'xAxis' : 'yAxis');\n                fireEvent(this, 'init', { userOptions: userOptions });\n                axis.opposite = userOptions.opposite; // needed in setOptions\n                /**\n                 * The side on which the axis is rendered. 0 is top, 1 is right, 2\n                 * is bottom and 3 is left.\n                 *\n                 * @name Highcharts.Axis#side\n                 * @type {number}\n                 */\n                axis.side = userOptions.side || (axis.horiz ?\n                    (axis.opposite ? 0 : 2) : // top : bottom\n                    (axis.opposite ? 1 : 3)); // right : left\n                /**\n                 * Current options for the axis after merge of defaults and user's\n                 * options.\n                 *\n                 * @name Highcharts.Axis#options\n                 * @type {Highcharts.AxisOptions}\n                 */\n                axis.setOptions(userOptions);\n                var options = this.options,\n                    type = options.type;\n                axis.labelFormatter = (options.labels.formatter ||\n                    // can be overwritten by dynamic format\n                    axis.defaultLabelFormatter);\n                /**\n                 * User's options for this axis without defaults.\n                 *\n                 * @name Highcharts.Axis#userOptions\n                 * @type {Highcharts.AxisOptions}\n                 */\n                axis.userOptions = userOptions;\n                axis.minPixelPadding = 0;\n                /**\n                 * Whether the axis is reversed. Based on the `axis.reversed`,\n                 * option, but inverted charts have reversed xAxis by default.\n                 *\n                 * @name Highcharts.Axis#reversed\n                 * @type {boolean}\n                 */\n                axis.reversed = options.reversed;\n                axis.visible = options.visible !== false;\n                axis.zoomEnabled = options.zoomEnabled !== false;\n                // Initial categories\n                axis.hasNames =\n                    type === 'category' || options.categories === true;\n                /**\n                 * If categories are present for the axis, names are used instead of\n                 * numbers for that axis.\n                 *\n                 * Since Highcharts 3.0, categories can also be extracted by giving each\n                 * point a name and setting axis type to `category`. However, if you\n                 * have multiple series, best practice remains defining the `categories`\n                 * array.\n                 *\n                 * @see [xAxis.categories](/highcharts/xAxis.categories)\n                 *\n                 * @name Highcharts.Axis#categories\n                 * @type {Array<string>}\n                 * @readonly\n                 */\n                axis.categories = options.categories || axis.hasNames;\n                if (!axis.names) { // Preserve on update (#3830)\n                    axis.names = [];\n                    axis.names.keys = {};\n                }\n                // Placeholder for plotlines and plotbands groups\n                axis.plotLinesAndBandsGroups = {};\n                // Shorthand types\n                axis.positiveValuesOnly = !!(axis.logarithmic && !options.allowNegativeLog);\n                // Flag, if axis is linked to another axis\n                axis.isLinked = defined(options.linkedTo);\n                /**\n                 * List of major ticks mapped by postition on axis.\n                 *\n                 * @see {@link Highcharts.Tick}\n                 *\n                 * @name Highcharts.Axis#ticks\n                 * @type {Highcharts.Dictionary<Highcharts.Tick>}\n                 */\n                axis.ticks = {};\n                axis.labelEdge = [];\n                /**\n                 * List of minor ticks mapped by position on the axis.\n                 *\n                 * @see {@link Highcharts.Tick}\n                 *\n                 * @name Highcharts.Axis#minorTicks\n                 * @type {Highcharts.Dictionary<Highcharts.Tick>}\n                 */\n                axis.minorTicks = {};\n                // List of plotLines/Bands\n                axis.plotLinesAndBands = [];\n                // Alternate bands\n                axis.alternateBands = {};\n                // Axis metrics\n                axis.len = 0;\n                axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n                axis.range = options.range;\n                axis.offset = options.offset || 0;\n                /**\n                 * The maximum value of the axis. In a logarithmic axis, this is the\n                 * logarithm of the real value, and the real value can be obtained from\n                 * {@link Axis#getExtremes}.\n                 *\n                 * @name Highcharts.Axis#max\n                 * @type {number|null}\n                 */\n                axis.max = null;\n                /**\n                 * The minimum value of the axis. In a logarithmic axis, this is the\n                 * logarithm of the real value, and the real value can be obtained from\n                 * {@link Axis#getExtremes}.\n                 *\n                 * @name Highcharts.Axis#min\n                 * @type {number|null}\n                 */\n                axis.min = null;\n                /**\n                 * The processed crosshair options.\n                 *\n                 * @name Highcharts.Axis#crosshair\n                 * @type {boolean|Highcharts.AxisCrosshairOptions}\n                 */\n                axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);\n                var events = axis.options.events;\n                // Register. Don't add it again on Axis.update().\n                if (chart.axes.indexOf(axis) === -1) { //\n                    if (isXAxis) { // #2713\n                        chart.axes.splice(chart.xAxis.length, 0, axis);\n                    }\n                    else {\n                        chart.axes.push(axis);\n                    }\n                    chart[axis.coll].push(axis);\n                }\n                /**\n                 * All series associated to the axis.\n                 *\n                 * @name Highcharts.Axis#series\n                 * @type {Array<Highcharts.Series>}\n                 */\n                axis.series = axis.series || []; // populated by Series\n                // Reversed axis\n                if (chart.inverted &&\n                    !axis.isZAxis &&\n                    isXAxis &&\n                    typeof axis.reversed === 'undefined') {\n                    axis.reversed = true;\n                }\n                axis.labelRotation = axis.options.labels.rotation;\n                // register event listeners\n                objectEach(events, function (event, eventType) {\n                    if (isFunction(event)) {\n                        addEvent(axis, eventType, event);\n                    }\n                });\n                fireEvent(this, 'afterInit');\n            };\n            /**\n             * Merge and set options.\n             *\n             * @private\n             * @function Highcharts.Axis#setOptions\n             *\n             * @param {Highcharts.AxisOptions} userOptions\n             * Axis options.\n             *\n             * @fires Highcharts.Axis#event:afterSetOptions\n             */\n            Axis.prototype.setOptions = function (userOptions) {\n                this.options = merge(Axis.defaultOptions, (this.coll === 'yAxis') && Axis.defaultYAxisOptions, [\n                    Axis.defaultTopAxisOptions,\n                    Axis.defaultRightAxisOptions,\n                    Axis.defaultBottomAxisOptions,\n                    Axis.defaultLeftAxisOptions\n                ][this.side], merge(\n                // if set in setOptions (#1053):\n                defaultOptions[this.coll], userOptions));\n                fireEvent(this, 'afterSetOptions', { userOptions: userOptions });\n            };\n            /**\n             * The default label formatter. The context is a special config object for\n             * the label. In apps, use the\n             * [labels.formatter](https://api.highcharts.com/highcharts/xAxis.labels.formatter)\n             * instead, except when a modification is needed.\n             *\n             * @function Highcharts.Axis#defaultLabelFormatter\n             *\n             * @param {Highcharts.AxisLabelsFormatterContextObject<number>|Highcharts.AxisLabelsFormatterContextObject<string>} this\n             * Formatter context of axis label.\n             *\n             * @return {string}\n             * The formatted label content.\n             */\n            Axis.prototype.defaultLabelFormatter = function () {\n                var axis = this.axis,\n                    value = isNumber(this.value) ? this.value : NaN,\n                    time = axis.chart.time,\n                    categories = axis.categories,\n                    dateTimeLabelFormat = this.dateTimeLabelFormat,\n                    lang = defaultOptions.lang,\n                    numericSymbols = lang.numericSymbols,\n                    numSymMagnitude = lang.numericSymbolMagnitude || 1000,\n                    i = numericSymbols && numericSymbols.length,\n                    multi,\n                    ret,\n                    formatOption = axis.options.labels.format, \n                    // make sure the same symbol is added for all labels on a linear\n                    // axis\n                    numericSymbolDetector = axis.logarithmic ?\n                        Math.abs(value) :\n                        axis.tickInterval;\n                var chart = this.chart;\n                var numberFormatter = chart.numberFormatter;\n                if (formatOption) {\n                    ret = format(formatOption, this, chart);\n                }\n                else if (categories) {\n                    ret = \"\" + this.value;\n                }\n                else if (dateTimeLabelFormat) { // datetime axis\n                    ret = time.dateFormat(dateTimeLabelFormat, value);\n                }\n                else if (i && numericSymbolDetector >= 1000) {\n                    // Decide whether we should add a numeric symbol like k (thousands)\n                    // or M (millions). If we are to enable this in tooltip or other\n                    // places as well, we can move this logic to the numberFormatter and\n                    // enable it by a parameter.\n                    while (i-- && typeof ret === 'undefined') {\n                        multi = Math.pow(numSymMagnitude, i + 1);\n                        if (\n                        // Only accept a numeric symbol when the distance is more\n                        // than a full unit. So for example if the symbol is k, we\n                        // don't accept numbers like 0.5k.\n                        numericSymbolDetector >= multi &&\n                            // Accept one decimal before the symbol. Accepts 0.5k but\n                            // not 0.25k. How does this work with the previous?\n                            (value * 10) % multi === 0 &&\n                            numericSymbols[i] !== null &&\n                            value !== 0) { // #5480\n                            ret = numberFormatter(value / multi, -1) + numericSymbols[i];\n                        }\n                    }\n                }\n                if (typeof ret === 'undefined') {\n                    if (Math.abs(value) >= 10000) { // add thousands separators\n                        ret = numberFormatter(value, -1);\n                    }\n                    else { // small numbers\n                        ret = numberFormatter(value, -1, void 0, ''); // #2466\n                    }\n                }\n                return ret;\n            };\n            /**\n             * Get the minimum and maximum for the series of each axis. The function\n             * analyzes the axis series and updates `this.dataMin` and `this.dataMax`.\n             *\n             * @private\n             * @function Highcharts.Axis#getSeriesExtremes\n             *\n             * @fires Highcharts.Axis#event:afterGetSeriesExtremes\n             * @fires Highcharts.Axis#event:getSeriesExtremes\n             */\n            Axis.prototype.getSeriesExtremes = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    xExtremes;\n                fireEvent(this, 'getSeriesExtremes', null, function () {\n                    axis.hasVisibleSeries = false;\n                    // Reset properties in case we're redrawing (#3353)\n                    axis.dataMin = axis.dataMax = axis.threshold = null;\n                    axis.softThreshold = !axis.isXAxis;\n                    if (axis.stacking) {\n                        axis.stacking.buildStacks();\n                    }\n                    // loop through this axis' series\n                    axis.series.forEach(function (series) {\n                        if (series.visible ||\n                            !chart.options.chart.ignoreHiddenSeries) {\n                            var seriesOptions = series.options,\n                                xData,\n                                threshold = seriesOptions.threshold,\n                                seriesDataMin,\n                                seriesDataMax;\n                            axis.hasVisibleSeries = true;\n                            // Validate threshold in logarithmic axes\n                            if (axis.positiveValuesOnly && threshold <= 0) {\n                                threshold = null;\n                            }\n                            // Get dataMin and dataMax for X axes\n                            if (axis.isXAxis) {\n                                xData = series.xData;\n                                if (xData.length) {\n                                    xExtremes = series.getXExtremes(xData);\n                                    // If xData contains values which is not numbers,\n                                    // then filter them out. To prevent performance hit,\n                                    // we only do this after we have already found\n                                    // seriesDataMin because in most cases all data is\n                                    // valid. #5234.\n                                    seriesDataMin = xExtremes.min;\n                                    seriesDataMax = xExtremes.max;\n                                    if (!isNumber(seriesDataMin) &&\n                                        // #5010:\n                                        !(seriesDataMin instanceof Date)) {\n                                        xData = xData.filter(isNumber);\n                                        xExtremes = series.getXExtremes(xData);\n                                        // Do it again with valid data\n                                        seriesDataMin = xExtremes.min;\n                                        seriesDataMax = xExtremes.max;\n                                    }\n                                    if (xData.length) {\n                                        axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                                        axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                                    }\n                                }\n                                // Get dataMin and dataMax for Y axes, as well as handle\n                                // stacking and processed data\n                            }\n                            else {\n                                // Get this particular series extremes\n                                var dataExtremes = series.applyExtremes();\n                                // Get the dataMin and dataMax so far. If percentage is\n                                // used, the min and max are always 0 and 100. If\n                                // seriesDataMin and seriesDataMax is null, then series\n                                // doesn't have active y data, we continue with nulls\n                                if (isNumber(dataExtremes.dataMin)) {\n                                    seriesDataMin = dataExtremes.dataMin;\n                                    axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                                }\n                                if (isNumber(dataExtremes.dataMax)) {\n                                    seriesDataMax = dataExtremes.dataMax;\n                                    axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                                }\n                                // Adjust to threshold\n                                if (defined(threshold)) {\n                                    axis.threshold = threshold;\n                                }\n                                // If any series has a hard threshold, it takes\n                                // precedence\n                                if (!seriesOptions.softThreshold ||\n                                    axis.positiveValuesOnly) {\n                                    axis.softThreshold = false;\n                                }\n                            }\n                        }\n                    });\n                });\n                fireEvent(this, 'afterGetSeriesExtremes');\n            };\n            /**\n             * Translate from axis value to pixel position on the chart, or back. Use\n             * the `toPixels` and `toValue` functions in applications.\n             *\n             * @private\n             * @function Highcharts.Axis#translate\n             *\n             * @param {number} val\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [backwards]\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [cvsCoord]\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [old]\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [handleLog]\n             * TO-DO: parameter description\n             *\n             * @param {number} [pointPlacement]\n             * TO-DO: parameter description\n             *\n             * @return {number|undefined}\n             */\n            Axis.prototype.translate = function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n                var axis = this.linkedParent || this, // #1417\n                    sign = 1,\n                    cvsOffset = 0,\n                    localA = old ? axis.oldTransA : axis.transA,\n                    localMin = old ? axis.oldMin : axis.min,\n                    returnValue = 0,\n                    minPixelPadding = axis.minPixelPadding,\n                    doPostTranslate = (axis.isOrdinal ||\n                        axis.brokenAxis && axis.brokenAxis.hasBreaks ||\n                        (axis.logarithmic && handleLog)) && axis.lin2val;\n                if (!localA) {\n                    localA = axis.transA;\n                }\n                // In vertical axes, the canvas coordinates start from 0 at the top like\n                // in SVG.\n                if (cvsCoord) {\n                    sign *= -1; // canvas coordinates inverts the value\n                    cvsOffset = axis.len;\n                }\n                // Handle reversed axis\n                if (axis.reversed) {\n                    sign *= -1;\n                    cvsOffset -= sign * (axis.sector || axis.len);\n                }\n                // From pixels to value\n                if (backwards) { // reverse translation\n                    val = val * sign + cvsOffset;\n                    val -= minPixelPadding;\n                    // from chart pixel to value:\n                    returnValue = val / localA + localMin;\n                    if (doPostTranslate) { // log and ordinal axes\n                        returnValue = axis.lin2val(returnValue);\n                    }\n                    // From value to pixels\n                }\n                else {\n                    if (doPostTranslate) { // log and ordinal axes\n                        val = axis.val2lin(val);\n                    }\n                    returnValue = isNumber(localMin) ?\n                        (sign * (val - localMin) * localA +\n                            cvsOffset +\n                            (sign * minPixelPadding) +\n                            (isNumber(pointPlacement) ?\n                                localA * pointPlacement :\n                                0)) :\n                        void 0;\n                }\n                return returnValue;\n            };\n            /**\n             * Translate a value in terms of axis units into pixels within the chart.\n             *\n             * @function Highcharts.Axis#toPixels\n             *\n             * @param {number} value\n             * A value in terms of axis units.\n             *\n             * @param {boolean} paneCoordinates\n             * Whether to return the pixel coordinate relative to the chart or just the\n             * axis/pane itself.\n             *\n             * @return {number}\n             * Pixel position of the value on the chart or axis.\n             */\n            Axis.prototype.toPixels = function (value, paneCoordinates) {\n                return this.translate(value, false, !this.horiz, null, true) +\n                    (paneCoordinates ? 0 : this.pos);\n            };\n            /**\n             * Translate a pixel position along the axis to a value in terms of axis\n             * units.\n             *\n             * @function Highcharts.Axis#toValue\n             *\n             * @param {number} pixel\n             * The pixel value coordinate.\n             *\n             * @param {boolean} [paneCoordinates=false]\n             * Whether the input pixel is relative to the chart or just the axis/pane\n             * itself.\n             *\n             * @return {number}\n             * The axis value.\n             */\n            Axis.prototype.toValue = function (pixel, paneCoordinates) {\n                return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);\n            };\n            /**\n             * Create the path for a plot line that goes from the given value on\n             * this axis, across the plot to the opposite side. Also used internally for\n             * grid lines and crosshairs.\n             *\n             * @function Highcharts.Axis#getPlotLinePath\n             *\n             * @param {Highcharts.AxisPlotLinePathOptionsObject} options\n             * Options for the path.\n             *\n             * @return {Highcharts.SVGPathArray|null}\n             * The SVG path definition for the plot line.\n             */\n            Axis.prototype.getPlotLinePath = function (options) {\n                var axis = this,\n                    chart = axis.chart,\n                    axisLeft = axis.left,\n                    axisTop = axis.top,\n                    old = options.old,\n                    value = options.value,\n                    translatedValue = options.translatedValue,\n                    lineWidth = options.lineWidth,\n                    force = options.force,\n                    x1,\n                    y1,\n                    x2,\n                    y2,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n                    skip,\n                    transB = axis.transB,\n                    evt;\n                // eslint-disable-next-line valid-jsdoc\n                /**\n                 * Check if x is between a and b. If not, either move to a/b\n                 * or skip, depending on the force parameter.\n                 * @private\n                 */\n                function between(x, a, b) {\n                    if (force !== 'pass' && x < a || x > b) {\n                        if (force) {\n                            x = clamp(x, a, b);\n                        }\n                        else {\n                            skip = true;\n                        }\n                    }\n                    return x;\n                }\n                evt = {\n                    value: value,\n                    lineWidth: lineWidth,\n                    old: old,\n                    force: force,\n                    acrossPanes: options.acrossPanes,\n                    translatedValue: translatedValue\n                };\n                fireEvent(this, 'getPlotLinePath', evt, function (e) {\n                    translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n                    // Keep the translated value within sane bounds, and avoid Infinity\n                    // to fail the isNumber test (#7709).\n                    translatedValue = clamp(translatedValue, -1e5, 1e5);\n                    x1 = x2 = Math.round(translatedValue + transB);\n                    y1 = y2 = Math.round(cHeight - translatedValue - transB);\n                    if (!isNumber(translatedValue)) { // no min or max\n                        skip = true;\n                        force = false; // #7175, don't force it when path is invalid\n                    }\n                    else if (axis.horiz) {\n                        y1 = axisTop;\n                        y2 = cHeight - axis.bottom;\n                        x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n                    }\n                    else {\n                        x1 = axisLeft;\n                        x2 = cWidth - axis.right;\n                        y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n                    }\n                    e.path = skip && !force ?\n                        null :\n                        chart.renderer.crispLine([['M', x1, y1], ['L', x2, y2]], lineWidth || 1);\n                });\n                return evt.path;\n            };\n            /**\n             * Internal function to et the tick positions of a linear axis to round\n             * values like whole tens or every five.\n             *\n             * @function Highcharts.Axis#getLinearTickPositions\n             *\n             * @param {number} tickInterval\n             * The normalized tick interval.\n             *\n             * @param {number} min\n             * Axis minimum.\n             *\n             * @param {number} max\n             * Axis maximum.\n             *\n             * @return {Array<number>}\n             * An array of axis values where ticks should be placed.\n             */\n            Axis.prototype.getLinearTickPositions = function (tickInterval, min, max) {\n                var pos,\n                    lastPos,\n                    roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval),\n                    roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),\n                    tickPositions = [],\n                    precision;\n                // When the precision is higher than what we filter out in\n                // correctFloat, skip it (#6183).\n                if (correctFloat(roundedMin + tickInterval) === roundedMin) {\n                    precision = 20;\n                }\n                // For single points, add a tick regardless of the relative position\n                // (#2662, #6274)\n                if (this.single) {\n                    return [min];\n                }\n                // Populate the intermediate values\n                pos = roundedMin;\n                while (pos <= roundedMax) {\n                    // Place the tick on the rounded value\n                    tickPositions.push(pos);\n                    // Always add the raw tickInterval, not the corrected one.\n                    pos = correctFloat(pos + tickInterval, precision);\n                    // If the interval is not big enough in the current min - max range\n                    // to actually increase the loop variable, we need to break out to\n                    // prevent endless loop. Issue #619\n                    if (pos === lastPos) {\n                        break;\n                    }\n                    // Record the last value\n                    lastPos = pos;\n                }\n                return tickPositions;\n            };\n            /**\n             * Resolve the new minorTicks/minorTickInterval options into the legacy\n             * loosely typed minorTickInterval option.\n             *\n             * @function Highcharts.Axis#getMinorTickInterval\n             *\n             * @return {number|\"auto\"|null}\n             */\n            Axis.prototype.getMinorTickInterval = function () {\n                var options = this.options;\n                if (options.minorTicks === true) {\n                    return pick(options.minorTickInterval, 'auto');\n                }\n                if (options.minorTicks === false) {\n                    return null;\n                }\n                return options.minorTickInterval;\n            };\n            /**\n             * Internal function to return the minor tick positions. For logarithmic\n             * axes, the same logic as for major ticks is reused.\n             *\n             * @function Highcharts.Axis#getMinorTickPositions\n             *\n             * @return {Array<number>}\n             * An array of axis values where ticks should be placed.\n             */\n            Axis.prototype.getMinorTickPositions = function () {\n                var axis = this,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    minorTickInterval = axis.minorTickInterval,\n                    minorTickPositions = [],\n                    pos,\n                    pointRangePadding = axis.pointRangePadding || 0,\n                    min = axis.min - pointRangePadding, // #1498\n                    max = axis.max + pointRangePadding, // #1498\n                    range = max - min;\n                // If minor ticks get too dense, they are hard to read, and may cause\n                // long running script. So we don't draw them.\n                if (range && range / minorTickInterval < axis.len / 3) { // #3875\n                    var logarithmic_1 = axis.logarithmic;\n                    if (logarithmic_1) {\n                        // For each interval in the major ticks, compute the minor ticks\n                        // separately.\n                        this.paddedTicks.forEach(function (_pos, i, paddedTicks) {\n                            if (i) {\n                                minorTickPositions.push.apply(minorTickPositions, logarithmic_1.getLogTickPositions(minorTickInterval, paddedTicks[i - 1], paddedTicks[i], true));\n                            }\n                        });\n                    }\n                    else if (axis.dateTime &&\n                        this.getMinorTickInterval() === 'auto') { // #1314\n                        minorTickPositions = minorTickPositions.concat(axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(minorTickInterval), min, max, options.startOfWeek));\n                    }\n                    else {\n                        for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {\n                            // Very, very, tight grid lines (#5771)\n                            if (pos === minorTickPositions[0]) {\n                                break;\n                            }\n                            minorTickPositions.push(pos);\n                        }\n                    }\n                }\n                if (minorTickPositions.length !== 0) {\n                    axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n                }\n                return minorTickPositions;\n            };\n            /**\n             * Adjust the min and max for the minimum range. Keep in mind that the\n             * series data is not yet processed, so we don't have information on data\n             * cropping and grouping, or updated `axis.pointRange` or\n             * `series.pointRange`. The data can't be processed until we have finally\n             * established min and max.\n             *\n             * @private\n             * @function Highcharts.Axis#adjustForMinRange\n             */\n            Axis.prototype.adjustForMinRange = function () {\n                var axis = this,\n                    options = axis.options,\n                    min = axis.min,\n                    max = axis.max,\n                    log = axis.logarithmic,\n                    zoomOffset,\n                    spaceAvailable,\n                    closestDataRange,\n                    i,\n                    distance,\n                    xData,\n                    loopLength,\n                    minArgs,\n                    maxArgs,\n                    minRange;\n                // Set the automatic minimum range based on the closest point distance\n                if (axis.isXAxis &&\n                    typeof axis.minRange === 'undefined' &&\n                    !log) {\n                    if (defined(options.min) || defined(options.max)) {\n                        axis.minRange = null; // don't do this again\n                    }\n                    else {\n                        // Find the closest distance between raw data points, as opposed\n                        // to closestPointRange that applies to processed points\n                        // (cropped and grouped)\n                        axis.series.forEach(function (series) {\n                            xData = series.xData;\n                            loopLength = series.xIncrement ? 1 : xData.length - 1;\n                            for (i = loopLength; i > 0; i--) {\n                                distance = xData[i] - xData[i - 1];\n                                if (typeof closestDataRange === 'undefined' ||\n                                    distance < closestDataRange) {\n                                    closestDataRange = distance;\n                                }\n                            }\n                        });\n                        axis.minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n                    }\n                }\n                // if minRange is exceeded, adjust\n                if (max - min < axis.minRange) {\n                    spaceAvailable =\n                        axis.dataMax - axis.dataMin >=\n                            axis.minRange;\n                    minRange = axis.minRange;\n                    zoomOffset = (minRange - max + min) / 2;\n                    // if min and max options have been set, don't go beyond it\n                    minArgs = [\n                        min - zoomOffset,\n                        pick(options.min, min - zoomOffset)\n                    ];\n                    // If space is available, stay within the data range\n                    if (spaceAvailable) {\n                        minArgs[2] = axis.logarithmic ?\n                            axis.logarithmic.log2lin(axis.dataMin) :\n                            axis.dataMin;\n                    }\n                    min = arrayMax(minArgs);\n                    maxArgs = [\n                        min + minRange,\n                        pick(options.max, min + minRange)\n                    ];\n                    // If space is availabe, stay within the data range\n                    if (spaceAvailable) {\n                        maxArgs[2] = log ?\n                            log.log2lin(axis.dataMax) :\n                            axis.dataMax;\n                    }\n                    max = arrayMin(maxArgs);\n                    // now if the max is adjusted, adjust the min back\n                    if (max - min < minRange) {\n                        minArgs[0] = max - minRange;\n                        minArgs[1] = pick(options.min, max - minRange);\n                        min = arrayMax(minArgs);\n                    }\n                }\n                // Record modified extremes\n                axis.min = min;\n                axis.max = max;\n            };\n            // eslint-disable-next-line valid-jsdoc\n            /**\n             * Find the closestPointRange across all series.\n             *\n             * @private\n             * @function Highcharts.Axis#getClosest\n             */\n            Axis.prototype.getClosest = function () {\n                var ret;\n                if (this.categories) {\n                    ret = 1;\n                }\n                else {\n                    this.series.forEach(function (series) {\n                        var seriesClosest = series.closestPointRange,\n                            visible = series.visible ||\n                                !series.chart.options.chart.ignoreHiddenSeries;\n                        if (!series.noSharedTooltip &&\n                            defined(seriesClosest) &&\n                            visible) {\n                            ret = defined(ret) ?\n                                Math.min(ret, seriesClosest) :\n                                seriesClosest;\n                        }\n                    });\n                }\n                return ret;\n            };\n            /**\n             * When a point name is given and no x, search for the name in the existing\n             * categories, or if categories aren't provided, search names or create a\n             * new category (#2522).\n             * @private\n             * @function Highcharts.Axis#nameToX\n             *\n             * @param {Highcharts.Point} point\n             * The point to inspect.\n             *\n             * @return {number}\n             * The X value that the point is given.\n             */\n            Axis.prototype.nameToX = function (point) {\n                var explicitCategories = isArray(this.categories),\n                    names = explicitCategories ? this.categories : this.names,\n                    nameX = point.options.x,\n                    x;\n                point.series.requireSorting = false;\n                if (!defined(nameX)) {\n                    nameX = this.options.uniqueNames === false ?\n                        point.series.autoIncrement() :\n                        (explicitCategories ?\n                            names.indexOf(point.name) :\n                            pick(names.keys[point.name], -1));\n                }\n                if (nameX === -1) { // Not found in currenct categories\n                    if (!explicitCategories) {\n                        x = names.length;\n                    }\n                }\n                else {\n                    x = nameX;\n                }\n                // Write the last point's name to the names array\n                if (typeof x !== 'undefined') {\n                    this.names[x] = point.name;\n                    // Backwards mapping is much faster than array searching (#7725)\n                    this.names.keys[point.name] = x;\n                }\n                return x;\n            };\n            /**\n             * When changes have been done to series data, update the axis.names.\n             *\n             * @private\n             * @function Highcharts.Axis#updateNames\n             */\n            Axis.prototype.updateNames = function () {\n                var axis = this,\n                    names = this.names,\n                    i = names.length;\n                if (i > 0) {\n                    Object.keys(names.keys).forEach(function (key) {\n                        delete (names.keys)[key];\n                    });\n                    names.length = 0;\n                    this.minRange = this.userMinRange; // Reset\n                    (this.series || []).forEach(function (series) {\n                        // Reset incrementer (#5928)\n                        series.xIncrement = null;\n                        // When adding a series, points are not yet generated\n                        if (!series.points || series.isDirtyData) {\n                            // When we're updating the series with data that is longer\n                            // than it was, and cropThreshold is passed, we need to make\n                            // sure that the axis.max is increased _before_ running the\n                            // premature processData. Otherwise this early iteration of\n                            // processData will crop the points to axis.max, and the\n                            // names array will be too short (#5857).\n                            axis.max = Math.max(axis.max, series.xData.length - 1);\n                            series.processData();\n                            series.generatePoints();\n                        }\n                        series.data.forEach(function (point, i) {\n                            var x;\n                            if (point &&\n                                point.options &&\n                                typeof point.name !== 'undefined' // #9562\n                            ) {\n                                x = axis.nameToX(point);\n                                if (typeof x !== 'undefined' && x !== point.x) {\n                                    point.x = x;\n                                    series.xData[i] = x;\n                                }\n                            }\n                        });\n                    });\n                }\n            };\n            /**\n             * Update translation information.\n             *\n             * @private\n             * @function Highcharts.Axis#setAxisTranslation\n             *\n             * @param {boolean} [saveOld]\n             * TO-DO: parameter description\n             *\n             * @fires Highcharts.Axis#event:afterSetAxisTranslation\n             */\n            Axis.prototype.setAxisTranslation = function (saveOld) {\n                var axis = this,\n                    range = axis.max - axis.min,\n                    pointRange = axis.axisPointRange || 0,\n                    closestPointRange,\n                    minPointOffset = 0,\n                    pointRangePadding = 0,\n                    linkedParent = axis.linkedParent,\n                    ordinalCorrection,\n                    hasCategories = !!axis.categories,\n                    transA = axis.transA,\n                    isXAxis = axis.isXAxis;\n                // Adjust translation for padding. Y axis with categories need to go\n                // through the same (#1784).\n                if (isXAxis || hasCategories || pointRange) {\n                    // Get the closest points\n                    closestPointRange = axis.getClosest();\n                    if (linkedParent) {\n                        minPointOffset = linkedParent.minPointOffset;\n                        pointRangePadding = linkedParent.pointRangePadding;\n                    }\n                    else {\n                        axis.series.forEach(function (series) {\n                            var seriesPointRange = hasCategories ?\n                                    1 :\n                                    (isXAxis ?\n                                        pick(series.options.pointRange,\n                                closestPointRange, 0) :\n                                        (axis.axisPointRange || 0)), // #2806\n                                pointPlacement = series.options.pointPlacement;\n                            pointRange = Math.max(pointRange, seriesPointRange);\n                            if (!axis.single || hasCategories) {\n                                // TODO: series should internally set x- and y-\n                                // pointPlacement to simplify this logic.\n                                var isPointPlacementAxis = series.is('xrange') ? !isXAxis : isXAxis;\n                                // minPointOffset is the value padding to the left of\n                                // the axis in order to make room for points with a\n                                // pointRange, typically columns. When the\n                                // pointPlacement option is 'between' or 'on', this\n                                // padding does not apply.\n                                minPointOffset = Math.max(minPointOffset, isPointPlacementAxis && isString(pointPlacement) ?\n                                    0 :\n                                    seriesPointRange / 2);\n                                // Determine the total padding needed to the length of\n                                // the axis to make room for the pointRange. If the\n                                // series' pointPlacement is 'on', no padding is added.\n                                pointRangePadding = Math.max(pointRangePadding, isPointPlacementAxis && pointPlacement === 'on' ?\n                                    0 :\n                                    seriesPointRange);\n                            }\n                        });\n                    }\n                    // Record minPointOffset and pointRangePadding\n                    ordinalCorrection = axis.ordinal && axis.ordinal.slope && closestPointRange ?\n                        axis.ordinal.slope / closestPointRange :\n                        1; // #988, #1853\n                    axis.minPointOffset = minPointOffset =\n                        minPointOffset * ordinalCorrection;\n                    axis.pointRangePadding =\n                        pointRangePadding = pointRangePadding * ordinalCorrection;\n                    // pointRange means the width reserved for each point, like in a\n                    // column chart\n                    axis.pointRange = Math.min(pointRange, axis.single && hasCategories ? 1 : range);\n                    // closestPointRange means the closest distance between points. In\n                    // columns it is mostly equal to pointRange, but in lines pointRange\n                    // is 0 while closestPointRange is some other value\n                    if (isXAxis) {\n                        axis.closestPointRange = closestPointRange;\n                    }\n                }\n                // Secondary values\n                if (saveOld) {\n                    axis.oldTransA = transA;\n                }\n                axis.translationSlope = axis.transA = transA =\n                    axis.staticScale ||\n                        axis.len / ((range + pointRangePadding) || 1);\n                // Translation addend\n                axis.transB = axis.horiz ? axis.left : axis.bottom;\n                axis.minPixelPadding = transA * minPointOffset;\n                fireEvent(this, 'afterSetAxisTranslation');\n            };\n            /**\n             * @private\n             * @function Highcharts.Axis#minFromRange\n             *\n             * @return {number}\n             */\n            Axis.prototype.minFromRange = function () {\n                var axis = this;\n                return axis.max - axis.range;\n            };\n            /**\n             * Set the tick positions to round values and optionally extend the extremes\n             * to the nearest tick.\n             *\n             * @private\n             * @function Highcharts.Axis#setTickInterval\n             *\n             * @param {boolean} secondPass\n             * TO-DO: parameter description\n             *\n             * @fires Highcharts.Axis#event:foundExtremes\n             */\n            Axis.prototype.setTickInterval = function (secondPass) {\n                var axis = this,\n                    chart = axis.chart,\n                    log = axis.logarithmic,\n                    options = axis.options,\n                    isXAxis = axis.isXAxis,\n                    isLinked = axis.isLinked,\n                    maxPadding = options.maxPadding,\n                    minPadding = options.minPadding,\n                    length,\n                    linkedParentExtremes,\n                    tickIntervalOption = options.tickInterval,\n                    minTickInterval,\n                    tickPixelIntervalOption = options.tickPixelInterval,\n                    categories = axis.categories,\n                    threshold = isNumber(axis.threshold) ? axis.threshold : null,\n                    softThreshold = axis.softThreshold,\n                    thresholdMin,\n                    thresholdMax,\n                    hardMin,\n                    hardMax;\n                if (!axis.dateTime && !categories && !isLinked) {\n                    this.getTickAmount();\n                }\n                // Min or max set either by zooming/setExtremes or initial options\n                hardMin = pick(axis.userMin, options.min);\n                hardMax = pick(axis.userMax, options.max);\n                // Linked axis gets the extremes from the parent axis\n                if (isLinked) {\n                    axis.linkedParent = chart[axis.coll][options.linkedTo];\n                    linkedParentExtremes = axis.linkedParent.getExtremes();\n                    axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n                    axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n                    if (options.type !== axis.linkedParent.options.type) {\n                        // Can't link axes of different type\n                        error(11, 1, chart);\n                    }\n                    // Initial min and max from the extreme data values\n                }\n                else {\n                    // Adjust to hard threshold\n                    if (!softThreshold && defined(threshold)) {\n                        if (axis.dataMin >= threshold) {\n                            thresholdMin = threshold;\n                            minPadding = 0;\n                        }\n                        else if (axis.dataMax <= threshold) {\n                            thresholdMax = threshold;\n                            maxPadding = 0;\n                        }\n                    }\n                    axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n                    axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n                }\n                if (log) {\n                    if (axis.positiveValuesOnly &&\n                        !secondPass &&\n                        Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978\n                        // Can't plot negative values on log axis\n                        error(10, 1, chart);\n                    }\n                    // The correctFloat cures #934, float errors on full tens. But it\n                    // was too aggressive for #4360 because of conversion back to lin,\n                    // therefore use precision 15.\n                    axis.min = correctFloat(log.log2lin(axis.min), 16);\n                    axis.max = correctFloat(log.log2lin(axis.max), 16);\n                }\n                // handle zoomed range\n                if (axis.range && defined(axis.max)) {\n                    // #618, #6773:\n                    axis.userMin = axis.min = hardMin =\n                        Math.max(axis.dataMin, axis.minFromRange());\n                    axis.userMax = hardMax = axis.max;\n                    axis.range = null; // don't use it when running setExtremes\n                }\n                // Hook for Highstock Scroller. Consider combining with beforePadding.\n                fireEvent(axis, 'foundExtremes');\n                // Hook for adjusting this.min and this.max. Used by bubble series.\n                if (axis.beforePadding) {\n                    axis.beforePadding();\n                }\n                // adjust min and max for the minimum range\n                axis.adjustForMinRange();\n                // Pad the values to get clear of the chart's edges. To avoid\n                // tickInterval taking the padding into account, we do this after\n                // computing tick interval (#1337).\n                if (!categories &&\n                    !axis.axisPointRange &&\n                    !(axis.stacking && axis.stacking.usePercentage) &&\n                    !isLinked &&\n                    defined(axis.min) &&\n                    defined(axis.max)) {\n                    length = axis.max - axis.min;\n                    if (length) {\n                        if (!defined(hardMin) && minPadding) {\n                            axis.min -= length * minPadding;\n                        }\n                        if (!defined(hardMax) && maxPadding) {\n                            axis.max += length * maxPadding;\n                        }\n                    }\n                }\n                // Handle options for floor, ceiling, softMin and softMax (#6359)\n                if (!isNumber(axis.userMin)) {\n                    if (isNumber(options.softMin) && options.softMin < axis.min) {\n                        axis.min = hardMin = options.softMin; // #6894\n                    }\n                    if (isNumber(options.floor)) {\n                        axis.min = Math.max(axis.min, options.floor);\n                    }\n                }\n                if (!isNumber(axis.userMax)) {\n                    if (isNumber(options.softMax) && options.softMax > axis.max) {\n                        axis.max = hardMax = options.softMax; // #6894\n                    }\n                    if (isNumber(options.ceiling)) {\n                        axis.max = Math.min(axis.max, options.ceiling);\n                    }\n                }\n                // When the threshold is soft, adjust the extreme value only if the data\n                // extreme and the padded extreme land on either side of the threshold.\n                // For example, a series of [0, 1, 2, 3] would make the yAxis add a tick\n                // for -1 because of the default minPadding and startOnTick options.\n                // This is prevented by the softThreshold option.\n                if (softThreshold && defined(axis.dataMin)) {\n                    threshold = threshold || 0;\n                    if (!defined(hardMin) &&\n                        axis.min < threshold &&\n                        axis.dataMin >= threshold) {\n                        axis.min = axis.options.minRange ?\n                            Math.min(threshold, axis.max -\n                                axis.minRange) :\n                            threshold;\n                    }\n                    else if (!defined(hardMax) &&\n                        axis.max > threshold &&\n                        axis.dataMax <= threshold) {\n                        axis.max = axis.options.minRange ?\n                            Math.max(threshold, axis.min +\n                                axis.minRange) :\n                            threshold;\n                    }\n                }\n                // get tickInterval\n                if (axis.min === axis.max ||\n                    typeof axis.min === 'undefined' ||\n                    typeof axis.max === 'undefined') {\n                    axis.tickInterval = 1;\n                }\n                else if (isLinked &&\n                    !tickIntervalOption &&\n                    tickPixelIntervalOption ===\n                        axis.linkedParent.options.tickPixelInterval) {\n                    axis.tickInterval = tickIntervalOption =\n                        axis.linkedParent.tickInterval;\n                }\n                else {\n                    axis.tickInterval = pick(tickIntervalOption, this.tickAmount ?\n                        ((axis.max - axis.min) /\n                            Math.max(this.tickAmount - 1, 1)) :\n                        void 0, \n                    // For categoried axis, 1 is default, for linear axis use\n                    // tickPix\n                    categories ?\n                        1 :\n                        // don't let it be more than the data range\n                        (axis.max - axis.min) *\n                            tickPixelIntervalOption /\n                            Math.max(axis.len, tickPixelIntervalOption));\n                }\n                // Now we're finished detecting min and max, crop and group series data.\n                // This is in turn needed in order to find tick positions in ordinal\n                // axes.\n                if (isXAxis && !secondPass) {\n                    axis.series.forEach(function (series) {\n                        series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n                    });\n                }\n                // set the translation factor used in translate function\n                axis.setAxisTranslation(true);\n                // hook for ordinal axes and radial axes\n                fireEvent(this, 'initialAxisTranslation');\n                // In column-like charts, don't cramp in more ticks than there are\n                // points (#1943, #4184)\n                if (axis.pointRange && !tickIntervalOption) {\n                    axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n                }\n                // Before normalizing the tick interval, handle minimum tick interval.\n                // This applies only if tickInterval is not defined.\n                minTickInterval = pick(options.minTickInterval, \n                // In datetime axes, don't go below the data interval, except when\n                // there are scatter-like series involved (#13369).\n                axis.dateTime &&\n                    !axis.series.some(function (s) { return s.noSharedTooltip; }) ?\n                    axis.closestPointRange : 0);\n                if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n                    axis.tickInterval = minTickInterval;\n                }\n                // for linear axes, get magnitude and normalize the interval\n                if (!axis.dateTime && !axis.logarithmic && !tickIntervalOption) {\n                    axis.tickInterval = normalizeTickInterval(axis.tickInterval, void 0, getMagnitude(axis.tickInterval), pick(options.allowDecimals, \n                    // If the tick interval is greather than 0.5, avoid\n                    // decimals, as linear axes are often used to render\n                    // discrete values. #3363. If a tick amount is set, allow\n                    // decimals by default, as it increases the chances for a\n                    // good fit.\n                    axis.tickInterval < 0.5 || this.tickAmount !== void 0), !!this.tickAmount);\n                }\n                // Prevent ticks from getting so close that we can't draw the labels\n                if (!this.tickAmount) {\n                    axis.tickInterval = axis.unsquish();\n                }\n                this.setTickPositions();\n            };\n            /**\n             * Now we have computed the normalized tickInterval, get the tick positions\n             *\n             * @function Highcharts.Axis#setTickPositions\n             *\n             * @fires Highcharts.Axis#event:afterSetTickPositions\n             */\n            Axis.prototype.setTickPositions = function () {\n                var axis = this,\n                    options = this.options,\n                    tickPositions,\n                    tickPositionsOption = options.tickPositions,\n                    minorTickIntervalOption = this.getMinorTickInterval(),\n                    tickPositioner = options.tickPositioner,\n                    hasVerticalPanning = this.hasVerticalPanning(),\n                    isColorAxis = this.coll === 'colorAxis',\n                    startOnTick = (isColorAxis || !hasVerticalPanning) && options.startOnTick,\n                    endOnTick = (isColorAxis || !hasVerticalPanning) && options.endOnTick;\n                // Set the tickmarkOffset\n                this.tickmarkOffset = (this.categories &&\n                    options.tickmarkPlacement === 'between' &&\n                    this.tickInterval === 1) ? 0.5 : 0; // #3202\n                // get minorTickInterval\n                this.minorTickInterval =\n                    minorTickIntervalOption === 'auto' &&\n                        this.tickInterval ?\n                        this.tickInterval / 5 :\n                        minorTickIntervalOption;\n                // When there is only one point, or all points have the same value on\n                // this axis, then min and max are equal and tickPositions.length is 0\n                // or 1. In this case, add some padding in order to center the point,\n                // but leave it with one tick. #1337.\n                this.single =\n                    this.min === this.max &&\n                        defined(this.min) &&\n                        !this.tickAmount &&\n                        (\n                        // Data is on integer (#6563)\n                        parseInt(this.min, 10) === this.min ||\n                            // Between integers and decimals are not allowed (#6274)\n                            options.allowDecimals !== false);\n                /**\n                 * Contains the current positions that are laid out on the axis. The\n                 * positions are numbers in terms of axis values. In a category axis\n                 * they are integers, in a datetime axis they are also integers, but\n                 * designating milliseconds.\n                 *\n                 * This property is read only - for modifying the tick positions, use\n                 * the `tickPositioner` callback or [axis.tickPositions(\n                 * https://api.highcharts.com/highcharts/xAxis.tickPositions) option\n                 * instead.\n                 *\n                 * @name Highcharts.Axis#tickPositions\n                 * @type {Highcharts.AxisTickPositionsArray|undefined}\n                 */\n                this.tickPositions =\n                    // Find the tick positions. Work on a copy (#1565)\n                    tickPositions =\n                        (tickPositionsOption && tickPositionsOption.slice());\n                if (!tickPositions) {\n                    // Too many ticks (#6405). Create a friendly warning and provide two\n                    // ticks so at least we can show the data series.\n                    if ((!axis.ordinal || !axis.ordinal.positions) &&\n                        ((this.max - this.min) /\n                            this.tickInterval >\n                            Math.max(2 * this.len, 200))) {\n                        tickPositions = [this.min, this.max];\n                        error(19, false, this.chart);\n                    }\n                    else if (axis.dateTime) {\n                        tickPositions = axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(this.tickInterval, options.units), this.min, this.max, options.startOfWeek, axis.ordinal && axis.ordinal.positions, this.closestPointRange, true);\n                    }\n                    else if (axis.logarithmic) {\n                        tickPositions = axis.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max);\n                    }\n                    else {\n                        tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);\n                    }\n                    // Too dense ticks, keep only the first and last (#4477)\n                    if (tickPositions.length > this.len) {\n                        tickPositions = [tickPositions[0], tickPositions.pop()];\n                        // Reduce doubled value (#7339)\n                        if (tickPositions[0] === tickPositions[1]) {\n                            tickPositions.length = 1;\n                        }\n                    }\n                    this.tickPositions = tickPositions;\n                    // Run the tick positioner callback, that allows modifying auto tick\n                    // positions.\n                    if (tickPositioner) {\n                        tickPositioner = tickPositioner.apply(axis, [this.min, this.max]);\n                        if (tickPositioner) {\n                            this.tickPositions = tickPositions = tickPositioner;\n                        }\n                    }\n                }\n                // Reset min/max or remove extremes based on start/end on tick\n                this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n                this.trimTicks(tickPositions, startOnTick, endOnTick);\n                if (!this.isLinked) {\n                    // Substract half a unit (#2619, #2846, #2515, #3390),\n                    // but not in case of multiple ticks (#6897)\n                    if (this.single &&\n                        tickPositions.length < 2 &&\n                        !this.categories &&\n                        !this.series.some(function (s) {\n                            return (s.is('heatmap') && s.options.pointPlacement === 'between');\n                        })) {\n                        this.min -= 0.5;\n                        this.max += 0.5;\n                    }\n                    if (!tickPositionsOption && !tickPositioner) {\n                        this.adjustTickAmount();\n                    }\n                }\n                fireEvent(this, 'afterSetTickPositions');\n            };\n            /**\n             * Handle startOnTick and endOnTick by either adapting to padding min/max or\n             * rounded min/max. Also handle single data points.\n             *\n             * @private\n             * @function Highcharts.Axis#trimTicks\n             *\n             * @param {Array<number>} tickPositions\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [startOnTick]\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [endOnTick]\n             * TO-DO: parameter description\n             */\n            Axis.prototype.trimTicks = function (tickPositions, startOnTick, endOnTick) {\n                var roundedMin = tickPositions[0],\n                    roundedMax = tickPositions[tickPositions.length - 1],\n                    minPointOffset = (!this.isOrdinal && this.minPointOffset) || 0; // (#12716)\n                    fireEvent(this, 'trimTicks');\n                if (!this.isLinked) {\n                    if (startOnTick && roundedMin !== -Infinity) { // #6502\n                        this.min = roundedMin;\n                    }\n                    else {\n                        while (this.min - minPointOffset > tickPositions[0]) {\n                            tickPositions.shift();\n                        }\n                    }\n                    if (endOnTick) {\n                        this.max = roundedMax;\n                    }\n                    else {\n                        while (this.max + minPointOffset <\n                            tickPositions[tickPositions.length - 1]) {\n                            tickPositions.pop();\n                        }\n                    }\n                    // If no tick are left, set one tick in the middle (#3195)\n                    if (tickPositions.length === 0 &&\n                        defined(roundedMin) &&\n                        !this.options.tickPositions) {\n                        tickPositions.push((roundedMax + roundedMin) / 2);\n                    }\n                }\n            };\n            /**\n             * Check if there are multiple axes in the same pane.\n             *\n             * @private\n             * @function Highcharts.Axis#alignToOthers\n             *\n             * @return {boolean|undefined}\n             * True if there are other axes.\n             */\n            Axis.prototype.alignToOthers = function () {\n                var axis = this,\n                    others = // Whether there is another axis to pair with this one\n                     {},\n                    hasOther,\n                    options = axis.options;\n                if (\n                // Only if alignTicks is true\n                this.chart.options.chart.alignTicks !== false &&\n                    options.alignTicks !== false &&\n                    // Disabled when startOnTick or endOnTick are false (#7604)\n                    options.startOnTick !== false &&\n                    options.endOnTick !== false &&\n                    // Don't try to align ticks on a log axis, they are not evenly\n                    // spaced (#6021)\n                    !axis.logarithmic) {\n                    this.chart[this.coll].forEach(function (axis) {\n                        var otherOptions = axis.options, horiz = axis.horiz, key = [\n                                horiz ? otherOptions.left : otherOptions.top,\n                                otherOptions.width,\n                                otherOptions.height,\n                                otherOptions.pane\n                            ].join(',');\n                        if (axis.series.length) { // #4442\n                            if (others[key]) {\n                                hasOther = true; // #4201\n                            }\n                            else {\n                                others[key] = 1;\n                            }\n                        }\n                    });\n                }\n                return hasOther;\n            };\n            /**\n             * Find the max ticks of either the x and y axis collection, and record it\n             * in `this.tickAmount`.\n             *\n             * @private\n             * @function Highcharts.Axis#getTickAmount\n             */\n            Axis.prototype.getTickAmount = function () {\n                var axis = this,\n                    options = this.options,\n                    tickAmount = options.tickAmount,\n                    tickPixelInterval = options.tickPixelInterval;\n                if (!defined(options.tickInterval) &&\n                    !tickAmount && this.len < tickPixelInterval &&\n                    !this.isRadial &&\n                    !axis.logarithmic &&\n                    options.startOnTick &&\n                    options.endOnTick) {\n                    tickAmount = 2;\n                }\n                if (!tickAmount && this.alignToOthers()) {\n                    // Add 1 because 4 tick intervals require 5 ticks (including first\n                    // and last)\n                    tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n                }\n                // For tick amounts of 2 and 3, compute five ticks and remove the\n                // intermediate ones. This prevents the axis from adding ticks that are\n                // too far away from the data extremes.\n                if (tickAmount < 4) {\n                    this.finalTickAmt = tickAmount;\n                    tickAmount = 5;\n                }\n                this.tickAmount = tickAmount;\n            };\n            /**\n             * When using multiple axes, adjust the number of ticks to match the highest\n             * number of ticks in that group.\n             *\n             * @private\n             * @function Highcharts.Axis#adjustTickAmount\n             */\n            Axis.prototype.adjustTickAmount = function () {\n                var axis = this,\n                    axisOptions = axis.options,\n                    tickInterval = axis.tickInterval,\n                    tickPositions = axis.tickPositions,\n                    tickAmount = axis.tickAmount,\n                    finalTickAmt = axis.finalTickAmt,\n                    currentTickAmount = tickPositions && tickPositions.length,\n                    threshold = pick(axis.threshold,\n                    axis.softThreshold ? 0 : null),\n                    min,\n                    len,\n                    i;\n                if (axis.hasData()) {\n                    if (currentTickAmount < tickAmount) {\n                        min = axis.min;\n                        while (tickPositions.length < tickAmount) {\n                            // Extend evenly for both sides unless we're on the\n                            // threshold (#3965)\n                            if (tickPositions.length % 2 ||\n                                min === threshold) {\n                                // to the end\n                                tickPositions.push(correctFloat(tickPositions[tickPositions.length - 1] +\n                                    tickInterval));\n                            }\n                            else {\n                                // to the start\n                                tickPositions.unshift(correctFloat(tickPositions[0] - tickInterval));\n                            }\n                        }\n                        axis.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n                        // Do not crop when ticks are not extremes (#9841)\n                        axis.min = axisOptions.startOnTick ?\n                            tickPositions[0] :\n                            Math.min(axis.min, tickPositions[0]);\n                        axis.max = axisOptions.endOnTick ?\n                            tickPositions[tickPositions.length - 1] :\n                            Math.max(axis.max, tickPositions[tickPositions.length - 1]);\n                        // We have too many ticks, run second pass to try to reduce ticks\n                    }\n                    else if (currentTickAmount > tickAmount) {\n                        axis.tickInterval *= 2;\n                        axis.setTickPositions();\n                    }\n                    // The finalTickAmt property is set in getTickAmount\n                    if (defined(finalTickAmt)) {\n                        i = len = tickPositions.length;\n                        while (i--) {\n                            if (\n                            // Remove every other tick\n                            (finalTickAmt === 3 && i % 2 === 1) ||\n                                // Remove all but first and last\n                                (finalTickAmt <= 2 && i > 0 && i < len - 1)) {\n                                tickPositions.splice(i, 1);\n                            }\n                        }\n                        axis.finalTickAmt = void 0;\n                    }\n                }\n            };\n            /**\n             * Set the scale based on data min and max, user set min and max or options.\n             *\n             * @private\n             * @function Highcharts.Axis#setScale\n             *\n             * @fires Highcharts.Axis#event:afterSetScale\n             */\n            Axis.prototype.setScale = function () {\n                var axis = this,\n                    isDirtyAxisLength,\n                    isDirtyData = false,\n                    isXAxisDirty = false;\n                axis.series.forEach(function (series) {\n                    var _a;\n                    isDirtyData = isDirtyData || series.isDirtyData || series.isDirty;\n                    // When x axis is dirty, we need new data extremes for y as\n                    // well:\n                    isXAxisDirty = isXAxisDirty || ((_a = series.xAxis) === null || _a === void 0 ? void 0 : _a.isDirty) || false;\n                });\n                axis.oldMin = axis.min;\n                axis.oldMax = axis.max;\n                axis.oldAxisLength = axis.len;\n                // set the new axisLength\n                axis.setAxisSize();\n                isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n                // do we really need to go through all this?\n                if (isDirtyAxisLength ||\n                    isDirtyData ||\n                    isXAxisDirty ||\n                    axis.isLinked ||\n                    axis.forceRedraw ||\n                    axis.userMin !== axis.oldUserMin ||\n                    axis.userMax !== axis.oldUserMax ||\n                    axis.alignToOthers()) {\n                    if (axis.stacking) {\n                        axis.stacking.resetStacks();\n                    }\n                    axis.forceRedraw = false;\n                    // get data extremes if needed\n                    axis.getSeriesExtremes();\n                    // get fixed positions based on tickInterval\n                    axis.setTickInterval();\n                    // record old values to decide whether a rescale is necessary later\n                    // on (#540)\n                    axis.oldUserMin = axis.userMin;\n                    axis.oldUserMax = axis.userMax;\n                    // Mark as dirty if it is not already set to dirty and extremes have\n                    // changed. #595.\n                    if (!axis.isDirty) {\n                        axis.isDirty =\n                            isDirtyAxisLength ||\n                                axis.min !== axis.oldMin ||\n                                axis.max !== axis.oldMax;\n                    }\n                }\n                else if (axis.stacking) {\n                    axis.stacking.cleanStacks();\n                }\n                // Recalculate panning state object, when the data\n                // has changed. It is required when vertical panning is enabled.\n                if (isDirtyData && axis.panningState) {\n                    axis.panningState.isDirty = true;\n                }\n                fireEvent(this, 'afterSetScale');\n            };\n            /**\n             * Set the minimum and maximum of the axes after render time. If the\n             * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n             * values are rounded off to the nearest tick. To prevent this, these\n             * options can be set to false before calling setExtremes. Also, setExtremes\n             * will not allow a range lower than the `minRange` option, which by default\n             * is the range of five points.\n             *\n             * @sample highcharts/members/axis-setextremes/\n             *         Set extremes from a button\n             * @sample highcharts/members/axis-setextremes-datetime/\n             *         Set extremes on a datetime axis\n             * @sample highcharts/members/axis-setextremes-off-ticks/\n             *         Set extremes off ticks\n             * @sample stock/members/axis-setextremes/\n             *         Set extremes in Highstock\n             * @sample maps/members/axis-setextremes/\n             *         Set extremes in Highmaps\n             *\n             * @function Highcharts.Axis#setExtremes\n             *\n             * @param {number} [newMin]\n             *        The new minimum value.\n             *\n             * @param {number} [newMax]\n             *        The new maximum value.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call to\n             *        {@link Highcharts.Chart#redraw}\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Enable or modify animations.\n             *\n             * @param {*} [eventArguments]\n             *        Arguments to be accessed in event handler.\n             *\n             * @fires Highcharts.Axis#event:setExtremes\n             */\n            Axis.prototype.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {\n                var axis = this,\n                    chart = axis.chart;\n                redraw = pick(redraw, true); // defaults to true\n                axis.series.forEach(function (serie) {\n                    delete serie.kdTree;\n                });\n                // Extend the arguments with min and max\n                eventArguments = extend(eventArguments, {\n                    min: newMin,\n                    max: newMax\n                });\n                // Fire the event\n                fireEvent(axis, 'setExtremes', eventArguments, function () {\n                    axis.userMin = newMin;\n                    axis.userMax = newMax;\n                    axis.eventArgs = eventArguments;\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                });\n            };\n            /**\n             * Overridable method for zooming chart. Pulled out in a separate method to\n             * allow overriding in stock charts.\n             * @private\n             * @function Highcharts.Axis#zoom\n             *\n             * @param {number} newMin\n             * TO-DO: parameter description\n             *\n             * @param {number} newMax\n             * TO-DO: parameter description\n             *\n             * @return {boolean}\n             */\n            Axis.prototype.zoom = function (newMin, newMax) {\n                var axis = this,\n                    dataMin = this.dataMin,\n                    dataMax = this.dataMax,\n                    options = this.options,\n                    min = Math.min(dataMin,\n                    pick(options.min,\n                    dataMin)),\n                    max = Math.max(dataMax,\n                    pick(options.max,\n                    dataMax)),\n                    evt = {\n                        newMin: newMin,\n                        newMax: newMax\n                    };\n                fireEvent(this, 'zoom', evt, function (e) {\n                    // Use e.newMin and e.newMax - event handlers may have altered them\n                    var newMin = e.newMin,\n                        newMax = e.newMax;\n                    if (newMin !== axis.min || newMax !== axis.max) { // #5790\n                        // Prevent pinch zooming out of range. Check for defined is for\n                        // #1946. #1734.\n                        if (!axis.allowZoomOutside) {\n                            // #6014, sometimes newMax will be smaller than min (or\n                            // newMin will be larger than max).\n                            if (defined(dataMin)) {\n                                if (newMin < min) {\n                                    newMin = min;\n                                }\n                                if (newMin > max) {\n                                    newMin = max;\n                                }\n                            }\n                            if (defined(dataMax)) {\n                                if (newMax < min) {\n                                    newMax = min;\n                                }\n                                if (newMax > max) {\n                                    newMax = max;\n                                }\n                            }\n                        }\n                        // In full view, displaying the reset zoom button is not\n                        // required\n                        axis.displayBtn = (typeof newMin !== 'undefined' ||\n                            typeof newMax !== 'undefined');\n                        // Do it\n                        axis.setExtremes(newMin, newMax, false, void 0, { trigger: 'zoom' });\n                    }\n                    e.zoomed = true;\n                });\n                return evt.zoomed;\n            };\n            /**\n             * Update the axis metrics.\n             *\n             * @private\n             * @function Highcharts.Axis#setAxisSize\n             */\n            Axis.prototype.setAxisSize = function () {\n                var chart = this.chart,\n                    options = this.options, \n                    // [top, right, bottom, left]\n                    offsets = options.offsets || [0, 0, 0, 0],\n                    horiz = this.horiz, \n                    // Check for percentage based input values. Rounding fixes problems\n                    // with column overflow and plot line filtering (#4898, #4899)\n                    width = this.width = Math.round(relativeLength(pick(options.width,\n                    chart.plotWidth - offsets[3] + offsets[1]),\n                    chart.plotWidth)),\n                    height = this.height = Math.round(relativeLength(pick(options.height,\n                    chart.plotHeight - offsets[0] + offsets[2]),\n                    chart.plotHeight)),\n                    top = this.top = Math.round(relativeLength(pick(options.top,\n                    chart.plotTop + offsets[0]),\n                    chart.plotHeight,\n                    chart.plotTop)),\n                    left = this.left = Math.round(relativeLength(pick(options.left,\n                    chart.plotLeft + offsets[3]),\n                    chart.plotWidth,\n                    chart.plotLeft));\n                // Expose basic values to use in Series object and navigator\n                this.bottom = chart.chartHeight - height - top;\n                this.right = chart.chartWidth - width - left;\n                // Direction agnostic properties\n                this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n                this.pos = horiz ? left : top; // distance from SVG origin\n            };\n            /**\n             * Get the current extremes for the axis.\n             *\n             * @sample highcharts/members/axis-getextremes/\n             *         Report extremes by click on a button\n             * @sample maps/members/axis-getextremes/\n             *         Get extremes in Highmaps\n             *\n             * @function Highcharts.Axis#getExtremes\n             *\n             * @return {Highcharts.ExtremesObject}\n             * An object containing extremes information.\n             */\n            Axis.prototype.getExtremes = function () {\n                var axis = this;\n                var log = axis.logarithmic;\n                return {\n                    min: log ?\n                        correctFloat(log.lin2log(axis.min)) :\n                        axis.min,\n                    max: log ?\n                        correctFloat(log.lin2log(axis.max)) :\n                        axis.max,\n                    dataMin: axis.dataMin,\n                    dataMax: axis.dataMax,\n                    userMin: axis.userMin,\n                    userMax: axis.userMax\n                };\n            };\n            /**\n             * Get the zero plane either based on zero or on the min or max value.\n             * Used in bar and area plots.\n             *\n             * @function Highcharts.Axis#getThreshold\n             *\n             * @param {number} threshold\n             * The threshold in axis values.\n             *\n             * @return {number|undefined}\n             * The translated threshold position in terms of pixels, and corrected to\n             * stay within the axis bounds.\n             */\n            Axis.prototype.getThreshold = function (threshold) {\n                var axis = this,\n                    log = axis.logarithmic,\n                    realMin = log ? log.lin2log(axis.min) : axis.min,\n                    realMax = log ? log.lin2log(axis.max) : axis.max;\n                if (threshold === null || threshold === -Infinity) {\n                    threshold = realMin;\n                }\n                else if (threshold === Infinity) {\n                    threshold = realMax;\n                }\n                else if (realMin > threshold) {\n                    threshold = realMin;\n                }\n                else if (realMax < threshold) {\n                    threshold = realMax;\n                }\n                return axis.translate(threshold, 0, 1, 0, 1);\n            };\n            /**\n             * Compute auto alignment for the axis label based on which side the axis is\n             * on and the given rotation for the label.\n             *\n             * @private\n             * @function Highcharts.Axis#autoLabelAlign\n             *\n             * @param {number} rotation\n             * The rotation in degrees as set by either the `rotation` or `autoRotation`\n             * options.\n             *\n             * @return {Highcharts.AlignValue}\n             * Can be `\"center\"`, `\"left\"` or `\"right\"`.\n             */\n            Axis.prototype.autoLabelAlign = function (rotation) {\n                var angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360,\n                    evt = { align: 'center' };\n                fireEvent(this, 'autoLabelAlign', evt, function (e) {\n                    if (angle > 15 && angle < 165) {\n                        e.align = 'right';\n                    }\n                    else if (angle > 195 && angle < 345) {\n                        e.align = 'left';\n                    }\n                });\n                return evt.align;\n            };\n            /**\n             * Get the tick length and width for the axis based on axis options.\n             * @private\n             * @function Highcharts.Axis#tickSize\n             *\n             * @param {string} [prefix]\n             * 'tick' or 'minorTick'\n             *\n             * @return {Array<number,number>|undefined}\n             * An array of tickLength and tickWidth\n             */\n            Axis.prototype.tickSize = function (prefix) {\n                var options = this.options, tickLength = options[prefix === 'tick' ? 'tickLength' : 'minorTickLength'], tickWidth = pick(options[prefix === 'tick' ? 'tickWidth' : 'minorTickWidth'], \n                    // Default to 1 on linear and datetime X axes\n                    prefix === 'tick' && this.isXAxis && !this.categories ? 1 : 0), e, tickSize;\n                if (tickWidth && tickLength) {\n                    // Negate the length\n                    if (options[prefix + 'Position'] === 'inside') {\n                        tickLength = -tickLength;\n                    }\n                    tickSize = [tickLength, tickWidth];\n                }\n                e = { tickSize: tickSize };\n                fireEvent(this, 'afterTickSize', e);\n                return e.tickSize;\n            };\n            /**\n             * Return the size of the labels.\n             *\n             * @private\n             * @function Highcharts.Axis#labelMetrics\n             *\n             * @return {Highcharts.FontMetricsObject}\n             */\n            Axis.prototype.labelMetrics = function () {\n                var index = this.tickPositions && this.tickPositions[0] || 0;\n                return this.chart.renderer.fontMetrics(this.options.labels.style &&\n                    this.options.labels.style.fontSize, this.ticks[index] && this.ticks[index].label);\n            };\n            /**\n             * Prevent the ticks from getting so close we can't draw the labels. On a\n             * horizontal axis, this is handled by rotating the labels, removing ticks\n             * and adding ellipsis. On a vertical axis remove ticks and add ellipsis.\n             *\n             * @private\n             * @function Highcharts.Axis#unsquish\n             *\n             * @return {number}\n             */\n            Axis.prototype.unsquish = function () {\n                var labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    tickInterval = this.tickInterval,\n                    newTickInterval = tickInterval,\n                    slotSize = this.len / (((this.categories ? 1 : 0) +\n                        this.max -\n                        this.min) /\n                        tickInterval),\n                    rotation,\n                    rotationOption = labelOptions.rotation,\n                    labelMetrics = this.labelMetrics(),\n                    step,\n                    bestScore = Number.MAX_VALUE,\n                    autoRotation,\n                    range = this.max - this.min, \n                    // Return the multiple of tickInterval that is needed to avoid\n                    // collision\n                    getStep = function (spaceNeeded) {\n                        var step = spaceNeeded / (slotSize || 1);\n                    step = step > 1 ? Math.ceil(step) : 1;\n                    // Guard for very small or negative angles (#9835)\n                    if (step * tickInterval > range &&\n                        spaceNeeded !== Infinity &&\n                        slotSize !== Infinity &&\n                        range) {\n                        step = Math.ceil(range / tickInterval);\n                    }\n                    return correctFloat(step * tickInterval);\n                };\n                if (horiz) {\n                    autoRotation = !labelOptions.staggerLines &&\n                        !labelOptions.step &&\n                        ( // #3971\n                        defined(rotationOption) ?\n                            [rotationOption] :\n                            slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation);\n                    if (autoRotation) {\n                        // Loop over the given autoRotation options, and determine\n                        // which gives the best score. The best score is that with\n                        // the lowest number of steps and a rotation closest\n                        // to horizontal.\n                        autoRotation.forEach(function (rot) {\n                            var score;\n                            if (rot === rotationOption ||\n                                (rot && rot >= -90 && rot <= 90)) { // #3891\n                                step = getStep(Math.abs(labelMetrics.h / Math.sin(deg2rad * rot)));\n                                score = step + Math.abs(rot / 360);\n                                if (score < bestScore) {\n                                    bestScore = score;\n                                    rotation = rot;\n                                    newTickInterval = step;\n                                }\n                            }\n                        });\n                    }\n                }\n                else if (!labelOptions.step) { // #4411\n                    newTickInterval = getStep(labelMetrics.h);\n                }\n                this.autoRotation = autoRotation;\n                this.labelRotation = pick(rotation, rotationOption);\n                return newTickInterval;\n            };\n            /**\n             * Get the general slot width for labels/categories on this axis. This may\n             * change between the pre-render (from Axis.getOffset) and the final tick\n             * rendering and placement.\n             *\n             * @private\n             * @function Highcharts.Axis#getSlotWidth\n             *\n             * @param {Highcharts.Tick} [tick] Optionally, calculate the slot width\n             * basing on tick label. It is used in highcharts-3d module, where the slots\n             * has different widths depending on perspective angles.\n             *\n             * @return {number}\n             * The pixel width allocated to each axis label.\n             */\n            Axis.prototype.getSlotWidth = function (tick) {\n                var _a;\n                // #5086, #1580, #1931\n                var chart = this.chart,\n                    horiz = this.horiz,\n                    labelOptions = this.options.labels,\n                    slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n                    marginLeft = chart.margin[3];\n                // Used by grid axis\n                if (tick && isNumber(tick.slotWidth)) { // #13221, can be 0\n                    return tick.slotWidth;\n                }\n                if (horiz &&\n                    labelOptions &&\n                    (labelOptions.step || 0) < 2) {\n                    if (labelOptions.rotation) { // #4415\n                        return 0;\n                    }\n                    return ((this.staggerLines || 1) * this.len) / slotCount;\n                }\n                if (!horiz) {\n                    // #7028\n                    var cssWidth = (_a = labelOptions === null || labelOptions === void 0 ? void 0 : labelOptions.style) === null || _a === void 0 ? void 0 : _a.width;\n                    if (cssWidth !== void 0) {\n                        return parseInt(cssWidth, 10);\n                    }\n                    if (marginLeft) {\n                        return marginLeft - chart.spacing[3];\n                    }\n                }\n                // Last resort, a fraction of the available size\n                return chart.chartWidth * 0.33;\n            };\n            /**\n             * Render the axis labels and determine whether ellipsis or rotation need to\n             * be applied.\n             *\n             * @private\n             * @function Highcharts.Axis#renderUnsquish\n             */\n            Axis.prototype.renderUnsquish = function () {\n                var chart = this.chart,\n                    renderer = chart.renderer,\n                    tickPositions = this.tickPositions,\n                    ticks = this.ticks,\n                    labelOptions = this.options.labels,\n                    labelStyleOptions = (labelOptions && labelOptions.style || {}),\n                    horiz = this.horiz,\n                    slotWidth = this.getSlotWidth(),\n                    innerWidth = Math.max(1,\n                    Math.round(slotWidth - 2 * (labelOptions.padding || 5))),\n                    attr = {},\n                    labelMetrics = this.labelMetrics(),\n                    textOverflowOption = (labelOptions.style &&\n                        labelOptions.style.textOverflow),\n                    commonWidth,\n                    commonTextOverflow,\n                    maxLabelLength = 0,\n                    label,\n                    i,\n                    pos;\n                // Set rotation option unless it is \"auto\", like in gauges\n                if (!isString(labelOptions.rotation)) {\n                    // #4443:\n                    attr.rotation = labelOptions.rotation || 0;\n                }\n                // Get the longest label length\n                tickPositions.forEach(function (tick) {\n                    tick = ticks[tick];\n                    // Replace label - sorting animation\n                    if (tick.movedLabel) {\n                        tick.replaceMovedLabel();\n                    }\n                    if (tick &&\n                        tick.label &&\n                        tick.label.textPxLength > maxLabelLength) {\n                        maxLabelLength = tick.label.textPxLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n                // Handle auto rotation on horizontal axis\n                if (this.autoRotation) {\n                    // Apply rotation only if the label is too wide for the slot, and\n                    // the label is wider than its height.\n                    if (maxLabelLength > innerWidth &&\n                        maxLabelLength > labelMetrics.h) {\n                        attr.rotation = this.labelRotation;\n                    }\n                    else {\n                        this.labelRotation = 0;\n                    }\n                    // Handle word-wrap or ellipsis on vertical axis\n                }\n                else if (slotWidth) {\n                    // For word-wrap or ellipsis\n                    commonWidth = innerWidth;\n                    if (!textOverflowOption) {\n                        commonTextOverflow = 'clip';\n                        // On vertical axis, only allow word wrap if there is room\n                        // for more lines.\n                        i = tickPositions.length;\n                        while (!horiz && i--) {\n                            pos = tickPositions[i];\n                            label = ticks[pos].label;\n                            if (label) {\n                                // Reset ellipsis in order to get the correct\n                                // bounding box (#4070)\n                                if (label.styles &&\n                                    label.styles.textOverflow === 'ellipsis') {\n                                    label.css({ textOverflow: 'clip' });\n                                    // Set the correct width in order to read\n                                    // the bounding box height (#4678, #5034)\n                                }\n                                else if (label.textPxLength > slotWidth) {\n                                    label.css({ width: slotWidth + 'px' });\n                                }\n                                if (label.getBBox().height > (this.len / tickPositions.length -\n                                    (labelMetrics.h - labelMetrics.f))) {\n                                    label.specificTextOverflow = 'ellipsis';\n                                }\n                            }\n                        }\n                    }\n                }\n                // Add ellipsis if the label length is significantly longer than ideal\n                if (attr.rotation) {\n                    commonWidth = (maxLabelLength > chart.chartHeight * 0.5 ?\n                        chart.chartHeight * 0.33 :\n                        maxLabelLength);\n                    if (!textOverflowOption) {\n                        commonTextOverflow = 'ellipsis';\n                    }\n                }\n                // Set the explicit or automatic label alignment\n                this.labelAlign = labelOptions.align ||\n                    this.autoLabelAlign(this.labelRotation);\n                if (this.labelAlign) {\n                    attr.align = this.labelAlign;\n                }\n                // Apply general and specific CSS\n                tickPositions.forEach(function (pos) {\n                    var tick = ticks[pos],\n                        label = tick && tick.label,\n                        widthOption = labelStyleOptions.width,\n                        css = {};\n                    if (label) {\n                        // This needs to go before the CSS in old IE (#4502)\n                        label.attr(attr);\n                        if (tick.shortenLabel) {\n                            tick.shortenLabel();\n                        }\n                        else if (commonWidth &&\n                            !widthOption &&\n                            // Setting width in this case messes with the bounding box\n                            // (#7975)\n                            labelStyleOptions.whiteSpace !== 'nowrap' &&\n                            (\n                            // Speed optimizing, #7656\n                            commonWidth < label.textPxLength ||\n                                // Resetting CSS, #4928\n                                label.element.tagName === 'SPAN')) {\n                            css.width = commonWidth + 'px';\n                            if (!textOverflowOption) {\n                                css.textOverflow = (label.specificTextOverflow ||\n                                    commonTextOverflow);\n                            }\n                            label.css(css);\n                            // Reset previously shortened label (#8210)\n                        }\n                        else if (label.styles &&\n                            label.styles.width &&\n                            !css.width &&\n                            !widthOption) {\n                            label.css({ width: null });\n                        }\n                        delete label.specificTextOverflow;\n                        tick.rotation = attr.rotation;\n                    }\n                }, this);\n                // Note: Why is this not part of getLabelPosition?\n                this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n            };\n            /**\n             * Return true if the axis has associated data.\n             *\n             * @function Highcharts.Axis#hasData\n             *\n             * @return {boolean}\n             * True if the axis has associated visible series and those series have\n             * either valid data points or explicit `min` and `max` settings.\n             */\n            Axis.prototype.hasData = function () {\n                return this.series.some(function (s) {\n                    return s.hasData();\n                }) ||\n                    (this.options.showEmpty &&\n                        defined(this.min) &&\n                        defined(this.max));\n            };\n            /**\n             * Adds the title defined in axis.options.title.\n             *\n             * @function Highcharts.Axis#addTitle\n             *\n             * @param {boolean} [display]\n             * Whether or not to display the title.\n             */\n            Axis.prototype.addTitle = function (display) {\n                var axis = this,\n                    renderer = axis.chart.renderer,\n                    horiz = axis.horiz,\n                    opposite = axis.opposite,\n                    options = axis.options,\n                    axisTitleOptions = options.title,\n                    textAlign,\n                    styledMode = axis.chart.styledMode;\n                if (!axis.axisTitle) {\n                    textAlign = axisTitleOptions.textAlign;\n                    if (!textAlign) {\n                        textAlign = (horiz ? {\n                            low: 'left',\n                            middle: 'center',\n                            high: 'right'\n                        } : {\n                            low: opposite ? 'right' : 'left',\n                            middle: 'center',\n                            high: opposite ? 'left' : 'right'\n                        })[axisTitleOptions.align];\n                    }\n                    axis.axisTitle = renderer\n                        .text(axisTitleOptions.text, 0, 0, axisTitleOptions.useHTML)\n                        .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                        .addClass('highcharts-axis-title');\n                    // #7814, don't mutate style option\n                    if (!styledMode) {\n                        axis.axisTitle.css(merge(axisTitleOptions.style));\n                    }\n                    axis.axisTitle.add(axis.axisGroup);\n                    axis.axisTitle.isNew = true;\n                }\n                // Max width defaults to the length of the axis\n                if (!styledMode &&\n                    !axisTitleOptions.style.width &&\n                    !axis.isRadial) {\n                    axis.axisTitle.css({\n                        width: axis.len + 'px'\n                    });\n                }\n                // hide or show the title depending on whether showEmpty is set\n                axis.axisTitle[display ? 'show' : 'hide'](display);\n            };\n            /**\n             * Generates a tick for initial positioning.\n             *\n             * @private\n             * @function Highcharts.Axis#generateTick\n             *\n             * @param {number} pos\n             * The tick position in axis values.\n             *\n             * @param {number} [i]\n             * The index of the tick in {@link Axis.tickPositions}.\n             */\n            Axis.prototype.generateTick = function (pos) {\n                var axis = this;\n                var ticks = axis.ticks;\n                if (!ticks[pos]) {\n                    ticks[pos] = new Tick(axis, pos);\n                }\n                else {\n                    ticks[pos].addLabel(); // update labels depending on tick interval\n                }\n            };\n            /**\n             * Render the tick labels to a preliminary position to get their sizes\n             *\n             * @private\n             * @function Highcharts.Axis#getOffset\n             *\n             * @fires Highcharts.Axis#event:afterGetOffset\n             */\n            Axis.prototype.getOffset = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    ticks = axis.ticks,\n                    horiz = axis.horiz,\n                    side = axis.side,\n                    invertedSide = chart.inverted &&\n                        !axis.isZAxis ? [1, 0, 3, 2][side] : side,\n                    hasData,\n                    showAxis,\n                    titleOffset = 0,\n                    titleOffsetOption,\n                    titleMargin = 0,\n                    axisTitleOptions = options.title,\n                    labelOptions = options.labels,\n                    labelOffset = 0, // reset\n                    labelOffsetPadded,\n                    axisOffset = chart.axisOffset,\n                    clipOffset = chart.clipOffset,\n                    clip,\n                    directionFactor = [-1, 1, 1, -1][side],\n                    className = options.className,\n                    axisParent = axis.axisParent, // Used in color axis\n                    lineHeightCorrection;\n                // For reuse in Axis.render\n                hasData = axis.hasData();\n                axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n                // Set/reset staggerLines\n                axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n                // Create the axisGroup and gridGroup elements on first iteration\n                if (!axis.axisGroup) {\n                    axis.gridGroup = renderer.g('grid')\n                        .attr({ zIndex: options.gridZIndex || 1 })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + '-grid ' +\n                        (className || ''))\n                        .add(axisParent);\n                    axis.axisGroup = renderer.g('axis')\n                        .attr({ zIndex: options.zIndex || 2 })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + ' ' +\n                        (className || ''))\n                        .add(axisParent);\n                    axis.labelGroup = renderer.g('axis-labels')\n                        .attr({ zIndex: labelOptions.zIndex || 7 })\n                        .addClass('highcharts-' + axis.coll.toLowerCase() + '-labels ' +\n                        (className || ''))\n                        .add(axisParent);\n                }\n                if (hasData || axis.isLinked) {\n                    // Generate ticks\n                    tickPositions.forEach(function (pos, i) {\n                        // i is not used here, but may be used in overrides\n                        axis.generateTick(pos, i);\n                    });\n                    axis.renderUnsquish();\n                    // Left side must be align: right and right side must\n                    // have align: left for labels\n                    axis.reserveSpaceDefault = (side === 0 ||\n                        side === 2 ||\n                        { 1: 'left', 3: 'right' }[side] === axis.labelAlign);\n                    if (pick(labelOptions.reserveSpace, axis.labelAlign === 'center' ? true : null, axis.reserveSpaceDefault)) {\n                        tickPositions.forEach(function (pos) {\n                            // get the highest offset\n                            labelOffset = Math.max(ticks[pos].getLabelSize(), labelOffset);\n                        });\n                    }\n                    if (axis.staggerLines) {\n                        labelOffset *= axis.staggerLines;\n                    }\n                    axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n                }\n                else { // doesn't have data\n                    objectEach(ticks, function (tick, n) {\n                        tick.destroy();\n                        delete ticks[n];\n                    });\n                }\n                if (axisTitleOptions &&\n                    axisTitleOptions.text &&\n                    axisTitleOptions.enabled !== false) {\n                    axis.addTitle(showAxis);\n                    if (showAxis && axisTitleOptions.reserveSpace !== false) {\n                        axis.titleOffset = titleOffset =\n                            axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n                        titleOffsetOption = axisTitleOptions.offset;\n                        titleMargin = defined(titleOffsetOption) ?\n                            0 :\n                            pick(axisTitleOptions.margin, horiz ? 5 : 10);\n                    }\n                }\n                // Render the axis line\n                axis.renderLine();\n                // handle automatic or user set offset\n                axis.offset = directionFactor * pick(options.offset, axisOffset[side] ? axisOffset[side] + (options.margin || 0) : 0);\n                axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // polar\n                if (side === 0) {\n                    lineHeightCorrection = -axis.labelMetrics().h;\n                }\n                else if (side === 2) {\n                    lineHeightCorrection = axis.tickRotCorr.y;\n                }\n                else {\n                    lineHeightCorrection = 0;\n                }\n                // Find the padded label offset\n                labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n                if (labelOffset) {\n                    labelOffsetPadded -= lineHeightCorrection;\n                    labelOffsetPadded += directionFactor * (horiz ?\n                        pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) :\n                        labelOptions.x);\n                }\n                axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n                if (axis.getMaxLabelDimensions) {\n                    axis.maxLabelDimensions = axis.getMaxLabelDimensions(ticks, tickPositions);\n                }\n                // Due to GridAxis.tickSize, tickSize should be calculated after ticks\n                // has rendered.\n                var tickSize = this.tickSize('tick');\n                axisOffset[side] = Math.max(axisOffset[side], axis.axisTitleMargin + titleOffset +\n                    directionFactor * axis.offset, labelOffsetPadded, // #3027\n                tickPositions && tickPositions.length && tickSize ?\n                    tickSize[0] + directionFactor * axis.offset :\n                    0 // #4866\n                );\n                // Decide the clipping needed to keep the graph inside\n                // the plot area and axis lines\n                clip = options.offset ?\n                    0 :\n                    // #4308, #4371:\n                    Math.floor(axis.axisLine.strokeWidth() / 2) * 2;\n                clipOffset[invertedSide] =\n                    Math.max(clipOffset[invertedSide], clip);\n                fireEvent(this, 'afterGetOffset');\n            };\n            /**\n             * Internal function to get the path for the axis line. Extended for polar\n             * charts.\n             *\n             * @function Highcharts.Axis#getLinePath\n             *\n             * @param {number} lineWidth\n             * The line width in pixels.\n             *\n             * @return {Highcharts.SVGPathArray}\n             * The SVG path definition in array form.\n             */\n            Axis.prototype.getLinePath = function (lineWidth) {\n                var chart = this.chart,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    horiz = this.horiz,\n                    lineLeft = this.left + (opposite ? this.width : 0) + offset,\n                    lineTop = chart.chartHeight - this.bottom -\n                        (opposite ? this.height : 0) + offset;\n                if (opposite) {\n                    lineWidth *= -1; // crispify the other way - #1480, #1687\n                }\n                return chart.renderer\n                    .crispLine([\n                    [\n                        'M',\n                        horiz ?\n                            this.left :\n                            lineLeft,\n                        horiz ?\n                            lineTop :\n                            this.top\n                    ],\n                    [\n                        'L',\n                        horiz ?\n                            chart.chartWidth - this.right :\n                            lineLeft,\n                        horiz ?\n                            lineTop :\n                            chart.chartHeight - this.bottom\n                    ]\n                ], lineWidth);\n            };\n            /**\n             * Render the axis line. Called internally when rendering and redrawing the\n             * axis.\n             *\n             * @function Highcharts.Axis#renderLine\n             */\n            Axis.prototype.renderLine = function () {\n                if (!this.axisLine) {\n                    this.axisLine = this.chart.renderer.path()\n                        .addClass('highcharts-axis-line')\n                        .add(this.axisGroup);\n                    if (!this.chart.styledMode) {\n                        this.axisLine.attr({\n                            stroke: this.options.lineColor,\n                            'stroke-width': this.options.lineWidth,\n                            zIndex: 7\n                        });\n                    }\n                }\n            };\n            /**\n             * Position the axis title.\n             *\n             * @private\n             * @function Highcharts.Axis#getTitlePosition\n             *\n             * @return {Highcharts.PositionObject}\n             * X and Y positions for the title.\n             */\n            Axis.prototype.getTitlePosition = function () {\n                // compute anchor points for each of the title align options\n                var horiz = this.horiz,\n                    axisLeft = this.left,\n                    axisTop = this.top,\n                    axisLength = this.len,\n                    axisTitleOptions = this.options.title,\n                    margin = horiz ? axisLeft : axisTop,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    xOption = axisTitleOptions.x || 0,\n                    yOption = axisTitleOptions.y || 0,\n                    axisTitle = this.axisTitle,\n                    fontMetrics = this.chart.renderer.fontMetrics(axisTitleOptions.style &&\n                        axisTitleOptions.style.fontSize,\n                    axisTitle), \n                    // The part of a multiline text that is below the baseline of the\n                    // first line. Subtract 1 to preserve pixel-perfectness from the\n                    // old behaviour (v5.0.12), where only one line was allowed.\n                    textHeightOvershoot = Math.max(axisTitle.getBBox(null, 0).height - fontMetrics.h - 1, 0), \n                    // the position in the length direction of the axis\n                    alongAxis = {\n                        low: margin + (horiz ? 0 : axisLength),\n                        middle: margin + axisLength / 2,\n                        high: margin + (horiz ? axisLength : 0)\n                    }[axisTitleOptions.align], \n                    // the position in the perpendicular direction of the axis\n                    offAxis = (horiz ? axisTop + this.height : axisLeft) +\n                        (horiz ? 1 : -1) * // horizontal axis reverses the margin\n                            (opposite ? -1 : 1) * // so does opposite axes\n                            this.axisTitleMargin +\n                        [\n                            -textHeightOvershoot,\n                            textHeightOvershoot,\n                            fontMetrics.f,\n                            -textHeightOvershoot // left\n                        ][this.side],\n                    titlePosition = {\n                        x: horiz ?\n                            alongAxis + xOption :\n                            offAxis + (opposite ? this.width : 0) + offset + xOption,\n                        y: horiz ?\n                            offAxis + yOption - (opposite ? this.height : 0) + offset :\n                            alongAxis + yOption\n                    };\n                fireEvent(this, 'afterGetTitlePosition', { titlePosition: titlePosition });\n                return titlePosition;\n            };\n            /**\n             * Render a minor tick into the given position. If a minor tick already\n             * exists in this position, move it.\n             *\n             * @function Highcharts.Axis#renderMinorTick\n             *\n             * @param {number} pos\n             * The position in axis values.\n             */\n            Axis.prototype.renderMinorTick = function (pos) {\n                var axis = this;\n                var slideInTicks = axis.chart.hasRendered && isNumber(axis.oldMin);\n                var minorTicks = axis.minorTicks;\n                if (!minorTicks[pos]) {\n                    minorTicks[pos] = new Tick(axis, pos, 'minor');\n                }\n                // Render new ticks in old position\n                if (slideInTicks && minorTicks[pos].isNew) {\n                    minorTicks[pos].render(null, true);\n                }\n                minorTicks[pos].render(null, false, 1);\n            };\n            /**\n             * Render a major tick into the given position. If a tick already exists\n             * in this position, move it.\n             *\n             * @function Highcharts.Axis#renderTick\n             *\n             * @param {number} pos\n             * The position in axis values.\n             *\n             * @param {number} i\n             * The tick index.\n             */\n            Axis.prototype.renderTick = function (pos, i) {\n                var axis = this;\n                var isLinked = axis.isLinked;\n                var ticks = axis.ticks;\n                var slideInTicks = axis.chart.hasRendered && isNumber(axis.oldMin);\n                // Linked axes need an extra check to find out if\n                if (!isLinked ||\n                    (pos >= axis.min && pos <= axis.max)) {\n                    if (!ticks[pos]) {\n                        ticks[pos] = new Tick(axis, pos);\n                    }\n                    // NOTE this seems like overkill. Could be handled in tick.render by\n                    // setting old position in attr, then set new position in animate.\n                    // render new ticks in old position\n                    if (slideInTicks && ticks[pos].isNew) {\n                        // Start with negative opacity so that it is visible from\n                        // halfway into the animation\n                        ticks[pos].render(i, true, -1);\n                    }\n                    ticks[pos].render(i);\n                }\n            };\n            /**\n             * Render the axis.\n             *\n             * @private\n             * @function Highcharts.Axis#render\n             *\n             * @fires Highcharts.Axis#event:afterRender\n             */\n            Axis.prototype.render = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    log = axis.logarithmic,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    isLinked = axis.isLinked,\n                    tickPositions = axis.tickPositions,\n                    axisTitle = axis.axisTitle,\n                    ticks = axis.ticks,\n                    minorTicks = axis.minorTicks,\n                    alternateBands = axis.alternateBands,\n                    stackLabelOptions = options.stackLabels,\n                    alternateGridColor = options.alternateGridColor,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    axisLine = axis.axisLine,\n                    showAxis = axis.showAxis,\n                    animation = animObject(renderer.globalAnimation),\n                    from,\n                    to;\n                // Reset\n                axis.labelEdge.length = 0;\n                axis.overlap = false;\n                // Mark all elements inActive before we go over and mark the active ones\n                [ticks, minorTicks, alternateBands].forEach(function (coll) {\n                    objectEach(coll, function (tick) {\n                        tick.isActive = false;\n                    });\n                });\n                // If the series has data draw the ticks. Else only the line and title\n                if (axis.hasData() || isLinked) {\n                    // minor ticks\n                    if (axis.minorTickInterval && !axis.categories) {\n                        axis.getMinorTickPositions().forEach(function (pos) {\n                            axis.renderMinorTick(pos);\n                        });\n                    }\n                    // Major ticks. Pull out the first item and render it last so that\n                    // we can get the position of the neighbour label. #808.\n                    if (tickPositions.length) { // #1300\n                        tickPositions.forEach(function (pos, i) {\n                            axis.renderTick(pos, i);\n                        });\n                        // In a categorized axis, the tick marks are displayed\n                        // between labels. So we need to add a tick mark and\n                        // grid line at the left edge of the X axis.\n                        if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n                            if (!ticks[-1]) {\n                                ticks[-1] = new Tick(axis, -1, null, true);\n                            }\n                            ticks[-1].render(-1);\n                        }\n                    }\n                    // alternate grid color\n                    if (alternateGridColor) {\n                        tickPositions.forEach(function (pos, i) {\n                            to = typeof tickPositions[i + 1] !== 'undefined' ?\n                                tickPositions[i + 1] + tickmarkOffset :\n                                axis.max - tickmarkOffset;\n                            if (i % 2 === 0 &&\n                                pos < axis.max &&\n                                to <= axis.max + (chart.polar ?\n                                    -tickmarkOffset :\n                                    tickmarkOffset)) { // #2248, #4660\n                                if (!alternateBands[pos]) {\n                                    // Should be imported from PlotLineOrBand.js, but\n                                    // the dependency cycle with axis is a problem\n                                    alternateBands[pos] = new H.PlotLineOrBand(axis);\n                                }\n                                from = pos + tickmarkOffset; // #949\n                                alternateBands[pos].options = {\n                                    from: log ? log.lin2log(from) : from,\n                                    to: log ? log.lin2log(to) : to,\n                                    color: alternateGridColor,\n                                    className: 'highcharts-alternate-grid'\n                                };\n                                alternateBands[pos].render();\n                                alternateBands[pos].isActive = true;\n                            }\n                        });\n                    }\n                    // custom plot lines and bands\n                    if (!axis._addedPlotLB) { // only first time\n                        (options.plotLines || [])\n                            .concat(options.plotBands || [])\n                            .forEach(function (plotLineOptions) {\n                            axis.addPlotBandOrLine(plotLineOptions);\n                        });\n                        axis._addedPlotLB = true;\n                    }\n                } // end if hasData\n                // Remove inactive ticks\n                [ticks, minorTicks, alternateBands].forEach(function (coll) {\n                    var i,\n                        forDestruction = [],\n                        delay = animation.duration,\n                        destroyInactiveItems = function () {\n                            i = forDestruction.length;\n                        while (i--) {\n                            // When resizing rapidly, the same items\n                            // may be destroyed in different timeouts,\n                            // or the may be reactivated\n                            if (coll[forDestruction[i]] &&\n                                !coll[forDestruction[i]].isActive) {\n                                coll[forDestruction[i]].destroy();\n                                delete coll[forDestruction[i]];\n                            }\n                        }\n                    };\n                    objectEach(coll, function (tick, pos) {\n                        if (!tick.isActive) {\n                            // Render to zero opacity\n                            tick.render(pos, false, 0);\n                            tick.isActive = false;\n                            forDestruction.push(pos);\n                        }\n                    });\n                    // When the objects are finished fading out, destroy them\n                    syncTimeout(destroyInactiveItems, coll === alternateBands ||\n                        !chart.hasRendered ||\n                        !delay ?\n                        0 :\n                        delay);\n                });\n                // Set the axis line path\n                if (axisLine) {\n                    axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n                        d: this.getLinePath(axisLine.strokeWidth())\n                    });\n                    axisLine.isPlaced = true;\n                    // Show or hide the line depending on options.showEmpty\n                    axisLine[showAxis ? 'show' : 'hide'](showAxis);\n                }\n                if (axisTitle && showAxis) {\n                    var titleXy = axis.getTitlePosition();\n                    if (isNumber(titleXy.y)) {\n                        axisTitle[axisTitle.isNew ? 'attr' : 'animate'](titleXy);\n                        axisTitle.isNew = false;\n                    }\n                    else {\n                        axisTitle.attr('y', -9999);\n                        axisTitle.isNew = true;\n                    }\n                }\n                // Stacked totals:\n                if (stackLabelOptions && stackLabelOptions.enabled && axis.stacking) {\n                    axis.stacking.renderStackTotals();\n                }\n                // End stacked totals\n                axis.isDirty = false;\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Redraw the axis to reflect changes in the data or axis extremes. Called\n             * internally from Highcharts.Chart#redraw.\n             *\n             * @private\n             * @function Highcharts.Axis#redraw\n             */\n            Axis.prototype.redraw = function () {\n                if (this.visible) {\n                    // render the axis\n                    this.render();\n                    // move plot lines and bands\n                    this.plotLinesAndBands.forEach(function (plotLine) {\n                        plotLine.render();\n                    });\n                }\n                // mark associated series as dirty and ready for redraw\n                this.series.forEach(function (series) {\n                    series.isDirty = true;\n                });\n            };\n            /**\n             * Returns an array of axis properties, that should be untouched during\n             * reinitialization.\n             *\n             * @private\n             * @function Highcharts.Axis#getKeepProps\n             *\n             * @return {Array<string>}\n             */\n            Axis.prototype.getKeepProps = function () {\n                return (this.keepProps || Axis.keepProps);\n            };\n            /**\n             * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n             * to fully remove the axis.\n             *\n             * @private\n             * @function Highcharts.Axis#destroy\n             *\n             * @param {boolean} [keepEvents]\n             * Whether to preserve events, used internally in Axis.update.\n             */\n            Axis.prototype.destroy = function (keepEvents) {\n                var axis = this,\n                    plotLinesAndBands = axis.plotLinesAndBands,\n                    plotGroup,\n                    i;\n                fireEvent(this, 'destroy', { keepEvents: keepEvents });\n                // Remove the events\n                if (!keepEvents) {\n                    removeEvent(axis);\n                }\n                // Destroy collections\n                [axis.ticks, axis.minorTicks, axis.alternateBands].forEach(function (coll) {\n                    destroyObjectProperties(coll);\n                });\n                if (plotLinesAndBands) {\n                    i = plotLinesAndBands.length;\n                    while (i--) { // #1975\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                // Destroy elements\n                ['axisLine', 'axisTitle', 'axisGroup',\n                    'gridGroup', 'labelGroup', 'cross', 'scrollbar'].forEach(function (prop) {\n                    if (axis[prop]) {\n                        axis[prop] = axis[prop].destroy();\n                    }\n                });\n                // Destroy each generated group for plotlines and plotbands\n                for (plotGroup in axis.plotLinesAndBandsGroups) { // eslint-disable-line guard-for-in\n                    axis.plotLinesAndBandsGroups[plotGroup] =\n                        axis.plotLinesAndBandsGroups[plotGroup].destroy();\n                }\n                // Delete all properties and fall back to the prototype.\n                objectEach(axis, function (val, key) {\n                    if (axis.getKeepProps().indexOf(key) === -1) {\n                        delete axis[key];\n                    }\n                });\n            };\n            /**\n             * Internal function to draw a crosshair.\n             *\n             * @function Highcharts.Axis#drawCrosshair\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             * The event arguments from the modified pointer event, extended with\n             * `chartX` and `chartY`\n             *\n             * @param {Highcharts.Point} [point]\n             * The Point object if the crosshair snaps to points.\n             *\n             * @fires Highcharts.Axis#event:afterDrawCrosshair\n             * @fires Highcharts.Axis#event:drawCrosshair\n             */\n            Axis.prototype.drawCrosshair = function (e, point) {\n                var path,\n                    options = this.crosshair,\n                    snap = pick(options.snap,\n                    true),\n                    pos,\n                    categorized,\n                    graphic = this.cross,\n                    crossOptions,\n                    chart = this.chart;\n                fireEvent(this, 'drawCrosshair', { e: e, point: point });\n                // Use last available event when updating non-snapped crosshairs without\n                // mouse interaction (#5287)\n                if (!e) {\n                    e = this.cross && this.cross.e;\n                }\n                if (\n                // Disabled in options\n                !this.crosshair ||\n                    // Snap\n                    ((defined(point) || !snap) === false)) {\n                    this.hideCrosshair();\n                }\n                else {\n                    // Get the path\n                    if (!snap) {\n                        pos = e &&\n                            (this.horiz ?\n                                e.chartX - this.pos :\n                                this.len - e.chartY + this.pos);\n                    }\n                    else if (defined(point)) {\n                        // #3834\n                        pos = pick(this.coll !== 'colorAxis' ?\n                            point.crosshairPos : // 3D axis extension\n                            null, this.isXAxis ?\n                            point.plotX :\n                            this.len - point.plotY);\n                    }\n                    if (defined(pos)) {\n                        crossOptions = {\n                            // value, only used on radial\n                            value: point && (this.isXAxis ?\n                                point.x :\n                                pick(point.stackY, point.y)),\n                            translatedValue: pos\n                        };\n                        if (chart.polar) {\n                            // Additional information required for crosshairs in\n                            // polar chart\n                            extend(crossOptions, {\n                                isCrosshair: true,\n                                chartX: e && e.chartX,\n                                chartY: e && e.chartY,\n                                point: point\n                            });\n                        }\n                        path = this.getPlotLinePath(crossOptions) ||\n                            null; // #3189\n                    }\n                    if (!defined(path)) {\n                        this.hideCrosshair();\n                        return;\n                    }\n                    categorized = this.categories && !this.isRadial;\n                    // Draw the cross\n                    if (!graphic) {\n                        this.cross = graphic = chart.renderer\n                            .path()\n                            .addClass('highcharts-crosshair highcharts-crosshair-' +\n                            (categorized ? 'category ' : 'thin ') +\n                            options.className)\n                            .attr({\n                            zIndex: pick(options.zIndex, 2)\n                        })\n                            .add();\n                        // Presentational attributes\n                        if (!chart.styledMode) {\n                            graphic.attr({\n                                stroke: options.color ||\n                                    (categorized ?\n                                        Color\n                                            .parse('#ccd6eb')\n                                            .setOpacity(0.25)\n                                            .get() :\n                                        '#cccccc'),\n                                'stroke-width': pick(options.width, 1)\n                            }).css({\n                                'pointer-events': 'none'\n                            });\n                            if (options.dashStyle) {\n                                graphic.attr({\n                                    dashstyle: options.dashStyle\n                                });\n                            }\n                        }\n                    }\n                    graphic.show().attr({\n                        d: path\n                    });\n                    if (categorized && !options.width) {\n                        graphic.attr({\n                            'stroke-width': this.transA\n                        });\n                    }\n                    this.cross.e = e;\n                }\n                fireEvent(this, 'afterDrawCrosshair', { e: e, point: point });\n            };\n            /**\n             * Hide the crosshair if visible.\n             *\n             * @function Highcharts.Axis#hideCrosshair\n             */\n            Axis.prototype.hideCrosshair = function () {\n                if (this.cross) {\n                    this.cross.hide();\n                }\n                fireEvent(this, 'afterHideCrosshair');\n            };\n            /**\n            * Check whether the chart has vertical panning ('y' or 'xy' type).\n            *\n            * @private\n            * @function Highcharts.Axis#hasVerticalPanning\n            * @return {boolean}\n            *\n            */\n            Axis.prototype.hasVerticalPanning = function () {\n                var _a,\n                    _b;\n                return /y/.test(((_b = (_a = this.chart.options.chart) === null || _a === void 0 ? void 0 : _a.panning) === null || _b === void 0 ? void 0 : _b.type) || '');\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            /**\n             * The X axis or category axis. Normally this is the horizontal axis,\n             * though if the chart is inverted this is the vertical axis. In case of\n             * multiple axes, the xAxis node is an array of configuration objects.\n             *\n             * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @productdesc {highmaps}\n             * In Highmaps, the axis is hidden, but it is used behind the scenes to\n             * control features like zooming and panning. Zooming is in effect the same\n             * as setting the extremes of one of the exes.\n             *\n             * @type         {*|Array<*>}\n             * @optionparent xAxis\n             *\n             * @private\n             */\n            Axis.defaultOptions = {\n                /**\n                 * When using multiple axis, the ticks of two or more opposite axes\n                 * will automatically be aligned by adding ticks to the axis or axes\n                 * with the least ticks, as if `tickAmount` were specified.\n                 *\n                 * This can be prevented by setting `alignTicks` to false. If the grid\n                 * lines look messy, it's a good idea to hide them for the secondary\n                 * axis by setting `gridLineWidth` to 0.\n                 *\n                 * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n                 * then the `alignTicks ` will be disabled for the Axis.\n                 *\n                 * Disabled for logarithmic axes.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.alignTicks\n                 */\n                /**\n                 * Whether to allow decimals in this axis' ticks. When counting\n                 * integers, like persons or hits on a web page, decimals should\n                 * be avoided in the labels.\n                 *\n                 * @see [minTickInterval](#xAxis.minTickInterval)\n                 *\n                 * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-true/\n                 *         True by default\n                 * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.0\n                 * @apioption xAxis.allowDecimals\n                 */\n                /**\n                 * When using an alternate grid color, a band is painted across the\n                 * plot area between every other grid line.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/alternategridcolor/\n                 *         Alternate grid color on the Y axis\n                 * @sample {highstock} stock/xaxis/alternategridcolor/\n                 *         Alternate grid color on the Y axis\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @apioption xAxis.alternateGridColor\n                 */\n                /**\n                 * An array defining breaks in the axis, the sections defined will be\n                 * left out and all the points shifted closer to each other.\n                 *\n                 * @productdesc {highcharts}\n                 * Requires that the broken-axis.js module is loaded.\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-simple/\n                 *         Simple break\n                 * @sample {highcharts|highstock} highcharts/axisbreak/break-visualized/\n                 *         Advanced with callback\n                 * @sample {highstock} stock/demo/intraday-breaks/\n                 *         Break on nights and weekends\n                 *\n                 * @type      {Array<*>}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks\n                 */\n                /**\n                 * A number indicating how much space should be left between the start\n                 * and the end of the break. The break size is given in axis units,\n                 * so for instance on a `datetime` axis, a break size of 3600000 would\n                 * indicate the equivalent of an hour.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.breakSize\n                 */\n                /**\n                 * The point where the break starts.\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.from\n                 */\n                /**\n                 * Defines an interval after which the break appears again. By default\n                 * the breaks do not repeat.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.repeat\n                 */\n                /**\n                 * The point where the break ends.\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.to\n                 */\n                /**\n                 * If categories are present for the xAxis, names are used instead of\n                 * numbers for that axis.\n                 *\n                 * Since Highcharts 3.0, categories can also\n                 * be extracted by giving each point a [name](#series.data) and setting\n                 * axis [type](#xAxis.type) to `category`. However, if you have multiple\n                 * series, best practice remains defining the `categories` array.\n                 *\n                 * Example: `categories: ['Apples', 'Bananas', 'Oranges']`\n                 *\n                 * @sample {highcharts} highcharts/demo/line-labels/\n                 *         With\n                 * @sample {highcharts} highcharts/xaxis/categories/\n                 *         Without\n                 *\n                 * @type      {Array<string>}\n                 * @product   highcharts gantt\n                 * @apioption xAxis.categories\n                 */\n                /**\n                 * The highest allowed value for automatically computed axis extremes.\n                 *\n                 * @see [floor](#xAxis.floor)\n                 *\n                 * @sample {highcharts|highstock} highcharts/yaxis/floor-ceiling/\n                 *         Floor and ceiling\n                 *\n                 * @type       {number}\n                 * @since      4.0\n                 * @product    highcharts highstock gantt\n                 * @apioption  xAxis.ceiling\n                 */\n                /**\n                 * A class name that opens for styling the axis by CSS, especially in\n                 * Highcharts styled mode. The class name is applied to group elements\n                 * for the grid, axis elements and labels.\n                 *\n                 * @sample {highcharts|highstock|highmaps} highcharts/css/axis/\n                 *         Multiple axes with separate styling\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption xAxis.className\n                 */\n                /**\n                 * Configure a crosshair that follows either the mouse pointer or the\n                 * hovered point.\n                 *\n                 * In styled mode, the crosshairs are styled in the\n                 * `.highcharts-crosshair`, `.highcharts-crosshair-thin` or\n                 * `.highcharts-xaxis-category` classes.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, by default, the crosshair is enabled on the X axis and\n                 * disabled on the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/crosshair-both/\n                 *         Crosshair on both axes\n                 * @sample {highstock} stock/xaxis/crosshairs-xy/\n                 *         Crosshair on both axes\n                 * @sample {highmaps} highcharts/xaxis/crosshair-both/\n                 *         Crosshair on both axes\n                 *\n                 * @declare   Highcharts.AxisCrosshairOptions\n                 * @type      {boolean|*}\n                 * @default   false\n                 * @since     4.1\n                 * @apioption xAxis.crosshair\n                 */\n                /**\n                 * A class name for the crosshair, especially as a hook for styling.\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption xAxis.crosshair.className\n                 */\n                /**\n                 * The color of the crosshair. Defaults to `#cccccc` for numeric and\n                 * datetime axes, and `rgba(204,214,235,0.25)` for category axes, where\n                 * the crosshair by default highlights the whole category.\n                 *\n                 * @sample {highcharts|highstock|highmaps} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #cccccc\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.color\n                 */\n                /**\n                 * The dash style for the crosshair. See\n                 * [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n                 * for possible values.\n                 *\n                 * @sample {highcharts|highmaps} highcharts/xaxis/crosshair-dotted/\n                 *         Dotted crosshair\n                 * @sample {highstock} stock/xaxis/crosshair-dashed/\n                 *         Dashed X axis crosshair\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.dashStyle\n                 */\n                /**\n                 * A label on the axis next to the crosshair.\n                 *\n                 * In styled mode, the label is styled with the\n                 * `.highcharts-crosshair-label` class.\n                 *\n                 * @sample {highstock} stock/xaxis/crosshair-label/\n                 *         Crosshair labels\n                 * @sample {highstock} highcharts/css/crosshair-label/\n                 *         Style mode\n                 *\n                 * @declare   Highcharts.AxisCrosshairLabelOptions\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label\n                 */\n                /**\n                 * Alignment of the label compared to the axis. Defaults to `\"left\"` for\n                 * right-side axes, `\"right\"` for left-side axes and `\"center\"` for\n                 * horizontal axes.\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.align\n                 */\n                /**\n                 * The background color for the label. Defaults to the related series\n                 * color, or `#666666` if that is not available.\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.backgroundColor\n                 */\n                /**\n                 * The border color for the crosshair label\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderColor\n                 */\n                /**\n                 * The border corner radius of the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   3\n                 * @since     2.1.10\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderRadius\n                 */\n                /**\n                 * The border width for the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderWidth\n                 */\n                /**\n                 * Flag to enable crosshair's label.\n                 *\n                 * @sample {highstock} stock/xaxis/crosshairs-xy/\n                 *         Enabled label for yAxis' crosshair\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.enabled\n                 */\n                /**\n                 * A format string for the crosshair label. Defaults to `{value}` for\n                 * numeric axes and `{value:%b %d, %Y}` for datetime axes.\n                 *\n                 * @type      {string}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.format\n                 */\n                /**\n                 * Formatter function for the label text.\n                 *\n                 * @type      {Highcharts.XAxisCrosshairLabelFormatterCallbackFunction}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.formatter\n                 */\n                /**\n                 * Padding inside the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   8\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.padding\n                 */\n                /**\n                 * The shape to use for the label box.\n                 *\n                 * @type      {string}\n                 * @default   callout\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.shape\n                 */\n                /**\n                 * Text styles for the crosshair label.\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"white\", \"fontWeight\": \"normal\", \"fontSize\": \"11px\", \"textAlign\": \"center\"}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.style\n                 */\n                /**\n                 * Whether the crosshair should snap to the point or follow the pointer\n                 * independent of points.\n                 *\n                 * @sample {highcharts|highstock} highcharts/xaxis/crosshair-snap-false/\n                 *         True by default\n                 * @sample {highmaps} maps/demo/latlon-advanced/\n                 *         Snap is false\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.snap\n                 */\n                /**\n                 * The pixel width of the crosshair. Defaults to 1 for numeric or\n                 * datetime axes, and for one category width for category axes.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 * @sample {highstock} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 * @sample {highmaps} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.width\n                 */\n                /**\n                 * The Z index of the crosshair. Higher Z indices allow drawing the\n                 * crosshair on top of the series or behind the grid lines.\n                 *\n                 * @type      {number}\n                 * @default   2\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.zIndex\n                 */\n                /**\n                 * Whether to zoom axis. If `chart.zoomType` is set, the option allows\n                 * to disable zooming on an individual axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/zoomenabled/\n                 *         Zoom enabled is false\n                 *\n                 *\n                 * @type      {boolean}\n                 * @default   enabled\n                 * @apioption xAxis.zoomEnabled\n                 */\n                /**\n                 * For a datetime axis, the scale will automatically adjust to the\n                 * appropriate unit. This member gives the default string\n                 * representations used for each unit. For intermediate values,\n                 * different units may be used, for example the `day` unit can be used\n                 * on midnight and `hour` unit be used for intermediate values on the\n                 * same axis. For an overview of the replacement codes, see\n                 * [dateFormat](/class-reference/Highcharts#dateFormat).\n                 *\n                 * Defaults to:\n                 * ```js\n                 * {\n                 *     millisecond: '%H:%M:%S.%L',\n                 *     second: '%H:%M:%S',\n                 *     minute: '%H:%M',\n                 *     hour: '%H:%M',\n                 *     day: '%e. %b',\n                 *     week: '%e. %b',\n                 *     month: '%b \\'%y',\n                 *     year: '%Y'\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/xaxis/datetimelabelformats/\n                 *         Different day format on X axis\n                 * @sample {highstock} stock/xaxis/datetimelabelformats/\n                 *         More information in x axis labels\n                 *\n                 * @declare Highcharts.AxisDateTimeLabelFormatsOptions\n                 * @product highcharts highstock gantt\n                 */\n                dateTimeLabelFormats: {\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    millisecond: {\n                        main: '%H:%M:%S.%L',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    second: {\n                        main: '%H:%M:%S',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    minute: {\n                        main: '%H:%M',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    hour: {\n                        main: '%H:%M',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    day: {\n                        main: '%e. %b'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    week: {\n                        main: '%e. %b'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    month: {\n                        main: '%b \\'%y'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    year: {\n                        main: '%Y'\n                    }\n                },\n                /**\n                 * Whether to force the axis to end on a tick. Use this option with\n                 * the `maxPadding` option to control the axis end.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, `endOnTick` is always `false` when the navigator\n                 * is enabled, to prevent jumpy scrolling.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/yaxis/endontick/\n                 *         False\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False\n                 *\n                 * @since 1.2.0\n                 */\n                endOnTick: false,\n                /**\n                 * Event handlers for the axis.\n                 *\n                 * @type      {*}\n                 * @apioption xAxis.events\n                 */\n                /**\n                 * An event fired after the breaks have rendered.\n                 *\n                 * @see [breaks](#xAxis.breaks)\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-event/\n                 *         AfterBreak Event\n                 *\n                 * @type      {Highcharts.AxisEventCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts gantt\n                 * @apioption xAxis.events.afterBreaks\n                 */\n                /**\n                 * As opposed to the `setExtremes` event, this event fires after the\n                 * final min and max values are computed and corrected for `minRange`.\n                 *\n                 * Fires when the minimum and maximum is set for the axis, either by\n                 * calling the `.setExtremes()` method or by selecting an area in the\n                 * chart. One parameter, `event`, is passed to the function, containing\n                 * common event information.\n                 *\n                 * The new user set minimum and maximum values can be found by\n                 * `event.min` and `event.max`. These reflect the axis minimum and\n                 * maximum in axis values. The actual data extremes are found in\n                 * `event.dataMin` and `event.dataMax`.\n                 *\n                 * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n                 * @since     2.3\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.afterSetExtremes\n                 */\n                /**\n                 * An event fired when a break from this axis occurs on a point.\n                 *\n                 * @see [breaks](#xAxis.breaks)\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-visualized/\n                 *         Visualization of a Break\n                 *\n                 * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts gantt\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.pointBreak\n                 */\n                /**\n                 * An event fired when a point falls inside a break from this axis.\n                 *\n                 * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n                 * @product   highcharts highstock gantt\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.pointInBreak\n                 */\n                /**\n                 * Fires when the minimum and maximum is set for the axis, either by\n                 * calling the `.setExtremes()` method or by selecting an area in the\n                 * chart. One parameter, `event`, is passed to the function,\n                 * containing common event information.\n                 *\n                 * The new user set minimum and maximum values can be found by\n                 * `event.min` and `event.max`. These reflect the axis minimum and\n                 * maximum in data values. When an axis is zoomed all the way out from\n                 * the \"Reset zoom\" button, `event.min` and `event.max` are null, and\n                 * the new extremes are set based on `this.dataMin` and `this.dataMax`.\n                 *\n                 * @sample {highstock} stock/xaxis/events-setextremes/\n                 *         Log new extremes on x axis\n                 *\n                 * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.setExtremes\n                 */\n                /**\n                 * The lowest allowed value for automatically computed axis extremes.\n                 *\n                 * @see [ceiling](#yAxis.ceiling)\n                 *\n                 * @sample {highcharts} highcharts/yaxis/floor-ceiling/\n                 *         Floor and ceiling\n                 * @sample {highstock} stock/demo/lazy-loading/\n                 *         Prevent negative stock price on Y axis\n                 *\n                 * @type      {number}\n                 * @since     4.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.floor\n                 */\n                /**\n                 * The dash or dot style of the grid lines. For possible values, see\n                 * [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinedashstyle/\n                 *         Long dashes\n                 * @sample {highstock} stock/xaxis/gridlinedashstyle/\n                 *         Long dashes\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     1.2\n                 * @apioption xAxis.gridLineDashStyle\n                 */\n                /**\n                 * The Z index of the grid lines.\n                 *\n                 * @sample {highcharts|highstock} highcharts/xaxis/gridzindex/\n                 *         A Z index of 4 renders the grid above the graph\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.gridZIndex\n                 */\n                /**\n                 * An id for the axis. This can be used after render time to get\n                 * a pointer to the axis object through `chart.get()`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/id/\n                 *         Get the object\n                 * @sample {highstock} stock/xaxis/id/\n                 *         Get the object\n                 *\n                 * @type      {string}\n                 * @since     1.2.0\n                 * @apioption xAxis.id\n                 */\n                /**\n                 * The axis labels show the number or category for each tick.\n                 *\n                 * Since v8.0.0: Labels are animated in categorized x-axis with\n                 * updating data if `tickInterval` and `step` is set to 1.\n                 *\n                 * @productdesc {highmaps}\n                 * X and Y axis labels are by default disabled in Highmaps, but the\n                 * functionality is inherited from Highcharts and used on `colorAxis`,\n                 * and can be enabled on X and Y axes too.\n                 */\n                labels: {\n                    /**\n                     * What part of the string the given position is anchored to.\n                     * If `left`, the left side of the string is at the axis position.\n                     * Can be one of `\"left\"`, `\"center\"` or `\"right\"`. Defaults to\n                     * an intelligent guess based on which side of the chart the axis\n                     * is on and the rotation of the label.\n                     *\n                     * @see [reserveSpace](#xAxis.labels.reserveSpace)\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-align-left/\n                     *         Left\n                     * @sample {highcharts} highcharts/xaxis/labels-align-right/\n                     *         Right\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n                     *         Left-aligned labels on a vertical category axis\n                     *\n                     * @type       {Highcharts.AlignValue}\n                     * @apioption  xAxis.labels.align\n                     */\n                    /**\n                     * For horizontal axes, the allowed degrees of label rotation\n                     * to prevent overlapping labels. If there is enough space,\n                     * labels are not rotated. As the chart gets narrower, it\n                     * will start rotating the labels -45 degrees, then remove\n                     * every second label and try again with rotations 0 and -45 etc.\n                     * Set it to `false` to disable rotation, which will\n                     * cause the labels to word-wrap if possible.\n                     *\n                     * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-default/\n                     *         Default auto rotation of 0 or -45\n                     * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-0-90/\n                     *         Custom graded auto rotation\n                     *\n                     * @type      {Array<number>|false}\n                     * @default   [-45]\n                     * @since     4.1.0\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.labels.autoRotation\n                     */\n                    /**\n                     * When each category width is more than this many pixels, we don't\n                     * apply auto rotation. Instead, we lay out the axis label with word\n                     * wrap. A lower limit makes sense when the label contains multiple\n                     * short words that don't extend the available horizontal space for\n                     * each label.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-autorotationlimit/\n                     *         Lower limit\n                     *\n                     * @type      {number}\n                     * @default   80\n                     * @since     4.1.5\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.autoRotationLimit\n                     */\n                    /**\n                     * Polar charts only. The label's pixel distance from the perimeter\n                     * of the plot area.\n                     *\n                     * @type      {number}\n                     * @default   15\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.distance\n                     */\n                    /**\n                     * Enable or disable the axis labels.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-enabled/\n                     *         X axis labels disabled\n                     * @sample {highstock} stock/xaxis/labels-enabled/\n                     *         X axis labels disabled\n                     *\n                     * @default {highcharts|highstock|gantt} true\n                     * @default {highmaps} false\n                     */\n                    enabled: true,\n                    /**\n                     * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                     * for the axis label.\n                     *\n                     * @sample {highcharts|highstock} highcharts/yaxis/labels-format/\n                     *         Add units to Y axis label\n                     *\n                     * @type      {string}\n                     * @default   {value}\n                     * @since     3.0\n                     * @apioption xAxis.labels.format\n                     */\n                    /**\n                     * Callback JavaScript function to format the label. The value\n                     * is given by `this.value`. Additional properties for `this` are\n                     * `axis`, `chart`, `isFirst` and `isLast`. The value of the default\n                     * label formatter can be retrieved by calling\n                     * `this.axis.defaultLabelFormatter.call(this)` within the function.\n                     *\n                     * Defaults to:\n                     * ```js\n                     * function() {\n                     *     return this.value;\n                     * }\n                     * ```\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-formatter-linked/\n                     *         Linked category names\n                     * @sample {highcharts} highcharts/xaxis/labels-formatter-extended/\n                     *         Modified numeric labels\n                     * @sample {highstock} stock/xaxis/labels-formatter/\n                     *         Added units on Y axis\n                     *\n                     * @type      {Highcharts.AxisLabelsFormatterCallbackFunction}\n                     * @apioption xAxis.labels.formatter\n                     */\n                    /**\n                     * The number of pixels to indent the labels per level in a treegrid\n                     * axis.\n                     *\n                     * @sample gantt/treegrid-axis/demo\n                     *         Indentation 10px by default.\n                     * @sample gantt/treegrid-axis/indentation-0px\n                     *         Indentation set to 0px.\n                     *\n                     * @product gantt\n                     */\n                    indentation: 10,\n                    /**\n                     * Horizontal axis only. When `staggerLines` is not set,\n                     * `maxStaggerLines` defines how many lines the axis is allowed to\n                     * add to automatically avoid overlapping X labels. Set to `1` to\n                     * disable overlap detection.\n                     *\n                     * @deprecated\n                     * @type      {number}\n                     * @default   5\n                     * @since     1.3.3\n                     * @apioption xAxis.labels.maxStaggerLines\n                     */\n                    /**\n                     * How to handle overflowing labels on horizontal axis. If set to\n                     * `\"allow\"`, it will not be aligned at all. By default it\n                     * `\"justify\"` labels inside the chart area. If there is room to\n                     * move it, it will be aligned to the edge, else it will be removed.\n                     *\n                     * @type       {string}\n                     * @default    justify\n                     * @since      2.2.5\n                     * @validvalue [\"allow\", \"justify\"]\n                     * @apioption  xAxis.labels.overflow\n                     */\n                    /**\n                     * The pixel padding for axis labels, to ensure white space between\n                     * them.\n                     *\n                     * @type      {number}\n                     * @default   5\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.padding\n                     */\n                    /**\n                     * Whether to reserve space for the labels. By default, space is\n                     * reserved for the labels in these cases:\n                     *\n                     * * On all horizontal axes.\n                     * * On vertical axes if `label.align` is `right` on a left-side\n                     * axis or `left` on a right-side axis.\n                     * * On vertical axes if `label.align` is `center`.\n                     *\n                     * This can be turned off when for example the labels are rendered\n                     * inside the plot area instead of outside.\n                     *\n                     * @see [labels.align](#xAxis.labels.align)\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace/\n                     *         No reserved space, labels inside plot\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n                     *         Left-aligned labels on a vertical category axis\n                     *\n                     * @type      {boolean}\n                     * @since     4.1.10\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.reserveSpace\n                     */\n                    /**\n                     * Rotation of the labels in degrees.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-rotation/\n                     *         X axis labels rotated 90°\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @apioption xAxis.labels.rotation\n                     */\n                    /**\n                     * Horizontal axes only. The number of lines to spread the labels\n                     * over to make room or tighter labels.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-staggerlines/\n                     *         Show labels over two lines\n                     * @sample {highstock} stock/xaxis/labels-staggerlines/\n                     *         Show labels over two lines\n                     *\n                     * @type      {number}\n                     * @since     2.1\n                     * @apioption xAxis.labels.staggerLines\n                     */\n                    /**\n                     * To show only every _n_'th label on the axis, set the step to _n_.\n                     * Setting the step to 2 shows every other label.\n                     *\n                     * By default, the step is calculated automatically to avoid\n                     * overlap. To prevent this, set it to 1\\. This usually only\n                     * happens on a category axis, and is often a sign that you have\n                     * chosen the wrong axis type.\n                     *\n                     * Read more at\n                     * [Axis docs](https://www.highcharts.com/docs/chart-concepts/axes)\n                     * => What axis should I use?\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-step/\n                     *         Showing only every other axis label on a categorized\n                     *         x-axis\n                     * @sample {highcharts} highcharts/xaxis/labels-step-auto/\n                     *         Auto steps on a category axis\n                     *\n                     * @type      {number}\n                     * @since     2.1\n                     * @apioption xAxis.labels.step\n                     */\n                    /**\n                     * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                     * to render the labels.\n                     *\n                     * @type      {boolean}\n                     * @default   false\n                     * @apioption xAxis.labels.useHTML\n                     */\n                    /**\n                     * The x position offset of the label relative to the tick position\n                     * on the axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     */\n                    x: 0,\n                    /**\n                     * The y position offset of the label relative to the tick position\n                     * on the axis. The default makes it adapt to the font size on\n                     * bottom axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     *\n                     * @type      {number}\n                     * @apioption xAxis.labels.y\n                     */\n                    /**\n                     * The Z index for the axis labels.\n                     *\n                     * @type      {number}\n                     * @default   7\n                     * @apioption xAxis.labels.zIndex\n                     */\n                    /**\n                     * CSS styles for the label. Use `whiteSpace: 'nowrap'` to prevent\n                     * wrapping of category labels. Use `textOverflow: 'none'` to\n                     * prevent ellipsis (dots).\n                     *\n                     * In styled mode, the labels are styled with the\n                     * `.highcharts-axis-labels` class.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-style/\n                     *         Red X axis labels\n                     *\n                     * @type      {Highcharts.CSSObject}\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#666666',\n                        /** @internal */\n                        cursor: 'default',\n                        /** @internal */\n                        fontSize: '11px'\n                    }\n                },\n                /**\n                 * The left position as the horizontal axis. If it's a number, it is\n                 * interpreted as pixel position relative to the chart.\n                 *\n                 * Since Highcharts v5.0.13: If it's a percentage string, it is\n                 * interpreted as percentages of the plot width, offset from plot area\n                 * left.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.left\n                 */\n                /**\n                 * The top position as the vertical axis. If it's a number, it is\n                 * interpreted as pixel position relative to the chart.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted\n                 * as percentages of the plot height, offset from plot area top.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.top\n                 */\n                /**\n                 * Index of another axis that this axis is linked to. When an axis is\n                 * linked to a master axis, it will take the same extremes as\n                 * the master, but as assigned by min or max or by setExtremes.\n                 * It can be used to show additional info, or to ease reading the\n                 * chart by duplicating the scales.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/linkedto/\n                 *         Different string formats of the same date\n                 * @sample {highcharts} highcharts/yaxis/linkedto/\n                 *         Y values on both sides\n                 *\n                 * @type      {number}\n                 * @since     2.0.2\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.linkedTo\n                 */\n                /**\n                 * The maximum value of the axis. If `null`, the max value is\n                 * automatically calculated.\n                 *\n                 * If the [endOnTick](#yAxis.endOnTick) option is true, the `max` value\n                 * might be rounded up.\n                 *\n                 * If a [tickAmount](#yAxis.tickAmount) is set, the axis may be extended\n                 * beyond the set max in order to reach the given number of ticks. The\n                 * same may happen in a chart with multiple axes, determined by [chart.\n                 * alignTicks](#chart), where a `tickAmount` is applied internally.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/max-200/\n                 *         Y axis max of 200\n                 * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n                 *         Y axis max on logarithmic axis\n                 * @sample {highstock} stock/xaxis/min-max/\n                 *         Fixed min and max on X axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @type      {number|null}\n                 * @apioption xAxis.max\n                 */\n                /**\n                 * Padding of the max value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the highest data value to appear on the edge\n                 * of the plot area. When the axis' `max` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/maxpadding/\n                 *         Max padding of 0.25 on y axis\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Add some padding\n                 *\n                 * @default   {highcharts} 0.01\n                 * @default   {highstock|highmaps} 0\n                 * @since     1.2.0\n                 */\n                maxPadding: 0.01,\n                /**\n                 * Deprecated. Use `minRange` instead.\n                 *\n                 * @deprecated\n                 * @type      {number}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.maxZoom\n                 */\n                /**\n                 * The minimum value of the axis. If `null` the min value is\n                 * automatically calculated.\n                 *\n                 * If the [startOnTick](#yAxis.startOnTick) option is true (default),\n                 * the `min` value might be rounded down.\n                 *\n                 * The automatically calculated minimum value is also affected by\n                 * [floor](#yAxis.floor), [softMin](#yAxis.softMin),\n                 * [minPadding](#yAxis.minPadding), [minRange](#yAxis.minRange)\n                 * as well as [series.threshold](#plotOptions.series.threshold)\n                 * and [series.softThreshold](#plotOptions.series.softThreshold).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n                 *         -50 with startOnTick to false\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n                 *         -50 with startOnTick true by default\n                 * @sample {highstock} stock/xaxis/min-max/\n                 *         Set min and max on X axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @type      {number|null}\n                 * @apioption xAxis.min\n                 */\n                /**\n                 * The dash or dot style of the minor grid lines. For possible values,\n                 * see [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinedashstyle/\n                 *         Long dashes on minor grid lines\n                 * @sample {highstock} stock/xaxis/minorgridlinedashstyle/\n                 *         Long dashes on minor grid lines\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     1.2\n                 * @apioption xAxis.minorGridLineDashStyle\n                 */\n                /**\n                 * Specific tick interval in axis units for the minor ticks. On a linear\n                 * axis, if `\"auto\"`, the minor tick interval is calculated as a fifth\n                 * of the tickInterval. If `null` or `undefined`, minor ticks are not\n                 * shown.\n                 *\n                 * On logarithmic axes, the unit is the power of the value. For example,\n                 * setting the minorTickInterval to 1 puts one tick on each of 0.1, 1,\n                 * 10, 100 etc. Setting the minorTickInterval to 0.1 produces 9 ticks\n                 * between 1 and 10, 10 and 100 etc.\n                 *\n                 * If user settings dictate minor ticks to become too dense, they don't\n                 * make sense, and will be ignored to prevent performance problems.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-null/\n                 *         Null by default\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-5/\n                 *         5 units\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-log-auto/\n                 *         \"auto\"\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-log/\n                 *         0.1\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         Null by default\n                 * @sample {highstock} stock/xaxis/minortickinterval-auto/\n                 *         \"auto\"\n                 *\n                 * @type      {number|string|null}\n                 * @apioption xAxis.minorTickInterval\n                 */\n                /**\n                 * The pixel length of the minor tick marks.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorticklength/\n                 *         10px on Y axis\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         10px on Y axis\n                 */\n                minorTickLength: 2,\n                /**\n                 * The position of the minor tick marks relative to the axis line.\n                 *  Can be one of `inside` and `outside`.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickposition-outside/\n                 *         Outside by default\n                 * @sample {highcharts} highcharts/yaxis/minortickposition-inside/\n                 *         Inside\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         Inside\n                 *\n                 * @validvalue [\"inside\", \"outside\"]\n                 */\n                minorTickPosition: 'outside',\n                /**\n                 * Enable or disable minor ticks. Unless\n                 * [minorTickInterval](#xAxis.minorTickInterval) is set, the tick\n                 * interval is calculated as a fifth of the `tickInterval`.\n                 *\n                 * On a logarithmic axis, minor ticks are laid out based on a best\n                 * guess, attempting to enter approximately 5 minor ticks between\n                 * each major tick.\n                 *\n                 * Prior to v6.0.0, ticks were unabled in auto layout by setting\n                 * `minorTickInterval` to `\"auto\"`.\n                 *\n                 * @productdesc {highcharts}\n                 * On axes using [categories](#xAxis.categories), minor ticks are not\n                 * supported.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorticks-true/\n                 *         Enabled on linear Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     6.0.0\n                 * @apioption xAxis.minorTicks\n                 */\n                /**\n                 * The pixel width of the minor tick mark.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickwidth/\n                 *         3px width\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         1px width\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.minorTickWidth\n                 */\n                /**\n                 * Padding of the min value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the lowest data value to appear on the edge\n                 * of the plot area. When the axis' `min` option is set or a min extreme\n                 * is set using `axis.setExtremes()`, the minPadding will be ignored.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minpadding/\n                 *         Min padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Add some padding\n                 *\n                 * @default    {highcharts} 0.01\n                 * @default    {highstock|highmaps} 0\n                 * @since      1.2.0\n                 * @product    highcharts highstock gantt\n                 */\n                minPadding: 0.01,\n                /**\n                 * The minimum range to display on this axis. The entire axis will not\n                 * be allowed to span over a smaller interval than this. For example,\n                 * for a datetime axis the main unit is milliseconds. If minRange is\n                 * set to 3600000, you can't zoom in more than to one hour.\n                 *\n                 * The default minRange for the x axis is five times the smallest\n                 * interval between any of the data points.\n                 *\n                 * On a logarithmic axis, the unit for the minimum range is the power.\n                 * So a minRange of 1 means that the axis can be zoomed to 10-100,\n                 * 100-1000, 1000-10000 etc.\n                 *\n                 * **Note**: The `minPadding`, `maxPadding`, `startOnTick` and\n                 * `endOnTick` settings also affect how the extremes of the axis\n                 * are computed.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/minrange/\n                 *         Minimum range of 5\n                 * @sample {highstock} stock/xaxis/minrange/\n                 *         Max zoom of 6 months overrides user selections\n                 * @sample {highmaps} maps/axis/minrange/\n                 *         Minimum range of 1000\n                 *\n                 * @type      {number}\n                 * @apioption xAxis.minRange\n                 */\n                /**\n                 * The minimum tick interval allowed in axis values. For example on\n                 * zooming in on an axis with daily data, this can be used to prevent\n                 * the axis from showing hours. Defaults to the closest distance between\n                 * two points on the axis.\n                 *\n                 * @type      {number}\n                 * @since     2.3.0\n                 * @apioption xAxis.minTickInterval\n                 */\n                /**\n                 * The distance in pixels from the plot area to the axis line.\n                 * A positive offset moves the axis with it's line, labels and ticks\n                 * away from the plot area. This is typically used when two or more\n                 * axes are displayed on the same side of the plot. With multiple\n                 * axes the offset is dynamically adjusted to avoid collision, this\n                 * can be overridden by setting offset explicitly.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/offset/\n                 *         Y axis offset of 70\n                 * @sample {highcharts} highcharts/yaxis/offset-centered/\n                 *         Axes positioned in the center of the plot\n                 * @sample {highstock} stock/xaxis/offset/\n                 *         Y axis offset by 70 px\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.offset\n                 */\n                /**\n                 * Whether to display the axis on the opposite side of the normal. The\n                 * normal is on the left side for vertical axes and bottom for\n                 * horizontal, so the opposite sides will be right and top respectively.\n                 * This is typically used with dual or multiple axes.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/opposite/\n                 *         Secondary Y axis opposite\n                 * @sample {highstock} stock/xaxis/opposite/\n                 *         Y axis on left side\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption xAxis.opposite\n                 */\n                /**\n                 * In an ordinal axis, the points are equally spaced in the chart\n                 * regardless of the actual time or x distance between them. This means\n                 * that missing data periods (e.g. nights or weekends for a stock chart)\n                 * will not take up space in the chart.\n                 * Having `ordinal: false` will show any gaps created by the `gapSize`\n                 * setting proportionate to their duration.\n                 *\n                 * In stock charts the X axis is ordinal by default, unless\n                 * the boost module is used and at least one of the series' data length\n                 * exceeds the [boostThreshold](#series.line.boostThreshold).\n                 *\n                 * @sample {highstock} stock/xaxis/ordinal-true/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/ordinal-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     1.1\n                 * @product   highstock\n                 * @apioption xAxis.ordinal\n                 */\n                /**\n                 * Additional range on the right side of the xAxis. Works similar to\n                 * `xAxis.maxPadding`, but value is set in milliseconds. Can be set for\n                 * both main `xAxis` and the navigator's `xAxis`.\n                 *\n                 * @sample {highstock} stock/xaxis/overscroll/\n                 *         One minute overscroll with live data\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     6.0.0\n                 * @product   highstock\n                 * @apioption xAxis.overscroll\n                 */\n                /**\n                 * Refers to the index in the [panes](#panes) array. Used for circular\n                 * gauges and polar charts. When the option is not set then first pane\n                 * will be used.\n                 *\n                 * @sample highcharts/demo/gauge-vu-meter\n                 *         Two gauges with different center\n                 *\n                 * @type      {number}\n                 * @product   highcharts\n                 * @apioption xAxis.pane\n                 */\n                /**\n                 * The zoomed range to display when only defining one or none of `min`\n                 * or `max`. For example, to show the latest month, a range of one month\n                 * can be set.\n                 *\n                 * @sample {highstock} stock/xaxis/range/\n                 *         Setting a zoomed range when the rangeSelector is disabled\n                 *\n                 * @type      {number}\n                 * @product   highstock\n                 * @apioption xAxis.range\n                 */\n                /**\n                 * Whether to reverse the axis so that the highest number is closest\n                 * to the origin. If the chart is inverted, the x axis is reversed by\n                 * default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversed/\n                 *         Reversed Y axis\n                 * @sample {highstock} stock/xaxis/reversed/\n                 *         Reversed Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption xAxis.reversed\n                 */\n                // reversed: false,\n                /**\n                 * This option determines how stacks should be ordered within a group.\n                 * For example reversed xAxis also reverses stacks, so first series\n                 * comes last in a group. To keep order like for non-reversed xAxis\n                 * enable this option.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/reversedstacks/\n                 *         Reversed stacks comparison\n                 * @sample {highstock} highcharts/xaxis/reversedstacks/\n                 *         Reversed stacks comparison\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     6.1.1\n                 * @product   highcharts highstock\n                 * @apioption xAxis.reversedStacks\n                 */\n                /**\n                 * An optional scrollbar to display on the X axis in response to\n                 * limiting the minimum and maximum of the axis values.\n                 *\n                 * In styled mode, all the presentational options for the scrollbar are\n                 * replaced by the classes `.highcharts-scrollbar-thumb`,\n                 * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n                 * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n                 *\n                 * @sample {highstock} stock/yaxis/heatmap-scrollbars/\n                 *         Heatmap with both scrollbars\n                 *\n                 * @extends   scrollbar\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption xAxis.scrollbar\n                 */\n                /**\n                 * Whether to show the axis line and title when the axis has no data.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/showempty/\n                 *         When clicking the legend to hide series, one axis preserves\n                 *         line and title, the other doesn't\n                 * @sample {highstock} highcharts/yaxis/showempty/\n                 *         When clicking the legend to hide series, one axis preserves\n                 *         line and title, the other doesn't\n                 *\n                 * @since     1.1\n                 */\n                showEmpty: true,\n                /**\n                 * Whether to show the first tick label.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/showfirstlabel-false/\n                 *         Set to false on X axis\n                 * @sample {highstock} stock/xaxis/showfirstlabel/\n                 *         Labels below plot lines on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @apioption xAxis.showFirstLabel\n                 */\n                /**\n                 * Whether to show the last tick label. Defaults to `true` on cartesian\n                 * charts, and `false` on polar charts.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/showlastlabel-true/\n                 *         Set to true on X axis\n                 * @sample {highstock} stock/xaxis/showfirstlabel/\n                 *         Labels below plot lines on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.showLastLabel\n                 */\n                /**\n                 * A soft maximum for the axis. If the series data maximum is less than\n                 * this, the axis will stay at this maximum, but if the series data\n                 * maximum is higher, the axis will flex to show all data.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.softMax\n                 */\n                /**\n                 * A soft minimum for the axis. If the series data minimum is greater\n                 * than this, the axis will stay at this minimum, but if the series\n                 * data minimum is lower, the axis will flex to show all data.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.softMin\n                 */\n                /**\n                 * For datetime axes, this decides where to put the tick between weeks.\n                 *  0 = Sunday, 1 = Monday.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startofweek-monday/\n                 *         Monday by default\n                 * @sample {highcharts} highcharts/xaxis/startofweek-sunday/\n                 *         Sunday\n                 * @sample {highstock} stock/xaxis/startofweek-1\n                 *         Monday by default\n                 * @sample {highstock} stock/xaxis/startofweek-0\n                 *         Sunday\n                 *\n                 * @product highcharts highstock gantt\n                 */\n                startOfWeek: 1,\n                /**\n                 * Whether to force the axis to start on a tick. Use this option with\n                 * the `minPadding` option to control the axis start.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, `startOnTick` is always `false` when the navigator\n                 * is enabled, to prevent jumpy scrolling.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startontick-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/xaxis/startontick-true/\n                 *         True\n                 *\n                 * @since 1.2.0\n                 */\n                startOnTick: false,\n                /**\n                 * The amount of ticks to draw on the axis. This opens up for aligning\n                 * the ticks of multiple charts or panes within a chart. This option\n                 * overrides the `tickPixelInterval` option.\n                 *\n                 * This option only has an effect on linear axes. Datetime, logarithmic\n                 * or category axes are not affected.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/tickamount/\n                 *         8 ticks on Y axis\n                 * @sample {highstock} highcharts/yaxis/tickamount/\n                 *         8 ticks on Y axis\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.tickAmount\n                 */\n                /**\n                 * The interval of the tick marks in axis units. When `undefined`, the\n                 * tick interval is computed to approximately follow the\n                 * [tickPixelInterval](#xAxis.tickPixelInterval) on linear and datetime\n                 * axes. On categorized axes, a `undefined` tickInterval will default to\n                 * 1, one category. Note that datetime axes are based on milliseconds,\n                 * so for example an interval of one day is expressed as\n                 * `24 * 3600 * 1000`.\n                 *\n                 * On logarithmic axes, the tickInterval is based on powers, so a\n                 * tickInterval of 1 means one tick on each of 0.1, 1, 10, 100 etc. A\n                 * tickInterval of 2 means a tick of 0.1, 10, 1000 etc. A tickInterval\n                 * of 0.2 puts a tick on 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10, 20,\n                 * 40 etc.\n                 *\n                 *\n                 * If the tickInterval is too dense for labels to be drawn, Highcharts\n                 * may remove ticks.\n                 *\n                 * If the chart has multiple axes, the [alignTicks](#chart.alignTicks)\n                 * option may interfere with the `tickInterval` setting.\n                 *\n                 * @see [tickPixelInterval](#xAxis.tickPixelInterval)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickinterval-5/\n                 *         Tick interval of 5 on a linear axis\n                 * @sample {highstock} stock/xaxis/tickinterval/\n                 *         Tick interval of 0.01 on Y axis\n                 *\n                 * @type      {number}\n                 * @apioption xAxis.tickInterval\n                 */\n                /**\n                 * The pixel length of the main tick marks.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/ticklength/\n                 *         20 px tick length on the X axis\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 */\n                tickLength: 10,\n                /**\n                 * If tickInterval is `null` this option sets the approximate pixel\n                 * interval of the tick marks. Not applicable to categorized axis.\n                 *\n                 * The tick interval is also influenced by the [minTickInterval](\n                 * #xAxis.minTickInterval) option, that, by default prevents ticks from\n                 * being denser than the data points.\n                 *\n                 * @see [tickInterval](#xAxis.tickInterval)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpixelinterval-50/\n                 *         50 px on X axis\n                 * @sample {highstock} stock/xaxis/tickpixelinterval/\n                 *         200 px on X axis\n                 */\n                tickPixelInterval: 100,\n                /**\n                 * For categorized axes only. If `on` the tick mark is placed in the\n                 * center of the category, if `between` the tick mark is placed between\n                 * categories. The default is `between` if the `tickInterval` is 1, else\n                 * `on`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickmarkplacement-between/\n                 *         \"between\" by default\n                 * @sample {highcharts} highcharts/xaxis/tickmarkplacement-on/\n                 *         \"on\"\n                 *\n                 * @product    highcharts gantt\n                 * @validvalue [\"on\", \"between\"]\n                 */\n                tickmarkPlacement: 'between',\n                /**\n                 * The position of the major tick marks relative to the axis line.\n                 * Can be one of `inside` and `outside`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickposition-outside/\n                 *         \"outside\" by default\n                 * @sample {highcharts} highcharts/xaxis/tickposition-inside/\n                 *         \"inside\"\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 *\n                 * @validvalue [\"inside\", \"outside\"]\n                 */\n                tickPosition: 'outside',\n                /**\n                 * A callback function returning array defining where the ticks are\n                 * laid out on the axis. This overrides the default behaviour of\n                 * [tickPixelInterval](#xAxis.tickPixelInterval) and [tickInterval](\n                 * #xAxis.tickInterval). The automatic tick positions are accessible\n                 * through `this.tickPositions` and can be modified by the callback.\n                 *\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 *\n                 * @type      {Highcharts.AxisTickPositionerCallbackFunction}\n                 * @apioption xAxis.tickPositioner\n                 */\n                /**\n                 * An array defining where the ticks are laid out on the axis. This\n                 * overrides the default behaviour of [tickPixelInterval](\n                 * #xAxis.tickPixelInterval) and [tickInterval](#xAxis.tickInterval).\n                 *\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 *\n                 * @type      {Array<number>}\n                 * @apioption xAxis.tickPositions\n                 */\n                /**\n                 * The pixel width of the major tick marks. Defaults to 0 on category\n                 * axes, otherwise 1.\n                 *\n                 * In styled mode, the stroke width is given in the `.highcharts-tick`\n                 * class, but in order for the element to be generated on category axes,\n                 * the option must be explicitly set to 1.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickwidth/\n                 *         10 px width\n                 * @sample {highcharts} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 * @sample {highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 *\n                 * @type      {undefined|number}\n                 * @default   {highstock} 1\n                 * @default   {highmaps} 0\n                 * @apioption xAxis.tickWidth\n                 */\n                /**\n                 * The axis title, showing next to the axis line.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis is hidden by default, but adding an axis title\n                 * is still possible. X axis and Y axis titles will appear at the bottom\n                 * and left by default.\n                 */\n                title: {\n                    /**\n                     * Deprecated. Set the `text` to `null` to disable the title.\n                     *\n                     * @deprecated\n                     * @type      {boolean}\n                     * @product   highcharts\n                     * @apioption xAxis.title.enabled\n                     */\n                    /**\n                     * The pixel distance between the axis labels or line and the title.\n                     * Defaults to 0 for horizontal axes, 10 for vertical\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-margin/\n                     *         Y axis title margin of 60\n                     *\n                     * @type      {number}\n                     * @apioption xAxis.title.margin\n                     */\n                    /**\n                     * The distance of the axis title from the axis line. By default,\n                     * this distance is computed from the offset width of the labels,\n                     * the labels' distance from the axis and the title's margin.\n                     * However when the offset option is set, it overrides all this.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Place the axis title on top of the axis\n                     * @sample {highstock} highcharts/yaxis/title-offset/\n                     *         Place the axis title on top of the Y axis\n                     *\n                     * @type      {number}\n                     * @since     2.2.0\n                     * @apioption xAxis.title.offset\n                     */\n                    /**\n                     * Whether to reserve space for the title when laying out the axis.\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     5.0.11\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.reserveSpace\n                     */\n                    /**\n                     * The rotation of the text in degrees. 0 is horizontal, 270 is\n                     * vertical reading from bottom to top.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Horizontal\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @apioption xAxis.title.rotation\n                     */\n                    /**\n                     * The actual text of the axis title. It can contain basic HTML tags\n                     * like `b`, `i` and `span` with style.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-text/\n                     *         Custom HTML\n                     * @sample {highstock} stock/xaxis/title-text/\n                     *         Titles for both axes\n                     *\n                     * @type      {string|null}\n                     * @apioption xAxis.title.text\n                     */\n                    /**\n                     * Alignment of the text, can be `\"left\"`, `\"right\"` or `\"center\"`.\n                     * Default alignment depends on the\n                     * [title.align](xAxis.title.align):\n                     *\n                     * Horizontal axes:\n                     * - for `align` = `\"low\"`, `textAlign` is set to `left`\n                     * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n                     * - for `align` = `\"high\"`, `textAlign` is set to `right`\n                     *\n                     * Vertical axes:\n                     * - for `align` = `\"low\"` and `opposite` = `true`, `textAlign` is\n                     *   set to `right`\n                     * - for `align` = `\"low\"` and `opposite` = `false`, `textAlign` is\n                     *   set to `left`\n                     * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n                     * - for `align` = `\"high\"` and `opposite` = `true` `textAlign` is\n                     *   set to `left`\n                     * - for `align` = `\"high\"` and `opposite` = `false` `textAlign` is\n                     *   set to `right`\n                     *\n                     * @type      {Highcharts.AlignValue}\n                     * @apioption xAxis.title.textAlign\n                     */\n                    /**\n                     * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                     * to render the axis title.\n                     *\n                     * @type      {boolean}\n                     * @default   false\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.useHTML\n                     */\n                    /**\n                     * Horizontal pixel offset of the title position.\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @since     4.1.6\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.x\n                     */\n                    /**\n                     * Vertical pixel offset of the title position.\n                     *\n                     * @type      {number}\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.y\n                     */\n                    /**\n                     * Alignment of the title relative to the axis values. Possible\n                     * values are \"low\", \"middle\" or \"high\".\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-align-low/\n                     *         \"low\"\n                     * @sample {highcharts} highcharts/xaxis/title-align-center/\n                     *         \"middle\" by default\n                     * @sample {highcharts} highcharts/xaxis/title-align-high/\n                     *         \"high\"\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Place the Y axis title on top of the axis\n                     * @sample {highstock} stock/xaxis/title-align/\n                     *         Aligned to \"high\" value\n                     *\n                     * @type {Highcharts.AxisTitleAlignValue}\n                     */\n                    align: 'middle',\n                    /**\n                     * CSS styles for the title. If the title text is longer than the\n                     * axis length, it will wrap to multiple lines by default. This can\n                     * be customized by setting `textOverflow: 'ellipsis'`, by\n                     * setting a specific `width` or by setting `whiteSpace: 'nowrap'`.\n                     *\n                     * In styled mode, the stroke width is given in the\n                     * `.highcharts-axis-title` class.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-style/\n                     *         Red\n                     * @sample {highcharts} highcharts/css/axis/\n                     *         Styled mode\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#666666'\n                    }\n                },\n                /**\n                 * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`\n                 * or `category`. In a datetime axis, the numbers are given in\n                 * milliseconds, and tick marks are placed on appropriate values like\n                 * full hours or days. In a category axis, the\n                 * [point names](#series.line.data.name) of the chart's series are used\n                 * for categories, if not a [categories](#xAxis.categories) array is\n                 * defined.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/type-linear/\n                 *         Linear\n                 * @sample {highcharts} highcharts/yaxis/type-log/\n                 *         Logarithmic\n                 * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n                 *         Logarithmic with minor grid lines\n                 * @sample {highcharts} highcharts/xaxis/type-log-both/\n                 *         Logarithmic on two axes\n                 * @sample {highcharts} highcharts/yaxis/type-log-negative/\n                 *         Logarithmic with extension to emulate negative values\n                 *\n                 * @type    {Highcharts.AxisTypeValue}\n                 * @product highcharts gantt\n                 */\n                type: 'linear',\n                /**\n                 * If there are multiple axes on the same side of the chart, the pixel\n                 * margin between the axes. Defaults to 0 on vertical axes, 15 on\n                 * horizontal axes.\n                 *\n                 * @type      {number}\n                 * @since     7.0.3\n                 * @apioption xAxis.margin\n                 */\n                /**\n                 * Applies only when the axis `type` is `category`. When `uniqueNames`\n                 * is true, points are placed on the X axis according to their names.\n                 * If the same point name is repeated in the same or another series,\n                 * the point is placed on the same X position as other points of the\n                 * same name. When `uniqueNames` is false, the points are laid out in\n                 * increasing X positions regardless of their names, and the X axis\n                 * category will take the name of the last point in each position.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/uniquenames-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/xaxis/uniquenames-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.2.7\n                 * @product   highcharts gantt\n                 * @apioption xAxis.uniqueNames\n                 */\n                /**\n                 * Datetime axis only. An array determining what time intervals the\n                 * ticks are allowed to fall on. Each array item is an array where the\n                 * first value is the time unit and the second value another array of\n                 * allowed multiples.\n                 *\n                 * Defaults to:\n                 * ```js\n                 * units: [[\n                 *     'millisecond', // unit name\n                 *     [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                 * ], [\n                 *     'second',\n                 *     [1, 2, 5, 10, 15, 30]\n                 * ], [\n                 *     'minute',\n                 *     [1, 2, 5, 10, 15, 30]\n                 * ], [\n                 *     'hour',\n                 *     [1, 2, 3, 4, 6, 8, 12]\n                 * ], [\n                 *     'day',\n                 *     [1]\n                 * ], [\n                 *     'week',\n                 *     [1]\n                 * ], [\n                 *     'month',\n                 *     [1, 3, 6]\n                 * ], [\n                 *     'year',\n                 *     null\n                 * ]]\n                 * ```\n                 *\n                 * @type      {Array<Array<string,(Array<number>|null)>>}\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.units\n                 */\n                /**\n                 * Whether axis, including axis title, line, ticks and labels, should\n                 * be visible.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.1.9\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.visible\n                 */\n                /**\n                 * Color of the minor, secondary grid lines.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-minor-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinecolor/\n                 *         Bright grey lines from Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/minorgridlinecolor/\n                 *         Bright grey lines from Y axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #f2f2f2\n                 */\n                minorGridLineColor: '#f2f2f2',\n                /**\n                 * Width of the minor, secondary grid lines.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinewidth/\n                 *         2px lines from Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/minorgridlinewidth/\n                 *         2px lines from Y axis\n                 */\n                minorGridLineWidth: 1,\n                /**\n                 * Color for the minor tick marks.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickcolor/\n                 *         Black tick marks on Y axis\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         Black tick marks on Y axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #999999\n                 */\n                minorTickColor: '#999999',\n                /**\n                 * The color of the line marking the axis itself.\n                 *\n                 * In styled mode, the line stroke is given in the\n                 * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis line is hidden by default, because the axis is\n                 * not visible by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/linecolor/\n                 *         A red line on Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis/\n                 *         Axes in styled mode\n                 * @sample {highstock} stock/xaxis/linecolor/\n                 *         A red line on X axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #ccd6eb\n                 */\n                lineColor: '#ccd6eb',\n                /**\n                 * The width of the line marking the axis itself.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/linecolor/\n                 *         A 1px line on Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis/\n                 *         Axes in styled mode\n                 * @sample {highstock} stock/xaxis/linewidth/\n                 *         A 2px line on X axis\n                 *\n                 * @default {highcharts|highstock} 1\n                 * @default {highmaps} 0\n                 */\n                lineWidth: 1,\n                /**\n                 * Color of the grid lines extending the ticks across the plot area.\n                 *\n                 * In styled mode, the stroke is given in the `.highcharts-grid-line`\n                 * class.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the grid lines are hidden by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinecolor/\n                 *         Green lines\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/gridlinecolor/\n                 *         Green lines\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #e6e6e6\n                 */\n                gridLineColor: '#e6e6e6',\n                // gridLineDashStyle: 'solid',\n                /**\n                 * The width of the grid lines extending the ticks across the plot area.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinewidth/\n                 *         2px lines\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/gridlinewidth/\n                 *         2px lines\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.gridLineWidth\n                 */\n                // gridLineWidth: 0,\n                /**\n                 * The height as the vertical axis. If it's a number, it is\n                 * interpreted as pixels.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted\n                 * as percentages of the total plot height.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.height\n                 */\n                /**\n                 * The width as the horizontal axis. If it's a number, it is interpreted\n                 * as pixels.\n                 *\n                 * Since Highcharts v5.0.13: If it's a percentage string, it is\n                 * interpreted as percentages of the total plot width.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.width\n                 */\n                /**\n                 * Color for the main tick marks.\n                 *\n                 * In styled mode, the stroke is given in the `.highcharts-tick`\n                 * class.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickcolor/\n                 *         Red ticks on X axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #ccd6eb\n                 */\n                tickColor: '#ccd6eb'\n                // tickWidth: 1\n            };\n            /**\n             * The Y axis or value axis. Normally this is the vertical axis,\n             * though if the chart is inverted this is the horizontal axis.\n             * In case of multiple axes, the yAxis node is an array of\n             * configuration objects.\n             *\n             * See [the Axis object](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @type         {*|Array<*>}\n             * @extends      xAxis\n             * @excluding    currentDateIndicator,ordinal,overscroll\n             * @optionparent yAxis\n             *\n             * @private\n             */\n            Axis.defaultYAxisOptions = {\n                /**\n                 * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`,\n                 * `category` or `treegrid`. Defaults to `treegrid` for Gantt charts,\n                 * `linear` for other chart types.\n                 *\n                 * In a datetime axis, the numbers are given in milliseconds, and tick\n                 * marks are placed on appropriate values, like full hours or days. In a\n                 * category or treegrid axis, the [point names](#series.line.data.name)\n                 * of the chart's series are used for categories, if a\n                 * [categories](#xAxis.categories) array is not defined.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n                 *         Logarithmic with minor grid lines\n                 * @sample {highcharts} highcharts/yaxis/type-log-negative/\n                 *         Logarithmic with extension to emulate negative values\n                 * @sample {gantt} gantt/treegrid-axis/demo\n                 *         Treegrid axis\n                 *\n                 * @type      {Highcharts.AxisTypeValue}\n                 * @default   {highcharts} linear\n                 * @default   {gantt} treegrid\n                 * @product   highcharts gantt\n                 * @apioption yAxis.type\n                 */\n                /**\n                 * The height of the Y axis. If it's a number, it is interpreted as\n                 * pixels.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted as\n                 * percentages of the total plot height.\n                 *\n                 * @see [yAxis.top](#yAxis.top)\n                 *\n                 * @sample {highstock} stock/demo/candlestick-and-volume/\n                 *         Percentage height panes\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption yAxis.height\n                 */\n                /**\n                 * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n                 * to represent the maximum value of the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n                 *         Min and max colors\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #003399\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.maxColor\n                 */\n                /**\n                 * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n                 * to represent the minimum value of the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n                 *         Min and max color\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #e6ebf5\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.minColor\n                 */\n                /**\n                 * Whether to reverse the axis so that the highest number is closest\n                 * to the origin.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversed/\n                 *         Reversed Y axis\n                 * @sample {highstock} stock/xaxis/reversed/\n                 *         Reversed Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} false\n                 * @default   {highmaps} true\n                 * @default   {gantt} true\n                 * @apioption yAxis.reversed\n                 */\n                /**\n                 * If `true`, the first series in a stack will be drawn on top in a\n                 * positive, non-reversed Y axis. If `false`, the first series is in\n                 * the base of the stack.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversedstacks-false/\n                 *         Non-reversed stacks\n                 * @sample {highstock} highcharts/yaxis/reversedstacks-false/\n                 *         Non-reversed stacks\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     3.0.10\n                 * @product   highcharts highstock\n                 * @apioption yAxis.reversedStacks\n                 */\n                /**\n                 * Solid gauge series only. Color stops for the solid gauge. Use this\n                 * in cases where a linear gradient between a `minColor` and `maxColor`\n                 * is not sufficient. The stops is an array of tuples, where the first\n                 * item is a float between 0 and 1 assigning the relative position in\n                 * the gradient, and the second item is the color.\n                 *\n                 * For solid gauges, the Y axis also inherits the concept of\n                 * [data classes](https://api.highcharts.com/highmaps#colorAxis.dataClasses)\n                 * from the Highmaps color axis.\n                 *\n                 * @see [minColor](#yAxis.minColor)\n                 * @see [maxColor](#yAxis.maxColor)\n                 *\n                 * @sample {highcharts} highcharts/demo/gauge-solid/\n                 *         True by default\n                 *\n                 * @type      {Array<Highcharts.GradientColorStopObject>}\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.stops\n                 */\n                /**\n                 * The pixel width of the major tick marks.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickwidth/ 10 px width\n                 * @sample {highstock} stock/xaxis/ticks/ Formatted ticks on X axis\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.tickWidth\n                 */\n                /**\n                 * Angular gauges and solid gauges only.\n                 * The label's pixel distance from the perimeter of the plot area.\n                 *\n                 * Since v7.1.2: If it's a percentage string, it is interpreted the\n                 * same as [series.radius](#plotOptions.gauge.radius), so label can be\n                 * aligned under the gauge's shape.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/labels-distance/\n                 *                      Labels centered under the arc\n                 *\n                 * @type      {number|string}\n                 * @default   -25\n                 * @product   highcharts\n                 * @apioption yAxis.labels.distance\n                 */\n                /**\n                 * The y position offset of the label relative to the tick position\n                 * on the axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/labels-x/\n                 *         Y axis labels placed on grid lines\n                 *\n                 * @type      {number}\n                 * @default   {highcharts} 3\n                 * @default   {highstock} -2\n                 * @default   {highmaps} 3\n                 * @apioption yAxis.labels.y\n                 */\n                /**\n                 * Whether to force the axis to end on a tick. Use this option with\n                 * the `maxPadding` option to control the axis end.\n                 *\n                 * This option is always disabled, when panning type is\n                 * either `y` or `xy`.\n                 *\n                 * @see [type](#chart.panning.type)\n                 *\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/yaxis/endontick/\n                 *         False\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False for Y axis\n                 *\n                 * @since 1.2.0\n                 */\n                endOnTick: true,\n                /**\n                 * Padding of the max value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the highest data value to appear on the edge\n                 * of the plot area. When the axis' `max` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * Also the `softThreshold` option takes precedence over `maxPadding`,\n                 * so if the data is tangent to the threshold, `maxPadding` may not\n                 * apply unless `softThreshold` is set to false.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/maxpadding-02/\n                 *         Max padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                maxPadding: 0.05,\n                /**\n                 * Padding of the min value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the lowest data value to appear on the edge\n                 * of the plot area. When the axis' `min` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * Also the `softThreshold` option takes precedence over `minPadding`,\n                 * so if the data is tangent to the threshold, `minPadding` may not\n                 * apply unless `softThreshold` is set to false.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minpadding/\n                 *         Min padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                minPadding: 0.05,\n                /**\n                 * @productdesc {highstock}\n                 * In Highstock 1.x, the Y axis was placed on the left side by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/opposite/\n                 *         Secondary Y axis opposite\n                 * @sample {highstock} stock/xaxis/opposite/\n                 *         Y axis on left side\n                 *\n                 * @type      {boolean}\n                 * @default   {highstock} true\n                 * @default   {highcharts} false\n                 * @product   highstock highcharts gantt\n                 * @apioption yAxis.opposite\n                 */\n                /**\n                 * @see [tickInterval](#xAxis.tickInterval)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 */\n                tickPixelInterval: 72,\n                showLastLabel: true,\n                /**\n                 * @extends xAxis.labels\n                 */\n                labels: {\n                    /**\n                     * What part of the string the given position is anchored to. Can\n                     * be one of `\"left\"`, `\"center\"` or `\"right\"`. The exact position\n                     * also depends on the `labels.x` setting.\n                     *\n                     * Angular gauges and solid gauges defaults to `\"center\"`.\n                     * Solid gauges with two labels have additional option `\"auto\"`\n                     * for automatic horizontal and vertical alignment.\n                     *\n                     * @see [yAxis.labels.distance](#yAxis.labels.distance)\n                     *\n                     * @sample {highcharts} highcharts/yaxis/labels-align-left/\n                     *         Left\n                     * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n                     *         Solid gauge labels auto aligned\n                     *\n                     * @type       {Highcharts.AlignValue}\n                     * @default    {highcharts|highmaps} right\n                     * @default    {highstock} left\n                     * @apioption  yAxis.labels.align\n                     */\n                    /**\n                     * The x position offset of the label relative to the tick position\n                     * on the axis. Defaults to -15 for left axis, 15 for right axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     */\n                    x: -8\n                },\n                /**\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis line is hidden by default, because the axis is\n                 * not visible by default.\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @apioption yAxis.lineColor\n                 */\n                /**\n                 * @sample {highcharts} highcharts/yaxis/max-200/\n                 *         Y axis max of 200\n                 * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n                 *         Y axis max on logarithmic axis\n                 * @sample {highstock} stock/yaxis/min-max/\n                 *         Fixed min and max on Y axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @apioption yAxis.max\n                 */\n                /**\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n                 *         -50 with startOnTick to false\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n                 *         -50 with startOnTick true by default\n                 * @sample {highstock} stock/yaxis/min-max/\n                 *         Fixed min and max on Y axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @apioption yAxis.min\n                 */\n                /**\n                 * An optional scrollbar to display on the Y axis in response to\n                 * limiting the minimum an maximum of the axis values.\n                 *\n                 * In styled mode, all the presentational options for the scrollbar\n                 * are replaced by the classes `.highcharts-scrollbar-thumb`,\n                 * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n                 * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n                 *\n                 * @sample {highstock} stock/yaxis/scrollbar/\n                 *         Scrollbar on the Y axis\n                 *\n                 * @extends   scrollbar\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @excluding height\n                 * @apioption yAxis.scrollbar\n                 */\n                /**\n                 * Enable the scrollbar on the Y axis.\n                 *\n                 * @sample {highstock} stock/yaxis/scrollbar/\n                 *         Enabled on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.enabled\n                 */\n                /**\n                 * Pixel margin between the scrollbar and the axis elements.\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.margin\n                 */\n                /**\n                 * Whether to show the scrollbar when it is fully zoomed out at max\n                 * range. Setting it to `false` on the Y axis makes the scrollbar stay\n                 * hidden until the user zooms in, like common in browsers.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.showFull\n                 */\n                /**\n                 * The width of a vertical scrollbar or height of a horizontal\n                 * scrollbar. Defaults to 20 on touch devices.\n                 *\n                 * @type      {number}\n                 * @default   14\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.size\n                 */\n                /**\n                 * Z index of the scrollbar elements.\n                 *\n                 * @type      {number}\n                 * @default   3\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.zIndex\n                 */\n                /**\n                 * A soft maximum for the axis. If the series data maximum is less\n                 * than this, the axis will stay at this maximum, but if the series\n                 * data maximum is higher, the axis will flex to show all data.\n                 *\n                 * **Note**: The [series.softThreshold](\n                 * #plotOptions.series.softThreshold) option takes precedence over this\n                 * option.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.softMax\n                 */\n                /**\n                 * A soft minimum for the axis. If the series data minimum is greater\n                 * than this, the axis will stay at this minimum, but if the series\n                 * data minimum is lower, the axis will flex to show all data.\n                 *\n                 * **Note**: The [series.softThreshold](\n                 * #plotOptions.series.softThreshold) option takes precedence over this\n                 * option.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.softMin\n                 */\n                /**\n                 * Defines the horizontal alignment of the stack total label. Can be one\n                 * of `\"left\"`, `\"center\"` or `\"right\"`. The default value is calculated\n                 * at runtime and depends on orientation and whether the stack is\n                 * positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-left/\n                 *         Aligned to the left\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-center/\n                 *         Aligned in center\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-right/\n                 *         Aligned to the right\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.align\n                 */\n                /**\n                 * A format string for the data label. Available variables are the same\n                 * as for `formatter`.\n                 *\n                 * @type      {string}\n                 * @default   {total}\n                 * @since     3.0.2\n                 * @product   highcharts highstock\n                 * @apioption yAxis.stackLabels.format\n                 */\n                /**\n                 * Rotation of the labels in degrees.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-rotation/\n                 *         Labels rotated 45°\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.rotation\n                 */\n                /**\n                 * The text alignment for the label. While `align` determines where the\n                 * texts anchor point is placed with regards to the stack, `textAlign`\n                 * determines how the text is aligned against its anchor point. Possible\n                 * values are `\"left\"`, `\"center\"` and `\"right\"`. The default value is\n                 * calculated at runtime and depends on orientation and whether the\n                 * stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-textalign-left/\n                 *         Label in center position but text-aligned left\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.textAlign\n                 */\n                /**\n                 * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the labels.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     3.0\n                 * @product   highcharts highstock\n                 * @apioption yAxis.stackLabels.useHTML\n                 */\n                /**\n                 * Defines the vertical alignment of the stack total label. Can be one\n                 * of `\"top\"`, `\"middle\"` or `\"bottom\"`. The default value is calculated\n                 * at runtime and depends on orientation and whether the stack is\n                 * positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-top/\n                 *         Vertically aligned top\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-middle/\n                 *         Vertically aligned middle\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-bottom/\n                 *         Vertically aligned bottom\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.verticalAlign\n                 */\n                /**\n                 * The x position offset of the label relative to the left of the\n                 * stacked bar. The default value is calculated at runtime and depends\n                 * on orientation and whether the stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-x/\n                 *         Stack total labels with x offset\n                 *\n                 * @type      {number}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.x\n                 */\n                /**\n                 * The y position offset of the label relative to the tick position\n                 * on the axis. The default value is calculated at runtime and depends\n                 * on orientation and whether the stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-y/\n                 *         Stack total labels with y offset\n                 *\n                 * @type      {number}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.y\n                 */\n                /**\n                 * Whether to force the axis to start on a tick. Use this option with\n                 * the `maxPadding` option to control the axis start.\n                 *\n                 * This option is always disabled, when panning type is\n                 * either `y` or `xy`.\n                 *\n                 * @see [type](#chart.panning.type)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startontick-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/xaxis/startontick-true/\n                 *         True\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False for Y axis\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                startOnTick: true,\n                title: {\n                    /**\n                     * The pixel distance between the axis labels and the title.\n                     * Positive values are outside the axis line, negative are inside.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-margin/\n                     *         Y axis title margin of 60\n                     *\n                     * @type      {number}\n                     * @default   40\n                     * @apioption yAxis.title.margin\n                     */\n                    /**\n                     * The rotation of the text in degrees. 0 is horizontal, 270 is\n                     * vertical reading from bottom to top.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Horizontal\n                     */\n                    rotation: 270,\n                    /**\n                     * The actual text of the axis title. Horizontal texts can contain\n                     * HTML, but rotated texts are painted using vector techniques and\n                     * must be clean text. The Y axis title is disabled by setting the\n                     * `text` option to `undefined`.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-text/\n                     *         Custom HTML\n                     *\n                     * @type    {string|null}\n                     * @default {highcharts} Values\n                     * @default {highstock} undefined\n                     * @product highcharts highstock gantt\n                     */\n                    text: 'Values'\n                },\n                /**\n                 * The top position of the Y axis. If it's a number, it is interpreted\n                 * as pixel position relative to the chart.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted as\n                 * percentages of the plot height, offset from plot area top.\n                 *\n                 * @see [yAxis.height](#yAxis.height)\n                 *\n                 * @sample {highstock} stock/demo/candlestick-and-volume/\n                 *         Percentage height panes\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption yAxis.top\n                 */\n                /**\n                 * The stack labels show the total value for each bar in a stacked\n                 * column or bar chart. The label will be placed on top of positive\n                 * columns and below negative columns. In case of an inverted column\n                 * chart or a bar chart the label is placed to the right of positive\n                 * bars and to the left of negative bars.\n                 *\n                 * @product highcharts\n                 */\n                stackLabels: {\n                    /**\n                     * Allow the stack labels to overlap.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-allowoverlap-false/\n                     *         Default false\n                     *\n                     * @since   5.0.13\n                     * @product highcharts\n                     */\n                    allowOverlap: false,\n                    /**\n                     * The background color or gradient for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {Highcharts.ColorType}\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.backgroundColor\n                     */\n                    /**\n                     * The border color for the stack label. Defaults to `undefined`.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {Highcharts.ColorType}\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderColor\n                     */\n                    /**\n                     * The border radius in pixels for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {number}\n                     * @default   0\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderRadius\n                     */\n                    /**\n                     * The border width in pixels for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {number}\n                     * @default   0\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderWidth\n                     */\n                    /**\n                     * Enable or disable the stack total labels.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-enabled/\n                     *         Enabled stack total labels\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-enabled-waterfall/\n                     *         Enabled stack labels in waterfall chart\n                     *\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    enabled: false,\n                    /**\n                     * Whether to hide stack labels that are outside the plot area.\n                     * By default, the stack label is moved\n                     * inside the plot area according to the\n                     * [overflow](/highcharts/#yAxis/stackLabels/overflow)\n                     * option.\n                     *\n                     * @type  {boolean}\n                     * @since 7.1.3\n                     */\n                    crop: true,\n                    /**\n                     * How to handle stack total labels that flow outside the plot area.\n                     * The default is set to `\"justify\"`,\n                     * which aligns them inside the plot area.\n                     * For columns and bars, this means it will be moved inside the bar.\n                     * To display stack labels outside the plot area,\n                     * set `crop` to `false` and `overflow` to `\"allow\"`.\n                     *\n                     * @sample highcharts/yaxis/stacklabels-overflow/\n                     *         Stack labels flows outside the plot area.\n                     *\n                     * @type  {Highcharts.DataLabelsOverflowValue}\n                     * @since 7.1.3\n                     */\n                    overflow: 'justify',\n                    /* eslint-disable valid-jsdoc */\n                    /**\n                     * Callback JavaScript function to format the label. The value is\n                     * given by `this.total`.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-formatter/\n                     *         Added units to stack total value\n                     *\n                     * @type    {Highcharts.FormatterCallbackFunction<Highcharts.StackItemObject>}\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    formatter: function () {\n                        var numberFormatter = this.axis.chart.numberFormatter;\n                        /* eslint-enable valid-jsdoc */\n                        return numberFormatter(this.total, -1);\n                    },\n                    /**\n                     * CSS styles for the label.\n                     *\n                     * In styled mode, the styles are set in the\n                     * `.highcharts-stack-label` class.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-style/\n                     *         Red stack total labels\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#000000',\n                        /** @internal */\n                        fontSize: '11px',\n                        /** @internal */\n                        fontWeight: 'bold',\n                        /** @internal */\n                        textOutline: '1px contrast'\n                    }\n                },\n                gridLineWidth: 1,\n                lineWidth: 0\n                // tickWidth: 0\n            };\n            /**\n             * The Z axis or depth axis for 3D plots.\n             *\n             * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @sample {highcharts} highcharts/3d/scatter-zaxis-categories/\n             *         Z-Axis with Categories\n             * @sample {highcharts} highcharts/3d/scatter-zaxis-grid/\n             *         Z-Axis with styling\n             *\n             * @type      {*|Array<*>}\n             * @extends   xAxis\n             * @since     5.0.0\n             * @product   highcharts\n             * @excluding breaks, crosshair, height, left, lineColor, lineWidth,\n             *            nameToX, showEmpty, top, width\n             * @apioption zAxis\n             *\n             * @private\n             */\n            // This variable extends the defaultOptions for left axes.\n            Axis.defaultLeftAxisOptions = {\n                labels: {\n                    x: -15\n                },\n                title: {\n                    rotation: 270\n                }\n            };\n            // This variable extends the defaultOptions for right axes.\n            Axis.defaultRightAxisOptions = {\n                labels: {\n                    x: 15\n                },\n                title: {\n                    rotation: 90\n                }\n            };\n            // This variable extends the defaultOptions for bottom axes.\n            Axis.defaultBottomAxisOptions = {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined,\n                    // staggerLines: null\n                },\n                margin: 15,\n                title: {\n                    rotation: 0\n                }\n            };\n            // This variable extends the defaultOptions for top axes.\n            Axis.defaultTopAxisOptions = {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined\n                    // staggerLines: null\n                },\n                margin: 15,\n                title: {\n                    rotation: 0\n                }\n            };\n            // Properties to survive after destroy, needed for Axis.update (#4317,\n            // #5773, #5881).\n            Axis.keepProps = ['extKey', 'hcEvents', 'names', 'series', 'userMax', 'userMin'];\n            return Axis;\n        }());\n        H.Axis = Axis;\n\n        return H.Axis;\n    });\n    _registerModule(_modules, 'parts/DateTimeAxis.js', [_modules['parts/Axis.js'], _modules['parts/Utilities.js']], function (Axis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            getMagnitude = U.getMagnitude,\n            normalizeTickInterval = U.normalizeTickInterval,\n            timeUnits = U.timeUnits;\n        /* eslint-disable valid-jsdoc */\n        var DateTimeAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function DateTimeAxisAdditions(axis) {\n                    this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Get a normalized tick interval for dates. Returns a configuration object\n             * with unit range (interval), count and name. Used to prepare data for\n             * `getTimeTicks`. Previously this logic was part of getTimeTicks, but as\n             * `getTimeTicks` now runs of segments in stock charts, the normalizing\n             * logic was extracted in order to prevent it for running over again for\n             * each segment having the same interval. #662, #697.\n             * @private\n             */\n            /**\n             * Get a normalized tick interval for dates. Returns a configuration object\n             * with unit range (interval), count and name. Used to prepare data for\n             * `getTimeTicks`. Previously this logic was part of getTimeTicks, but as\n             * `getTimeTicks` now runs of segments in stock charts, the normalizing\n             * logic was extracted in order to prevent it for running over again for\n             * each segment having the same interval. #662, #697.\n             * @private\n             */\n            DateTimeAxisAdditions.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {\n                var units = unitsOption || [[\n                            'millisecond',\n                            [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                        ],\n                    [\n                            'second',\n                            [1, 2, 5, 10, 15, 30]\n                        ],\n                    [\n                            'minute',\n                            [1, 2, 5, 10, 15, 30]\n                        ],\n                    [\n                            'hour',\n                            [1, 2, 3, 4, 6, 8, 12]\n                        ],\n                    [\n                            'day',\n                            [1, 2]\n                        ],\n                    [\n                            'week',\n                            [1, 2]\n                        ],\n                    [\n                            'month',\n                            [1, 2, 3, 4, 6]\n                        ],\n                    [\n                            'year',\n                            null\n                        ]],\n                    unit = units[units.length - 1], // default unit is years\n                    interval = timeUnits[unit[0]],\n                    multiples = unit[1],\n                    count,\n                    i;\n                // loop through the units to find the one that best fits the\n                // tickInterval\n                for (i = 0; i < units.length; i++) {\n                    unit = units[i];\n                    interval = timeUnits[unit[0]];\n                    multiples = unit[1];\n                    if (units[i + 1]) {\n                        // lessThan is in the middle between the highest multiple and\n                        // the next unit.\n                        var lessThan = (interval *\n                                multiples[multiples.length - 1] +\n                                timeUnits[units[i + 1][0]]) / 2;\n                        // break and keep the current unit\n                        if (tickInterval <= lessThan) {\n                            break;\n                        }\n                    }\n                }\n                // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n                if (interval === timeUnits.year && tickInterval < 5 * interval) {\n                    multiples = [1, 2, 5];\n                }\n                // get the count\n                count = normalizeTickInterval(tickInterval / interval, multiples, unit[0] === 'year' ? // #1913, #2360\n                    Math.max(getMagnitude(tickInterval / interval), 1) :\n                    1);\n                return {\n                    unitRange: interval,\n                    count: count,\n                    unitName: unit[0]\n                };\n            };\n            return DateTimeAxisAdditions;\n        }());\n        /**\n         * Date and time support for axes.\n         *\n         * @private\n         * @class\n         */\n        var DateTimeAxis = /** @class */ (function () {\n                function DateTimeAxis() {\n                }\n                /* *\n                 *\n                 *  Static Functions\n                 *\n                 * */\n                /**\n                 * Extends axis class with date and time support.\n                 * @private\n                 */\n                DateTimeAxis.compose = function (AxisClass) {\n                    AxisClass.keepProps.push('dateTime');\n                var axisProto = AxisClass.prototype;\n                /**\n                 * Set the tick positions to a time unit that makes sense, for example\n                 * on the first of each month or on every Monday. Return an array with\n                 * the time positions. Used in datetime axes as well as for grouping\n                 * data on a datetime axis.\n                 *\n                 * @private\n                 * @function Highcharts.Axis#getTimeTicks\n                 *\n                 * @param {Highcharts.TimeNormalizeObject} normalizedInterval\n                 * The interval in axis values (ms) and thecount.\n                 *\n                 * @param {number} min\n                 * The minimum in axis values.\n                 *\n                 * @param {number} max\n                 * The maximum in axis values.\n                 *\n                 * @param {number} startOfWeek\n                 *\n                 * @return {Highcharts.AxisTickPositionsArray}\n                 */\n                axisProto.getTimeTicks = function () {\n                    return this.chart.time.getTimeTicks.apply(this.chart.time, arguments);\n                };\n                /* eslint-disable no-invalid-this */\n                addEvent(AxisClass, 'init', function (e) {\n                    var axis = this;\n                    var options = e.userOptions;\n                    if (options.type !== 'datetime') {\n                        axis.dateTime = void 0;\n                        return;\n                    }\n                    if (!axis.dateTime) {\n                        axis.dateTime = new DateTimeAxisAdditions(axis);\n                    }\n                });\n                /* eslint-enable no-invalid-this */\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            DateTimeAxis.AdditionsClass = DateTimeAxisAdditions;\n            return DateTimeAxis;\n        }());\n        DateTimeAxis.compose(Axis);\n\n        return DateTimeAxis;\n    });\n    _registerModule(_modules, 'parts/LogarithmicAxis.js', [_modules['parts/Axis.js'], _modules['parts/Utilities.js']], function (Axis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            getMagnitude = U.getMagnitude,\n            normalizeTickInterval = U.normalizeTickInterval,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Provides logarithmic support for axes.\n         *\n         * @private\n         * @class\n         */\n        var LogarithmicAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function LogarithmicAxisAdditions(axis) {\n                    this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set the tick positions of a logarithmic axis.\n             */\n            LogarithmicAxisAdditions.prototype.getLogTickPositions = function (interval, min, max, minor) {\n                var log = this;\n                var axis = log.axis;\n                var axisLength = axis.len;\n                var options = axis.options;\n                // Since we use this method for both major and minor ticks,\n                // use a local variable and return the result\n                var positions = [];\n                // Reset\n                if (!minor) {\n                    log.minorAutoInterval = void 0;\n                }\n                // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n                if (interval >= 0.5) {\n                    interval = Math.round(interval);\n                    positions = axis.getLinearTickPositions(interval, min, max);\n                    // Second case: We need intermediary ticks. For example\n                    // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n                }\n                else if (interval >= 0.08) {\n                    var roundedMin = Math.floor(min),\n                        intermediate,\n                        i,\n                        j,\n                        len,\n                        pos,\n                        lastPos,\n                        break2;\n                    if (interval > 0.3) {\n                        intermediate = [1, 2, 4];\n                        // 0.2 equals five minor ticks per 1, 10, 100 etc\n                    }\n                    else if (interval > 0.15) {\n                        intermediate = [1, 2, 4, 6, 8];\n                    }\n                    else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n                        intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n                    }\n                    for (i = roundedMin; i < max + 1 && !break2; i++) {\n                        len = intermediate.length;\n                        for (j = 0; j < len && !break2; j++) {\n                            pos = log.log2lin(log.lin2log(i) * intermediate[j]);\n                            // #1670, lastPos is #3113\n                            if (pos > min &&\n                                (!minor || lastPos <= max) &&\n                                typeof lastPos !== 'undefined') {\n                                positions.push(lastPos);\n                            }\n                            if (lastPos > max) {\n                                break2 = true;\n                            }\n                            lastPos = pos;\n                        }\n                    }\n                    // Third case: We are so deep in between whole logarithmic values that\n                    // we might as well handle the tick positions like a linear axis. For\n                    // example 1.01, 1.02, 1.03, 1.04.\n                }\n                else {\n                    var realMin = log.lin2log(min),\n                        realMax = log.lin2log(max),\n                        tickIntervalOption = minor ?\n                            axis.getMinorTickInterval() :\n                            options.tickInterval,\n                        filteredTickIntervalOption = tickIntervalOption === 'auto' ?\n                            null :\n                            tickIntervalOption,\n                        tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n                        totalPixelLength = minor ?\n                            axisLength / axis.tickPositions.length :\n                            axisLength;\n                    interval = pick(filteredTickIntervalOption, log.minorAutoInterval, (realMax - realMin) *\n                        tickPixelIntervalOption / (totalPixelLength || 1));\n                    interval = normalizeTickInterval(interval, void 0, getMagnitude(interval));\n                    positions = axis.getLinearTickPositions(interval, realMin, realMax).map(log.log2lin);\n                    if (!minor) {\n                        log.minorAutoInterval = interval / 5;\n                    }\n                }\n                // Set the axis-level tickInterval variable\n                if (!minor) {\n                    axis.tickInterval = interval;\n                }\n                return positions;\n            };\n            LogarithmicAxisAdditions.prototype.lin2log = function (num) {\n                return Math.pow(10, num);\n            };\n            LogarithmicAxisAdditions.prototype.log2lin = function (num) {\n                return Math.log(num) / Math.LN10;\n            };\n            return LogarithmicAxisAdditions;\n        }());\n        var LogarithmicAxis = /** @class */ (function () {\n                function LogarithmicAxis() {\n                }\n                /**\n                 * Provides logarithmic support for axes.\n                 *\n                 * @private\n                 */\n                LogarithmicAxis.compose = function (AxisClass) {\n                    AxisClass.keepProps.push('logarithmic');\n                // HC <= 8 backwards compatibility, allow wrapping\n                // Axis.prototype.lin2log and log2lin\n                // @todo Remove this in next major\n                var axisProto = AxisClass.prototype;\n                var logAxisProto = LogarithmicAxisAdditions.prototype;\n                axisProto.log2lin = logAxisProto.log2lin;\n                axisProto.lin2log = logAxisProto.lin2log;\n                /* eslint-disable no-invalid-this */\n                addEvent(AxisClass, 'init', function (e) {\n                    var axis = this;\n                    var options = e.userOptions;\n                    var logarithmic = axis.logarithmic;\n                    if (options.type !== 'logarithmic') {\n                        axis.logarithmic = void 0;\n                    }\n                    else {\n                        if (!logarithmic) {\n                            logarithmic = axis.logarithmic = new LogarithmicAxisAdditions(axis);\n                        }\n                        // HC <= 8 backwards compatibility, allow wrapping\n                        // Axis.prototype.lin2log and log2lin\n                        // @todo Remove this in next major\n                        if (axis.log2lin !== logarithmic.log2lin) {\n                            logarithmic.log2lin = axis.log2lin.bind(axis);\n                        }\n                        if (axis.lin2log !== logarithmic.lin2log) {\n                            logarithmic.lin2log = axis.lin2log.bind(axis);\n                        }\n                    }\n                });\n                addEvent(AxisClass, 'afterInit', function () {\n                    var axis = this;\n                    var log = axis.logarithmic;\n                    // extend logarithmic axis\n                    if (log) {\n                        axis.lin2val = function (num) {\n                            return log.lin2log(num);\n                        };\n                        axis.val2lin = function (num) {\n                            return log.log2lin(num);\n                        };\n                    }\n                });\n            };\n            return LogarithmicAxis;\n        }());\n        LogarithmicAxis.compose(Axis); // @todo move to factory functions\n\n        return LogarithmicAxis;\n    });\n    _registerModule(_modules, 'parts/PlotLineOrBand.js', [_modules['parts/Axis.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Axis, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Options for plot bands on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotBandsOptions|Highcharts.YAxisPlotBandsOptions|Highcharts.ZAxisPlotBandsOptions} Highcharts.AxisPlotBandsOptions\n         */\n        /**\n         * Options for plot band labels on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotBandsLabelOptions|Highcharts.YAxisPlotBandsLabelOptions|Highcharts.ZAxisPlotBandsLabelOptions} Highcharts.AxisPlotBandsLabelOptions\n         */\n        /**\n         * Options for plot lines on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotLinesOptions|Highcharts.YAxisPlotLinesOptions|Highcharts.ZAxisPlotLinesOptions} Highcharts.AxisPlotLinesOptions\n         */\n        /**\n         * Options for plot line labels on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotLinesLabelOptions|Highcharts.YAxisPlotLinesLabelOptions|Highcharts.ZAxisPlotLinesLabelOptions} Highcharts.AxisPlotLinesLabelOptions\n         */\n        var arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The object wrapper for plot lines and plot bands\n         *\n         * @class\n         * @name Highcharts.PlotLineOrBand\n         *\n         * @param {Highcharts.Axis} axis\n         *\n         * @param {Highcharts.AxisPlotLinesOptions|Highcharts.AxisPlotBandsOptions} [options]\n         */\n        var PlotLineOrBand = /** @class */ (function () {\n                function PlotLineOrBand(axis, options) {\n                    this.axis = axis;\n                if (options) {\n                    this.options = options;\n                    this.id = options.id;\n                }\n            }\n            /**\n             * Render the plot line or plot band. If it is already existing,\n             * move it.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#render\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             */\n            PlotLineOrBand.prototype.render = function () {\n                H.fireEvent(this, 'render');\n                var plotLine = this,\n                    axis = plotLine.axis,\n                    horiz = axis.horiz,\n                    log = axis.logarithmic,\n                    options = plotLine.options,\n                    optionsLabel = options.label,\n                    label = plotLine.label,\n                    to = options.to,\n                    from = options.from,\n                    value = options.value,\n                    isBand = defined(from) && defined(to),\n                    isLine = defined(value),\n                    svgElem = plotLine.svgElem,\n                    isNew = !svgElem,\n                    path = [],\n                    color = options.color,\n                    zIndex = pick(options.zIndex, 0),\n                    events = options.events,\n                    attribs = {\n                        'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') +\n                            (options.className || '')\n                    },\n                    groupAttribs = {},\n                    renderer = axis.chart.renderer,\n                    groupName = isBand ? 'bands' : 'lines',\n                    group;\n                // logarithmic conversion\n                if (log) {\n                    from = log.log2lin(from);\n                    to = log.log2lin(to);\n                    value = log.log2lin(value);\n                }\n                // Set the presentational attributes\n                if (!axis.chart.styledMode) {\n                    if (isLine) {\n                        attribs.stroke = color || '#999999';\n                        attribs['stroke-width'] = pick(options.width, 1);\n                        if (options.dashStyle) {\n                            attribs.dashstyle =\n                                options.dashStyle;\n                        }\n                    }\n                    else if (isBand) { // plot band\n                        attribs.fill = color || '#e6ebf5';\n                        if (options.borderWidth) {\n                            attribs.stroke = options.borderColor;\n                            attribs['stroke-width'] = options.borderWidth;\n                        }\n                    }\n                }\n                // Grouping and zIndex\n                groupAttribs.zIndex = zIndex;\n                groupName += '-' + zIndex;\n                group = axis.plotLinesAndBandsGroups[groupName];\n                if (!group) {\n                    axis.plotLinesAndBandsGroups[groupName] = group =\n                        renderer.g('plot-' + groupName)\n                            .attr(groupAttribs).add();\n                }\n                // Create the path\n                if (isNew) {\n                    /**\n                     * SVG element of the plot line or band.\n                     *\n                     * @name Highcharts.PlotLineOrBand#svgElement\n                     * @type {Highcharts.SVGElement}\n                     */\n                    plotLine.svgElem = svgElem = renderer\n                        .path()\n                        .attr(attribs)\n                        .add(group);\n                }\n                // Set the path or return\n                if (isLine) {\n                    path = axis.getPlotLinePath({\n                        value: value,\n                        lineWidth: svgElem.strokeWidth(),\n                        acrossPanes: options.acrossPanes\n                    });\n                }\n                else if (isBand) { // plot band\n                    path = axis.getPlotBandPath(from, to, options);\n                }\n                else {\n                    return;\n                }\n                // common for lines and bands\n                // Add events only if they were not added before.\n                if (!plotLine.eventsAdded && events) {\n                    objectEach(events, function (event, eventType) {\n                        svgElem.on(eventType, function (e) {\n                            events[eventType].apply(plotLine, [e]);\n                        });\n                    });\n                    plotLine.eventsAdded = true;\n                }\n                if ((isNew || !svgElem.d) && path && path.length) {\n                    svgElem.attr({ d: path });\n                }\n                else if (svgElem) {\n                    if (path) {\n                        svgElem.show(true);\n                        svgElem.animate({ d: path });\n                    }\n                    else if (svgElem.d) {\n                        svgElem.hide();\n                        if (label) {\n                            plotLine.label = label = label.destroy();\n                        }\n                    }\n                }\n                // the plot band/line label\n                if (optionsLabel &&\n                    (defined(optionsLabel.text) || defined(optionsLabel.formatter)) &&\n                    path &&\n                    path.length &&\n                    axis.width > 0 &&\n                    axis.height > 0 &&\n                    !path.isFlat) {\n                    // apply defaults\n                    optionsLabel = merge({\n                        align: horiz && isBand && 'center',\n                        x: horiz ? !isBand && 4 : 10,\n                        verticalAlign: !horiz && isBand && 'middle',\n                        y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n                        rotation: horiz && !isBand && 90\n                    }, optionsLabel);\n                    this.renderLabel(optionsLabel, path, isBand, zIndex);\n                }\n                else if (label) { // move out of sight\n                    label.hide();\n                }\n                // chainable\n                return plotLine;\n            };\n            /**\n             * Render and align label for plot line or band.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#renderLabel\n             * @param {Highcharts.AxisPlotLinesLabelOptions|Highcharts.AxisPlotBandsLabelOptions} optionsLabel\n             * @param {Highcharts.SVGPathArray} path\n             * @param {boolean} [isBand]\n             * @param {number} [zIndex]\n             * @return {void}\n             */\n            PlotLineOrBand.prototype.renderLabel = function (optionsLabel, path, isBand, zIndex) {\n                var plotLine = this,\n                    label = plotLine.label,\n                    renderer = plotLine.axis.chart.renderer,\n                    attribs,\n                    xBounds,\n                    yBounds,\n                    x,\n                    y,\n                    labelText;\n                // add the SVG element\n                if (!label) {\n                    attribs = {\n                        align: optionsLabel.textAlign || optionsLabel.align,\n                        rotation: optionsLabel.rotation,\n                        'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') +\n                            '-label ' + (optionsLabel.className || '')\n                    };\n                    attribs.zIndex = zIndex;\n                    labelText = this.getLabelText(optionsLabel);\n                    /**\n                     * SVG element of the label.\n                     *\n                     * @name Highcharts.PlotLineOrBand#label\n                     * @type {Highcharts.SVGElement}\n                     */\n                    plotLine.label = label = renderer\n                        .text(labelText, 0, 0, optionsLabel.useHTML)\n                        .attr(attribs)\n                        .add();\n                    if (!this.axis.chart.styledMode) {\n                        label.css(optionsLabel.style);\n                    }\n                }\n                // get the bounding box and align the label\n                // #3000 changed to better handle choice between plotband or plotline\n                xBounds = path.xBounds ||\n                    [path[0][1], path[1][1], (isBand ? path[2][1] : path[0][1])];\n                yBounds = path.yBounds ||\n                    [path[0][2], path[1][2], (isBand ? path[2][2] : path[0][2])];\n                x = arrayMin(xBounds);\n                y = arrayMin(yBounds);\n                label.align(optionsLabel, false, {\n                    x: x,\n                    y: y,\n                    width: arrayMax(xBounds) - x,\n                    height: arrayMax(yBounds) - y\n                });\n                label.show(true);\n            };\n            /**\n             * Get label's text content.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#getLabelText\n             * @param {Highcharts.AxisPlotLinesLabelOptions|Highcharts.AxisPlotBandsLabelOptions} optionsLabel\n             * @return {string}\n             */\n            PlotLineOrBand.prototype.getLabelText = function (optionsLabel) {\n                return defined(optionsLabel.formatter) ?\n                    optionsLabel.formatter\n                        .call(this) :\n                    optionsLabel.text;\n            };\n            /**\n             * Remove the plot line or band.\n             *\n             * @function Highcharts.PlotLineOrBand#destroy\n             * @return {void}\n             */\n            PlotLineOrBand.prototype.destroy = function () {\n                // remove it from the lookup\n                erase(this.axis.plotLinesAndBands, this);\n                delete this.axis;\n                destroyObjectProperties(this);\n            };\n            return PlotLineOrBand;\n        }());\n        /* eslint-enable no-invalid-this, valid-jsdoc */\n        // Object with members for extending the Axis prototype\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n            /**\n             * An array of colored bands stretching across the plot area marking an\n             * interval on the axis.\n             *\n             * In styled mode, the plot bands are styled by the `.highcharts-plot-band`\n             * class in addition to the `className` option.\n             *\n             * @productdesc {highcharts}\n             * In a gauge, a plot band on the Y axis (value axis) will stretch along the\n             * perimeter of the gauge.\n             *\n             * @type      {Array<*>}\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.plotBands\n             */\n            /**\n             * Flag to decide if plotBand should be rendered across all panes.\n             *\n             * @since     7.1.2\n             * @product   highstock\n             * @type      {boolean}\n             * @default   true\n             * @apioption xAxis.plotBands.acrossPanes\n             */\n            /**\n             * Border color for the plot band. Also requires `borderWidth` to be set.\n             *\n             * @type      {Highcharts.ColorString}\n             * @apioption xAxis.plotBands.borderColor\n             */\n            /**\n             * Border width for the plot band. Also requires `borderColor` to be set.\n             *\n             * @type      {number}\n             * @default   0\n             * @apioption xAxis.plotBands.borderWidth\n             */\n            /**\n             * A custom class name, in addition to the default `highcharts-plot-band`,\n             * to apply to each individual band.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption xAxis.plotBands.className\n             */\n            /**\n             * The color of the plot band.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Color band\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #e6ebf5\n             * @apioption xAxis.plotBands.color\n             */\n            /**\n             * An object defining mouse events for the plot band. Supported properties\n             * are `click`, `mouseover`, `mouseout`, `mousemove`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-events/\n             *         Mouse events demonstrated\n             *\n             * @since     1.2\n             * @apioption xAxis.plotBands.events\n             */\n            /**\n             * Click event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.click\n             */\n            /**\n             * Mouse move event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mousemove\n             */\n            /**\n             * Mouse out event on the corner of a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mouseout\n             */\n            /**\n             * Mouse over event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mouseover\n             */\n            /**\n             * The start position of the plot band in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Datetime axis\n             * @sample {highcharts} highcharts/xaxis/plotbands-from/\n             *         Categorized axis\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotBands.from\n             */\n            /**\n             * An id used for identifying the plot band in Axis.removePlotBand.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-id/\n             *         Remove plot band by id\n             * @sample {highstock} highcharts/xaxis/plotbands-id/\n             *         Remove plot band by id\n             *\n             * @type      {string}\n             * @apioption xAxis.plotBands.id\n             */\n            /**\n             * The end position of the plot band in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Datetime axis\n             * @sample {highcharts} highcharts/xaxis/plotbands-from/\n             *         Categorized axis\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotBands.to\n             */\n            /**\n             * The z index of the plot band within the chart, relative to other\n             * elements. Using the same z index as another element may give\n             * unpredictable results, as the last rendered element will be on top.\n             * Values from 0 to 20 make sense.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Behind plot lines by default\n             * @sample {highcharts} highcharts/xaxis/plotbands-zindex/\n             *         Above plot lines\n             * @sample {highcharts} highcharts/xaxis/plotbands-zindex-above-series/\n             *         Above plot lines and series\n             *\n             * @type      {number}\n             * @since     1.2\n             * @apioption xAxis.plotBands.zIndex\n             */\n            /**\n             * Text labels for the plot bands\n             *\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.plotBands.label\n             */\n            /**\n             * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n             * \"right\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n             *         Aligned to the right\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {Highcharts.AlignValue}\n             * @default   center\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.align\n             */\n            /**\n             * Rotation of the text label in degrees .\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n             *         Vertical text\n             *\n             * @type      {number}\n             * @default   0\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.rotation\n             */\n            /**\n             * CSS styles for the text label.\n             *\n             * In styled mode, the labels are styled by the\n             * `.highcharts-plot-band-label` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-style/\n             *         Blue and bold label\n             *\n             * @type      {Highcharts.CSSObject}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.style\n             */\n            /**\n             * The string text itself. A subset of HTML is supported.\n             *\n             * @type      {string}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.text\n             */\n            /**\n             * The text alignment for the label. While `align` determines where the\n             * texts anchor point is placed within the plot band, `textAlign` determines\n             * how the text is aligned against its anchor point. Possible values are\n             * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n             *         Vertical text in center position but text-aligned left\n             *\n             * @type       {Highcharts.AlignValue}\n             * @since      2.1\n             * @apioption  xAxis.plotBands.label.textAlign\n             */\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the labels.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     3.0.3\n             * @apioption xAxis.plotBands.label.useHTML\n             */\n            /**\n             * Vertical alignment of the label relative to the plot band. Can be one of\n             * \"top\", \"middle\" or \"bottom\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-verticalalign/\n             *         Vertically centered label\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type       {Highcharts.VerticalAlignValue}\n             * @default    top\n             * @since      2.1\n             * @apioption  xAxis.plotBands.label.verticalAlign\n             */\n            /**\n             * Horizontal position relative the alignment. Default varies by\n             * orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n             *         Aligned 10px from the right edge\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.x\n             */\n            /**\n             * Vertical position of the text baseline relative to the alignment. Default\n             * varies by orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-y/\n             *         Label on x axis\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.y\n             */\n            /**\n             * An array of lines stretching across the plot area, marking a specific\n             * value on one of the axes.\n             *\n             * In styled mode, the plot lines are styled by the\n             * `.highcharts-plot-line` class in addition to the `className` option.\n             *\n             * @type      {Array<*>}\n             * @product   highcharts highstock gantt\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         Basic plot line\n             * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n             *         Solid gauge plot line\n             * @apioption xAxis.plotLines\n             */\n            /**\n             * Flag to decide if plotLine should be rendered across all panes.\n             *\n             * @sample {highstock} stock/xaxis/plotlines-acrosspanes/\n             *         Plot lines on different panes\n             *\n             * @since     7.1.2\n             * @product   highstock\n             * @type      {boolean}\n             * @default   true\n             * @apioption xAxis.plotLines.acrossPanes\n             */\n            /**\n             * A custom class name, in addition to the default `highcharts-plot-line`,\n             * to apply to each individual line.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption xAxis.plotLines.className\n             */\n            /**\n             * The color of the line.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         A red line from X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {Highcharts.ColorString}\n             * @default   #999999\n             * @apioption xAxis.plotLines.color\n             */\n            /**\n             * The dashing or dot style for the plot line. For possible values see\n             * [this overview](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-dashstyle/\n             *         Dash and dot pattern\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @default   Solid\n             * @since     1.2\n             * @apioption xAxis.plotLines.dashStyle\n             */\n            /**\n             * An object defining mouse events for the plot line. Supported\n             * properties are `click`, `mouseover`, `mouseout`, `mousemove`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-events/\n             *         Mouse events demonstrated\n             *\n             * @since     1.2\n             * @apioption xAxis.plotLines.events\n             */\n            /**\n             * Click event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.click\n             */\n            /**\n             * Mouse move event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mousemove\n             */\n            /**\n             * Mouse out event on the corner of a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mouseout\n             */\n            /**\n             * Mouse over event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mouseover\n             */\n            /**\n             * An id used for identifying the plot line in Axis.removePlotLine.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             *\n             * @type      {string}\n             * @apioption xAxis.plotLines.id\n             */\n            /**\n             * The position of the line in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         Between two categories on X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotLines.value\n             */\n            /**\n             * The width or thickness of the plot line.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         2px wide line from X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @default   2\n             * @apioption xAxis.plotLines.width\n             */\n            /**\n             * The z index of the plot line within the chart.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-behind/\n             *         Behind plot lines by default\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above/\n             *         Above plot lines\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above-all/\n             *         Above plot lines and series\n             *\n             * @type      {number}\n             * @since     1.2\n             * @apioption xAxis.plotLines.zIndex\n             */\n            /**\n             * Text labels for the plot bands\n             *\n             * @apioption xAxis.plotLines.label\n             */\n            /**\n             * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n             * \"right\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n             *         Aligned to the right\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type       {Highcharts.AlignValue}\n             * @default    left\n             * @since      2.1\n             * @apioption  xAxis.plotLines.label.align\n             */\n            /**\n             * Callback JavaScript function to format the label. Useful properties like\n             * the value of plot line or the range of plot band (`from` & `to`\n             * properties) can be found in `this.options` object.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-plotbands-label-formatter\n             *         Label formatters for plot line and plot band.\n             * @type      {Highcharts.FormatterCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.label.formatter\n             */\n            /**\n             * Rotation of the text label in degrees. Defaults to 0 for horizontal plot\n             * lines and 90 for vertical lines.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n             *         Slanted text\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.rotation\n             */\n            /**\n             * CSS styles for the text label.\n             *\n             * In styled mode, the labels are styled by the\n             * `.highcharts-plot-line-label` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-style/\n             *         Blue and bold label\n             *\n             * @type      {Highcharts.CSSObject}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.style\n             */\n            /**\n             * The text itself. A subset of HTML is supported.\n             *\n             * @type      {string}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.text\n             */\n            /**\n             * The text alignment for the label. While `align` determines where the\n             * texts anchor point is placed within the plot band, `textAlign` determines\n             * how the text is aligned against its anchor point. Possible values are\n             * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-textalign/\n             *         Text label in bottom position\n             *\n             * @type      {Highcharts.AlignValue}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.textAlign\n             */\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the labels.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     3.0.3\n             * @apioption xAxis.plotLines.label.useHTML\n             */\n            /**\n             * Vertical alignment of the label relative to the plot line. Can be\n             * one of \"top\", \"middle\" or \"bottom\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n             *         Vertically centered label\n             *\n             * @type       {Highcharts.VerticalAlignValue}\n             * @default    {highcharts} top\n             * @default    {highstock} top\n             * @since      2.1\n             * @apioption  xAxis.plotLines.label.verticalAlign\n             */\n            /**\n             * Horizontal position relative the alignment. Default varies by\n             * orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n             *         Aligned 10px from the right edge\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.x\n             */\n            /**\n             * Vertical position of the text baseline relative to the alignment. Default\n             * varies by orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-y/\n             *         Label below the plot line\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.y\n             */\n            /**\n             *\n             * @type      {Array<*>}\n             * @extends   xAxis.plotBands\n             * @apioption yAxis.plotBands\n             */\n            /**\n             * In a gauge chart, this option determines the inner radius of the\n             * plot band that stretches along the perimeter. It can be given as\n             * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n             * By default, the inner radius is controlled by the [thickness](\n             * #yAxis.plotBands.thickness) option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.innerRadius\n             */\n            /**\n             * In a gauge chart, this option determines the outer radius of the\n             * plot band that stretches along the perimeter. It can be given as\n             * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @default   100%\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.outerRadius\n             */\n            /**\n             * In a gauge chart, this option sets the width of the plot band\n             * stretching along the perimeter. It can be given as a percentage\n             * string, like `\"10%\"`, or as a pixel number, like `10`. The default\n             * value 10 is the same as the default [tickLength](#yAxis.tickLength),\n             * thus making the plot band act as a background for the tick markers.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @default   10\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.thickness\n             */\n            /**\n             * @type      {Array<*>}\n             * @extends   xAxis.plotLines\n             * @apioption yAxis.plotLines\n             */\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Internal function to create the SVG path definition for a plot band.\n             *\n             * @function Highcharts.Axis#getPlotBandPath\n             *\n             * @param {number} from\n             *        The axis value to start from.\n             *\n             * @param {number} to\n             *        The axis value to end on.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The SVG path definition in array form.\n             */\n            getPlotBandPath: function (from, to) {\n                var toPath = this.getPlotLinePath({\n                        value: to,\n                        force: true,\n                        acrossPanes: this.options.acrossPanes\n                    }),\n                    path = this.getPlotLinePath({\n                        value: from,\n                        force: true,\n                        acrossPanes: this.options.acrossPanes\n                    }),\n                    result = [],\n                    i, \n                    // #4964 check if chart is inverted or plotband is on yAxis\n                    horiz = this.horiz,\n                    plus = 1,\n                    isFlat,\n                    outside = (from < this.min && to < this.min) ||\n                        (from > this.max && to > this.max);\n                if (path && toPath) {\n                    // Flat paths don't need labels (#3836)\n                    if (outside) {\n                        isFlat = path.toString() === toPath.toString();\n                        plus = 0;\n                    }\n                    // Go over each subpath - for panes in Highstock\n                    for (i = 0; i < path.length; i += 2) {\n                        var pathStart = path[i],\n                            pathEnd = path[i + 1],\n                            toPathStart = toPath[i],\n                            toPathEnd = toPath[i + 1];\n                        // Type checking all affected path segments. Consider something\n                        // smarter.\n                        if ((pathStart[0] === 'M' || pathStart[0] === 'L') &&\n                            (pathEnd[0] === 'M' || pathEnd[0] === 'L') &&\n                            (toPathStart[0] === 'M' || toPathStart[0] === 'L') &&\n                            (toPathEnd[0] === 'M' || toPathEnd[0] === 'L')) {\n                            // Add 1 pixel when coordinates are the same\n                            if (horiz && toPathStart[1] === pathStart[1]) {\n                                toPathStart[1] += plus;\n                                toPathEnd[1] += plus;\n                            }\n                            else if (!horiz && toPathStart[2] === pathStart[2]) {\n                                toPathStart[2] += plus;\n                                toPathEnd[2] += plus;\n                            }\n                            result.push(['M', pathStart[1], pathStart[2]], ['L', pathEnd[1], pathEnd[2]], ['L', toPathEnd[1], toPathEnd[2]], ['L', toPathStart[1], toPathStart[2]], ['Z']);\n                        }\n                        result.isFlat = isFlat;\n                    }\n                }\n                else { // outside the axis area\n                    path = null;\n                }\n                return result;\n            },\n            /**\n             * Add a plot band after render time.\n             *\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             *\n             * @function Highcharts.Axis#addPlotBand\n             *\n             * @param {Highcharts.AxisPlotBandsOptions} options\n             *        A configuration object for the plot band, as defined in\n             *        [xAxis.plotBands](https://api.highcharts.com/highcharts/xAxis.plotBands).\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             *         The added plot band.\n             */\n            addPlotBand: function (options) {\n                return this.addPlotBandOrLine(options, 'plotBands');\n            },\n            /**\n             * Add a plot line after render time.\n             *\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             *\n             * @function Highcharts.Axis#addPlotLine\n             *\n             * @param {Highcharts.AxisPlotLinesOptions} options\n             *        A configuration object for the plot line, as defined in\n             *        [xAxis.plotLines](https://api.highcharts.com/highcharts/xAxis.plotLines).\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             *         The added plot line.\n             */\n            addPlotLine: function (options) {\n                return this.addPlotBandOrLine(options, 'plotLines');\n            },\n            /**\n             * Add a plot band or plot line after render time. Called from addPlotBand\n             * and addPlotLine internally.\n             *\n             * @private\n             * @function Highcharts.Axis#addPlotBandOrLine\n             *\n             * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n             *        The plotBand or plotLine configuration object.\n             *\n             * @param {\"plotBands\"|\"plotLines\"} [coll]\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             */\n            addPlotBandOrLine: function (options, coll) {\n                var obj = new PlotLineOrBand(this,\n                    options).render(),\n                    userOptions = this.userOptions;\n                if (obj) { // #2189\n                    // Add it to the user options for exporting and Axis.update\n                    if (coll) {\n                        // Workaround Microsoft/TypeScript issue #32693\n                        var updatedOptions = (userOptions[coll] || []);\n                        updatedOptions.push(options);\n                        userOptions[coll] = updatedOptions;\n                    }\n                    this.plotLinesAndBands.push(obj);\n                    this._addedPlotLB = true;\n                }\n                return obj;\n            },\n            /**\n             * Remove a plot band or plot line from the chart by id. Called internally\n             * from `removePlotBand` and `removePlotLine`.\n             *\n             * @private\n             * @function Highcharts.Axis#removePlotBandOrLine\n             * @param {string} id\n             * @return {void}\n             */\n            removePlotBandOrLine: function (id) {\n                var plotLinesAndBands = this.plotLinesAndBands,\n                    options = this.options,\n                    userOptions = this.userOptions,\n                    i = plotLinesAndBands.length;\n                while (i--) {\n                    if (plotLinesAndBands[i].id === id) {\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                ([\n                    options.plotLines || [],\n                    userOptions.plotLines || [],\n                    options.plotBands || [],\n                    userOptions.plotBands || []\n                ]).forEach(function (arr) {\n                    i = arr.length;\n                    while (i--) {\n                        if ((arr[i] || {}).id === id) {\n                            erase(arr, arr[i]);\n                        }\n                    }\n                });\n            },\n            /**\n             * Remove a plot band by its id.\n             *\n             * @sample highcharts/members/axis-removeplotband/\n             *         Remove plot band by id\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             *\n             * @function Highcharts.Axis#removePlotBand\n             *\n             * @param {string} id\n             *        The plot band's `id` as given in the original configuration\n             *        object or in the `addPlotBand` option.\n             *\n             * @return {void}\n             */\n            removePlotBand: function (id) {\n                this.removePlotBandOrLine(id);\n            },\n            /**\n             * Remove a plot line by its id.\n             *\n             * @sample highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             *\n             * @function Highcharts.Axis#removePlotLine\n             *\n             * @param {string} id\n             *        The plot line's `id` as given in the original configuration\n             *        object or in the `addPlotLine` option.\n             */\n            removePlotLine: function (id) {\n                this.removePlotBandOrLine(id);\n            }\n        });\n        H.PlotLineOrBand = PlotLineOrBand;\n\n        return H.PlotLineOrBand;\n    });\n    _registerModule(_modules, 'parts/Tooltip.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var doc = H.doc;\n        var clamp = U.clamp,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            pick = U.pick,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout,\n            timeUnits = U.timeUnits;\n        /**\n         * Callback function to format the text of the tooltip from scratch.\n         *\n         * In case of single or shared tooltips, a string should be be returned. In case\n         * of splitted tooltips, it should return an array where the first item is the\n         * header, and subsequent items are mapped to the points. Return `false` to\n         * disable tooltip for a specific point on series.\n         *\n         * @callback Highcharts.TooltipFormatterCallbackFunction\n         *\n         * @param {Highcharts.TooltipFormatterContextObject} this\n         *        Context to format\n         *\n         * @param {Highcharts.Tooltip} tooltip\n         *        The tooltip instance\n         *\n         * @return {false|string|Array<(string|null|undefined)>|null|undefined}\n         *         Formatted text or false\n         */\n        /**\n         * @interface Highcharts.TooltipFormatterContextObject\n         */ /**\n        * @name Highcharts.TooltipFormatterContextObject#color\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#colorIndex\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#key\n        * @type {number}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#percentage\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#points\n        * @type {Array<Highcharts.TooltipFormatterContextObject>|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#series\n        * @type {Highcharts.Series}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#total\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#x\n        * @type {number}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#y\n        * @type {number}\n        */\n        /**\n         * A callback function to place the tooltip in a specific position.\n         *\n         * @callback Highcharts.TooltipPositionerCallbackFunction\n         *\n         * @param {Highcharts.Tooltip} this\n         * Tooltip context of the callback.\n         *\n         * @param {number} labelWidth\n         * Width of the tooltip.\n         *\n         * @param {number} labelHeight\n         * Height of the tooltip.\n         *\n         * @param {Highcharts.Point|Highcharts.TooltipPositionerPointObject} point\n         * Point information for positioning a tooltip.\n         *\n         * @return {Highcharts.PositionObject}\n         * New position for the tooltip.\n         */\n        /**\n         * Point information for positioning a tooltip.\n         *\n         * @interface Highcharts.TooltipPositionerPointObject\n         */ /**\n        * If `tooltip.split` option is enabled and positioner is called for each of the\n        * boxes separately, this property indicates the call on the xAxis header, which\n        * is not a point itself.\n        * @name Highcharts.TooltipPositionerPointObject#isHeader\n        * @type {boolean}\n        */ /**\n        * The reference point relative to the plot area. Add chart.plotLeft to get the\n        * full coordinates.\n        * @name Highcharts.TooltipPositionerPointObject#plotX\n        * @type {number}\n        */ /**\n        * The reference point relative to the plot area. Add chart.plotTop to get the\n        * full coordinates.\n        * @name Highcharts.TooltipPositionerPointObject#plotY\n        * @type {number}\n        */\n        /**\n         * @typedef {\"callout\"|\"circle\"|\"square\"} Highcharts.TooltipShapeValue\n         */\n        ''; // separates doclets above from variables below\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Tooltip of a chart.\n         *\n         * @class\n         * @name Highcharts.Tooltip\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.TooltipOptions} options\n         * Tooltip options.\n         */\n        var Tooltip = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Tooltip(chart, options) {\n                    this.container = void 0;\n                this.crosshairs = [];\n                this.distance = 0;\n                this.isHidden = true;\n                this.isSticky = false;\n                this.now = {};\n                this.options = {};\n                this.outside = false;\n                this.chart = chart;\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * In styled mode, apply the default filter for the tooltip drop-shadow. It\n             * needs to have an id specific to the chart, otherwise there will be issues\n             * when one tooltip adopts the filter of a different chart, specifically one\n             * where the container is hidden.\n             *\n             * @private\n             * @function Highcharts.Tooltip#applyFilter\n             */\n            Tooltip.prototype.applyFilter = function () {\n                var chart = this.chart;\n                chart.renderer.definition({\n                    tagName: 'filter',\n                    id: 'drop-shadow-' + chart.index,\n                    opacity: 0.5,\n                    children: [{\n                            tagName: 'feGaussianBlur',\n                            'in': 'SourceAlpha',\n                            stdDeviation: 1\n                        }, {\n                            tagName: 'feOffset',\n                            dx: 1,\n                            dy: 1\n                        }, {\n                            tagName: 'feComponentTransfer',\n                            children: [{\n                                    tagName: 'feFuncA',\n                                    type: 'linear',\n                                    slope: 0.3\n                                }]\n                        }, {\n                            tagName: 'feMerge',\n                            children: [{\n                                    tagName: 'feMergeNode'\n                                }, {\n                                    tagName: 'feMergeNode',\n                                    'in': 'SourceGraphic'\n                                }]\n                        }]\n                });\n                chart.renderer.definition({\n                    tagName: 'style',\n                    textContent: '.highcharts-tooltip-' + chart.index + '{' +\n                        'filter:url(#drop-shadow-' + chart.index + ')' +\n                        '}'\n                });\n            };\n            /**\n             * Build the body (lines) of the tooltip by iterating over the items and\n             * returning one entry for each item, abstracting this functionality allows\n             * to easily overwrite and extend it.\n             *\n             * @private\n             * @function Highcharts.Tooltip#bodyFormatter\n             * @param {Array<(Highcharts.Point|Highcharts.Series)>} items\n             * @return {Array<string>}\n             */\n            Tooltip.prototype.bodyFormatter = function (items) {\n                return items.map(function (item) {\n                    var tooltipOptions = item.series.tooltipOptions;\n                    return (tooltipOptions[(item.point.formatPrefix || 'point') + 'Formatter'] ||\n                        item.point.tooltipFormatter).call(item.point, tooltipOptions[(item.point.formatPrefix || 'point') + 'Format'] || '');\n                });\n            };\n            /**\n             * Destroy the single tooltips in a split tooltip.\n             * If the tooltip is active then it is not destroyed, unless forced to.\n             *\n             * @private\n             * @function Highcharts.Tooltip#cleanSplit\n             *\n             * @param {boolean} [force]\n             *        Force destroy all tooltips.\n             */\n            Tooltip.prototype.cleanSplit = function (force) {\n                this.chart.series.forEach(function (series) {\n                    var tt = series && series.tt;\n                    if (tt) {\n                        if (!tt.isActive || force) {\n                            series.tt = tt.destroy();\n                        }\n                        else {\n                            tt.isActive = false;\n                        }\n                    }\n                });\n            };\n            /**\n             * In case no user defined formatter is given, this will be used. Note that\n             * the context here is an object holding point, series, x, y etc.\n             *\n             * @function Highcharts.Tooltip#defaultFormatter\n             *\n             * @param {Highcharts.Tooltip} tooltip\n             *\n             * @return {Array<string>}\n             */\n            Tooltip.prototype.defaultFormatter = function (tooltip) {\n                var items = this.points || splat(this),\n                    s;\n                // Build the header\n                s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n                // build the values\n                s = s.concat(tooltip.bodyFormatter(items));\n                // footer\n                s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n                return s;\n            };\n            /**\n             * Removes and destroys the tooltip and its elements.\n             *\n             * @function Highcharts.Tooltip#destroy\n             */\n            Tooltip.prototype.destroy = function () {\n                // Destroy and clear local variables\n                if (this.label) {\n                    this.label = this.label.destroy();\n                }\n                if (this.split && this.tt) {\n                    this.cleanSplit(this.chart, true);\n                    this.tt = this.tt.destroy();\n                }\n                if (this.renderer) {\n                    this.renderer = this.renderer.destroy();\n                    discardElement(this.container);\n                }\n                U.clearTimeout(this.hideTimer);\n                U.clearTimeout(this.tooltipTimeout);\n            };\n            /**\n             * Extendable method to get the anchor position of the tooltip\n             * from a point or set of points\n             *\n             * @private\n             * @function Highcharts.Tooltip#getAnchor\n             *\n             * @param {Highcharts.Point|Array<Highcharts.Point>} points\n             *\n             * @param {Highcharts.PointerEventObject} [mouseEvent]\n             *\n             * @return {Array<number>}\n             */\n            Tooltip.prototype.getAnchor = function (points, mouseEvent) {\n                var ret,\n                    chart = this.chart,\n                    pointer = chart.pointer,\n                    inverted = chart.inverted,\n                    plotTop = chart.plotTop,\n                    plotLeft = chart.plotLeft,\n                    plotX = 0,\n                    plotY = 0,\n                    yAxis,\n                    xAxis;\n                points = splat(points);\n                // When tooltip follows mouse, relate the position to the mouse\n                if (this.followPointer && mouseEvent) {\n                    if (typeof mouseEvent.chartX === 'undefined') {\n                        mouseEvent = pointer.normalize(mouseEvent);\n                    }\n                    ret = [\n                        mouseEvent.chartX - plotLeft,\n                        mouseEvent.chartY - plotTop\n                    ];\n                    // Some series types use a specificly calculated tooltip position for\n                    // each point\n                }\n                else if (points[0].tooltipPos) {\n                    ret = points[0].tooltipPos;\n                    // When shared, use the average position\n                }\n                else {\n                    points.forEach(function (point) {\n                        yAxis = point.series.yAxis;\n                        xAxis = point.series.xAxis;\n                        plotX += point.plotX +\n                            (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n                        plotY += (point.plotLow ?\n                            (point.plotLow + point.plotHigh) / 2 :\n                            point.plotY) + (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n                    });\n                    plotX /= points.length;\n                    plotY /= points.length;\n                    ret = [\n                        inverted ? chart.plotWidth - plotY : plotX,\n                        this.shared && !inverted && points.length > 1 && mouseEvent ?\n                            // place shared tooltip next to the mouse (#424)\n                            mouseEvent.chartY - plotTop :\n                            inverted ? chart.plotHeight - plotX : plotY\n                    ];\n                }\n                return ret.map(Math.round);\n            };\n            /**\n             * Get the optimal date format for a point, based on a range.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getDateFormat\n             *\n             * @param {number} range\n             *        The time range\n             *\n             * @param {number} date\n             *        The date of the point in question\n             *\n             * @param {number} startOfWeek\n             *        An integer representing the first day of the week, where 0 is\n             *        Sunday.\n             *\n             * @param {Highcharts.Dictionary<string>} dateTimeLabelFormats\n             *        A map of time units to formats.\n             *\n             * @return {string}\n             *         The optimal date format for a point.\n             */\n            Tooltip.prototype.getDateFormat = function (range, date, startOfWeek, dateTimeLabelFormats) {\n                var time = this.chart.time, dateStr = time.dateFormat('%m-%d %H:%M:%S.%L', date), format, n, blank = '01-01 00:00:00.000', strpos = {\n                        millisecond: 15,\n                        second: 12,\n                        minute: 9,\n                        hour: 6,\n                        day: 3\n                    }, lastN = 'millisecond'; // for sub-millisecond data, #4223\n                    for (n in timeUnits) { // eslint-disable-line guard-for-in\n                        // If the range is exactly one week and we're looking at a\n                        // Sunday/Monday, go for the week format\n                        if (range === timeUnits.week &&\n                            +time.dateFormat('%w', date) === startOfWeek &&\n                            dateStr.substr(6) === blank.substr(6)) {\n                            n = 'week';\n                        break;\n                    }\n                    // The first format that is too great for the range\n                    if (timeUnits[n] > range) {\n                        n = lastN;\n                        break;\n                    }\n                    // If the point is placed every day at 23:59, we need to show\n                    // the minutes as well. #2637.\n                    if (strpos[n] &&\n                        dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n                        break;\n                    }\n                    // Weeks are outside the hierarchy, only apply them on\n                    // Mondays/Sundays like in the first condition\n                    if (n !== 'week') {\n                        lastN = n;\n                    }\n                }\n                if (n) {\n                    format = time.resolveDTLFormat(dateTimeLabelFormats[n]).main;\n                }\n                return format;\n            };\n            /**\n             * Creates the Tooltip label element if it does not exist, then returns it.\n             *\n             * @function Highcharts.Tooltip#getLabel\n             * @return {Highcharts.SVGElement}\n             */\n            Tooltip.prototype.getLabel = function () {\n                var _a,\n                    _b;\n                var tooltip = this,\n                    renderer = this.chart.renderer,\n                    styledMode = this.chart.styledMode,\n                    options = this.options,\n                    className = ('tooltip' + (defined(options.className) ?\n                        ' ' + options.className :\n                        '')),\n                    pointerEvents = (((_a = options.style) === null || _a === void 0 ? void 0 : _a.pointerEvents) ||\n                        (!this.followPointer && options.stickOnContact ? 'auto' : 'none')),\n                    container,\n                    set,\n                    onMouseEnter = function () {\n                        tooltip.inContact = true;\n                }, onMouseLeave = function () {\n                    var series = tooltip.chart.hoverSeries;\n                    tooltip.inContact = false;\n                    if (series &&\n                        series.onMouseOut) {\n                        series.onMouseOut();\n                    }\n                };\n                if (!this.label) {\n                    if (this.outside) {\n                        /**\n                         * Reference to the tooltip's container, when\n                         * [Highcharts.Tooltip#outside] is set to true, otherwise\n                         * it's undefined.\n                         *\n                         * @name Highcharts.Tooltip#container\n                         * @type {Highcharts.HTMLDOMElement|undefined}\n                         */\n                        this.container = container = H.doc.createElement('div');\n                        container.className = 'highcharts-tooltip-container';\n                        css(container, {\n                            position: 'absolute',\n                            top: '1px',\n                            pointerEvents: pointerEvents,\n                            zIndex: 3\n                        });\n                        H.doc.body.appendChild(container);\n                        /**\n                         * Reference to the tooltip's renderer, when\n                         * [Highcharts.Tooltip#outside] is set to true, otherwise\n                         * it's undefined.\n                         *\n                         * @name Highcharts.Tooltip#renderer\n                         * @type {Highcharts.SVGRenderer|undefined}\n                         */\n                        this.renderer = renderer = new H.Renderer(container, 0, 0, (_b = this.chart.options.chart) === null || _b === void 0 ? void 0 : _b.style, void 0, void 0, renderer.styledMode);\n                    }\n                    // Create the label\n                    if (this.split) {\n                        this.label = renderer.g(className);\n                    }\n                    else {\n                        this.label = renderer\n                            .label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, className)\n                            .attr({\n                            padding: options.padding,\n                            r: options.borderRadius\n                        });\n                        if (!styledMode) {\n                            this.label\n                                .attr({\n                                fill: options.backgroundColor,\n                                'stroke-width': options.borderWidth\n                            })\n                                // #2301, #2657\n                                .css(options.style)\n                                .css({ pointerEvents: pointerEvents })\n                                .shadow(options.shadow);\n                        }\n                    }\n                    if (styledMode) {\n                        // Apply the drop-shadow filter\n                        this.applyFilter();\n                        this.label.addClass('highcharts-tooltip-' + this.chart.index);\n                    }\n                    // Split tooltip use updateTooltipContainer to position the tooltip\n                    // container.\n                    if (tooltip.outside && !tooltip.split) {\n                        var label_1 = this.label;\n                        var xSetter_1 = label_1.xSetter,\n                            ySetter_1 = label_1.ySetter;\n                        label_1.xSetter = function (value) {\n                            xSetter_1.call(label_1, tooltip.distance);\n                            container.style.left = value + 'px';\n                        };\n                        label_1.ySetter = function (value) {\n                            ySetter_1.call(label_1, tooltip.distance);\n                            container.style.top = value + 'px';\n                        };\n                    }\n                    this.label\n                        .on('mouseenter', onMouseEnter)\n                        .on('mouseleave', onMouseLeave)\n                        .attr({ zIndex: 8 })\n                        .add();\n                }\n                return this.label;\n            };\n            /**\n             * Place the tooltip in a chart without spilling over\n             * and not covering the point it self.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getPosition\n             *\n             * @param {number} boxWidth\n             *\n             * @param {number} boxHeight\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {Highcharts.PositionObject}\n             */\n            Tooltip.prototype.getPosition = function (boxWidth, boxHeight, point) {\n                var chart = this.chart,\n                    distance = this.distance,\n                    ret = {}, \n                    // Don't use h if chart isn't inverted (#7242) ???\n                    h = (chart.inverted && point.h) || 0, // #4117 ???\n                    swapped,\n                    outside = this.outside,\n                    outerWidth = outside ?\n                        // substract distance to prevent scrollbars\n                        doc.documentElement.clientWidth - 2 * distance :\n                        chart.chartWidth,\n                    outerHeight = outside ?\n                        Math.max(doc.body.scrollHeight,\n                    doc.documentElement.scrollHeight,\n                    doc.body.offsetHeight,\n                    doc.documentElement.offsetHeight,\n                    doc.documentElement.clientHeight) :\n                        chart.chartHeight,\n                    chartPosition = chart.pointer.getChartPosition(),\n                    containerScaling = chart.containerScaling,\n                    scaleX = function (val) { return ( // eslint-disable-line no-confusing-arrow\n                    containerScaling ? val * containerScaling.scaleX : val); },\n                    scaleY = function (val) { return ( // eslint-disable-line no-confusing-arrow\n                    containerScaling ? val * containerScaling.scaleY : val); }, \n                    // Build parameter arrays for firstDimension()/secondDimension()\n                    buildDimensionArray = function (dim) {\n                        var isX = dim === 'x';\n                    return [\n                        dim,\n                        isX ? outerWidth : outerHeight,\n                        isX ? boxWidth : boxHeight\n                    ].concat(outside ? [\n                        // If we are using tooltip.outside, we need to scale the\n                        // position to match scaling of the container in case there\n                        // is a transform/zoom on the container. #11329\n                        isX ? scaleX(boxWidth) : scaleY(boxHeight),\n                        isX ? chartPosition.left - distance +\n                            scaleX(point.plotX + chart.plotLeft) :\n                            chartPosition.top - distance +\n                                scaleY(point.plotY + chart.plotTop),\n                        0,\n                        isX ? outerWidth : outerHeight\n                    ] : [\n                        // Not outside, no scaling is needed\n                        isX ? boxWidth : boxHeight,\n                        isX ? point.plotX + chart.plotLeft :\n                            point.plotY + chart.plotTop,\n                        isX ? chart.plotLeft : chart.plotTop,\n                        isX ? chart.plotLeft + chart.plotWidth :\n                            chart.plotTop + chart.plotHeight\n                    ]);\n                }, first = buildDimensionArray('y'), second = buildDimensionArray('x'), \n                // The far side is right or bottom\n                preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n                /*\n                 * Handle the preferred dimension. When the preferred dimension is\n                 * tooltip on top or bottom of the point, it will look for space\n                 * there.\n                 *\n                 * @private\n                 */\n                firstDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n                point, min, max) {\n                    var scaledDist = dim === 'y' ?\n                            scaleY(distance) : scaleX(distance),\n                        scaleDiff = (innerSize - scaledInnerSize) / 2,\n                        roomLeft = scaledInnerSize < point - distance,\n                        roomRight = point + distance + scaledInnerSize < outerSize,\n                        alignedLeft = point - scaledDist - innerSize + scaleDiff,\n                        alignedRight = point + scaledDist - scaleDiff;\n                    if (preferFarSide && roomRight) {\n                        ret[dim] = alignedRight;\n                    }\n                    else if (!preferFarSide && roomLeft) {\n                        ret[dim] = alignedLeft;\n                    }\n                    else if (roomLeft) {\n                        ret[dim] = Math.min(max - scaledInnerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n                    }\n                    else if (roomRight) {\n                        ret[dim] = Math.max(min, alignedRight + h + innerSize > outerSize ?\n                            alignedRight :\n                            alignedRight + h);\n                    }\n                    else {\n                        return false;\n                    }\n                }, \n                /*\n                 * Handle the secondary dimension. If the preferred dimension is\n                 * tooltip on top or bottom of the point, the second dimension is to\n                 * align the tooltip above the point, trying to align center but\n                 * allowing left or right align within the chart box.\n                 *\n                 * @private\n                 */\n                secondDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n                point) {\n                    var retVal;\n                    // Too close to the edge, return false and swap dimensions\n                    if (point < distance || point > outerSize - distance) {\n                        retVal = false;\n                        // Align left/top\n                    }\n                    else if (point < innerSize / 2) {\n                        ret[dim] = 1;\n                        // Align right/bottom\n                    }\n                    else if (point > outerSize - scaledInnerSize / 2) {\n                        ret[dim] = outerSize - scaledInnerSize - 2;\n                        // Align center\n                    }\n                    else {\n                        ret[dim] = point - innerSize / 2;\n                    }\n                    return retVal;\n                }, \n                /*\n                 * Swap the dimensions\n                 */\n                swap = function (count) {\n                    var temp = first;\n                    first = second;\n                    second = temp;\n                    swapped = count;\n                }, run = function () {\n                    if (firstDimension.apply(0, first) !== false) {\n                        if (secondDimension.apply(0, second) === false &&\n                            !swapped) {\n                            swap(true);\n                            run();\n                        }\n                    }\n                    else if (!swapped) {\n                        swap(true);\n                        run();\n                    }\n                    else {\n                        ret.x = ret.y = 0;\n                    }\n                };\n                // Under these conditions, prefer the tooltip on the side of the point\n                if (chart.inverted || this.len > 1) {\n                    swap();\n                }\n                run();\n                return ret;\n            };\n            /**\n             * Get the best X date format based on the closest point range on the axis.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getXDateFormat\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *\n             * @param {Highcharts.Axis} xAxis\n             *\n             * @return {string}\n             */\n            Tooltip.prototype.getXDateFormat = function (point, options, xAxis) {\n                var xDateFormat,\n                    dateTimeLabelFormats = options.dateTimeLabelFormats,\n                    closestPointRange = xAxis && xAxis.closestPointRange;\n                if (closestPointRange) {\n                    xDateFormat = this.getDateFormat(closestPointRange, point.x, xAxis.options.startOfWeek, dateTimeLabelFormats);\n                }\n                else {\n                    xDateFormat = dateTimeLabelFormats.day;\n                }\n                return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n            };\n            /**\n             * Hides the tooltip with a fade out animation.\n             *\n             * @function Highcharts.Tooltip#hide\n             *\n             * @param {number} [delay]\n             *        The fade out in milliseconds. If no value is provided the value\n             *        of the tooltip.hideDelay option is used. A value of 0 disables\n             *        the fade out animation.\n             */\n            Tooltip.prototype.hide = function (delay) {\n                var tooltip = this;\n                // disallow duplicate timers (#1728, #1766)\n                U.clearTimeout(this.hideTimer);\n                delay = pick(delay, this.options.hideDelay, 500);\n                if (!this.isHidden) {\n                    this.hideTimer = syncTimeout(function () {\n                        // If there is a delay, do fadeOut with the default duration. If\n                        // the hideDelay is 0, we assume no animation is wanted, so we\n                        // pass 0 duration. #12994.\n                        tooltip.getLabel().fadeOut(delay ? void 0 : delay);\n                        tooltip.isHidden = true;\n                    }, delay);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Tooltip#init\n             *\n             * @param {Highcharts.Chart} chart\n             *        The chart instance.\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *        Tooltip options.\n             */\n            Tooltip.prototype.init = function (chart, options) {\n                /**\n                 * Chart of the tooltip.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#chart\n                 * @type {Highcharts.Chart}\n                 */\n                this.chart = chart;\n                /**\n                 * Used tooltip options.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#options\n                 * @type {Highcharts.TooltipOptions}\n                 */\n                this.options = options;\n                /**\n                 * List of crosshairs.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#crosshairs\n                 * @type {Array<null>}\n                 */\n                this.crosshairs = [];\n                /**\n                 * Current values of x and y when animating.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#now\n                 * @type {Highcharts.PositionObject}\n                 */\n                this.now = { x: 0, y: 0 };\n                /**\n                 * Tooltips are initially hidden.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#isHidden\n                 * @type {boolean}\n                 */\n                this.isHidden = true;\n                /**\n                 * True, if the tooltip is split into one label per series, with the\n                 * header close to the axis.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#split\n                 * @type {boolean|undefined}\n                 */\n                this.split = options.split && !chart.inverted && !chart.polar;\n                /**\n                 * When the tooltip is shared, the entire plot area will capture mouse\n                 * movement or touch events.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#shared\n                 * @type {boolean|undefined}\n                 */\n                this.shared = options.shared || this.split;\n                /**\n                 * Whether to allow the tooltip to render outside the chart's SVG\n                 * element box. By default (false), the tooltip is rendered within the\n                 * chart's SVG element, which results in the tooltip being aligned\n                 * inside the chart area.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#outside\n                 * @type {boolean}\n                 *\n                 * @todo\n                 * Split tooltip does not support outside in the first iteration. Should\n                 * not be too complicated to implement.\n                 */\n                this.outside = pick(options.outside, Boolean(chart.scrollablePixelsX || chart.scrollablePixelsY));\n            };\n            /**\n             * Returns true, if the pointer is in contact with the tooltip tracker.\n             */\n            Tooltip.prototype.isStickyOnContact = function () {\n                return !!(!this.followPointer &&\n                    this.options.stickOnContact &&\n                    this.inContact);\n            };\n            /**\n             * Moves the tooltip with a soft animation to a new position.\n             *\n             * @private\n             * @function Highcharts.Tooltip#move\n             *\n             * @param {number} x\n             *\n             * @param {number} y\n             *\n             * @param {number} anchorX\n             *\n             * @param {number} anchorY\n             */\n            Tooltip.prototype.move = function (x, y, anchorX, anchorY) {\n                var tooltip = this,\n                    now = tooltip.now,\n                    animate = tooltip.options.animation !== false &&\n                        !tooltip.isHidden &&\n                        // When we get close to the target position, abort animation and\n                        // land on the right place (#3056)\n                        (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1),\n                    skipAnchor = tooltip.followPointer || tooltip.len > 1;\n                // Get intermediate values for animation\n                extend(now, {\n                    x: animate ? (2 * now.x + x) / 3 : x,\n                    y: animate ? (now.y + y) / 2 : y,\n                    anchorX: skipAnchor ?\n                        void 0 :\n                        animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n                    anchorY: skipAnchor ?\n                        void 0 :\n                        animate ? (now.anchorY + anchorY) / 2 : anchorY\n                });\n                // Move to the intermediate value\n                tooltip.getLabel().attr(now);\n                tooltip.drawTracker();\n                // Run on next tick of the mouse tracker\n                if (animate) {\n                    // Never allow two timeouts\n                    U.clearTimeout(this.tooltipTimeout);\n                    // Set the fixed interval ticking for the smooth tooltip\n                    this.tooltipTimeout = setTimeout(function () {\n                        // The interval function may still be running during destroy,\n                        // so check that the chart is really there before calling.\n                        if (tooltip) {\n                            tooltip.move(x, y, anchorX, anchorY);\n                        }\n                    }, 32);\n                }\n            };\n            /**\n             * Refresh the tooltip's text and position.\n             *\n             * @function Highcharts.Tooltip#refresh\n             *\n             * @param {Highcharts.Point|Array<Highcharts.Point>} pointOrPoints\n             *        Either a point or an array of points.\n             *\n             * @param {Highcharts.PointerEventObject} [mouseEvent]\n             *        Mouse event, that is responsible for the refresh and should be\n             *        used for the tooltip update.\n             */\n            Tooltip.prototype.refresh = function (pointOrPoints, mouseEvent) {\n                var tooltip = this,\n                    chart = this.chart,\n                    options = tooltip.options,\n                    x,\n                    y,\n                    point = pointOrPoints,\n                    anchor,\n                    textConfig = {},\n                    text,\n                    pointConfig = [],\n                    formatter = options.formatter || tooltip.defaultFormatter,\n                    shared = tooltip.shared,\n                    currentSeries,\n                    styledMode = chart.styledMode;\n                if (!options.enabled) {\n                    return;\n                }\n                U.clearTimeout(this.hideTimer);\n                // get the reference point coordinates (pie charts use tooltipPos)\n                tooltip.followPointer = splat(point)[0].series.tooltipOptions\n                    .followPointer;\n                anchor = tooltip.getAnchor(point, mouseEvent);\n                x = anchor[0];\n                y = anchor[1];\n                // shared tooltip, array is sent over\n                if (shared &&\n                    !(point.series &&\n                        point.series.noSharedTooltip)) {\n                    chart.pointer.applyInactiveState(point);\n                    // Now set hover state for the choosen ones:\n                    point.forEach(function (item) {\n                        item.setState('hover');\n                        pointConfig.push(item.getLabelConfig());\n                    });\n                    textConfig = {\n                        x: point[0].category,\n                        y: point[0].y\n                    };\n                    textConfig.points = pointConfig;\n                    point = point[0];\n                    // single point tooltip\n                }\n                else {\n                    textConfig = point.getLabelConfig();\n                }\n                this.len = pointConfig.length; // #6128\n                text = formatter.call(textConfig, tooltip);\n                // register the current series\n                currentSeries = point.series;\n                this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n                // update the inner HTML\n                if (text === false) {\n                    this.hide();\n                }\n                else {\n                    // update text\n                    if (tooltip.split) {\n                        this.renderSplit(text, splat(pointOrPoints));\n                    }\n                    else {\n                        var label = tooltip.getLabel();\n                        // Prevent the tooltip from flowing over the chart box (#6659)\n                        if (!options.style.width || styledMode) {\n                            label.css({\n                                width: this.chart.spacingBox.width + 'px'\n                            });\n                        }\n                        label.attr({\n                            text: text && text.join ?\n                                text.join('') :\n                                text\n                        });\n                        // Set the stroke color of the box to reflect the point\n                        label.removeClass(/highcharts-color-[\\d]+/g)\n                            .addClass('highcharts-color-' +\n                            pick(point.colorIndex, currentSeries.colorIndex));\n                        if (!styledMode) {\n                            label.attr({\n                                stroke: (options.borderColor ||\n                                    point.color ||\n                                    currentSeries.color ||\n                                    '#666666')\n                            });\n                        }\n                        tooltip.updatePosition({\n                            plotX: x,\n                            plotY: y,\n                            negative: point.negative,\n                            ttBelow: point.ttBelow,\n                            h: anchor[2] || 0\n                        });\n                    }\n                    // show it\n                    if (tooltip.isHidden && tooltip.label) {\n                        tooltip.label.attr({\n                            opacity: 1\n                        }).show();\n                    }\n                    tooltip.isHidden = false;\n                }\n                fireEvent(this, 'refresh');\n            };\n            /**\n             * Render the split tooltip. Loops over each point's text and adds\n             * a label next to the point, then uses the distribute function to\n             * find best non-overlapping positions.\n             *\n             * @private\n             * @function Highcharts.Tooltip#renderSplit\n             *\n             * @param {string|Array<(boolean|string)>} labels\n             *\n             * @param {Array<Highcharts.Point>} points\n             */\n            Tooltip.prototype.renderSplit = function (labels, points) {\n                var tooltip = this;\n                var chart = tooltip.chart,\n                    _a = tooltip.chart,\n                    chartWidth = _a.chartWidth,\n                    chartHeight = _a.chartHeight,\n                    plotHeight = _a.plotHeight,\n                    plotLeft = _a.plotLeft,\n                    plotTop = _a.plotTop,\n                    pointer = _a.pointer,\n                    ren = _a.renderer,\n                    _b = _a.scrollablePixelsY,\n                    scrollablePixelsY = _b === void 0 ? 0 : _b,\n                    _c = _a.scrollingContainer,\n                    _d = _c === void 0 ? { scrollLeft: 0,\n                    scrollTop: 0 } : _c,\n                    scrollLeft = _d.scrollLeft,\n                    scrollTop = _d.scrollTop,\n                    styledMode = _a.styledMode,\n                    distance = tooltip.distance,\n                    options = tooltip.options,\n                    positioner = tooltip.options.positioner;\n                // The area which the tooltip should be limited to. Limit to scrollable\n                // plot area if enabled, otherwise limit to the chart container.\n                var bounds = {\n                        left: scrollLeft,\n                        right: scrollLeft + chartWidth,\n                        top: scrollTop,\n                        bottom: scrollTop + chartHeight\n                    };\n                var tooltipLabel = tooltip.getLabel();\n                var headerTop = Boolean(chart.xAxis[0] && chart.xAxis[0].opposite);\n                var distributionBoxTop = plotTop + scrollTop;\n                var headerHeight = 0;\n                var adjustedPlotHeight = plotHeight - scrollablePixelsY;\n                /**\n                 * Calculates the anchor position for the partial tooltip\n                 *\n                 * @private\n                 * @param {Highcharts.Point} point The point related to the tooltip\n                 * @return {object} Returns an object with anchorX and anchorY\n                 */\n                function getAnchor(point) {\n                    var isHeader = point.isHeader,\n                        _a = point.plotX,\n                        plotX = _a === void 0 ? 0 : _a,\n                        _b = point.plotY,\n                        plotY = _b === void 0 ? 0 : _b,\n                        series = point.series;\n                    var anchorX;\n                    var anchorY;\n                    if (isHeader) {\n                        // Set anchorX to plotX\n                        anchorX = plotLeft + plotX;\n                        // Set anchorY to center of visible plot area.\n                        anchorY = plotTop + plotHeight / 2;\n                    }\n                    else {\n                        var xAxis = series.xAxis,\n                            yAxis = series.yAxis;\n                        // Set anchorX to plotX. Limit to within xAxis.\n                        anchorX = xAxis.pos + clamp(plotX, -distance, xAxis.len + distance);\n                        // Set anchorY, limit to the scrollable plot area\n                        if (yAxis.pos + plotY >= scrollTop + plotTop &&\n                            yAxis.pos + plotY <= scrollTop + plotTop + plotHeight - scrollablePixelsY) {\n                            anchorY = yAxis.pos + plotY;\n                        }\n                    }\n                    // Limit values to plot area\n                    anchorX = clamp(anchorX, bounds.left - distance, bounds.right + distance);\n                    return { anchorX: anchorX, anchorY: anchorY };\n                }\n                /**\n                 * Calculates the position of the partial tooltip\n                 *\n                 * @private\n                 * @param {number} anchorX The partial tooltip anchor x position\n                 * @param {number} anchorY The partial tooltip anchor y position\n                 * @param {boolean} isHeader Whether the partial tooltip is a header\n                 * @param {number} boxWidth Width of the partial tooltip\n                 * @return {Highcharts.PositionObject} Returns the partial tooltip x and\n                 * y position\n                 */\n                function defaultPositioner(anchorX, anchorY, isHeader, boxWidth, alignedLeft) {\n                    if (alignedLeft === void 0) { alignedLeft = true; }\n                    var y;\n                    var x;\n                    if (isHeader) {\n                        y = headerTop ? 0 : adjustedPlotHeight;\n                        x = clamp(anchorX - (boxWidth / 2), bounds.left, bounds.right - boxWidth);\n                    }\n                    else {\n                        y = anchorY - distributionBoxTop;\n                        x = alignedLeft ?\n                            anchorX - boxWidth - distance :\n                            anchorX + distance;\n                        x = clamp(x, alignedLeft ? x : bounds.left, bounds.right);\n                    }\n                    // NOTE: y is relative to distributionBoxTop\n                    return { x: x, y: y };\n                }\n                /**\n                 * Updates the attributes and styling of the partial tooltip. Creates a\n                 * new partial tooltip if it does not exists.\n                 *\n                 * @private\n                 * @param {Highcharts.SVGElement|undefined} partialTooltip\n                 *  The partial tooltip to update\n                 * @param {Highcharts.Point} point\n                 *  The point related to the partial tooltip\n                 * @param {boolean|string} str The text for the partial tooltip\n                 * @return {Highcharts.SVGElement} Returns the updated partial tooltip\n                 */\n                function updatePartialTooltip(partialTooltip, point, str) {\n                    var tt = partialTooltip;\n                    var isHeader = point.isHeader,\n                        series = point.series;\n                    var colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none');\n                    if (!tt) {\n                        var attribs = {\n                                padding: options.padding,\n                                r: options.borderRadius\n                            };\n                        if (!styledMode) {\n                            attribs.fill = options.backgroundColor;\n                            attribs['stroke-width'] = options.borderWidth;\n                        }\n                        tt = ren\n                            .label('', 0, 0, (options[isHeader ? 'headerShape' : 'shape']) ||\n                            'callout', void 0, void 0, options.useHTML)\n                            .addClass((isHeader ? 'highcharts-tooltip-header ' : '') +\n                            'highcharts-tooltip-box ' +\n                            colorClass)\n                            .attr(attribs)\n                            .add(tooltipLabel);\n                    }\n                    tt.isActive = true;\n                    tt.attr({\n                        text: str\n                    });\n                    if (!styledMode) {\n                        tt.css(options.style)\n                            .shadow(options.shadow)\n                            .attr({\n                            stroke: (options.borderColor ||\n                                point.color ||\n                                series.color ||\n                                '#333333')\n                        });\n                    }\n                    return tt;\n                }\n                // Graceful degradation for legacy formatters\n                if (isString(labels)) {\n                    labels = [false, labels];\n                }\n                // Create the individual labels for header and points, ignore footer\n                var boxes = labels.slice(0,\n                    points.length + 1).reduce(function (boxes,\n                    str,\n                    i) {\n                        if (str !== false && str !== '') {\n                            var point = (points[i - 1] ||\n                                {\n                                    // Item 0 is the header. Instead of this, we could also\n                                    // use the crosshair label\n                                    isHeader: true,\n                                    plotX: points[0].plotX,\n                                    plotY: plotHeight,\n                                    series: {}\n                                });\n                        var isHeader = point.isHeader;\n                        // Store the tooltip label referance on the series\n                        var owner = isHeader ? tooltip : point.series;\n                        var tt = owner.tt = updatePartialTooltip(owner.tt,\n                            point,\n                            str);\n                        // Get X position now, so we can move all to the other side in\n                        // case of overflow\n                        var bBox = tt.getBBox();\n                        var boxWidth = bBox.width + tt.strokeWidth();\n                        if (isHeader) {\n                            headerHeight = bBox.height;\n                            adjustedPlotHeight += headerHeight;\n                            if (headerTop) {\n                                distributionBoxTop -= headerHeight;\n                            }\n                        }\n                        var _a = getAnchor(point),\n                            anchorX = _a.anchorX,\n                            anchorY = _a.anchorY;\n                        if (typeof anchorY === 'number') {\n                            var size = bBox.height + 1;\n                            var boxPosition = (positioner ?\n                                    positioner.call(tooltip,\n                                boxWidth,\n                                size,\n                                point) :\n                                    defaultPositioner(anchorX,\n                                anchorY,\n                                isHeader,\n                                boxWidth));\n                            boxes.push({\n                                // 0-align to the top, 1-align to the bottom\n                                align: positioner ? 0 : void 0,\n                                anchorX: anchorX,\n                                anchorY: anchorY,\n                                boxWidth: boxWidth,\n                                point: point,\n                                rank: pick(boxPosition.rank, isHeader ? 1 : 0),\n                                size: size,\n                                target: boxPosition.y,\n                                tt: tt,\n                                x: boxPosition.x\n                            });\n                        }\n                        else {\n                            // Hide tooltips which anchorY is outside the visible plot\n                            // area\n                            tt.isActive = false;\n                        }\n                    }\n                    return boxes;\n                }, []);\n                // If overflow left then align all labels to the right\n                if (!positioner && boxes.some(function (box) { return box.x < bounds.left; })) {\n                    boxes = boxes.map(function (box) {\n                        var _a = defaultPositioner(box.anchorX,\n                            box.anchorY,\n                            box.point.isHeader,\n                            box.boxWidth,\n                            false),\n                            x = _a.x,\n                            y = _a.y;\n                        return extend(box, {\n                            target: y,\n                            x: x\n                        });\n                    });\n                }\n                // Clean previous run (for missing points)\n                tooltip.cleanSplit();\n                // Distribute and put in place\n                H.distribute(boxes, adjustedPlotHeight);\n                boxes.forEach(function (box) {\n                    var anchorX = box.anchorX,\n                        anchorY = box.anchorY,\n                        pos = box.pos,\n                        x = box.x;\n                    // Put the label in place\n                    box.tt.attr({\n                        visibility: typeof pos === 'undefined' ? 'hidden' : 'inherit',\n                        x: x,\n                        /* NOTE: y should equal pos to be consistent with !split\n                         * tooltip, but is currently relative to plotTop. Is left as is\n                         * to avoid breaking change. Remove distributionBoxTop to make\n                         * it consistent.\n                         */\n                        y: pos + distributionBoxTop,\n                        anchorX: anchorX,\n                        anchorY: anchorY\n                    });\n                });\n                /* If we have a seperate tooltip container, then update the necessary\n                 * container properties.\n                 * Test that tooltip has its own container and renderer before executing\n                 * the operation.\n                 */\n                var container = tooltip.container,\n                    outside = tooltip.outside,\n                    renderer = tooltip.renderer;\n                if (outside && container && renderer) {\n                    // Set container size to fit the tooltip\n                    var _e = tooltipLabel.getBBox(),\n                        width = _e.width,\n                        height = _e.height,\n                        x = _e.x,\n                        y = _e.y;\n                    renderer.setSize(width + x, height + y, false);\n                    // Position the tooltip container to the chart container\n                    var chartPosition = pointer.getChartPosition();\n                    container.style.left = chartPosition.left + 'px';\n                    container.style.top = chartPosition.top + 'px';\n                }\n            };\n            /**\n             * If the `stickOnContact` option is active, this will add a tracker shape.\n             *\n             * @private\n             * @function Highcharts.Tooltip#drawTracker\n             */\n            Tooltip.prototype.drawTracker = function () {\n                var tooltip = this;\n                if (tooltip.followPointer ||\n                    !tooltip.options.stickOnContact) {\n                    if (tooltip.tracker) {\n                        tooltip.tracker.destroy();\n                    }\n                    return;\n                }\n                var chart = tooltip.chart;\n                var label = tooltip.label;\n                var point = chart.hoverPoint;\n                if (!label || !point) {\n                    return;\n                }\n                var box = {\n                        x: 0,\n                        y: 0,\n                        width: 0,\n                        height: 0\n                    };\n                // Combine anchor and tooltip\n                var anchorPos = this.getAnchor(point);\n                var labelBBox = label.getBBox();\n                anchorPos[0] += chart.plotLeft - label.translateX;\n                anchorPos[1] += chart.plotTop - label.translateY;\n                // When the mouse pointer is between the anchor point and the label,\n                // the label should stick.\n                box.x = Math.min(0, anchorPos[0]);\n                box.y = Math.min(0, anchorPos[1]);\n                box.width = (anchorPos[0] < 0 ?\n                    Math.max(Math.abs(anchorPos[0]), (labelBBox.width - anchorPos[0])) :\n                    Math.max(Math.abs(anchorPos[0]), labelBBox.width));\n                box.height = (anchorPos[1] < 0 ?\n                    Math.max(Math.abs(anchorPos[1]), (labelBBox.height - Math.abs(anchorPos[1]))) :\n                    Math.max(Math.abs(anchorPos[1]), labelBBox.height));\n                if (tooltip.tracker) {\n                    tooltip.tracker.attr(box);\n                }\n                else {\n                    tooltip.tracker = label.renderer\n                        .rect(box)\n                        .addClass('highcharts-tracker')\n                        .add(label);\n                    if (!chart.styledMode) {\n                        tooltip.tracker.attr({\n                            fill: 'rgba(0,0,0,0)'\n                        });\n                    }\n                }\n            };\n            /**\n             * @private\n             */\n            Tooltip.prototype.styledModeFormat = function (formatString) {\n                return formatString\n                    .replace('style=\"font-size: 10px\"', 'class=\"highcharts-header\"')\n                    .replace(/style=\"color:{(point|series)\\.color}\"/g, 'class=\"highcharts-color-{$1.colorIndex}\"');\n            };\n            /**\n             * Format the footer/header of the tooltip\n             * #3397: abstraction to enable formatting of footer and header\n             *\n             * @private\n             * @function Highcharts.Tooltip#tooltipFooterHeaderFormatter\n             * @param {Highcharts.PointLabelObject} labelConfig\n             * @param {boolean} [isFooter]\n             * @return {string}\n             */\n            Tooltip.prototype.tooltipFooterHeaderFormatter = function (labelConfig, isFooter) {\n                var footOrHead = isFooter ? 'footer' : 'header',\n                    series = labelConfig.series,\n                    tooltipOptions = series.tooltipOptions,\n                    xDateFormat = tooltipOptions.xDateFormat,\n                    xAxis = series.xAxis,\n                    isDateTime = (xAxis &&\n                        xAxis.options.type === 'datetime' &&\n                        isNumber(labelConfig.key)),\n                    formatString = tooltipOptions[footOrHead + 'Format'],\n                    e = {\n                        isFooter: isFooter,\n                        labelConfig: labelConfig\n                    };\n                fireEvent(this, 'headerFormatter', e, function (e) {\n                    // Guess the best date format based on the closest point distance\n                    // (#568, #3418)\n                    if (isDateTime && !xDateFormat) {\n                        xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                    }\n                    // Insert the footer date format if any\n                    if (isDateTime && xDateFormat) {\n                        ((labelConfig.point && labelConfig.point.tooltipDateKeys) ||\n                            ['key']).forEach(function (key) {\n                            formatString = formatString.replace('{point.' + key + '}', '{point.' + key + ':' + xDateFormat + '}');\n                        });\n                    }\n                    // Replace default header style with class name\n                    if (series.chart.styledMode) {\n                        formatString = this.styledModeFormat(formatString);\n                    }\n                    e.text = format(formatString, {\n                        point: labelConfig,\n                        series: series\n                    }, this.chart);\n                });\n                return e.text;\n            };\n            /**\n             * Updates the tooltip with the provided tooltip options.\n             *\n             * @function Highcharts.Tooltip#update\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *        The tooltip options to update.\n             */\n            Tooltip.prototype.update = function (options) {\n                this.destroy();\n                // Update user options (#6218)\n                merge(true, this.chart.options.tooltip.userOptions, options);\n                this.init(this.chart, merge(true, this.options, options));\n            };\n            /**\n             * Find the new position and perform the move\n             *\n             * @private\n             * @function Highcharts.Tooltip#updatePosition\n             *\n             * @param {Highcharts.Point} point\n             */\n            Tooltip.prototype.updatePosition = function (point) {\n                var chart = this.chart,\n                    pointer = chart.pointer,\n                    label = this.getLabel(),\n                    pos,\n                    anchorX = point.plotX + chart.plotLeft,\n                    anchorY = point.plotY + chart.plotTop,\n                    pad;\n                // Needed for outside: true (#11688)\n                var chartPosition = pointer.getChartPosition();\n                pos = (this.options.positioner || this.getPosition).call(this, label.width, label.height, point);\n                // Set the renderer size dynamically to prevent document size to change\n                if (this.outside) {\n                    pad = (this.options.borderWidth || 0) + 2 * this.distance;\n                    this.renderer.setSize(label.width + pad, label.height + pad, false);\n                    // Anchor and tooltip container need scaling if chart container has\n                    // scale transform/css zoom. #11329.\n                    var containerScaling = chart.containerScaling;\n                    if (containerScaling) {\n                        css(this.container, {\n                            transform: \"scale(\" + containerScaling.scaleX + \", \" + containerScaling.scaleY + \")\"\n                        });\n                        anchorX *= containerScaling.scaleX;\n                        anchorY *= containerScaling.scaleY;\n                    }\n                    anchorX += chartPosition.left - pos.x;\n                    anchorY += chartPosition.top - pos.y;\n                }\n                // do the move\n                this.move(Math.round(pos.x), Math.round(pos.y || 0), // can be undefined (#3977)\n                anchorX, anchorY);\n            };\n            return Tooltip;\n        }());\n        H.Tooltip = Tooltip;\n\n        return H.Tooltip;\n    });\n    _registerModule(_modules, 'parts/Pointer.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Tooltip.js'], _modules['parts/Utilities.js']], function (Color, H, Tooltip, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var charts = H.charts,\n            noop = H.noop;\n        var addEvent = U.addEvent,\n            attr = U.attr,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            objectEach = U.objectEach,\n            offset = U.offset,\n            pick = U.pick,\n            splat = U.splat;\n        /**\n         * One position in relation to an axis.\n         *\n         * @interface Highcharts.PointerAxisCoordinateObject\n         */ /**\n        * Related axis.\n        *\n        * @name Highcharts.PointerAxisCoordinateObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Axis value.\n        *\n        * @name Highcharts.PointerAxisCoordinateObject#value\n        * @type {number}\n        */\n        /**\n         * Positions in terms of axis values.\n         *\n         * @interface Highcharts.PointerAxisCoordinatesObject\n         */ /**\n        * Positions on the x-axis.\n        * @name Highcharts.PointerAxisCoordinatesObject#xAxis\n        * @type {Array<Highcharts.PointerAxisCoordinateObject>}\n        */ /**\n        * Positions on the y-axis.\n        * @name Highcharts.PointerAxisCoordinatesObject#yAxis\n        * @type {Array<Highcharts.PointerAxisCoordinateObject>}\n        */\n        /**\n         * Pointer coordinates.\n         *\n         * @interface Highcharts.PointerCoordinatesObject\n         */ /**\n        * @name Highcharts.PointerCoordinatesObject#chartX\n        * @type {number}\n        */ /**\n        * @name Highcharts.PointerCoordinatesObject#chartY\n        * @type {number}\n        */\n        /**\n         * A native browser mouse or touch event, extended with position information\n         * relative to the {@link Chart.container}.\n         *\n         * @interface Highcharts.PointerEventObject\n         * @extends global.PointerEvent\n         */ /**\n        * The X coordinate of the pointer interaction relative to the chart.\n        *\n        * @name Highcharts.PointerEventObject#chartX\n        * @type {number}\n        */ /**\n        * The Y coordinate of the pointer interaction relative to the chart.\n        *\n        * @name Highcharts.PointerEventObject#chartY\n        * @type {number}\n        */\n        /**\n         * Axis-specific data of a selection.\n         *\n         * @interface Highcharts.SelectDataObject\n         */ /**\n        * @name Highcharts.SelectDataObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * @name Highcharts.SelectDataObject#max\n        * @type {number}\n        */ /**\n        * @name Highcharts.SelectDataObject#min\n        * @type {number}\n        */\n        /**\n         * Object for select events.\n         *\n         * @interface Highcharts.SelectEventObject\n         */ /**\n        * @name Highcharts.SelectEventObject#originalEvent\n        * @type {global.Event}\n        */ /**\n        * @name Highcharts.SelectEventObject#xAxis\n        * @type {Array<Highcharts.SelectDataObject>}\n        */ /**\n        * @name Highcharts.SelectEventObject#yAxis\n        * @type {Array<Highcharts.SelectDataObject>}\n        */\n        ''; // detach doclets above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The mouse and touch tracker object. Each {@link Chart} item has one\n         * assosiated Pointer item that can be accessed from the  {@link Chart.pointer}\n         * property.\n         *\n         * @class\n         * @name Highcharts.Pointer\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.Options} options\n         * The root options object. The pointer uses options from the chart and\n         * tooltip structures.\n         */\n        var Pointer = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Pointer(chart, options) {\n                    this.lastValidTouch = {};\n                this.pinchDown = [];\n                this.runChartClick = false;\n                this.chart = chart;\n                this.hasDragged = false;\n                this.options = options;\n                this.unbindContainerMouseLeave = function () { };\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set inactive state to all series that are not currently hovered,\n             * or, if `inactiveOtherPoints` is set to true, set inactive state to\n             * all points within that series.\n             *\n             * @private\n             * @function Highcharts.Pointer#applyInactiveState\n             * @param {Array<Highcharts.Point>} points\n             * Currently hovered points\n             */\n            Pointer.prototype.applyInactiveState = function (points) {\n                var activeSeries = [],\n                    series;\n                // Get all active series from the hovered points\n                (points || []).forEach(function (item) {\n                    series = item.series;\n                    // Include itself\n                    activeSeries.push(series);\n                    // Include parent series\n                    if (series.linkedParent) {\n                        activeSeries.push(series.linkedParent);\n                    }\n                    // Include all child series\n                    if (series.linkedSeries) {\n                        activeSeries = activeSeries.concat(series.linkedSeries);\n                    }\n                    // Include navigator series\n                    if (series.navigatorSeries) {\n                        activeSeries.push(series.navigatorSeries);\n                    }\n                });\n                // Now loop over all series, filtering out active series\n                this.chart.series.forEach(function (inactiveSeries) {\n                    if (activeSeries.indexOf(inactiveSeries) === -1) {\n                        // Inactive series\n                        inactiveSeries.setState('inactive', true);\n                    }\n                    else if (inactiveSeries.options.inactiveOtherPoints) {\n                        // Active series, but other points should be inactivated\n                        inactiveSeries.setAllPointsToState('inactive');\n                    }\n                });\n            };\n            /**\n             * Destroys the Pointer object and disconnects DOM events.\n             *\n             * @function Highcharts.Pointer#destroy\n             */\n            Pointer.prototype.destroy = function () {\n                var pointer = this;\n                if (typeof pointer.unDocMouseMove !== 'undefined') {\n                    pointer.unDocMouseMove();\n                }\n                this.unbindContainerMouseLeave();\n                if (!H.chartCount) {\n                    if (H.unbindDocumentMouseUp) {\n                        H.unbindDocumentMouseUp = H.unbindDocumentMouseUp();\n                    }\n                    if (H.unbindDocumentTouchEnd) {\n                        H.unbindDocumentTouchEnd = H.unbindDocumentTouchEnd();\n                    }\n                }\n                // memory and CPU leak\n                clearInterval(pointer.tooltipTimeout);\n                objectEach(pointer, function (_val, prop) {\n                    pointer[prop] = void 0;\n                });\n            };\n            /**\n             * Perform a drag operation in response to a mousemove event while the mouse\n             * is down.\n             *\n             * @private\n             * @function Highcharts.Pointer#drag\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.drag = function (e) {\n                var chart = this.chart,\n                    chartOptions = chart.options.chart,\n                    chartX = e.chartX,\n                    chartY = e.chartY,\n                    zoomHor = this.zoomHor,\n                    zoomVert = this.zoomVert,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    clickedInside,\n                    size,\n                    selectionMarker = this.selectionMarker,\n                    mouseDownX = (this.mouseDownX || 0),\n                    mouseDownY = (this.mouseDownY || 0),\n                    panningEnabled = isObject(chartOptions.panning) ?\n                        chartOptions.panning && chartOptions.panning.enabled :\n                        chartOptions.panning,\n                    panKey = (chartOptions.panKey && e[chartOptions.panKey + 'Key']);\n                // If the device supports both touch and mouse (like IE11), and we are\n                // touch-dragging inside the plot area, don't handle the mouse event.\n                // #4339.\n                if (selectionMarker && selectionMarker.touch) {\n                    return;\n                }\n                // If the mouse is outside the plot area, adjust to cooordinates\n                // inside to prevent the selection marker from going outside\n                if (chartX < plotLeft) {\n                    chartX = plotLeft;\n                }\n                else if (chartX > plotLeft + plotWidth) {\n                    chartX = plotLeft + plotWidth;\n                }\n                if (chartY < plotTop) {\n                    chartY = plotTop;\n                }\n                else if (chartY > plotTop + plotHeight) {\n                    chartY = plotTop + plotHeight;\n                }\n                // determine if the mouse has moved more than 10px\n                this.hasDragged = Math.sqrt(Math.pow(mouseDownX - chartX, 2) +\n                    Math.pow(mouseDownY - chartY, 2));\n                if (this.hasDragged > 10) {\n                    clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n                    // make a selection\n                    if (chart.hasCartesianSeries &&\n                        (this.zoomX || this.zoomY) &&\n                        clickedInside &&\n                        !panKey) {\n                        if (!selectionMarker) {\n                            this.selectionMarker = selectionMarker =\n                                chart.renderer.rect(plotLeft, plotTop, zoomHor ? 1 : plotWidth, zoomVert ? 1 : plotHeight, 0)\n                                    .attr({\n                                    'class': 'highcharts-selection-marker',\n                                    zIndex: 7\n                                })\n                                    .add();\n                            if (!chart.styledMode) {\n                                selectionMarker.attr({\n                                    fill: (chartOptions.selectionMarkerFill ||\n                                        color('#335cad')\n                                            .setOpacity(0.25).get())\n                                });\n                            }\n                        }\n                    }\n                    // adjust the width of the selection marker\n                    if (selectionMarker && zoomHor) {\n                        size = chartX - mouseDownX;\n                        selectionMarker.attr({\n                            width: Math.abs(size),\n                            x: (size > 0 ? 0 : size) + mouseDownX\n                        });\n                    }\n                    // adjust the height of the selection marker\n                    if (selectionMarker && zoomVert) {\n                        size = chartY - mouseDownY;\n                        selectionMarker.attr({\n                            height: Math.abs(size),\n                            y: (size > 0 ? 0 : size) + mouseDownY\n                        });\n                    }\n                    // panning\n                    if (clickedInside &&\n                        !selectionMarker &&\n                        panningEnabled) {\n                        chart.pan(e, chartOptions.panning);\n                    }\n                }\n            };\n            /**\n             * Start a drag operation.\n             *\n             * @private\n             * @function Highcharts.Pointer#dragStart\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.dragStart = function (e) {\n                var chart = this.chart;\n                // Record the start position\n                chart.mouseIsDown = e.type;\n                chart.cancelClick = false;\n                chart.mouseDownX = this.mouseDownX = e.chartX;\n                chart.mouseDownY = this.mouseDownY = e.chartY;\n            };\n            /**\n             * On mouse up or touch end across the entire document, drop the selection.\n             *\n             * @private\n             * @function Highcharts.Pointer#drop\n             *\n             * @param {global.Event} e\n             */\n            Pointer.prototype.drop = function (e) {\n                var pointer = this,\n                    chart = this.chart,\n                    hasPinched = this.hasPinched;\n                if (this.selectionMarker) {\n                    var selectionData = {\n                            originalEvent: e,\n                            xAxis: [],\n                            yAxis: []\n                        },\n                        selectionBox = this.selectionMarker,\n                        selectionLeft = selectionBox.attr ?\n                            selectionBox.attr('x') :\n                            selectionBox.x,\n                        selectionTop = selectionBox.attr ?\n                            selectionBox.attr('y') :\n                            selectionBox.y,\n                        selectionWidth = selectionBox.attr ?\n                            selectionBox.attr('width') :\n                            selectionBox.width,\n                        selectionHeight = selectionBox.attr ?\n                            selectionBox.attr('height') :\n                            selectionBox.height,\n                        runZoom;\n                    // a selection has been made\n                    if (this.hasDragged || hasPinched) {\n                        // record each axis' min and max\n                        chart.axes.forEach(function (axis) {\n                            if (axis.zoomEnabled &&\n                                defined(axis.min) &&\n                                (hasPinched ||\n                                    pointer[{\n                                        xAxis: 'zoomX',\n                                        yAxis: 'zoomY'\n                                    }[axis.coll]]) &&\n                                isNumber(selectionLeft) &&\n                                isNumber(selectionTop)) { // #859, #3569\n                                var horiz = axis.horiz,\n                                    minPixelPadding = e.type === 'touchend' ?\n                                        axis.minPixelPadding :\n                                        0, // #1207, #3075\n                                    selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) +\n                                        minPixelPadding),\n                                    selectionMax = axis.toValue((horiz ?\n                                        selectionLeft + selectionWidth :\n                                        selectionTop + selectionHeight) - minPixelPadding);\n                                selectionData[axis.coll].push({\n                                    axis: axis,\n                                    // Min/max for reversed axes\n                                    min: Math.min(selectionMin, selectionMax),\n                                    max: Math.max(selectionMin, selectionMax)\n                                });\n                                runZoom = true;\n                            }\n                        });\n                        if (runZoom) {\n                            fireEvent(chart, 'selection', selectionData, function (args) {\n                                chart.zoom(extend(args, hasPinched ?\n                                    { animation: false } :\n                                    null));\n                            });\n                        }\n                    }\n                    if (isNumber(chart.index)) {\n                        this.selectionMarker = this.selectionMarker.destroy();\n                    }\n                    // Reset scaling preview\n                    if (hasPinched) {\n                        this.scaleGroups();\n                    }\n                }\n                // Reset all. Check isNumber because it may be destroyed on mouse up\n                // (#877)\n                if (chart && isNumber(chart.index)) {\n                    css(chart.container, { cursor: chart._cursor });\n                    chart.cancelClick = this.hasDragged > 10; // #370\n                    chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n                    this.pinchDown = [];\n                }\n            };\n            /**\n             * Finds the closest point to a set of coordinates, using the k-d-tree\n             * algorithm.\n             *\n             * @function Highcharts.Pointer#findNearestKDPoint\n             *\n             * @param {Array<Highcharts.Series>} series\n             *        All the series to search in.\n             *\n             * @param {boolean|undefined} shared\n             *        Whether it is a shared tooltip or not.\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *        The pointer event object, containing chart coordinates of the\n             *        pointer.\n             *\n             * @return {Highcharts.Point|undefined}\n             *         The point closest to given coordinates.\n             */\n            Pointer.prototype.findNearestKDPoint = function (series, shared, e) {\n                var chart = this.chart;\n                var hoverPoint = chart.hoverPoint;\n                var tooltip = chart.tooltip;\n                if (hoverPoint &&\n                    tooltip &&\n                    tooltip.isStickyOnContact()) {\n                    return hoverPoint;\n                }\n                var closest;\n                /** @private */\n                function sort(p1, p2) {\n                    var isCloserX = p1.distX - p2.distX,\n                        isCloser = p1.dist - p2.dist,\n                        isAbove = (p2.series.group && p2.series.group.zIndex) -\n                            (p1.series.group && p1.series.group.zIndex),\n                        result;\n                    // We have two points which are not in the same place on xAxis\n                    // and shared tooltip:\n                    if (isCloserX !== 0 && shared) { // #5721\n                        result = isCloserX;\n                        // Points are not exactly in the same place on x/yAxis:\n                    }\n                    else if (isCloser !== 0) {\n                        result = isCloser;\n                        // The same xAxis and yAxis position, sort by z-index:\n                    }\n                    else if (isAbove !== 0) {\n                        result = isAbove;\n                        // The same zIndex, sort by array index:\n                    }\n                    else {\n                        result =\n                            p1.series.index > p2.series.index ?\n                                -1 :\n                                1;\n                    }\n                    return result;\n                }\n                series.forEach(function (s) {\n                    var noSharedTooltip = s.noSharedTooltip && shared,\n                        compareX = (!noSharedTooltip &&\n                            s.options.findNearestPointBy.indexOf('y') < 0),\n                        point = s.searchPoint(e,\n                        compareX);\n                    if ( // Check that we actually found a point on the series.\n                    isObject(point, true) &&\n                        // Use the new point if it is closer.\n                        (!isObject(closest, true) ||\n                            (sort(closest, point) > 0))) {\n                        closest = point;\n                    }\n                });\n                return closest;\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#getChartCoordinatesFromPoint\n             * @param {Highcharts.Point} point\n             * @param {boolean} [inverted]\n             * @return {Highcharts.PointerCoordinatesObject|undefined}\n             */\n            Pointer.prototype.getChartCoordinatesFromPoint = function (point, inverted) {\n                var series = point.series,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    plotX = pick(point.clientX,\n                    point.plotX),\n                    shapeArgs = point.shapeArgs;\n                if (xAxis && yAxis) {\n                    return inverted ? {\n                        chartX: xAxis.len + xAxis.pos - plotX,\n                        chartY: yAxis.len + yAxis.pos - point.plotY\n                    } : {\n                        chartX: plotX + xAxis.pos,\n                        chartY: point.plotY + yAxis.pos\n                    };\n                }\n                if (shapeArgs && shapeArgs.x && shapeArgs.y) {\n                    // E.g. pies do not have axes\n                    return {\n                        chartX: shapeArgs.x,\n                        chartY: shapeArgs.y\n                    };\n                }\n            };\n            /**\n             * Return the cached chartPosition if it is available on the Pointer,\n             * otherwise find it. Running offset is quite expensive, so it should be\n             * avoided when we know the chart hasn't moved.\n             *\n             * @function Highcharts.Pointer#getChartPosition\n             *\n             * @return {Highcharts.OffsetObject}\n             *         The offset of the chart container within the page\n             */\n            Pointer.prototype.getChartPosition = function () {\n                return (this.chartPosition ||\n                    (this.chartPosition = offset(this.chart.container)));\n            };\n            /**\n             * Get the click position in terms of axis values.\n             *\n             * @function Highcharts.Pointer#getCoordinates\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *        Pointer event, extended with `chartX` and `chartY` properties.\n             *\n             * @return {Highcharts.PointerAxisCoordinatesObject}\n             */\n            Pointer.prototype.getCoordinates = function (e) {\n                var coordinates = {\n                        xAxis: [],\n                        yAxis: []\n                    };\n                this.chart.axes.forEach(function (axis) {\n                    coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n                    });\n                });\n                return coordinates;\n            };\n            /**\n             * Calculates what is the current hovered point/points and series.\n             *\n             * @private\n             * @function Highcharts.Pointer#getHoverData\n             *\n             * @param {Highcharts.Point|undefined} existingHoverPoint\n             *        The point currrently beeing hovered.\n             *\n             * @param {Highcharts.Series|undefined} existingHoverSeries\n             *        The series currently beeing hovered.\n             *\n             * @param {Array<Highcharts.Series>} series\n             *        All the series in the chart.\n             *\n             * @param {boolean} isDirectTouch\n             *        Is the pointer directly hovering the point.\n             *\n             * @param {boolean|undefined} shared\n             *        Whether it is a shared tooltip or not.\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             *        The triggering event, containing chart coordinates of the pointer.\n             *\n             * @return {object}\n             *         Object containing resulting hover data: hoverPoint, hoverSeries,\n             *         and hoverPoints.\n             */\n            Pointer.prototype.getHoverData = function (existingHoverPoint, existingHoverSeries, series, isDirectTouch, shared, e) {\n                var hoverPoint,\n                    hoverPoints = [],\n                    hoverSeries = existingHoverSeries,\n                    useExisting = !!(isDirectTouch && existingHoverPoint),\n                    notSticky = hoverSeries && !hoverSeries.stickyTracking, \n                    // Which series to look in for the hover point\n                    searchSeries, \n                    // Parameters needed for beforeGetHoverData event.\n                    eventArgs = {\n                        chartX: e ? e.chartX : void 0,\n                        chartY: e ? e.chartY : void 0,\n                        shared: shared\n                    },\n                    filter = function (s) {\n                        return (s.visible &&\n                            !(!shared && s.directTouch) && // #3821\n                            pick(s.options.enableMouseTracking,\n                    true));\n                };\n                // Find chart.hoverPane and update filter method in polar.\n                fireEvent(this, 'beforeGetHoverData', eventArgs);\n                searchSeries = notSticky ?\n                    // Only search on hovered series if it has stickyTracking false\n                    [hoverSeries] :\n                    // Filter what series to look in.\n                    series.filter(function (s) {\n                        return eventArgs.filter ? eventArgs.filter(s) : filter(s) &&\n                            s.stickyTracking;\n                    });\n                // Use existing hovered point or find the one closest to coordinates.\n                hoverPoint = useExisting || !e ?\n                    existingHoverPoint :\n                    this.findNearestKDPoint(searchSeries, shared, e);\n                // Assign hover series\n                hoverSeries = hoverPoint && hoverPoint.series;\n                // If we have a hoverPoint, assign hoverPoints.\n                if (hoverPoint) {\n                    // When tooltip is shared, it displays more than one point\n                    if (shared && !hoverSeries.noSharedTooltip) {\n                        searchSeries = series.filter(function (s) {\n                            return eventArgs.filter ?\n                                eventArgs.filter(s) : filter(s) && !s.noSharedTooltip;\n                        });\n                        // Get all points with the same x value as the hoverPoint\n                        searchSeries.forEach(function (s) {\n                            var point = find(s.points,\n                                function (p) {\n                                    return p.x === hoverPoint.x && !p.isNull;\n                            });\n                            if (isObject(point)) {\n                                /*\n                                * Boost returns a minimal point. Convert it to a usable\n                                * point for tooltip and states.\n                                */\n                                if (s.chart.isBoosting) {\n                                    point = s.getPoint(point);\n                                }\n                                hoverPoints.push(point);\n                            }\n                        });\n                    }\n                    else {\n                        hoverPoints.push(hoverPoint);\n                    }\n                }\n                // Check whether the hoverPoint is inside pane we are hovering over.\n                eventArgs = { hoverPoint: hoverPoint };\n                fireEvent(this, 'afterGetHoverData', eventArgs);\n                return {\n                    hoverPoint: eventArgs.hoverPoint,\n                    hoverSeries: hoverSeries,\n                    hoverPoints: hoverPoints\n                };\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#getPointFromEvent\n             *\n             * @param {global.Event} e\n             *\n             * @return {Highcharts.Point|undefined}\n             */\n            Pointer.prototype.getPointFromEvent = function (e) {\n                var target = e.target,\n                    point;\n                while (target && !point) {\n                    point = target.point;\n                    target = target.parentNode;\n                }\n                return point;\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onTrackerMouseOut\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onTrackerMouseOut = function (e) {\n                var chart = this.chart;\n                var relatedTarget = e.relatedTarget || e.toElement;\n                var series = chart.hoverSeries;\n                this.isDirectTouch = false;\n                if (series &&\n                    relatedTarget &&\n                    !series.stickyTracking &&\n                    !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n                    (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465, #5553\n                        !this.inClass(relatedTarget, 'highcharts-tracker'))) {\n                    series.onMouseOut();\n                }\n            };\n            /**\n             * Utility to detect whether an element has, or has a parent with, a\n             * specificclass name. Used on detection of tracker objects and on deciding\n             * whether hovering the tooltip should cause the active series to mouse out.\n             *\n             * @function Highcharts.Pointer#inClass\n             *\n             * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n             *        The element to investigate.\n             *\n             * @param {string} className\n             *        The class name to look for.\n             *\n             * @return {boolean|undefined}\n             *         True if either the element or one of its parents has the given\n             *         class name.\n             */\n            Pointer.prototype.inClass = function (element, className) {\n                var elemClassName;\n                while (element) {\n                    elemClassName = attr(element, 'class');\n                    if (elemClassName) {\n                        if (elemClassName.indexOf(className) !== -1) {\n                            return true;\n                        }\n                        if (elemClassName.indexOf('highcharts-container') !== -1) {\n                            return false;\n                        }\n                    }\n                    element = element.parentNode;\n                }\n            };\n            /**\n             * Initialize the Pointer.\n             *\n             * @private\n             * @function Highcharts.Pointer#init\n             *\n             * @param {Highcharts.Chart} chart\n             *        The Chart instance.\n             *\n             * @param {Highcharts.Options} options\n             *        The root options object. The pointer uses options from the chart\n             *        and tooltip structures.\n             *\n             * @return {void}\n             */\n            Pointer.prototype.init = function (chart, options) {\n                // Store references\n                this.options = options;\n                this.chart = chart;\n                // Do we need to handle click on a touch device?\n                this.runChartClick =\n                    options.chart.events &&\n                        !!options.chart.events.click;\n                this.pinchDown = [];\n                this.lastValidTouch = {};\n                if (Tooltip) {\n                    /**\n                     * Tooltip object for points of series.\n                     *\n                     * @name Highcharts.Chart#tooltip\n                     * @type {Highcharts.Tooltip}\n                     */\n                    chart.tooltip = new Tooltip(chart, options.tooltip);\n                    this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n                }\n                this.setDOMEvents();\n            };\n            /**\n             * Takes a browser event object and extends it with custom Highcharts\n             * properties `chartX` and `chartY` in order to work on the internal\n             * coordinate system.\n             *\n             * @function Highcharts.Pointer#normalize\n             *\n             * @param {global.MouseEvent|global.PointerEvent|global.TouchEvent} e\n             *        Event object in standard browsers.\n             *\n             * @param {Highcharts.OffsetObject} [chartPosition]\n             *        Additional chart offset.\n             *\n             * @return {Highcharts.PointerEventObject}\n             *         A browser event with extended properties `chartX` and `chartY`.\n             */\n            Pointer.prototype.normalize = function (e, chartPosition) {\n                var touches = e.touches;\n                // iOS (#2757)\n                var ePos = (touches ?\n                        touches.length ?\n                            touches.item(0) :\n                            (pick(// #13534\n                            touches.changedTouches,\n                    e.changedTouches))[0] :\n                        e);\n                // Get mouse position\n                if (!chartPosition) {\n                    chartPosition = this.getChartPosition();\n                }\n                var chartX = ePos.pageX - chartPosition.left,\n                    chartY = ePos.pageY - chartPosition.top;\n                // #11329 - when there is scaling on a parent element, we need to take\n                // this into account\n                var containerScaling = this.chart.containerScaling;\n                if (containerScaling) {\n                    chartX /= containerScaling.scaleX;\n                    chartY /= containerScaling.scaleY;\n                }\n                return extend(e, {\n                    chartX: Math.round(chartX),\n                    chartY: Math.round(chartY)\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerClick\n             */\n            Pointer.prototype.onContainerClick = function (e) {\n                var chart = this.chart;\n                var hoverPoint = chart.hoverPoint;\n                var pEvt = this.normalize(e);\n                var plotLeft = chart.plotLeft;\n                var plotTop = chart.plotTop;\n                if (!chart.cancelClick) {\n                    // On tracker click, fire the series and point events. #783, #1583\n                    if (hoverPoint &&\n                        this.inClass(pEvt.target, 'highcharts-tracker')) {\n                        // the series click event\n                        fireEvent(hoverPoint.series, 'click', extend(pEvt, {\n                            point: hoverPoint\n                        }));\n                        // the point click event\n                        if (chart.hoverPoint) { // it may be destroyed (#1844)\n                            hoverPoint.firePointEvent('click', pEvt);\n                        }\n                        // When clicking outside a tracker, fire a chart event\n                    }\n                    else {\n                        extend(pEvt, this.getCoordinates(pEvt));\n                        // fire a click event in the chart\n                        if (chart.isInsidePlot((pEvt.chartX - plotLeft), (pEvt.chartY - plotTop))) {\n                            fireEvent(chart, 'click', pEvt);\n                        }\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseDown\n             *\n             * @param {global.MouseEvent} e\n             */\n            Pointer.prototype.onContainerMouseDown = function (e) {\n                // Normalize before the 'if' for the legacy IE (#7850)\n                e = this.normalize(e);\n                // #11635, Firefox does not reliable fire move event after click scroll\n                if (H.isFirefox &&\n                    e.button !== 0) {\n                    this.onContainerMouseMove(e);\n                }\n                // #11635, limiting to primary button (incl. IE 8 support)\n                if (typeof e.button === 'undefined' ||\n                    ((e.buttons || e.button) & 1) === 1) {\n                    this.zoomOption(e);\n                    this.dragStart(e);\n                }\n            };\n            /**\n             * When mouse leaves the container, hide the tooltip.\n             *\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseLeave\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerMouseLeave = function (e) {\n                var chart = charts[pick(H.hoverChartIndex, -1)];\n                var tooltip = this.chart.tooltip;\n                e = this.normalize(e);\n                // #4886, MS Touch end fires mouseleave but with no related target\n                if (chart &&\n                    (e.relatedTarget || e.toElement)) {\n                    chart.pointer.reset();\n                    // Also reset the chart position, used in #149 fix\n                    chart.pointer.chartPosition = void 0;\n                }\n                if ( // #11635, Firefox wheel scroll does not fire out events consistently\n                tooltip &&\n                    !tooltip.isHidden) {\n                    this.reset();\n                }\n            };\n            /**\n             * The mousemove, touchmove and touchstart event handler\n             *\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseMove\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerMouseMove = function (e) {\n                var chart = this.chart;\n                var pEvt = this.normalize(e);\n                this.setHoverChartIndex();\n                // In IE8 we apparently need this returnValue set to false in order to\n                // avoid text being selected. But in Chrome, e.returnValue is prevented,\n                // plus we don't need to run e.preventDefault to prevent selected text\n                // in modern browsers. So we set it conditionally. Remove it when IE8 is\n                // no longer needed. #2251, #3224.\n                if (!pEvt.preventDefault) {\n                    pEvt.returnValue = false;\n                }\n                if (chart.mouseIsDown === 'mousedown') {\n                    this.drag(pEvt);\n                }\n                // Show the tooltip and run mouse over events (#977)\n                if (!chart.openMenu &&\n                    (this.inClass(pEvt.target, 'highcharts-tracker') ||\n                        chart.isInsidePlot((pEvt.chartX - chart.plotLeft), (pEvt.chartY - chart.plotTop)))) {\n                    this.runPointActions(pEvt);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentTouchEnd\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentTouchEnd = function (e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerTouchMove\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerTouchMove = function (e) {\n                this.touch(e);\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerTouchStart\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerTouchStart = function (e) {\n                this.zoomOption(e);\n                this.touch(e, true);\n            };\n            /**\n             * Special handler for mouse move that will hide the tooltip when the mouse\n             * leaves the plotarea. Issue #149 workaround. The mouseleave event does not\n             * always fire.\n             *\n             * @private\n             * @function Highcharts.Pointer#onDocumentMouseMove\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentMouseMove = function (e) {\n                var chart = this.chart;\n                var chartPosition = this.chartPosition;\n                var pEvt = this.normalize(e,\n                    chartPosition);\n                var tooltip = chart.tooltip;\n                // If we're outside, hide the tooltip\n                if (chartPosition &&\n                    (!tooltip ||\n                        !tooltip.isStickyOnContact()) &&\n                    !chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop) &&\n                    !this.inClass(pEvt.target, 'highcharts-tracker')) {\n                    this.reset();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentMouseUp\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentMouseUp = function (e) {\n                var chart = charts[pick(H.hoverChartIndex, -1)];\n                if (chart) {\n                    chart.pointer.drop(e);\n                }\n            };\n            /**\n             * Handle touch events with two touches\n             *\n             * @private\n             * @function Highcharts.Pointer#pinch\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinch = function (e) {\n                var self = this,\n                    chart = self.chart,\n                    pinchDown = self.pinchDown,\n                    touches = (e.touches || []),\n                    touchesLength = touches.length,\n                    lastValidTouch = self.lastValidTouch,\n                    hasZoom = self.hasZoom,\n                    selectionMarker = self.selectionMarker,\n                    transform = {},\n                    fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, 'highcharts-tracker') &&\n                        chart.runTrackerClick) ||\n                        self.runChartClick),\n                    clip = {};\n                // Don't initiate panning until the user has pinched. This prevents us\n                // from blocking page scrolling as users scroll down a long page\n                // (#4210).\n                if (touchesLength > 1) {\n                    self.initiated = true;\n                }\n                // On touch devices, only proceed to trigger click if a handler is\n                // defined\n                if (hasZoom && self.initiated && !fireClickEvent) {\n                    e.preventDefault();\n                }\n                // Normalize each touch\n                [].map.call(touches, function (e) {\n                    return self.normalize(e);\n                });\n                // Register the touch start position\n                if (e.type === 'touchstart') {\n                    [].forEach.call(touches, function (e, i) {\n                        pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };\n                    });\n                    lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] &&\n                            pinchDown[1].chartX];\n                    lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] &&\n                            pinchDown[1].chartY];\n                    // Identify the data bounds in pixels\n                    chart.axes.forEach(function (axis) {\n                        if (axis.zoomEnabled) {\n                            var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n                                minPixelPadding = axis.minPixelPadding,\n                                min = axis.toPixels(Math.min(pick(axis.options.min,\n                                axis.dataMin),\n                                axis.dataMin)),\n                                max = axis.toPixels(Math.max(pick(axis.options.max,\n                                axis.dataMax),\n                                axis.dataMax)),\n                                absMin = Math.min(min,\n                                max),\n                                absMax = Math.max(min,\n                                max);\n                            // Store the bounds for use in the touchmove handler\n                            bounds.min = Math.min(axis.pos, absMin - minPixelPadding);\n                            bounds.max = Math.max(axis.pos + axis.len, absMax + minPixelPadding);\n                        }\n                    });\n                    self.res = true; // reset on next move\n                    // Optionally move the tooltip on touchmove\n                }\n                else if (self.followTouchMove && touchesLength === 1) {\n                    this.runPointActions(self.normalize(e));\n                    // Event type is touchmove, handle panning and pinching\n                }\n                else if (pinchDown.length) { // can be 0 when releasing, if touchend\n                    // fires first\n                    // Set the marker\n                    if (!selectionMarker) {\n                        self.selectionMarker = selectionMarker = extend({\n                            destroy: noop,\n                            touch: true\n                        }, chart.plotBox);\n                    }\n                    self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                    self.hasPinched = hasZoom;\n                    // Scale and translate the groups to provide visual feedback during\n                    // pinching\n                    self.scaleGroups(transform, clip);\n                    if (self.res) {\n                        self.res = false;\n                        this.reset(false, 0);\n                    }\n                }\n            };\n            /**\n             * Run translation operations\n             *\n             * @private\n             * @function Highcharts.Pointer#pinchTranslate\n             *\n             * @param {Array<*>} pinchDown\n             *\n             * @param {Array<Highcharts.PointerEventObject>} touches\n             *\n             * @param {*} transform\n             *\n             * @param {*} selectionMarker\n             *\n             * @param {*} clip\n             *\n             * @param {*} lastValidTouch\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinchTranslate = function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n                if (this.zoomHor) {\n                    this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n                if (this.zoomVert) {\n                    this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n            };\n            /**\n             * Run translation operations for each direction (horizontal and vertical)\n             * independently.\n             *\n             * @private\n             * @function Highcharts.Pointer#pinchTranslateDirection\n             *\n             * @param {boolean} horiz\n             *\n             * @param {Array<*>} pinchDown\n             *\n             * @param {Array<Highcharts.PointerEventObject>} touches\n             *\n             * @param {*} transform\n             *\n             * @param {*} selectionMarker\n             *\n             * @param {*} clip\n             *\n             * @param {*} lastValidTouch\n             *\n             * @param {number|undefined} [forcedScale=1]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinchTranslateDirection = function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {\n                var chart = this.chart, xy = horiz ? 'x' : 'y', XY = horiz ? 'X' : 'Y', sChartXY = ('chart' + XY), wh = horiz ? 'width' : 'height', plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')], selectionWH, selectionXY, clipXY, scale = forcedScale || 1, inverted = chart.inverted, bounds = chart.bounds[horiz ? 'h' : 'v'], singleTouch = pinchDown.length === 1, touch0Start = pinchDown[0][sChartXY], touch0Now = touches[0][sChartXY], touch1Start = !singleTouch && pinchDown[1][sChartXY], touch1Now = !singleTouch && touches[1][sChartXY], outOfBounds, transformScale, scaleKey, setScale = function () {\n                        // Don't zoom if fingers are too close on this axis\n                        if (typeof touch1Now === 'number' &&\n                            Math.abs(touch0Start - touch1Start) > 20) {\n                            scale = forcedScale ||\n                                Math.abs(touch0Now - touch1Now) /\n                                    Math.abs(touch0Start - touch1Start);\n                    }\n                    clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n                    selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n                };\n                // Set the scale, first pass\n                setScale();\n                // The clip position (x or y) is altered if out of bounds, the selection\n                // position is not\n                selectionXY = clipXY;\n                // Out of bounds\n                if (selectionXY < bounds.min) {\n                    selectionXY = bounds.min;\n                    outOfBounds = true;\n                }\n                else if (selectionXY + selectionWH > bounds.max) {\n                    selectionXY = bounds.max - selectionWH;\n                    outOfBounds = true;\n                }\n                // Is the chart dragged off its bounds, determined by dataMin and\n                // dataMax?\n                if (outOfBounds) {\n                    // Modify the touchNow position in order to create an elastic drag\n                    // movement. This indicates to the user that the chart is responsive\n                    // but can't be dragged further.\n                    touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n                    if (typeof touch1Now === 'number') {\n                        touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n                    }\n                    // Set the scale, second pass to adapt to the modified touchNow\n                    // positions\n                    setScale();\n                }\n                else {\n                    lastValidTouch[xy] = [touch0Now, touch1Now];\n                }\n                // Set geometry for clipping, selection and transformation\n                if (!inverted) {\n                    clip[xy] = clipXY - plotLeftTop;\n                    clip[wh] = selectionWH;\n                }\n                scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n                transformScale = inverted ? 1 / scale : scale;\n                selectionMarker[wh] = selectionWH;\n                selectionMarker[xy] = selectionXY;\n                transform[scaleKey] = scale;\n                transform['translate' + XY] = (transformScale * plotLeftTop) +\n                    (touch0Now - (transformScale * touch0Start));\n            };\n            /**\n             * Reset the tracking by hiding the tooltip, the hover series state and the\n             * hover point\n             *\n             * @function Highcharts.Pointer#reset\n             *\n             * @param {boolean} [allowMove]\n             *        Instead of destroying the tooltip altogether, allow moving it if\n             *        possible.\n             *\n             * @param {number} [delay]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.reset = function (allowMove, delay) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    hoverSeries = chart.hoverSeries,\n                    hoverPoint = chart.hoverPoint,\n                    hoverPoints = chart.hoverPoints,\n                    tooltip = chart.tooltip,\n                    tooltipPoints = tooltip && tooltip.shared ?\n                        hoverPoints :\n                        hoverPoint;\n                // Check if the points have moved outside the plot area (#1003, #4736,\n                // #5101)\n                if (allowMove && tooltipPoints) {\n                    splat(tooltipPoints).forEach(function (point) {\n                        if (point.series.isCartesian &&\n                            typeof point.plotX === 'undefined') {\n                            allowMove = false;\n                        }\n                    });\n                }\n                // Just move the tooltip, #349\n                if (allowMove) {\n                    if (tooltip && tooltipPoints && splat(tooltipPoints).length) {\n                        tooltip.refresh(tooltipPoints);\n                        if (tooltip.shared && hoverPoints) { // #8284\n                            hoverPoints.forEach(function (point) {\n                                point.setState(point.state, true);\n                                if (point.series.isCartesian) {\n                                    if (point.series.xAxis.crosshair) {\n                                        point.series.xAxis\n                                            .drawCrosshair(null, point);\n                                    }\n                                    if (point.series.yAxis.crosshair) {\n                                        point.series.yAxis\n                                            .drawCrosshair(null, point);\n                                    }\n                                }\n                            });\n                        }\n                        else if (hoverPoint) { // #2500\n                            hoverPoint.setState(hoverPoint.state, true);\n                            chart.axes.forEach(function (axis) {\n                                if (axis.crosshair &&\n                                    hoverPoint.series[axis.coll] === axis) {\n                                    axis.drawCrosshair(null, hoverPoint);\n                                }\n                            });\n                        }\n                    }\n                    // Full reset\n                }\n                else {\n                    if (hoverPoint) {\n                        hoverPoint.onMouseOut();\n                    }\n                    if (hoverPoints) {\n                        hoverPoints.forEach(function (point) {\n                            point.setState();\n                        });\n                    }\n                    if (hoverSeries) {\n                        hoverSeries.onMouseOut();\n                    }\n                    if (tooltip) {\n                        tooltip.hide(delay);\n                    }\n                    if (pointer.unDocMouseMove) {\n                        pointer.unDocMouseMove = pointer.unDocMouseMove();\n                    }\n                    // Remove crosshairs\n                    chart.axes.forEach(function (axis) {\n                        axis.hideCrosshair();\n                    });\n                    pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;\n                }\n            };\n            /**\n             * With line type charts with a single tracker, get the point closest to the\n             * mouse. Run Point.onMouseOver and display tooltip for the point or points.\n             *\n             * @private\n             * @function Highcharts.Pointer#runPointActions\n             *\n             * @param {global.Event} e\n             *\n             * @param {Highcharts.PointerEventObject} [p]\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:mouseOut\n             * @fires Highcharts.Point#event:mouseOver\n             */\n            Pointer.prototype.runPointActions = function (e, p) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    series = chart.series,\n                    tooltip = (chart.tooltip && chart.tooltip.options.enabled ?\n                        chart.tooltip :\n                        void 0),\n                    shared = (tooltip ?\n                        tooltip.shared :\n                        false),\n                    hoverPoint = p || chart.hoverPoint,\n                    hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries, \n                    // onMouseOver or already hovering a series with directTouch\n                    isDirectTouch = (!e || e.type !== 'touchmove') && (!!p || ((hoverSeries && hoverSeries.directTouch) &&\n                        pointer.isDirectTouch)),\n                    hoverData = this.getHoverData(hoverPoint,\n                    hoverSeries,\n                    series,\n                    isDirectTouch,\n                    shared,\n                    e),\n                    useSharedTooltip,\n                    followPointer,\n                    anchor,\n                    points;\n                // Update variables from hoverData.\n                hoverPoint = hoverData.hoverPoint;\n                points = hoverData.hoverPoints;\n                hoverSeries = hoverData.hoverSeries;\n                followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n                useSharedTooltip = (shared &&\n                    hoverSeries &&\n                    !hoverSeries.noSharedTooltip);\n                // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n                // #3926, #4200\n                if (hoverPoint &&\n                    // !(hoverSeries && hoverSeries.directTouch) &&\n                    (hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))) {\n                    (chart.hoverPoints || []).forEach(function (p) {\n                        if (points.indexOf(p) === -1) {\n                            p.setState();\n                        }\n                    });\n                    // Set normal state to previous series\n                    if (chart.hoverSeries !== hoverSeries) {\n                        hoverSeries.onMouseOver();\n                    }\n                    pointer.applyInactiveState(points);\n                    // Do mouseover on all points (#3919, #3985, #4410, #5622)\n                    (points || []).forEach(function (p) {\n                        p.setState('hover');\n                    });\n                    // If tracking is on series in stead of on each point,\n                    // fire mouseOver on hover point. // #4448\n                    if (chart.hoverPoint) {\n                        chart.hoverPoint.firePointEvent('mouseOut');\n                    }\n                    // Hover point may have been destroyed in the event handlers (#7127)\n                    if (!hoverPoint.series) {\n                        return;\n                    }\n                    /**\n                     * Contains all hovered points.\n                     *\n                     * @name Highcharts.Chart#hoverPoints\n                     * @type {Array<Highcharts.Point>|null}\n                     */\n                    chart.hoverPoints = points;\n                    /**\n                     * Contains the original hovered point.\n                     *\n                     * @name Highcharts.Chart#hoverPoint\n                     * @type {Highcharts.Point|null}\n                     */\n                    chart.hoverPoint = hoverPoint;\n                    /**\n                     * Hover state should not be lost when axis is updated (#12569)\n                     * Axis.update runs pointer.reset which uses chart.hoverPoint.state\n                     * to apply state which does not exist in hoverPoint yet.\n                     * The mouseOver event should be triggered when hoverPoint\n                     * is correct.\n                     */\n                    hoverPoint.firePointEvent('mouseOver');\n                    // Draw tooltip if necessary\n                    if (tooltip) {\n                        tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n                    }\n                    // Update positions (regardless of kdpoint or hoverPoint)\n                }\n                else if (followPointer && tooltip && !tooltip.isHidden) {\n                    anchor = tooltip.getAnchor([{}], e);\n                    tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n                }\n                // Start the event listener to pick up the tooltip and crosshairs\n                if (!pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove = addEvent(chart.container.ownerDocument, 'mousemove', function (e) {\n                        var chart = charts[H.hoverChartIndex];\n                        if (chart) {\n                            chart.pointer.onDocumentMouseMove(e);\n                        }\n                    });\n                }\n                // Issues related to crosshair #4927, #5269 #5066, #5658\n                chart.axes.forEach(function drawAxisCrosshair(axis) {\n                    var snap = pick((axis.crosshair || {}).snap,\n                        true);\n                    var point;\n                    if (snap) {\n                        point = chart.hoverPoint; // #13002\n                        if (!point || point.series[axis.coll] !== axis) {\n                            point = find(points, function (p) {\n                                return p.series[axis.coll] === axis;\n                            });\n                        }\n                    }\n                    // Axis has snapping crosshairs, and one of the hover points belongs\n                    // to axis. Always call drawCrosshair when it is not snap.\n                    if (point || !snap) {\n                        axis.drawCrosshair(e, point);\n                        // Axis has snapping crosshairs, but no hover point belongs to axis\n                    }\n                    else {\n                        axis.hideCrosshair();\n                    }\n                });\n            };\n            /**\n             * Scale series groups to a certain scale and translation.\n             *\n             * @private\n             * @function Highcharts.Pointer#scaleGroups\n             *\n             * @param {Highcharts.SeriesPlotBoxObject} [attribs]\n             *\n             * @param {boolean} [clip]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.scaleGroups = function (attribs, clip) {\n                var chart = this.chart,\n                    seriesAttribs;\n                // Scale each series\n                chart.series.forEach(function (series) {\n                    seriesAttribs = attribs || series.getPlotBox(); // #1701\n                    if (series.xAxis && series.xAxis.zoomEnabled && series.group) {\n                        series.group.attr(seriesAttribs);\n                        if (series.markerGroup) {\n                            series.markerGroup.attr(seriesAttribs);\n                            series.markerGroup.clip(clip ? chart.clipRect : null);\n                        }\n                        if (series.dataLabelsGroup) {\n                            series.dataLabelsGroup.attr(seriesAttribs);\n                        }\n                    }\n                });\n                // Clip\n                chart.clipRect.attr(clip || chart.clipBox);\n            };\n            /**\n             * Set the JS DOM events on the container and document. This method should\n             * contain a one-to-one assignment between methods and their handlers. Any\n             * advanced logic should be moved to the handler reflecting the event's\n             * name.\n             *\n             * @private\n             * @function Highcharts.Pointer#setDOMEvents\n             *\n             * @return {void}\n             */\n            Pointer.prototype.setDOMEvents = function () {\n                var container = this.chart.container,\n                    ownerDoc = container.ownerDocument;\n                container.onmousedown = this.onContainerMouseDown.bind(this);\n                container.onmousemove = this.onContainerMouseMove.bind(this);\n                container.onclick = this.onContainerClick.bind(this);\n                this.unbindContainerMouseLeave = addEvent(container, 'mouseleave', this.onContainerMouseLeave.bind(this));\n                if (!H.unbindDocumentMouseUp) {\n                    H.unbindDocumentMouseUp = addEvent(ownerDoc, 'mouseup', this.onDocumentMouseUp.bind(this));\n                }\n                if (H.hasTouch) {\n                    addEvent(container, 'touchstart', this.onContainerTouchStart.bind(this));\n                    addEvent(container, 'touchmove', this.onContainerTouchMove.bind(this));\n                    if (!H.unbindDocumentTouchEnd) {\n                        H.unbindDocumentTouchEnd = addEvent(ownerDoc, 'touchend', this.onDocumentTouchEnd.bind(this));\n                    }\n                }\n            };\n            /**\n             * Sets the index of the hovered chart and leaves the previous hovered\n             * chart, to reset states like tooltip.\n             *\n             * @private\n             * @function Highcharts.Pointer#setHoverChartIndex\n             */\n            Pointer.prototype.setHoverChartIndex = function () {\n                var chart = this.chart;\n                var hoverChart = H.charts[pick(H.hoverChartIndex, -1)];\n                if (hoverChart &&\n                    hoverChart !== chart) {\n                    hoverChart.pointer.onContainerMouseLeave({ relatedTarget: true });\n                }\n                if (!hoverChart ||\n                    !hoverChart.mouseIsDown) {\n                    H.hoverChartIndex = chart.index;\n                }\n            };\n            /**\n             * General touch handler shared by touchstart and touchmove.\n             *\n             * @private\n             * @function Highcharts.Pointer#touch\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @param {boolean} [start]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.touch = function (e, start) {\n                var chart = this.chart,\n                    hasMoved,\n                    pinchDown,\n                    isInside;\n                this.setHoverChartIndex();\n                if (e.touches.length === 1) {\n                    e = this.normalize(e);\n                    isInside = chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop);\n                    if (isInside && !chart.openMenu) {\n                        // Run mouse events and display tooltip etc\n                        if (start) {\n                            this.runPointActions(e);\n                        }\n                        // Android fires touchmove events after the touchstart even if\n                        // the finger hasn't moved, or moved only a pixel or two. In iOS\n                        // however, the touchmove doesn't fire unless the finger moves\n                        // more than ~4px. So we emulate this behaviour in Android by\n                        // checking how much it moved, and cancelling on small\n                        // distances. #3450.\n                        if (e.type === 'touchmove') {\n                            pinchDown = this.pinchDown;\n                            hasMoved = pinchDown[0] ? Math.sqrt(// #5266\n                            Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n                                Math.pow(pinchDown[0].chartY - e.chartY, 2)) >= 4 : false;\n                        }\n                        if (pick(hasMoved, true)) {\n                            this.pinch(e);\n                        }\n                    }\n                    else if (start) {\n                        // Hide the tooltip on touching outside the plot area (#1203)\n                        this.reset();\n                    }\n                }\n                else if (e.touches.length === 2) {\n                    this.pinch(e);\n                }\n            };\n            /**\n             * Resolve the zoomType option, this is reset on all touch start and mouse\n             * down events.\n             *\n             * @private\n             * @function Highcharts.Pointer#zoomOption\n             *\n             * @param {global.Event} e\n             *        Event object.\n             *\n             * @param {void}\n             */\n            Pointer.prototype.zoomOption = function (e) {\n                var chart = this.chart,\n                    options = chart.options.chart,\n                    zoomType = options.zoomType || '',\n                    inverted = chart.inverted,\n                    zoomX,\n                    zoomY;\n                // Look for the pinchType option\n                if (/touch/.test(e.type)) {\n                    zoomType = pick(options.pinchType, zoomType);\n                }\n                this.zoomX = zoomX = /x/.test(zoomType);\n                this.zoomY = zoomY = /y/.test(zoomType);\n                this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n                this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n                this.hasZoom = zoomX || zoomY;\n            };\n            return Pointer;\n        }());\n        H.Pointer = Pointer;\n\n        return Pointer;\n    });\n    _registerModule(_modules, 'parts/MSPointer.js', [_modules['parts/Globals.js'], _modules['parts/Pointer.js'], _modules['parts/Utilities.js']], function (H, Pointer, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var __extends = (this && this.__extends) || (function () {\n                var extendStatics = function (d,\n            b) {\n                    extendStatics = Object.setPrototypeOf ||\n                        ({ __proto__: [] } instanceof Array && function (d,\n            b) { d.__proto__ = b; }) ||\n                        function (d,\n            b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n                return extendStatics(d, b);\n            };\n            return function (d, b) {\n                extendStatics(d, b);\n                function __() { this.constructor = d; }\n                d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n            };\n        })();\n        var charts = H.charts,\n            doc = H.doc,\n            noop = H.noop,\n            win = H.win;\n        var addEvent = U.addEvent,\n            css = U.css,\n            objectEach = U.objectEach,\n            removeEvent = U.removeEvent;\n        /* globals MSPointerEvent, PointerEvent */\n        // The touches object keeps track of the points being touched at all times\n        var touches = {};\n        var hasPointerEvent = !!win.PointerEvent;\n        /* eslint-disable valid-jsdoc */\n        /** @private */\n        function getWebkitTouches() {\n            var fake = [];\n            fake.item = function (i) {\n                return this[i];\n            };\n            objectEach(touches, function (touch) {\n                fake.push({\n                    pageX: touch.pageX,\n                    pageY: touch.pageY,\n                    target: touch.target\n                });\n            });\n            return fake;\n        }\n        /** @private */\n        function translateMSPointer(e, method, wktype, func) {\n            var p;\n            if ((e.pointerType === 'touch' ||\n                e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[H.hoverChartIndex]) {\n                func(e);\n                p = charts[H.hoverChartIndex].pointer;\n                p[method]({\n                    type: wktype,\n                    target: e.currentTarget,\n                    preventDefault: noop,\n                    touches: getWebkitTouches()\n                });\n            }\n        }\n        /** @private */\n        var MSPointer = /** @class */ (function (_super) {\n                __extends(MSPointer, _super);\n            function MSPointer() {\n                return _super !== null && _super.apply(this, arguments) || this;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Add or remove the MS Pointer specific events\n             *\n             * @private\n             * @function Highcharts.Pointer#batchMSEvents\n             *\n             * @param {Function} fn\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.batchMSEvents = function (fn) {\n                fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n                fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n                fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n            };\n            // Destroy MS events also\n            MSPointer.prototype.destroy = function () {\n                this.batchMSEvents(removeEvent);\n                _super.prototype.destroy.call(this);\n            };\n            // Disable default IE actions for pinch and such on chart element\n            MSPointer.prototype.init = function (chart, options) {\n                _super.prototype.init.call(this, chart, options);\n                if (this.hasZoom) { // #4014\n                    css(chart.container, {\n                        '-ms-touch-action': 'none',\n                        'touch-action': 'none'\n                    });\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerPointerDown\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onContainerPointerDown = function (e) {\n                translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {\n                    touches[e.pointerId] = {\n                        pageX: e.pageX,\n                        pageY: e.pageY,\n                        target: e.currentTarget\n                    };\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerPointerMove\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onContainerPointerMove = function (e) {\n                translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {\n                    touches[e.pointerId] = ({ pageX: e.pageX, pageY: e.pageY });\n                    if (!touches[e.pointerId].target) {\n                        touches[e.pointerId].target = e.currentTarget;\n                    }\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentPointerUp\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onDocumentPointerUp = function (e) {\n                translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function (e) {\n                    delete touches[e.pointerId];\n                });\n            };\n            // Add IE specific touch events to chart\n            MSPointer.prototype.setDOMEvents = function () {\n                _super.prototype.setDOMEvents.call(this);\n                if (this.hasZoom || this.followTouchMove) {\n                    this.batchMSEvents(addEvent);\n                }\n            };\n            return MSPointer;\n        }(Pointer));\n\n        return MSPointer;\n    });\n    _registerModule(_modules, 'parts/Legend.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Gets fired when the legend item belonging to a point is clicked. The default\n         * action is to toggle the visibility of the point. This can be prevented by\n         * returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.PointLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        The point on which the event occured.\n         *\n         * @param {Highcharts.PointLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the legend click event.\n         *\n         * @interface Highcharts.PointLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.PointLegendItemClickEventObject#browserEvent\n        * @type {Highcharts.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the point.\n        * @name Highcharts.PointLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related point.\n        * @name Highcharts.PointLegendItemClickEventObject#target\n        * @type {Highcharts.Point}\n        */ /**\n        * Event type.\n        * @name Highcharts.PointLegendItemClickEventObject#type\n        * @type {\"legendItemClick\"}\n        */\n        /**\n         * Gets fired when the legend item belonging to a series is clicked. The default\n         * action is to toggle the visibility of the series. This can be prevented by\n         * returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the legend click event.\n         *\n         * @interface Highcharts.SeriesLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n        * @type {Highcharts.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesLegendItemClickEventObject#type\n        * @type {\"legendItemClick\"}\n        */\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            setAnimation = U.setAnimation,\n            stableSort = U.stableSort,\n            syncTimeout = U.syncTimeout,\n            wrap = U.wrap;\n        var isFirefox = H.isFirefox,\n            marginNames = H.marginNames,\n            win = H.win;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The overview of the chart's series. The legend object is instanciated\n         * internally in the chart constructor, and is available from the `chart.legend`\n         * property. Each chart has only one legend.\n         *\n         * @class\n         * @name Highcharts.Legend\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.LegendOptions} options\n         * Legend options.\n         */\n        var Legend = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Legend(chart, options) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.allItems = [];\n                this.box = void 0;\n                this.contentGroup = void 0;\n                this.display = false;\n                this.group = void 0;\n                this.initialItemY = 0;\n                this.itemHeight = 0;\n                this.itemMarginBottom = 0;\n                this.itemMarginTop = 0;\n                this.itemX = 0;\n                this.itemY = 0;\n                this.lastItemY = 0;\n                this.lastLineHeight = 0;\n                this.legendHeight = 0;\n                this.legendWidth = 0;\n                this.maxItemWidth = 0;\n                this.maxLegendWidth = 0;\n                this.offsetWidth = 0;\n                this.options = {};\n                this.padding = 0;\n                this.pages = [];\n                this.proximate = false;\n                this.scrollGroup = void 0;\n                this.symbolHeight = 0;\n                this.symbolWidth = 0;\n                this.titleHeight = 0;\n                this.totalItemWidth = 0;\n                this.widthOption = 0;\n                this.chart = chart;\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Initialize the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#init\n             *\n             * @param {Highcharts.Chart} chart\n             * The chart instance.\n             *\n             * @param {Highcharts.LegendOptions} options\n             * Legend options.\n             */\n            Legend.prototype.init = function (chart, options) {\n                /**\n                 * Chart of this legend.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#chart\n                 * @type {Highcharts.Chart}\n                 */\n                this.chart = chart;\n                this.setOptions(options);\n                if (options.enabled) {\n                    // Render it\n                    this.render();\n                    // move checkboxes\n                    addEvent(this.chart, 'endResize', function () {\n                        this.legend.positionCheckboxes();\n                    });\n                    if (this.proximate) {\n                        this.unchartrender = addEvent(this.chart, 'render', function () {\n                            this.legend.proximatePositions();\n                            this.legend.positionItems();\n                        });\n                    }\n                    else if (this.unchartrender) {\n                        this.unchartrender();\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#setOptions\n             * @param {Highcharts.LegendOptions} options\n             */\n            Legend.prototype.setOptions = function (options) {\n                var padding = pick(options.padding, 8);\n                /**\n                 * Legend options.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#options\n                 * @type {Highcharts.LegendOptions}\n                 */\n                this.options = options;\n                if (!this.chart.styledMode) {\n                    this.itemStyle = options.itemStyle;\n                    this.itemHiddenStyle = merge(this.itemStyle, options.itemHiddenStyle);\n                }\n                this.itemMarginTop = options.itemMarginTop || 0;\n                this.itemMarginBottom = options.itemMarginBottom || 0;\n                this.padding = padding;\n                this.initialItemY = padding - 5; // 5 is pixels above the text\n                this.symbolWidth = pick(options.symbolWidth, 16);\n                this.pages = [];\n                this.proximate = options.layout === 'proximate' && !this.chart.inverted;\n                this.baseline = void 0; // #12705: baseline has to be reset on every update\n            };\n            /**\n             * Update the legend with new options. Equivalent to running `chart.update`\n             * with a legend configuration option.\n             *\n             * @sample highcharts/legend/legend-update/\n             *         Legend update\n             *\n             * @function Highcharts.Legend#update\n             *\n             * @param {Highcharts.LegendOptions} options\n             * Legend options.\n             *\n             * @param {boolean} [redraw=true]\n             * Whether to redraw the chart after the axis is altered. If doing more\n             * operations on the chart, it is a good idea to set redraw to false and\n             * call {@link Chart#redraw} after. Whether to redraw the chart.\n             *\n             * @fires Highcharts.Legends#event:afterUpdate\n             */\n            Legend.prototype.update = function (options, redraw) {\n                var chart = this.chart;\n                this.setOptions(merge(true, this.options, options));\n                this.destroy();\n                chart.isDirtyLegend = chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n                fireEvent(this, 'afterUpdate');\n            };\n            /**\n             * Set the colors for the legend item.\n             *\n             * @private\n             * @function Highcharts.Legend#colorizeItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             *        A Series or Point instance\n             * @param {boolean} [visible=false]\n             *        Dimmed or colored\n             *\n             * @todo\n             * Make events official: Fires the event `afterColorizeItem`.\n             */\n            Legend.prototype.colorizeItem = function (item, visible) {\n                item.legendGroup[visible ? 'removeClass' : 'addClass']('highcharts-legend-item-hidden');\n                if (!this.chart.styledMode) {\n                    var legend = this,\n                        options = legend.options,\n                        legendItem = item.legendItem,\n                        legendLine = item.legendLine,\n                        legendSymbol = item.legendSymbol,\n                        hiddenColor = legend.itemHiddenStyle.color,\n                        textColor = visible ?\n                            options.itemStyle.color :\n                            hiddenColor,\n                        symbolColor = visible ?\n                            (item.color || hiddenColor) :\n                            hiddenColor,\n                        markerOptions = item.options && item.options.marker,\n                        symbolAttr = { fill: symbolColor };\n                    if (legendItem) {\n                        legendItem.css({\n                            fill: textColor,\n                            color: textColor // #1553, oldIE\n                        });\n                    }\n                    if (legendLine) {\n                        legendLine.attr({ stroke: symbolColor });\n                    }\n                    if (legendSymbol) {\n                        // Apply marker options\n                        if (markerOptions && legendSymbol.isMarker) { // #585\n                            symbolAttr = item.pointAttribs();\n                            if (!visible) {\n                                // #6769\n                                symbolAttr.stroke = symbolAttr.fill = hiddenColor;\n                            }\n                        }\n                        legendSymbol.attr(symbolAttr);\n                    }\n                }\n                fireEvent(this, 'afterColorizeItem', { item: item, visible: visible });\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#positionItems\n             */\n            Legend.prototype.positionItems = function () {\n                // Now that the legend width and height are established, put the items\n                // in the final position\n                this.allItems.forEach(this.positionItem, this);\n                if (!this.chart.isResizing) {\n                    this.positionCheckboxes();\n                }\n            };\n            /**\n             * Position the legend item.\n             *\n             * @private\n             * @function Highcharts.Legend#positionItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to position\n             */\n            Legend.prototype.positionItem = function (item) {\n                var _this = this;\n                var legend = this,\n                    options = legend.options,\n                    symbolPadding = options.symbolPadding,\n                    ltr = !options.rtl,\n                    legendItemPos = item._legendItemPos,\n                    itemX = legendItemPos[0],\n                    itemY = legendItemPos[1],\n                    checkbox = item.checkbox,\n                    legendGroup = item.legendGroup;\n                if (legendGroup && legendGroup.element) {\n                    var attribs = {\n                            translateX: ltr ?\n                                itemX :\n                                legend.legendWidth - itemX - 2 * symbolPadding - 4,\n                            translateY: itemY\n                        };\n                    var complete = function () {\n                            fireEvent(_this, 'afterPositionItem', { item: item });\n                    };\n                    if (defined(legendGroup.translateY)) {\n                        legendGroup.animate(attribs, { complete: complete });\n                    }\n                    else {\n                        legendGroup.attr(attribs);\n                        complete();\n                    }\n                }\n                if (checkbox) {\n                    checkbox.x = itemX;\n                    checkbox.y = itemY;\n                }\n            };\n            /**\n             * Destroy a single legend item, used internally on removing series items.\n             *\n             * @private\n             * @function Highcharts.Legend#destroyItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to remove\n             */\n            Legend.prototype.destroyItem = function (item) {\n                var checkbox = item.checkbox;\n                // destroy SVG elements\n                ['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'].forEach(function (key) {\n                    if (item[key]) {\n                        item[key] = item[key].destroy();\n                    }\n                });\n                if (checkbox) {\n                    discardElement(item.checkbox);\n                }\n            };\n            /**\n             * Destroy the legend. Used internally. To reflow objects, `chart.redraw`\n             * must be called after destruction.\n             *\n             * @private\n             * @function Highcharts.Legend#destroy\n             */\n            Legend.prototype.destroy = function () {\n                /**\n                 * @private\n                 * @param {string} key\n                 * @return {void}\n                 */\n                function destroyItems(key) {\n                    if (this[key]) {\n                        this[key] = this[key].destroy();\n                    }\n                }\n                // Destroy items\n                this.getAllItems().forEach(function (item) {\n                    ['legendItem', 'legendGroup'].forEach(destroyItems, item);\n                });\n                // Destroy legend elements\n                [\n                    'clipRect',\n                    'up',\n                    'down',\n                    'pager',\n                    'nav',\n                    'box',\n                    'title',\n                    'group'\n                ].forEach(destroyItems, this);\n                this.display = null; // Reset in .render on update.\n            };\n            /**\n             * Position the checkboxes after the width is determined.\n             *\n             * @private\n             * @function Highcharts.Legend#positionCheckboxes\n             */\n            Legend.prototype.positionCheckboxes = function () {\n                var alignAttr = this.group && this.group.alignAttr,\n                    translateY,\n                    clipHeight = this.clipHeight || this.legendHeight,\n                    titleHeight = this.titleHeight;\n                if (alignAttr) {\n                    translateY = alignAttr.translateY;\n                    this.allItems.forEach(function (item) {\n                        var checkbox = item.checkbox,\n                            top;\n                        if (checkbox) {\n                            top = translateY + titleHeight + checkbox.y +\n                                (this.scrollOffset || 0) + 3;\n                            css(checkbox, {\n                                left: (alignAttr.translateX + item.checkboxOffset +\n                                    checkbox.x - 20) + 'px',\n                                top: top + 'px',\n                                display: this.proximate || (top > translateY - 6 &&\n                                    top < translateY + clipHeight - 6) ?\n                                    '' :\n                                    'none'\n                            });\n                        }\n                    }, this);\n                }\n            };\n            /**\n             * Render the legend title on top of the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#renderTitle\n             */\n            Legend.prototype.renderTitle = function () {\n                var options = this.options,\n                    padding = this.padding,\n                    titleOptions = options.title,\n                    titleHeight = 0,\n                    bBox;\n                if (titleOptions.text) {\n                    if (!this.title) {\n                        /**\n                         * SVG element of the legend title.\n                         *\n                         * @readonly\n                         * @name Highcharts.Legend#title\n                         * @type {Highcharts.SVGElement}\n                         */\n                        this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, options.useHTML, null, 'legend-title')\n                            .attr({ zIndex: 1 });\n                        if (!this.chart.styledMode) {\n                            this.title.css(titleOptions.style);\n                        }\n                        this.title.add(this.group);\n                    }\n                    // Set the max title width (#7253)\n                    if (!titleOptions.width) {\n                        this.title.css({\n                            width: this.maxLegendWidth + 'px'\n                        });\n                    }\n                    bBox = this.title.getBBox();\n                    titleHeight = bBox.height;\n                    this.offsetWidth = bBox.width; // #1717\n                    this.contentGroup.attr({ translateY: titleHeight });\n                }\n                this.titleHeight = titleHeight;\n            };\n            /**\n             * Set the legend item text.\n             *\n             * @function Highcharts.Legend#setText\n             * @param {Highcharts.Point|Highcharts.Series} item\n             *        The item for which to update the text in the legend.\n             */\n            Legend.prototype.setText = function (item) {\n                var options = this.options;\n                item.legendItem.attr({\n                    text: options.labelFormat ?\n                        format(options.labelFormat, item, this.chart) :\n                        options.labelFormatter.call(item)\n                });\n            };\n            /**\n             * Render a single specific legend item. Called internally from the `render`\n             * function.\n             *\n             * @private\n             * @function Highcharts.Legend#renderItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to render.\n             */\n            Legend.prototype.renderItem = function (item) {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    options = legend.options,\n                    horizontal = options.layout === 'horizontal',\n                    symbolWidth = legend.symbolWidth,\n                    symbolPadding = options.symbolPadding,\n                    itemStyle = legend.itemStyle,\n                    itemHiddenStyle = legend.itemHiddenStyle,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    ltr = !options.rtl,\n                    bBox,\n                    li = item.legendItem,\n                    isSeries = !item.series,\n                    series = !isSeries && item.series.drawLegendSymbol ?\n                        item.series :\n                        item,\n                    seriesOptions = series.options,\n                    showCheckbox = legend.createCheckboxForItem &&\n                        seriesOptions &&\n                        seriesOptions.showCheckbox, \n                    // full width minus text width\n                    itemExtraWidth = symbolWidth + symbolPadding +\n                        itemDistance + (showCheckbox ? 20 : 0),\n                    useHTML = options.useHTML,\n                    itemClassName = item.options.className;\n                if (!li) { // generate it once, later move it\n                    // Generate the group box, a group to hold the symbol and text. Text\n                    // is to be appended in Legend class.\n                    item.legendGroup = renderer\n                        .g('legend-item')\n                        .addClass('highcharts-' + series.type + '-series ' +\n                        'highcharts-color-' + item.colorIndex +\n                        (itemClassName ? ' ' + itemClassName : '') +\n                        (isSeries ?\n                            ' highcharts-series-' + item.index :\n                            ''))\n                        .attr({ zIndex: 1 })\n                        .add(legend.scrollGroup);\n                    // Generate the list item text and add it to the group\n                    item.legendItem = li = renderer.text('', ltr ?\n                        symbolWidth + symbolPadding :\n                        -symbolPadding, legend.baseline || 0, useHTML);\n                    if (!chart.styledMode) {\n                        // merge to prevent modifying original (#1021)\n                        li.css(merge(item.visible ?\n                            itemStyle :\n                            itemHiddenStyle));\n                    }\n                    li\n                        .attr({\n                        align: ltr ? 'left' : 'right',\n                        zIndex: 2\n                    })\n                        .add(item.legendGroup);\n                    // Get the baseline for the first item - the font size is equal for\n                    // all\n                    if (!legend.baseline) {\n                        legend.fontMetrics = renderer.fontMetrics(chart.styledMode ? 12 : itemStyle.fontSize, li);\n                        legend.baseline =\n                            legend.fontMetrics.f + 3 + legend.itemMarginTop;\n                        li.attr('y', legend.baseline);\n                    }\n                    // Draw the legend symbol inside the group box\n                    legend.symbolHeight =\n                        options.symbolHeight || legend.fontMetrics.f;\n                    series.drawLegendSymbol(legend, item);\n                    if (legend.setItemEvents) {\n                        legend.setItemEvents(item, li, useHTML);\n                    }\n                }\n                // Add the HTML checkbox on top\n                if (showCheckbox && !item.checkbox && legend.createCheckboxForItem) {\n                    legend.createCheckboxForItem(item);\n                }\n                // Colorize the items\n                legend.colorizeItem(item, item.visible);\n                // Take care of max width and text overflow (#6659)\n                if (chart.styledMode || !itemStyle.width) {\n                    li.css({\n                        width: ((options.itemWidth ||\n                            legend.widthOption ||\n                            chart.spacingBox.width) - itemExtraWidth) + 'px'\n                    });\n                }\n                // Always update the text\n                legend.setText(item);\n                // calculate the positions for the next line\n                bBox = li.getBBox();\n                item.itemWidth = item.checkboxOffset =\n                    options.itemWidth ||\n                        item.legendItemWidth ||\n                        bBox.width + itemExtraWidth;\n                legend.maxItemWidth = Math.max(legend.maxItemWidth, item.itemWidth);\n                legend.totalItemWidth += item.itemWidth;\n                legend.itemHeight = item.itemHeight = Math.round(item.legendItemHeight || bBox.height || legend.symbolHeight);\n            };\n            /**\n             * Get the position of the item in the layout. We now know the\n             * maxItemWidth from the previous loop.\n             *\n             * @private\n             * @function Highcharts.Legend#layoutItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             */\n            Legend.prototype.layoutItem = function (item) {\n                var options = this.options,\n                    padding = this.padding,\n                    horizontal = options.layout === 'horizontal',\n                    itemHeight = item.itemHeight,\n                    itemMarginBottom = this.itemMarginBottom,\n                    itemMarginTop = this.itemMarginTop,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    maxLegendWidth = this.maxLegendWidth,\n                    itemWidth = (options.alignColumns &&\n                        this.totalItemWidth > maxLegendWidth) ?\n                        this.maxItemWidth :\n                        item.itemWidth;\n                // If the item exceeds the width, start a new line\n                if (horizontal &&\n                    this.itemX - padding + itemWidth > maxLegendWidth) {\n                    this.itemX = padding;\n                    if (this.lastLineHeight) { // Not for the first line (#10167)\n                        this.itemY += (itemMarginTop +\n                            this.lastLineHeight +\n                            itemMarginBottom);\n                    }\n                    this.lastLineHeight = 0; // reset for next line (#915, #3976)\n                }\n                // Set the edge positions\n                this.lastItemY = itemMarginTop + this.itemY + itemMarginBottom;\n                this.lastLineHeight = Math.max(// #915\n                itemHeight, this.lastLineHeight);\n                // cache the position of the newly generated or reordered items\n                item._legendItemPos = [this.itemX, this.itemY];\n                // advance\n                if (horizontal) {\n                    this.itemX += itemWidth;\n                }\n                else {\n                    this.itemY +=\n                        itemMarginTop + itemHeight + itemMarginBottom;\n                    this.lastLineHeight = itemHeight;\n                }\n                // the width of the widest item\n                this.offsetWidth = this.widthOption || Math.max((horizontal ? this.itemX - padding - (item.checkbox ?\n                    // decrease by itemDistance only when no checkbox #4853\n                    0 :\n                    itemDistance) : itemWidth) + padding, this.offsetWidth);\n            };\n            /**\n             * Get all items, which is one item per series for most series and one\n             * item per point for pie series and its derivatives. Fires the event\n             * `afterGetAllItems`.\n             *\n             * @private\n             * @function Highcharts.Legend#getAllItems\n             * @return {Array<(Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series)>}\n             * The current items in the legend.\n             * @fires Highcharts.Legend#event:afterGetAllItems\n             */\n            Legend.prototype.getAllItems = function () {\n                var allItems = [];\n                this.chart.series.forEach(function (series) {\n                    var seriesOptions = series && series.options;\n                    // Handle showInLegend. If the series is linked to another series,\n                    // defaults to false.\n                    if (series && pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? void 0 : false, true)) {\n                        // Use points or series for the legend item depending on\n                        // legendType\n                        allItems = allItems.concat(series.legendItems ||\n                            (seriesOptions.legendType === 'point' ?\n                                series.data :\n                                series));\n                    }\n                });\n                fireEvent(this, 'afterGetAllItems', { allItems: allItems });\n                return allItems;\n            };\n            /**\n             * Get a short, three letter string reflecting the alignment and layout.\n             *\n             * @private\n             * @function Highcharts.Legend#getAlignment\n             * @return {string}\n             * The alignment, empty string if floating\n             */\n            Legend.prototype.getAlignment = function () {\n                var options = this.options;\n                // Use the first letter of each alignment option in order to detect\n                // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n                if (this.proximate) {\n                    return options.align.charAt(0) + 'tv';\n                }\n                return options.floating ? '' : (options.align.charAt(0) +\n                    options.verticalAlign.charAt(0) +\n                    options.layout.charAt(0));\n            };\n            /**\n             * Adjust the chart margins by reserving space for the legend on only one\n             * side of the chart. If the position is set to a corner, top or bottom is\n             * reserved for horizontal legends and left or right for vertical ones.\n             *\n             * @private\n             * @function Highcharts.Legend#adjustMargins\n             * @param {Array<number>} margin\n             * @param {Array<number>} spacing\n             */\n            Legend.prototype.adjustMargins = function (margin, spacing) {\n                var chart = this.chart,\n                    options = this.options,\n                    alignment = this.getAlignment();\n                if (alignment) {\n                    ([\n                        /(lth|ct|rth)/,\n                        /(rtv|rm|rbv)/,\n                        /(rbh|cb|lbh)/,\n                        /(lbv|lm|ltv)/\n                    ]).forEach(function (alignments, side) {\n                        if (alignments.test(alignment) && !defined(margin[side])) {\n                            // Now we have detected on which side of the chart we should\n                            // reserve space for the legend\n                            chart[marginNames[side]] = Math.max(chart[marginNames[side]], (chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +\n                                [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +\n                                pick(options.margin, 12) +\n                                spacing[side] +\n                                (chart.titleOffset[side] || 0)));\n                        }\n                    });\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#proximatePositions\n             */\n            Legend.prototype.proximatePositions = function () {\n                var chart = this.chart,\n                    boxes = [],\n                    alignLeft = this.options.align === 'left';\n                this.allItems.forEach(function (item) {\n                    var lastPoint,\n                        height,\n                        useFirstPoint = alignLeft,\n                        target,\n                        top;\n                    if (item.yAxis && item.points) {\n                        if (item.xAxis.options.reversed) {\n                            useFirstPoint = !useFirstPoint;\n                        }\n                        lastPoint = find(useFirstPoint ?\n                            item.points :\n                            item.points.slice(0).reverse(), function (item) {\n                            return isNumber(item.plotY);\n                        });\n                        height = this.itemMarginTop +\n                            item.legendItem.getBBox().height +\n                            this.itemMarginBottom;\n                        top = item.yAxis.top - chart.plotTop;\n                        if (item.visible) {\n                            target = lastPoint ?\n                                lastPoint.plotY :\n                                item.yAxis.height;\n                            target += top - 0.3 * height;\n                        }\n                        else {\n                            target = top + item.yAxis.height;\n                        }\n                        boxes.push({\n                            target: target,\n                            size: height,\n                            item: item\n                        });\n                    }\n                }, this);\n                H.distribute(boxes, chart.plotHeight);\n                boxes.forEach(function (box) {\n                    box.item._legendItemPos[1] =\n                        chart.plotTop - chart.spacing[0] + box.pos;\n                });\n            };\n            /**\n             * Render the legend. This method can be called both before and after\n             * `chart.render`. If called after, it will only rearrange items instead\n             * of creating new ones. Called internally on initial render and after\n             * redraws.\n             *\n             * @private\n             * @function Highcharts.Legend#render\n             */\n            Legend.prototype.render = function () {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    legendGroup = legend.group,\n                    allItems,\n                    display,\n                    legendWidth,\n                    legendHeight,\n                    box = legend.box,\n                    options = legend.options,\n                    padding = legend.padding,\n                    allowedWidth;\n                legend.itemX = padding;\n                legend.itemY = legend.initialItemY;\n                legend.offsetWidth = 0;\n                legend.lastItemY = 0;\n                legend.widthOption = relativeLength(options.width, chart.spacingBox.width - padding);\n                // Compute how wide the legend is allowed to be\n                allowedWidth =\n                    chart.spacingBox.width - 2 * padding - options.x;\n                if (['rm', 'lm'].indexOf(legend.getAlignment().substring(0, 2)) > -1) {\n                    allowedWidth /= 2;\n                }\n                legend.maxLegendWidth = legend.widthOption || allowedWidth;\n                if (!legendGroup) {\n                    /**\n                     * SVG group of the legend.\n                     *\n                     * @readonly\n                     * @name Highcharts.Legend#group\n                     * @type {Highcharts.SVGElement}\n                     */\n                    legend.group = legendGroup = renderer.g('legend')\n                        .attr({ zIndex: 7 })\n                        .add();\n                    legend.contentGroup = renderer.g()\n                        .attr({ zIndex: 1 }) // above background\n                        .add(legendGroup);\n                    legend.scrollGroup = renderer.g()\n                        .add(legend.contentGroup);\n                }\n                legend.renderTitle();\n                // add each series or point\n                allItems = legend.getAllItems();\n                // sort by legendIndex\n                stableSort(allItems, function (a, b) {\n                    return ((a.options && a.options.legendIndex) || 0) -\n                        ((b.options && b.options.legendIndex) || 0);\n                });\n                // reversed legend\n                if (options.reversed) {\n                    allItems.reverse();\n                }\n                /**\n                 * All items for the legend, which is an array of series for most series\n                 * and an array of points for pie series and its derivatives.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#allItems\n                 * @type {Array<(Highcharts.Point|Highcharts.Series)>}\n                 */\n                legend.allItems = allItems;\n                legend.display = display = !!allItems.length;\n                // Render the items. First we run a loop to set the text and properties\n                // and read all the bounding boxes. The next loop computes the item\n                // positions based on the bounding boxes.\n                legend.lastLineHeight = 0;\n                legend.maxItemWidth = 0;\n                legend.totalItemWidth = 0;\n                legend.itemHeight = 0;\n                allItems.forEach(legend.renderItem, legend);\n                allItems.forEach(legend.layoutItem, legend);\n                // Get the box\n                legendWidth = (legend.widthOption || legend.offsetWidth) + padding;\n                legendHeight = legend.lastItemY + legend.lastLineHeight +\n                    legend.titleHeight;\n                legendHeight = legend.handleOverflow(legendHeight);\n                legendHeight += padding;\n                // Draw the border and/or background\n                if (!box) {\n                    /**\n                     * SVG element of the legend box.\n                     *\n                     * @readonly\n                     * @name Highcharts.Legend#box\n                     * @type {Highcharts.SVGElement}\n                     */\n                    legend.box = box = renderer.rect()\n                        .addClass('highcharts-legend-box')\n                        .attr({\n                        r: options.borderRadius\n                    })\n                        .add(legendGroup);\n                    box.isNew = true;\n                }\n                // Presentational\n                if (!chart.styledMode) {\n                    box\n                        .attr({\n                        stroke: options.borderColor,\n                        'stroke-width': options.borderWidth || 0,\n                        fill: options.backgroundColor || 'none'\n                    })\n                        .shadow(options.shadow);\n                }\n                if (legendWidth > 0 && legendHeight > 0) {\n                    box[box.isNew ? 'attr' : 'animate'](box.crisp.call({}, {\n                        x: 0,\n                        y: 0,\n                        width: legendWidth,\n                        height: legendHeight\n                    }, box.strokeWidth()));\n                    box.isNew = false;\n                }\n                // hide the border if no items\n                box[display ? 'show' : 'hide']();\n                // Open for responsiveness\n                if (chart.styledMode && legendGroup.getStyle('display') === 'none') {\n                    legendWidth = legendHeight = 0;\n                }\n                legend.legendWidth = legendWidth;\n                legend.legendHeight = legendHeight;\n                if (display) {\n                    legend.align();\n                }\n                if (!this.proximate) {\n                    this.positionItems();\n                }\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Align the legend to chart's box.\n             *\n             * @private\n             * @function Highcharts.align\n             * @param {Highcharts.BBoxObject} alignTo\n             * @return {void}\n             */\n            Legend.prototype.align = function (alignTo) {\n                if (alignTo === void 0) { alignTo = this.chart.spacingBox; }\n                var chart = this.chart,\n                    options = this.options;\n                // If aligning to the top and the layout is horizontal, adjust for\n                // the title (#7428)\n                var y = alignTo.y;\n                if (/(lth|ct|rth)/.test(this.getAlignment()) &&\n                    chart.titleOffset[0] > 0) {\n                    y += chart.titleOffset[0];\n                }\n                else if (/(lbh|cb|rbh)/.test(this.getAlignment()) &&\n                    chart.titleOffset[2] > 0) {\n                    y -= chart.titleOffset[2];\n                }\n                if (y !== alignTo.y) {\n                    alignTo = merge(alignTo, { y: y });\n                }\n                this.group.align(merge(options, {\n                    width: this.legendWidth,\n                    height: this.legendHeight,\n                    verticalAlign: this.proximate ? 'top' : options.verticalAlign\n                }), true, alignTo);\n            };\n            /**\n             * Set up the overflow handling by adding navigation with up and down arrows\n             * below the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#handleOverflow\n             * @param {number} legendHeight\n             * @return {number}\n             */\n            Legend.prototype.handleOverflow = function (legendHeight) {\n                var legend = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    options = this.options,\n                    optionsY = options.y,\n                    alignTop = options.verticalAlign === 'top',\n                    padding = this.padding,\n                    spaceHeight = (chart.spacingBox.height +\n                        (alignTop ? -optionsY : optionsY) - padding),\n                    maxHeight = options.maxHeight,\n                    clipHeight,\n                    clipRect = this.clipRect,\n                    navOptions = options.navigation,\n                    animation = pick(navOptions.animation,\n                    true),\n                    arrowSize = navOptions.arrowSize || 12,\n                    nav = this.nav,\n                    pages = this.pages,\n                    lastY,\n                    allItems = this.allItems,\n                    clipToHeight = function (height) {\n                        if (typeof height === 'number') {\n                            clipRect.attr({\n                                height: height\n                            });\n                    }\n                    else if (clipRect) { // Reset (#5912)\n                        legend.clipRect = clipRect.destroy();\n                        legend.contentGroup.clip();\n                    }\n                    // useHTML\n                    if (legend.contentGroup.div) {\n                        legend.contentGroup.div.style.clip = height ?\n                            'rect(' + padding + 'px,9999px,' +\n                                (padding + height) + 'px,0)' :\n                            'auto';\n                    }\n                }, addTracker = function (key) {\n                    legend[key] = renderer\n                        .circle(0, 0, arrowSize * 1.3)\n                        .translate(arrowSize / 2, arrowSize / 2)\n                        .add(nav);\n                    if (!chart.styledMode) {\n                        legend[key].attr('fill', 'rgba(0,0,0,0.0001)');\n                    }\n                    return legend[key];\n                };\n                // Adjust the height\n                if (options.layout === 'horizontal' &&\n                    options.verticalAlign !== 'middle' &&\n                    !options.floating) {\n                    spaceHeight /= 2;\n                }\n                if (maxHeight) {\n                    spaceHeight = Math.min(spaceHeight, maxHeight);\n                }\n                // Reset the legend height and adjust the clipping rectangle\n                pages.length = 0;\n                if (legendHeight > spaceHeight &&\n                    navOptions.enabled !== false) {\n                    this.clipHeight = clipHeight =\n                        Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n                    this.currentPage = pick(this.currentPage, 1);\n                    this.fullHeight = legendHeight;\n                    // Fill pages with Y positions so that the top of each a legend item\n                    // defines the scroll top for each page (#2098)\n                    allItems.forEach(function (item, i) {\n                        var y = item._legendItemPos[1],\n                            h = Math.round(item.legendItem.getBBox().height),\n                            len = pages.length;\n                        if (!len || (y - pages[len - 1] > clipHeight &&\n                            (lastY || y) !== pages[len - 1])) {\n                            pages.push(lastY || y);\n                            len++;\n                        }\n                        // Keep track of which page each item is on\n                        item.pageIx = len - 1;\n                        if (lastY) {\n                            allItems[i - 1].pageIx = len - 1;\n                        }\n                        if (i === allItems.length - 1 &&\n                            y + h - pages[len - 1] > clipHeight &&\n                            y !== lastY // #2617\n                        ) {\n                            pages.push(y);\n                            item.pageIx = len;\n                        }\n                        if (y !== lastY) {\n                            lastY = y;\n                        }\n                    });\n                    // Only apply clipping if needed. Clipping causes blurred legend in\n                    // PDF export (#1787)\n                    if (!clipRect) {\n                        clipRect = legend.clipRect =\n                            renderer.clipRect(0, padding, 9999, 0);\n                        legend.contentGroup.clip(clipRect);\n                    }\n                    clipToHeight(clipHeight);\n                    // Add navigation elements\n                    if (!nav) {\n                        this.nav = nav = renderer.g()\n                            .attr({ zIndex: 1 })\n                            .add(this.group);\n                        this.up = renderer\n                            .symbol('triangle', 0, 0, arrowSize, arrowSize)\n                            .add(nav);\n                        addTracker('upTracker')\n                            .on('click', function () {\n                            legend.scroll(-1, animation);\n                        });\n                        this.pager = renderer.text('', 15, 10)\n                            .addClass('highcharts-legend-navigation');\n                        if (!chart.styledMode) {\n                            this.pager.css(navOptions.style);\n                        }\n                        this.pager.add(nav);\n                        this.down = renderer\n                            .symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n                            .add(nav);\n                        addTracker('downTracker')\n                            .on('click', function () {\n                            legend.scroll(1, animation);\n                        });\n                    }\n                    // Set initial position\n                    legend.scroll(0);\n                    legendHeight = spaceHeight;\n                    // Reset\n                }\n                else if (nav) {\n                    clipToHeight();\n                    this.nav = nav.destroy(); // #6322\n                    this.scrollGroup.attr({\n                        translateY: 1\n                    });\n                    this.clipHeight = 0; // #1379\n                }\n                return legendHeight;\n            };\n            /**\n             * Scroll the legend by a number of pages.\n             *\n             * @private\n             * @function Highcharts.Legend#scroll\n             *\n             * @param {number} scrollBy\n             *        The number of pages to scroll.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether and how to apply animation.\n             *\n             * @return {void}\n             */\n            Legend.prototype.scroll = function (scrollBy, animation) {\n                var _this = this;\n                var chart = this.chart,\n                    pages = this.pages,\n                    pageCount = pages.length,\n                    currentPage = this.currentPage + scrollBy,\n                    clipHeight = this.clipHeight,\n                    navOptions = this.options.navigation,\n                    pager = this.pager,\n                    padding = this.padding;\n                // When resizing while looking at the last page\n                if (currentPage > pageCount) {\n                    currentPage = pageCount;\n                }\n                if (currentPage > 0) {\n                    if (typeof animation !== 'undefined') {\n                        setAnimation(animation, chart);\n                    }\n                    this.nav.attr({\n                        translateX: padding,\n                        translateY: clipHeight + this.padding + 7 + this.titleHeight,\n                        visibility: 'visible'\n                    });\n                    [this.up, this.upTracker].forEach(function (elem) {\n                        elem.attr({\n                            'class': currentPage === 1 ?\n                                'highcharts-legend-nav-inactive' :\n                                'highcharts-legend-nav-active'\n                        });\n                    });\n                    pager.attr({\n                        text: currentPage + '/' + pageCount\n                    });\n                    [this.down, this.downTracker].forEach(function (elem) {\n                        elem.attr({\n                            // adjust to text width\n                            x: 18 + this.pager.getBBox().width,\n                            'class': currentPage === pageCount ?\n                                'highcharts-legend-nav-inactive' :\n                                'highcharts-legend-nav-active'\n                        });\n                    }, this);\n                    if (!chart.styledMode) {\n                        this.up\n                            .attr({\n                            fill: currentPage === 1 ?\n                                navOptions.inactiveColor :\n                                navOptions.activeColor\n                        });\n                        this.upTracker\n                            .css({\n                            cursor: currentPage === 1 ? 'default' : 'pointer'\n                        });\n                        this.down\n                            .attr({\n                            fill: currentPage === pageCount ?\n                                navOptions.inactiveColor :\n                                navOptions.activeColor\n                        });\n                        this.downTracker\n                            .css({\n                            cursor: currentPage === pageCount ?\n                                'default' :\n                                'pointer'\n                        });\n                    }\n                    this.scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n                    this.scrollGroup.animate({\n                        translateY: this.scrollOffset\n                    });\n                    this.currentPage = currentPage;\n                    this.positionCheckboxes();\n                    // Fire event after scroll animation is complete\n                    var animOptions = animObject(pick(animation,\n                        chart.renderer.globalAnimation,\n                        true));\n                    syncTimeout(function () {\n                        fireEvent(_this, 'afterScroll', { currentPage: currentPage });\n                    }, animOptions.duration || 0);\n                }\n            };\n            return Legend;\n        }());\n        // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n        // and for #2580, a similar drawing flaw in Firefox 26.\n        // Explore if there's a general cause for this. The problem may be related\n        // to nested group elements, as the legend item texts are within 4 group\n        // elements.\n        if (/Trident\\/7\\.0/.test(win.navigator && win.navigator.userAgent) ||\n            isFirefox) {\n            wrap(Legend.prototype, 'positionItem', function (proceed, item) {\n                var legend = this, \n                    // If chart destroyed in sync, this is undefined (#2030)\n                    runPositionItem = function () {\n                        if (item._legendItemPos) {\n                            proceed.call(legend,\n                    item);\n                    }\n                };\n                // Do it now, for export and to get checkbox placement\n                runPositionItem();\n                // Do it after to work around the core issue\n                if (!legend.bubbleLegend) {\n                    setTimeout(runPositionItem);\n                }\n            });\n        }\n        H.Legend = Legend;\n\n        return H.Legend;\n    });\n    _registerModule(_modules, 'parts/Chart.js', [_modules['parts/Axis.js'], _modules['parts/Globals.js'], _modules['parts/Legend.js'], _modules['parts/MSPointer.js'], _modules['parts/Options.js'], _modules['parts/Pointer.js'], _modules['parts/Time.js'], _modules['parts/Utilities.js']], function (Axis, H, Legend, MSPointer, O, Pointer, Time, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var charts = H.charts,\n            doc = H.doc,\n            seriesTypes = H.seriesTypes,\n            win = H.win;\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            animate = U.animate,\n            animObject = U.animObject,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            getStyle = U.getStyle,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            numberFormat = U.numberFormat,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            relativeLength = U.relativeLength,\n            removeEvent = U.removeEvent,\n            setAnimation = U.setAnimation,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Callback for chart constructors.\n         *\n         * @callback Highcharts.ChartCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        Created chart.\n         */\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @callback Highcharts.NumberFormatterCallbackFunction\n         *\n         * @param {number} number\n         *        The input number to format.\n         *\n         * @param {number} decimals\n         *        The amount of decimals. A value of -1 preserves the amount in the\n         *        input number.\n         *\n         * @param {string} [decimalPoint]\n         *        The decimal point, defaults to the one given in the lang options, or\n         *        a dot.\n         *\n         * @param {string} [thousandsSep]\n         *        The thousands separator, defaults to the one given in the lang\n         *        options, or a space character.\n         *\n         * @return {string} The formatted number.\n         */\n        /**\n         * The chart title. The title has an `update` method that allows modifying the\n         * options directly or indirectly via `chart.update`.\n         *\n         * @interface Highcharts.TitleObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the title.\n        *\n        * @function Highcharts.TitleObject#update\n        *\n        * @param {Highcharts.TitleOptions} titleOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the title is altered. If doing more\n        *        operations on the chart, it is a good idea to set redraw to false and\n        *        call {@link Chart#redraw} after.\n        */\n        /**\n         * The chart subtitle. The subtitle has an `update` method that\n         * allows modifying the options directly or indirectly via\n         * `chart.update`.\n         *\n         * @interface Highcharts.SubtitleObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the subtitle.\n        *\n        * @function Highcharts.SubtitleObject#update\n        *\n        * @param {Highcharts.SubtitleOptions} subtitleOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the subtitle is altered. If doing\n        *        more operations on the chart, it is a good idea to set redraw to false\n        *        and call {@link Chart#redraw} after.\n        */\n        /**\n         * The chart caption. The caption has an `update` method that\n         * allows modifying the options directly or indirectly via\n         * `chart.update`.\n         *\n         * @interface Highcharts.CaptionObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the caption.\n        *\n        * @function Highcharts.CaptionObject#update\n        *\n        * @param {Highcharts.CaptionOptions} captionOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the caption is altered. If doing\n        *        more operations on the chart, it is a good idea to set redraw to false\n        *        and call {@link Chart#redraw} after.\n        */\n        var marginNames = H.marginNames;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', {\n         *        title: {\n         *               text: 'My chart'\n         *        },\n         *        series: [{\n         *            data: [1, 3, 2, 4]\n         *        }]\n         * })\n         *\n         * @class\n         * @name Highcharts.Chart\n         *\n         * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n         *        The DOM element to render to, or its id.\n         *\n         * @param {Highcharts.Options} options\n         *        The chart options structure.\n         *\n         * @param {Highcharts.ChartCallbackFunction} [callback]\n         *        Function to run when the chart has loaded and and all external images\n         *        are loaded. Defining a\n         *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n         *        handler is equivalent.\n         */\n        var Chart = /** @class */ (function () {\n                function Chart(a, b, c) {\n                    this.axes = void 0;\n                this.axisOffset = void 0;\n                this.bounds = void 0;\n                this.chartHeight = void 0;\n                this.chartWidth = void 0;\n                this.clipBox = void 0;\n                this.colorCounter = void 0;\n                this.container = void 0;\n                this.index = void 0;\n                this.isResizing = void 0;\n                this.labelCollectors = void 0;\n                this.legend = void 0;\n                this.margin = void 0;\n                this.numberFormatter = void 0;\n                this.options = void 0;\n                this.plotBox = void 0;\n                this.plotHeight = void 0;\n                this.plotLeft = void 0;\n                this.plotTop = void 0;\n                this.plotWidth = void 0;\n                this.pointCount = void 0;\n                this.pointer = void 0;\n                this.renderer = void 0;\n                this.renderTo = void 0;\n                this.series = void 0;\n                this.spacing = void 0;\n                this.spacingBox = void 0;\n                this.symbolCounter = void 0;\n                this.time = void 0;\n                this.titleOffset = void 0;\n                this.userOptions = void 0;\n                this.xAxis = void 0;\n                this.yAxis = void 0;\n                this.getArgs(a, b, c);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Handle the arguments passed to the constructor.\n             *\n             * @private\n             * @function Highcharts.Chart#getArgs\n             *\n             * @param {...Array<*>} arguments\n             * All arguments for the constructor.\n             *\n             * @fires Highcharts.Chart#event:init\n             * @fires Highcharts.Chart#event:afterInit\n             */\n            Chart.prototype.getArgs = function (a, b, c) {\n                // Remove the optional first argument, renderTo, and\n                // set it on this.\n                if (isString(a) || a.nodeName) {\n                    this.renderTo = a;\n                    this.init(b, c);\n                }\n                else {\n                    this.init(a, b);\n                }\n            };\n            /**\n             * Overridable function that initializes the chart. The constructor's\n             * arguments are passed on directly.\n             *\n             * @function Highcharts.Chart#init\n             *\n             * @param {Highcharts.Options} userOptions\n             *        Custom options.\n             *\n             * @param {Function} [callback]\n             *        Function to run when the chart has loaded and and all external\n             *        images are loaded.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:init\n             * @fires Highcharts.Chart#event:afterInit\n             */\n            Chart.prototype.init = function (userOptions, callback) {\n                // Handle regular options\n                var options, \n                    // skip merging data points to increase performance\n                    seriesOptions = userOptions.series,\n                    userPlotOptions = userOptions.plotOptions || {};\n                // Fire the event with a default function\n                fireEvent(this, 'init', { args: arguments }, function () {\n                    userOptions.series = null;\n                    options = merge(defaultOptions, userOptions); // do the merge\n                    var optionsChart = options.chart || {};\n                    // Override (by copy of user options) or clear tooltip options\n                    // in chart.options.plotOptions (#6218)\n                    objectEach(options.plotOptions, function (typeOptions, type) {\n                        if (isObject(typeOptions)) { // #8766\n                            typeOptions.tooltip = (userPlotOptions[type] && // override by copy:\n                                merge(userPlotOptions[type].tooltip)) || void 0; // or clear\n                        }\n                    });\n                    // User options have higher priority than default options\n                    // (#6218). In case of exporting: path is changed\n                    options.tooltip.userOptions = (userOptions.chart &&\n                        userOptions.chart.forExport &&\n                        userOptions.tooltip.userOptions) || userOptions.tooltip;\n                    // set back the series data\n                    options.series = userOptions.series = seriesOptions;\n                    /**\n                     * The original options given to the constructor or a chart factory\n                     * like {@link Highcharts.chart} and {@link Highcharts.stockChart}.\n                     *\n                     * @name Highcharts.Chart#userOptions\n                     * @type {Highcharts.Options}\n                     */\n                    this.userOptions = userOptions;\n                    var chartEvents = optionsChart.events;\n                    this.margin = [];\n                    this.spacing = [];\n                    // Pixel data bounds for touch zoom\n                    this.bounds = { h: {}, v: {} };\n                    // An array of functions that returns labels that should be\n                    // considered for anti-collision\n                    this.labelCollectors = [];\n                    this.callback = callback;\n                    this.isResizing = 0;\n                    /**\n                     * The options structure for the chart after merging\n                     * {@link #defaultOptions} and {@link #userOptions}. It contains\n                     * members for the sub elements like series, legend, tooltip etc.\n                     *\n                     * @name Highcharts.Chart#options\n                     * @type {Highcharts.Options}\n                     */\n                    this.options = options;\n                    /**\n                     * All the axes in the chart.\n                     *\n                     * @see  Highcharts.Chart.xAxis\n                     * @see  Highcharts.Chart.yAxis\n                     *\n                     * @name Highcharts.Chart#axes\n                     * @type {Array<Highcharts.Axis>}\n                     */\n                    this.axes = [];\n                    /**\n                     * All the current series in the chart.\n                     *\n                     * @name Highcharts.Chart#series\n                     * @type {Array<Highcharts.Series>}\n                     */\n                    this.series = [];\n                    /**\n                     * The `Time` object associated with the chart. Since v6.0.5,\n                     * time settings can be applied individually for each chart. If\n                     * no individual settings apply, the `Time` object is shared by\n                     * all instances.\n                     *\n                     * @name Highcharts.Chart#time\n                     * @type {Highcharts.Time}\n                     */\n                    this.time =\n                        userOptions.time && Object.keys(userOptions.time).length ?\n                            new Time(userOptions.time) :\n                            H.time;\n                    /**\n                     * Callback function to override the default function that formats\n                     * all the numbers in the chart. Returns a string with the formatted\n                     * number.\n                     *\n                     * @name Highcharts.Chart#numberFormatter\n                     * @type {Highcharts.NumberFormatterCallbackFunction}\n                     */\n                    this.numberFormatter = optionsChart.numberFormatter || numberFormat;\n                    /**\n                     * Whether the chart is in styled mode, meaning all presentatinoal\n                     * attributes are avoided.\n                     *\n                     * @name Highcharts.Chart#styledMode\n                     * @type {boolean}\n                     */\n                    this.styledMode = optionsChart.styledMode;\n                    this.hasCartesianSeries = optionsChart.showAxes;\n                    var chart = this;\n                    /**\n                     * Index position of the chart in the {@link Highcharts#charts}\n                     * property.\n                     *\n                     * @name Highcharts.Chart#index\n                     * @type {number}\n                     * @readonly\n                     */\n                    chart.index = charts.length; // Add the chart to the global lookup\n                    charts.push(chart);\n                    H.chartCount++;\n                    // Chart event handlers\n                    if (chartEvents) {\n                        objectEach(chartEvents, function (event, eventType) {\n                            if (isFunction(event)) {\n                                addEvent(chart, eventType, event);\n                            }\n                        });\n                    }\n                    /**\n                     * A collection of the X axes in the chart.\n                     *\n                     * @name Highcharts.Chart#xAxis\n                     * @type {Array<Highcharts.Axis>}\n                     */\n                    chart.xAxis = [];\n                    /**\n                     * A collection of the Y axes in the chart.\n                     *\n                     * @name Highcharts.Chart#yAxis\n                     * @type {Array<Highcharts.Axis>}\n                     *\n                     * @todo\n                     * Make events official: Fire the event `afterInit`.\n                     */\n                    chart.yAxis = [];\n                    chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n                    // Fire after init but before first render, before axes and series\n                    // have been initialized.\n                    fireEvent(chart, 'afterInit');\n                    chart.firstRender();\n                });\n            };\n            /**\n             * Internal function to unitialize an individual series.\n             *\n             * @private\n             * @function Highcharts.Chart#initSeries\n             */\n            Chart.prototype.initSeries = function (options) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    type = (options.type ||\n                        optionsChart.type ||\n                        optionsChart.defaultSeriesType),\n                    series,\n                    Constr = seriesTypes[type];\n                // No such series type\n                if (!Constr) {\n                    error(17, true, chart, { missingModuleFor: type });\n                }\n                series = new Constr();\n                series.init(this, options);\n                return series;\n            };\n            /**\n             * Internal function to set data for all series with enabled sorting.\n             *\n             * @private\n             * @function Highcharts.Chart#setSeriesData\n             */\n            Chart.prototype.setSeriesData = function () {\n                this.getSeriesOrderByLinks().forEach(function (series) {\n                    // We need to set data for series with sorting after series init\n                    if (!series.points && !series.data && series.enabledDataSorting) {\n                        series.setData(series.options.data, false);\n                    }\n                });\n            };\n            /**\n             * Sort and return chart series in order depending on the number of linked\n             * series.\n             *\n             * @private\n             * @function Highcharts.Series#getSeriesOrderByLinks\n             * @return {Array<Highcharts.Series>}\n             */\n            Chart.prototype.getSeriesOrderByLinks = function () {\n                return this.series.concat().sort(function (a, b) {\n                    if (a.linkedSeries.length || b.linkedSeries.length) {\n                        return b.linkedSeries.length - a.linkedSeries.length;\n                    }\n                    return 0;\n                });\n            };\n            /**\n             * Order all series above a given index. When series are added and ordered\n             * by configuration, only the last series is handled (#248, #1123, #2456,\n             * #6112). This function is called on series initialization and destroy.\n             *\n             * @private\n             * @function Highcharts.Series#orderSeries\n             * @param {number} [fromIndex]\n             * If this is given, only the series above this index are handled.\n             */\n            Chart.prototype.orderSeries = function (fromIndex) {\n                var series = this.series,\n                    i = fromIndex || 0;\n                for (; i < series.length; i++) {\n                    if (series[i]) {\n                        /**\n                         * Contains the series' index in the `Chart.series` array.\n                         *\n                         * @name Highcharts.Series#index\n                         * @type {number}\n                         * @readonly\n                         */\n                        series[i].index = i;\n                        series[i].name = series[i].getName();\n                    }\n                }\n            };\n            /**\n             * Check whether a given point is within the plot area.\n             *\n             * @function Highcharts.Chart#isInsidePlot\n             *\n             * @param {number} plotX\n             * Pixel x relative to the plot area.\n             *\n             * @param {number} plotY\n             * Pixel y relative to the plot area.\n             *\n             * @param {boolean} [inverted]\n             * Whether the chart is inverted.\n             *\n             * @return {boolean}\n             * Returns true if the given point is inside the plot area.\n             */\n            Chart.prototype.isInsidePlot = function (plotX, plotY, inverted) {\n                var x = inverted ? plotY : plotX,\n                    y = inverted ? plotX : plotY,\n                    e = {\n                        x: x,\n                        y: y,\n                        isInsidePlot: x >= 0 &&\n                            x <= this.plotWidth &&\n                            y >= 0 &&\n                            y <= this.plotHeight\n                    };\n                fireEvent(this, 'afterIsInsidePlot', e);\n                return e.isInsidePlot;\n            };\n            /**\n             * Redraw the chart after changes have been done to the data, axis extremes\n             * chart size or chart elements. All methods for updating axes, series or\n             * points have a parameter for redrawing the chart. This is `true` by\n             * default. But in many cases you want to do more than one operation on the\n             * chart before redrawing, for example add a number of points. In those\n             * cases it is a waste of resources to redraw the chart for each new point\n             * added. So you add the points and call `chart.redraw()` after.\n             *\n             * @function Highcharts.Chart#redraw\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             * If or how to apply animation to the redraw.\n             *\n             * @fires Highcharts.Chart#event:afterSetExtremes\n             * @fires Highcharts.Chart#event:beforeRedraw\n             * @fires Highcharts.Chart#event:predraw\n             * @fires Highcharts.Chart#event:redraw\n             * @fires Highcharts.Chart#event:render\n             * @fires Highcharts.Chart#event:updatedData\n             */\n            Chart.prototype.redraw = function (animation) {\n                fireEvent(this, 'beforeRedraw');\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    pointer = chart.pointer,\n                    legend = chart.legend,\n                    legendUserOptions = chart.userOptions.legend,\n                    redrawLegend = chart.isDirtyLegend,\n                    hasStackedSeries,\n                    hasDirtyStacks,\n                    hasCartesianSeries = chart.hasCartesianSeries,\n                    isDirtyBox = chart.isDirtyBox,\n                    i,\n                    serie,\n                    renderer = chart.renderer,\n                    isHiddenChart = renderer.isHidden(),\n                    afterRedraw = [];\n                // Handle responsive rules, not only on resize (#6130)\n                if (chart.setResponsive) {\n                    chart.setResponsive(false);\n                }\n                // Set the global animation. When chart.hasRendered is not true, the\n                // redraw call comes from a responsive rule and animation should not\n                // occur.\n                setAnimation(chart.hasRendered ? animation : false, chart);\n                if (isHiddenChart) {\n                    chart.temporaryDisplay();\n                }\n                // Adjust title layout (reflow multiline text)\n                chart.layOutTitles();\n                // link stacked series\n                i = series.length;\n                while (i--) {\n                    serie = series[i];\n                    if (serie.options.stacking) {\n                        hasStackedSeries = true;\n                        if (serie.isDirty) {\n                            hasDirtyStacks = true;\n                            break;\n                        }\n                    }\n                }\n                if (hasDirtyStacks) { // mark others as dirty\n                    i = series.length;\n                    while (i--) {\n                        serie = series[i];\n                        if (serie.options.stacking) {\n                            serie.isDirty = true;\n                        }\n                    }\n                }\n                // Handle updated data in the series\n                series.forEach(function (serie) {\n                    if (serie.isDirty) {\n                        if (serie.options.legendType === 'point') {\n                            if (serie.updateTotals) {\n                                serie.updateTotals();\n                            }\n                            redrawLegend = true;\n                        }\n                        else if (legendUserOptions &&\n                            (legendUserOptions.labelFormatter ||\n                                legendUserOptions.labelFormat)) {\n                            redrawLegend = true; // #2165\n                        }\n                    }\n                    if (serie.isDirtyData) {\n                        fireEvent(serie, 'updatedData');\n                    }\n                });\n                // handle added or removed series\n                if (redrawLegend && legend && legend.options.enabled) {\n                    // draw legend graphics\n                    legend.render();\n                    chart.isDirtyLegend = false;\n                }\n                // reset stacks\n                if (hasStackedSeries) {\n                    chart.getStacks();\n                }\n                if (hasCartesianSeries) {\n                    // set axes scales\n                    axes.forEach(function (axis) {\n                        // Don't do setScale again if we're only resizing. Regression\n                        // #13507. But we need it after chart.update (responsive), as\n                        // axis is initialized again (#12137).\n                        if (!chart.isResizing || !isNumber(axis.min)) {\n                            axis.updateNames();\n                            axis.setScale();\n                        }\n                    });\n                }\n                chart.getMargins(); // #3098\n                if (hasCartesianSeries) {\n                    // If one axis is dirty, all axes must be redrawn (#792, #2169)\n                    axes.forEach(function (axis) {\n                        if (axis.isDirty) {\n                            isDirtyBox = true;\n                        }\n                    });\n                    // redraw axes\n                    axes.forEach(function (axis) {\n                        // Fire 'afterSetExtremes' only if extremes are set\n                        var key = axis.min + ',' + axis.max;\n                        if (axis.extKey !== key) { // #821, #4452\n                            axis.extKey = key;\n                            // prevent a recursive call to chart.redraw() (#1119)\n                            afterRedraw.push(function () {\n                                fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n                                delete axis.eventArgs;\n                            });\n                        }\n                        if (isDirtyBox || hasStackedSeries) {\n                            axis.redraw();\n                        }\n                    });\n                }\n                // the plot areas size has changed\n                if (isDirtyBox) {\n                    chart.drawChartBox();\n                }\n                // Fire an event before redrawing series, used by the boost module to\n                // clear previous series renderings.\n                fireEvent(chart, 'predraw');\n                // redraw affected series\n                series.forEach(function (serie) {\n                    if ((isDirtyBox || serie.isDirty) && serie.visible) {\n                        serie.redraw();\n                    }\n                    // Set it here, otherwise we will have unlimited 'updatedData' calls\n                    // for a hidden series after setData(). Fixes #6012\n                    serie.isDirtyData = false;\n                });\n                // move tooltip or reset\n                if (pointer) {\n                    pointer.reset(true);\n                }\n                // redraw if canvas\n                renderer.draw();\n                // Fire the events\n                fireEvent(chart, 'redraw');\n                fireEvent(chart, 'render');\n                if (isHiddenChart) {\n                    chart.temporaryDisplay(true);\n                }\n                // Fire callbacks that are put on hold until after the redraw\n                afterRedraw.forEach(function (callback) {\n                    callback.call();\n                });\n            };\n            /**\n             * Get an axis, series or point object by `id` as given in the configuration\n             * options. Returns `undefined` if no item is found.\n             *\n             * @sample highcharts/plotoptions/series-id/\n             *         Get series by id\n             *\n             * @function Highcharts.Chart#get\n             *\n             * @param {string} id\n             * The id as given in the configuration options.\n             *\n             * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n             * The retrieved item.\n             */\n            Chart.prototype.get = function (id) {\n                var ret,\n                    series = this.series,\n                    i;\n                /**\n                 * @private\n                 * @param {Highcharts.Axis|Highcharts.Series} item\n                 * @return {boolean}\n                 */\n                function itemById(item) {\n                    return (item.id === id ||\n                        (item.options && item.options.id === id));\n                }\n                ret =\n                    // Search axes\n                    find(this.axes, itemById) ||\n                        // Search series\n                        find(this.series, itemById);\n                // Search points\n                for (i = 0; !ret && i < series.length; i++) {\n                    ret = find(series[i].points || [], itemById);\n                }\n                return ret;\n            };\n            /**\n             * Create the Axis instances based on the config options.\n             *\n             * @private\n             * @function Highcharts.Chart#getAxes\n             * @fires Highcharts.Chart#event:afterGetAxes\n             * @fires Highcharts.Chart#event:getAxes\n             */\n            Chart.prototype.getAxes = function () {\n                var chart = this,\n                    options = this.options,\n                    xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n                    yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n                    optionsArray;\n                fireEvent(this, 'getAxes');\n                // make sure the options are arrays and add some members\n                xAxisOptions.forEach(function (axis, i) {\n                    axis.index = i;\n                    axis.isX = true;\n                });\n                yAxisOptions.forEach(function (axis, i) {\n                    axis.index = i;\n                });\n                // concatenate all axis options into one array\n                optionsArray = xAxisOptions.concat(yAxisOptions);\n                optionsArray.forEach(function (axisOptions) {\n                    new Axis(chart, axisOptions); // eslint-disable-line no-new\n                });\n                fireEvent(this, 'afterGetAxes');\n            };\n            /**\n             * Returns an array of all currently selected points in the chart. Points\n             * can be selected by clicking or programmatically by the\n             * {@link Highcharts.Point#select}\n             * function.\n             *\n             * @sample highcharts/plotoptions/series-allowpointselect-line/\n             *         Get selected points\n             *\n             * @function Highcharts.Chart#getSelectedPoints\n             *\n             * @return {Array<Highcharts.Point>}\n             *         The currently selected points.\n             */\n            Chart.prototype.getSelectedPoints = function () {\n                var points = [];\n                this.series.forEach(function (serie) {\n                    // For one-to-one points inspect series.data in order to retrieve\n                    // points outside the visible range (#6445). For grouped data,\n                    // inspect the generated series.points.\n                    points = points.concat(serie.getPointsCollection().filter(function (point) {\n                        return pick(point.selectedStaging, point.selected);\n                    }));\n                });\n                return points;\n            };\n            /**\n             * Returns an array of all currently selected series in the chart. Series\n             * can be selected either programmatically by the\n             * {@link Highcharts.Series#select}\n             * function or by checking the checkbox next to the legend item if\n             * [series.showCheckBox](https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox)\n             * is true.\n             *\n             * @sample highcharts/members/chart-getselectedseries/\n             *         Get selected series\n             *\n             * @function Highcharts.Chart#getSelectedSeries\n             *\n             * @return {Array<Highcharts.Series>}\n             *         The currently selected series.\n             */\n            Chart.prototype.getSelectedSeries = function () {\n                return this.series.filter(function (serie) {\n                    return serie.selected;\n                });\n            };\n            /**\n             * Set a new title or subtitle for the chart.\n             *\n             * @sample highcharts/members/chart-settitle/\n             *         Set title text and styles\n             *\n             * @function Highcharts.Chart#setTitle\n             *\n             * @param {Highcharts.TitleOptions} [titleOptions]\n             *        New title options. The title text itself is set by the\n             *        `titleOptions.text` property.\n             *\n             * @param {Highcharts.SubtitleOptions} [subtitleOptions]\n             *        New subtitle options. The subtitle text itself is set by the\n             *        `subtitleOptions.text` property.\n             *\n             * @param {boolean} [redraw]\n             *        Whether to redraw the chart or wait for a later call to\n             *        `chart.redraw()`.\n             */\n            Chart.prototype.setTitle = function (titleOptions, subtitleOptions, redraw) {\n                this.applyDescription('title', titleOptions);\n                this.applyDescription('subtitle', subtitleOptions);\n                // The initial call also adds the caption. On update, chart.update will\n                // relay to Chart.setCaption.\n                this.applyDescription('caption', void 0);\n                this.layOutTitles(redraw);\n            };\n            /**\n             * Apply a title, subtitle or caption for the chart\n             *\n             * @private\n             * @function Highcharts.Chart#applyDescription\n             * @param name {string}\n             * Either title, subtitle or caption\n             * @param {Highcharts.TitleOptions|Highcharts.SubtitleOptions|Highcharts.CaptionOptions|undefined} explicitOptions\n             * The options to set, will be merged with default options.\n             */\n            Chart.prototype.applyDescription = function (name, explicitOptions) {\n                var chart = this;\n                // Default style\n                var style = name === 'title' ? {\n                        color: '#333333',\n                        fontSize: this.options.isStock ? '16px' : '18px' // #2944\n                    } : {\n                        color: '#666666'\n                    };\n                // Merge default options with explicit options\n                var options = this.options[name] = merge(\n                    // Default styles\n                    (!this.styledMode && { style: style }),\n                    this.options[name],\n                    explicitOptions);\n                var elem = this[name];\n                if (elem && explicitOptions) {\n                    this[name] = elem = elem.destroy(); // remove old\n                }\n                if (options && !elem) {\n                    elem = this.renderer.text(options.text, 0, 0, options.useHTML)\n                        .attr({\n                        align: options.align,\n                        'class': 'highcharts-' + name,\n                        zIndex: options.zIndex || 4\n                    })\n                        .add();\n                    // Update methods, shortcut to Chart.setTitle, Chart.setSubtitle and\n                    // Chart.setCaption\n                    elem.update = function (updateOptions) {\n                        var fn = {\n                                title: 'setTitle',\n                                subtitle: 'setSubtitle',\n                                caption: 'setCaption'\n                            }[name];\n                        chart[fn](updateOptions);\n                    };\n                    // Presentational\n                    if (!this.styledMode) {\n                        elem.css(options.style);\n                    }\n                    /**\n                     * The chart title. The title has an `update` method that allows\n                     * modifying the options directly or indirectly via\n                     * `chart.update`.\n                     *\n                     * @sample highcharts/members/title-update/\n                     *         Updating titles\n                     *\n                     * @name Highcharts.Chart#title\n                     * @type {Highcharts.TitleObject}\n                     */\n                    /**\n                     * The chart subtitle. The subtitle has an `update` method that\n                     * allows modifying the options directly or indirectly via\n                     * `chart.update`.\n                     *\n                     * @name Highcharts.Chart#subtitle\n                     * @type {Highcharts.SubtitleObject}\n                     */\n                    this[name] = elem;\n                }\n            };\n            /**\n             * Internal function to lay out the chart title, subtitle and caption, and\n             * cache the full offset height for use in `getMargins`. The result is\n             * stored in `this.titleOffset`.\n             *\n             * @private\n             * @function Highcharts.Chart#layOutTitles\n             *\n             * @param {boolean} [redraw=true]\n             * @fires Highcharts.Chart#event:afterLayOutTitles\n             */\n            Chart.prototype.layOutTitles = function (redraw) {\n                var titleOffset = [0, 0, 0],\n                    requiresDirtyBox,\n                    renderer = this.renderer,\n                    spacingBox = this.spacingBox;\n                // Lay out the title and the subtitle respectively\n                ['title', 'subtitle', 'caption'].forEach(function (key) {\n                    var title = this[key], titleOptions = this.options[key], verticalAlign = titleOptions.verticalAlign || 'top', offset = key === 'title' ? -3 :\n                            // Floating subtitle (#6574)\n                            verticalAlign === 'top' ? titleOffset[0] + 2 : 0, titleSize, height;\n                    if (title) {\n                        if (!this.styledMode) {\n                            titleSize = titleOptions.style.fontSize;\n                        }\n                        titleSize = renderer.fontMetrics(titleSize, title).b;\n                        title\n                            .css({\n                            width: (titleOptions.width ||\n                                spacingBox.width + (titleOptions.widthAdjust || 0)) + 'px'\n                        });\n                        // Skip the cache for HTML (#3481, #11666)\n                        height = Math.round(title.getBBox(titleOptions.useHTML).height);\n                        title.align(extend({\n                            y: verticalAlign === 'bottom' ?\n                                titleSize :\n                                offset + titleSize,\n                            height: height\n                        }, titleOptions), false, 'spacingBox');\n                        if (!titleOptions.floating) {\n                            if (verticalAlign === 'top') {\n                                titleOffset[0] = Math.ceil(titleOffset[0] +\n                                    height);\n                            }\n                            else if (verticalAlign === 'bottom') {\n                                titleOffset[2] = Math.ceil(titleOffset[2] +\n                                    height);\n                            }\n                        }\n                    }\n                }, this);\n                // Handle title.margin and caption.margin\n                if (titleOffset[0] &&\n                    (this.options.title.verticalAlign || 'top') === 'top') {\n                    titleOffset[0] += this.options.title.margin;\n                }\n                if (titleOffset[2] &&\n                    this.options.caption.verticalAlign === 'bottom') {\n                    titleOffset[2] += this.options.caption.margin;\n                }\n                requiresDirtyBox = (!this.titleOffset ||\n                    this.titleOffset.join(',') !== titleOffset.join(','));\n                // Used in getMargins\n                this.titleOffset = titleOffset;\n                fireEvent(this, 'afterLayOutTitles');\n                if (!this.isDirtyBox && requiresDirtyBox) {\n                    this.isDirtyBox = this.isDirtyLegend = requiresDirtyBox;\n                    // Redraw if necessary (#2719, #2744)\n                    if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n                        this.redraw();\n                    }\n                }\n            };\n            /**\n             * Internal function to get the chart width and height according to options\n             * and container size. Sets {@link Chart.chartWidth} and\n             * {@link Chart.chartHeight}.\n             *\n             * @private\n             * @function Highcharts.Chart#getChartSize\n             */\n            Chart.prototype.getChartSize = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    widthOption = optionsChart.width,\n                    heightOption = optionsChart.height,\n                    renderTo = chart.renderTo;\n                // Get inner width and height\n                if (!defined(widthOption)) {\n                    chart.containerWidth = getStyle(renderTo, 'width');\n                }\n                if (!defined(heightOption)) {\n                    chart.containerHeight = getStyle(renderTo, 'height');\n                }\n                /**\n                 * The current pixel width of the chart.\n                 *\n                 * @name Highcharts.Chart#chartWidth\n                 * @type {number}\n                 */\n                chart.chartWidth = Math.max(// #1393\n                0, widthOption || chart.containerWidth || 600 // #1460\n                );\n                /**\n                 * The current pixel height of the chart.\n                 *\n                 * @name Highcharts.Chart#chartHeight\n                 * @type {number}\n                 */\n                chart.chartHeight = Math.max(0, relativeLength(heightOption, chart.chartWidth) ||\n                    (chart.containerHeight > 1 ?\n                        chart.containerHeight :\n                        400));\n            };\n            /**\n             * If the renderTo element has no offsetWidth, most likely one or more of\n             * its parents are hidden. Loop up the DOM tree to temporarily display the\n             * parents, then save the original display properties, and when the true\n             * size is retrieved, reset them. Used on first render and on redraws.\n             *\n             * @private\n             * @function Highcharts.Chart#temporaryDisplay\n             *\n             * @param {boolean} [revert]\n             * Revert to the saved original styles.\n             */\n            Chart.prototype.temporaryDisplay = function (revert) {\n                var node = this.renderTo,\n                    tempStyle;\n                if (!revert) {\n                    while (node && node.style) {\n                        // When rendering to a detached node, it needs to be temporarily\n                        // attached in order to read styling and bounding boxes (#5783,\n                        // #7024).\n                        if (!doc.body.contains(node) && !node.parentNode) {\n                            node.hcOrigDetached = true;\n                            doc.body.appendChild(node);\n                        }\n                        if (getStyle(node, 'display', false) === 'none' ||\n                            node.hcOricDetached) {\n                            node.hcOrigStyle = {\n                                display: node.style.display,\n                                height: node.style.height,\n                                overflow: node.style.overflow\n                            };\n                            tempStyle = {\n                                display: 'block',\n                                overflow: 'hidden'\n                            };\n                            if (node !== this.renderTo) {\n                                tempStyle.height = 0;\n                            }\n                            css(node, tempStyle);\n                            // If it still doesn't have an offset width after setting\n                            // display to block, it probably has an !important priority\n                            // #2631, 6803\n                            if (!node.offsetWidth) {\n                                node.style.setProperty('display', 'block', 'important');\n                            }\n                        }\n                        node = node.parentNode;\n                        if (node === doc.body) {\n                            break;\n                        }\n                    }\n                }\n                else {\n                    while (node && node.style) {\n                        if (node.hcOrigStyle) {\n                            css(node, node.hcOrigStyle);\n                            delete node.hcOrigStyle;\n                        }\n                        if (node.hcOrigDetached) {\n                            doc.body.removeChild(node);\n                            node.hcOrigDetached = false;\n                        }\n                        node = node.parentNode;\n                    }\n                }\n            };\n            /**\n             * Set the {@link Chart.container|chart container's} class name, in\n             * addition to `highcharts-container`.\n             *\n             * @function Highcharts.Chart#setClassName\n             *\n             * @param {string} [className]\n             * The additional class name.\n             */\n            Chart.prototype.setClassName = function (className) {\n                this.container.className = 'highcharts-container ' + (className || '');\n            };\n            /**\n             * Get the containing element, determine the size and create the inner\n             * container div to hold the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#afterGetContainer\n             * @fires Highcharts.Chart#event:afterGetContainer\n             */\n            Chart.prototype.getContainer = function () {\n                var chart = this,\n                    container,\n                    options = chart.options,\n                    optionsChart = options.chart,\n                    chartWidth,\n                    chartHeight,\n                    renderTo = chart.renderTo,\n                    indexAttrName = 'data-highcharts-chart',\n                    oldChartIndex,\n                    Ren,\n                    containerId = uniqueKey(),\n                    containerStyle,\n                    key;\n                if (!renderTo) {\n                    chart.renderTo = renderTo =\n                        optionsChart.renderTo;\n                }\n                if (isString(renderTo)) {\n                    chart.renderTo = renderTo =\n                        doc.getElementById(renderTo);\n                }\n                // Display an error if the renderTo is wrong\n                if (!renderTo) {\n                    error(13, true, chart);\n                }\n                // If the container already holds a chart, destroy it. The check for\n                // hasRendered is there because web pages that are saved to disk from\n                // the browser, will preserve the data-highcharts-chart attribute and\n                // the SVG contents, but not an interactive chart. So in this case,\n                // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n                oldChartIndex = pInt(attr(renderTo, indexAttrName));\n                if (isNumber(oldChartIndex) &&\n                    charts[oldChartIndex] &&\n                    charts[oldChartIndex].hasRendered) {\n                    charts[oldChartIndex].destroy();\n                }\n                // Make a reference to the chart from the div\n                attr(renderTo, indexAttrName, chart.index);\n                // remove previous chart\n                renderTo.innerHTML = '';\n                // If the container doesn't have an offsetWidth, it has or is a child of\n                // a node that has display:none. We need to temporarily move it out to a\n                // visible state to determine the size, else the legend and tooltips\n                // won't render properly. The skipClone option is used in sparklines as\n                // a micro optimization, saving about 1-2 ms each chart.\n                if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n                    chart.temporaryDisplay();\n                }\n                // get the width and height\n                chart.getChartSize();\n                chartWidth = chart.chartWidth;\n                chartHeight = chart.chartHeight;\n                // Allow table cells and flex-boxes to shrink without the chart blocking\n                // them out (#6427)\n                css(renderTo, { overflow: 'hidden' });\n                // Create the inner container\n                if (!chart.styledMode) {\n                    containerStyle = extend({\n                        position: 'relative',\n                        // needed for context menu (avoidscrollbars) and content\n                        // overflow in IE\n                        overflow: 'hidden',\n                        width: chartWidth + 'px',\n                        height: chartHeight + 'px',\n                        textAlign: 'left',\n                        lineHeight: 'normal',\n                        zIndex: 0,\n                        '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\n                        userSelect: 'none' // #13503\n                    }, optionsChart.style);\n                }\n                /**\n                 * The containing HTML element of the chart. The container is\n                 * dynamically inserted into the element given as the `renderTo`\n                 * parameter in the {@link Highcharts#chart} constructor.\n                 *\n                 * @name Highcharts.Chart#container\n                 * @type {Highcharts.HTMLDOMElement}\n                 */\n                container = createElement('div', {\n                    id: containerId\n                }, containerStyle, renderTo);\n                chart.container = container;\n                // cache the cursor (#1650)\n                chart._cursor = container.style.cursor;\n                // Initialize the renderer\n                Ren = H[optionsChart.renderer] || H.Renderer;\n                /**\n                 * The renderer instance of the chart. Each chart instance has only one\n                 * associated renderer.\n                 *\n                 * @name Highcharts.Chart#renderer\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                chart.renderer = new Ren(container, chartWidth, chartHeight, null, optionsChart.forExport, options.exporting && options.exporting.allowHTML, chart.styledMode);\n                // Set the initial animation from the options\n                setAnimation(void 0, chart);\n                chart.setClassName(optionsChart.className);\n                if (!chart.styledMode) {\n                    chart.renderer.setStyle(optionsChart.style);\n                }\n                else {\n                    // Initialize definitions\n                    for (key in options.defs) { // eslint-disable-line guard-for-in\n                        this.renderer.definition(options.defs[key]);\n                    }\n                }\n                // Add a reference to the charts index\n                chart.renderer.chartIndex = chart.index;\n                fireEvent(this, 'afterGetContainer');\n            };\n            /**\n             * Calculate margins by rendering axis labels in a preliminary position.\n             * Title, subtitle and legend have already been rendered at this stage, but\n             * will be moved into their final positions.\n             *\n             * @private\n             * @function Highcharts.Chart#getMargins\n             * @fires Highcharts.Chart#event:getMargins\n             */\n            Chart.prototype.getMargins = function (skipAxes) {\n                var _a = this,\n                    spacing = _a.spacing,\n                    margin = _a.margin,\n                    titleOffset = _a.titleOffset;\n                this.resetMargins();\n                // Adjust for title and subtitle\n                if (titleOffset[0] && !defined(margin[0])) {\n                    this.plotTop = Math.max(this.plotTop, titleOffset[0] + spacing[0]);\n                }\n                if (titleOffset[2] && !defined(margin[2])) {\n                    this.marginBottom = Math.max(this.marginBottom, titleOffset[2] + spacing[2]);\n                }\n                // Adjust for legend\n                if (this.legend && this.legend.display) {\n                    this.legend.adjustMargins(margin, spacing);\n                }\n                fireEvent(this, 'getMargins');\n                if (!skipAxes) {\n                    this.getAxisMargins();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Chart#getAxisMargins\n             */\n            Chart.prototype.getAxisMargins = function () {\n                var chart = this, \n                    // [top, right, bottom, left]\n                    axisOffset = chart.axisOffset = [0, 0, 0, 0],\n                    colorAxis = chart.colorAxis,\n                    margin = chart.margin,\n                    getOffset = function (axes) {\n                        axes.forEach(function (axis) {\n                            if (axis.visible) {\n                                axis.getOffset();\n                        }\n                    });\n                };\n                // pre-render axes to get labels offset width\n                if (chart.hasCartesianSeries) {\n                    getOffset(chart.axes);\n                }\n                else if (colorAxis && colorAxis.length) {\n                    getOffset(colorAxis);\n                }\n                // Add the axis offsets\n                marginNames.forEach(function (m, side) {\n                    if (!defined(margin[side])) {\n                        chart[m] += axisOffset[side];\n                    }\n                });\n                chart.setChartSize();\n            };\n            /**\n             * Reflows the chart to its container. By default, the chart reflows\n             * automatically to its container following a `window.resize` event, as per\n             * the [chart.reflow](https://api.highcharts.com/highcharts/chart.reflow)\n             * option. However, there are no reliable events for div resize, so if the\n             * container is resized without a window resize event, this must be called\n             * explicitly.\n             *\n             * @sample highcharts/members/chart-reflow/\n             *         Resize div and reflow\n             * @sample highcharts/chart/events-container/\n             *         Pop up and reflow\n             *\n             * @function Highcharts.Chart#reflow\n             *\n             * @param {global.Event} [e]\n             *        Event arguments. Used primarily when the function is called\n             *        internally as a response to window resize.\n             */\n            Chart.prototype.reflow = function (e) {\n                var chart = this, optionsChart = chart.options.chart, renderTo = chart.renderTo, hasUserSize = (defined(optionsChart.width) &&\n                        defined(optionsChart.height)), width = optionsChart.width || getStyle(renderTo, 'width'), height = optionsChart.height || getStyle(renderTo, 'height'), target = e ? e.target : win;\n                // Width and height checks for display:none. Target is doc in IE8 and\n                // Opera, win in Firefox, Chrome and IE9.\n                if (!hasUserSize &&\n                    !chart.isPrinting &&\n                    width &&\n                    height &&\n                    (target === win || target === doc)) {\n                    if (width !== chart.containerWidth ||\n                        height !== chart.containerHeight) {\n                        U.clearTimeout(chart.reflowTimeout);\n                        // When called from window.resize, e is set, else it's called\n                        // directly (#2224)\n                        chart.reflowTimeout = syncTimeout(function () {\n                            // Set size, it may have been destroyed in the meantime\n                            // (#1257)\n                            if (chart.container) {\n                                chart.setSize(void 0, void 0, false);\n                            }\n                        }, e ? 100 : 0);\n                    }\n                    chart.containerWidth = width;\n                    chart.containerHeight = height;\n                }\n            };\n            /**\n             * Toggle the event handlers necessary for auto resizing, depending on the\n             * `chart.reflow` option.\n             *\n             * @private\n             * @function Highcharts.Chart#setReflow\n             */\n            Chart.prototype.setReflow = function (reflow) {\n                var chart = this;\n                if (reflow !== false && !this.unbindReflow) {\n                    this.unbindReflow = addEvent(win, 'resize', function (e) {\n                        // a removed event listener still runs in Edge and IE if the\n                        // listener was removed while the event runs, so check if the\n                        // chart is not destroyed (#11609)\n                        if (chart.options) {\n                            chart.reflow(e);\n                        }\n                    });\n                    addEvent(this, 'destroy', this.unbindReflow);\n                }\n                else if (reflow === false && this.unbindReflow) {\n                    // Unbind and unset\n                    this.unbindReflow = this.unbindReflow();\n                }\n                // The following will add listeners to re-fit the chart before and after\n                // printing (#2284). However it only works in WebKit. Should have worked\n                // in Firefox, but not supported in IE.\n                /*\n                if (win.matchMedia) {\n                    win.matchMedia('print').addListener(function reflow() {\n                        chart.reflow();\n                    });\n                }\n                //*/\n            };\n            /**\n             * Resize the chart to a given width and height. In order to set the width\n             * only, the height argument may be skipped. To set the height only, pass\n             * `undefined` for the width.\n             *\n             * @sample highcharts/members/chart-setsize-button/\n             *         Test resizing from buttons\n             * @sample highcharts/members/chart-setsize-jquery-resizable/\n             *         Add a jQuery UI resizable\n             * @sample stock/members/chart-setsize/\n             *         Highstock with UI resizable\n             *\n             * @function Highcharts.Chart#setSize\n             *\n             * @param {number|null} [width]\n             *        The new pixel width of the chart. Since v4.2.6, the argument can\n             *        be `undefined` in order to preserve the current value (when\n             *        setting height only), or `null` to adapt to the width of the\n             *        containing element.\n             *\n             * @param {number|null} [height]\n             *        The new pixel height of the chart. Since v4.2.6, the argument can\n             *        be `undefined` in order to preserve the current value, or `null`\n             *        in order to adapt to the height of the containing element.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:endResize\n             * @fires Highcharts.Chart#event:resize\n             */\n            Chart.prototype.setSize = function (width, height, animation) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    globalAnimation;\n                // Handle the isResizing counter\n                chart.isResizing += 1;\n                // set the animation for the current process\n                setAnimation(animation, chart);\n                globalAnimation = renderer.globalAnimation;\n                chart.oldChartHeight = chart.chartHeight;\n                chart.oldChartWidth = chart.chartWidth;\n                if (typeof width !== 'undefined') {\n                    chart.options.chart.width = width;\n                }\n                if (typeof height !== 'undefined') {\n                    chart.options.chart.height = height;\n                }\n                chart.getChartSize();\n                // Resize the container with the global animation applied if enabled\n                // (#2503)\n                if (!chart.styledMode) {\n                    (globalAnimation ? animate : css)(chart.container, {\n                        width: chart.chartWidth + 'px',\n                        height: chart.chartHeight + 'px'\n                    }, globalAnimation);\n                }\n                chart.setChartSize(true);\n                renderer.setSize(chart.chartWidth, chart.chartHeight, globalAnimation);\n                // handle axes\n                chart.axes.forEach(function (axis) {\n                    axis.isDirty = true;\n                    axis.setScale();\n                });\n                chart.isDirtyLegend = true; // force legend redraw\n                chart.isDirtyBox = true; // force redraw of plot and chart border\n                chart.layOutTitles(); // #2857\n                chart.getMargins();\n                chart.redraw(globalAnimation);\n                chart.oldChartHeight = null;\n                fireEvent(chart, 'resize');\n                // Fire endResize and set isResizing back. If animation is disabled,\n                // fire without delay\n                syncTimeout(function () {\n                    if (chart) {\n                        fireEvent(chart, 'endResize', null, function () {\n                            chart.isResizing -= 1;\n                        });\n                    }\n                }, animObject(globalAnimation).duration || 0);\n            };\n            /**\n             * Set the public chart properties. This is done before and after the\n             * pre-render to determine margin sizes.\n             *\n             * @private\n             * @function Highcharts.Chart#setChartSize\n             * @fires Highcharts.Chart#event:afterSetChartSize\n             */\n            Chart.prototype.setChartSize = function (skipAxes) {\n                var chart = this,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    optionsChart = chart.options.chart,\n                    spacing = chart.spacing,\n                    clipOffset = chart.clipOffset,\n                    clipX,\n                    clipY,\n                    plotLeft,\n                    plotTop,\n                    plotWidth,\n                    plotHeight,\n                    plotBorderWidth;\n                /**\n                 * The current left position of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotLeft\n                 * @type {number}\n                 */\n                chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n                /**\n                 * The current top position of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotTop\n                 * @type {number}\n                 */\n                chart.plotTop = plotTop = Math.round(chart.plotTop);\n                /**\n                 * The current width of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotWidth\n                 * @type {number}\n                 */\n                chart.plotWidth = plotWidth = Math.max(0, Math.round(chartWidth - plotLeft - chart.marginRight));\n                /**\n                 * The current height of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotHeight\n                 * @type {number}\n                 */\n                chart.plotHeight = plotHeight = Math.max(0, Math.round(chartHeight - plotTop - chart.marginBottom));\n                chart.plotSizeX = inverted ? plotHeight : plotWidth;\n                chart.plotSizeY = inverted ? plotWidth : plotHeight;\n                chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n                // Set boxes used for alignment\n                chart.spacingBox = renderer.spacingBox = {\n                    x: spacing[3],\n                    y: spacing[0],\n                    width: chartWidth - spacing[3] - spacing[1],\n                    height: chartHeight - spacing[0] - spacing[2]\n                };\n                chart.plotBox = renderer.plotBox = {\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                };\n                plotBorderWidth = 2 * Math.floor(chart.plotBorderWidth / 2);\n                clipX = Math.ceil(Math.max(plotBorderWidth, clipOffset[3]) / 2);\n                clipY = Math.ceil(Math.max(plotBorderWidth, clipOffset[0]) / 2);\n                chart.clipBox = {\n                    x: clipX,\n                    y: clipY,\n                    width: Math.floor(chart.plotSizeX -\n                        Math.max(plotBorderWidth, clipOffset[1]) / 2 -\n                        clipX),\n                    height: Math.max(0, Math.floor(chart.plotSizeY -\n                        Math.max(plotBorderWidth, clipOffset[2]) / 2 -\n                        clipY))\n                };\n                if (!skipAxes) {\n                    chart.axes.forEach(function (axis) {\n                        axis.setAxisSize();\n                        axis.setAxisTranslation();\n                    });\n                }\n                fireEvent(chart, 'afterSetChartSize', { skipAxes: skipAxes });\n            };\n            /**\n             * Initial margins before auto size margins are applied.\n             *\n             * @private\n             * @function Highcharts.Chart#resetMargins\n             */\n            Chart.prototype.resetMargins = function () {\n                fireEvent(this, 'resetMargins');\n                var chart = this,\n                    chartOptions = chart.options.chart;\n                // Create margin and spacing array\n                ['margin', 'spacing'].forEach(function splashArrays(target) {\n                    var value = chartOptions[target],\n                        values = isObject(value) ? value : [value,\n                        value,\n                        value,\n                        value];\n                    [\n                        'Top',\n                        'Right',\n                        'Bottom',\n                        'Left'\n                    ].forEach(function (sideName, side) {\n                        chart[target][side] = pick(chartOptions[target + sideName], values[side]);\n                    });\n                });\n                // Set margin names like chart.plotTop, chart.plotLeft,\n                // chart.marginRight, chart.marginBottom.\n                marginNames.forEach(function (m, side) {\n                    chart[m] = pick(chart.margin[side], chart.spacing[side]);\n                });\n                chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n                chart.clipOffset = [0, 0, 0, 0];\n            };\n            /**\n             * Internal function to draw or redraw the borders and backgrounds for chart\n             * and plot area.\n             *\n             * @private\n             * @function Highcharts.Chart#drawChartBox\n             * @fires Highcharts.Chart#event:afterDrawChartBox\n             */\n            Chart.prototype.drawChartBox = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    chartBackground = chart.chartBackground,\n                    plotBackground = chart.plotBackground,\n                    plotBorder = chart.plotBorder,\n                    chartBorderWidth,\n                    styledMode = chart.styledMode,\n                    plotBGImage = chart.plotBGImage,\n                    chartBackgroundColor = optionsChart.backgroundColor,\n                    plotBackgroundColor = optionsChart.plotBackgroundColor,\n                    plotBackgroundImage = optionsChart.plotBackgroundImage,\n                    mgn,\n                    bgAttr,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotBox = chart.plotBox,\n                    clipRect = chart.clipRect,\n                    clipBox = chart.clipBox,\n                    verb = 'animate';\n                // Chart area\n                if (!chartBackground) {\n                    chart.chartBackground = chartBackground = renderer.rect()\n                        .addClass('highcharts-background')\n                        .add();\n                    verb = 'attr';\n                }\n                if (!styledMode) {\n                    // Presentational\n                    chartBorderWidth = optionsChart.borderWidth || 0;\n                    mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n                    bgAttr = {\n                        fill: chartBackgroundColor || 'none'\n                    };\n                    if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n                        bgAttr.stroke = optionsChart.borderColor;\n                        bgAttr['stroke-width'] = chartBorderWidth;\n                    }\n                    chartBackground\n                        .attr(bgAttr)\n                        .shadow(optionsChart.shadow);\n                }\n                else {\n                    chartBorderWidth = mgn = chartBackground.strokeWidth();\n                }\n                chartBackground[verb]({\n                    x: mgn / 2,\n                    y: mgn / 2,\n                    width: chartWidth - mgn - chartBorderWidth % 2,\n                    height: chartHeight - mgn - chartBorderWidth % 2,\n                    r: optionsChart.borderRadius\n                });\n                // Plot background\n                verb = 'animate';\n                if (!plotBackground) {\n                    verb = 'attr';\n                    chart.plotBackground = plotBackground = renderer.rect()\n                        .addClass('highcharts-plot-background')\n                        .add();\n                }\n                plotBackground[verb](plotBox);\n                if (!styledMode) {\n                    // Presentational attributes for the background\n                    plotBackground\n                        .attr({\n                        fill: plotBackgroundColor || 'none'\n                    })\n                        .shadow(optionsChart.plotShadow);\n                    // Create the background image\n                    if (plotBackgroundImage) {\n                        if (!plotBGImage) {\n                            chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight).add();\n                        }\n                        else {\n                            if (plotBackgroundImage !== plotBGImage.attr('href')) {\n                                plotBGImage.attr('href', plotBackgroundImage);\n                            }\n                            plotBGImage.animate(plotBox);\n                        }\n                    }\n                }\n                // Plot clip\n                if (!clipRect) {\n                    chart.clipRect = renderer.clipRect(clipBox);\n                }\n                else {\n                    clipRect.animate({\n                        width: clipBox.width,\n                        height: clipBox.height\n                    });\n                }\n                // Plot area border\n                verb = 'animate';\n                if (!plotBorder) {\n                    verb = 'attr';\n                    chart.plotBorder = plotBorder = renderer.rect()\n                        .addClass('highcharts-plot-border')\n                        .attr({\n                        zIndex: 1 // Above the grid\n                    })\n                        .add();\n                }\n                if (!styledMode) {\n                    // Presentational\n                    plotBorder.attr({\n                        stroke: optionsChart.plotBorderColor,\n                        'stroke-width': optionsChart.plotBorderWidth || 0,\n                        fill: 'none'\n                    });\n                }\n                plotBorder[verb](plotBorder.crisp({\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                }, -plotBorder.strokeWidth())); // #3282 plotBorder should be negative;\n                // reset\n                chart.isDirtyBox = false;\n                fireEvent(this, 'afterDrawChartBox');\n            };\n            /**\n             * Detect whether a certain chart property is needed based on inspecting its\n             * options and series. This mainly applies to the chart.inverted property,\n             * and in extensions to the chart.angular and chart.polar properties.\n             *\n             * @private\n             * @function Highcharts.Chart#propFromSeries\n             * @return {void}\n             */\n            Chart.prototype.propFromSeries = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    klass,\n                    seriesOptions = chart.options.series,\n                    i,\n                    value;\n                /**\n                 * The flag is set to `true` if a series of the chart is inverted.\n                 *\n                 * @name Highcharts.Chart#inverted\n                 * @type {boolean|undefined}\n                 */\n                ['inverted', 'angular', 'polar'].forEach(function (key) {\n                    // The default series type's class\n                    klass = seriesTypes[(optionsChart.type ||\n                        optionsChart.defaultSeriesType)];\n                    // Get the value from available chart-wide properties\n                    value =\n                        // It is set in the options:\n                        optionsChart[key] ||\n                            // The default series class:\n                            (klass && klass.prototype[key]);\n                    // requires it\n                    // 4. Check if any the chart's series require it\n                    i = seriesOptions && seriesOptions.length;\n                    while (!value && i--) {\n                        klass = seriesTypes[seriesOptions[i].type];\n                        if (klass && klass.prototype[key]) {\n                            value = true;\n                        }\n                    }\n                    // Set the chart property\n                    chart[key] = value;\n                });\n            };\n            /**\n             * Internal function to link two or more series together, based on the\n             * `linkedTo` option. This is done from `Chart.render`, and after\n             * `Chart.addSeries` and `Series.remove`.\n             *\n             * @private\n             * @function Highcharts.Chart#linkSeries\n             * @fires Highcharts.Chart#event:afterLinkSeries\n             */\n            Chart.prototype.linkSeries = function () {\n                var chart = this,\n                    chartSeries = chart.series;\n                // Reset links\n                chartSeries.forEach(function (series) {\n                    series.linkedSeries.length = 0;\n                });\n                // Apply new links\n                chartSeries.forEach(function (series) {\n                    var linkedTo = series.options.linkedTo;\n                    if (isString(linkedTo)) {\n                        if (linkedTo === ':previous') {\n                            linkedTo = chart.series[series.index - 1];\n                        }\n                        else {\n                            linkedTo = chart.get(linkedTo);\n                        }\n                        // #3341 avoid mutual linking\n                        if (linkedTo && linkedTo.linkedParent !== series) {\n                            linkedTo.linkedSeries.push(series);\n                            series.linkedParent = linkedTo;\n                            if (linkedTo.enabledDataSorting) {\n                                series.setDataSortingOptions();\n                            }\n                            series.visible = pick(series.options.visible, linkedTo.options.visible, series.visible); // #3879\n                        }\n                    }\n                });\n                fireEvent(this, 'afterLinkSeries');\n            };\n            /**\n             * Render series for the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#renderSeries\n             */\n            Chart.prototype.renderSeries = function () {\n                this.series.forEach(function (serie) {\n                    serie.translate();\n                    serie.render();\n                });\n            };\n            /**\n             * Render labels for the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#renderLabels\n             */\n            Chart.prototype.renderLabels = function () {\n                var chart = this,\n                    labels = chart.options.labels;\n                if (labels.items) {\n                    labels.items.forEach(function (label) {\n                        var style = extend(labels.style,\n                            label.style),\n                            x = pInt(style.left) + chart.plotLeft,\n                            y = pInt(style.top) + chart.plotTop + 12;\n                        // delete to prevent rewriting in IE\n                        delete style.left;\n                        delete style.top;\n                        chart.renderer.text(label.html, x, y)\n                            .attr({ zIndex: 2 })\n                            .css(style)\n                            .add();\n                    });\n                }\n            };\n            /**\n             * Render all graphics for the chart. Runs internally on initialization.\n             *\n             * @private\n             * @function Highcharts.Chart#render\n             */\n            Chart.prototype.render = function () {\n                var chart = this,\n                    axes = chart.axes,\n                    colorAxis = chart.colorAxis,\n                    renderer = chart.renderer,\n                    options = chart.options,\n                    correction = 0, // correction for X axis labels\n                    tempWidth,\n                    tempHeight,\n                    redoHorizontal,\n                    redoVertical,\n                    renderAxes = function (axes) {\n                        axes.forEach(function (axis) {\n                            if (axis.visible) {\n                                axis.render();\n                        }\n                    });\n                };\n                // Title\n                chart.setTitle();\n                /**\n                 * The overview of the chart's series.\n                 *\n                 * @name Highcharts.Chart#legend\n                 * @type {Highcharts.Legend}\n                 */\n                chart.legend = new Legend(chart, options.legend);\n                // Get stacks\n                if (chart.getStacks) {\n                    chart.getStacks();\n                }\n                // Get chart margins\n                chart.getMargins(true);\n                chart.setChartSize();\n                // Record preliminary dimensions for later comparison\n                tempWidth = chart.plotWidth;\n                axes.some(function (axis) {\n                    if (axis.horiz &&\n                        axis.visible &&\n                        axis.options.labels.enabled &&\n                        axis.series.length) {\n                        // 21 is the most common correction for X axis labels\n                        correction = 21;\n                        return true;\n                    }\n                });\n                // use Math.max to prevent negative plotHeight\n                chart.plotHeight = Math.max(chart.plotHeight - correction, 0);\n                tempHeight = chart.plotHeight;\n                // Get margins by pre-rendering axes\n                axes.forEach(function (axis) {\n                    axis.setScale();\n                });\n                chart.getAxisMargins();\n                // If the plot area size has changed significantly, calculate tick\n                // positions again\n                redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n                // Height is more sensitive, use lower threshold\n                redoVertical = tempHeight / chart.plotHeight > 1.05;\n                if (redoHorizontal || redoVertical) {\n                    axes.forEach(function (axis) {\n                        if ((axis.horiz && redoHorizontal) ||\n                            (!axis.horiz && redoVertical)) {\n                            // update to reflect the new margins\n                            axis.setTickInterval(true);\n                        }\n                    });\n                    chart.getMargins(); // second pass to check for new labels\n                }\n                // Draw the borders and backgrounds\n                chart.drawChartBox();\n                // Axes\n                if (chart.hasCartesianSeries) {\n                    renderAxes(axes);\n                }\n                else if (colorAxis && colorAxis.length) {\n                    renderAxes(colorAxis);\n                }\n                // The series\n                if (!chart.seriesGroup) {\n                    chart.seriesGroup = renderer.g('series-group')\n                        .attr({ zIndex: 3 })\n                        .add();\n                }\n                chart.renderSeries();\n                // Labels\n                chart.renderLabels();\n                // Credits\n                chart.addCredits();\n                // Handle responsiveness\n                if (chart.setResponsive) {\n                    chart.setResponsive();\n                }\n                // Handle scaling\n                chart.updateContainerScaling();\n                // Set flag\n                chart.hasRendered = true;\n            };\n            /**\n             * Set a new credits label for the chart.\n             *\n             * @sample highcharts/credits/credits-update/\n             *         Add and update credits\n             *\n             * @function Highcharts.Chart#addCredits\n             *\n             * @param {Highcharts.CreditsOptions} [credits]\n             * A configuration object for the new credits.\n             */\n            Chart.prototype.addCredits = function (credits) {\n                var chart = this,\n                    creds = merge(true,\n                    this.options.credits,\n                    credits);\n                if (creds.enabled && !this.credits) {\n                    /**\n                     * The chart's credits label. The label has an `update` method that\n                     * allows setting new options as per the\n                     * [credits options set](https://api.highcharts.com/highcharts/credits).\n                     *\n                     * @name Highcharts.Chart#credits\n                     * @type {Highcharts.SVGElement}\n                     */\n                    this.credits = this.renderer.text(creds.text + (this.mapCredits || ''), 0, 0)\n                        .addClass('highcharts-credits')\n                        .on('click', function () {\n                        if (creds.href) {\n                            win.location.href = creds.href;\n                        }\n                    })\n                        .attr({\n                        align: creds.position.align,\n                        zIndex: 8\n                    });\n                    if (!chart.styledMode) {\n                        this.credits.css(creds.style);\n                    }\n                    this.credits\n                        .add()\n                        .align(creds.position);\n                    // Dynamically update\n                    this.credits.update = function (options) {\n                        chart.credits = chart.credits.destroy();\n                        chart.addCredits(options);\n                    };\n                }\n            };\n            /**\n             * Handle scaling, #11329 - when there is scaling/transform on the container\n             * or on a parent element, we need to take this into account. We calculate\n             * the scaling once here and it is picked up where we need to use it\n             * (Pointer, Tooltip).\n             *\n             * @private\n             * @function Highcharts.Chart#updateContainerScaling\n             */\n            Chart.prototype.updateContainerScaling = function () {\n                var container = this.container;\n                // #13342 - tooltip was not visible in Chrome, when chart\n                // updates height.\n                if (container.offsetWidth > 2 && // #13342\n                    container.offsetHeight > 2 && // #13342\n                    container.getBoundingClientRect) {\n                    var bb = container.getBoundingClientRect(),\n                        scaleX = bb.width / container.offsetWidth,\n                        scaleY = bb.height / container.offsetHeight;\n                    if (scaleX !== 1 || scaleY !== 1) {\n                        this.containerScaling = { scaleX: scaleX, scaleY: scaleY };\n                    }\n                    else {\n                        delete this.containerScaling;\n                    }\n                }\n            };\n            /**\n             * Remove the chart and purge memory. This method is called internally\n             * before adding a second chart into the same container, as well as on\n             * window unload to prevent leaks.\n             *\n             * @sample highcharts/members/chart-destroy/\n             *         Destroy the chart from a button\n             * @sample stock/members/chart-destroy/\n             *         Destroy with Highstock\n             *\n             * @function Highcharts.Chart#destroy\n             *\n             * @fires Highcharts.Chart#event:destroy\n             */\n            Chart.prototype.destroy = function () {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    container = chart.container,\n                    i,\n                    parentNode = container && container.parentNode;\n                // fire the chart.destoy event\n                fireEvent(chart, 'destroy');\n                // Delete the chart from charts lookup array\n                if (chart.renderer.forExport) {\n                    erase(charts, chart); // #6569\n                }\n                else {\n                    charts[chart.index] = void 0;\n                }\n                H.chartCount--;\n                chart.renderTo.removeAttribute('data-highcharts-chart');\n                // remove events\n                removeEvent(chart);\n                // ==== Destroy collections:\n                // Destroy axes\n                i = axes.length;\n                while (i--) {\n                    axes[i] = axes[i].destroy();\n                }\n                // Destroy scroller & scroller series before destroying base series\n                if (this.scroller && this.scroller.destroy) {\n                    this.scroller.destroy();\n                }\n                // Destroy each series\n                i = series.length;\n                while (i--) {\n                    series[i] = series[i].destroy();\n                }\n                // ==== Destroy chart properties:\n                [\n                    'title', 'subtitle', 'chartBackground', 'plotBackground',\n                    'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n                    'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n                    'renderer'\n                ].forEach(function (name) {\n                    var prop = chart[name];\n                    if (prop && prop.destroy) {\n                        chart[name] = prop.destroy();\n                    }\n                });\n                // Remove container and all SVG, check container as it can break in IE\n                // when destroyed before finished loading\n                if (container) {\n                    container.innerHTML = '';\n                    removeEvent(container);\n                    if (parentNode) {\n                        discardElement(container);\n                    }\n                }\n                // clean it all up\n                objectEach(chart, function (val, key) {\n                    delete chart[key];\n                });\n            };\n            /**\n             * Prepare for first rendering after all data are loaded.\n             *\n             * @private\n             * @function Highcharts.Chart#firstRender\n             * @fires Highcharts.Chart#event:beforeRender\n             */\n            Chart.prototype.firstRender = function () {\n                var chart = this,\n                    options = chart.options;\n                // Hook for oldIE to check whether the chart is ready to render\n                if (chart.isReadyToRender && !chart.isReadyToRender()) {\n                    return;\n                }\n                // Create the container\n                chart.getContainer();\n                chart.resetMargins();\n                chart.setChartSize();\n                // Set the common chart properties (mainly invert) from the given series\n                chart.propFromSeries();\n                // get axes\n                chart.getAxes();\n                // Initialize the series\n                (isArray(options.series) ? options.series : []).forEach(\n                // #9680\n                function (serieOptions) {\n                    chart.initSeries(serieOptions);\n                });\n                chart.linkSeries();\n                chart.setSeriesData();\n                // Run an event after axes and series are initialized, but before\n                // render. At this stage, the series data is indexed and cached in the\n                // xData and yData arrays, so we can access those before rendering. Used\n                // in Highstock.\n                fireEvent(chart, 'beforeRender');\n                // depends on inverted and on margins being set\n                if (Pointer) {\n                    if (!H.hasTouch && (win.PointerEvent || win.MSPointerEvent)) {\n                        chart.pointer = new MSPointer(chart, options);\n                    }\n                    else {\n                        /**\n                         * The Pointer that keeps track of mouse and touch interaction.\n                         *\n                         * @memberof Highcharts.Chart\n                         * @name pointer\n                         * @type {Highcharts.Pointer}\n                         * @instance\n                         */\n                        chart.pointer = new Pointer(chart, options);\n                    }\n                }\n                chart.render();\n                // Fire the load event if there are no external images\n                if (!chart.renderer.imgCount && !chart.hasLoaded) {\n                    chart.onload();\n                }\n                // If the chart was rendered outside the top container, put it back in\n                // (#3679)\n                chart.temporaryDisplay(true);\n            };\n            /**\n             * Internal function that runs on chart load, async if any images are loaded\n             * in the chart. Runs the callbacks and triggers the `load` and `render`\n             * events.\n             *\n             * @private\n             * @function Highcharts.Chart#onload\n             * @fires Highcharts.Chart#event:load\n             * @fires Highcharts.Chart#event:render\n             */\n            Chart.prototype.onload = function () {\n                // Run callbacks, first the ones registered by modules, then user's one\n                this.callbacks.concat([this.callback]).forEach(function (fn) {\n                    // Chart destroyed in its own callback (#3600)\n                    if (fn && typeof this.index !== 'undefined') {\n                        fn.apply(this, [this]);\n                    }\n                }, this);\n                fireEvent(this, 'load');\n                fireEvent(this, 'render');\n                // Set up auto resize, check for not destroyed (#6068)\n                if (defined(this.index)) {\n                    this.setReflow(this.options.chart.reflow);\n                }\n                // Don't run again\n                this.hasLoaded = true;\n            };\n            return Chart;\n        }());\n        // Hook for adding callbacks in modules\n        Chart.prototype.callbacks = [];\n        /**\n         * Factory function for basic charts.\n         *\n         * @example\n         * // Render a chart in to div#container\n         * var chart = Highcharts.chart('container', {\n         *     title: {\n         *         text: 'My chart'\n         *     },\n         *     series: [{\n         *         data: [1, 3, 2, 4]\n         *     }]\n         * });\n         *\n         * @function Highcharts.chart\n         *\n         * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n         *        The DOM element to render to, or its id.\n         *\n         * @param {Highcharts.Options} options\n         *        The chart options structure.\n         *\n         * @param {Highcharts.ChartCallbackFunction} [callback]\n         *        Function to run when the chart has loaded and and all external images\n         *        are loaded. Defining a\n         *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n         *        handler is equivalent.\n         *\n         * @return {Highcharts.Chart}\n         *         Returns the Chart object.\n         */\n        function chart(a, b, c) {\n            return new Chart(a, b, c);\n        }\n        H.chart = chart;\n        H.Chart = Chart;\n\n        return Chart;\n    });\n    _registerModule(_modules, 'parts/ScrollablePlotArea.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Chart, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         *  Highcharts feature to make the Y axis stay fixed when scrolling the chart\n         *  horizontally on mobile devices. Supports left and right side axes.\n         */\n        /*\n        WIP on vertical scrollable plot area (#9378). To do:\n        - Bottom axis positioning\n        - Test with Gantt\n        - Look for size optimizing the code\n        - API and demos\n         */\n        var addEvent = U.addEvent,\n            createElement = U.createElement,\n            pick = U.pick,\n            stop = U.stop;\n        /**\n         * Options for a scrollable plot area. This feature provides a minimum size for\n         * the plot area of the chart. If the size gets smaller than this, typically\n         * on mobile devices, a native browser scrollbar is presented. This scrollbar\n         * provides smooth scrolling for the contents of the plot area, whereas the\n         * title, legend and unaffected axes are fixed.\n         *\n         * Since v7.1.2, a scrollable plot area can be defined for either horizontal or\n         * vertical scrolling, depending on whether the `minWidth` or `minHeight`\n         * option is set.\n         *\n         * @sample highcharts/chart/scrollable-plotarea\n         *         Scrollable plot area\n         * @sample highcharts/chart/scrollable-plotarea-vertical\n         *         Vertically scrollable plot area\n         * @sample {gantt} highcharts/chart/scrollable-plotarea-vertical\n         *         Gantt chart with vertically scrollable plot area\n         *\n         * @since     6.1.0\n         * @product   highcharts gantt\n         * @apioption chart.scrollablePlotArea\n         */\n        /**\n         * The minimum height for the plot area. If it gets smaller than this, the plot\n         * area will become scrollable.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.minHeight\n         */\n        /**\n         * The minimum width for the plot area. If it gets smaller than this, the plot\n         * area will become scrollable.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.minWidth\n         */\n        /**\n         * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n         * 1, where 0 aligns the plot area to the left and 1 aligns it to the right.\n         * Typically we would use 1 if the chart has right aligned Y axes.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.scrollPositionX\n         */\n        /**\n         * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n         * 1, where 0 aligns the plot area to the top and 1 aligns it to the bottom.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.scrollPositionY\n         */\n        /**\n         * The opacity of mask applied on one of the sides of the plot\n         * area.\n         *\n         * @sample {highcharts} highcharts/chart/scrollable-plotarea-opacity\n         *         Disabled opacity for the mask\n         *\n         * @type        {number}\n         * @default     0.85\n         * @since       7.1.1\n         * @apioption   chart.scrollablePlotArea.opacity\n         */\n        ''; // detach API doclets\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        addEvent(Chart, 'afterSetChartSize', function (e) {\n            var scrollablePlotArea = this.options.chart.scrollablePlotArea,\n                scrollableMinWidth = scrollablePlotArea && scrollablePlotArea.minWidth,\n                scrollableMinHeight = scrollablePlotArea && scrollablePlotArea.minHeight,\n                scrollablePixelsX,\n                scrollablePixelsY,\n                corrections;\n            if (!this.renderer.forExport) {\n                // The amount of pixels to scroll, the difference between chart\n                // width and scrollable width\n                if (scrollableMinWidth) {\n                    this.scrollablePixelsX = scrollablePixelsX = Math.max(0, scrollableMinWidth - this.chartWidth);\n                    if (scrollablePixelsX) {\n                        this.plotWidth += scrollablePixelsX;\n                        if (this.inverted) {\n                            this.clipBox.height += scrollablePixelsX;\n                            this.plotBox.height += scrollablePixelsX;\n                        }\n                        else {\n                            this.clipBox.width += scrollablePixelsX;\n                            this.plotBox.width += scrollablePixelsX;\n                        }\n                        corrections = {\n                            // Corrections for right side\n                            1: { name: 'right', value: scrollablePixelsX }\n                        };\n                    }\n                    // Currently we can only do either X or Y\n                }\n                else if (scrollableMinHeight) {\n                    this.scrollablePixelsY = scrollablePixelsY = Math.max(0, scrollableMinHeight - this.chartHeight);\n                    if (scrollablePixelsY) {\n                        this.plotHeight += scrollablePixelsY;\n                        if (this.inverted) {\n                            this.clipBox.width += scrollablePixelsY;\n                            this.plotBox.width += scrollablePixelsY;\n                        }\n                        else {\n                            this.clipBox.height += scrollablePixelsY;\n                            this.plotBox.height += scrollablePixelsY;\n                        }\n                        corrections = {\n                            2: { name: 'bottom', value: scrollablePixelsY }\n                        };\n                    }\n                }\n                if (corrections && !e.skipAxes) {\n                    this.axes.forEach(function (axis) {\n                        // For right and bottom axes, only fix the plot line length\n                        if (corrections[axis.side]) {\n                            // Get the plot lines right in getPlotLinePath,\n                            // temporarily set it to the adjusted plot width.\n                            axis.getPlotLinePath = function () {\n                                var marginName = corrections[axis.side].name,\n                                    correctionValue = corrections[axis.side].value, \n                                    // axis.right or axis.bottom\n                                    margin = this[marginName],\n                                    path;\n                                // Temporarily adjust\n                                this[marginName] = margin - correctionValue;\n                                path = H.Axis.prototype.getPlotLinePath.apply(this, arguments);\n                                // Reset\n                                this[marginName] = margin;\n                                return path;\n                            };\n                        }\n                        else {\n                            // Apply the corrected plotWidth\n                            axis.setAxisSize();\n                            axis.setAxisTranslation();\n                        }\n                    });\n                }\n            }\n        });\n        addEvent(Chart, 'render', function () {\n            if (this.scrollablePixelsX || this.scrollablePixelsY) {\n                if (this.setUpScrolling) {\n                    this.setUpScrolling();\n                }\n                this.applyFixed();\n            }\n            else if (this.fixedDiv) { // Has been in scrollable mode\n                this.applyFixed();\n            }\n        });\n        /**\n         * @private\n         * @function Highcharts.Chart#setUpScrolling\n         * @return {void}\n         */\n        Chart.prototype.setUpScrolling = function () {\n            var _this = this;\n            var attribs = {\n                    WebkitOverflowScrolling: 'touch',\n                    overflowX: 'hidden',\n                    overflowY: 'hidden'\n                };\n            if (this.scrollablePixelsX) {\n                attribs.overflowX = 'auto';\n            }\n            if (this.scrollablePixelsY) {\n                attribs.overflowY = 'auto';\n            }\n            // Add the necessary divs to provide scrolling\n            this.scrollingContainer = createElement('div', {\n                'className': 'highcharts-scrolling'\n            }, attribs, this.renderTo);\n            // On scroll, reset the chart position because it applies to the scrolled\n            // container\n            addEvent(this.scrollingContainer, 'scroll', function () {\n                if (_this.pointer) {\n                    delete _this.pointer.chartPosition;\n                }\n            });\n            this.innerContainer = createElement('div', {\n                'className': 'highcharts-inner-container'\n            }, null, this.scrollingContainer);\n            // Now move the container inside\n            this.innerContainer.appendChild(this.container);\n            // Don't run again\n            this.setUpScrolling = null;\n        };\n        /**\n         * These elements are moved over to the fixed renderer and stay fixed when the\n         * user scrolls the chart\n         * @private\n         */\n        Chart.prototype.moveFixedElements = function () {\n            var container = this.container,\n                fixedRenderer = this.fixedRenderer,\n                fixedSelectors = [\n                    '.highcharts-contextbutton',\n                    '.highcharts-credits',\n                    '.highcharts-legend',\n                    '.highcharts-legend-checkbox',\n                    '.highcharts-navigator-series',\n                    '.highcharts-navigator-xaxis',\n                    '.highcharts-navigator-yaxis',\n                    '.highcharts-navigator',\n                    '.highcharts-reset-zoom',\n                    '.highcharts-scrollbar',\n                    '.highcharts-subtitle',\n                    '.highcharts-title'\n                ],\n                axisClass;\n            if (this.scrollablePixelsX && !this.inverted) {\n                axisClass = '.highcharts-yaxis';\n            }\n            else if (this.scrollablePixelsX && this.inverted) {\n                axisClass = '.highcharts-xaxis';\n            }\n            else if (this.scrollablePixelsY && !this.inverted) {\n                axisClass = '.highcharts-xaxis';\n            }\n            else if (this.scrollablePixelsY && this.inverted) {\n                axisClass = '.highcharts-yaxis';\n            }\n            fixedSelectors.push(axisClass, axisClass + '-labels');\n            fixedSelectors.forEach(function (className) {\n                [].forEach.call(container.querySelectorAll(className), function (elem) {\n                    (elem.namespaceURI === fixedRenderer.SVG_NS ?\n                        fixedRenderer.box :\n                        fixedRenderer.box.parentNode).appendChild(elem);\n                    elem.style.pointerEvents = 'auto';\n                });\n            });\n        };\n        /**\n         * @private\n         * @function Highcharts.Chart#applyFixed\n         * @return {void}\n         */\n        Chart.prototype.applyFixed = function () {\n            var _a;\n            var fixedRenderer,\n                scrollableWidth,\n                scrollableHeight,\n                firstTime = !this.fixedDiv,\n                scrollableOptions = this.options.chart.scrollablePlotArea;\n            // First render\n            if (firstTime) {\n                this.fixedDiv = createElement('div', {\n                    className: 'highcharts-fixed'\n                }, {\n                    position: 'absolute',\n                    overflow: 'hidden',\n                    pointerEvents: 'none',\n                    zIndex: 2\n                }, null, true);\n                this.renderTo.insertBefore(this.fixedDiv, this.renderTo.firstChild);\n                this.renderTo.style.overflow = 'visible';\n                this.fixedRenderer = fixedRenderer = new H.Renderer(this.fixedDiv, this.chartWidth, this.chartHeight, (_a = this.options.chart) === null || _a === void 0 ? void 0 : _a.style);\n                // Mask\n                this.scrollableMask = fixedRenderer\n                    .path()\n                    .attr({\n                    fill: this.options.chart.backgroundColor || '#fff',\n                    'fill-opacity': pick(scrollableOptions.opacity, 0.85),\n                    zIndex: -1\n                })\n                    .addClass('highcharts-scrollable-mask')\n                    .add();\n                this.moveFixedElements();\n                addEvent(this, 'afterShowResetZoom', this.moveFixedElements);\n                addEvent(this, 'afterLayOutTitles', this.moveFixedElements);\n            }\n            else {\n                // Set the size of the fixed renderer to the visible width\n                this.fixedRenderer.setSize(this.chartWidth, this.chartHeight);\n            }\n            // Increase the size of the scrollable renderer and background\n            scrollableWidth = this.chartWidth + (this.scrollablePixelsX || 0);\n            scrollableHeight = this.chartHeight + (this.scrollablePixelsY || 0);\n            stop(this.container);\n            this.container.style.width = scrollableWidth + 'px';\n            this.container.style.height = scrollableHeight + 'px';\n            this.renderer.boxWrapper.attr({\n                width: scrollableWidth,\n                height: scrollableHeight,\n                viewBox: [0, 0, scrollableWidth, scrollableHeight].join(' ')\n            });\n            this.chartBackground.attr({\n                width: scrollableWidth,\n                height: scrollableHeight\n            });\n            this.scrollingContainer.style.height = this.chartHeight + 'px';\n            // Set scroll position\n            if (firstTime) {\n                if (scrollableOptions.scrollPositionX) {\n                    this.scrollingContainer.scrollLeft =\n                        this.scrollablePixelsX *\n                            scrollableOptions.scrollPositionX;\n                }\n                if (scrollableOptions.scrollPositionY) {\n                    this.scrollingContainer.scrollTop =\n                        this.scrollablePixelsY *\n                            scrollableOptions.scrollPositionY;\n                }\n            }\n            // Mask behind the left and right side\n            var axisOffset = this.axisOffset,\n                maskTop = this.plotTop - axisOffset[0] - 1,\n                maskLeft = this.plotLeft - axisOffset[3] - 1,\n                maskBottom = this.plotTop + this.plotHeight + axisOffset[2] + 1,\n                maskRight = this.plotLeft + this.plotWidth + axisOffset[1] + 1,\n                maskPlotRight = this.plotLeft + this.plotWidth -\n                    (this.scrollablePixelsX || 0),\n                maskPlotBottom = this.plotTop + this.plotHeight -\n                    (this.scrollablePixelsY || 0),\n                d;\n            if (this.scrollablePixelsX) {\n                d = [\n                    // Left side\n                    ['M', 0, maskTop],\n                    ['L', this.plotLeft - 1, maskTop],\n                    ['L', this.plotLeft - 1, maskBottom],\n                    ['L', 0, maskBottom],\n                    ['Z'],\n                    // Right side\n                    ['M', maskPlotRight, maskTop],\n                    ['L', this.chartWidth, maskTop],\n                    ['L', this.chartWidth, maskBottom],\n                    ['L', maskPlotRight, maskBottom],\n                    ['Z']\n                ];\n            }\n            else if (this.scrollablePixelsY) {\n                d = [\n                    // Top side\n                    ['M', maskLeft, 0],\n                    ['L', maskLeft, this.plotTop - 1],\n                    ['L', maskRight, this.plotTop - 1],\n                    ['L', maskRight, 0],\n                    ['Z'],\n                    // Bottom side\n                    ['M', maskLeft, maskPlotBottom],\n                    ['L', maskLeft, this.chartHeight],\n                    ['L', maskRight, this.chartHeight],\n                    ['L', maskRight, maskPlotBottom],\n                    ['Z']\n                ];\n            }\n            else {\n                d = [['M', 0, 0]];\n            }\n            if (this.redrawTrigger !== 'adjustHeight') {\n                this.scrollableMask.attr({ d: d });\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/StackingAxis.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            destroyObjectProperties = U.destroyObjectProperties,\n            fireEvent = U.fireEvent,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Adds stacking support to axes.\n         * @private\n         * @class\n         */\n        var StackingAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function StackingAxisAdditions(axis) {\n                    this.oldStacks = {};\n                this.stacks = {};\n                this.stacksTouched = 0;\n                this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Build the stacks from top down\n             * @private\n             */\n            StackingAxisAdditions.prototype.buildStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var axisSeries = axis.series;\n                var reversedStacks = pick(axis.options.reversedStacks,\n                    true);\n                var len = axisSeries.length;\n                var actualSeries,\n                    i;\n                if (!axis.isXAxis) {\n                    stacking.usePercentage = false;\n                    i = len;\n                    while (i--) {\n                        actualSeries = axisSeries[reversedStacks ? i : len - i - 1];\n                        actualSeries.setStackedPoints();\n                        actualSeries.setGroupedPoints();\n                    }\n                    // Loop up again to compute percent and stream stack\n                    for (i = 0; i < len; i++) {\n                        axisSeries[i].modifyStacks();\n                    }\n                    fireEvent(axis, 'afterBuildStacks');\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxisAdditions.prototype.cleanStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var stacks;\n                if (!axis.isXAxis) {\n                    if (stacking.oldStacks) {\n                        stacks = stacking.stacks = stacking.oldStacks;\n                    }\n                    // reset stacks\n                    objectEach(stacks, function (type) {\n                        objectEach(type, function (stack) {\n                            stack.cumulative = stack.total;\n                        });\n                    });\n                }\n            };\n            /**\n             * Set all the stacks to initial states and destroy unused ones.\n             * @private\n             */\n            StackingAxisAdditions.prototype.resetStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var stacks = stacking.stacks;\n                if (!axis.isXAxis) {\n                    objectEach(stacks, function (type) {\n                        objectEach(type, function (stack, key) {\n                            // Clean up memory after point deletion (#1044, #4320)\n                            if (stack.touched < stacking.stacksTouched) {\n                                stack.destroy();\n                                delete type[key];\n                                // Reset stacks\n                            }\n                            else {\n                                stack.total = null;\n                                stack.cumulative = null;\n                            }\n                        });\n                    });\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxisAdditions.prototype.renderStackTotals = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var chart = axis.chart;\n                var renderer = chart.renderer;\n                var stacks = stacking.stacks;\n                var stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||\n                        renderer\n                            .g('stack-labels')\n                            .attr({\n                            visibility: 'visible',\n                            zIndex: 6\n                        })\n                            .add());\n                // plotLeft/Top will change when y axis gets wider so we need to\n                // translate the stackTotalGroup at every render call. See bug #506\n                // and #516\n                stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n                // Render each stack total\n                objectEach(stacks, function (type) {\n                    objectEach(type, function (stack) {\n                        stack.render(stackTotalGroup);\n                    });\n                });\n            };\n            return StackingAxisAdditions;\n        }());\n        /**\n         * Axis with stacking support.\n         * @private\n         * @class\n         */\n        var StackingAxis = /** @class */ (function () {\n                function StackingAxis() {\n                }\n                /* *\n                 *\n                 *  Static Functions\n                 *\n                 * */\n                /**\n                 * Extends axis with stacking support.\n                 * @private\n                 */\n                StackingAxis.compose = function (AxisClass) {\n                    var axisProto = AxisClass.prototype;\n                addEvent(AxisClass, 'init', StackingAxis.onInit);\n                addEvent(AxisClass, 'destroy', StackingAxis.onDestroy);\n            };\n            /**\n             * @private\n             */\n            StackingAxis.onDestroy = function () {\n                var stacking = this.stacking;\n                if (!stacking) {\n                    return;\n                }\n                var stacks = stacking.stacks;\n                // Destroy each stack total\n                objectEach(stacks, function (stack, stackKey) {\n                    destroyObjectProperties(stack);\n                    stacks[stackKey] = null;\n                });\n                if (stacking &&\n                    stacking.stackTotalGroup) {\n                    stacking.stackTotalGroup.destroy();\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxis.onInit = function () {\n                var axis = this;\n                if (!axis.stacking) {\n                    axis.stacking = new StackingAxisAdditions(axis);\n                }\n            };\n            return StackingAxis;\n        }());\n\n        return StackingAxis;\n    });\n    _registerModule(_modules, 'mixins/legend-symbol.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var merge = U.merge,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Legend symbol mixin.\n         *\n         * @private\n         * @mixin Highcharts.LegendSymbolMixin\n         */\n        H.LegendSymbolMixin = {\n            /**\n             * Get the series' symbol in the legend\n             *\n             * @private\n             * @function Highcharts.LegendSymbolMixin.drawRectangle\n             *\n             * @param {Highcharts.Legend} legend\n             * The legend object\n             *\n             * @param {Highcharts.Point|Highcharts.Series} item\n             * The series (this) or point\n             */\n            drawRectangle: function (legend, item) {\n                var options = legend.options,\n                    symbolHeight = legend.symbolHeight,\n                    square = options.squareSymbol,\n                    symbolWidth = square ? symbolHeight : legend.symbolWidth;\n                item.legendSymbol = this.chart.renderer.rect(square ? (legend.symbolWidth - symbolHeight) / 2 : 0, legend.baseline - symbolHeight + 1, // #3988\n                symbolWidth, symbolHeight, pick(legend.options.symbolRadius, symbolHeight / 2))\n                    .addClass('highcharts-point')\n                    .attr({\n                    zIndex: 3\n                }).add(item.legendGroup);\n            },\n            /**\n             * Get the series' symbol in the legend. This method should be overridable\n             * to create custom symbols through\n             * Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n             *\n             * @private\n             * @function Highcharts.LegendSymbolMixin.drawLineMarker\n             *\n             * @param {Highcharts.Legend} legend\n             * The legend object.\n             */\n            drawLineMarker: function (legend) {\n                var options = this.options,\n                    markerOptions = options.marker,\n                    radius,\n                    legendSymbol,\n                    symbolWidth = legend.symbolWidth,\n                    symbolHeight = legend.symbolHeight,\n                    generalRadius = symbolHeight / 2,\n                    renderer = this.chart.renderer,\n                    legendItemGroup = this.legendGroup,\n                    verticalCenter = legend.baseline -\n                        Math.round(legend.fontMetrics.b * 0.3),\n                    attr = {};\n                // Draw the line\n                if (!this.chart.styledMode) {\n                    attr = {\n                        'stroke-width': options.lineWidth || 0\n                    };\n                    if (options.dashStyle) {\n                        attr.dashstyle = options.dashStyle;\n                    }\n                }\n                this.legendLine = renderer\n                    .path([\n                    'M',\n                    0,\n                    verticalCenter,\n                    'L',\n                    symbolWidth,\n                    verticalCenter\n                ])\n                    .addClass('highcharts-graph')\n                    .attr(attr)\n                    .add(legendItemGroup);\n                // Draw the marker\n                if (markerOptions && markerOptions.enabled !== false && symbolWidth) {\n                    // Do not allow the marker to be larger than the symbolHeight\n                    radius = Math.min(pick(markerOptions.radius, generalRadius), generalRadius);\n                    // Restrict symbol markers size\n                    if (this.symbol.indexOf('url') === 0) {\n                        markerOptions = merge(markerOptions, {\n                            width: symbolHeight,\n                            height: symbolHeight\n                        });\n                        radius = 0;\n                    }\n                    this.legendSymbol = legendSymbol = renderer.symbol(this.symbol, (symbolWidth / 2) - radius, verticalCenter - radius, 2 * radius, 2 * radius, markerOptions)\n                        .addClass('highcharts-point')\n                        .add(legendItemGroup);\n                    legendSymbol.isMarker = true;\n                }\n            }\n        };\n\n        return H.LegendSymbolMixin;\n    });\n    _registerModule(_modules, 'parts/Point.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var animObject = U.animObject,\n            defined = U.defined,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            getNestedProperty = U.getNestedProperty,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            syncTimeout = U.syncTimeout,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Function callback when a series point is clicked. Return false to cancel the\n         * action.\n         *\n         * @callback Highcharts.PointClickCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        The point where the event occured.\n         *\n         * @param {Highcharts.PointClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Common information for a click event on a series point.\n         *\n         * @interface Highcharts.PointClickEventObject\n         * @extends Highcharts.PointerEventObject\n         */ /**\n        * Clicked point.\n        * @name Highcharts.PointClickEventObject#point\n        * @type {Highcharts.Point}\n        */\n        /**\n         * Configuration hash for the data label and tooltip formatters.\n         *\n         * @interface Highcharts.PointLabelObject\n         */ /**\n        * The point's current color.\n        * @name Highcharts.PointLabelObject#color\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * The point's current color index, used in styled mode instead of `color`. The\n        * color index is inserted in class names used for styling.\n        * @name Highcharts.PointLabelObject#colorIndex\n        * @type {number}\n        */ /**\n        * The name of the related point.\n        * @name Highcharts.PointLabelObject#key\n        * @type {string|undefined}\n        */ /**\n        * The percentage for related points in a stacked series or pies.\n        * @name Highcharts.PointLabelObject#percentage\n        * @type {number}\n        */ /**\n        * The related point. The point name, if defined, is available through\n        * `this.point.name`.\n        * @name Highcharts.PointLabelObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * The related series. The series name is available through `this.series.name`.\n        * @name Highcharts.PointLabelObject#series\n        * @type {Highcharts.Series}\n        */ /**\n        * The total of values in either a stack for stacked series, or a pie in a pie\n        * series.\n        * @name Highcharts.PointLabelObject#total\n        * @type {number|undefined}\n        */ /**\n        * For categorized axes this property holds the category name for the point. For\n        * other axes it holds the X value.\n        * @name Highcharts.PointLabelObject#x\n        * @type {number|string|undefined}\n        */ /**\n        * The y value of the point.\n        * @name Highcharts.PointLabelObject#y\n        * @type {number|undefined}\n        */\n        /**\n         * Gets fired when the mouse leaves the area close to the point.\n         *\n         * @callback Highcharts.PointMouseOutCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Gets fired when the mouse enters the area close to the point.\n         *\n         * @callback Highcharts.PointMouseOverCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * The generic point options for all series.\n         *\n         * In TypeScript you have to extend `PointOptionsObject` with an additional\n         * declaration to allow custom data options:\n         *\n         * ```\n         * declare interface PointOptionsObject {\n         *     customProperty: string;\n         * }\n         * ```\n         *\n         * @interface Highcharts.PointOptionsObject\n         */\n        /**\n         * Possible option types for a data point.\n         *\n         * @typedef {number|string|Array<(number|string)>|Highcharts.PointOptionsObject|null} Highcharts.PointOptionsType\n         */\n        /**\n         * Gets fired when the point is removed using the `.remove()` method.\n         *\n         * @callback Highcharts.PointRemoveCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * Possible key values for the point state options.\n         *\n         * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.PointStateValue\n         */\n        /**\n         * Gets fired when the point is updated programmatically through the `.update()`\n         * method.\n         *\n         * @callback Highcharts.PointUpdateCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointUpdateEventObject} event\n         *        Event that occured.\n         */\n        /**\n         * Information about the update event.\n         *\n         * @interface Highcharts.PointUpdateEventObject\n         * @extends global.Event\n         */ /**\n        * Options data of the update event.\n        * @name Highcharts.PointUpdateEventObject#options\n        * @type {Highcharts.PointOptionsType}\n        */\n        ''; // detach doclet above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Point object. The point objects are generated from the `series.data`\n         * configuration objects or raw numbers. They can be accessed from the\n         * `Series.points` array. Other ways to instantiate points are through {@link\n         * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n         *\n         * @class\n         * @name Highcharts.Point\n         */\n        var Point = /** @class */ (function () {\n                function Point() {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    /**\n                     * For categorized axes this property holds the category name for the\n                     * point. For other axes it holds the X value.\n                     *\n                     * @name Highcharts.Point#category\n                     * @type {string}\n                     */\n                    this.category = void 0;\n                /**\n                 * The point's current color index, used in styled mode instead of\n                 * `color`. The color index is inserted in class names used for styling.\n                 *\n                 * @name Highcharts.Point#colorIndex\n                 * @type {number}\n                 */\n                this.colorIndex = void 0;\n                this.formatPrefix = 'point';\n                this.id = void 0;\n                this.isNull = false;\n                /**\n                 * The name of the point. The name can be given as the first position of the\n                 * point configuration array, or as a `name` property in the configuration:\n                 *\n                 * @example\n                 * // Array config\n                 * data: [\n                 *     ['John', 1],\n                 *     ['Jane', 2]\n                 * ]\n                 *\n                 * // Object config\n                 * data: [{\n                 *        name: 'John',\n                 *        y: 1\n                 * }, {\n                 *     name: 'Jane',\n                 *     y: 2\n                 * }]\n                 *\n                 * @name Highcharts.Point#name\n                 * @type {string}\n                 */\n                this.name = void 0;\n                /**\n                 * The point's options as applied in the initial configuration, or\n                 * extended through `Point.update`.\n                 *\n                 * In TypeScript you have to extend `PointOptionsObject` via an\n                 * additional interface to allow custom data options:\n                 *\n                 * ```\n                 * declare interface PointOptionsObject {\n                 *     customProperty: string;\n                 * }\n                 * ```\n                 *\n                 * @name Highcharts.Point#options\n                 * @type {Highcharts.PointOptionsObject}\n                 */\n                this.options = void 0;\n                /**\n                 * The percentage for points in a stacked series or pies.\n                 *\n                 * @name Highcharts.Point#percentage\n                 * @type {number|undefined}\n                 */\n                this.percentage = void 0;\n                this.selected = false;\n                /**\n                 * The series object associated with the point.\n                 *\n                 * @name Highcharts.Point#series\n                 * @type {Highcharts.Series}\n                 */\n                this.series = void 0;\n                /**\n                 * The total of values in either a stack for stacked series, or a pie in a\n                 * pie series.\n                 *\n                 * @name Highcharts.Point#total\n                 * @type {number|undefined}\n                 */\n                this.total = void 0;\n                /**\n                 * For certain series types, like pie charts, where individual points can\n                 * be shown or hidden.\n                 *\n                 * @name Highcharts.Point#visible\n                 * @type {boolean}\n                 * @default true\n                 */\n                this.visible = true;\n                this.x = void 0;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Animate SVG elements associated with the point.\n             *\n             * @private\n             * @function Highcharts.Point#animateBeforeDestroy\n             */\n            Point.prototype.animateBeforeDestroy = function () {\n                var point = this,\n                    animateParams = { x: point.startXPos,\n                    opacity: 0 },\n                    isDataLabel,\n                    graphicalProps = point.getGraphicalProps();\n                graphicalProps.singular.forEach(function (prop) {\n                    isDataLabel = prop === 'dataLabel';\n                    point[prop] = point[prop].animate(isDataLabel ? {\n                        x: point[prop].startXPos,\n                        y: point[prop].startYPos,\n                        opacity: 0\n                    } : animateParams);\n                });\n                graphicalProps.plural.forEach(function (plural) {\n                    point[plural].forEach(function (item) {\n                        if (item.element) {\n                            item.animate(extend({ x: point.startXPos }, (item.startYPos ? {\n                                x: item.startXPos,\n                                y: item.startYPos\n                            } : {})));\n                        }\n                    });\n                });\n            };\n            /**\n             * Apply the options containing the x and y data and possible some extra\n             * properties. Called on point init or from point.update.\n             *\n             * @private\n             * @function Highcharts.Point#applyOptions\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options as defined in series.data.\n             *\n             * @param {number} [x]\n             *        Optionally, the x value.\n             *\n             * @return {Highcharts.Point}\n             *         The Point instance.\n             */\n            Point.prototype.applyOptions = function (options, x) {\n                var point = this,\n                    series = point.series,\n                    pointValKey = series.options.pointValKey || series.pointValKey;\n                options = Point.prototype.optionsToObject.call(this, options);\n                // copy options directly to point\n                extend(point, options);\n                point.options = point.options ? extend(point.options, options) : options;\n                // Since options are copied into the Point instance, some accidental\n                // options must be shielded (#5681)\n                if (options.group) {\n                    delete point.group;\n                }\n                if (options.dataLabels) {\n                    delete point.dataLabels;\n                }\n                /**\n                 * The y value of the point.\n                 * @name Highcharts.Point#y\n                 * @type {number|undefined}\n                 */\n                // For higher dimension series types. For instance, for ranges, point.y\n                // is mapped to point.low.\n                if (pointValKey) {\n                    point.y = Point.prototype.getNestedProperty.call(point, pointValKey);\n                }\n                point.isNull = pick(point.isValid && !point.isValid(), point.x === null || !isNumber(point.y)); // #3571, check for NaN\n                point.formatPrefix = point.isNull ? 'null' : 'point'; // #9233, #10874\n                // The point is initially selected by options (#5777)\n                if (point.selected) {\n                    point.state = 'select';\n                }\n                /**\n                 * The x value of the point.\n                 * @name Highcharts.Point#x\n                 * @type {number}\n                 */\n                // If no x is set by now, get auto incremented value. All points must\n                // have an x value, however the y value can be null to create a gap in\n                // the series\n                if ('name' in point &&\n                    typeof x === 'undefined' &&\n                    series.xAxis &&\n                    series.xAxis.hasNames) {\n                    point.x = series.xAxis.nameToX(point);\n                }\n                if (typeof point.x === 'undefined' && series) {\n                    if (typeof x === 'undefined') {\n                        point.x = series.autoIncrement(point);\n                    }\n                    else {\n                        point.x = x;\n                    }\n                }\n                return point;\n            };\n            /**\n             * Destroy a point to clear memory. Its reference still stays in\n             * `series.data`.\n             *\n             * @private\n             * @function Highcharts.Point#destroy\n             */\n            Point.prototype.destroy = function () {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    dataSorting = series.options.dataSorting,\n                    hoverPoints = chart.hoverPoints,\n                    globalAnimation = point.series.chart.renderer.globalAnimation,\n                    animation = animObject(globalAnimation),\n                    prop;\n                /**\n                 * Allow to call after animation.\n                 * @private\n                 */\n                function destroyPoint() {\n                    // Remove all events and elements\n                    if (point.graphic || point.dataLabel || point.dataLabels) {\n                        removeEvent(point);\n                        point.destroyElements();\n                    }\n                    for (prop in point) { // eslint-disable-line guard-for-in\n                        point[prop] = null;\n                    }\n                }\n                if (point.legendItem) { // pies have legend items\n                    chart.legend.destroyItem(point);\n                }\n                if (hoverPoints) {\n                    point.setState();\n                    erase(hoverPoints, point);\n                    if (!hoverPoints.length) {\n                        chart.hoverPoints = null;\n                    }\n                }\n                if (point === chart.hoverPoint) {\n                    point.onMouseOut();\n                }\n                // Remove properties after animation\n                if (!dataSorting || !dataSorting.enabled) {\n                    destroyPoint();\n                }\n                else {\n                    this.animateBeforeDestroy();\n                    syncTimeout(destroyPoint, animation.duration);\n                }\n                chart.pointCount--;\n            };\n            /**\n             * Destroy SVG elements associated with the point.\n             *\n             * @private\n             * @function Highcharts.Point#destroyElements\n             * @param {Highcharts.Dictionary<number>} [kinds]\n             */\n            Point.prototype.destroyElements = function (kinds) {\n                var point = this,\n                    props = point.getGraphicalProps(kinds);\n                props.singular.forEach(function (prop) {\n                    point[prop] = point[prop].destroy();\n                });\n                props.plural.forEach(function (plural) {\n                    point[plural].forEach(function (item) {\n                        if (item.element) {\n                            item.destroy();\n                        }\n                    });\n                    delete point[plural];\n                });\n            };\n            /**\n             * Fire an event on the Point object.\n             *\n             * @private\n             * @function Highcharts.Point#firePointEvent\n             *\n             * @param {string} eventType\n             *        Type of the event.\n             *\n             * @param {Highcharts.Dictionary<any>|Event} [eventArgs]\n             *        Additional event arguments.\n             *\n             * @param {Highcharts.EventCallbackFunction<Highcharts.Point>|Function} [defaultFunction]\n             *        Default event handler.\n             *\n             * @fires Highcharts.Point#event:*\n             */\n            Point.prototype.firePointEvent = function (eventType, eventArgs, defaultFunction) {\n                var point = this,\n                    series = this.series,\n                    seriesOptions = series.options;\n                // load event handlers on demand to save time on mouseover/out\n                if (seriesOptions.point.events[eventType] ||\n                    (point.options &&\n                        point.options.events &&\n                        point.options.events[eventType])) {\n                    point.importEvents();\n                }\n                // add default handler if in selection mode\n                if (eventType === 'click' && seriesOptions.allowPointSelect) {\n                    defaultFunction = function (event) {\n                        // Control key is for Windows, meta (= Cmd key) for Mac, Shift\n                        // for Opera.\n                        if (point.select) { // #2911\n                            point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n                        }\n                    };\n                }\n                fireEvent(point, eventType, eventArgs, defaultFunction);\n            };\n            /**\n             * Get the CSS class names for individual points. Used internally where the\n             * returned value is set on every point.\n             *\n             * @function Highcharts.Point#getClassName\n             *\n             * @return {string}\n             *         The class names.\n             */\n            Point.prototype.getClassName = function () {\n                var point = this;\n                return 'highcharts-point' +\n                    (point.selected ? ' highcharts-point-select' : '') +\n                    (point.negative ? ' highcharts-negative' : '') +\n                    (point.isNull ? ' highcharts-null-point' : '') +\n                    (typeof point.colorIndex !== 'undefined' ?\n                        ' highcharts-color-' + point.colorIndex : '') +\n                    (point.options.className ? ' ' + point.options.className : '') +\n                    (point.zone && point.zone.className ? ' ' +\n                        point.zone.className.replace('highcharts-negative', '') : '');\n            };\n            /**\n             * Get props of all existing graphical point elements.\n             *\n             * @private\n             * @function Highcharts.Point#getGraphicalProps\n             * @param {Highcharts.Dictionary<number>} [kinds]\n             * @return {Highcharts.PointGraphicalProps}\n             */\n            Point.prototype.getGraphicalProps = function (kinds) {\n                var point = this,\n                    props = [],\n                    prop,\n                    i,\n                    graphicalProps = { singular: [],\n                    plural: [] };\n                kinds = kinds || { graphic: 1, dataLabel: 1 };\n                if (kinds.graphic) {\n                    props.push('graphic', 'shadowGroup');\n                }\n                if (kinds.dataLabel) {\n                    props.push('dataLabel', 'dataLabelUpper', 'connector');\n                }\n                i = props.length;\n                while (i--) {\n                    prop = props[i];\n                    if (point[prop]) {\n                        graphicalProps.singular.push(prop);\n                    }\n                }\n                ['dataLabel', 'connector'].forEach(function (prop) {\n                    var plural = prop + 's';\n                    if (kinds[prop] && point[plural]) {\n                        graphicalProps.plural.push(plural);\n                    }\n                });\n                return graphicalProps;\n            };\n            /**\n             * Return the configuration hash needed for the data label and tooltip\n             * formatters.\n             *\n             * @function Highcharts.Point#getLabelConfig\n             *\n             * @return {Highcharts.PointLabelObject}\n             *         Abstract object used in formatters and formats.\n             */\n            Point.prototype.getLabelConfig = function () {\n                return {\n                    x: this.category,\n                    y: this.y,\n                    color: this.color,\n                    colorIndex: this.colorIndex,\n                    key: this.name || this.category,\n                    series: this.series,\n                    point: this,\n                    percentage: this.percentage,\n                    total: this.total || this.stackTotal\n                };\n            };\n            /**\n             * Returns the value of the point property for a given value.\n             * @private\n             */\n            Point.prototype.getNestedProperty = function (key) {\n                if (!key) {\n                    return;\n                }\n                if (key.indexOf('custom.') === 0) {\n                    return getNestedProperty(key, this.options);\n                }\n                return this[key];\n            };\n            /**\n             * In a series with `zones`, return the zone that the point belongs to.\n             *\n             * @function Highcharts.Point#getZone\n             *\n             * @return {Highcharts.SeriesZonesOptionsObject}\n             *         The zone item.\n             */\n            Point.prototype.getZone = function () {\n                var series = this.series,\n                    zones = series.zones,\n                    zoneAxis = series.zoneAxis || 'y',\n                    i = 0,\n                    zone;\n                zone = zones[i];\n                while (this[zoneAxis] >= zone.value) {\n                    zone = zones[++i];\n                }\n                // For resetting or reusing the point (#8100)\n                if (!this.nonZonedColor) {\n                    this.nonZonedColor = this.color;\n                }\n                if (zone && zone.color && !this.options.color) {\n                    this.color = zone.color;\n                }\n                else {\n                    this.color = this.nonZonedColor;\n                }\n                return zone;\n            };\n            /**\n             * Utility to check if point has new shape type. Used in column series and\n             * all others that are based on column series.\n             *\n             * @return boolean|undefined\n             */\n            Point.prototype.hasNewShapeType = function () {\n                var point = this;\n                var oldShapeType = point.graphic &&\n                        (point.graphic.symbolName || point.graphic.element.nodeName);\n                return oldShapeType !== this.shapeType;\n            };\n            /**\n             * Initialize the point. Called internally based on the `series.data`\n             * option.\n             *\n             * @function Highcharts.Point#init\n             *\n             * @param {Highcharts.Series} series\n             *        The series object containing this point.\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The data in either number, array or object format.\n             *\n             * @param {number} [x]\n             *        Optionally, the X value of the point.\n             *\n             * @return {Highcharts.Point}\n             *         The Point instance.\n             *\n             * @fires Highcharts.Point#event:afterInit\n             */\n            Point.prototype.init = function (series, options, x) {\n                this.series = series;\n                this.applyOptions(options, x);\n                // Add a unique ID to the point if none is assigned\n                this.id = defined(this.id) ? this.id : uniqueKey();\n                this.resolveColor();\n                series.chart.pointCount++;\n                fireEvent(this, 'afterInit');\n                return this;\n            };\n            /**\n             * Transform number or array configs into objects. Also called for object\n             * configs. Used internally to unify the different configuration formats for\n             * points. For example, a simple number `10` in a line series will be\n             * transformed to `{ y: 10 }`, and an array config like `[1, 10]` in a\n             * scatter series will be transformed to `{ x: 1, y: 10 }`.\n             *\n             * @function Highcharts.Point#optionsToObject\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The input option.\n             *\n             * @return {Highcharts.Dictionary<*>}\n             *         Transformed options.\n             */\n            Point.prototype.optionsToObject = function (options) {\n                var ret = {},\n                    series = this.series,\n                    keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    firstItemType,\n                    i = 0,\n                    j = 0;\n                if (isNumber(options) || options === null) {\n                    ret[pointArrayMap[0]] = options;\n                }\n                else if (isArray(options)) {\n                    // with leading x value\n                    if (!keys && options.length > valueCount) {\n                        firstItemType = typeof options[0];\n                        if (firstItemType === 'string') {\n                            ret.name = options[0];\n                        }\n                        else if (firstItemType === 'number') {\n                            ret.x = options[0];\n                        }\n                        i++;\n                    }\n                    while (j < valueCount) {\n                        // Skip undefined positions for keys\n                        if (!keys || typeof options[i] !== 'undefined') {\n                            if (pointArrayMap[j].indexOf('.') > 0) {\n                                // Handle nested keys, e.g. ['color.pattern.image']\n                                // Avoid function call unless necessary.\n                                Point.prototype.setNestedProperty(ret, options[i], pointArrayMap[j]);\n                            }\n                            else {\n                                ret[pointArrayMap[j]] = options[i];\n                            }\n                        }\n                        i++;\n                        j++;\n                    }\n                }\n                else if (typeof options === 'object') {\n                    ret = options;\n                    // This is the fastest way to detect if there are individual point\n                    // dataLabels that need to be considered in drawDataLabels. These\n                    // can only occur in object configs.\n                    if (options.dataLabels) {\n                        series._hasPointLabels = true;\n                    }\n                    // Same approach as above for markers\n                    if (options.marker) {\n                        series._hasPointMarkers = true;\n                    }\n                }\n                return ret;\n            };\n            /**\n             * @private\n             * @function Highcharts.Point#resolveColor\n             * @return {void}\n             */\n            Point.prototype.resolveColor = function () {\n                var series = this.series,\n                    colors,\n                    optionsChart = series.chart.options.chart,\n                    colorCount = optionsChart.colorCount,\n                    styledMode = series.chart.styledMode,\n                    colorIndex;\n                // remove points nonZonedColor for later recalculation\n                delete this.nonZonedColor;\n                /**\n                 * The point's current color.\n                 *\n                 * @name Highcharts.Point#color\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n                 */\n                if (!styledMode && !this.options.color) {\n                    this.color = series.color; // #3445\n                }\n                if (series.options.colorByPoint) {\n                    if (!styledMode) {\n                        colors = series.options.colors || series.chart.options.colors;\n                        this.color = this.color || colors[series.colorCounter];\n                        colorCount = colors.length;\n                    }\n                    colorIndex = series.colorCounter;\n                    series.colorCounter++;\n                    // loop back to zero\n                    if (series.colorCounter === colorCount) {\n                        series.colorCounter = 0;\n                    }\n                }\n                else {\n                    colorIndex = series.colorIndex;\n                }\n                this.colorIndex = pick(this.colorIndex, colorIndex);\n            };\n            /**\n             * Set a value in an object, on the property defined by key. The key\n             * supports nested properties using dot notation. The function modifies the\n             * input object and does not make a copy.\n             *\n             * @function Highcharts.Point#setNestedProperty<T>\n             *\n             * @param {T} object\n             *        The object to set the value on.\n             *\n             * @param {*} value\n             *        The value to set.\n             *\n             * @param {string} key\n             *        Key to the property to set.\n             *\n             * @return {T}\n             *         The modified object.\n             */\n            Point.prototype.setNestedProperty = function (object, value, key) {\n                var nestedKeys = key.split('.');\n                nestedKeys.reduce(function (result, key, i, arr) {\n                    var isLastKey = arr.length - 1 === i;\n                    result[key] = (isLastKey ?\n                        value :\n                        isObject(result[key], true) ?\n                            result[key] :\n                            {});\n                    return result[key];\n                }, object);\n                return object;\n            };\n            /**\n             * Extendable method for formatting each point's tooltip line.\n             *\n             * @function Highcharts.Point#tooltipFormatter\n             *\n             * @param {string} pointFormat\n             *        The point format.\n             *\n             * @return {string}\n             *         A string to be concatenated in to the common tooltip text.\n             */\n            Point.prototype.tooltipFormatter = function (pointFormat) {\n                // Insert options for valueDecimals, valuePrefix, and valueSuffix\n                var series = this.series, seriesTooltipOptions = series.tooltipOptions, valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''), valuePrefix = seriesTooltipOptions.valuePrefix || '', valueSuffix = seriesTooltipOptions.valueSuffix || '';\n                // Replace default point style with class name\n                if (series.chart.styledMode) {\n                    pointFormat =\n                        series.chart.tooltip.styledModeFormat(pointFormat);\n                }\n                // Loop over the point array map and replace unformatted values with\n                // sprintf formatting markup\n                (series.pointArrayMap || ['y']).forEach(function (key) {\n                    key = '{point.' + key; // without the closing bracket\n                    if (valuePrefix || valueSuffix) {\n                        pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), valuePrefix + key + '}' + valueSuffix);\n                    }\n                    pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), key + ':,.' + valueDecimals + 'f}');\n                });\n                return format(pointFormat, {\n                    point: this,\n                    series: this.series\n                }, series.chart);\n            };\n            return Point;\n        }());\n        H.Point = Point;\n\n        return Point;\n    });\n    _registerModule(_modules, 'parts/Series.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/SVGElement.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, O, Point, SVGElement, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            getNestedProperty = U.getNestedProperty,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            seriesType = U.seriesType,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout;\n        /**\n         * This is a placeholder type of the possible series options for\n         * [Highcharts](../highcharts/series), [Highstock](../highstock/series),\n         * [Highmaps](../highmaps/series), and [Gantt](../gantt/series).\n         *\n         * In TypeScript is this dynamically generated to reference all possible types\n         * of series options.\n         *\n         * @ignore-declaration\n         * @typedef {Highcharts.SeriesOptions|Highcharts.Dictionary<*>} Highcharts.SeriesOptionsType\n         */\n        /**\n         * Options for `dataSorting`.\n         *\n         * @interface Highcharts.DataSortingOptionsObject\n         * @since 8.0.0\n         */ /**\n        * Enable or disable data sorting for the series.\n        * @name Highcharts.DataSortingOptionsObject#enabled\n        * @type {boolean|undefined}\n        */ /**\n        * Whether to allow matching points by name in an update.\n        * @name Highcharts.DataSortingOptionsObject#matchByName\n        * @type {boolean|undefined}\n        */ /**\n        * Determines what data value should be used to sort by.\n        * @name Highcharts.DataSortingOptionsObject#sortKey\n        * @type {string|undefined}\n        */\n        /**\n         * Function callback when a series has been animated.\n         *\n         * @callback Highcharts.SeriesAfterAnimateCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesAfterAnimateEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Event information regarding completed animation of a series.\n         *\n         * @interface Highcharts.SeriesAfterAnimateEventObject\n         */ /**\n        * Animated series.\n        * @name Highcharts.SeriesAfterAnimateEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesAfterAnimateEventObject#type\n        * @type {\"afterAnimate\"}\n        */\n        /**\n         * Function callback when the checkbox next to the series' name in the legend is\n         * clicked.\n         *\n         * @callback Highcharts.SeriesCheckboxClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesCheckboxClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Event information regarding check of a series box.\n         *\n         * @interface Highcharts.SeriesCheckboxClickEventObject\n         */ /**\n        * Whether the box has been checked.\n        * @name Highcharts.SeriesCheckboxClickEventObject#checked\n        * @type {boolean}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#item\n        * @type {Highcharts.Series}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesCheckboxClickEventObject#type\n        * @type {\"checkboxClick\"}\n        */\n        /**\n         * Function callback when a series is clicked. Return false to cancel toogle\n         * actions.\n         *\n         * @callback Highcharts.SeriesClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Common information for a click event on a series.\n         *\n         * @interface Highcharts.SeriesClickEventObject\n         * @extends global.Event\n         */ /**\n        * Nearest point on the graph.\n        * @name Highcharts.SeriesClickEventObject#point\n        * @type {Highcharts.Point}\n        */\n        /**\n         * Gets fired when the series is hidden after chart generation time, either by\n         * clicking the legend item or by calling `.hide()`.\n         *\n         * @callback Highcharts.SeriesHideCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * The SVG value used for the `stroke-linecap` and `stroke-linejoin` of a line\n         * graph.\n         *\n         * @typedef {\"butt\"|\"round\"|\"square\"|string} Highcharts.SeriesLinecapValue\n         */\n        /**\n         * Gets fired when the legend item belonging to the series is clicked. The\n         * default action is to toggle the visibility of the series. This can be\n         * prevented by returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the event.\n         *\n         * @interface Highcharts.SeriesLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n        * @type {global.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesCheckboxClickEventObject#type\n        * @type {\"checkboxClick\"}\n        */\n        /**\n         * Gets fired when the mouse leaves the graph.\n         *\n         * @callback Highcharts.SeriesMouseOutCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Gets fired when the mouse enters the graph.\n         *\n         * @callback Highcharts.SeriesMouseOverCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Translation and scale for the plot area of a series.\n         *\n         * @interface Highcharts.SeriesPlotBoxObject\n         */ /**\n        * @name Highcharts.SeriesPlotBoxObject#scaleX\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#scaleY\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#translateX\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#translateY\n        * @type {number}\n        */\n        /**\n         * Gets fired when the series is shown after chart generation time, either by\n         * clicking the legend item or by calling `.show()`.\n         *\n         * @callback Highcharts.SeriesShowCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * Possible key values for the series state options.\n         *\n         * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.SeriesStateValue\n         */\n        ''; // detach doclets above\n        var seriesTypes = H.seriesTypes,\n            win = H.win;\n        /**\n         * This is the base series prototype that all other series types inherit from.\n         * A new series is initialized either through the\n         * [series](https://api.highcharts.com/highcharts/series)\n         * option structure, or after the chart is initialized, through\n         * {@link Highcharts.Chart#addSeries}.\n         *\n         * The object can be accessed in a number of ways. All series and point event\n         * handlers give a reference to the `series` object. The chart object has a\n         * {@link Highcharts.Chart#series|series} property that is a collection of all\n         * the chart's series. The point objects and axis objects also have the same\n         * reference.\n         *\n         * Another way to reference the series programmatically is by `id`. Add an id\n         * in the series configuration options, and get the series object by\n         * {@link Highcharts.Chart#get}.\n         *\n         * Configuration options for the series are given in three levels. Options for\n         * all series in a chart are given in the\n         * [plotOptions.series](https://api.highcharts.com/highcharts/plotOptions.series)\n         * object. Then options for all series of a specific type\n         * are given in the plotOptions of that type, for example `plotOptions.line`.\n         * Next, options for one single series are given in the series array, or as\n         * arguments to `chart.addSeries`.\n         *\n         * The data in the series is stored in various arrays.\n         *\n         * - First, `series.options.data` contains all the original config options for\n         *   each point whether added by options or methods like `series.addPoint`.\n         *\n         * - Next, `series.data` contains those values converted to points, but in case\n         *   the series data length exceeds the `cropThreshold`, or if the data is\n         *   grouped, `series.data` doesn't contain all the points. It only contains the\n         *   points that have been created on demand.\n         *\n         * - Then there's `series.points` that contains all currently visible point\n         *   objects. In case of cropping, the cropped-away points are not part of this\n         *   array. The `series.points` array starts at `series.cropStart` compared to\n         *   `series.data` and `series.options.data`. If however the series data is\n         *   grouped, these can't be correlated one to one.\n         *\n         * - `series.xData` and `series.processedXData` contain clean x values,\n         *   equivalent to `series.data` and `series.points`.\n         *\n         * - `series.yData` and `series.processedYData` contain clean y values,\n         *   equivalent to `series.data` and `series.points`.\n         *\n         * @class\n         * @name Highcharts.Series\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart instance.\n         *\n         * @param {Highcharts.SeriesOptionsType|object} options\n         *        The series options.\n         */ /**\n        * The line series is the base type and is therefor the series base prototype.\n        *\n        * @private\n        * @class\n        * @name Highcharts.seriesTypes.line\n        *\n        * @augments Highcharts.Series\n        */\n        H.Series = seriesType('line', \n        /**\n         * Series options for specific data and the data itself. In TypeScript you\n         * have to cast the series options to specific series types, to get all\n         * possible options for a series.\n         *\n         * @example\n         * // TypeScript example\n         * Highcharts.chart('container', {\n         *     series: [{\n         *         color: '#06C',\n         *         data: [[0, 1], [2, 3]]\n         *     } as Highcharts.SeriesLineOptions ]\n         * });\n         *\n         * @type      {Array<*>}\n         * @apioption series\n         */\n        /**\n         * An id for the series. This can be used after render time to get a pointer\n         * to the series object through `chart.get()`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-id/\n         *         Get series by id\n         *\n         * @type      {string}\n         * @since     1.2.0\n         * @apioption series.id\n         */\n        /**\n         * The index of the series in the chart, affecting the internal index in the\n         * `chart.series` array, the visible Z index as well as the order in the\n         * legend.\n         *\n         * @type      {number}\n         * @since     2.3.0\n         * @apioption series.index\n         */\n        /**\n         * The sequential index of the series in the legend.\n         *\n         * @see [legend.reversed](#legend.reversed),\n         *      [yAxis.reversedStacks](#yAxis.reversedStacks)\n         *\n         * @sample {highcharts|highstock} highcharts/series/legendindex/\n         *         Legend in opposite order\n         *\n         * @type      {number}\n         * @apioption series.legendIndex\n         */\n        /**\n         * The name of the series as shown in the legend, tooltip etc.\n         *\n         * @sample {highcharts} highcharts/series/name/\n         *         Series name\n         * @sample {highmaps} maps/demo/category-map/\n         *         Series name\n         *\n         * @type      {string}\n         * @apioption series.name\n         */\n        /**\n         * This option allows grouping series in a stacked chart. The stack option\n         * can be a string or anything else, as long as the grouped series' stack\n         * options match each other after conversion into a string.\n         *\n         * @sample {highcharts} highcharts/series/stack/\n         *         Stacked and grouped columns\n         *\n         * @type      {number|string}\n         * @since     2.1\n         * @product   highcharts highstock\n         * @apioption series.stack\n         */\n        /**\n         * The type of series, for example `line` or `column`. By default, the\n         * series type is inherited from [chart.type](#chart.type), so unless the\n         * chart is a combination of series types, there is no need to set it on the\n         * series level.\n         *\n         * @sample {highcharts} highcharts/series/type/\n         *         Line and column in the same chart\n         * @sample highcharts/series/type-dynamic/\n         *         Dynamic types with button selector\n         * @sample {highmaps} maps/demo/mapline-mappoint/\n         *         Multiple types in the same map\n         *\n         * @type      {string}\n         * @apioption series.type\n         */\n        /**\n         * When using dual or multiple x axes, this number defines which xAxis the\n         * particular series is connected to. It refers to either the\n         * {@link #xAxis.id|axis id}\n         * or the index of the axis in the xAxis array, with 0 being the first.\n         *\n         * @type      {number|string}\n         * @default   0\n         * @product   highcharts highstock\n         * @apioption series.xAxis\n         */\n        /**\n         * When using dual or multiple y axes, this number defines which yAxis the\n         * particular series is connected to. It refers to either the\n         * {@link #yAxis.id|axis id}\n         * or the index of the axis in the yAxis array, with 0 being the first.\n         *\n         * @sample {highcharts} highcharts/series/yaxis/\n         *         Apply the column series to the secondary Y axis\n         *\n         * @type      {number|string}\n         * @default   0\n         * @product   highcharts highstock\n         * @apioption series.yAxis\n         */\n        /**\n         * Define the visual z index of the series.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-zindex-default/\n         *         With no z index, the series defined last are on top\n         * @sample {highcharts} highcharts/plotoptions/series-zindex/\n         *         With a z index, the series with the highest z index is on top\n         * @sample {highstock} highcharts/plotoptions/series-zindex-default/\n         *         With no z index, the series defined last are on top\n         * @sample {highstock} highcharts/plotoptions/series-zindex/\n         *         With a z index, the series with the highest z index is on top\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.zIndex\n         */\n        null, \n        /**\n         * General options for all series types.\n         *\n         * @optionparent plotOptions.series\n         */\n        {\n            /**\n             * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n             * of a line graph. Round means that lines are rounded in the ends and\n             * bends.\n             *\n             * @type       {Highcharts.SeriesLinecapValue}\n             * @default    round\n             * @since      3.0.7\n             * @apioption  plotOptions.line.linecap\n             */\n            /**\n             * Pixel width of the graph line.\n             *\n             * @see In styled mode, the line stroke-width can be set with the\n             *      `.highcharts-graph` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-linewidth-general/\n             *         On all series\n             * @sample {highcharts} highcharts/plotoptions/series-linewidth-specific/\n             *         On one single series\n             *\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            lineWidth: 2,\n            /**\n             * For some series, there is a limit that shuts down initial animation\n             * by default when the total number of points in the chart is too high.\n             * For example, for a column chart and its derivatives, animation does\n             * not run if there is more than 250 points totally. To disable this\n             * cap, set `animationLimit` to `Infinity`.\n             *\n             * @type      {number}\n             * @apioption plotOptions.series.animationLimit\n             */\n            /**\n             * Allow this series' points to be selected by clicking on the graphic\n             * (columns, point markers, pie slices, map areas etc).\n             *\n             * The selected points can be handled by point select and unselect\n             * events, or collectively by the [getSelectedPoints\n             * ](/class-reference/Highcharts.Chart#getSelectedPoints) function.\n             *\n             * And alternative way of selecting points is through dragging.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-pie/\n             *         Pie\n             * @sample {highcharts} highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n             *         Map area\n             * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n             *         Map bubble\n             *\n             * @since 1.2.0\n             *\n             * @private\n             */\n            allowPointSelect: false,\n            /**\n             * When true, each point or column edge is rounded to its nearest pixel\n             * in order to render sharp on screen. In some cases, when there are a\n             * lot of densely packed columns, this leads to visible difference\n             * in column widths or distance between columns. In these cases,\n             * setting `crisp` to `false` may look better, even though each column\n             * is rendered blurry.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-crisp-false/\n             *         Crisp is false\n             *\n             * @since   5.0.10\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            crisp: true,\n            /**\n             * If true, a checkbox is displayed next to the legend item to allow\n             * selecting the series. The state of the checkbox is determined by\n             * the `selected` option.\n             *\n             * @productdesc {highmaps}\n             * Note that if a `colorAxis` is defined, the color axis is represented\n             * in the legend, not the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showcheckbox-true/\n             *         Show select box\n             *\n             * @since 1.2.0\n             *\n             * @private\n             */\n            showCheckbox: false,\n            /**\n             * Enable or disable the initial animation when a series is displayed.\n             * The animation can also be set as a configuration object. Please\n             * note that this option only applies to the initial animation of the\n             * series itself. For other animations, see [chart.animation](\n             * #chart.animation) and the animation parameter under the API methods.\n             * The following properties are supported:\n             *\n             * - `duration`: The duration of the animation in milliseconds.\n             *\n             * - `easing`: Can be a string reference to an easing function set on\n             *   the `Math` object or a function. See the _Custom easing function_\n             *   demo below.\n             *\n             * Due to poor performance, animation is disabled in old IE browsers\n             * for several chart types.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-animation-disabled/\n             *         Animation disabled\n             * @sample {highcharts} highcharts/plotoptions/series-animation-slower/\n             *         Slower animation\n             * @sample {highcharts} highcharts/plotoptions/series-animation-easing/\n             *         Custom easing function\n             * @sample {highstock} stock/plotoptions/animation-slower/\n             *         Slower animation\n             * @sample {highstock} stock/plotoptions/animation-easing/\n             *         Custom easing function\n             * @sample {highmaps} maps/plotoptions/series-animation-true/\n             *         Animation enabled on map series\n             * @sample {highmaps} maps/plotoptions/mapbubble-animation-false/\n             *         Disabled on mapbubble series\n             *\n             * @type    {boolean|Highcharts.AnimationOptionsObject}\n             * @default {highcharts} true\n             * @default {highstock} true\n             * @default {highmaps} false\n             *\n             * @private\n             */\n            animation: {\n                /** @internal */\n                duration: 1000\n            },\n            /**\n             * An additional class name to apply to the series' graphical elements.\n             * This option does not replace default class names of the graphical\n             * element.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption plotOptions.series.className\n             */\n            /**\n             * Disable this option to allow series rendering in the whole plotting\n             * area.\n             *\n             * **Note:** Clipping should be always enabled when\n             * [chart.zoomType](#chart.zoomType) is set\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-clip/\n             *         Disabled clipping\n             *\n             * @default   true\n             * @type      {boolean}\n             * @since     3.0.0\n             * @apioption plotOptions.series.clip\n             */\n            /**\n             * The main color of the series. In line type series it applies to the\n             * line and the point markers unless otherwise specified. In bar type\n             * series it applies to the bars unless a color is specified per point.\n             * The default value is pulled from the `options.colors` array.\n             *\n             * In styled mode, the color can be defined by the\n             * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n             * color can be set with the `.highcharts-series`,\n             * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n             * `.highcharts-series-{n}` class, or individual classes given by the\n             * `className` option.\n             *\n             * @productdesc {highmaps}\n             * In maps, the series color is rarely used, as most choropleth maps use\n             * the color to denote the value of each point. The series color can\n             * however be used in a map with multiple series holding categorized\n             * data.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-color-general/\n             *         General plot option\n             * @sample {highcharts} highcharts/plotoptions/series-color-specific/\n             *         One specific series\n             * @sample {highcharts} highcharts/plotoptions/series-color-area/\n             *         Area color\n             * @sample {highcharts} highcharts/series/infographic/\n             *         Pattern fill\n             * @sample {highmaps} maps/demo/category-map/\n             *         Category map by multiple series\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @apioption plotOptions.series.color\n             */\n            /**\n             * Styled mode only. A specific color index to use for the series, so\n             * its graphic representations are given the class name\n             * `highcharts-color-{n}`.\n             *\n             * @type      {number}\n             * @since     5.0.0\n             * @apioption plotOptions.series.colorIndex\n             */\n            /**\n             * Whether to connect a graph line across null points, or render a gap\n             * between the two points on either side of the null.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-connectnulls-false/\n             *         False by default\n             * @sample {highcharts} highcharts/plotoptions/series-connectnulls-true/\n             *         True\n             *\n             * @type      {boolean}\n             * @default   false\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.connectNulls\n             */\n            /**\n             * You can set the cursor to \"pointer\" if you have click events attached\n             * to the series, to signal to the user that the points and lines can\n             * be clicked.\n             *\n             * In styled mode, the series cursor can be set with the same classes\n             * as listed under [series.color](#plotOptions.series.color).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-line/\n             *         On line graph\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-column/\n             *         On columns\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-scatter/\n             *         On scatter markers\n             * @sample {highstock} stock/plotoptions/cursor/\n             *         Pointer on a line graph\n             * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n             *         Map area\n             * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n             *         Map bubble\n             *\n             * @type      {string|Highcharts.CursorValue}\n             * @apioption plotOptions.series.cursor\n             */\n            /**\n             * A reserved subspace to store options and values for customized\n             * functionality. Here you can add additional data for your own event\n             * callbacks and formatter callbacks.\n             *\n             * @sample {highcharts} highcharts/point/custom/\n             *         Point and series with custom data\n             *\n             * @type      {Highcharts.Dictionary<*>}\n             * @apioption plotOptions.series.custom\n             */\n            /**\n             * Name of the dash style to use for the graph, or for some series types\n             * the outline of each shape.\n             *\n             * In styled mode, the\n             * [stroke dash-array](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/series-dashstyle/)\n             * can be set with the same classes as listed under\n             * [series.color](#plotOptions.series.color).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highcharts} highcharts/plotoptions/series-dashstyle/\n             *         Chart suitable for printing in black and white\n             * @sample {highstock} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highmaps} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highmaps} maps/plotoptions/series-dashstyle/\n             *         Dotted borders on a map\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @default   Solid\n             * @since     2.1\n             * @apioption plotOptions.series.dashStyle\n             */\n            /**\n             * A description of the series to add to the screen reader information\n             * about the series.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @requires  modules/accessibility\n             * @apioption plotOptions.series.description\n             */\n            /**\n             * Options for the series data sorting.\n             *\n             * @type      {Highcharts.DataSortingOptionsObject}\n             * @since     8.0.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.dataSorting\n             */\n            /**\n             * Enable or disable data sorting for the series. Use [xAxis.reversed](\n             * #xAxis.reversed) to change the sorting order.\n             *\n             * @sample {highcharts} highcharts/datasorting/animation/\n             *         Data sorting in scatter-3d\n             * @sample {highcharts} highcharts/datasorting/labels-animation/\n             *         Axis labels animation\n             * @sample {highcharts} highcharts/datasorting/dependent-sorting/\n             *         Dependent series sorting\n             * @sample {highcharts} highcharts/datasorting/independent-sorting/\n             *         Independent series sorting\n             *\n             * @type      {boolean}\n             * @since     8.0.0\n             * @apioption plotOptions.series.dataSorting.enabled\n             */\n            /**\n             * Whether to allow matching points by name in an update. If this option\n             * is disabled, points will be matched by order.\n             *\n             * @sample {highcharts} highcharts/datasorting/match-by-name/\n             *         Enabled match by name\n             *\n             * @type      {boolean}\n             * @since     8.0.0\n             * @apioption plotOptions.series.dataSorting.matchByName\n             */\n            /**\n             * Determines what data value should be used to sort by.\n             *\n             * @sample {highcharts} highcharts/datasorting/sort-key/\n             *         Sort key as `z` value\n             *\n             * @type      {string}\n             * @since     8.0.0\n             * @default   y\n             * @apioption plotOptions.series.dataSorting.sortKey\n             */\n            /**\n             * Enable or disable the mouse tracking for a specific series. This\n             * includes point tooltips and click events on graphs and points. For\n             * large datasets it improves performance.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-enablemousetracking-false/\n             *         No mouse tracking\n             * @sample {highmaps} maps/plotoptions/series-enablemousetracking-false/\n             *         No mouse tracking\n             *\n             * @type      {boolean}\n             * @default   true\n             * @apioption plotOptions.series.enableMouseTracking\n             */\n            /**\n             * Whether to use the Y extremes of the total chart width or only the\n             * zoomed area when zooming in on parts of the X axis. By default, the\n             * Y axis adjusts to the min and max of the visible data. Cartesian\n             * series only.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.6\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.getExtremesFromAll\n             */\n            /**\n             * An array specifying which option maps to which key in the data point\n             * array. This makes it convenient to work with unstructured data arrays\n             * from different sources.\n             *\n             * @see [series.data](#series.line.data)\n             *\n             * @sample {highcharts|highstock} highcharts/series/data-keys/\n             *         An extended data array with keys\n             * @sample {highcharts|highstock} highcharts/series/data-nested-keys/\n             *         Nested keys used to access object properties\n             *\n             * @type      {Array<string>}\n             * @since     4.1.6\n             * @apioption plotOptions.series.keys\n             */\n            /**\n             * The line cap used for line ends and line joins on the graph.\n             *\n             * @type       {Highcharts.SeriesLinecapValue}\n             * @default    round\n             * @product    highcharts highstock\n             * @apioption  plotOptions.series.linecap\n             */\n            /**\n             * The [id](#series.id) of another series to link to. Additionally,\n             * the value can be \":previous\" to link to the previous series. When\n             * two series are linked, only the first one appears in the legend.\n             * Toggling the visibility of this also toggles the linked series.\n             *\n             * If master series uses data sorting and linked series does not have\n             * its own sorting definition, the linked series will be sorted in the\n             * same order as the master one.\n             *\n             * @sample {highcharts|highstock} highcharts/demo/arearange-line/\n             *         Linked series\n             *\n             * @type      {string}\n             * @since     3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.linkedTo\n             */\n            /**\n             * Options for the corresponding navigator series if `showInNavigator`\n             * is `true` for this series. Available options are the same as any\n             * series, documented at [plotOptions](#plotOptions.series) and\n             * [series](#series).\n             *\n             * These options are merged with options in [navigator.series](\n             * #navigator.series), and will take precedence if the same option is\n             * defined both places.\n             *\n             * @see [navigator.series](#navigator.series)\n             *\n             * @type      {Highcharts.PlotSeriesOptions}\n             * @since     5.0.0\n             * @product   highstock\n             * @apioption plotOptions.series.navigatorOptions\n             */\n            /**\n             * The color for the parts of the graph or points that are below the\n             * [threshold](#plotOptions.series.threshold). Note that `zones` takes\n             * precedence over the negative color. Using `negativeColor` is\n             * equivalent to applying a zone with value of 0.\n             *\n             * @see In styled mode, a negative color is applied by setting this option\n             *      to `true` combined with the `.highcharts-negative` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highcharts} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             * @sample {highcharts} highcharts/css/series-negative-color/\n             *         Styled mode\n             * @sample {highstock} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highstock} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             * @sample {highmaps} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highmaps} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     3.0\n             * @apioption plotOptions.series.negativeColor\n             */\n            /**\n             * Same as\n             * [accessibility.pointDescriptionFormatter](#accessibility.pointDescriptionFormatter),\n             * but for an individual series. Overrides the chart wide configuration.\n             *\n             * @type      {Function}\n             * @since     5.0.12\n             * @apioption plotOptions.series.pointDescriptionFormatter\n             */\n            /**\n             * If no x values are given for the points in a series, `pointInterval`\n             * defines the interval of the x values. For example, if a series\n             * contains one value every decade starting from year 0, set\n             * `pointInterval` to `10`. In true `datetime` axes, the `pointInterval`\n             * is set in milliseconds.\n             *\n             * It can be also be combined with `pointIntervalUnit` to draw irregular\n             * time intervals.\n             *\n             * Please note that this options applies to the _series data_, not the\n             * interval of the axis ticks, which is independent.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n             *         Datetime X axis\n             * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n             *         Using pointStart and pointInterval\n             *\n             * @type      {number}\n             * @default   1\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointInterval\n             */\n            /**\n             * On datetime series, this allows for setting the\n             * [pointInterval](#plotOptions.series.pointInterval) to irregular time\n             * units, `day`, `month` and `year`. A day is usually the same as 24\n             * hours, but `pointIntervalUnit` also takes the DST crossover into\n             * consideration when dealing with local time. Combine this option with\n             * `pointInterval` to draw weeks, quarters, 6 months, 10 years etc.\n             *\n             * Please note that this options applies to the _series data_, not the\n             * interval of the axis ticks, which is independent.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointintervalunit/\n             *         One point a month\n             * @sample {highstock} highcharts/plotoptions/series-pointintervalunit/\n             *         One point a month\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts highstock gantt\n             * @validvalue [\"day\", \"month\", \"year\"]\n             * @apioption  plotOptions.series.pointIntervalUnit\n             */\n            /**\n             * Possible values: `\"on\"`, `\"between\"`, `number`.\n             *\n             * In a column chart, when pointPlacement is `\"on\"`, the point will not\n             * create any padding of the X axis. In a polar column chart this means\n             * that the first column points directly north. If the pointPlacement is\n             * `\"between\"`, the columns will be laid out between ticks. This is\n             * useful for example for visualising an amount between two points in\n             * time or in a certain sector of a polar chart.\n             *\n             * Since Highcharts 3.0.2, the point placement can also be numeric,\n             * where 0 is on the axis value, -0.5 is between this value and the\n             * previous, and 0.5 is between this value and the next. Unlike the\n             * textual options, numeric point placement options won't affect axis\n             * padding.\n             *\n             * Note that pointPlacement needs a [pointRange](\n             * #plotOptions.series.pointRange) to work. For column series this is\n             * computed, but for line-type series it needs to be set.\n             *\n             * For the `xrange` series type and gantt charts, if the Y axis is a\n             * category axis, the `pointPlacement` applies to the Y axis rather than\n             * the (typically datetime) X axis.\n             *\n             * Defaults to `undefined` in cartesian charts, `\"between\"` in polar\n             * charts.\n             *\n             * @see [xAxis.tickmarkPlacement](#xAxis.tickmarkPlacement)\n             *\n             * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-between/\n             *         Between in a column chart\n             * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-numeric/\n             *         Numeric placement for custom layout\n             * @sample {highcharts|highstock} maps/plotoptions/heatmap-pointplacement/\n             *         Placement in heatmap\n             *\n             * @type      {string|number}\n             * @since     2.3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointPlacement\n             */\n            /**\n             * If no x values are given for the points in a series, pointStart\n             * defines on what value to start. For example, if a series contains one\n             * yearly value starting from 1945, set pointStart to 1945.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-linear/\n             *         Linear\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n             *         Datetime\n             * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n             *         Using pointStart and pointInterval\n             *\n             * @type      {number}\n             * @default   0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointStart\n             */\n            /**\n             * Whether to select the series initially. If `showCheckbox` is true,\n             * the checkbox next to the series name in the legend will be checked\n             * for a selected series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-selected/\n             *         One out of two series selected\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     1.2.0\n             * @apioption plotOptions.series.selected\n             */\n            /**\n             * Whether to apply a drop shadow to the graph line. Since 2.3 the\n             * shadow can be an object configuration containing `color`, `offsetX`,\n             * `offsetY`, `opacity` and `width`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-shadow/\n             *         Shadow enabled\n             *\n             * @type      {boolean|Highcharts.ShadowOptionsObject}\n             * @default   false\n             * @apioption plotOptions.series.shadow\n             */\n            /**\n             * Whether to display this particular series or series type in the\n             * legend. Standalone series are shown in legend by default, and linked\n             * series are not. Since v7.2.0 it is possible to show series that use\n             * colorAxis by setting this option to `true`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n             *         One series in the legend, one hidden\n             *\n             * @type      {boolean}\n             * @apioption plotOptions.series.showInLegend\n             */\n            /**\n             * Whether or not to show the series in the navigator. Takes precedence\n             * over [navigator.baseSeries](#navigator.baseSeries) if defined.\n             *\n             * @type      {boolean}\n             * @since     5.0.0\n             * @product   highstock\n             * @apioption plotOptions.series.showInNavigator\n             */\n            /**\n             * If set to `true`, the accessibility module will skip past the points\n             * in this series for keyboard navigation.\n             *\n             * @type      {boolean}\n             * @since     5.0.12\n             * @apioption plotOptions.series.skipKeyboardNavigation\n             */\n            /**\n             * Whether to stack the values of each series on top of each other.\n             * Possible values are `undefined` to disable, `\"normal\"` to stack by\n             * value or `\"percent\"`.\n             *\n             * When stacking is enabled, data must be sorted\n             * in ascending X order.\n             *\n             * Some stacking options are related to specific series types. In the\n             * streamgraph series type, the stacking option is set to `\"stream\"`.\n             * The second one is `\"overlap\"`, which only applies to waterfall\n             * series.\n             *\n             * @see [yAxis.reversedStacks](#yAxis.reversedStacks)\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-bar/\n             *         Bar\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-area/\n             *         Area\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-bar/\n             *         Bar\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-area/\n             *         Area\n             * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-normal-stacking\n             *         Waterfall with normal stacking\n             * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-overlap-stacking\n             *         Waterfall with overlap stacking\n             * @sample {highstock} stock/plotoptions/stacking/\n             *         Area\n             *\n             * @type       {string}\n             * @product    highcharts highstock\n             * @validvalue [\"normal\", \"overlap\", \"percent\", \"stream\"]\n             * @apioption  plotOptions.series.stacking\n             */\n            /**\n             * Whether to apply steps to the line. Possible values are `left`,\n             * `center` and `right`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/line-step/\n             *         Different step line options\n             * @sample {highcharts} highcharts/plotoptions/area-step/\n             *         Stepped, stacked area\n             * @sample {highstock} stock/plotoptions/line-step/\n             *         Step line\n             *\n             * @type       {string}\n             * @since      1.2.5\n             * @product    highcharts highstock\n             * @validvalue [\"left\", \"center\", \"right\"]\n             * @apioption  plotOptions.series.step\n             */\n            /**\n             * The threshold, also called zero level or base level. For line type\n             * series this is only used in conjunction with\n             * [negativeColor](#plotOptions.series.negativeColor).\n             *\n             * @see [softThreshold](#plotOptions.series.softThreshold).\n             *\n             * @type      {number}\n             * @default   0\n             * @since     3.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.threshold\n             */\n            /**\n             * Set the initial visibility of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-visible/\n             *         Two series, one hidden and one visible\n             * @sample {highstock} stock/plotoptions/series-visibility/\n             *         Hidden series\n             *\n             * @type      {boolean}\n             * @default   true\n             * @apioption plotOptions.series.visible\n             */\n            /**\n             * Defines the Axis on which the zones are applied.\n             *\n             * @see [zones](#plotOptions.series.zones)\n             *\n             * @sample {highcharts} highcharts/series/color-zones-zoneaxis-x/\n             *         Zones on the X-Axis\n             * @sample {highstock} highcharts/series/color-zones-zoneaxis-x/\n             *         Zones on the X-Axis\n             *\n             * @type      {string}\n             * @default   y\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zoneAxis\n             */\n            /**\n             * General event handlers for the series items. These event hooks can\n             * also be attached to the series at run time using the\n             * `Highcharts.addEvent` function.\n             *\n             * @declare Highcharts.SeriesEventsOptionsObject\n             *\n             * @private\n             */\n            events: {},\n            /**\n             * Fires after the series has finished its initial animation, or in case\n             * animation is disabled, immediately as the series is displayed.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-afteranimate/\n             *         Show label after animate\n             * @sample {highstock} highcharts/plotoptions/series-events-afteranimate/\n             *         Show label after animate\n             *\n             * @type      {Highcharts.SeriesAfterAnimateCallbackFunction}\n             * @since     4.0\n             * @product   highcharts highstock gantt\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.afterAnimate\n             */\n            /**\n             * Fires when the checkbox next to the series' name in the legend is\n             * clicked. One parameter, `event`, is passed to the function. The state\n             * of the checkbox is found by `event.checked`. The checked item is\n             * found by `event.item`. Return `false` to prevent the default action\n             * which is to toggle the select state of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n             *         Alert checkbox status\n             *\n             * @type      {Highcharts.SeriesCheckboxClickCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.checkboxClick\n             */\n            /**\n             * Fires when the series is clicked. One parameter, `event`, is passed\n             * to the function, containing common event information. Additionally,\n             * `event.point` holds a pointer to the nearest point on the graph.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-click/\n             *         Alert click info\n             * @sample {highstock} stock/plotoptions/series-events-click/\n             *         Alert click info\n             * @sample {highmaps} maps/plotoptions/series-events-click/\n             *         Display click info in subtitle\n             *\n             * @type      {Highcharts.SeriesClickCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.click\n             */\n            /**\n             * Fires when the series is hidden after chart generation time, either\n             * by clicking the legend item or by calling `.hide()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-hide/\n             *         Alert when the series is hidden by clicking the legend item\n             *\n             * @type      {Highcharts.SeriesHideCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.hide\n             */\n            /**\n             * Fires when the legend item belonging to the series is clicked. One\n             * parameter, `event`, is passed to the function. The default action\n             * is to toggle the visibility of the series. This can be prevented\n             * by returning `false` or calling `event.preventDefault()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-legenditemclick/\n             *         Confirm hiding and showing\n             *\n             * @type      {Highcharts.SeriesLegendItemClickCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.legendItemClick\n             */\n            /**\n             * Fires when the mouse leaves the graph. One parameter, `event`, is\n             * passed to the function, containing common event information. If the\n             * [stickyTracking](#plotOptions.series) option is true, `mouseOut`\n             * doesn't happen before the mouse enters another graph or leaves the\n             * plot area.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n             *         With sticky tracking by default\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n             *         Without sticky tracking\n             *\n             * @type      {Highcharts.SeriesMouseOutCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.mouseOut\n             */\n            /**\n             * Fires when the mouse enters the graph. One parameter, `event`, is\n             * passed to the function, containing common event information.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n             *         With sticky tracking by default\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n             *         Without sticky tracking\n             *\n             * @type      {Highcharts.SeriesMouseOverCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.mouseOver\n             */\n            /**\n             * Fires when the series is shown after chart generation time, either\n             * by clicking the legend item or by calling `.show()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-show/\n             *         Alert when the series is shown by clicking the legend item.\n             *\n             * @type      {Highcharts.SeriesShowCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.show\n             */\n            /**\n             * Options for the point markers of line-like series. Properties like\n             * `fillColor`, `lineColor` and `lineWidth` define the visual appearance\n             * of the markers. Other series types, like column series, don't have\n             * markers, but have visual options on the series level instead.\n             *\n             * In styled mode, the markers can be styled with the\n             * `.highcharts-point`, `.highcharts-point-hover` and\n             * `.highcharts-point-select` class names.\n             *\n             * @declare Highcharts.PointMarkerOptionsObject\n             *\n             * @private\n             */\n            marker: {\n                /**\n                 * Enable or disable the point marker. If `undefined`, the markers\n                 * are hidden when the data is dense, and shown for more widespread\n                 * data points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-enabled/\n                 *         Disabled markers\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-enabled-false/\n                 *         Disabled in normal state but enabled on hover\n                 * @sample {highstock} stock/plotoptions/series-marker/\n                 *         Enabled markers\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} undefined\n                 * @default   {highstock} false\n                 * @apioption plotOptions.series.marker.enabled\n                 */\n                /**\n                 * The threshold for how dense the point markers should be before\n                 * they are hidden, given that `enabled` is not defined. The number\n                 * indicates the horizontal distance between the two closest points\n                 * in the series, as multiples of the `marker.radius`. In other\n                 * words, the default value of 2 means points are hidden if\n                 * overlapping horizontally.\n                 *\n                 * @sample highcharts/plotoptions/series-marker-enabledthreshold\n                 *         A higher threshold\n                 *\n                 * @since 6.0.5\n                 */\n                enabledThreshold: 2,\n                /**\n                 * The fill color of the point marker. When `undefined`, the series'\n                 * or point's color is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         White fill\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.marker.fillColor\n                 */\n                /**\n                 * Image markers only. Set the image width explicitly. When using\n                 * this option, a `width` must also be set.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 *\n                 * @type      {number}\n                 * @since     4.0.4\n                 * @apioption plotOptions.series.marker.height\n                 */\n                /**\n                 * The color of the point marker's outline. When `undefined`, the\n                 * series' or point's color is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         Inherit from series color (undefined)\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                lineColor: '#ffffff',\n                /**\n                 * The width of the point marker's outline.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         2px blue marker\n                 */\n                lineWidth: 0,\n                /**\n                 * The radius of the point marker.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-radius/\n                 *         Bigger markers\n                 *\n                 * @default {highstock} 2\n                 */\n                radius: 4,\n                /**\n                 * A predefined shape or symbol for the marker. When undefined, the\n                 * symbol is pulled from options.symbols. Other possible values are\n                 * `'circle'`, `'square'`,`'diamond'`, `'triangle'` and\n                 * `'triangle-down'`.\n                 *\n                 * Additionally, the URL to a graphic can be given on this form:\n                 * `'url(graphic.png)'`. Note that for the image to be applied to\n                 * exported charts, its URL needs to be accessible by the export\n                 * server.\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n                 * used by its method name, as shown in the demo.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n                 *         Predefined, graphic and custom markers\n                 * @sample {highstock} highcharts/plotoptions/series-marker-symbol/\n                 *         Predefined, graphic and custom markers\n                 *\n                 * @type      {string}\n                 * @apioption plotOptions.series.marker.symbol\n                 */\n                /**\n                 * Image markers only. Set the image width explicitly. When using\n                 * this option, a `height` must also be set.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 *\n                 * @type      {number}\n                 * @since     4.0.4\n                 * @apioption plotOptions.series.marker.width\n                 */\n                /**\n                 * States for a single point marker.\n                 *\n                 * @declare Highcharts.PointStatesOptionsObject\n                 */\n                states: {\n                    /**\n                     * The normal state of a single point marker. Currently only\n                     * used for setting animation when returning to normal state\n                     * from hover.\n                     *\n                     * @declare Highcharts.PointStatesNormalOptionsObject\n                     */\n                    normal: {\n                        /**\n                         * Animation when returning to normal state after hovering.\n                         *\n                         * @type {boolean|Highcharts.AnimationOptionsObject}\n                         */\n                        animation: true\n                    },\n                    /**\n                     * The hover state for a single point marker.\n                     *\n                     * @declare Highcharts.PointStatesHoverOptionsObject\n                     */\n                    hover: {\n                        /**\n                         * Animation when hovering over the marker.\n                         *\n                         * @type {boolean|Highcharts.AnimationOptionsObject}\n                         */\n                        animation: {\n                            /** @internal */\n                            duration: 50\n                        },\n                        /**\n                         * Enable or disable the point marker.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-enabled/\n                         *         Disabled hover state\n                         */\n                        enabled: true,\n                        /**\n                         * The fill color of the marker in hover state. When\n                         * `undefined`, the series' or point's fillColor for normal\n                         * state is used.\n                         *\n                         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         * @apioption plotOptions.series.marker.states.hover.fillColor\n                         */\n                        /**\n                         * The color of the point marker's outline. When\n                         * `undefined`, the series' or point's lineColor for normal\n                         * state is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linecolor/\n                         *         White fill color, black line color\n                         *\n                         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         * @apioption plotOptions.series.marker.states.hover.lineColor\n                         */\n                        /**\n                         * The width of the point marker's outline. When\n                         * `undefined`, the series' or point's lineWidth for normal\n                         * state is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linewidth/\n                         *         3px line width\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.hover.lineWidth\n                         */\n                        /**\n                         * The radius of the point marker. In hover state, it\n                         * defaults to the normal state's radius + 2 as per the\n                         * [radiusPlus](#plotOptions.series.marker.states.hover.radiusPlus)\n                         * option.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-radius/\n                         *         10px radius\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.hover.radius\n                         */\n                        /**\n                         * The number of pixels to increase the radius of the\n                         * hovered point.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         5 pixels greater radius on hover\n                         * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         5 pixels greater radius on hover\n                         *\n                         * @since 4.0.3\n                         */\n                        radiusPlus: 2,\n                        /**\n                         * The additional line width for a hovered point.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         2 pixels wider on hover\n                         * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         2 pixels wider on hover\n                         *\n                         * @since 4.0.3\n                         */\n                        lineWidthPlus: 1\n                    },\n                    /**\n                     * The appearance of the point marker when selected. In order to\n                     * allow a point to be selected, set the\n                     * `series.allowPointSelect` option to true.\n                     *\n                     * @declare Highcharts.PointStatesSelectOptionsObject\n                     */\n                    select: {\n                        /**\n                         * Enable or disable visible feedback for selection.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-enabled/\n                         *         Disabled select state\n                         *\n                         * @type      {boolean}\n                         * @default   true\n                         * @apioption plotOptions.series.marker.states.select.enabled\n                         */\n                        /**\n                         * The radius of the point marker. In hover state, it\n                         * defaults to the normal state's radius + 2.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-radius/\n                         *         10px radius for selected points\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.select.radius\n                         */\n                        /**\n                         * The fill color of the point marker.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-fillcolor/\n                         *         Solid red discs for selected points\n                         *\n                         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         */\n                        fillColor: '#cccccc',\n                        /**\n                         * The color of the point marker's outline. When\n                         * `undefined`, the series' or point's color is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linecolor/\n                         *         Red line color for selected points\n                         *\n                         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         */\n                        lineColor: '#000000',\n                        /**\n                         * The width of the point marker's outline.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linewidth/\n                         *         3px line width for selected points\n                         */\n                        lineWidth: 2\n                    }\n                }\n            },\n            /**\n             * Properties for each single point.\n             *\n             * @declare Highcharts.PlotSeriesPointOptions\n             *\n             * @private\n             */\n            point: {\n                /**\n                 * Fires when a point is clicked. One parameter, `event`, is passed\n                 * to the function, containing common event information.\n                 *\n                 * If the `series.allowPointSelect` option is true, the default\n                 * action for the point's click event is to toggle the point's\n                 * select state. Returning `false` cancels this action.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click/\n                 *         Click marker to alert values\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click-column/\n                 *         Click column\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click-url/\n                 *         Go to URL\n                 * @sample {highmaps} maps/plotoptions/series-point-events-click/\n                 *         Click marker to display values\n                 * @sample {highmaps} maps/plotoptions/series-point-events-click-url/\n                 *         Go to URL\n                 *\n                 * @type      {Highcharts.PointClickCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.click\n                 */\n                /**\n                 * Fires when the mouse leaves the area close to the point. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Show values in the chart's corner on mouse over\n                 *\n                 * @type      {Highcharts.PointMouseOutCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.mouseOut\n                 */\n                /**\n                 * Fires when the mouse enters the area close to the point. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Show values in the chart's corner on mouse over\n                 *\n                 * @type      {Highcharts.PointMouseOverCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.mouseOver\n                 */\n                /**\n                 * Fires when the point is removed using the `.remove()` method. One\n                 * parameter, `event`, is passed to the function. Returning `false`\n                 * cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-remove/\n                 *         Remove point and confirm\n                 *\n                 * @type      {Highcharts.PointRemoveCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.remove\n                 */\n                /**\n                 * Fires when the point is selected either programmatically or\n                 * following a click on the point. One parameter, `event`, is passed\n                 * to the function. Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-select/\n                 *         Report the last selected point\n                 * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n                 *         Report select and unselect\n                 *\n                 * @type      {Highcharts.PointSelectCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.select\n                 */\n                /**\n                 * Fires when the point is unselected either programmatically or\n                 * following a click on the point. One parameter, `event`, is passed\n                 * to the function.\n                 *  Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-unselect/\n                 *         Report the last unselected point\n                 * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n                 *         Report select and unselect\n                 *\n                 * @type      {Highcharts.PointUnselectCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.unselect\n                 */\n                /**\n                 * Fires when the point is updated programmatically through the\n                 * `.update()` method. One parameter, `event`, is passed to the\n                 * function. The new point options can be accessed through\n                 * `event.options`. Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-update/\n                 *         Confirm point updating\n                 *\n                 * @type      {Highcharts.PointUpdateCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.update\n                 */\n                /**\n                 * Events for each single point.\n                 *\n                 * @declare Highcharts.PointEventsOptionsObject\n                 */\n                events: {}\n            },\n            /**\n             * Options for the series data labels, appearing next to each data\n             * point.\n             *\n             * Since v6.2.0, multiple data labels can be applied to each single\n             * point by defining them as an array of configs.\n             *\n             * In styled mode, the data labels can be styled with the\n             * `.highcharts-data-label-box` and `.highcharts-data-label` class names\n             * ([see example](https://www.highcharts.com/samples/highcharts/css/series-datalabels)).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled\n             *         Data labels enabled\n             * @sample {highcharts} highcharts/plotoptions/series-datalabels-multiple\n             *         Multiple data labels on a bar series\n             * @sample {highcharts} highcharts/css/series-datalabels\n             *         Style mode example\n             *\n             * @type    {*|Array<*>}\n             * @product highcharts highstock highmaps gantt\n             *\n             * @private\n             */\n            dataLabels: {\n                /**\n                 * The alignment of the data label compared to the point. If\n                 * `right`, the right side of the label should be touching the\n                 * point. For points with an extent, like columns, the alignments\n                 * also dictates how to align it inside the box, as given with the\n                 * [inside](#plotOptions.column.dataLabels.inside)\n                 * option. Can be one of `left`, `center` or `right`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-align-left/\n                 *         Left aligned\n                 * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n                 *         Data labels inside the bar\n                 *\n                 * @type {Highcharts.AlignValue|null}\n                 */\n                align: 'center',\n                /**\n                 * Whether to allow data labels to overlap. To make the labels less\n                 * sensitive for overlapping, the\n                 * [dataLabels.padding](#plotOptions.series.dataLabels.padding)\n                 * can be set to 0.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-allowoverlap-false/\n                 *         Don't allow overlap\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     4.1.0\n                 * @apioption plotOptions.series.dataLabels.allowOverlap\n                 */\n                /**\n                 * The background color or gradient for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.backgroundColor\n                 */\n                /**\n                 * The border color for the data label. Defaults to `undefined`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderColor\n                 */\n                /**\n                 * The border radius in pixels for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderRadius\n                 */\n                /**\n                 * The border width in pixels for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderWidth\n                 */\n                /**\n                 * A class name for the data label. Particularly in styled mode,\n                 * this can be used to give each series' or point's data label\n                 * unique styling. In addition to this option, a default color class\n                 * name is added so that we can give the labels a contrast text\n                 * shadow.\n                 *\n                 * @sample {highcharts} highcharts/css/data-label-contrast/\n                 *         Contrast text shadow\n                 * @sample {highcharts} highcharts/css/series-datalabels/\n                 *         Styling by CSS\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption plotOptions.series.dataLabels.className\n                 */\n                /**\n                 * The text color for the data labels. Defaults to `undefined`. For\n                 * certain series types, like column or map, the data labels can be\n                 * drawn inside the points. In this case the data label will be\n                 * drawn with maximum contrast by default. Additionally, it will be\n                 * given a `text-outline` style with the opposite color, to further\n                 * increase the contrast. This can be overridden by setting the\n                 * `text-outline` style to `none` in the `dataLabels.style` option.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-color/\n                 *         Red data labels\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         White data labels\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.dataLabels.color\n                 */\n                /**\n                 * Whether to hide data labels that are outside the plot area. By\n                 * default, the data label is moved inside the plot area according\n                 * to the\n                 * [overflow](#plotOptions.series.dataLabels.overflow)\n                 * option.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.3.3\n                 * @apioption plotOptions.series.dataLabels.crop\n                 */\n                /**\n                 * Whether to defer displaying the data labels until the initial\n                 * series animation has finished.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.0.0\n                 * @product   highcharts highstock gantt\n                 * @apioption plotOptions.series.dataLabels.defer\n                 */\n                /**\n                 * Enable or disable the data labels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled/\n                 *         Data labels enabled\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         Data labels enabled\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption plotOptions.series.dataLabels.enabled\n                 */\n                /**\n                 * A declarative filter to control of which data labels to display.\n                 * The declarative filter is designed for use when callback\n                 * functions are not available, like when the chart options require\n                 * a pure JSON structure or for use with graphical editors. For\n                 * programmatic control, use the `formatter` instead, and return\n                 * `undefined` to disable a single data label.\n                 *\n                 * @example\n                 * filter: {\n                 *     property: 'percentage',\n                 *     operator: '>',\n                 *     value: 4\n                 * }\n                 *\n                 * @sample {highcharts} highcharts/demo/pie-monochrome\n                 *         Data labels filtered by percentage\n                 *\n                 * @declare   Highcharts.DataLabelsFilterOptionsObject\n                 * @since     6.0.3\n                 * @apioption plotOptions.series.dataLabels.filter\n                 */\n                /**\n                 * The operator to compare by. Can be one of `>`, `<`, `>=`, `<=`,\n                 * `==`, and `===`.\n                 *\n                 * @type       {string}\n                 * @validvalue [\">\", \"<\", \">=\", \"<=\", \"==\", \"===\"]\n                 * @apioption  plotOptions.series.dataLabels.filter.operator\n                 */\n                /**\n                 * The point property to filter by. Point options are passed\n                 * directly to properties, additionally there are `y` value,\n                 * `percentage` and others listed under {@link Highcharts.Point}\n                 * members.\n                 *\n                 * @type      {string}\n                 * @apioption plotOptions.series.dataLabels.filter.property\n                 */\n                /**\n                 * The value to compare against.\n                 *\n                 * @type      {number}\n                 * @apioption plotOptions.series.dataLabels.filter.value\n                 */\n                /**\n                 * A\n                 * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                 * for the data label. Available variables are the same as for\n                 * `formatter`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Add a unit\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n                 *         Formatted value in the data label\n                 *\n                 * @type      {string}\n                 * @default   y\n                 * @default   point.value\n                 * @since     3.0\n                 * @apioption plotOptions.series.dataLabels.format\n                 */\n                // eslint-disable-next-line valid-jsdoc\n                /**\n                 * Callback JavaScript function to format the data label. Note that\n                 * if a `format` is defined, the format takes precedence and the\n                 * formatter is ignored.\n                 *\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n                 *         Formatted value\n                 *\n                 * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n                 */\n                formatter: function () {\n                    var numberFormatter = this.series.chart.numberFormatter;\n                    return typeof this.y !== 'number' ? '' : numberFormatter(this.y, -1);\n                },\n                /**\n                 * For points with an extent, like columns or map areas, whether to\n                 * align the data label inside the box or to the actual value point.\n                 * Defaults to `false` in most cases, `true` in stacked columns.\n                 *\n                 * @type      {boolean}\n                 * @since     3.0\n                 * @apioption plotOptions.series.dataLabels.inside\n                 */\n                /**\n                 * Format for points with the value of null. Works analogously to\n                 * [format](#plotOptions.series.dataLabels.format). `nullFormat` can\n                 * be applied only to series which support displaying null points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {boolean|string}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.nullFormat\n                 */\n                /**\n                 * Callback JavaScript function that defines formatting for points\n                 * with the value of null. Works analogously to\n                 * [formatter](#plotOptions.series.dataLabels.formatter).\n                 * `nullPointFormatter` can be applied only to series which support\n                 * displaying null points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {Highcharts.DataLabelsFormatterCallbackFunction}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.nullFormatter\n                 */\n                /**\n                 * How to handle data labels that flow outside the plot area. The\n                 * default is `\"justify\"`, which aligns them inside the plot area.\n                 * For columns and bars, this means it will be moved inside the bar.\n                 * To display data labels outside the plot area, set `crop` to\n                 * `false` and `overflow` to `\"allow\"`.\n                 *\n                 * @type       {Highcharts.DataLabelsOverflowValue}\n                 * @default    justify\n                 * @since      3.0.6\n                 * @apioption  plotOptions.series.dataLabels.overflow\n                 */\n                /**\n                 * When either the `borderWidth` or the `backgroundColor` is set,\n                 * this is the padding within the box.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @since 2.2.1\n                 */\n                padding: 5,\n                /**\n                 * Aligns data labels relative to points. If `center` alignment is\n                 * not possible, it defaults to `right`.\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @default   center\n                 * @apioption plotOptions.series.dataLabels.position\n                 */\n                /**\n                 * Text rotation in degrees. Note that due to a more complex\n                 * structure, backgrounds, borders and padding will be lost on a\n                 * rotated data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical labels\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption plotOptions.series.dataLabels.rotation\n                 */\n                /**\n                 * The shadow of the box. Works best with `borderWidth` or\n                 * `backgroundColor`. Since 2.3 the shadow can be an object\n                 * configuration containing `color`, `offsetX`, `offsetY`, `opacity`\n                 * and `width`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {boolean|Highcharts.ShadowOptionsObject}\n                 * @default   false\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.shadow\n                 */\n                /**\n                 * The name of a symbol to use for the border around the label.\n                 * Symbols are predefined functions on the Renderer object.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-shape/\n                 *         A callout for annotations\n                 *\n                 * @type      {string}\n                 * @default   square\n                 * @since     4.1.2\n                 * @apioption plotOptions.series.dataLabels.shape\n                 */\n                /**\n                 * Styles for the label. The default `color` setting is\n                 * `\"contrast\"`, which is a pseudo color that Highcharts picks up\n                 * and applies the maximum contrast to the underlying point item,\n                 * for example the bar in a bar chart.\n                 *\n                 * The `textOutline` is a pseudo property that applies an outline of\n                 * the given width with the given color, which by default is the\n                 * maximum contrast to the text. So a bright text color will result\n                 * in a black text outline for maximum readability on a mixed\n                 * background. In some cases, especially with grayscale text, the\n                 * text outline doesn't work well, in which cases it can be disabled\n                 * by setting it to `\"none\"`. When `useHTML` is true, the\n                 * `textOutline` will not be picked up. In this, case, the same\n                 * effect can be acheived through the `text-shadow` CSS property.\n                 *\n                 * For some series types, where each point has an extent, like for\n                 * example tree maps, the data label may overflow the point. There\n                 * are two strategies for handling overflow. By default, the text\n                 * will wrap to multiple lines. The other strategy is to set\n                 * `style.textOverflow` to `ellipsis`, which will keep the text on\n                 * one line plus it will break inside long words.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-style/\n                 *         Bold labels\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow/\n                 *         Long labels truncated with an ellipsis in a pie\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap/\n                 *         Long labels are wrapped in a pie\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         Bold labels\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @since     4.1.0\n                 * @apioption plotOptions.series.dataLabels.style\n                 */\n                style: {\n                    /** @internal */\n                    fontSize: '11px',\n                    /** @internal */\n                    fontWeight: 'bold',\n                    /** @internal */\n                    color: 'contrast',\n                    /** @internal */\n                    textOutline: '1px contrast'\n                },\n                /**\n                 * Options for a label text which should follow marker's shape.\n                 * Border and background are disabled for a label that follows a\n                 * path.\n                 *\n                 * **Note:** Only SVG-based renderer supports this option. Setting\n                 * `useHTML` to true will disable this option.\n                 *\n                 * @declare   Highcharts.DataLabelsTextPathOptionsObject\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath\n                 */\n                /**\n                 * Presentation attributes for the text path.\n                 *\n                 * @type      {Highcharts.SVGAttributes}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath.attributes\n                 */\n                /**\n                 * Enable or disable `textPath` option for link's or marker's data\n                 * labels.\n                 *\n                 * @type      {boolean}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath.enabled\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the labels.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption plotOptions.series.dataLabels.useHTML\n                 */\n                /**\n                 * The vertical alignment of a data label. Can be one of `top`,\n                 * `middle` or `bottom`. The default value depends on the data, for\n                 * instance in a column chart, the label is above positive values\n                 * and below negative values.\n                 *\n                 * @type  {Highcharts.VerticalAlignValue|null}\n                 * @since 2.3.3\n                 */\n                verticalAlign: 'bottom',\n                /**\n                 * The x position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical and positioned\n                 * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n                 *         Data labels inside the bar\n                 */\n                x: 0,\n                /**\n                 * The Z index of the data labels. The default Z index puts it above\n                 * the series. Use a Z index of 2 to display it behind the series.\n                 *\n                 * @type      {number}\n                 * @default   6\n                 * @since     2.3.5\n                 * @apioption plotOptions.series.dataLabels.z\n                 */\n                /**\n                 * The y position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical and positioned\n                 */\n                y: 0\n            },\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, even if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @since   2.2\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            cropThreshold: 300,\n            /**\n             * Opacity of a series parts: line, fill (e.g. area) and dataLabels.\n             *\n             * @see [states.inactive.opacity](#plotOptions.series.states.inactive.opacity)\n             *\n             * @since 7.1.0\n             *\n             * @private\n             */\n            opacity: 1,\n            /**\n             * The width of each point on the x axis. For example in a column chart\n             * with one value each day, the pointRange would be 1 day (= 24 * 3600\n             * * 1000 milliseconds). This is normally computed automatically, but\n             * this option can be used to override the automatic value.\n             *\n             * @product highstock\n             *\n             * @private\n             */\n            pointRange: 0,\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            softThreshold: true,\n            /**\n             * @declare Highcharts.SeriesStatesOptionsObject\n             *\n             * @private\n             */\n            states: {\n                /**\n                 * The normal state of a series, or for point items in column, pie\n                 * and similar series. Currently only used for setting animation\n                 * when returning to normal state from hover.\n                 *\n                 * @declare Highcharts.SeriesStatesNormalOptionsObject\n                 */\n                normal: {\n                    /**\n                     * Animation when returning to normal state after hovering.\n                     *\n                     * @type {boolean|Highcharts.AnimationOptionsObject}\n                     */\n                    animation: true\n                },\n                /**\n                 * Options for the hovered series. These settings override the\n                 * normal state options when a series is moused over or touched.\n                 *\n                 * @declare Highcharts.SeriesStatesHoverOptionsObject\n                 */\n                hover: {\n                    /**\n                     * Enable separate styles for the hovered series to visualize\n                     * that the user hovers either the series itself or the legend.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled/\n                     *         Line\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-column/\n                     *         Column\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-pie/\n                     *         Pie\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     1.2\n                     * @apioption plotOptions.series.states.hover.enabled\n                     */\n                    /**\n                     * Animation setting for hovering the graph in line-type series.\n                     *\n                     * @type    {boolean|Highcharts.AnimationOptionsObject}\n                     * @since   5.0.8\n                     * @product highcharts highstock\n                     */\n                    animation: {\n                        /**\n                         * The duration of the hover animation in milliseconds. By\n                         * default the hover state animates quickly in, and slowly\n                         * back to normal.\n                         *\n                         * @internal\n                         */\n                        duration: 50\n                    },\n                    /**\n                     * Pixel width of the graph line. By default this property is\n                     * undefined, and the `lineWidthPlus` property dictates how much\n                     * to increase the linewidth from normal state.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidth/\n                     *         5px line on hover\n                     *\n                     * @type      {number}\n                     * @product   highcharts highstock\n                     * @apioption plotOptions.series.states.hover.lineWidth\n                     */\n                    /**\n                     * The additional line width for the graph of a hovered series.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                     *         5 pixels wider\n                     * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                     *         5 pixels wider\n                     *\n                     * @since   4.0.3\n                     * @product highcharts highstock\n                     */\n                    lineWidthPlus: 1,\n                    /**\n                     * In Highcharts 1.0, the appearance of all markers belonging\n                     * to the hovered series. For settings on the hover state of the\n                     * individual point, see\n                     * [marker.states.hover](#plotOptions.series.marker.states.hover).\n                     *\n                     * @deprecated\n                     *\n                     * @extends   plotOptions.series.marker\n                     * @excluding states\n                     * @product   highcharts highstock\n                     */\n                    marker: {\n                    // lineWidth: base + 1,\n                    // radius: base + 1\n                    },\n                    /**\n                     * Options for the halo appearing around the hovered point in\n                     * line-type series as well as outside the hovered slice in pie\n                     * charts. By default the halo is filled by the current point or\n                     * series color with an opacity of 0.25\\. The halo can be\n                     * disabled by setting the `halo` option to `null`.\n                     *\n                     * In styled mode, the halo is styled with the\n                     * `.highcharts-halo` class, with colors inherited from\n                     * `.highcharts-color-{n}`.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/halo/\n                     *         Halo options\n                     * @sample {highstock} highcharts/plotoptions/halo/\n                     *         Halo options\n                     *\n                     * @declare Highcharts.SeriesStatesHoverHaloOptionsObject\n                     * @type    {null|*}\n                     * @since   4.0\n                     * @product highcharts highstock\n                     */\n                    halo: {\n                        /**\n                         * A collection of SVG attributes to override the appearance\n                         * of the halo, for example `fill`, `stroke` and\n                         * `stroke-width`.\n                         *\n                         * @type      {Highcharts.SVGAttributes}\n                         * @since     4.0\n                         * @product   highcharts highstock\n                         * @apioption plotOptions.series.states.hover.halo.attributes\n                         */\n                        /**\n                         * The pixel size of the halo. For point markers this is the\n                         * radius of the halo. For pie slices it is the width of the\n                         * halo outside the slice. For bubbles it defaults to 5 and\n                         * is the width of the halo outside the bubble.\n                         *\n                         * @since   4.0\n                         * @product highcharts highstock\n                         */\n                        size: 10,\n                        /**\n                         * Opacity for the halo unless a specific fill is overridden\n                         * using the `attributes` setting. Note that Highcharts is\n                         * only able to apply opacity to colors of hex or rgb(a)\n                         * formats.\n                         *\n                         * @since   4.0\n                         * @product highcharts highstock\n                         */\n                        opacity: 0.25\n                    }\n                },\n                /**\n                 * Specific options for point in selected states, after being\n                 * selected by\n                 * [allowPointSelect](#plotOptions.series.allowPointSelect)\n                 * or programmatically.\n                 *\n                 * @sample maps/plotoptions/series-allowpointselect/\n                 *         Allow point select demo\n                 *\n                 * @declare   Highcharts.SeriesStatesSelectOptionsObject\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding brightness\n                 */\n                select: {\n                    animation: {\n                        /** @internal */\n                        duration: 0\n                    }\n                },\n                /**\n                 * The opposite state of a hover for series.\n                 *\n                 * @sample highcharts/plotoptions/series-states-inactive-disabled\n                 *         Disabled inactive state\n                 *\n                 * @declare Highcharts.SeriesStatesInactiveOptionsObject\n                 */\n                inactive: {\n                    /**\n                     * Enable or disable the inactive state for a series\n                     *\n                     * @sample highcharts/plotoptions/series-states-inactive-disabled\n                     *         Disabled inactive state\n                     *\n                     * @type {boolean}\n                     * @default true\n                     * @apioption plotOptions.series.states.inactive.enabled\n                     */\n                    /**\n                     * The animation for entering the inactive state.\n                     *\n                     * @type {boolean|Highcharts.AnimationOptionsObject}\n                     */\n                    animation: {\n                        /** @internal */\n                        duration: 50\n                    },\n                    /**\n                     * Opacity of series elements (dataLabels, line, area).\n                     *\n                     * @type {number}\n                     */\n                    opacity: 0.2\n                }\n            },\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event on a\n             * series isn't triggered until the mouse moves over another series, or\n             * out of the plot area. When false, the `mouseOut` event on a series is\n             * triggered when the mouse leaves the area around the series' graph or\n             * markers. This also implies the tooltip when not shared. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series. Defaults to true\n             * for line and area type series, but to false for columns, pies etc.\n             *\n             * **Note:** The boost module will force this option because of\n             * technical limitations.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-stickytracking-true/\n             *         True by default\n             * @sample {highcharts} highcharts/plotoptions/series-stickytracking-false/\n             *         False\n             *\n             * @default {highcharts} true\n             * @default {highstock} true\n             * @default {highmaps} false\n             * @since   2.0\n             *\n             * @private\n             */\n            stickyTracking: true,\n            /**\n             * A configuration object for the tooltip rendering of each single\n             * series. Properties are inherited from [tooltip](#tooltip), but only\n             * the following properties can be defined on a series level.\n             *\n             * @declare   Highcharts.SeriesTooltipOptionsObject\n             * @since     2.3\n             * @extends   tooltip\n             * @excluding animation, backgroundColor, borderColor, borderRadius,\n             *            borderWidth, className, crosshairs, enabled, formatter,\n             *            headerShape, hideDelay, outside, padding, positioner,\n             *            shadow, shape, shared, snap, split, style, useHTML\n             * @apioption plotOptions.series.tooltip\n             */\n            /**\n             * When a series contains a data array that is longer than this, only\n             * one dimensional arrays of numbers, or two dimensional arrays with\n             * x and y values are allowed. Also, only the first point is tested,\n             * and the rest are assumed to be the same format. This saves expensive\n             * data checking and indexing in long series. Set it to `0` disable.\n             *\n             * Note:\n             * In boost mode turbo threshold is forced. Only array of numbers or\n             * two dimensional arrays are allowed.\n             *\n             * @since   2.2\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            turboThreshold: 1000,\n            /**\n             * An array defining zones within a series. Zones can be applied to the\n             * X axis, Y axis or Z axis for bubbles, according to the `zoneAxis`\n             * option. The zone definitions have to be in ascending order regarding\n             * to the value.\n             *\n             * In styled mode, the color zones are styled with the\n             * `.highcharts-zone-{n}` class, or custom classed from the `className`\n             * option\n             * ([view live demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/color-zones/)).\n             *\n             * @see [zoneAxis](#plotOptions.series.zoneAxis)\n             *\n             * @sample {highcharts} highcharts/series/color-zones-simple/\n             *         Color zones\n             * @sample {highstock} highcharts/series/color-zones-simple/\n             *         Color zones\n             *\n             * @declare   Highcharts.SeriesZonesOptionsObject\n             * @type      {Array<*>}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones\n             */\n            /**\n             * Styled mode only. A custom class name for the zone.\n             *\n             * @sample highcharts/css/color-zones/\n             *         Zones styled by class name\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption plotOptions.series.zones.className\n             */\n            /**\n             * Defines the color of the series.\n             *\n             * @see [series color](#plotOptions.series.color)\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.color\n             */\n            /**\n             * A name for the dash style to use for the graph.\n             *\n             * @see [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n             *\n             * @sample {highcharts|highstock} highcharts/series/color-zones-dashstyle-dot/\n             *         Dashed line indicates prognosis\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.dashStyle\n             */\n            /**\n             * Defines the fill color for the series (in area type series)\n             *\n             * @see [fillColor](#plotOptions.area.fillColor)\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.fillColor\n             */\n            /**\n             * The value up to where the zone extends, if undefined the zones\n             * stretches to the last value in the series.\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.value\n             */\n            /**\n             * When using dual or multiple color axes, this number defines which\n             * colorAxis the particular series is connected to. It refers to\n             * either the\n             * {@link #colorAxis.id|axis id}\n             * or the index of the axis in the colorAxis array, with 0 being the\n             * first. Set this option to false to prevent a series from connecting\n             * to the default color axis.\n             *\n             * Since v7.2.0 the option can also be an axis id or an axis index\n             * instead of a boolean flag.\n             *\n             * @sample highcharts/coloraxis/coloraxis-with-pie/\n             *         Color axis with pie series\n             * @sample highcharts/coloraxis/multiple-coloraxis/\n             *         Multiple color axis\n             *\n             * @type      {number|string|boolean}\n             * @default   0\n             * @product   highcharts highstock highmaps\n             * @apioption plotOptions.series.colorAxis\n             */\n            /**\n             * Determines what data value should be used to calculate point color\n             * if `colorAxis` is used. Requires to set `min` and `max` if some\n             * custom point property is used or if approximation for data grouping\n             * is set to `'sum'`.\n             *\n             * @sample highcharts/coloraxis/custom-color-key/\n             *         Custom color key\n             * @sample highcharts/coloraxis/changed-default-color-key/\n             *         Changed default color key\n             *\n             * @type      {string}\n             * @default   y\n             * @since     7.2.0\n             * @product   highcharts highstock highmaps\n             * @apioption plotOptions.series.colorKey\n             */\n            /**\n             * Determines whether the series should look for the nearest point\n             * in both dimensions or just the x-dimension when hovering the series.\n             * Defaults to `'xy'` for scatter series and `'x'` for most other\n             * series. If the data has duplicate x-values, it is recommended to\n             * set this to `'xy'` to allow hovering over all points.\n             *\n             * Applies only to series types using nearest neighbor search (not\n             * direct hover) for tooltip.\n             *\n             * @sample {highcharts} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             * @sample {highstock} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             * @sample {highmaps} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             *\n             * @since      5.0.10\n             * @validvalue [\"x\", \"xy\"]\n             *\n             * @private\n             */\n            findNearestPointBy: 'x'\n        }, \n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /** @lends Highcharts.Series.prototype */\n        {\n            axisTypes: ['xAxis', 'yAxis'],\n            coll: 'series',\n            colorCounter: 0,\n            cropShoulder: 1,\n            directTouch: false,\n            eventsToUnbind: [],\n            isCartesian: true,\n            // each point's x and y values are stored in this.xData and this.yData\n            parallelArrays: ['x', 'y'],\n            pointClass: Point,\n            requireSorting: true,\n            sorted: true,\n            init: function (chart, options) {\n                fireEvent(this, 'init', { options: options });\n                var series = this,\n                    events,\n                    chartSeries = chart.series,\n                    lastSeries;\n                // A lookup over those events that are added by _options_ (not\n                // programmatically). These are updated through Series.update()\n                // (#10861).\n                this.eventOptions = this.eventOptions || {};\n                /**\n                 * Read only. The chart that the series belongs to.\n                 *\n                 * @name Highcharts.Series#chart\n                 * @type {Highcharts.Chart}\n                 */\n                series.chart = chart;\n                /**\n                 * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n                 * The type in the series options anc can be altered using\n                 * {@link Series#update}.\n                 *\n                 * @name Highcharts.Series#type\n                 * @type {string}\n                 */\n                /**\n                 * Read only. The series' current options. To update, use\n                 * {@link Series#update}.\n                 *\n                 * @name Highcharts.Series#options\n                 * @type {Highcharts.SeriesOptionsType}\n                 */\n                series.options = options = series.setOptions(options);\n                series.linkedSeries = [];\n                // bind the axes\n                series.bindAxes();\n                // set some variables\n                extend(series, {\n                    /**\n                     * The series name as given in the options. Defaults to\n                     * \"Series {n}\".\n                     *\n                     * @name Highcharts.Series#name\n                     * @type {string}\n                     */\n                    name: options.name,\n                    state: '',\n                    /**\n                     * Read only. The series' visibility state as set by {@link\n                     * Series#show}, {@link Series#hide}, or in the initial\n                     * configuration.\n                     *\n                     * @name Highcharts.Series#visible\n                     * @type {boolean}\n                     */\n                    visible: options.visible !== false,\n                    /**\n                     * Read only. The series' selected state as set by {@link\n                     * Highcharts.Series#select}.\n                     *\n                     * @name Highcharts.Series#selected\n                     * @type {boolean}\n                     */\n                    selected: options.selected === true // false by default\n                });\n                // Register event listeners\n                events = options.events;\n                objectEach(events, function (event, eventType) {\n                    if (isFunction(event)) {\n                        // If event does not exist, or is changed by Series.update\n                        if (series.eventOptions[eventType] !== event) {\n                            // Remove existing if set by option\n                            if (isFunction(series.eventOptions[eventType])) {\n                                removeEvent(series, eventType, series.eventOptions[eventType]);\n                            }\n                            series.eventOptions[eventType] = event;\n                            addEvent(series, eventType, event);\n                        }\n                    }\n                });\n                if ((events && events.click) ||\n                    (options.point &&\n                        options.point.events &&\n                        options.point.events.click) ||\n                    options.allowPointSelect) {\n                    chart.runTrackerClick = true;\n                }\n                series.getColor();\n                series.getSymbol();\n                // Initialize the parallel data arrays\n                series.parallelArrays.forEach(function (key) {\n                    if (!series[key + 'Data']) {\n                        series[key + 'Data'] = [];\n                    }\n                });\n                // Mark cartesian\n                if (series.isCartesian) {\n                    chart.hasCartesianSeries = true;\n                }\n                // Get the index and register the series in the chart. The index is\n                // one more than the current latest series index (#5960).\n                if (chartSeries.length) {\n                    lastSeries = chartSeries[chartSeries.length - 1];\n                }\n                series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n                series.opacity = series.options.opacity;\n                // Insert the series and re-order all series above the insertion\n                // point.\n                chart.orderSeries(this.insert(chartSeries));\n                // Set options for series with sorting and set data later.\n                if (options.dataSorting && options.dataSorting.enabled) {\n                    series.setDataSortingOptions();\n                }\n                else if (!series.points && !series.data) {\n                    series.setData(options.data, false);\n                }\n                fireEvent(this, 'afterInit');\n            },\n            /**\n             * Check whether the series item is itself or inherits from a certain\n             * series type.\n             *\n             * @function Highcharts.Series#is\n             * @param {string} type The type of series to check for, can be either\n             *        featured or custom series types. For example `column`, `pie`,\n             *        `ohlc` etc.\n             *\n             * @return {boolean}\n             *        True if this item is or inherits from the given type.\n             */\n            is: function (type) {\n                return seriesTypes[type] && this instanceof seriesTypes[type];\n            },\n            /**\n             * Insert the series in a collection with other series, either the chart\n             * series or yAxis series, in the correct order according to the index\n             * option. Used internally when adding series.\n             *\n             * @private\n             * @function Highcharts.Series#insert\n             * @param {Array<Highcharts.Series>} collection\n             *        A collection of series, like `chart.series` or `xAxis.series`.\n             * @return {number}\n             *         The index of the series in the collection.\n             */\n            insert: function (collection) {\n                var indexOption = this.options.index,\n                    i;\n                // Insert by index option\n                if (isNumber(indexOption)) {\n                    i = collection.length;\n                    while (i--) {\n                        // Loop down until the interted element has higher index\n                        if (indexOption >=\n                            pick(collection[i].options.index, collection[i]._i)) {\n                            collection.splice(i + 1, 0, this);\n                            break;\n                        }\n                    }\n                    if (i === -1) {\n                        collection.unshift(this);\n                    }\n                    i = i + 1;\n                    // Or just push it to the end\n                }\n                else {\n                    collection.push(this);\n                }\n                return pick(i, collection.length - 1);\n            },\n            /**\n             * Set the xAxis and yAxis properties of cartesian series, and register\n             * the series in the `axis.series` array.\n             *\n             * @private\n             * @function Highcharts.Series#bindAxes\n             * @return {void}\n             * @exception 18\n             */\n            bindAxes: function () {\n                var series = this,\n                    seriesOptions = series.options,\n                    chart = series.chart,\n                    axisOptions;\n                fireEvent(this, 'bindAxes', null, function () {\n                    // repeat for xAxis and yAxis\n                    (series.axisTypes || []).forEach(function (AXIS) {\n                        // loop through the chart's axis objects\n                        chart[AXIS].forEach(function (axis) {\n                            axisOptions = axis.options;\n                            // apply if the series xAxis or yAxis option mathches\n                            // the number of the axis, or if undefined, use the\n                            // first axis\n                            if (seriesOptions[AXIS] ===\n                                axisOptions.index ||\n                                (typeof seriesOptions[AXIS] !==\n                                    'undefined' &&\n                                    seriesOptions[AXIS] === axisOptions.id) ||\n                                (typeof seriesOptions[AXIS] ===\n                                    'undefined' &&\n                                    axisOptions.index === 0)) {\n                                // register this series in the axis.series lookup\n                                series.insert(axis.series);\n                                // set this series.xAxis or series.yAxis reference\n                                /**\n                                 * Read only. The unique xAxis object associated\n                                 * with the series.\n                                 *\n                                 * @name Highcharts.Series#xAxis\n                                 * @type {Highcharts.Axis}\n                                 */\n                                /**\n                                 * Read only. The unique yAxis object associated\n                                 * with the series.\n                                 *\n                                 * @name Highcharts.Series#yAxis\n                                 * @type {Highcharts.Axis}\n                                 */\n                                series[AXIS] = axis;\n                                // mark dirty for redraw\n                                axis.isDirty = true;\n                            }\n                        });\n                        // The series needs an X and an Y axis\n                        if (!series[AXIS] &&\n                            series.optionalAxis !== AXIS) {\n                            error(18, true, chart);\n                        }\n                    });\n                });\n                fireEvent(this, 'afterBindAxes');\n            },\n            /**\n             * For simple series types like line and column, the data values are\n             * held in arrays like xData and yData for quick lookup to find extremes\n             * and more. For multidimensional series like bubble and map, this can\n             * be extended with arrays like zData and valueData by adding to the\n             * `series.parallelArrays` array.\n             *\n             * @private\n             * @function Highcharts.Series#updateParallelArrays\n             * @param {Highcharts.Point} point\n             * @param {number|string} i\n             * @return {void}\n             */\n            updateParallelArrays: function (point, i) {\n                var series = point.series,\n                    args = arguments,\n                    fn = isNumber(i) ?\n                        // Insert the value in the given position\n                        function (key) {\n                            var val = key === 'y' && series.toYData ?\n                                series.toYData(point) :\n                                point[key];\n                        series[key + 'Data'][i] = val;\n                    } :\n                    // Apply the method specified in i with the following\n                    // arguments as arguments\n                    function (key) {\n                        Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));\n                    };\n                series.parallelArrays.forEach(fn);\n            },\n            /**\n             * Define hasData functions for series. These return true if there\n             * are data points on this series within the plot area.\n             *\n             * @private\n             * @function Highcharts.Series#hasData\n             * @return {boolean}\n             */\n            hasData: function () {\n                return ((this.visible &&\n                    typeof this.dataMax !== 'undefined' &&\n                    typeof this.dataMin !== 'undefined') || ( // #3703\n                this.visible &&\n                    this.yData &&\n                    this.yData.length > 0) // #9758\n                );\n            },\n            /**\n             * Return an auto incremented x value based on the pointStart and\n             * pointInterval options. This is only used if an x value is not given\n             * for the point that calls autoIncrement.\n             *\n             * @private\n             * @function Highcharts.Series#autoIncrement\n             * @return {number}\n             */\n            autoIncrement: function () {\n                var options = this.options,\n                    xIncrement = this.xIncrement,\n                    date,\n                    pointInterval,\n                    pointIntervalUnit = options.pointIntervalUnit,\n                    time = this.chart.time;\n                xIncrement = pick(xIncrement, options.pointStart, 0);\n                this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);\n                // Added code for pointInterval strings\n                if (pointIntervalUnit) {\n                    date = new time.Date(xIncrement);\n                    if (pointIntervalUnit === 'day') {\n                        time.set('Date', date, time.get('Date', date) + pointInterval);\n                    }\n                    else if (pointIntervalUnit === 'month') {\n                        time.set('Month', date, time.get('Month', date) + pointInterval);\n                    }\n                    else if (pointIntervalUnit === 'year') {\n                        time.set('FullYear', date, time.get('FullYear', date) + pointInterval);\n                    }\n                    pointInterval = date.getTime() - xIncrement;\n                }\n                this.xIncrement = xIncrement + pointInterval;\n                return xIncrement;\n            },\n            /**\n             * Internal function to set properties for series if data sorting is\n             * enabled.\n             *\n             * @private\n             * @function Highcharts.Series#setDataSortingOptions\n             * @return {void}\n             */\n            setDataSortingOptions: function () {\n                var options = this.options;\n                extend(this, {\n                    requireSorting: false,\n                    sorted: false,\n                    enabledDataSorting: true,\n                    allowDG: false\n                });\n                // To allow unsorted data for column series.\n                if (!defined(options.pointRange)) {\n                    options.pointRange = 1;\n                }\n            },\n            /**\n             * Set the series options by merging from the options tree. Called\n             * internally on initializing and updating series. This function will\n             * not redraw the series. For API usage, use {@link Series#update}.\n             * @private\n             * @function Highcharts.Series#setOptions\n             * @param {Highcharts.SeriesOptionsType} itemOptions\n             *        The series options.\n             * @return {Highcharts.SeriesOptionsType}\n             * @fires Highcharts.Series#event:afterSetOptions\n             */\n            setOptions: function (itemOptions) {\n                var chart = this.chart,\n                    chartOptions = chart.options,\n                    plotOptions = chartOptions.plotOptions,\n                    userOptions = chart.userOptions || {},\n                    seriesUserOptions = merge(itemOptions),\n                    options,\n                    zones,\n                    zone,\n                    styledMode = chart.styledMode,\n                    e = {\n                        plotOptions: plotOptions,\n                        userOptions: seriesUserOptions\n                    };\n                fireEvent(this, 'setOptions', e);\n                // These may be modified by the event\n                var typeOptions = e.plotOptions[this.type],\n                    userPlotOptions = (userOptions.plotOptions || {});\n                // use copy to prevent undetected changes (#9762)\n                /**\n                 * Contains series options by the user without defaults.\n                 * @name Highcharts.Series#userOptions\n                 * @type {Highcharts.SeriesOptionsType}\n                 */\n                this.userOptions = e.userOptions;\n                options = merge(typeOptions, plotOptions.series, \n                // #3881, chart instance plotOptions[type] should trump\n                // plotOptions.series\n                userOptions.plotOptions &&\n                    userOptions.plotOptions[this.type], seriesUserOptions);\n                // The tooltip options are merged between global and series specific\n                // options. Importance order asscendingly:\n                // globals: (1)tooltip, (2)plotOptions.series,\n                // (3)plotOptions[this.type]\n                // init userOptions with possible later updates: 4-6 like 1-3 and\n                // (7)this series options\n                this.tooltipOptions = merge(defaultOptions.tooltip, // 1\n                defaultOptions.plotOptions.series &&\n                    defaultOptions.plotOptions.series.tooltip, // 2\n                defaultOptions.plotOptions[this.type].tooltip, // 3\n                chartOptions.tooltip.userOptions, // 4\n                plotOptions.series &&\n                    plotOptions.series.tooltip, // 5\n                plotOptions[this.type].tooltip, // 6\n                seriesUserOptions.tooltip // 7\n                );\n                // When shared tooltip, stickyTracking is true by default,\n                // unless user says otherwise.\n                this.stickyTracking = pick(seriesUserOptions.stickyTracking, userPlotOptions[this.type] &&\n                    userPlotOptions[this.type].stickyTracking, userPlotOptions.series && userPlotOptions.series.stickyTracking, (this.tooltipOptions.shared && !this.noSharedTooltip ?\n                    true :\n                    options.stickyTracking));\n                // Delete marker object if not allowed (#1125)\n                if (typeOptions.marker === null) {\n                    delete options.marker;\n                }\n                // Handle color zones\n                this.zoneAxis = options.zoneAxis;\n                zones = this.zones = (options.zones || []).slice();\n                if ((options.negativeColor || options.negativeFillColor) &&\n                    !options.zones) {\n                    zone = {\n                        value: options[this.zoneAxis + 'Threshold'] ||\n                            options.threshold ||\n                            0,\n                        className: 'highcharts-negative'\n                    };\n                    if (!styledMode) {\n                        zone.color = options.negativeColor;\n                        zone.fillColor = options.negativeFillColor;\n                    }\n                    zones.push(zone);\n                }\n                if (zones.length) { // Push one extra zone for the rest\n                    if (defined(zones[zones.length - 1].value)) {\n                        zones.push(styledMode ? {} : {\n                            color: this.color,\n                            fillColor: this.fillColor\n                        });\n                    }\n                }\n                fireEvent(this, 'afterSetOptions', { options: options });\n                return options;\n            },\n            /**\n             * Return series name in \"Series {Number}\" format or the one defined by\n             * a user. This method can be simply overridden as series name format\n             * can vary (e.g. technical indicators).\n             *\n             * @function Highcharts.Series#getName\n             * @return {string}\n             *         The series name.\n             */\n            getName: function () {\n                // #4119\n                return pick(this.options.name, 'Series ' + (this.index + 1));\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#getCyclic\n             * @param {string} prop\n             * @param {*} [value]\n             * @param {Highcharts.Dictionary<any>} [defaults]\n             * @return {void}\n             */\n            getCyclic: function (prop, value, defaults) {\n                var i, chart = this.chart, userOptions = this.userOptions, indexName = prop + 'Index', counterName = prop + 'Counter', len = defaults ? defaults.length : pick(chart.options.chart[prop + 'Count'], chart[prop + 'Count']), setting;\n                if (!value) {\n                    // Pick up either the colorIndex option, or the _colorIndex\n                    // after Series.update()\n                    setting = pick(userOptions[indexName], userOptions['_' + indexName]);\n                    if (defined(setting)) { // after Series.update()\n                        i = setting;\n                    }\n                    else {\n                        // #6138\n                        if (!chart.series.length) {\n                            chart[counterName] = 0;\n                        }\n                        userOptions['_' + indexName] = i =\n                            chart[counterName] % len;\n                        chart[counterName] += 1;\n                    }\n                    if (defaults) {\n                        value = defaults[i];\n                    }\n                }\n                // Set the colorIndex\n                if (typeof i !== 'undefined') {\n                    this[indexName] = i;\n                }\n                this[prop] = value;\n            },\n            /**\n             * Get the series' color based on either the options or pulled from\n             * global options.\n             *\n             * @private\n             * @function Highcharts.Series#getColor\n             * @return {void}\n             */\n            getColor: function () {\n                if (this.chart.styledMode) {\n                    this.getCyclic('color');\n                }\n                else if (this.options.colorByPoint) {\n                    // #4359, selected slice got series.color even when colorByPoint\n                    // was set.\n                    this.options.color = null;\n                }\n                else {\n                    this.getCyclic('color', this.options.color ||\n                        defaultOptions.plotOptions[this.type].color, this.chart.options.colors);\n                }\n            },\n            /**\n             * Get all points' instances created for this series.\n             *\n             * @private\n             * @function Highcharts.Series#getPointsCollection\n             * @return {Array<Highcharts.Point>}\n             */\n            getPointsCollection: function () {\n                return (this.hasGroupedData ? this.points : this.data) || [];\n            },\n            /**\n             * Get the series' symbol based on either the options or pulled from\n             * global options.\n             *\n             * @private\n             * @function Highcharts.Series#getSymbol\n             * @return {void}\n             */\n            getSymbol: function () {\n                var seriesMarkerOption = this.options.marker;\n                this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n            },\n            /**\n             * Finds the index of an existing point that matches the given point\n             * options.\n             *\n             * @private\n             * @function Highcharts.Series#findPointIndex\n             * @param    {Highcharts.PointOptionsObject} optionsObject\n             *           The options of the point.\n             * @param    {number} fromIndex\n             *           The index to start searching from, used for optimizing\n             *           series with required sorting.\n             * @returns  {number|undefined}\n             *           Returns the index of a matching point, or undefined if no\n             *           match is found.\n             */\n            findPointIndex: function (optionsObject, fromIndex) {\n                var id = optionsObject.id,\n                    x = optionsObject.x,\n                    oldData = this.points,\n                    matchingPoint,\n                    matchedById,\n                    pointIndex,\n                    matchKey,\n                    dataSorting = this.options.dataSorting;\n                if (id) {\n                    matchingPoint = this.chart.get(id);\n                }\n                else if (this.linkedParent || this.enabledDataSorting) {\n                    matchKey = (dataSorting && dataSorting.matchByName) ?\n                        'name' : 'index';\n                    matchingPoint = find(oldData, function (oldPoint) {\n                        return !oldPoint.touched && oldPoint[matchKey] ===\n                            optionsObject[matchKey];\n                    });\n                    // Add unmatched point as a new point\n                    if (!matchingPoint) {\n                        return void 0;\n                    }\n                }\n                if (matchingPoint) {\n                    pointIndex = matchingPoint && matchingPoint.index;\n                    if (typeof pointIndex !== 'undefined') {\n                        matchedById = true;\n                    }\n                }\n                // Search for the same X in the existing data set\n                if (typeof pointIndex === 'undefined' && isNumber(x)) {\n                    pointIndex = this.xData.indexOf(x, fromIndex);\n                }\n                // Reduce pointIndex if data is cropped\n                if (pointIndex !== -1 &&\n                    typeof pointIndex !== 'undefined' &&\n                    this.cropped) {\n                    pointIndex = (pointIndex >= this.cropStart) ?\n                        pointIndex - this.cropStart : pointIndex;\n                }\n                if (!matchedById &&\n                    oldData[pointIndex] && oldData[pointIndex].touched) {\n                    pointIndex = void 0;\n                }\n                return pointIndex;\n            },\n            /**\n             * @private\n             * @borrows LegendSymbolMixin.drawLineMarker as Highcharts.Series#drawLegendSymbol\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n            /**\n             * Internal function called from setData. If the point count is the same\n             * as is was, or if there are overlapping X values, just run\n             * Point.update which is cheaper, allows animation, and keeps references\n             * to points. This also allows adding or removing points if the X-es\n             * don't match.\n             *\n             * @private\n             * @function Highcharts.Series#updateData\n             *\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *\n             * @return {boolean}\n             */\n            updateData: function (data, animation) {\n                var options = this.options,\n                    dataSorting = options.dataSorting,\n                    oldData = this.points,\n                    pointsToAdd = [],\n                    hasUpdatedByKey,\n                    i,\n                    point,\n                    lastIndex,\n                    requireSorting = this.requireSorting,\n                    equalLength = data.length === oldData.length,\n                    succeeded = true;\n                this.xIncrement = null;\n                // Iterate the new data\n                data.forEach(function (pointOptions, i) {\n                    var id,\n                        x,\n                        pointIndex,\n                        optionsObject = (defined(pointOptions) &&\n                            this.pointClass.prototype.optionsToObject.call({ series: this },\n                        pointOptions)) || {};\n                    // Get the x of the new data point\n                    x = optionsObject.x;\n                    id = optionsObject.id;\n                    if (id || isNumber(x)) {\n                        pointIndex = this.findPointIndex(optionsObject, lastIndex);\n                        // Matching X not found\n                        // or used already due to ununique x values (#8995),\n                        // add point (but later)\n                        if (pointIndex === -1 ||\n                            typeof pointIndex === 'undefined') {\n                            pointsToAdd.push(pointOptions);\n                            // Matching X found, update\n                        }\n                        else if (oldData[pointIndex] &&\n                            pointOptions !== options.data[pointIndex]) {\n                            oldData[pointIndex].update(pointOptions, false, null, false);\n                            // Mark it touched, below we will remove all points that\n                            // are not touched.\n                            oldData[pointIndex].touched = true;\n                            // Speed optimize by only searching after last known\n                            // index. Performs ~20% bettor on large data sets.\n                            if (requireSorting) {\n                                lastIndex = pointIndex + 1;\n                            }\n                            // Point exists, no changes, don't remove it\n                        }\n                        else if (oldData[pointIndex]) {\n                            oldData[pointIndex].touched = true;\n                        }\n                        // If the length is equal and some of the nodes had a\n                        // match in the same position, we don't want to remove\n                        // non-matches.\n                        if (!equalLength ||\n                            i !== pointIndex ||\n                            (dataSorting && dataSorting.enabled) ||\n                            this.hasDerivedData) {\n                            hasUpdatedByKey = true;\n                        }\n                    }\n                    else {\n                        // Gather all points that are not matched\n                        pointsToAdd.push(pointOptions);\n                    }\n                }, this);\n                // Remove points that don't exist in the updated data set\n                if (hasUpdatedByKey) {\n                    i = oldData.length;\n                    while (i--) {\n                        point = oldData[i];\n                        if (point && !point.touched && point.remove) {\n                            point.remove(false, animation);\n                        }\n                    }\n                    // If we did not find keys (ids or x-values), and the length is the\n                    // same, update one-to-one\n                }\n                else if (equalLength && (!dataSorting || !dataSorting.enabled)) {\n                    data.forEach(function (point, i) {\n                        // .update doesn't exist on a linked, hidden series (#3709)\n                        // (#10187)\n                        if (oldData[i].update && point !== oldData[i].y) {\n                            oldData[i].update(point, false, null, false);\n                        }\n                    });\n                    // Don't add new points since those configs are used above\n                    pointsToAdd.length = 0;\n                    // Did not succeed in updating data\n                }\n                else {\n                    succeeded = false;\n                }\n                oldData.forEach(function (point) {\n                    if (point) {\n                        point.touched = false;\n                    }\n                });\n                if (!succeeded) {\n                    return false;\n                }\n                // Add new points\n                pointsToAdd.forEach(function (point) {\n                    this.addPoint(point, false, null, null, false);\n                }, this);\n                if (this.xIncrement === null &&\n                    this.xData &&\n                    this.xData.length) {\n                    this.xIncrement = arrayMax(this.xData);\n                    this.autoIncrement();\n                }\n                return true;\n            },\n            /**\n             * Apply a new set of data to the series and optionally redraw it. The\n             * new data array is passed by reference (except in case of\n             * `updatePoints`), and may later be mutated when updating the chart\n             * data.\n             *\n             * Note the difference in behaviour when setting the same amount of\n             * points, or a different amount of points, as handled by the\n             * `updatePoints` parameter.\n             *\n             * @sample highcharts/members/series-setdata/\n             *         Set new data from a button\n             * @sample highcharts/members/series-setdata-pie/\n             *         Set data in a pie\n             * @sample stock/members/series-setdata/\n             *         Set new data in Highstock\n             * @sample maps/members/series-setdata/\n             *         Set new data in Highmaps\n             *\n             * @function Highcharts.Series#setData\n             *\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Takes an array of data in the same format as described under\n             *        `series.{type}.data` for the given series type, for example a\n             *        line series would take data in the form described under\n             *        [series.line.data](https://api.highcharts.com/highcharts/series.line.data).\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the series is altered. If\n             *        doing more operations on the chart, it is a good idea to set\n             *        redraw to false and call {@link Chart#redraw} after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        When the updated data is the same length as the existing data,\n             *        points will be updated by default, and animation visualizes\n             *        how the points are changed. Set false to disable animation, or\n             *        a configuration object to set duration or easing.\n             *\n             * @param {boolean} [updatePoints=true]\n             *        When this is true, points will be updated instead of replaced\n             *        whenever possible. This occurs a) when the updated data is the\n             *        same length as the existing data, b) when points are matched\n             *        by their id's, or c) when points can be matched by X values.\n             *        This allows updating with animation and performs better. In\n             *        this case, the original array is not passed by reference. Set\n             *        `false` to prevent.\n             *\n             * @return {void}\n             */\n            setData: function (data, redraw, animation, updatePoints) {\n                var series = this,\n                    oldData = series.points,\n                    oldDataLength = (oldData && oldData.length) || 0,\n                    dataLength,\n                    options = series.options,\n                    chart = series.chart,\n                    dataSorting = options.dataSorting,\n                    firstPoint = null,\n                    xAxis = series.xAxis,\n                    i,\n                    turboThreshold = options.turboThreshold,\n                    pt,\n                    xData = this.xData,\n                    yData = this.yData,\n                    pointArrayMap = series.pointArrayMap,\n                    valueCount = pointArrayMap && pointArrayMap.length,\n                    keys = options.keys,\n                    indexOfX = 0,\n                    indexOfY = 1,\n                    updatedData;\n                data = data || [];\n                dataLength = data.length;\n                redraw = pick(redraw, true);\n                if (dataSorting && dataSorting.enabled) {\n                    data = this.sortData(data);\n                }\n                // First try to run Point.update which is cheaper, allows animation,\n                // and keeps references to points.\n                if (updatePoints !== false &&\n                    dataLength &&\n                    oldDataLength &&\n                    !series.cropped &&\n                    !series.hasGroupedData &&\n                    series.visible &&\n                    // Soft updating has no benefit in boost, and causes JS error\n                    // (#8355)\n                    !series.isSeriesBoosting) {\n                    updatedData = this.updateData(data, animation);\n                }\n                if (!updatedData) {\n                    // Reset properties\n                    series.xIncrement = null;\n                    series.colorCounter = 0; // for series with colorByPoint (#1547)\n                    // Update parallel arrays\n                    this.parallelArrays.forEach(function (key) {\n                        series[key + 'Data'].length = 0;\n                    });\n                    // In turbo mode, only one- or twodimensional arrays of numbers\n                    // are allowed. The first value is tested, and we assume that\n                    // all the rest are defined the same way. Although the 'for'\n                    // loops are similar, they are repeated inside each if-else\n                    // conditional for max performance.\n                    if (turboThreshold && dataLength > turboThreshold) {\n                        firstPoint = series.getFirstValidPoint(data);\n                        if (isNumber(firstPoint)) { // assume all points are numbers\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i];\n                            }\n                            // Assume all points are arrays when first point is\n                        }\n                        else if (isArray(firstPoint)) {\n                            if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] =\n                                        pt.slice(1, valueCount + 1);\n                                }\n                            }\n                            else { // [x, y]\n                                if (keys) {\n                                    indexOfX = keys.indexOf('x');\n                                    indexOfY = keys.indexOf('y');\n                                    indexOfX = indexOfX >= 0 ? indexOfX : 0;\n                                    indexOfY = indexOfY >= 0 ? indexOfY : 1;\n                                }\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[indexOfX];\n                                    yData[i] = pt[indexOfY];\n                                }\n                            }\n                        }\n                        else {\n                            // Highcharts expects configs to be numbers or arrays in\n                            // turbo mode\n                            error(12, false, chart);\n                        }\n                    }\n                    else {\n                        for (i = 0; i < dataLength; i++) {\n                            // stray commas in oldIE:\n                            if (typeof data[i] !== 'undefined') {\n                                pt = { series: series };\n                                series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\n                                series.updateParallelArrays(pt, i);\n                            }\n                        }\n                    }\n                    // Forgetting to cast strings to numbers is a common caveat when\n                    // handling CSV or JSON\n                    if (yData && isString(yData[0])) {\n                        error(14, true, chart);\n                    }\n                    series.data = [];\n                    series.options.data = series.userOptions.data = data;\n                    // destroy old points\n                    i = oldDataLength;\n                    while (i--) {\n                        if (oldData[i] && oldData[i].destroy) {\n                            oldData[i].destroy();\n                        }\n                    }\n                    // reset minRange (#878)\n                    if (xAxis) {\n                        xAxis.minRange = xAxis.userMinRange;\n                    }\n                    // redraw\n                    series.isDirty = chart.isDirtyBox = true;\n                    series.isDirtyData = !!oldData;\n                    animation = false;\n                }\n                // Typically for pie series, points need to be processed and\n                // generated prior to rendering the legend\n                if (options.legendType === 'point') {\n                    this.processData();\n                    this.generatePoints();\n                }\n                if (redraw) {\n                    chart.redraw(animation);\n                }\n            },\n            /**\n             * Internal function to sort series data\n             *\n             * @private\n             * @function Highcharts.Series#sortData\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Force data grouping.\n             * @return {Array<Highcharts.PointOptionsObject>}\n             */\n            sortData: function (data) {\n                var series = this,\n                    options = series.options,\n                    dataSorting = options.dataSorting,\n                    sortKey = dataSorting.sortKey || 'y',\n                    sortedData,\n                    getPointOptionsObject = function (series,\n                    pointOptions) {\n                        return (defined(pointOptions) &&\n                            series.pointClass.prototype.optionsToObject.call({\n                                series: series\n                            },\n                    pointOptions)) || {};\n                };\n                data.forEach(function (pointOptions, i) {\n                    data[i] = getPointOptionsObject(series, pointOptions);\n                    data[i].index = i;\n                }, this);\n                // Sorting\n                sortedData = data.concat().sort(function (a, b) {\n                    var aValue = getNestedProperty(sortKey,\n                        a);\n                    var bValue = getNestedProperty(sortKey,\n                        b);\n                    return bValue < aValue ? -1 : bValue > aValue ? 1 : 0;\n                });\n                // Set x value depending on the position in the array\n                sortedData.forEach(function (point, i) {\n                    point.x = i;\n                }, this);\n                // Set the same x for linked series points if they don't have their\n                // own sorting\n                if (series.linkedSeries) {\n                    series.linkedSeries.forEach(function (linkedSeries) {\n                        var options = linkedSeries.options,\n                            seriesData = options.data;\n                        if ((!options.dataSorting ||\n                            !options.dataSorting.enabled) &&\n                            seriesData) {\n                            seriesData.forEach(function (pointOptions, i) {\n                                seriesData[i] = getPointOptionsObject(linkedSeries, pointOptions);\n                                if (data[i]) {\n                                    seriesData[i].x = data[i].x;\n                                    seriesData[i].index = i;\n                                }\n                            });\n                            linkedSeries.setData(seriesData, false);\n                        }\n                    });\n                }\n                return data;\n            },\n            /**\n             * Internal function to process the data by cropping away unused data\n             * points if the series is longer than the crop threshold. This saves\n             * computing time for large series.\n             *\n             * @private\n             * @function Highcharts.Series#getProcessedData\n             * @param {boolean} [forceExtremesFromAll]\n             *        Force getting extremes of a total series data range.\n             * @return {Highcharts.SeriesProcessedDataObject}\n             */\n            getProcessedData: function (forceExtremesFromAll) {\n                var series = this, \n                    // copied during slice operation:\n                    processedXData = series.xData,\n                    processedYData = series.yData,\n                    dataLength = processedXData.length,\n                    croppedData,\n                    cropStart = 0,\n                    cropped,\n                    distance,\n                    closestPointRange,\n                    xAxis = series.xAxis,\n                    i, // loop variable\n                    options = series.options,\n                    cropThreshold = options.cropThreshold,\n                    getExtremesFromAll = forceExtremesFromAll ||\n                        series.getExtremesFromAll ||\n                        options.getExtremesFromAll, // #4599\n                    isCartesian = series.isCartesian,\n                    xExtremes,\n                    val2lin = xAxis && xAxis.val2lin,\n                    isLog = !!(xAxis && xAxis.logarithmic),\n                    throwOnUnsorted = series.requireSorting,\n                    min,\n                    max;\n                if (xAxis) {\n                    // corrected for log axis (#3053)\n                    xExtremes = xAxis.getExtremes();\n                    min = xExtremes.min;\n                    max = xExtremes.max;\n                }\n                // optionally filter out points outside the plot area\n                if (isCartesian &&\n                    series.sorted &&\n                    !getExtremesFromAll &&\n                    (!cropThreshold ||\n                        dataLength > cropThreshold ||\n                        series.forceCrop)) {\n                    // it's outside current extremes\n                    if (processedXData[dataLength - 1] < min ||\n                        processedXData[0] > max) {\n                        processedXData = [];\n                        processedYData = [];\n                        // only crop if it's actually spilling out\n                    }\n                    else if (series.yData && (processedXData[0] < min ||\n                        processedXData[dataLength - 1] > max)) {\n                        croppedData = this.cropData(series.xData, series.yData, min, max);\n                        processedXData = croppedData.xData;\n                        processedYData = croppedData.yData;\n                        cropStart = croppedData.start;\n                        cropped = true;\n                    }\n                }\n                // Find the closest distance between processed points\n                i = processedXData.length || 1;\n                while (--i) {\n                    distance = (isLog ?\n                        (val2lin(processedXData[i]) -\n                            val2lin(processedXData[i - 1])) :\n                        (processedXData[i] -\n                            processedXData[i - 1]));\n                    if (distance > 0 &&\n                        (typeof closestPointRange === 'undefined' ||\n                            distance < closestPointRange)) {\n                        closestPointRange = distance;\n                        // Unsorted data is not supported by the line tooltip, as well\n                        // as data grouping and navigation in Stock charts (#725) and\n                        // width calculation of columns (#1900)\n                    }\n                    else if (distance < 0 && throwOnUnsorted) {\n                        error(15, false, series.chart);\n                        throwOnUnsorted = false; // Only once\n                    }\n                }\n                return {\n                    xData: processedXData,\n                    yData: processedYData,\n                    cropped: cropped,\n                    cropStart: cropStart,\n                    closestPointRange: closestPointRange\n                };\n            },\n            /**\n             * Internal function to apply processed data.\n             * In Highstock, this function is extended to provide data grouping.\n             *\n             * @private\n             * @function Highcharts.Series#processData\n             * @param {boolean} [force]\n             *        Force data grouping.\n             * @return {boolean|undefined}\n             */\n            processData: function (force) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    processedData;\n                // If the series data or axes haven't changed, don't go through\n                // this. Return false to pass the message on to override methods\n                // like in data grouping.\n                if (series.isCartesian &&\n                    !series.isDirty &&\n                    !xAxis.isDirty &&\n                    !series.yAxis.isDirty &&\n                    !force) {\n                    return false;\n                }\n                processedData = series.getProcessedData();\n                // Record the properties\n                series.cropped = processedData.cropped; // undefined or true\n                series.cropStart = processedData.cropStart;\n                series.processedXData = processedData.xData;\n                series.processedYData = processedData.yData;\n                series.closestPointRange =\n                    series.basePointRange = processedData.closestPointRange;\n            },\n            /**\n             * Iterate over xData and crop values between min and max. Returns\n             * object containing crop start/end cropped xData with corresponding\n             * part of yData, dataMin and dataMax within the cropped range.\n             *\n             * @private\n             * @function Highcharts.Series#cropData\n             * @param {Array<number>} xData\n             * @param {Array<number>} yData\n             * @param {number} min\n             * @param {number} max\n             * @param {number} [cropShoulder]\n             * @return {Highcharts.SeriesCropDataObject}\n             */\n            cropData: function (xData, yData, min, max, cropShoulder) {\n                var dataLength = xData.length,\n                    cropStart = 0,\n                    cropEnd = dataLength,\n                    i,\n                    j;\n                // line-type series need one point outside\n                cropShoulder = pick(cropShoulder, this.cropShoulder);\n                // iterate up to find slice start\n                for (i = 0; i < dataLength; i++) {\n                    if (xData[i] >= min) {\n                        cropStart = Math.max(0, i - cropShoulder);\n                        break;\n                    }\n                }\n                // proceed to find slice end\n                for (j = i; j < dataLength; j++) {\n                    if (xData[j] > max) {\n                        cropEnd = j + cropShoulder;\n                        break;\n                    }\n                }\n                return {\n                    xData: xData.slice(cropStart, cropEnd),\n                    yData: yData.slice(cropStart, cropEnd),\n                    start: cropStart,\n                    end: cropEnd\n                };\n            },\n            /**\n             * Generate the data point after the data has been processed by cropping\n             * away unused points and optionally grouped in Highcharts Stock.\n             *\n             * @private\n             * @function Highcharts.Series#generatePoints\n             */\n            generatePoints: function () {\n                var series = this,\n                    options = series.options,\n                    dataOptions = options.data,\n                    data = series.data,\n                    dataLength,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    PointClass = series.pointClass,\n                    processedDataLength = processedXData.length,\n                    cropStart = series.cropStart || 0,\n                    cursor,\n                    hasGroupedData = series.hasGroupedData,\n                    keys = options.keys,\n                    point,\n                    points = [],\n                    i;\n                if (!data && !hasGroupedData) {\n                    var arr = [];\n                    arr.length = dataOptions.length;\n                    data = series.data = arr;\n                }\n                if (keys && hasGroupedData) {\n                    // grouped data has already applied keys (#6590)\n                    series.options.keys = false;\n                }\n                for (i = 0; i < processedDataLength; i++) {\n                    cursor = cropStart + i;\n                    if (!hasGroupedData) {\n                        point = data[cursor];\n                        // #970:\n                        if (!point &&\n                            typeof dataOptions[cursor] !== 'undefined') {\n                            data[cursor] = point = (new PointClass()).init(series, dataOptions[cursor], processedXData[i]);\n                        }\n                    }\n                    else {\n                        // splat the y data in case of ohlc data array\n                        point = (new PointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));\n                        /**\n                         * Highstock only. If a point object is created by data\n                         * grouping, it doesn't reflect actual points in the raw\n                         * data. In this case, the `dataGroup` property holds\n                         * information that points back to the raw data.\n                         *\n                         * - `dataGroup.start` is the index of the first raw data\n                         *   point in the group.\n                         *\n                         * - `dataGroup.length` is the amount of points in the\n                         *   group.\n                         *\n                         * @product highstock\n                         *\n                         * @name Highcharts.Point#dataGroup\n                         * @type {Highcharts.DataGroupingInfoObject|undefined}\n                         */\n                        point.dataGroup = series.groupMap[i];\n                        if (point.dataGroup.options) {\n                            point.options = point.dataGroup.options;\n                            extend(point, point.dataGroup.options);\n                            // Collision of props and options (#9770)\n                            delete point.dataLabels;\n                        }\n                    }\n                    if (point) { // #6279\n                        /**\n                         * Contains the point's index in the `Series.points` array.\n                         *\n                         * @name Highcharts.Point#index\n                         * @type {number}\n                         * @readonly\n                         */\n                        point.index = cursor; // For faster access in Point.update\n                        points[i] = point;\n                    }\n                }\n                // restore keys options (#6590)\n                series.options.keys = keys;\n                // Hide cropped-away points - this only runs when the number of\n                // points is above cropThreshold, or when swithching view from\n                // non-grouped data to grouped data (#637)\n                if (data &&\n                    (processedDataLength !== (dataLength = data.length) ||\n                        hasGroupedData)) {\n                    for (i = 0; i < dataLength; i++) {\n                        // when has grouped data, clear all points\n                        if (i === cropStart && !hasGroupedData) {\n                            i += processedDataLength;\n                        }\n                        if (data[i]) {\n                            data[i].destroyElements();\n                            data[i].plotX = void 0; // #1003\n                        }\n                    }\n                }\n                /**\n                 * Read only. An array containing those values converted to points.\n                 * In case the series data length exceeds the `cropThreshold`, or if\n                 * the data is grouped, `series.data` doesn't contain all the\n                 * points. Also, in case a series is hidden, the `data` array may be\n                 * empty. To access raw values, `series.options.data` will always be\n                 * up to date. `Series.data` only contains the points that have been\n                 * created on demand. To modify the data, use\n                 * {@link Highcharts.Series#setData} or\n                 * {@link Highcharts.Point#update}.\n                 *\n                 * @see Series.points\n                 *\n                 * @name Highcharts.Series#data\n                 * @type {Array<Highcharts.Point>}\n                 */\n                series.data = data;\n                /**\n                 * An array containing all currently visible point objects. In case\n                 * of cropping, the cropped-away points are not part of this array.\n                 * The `series.points` array starts at `series.cropStart` compared\n                 * to `series.data` and `series.options.data`. If however the series\n                 * data is grouped, these can't be correlated one to one. To modify\n                 * the data, use {@link Highcharts.Series#setData} or\n                 * {@link Highcharts.Point#update}.\n                 *\n                 * @name Highcharts.Series#points\n                 * @type {Array<Highcharts.Point>}\n                 */\n                series.points = points;\n                fireEvent(this, 'afterGeneratePoints');\n            },\n            /**\n             * Get current X extremes for the visible data.\n             *\n             * @private\n             * @function Highcharts.Series#getXExtremes\n             *\n             * @param {Array<number>} xData\n             *        The data to inspect. Defaults to the current data within the\n             *        visible range.\n             * @return {Highcharts.RangeObject}\n             */\n            getXExtremes: function (xData) {\n                return {\n                    min: arrayMin(xData),\n                    max: arrayMax(xData)\n                };\n            },\n            /**\n             * Calculate Y extremes for the visible data. The result is returned\n             * as an object with `dataMin` and `dataMax` properties.\n             *\n             * @private\n             * @function Highcharts.Series#getExtremes\n             * @param {Array<number>} [yData]\n             *        The data to inspect. Defaults to the current data within the\n             *        visible range.\n             * @param {boolean} [forceExtremesFromAll]\n             *        Force getting extremes of a total series data range.\n             * @return {Highcharts.DataExtremesObject}\n             */\n            getExtremes: function (yData, forceExtremesFromAll) {\n                var xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    xData = this.processedXData || this.xData,\n                    yDataLength,\n                    activeYData = [],\n                    activeCounter = 0, \n                    // #2117, need to compensate for log X axis\n                    xExtremes,\n                    xMin = 0,\n                    xMax = 0,\n                    validValue,\n                    withinRange, \n                    // Handle X outside the viewed area. This does not work with\n                    // non-sorted data like scatter (#7639).\n                    shoulder = this.requireSorting ? this.cropShoulder : 0,\n                    positiveValuesOnly = yAxis ? yAxis.positiveValuesOnly : false,\n                    x,\n                    y,\n                    i,\n                    j;\n                yData = yData || this.stackedYData || this.processedYData || [];\n                yDataLength = yData.length;\n                if (xAxis) {\n                    xExtremes = xAxis.getExtremes();\n                    xMin = xExtremes.min;\n                    xMax = xExtremes.max;\n                }\n                for (i = 0; i < yDataLength; i++) {\n                    x = xData[i];\n                    y = yData[i];\n                    // For points within the visible range, including the first\n                    // point outside the visible range (#7061), consider y extremes.\n                    validValue = ((isNumber(y) || isArray(y)) &&\n                        ((y.length || y > 0) || !positiveValuesOnly));\n                    withinRange = (forceExtremesFromAll ||\n                        this.getExtremesFromAll ||\n                        this.options.getExtremesFromAll ||\n                        this.cropped ||\n                        !xAxis || // for colorAxis support\n                        ((xData[i + shoulder] || x) >= xMin &&\n                            (xData[i - shoulder] || x) <= xMax));\n                    if (validValue && withinRange) {\n                        j = y.length;\n                        if (j) { // array, like ohlc or range data\n                            while (j--) {\n                                if (isNumber(y[j])) { // #7380, #11513\n                                    activeYData[activeCounter++] = y[j];\n                                }\n                            }\n                        }\n                        else {\n                            activeYData[activeCounter++] = y;\n                        }\n                    }\n                }\n                var dataExtremes = {\n                        dataMin: arrayMin(activeYData),\n                        dataMax: arrayMax(activeYData)\n                    };\n                fireEvent(this, 'afterGetExtremes', { dataExtremes: dataExtremes });\n                return dataExtremes;\n            },\n            /**\n             * Set the current data extremes as `dataMin` and `dataMax` on the\n             * Series item. Use this only when the series properties should be\n             * updated.\n             *\n             * @private\n             * @function Highcharts.Series#applyExtremes\n             * @return {void}\n             */\n            applyExtremes: function () {\n                var dataExtremes = this.getExtremes();\n                /**\n                 * Contains the minimum value of the series' data point.\n                 * @name Highcharts.Series#dataMin\n                 * @type {number}\n                 * @readonly\n                 */\n                this.dataMin = dataExtremes.dataMin;\n                /* *\n                 * Contains the maximum value of the series' data point.\n                 * @name Highcharts.Series#dataMax\n                 * @type {number}\n                 * @readonly\n                 */\n                this.dataMax = dataExtremes.dataMax;\n                return dataExtremes;\n            },\n            /**\n             * Find and return the first non null point in the data\n             *\n             * @private\n             * @function Highcharts.Series.getFirstValidPoint\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Array of options for points\n             *\n             * @return {Highcharts.PointOptionsType}\n             */\n            getFirstValidPoint: function (data) {\n                var firstPoint = null,\n                    dataLength = data.length,\n                    i = 0;\n                while (firstPoint === null && i < dataLength) {\n                    firstPoint = data[i];\n                    i++;\n                }\n                return firstPoint;\n            },\n            /**\n             * Translate data points from raw data values to chart specific\n             * positioning data needed later in the `drawPoints` and `drawGraph`\n             * functions. This function can be overridden in plugins and custom\n             * series type implementations.\n             *\n             * @function Highcharts.Series#translate\n             * @return {void}\n             * @fires Highcharts.Series#events:translate\n             */\n            translate: function () {\n                if (!this.processedXData) { // hidden series\n                    this.processData();\n                }\n                this.generatePoints();\n                var series = this,\n                    options = series.options,\n                    stacking = options.stacking,\n                    xAxis = series.xAxis,\n                    categories = xAxis.categories,\n                    enabledDataSorting = series.enabledDataSorting,\n                    yAxis = series.yAxis,\n                    points = series.points,\n                    dataLength = points.length,\n                    hasModifyValue = !!series.modifyValue,\n                    i,\n                    pointPlacement = series.pointPlacementToXValue(), // #7860\n                    dynamicallyPlaced = Boolean(pointPlacement),\n                    threshold = options.threshold,\n                    stackThreshold = options.startFromThreshold ? threshold : 0,\n                    plotX,\n                    lastPlotX,\n                    stackIndicator,\n                    zoneAxis = this.zoneAxis || 'y',\n                    closestPointRangePx = Number.MAX_VALUE;\n                /**\n                 * Plotted coordinates need to be within a limited range. Drawing\n                 * too far outside the viewport causes various rendering issues\n                 * (#3201, #3923, #7555).\n                 * @private\n                 */\n                function limitedRange(val) {\n                    return clamp(val, -1e5, 1e5);\n                }\n                // Translate each point\n                for (i = 0; i < dataLength; i++) {\n                    var point = points[i],\n                        xValue = point.x,\n                        yValue = point.y,\n                        yBottom = point.low,\n                        stack = stacking && yAxis.stacking && yAxis.stacking.stacks[(series.negStacks &&\n                            yValue <\n                                (stackThreshold ? 0 : threshold) ?\n                            '-' :\n                            '') + series.stackKey],\n                        pointStack,\n                        stackValues;\n                    // Discard disallowed y values for log axes (#3434)\n                    if (yAxis.positiveValuesOnly &&\n                        yValue !== null &&\n                        yValue <= 0) {\n                        point.isNull = true;\n                    }\n                    // Get the plotX translation\n                    point.plotX = plotX = correctFloat(// #5236\n                    limitedRange(xAxis.translate(// #3923\n                    xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags')) // #3923\n                    );\n                    // Calculate the bottom y value for stacked series\n                    if (stacking &&\n                        series.visible &&\n                        stack &&\n                        stack[xValue]) {\n                        stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n                        if (!point.isNull) {\n                            pointStack = stack[xValue];\n                            stackValues =\n                                pointStack.points[stackIndicator.key];\n                        }\n                    }\n                    if (isArray(stackValues)) {\n                        yBottom = stackValues[0];\n                        yValue = stackValues[1];\n                        if (yBottom === stackThreshold &&\n                            stackIndicator.key ===\n                                stack[xValue].base) {\n                            yBottom = pick((isNumber(threshold) && threshold), yAxis.min);\n                        }\n                        // #1200, #1232\n                        if (yAxis.positiveValuesOnly && yBottom <= 0) {\n                            yBottom = null;\n                        }\n                        point.total = point.stackTotal = pointStack.total;\n                        point.percentage =\n                            pointStack.total &&\n                                (point.y / pointStack.total * 100);\n                        point.stackY = yValue;\n                        // Place the stack label\n                        // in case of variwide series (where widths of points are\n                        // different in most cases), stack labels are positioned\n                        // wrongly, so the call of the setOffset is omited here and\n                        // labels are correctly positioned later, at the end of the\n                        // variwide's translate function (#10962)\n                        if (!series.irregularWidths) {\n                            pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);\n                        }\n                    }\n                    // Set translated yBottom or remove it\n                    point.yBottom = defined(yBottom) ?\n                        limitedRange(yAxis.translate(yBottom, 0, 1, 0, 1)) :\n                        null;\n                    // general hook, used for Highstock compare mode\n                    if (hasModifyValue) {\n                        yValue = series.modifyValue(yValue, point);\n                    }\n                    // Set the the plotY value, reset it for redraws\n                    // #3201\n                    point.plotY = ((typeof yValue === 'number' && yValue !== Infinity) ?\n                        limitedRange(yAxis.translate(yValue, 0, 1, 0, 1)) :\n                        void 0);\n                    point.isInside = this.isPointInside(point);\n                    // Set client related positions for mouse tracking\n                    point.clientX = dynamicallyPlaced ?\n                        correctFloat(xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement)) :\n                        plotX; // #1514, #5383, #5518\n                    // Negative points. For bubble charts, this means negative z\n                    // values (#9728)\n                    point.negative = point[zoneAxis] < (options[zoneAxis + 'Threshold'] ||\n                        threshold ||\n                        0);\n                    // some API data\n                    point.category = (categories &&\n                        typeof categories[point.x] !== 'undefined' ?\n                        categories[point.x] :\n                        point.x);\n                    // Determine auto enabling of markers (#3635, #5099)\n                    if (!point.isNull && point.visible !== false) {\n                        if (typeof lastPlotX !== 'undefined') {\n                            closestPointRangePx = Math.min(closestPointRangePx, Math.abs(plotX - lastPlotX));\n                        }\n                        lastPlotX = plotX;\n                    }\n                    // Find point zone\n                    point.zone = (this.zones.length && point.getZone());\n                    // Animate new points with data sorting\n                    if (!point.graphic && series.group && enabledDataSorting) {\n                        point.isNew = true;\n                    }\n                }\n                series.closestPointRangePx = closestPointRangePx;\n                fireEvent(this, 'afterTranslate');\n            },\n            /**\n             * Return the series points with null points filtered out.\n             *\n             * @function Highcharts.Series#getValidPoints\n             *\n             * @param {Array<Highcharts.Point>} [points]\n             *        The points to inspect, defaults to {@link Series.points}.\n             *\n             * @param {boolean} [insideOnly=false]\n             *        Whether to inspect only the points that are inside the visible\n             *        view.\n             *\n             * @param {boolean} [allowNull=false]\n             *        Whether to allow null points to pass as valid points.\n             *\n             * @return {Array<Highcharts.Point>}\n             *         The valid points.\n             */\n            getValidPoints: function (points, insideOnly, allowNull) {\n                var chart = this.chart;\n                // #3916, #5029, #5085\n                return (points || this.points || []).filter(function isValidPoint(point) {\n                    if (insideOnly && !chart.isInsidePlot(point.plotX, point.plotY, chart.inverted)) {\n                        return false;\n                    }\n                    return point.visible !== false &&\n                        (allowNull || !point.isNull);\n                });\n            },\n            /**\n             * Get the clipping for the series. Could be called for a series to\n             * initiate animating the clip or to set the final clip (only width\n             * and x).\n             *\n             * @private\n             * @function Highcharts.Series#getClip\n             * @param  {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *         Initialize the animation.\n             * @param  {boolean} [finalBox]\n             *         Final size for the clip - end state for the animation.\n             * @return {Highcharts.Dictionary<number>}\n             */\n            getClipBox: function (animation, finalBox) {\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    inverted = chart.inverted,\n                    xAxis = series.xAxis,\n                    yAxis = xAxis && series.yAxis,\n                    clipBox,\n                    scrollablePlotAreaOptions = chart.options.chart.scrollablePlotArea || {};\n                if (animation && options.clip === false && yAxis) {\n                    // support for not clipped series animation (#10450)\n                    clipBox = inverted ? {\n                        y: -chart.chartWidth + yAxis.len + yAxis.pos,\n                        height: chart.chartWidth,\n                        width: chart.chartHeight,\n                        x: -chart.chartHeight + xAxis.len + xAxis.pos\n                    } : {\n                        y: -yAxis.pos,\n                        height: chart.chartHeight,\n                        width: chart.chartWidth,\n                        x: -xAxis.pos\n                    };\n                    // x and width will be changed later when setting for animation\n                    // initial state in Series.setClip\n                }\n                else {\n                    clipBox = series.clipBox || chart.clipBox;\n                    if (finalBox) {\n                        clipBox.width = chart.plotSizeX;\n                        clipBox.x = (chart.scrollablePixelsX || 0) *\n                            (scrollablePlotAreaOptions.scrollPositionX || 0);\n                    }\n                }\n                return !finalBox ? clipBox : {\n                    width: clipBox.width,\n                    x: clipBox.x\n                };\n            },\n            /**\n             * Set the clipping for the series. For animated series it is called\n             * twice, first to initiate animating the clip then the second time\n             * without the animation to set the final clip.\n             *\n             * @private\n             * @function Highcharts.Series#setClip\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             */\n            setClip: function (animation) {\n                var chart = this.chart, options = this.options, renderer = chart.renderer, inverted = chart.inverted, seriesClipBox = this.clipBox, clipBox = this.getClipBox(animation), sharedClipKey = this.sharedClipKey ||\n                        [\n                            '_sharedClip',\n                            animation && animation.duration,\n                            animation && animation.easing,\n                            clipBox.height,\n                            options.xAxis,\n                            options.yAxis\n                        ].join(','), // #4526\n                    clipRect = chart[sharedClipKey], markerClipRect = chart[sharedClipKey + 'm'];\n                if (animation) {\n                    clipBox.width = 0;\n                    if (inverted) {\n                        clipBox.x = chart.plotHeight +\n                            (options.clip !== false ? 0 : chart.plotTop);\n                    }\n                }\n                // If a clipping rectangle with the same properties is currently\n                // present in the chart, use that.\n                if (!clipRect) {\n                    // When animation is set, prepare the initial positions\n                    if (animation) {\n                        chart[sharedClipKey + 'm'] = markerClipRect =\n                            renderer.clipRect(\n                            // include the width of the first marker\n                            inverted ? chart.plotSizeX + 99 : -99, inverted ? -chart.plotLeft : -chart.plotTop, 99, inverted ? chart.chartWidth : chart.chartHeight);\n                    }\n                    chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n                    // Create hashmap for series indexes\n                    clipRect.count = { length: 0 };\n                    // When the series is rendered again before starting animating, in\n                    // compliance to a responsive rule\n                }\n                else if (!chart.hasLoaded) {\n                    clipRect.attr(clipBox);\n                }\n                if (animation) {\n                    if (!clipRect.count[this.index]) {\n                        clipRect.count[this.index] = true;\n                        clipRect.count.length += 1;\n                    }\n                }\n                if (options.clip !== false || animation) {\n                    this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n                    this.markerGroup.clip(markerClipRect);\n                    this.sharedClipKey = sharedClipKey;\n                }\n                // Remove the shared clipping rectangle when all series are shown\n                if (!animation) {\n                    if (clipRect.count[this.index]) {\n                        delete clipRect.count[this.index];\n                        clipRect.count.length -= 1;\n                    }\n                    if (clipRect.count.length === 0 &&\n                        sharedClipKey &&\n                        chart[sharedClipKey]) {\n                        if (!seriesClipBox) {\n                            chart[sharedClipKey] =\n                                chart[sharedClipKey].destroy();\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'] =\n                                chart[sharedClipKey + 'm'].destroy();\n                        }\n                    }\n                }\n            },\n            /**\n             * Animate in the series. Called internally twice. First with the `init`\n             * parameter set to true, which sets up the initial state of the\n             * animation. Then when ready, it is called with the `init` parameter\n             * undefined, in order to perform the actual animation. After the\n             * second run, the function is removed.\n             *\n             * @function Highcharts.Series#animate\n             *\n             * @param {boolean} [init]\n             *        Initialize the animation.\n             */\n            animate: function (init) {\n                var series = this,\n                    chart = series.chart,\n                    animation = animObject(series.options.animation),\n                    clipRect,\n                    sharedClipKey,\n                    finalBox;\n                // Initialize the animation. Set up the clipping rectangle.\n                if (!chart.hasRendered) {\n                    if (init) {\n                        series.setClip(animation);\n                        // Run the animation\n                    }\n                    else {\n                        sharedClipKey = this.sharedClipKey;\n                        clipRect = chart[sharedClipKey];\n                        finalBox = series.getClipBox(animation, true);\n                        if (clipRect) {\n                            clipRect.animate(finalBox, animation);\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'].animate({\n                                width: finalBox.width + 99,\n                                x: finalBox.x - (chart.inverted ? 0 : 99)\n                            }, animation);\n                        }\n                    }\n                }\n            },\n            /**\n             * This runs after animation to land on the final plot clipping.\n             *\n             * @private\n             * @function Highcharts.Series#afterAnimate\n             * @fires Highcharts.Series#event:afterAnimate\n             */\n            afterAnimate: function () {\n                this.setClip();\n                fireEvent(this, 'afterAnimate');\n                this.finishedAnimating = true;\n            },\n            /**\n             * Draw the markers for line-like series types, and columns or other\n             * graphical representation for {@link Point} objects for other series\n             * types. The resulting element is typically stored as\n             * {@link Point.graphic}, and is created on the first call and updated\n             * and moved on subsequent calls.\n             *\n             * @function Highcharts.Series#drawPoints\n             */\n            drawPoints: function () {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    i,\n                    point,\n                    graphic,\n                    verb,\n                    options = series.options,\n                    seriesMarkerOptions = options.marker,\n                    pointMarkerOptions,\n                    hasPointMarker,\n                    markerGroup = (series[series.specialGroup] ||\n                        series.markerGroup),\n                    xAxis = series.xAxis,\n                    markerAttribs,\n                    globallyEnabled = pick(seriesMarkerOptions.enabled, !xAxis || xAxis.isRadial ? true : null, \n                    // Use larger or equal as radius is null in bubbles (#6321)\n                    series.closestPointRangePx >= (seriesMarkerOptions.enabledThreshold *\n                        seriesMarkerOptions.radius));\n                if (seriesMarkerOptions.enabled !== false ||\n                    series._hasPointMarkers) {\n                    for (i = 0; i < points.length; i++) {\n                        point = points[i];\n                        graphic = point.graphic;\n                        verb = graphic ? 'animate' : 'attr';\n                        pointMarkerOptions = point.marker || {};\n                        hasPointMarker = !!point.marker;\n                        var shouldDrawMarker = ((globallyEnabled &&\n                                typeof pointMarkerOptions.enabled === 'undefined') || pointMarkerOptions.enabled) && !point.isNull && point.visible !== false;\n                        // only draw the point if y is defined\n                        if (shouldDrawMarker) {\n                            // Shortcuts\n                            var symbol = pick(pointMarkerOptions.symbol,\n                                series.symbol);\n                            markerAttribs = series.markerAttribs(point, (point.selected && 'select'));\n                            // Set starting position for point sliding animation.\n                            if (series.enabledDataSorting) {\n                                point.startXPos = xAxis.reversed ?\n                                    -markerAttribs.width :\n                                    xAxis.width;\n                            }\n                            var isInside = point.isInside !== false;\n                            if (graphic) { // update\n                                // Since the marker group isn't clipped, each\n                                // individual marker must be toggled\n                                graphic[isInside ? 'show' : 'hide'](isInside)\n                                    .animate(markerAttribs);\n                            }\n                            else if (isInside &&\n                                (markerAttribs.width > 0 || point.hasImage)) {\n                                /**\n                                 * The graphic representation of the point.\n                                 * Typically this is a simple shape, like a `rect`\n                                 * for column charts or `path` for line markers, but\n                                 * for some complex series types like boxplot or 3D\n                                 * charts, the graphic may be a `g` element\n                                 * containing other shapes. The graphic is generated\n                                 * the first time {@link Series#drawPoints} runs,\n                                 * and updated and moved on subsequent runs.\n                                 *\n                                 * @name Point#graphic\n                                 * @type {SVGElement}\n                                 */\n                                point.graphic = graphic = chart.renderer\n                                    .symbol(symbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, hasPointMarker ?\n                                    pointMarkerOptions :\n                                    seriesMarkerOptions)\n                                    .add(markerGroup);\n                                // Sliding animation for new points\n                                if (series.enabledDataSorting &&\n                                    chart.hasRendered) {\n                                    graphic.attr({\n                                        x: point.startXPos\n                                    });\n                                    verb = 'animate';\n                                }\n                            }\n                            if (graphic && verb === 'animate') { // update\n                                // Since the marker group isn't clipped, each\n                                // individual marker must be toggled\n                                graphic[isInside ? 'show' : 'hide'](isInside)\n                                    .animate(markerAttribs);\n                            }\n                            // Presentational attributes\n                            if (graphic && !chart.styledMode) {\n                                graphic[verb](series.pointAttribs(point, (point.selected && 'select')));\n                            }\n                            if (graphic) {\n                                graphic.addClass(point.getClassName(), true);\n                            }\n                        }\n                        else if (graphic) {\n                            point.graphic = graphic.destroy(); // #1269\n                        }\n                    }\n                }\n            },\n            /**\n             * Get non-presentational attributes for a point. Used internally for\n             * both styled mode and classic. Can be overridden for different series\n             * types.\n             *\n             * @see Series#pointAttribs\n             *\n             * @function Highcharts.Series#markerAttribs\n             *\n             * @param {Highcharts.Point} point\n             *        The Point to inspect.\n             *\n             * @param {string} [state]\n             *        The state, can be either `hover`, `select` or undefined.\n             *\n             * @return {Highcharts.SVGAttributes}\n             *         A hash containing those attributes that are not settable from\n             *         CSS.\n             */\n            markerAttribs: function (point, state) {\n                var seriesOptions = this.options,\n                    seriesMarkerOptions = seriesOptions.marker,\n                    seriesStateOptions,\n                    pointMarkerOptions = point.marker || {},\n                    symbol = (pointMarkerOptions.symbol ||\n                        seriesMarkerOptions.symbol),\n                    pointStateOptions,\n                    radius = pick(pointMarkerOptions.radius,\n                    seriesMarkerOptions.radius),\n                    attribs;\n                // Handle hover and select states\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state];\n                    radius = pick(pointStateOptions && pointStateOptions.radius, seriesStateOptions && seriesStateOptions.radius, radius + (seriesStateOptions && seriesStateOptions.radiusPlus ||\n                        0));\n                }\n                point.hasImage = symbol && symbol.indexOf('url') === 0;\n                if (point.hasImage) {\n                    radius = 0; // and subsequently width and height is not set\n                }\n                attribs = {\n                    // Math.floor for #1843:\n                    x: seriesOptions.crisp ?\n                        Math.floor(point.plotX) - radius :\n                        point.plotX - radius,\n                    y: point.plotY - radius\n                };\n                if (radius) {\n                    attribs.width = attribs.height = 2 * radius;\n                }\n                return attribs;\n            },\n            /**\n             * Internal function to get presentational attributes for each point.\n             * Unlike {@link Series#markerAttribs}, this function should return\n             * those attributes that can also be set in CSS. In styled mode,\n             * `pointAttribs` won't be called.\n             *\n             * @private\n             * @function Highcharts.Series#pointAttribs\n             *\n             * @param {Highcharts.Point} [point]\n             *        The point instance to inspect.\n             *\n             * @param {string} [state]\n             *        The point state, can be either `hover`, `select` or 'normal'.\n             *        If undefined, normal state is assumed.\n             *\n             * @return {Highcharts.SVGAttributes}\n             *         The presentational attributes to be set on the point.\n             */\n            pointAttribs: function (point, state) {\n                var seriesMarkerOptions = this.options.marker,\n                    seriesStateOptions,\n                    pointOptions = point && point.options,\n                    pointMarkerOptions = ((pointOptions && pointOptions.marker) || {}),\n                    pointStateOptions,\n                    color = this.color,\n                    pointColorOption = pointOptions && pointOptions.color,\n                    pointColor = point && point.color,\n                    strokeWidth = pick(pointMarkerOptions.lineWidth,\n                    seriesMarkerOptions.lineWidth),\n                    zoneColor = point && point.zone && point.zone.color,\n                    fill,\n                    stroke,\n                    opacity = 1;\n                color = (pointColorOption ||\n                    zoneColor ||\n                    pointColor ||\n                    color);\n                fill = (pointMarkerOptions.fillColor ||\n                    seriesMarkerOptions.fillColor ||\n                    color);\n                stroke = (pointMarkerOptions.lineColor ||\n                    seriesMarkerOptions.lineColor ||\n                    color);\n                // Handle hover and select states\n                state = state || 'normal';\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = (pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state]) || {};\n                    strokeWidth = pick(pointStateOptions.lineWidth, seriesStateOptions.lineWidth, strokeWidth + pick(pointStateOptions.lineWidthPlus, seriesStateOptions.lineWidthPlus, 0));\n                    fill = (pointStateOptions.fillColor ||\n                        seriesStateOptions.fillColor ||\n                        fill);\n                    stroke = (pointStateOptions.lineColor ||\n                        seriesStateOptions.lineColor ||\n                        stroke);\n                    opacity = pick(pointStateOptions.opacity, seriesStateOptions.opacity, opacity);\n                }\n                return {\n                    'stroke': stroke,\n                    'stroke-width': strokeWidth,\n                    'fill': fill,\n                    'opacity': opacity\n                };\n            },\n            /**\n             * Clear DOM objects and free up memory.\n             *\n             * @private\n             * @function Highcharts.Series#destroy\n             * @param {boolean} [keepEventsForUpdate]\n             * @return {void}\n             * @fires Highcharts.Series#event:destroy\n             */\n            destroy: function (keepEventsForUpdate) {\n                var series = this,\n                    chart = series.chart,\n                    issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent),\n                    destroy,\n                    i,\n                    data = series.data || [],\n                    point,\n                    axis;\n                // add event hook\n                fireEvent(series, 'destroy');\n                // remove events\n                this.removeEvents(keepEventsForUpdate);\n                // erase from axes\n                (series.axisTypes || []).forEach(function (AXIS) {\n                    axis = series[AXIS];\n                    if (axis && axis.series) {\n                        erase(axis.series, series);\n                        axis.isDirty = axis.forceRedraw = true;\n                    }\n                });\n                // remove legend items\n                if (series.legendItem) {\n                    series.chart.legend.destroyItem(series);\n                }\n                // destroy all points with their elements\n                i = data.length;\n                while (i--) {\n                    point = data[i];\n                    if (point && point.destroy) {\n                        point.destroy();\n                    }\n                }\n                series.points = null;\n                // Clear the animation timeout if we are destroying the series\n                // during initial animation\n                U.clearTimeout(series.animationTimeout);\n                // Destroy all SVGElements associated to the series\n                objectEach(series, function (val, prop) {\n                    // Survive provides a hook for not destroying\n                    if (val instanceof SVGElement && !val.survive) {\n                        // issue 134 workaround\n                        destroy = issue134 && prop === 'group' ?\n                            'hide' :\n                            'destroy';\n                        val[destroy]();\n                    }\n                });\n                // remove from hoverSeries\n                if (chart.hoverSeries === series) {\n                    chart.hoverSeries = null;\n                }\n                erase(chart.series, series);\n                chart.orderSeries();\n                // clear all members\n                objectEach(series, function (val, prop) {\n                    if (!keepEventsForUpdate || prop !== 'hcEvents') {\n                        delete series[prop];\n                    }\n                });\n            },\n            /**\n             * Get the graph path.\n             *\n             * @private\n             * @function Highcharts.Series#getGraphPath\n             * @param {Array<Highcharts.Point>} points\n             * @param {boolean} [nullsAsZeroes]\n             * @param {boolean} [connectCliffs]\n             * @return {Highcharts.SVGPathArray}\n             */\n            getGraphPath: function (points, nullsAsZeroes, connectCliffs) {\n                var series = this,\n                    options = series.options,\n                    step = options.step,\n                    reversed,\n                    graphPath = [],\n                    xMap = [],\n                    gap;\n                points = points || series.points;\n                // Bottom of a stack is reversed\n                reversed = points.reversed;\n                if (reversed) {\n                    points.reverse();\n                }\n                // Reverse the steps (#5004)\n                step = {\n                    right: 1,\n                    center: 2\n                }[step] || (step && 3);\n                if (step && reversed) {\n                    step = 4 - step;\n                }\n                // Remove invalid points, especially in spline (#5015)\n                points = this.getValidPoints(points, false, !(options.connectNulls && !nullsAsZeroes && !connectCliffs));\n                // Build the line\n                points.forEach(function (point, i) {\n                    var plotX = point.plotX,\n                        plotY = point.plotY,\n                        lastPoint = points[i - 1], \n                        // the path to this point from the previous\n                        pathToPoint;\n                    if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) &&\n                        !connectCliffs) {\n                        gap = true; // ... and continue\n                    }\n                    // Line series, nullsAsZeroes is not handled\n                    if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n                        gap = !options.connectNulls;\n                        // Area series, nullsAsZeroes is set\n                    }\n                    else if (point.isNull && !nullsAsZeroes) {\n                        gap = true;\n                    }\n                    else {\n                        if (i === 0 || gap) {\n                            pathToPoint = [[\n                                    'M',\n                                    point.plotX,\n                                    point.plotY\n                                ]];\n                            // Generate the spline as defined in the SplineSeries object\n                        }\n                        else if (series.getPointSpline) {\n                            pathToPoint = [series.getPointSpline(points, point, i)];\n                        }\n                        else if (step) {\n                            if (step === 1) { // right\n                                pathToPoint = [[\n                                        'L',\n                                        lastPoint.plotX,\n                                        plotY\n                                    ]];\n                            }\n                            else if (step === 2) { // center\n                                pathToPoint = [[\n                                        'L',\n                                        (lastPoint.plotX + plotX) / 2,\n                                        lastPoint.plotY\n                                    ], [\n                                        'L',\n                                        (lastPoint.plotX + plotX) / 2,\n                                        plotY\n                                    ]];\n                            }\n                            else {\n                                pathToPoint = [[\n                                        'L',\n                                        plotX,\n                                        lastPoint.plotY\n                                    ]];\n                            }\n                            pathToPoint.push([\n                                'L',\n                                plotX,\n                                plotY\n                            ]);\n                        }\n                        else {\n                            // normal line to next point\n                            pathToPoint = [[\n                                    'L',\n                                    plotX,\n                                    plotY\n                                ]];\n                        }\n                        // Prepare for animation. When step is enabled, there are\n                        // two path nodes for each x value.\n                        xMap.push(point.x);\n                        if (step) {\n                            xMap.push(point.x);\n                            if (step === 2) { // step = center (#8073)\n                                xMap.push(point.x);\n                            }\n                        }\n                        graphPath.push.apply(graphPath, pathToPoint);\n                        gap = false;\n                    }\n                });\n                graphPath.xMap = xMap;\n                series.graphPath = graphPath;\n                return graphPath;\n            },\n            /**\n             * Draw the graph. Called internally when rendering line-like series\n             * types. The first time it generates the `series.graph` item and\n             * optionally other series-wide items like `series.area` for area\n             * charts. On subsequent calls these items are updated with new\n             * positions and attributes.\n             *\n             * @function Highcharts.Series#drawGraph\n             */\n            drawGraph: function () {\n                var series = this,\n                    options = this.options,\n                    graphPath = (this.gappedPath || this.getGraphPath).call(this),\n                    styledMode = this.chart.styledMode,\n                    props = [[\n                            'graph',\n                            'highcharts-graph'\n                        ]];\n                // Presentational properties\n                if (!styledMode) {\n                    props[0].push((options.lineColor ||\n                        this.color ||\n                        '#cccccc' // when colorByPoint = true\n                    ), options.dashStyle);\n                }\n                props = series.getZonesGraphs(props);\n                // Draw the graph\n                props.forEach(function (prop, i) {\n                    var graphKey = prop[0],\n                        graph = series[graphKey],\n                        verb = graph ? 'animate' : 'attr',\n                        attribs;\n                    if (graph) {\n                        graph.endX = series.preventGraphAnimation ?\n                            null :\n                            graphPath.xMap;\n                        graph.animate({ d: graphPath });\n                    }\n                    else if (graphPath.length) { // #1487\n                        /**\n                         * SVG element of area-based charts. Can be used for styling\n                         * purposes. If zones are configured, this element will be\n                         * hidden and replaced by multiple zone areas, accessible\n                         * via `series['zone-area-x']` (where x is a number,\n                         * starting with 0).\n                         *\n                         * @name Highcharts.Series#area\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        /**\n                         * SVG element of line-based charts. Can be used for styling\n                         * purposes. If zones are configured, this element will be\n                         * hidden and replaced by multiple zone lines, accessible\n                         * via `series['zone-graph-x']` (where x is a number,\n                         * starting with 0).\n                         *\n                         * @name Highcharts.Series#graph\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        series[graphKey] = graph = series.chart.renderer\n                            .path(graphPath)\n                            .addClass(prop[1])\n                            .attr({ zIndex: 1 }) // #1069\n                            .add(series.group);\n                    }\n                    if (graph && !styledMode) {\n                        attribs = {\n                            'stroke': prop[2],\n                            'stroke-width': options.lineWidth,\n                            // Polygon series use filled graph\n                            'fill': (series.fillGraph && series.color) || 'none'\n                        };\n                        if (prop[3]) {\n                            attribs.dashstyle = prop[3];\n                        }\n                        else if (options.linecap !== 'square') {\n                            attribs['stroke-linecap'] =\n                                attribs['stroke-linejoin'] = 'round';\n                        }\n                        graph[verb](attribs)\n                            // Add shadow to normal series (0) or to first\n                            // zone (1) #3932\n                            .shadow((i < 2) && options.shadow);\n                    }\n                    // Helpers for animation\n                    if (graph) {\n                        graph.startX = graphPath.xMap;\n                        graph.isArea = graphPath.isArea; // For arearange animation\n                    }\n                });\n            },\n            /**\n             * Get zones properties for building graphs. Extendable by series with\n             * multiple lines within one series.\n             *\n             * @private\n             * @function Highcharts.Series#getZonesGraphs\n             *\n             * @param {Array<Array<string>>} props\n             *\n             * @return {Array<Array<string>>}\n             */\n            getZonesGraphs: function (props) {\n                // Add the zone properties if any\n                this.zones.forEach(function (zone, i) {\n                    var propset = [\n                            'zone-graph-' + i,\n                            'highcharts-graph highcharts-zone-graph-' + i + ' ' +\n                                (zone.className || '')\n                        ];\n                    if (!this.chart.styledMode) {\n                        propset.push((zone.color || this.color), (zone.dashStyle || this.options.dashStyle));\n                    }\n                    props.push(propset);\n                }, this);\n                return props;\n            },\n            /**\n             * Clip the graphs into zones for colors and styling.\n             *\n             * @private\n             * @function Highcharts.Series#applyZones\n             * @return {void}\n             */\n            applyZones: function () {\n                var series = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    zones = this.zones,\n                    translatedFrom,\n                    translatedTo,\n                    clips = (this.clips || []),\n                    clipAttr,\n                    graph = this.graph,\n                    area = this.area,\n                    chartSizeMax = Math.max(chart.chartWidth,\n                    chart.chartHeight),\n                    axis = this[(this.zoneAxis || 'y') + 'Axis'],\n                    extremes,\n                    reversed,\n                    inverted = chart.inverted,\n                    horiz,\n                    pxRange,\n                    pxPosMin,\n                    pxPosMax,\n                    ignoreZones = false,\n                    zoneArea,\n                    zoneGraph;\n                if (zones.length &&\n                    (graph || area) &&\n                    axis &&\n                    typeof axis.min !== 'undefined') {\n                    reversed = axis.reversed;\n                    horiz = axis.horiz;\n                    // The use of the Color Threshold assumes there are no gaps\n                    // so it is safe to hide the original graph and area\n                    // unless it is not waterfall series, then use showLine property\n                    // to set lines between columns to be visible (#7862)\n                    if (graph && !this.showLine) {\n                        graph.hide();\n                    }\n                    if (area) {\n                        area.hide();\n                    }\n                    // Create the clips\n                    extremes = axis.getExtremes();\n                    zones.forEach(function (threshold, i) {\n                        translatedFrom = reversed ?\n                            (horiz ? chart.plotWidth : 0) :\n                            (horiz ? 0 : (axis.toPixels(extremes.min) || 0));\n                        translatedFrom = clamp(pick(translatedTo, translatedFrom), 0, chartSizeMax);\n                        translatedTo = clamp(Math.round(axis.toPixels(pick(threshold.value, extremes.max), true) || 0), 0, chartSizeMax);\n                        if (ignoreZones) {\n                            translatedFrom = translatedTo =\n                                axis.toPixels(extremes.max);\n                        }\n                        pxRange = Math.abs(translatedFrom - translatedTo);\n                        pxPosMin = Math.min(translatedFrom, translatedTo);\n                        pxPosMax = Math.max(translatedFrom, translatedTo);\n                        if (axis.isXAxis) {\n                            clipAttr = {\n                                x: inverted ? pxPosMax : pxPosMin,\n                                y: 0,\n                                width: pxRange,\n                                height: chartSizeMax\n                            };\n                            if (!horiz) {\n                                clipAttr.x = chart.plotHeight - clipAttr.x;\n                            }\n                        }\n                        else {\n                            clipAttr = {\n                                x: 0,\n                                y: inverted ? pxPosMax : pxPosMin,\n                                width: chartSizeMax,\n                                height: pxRange\n                            };\n                            if (horiz) {\n                                clipAttr.y = chart.plotWidth - clipAttr.y;\n                            }\n                        }\n                        // VML SUPPPORT\n                        if (inverted && renderer.isVML) {\n                            if (axis.isXAxis) {\n                                clipAttr = {\n                                    x: 0,\n                                    y: reversed ? pxPosMin : pxPosMax,\n                                    height: clipAttr.width,\n                                    width: chart.chartWidth\n                                };\n                            }\n                            else {\n                                clipAttr = {\n                                    x: (clipAttr.y -\n                                        chart.plotLeft -\n                                        chart.spacingBox.x),\n                                    y: 0,\n                                    width: clipAttr.height,\n                                    height: chart.chartHeight\n                                };\n                            }\n                        }\n                        // END OF VML SUPPORT\n                        if (clips[i]) {\n                            clips[i].animate(clipAttr);\n                        }\n                        else {\n                            clips[i] = renderer.clipRect(clipAttr);\n                        }\n                        // when no data, graph zone is not applied and after setData\n                        // clip was ignored. As a result, it should be applied each\n                        // time.\n                        zoneArea = series['zone-area-' + i];\n                        zoneGraph = series['zone-graph-' + i];\n                        if (graph && zoneGraph) {\n                            zoneGraph.clip(clips[i]);\n                        }\n                        if (area && zoneArea) {\n                            zoneArea.clip(clips[i]);\n                        }\n                        // if this zone extends out of the axis, ignore the others\n                        ignoreZones = threshold.value > extremes.max;\n                        // Clear translatedTo for indicators\n                        if (series.resetZones && translatedTo === 0) {\n                            translatedTo = void 0;\n                        }\n                    });\n                    this.clips = clips;\n                }\n                else if (series.visible) {\n                    // If zones were removed, restore graph and area\n                    if (graph) {\n                        graph.show(true);\n                    }\n                    if (area) {\n                        area.show(true);\n                    }\n                }\n            },\n            /**\n             * Initialize and perform group inversion on series.group and\n             * series.markerGroup.\n             *\n             * @private\n             * @function Highcharts.Series#invertGroups\n             * @param {boolean} [inverted]\n             * @return {void}\n             */\n            invertGroups: function (inverted) {\n                var series = this,\n                    chart = series.chart;\n                /**\n                 * @private\n                 */\n                function setInvert() {\n                    ['group', 'markerGroup'].forEach(function (groupName) {\n                        if (series[groupName]) {\n                            // VML/HTML needs explicit attributes for flipping\n                            if (chart.renderer.isVML) {\n                                series[groupName].attr({\n                                    width: series.yAxis.len,\n                                    height: series.xAxis.len\n                                });\n                            }\n                            series[groupName].width = series.yAxis.len;\n                            series[groupName].height = series.xAxis.len;\n                            // If inverted polar, don't invert series group\n                            series[groupName].invert(series.isRadialSeries ? false : inverted);\n                        }\n                    });\n                }\n                // Pie, go away (#1736)\n                if (!series.xAxis) {\n                    return;\n                }\n                // A fixed size is needed for inversion to work\n                series.eventsToUnbind.push(addEvent(chart, 'resize', setInvert));\n                // Do it now\n                setInvert();\n                // On subsequent render and redraw, just do setInvert without\n                // setting up events again\n                series.invertGroups = setInvert;\n            },\n            /**\n             * General abstraction for creating plot groups like series.group,\n             * series.dataLabelsGroup and series.markerGroup. On subsequent calls,\n             * the group will only be adjusted to the updated plot size.\n             *\n             * @private\n             * @function Highcharts.Series#plotGroup\n             * @param {string} prop\n             * @param {string} name\n             * @param {string} visibility\n             * @param {number} [zIndex]\n             * @param {Highcharts.SVGElement} [parent]\n             * @return {Highcharts.SVGElement}\n             */\n            plotGroup: function (prop, name, visibility, zIndex, parent) {\n                var group = this[prop],\n                    isNew = !group,\n                    attrs = {\n                        visibility: visibility,\n                        zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n                    };\n                // Avoid setting undefined opacity, or in styled mode\n                if (typeof this.opacity !== 'undefined' &&\n                    !this.chart.styledMode) {\n                    attrs.opacity = this.opacity;\n                }\n                // Generate it on first call\n                if (isNew) {\n                    this[prop] = group = this.chart.renderer\n                        .g()\n                        .add(parent);\n                }\n                // Add the class names, and replace existing ones as response to\n                // Series.update (#6660)\n                group.addClass(('highcharts-' + name +\n                    ' highcharts-series-' + this.index +\n                    ' highcharts-' + this.type + '-series ' +\n                    (defined(this.colorIndex) ?\n                        'highcharts-color-' + this.colorIndex + ' ' :\n                        '') +\n                    (this.options.className || '') +\n                    (group.hasClass('highcharts-tracker') ?\n                        ' highcharts-tracker' :\n                        '')), true);\n                // Place it on first and subsequent (redraw) calls\n                group.attr(attrs)[isNew ? 'attr' : 'animate'](this.getPlotBox());\n                return group;\n            },\n            /**\n             * Get the translation and scale for the plot area of this series.\n             *\n             * @function Highcharts.Series#getPlotBox\n             *\n             * @return {Highcharts.SeriesPlotBoxObject}\n             */\n            getPlotBox: function () {\n                var chart = this.chart,\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis;\n                // Swap axes for inverted (#2339)\n                if (chart.inverted) {\n                    xAxis = yAxis;\n                    yAxis = this.xAxis;\n                }\n                return {\n                    translateX: xAxis ? xAxis.left : chart.plotLeft,\n                    translateY: yAxis ? yAxis.top : chart.plotTop,\n                    scaleX: 1,\n                    scaleY: 1\n                };\n            },\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             *\n             * @private\n             * @function Highcharts.Series#removeEvents\n             * @param {boolean} [keepEventsForUpdate]\n             * @return {void}\n             */\n            removeEvents: function (keepEventsForUpdate) {\n                var series = this;\n                if (!keepEventsForUpdate) {\n                    // remove all events\n                    removeEvent(series);\n                }\n                else if (series.eventsToUnbind.length) {\n                    // remove only internal events for proper update\n                    // #12355 - solves problem with multiple destroy events\n                    series.eventsToUnbind.forEach(function (unbind) {\n                        unbind();\n                    });\n                    series.eventsToUnbind.length = 0;\n                }\n            },\n            /**\n             * Render the graph and markers. Called internally when first rendering\n             * and later when redrawing the chart. This function can be extended in\n             * plugins, but normally shouldn't be called directly.\n             *\n             * @function Highcharts.Series#render\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:afterRender\n             */\n            render: function () {\n                var series = this,\n                    chart = series.chart,\n                    group,\n                    options = series.options, \n                    // Animation doesn't work in IE8 quirks when the group div is\n                    // hidden, and looks bad in other oldIE\n                    animDuration = (!series.finishedAnimating &&\n                        chart.renderer.isSVG &&\n                        animObject(options.animation).duration),\n                    visibility = series.visible ? 'inherit' : 'hidden', // #2597\n                    zIndex = options.zIndex,\n                    hasRendered = series.hasRendered,\n                    chartSeriesGroup = chart.seriesGroup,\n                    inverted = chart.inverted;\n                fireEvent(this, 'render');\n                // the group\n                group = series.plotGroup('group', 'series', visibility, zIndex, chartSeriesGroup);\n                series.markerGroup = series.plotGroup('markerGroup', 'markers', visibility, zIndex, chartSeriesGroup);\n                // initiate the animation\n                if (animDuration && series.animate) {\n                    series.animate(true);\n                }\n                // SVGRenderer needs to know this before drawing elements (#1089,\n                // #1795)\n                group.inverted = series.isCartesian || series.invertable ?\n                    inverted : false;\n                // Draw the graph if any\n                if (series.drawGraph) {\n                    series.drawGraph();\n                    series.applyZones();\n                }\n                // Draw the points\n                if (series.visible) {\n                    series.drawPoints();\n                }\n                /* series.points.forEach(function (point) {\n                    if (point.redraw) {\n                        point.redraw();\n                    }\n                }); */\n                // Draw the data labels\n                if (series.drawDataLabels) {\n                    series.drawDataLabels();\n                }\n                // In pie charts, slices are added to the DOM, but actual rendering\n                // is postponed until labels reserved their space\n                if (series.redrawPoints) {\n                    series.redrawPoints();\n                }\n                // draw the mouse tracking area\n                if (series.drawTracker &&\n                    series.options.enableMouseTracking !== false) {\n                    series.drawTracker();\n                }\n                // Handle inverted series and tracker groups\n                series.invertGroups(inverted);\n                // Initial clipping, must be defined after inverting groups for VML.\n                // Applies to columns etc. (#3839).\n                if (options.clip !== false &&\n                    !series.sharedClipKey &&\n                    !hasRendered) {\n                    group.clip(chart.clipRect);\n                }\n                // Run the animation\n                if (animDuration && series.animate) {\n                    series.animate();\n                }\n                // Call the afterAnimate function on animation complete (but don't\n                // overwrite the animation.complete option which should be available\n                // to the user).\n                if (!hasRendered) {\n                    series.animationTimeout = syncTimeout(function () {\n                        series.afterAnimate();\n                    }, animDuration || 0);\n                }\n                // Means data is in accordance with what you see\n                series.isDirty = false;\n                // (See #322) series.isDirty = series.isDirtyData = false; // means\n                // data is in accordance with what you see\n                series.hasRendered = true;\n                fireEvent(series, 'afterRender');\n            },\n            /**\n             * Redraw the series. This function is called internally from\n             * `chart.redraw` and normally shouldn't be called directly.\n             *\n             * @private\n             * @function Highcharts.Series#redraw\n             * @return {void}\n             */\n            redraw: function () {\n                var series = this,\n                    chart = series.chart, \n                    // cache it here as it is set to false in render, but used after\n                    wasDirty = series.isDirty || series.isDirtyData,\n                    group = series.group,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                // reposition on resize\n                if (group) {\n                    if (chart.inverted) {\n                        group.attr({\n                            width: chart.plotWidth,\n                            height: chart.plotHeight\n                        });\n                    }\n                    group.animate({\n                        translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n                        translateY: pick(yAxis && yAxis.top, chart.plotTop)\n                    });\n                }\n                series.translate();\n                series.render();\n                if (wasDirty) { // #3868, #3945\n                    delete this.kdTree;\n                }\n            },\n            kdAxisArray: ['clientX', 'plotY'],\n            /**\n             * @private\n             * @function Highcharts.Series#searchPoint\n             * @param {Highcharts.PointerEventObject} e\n             * @param {boolean} [compareX]\n             * @return {Highcharts.Point}\n             */\n            searchPoint: function (e, compareX) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    inverted = series.chart.inverted;\n                return this.searchKDTree({\n                    clientX: inverted ?\n                        xAxis.len - e.chartY + xAxis.pos :\n                        e.chartX - xAxis.pos,\n                    plotY: inverted ?\n                        yAxis.len - e.chartX + yAxis.pos :\n                        e.chartY - yAxis.pos\n                }, compareX, e);\n            },\n            /**\n             * Build the k-d-tree that is used by mouse and touch interaction to get\n             * the closest point. Line-like series typically have a one-dimensional\n             * tree where points are searched along the X axis, while scatter-like\n             * series typically search in two dimensions, X and Y.\n             *\n             * @private\n             * @function Highcharts.Series#buildKDTree\n             * @param {Highcharts.PointerEventObject} [e]\n             * @return {void}\n             */\n            buildKDTree: function (e) {\n                // Prevent multiple k-d-trees from being built simultaneously\n                // (#6235)\n                this.buildingKdTree = true;\n                var series = this,\n                    dimensions = series.options.findNearestPointBy\n                        .indexOf('y') > -1 ? 2 : 1;\n                /**\n                 * Internal function\n                 * @private\n                 */\n                function _kdtree(points, depth, dimensions) {\n                    var axis,\n                        median,\n                        length = points && points.length;\n                    if (length) {\n                        // alternate between the axis\n                        axis = series.kdAxisArray[depth % dimensions];\n                        // sort point array\n                        points.sort(function (a, b) {\n                            return a[axis] - b[axis];\n                        });\n                        median = Math.floor(length / 2);\n                        // build and return nod\n                        return {\n                            point: points[median],\n                            left: _kdtree(points.slice(0, median), depth + 1, dimensions),\n                            right: _kdtree(points.slice(median + 1), depth + 1, dimensions)\n                        };\n                    }\n                }\n                /**\n                 * Start the recursive build process with a clone of the points\n                 * array and null points filtered out. (#3873)\n                 * @private\n                 */\n                function startRecursive() {\n                    series.kdTree = _kdtree(series.getValidPoints(null, \n                    // For line-type series restrict to plot area, but\n                    // column-type series not (#3916, #4511)\n                    !series.directTouch), dimensions, dimensions);\n                    series.buildingKdTree = false;\n                }\n                delete series.kdTree;\n                // For testing tooltips, don't build async. Also if touchstart, we\n                // may be dealing with click events on mobile, so don't delay\n                // (#6817).\n                syncTimeout(startRecursive, series.options.kdNow || (e && e.type === 'touchstart') ? 0 : 1);\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#searchKDTree\n             * @param {Highcharts.KDPointSearchObject} point\n             * @param {boolean} [compareX]\n             * @param {Highcharts.PointerEventObject} [e]\n             * @return {Highcharts.Point|undefined}\n             */\n            searchKDTree: function (point, compareX, e) {\n                var series = this,\n                    kdX = this.kdAxisArray[0],\n                    kdY = this.kdAxisArray[1],\n                    kdComparer = compareX ? 'distX' : 'dist',\n                    kdDimensions = series.options.findNearestPointBy\n                        .indexOf('y') > -1 ? 2 : 1;\n                /**\n                 * Set the one and two dimensional distance on the point object.\n                 * @private\n                 */\n                function setDistance(p1, p2) {\n                    var x = (defined(p1[kdX]) &&\n                            defined(p2[kdX])) ?\n                            Math.pow(p1[kdX] - p2[kdX], 2) :\n                            null,\n                        y = (defined(p1[kdY]) &&\n                            defined(p2[kdY])) ?\n                            Math.pow(p1[kdY] - p2[kdY], 2) :\n                            null,\n                        r = (x || 0) + (y || 0);\n                    p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n                    p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n                }\n                /**\n                 * @private\n                 */\n                function _search(search, tree, depth, dimensions) {\n                    var point = tree.point,\n                        axis = series.kdAxisArray[depth % dimensions],\n                        tdist,\n                        sideA,\n                        sideB,\n                        ret = point,\n                        nPoint1,\n                        nPoint2;\n                    setDistance(search, point);\n                    // Pick side based on distance to splitting point\n                    tdist = search[axis] - point[axis];\n                    sideA = tdist < 0 ? 'left' : 'right';\n                    sideB = tdist < 0 ? 'right' : 'left';\n                    // End of tree\n                    if (tree[sideA]) {\n                        nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n                        ret = (nPoint1[kdComparer] <\n                            ret[kdComparer] ?\n                            nPoint1 :\n                            point);\n                    }\n                    if (tree[sideB]) {\n                        // compare distance to current best to splitting point to\n                        // decide wether to check side B or not\n                        if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n                            nPoint2 = _search(search, tree[sideB], depth + 1, dimensions);\n                            ret = (nPoint2[kdComparer] <\n                                ret[kdComparer] ?\n                                nPoint2 :\n                                ret);\n                        }\n                    }\n                    return ret;\n                }\n                if (!this.kdTree && !this.buildingKdTree) {\n                    this.buildKDTree(e);\n                }\n                if (this.kdTree) {\n                    return _search(point, this.kdTree, kdDimensions, kdDimensions);\n                }\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#pointPlacementToXValue\n             * @return {number}\n             */\n            pointPlacementToXValue: function () {\n                var _a = this,\n                    _b = _a.options,\n                    pointPlacement = _b.pointPlacement,\n                    pointRange = _b.pointRange,\n                    axis = _a.xAxis;\n                var factor = pointPlacement;\n                // Point placement is relative to each series pointRange (#5889)\n                if (factor === 'between') {\n                    factor = axis.reversed ? -0.5 : 0.5; // #11955\n                }\n                return isNumber(factor) ?\n                    factor * pick(pointRange, axis.pointRange) :\n                    0;\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#isPointInside\n             * @param {Highcharts.Point} point\n             * @return {boolean}\n             */\n            isPointInside: function (point) {\n                var isInside = typeof point.plotY !== 'undefined' &&\n                        typeof point.plotX !== 'undefined' &&\n                        point.plotY >= 0 &&\n                        point.plotY <= this.yAxis.len && // #3519\n                        point.plotX >= 0 &&\n                        point.plotX <= this.xAxis.len;\n                return isInside;\n            }\n        }); // end Series prototype\n        /**\n         * A line series displays information as a series of data points connected by\n         * straight line segments.\n         *\n         * @sample {highcharts} highcharts/demo/line-basic/\n         *         Line chart\n         * @sample {highstock} stock/demo/basic-line/\n         *         Line chart\n         *\n         * @extends   plotOptions.series\n         * @product   highcharts highstock\n         * @apioption plotOptions.line\n         */\n        /**\n         * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n         * of a line graph. Round means that lines are rounded in the ends and\n         * bends.\n         *\n         * @type       {Highcharts.SeriesLinecapValue}\n         * @default    round\n         * @since      3.0.7\n         * @apioption  plotOptions.line.linecap\n         */\n        /**\n         * A `line` series. If the [type](#series.line.type) option is not\n         * specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.line\n         * @excluding dataParser,dataURL\n         * @product   highcharts highstock\n         * @apioption series.line\n         */\n        /**\n         * An array of data points for the series. For the `line` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 1],\n         *        [1, 2],\n         *        [2, 8]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.line.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * **Note:** In TypeScript you have to extend `PointOptionsObject` with an\n         * additional declaration to allow custom data types:\n         * ```ts\n         * declare module `highcharts` {\n         *   interface PointOptionsObject {\n         *     custom: Record<string, (boolean|number|string)>;\n         *   }\n         * }\n         * ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @declare   Highcharts.PointOptionsObject\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @apioption series.line.data\n         */\n        /**\n         * An additional, individual class name for the data point's graphic\n         * representation.\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @product   highcharts gantt\n         * @apioption series.line.data.className\n         */\n        /**\n         * Individual color for the point. By default the color is pulled from\n         * the global `colors` array.\n         *\n         * In styled mode, the `color` option doesn't take effect. Instead, use\n         * `colorIndex`.\n         *\n         * @sample {highcharts} highcharts/point/color/\n         *         Mark the highest point\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.color\n         */\n        /**\n         * A specific color index to use for the point, so its graphic representations\n         * are given the class name `highcharts-color-{n}`. In styled mode this will\n         * change the color of the graphic. In non-styled mode, the color by is set by\n         * the `fill` attribute, so the change in class name won't have a visual effect\n         * by default.\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @product   highcharts gantt\n         * @apioption series.line.data.colorIndex\n         */\n        /**\n         * A reserved subspace to store options and values for customized functionality.\n         * Here you can add additional data for your own event callbacks and formatter\n         * callbacks.\n         *\n         * @sample {highcharts} highcharts/point/custom/\n         *         Point and series with custom data\n         *\n         * @type      {Highcharts.Dictionary<*>}\n         * @apioption series.line.data.custom\n         */\n        /**\n         * Individual data label for each point. The options are the same as\n         * the ones for [plotOptions.series.dataLabels](\n         * #plotOptions.series.dataLabels).\n         *\n         * @sample highcharts/point/datalabels/\n         *         Show a label for the last value\n         *\n         * @declare   Highcharts.DataLabelsOptions\n         * @extends   plotOptions.line.dataLabels\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.dataLabels\n         */\n        /**\n         * A description of the point to add to the screen reader information\n         * about the point.\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @requires  modules/accessibility\n         * @apioption series.line.data.description\n         */\n        /**\n         * An id for the point. This can be used after render time to get a\n         * pointer to the point object through `chart.get()`.\n         *\n         * @sample {highcharts} highcharts/point/id/\n         *         Remove an id'd point\n         *\n         * @type      {string}\n         * @since     1.2.0\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.id\n         */\n        /**\n         * The rank for this point's data label in case of collision. If two\n         * data labels are about to overlap, only the one with the highest `labelrank`\n         * will be drawn.\n         *\n         * @type      {number}\n         * @apioption series.line.data.labelrank\n         */\n        /**\n         * The name of the point as shown in the legend, tooltip, dataLabels, etc.\n         *\n         * @see [xAxis.uniqueNames](#xAxis.uniqueNames)\n         *\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Point names\n         *\n         * @type      {string}\n         * @apioption series.line.data.name\n         */\n        /**\n         * Whether the data point is selected initially.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.selected\n         */\n        /**\n         * The x value of the point. For datetime axes, the X value is the timestamp\n         * in milliseconds since 1970.\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.line.data.x\n         */\n        /**\n         * The y value of the point.\n         *\n         * @type      {number|null}\n         * @product   highcharts highstock\n         * @apioption series.line.data.y\n         */\n        /**\n         * The individual point events.\n         *\n         * @extends   plotOptions.series.point.events\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.events\n         */\n        /**\n         * Options for the point markers of line-like series.\n         *\n         * @declare   Highcharts.PointMarkerOptionsObject\n         * @extends   plotOptions.series.marker\n         * @product   highcharts highstock\n         * @apioption series.line.data.marker\n         */\n        ''; // include precedent doclets in transpilat\n\n    });\n    _registerModule(_modules, 'parts/Stacking.js', [_modules['parts/Axis.js'], _modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/StackingAxis.js'], _modules['parts/Utilities.js']], function (Axis, Chart, H, StackingAxis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            format = U.format,\n            isNumber = U.isNumber,\n            pick = U.pick;\n        /**\n         * Stack of data points\n         *\n         * @product highcharts\n         *\n         * @interface Highcharts.StackItemObject\n         */ /**\n        * Alignment settings\n        * @name Highcharts.StackItemObject#alignOptions\n        * @type {Highcharts.AlignObject}\n        */ /**\n        * Related axis\n        * @name Highcharts.StackItemObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Cumulative value of the stacked data points\n        * @name Highcharts.StackItemObject#cumulative\n        * @type {number}\n        */ /**\n        * True if on the negative side\n        * @name Highcharts.StackItemObject#isNegative\n        * @type {boolean}\n        */ /**\n        * Related SVG element\n        * @name Highcharts.StackItemObject#label\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * Related stack options\n        * @name Highcharts.StackItemObject#options\n        * @type {Highcharts.YAxisStackLabelsOptions}\n        */ /**\n        * Total value of the stacked data points\n        * @name Highcharts.StackItemObject#total\n        * @type {number}\n        */ /**\n        * Shared x value of the stack\n        * @name Highcharts.StackItemObject#x\n        * @type {number}\n        */\n        ''; // detached doclets above\n        var Series = H.Series;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The class for stacks. Each stack, on a specific X value and either negative\n         * or positive, has its own stack item.\n         *\n         * @private\n         * @class\n         * @name Highcharts.StackItem\n         * @param {Highcharts.Axis} axis\n         * @param {Highcharts.YAxisStackLabelsOptions} options\n         * @param {boolean} isNegative\n         * @param {number} x\n         * @param {Highcharts.OptionsStackingValue} [stackOption]\n         */\n        var StackItem = /** @class */ (function () {\n                function StackItem(axis, options, isNegative, x, stackOption) {\n                    var inverted = axis.chart.inverted;\n                this.axis = axis;\n                // Tells if the stack is negative\n                this.isNegative = isNegative;\n                // Save the options to be able to style the label\n                this.options = options = options || {};\n                // Save the x value to be able to position the label later\n                this.x = x;\n                // Initialize total value\n                this.total = null;\n                // This will keep each points' extremes stored by series.index and point\n                // index\n                this.points = {};\n                this.hasValidPoints = false;\n                // Save the stack option on the series configuration object,\n                // and whether to treat it as percent\n                this.stack = stackOption;\n                this.leftCliff = 0;\n                this.rightCliff = 0;\n                // The align options and text align varies on whether the stack is\n                // negative and if the chart is inverted or not.\n                // First test the user supplied value, then use the dynamic.\n                this.alignOptions = {\n                    align: options.align ||\n                        (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n                    verticalAlign: options.verticalAlign ||\n                        (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n                    y: options.y,\n                    x: options.x\n                };\n                this.textAlign = options.textAlign ||\n                    (inverted ? (isNegative ? 'right' : 'left') : 'center');\n            }\n            /**\n             * @private\n             * @function Highcharts.StackItem#destroy\n             */\n            StackItem.prototype.destroy = function () {\n                destroyObjectProperties(this, this.axis);\n            };\n            /**\n             * Renders the stack total label and adds it to the stack label group.\n             *\n             * @private\n             * @function Highcharts.StackItem#render\n             * @param {Highcharts.SVGElement} group\n             */\n            StackItem.prototype.render = function (group) {\n                var chart = this.axis.chart,\n                    options = this.options,\n                    formatOption = options.format,\n                    attr = {},\n                    str = formatOption ? // format the text in the label\n                        format(formatOption,\n                    this,\n                    chart) :\n                        options.formatter.call(this);\n                // Change the text to reflect the new total and set visibility to hidden\n                // in case the serie is hidden\n                if (this.label) {\n                    this.label.attr({ text: str, visibility: 'hidden' });\n                }\n                else {\n                    // Create new label\n                    this.label = chart.renderer\n                        .label(str, null, null, options.shape, null, null, options.useHTML, false, 'stack-labels');\n                    attr = {\n                        r: options.borderRadius || 0,\n                        text: str,\n                        rotation: options.rotation,\n                        padding: pick(options.padding, 5),\n                        visibility: 'hidden' // hidden until setOffset is called\n                    };\n                    if (!chart.styledMode) {\n                        attr.fill = options.backgroundColor;\n                        attr.stroke = options.borderColor;\n                        attr['stroke-width'] = options.borderWidth;\n                        this.label.css(options.style);\n                    }\n                    this.label.attr(attr);\n                    if (!this.label.added) {\n                        this.label.add(group); // add to the labels-group\n                    }\n                }\n                // Rank it higher than data labels (#8742)\n                this.label.labelrank = chart.plotHeight;\n            };\n            /**\n             * Sets the offset that the stack has from the x value and repositions the\n             * label.\n             *\n             * @private\n             * @function Highcarts.StackItem#setOffset\n             * @param {number} xOffset\n             * @param {number} xWidth\n             * @param {number} [boxBottom]\n             * @param {number} [boxTop]\n             * @param {number} [defaultX]\n             */\n            StackItem.prototype.setOffset = function (xOffset, xWidth, boxBottom, boxTop, defaultX) {\n                var stackItem = this,\n                    axis = stackItem.axis,\n                    chart = axis.chart, \n                    // stack value translated mapped to chart coordinates\n                    y = axis.translate(axis.stacking.usePercentage ?\n                        100 :\n                        (boxTop ?\n                            boxTop :\n                            stackItem.total), 0, 0, 0, 1),\n                    yZero = axis.translate(boxBottom ? boxBottom : 0), // stack origin\n                    // stack height:\n                    h = defined(y) && Math.abs(y - yZero), \n                    // x position:\n                    x = pick(defaultX,\n                    chart.xAxis[0].translate(stackItem.x)) +\n                        xOffset,\n                    stackBox = defined(y) && stackItem.getStackBox(chart,\n                    stackItem,\n                    x,\n                    y,\n                    xWidth,\n                    h,\n                    axis),\n                    label = stackItem.label,\n                    isNegative = stackItem.isNegative,\n                    isJustify = pick(stackItem.options.overflow, 'justify') === 'justify',\n                    textAlign = stackItem.textAlign,\n                    visible;\n                if (label && stackBox) {\n                    var bBox = label.getBBox(),\n                        padding = label.padding,\n                        boxOffsetX,\n                        boxOffsetY;\n                    if (textAlign === 'left') {\n                        boxOffsetX = chart.inverted ? -padding : padding;\n                    }\n                    else if (textAlign === 'right') {\n                        boxOffsetX = bBox.width;\n                    }\n                    else {\n                        if (chart.inverted && textAlign === 'center') {\n                            boxOffsetX = bBox.width / 2;\n                        }\n                        else {\n                            boxOffsetX = chart.inverted ?\n                                (isNegative ? bBox.width + padding : -padding) : bBox.width / 2;\n                        }\n                    }\n                    boxOffsetY = chart.inverted ?\n                        bBox.height / 2 : (isNegative ? -padding : bBox.height);\n                    // Reset alignOptions property after justify #12337\n                    stackItem.alignOptions.x = pick(stackItem.options.x, 0);\n                    stackItem.alignOptions.y = pick(stackItem.options.y, 0);\n                    // Set the stackBox position\n                    stackBox.x -= boxOffsetX;\n                    stackBox.y -= boxOffsetY;\n                    // Align the label to the box\n                    label.align(stackItem.alignOptions, null, stackBox);\n                    // Check if label is inside the plotArea #12294\n                    if (chart.isInsidePlot(label.alignAttr.x + boxOffsetX - stackItem.alignOptions.x, label.alignAttr.y + boxOffsetY - stackItem.alignOptions.y)) {\n                        label.show();\n                    }\n                    else {\n                        // Move label away to avoid the overlapping issues\n                        label.alignAttr.y = -9999;\n                        isJustify = false;\n                    }\n                    if (isJustify) {\n                        // Justify stackLabel into the stackBox\n                        Series.prototype.justifyDataLabel.call(this.axis, label, stackItem.alignOptions, label.alignAttr, bBox, stackBox);\n                    }\n                    label.attr({\n                        x: label.alignAttr.x,\n                        y: label.alignAttr.y\n                    });\n                    if (pick(!isJustify && stackItem.options.crop, true)) {\n                        visible =\n                            isNumber(label.x) &&\n                                isNumber(label.y) &&\n                                chart.isInsidePlot(label.x - padding + label.width, label.y) &&\n                                chart.isInsidePlot(label.x + padding, label.y);\n                        if (!visible) {\n                            label.hide();\n                        }\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.StackItem#getStackBox\n             *\n             * @param {Highcharts.Chart} chart\n             *\n             * @param {Highcharts.StackItem} stackItem\n             *\n             * @param {number} x\n             *\n             * @param {number} y\n             *\n             * @param {number} xWidth\n             *\n             * @param {number} h\n             *\n             * @param {Highcharts.Axis} axis\n             *\n             * @return {Highcharts.BBoxObject}\n             */\n            StackItem.prototype.getStackBox = function (chart, stackItem, x, y, xWidth, h, axis) {\n                var reversed = stackItem.axis.reversed,\n                    inverted = chart.inverted,\n                    axisPos = axis.height + axis.pos -\n                        (inverted ? chart.plotLeft : chart.plotTop),\n                    neg = (stackItem.isNegative && !reversed) ||\n                        (!stackItem.isNegative && reversed); // #4056\n                    return {\n                        x: inverted ? (neg ? y - axis.right : y - h + axis.pos - chart.plotLeft) :\n                            x + chart.xAxis[0].transB - chart.plotLeft,\n                        y: inverted ?\n                            axis.height - x - xWidth :\n                            (neg ?\n                                (axisPos - y - h) :\n                                axisPos - y),\n                        width: inverted ? h : xWidth,\n                        height: inverted ? xWidth : h\n                    };\n            };\n            return StackItem;\n        }());\n        /**\n         * Generate stacks for each series and calculate stacks total values\n         *\n         * @private\n         * @function Highcharts.Chart#getStacks\n         */\n        Chart.prototype.getStacks = function () {\n            var chart = this,\n                inverted = chart.inverted;\n            // reset stacks for each yAxis\n            chart.yAxis.forEach(function (axis) {\n                if (axis.stacking && axis.stacking.stacks && axis.hasVisibleSeries) {\n                    axis.stacking.oldStacks = axis.stacking.stacks;\n                }\n            });\n            chart.series.forEach(function (series) {\n                var xAxisOptions = series.xAxis && series.xAxis.options || {};\n                if (series.options.stacking &&\n                    (series.visible === true ||\n                        chart.options.chart.ignoreHiddenSeries === false)) {\n                    series.stackKey = [\n                        series.type,\n                        pick(series.options.stack, ''),\n                        inverted ? xAxisOptions.top : xAxisOptions.left,\n                        inverted ? xAxisOptions.height : xAxisOptions.width\n                    ].join(',');\n                }\n            });\n        };\n        // Stacking methods defined on the Axis prototype\n        StackingAxis.compose(Axis);\n        // Stacking methods defined for Series prototype\n        /**\n         * Set grouped points in a stack-like object. When `centerInCategory` is true,\n         * and `stacking` is not enabled, we need a pseudo (horizontal) stack in order\n         * to handle grouping of points within the same category.\n         *\n         * @private\n         * @function Highcharts.Series#setStackedPoints\n         * @return {void}\n         */\n        Series.prototype.setGroupedPoints = function () {\n            if (this.options.centerInCategory &&\n                (this.is('column') || this.is('columnrange')) &&\n                // With stacking enabled, we already have stacks that we can compute\n                // from\n                !this.options.stacking &&\n                // With only one series, we don't need to consider centerInCategory\n                this.chart.series.length > 1) {\n                Series.prototype.setStackedPoints.call(this, 'group');\n            }\n        };\n        /**\n         * Adds series' points value to corresponding stack\n         *\n         * @private\n         * @function Highcharts.Series#setStackedPoints\n         */\n        Series.prototype.setStackedPoints = function (stackingParam) {\n            var stacking = stackingParam || this.options.stacking;\n            if (!stacking ||\n                (this.visible !== true &&\n                    this.chart.options.chart.ignoreHiddenSeries !== false)) {\n                return;\n            }\n            var series = this, xData = series.processedXData, yData = series.processedYData, stackedYData = [], yDataLength = yData.length, seriesOptions = series.options, threshold = seriesOptions.threshold, stackThreshold = pick(seriesOptions.startFromThreshold && threshold, 0), stackOption = seriesOptions.stack, stackKey = stackingParam ? series.type + \",\" + stacking : series.stackKey, negKey = '-' + stackKey, negStacks = series.negStacks, yAxis = series.yAxis, stacks = yAxis.stacking.stacks, oldStacks = yAxis.stacking.oldStacks, stackIndicator, isNegative, stack, other, key, pointKey, i, x, y;\n            yAxis.stacking.stacksTouched += 1;\n            // loop over the non-null y values and read them into a local array\n            for (i = 0; i < yDataLength; i++) {\n                x = xData[i];\n                y = yData[i];\n                stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n                pointKey = stackIndicator.key;\n                // Read stacked values into a stack based on the x value,\n                // the sign of y and the stack key. Stacking is also handled for null\n                // values (#739)\n                isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n                key = isNegative ? negKey : stackKey;\n                // Create empty object for this stack if it doesn't exist yet\n                if (!stacks[key]) {\n                    stacks[key] =\n                        {};\n                }\n                // Initialize StackItem for this x\n                if (!stacks[key][x]) {\n                    if (oldStacks[key] &&\n                        oldStacks[key][x]) {\n                        stacks[key][x] = oldStacks[key][x];\n                        stacks[key][x].total = null;\n                    }\n                    else {\n                        stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);\n                    }\n                }\n                // If the StackItem doesn't exist, create it first\n                stack = stacks[key][x];\n                if (y !== null) {\n                    stack.points[pointKey] = stack.points[series.index] =\n                        [pick(stack.cumulative, stackThreshold)];\n                    // Record the base of the stack\n                    if (!defined(stack.cumulative)) {\n                        stack.base = pointKey;\n                    }\n                    stack.touched = yAxis.stacking.stacksTouched;\n                    // In area charts, if there are multiple points on the same X value,\n                    // let the area fill the full span of those points\n                    if (stackIndicator.index > 0 && series.singleStacks === false) {\n                        stack.points[pointKey][0] =\n                            stack.points[series.index + ',' + x + ',0'][0];\n                    }\n                    // When updating to null, reset the point stack (#7493)\n                }\n                else {\n                    stack.points[pointKey] = stack.points[series.index] =\n                        null;\n                }\n                // Add value to the stack total\n                if (stacking === 'percent') {\n                    // Percent stacked column, totals are the same for the positive and\n                    // negative stacks\n                    other = isNegative ? stackKey : negKey;\n                    if (negStacks && stacks[other] && stacks[other][x]) {\n                        other = stacks[other][x];\n                        stack.total = other.total =\n                            Math.max(other.total, stack.total) +\n                                Math.abs(y) ||\n                                0;\n                        // Percent stacked areas\n                    }\n                    else {\n                        stack.total =\n                            correctFloat(stack.total + (Math.abs(y) || 0));\n                    }\n                }\n                else if (stacking === 'group') {\n                    // In this stack, the total is the number of valid points\n                    if (y !== null) {\n                        stack.total = (stack.total || 0) + 1;\n                    }\n                }\n                else {\n                    stack.total = correctFloat(stack.total + (y || 0));\n                }\n                if (stacking === 'group') {\n                    // This point's index within the stack, pushed to stack.points[1]\n                    stack.cumulative = (stack.total || 1) - 1;\n                }\n                else {\n                    stack.cumulative =\n                        pick(stack.cumulative, stackThreshold) + (y || 0);\n                }\n                if (y !== null) {\n                    stack.points[pointKey].push(stack.cumulative);\n                    stackedYData[i] = stack.cumulative;\n                    stack.hasValidPoints = true;\n                }\n            }\n            if (stacking === 'percent') {\n                yAxis.stacking.usePercentage = true;\n            }\n            if (stacking !== 'group') {\n                this.stackedYData = stackedYData; // To be used in getExtremes\n            }\n            // Reset old stacks\n            yAxis.stacking.oldStacks = {};\n        };\n        /**\n         * Iterate over all stacks and compute the absolute values to percent\n         *\n         * @private\n         * @function Highcharts.Series#modifyStacks\n         */\n        Series.prototype.modifyStacks = function () {\n            var series = this,\n                yAxis = series.yAxis,\n                stackKey = series.stackKey,\n                stacks = yAxis.stacking.stacks,\n                processedXData = series.processedXData,\n                stackIndicator,\n                stacking = series.options.stacking;\n            if (series[stacking + 'Stacker']) { // Modifier function exists\n                [stackKey, '-' + stackKey].forEach(function (key) {\n                    var i = processedXData.length,\n                        x,\n                        stack,\n                        pointExtremes;\n                    while (i--) {\n                        x = processedXData[i];\n                        stackIndicator = series.getStackIndicator(stackIndicator, x, series.index, key);\n                        stack = stacks[key] && stacks[key][x];\n                        pointExtremes =\n                            stack && stack.points[stackIndicator.key];\n                        if (pointExtremes) {\n                            series[stacking + 'Stacker'](pointExtremes, stack, i);\n                        }\n                    }\n                });\n            }\n        };\n        /**\n         * Modifier function for percent stacks. Blows up the stack to 100%.\n         *\n         * @private\n         * @function Highcharts.Series#percentStacker\n         * @param {Array<number>} pointExtremes\n         * @param {Highcharts.StackItem} stack\n         * @param {number} i\n         */\n        Series.prototype.percentStacker = function (pointExtremes, stack, i) {\n            var totalFactor = stack.total ? 100 / stack.total : 0;\n            // Y bottom value\n            pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n            // Y value\n            pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n            this.stackedYData[i] = pointExtremes[1];\n        };\n        /**\n         * Get stack indicator, according to it's x-value, to determine points with the\n         * same x-value\n         *\n         * @private\n         * @function Highcharts.Series#getStackIndicator\n         * @param {Highcharts.StackItemIndicatorObject|undefined} stackIndicator\n         * @param {number} x\n         * @param {number} index\n         * @param {string} [key]\n         * @return {Highcharts.StackItemIndicatorObject}\n         */\n        Series.prototype.getStackIndicator = function (stackIndicator, x, index, key) {\n            // Update stack indicator, when:\n            // first point in a stack || x changed || stack type (negative vs positive)\n            // changed:\n            if (!defined(stackIndicator) ||\n                stackIndicator.x !== x ||\n                (key && stackIndicator.key !== key)) {\n                stackIndicator = {\n                    x: x,\n                    index: 0,\n                    key: key\n                };\n            }\n            else {\n                (stackIndicator).index++;\n            }\n            stackIndicator.key =\n                [index, x, stackIndicator.index].join(',');\n            return stackIndicator;\n        };\n        H.StackItem = StackItem;\n\n        return H.StackItem;\n    });\n    _registerModule(_modules, 'parts/Dynamics.js', [_modules['parts/Axis.js'], _modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/Time.js'], _modules['parts/Utilities.js']], function (Axis, Chart, H, O, Point, Time, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var time = O.time;\n        var addEvent = U.addEvent,\n            animate = U.animate,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            setAnimation = U.setAnimation,\n            splat = U.splat;\n        var Series = H.Series,\n            seriesTypes = H.seriesTypes;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Remove settings that have not changed, to avoid unnecessary rendering or\n         * computing (#9197).\n         * @private\n         */\n        H.cleanRecursively = function (newer, older) {\n            var result = {};\n            objectEach(newer, function (val, key) {\n                var ob;\n                // Dive into objects (except DOM nodes)\n                if (isObject(newer[key], true) &&\n                    !newer.nodeType && // #10044\n                    older[key]) {\n                    ob = H.cleanRecursively(newer[key], older[key]);\n                    if (Object.keys(ob).length) {\n                        result[key] = ob;\n                    }\n                    // Arrays, primitives and DOM nodes are copied directly\n                }\n                else if (isObject(newer[key]) ||\n                    newer[key] !== older[key]) {\n                    result[key] = newer[key];\n                }\n            });\n            return result;\n        };\n        // Extend the Chart prototype for dynamic methods\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n            /**\n             * Add a series to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initialized, add the series as a configuration\n             * option instead. With multiple axes, the `offset` is dynamically adjusted.\n             *\n             * @sample highcharts/members/chart-addseries/\n             *         Add a series from a button\n             * @sample stock/members/chart-addseries/\n             *         Add a series in Highstock\n             *\n             * @function Highcharts.Chart#addSeries\n             *\n             * @param {Highcharts.SeriesOptionsType} options\n             *        The config options for the series.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {Highcharts.Series}\n             *         The newly created series object.\n             *\n             * @fires Highcharts.Chart#event:addSeries\n             * @fires Highcharts.Chart#event:afterAddSeries\n             */\n            addSeries: function (options, redraw, animation) {\n                var series,\n                    chart = this;\n                if (options) { // <- not necessary\n                    redraw = pick(redraw, true); // defaults to true\n                    fireEvent(chart, 'addSeries', { options: options }, function () {\n                        series = chart.initSeries(options);\n                        chart.isDirtyLegend = true;\n                        chart.linkSeries();\n                        if (series.enabledDataSorting) {\n                            // We need to call `setData` after `linkSeries`\n                            series.setData(options.data, false);\n                        }\n                        fireEvent(chart, 'afterAddSeries', { series: series });\n                        if (redraw) {\n                            chart.redraw(animation);\n                        }\n                    });\n                }\n                return series;\n            },\n            /**\n             * Add an axis to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initialized, add the axis as a configuration\n             * option instead.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Chart#addAxis\n             *\n             * @param {Highcharts.AxisOptions} options\n             *        The axis options.\n             *\n             * @param {boolean} [isX=false]\n             *        Whether it is an X axis or a value axis.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation in the redraw.\n             *\n             * @return {Highcharts.Axis}\n             *         The newly generated Axis object.\n             */\n            addAxis: function (options, isX, redraw, animation) {\n                return this.createAxis(isX ? 'xAxis' : 'yAxis', { axis: options, redraw: redraw, animation: animation });\n            },\n            /**\n             * Add a color axis to the chart after render time. Note that this method\n             * should never be used when adding data synchronously at chart render time,\n             * as it adds expense to the calculations and rendering. When adding data at\n             * the same time as the chart is initialized, add the axis as a\n             * configuration option instead.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Chart#addColorAxis\n             *\n             * @param {Highcharts.ColorAxisOptions} options\n             *        The axis options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation in the redraw.\n             *\n             * @return {Highcharts.ColorAxis}\n             *         The newly generated Axis object.\n             */\n            addColorAxis: function (options, redraw, animation) {\n                return this.createAxis('colorAxis', { axis: options, redraw: redraw, animation: animation });\n            },\n            /**\n             * Factory for creating different axis types.\n             *\n             * @private\n             * @function Highcharts.Chart#createAxis\n             *\n             * @param {string} type\n             *        An axis type.\n             *\n             * @param {...Array<*>} arguments\n             *        All arguments for the constructor.\n             *\n             * @return {Highcharts.Axis | Highcharts.ColorAxis}\n             *         The newly generated Axis object.\n             */\n            createAxis: function (type, options) {\n                var chartOptions = this.options,\n                    isColorAxis = type === 'colorAxis',\n                    axisOptions = options.axis,\n                    redraw = options.redraw,\n                    animation = options.animation,\n                    userOptions = merge(axisOptions, {\n                        index: this[type].length,\n                        isX: type === 'xAxis'\n                    }),\n                    axis;\n                if (isColorAxis) {\n                    axis = new H.ColorAxis(this, userOptions);\n                }\n                else {\n                    axis = new Axis(this, userOptions);\n                }\n                // Push the new axis options to the chart options\n                chartOptions[type] = splat(chartOptions[type] || {});\n                chartOptions[type].push(userOptions);\n                if (isColorAxis) {\n                    this.isDirtyLegend = true;\n                    // Clear before 'bindAxes' (#11924)\n                    this.axes.forEach(function (axis) {\n                        axis.series = [];\n                    });\n                    this.series.forEach(function (series) {\n                        series.bindAxes();\n                        series.isDirtyData = true;\n                    });\n                }\n                if (pick(redraw, true)) {\n                    this.redraw(animation);\n                }\n                return axis;\n            },\n            /**\n             * Dim the chart and show a loading text or symbol. Options for the loading\n             * screen are defined in {@link\n             * https://api.highcharts.com/highcharts/loading|the loading options}.\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample highcharts/members/chart-showloading/\n             *         Apply different text labels\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             *\n             * @function Highcharts.Chart#showLoading\n             *\n             * @param {string} [str]\n             *        An optional text to show in the loading label instead of the\n             *        default one. The default text is set in\n             *        [lang.loading](https://api.highcharts.com/highcharts/lang.loading).\n             */\n            showLoading: function (str) {\n                var chart = this,\n                    options = chart.options,\n                    loadingDiv = chart.loadingDiv,\n                    loadingOptions = options.loading,\n                    setLoadingSize = function () {\n                        if (loadingDiv) {\n                            css(loadingDiv, {\n                                left: chart.plotLeft + 'px',\n                                top: chart.plotTop + 'px',\n                                width: chart.plotWidth + 'px',\n                                height: chart.plotHeight + 'px'\n                            });\n                    }\n                };\n                // create the layer at the first call\n                if (!loadingDiv) {\n                    chart.loadingDiv = loadingDiv = createElement('div', {\n                        className: 'highcharts-loading highcharts-loading-hidden'\n                    }, null, chart.container);\n                    chart.loadingSpan = createElement('span', { className: 'highcharts-loading-inner' }, null, loadingDiv);\n                    addEvent(chart, 'redraw', setLoadingSize); // #1080\n                }\n                loadingDiv.className = 'highcharts-loading';\n                // Update text\n                chart.loadingSpan.innerHTML =\n                    pick(str, options.lang.loading, '');\n                if (!chart.styledMode) {\n                    // Update visuals\n                    css(loadingDiv, extend(loadingOptions.style, {\n                        zIndex: 10\n                    }));\n                    css(chart.loadingSpan, loadingOptions.labelStyle);\n                    // Show it\n                    if (!chart.loadingShown) {\n                        css(loadingDiv, {\n                            opacity: 0,\n                            display: ''\n                        });\n                        animate(loadingDiv, {\n                            opacity: loadingOptions.style.opacity || 0.5\n                        }, {\n                            duration: loadingOptions.showDuration || 0\n                        });\n                    }\n                }\n                chart.loadingShown = true;\n                setLoadingSize();\n            },\n            /**\n             * Hide the loading layer.\n             *\n             * @see Highcharts.Chart#showLoading\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             *\n             * @function Highcharts.Chart#hideLoading\n             */\n            hideLoading: function () {\n                var options = this.options,\n                    loadingDiv = this.loadingDiv;\n                if (loadingDiv) {\n                    loadingDiv.className =\n                        'highcharts-loading highcharts-loading-hidden';\n                    if (!this.styledMode) {\n                        animate(loadingDiv, {\n                            opacity: 0\n                        }, {\n                            duration: options.loading.hideDuration || 100,\n                            complete: function () {\n                                css(loadingDiv, { display: 'none' });\n                            }\n                        });\n                    }\n                }\n                this.loadingShown = false;\n            },\n            /**\n             * These properties cause isDirtyBox to be set to true when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireDirtyBox: [\n                'backgroundColor',\n                'borderColor',\n                'borderWidth',\n                'borderRadius',\n                'plotBackgroundColor',\n                'plotBackgroundImage',\n                'plotBorderColor',\n                'plotBorderWidth',\n                'plotShadow',\n                'shadow'\n            ],\n            /**\n             * These properties require a full reflow of chart elements, best\n             * implemented through running `Chart.setSize` internally (#8190).\n             * @type {Array}\n             */\n            propsRequireReflow: [\n                'margin',\n                'marginTop',\n                'marginRight',\n                'marginBottom',\n                'marginLeft',\n                'spacing',\n                'spacingTop',\n                'spacingRight',\n                'spacingBottom',\n                'spacingLeft'\n            ],\n            /**\n             * These properties cause all series to be updated when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireUpdateSeries: [\n                'chart.inverted',\n                'chart.polar',\n                'chart.ignoreHiddenSeries',\n                'chart.type',\n                'colors',\n                'plotOptions',\n                'time',\n                'tooltip'\n            ],\n            /**\n             * These collections (arrays) implement update() methods with support for\n             * one-to-one option.\n             */\n            collectionsWithUpdate: [\n                'xAxis',\n                'yAxis',\n                'zAxis',\n                'series'\n            ],\n            /**\n             * A generic function to update any element of the chart. Elements can be\n             * enabled and disabled, moved, re-styled, re-formatted etc.\n             *\n             * A special case is configuration objects that take arrays, for example\n             * [xAxis](https://api.highcharts.com/highcharts/xAxis),\n             * [yAxis](https://api.highcharts.com/highcharts/yAxis) or\n             * [series](https://api.highcharts.com/highcharts/series). For these\n             * collections, an `id` option is used to map the new option set to an\n             * existing object. If an existing object of the same id is not found, the\n             * corresponding item is updated. So for example, running `chart.update`\n             * with a series item without an id, will cause the existing chart's series\n             * with the same index in the series array to be updated. When the\n             * `oneToOne` parameter is true, `chart.update` will also take care of\n             * adding and removing items from the collection. Read more under the\n             * parameter description below.\n             *\n             * Note that when changing series data, `chart.update` may mutate the passed\n             * data options.\n             *\n             * See also the\n             * [responsive option set](https://api.highcharts.com/highcharts/responsive).\n             * Switching between `responsive.rules` basically runs `chart.update` under\n             * the hood.\n             *\n             * @sample highcharts/members/chart-update/\n             *         Update chart geometry\n             *\n             * @function Highcharts.Chart#update\n             *\n             * @param {Highcharts.Options} options\n             *        A configuration object for the new chart options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart.\n             *\n             * @param {boolean} [oneToOne=false]\n             *        When `true`, the `series`, `xAxis`, `yAxis` and `annotations`\n             *        collections will be updated one to one, and items will be either\n             *        added or removed to match the new updated options. For example,\n             *        if the chart has two series and we call `chart.update` with a\n             *        configuration containing three series, one will be added. If we\n             *        call `chart.update` with one series, one will be removed. Setting\n             *        an empty `series` array will remove all series, but leaving out\n             *        the`series` property will leave all series untouched. If the\n             *        series have id's, the new series options will be matched by id,\n             *        and the remaining ones removed.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @fires Highcharts.Chart#event:update\n             * @fires Highcharts.Chart#event:afterUpdate\n             */\n            update: function (options, redraw, oneToOne, animation) {\n                var chart = this,\n                    adders = {\n                        credits: 'addCredits',\n                        title: 'setTitle',\n                        subtitle: 'setSubtitle',\n                        caption: 'setCaption'\n                    },\n                    optionsChart,\n                    updateAllAxes,\n                    updateAllSeries,\n                    newWidth,\n                    newHeight,\n                    runSetSize,\n                    isResponsiveOptions = options.isResponsiveOptions,\n                    itemsForRemoval = [];\n                fireEvent(chart, 'update', { options: options });\n                // If there are responsive rules in action, undo the responsive rules\n                // before we apply the updated options and replay the responsive rules\n                // on top from the chart.redraw function (#9617).\n                if (!isResponsiveOptions) {\n                    chart.setResponsive(false, true);\n                }\n                options = H.cleanRecursively(options, chart.options);\n                merge(true, chart.userOptions, options);\n                // If the top-level chart option is present, some special updates are\n                // required\n                optionsChart = options.chart;\n                if (optionsChart) {\n                    merge(true, chart.options.chart, optionsChart);\n                    // Setter function\n                    if ('className' in optionsChart) {\n                        chart.setClassName(optionsChart.className);\n                    }\n                    if ('reflow' in optionsChart) {\n                        chart.setReflow(optionsChart.reflow);\n                    }\n                    if ('inverted' in optionsChart ||\n                        'polar' in optionsChart ||\n                        'type' in optionsChart) {\n                        // Parse options.chart.inverted and options.chart.polar together\n                        // with the available series.\n                        chart.propFromSeries();\n                        updateAllAxes = true;\n                    }\n                    if ('alignTicks' in optionsChart) { // #6452\n                        updateAllAxes = true;\n                    }\n                    objectEach(optionsChart, function (val, key) {\n                        if (chart.propsRequireUpdateSeries.indexOf('chart.' + key) !==\n                            -1) {\n                            updateAllSeries = true;\n                        }\n                        // Only dirty box\n                        if (chart.propsRequireDirtyBox.indexOf(key) !== -1) {\n                            chart.isDirtyBox = true;\n                        }\n                        // Chart setSize\n                        if (chart.propsRequireReflow.indexOf(key) !== -1) {\n                            if (isResponsiveOptions) {\n                                chart.isDirtyBox = true;\n                            }\n                            else {\n                                runSetSize = true;\n                            }\n                        }\n                    });\n                    if (!chart.styledMode && 'style' in optionsChart) {\n                        chart.renderer.setStyle(optionsChart.style);\n                    }\n                }\n                // Moved up, because tooltip needs updated plotOptions (#6218)\n                if (!chart.styledMode && options.colors) {\n                    this.options.colors = options.colors;\n                }\n                if (options.plotOptions) {\n                    merge(true, this.options.plotOptions, options.plotOptions);\n                }\n                // Maintaining legacy global time. If the chart is instanciated first\n                // with global time, then updated with time options, we need to create a\n                // new Time instance to avoid mutating the global time (#10536).\n                if (options.time && this.time === time) {\n                    this.time = new Time(options.time);\n                }\n                // Some option stuctures correspond one-to-one to chart objects that\n                // have update methods, for example\n                // options.credits => chart.credits\n                // options.legend => chart.legend\n                // options.title => chart.title\n                // options.tooltip => chart.tooltip\n                // options.subtitle => chart.subtitle\n                // options.mapNavigation => chart.mapNavigation\n                // options.navigator => chart.navigator\n                // options.scrollbar => chart.scrollbar\n                objectEach(options, function (val, key) {\n                    if (chart[key] &&\n                        typeof chart[key].update === 'function') {\n                        chart[key].update(val, false);\n                        // If a one-to-one object does not exist, look for an adder function\n                    }\n                    else if (typeof chart[adders[key]] === 'function') {\n                        chart[adders[key]](val);\n                    }\n                    if (key !== 'chart' &&\n                        chart.propsRequireUpdateSeries.indexOf(key) !== -1) {\n                        updateAllSeries = true;\n                    }\n                });\n                // Setters for collections. For axes and series, each item is referred\n                // by an id. If the id is not found, it defaults to the corresponding\n                // item in the collection, so setting one series without an id, will\n                // update the first series in the chart. Setting two series without\n                // an id will update the first and the second respectively (#6019)\n                // chart.update and responsive.\n                this.collectionsWithUpdate.forEach(function (coll) {\n                    var indexMap;\n                    if (options[coll]) {\n                        // In stock charts, the navigator series are also part of the\n                        // chart.series array, but those series should not be handled\n                        // here (#8196).\n                        if (coll === 'series') {\n                            indexMap = [];\n                            chart[coll].forEach(function (s, i) {\n                                if (!s.options.isInternal) {\n                                    indexMap.push(pick(s.options.index, i));\n                                }\n                            });\n                        }\n                        splat(options[coll]).forEach(function (newOptions, i) {\n                            var hasId = defined(newOptions.id);\n                            var item;\n                            // Match by id\n                            if (hasId) {\n                                item = chart.get(newOptions.id);\n                            }\n                            // No match by id found, match by index instead\n                            if (!item) {\n                                item = chart[coll][indexMap ? indexMap[i] : i];\n                                // Check if we grabbed an item with an exising but\n                                // different id (#13541)\n                                if (item && hasId && defined(item.options.id)) {\n                                    item = void 0;\n                                }\n                            }\n                            if (item && item.coll === coll) {\n                                item.update(newOptions, false);\n                                if (oneToOne) {\n                                    item.touched = true;\n                                }\n                            }\n                            // If oneToOne and no matching item is found, add one\n                            if (!item && oneToOne && chart.collectionsWithInit[coll]) {\n                                chart.collectionsWithInit[coll][0].apply(chart, \n                                // [newOptions, ...extraArguments, redraw=false]\n                                [\n                                    newOptions\n                                ].concat(\n                                // Not all initializers require extra args\n                                chart.collectionsWithInit[coll][1] || []).concat([\n                                    false\n                                ])).touched = true;\n                            }\n                        });\n                        // Add items for removal\n                        if (oneToOne) {\n                            chart[coll].forEach(function (item) {\n                                if (!item.touched && !item.options.isInternal) {\n                                    itemsForRemoval.push(item);\n                                }\n                                else {\n                                    delete item.touched;\n                                }\n                            });\n                        }\n                    }\n                });\n                itemsForRemoval.forEach(function (item) {\n                    if (item.remove) {\n                        item.remove(false);\n                    }\n                });\n                if (updateAllAxes) {\n                    chart.axes.forEach(function (axis) {\n                        axis.update({}, false);\n                    });\n                }\n                // Certain options require the whole series structure to be thrown away\n                // and rebuilt\n                if (updateAllSeries) {\n                    chart.getSeriesOrderByLinks().forEach(function (series) {\n                        // Avoid removed navigator series\n                        if (series.chart) {\n                            series.update({}, false);\n                        }\n                    }, this);\n                }\n                // For loading, just update the options, do not redraw\n                if (options.loading) {\n                    merge(true, chart.options.loading, options.loading);\n                }\n                // Update size. Redraw is forced.\n                newWidth = optionsChart && optionsChart.width;\n                newHeight = optionsChart && optionsChart.height;\n                if (isString(newHeight)) {\n                    newHeight = relativeLength(newHeight, newWidth || chart.chartWidth);\n                }\n                if (\n                // In this case, run chart.setSize with newWidth and newHeight which\n                // are undefined, only for reflowing chart elements because margin\n                // or spacing has been set (#8190)\n                runSetSize ||\n                    // In this case, the size is actually set\n                    (isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n                    (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n                    chart.setSize(newWidth, newHeight, animation);\n                }\n                else if (pick(redraw, true)) {\n                    chart.redraw(animation);\n                }\n                fireEvent(chart, 'afterUpdate', {\n                    options: options,\n                    redraw: redraw,\n                    animation: animation\n                });\n            },\n            /**\n             * Shortcut to set the subtitle options. This can also be done from {@link\n             * Chart#update} or {@link Chart#setTitle}.\n             *\n             * @function Highcharts.Chart#setSubtitle\n             *\n             * @param {Highcharts.SubtitleOptions} options\n             *        New subtitle options. The subtitle text itself is set by the\n             *        `options.text` property.\n             */\n            setSubtitle: function (options, redraw) {\n                this.applyDescription('subtitle', options);\n                this.layOutTitles(redraw);\n            },\n            /**\n             * Set the caption options. This can also be done from {@link\n             * Chart#update}.\n             *\n             * @function Highcharts.Chart#setCaption\n             *\n             * @param {Highcharts.CaptionOptions} options\n             *        New caption options. The caption text itself is set by the\n             *        `options.text` property.\n             */\n            setCaption: function (options, redraw) {\n                this.applyDescription('caption', options);\n                this.layOutTitles(redraw);\n            }\n        });\n        /**\n         * These collections (arrays) implement `Chart.addSomethig` method used in\n         * chart.update() to create new object in the collection. Equivalent for\n         * deleting is resolved by simple `Somethig.remove()`.\n         *\n         * Note: We need to define these references after initializers are bound to\n         * chart's prototype.\n         */\n        Chart.prototype.collectionsWithInit = {\n            // collectionName: [ initializingMethod, [extraArguments] ]\n            xAxis: [Chart.prototype.addAxis, [true]],\n            yAxis: [Chart.prototype.addAxis, [false]],\n            series: [Chart.prototype.addSeries]\n        };\n        // extend the Point prototype for dynamic methods\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Update point with new options (typically x/y data) and optionally redraw\n             * the series.\n             *\n             * @sample highcharts/members/point-update-column/\n             *         Update column value\n             * @sample highcharts/members/point-update-pie/\n             *         Update pie slice\n             * @sample maps/members/point-update/\n             *         Update map area value in Highmaps\n             *\n             * @function Highcharts.Point#update\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options. Point options are handled as described under\n             *        the `series.type.data` item for each series type. For example\n             *        for a line series, if options is a single number, the point will\n             *        be given that number as the marin y value. If it is an array, it\n             *        will be interpreted as x and y values respectively. If it is an\n             *        object, advanced options are applied.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is updated. If doing\n             *        more operations on the chart, it is best practice to set\n             *        `redraw` to false and call `chart.redraw()` after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:update\n             */\n            update: function (options, redraw, animation, runEvent) {\n                var point = this,\n                    series = point.series,\n                    graphic = point.graphic,\n                    i,\n                    chart = series.chart,\n                    seriesOptions = series.options;\n                redraw = pick(redraw, true);\n                /**\n                 * @private\n                 */\n                function update() {\n                    point.applyOptions(options);\n                    // Update visuals, #4146\n                    // Handle dummy graphic elements for a11y, #12718\n                    var hasDummyGraphic = graphic && point.hasDummyGraphic;\n                    var shouldDestroyGraphic = point.y === null ? !hasDummyGraphic : hasDummyGraphic;\n                    if (graphic && shouldDestroyGraphic) {\n                        point.graphic = graphic.destroy();\n                        delete point.hasDummyGraphic;\n                    }\n                    if (isObject(options, true)) {\n                        // Destroy so we can get new elements\n                        if (graphic && graphic.element) {\n                            // \"null\" is also a valid symbol\n                            if (options &&\n                                options.marker &&\n                                typeof options.marker.symbol !== 'undefined') {\n                                point.graphic = graphic.destroy();\n                            }\n                        }\n                        if (options && options.dataLabels && point.dataLabel) {\n                            point.dataLabel = point.dataLabel.destroy(); // #2468\n                        }\n                        if (point.connector) {\n                            point.connector = point.connector.destroy(); // #7243\n                        }\n                    }\n                    // record changes in the parallel arrays\n                    i = point.index;\n                    series.updateParallelArrays(point, i);\n                    // Record the options to options.data. If the old or the new config\n                    // is an object, use point options, otherwise use raw options\n                    // (#4701, #4916).\n                    seriesOptions.data[i] = (isObject(seriesOptions.data[i], true) ||\n                        isObject(options, true)) ?\n                        point.options :\n                        pick(options, seriesOptions.data[i]);\n                    // redraw\n                    series.isDirty = series.isDirtyData = true;\n                    if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n                        chart.isDirtyBox = true;\n                    }\n                    if (seriesOptions.legendType === 'point') { // #1831, #1885\n                        chart.isDirtyLegend = true;\n                    }\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                }\n                // Fire the event with a default handler of doing the update\n                if (runEvent === false) { // When called from setData\n                    update();\n                }\n                else {\n                    point.firePointEvent('update', { options: options }, update);\n                }\n            },\n            /**\n             * Remove a point and optionally redraw the series and if necessary the axes\n             *\n             * @sample highcharts/plotoptions/series-point-events-remove/\n             *         Remove point and confirm\n             * @sample highcharts/members/point-remove/\n             *         Remove pie slice\n             * @sample maps/members/point-remove/\n             *         Remove selected points in Highmaps\n             *\n             * @function Highcharts.Point#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call. When\n             *        doing more operations on the chart, for example running\n             *        `point.remove()` in a loop, it is best practice to set `redraw`\n             *        to false and call `chart.redraw()` after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=false]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {void}\n             */\n            remove: function (redraw, animation) {\n                this.series.removePoint(this.series.data.indexOf(this), redraw, animation);\n            }\n        });\n        // Extend the series prototype for dynamic methods\n        extend(Series.prototype, /** @lends Series.prototype */ {\n            /**\n             * Add a point to the series after render time. The point can be added at\n             * the end, or by giving it an X value, to the start or in the middle of the\n             * series.\n             *\n             * @sample highcharts/members/series-addpoint-append/\n             *         Append point\n             * @sample highcharts/members/series-addpoint-append-and-shift/\n             *         Append and shift\n             * @sample highcharts/members/series-addpoint-x-and-y/\n             *         Both X and Y values given\n             * @sample highcharts/members/series-addpoint-pie/\n             *         Append pie slice\n             * @sample stock/members/series-addpoint/\n             *         Append 100 points in Highstock\n             * @sample stock/members/series-addpoint-shift/\n             *         Append and shift in Highstock\n             * @sample maps/members/series-addpoint/\n             *         Add a point in Highmaps\n             *\n             * @function Highcharts.Series#addPoint\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options. If options is a single number, a point with\n             *        that y value is appended to the series. If it is an array, it will\n             *        be interpreted as x and y values respectively. If it is an\n             *        object, advanced options as outlined under `series.data` are\n             *        applied.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is added. When adding\n             *        more than one point, it is highly recommended that the redraw\n             *        option be set to false, and instead {@link Chart#redraw} is\n             *        explicitly called after the adding of points is finished.\n             *        Otherwise, the chart will redraw after adding each point.\n             *\n             * @param {boolean} [shift=false]\n             *        If true, a point is shifted off the start of the series as one is\n             *        appended to the end.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @param {boolean} [withEvent=true]\n             *        Used internally, whether to fire the series `addPoint` event.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:addPoint\n             */\n            addPoint: function (options, redraw, shift, animation, withEvent) {\n                var series = this,\n                    seriesOptions = series.options,\n                    data = series.data,\n                    chart = series.chart,\n                    xAxis = series.xAxis,\n                    names = xAxis && xAxis.hasNames && xAxis.names,\n                    dataOptions = seriesOptions.data,\n                    point,\n                    xData = series.xData,\n                    isInTheMiddle,\n                    i,\n                    x;\n                // Optional redraw, defaults to true\n                redraw = pick(redraw, true);\n                // Get options and push the point to xData, yData and series.options. In\n                // series.generatePoints the Point instance will be created on demand\n                // and pushed to the series.data array.\n                point = { series: series };\n                series.pointClass.prototype.applyOptions.apply(point, [options]);\n                x = point.x;\n                // Get the insertion point\n                i = xData.length;\n                if (series.requireSorting && x < xData[i - 1]) {\n                    isInTheMiddle = true;\n                    while (i && xData[i - 1] > x) {\n                        i--;\n                    }\n                }\n                // Insert undefined item\n                series.updateParallelArrays(point, 'splice', i, 0, 0);\n                // Update it\n                series.updateParallelArrays(point, i);\n                if (names && point.name) {\n                    names[x] = point.name;\n                }\n                dataOptions.splice(i, 0, options);\n                if (isInTheMiddle) {\n                    series.data.splice(i, 0, null);\n                    series.processData();\n                }\n                // Generate points to be added to the legend (#1329)\n                if (seriesOptions.legendType === 'point') {\n                    series.generatePoints();\n                }\n                // Shift the first point off the parallel arrays\n                if (shift) {\n                    if (data[0] && data[0].remove) {\n                        data[0].remove(false);\n                    }\n                    else {\n                        data.shift();\n                        series.updateParallelArrays(point, 'shift');\n                        dataOptions.shift();\n                    }\n                }\n                // Fire event\n                if (withEvent !== false) {\n                    fireEvent(series, 'addPoint', { point: point });\n                }\n                // redraw\n                series.isDirty = true;\n                series.isDirtyData = true;\n                if (redraw) {\n                    chart.redraw(animation); // Animation is set anyway on redraw, #5665\n                }\n            },\n            /**\n             * Remove a point from the series. Unlike the\n             * {@link Highcharts.Point#remove} method, this can also be done on a point\n             * that is not instanciated because it is outside the view or subject to\n             * Highstock data grouping.\n             *\n             * @sample highcharts/members/series-removepoint/\n             *         Remove cropped point\n             *\n             * @function Highcharts.Series#removePoint\n             *\n             * @param {number} i\n             *        The index of the point in the {@link Highcharts.Series.data|data}\n             *        array.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is added. When\n             *        removing more than one point, it is highly recommended that the\n             *        `redraw` option be set to `false`, and instead {@link\n             *        Highcharts.Chart#redraw} is explicitly called after the adding of\n             *        points is finished.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether and optionally how the series should be animated.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:remove\n             */\n            removePoint: function (i, redraw, animation) {\n                var series = this,\n                    data = series.data,\n                    point = data[i],\n                    points = series.points,\n                    chart = series.chart,\n                    remove = function () {\n                        if (points && points.length === data.length) { // #4935\n                            points.splice(i, 1);\n                    }\n                    data.splice(i, 1);\n                    series.options.data.splice(i, 1);\n                    series.updateParallelArrays(point || { series: series }, 'splice', i, 1);\n                    if (point) {\n                        point.destroy();\n                    }\n                    // redraw\n                    series.isDirty = true;\n                    series.isDirtyData = true;\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                };\n                setAnimation(animation, chart);\n                redraw = pick(redraw, true);\n                // Fire the event with a default handler of removing the point\n                if (point) {\n                    point.firePointEvent('remove', null, remove);\n                }\n                else {\n                    remove();\n                }\n            },\n            /**\n             * Remove a series and optionally redraw the chart.\n             *\n             * @sample highcharts/members/series-remove/\n             *         Remove first series from a button\n             *\n             * @function Highcharts.Series#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call to\n             *        {@link Highcharts.Chart#redraw}.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @param {boolean} [withEvent=true]\n             *        Used internally, whether to fire the series `remove` event.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:remove\n             */\n            remove: function (redraw, animation, withEvent, keepEvents) {\n                var series = this,\n                    chart = series.chart;\n                /**\n                 * @private\n                 */\n                function remove() {\n                    // Destroy elements\n                    series.destroy(keepEvents);\n                    series.remove = null; // Prevent from doing again (#9097)\n                    // Redraw\n                    chart.isDirtyLegend = chart.isDirtyBox = true;\n                    chart.linkSeries();\n                    if (pick(redraw, true)) {\n                        chart.redraw(animation);\n                    }\n                }\n                // Fire the event with a default handler of removing the point\n                if (withEvent !== false) {\n                    fireEvent(series, 'remove', null, remove);\n                }\n                else {\n                    remove();\n                }\n            },\n            /**\n             * Update the series with a new set of options. For a clean and precise\n             * handling of new options, all methods and elements from the series are\n             * removed, and it is initialized from scratch. Therefore, this method is\n             * more performance expensive than some other utility methods like {@link\n             * Series#setData} or {@link Series#setVisible}.\n             *\n             * Note that `Series.update` may mutate the passed `data` options.\n             *\n             * @sample highcharts/members/series-update/\n             *         Updating series options\n             * @sample maps/members/series-update/\n             *         Update series options in Highmaps\n             *\n             * @function Highcharts.Series#update\n             *\n             * @param {Highcharts.SeriesOptionsType} options\n             *        New options that will be merged with the series' existing options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the series is altered. If doing\n             *        more operations on the chart, it is a good idea to set redraw to\n             *        false and call {@link Chart#redraw} after.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:update\n             * @fires Highcharts.Series#event:afterUpdate\n             */\n            update: function (options, redraw) {\n                options = H.cleanRecursively(options, this.userOptions);\n                fireEvent(this, 'update', { options: options });\n                var series = this,\n                    chart = series.chart, \n                    // must use user options when changing type because series.options\n                    // is merged in with type specific plotOptions\n                    oldOptions = series.userOptions,\n                    seriesOptions,\n                    initialType = series.initialType || series.type,\n                    newType = (options.type ||\n                        oldOptions.type ||\n                        chart.options.chart.type),\n                    keepPoints = !(\n                    // Indicators, histograms etc recalculate the data. It should be\n                    // possible to omit this.\n                    this.hasDerivedData ||\n                        // Changes to data grouping requires new points in new groups\n                        options.dataGrouping ||\n                        // New type requires new point classes\n                        (newType && newType !== this.type) ||\n                        // New options affecting how the data points are built\n                        typeof options.pointStart !== 'undefined' ||\n                        options.pointInterval ||\n                        options.pointIntervalUnit ||\n                        options.keys),\n                    initialSeriesProto = seriesTypes[initialType].prototype,\n                    n,\n                    groups = [\n                        'group',\n                        'markerGroup',\n                        'dataLabelsGroup',\n                        'transformGroup'\n                    ],\n                    preserve = [\n                        'eventOptions',\n                        'navigatorSeries',\n                        'baseSeries'\n                    ], \n                    // Animation must be enabled when calling update before the initial\n                    // animation has first run. This happens when calling update\n                    // directly after chart initialization, or when applying responsive\n                    // rules (#6912).\n                    animation = series.finishedAnimating && { animation: false },\n                    kinds = {};\n                if (keepPoints) {\n                    preserve.push('data', 'isDirtyData', 'points', 'processedXData', 'processedYData', 'xIncrement', 'cropped', '_hasPointMarkers', '_hasPointLabels', \n                    // Map specific, consider moving it to series-specific preserve-\n                    // properties (#10617)\n                    'mapMap', 'mapData', 'minY', 'maxY', 'minX', 'maxX');\n                    if (options.visible !== false) {\n                        preserve.push('area', 'graph');\n                    }\n                    series.parallelArrays.forEach(function (key) {\n                        preserve.push(key + 'Data');\n                    });\n                    if (options.data) {\n                        // setData uses dataSorting options so we need to update them\n                        // earlier\n                        if (options.dataSorting) {\n                            extend(series.options.dataSorting, options.dataSorting);\n                        }\n                        this.setData(options.data, false);\n                    }\n                }\n                // Do the merge, with some forced options\n                options = merge(oldOptions, animation, {\n                    // When oldOptions.index is null it should't be cleared.\n                    // Otherwise navigator series will have wrong indexes (#10193).\n                    index: typeof oldOptions.index === 'undefined' ?\n                        series.index : oldOptions.index,\n                    pointStart: pick(\n                    // when updating from blank (#7933)\n                    oldOptions.pointStart, \n                    // when updating after addPoint\n                    series.xData[0])\n                }, (!keepPoints && { data: series.options.data }), options);\n                // Merge does not merge arrays, but replaces them. Since points were\n                // updated, `series.options.data` has correct merged options, use it:\n                if (keepPoints && options.data) {\n                    options.data = series.options.data;\n                }\n                // Make sure preserved properties are not destroyed (#3094)\n                preserve = groups.concat(preserve);\n                preserve.forEach(function (prop) {\n                    preserve[prop] = series[prop];\n                    delete series[prop];\n                });\n                // Destroy the series and delete all properties. Reinsert all\n                // methods and properties from the new type prototype (#2270,\n                // #3719).\n                series.remove(false, null, false, true);\n                for (n in initialSeriesProto) { // eslint-disable-line guard-for-in\n                    series[n] = void 0;\n                }\n                if (seriesTypes[newType || initialType]) {\n                    extend(series, seriesTypes[newType || initialType].prototype);\n                }\n                else {\n                    error(17, true, chart, { missingModuleFor: (newType || initialType) });\n                }\n                // Re-register groups (#3094) and other preserved properties\n                preserve.forEach(function (prop) {\n                    series[prop] = preserve[prop];\n                });\n                series.init(chart, options);\n                // Remove particular elements of the points. Check `series.options`\n                // because we need to consider the options being set on plotOptions as\n                // well.\n                if (keepPoints && this.points) {\n                    seriesOptions = series.options;\n                    // What kind of elements to destroy\n                    if (seriesOptions.visible === false) {\n                        kinds.graphic = 1;\n                        kinds.dataLabel = 1;\n                    }\n                    else if (!series._hasPointLabels) {\n                        var marker = seriesOptions.marker,\n                            dataLabels = seriesOptions.dataLabels;\n                        if (marker && (marker.enabled === false ||\n                            'symbol' in marker // #10870\n                        )) {\n                            kinds.graphic = 1;\n                        }\n                        if (dataLabels &&\n                            dataLabels.enabled === false) {\n                            kinds.dataLabel = 1;\n                        }\n                    }\n                    this.points.forEach(function (point) {\n                        if (point && point.series) {\n                            point.resolveColor();\n                            // Destroy elements in order to recreate based on updated\n                            // series options.\n                            if (Object.keys(kinds).length) {\n                                point.destroyElements(kinds);\n                            }\n                            if (seriesOptions.showInLegend === false &&\n                                point.legendItem) {\n                                chart.legend.destroyItem(point);\n                            }\n                        }\n                    }, this);\n                }\n                series.initialType = initialType;\n                chart.linkSeries(); // Links are lost in series.remove (#3028)\n                fireEvent(this, 'afterUpdate');\n                if (pick(redraw, true)) {\n                    chart.redraw(keepPoints ? void 0 : false);\n                }\n            },\n            /**\n             * Used from within series.update\n             *\n             * @private\n             * @function Highcharts.Series#setName\n             *\n             * @param {string} name\n             *\n             * @return {void}\n             */\n            setName: function (name) {\n                this.name = this.options.name = this.userOptions.name = name;\n                this.chart.isDirtyLegend = true;\n            }\n        });\n        // Extend the Axis.prototype for dynamic methods\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n            /**\n             * Update an axis object with a new set of options. The options are merged\n             * with the existing options, so only new or altered options need to be\n             * specified.\n             *\n             * @sample highcharts/members/axis-update/\n             *         Axis update demo\n             *\n             * @function Highcharts.Axis#update\n             *\n             * @param {Highcharts.AxisOptions} options\n             *        The new options that will be merged in with existing options on\n             *        the axis.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the axis is altered. If doing\n             *        more operations on the chart, it is a good idea to set redraw to\n             *        false and call {@link Chart#redraw} after.\n             *\n             * @return {void}\n             */\n            update: function (options, redraw) {\n                var chart = this.chart,\n                    newEvents = ((options && options.events) || {});\n                options = merge(this.userOptions, options);\n                // Color Axis is not an array,\n                // This change is applied in the ColorAxis wrapper\n                if (chart.options[this.coll].indexOf) {\n                    // Don't use this.options.index,\n                    // StockChart has Axes in navigator too\n                    chart.options[this.coll][chart.options[this.coll].indexOf(this.userOptions)] = options;\n                }\n                // Remove old events, if no new exist (#8161)\n                objectEach(chart.options[this.coll].events, function (fn, ev) {\n                    if (typeof newEvents[ev] === 'undefined') {\n                        newEvents[ev] = void 0;\n                    }\n                });\n                this.destroy(true);\n                this.init(chart, extend(options, { events: newEvents }));\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Remove the axis from the chart.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Axis#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart following the remove.\n             *\n             * @return {void}\n             */\n            remove: function (redraw) {\n                var chart = this.chart,\n                    key = this.coll, // xAxis or yAxis\n                    axisSeries = this.series,\n                    i = axisSeries.length;\n                // Remove associated series (#2687)\n                while (i--) {\n                    if (axisSeries[i]) {\n                        axisSeries[i].remove(false);\n                    }\n                }\n                // Remove the axis\n                erase(chart.axes, this);\n                erase(chart[key], this);\n                if (isArray(chart.options[key])) {\n                    chart.options[key].splice(this.options.index, 1);\n                }\n                else { // color axis, #6488\n                    delete chart.options[key];\n                }\n                chart[key].forEach(function (axis, i) {\n                    // Re-index, #1706, #8075\n                    axis.options.index = axis.userOptions.index = i;\n                });\n                this.destroy();\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Update the axis title by options after render time.\n             *\n             * @sample highcharts/members/axis-settitle/\n             *         Set a new Y axis title\n             *\n             * @function Highcharts.Axis#setTitle\n             *\n             * @param {Highcharts.AxisTitleOptions} titleOptions\n             *        The additional title options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after setting the title.\n             *\n             * @return {void}\n             */\n            setTitle: function (titleOptions, redraw) {\n                this.update({ title: titleOptions }, redraw);\n            },\n            /**\n             * Set new axis categories and optionally redraw.\n             *\n             * @sample highcharts/members/axis-setcategories/\n             *         Set categories by click on a button\n             *\n             * @function Highcharts.Axis#setCategories\n             *\n             * @param {Array<string>} categories\n             *        The new categories.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart.\n             *\n             * @return {void}\n             */\n            setCategories: function (categories, redraw) {\n                this.update({ categories: categories }, redraw);\n            }\n        });\n\n    });\n    _registerModule(_modules, 'parts/AreaSeries.js', [_modules['parts/Globals.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Utilities.js']], function (H, Color, LegendSymbolMixin, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var objectEach = U.objectEach,\n            pick = U.pick,\n            seriesType = U.seriesType;\n        var Series = H.Series;\n        /**\n         * Area series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.area\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('area', 'line', \n        /**\n         * The area series type.\n         *\n         * @sample {highcharts} highcharts/demo/area-basic/\n         *         Area chart\n         * @sample {highstock} stock/demo/area/\n         *         Area chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.area\n         */\n        {\n            /**\n             * Fill color or gradient for the area. When `null`, the series' `color`\n             * is used with the series' `fillOpacity`.\n             *\n             * In styled mode, the fill color can be set with the `.highcharts-area`\n             * class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-fillcolor-default/\n             *         Null by default\n             * @sample {highcharts} highcharts/plotoptions/area-fillcolor-gradient/\n             *         Gradient\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.fillColor\n             */\n            /**\n             * Fill opacity for the area. When you set an explicit `fillColor`,\n             * the `fillOpacity` is not applied. Instead, you should define the\n             * opacity in the `fillColor` with an rgba color definition. The\n             * `fillOpacity` setting, also the default setting, overrides the alpha\n             * component of the `color` setting.\n             *\n             * In styled mode, the fill opacity can be set with the\n             * `.highcharts-area` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-fillopacity/\n             *         Automatic fill color and fill opacity of 0.1\n             *\n             * @type      {number}\n             * @default   {highcharts} 0.75\n             * @default   {highstock} 0.75\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.fillOpacity\n             */\n            /**\n             * A separate color for the graph line. By default the line takes the\n             * `color` of the series, but the lineColor setting allows setting a\n             * separate color for the line without altering the `fillColor`.\n             *\n             * In styled mode, the line stroke can be set with the\n             * `.highcharts-graph` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-linecolor/\n             *         Dark gray line\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.lineColor\n             */\n            /**\n             * A separate color for the negative part of the area.\n             *\n             * In styled mode, a negative color is set with the\n             * `.highcharts-negative` class name.\n             *\n             * @see [negativeColor](#plotOptions.area.negativeColor)\n             *\n             * @sample {highcharts} highcharts/css/series-negative-color/\n             *         Negative color in styled mode\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.area.negativeFillColor\n             */\n            /**\n             * Whether the whole area or just the line should respond to mouseover\n             * tooltips and other mouse or touch events.\n             *\n             * @sample {highcharts|highstock} highcharts/plotoptions/area-trackbyarea/\n             *         Display the tooltip when the area is hovered\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     1.1.6\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.trackByArea\n             */\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             */\n            softThreshold: false,\n            /**\n             * The Y axis value to serve as the base for the area, for\n             * distinguishing between values above and below a threshold. The area\n             * between the graph and the threshold is filled.\n             *\n             * * If a number is given, the Y axis will scale to the threshold.\n             * * If `null`, the scaling behaves like a line series with fill between\n             *   the graph and the Y axis minimum.\n             * * If `Infinity` or `-Infinity`, the area between the graph and the\n             *   corresponding Y axis extreme is filled (since v6.1.0).\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-threshold/\n             *         A threshold of 100\n             * @sample {highcharts} highcharts/plotoptions/area-threshold-infinity/\n             *         A threshold of Infinity\n             *\n             * @type    {number|null}\n             * @since   2.0\n             * @product highcharts highstock\n             */\n            threshold: 0\n        }, \n        /* eslint-disable valid-jsdoc */\n        /**\n         * @lends seriesTypes.area.prototype\n         */\n        {\n            singleStacks: false,\n            /**\n             * Return an array of stacked points, where null and missing points are\n             * replaced by dummy points in order for gaps to be drawn correctly in\n             * stacks.\n             * @private\n             */\n            getStackPoints: function (points) {\n                var series = this,\n                    segment = [],\n                    keys = [],\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    stack = yAxis.stacking.stacks[this.stackKey],\n                    pointMap = {},\n                    seriesIndex = series.index,\n                    yAxisSeries = yAxis.series,\n                    seriesLength = yAxisSeries.length,\n                    visibleSeries,\n                    upOrDown = pick(yAxis.options.reversedStacks,\n                    true) ? 1 : -1,\n                    i;\n                points = points || this.points;\n                if (this.options.stacking) {\n                    for (i = 0; i < points.length; i++) {\n                        // Reset after point update (#7326)\n                        points[i].leftNull = points[i].rightNull = void 0;\n                        // Create a map where we can quickly look up the points by\n                        // their X values.\n                        pointMap[points[i].x] = points[i];\n                    }\n                    // Sort the keys (#1651)\n                    objectEach(stack, function (stackX, x) {\n                        // nulled after switching between\n                        // grouping and not (#1651, #2336)\n                        if (stackX.total !== null) {\n                            keys.push(x);\n                        }\n                    });\n                    keys.sort(function (a, b) {\n                        return a - b;\n                    });\n                    visibleSeries = yAxisSeries.map(function (s) {\n                        return s.visible;\n                    });\n                    keys.forEach(function (x, idx) {\n                        var y = 0,\n                            stackPoint,\n                            stackedValues;\n                        if (pointMap[x] && !pointMap[x].isNull) {\n                            segment.push(pointMap[x]);\n                            // Find left and right cliff. -1 goes left, 1 goes\n                            // right.\n                            [-1, 1].forEach(function (direction) {\n                                var nullName = direction === 1 ?\n                                        'rightNull' :\n                                        'leftNull',\n                                    cliffName = direction === 1 ?\n                                        'rightCliff' :\n                                        'leftCliff',\n                                    cliff = 0,\n                                    otherStack = stack[keys[idx + direction]];\n                                // If there is a stack next to this one,\n                                // to the left or to the right...\n                                if (otherStack) {\n                                    i = seriesIndex;\n                                    // Can go either up or down,\n                                    // depending on reversedStacks\n                                    while (i >= 0 && i < seriesLength) {\n                                        stackPoint = otherStack.points[i];\n                                        if (!stackPoint) {\n                                            // If the next point in this series\n                                            // is missing, mark the point\n                                            // with point.leftNull or\n                                            // point.rightNull = true.\n                                            if (i === seriesIndex) {\n                                                pointMap[x][nullName] =\n                                                    true;\n                                                // If there are missing points in\n                                                // the next stack in any of the\n                                                // series below this one, we need\n                                                // to substract the missing values\n                                                // and add a hiatus to the left or\n                                                // right.\n                                            }\n                                            else if (visibleSeries[i]) {\n                                                stackedValues =\n                                                    stack[x].points[i];\n                                                if (stackedValues) {\n                                                    cliff -=\n                                                        stackedValues[1] -\n                                                            stackedValues[0];\n                                                }\n                                            }\n                                        }\n                                        // When reversedStacks is true, loop up,\n                                        // else loop down\n                                        i += upOrDown;\n                                    }\n                                }\n                                pointMap[x][cliffName] = cliff;\n                            });\n                            // There is no point for this X value in this series, so we\n                            // insert a dummy point in order for the areas to be drawn\n                            // correctly.\n                        }\n                        else {\n                            // Loop down the stack to find the series below this\n                            // one that has a value (#1991)\n                            i = seriesIndex;\n                            while (i >= 0 && i < seriesLength) {\n                                stackPoint = stack[x].points[i];\n                                if (stackPoint) {\n                                    y = stackPoint[1];\n                                    break;\n                                }\n                                // When reversedStacks is true, loop up, else loop\n                                // down\n                                i += upOrDown;\n                            }\n                            y = yAxis.translate(// #6272\n                            y, 0, 1, 0, 1);\n                            segment.push({\n                                isNull: true,\n                                plotX: xAxis.translate(// #6272\n                                x, 0, 0, 0, 1),\n                                x: x,\n                                plotY: y,\n                                yBottom: y\n                            });\n                        }\n                    });\n                }\n                return segment;\n            },\n            /**\n             * @private\n             */\n            getGraphPath: function (points) {\n                var getGraphPath = Series.prototype.getGraphPath, graphPath, options = this.options, stacking = options.stacking, yAxis = this.yAxis, topPath, bottomPath, bottomPoints = [], graphPoints = [], seriesIndex = this.index, i, areaPath, plotX, stacks = yAxis.stacking.stacks[this.stackKey], threshold = options.threshold, translatedThreshold = Math.round(// #10909\n                    yAxis.getThreshold(options.threshold)), isNull, yBottom, connectNulls = pick(// #10574\n                    options.connectNulls, stacking === 'percent'), \n                    // To display null points in underlying stacked series, this\n                    // series graph must be broken, and the area also fall down to\n                    // fill the gap left by the null point. #2069\n                    addDummyPoints = function (i, otherI, side) {\n                        var point = points[i], stackedValues = stacking &&\n                            stacks[point.x].points[seriesIndex], nullVal = point[side + 'Null'] || 0, cliffVal = point[side + 'Cliff'] || 0, top, bottom, isNull = true;\n                    if (cliffVal || nullVal) {\n                        top = (nullVal ?\n                            stackedValues[0] :\n                            stackedValues[1]) + cliffVal;\n                        bottom = stackedValues[0] + cliffVal;\n                        isNull = !!nullVal;\n                    }\n                    else if (!stacking &&\n                        points[otherI] &&\n                        points[otherI].isNull) {\n                        top = bottom = threshold;\n                    }\n                    // Add to the top and bottom line of the area\n                    if (typeof top !== 'undefined') {\n                        graphPoints.push({\n                            plotX: plotX,\n                            plotY: top === null ?\n                                translatedThreshold :\n                                yAxis.getThreshold(top),\n                            isNull: isNull,\n                            isCliff: true\n                        });\n                        bottomPoints.push({\n                            plotX: plotX,\n                            plotY: bottom === null ?\n                                translatedThreshold :\n                                yAxis.getThreshold(bottom),\n                            doCurve: false // #1041, gaps in areaspline areas\n                        });\n                    }\n                };\n                // Find what points to use\n                points = points || this.points;\n                // Fill in missing points\n                if (stacking) {\n                    points = this.getStackPoints(points);\n                }\n                for (i = 0; i < points.length; i++) {\n                    // Reset after series.update of stacking property (#12033)\n                    if (!stacking) {\n                        points[i].leftCliff = points[i].rightCliff =\n                            points[i].leftNull = points[i].rightNull = void 0;\n                    }\n                    isNull = points[i].isNull;\n                    plotX = pick(points[i].rectPlotX, points[i].plotX);\n                    yBottom = pick(points[i].yBottom, translatedThreshold);\n                    if (!isNull || connectNulls) {\n                        if (!connectNulls) {\n                            addDummyPoints(i, i - 1, 'left');\n                        }\n                        // Skip null point when stacking is false and connectNulls\n                        // true\n                        if (!(isNull && !stacking && connectNulls)) {\n                            graphPoints.push(points[i]);\n                            bottomPoints.push({\n                                x: i,\n                                plotX: plotX,\n                                plotY: yBottom\n                            });\n                        }\n                        if (!connectNulls) {\n                            addDummyPoints(i, i + 1, 'right');\n                        }\n                    }\n                }\n                topPath = getGraphPath.call(this, graphPoints, true, true);\n                bottomPoints.reversed = true;\n                bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n                var firstBottomPoint = bottomPath[0];\n                if (firstBottomPoint && firstBottomPoint[0] === 'M') {\n                    bottomPath[0] = ['L', firstBottomPoint[1], firstBottomPoint[2]];\n                }\n                areaPath = topPath.concat(bottomPath);\n                // TODO: don't set leftCliff and rightCliff when connectNulls?\n                graphPath = getGraphPath\n                    .call(this, graphPoints, false, connectNulls);\n                areaPath.xMap = topPath.xMap;\n                this.areaPath = areaPath;\n                return graphPath;\n            },\n            /**\n             * Draw the graph and the underlying area. This method calls the Series\n             * base function and adds the area. The areaPath is calculated in the\n             * getSegmentPath method called from Series.prototype.drawGraph.\n             * @private\n             */\n            drawGraph: function () {\n                // Define or reset areaPath\n                this.areaPath = [];\n                // Call the base method\n                Series.prototype.drawGraph.apply(this);\n                // Define local variables\n                var series = this,\n                    areaPath = this.areaPath,\n                    options = this.options,\n                    zones = this.zones,\n                    props = [[\n                            'area',\n                            'highcharts-area',\n                            this.color,\n                            options.fillColor\n                        ]]; // area name, main color, fill color\n                    zones.forEach(function (zone,\n                    i) {\n                        props.push([\n                            'zone-area-' + i,\n                            'highcharts-area highcharts-zone-area-' + i + ' ' +\n                                zone.className,\n                            zone.color || series.color,\n                            zone.fillColor || options.fillColor\n                        ]);\n                });\n                props.forEach(function (prop) {\n                    var areaKey = prop[0],\n                        area = series[areaKey],\n                        verb = area ? 'animate' : 'attr',\n                        attribs = {};\n                    // Create or update the area\n                    if (area) { // update\n                        area.endX = series.preventGraphAnimation ?\n                            null :\n                            areaPath.xMap;\n                        area.animate({ d: areaPath });\n                    }\n                    else { // create\n                        attribs.zIndex = 0; // #1069\n                        area = series[areaKey] = series.chart.renderer\n                            .path(areaPath)\n                            .addClass(prop[1])\n                            .add(series.group);\n                        area.isArea = true;\n                    }\n                    if (!series.chart.styledMode) {\n                        attribs.fill = pick(prop[3], color(prop[2])\n                            .setOpacity(pick(options.fillOpacity, 0.75))\n                            .get());\n                    }\n                    area[verb](attribs);\n                    area.startX = areaPath.xMap;\n                    area.shiftUnit = options.step ? 2 : 1;\n                });\n            },\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n        /* eslint-enable valid-jsdoc */\n        /**\n         * A `area` series. If the [type](#series.area.type) option is not\n         * specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.area\n         * @excluding dataParser, dataURL, useOhlcData\n         * @product   highcharts highstock\n         * @apioption series.area\n         */\n        /**\n         * An array of data points for the series. For the `area` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` * and `pointInterval` given in the series options. If the\n         *    axis has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 9],\n         *        [1, 7],\n         *        [2, 6]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.area.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.area.data\n         */\n        ''; // adds doclets above to transpilat\n\n    });\n    _registerModule(_modules, 'parts/SplineSeries.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var pick = U.pick,\n            seriesType = U.seriesType;\n        /**\n         * Spline series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.spline\n         *\n         * @augments Highcarts.Series\n         */\n        seriesType('spline', 'line', \n        /**\n         * A spline series is a special type of line series, where the segments\n         * between the data points are smoothed.\n         *\n         * @sample {highcharts} highcharts/demo/spline-irregular-time/\n         *         Spline chart\n         * @sample {highstock} stock/demo/spline/\n         *         Spline chart\n         *\n         * @extends      plotOptions.series\n         * @excluding    step\n         * @product      highcharts highstock\n         * @optionparent plotOptions.spline\n         */\n        {}, \n        /**\n         * @lends seriesTypes.spline.prototype\n         */\n        {\n            /* eslint-disable valid-jsdoc */\n            /**\n             * Get the spline segment from a given point's previous neighbour to the\n             * given point.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.spline#getPointSpline\n             *\n             * @param {Array<Highcharts.Point>}\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @param {number} i\n             *\n             * @return {Highcharts.SVGPathArray}\n             */\n            getPointSpline: function (points, point, i) {\n                var \n                    // 1 means control points midway between points, 2 means 1/3\n                    // from the point, 3 is 1/4 etc\n                    smoothing = 1.5,\n                    denom = smoothing + 1,\n                    plotX = point.plotX || 0,\n                    plotY = point.plotY || 0,\n                    lastPoint = points[i - 1],\n                    nextPoint = points[i + 1],\n                    leftContX,\n                    leftContY,\n                    rightContX,\n                    rightContY,\n                    ret;\n                /**\n                 * @private\n                 */\n                function doCurve(otherPoint) {\n                    return otherPoint &&\n                        !otherPoint.isNull &&\n                        otherPoint.doCurve !== false &&\n                        // #6387, area splines next to null:\n                        !point.isCliff;\n                }\n                // Find control points\n                if (doCurve(lastPoint) && doCurve(nextPoint)) {\n                    var lastX = lastPoint.plotX || 0,\n                        lastY = lastPoint.plotY || 0,\n                        nextX = nextPoint.plotX || 0,\n                        nextY = nextPoint.plotY || 0,\n                        correction = 0;\n                    leftContX = (smoothing * plotX + lastX) / denom;\n                    leftContY = (smoothing * plotY + lastY) / denom;\n                    rightContX = (smoothing * plotX + nextX) / denom;\n                    rightContY = (smoothing * plotY + nextY) / denom;\n                    // Have the two control points make a straight line through main\n                    // point\n                    if (rightContX !== leftContX) { // #5016, division by zero\n                        correction = (((rightContY - leftContY) *\n                            (rightContX - plotX)) /\n                            (rightContX - leftContX) + plotY - rightContY);\n                    }\n                    leftContY += correction;\n                    rightContY += correction;\n                    // to prevent false extremes, check that control points are\n                    // between neighbouring points' y values\n                    if (leftContY > lastY && leftContY > plotY) {\n                        leftContY = Math.max(lastY, plotY);\n                        // mirror of left control point\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    else if (leftContY < lastY && leftContY < plotY) {\n                        leftContY = Math.min(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    if (rightContY > nextY && rightContY > plotY) {\n                        rightContY = Math.max(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n                    else if (rightContY < nextY && rightContY < plotY) {\n                        rightContY = Math.min(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n                    // record for drawing in next point\n                    point.rightContX = rightContX;\n                    point.rightContY = rightContY;\n                }\n                // Visualize control points for debugging\n                /*\n            if (leftContX) {\n                this.chart.renderer.circle(\n                        leftContX + this.chart.plotLeft,\n                        leftContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer.path(['M', leftContX + this.chart.plotLeft,\n                    leftContY + this.chart.plotTop,\n                    'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n            if (rightContX) {\n                this.chart.renderer.circle(\n                        rightContX + this.chart.plotLeft,\n                        rightContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer.path(['M', rightContX + this.chart.plotLeft,\n                    rightContY + this.chart.plotTop,\n                    'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n                // */\n                ret = [\n                    'C',\n                    pick(lastPoint.rightContX, lastPoint.plotX, 0),\n                    pick(lastPoint.rightContY, lastPoint.plotY, 0),\n                    pick(leftContX, plotX, 0),\n                    pick(leftContY, plotY, 0),\n                    plotX,\n                    plotY\n                ];\n                // reset for updating series later\n                lastPoint.rightContX = lastPoint.rightContY = void 0;\n                return ret;\n            }\n            /* eslint-enable valid-jsdoc */\n        });\n        /**\n         * A `spline` series. If the [type](#series.spline.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.spline\n         * @excluding dataParser, dataURL, step\n         * @product   highcharts highstock\n         * @apioption series.spline\n         */\n        /**\n         * An array of data points for the series. For the `spline` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 9],\n         *        [1, 2],\n         *        [2, 8]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.spline.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 0,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.spline.data\n         */\n        ''; // adds doclets above intro transpilat\n\n    });\n    _registerModule(_modules, 'parts/AreaSplineSeries.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Options.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, O, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var seriesType = U.seriesType;\n        var areaProto = H.seriesTypes.area.prototype;\n        /**\n         * AreaSpline series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.areaspline\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('areaspline', 'spline', \n        /**\n         * The area spline series is an area series where the graph between the\n         * points is smoothed into a spline.\n         *\n         * @sample {highcharts} highcharts/demo/areaspline/\n         *         Area spline chart\n         * @sample {highstock} stock/demo/areaspline/\n         *         Area spline chart\n         *\n         * @extends   plotOptions.area\n         * @excluding step\n         * @product   highcharts highstock\n         * @apioption plotOptions.areaspline\n         */\n        defaultOptions.plotOptions.area, {\n            getStackPoints: areaProto.getStackPoints,\n            getGraphPath: areaProto.getGraphPath,\n            drawGraph: areaProto.drawGraph,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n        /**\n         * A `areaspline` series. If the [type](#series.areaspline.type) option\n         * is not specified, it is inherited from [chart.type](#chart.type).\n         *\n         *\n         * @extends   series,plotOptions.areaspline\n         * @excluding dataParser, dataURL, step\n         * @product   highcharts highstock\n         * @apioption series.areaspline\n         */\n        /**\n         * An array of data points for the series. For the `areaspline` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 10],\n         *        [1, 9],\n         *        [2, 3]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.areaspline.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.areaspline.data\n         */\n        ''; // adds doclets above into transpilat\n\n    });\n    _registerModule(_modules, 'parts/ColumnSeries.js', [_modules['parts/Globals.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Utilities.js']], function (H, Color, LegendSymbolMixin, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Adjusted width and x offset of the columns for grouping.\n         *\n         * @private\n         * @interface Highcharts.ColumnMetricsObject\n         */ /**\n        * Width of the columns.\n        * @name Highcharts.ColumnMetricsObject#width\n        * @type {number}\n        */ /**\n        * Offset of the columns.\n        * @name Highcharts.ColumnMetricsObject#offset\n        * @type {number}\n        */\n        ''; // detach doclets above\n        var color = Color.parse;\n        var animObject = U.animObject,\n            clamp = U.clamp,\n            defined = U.defined,\n            extend = U.extend,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            seriesType = U.seriesType;\n        var noop = H.noop,\n            Series = H.Series,\n            svg = H.svg;\n        /**\n         * The column series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.column\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('column', 'line', \n        /**\n         * Column series display one column per value along an X axis.\n         *\n         * @sample {highcharts} highcharts/demo/column-basic/\n         *         Column chart\n         * @sample {highstock} stock/demo/column/\n         *         Column chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    connectEnds, connectNulls, gapSize, gapUnit, linecap,\n         *               lineWidth, marker, step, useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.column\n         */\n        {\n            /**\n             * The corner radius of the border surrounding each column or bar.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n             *         Rounded columns\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            borderRadius: 0,\n            /**\n             * When using automatic point colors pulled from the global\n             * [colors](colors) or series-specific\n             * [plotOptions.column.colors](series.colors) collections, this option\n             * determines whether the chart should receive one color per series or\n             * one color per point.\n             *\n             * In styled mode, the `colors` or `series.colors` arrays are not\n             * supported, and instead this option gives the points individual color\n             * class names on the form `highcharts-color-{n}`.\n             *\n             * @see [series colors](#plotOptions.column.colors)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-false/\n             *         False by default\n             * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-true/\n             *         True\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     2.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.colorByPoint\n             */\n            /**\n             * A series specific or series type specific color set to apply instead\n             * of the global [colors](#colors) when [colorByPoint](\n             * #plotOptions.column.colorByPoint) is true.\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.colors\n             */\n            /**\n             * When `true`, the columns will center in the category, ignoring null\n             * or missing points. When `false`, space will be reserved for null or\n             * missing points.\n             *\n             * @sample {highcharts} highcharts/series-column/centerincategory/\n             *         Center in category\n             *\n             * @since   8.0.1\n             * @product highcharts highstock gantt\n             */\n            centerInCategory: false,\n            /**\n             * Padding between each value groups, in x axis units.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-grouppadding-default/\n             *         0.2 by default\n             * @sample {highcharts} highcharts/plotoptions/column-grouppadding-none/\n             *         No group padding - all columns are evenly spaced\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            groupPadding: 0.2,\n            /**\n             * Whether to group non-stacked columns or to let them render\n             * independent of each other. Non-grouped columns will be laid out\n             * individually and overlap each other.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-grouping-false/\n             *         Grouping disabled\n             * @sample {highstock} highcharts/plotoptions/column-grouping-false/\n             *         Grouping disabled\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     2.3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.grouping\n             */\n            /**\n             * @ignore-option\n             * @private\n             */\n            marker: null,\n            /**\n             * The maximum allowed pixel width for a column, translated to the\n             * height of a bar in a bar chart. This prevents the columns from\n             * becoming too wide when there is a small number of points in the\n             * chart.\n             *\n             * @see [pointWidth](#plotOptions.column.pointWidth)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-maxpointwidth-20/\n             *         Limited to 50\n             * @sample {highstock} highcharts/plotoptions/column-maxpointwidth-20/\n             *         Limited to 50\n             *\n             * @type      {number}\n             * @since     4.1.8\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.maxPointWidth\n             */\n            /**\n             * Padding between each column or bar, in x axis units.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-default/\n             *         0.1 by default\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-025/\n             *          0.25\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-none/\n             *         0 for tightly packed columns\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            pointPadding: 0.1,\n            /**\n             * A pixel value specifying a fixed width for each column or bar. When\n             * `null`, the width is calculated from the `pointPadding` and\n             * `groupPadding`.\n             *\n             * @see [maxPointWidth](#plotOptions.column.maxPointWidth)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointwidth-20/\n             *         20px wide columns regardless of chart width or the amount of\n             *         data points\n             *\n             * @type      {number}\n             * @since     1.2.5\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.pointWidth\n             */\n            /**\n             * A pixel value specifying a fixed width for the column or bar.\n             * Overrides pointWidth on the series.\n             *\n             * @see [series.pointWidth](#plotOptions.column.pointWidth)\n             *\n             * @type      {number}\n             * @default   undefined\n             * @since     7.0.0\n             * @product   highcharts highstock gantt\n             * @apioption series.column.data.pointWidth\n             */\n            /**\n             * The minimal height for a column or width for a bar. By default,\n             * 0 values are not shown. To visualize a 0 (or close to zero) point,\n             * set the minimal point length to a pixel value like 3\\. In stacked\n             * column charts, minPointLength might not be respected for tightly\n             * packed values.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-minpointlength/\n             *         Zero base value\n             * @sample {highcharts} highcharts/plotoptions/column-minpointlength-pos-and-neg/\n             *         Positive and negative close to zero values\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            minPointLength: 0,\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, event if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            cropThreshold: 50,\n            /**\n             * The X axis range that each point is valid for. This determines the\n             * width of the column. On a categorized axis, the range will be 1\n             * by default (one category unit). On linear and datetime axes, the\n             * range will be computed as the distance between the two closest data\n             * points.\n             *\n             * The default `null` means it is computed automatically, but this\n             * option can be used to override the automatic value.\n             *\n             * This option is set by default to 1 if data sorting is enabled.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointrange/\n             *         Set the point range to one day on a data set with one week\n             *         between the points\n             *\n             * @type    {number|null}\n             * @since   2.3\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            pointRange: null,\n            states: {\n                /**\n                 * Options for the hovered point. These settings override the normal\n                 * state options when a point is moused over or touched.\n                 *\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding halo, lineWidth, lineWidthPlus, marker\n                 * @product   highcharts highstock gantt\n                 */\n                hover: {\n                    /** @ignore-option */\n                    halo: false,\n                    /**\n                     * A specific border color for the hovered point. Defaults to\n                     * inherit the normal state border color.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @product   highcharts gantt\n                     * @apioption plotOptions.column.states.hover.borderColor\n                     */\n                    /**\n                     * A specific color for the hovered point.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @product   highcharts gantt\n                     * @apioption plotOptions.column.states.hover.color\n                     */\n                    /**\n                     * How much to brighten the point on interaction. Requires the\n                     * main color to be defined in hex or rgb(a) format.\n                     *\n                     * In styled mode, the hover brightening is by default replaced\n                     * with a fill-opacity set in the `.highcharts-point:hover`\n                     * rule.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/column-states-hover-brightness/\n                     *         Brighten by 0.5\n                     *\n                     * @product highcharts highstock gantt\n                     */\n                    brightness: 0.1\n                },\n                /**\n                 * Options for the selected point. These settings override the\n                 * normal state options when a point is selected.\n                 *\n                 * @extends   plotOptions.series.states.select\n                 * @excluding halo, lineWidth, lineWidthPlus, marker\n                 * @product   highcharts highstock gantt\n                 */\n                select: {\n                    /**\n                     * A specific color for the selected point.\n                     *\n                     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default #cccccc\n                     * @product highcharts highstock gantt\n                     */\n                    color: '#cccccc',\n                    /**\n                     * A specific border color for the selected point.\n                     *\n                     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default #000000\n                     * @product highcharts highstock gantt\n                     */\n                    borderColor: '#000000'\n                }\n            },\n            dataLabels: {\n                align: void 0,\n                verticalAlign: void 0,\n                /**\n                 * The y position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @type {number}\n                 */\n                y: void 0\n            },\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            softThreshold: false,\n            // false doesn't work well: https://jsfiddle.net/highcharts/hz8fopan/14/\n            /**\n             * @ignore-option\n             * @private\n             */\n            startFromThreshold: true,\n            stickyTracking: false,\n            tooltip: {\n                distance: 6\n            },\n            /**\n             * The Y axis value to serve as the base for the columns, for\n             * distinguishing between values above and below a threshold. If `null`,\n             * the columns extend from the padding Y axis minimum.\n             *\n             * @type    {number|null}\n             * @since   2.0\n             * @product highcharts\n             *\n             * @private\n             */\n            threshold: 0,\n            /**\n             * The width of the border surrounding each column or bar. Defaults to\n             * `1` when there is room for a border, but to `0` when the columns are\n             * so dense that a border would cover the next column.\n             *\n             * In styled mode, the stroke width can be set with the\n             * `.highcharts-point` rule.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n             *         2px black border\n             *\n             * @type      {number}\n             * @default   undefined\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.borderWidth\n             */\n            /**\n             * The color of the border surrounding each column or bar.\n             *\n             * In styled mode, the border stroke can be set with the\n             * `.highcharts-point` rule.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n             *         Dark gray border\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #ffffff\n             * @product   highcharts highstock gantt\n             *\n             * @private\n             */\n            borderColor: '#ffffff'\n        }, \n        /**\n         * @lends seriesTypes.column.prototype\n         */\n        {\n            cropShoulder: 0,\n            // When tooltip is not shared, this series (and derivatives) requires\n            // direct touch/hover. KD-tree does not apply.\n            directTouch: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            // use separate negative stacks, unlike area stacks where a negative\n            // point is substracted from previous (#1910)\n            negStacks: true,\n            /* eslint-disable valid-jsdoc */\n            /**\n             * Initialize the series. Extends the basic Series.init method by\n             * marking other series of the same type as dirty.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#init\n             * @return {void}\n             */\n            init: function () {\n                Series.prototype.init.apply(this, arguments);\n                var series = this,\n                    chart = series.chart;\n                // if the series is added dynamically, force redraw of other\n                // series affected by a new column\n                if (chart.hasRendered) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n            },\n            /**\n             * Return the width and x offset of the columns adjusted for grouping,\n             * groupPadding, pointPadding, pointWidth etc.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#getColumnMetrics\n             * @return {Highcharts.ColumnMetricsObject}\n             */\n            getColumnMetrics: function () {\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    reversedStacks = xAxis.options.reversedStacks, \n                    // Keep backward compatibility: reversed xAxis had reversed\n                    // stacks\n                    reverseStacks = (xAxis.reversed && !reversedStacks) ||\n                        (!xAxis.reversed && reversedStacks),\n                    stackKey,\n                    stackGroups = {},\n                    columnCount = 0;\n                // Get the total number of column type series. This is called on\n                // every series. Consider moving this logic to a chart.orderStacks()\n                // function and call it on init, addSeries and removeSeries\n                if (options.grouping === false) {\n                    columnCount = 1;\n                }\n                else {\n                    series.chart.series.forEach(function (otherSeries) {\n                        var otherYAxis = otherSeries.yAxis,\n                            otherOptions = otherSeries.options,\n                            columnIndex;\n                        if (otherSeries.type === series.type &&\n                            (otherSeries.visible ||\n                                !series.chart.options.chart\n                                    .ignoreHiddenSeries) &&\n                            yAxis.len === otherYAxis.len &&\n                            yAxis.pos === otherYAxis.pos) { // #642, #2086\n                            if (otherOptions.stacking && otherOptions.stacking !== 'group') {\n                                stackKey = otherSeries.stackKey;\n                                if (typeof stackGroups[stackKey] ===\n                                    'undefined') {\n                                    stackGroups[stackKey] = columnCount++;\n                                }\n                                columnIndex = stackGroups[stackKey];\n                            }\n                            else if (otherOptions.grouping !== false) { // #1162\n                                columnIndex = columnCount++;\n                            }\n                            otherSeries.columnIndex = columnIndex;\n                        }\n                    });\n                }\n                var categoryWidth = Math.min(Math.abs(xAxis.transA) * ((xAxis.ordinal && xAxis.ordinal.slope) ||\n                        options.pointRange ||\n                        xAxis.closestPointRange ||\n                        xAxis.tickInterval ||\n                        1), // #2610\n                    xAxis.len // #1535\n                    ),\n                    groupPadding = categoryWidth * options.groupPadding,\n                    groupWidth = categoryWidth - 2 * groupPadding,\n                    pointOffsetWidth = groupWidth / (columnCount || 1),\n                    pointWidth = Math.min(options.maxPointWidth || xAxis.len,\n                    pick(options.pointWidth,\n                    pointOffsetWidth * (1 - 2 * options.pointPadding))),\n                    pointPadding = (pointOffsetWidth - pointWidth) / 2, \n                    // #1251, #3737\n                    colIndex = (series.columnIndex || 0) + (reverseStacks ? 1 : 0),\n                    pointXOffset = pointPadding +\n                        (groupPadding +\n                            colIndex * pointOffsetWidth -\n                            (categoryWidth / 2)) * (reverseStacks ? -1 : 1);\n                // Save it for reading in linked series (Error bars particularly)\n                series.columnMetrics = {\n                    width: pointWidth,\n                    offset: pointXOffset,\n                    paddedWidth: pointOffsetWidth,\n                    columnCount: columnCount\n                };\n                return series.columnMetrics;\n            },\n            /**\n             * Make the columns crisp. The edges are rounded to the nearest full\n             * pixel.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#crispCol\n             * @param {number} x\n             * @param {number} y\n             * @param {number} w\n             * @param {number} h\n             * @return {Highcharts.BBoxObject}\n             */\n            crispCol: function (x, y, w, h) {\n                var chart = this.chart,\n                    borderWidth = this.borderWidth,\n                    xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n                    yCrisp = borderWidth % 2 ? 0.5 : 1,\n                    right,\n                    bottom,\n                    fromTop;\n                if (chart.inverted && chart.renderer.isVML) {\n                    yCrisp += 1;\n                }\n                // Horizontal. We need to first compute the exact right edge, then\n                // round it and compute the width from there.\n                if (this.options.crisp) {\n                    right = Math.round(x + w) + xCrisp;\n                    x = Math.round(x) + xCrisp;\n                    w = right - x;\n                }\n                // Vertical\n                bottom = Math.round(y + h) + yCrisp;\n                fromTop = Math.abs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n                y = Math.round(y) + yCrisp;\n                h = bottom - y;\n                // Top edges are exceptions\n                if (fromTop && h) { // #5146\n                    y -= 1;\n                    h += 1;\n                }\n                return {\n                    x: x,\n                    y: y,\n                    width: w,\n                    height: h\n                };\n            },\n            /**\n             * Adjust for missing columns, according to the `centerInCategory`\n             * option. Missing columns are either single points or stacks where the\n             * point or points are either missing or null.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#adjustForMissingColumns\n             * @param {number} x\n             *        The x coordinate of the column, left side\n             * @param {number} pointWidth\n             *        The pointWidth, already computed upstream\n             * @param {Highcharts.ColumnPoint} point\n             *        The point instance\n             * @param {Highcharts.ColumnMetricsObject} metrics\n             *        The series-wide column metrics\n             * @return {number}\n             *        The adjusted x position, or the original if not adjusted\n             */\n            adjustForMissingColumns: function (x, pointWidth, point, metrics) {\n                var _this = this;\n                var stacking = this.options.stacking;\n                if (!point.isNull && metrics.columnCount > 1) {\n                    var indexInCategory_1 = 0;\n                    var totalInCategory_1 = 0;\n                    // Loop over all the stacks on the Y axis. When stacking is\n                    // enabled, these are real point stacks. When stacking is not\n                    // enabled, but `centerInCategory` is true, there is one stack\n                    // handling the grouping of points in each category. This is\n                    // done in the `setGroupedPoints` function.\n                    Highcharts.objectEach(this.yAxis.stacking && this.yAxis.stacking.stacks, function (stack) {\n                        if (typeof point.x === 'number') {\n                            var stackItem = stack[point.x.toString()];\n                            if (stackItem) {\n                                var pointValues = stackItem.points[_this.index],\n                                    total = stackItem.total;\n                                // If true `stacking` is enabled, count the\n                                // total number of non-null stacks in the\n                                // category, and note which index this point is\n                                // within those stacks.\n                                if (stacking) {\n                                    if (pointValues) {\n                                        indexInCategory_1 = totalInCategory_1;\n                                    }\n                                    if (stackItem.hasValidPoints) {\n                                        totalInCategory_1++;\n                                    }\n                                    // If `stacking` is not enabled, look for the\n                                    // index and total of the `group` stack.\n                                }\n                                else if (H.isArray(pointValues)) {\n                                    indexInCategory_1 = pointValues[1];\n                                    totalInCategory_1 = total || 0;\n                                }\n                            }\n                        }\n                    });\n                    // Compute the adjusted x position\n                    var boxWidth = (totalInCategory_1 - 1) * metrics.paddedWidth +\n                            pointWidth;\n                    x = (point.plotX || 0) + boxWidth / 2 - pointWidth -\n                        indexInCategory_1 * metrics.paddedWidth;\n                }\n                return x;\n            },\n            /**\n             * Translate each point to the plot area coordinate system and find\n             * shape positions\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#translate\n             */\n            translate: function () {\n                var series = this,\n                    chart = series.chart,\n                    options = series.options,\n                    dense = series.dense =\n                        series.closestPointRange * series.xAxis.transA < 2,\n                    borderWidth = series.borderWidth = pick(options.borderWidth,\n                    dense ? 0 : 1 // #3635\n                    ),\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    threshold = options.threshold,\n                    translatedThreshold = series.translatedThreshold =\n                        yAxis.getThreshold(threshold),\n                    minPointLength = pick(options.minPointLength, 5),\n                    metrics = series.getColumnMetrics(),\n                    seriesPointWidth = metrics.width, \n                    // postprocessed for border width\n                    seriesBarW = series.barW =\n                        Math.max(seriesPointWidth, 1 + 2 * borderWidth),\n                    seriesXOffset = series.pointXOffset = metrics.offset,\n                    dataMin = series.dataMin,\n                    dataMax = series.dataMax;\n                if (chart.inverted) {\n                    translatedThreshold -= 0.5; // #3355\n                }\n                // When the pointPadding is 0, we want the columns to be packed\n                // tightly, so we allow individual columns to have individual sizes.\n                // When pointPadding is greater, we strive for equal-width columns\n                // (#2694).\n                if (options.pointPadding) {\n                    seriesBarW = Math.ceil(seriesBarW);\n                }\n                Series.prototype.translate.apply(series);\n                // Record the new values\n                series.points.forEach(function (point) {\n                    var yBottom = pick(point.yBottom,\n                        translatedThreshold),\n                        safeDistance = 999 + Math.abs(yBottom),\n                        pointWidth = seriesPointWidth,\n                        plotX = point.plotX || 0, \n                        // Don't draw too far outside plot area (#1303, #2241,\n                        // #4264)\n                        plotY = clamp(point.plotY, -safeDistance,\n                        yAxis.len + safeDistance),\n                        barX = plotX + seriesXOffset,\n                        barW = seriesBarW,\n                        barY = Math.min(plotY,\n                        yBottom),\n                        up,\n                        barH = Math.max(plotY,\n                        yBottom) - barY;\n                    // Handle options.minPointLength\n                    if (minPointLength && Math.abs(barH) < minPointLength) {\n                        barH = minPointLength;\n                        up = (!yAxis.reversed && !point.negative) ||\n                            (yAxis.reversed && point.negative);\n                        // Reverse zeros if there's no positive value in the series\n                        // in visible range (#7046)\n                        if (isNumber(threshold) &&\n                            isNumber(dataMax) &&\n                            point.y === threshold &&\n                            dataMax <= threshold &&\n                            // and if there's room for it (#7311)\n                            (yAxis.min || 0) < threshold &&\n                            // if all points are the same value (i.e zero) not draw\n                            // as negative points (#10646)\n                            dataMin !== dataMax) {\n                            up = !up;\n                        }\n                        // If stacked...\n                        barY = (Math.abs(barY - translatedThreshold) > minPointLength ?\n                            // ...keep position\n                            yBottom - minPointLength :\n                            // #1485, #4051\n                            translatedThreshold -\n                                (up ? minPointLength : 0));\n                    }\n                    // Handle point.options.pointWidth\n                    // @todo Handle grouping/stacking too. Calculate offset properly\n                    if (defined(point.options.pointWidth)) {\n                        pointWidth = barW =\n                            Math.ceil(point.options.pointWidth);\n                        barX -= Math.round((pointWidth - seriesPointWidth) / 2);\n                    }\n                    // Adjust for null or missing points\n                    if (options.centerInCategory) {\n                        barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n                    }\n                    // Cache for access in polar\n                    point.barX = barX;\n                    point.pointWidth = pointWidth;\n                    // Fix the tooltip on center of grouped columns (#1216, #424,\n                    // #3648)\n                    point.tooltipPos = chart.inverted ?\n                        [\n                            yAxis.len + yAxis.pos - chart.plotLeft - plotY,\n                            xAxis.len + xAxis.pos - chart.plotTop - (plotX || 0) - seriesXOffset - barW / 2,\n                            barH\n                        ] :\n                        [barX + barW / 2, plotY + yAxis.pos -\n                                chart.plotTop, barH];\n                    // Register shape type and arguments to be used in drawPoints\n                    // Allow shapeType defined on pointClass level\n                    point.shapeType =\n                        series.pointClass.prototype.shapeType || 'rect';\n                    point.shapeArgs = series.crispCol.apply(series, point.isNull ?\n                        // #3169, drilldown from null must have a position to work\n                        // from #6585, dataLabel should be placed on xAxis, not\n                        // floating in the middle of the chart\n                        [barX, translatedThreshold, barW, 0] :\n                        [barX, barY, barW, barH]);\n                });\n            },\n            getSymbol: noop,\n            /**\n             * Use a solid rectangle like the area series types\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawLegendSymbol\n             *\n             * @param {Highcharts.Legend} legend\n             *        The legend object\n             *\n             * @param {Highcharts.Series|Highcharts.Point} item\n             *        The series (this) or point\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            /**\n             * Columns have no graph\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawGraph\n             */\n            drawGraph: function () {\n                this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n            },\n            /**\n             * Get presentational attributes\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#pointAttribs\n             *\n             * @param {Highcharts.ColumnPoint} point\n             *\n             * @param {string} state\n             *\n             * @return {Highcharts.SVGAttributes}\n             */\n            pointAttribs: function (point, state) {\n                var options = this.options, stateOptions, ret, p2o = this.pointAttrToOptions || {}, strokeOption = p2o.stroke || 'borderColor', strokeWidthOption = p2o['stroke-width'] || 'borderWidth', fill = (point && point.color) || this.color, \n                    // set to fill when borderColor null:\n                    stroke = ((point && point[strokeOption]) ||\n                        options[strokeOption] ||\n                        this.color ||\n                        fill), strokeWidth = (point && point[strokeWidthOption]) ||\n                        options[strokeWidthOption] ||\n                        this[strokeWidthOption] || 0, dashstyle = (point && point.options.dashStyle) || options.dashStyle, opacity = pick(point && point.opacity, options.opacity, 1), zone, brightness;\n                // Handle zone colors\n                if (point && this.zones.length) {\n                    zone = point.getZone();\n                    // When zones are present, don't use point.color (#4267).\n                    // Changed order (#6527), added support for colorAxis (#10670)\n                    fill = (point.options.color ||\n                        (zone && (zone.color || point.nonZonedColor)) ||\n                        this.color);\n                    if (zone) {\n                        stroke = zone.borderColor || stroke;\n                        dashstyle = zone.dashStyle || dashstyle;\n                        strokeWidth = zone.borderWidth || strokeWidth;\n                    }\n                }\n                // Select or hover states\n                if (state && point) {\n                    stateOptions = merge(options.states[state], \n                    // #6401\n                    point.options.states &&\n                        point.options.states[state] ||\n                        {});\n                    brightness = stateOptions.brightness;\n                    fill =\n                        stateOptions.color || (typeof brightness !== 'undefined' &&\n                            color(fill)\n                                .brighten(stateOptions.brightness)\n                                .get()) || fill;\n                    stroke = stateOptions[strokeOption] || stroke;\n                    strokeWidth =\n                        stateOptions[strokeWidthOption] || strokeWidth;\n                    dashstyle = stateOptions.dashStyle || dashstyle;\n                    opacity = pick(stateOptions.opacity, opacity);\n                }\n                ret = {\n                    fill: fill,\n                    stroke: stroke,\n                    'stroke-width': strokeWidth,\n                    opacity: opacity\n                };\n                if (dashstyle) {\n                    ret.dashstyle = dashstyle;\n                }\n                return ret;\n            },\n            /**\n             * Draw the columns. For bars, the series.group is rotated, so the same\n             * coordinates apply for columns and bars. This method is inherited by\n             * scatter series.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawPoints\n             */\n            drawPoints: function () {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    shapeArgs;\n                // draw the columns\n                series.points.forEach(function (point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        hasGraphic = !!graphic,\n                        verb = graphic && chart.pointCount < animationLimit ?\n                            'animate' : 'attr';\n                    if (isNumber(plotY) && point.y !== null) {\n                        shapeArgs = point.shapeArgs;\n                        // When updating a series between 2d and 3d or cartesian and\n                        // polar, the shape type changes.\n                        if (graphic && point.hasNewShapeType()) {\n                            graphic = graphic.destroy();\n                        }\n                        // Set starting position for point sliding animation.\n                        if (series.enabledDataSorting) {\n                            point.startXPos = series.xAxis.reversed ?\n                                -(shapeArgs ? shapeArgs.width : 0) :\n                                series.xAxis.width;\n                        }\n                        if (!graphic) {\n                            point.graphic = graphic =\n                                renderer[point.shapeType](shapeArgs)\n                                    .add(point.group || series.group);\n                            if (graphic &&\n                                series.enabledDataSorting &&\n                                chart.hasRendered &&\n                                chart.pointCount < animationLimit) {\n                                graphic.attr({\n                                    x: point.startXPos\n                                });\n                                hasGraphic = true;\n                                verb = 'animate';\n                            }\n                        }\n                        if (graphic && hasGraphic) { // update\n                            graphic[verb](merge(shapeArgs));\n                        }\n                        // Border radius is not stylable (#6900)\n                        if (options.borderRadius) {\n                            graphic[verb]({\n                                r: options.borderRadius\n                            });\n                        }\n                        // Presentational\n                        if (!chart.styledMode) {\n                            graphic[verb](series.pointAttribs(point, (point.selected && 'select')))\n                                .shadow(point.allowShadow !== false && options.shadow, null, options.stacking && !options.borderRadius);\n                        }\n                        graphic.addClass(point.getClassName(), true);\n                    }\n                    else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            },\n            /**\n             * Animate the column heights one by one from zero.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#animate\n             *\n             * @param {boolean} init\n             *        Whether to initialize the animation or run it\n             */\n            animate: function (init) {\n                var series = this,\n                    yAxis = this.yAxis,\n                    options = series.options,\n                    inverted = this.chart.inverted,\n                    attr = {},\n                    translateProp = inverted ? 'translateX' : 'translateY',\n                    translateStart,\n                    translatedThreshold;\n                if (init) {\n                    attr.scaleY = 0.001;\n                    translatedThreshold = clamp(yAxis.toPixels(options.threshold), yAxis.pos, yAxis.pos + yAxis.len);\n                    if (inverted) {\n                        attr.translateX = translatedThreshold - yAxis.len;\n                    }\n                    else {\n                        attr.translateY = translatedThreshold;\n                    }\n                    // apply finnal clipping (used in Highstock) (#7083)\n                    // animation is done by scaleY, so cliping is for panes\n                    if (series.clipBox) {\n                        series.setClip();\n                    }\n                    series.group.attr(attr);\n                }\n                else { // run the animation\n                    translateStart = series.group.attr(translateProp);\n                    series.group.animate({ scaleY: 1 }, extend(animObject(series.options.animation), {\n                        // Do the scale synchronously to ensure smooth\n                        // updating (#5030, #7228)\n                        step: function (val, fx) {\n                            if (series.group) {\n                                attr[translateProp] = translateStart +\n                                    fx.pos * (yAxis.pos - translateStart);\n                                series.group.attr(attr);\n                            }\n                        }\n                    }));\n                }\n            },\n            /**\n             * Remove this series from the chart\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#remove\n             */\n            remove: function () {\n                var series = this,\n                    chart = series.chart;\n                // column and bar series affects other series of the same type\n                // as they are either stacked or grouped\n                if (chart.hasRendered) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n                Series.prototype.remove.apply(series, arguments);\n            }\n        });\n        /* eslint-enable valid-jsdoc */\n        /**\n         * A `column` series. If the [type](#series.column.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.column\n         * @excluding connectNulls, dataParser, dataURL, gapSize, gapUnit, linecap,\n         *            lineWidth, marker, connectEnds, step\n         * @product   highcharts highstock\n         * @apioption series.column\n         */\n        /**\n         * An array of data points for the series. For the `column` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 6],\n         *        [1, 2],\n         *        [2, 6]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.column.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @excluding marker\n         * @product   highcharts highstock\n         * @apioption series.column.data\n         */\n        /**\n         * The color of the border surrounding the column or bar.\n         *\n         * In styled mode, the border stroke can be set with the `.highcharts-point`\n         * rule.\n         *\n         * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n         *         Dark gray border\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @product   highcharts highstock\n         * @apioption series.column.data.borderColor\n         */\n        /**\n         * The width of the border surrounding the column or bar.\n         *\n         * In styled mode, the stroke width can be set with the `.highcharts-point`\n         * rule.\n         *\n         * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n         *         2px black border\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.column.data.borderWidth\n         */\n        /**\n         * A name for the dash style to use for the column or bar. Overrides\n         * dashStyle on the series.\n         *\n         * In styled mode, the stroke dash-array can be set with the same classes as\n         * listed under [data.color](#series.column.data.color).\n         *\n         * @see [series.pointWidth](#plotOptions.column.dashStyle)\n         *\n         * @type      {Highcharts.DashStyleValue}\n         * @apioption series.column.data.dashStyle\n         */\n        /**\n         * A pixel value specifying a fixed width for the column or bar. Overrides\n         * pointWidth on the series.\n         *\n         * @see [series.pointWidth](#plotOptions.column.pointWidth)\n         *\n         * @type      {number}\n         * @apioption series.column.data.pointWidth\n         */\n        /**\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock\n         * @apioption series.column.states.hover\n         */\n        /**\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock\n         * @apioption series.column.states.select\n         */\n        ''; // includes above doclets in transpilat\n\n    });\n    _registerModule(_modules, 'parts/BarSeries.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var seriesType = U.seriesType;\n        /**\n         * Bar series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.bar\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('bar', 'column', \n        /**\n         * A bar series is a special type of column series where the columns are\n         * horizontal.\n         *\n         * @sample highcharts/demo/bar-basic/\n         *         Bar chart\n         *\n         * @extends   plotOptions.column\n         * @product   highcharts\n         * @apioption plotOptions.bar\n         */\n        /**\n         * @ignore\n         */\n        null, {\n            inverted: true\n        });\n        /**\n         * A `bar` series. If the [type](#series.bar.type) option is not specified,\n         * it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.bar\n         * @excluding connectNulls, dashStyle, dataParser, dataURL, gapSize, gapUnit,\n         *            linecap, lineWidth, marker, connectEnds, step\n         * @product   highcharts\n         * @apioption series.bar\n         */\n        /**\n         * An array of data points for the series. For the `bar` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 5],\n         *        [1, 10],\n         *        [2, 3]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.bar.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 1,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 10,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.column.data\n         * @product   highcharts\n         * @apioption series.bar.data\n         */\n        /**\n         * @excluding halo,lineWidth,lineWidthPlus,marker\n         * @product   highcharts highstock\n         * @apioption series.bar.states.hover\n         */\n        /**\n         * @excluding halo,lineWidth,lineWidthPlus,marker\n         * @product   highcharts highstock\n         * @apioption series.bar.states.select\n         */\n        ''; // gets doclets above into transpilat\n\n    });\n    _registerModule(_modules, 'parts/ScatterSeries.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            seriesType = U.seriesType;\n        var Series = H.Series;\n        /**\n         * Scatter series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.scatter\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('scatter', 'line', \n        /**\n         * A scatter plot uses cartesian coordinates to display values for two\n         * variables for a set of data.\n         *\n         * @sample {highcharts} highcharts/demo/scatter/\n         *         Scatter plot\n         *\n         * @extends      plotOptions.line\n         * @excluding    pointPlacement, shadow, useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.scatter\n         */\n        {\n            /**\n             * The width of the line connecting the data points.\n             *\n             * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-none/\n             *         0 by default\n             * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-1/\n             *         1px\n             *\n             * @product highcharts highstock\n             */\n            lineWidth: 0,\n            findNearestPointBy: 'xy',\n            /**\n             * Apply a jitter effect for the rendered markers. When plotting\n             * discrete values, a little random noise may help telling the points\n             * apart. The jitter setting applies a random displacement of up to `n`\n             * axis units in either direction. So for example on a horizontal X\n             * axis, setting the `jitter.x` to 0.24 will render the point in a\n             * random position between 0.24 units to the left and 0.24 units to the\n             * right of the true axis position. On a category axis, setting it to\n             * 0.5 will fill up the bin and make the data appear continuous.\n             *\n             * When rendered on top of a box plot or a column series, a jitter value\n             * of 0.24 will correspond to the underlying series' default\n             * [groupPadding](\n             * https://api.highcharts.com/highcharts/plotOptions.column.groupPadding)\n             * and [pointPadding](\n             * https://api.highcharts.com/highcharts/plotOptions.column.pointPadding)\n             * settings.\n             *\n             * @sample {highcharts} highcharts/series-scatter/jitter\n             *         Jitter on a scatter plot\n             *\n             * @sample {highcharts} highcharts/series-scatter/jitter-boxplot\n             *         Jittered scatter plot on top of a box plot\n             *\n             * @product highcharts highstock\n             * @since 7.0.2\n             */\n            jitter: {\n                /**\n                 * The maximal X offset for the random jitter effect.\n                 */\n                x: 0,\n                /**\n                 * The maximal Y offset for the random jitter effect.\n                 */\n                y: 0\n            },\n            marker: {\n                enabled: true // Overrides auto-enabling in line series (#3647)\n            },\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event\n             * on a series isn't triggered until the mouse moves over another\n             * series, or out of the plot area. When false, the `mouseOut` event on\n             * a series is triggered when the mouse leaves the area around the\n             * series' graph or markers. This also implies the tooltip. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @product   highcharts highstock\n             * @apioption plotOptions.scatter.stickyTracking\n             */\n            /**\n             * A configuration object for the tooltip rendering of each single\n             * series. Properties are inherited from [tooltip](#tooltip).\n             * Overridable properties are `headerFormat`, `pointFormat`,\n             * `yDecimals`, `xDateFormat`, `yPrefix` and `ySuffix`. Unlike other\n             * series, in a scatter plot the series.name by default shows in the\n             * headerFormat and point.x and point.y in the pointFormat.\n             *\n             * @product highcharts highstock\n             */\n            tooltip: {\n                headerFormat: '<span style=\"color:{point.color}\">\\u25CF</span> ' +\n                    '<span style=\"font-size: 10px\"> {series.name}</span><br/>',\n                pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'\n            }\n            // Prototype members\n        }, {\n            sorted: false,\n            requireSorting: false,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            takeOrdinalPosition: false,\n            /* eslint-disable valid-jsdoc */\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.scatter#drawGraph\n             */\n            drawGraph: function () {\n                if (this.options.lineWidth) {\n                    Series.prototype.drawGraph.call(this);\n                }\n            },\n            // Optionally add the jitter effect\n            applyJitter: function () {\n                var series = this,\n                    jitter = this.options.jitter,\n                    len = this.points.length;\n                /**\n                 * Return a repeatable, pseudo-random number based on an integer\n                 * seed.\n                 * @private\n                 */\n                function unrandom(seed) {\n                    var rand = Math.sin(seed) * 10000;\n                    return rand - Math.floor(rand);\n                }\n                if (jitter) {\n                    this.points.forEach(function (point, i) {\n                        ['x', 'y'].forEach(function (dim, j) {\n                            var axis,\n                                plotProp = 'plot' + dim.toUpperCase(),\n                                min,\n                                max,\n                                translatedJitter;\n                            if (jitter[dim] && !point.isNull) {\n                                axis = series[dim + 'Axis'];\n                                translatedJitter =\n                                    jitter[dim] * axis.transA;\n                                if (axis && !axis.isLog) {\n                                    // Identify the outer bounds of the jitter range\n                                    min = Math.max(0, point[plotProp] - translatedJitter);\n                                    max = Math.min(axis.len, point[plotProp] + translatedJitter);\n                                    // Find a random position within this range\n                                    point[plotProp] = min +\n                                        (max - min) * unrandom(i + j * len);\n                                    // Update clientX for the tooltip k-d-tree\n                                    if (dim === 'x') {\n                                        point.clientX = point.plotX;\n                                    }\n                                }\n                            }\n                        });\n                    });\n                }\n            }\n            /* eslint-enable valid-jsdoc */\n        });\n        /* eslint-disable no-invalid-this */\n        addEvent(Series, 'afterTranslate', function () {\n            if (this.applyJitter) {\n                this.applyJitter();\n            }\n        });\n        /* eslint-enable no-invalid-this */\n        /**\n         * A `scatter` series. If the [type](#series.scatter.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.scatter\n         * @excluding dataParser, dataURL, useOhlcData\n         * @product   highcharts highstock\n         * @apioption series.scatter\n         */\n        /**\n         * An array of data points for the series. For the `scatter` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 0],\n         *        [1, 8],\n         *        [2, 9]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.scatter.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 2,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.scatter.data\n         */\n        ''; // adds doclets above to transpilat\n\n    });\n    _registerModule(_modules, 'mixins/centered-series.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * @private\n         * @interface Highcharts.RadianAngles\n         */ /**\n        * @name Highcharts.RadianAngles#end\n        * @type {number}\n        */ /**\n        * @name Highcharts.RadianAngles#start\n        * @type {number}\n        */\n        var isNumber = U.isNumber,\n            pick = U.pick,\n            relativeLength = U.relativeLength;\n        var deg2rad = H.deg2rad;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * @private\n         * @mixin Highcharts.CenteredSeriesMixin\n         */\n        H.CenteredSeriesMixin = {\n            /**\n             * Get the center of the pie based on the size and center options relative\n             * to the plot area. Borrowed by the polar and gauge series types.\n             *\n             * @private\n             * @function Highcharts.CenteredSeriesMixin.getCenter\n             *\n             * @return {Array<number>}\n             */\n            getCenter: function () {\n                var options = this.options,\n                    chart = this.chart,\n                    slicingRoom = 2 * (options.slicedOffset || 0),\n                    handleSlicingRoom,\n                    plotWidth = chart.plotWidth - 2 * slicingRoom,\n                    plotHeight = chart.plotHeight - 2 * slicingRoom,\n                    centerOption = options.center,\n                    smallestSize = Math.min(plotWidth,\n                    plotHeight),\n                    size = options.size,\n                    innerSize = options.innerSize || 0,\n                    positions,\n                    i,\n                    value;\n                if (typeof size === 'string') {\n                    size = parseFloat(size);\n                }\n                if (typeof innerSize === 'string') {\n                    innerSize = parseFloat(innerSize);\n                }\n                positions = [\n                    pick(centerOption[0], '50%'),\n                    pick(centerOption[1], '50%'),\n                    // Prevent from negative values\n                    pick(size && size < 0 ? void 0 : options.size, '100%'),\n                    pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')\n                ];\n                // No need for inner size in angular (gauges) series but still required\n                // for pie series\n                if (chart.angular && !(this instanceof H.Series)) {\n                    positions[3] = 0;\n                }\n                for (i = 0; i < 4; ++i) {\n                    value = positions[i];\n                    handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n                    // i == 0: centerX, relative to width\n                    // i == 1: centerY, relative to height\n                    // i == 2: size, relative to smallestSize\n                    // i == 3: innerSize, relative to size\n                    positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);\n                }\n                // innerSize cannot be larger than size (#3632)\n                if (positions[3] > positions[2]) {\n                    positions[3] = positions[2];\n                }\n                return positions;\n            },\n            /**\n             * getStartAndEndRadians - Calculates start and end angles in radians.\n             * Used in series types such as pie and sunburst.\n             *\n             * @private\n             * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians\n             *\n             * @param {number} [start]\n             *        Start angle in degrees.\n             *\n             * @param {number} [end]\n             *        Start angle in degrees.\n             *\n             * @return {Highcharts.RadianAngles}\n             *         Returns an object containing start and end angles as radians.\n             */\n            getStartAndEndRadians: function (start, end) {\n                var startAngle = isNumber(start) ? start : 0, // must be a number\n                    endAngle = ((isNumber(end) && // must be a number\n                        end > startAngle && // must be larger than the start angle\n                        // difference must be less than 360 degrees\n                        (end - startAngle) < 360) ?\n                        end :\n                        startAngle + 360),\n                    correction = -90;\n                return {\n                    start: deg2rad * (startAngle + correction),\n                    end: deg2rad * (endAngle + correction)\n                };\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/PieSeries.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, Point, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            clamp = U.clamp,\n            defined = U.defined,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            seriesType = U.seriesType,\n            setAnimation = U.setAnimation;\n        var CenteredSeriesMixin = H.CenteredSeriesMixin,\n            getStartAndEndRadians = CenteredSeriesMixin.getStartAndEndRadians,\n            noop = H.noop,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes;\n        /**\n         * Pie series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.pie\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('pie', 'line', \n        /**\n         * A pie chart is a circular graphic which is divided into slices to\n         * illustrate numerical proportion.\n         *\n         * @sample highcharts/demo/pie-basic/\n         *         Pie chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    animationLimit, boostThreshold, connectEnds, connectNulls,\n         *               cropThreshold, dashStyle, dataSorting, dragDrop,\n         *               findNearestPointBy, getExtremesFromAll, label, lineWidth,\n         *               marker, negativeColor, pointInterval, pointIntervalUnit,\n         *               pointPlacement, pointStart, softThreshold, stacking, step,\n         *               threshold, turboThreshold, zoneAxis, zones, dataSorting\n         * @product      highcharts\n         * @optionparent plotOptions.pie\n         */\n        {\n            /**\n             * @excluding legendItemClick\n             * @apioption plotOptions.pie.events\n             */\n            /**\n             * Fires when the checkbox next to the point name in the legend is\n             * clicked. One parameter, event, is passed to the function. The state\n             * of the checkbox is found by event.checked. The checked item is found\n             * by event.item. Return false to prevent the default action which is to\n             * toggle the select state of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n             *         Alert checkbox status\n             *\n             * @type      {Function}\n             * @since     1.2.0\n             * @product   highcharts\n             * @context   Highcharts.Point\n             * @apioption plotOptions.pie.events.checkboxClick\n             */\n            /**\n             * Fires when the legend item belonging to the pie point (slice) is\n             * clicked. The `this` keyword refers to the point itself. One\n             * parameter, `event`, is passed to the function, containing common\n             * event information. The default action is to toggle the visibility of\n             * the point. This can be prevented by calling `event.preventDefault()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-point-events-legenditemclick/\n             *         Confirm toggle visibility\n             *\n             * @type      {Highcharts.PointLegendItemClickCallbackFunction}\n             * @since     1.2.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.point.events.legendItemClick\n             */\n            /**\n             * The center of the pie chart relative to the plot area. Can be\n             * percentages or pixel values. The default behaviour (as of 3.0) is to\n             * center the pie so that all slices and data labels are within the plot\n             * area. As a consequence, the pie may actually jump around in a chart\n             * with dynamic values, as the data labels move. In that case, the\n             * center should be explicitly set, for example to `[\"50%\", \"50%\"]`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-center/\n             *         Centered at 100, 100\n             *\n             * @type    {Array<(number|string|null),(number|string|null)>}\n             * @default [null, null]\n             * @product highcharts\n             *\n             * @private\n             */\n            center: [null, null],\n            /**\n             * The color of the pie series. A pie series is represented as an empty\n             * circle if the total sum of its values is 0. Use this property to\n             * define the color of its border.\n             *\n             * In styled mode, the color can be defined by the\n             * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n             * color can be set with the `.highcharts-series`,\n             * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n             * `.highcharts-series-{n}` class, or individual classes given by the\n             * `className` option.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n             *         Empty pie series\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #cccccc\n             * @apioption plotOptions.pie.color\n             */\n            /**\n             * @product highcharts\n             *\n             * @private\n             */\n            clip: false,\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            colorByPoint: true,\n            /**\n             * A series specific or series type specific color set to use instead\n             * of the global [colors](#colors).\n             *\n             * @sample {highcharts} highcharts/demo/pie-monochrome/\n             *         Set default colors for all pies\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.colors\n             */\n            /**\n             * @declare   Highcharts.SeriesPieDataLabelsOptionsObject\n             * @extends   plotOptions.series.dataLabels\n             * @excluding align, allowOverlap, inside, staggerLines, step\n             * @private\n             */\n            dataLabels: {\n                /**\n                 * Alignment method for data labels. Possible values are:\n                 *\n                 * - `toPlotEdges`: Each label touches the nearest vertical edge of\n                 *   the plot area.\n                 *\n                 * - `connectors`: Connectors have the same x position and the\n                 *   widest label of each half (left & right) touches the nearest\n                 *   vertical edge of the plot area.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-connectors/\n                 *         alignTo: connectors\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-plotedges/\n                 *         alignTo: plotEdges\n                 *\n                 * @type      {string}\n                 * @since     7.0.0\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.alignTo\n                 */\n                allowOverlap: true,\n                /**\n                 * The color of the line connecting the data label to the pie slice.\n                 * The default color is the same as the point's color.\n                 *\n                 * In styled mode, the connector stroke is given in the\n                 * `.highcharts-data-label-connector` class.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorcolor/\n                 *         Blue connectors\n                 * @sample {highcharts} highcharts/css/pie-point/\n                 *         Styled connectors\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.1\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.connectorColor\n                 */\n                /**\n                 * The distance from the data label to the connector. Note that\n                 * data labels also have a default `padding`, so in order for the\n                 * connector to touch the text, the `padding` must also be 0.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorpadding/\n                 *         No padding\n                 *\n                 * @since   2.1\n                 * @product highcharts\n                 */\n                connectorPadding: 5,\n                /**\n                 * Specifies the method that is used to generate the connector path.\n                 * Highcharts provides 3 built-in connector shapes: `'fixedOffset'`\n                 * (default), `'straight'` and `'crookedLine'`. Using\n                 * `'crookedLine'` has the most sense (in most of the cases) when\n                 * `'alignTo'` is set.\n                 *\n                 * Users can provide their own method by passing a function instead\n                 * of a String. 3 arguments are passed to the callback:\n                 *\n                 * - Object that holds the information about the coordinates of the\n                 *   label (`x` & `y` properties) and how the label is located in\n                 *   relation to the pie (`alignment` property). `alignment` can by\n                 *   one of the following:\n                 *   `'left'` (pie on the left side of the data label),\n                 *   `'right'` (pie on the right side of the data label) or\n                 *   `'center'` (data label overlaps the pie).\n                 *\n                 * - Object that holds the information about the position of the\n                 *   connector. Its `touchingSliceAt`  porperty tells the position\n                 *   of the place where the connector touches the slice.\n                 *\n                 * - Data label options\n                 *\n                 * The function has to return an SVG path definition in array form\n                 * (see the example).\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorshape-string/\n                 *         connectorShape is a String\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorshape-function/\n                 *         connectorShape is a function\n                 *\n                 * @type    {string|Function}\n                 * @since   7.0.0\n                 * @product highcharts\n                 */\n                connectorShape: 'fixedOffset',\n                /**\n                 * The width of the line connecting the data label to the pie slice.\n                 *\n                 * In styled mode, the connector stroke width is given in the\n                 * `.highcharts-data-label-connector` class.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorwidth-disabled/\n                 *         Disable the connector\n                 * @sample {highcharts} highcharts/css/pie-point/\n                 *         Styled connectors\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @since     2.1\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.connectorWidth\n                 */\n                /**\n                 * Works only if `connectorShape` is `'crookedLine'`. It defines how\n                 * far from the vertical plot edge the coonnector path should be\n                 * crooked.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-crookdistance/\n                 *         crookDistance set to 90%\n                 *\n                 * @since   7.0.0\n                 * @product highcharts\n                 */\n                crookDistance: '70%',\n                /**\n                 * The distance of the data label from the pie's edge. Negative\n                 * numbers put the data label on top of the pie slices. Can also be\n                 * defined as a percentage of pie's radius. Connectors are only\n                 * shown for data labels outside the pie.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-distance/\n                 *         Data labels on top of the pie\n                 *\n                 * @type    {number|string}\n                 * @since   2.1\n                 * @product highcharts\n                 */\n                distance: 30,\n                enabled: true,\n                formatter: function () {\n                    return this.point.isNull ? void 0 : this.point.name;\n                },\n                /**\n                 * Whether to render the connector as a soft arc or a line with\n                 * sharp break. Works only if `connectorShape` equals to\n                 * `fixedOffset`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-softconnector-true/\n                 *         Soft\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-softconnector-false/\n                 *         Non soft\n                 *\n                 * @since   2.1.7\n                 * @product highcharts\n                 */\n                softConnector: true,\n                /**\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow\n                 *         Long labels truncated with an ellipsis\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap\n                 *         Long labels are wrapped\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @apioption plotOptions.pie.dataLabels.style\n                 */\n                x: 0\n            },\n            /**\n             * If the total sum of the pie's values is 0, the series is represented\n             * as an empty circle . The `fillColor` option defines the color of that\n             * circle. Use [pie.borderWidth](#plotOptions.pie.borderWidth) to set\n             * the border thickness.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n             *         Empty pie series\n             *\n             * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @private\n             */\n            fillColor: void 0,\n            /**\n             * The end angle of the pie in degrees where 0 is top and 90 is right.\n             * Defaults to `startAngle` plus 360.\n             *\n             * @sample {highcharts} highcharts/demo/pie-semi-circle/\n             *         Semi-circle donut\n             *\n             * @type      {number}\n             * @since     1.3.6\n             * @product   highcharts\n             * @apioption plotOptions.pie.endAngle\n             */\n            /**\n             * Equivalent to [chart.ignoreHiddenSeries](#chart.ignoreHiddenSeries),\n             * this option tells whether the series shall be redrawn as if the\n             * hidden point were `null`.\n             *\n             * The default value changed from `false` to `true` with Highcharts\n             * 3.0.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-ignorehiddenpoint/\n             *         True, the hiddden point is ignored\n             *\n             * @since   2.3.0\n             * @product highcharts\n             *\n             * @private\n             */\n            ignoreHiddenPoint: true,\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            inactiveOtherPoints: true,\n            /**\n             * The size of the inner diameter for the pie. A size greater than 0\n             * renders a donut chart. Can be a percentage or pixel value.\n             * Percentages are relative to the pie size. Pixel values are given as\n             * integers.\n             *\n             *\n             * Note: in Highcharts < 4.1.2, the percentage was relative to the plot\n             * area, not the pie size.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-innersize-80px/\n             *         80px inner size\n             * @sample {highcharts} highcharts/plotoptions/pie-innersize-50percent/\n             *         50% of the plot area\n             * @sample {highcharts} highcharts/demo/3d-pie-donut/\n             *         3D donut\n             *\n             * @type      {number|string}\n             * @default   0\n             * @since     2.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.innerSize\n             */\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            legendType: 'point',\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            marker: null,\n            /**\n             * The minimum size for a pie in response to auto margins. The pie will\n             * try to shrink to make room for data labels in side the plot area,\n             *  but only to this size.\n             *\n             * @type      {number|string}\n             * @default   80\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.minSize\n             */\n            /**\n             * The diameter of the pie relative to the plot area. Can be a\n             * percentage or pixel value. Pixel values are given as integers. The\n             * default behaviour (as of 3.0) is to scale to the plot area and give\n             * room for data labels within the plot area.\n             * [slicedOffset](#plotOptions.pie.slicedOffset) is also included in the\n             * default size calculation. As a consequence, the size of the pie may\n             * vary when points are updated and data labels more around. In that\n             * case it is best to set a fixed value, for example `\"75%\"`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-size/\n             *         Smaller pie\n             *\n             * @type    {number|string|null}\n             * @product highcharts\n             *\n             * @private\n             */\n            size: null,\n            /**\n             * Whether to display this particular series or series type in the\n             * legend. Since 2.1, pies are not shown in the legend by default.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n             *         One series in the legend, one hidden\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            showInLegend: false,\n            /**\n             * If a point is sliced, moved out from the center, how many pixels\n             * should it be moved?.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-slicedoffset-20/\n             *         20px offset\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            slicedOffset: 10,\n            /**\n             * The start angle of the pie slices in degrees where 0 is top and 90\n             * right.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-startangle-90/\n             *         Start from right\n             *\n             * @type      {number}\n             * @default   0\n             * @since     2.3.4\n             * @product   highcharts\n             * @apioption plotOptions.pie.startAngle\n             */\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event\n             * on a series isn't triggered until the mouse moves over another\n             * series, or out of the plot area. When false, the `mouseOut` event on\n             * a series is triggered when the mouse leaves the area around the\n             * series'  graph or markers. This also implies the tooltip. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series.\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true\n            },\n            /**\n             * The color of the border surrounding each slice. When `null`, the\n             * border takes the same color as the slice fill. This can be used\n             * together with a `borderWidth` to fill drawing gaps created by\n             * antialiazing artefacts in borderless pies.\n             *\n             * In styled mode, the border stroke is given in the `.highcharts-point`\n             * class.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-bordercolor-black/\n             *         Black border\n             *\n             * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default #ffffff\n             * @product highcharts\n             *\n             * @private\n             */\n            borderColor: '#ffffff',\n            /**\n             * The width of the border surrounding each slice.\n             *\n             * When setting the border width to 0, there may be small gaps between\n             * the slices due to SVG antialiasing artefacts. To work around this,\n             * keep the border width at 0.5 or 1, but set the `borderColor` to\n             * `null` instead.\n             *\n             * In styled mode, the border stroke width is given in the\n             * `.highcharts-point` class.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-borderwidth/\n             *         3px border\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            borderWidth: 1,\n            /**\n             * @ignore-options\n             * @private\n             */\n            lineWidth: void 0,\n            states: {\n                /**\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding marker, lineWidth, lineWidthPlus\n                 * @product   highcharts\n                 */\n                hover: {\n                    /**\n                     * How much to brighten the point on interaction. Requires the\n                     * main color to be defined in hex or rgb(a) format.\n                     *\n                     * In styled mode, the hover brightness is by default replaced\n                     * by a fill-opacity given in the `.highcharts-point-hover`\n                     * class.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/pie-states-hover-brightness/\n                     *         Brightened by 0.5\n                     *\n                     * @product highcharts\n                     */\n                    brightness: 0.1\n                }\n            }\n        }, \n        /* eslint-disable valid-jsdoc */\n        /**\n         * @lends seriesTypes.pie.prototype\n         */\n        {\n            isCartesian: false,\n            requireSorting: false,\n            directTouch: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            axisTypes: [],\n            pointAttribs: seriesTypes.column.prototype.pointAttribs,\n            /**\n             * Animate the pies in\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#animate\n             *\n             * @param {boolean} [init=false]\n             */\n            animate: function (init) {\n                var series = this,\n                    points = series.points,\n                    startAngleRad = series.startAngleRad;\n                if (!init) {\n                    points.forEach(function (point) {\n                        var graphic = point.graphic,\n                            args = point.shapeArgs;\n                        if (graphic && args) {\n                            // start values\n                            graphic.attr({\n                                // animate from inner radius (#779)\n                                r: pick(point.startR, (series.center && series.center[3] / 2)),\n                                start: startAngleRad,\n                                end: startAngleRad\n                            });\n                            // animate\n                            graphic.animate({\n                                r: args.r,\n                                start: args.start,\n                                end: args.end\n                            }, series.options.animation);\n                        }\n                    });\n                }\n            },\n            // Define hasData function for non-cartesian series.\n            // Returns true if the series has points at all.\n            hasData: function () {\n                return !!this.processedXData.length; // != 0\n            },\n            /**\n             * Recompute total chart sum and update percentages of points.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#updateTotals\n             * @return {void}\n             */\n            updateTotals: function () {\n                var i,\n                    total = 0,\n                    points = this.points,\n                    len = points.length,\n                    point,\n                    ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n                // Get the total sum\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    total += (ignoreHiddenPoint && !point.visible) ?\n                        0 :\n                        point.isNull ?\n                            0 :\n                            point.y;\n                }\n                this.total = total;\n                // Set each point's properties\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    point.percentage =\n                        (total > 0 && (point.visible || !ignoreHiddenPoint)) ?\n                            point.y / total * 100 :\n                            0;\n                    point.total = total;\n                }\n            },\n            /**\n             * Extend the generatePoints method by adding total and percentage\n             * properties to each point\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#generatePoints\n             * @return {void}\n             */\n            generatePoints: function () {\n                Series.prototype.generatePoints.call(this);\n                this.updateTotals();\n            },\n            /**\n             * Utility for getting the x value from a given y, used for\n             * anticollision logic in data labels. Added point for using specific\n             * points' label distance.\n             * @private\n             */\n            getX: function (y, left, point) {\n                var center = this.center, \n                    // Variable pie has individual radius\n                    radius = this.radii ?\n                        this.radii[point.index] :\n                        center[2] / 2,\n                    angle,\n                    x;\n                angle = Math.asin(clamp((y - center[1]) / (radius + point.labelDistance), -1, 1));\n                x = center[0] +\n                    (left ? -1 : 1) *\n                        (Math.cos(angle) * (radius + point.labelDistance)) +\n                    (point.labelDistance > 0 ?\n                        (left ? -1 : 1) * this.options.dataLabels.padding :\n                        0);\n                return x;\n            },\n            /**\n             * Do translation for pie slices\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#translate\n             * @param {Array<number>} [positions]\n             * @return {void}\n             */\n            translate: function (positions) {\n                this.generatePoints();\n                var series = this,\n                    cumulative = 0,\n                    precision = 1000, // issue #172\n                    options = series.options,\n                    slicedOffset = options.slicedOffset,\n                    connectorOffset = slicedOffset + (options.borderWidth || 0),\n                    finalConnectorOffset,\n                    start,\n                    end,\n                    angle,\n                    radians = getStartAndEndRadians(options.startAngle,\n                    options.endAngle),\n                    startAngleRad = series.startAngleRad = radians.start,\n                    endAngleRad = series.endAngleRad = radians.end,\n                    circ = endAngleRad - startAngleRad, // 2 * Math.PI,\n                    points = series.points, \n                    // the x component of the radius vector for a given point\n                    radiusX,\n                    radiusY,\n                    labelDistance = options.dataLabels.distance,\n                    ignoreHiddenPoint = options.ignoreHiddenPoint,\n                    i,\n                    len = points.length,\n                    point;\n                // Get positions - either an integer or a percentage string must be\n                // given. If positions are passed as a parameter, we're in a\n                // recursive loop for adjusting space for data labels.\n                if (!positions) {\n                    series.center = positions = series.getCenter();\n                }\n                // Calculate the geometry for each point\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    // set start and end angle\n                    start = startAngleRad + (cumulative * circ);\n                    if (!ignoreHiddenPoint || point.visible) {\n                        cumulative += point.percentage / 100;\n                    }\n                    end = startAngleRad + (cumulative * circ);\n                    // set the shape\n                    point.shapeType = 'arc';\n                    point.shapeArgs = {\n                        x: positions[0],\n                        y: positions[1],\n                        r: positions[2] / 2,\n                        innerR: positions[3] / 2,\n                        start: Math.round(start * precision) / precision,\n                        end: Math.round(end * precision) / precision\n                    };\n                    // Used for distance calculation for specific point.\n                    point.labelDistance = pick((point.options.dataLabels &&\n                        point.options.dataLabels.distance), labelDistance);\n                    // Compute point.labelDistance if it's defined as percentage\n                    // of slice radius (#8854)\n                    point.labelDistance = relativeLength(point.labelDistance, point.shapeArgs.r);\n                    // Saved for later dataLabels distance calculation.\n                    series.maxLabelDistance = Math.max(series.maxLabelDistance || 0, point.labelDistance);\n                    // The angle must stay within -90 and 270 (#2645)\n                    angle = (end + start) / 2;\n                    if (angle > 1.5 * Math.PI) {\n                        angle -= 2 * Math.PI;\n                    }\n                    else if (angle < -Math.PI / 2) {\n                        angle += 2 * Math.PI;\n                    }\n                    // Center for the sliced out slice\n                    point.slicedTranslation = {\n                        translateX: Math.round(Math.cos(angle) * slicedOffset),\n                        translateY: Math.round(Math.sin(angle) * slicedOffset)\n                    };\n                    // set the anchor point for tooltips\n                    radiusX = Math.cos(angle) * positions[2] / 2;\n                    radiusY = Math.sin(angle) * positions[2] / 2;\n                    point.tooltipPos = [\n                        positions[0] + radiusX * 0.7,\n                        positions[1] + radiusY * 0.7\n                    ];\n                    point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ?\n                        1 :\n                        0;\n                    point.angle = angle;\n                    // Set the anchor point for data labels. Use point.labelDistance\n                    // instead of labelDistance // #1174\n                    // finalConnectorOffset - not override connectorOffset value.\n                    finalConnectorOffset = Math.min(connectorOffset, point.labelDistance / 5); // #1678\n                    point.labelPosition = {\n                        natural: {\n                            // initial position of the data label - it's utilized for\n                            // finding the final position for the label\n                            x: positions[0] + radiusX + Math.cos(angle) *\n                                point.labelDistance,\n                            y: positions[1] + radiusY + Math.sin(angle) *\n                                point.labelDistance\n                        },\n                        'final': {\n                        // used for generating connector path -\n                        // initialized later in drawDataLabels function\n                        // x: undefined,\n                        // y: undefined\n                        },\n                        // left - pie on the left side of the data label\n                        // right - pie on the right side of the data label\n                        // center - data label overlaps the pie\n                        alignment: point.labelDistance < 0 ?\n                            'center' : point.half ? 'right' : 'left',\n                        connectorPosition: {\n                            breakAt: {\n                                x: positions[0] + radiusX + Math.cos(angle) *\n                                    finalConnectorOffset,\n                                y: positions[1] + radiusY + Math.sin(angle) *\n                                    finalConnectorOffset\n                            },\n                            touchingSliceAt: {\n                                x: positions[0] + radiusX,\n                                y: positions[1] + radiusY\n                            }\n                        }\n                    };\n                }\n                fireEvent(series, 'afterTranslate');\n            },\n            /**\n             * Called internally to draw auxiliary graph in pie-like series in\n             * situtation when the default graph is not sufficient enough to present\n             * the data well. Auxiliary graph is saved in the same object as\n             * regular graph.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawEmpty\n             */\n            drawEmpty: function () {\n                var centerX,\n                    centerY,\n                    start = this.startAngleRad,\n                    end = this.endAngleRad,\n                    options = this.options;\n                // Draw auxiliary graph if there're no visible points.\n                if (this.total === 0) {\n                    centerX = this.center[0];\n                    centerY = this.center[1];\n                    if (!this.graph) {\n                        this.graph = this.chart.renderer\n                            .arc(centerX, centerY, this.center[1] / 2, 0, start, end)\n                            .addClass('highcharts-empty-series')\n                            .add(this.group);\n                    }\n                    this.graph.attr({\n                        d: Highcharts.SVGRenderer.prototype.symbols.arc(centerX, centerY, this.center[2] / 2, 0, {\n                            start: start,\n                            end: end,\n                            innerR: this.center[3] / 2\n                        })\n                    });\n                    if (!this.chart.styledMode) {\n                        this.graph.attr({\n                            'stroke-width': options.borderWidth,\n                            fill: options.fillColor || 'none',\n                            stroke: options.color ||\n                                '#cccccc'\n                        });\n                    }\n                }\n                else if (this.graph) { // Destroy the graph object.\n                    this.graph = this.graph.destroy();\n                }\n            },\n            /**\n             * Draw the data points\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawPoints\n             * @return {void}\n             */\n            redrawPoints: function () {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    groupTranslation,\n                    graphic,\n                    pointAttr,\n                    shapeArgs,\n                    shadow = series.options.shadow;\n                this.drawEmpty();\n                if (shadow && !series.shadowGroup && !chart.styledMode) {\n                    series.shadowGroup = renderer.g('shadow')\n                        .attr({ zIndex: -1 })\n                        .add(series.group);\n                }\n                // draw the slices\n                series.points.forEach(function (point) {\n                    var animateTo = {};\n                    graphic = point.graphic;\n                    if (!point.isNull && graphic) {\n                        shapeArgs = point.shapeArgs;\n                        // If the point is sliced, use special translation, else use\n                        // plot area translation\n                        groupTranslation = point.getTranslate();\n                        if (!chart.styledMode) {\n                            // Put the shadow behind all points\n                            var shadowGroup = point.shadowGroup;\n                            if (shadow && !shadowGroup) {\n                                shadowGroup = point.shadowGroup = renderer\n                                    .g('shadow')\n                                    .add(series.shadowGroup);\n                            }\n                            if (shadowGroup) {\n                                shadowGroup.attr(groupTranslation);\n                            }\n                            pointAttr = series.pointAttribs(point, (point.selected && 'select'));\n                        }\n                        // Draw the slice\n                        if (!point.delayedRendering) {\n                            graphic\n                                .setRadialReference(series.center);\n                            if (!chart.styledMode) {\n                                merge(true, animateTo, pointAttr);\n                            }\n                            merge(true, animateTo, shapeArgs, groupTranslation);\n                            graphic.animate(animateTo);\n                        }\n                        else {\n                            graphic\n                                .setRadialReference(series.center)\n                                .attr(shapeArgs)\n                                .attr(groupTranslation);\n                            if (!chart.styledMode) {\n                                graphic\n                                    .attr(pointAttr)\n                                    .attr({ 'stroke-linejoin': 'round' })\n                                    .shadow(shadow, shadowGroup);\n                            }\n                            point.delayedRendering = false;\n                        }\n                        graphic.attr({\n                            visibility: point.visible ? 'inherit' : 'hidden'\n                        });\n                        graphic.addClass(point.getClassName());\n                    }\n                    else if (graphic) {\n                        point.graphic = graphic.destroy();\n                    }\n                });\n            },\n            /**\n             * Slices in pie chart are initialized in DOM, but it's shapes and\n             * animations are normally run in `drawPoints()`.\n             * @private\n             */\n            drawPoints: function () {\n                var renderer = this.chart.renderer;\n                this.points.forEach(function (point) {\n                    // When updating a series between 2d and 3d or cartesian and\n                    // polar, the shape type changes.\n                    if (point.graphic && point.hasNewShapeType()) {\n                        point.graphic = point.graphic.destroy();\n                    }\n                    if (!point.graphic) {\n                        point.graphic = renderer[point.shapeType](point.shapeArgs)\n                            .add(point.series.group);\n                        point.delayedRendering = true;\n                    }\n                });\n            },\n            /**\n             * @private\n             * @deprecated\n             * @function Highcharts.seriesTypes.pie#searchPoint\n             */\n            searchPoint: noop,\n            /**\n             * Utility for sorting data labels\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#sortByAngle\n             * @param {Array<Highcharts.Point>} points\n             * @param {number} sign\n             * @return {void}\n             */\n            sortByAngle: function (points, sign) {\n                points.sort(function (a, b) {\n                    return ((typeof a.angle !== 'undefined') &&\n                        (b.angle - a.angle) * sign);\n                });\n            },\n            /**\n             * Use a simple symbol from LegendSymbolMixin.\n             *\n             * @private\n             * @borrows Highcharts.LegendSymbolMixin.drawRectangle as Highcharts.seriesTypes.pie#drawLegendSymbol\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            /**\n             * Use the getCenter method from drawLegendSymbol.\n             *\n             * @private\n             * @borrows Highcharts.CenteredSeriesMixin.getCenter as Highcharts.seriesTypes.pie#getCenter\n             */\n            getCenter: CenteredSeriesMixin.getCenter,\n            /**\n             * Pies don't have point marker symbols.\n             *\n             * @deprecated\n             * @private\n             * @function Highcharts.seriesTypes.pie#getSymbol\n             */\n            getSymbol: noop,\n            /**\n             * @private\n             * @type {null}\n             */\n            drawGraph: null\n        }, \n        /**\n         * @lends seriesTypes.pie.prototype.pointClass.prototype\n         */\n        {\n            /**\n             * Initialize the pie slice\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#init\n             * @return {Highcharts.Point}\n             */\n            init: function () {\n                Point.prototype.init.apply(this, arguments);\n                var point = this,\n                    toggleSlice;\n                point.name = pick(point.name, 'Slice');\n                // add event listener for select\n                toggleSlice = function (e) {\n                    point.slice(e.type === 'select');\n                };\n                addEvent(point, 'select', toggleSlice);\n                addEvent(point, 'unselect', toggleSlice);\n                return point;\n            },\n            /**\n             * Negative points are not valid (#1530, #3623, #5322)\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#isValid\n             * @return {boolean}\n             */\n            isValid: function () {\n                return isNumber(this.y) && this.y >= 0;\n            },\n            /**\n             * Toggle the visibility of the pie slice\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#setVisible\n             * @param {boolean} vis\n             *        Whether to show the slice or not. If undefined, the visibility\n             *        is toggled.\n             * @param {boolean} [redraw=false]\n             * @return {void}\n             */\n            setVisible: function (vis, redraw) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n                redraw = pick(redraw, ignoreHiddenPoint);\n                if (vis !== point.visible) {\n                    // If called without an argument, toggle visibility\n                    point.visible = point.options.visible = vis =\n                        typeof vis === 'undefined' ? !point.visible : vis;\n                    // update userOptions.data\n                    series.options.data[series.data.indexOf(point)] =\n                        point.options;\n                    // Show and hide associated elements. This is performed\n                    // regardless of redraw or not, because chart.redraw only\n                    // handles full series.\n                    ['graphic', 'dataLabel', 'connector', 'shadowGroup'].forEach(function (key) {\n                        if (point[key]) {\n                            point[key][vis ? 'show' : 'hide'](true);\n                        }\n                    });\n                    if (point.legendItem) {\n                        chart.legend.colorizeItem(point, vis);\n                    }\n                    // #4170, hide halo after hiding point\n                    if (!vis && point.state === 'hover') {\n                        point.setState('');\n                    }\n                    // Handle ignore hidden slices\n                    if (ignoreHiddenPoint) {\n                        series.isDirty = true;\n                    }\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                }\n            },\n            /**\n             * Set or toggle whether the slice is cut out from the pie\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#slice\n             * @param {boolean} sliced\n             *        When undefined, the slice state is toggled.\n             * @param {boolean} redraw\n             *        Whether to redraw the chart. True by default.\n             * @param {boolean|Highcharts.AnimationOptionsObject}\n             *        Animation options.\n             * @return {void}\n             */\n            slice: function (sliced, redraw, animation) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n                setAnimation(animation, chart);\n                // redraw is true by default\n                redraw = pick(redraw, true);\n                /**\n                 * Pie series only. Whether to display a slice offset from the\n                 * center.\n                 * @name Highcharts.Point#sliced\n                 * @type {boolean|undefined}\n                 */\n                // if called without an argument, toggle\n                point.sliced = point.options.sliced = sliced =\n                    defined(sliced) ? sliced : !point.sliced;\n                // update userOptions.data\n                series.options.data[series.data.indexOf(point)] =\n                    point.options;\n                if (point.graphic) {\n                    point.graphic.animate(this.getTranslate());\n                }\n                if (point.shadowGroup) {\n                    point.shadowGroup.animate(this.getTranslate());\n                }\n            },\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#getTranslate\n             * @return {Highcharts.TranslationAttributes}\n             */\n            getTranslate: function () {\n                return this.sliced ? this.slicedTranslation : {\n                    translateX: 0,\n                    translateY: 0\n                };\n            },\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#haloPath\n             * @param {number} size\n             * @return {Highcharts.SVGPathArray}\n             */\n            haloPath: function (size) {\n                var shapeArgs = this.shapeArgs;\n                return this.sliced || !this.visible ?\n                    [] :\n                    this.series.chart.renderer.symbols.arc(shapeArgs.x, shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {\n                        // Substract 1px to ensure the background is not bleeding\n                        // through between the halo and the slice (#7495).\n                        innerR: shapeArgs.r - 1,\n                        start: shapeArgs.start,\n                        end: shapeArgs.end\n                    });\n            },\n            connectorShapes: {\n                // only one available before v7.0.0\n                fixedOffset: function (labelPosition, connectorPosition, options) {\n                    var breakAt = connectorPosition.breakAt,\n                        touchingSliceAt = connectorPosition.touchingSliceAt,\n                        lineSegment = options.softConnector ? [\n                            'C',\n                            // 1st control point (of the curve)\n                            labelPosition.x +\n                                // 5 gives the connector a little horizontal bend\n                                (labelPosition.alignment === 'left' ? -5 : 5),\n                            labelPosition.y,\n                            2 * breakAt.x - touchingSliceAt.x,\n                            2 * breakAt.y - touchingSliceAt.y,\n                            breakAt.x,\n                            breakAt.y //\n                        ] : [\n                            'L',\n                            breakAt.x,\n                            breakAt.y\n                        ];\n                    // assemble the path\n                    return ([\n                        ['M', labelPosition.x, labelPosition.y],\n                        lineSegment,\n                        ['L', touchingSliceAt.x, touchingSliceAt.y]\n                    ]);\n                },\n                straight: function (labelPosition, connectorPosition) {\n                    var touchingSliceAt = connectorPosition.touchingSliceAt;\n                    // direct line to the slice\n                    return [\n                        ['M', labelPosition.x, labelPosition.y],\n                        ['L', touchingSliceAt.x, touchingSliceAt.y]\n                    ];\n                },\n                crookedLine: function (labelPosition, connectorPosition, options) {\n                    var touchingSliceAt = connectorPosition.touchingSliceAt,\n                        series = this.series,\n                        pieCenterX = series.center[0],\n                        plotWidth = series.chart.plotWidth,\n                        plotLeft = series.chart.plotLeft,\n                        alignment = labelPosition.alignment,\n                        radius = this.shapeArgs.r,\n                        crookDistance = relativeLength(// % to fraction\n                        options.crookDistance, 1),\n                        crookX = alignment === 'left' ?\n                            pieCenterX + radius + (plotWidth + plotLeft -\n                                pieCenterX - radius) * (1 - crookDistance) :\n                            plotLeft + (pieCenterX - radius) * crookDistance,\n                        segmentWithCrook = [\n                            'L',\n                            crookX,\n                            labelPosition.y\n                        ],\n                        useCrook = true;\n                    // crookedLine formula doesn't make sense if the path overlaps\n                    // the label - use straight line instead in that case\n                    if (alignment === 'left' ?\n                        (crookX > labelPosition.x || crookX < touchingSliceAt.x) :\n                        (crookX < labelPosition.x || crookX > touchingSliceAt.x)) {\n                        useCrook = false;\n                    }\n                    // assemble the path\n                    var path = [\n                            ['M',\n                        labelPosition.x,\n                        labelPosition.y]\n                        ];\n                    if (useCrook) {\n                        path.push(segmentWithCrook);\n                    }\n                    path.push(['L', touchingSliceAt.x, touchingSliceAt.y]);\n                    return path;\n                }\n            },\n            /**\n             * Extendable method for getting the path of the connector between the\n             * data label and the pie slice.\n             */\n            getConnectorPath: function () {\n                var labelPosition = this.labelPosition,\n                    options = this.series.options.dataLabels,\n                    connectorShape = options.connectorShape,\n                    predefinedShapes = this.connectorShapes;\n                // find out whether to use the predefined shape\n                if (predefinedShapes[connectorShape]) {\n                    connectorShape = predefinedShapes[connectorShape];\n                }\n                return connectorShape.call(this, {\n                    // pass simplified label position object for user's convenience\n                    x: labelPosition.final.x,\n                    y: labelPosition.final.y,\n                    alignment: labelPosition.alignment\n                }, labelPosition.connectorPosition, options);\n            }\n        }\n        /* eslint-enable valid-jsdoc */\n        );\n        /**\n         * A `pie` series. If the [type](#series.pie.type) option is not specified,\n         * it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.pie\n         * @excluding dataParser, dataURL, stack, xAxis, yAxis, dataSorting, step\n         * @product   highcharts\n         * @apioption series.pie\n         */\n        /**\n         * An array of data points for the series. For the `pie` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.pie.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        y: 1,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        y: 7,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<string,(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @excluding marker, x\n         * @product   highcharts\n         * @apioption series.pie.data\n         */\n        /**\n         * @type      {Highcharts.SeriesPieDataLabelsOptionsObject}\n         * @product   highcharts\n         * @apioption series.pie.data.dataLabels\n         */\n        /**\n         * The sequential index of the data point in the legend.\n         *\n         * @type      {number}\n         * @product   highcharts\n         * @apioption series.pie.data.legendIndex\n         */\n        /**\n         * Whether to display a slice offset from the center.\n         *\n         * @sample {highcharts} highcharts/point/sliced/\n         *         One sliced point\n         *\n         * @type      {boolean}\n         * @product   highcharts\n         * @apioption series.pie.data.sliced\n         */\n        /**\n         * @excluding legendItemClick\n         * @product   highcharts\n         * @apioption series.pie.events\n         */\n        ''; // placeholder for transpiled doclets above\n\n    });\n    _registerModule(_modules, 'parts/DataLabels.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var noop = H.noop,\n            seriesTypes = H.seriesTypes;\n        var animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            clamp = U.clamp,\n            defined = U.defined,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isArray = U.isArray,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            splat = U.splat,\n            stableSort = U.stableSort;\n        /**\n         * Callback JavaScript function to format the data label as a string. Note that\n         * if a `format` is defined, the format takes precedence and the formatter is\n         * ignored.\n         *\n         * @callback Highcharts.DataLabelsFormatterCallbackFunction\n         *\n         * @param {Highcharts.PointLabelObject} this\n         * Data label context to format\n         *\n         * @param {Highcharts.DataLabelsOptions} options\n         * [API options](/highcharts/plotOptions.series.dataLabels) of the data label\n         *\n         * @return {number|string|null|undefined}\n         * Formatted data label text\n         */\n        /**\n         * Values for handling data labels that flow outside the plot area.\n         *\n         * @typedef {\"allow\"|\"justify\"} Highcharts.DataLabelsOverflowValue\n         */\n        var Series = H.Series;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * General distribution algorithm for distributing labels of differing size\n         * along a confined length in two dimensions. The algorithm takes an array of\n         * objects containing a size, a target and a rank. It will place the labels as\n         * close as possible to their targets, skipping the lowest ranked labels if\n         * necessary.\n         *\n         * @private\n         * @function Highcharts.distribute\n         * @param {Highcharts.DataLabelsBoxArray} boxes\n         * @param {number} len\n         * @param {number} [maxDistance]\n         * @return {void}\n         */\n        H.distribute = function (boxes, len, maxDistance) {\n            var i,\n                overlapping = true,\n                origBoxes = boxes, // Original array will be altered with added .pos\n                restBoxes = [], // The outranked overshoot\n                box,\n                target,\n                total = 0,\n                reducedLen = origBoxes.reducedLen || len;\n            /**\n             * @private\n             */\n            function sortByTarget(a, b) {\n                return a.target - b.target;\n            }\n            // If the total size exceeds the len, remove those boxes with the lowest\n            // rank\n            i = boxes.length;\n            while (i--) {\n                total += boxes[i].size;\n            }\n            // Sort by rank, then slice away overshoot\n            if (total > reducedLen) {\n                stableSort(boxes, function (a, b) {\n                    return (b.rank || 0) - (a.rank || 0);\n                });\n                i = 0;\n                total = 0;\n                while (total <= reducedLen) {\n                    total += boxes[i].size;\n                    i++;\n                }\n                restBoxes = boxes.splice(i - 1, boxes.length);\n            }\n            // Order by target\n            stableSort(boxes, sortByTarget);\n            // So far we have been mutating the original array. Now\n            // create a copy with target arrays\n            boxes = boxes.map(function (box) {\n                return {\n                    size: box.size,\n                    targets: [box.target],\n                    align: pick(box.align, 0.5)\n                };\n            });\n            while (overlapping) {\n                // Initial positions: target centered in box\n                i = boxes.length;\n                while (i--) {\n                    box = boxes[i];\n                    // Composite box, average of targets\n                    target = (Math.min.apply(0, box.targets) +\n                        Math.max.apply(0, box.targets)) / 2;\n                    box.pos = clamp(target - box.size * box.align, 0, len - box.size);\n                }\n                // Detect overlap and join boxes\n                i = boxes.length;\n                overlapping = false;\n                while (i--) {\n                    // Overlap\n                    if (i > 0 &&\n                        boxes[i - 1].pos + boxes[i - 1].size >\n                            boxes[i].pos) {\n                        // Add this size to the previous box\n                        boxes[i - 1].size += boxes[i].size;\n                        boxes[i - 1].targets = boxes[i - 1]\n                            .targets\n                            .concat(boxes[i].targets);\n                        boxes[i - 1].align = 0.5;\n                        // Overlapping right, push left\n                        if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n                            boxes[i - 1].pos = len - boxes[i - 1].size;\n                        }\n                        boxes.splice(i, 1); // Remove this item\n                        overlapping = true;\n                    }\n                }\n            }\n            // Add the rest (hidden boxes)\n            origBoxes.push.apply(origBoxes, restBoxes);\n            // Now the composite boxes are placed, we need to put the original boxes\n            // within them\n            i = 0;\n            boxes.some(function (box) {\n                var posInCompositeBox = 0;\n                if (box.targets.some(function () {\n                    origBoxes[i].pos = box.pos + posInCompositeBox;\n                    // If the distance between the position and the target exceeds\n                    // maxDistance, abort the loop and decrease the length in increments\n                    // of 10% to recursively reduce the  number of visible boxes by\n                    // rank. Once all boxes are within the maxDistance, we're good.\n                    if (typeof maxDistance !== 'undefined' &&\n                        Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {\n                        // Reset the positions that are already set\n                        origBoxes.slice(0, i + 1).forEach(function (box) {\n                            delete box.pos;\n                        });\n                        // Try with a smaller length\n                        origBoxes.reducedLen =\n                            (origBoxes.reducedLen || len) - (len * 0.1);\n                        // Recurse\n                        if (origBoxes.reducedLen > len * 0.1) {\n                            H.distribute(origBoxes, len, maxDistance);\n                        }\n                        // Exceeded maxDistance => abort\n                        return true;\n                    }\n                    posInCompositeBox += origBoxes[i].size;\n                    i++;\n                })) {\n                    // Exceeded maxDistance => abort\n                    return true;\n                }\n            });\n            // Add the rest (hidden) boxes and sort by target\n            stableSort(origBoxes, sortByTarget);\n        };\n        /**\n         * Draw the data labels\n         *\n         * @private\n         * @function Highcharts.Series#drawDataLabels\n         * @return {void}\n         * @fires Highcharts.Series#event:afterDrawDataLabels\n         */\n        Series.prototype.drawDataLabels = function () {\n            var series = this,\n                chart = series.chart,\n                seriesOptions = series.options,\n                seriesDlOptions = seriesOptions.dataLabels,\n                points = series.points,\n                pointOptions,\n                hasRendered = series.hasRendered || 0,\n                dataLabelsGroup,\n                seriesAnimDuration = animObject(seriesOptions.animation).duration,\n                fadeInDuration = Math.min(seriesAnimDuration, 200),\n                defer = !chart.renderer.forExport && pick(seriesDlOptions.defer,\n                fadeInDuration > 0),\n                renderer = chart.renderer;\n            /**\n             * Handle the dataLabels.filter option.\n             * @private\n             */\n            function applyFilter(point, options) {\n                var filter = options.filter,\n                    op,\n                    prop,\n                    val;\n                if (filter) {\n                    op = filter.operator;\n                    prop = point[filter.property];\n                    val = filter.value;\n                    if ((op === '>' && prop > val) ||\n                        (op === '<' && prop < val) ||\n                        (op === '>=' && prop >= val) ||\n                        (op === '<=' && prop <= val) ||\n                        (op === '==' && prop == val) || // eslint-disable-line eqeqeq\n                        (op === '===' && prop === val)) {\n                        return true;\n                    }\n                    return false;\n                }\n                return true;\n            }\n            /**\n             * Merge two objects that can be arrays. If one of them is an array, the\n             * other is merged into each element. If both are arrays, each element is\n             * merged by index. If neither are arrays, we use normal merge.\n             * @private\n             */\n            function mergeArrays(one, two) {\n                var res = [],\n                    i;\n                if (isArray(one) && !isArray(two)) {\n                    res = one.map(function (el) {\n                        return merge(el, two);\n                    });\n                }\n                else if (isArray(two) && !isArray(one)) {\n                    res = two.map(function (el) {\n                        return merge(one, el);\n                    });\n                }\n                else if (!isArray(one) && !isArray(two)) {\n                    res = merge(one, two);\n                }\n                else {\n                    i = Math.max(one.length, two.length);\n                    while (i--) {\n                        res[i] = merge(one[i], two[i]);\n                    }\n                }\n                return res;\n            }\n            // Merge in plotOptions.dataLabels for series\n            seriesDlOptions = mergeArrays(mergeArrays(chart.options.plotOptions &&\n                chart.options.plotOptions.series &&\n                chart.options.plotOptions.series.dataLabels, chart.options.plotOptions &&\n                chart.options.plotOptions[series.type] &&\n                chart.options.plotOptions[series.type].dataLabels), seriesDlOptions);\n            fireEvent(this, 'drawDataLabels');\n            if (isArray(seriesDlOptions) ||\n                seriesDlOptions.enabled ||\n                series._hasPointLabels) {\n                // Create a separate group for the data labels to avoid rotation\n                dataLabelsGroup = series.plotGroup('dataLabelsGroup', 'data-labels', defer && !hasRendered ? 'hidden' : 'inherit', // #5133, #10220\n                seriesDlOptions.zIndex || 6);\n                if (defer) {\n                    dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300\n                    if (!hasRendered) {\n                        setTimeout(function () {\n                            var group = series.dataLabelsGroup;\n                            if (group) {\n                                if (series.visible) { // #2597, #3023, #3024\n                                    dataLabelsGroup.show(true);\n                                }\n                                group[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: fadeInDuration });\n                            }\n                        }, seriesAnimDuration - fadeInDuration);\n                    }\n                }\n                // Make the labels for each point\n                points.forEach(function (point) {\n                    // Merge in series options for the point.\n                    // @note dataLabelAttribs (like pointAttribs) would eradicate\n                    // the need for dlOptions, and simplify the section below.\n                    pointOptions = splat(mergeArrays(seriesDlOptions, point.dlOptions || // dlOptions is used in treemaps\n                        (point.options && point.options.dataLabels)));\n                    // Handle each individual data label for this point\n                    pointOptions.forEach(function (labelOptions, i) {\n                        // Options for one datalabel\n                        var labelEnabled = (labelOptions.enabled &&\n                                // #2282, #4641, #7112, #10049\n                                (!point.isNull || point.dataLabelOnNull) &&\n                                applyFilter(point,\n                            labelOptions)),\n                            labelConfig,\n                            formatString,\n                            labelText,\n                            style,\n                            rotation,\n                            attr,\n                            dataLabel = point.dataLabels ? point.dataLabels[i] :\n                                point.dataLabel,\n                            connector = point.connectors ? point.connectors[i] :\n                                point.connector,\n                            labelDistance = pick(labelOptions.distance,\n                            point.labelDistance),\n                            isNew = !dataLabel;\n                        if (labelEnabled) {\n                            // Create individual options structure that can be extended\n                            // without affecting others\n                            labelConfig = point.getLabelConfig();\n                            formatString = pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);\n                            labelText = defined(formatString) ?\n                                format(formatString, labelConfig, chart) :\n                                (labelOptions[point.formatPrefix + 'Formatter'] ||\n                                    labelOptions.formatter).call(labelConfig, labelOptions);\n                            style = labelOptions.style;\n                            rotation = labelOptions.rotation;\n                            if (!chart.styledMode) {\n                                // Determine the color\n                                style.color = pick(labelOptions.color, style.color, series.color, '#000000');\n                                // Get automated contrast color\n                                if (style.color === 'contrast') {\n                                    point.contrastColor = renderer.getContrast((point.color || series.color));\n                                    style.color = (!defined(labelDistance) &&\n                                        labelOptions.inside) ||\n                                        labelDistance < 0 ||\n                                        !!seriesOptions.stacking ?\n                                        point.contrastColor :\n                                        '#000000';\n                                }\n                                else {\n                                    delete point.contrastColor;\n                                }\n                                if (seriesOptions.cursor) {\n                                    style.cursor = seriesOptions.cursor;\n                                }\n                            }\n                            attr = {\n                                r: labelOptions.borderRadius || 0,\n                                rotation: rotation,\n                                padding: labelOptions.padding,\n                                zIndex: 1\n                            };\n                            if (!chart.styledMode) {\n                                attr.fill = labelOptions.backgroundColor;\n                                attr.stroke = labelOptions.borderColor;\n                                attr['stroke-width'] = labelOptions.borderWidth;\n                            }\n                            // Remove unused attributes (#947)\n                            objectEach(attr, function (val, name) {\n                                if (typeof val === 'undefined') {\n                                    delete attr[name];\n                                }\n                            });\n                        }\n                        // If the point is outside the plot area, destroy it. #678, #820\n                        if (dataLabel && (!labelEnabled || !defined(labelText))) {\n                            point.dataLabel =\n                                point.dataLabel && point.dataLabel.destroy();\n                            if (point.dataLabels) {\n                                // Remove point.dataLabels if this was the last one\n                                if (point.dataLabels.length === 1) {\n                                    delete point.dataLabels;\n                                }\n                                else {\n                                    delete point.dataLabels[i];\n                                }\n                            }\n                            if (!i) {\n                                delete point.dataLabel;\n                            }\n                            if (connector) {\n                                point.connector = point.connector.destroy();\n                                if (point.connectors) {\n                                    // Remove point.connectors if this was the last one\n                                    if (point.connectors.length === 1) {\n                                        delete point.connectors;\n                                    }\n                                    else {\n                                        delete point.connectors[i];\n                                    }\n                                }\n                            }\n                            // Individual labels are disabled if the are explicitly disabled\n                            // in the point options, or if they fall outside the plot area.\n                        }\n                        else if (labelEnabled && defined(labelText)) {\n                            if (!dataLabel) {\n                                // Create new label element\n                                point.dataLabels = point.dataLabels || [];\n                                dataLabel = point.dataLabels[i] = rotation ?\n                                    // Labels don't rotate, use text element\n                                    renderer.text(labelText, 0, -9999, labelOptions.useHTML)\n                                        .addClass('highcharts-data-label') :\n                                    // We can use label\n                                    renderer.label(labelText, 0, -9999, labelOptions.shape, null, null, labelOptions.useHTML, null, 'data-label');\n                                // Store for backwards compatibility\n                                if (!i) {\n                                    point.dataLabel = dataLabel;\n                                }\n                                dataLabel.addClass(' highcharts-data-label-color-' + point.colorIndex +\n                                    ' ' + (labelOptions.className || '') +\n                                    ( // #3398\n                                    labelOptions.useHTML ?\n                                        ' highcharts-tracker' :\n                                        ''));\n                            }\n                            else {\n                                // Use old element and just update text\n                                attr.text = labelText;\n                            }\n                            // Store data label options for later access\n                            dataLabel.options = labelOptions;\n                            dataLabel.attr(attr);\n                            if (!chart.styledMode) {\n                                // Styles must be applied before add in order to read\n                                // text bounding box\n                                dataLabel.css(style).shadow(labelOptions.shadow);\n                            }\n                            if (!dataLabel.added) {\n                                dataLabel.add(dataLabelsGroup);\n                            }\n                            if (labelOptions.textPath && !labelOptions.useHTML) {\n                                dataLabel.setTextPath((point.getDataLabelPath &&\n                                    point.getDataLabelPath(dataLabel)) || point.graphic, labelOptions.textPath);\n                                if (point.dataLabelPath &&\n                                    !labelOptions.textPath.enabled) {\n                                    // clean the DOM\n                                    point.dataLabelPath = point.dataLabelPath.destroy();\n                                }\n                            }\n                            // Now the data label is created and placed at 0,0, so we\n                            // need to align it\n                            series.alignDataLabel(point, dataLabel, labelOptions, null, isNew);\n                        }\n                    });\n                });\n            }\n            fireEvent(this, 'afterDrawDataLabels');\n        };\n        /**\n         * Align each individual data label.\n         *\n         * @private\n         * @function Highcharts.Series#alignDataLabel\n         * @param {Highcharts.Point} point\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.DataLabelsOptions} options\n         * @param {Highcharts.BBoxObject} alignTo\n         * @param {boolean} [isNew]\n         * @return {void}\n         */\n        Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n            var series = this,\n                chart = this.chart,\n                inverted = this.isCartesian && chart.inverted,\n                enabledDataSorting = this.enabledDataSorting,\n                plotX = pick(point.dlBox && point.dlBox.centerX,\n                point.plotX, -9999),\n                plotY = pick(point.plotY, -9999),\n                bBox = dataLabel.getBBox(),\n                baseline,\n                rotation = options.rotation,\n                normRotation,\n                negRotation,\n                align = options.align,\n                rotCorr, // rotation correction\n                isInsidePlot = chart.isInsidePlot(plotX,\n                Math.round(plotY),\n                inverted), \n                // Math.round for rounding errors (#2683), alignTo to allow column\n                // labels (#2700)\n                alignAttr, // the final position;\n            justify = pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify', visible = this.visible &&\n                point.visible !== false &&\n                (point.series.forceDL ||\n                    (enabledDataSorting && !justify) ||\n                    isInsidePlot ||\n                    (\n                    // If the data label is inside the align box, it is enough\n                    // that parts of the align box is inside the plot area\n                    // (#12370)\n                    options.inside && alignTo && chart.isInsidePlot(plotX, inverted ?\n                        alignTo.x + 1 :\n                        alignTo.y + alignTo.height - 1, inverted))), setStartPos = function (alignOptions) {\n                if (enabledDataSorting && series.xAxis && !justify) {\n                    series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);\n                }\n            };\n            if (visible) {\n                baseline = chart.renderer.fontMetrics(chart.styledMode ? void 0 : options.style.fontSize, dataLabel).b;\n                // The alignment box is a singular point\n                alignTo = extend({\n                    x: inverted ? this.yAxis.len - plotY : plotX,\n                    y: Math.round(inverted ? this.xAxis.len - plotX : plotY),\n                    width: 0,\n                    height: 0\n                }, alignTo);\n                // Add the text size for alignment calculation\n                extend(options, {\n                    width: bBox.width,\n                    height: bBox.height\n                });\n                // Allow a hook for changing alignment in the last moment, then do the\n                // alignment\n                if (rotation) {\n                    justify = false; // Not supported for rotated text\n                    rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n                    alignAttr = {\n                        x: (alignTo.x +\n                            (options.x || 0) +\n                            alignTo.width / 2 +\n                            rotCorr.x),\n                        y: (alignTo.y +\n                            (options.y || 0) +\n                            { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] *\n                                alignTo.height)\n                    };\n                    setStartPos(alignAttr); // data sorting\n                    dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n                        .attr({\n                        align: align\n                    });\n                    // Compensate for the rotated label sticking out on the sides\n                    normRotation = (rotation + 720) % 360;\n                    negRotation = normRotation > 180 && normRotation < 360;\n                    if (align === 'left') {\n                        alignAttr.y -= negRotation ? bBox.height : 0;\n                    }\n                    else if (align === 'center') {\n                        alignAttr.x -= bBox.width / 2;\n                        alignAttr.y -= bBox.height / 2;\n                    }\n                    else if (align === 'right') {\n                        alignAttr.x -= bBox.width;\n                        alignAttr.y -= negRotation ? 0 : bBox.height;\n                    }\n                    dataLabel.placed = true;\n                    dataLabel.alignAttr = alignAttr;\n                }\n                else {\n                    setStartPos(alignTo); // data sorting\n                    dataLabel.align(options, null, alignTo);\n                    alignAttr = dataLabel.alignAttr;\n                }\n                // Handle justify or crop\n                if (justify && alignTo.height >= 0) { // #8830\n                    this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);\n                    // Now check that the data label is within the plot area\n                }\n                else if (pick(options.crop, true)) {\n                    visible =\n                        chart.isInsidePlot(alignAttr.x, alignAttr.y) &&\n                            chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n                }\n                // When we're using a shape, make it possible with a connector or an\n                // arrow pointing to thie point\n                if (options.shape && !rotation) {\n                    dataLabel[isNew ? 'attr' : 'animate']({\n                        anchorX: inverted ?\n                            chart.plotWidth - point.plotY :\n                            point.plotX,\n                        anchorY: inverted ?\n                            chart.plotHeight - point.plotX :\n                            point.plotY\n                    });\n                }\n            }\n            // To use alignAttr property in hideOverlappingLabels\n            if (isNew && enabledDataSorting) {\n                dataLabel.placed = false;\n            }\n            // Show or hide based on the final aligned position\n            if (!visible && (!enabledDataSorting || justify)) {\n                dataLabel.hide(true);\n                dataLabel.placed = false; // don't animate back in\n            }\n        };\n        /**\n         * Set starting position for data label sorting animation.\n         *\n         * @private\n         * @function Highcharts.Series#setDataLabelStartPos\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.ColumnPoint} point\n         * @param {boolean | undefined} [isNew]\n         * @param {boolean} [isInside]\n         * @param {Highcharts.AlignObject} [alignOptions]\n         *\n         * @return {void}\n         */\n        Series.prototype.setDataLabelStartPos = function (point, dataLabel, isNew, isInside, alignOptions) {\n            var chart = this.chart,\n                inverted = chart.inverted,\n                xAxis = this.xAxis,\n                reversed = xAxis.reversed,\n                labelCenter = inverted ? dataLabel.height / 2 : dataLabel.width / 2,\n                pointWidth = point.pointWidth,\n                halfWidth = pointWidth ? pointWidth / 2 : 0,\n                startXPos,\n                startYPos;\n            startXPos = inverted ?\n                alignOptions.x :\n                (reversed ?\n                    -labelCenter - halfWidth :\n                    xAxis.width - labelCenter + halfWidth);\n            startYPos = inverted ?\n                (reversed ?\n                    this.yAxis.height - labelCenter + halfWidth :\n                    -labelCenter - halfWidth) : alignOptions.y;\n            dataLabel.startXPos = startXPos;\n            dataLabel.startYPos = startYPos;\n            // We need to handle visibility in case of sorting point outside plot area\n            if (!isInside) {\n                dataLabel\n                    .attr({ opacity: 1 })\n                    .animate({ opacity: 0 }, void 0, dataLabel.hide);\n            }\n            else if (dataLabel.visibility === 'hidden') {\n                dataLabel.show();\n                dataLabel\n                    .attr({ opacity: 0 })\n                    .animate({ opacity: 1 });\n            }\n            // Save start position on first render, but do not change position\n            if (!chart.hasRendered) {\n                return;\n            }\n            // Set start position\n            if (isNew) {\n                dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });\n            }\n            dataLabel.placed = true;\n        };\n        /**\n         * If data labels fall partly outside the plot area, align them back in, in a\n         * way that doesn't hide the point.\n         *\n         * @private\n         * @function Highcharts.Series#justifyDataLabel\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.DataLabelsOptions} options\n         * @param {Highcharts.SVGAttributes} alignAttr\n         * @param {Highcharts.BBoxObject} bBox\n         * @param {Highcharts.BBoxObject} [alignTo]\n         * @param {boolean} [isNew]\n         * @return {boolean|undefined}\n         */\n        Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n            var chart = this.chart,\n                align = options.align,\n                verticalAlign = options.verticalAlign,\n                off,\n                justified,\n                padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n            var _a = options.x,\n                x = _a === void 0 ? 0 : _a,\n                _b = options.y,\n                y = _b === void 0 ? 0 : _b;\n            // Off left\n            off = alignAttr.x + padding;\n            if (off < 0) {\n                if (align === 'right' && x >= 0) {\n                    options.align = 'left';\n                    options.inside = true;\n                }\n                else {\n                    x -= off;\n                }\n                justified = true;\n            }\n            // Off right\n            off = alignAttr.x + bBox.width - padding;\n            if (off > chart.plotWidth) {\n                if (align === 'left' && x <= 0) {\n                    options.align = 'right';\n                    options.inside = true;\n                }\n                else {\n                    x += chart.plotWidth - off;\n                }\n                justified = true;\n            }\n            // Off top\n            off = alignAttr.y + padding;\n            if (off < 0) {\n                if (verticalAlign === 'bottom' && y >= 0) {\n                    options.verticalAlign = 'top';\n                    options.inside = true;\n                }\n                else {\n                    y -= off;\n                }\n                justified = true;\n            }\n            // Off bottom\n            off = alignAttr.y + bBox.height - padding;\n            if (off > chart.plotHeight) {\n                if (verticalAlign === 'top' && y <= 0) {\n                    options.verticalAlign = 'bottom';\n                    options.inside = true;\n                }\n                else {\n                    y += chart.plotHeight - off;\n                }\n                justified = true;\n            }\n            if (justified) {\n                options.x = x;\n                options.y = y;\n                dataLabel.placed = !isNew;\n                dataLabel.align(options, void 0, alignTo);\n            }\n            return justified;\n        };\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.dataLabelPositioners = {\n                // Based on the value computed in Highcharts' distribute algorithm.\n                radialDistributionY: function (point) {\n                    return point.top + point.distributeBox.pos;\n                },\n                // get the x - use the natural x position for labels near the\n                // top and bottom, to prevent the top and botton slice\n                // connectors from touching each other on either side\n                // Based on the value computed in Highcharts' distribute algorithm.\n                radialDistributionX: function (series, point, y, naturalY) {\n                    return series.getX(y < point.top + 2 || y > point.bottom - 2 ?\n                        naturalY :\n                        y, point.half, point);\n                },\n                // dataLabels.distance determines the x position of the label\n                justify: function (point, radius, seriesCenter) {\n                    return seriesCenter[0] + (point.half ? -1 : 1) *\n                        (radius + point.labelDistance);\n                },\n                // Left edges of the left-half labels touch the left edge of the plot\n                // area. Right edges of the right-half labels touch the right edge of\n                // the plot area.\n                alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {\n                    var dataLabelWidth = dataLabel.getBBox().width;\n                    return half ? dataLabelWidth + plotLeft :\n                        plotWidth - dataLabelWidth - plotLeft;\n                },\n                // Connectors of each side end in the same x position. Labels are\n                // aligned to them. Left edge of the widest left-half label touches the\n                // left edge of the plot area. Right edge of the widest right-half label\n                // touches the right edge of the plot area.\n                alignToConnectors: function (points, half, plotWidth, plotLeft) {\n                    var maxDataLabelWidth = 0,\n                        dataLabelWidth;\n                    // find widest data label\n                    points.forEach(function (point) {\n                        dataLabelWidth = point.dataLabel.getBBox().width;\n                        if (dataLabelWidth > maxDataLabelWidth) {\n                            maxDataLabelWidth = dataLabelWidth;\n                        }\n                    });\n                    return half ? maxDataLabelWidth + plotLeft :\n                        plotWidth - maxDataLabelWidth - plotLeft;\n                }\n            };\n            /**\n             * Override the base drawDataLabels method by pie specific functionality\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawDataLabels\n             * @return {void}\n             */\n            seriesTypes.pie.prototype.drawDataLabels = function () {\n                var series = this,\n                    data = series.data,\n                    point,\n                    chart = series.chart,\n                    options = series.options.dataLabels || {},\n                    connectorPadding = options.connectorPadding,\n                    connectorWidth,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotLeft = chart.plotLeft,\n                    maxWidth = Math.round(chart.chartWidth / 3),\n                    connector,\n                    seriesCenter = series.center,\n                    radius = seriesCenter[2] / 2,\n                    centerY = seriesCenter[1],\n                    dataLabel,\n                    dataLabelWidth, \n                    // labelPos,\n                    labelPosition,\n                    labelHeight, \n                    // divide the points into right and left halves for anti collision\n                    halves = [\n                        [],\n                        [] // left\n                    ],\n                    x,\n                    y,\n                    visibility,\n                    j,\n                    overflow = [0, 0, 0, 0], // top, right, bottom, left\n                    dataLabelPositioners = series.dataLabelPositioners,\n                    pointDataLabelsOptions;\n                // get out if not enabled\n                if (!series.visible ||\n                    (!options.enabled &&\n                        !series._hasPointLabels)) {\n                    return;\n                }\n                // Reset all labels that have been shortened\n                data.forEach(function (point) {\n                    if (point.dataLabel && point.visible && point.dataLabel.shortened) {\n                        point.dataLabel\n                            .attr({\n                            width: 'auto'\n                        }).css({\n                            width: 'auto',\n                            textOverflow: 'clip'\n                        });\n                        point.dataLabel.shortened = false;\n                    }\n                });\n                // run parent method\n                Series.prototype.drawDataLabels.apply(series);\n                data.forEach(function (point) {\n                    if (point.dataLabel) {\n                        if (point.visible) { // #407, #2510\n                            // Arrange points for detection collision\n                            halves[point.half].push(point);\n                            // Reset positions (#4905)\n                            point.dataLabel._pos = null;\n                            // Avoid long labels squeezing the pie size too far down\n                            if (!defined(options.style.width) &&\n                                !defined(point.options.dataLabels &&\n                                    point.options.dataLabels.style &&\n                                    point.options.dataLabels.style.width)) {\n                                if (point.dataLabel.getBBox().width > maxWidth) {\n                                    point.dataLabel.css({\n                                        // Use a fraction of the maxWidth to avoid\n                                        // wrapping close to the end of the string.\n                                        width: Math.round(maxWidth * 0.7) + 'px'\n                                    });\n                                    point.dataLabel.shortened = true;\n                                }\n                            }\n                        }\n                        else {\n                            point.dataLabel = point.dataLabel.destroy();\n                            // Workaround to make pies destroy multiple datalabels\n                            // correctly. This logic needs rewriting to support multiple\n                            // datalabels fully.\n                            if (point.dataLabels && point.dataLabels.length === 1) {\n                                delete point.dataLabels;\n                            }\n                        }\n                    }\n                });\n                /* Loop over the points in each half, starting from the top and bottom\n                 * of the pie to detect overlapping labels.\n                 */\n                halves.forEach(function (points, i) {\n                    var top,\n                        bottom,\n                        length = points.length,\n                        positions = [],\n                        naturalY,\n                        sideOverflow,\n                        size,\n                        distributionLength;\n                    if (!length) {\n                        return;\n                    }\n                    // Sort by angle\n                    series.sortByAngle(points, i - 0.5);\n                    // Only do anti-collision when we have dataLabels outside the pie\n                    // and have connectors. (#856)\n                    if (series.maxLabelDistance > 0) {\n                        top = Math.max(0, centerY - radius - series.maxLabelDistance);\n                        bottom = Math.min(centerY + radius + series.maxLabelDistance, chart.plotHeight);\n                        points.forEach(function (point) {\n                            // check if specific points' label is outside the pie\n                            if (point.labelDistance > 0 && point.dataLabel) {\n                                // point.top depends on point.labelDistance value\n                                // Used for calculation of y value in getX method\n                                point.top = Math.max(0, centerY - radius - point.labelDistance);\n                                point.bottom = Math.min(centerY + radius + point.labelDistance, chart.plotHeight);\n                                size = point.dataLabel.getBBox().height || 21;\n                                // point.positionsIndex is needed for getting index of\n                                // parameter related to specific point inside positions\n                                // array - not every point is in positions array.\n                                point.distributeBox = {\n                                    target: point.labelPosition.natural.y -\n                                        point.top + size / 2,\n                                    size: size,\n                                    rank: point.y\n                                };\n                                positions.push(point.distributeBox);\n                            }\n                        });\n                        distributionLength = bottom + size - top;\n                        H.distribute(positions, distributionLength, distributionLength / 5);\n                    }\n                    // Now the used slots are sorted, fill them up sequentially\n                    for (j = 0; j < length; j++) {\n                        point = points[j];\n                        // labelPos = point.labelPos;\n                        labelPosition = point.labelPosition;\n                        dataLabel = point.dataLabel;\n                        visibility = point.visible === false ? 'hidden' : 'inherit';\n                        naturalY = labelPosition.natural.y;\n                        y = naturalY;\n                        if (positions && defined(point.distributeBox)) {\n                            if (typeof point.distributeBox.pos === 'undefined') {\n                                visibility = 'hidden';\n                            }\n                            else {\n                                labelHeight = point.distributeBox.size;\n                                // Find label's y position\n                                y = dataLabelPositioners\n                                    .radialDistributionY(point);\n                            }\n                        }\n                        // It is needed to delete point.positionIndex for\n                        // dynamically added points etc.\n                        delete point.positionIndex; // @todo unused\n                        // Find label's x position\n                        // justify is undocumented in the API - preserve support for it\n                        if (options.justify) {\n                            x = dataLabelPositioners.justify(point, radius, seriesCenter);\n                        }\n                        else {\n                            switch (options.alignTo) {\n                                case 'connectors':\n                                    x = dataLabelPositioners.alignToConnectors(points, i, plotWidth, plotLeft);\n                                    break;\n                                case 'plotEdges':\n                                    x = dataLabelPositioners.alignToPlotEdges(dataLabel, i, plotWidth, plotLeft);\n                                    break;\n                                default:\n                                    x = dataLabelPositioners.radialDistributionX(series, point, y, naturalY);\n                            }\n                        }\n                        // Record the placement and visibility\n                        dataLabel._attr = {\n                            visibility: visibility,\n                            align: labelPosition.alignment\n                        };\n                        pointDataLabelsOptions = point.options.dataLabels || {};\n                        dataLabel._pos = {\n                            x: (x +\n                                pick(pointDataLabelsOptions.x, options.x) + // (#12985)\n                                ({\n                                    left: connectorPadding,\n                                    right: -connectorPadding\n                                }[labelPosition.alignment] || 0)),\n                            // 10 is for the baseline (label vs text)\n                            y: (y +\n                                pick(pointDataLabelsOptions.y, options.y) - // (#12985)\n                                10)\n                        };\n                        // labelPos.x = x;\n                        // labelPos.y = y;\n                        labelPosition.final.x = x;\n                        labelPosition.final.y = y;\n                        // Detect overflowing data labels\n                        if (pick(options.crop, true)) {\n                            dataLabelWidth = dataLabel.getBBox().width;\n                            sideOverflow = null;\n                            // Overflow left\n                            if (x - dataLabelWidth < connectorPadding &&\n                                i === 1 // left half\n                            ) {\n                                sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);\n                                overflow[3] = Math.max(sideOverflow, overflow[3]);\n                                // Overflow right\n                            }\n                            else if (x + dataLabelWidth > plotWidth - connectorPadding &&\n                                i === 0 // right half\n                            ) {\n                                sideOverflow = Math.round(x + dataLabelWidth - plotWidth + connectorPadding);\n                                overflow[1] = Math.max(sideOverflow, overflow[1]);\n                            }\n                            // Overflow top\n                            if (y - labelHeight / 2 < 0) {\n                                overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);\n                                // Overflow left\n                            }\n                            else if (y + labelHeight / 2 > plotHeight) {\n                                overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);\n                            }\n                            dataLabel.sideOverflow = sideOverflow;\n                        }\n                    } // for each point\n                }); // for each half\n                // Do not apply the final placement and draw the connectors until we\n                // have verified that labels are not spilling over.\n                if (arrayMax(overflow) === 0 ||\n                    this.verifyDataLabelOverflow(overflow)) {\n                    // Place the labels in the final position\n                    this.placeDataLabels();\n                    this.points.forEach(function (point) {\n                        // #8864: every connector can have individual options\n                        pointDataLabelsOptions =\n                            merge(options, point.options.dataLabels);\n                        connectorWidth =\n                            pick(pointDataLabelsOptions.connectorWidth, 1);\n                        // Draw the connector\n                        if (connectorWidth) {\n                            var isNew;\n                            connector = point.connector;\n                            dataLabel = point.dataLabel;\n                            if (dataLabel &&\n                                dataLabel._pos &&\n                                point.visible &&\n                                point.labelDistance > 0) {\n                                visibility = dataLabel._attr.visibility;\n                                isNew = !connector;\n                                if (isNew) {\n                                    point.connector = connector = chart.renderer\n                                        .path()\n                                        .addClass('highcharts-data-label-connector ' +\n                                        ' highcharts-color-' + point.colorIndex +\n                                        (point.className ?\n                                            ' ' + point.className :\n                                            ''))\n                                        .add(series.dataLabelsGroup);\n                                    if (!chart.styledMode) {\n                                        connector.attr({\n                                            'stroke-width': connectorWidth,\n                                            'stroke': (pointDataLabelsOptions.connectorColor ||\n                                                point.color ||\n                                                '#666666')\n                                        });\n                                    }\n                                }\n                                connector[isNew ? 'attr' : 'animate']({\n                                    d: point.getConnectorPath()\n                                });\n                                connector.attr('visibility', visibility);\n                            }\n                            else if (connector) {\n                                point.connector = connector.destroy();\n                            }\n                        }\n                    });\n                }\n            };\n            /**\n             * Extendable method for getting the path of the connector between the data\n             * label and the pie slice.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#connectorPath\n             *\n             * @param {*} labelPos\n             *\n             * @return {Highcharts.SVGPathArray}\n             */\n            // TODO: depracated - remove it\n            /*\n            seriesTypes.pie.prototype.connectorPath = function (labelPos) {\n                var x = labelPos.x,\n                        y = labelPos.y;\n                return pick(this.options.dataLabels.softConnector, true) ? [\n                    'M',\n                    // end of the string at the label\n                    x + (labelPos[6] === 'left' ? 5 : -5), y,\n                    'C',\n                    x, y, // first break, next to the label\n                    2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ] : [\n                    'M',\n                    // end of the string at the label\n                    x + (labelPos[6] === 'left' ? 5 : -5), y,\n                    'L',\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ];\n            };\n            */\n            /**\n             * Perform the final placement of the data labels after we have verified\n             * that they fall within the plot area.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#placeDataLabels\n             * @return {void}\n             */\n            seriesTypes.pie.prototype.placeDataLabels = function () {\n                this.points.forEach(function (point) {\n                    var dataLabel = point.dataLabel,\n                        _pos;\n                    if (dataLabel && point.visible) {\n                        _pos = dataLabel._pos;\n                        if (_pos) {\n                            // Shorten data labels with ellipsis if they still overflow\n                            // after the pie has reached minSize (#223).\n                            if (dataLabel.sideOverflow) {\n                                dataLabel._attr.width =\n                                    Math.max(dataLabel.getBBox().width -\n                                        dataLabel.sideOverflow, 0);\n                                dataLabel.css({\n                                    width: dataLabel._attr.width + 'px',\n                                    textOverflow: ((this.options.dataLabels.style || {})\n                                        .textOverflow ||\n                                        'ellipsis')\n                                });\n                                dataLabel.shortened = true;\n                            }\n                            dataLabel.attr(dataLabel._attr);\n                            dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n                            dataLabel.moved = true;\n                        }\n                        else if (dataLabel) {\n                            dataLabel.attr({ y: -9999 });\n                        }\n                    }\n                    // Clear for update\n                    delete point.distributeBox;\n                }, this);\n            };\n            seriesTypes.pie.prototype.alignDataLabel = noop;\n            /**\n             * Verify whether the data labels are allowed to draw, or we should run more\n             * translation and data label positioning to keep them inside the plot area.\n             * Returns true when data labels are ready to draw.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#verifyDataLabelOverflow\n             * @param {Array<number>} overflow\n             * @return {boolean}\n             */\n            seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {\n                var center = this.center,\n                    options = this.options,\n                    centerOption = options.center,\n                    minSize = options.minSize || 80,\n                    newSize = minSize, \n                    // If a size is set, return true and don't try to shrink the pie\n                    // to fit the labels.\n                    ret = options.size !== null;\n                if (!ret) {\n                    // Handle horizontal size and center\n                    if (centerOption[0] !== null) { // Fixed center\n                        newSize = Math.max(center[2] -\n                            Math.max(overflow[1], overflow[3]), minSize);\n                    }\n                    else { // Auto center\n                        newSize = Math.max(\n                        // horizontal overflow\n                        center[2] - overflow[1] - overflow[3], minSize);\n                        // horizontal center\n                        center[0] += (overflow[3] - overflow[1]) / 2;\n                    }\n                    // Handle vertical size and center\n                    if (centerOption[1] !== null) { // Fixed center\n                        newSize = clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));\n                    }\n                    else { // Auto center\n                        newSize = clamp(newSize, minSize, \n                        // vertical overflow\n                        center[2] - overflow[0] - overflow[2]);\n                        // vertical center\n                        center[1] += (overflow[0] - overflow[2]) / 2;\n                    }\n                    // If the size must be decreased, we need to run translate and\n                    // drawDataLabels again\n                    if (newSize < center[2]) {\n                        center[2] = newSize;\n                        center[3] = Math.min(// #3632\n                        relativeLength(options.innerSize || 0, newSize), newSize);\n                        this.translate(center);\n                        if (this.drawDataLabels) {\n                            this.drawDataLabels();\n                        }\n                        // Else, return true to indicate that the pie and its labels is\n                        // within the plot area\n                    }\n                    else {\n                        ret = true;\n                    }\n                }\n                return ret;\n            };\n        }\n        if (seriesTypes.column) {\n            /**\n             * Override the basic data label alignment by adjusting for the position of\n             * the column.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#alignDataLabel\n             * @param {Highcharts.Point} point\n             * @param {Highcharts.SVGElement} dataLabel\n             * @param {Highcharts.DataLabelsOptions} options\n             * @param {Highcharts.BBoxObject} alignTo\n             * @param {boolean} [isNew]\n             * @return {void}\n             */\n            seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n                var inverted = this.chart.inverted,\n                    series = point.series, \n                    // data label box for alignment\n                    dlBox = point.dlBox || point.shapeArgs,\n                    below = pick(point.below, // range series\n                    point.plotY >\n                        pick(this.translatedThreshold,\n                    series.yAxis.len)), \n                    // draw it inside the box?\n                    inside = pick(options.inside, !!this.options.stacking),\n                    overshoot;\n                // Align to the column itself, or the top of it\n                if (dlBox) { // Area range uses this method but not alignTo\n                    alignTo = merge(dlBox);\n                    if (alignTo.y < 0) {\n                        alignTo.height += alignTo.y;\n                        alignTo.y = 0;\n                    }\n                    // If parts of the box overshoots outside the plot area, modify the\n                    // box to center the label inside\n                    overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n                    if (overshoot > 0 && overshoot < alignTo.height) {\n                        alignTo.height -= overshoot;\n                    }\n                    if (inverted) {\n                        alignTo = {\n                            x: series.yAxis.len - alignTo.y - alignTo.height,\n                            y: series.xAxis.len - alignTo.x - alignTo.width,\n                            width: alignTo.height,\n                            height: alignTo.width\n                        };\n                    }\n                    // Compute the alignment box\n                    if (!inside) {\n                        if (inverted) {\n                            alignTo.x += below ? 0 : alignTo.width;\n                            alignTo.width = 0;\n                        }\n                        else {\n                            alignTo.y += below ? alignTo.height : 0;\n                            alignTo.height = 0;\n                        }\n                    }\n                }\n                // When alignment is undefined (typically columns and bars), display the\n                // individual point below or above the point depending on the threshold\n                options.align = pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');\n                options.verticalAlign = pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');\n                // Call the parent method\n                Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n                // If label was justified and we have contrast, set it:\n                if (options.inside && point.contrastColor) {\n                    dataLabel.css({\n                        color: point.contrastColor\n                    });\n                }\n            };\n        }\n\n    });\n    _registerModule(_modules, 'modules/overlapping-datalabels.src.js', [_modules['parts/Chart.js'], _modules['parts/Utilities.js']], function (Chart, U) {\n        /* *\n         *\n         *  Highcharts module to hide overlapping data labels.\n         *  This module is included in Highcharts.\n         *\n         *  (c) 2009-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable no-invalid-this */\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        addEvent(Chart, 'render', function collectAndHide() {\n            var labels = [];\n            // Consider external label collectors\n            (this.labelCollectors || []).forEach(function (collector) {\n                labels = labels.concat(collector());\n            });\n            (this.yAxis || []).forEach(function (yAxis) {\n                if (yAxis.stacking &&\n                    yAxis.options.stackLabels &&\n                    !yAxis.options.stackLabels.allowOverlap) {\n                    objectEach(yAxis.stacking.stacks, function (stack) {\n                        objectEach(stack, function (stackItem) {\n                            labels.push(stackItem.label);\n                        });\n                    });\n                }\n            });\n            (this.series || []).forEach(function (series) {\n                var dlOptions = series.options.dataLabels;\n                if (series.visible &&\n                    !(dlOptions.enabled === false && !series._hasPointLabels)) { // #3866\n                    (series.nodes || series.points).forEach(function (point) {\n                        if (point.visible) {\n                            var dataLabels = (isArray(point.dataLabels) ?\n                                    point.dataLabels :\n                                    (point.dataLabel ? [point.dataLabel] : []));\n                            dataLabels.forEach(function (label) {\n                                var options = label.options;\n                                label.labelrank = pick(options.labelrank, point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118\n                                if (!options.allowOverlap) {\n                                    labels.push(label);\n                                }\n                            });\n                        }\n                    });\n                }\n            });\n            this.hideOverlappingLabels(labels);\n        });\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         *\n         * @private\n         * @function Highcharts.Chart#hideOverlappingLabels\n         * @param {Array<Highcharts.SVGElement>} labels\n         * Rendered data labels\n         * @requires modules/overlapping-datalabels\n         */\n        Chart.prototype.hideOverlappingLabels = function (labels) {\n            var chart = this,\n                len = labels.length,\n                ren = chart.renderer,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                box1,\n                box2,\n                isLabelAffected = false,\n                isIntersectRect = function (box1,\n                box2) {\n                    return !(box2.x > box1.x + box1.width ||\n                        box2.x + box2.width < box1.x ||\n                        box2.y > box1.y + box1.height ||\n                        box2.y + box2.height < box1.y);\n            }, \n            // Get the box with its position inside the chart, as opposed to getBBox\n            // that only reports the position relative to the parent.\n            getAbsoluteBox = function (label) {\n                var pos,\n                    parent,\n                    bBox, \n                    // Substract the padding if no background or border (#4333)\n                    padding = label.box ? 0 : (label.padding || 0),\n                    lineHeightCorrection = 0,\n                    xOffset = 0,\n                    boxWidth,\n                    alignValue;\n                if (label &&\n                    (!label.alignAttr || label.placed)) {\n                    pos = label.alignAttr || {\n                        x: label.attr('x'),\n                        y: label.attr('y')\n                    };\n                    parent = label.parentGroup;\n                    // Get width and height if pure text nodes (stack labels)\n                    if (!label.width) {\n                        bBox = label.getBBox();\n                        label.width = bBox.width;\n                        label.height = bBox.height;\n                        // Labels positions are computed from top left corner, so\n                        // we need to substract the text height from text nodes too.\n                        lineHeightCorrection = ren\n                            .fontMetrics(null, label.element).h;\n                    }\n                    boxWidth = label.width - 2 * padding;\n                    alignValue = {\n                        left: '0',\n                        center: '0.5',\n                        right: '1'\n                    }[label.alignValue];\n                    if (alignValue) {\n                        xOffset = +alignValue * boxWidth;\n                    }\n                    else if (isNumber(label.x) && Math.round(label.x) !== label.translateX) {\n                        xOffset = label.x - label.translateX;\n                    }\n                    return {\n                        x: pos.x + (parent.translateX || 0) + padding - xOffset,\n                        y: pos.y + (parent.translateY || 0) + padding -\n                            lineHeightCorrection,\n                        width: label.width - 2 * padding,\n                        height: label.height - 2 * padding\n                    };\n                }\n            };\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    // Mark with initial opacity\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                    label.absoluteBox = getAbsoluteBox(label);\n                }\n            }\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function (a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n                box1 = label1 && label1.absoluteBox;\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    box2 = label2 && label2.absoluteBox;\n                    if (box1 &&\n                        box2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.newOpacity !== 0 &&\n                        label2.newOpacity !== 0) {\n                        if (isIntersectRect(box1, box2)) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                                .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n            // Hide or show\n            labels.forEach(function (label) {\n                var complete,\n                    newOpacity;\n                if (label) {\n                    newOpacity = label.newOpacity;\n                    if (label.oldOpacity !== newOpacity) {\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (label.alignAttr && label.placed) { // data labels\n                            label[newOpacity ? 'removeClass' : 'addClass']('highcharts-data-label-hidden');\n                            complete = function () {\n                                if (!chart.styledMode) {\n                                    label.css({ pointerEvents: newOpacity ? 'auto' : 'none' });\n                                }\n                                label.visibility = newOpacity ? 'inherit' : 'hidden';\n                                label.placed = !!newOpacity;\n                            };\n                            isLabelAffected = true;\n                            // Animate or set the opacity\n                            label.alignAttr.opacity = newOpacity;\n                            label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);\n                            fireEvent(chart, 'afterHideOverlappingLabel');\n                        }\n                        else { // other labels, tick labels\n                            label.attr({\n                                opacity: newOpacity\n                            });\n                        }\n                    }\n                    label.isOld = true;\n                }\n            });\n            if (isLabelAffected) {\n                fireEvent(chart, 'afterHideAllOverlappingLabels');\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/Interaction.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Legend.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (Chart, H, Legend, O, Point, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /**\n         * @interface Highcharts.PointEventsOptionsObject\n         */ /**\n        * Fires when the point is selected either programmatically or following a click\n        * on the point. One parameter, `event`, is passed to the function. Returning\n        * `false` cancels the operation.\n        * @name Highcharts.PointEventsOptionsObject#select\n        * @type {Highcharts.PointSelectCallbackFunction|undefined}\n        */ /**\n        * Fires when the point is unselected either programmatically or following a\n        * click on the point. One parameter, `event`, is passed to the function.\n        * Returning `false` cancels the operation.\n        * @name Highcharts.PointEventsOptionsObject#unselect\n        * @type {Highcharts.PointUnselectCallbackFunction|undefined}\n        */\n        /**\n         * Information about the select/unselect event.\n         *\n         * @interface Highcharts.PointInteractionEventObject\n         * @extends global.Event\n         */ /**\n        * @name Highcharts.PointInteractionEventObject#accumulate\n        * @type {boolean}\n        */\n        /**\n         * Gets fired when the point is selected either programmatically or following a\n         * click on the point.\n         *\n         * @callback Highcharts.PointSelectCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointInteractionEventObject} event\n         *        Event that occured.\n         */\n        /**\n         * Fires when the point is unselected either programmatically or following a\n         * click on the point.\n         *\n         * @callback Highcharts.PointUnselectCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointInteractionEventObject} event\n         *        Event that occured.\n         */\n        var hasTouch = H.hasTouch,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            TrackerMixin;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * TrackerMixin for points and graphs.\n         *\n         * @private\n         * @mixin Highcharts.TrackerMixin\n         */\n        TrackerMixin = H.TrackerMixin = {\n            /**\n             * Draw the tracker for a point.\n             *\n             * @private\n             * @function Highcharts.TrackerMixin.drawTrackerPoint\n             * @param {Highcharts.Series} this\n             * @fires Highcharts.Series#event:afterDrawTracker\n             */\n            drawTrackerPoint: function () {\n                var series = this,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    onMouseOver = function (e) {\n                        var point = pointer.getPointFromEvent(e);\n                    // undefined on graph in scatterchart\n                    if (typeof point !== 'undefined') {\n                        pointer.isDirectTouch = true;\n                        point.onMouseOver(e);\n                    }\n                }, dataLabels;\n                // Add reference to the point\n                series.points.forEach(function (point) {\n                    dataLabels = (isArray(point.dataLabels) ?\n                        point.dataLabels :\n                        (point.dataLabel ? [point.dataLabel] : []));\n                    if (point.graphic) {\n                        point.graphic.element.point = point;\n                    }\n                    dataLabels.forEach(function (dataLabel) {\n                        if (dataLabel.div) {\n                            dataLabel.div.point = point;\n                        }\n                        else {\n                            dataLabel.element.point = point;\n                        }\n                    });\n                });\n                // Add the event listeners, we need to do this only once\n                if (!series._hasTracking) {\n                    series.trackerGroups.forEach(function (key) {\n                        if (series[key]) {\n                            // we don't always have dataLabelsGroup\n                            series[key]\n                                .addClass('highcharts-tracker')\n                                .on('mouseover', onMouseOver)\n                                .on('mouseout', function (e) {\n                                pointer.onTrackerMouseOut(e);\n                            });\n                            if (hasTouch) {\n                                series[key].on('touchstart', onMouseOver);\n                            }\n                            if (!chart.styledMode && series.options.cursor) {\n                                series[key]\n                                    .css(css)\n                                    .css({ cursor: series.options.cursor });\n                            }\n                        }\n                    });\n                    series._hasTracking = true;\n                }\n                fireEvent(this, 'afterDrawTracker');\n            },\n            /**\n             * Draw the tracker object that sits above all data labels and markers to\n             * track mouse events on the graph or points. For the line type charts\n             * the tracker uses the same graphPath, but with a greater stroke width\n             * for better control.\n             *\n             * @private\n             * @function Highcharts.TrackerMixin.drawTrackerGraph\n             * @param {Highcharts.Series} this\n             * @fires Highcharts.Series#event:afterDrawTracker\n             */\n            drawTrackerGraph: function () {\n                var series = this,\n                    options = series.options,\n                    trackByArea = options.trackByArea,\n                    trackerPath = [].concat(trackByArea ?\n                        series.areaPath :\n                        series.graphPath), \n                    // trackerPathLength = trackerPath.length,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    renderer = chart.renderer,\n                    snap = chart.options.tooltip.snap,\n                    tracker = series.tracker,\n                    i,\n                    onMouseOver = function (e) {\n                        if (chart.hoverSeries !== series) {\n                            series.onMouseOver();\n                    }\n                }, \n                /*\n                 * Empirical lowest possible opacities for TRACKER_FILL for an\n                 * element to stay invisible but clickable\n                 * IE6: 0.002\n                 * IE7: 0.002\n                 * IE8: 0.002\n                 * IE9: 0.00000000001 (unlimited)\n                 * IE10: 0.0001 (exporting only)\n                 * FF: 0.00000000001 (unlimited)\n                 * Chrome: 0.000001\n                 * Safari: 0.000001\n                 * Opera: 0.00000000001 (unlimited)\n                 */\n                TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n                // Draw the tracker\n                if (tracker) {\n                    tracker.attr({ d: trackerPath });\n                }\n                else if (series.graph) { // create\n                    series.tracker = renderer.path(trackerPath)\n                        .attr({\n                        visibility: series.visible ? 'visible' : 'hidden',\n                        zIndex: 2\n                    })\n                        .addClass(trackByArea ?\n                        'highcharts-tracker-area' :\n                        'highcharts-tracker-line')\n                        .add(series.group);\n                    if (!chart.styledMode) {\n                        series.tracker.attr({\n                            'stroke-linecap': 'round',\n                            'stroke-linejoin': 'round',\n                            stroke: TRACKER_FILL,\n                            fill: trackByArea ? TRACKER_FILL : 'none',\n                            'stroke-width': series.graph.strokeWidth() +\n                                (trackByArea ? 0 : 2 * snap)\n                        });\n                    }\n                    // The tracker is added to the series group, which is clipped, but\n                    // is covered by the marker group. So the marker group also needs to\n                    // capture events.\n                    [series.tracker, series.markerGroup].forEach(function (tracker) {\n                        tracker.addClass('highcharts-tracker')\n                            .on('mouseover', onMouseOver)\n                            .on('mouseout', function (e) {\n                            pointer.onTrackerMouseOut(e);\n                        });\n                        if (options.cursor && !chart.styledMode) {\n                            tracker.css({ cursor: options.cursor });\n                        }\n                        if (hasTouch) {\n                            tracker.on('touchstart', onMouseOver);\n                        }\n                    });\n                }\n                fireEvent(this, 'afterDrawTracker');\n            }\n        };\n        /* End TrackerMixin */\n        // Add tracking event listener to the series group, so the point graphics\n        // themselves act as trackers\n        if (seriesTypes.column) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.column#drawTracker\n             */\n            seriesTypes.column.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        if (seriesTypes.pie) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.pie#drawTracker\n             */\n            seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        if (seriesTypes.scatter) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.scatter#drawTracker\n             */\n            seriesTypes.scatter.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        // Extend Legend for item events.\n        extend(Legend.prototype, {\n            /**\n             * @private\n             * @function Highcharts.Legend#setItemEvents\n             * @param {Highcharts.BubbleLegend|Point|Highcharts.Series} item\n             * @param {Highcharts.SVGElement} legendItem\n             * @param {boolean} [useHTML=false]\n             * @fires Highcharts.Point#event:legendItemClick\n             * @fires Highcharts.Series#event:legendItemClick\n             */\n            setItemEvents: function (item, legendItem, useHTML) {\n                var legend = this,\n                    boxWrapper = legend.chart.renderer.boxWrapper,\n                    isPoint = item instanceof Point,\n                    activeClass = 'highcharts-legend-' +\n                        (isPoint ? 'point' : 'series') + '-active',\n                    styledMode = legend.chart.styledMode, \n                    // When `useHTML`, the symbol is rendered in other group, so\n                    // we need to apply events listeners to both places\n                    legendItems = useHTML ?\n                        [legendItem,\n                    item.legendSymbol] :\n                        [item.legendGroup];\n                // Set the events on the item group, or in case of useHTML, the item\n                // itself (#1249)\n                legendItems.forEach(function (element) {\n                    if (element) {\n                        element\n                            .on('mouseover', function () {\n                            if (item.visible) {\n                                legend.allItems.forEach(function (inactiveItem) {\n                                    if (item !== inactiveItem) {\n                                        inactiveItem.setState('inactive', !isPoint);\n                                    }\n                                });\n                            }\n                            item.setState('hover');\n                            // A CSS class to dim or hide other than the hovered\n                            // series.\n                            // Works only if hovered series is visible (#10071).\n                            if (item.visible) {\n                                boxWrapper.addClass(activeClass);\n                            }\n                            if (!styledMode) {\n                                legendItem.css(legend.options.itemHoverStyle);\n                            }\n                        })\n                            .on('mouseout', function () {\n                            if (!legend.chart.styledMode) {\n                                legendItem.css(merge(item.visible ?\n                                    legend.itemStyle :\n                                    legend.itemHiddenStyle));\n                            }\n                            legend.allItems.forEach(function (inactiveItem) {\n                                if (item !== inactiveItem) {\n                                    inactiveItem.setState('', !isPoint);\n                                }\n                            });\n                            // A CSS class to dim or hide other than the hovered\n                            // series.\n                            boxWrapper.removeClass(activeClass);\n                            item.setState();\n                        })\n                            .on('click', function (event) {\n                            var strLegendItemClick = 'legendItemClick',\n                                fnLegendItemClick = function () {\n                                    if (item.setVisible) {\n                                        item.setVisible();\n                                }\n                                // Reset inactive state\n                                legend.allItems.forEach(function (inactiveItem) {\n                                    if (item !== inactiveItem) {\n                                        inactiveItem.setState(item.visible ? 'inactive' : '', !isPoint);\n                                    }\n                                });\n                            };\n                            // A CSS class to dim or hide other than the hovered\n                            // series. Event handling in iOS causes the activeClass\n                            // to be added prior to click in some cases (#7418).\n                            boxWrapper.removeClass(activeClass);\n                            // Pass over the click/touch event. #4.\n                            event = {\n                                browserEvent: event\n                            };\n                            // click the name or symbol\n                            if (item.firePointEvent) { // point\n                                item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n                            }\n                            else {\n                                fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n                            }\n                        });\n                    }\n                });\n            },\n            /**\n             * @private\n             * @function Highcharts.Legend#createCheckboxForItem\n             * @param {Highcharts.BubbleLegend|Point|Highcharts.Series} item\n             * @fires Highcharts.Series#event:checkboxClick\n             */\n            createCheckboxForItem: function (item) {\n                var legend = this;\n                item.checkbox = createElement('input', {\n                    type: 'checkbox',\n                    className: 'highcharts-legend-checkbox',\n                    checked: item.selected,\n                    defaultChecked: item.selected // required by IE7\n                }, legend.options.itemCheckboxStyle, legend.chart.container);\n                addEvent(item.checkbox, 'click', function (event) {\n                    var target = event.target;\n                    fireEvent(item.series || item, 'checkboxClick', {\n                        checked: target.checked,\n                        item: item\n                    }, function () {\n                        item.select();\n                    });\n                });\n            }\n        });\n        // Extend the Chart object with interaction\n        extend(Chart.prototype, /** @lends Chart.prototype */ {\n            /**\n             * Display the zoom button, so users can reset zoom to the default view\n             * settings.\n             *\n             * @function Highcharts.Chart#showResetZoom\n             *\n             * @fires Highcharts.Chart#event:afterShowResetZoom\n             * @fires Highcharts.Chart#event:beforeShowResetZoom\n             */\n            showResetZoom: function () {\n                var chart = this,\n                    lang = defaultOptions.lang,\n                    btnOptions = chart.options.chart.resetZoomButton,\n                    theme = btnOptions.theme,\n                    states = theme.states,\n                    alignTo = (btnOptions.relativeTo === 'chart' ||\n                        btnOptions.relativeTo === 'spaceBox' ?\n                        null :\n                        'plotBox');\n                /**\n                 * @private\n                 */\n                function zoomOut() {\n                    chart.zoomOut();\n                }\n                fireEvent(this, 'beforeShowResetZoom', null, function () {\n                    chart.resetZoomButton = chart.renderer\n                        .button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n                        .attr({\n                        align: btnOptions.position.align,\n                        title: lang.resetZoomTitle\n                    })\n                        .addClass('highcharts-reset-zoom')\n                        .add()\n                        .align(btnOptions.position, false, alignTo);\n                });\n                fireEvent(this, 'afterShowResetZoom');\n            },\n            /**\n             * Zoom the chart out after a user has zoomed in. See also\n             * [Axis.setExtremes](/class-reference/Highcharts.Axis#setExtremes).\n             *\n             * @function Highcharts.Chart#zoomOut\n             *\n             * @fires Highcharts.Chart#event:selection\n             */\n            zoomOut: function () {\n                fireEvent(this, 'selection', { resetSelection: true }, this.zoom);\n            },\n            /**\n             * Zoom into a given portion of the chart given by axis coordinates.\n             *\n             * @private\n             * @function Highcharts.Chart#zoom\n             * @param {Highcharts.SelectEventObject} event\n             */\n            zoom: function (event) {\n                var chart = this,\n                    hasZoomed,\n                    pointer = chart.pointer,\n                    displayButton = false,\n                    mouseDownPos = chart.inverted ? pointer.mouseDownX : pointer.mouseDownY,\n                    resetZoomButton;\n                // If zoom is called with no arguments, reset the axes\n                if (!event || event.resetSelection) {\n                    chart.axes.forEach(function (axis) {\n                        hasZoomed = axis.zoom();\n                    });\n                    pointer.initiated = false; // #6804\n                }\n                else { // else, zoom in on all axes\n                    event.xAxis.concat(event.yAxis).forEach(function (axisData) {\n                        var axis = axisData.axis,\n                            axisStartPos = chart.inverted ? axis.left : axis.top,\n                            axisEndPos = chart.inverted ?\n                                axisStartPos + axis.width : axisStartPos + axis.height,\n                            isXAxis = axis.isXAxis,\n                            isWithinPane = false;\n                        // Check if zoomed area is within the pane (#1289).\n                        // In case of multiple panes only one pane should be zoomed.\n                        if ((!isXAxis &&\n                            mouseDownPos >= axisStartPos &&\n                            mouseDownPos <= axisEndPos) ||\n                            isXAxis ||\n                            !defined(mouseDownPos)) {\n                            isWithinPane = true;\n                        }\n                        // don't zoom more than minRange\n                        if (pointer[isXAxis ? 'zoomX' : 'zoomY'] && isWithinPane) {\n                            hasZoomed = axis.zoom(axisData.min, axisData.max);\n                            if (axis.displayBtn) {\n                                displayButton = true;\n                            }\n                        }\n                    });\n                }\n                // Show or hide the Reset zoom button\n                resetZoomButton = chart.resetZoomButton;\n                if (displayButton && !resetZoomButton) {\n                    chart.showResetZoom();\n                }\n                else if (!displayButton && isObject(resetZoomButton)) {\n                    chart.resetZoomButton = resetZoomButton.destroy();\n                }\n                // Redraw\n                if (hasZoomed) {\n                    chart.redraw(pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100));\n                }\n            },\n            /**\n             * Pan the chart by dragging the mouse across the pane. This function is\n             * called on mouse move, and the distance to pan is computed from chartX\n             * compared to the first chartX position in the dragging operation.\n             *\n             * @private\n             * @function Highcharts.Chart#pan\n             * @param {Highcharts.PointerEventObject} e\n             * @param {string} panning\n             */\n            pan: function (e, panning) {\n                var chart = this,\n                    hoverPoints = chart.hoverPoints,\n                    panningOptions,\n                    chartOptions = chart.options.chart,\n                    hasMapNavigation = chart.options.mapNavigation &&\n                        chart.options.mapNavigation.enabled,\n                    doRedraw,\n                    type;\n                if (typeof panning === 'object') {\n                    panningOptions = panning;\n                }\n                else {\n                    panningOptions = {\n                        enabled: panning,\n                        type: 'x'\n                    };\n                }\n                if (chartOptions && chartOptions.panning) {\n                    chartOptions.panning = panningOptions;\n                }\n                type = panningOptions.type;\n                fireEvent(this, 'pan', { originalEvent: e }, function () {\n                    // remove active points for shared tooltip\n                    if (hoverPoints) {\n                        hoverPoints.forEach(function (point) {\n                            point.setState();\n                        });\n                    }\n                    // panning axis mapping\n                    var xy = [1]; // x\n                        if (type === 'xy') {\n                            xy = [1, 0];\n                    }\n                    else if (type === 'y') {\n                        xy = [0];\n                    }\n                    xy.forEach(function (isX) {\n                        var axis = chart[isX ? 'xAxis' : 'yAxis'][0], horiz = axis.horiz, mousePos = e[horiz ? 'chartX' : 'chartY'], mouseDown = horiz ? 'mouseDownX' : 'mouseDownY', startPos = chart[mouseDown], halfPointRange = (axis.pointRange || 0) / 2, pointRangeDirection = (axis.reversed && !chart.inverted) ||\n                                (!axis.reversed && chart.inverted) ?\n                                -1 :\n                                1, extremes = axis.getExtremes(), panMin = axis.toValue(startPos - mousePos, true) +\n                                halfPointRange * pointRangeDirection, panMax = axis.toValue(startPos + axis.len - mousePos, true) -\n                                halfPointRange * pointRangeDirection, flipped = panMax < panMin, newMin = flipped ? panMax : panMin, newMax = flipped ? panMin : panMax, hasVerticalPanning = axis.hasVerticalPanning(), paddedMin, paddedMax, spill, panningState = axis.panningState;\n                        // General calculations of panning state.\n                        // This is related to using vertical panning. (#11315).\n                        axis.series.forEach(function (series) {\n                            if (hasVerticalPanning &&\n                                !isX && (!panningState || panningState.isDirty)) {\n                                var processedData = series.getProcessedData(true),\n                                    dataExtremes = series.getExtremes(processedData.yData,\n                                    true);\n                                if (!panningState) {\n                                    panningState = {\n                                        startMin: Number.MAX_VALUE,\n                                        startMax: -Number.MAX_VALUE\n                                    };\n                                }\n                                if (isNumber(dataExtremes.dataMin) &&\n                                    isNumber(dataExtremes.dataMax)) {\n                                    panningState.startMin = Math.min(dataExtremes.dataMin, panningState.startMin);\n                                    panningState.startMax = Math.max(dataExtremes.dataMax, panningState.startMax);\n                                }\n                            }\n                        });\n                        paddedMin = Math.min(H.pick(panningState === null || panningState === void 0 ? void 0 : panningState.startMin, extremes.dataMin), halfPointRange ?\n                            extremes.min :\n                            axis.toValue(axis.toPixels(extremes.min) -\n                                axis.minPixelPadding));\n                        paddedMax = Math.max(H.pick(panningState === null || panningState === void 0 ? void 0 : panningState.startMax, extremes.dataMax), halfPointRange ?\n                            extremes.max :\n                            axis.toValue(axis.toPixels(extremes.max) +\n                                axis.minPixelPadding));\n                        axis.panningState = panningState;\n                        // It is not necessary to calculate extremes on ordinal axis,\n                        // because they are already calculated, so we don't want to\n                        // override them.\n                        if (!axis.isOrdinal) {\n                            // If the new range spills over, either to the min or max,\n                            // adjust the new range.\n                            spill = paddedMin - newMin;\n                            if (spill > 0) {\n                                newMax += spill;\n                                newMin = paddedMin;\n                            }\n                            spill = newMax - paddedMax;\n                            if (spill > 0) {\n                                newMax = paddedMax;\n                                newMin -= spill;\n                            }\n                            // Set new extremes if they are actually new\n                            if (axis.series.length &&\n                                newMin !== extremes.min &&\n                                newMax !== extremes.max &&\n                                newMin >= paddedMin &&\n                                newMax <= paddedMax) {\n                                axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });\n                                if (!chart.resetZoomButton &&\n                                    !hasMapNavigation &&\n                                    // Show reset zoom button only when both newMin and\n                                    // newMax values are between padded axis range.\n                                    newMin !== paddedMin &&\n                                    newMax !== paddedMax &&\n                                    type.match('y')) {\n                                    chart.showResetZoom();\n                                    axis.displayBtn = false;\n                                }\n                                doRedraw = true;\n                            }\n                            // set new reference for next run:\n                            chart[mouseDown] = mousePos;\n                        }\n                    });\n                    if (doRedraw) {\n                        chart.redraw(false);\n                    }\n                    css(chart.container, { cursor: 'move' });\n                });\n            }\n        });\n        // Extend the Point object with interaction\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Toggle the selection status of a point.\n             *\n             * @see Highcharts.Chart#getSelectedPoints\n             *\n             * @sample highcharts/members/point-select/\n             *         Select a point from a button\n             * @sample highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample maps/series/data-id/\n             *         Select a point in Highmaps\n             *\n             * @function Highcharts.Point#select\n             *\n             * @param {boolean} [selected]\n             * When `true`, the point is selected. When `false`, the point is\n             * unselected. When `null` or `undefined`, the selection state is toggled.\n             *\n             * @param {boolean} [accumulate=false]\n             * When `true`, the selection is added to other selected points.\n             * When `false`, other selected points are deselected. Internally in\n             * Highcharts, when\n             * [allowPointSelect](https://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect)\n             * is `true`, selected points are accumulated on Control, Shift or Cmd\n             * clicking the point.\n             *\n             * @fires Highcharts.Point#event:select\n             * @fires Highcharts.Point#event:unselect\n             */\n            select: function (selected, accumulate) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n                selected = pick(selected, !point.selected);\n                this.selectedStaging = selected;\n                // fire the event with the default handler\n                point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n                    /**\n                     * Whether the point is selected or not.\n                     *\n                     * @see Point#select\n                     * @see Chart#getSelectedPoints\n                     *\n                     * @name Highcharts.Point#selected\n                     * @type {boolean}\n                     */\n                    point.selected = point.options.selected = selected;\n                    series.options.data[series.data.indexOf(point)] =\n                        point.options;\n                    point.setState(selected && 'select');\n                    // unselect all other points unless Ctrl or Cmd + click\n                    if (!accumulate) {\n                        chart.getSelectedPoints().forEach(function (loopPoint) {\n                            var loopSeries = loopPoint.series;\n                            if (loopPoint.selected && loopPoint !== point) {\n                                loopPoint.selected = loopPoint.options.selected =\n                                    false;\n                                loopSeries.options.data[loopSeries.data.indexOf(loopPoint)] = loopPoint.options;\n                                // Programatically selecting a point should restore\n                                // normal state, but when click happened on other\n                                // point, set inactive state to match other points\n                                loopPoint.setState(chart.hoverPoints &&\n                                    loopSeries.options.inactiveOtherPoints ?\n                                    'inactive' : '');\n                                loopPoint.firePointEvent('unselect');\n                            }\n                        });\n                    }\n                });\n                delete this.selectedStaging;\n            },\n            /**\n             * Runs on mouse over the point. Called internally from mouse and touch\n             * events.\n             *\n             * @function Highcharts.Point#onMouseOver\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             *        The event arguments.\n             */\n            onMouseOver: function (e) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    pointer = chart.pointer;\n                e = e ?\n                    pointer.normalize(e) :\n                    // In cases where onMouseOver is called directly without an event\n                    pointer.getChartCoordinatesFromPoint(point, chart.inverted);\n                pointer.runPointActions(e, point);\n            },\n            /**\n             * Runs on mouse out from the point. Called internally from mouse and touch\n             * events.\n             *\n             * @function Highcharts.Point#onMouseOut\n             * @fires Highcharts.Point#event:mouseOut\n             */\n            onMouseOut: function () {\n                var point = this,\n                    chart = point.series.chart;\n                point.firePointEvent('mouseOut');\n                if (!point.series.options.inactiveOtherPoints) {\n                    (chart.hoverPoints || []).forEach(function (p) {\n                        p.setState();\n                    });\n                }\n                chart.hoverPoints = chart.hoverPoint = null;\n            },\n            /**\n             * Import events from the series' and point's options. Only do it on\n             * demand, to save processing time on hovering.\n             *\n             * @private\n             * @function Highcharts.Point#importEvents\n             */\n            importEvents: function () {\n                if (!this.hasImportedEvents) {\n                    var point = this,\n                        options = merge(point.series.options.point,\n                        point.options),\n                        events = options.events;\n                    point.events = events;\n                    objectEach(events, function (event, eventType) {\n                        if (isFunction(event)) {\n                            addEvent(point, eventType, event);\n                        }\n                    });\n                    this.hasImportedEvents = true;\n                }\n            },\n            /**\n             * Set the point's state.\n             *\n             * @function Highcharts.Point#setState\n             *\n             * @param {Highcharts.PointStateValue|\"\"} [state]\n             *        The new state, can be one of `'hover'`, `'select'`, `'inactive'`,\n             *        or `''` (an empty string), `'normal'` or `undefined` to set to\n             *        normal state.\n             * @param {boolean} [move]\n             *        State for animation.\n             *\n             * @fires Highcharts.Point#event:afterSetState\n             */\n            setState: function (state, move) {\n                var point = this,\n                    series = point.series,\n                    previousState = point.state,\n                    stateOptions = (series.options.states[state || 'normal'] ||\n                        {}),\n                    markerOptions = (defaultOptions.plotOptions[series.type].marker &&\n                        series.options.marker),\n                    normalDisabled = (markerOptions && markerOptions.enabled === false),\n                    markerStateOptions = ((markerOptions &&\n                        markerOptions.states &&\n                        markerOptions.states[state || 'normal']) || {}),\n                    stateDisabled = markerStateOptions.enabled === false,\n                    stateMarkerGraphic = series.stateMarkerGraphic,\n                    pointMarker = point.marker || {},\n                    chart = series.chart,\n                    halo = series.halo,\n                    haloOptions,\n                    markerAttribs,\n                    pointAttribs,\n                    pointAttribsAnimation,\n                    hasMarkers = (markerOptions && series.markerAttribs),\n                    newSymbol;\n                state = state || ''; // empty string\n                if (\n                // already has this state\n                (state === point.state && !move) ||\n                    // selected points don't respond to hover\n                    (point.selected && state !== 'select') ||\n                    // series' state options is disabled\n                    (stateOptions.enabled === false) ||\n                    // general point marker's state options is disabled\n                    (state && (stateDisabled ||\n                        (normalDisabled &&\n                            markerStateOptions.enabled === false))) ||\n                    // individual point marker's state options is disabled\n                    (state &&\n                        pointMarker.states &&\n                        pointMarker.states[state] &&\n                        pointMarker.states[state].enabled === false) // #1610\n                ) {\n                    return;\n                }\n                point.state = state;\n                if (hasMarkers) {\n                    markerAttribs = series.markerAttribs(point, state);\n                }\n                // Apply hover styles to the existing point\n                if (point.graphic) {\n                    if (previousState) {\n                        point.graphic.removeClass('highcharts-point-' + previousState);\n                    }\n                    if (state) {\n                        point.graphic.addClass('highcharts-point-' + state);\n                    }\n                    if (!chart.styledMode) {\n                        pointAttribs = series.pointAttribs(point, state);\n                        pointAttribsAnimation = pick(chart.options.chart.animation, stateOptions.animation);\n                        // Some inactive points (e.g. slices in pie) should apply\n                        // oppacity also for it's labels\n                        if (series.options.inactiveOtherPoints && pointAttribs.opacity) {\n                            (point.dataLabels || []).forEach(function (label) {\n                                if (label) {\n                                    label.animate({\n                                        opacity: pointAttribs.opacity\n                                    }, pointAttribsAnimation);\n                                }\n                            });\n                            if (point.connector) {\n                                point.connector.animate({\n                                    opacity: pointAttribs.opacity\n                                }, pointAttribsAnimation);\n                            }\n                        }\n                        point.graphic.animate(pointAttribs, pointAttribsAnimation);\n                    }\n                    if (markerAttribs) {\n                        point.graphic.animate(markerAttribs, pick(\n                        // Turn off globally:\n                        chart.options.chart.animation, markerStateOptions.animation, markerOptions.animation));\n                    }\n                    // Zooming in from a range with no markers to a range with markers\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic.hide();\n                    }\n                }\n                else {\n                    // if a graphic is not applied to each point in the normal state,\n                    // create a shared graphic for the hover state\n                    if (state && markerStateOptions) {\n                        newSymbol = pointMarker.symbol || series.symbol;\n                        // If the point has another symbol than the previous one, throw\n                        // away the state marker graphic and force a new one (#1459)\n                        if (stateMarkerGraphic &&\n                            stateMarkerGraphic.currentSymbol !== newSymbol) {\n                            stateMarkerGraphic = stateMarkerGraphic.destroy();\n                        }\n                        // Add a new state marker graphic\n                        if (markerAttribs) {\n                            if (!stateMarkerGraphic) {\n                                if (newSymbol) {\n                                    series.stateMarkerGraphic = stateMarkerGraphic =\n                                        chart.renderer\n                                            .symbol(newSymbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height)\n                                            .add(series.markerGroup);\n                                    stateMarkerGraphic.currentSymbol = newSymbol;\n                                }\n                                // Move the existing graphic\n                            }\n                            else {\n                                stateMarkerGraphic[move ? 'animate' : 'attr']({\n                                    x: markerAttribs.x,\n                                    y: markerAttribs.y\n                                });\n                            }\n                        }\n                        if (!chart.styledMode && stateMarkerGraphic) {\n                            stateMarkerGraphic.attr(series.pointAttribs(point, state));\n                        }\n                    }\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic[state && point.isInside ? 'show' : 'hide'](); // #2450\n                        stateMarkerGraphic.element.point = point; // #4310\n                    }\n                }\n                // Show me your halo\n                haloOptions = stateOptions.halo;\n                var markerGraphic = (point.graphic || stateMarkerGraphic);\n                var markerVisibility = (markerGraphic && markerGraphic.visibility || 'inherit');\n                if (haloOptions &&\n                    haloOptions.size &&\n                    markerGraphic &&\n                    markerVisibility !== 'hidden' &&\n                    !point.isCluster) {\n                    if (!halo) {\n                        series.halo = halo = chart.renderer.path()\n                            // #5818, #5903, #6705\n                            .add(markerGraphic.parentGroup);\n                    }\n                    halo.show()[move ? 'animate' : 'attr']({\n                        d: point.haloPath(haloOptions.size)\n                    });\n                    halo.attr({\n                        'class': 'highcharts-halo highcharts-color-' +\n                            pick(point.colorIndex, series.colorIndex) +\n                            (point.className ? ' ' + point.className : ''),\n                        'visibility': markerVisibility,\n                        'zIndex': -1 // #4929, #8276\n                    });\n                    halo.point = point; // #6055\n                    if (!chart.styledMode) {\n                        halo.attr(extend({\n                            'fill': point.color || series.color,\n                            'fill-opacity': haloOptions.opacity\n                        }, haloOptions.attributes));\n                    }\n                }\n                else if (halo && halo.point && halo.point.haloPath) {\n                    // Animate back to 0 on the current halo point (#6055)\n                    halo.animate({ d: halo.point.haloPath(0) }, null, \n                    // Hide after unhovering. The `complete` callback runs in the\n                    // halo's context (#7681).\n                    halo.hide);\n                }\n                fireEvent(point, 'afterSetState');\n            },\n            /**\n             * Get the path definition for the halo, which is usually a shadow-like\n             * circle around the currently hovered point.\n             *\n             * @function Highcharts.Point#haloPath\n             *\n             * @param {number} size\n             *        The radius of the circular halo.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The path definition.\n             */\n            haloPath: function (size) {\n                var series = this.series,\n                    chart = series.chart;\n                return chart.renderer.symbols.circle(Math.floor(this.plotX) - size, this.plotY - size, size * 2, size * 2);\n            }\n        });\n        // Extend the Series object with interaction\n        extend(Series.prototype, /** @lends Highcharts.Series.prototype */ {\n            /**\n             * Runs on mouse over the series graphical items.\n             *\n             * @function Highcharts.Series#onMouseOver\n             * @fires Highcharts.Series#event:mouseOver\n             */\n            onMouseOver: function () {\n                var series = this,\n                    chart = series.chart,\n                    hoverSeries = chart.hoverSeries,\n                    pointer = chart.pointer;\n                pointer.setHoverChartIndex();\n                // set normal state to previous series\n                if (hoverSeries && hoverSeries !== series) {\n                    hoverSeries.onMouseOut();\n                }\n                // trigger the event, but to save processing time,\n                // only if defined\n                if (series.options.events.mouseOver) {\n                    fireEvent(series, 'mouseOver');\n                }\n                // hover this\n                series.setState('hover');\n                /**\n                 * Contains the original hovered series.\n                 *\n                 * @name Highcharts.Chart#hoverSeries\n                 * @type {Highcharts.Series|null}\n                 */\n                chart.hoverSeries = series;\n            },\n            /**\n             * Runs on mouse out of the series graphical items.\n             *\n             * @function Highcharts.Series#onMouseOut\n             *\n             * @fires Highcharts.Series#event:mouseOut\n             */\n            onMouseOut: function () {\n                // trigger the event only if listeners exist\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    tooltip = chart.tooltip,\n                    hoverPoint = chart.hoverPoint;\n                // #182, set to null before the mouseOut event fires\n                chart.hoverSeries = null;\n                // trigger mouse out on the point, which must be in this series\n                if (hoverPoint) {\n                    hoverPoint.onMouseOut();\n                }\n                // fire the mouse out event\n                if (series && options.events.mouseOut) {\n                    fireEvent(series, 'mouseOut');\n                }\n                // hide the tooltip\n                if (tooltip &&\n                    !series.stickyTracking &&\n                    (!tooltip.shared || series.noSharedTooltip)) {\n                    tooltip.hide();\n                }\n                // Reset all inactive states\n                chart.series.forEach(function (s) {\n                    s.setState('', true);\n                });\n            },\n            /**\n             * Set the state of the series. Called internally on mouse interaction\n             * operations, but it can also be called directly to visually\n             * highlight a series.\n             *\n             * @function Highcharts.Series#setState\n             *\n             * @param {Highcharts.SeriesStateValue|\"\"} [state]\n             *        The new state, can be either `'hover'`, `'inactive'`, `'select'`,\n             *        or `''` (an empty string), `'normal'` or `undefined` to set to\n             *        normal state.\n             * @param {boolean} [inherit]\n             *        Determines if state should be inherited by points too.\n             */\n            setState: function (state, inherit) {\n                var series = this,\n                    options = series.options,\n                    graph = series.graph,\n                    inactiveOtherPoints = options.inactiveOtherPoints,\n                    stateOptions = options.states,\n                    lineWidth = options.lineWidth,\n                    opacity = options.opacity, \n                    // By default a quick animation to hover/inactive,\n                    // slower to un-hover\n                    stateAnimation = pick((stateOptions[state || 'normal'] &&\n                        stateOptions[state || 'normal'].animation),\n                    series.chart.options.chart.animation),\n                    attribs,\n                    i = 0;\n                state = state || '';\n                if (series.state !== state) {\n                    // Toggle class names\n                    [\n                        series.group,\n                        series.markerGroup,\n                        series.dataLabelsGroup\n                    ].forEach(function (group) {\n                        if (group) {\n                            // Old state\n                            if (series.state) {\n                                group.removeClass('highcharts-series-' + series.state);\n                            }\n                            // New state\n                            if (state) {\n                                group.addClass('highcharts-series-' + state);\n                            }\n                        }\n                    });\n                    series.state = state;\n                    if (!series.chart.styledMode) {\n                        if (stateOptions[state] &&\n                            stateOptions[state].enabled === false) {\n                            return;\n                        }\n                        if (state) {\n                            lineWidth = (stateOptions[state].lineWidth ||\n                                lineWidth + (stateOptions[state].lineWidthPlus || 0)); // #4035\n                            opacity = pick(stateOptions[state].opacity, opacity);\n                        }\n                        if (graph && !graph.dashstyle) {\n                            attribs = {\n                                'stroke-width': lineWidth\n                            };\n                            // Animate the graph stroke-width.\n                            graph.animate(attribs, stateAnimation);\n                            while (series['zone-graph-' + i]) {\n                                series['zone-graph-' + i].attr(attribs);\n                                i = i + 1;\n                            }\n                        }\n                        // For some types (pie, networkgraph, sankey) opacity is\n                        // resolved on a point level\n                        if (!inactiveOtherPoints) {\n                            [\n                                series.group,\n                                series.markerGroup,\n                                series.dataLabelsGroup,\n                                series.labelBySeries\n                            ].forEach(function (group) {\n                                if (group) {\n                                    group.animate({\n                                        opacity: opacity\n                                    }, stateAnimation);\n                                }\n                            });\n                        }\n                    }\n                }\n                // Don't loop over points on a series that doesn't apply inactive state\n                // to siblings markers (e.g. line, column)\n                if (inherit && inactiveOtherPoints && series.points) {\n                    series.setAllPointsToState(state);\n                }\n            },\n            /**\n             * Set the state for all points in the series.\n             *\n             * @function Highcharts.Series#setAllPointsToState\n             *\n             * @private\n             *\n             * @param {string} [state]\n             *        Can be either `hover` or undefined to set to normal state.\n             */\n            setAllPointsToState: function (state) {\n                this.points.forEach(function (point) {\n                    if (point.setState) {\n                        point.setState(state);\n                    }\n                });\n            },\n            /**\n             * Show or hide the series.\n             *\n             * @function Highcharts.Series#setVisible\n             *\n             * @param {boolean} [visible]\n             * True to show the series, false to hide. If undefined, the visibility is\n             * toggled.\n             *\n             * @param {boolean} [redraw=true]\n             * Whether to redraw the chart after the series is altered. If doing more\n             * operations on the chart, it is a good idea to set redraw to false and\n             * call {@link Chart#redraw|chart.redraw()} after.\n             *\n             * @fires Highcharts.Series#event:hide\n             * @fires Highcharts.Series#event:show\n             */\n            setVisible: function (vis, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    legendItem = series.legendItem,\n                    showOrHide,\n                    ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n                    oldVisibility = series.visible;\n                // if called without an argument, toggle visibility\n                series.visible =\n                    vis =\n                        series.options.visible =\n                            series.userOptions.visible =\n                                typeof vis === 'undefined' ? !oldVisibility : vis; // #5618\n                showOrHide = vis ? 'show' : 'hide';\n                // show or hide elements\n                [\n                    'group',\n                    'dataLabelsGroup',\n                    'markerGroup',\n                    'tracker',\n                    'tt'\n                ].forEach(function (key) {\n                    if (series[key]) {\n                        series[key][showOrHide]();\n                    }\n                });\n                // hide tooltip (#1361)\n                if (chart.hoverSeries === series ||\n                    (chart.hoverPoint && chart.hoverPoint.series) === series) {\n                    series.onMouseOut();\n                }\n                if (legendItem) {\n                    chart.legend.colorizeItem(series, vis);\n                }\n                // rescale or adapt to resized chart\n                series.isDirty = true;\n                // in a stack, all other series are affected\n                if (series.options.stacking) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.options.stacking && otherSeries.visible) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n                // show or hide linked series\n                series.linkedSeries.forEach(function (otherSeries) {\n                    otherSeries.setVisible(vis, false);\n                });\n                if (ignoreHiddenSeries) {\n                    chart.isDirtyBox = true;\n                }\n                fireEvent(series, showOrHide);\n                if (redraw !== false) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Show the series if hidden.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             *\n             * @function Highcharts.Series#show\n             * @fires Highcharts.Series#event:show\n             */\n            show: function () {\n                this.setVisible(true);\n            },\n            /**\n             * Hide the series if visible. If the\n             * [chart.ignoreHiddenSeries](https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries)\n             * option is true, the chart is redrawn without this series.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             *\n             * @function Highcharts.Series#hide\n             * @fires Highcharts.Series#event:hide\n             */\n            hide: function () {\n                this.setVisible(false);\n            },\n            /**\n             * Select or unselect the series. This means its\n             * {@link Highcharts.Series.selected|selected}\n             * property is set, the checkbox in the legend is toggled and when selected,\n             * the series is returned by the {@link Highcharts.Chart#getSelectedSeries}\n             * function.\n             *\n             * @sample highcharts/members/series-select/\n             *         Select a series from a button\n             *\n             * @function Highcharts.Series#select\n             *\n             * @param {boolean} [selected]\n             * True to select the series, false to unselect. If undefined, the selection\n             * state is toggled.\n             *\n             * @fires Highcharts.Series#event:select\n             * @fires Highcharts.Series#event:unselect\n             */\n            select: function (selected) {\n                var series = this;\n                series.selected =\n                    selected =\n                        this.options.selected = (typeof selected === 'undefined' ?\n                            !series.selected :\n                            selected);\n                if (series.checkbox) {\n                    series.checkbox.checked = selected;\n                }\n                fireEvent(series, selected ? 'select' : 'unselect');\n            },\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerGraph as Highcharts.Series#drawTracker\n             */\n            drawTracker: TrackerMixin.drawTrackerGraph\n        });\n\n    });\n    _registerModule(_modules, 'parts/Responsive.js', [_modules['parts/Chart.js'], _modules['parts/Utilities.js']], function (Chart, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var find = U.find,\n            isArray = U.isArray,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            splat = U.splat,\n            uniqueKey = U.uniqueKey;\n        /**\n         * A callback function to gain complete control on when the responsive rule\n         * applies.\n         *\n         * @callback Highcharts.ResponsiveCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        Chart context.\n         *\n         * @return {boolean}\n         *         Return `true` if it applies.\n         */\n        /**\n         * Allows setting a set of rules to apply for different screen or chart\n         * sizes. Each rule specifies additional chart options.\n         *\n         * @sample {highstock} stock/demo/responsive/\n         *         Stock chart\n         * @sample highcharts/responsive/axis/\n         *         Axis\n         * @sample highcharts/responsive/legend/\n         *         Legend\n         * @sample highcharts/responsive/classname/\n         *         Class name\n         *\n         * @since     5.0.0\n         * @apioption responsive\n         */\n        /**\n         * A set of rules for responsive settings. The rules are executed from\n         * the top down.\n         *\n         * @sample {highcharts} highcharts/responsive/axis/\n         *         Axis changes\n         * @sample {highstock} highcharts/responsive/axis/\n         *         Axis changes\n         * @sample {highmaps} highcharts/responsive/axis/\n         *         Axis changes\n         *\n         * @type      {Array<*>}\n         * @since     5.0.0\n         * @apioption responsive.rules\n         */\n        /**\n         * A full set of chart options to apply as overrides to the general\n         * chart options. The chart options are applied when the given rule\n         * is active.\n         *\n         * A special case is configuration objects that take arrays, for example\n         * [xAxis](#xAxis), [yAxis](#yAxis) or [series](#series). For these\n         * collections, an `id` option is used to map the new option set to\n         * an existing object. If an existing object of the same id is not found,\n         * the item of the same indexupdated. So for example, setting `chartOptions`\n         * with two series items without an `id`, will cause the existing chart's\n         * two series to be updated with respective options.\n         *\n         * @sample {highstock} stock/demo/responsive/\n         *         Stock chart\n         * @sample highcharts/responsive/axis/\n         *         Axis\n         * @sample highcharts/responsive/legend/\n         *         Legend\n         * @sample highcharts/responsive/classname/\n         *         Class name\n         *\n         * @type      {Highcharts.Options}\n         * @since     5.0.0\n         * @apioption responsive.rules.chartOptions\n         */\n        /**\n         * Under which conditions the rule applies.\n         *\n         * @since     5.0.0\n         * @apioption responsive.rules.condition\n         */\n        /**\n         * A callback function to gain complete control on when the responsive\n         * rule applies. Return `true` if it applies. This opens for checking\n         * against other metrics than the chart size, for example the document\n         * size or other elements.\n         *\n         * @type      {Highcharts.ResponsiveCallbackFunction}\n         * @since     5.0.0\n         * @context   Highcharts.Chart\n         * @apioption responsive.rules.condition.callback\n         */\n        /**\n         * The responsive rule applies if the chart height is less than this.\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.maxHeight\n         */\n        /**\n         * The responsive rule applies if the chart width is less than this.\n         *\n         * @sample highcharts/responsive/axis/\n         *         Max width is 500\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.maxWidth\n         */\n        /**\n         * The responsive rule applies if the chart height is greater than this.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.minHeight\n         */\n        /**\n         * The responsive rule applies if the chart width is greater than this.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.minWidth\n         */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Update the chart based on the current chart/document size and options for\n         * responsiveness.\n         *\n         * @private\n         * @function Highcharts.Chart#setResponsive\n         * @param  {boolean} [redraw=true]\n         * @param  {boolean} [reset=false]\n         * Reset by un-applying all rules. Chart.update resets all rules before applying\n         * updated options.\n         */\n        Chart.prototype.setResponsive = function (redraw, reset) {\n            var options = this.options.responsive,\n                ruleIds = [],\n                currentResponsive = this.currentResponsive,\n                currentRuleIds,\n                undoOptions;\n            if (!reset && options && options.rules) {\n                options.rules.forEach(function (rule) {\n                    if (typeof rule._id === 'undefined') {\n                        rule._id = uniqueKey();\n                    }\n                    this.matchResponsiveRule(rule, ruleIds /* , redraw */);\n                }, this);\n            }\n            // Merge matching rules\n            var mergedOptions = merge.apply(0,\n                ruleIds.map(function (ruleId) {\n                    return find(options.rules,\n                function (rule) {\n                        return rule._id === ruleId;\n                }).chartOptions;\n            }));\n            mergedOptions.isResponsiveOptions = true;\n            // Stringified key for the rules that currently apply.\n            ruleIds = (ruleIds.toString() || void 0);\n            currentRuleIds = currentResponsive && currentResponsive.ruleIds;\n            // Changes in what rules apply\n            if (ruleIds !== currentRuleIds) {\n                // Undo previous rules. Before we apply a new set of rules, we need to\n                // roll back completely to base options (#6291).\n                if (currentResponsive) {\n                    this.update(currentResponsive.undoOptions, redraw, true);\n                }\n                if (ruleIds) {\n                    // Get undo-options for matching rules\n                    undoOptions = this.currentOptions(mergedOptions);\n                    undoOptions.isResponsiveOptions = true;\n                    this.currentResponsive = {\n                        ruleIds: ruleIds,\n                        mergedOptions: mergedOptions,\n                        undoOptions: undoOptions\n                    };\n                    this.update(mergedOptions, redraw, true);\n                }\n                else {\n                    this.currentResponsive = void 0;\n                }\n            }\n        };\n        /**\n         * Handle a single responsiveness rule.\n         *\n         * @private\n         * @function Highcharts.Chart#matchResponsiveRule\n         * @param {Highcharts.ResponsiveRulesOptions} rule\n         * @param {Array<string>} matches\n         */\n        Chart.prototype.matchResponsiveRule = function (rule, matches) {\n            var condition = rule.condition,\n                fn = condition.callback || function () {\n                    return (this.chartWidth <= pick(condition.maxWidth,\n                Number.MAX_VALUE) &&\n                        this.chartHeight <=\n                            pick(condition.maxHeight,\n                Number.MAX_VALUE) &&\n                        this.chartWidth >= pick(condition.minWidth, 0) &&\n                        this.chartHeight >= pick(condition.minHeight, 0));\n            };\n            if (fn.call(this)) {\n                matches.push(rule._id);\n            }\n        };\n        /**\n         * Get the current values for a given set of options. Used before we update\n         * the chart with a new responsiveness rule.\n         *\n         * @todo Restore axis options (by id?). The matching of items in collections\n         * bears resemblance to the oneToOne matching in Chart.update. Probably we can\n         * refactor out that matching and reuse it in both functions.\n         *\n         * @private\n         * @function Highcharts.Chart#currentOptions\n         * @param {Highcharts.Options} options\n         * @return {Highcharts.Options}\n         */\n        Chart.prototype.currentOptions = function (options) {\n            var chart = this,\n                ret = {};\n            /**\n             * Recurse over a set of options and its current values,\n             * and store the current values in the ret object.\n             */\n            function getCurrent(options, curr, ret, depth) {\n                var i;\n                objectEach(options, function (val, key) {\n                    if (!depth &&\n                        chart.collectionsWithUpdate.indexOf(key) > -1) {\n                        val = splat(val);\n                        ret[key] = [];\n                        // Iterate over collections like series, xAxis or yAxis and map\n                        // the items by index.\n                        for (i = 0; i < Math.max(val.length, curr[key].length); i++) {\n                            // Item exists in current data (#6347)\n                            if (curr[key][i]) {\n                                // If the item is missing from the new data, we need to\n                                // save the whole config structure. Like when\n                                // responsively updating from a dual axis layout to a\n                                // single axis and back (#13544).\n                                if (val[i] === void 0) {\n                                    ret[key][i] = curr[key][i];\n                                    // Otherwise, proceed\n                                }\n                                else {\n                                    ret[key][i] = {};\n                                    getCurrent(val[i], curr[key][i], ret[key][i], depth + 1);\n                                }\n                            }\n                        }\n                    }\n                    else if (isObject(val)) {\n                        ret[key] = isArray(val) ? [] : {};\n                        getCurrent(val, curr[key] || {}, ret[key], depth + 1);\n                    }\n                    else if (typeof curr[key] === 'undefined') { // #10286\n                        ret[key] = null;\n                    }\n                    else {\n                        ret[key] = curr[key];\n                    }\n                });\n            }\n            getCurrent(options, this.options, ret, 0);\n            return ret;\n        };\n\n    });\n    _registerModule(_modules, 'masters/highcharts.src.js', [_modules['parts/Globals.js']], function (Highcharts) {\n\n\n        return Highcharts;\n    });\n    _modules['masters/highcharts.src.js']._modules = _modules;\n    return _modules['masters/highcharts.src.js'];\n}));\n\n/***/ }),\n/* 981 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * (c) 2014-2019 Highsoft AS\n * Authors: Jon Arild Nygard / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n\n(function (factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = factory;\n    } else if (true) {\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(531)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (Highcharts) {\n            factory(Highcharts);\n            factory.Highcharts = Highcharts;\n            return factory;\n        }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    } else {\n        factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);\n    }\n}(function (Highcharts) {\n    var _modules = Highcharts ? Highcharts._modules : {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'mixins/tree-series.js', [_modules['parts/Color.js'], _modules['parts/Utilities.js']], function (Color, U) {\n        /* *\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var extend = U.extend,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            merge = U.merge,\n            pick = U.pick;\n        var isBoolean = function (x) {\n                return typeof x === 'boolean';\n        }, isFn = function (x) {\n            return typeof x === 'function';\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * @todo Combine buildTree and buildNode with setTreeValues\n         * @todo Remove logic from Treemap and make it utilize this mixin.\n         * @private\n         */\n        var setTreeValues = function setTreeValues(tree,\n            options) {\n                var before = options.before,\n            idRoot = options.idRoot,\n            mapIdToNode = options.mapIdToNode,\n            nodeRoot = mapIdToNode[idRoot],\n            levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                    options.levelIsConstant :\n                    true),\n            points = options.points,\n            point = points[tree.i],\n            optionsPoint = point && point.options || {},\n            childrenTotal = 0,\n            children = [],\n            value;\n            extend(tree, {\n                levelDynamic: tree.level - (levelIsConstant ? 0 : nodeRoot.level),\n                name: pick(point && point.name, ''),\n                visible: (idRoot === tree.id ||\n                    (isBoolean(options.visible) ? options.visible : false))\n            });\n            if (isFn(before)) {\n                tree = before(tree, options);\n            }\n            // First give the children some values\n            tree.children.forEach(function (child, i) {\n                var newOptions = extend({},\n                    options);\n                extend(newOptions, {\n                    index: i,\n                    siblings: tree.children.length,\n                    visible: tree.visible\n                });\n                child = setTreeValues(child, newOptions);\n                children.push(child);\n                if (child.visible) {\n                    childrenTotal += child.val;\n                }\n            });\n            tree.visible = childrenTotal > 0 || tree.visible;\n            // Set the values\n            value = pick(optionsPoint.value, childrenTotal);\n            extend(tree, {\n                children: children,\n                childrenTotal: childrenTotal,\n                isLeaf: tree.visible && !childrenTotal,\n                val: value\n            });\n            return tree;\n        };\n        /**\n         * @private\n         */\n        var getColor = function getColor(node,\n            options) {\n                var index = options.index,\n            mapOptionsToLevel = options.mapOptionsToLevel,\n            parentColor = options.parentColor,\n            parentColorIndex = options.parentColorIndex,\n            series = options.series,\n            colors = options.colors,\n            siblings = options.siblings,\n            points = series.points,\n            getColorByPoint,\n            chartOptionsChart = series.chart.options.chart,\n            point,\n            level,\n            colorByPoint,\n            colorIndexByPoint,\n            color,\n            colorIndex;\n            /**\n             * @private\n             */\n            function variation(color) {\n                var colorVariation = level && level.colorVariation;\n                if (colorVariation) {\n                    if (colorVariation.key === 'brightness') {\n                        return Color.parse(color).brighten(colorVariation.to * (index / siblings)).get();\n                    }\n                }\n                return color;\n            }\n            if (node) {\n                point = points[node.i];\n                level = mapOptionsToLevel[node.level] || {};\n                getColorByPoint = point && level.colorByPoint;\n                if (getColorByPoint) {\n                    colorIndexByPoint = point.index % (colors ?\n                        colors.length :\n                        chartOptionsChart.colorCount);\n                    colorByPoint = colors && colors[colorIndexByPoint];\n                }\n                // Select either point color, level color or inherited color.\n                if (!series.chart.styledMode) {\n                    color = pick(point && point.options.color, level && level.color, colorByPoint, parentColor && variation(parentColor), series.color);\n                }\n                colorIndex = pick(point && point.options.colorIndex, level && level.colorIndex, colorIndexByPoint, parentColorIndex, options.colorIndex);\n            }\n            return {\n                color: color,\n                colorIndex: colorIndex\n            };\n        };\n        /**\n         * Creates a map from level number to its given options.\n         *\n         * @private\n         * @function getLevelOptions\n         * @param {object} params\n         *        Object containing parameters.\n         *        - `defaults` Object containing default options. The default options\n         *           are merged with the userOptions to get the final options for a\n         *           specific level.\n         *        - `from` The lowest level number.\n         *        - `levels` User options from series.levels.\n         *        - `to` The highest level number.\n         * @return {Highcharts.Dictionary<object>|null}\n         *         Returns a map from level number to its given options.\n         */\n        var getLevelOptions = function getLevelOptions(params) {\n                var result = null,\n            defaults,\n            converted,\n            i,\n            from,\n            to,\n            levels;\n            if (isObject(params)) {\n                result = {};\n                from = isNumber(params.from) ? params.from : 1;\n                levels = params.levels;\n                converted = {};\n                defaults = isObject(params.defaults) ? params.defaults : {};\n                if (isArray(levels)) {\n                    converted = levels.reduce(function (obj, item) {\n                        var level,\n                            levelIsConstant,\n                            options;\n                        if (isObject(item) && isNumber(item.level)) {\n                            options = merge({}, item);\n                            levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                                options.levelIsConstant :\n                                defaults.levelIsConstant);\n                            // Delete redundant properties.\n                            delete options.levelIsConstant;\n                            delete options.level;\n                            // Calculate which level these options apply to.\n                            level = item.level + (levelIsConstant ? 0 : from - 1);\n                            if (isObject(obj[level])) {\n                                extend(obj[level], options);\n                            }\n                            else {\n                                obj[level] = options;\n                            }\n                        }\n                        return obj;\n                    }, {});\n                }\n                to = isNumber(params.to) ? params.to : 1;\n                for (i = 0; i <= to; i++) {\n                    result[i] = merge({}, defaults, isObject(converted[i]) ? converted[i] : {});\n                }\n            }\n            return result;\n        };\n        /**\n         * Update the rootId property on the series. Also makes sure that it is\n         * accessible to exporting.\n         *\n         * @private\n         * @function updateRootId\n         *\n         * @param {object} series\n         *        The series to operate on.\n         *\n         * @return {string}\n         *         Returns the resulting rootId after update.\n         */\n        var updateRootId = function (series) {\n                var rootId,\n            options;\n            if (isObject(series)) {\n                // Get the series options.\n                options = isObject(series.options) ? series.options : {};\n                // Calculate the rootId.\n                rootId = pick(series.rootNode, options.rootId, '');\n                // Set rootId on series.userOptions to pick it up in exporting.\n                if (isObject(series.userOptions)) {\n                    series.userOptions.rootId = rootId;\n                }\n                // Set rootId on series to pick it up on next update.\n                series.rootNode = rootId;\n            }\n            return rootId;\n        };\n        var result = {\n                getColor: getColor,\n                getLevelOptions: getLevelOptions,\n                setTreeValues: setTreeValues,\n                updateRootId: updateRootId\n            };\n\n        return result;\n    });\n    _registerModule(_modules, 'mixins/draw-point.js', [], function () {\n        /* *\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var isFn = function (x) {\n                return typeof x === 'function';\n        };\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handles the drawing of a component.\n         * Can be used for any type of component that reserves the graphic property, and\n         * provides a shouldDraw on its context.\n         *\n         * @private\n         * @function draw\n         * @param {DrawPointParams} params\n         *        Parameters.\n         *\n         * @todo add type checking.\n         * @todo export this function to enable usage\n         */\n        var draw = function draw(params) {\n                var _a;\n            var component = this,\n                graphic = component.graphic,\n                animatableAttribs = params.animatableAttribs,\n                onComplete = params.onComplete,\n                css = params.css,\n                renderer = params.renderer,\n                animation = (_a = component.series) === null || _a === void 0 ? void 0 : _a.options.animation;\n            if (component.shouldDraw()) {\n                if (!graphic) {\n                    component.graphic = graphic =\n                        renderer[params.shapeType](params.shapeArgs)\n                            .add(params.group);\n                }\n                graphic\n                    .css(css)\n                    .attr(params.attribs)\n                    .animate(animatableAttribs, params.isNew ? false : animation, onComplete);\n            }\n            else if (graphic) {\n                var destroy = function () {\n                        component.graphic = graphic = graphic.destroy();\n                    if (isFn(onComplete)) {\n                        onComplete();\n                    }\n                };\n                // animate only runs complete callback if something was animated.\n                if (Object.keys(animatableAttribs).length) {\n                    graphic.animate(animatableAttribs, void 0, function () {\n                        destroy();\n                    });\n                }\n                else {\n                    destroy();\n                }\n            }\n        };\n        /**\n         * An extended version of draw customized for points.\n         * It calls additional methods that is expected when rendering a point.\n         * @private\n         * @param {Highcharts.Dictionary<any>} params Parameters\n         */\n        var drawPoint = function drawPoint(params) {\n                var point = this,\n            attribs = params.attribs = params.attribs || {};\n            // Assigning class in dot notation does go well in IE8\n            // eslint-disable-next-line dot-notation\n            attribs['class'] = point.getClassName();\n            // Call draw to render component\n            draw.call(point, params);\n        };\n\n        return drawPoint;\n    });\n    _registerModule(_modules, 'modules/treemap.src.js', [_modules['parts/Globals.js'], _modules['mixins/tree-series.js'], _modules['mixins/draw-point.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (H, mixinTreeSeries, drawPoint, Color, LegendSymbolMixin, Point, U) {\n        /* *\n         *\n         *  (c) 2014-2020 Highsoft AS\n         *\n         *  Authors: Jon Arild Nygard / Oystein Moseng\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var addEvent = U.addEvent,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            seriesType = U.seriesType,\n            stableSort = U.stableSort;\n        /* eslint-disable no-invalid-this */\n        var AXIS_MAX = 100;\n        var seriesTypes = H.seriesTypes,\n            noop = H.noop,\n            getColor = mixinTreeSeries.getColor,\n            getLevelOptions = mixinTreeSeries.getLevelOptions, \n            // @todo Similar to eachObject, this function is likely redundant\n            isBoolean = function (x) {\n                return typeof x === 'boolean';\n        }, Series = H.Series, \n        // @todo Similar to recursive, this function is likely redundant\n        eachObject = function (list, func, context) {\n            context = context || this;\n            objectEach(list, function (val, key) {\n                func.call(context, val, key, list);\n            });\n        }, \n        // @todo find correct name for this function.\n        // @todo Similar to reduce, this function is likely redundant\n        recursive = function (item, func, context) {\n            var next;\n            context = context || this;\n            next = func.call(context, item);\n            if (next !== false) {\n                recursive(next, func, context);\n            }\n        }, updateRootId = mixinTreeSeries.updateRootId, treemapAxisDefaultValues = false;\n        /* eslint-enable no-invalid-this */\n        /**\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.treemap\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('treemap', 'scatter'\n        /**\n         * A treemap displays hierarchical data using nested rectangles. The data\n         * can be laid out in varying ways depending on options.\n         *\n         * @sample highcharts/demo/treemap-large-dataset/\n         *         Treemap\n         *\n         * @extends      plotOptions.scatter\n         * @excluding    dragDrop, marker, jitter, dataSorting\n         * @product      highcharts\n         * @requires     modules/treemap\n         * @optionparent plotOptions.treemap\n         */\n        , {\n            /**\n             * When enabled the user can click on a point which is a parent and\n             * zoom in on its children. Deprecated and replaced by\n             * [allowTraversingTree](#plotOptions.treemap.allowTraversingTree).\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-allowdrilltonode/\n             *         Enabled\n             *\n             * @deprecated\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.allowDrillToNode\n             */\n            /**\n             * When enabled the user can click on a point which is a parent and\n             * zoom in on its children.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-allowtraversingtree/\n             *         Enabled\n             *\n             * @since     7.0.3\n             * @product   highcharts\n             */\n            allowTraversingTree: false,\n            animationLimit: 250,\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, event if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @type      {number}\n             * @default   300\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.cropThreshold\n             */\n            /**\n             * Fires on a request for change of root node for the tree, before the\n             * update is made. An event object is passed to the function, containing\n             * additional properties `newRootId`, `previousRootId`, `redraw` and\n             * `trigger`.\n             *\n             * @type {function}\n             * @default undefined\n             * @sample {highcharts} highcharts/plotoptions/treemap-events-setrootnode/\n             *         Alert update information on setRootNode event.\n             * @since 7.0.3\n             * @product highcharts\n             * @apioption plotOptions.treemap.events.setRootNode\n             */\n            /**\n             * This option decides if the user can interact with the parent nodes\n             * or just the leaf nodes. When this option is undefined, it will be\n             * true by default. However when allowTraversingTree is true, then it\n             * will be false by default.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-interactbyleaf-false/\n             *         False\n             * @sample {highcharts} highcharts/plotoptions/treemap-interactbyleaf-true-and-allowtraversingtree/\n             *         InteractByLeaf and allowTraversingTree is true\n             *\n             * @type      {boolean}\n             * @since     4.1.2\n             * @product   highcharts\n             * @apioption plotOptions.treemap.interactByLeaf\n             */\n            /**\n             * The sort index of the point inside the treemap level.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-sortindex/\n             *         Sort by years\n             *\n             * @type      {number}\n             * @since     4.1.10\n             * @product   highcharts\n             * @apioption plotOptions.treemap.sortIndex\n             */\n            /**\n             * A series specific or series type specific color set to apply instead\n             * of the global [colors](#colors) when\n             * [colorByPoint](#plotOptions.treemap.colorByPoint) is true.\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.colors\n             */\n            /**\n             * Whether to display this series type or specific series item in the\n             * legend.\n             */\n            showInLegend: false,\n            /**\n             * @ignore-option\n             */\n            marker: false,\n            /**\n             * When using automatic point colors pulled from the `options.colors`\n             * collection, this option determines whether the chart should receive\n             * one color per series or one color per point.\n             *\n             * @see [series colors](#plotOptions.treemap.colors)\n             *\n             * @since     2.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.colorByPoint\n             */\n            colorByPoint: false,\n            /**\n             * @since 4.1.0\n             */\n            dataLabels: {\n                defer: false,\n                enabled: true,\n                formatter: function () {\n                    var point = this && this.point ?\n                            this.point :\n                            {},\n                        name = isString(point.name) ? point.name : '';\n                    return name;\n                },\n                inside: true,\n                verticalAlign: 'middle'\n            },\n            tooltip: {\n                headerFormat: '',\n                pointFormat: '<b>{point.name}</b>: {point.value}<br/>'\n            },\n            /**\n             * Whether to ignore hidden points when the layout algorithm runs.\n             * If `false`, hidden points will leave open spaces.\n             *\n             * @since 5.0.8\n             */\n            ignoreHiddenPoint: true,\n            /**\n             * This option decides which algorithm is used for setting position\n             * and dimensions of the points.\n             *\n             * @see [How to write your own algorithm](https://www.highcharts.com/docs/chart-and-series-types/treemap)\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-sliceanddice/\n             *         SliceAndDice by default\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-stripes/\n             *         Stripes\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-squarified/\n             *         Squarified\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-strip/\n             *         Strip\n             *\n             * @since      4.1.0\n             * @validvalue [\"sliceAndDice\", \"stripes\", \"squarified\", \"strip\"]\n             */\n            layoutAlgorithm: 'sliceAndDice',\n            /**\n             * Defines which direction the layout algorithm will start drawing.\n             *\n             * @since       4.1.0\n             * @validvalue [\"vertical\", \"horizontal\"]\n             */\n            layoutStartingDirection: 'vertical',\n            /**\n             * Enabling this option will make the treemap alternate the drawing\n             * direction between vertical and horizontal. The next levels starting\n             * direction will always be the opposite of the previous.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-alternatestartingdirection-true/\n             *         Enabled\n             *\n             * @since 4.1.0\n             */\n            alternateStartingDirection: false,\n            /**\n             * Used together with the levels and allowTraversingTree options. When\n             * set to false the first level visible to be level one, which is\n             * dynamic when traversing the tree. Otherwise the level will be the\n             * same as the tree structure.\n             *\n             * @since 4.1.0\n             */\n            levelIsConstant: true,\n            /**\n             * Options for the button appearing when drilling down in a treemap.\n             * Deprecated and replaced by\n             * [traverseUpButton](#plotOptions.treemap.traverseUpButton).\n             *\n             * @deprecated\n             */\n            drillUpButton: {\n                /**\n                 * The position of the button.\n                 *\n                 * @deprecated\n                 */\n                position: {\n                    /**\n                     * Vertical alignment of the button.\n                     *\n                     * @deprecated\n                     * @type      {Highcharts.VerticalAlignValue}\n                     * @default   top\n                     * @product   highcharts\n                     * @apioption plotOptions.treemap.drillUpButton.position.verticalAlign\n                     */\n                    /**\n                     * Horizontal alignment of the button.\n                     *\n                     * @deprecated\n                     * @type {Highcharts.AlignValue}\n                     */\n                    align: 'right',\n                    /**\n                     * Horizontal offset of the button.\n                     *\n                     * @deprecated\n                     */\n                    x: -10,\n                    /**\n                     * Vertical offset of the button.\n                     *\n                     * @deprecated\n                     */\n                    y: 10\n                }\n            },\n            /**\n             * Options for the button appearing when traversing down in a treemap.\n             */\n            traverseUpButton: {\n                /**\n                 * The position of the button.\n                 */\n                position: {\n                    /**\n                     * Vertical alignment of the button.\n                     *\n                     * @type      {Highcharts.VerticalAlignValue}\n                     * @default   top\n                     * @product   highcharts\n                     * @apioption plotOptions.treemap.traverseUpButton.position.verticalAlign\n                     */\n                    /**\n                     * Horizontal alignment of the button.\n                     *\n                     * @type {Highcharts.AlignValue}\n                     */\n                    align: 'right',\n                    /**\n                     * Horizontal offset of the button.\n                     */\n                    x: -10,\n                    /**\n                     * Vertical offset of the button.\n                     */\n                    y: 10\n                }\n            },\n            /**\n             * Set options on specific levels. Takes precedence over series options,\n             * but not point options.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-levels/\n             *         Styling dataLabels and borders\n             * @sample {highcharts} highcharts/demo/treemap-with-levels/\n             *         Different layoutAlgorithm\n             *\n             * @type      {Array<*>}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels\n             */\n            /**\n             * Can set a `borderColor` on all points which lies on the same level.\n             *\n             * @type      {Highcharts.ColorString}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderColor\n             */\n            /**\n             * Set the dash style of the border of all the point which lies on the\n             * level. See\n             * [plotOptions.scatter.dashStyle](#plotoptions.scatter.dashstyle)\n             * for possible options.\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderDashStyle\n             */\n            /**\n             * Can set the borderWidth on all points which lies on the same level.\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderWidth\n             */\n            /**\n             * Can set a color on all points which lies on the same level.\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.color\n             */\n            /**\n             * A configuration object to define how the color of a child varies from\n             * the parent's color. The variation is distributed among the children\n             * of node. For example when setting brightness, the brightness change\n             * will range from the parent's original brightness on the first child,\n             * to the amount set in the `to` setting on the last node. This allows a\n             * gradient-like color scheme that sets children out from each other\n             * while highlighting the grouping on treemaps and sectors on sunburst\n             * charts.\n             *\n             * @sample highcharts/demo/sunburst/\n             *         Sunburst with color variation\n             *\n             * @since     6.0.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.colorVariation\n             */\n            /**\n             * The key of a color variation. Currently supports `brightness` only.\n             *\n             * @type       {string}\n             * @since      6.0.0\n             * @product    highcharts\n             * @validvalue [\"brightness\"]\n             * @apioption  plotOptions.treemap.levels.colorVariation.key\n             */\n            /**\n             * The ending value of a color variation. The last sibling will receive\n             * this value.\n             *\n             * @type      {number}\n             * @since     6.0.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.colorVariation.to\n             */\n            /**\n             * Can set the options of dataLabels on each point which lies on the\n             * level.\n             * [plotOptions.treemap.dataLabels](#plotOptions.treemap.dataLabels) for\n             * possible values.\n             *\n             * @extends   plotOptions.treemap.dataLabels\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.dataLabels\n             */\n            /**\n             * Can set the layoutAlgorithm option on a specific level.\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts\n             * @validvalue [\"sliceAndDice\", \"stripes\", \"squarified\", \"strip\"]\n             * @apioption  plotOptions.treemap.levels.layoutAlgorithm\n             */\n            /**\n             * Can set the layoutStartingDirection option on a specific level.\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts\n             * @validvalue [\"vertical\", \"horizontal\"]\n             * @apioption  plotOptions.treemap.levels.layoutStartingDirection\n             */\n            /**\n             * Decides which level takes effect from the options set in the levels\n             * object.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-levels/\n             *         Styling of both levels\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.level\n             */\n            // Presentational options\n            /**\n             * The color of the border surrounding each tree map item.\n             *\n             * @type {Highcharts.ColorString}\n             */\n            borderColor: '#e6e6e6',\n            /**\n             * The width of the border surrounding each tree map item.\n             */\n            borderWidth: 1,\n            colorKey: 'colorValue',\n            /**\n             * The opacity of a point in treemap. When a point has children, the\n             * visibility of the children is determined by the opacity.\n             *\n             * @since 4.2.4\n             */\n            opacity: 0.15,\n            /**\n             * A wrapper object for all the series options in specific states.\n             *\n             * @extends plotOptions.heatmap.states\n             */\n            states: {\n                /**\n                 * Options for the hovered series\n                 *\n                 * @extends   plotOptions.heatmap.states.hover\n                 * @excluding halo\n                 */\n                hover: {\n                    /**\n                     * The border color for the hovered state.\n                     */\n                    borderColor: '#999999',\n                    /**\n                     * Brightness for the hovered point. Defaults to 0 if the\n                     * heatmap series is loaded first, otherwise 0.1.\n                     *\n                     * @type    {number}\n                     * @default undefined\n                     */\n                    brightness: seriesTypes.heatmap ? 0 : 0.1,\n                    /**\n                     * @extends plotOptions.heatmap.states.hover.halo\n                     */\n                    halo: false,\n                    /**\n                     * The opacity of a point in treemap. When a point has children,\n                     * the visibility of the children is determined by the opacity.\n                     *\n                     * @since 4.2.4\n                     */\n                    opacity: 0.75,\n                    /**\n                     * The shadow option for hovered state.\n                     */\n                    shadow: false\n                }\n            }\n            // Prototype members\n        }, {\n            pointArrayMap: ['value'],\n            directTouch: true,\n            optionalAxis: 'colorAxis',\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value', 'colorValue'],\n            colorKey: 'colorValue',\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Creates an object map from parent id to childrens index.\n             *\n             * @private\n             * @function Highcharts.Series#getListOfParents\n             *\n             * @param {Highcharts.SeriesTreemapDataOptions} [data]\n             *        List of points set in options.\n             *\n             * @param {Array<string>} [existingIds]\n             *        List of all point ids.\n             *\n             * @return {object}\n             *         Map from parent id to children index in data.\n             */\n            getListOfParents: function (data, existingIds) {\n                var arr = isArray(data) ? data : [],\n                    ids = isArray(existingIds) ? existingIds : [],\n                    listOfParents = arr.reduce(function (prev,\n                    curr,\n                    i) {\n                        var parent = pick(curr.parent, '');\n                    if (typeof prev[parent] === 'undefined') {\n                        prev[parent] = [];\n                    }\n                    prev[parent].push(i);\n                    return prev;\n                }, {\n                    '': [] // Root of tree\n                });\n                // If parent does not exist, hoist parent to root of tree.\n                eachObject(listOfParents, function (children, parent, list) {\n                    if ((parent !== '') && (ids.indexOf(parent) === -1)) {\n                        children.forEach(function (child) {\n                            list[''].push(child);\n                        });\n                        delete list[parent];\n                    }\n                });\n                return listOfParents;\n            },\n            // Creates a tree structured object from the series points\n            getTree: function () {\n                var series = this,\n                    allIds = this.data.map(function (d) {\n                        return d.id;\n                }), parentList = series.getListOfParents(this.data, allIds);\n                series.nodeMap = [];\n                return series.buildNode('', -1, 0, parentList, null);\n            },\n            // Define hasData function for non-cartesian series.\n            // Returns true if the series has points at all.\n            hasData: function () {\n                return !!this.processedXData.length; // != 0\n            },\n            init: function (chart, options) {\n                var series = this,\n                    colorMapSeriesMixin = H.colorMapSeriesMixin;\n                // If color series logic is loaded, add some properties\n                if (colorMapSeriesMixin) {\n                    this.colorAttribs = colorMapSeriesMixin.colorAttribs;\n                }\n                // Handle deprecated options.\n                series.eventsToUnbind.push(addEvent(series, 'setOptions', function (event) {\n                    var options = event.userOptions;\n                    if (defined(options.allowDrillToNode) &&\n                        !defined(options.allowTraversingTree)) {\n                        options.allowTraversingTree = options.allowDrillToNode;\n                        delete options.allowDrillToNode;\n                    }\n                    if (defined(options.drillUpButton) &&\n                        !defined(options.traverseUpButton)) {\n                        options.traverseUpButton = options.drillUpButton;\n                        delete options.drillUpButton;\n                    }\n                }));\n                Series.prototype.init.call(series, chart, options);\n                // Treemap's opacity is a different option from other series\n                delete series.opacity;\n                if (series.options.allowTraversingTree) {\n                    series.eventsToUnbind.push(addEvent(series, 'click', series.onClickDrillToNode));\n                }\n            },\n            buildNode: function (id, i, level, list, parent) {\n                var series = this,\n                    children = [],\n                    point = series.points[i],\n                    height = 0,\n                    node,\n                    child;\n                // Actions\n                ((list[id] || [])).forEach(function (i) {\n                    child = series.buildNode(series.points[i].id, i, (level + 1), list, id);\n                    height = Math.max(child.height + 1, height);\n                    children.push(child);\n                });\n                node = {\n                    id: id,\n                    i: i,\n                    children: children,\n                    height: height,\n                    level: level,\n                    parent: parent,\n                    visible: false // @todo move this to better location\n                };\n                series.nodeMap[node.id] = node;\n                if (point) {\n                    point.node = node;\n                }\n                return node;\n            },\n            setTreeValues: function (tree) {\n                var series = this,\n                    options = series.options,\n                    idRoot = series.rootNode,\n                    mapIdToNode = series.nodeMap,\n                    nodeRoot = mapIdToNode[idRoot],\n                    levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                        options.levelIsConstant :\n                        true),\n                    childrenTotal = 0,\n                    children = [],\n                    val,\n                    point = series.points[tree.i];\n                // First give the children some values\n                tree.children.forEach(function (child) {\n                    child = series.setTreeValues(child);\n                    children.push(child);\n                    if (!child.ignore) {\n                        childrenTotal += child.val;\n                    }\n                });\n                // Sort the children\n                stableSort(children, function (a, b) {\n                    return a.sortIndex - b.sortIndex;\n                });\n                // Set the values\n                val = pick(point && point.options.value, childrenTotal);\n                if (point) {\n                    point.value = val;\n                }\n                extend(tree, {\n                    children: children,\n                    childrenTotal: childrenTotal,\n                    // Ignore this node if point is not visible\n                    ignore: !(pick(point && point.visible, true) && (val > 0)),\n                    isLeaf: tree.visible && !childrenTotal,\n                    levelDynamic: (tree.level - (levelIsConstant ? 0 : nodeRoot.level)),\n                    name: pick(point && point.name, ''),\n                    sortIndex: pick(point && point.sortIndex, -val),\n                    val: val\n                });\n                return tree;\n            },\n            /**\n             * Recursive function which calculates the area for all children of a\n             * node.\n             *\n             * @private\n             * @function Highcharts.Series#calculateChildrenAreas\n             *\n             * @param {object} node\n             *        The node which is parent to the children.\n             *\n             * @param {object} area\n             *        The rectangular area of the parent.\n             */\n            calculateChildrenAreas: function (parent, area) {\n                var series = this,\n                    options = series.options,\n                    mapOptionsToLevel = series.mapOptionsToLevel,\n                    level = mapOptionsToLevel[parent.level + 1],\n                    algorithm = pick((series[(level && level.layoutAlgorithm)] &&\n                        level.layoutAlgorithm),\n                    options.layoutAlgorithm),\n                    alternate = options.alternateStartingDirection,\n                    childrenValues = [],\n                    children;\n                // Collect all children which should be included\n                children = parent.children.filter(function (n) {\n                    return !n.ignore;\n                });\n                if (level && level.layoutStartingDirection) {\n                    area.direction = level.layoutStartingDirection === 'vertical' ?\n                        0 :\n                        1;\n                }\n                childrenValues = series[algorithm](area, children);\n                children.forEach(function (child, index) {\n                    var values = childrenValues[index];\n                    child.values = merge(values, {\n                        val: child.childrenTotal,\n                        direction: (alternate ? 1 - area.direction : area.direction)\n                    });\n                    child.pointValues = merge(values, {\n                        x: (values.x / series.axisRatio),\n                        // Flip y-values to avoid visual regression with csvCoord in\n                        // Axis.translate at setPointValues. #12488\n                        y: AXIS_MAX - values.y - values.height,\n                        width: (values.width / series.axisRatio)\n                    });\n                    // If node has children, then call method recursively\n                    if (child.children.length) {\n                        series.calculateChildrenAreas(child, child.values);\n                    }\n                });\n            },\n            setPointValues: function () {\n                var series = this;\n                var points = series.points,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                var styledMode = series.chart.styledMode;\n                // Get the crisp correction in classic mode. For this to work in\n                // styled mode, we would need to first add the shape (without x,\n                // y, width and height), then read the rendered stroke width\n                // using point.graphic.strokeWidth(), then modify and apply the\n                // shapeArgs. This applies also to column series, but the\n                // downside is performance and code complexity.\n                var getCrispCorrection = function (point) { return (styledMode ?\n                        0 :\n                        ((series.pointAttribs(point)['stroke-width'] || 0) % 2) / 2); };\n                points.forEach(function (point) {\n                    var _a = point.node,\n                        values = _a.pointValues,\n                        visible = _a.visible;\n                    // Points which is ignored, have no values.\n                    if (values && visible) {\n                        var height = values.height,\n                            width = values.width,\n                            x = values.x,\n                            y = values.y;\n                        var crispCorr = getCrispCorrection(point);\n                        var x1 = Math.round(xAxis.toPixels(x,\n                            true)) - crispCorr;\n                        var x2 = Math.round(xAxis.toPixels(x + width,\n                            true)) - crispCorr;\n                        var y1 = Math.round(yAxis.toPixels(y,\n                            true)) - crispCorr;\n                        var y2 = Math.round(yAxis.toPixels(y + height,\n                            true)) - crispCorr;\n                        // Set point values\n                        point.shapeArgs = {\n                            x: Math.min(x1, x2),\n                            y: Math.min(y1, y2),\n                            width: Math.abs(x2 - x1),\n                            height: Math.abs(y2 - y1)\n                        };\n                        point.plotX =\n                            point.shapeArgs.x + (point.shapeArgs.width / 2);\n                        point.plotY =\n                            point.shapeArgs.y + (point.shapeArgs.height / 2);\n                    }\n                    else {\n                        // Reset visibility\n                        delete point.plotX;\n                        delete point.plotY;\n                    }\n                });\n            },\n            // Set the node's color recursively, from the parent down.\n            setColorRecursive: function (node, parentColor, colorIndex, index, siblings) {\n                var series = this,\n                    chart = series && series.chart,\n                    colors = chart && chart.options && chart.options.colors,\n                    colorInfo,\n                    point;\n                if (node) {\n                    colorInfo = getColor(node, {\n                        colors: colors,\n                        index: index,\n                        mapOptionsToLevel: series.mapOptionsToLevel,\n                        parentColor: parentColor,\n                        parentColorIndex: colorIndex,\n                        series: series,\n                        siblings: siblings\n                    });\n                    point = series.points[node.i];\n                    if (point) {\n                        point.color = colorInfo.color;\n                        point.colorIndex = colorInfo.colorIndex;\n                    }\n                    // Do it all again with the children\n                    (node.children || []).forEach(function (child, i) {\n                        series.setColorRecursive(child, colorInfo.color, colorInfo.colorIndex, i, node.children.length);\n                    });\n                }\n            },\n            algorithmGroup: function (h, w, d, p) {\n                this.height = h;\n                this.width = w;\n                this.plot = p;\n                this.direction = d;\n                this.startDirection = d;\n                this.total = 0;\n                this.nW = 0;\n                this.lW = 0;\n                this.nH = 0;\n                this.lH = 0;\n                this.elArr = [];\n                this.lP = {\n                    total: 0,\n                    lH: 0,\n                    nH: 0,\n                    lW: 0,\n                    nW: 0,\n                    nR: 0,\n                    lR: 0,\n                    aspectRatio: function (w, h) {\n                        return Math.max((w / h), (h / w));\n                    }\n                };\n                this.addElement = function (el) {\n                    this.lP.total = this.elArr[this.elArr.length - 1];\n                    this.total = this.total + el;\n                    if (this.direction === 0) {\n                        // Calculate last point old aspect ratio\n                        this.lW = this.nW;\n                        this.lP.lH = this.lP.total / this.lW;\n                        this.lP.lR = this.lP.aspectRatio(this.lW, this.lP.lH);\n                        // Calculate last point new aspect ratio\n                        this.nW = this.total / this.height;\n                        this.lP.nH = this.lP.total / this.nW;\n                        this.lP.nR = this.lP.aspectRatio(this.nW, this.lP.nH);\n                    }\n                    else {\n                        // Calculate last point old aspect ratio\n                        this.lH = this.nH;\n                        this.lP.lW = this.lP.total / this.lH;\n                        this.lP.lR = this.lP.aspectRatio(this.lP.lW, this.lH);\n                        // Calculate last point new aspect ratio\n                        this.nH = this.total / this.width;\n                        this.lP.nW = this.lP.total / this.nH;\n                        this.lP.nR = this.lP.aspectRatio(this.lP.nW, this.nH);\n                    }\n                    this.elArr.push(el);\n                };\n                this.reset = function () {\n                    this.nW = 0;\n                    this.lW = 0;\n                    this.elArr = [];\n                    this.total = 0;\n                };\n            },\n            algorithmCalcPoints: function (directionChange, last, group, childrenArea) {\n                var pX,\n                    pY,\n                    pW,\n                    pH,\n                    gW = group.lW,\n                    gH = group.lH,\n                    plot = group.plot,\n                    keep,\n                    i = 0,\n                    end = group.elArr.length - 1;\n                if (last) {\n                    gW = group.nW;\n                    gH = group.nH;\n                }\n                else {\n                    keep = group.elArr[group.elArr.length - 1];\n                }\n                group.elArr.forEach(function (p) {\n                    if (last || (i < end)) {\n                        if (group.direction === 0) {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pW = gW;\n                            pH = p / pW;\n                        }\n                        else {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pH = gH;\n                            pW = p / pH;\n                        }\n                        childrenArea.push({\n                            x: pX,\n                            y: pY,\n                            width: pW,\n                            height: correctFloat(pH)\n                        });\n                        if (group.direction === 0) {\n                            plot.y = plot.y + pH;\n                        }\n                        else {\n                            plot.x = plot.x + pW;\n                        }\n                    }\n                    i = i + 1;\n                });\n                // Reset variables\n                group.reset();\n                if (group.direction === 0) {\n                    group.width = group.width - gW;\n                }\n                else {\n                    group.height = group.height - gH;\n                }\n                plot.y = plot.parent.y + (plot.parent.height - group.height);\n                plot.x = plot.parent.x + (plot.parent.width - group.width);\n                if (directionChange) {\n                    group.direction = 1 - group.direction;\n                }\n                // If not last, then add uncalculated element\n                if (!last) {\n                    group.addElement(keep);\n                }\n            },\n            algorithmLowAspectRatio: function (directionChange, parent, children) {\n                var childrenArea = [],\n                    series = this,\n                    pTot,\n                    plot = {\n                        x: parent.x,\n                        y: parent.y,\n                        parent: parent\n                    },\n                    direction = parent.direction,\n                    i = 0,\n                    end = children.length - 1,\n                    group = new this.algorithmGroup(// eslint-disable-line new-cap\n                    parent.height,\n                    parent.width,\n                    direction,\n                    plot);\n                // Loop through and calculate all areas\n                children.forEach(function (child) {\n                    pTot =\n                        (parent.width * parent.height) * (child.val / parent.val);\n                    group.addElement(pTot);\n                    if (group.lP.nR > group.lP.lR) {\n                        series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot // @todo no supported\n                        );\n                    }\n                    // If last child, then calculate all remaining areas\n                    if (i === end) {\n                        series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot // @todo not supported\n                        );\n                    }\n                    i = i + 1;\n                });\n                return childrenArea;\n            },\n            algorithmFill: function (directionChange, parent, children) {\n                var childrenArea = [],\n                    pTot,\n                    direction = parent.direction,\n                    x = parent.x,\n                    y = parent.y,\n                    width = parent.width,\n                    height = parent.height,\n                    pX,\n                    pY,\n                    pW,\n                    pH;\n                children.forEach(function (child) {\n                    pTot =\n                        (parent.width * parent.height) * (child.val / parent.val);\n                    pX = x;\n                    pY = y;\n                    if (direction === 0) {\n                        pH = height;\n                        pW = pTot / pH;\n                        width = width - pW;\n                        x = x + pW;\n                    }\n                    else {\n                        pW = width;\n                        pH = pTot / pW;\n                        height = height - pH;\n                        y = y + pH;\n                    }\n                    childrenArea.push({\n                        x: pX,\n                        y: pY,\n                        width: pW,\n                        height: pH\n                    });\n                    if (directionChange) {\n                        direction = 1 - direction;\n                    }\n                });\n                return childrenArea;\n            },\n            strip: function (parent, children) {\n                return this.algorithmLowAspectRatio(false, parent, children);\n            },\n            squarified: function (parent, children) {\n                return this.algorithmLowAspectRatio(true, parent, children);\n            },\n            sliceAndDice: function (parent, children) {\n                return this.algorithmFill(true, parent, children);\n            },\n            stripes: function (parent, children) {\n                return this.algorithmFill(false, parent, children);\n            },\n            translate: function () {\n                var series = this,\n                    options = series.options, \n                    // NOTE: updateRootId modifies series.\n                    rootId = updateRootId(series),\n                    rootNode,\n                    pointValues,\n                    seriesArea,\n                    tree,\n                    val;\n                // Call prototype function\n                Series.prototype.translate.call(series);\n                // @todo Only if series.isDirtyData is true\n                tree = series.tree = series.getTree();\n                rootNode = series.nodeMap[rootId];\n                series.renderTraverseUpButton(rootId);\n                series.mapOptionsToLevel = getLevelOptions({\n                    from: rootNode.level + 1,\n                    levels: options.levels,\n                    to: tree.height,\n                    defaults: {\n                        levelIsConstant: series.options.levelIsConstant,\n                        colorByPoint: options.colorByPoint\n                    }\n                });\n                if (rootId !== '' &&\n                    (!rootNode || !rootNode.children.length)) {\n                    series.setRootNode('', false);\n                    rootId = series.rootNode;\n                    rootNode = series.nodeMap[rootId];\n                }\n                // Parents of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode], function (node) {\n                    var next = false,\n                        p = node.parent;\n                    node.visible = true;\n                    if (p || p === '') {\n                        next = series.nodeMap[p];\n                    }\n                    return next;\n                });\n                // Children of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode].children, function (children) {\n                    var next = false;\n                    children.forEach(function (child) {\n                        child.visible = true;\n                        if (child.children.length) {\n                            next = (next || []).concat(child.children);\n                        }\n                    });\n                    return next;\n                });\n                series.setTreeValues(tree);\n                // Calculate plotting values.\n                series.axisRatio = (series.xAxis.len / series.yAxis.len);\n                series.nodeMap[''].pointValues = pointValues = {\n                    x: 0,\n                    y: 0,\n                    width: AXIS_MAX,\n                    height: AXIS_MAX\n                };\n                series.nodeMap[''].values = seriesArea = merge(pointValues, {\n                    width: (pointValues.width * series.axisRatio),\n                    direction: (options.layoutStartingDirection === 'vertical' ? 0 : 1),\n                    val: tree.val\n                });\n                series.calculateChildrenAreas(tree, seriesArea);\n                // Logic for point colors\n                if (!series.colorAxis &&\n                    !options.colorByPoint) {\n                    series.setColorRecursive(series.tree);\n                }\n                // Update axis extremes according to the root node.\n                if (options.allowTraversingTree) {\n                    val = rootNode.pointValues;\n                    series.xAxis.setExtremes(val.x, val.x + val.width, false);\n                    series.yAxis.setExtremes(val.y, val.y + val.height, false);\n                    series.xAxis.setScale();\n                    series.yAxis.setScale();\n                }\n                // Assign values to points.\n                series.setPointValues();\n            },\n            /**\n             * Extend drawDataLabels with logic to handle custom options related to\n             * the treemap series:\n             *\n             * - Points which is not a leaf node, has dataLabels disabled by\n             *   default.\n             *\n             * - Options set on series.levels is merged in.\n             *\n             * - Width of the dataLabel is set to match the width of the point\n             *   shape.\n             *\n             * @private\n             * @function Highcharts.Series#drawDataLabels\n             */\n            drawDataLabels: function () {\n                var series = this,\n                    mapOptionsToLevel = series.mapOptionsToLevel,\n                    points = series.points.filter(function (n) {\n                        return n.node.visible;\n                }), options, level;\n                points.forEach(function (point) {\n                    level = mapOptionsToLevel[point.node.level];\n                    // Set options to new object to avoid problems with scope\n                    options = { style: {} };\n                    // If not a leaf, then label should be disabled as default\n                    if (!point.node.isLeaf) {\n                        options.enabled = false;\n                    }\n                    // If options for level exists, include them as well\n                    if (level && level.dataLabels) {\n                        options = merge(options, level.dataLabels);\n                        series._hasPointLabels = true;\n                    }\n                    // Set dataLabel width to the width of the point shape.\n                    if (point.shapeArgs) {\n                        options.style.width = point.shapeArgs.width;\n                        if (point.dataLabel) {\n                            point.dataLabel.css({\n                                width: point.shapeArgs.width + 'px'\n                            });\n                        }\n                    }\n                    // Merge custom options with point options\n                    point.dlOptions = merge(options, point.options.dataLabels);\n                });\n                Series.prototype.drawDataLabels.call(this);\n            },\n            // Over the alignment method by setting z index\n            alignDataLabel: function (point, dataLabel, labelOptions) {\n                var style = labelOptions.style;\n                // #8160: Prevent the label from exceeding the point's\n                // boundaries in treemaps by applying ellipsis overflow.\n                // The issue was happening when datalabel's text contained a\n                // long sequence of characters without a whitespace.\n                if (!defined(style.textOverflow) &&\n                    dataLabel.text &&\n                    dataLabel.getBBox().width > dataLabel.text.textWidth) {\n                    dataLabel.css({\n                        textOverflow: 'ellipsis',\n                        // unit (px) is required when useHTML is true\n                        width: style.width += 'px'\n                    });\n                }\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n                if (point.dataLabel) {\n                    // point.node.zIndex could be undefined (#6956)\n                    point.dataLabel.attr({ zIndex: (point.node.zIndex || 0) + 1 });\n                }\n            },\n            // Get presentational attributes\n            pointAttribs: function (point, state) {\n                var series = this,\n                    mapOptionsToLevel = (isObject(series.mapOptionsToLevel) ?\n                        series.mapOptionsToLevel :\n                        {}),\n                    level = point && mapOptionsToLevel[point.node.level] || {},\n                    options = this.options,\n                    attr,\n                    stateOptions = (state && options.states[state]) || {},\n                    className = (point && point.getClassName()) || '',\n                    opacity;\n                // Set attributes by precedence. Point trumps level trumps series.\n                // Stroke width uses pick because it can be 0.\n                attr = {\n                    'stroke': (point && point.borderColor) ||\n                        level.borderColor ||\n                        stateOptions.borderColor ||\n                        options.borderColor,\n                    'stroke-width': pick(point && point.borderWidth, level.borderWidth, stateOptions.borderWidth, options.borderWidth),\n                    'dashstyle': (point && point.borderDashStyle) ||\n                        level.borderDashStyle ||\n                        stateOptions.borderDashStyle ||\n                        options.borderDashStyle,\n                    'fill': (point && point.color) || this.color\n                };\n                // Hide levels above the current view\n                if (className.indexOf('highcharts-above-level') !== -1) {\n                    attr.fill = 'none';\n                    attr['stroke-width'] = 0;\n                    // Nodes with children that accept interaction\n                }\n                else if (className.indexOf('highcharts-internal-node-interactive') !== -1) {\n                    opacity = pick(stateOptions.opacity, options.opacity);\n                    attr.fill = color(attr.fill).setOpacity(opacity).get();\n                    attr.cursor = 'pointer';\n                    // Hide nodes that have children\n                }\n                else if (className.indexOf('highcharts-internal-node') !== -1) {\n                    attr.fill = 'none';\n                }\n                else if (state) {\n                    // Brighten and hoist the hover nodes\n                    attr.fill = color(attr.fill)\n                        .brighten(stateOptions.brightness)\n                        .get();\n                }\n                return attr;\n            },\n            // Override drawPoints\n            drawPoints: function () {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    points = series.points,\n                    styledMode = chart.styledMode,\n                    options = series.options,\n                    shadow = styledMode ? {} : options.shadow,\n                    borderRadius = options.borderRadius,\n                    withinAnimationLimit = chart.pointCount < options.animationLimit,\n                    allowTraversingTree = options.allowTraversingTree;\n                points.forEach(function (point) {\n                    var levelDynamic = point.node.levelDynamic,\n                        animate = {},\n                        attr = {},\n                        css = {},\n                        groupKey = 'level-group-' + levelDynamic,\n                        hasGraphic = !!point.graphic,\n                        shouldAnimate = withinAnimationLimit && hasGraphic,\n                        shapeArgs = point.shapeArgs;\n                    // Don't bother with calculate styling if the point is not drawn\n                    if (point.shouldDraw()) {\n                        if (borderRadius) {\n                            attr.r = borderRadius;\n                        }\n                        merge(true, // Extend object\n                        // Which object to extend\n                        shouldAnimate ? animate : attr, \n                        // Add shapeArgs to animate/attr if graphic exists\n                        hasGraphic ? shapeArgs : {}, \n                        // Add style attribs if !styleMode\n                        styledMode ?\n                            {} :\n                            series.pointAttribs(point, (point.selected && 'select')));\n                        // In styled mode apply point.color. Use CSS, otherwise the\n                        // fill used in the style sheet will take precedence over\n                        // the fill attribute.\n                        if (series.colorAttribs && styledMode) {\n                            // Heatmap is loaded\n                            extend(css, series.colorAttribs(point));\n                        }\n                        if (!series[groupKey]) {\n                            series[groupKey] = renderer.g(groupKey)\n                                .attr({\n                                // @todo Set the zIndex based upon the number of\n                                // levels, instead of using 1000\n                                zIndex: 1000 - levelDynamic\n                            })\n                                .add(series.group);\n                            series[groupKey].survive = true;\n                        }\n                    }\n                    // Draw the point\n                    point.draw({\n                        animatableAttribs: animate,\n                        attribs: attr,\n                        css: css,\n                        group: series[groupKey],\n                        renderer: renderer,\n                        shadow: shadow,\n                        shapeArgs: shapeArgs,\n                        shapeType: 'rect'\n                    });\n                    // If setRootNode is allowed, set a point cursor on clickables &\n                    // add drillId to point\n                    if (allowTraversingTree && point.graphic) {\n                        point.drillId = options.interactByLeaf ?\n                            series.drillToByLeaf(point) :\n                            series.drillToByGroup(point);\n                    }\n                });\n            },\n            // Add drilling on the suitable points\n            onClickDrillToNode: function (event) {\n                var series = this,\n                    point = event.point,\n                    drillId = point && point.drillId;\n                // If a drill id is returned, add click event and cursor.\n                if (isString(drillId) &&\n                    (series.isDrillAllowed ? series.isDrillAllowed(drillId) : true)) {\n                    point.setState(''); // Remove hover\n                    series.setRootNode(drillId, true, { trigger: 'click' });\n                }\n            },\n            /**\n             * Finds the drill id for a parent node. Returns false if point should\n             * not have a click event.\n             *\n             * @private\n             * @function Highcharts.Series#drillToByGroup\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {boolean|string}\n             *         Drill to id or false when point should not have a click\n             *         event.\n             */\n            drillToByGroup: function (point) {\n                var series = this,\n                    drillId = false;\n                if ((point.node.level - series.nodeMap[series.rootNode].level) ===\n                    1 &&\n                    !point.node.isLeaf) {\n                    drillId = point.id;\n                }\n                return drillId;\n            },\n            /**\n             * Finds the drill id for a leaf node. Returns false if point should not\n             * have a click event\n             *\n             * @private\n             * @function Highcharts.Series#drillToByLeaf\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {boolean|string}\n             *         Drill to id or false when point should not have a click\n             *         event.\n             */\n            drillToByLeaf: function (point) {\n                var series = this,\n                    drillId = false,\n                    nodeParent;\n                if ((point.node.parent !== series.rootNode) &&\n                    point.node.isLeaf) {\n                    nodeParent = point.node;\n                    while (!drillId) {\n                        nodeParent = series.nodeMap[nodeParent.parent];\n                        if (nodeParent.parent === series.rootNode) {\n                            drillId = nodeParent.id;\n                        }\n                    }\n                }\n                return drillId;\n            },\n            drillUp: function () {\n                var series = this,\n                    node = series.nodeMap[series.rootNode];\n                if (node && isString(node.parent)) {\n                    series.setRootNode(node.parent, true, { trigger: 'traverseUpButton' });\n                }\n            },\n            // TODO remove this function at a suitable version.\n            drillToNode: function (id, redraw) {\n                error(32, false, void 0, { 'treemap.drillToNode': 'use treemap.setRootNode' });\n                this.setRootNode(id, redraw);\n            },\n            /**\n             * Sets a new root node for the series.\n             *\n             * @private\n             * @function Highcharts.Series#setRootNode\n             *\n             * @param {string} id The id of the new root node.\n             * @param {boolean} [redraw=true] Wether to redraw the chart or not.\n             * @param {object} [eventArguments] Arguments to be accessed in\n             * event handler.\n             * @param {string} [eventArguments.newRootId] Id of the new root.\n             * @param {string} [eventArguments.previousRootId] Id of the previous\n             * root.\n             * @param {boolean} [eventArguments.redraw] Wether to redraw the\n             * chart after.\n             * @param {object} [eventArguments.series] The series to update the root\n             * of.\n             * @param {string} [eventArguments.trigger] The action which\n             * triggered the event. Undefined if the setRootNode is called\n             * directly.\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:setRootNode\n             */\n            setRootNode: function (id, redraw, eventArguments) {\n                var series = this,\n                    eventArgs = extend({\n                        newRootId: id,\n                        previousRootId: series.rootNode,\n                        redraw: pick(redraw,\n                    true),\n                        series: series\n                    },\n                    eventArguments);\n                /**\n                 * The default functionality of the setRootNode event.\n                 *\n                 * @private\n                 * @param {object} args The event arguments.\n                 * @param {string} args.newRootId Id of the new root.\n                 * @param {string} args.previousRootId Id of the previous root.\n                 * @param {boolean} args.redraw Wether to redraw the chart after.\n                 * @param {object} args.series The series to update the root of.\n                 * @param {string} [args.trigger=undefined] The action which\n                 * triggered the event. Undefined if the setRootNode is called\n                 * directly.\n                 * @return {void}\n                 */\n                var defaultFn = function (args) {\n                        var series = args.series;\n                    // Store previous and new root ids on the series.\n                    series.idPreviousRoot = args.previousRootId;\n                    series.rootNode = args.newRootId;\n                    // Redraw the chart\n                    series.isDirty = true; // Force redraw\n                    if (args.redraw) {\n                        series.chart.redraw();\n                    }\n                };\n                // Fire setRootNode event.\n                fireEvent(series, 'setRootNode', eventArgs, defaultFn);\n            },\n            /**\n             * Check if the drill up/down is allowed.\n             *\n             * @private\n             */\n            isDrillAllowed: function (targetNode) {\n                var tree = this.tree,\n                    firstChild = tree.children[0];\n                // The sunburst series looks exactly the same on the level ''\n                // and level 1 if there’s only one element on level 1. Disable\n                // drilling up/down when it doesn't perform any visual\n                // difference (#13388).\n                return !(tree.children.length === 1 && ((this.rootNode === '' && targetNode === firstChild.id) ||\n                    (this.rootNode === firstChild.id && targetNode === '')));\n            },\n            renderTraverseUpButton: function (rootId) {\n                var series = this,\n                    nodeMap = series.nodeMap,\n                    node = nodeMap[rootId],\n                    name = node.name,\n                    buttonOptions = series.options.traverseUpButton,\n                    backText = pick(buttonOptions.text,\n                    name, '< Back'),\n                    attr,\n                    states;\n                if (rootId === '' ||\n                    (series.isDrillAllowed ?\n                        !(isString(node.parent) && series.isDrillAllowed(node.parent)) : false)) {\n                    if (series.drillUpButton) {\n                        series.drillUpButton =\n                            series.drillUpButton.destroy();\n                    }\n                }\n                else if (!this.drillUpButton) {\n                    attr = buttonOptions.theme;\n                    states = attr && attr.states;\n                    this.drillUpButton = this.chart.renderer\n                        .button(backText, null, null, function () {\n                        series.drillUp();\n                    }, attr, states && states.hover, states && states.select)\n                        .addClass('highcharts-drillup-button')\n                        .attr({\n                        align: buttonOptions.position.align,\n                        zIndex: 7\n                    })\n                        .add()\n                        .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n                }\n                else {\n                    this.drillUpButton.placed = false;\n                    this.drillUpButton.attr({\n                        text: backText\n                    })\n                        .align();\n                }\n            },\n            buildKDTree: noop,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            getExtremes: function () {\n                // Get the extremes from the value data\n                var _a = Series.prototype.getExtremes\n                        .call(this,\n                    this.colorValueData),\n                    dataMin = _a.dataMin,\n                    dataMax = _a.dataMax;\n                this.valueMin = dataMin;\n                this.valueMax = dataMax;\n                // Get the extremes from the y data\n                return Series.prototype.getExtremes.call(this);\n            },\n            getExtremesFromAll: true,\n            /**\n             * Workaround for `inactive` state. Since `series.opacity` option is\n             * already reserved, don't use that state at all by disabling\n             * `inactiveOtherPoints` and not inheriting states by points.\n             *\n             * @private\n             */\n            setState: function (state) {\n                this.options.inactiveOtherPoints = true;\n                Series.prototype.setState.call(this, state, false);\n                this.options.inactiveOtherPoints = false;\n            },\n            utils: {\n                recursive: recursive\n            }\n            /* eslint-enable no-invalid-this, valid-jsdoc */\n        }, {\n            draw: drawPoint,\n            setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible,\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            getClassName: function () {\n                var className = Point.prototype.getClassName.call(this),\n                    series = this.series,\n                    options = series.options;\n                // Above the current level\n                if (this.node.level <= series.nodeMap[series.rootNode].level) {\n                    className += ' highcharts-above-level';\n                }\n                else if (!this.node.isLeaf &&\n                    !pick(options.interactByLeaf, !options.allowTraversingTree)) {\n                    className += ' highcharts-internal-node-interactive';\n                }\n                else if (!this.node.isLeaf) {\n                    className += ' highcharts-internal-node';\n                }\n                return className;\n            },\n            /**\n             * A tree point is valid if it has han id too, assume it may be a parent\n             * item.\n             *\n             * @private\n             * @function Highcharts.Point#isValid\n             */\n            isValid: function () {\n                return this.id || isNumber(this.value);\n            },\n            setState: function (state) {\n                Point.prototype.setState.call(this, state);\n                // Graphic does not exist when point is not visible.\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            },\n            shouldDraw: function () {\n                var point = this;\n                return isNumber(point.plotY) && point.y !== null;\n            }\n        });\n        addEvent(H.Series, 'afterBindAxes', function () {\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                treeAxis;\n            if (xAxis && yAxis) {\n                if (series.is('treemap')) {\n                    treeAxis = {\n                        endOnTick: false,\n                        gridLineWidth: 0,\n                        lineWidth: 0,\n                        min: 0,\n                        dataMin: 0,\n                        minPadding: 0,\n                        max: AXIS_MAX,\n                        dataMax: AXIS_MAX,\n                        maxPadding: 0,\n                        startOnTick: false,\n                        title: null,\n                        tickPositions: []\n                    };\n                    extend(yAxis.options, treeAxis);\n                    extend(xAxis.options, treeAxis);\n                    treemapAxisDefaultValues = true;\n                }\n                else if (treemapAxisDefaultValues) {\n                    yAxis.setOptions(yAxis.userOptions);\n                    xAxis.setOptions(xAxis.userOptions);\n                    treemapAxisDefaultValues = false;\n                }\n            }\n        });\n        /* eslint-enable no-invalid-this, valid-jsdoc */\n        /**\n         * A `treemap` series. If the [type](#series.treemap.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.treemap\n         * @excluding dataParser, dataURL, stack, dataSorting\n         * @product   highcharts\n         * @requires  modules/treemap\n         * @apioption series.treemap\n         */\n        /**\n         * An array of data points for the series. For the `treemap` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `value` options. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.treemap.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *      data: [{\n         *        value: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *      }, {\n         *        value: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *      }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|null|*>}\n         * @extends   series.heatmap.data\n         * @excluding x, y\n         * @product   highcharts\n         * @apioption series.treemap.data\n         */\n        /**\n         * The value of the point, resulting in a relative area of the point\n         * in the treemap.\n         *\n         * @type      {number|null}\n         * @product   highcharts\n         * @apioption series.treemap.data.value\n         */\n        /**\n         * Serves a purpose only if a `colorAxis` object is defined in the chart\n         * options. This value will decide which color the point gets from the\n         * scale of the colorAxis.\n         *\n         * @type      {number}\n         * @since     4.1.0\n         * @product   highcharts\n         * @apioption series.treemap.data.colorValue\n         */\n        /**\n         * Only for treemap. Use this option to build a tree structure. The\n         * value should be the id of the point which is the parent. If no points\n         * has a matching id, or this option is undefined, then the parent will\n         * be set to the root.\n         *\n         * @sample {highcharts} highcharts/point/parent/\n         *         Point parent\n         * @sample {highcharts} highcharts/demo/treemap-with-levels/\n         *         Example where parent id is not matching\n         *\n         * @type      {string}\n         * @since     4.1.0\n         * @product   highcharts\n         * @apioption series.treemap.data.parent\n         */\n        ''; // adds doclets above to transpiled file\n\n    });\n    _registerModule(_modules, 'masters/modules/treemap.src.js', [], function () {\n\n\n    });\n}));\n\n/***/ }),\n/* 982 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * Exporting module\n *\n * (c) 2010-2019 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n(function (factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = factory;\n    } else if (true) {\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(531)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (Highcharts) {\n            factory(Highcharts);\n            factory.Highcharts = Highcharts;\n            return factory;\n        }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    } else {\n        factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);\n    }\n}(function (Highcharts) {\n    var _modules = Highcharts ? Highcharts._modules : {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'modules/full-screen.src.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Chart, H, U) {\n        /* *\n         * (c) 2009-2020 Rafal Sebestjanski\n         *\n         * Full screen for Highcharts\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = U.addEvent;\n        /**\n         * The module allows user to enable display chart in full screen mode.\n         * Used in StockTools too.\n         * Based on default solutions in browsers.\n         *\n         */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handles displaying chart's container in the fullscreen mode.\n         *\n         * @class\n         * @name Highcharts.Fullscreen\n         * @hideconstructor\n         * @requires modules/full-screen\n         */\n        var Fullscreen = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Fullscreen(chart) {\n                    /**\n                     * Chart managed by the fullscreen controller.\n                     * @name Highcharts.Fullscreen#chart\n                     * @type {Highcharts.Chart}\n                     */\n                    this.chart = chart;\n                /**\n                 * The flag is set to `true` when the chart is displayed in\n                 * the fullscreen mode.\n                 *\n                 * @name Highcharts.Fullscreen#isOpen\n                 * @type {boolean|undefined}\n                 * @since 8.0.1\n                 */\n                this.isOpen = false;\n                var container = chart.renderTo;\n                // Hold event and methods available only for a current browser.\n                if (!this.browserProps) {\n                    if (typeof container.requestFullscreen === 'function') {\n                        this.browserProps = {\n                            fullscreenChange: 'fullscreenchange',\n                            requestFullscreen: 'requestFullscreen',\n                            exitFullscreen: 'exitFullscreen'\n                        };\n                    }\n                    else if (container.mozRequestFullScreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'mozfullscreenchange',\n                            requestFullscreen: 'mozRequestFullScreen',\n                            exitFullscreen: 'mozCancelFullScreen'\n                        };\n                    }\n                    else if (container.webkitRequestFullScreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'webkitfullscreenchange',\n                            requestFullscreen: 'webkitRequestFullScreen',\n                            exitFullscreen: 'webkitExitFullscreen'\n                        };\n                    }\n                    else if (container.msRequestFullscreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'MSFullscreenChange',\n                            requestFullscreen: 'msRequestFullscreen',\n                            exitFullscreen: 'msExitFullscreen'\n                        };\n                    }\n                }\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Stops displaying the chart in fullscreen mode.\n             * Exporting module required.\n             *\n             * @since       8.0.1\n             *\n             * @function    Highcharts.Fullscreen#close\n             * @return      {void}\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.close = function () {\n                var fullscreen = this,\n                    chart = fullscreen.chart;\n                // Don't fire exitFullscreen() when user exited using 'Escape' button.\n                if (fullscreen.isOpen &&\n                    fullscreen.browserProps &&\n                    chart.container.ownerDocument instanceof Document) {\n                    chart.container.ownerDocument[fullscreen.browserProps.exitFullscreen]();\n                }\n                // Unbind event as it's necessary only before exiting from fullscreen.\n                if (fullscreen.unbindFullscreenEvent) {\n                    fullscreen.unbindFullscreenEvent();\n                }\n                fullscreen.isOpen = false;\n                fullscreen.setButtonText();\n            };\n            /**\n             * Displays the chart in fullscreen mode.\n             * When fired customly by user before exporting context button is created,\n             * button's text will not be replaced - it's on the user side.\n             * Exporting module required.\n             *\n             * @since       8.0.1\n             *\n             * @function Highcharts.Fullscreen#open\n             * @return      {void}\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.open = function () {\n                var fullscreen = this,\n                    chart = fullscreen.chart;\n                // Handle exitFullscreen() method when user clicks 'Escape' button.\n                if (fullscreen.browserProps) {\n                    fullscreen.unbindFullscreenEvent = addEvent(chart.container.ownerDocument, // chart's document\n                    fullscreen.browserProps.fullscreenChange, function () {\n                        // Handle lack of async of browser's fullScreenChange event.\n                        if (fullscreen.isOpen) {\n                            fullscreen.isOpen = false;\n                            fullscreen.close();\n                        }\n                        else {\n                            fullscreen.isOpen = true;\n                            fullscreen.setButtonText();\n                        }\n                    });\n                    var promise = chart.renderTo[fullscreen.browserProps.requestFullscreen]();\n                    if (promise) {\n                        // No dot notation because of IE8 compatibility\n                        promise['catch'](function () {\n                            alert(// eslint-disable-line no-alert\n                            'Full screen is not supported inside a frame.');\n                        });\n                    }\n                    addEvent(chart, 'destroy', fullscreen.unbindFullscreenEvent);\n                }\n            };\n            /**\n             * Replaces the exporting context button's text when toogling the\n             * fullscreen mode.\n             *\n             * @private\n             *\n             * @since 8.0.1\n             *\n             * @requires modules/full-screen\n             * @return {void}\n             */\n            Fullscreen.prototype.setButtonText = function () {\n                var _a;\n                var chart = this.chart,\n                    exportDivElements = chart.exportDivElements,\n                    exportingOptions = chart.options.exporting,\n                    menuItems = (_a = exportingOptions === null || exportingOptions === void 0 ? void 0 : exportingOptions.buttons) === null || _a === void 0 ? void 0 : _a.contextButton.menuItems,\n                    lang = chart.options.lang;\n                if ((exportingOptions === null || exportingOptions === void 0 ? void 0 : exportingOptions.menuItemDefinitions) && (lang === null || lang === void 0 ? void 0 : lang.exitFullscreen) &&\n                    lang.viewFullscreen &&\n                    menuItems &&\n                    exportDivElements &&\n                    exportDivElements.length) {\n                    exportDivElements[menuItems.indexOf('viewFullscreen')]\n                        .innerHTML = !this.isOpen ?\n                        (exportingOptions.menuItemDefinitions.viewFullscreen.text ||\n                            lang.viewFullscreen) : lang.exitFullscreen;\n                }\n            };\n            /**\n             * Toggles displaying the chart in fullscreen mode.\n             * By default, when the exporting module is enabled, a context button with\n             * a drop down menu in the upper right corner accesses this function.\n             * Exporting module required.\n             *\n             * @since 8.0.1\n             *\n             * @sample      highcharts/members/chart-togglefullscreen/\n             *              Toggle fullscreen mode from a HTML button\n             *\n             * @function Highcharts.Fullscreen#toggle\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.toggle = function () {\n                var fullscreen = this;\n                if (!fullscreen.isOpen) {\n                    fullscreen.open();\n                }\n                else {\n                    fullscreen.close();\n                }\n            };\n            return Fullscreen;\n        }());\n        H.Fullscreen = Fullscreen;\n        // Initialize fullscreen\n        addEvent(Chart, 'beforeRender', function () {\n            /**\n             * @name Highcharts.Chart#fullscreen\n             * @type {Highcharts.Fullscreen}\n             * @requires modules/full-screen\n             */\n            this.fullscreen = new H.Fullscreen(this);\n        });\n\n        return H.Fullscreen;\n    });\n    _registerModule(_modules, 'mixins/navigation.js', [], function () {\n        /**\n         *\n         *  (c) 2010-2018 Paweł Fus\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var chartNavigation = {\n                /**\n                 * Initializes `chart.navigation` object which delegates `update()` methods\n                 * to all other common classes (used in exporting and navigationBindings).\n                 *\n                 * @private\n                 * @param {Highcharts.Chart} chart\n                 *        The chart instance.\n                 * @return {void}\n                 */\n                initUpdate: function (chart) {\n                    if (!chart.navigation) {\n                        chart.navigation = {\n                            updates: [],\n                            update: function (options,\n            redraw) {\n                                this.updates.forEach(function (updateConfig) {\n                                    updateConfig.update.call(updateConfig.context,\n            options,\n            redraw);\n                            });\n                        }\n                    };\n                }\n            },\n            /**\n             * Registers an `update()` method in the `chart.navigation` object.\n             *\n             * @private\n             * @param {Highcharts.ChartNavigationUpdateFunction} update\n             *        The `update()` method that will be called in `chart.update()`.\n             * @param {Highcharts.Chart} chart\n             *        The chart instance. `update()` will use that as a context\n             *        (`this`).\n             * @return {void}\n             */\n            addUpdate: function (update, chart) {\n                if (!chart.navigation) {\n                    this.initUpdate(chart);\n                }\n                chart.navigation.updates.push({\n                    update: update,\n                    context: chart\n                });\n            }\n        };\n\n        return chartNavigation;\n    });\n    _registerModule(_modules, 'modules/exporting.src.js', [_modules['parts/Chart.js'], _modules['mixins/navigation.js'], _modules['parts/Globals.js'], _modules['parts/Options.js'], _modules['parts/SVGRenderer.js'], _modules['parts/Utilities.js']], function (Chart, chartNavigationMixin, H, O, SVGRenderer, U) {\n        /* *\n         *\n         *  Exporting module\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var doc = H.doc,\n            isTouchDevice = H.isTouchDevice,\n            win = H.win;\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            css = U.css,\n            createElement = U.createElement,\n            discardElement = U.discardElement,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Gets fired after a chart is printed through the context menu item or the\n         * Chart.print method.\n         *\n         * @callback Highcharts.ExportingAfterPrintCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired before a chart is printed through the context menu item or the\n         * Chart.print method.\n         *\n         * @callback Highcharts.ExportingBeforePrintCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Function to call if the offline-exporting module fails to export a chart on\n         * the client side.\n         *\n         * @callback Highcharts.ExportingErrorCallbackFunction\n         *\n         * @param {Highcharts.ExportingOptions} options\n         *        The exporting options.\n         *\n         * @param {global.Error} err\n         *        The error from the module.\n         */\n        /**\n         * Definition for a menu item in the context menu.\n         *\n         * @interface Highcharts.ExportingMenuObject\n         */ /**\n        * The text for the menu item.\n        *\n        * @name Highcharts.ExportingMenuObject#text\n        * @type {string|undefined}\n        */ /**\n        * If internationalization is required, the key to a language string.\n        *\n        * @name Highcharts.ExportingMenuObject#textKey\n        * @type {string|undefined}\n        */ /**\n        * The click handler for the menu item.\n        *\n        * @name Highcharts.ExportingMenuObject#onclick\n        * @type {Highcharts.EventCallbackFunction<Highcharts.Chart>|undefined}\n        */ /**\n        * Indicates a separator line instead of an item.\n        *\n        * @name Highcharts.ExportingMenuObject#separator\n        * @type {boolean|undefined}\n        */\n        /**\n         * Possible MIME types for exporting.\n         *\n         * @typedef {\"image/png\"|\"image/jpeg\"|\"application/pdf\"|\"image/svg+xml\"} Highcharts.ExportingMimeTypeValue\n         */\n        // create shortcuts\n        var userAgent = win.navigator.userAgent,\n            symbols = H.Renderer.prototype.symbols,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(userAgent),\n            isFirefoxBrowser = /firefox/i.test(userAgent);\n        // Add language\n        extend(defaultOptions.lang\n        /**\n         * @optionparent lang\n         */\n        , {\n            /**\n             * Exporting module only. The text for the menu item to view the chart\n             * in full screen.\n             *\n             * @since 8.0.1\n             *\n             * @private\n             */\n            viewFullscreen: 'View in full screen',\n            /**\n             * Exporting module only. The text for the menu item to exit the chart\n             * from full screen.\n             *\n             * @since 8.0.1\n             *\n             * @private\n             */\n            exitFullscreen: 'Exit from full screen',\n            /**\n             * Exporting module only. The text for the menu item to print the chart.\n             *\n             * @since    3.0.1\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            printChart: 'Print chart',\n            /**\n             * Exporting module only. The text for the PNG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadPNG: 'Download PNG image',\n            /**\n             * Exporting module only. The text for the JPEG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadJPEG: 'Download JPEG image',\n            /**\n             * Exporting module only. The text for the PDF download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadPDF: 'Download PDF document',\n            /**\n             * Exporting module only. The text for the SVG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadSVG: 'Download SVG vector image',\n            /**\n             * Exporting module menu. The tooltip title for the context menu holding\n             * print and export menu items.\n             *\n             * @since    3.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            contextButtonTitle: 'Chart context menu'\n        });\n        if (!defaultOptions.navigation) {\n            // Buttons and menus are collected in a separate config option set called\n            // 'navigation'. This can be extended later to add control buttons like\n            // zoom and pan right click menus.\n            /**\n             * A collection of options for buttons and menus appearing in the exporting\n             * module.\n             *\n             * @requires     modules/exporting\n             * @optionparent navigation\n             */\n            defaultOptions.navigation = {};\n        }\n        merge(true, defaultOptions.navigation, {\n            /**\n             * @optionparent navigation.buttonOptions\n             *\n             * @private\n             */\n            buttonOptions: {\n                theme: {},\n                /**\n                 * Whether to enable buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-enabled/\n                 *         Exporting module loaded but buttons disabled\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.0\n                 * @apioption navigation.buttonOptions.enabled\n                 */\n                /**\n                 * The pixel size of the symbol on the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolSize: 14,\n                /**\n                 * The x position of the center of the symbol inside the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolX: 12.5,\n                /**\n                 * The y position of the center of the symbol inside the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolY: 10.5,\n                /**\n                 * Alignment for the buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-align/\n                 *         Center aligned\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'right',\n                /**\n                 * The pixel spacing between buttons.\n                 *\n                 * @since 2.0\n                 */\n                buttonSpacing: 3,\n                /**\n                 * Pixel height of the buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                height: 22,\n                /**\n                 * A text string to add to the individual button.\n                 *\n                 * @sample highcharts/exporting/buttons-text/\n                 *         Full text button\n                 * @sample highcharts/exporting/buttons-text-symbol/\n                 *         Combined symbol and text\n                 *\n                 * @type      {string}\n                 * @default   null\n                 * @since     3.0\n                 * @apioption navigation.buttonOptions.text\n                 */\n                /**\n                 * The vertical offset of the button's position relative to its\n                 * `verticalAlign`.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-verticalalign/\n                 *         Buttons at lower right\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption navigation.buttonOptions.y\n                 */\n                /**\n                 * The vertical alignment of the buttons. Can be one of `\"top\"`,\n                 * `\"middle\"` or `\"bottom\"`.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-verticalalign/\n                 *         Buttons at lower right\n                 *\n                 * @type  {Highcharts.VerticalAlignValue}\n                 * @since 2.0\n                 */\n                verticalAlign: 'top',\n                /**\n                 * The pixel width of the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                width: 24\n            }\n        });\n        // Presentational attributes\n        merge(true, defaultOptions.navigation\n        /**\n         * A collection of options for buttons and menus appearing in the exporting\n         * module.\n         *\n         * @optionparent navigation\n         */\n        , {\n            /**\n             * CSS styles for the popup menu appearing by default when the export\n             * icon is clicked. This menu is rendered in HTML.\n             *\n             * @see In styled mode, the menu is styled with the `.highcharts-menu`\n             *      class.\n             *\n             * @sample highcharts/navigation/menustyle/\n             *         Light gray menu background\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"border\": \"1px solid #999999\", \"background\": \"#ffffff\", \"padding\": \"5px 0\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuStyle: {\n                /** @ignore-option */\n                border: '1px solid #999999',\n                /** @ignore-option */\n                background: '#ffffff',\n                /** @ignore-option */\n                padding: '5px 0'\n            },\n            /**\n             * CSS styles for the individual items within the popup menu appearing\n             * by default when the export icon is clicked. The menu items are\n             * rendered in HTML. Font size defaults to `11px` on desktop and `14px`\n             * on touch devices.\n             *\n             * @see In styled mode, the menu items are styled with the\n             *      `.highcharts-menu-item` class.\n             *\n             * @sample {highcharts} highcharts/navigation/menuitemstyle/\n             *         Add a grey stripe to the left\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"padding\": \"0.5em 1em\", \"color\": \"#333333\", \"background\": \"none\", \"fontSize\": \"11px/14px\", \"transition\": \"background 250ms, color 250ms\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuItemStyle: {\n                /** @ignore-option */\n                padding: '0.5em 1em',\n                /** @ignore-option */\n                color: '#333333',\n                /** @ignore-option */\n                background: 'none',\n                /** @ignore-option */\n                fontSize: isTouchDevice ? '14px' : '11px',\n                /** @ignore-option */\n                transition: 'background 250ms, color 250ms'\n            },\n            /**\n             * CSS styles for the hover state of the individual items within the\n             * popup menu appearing by default when the export icon is clicked. The\n             * menu items are rendered in HTML.\n             *\n             * @see In styled mode, the menu items are styled with the\n             *      `.highcharts-menu-item` class.\n             *\n             * @sample highcharts/navigation/menuitemhoverstyle/\n             *         Bold text on hover\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"background\": \"#335cad\", \"color\": \"#ffffff\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuItemHoverStyle: {\n                /** @ignore-option */\n                background: '#335cad',\n                /** @ignore-option */\n                color: '#ffffff'\n            },\n            /**\n             * A collection of options for buttons appearing in the exporting\n             * module.\n             *\n             * In styled mode, the buttons are styled with the\n             * `.highcharts-contextbutton` and `.highcharts-button-symbol` classes.\n             *\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            buttonOptions: {\n                /**\n                 * Fill color for the symbol within the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-symbolfill/\n                 *         Blue symbol stroke for one of the buttons\n                 *\n                 * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since 2.0\n                 */\n                symbolFill: '#666666',\n                /**\n                 * The color of the symbol's stroke or line.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-symbolstroke/\n                 *         Blue symbol stroke\n                 *\n                 * @type  {Highcharts.ColorString}\n                 * @since 2.0\n                 */\n                symbolStroke: '#666666',\n                /**\n                 * The pixel stroke width of the symbol on the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolStrokeWidth: 3,\n                /**\n                 * A configuration object for the button theme. The object accepts\n                 * SVG properties like `stroke-width`, `stroke` and `fill`.\n                 * Tri-state button styles are supported by the `states.hover` and\n                 * `states.select` objects.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-theme/\n                 *         Theming the buttons\n                 *\n                 * @requires modules/exporting\n                 *\n                 * @since 3.0\n                 */\n                theme: {\n                    /**\n                     * The default fill exists only to capture hover events.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default   #ffffff\n                     * @apioption navigation.buttonOptions.theme.fill\n                     */\n                    /**\n                     * Default stroke for the buttons.\n                     * @type      {Highcharts.ColorString}\n                     * @default   none\n                     * @apioption navigation.buttonOptions.theme.stroke\n                     */\n                    /**\n                     * Padding for the button.\n                     */\n                    padding: 5\n                }\n            }\n        });\n        // Add the export related options\n        /**\n         * Options for the exporting module. For an overview on the matter, see\n         * [the docs](https://www.highcharts.com/docs/export-module/export-module-overview).\n         *\n         * @requires     modules/exporting\n         * @optionparent exporting\n         */\n        defaultOptions.exporting = {\n            /**\n             * Experimental setting to allow HTML inside the chart (added through\n             * the `useHTML` options), directly in the exported image. This allows\n             * you to preserve complicated HTML structures like tables or bi-directional\n             * text in exported charts.\n             *\n             * Disclaimer: The HTML is rendered in a `foreignObject` tag in the\n             * generated SVG. The official export server is based on PhantomJS,\n             * which supports this, but other SVG clients, like Batik, does not\n             * support it. This also applies to downloaded SVG that you want to\n             * open in a desktop client.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.8\n             * @apioption exporting.allowHTML\n             */\n            /**\n             * Additional chart options to be merged into the chart before exporting to\n             * an image format. This does not apply to printing the chart via the export\n             * menu.\n             *\n             * For example, a common use case is to add data labels to improve\n             * readability of the exported chart, or to add a printer-friendly color\n             * scheme to exported PDFs.\n             *\n             * @sample {highcharts} highcharts/exporting/chartoptions-data-labels/\n             *         Added data labels\n             * @sample {highstock} highcharts/exporting/chartoptions-data-labels/\n             *         Added data labels\n             *\n             * @type      {Highcharts.Options}\n             * @apioption exporting.chartOptions\n             */\n            /**\n             * Whether to enable the exporting module. Disabling the module will\n             * hide the context button, but API methods will still be available.\n             *\n             * @sample {highcharts} highcharts/exporting/enabled-false/\n             *         Exporting module is loaded but disabled\n             * @sample {highstock} highcharts/exporting/enabled-false/\n             *         Exporting module is loaded but disabled\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     2.0\n             * @apioption exporting.enabled\n             */\n            /**\n             * Function to call if the offline-exporting module fails to export\n             * a chart on the client side, and [fallbackToExportServer](\n             * #exporting.fallbackToExportServer) is disabled. If left undefined, an\n             * exception is thrown instead. Receives two parameters, the exporting\n             * options, and the error from the module.\n             *\n             * @see [fallbackToExportServer](#exporting.fallbackToExportServer)\n             *\n             * @type      {Highcharts.ExportingErrorCallbackFunction}\n             * @since     5.0.0\n             * @requires  modules/exporting\n             * @requires  modules/offline-exporting\n             * @apioption exporting.error\n             */\n            /**\n             * Whether or not to fall back to the export server if the offline-exporting\n             * module is unable to export the chart on the client side. This happens for\n             * certain browsers, and certain features (e.g.\n             * [allowHTML](#exporting.allowHTML)), depending on the image type exporting\n             * to. For very complex charts, it is possible that export can fail in\n             * browsers that don't support Blob objects, due to data URL length limits.\n             * It is recommended to define the [exporting.error](#exporting.error)\n             * handler if disabling fallback, in order to notify users in case export\n             * fails.\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     4.1.8\n             * @requires  modules/exporting\n             * @requires  modules/offline-exporting\n             * @apioption exporting.fallbackToExportServer\n             */\n            /**\n             * The filename, without extension, to use for the exported chart.\n             *\n             * @sample {highcharts} highcharts/exporting/filename/\n             *         Custom file name\n             * @sample {highstock} highcharts/exporting/filename/\n             *         Custom file name\n             *\n             * @type      {string}\n             * @default   chart\n             * @since     2.0\n             * @apioption exporting.filename\n             */\n            /**\n             * An object containing additional key value data for the POST form that\n             * sends the SVG to the export server. For example, a `target` can be set to\n             * make sure the generated image is received in another frame, or a custom\n             * `enctype` or `encoding` can be set.\n             *\n             * @type      {Highcharts.HTMLAttributes}\n             * @since     3.0.8\n             * @apioption exporting.formAttributes\n             */\n            /**\n             * Path where Highcharts will look for export module dependencies to\n             * load on demand if they don't already exist on `window`. Should currently\n             * point to location of [CanVG](https://github.com/canvg/canvg) library,\n             * [RGBColor.js](https://github.com/canvg/canvg),\n             * [jsPDF](https://github.com/yWorks/jsPDF) and\n             * [svg2pdf.js](https://github.com/yWorks/svg2pdf.js), required for client\n             * side export in certain browsers.\n             *\n             * @type      {string}\n             * @default   https://code.highcharts.com/{version}/lib\n             * @since     5.0.0\n             * @apioption exporting.libURL\n             */\n            /**\n             * Analogous to [sourceWidth](#exporting.sourceWidth).\n             *\n             * @type      {number}\n             * @since     3.0\n             * @apioption exporting.sourceHeight\n             */\n            /**\n             * The width of the original chart when exported, unless an explicit\n             * [chart.width](#chart.width) is set, or a pixel width is set on the\n             * container. The width exported raster image is then multiplied by\n             * [scale](#exporting.scale).\n             *\n             * @sample {highcharts} highcharts/exporting/sourcewidth/\n             *         Source size demo\n             * @sample {highstock} highcharts/exporting/sourcewidth/\n             *         Source size demo\n             * @sample {highmaps} maps/exporting/sourcewidth/\n             *         Source size demo\n             *\n             * @type      {number}\n             * @since     3.0\n             * @apioption exporting.sourceWidth\n             */\n            /**\n             * The pixel width of charts exported to PNG or JPG. As of Highcharts\n             * 3.0, the default pixel width is a function of the [chart.width](\n             * #chart.width) or [exporting.sourceWidth](#exporting.sourceWidth) and the\n             * [exporting.scale](#exporting.scale).\n             *\n             * @sample {highcharts} highcharts/exporting/width/\n             *         Export to 200px wide images\n             * @sample {highstock} highcharts/exporting/width/\n             *         Export to 200px wide images\n             *\n             * @type      {number}\n             * @since     2.0\n             * @apioption exporting.width\n             */\n            /**\n             * Default MIME type for exporting if `chart.exportChart()` is called\n             * without specifying a `type` option. Possible values are `image/png`,\n             *  `image/jpeg`, `application/pdf` and `image/svg+xml`.\n             *\n             * @type  {Highcharts.ExportingMimeTypeValue}\n             * @since 2.0\n             */\n            type: 'image/png',\n            /**\n             * The URL for the server module converting the SVG string to an image\n             * format. By default this points to Highchart's free web service.\n             *\n             * @since 2.0\n             */\n            url: 'https://export.highcharts.com/',\n            /**\n             * When printing the chart from the menu item in the burger menu, if\n             * the on-screen chart exceeds this width, it is resized. After printing\n             * or cancelled, it is restored. The default width makes the chart\n             * fit into typical paper format. Note that this does not affect the\n             * chart when printing the web page as a whole.\n             *\n             * @since 4.2.5\n             */\n            printMaxWidth: 780,\n            /**\n             * Defines the scale or zoom factor for the exported image compared\n             * to the on-screen display. While for instance a 600px wide chart\n             * may look good on a website, it will look bad in print. The default\n             * scale of 2 makes this chart export to a 1200px PNG or JPG.\n             *\n             * @see [chart.width](#chart.width)\n             * @see [exporting.sourceWidth](#exporting.sourceWidth)\n             *\n             * @sample {highcharts} highcharts/exporting/scale/\n             *         Scale demonstrated\n             * @sample {highstock} highcharts/exporting/scale/\n             *         Scale demonstrated\n             * @sample {highmaps} maps/exporting/scale/\n             *         Scale demonstrated\n             *\n             * @since 3.0\n             */\n            scale: 2,\n            /**\n             * Options for the export related buttons, print and export. In addition\n             * to the default buttons listed here, custom buttons can be added.\n             * See [navigation.buttonOptions](#navigation.buttonOptions) for general\n             * options.\n             *\n             * @type     {Highcharts.Dictionary<*>}\n             * @requires modules/exporting\n             */\n            buttons: {\n                /**\n                 * Options for the export button.\n                 *\n                 * In styled mode, export button styles can be applied with the\n                 * `.highcharts-contextbutton` class.\n                 *\n                 * @declare  Highcharts.ExportingButtonsOptionsObject\n                 * @extends  navigation.buttonOptions\n                 * @requires modules/exporting\n                 */\n                contextButton: {\n                    /**\n                     * A click handler callback to use on the button directly instead of\n                     * the popup menu.\n                     *\n                     * @sample highcharts/exporting/buttons-contextbutton-onclick/\n                     *         Skip the menu and export the chart directly\n                     *\n                     * @type      {Function}\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.onclick\n                     */\n                    /**\n                     * See [navigation.buttonOptions.symbolFill](\n                     * #navigation.buttonOptions.symbolFill).\n                     *\n                     * @type      {Highcharts.ColorString}\n                     * @default   #666666\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.symbolFill\n                     */\n                    /**\n                     * The horizontal position of the button relative to the `align`\n                     * option.\n                     *\n                     * @type      {number}\n                     * @default   -10\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.x\n                     */\n                    /**\n                     * The class name of the context button.\n                     */\n                    className: 'highcharts-contextbutton',\n                    /**\n                     * The class name of the menu appearing from the button.\n                     */\n                    menuClassName: 'highcharts-contextmenu',\n                    /**\n                     * The symbol for the button. Points to a definition function in\n                     * the `Highcharts.Renderer.symbols` collection. The default\n                     * `exportIcon` function is part of the exporting module. Possible\n                     * values are \"circle\", \"square\", \"diamond\", \"triangle\",\n                     * \"triangle-down\", \"menu\", \"menuball\" or custom shape.\n                     *\n                     * @sample highcharts/exporting/buttons-contextbutton-symbol/\n                     *         Use a circle for symbol\n                     * @sample highcharts/exporting/buttons-contextbutton-symbol-custom/\n                     *         Custom shape as symbol\n                     *\n                     * @type  {Highcharts.SymbolKeyValue|\"exportIcon\"|\"menu\"|\"menuball\"|string}\n                     * @since 2.0\n                     */\n                    symbol: 'menu',\n                    /**\n                     * The key to a [lang](#lang) option setting that is used for the\n                     * button's title tooltip. When the key is `contextButtonTitle`, it\n                     * refers to [lang.contextButtonTitle](#lang.contextButtonTitle)\n                     * that defaults to \"Chart context menu\".\n                     *\n                     * @since 6.1.4\n                     */\n                    titleKey: 'contextButtonTitle',\n                    /**\n                     * This option is deprecated, use\n                     * [titleKey](#exporting.buttons.contextButton.titleKey) instead.\n                     *\n                     * @deprecated\n                     * @type      {string}\n                     * @apioption exporting.buttons.contextButton._titleKey\n                     */\n                    /**\n                     * A collection of strings pointing to config options for the menu\n                     * items. The config options are defined in the\n                     * `menuItemDefinitions` option.\n                     *\n                     * By default, there is the \"View in full screen\" and \"Print\" menu\n                     * items, plus one menu item for each of the available export types.\n                     *\n                     * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     *\n                     * @type    {Array<string>}\n                     * @default [\"viewFullscreen\", \"printChart\", \"separator\", \"downloadPNG\", \"downloadJPEG\", \"downloadPDF\", \"downloadSVG\"]\n                     * @since   2.0\n                     */\n                    menuItems: [\n                        'viewFullscreen',\n                        'printChart',\n                        'separator',\n                        'downloadPNG',\n                        'downloadJPEG',\n                        'downloadPDF',\n                        'downloadSVG'\n                    ]\n                }\n            },\n            /**\n             * An object consisting of definitions for the menu items in the context\n             * menu. Each key value pair has a `key` that is referenced in the\n             * [menuItems](#exporting.buttons.contextButton.menuItems) setting,\n             * and a `value`, which is an object with the following properties:\n             *\n             * - **onclick:** The click handler for the menu item\n             *\n             * - **text:** The text for the menu item\n             *\n             * - **textKey:** If internationalization is required, the key to a language\n             *   string\n             *\n             * Custom text for the \"exitFullScreen\" can be set only in lang options\n             * (it is not a separate button).\n             *\n             * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             *\n             *\n             * @type    {Highcharts.Dictionary<Highcharts.ExportingMenuObject>}\n             * @default {\"viewFullscreen\": {}, \"printChart\": {}, \"separator\": {}, \"downloadPNG\": {}, \"downloadJPEG\": {}, \"downloadPDF\": {}, \"downloadSVG\": {}}\n             * @since   5.0.13\n             */\n            menuItemDefinitions: {\n                /**\n                 * @ignore\n                 */\n                viewFullscreen: {\n                    textKey: 'viewFullscreen',\n                    onclick: function () {\n                        this.fullscreen.toggle();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                printChart: {\n                    textKey: 'printChart',\n                    onclick: function () {\n                        this.print();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                separator: {\n                    separator: true\n                },\n                /**\n                 * @ignore\n                 */\n                downloadPNG: {\n                    textKey: 'downloadPNG',\n                    onclick: function () {\n                        this.exportChart();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadJPEG: {\n                    textKey: 'downloadJPEG',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'image/jpeg'\n                        });\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadPDF: {\n                    textKey: 'downloadPDF',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'application/pdf'\n                        });\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadSVG: {\n                    textKey: 'downloadSVG',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'image/svg+xml'\n                        });\n                    }\n                }\n            }\n        };\n        /**\n         * Fires after a chart is printed through the context menu item or the\n         * `Chart.print` method.\n         *\n         * @sample highcharts/chart/events-beforeprint-afterprint/\n         *         Rescale the chart to print\n         *\n         * @type      {Highcharts.ExportingAfterPrintCallbackFunction}\n         * @since     4.1.0\n         * @context   Highcharts.Chart\n         * @requires  modules/exporting\n         * @apioption chart.events.afterPrint\n         */\n        /**\n         * Fires before a chart is printed through the context menu item or\n         * the `Chart.print` method.\n         *\n         * @sample highcharts/chart/events-beforeprint-afterprint/\n         *         Rescale the chart to print\n         *\n         * @type      {Highcharts.ExportingBeforePrintCallbackFunction}\n         * @since     4.1.0\n         * @context   Highcharts.Chart\n         * @requires  modules/exporting\n         * @apioption chart.events.beforePrint\n         */\n        /**\n         * The post utility\n         *\n         * @private\n         * @function Highcharts.post\n         * @param {string} url\n         *        Post URL\n         * @param {object} data\n         *        Post data\n         * @param {Highcharts.Dictionary<string>} [formAttributes]\n         *        Additional attributes for the post request\n         * @return {void}\n         */\n        H.post = function (url, data, formAttributes) {\n            // create the form\n            var form = createElement('form',\n                merge({\n                    method: 'post',\n                    action: url,\n                    enctype: 'multipart/form-data'\n                },\n                formAttributes), {\n                    display: 'none'\n                },\n                doc.body);\n            // add the data\n            objectEach(data, function (val, name) {\n                createElement('input', {\n                    type: 'hidden',\n                    name: name,\n                    value: val\n                }, null, form);\n            });\n            // submit\n            form.submit();\n            // clean up\n            discardElement(form);\n        };\n        if (H.isSafari) {\n            H.win.matchMedia('print').addListener(function (mqlEvent) {\n                if (!H.printingChart) {\n                    return void 0;\n                }\n                if (mqlEvent.matches) {\n                    H.printingChart.beforePrint();\n                }\n                else {\n                    H.printingChart.afterPrint();\n                }\n            });\n        }\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Exporting module only. A collection of fixes on the produced SVG to\n             * account for expando properties, browser bugs, VML problems and other.\n             * Returns a cleaned SVG.\n             *\n             * @private\n             * @function Highcharts.Chart#sanitizeSVG\n             * @param {string} svg\n             *        SVG code to sanitize\n             * @param {Highcharts.Options} options\n             *        Chart options to apply\n             * @return {string}\n             *         Sanitized SVG code\n             * @requires modules/exporting\n             */\n            sanitizeSVG: function (svg, options) {\n                var split = svg.indexOf('</svg>') + 6,\n                    html = svg.substr(split);\n                // Remove any HTML added to the container after the SVG (#894, #9087)\n                svg = svg.substr(0, split);\n                // Move HTML into a foreignObject\n                if (options && options.exporting && options.exporting.allowHTML) {\n                    if (html) {\n                        html = '<foreignObject x=\"0\" y=\"0\" ' +\n                            'width=\"' + options.chart.width + '\" ' +\n                            'height=\"' + options.chart.height + '\">' +\n                            '<body xmlns=\"http://www.w3.org/1999/xhtml\">' +\n                            html +\n                            '</body>' +\n                            '</foreignObject>';\n                        svg = svg.replace('</svg>', html + '</svg>');\n                    }\n                }\n                svg = svg\n                    .replace(/zIndex=\"[^\"]+\"/g, '')\n                    .replace(/symbolName=\"[^\"]+\"/g, '')\n                    .replace(/jQuery[0-9]+=\"[^\"]+\"/g, '')\n                    .replace(/url\\((\"|&quot;)(.*?)(\"|&quot;)\\;?\\)/g, 'url($2)')\n                    .replace(/url\\([^#]+#/g, 'url(#')\n                    .replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n                    .replace(/ (|NS[0-9]+\\:)href=/g, ' xlink:href=') // #3567\n                    .replace(/\\n/, ' ')\n                    // Batik doesn't support rgba fills and strokes (#3095)\n                    .replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g, // eslint-disable-line max-len\n                '$1=\"rgb($2)\" $1-opacity=\"$3\"')\n                    // Replace HTML entities, issue #347\n                    .replace(/&nbsp;/g, '\\u00A0') // no-break space\n                    .replace(/&shy;/g, '\\u00AD'); // soft hyphen\n                // Further sanitize for oldIE\n                if (this.ieSanitizeSVG) {\n                    svg = this.ieSanitizeSVG(svg);\n                }\n                return svg;\n            },\n            /**\n             * Return the unfiltered innerHTML of the chart container. Used as hook for\n             * plugins. In styled mode, it also takes care of inlining CSS style rules.\n             *\n             * @see Chart#getSVG\n             *\n             * @function Highcharts.Chart#getChartHTML\n             *\n             * @returns {string}\n             *          The unfiltered SVG of the chart.\n             *\n             * @requires modules/exporting\n             */\n            getChartHTML: function () {\n                if (this.styledMode) {\n                    this.inlineStyles();\n                }\n                return this.container.innerHTML;\n            },\n            /**\n             * Return an SVG representation of the chart.\n             *\n             * @sample highcharts/members/chart-getsvg/\n             *         View the SVG from a button\n             *\n             * @function Highcharts.Chart#getSVG\n             *\n             * @param {Highcharts.Options} [chartOptions]\n             *        Additional chart options for the generated SVG representation. For\n             *        collections like `xAxis`, `yAxis` or `series`, the additional\n             *        options is either merged in to the original item of the same\n             *        `id`, or to the first item if a common id is not found.\n             *\n             * @return {string}\n             *         The SVG representation of the rendered chart.\n             *\n             * @fires Highcharts.Chart#event:getSVG\n             *\n             * @requires modules/exporting\n             */\n            getSVG: function (chartOptions) {\n                var chart = this,\n                    chartCopy,\n                    sandbox,\n                    svg,\n                    seriesOptions,\n                    sourceWidth,\n                    sourceHeight,\n                    cssWidth,\n                    cssHeight, \n                    // Copy the options and add extra options\n                    options = merge(chart.options,\n                    chartOptions);\n                // Use userOptions to make the options chain in series right (#3881)\n                options.plotOptions = merge(chart.userOptions.plotOptions, chartOptions && chartOptions.plotOptions);\n                // ... and likewise with time, avoid that undefined time properties are\n                // merged over legacy global time options\n                options.time = merge(chart.userOptions.time, chartOptions && chartOptions.time);\n                // create a sandbox where a new chart will be generated\n                sandbox = createElement('div', null, {\n                    position: 'absolute',\n                    top: '-9999em',\n                    width: chart.chartWidth + 'px',\n                    height: chart.chartHeight + 'px'\n                }, doc.body);\n                // get the source size\n                cssWidth = chart.renderTo.style.width;\n                cssHeight = chart.renderTo.style.height;\n                sourceWidth = options.exporting.sourceWidth ||\n                    options.chart.width ||\n                    (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n                    (options.isGantt ? 800 : 600);\n                sourceHeight = options.exporting.sourceHeight ||\n                    options.chart.height ||\n                    (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n                    400;\n                // override some options\n                extend(options.chart, {\n                    animation: false,\n                    renderTo: sandbox,\n                    forExport: true,\n                    renderer: 'SVGRenderer',\n                    width: sourceWidth,\n                    height: sourceHeight\n                });\n                options.exporting.enabled = false; // hide buttons in print\n                delete options.data; // #3004\n                // prepare for replicating the chart\n                options.series = [];\n                chart.series.forEach(function (serie) {\n                    seriesOptions = merge(serie.userOptions, {\n                        animation: false,\n                        enableMouseTracking: false,\n                        showCheckbox: false,\n                        visible: serie.visible\n                    });\n                    // Used for the navigator series that has its own option set\n                    if (!seriesOptions.isInternal) {\n                        options.series.push(seriesOptions);\n                    }\n                });\n                // Assign an internal key to ensure a one-to-one mapping (#5924)\n                chart.axes.forEach(function (axis) {\n                    if (!axis.userOptions.internalKey) { // #6444\n                        axis.userOptions.internalKey = uniqueKey();\n                    }\n                });\n                // generate the chart copy\n                chartCopy = new H.Chart(options, chart.callback);\n                // Axis options and series options  (#2022, #3900, #5982)\n                if (chartOptions) {\n                    ['xAxis', 'yAxis', 'series'].forEach(function (coll) {\n                        var collOptions = {};\n                        if (chartOptions[coll]) {\n                            collOptions[coll] = chartOptions[coll];\n                            chartCopy.update(collOptions);\n                        }\n                    });\n                }\n                // Reflect axis extremes in the export (#5924)\n                chart.axes.forEach(function (axis) {\n                    var axisCopy = find(chartCopy.axes,\n                        function (copy) {\n                            return copy.options.internalKey ===\n                                axis.userOptions.internalKey;\n                    }), extremes = axis.getExtremes(), userMin = extremes.userMin, userMax = extremes.userMax;\n                    if (axisCopy &&\n                        ((typeof userMin !== 'undefined' &&\n                            userMin !== axisCopy.min) || (typeof userMax !== 'undefined' &&\n                            userMax !== axisCopy.max))) {\n                        axisCopy.setExtremes(userMin, userMax, true, false);\n                    }\n                });\n                // Get the SVG from the container's innerHTML\n                svg = chartCopy.getChartHTML();\n                fireEvent(this, 'getSVG', { chartCopy: chartCopy });\n                svg = chart.sanitizeSVG(svg, options);\n                // free up memory\n                options = null;\n                chartCopy.destroy();\n                discardElement(sandbox);\n                return svg;\n            },\n            /**\n             * @private\n             * @function Highcharts.Chart#getSVGForExport\n             * @param {Highcharts.ExportingOptions} options\n             * @param {Highcharts.Options} chartOptions\n             * @return {string}\n             * @requires modules/exporting\n             */\n            getSVGForExport: function (options, chartOptions) {\n                var chartExportingOptions = this.options.exporting;\n                return this.getSVG(merge({ chart: { borderRadius: 0 } }, chartExportingOptions.chartOptions, chartOptions, {\n                    exporting: {\n                        sourceWidth: ((options && options.sourceWidth) ||\n                            chartExportingOptions.sourceWidth),\n                        sourceHeight: ((options && options.sourceHeight) ||\n                            chartExportingOptions.sourceHeight)\n                    }\n                }));\n            },\n            /**\n             * Get the default file name used for exported charts. By default it creates\n             * a file name based on the chart title.\n             *\n             * @function Highcharts.Chart#getFilename\n             *\n             * @return {string} A file name without extension.\n             *\n             * @requires modules/exporting\n             */\n            getFilename: function () {\n                var s = this.userOptions.title && this.userOptions.title.text,\n                    filename = this.options.exporting.filename;\n                if (filename) {\n                    return filename.replace(/\\//g, '-');\n                }\n                if (typeof s === 'string') {\n                    filename = s\n                        .toLowerCase()\n                        .replace(/<\\/?[^>]+(>|$)/g, '') // strip HTML tags\n                        .replace(/[\\s_]+/g, '-')\n                        .replace(/[^a-z0-9\\-]/g, '') // preserve only latin\n                        .replace(/^[\\-]+/g, '') // dashes in the start\n                        .replace(/[\\-]+/g, '-') // dashes in a row\n                        .substr(0, 24)\n                        .replace(/[\\-]+$/g, ''); // dashes in the end;\n                }\n                if (!filename || filename.length < 5) {\n                    filename = 'chart';\n                }\n                return filename;\n            },\n            /**\n             * Exporting module required. Submit an SVG version of the chart to a server\n             * along with some parameters for conversion.\n             *\n             * @sample highcharts/members/chart-exportchart/\n             *         Export with no options\n             * @sample highcharts/members/chart-exportchart-filename/\n             *         PDF type and custom filename\n             * @sample highcharts/members/chart-exportchart-custom-background/\n             *         Different chart background in export\n             * @sample stock/members/chart-exportchart/\n             *         Export with Highstock\n             *\n             * @function Highcharts.Chart#exportChart\n             *\n             * @param {Highcharts.ExportingOptions} exportingOptions\n             *        Exporting options in addition to those defined in\n             *        [exporting](https://api.highcharts.com/highcharts/exporting).\n             *\n             * @param {Highcharts.Options} chartOptions\n             *        Additional chart options for the exported chart. For example a\n             *        different background color can be added here, or `dataLabels` for\n             *        export only.\n             *\n             * @return {void}\n             *\n             * @requires modules/exporting\n             */\n            exportChart: function (exportingOptions, chartOptions) {\n                var svg = this.getSVGForExport(exportingOptions,\n                    chartOptions);\n                // merge the options\n                exportingOptions = merge(this.options.exporting, exportingOptions);\n                // do the post\n                H.post(exportingOptions.url, {\n                    filename: exportingOptions.filename ? exportingOptions.filename.replace(/\\//g, '-') : this.getFilename(),\n                    type: exportingOptions.type,\n                    // IE8 fails to post undefined correctly, so use 0\n                    width: exportingOptions.width || 0,\n                    scale: exportingOptions.scale,\n                    svg: svg\n                }, exportingOptions.formAttributes);\n            },\n            /**\n            * Move the chart container(s) to another div.\n            *\n            * @function Highcharts#moveContainers\n            *\n            * @private\n            *\n            * @param {Highcharts.HTMLDOMElement} moveTo\n            *        Move target\n            * @return {void}\n            */\n            moveContainers: function (moveTo) {\n                var chart = this;\n                (chart.fixedDiv ? // When scrollablePlotArea is active (#9533)\n                    [chart.fixedDiv, chart.scrollingContainer] :\n                    [chart.container]).forEach(function (div) {\n                    moveTo.appendChild(div);\n                });\n            },\n            /**\n            * Prepare chart and document before printing a chart.\n            *\n            * @function Highcharts#beforePrint\n            *\n            * @private\n            *\n            * @return {void}\n            *\n            * @fires Highcharts.Chart#event:beforePrint\n            */\n            beforePrint: function () {\n                var chart = this,\n                    body = doc.body,\n                    printMaxWidth = chart.options.exporting.printMaxWidth,\n                    printReverseInfo = {\n                        childNodes: body.childNodes,\n                        origDisplay: [],\n                        resetParams: void 0\n                    };\n                var handleMaxWidth;\n                chart.isPrinting = true;\n                chart.pointer.reset(null, 0);\n                fireEvent(chart, 'beforePrint');\n                // Handle printMaxWidth\n                handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;\n                if (handleMaxWidth) {\n                    printReverseInfo.resetParams = [\n                        chart.options.chart.width,\n                        void 0,\n                        false\n                    ];\n                    chart.setSize(printMaxWidth, void 0, false);\n                }\n                // hide all body content\n                [].forEach.call(printReverseInfo.childNodes, function (node, i) {\n                    if (node.nodeType === 1) {\n                        printReverseInfo.origDisplay[i] = node.style.display;\n                        node.style.display = 'none';\n                    }\n                });\n                // pull out the chart\n                chart.moveContainers(body);\n                // Storage details for undo action after printing\n                chart.printReverseInfo = printReverseInfo;\n            },\n            /**\n            * Clena up after printing a chart.\n            *\n            * @function Highcharts#afterPrint\n            *\n            * @private\n            *\n            * @param {Highcharts.Chart} chart\n            *        Chart that was (or suppose to be) printed\n            * @return {void}\n            *\n            * @fires Highcharts.Chart#event:afterPrint\n            */\n            afterPrint: function () {\n                var chart = this;\n                if (!chart.printReverseInfo) {\n                    return void 0;\n                }\n                var childNodes = chart.printReverseInfo.childNodes,\n                    origDisplay = chart.printReverseInfo.origDisplay,\n                    resetParams = chart.printReverseInfo.resetParams;\n                // put the chart back in\n                chart.moveContainers(chart.renderTo);\n                // restore all body content\n                [].forEach.call(childNodes, function (node, i) {\n                    if (node.nodeType === 1) {\n                        node.style.display = (origDisplay[i] || '');\n                    }\n                });\n                chart.isPrinting = false;\n                // Reset printMaxWidth\n                if (resetParams) {\n                    chart.setSize.apply(chart, resetParams);\n                }\n                delete chart.printReverseInfo;\n                delete H.printingChart;\n                fireEvent(chart, 'afterPrint');\n            },\n            /**\n             * Exporting module required. Clears away other elements in the page and\n             * prints the chart as it is displayed. By default, when the exporting\n             * module is enabled, a context button with a drop down menu in the upper\n             * right corner accesses this function.\n             *\n             * @sample highcharts/members/chart-print/\n             *         Print from a HTML button\n             *\n             * @function Highcharts.Chart#print\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:beforePrint\n             * @fires Highcharts.Chart#event:afterPrint\n             *\n             * @requires modules/exporting\n             */\n            print: function () {\n                var chart = this;\n                if (chart.isPrinting) { // block the button while in printing mode\n                    return;\n                }\n                H.printingChart = chart;\n                if (!H.isSafari) {\n                    chart.beforePrint();\n                }\n                // Give the browser time to draw WebGL content, an issue that randomly\n                // appears (at least) in Chrome ~67 on the Mac (#8708).\n                setTimeout(function () {\n                    win.focus(); // #1510\n                    win.print();\n                    // allow the browser to prepare before reverting\n                    if (!H.isSafari) {\n                        setTimeout(function () {\n                            chart.afterPrint();\n                        }, 1000);\n                    }\n                }, 1);\n            },\n            /**\n             * Display a popup menu for choosing the export type.\n             *\n             * @private\n             * @function Highcharts.Chart#contextMenu\n             * @param {string} className\n             *        An identifier for the menu.\n             * @param {Array<string|Highcharts.ExportingMenuObject>} items\n             *        A collection with text and onclicks for the items.\n             * @param {number} x\n             *        The x position of the opener button\n             * @param {number} y\n             *        The y position of the opener button\n             * @param {number} width\n             *        The width of the opener button\n             * @param {number} height\n             *        The height of the opener button\n             * @return {void}\n             * @requires modules/exporting\n             */\n            contextMenu: function (className, items, x, y, width, height, button) {\n                var chart = this,\n                    navOptions = chart.options.navigation,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    cacheName = 'cache-' + className,\n                    menu = chart[cacheName],\n                    menuPadding = Math.max(width,\n                    height), // for mouse leave detection\n                    innerMenu,\n                    menuStyle;\n                // create the menu only the first time\n                if (!menu) {\n                    // create a HTML element above the SVG\n                    chart.exportContextMenu = chart[cacheName] = menu =\n                        createElement('div', {\n                            className: className\n                        }, {\n                            position: 'absolute',\n                            zIndex: 1000,\n                            padding: menuPadding + 'px',\n                            pointerEvents: 'auto'\n                        }, chart.fixedDiv || chart.container);\n                    innerMenu = createElement('ul', { className: 'highcharts-menu' }, {\n                        listStyle: 'none',\n                        margin: 0,\n                        padding: 0\n                    }, menu);\n                    // Presentational CSS\n                    if (!chart.styledMode) {\n                        css(innerMenu, extend({\n                            MozBoxShadow: '3px 3px 10px #888',\n                            WebkitBoxShadow: '3px 3px 10px #888',\n                            boxShadow: '3px 3px 10px #888'\n                        }, navOptions.menuStyle));\n                    }\n                    // hide on mouse out\n                    menu.hideMenu = function () {\n                        css(menu, { display: 'none' });\n                        if (button) {\n                            button.setState(0);\n                        }\n                        chart.openMenu = false;\n                        css(chart.renderTo, { overflow: 'hidden' }); // #10361\n                        U.clearTimeout(menu.hideTimer);\n                        fireEvent(chart, 'exportMenuHidden');\n                    };\n                    // Hide the menu some time after mouse leave (#1357)\n                    chart.exportEvents.push(addEvent(menu, 'mouseleave', function () {\n                        menu.hideTimer = win.setTimeout(menu.hideMenu, 500);\n                    }), addEvent(menu, 'mouseenter', function () {\n                        U.clearTimeout(menu.hideTimer);\n                    }), \n                    // Hide it on clicking or touching outside the menu (#2258,\n                    // #2335, #2407)\n                    addEvent(doc, 'mouseup', function (e) {\n                        if (!chart.pointer.inClass(e.target, className)) {\n                            menu.hideMenu();\n                        }\n                    }), addEvent(menu, 'click', function () {\n                        if (chart.openMenu) {\n                            menu.hideMenu();\n                        }\n                    }));\n                    // create the items\n                    items.forEach(function (item) {\n                        if (typeof item === 'string') {\n                            item = chart.options.exporting\n                                .menuItemDefinitions[item];\n                        }\n                        if (isObject(item, true)) {\n                            var element;\n                            if (item.separator) {\n                                element = createElement('hr', null, null, innerMenu);\n                            }\n                            else {\n                                element = createElement('li', {\n                                    className: 'highcharts-menu-item',\n                                    onclick: function (e) {\n                                        if (e) { // IE7\n                                            e.stopPropagation();\n                                        }\n                                        menu.hideMenu();\n                                        if (item.onclick) {\n                                            item.onclick\n                                                .apply(chart, arguments);\n                                        }\n                                    },\n                                    innerHTML: (item.text ||\n                                        chart.options.lang[item.textKey])\n                                }, null, innerMenu);\n                                if (!chart.styledMode) {\n                                    element.onmouseover = function () {\n                                        css(this, navOptions.menuItemHoverStyle);\n                                    };\n                                    element.onmouseout = function () {\n                                        css(this, navOptions.menuItemStyle);\n                                    };\n                                    css(element, extend({\n                                        cursor: 'pointer'\n                                    }, navOptions.menuItemStyle));\n                                }\n                            }\n                            // Keep references to menu divs to be able to destroy them\n                            chart.exportDivElements.push(element);\n                        }\n                    });\n                    // Keep references to menu and innerMenu div to be able to destroy\n                    // them\n                    chart.exportDivElements.push(innerMenu, menu);\n                    chart.exportMenuWidth = menu.offsetWidth;\n                    chart.exportMenuHeight = menu.offsetHeight;\n                }\n                menuStyle = { display: 'block' };\n                // if outside right, right align it\n                if (x + chart.exportMenuWidth > chartWidth) {\n                    menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';\n                }\n                else {\n                    menuStyle.left = (x - menuPadding) + 'px';\n                }\n                // if outside bottom, bottom align it\n                if (y + height + chart.exportMenuHeight > chartHeight &&\n                    button.alignOptions.verticalAlign !== 'top') {\n                    menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';\n                }\n                else {\n                    menuStyle.top = (y + height - menuPadding) + 'px';\n                }\n                css(menu, menuStyle);\n                css(chart.renderTo, { overflow: '' }); // #10361\n                chart.openMenu = true;\n                fireEvent(chart, 'exportMenuShown');\n            },\n            /**\n             * Add the export button to the chart, with options.\n             *\n             * @private\n             * @function Highcharts.Chart#addButton\n             * @param {Highcharts.NavigationButtonOptions} options\n             * @return {void}\n             * @requires modules/exporting\n             */\n            addButton: function (options) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    btnOptions = merge(chart.options.navigation.buttonOptions,\n                    options),\n                    onclick = btnOptions.onclick,\n                    menuItems = btnOptions.menuItems,\n                    symbol,\n                    button,\n                    symbolSize = btnOptions.symbolSize || 12;\n                if (!chart.btnCount) {\n                    chart.btnCount = 0;\n                }\n                // Keeps references to the button elements\n                if (!chart.exportDivElements) {\n                    chart.exportDivElements = [];\n                    chart.exportSVGElements = [];\n                }\n                if (btnOptions.enabled === false) {\n                    return;\n                }\n                var attr = btnOptions.theme,\n                    states = attr.states,\n                    hover = states && states.hover,\n                    select = states && states.select,\n                    callback;\n                if (!chart.styledMode) {\n                    attr.fill = pick(attr.fill, '#ffffff');\n                    attr.stroke = pick(attr.stroke, 'none');\n                }\n                delete attr.states;\n                if (onclick) {\n                    callback = function (e) {\n                        if (e) {\n                            e.stopPropagation();\n                        }\n                        onclick.call(chart, e);\n                    };\n                }\n                else if (menuItems) {\n                    callback = function (e) {\n                        // consistent with onclick call (#3495)\n                        if (e) {\n                            e.stopPropagation();\n                        }\n                        chart.contextMenu(button.menuClassName, menuItems, button.translateX, button.translateY, button.width, button.height, button);\n                        button.setState(2);\n                    };\n                }\n                if (btnOptions.text && btnOptions.symbol) {\n                    attr.paddingLeft = pick(attr.paddingLeft, 25);\n                }\n                else if (!btnOptions.text) {\n                    extend(attr, {\n                        width: btnOptions.width,\n                        height: btnOptions.height,\n                        padding: 0\n                    });\n                }\n                if (!chart.styledMode) {\n                    attr['stroke-linecap'] = 'round';\n                    attr.fill = pick(attr.fill, '#ffffff');\n                    attr.stroke = pick(attr.stroke, 'none');\n                }\n                button = renderer\n                    .button(btnOptions.text, 0, 0, callback, attr, hover, select)\n                    .addClass(options.className)\n                    .attr({\n                    title: pick(chart.options.lang[btnOptions._titleKey || btnOptions.titleKey], '')\n                });\n                button.menuClassName = (options.menuClassName ||\n                    'highcharts-menu-' + chart.btnCount++);\n                if (btnOptions.symbol) {\n                    symbol = renderer\n                        .symbol(btnOptions.symbol, btnOptions.symbolX - (symbolSize / 2), btnOptions.symbolY - (symbolSize / 2), symbolSize, symbolSize\n                    // If symbol is an image, scale it (#7957)\n                    , {\n                        width: symbolSize,\n                        height: symbolSize\n                    })\n                        .addClass('highcharts-button-symbol')\n                        .attr({\n                        zIndex: 1\n                    })\n                        .add(button);\n                    if (!chart.styledMode) {\n                        symbol.attr({\n                            stroke: btnOptions.symbolStroke,\n                            fill: btnOptions.symbolFill,\n                            'stroke-width': btnOptions.symbolStrokeWidth || 1\n                        });\n                    }\n                }\n                button\n                    .add(chart.exportingGroup)\n                    .align(extend(btnOptions, {\n                    width: button.width,\n                    x: pick(btnOptions.x, chart.buttonOffset) // #1654\n                }), true, 'spacingBox');\n                chart.buttonOffset += ((button.width + btnOptions.buttonSpacing) *\n                    (btnOptions.align === 'right' ? -1 : 1));\n                chart.exportSVGElements.push(button, symbol);\n            },\n            /**\n             * Destroy the export buttons.\n             * @private\n             * @function Highcharts.Chart#destroyExport\n             * @param {global.Event} [e]\n             * @return {void}\n             * @requires modules/exporting\n             */\n            destroyExport: function (e) {\n                var chart = e ? e.target : this,\n                    exportSVGElements = chart.exportSVGElements,\n                    exportDivElements = chart.exportDivElements,\n                    exportEvents = chart.exportEvents,\n                    cacheName;\n                // Destroy the extra buttons added\n                if (exportSVGElements) {\n                    exportSVGElements.forEach(function (elem, i) {\n                        // Destroy and null the svg elements\n                        if (elem) { // #1822\n                            elem.onclick = elem.ontouchstart = null;\n                            cacheName = 'cache-' + elem.menuClassName;\n                            if (chart[cacheName]) {\n                                delete chart[cacheName];\n                            }\n                            chart.exportSVGElements[i] = elem.destroy();\n                        }\n                    });\n                    exportSVGElements.length = 0;\n                }\n                // Destroy the exporting group\n                if (chart.exportingGroup) {\n                    chart.exportingGroup.destroy();\n                    delete chart.exportingGroup;\n                }\n                // Destroy the divs for the menu\n                if (exportDivElements) {\n                    exportDivElements.forEach(function (elem, i) {\n                        // Remove the event handler\n                        U.clearTimeout(elem.hideTimer); // #5427\n                        removeEvent(elem, 'mouseleave');\n                        // Remove inline events\n                        chart.exportDivElements[i] =\n                            elem.onmouseout =\n                                elem.onmouseover =\n                                    elem.ontouchstart =\n                                        elem.onclick = null;\n                        // Destroy the div by moving to garbage bin\n                        discardElement(elem);\n                    });\n                    exportDivElements.length = 0;\n                }\n                if (exportEvents) {\n                    exportEvents.forEach(function (unbind) {\n                        unbind();\n                    });\n                    exportEvents.length = 0;\n                }\n            }\n            /* eslint-enable no-invalid-this, valid-jsdoc */\n        });\n        // These ones are translated to attributes rather than styles\n        SVGRenderer.prototype.inlineToAttributes = [\n            'fill',\n            'stroke',\n            'strokeLinecap',\n            'strokeLinejoin',\n            'strokeWidth',\n            'textAnchor',\n            'x',\n            'y'\n        ];\n        // These CSS properties are not inlined. Remember camelCase.\n        SVGRenderer.prototype.inlineBlacklist = [\n            /-/,\n            /^(clipPath|cssText|d|height|width)$/,\n            /^font$/,\n            /[lL]ogical(Width|Height)$/,\n            /perspective/,\n            /TapHighlightColor/,\n            /^transition/,\n            /^length$/ // #7700\n            // /^text (border|color|cursor|height|webkitBorder)/\n        ];\n        SVGRenderer.prototype.unstyledElements = [\n            'clipPath',\n            'defs',\n            'desc'\n        ];\n        /**\n         * Analyze inherited styles from stylesheets and add them inline\n         *\n         * @private\n         * @function Highcharts.Chart#inlineStyles\n         * @return {void}\n         *\n         * @todo: What are the border styles for text about? In general, text has a lot\n         * of properties.\n         * @todo: Make it work with IE9 and IE10.\n         *\n         * @requires modules/exporting\n         */\n        Chart.prototype.inlineStyles = function () {\n            var renderer = this.renderer,\n                inlineToAttributes = renderer.inlineToAttributes,\n                blacklist = renderer.inlineBlacklist,\n                whitelist = renderer.inlineWhitelist, // For IE\n                unstyledElements = renderer.unstyledElements,\n                defaultStyles = {},\n                dummySVG,\n                iframe,\n                iframeDoc;\n            // Create an iframe where we read default styles without pollution from this\n            // body\n            iframe = doc.createElement('iframe');\n            css(iframe, {\n                width: '1px',\n                height: '1px',\n                visibility: 'hidden'\n            });\n            doc.body.appendChild(iframe);\n            iframeDoc = iframe.contentWindow.document;\n            iframeDoc.open();\n            iframeDoc.write('<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>');\n            iframeDoc.close();\n            /**\n             * Make hyphenated property names out of camelCase\n             * @private\n             * @param {string} prop\n             *        Property name in camelCase\n             * @return {string}\n             *         Hyphenated property name\n             */\n            function hyphenate(prop) {\n                return prop.replace(/([A-Z])/g, function (a, b) {\n                    return '-' + b.toLowerCase();\n                });\n            }\n            /**\n             * Call this on all elements and recurse to children\n             * @private\n             * @param {Highcharts.HTMLDOMElement} node\n             *        Element child\n             * @return {void}\n             */\n            function recurse(node) {\n                var styles,\n                    parentStyles,\n                    cssText = '',\n                    dummy,\n                    styleAttr,\n                    blacklisted,\n                    whitelisted,\n                    i;\n                /**\n                 * Check computed styles and whether they are in the white/blacklist for\n                 * styles or atttributes.\n                 * @private\n                 * @param {string} val\n                 *        Style value\n                 * @param {string} prop\n                 *        Style property name\n                 * @return {void}\n                 */\n                function filterStyles(val, prop) {\n                    // Check against whitelist & blacklist\n                    blacklisted = whitelisted = false;\n                    if (whitelist) {\n                        // Styled mode in IE has a whitelist instead.\n                        // Exclude all props not in this list.\n                        i = whitelist.length;\n                        while (i-- && !whitelisted) {\n                            whitelisted = whitelist[i].test(prop);\n                        }\n                        blacklisted = !whitelisted;\n                    }\n                    // Explicitly remove empty transforms\n                    if (prop === 'transform' && val === 'none') {\n                        blacklisted = true;\n                    }\n                    i = blacklist.length;\n                    while (i-- && !blacklisted) {\n                        blacklisted = (blacklist[i].test(prop) ||\n                            typeof val === 'function');\n                    }\n                    if (!blacklisted) {\n                        // If parent node has the same style, it gets inherited, no need\n                        // to inline it. Top-level props should be diffed against parent\n                        // (#7687).\n                        if ((parentStyles[prop] !== val || node.nodeName === 'svg') &&\n                            defaultStyles[node.nodeName][prop] !== val) {\n                            // Attributes\n                            if (!inlineToAttributes ||\n                                inlineToAttributes.indexOf(prop) !== -1) {\n                                if (val) {\n                                    node.setAttribute(hyphenate(prop), val);\n                                }\n                                // Styles\n                            }\n                            else {\n                                cssText += hyphenate(prop) + ':' + val + ';';\n                            }\n                        }\n                    }\n                }\n                if (node.nodeType === 1 &&\n                    unstyledElements.indexOf(node.nodeName) === -1) {\n                    styles = win.getComputedStyle(node, null);\n                    parentStyles = node.nodeName === 'svg' ?\n                        {} :\n                        win.getComputedStyle(node.parentNode, null);\n                    // Get default styles from the browser so that we don't have to add\n                    // these\n                    if (!defaultStyles[node.nodeName]) {\n                        /*\n                        if (!dummySVG) {\n                            dummySVG = doc.createElementNS(H.SVG_NS, 'svg');\n                            dummySVG.setAttribute('version', '1.1');\n                            doc.body.appendChild(dummySVG);\n                        }\n                        */\n                        dummySVG = iframeDoc.getElementsByTagName('svg')[0];\n                        dummy = iframeDoc.createElementNS(node.namespaceURI, node.nodeName);\n                        dummySVG.appendChild(dummy);\n                        // Copy, so we can remove the node\n                        defaultStyles[node.nodeName] = merge(win.getComputedStyle(dummy, null));\n                        // Remove default fill, otherwise text disappears when exported\n                        if (node.nodeName === 'text') {\n                            delete defaultStyles.text.fill;\n                        }\n                        dummySVG.removeChild(dummy);\n                    }\n                    // Loop through all styles and add them inline if they are ok\n                    if (isFirefoxBrowser || isMSBrowser) {\n                        // Some browsers put lots of styles on the prototype\n                        for (var p in styles) { // eslint-disable-line guard-for-in\n                            filterStyles(styles[p], p);\n                        }\n                    }\n                    else {\n                        objectEach(styles, filterStyles);\n                    }\n                    // Apply styles\n                    if (cssText) {\n                        styleAttr = node.getAttribute('style');\n                        node.setAttribute('style', (styleAttr ? styleAttr + ';' : '') + cssText);\n                    }\n                    // Set default stroke width (needed at least for IE)\n                    if (node.nodeName === 'svg') {\n                        node.setAttribute('stroke-width', '1px');\n                    }\n                    if (node.nodeName === 'text') {\n                        return;\n                    }\n                    // Recurse\n                    [].forEach.call(node.children || node.childNodes, recurse);\n                }\n            }\n            /**\n             * Remove the dummy objects used to get defaults\n             * @private\n             * @return {void}\n             */\n            function tearDown() {\n                dummySVG.parentNode.removeChild(dummySVG);\n            }\n            recurse(this.container.querySelector('svg'));\n            tearDown();\n        };\n        symbols.menu = function (x, y, width, height) {\n            var arr = [\n                    ['M',\n                x,\n                y + 2.5],\n                    ['L',\n                x + width,\n                y + 2.5],\n                    ['M',\n                x,\n                y + height / 2 + 0.5],\n                    ['L',\n                x + width,\n                y + height / 2 + 0.5],\n                    ['M',\n                x,\n                y + height - 1.5],\n                    ['L',\n                x + width,\n                y + height - 1.5]\n                ];\n            return arr;\n        };\n        symbols.menuball = function (x, y, width, height) {\n            var path = [],\n                h = (height / 3) - 2;\n            path = path.concat(this.circle(width - h, y, h, h), this.circle(width - h, y + h + 4, h, h), this.circle(width - h, y + 2 * (h + 4), h, h));\n            return path;\n        };\n        /**\n         * Add the buttons on chart load\n         * @private\n         * @function Highcharts.Chart#renderExporting\n         * @return {void}\n         * @requires modules/exporting\n         */\n        Chart.prototype.renderExporting = function () {\n            var chart = this,\n                exportingOptions = chart.options.exporting,\n                buttons = exportingOptions.buttons,\n                isDirty = chart.isDirtyExporting || !chart.exportSVGElements;\n            chart.buttonOffset = 0;\n            if (chart.isDirtyExporting) {\n                chart.destroyExport();\n            }\n            if (isDirty && exportingOptions.enabled !== false) {\n                chart.exportEvents = [];\n                chart.exportingGroup = chart.exportingGroup ||\n                    chart.renderer.g('exporting-group').attr({\n                        zIndex: 3 // #4955, // #8392\n                    }).add();\n                objectEach(buttons, function (button) {\n                    chart.addButton(button);\n                });\n                chart.isDirtyExporting = false;\n            }\n            // Destroy the export elements at chart destroy\n            addEvent(chart, 'destroy', chart.destroyExport);\n        };\n        /* eslint-disable no-invalid-this */\n        // Add update methods to handle chart.update and chart.exporting.update and\n        // chart.navigation.update. These must be added to the chart instance rather\n        // than the Chart prototype in order to use the chart instance inside the update\n        // function.\n        addEvent(Chart, 'init', function () {\n            var chart = this;\n            /**\n             * @private\n             * @param {\"exporting\"|\"navigation\"} prop\n             *        Property name in option root\n             * @param {Highcharts.ExportingOptions|Highcharts.NavigationOptions} options\n             *        Options to update\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw\n             * @return {void}\n             */\n            function update(prop, options, redraw) {\n                chart.isDirtyExporting = true;\n                merge(true, chart.options[prop], options);\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            }\n            chart.exporting = {\n                update: function (options, redraw) {\n                    update('exporting', options, redraw);\n                }\n            };\n            // Register update() method for navigation. Can not be set the same way as\n            // for exporting, because navigation options are shared with bindings which\n            // has separate update() logic.\n            chartNavigationMixin.addUpdate(function (options, redraw) {\n                update('navigation', options, redraw);\n            }, chart);\n        });\n        /* eslint-enable no-invalid-this */\n        Chart.prototype.callbacks.push(function (chart) {\n            chart.renderExporting();\n            addEvent(chart, 'redraw', chart.renderExporting);\n            // Uncomment this to see a button directly below the chart, for quick\n            // testing of export\n            /*\n            var button,\n                viewImage,\n                viewSource;\n            if (!chart.renderer.forExport) {\n                viewImage = function () {\n                    var div = doc.createElement('div');\n                    div.innerHTML = chart.getSVGForExport();\n                    chart.renderTo.parentNode.appendChild(div);\n                };\n\n                viewSource = function () {\n                    var pre = doc.createElement('pre');\n                    pre.innerHTML = chart.getSVGForExport()\n                        .replace(/</g, '\\n&lt;')\n                        .replace(/>/g, '&gt;');\n                    chart.renderTo.parentNode.appendChild(pre);\n                };\n\n                viewImage();\n\n                // View SVG Image\n                button = doc.createElement('button');\n                button.innerHTML = 'View SVG Image';\n                chart.renderTo.parentNode.appendChild(button);\n                button.onclick = viewImage;\n\n                // View SVG Source\n                button = doc.createElement('button');\n                button.innerHTML = 'View SVG Source';\n                chart.renderTo.parentNode.appendChild(button);\n                button.onclick = viewSource;\n            }\n            //*/\n        });\n\n    });\n    _registerModule(_modules, 'masters/modules/exporting.src.js', [], function () {\n\n\n    });\n}));\n\n/***/ }),\n/* 983 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = patternFill;\n/**\r\n * Highcharts pattern fill plugin\r\n *\r\n * Version         2.0.2\r\n * Author:         Torstein Honsi\r\n *                 Stephane Vanraes\r\n * Last revision:  2015-05-04\r\n * License:        MIT License\r\n *\r\n * Remark:         The latest version is not compatible with earlier versions.\r\n *\r\n * Usage:          Add a 'defs' object to the options\r\n *                 Create a 'patterns' array under 'defs'\r\n *                 Each item in this array represents a pattern\r\n *                 To use a pattern, set the color to `url(#id-of-pattern)'\r\n *\r\n * Options for the patterns:\r\n * - id:           The id for the pattern, defaults to highcharts-pattern-# with # an increasing number for each pattern without id\r\n * - width:        The width of the pattern, defaults to 10\r\n * - height:       The height of the pattern, defaults to 10\r\n * - opacity       A general opacity for the pattern\r\n * - path:         In SVG, the path for the pattern\r\n *                 (Note: this can be a string with only a path, or an object with d, stroke, strokeWidth and fill)\r\n * - image:        An image source for the pattern\r\n * - color:        A color to be used instead of a path\r\n *\r\n * Notes:          VML does not support the path setting\r\n *                 If all other fills fail (no path, image or color) the pattern will return #A0A0A0 as a color\r\n *                 Several patterns have been predefined, called highcharts-default-pattern-# (numbered 0-9)\r\n */\n//[dz] wrap this in a function to avoid global Highcharts usage, code is otherwise intact\n/*global document */\nfunction patternFill(Highcharts) {\n    'use strict';\n\n    var idCounter = 0,\n        wrap = Highcharts.wrap;\n    /**\r\n     * Exposed method to add a pattern to the renderer.\r\n     */\n    Highcharts.SVGRenderer.prototype.addPattern = function (id, options) {\n        var pattern,\n            path,\n            w = options.width || 10,\n            h = options.height || 10,\n            ren = this;\n        /**\r\n         * Add a rectangle for solid color\r\n         */\n        function rect(fill) {\n            ren.rect(0, 0, w, h).attr({\n                fill: fill\n            }).add(pattern);\n        }\n        if (!id) {\n            id = 'highcharts-pattern-' + idCounter;\n            idCounter += 1;\n        }\n        pattern = this.createElement('pattern').attr({\n            id: id,\n            patternUnits: 'userSpaceOnUse',\n            width: options.width || 10,\n            height: options.height || 10\n        }).add(this.defs);\n        // Get id\n        pattern.id = pattern.element.id;\n        // Use an SVG path for the pattern\n        if (options.path) {\n            path = options.path;\n            // The background\n            if (path.fill) {\n                rect(path.fill);\n            }\n            // The pattern\n            this.createElement('path').attr({\n                'd': path.d || path,\n                'stroke': path.stroke || options.color || '#343434',\n                'stroke-width': path.strokeWidth || 2\n            }).add(pattern);\n            pattern.color = options.color;\n            // Image pattern\n        } else if (options.image) {\n            this.image(options.image, 0, 0, options.width, options.height).add(pattern);\n            // A solid color\n        } else if (options.color) {\n            rect(options.color);\n        }\n        if (options.opacity !== undefined) {\n            pattern.element.children.forEach(function (child) {\n                child.setAttribute('opacity', options.opacity);\n            });\n        }\n        return pattern;\n    };\n    if (Highcharts.VMLElement) {\n        Highcharts.VMLRenderer.prototype.addPattern = function (id, options) {\n            var patterns;\n            if (!id) {\n                id = 'highcharts-pattern-' + idCounter;\n                idCounter += 1;\n            }\n            patterns = this.patterns || {};\n            patterns[id] = options;\n            this.patterns = patterns;\n        };\n        Highcharts.wrap(Highcharts.VMLRenderer.prototype.Element.prototype, 'fillSetter', function (proceed, color, prop, elem) {\n            if (typeof color === 'string' && color.substring(0, 5) === 'url(#') {\n                var id = color.substring(5, color.length - 1),\n                    pattern = this.renderer.patterns[id],\n                    markup;\n                if (pattern.image) {\n                    // Remove Previous fills\n                    if (elem.getElementsByTagName('fill').length) {\n                        elem.removeChild(elem.getElementsByTagName('fill')[0]);\n                    }\n                    markup = this.renderer.prepVML(['<', prop, ' type=\"tile\" src=\"', pattern.image, '\" />']);\n                    elem.appendChild(document.createElement(markup));\n                    // Work around display bug on updating attached nodes\n                    if (elem.parentNode.nodeType === 1) {\n                        elem.outerHTML = elem.outerHTML;\n                    }\n                } else if (pattern.color) {\n                    proceed.call(this, pattern.color, prop, elem);\n                } else {\n                    proceed.call(this, '#A0A0A0', prop, elem);\n                }\n            } else {\n                proceed.call(this, color, prop, elem);\n            }\n        });\n    }\n    /**\r\n     * Add the predefined patterns\r\n     */\n    function addPredefinedPatterns(renderer) {\n        var colors = Highcharts.getOptions().colors;\n        ['M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11', 'M 0 10 L 10 0 M -1 1 L 1 -1 M 9 11 L 11 9', 'M 3 0 L 3 10 M 8 0 L 8 10', 'M 0 3 L 10 3 M 0 8 L 10 8', 'M 0 3 L 5 3 L 5 0 M 5 10 L 5 7 L 10 7', 'M 3 3 L 8 3 L 8 8 L 3 8 Z', 'M 5 5 m -4 0 a 4 4 0 1 1 8 0 a 4 4 0 1 1 -8 0', 'M 10 3 L 5 3 L 5 0 M 5 10 L 5 7 L 0 7', 'M 2 5 L 5 2 L 8 5 L 5 8 Z', 'M 0 0 L 5 10 L 10 0'].forEach(function (pattern, i) {\n            renderer.addPattern('highcharts-default-pattern-' + i, {\n                path: pattern,\n                color: colors[i]\n            });\n        });\n    }\n    // Add patterns to the defs element\n    wrap(Highcharts.Chart.prototype, 'getContainer', function (proceed) {\n        proceed.apply(this);\n        var chart = this,\n            renderer = chart.renderer,\n            options = chart.options,\n            patterns = options.defs && options.defs.patterns;\n        // First add default patterns\n        addPredefinedPatterns(renderer);\n        // Add user defined patterns\n        if (patterns) {\n            patterns.forEach(function (pattern) {\n                renderer.addPattern(pattern.id, pattern);\n            });\n        }\n    });\n}\n;\n\n/***/ }),\n/* 984 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports['default'] = shallowEqual;\n\nfunction shallowEqual(objA, objB) {\n  if (objA === objB) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n  for (var i = 0; i < keysA.length; i++) {\n    if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 985 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n    componentWillMount: function componentWillMount() {\n        this.documentListeners = [];\n    },\n    onDocument: function onDocument(eventName, callback) {\n        (0, _jquery2.default)(document).on(eventName, callback);\n        this.documentListeners.push([eventName, callback]);\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this.documentListeners.forEach(function (documentListener) {\n            (0, _jquery2.default)(document).off(documentListener[0], documentListener[1]);\n        });\n    }\n};\n\n/***/ }),\n/* 986 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _legend_item = __webpack_require__(987);\n\nvar _legend_item2 = _interopRequireDefault(_legend_item);\n\nvar _legend_sort = __webpack_require__(988);\n\nvar _legend_sort2 = _interopRequireDefault(_legend_sort);\n\nvar _legend_more_button = __webpack_require__(989);\n\nvar _legend_more_button2 = _interopRequireDefault(_legend_more_button);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Legend = function (_React$Component) {\n    _inherits(Legend, _React$Component);\n\n    function Legend() {\n        _classCallCheck(this, Legend);\n\n        return _possibleConstructorReturn(this, (Legend.__proto__ || Object.getPrototypeOf(Legend)).apply(this, arguments));\n    }\n\n    _createClass(Legend, [{\n        key: 'render',\n        value: function render() {\n            var showMoreLine = {};\n            var items = {};\n            var lines = this.props.lines;\n\n            var hasMore = lines ? _lodash2.default.some(lines, { name: 'Show More' }) : false;\n            if (lines && lines.length > 0) {\n                items = lines.map(function (line) {\n                    return _react2.default.createElement(_legend_item2.default, { key: line.id, line: line, color: line.color });\n                }, this);\n                if (hasMore) {\n                    showMoreLine = _lodash2.default.last(items).props.line;\n                    items.pop();\n                }\n            }\n            return _react2.default.createElement(\"div\", { className: \"report__legend-wrapper grid-legend\" }, _react2.default.createElement(_legend_sort2.default, { selection: this.props.legendSortBy, onSelect: this.props.onSortChange }), _react2.default.createElement(\"div\", { className: \"legend__items\" }, lines && lines.length > 0 && items, lines && lines.length > 0 && hasMore && _react2.default.createElement(_legend_more_button2.default, { ref: \"moreButton\", hasMore: hasMore, line: showMoreLine })));\n        }\n    }]);\n\n    return Legend;\n}(_react2.default.Component);\n\nexports.default = Legend;\n\nLegend.propTypes = {\n    lines: _propTypes2.default.array,\n    legendSortBy: _propTypes2.default.string,\n    onSortChange: _propTypes2.default.func\n};\nLegend.defaultProps = {\n    onSortChange: _lodash2.default.noop\n};\n\n/***/ }),\n/* 987 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LegendItem = function (_React$Component) {\n    _inherits(LegendItem, _React$Component);\n\n    function LegendItem() {\n        _classCallCheck(this, LegendItem);\n\n        return _possibleConstructorReturn(this, (LegendItem.__proto__ || Object.getPrototypeOf(LegendItem)).apply(this, arguments));\n    }\n\n    _createClass(LegendItem, [{\n        key: 'render',\n        value: function render() {\n            var line = this.props.line;\n\n            return _react2.default.createElement(\"button\", { id: 'legend_' + line.id, className: \"legend__item\", style: { color: this.props.color }, title: line.name, \"aria-label\": 'Filter visualization by ' + line.name, onClick: line.events.legendItemClick.bind(this, line.name) }, _react2.default.createElement(\"div\", { className: \"legend__item__decorator\", style: { background: this.props.color } }), _react2.default.createElement(\"span\", { className: \"legend__item__text\" }, line.name));\n        }\n    }]);\n\n    return LegendItem;\n}(_react2.default.Component);\n\nexports.default = LegendItem;\n\nLegendItem.propTypes = {\n    line: _propTypes2.default.object.isRequired,\n    color: _propTypes2.default.string\n};\n\n/***/ }),\n/* 988 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SortItemFactories = {\n    alpha: function alpha() {\n        return _react2.default.createElement(\"span\", { className: \"wd-alpha-sort\" }, \"A to Z\");\n    },\n    alpha_rev: function alpha_rev() {\n        return _react2.default.createElement(\"span\", { className: \"wd-alpha_rev-sort\" }, \"Z to A\");\n    },\n    desc: function desc() {\n        return _react2.default.createElement(\"span\", { className: \"wd-desc-sort\" }, \"Large to Small\");\n    },\n    asc: function asc() {\n        return _react2.default.createElement(\"span\", { className: \"wd-asc-sort\" }, \"Small to Large\");\n    }\n};\nvar SortItemOrder = ['alpha', 'alpha_rev', 'desc', 'asc'];\n\nvar LegendSort = function (_React$Component) {\n    _inherits(LegendSort, _React$Component);\n\n    function LegendSort() {\n        _classCallCheck(this, LegendSort);\n\n        return _possibleConstructorReturn(this, (LegendSort.__proto__ || Object.getPrototypeOf(LegendSort)).apply(this, arguments));\n    }\n\n    _createClass(LegendSort, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var selection = this.props.selection;\n\n            var items = SortItemOrder.map(function (sortId) {\n                return _react2.default.createElement(\"li\", { key: sortId }, _react2.default.createElement(\"a\", { className: selection === sortId ? 'active' : '', onClick: _this2.props.onSelect.bind(_this2, sortId) }, SortItemFactories[sortId]()));\n            }, this);\n            var currentSort = SortItemFactories[selection]();\n            return _react2.default.createElement(\"div\", { className: \"legend__sort\" }, _react2.default.createElement(Ovid.Dropdown, { title: currentSort, toggleClass: \"legend__sort__target wd-legend-toggle\", label: \"Sort\" }, _react2.default.createElement(\"header\", { className: \"ui-dropdown__header\" }, _react2.default.createElement(\"h4\", null, \"Sort by\")), _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list wd-legend-options\" }, items)));\n        }\n    }]);\n\n    return LegendSort;\n}(_react2.default.Component);\n\nexports.default = LegendSort;\n\nLegendSort.propTypes = {\n    selection: _propTypes2.default.string,\n    onSelect: _propTypes2.default.func\n};\nLegendSort.defaultProps = {\n    selection: 'desc',\n    onSelect: _lodash2.default.noop\n};\n\n/***/ }),\n/* 989 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LegendMoreButton = function (_React$Component) {\n    _inherits(LegendMoreButton, _React$Component);\n\n    function LegendMoreButton() {\n        _classCallCheck(this, LegendMoreButton);\n\n        return _possibleConstructorReturn(this, (LegendMoreButton.__proto__ || Object.getPrototypeOf(LegendMoreButton)).apply(this, arguments));\n    }\n\n    _createClass(LegendMoreButton, [{\n        key: 'render',\n        value: function render() {\n            var line = this.props.line;\n\n            if (!this.props.hasMore) {\n                return null;\n            }\n            return _react2.default.createElement(\"div\", { className: \"legend__button-wrapper\" }, this.props.hasMore ? _react2.default.createElement(\"button\", { className: \"ui-button small wd-legend-show-more\", onClick: line.events.legendItemClick.bind(this, line.name) }, \"Show More\") : null);\n        }\n    }]);\n\n    return LegendMoreButton;\n}(_react2.default.Component);\n\nexports.default = LegendMoreButton;\n\nLegendMoreButton.propTypes = {\n    hasMore: _propTypes2.default.bool,\n    line: _propTypes2.default.object\n};\n\n/***/ }),\n/* 990 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;\n/**\n * @license\n *\n * chroma.js - JavaScript library for color conversions\n * \n * Copyright (c) 2011-2017, Gregor Aisch\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * \n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n * \n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * \n * 3. The name Gregor Aisch may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n(function() {\n  var Color, DEG2RAD, LAB_CONSTANTS, PI, PITHIRD, RAD2DEG, TWOPI, _average_lrgb, _guess_formats, _guess_formats_sorted, _input, _interpolators, abs, atan2, bezier, blend, blend_f, brewer, burn, chroma, clip_rgb, cmyk2rgb, colors, cos, css2rgb, darken, dodge, each, floor, hcg2rgb, hex2rgb, hsi2rgb, hsl2css, hsl2rgb, hsv2rgb, interpolate, interpolate_hsx, interpolate_lab, interpolate_lrgb, interpolate_num, interpolate_rgb, lab2lch, lab2rgb, lab_xyz, lch2lab, lch2rgb, lighten, limit, log, luminance_x, m, max, multiply, normal, num2rgb, overlay, pow, rgb2cmyk, rgb2css, rgb2hcg, rgb2hex, rgb2hsi, rgb2hsl, rgb2hsv, rgb2lab, rgb2lch, rgb2luminance, rgb2num, rgb2temperature, rgb2xyz, rgb_xyz, rnd, root, round, screen, sin, sqrt, temperature2rgb, type, unpack, w3cx11, xyz_lab, xyz_rgb,\n    slice = [].slice;\n\n  type = (function() {\n\n    /*\n    for browser-safe type checking+\n    ported from jQuery's $.type\n     */\n    var classToType, len, name, o, ref;\n    classToType = {};\n    ref = \"Boolean Number String Function Array Date RegExp Undefined Null\".split(\" \");\n    for (o = 0, len = ref.length; o < len; o++) {\n      name = ref[o];\n      classToType[\"[object \" + name + \"]\"] = name.toLowerCase();\n    }\n    return function(obj) {\n      var strType;\n      strType = Object.prototype.toString.call(obj);\n      return classToType[strType] || \"object\";\n    };\n  })();\n\n  limit = function(x, min, max) {\n    if (min == null) {\n      min = 0;\n    }\n    if (max == null) {\n      max = 1;\n    }\n    if (x < min) {\n      x = min;\n    }\n    if (x > max) {\n      x = max;\n    }\n    return x;\n  };\n\n  unpack = function(args) {\n    if (args.length >= 3) {\n      return Array.prototype.slice.call(args);\n    } else {\n      return args[0];\n    }\n  };\n\n  clip_rgb = function(rgb) {\n    var i, o;\n    rgb._clipped = false;\n    rgb._unclipped = rgb.slice(0);\n    for (i = o = 0; o < 3; i = ++o) {\n      if (i < 3) {\n        if (rgb[i] < 0 || rgb[i] > 255) {\n          rgb._clipped = true;\n        }\n        if (rgb[i] < 0) {\n          rgb[i] = 0;\n        }\n        if (rgb[i] > 255) {\n          rgb[i] = 255;\n        }\n      } else if (i === 3) {\n        if (rgb[i] < 0) {\n          rgb[i] = 0;\n        }\n        if (rgb[i] > 1) {\n          rgb[i] = 1;\n        }\n      }\n    }\n    if (!rgb._clipped) {\n      delete rgb._unclipped;\n    }\n    return rgb;\n  };\n\n  PI = Math.PI, round = Math.round, cos = Math.cos, floor = Math.floor, pow = Math.pow, log = Math.log, sin = Math.sin, sqrt = Math.sqrt, atan2 = Math.atan2, max = Math.max, abs = Math.abs;\n\n  TWOPI = PI * 2;\n\n  PITHIRD = PI / 3;\n\n  DEG2RAD = PI / 180;\n\n  RAD2DEG = 180 / PI;\n\n  chroma = function() {\n    if (arguments[0] instanceof Color) {\n      return arguments[0];\n    }\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, arguments, function(){});\n  };\n\n  chroma[\"default\"] = chroma;\n\n  _interpolators = [];\n\n  if ((typeof module !== \"undefined\" && module !== null) && (module.exports != null)) {\n    module.exports = chroma;\n  }\n\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return chroma;\n    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {\n    root = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n    root.chroma = chroma;\n  }\n\n  chroma.version = '1.4.1';\n\n  _input = {};\n\n  _guess_formats = [];\n\n  _guess_formats_sorted = false;\n\n  Color = (function() {\n    function Color() {\n      var arg, args, chk, len, len1, me, mode, o, w;\n      me = this;\n      args = [];\n      for (o = 0, len = arguments.length; o < len; o++) {\n        arg = arguments[o];\n        if (arg != null) {\n          args.push(arg);\n        }\n      }\n      if (args.length > 1) {\n        mode = args[args.length - 1];\n      }\n      if (_input[mode] != null) {\n        me._rgb = clip_rgb(_input[mode](unpack(args.slice(0, -1))));\n      } else {\n        if (!_guess_formats_sorted) {\n          _guess_formats = _guess_formats.sort(function(a, b) {\n            return b.p - a.p;\n          });\n          _guess_formats_sorted = true;\n        }\n        for (w = 0, len1 = _guess_formats.length; w < len1; w++) {\n          chk = _guess_formats[w];\n          mode = chk.test.apply(chk, args);\n          if (mode) {\n            break;\n          }\n        }\n        if (mode) {\n          me._rgb = clip_rgb(_input[mode].apply(_input, args));\n        }\n      }\n      if (me._rgb == null) {\n        console.warn('unknown format: ' + args);\n      }\n      if (me._rgb == null) {\n        me._rgb = [0, 0, 0];\n      }\n      if (me._rgb.length === 3) {\n        me._rgb.push(1);\n      }\n    }\n\n    Color.prototype.toString = function() {\n      return this.hex();\n    };\n\n    return Color;\n\n  })();\n\n  chroma._input = _input;\n\n\n  /**\n  \tColorBrewer colors for chroma.js\n  \n  \tCopyright (c) 2002 Cynthia Brewer, Mark Harrower, and The \n  \tPennsylvania State University.\n  \n  \tLicensed under the Apache License, Version 2.0 (the \"License\"); \n  \tyou may not use this file except in compliance with the License.\n  \tYou may obtain a copy of the License at\t\n  \thttp://www.apache.org/licenses/LICENSE-2.0\n  \n  \tUnless required by applicable law or agreed to in writing, software distributed\n  \tunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n  \tCONDITIONS OF ANY KIND, either express or implied. See the License for the\n  \tspecific language governing permissions and limitations under the License.\n  \n      @preserve\n   */\n\n  chroma.brewer = brewer = {\n    OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n    PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n    BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n    Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n    BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n    YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n    YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n    Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n    RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n    Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n    YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n    Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n    GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n    Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n    YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n    PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n    Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n    PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n    Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n    Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n    RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n    RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n    PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n    PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n    RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n    BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n    RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n    PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n    Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n    Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n    Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n    Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n    Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n    Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n    Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n    Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n  };\n\n  (function() {\n    var key, results;\n    results = [];\n    for (key in brewer) {\n      results.push(brewer[key.toLowerCase()] = brewer[key]);\n    }\n    return results;\n  })();\n\n\n  /**\n  \tX11 color names\n  \n  \thttp://www.w3.org/TR/css3-color/#svg-color\n   */\n\n  w3cx11 = {\n    aliceblue: '#f0f8ff',\n    antiquewhite: '#faebd7',\n    aqua: '#00ffff',\n    aquamarine: '#7fffd4',\n    azure: '#f0ffff',\n    beige: '#f5f5dc',\n    bisque: '#ffe4c4',\n    black: '#000000',\n    blanchedalmond: '#ffebcd',\n    blue: '#0000ff',\n    blueviolet: '#8a2be2',\n    brown: '#a52a2a',\n    burlywood: '#deb887',\n    cadetblue: '#5f9ea0',\n    chartreuse: '#7fff00',\n    chocolate: '#d2691e',\n    coral: '#ff7f50',\n    cornflower: '#6495ed',\n    cornflowerblue: '#6495ed',\n    cornsilk: '#fff8dc',\n    crimson: '#dc143c',\n    cyan: '#00ffff',\n    darkblue: '#00008b',\n    darkcyan: '#008b8b',\n    darkgoldenrod: '#b8860b',\n    darkgray: '#a9a9a9',\n    darkgreen: '#006400',\n    darkgrey: '#a9a9a9',\n    darkkhaki: '#bdb76b',\n    darkmagenta: '#8b008b',\n    darkolivegreen: '#556b2f',\n    darkorange: '#ff8c00',\n    darkorchid: '#9932cc',\n    darkred: '#8b0000',\n    darksalmon: '#e9967a',\n    darkseagreen: '#8fbc8f',\n    darkslateblue: '#483d8b',\n    darkslategray: '#2f4f4f',\n    darkslategrey: '#2f4f4f',\n    darkturquoise: '#00ced1',\n    darkviolet: '#9400d3',\n    deeppink: '#ff1493',\n    deepskyblue: '#00bfff',\n    dimgray: '#696969',\n    dimgrey: '#696969',\n    dodgerblue: '#1e90ff',\n    firebrick: '#b22222',\n    floralwhite: '#fffaf0',\n    forestgreen: '#228b22',\n    fuchsia: '#ff00ff',\n    gainsboro: '#dcdcdc',\n    ghostwhite: '#f8f8ff',\n    gold: '#ffd700',\n    goldenrod: '#daa520',\n    gray: '#808080',\n    green: '#008000',\n    greenyellow: '#adff2f',\n    grey: '#808080',\n    honeydew: '#f0fff0',\n    hotpink: '#ff69b4',\n    indianred: '#cd5c5c',\n    indigo: '#4b0082',\n    ivory: '#fffff0',\n    khaki: '#f0e68c',\n    laserlemon: '#ffff54',\n    lavender: '#e6e6fa',\n    lavenderblush: '#fff0f5',\n    lawngreen: '#7cfc00',\n    lemonchiffon: '#fffacd',\n    lightblue: '#add8e6',\n    lightcoral: '#f08080',\n    lightcyan: '#e0ffff',\n    lightgoldenrod: '#fafad2',\n    lightgoldenrodyellow: '#fafad2',\n    lightgray: '#d3d3d3',\n    lightgreen: '#90ee90',\n    lightgrey: '#d3d3d3',\n    lightpink: '#ffb6c1',\n    lightsalmon: '#ffa07a',\n    lightseagreen: '#20b2aa',\n    lightskyblue: '#87cefa',\n    lightslategray: '#778899',\n    lightslategrey: '#778899',\n    lightsteelblue: '#b0c4de',\n    lightyellow: '#ffffe0',\n    lime: '#00ff00',\n    limegreen: '#32cd32',\n    linen: '#faf0e6',\n    magenta: '#ff00ff',\n    maroon: '#800000',\n    maroon2: '#7f0000',\n    maroon3: '#b03060',\n    mediumaquamarine: '#66cdaa',\n    mediumblue: '#0000cd',\n    mediumorchid: '#ba55d3',\n    mediumpurple: '#9370db',\n    mediumseagreen: '#3cb371',\n    mediumslateblue: '#7b68ee',\n    mediumspringgreen: '#00fa9a',\n    mediumturquoise: '#48d1cc',\n    mediumvioletred: '#c71585',\n    midnightblue: '#191970',\n    mintcream: '#f5fffa',\n    mistyrose: '#ffe4e1',\n    moccasin: '#ffe4b5',\n    navajowhite: '#ffdead',\n    navy: '#000080',\n    oldlace: '#fdf5e6',\n    olive: '#808000',\n    olivedrab: '#6b8e23',\n    orange: '#ffa500',\n    orangered: '#ff4500',\n    orchid: '#da70d6',\n    palegoldenrod: '#eee8aa',\n    palegreen: '#98fb98',\n    paleturquoise: '#afeeee',\n    palevioletred: '#db7093',\n    papayawhip: '#ffefd5',\n    peachpuff: '#ffdab9',\n    peru: '#cd853f',\n    pink: '#ffc0cb',\n    plum: '#dda0dd',\n    powderblue: '#b0e0e6',\n    purple: '#800080',\n    purple2: '#7f007f',\n    purple3: '#a020f0',\n    rebeccapurple: '#663399',\n    red: '#ff0000',\n    rosybrown: '#bc8f8f',\n    royalblue: '#4169e1',\n    saddlebrown: '#8b4513',\n    salmon: '#fa8072',\n    sandybrown: '#f4a460',\n    seagreen: '#2e8b57',\n    seashell: '#fff5ee',\n    sienna: '#a0522d',\n    silver: '#c0c0c0',\n    skyblue: '#87ceeb',\n    slateblue: '#6a5acd',\n    slategray: '#708090',\n    slategrey: '#708090',\n    snow: '#fffafa',\n    springgreen: '#00ff7f',\n    steelblue: '#4682b4',\n    tan: '#d2b48c',\n    teal: '#008080',\n    thistle: '#d8bfd8',\n    tomato: '#ff6347',\n    turquoise: '#40e0d0',\n    violet: '#ee82ee',\n    wheat: '#f5deb3',\n    white: '#ffffff',\n    whitesmoke: '#f5f5f5',\n    yellow: '#ffff00',\n    yellowgreen: '#9acd32'\n  };\n\n  chroma.colors = colors = w3cx11;\n\n  lab2rgb = function() {\n    var a, args, b, g, l, r, x, y, z;\n    args = unpack(arguments);\n    l = args[0], a = args[1], b = args[2];\n    y = (l + 16) / 116;\n    x = isNaN(a) ? y : y + a / 500;\n    z = isNaN(b) ? y : y - b / 200;\n    y = LAB_CONSTANTS.Yn * lab_xyz(y);\n    x = LAB_CONSTANTS.Xn * lab_xyz(x);\n    z = LAB_CONSTANTS.Zn * lab_xyz(z);\n    r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z);\n    g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n    b = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  xyz_rgb = function(r) {\n    return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055);\n  };\n\n  lab_xyz = function(t) {\n    if (t > LAB_CONSTANTS.t1) {\n      return t * t * t;\n    } else {\n      return LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0);\n    }\n  };\n\n  LAB_CONSTANTS = {\n    Kn: 18,\n    Xn: 0.950470,\n    Yn: 1,\n    Zn: 1.088830,\n    t0: 0.137931034,\n    t1: 0.206896552,\n    t2: 0.12841855,\n    t3: 0.008856452\n  };\n\n  rgb2lab = function() {\n    var b, g, r, ref, ref1, x, y, z;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    ref1 = rgb2xyz(r, g, b), x = ref1[0], y = ref1[1], z = ref1[2];\n    return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n  };\n\n  rgb_xyz = function(r) {\n    if ((r /= 255) <= 0.04045) {\n      return r / 12.92;\n    } else {\n      return pow((r + 0.055) / 1.055, 2.4);\n    }\n  };\n\n  xyz_lab = function(t) {\n    if (t > LAB_CONSTANTS.t3) {\n      return pow(t, 1 / 3);\n    } else {\n      return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0;\n    }\n  };\n\n  rgb2xyz = function() {\n    var b, g, r, ref, x, y, z;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = rgb_xyz(r);\n    g = rgb_xyz(g);\n    b = rgb_xyz(b);\n    x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn);\n    y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / LAB_CONSTANTS.Yn);\n    z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn);\n    return [x, y, z];\n  };\n\n  chroma.lab = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['lab']), function(){});\n  };\n\n  _input.lab = lab2rgb;\n\n  Color.prototype.lab = function() {\n    return rgb2lab(this._rgb);\n  };\n\n  bezier = function(colors) {\n    var I, I0, I1, c, lab0, lab1, lab2, lab3, ref, ref1, ref2;\n    colors = (function() {\n      var len, o, results;\n      results = [];\n      for (o = 0, len = colors.length; o < len; o++) {\n        c = colors[o];\n        results.push(chroma(c));\n      }\n      return results;\n    })();\n    if (colors.length === 2) {\n      ref = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref[0], lab1 = ref[1];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push(lab0[i] + t * (lab1[i] - lab0[i]));\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 3) {\n      ref1 = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref1[0], lab1 = ref1[1], lab2 = ref1[2];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push((1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i]);\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 4) {\n      ref2 = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref2[0], lab1 = ref2[1], lab2 = ref2[2], lab3 = ref2[3];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push((1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i]);\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 5) {\n      I0 = bezier(colors.slice(0, 3));\n      I1 = bezier(colors.slice(2, 5));\n      I = function(t) {\n        if (t < 0.5) {\n          return I0(t * 2);\n        } else {\n          return I1((t - 0.5) * 2);\n        }\n      };\n    }\n    return I;\n  };\n\n  chroma.bezier = function(colors) {\n    var f;\n    f = bezier(colors);\n    f.scale = function() {\n      return chroma.scale(f);\n    };\n    return f;\n  };\n\n  chroma.cubehelix = function(start, rotations, hue, gamma, lightness) {\n    var dh, dl, f;\n    if (start == null) {\n      start = 300;\n    }\n    if (rotations == null) {\n      rotations = -1.5;\n    }\n    if (hue == null) {\n      hue = 1;\n    }\n    if (gamma == null) {\n      gamma = 1;\n    }\n    if (lightness == null) {\n      lightness = [0, 1];\n    }\n    dh = 0;\n    if (type(lightness) === 'array') {\n      dl = lightness[1] - lightness[0];\n    } else {\n      dl = 0;\n      lightness = [lightness, lightness];\n    }\n    f = function(fract) {\n      var a, amp, b, cos_a, g, h, l, r, sin_a;\n      a = TWOPI * ((start + 120) / 360 + rotations * fract);\n      l = pow(lightness[0] + dl * fract, gamma);\n      h = dh !== 0 ? hue[0] + fract * dh : hue;\n      amp = h * l * (1 - l) / 2;\n      cos_a = cos(a);\n      sin_a = sin(a);\n      r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n      g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n      b = l + amp * (+1.97294 * cos_a);\n      return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n    };\n    f.start = function(s) {\n      if (s == null) {\n        return start;\n      }\n      start = s;\n      return f;\n    };\n    f.rotations = function(r) {\n      if (r == null) {\n        return rotations;\n      }\n      rotations = r;\n      return f;\n    };\n    f.gamma = function(g) {\n      if (g == null) {\n        return gamma;\n      }\n      gamma = g;\n      return f;\n    };\n    f.hue = function(h) {\n      if (h == null) {\n        return hue;\n      }\n      hue = h;\n      if (type(hue) === 'array') {\n        dh = hue[1] - hue[0];\n        if (dh === 0) {\n          hue = hue[1];\n        }\n      } else {\n        dh = 0;\n      }\n      return f;\n    };\n    f.lightness = function(h) {\n      if (h == null) {\n        return lightness;\n      }\n      if (type(h) === 'array') {\n        lightness = h;\n        dl = h[1] - h[0];\n      } else {\n        lightness = [h, h];\n        dl = 0;\n      }\n      return f;\n    };\n    f.scale = function() {\n      return chroma.scale(f);\n    };\n    f.hue(hue);\n    return f;\n  };\n\n  chroma.random = function() {\n    var code, digits, i, o;\n    digits = '0123456789abcdef';\n    code = '#';\n    for (i = o = 0; o < 6; i = ++o) {\n      code += digits.charAt(floor(Math.random() * 16));\n    }\n    return new Color(code);\n  };\n\n  _interpolators = [];\n\n  interpolate = function(col1, col2, f, m) {\n    var interpol, len, o, res;\n    if (f == null) {\n      f = 0.5;\n    }\n    if (m == null) {\n      m = 'rgb';\n    }\n\n    /*\n    interpolates between colors\n    f = 0 --> me\n    f = 1 --> col\n     */\n    if (type(col1) !== 'object') {\n      col1 = chroma(col1);\n    }\n    if (type(col2) !== 'object') {\n      col2 = chroma(col2);\n    }\n    for (o = 0, len = _interpolators.length; o < len; o++) {\n      interpol = _interpolators[o];\n      if (m === interpol[0]) {\n        res = interpol[1](col1, col2, f, m);\n        break;\n      }\n    }\n    if (res == null) {\n      throw \"color mode \" + m + \" is not supported\";\n    }\n    return res.alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n  };\n\n  chroma.interpolate = interpolate;\n\n  Color.prototype.interpolate = function(col2, f, m) {\n    return interpolate(this, col2, f, m);\n  };\n\n  chroma.mix = interpolate;\n\n  Color.prototype.mix = Color.prototype.interpolate;\n\n  _input.rgb = function() {\n    var k, ref, results, v;\n    ref = unpack(arguments);\n    results = [];\n    for (k in ref) {\n      v = ref[k];\n      results.push(v);\n    }\n    return results;\n  };\n\n  chroma.rgb = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['rgb']), function(){});\n  };\n\n  Color.prototype.rgb = function(round) {\n    if (round == null) {\n      round = true;\n    }\n    if (round) {\n      return this._rgb.map(Math.round).slice(0, 3);\n    } else {\n      return this._rgb.slice(0, 3);\n    }\n  };\n\n  Color.prototype.rgba = function(round) {\n    if (round == null) {\n      round = true;\n    }\n    if (!round) {\n      return this._rgb.slice(0);\n    }\n    return [Math.round(this._rgb[0]), Math.round(this._rgb[1]), Math.round(this._rgb[2]), this._rgb[3]];\n  };\n\n  _guess_formats.push({\n    p: 3,\n    test: function(n) {\n      var a;\n      a = unpack(arguments);\n      if (type(a) === 'array' && a.length === 3) {\n        return 'rgb';\n      }\n      if (a.length === 4 && type(a[3]) === \"number\" && a[3] >= 0 && a[3] <= 1) {\n        return 'rgb';\n      }\n    }\n  });\n\n  _input.lrgb = _input.rgb;\n\n  interpolate_lrgb = function(col1, col2, f, m) {\n    var xyz0, xyz1;\n    xyz0 = col1._rgb;\n    xyz1 = col2._rgb;\n    return new Color(sqrt(pow(xyz0[0], 2) * (1 - f) + pow(xyz1[0], 2) * f), sqrt(pow(xyz0[1], 2) * (1 - f) + pow(xyz1[1], 2) * f), sqrt(pow(xyz0[2], 2) * (1 - f) + pow(xyz1[2], 2) * f), m);\n  };\n\n  _average_lrgb = function(colors) {\n    var col, f, len, o, rgb, xyz;\n    f = 1 / colors.length;\n    xyz = [0, 0, 0, 0];\n    for (o = 0, len = colors.length; o < len; o++) {\n      col = colors[o];\n      rgb = col._rgb;\n      xyz[0] += pow(rgb[0], 2) * f;\n      xyz[1] += pow(rgb[1], 2) * f;\n      xyz[2] += pow(rgb[2], 2) * f;\n      xyz[3] += rgb[3] * f;\n    }\n    xyz[0] = sqrt(xyz[0]);\n    xyz[1] = sqrt(xyz[1]);\n    xyz[2] = sqrt(xyz[2]);\n    if (xyz[3] > 1) {\n      xyz[3] = 1;\n    }\n    return new Color(clip_rgb(xyz));\n  };\n\n  _interpolators.push(['lrgb', interpolate_lrgb]);\n\n  chroma.average = function(colors, mode) {\n    var A, alpha, c, cnt, dx, dy, first, i, l, len, o, xyz, xyz2;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    l = colors.length;\n    colors = colors.map(function(c) {\n      return chroma(c);\n    });\n    first = colors.splice(0, 1)[0];\n    if (mode === 'lrgb') {\n      return _average_lrgb(colors);\n    }\n    xyz = first.get(mode);\n    cnt = [];\n    dx = 0;\n    dy = 0;\n    for (i in xyz) {\n      xyz[i] = xyz[i] || 0;\n      cnt.push(isNaN(xyz[i]) ? 0 : 1);\n      if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n        A = xyz[i] / 180 * PI;\n        dx += cos(A);\n        dy += sin(A);\n      }\n    }\n    alpha = first.alpha();\n    for (o = 0, len = colors.length; o < len; o++) {\n      c = colors[o];\n      xyz2 = c.get(mode);\n      alpha += c.alpha();\n      for (i in xyz) {\n        if (!isNaN(xyz2[i])) {\n          cnt[i] += 1;\n          if (mode.charAt(i) === 'h') {\n            A = xyz2[i] / 180 * PI;\n            dx += cos(A);\n            dy += sin(A);\n          } else {\n            xyz[i] += xyz2[i];\n          }\n        }\n      }\n    }\n    for (i in xyz) {\n      if (mode.charAt(i) === 'h') {\n        A = atan2(dy / cnt[i], dx / cnt[i]) / PI * 180;\n        while (A < 0) {\n          A += 360;\n        }\n        while (A >= 360) {\n          A -= 360;\n        }\n        xyz[i] = A;\n      } else {\n        xyz[i] = xyz[i] / cnt[i];\n      }\n    }\n    return chroma(xyz, mode).alpha(alpha / l);\n  };\n\n  hex2rgb = function(hex) {\n    var a, b, g, r, rgb, u;\n    if (hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)) {\n      if (hex.length === 4 || hex.length === 7) {\n        hex = hex.substr(1);\n      }\n      if (hex.length === 3) {\n        hex = hex.split(\"\");\n        hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n      }\n      u = parseInt(hex, 16);\n      r = u >> 16;\n      g = u >> 8 & 0xFF;\n      b = u & 0xFF;\n      return [r, g, b, 1];\n    }\n    if (hex.match(/^#?([A-Fa-f0-9]{8})$/)) {\n      if (hex.length === 9) {\n        hex = hex.substr(1);\n      }\n      u = parseInt(hex, 16);\n      r = u >> 24 & 0xFF;\n      g = u >> 16 & 0xFF;\n      b = u >> 8 & 0xFF;\n      a = round((u & 0xFF) / 0xFF * 100) / 100;\n      return [r, g, b, a];\n    }\n    if ((_input.css != null) && (rgb = _input.css(hex))) {\n      return rgb;\n    }\n    throw \"unknown color: \" + hex;\n  };\n\n  rgb2hex = function(channels, mode) {\n    var a, b, g, hxa, r, str, u;\n    if (mode == null) {\n      mode = 'auto';\n    }\n    r = channels[0], g = channels[1], b = channels[2], a = channels[3];\n    if (mode === 'auto') {\n      mode = a < 1 ? 'rgba' : 'rgb';\n    }\n    r = Math.round(r);\n    g = Math.round(g);\n    b = Math.round(b);\n    u = r << 16 | g << 8 | b;\n    str = \"000000\" + u.toString(16);\n    str = str.substr(str.length - 6);\n    hxa = '0' + round(a * 255).toString(16);\n    hxa = hxa.substr(hxa.length - 2);\n    return \"#\" + (function() {\n      switch (mode.toLowerCase()) {\n        case 'rgba':\n          return str + hxa;\n        case 'argb':\n          return hxa + str;\n        default:\n          return str;\n      }\n    })();\n  };\n\n  _input.hex = function(h) {\n    return hex2rgb(h);\n  };\n\n  chroma.hex = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hex']), function(){});\n  };\n\n  Color.prototype.hex = function(mode) {\n    if (mode == null) {\n      mode = 'auto';\n    }\n    return rgb2hex(this._rgb, mode);\n  };\n\n  _guess_formats.push({\n    p: 4,\n    test: function(n) {\n      if (arguments.length === 1 && type(n) === \"string\") {\n        return 'hex';\n      }\n    }\n  });\n\n  hsl2rgb = function() {\n    var args, b, c, g, h, i, l, o, r, ref, s, t1, t2, t3;\n    args = unpack(arguments);\n    h = args[0], s = args[1], l = args[2];\n    if (s === 0) {\n      r = g = b = l * 255;\n    } else {\n      t3 = [0, 0, 0];\n      c = [0, 0, 0];\n      t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n      t1 = 2 * l - t2;\n      h /= 360;\n      t3[0] = h + 1 / 3;\n      t3[1] = h;\n      t3[2] = h - 1 / 3;\n      for (i = o = 0; o <= 2; i = ++o) {\n        if (t3[i] < 0) {\n          t3[i] += 1;\n        }\n        if (t3[i] > 1) {\n          t3[i] -= 1;\n        }\n        if (6 * t3[i] < 1) {\n          c[i] = t1 + (t2 - t1) * 6 * t3[i];\n        } else if (2 * t3[i] < 1) {\n          c[i] = t2;\n        } else if (3 * t3[i] < 2) {\n          c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6;\n        } else {\n          c[i] = t1;\n        }\n      }\n      ref = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)], r = ref[0], g = ref[1], b = ref[2];\n    }\n    if (args.length > 3) {\n      return [r, g, b, args[3]];\n    } else {\n      return [r, g, b];\n    }\n  };\n\n  rgb2hsl = function(r, g, b) {\n    var h, l, min, ref, s;\n    if (r !== void 0 && r.length >= 3) {\n      ref = r, r = ref[0], g = ref[1], b = ref[2];\n    }\n    r /= 255;\n    g /= 255;\n    b /= 255;\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    l = (max + min) / 2;\n    if (max === min) {\n      s = 0;\n      h = Number.NaN;\n    } else {\n      s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n    }\n    if (r === max) {\n      h = (g - b) / (max - min);\n    } else if (g === max) {\n      h = 2 + (b - r) / (max - min);\n    } else if (b === max) {\n      h = 4 + (r - g) / (max - min);\n    }\n    h *= 60;\n    if (h < 0) {\n      h += 360;\n    }\n    return [h, s, l];\n  };\n\n  chroma.hsl = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsl']), function(){});\n  };\n\n  _input.hsl = hsl2rgb;\n\n  Color.prototype.hsl = function() {\n    return rgb2hsl(this._rgb);\n  };\n\n  hsv2rgb = function() {\n    var args, b, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, s, t, v;\n    args = unpack(arguments);\n    h = args[0], s = args[1], v = args[2];\n    v *= 255;\n    if (s === 0) {\n      r = g = b = v;\n    } else {\n      if (h === 360) {\n        h = 0;\n      }\n      if (h > 360) {\n        h -= 360;\n      }\n      if (h < 0) {\n        h += 360;\n      }\n      h /= 60;\n      i = floor(h);\n      f = h - i;\n      p = v * (1 - s);\n      q = v * (1 - s * f);\n      t = v * (1 - s * (1 - f));\n      switch (i) {\n        case 0:\n          ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2];\n          break;\n        case 1:\n          ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2];\n          break;\n        case 2:\n          ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2];\n          break;\n        case 3:\n          ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2];\n          break;\n        case 4:\n          ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2];\n          break;\n        case 5:\n          ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2];\n      }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hsv = function() {\n    var b, delta, g, h, min, r, ref, s, v;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    delta = max - min;\n    v = max / 255.0;\n    if (max === 0) {\n      h = Number.NaN;\n      s = 0;\n    } else {\n      s = delta / max;\n      if (r === max) {\n        h = (g - b) / delta;\n      }\n      if (g === max) {\n        h = 2 + (b - r) / delta;\n      }\n      if (b === max) {\n        h = 4 + (r - g) / delta;\n      }\n      h *= 60;\n      if (h < 0) {\n        h += 360;\n      }\n    }\n    return [h, s, v];\n  };\n\n  chroma.hsv = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsv']), function(){});\n  };\n\n  _input.hsv = hsv2rgb;\n\n  Color.prototype.hsv = function() {\n    return rgb2hsv(this._rgb);\n  };\n\n  num2rgb = function(num) {\n    var b, g, r;\n    if (type(num) === \"number\" && num >= 0 && num <= 0xFFFFFF) {\n      r = num >> 16;\n      g = (num >> 8) & 0xFF;\n      b = num & 0xFF;\n      return [r, g, b, 1];\n    }\n    console.warn(\"unknown num color: \" + num);\n    return [0, 0, 0, 1];\n  };\n\n  rgb2num = function() {\n    var b, g, r, ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    return (r << 16) + (g << 8) + b;\n  };\n\n  chroma.num = function(num) {\n    return new Color(num, 'num');\n  };\n\n  Color.prototype.num = function(mode) {\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    return rgb2num(this._rgb, mode);\n  };\n\n  _input.num = num2rgb;\n\n  _guess_formats.push({\n    p: 1,\n    test: function(n) {\n      if (arguments.length === 1 && type(n) === \"number\" && n >= 0 && n <= 0xFFFFFF) {\n        return 'num';\n      }\n    }\n  });\n\n  hcg2rgb = function() {\n    var _c, _g, args, b, c, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, t, v;\n    args = unpack(arguments);\n    h = args[0], c = args[1], _g = args[2];\n    c = c / 100;\n    g = g / 100 * 255;\n    _c = c * 255;\n    if (c === 0) {\n      r = g = b = _g;\n    } else {\n      if (h === 360) {\n        h = 0;\n      }\n      if (h > 360) {\n        h -= 360;\n      }\n      if (h < 0) {\n        h += 360;\n      }\n      h /= 60;\n      i = floor(h);\n      f = h - i;\n      p = _g * (1 - c);\n      q = p + _c * (1 - f);\n      t = p + _c * f;\n      v = p + _c;\n      switch (i) {\n        case 0:\n          ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2];\n          break;\n        case 1:\n          ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2];\n          break;\n        case 2:\n          ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2];\n          break;\n        case 3:\n          ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2];\n          break;\n        case 4:\n          ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2];\n          break;\n        case 5:\n          ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2];\n      }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hcg = function() {\n    var _g, b, c, delta, g, h, min, r, ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    delta = max - min;\n    c = delta * 100 / 255;\n    _g = min / (255 - delta) * 100;\n    if (delta === 0) {\n      h = Number.NaN;\n    } else {\n      if (r === max) {\n        h = (g - b) / delta;\n      }\n      if (g === max) {\n        h = 2 + (b - r) / delta;\n      }\n      if (b === max) {\n        h = 4 + (r - g) / delta;\n      }\n      h *= 60;\n      if (h < 0) {\n        h += 360;\n      }\n    }\n    return [h, c, _g];\n  };\n\n  chroma.hcg = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hcg']), function(){});\n  };\n\n  _input.hcg = hcg2rgb;\n\n  Color.prototype.hcg = function() {\n    return rgb2hcg(this._rgb);\n  };\n\n  css2rgb = function(css) {\n    var aa, ab, hsl, i, m, o, rgb, w;\n    css = css.toLowerCase();\n    if ((chroma.colors != null) && chroma.colors[css]) {\n      return hex2rgb(chroma.colors[css]);\n    }\n    if (m = css.match(/rgb\\(\\s*(\\-?\\d+),\\s*(\\-?\\d+)\\s*,\\s*(\\-?\\d+)\\s*\\)/)) {\n      rgb = m.slice(1, 4);\n      for (i = o = 0; o <= 2; i = ++o) {\n        rgb[i] = +rgb[i];\n      }\n      rgb[3] = 1;\n    } else if (m = css.match(/rgba\\(\\s*(\\-?\\d+),\\s*(\\-?\\d+)\\s*,\\s*(\\-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      rgb = m.slice(1, 5);\n      for (i = w = 0; w <= 3; i = ++w) {\n        rgb[i] = +rgb[i];\n      }\n    } else if (m = css.match(/rgb\\(\\s*(\\-?\\d+(?:\\.\\d+)?)%,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*\\)/)) {\n      rgb = m.slice(1, 4);\n      for (i = aa = 0; aa <= 2; i = ++aa) {\n        rgb[i] = round(rgb[i] * 2.55);\n      }\n      rgb[3] = 1;\n    } else if (m = css.match(/rgba\\(\\s*(\\-?\\d+(?:\\.\\d+)?)%,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      rgb = m.slice(1, 5);\n      for (i = ab = 0; ab <= 2; i = ++ab) {\n        rgb[i] = round(rgb[i] * 2.55);\n      }\n      rgb[3] = +rgb[3];\n    } else if (m = css.match(/hsl\\(\\s*(\\-?\\d+(?:\\.\\d+)?),\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*\\)/)) {\n      hsl = m.slice(1, 4);\n      hsl[1] *= 0.01;\n      hsl[2] *= 0.01;\n      rgb = hsl2rgb(hsl);\n      rgb[3] = 1;\n    } else if (m = css.match(/hsla\\(\\s*(\\-?\\d+(?:\\.\\d+)?),\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      hsl = m.slice(1, 4);\n      hsl[1] *= 0.01;\n      hsl[2] *= 0.01;\n      rgb = hsl2rgb(hsl);\n      rgb[3] = +m[4];\n    }\n    return rgb;\n  };\n\n  rgb2css = function(rgba) {\n    var mode;\n    mode = rgba[3] < 1 ? 'rgba' : 'rgb';\n    if (mode === 'rgb') {\n      return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ')';\n    } else if (mode === 'rgba') {\n      return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ',' + rgba[3] + ')';\n    } else {\n\n    }\n  };\n\n  rnd = function(a) {\n    return round(a * 100) / 100;\n  };\n\n  hsl2css = function(hsl, alpha) {\n    var mode;\n    mode = alpha < 1 ? 'hsla' : 'hsl';\n    hsl[0] = rnd(hsl[0] || 0);\n    hsl[1] = rnd(hsl[1] * 100) + '%';\n    hsl[2] = rnd(hsl[2] * 100) + '%';\n    if (mode === 'hsla') {\n      hsl[3] = alpha;\n    }\n    return mode + '(' + hsl.join(',') + ')';\n  };\n\n  _input.css = function(h) {\n    return css2rgb(h);\n  };\n\n  chroma.css = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['css']), function(){});\n  };\n\n  Color.prototype.css = function(mode) {\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    if (mode.slice(0, 3) === 'rgb') {\n      return rgb2css(this._rgb);\n    } else if (mode.slice(0, 3) === 'hsl') {\n      return hsl2css(this.hsl(), this.alpha());\n    }\n  };\n\n  _input.named = function(name) {\n    return hex2rgb(w3cx11[name]);\n  };\n\n  _guess_formats.push({\n    p: 5,\n    test: function(n) {\n      if (arguments.length === 1 && (w3cx11[n] != null)) {\n        return 'named';\n      }\n    }\n  });\n\n  Color.prototype.name = function(n) {\n    var h, k;\n    if (arguments.length) {\n      if (w3cx11[n]) {\n        this._rgb = hex2rgb(w3cx11[n]);\n      }\n      this._rgb[3] = 1;\n      this;\n    }\n    h = this.hex('rgb');\n    for (k in w3cx11) {\n      if (h === w3cx11[k]) {\n        return k;\n      }\n    }\n    return h;\n  };\n\n  lch2lab = function() {\n\n    /*\n    Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n    These formulas were invented by David Dalrymple to obtain maximum contrast without going\n    out of gamut if the parameters are in the range 0-1.\n    \n    A saturation multiplier was added by Gregor Aisch\n     */\n    var c, h, l, ref;\n    ref = unpack(arguments), l = ref[0], c = ref[1], h = ref[2];\n    h = h * DEG2RAD;\n    return [l, cos(h) * c, sin(h) * c];\n  };\n\n  lch2rgb = function() {\n    var L, a, args, b, c, g, h, l, r, ref, ref1;\n    args = unpack(arguments);\n    l = args[0], c = args[1], h = args[2];\n    ref = lch2lab(l, c, h), L = ref[0], a = ref[1], b = ref[2];\n    ref1 = lab2rgb(L, a, b), r = ref1[0], g = ref1[1], b = ref1[2];\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  lab2lch = function() {\n    var a, b, c, h, l, ref;\n    ref = unpack(arguments), l = ref[0], a = ref[1], b = ref[2];\n    c = sqrt(a * a + b * b);\n    h = (atan2(b, a) * RAD2DEG + 360) % 360;\n    if (round(c * 10000) === 0) {\n      h = Number.NaN;\n    }\n    return [l, c, h];\n  };\n\n  rgb2lch = function() {\n    var a, b, g, l, r, ref, ref1;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    ref1 = rgb2lab(r, g, b), l = ref1[0], a = ref1[1], b = ref1[2];\n    return lab2lch(l, a, b);\n  };\n\n  chroma.lch = function() {\n    var args;\n    args = unpack(arguments);\n    return new Color(args, 'lch');\n  };\n\n  chroma.hcl = function() {\n    var args;\n    args = unpack(arguments);\n    return new Color(args, 'hcl');\n  };\n\n  _input.lch = lch2rgb;\n\n  _input.hcl = function() {\n    var c, h, l, ref;\n    ref = unpack(arguments), h = ref[0], c = ref[1], l = ref[2];\n    return lch2rgb([l, c, h]);\n  };\n\n  Color.prototype.lch = function() {\n    return rgb2lch(this._rgb);\n  };\n\n  Color.prototype.hcl = function() {\n    return rgb2lch(this._rgb).reverse();\n  };\n\n  rgb2cmyk = function(mode) {\n    var b, c, f, g, k, m, r, ref, y;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = r / 255;\n    g = g / 255;\n    b = b / 255;\n    k = 1 - Math.max(r, Math.max(g, b));\n    f = k < 1 ? 1 / (1 - k) : 0;\n    c = (1 - r - k) * f;\n    m = (1 - g - k) * f;\n    y = (1 - b - k) * f;\n    return [c, m, y, k];\n  };\n\n  cmyk2rgb = function() {\n    var alpha, args, b, c, g, k, m, r, y;\n    args = unpack(arguments);\n    c = args[0], m = args[1], y = args[2], k = args[3];\n    alpha = args.length > 4 ? args[4] : 1;\n    if (k === 1) {\n      return [0, 0, 0, alpha];\n    }\n    r = c >= 1 ? 0 : 255 * (1 - c) * (1 - k);\n    g = m >= 1 ? 0 : 255 * (1 - m) * (1 - k);\n    b = y >= 1 ? 0 : 255 * (1 - y) * (1 - k);\n    return [r, g, b, alpha];\n  };\n\n  _input.cmyk = function() {\n    return cmyk2rgb(unpack(arguments));\n  };\n\n  chroma.cmyk = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['cmyk']), function(){});\n  };\n\n  Color.prototype.cmyk = function() {\n    return rgb2cmyk(this._rgb);\n  };\n\n  _input.gl = function() {\n    var i, k, o, rgb, v;\n    rgb = (function() {\n      var ref, results;\n      ref = unpack(arguments);\n      results = [];\n      for (k in ref) {\n        v = ref[k];\n        results.push(v);\n      }\n      return results;\n    }).apply(this, arguments);\n    for (i = o = 0; o <= 2; i = ++o) {\n      rgb[i] *= 255;\n    }\n    return rgb;\n  };\n\n  chroma.gl = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['gl']), function(){});\n  };\n\n  Color.prototype.gl = function() {\n    var rgb;\n    rgb = this._rgb;\n    return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n  };\n\n  rgb2luminance = function(r, g, b) {\n    var ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = luminance_x(r);\n    g = luminance_x(g);\n    b = luminance_x(b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  };\n\n  luminance_x = function(x) {\n    x /= 255;\n    if (x <= 0.03928) {\n      return x / 12.92;\n    } else {\n      return pow((x + 0.055) / 1.055, 2.4);\n    }\n  };\n\n  interpolate_rgb = function(col1, col2, f, m) {\n    var xyz0, xyz1;\n    xyz0 = col1._rgb;\n    xyz1 = col2._rgb;\n    return new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m);\n  };\n\n  _interpolators.push(['rgb', interpolate_rgb]);\n\n  Color.prototype.luminance = function(lum, mode) {\n    var cur_lum, eps, max_iter, rgba, test;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    if (!arguments.length) {\n      return rgb2luminance(this._rgb);\n    }\n    rgba = this._rgb;\n    if (lum === 0) {\n      rgba = [0, 0, 0, this._rgb[3]];\n    } else if (lum === 1) {\n      rgba = [255, 255, 255, this[3]];\n    } else {\n      cur_lum = rgb2luminance(this._rgb);\n      eps = 1e-7;\n      max_iter = 20;\n      test = function(l, h) {\n        var lm, m;\n        m = l.interpolate(h, 0.5, mode);\n        lm = m.luminance();\n        if (Math.abs(lum - lm) < eps || !max_iter--) {\n          return m;\n        }\n        if (lm > lum) {\n          return test(l, m);\n        }\n        return test(m, h);\n      };\n      if (cur_lum > lum) {\n        rgba = test(chroma('black'), this).rgba();\n      } else {\n        rgba = test(this, chroma('white')).rgba();\n      }\n    }\n    return chroma(rgba).alpha(this.alpha());\n  };\n\n  temperature2rgb = function(kelvin) {\n    var b, g, r, temp;\n    temp = kelvin / 100;\n    if (temp < 66) {\n      r = 255;\n      g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g);\n      b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b);\n    } else {\n      r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r);\n      g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g);\n      b = 255;\n    }\n    return [r, g, b];\n  };\n\n  rgb2temperature = function() {\n    var b, eps, g, maxTemp, minTemp, r, ref, rgb, temp;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    minTemp = 1000;\n    maxTemp = 40000;\n    eps = 0.4;\n    while (maxTemp - minTemp > eps) {\n      temp = (maxTemp + minTemp) * 0.5;\n      rgb = temperature2rgb(temp);\n      if ((rgb[2] / rgb[0]) >= (b / r)) {\n        maxTemp = temp;\n      } else {\n        minTemp = temp;\n      }\n    }\n    return round(temp);\n  };\n\n  chroma.temperature = chroma.kelvin = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['temperature']), function(){});\n  };\n\n  _input.temperature = _input.kelvin = _input.K = temperature2rgb;\n\n  Color.prototype.temperature = function() {\n    return rgb2temperature(this._rgb);\n  };\n\n  Color.prototype.kelvin = Color.prototype.temperature;\n\n  chroma.contrast = function(a, b) {\n    var l1, l2, ref, ref1;\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    l1 = a.luminance();\n    l2 = b.luminance();\n    if (l1 > l2) {\n      return (l1 + 0.05) / (l2 + 0.05);\n    } else {\n      return (l2 + 0.05) / (l1 + 0.05);\n    }\n  };\n\n  chroma.distance = function(a, b, mode) {\n    var d, i, l1, l2, ref, ref1, sum_sq;\n    if (mode == null) {\n      mode = 'lab';\n    }\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    l1 = a.get(mode);\n    l2 = b.get(mode);\n    sum_sq = 0;\n    for (i in l1) {\n      d = (l1[i] || 0) - (l2[i] || 0);\n      sum_sq += d * d;\n    }\n    return Math.sqrt(sum_sq);\n  };\n\n  chroma.deltaE = function(a, b, L, C) {\n    var L1, L2, a1, a2, b1, b2, c1, c2, c4, dH2, delA, delB, delC, delL, f, h1, ref, ref1, ref2, ref3, sc, sh, sl, t, v1, v2, v3;\n    if (L == null) {\n      L = 1;\n    }\n    if (C == null) {\n      C = 1;\n    }\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    ref2 = a.lab(), L1 = ref2[0], a1 = ref2[1], b1 = ref2[2];\n    ref3 = b.lab(), L2 = ref3[0], a2 = ref3[1], b2 = ref3[2];\n    c1 = sqrt(a1 * a1 + b1 * b1);\n    c2 = sqrt(a2 * a2 + b2 * b2);\n    sl = L1 < 16.0 ? 0.511 : (0.040975 * L1) / (1.0 + 0.01765 * L1);\n    sc = (0.0638 * c1) / (1.0 + 0.0131 * c1) + 0.638;\n    h1 = c1 < 0.000001 ? 0.0 : (atan2(b1, a1) * 180.0) / PI;\n    while (h1 < 0) {\n      h1 += 360;\n    }\n    while (h1 >= 360) {\n      h1 -= 360;\n    }\n    t = (h1 >= 164.0) && (h1 <= 345.0) ? 0.56 + abs(0.2 * cos((PI * (h1 + 168.0)) / 180.0)) : 0.36 + abs(0.4 * cos((PI * (h1 + 35.0)) / 180.0));\n    c4 = c1 * c1 * c1 * c1;\n    f = sqrt(c4 / (c4 + 1900.0));\n    sh = sc * (f * t + 1.0 - f);\n    delL = L1 - L2;\n    delC = c1 - c2;\n    delA = a1 - a2;\n    delB = b1 - b2;\n    dH2 = delA * delA + delB * delB - delC * delC;\n    v1 = delL / (L * sl);\n    v2 = delC / (C * sc);\n    v3 = sh;\n    return sqrt(v1 * v1 + v2 * v2 + (dH2 / (v3 * v3)));\n  };\n\n  Color.prototype.get = function(modechan) {\n    var channel, i, me, mode, ref, src;\n    me = this;\n    ref = modechan.split('.'), mode = ref[0], channel = ref[1];\n    src = me[mode]();\n    if (channel) {\n      i = mode.indexOf(channel);\n      if (i > -1) {\n        return src[i];\n      } else {\n        return console.warn('unknown channel ' + channel + ' in mode ' + mode);\n      }\n    } else {\n      return src;\n    }\n  };\n\n  Color.prototype.set = function(modechan, value) {\n    var channel, i, me, mode, ref, src;\n    me = this;\n    ref = modechan.split('.'), mode = ref[0], channel = ref[1];\n    if (channel) {\n      src = me[mode]();\n      i = mode.indexOf(channel);\n      if (i > -1) {\n        if (type(value) === 'string') {\n          switch (value.charAt(0)) {\n            case '+':\n              src[i] += +value;\n              break;\n            case '-':\n              src[i] += +value;\n              break;\n            case '*':\n              src[i] *= +(value.substr(1));\n              break;\n            case '/':\n              src[i] /= +(value.substr(1));\n              break;\n            default:\n              src[i] = +value;\n          }\n        } else {\n          src[i] = value;\n        }\n      } else {\n        console.warn('unknown channel ' + channel + ' in mode ' + mode);\n      }\n    } else {\n      src = value;\n    }\n    return chroma(src, mode).alpha(me.alpha());\n  };\n\n  Color.prototype.clipped = function() {\n    return this._rgb._clipped || false;\n  };\n\n  Color.prototype.alpha = function(a) {\n    if (arguments.length) {\n      return chroma.rgb([this._rgb[0], this._rgb[1], this._rgb[2], a]);\n    }\n    return this._rgb[3];\n  };\n\n  Color.prototype.darken = function(amount) {\n    var lab, me;\n    if (amount == null) {\n      amount = 1;\n    }\n    me = this;\n    lab = me.lab();\n    lab[0] -= LAB_CONSTANTS.Kn * amount;\n    return chroma.lab(lab).alpha(me.alpha());\n  };\n\n  Color.prototype.brighten = function(amount) {\n    if (amount == null) {\n      amount = 1;\n    }\n    return this.darken(-amount);\n  };\n\n  Color.prototype.darker = Color.prototype.darken;\n\n  Color.prototype.brighter = Color.prototype.brighten;\n\n  Color.prototype.saturate = function(amount) {\n    var lch, me;\n    if (amount == null) {\n      amount = 1;\n    }\n    me = this;\n    lch = me.lch();\n    lch[1] += amount * LAB_CONSTANTS.Kn;\n    if (lch[1] < 0) {\n      lch[1] = 0;\n    }\n    return chroma.lch(lch).alpha(me.alpha());\n  };\n\n  Color.prototype.desaturate = function(amount) {\n    if (amount == null) {\n      amount = 1;\n    }\n    return this.saturate(-amount);\n  };\n\n  Color.prototype.premultiply = function() {\n    var a, rgb;\n    rgb = this.rgb();\n    a = this.alpha();\n    return chroma(rgb[0] * a, rgb[1] * a, rgb[2] * a, a);\n  };\n\n  blend = function(bottom, top, mode) {\n    if (!blend[mode]) {\n      throw 'unknown blend mode ' + mode;\n    }\n    return blend[mode](bottom, top);\n  };\n\n  blend_f = function(f) {\n    return function(bottom, top) {\n      var c0, c1;\n      c0 = chroma(top).rgb();\n      c1 = chroma(bottom).rgb();\n      return chroma(f(c0, c1), 'rgb');\n    };\n  };\n\n  each = function(f) {\n    return function(c0, c1) {\n      var i, o, out;\n      out = [];\n      for (i = o = 0; o <= 3; i = ++o) {\n        out[i] = f(c0[i], c1[i]);\n      }\n      return out;\n    };\n  };\n\n  normal = function(a, b) {\n    return a;\n  };\n\n  multiply = function(a, b) {\n    return a * b / 255;\n  };\n\n  darken = function(a, b) {\n    if (a > b) {\n      return b;\n    } else {\n      return a;\n    }\n  };\n\n  lighten = function(a, b) {\n    if (a > b) {\n      return a;\n    } else {\n      return b;\n    }\n  };\n\n  screen = function(a, b) {\n    return 255 * (1 - (1 - a / 255) * (1 - b / 255));\n  };\n\n  overlay = function(a, b) {\n    if (b < 128) {\n      return 2 * a * b / 255;\n    } else {\n      return 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\n    }\n  };\n\n  burn = function(a, b) {\n    return 255 * (1 - (1 - b / 255) / (a / 255));\n  };\n\n  dodge = function(a, b) {\n    if (a === 255) {\n      return 255;\n    }\n    a = 255 * (b / 255) / (1 - a / 255);\n    if (a > 255) {\n      return 255;\n    } else {\n      return a;\n    }\n  };\n\n  blend.normal = blend_f(each(normal));\n\n  blend.multiply = blend_f(each(multiply));\n\n  blend.screen = blend_f(each(screen));\n\n  blend.overlay = blend_f(each(overlay));\n\n  blend.darken = blend_f(each(darken));\n\n  blend.lighten = blend_f(each(lighten));\n\n  blend.dodge = blend_f(each(dodge));\n\n  blend.burn = blend_f(each(burn));\n\n  chroma.blend = blend;\n\n  chroma.analyze = function(data) {\n    var len, o, r, val;\n    r = {\n      min: Number.MAX_VALUE,\n      max: Number.MAX_VALUE * -1,\n      sum: 0,\n      values: [],\n      count: 0\n    };\n    for (o = 0, len = data.length; o < len; o++) {\n      val = data[o];\n      if ((val != null) && !isNaN(val)) {\n        r.values.push(val);\n        r.sum += val;\n        if (val < r.min) {\n          r.min = val;\n        }\n        if (val > r.max) {\n          r.max = val;\n        }\n        r.count += 1;\n      }\n    }\n    r.domain = [r.min, r.max];\n    r.limits = function(mode, num) {\n      return chroma.limits(r, mode, num);\n    };\n    return r;\n  };\n\n  chroma.scale = function(colors, positions) {\n    var _classes, _colorCache, _colors, _correctLightness, _domain, _fixed, _gamma, _max, _min, _mode, _nacol, _out, _padding, _pos, _spread, _useCache, classifyValue, f, getClass, getColor, resetCache, setColors, tmap;\n    _mode = 'rgb';\n    _nacol = chroma('#ccc');\n    _spread = 0;\n    _fixed = false;\n    _domain = [0, 1];\n    _pos = [];\n    _padding = [0, 0];\n    _classes = false;\n    _colors = [];\n    _out = false;\n    _min = 0;\n    _max = 1;\n    _correctLightness = false;\n    _colorCache = {};\n    _useCache = true;\n    _gamma = 1;\n    setColors = function(colors) {\n      var c, col, o, ref, ref1, w;\n      if (colors == null) {\n        colors = ['#fff', '#000'];\n      }\n      if ((colors != null) && type(colors) === 'string' && (chroma.brewer != null)) {\n        colors = chroma.brewer[colors] || chroma.brewer[colors.toLowerCase()] || colors;\n      }\n      if (type(colors) === 'array') {\n        if (colors.length === 1) {\n          colors = [colors[0], colors[0]];\n        }\n        colors = colors.slice(0);\n        for (c = o = 0, ref = colors.length - 1; 0 <= ref ? o <= ref : o >= ref; c = 0 <= ref ? ++o : --o) {\n          col = colors[c];\n          if (type(col) === \"string\") {\n            colors[c] = chroma(col);\n          }\n        }\n        _pos.length = 0;\n        for (c = w = 0, ref1 = colors.length - 1; 0 <= ref1 ? w <= ref1 : w >= ref1; c = 0 <= ref1 ? ++w : --w) {\n          _pos.push(c / (colors.length - 1));\n        }\n      }\n      resetCache();\n      return _colors = colors;\n    };\n    getClass = function(value) {\n      var i, n;\n      if (_classes != null) {\n        n = _classes.length - 1;\n        i = 0;\n        while (i < n && value >= _classes[i]) {\n          i++;\n        }\n        return i - 1;\n      }\n      return 0;\n    };\n    tmap = function(t) {\n      return t;\n    };\n    classifyValue = function(value) {\n      var i, maxc, minc, n, val;\n      val = value;\n      if (_classes.length > 2) {\n        n = _classes.length - 1;\n        i = getClass(value);\n        minc = _classes[0] + (_classes[1] - _classes[0]) * (0 + _spread * 0.5);\n        maxc = _classes[n - 1] + (_classes[n] - _classes[n - 1]) * (1 - _spread * 0.5);\n        val = _min + ((_classes[i] + (_classes[i + 1] - _classes[i]) * 0.5 - minc) / (maxc - minc)) * (_max - _min);\n      }\n      return val;\n    };\n    getColor = function(val, bypassMap) {\n      var c, col, i, k, o, p, ref, t;\n      if (bypassMap == null) {\n        bypassMap = false;\n      }\n      if (isNaN(val) || val === null) {\n        return _nacol;\n      }\n      if (!bypassMap) {\n        if (_classes && _classes.length > 2) {\n          c = getClass(val);\n          t = c / (_classes.length - 2);\n        } else if (_max !== _min) {\n          t = (val - _min) / (_max - _min);\n        } else {\n          t = 1;\n        }\n      } else {\n        t = val;\n      }\n      if (!bypassMap) {\n        t = tmap(t);\n      }\n      if (_gamma !== 1) {\n        t = pow(t, _gamma);\n      }\n      t = _padding[0] + (t * (1 - _padding[0] - _padding[1]));\n      t = Math.min(1, Math.max(0, t));\n      k = Math.floor(t * 10000);\n      if (_useCache && _colorCache[k]) {\n        col = _colorCache[k];\n      } else {\n        if (type(_colors) === 'array') {\n          for (i = o = 0, ref = _pos.length - 1; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) {\n            p = _pos[i];\n            if (t <= p) {\n              col = _colors[i];\n              break;\n            }\n            if (t >= p && i === _pos.length - 1) {\n              col = _colors[i];\n              break;\n            }\n            if (t > p && t < _pos[i + 1]) {\n              t = (t - p) / (_pos[i + 1] - p);\n              col = chroma.interpolate(_colors[i], _colors[i + 1], t, _mode);\n              break;\n            }\n          }\n        } else if (type(_colors) === 'function') {\n          col = _colors(t);\n        }\n        if (_useCache) {\n          _colorCache[k] = col;\n        }\n      }\n      return col;\n    };\n    resetCache = function() {\n      return _colorCache = {};\n    };\n    setColors(colors);\n    f = function(v) {\n      var c;\n      c = chroma(getColor(v));\n      if (_out && c[_out]) {\n        return c[_out]();\n      } else {\n        return c;\n      }\n    };\n    f.classes = function(classes) {\n      var d;\n      if (classes != null) {\n        if (type(classes) === 'array') {\n          _classes = classes;\n          _domain = [classes[0], classes[classes.length - 1]];\n        } else {\n          d = chroma.analyze(_domain);\n          if (classes === 0) {\n            _classes = [d.min, d.max];\n          } else {\n            _classes = chroma.limits(d, 'e', classes);\n          }\n        }\n        return f;\n      }\n      return _classes;\n    };\n    f.domain = function(domain) {\n      var c, d, k, len, o, ref, w;\n      if (!arguments.length) {\n        return _domain;\n      }\n      _min = domain[0];\n      _max = domain[domain.length - 1];\n      _pos = [];\n      k = _colors.length;\n      if (domain.length === k && _min !== _max) {\n        for (o = 0, len = domain.length; o < len; o++) {\n          d = domain[o];\n          _pos.push((d - _min) / (_max - _min));\n        }\n      } else {\n        for (c = w = 0, ref = k - 1; 0 <= ref ? w <= ref : w >= ref; c = 0 <= ref ? ++w : --w) {\n          _pos.push(c / (k - 1));\n        }\n      }\n      _domain = [_min, _max];\n      return f;\n    };\n    f.mode = function(_m) {\n      if (!arguments.length) {\n        return _mode;\n      }\n      _mode = _m;\n      resetCache();\n      return f;\n    };\n    f.range = function(colors, _pos) {\n      setColors(colors, _pos);\n      return f;\n    };\n    f.out = function(_o) {\n      _out = _o;\n      return f;\n    };\n    f.spread = function(val) {\n      if (!arguments.length) {\n        return _spread;\n      }\n      _spread = val;\n      return f;\n    };\n    f.correctLightness = function(v) {\n      if (v == null) {\n        v = true;\n      }\n      _correctLightness = v;\n      resetCache();\n      if (_correctLightness) {\n        tmap = function(t) {\n          var L0, L1, L_actual, L_diff, L_ideal, max_iter, pol, t0, t1;\n          L0 = getColor(0, true).lab()[0];\n          L1 = getColor(1, true).lab()[0];\n          pol = L0 > L1;\n          L_actual = getColor(t, true).lab()[0];\n          L_ideal = L0 + (L1 - L0) * t;\n          L_diff = L_actual - L_ideal;\n          t0 = 0;\n          t1 = 1;\n          max_iter = 20;\n          while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n            (function() {\n              if (pol) {\n                L_diff *= -1;\n              }\n              if (L_diff < 0) {\n                t0 = t;\n                t += (t1 - t) * 0.5;\n              } else {\n                t1 = t;\n                t += (t0 - t) * 0.5;\n              }\n              L_actual = getColor(t, true).lab()[0];\n              return L_diff = L_actual - L_ideal;\n            })();\n          }\n          return t;\n        };\n      } else {\n        tmap = function(t) {\n          return t;\n        };\n      }\n      return f;\n    };\n    f.padding = function(p) {\n      if (p != null) {\n        if (type(p) === 'number') {\n          p = [p, p];\n        }\n        _padding = p;\n        return f;\n      } else {\n        return _padding;\n      }\n    };\n    f.colors = function(numColors, out) {\n      var dd, dm, i, o, ref, result, results, samples, w;\n      if (arguments.length < 2) {\n        out = 'hex';\n      }\n      result = [];\n      if (arguments.length === 0) {\n        result = _colors.slice(0);\n      } else if (numColors === 1) {\n        result = [f(0.5)];\n      } else if (numColors > 1) {\n        dm = _domain[0];\n        dd = _domain[1] - dm;\n        result = (function() {\n          results = [];\n          for (var o = 0; 0 <= numColors ? o < numColors : o > numColors; 0 <= numColors ? o++ : o--){ results.push(o); }\n          return results;\n        }).apply(this).map(function(i) {\n          return f(dm + i / (numColors - 1) * dd);\n        });\n      } else {\n        colors = [];\n        samples = [];\n        if (_classes && _classes.length > 2) {\n          for (i = w = 1, ref = _classes.length; 1 <= ref ? w < ref : w > ref; i = 1 <= ref ? ++w : --w) {\n            samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n          }\n        } else {\n          samples = _domain;\n        }\n        result = samples.map(function(v) {\n          return f(v);\n        });\n      }\n      if (chroma[out]) {\n        result = result.map(function(c) {\n          return c[out]();\n        });\n      }\n      return result;\n    };\n    f.cache = function(c) {\n      if (c != null) {\n        _useCache = c;\n        return f;\n      } else {\n        return _useCache;\n      }\n    };\n    f.gamma = function(g) {\n      if (g != null) {\n        _gamma = g;\n        return f;\n      } else {\n        return _gamma;\n      }\n    };\n    f.nodata = function(d) {\n      if (d != null) {\n        _nacol = chroma(d);\n        return f;\n      } else {\n        return _nacol;\n      }\n    };\n    return f;\n  };\n\n  if (chroma.scales == null) {\n    chroma.scales = {};\n  }\n\n  chroma.scales.cool = function() {\n    return chroma.scale([chroma.hsl(180, 1, .9), chroma.hsl(250, .7, .4)]);\n  };\n\n  chroma.scales.hot = function() {\n    return chroma.scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb');\n  };\n\n  chroma.analyze = function(data, key, filter) {\n    var add, k, len, o, r, val, visit;\n    r = {\n      min: Number.MAX_VALUE,\n      max: Number.MAX_VALUE * -1,\n      sum: 0,\n      values: [],\n      count: 0\n    };\n    if (filter == null) {\n      filter = function() {\n        return true;\n      };\n    }\n    add = function(val) {\n      if ((val != null) && !isNaN(val)) {\n        r.values.push(val);\n        r.sum += val;\n        if (val < r.min) {\n          r.min = val;\n        }\n        if (val > r.max) {\n          r.max = val;\n        }\n        r.count += 1;\n      }\n    };\n    visit = function(val, k) {\n      if (filter(val, k)) {\n        if ((key != null) && type(key) === 'function') {\n          return add(key(val));\n        } else if ((key != null) && type(key) === 'string' || type(key) === 'number') {\n          return add(val[key]);\n        } else {\n          return add(val);\n        }\n      }\n    };\n    if (type(data) === 'array') {\n      for (o = 0, len = data.length; o < len; o++) {\n        val = data[o];\n        visit(val);\n      }\n    } else {\n      for (k in data) {\n        val = data[k];\n        visit(val, k);\n      }\n    }\n    r.domain = [r.min, r.max];\n    r.limits = function(mode, num) {\n      return chroma.limits(r, mode, num);\n    };\n    return r;\n  };\n\n  chroma.limits = function(data, mode, num) {\n    var aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, assignments, best, centroids, cluster, clusterSizes, dist, i, j, kClusters, limits, max_log, min, min_log, mindist, n, nb_iters, newCentroids, o, p, pb, pr, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, repeat, sum, tmpKMeansBreaks, v, value, values, w;\n    if (mode == null) {\n      mode = 'equal';\n    }\n    if (num == null) {\n      num = 7;\n    }\n    if (type(data) === 'array') {\n      data = chroma.analyze(data);\n    }\n    min = data.min;\n    max = data.max;\n    sum = data.sum;\n    values = data.values.sort(function(a, b) {\n      return a - b;\n    });\n    if (num === 1) {\n      return [min, max];\n    }\n    limits = [];\n    if (mode.substr(0, 1) === 'c') {\n      limits.push(min);\n      limits.push(max);\n    }\n    if (mode.substr(0, 1) === 'e') {\n      limits.push(min);\n      for (i = o = 1, ref = num - 1; 1 <= ref ? o <= ref : o >= ref; i = 1 <= ref ? ++o : --o) {\n        limits.push(min + (i / num) * (max - min));\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'l') {\n      if (min <= 0) {\n        throw 'Logarithmic scales are only possible for values > 0';\n      }\n      min_log = Math.LOG10E * log(min);\n      max_log = Math.LOG10E * log(max);\n      limits.push(min);\n      for (i = w = 1, ref1 = num - 1; 1 <= ref1 ? w <= ref1 : w >= ref1; i = 1 <= ref1 ? ++w : --w) {\n        limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'q') {\n      limits.push(min);\n      for (i = aa = 1, ref2 = num - 1; 1 <= ref2 ? aa <= ref2 : aa >= ref2; i = 1 <= ref2 ? ++aa : --aa) {\n        p = (values.length - 1) * i / num;\n        pb = floor(p);\n        if (pb === p) {\n          limits.push(values[pb]);\n        } else {\n          pr = p - pb;\n          limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n        }\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'k') {\n\n      /*\n      implementation based on\n      http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n      simplified for 1-d input values\n       */\n      n = values.length;\n      assignments = new Array(n);\n      clusterSizes = new Array(num);\n      repeat = true;\n      nb_iters = 0;\n      centroids = null;\n      centroids = [];\n      centroids.push(min);\n      for (i = ab = 1, ref3 = num - 1; 1 <= ref3 ? ab <= ref3 : ab >= ref3; i = 1 <= ref3 ? ++ab : --ab) {\n        centroids.push(min + (i / num) * (max - min));\n      }\n      centroids.push(max);\n      while (repeat) {\n        for (j = ac = 0, ref4 = num - 1; 0 <= ref4 ? ac <= ref4 : ac >= ref4; j = 0 <= ref4 ? ++ac : --ac) {\n          clusterSizes[j] = 0;\n        }\n        for (i = ad = 0, ref5 = n - 1; 0 <= ref5 ? ad <= ref5 : ad >= ref5; i = 0 <= ref5 ? ++ad : --ad) {\n          value = values[i];\n          mindist = Number.MAX_VALUE;\n          for (j = ae = 0, ref6 = num - 1; 0 <= ref6 ? ae <= ref6 : ae >= ref6; j = 0 <= ref6 ? ++ae : --ae) {\n            dist = abs(centroids[j] - value);\n            if (dist < mindist) {\n              mindist = dist;\n              best = j;\n            }\n          }\n          clusterSizes[best]++;\n          assignments[i] = best;\n        }\n        newCentroids = new Array(num);\n        for (j = af = 0, ref7 = num - 1; 0 <= ref7 ? af <= ref7 : af >= ref7; j = 0 <= ref7 ? ++af : --af) {\n          newCentroids[j] = null;\n        }\n        for (i = ag = 0, ref8 = n - 1; 0 <= ref8 ? ag <= ref8 : ag >= ref8; i = 0 <= ref8 ? ++ag : --ag) {\n          cluster = assignments[i];\n          if (newCentroids[cluster] === null) {\n            newCentroids[cluster] = values[i];\n          } else {\n            newCentroids[cluster] += values[i];\n          }\n        }\n        for (j = ah = 0, ref9 = num - 1; 0 <= ref9 ? ah <= ref9 : ah >= ref9; j = 0 <= ref9 ? ++ah : --ah) {\n          newCentroids[j] *= 1 / clusterSizes[j];\n        }\n        repeat = false;\n        for (j = ai = 0, ref10 = num - 1; 0 <= ref10 ? ai <= ref10 : ai >= ref10; j = 0 <= ref10 ? ++ai : --ai) {\n          if (newCentroids[j] !== centroids[i]) {\n            repeat = true;\n            break;\n          }\n        }\n        centroids = newCentroids;\n        nb_iters++;\n        if (nb_iters > 200) {\n          repeat = false;\n        }\n      }\n      kClusters = {};\n      for (j = aj = 0, ref11 = num - 1; 0 <= ref11 ? aj <= ref11 : aj >= ref11; j = 0 <= ref11 ? ++aj : --aj) {\n        kClusters[j] = [];\n      }\n      for (i = ak = 0, ref12 = n - 1; 0 <= ref12 ? ak <= ref12 : ak >= ref12; i = 0 <= ref12 ? ++ak : --ak) {\n        cluster = assignments[i];\n        kClusters[cluster].push(values[i]);\n      }\n      tmpKMeansBreaks = [];\n      for (j = al = 0, ref13 = num - 1; 0 <= ref13 ? al <= ref13 : al >= ref13; j = 0 <= ref13 ? ++al : --al) {\n        tmpKMeansBreaks.push(kClusters[j][0]);\n        tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n      }\n      tmpKMeansBreaks = tmpKMeansBreaks.sort(function(a, b) {\n        return a - b;\n      });\n      limits.push(tmpKMeansBreaks[0]);\n      for (i = am = 1, ref14 = tmpKMeansBreaks.length - 1; am <= ref14; i = am += 2) {\n        v = tmpKMeansBreaks[i];\n        if (!isNaN(v) && limits.indexOf(v) === -1) {\n          limits.push(v);\n        }\n      }\n    }\n    return limits;\n  };\n\n  hsi2rgb = function(h, s, i) {\n\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n     */\n    var args, b, g, r;\n    args = unpack(arguments);\n    h = args[0], s = args[1], i = args[2];\n    if (isNaN(h)) {\n      h = 0;\n    }\n    h /= 360;\n    if (h < 1 / 3) {\n      b = (1 - s) / 3;\n      r = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      g = 1 - (b + r);\n    } else if (h < 2 / 3) {\n      h -= 1 / 3;\n      r = (1 - s) / 3;\n      g = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      b = 1 - (r + g);\n    } else {\n      h -= 2 / 3;\n      g = (1 - s) / 3;\n      b = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      r = 1 - (g + b);\n    }\n    r = limit(i * r * 3);\n    g = limit(i * g * 3);\n    b = limit(i * b * 3);\n    return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hsi = function() {\n\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n     */\n    var b, g, h, i, min, r, ref, s;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    TWOPI = Math.PI * 2;\n    r /= 255;\n    g /= 255;\n    b /= 255;\n    min = Math.min(r, g, b);\n    i = (r + g + b) / 3;\n    s = 1 - min / i;\n    if (s === 0) {\n      h = 0;\n    } else {\n      h = ((r - g) + (r - b)) / 2;\n      h /= Math.sqrt((r - g) * (r - g) + (r - b) * (g - b));\n      h = Math.acos(h);\n      if (b > g) {\n        h = TWOPI - h;\n      }\n      h /= TWOPI;\n    }\n    return [h * 360, s, i];\n  };\n\n  chroma.hsi = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsi']), function(){});\n  };\n\n  _input.hsi = hsi2rgb;\n\n  Color.prototype.hsi = function() {\n    return rgb2hsi(this._rgb);\n  };\n\n  interpolate_hsx = function(col1, col2, f, m) {\n    var dh, hue, hue0, hue1, lbv, lbv0, lbv1, res, sat, sat0, sat1, xyz0, xyz1;\n    if (m === 'hsl') {\n      xyz0 = col1.hsl();\n      xyz1 = col2.hsl();\n    } else if (m === 'hsv') {\n      xyz0 = col1.hsv();\n      xyz1 = col2.hsv();\n    } else if (m === 'hcg') {\n      xyz0 = col1.hcg();\n      xyz1 = col2.hcg();\n    } else if (m === 'hsi') {\n      xyz0 = col1.hsi();\n      xyz1 = col2.hsi();\n    } else if (m === 'lch' || m === 'hcl') {\n      m = 'hcl';\n      xyz0 = col1.hcl();\n      xyz1 = col2.hcl();\n    }\n    if (m.substr(0, 1) === 'h') {\n      hue0 = xyz0[0], sat0 = xyz0[1], lbv0 = xyz0[2];\n      hue1 = xyz1[0], sat1 = xyz1[1], lbv1 = xyz1[2];\n    }\n    if (!isNaN(hue0) && !isNaN(hue1)) {\n      if (hue1 > hue0 && hue1 - hue0 > 180) {\n        dh = hue1 - (hue0 + 360);\n      } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n        dh = hue1 + 360 - hue0;\n      } else {\n        dh = hue1 - hue0;\n      }\n      hue = hue0 + f * dh;\n    } else if (!isNaN(hue0)) {\n      hue = hue0;\n      if ((lbv1 === 1 || lbv1 === 0) && m !== 'hsv') {\n        sat = sat0;\n      }\n    } else if (!isNaN(hue1)) {\n      hue = hue1;\n      if ((lbv0 === 1 || lbv0 === 0) && m !== 'hsv') {\n        sat = sat1;\n      }\n    } else {\n      hue = Number.NaN;\n    }\n    if (sat == null) {\n      sat = sat0 + f * (sat1 - sat0);\n    }\n    lbv = lbv0 + f * (lbv1 - lbv0);\n    return res = chroma[m](hue, sat, lbv);\n  };\n\n  _interpolators = _interpolators.concat((function() {\n    var len, o, ref, results;\n    ref = ['hsv', 'hsl', 'hsi', 'hcl', 'lch', 'hcg'];\n    results = [];\n    for (o = 0, len = ref.length; o < len; o++) {\n      m = ref[o];\n      results.push([m, interpolate_hsx]);\n    }\n    return results;\n  })());\n\n  interpolate_num = function(col1, col2, f, m) {\n    var n1, n2;\n    n1 = col1.num();\n    n2 = col2.num();\n    return chroma.num(n1 + (n2 - n1) * f, 'num');\n  };\n\n  _interpolators.push(['num', interpolate_num]);\n\n  interpolate_lab = function(col1, col2, f, m) {\n    var res, xyz0, xyz1;\n    xyz0 = col1.lab();\n    xyz1 = col2.lab();\n    return res = new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m);\n  };\n\n  _interpolators.push(['lab', interpolate_lab]);\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module)))\n\n/***/ }),\n/* 991 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _immutable = __webpack_require__(14);\n\nvar _ovid = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar MapAmountMenu = function (_React$Component) {\n    _inherits(MapAmountMenu, _React$Component);\n\n    function MapAmountMenu() {\n        _classCallCheck(this, MapAmountMenu);\n\n        return _possibleConstructorReturn(this, (MapAmountMenu.__proto__ || Object.getPrototypeOf(MapAmountMenu)).apply(this, arguments));\n    }\n\n    _createClass(MapAmountMenu, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                amountChoices = _props.amountChoices,\n                currentAmount = _props.currentAmount,\n                onSelect = _props.onSelect;\n\n            return _react2.default.createElement(_ovid.DropdownList, { label: \"Amount by\", value: currentAmount, onChange: function onChange(columnName) {\n                    return columnName !== currentAmount && onSelect(columnName);\n                } }, amountChoices.map(function (column, i) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: i, value: column.get('name'), title: column.get('label') });\n            }).toArray());\n        }\n    }]);\n\n    return MapAmountMenu;\n}(_react2.default.Component);\n\nexports.default = MapAmountMenu;\n\nMapAmountMenu.propTypes = {\n    amountChoices: _propTypes2.default.instanceOf(_immutable.List).isRequired,\n    currentAmount: _propTypes2.default.string.isRequired,\n    onSelect: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 992 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _MapTypeToIconClasses;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _immutable = __webpack_require__(14);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _ovid = __webpack_require__(8);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar MapTypeToIconClassesMap = (_MapTypeToIconClasses = {}, _defineProperty(_MapTypeToIconClasses, _map_constants.MapTypes.Bubble.name, ['icon-map-bubble']), _defineProperty(_MapTypeToIconClasses, _map_constants.MapTypes.Point.name, ['icon-map-point-1', 'icon-map-point-2', 'icon-map-point-3', 'icon-map-point-4']), _defineProperty(_MapTypeToIconClasses, _map_constants.MapTypes.Heatmap.name, ['icon-map-heat-1', 'icon-map-heat-2', 'icon-map-heat-3']), _MapTypeToIconClasses);\nvar MapTypeIcon = function MapTypeIcon(_ref) {\n    var mapType = _ref.mapType;\n    return _react2.default.createElement(\"div\", { className: 'ui-maptype__icon ' + mapType }, MapTypeToIconClassesMap[mapType].map(function (className) {\n        return _react2.default.createElement(\"i\", { className: className, key: className });\n    }));\n};\n\nvar MapTypeMenuListItem = function (_React$Component) {\n    _inherits(MapTypeMenuListItem, _React$Component);\n\n    function MapTypeMenuListItem() {\n        _classCallCheck(this, MapTypeMenuListItem);\n\n        var _this = _possibleConstructorReturn(this, (MapTypeMenuListItem.__proto__ || Object.getPrototypeOf(MapTypeMenuListItem)).apply(this, arguments));\n\n        _this._onClick = function (e) {\n            e.preventDefault();\n            if (_this.props.onClick) {\n                _this.props.onClick(_this.props.value);\n            }\n        };\n        return _this;\n    }\n\n    _createClass(MapTypeMenuListItem, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                selected = _props.selected,\n                title = _props.title,\n                value = _props.value;\n\n            var classNames = (0, _classnames2.default)('ui-maptype__option', { 'is-selected': selected });\n            return _react2.default.createElement(\"li\", { onClick: this._onClick }, _react2.default.createElement(\"button\", { className: classNames }, _react2.default.createElement(MapTypeIcon, { mapType: value }), title));\n        }\n    }]);\n\n    return MapTypeMenuListItem;\n}(_react2.default.Component);\n\nMapTypeMenuListItem.propTypes = {\n    value: _propTypes2.default.any,\n    title: _propTypes2.default.node,\n    iconClassname: _propTypes2.default.string\n};\n\nvar MapTypeMenu = function (_React$Component2) {\n    _inherits(MapTypeMenu, _React$Component2);\n\n    function MapTypeMenu() {\n        _classCallCheck(this, MapTypeMenu);\n\n        return _possibleConstructorReturn(this, (MapTypeMenu.__proto__ || Object.getPrototypeOf(MapTypeMenu)).apply(this, arguments));\n    }\n\n    _createClass(MapTypeMenu, [{\n        key: 'renderTitle',\n        value: function renderTitle() {\n            var _props2 = this.props,\n                currentMapType = _props2.currentMapType,\n                mapTypes = _props2.mapTypes;\n\n            return _react2.default.createElement(\"span\", { className: \"ui-maptype__title\" }, _react2.default.createElement(MapTypeIcon, { mapType: currentMapType }), mapTypes.find(function (mapType) {\n                return mapType.get('name') == currentMapType;\n            }).get('label'));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props3 = this.props,\n                currentMapType = _props3.currentMapType,\n                mapTypes = _props3.mapTypes,\n                onSelect = _props3.onSelect;\n\n            return _react2.default.createElement(_ovid.Dropdown, { toggleClass: \"ui-dropdown__toggle\", title: this.renderTitle(), label: \"Map as\" }, _react2.default.createElement(\"div\", { className: \"ui-container_scroll ui-maptype__container\" }, _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, mapTypes.map(function (mapType, i) {\n                return _react2.default.createElement(MapTypeMenuListItem, { key: i, value: mapType.get('name'), title: mapType.get('label'), selected: currentMapType == mapType.get('name'), onClick: onSelect });\n            }).toArray())));\n        }\n    }]);\n\n    return MapTypeMenu;\n}(_react2.default.Component);\n\nexports.default = MapTypeMenu;\n\nMapTypeMenu.propTypes = {\n    currentMapType: _propTypes2.default.oneOf(_map_constants.MapTypeNames),\n    mapTypes: _propTypes2.default.instanceOf(_immutable.List),\n    onSelect: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 993 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactI18next = __webpack_require__(148);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GraphType = function (_React$Component) {\n    _inherits(GraphType, _React$Component);\n\n    function GraphType() {\n        _classCallCheck(this, GraphType);\n\n        var _this = _possibleConstructorReturn(this, (GraphType.__proto__ || Object.getPrototypeOf(GraphType)).apply(this, arguments));\n\n        _this.graphTypes = {\n            table: {\n                icon: 'ui-graphtype__table',\n                name: 'Table View'\n            },\n            line: {\n                icon: 'ui-graphtype__line',\n                name: 'Line Graph'\n            },\n            stacked: {\n                icon: 'ui-graphtype__stacked',\n                name: 'Stacked Graph'\n            },\n            horizontal_stacked: {\n                icon: 'ui-graphtype__horizontal-stack',\n                name: 'Horizonal Stacked Chart'\n            },\n            percentage: {\n                icon: 'ui-graphtype__percentage',\n                name: 'Percentage Graph'\n            },\n            pie: {\n                icon: 'ui-graphtype__pie',\n                name: 'Pie Graph'\n            },\n            bar: {\n                icon: 'ui-graphtype__bar',\n                name: 'Bar Graph'\n            },\n            treemap: {\n                icon: 'ui-graphtype__treemap',\n                name: 'Treemap'\n            },\n            map: {\n                icon: 'ui-graphtype__map',\n                name: 'Map'\n            }\n        };\n        return _this;\n    }\n\n    _createClass(GraphType, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var t = this.props.t;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-graphtype ui-button-group\" }, this.props.graphTypes.map(function (id) {\n                if (!_this2.props.isMapEnabled && id == 'map') return;\n                var graphType = _this2.graphTypes[id];\n                var classes = {};\n                var name = t('strings.graph.types.' + id);\n                classes[graphType.icon] = true;\n                classes['ui-button'] = true;\n                classes['is-selected'] = id === _this2.props.graphType;\n                return _react2.default.createElement(\"button\", { key: id, ref: id, className: (0, _classnames2.default)(classes), onClick: function onClick() {\n                        return _grid_report_actions2.default.setVisualizationType(id);\n                    }, \"data-hint\": name, \"data-hint-position\": \"bottom\" }, _react2.default.createElement(\"span\", { className: \"ui-graphtype__icon\", \"aria-label\": 'Switch to ' + name }));\n            }));\n        }\n    }]);\n\n    return GraphType;\n}(_react2.default.Component);\n\nGraphType.propTypes = {\n    graphTypes: _propTypes2.default.array.isRequired,\n    graphType: _propTypes2.default.string.isRequired,\n    isMapEnabled: _propTypes2.default.bool.isRequired\n};\nexports.default = (0, _reactI18next.translate)('report', { wait: true })(GraphType);\n\n/***/ }),\n/* 994 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (_ref) {\n    var height = _ref.height;\n\n    return _react2.default.createElement(\"div\", { className: \"map__unsupported__container\", style: { height: height, marginTop: height / 4 } }, _react2.default.createElement(\"div\", { className: \"map__unsupported__icon\" }, _react2.default.createElement(\"i\", { className: \"ui-graphtype__map\" }, _react2.default.createElement(\"span\", { className: \"ui-graphtype__icon\" }))), _react2.default.createElement(\"div\", { className: \"map__unsupported__message\" }, _react2.default.createElement(\"div\", { className: \"map__unsupported__message_title\" }, \"Supported Map Browsers\"), _react2.default.createElement(\"div\", { className: \"map__unsupported__message_body\" }, \"We've worked hard to provide you with the best maps possible \\u2014 unfortunately that meant abandoning support for your browser. To fully experience OpenGov maps, we recommend switching to any of the following browsers:\", _react2.default.createElement(\"span\", null, \" \"), _react2.default.createElement(\"a\", { className: \"map__unsupported__message_browser\", href: \"http://outdatedbrowser.com/\", target: \"_new\" }, \"Edge\"), _react2.default.createElement(\"span\", null, \", \"), _react2.default.createElement(\"a\", { className: \"map__unsupported__message_browser\", href: \"http://outdatedbrowser.com/\", target: \"_new\" }, \"Chrome\"), _react2.default.createElement(\"span\", null, \", \"), _react2.default.createElement(\"a\", { className: \"map__unsupported__message_browser\", href: \"http://outdatedbrowser.com/\", target: \"_new\" }, \"Safari\"), _react2.default.createElement(\"span\", null, \", \"), \"and \", _react2.default.createElement(\"a\", { className: \"map__unsupported__message_browser\", href: \"http://outdatedbrowser.com/\", target: \"_new\" }, \"Firefox\"), _react2.default.createElement(\"span\", null, \".\"))));\n};\n\n/***/ }),\n/* 995 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(setImmediate) {\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _LayerComponentMap;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _rx = __webpack_require__(537);\n\nvar _immutable = __webpack_require__(14);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _map_constants = __webpack_require__(45);\n\nvar _geodata_utils = __webpack_require__(147);\n\nvar _layer_utils = __webpack_require__(509);\n\nvar _grid_map_legend = __webpack_require__(996);\n\nvar _grid_map_legend2 = _interopRequireDefault(_grid_map_legend);\n\nvar _bubble_map_legend = __webpack_require__(997);\n\nvar _bubble_map_legend2 = _interopRequireDefault(_bubble_map_legend);\n\nvar _heat_map_legend = __webpack_require__(999);\n\nvar _heat_map_legend2 = _interopRequireDefault(_heat_map_legend);\n\nvar _reactMapGl = __webpack_require__(1000);\n\nvar _reactMapGl2 = _interopRequireDefault(_reactMapGl);\n\nvar _feature_layer = __webpack_require__(1105);\n\nvar _feature_layer2 = _interopRequireDefault(_feature_layer);\n\nvar _gl_heat_map_layer = __webpack_require__(1106);\n\nvar _gl_heat_map_layer2 = _interopRequireDefault(_gl_heat_map_layer);\n\nvar _gl_map_tooltip = __webpack_require__(1112);\n\nvar _gl_map_tooltip2 = _interopRequireDefault(_gl_map_tooltip);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar HeatmapConfig = _map_constants.MapTypes.Heatmap.configuration;\n\nvar LayerComponentMap = (_LayerComponentMap = {}, _defineProperty(_LayerComponentMap, _map_constants.MapTypes.Point.name, _feature_layer2.default), _defineProperty(_LayerComponentMap, _map_constants.MapTypes.Bubble.name, _feature_layer2.default), _defineProperty(_LayerComponentMap, _map_constants.MapTypes.Heatmap.name, _gl_heat_map_layer2.default), _LayerComponentMap);\n\nvar GLGridMap = function (_React$PureComponent) {\n    _inherits(GLGridMap, _React$PureComponent);\n\n    function GLGridMap() {\n        _classCallCheck(this, GLGridMap);\n\n        var _this = _possibleConstructorReturn(this, (GLGridMap.__proto__ || Object.getPrototypeOf(GLGridMap)).apply(this, arguments));\n\n        _this.state = {\n            map: null,\n            viewport: {\n                latitude: _this.props.stats.getIn(['center', 'lat']),\n                longitude: _this.props.stats.getIn(['center', 'lng']),\n                zoom: 10\n            },\n            bounds: _this.props.visualization.get('mapBounds')\n        };\n        _this._onMapRenderAndLoaded = _lodash2.default.debounce(function () {\n            if (_this.state.map.loaded()) {\n                _grid_report_actions2.default.mapLoaded();\n            } else {\n                _this._onMapRenderAndLoaded();\n            }\n        }, 1000);\n        _this._onMapRender = _lodash2.default.debounce(function () {\n            _grid_report_actions2.default.mapLoading();\n            _this._onMapRenderAndLoaded();\n        }, 100);\n        _this._onFeaturesClick = function (features) {\n            if ((0, _geodata_utils.featureLocationsVirtuallyIdentical)(features)) {\n                _grid_report_actions2.default.getRowsForTooltip(null, features);\n                return;\n            }\n            var bounds = (0, _geodata_utils.getBoundsForFeatures)(features);\n            _grid_report_actions2.default.mapFitBounds(bounds);\n        };\n        return _this;\n    }\n\n    _createClass(GLGridMap, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            setImmediate(function () {\n                _grid_report_actions2.default.mapLoading();\n                _grid_report_actions2.default.resetAndLoadMap();\n            });\n        }\n    }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n            var visualization = nextProps.visualization,\n                filter = nextProps.filter,\n                breakdown = nextProps.breakdown;\n            var _props = this.props,\n                previousViz = _props.visualization,\n                previousFilter = _props.filter,\n                previousBreakdown = _props.breakdown;\n\n            var nextBounds = visualization.get('mapBounds');\n            var bounds = previousViz.get('mapBounds');\n            if (!bounds || nextBounds !== bounds && !(0, _geodata_utils.boundsNearlyEqual)(nextBounds, bounds)) {\n                this.setState({ bounds: nextBounds });\n            }\n            var breakdownColumnsPresent = visualization.get('breakdownColumns') && visualization.get('breakdownColumns').size > 0;\n            var breakdownInitialized = breakdownColumnsPresent && (!previousViz.get('breakdownColumns') || previousViz.get('breakdownColumns').size == 0);\n            if (breakdownInitialized) {\n                setImmediate(function () {\n                    return _grid_report_actions2.default.resetAndLoadMap();\n                });\n            }\n            if (filter !== previousFilter || breakdown !== previousBreakdown) {\n                setImmediate(function () {\n                    _grid_report_actions2.default.resetAndLoadMap();\n                    _grid_report_actions2.default.mapLegendReset();\n                });\n            }\n        }\n    }, {\n        key: 'renderTooltip',\n        value: function renderTooltip() {\n            var _props2 = this.props,\n                colorMap = _props2.colorMap,\n                data = _props2.data,\n                mapExtractors = _props2.mapExtractors,\n                visualization = _props2.visualization,\n                locale = _props2.locale;\n\n            var mapTooltip = visualization.get('mapTooltip');\n            var shouldRenderTooltip = !!mapTooltip.get('locationForTooltip') && (mapTooltip.get('editing') || mapTooltip.get('config')) && data.length > 0;\n            if (shouldRenderTooltip) {\n                return _react2.default.createElement(_gl_map_tooltip2.default, { locale: locale, colorExtractor: mapExtractors.get('colorExtractor'), colorMapLoading: !colorMap, tooltip: mapTooltip });\n            }\n            return null;\n        }\n    }, {\n        key: '_getBounds',\n        value: function _getBounds() {\n            return this.props.visualization.get('mapBounds');\n        }\n    }, {\n        key: '_getCenter',\n        value: function _getCenter() {\n            return this.props.stats.get('center');\n        }\n    }, {\n        key: '_initMapMoveHandlers',\n        value: function _initMapMoveHandlers(map) {\n            var _this2 = this;\n\n            var moveStart = _rx.Observable.fromEvent(map, 'movestart');\n            /* This observable is debounced because it's called when map movement ends.\r\n              The user may click and drag, zoom, and drag again in quick\r\n              succession and without a debounce this will unnecessarily save the\r\n              grid state after each movement. */\n            _rx.Observable.zip(moveStart, _rx.Observable.fromEvent(map, 'moveend')).debounce(function () {\n                return _rx.Observable.timer(700);\n            }).subscribe(function () {\n                return _this2._saveMapBounds();\n            });\n            moveStart.subscribe(_lodash2.default.throttle(function () {\n                return _lodash2.default.defer(function () {\n                    return _grid_report_actions2.default.mapMoveStart();\n                });\n            }, 50));\n        }\n    }, {\n        key: '_initMapLoadingHandlers',\n        value: function _initMapLoadingHandlers(map) {\n            map.on('render', this._onMapRender);\n        }\n    }, {\n        key: '_onMapLoaded',\n        value: function _onMapLoaded(map) {\n            this.setState({ map: map });\n            _grid_report_actions2.default.mapLoaded();\n            this._initMapMoveHandlers(map);\n            this._initMapLoadingHandlers(map);\n        }\n    }, {\n        key: 'zoomIn',\n        value: function zoomIn() {\n            if (this.state.map) {\n                this.state.map.zoomIn();\n            }\n        }\n    }, {\n        key: 'zoomOut',\n        value: function zoomOut() {\n            if (this.state.map) {\n                this.state.map.zoomOut();\n            }\n        }\n    }, {\n        key: '_saveMapBounds',\n        value: function _saveMapBounds() {\n            if (this.state.map.zooming) {\n                return;\n            }\n            var visualization = this.props.visualization;\n\n            var newBounds = (0, _immutable.List)(this.state.map.getBounds().toArray().map(_immutable.List));\n            var currentBounds = visualization.get('mapBounds');\n            // See comment on why this is here in map_constants\n            if ((0, _geodata_utils.boundsNearlyEqual)(newBounds, currentBounds)) {\n                return;\n            }\n            _grid_report_actions2.default.mapFitBounds(newBounds);\n        }\n    }, {\n        key: '_shouldMountLayer',\n        value: function _shouldMountLayer() {\n            var _this3 = this;\n\n            return !!this.state.map && this.props.data.length > 0 && _lodash2.default.keys(this.props.colorMap).length > 0 && (!_layer_utils.FeatureLayerTypes.some(function (featureType) {\n                return featureType === _this3.props.mapType;\n            }) || this.props.layer);\n        }\n    }, {\n        key: 'renderMap',\n        value: function renderMap() {\n            var _this4 = this;\n\n            var _props3 = this.props,\n                height = _props3.height,\n                mapType = _props3.mapType,\n                visualization = _props3.visualization;\n\n            var mapTooltip = visualization.get('mapTooltip');\n            var GLLayerComponent = LayerComponentMap[mapType];\n            if (!GLLayerComponent || this.props.stats.get('isInvalid')) {\n                return null;\n            }\n            return _react2.default.createElement(_reactMapGl2.default, Object.assign({}, this.state.viewport, { mapboxApiAccessToken: _map_constants.MapBoxAPIAccessToken, bounds: this.state.bounds, mapStyle: _map_constants.OpenGovVectorTileLayerURL, onMapLoaded: function onMapLoaded(map) {\n                    return _this4._onMapLoaded(map);\n                }, onChangeViewport: function onChangeViewport(viewport) {\n                    return _this4.setState({ viewport: viewport });\n                }, zoomDisabled: mapTooltip.get('editing'), dragDisabled: mapTooltip.get('editing'), width: '100%', height: height }), this._shouldMountLayer() && _react2.default.createElement(GLLayerComponent, Object.assign({}, this.getLayerProps())), mapType != _map_constants.MapTypes.Heatmap.name && this.renderTooltip());\n        }\n    }, {\n        key: 'getAmountHeatmapExtractors',\n        value: function getAmountHeatmapExtractors() {\n            var _props4 = this.props,\n                mapType = _props4.mapType,\n                visualization = _props4.visualization;\n\n            var isHeatmap = mapType === _map_constants.MapTypes.Heatmap.name;\n            if (!isHeatmap) {\n                return {};\n            }\n            return _geodata_utils.HeatmapExtractorsMap[visualization.get('heatmapType')];\n        }\n    }, {\n        key: 'getLayerProps',\n        value: function getLayerProps() {\n            var _props5 = this.props,\n                data = _props5.data,\n                mapType = _props5.mapType,\n                layer = _props5.layer;\n            var map = this.state.map;\n\n            if (mapType === _map_constants.MapTypes.Heatmap.name) {\n                return _extends({}, this.state.viewport, this.getAmountHeatmapExtractors(), {\n                    data: data,\n                    lngLatExtractor: _geodata_utils.getFeatureCoordinates,\n                    gradientColors: _map_constants.HeatMapGradient\n                });\n            }\n            if (_layer_utils.FeatureLayerTypes.some(function (featureType) {\n                return featureType === mapType;\n            })) {\n                return {\n                    data: data,\n                    layer: layer,\n                    map: map,\n                    onLoading: _grid_report_actions2.default.mapLoading,\n                    onFeaturesClick: this._onFeaturesClick\n                };\n            }\n            return {};\n        }\n    }, {\n        key: 'renderLegend',\n        value: function renderLegend() {\n            var _props6 = this.props,\n                colorMap = _props6.colorMap,\n                breakdown = _props6.breakdown,\n                legendPage = _props6.legendPage,\n                mapType = _props6.mapType,\n                stats = _props6.stats;\n\n            switch (mapType) {\n                case _map_constants.MapTypes.Heatmap.name:\n                    if (!stats.get('formattedMinAmount')) return null;\n                    var visualization = this.props.visualization;\n\n                    var isAmountHeatmapType = visualization.get('heatmapType') === _map_constants.MapTypes.Heatmap.types.amount;\n                    var heatmapLegendProps = {\n                        min: isAmountHeatmapType ? stats.get('formattedMinAmount') : HeatmapConfig.min,\n                        mid: isAmountHeatmapType ? null : (HeatmapConfig.min + HeatmapConfig.max) / 2,\n                        max: isAmountHeatmapType ? stats.get('formattedMaxAmount') : HeatmapConfig.max\n                    };\n                    return _react2.default.createElement(\"div\", { className: \"map__legend__wrapper\" }, _react2.default.createElement(_heat_map_legend2.default, Object.assign({}, heatmapLegendProps)));\n                case _map_constants.MapTypes.Bubble.name:\n                    if (!colorMap || stats.get('isInvalid')) return null;\n                    return _react2.default.createElement(_grid_map_legend2.default, { colorMap: colorMap, page: legendPage, legendColumn: breakdown }, _react2.default.createElement(_bubble_map_legend2.default, { minValue: stats.get('formattedMinAmount'), maxValue: stats.get('formattedMaxAmount') }));\n                case _map_constants.MapTypes.Point.name:\n                    if (!colorMap) return null;\n                    return _react2.default.createElement(_grid_map_legend2.default, { colorMap: colorMap, page: legendPage, legendColumn: breakdown });\n                default:\n                    return null;\n            }\n        }\n    }, {\n        key: 'renderMapControls',\n        value: function renderMapControls() {\n            var _this5 = this;\n\n            // The controls are manually rendered here because Uber's overlay\n            // structure results in the heatmap overlaying the zoom controls\n            return _react2.default.createElement(\"div\", { className: \"mapboxgl-control-container\" }, _react2.default.createElement(\"div\", { className: \"mapboxgl-ctrl-top-left\", style: { top: '50px' } }, \" \", _react2.default.createElement(\"div\", { className: \"mapboxgl-ctrl-group mapboxgl-ctrl\" }, _react2.default.createElement(\"button\", { className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in\", onClick: function onClick() {\n                    return _this5.zoomIn();\n                } }), _react2.default.createElement(\"button\", { className: \"mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out\", onClick: function onClick() {\n                    return _this5.zoomOut();\n                } }))));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props7 = this.props,\n                showLegend = _props7.showLegend,\n                visualization = _props7.visualization;\n\n            var mapTooltipEditing = visualization.getIn(['mapTooltip', 'editing']);\n            return _react2.default.createElement(\"div\", { className: \"grid_map__container\" }, !mapTooltipEditing && this.renderMapControls(), showLegend && this.renderLegend(), this.renderMap());\n        }\n    }]);\n\n    return GLGridMap;\n}(_react2.default.PureComponent);\n\nexports.default = GLGridMap;\n\nGLGridMap.propTypes = {\n    locale: _propTypes2.default.string.isRequired,\n    height: _propTypes2.default.number.isRequired,\n    data: _propTypes2.default.array,\n    mapType: _propTypes2.default.oneOf(_map_constants.MapTypeNames),\n    layer: _propTypes2.default.instanceOf(_immutable.Map),\n    legendPage: _propTypes2.default.number.isRequired,\n    showLegend: _propTypes2.default.bool.isRequired,\n    colorMap: _propTypes2.default.object,\n    visualization: _propTypes2.default.object,\n    filter: _propTypes2.default.object,\n    breakdown: _propTypes2.default.string,\n    mapExtractors: _propTypes2.default.object\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(134).setImmediate))\n\n/***/ }),\n/* 996 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar MapLegendItem = function (_React$Component) {\n    _inherits(MapLegendItem, _React$Component);\n\n    function MapLegendItem() {\n        _classCallCheck(this, MapLegendItem);\n\n        return _possibleConstructorReturn(this, (MapLegendItem.__proto__ || Object.getPrototypeOf(MapLegendItem)).apply(this, arguments));\n    }\n\n    _createClass(MapLegendItem, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                label = _props.label,\n                color = _props.color,\n                legendColumn = _props.legendColumn;\n\n            return _react2.default.createElement(\"button\", { id: 'legend_' + label, className: \"map__legend__item legend__item\", title: label, \"aria-label\": 'Filter visualization by ' + label, key: label, onClick: function onClick() {\n                    return _grid_report_actions2.default.filterColumn(legendColumn, 'eq', label);\n                } }, _react2.default.createElement(\"div\", { className: \"legend__item__decorator map__legend__item__decorator\", style: { color: color, background: color } }), _react2.default.createElement(\"span\", { className: \"legend__item__text map__legend__item__text\" }, label));\n        }\n    }]);\n\n    return MapLegendItem;\n}(_react2.default.Component);\n\nMapLegendItem.propTypes = {\n    legendColumn: _propTypes2.default.string.isRequired,\n    label: _propTypes2.default.string.isRequired,\n    color: _propTypes2.default.string.isRequired\n};\n\nvar MapLegend = function (_React$Component2) {\n    _inherits(MapLegend, _React$Component2);\n\n    function MapLegend() {\n        _classCallCheck(this, MapLegend);\n\n        var _this2 = _possibleConstructorReturn(this, (MapLegend.__proto__ || Object.getPrototypeOf(MapLegend)).apply(this, arguments));\n\n        _this2._itemsPerPage = _map_constants.MapLegendConfig.itemsPerPage;\n        return _this2;\n    }\n\n    _createClass(MapLegend, [{\n        key: 'renderLegendItems',\n        value: function renderLegendItems() {\n            var _this3 = this;\n\n            var _props2 = this.props,\n                colorMap = _props2.colorMap,\n                page = _props2.page,\n                legendColumn = _props2.legendColumn;\n\n            var take = function take(items) {\n                return _lodash2.default.take(items, _this3._itemsPerPage);\n            };\n            var skip = function skip(items) {\n                return _lodash2.default.drop(items, (page - 1) * _this3._itemsPerPage);\n            };\n            return _lodash2.default.map(take(skip(_lodash2.default.keys(this.props.colorMap))), function (label) {\n                return _react2.default.createElement(MapLegendItem, { key: label, color: colorMap[label], label: label, legendColumn: legendColumn });\n            });\n        }\n    }, {\n        key: 'renderLegendShowMore',\n        value: function renderLegendShowMore() {\n            var followingCount = _lodash2.default.keys(this.props.colorMap).length - this.props.page * this._itemsPerPage;\n            if (followingCount > 0) {\n                return _react2.default.createElement(\"button\", { id: 'legend_show_more', className: \"map__legend__item map__legend__item_show_more legend__item\", title: \"Show More\", onClick: _grid_report_actions2.default.mapLegendShowMoreClicked }, _react2.default.createElement(\"div\", { className: \"map__legend__item__next_group\" }), _react2.default.createElement(\"span\", { className: \"legend__item__text map__legend__item__text\" }, \"More (\", followingCount, \" grouped)\"));\n            }\n        }\n    }, {\n        key: 'renderLegendShowPrevious',\n        value: function renderLegendShowPrevious() {\n            var previousCount = (this.props.page - 1) * this._itemsPerPage;\n            if (previousCount > 0) {\n                return _react2.default.createElement(\"button\", { id: 'legend_show_previous', className: \"map__legend__item legend__item\", title: \"Show More\", onClick: _grid_report_actions2.default.mapLegendShowPreviousClicked }, _react2.default.createElement(\"div\", { className: \"map__legend__item__previous_group\" }), _react2.default.createElement(\"span\", { className: \"legend__item__text map__legend__item__text\" }, \"Previous (\", previousCount, \" grouped)\"));\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"map__legend__wrapper\" }, _react2.default.createElement(\"div\", { className: \"map__legend__container\" }, _react2.default.createElement(\"div\", { className: \"map__legend__title_container\", title: \"Show More\" }, _react2.default.createElement(\"span\", { className: \"map__legend__title\" }, \"legend\")), this.renderLegendShowPrevious(), this.renderLegendItems(), this.renderLegendShowMore()), this.props.children);\n        }\n    }]);\n\n    return MapLegend;\n}(_react2.default.Component);\n\nexports.default = MapLegend;\n\nMapLegend.propTypes = {\n    colorMap: _propTypes2.default.object.isRequired,\n    legendColumn: _propTypes2.default.string.isRequired,\n    page: _propTypes2.default.number.isRequired\n};\n\n/***/ }),\n/* 997 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _horizontal_scaled_circles = __webpack_require__(998);\n\nvar _horizontal_scaled_circles2 = _interopRequireDefault(_horizontal_scaled_circles);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _MapTypes$Bubble$conf = _map_constants.MapTypes.Bubble.configuration,\n    minBubbleRadius = _MapTypes$Bubble$conf.minBubbleRadius,\n    maxBubbleRadius = _MapTypes$Bubble$conf.maxBubbleRadius;\n\nvar RADIUS_RANGE = maxBubbleRadius - minBubbleRadius;\n// the following values are set specifically to fit in the legend container\nvar BUBBLE_CONTAINER_HEIGHT = maxBubbleRadius * 2 + 8;\nvar BUBBLE_CONTAINER_WIDTH = 189;\nvar CIRCLE_PADDING = 13;\nvar CONTAINER_PADDING = 14;\n\nvar BubbleMapLegend = function (_React$PureComponent) {\n    _inherits(BubbleMapLegend, _React$PureComponent);\n\n    function BubbleMapLegend() {\n        _classCallCheck(this, BubbleMapLegend);\n\n        return _possibleConstructorReturn(this, (BubbleMapLegend.__proto__ || Object.getPrototypeOf(BubbleMapLegend)).apply(this, arguments));\n    }\n\n    _createClass(BubbleMapLegend, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"map__aux_legend__container\" }, _react2.default.createElement(\"div\", { className: \"map__legend__title_container\" }, _react2.default.createElement(\"div\", { className: \"map__aux_legend__title map__legend__title\" }, \"Sizing\")), _react2.default.createElement(\"div\", { className: \"map__aux_legend__content\" }, _react2.default.createElement(_horizontal_scaled_circles2.default, { numCircles: 5, containerWidth: BUBBLE_CONTAINER_WIDTH, containerHeight: BUBBLE_CONTAINER_HEIGHT, minRadius: minBubbleRadius, circlePadding: CIRCLE_PADDING, containerPadding: CONTAINER_PADDING, radiusRange: RADIUS_RANGE })), _react2.default.createElement(\"div\", { className: \"map__aux_legend__labels\" }, _react2.default.createElement(\"div\", { className: \"map__aux_legend__label left\" }, this.props.minValue), _react2.default.createElement(\"div\", { className: \"map__aux_legend__label right\", style: { textAlign: 'center' } }, this.props.maxValue)));\n        }\n    }]);\n\n    return BubbleMapLegend;\n}(_react2.default.PureComponent);\n\nexports.default = BubbleMapLegend;\n\nBubbleMapLegend.propTypes = {\n    minValue: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]).isRequired,\n    maxValue: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]).isRequired\n};\n\n/***/ }),\n/* 998 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HorizontalScaledCircles = function (_React$PureComponent) {\n    _inherits(HorizontalScaledCircles, _React$PureComponent);\n\n    function HorizontalScaledCircles() {\n        _classCallCheck(this, HorizontalScaledCircles);\n\n        return _possibleConstructorReturn(this, (HorizontalScaledCircles.__proto__ || Object.getPrototypeOf(HorizontalScaledCircles)).apply(this, arguments));\n    }\n\n    _createClass(HorizontalScaledCircles, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                numCircles = _props.numCircles,\n                containerWidth = _props.containerWidth,\n                containerHeight = _props.containerHeight,\n                minRadius = _props.minRadius,\n                circlePadding = _props.circlePadding,\n                containerPadding = _props.containerPadding,\n                radiusRange = _props.radiusRange;\n\n            return _react2.default.createElement(\"svg\", { viewBox: '0 0 ' + containerWidth + ' ' + containerHeight, style: { width: containerWidth, height: containerHeight }, version: \"1.1\", xmlns: \"http://www.w3.org/2000/svg\" }, _react2.default.createElement(\"g\", null, _lodash2.default.times(numCircles, function (index) {\n                var circleNum = index;\n                var radius = circleNum / numCircles * radiusRange + minRadius;\n                var y = containerHeight / 2;\n                var x = (radius + circlePadding) * circleNum + containerPadding;\n                return _react2.default.createElement(\"circle\", { key: index, cx: x, cy: y, r: radius });\n            })));\n        }\n    }]);\n\n    return HorizontalScaledCircles;\n}(_react2.default.PureComponent);\n\nexports.default = HorizontalScaledCircles;\n\nHorizontalScaledCircles.propTypes = {\n    numCircles: _propTypes2.default.number.isRequired,\n    containerWidth: _propTypes2.default.number.isRequired,\n    containerHeight: _propTypes2.default.number.isRequired,\n    minRadius: _propTypes2.default.number.isRequired,\n    radiusRange: _propTypes2.default.number.isRequired,\n    circlePadding: _propTypes2.default.number.isRequired,\n    containerPadding: _propTypes2.default.number.isRequired\n};\n\n/***/ }),\n/* 999 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GRADIENT_WIDTH = 172;\nvar GRADIENT_HEIGHT = 10;\nvar GRADIENT_CONTAINER_HEIGHT = 14;\nvar GRADIENT_Y = GRADIENT_HEIGHT / 2 - (GRADIENT_CONTAINER_HEIGHT - GRADIENT_HEIGHT) / 2;\nvar GRADIENT_CORNER_RADIUS = 5;\n\nvar HeatMapLegend = function (_React$PureComponent) {\n    _inherits(HeatMapLegend, _React$PureComponent);\n\n    function HeatMapLegend() {\n        _classCallCheck(this, HeatMapLegend);\n\n        return _possibleConstructorReturn(this, (HeatMapLegend.__proto__ || Object.getPrototypeOf(HeatMapLegend)).apply(this, arguments));\n    }\n\n    _createClass(HeatMapLegend, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"map__aux_legend__container\" }, _react2.default.createElement(\"div\", { className: \"map__legend__title_container\" }, _react2.default.createElement(\"div\", { className: \"map__aux_legend__title map__legend__title\" }, \"Legend\")), _react2.default.createElement(\"div\", { className: \"map__aux_legend__content heatmap\" }, _react2.default.createElement(\"svg\", { height: GRADIENT_CONTAINER_HEIGHT, width: GRADIENT_WIDTH }, _react2.default.createElement(\"defs\", null, _react2.default.createElement(\"linearGradient\", { id: \"heatmap_legend_grad_1\", x1: \"0%\", y1: \"0%\", x2: \"100%\", y2: \"0%\" }, _map_constants.HeatMapGradientStops.map(function (_ref, index) {\n                var color = _ref.color,\n                    stop = _ref.stop;\n\n                return _react2.default.createElement(\"stop\", { key: index, offset: stop * 100 + '%', style: { stopColor: color, stopOpacity: 1 } });\n            }))), _react2.default.createElement(\"rect\", { x: \"0\", y: GRADIENT_Y, rx: GRADIENT_CORNER_RADIUS, ry: GRADIENT_CORNER_RADIUS, width: GRADIENT_WIDTH, height: GRADIENT_HEIGHT, fill: \"url(#heatmap_legend_grad_1)\" }))), _react2.default.createElement(\"div\", { className: \"map__aux_legend__labels\" }, _react2.default.createElement(\"div\", { className: \"map__aux_legend__label left\" }, this.props.min), _react2.default.createElement(\"div\", { className: \"map__aux_legend__label center\" }, this.props.mid), _react2.default.createElement(\"div\", { className: \"map__aux_legend__label right\" }, this.props.max)));\n        }\n    }]);\n\n    return HeatMapLegend;\n}(_react2.default.PureComponent);\n\nexports.default = HeatMapLegend;\n\nHeatMapLegend.propTypes = {\n    min: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]).isRequired,\n    mid: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n    max: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]).isRequired\n};\n\n/***/ }),\n/* 1000 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright (c) 2016 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// Export as ES5 module\nmodule.exports = __webpack_require__(1001);\n\n\n/***/ }),\n/* 1001 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _map = __webpack_require__(1002);\n\nObject.defineProperty(exports, 'default', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_map).default;\n  }\n});\n\nvar _fitBounds = __webpack_require__(1094);\n\nObject.defineProperty(exports, 'fitBounds', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_fitBounds).default;\n  }\n});\n\nvar _overlays = __webpack_require__(1095);\n\nObject.keys(_overlays).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _overlays[key];\n    }\n  });\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozt3Q0FvQlFBLE87Ozs7Ozs7Ozs4Q0FDQUEsTzs7Ozs7O0FBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuZXhwb3J0IHtkZWZhdWx0IGFzIGRlZmF1bHR9IGZyb20gJy4vbWFwLnJlYWN0JztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmaXRCb3VuZHN9IGZyb20gJy4vZml0LWJvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL292ZXJsYXlzJztcbiJdfQ==\n\n/***/ }),\n/* 1002 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class, _desc, _value, _class2; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n// NOTE: Transform is not a public API so we should be careful to always lock\n// down mapbox-gl to a specific major, minor, and patch version.\n\n\nvar _assert = __webpack_require__(35);\n\nvar _assert2 = _interopRequireDefault(_assert);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = __webpack_require__(270);\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _pureRenderDecorator = __webpack_require__(1006);\n\nvar _pureRenderDecorator2 = _interopRequireDefault(_pureRenderDecorator);\n\nvar _d = __webpack_require__(271);\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _mapboxGl = __webpack_require__(272);\n\nvar _mapboxGl2 = _interopRequireDefault(_mapboxGl);\n\nvar _config = __webpack_require__(578);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _mapInteractions = __webpack_require__(1091);\n\nvar _mapInteractions2 = _interopRequireDefault(_mapInteractions);\n\nvar _diffStyles2 = __webpack_require__(1093);\n\nvar _diffStyles3 = _interopRequireDefault(_diffStyles2);\n\nvar _transform = __webpack_require__(280);\n\nvar _transform2 = _interopRequireDefault(_transform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\n// Note: Max pitch is a hard coded value (not a named constant) in transform.js\nvar MAX_PITCH = 60;\nvar PITCH_MOUSE_THRESHOLD = 20;\nvar PITCH_ACCEL = 1.2;\n\nvar PROP_TYPES = {\n  /**\n    * The latitude of the center of the map.\n    */\n  latitude: _propTypes2.default.number.isRequired,\n  /**\n    * The longitude of the center of the map.\n    */\n  longitude: _propTypes2.default.number.isRequired,\n  /**\n    * The tile zoom level of the map.\n    */\n  zoom: _propTypes2.default.number.isRequired,\n  /**\n    * The Mapbox style the component should use. Can either be a string url\n    * or a MapboxGL style Immutable.Map object.\n    */\n  mapStyle: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(_immutable2.default.Map)]),\n  /**\n    * The Mapbox API access token to provide to mapbox-gl-js. This is required\n    * when using Mapbox provided vector tiles and styles.\n    */\n  mapboxApiAccessToken: _propTypes2.default.string,\n  /**\n    * `onChangeViewport` callback is fired when the user interacted with the\n    * map. The object passed to the callback containers `latitude`,\n    * `longitude` and `zoom` information.\n    */\n  onChangeViewport: _propTypes2.default.func,\n  /**\n    * `onMapLoaded` callback is fired on the map's 'load' event\n    */\n  onMapLoaded: _propTypes2.default.func,\n  /**\n    * The width of the map. Number in pixels or CSS string prop e.g. '100%'\n    */\n  width: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  /**\n    * The height of the map. Number in pixels or CSS string prop e.g. '100%'\n    */\n  height: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  /**\n    * Is the component currently being dragged. This is used to show/hide the\n    * drag cursor. Also used as an optimization in some overlays by preventing\n    * rendering while dragging.\n    */\n  isDragging: _propTypes2.default.bool,\n  /**\n    * Required to calculate the mouse projection after the first click event\n    * during dragging. Where the map is depends on where you first clicked on\n    * the map.\n    */\n  startDragLngLat: _propTypes2.default.array,\n  /**\n    * Called when a feature is hovered over. Features must set the\n    * `interactive` property to `true` for this to work properly. see the\n    * Mapbox example: https://www.mapbox.com/mapbox-gl-js/example/featuresat/\n    * The first argument of the callback will be the array of feature the\n    * mouse is over. This is the same response returned from `featuresAt`.\n    */\n  onHoverFeatures: _propTypes2.default.func,\n  /**\n    * Defaults to TRUE\n    * Set to false to enable onHoverFeatures to be called regardless if\n    * there is an actual feature at x, y. This is useful to emulate\n    * \"mouse-out\" behaviors on features.\n    */\n  ignoreEmptyFeatures: _propTypes2.default.bool,\n\n  /**\n    * Show attribution control or not.\n    */\n  attributionControl: _propTypes2.default.bool,\n\n  /**\n    * Called when a feature is clicked on. Features must set the\n    * `interactive` property to `true` for this to work properly. see the\n    * Mapbox example: https://www.mapbox.com/mapbox-gl-js/example/featuresat/\n    * The first argument of the callback will be the array of feature the\n    * mouse is over. This is the same response returned from `featuresAt`.\n    */\n  onClickFeatures: _propTypes2.default.func,\n\n  /**\n    * Passed to Mapbox Map constructor which passes it to the canvas context.\n    * This is unseful when you want to export the canvas as a PNG.\n    */\n  preserveDrawingBuffer: _propTypes2.default.bool,\n\n  /**\n    * There are still known issues with style diffing. As a temporary stopgap,\n    * add the option to prevent style diffing.\n    */\n  preventStyleDiffing: _propTypes2.default.bool,\n\n  /**\n    * Enables perspective control event handling (Command-rotate)\n    */\n  perspectiveEnabled: _propTypes2.default.bool,\n\n  /**\n    * Specify the bearing of the viewport\n    */\n  bearing: _propTypes2.default.number,\n\n  /**\n    * Specify the pitch of the viewport\n    */\n  pitch: _propTypes2.default.number,\n\n  /**\n    * Specify the altitude of the viewport camera\n    * Unit: map heights, default 1.5\n    * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n    */\n  altitude: _propTypes2.default.number,\n\n  /**\n    * Disabled dragging of the map\n    */\n  dragDisabled: _propTypes2.default.bool,\n\n  /**\n    * Disabled zooming of the map\n    */\n  zoomDisabled: _propTypes2.default.bool,\n\n  /**\n    * Bounds to fit on screen\n    */\n  bounds: _propTypes2.default.instanceOf(_immutable2.default.List)\n};\n\nvar DEFAULT_PROPS = {\n  mapStyle: 'mapbox://styles/mapbox/light-v8',\n  onChangeViewport: null,\n  mapboxApiAccessToken: _config2.default.DEFAULTS.MAPBOX_API_ACCESS_TOKEN,\n  preserveDrawingBuffer: false,\n  attributionControl: true,\n  ignoreEmptyFeatures: true,\n  bearing: 0,\n  pitch: 0,\n  altitude: 1.5\n};\n\nvar CHILD_CONTEXT_TYPES = {\n  map: _propTypes2.default.object\n};\n\nvar MapGL = (0, _pureRenderDecorator2.default)(_class = (_class2 = function (_Component) {\n  _inherits(MapGL, _Component);\n\n  function MapGL(props) {\n    _classCallCheck(this, MapGL);\n\n    var _this = _possibleConstructorReturn(this, (MapGL.__proto__ || Object.getPrototypeOf(MapGL)).call(this, props));\n\n    _this.state = {\n      isDragging: false,\n      startDragLngLat: null,\n      startBearing: null,\n      startPitch: null\n    };\n    _mapboxGl2.default.accessToken = props.mapboxApiAccessToken;\n\n    _this._mapReady = false;\n\n    _this.getChildContext = function () {\n      return {\n        map: _this._map\n      };\n    };\n    return _this;\n  }\n\n  _createClass(MapGL, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var mapStyle = this.props.mapStyle instanceof _immutable2.default.Map ? this.props.mapStyle.toJS() : this.props.mapStyle;\n      var map = new _mapboxGl2.default.Map({\n        container: this.refs.mapboxMap,\n        center: [this.props.longitude, this.props.latitude],\n        zoom: this.props.zoom,\n        pitch: this.props.pitch,\n        bearing: this.props.bearing,\n        style: mapStyle,\n        interactive: false,\n        preserveDrawingBuffer: this.props.preserveDrawingBuffer\n        // TODO?\n        // attributionControl: this.props.attributionControl\n      });\n\n      _d2.default.select(map.getCanvas()).style('outline', 'none');\n\n      this._map = map;\n      this._updateMapViewport({}, this.props);\n      this._callOnChangeViewport(map.transform);\n\n      if (this.props.onMapLoaded) {\n        map.on('load', function () {\n          return _this2.props.onMapLoaded(map);\n        });\n      }\n\n      // support for external manipulation of underlying map\n      // TODO a better approach\n      map.on('style.load', function () {\n        return _this2._mapReady = true;\n      });\n      map.on('moveend', function () {\n        return _this2._callOnChangeViewport(map.transform);\n      });\n      map.on('zoomend', function () {\n        return _this2._callOnChangeViewport(map.transform);\n      });\n    }\n\n    // New props are comin' round the corner!\n\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(newProps) {\n      this._updateStateFromProps(this.props, newProps);\n      this._updateMapViewport(this.props, newProps);\n      this._updateMapStyle(this.props, newProps);\n      // Save width/height so that we can check them in componentDidUpdate\n      this.setState({\n        width: this.props.width,\n        height: this.props.height\n      });\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      // map.resize() reads size from DOM, we need to call after render\n      this._updateMapSize(this.state, this.props);\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      if (this._map) {\n        this._map.remove();\n      }\n    }\n  }, {\n    key: '_cursor',\n    value: function _cursor() {\n      var isInteractive = this.props.onChangeViewport || this.props.onClickFeature || this.props.onHoverFeatures;\n      if (isInteractive) {\n        return this.props.isDragging ? _config2.default.CURSOR.GRABBING : _config2.default.CURSOR.GRAB;\n      }\n      return 'inherit';\n    }\n  }, {\n    key: '_getMap',\n    value: function _getMap() {\n      return this._map;\n    }\n  }, {\n    key: '_updateStateFromProps',\n    value: function _updateStateFromProps(oldProps, newProps) {\n      _mapboxGl2.default.accessToken = newProps.mapboxApiAccessToken;\n      var startDragLngLat = newProps.startDragLngLat;\n\n      this.setState({\n        startDragLngLat: startDragLngLat && startDragLngLat.slice()\n      });\n    }\n\n    // Individually update the maps source and layers that have changed if all\n    // other style props haven't changed. This prevents flicking of the map when\n    // styles only change sources or layers.\n\n  }, {\n    key: '_setDiffStyle',\n    value: function _setDiffStyle(prevStyle, nextStyle) {\n      var prevKeysMap = prevStyle && styleKeysMap(prevStyle) || {};\n      var nextKeysMap = styleKeysMap(nextStyle);\n      function styleKeysMap(style) {\n        return style.map(function () {\n          return true;\n        }).delete('layers').delete('sources').toJS();\n      }\n      function propsOtherThanLayersOrSourcesDiffer() {\n        var prevKeysList = Object.keys(prevKeysMap);\n        var nextKeysList = Object.keys(nextKeysMap);\n        if (prevKeysList.length !== nextKeysList.length) {\n          return true;\n        }\n        // `nextStyle` and `prevStyle` should not have the same set of props.\n        if (nextKeysList.some(function (key) {\n          return prevStyle.get(key) !== nextStyle.get(key);\n        }\n        // But the value of one of those props is different.\n        )) {\n          return true;\n        }\n        return false;\n      }\n\n      var map = this._getMap();\n\n      if (!prevStyle || propsOtherThanLayersOrSourcesDiffer()) {\n        map.setStyle(nextStyle.toJS());\n        return;\n      }\n\n      var _diffStyles = (0, _diffStyles3.default)(prevStyle, nextStyle),\n          sourcesDiff = _diffStyles.sourcesDiff,\n          layersDiff = _diffStyles.layersDiff;\n\n      // TODO: It's rather difficult to determine style diffing in the presence\n      // of refs. For now, if any style update has a ref, fallback to no diffing.\n      // We can come back to this case if there's a solid usecase.\n\n\n      if (layersDiff.updates.some(function (node) {\n        return node.layer.get('ref');\n      })) {\n        map.setStyle(nextStyle.toJS());\n        return;\n      }\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = sourcesDiff.enter[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var enter = _step.value;\n\n          map.addSource(enter.id, enter.source.toJS());\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = sourcesDiff.update[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var update = _step2.value;\n\n          map.removeSource(update.id);\n          map.addSource(update.id, update.source.toJS());\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion3 = true;\n      var _didIteratorError3 = false;\n      var _iteratorError3 = undefined;\n\n      try {\n        for (var _iterator3 = sourcesDiff.exit[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n          var exit = _step3.value;\n\n          map.removeSource(exit.id);\n        }\n      } catch (err) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion3 && _iterator3.return) {\n            _iterator3.return();\n          }\n        } finally {\n          if (_didIteratorError3) {\n            throw _iteratorError3;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion4 = true;\n      var _didIteratorError4 = false;\n      var _iteratorError4 = undefined;\n\n      try {\n        for (var _iterator4 = layersDiff.exiting[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n          var _exit = _step4.value;\n\n          if (map.style.getLayer(_exit.id)) {\n            map.removeLayer(_exit.id);\n          }\n        }\n      } catch (err) {\n        _didIteratorError4 = true;\n        _iteratorError4 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion4 && _iterator4.return) {\n            _iterator4.return();\n          }\n        } finally {\n          if (_didIteratorError4) {\n            throw _iteratorError4;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion5 = true;\n      var _didIteratorError5 = false;\n      var _iteratorError5 = undefined;\n\n      try {\n        for (var _iterator5 = layersDiff.updates[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n          var _update = _step5.value;\n\n          if (!_update.enter) {\n            // This is an old layer that needs to be updated. Remove the old layer\n            // with the same id and add it back again.\n            map.removeLayer(_update.id);\n          }\n          map.addLayer(_update.layer.toJS(), _update.before);\n        }\n      } catch (err) {\n        _didIteratorError5 = true;\n        _iteratorError5 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion5 && _iterator5.return) {\n            _iterator5.return();\n          }\n        } finally {\n          if (_didIteratorError5) {\n            throw _iteratorError5;\n          }\n        }\n      }\n    }\n  }, {\n    key: '_updateMapStyle',\n    value: function _updateMapStyle(oldProps, newProps) {\n      var mapStyle = newProps.mapStyle;\n      var oldMapStyle = oldProps.mapStyle;\n      if (mapStyle !== oldMapStyle) {\n        if (mapStyle instanceof _immutable2.default.Map) {\n          if (this.props.preventStyleDiffing) {\n            this._getMap().setStyle(mapStyle.toJS());\n          } else {\n            this._setDiffStyle(oldMapStyle, mapStyle);\n          }\n        } else {\n          this._getMap().setStyle(mapStyle);\n        }\n      }\n    }\n  }, {\n    key: '_updateMapViewport',\n    value: function _updateMapViewport(oldProps, newProps) {\n      var viewportChanged = newProps.latitude !== oldProps.latitude || newProps.longitude !== oldProps.longitude || newProps.zoom !== oldProps.zoom || newProps.pitch !== oldProps.pitch || newProps.bearing !== oldProps.bearing || newProps.altitude !== oldProps.altitude;\n\n      var map = this._getMap();\n\n      if (viewportChanged) {\n        map.jumpTo({\n          center: [newProps.longitude, newProps.latitude],\n          zoom: newProps.zoom,\n          bearing: newProps.bearing,\n          pitch: newProps.pitch\n        });\n\n        // TODO - jumpTo doesn't handle altitude\n        if (newProps.altitude !== oldProps.altitude) {\n          map.transform.altitude = newProps.altitude;\n        }\n      }\n\n      if (oldProps.bounds !== newProps.bounds && newProps.bounds) {\n        map.fitBounds(newProps.bounds.toJS());\n      }\n    }\n\n    // Note: needs to be called after render (e.g. in componentDidUpdate)\n\n  }, {\n    key: '_updateMapSize',\n    value: function _updateMapSize(oldProps, newProps) {\n      var sizeChanged = oldProps.width !== newProps.width || oldProps.height !== newProps.height;\n\n      if (sizeChanged) {\n        var map = this._getMap();\n        map.resize();\n        this._callOnChangeViewport(map.transform);\n      }\n    }\n  }, {\n    key: '_calculateNewPitchAndBearing',\n    value: function _calculateNewPitchAndBearing(_ref) {\n      var pos = _ref.pos,\n          startPos = _ref.startPos,\n          startBearing = _ref.startBearing,\n          startPitch = _ref.startPitch;\n\n      var xDelta = pos.x - startPos.x;\n      var bearing = startBearing + 180 * xDelta / this.props.width;\n\n      var pitch = startPitch;\n      var yDelta = pos.y - startPos.y;\n      if (yDelta > 0) {\n        // Dragging downwards, gradually decrease pitch\n        if (Math.abs(this.props.height - startPos.y) > PITCH_MOUSE_THRESHOLD) {\n          var scale = yDelta / (this.props.height - startPos.y);\n          pitch = (1 - scale) * PITCH_ACCEL * startPitch;\n        }\n      } else if (yDelta < 0) {\n        // Dragging upwards, gradually increase pitch\n        if (startPos.y > PITCH_MOUSE_THRESHOLD) {\n          // Move from 0 to 1 as we drag upwards\n          var yScale = 1 - pos.y / startPos.y;\n          // Gradually add until we hit max pitch\n          pitch = startPitch + yScale * (MAX_PITCH - startPitch);\n        }\n      }\n\n      // console.debug(startPitch, pitch);\n      return {\n        pitch: Math.max(Math.min(pitch, MAX_PITCH), 0),\n        bearing: bearing\n      };\n    }\n\n    // Helper to call props.onChangeViewport\n\n  }, {\n    key: '_callOnChangeViewport',\n    value: function _callOnChangeViewport(transform) {\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (this.props.onChangeViewport) {\n        var _getMap$getContainer = this._getMap().getContainer(),\n            height = _getMap$getContainer.scrollHeight,\n            width = _getMap$getContainer.scrollWidth;\n\n        this.props.onChangeViewport(_extends({\n          latitude: transform.center.lat,\n          longitude: mod(transform.center.lng + 180, 360) - 180,\n          zoom: transform.zoom,\n          pitch: transform.pitch,\n          bearing: mod(transform.bearing + 180, 360) - 180,\n\n          isDragging: this.props.isDragging,\n          startDragLngLat: this.props.startDragLngLat,\n          startBearing: this.props.startBearing,\n          startPitch: this.props.startPitch,\n\n          projectionMatrix: transform.projMatrix,\n\n          height: height,\n          width: width\n\n        }, opts));\n      }\n    }\n  }, {\n    key: '_onMouseDown',\n    value: function _onMouseDown(_ref2) {\n      var pos = _ref2.pos;\n\n      var map = this._getMap();\n      var lngLat = unprojectFromTransform(map.transform, pos);\n      this._callOnChangeViewport(map.transform, {\n        isDragging: true,\n        startDragLngLat: [lngLat.lng, lngLat.lat],\n        startBearing: map.transform.bearing,\n        startPitch: map.transform.pitch\n      });\n    }\n  }, {\n    key: '_onMouseDrag',\n    value: function _onMouseDrag(_ref3) {\n      var pos = _ref3.pos;\n\n      if (!this.props.onChangeViewport || this.props.dragDisabled) {\n        return;\n      }\n\n      // take the start lnglat and put it where the mouse is down.\n      (0, _assert2.default)(this.props.startDragLngLat, '`startDragLngLat` prop is required ' + 'for mouse drag behavior to calculate where to position the map.');\n\n      var map = this._getMap();\n      var transform = cloneTransform(map.transform);\n      transform.setLocationAtPoint(this.props.startDragLngLat, pos);\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onMouseRotate',\n    value: function _onMouseRotate(_ref4) {\n      var pos = _ref4.pos,\n          startPos = _ref4.startPos;\n\n      if (!this.props.onChangeViewport || !this.props.perspectiveEnabled) {\n        return;\n      }\n\n      var _props = this.props,\n          startBearing = _props.startBearing,\n          startPitch = _props.startPitch;\n\n      (0, _assert2.default)(typeof startBearing === 'number', '`startBearing` prop is required for mouse rotate behavior');\n      (0, _assert2.default)(typeof startPitch === 'number', '`startPitch` prop is required for mouse rotate behavior');\n\n      var map = this._getMap();\n\n      var _calculateNewPitchAnd = this._calculateNewPitchAndBearing({\n        pos: pos,\n        startPos: startPos,\n        startBearing: startBearing,\n        startPitch: startPitch\n      }),\n          pitch = _calculateNewPitchAnd.pitch,\n          bearing = _calculateNewPitchAnd.bearing;\n\n      var transform = cloneTransform(map.transform);\n      transform.bearing = bearing;\n      transform.pitch = pitch;\n\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onMouseMove',\n    value: function _onMouseMove(opt) {\n      if (!this.props.onHoverFeatures) {\n        return;\n      }\n\n      var map = this._getMap();\n      var pos = opt.pos;\n\n      var features = map.queryRenderedFeatures([pos.x, pos.y]);\n      if (!features.length && this.props.ignoreEmptyFeatures) {\n        return;\n      }\n      this.props.onHoverFeatures(features);\n    }\n  }, {\n    key: '_onMouseUp',\n    value: function _onMouseUp(opt) {\n      if (!this.props.onClickFeatures) {\n        return;\n      }\n\n      var map = this._getMap();\n      this._callOnChangeViewport(map.transform, {\n        isDragging: false,\n        startDragLngLat: null,\n        startBearing: null,\n        startPitch: null\n      });\n\n      var pos = opt.pos;\n\n      // Radius enables point features, like marker symbols, to be clicked.\n      var size = 15;\n      var bbox = [[pos.x - size, pos.y - size], [pos.x + size, pos.y + size]];\n      var features = map.queryRenderedFeatures(bbox);\n      if (!features.length && this.props.ignoreEmptyFeatures) {\n        return;\n      }\n      this.props.onClickFeatures(features);\n    }\n  }, {\n    key: '_onZoom',\n    value: function _onZoom(_ref5) {\n      var pos = _ref5.pos,\n          scale = _ref5.scale;\n\n      if (this.props.zoomDisabled) {\n        return;\n      }\n\n      var map = this._getMap();\n      var transform = cloneTransform(map.transform);\n      var around = unprojectFromTransform(transform, pos);\n      transform.zoom = transform.scaleZoom(map.transform.scale * scale);\n      transform.setLocationAtPoint(around, pos);\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onZoomEnd',\n    value: function _onZoomEnd() {\n      var map = this._getMap();\n      this._callOnChangeViewport(map.transform, {\n        isDragging: false\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          className = _props2.className,\n          width = _props2.width,\n          height = _props2.height,\n          style = _props2.style;\n\n      var mapStyle = _extends({}, style, {\n        width: width,\n        height: height,\n        cursor: this._cursor()\n      });\n\n      var content = [_react2.default.createElement('div', { key: 'map', ref: 'mapboxMap',\n        style: mapStyle, className: className }), _react2.default.createElement(\n        'div',\n        { key: 'overlays', className: 'overlays',\n          style: { position: 'absolute', left: 0, top: 0 } },\n        this.props.children\n      )];\n\n      if (this.props.onChangeViewport) {\n        content = _react2.default.createElement(\n          _mapInteractions2.default,\n          {\n            onMouseDown: this._onMouseDown,\n            onMouseDrag: this._onMouseDrag,\n            onMouseRotate: this._onMouseRotate,\n            onMouseUp: this._onMouseUp,\n            onMouseMove: this._onMouseMove,\n            onZoom: this._onZoom,\n            onZoomEnd: this._onZoomEnd,\n            width: this.props.width,\n            height: this.props.height,\n            zoomDisabled: this.props.zoomDisabled,\n            dragDisabled: this.props.dragDisabled },\n          content\n        );\n      }\n\n      return _react2.default.createElement(\n        'div',\n        {\n          style: _extends({}, this.props.style, {\n            width: this.props.width,\n            height: this.props.height,\n            position: 'relative'\n          }) },\n        content\n      );\n    }\n  }]);\n\n  return MapGL;\n}(_react.Component), (_applyDecoratedDescriptor(_class2.prototype, '_onMouseDown', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseDown'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseDrag'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseRotate', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseRotate'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseMove', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseMove'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseUp', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseUp'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onZoom', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onZoom'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onZoomEnd', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onZoomEnd'), _class2.prototype)), _class2)) || _class;\n\nexports.default = MapGL;\n\n\nfunction mod(value, divisor) {\n  var modulus = value % divisor;\n  return modulus < 0 ? divisor + modulus : modulus;\n}\n\nfunction unprojectFromTransform(transform, point) {\n  return transform.pointLocation(_mapboxGl.Point.convert(point));\n}\n\nfunction cloneTransform(original) {\n  var transform = new _transform2.default(original._minZoom, original._maxZoom);\n  transform.latRange = original.latRange;\n  transform.width = original.width;\n  transform.height = original.height;\n  transform.zoom = original.zoom;\n  transform.center = original.center;\n  transform.angle = original.angle;\n  transform.altitude = original.altitude;\n  transform.pitch = original.pitch;\n  transform.bearing = original.bearing;\n  transform.altitude = original.altitude;\n  return transform;\n}\n\nMapGL.propTypes = PROP_TYPES;\nMapGL.childContextTypes = CHILD_CONTEXT_TYPES;\nMapGL.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAucmVhY3QuanMiXSwibmFtZXMiOlsiTUFYX1BJVENIIiwiUElUQ0hfTU9VU0VfVEhSRVNIT0xEIiwiUElUQ0hfQUNDRUwiLCJQUk9QX1RZUEVTIiwibGF0aXR1ZGUiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwibG9uZ2l0dWRlIiwiem9vbSIsIm1hcFN0eWxlIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiaW5zdGFuY2VPZiIsIkltbXV0YWJsZSIsIk1hcCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwib25DaGFuZ2VWaWV3cG9ydCIsImZ1bmMiLCJvbk1hcExvYWRlZCIsIndpZHRoIiwiaGVpZ2h0IiwiaXNEcmFnZ2luZyIsImJvb2wiLCJzdGFydERyYWdMbmdMYXQiLCJhcnJheSIsIm9uSG92ZXJGZWF0dXJlcyIsImlnbm9yZUVtcHR5RmVhdHVyZXMiLCJhdHRyaWJ1dGlvbkNvbnRyb2wiLCJvbkNsaWNrRmVhdHVyZXMiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJwcmV2ZW50U3R5bGVEaWZmaW5nIiwicGVyc3BlY3RpdmVFbmFibGVkIiwiYmVhcmluZyIsInBpdGNoIiwiYWx0aXR1ZGUiLCJkcmFnRGlzYWJsZWQiLCJ6b29tRGlzYWJsZWQiLCJib3VuZHMiLCJMaXN0IiwiREVGQVVMVF9QUk9QUyIsImNvbmZpZyIsIkRFRkFVTFRTIiwiTUFQQk9YX0FQSV9BQ0NFU1NfVE9LRU4iLCJDSElMRF9DT05URVhUX1RZUEVTIiwibWFwIiwib2JqZWN0IiwiTWFwR0wiLCJwdXJlUmVuZGVyIiwicHJvcHMiLCJzdGF0ZSIsInN0YXJ0QmVhcmluZyIsInN0YXJ0UGl0Y2giLCJtYXBib3hnbCIsImFjY2Vzc1Rva2VuIiwiX21hcFJlYWR5IiwiZ2V0Q2hpbGRDb250ZXh0IiwiX21hcCIsInRvSlMiLCJjb250YWluZXIiLCJyZWZzIiwibWFwYm94TWFwIiwiY2VudGVyIiwic3R5bGUiLCJpbnRlcmFjdGl2ZSIsImQzIiwic2VsZWN0IiwiZ2V0Q2FudmFzIiwiX3VwZGF0ZU1hcFZpZXdwb3J0IiwiX2NhbGxPbkNoYW5nZVZpZXdwb3J0IiwidHJhbnNmb3JtIiwib24iLCJuZXdQcm9wcyIsIl91cGRhdGVTdGF0ZUZyb21Qcm9wcyIsIl91cGRhdGVNYXBTdHlsZSIsInNldFN0YXRlIiwiX3VwZGF0ZU1hcFNpemUiLCJyZW1vdmUiLCJpc0ludGVyYWN0aXZlIiwib25DbGlja0ZlYXR1cmUiLCJDVVJTT1IiLCJHUkFCQklORyIsIkdSQUIiLCJvbGRQcm9wcyIsInNsaWNlIiwicHJldlN0eWxlIiwibmV4dFN0eWxlIiwicHJldktleXNNYXAiLCJzdHlsZUtleXNNYXAiLCJuZXh0S2V5c01hcCIsImRlbGV0ZSIsInByb3BzT3RoZXJUaGFuTGF5ZXJzT3JTb3VyY2VzRGlmZmVyIiwicHJldktleXNMaXN0IiwiT2JqZWN0Iiwia2V5cyIsIm5leHRLZXlzTGlzdCIsImxlbmd0aCIsInNvbWUiLCJnZXQiLCJrZXkiLCJfZ2V0TWFwIiwic2V0U3R5bGUiLCJzb3VyY2VzRGlmZiIsImxheWVyc0RpZmYiLCJ1cGRhdGVzIiwibm9kZSIsImxheWVyIiwiZW50ZXIiLCJhZGRTb3VyY2UiLCJpZCIsInNvdXJjZSIsInVwZGF0ZSIsInJlbW92ZVNvdXJjZSIsImV4aXQiLCJleGl0aW5nIiwiZ2V0TGF5ZXIiLCJyZW1vdmVMYXllciIsImFkZExheWVyIiwiYmVmb3JlIiwib2xkTWFwU3R5bGUiLCJfc2V0RGlmZlN0eWxlIiwidmlld3BvcnRDaGFuZ2VkIiwianVtcFRvIiwiZml0Qm91bmRzIiwic2l6ZUNoYW5nZWQiLCJyZXNpemUiLCJwb3MiLCJzdGFydFBvcyIsInhEZWx0YSIsIngiLCJ5RGVsdGEiLCJ5IiwiTWF0aCIsImFicyIsInNjYWxlIiwieVNjYWxlIiwibWF4IiwibWluIiwib3B0cyIsImdldENvbnRhaW5lciIsInNjcm9sbEhlaWdodCIsInNjcm9sbFdpZHRoIiwibGF0IiwibW9kIiwibG5nIiwicHJvamVjdGlvbk1hdHJpeCIsInByb2pNYXRyaXgiLCJsbmdMYXQiLCJ1bnByb2plY3RGcm9tVHJhbnNmb3JtIiwiY2xvbmVUcmFuc2Zvcm0iLCJzZXRMb2NhdGlvbkF0UG9pbnQiLCJfY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nIiwib3B0IiwiZmVhdHVyZXMiLCJxdWVyeVJlbmRlcmVkRmVhdHVyZXMiLCJzaXplIiwiYmJveCIsImFyb3VuZCIsInNjYWxlWm9vbSIsImNsYXNzTmFtZSIsImN1cnNvciIsIl9jdXJzb3IiLCJjb250ZW50IiwicG9zaXRpb24iLCJsZWZ0IiwidG9wIiwiY2hpbGRyZW4iLCJfb25Nb3VzZURvd24iLCJfb25Nb3VzZURyYWciLCJfb25Nb3VzZVJvdGF0ZSIsIl9vbk1vdXNlVXAiLCJfb25Nb3VzZU1vdmUiLCJfb25ab29tIiwiX29uWm9vbUVuZCIsIkNvbXBvbmVudCIsImF1dG9iaW5kIiwidmFsdWUiLCJkaXZpc29yIiwibW9kdWx1cyIsInBvaW50IiwicG9pbnRMb2NhdGlvbiIsIlBvaW50IiwiY29udmVydCIsIm9yaWdpbmFsIiwiVHJhbnNmb3JtIiwiX21pblpvb20iLCJfbWF4Wm9vbSIsImxhdFJhbmdlIiwiYW5nbGUiLCJwcm9wVHlwZXMiLCJjaGlsZENvbnRleHRUeXBlcyIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7b0NBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQWNBO0FBQ0E7OztBQWRBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBLElBQU1BLFlBQVksRUFBbEI7QUFDQSxJQUFNQyx3QkFBd0IsRUFBOUI7QUFDQSxJQUFNQyxjQUFjLEdBQXBCOztBQUVBLElBQU1D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QUF6QztBQUNEOztBQUVELFNBQVM5QixzQkFBVCxDQUFnQzlFLFNBQWhDLEVBQTJDNkcsS0FBM0MsRUFBa0Q7QUFDaEQsU0FBTzdHLFVBQVU4RyxhQUFWLENBQXdCQyxnQkFBTUMsT0FBTixDQUFjSCxLQUFkLENBQXhCLENBQVA7QUFDRDs7QUFFRCxTQUFTOUIsY0FBVCxDQUF3QmtDLFFBQXhCLEVBQWtDO0FBQ2hDLE1BQU1qSCxZQUFZLElBQUlrSCxtQkFBSixDQUFjRCxTQUFTRSxRQUF2QixFQUFpQ0YsU0FBU0csUUFBMUMsQ0FBbEI7QUFDQXBILFlBQVVxSCxRQUFWLEdBQXFCSixTQUFTSSxRQUE5QjtBQUNBckgsWUFBVWxELEtBQVYsR0FBa0JtSyxTQUFTbkssS0FBM0I7QUFDQWtELFlBQVVqRCxNQUFWLEdBQW1Ca0ssU0FBU2xLLE1BQTVCO0FBQ0FpRCxZQUFVN0QsSUFBVixHQUFpQjhLLFNBQVM5SyxJQUExQjtBQUNBNkQsWUFBVVIsTUFBVixHQUFtQnlILFNBQVN6SCxNQUE1QjtBQUNBUSxZQUFVc0gsS0FBVixHQUFrQkwsU0FBU0ssS0FBM0I7QUFDQXRILFlBQVVuQyxRQUFWLEdBQXFCb0osU0FBU3BKLFFBQTlCO0FBQ0FtQyxZQUFVcEMsS0FBVixHQUFrQnFKLFNBQVNySixLQUEzQjtBQUNBb0MsWUFBVXJDLE9BQVYsR0FBb0JzSixTQUFTdEosT0FBN0I7QUFDQXFDLFlBQVVuQyxRQUFWLEdBQXFCb0osU0FBU3BKLFFBQTlCO0FBQ0EsU0FBT21DLFNBQVA7QUFDRDs7QUFFRHZCLE1BQU04SSxTQUFOLEdBQWtCMUwsVUFBbEI7QUFDQTRDLE1BQU0rSSxpQkFBTixHQUEwQmxKLG1CQUExQjtBQUNBRyxNQUFNZ0osWUFBTixHQUFxQnZKLGFBQXJCIiwiZmlsZSI6Im1hcC5yZWFjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCBwdXJlUmVuZGVyIGZyb20gJ3B1cmUtcmVuZGVyLWRlY29yYXRvcic7XG5pbXBvcnQgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IG1hcGJveGdsLCB7UG9pbnR9IGZyb20gJ21hcGJveC1nbCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IE1hcEludGVyYWN0aW9ucyBmcm9tICcuL21hcC1pbnRlcmFjdGlvbnMucmVhY3QnO1xuaW1wb3J0IGRpZmZTdHlsZXMgZnJvbSAnLi9kaWZmLXN0eWxlcyc7XG5cbi8vIE5PVEU6IFRyYW5zZm9ybSBpcyBub3QgYSBwdWJsaWMgQVBJIHNvIHdlIHNob3VsZCBiZSBjYXJlZnVsIHRvIGFsd2F5cyBsb2NrXG4vLyBkb3duIG1hcGJveC1nbCB0byBhIHNwZWNpZmljIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIHZlcnNpb24uXG5pbXBvcnQgVHJhbnNmb3JtIGZyb20gJ21hcGJveC1nbC9qcy9nZW8vdHJhbnNmb3JtJztcblxuLy8gTm90ZTogTWF4IHBpdGNoIGlzIGEgaGFyZCBjb2RlZCB2YWx1ZSAobm90IGEgbmFtZWQgY29uc3RhbnQpIGluIHRyYW5zZm9ybS5qc1xuY29uc3QgTUFYX1BJVENIID0gNjA7XG5jb25zdCBQSVRDSF9NT1VTRV9USFJFU0hPTEQgPSAyMDtcbmNvbnN0IFBJVENIX0FDQ0VMID0gMS4yO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICAvKipcbiAgICAqIFRoZSBsYXRpdHVkZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXAuXG4gICAgKi9cbiAgbGF0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAgKiBUaGUgbG9uZ2l0dWRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG1hcC5cbiAgICAqL1xuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAgKiBUaGUgdGlsZSB6b29tIGxldmVsIG9mIHRoZSBtYXAuXG4gICAgKi9cbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKipcbiAgICAqIFRoZSBNYXBib3ggc3R5bGUgdGhlIGNvbXBvbmVudCBzaG91bGQgdXNlLiBDYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHVybFxuICAgICogb3IgYSBNYXBib3hHTCBzdHlsZSBJbW11dGFibGUuTWFwIG9iamVjdC5cbiAgICAqL1xuICBtYXBTdHlsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihJbW11dGFibGUuTWFwKVxuICBdKSxcbiAgLyoqXG4gICAgKiBUaGUgTWFwYm94IEFQSSBhY2Nlc3MgdG9rZW4gdG8gcHJvdmlkZSB0byBtYXBib3gtZ2wtanMuIFRoaXMgaXMgcmVxdWlyZWRcbiAgICAqIHdoZW4gdXNpbmcgTWFwYm94IHByb3ZpZGVkIHZlY3RvciB0aWxlcyBhbmQgc3R5bGVzLlxuICAgICovXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICAqIGBvbkNoYW5nZVZpZXdwb3J0YCBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0ZWQgd2l0aCB0aGVcbiAgICAqIG1hcC4gVGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGNvbnRhaW5lcnMgYGxhdGl0dWRlYCxcbiAgICAqIGBsb25naXR1ZGVgIGFuZCBgem9vbWAgaW5mb3JtYXRpb24uXG4gICAgKi9cbiAgb25DaGFuZ2VWaWV3cG9ydDogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgICogYG9uTWFwTG9hZGVkYCBjYWxsYmFjayBpcyBmaXJlZCBvbiB0aGUgbWFwJ3MgJ2xvYWQnIGV2ZW50XG4gICAgKi9cbiAgb25NYXBMb2FkZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbWFwLiBOdW1iZXIgaW4gcGl4ZWxzIG9yIENTUyBzdHJpbmcgcHJvcCBlLmcuICcxMDAlJ1xuICAgICovXG4gIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgIFByb3BUeXBlcy5zdHJpbmdcbiAgXSksXG4gIC8qKlxuICAgICogVGhlIGhlaWdodCBvZiB0aGUgbWFwLiBOdW1iZXIgaW4gcGl4ZWxzIG9yIENTUyBzdHJpbmcgcHJvcCBlLmcuICcxMDAlJ1xuICAgICovXG4gIGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICBQcm9wVHlwZXMuc3RyaW5nXG4gIF0pLFxuICAvKipcbiAgICAqIElzIHRoZSBjb21wb25lbnQgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQuIFRoaXMgaXMgdXNlZCB0byBzaG93L2hpZGUgdGhlXG4gICAgKiBkcmFnIGN1cnNvci4gQWxzbyB1c2VkIGFzIGFuIG9wdGltaXphdGlvbiBpbiBzb21lIG92ZXJsYXlzIGJ5IHByZXZlbnRpbmdcbiAgICAqIHJlbmRlcmluZyB3aGlsZSBkcmFnZ2luZy5cbiAgICAqL1xuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAgKiBSZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIG1vdXNlIHByb2plY3Rpb24gYWZ0ZXIgdGhlIGZpcnN0IGNsaWNrIGV2ZW50XG4gICAgKiBkdXJpbmcgZHJhZ2dpbmcuIFdoZXJlIHRoZSBtYXAgaXMgZGVwZW5kcyBvbiB3aGVyZSB5b3UgZmlyc3QgY2xpY2tlZCBvblxuICAgICogdGhlIG1hcC5cbiAgICAqL1xuICBzdGFydERyYWdMbmdMYXQ6IFByb3BUeXBlcy5hcnJheSxcbiAgLyoqXG4gICAgKiBDYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgaG92ZXJlZCBvdmVyLiBGZWF0dXJlcyBtdXN0IHNldCB0aGVcbiAgICAqIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgdG8gYHRydWVgIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuIHNlZSB0aGVcbiAgICAqIE1hcGJveCBleGFtcGxlOiBodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZlYXR1cmVzYXQvXG4gICAgKiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGNhbGxiYWNrIHdpbGwgYmUgdGhlIGFycmF5IG9mIGZlYXR1cmUgdGhlXG4gICAgKiBtb3VzZSBpcyBvdmVyLiBUaGlzIGlzIHRoZSBzYW1lIHJlc3BvbnNlIHJldHVybmVkIGZyb20gYGZlYXR1cmVzQXRgLlxuICAgICovXG4gIG9uSG92ZXJGZWF0dXJlczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgICogRGVmYXVsdHMgdG8gVFJVRVxuICAgICogU2V0IHRvIGZhbHNlIHRvIGVuYWJsZSBvbkhvdmVyRmVhdHVyZXMgdG8gYmUgY2FsbGVkIHJlZ2FyZGxlc3MgaWZcbiAgICAqIHRoZXJlIGlzIGFuIGFjdHVhbCBmZWF0dXJlIGF0IHgsIHkuIFRoaXMgaXMgdXNlZnVsIHRvIGVtdWxhdGVcbiAgICAqIFwibW91c2Utb3V0XCIgYmVoYXZpb3JzIG9uIGZlYXR1cmVzLlxuICAgICovXG4gIGlnbm9yZUVtcHR5RmVhdHVyZXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogU2hvdyBhdHRyaWJ1dGlvbiBjb250cm9sIG9yIG5vdC5cbiAgICAqL1xuICBhdHRyaWJ1dGlvbkNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogQ2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb24uIEZlYXR1cmVzIG11c3Qgc2V0IHRoZVxuICAgICogYGludGVyYWN0aXZlYCBwcm9wZXJ0eSB0byBgdHJ1ZWAgZm9yIHRoaXMgdG8gd29yayBwcm9wZXJseS4gc2VlIHRoZVxuICAgICogTWFwYm94IGV4YW1wbGU6IGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmVhdHVyZXNhdC9cbiAgICAqIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgY2FsbGJhY2sgd2lsbCBiZSB0aGUgYXJyYXkgb2YgZmVhdHVyZSB0aGVcbiAgICAqIG1vdXNlIGlzIG92ZXIuIFRoaXMgaXMgdGhlIHNhbWUgcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSBgZmVhdHVyZXNBdGAuXG4gICAgKi9cbiAgb25DbGlja0ZlYXR1cmVzOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICAqIFBhc3NlZCB0byBNYXBib3ggTWFwIGNvbnN0cnVjdG9yIHdoaWNoIHBhc3NlcyBpdCB0byB0aGUgY2FudmFzIGNvbnRleHQuXG4gICAgKiBUaGlzIGlzIHVuc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBleHBvcnQgdGhlIGNhbnZhcyBhcyBhIFBORy5cbiAgICAqL1xuICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogVGhlcmUgYXJlIHN0aWxsIGtub3duIGlzc3VlcyB3aXRoIHN0eWxlIGRpZmZpbmcuIEFzIGEgdGVtcG9yYXJ5IHN0b3BnYXAsXG4gICAgKiBhZGQgdGhlIG9wdGlvbiB0byBwcmV2ZW50IHN0eWxlIGRpZmZpbmcuXG4gICAgKi9cbiAgcHJldmVudFN0eWxlRGlmZmluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBFbmFibGVzIHBlcnNwZWN0aXZlIGNvbnRyb2wgZXZlbnQgaGFuZGxpbmcgKENvbW1hbmQtcm90YXRlKVxuICAgICovXG4gIHBlcnNwZWN0aXZlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBTcGVjaWZ5IHRoZSBiZWFyaW5nIG9mIHRoZSB2aWV3cG9ydFxuICAgICovXG4gIGJlYXJpbmc6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAgKiBTcGVjaWZ5IHRoZSBwaXRjaCBvZiB0aGUgdmlld3BvcnRcbiAgICAqL1xuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICAqIFNwZWNpZnkgdGhlIGFsdGl0dWRlIG9mIHRoZSB2aWV3cG9ydCBjYW1lcmFcbiAgICAqIFVuaXQ6IG1hcCBoZWlnaHRzLCBkZWZhdWx0IDEuNVxuICAgICogTm9uLXB1YmxpYyBBUEksIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTEzN1xuICAgICovXG4gIGFsdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgICogRGlzYWJsZWQgZHJhZ2dpbmcgb2YgdGhlIG1hcFxuICAgICovXG4gIGRyYWdEaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBEaXNhYmxlZCB6b29taW5nIG9mIHRoZSBtYXBcbiAgICAqL1xuICB6b29tRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogQm91bmRzIHRvIGZpdCBvbiBzY3JlZW5cbiAgICAqL1xuICBib3VuZHM6IFByb3BUeXBlcy5pbnN0YW5jZU9mKEltbXV0YWJsZS5MaXN0KVxufTtcblxuY29uc3QgREVGQVVMVF9QUk9QUyA9IHtcbiAgbWFwU3R5bGU6ICdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY4JyxcbiAgb25DaGFuZ2VWaWV3cG9ydDogbnVsbCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IGNvbmZpZy5ERUZBVUxUUy5NQVBCT1hfQVBJX0FDQ0VTU19UT0tFTixcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuICBpZ25vcmVFbXB0eUZlYXR1cmVzOiB0cnVlLFxuICBiZWFyaW5nOiAwLFxuICBwaXRjaDogMCxcbiAgYWx0aXR1ZGU6IDEuNVxufTtcblxuY29uc3QgQ0hJTERfQ09OVEVYVF9UWVBFUyA9IHtcbiAgbWFwOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5AcHVyZVJlbmRlclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFwR0wgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIHN0YXJ0RHJhZ0xuZ0xhdDogbnVsbCxcbiAgICAgIHN0YXJ0QmVhcmluZzogbnVsbCxcbiAgICAgIHN0YXJ0UGl0Y2g6IG51bGxcbiAgICB9O1xuICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gcHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW47XG5cbiAgICB0aGlzLl9tYXBSZWFkeSA9IGZhbHNlO1xuXG4gICAgdGhpcy5nZXRDaGlsZENvbnRleHQgPSAoKSA9PiAoe1xuICAgICAgbWFwOiB0aGlzLl9tYXBcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IG1hcFN0eWxlID0gdGhpcy5wcm9wcy5tYXBTdHlsZSBpbnN0YW5jZW9mIEltbXV0YWJsZS5NYXAgP1xuICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZS50b0pTKCkgOlxuICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZTtcbiAgICBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5yZWZzLm1hcGJveE1hcCxcbiAgICAgIGNlbnRlcjogW3RoaXMucHJvcHMubG9uZ2l0dWRlLCB0aGlzLnByb3BzLmxhdGl0dWRlXSxcbiAgICAgIHpvb206IHRoaXMucHJvcHMuem9vbSxcbiAgICAgIHBpdGNoOiB0aGlzLnByb3BzLnBpdGNoLFxuICAgICAgYmVhcmluZzogdGhpcy5wcm9wcy5iZWFyaW5nLFxuICAgICAgc3R5bGU6IG1hcFN0eWxlLFxuICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0aGlzLnByb3BzLnByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICAgLy8gVE9ETz9cbiAgICAgIC8vIGF0dHJpYnV0aW9uQ29udHJvbDogdGhpcy5wcm9wcy5hdHRyaWJ1dGlvbkNvbnRyb2xcbiAgICB9KTtcblxuICAgIGQzLnNlbGVjdChtYXAuZ2V0Q2FudmFzKCkpLnN0eWxlKCdvdXRsaW5lJywgJ25vbmUnKTtcblxuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydCh7fSwgdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vbk1hcExvYWRlZCkge1xuICAgICAgbWFwLm9uKCdsb2FkJywgKCkgPT4gdGhpcy5wcm9wcy5vbk1hcExvYWRlZChtYXApKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0IGZvciBleHRlcm5hbCBtYW5pcHVsYXRpb24gb2YgdW5kZXJseWluZyBtYXBcbiAgICAvLyBUT0RPIGEgYmV0dGVyIGFwcHJvYWNoXG4gICAgbWFwLm9uKCdzdHlsZS5sb2FkJywgKCkgPT4gdGhpcy5fbWFwUmVhZHkgPSB0cnVlKTtcbiAgICBtYXAub24oJ21vdmVlbmQnLCAoKSA9PiB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydChtYXAudHJhbnNmb3JtKSk7XG4gICAgbWFwLm9uKCd6b29tZW5kJywgKCkgPT4gdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSkpO1xuICB9XG5cbiAgLy8gTmV3IHByb3BzIGFyZSBjb21pbicgcm91bmQgdGhlIGNvcm5lciFcbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcykge1xuICAgIHRoaXMuX3VwZGF0ZVN0YXRlRnJvbVByb3BzKHRoaXMucHJvcHMsIG5ld1Byb3BzKTtcbiAgICB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydCh0aGlzLnByb3BzLCBuZXdQcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlTWFwU3R5bGUodGhpcy5wcm9wcywgbmV3UHJvcHMpO1xuICAgIC8vIFNhdmUgd2lkdGgvaGVpZ2h0IHNvIHRoYXQgd2UgY2FuIGNoZWNrIHRoZW0gaW4gY29tcG9uZW50RGlkVXBkYXRlXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB3aWR0aDogdGhpcy5wcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5wcm9wcy5oZWlnaHRcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAvLyBtYXAucmVzaXplKCkgcmVhZHMgc2l6ZSBmcm9tIERPTSwgd2UgbmVlZCB0byBjYWxsIGFmdGVyIHJlbmRlclxuICAgIHRoaXMuX3VwZGF0ZU1hcFNpemUodGhpcy5zdGF0ZSwgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgX2N1cnNvcigpIHtcbiAgICBjb25zdCBpc0ludGVyYWN0aXZlID1cbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCB8fFxuICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrRmVhdHVyZSB8fFxuICAgICAgdGhpcy5wcm9wcy5vbkhvdmVyRmVhdHVyZXM7XG4gICAgaWYgKGlzSW50ZXJhY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmlzRHJhZ2dpbmcgP1xuICAgICAgICBjb25maWcuQ1VSU09SLkdSQUJCSU5HIDogY29uZmlnLkNVUlNPUi5HUkFCO1xuICAgIH1cbiAgICByZXR1cm4gJ2luaGVyaXQnO1xuICB9XG5cbiAgX2dldE1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwO1xuICB9XG5cbiAgX3VwZGF0ZVN0YXRlRnJvbVByb3BzKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gbmV3UHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW47XG4gICAgY29uc3Qge3N0YXJ0RHJhZ0xuZ0xhdH0gPSBuZXdQcm9wcztcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN0YXJ0RHJhZ0xuZ0xhdDogc3RhcnREcmFnTG5nTGF0ICYmIHN0YXJ0RHJhZ0xuZ0xhdC5zbGljZSgpXG4gICAgfSk7XG4gIH1cblxuICAvLyBJbmRpdmlkdWFsbHkgdXBkYXRlIHRoZSBtYXBzIHNvdXJjZSBhbmQgbGF5ZXJzIHRoYXQgaGF2ZSBjaGFuZ2VkIGlmIGFsbFxuICAvLyBvdGhlciBzdHlsZSBwcm9wcyBoYXZlbid0IGNoYW5nZWQuIFRoaXMgcHJldmVudHMgZmxpY2tpbmcgb2YgdGhlIG1hcCB3aGVuXG4gIC8vIHN0eWxlcyBvbmx5IGNoYW5nZSBzb3VyY2VzIG9yIGxheWVycy5cbiAgX3NldERpZmZTdHlsZShwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICAgIGNvbnN0IHByZXZLZXlzTWFwID0gcHJldlN0eWxlICYmIHN0eWxlS2V5c01hcChwcmV2U3R5bGUpIHx8IHt9O1xuICAgIGNvbnN0IG5leHRLZXlzTWFwID0gc3R5bGVLZXlzTWFwKG5leHRTdHlsZSk7XG4gICAgZnVuY3Rpb24gc3R5bGVLZXlzTWFwKHN0eWxlKSB7XG4gICAgICByZXR1cm4gc3R5bGUubWFwKCgpID0+IHRydWUpLmRlbGV0ZSgnbGF5ZXJzJykuZGVsZXRlKCdzb3VyY2VzJykudG9KUygpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wc090aGVyVGhhbkxheWVyc09yU291cmNlc0RpZmZlcigpIHtcbiAgICAgIGNvbnN0IHByZXZLZXlzTGlzdCA9IE9iamVjdC5rZXlzKHByZXZLZXlzTWFwKTtcbiAgICAgIGNvbnN0IG5leHRLZXlzTGlzdCA9IE9iamVjdC5rZXlzKG5leHRLZXlzTWFwKTtcbiAgICAgIGlmIChwcmV2S2V5c0xpc3QubGVuZ3RoICE9PSBuZXh0S2V5c0xpc3QubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gYG5leHRTdHlsZWAgYW5kIGBwcmV2U3R5bGVgIHNob3VsZCBub3QgaGF2ZSB0aGUgc2FtZSBzZXQgb2YgcHJvcHMuXG4gICAgICBpZiAobmV4dEtleXNMaXN0LnNvbWUoXG4gICAgICAgIGtleSA9PiBwcmV2U3R5bGUuZ2V0KGtleSkgIT09IG5leHRTdHlsZS5nZXQoa2V5KVxuICAgICAgICAvLyBCdXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aG9zZSBwcm9wcyBpcyBkaWZmZXJlbnQuXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuXG4gICAgaWYgKCFwcmV2U3R5bGUgfHwgcHJvcHNPdGhlclRoYW5MYXllcnNPclNvdXJjZXNEaWZmZXIoKSkge1xuICAgICAgbWFwLnNldFN0eWxlKG5leHRTdHlsZS50b0pTKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtzb3VyY2VzRGlmZiwgbGF5ZXJzRGlmZn0gPSBkaWZmU3R5bGVzKHByZXZTdHlsZSwgbmV4dFN0eWxlKTtcblxuICAgIC8vIFRPRE86IEl0J3MgcmF0aGVyIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgc3R5bGUgZGlmZmluZyBpbiB0aGUgcHJlc2VuY2VcbiAgICAvLyBvZiByZWZzLiBGb3Igbm93LCBpZiBhbnkgc3R5bGUgdXBkYXRlIGhhcyBhIHJlZiwgZmFsbGJhY2sgdG8gbm8gZGlmZmluZy5cbiAgICAvLyBXZSBjYW4gY29tZSBiYWNrIHRvIHRoaXMgY2FzZSBpZiB0aGVyZSdzIGEgc29saWQgdXNlY2FzZS5cbiAgICBpZiAobGF5ZXJzRGlmZi51cGRhdGVzLnNvbWUobm9kZSA9PiBub2RlLmxheWVyLmdldCgncmVmJykpKSB7XG4gICAgICBtYXAuc2V0U3R5bGUobmV4dFN0eWxlLnRvSlMoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRlciBvZiBzb3VyY2VzRGlmZi5lbnRlcikge1xuICAgICAgbWFwLmFkZFNvdXJjZShlbnRlci5pZCwgZW50ZXIuc291cmNlLnRvSlMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXBkYXRlIG9mIHNvdXJjZXNEaWZmLnVwZGF0ZSkge1xuICAgICAgbWFwLnJlbW92ZVNvdXJjZSh1cGRhdGUuaWQpO1xuICAgICAgbWFwLmFkZFNvdXJjZSh1cGRhdGUuaWQsIHVwZGF0ZS5zb3VyY2UudG9KUygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBleGl0IG9mIHNvdXJjZXNEaWZmLmV4aXQpIHtcbiAgICAgIG1hcC5yZW1vdmVTb3VyY2UoZXhpdC5pZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhpdCBvZiBsYXllcnNEaWZmLmV4aXRpbmcpIHtcbiAgICAgIGlmIChtYXAuc3R5bGUuZ2V0TGF5ZXIoZXhpdC5pZCkpIHtcbiAgICAgICAgbWFwLnJlbW92ZUxheWVyKGV4aXQuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiBsYXllcnNEaWZmLnVwZGF0ZXMpIHtcbiAgICAgIGlmICghdXBkYXRlLmVudGVyKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gb2xkIGxheWVyIHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZC4gUmVtb3ZlIHRoZSBvbGQgbGF5ZXJcbiAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSBpZCBhbmQgYWRkIGl0IGJhY2sgYWdhaW4uXG4gICAgICAgIG1hcC5yZW1vdmVMYXllcih1cGRhdGUuaWQpO1xuICAgICAgfVxuICAgICAgbWFwLmFkZExheWVyKHVwZGF0ZS5sYXllci50b0pTKCksIHVwZGF0ZS5iZWZvcmUpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBtYXBTdHlsZSA9IG5ld1Byb3BzLm1hcFN0eWxlO1xuICAgIGNvbnN0IG9sZE1hcFN0eWxlID0gb2xkUHJvcHMubWFwU3R5bGU7XG4gICAgaWYgKG1hcFN0eWxlICE9PSBvbGRNYXBTdHlsZSkge1xuICAgICAgaWYgKG1hcFN0eWxlIGluc3RhbmNlb2YgSW1tdXRhYmxlLk1hcCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5wcmV2ZW50U3R5bGVEaWZmaW5nKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0TWFwKCkuc2V0U3R5bGUobWFwU3R5bGUudG9KUygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZXREaWZmU3R5bGUob2xkTWFwU3R5bGUsIG1hcFN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0TWFwKCkuc2V0U3R5bGUobWFwU3R5bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXBWaWV3cG9ydChvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCB2aWV3cG9ydENoYW5nZWQgPVxuICAgICAgbmV3UHJvcHMubGF0aXR1ZGUgIT09IG9sZFByb3BzLmxhdGl0dWRlIHx8XG4gICAgICBuZXdQcm9wcy5sb25naXR1ZGUgIT09IG9sZFByb3BzLmxvbmdpdHVkZSB8fFxuICAgICAgbmV3UHJvcHMuem9vbSAhPT0gb2xkUHJvcHMuem9vbSB8fFxuICAgICAgbmV3UHJvcHMucGl0Y2ggIT09IG9sZFByb3BzLnBpdGNoIHx8XG4gICAgICBuZXdQcm9wcy5iZWFyaW5nICE9PSBvbGRQcm9wcy5iZWFyaW5nIHx8XG4gICAgICBuZXdQcm9wcy5hbHRpdHVkZSAhPT0gb2xkUHJvcHMuYWx0aXR1ZGU7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcblxuICAgIGlmICh2aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgIG1hcC5qdW1wVG8oe1xuICAgICAgICBjZW50ZXI6IFtuZXdQcm9wcy5sb25naXR1ZGUsIG5ld1Byb3BzLmxhdGl0dWRlXSxcbiAgICAgICAgem9vbTogbmV3UHJvcHMuem9vbSxcbiAgICAgICAgYmVhcmluZzogbmV3UHJvcHMuYmVhcmluZyxcbiAgICAgICAgcGl0Y2g6IG5ld1Byb3BzLnBpdGNoXG4gICAgICB9KTtcblxuICAgICAgLy8gVE9ETyAtIGp1bXBUbyBkb2Vzbid0IGhhbmRsZSBhbHRpdHVkZVxuICAgICAgaWYgKG5ld1Byb3BzLmFsdGl0dWRlICE9PSBvbGRQcm9wcy5hbHRpdHVkZSkge1xuICAgICAgICBtYXAudHJhbnNmb3JtLmFsdGl0dWRlID0gbmV3UHJvcHMuYWx0aXR1ZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFByb3BzLmJvdW5kcyAhPT0gbmV3UHJvcHMuYm91bmRzICYmIG5ld1Byb3BzLmJvdW5kcykge1xuICAgICAgbWFwLmZpdEJvdW5kcyhuZXdQcm9wcy5ib3VuZHMudG9KUygpKTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3RlOiBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgcmVuZGVyIChlLmcuIGluIGNvbXBvbmVudERpZFVwZGF0ZSlcbiAgX3VwZGF0ZU1hcFNpemUob2xkUHJvcHMsIG5ld1Byb3BzKSB7XG4gICAgY29uc3Qgc2l6ZUNoYW5nZWQgPVxuICAgICAgb2xkUHJvcHMud2lkdGggIT09IG5ld1Byb3BzLndpZHRoIHx8IG9sZFByb3BzLmhlaWdodCAhPT0gbmV3UHJvcHMuaGVpZ2h0O1xuXG4gICAgaWYgKHNpemVDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICAgIG1hcC5yZXNpemUoKTtcbiAgICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KG1hcC50cmFuc2Zvcm0pO1xuICAgIH1cbiAgfVxuXG4gIF9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoe3Bvcywgc3RhcnRQb3MsIHN0YXJ0QmVhcmluZywgc3RhcnRQaXRjaH0pIHtcbiAgICBjb25zdCB4RGVsdGEgPSBwb3MueCAtIHN0YXJ0UG9zLng7XG4gICAgY29uc3QgYmVhcmluZyA9IHN0YXJ0QmVhcmluZyArIDE4MCAqIHhEZWx0YSAvIHRoaXMucHJvcHMud2lkdGg7XG5cbiAgICBsZXQgcGl0Y2ggPSBzdGFydFBpdGNoO1xuICAgIGNvbnN0IHlEZWx0YSA9IHBvcy55IC0gc3RhcnRQb3MueTtcbiAgICBpZiAoeURlbHRhID4gMCkge1xuICAgICAgLy8gRHJhZ2dpbmcgZG93bndhcmRzLCBncmFkdWFsbHkgZGVjcmVhc2UgcGl0Y2hcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnByb3BzLmhlaWdodCAtIHN0YXJ0UG9zLnkpID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0geURlbHRhIC8gKHRoaXMucHJvcHMuaGVpZ2h0IC0gc3RhcnRQb3MueSk7XG4gICAgICAgIHBpdGNoID0gKDEgLSBzY2FsZSkgKiBQSVRDSF9BQ0NFTCAqIHN0YXJ0UGl0Y2g7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5RGVsdGEgPCAwKSB7XG4gICAgICAvLyBEcmFnZ2luZyB1cHdhcmRzLCBncmFkdWFsbHkgaW5jcmVhc2UgcGl0Y2hcbiAgICAgIGlmIChzdGFydFBvcy55ID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgIC8vIE1vdmUgZnJvbSAwIHRvIDEgYXMgd2UgZHJhZyB1cHdhcmRzXG4gICAgICAgIGNvbnN0IHlTY2FsZSA9IDEgLSBwb3MueSAvIHN0YXJ0UG9zLnk7XG4gICAgICAgIC8vIEdyYWR1YWxseSBhZGQgdW50aWwgd2UgaGl0IG1heCBwaXRjaFxuICAgICAgICBwaXRjaCA9IHN0YXJ0UGl0Y2ggKyB5U2NhbGUgKiAoTUFYX1BJVENIIC0gc3RhcnRQaXRjaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5kZWJ1ZyhzdGFydFBpdGNoLCBwaXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBpdGNoOiBNYXRoLm1heChNYXRoLm1pbihwaXRjaCwgTUFYX1BJVENIKSwgMCksXG4gICAgICBiZWFyaW5nXG4gICAgfTtcbiAgfVxuXG4gICAvLyBIZWxwZXIgdG8gY2FsbCBwcm9wcy5vbkNoYW5nZVZpZXdwb3J0XG4gIF9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIG9wdHMgPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHtzY3JvbGxIZWlnaHQ6IGhlaWdodCwgc2Nyb2xsV2lkdGg6IHdpZHRofSA9IHRoaXMuX2dldE1hcCgpLmdldENvbnRhaW5lcigpO1xuXG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlVmlld3BvcnQoe1xuICAgICAgICBsYXRpdHVkZTogdHJhbnNmb3JtLmNlbnRlci5sYXQsXG4gICAgICAgIGxvbmdpdHVkZTogbW9kKHRyYW5zZm9ybS5jZW50ZXIubG5nICsgMTgwLCAzNjApIC0gMTgwLFxuICAgICAgICB6b29tOiB0cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgcGl0Y2g6IHRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgYmVhcmluZzogbW9kKHRyYW5zZm9ybS5iZWFyaW5nICsgMTgwLCAzNjApIC0gMTgwLFxuXG4gICAgICAgIGlzRHJhZ2dpbmc6IHRoaXMucHJvcHMuaXNEcmFnZ2luZyxcbiAgICAgICAgc3RhcnREcmFnTG5nTGF0OiB0aGlzLnByb3BzLnN0YXJ0RHJhZ0xuZ0xhdCxcbiAgICAgICAgc3RhcnRCZWFyaW5nOiB0aGlzLnByb3BzLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgc3RhcnRQaXRjaDogdGhpcy5wcm9wcy5zdGFydFBpdGNoLFxuXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXg6IHRyYW5zZm9ybS5wcm9qTWF0cml4LFxuXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgd2lkdGgsXG5cbiAgICAgICAgLi4ub3B0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQGF1dG9iaW5kIF9vbk1vdXNlRG93bih7cG9zfSkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIGNvbnN0IGxuZ0xhdCA9IHVucHJvamVjdEZyb21UcmFuc2Zvcm0obWFwLnRyYW5zZm9ybSwgcG9zKTtcbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydChtYXAudHJhbnNmb3JtLCB7XG4gICAgICBpc0RyYWdnaW5nOiB0cnVlLFxuICAgICAgc3RhcnREcmFnTG5nTGF0OiBbbG5nTGF0LmxuZywgbG5nTGF0LmxhdF0sXG4gICAgICBzdGFydEJlYXJpbmc6IG1hcC50cmFuc2Zvcm0uYmVhcmluZyxcbiAgICAgIHN0YXJ0UGl0Y2g6IG1hcC50cmFuc2Zvcm0ucGl0Y2hcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25Nb3VzZURyYWcoe3Bvc30pIHtcbiAgICBpZiAoIXRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCB8fCB0aGlzLnByb3BzLmRyYWdEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRha2UgdGhlIHN0YXJ0IGxuZ2xhdCBhbmQgcHV0IGl0IHdoZXJlIHRoZSBtb3VzZSBpcyBkb3duLlxuICAgIGFzc2VydCh0aGlzLnByb3BzLnN0YXJ0RHJhZ0xuZ0xhdCwgJ2BzdGFydERyYWdMbmdMYXRgIHByb3AgaXMgcmVxdWlyZWQgJyArXG4gICAgICAnZm9yIG1vdXNlIGRyYWcgYmVoYXZpb3IgdG8gY2FsY3VsYXRlIHdoZXJlIHRvIHBvc2l0aW9uIHRoZSBtYXAuJyk7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KHRoaXMucHJvcHMuc3RhcnREcmFnTG5nTGF0LCBwb3MpO1xuICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KHRyYW5zZm9ybSwge1xuICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgQGF1dG9iaW5kIF9vbk1vdXNlUm90YXRlKHtwb3MsIHN0YXJ0UG9zfSkge1xuICAgIGlmICghdGhpcy5wcm9wcy5vbkNoYW5nZVZpZXdwb3J0IHx8ICF0aGlzLnByb3BzLnBlcnNwZWN0aXZlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtzdGFydEJlYXJpbmcsIHN0YXJ0UGl0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICBhc3NlcnQodHlwZW9mIHN0YXJ0QmVhcmluZyA9PT0gJ251bWJlcicsXG4gICAgICAnYHN0YXJ0QmVhcmluZ2AgcHJvcCBpcyByZXF1aXJlZCBmb3IgbW91c2Ugcm90YXRlIGJlaGF2aW9yJyk7XG4gICAgYXNzZXJ0KHR5cGVvZiBzdGFydFBpdGNoID09PSAnbnVtYmVyJyxcbiAgICAgICdgc3RhcnRQaXRjaGAgcHJvcCBpcyByZXF1aXJlZCBmb3IgbW91c2Ugcm90YXRlIGJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcblxuICAgIGNvbnN0IHtwaXRjaCwgYmVhcmluZ30gPSB0aGlzLl9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoe1xuICAgICAgcG9zLFxuICAgICAgc3RhcnRQb3MsXG4gICAgICBzdGFydEJlYXJpbmcsXG4gICAgICBzdGFydFBpdGNoXG4gICAgfSk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgdHJhbnNmb3JtLnBpdGNoID0gcGl0Y2g7XG5cbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25Nb3VzZU1vdmUob3B0KSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLm9uSG92ZXJGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIGNvbnN0IHBvcyA9IG9wdC5wb3M7XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoW3Bvcy54LCBwb3MueV0pO1xuICAgIGlmICghZmVhdHVyZXMubGVuZ3RoICYmIHRoaXMucHJvcHMuaWdub3JlRW1wdHlGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uSG92ZXJGZWF0dXJlcyhmZWF0dXJlcyk7XG4gIH1cblxuICBAYXV0b2JpbmQgX29uTW91c2VVcChvcHQpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMub25DbGlja0ZlYXR1cmVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gdGhpcy5fZ2V0TWFwKCk7XG4gICAgdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSwge1xuICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICBzdGFydERyYWdMbmdMYXQ6IG51bGwsXG4gICAgICBzdGFydEJlYXJpbmc6IG51bGwsXG4gICAgICBzdGFydFBpdGNoOiBudWxsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb3MgPSBvcHQucG9zO1xuXG4gICAgLy8gUmFkaXVzIGVuYWJsZXMgcG9pbnQgZmVhdHVyZXMsIGxpa2UgbWFya2VyIHN5bWJvbHMsIHRvIGJlIGNsaWNrZWQuXG4gICAgY29uc3Qgc2l6ZSA9IDE1O1xuICAgIGNvbnN0IGJib3ggPSBbW3Bvcy54IC0gc2l6ZSwgcG9zLnkgLSBzaXplXSwgW3Bvcy54ICsgc2l6ZSwgcG9zLnkgKyBzaXplXV07XG4gICAgY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGJib3gpO1xuICAgIGlmICghZmVhdHVyZXMubGVuZ3RoICYmIHRoaXMucHJvcHMuaWdub3JlRW1wdHlGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uQ2xpY2tGZWF0dXJlcyhmZWF0dXJlcyk7XG4gIH1cblxuICBAYXV0b2JpbmQgX29uWm9vbSh7cG9zLCBzY2FsZX0pIHtcbiAgICBpZiAodGhpcy5wcm9wcy56b29tRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICBjb25zdCBhcm91bmQgPSB1bnByb2plY3RGcm9tVHJhbnNmb3JtKHRyYW5zZm9ybSwgcG9zKTtcbiAgICB0cmFuc2Zvcm0uem9vbSA9IHRyYW5zZm9ybS5zY2FsZVpvb20obWFwLnRyYW5zZm9ybS5zY2FsZSAqIHNjYWxlKTtcbiAgICB0cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KGFyb3VuZCwgcG9zKTtcbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25ab29tRW5kKCkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KG1hcC50cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzTmFtZSwgd2lkdGgsIGhlaWdodCwgc3R5bGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtYXBTdHlsZSA9IHtcbiAgICAgIC4uLnN0eWxlLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBjdXJzb3I6IHRoaXMuX2N1cnNvcigpXG4gICAgfTtcblxuICAgIGxldCBjb250ZW50ID0gW1xuICAgICAgPGRpdiBrZXk9XCJtYXBcIiByZWY9XCJtYXBib3hNYXBcIlxuICAgICAgICBzdHlsZT17IG1hcFN0eWxlIH0gY2xhc3NOYW1lPXsgY2xhc3NOYW1lIH0vPixcbiAgICAgIDxkaXYga2V5PVwib3ZlcmxheXNcIiBjbGFzc05hbWU9XCJvdmVybGF5c1wiXG4gICAgICAgIHN0eWxlPXsge3Bvc2l0aW9uOiAnYWJzb2x1dGUnLCBsZWZ0OiAwLCB0b3A6IDB9IH0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5jaGlsZHJlbiB9XG4gICAgICA8L2Rpdj5cbiAgICBdO1xuXG4gICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCkge1xuICAgICAgY29udGVudCA9IChcbiAgICAgICAgPE1hcEludGVyYWN0aW9uc1xuICAgICAgICAgIG9uTW91c2VEb3duID17IHRoaXMuX29uTW91c2VEb3duIH1cbiAgICAgICAgICBvbk1vdXNlRHJhZyA9eyB0aGlzLl9vbk1vdXNlRHJhZyB9XG4gICAgICAgICAgb25Nb3VzZVJvdGF0ZSA9eyB0aGlzLl9vbk1vdXNlUm90YXRlIH1cbiAgICAgICAgICBvbk1vdXNlVXAgPXsgdGhpcy5fb25Nb3VzZVVwIH1cbiAgICAgICAgICBvbk1vdXNlTW92ZSA9eyB0aGlzLl9vbk1vdXNlTW92ZSB9XG4gICAgICAgICAgb25ab29tID17IHRoaXMuX29uWm9vbSB9XG4gICAgICAgICAgb25ab29tRW5kID17IHRoaXMuX29uWm9vbUVuZCB9XG4gICAgICAgICAgd2lkdGggPXsgdGhpcy5wcm9wcy53aWR0aCB9XG4gICAgICAgICAgaGVpZ2h0ID17IHRoaXMucHJvcHMuaGVpZ2h0IH1cbiAgICAgICAgICB6b29tRGlzYWJsZWQgPXsgdGhpcy5wcm9wcy56b29tRGlzYWJsZWQgfVxuICAgICAgICAgIGRyYWdEaXNhYmxlZCA9eyB0aGlzLnByb3BzLmRyYWdEaXNhYmxlZCB9PlxuXG4gICAgICAgICAgeyBjb250ZW50IH1cblxuICAgICAgICA8L01hcEludGVyYWN0aW9ucz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5zdHlsZSxcbiAgICAgICAgICB3aWR0aDogdGhpcy5wcm9wcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMucHJvcHMuaGVpZ2h0LFxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0gfT5cblxuICAgICAgICB7IGNvbnRlbnQgfVxuXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vZCh2YWx1ZSwgZGl2aXNvcikge1xuICBjb25zdCBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5cbmZ1bmN0aW9uIHVucHJvamVjdEZyb21UcmFuc2Zvcm0odHJhbnNmb3JtLCBwb2ludCkge1xuICByZXR1cm4gdHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwb2ludCkpO1xufVxuXG5mdW5jdGlvbiBjbG9uZVRyYW5zZm9ybShvcmlnaW5hbCkge1xuICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKG9yaWdpbmFsLl9taW5ab29tLCBvcmlnaW5hbC5fbWF4Wm9vbSk7XG4gIHRyYW5zZm9ybS5sYXRSYW5nZSA9IG9yaWdpbmFsLmxhdFJhbmdlO1xuICB0cmFuc2Zvcm0ud2lkdGggPSBvcmlnaW5hbC53aWR0aDtcbiAgdHJhbnNmb3JtLmhlaWdodCA9IG9yaWdpbmFsLmhlaWdodDtcbiAgdHJhbnNmb3JtLnpvb20gPSBvcmlnaW5hbC56b29tO1xuICB0cmFuc2Zvcm0uY2VudGVyID0gb3JpZ2luYWwuY2VudGVyO1xuICB0cmFuc2Zvcm0uYW5nbGUgPSBvcmlnaW5hbC5hbmdsZTtcbiAgdHJhbnNmb3JtLmFsdGl0dWRlID0gb3JpZ2luYWwuYWx0aXR1ZGU7XG4gIHRyYW5zZm9ybS5waXRjaCA9IG9yaWdpbmFsLnBpdGNoO1xuICB0cmFuc2Zvcm0uYmVhcmluZyA9IG9yaWdpbmFsLmJlYXJpbmc7XG4gIHRyYW5zZm9ybS5hbHRpdHVkZSA9IG9yaWdpbmFsLmFsdGl0dWRlO1xuICByZXR1cm4gdHJhbnNmb3JtO1xufVxuXG5NYXBHTC5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuTWFwR0wuY2hpbGRDb250ZXh0VHlwZXMgPSBDSElMRF9DT05URVhUX1RZUEVTO1xuTWFwR0wuZGVmYXVsdFByb3BzID0gREVGQVVMVF9QUk9QUztcbiJdfQ==\n\n/***/ }),\n/* 1003 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 1004 */\n/***/ (function(module, exports) {\n\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n\n/***/ }),\n/* 1005 */\n/***/ (function(module, exports) {\n\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n\n/***/ }),\n/* 1006 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * @author Félix Girault <felix.girault@gmail.com>\n * @license MIT\n */\n\n\nvar warning = __webpack_require__(1007);\nvar shallowEqual = __webpack_require__(247);\n\n\n\n/**\n * Tells if a component should update given it's next props\n * and state.\n *\n * @param object nextProps Next props.\n * @param object nextState Next state.\n */\nfunction shouldComponentUpdate(nextProps, nextState) {\n  return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState);\n}\n\n/**\n * Returns a text description of the component that can be\n * used to identify it in error messages.\n *\n * @see https://github.com/facebook/react/blob/v15.4.0-rc.3/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js#L1143\n * @param {function} component The component.\n * @return {string} The name of the component.\n */\nfunction getComponentName(component) {\n  var constructor = component.prototype && component.prototype.constructor;\n\n  return (\n    component.displayName\n    || (constructor && constructor.displayName)\n    || component.name\n    || (constructor && constructor.name)\n    || 'a component'\n  );\n}\n\n/**\n * Makes the given component \"pure\".\n *\n * @param object component Component.\n */\nfunction pureRenderDecorator(component) {\n  if (component.prototype.shouldComponentUpdate !== undefined) {\n    // We're not using the condition mecanism of warning()\n    // here to avoid useless calls to getComponentName().\n    warning(\n      false,\n      'Cannot decorate `%s` with @pureRenderDecorator, '\n      + 'because it already implements `shouldComponentUpdate().',\n      getComponentName(component)\n    )\n  }\n\n  component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n  return component;\n}\n\n\n\nmodule.exports = pureRenderDecorator;\n\n\n/***/ }),\n/* 1007 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n\n\nvar emptyFunction = __webpack_require__(246);\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (false) {\n  var printWarning = function printWarning(format) {\n    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    var argIndex = 0;\n    var message = 'Warning: ' + format.replace(/%s/g, function () {\n      return args[argIndex++];\n    });\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n\n  warning = function warning(condition, format) {\n    if (format === undefined) {\n      throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n    }\n\n    if (format.indexOf('Failed Composite propType: ') === 0) {\n      return; // Ignore CompositeComponent proptype check.\n    }\n\n    if (!condition) {\n      for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n        args[_key2 - 2] = arguments[_key2];\n      }\n\n      printWarning.apply(undefined, [format].concat(args));\n    }\n  };\n}\n\nmodule.exports = warning;\n\n/***/ }),\n/* 1008 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"_args\":[[\"mapbox-gl@0.20.1\",\"/srv/opengov\"]],\"_from\":\"mapbox-gl@0.20.1\",\"_id\":\"mapbox-gl@0.20.1\",\"_inBundle\":false,\"_integrity\":\"sha1-wiy+f9OuQ7jg/6ItCICYfJOxvkE=\",\"_location\":\"/react-map-gl/mapbox-gl\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"mapbox-gl@0.20.1\",\"name\":\"mapbox-gl\",\"escapedName\":\"mapbox-gl\",\"rawSpec\":\"0.20.1\",\"saveSpec\":null,\"fetchSpec\":\"0.20.1\"},\"_requiredBy\":[\"/react-map-gl\"],\"_resolved\":\"https://artifactory.opengov.zone:443/artifactory/api/npm/npm/mapbox-gl/-/mapbox-gl-0.20.1.tgz\",\"_spec\":\"0.20.1\",\"_where\":\"/srv/opengov\",\"browser\":{\"./js/util/ajax.js\":\"./js/util/browser/ajax.js\",\"./js/util/browser.js\":\"./js/util/browser/browser.js\",\"./js/util/canvas.js\":\"./js/util/browser/canvas.js\",\"./js/util/dom.js\":\"./js/util/browser/dom.js\",\"./js/util/dispatcher.js\":\"./js/util/browser/dispatcher.js\"},\"browserify\":{\"transform\":[\"envify\"]},\"bugs\":{\"url\":\"https://github.com/mapbox/mapbox-gl-js/issues\"},\"dependencies\":{\"csscolorparser\":\"^1.0.2\",\"earcut\":\"^2.0.3\",\"envify\":\"^3.4.0\",\"feature-filter\":\"^2.1.0\",\"geojson-rewind\":\"^0.1.0\",\"geojson-vt\":\"2.1.8\",\"gl-matrix\":\"^2.3.1\",\"grid-index\":\"^0.1.0\",\"mapbox-gl-function\":\"^1.2.1\",\"mapbox-gl-js-supported\":\"^1.1.0\",\"mapbox-gl-shaders\":\"github:mapbox/mapbox-gl-shaders#9af2892c56c74c4d2d7e5cc59b6e5e4fe3837c6f\",\"mapbox-gl-style-spec\":\"^8.7.0\",\"minifyify\":\"^7.0.1\",\"pbf\":\"^1.3.2\",\"pngjs\":\"^2.2.0\",\"point-geometry\":\"^0.0.0\",\"quickselect\":\"^1.0.0\",\"request\":\"^2.39.0\",\"resolve-url\":\"^0.2.1\",\"shelf-pack\":\"^1.0.0\",\"supercluster\":\"^2.0.1\",\"unassertify\":\"^2.0.0\",\"unitbezier\":\"^0.0.0\",\"vector-tile\":\"^1.2.1\",\"vt-pbf\":\"^2.0.2\",\"webworkify\":\"1.2.0\",\"whoots-js\":\"^2.0.0\"},\"description\":\"A WebGL interactive maps library\",\"devDependencies\":{\"benchmark\":\"~2.1.0\",\"browserify\":\"^13.0.0\",\"browserify-middleware\":\"^7.0.0\",\"concat-stream\":\"1.5.1\",\"coveralls\":\"^2.11.8\",\"doctrine\":\"^1.2.1\",\"documentation\":\"https://github.com/documentationjs/documentation/archive/bb41619c734e59ef3fbc3648610032efcfdaaace.tar.gz\",\"documentation-theme-utils\":\"3.0.0\",\"eslint\":\"^2.5.3\",\"eslint-config-mourner\":\"^2.0.0\",\"express\":\"^4.13.4\",\"gl\":\"^4.0.1\",\"handlebars\":\"4.0.5\",\"highlight.js\":\"9.3.0\",\"istanbul\":\"^0.4.2\",\"lodash\":\"^4.13.1\",\"mapbox-gl-test-suite\":\"github:mapbox/mapbox-gl-test-suite#6d3bcff5d51f6acea41230ffabad6bebdea49fa3\",\"nyc\":\"^6.1.1\",\"remark\":\"4.2.2\",\"remark-html\":\"3.0.0\",\"sinon\":\"^1.15.4\",\"st\":\"^1.0.0\",\"tap\":\"^5.7.0\",\"through\":\"^2.3.7\",\"unist-util-visit\":\"1.1.0\",\"vinyl\":\"1.1.1\",\"vinyl-fs\":\"2.4.3\",\"watchify\":\"^3.2.2\"},\"engines\":{\"node\":\">=4.0.0\"},\"homepage\":\"https://github.com/mapbox/mapbox-gl-js#readme\",\"license\":\"BSD-3-Clause\",\"main\":\"js/mapbox-gl.js\",\"name\":\"mapbox-gl\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/mapbox/mapbox-gl-js.git\"},\"scripts\":{\"build-dev\":\"browserify -d js/mapbox-gl.js --standalone mapboxgl > dist/mapbox-gl-dev.js\",\"build-docs\":\"documentation build --github --format html -c documentation.yml --theme ./docs/_theme --output docs/api/\",\"build-min\":\"browserify js/mapbox-gl.js --debug --transform unassertify --plugin [minifyify --map mapbox-gl.js.map --output dist/mapbox-gl.js.map] --standalone mapboxgl > dist/mapbox-gl.js\",\"download-bench-data\":\"[ -f ./bench/data/naturalearth-land.json ] || (mkdir -p ./bench/data && curl -s https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_land.geojson > ./bench/data/naturalearth-land.json)\",\"lint\":\"eslint js test bench\",\"prepublish\":\"[ -z \\\"$BUILDPACK_DIR\\\" ] || npm run build-docs\",\"start\":\"npm run download-bench-data && node server.js\",\"start-docs\":\"npm run build-min && npm run build-docs && jekyll serve -w\",\"test\":\"npm run lint && npm run build-min && tap --reporter dot test/js/*/*.js # update ci.sh if test invocation changes\",\"test-suite\":\"node test/render.test.js && node test/query.test.js # update ci.sh if test invocation changes\"},\"version\":\"0.20.1\"}\n\n/***/ }),\n/* 1009 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Canvas = __webpack_require__(1010);\nvar util = __webpack_require__(10);\nvar browser = __webpack_require__(39);\nvar window = __webpack_require__(39).window;\nvar Evented = __webpack_require__(55);\nvar DOM = __webpack_require__(62);\n\nvar Style = __webpack_require__(540);\nvar AnimationLoop = __webpack_require__(559);\nvar Painter = __webpack_require__(1059);\n\nvar Transform = __webpack_require__(280);\nvar Hash = __webpack_require__(1076);\n\nvar bindHandlers = __webpack_require__(1077);\n\nvar Camera = __webpack_require__(1085);\nvar LngLat = __webpack_require__(89);\nvar LngLatBounds = __webpack_require__(198);\nvar Point = __webpack_require__(11);\nvar Attribution = __webpack_require__(577);\n\nvar defaultMinZoom = 0;\nvar defaultMaxZoom = 20;\nvar defaultOptions = {\n    center: [0, 0],\n    zoom: 0,\n    bearing: 0,\n    pitch: 0,\n\n    minZoom: defaultMinZoom,\n    maxZoom: defaultMaxZoom,\n\n    interactive: true,\n\n    scrollZoom: true,\n    boxZoom: true,\n    dragRotate: true,\n    dragPan: true,\n    keyboard: true,\n    doubleClickZoom: true,\n    touchZoomRotate: true,\n\n    bearingSnap: 7,\n\n    hash: false,\n\n    attributionControl: true,\n\n    failIfMajorPerformanceCaveat: false,\n    preserveDrawingBuffer: false,\n\n    trackResize: true,\n    workerCount: Math.max(browser.hardwareConcurrency - 1, 1)\n};\n\n/**\n * Creates a map instance. This is usually the beginning of your map:\n * you tell Mapbox GL JS where to put the map by specifying a `container`\n * option, and the map's style with `style` and other attributes of the map,\n * and in return Mapbox GL JS initializes the map on your page and returns\n * a map variable that lets you programmatically call methods on the map.\n * @class Map\n * @param {Object} options\n * @param {string|Element} options.container HTML element to initialize the map in (or element id as string)\n * @param {number} [options.minZoom=0] Minimum zoom of the map\n * @param {number} [options.maxZoom=20] Maximum zoom of the map\n * @param {Object|string} [options.style] Map style. This must be an an object conforming to the schema described in\n * the [style reference](https://mapbox.com/mapbox-gl-style-spec/), or a URL to a JSON style. To load a style from the\n * Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, where `:owner` is your Mapbox account\n * name and `:style` is the style ID. Or you can use one of [the predefined Mapbox styles](https://www.mapbox.com/maps/).\n * The Style URLs of the predefined Mapbox styles are:\n *  * `mapbox://styles/mapbox/streets-v9`\n *  * `mapbox://styles/mapbox/outdoors-v9`\n *  * `mapbox://styles/mapbox/light-v9`\n *  * `mapbox://styles/mapbox/dark-v9`\n *  * `mapbox://styles/mapbox/satellite-v9`\n *  * `mapbox://styles/mapbox/satellite-streets-v9`\n * @param {boolean} [options.hash=false] If `true`, the map will track and update the page URL according to map position\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners are attached to the map, so it will not respond to input\n * @param {number} [options.bearingSnap=7] Snap to north threshold in degrees.\n * @param {Array} [options.classes] Style class names with which to initialize the map\n * @param {boolean} [options.attributionControl=true] If `true`, an attribution control will be added to the map.\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected.\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, The maps canvas can be exported to a PNG using `map.getCanvas().toDataURL();`. This is false by default as a performance optimization.\n * @param {LngLatBounds|Array<Array<number>>} [options.maxBounds] If set, the map is constrained to the given bounds.\n * @param {boolean} [options.scrollZoom=true] If `true`, enable the \"scroll to zoom\" interaction (see `ScrollZoomHandler`)\n * @param {boolean} [options.boxZoom=true] If `true`, enable the \"box zoom\" interaction (see `BoxZoomHandler`)\n * @param {boolean} [options.dragRotate=true] If `true`, enable the \"drag to rotate\" interaction (see `DragRotateHandler`).\n * @param {boolean} [options.dragPan=true] If `true`, enable the \"drag to pan\" interaction (see `DragPanHandler`).\n * @param {boolean} [options.keyboard=true] If `true`, enable keyboard shortcuts (see `KeyboardHandler`).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, enable the \"double click to zoom\" interaction (see `DoubleClickZoomHandler`).\n * @param {boolean} [options.touchZoomRotate=true] If `true`, enable the \"pinch to rotate and zoom\" interaction (see `TouchZoomRotateHandler`).\n * @param {boolean} [options.trackResize=true]  If `true`, automatically resize the map when the browser window resizes.\n * @param {LngLat} [options.center] The geographic coordinate on which the map's initial viewport is centered.\n * @param {number} [options.zoom] The zoom level of the map's initial viewport.\n * @param {number} [options.bearing] The bearing (rotation) of the map's initial viewport measured in degrees counter-clockwise from north.\n * @param {number} [options.pitch] The pitch of the map's initial viewport measured in degrees.\n * @param {number} [options.workerCount=navigator.hardwareConcurrency - 1] The number of WebWorkers the map should use to process vector tile data.\n * @example\n * var map = new mapboxgl.Map({\n *   container: 'map',\n *   center: [-122.420679, 37.772537],\n *   zoom: 13,\n *   style: style_object,\n *   hash: true\n * });\n */\nvar Map = module.exports = function(options) {\n\n    options = util.extend({}, defaultOptions, options);\n\n    if (options.workerCount < 1) {\n        throw new Error('workerCount must an integer greater than or equal to 1.');\n    }\n\n    this._interactive = options.interactive;\n    this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n    this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n    this._trackResize = options.trackResize;\n    this._workerCount = options.workerCount;\n\n    if (typeof options.container === 'string') {\n        this._container = document.getElementById(options.container);\n    } else {\n        this._container = options.container;\n    }\n\n    this.animationLoop = new AnimationLoop();\n    this.transform = new Transform(options.minZoom, options.maxZoom);\n\n    if (options.maxBounds) {\n        this.setMaxBounds(options.maxBounds);\n    }\n\n    util.bindAll([\n        '_forwardStyleEvent',\n        '_forwardSourceEvent',\n        '_forwardLayerEvent',\n        '_forwardTileEvent',\n        '_onStyleLoad',\n        '_onStyleChange',\n        '_onSourceAdd',\n        '_onSourceRemove',\n        '_onSourceUpdate',\n        '_onWindowOnline',\n        '_onWindowResize',\n        'onError',\n        '_update',\n        '_render'\n    ], this);\n\n    this._setupContainer();\n    this._setupPainter();\n\n    this.on('move', this._update.bind(this, false));\n    this.on('zoom', this._update.bind(this, true));\n    this.on('moveend', function() {\n        this.animationLoop.set(300); // text fading\n        this._rerender();\n    }.bind(this));\n\n    if (typeof window !== 'undefined') {\n        window.addEventListener('online', this._onWindowOnline, false);\n        window.addEventListener('resize', this._onWindowResize, false);\n    }\n\n    bindHandlers(this, {\n        scrollZoom: options.interactive && options.scrollZoom,\n        boxZoom: options.interactive && options.boxZoom,\n        dragRotate: options.interactive && options.dragRotate,\n        dragPan: options.interactive && options.dragPan,\n        keyboard: options.interactive && options.keyboard,\n        doubleClickZoom: options.interactive && options.doubleClickZoom,\n        touchZoomRotate: options.interactive && options.touchZoomRotate\n    }, options);\n\n    this._hash = options.hash && (new Hash()).addTo(this);\n    // don't set position from options if set through hash\n    if (!this._hash || !this._hash._onHashChange()) {\n        this.jumpTo({\n            center: options.center,\n            zoom: options.zoom,\n            bearing: options.bearing,\n            pitch: options.pitch\n        });\n    }\n\n    this.stacks = {};\n    this._classes = [];\n\n    this.resize();\n\n    if (options.classes) this.setClasses(options.classes);\n    if (options.style) this.setStyle(options.style);\n    if (options.attributionControl) this.addControl(new Attribution(options.attributionControl));\n\n    this.on('error', this.onError);\n    this.on('style.error', this.onError);\n    this.on('source.error', this.onError);\n    this.on('tile.error', this.onError);\n    this.on('layer.error', this.onError);\n};\n\nutil.extend(Map.prototype, Evented);\nutil.extend(Map.prototype, Camera.prototype);\nutil.extend(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Adds a control to the map, calling `control.addTo(this)`.\n     *\n     * @param {Control} control\n     * @returns {Map} `this`\n     */\n    addControl: function(control) {\n        control.addTo(this);\n        return this;\n    },\n\n    /**\n     * Adds a style class to a map.\n     *\n     * @param {string} klass name of style class\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    addClass: function(klass, options) {\n        if (this._classes.indexOf(klass) >= 0 || klass === '') return this;\n        this._classes.push(klass);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Removes a style class from a map.\n     *\n     * @param {string} klass name of style class\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    removeClass: function(klass, options) {\n        var i = this._classes.indexOf(klass);\n        if (i < 0 || klass === '') return this;\n        this._classes.splice(i, 1);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Helper method to add more than one class.\n     *\n     * @param {Array<string>} klasses An array of class names\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    setClasses: function(klasses, options) {\n        var uniqueClasses = {};\n        for (var i = 0; i < klasses.length; i++) {\n            if (klasses[i] !== '') uniqueClasses[klasses[i]] = true;\n        }\n        this._classes = Object.keys(uniqueClasses);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Check whether a style class is active.\n     *\n     * @param {string} klass Name of style class\n     * @returns {boolean}\n     */\n    hasClass: function(klass) {\n        return this._classes.indexOf(klass) >= 0;\n    },\n\n    /**\n     * Return an array of the current active style classes.\n     *\n     * @returns {boolean}\n     */\n    getClasses: function() {\n        return this._classes;\n    },\n\n    /**\n     * Detect the map's new width and height and resize it. Given\n     * the `container` of the map specified in the Map constructor,\n     * this reads the new width from the DOM: so this method is often\n     * called after the map's container is resized by another script\n     * or the map is shown after being initially hidden with CSS.\n     *\n     * @returns {Map} `this`\n     */\n    resize: function() {\n        var width = 0, height = 0;\n\n        if (this._container) {\n            width = this._container.offsetWidth || 400;\n            height = this._container.offsetHeight || 300;\n        }\n\n        this._canvas.resize(width, height);\n        this.transform.resize(width, height);\n        this.painter.resize(width, height);\n\n        return this\n            .fire('movestart')\n            .fire('move')\n            .fire('resize')\n            .fire('moveend');\n    },\n\n    /**\n     * Get the map's geographical bounds.\n     *\n     * @returns {LngLatBounds}\n     */\n    getBounds: function() {\n        var bounds = new LngLatBounds(\n            this.transform.pointLocation(new Point(0, 0)),\n            this.transform.pointLocation(this.transform.size));\n\n        if (this.transform.angle || this.transform.pitch) {\n            bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0)));\n            bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y)));\n        }\n\n        return bounds;\n    },\n\n    /**\n     * Set constraint on the map's geographical bounds. Pan or zoom operations that would result in\n     * displaying regions that fall outside of the bounds instead result in displaying the map at the\n     * closest point and/or zoom level of the requested operation that is within the max bounds.\n     *\n     * @param {LngLatBounds | Array<Array<number>> | null | undefined} lnglatbounds Desired max bounds of the map. If null or undefined, function removes any bounds constraints on the map.\n     * @returns {Map} `this`\n     */\n    setMaxBounds: function (lnglatbounds) {\n        if (lnglatbounds) {\n            var b = LngLatBounds.convert(lnglatbounds);\n            this.transform.lngRange = [b.getWest(), b.getEast()];\n            this.transform.latRange = [b.getSouth(), b.getNorth()];\n            this.transform._constrain();\n            this._update();\n        } else if (lnglatbounds === null || lnglatbounds === undefined) {\n            this.transform.lngRange = [];\n            this.transform.latRange = [];\n            this._update();\n        }\n        return this;\n\n    },\n    /**\n     * Set the map's minimum zoom level, and zooms map to that level if it is\n     * currently below it. If no parameter provided, unsets the current\n     * minimum zoom (sets it to 0)\n     *\n     * @param {number} minZoom Minimum zoom level. Must be between 0 and 20.\n     * @returns {Map} `this\n     */\n    setMinZoom: function(minZoom) {\n\n        minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n        if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n            this.transform.minZoom = minZoom;\n            this._update();\n\n            if (this.getZoom() < minZoom) this.setZoom(minZoom);\n\n            return this;\n\n        } else throw new Error('minZoom must be between ' + defaultMinZoom + ' and the current maxZoom, inclusive');\n    },\n\n    /**\n     * Set the map's maximum zoom level, and zooms map to that level if it is\n     * currently above it. If no parameter provided, unsets the current\n     * maximum zoom (sets it to 20)\n     * @param {number} maxZoom Maximum zoom level. Must be between 0 and 20.\n     * @returns {Map} `this`\n     */\n    setMaxZoom: function(maxZoom) {\n\n        maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n        if (maxZoom >= this.transform.minZoom && maxZoom <= defaultMaxZoom) {\n            this.transform.maxZoom = maxZoom;\n            this._update();\n\n            if (this.getZoom() > maxZoom) this.setZoom(maxZoom);\n\n            return this;\n\n        } else throw new Error('maxZoom must be between the current minZoom and ' + defaultMaxZoom + ', inclusive');\n    },\n    /**\n     * Get pixel coordinates relative to the map container, given a geographical\n     * location.\n     *\n     * @param {LngLat} lnglat\n     * @returns {Object} `x` and `y` coordinates\n     */\n    project: function(lnglat) {\n        return this.transform.locationPoint(LngLat.convert(lnglat));\n    },\n\n    /**\n     * Get geographical coordinates, given pixel coordinates.\n     *\n     * @param {Array<number>} point [x, y] pixel coordinates\n     * @returns {LngLat}\n     */\n    unproject: function(point) {\n        return this.transform.pointLocation(Point.convert(point));\n    },\n\n    /**\n     * Query rendered features at a point or within a rectangle.\n     *\n     * @param {Point|Array<number>|Array<Point>|Array<Array<number>>} [pointOrBox] - The geometry of a query region:\n     * either [x, y] pixel coordinates of a point, or [[x1, y1], [x2, y2]] pixel coordinates of opposite corners of\n     * a bounding rectangle. Omitting this parameter (i.e. calling `queryRenderedFeatures` with zero arguments,\n     * or with a single `params` argument), is equivalent to passing a bounding rectangle encompassing the entire\n     * viewport.\n     * @param {Object} [params]\n     * @param {Array<string>} [params.layers] Only query features from layers with these layer IDs.\n     * @param {Array} [params.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) satisfying the query parameters.\n     *\n     * The `properties` value of each feature contains the properties of the source feature. For GeoJSON sources, only\n     * string and numeric values are supported; null, Array, and Object values are not supported.\n     *\n     * Each feature includes a top-level `layer` property whose value is an object representing the style layer to\n     * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated\n     * for the given zoom level and feature.\n     *\n     * Only visible features are returned. The topmost rendered feature appears first in the returned array, and\n     * subsequent features are sorted by descending z-order. Features which are rendered multiple times due to wrapping\n     * across the antimeridian at low zoom levels are returned only once, subject to the caveat that follows.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and features may appear duplicated across tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     *\n     * @example\n     * // Find all features at a point\n     * var features = map.queryRenderedFeatures(\n     *   [20, 35],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a static bounding box\n     * var features = map.queryRenderedFeatures(\n     *   [[10, 20], [30, 50]],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a bounding box around a point\n     * var width = 10;\n     * var height = 20;\n     * var features = map.queryRenderedFeatures([\n     *   [point.x - width / 2, point.y - height / 2],\n     *   [point.x + width / 2, point.y + height / 2]\n     * ], { layers: ['my-layer-name'] });\n     *\n     * @example\n     * // Query all rendered features from a single layer\n     * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });\n     */\n    queryRenderedFeatures: function(pointOrBox, params) {\n        if (!(pointOrBox instanceof Point || Array.isArray(pointOrBox))) {\n            params = pointOrBox;\n            pointOrBox = undefined;\n        }\n        var queryGeometry = this._makeQueryGeometry(pointOrBox);\n        return this.style.queryRenderedFeatures(queryGeometry, params, this.transform.zoom, this.transform.angle);\n    },\n\n    _makeQueryGeometry: function(pointOrBox) {\n        if (pointOrBox === undefined) {\n            // bounds was omitted: use full viewport\n            pointOrBox = [\n                Point.convert([0, 0]),\n                Point.convert([this.transform.width, this.transform.height])\n            ];\n        }\n\n        var queryGeometry;\n        var isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number';\n\n        if (isPoint) {\n            var point = Point.convert(pointOrBox);\n            queryGeometry = [point];\n        } else {\n            var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])];\n            queryGeometry = [\n                box[0],\n                new Point(box[1].x, box[0].y),\n                box[1],\n                new Point(box[0].x, box[1].y),\n                box[0]\n            ];\n        }\n\n        queryGeometry = queryGeometry.map(function(p) {\n            return this.transform.pointCoordinate(p);\n        }.bind(this));\n\n        return queryGeometry;\n    },\n\n    /**\n     * Query data from vector tile or GeoJSON sources.\n     *\n     * @param {string} sourceID source ID\n     * @param {Object} params\n     * @param {string} [params.sourceLayer] The name of the vector tile layer to get features from. For vector tile\n     * sources, this parameter is required. For GeoJSON sources, it is ignored.\n     * @param {Array} [params.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) satisfying the query parameters.\n     *\n     * In contrast to `queryRenderedFeatures`, `querySourceFeatures` returns all features matching the query parameters,\n     * whether they are rendered by the current style or not. The domain of the query consists of all currently-loaded\n     * vector tile or GeoJSON source tiles; `querySourceFeatures` does not load additional tiles beyond the currently\n     * visible viewport.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and features may appear duplicated across tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     */\n    querySourceFeatures: function(sourceID, params) {\n        return this.style.querySourceFeatures(sourceID, params);\n    },\n\n    /**\n     * Replaces the map's style object with a new value. Unlike the `style`\n     * option in the Map constructor, this method only accepts an object\n     * of a new style, not a URL string.\n     *\n     * @param {Object} style A style object formatted as JSON\n     * @returns {Map} `this`\n     */\n    setStyle: function(style) {\n        if (this.style) {\n            this.style\n                .off('load', this._onStyleLoad)\n                .off('error', this._forwardStyleEvent)\n                .off('change', this._onStyleChange)\n                .off('source.add', this._onSourceAdd)\n                .off('source.remove', this._onSourceRemove)\n                .off('source.load', this._onSourceUpdate)\n                .off('source.error', this._forwardSourceEvent)\n                .off('source.change', this._onSourceUpdate)\n                .off('layer.add', this._forwardLayerEvent)\n                .off('layer.remove', this._forwardLayerEvent)\n                .off('layer.error', this._forwardLayerEvent)\n                .off('tile.add', this._forwardTileEvent)\n                .off('tile.remove', this._forwardTileEvent)\n                .off('tile.load', this._update)\n                .off('tile.error', this._forwardTileEvent)\n                .off('tile.stats', this._forwardTileEvent)\n                ._remove();\n\n            this.off('rotate', this.style._redoPlacement);\n            this.off('pitch', this.style._redoPlacement);\n        }\n\n        if (!style) {\n            this.style = null;\n            return this;\n        } else if (style instanceof Style) {\n            this.style = style;\n        } else {\n            this.style = new Style(style, this.animationLoop, this._workerCount);\n        }\n\n        this.style\n            .on('load', this._onStyleLoad)\n            .on('error', this._forwardStyleEvent)\n            .on('change', this._onStyleChange)\n            .on('source.add', this._onSourceAdd)\n            .on('source.remove', this._onSourceRemove)\n            .on('source.load', this._onSourceUpdate)\n            .on('source.error', this._forwardSourceEvent)\n            .on('source.change', this._onSourceUpdate)\n            .on('layer.add', this._forwardLayerEvent)\n            .on('layer.remove', this._forwardLayerEvent)\n            .on('layer.error', this._forwardLayerEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.load', this._update)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this.on('rotate', this.style._redoPlacement);\n        this.on('pitch', this.style._redoPlacement);\n\n        return this;\n    },\n\n    /**\n     * Get a style object that can be used to recreate the map's style.\n     *\n     * @returns {Object} style\n     */\n    getStyle: function() {\n        if (this.style) {\n            return this.style.serialize();\n        }\n    },\n\n    /**\n     * Add a source to the map style.\n     *\n     * @param {string} id ID of the source. Must not be used by any existing source.\n     * @param {Object} source source specification, following the\n     * [Mapbox GL Style Reference](https://www.mapbox.com/mapbox-gl-style-spec/#sources)\n     * @fires source.add\n     * @returns {Map} `this`\n     */\n    addSource: function(id, source) {\n        this.style.addSource(id, source);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Remove an existing source from the map style.\n     *\n     * @param {string} id ID of the source to remove\n     * @fires source.remove\n     * @returns {Map} `this`\n     */\n    removeSource: function(id) {\n        this.style.removeSource(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Return the style source object with the given `id`.\n     *\n     * @param {string} id source ID\n     * @returns {Object}\n     */\n    getSource: function(id) {\n        return this.style.getSource(id);\n    },\n\n    /**\n     * Add a [Mapbox GL style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers)\n     * to the map. A layer references a source from which it pulls data and specifies\n     * styling for that data.\n     *\n     * If a value for `before` is provided, the layer will be inserted before the layer\n     * with the specified ID. If `before` is omitted, the layer will be inserted above\n     * every existing layer.\n     *\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Map} `this`\n     */\n    addLayer: function(layer, before) {\n        this.style.addLayer(layer, before);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Remove the layer with the given `id` from the map. Any layers which refer to the\n     * specified layer via a `ref` property are also removed.\n     *\n     * @param {string} id layer id\n     * @throws {Error} if no layer with the given `id` exists\n     * @fires layer.remove\n     * @returns {Map} `this`\n     */\n    removeLayer: function(id) {\n        this.style.removeLayer(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id layer id\n     * @returns {?Object} a layer, if one with the given `id` exists\n     */\n    getLayer: function(id) {\n        return this.style.getLayer(id);\n    },\n\n    /**\n     * Set the filter for a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {Array} filter filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     * @returns {Map} `this`\n     * @example\n     * map.setFilter('my-layer', ['==', 'name', 'USA']);\n     */\n    setFilter: function(layer, filter) {\n        this.style.setFilter(layer, filter);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Set the zoom extent for a given style layer.\n     *\n     * @param {string} layerId ID of a layer\n     * @param {number} minzoom minimum zoom extent\n     * @param {number} maxzoom maximum zoom extent\n     * @returns {Map} `this`\n     * @example\n     * map.setLayerZoomRange('my-layer', 2, 5);\n     */\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the filter for a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @returns {Array} filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter)\n     */\n    getFilter: function(layer) {\n        return this.style.getFilter(layer);\n    },\n\n    /**\n     * Set the value of a paint property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a paint property\n     * @param {*} value value for the paint propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n     * @param {string=} klass optional class specifier for the property\n     * @returns {Map} `this`\n     * @example\n     * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n     */\n    setPaintProperty: function(layer, name, value, klass) {\n        this.style.setPaintProperty(layer, name, value, klass);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the value of a paint property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a paint property\n     * @param {string=} klass optional class specifier for the property\n     * @returns {*} value for the paint propery\n     */\n    getPaintProperty: function(layer, name, klass) {\n        return this.style.getPaintProperty(layer, name, klass);\n    },\n\n    /**\n     * Set the value of a layout property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a layout property\n     * @param {*} value value for the layout propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n     * @returns {Map} `this`\n     * @example\n     * map.setLayoutProperty('my-layer', 'visibility', 'none');\n     */\n    setLayoutProperty: function(layer, name, value) {\n        this.style.setLayoutProperty(layer, name, value);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the value of a layout property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a layout property\n     * @param {string=} klass optional class specifier for the property\n     * @returns {*} value for the layout propery\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.style.getLayoutProperty(layer, name);\n    },\n\n    /**\n     * Get the Map's container as an HTML element\n     * @returns {HTMLElement} container\n     */\n    getContainer: function() {\n        return this._container;\n    },\n\n    /**\n     * Get the container for the map `canvas` element.\n     *\n     * If you want to add non-GL overlays to the map, you should append them to this element. This\n     * is the element to which event bindings for map interactivity such as panning and zooming are\n     * attached. It will receive bubbled events for child elements such as the `canvas`, but not for\n     * map controls.\n     *\n     * @returns {HTMLElement} container\n     */\n    getCanvasContainer: function() {\n        return this._canvasContainer;\n    },\n\n    /**\n     * Get the Map's canvas as an HTML canvas\n     * @returns {HTMLElement} canvas\n     */\n    getCanvas: function() {\n        return this._canvas.getElement();\n    },\n\n    _setupContainer: function() {\n        var container = this._container;\n        container.classList.add('mapboxgl-map');\n\n        var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n        if (this._interactive) {\n            canvasContainer.classList.add('mapboxgl-interactive');\n        }\n        this._canvas = new Canvas(this, canvasContainer);\n\n        var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n        var corners = this._controlCorners = {};\n        ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) {\n            corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer);\n        });\n    },\n\n    _setupPainter: function() {\n        var gl = this._canvas.getWebGLContext({\n            failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n            preserveDrawingBuffer: this._preserveDrawingBuffer\n        });\n\n        if (!gl) {\n            this.fire('error', { error: new Error('Failed to initialize WebGL') });\n            return;\n        }\n\n        this.painter = new Painter(gl, this.transform);\n    },\n\n    /**\n     * WebGL Context Lost event.\n     *\n     * @event webglcontextlost\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {Event} originalEvent the original DOM event\n     */\n    _contextLost: function(event) {\n        event.preventDefault();\n        if (this._frameId) {\n            browser.cancelFrame(this._frameId);\n        }\n        this.fire('webglcontextlost', {originalEvent: event});\n    },\n\n    /**\n     * WebGL Context Restored event.\n     *\n     * @event webglcontextrestored\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     */\n    _contextRestored: function(event) {\n        this._setupPainter();\n        this.resize();\n        this._update();\n        this.fire('webglcontextrestored', {originalEvent: event});\n    },\n\n    /**\n     * Is this map fully loaded? If the style isn't loaded\n     * or it has a change to the sources or style that isn't\n     * propagated to its style, return false.\n     *\n     * @returns {boolean} whether the map is loaded\n     */\n    loaded: function() {\n        if (this._styleDirty || this._sourcesDirty)\n            return false;\n        if (!this.style || !this.style.loaded())\n            return false;\n        return true;\n    },\n\n    /**\n     * Update this map's style and sources, and re-render the map.\n     *\n     * @param {boolean} updateStyle mark the map's style for reprocessing as\n     * well as its sources\n     * @returns {Map} this\n     * @private\n     */\n    _update: function(updateStyle) {\n        if (!this.style) return this;\n\n        this._styleDirty = this._styleDirty || updateStyle;\n        this._sourcesDirty = true;\n\n        this._rerender();\n\n        return this;\n    },\n\n    /**\n     * Call when a (re-)render of the map is required, e.g. when the\n     * user panned or zoomed,f or new data is available.\n     * @returns {Map} this\n     * @private\n     */\n    _render: function() {\n        try {\n            if (this.style && this._styleDirty) {\n                this._styleDirty = false;\n                this.style.update(this._classes, this._classOptions);\n                this._classOptions = null;\n                this.style._recalculate(this.transform.zoom);\n            }\n\n            if (this.style && this._sourcesDirty) {\n                this._sourcesDirty = false;\n                this.style._updateSources(this.transform);\n            }\n\n            this.painter.render(this.style, {\n                debug: this.showTileBoundaries,\n                showOverdrawInspector: this._showOverdrawInspector,\n                vertices: this.vertices,\n                rotating: this.rotating,\n                zooming: this.zooming\n            });\n\n            this.fire('render');\n\n            if (this.loaded() && !this._loaded) {\n                this._loaded = true;\n                this.fire('load');\n            }\n\n            this._frameId = null;\n\n            if (!this.animationLoop.stopped()) {\n                this._styleDirty = true;\n            }\n\n            if (this._sourcesDirty || this._repaint || !this.animationLoop.stopped()) {\n                this._rerender();\n            }\n\n        } catch (error) {\n            this.fire('error', {error: error});\n        }\n\n        return this;\n    },\n\n    /**\n     * Destroys the map's underlying resources, including web workers and DOM elements. Afterwards,\n     * you must not call any further methods on this Map instance.\n     *\n     * @returns {undefined}\n     */\n    remove: function() {\n        if (this._hash) this._hash.remove();\n        browser.cancelFrame(this._frameId);\n        this.setStyle(null);\n        if (typeof window !== 'undefined') {\n            window.removeEventListener('resize', this._onWindowResize, false);\n        }\n        removeNode(this._canvasContainer);\n        removeNode(this._controlContainer);\n        this._container.classList.remove('mapboxgl-map');\n    },\n\n    /**\n     * A default error handler for `style.error`, `source.error`, `layer.error`,\n     * and `tile.error` events.\n     * It logs the error via `console.error`.\n     *\n     * @example\n     * // Disable the default error handler\n     * map.off('error', map.onError);\n     * map.off('style.error', map.onError);\n     * map.off('source.error', map.onError);\n     * map.off('tile.error', map.onError);\n     * map.off('layer.error', map.onError);\n     */\n    onError: function(e) {\n        console.error(e.error);\n    },\n\n    _rerender: function() {\n        if (this.style && !this._frameId) {\n            this._frameId = browser.frame(this._render);\n        }\n    },\n\n    _forwardStyleEvent: function(e) {\n        this.fire('style.' + e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _onStyleLoad: function(e) {\n        if (this.transform.unmodified) {\n            this.jumpTo(this.style.stylesheet);\n        }\n        this.style.update(this._classes, {transition: false});\n        this._forwardStyleEvent(e);\n    },\n\n    _onStyleChange: function(e) {\n        this._update(true);\n        this._forwardStyleEvent(e);\n    },\n\n    _onSourceAdd: function(e) {\n        var source = e.source;\n        if (source.onAdd)\n            source.onAdd(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceRemove: function(e) {\n        var source = e.source;\n        if (source.onRemove)\n            source.onRemove(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceUpdate: function(e) {\n        this._update();\n        this._forwardSourceEvent(e);\n    },\n\n    _onWindowOnline: function() {\n        this._update();\n    },\n\n    _onWindowResize: function() {\n        if (this._trackResize) {\n            this.stop().resize()._update();\n        }\n    }\n});\n\nutil.extendAll(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Draw an outline around each rendered tile for debugging.\n     *\n     * @name showTileBoundaries\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showTileBoundaries: false,\n    get showTileBoundaries() { return this._showTileBoundaries; },\n    set showTileBoundaries(value) {\n        if (this._showTileBoundaries === value) return;\n        this._showTileBoundaries = value;\n        this._update();\n    },\n\n    /**\n     * Draw boxes around all symbols in the data source, showing which were\n     * rendered and which were hidden due to collisions with other symbols for\n     * style debugging.\n     *\n     * @name showCollisionBoxes\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showCollisionBoxes: false,\n    get showCollisionBoxes() { return this._showCollisionBoxes; },\n    set showCollisionBoxes(value) {\n        if (this._showCollisionBoxes === value) return;\n        this._showCollisionBoxes = value;\n        this.style._redoPlacement();\n    },\n\n    /*\n     * Show how many times each fragment has been shaded. White fragments have\n     * been shaded 8 or more times. Black fragments have been shaded 0 times.\n     *\n     * @name showOverdraw\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showOverdrawInspector: false,\n    get showOverdrawInspector() { return this._showOverdrawInspector; },\n    set showOverdrawInspector(value) {\n        if (this._showOverdrawInspector === value) return;\n        this._showOverdrawInspector = value;\n        this._update();\n    },\n\n    /**\n     * Enable continuous repaint to analyze performance.\n     *\n     * @name repaint\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _repaint: false,\n    get repaint() { return this._repaint; },\n    set repaint(value) { this._repaint = value; this._update(); },\n\n    // show vertices\n    _vertices: false,\n    get vertices() { return this._vertices; },\n    set vertices(value) { this._vertices = value; this._update(); }\n});\n\nfunction removeNode(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\n\n/**\n * Options common to {@link Map#addClass}, {@link Map#removeClass},\n * and {@link Map#setClasses}, controlling\n * whether or not to smoothly transition property changes triggered by the class change.\n *\n * @typedef {Object} StyleOptions\n * @property {boolean} transition\n */\n\n /**\n  * This event is fired whenever the map is drawn to the screen because of\n  *\n  *  - a change in map position, zoom, pitch, or bearing\n  *  - a change to the map style\n  *  - a change to a GeoJSON source\n  *  - a vector tile, GeoJSON file, glyph, or sprite being loaded\n  *\n  * @event render\n  * @memberof Map\n  * @instance\n  */\n\n\n  /**\n   * When an event fires as a result of a\n   * user interaction, the event will be called with an EventData\n   * object containing the original DOM event along with coordinates of\n   * the event target.\n   *\n   * @typedef {Object} EventData\n   * @property {Event} originalEvent The original DOM event\n   * @property {Point} point The pixel location of the event\n   * @property {LngLat} lngLat The geographic location of the event\n   * @example\n   * map.on('click', function(data) {\n   *   var e = data && data.originalEvent;\n   *   console.log('got click ' + (e ? 'button = ' + e.button : ''));\n   * });\n   */\n\n  /**\n   * Mouse down event.\n   *\n   * @event mousedown\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mousedown event](https://developer.mozilla.org/en-US/docs/Web/Events/mousedown)\n   */\n\n  /**\n   * Mouse up event.\n   *\n   * @event mouseup\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mouseup event](https://developer.mozilla.org/en-US/docs/Web/Events/mouseup)\n   */\n\n  /**\n   * Mouse move event.\n   *\n   * @event mousemove\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mousemouse event](https://developer.mozilla.org/en-US/docs/Web/Events/mousemove)\n   */\n\n  /**\n   * Touch start event.\n   *\n   * @event touchstart\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchstart event](https://developer.mozilla.org/en-US/docs/Web/Events/touchstart).\n   */\n\n  /**\n   * Touch end event.\n   *\n   * @event touchend\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchcancel event](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel).\n   */\n\n  /**\n   * Touch move event.\n   *\n   * @event touchmove\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchmove event](https://developer.mozilla.org/en-US/docs/Web/Events/touchmove).\n   */\n\n  /**\n   * Touch cancel event.\n   *\n   * @event touchcancel\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchcancel event](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel).\n   */\n\n  /**\n   * Click event.\n   *\n   * @event click\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [click event](https://developer.mozilla.org/en-US/docs/Web/Events/click)\n   */\n\n  /**\n   * Double click event.\n   *\n   * @event dblclick\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data\n   */\n\n  /**\n   * Context menu event.\n   *\n   * @event contextmenu\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if available\n   */\n\n  /**\n   * Load event. This event is emitted immediately after all necessary resources have been downloaded\n   * and the first visually complete rendering has occurred.\n   *\n   * @event load\n   * @memberof Map\n   * @instance\n   * @type {Object}\n   */\n\n  /**\n   * Move start event. This event is emitted just before the map begins a transition from one\n   * view to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event movestart\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n  /**\n   * Move event. This event is emitted repeatedly during animated transitions from one view to\n   * another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event move\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n  /**\n   * Move end event. This event is emitted just after the map completes a transition from one\n   * view to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event moveend\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n\n/***/ }),\n/* 1010 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar isSupported = __webpack_require__(539);\n\nmodule.exports = Canvas;\n\nfunction Canvas(parent, container) {\n    this.canvas = document.createElement('canvas');\n\n    if (parent && container) {\n        this.canvas.style.position = 'absolute';\n        this.canvas.classList.add('mapboxgl-canvas');\n        this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false);\n        this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false);\n        this.canvas.setAttribute('tabindex', 0);\n        container.appendChild(this.canvas);\n    }\n}\n\nCanvas.prototype.resize = function(width, height) {\n    var pixelRatio = window.devicePixelRatio || 1;\n\n    // Request the required canvas size taking the pixelratio into account.\n    this.canvas.width = pixelRatio * width;\n    this.canvas.height = pixelRatio * height;\n\n    // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n    this.canvas.style.width = width + 'px';\n    this.canvas.style.height = height + 'px';\n};\n\nCanvas.prototype.getWebGLContext = function(attributes) {\n    attributes = util.extend({}, attributes, isSupported.webGLContextAttributes);\n\n    return this.canvas.getContext('webgl', attributes) ||\n        this.canvas.getContext('experimental-webgl', attributes);\n};\n\nCanvas.prototype.getElement = function() {\n    return this.canvas;\n};\n\n\n/***/ }),\n/* 1011 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar interpolate = __webpack_require__(191);\n\nmodule.exports = StyleTransition;\n\n/*\n * Represents a transition between two declarations\n */\nfunction StyleTransition(reference, declaration, oldTransition, value) {\n\n    this.declaration = declaration;\n    this.startTime = this.endTime = (new Date()).getTime();\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.interp = interpZoomTransitioned;\n    } else {\n        this.interp = interpolate[reference.type];\n    }\n\n    this.oldTransition = oldTransition;\n    this.duration = value.duration || 0;\n    this.delay = value.delay || 0;\n\n    if (!this.instant()) {\n        this.endTime = this.startTime + this.duration + this.delay;\n        this.ease = util.easeCubicInOut;\n    }\n\n    if (oldTransition && oldTransition.endTime <= this.startTime) {\n        // Old transition is done running, so we can\n        // delete its reference to its old transition.\n\n        delete oldTransition.oldTransition;\n    }\n}\n\nStyleTransition.prototype.instant = function() {\n    return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n};\n\n/*\n * Return the value of the transitioning property at zoom level `z` and optional time `t`\n */\nStyleTransition.prototype.calculate = function(globalProperties, featureProperties) {\n    var value = this.declaration.calculate(\n        util.extend({}, globalProperties, {duration: this.duration}),\n        featureProperties\n    );\n\n    if (this.instant()) return value;\n\n    var t = globalProperties.time || Date.now();\n\n    if (t < this.endTime) {\n        var oldValue = this.oldTransition.calculate(\n            util.extend({}, globalProperties, {time: this.startTime}),\n            featureProperties\n        );\n        var eased = this.ease((t - this.startTime - this.delay) / this.duration);\n        value = this.interp(oldValue, value, eased);\n    }\n\n    return value;\n\n};\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction interpZoomTransitioned(from, to, t) {\n    if ((from && from.to) === undefined || (to && to.to) === undefined) {\n        return undefined;\n    } else {\n        return {\n            from: from.to,\n            fromScale: from.toScale,\n            to: to.to,\n            toScale: to.toScale,\n            t: t\n        };\n    }\n}\n\n\n/***/ }),\n/* 1012 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar MapboxGLFunction = __webpack_require__(273);\nvar parseColor = __webpack_require__(542);\nvar util = __webpack_require__(10);\n\nmodule.exports = StyleDeclaration;\n\nfunction StyleDeclaration(reference, value) {\n    this.type = reference.type;\n    this.transitionable = reference.transition;\n    this.value = util.clone(value);\n    this.isFunction = MapboxGLFunction.isFunctionDefinition(value);\n\n    // immutable representation of value. used for comparison\n    this.json = JSON.stringify(this.value);\n\n    var parsedValue = this.type === 'color' ? parseColor(this.value) : value;\n    this.calculate = MapboxGLFunction[reference.function || 'piecewise-constant'](parsedValue);\n    this.isFeatureConstant = this.calculate.isFeatureConstant;\n    this.isZoomConstant = this.calculate.isZoomConstant;\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.calculate = transitioned(this.calculate);\n    }\n\n    if (!this.isFeatureConstant && !this.isZoomConstant) {\n        this.stopZoomLevels = [];\n        var interpolationAmountStops = [];\n        var stops = this.value.stops;\n        for (var i = 0; i < this.value.stops.length; i++) {\n            var zoom = stops[i][0].zoom;\n            if (this.stopZoomLevels.indexOf(zoom) < 0) {\n                this.stopZoomLevels.push(zoom);\n                interpolationAmountStops.push([zoom, interpolationAmountStops.length]);\n            }\n        }\n\n        this.calculateInterpolationT = MapboxGLFunction.interpolated({\n            stops: interpolationAmountStops,\n            base: value.base\n        });\n    }\n}\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction transitioned(calculate) {\n    return function(globalProperties, featureProperties) {\n        var z = globalProperties.zoom;\n        var zh = globalProperties.zoomHistory;\n        var duration = globalProperties.duration;\n\n        var fraction = z % 1;\n        var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1);\n        var fromScale = 1;\n        var toScale = 1;\n        var mix, from, to;\n\n        if (z > zh.lastIntegerZoom) {\n            mix = fraction + (1 - fraction) * t;\n            fromScale *= 2;\n            from = calculate({zoom: z - 1}, featureProperties);\n            to = calculate({zoom: z}, featureProperties);\n        } else {\n            mix = 1 - (1 - t) * fraction;\n            to = calculate({zoom: z}, featureProperties);\n            from = calculate({zoom: z + 1}, featureProperties);\n            fromScale /= 2;\n        }\n\n        if (from === undefined || to === undefined) {\n            return undefined;\n        } else {\n            return {\n                from: from,\n                fromScale: fromScale,\n                to: to,\n                toScale: toScale,\n                t: mix\n            };\n        }\n    };\n}\n\n\n/***/ }),\n/* 1013 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1014);\n\n\n/***/ }),\n/* 1014 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8],\"doc\":\"Style specification version number. Must be 8.\",\"example\":8},\"name\":{\"type\":\"string\",\"doc\":\"A human-readable name for the style.\",\"example\":\"Bright\"},\"metadata\":{\"type\":\"*\",\"doc\":\"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"},\"center\":{\"type\":\"array\",\"value\":\"number\",\"doc\":\"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":[-73.9749,40.7736]},\"zoom\":{\"type\":\"number\",\"doc\":\"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":12.5},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"doc\":\"Default bearing, in degrees clockwise from true north.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":29},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\",\"doc\":\"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":50},\"light\":{\"type\":\"light\",\"doc\":\"The global light source.\",\"example\":{\"anchor\":\"viewport\",\"color\":\"white\",\"intensity\":0.4}},\"sources\":{\"required\":true,\"type\":\"sources\",\"doc\":\"Data source specifications.\",\"example\":{\"mapbox-streets\":{\"type\":\"vector\",\"url\":\"mapbox://mapbox.mapbox-streets-v6\"}}},\"sprite\":{\"type\":\"string\",\"doc\":\"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties.\",\"example\":\"mapbox://sprites/mapbox/bright-v8\"},\"glyphs\":{\"type\":\"string\",\"doc\":\"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property.\",\"example\":\"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\"},\"transition\":{\"type\":\"transition\",\"doc\":\"A global transition definition to use as a default across properties.\",\"example\":{\"duration\":300,\"delay\":0}},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\",\"doc\":\"Layers will be drawn in the order of this array.\",\"example\":[{\"id\":\"water\",\"source\":\"mapbox-streets\",\"source-layer\":\"water\",\"type\":\"fill\",\"paint\":{\"fill-color\":\"#00ffff\"}}]}},\"sources\":{\"*\":{\"type\":\"source\",\"doc\":\"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"vector\":{\"doc\":\"A vector tile source.\"},\"raster\":{\"doc\":\"A raster tile source.\"}},\"doc\":\"The data type of the tile source.\"},\"url\":{\"type\":\"string\",\"doc\":\"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`.\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\",\"doc\":\"An array of one or more tile source URLs, as in the TileJSON spec.\"},\"minzoom\":{\"type\":\"number\",\"default\":0,\"doc\":\"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"},\"maxzoom\":{\"type\":\"number\",\"default\":22,\"doc\":\"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\",\"doc\":\"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"},\"*\":{\"type\":\"*\",\"doc\":\"Other keys to configure the data source.\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"geojson\":{\"doc\":\"A GeoJSON data source.\"}},\"doc\":\"The data type of the GeoJSON source.\"},\"data\":{\"type\":\"*\",\"doc\":\"A URL to a GeoJSON file, or inline GeoJSON.\"},\"maxzoom\":{\"type\":\"number\",\"default\":18,\"doc\":\"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\"},\"buffer\":{\"type\":\"number\",\"default\":128,\"maximum\":512,\"minimum\":0,\"doc\":\"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\"},\"tolerance\":{\"type\":\"number\",\"default\":0.375,\"doc\":\"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\"},\"cluster\":{\"type\":\"boolean\",\"default\":false,\"doc\":\"If the data is a collection of point features, setting this to true clusters the points by radius into groups.\"},\"clusterRadius\":{\"type\":\"number\",\"default\":50,\"minimum\":0,\"doc\":\"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\"},\"clusterMaxZoom\":{\"type\":\"number\",\"doc\":\"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered).\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"video\":{\"doc\":\"A video data source.\"}},\"doc\":\"The data type of the video source.\"},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\",\"doc\":\"URLs to video content in order of preferred format.\"},\"coordinates\":{\"required\":true,\"doc\":\"Corners of video specified in longitude, latitude pairs.\",\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"doc\":\"A single longitude, latitude pair.\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"image\":{\"doc\":\"An image data source.\"}},\"doc\":\"The data type of the image source.\"},\"url\":{\"required\":true,\"type\":\"string\",\"doc\":\"URL that points to an image.\"},\"coordinates\":{\"required\":true,\"doc\":\"Corners of image specified in longitude, latitude pairs.\",\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"doc\":\"A single longitude, latitude pair.\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"doc\":\"Unique layer name.\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":{\"fill\":{\"doc\":\"A filled polygon with an optional stroked border.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line\":{\"doc\":\"A stroked line.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol\":{\"doc\":\"An icon or a text label.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle\":{\"doc\":\"A filled circle.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-extrusion\":{\"doc\":\"An extruded (3D) polygon.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"raster\":{\"doc\":\"Raster map textures such as satellite imagery.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background\":{\"doc\":\"The background color or pattern of the map.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"doc\":\"Rendering type of this layer.\"},\"metadata\":{\"type\":\"*\",\"doc\":\"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"},\"ref\":{\"type\":\"string\",\"doc\":\"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient.\"},\"source\":{\"type\":\"string\",\"doc\":\"Name of a source description to be used for this layer.\"},\"source-layer\":{\"type\":\"string\",\"doc\":\"Layer to use from a vector tile source. Required if the source supports multiple layers.\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24,\"doc\":\"The minimum zoom level on which the layer gets parsed and appears on.\"},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24,\"doc\":\"The maximum zoom level on which the layer gets parsed and appears on.\"},\"filter\":{\"type\":\"filter\",\"doc\":\"A expression specifying conditions on source features. Only features that match the filter are displayed.\"},\"layout\":{\"type\":\"layout\",\"doc\":\"Layout properties for the layer.\"},\"paint\":{\"type\":\"paint\",\"doc\":\"Default paint properties for this layer.\"},\"paint.*\":{\"type\":\"paint\",\"doc\":\"[Deprecated] Class-specific paint properties for this layer. The class name is the part after the first dot. Note: class-specific paint properties are deprecated and will be removed in the next version of this spec.\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_fill-extrusion\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"butt\":{\"doc\":\"A cap with a squared-off end which is drawn to the exact endpoint of the line.\"},\"round\":{\"doc\":\"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"},\"square\":{\"doc\":\"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"}},\"default\":\"butt\",\"doc\":\"The display of line endings.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"bevel\":{\"doc\":\"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"},\"round\":{\"doc\":\"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"},\"miter\":{\"doc\":\"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\"}},\"default\":\"miter\",\"doc\":\"The display of lines when joining.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Used to automatically convert miter joins to bevel joins for sharp angles.\",\"requires\":[{\"line-join\":\"miter\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Used to automatically convert round joins to miter joins for shallow angles.\",\"requires\":[{\"line-join\":\"round\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"point\":{\"doc\":\"The label is placed at the point where the geometry is located.\"},\"line\":{\"doc\":\"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\"}},\"default\":\"point\",\"doc\":\"Label placement relative to its geometry.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"doc\":\"Distance between two symbol anchors.\",\"requires\":[{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the icon will be visible even if it collides with other previously drawn symbols.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, other symbols can be visible even if they collide with the icon.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\",\"requires\":[\"icon-image\",\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line`, aligns icon x-axes with the line.\"},\"viewport\":{\"doc\":\"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"},\"auto\":{\"doc\":\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\"}},\"default\":\"auto\",\"doc\":\"In combination with `symbol-placement`, determines the rotation behavior of icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Scale factor for icon. 1 is original size, 3 triples the size.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{\"doc\":\"The icon is displayed at its intrinsic aspect ratio.\"},\"width\":{\"doc\":\"The icon is scaled in the x-dimension to fit the width of the text.\"},\"height\":{\"doc\":\"The icon is scaled in the y-dimension to fit the height of the text.\"},\"both\":{\"doc\":\"The icon is scaled in both x- and y-dimensions.\"}},\"default\":\"none\",\"doc\":\"Scales the icon to fit around the associated text.\",\"requires\":[\"icon-image\",\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\",\"requires\":[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"doc\":\"A string with {tokens} replaced, referencing the data property to pull from.\",\"tokens\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"doc\":\"Rotates the icon clockwise.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.21.0\"}}},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"doc\":\"Size of the additional area around the icon bounding box used for detecting symbol collisions.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the icon may be flipped to prevent it from being rendered upside-down.\",\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"doc\":\"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The text is aligned to the plane of the map.\"},\"viewport\":{\"doc\":\"The text is aligned to the plane of the viewport.\"},\"auto\":{\"doc\":\"Automatically matches the value of `text-rotation-alignment`.\"}},\"default\":\"auto\",\"doc\":\"Orientation of text when map is pitched.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line`, aligns text x-axes with the line.\"},\"viewport\":{\"doc\":\"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"},\"auto\":{\"doc\":\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\"}},\"default\":\"auto\",\"doc\":\"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":\"\",\"tokens\":true,\"doc\":\"Value to use for a text label. Feature properties are specified using tokens like {field_name}.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"doc\":\"Font stack to use for displaying text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Font size.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"The maximum line width for text wrapping.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Text leading value for multi-line text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Text tracking amount.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"left\":{\"doc\":\"The text is aligned to the left.\"},\"center\":{\"doc\":\"The text is centered.\"},\"right\":{\"doc\":\"The text is aligned to the right.\"}},\"default\":\"center\",\"doc\":\"Text justification options.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"center\":{\"doc\":\"The center of the text is placed closest to the anchor.\"},\"left\":{\"doc\":\"The left side of the text is placed closest to the anchor.\"},\"right\":{\"doc\":\"The right side of the text is placed closest to the anchor.\"},\"top\":{\"doc\":\"The top of the text is placed closest to the anchor.\"},\"bottom\":{\"doc\":\"The bottom of the text is placed closest to the anchor.\"},\"top-left\":{\"doc\":\"The top left corner of the text is placed closest to the anchor.\"},\"top-right\":{\"doc\":\"The top right corner of the text is placed closest to the anchor.\"},\"bottom-left\":{\"doc\":\"The bottom left corner of the text is placed closest to the anchor.\"},\"bottom-right\":{\"doc\":\"The bottom right corner of the text is placed closest to the anchor.\"}},\"default\":\"center\",\"doc\":\"Part of the text placed closest to the anchor.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Maximum angle change between adjacent characters.\",\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Rotates the text clockwise.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Size of the additional area around the text bounding box used for detecting symbol collisions.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"doc\":\"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\",\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{\"doc\":\"The text is not altered.\"},\"uppercase\":{\"doc\":\"Forces all letters to be displayed in uppercase.\"},\"lowercase\":{\"doc\":\"Forces all letters to be displayed in lowercase.\"}},\"default\":\"none\",\"doc\":\"Specifies how to capitalize text, similar to the CSS `text-transform` property.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-offset\":{\"type\":\"array\",\"doc\":\"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the text will be visible even if it collides with other previously drawn symbols.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, other symbols can be visible even if they collide with the text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\",\"requires\":[\"text-field\",\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"filter\":{\"type\":\"array\",\"value\":\"*\",\"doc\":\"A filter selects specific features from a layer.\"},\"filter_operator\":{\"type\":\"enum\",\"values\":{\"==\":{\"doc\":\"`[\\\"==\\\", key, value]` equality: `feature[key] = value`\"},\"!=\":{\"doc\":\"`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`\"},\">\":{\"doc\":\"`[\\\">\\\", key, value]` greater than: `feature[key] > value`\"},\">=\":{\"doc\":\"`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`\"},\"<\":{\"doc\":\"`[\\\"<\\\", key, value]` less than: `feature[key] < value`\"},\"<=\":{\"doc\":\"`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`\"},\"in\":{\"doc\":\"`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`\"},\"!in\":{\"doc\":\"`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`\"},\"all\":{\"doc\":\"`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\"},\"any\":{\"doc\":\"`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`\"},\"none\":{\"doc\":\"`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`\"},\"has\":{\"doc\":\"`[\\\"has\\\", key]` `feature[key]` exists\"},\"!has\":{\"doc\":\"`[\\\"!has\\\", key]` `feature[key]` does not exist\"}},\"doc\":\"The filter operator.\"},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{\"doc\":\"Filter to point geometries.\"},\"LineString\":{\"doc\":\"Filter to line geometries.\"},\"Polygon\":{\"doc\":\"Filter to polygon geometries.\"}},\"doc\":\"The geometry type for the filter to select.\"},\"function\":{\"stops\":{\"type\":\"array\",\"doc\":\"An array of stops.\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"doc\":\"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\"},\"property\":{\"type\":\"string\",\"doc\":\"The name of a feature property to use as the function input.\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{\"doc\":\"Return the input value as the output value.\"},\"exponential\":{\"doc\":\"Generate an output by interpolating between stops just less than and just greater than the function input.\"},\"interval\":{\"doc\":\"Return the output value of the stop just less than the function input.\"},\"categorical\":{\"doc\":\"Return the output value of the stop equal to the function input.\"}},\"doc\":\"The interpolation strategy to use in function evaluation.\",\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{\"doc\":\"Use the RGB color space to interpolate color values\"},\"lab\":{\"doc\":\"Use the LAB color space to interpolate color values.\"},\"hcl\":{\"doc\":\"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\"}},\"doc\":\"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\",\"default\":\"rgb\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2,\"doc\":\"Zoom level and value pair.\"},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{\"doc\":\"The position of the light source is aligned to the rotation of the map.\"},\"viewport\":{\"doc\":\"The position of the light source is aligned to the rotation of the viewport.\"}},\"transition\":false,\"doc\":\"Whether extruded geometries are lit relative to the map or viewport.\",\"example\":\"map\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"transition\":true,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"doc\":\"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\",\"example\":[1.5,90,80],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"color\":{\"type\":\"color\",\"default\":\"#ffffff\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true,\"doc\":\"Color tint for lighting extruded geometries.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"intensity\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true,\"doc\":\"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"doc\":\"Whether or not the fill should be antialiased.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.21.0\"}}},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.19.0\"}}},\"fill-outline-color\":{\"type\":\"color\",\"doc\":\"The outline color of the fill. Matches the value of `fill-color` if unspecified.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.19.0\"}}},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The fill is translated relative to the map.\"},\"viewport\":{\"doc\":\"The fill is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"fill-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The fill extrusion is translated relative to the map.\"},\"viewport\":{\"doc\":\"The fill extrusion is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-height\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"doc\":\"The height with which to extrude this layer.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-base\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"doc\":\"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the line will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-color\":{\"type\":\"color\",\"doc\":\"The color with which the line will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.23.0\"}}},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The line is translated relative to the map.\"},\"viewport\":{\"doc\":\"The line is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"line-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Stroke thickness.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"doc\":\"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-offset\":{\"type\":\"number\",\"default\":0,\"doc\":\"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.12.1\",\"ios\":\"3.1.0\",\"android\":\"3.0.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Blur applied to the line, in pixels.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"doc\":\"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.\",\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Circle radius.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.18.0\"}}},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The fill color of the circle.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.18.0\"}}},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"doc\":\"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.20.0\"}}},\"circle-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the circle will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.20.0\"}}},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The circle is translated relative to the map.\"},\"viewport\":{\"doc\":\"The circle is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"circle-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"Circles are scaled according to their apparent distance to the camera.\"},\"viewport\":{\"doc\":\"Circles are not scaled.\"}},\"default\":\"map\",\"doc\":\"Controls the scaling behavior of the circle when the map is pitched.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The stroke color of the circle.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"circle-stroke-opacity\":{\"type\":\"number\",\"doc\":\"The opacity of the circle's stroke.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}}},\"paint_symbol\":{\"icon-opacity\":{\"doc\":\"The opacity at which the icon will be drawn.\",\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the icon. This can only be used with sdf icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the icon's halo. Icon halos can only be used with SDF icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the icon outline.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Fade out the halo towards the outside.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"Icons are translated relative to the map.\"},\"viewport\":{\"doc\":\"Icons are translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the text will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-color\":{\"type\":\"color\",\"doc\":\"The color with which the text will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the text's halo, which helps it stand out from backgrounds.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The halo's fadeout distance towards the outside.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The text is translated relative to the map.\"},\"viewport\":{\"doc\":\"The text is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the image will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\",\"doc\":\"Rotates hues around the color wheel.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Increase or reduce the brightness of the image. The value is the minimum brightness.\",\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Increase or reduce the brightness of the image. The value is the maximum brightness.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-saturation\":{\"type\":\"number\",\"doc\":\"Increase or reduce the saturation of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-contrast\":{\"type\":\"number\",\"doc\":\"Increase or reduce the contrast of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\",\"doc\":\"Fade duration when a new tile is added.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color with which the background will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity at which the background will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Time allotted for transitions to complete.\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Length of time before a transition begins.\"}}}\n\n/***/ }),\n/* 1015 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validateConstants = __webpack_require__(545);\nvar validate = __webpack_require__(101);\nvar latestStyleSpec = __webpack_require__(1018);\nvar validateGlyphsURL = __webpack_require__(1020);\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n *     If omitted, the latest style spec is used.\n * @returns {Array<ValidationError>}\n * @example\n *   var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n *   var errors = validate(style);\n */\nfunction validateStyleMin(style, styleSpec) {\n    styleSpec = styleSpec || latestStyleSpec;\n\n    var errors = [];\n\n    errors = errors.concat(validate({\n        key: '',\n        value: style,\n        valueSpec: styleSpec.$root,\n        styleSpec: styleSpec,\n        style: style,\n        objectElementValidators: {\n            glyphs: validateGlyphsURL,\n            '*': function() {\n                return [];\n            }\n        }\n    }));\n\n    if (styleSpec.$version > 7 && style.constants) {\n        errors = errors.concat(validateConstants({\n            key: 'constants',\n            value: style.constants,\n            style: style,\n            styleSpec: styleSpec\n        }));\n    }\n\n    return sortErrors(errors);\n}\n\nvalidateStyleMin.source = wrapCleanErrors(__webpack_require__(553));\nvalidateStyleMin.light = wrapCleanErrors(__webpack_require__(554));\nvalidateStyleMin.layer = wrapCleanErrors(__webpack_require__(550));\nvalidateStyleMin.filter = wrapCleanErrors(__webpack_require__(275));\nvalidateStyleMin.paintProperty = wrapCleanErrors(__webpack_require__(551));\nvalidateStyleMin.layoutProperty = wrapCleanErrors(__webpack_require__(552));\n\nfunction sortErrors(errors) {\n    return [].concat(errors).sort(function (a, b) {\n        return a.line - b.line;\n    });\n}\n\nfunction wrapCleanErrors(inner) {\n    return function() {\n        return sortErrors(inner.apply(this, arguments));\n    };\n}\n\nmodule.exports = validateStyleMin;\n\n\n/***/ }),\n/* 1016 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(63);\nvar ValidationError = __webpack_require__(36);\n\nmodule.exports = function validateBoolean(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'boolean') {\n        return [new ValidationError(key, value, 'boolean expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 1017 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar getType = __webpack_require__(63);\nvar parseCSSColor = __webpack_require__(192).parseCSSColor;\n\nmodule.exports = function validateColor(options) {\n    var key = options.key;\n    var value = options.value;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'color expected, %s found', type)];\n    }\n\n    if (parseCSSColor(value) === null) {\n        return [new ValidationError(key, value, 'color expected, \"%s\" found', value)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 1018 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1019);\n\n\n/***/ }),\n/* 1019 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8]},\"name\":{\"type\":\"string\"},\"metadata\":{\"type\":\"*\"},\"center\":{\"type\":\"array\",\"value\":\"number\"},\"zoom\":{\"type\":\"number\"},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\"},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\"},\"light\":{\"type\":\"light\"},\"sources\":{\"required\":true,\"type\":\"sources\"},\"sprite\":{\"type\":\"string\"},\"glyphs\":{\"type\":\"string\"},\"transition\":{\"type\":\"transition\"},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\"}},\"sources\":{\"*\":{\"type\":\"source\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"vector\":{},\"raster\":{}}},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"*\":{\"type\":\"*\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"geojson\":{}}},\"data\":{\"type\":\"*\"},\"maxzoom\":{\"type\":\"number\",\"default\":18},\"buffer\":{\"type\":\"number\",\"default\":128,\"maximum\":512,\"minimum\":0},\"tolerance\":{\"type\":\"number\",\"default\":0.375},\"cluster\":{\"type\":\"boolean\",\"default\":false},\"clusterRadius\":{\"type\":\"number\",\"default\":50,\"minimum\":0},\"clusterMaxZoom\":{\"type\":\"number\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"video\":{}}},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"image\":{}}},\"url\":{\"required\":true,\"type\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":{\"fill\":{},\"line\":{},\"symbol\":{},\"circle\":{},\"fill-extrusion\":{},\"raster\":{},\"background\":{}}},\"metadata\":{\"type\":\"*\"},\"ref\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"source-layer\":{\"type\":\"string\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"filter\":{\"type\":\"filter\"},\"layout\":{\"type\":\"layout\"},\"paint\":{\"type\":\"paint\"},\"paint.*\":{\"type\":\"paint\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_fill-extrusion\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"butt\":{},\"round\":{},\"square\":{}},\"default\":\"butt\"},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"bevel\":{},\"round\":{},\"miter\":{}},\"default\":\"miter\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[{\"line-join\":\"miter\"}]},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[{\"line-join\":\"round\"}]},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"point\":{},\"line\":{}},\"default\":\"point\"},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"requires\":[{\"symbol-placement\":\"line\"}]},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\",\"text-field\"]},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"icon-image\"]},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"icon-image\"]},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{},\"width\":{},\"height\":{},\"both\":{}},\"default\":\"none\",\"requires\":[\"icon-image\",\"text-field\"]},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}]},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"tokens\":true},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"requires\":[\"icon-image\"]},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"]},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"]},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":\"\",\"tokens\":true},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"requires\":[\"text-field\"]},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"left\":{},\"center\":{},\"right\":{}},\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"center\":{},\"left\":{},\"right\":{},\"top\":{},\"bottom\":{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}]},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{},\"uppercase\":{},\"lowercase\":{}},\"default\":\"none\",\"requires\":[\"text-field\"]},\"text-offset\":{\"type\":\"array\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"]},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\",\"icon-image\"]},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_operator\":{\"type\":\"enum\",\"values\":{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},\"in\":{},\"!in\":{},\"all\":{},\"any\":{},\"none\":{},\"has\":{},\"!has\":{}}},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{},\"LineString\":{},\"Polygon\":{}}},\"function\":{\"stops\":{\"type\":\"array\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{},\"exponential\":{},\"interval\":{},\"categorical\":{}},\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{},\"lab\":{},\"hcl\":{}},\"default\":\"rgb\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{},\"viewport\":{}},\"transition\":false},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"transition\":true,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false},\"color\":{\"type\":\"color\",\"default\":\"#ffffff\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true},\"intensity\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}]},\"fill-outline-color\":{\"type\":\"color\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}]},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"]},\"fill-extrusion-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"fill-extrusion-height\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true},\"fill-extrusion-base\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"]}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}]},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"circle-translate\"]},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\"},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-stroke-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}]},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}}}\n\n/***/ }),\n/* 1020 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(36);\nvar validateString = __webpack_require__(555);\n\nmodule.exports = function(options) {\n    var value = options.value;\n    var key = options.key;\n\n    var errors = validateString(options);\n    if (errors.length) return errors;\n\n    if (value.indexOf('{fontstack}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n    }\n\n    if (value.indexOf('{range}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 1021 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction BackgroundStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = BackgroundStyleLayer;\n\nBackgroundStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1022 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction CircleStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = CircleStyleLayer;\n\nCircleStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1023 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction FillStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nFillStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValue.call(this, 'fill-color', globalProperties, featureProperties);\n        } else {\n            return StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties);\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, arguments);\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, 'fill-color', zoom);\n        } else {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, name, zoom);\n        }\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, name);\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, name);\n        }\n    }\n\n});\n\nmodule.exports = FillStyleLayer;\n\n\n/***/ }),\n/* 1024 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction LineStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = LineStyleLayer;\n\nLineStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var value = StyleLayer.prototype.getPaintValue.apply(this, arguments);\n\n        // If the line is dashed, scale the dash lengths by the line\n        // width at the previous round zoom level.\n        if (value && name === 'line-dasharray') {\n            var flooredZoom = Math.floor(globalProperties.zoom);\n            if (this._flooredZoom !== flooredZoom) {\n                this._flooredZoom = flooredZoom;\n                this._flooredLineWidth = this.getPaintValue('line-width', globalProperties, featureProperties);\n            }\n\n            value.fromScale *= this._flooredLineWidth;\n            value.toScale *= this._flooredLineWidth;\n        }\n\n        return value;\n    }\n});\n\n\n/***/ }),\n/* 1025 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction RasterStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = RasterStyleLayer;\n\nRasterStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1026 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar StyleLayer = __webpack_require__(100);\n\nfunction SymbolStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = SymbolStyleLayer;\n\nSymbolStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    isHidden: function() {\n        if (StyleLayer.prototype.isHidden.apply(this, arguments)) return true;\n\n        var isTextHidden = this.paint['text-opacity'] === 0 || !this.layout['text-field'];\n        var isIconHidden = this.paint['icon-opacity'] === 0 || !this.layout['icon-image'];\n        if (isTextHidden && isIconHidden) return true;\n\n        return false;\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        if (name === 'text-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('text-rotation-alignment')) {\n            return 'map';\n        } else if (name === 'icon-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('icon-rotation-alignment')) {\n            return 'map';\n        } else {\n            return StyleLayer.prototype.getLayoutValue.apply(this, arguments);\n        }\n    }\n\n});\n\n\n/***/ }),\n/* 1027 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(55);\nvar ajax = __webpack_require__(88);\nvar browser = __webpack_require__(39);\nvar normalizeURL = __webpack_require__(122).normalizeSpriteURL;\n\nmodule.exports = ImageSprite;\n\nfunction ImageSprite(base) {\n    this.base = base;\n    this.retina = browser.devicePixelRatio > 1;\n\n    var format = this.retina ? '@2x' : '';\n\n    ajax.getJSON(normalizeURL(base, format, '.json'), function(err, data) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        this.data = data;\n        if (this.img) this.fire('load');\n    }.bind(this));\n\n    ajax.getImage(normalizeURL(base, format, '.png'), function(err, img) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        // premultiply the sprite\n        var data = img.getData();\n        var newdata = img.data = new Uint8Array(data.length);\n        for (var i = 0; i < data.length; i += 4) {\n            var alpha = data[i + 3] / 255;\n            newdata[i + 0] = data[i + 0] * alpha;\n            newdata[i + 1] = data[i + 1] * alpha;\n            newdata[i + 2] = data[i + 2] * alpha;\n            newdata[i + 3] = data[i + 3];\n        }\n\n        this.img = img;\n        if (this.data) this.fire('load');\n    }.bind(this));\n}\n\nImageSprite.prototype = Object.create(Evented);\n\nImageSprite.prototype.toJSON = function() {\n    return this.base;\n};\n\nImageSprite.prototype.loaded = function() {\n    return !!(this.data && this.img);\n};\n\nImageSprite.prototype.resize = function(/*gl*/) {\n    if (browser.devicePixelRatio > 1 !== this.retina) {\n        var newSprite = new ImageSprite(this.base);\n        newSprite.on('load', function() {\n            this.img = newSprite.img;\n            this.data = newSprite.data;\n            this.retina = newSprite.retina;\n        }.bind(this));\n    }\n};\n\nfunction SpritePosition() {}\nSpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false };\n\nImageSprite.prototype.getSpritePosition = function(name) {\n    if (!this.loaded()) return new SpritePosition();\n\n    var pos = this.data && this.data[name];\n    if (pos && this.img) return pos;\n\n    return new SpritePosition();\n};\n\n\n/***/ }),\n/* 1028 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar normalizeURL = __webpack_require__(122).normalizeGlyphsURL;\nvar getArrayBuffer = __webpack_require__(88).getArrayBuffer;\nvar Glyphs = __webpack_require__(1029);\nvar GlyphAtlas = __webpack_require__(1030);\nvar Protobuf = __webpack_require__(123);\n\nmodule.exports = GlyphSource;\n\n/**\n * A glyph source has a URL from which to load new glyphs and manages\n * GlyphAtlases in which to store glyphs used by the requested fontstacks\n * and ranges.\n *\n * @param {string} url glyph template url\n * @private\n */\nfunction GlyphSource(url) {\n    this.url = url && normalizeURL(url);\n    this.atlases = {};\n    this.stacks = {};\n    this.loading = {};\n}\n\nGlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) {\n    if (this.stacks[fontstack] === undefined) {\n        this.stacks[fontstack] = {};\n    }\n    if (this.atlases[fontstack] === undefined) {\n        this.atlases[fontstack] = new GlyphAtlas(128, 128);\n    }\n\n    var glyphs = {};\n    var stack = this.stacks[fontstack];\n    var atlas = this.atlases[fontstack];\n\n    // the number of pixels the sdf bitmaps are padded by\n    var buffer = 3;\n\n    var missing = {};\n    var remaining = 0;\n    var range;\n\n    for (var i = 0; i < glyphIDs.length; i++) {\n        var glyphID = glyphIDs[i];\n        range = Math.floor(glyphID / 256);\n\n        if (stack[range]) {\n            var glyph = stack[range].glyphs[glyphID];\n            var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n            if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n        } else {\n            if (missing[range] === undefined) {\n                missing[range] = [];\n                remaining++;\n            }\n            missing[range].push(glyphID);\n        }\n    }\n\n    if (!remaining) callback(undefined, glyphs, fontstack);\n\n    var onRangeLoaded = function(err, range, data) {\n        // TODO not be silent about errors\n        if (!err) {\n            var stack = this.stacks[fontstack][range] = data.stacks[0];\n            for (var i = 0; i < missing[range].length; i++) {\n                var glyphID = missing[range][i];\n                var glyph = stack.glyphs[glyphID];\n                var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n                if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n            }\n        }\n        remaining--;\n        if (!remaining) callback(undefined, glyphs, fontstack);\n    }.bind(this);\n\n    for (var r in missing) {\n        this.loadRange(fontstack, r, onRangeLoaded);\n    }\n};\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nfunction SimpleGlyph(glyph, rect, buffer) {\n    var padding = 1;\n    this.advance = glyph.advance;\n    this.left = glyph.left - buffer - padding;\n    this.top = glyph.top + buffer + padding;\n    this.rect = rect;\n}\n\nGlyphSource.prototype.loadRange = function(fontstack, range, callback) {\n    if (range * 256 > 65535) return callback('glyphs > 65535 not supported');\n\n    if (this.loading[fontstack] === undefined) {\n        this.loading[fontstack] = {};\n    }\n    var loading = this.loading[fontstack];\n\n    if (loading[range]) {\n        loading[range].push(callback);\n    } else {\n        loading[range] = [callback];\n\n        var rangeName = (range * 256) + '-' + (range * 256 + 255);\n        var url = glyphUrl(fontstack, rangeName, this.url);\n\n        getArrayBuffer(url, function(err, data) {\n            var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data)));\n            for (var i = 0; i < loading[range].length; i++) {\n                loading[range][i](err, range, glyphs);\n            }\n            delete loading[range];\n        });\n    }\n};\n\nGlyphSource.prototype.getGlyphAtlas = function(fontstack) {\n    return this.atlases[fontstack];\n};\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n    subdomains = subdomains || 'abc';\n\n    return url\n        .replace('{s}', subdomains[fontstack.length % subdomains.length])\n        .replace('{fontstack}', fontstack)\n        .replace('{range}', range);\n}\n\n\n/***/ }),\n/* 1029 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n    this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n    if (tag === 1) {\n        var fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n        stacks.push(fontstack);\n    }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n    if (tag === 1) fontstack.name = pbf.readString();\n    else if (tag === 2) fontstack.range = pbf.readString();\n    else if (tag === 3) {\n        var glyph = pbf.readMessage(readGlyph, {});\n        fontstack.glyphs[glyph.id] = glyph;\n    }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n    if (tag === 1) glyph.id = pbf.readVarint();\n    else if (tag === 2) glyph.bitmap = pbf.readBytes();\n    else if (tag === 3) glyph.width = pbf.readVarint();\n    else if (tag === 4) glyph.height = pbf.readVarint();\n    else if (tag === 5) glyph.left = pbf.readSVarint();\n    else if (tag === 6) glyph.top = pbf.readSVarint();\n    else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n\n\n/***/ }),\n/* 1030 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ShelfPack = __webpack_require__(193);\nvar util = __webpack_require__(10);\n\nmodule.exports = GlyphAtlas;\nfunction GlyphAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.index = {};\n    this.ids = {};\n    this.data = new Uint8Array(width * height);\n}\n\nGlyphAtlas.prototype.getGlyphs = function() {\n    var glyphs = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!glyphs[name]) glyphs[name] = [];\n        glyphs[name].push(id);\n    }\n\n    return glyphs;\n};\n\nGlyphAtlas.prototype.getRects = function() {\n    var rects = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!rects[name]) rects[name] = {};\n        rects[name][id] = this.index[key];\n    }\n\n    return rects;\n};\n\n\nGlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) {\n    if (!glyph) return null;\n\n    var key = name + \"#\" + glyph.id;\n\n    // The glyph is already in this texture.\n    if (this.index[key]) {\n        if (this.ids[key].indexOf(id) < 0) {\n            this.ids[key].push(id);\n        }\n        return this.index[key];\n    }\n\n    // The glyph bitmap has zero width.\n    if (!glyph.bitmap) {\n        return null;\n    }\n\n    var bufferedWidth = glyph.width + buffer * 2;\n    var bufferedHeight = glyph.height + buffer * 2;\n\n    // Add a 1px border around every image.\n    var padding = 1;\n    var packWidth = bufferedWidth + 2 * padding;\n    var packHeight = bufferedHeight + 2 * padding;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    packWidth += (4 - packWidth % 4);\n    packHeight += (4 - packHeight % 4);\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        this.resize();\n        rect = this.bin.packOne(packWidth, packHeight);\n    }\n    if (!rect) {\n        util.warnOnce('glyph bitmap overflow');\n        return null;\n    }\n\n    this.index[key] = rect;\n    this.ids[key] = [id];\n\n    var target = this.data;\n    var source = glyph.bitmap;\n    for (var y = 0; y < bufferedHeight; y++) {\n        var y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n        var y2 = bufferedWidth * y;\n        for (var x = 0; x < bufferedWidth; x++) {\n            target[y1 + x] = source[y2 + x];\n        }\n    }\n\n    this.dirty = true;\n\n    return rect;\n};\n\nGlyphAtlas.prototype.resize = function() {\n    var origw = this.width,\n        origh = this.height;\n\n    // For now, don't grow the atlas beyond 1024x1024 because of how\n    // texture coords pack into unsigned byte in symbol bucket.\n    if (origw > 512 || origh > 512) return;\n\n    if (this.texture) {\n        if (this.gl) {\n            this.gl.deleteTexture(this.texture);\n        }\n        this.texture = null;\n    }\n\n    this.width *= 2;\n    this.height *= 2;\n    this.bin.resize(this.width, this.height);\n\n    var buf = new ArrayBuffer(this.width * this.height),\n        src, dst;\n    for (var i = 0; i < origh; i++) {\n        src = new Uint8Array(this.data.buffer, origh * i, origw);\n        dst = new Uint8Array(buf, origh * i * 2, origw);\n        dst.set(src);\n    }\n    this.data = new Uint8Array(buf);\n};\n\nGlyphAtlas.prototype.bind = function(gl) {\n    this.gl = gl;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n};\n\nGlyphAtlas.prototype.updateTexture = function(gl) {\n    this.bind(gl);\n    if (this.dirty) {\n        gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n        this.dirty = false;\n    }\n};\n\n\n/***/ }),\n/* 1031 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// lightweight Buffer shim for pbf browser build\n// based on code from github.com/feross/buffer (MIT-licensed)\n\nmodule.exports = Buffer;\n\nvar ieee754 = __webpack_require__(1032);\n\nvar BufferMethods;\n\nfunction Buffer(length) {\n    var arr;\n    if (length && length.length) {\n        arr = length;\n        length = arr.length;\n    }\n    var buf = new Uint8Array(length || 0);\n    if (arr) buf.set(arr);\n\n    buf.readUInt32LE = BufferMethods.readUInt32LE;\n    buf.writeUInt32LE = BufferMethods.writeUInt32LE;\n    buf.readInt32LE = BufferMethods.readInt32LE;\n    buf.writeInt32LE = BufferMethods.writeInt32LE;\n    buf.readFloatLE = BufferMethods.readFloatLE;\n    buf.writeFloatLE = BufferMethods.writeFloatLE;\n    buf.readDoubleLE = BufferMethods.readDoubleLE;\n    buf.writeDoubleLE = BufferMethods.writeDoubleLE;\n    buf.toString = BufferMethods.toString;\n    buf.write = BufferMethods.write;\n    buf.slice = BufferMethods.slice;\n    buf.copy = BufferMethods.copy;\n\n    buf._isBuffer = true;\n    return buf;\n}\n\nvar lastStr, lastStrEncoded;\n\nBufferMethods = {\n    readUInt32LE: function(pos) {\n        return ((this[pos]) |\n            (this[pos + 1] << 8) |\n            (this[pos + 2] << 16)) +\n            (this[pos + 3] * 0x1000000);\n    },\n\n    writeUInt32LE: function(val, pos) {\n        this[pos] = val;\n        this[pos + 1] = (val >>> 8);\n        this[pos + 2] = (val >>> 16);\n        this[pos + 3] = (val >>> 24);\n    },\n\n    readInt32LE: function(pos) {\n        return ((this[pos]) |\n            (this[pos + 1] << 8) |\n            (this[pos + 2] << 16)) +\n            (this[pos + 3] << 24);\n    },\n\n    readFloatLE:  function(pos) { return ieee754.read(this, pos, true, 23, 4); },\n    readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); },\n\n    writeFloatLE:  function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); },\n    writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); },\n\n    toString: function(encoding, start, end) {\n        var str = '',\n            tmp = '';\n\n        start = start || 0;\n        end = Math.min(this.length, end || this.length);\n\n        for (var i = start; i < end; i++) {\n            var ch = this[i];\n            if (ch <= 0x7F) {\n                str += decodeURIComponent(tmp) + String.fromCharCode(ch);\n                tmp = '';\n            } else {\n                tmp += '%' + ch.toString(16);\n            }\n        }\n\n        str += decodeURIComponent(tmp);\n\n        return str;\n    },\n\n    write: function(str, pos) {\n        var bytes = str === lastStr ? lastStrEncoded : encodeString(str);\n        for (var i = 0; i < bytes.length; i++) {\n            this[pos + i] = bytes[i];\n        }\n    },\n\n    slice: function(start, end) {\n        return this.subarray(start, end);\n    },\n\n    copy: function(buf, pos) {\n        pos = pos || 0;\n        for (var i = 0; i < this.length; i++) {\n            buf[pos + i] = this[i];\n        }\n    }\n};\n\nBufferMethods.writeInt32LE = BufferMethods.writeUInt32LE;\n\nBuffer.byteLength = function(str) {\n    lastStr = str;\n    lastStrEncoded = encodeString(str);\n    return lastStrEncoded.length;\n};\n\nBuffer.isBuffer = function(buf) {\n    return !!(buf && buf._isBuffer);\n};\n\nfunction encodeString(str) {\n    var length = str.length,\n        bytes = [];\n\n    for (var i = 0, c, lead; i < length; i++) {\n        c = str.charCodeAt(i); // code point\n\n        if (c > 0xD7FF && c < 0xE000) {\n\n            if (lead) {\n                if (c < 0xDC00) {\n                    bytes.push(0xEF, 0xBF, 0xBD);\n                    lead = c;\n                    continue;\n\n                } else {\n                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n                    lead = null;\n                }\n\n            } else {\n                if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD);\n                else lead = c;\n\n                continue;\n            }\n\n        } else if (lead) {\n            bytes.push(0xEF, 0xBF, 0xBD);\n            lead = null;\n        }\n\n        if (c < 0x80) bytes.push(c);\n        else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80);\n        else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n        else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n    }\n    return bytes;\n}\n\n\n/***/ }),\n/* 1032 */\n/***/ (function(module, exports) {\n\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n/***/ }),\n/* 1033 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ShelfPack = __webpack_require__(193);\nvar browser = __webpack_require__(39);\nvar util = __webpack_require__(10);\n\nmodule.exports = SpriteAtlas;\nfunction SpriteAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.images = {};\n    this.data = false;\n    this.texture = 0; // WebGL ID\n    this.filter = 0; // WebGL ID\n    this.pixelRatio = 1;\n    this.dirty = true;\n}\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n    var srcI = srcY * srcStride + srcX;\n    var dstI = dstY * dstStride + dstX;\n    var x, y;\n\n    if (wrap) {\n        // add 1 pixel wrapped padding on each side of the image\n        dstI -= dstStride;\n        for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) {\n            for (x = -1; x <= width; x++) {\n                dst[dstI + x] = src[srcI + ((x + width) % width)];\n            }\n        }\n\n    } else {\n        for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n            for (x = 0; x < width; x++) {\n                dst[dstI + x] = src[srcI + x];\n            }\n        }\n    }\n}\n\nSpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) {\n\n    pixelWidth = pixelWidth / this.pixelRatio;\n    pixelHeight = pixelHeight / this.pixelRatio;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    // Pad icons to prevent them from polluting neighbours during linear interpolation\n    var padding = 2;\n    var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n    var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        util.warnOnce('SpriteAtlas out of space.');\n        return null;\n    }\n\n    return rect;\n};\n\nSpriteAtlas.prototype.getImage = function(name, wrap) {\n    if (this.images[name]) {\n        return this.images[name];\n    }\n\n    if (!this.sprite) {\n        return null;\n    }\n\n    var pos = this.sprite.getSpritePosition(name);\n    if (!pos.width || !pos.height) {\n        return null;\n    }\n\n    var rect = this.allocateImage(pos.width, pos.height);\n    if (!rect) {\n        return null;\n    }\n\n    var image = new AtlasImage(rect, pos.width / pos.pixelRatio, pos.height / pos.pixelRatio, pos.sdf, pos.pixelRatio / this.pixelRatio);\n    this.images[name] = image;\n\n    this.copy(rect, pos, wrap);\n\n    return image;\n};\n\n\n// Return position of a repeating fill pattern.\nSpriteAtlas.prototype.getPosition = function(name, repeating) {\n    var image = this.getImage(name, repeating);\n    var rect = image && image.rect;\n\n    if (!rect) {\n        return null;\n    }\n\n    var width = image.width * image.pixelRatio;\n    var height = image.height * image.pixelRatio;\n    var padding = 1;\n\n    return {\n        size: [image.width, image.height],\n        tl: [(rect.x + padding)         / this.width, (rect.y + padding)          / this.height],\n        br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n    };\n};\n\n\nSpriteAtlas.prototype.allocate = function() {\n    if (!this.data) {\n        var w = Math.floor(this.width * this.pixelRatio);\n        var h = Math.floor(this.height * this.pixelRatio);\n        this.data = new Uint32Array(w * h);\n        for (var i = 0; i < this.data.length; i++) {\n            this.data[i] = 0;\n        }\n    }\n};\n\n\nSpriteAtlas.prototype.copy = function(dst, src, wrap) {\n    if (!this.sprite.img.data) return;\n    var srcImg = new Uint32Array(this.sprite.img.data.buffer);\n\n    this.allocate();\n    var dstImg = this.data;\n\n    var padding = 1;\n\n    copyBitmap(\n        /* source buffer */  srcImg,\n        /* source stride */  this.sprite.img.width,\n        /* source x */       src.x,\n        /* source y */       src.y,\n        /* dest buffer */    dstImg,\n        /* dest stride */    this.width * this.pixelRatio,\n        /* dest x */         (dst.x + padding) * this.pixelRatio,\n        /* dest y */         (dst.y + padding) * this.pixelRatio,\n        /* icon dimension */ src.width,\n        /* icon dimension */ src.height,\n        /* wrap */ wrap\n    );\n\n    this.dirty = true;\n};\n\nSpriteAtlas.prototype.setSprite = function(sprite) {\n    if (sprite) {\n        this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1;\n\n        if (this.canvas) {\n            this.canvas.width = this.width * this.pixelRatio;\n            this.canvas.height = this.height * this.pixelRatio;\n        }\n    }\n    this.sprite = sprite;\n};\n\nSpriteAtlas.prototype.addIcons = function(icons, callback) {\n    for (var i = 0; i < icons.length; i++) {\n        this.getImage(icons[i]);\n    }\n\n    callback(null, this.images);\n};\n\nSpriteAtlas.prototype.bind = function(gl, linear) {\n    var first = false;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        first = true;\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n\n    var filterVal = linear ? gl.LINEAR : gl.NEAREST;\n    if (filterVal !== this.filter) {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n        this.filter = filterVal;\n    }\n\n    if (this.dirty) {\n        this.allocate();\n\n        if (first) {\n            gl.texImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // ind level\n                gl.RGBA, // ind internalformat\n                this.width * this.pixelRatio, // GLsizei width\n                this.height * this.pixelRatio, // GLsizei height\n                0, // ind border\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object data\n            );\n        } else {\n            gl.texSubImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // int level\n                0, // int xoffset\n                0, // int yoffset\n                this.width * this.pixelRatio, // long width\n                this.height * this.pixelRatio, // long height\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object pixels\n            );\n        }\n\n        this.dirty = false;\n    }\n};\n\nfunction AtlasImage(rect, width, height, sdf, pixelRatio) {\n    this.rect = rect;\n    this.width = width;\n    this.height = height;\n    this.sdf = sdf;\n    this.pixelRatio = pixelRatio;\n}\n\n\n/***/ }),\n/* 1034 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\n\nmodule.exports = LineAtlas;\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nfunction LineAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n    this.nextRow = 0;\n\n    this.bytes = 4;\n    this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n    this.positions = {};\n}\n\nLineAtlas.prototype.setSprite = function(sprite) {\n    this.sprite = sprite;\n};\n\n/**\n * Get or create a dash line pattern.\n *\n * @param {Array<number>} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\nLineAtlas.prototype.getDash = function(dasharray, round) {\n    var key = dasharray.join(\",\") + round;\n\n    if (!this.positions[key]) {\n        this.positions[key] = this.addDash(dasharray, round);\n    }\n    return this.positions[key];\n};\n\nLineAtlas.prototype.addDash = function(dasharray, round) {\n\n    var n = round ? 7 : 0;\n    var height = 2 * n + 1;\n    var offset = 128;\n\n    if (this.nextRow + height > this.height) {\n        util.warnOnce('LineAtlas out of space');\n        return null;\n    }\n\n    var length = 0;\n    for (var i = 0; i < dasharray.length; i++) {\n        length += dasharray[i];\n    }\n\n    var stretch = this.width / length;\n    var halfWidth = stretch / 2;\n\n    // If dasharray has an odd length, both the first and last parts\n    // are dashes and should be joined seamlessly.\n    var oddLength = dasharray.length % 2 === 1;\n\n    for (var y = -n; y <= n; y++) {\n        var row = this.nextRow + n + y;\n        var index = this.width * row;\n\n        var left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n        var right = dasharray[0];\n        var partIndex = 1;\n\n        for (var x = 0; x < this.width; x++) {\n\n            while (right < x / stretch) {\n                left = right;\n                right = right + dasharray[partIndex];\n\n                if (oddLength && partIndex === dasharray.length - 1) {\n                    right += dasharray[0];\n                }\n\n                partIndex++;\n            }\n\n            var distLeft = Math.abs(x - left * stretch);\n            var distRight = Math.abs(x - right * stretch);\n            var dist = Math.min(distLeft, distRight);\n            var inside = (partIndex % 2) === 1;\n            var signedDistance;\n\n            if (round) {\n                // Add circle caps\n                var distMiddle = n ? y / n * (halfWidth + 1) : 0;\n                if (inside) {\n                    var distEdge = halfWidth - Math.abs(distMiddle);\n                    signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n                } else {\n                    signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n                }\n            } else {\n                signedDistance = (inside ? 1 : -1) * dist;\n            }\n\n            this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n        }\n    }\n\n    var pos = {\n        y: (this.nextRow + n + 0.5) / this.height,\n        height: 2 * n / this.height,\n        width: length\n    };\n\n    this.nextRow += height;\n    this.dirty = true;\n\n    return pos;\n};\n\nLineAtlas.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (this.dirty) {\n            this.dirty = false;\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n        }\n    }\n};\n\n\n/***/ }),\n/* 1035 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Actor = __webpack_require__(1036);\nvar WebWorkify = __webpack_require__(557);\n\nmodule.exports = Dispatcher;\n\nfunction Dispatcher(length, parent) {\n    this.actors = [];\n    this.currentActor = 0;\n    for (var i = 0; i < length; i++) {\n        var worker = new WebWorkify(__webpack_require__(1037));\n        var actor = new Actor(worker, parent);\n        actor.name = \"Worker \" + i;\n        this.actors.push(actor);\n    }\n}\n\nDispatcher.prototype = {\n    broadcast: function(type, data) {\n        for (var i = 0; i < this.actors.length; i++) {\n            this.actors[i].send(type, data);\n        }\n    },\n\n    send: function(type, data, callback, targetID, buffers) {\n        if (typeof targetID !== 'number' || isNaN(targetID)) {\n            // Use round robin to send requests to web workers.\n            targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n        }\n\n        this.actors[targetID].send(type, data, callback, buffers);\n        return targetID;\n    },\n\n    remove: function() {\n        for (var i = 0; i < this.actors.length; i++) {\n            this.actors[i].target.terminate();\n        }\n        this.actors = [];\n    }\n};\n\n\n/***/ }),\n/* 1036 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Actor;\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @private\n */\nfunction Actor(target, parent) {\n    this.target = target;\n    this.parent = parent;\n    this.callbacks = {};\n    this.callbackID = 0;\n    this.receive = this.receive.bind(this);\n    this.target.addEventListener('message', this.receive, false);\n}\n\nActor.prototype.receive = function(message) {\n    var data = message.data,\n        callback;\n\n    if (data.type === '<response>') {\n        callback = this.callbacks[data.id];\n        delete this.callbacks[data.id];\n        callback(data.error || null, data.data);\n    } else if (typeof data.id !== 'undefined') {\n        var id = data.id;\n        this.parent[data.type](data.data, function(err, data, buffers) {\n            this.postMessage({\n                type: '<response>',\n                id: String(id),\n                error: err ? String(err) : null,\n                data: data\n            }, buffers);\n        }.bind(this));\n    } else {\n        this.parent[data.type](data.data);\n    }\n};\n\nActor.prototype.send = function(type, data, callback, buffers) {\n    var id = null;\n    if (callback) this.callbacks[id = this.callbackID++] = callback;\n    this.postMessage({ type: type, id: String(id), data: data }, buffers);\n};\n\n/**\n * Wrapped postMessage API that abstracts around IE's lack of\n * `transferList` support.\n *\n * @param {Object} message\n * @param {Object} transferList\n * @private\n */\nActor.prototype.postMessage = function(message, transferList) {\n    this.target.postMessage(message, transferList);\n};\n\n\n/***/ }),\n/* 1037 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = function() {\n\treturn __webpack_require__(558)(\"!function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\\\"a\\\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\\\"\\\",e(e.s=42)}([function(t,e,n){\\\"use strict\\\";var i=n(46),r=n(47);e.easeCubicInOut=function(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,n=e*t;return 4*(t<.5?n:3*(t-e)+n-.75)},e.bezier=function(t,e,n,r){var o=new i(t,e,n,r);return function(t){return o.solve(t)}},e.ease=e.bezier(.25,.1,.25,1),e.clamp=function(t,e,n){return Math.min(n,Math.max(e,t))},e.wrap=function(t,e,n){var i=n-e,r=((t-e)%i+i)%i+e;return r===e?n:r},e.coalesce=function(){for(var t=0;t<arguments.length;t++){var e=arguments[t];if(null!==e&&void 0!==e)return e}},e.asyncAll=function(t,e,n){if(!t.length)return n(null,[]);var i=t.length,r=new Array(t.length),o=null;t.forEach(function(t,a){e(t,function(t,e){t&&(o=t),r[a]=e,0==--i&&n(o,r)})})},e.keysDifference=function(t,e){var n=[];for(var i in t)i in e||n.push(i);return n},e.extend=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)t[i]=n[i]}return t},e.extendAll=function(t,e){for(var n in e)Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n));return t},e.inherit=function(t,n){var i=\\\"function\\\"==typeof t?t.prototype:t,r=Object.create(i);return e.extendAll(r,n),r},e.pick=function(t,e){for(var n={},i=0;i<e.length;i++){var r=e[i];r in t&&(n[r]=t[r])}return n};var o=1;e.uniqueId=function(){return o++},e.debounce=function(t,e){var n,i;return function(){i=arguments,clearTimeout(n),n=setTimeout(function(){t.apply(null,i)},e)}},e.bindAll=function(t,e){t.forEach(function(t){e[t]=e[t].bind(e)})},e.bindHandlers=function(t){for(var e in t)\\\"function\\\"==typeof t[e]&&0===e.indexOf(\\\"_on\\\")&&(t[e]=t[e].bind(t))},e.setOptions=function(t,e){t.hasOwnProperty(\\\"options\\\")||(t.options=t.options?Object.create(t.options):{});for(var n in e)t.options[n]=e[n];return t.options},e.getCoordinatesCenter=function(t){for(var e=1/0,n=1/0,i=-1/0,o=-1/0,a=0;a<t.length;a++)e=Math.min(e,t[a].column),n=Math.min(n,t[a].row),i=Math.max(i,t[a].column),o=Math.max(o,t[a].row);var s=i-e,u=o-n,l=Math.max(s,u);return new r((e+i)/2,(n+o)/2,0).zoomTo(Math.floor(-Math.log(l)/Math.LN2))},e.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)},e.startsWith=function(t,e){return 0===t.indexOf(e)},e.mapObject=function(t,e,n){var i={};for(var r in t)i[r]=e.call(n||this,t[r],r,t);return i},e.filterObject=function(t,e,n){var i={};for(var r in t)e.call(n||this,t[r],r,t)&&(i[r]=t[r]);return i},e.deepEqual=function t(e,n){if(Array.isArray(e)){if(!Array.isArray(n)||e.length!==n.length)return!1;for(var i=0;i<e.length;i++)if(!t(e[i],n[i]))return!1;return!0}if(\\\"object\\\"==typeof e){if(\\\"object\\\"!=typeof n)return!1;if(Object.keys(e).length!==Object.keys(n).length)return!1;for(var r in e)if(!t(e[r],n[r]))return!1;return!0}return e===n},e.clone=function(t){return Array.isArray(t)?t.map(e.clone):\\\"object\\\"==typeof t?e.mapObject(t,e.clone):t},e.arraysIntersect=function(t,e){for(var n=0;n<t.length;n++)if(e.indexOf(t[n])>=0)return!0;return!1};var a={};e.warnOnce=function(t){a[t]||(\\\"undefined\\\"!=typeof console&&console.warn(t),a[t]=!0)}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.message=(t?t+\\\": \\\":\\\"\\\")+r.apply(r,Array.prototype.slice.call(arguments,2)),null!==e&&void 0!==e&&e.__line__&&(this.line=e.__line__)}var r=n(18).format;t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){this.x=t,this.y=e}t.exports=i,i.prototype={clone:function(){return new i(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,n=t.y-this.y;return e*e+n*n},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,n=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=n,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),n=Math.sin(t),i=e*this.x-n*this.y,r=n*this.x+e*this.y;return this.x=i,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},i.convert=function(t){return t instanceof i?t:Array.isArray(t)?new i(t[0],t[1]):t}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number?\\\"number\\\":t instanceof String?\\\"string\\\":t instanceof Boolean?\\\"boolean\\\":Array.isArray(t)?\\\"array\\\":null===t?\\\"null\\\":typeof t}},function(t,e,n){\\\"use strict\\\";function i(t){if(this.zoom=t.zoom,this.overscaling=t.overscaling,this.layer=t.layer,this.childLayers=t.childLayers,this.type=this.layer.type,this.features=[],this.id=this.layer.id,this.index=t.index,this.sourceLayer=this.layer.sourceLayer,this.sourceLayerIndex=t.sourceLayerIndex,this.minZoom=this.layer.minzoom,this.maxZoom=this.layer.maxzoom,this.paintAttributes=o(this),t.arrays){var e=this.childLayers;this.bufferGroups=c.mapObject(t.arrays,function(n,i){return n.map(function(n){var r=c.mapObject(n,function(e,n){return c.mapObject(e,function(e,r){var o=t.arrayTypes[i][n][r],a=o.members.length&&\\\"vertices\\\"===o.members[0].name?l.BufferType.ELEMENT:l.BufferType.VERTEX;return new l(e,o,a)})});r.vaos={},r.layout.element2&&(r.secondVaos={});for(var o=0;o<e.length;o++){var a=e[o].id;r.vaos[a]=new f,r.layout.element2&&(r.secondVaos[a]=new f)}return r})})}}function r(t){return new p({members:[{type:l.ELEMENT_ATTRIBUTE_TYPE,name:\\\"vertices\\\",components:t||3}]})}function o(t){var e={};for(var n in t.programInterfaces){for(var i=e[n]={},r=0;r<t.childLayers.length;r++){i[t.childLayers[r].id]={attributes:[],uniforms:[],defines:[],vertexPragmas:{define:{},initialize:{}},fragmentPragmas:{define:{},initialize:{}}}}var o=t.programInterfaces[n];if(o.paintAttributes)for(var u=0;u<o.paintAttributes.length;u++){var l=o.paintAttributes[u];l.multiplier=l.multiplier||1;for(var p=0;p<t.childLayers.length;p++){var f=t.childLayers[p],d=i[f.id],y=1===l.components?\\\"float\\\":\\\"vec\\\"+l.components,m=l.name;h(\\\"a_\\\"===l.name.slice(0,2));var v,g=l.name.slice(2);d.fragmentPragmas.initialize[g]=\\\"\\\";if(f.isPaintValueFeatureConstant(l.paintProperty))d.uniforms.push(l),d.fragmentPragmas.define[g]=d.vertexPragmas.define[g]=[\\\"uniform\\\",\\\"{precision}\\\",y,m].join(\\\" \\\")+\\\";\\\",d.fragmentPragmas.initialize[g]=d.vertexPragmas.initialize[g]=[\\\"{precision}\\\",y,g,\\\"=\\\",m].join(\\\" \\\")+\\\";\\\\n\\\";else if(f.isPaintValueZoomConstant(l.paintProperty)){d.attributes.push(c.extend({},l,{name:m})),v=[\\\"varying\\\",\\\"{precision}\\\",y,g].join(\\\" \\\")+\\\";\\\\n\\\";var x=[d.fragmentPragmas.define[g],\\\"attribute\\\",\\\"{precision}\\\",y,m].join(\\\" \\\")+\\\";\\\\n\\\";d.fragmentPragmas.define[g]=v,d.vertexPragmas.define[g]=v+x,d.vertexPragmas.initialize[g]=[g,\\\"=\\\",m,\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}else{for(var b=\\\"u_\\\"+m.slice(2)+\\\"_t\\\",w=f.getPaintValueStopZoomLevels(l.paintProperty),k=0;k<w.length&&w[k]<t.zoom;)k++;for(var _=Math.max(0,Math.min(w.length-4,k-2)),S=[],z=0;z<4;z++)S.push(w[Math.min(_+z,w.length-1)]);v=[\\\"varying\\\",\\\"{precision}\\\",y,g].join(\\\" \\\")+\\\";\\\\n\\\",d.vertexPragmas.define[g]=v+[\\\"uniform\\\",\\\"lowp\\\",\\\"float\\\",b].join(\\\" \\\")+\\\";\\\\n\\\",d.fragmentPragmas.define[g]=v,d.uniforms.push(c.extend({},l,{name:b,getValue:s(l,_),components:1}));var T=l.components;if(1===T)d.attributes.push(c.extend({},l,{getValue:a(l,S),isFunction:!0,components:4*T})),d.vertexPragmas.define[g]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"vec4\\\",m].join(\\\" \\\")+\\\";\\\\n\\\",d.vertexPragmas.initialize[g]=[g,\\\"=\\\",\\\"evaluate_zoom_function_1(\\\"+m+\\\", \\\"+b+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\";else{for(var j=[],M=0;M<4;M++)j.push(m+M),d.attributes.push(c.extend({},l,{getValue:a(l,[S[M]]),isFunction:!0,name:m+M})),d.vertexPragmas.define[g]+=[\\\"attribute\\\",\\\"{precision}\\\",y,m+M].join(\\\" \\\")+\\\";\\\\n\\\";d.vertexPragmas.initialize[g]=[g,\\\" = \\\",\\\"evaluate_zoom_function_4(\\\"+j.join(\\\", \\\")+\\\", \\\"+b+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}}}}}return e}function a(t,e){return function(n,i,r){if(1===e.length)return t.getValue(n,c.extend({},i,{zoom:e[0]}),r);for(var o=[],a=0;a<e.length;a++){var s=e[a];o.push(t.getValue(n,c.extend({},i,{zoom:s}),r)[0])}return o}}function s(t,e){return function(n,i){var r=n.getPaintInterpolationT(t.paintProperty,i.zoom);return[Math.max(0,Math.min(4,r-e))]}}var u=n(16),l=n(48),c=n(0),p=n(8),f=n(53),h=n(11);t.exports=i,i.create=function(t){return new({fill:n(54),line:n(58),circle:n(59),symbol:n(60)}[t.layer.type])(t)},i.EXTENT=8192,i.prototype.populateBuffers=function(){this.createArrays(),this.recalculateStyleLayers();for(var t=0;t<this.features.length;t++)this.addFeature(this.features[t]);this.trimArrays()},i.prototype.makeRoomFor=function(t,e){var n=this.arrayGroups[t],i=n.length&&n[n.length-1];if(!i||i.layout.vertex.length+e>65535){var r=this.arrayTypes[t],o=r.layout.vertex,a=r.layout.element,s=r.layout.element2;i={index:n.length,layout:{},paint:{}},i.layout.vertex=new o,a&&(i.layout.element=new a),s&&(i.layout.element2=new s);for(var u=0;u<this.childLayers.length;u++){var l=this.childLayers[u].id,c=r.paint[l];i.paint[l]=new c}n.push(i)}return i},i.prototype.createArrays=function(){this.arrayGroups={},this.arrayTypes={};for(var t in this.programInterfaces){var e=this.programInterfaces[t],n=this.arrayTypes[t]={layout:{},paint:{}};if(this.arrayGroups[t]=[],e.vertexBuffer){var i=new p({members:this.programInterfaces[t].layoutAttributes,alignment:l.VERTEX_ATTRIBUTE_ALIGNMENT});n.layout.vertex=i;var o=this.paintAttributes[t];for(var a in o){var s=new p({members:o[a].attributes,alignment:l.VERTEX_ATTRIBUTE_ALIGNMENT});n.paint[a]=s}}if(e.elementBuffer){var u=r(e.elementBufferComponents);n.layout.element=u}if(e.elementBuffer2){var c=r(e.elementBuffer2Components);n.layout.element2=c}}},i.prototype.destroy=function(t){for(var e in this.bufferGroups)for(var n=this.bufferGroups[e],i=0;i<n.length;i++){var r=n[i];for(var o in r.paint)r.paint[o].destroy(t);for(var a in r.layout)r.layout[a].destroy(t);for(var s in r.vaos)r.vaos[s].destroy(t);for(var u in r.secondVaos)r.secondVaos[u].destroy(t)}},i.prototype.trimArrays=function(){for(var t in this.arrayGroups){var e=this.arrayGroups[t];for(var n in e.paint)e.paint[n].trim();for(var i in e.layout)e.layout[i].trim()}},i.prototype.setUniforms=function(t,e,n,i,r){for(var o=this.paintAttributes[e][i.id].uniforms,a=0;a<o.length;a++){var s=o[a],u=n[s.name];t[\\\"uniform\\\"+s.components+\\\"fv\\\"](u,s.getValue(i,r))}},i.prototype.serialize=function(){return{layerId:this.layer.id,zoom:this.zoom,arrays:c.mapObject(this.arrayGroups,function(t){return t.map(function(t){return c.mapObject(t,function(t){return c.mapObject(t,function(t){return t.serialize()})})})}),arrayTypes:c.mapObject(this.arrayTypes,function(t){return c.mapObject(t,function(t){return c.mapObject(t,function(t){return t.serialize()})})}),childLayerIds:this.childLayers.map(function(t){return t.id})}},i.prototype.createFilter=function(){this.filter||(this.filter=u(this.layer.filter))};var d={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};i.prototype.recalculateStyleLayers=function(){for(var t=0;t<this.childLayers.length;t++)this.childLayers[t].recalculate(this.zoom,d)},i.prototype.populatePaintArrays=function(t,e,n,i,r){for(var o=0;o<this.childLayers.length;o++)for(var a=this.childLayers[o],s=this.arrayGroups[t],u=i.index;u<s.length;u++){var l=s[u],c=l.layout.vertex.length,p=l.paint[a.id];p.resize(c);for(var f=this.paintAttributes[t][a.id].attributes,h=0;h<f.length;h++)for(var d=f[h],y=d.getValue(a,e,n),m=d.multiplier||1,v=d.components||1,g=r;g<c;g++)for(var x=p.get(g),b=0;b<v;b++){var w=v>1?d.name+b:d.name;x[w]=y[b]*m}}}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.set(t,e)}function r(t){return t.value}var o=n(0),a=n(77),s=n(78),u=n(80),l=n(83),c=n(28),p=n(90);t.exports=i;i.create=function(t,e){return new({background:n(91),circle:n(92),fill:n(93),line:n(94),raster:n(95),symbol:n(96)}[(e||t).type])(t,e)},i.prototype=o.inherit(p,{set:function(t,e){this.id=t.id,this.ref=t.ref,this.metadata=t.metadata,this.type=(e||t).type,this.source=(e||t).source,this.sourceLayer=(e||t)[\\\"source-layer\\\"],this.minzoom=(e||t).minzoom,this.maxzoom=(e||t).maxzoom,this.filter=(e||t).filter,this.paint={},this.layout={},this._paintSpecifications=u[\\\"paint_\\\"+this.type],this._layoutSpecifications=u[\\\"layout_\\\"+this.type],this._paintTransitions={},this._paintTransitionOptions={},this._paintDeclarations={},this._layoutDeclarations={},this._layoutFunctions={};var n,i;for(var r in t){var o=r.match(/^paint(?:\\\\.(.*))?$/);if(o){var a=o[1]||\\\"\\\";for(n in t[r])this.setPaintProperty(n,t[r][n],a)}}if(this.ref)this._layoutDeclarations=e._layoutDeclarations;else for(i in t.layout)this.setLayoutProperty(i,t.layout[i]);for(n in this._paintSpecifications)this.paint[n]=this.getPaintValue(n);for(i in this._layoutSpecifications)this._updateLayoutValue(i)},setLayoutProperty:function(t,e){if(null==e)delete this._layoutDeclarations[t];else{var n=\\\"layers.\\\"+this.id+\\\".layout.\\\"+t;if(this._handleErrors(l.layoutProperty,n,t,e))return;this._layoutDeclarations[t]=new s(this._layoutSpecifications[t],e)}this._updateLayoutValue(t)},getLayoutProperty:function(t){return this._layoutDeclarations[t]&&this._layoutDeclarations[t].value},getLayoutValue:function(t,e,n){var i=this._layoutSpecifications[t],r=this._layoutDeclarations[t];return r?r.calculate(e,n):i.default},setPaintProperty:function(t,e,n){var i=\\\"layers.\\\"+this.id+(n?'[\\\"paint.'+n+'\\\"].':\\\".paint.\\\")+t;if(o.endsWith(t,\\\"-transition\\\"))if(this._paintTransitionOptions[n||\\\"\\\"]||(this._paintTransitionOptions[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintTransitionOptions[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,i,t,e))return;this._paintTransitionOptions[n||\\\"\\\"][t]=e}else if(this._paintDeclarations[n||\\\"\\\"]||(this._paintDeclarations[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintDeclarations[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,i,t,e))return;this._paintDeclarations[n||\\\"\\\"][t]=new s(this._paintSpecifications[t],e)}},getPaintProperty:function(t,e){return e=e||\\\"\\\",o.endsWith(t,\\\"-transition\\\")?this._paintTransitionOptions[e]&&this._paintTransitionOptions[e][t]:this._paintDeclarations[e]&&this._paintDeclarations[e][t]&&this._paintDeclarations[e][t].value},getPaintValue:function(t,e,n){var i=this._paintSpecifications[t],r=this._paintTransitions[t];return r?r.calculate(e,n):\\\"color\\\"===i.type&&i.default?c(i.default):i.default},getPaintValueStopZoomLevels:function(t){var e=this._paintTransitions[t];return e?e.declaration.stopZoomLevels:[]},getPaintInterpolationT:function(t,e){return this._paintTransitions[t].declaration.calculateInterpolationT({zoom:e})},isPaintValueFeatureConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isFeatureConstant},isPaintValueZoomConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isZoomConstant},isHidden:function(t){return!!(this.minzoom&&t<this.minzoom)||(!!(this.maxzoom&&t>=this.maxzoom)||(\\\"none\\\"===this.layout.visibility||0===this.paint[this.type+\\\"-opacity\\\"]))},updatePaintTransitions:function(t,e,n,i){for(var r=o.extend({},this._paintDeclarations[\\\"\\\"]),a=0;a<t.length;a++)o.extend(r,this._paintDeclarations[t[a]]);var s;for(s in r)this._applyPaintDeclaration(s,r[s],e,n,i);for(s in this._paintTransitions)s in r||this._applyPaintDeclaration(s,null,e,n,i)},updatePaintTransition:function(t,e,n,i,r){for(var o=this._paintDeclarations[\\\"\\\"][t],a=0;a<e.length;a++){var s=this._paintDeclarations[e[a]];s&&s[t]&&(o=s[t])}this._applyPaintDeclaration(t,o,n,i,r)},recalculate:function(t,e){for(var n in this._paintTransitions)this.paint[n]=this.getPaintValue(n,{zoom:t,zoomHistory:e});for(var i in this._layoutFunctions)this.layout[i]=this.getLayoutValue(i,{zoom:t,zoomHistory:e})},serialize:function(t){var e={id:this.id,ref:this.ref,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom};for(var n in this._paintDeclarations){e[\\\"\\\"===n?\\\"paint\\\":\\\"paint.\\\"+n]=o.mapObject(this._paintDeclarations[n],r)}return(!this.ref||t&&t.includeRefProperties)&&o.extend(e,{type:this.type,source:this.source,\\\"source-layer\\\":this.sourceLayer,filter:this.filter,layout:o.mapObject(this._layoutDeclarations,r)}),o.filterObject(e,function(t,e){return void 0!==t&&!(\\\"layout\\\"===e&&!Object.keys(t).length)})},_applyPaintDeclaration:function(t,e,n,i,r){var u=n.transition?this._paintTransitions[t]:void 0,l=this._paintSpecifications[t];if(null!==e&&void 0!==e||(e=new s(l,l.default)),!u||u.declaration.json!==e.json){var c=o.extend({duration:300,delay:0},i,this.getPaintProperty(t+\\\"-transition\\\")),p=this._paintTransitions[t]=new a(l,e,u,c);p.instant()||(p.loopID=r.set(p.endTime-Date.now())),u&&r.cancel(u.loopID)}},_updateLayoutValue:function(t){var e=this._layoutDeclarations[t];e&&e.isFunction?this._layoutFunctions[t]=!0:(delete this._layoutFunctions[t],this.layout[t]=this.getLayoutValue(t))},_handleErrors:function(t,e,n,i){return l.emitErrors(this,t.call(l,{key:e,layerType:this.type,objectKey:n,value:i,styleSpec:u,style:{glyphs:!0,sprite:!0}}))}})},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(31);t.exports=function(t){var e=n(32),a=n(9),s={\\\"*\\\":function(){return[]},array:n(33),boolean:n(85),number:n(34),color:n(86),constants:n(30),enum:n(14),filter:n(15),function:n(32),layer:n(35),object:n(9),source:n(38),light:n(39),string:n(40)},u=t.value,l=t.valueSpec,c=t.key,p=t.styleSpec,f=t.style;if(\\\"string\\\"===r(u)&&\\\"@\\\"===u[0]){if(p.$version>7)return[new i(c,u,\\\"constants have been deprecated as of v8\\\")];if(!(u in f.constants))return[new i(c,u,'constant \\\"%s\\\" not found',u)];t=o({},t,{value:f.constants[u]})}return l.function&&\\\"object\\\"===r(u)?e(t):l.type&&s[l.type]?s[l.type](t):a(o({},t,{valueSpec:l.type?p[l.type]:l}))}},function(t,e,n){\\\"use strict\\\";var i=n(0),r=n(4).EXTENT,o=-2*r,a=2*r-1;t.exports=function(t){for(var e=r/t.extent,n=t.loadGeometry(),s=0;s<n.length;s++)for(var u=n[s],l=0;l<u.length;l++){var c=u[l];c.x=Math.round(c.x*e),c.y=Math.round(c.y*e),(c.x<o||c.x>a||c.y<o||c.y>a)&&i.warnOnce(\\\"Geometry exceeds allowed extent, reduce your vector tile buffer size\\\")}return n}},function(t,e,n){\\\"use strict\\\";function i(t){function e(){f.apply(this,arguments)}function n(){h.apply(this,arguments),this.members=e.prototype.members}var i=JSON.stringify(t);if(m[i])return m[i];void 0===t.alignment&&(t.alignment=1),e.prototype=Object.create(f.prototype);var s=0,l=0,v=[\\\"Uint8\\\"];return e.prototype.members=t.members.map(function(n){n={name:n.name,type:n.type,components:n.components||1},d(n.name.length),d(n.type in y),v.indexOf(n.type)<0&&v.push(n.type);var i=a(n.type);l=Math.max(l,i),n.offset=s=o(s,Math.max(t.alignment,i));for(var r=0;r<n.components;r++)Object.defineProperty(e.prototype,n.name+(1===n.components?\\\"\\\":r),{get:c(n,r),set:p(n,r)});return s+=i*n.components,n}),e.prototype.alignment=t.alignment,e.prototype.size=o(s,Math.max(l,t.alignment)),n.serialize=r,n.prototype=Object.create(h.prototype),n.prototype.StructType=e,n.prototype.bytesPerElement=e.prototype.size,n.prototype.emplaceBack=u(e.prototype.members,e.prototype.size),n.prototype._usedTypes=v,m[i]=n,n}function r(){return{members:this.prototype.StructType.prototype.members,alignment:this.prototype.StructType.prototype.alignment,bytesPerElement:this.prototype.bytesPerElement}}function o(t,e){return Math.ceil(t/e)*e}function a(t){return y[t].BYTES_PER_ELEMENT}function s(t){return t.toLowerCase()}function u(t,e){for(var n=[],i=[],r=\\\"var i = this.length;\\\\nthis.resize(this.length + 1);\\\\n\\\",o=0;o<t.length;o++){var u=t[o],l=a(u.type);n.indexOf(l)<0&&(n.push(l),r+=\\\"var o\\\"+l.toFixed(0)+\\\" = i * \\\"+(e/l).toFixed(0)+\\\";\\\\n\\\");for(var c=0;c<u.components;c++){var p=\\\"v\\\"+i.length,f=\\\"o\\\"+l.toFixed(0)+\\\" + \\\"+(u.offset/l+c).toFixed(0);r+=\\\"this.\\\"+s(u.type)+\\\"[\\\"+f+\\\"] = \\\"+p+\\\";\\\\n\\\",i.push(p)}}return r+=\\\"return i;\\\",new Function(i,r)}function l(t,e){var n=\\\"this._pos\\\"+a(t.type).toFixed(0),i=(t.offset/a(t.type)+e).toFixed(0),r=n+\\\" + \\\"+i;return\\\"this._structArray.\\\"+s(t.type)+\\\"[\\\"+r+\\\"]\\\"}function c(t,e){return new Function([],\\\"return \\\"+l(t,e)+\\\";\\\")}function p(t,e){return new Function([\\\"x\\\"],l(t,e)+\\\" = x;\\\")}function f(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8}function h(t){void 0!==t?(this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.capacity=this.arrayBuffer.byteLength/this.bytesPerElement,this._refreshViews()):(this.capacity=-1,this.resize(0))}var d=n(11);t.exports=i;var y={Int8:Int8Array,Uint8:Uint8Array,Uint8Clamped:Uint8ClampedArray,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array,Float64:Float64Array},m={};h.prototype.DEFAULT_CAPACITY=128,h.prototype.RESIZE_MULTIPLIER=5,h.prototype.serialize=function(){return this.trim(),{length:this.length,arrayBuffer:this.arrayBuffer}},h.prototype.get=function(t){return new this.StructType(this,t)},h.prototype.trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},h.prototype.resize=function(t){if(this.length=t,t>this.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*this.RESIZE_MULTIPLIER),this.DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},h.prototype._refreshViews=function(){for(var t=0;t<this._usedTypes.length;t++){var e=this._usedTypes[t];this[s(e)]=new y[e](this.arrayBuffer)}},h.prototype.toArray=function(t,e){for(var n=[],i=t;i<e;i++){var r=this.get(i);n.push(r)}return n}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6);t.exports=function(t){var e=t.key,n=t.value,a=t.valueSpec||{},s=t.objectElementValidators||{},u=t.style,l=t.styleSpec,c=[],p=r(n);if(\\\"object\\\"!==p)return[new i(e,n,\\\"object expected, %s found\\\",p)];for(var f in n){var h,d=f.split(\\\".\\\")[0],y=a[d]||a[\\\"*\\\"];if(s[d])h=s[d];else if(a[d])h=o;else if(s[\\\"*\\\"])h=s[\\\"*\\\"];else{if(!a[\\\"*\\\"]){c.push(new i(e,n[f],'unknown property \\\"%s\\\"',f));continue}h=o}c=c.concat(h({key:(e?e+\\\".\\\":e)+f,value:n[f],valueSpec:y,style:u,styleSpec:l,object:n,objectKey:f}))}for(d in a)a[d].required&&void 0===a[d].default&&void 0===n[d]&&c.push(new i(e,n,'missing required property \\\"%s\\\"',d));return c}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}},function(t,e,n){\\\"use strict\\\";(function(e){function i(t,e){if(t===e)return 0;for(var n=t.length,i=e.length,r=0,o=Math.min(n,i);r<o;++r)if(t[r]!==e[r]){n=t[r],i=e[r];break}return n<i?-1:i<n?1:0}function r(t){return e.Buffer&&\\\"function\\\"==typeof e.Buffer.isBuffer?e.Buffer.isBuffer(t):!(null==t||!t._isBuffer)}function o(t){return Object.prototype.toString.call(t)}function a(t){return!r(t)&&(\\\"function\\\"==typeof e.ArrayBuffer&&(\\\"function\\\"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):!!t&&(t instanceof DataView||!!(t.buffer&&t.buffer instanceof ArrayBuffer))))}function s(t){if(k.isFunction(t)){if(z)return t.name;var e=t.toString(),n=e.match(j);return n&&n[1]}}function u(t,e){return\\\"string\\\"==typeof t?t.length<e?t:t.slice(0,e):t}function l(t){if(z||!k.isFunction(t))return k.inspect(t);var e=s(t);return\\\"[Function\\\"+(e?\\\": \\\"+e:\\\"\\\")+\\\"]\\\"}function c(t){return u(l(t.actual),128)+\\\" \\\"+t.operator+\\\" \\\"+u(l(t.expected),128)}function p(t,e,n,i,r){throw new T.AssertionError({message:n,actual:t,expected:e,operator:i,stackStartFunction:r})}function f(t,e){t||p(t,!0,e,\\\"==\\\",T.ok)}function h(t,e,n,s){if(t===e)return!0;if(r(t)&&r(e))return 0===i(t,e);if(k.isDate(t)&&k.isDate(e))return t.getTime()===e.getTime();if(k.isRegExp(t)&&k.isRegExp(e))return t.source===e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&\\\"object\\\"==typeof t||null!==e&&\\\"object\\\"==typeof e){if(a(t)&&a(e)&&o(t)===o(e)&&!(t instanceof Float32Array||t instanceof Float64Array))return 0===i(new Uint8Array(t.buffer),new Uint8Array(e.buffer));if(r(t)!==r(e))return!1;s=s||{actual:[],expected:[]};var u=s.actual.indexOf(t);return-1!==u&&u===s.expected.indexOf(e)||(s.actual.push(t),s.expected.push(e),y(t,e,n,s))}return n?t===e:t==e}function d(t){return\\\"[object Arguments]\\\"==Object.prototype.toString.call(t)}function y(t,e,n,i){if(null===t||void 0===t||null===e||void 0===e)return!1;if(k.isPrimitive(t)||k.isPrimitive(e))return t===e;if(n&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var r=d(t),o=d(e);if(r&&!o||!r&&o)return!1;if(r)return t=S.call(t),e=S.call(e),h(t,e,n);var a,s,u=M(t),l=M(e);if(u.length!==l.length)return!1;for(u.sort(),l.sort(),s=u.length-1;s>=0;s--)if(u[s]!==l[s])return!1;for(s=u.length-1;s>=0;s--)if(a=u[s],!h(t[a],e[a],n,i))return!1;return!0}function m(t,e,n){h(t,e,!0)&&p(t,e,n,\\\"notDeepStrictEqual\\\",m)}function v(t,e){if(!t||!e)return!1;if(\\\"[object RegExp]\\\"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function g(t){var e;try{t()}catch(t){e=t}return e}function x(t,e,n,i){var r;if(\\\"function\\\"!=typeof e)throw new TypeError('\\\"block\\\" argument must be a function');\\\"string\\\"==typeof n&&(i=n,n=null),r=g(e),i=(n&&n.name?\\\" (\\\"+n.name+\\\").\\\":\\\".\\\")+(i?\\\" \\\"+i:\\\".\\\"),t&&!r&&p(r,n,\\\"Missing expected exception\\\"+i);var o=\\\"string\\\"==typeof i,a=!t&&k.isError(r),s=!t&&r&&!n;if((a&&o&&v(r,n)||s)&&p(r,n,\\\"Got unwanted exception\\\"+i),t&&r&&n&&!v(r,n)||!t&&r)throw r}function b(t,e){t||p(t,!0,e,\\\"==\\\",b)}var w=n(49),k=n(18),_=Object.prototype.hasOwnProperty,S=Array.prototype.slice,z=function(){return\\\"foo\\\"===function(){}.name}(),T=t.exports=f,j=/\\\\s*function\\\\s+([^\\\\(\\\\s]*)\\\\s*/;T.AssertionError=function(t){this.name=\\\"AssertionError\\\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=c(this),this.generatedMessage=!0);var e=t.stackStartFunction||p;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var n=new Error;if(n.stack){var i=n.stack,r=s(e),o=i.indexOf(\\\"\\\\n\\\"+r);if(o>=0){var a=i.indexOf(\\\"\\\\n\\\",o+1);i=i.substring(a+1)}this.stack=i}}},k.inherits(T.AssertionError,Error),T.fail=p,T.ok=f,T.equal=function(t,e,n){t!=e&&p(t,e,n,\\\"==\\\",T.equal)},T.notEqual=function(t,e,n){t==e&&p(t,e,n,\\\"!=\\\",T.notEqual)},T.deepEqual=function(t,e,n){h(t,e,!1)||p(t,e,n,\\\"deepEqual\\\",T.deepEqual)},T.deepStrictEqual=function(t,e,n){h(t,e,!0)||p(t,e,n,\\\"deepStrictEqual\\\",T.deepStrictEqual)},T.notDeepEqual=function(t,e,n){h(t,e,!1)&&p(t,e,n,\\\"notDeepEqual\\\",T.notDeepEqual)},T.notDeepStrictEqual=m,T.strictEqual=function(t,e,n){t!==e&&p(t,e,n,\\\"===\\\",T.strictEqual)},T.notStrictEqual=function(t,e,n){t===e&&p(t,e,n,\\\"!==\\\",T.notStrictEqual)},T.throws=function(t,e,n){x(!0,t,e,n)},T.doesNotThrow=function(t,e,n){x(!1,t,e,n)},T.ifError=function(t){if(t)throw t},T.strict=w(b,T,{equal:T.strictEqual,deepEqual:T.deepStrictEqual,notEqual:T.notStrictEqual,notDeepEqual:T.notDeepStrictEqual}),T.strict.strict=T.strict;var M=Object.keys||function(t){var e=[];for(var n in t)_.call(t,n)&&e.push(n);return e}}).call(e,n(17))},function(t,e,n){t.exports.VectorTile=n(68),t.exports.VectorTileFeature=n(26),t.exports.VectorTileLayer=n(25)},function(t,e,n){\\\"use strict\\\";(function(e){function i(t){this.buf=m.isBuffer(t)?t:new m(t||0),this.pos=0,this.length=this.buf.length}function r(t,e){var n,i=e.buf;if(n=i[e.pos++],t+=268435456*(127&n),n<128)return t;if(n=i[e.pos++],t+=34359738368*(127&n),n<128)return t;if(n=i[e.pos++],t+=4398046511104*(127&n),n<128)return t;if(n=i[e.pos++],t+=562949953421312*(127&n),n<128)return t;if(n=i[e.pos++],t+=72057594037927940*(127&n),n<128)return t;if(n=i[e.pos++],t+=0x8000000000000000*(127&n),n<128)return t;throw new Error(\\\"Expected varint not more than 10 bytes\\\")}function o(t,e){e.realloc(10);for(var n=e.pos+10;t>=1;){if(e.pos>=n)throw new Error(\\\"Given varint doesn't fit into 10 bytes\\\");var i=255&t;e.buf[e.pos++]=i|(t>=128?128:0),t/=128}}function a(t,e,n){var i=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.ceil(Math.log(e)/(7*Math.LN2));n.realloc(i);for(var r=n.pos-1;r>=t;r--)n.buf[r+i]=n.buf[r]}function s(t,e){for(var n=0;n<t.length;n++)e.writeVarint(t[n])}function u(t,e){for(var n=0;n<t.length;n++)e.writeSVarint(t[n])}function l(t,e){for(var n=0;n<t.length;n++)e.writeFloat(t[n])}function c(t,e){for(var n=0;n<t.length;n++)e.writeDouble(t[n])}function p(t,e){for(var n=0;n<t.length;n++)e.writeBoolean(t[n])}function f(t,e){for(var n=0;n<t.length;n++)e.writeFixed32(t[n])}function h(t,e){for(var n=0;n<t.length;n++)e.writeSFixed32(t[n])}function d(t,e){for(var n=0;n<t.length;n++)e.writeFixed64(t[n])}function y(t,e){for(var n=0;n<t.length;n++)e.writeSFixed64(t[n])}t.exports=i;var m=e.Buffer||n(69);i.Varint=0,i.Fixed64=1,i.Bytes=2,i.Fixed32=5;var v=Math.pow(2,63);i.prototype={destroy:function(){this.buf=null},readFields:function(t,e,n){for(n=n||this.length;this.pos<n;){var i=this.readVarint(),r=i>>3,o=this.pos;t(r,e,this),this.pos===o&&this.skip(i)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readUInt32LE(this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readInt32LE(this.pos+4);return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,e,n=this.buf;return e=n[this.pos++],t=127&e,e<128?t:(e=n[this.pos++],t|=(127&e)<<7,e<128?t:(e=n[this.pos++],t|=(127&e)<<14,e<128?t:(e=n[this.pos++],t|=(127&e)<<21,e<128?t:r(t,this))))},readVarint64:function(){var t=this.pos,e=this.readVarint();if(e<v)return e;for(var n=this.pos-2;255===this.buf[n];)n--;n<t&&(n=t),e=0;for(var i=0;i<n-t+1;i++){var r=127&~this.buf[t+i];e+=i<4?r<<7*i:r*Math.pow(2,7*i)}return-e-1},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.buf.toString(\\\"utf8\\\",this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.slice(this.pos,t);return this.pos=t,e},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readVarint());return e},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(t){var e=7&t;if(e===i.Varint)for(;this.buf[this.pos++]>127;);else if(e===i.Bytes)this.pos=this.readVarint()+this.pos;else if(e===i.Fixed32)this.pos+=4;else{if(e!==i.Fixed64)throw new Error(\\\"Unimplemented type: \\\"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var n=new m(e);this.buf.copy(n),this.buf=n,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(t){if((t=+t)>268435455)return void o(t,this);this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var e=m.byteLength(t);this.writeVarint(e),this.realloc(e),this.buf.write(t,this.pos),this.pos+=e},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var n=0;n<e;n++)this.buf[this.pos++]=t[n]},writeRawMessage:function(t,e){this.pos++;var n=this.pos;t(e,this);var i=this.pos-n;i>=128&&a(n,i,this),this.pos=n-1,this.writeVarint(i),this.pos+=i},writeMessage:function(t,e,n){this.writeTag(t,i.Bytes),this.writeRawMessage(e,n)},writePackedVarint:function(t,e){this.writeMessage(t,s,e)},writePackedSVarint:function(t,e){this.writeMessage(t,u,e)},writePackedBoolean:function(t,e){this.writeMessage(t,p,e)},writePackedFloat:function(t,e){this.writeMessage(t,l,e)},writePackedDouble:function(t,e){this.writeMessage(t,c,e)},writePackedFixed32:function(t,e){this.writeMessage(t,f,e)},writePackedSFixed32:function(t,e){this.writeMessage(t,h,e)},writePackedFixed64:function(t,e){this.writeMessage(t,d,e)},writePackedSFixed64:function(t,e){this.writeMessage(t,y,e)},writeBytesField:function(t,e){this.writeTag(t,i.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,i.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,i.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,i.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,i.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,i.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,i.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,i.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,i.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,i.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}}}).call(e,n(17))},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=[];return Array.isArray(o.values)?-1===o.values.indexOf(r(n))&&a.push(new i(e,n,\\\"expected one of [%s], %s found\\\",o.values.join(\\\", \\\"),n)):-1===Object.keys(o.values).indexOf(r(n))&&a.push(new i(e,n,\\\"expected one of [%s], %s found\\\",Object.keys(o.values).join(\\\", \\\"),n)),a}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(14),o=n(3),a=n(10);t.exports=function t(e){var n,s=e.value,u=e.key,l=e.styleSpec,c=[];if(\\\"array\\\"!==o(s))return[new i(u,s,\\\"array expected, %s found\\\",o(s))];if(s.length<1)return[new i(u,s,\\\"filter array must have at least 1 element\\\")];switch(c=c.concat(r({key:u+\\\"[0]\\\",value:s[0],valueSpec:l.filter_operator,style:e.style,styleSpec:e.styleSpec})),a(s[0])){case\\\"<\\\":case\\\"<=\\\":case\\\">\\\":case\\\">=\\\":s.length>=2&&\\\"$type\\\"==s[1]&&c.push(new i(u,s,'\\\"$type\\\" cannot be use with operator \\\"%s\\\"',s[0]));case\\\"==\\\":case\\\"!=\\\":3!=s.length&&c.push(new i(u,s,'filter array for operator \\\"%s\\\" must have 3 elements',s[0]));case\\\"in\\\":case\\\"!in\\\":s.length>=2&&(n=o(s[1]),\\\"string\\\"!==n?c.push(new i(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new i(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\")));for(var p=2;p<s.length;p++)n=o(s[p]),\\\"$type\\\"==s[1]?c=c.concat(r({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],valueSpec:l.geometry_type,style:e.style,styleSpec:e.styleSpec})):\\\"string\\\"===n&&\\\"@\\\"===s[p][0]?c.push(new i(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"filter value cannot be a constant\\\")):\\\"string\\\"!==n&&\\\"number\\\"!==n&&\\\"boolean\\\"!==n&&c.push(new i(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"string, number, or boolean expected, %s found\\\",n));break;case\\\"any\\\":case\\\"all\\\":case\\\"none\\\":for(p=1;p<s.length;p++)c=c.concat(t({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],style:e.style,styleSpec:e.styleSpec}));break;case\\\"has\\\":case\\\"!has\\\":n=o(s[1]),2!==s.length?c.push(new i(u,s,'filter array for \\\"%s\\\" operator must have 2 elements',s[0])):\\\"string\\\"!==n?c.push(new i(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new i(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\"))}return c}},function(t,e,n){\\\"use strict\\\";function i(t){return new Function(\\\"f\\\",\\\"var p = (f && f.properties || {}); return \\\"+r(t))}function r(t){if(!t)return\\\"true\\\";var e=t[0];return t.length<=1?\\\"any\\\"===e?\\\"false\\\":\\\"true\\\":\\\"(\\\"+(\\\"==\\\"===e?a(t[1],t[2],\\\"===\\\",!1):\\\"!=\\\"===e?a(t[1],t[2],\\\"!==\\\",!1):\\\"<\\\"===e||\\\">\\\"===e||\\\"<=\\\"===e||\\\">=\\\"===e?a(t[1],t[2],e,!0):\\\"any\\\"===e?s(t.slice(1),\\\"||\\\"):\\\"all\\\"===e?s(t.slice(1),\\\"&&\\\"):\\\"none\\\"===e?c(s(t.slice(1),\\\"||\\\")):\\\"in\\\"===e?u(t[1],t.slice(2)):\\\"!in\\\"===e?c(u(t[1],t.slice(2))):\\\"has\\\"===e?l(t[1]):\\\"!has\\\"===e?c(l([t[1]])):\\\"true\\\")+\\\")\\\"}function o(t){return\\\"$type\\\"===t?\\\"f.type\\\":\\\"$id\\\"===t?\\\"f.id\\\":\\\"p[\\\"+JSON.stringify(t)+\\\"]\\\"}function a(t,e,n,i){var r=o(t),a=\\\"$type\\\"===t?f.indexOf(e):JSON.stringify(e);return(i?\\\"typeof \\\"+r+\\\"=== typeof \\\"+a+\\\"&&\\\":\\\"\\\")+r+n+a}function s(t,e){return t.map(r).join(e)}function u(t,e){\\\"$type\\\"===t&&(e=e.map(function(t){return f.indexOf(t)}));var n=JSON.stringify(e.sort(p)),i=o(t);return e.length<=200?n+\\\".indexOf(\\\"+i+\\\") !== -1\\\":\\\"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1;    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }(\\\"+i+\\\", \\\"+n+\\\",0,\\\"+(e.length-1)+\\\")\\\"}function l(t){return JSON.stringify(t)+\\\" in p\\\"}function c(t){return\\\"!(\\\"+t+\\\")\\\"}function p(t,e){return t<e?-1:t>e?1:0}t.exports=i;var f=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},function(t,e){var n;n=function(){return this}();try{n=n||Function(\\\"return this\\\")()||(0,eval)(\\\"this\\\")}catch(t){\\\"object\\\"==typeof window&&(n=window)}t.exports=n},function(t,e,n){(function(t){function i(t,n){var i={seen:[],stylize:o};return arguments.length>=3&&(i.depth=arguments[2]),arguments.length>=4&&(i.colors=arguments[3]),d(n)?i.showHidden=n:n&&e._extend(i,n),b(i.showHidden)&&(i.showHidden=!1),b(i.depth)&&(i.depth=2),b(i.colors)&&(i.colors=!1),b(i.customInspect)&&(i.customInspect=!0),i.colors&&(i.stylize=r),s(i,t,i.depth)}function r(t,e){var n=i.styles[e];return n?\\\"\\u001b[\\\"+i.colors[n][0]+\\\"m\\\"+t+\\\"\\u001b[\\\"+i.colors[n][1]+\\\"m\\\":t}function o(t,e){return t}function a(t){var e={};return t.forEach(function(t,n){e[t]=!0}),e}function s(t,n,i){if(t.customInspect&&n&&z(n.inspect)&&n.inspect!==e.inspect&&(!n.constructor||n.constructor.prototype!==n)){var r=n.inspect(i,t);return g(r)||(r=s(t,r,i)),r}var o=u(t,n);if(o)return o;var d=Object.keys(n),y=a(d);if(t.showHidden&&(d=Object.getOwnPropertyNames(n)),S(n)&&(d.indexOf(\\\"message\\\")>=0||d.indexOf(\\\"description\\\")>=0))return l(n);if(0===d.length){if(z(n)){var m=n.name?\\\": \\\"+n.name:\\\"\\\";return t.stylize(\\\"[Function\\\"+m+\\\"]\\\",\\\"special\\\")}if(w(n))return t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\");if(_(n))return t.stylize(Date.prototype.toString.call(n),\\\"date\\\");if(S(n))return l(n)}var v=\\\"\\\",x=!1,b=[\\\"{\\\",\\\"}\\\"];if(h(n)&&(x=!0,b=[\\\"[\\\",\\\"]\\\"]),z(n)){v=\\\" [Function\\\"+(n.name?\\\": \\\"+n.name:\\\"\\\")+\\\"]\\\"}if(w(n)&&(v=\\\" \\\"+RegExp.prototype.toString.call(n)),_(n)&&(v=\\\" \\\"+Date.prototype.toUTCString.call(n)),S(n)&&(v=\\\" \\\"+l(n)),0===d.length&&(!x||0==n.length))return b[0]+v+b[1];if(i<0)return w(n)?t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\"):t.stylize(\\\"[Object]\\\",\\\"special\\\");t.seen.push(n);var k;return k=x?c(t,n,i,y,d):d.map(function(e){return p(t,n,i,y,e,x)}),t.seen.pop(),f(k,v,b)}function u(t,e){if(b(e))return t.stylize(\\\"undefined\\\",\\\"undefined\\\");if(g(e)){var n=\\\"'\\\"+JSON.stringify(e).replace(/^\\\"|\\\"$/g,\\\"\\\").replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"')+\\\"'\\\";return t.stylize(n,\\\"string\\\")}return v(e)?t.stylize(\\\"\\\"+e,\\\"number\\\"):d(e)?t.stylize(\\\"\\\"+e,\\\"boolean\\\"):y(e)?t.stylize(\\\"null\\\",\\\"null\\\"):void 0}function l(t){return\\\"[\\\"+Error.prototype.toString.call(t)+\\\"]\\\"}function c(t,e,n,i,r){for(var o=[],a=0,s=e.length;a<s;++a)P(e,String(a))?o.push(p(t,e,n,i,String(a),!0)):o.push(\\\"\\\");return r.forEach(function(r){r.match(/^\\\\d+$/)||o.push(p(t,e,n,i,r,!0))}),o}function p(t,e,n,i,r,o){var a,u,l;if(l=Object.getOwnPropertyDescriptor(e,r)||{value:e[r]},l.get?u=l.set?t.stylize(\\\"[Getter/Setter]\\\",\\\"special\\\"):t.stylize(\\\"[Getter]\\\",\\\"special\\\"):l.set&&(u=t.stylize(\\\"[Setter]\\\",\\\"special\\\")),P(i,r)||(a=\\\"[\\\"+r+\\\"]\\\"),u||(t.seen.indexOf(l.value)<0?(u=y(n)?s(t,l.value,null):s(t,l.value,n-1),u.indexOf(\\\"\\\\n\\\")>-1&&(u=o?u.split(\\\"\\\\n\\\").map(function(t){return\\\"  \\\"+t}).join(\\\"\\\\n\\\").substr(2):\\\"\\\\n\\\"+u.split(\\\"\\\\n\\\").map(function(t){return\\\"   \\\"+t}).join(\\\"\\\\n\\\"))):u=t.stylize(\\\"[Circular]\\\",\\\"special\\\")),b(a)){if(o&&r.match(/^\\\\d+$/))return u;a=JSON.stringify(\\\"\\\"+r),a.match(/^\\\"([a-zA-Z_][a-zA-Z_0-9]*)\\\"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,\\\"name\\\")):(a=a.replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"').replace(/(^\\\"|\\\"$)/g,\\\"'\\\"),a=t.stylize(a,\\\"string\\\"))}return a+\\\": \\\"+u}function f(t,e,n){var i=0;return t.reduce(function(t,e){return i++,e.indexOf(\\\"\\\\n\\\")>=0&&i++,t+e.replace(/\\\\u001b\\\\[\\\\d\\\\d?m/g,\\\"\\\").length+1},0)>60?n[0]+(\\\"\\\"===e?\\\"\\\":e+\\\"\\\\n \\\")+\\\" \\\"+t.join(\\\",\\\\n  \\\")+\\\" \\\"+n[1]:n[0]+e+\\\" \\\"+t.join(\\\", \\\")+\\\" \\\"+n[1]}function h(t){return Array.isArray(t)}function d(t){return\\\"boolean\\\"==typeof t}function y(t){return null===t}function m(t){return null==t}function v(t){return\\\"number\\\"==typeof t}function g(t){return\\\"string\\\"==typeof t}function x(t){return\\\"symbol\\\"==typeof t}function b(t){return void 0===t}function w(t){return k(t)&&\\\"[object RegExp]\\\"===j(t)}function k(t){return\\\"object\\\"==typeof t&&null!==t}function _(t){return k(t)&&\\\"[object Date]\\\"===j(t)}function S(t){return k(t)&&(\\\"[object Error]\\\"===j(t)||t instanceof Error)}function z(t){return\\\"function\\\"==typeof t}function T(t){return null===t||\\\"boolean\\\"==typeof t||\\\"number\\\"==typeof t||\\\"string\\\"==typeof t||\\\"symbol\\\"==typeof t||void 0===t}function j(t){return Object.prototype.toString.call(t)}function M(t){return t<10?\\\"0\\\"+t.toString(10):t.toString(10)}function I(){var t=new Date,e=[M(t.getHours()),M(t.getMinutes()),M(t.getSeconds())].join(\\\":\\\");return[t.getDate(),O[t.getMonth()],e].join(\\\" \\\")}function P(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function E(t,e){if(!t){var n=new Error(\\\"Promise was rejected with a falsy value\\\");n.reason=t,t=n}return e(t)}function F(e){function n(){for(var n=[],i=0;i<arguments.length;i++)n.push(arguments[i]);var r=n.pop();if(\\\"function\\\"!=typeof r)throw new TypeError(\\\"The last argument must be of type Function\\\");var o=this,a=function(){return r.apply(o,arguments)};e.apply(this,n).then(function(e){t.nextTick(a,null,e)},function(e){t.nextTick(E,e,a)})}if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"original\\\" argument must be of type Function');return Object.setPrototypeOf(n,Object.getPrototypeOf(e)),Object.defineProperties(n,A(e)),n}var A=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),n={},i=0;i<e.length;i++)n[e[i]]=Object.getOwnPropertyDescriptor(t,e[i]);return n},V=/%[sdj%]/g;e.format=function(t){if(!g(t)){for(var e=[],n=0;n<arguments.length;n++)e.push(i(arguments[n]));return e.join(\\\" \\\")}for(var n=1,r=arguments,o=r.length,a=String(t).replace(V,function(t){if(\\\"%%\\\"===t)return\\\"%\\\";if(n>=o)return t;switch(t){case\\\"%s\\\":return String(r[n++]);case\\\"%d\\\":return Number(r[n++]);case\\\"%j\\\":try{return JSON.stringify(r[n++])}catch(t){return\\\"[Circular]\\\"}default:return t}}),s=r[n];n<o;s=r[++n])y(s)||!k(s)?a+=\\\" \\\"+s:a+=\\\" \\\"+i(s);return a},e.deprecate=function(n,i){function r(){if(!o){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),o=!0}return n.apply(this,arguments)}if(void 0!==t&&!0===t.noDeprecation)return n;if(void 0===t)return function(){return e.deprecate(n,i).apply(this,arguments)};var o=!1;return r};var q,L={};e.debuglog=function(n){if(b(q)&&(q=Object({NODE_ENV:\\\"production\\\"}).NODE_DEBUG||\\\"\\\"),n=n.toUpperCase(),!L[n])if(new RegExp(\\\"\\\\\\\\b\\\"+n+\\\"\\\\\\\\b\\\",\\\"i\\\").test(q)){var i=t.pid;L[n]=function(){var t=e.format.apply(e,arguments);console.error(\\\"%s %d: %s\\\",n,i,t)}}else L[n]=function(){};return L[n]},e.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:\\\"cyan\\\",number:\\\"yellow\\\",boolean:\\\"yellow\\\",undefined:\\\"grey\\\",null:\\\"bold\\\",string:\\\"green\\\",date:\\\"magenta\\\",regexp:\\\"red\\\"},e.isArray=h,e.isBoolean=d,e.isNull=y,e.isNullOrUndefined=m,e.isNumber=v,e.isString=g,e.isSymbol=x,e.isUndefined=b,e.isRegExp=w,e.isObject=k,e.isDate=_,e.isError=S,e.isFunction=z,e.isPrimitive=T,e.isBuffer=n(51);var O=[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"];e.log=function(){console.log(\\\"%s - %s\\\",I(),e.format.apply(e,arguments))},e.inherits=n(52),e._extend=function(t,e){if(!e||!k(e))return t;for(var n=Object.keys(e),i=n.length;i--;)t[n[i]]=e[n[i]];return t};var B=\\\"undefined\\\"!=typeof Symbol?Symbol(\\\"util.promisify.custom\\\"):void 0;e.promisify=function(t){function e(){for(var e,n,i=new Promise(function(t,i){e=t,n=i}),r=[],o=0;o<arguments.length;o++)r.push(arguments[o]);r.push(function(t,i){t?n(t):e(i)});try{t.apply(this,r)}catch(t){n(t)}return i}if(\\\"function\\\"!=typeof t)throw new TypeError('The \\\"original\\\" argument must be of type Function');if(B&&t[B]){var e=t[B];if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"util.promisify.custom\\\" argument must be of type Function');return Object.defineProperty(e,B,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),B&&Object.defineProperty(e,B,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,A(t))},e.promisify.custom=B,e.callbackify=F}).call(e,n(50))},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.x=t,this.y=e,this.angle=n,void 0!==i&&(this.segment=i)}var r=n(2);t.exports=i,i.prototype=Object.create(r.prototype),i.prototype.clone=function(){return new i(this.x,this.y,this.angle,this.segment)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){return t*(1-n)+e*n}t.exports=i,i.number=i,i.vec2=function(t,e,n){return[i(t[0],e[0],n),i(t[1],e[1],n)]},i.color=function(t,e,n){return[i(t[0],e[0],n),i(t[1],e[1],n),i(t[2],e[2],n),i(t[3],e[3],n)]},i.array=function(t,e,n){return t.map(function(t,r){return i(t,e[r],n)})}},function(t,e,n){\\\"use strict\\\";function i(t,e){return e.replace(/{([^{}]+)}/g,function(e,n){return n in t?t[n]:\\\"\\\"})}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a,s,u){this.anchorPoint=t,this.tl=e,this.tr=n,this.bl=i,this.br=r,this.tex=o,this.angle=a,this.minScale=s,this.maxScale=u}function r(t,e,n,r,o,a){var l=e.image.rect,c=e.left-1,p=c+l.w/e.image.pixelRatio,f=e.top-1,h=f+l.h/e.image.pixelRatio,d=new s(c,f),y=new s(p,f),m=new s(p,h),v=new s(c,h),g=o[\\\"icon-rotate\\\"]*Math.PI/180;if(a){var x=r[t.segment];if(t.y===x.y&&t.x===x.x&&t.segment+1<r.length){var b=r[t.segment+1];g+=Math.atan2(t.y-b.y,t.x-b.x)+Math.PI}else g+=Math.atan2(t.y-x.y,t.x-x.x)}if(g){var w=Math.sin(g),k=Math.cos(g),_=[k,-w,w,k];d=d.matMult(_),y=y.matMult(_),v=v.matMult(_),m=m.matMult(_)}return[new i(new s(t.x,t.y),d,y,v,m,e.image.rect,0,u,1/0)]}function o(t,e,n,r,o,l){for(var c=o[\\\"text-rotate\\\"]*Math.PI/180,p=o[\\\"text-keep-upright\\\"],f=e.positionedGlyphs,h=[],d=0;d<f.length;d++){var y=f[d],m=y.glyph,v=m.rect;if(v){var g,x=(y.x+m.advance/2)*n,b=u;l?(g=[],b=a(g,t,x,r,t.segment,!0),p&&(b=Math.min(b,a(g,t,x,r,t.segment,!1)))):g=[{anchorPoint:new s(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:u}];for(var w=y.x+m.left,k=y.y-m.top,_=w+v.w,S=k+v.h,z=new s(w,k),T=new s(_,k),j=new s(w,S),M=new s(_,S),I=0;I<g.length;I++){var P=g[I],E=z,F=T,A=j,V=M,q=P.angle+c;if(q){var L=Math.sin(q),O=Math.cos(q),B=[O,-L,L,O];E=E.matMult(B),F=F.matMult(B),A=A.matMult(B),V=V.matMult(B)}var C=Math.max(P.minScale,b),D=(t.angle+c+P.offset+2*Math.PI)%(2*Math.PI);h.push(new i(P.anchorPoint,E,F,A,V,v,D,C,P.maxScale))}}}return h}function a(t,e,n,i,r,o){var a=!o;n<0&&(o=!o),o&&r++;var l=new s(e.x,e.y),c=i[r],p=1/0;n=Math.abs(n);for(var f=u;;){var h=l.dist(c),d=n/h,y=Math.atan2(c.y-l.y,c.x-l.x);if(o||(y+=Math.PI),a&&(y+=Math.PI),t.push({anchorPoint:l,offset:a?Math.PI:0,minScale:d,maxScale:p,angle:(y+2*Math.PI)%(2*Math.PI)}),d<=f)break;for(l=c;l.equals(c);)if(r+=o?1:-1,!(c=i[r]))return d;var m=c.sub(l)._unit();l=l.sub(m._mult(h)),p=d}return f}var s=n(2);t.exports={getIconQuads:r,getGlyphQuads:o,SymbolQuad:i};var u=.5},function(t,e,n){\\\"use strict\\\";function i(t,e,n){var i=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var o=new Int32Array(this.arrayBuffer);t=o[0],e=o[1],n=o[2],this.d=e+2*n;for(var a=0;a<this.d*this.d;a++){var s=o[r+a],u=o[r+a+1];i.push(s===u?null:o.subarray(s,u))}var l=o[r+i.length],c=o[r+i.length+1];this.keys=o.subarray(l,c),this.bboxes=o.subarray(c),this.insert=this._insertReadonly}else{this.d=e+2*n;for(var p=0;p<this.d*this.d;p++)i.push([]);this.keys=[],this.bboxes=[]}this.n=e,this.extent=t,this.padding=n,this.scale=e/t,this.uid=0;var f=n/e*t;this.min=-f,this.max=t+f}t.exports=i;var r=3;i.prototype.insert=function(t,e,n,i,r){this._forEachCell(e,n,i,r,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(n),this.bboxes.push(i),this.bboxes.push(r)},i.prototype._insertReadonly=function(){throw\\\"Cannot insert into a GridIndex created from an ArrayBuffer.\\\"},i.prototype._insertCell=function(t,e,n,i,r,o){this.cells[r].push(o)},i.prototype.query=function(t,e,n,i){var r=this.min,o=this.max;if(t<=r&&e<=r&&o<=n&&o<=i)return this.keys.slice();var a=[],s={};return this._forEachCell(t,e,n,i,this._queryCell,a,s),a},i.prototype._queryCell=function(t,e,n,i,r,o,a){var s=this.cells[r];if(null!==s)for(var u=this.keys,l=this.bboxes,c=0;c<s.length;c++){var p=s[c];if(void 0===a[p]){var f=4*p;t<=l[f+2]&&e<=l[f+3]&&n>=l[f+0]&&i>=l[f+1]?(a[p]=!0,o.push(u[p])):a[p]=!1}}},i.prototype._forEachCell=function(t,e,n,i,r,o,a){for(var s=this._convertToCellCoord(t),u=this._convertToCellCoord(e),l=this._convertToCellCoord(n),c=this._convertToCellCoord(i),p=s;p<=l;p++)for(var f=u;f<=c;f++){var h=this.d*f+p;if(r.call(this,t,e,n,i,h,o,a))return}},i.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},i.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=r+this.cells.length+1+1,n=0,i=0;i<this.cells.length;i++)n+=this.cells[i].length;var o=new Int32Array(e+n+this.keys.length+this.bboxes.length);o[0]=this.extent,o[1]=this.n,o[2]=this.padding;for(var a=e,s=0;s<t.length;s++){var u=t[s];o[r+s]=a,o.set(u,a),a+=u.length}return o[r+t.length]=a,o.set(this.keys,a),a+=this.keys.length,o[r+t.length+1]=a,o.set(this.bboxes,a),a+=this.bboxes.length,o.buffer}},function(t,e,n){\\\"use strict\\\";function i(t){this._stringToNumber={},this._numberToString=[];for(var e=0;e<t.length;e++){var n=t[e];this._stringToNumber[n]=e,this._numberToString[e]=n}}var r=n(11);t.exports=i,i.prototype.encode=function(t){return r(t in this._stringToNumber),this._stringToNumber[t]},i.prototype.decode=function(t){return r(t<this._numberToString.length),this._numberToString[t]}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(r,this,e),this.length=this._features.length}function r(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():5===t?e.extent=n.readVarint():2===t?e._features.push(n.pos):3===t?e._keys.push(n.readString()):4===t&&e._values.push(o(n))}function o(t){for(var e=null,n=t.readVarint()+t.pos;t.pos<n;){var i=t.readVarint()>>3;e=1===i?t.readString():2===i?t.readFloat():3===i?t.readDouble():4===i?t.readVarint64():5===i?t.readVarint():6===i?t.readSVarint():7===i?t.readBoolean():null}return e}var a=n(26);t.exports=i,i.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\\\"feature index out of bounds\\\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new a(this._pbf,e,this.extent,this._keys,this._values)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){this.properties={},this.extent=n,this.type=0,this._pbf=t,this._geometry=-1,this._keys=i,this._values=o,t.readFields(r,this,e)}function r(t,e,n){1==t?e.id=n.readVarint():2==t?o(n,e):3==t?e.type=n.readVarint():4==t&&(e._geometry=n.pos)}function o(t,e){for(var n=t.readVarint()+t.pos;t.pos<n;){var i=e._keys[t.readVarint()],r=e._values[t.readVarint()];e.properties[i]=r}}function a(t){var e=t.length;if(e<=1)return[t];for(var n,i,r=[],o=0;o<e;o++){var a=s(t[o]);0!==a&&(void 0===i&&(i=a<0),i===a<0?(n&&r.push(n),n=[t[o]]):n.push(t[o]))}return n&&r.push(n),r}function s(t){for(var e,n,i=0,r=0,o=t.length,a=o-1;r<o;a=r++)e=t[r],n=t[a],i+=(n.x-e.x)*(e.y+n.y);return i}var u=n(2);t.exports=i,i.types=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"],i.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,n=t.readVarint()+t.pos,i=1,r=0,o=0,a=0,s=[];t.pos<n;){if(!r){var l=t.readVarint();i=7&l,r=l>>3}if(r--,1===i||2===i)o+=t.readSVarint(),a+=t.readSVarint(),1===i&&(e&&s.push(e),e=[]),e.push(new u(o,a));else{if(7!==i)throw new Error(\\\"unknown command \\\"+i);e&&e.push(e[0].clone())}}return e&&s.push(e),s},i.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,n=1,i=0,r=0,o=0,a=1/0,s=-1/0,u=1/0,l=-1/0;t.pos<e;){if(!i){var c=t.readVarint();n=7&c,i=c>>3}if(i--,1===n||2===n)r+=t.readSVarint(),o+=t.readSVarint(),r<a&&(a=r),r>s&&(s=r),o<u&&(u=o),o>l&&(l=o);else if(7!==n)throw new Error(\\\"unknown command \\\"+n)}return[a,u,s,l]},i.prototype.toGeoJSON=function(t,e,n){function r(t){for(var e=0;e<t.length;e++){var n=t[e],i=180-360*(n.y+c)/u;t[e]=[360*(n.x+l)/u-180,360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90]}}var o,s,u=this.extent*Math.pow(2,n),l=this.extent*t,c=this.extent*e,p=this.loadGeometry(),f=i.types[this.type];switch(this.type){case 1:var h=[];for(o=0;o<p.length;o++)h[o]=p[o][0];p=h,r(p);break;case 2:for(o=0;o<p.length;o++)r(p[o]);break;case 3:for(p=a(p),o=0;o<p.length;o++)for(s=0;s<p[o].length;s++)r(p[o][s])}1===p.length?p=p[0]:f=\\\"Multi\\\"+f;var d={type:\\\"Feature\\\",geometry:{type:f,coordinates:p},properties:this.properties};return\\\"id\\\"in this&&(d.id=this.id),d}},function(t,e,n){\\\"use strict\\\";var i=n(79);e.interpolated=function(t){var e=i.interpolated(t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e[\\\"piecewise-constant\\\"]=function(t){var e=i[\\\"piecewise-constant\\\"](t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e.isFunctionDefinition=i.isFunctionDefinition},function(t,e,n){\\\"use strict\\\";var i=n(29).parseCSSColor,r=n(0),o=n(27),a={};t.exports=function t(e){if(o.isFunctionDefinition(e))return r.extend({},e,{stops:e.stops.map(function(e){return[e[0],t(e[1])]})});if(\\\"string\\\"==typeof e){if(!a[e]){var n=i(e);if(!n)throw new Error(\\\"Invalid color \\\"+e);a[e]=[n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3]]}return a[e]}throw new Error(\\\"Invalid color \\\"+e)}},function(t,e){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function i(t){return t<0?0:t>1?1:t}function r(t){return n(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function o(t){return i(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))}function a(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function s(t){var e=t.replace(/ /g,\\\"\\\").toLowerCase();if(e in u)return u[e].slice();if(\\\"#\\\"===e[0]){if(4===e.length){var i=parseInt(e.substr(1),16);return i>=0&&i<=4095?[(3840&i)>>4|(3840&i)>>8,240&i|(240&i)>>4,15&i|(15&i)<<4,1]:null}if(7===e.length){var i=parseInt(e.substr(1),16);return i>=0&&i<=16777215?[(16711680&i)>>16,(65280&i)>>8,255&i,1]:null}return null}var s=e.indexOf(\\\"(\\\"),l=e.indexOf(\\\")\\\");if(-1!==s&&l+1===e.length){var c=e.substr(0,s),p=e.substr(s+1,l-(s+1)).split(\\\",\\\"),f=1;switch(c){case\\\"rgba\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"rgb\\\":return 3!==p.length?null:[r(p[0]),r(p[1]),r(p[2]),f];case\\\"hsla\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"hsl\\\":if(3!==p.length)return null;var h=(parseFloat(p[0])%360+360)%360/360,d=o(p[1]),y=o(p[2]),m=y<=.5?y*(d+1):y+d-y*d,v=2*y-m;return[n(255*a(v,m,h+1/3)),n(255*a(v,m,h)),n(255*a(v,m,h-1/3)),f];default:return null}}return null}var u={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{e.parseCSSColor=s}catch(t){}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3);t.exports=function(t){var e=t.key,n=t.value;if(t.styleSpec.$version>7)return n?[new i(e,n,\\\"constants have been deprecated as of v8\\\")]:[];var o=r(n);if(\\\"object\\\"!==o)return[new i(e,n,\\\"object expected, %s found\\\",o)];var a=[];for(var s in n)\\\"@\\\"!==s[0]&&a.push(new i(e+\\\".\\\"+s,n[s],'constants must start with \\\"@\\\"'));return a}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)t[i]=n[i]}return t}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6),a=n(9),s=n(33),u=n(34),l=n(10);t.exports=function(t){function e(t){if(\\\"identity\\\"===y)return[new i(t.key,t.value,'identity function may not have a \\\"stops\\\" property')];var e=[],o=t.value;return e=e.concat(s({key:t.key,value:o,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:n})),\\\"array\\\"===r(o)&&0===o.length&&e.push(new i(t.key,o,\\\"array must have at least one stop\\\")),e}function n(t){var e=[],n=t.value,s=t.key;if(\\\"array\\\"!==r(n))return[new i(s,n,\\\"array expected, %s found\\\",r(n))];if(2!==n.length)return[new i(s,n,\\\"array length %d expected, length %d found\\\",2,n.length)];if(x){if(\\\"object\\\"!==r(n[0]))return[new i(s,n,\\\"object expected, %s found\\\",r(n[0]))];if(void 0===n[0].zoom)return[new i(s,n,\\\"object stop key must have zoom\\\")];if(void 0===n[0].value)return[new i(s,n,\\\"object stop key must have value\\\")];if(h&&h>l(n[0].zoom))return[new i(s,n[0].zoom,\\\"stop zoom values must appear in ascending order\\\")];l(n[0].zoom)!==h&&(h=l(n[0].zoom),f=void 0),e=e.concat(a({key:s+\\\"[0]\\\",value:n[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:u,value:c}}))}else e=e.concat(c({key:s+\\\"[0]\\\",value:n[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec}));return e=e.concat(o({key:s+\\\"[1]\\\",value:n[1],valueSpec:d,style:t.style,styleSpec:t.styleSpec})),\\\"number\\\"===r(n[0])&&\\\"piecewise-constant\\\"===d.function&&n[0]%1!=0&&e.push(new i(s+\\\"[0]\\\",n[0],\\\"zoom level for piecewise-constant functions must be an integer\\\")),e}function c(t){var e=r(t.value),n=l(t.value);if(p){if(e!==p)return[new i(t.key,t.value,\\\"%s stop domain type must match previous stop domain type %s\\\",e,p)]}else p=e,y||\\\"string\\\"!==e||(y=\\\"categorical\\\");return\\\"number\\\"!==e&&\\\"string\\\"!==e?[new i(t.key,t.value,\\\"property value must be a number or string\\\")]:\\\"number\\\"!==e&&\\\"categorical\\\"!==y?[new i(t.key,t.value,\\\"number expected, %s found\\\",e)]:\\\"categorical\\\"!==y||\\\"number\\\"!==e||isFinite(n)&&Math.floor(n)===n?\\\"number\\\"===e&&void 0!==f&&n<f?[new i(t.key,t.value,\\\"stop domain values must appear in ascending order\\\")]:(f=n,\\\"categorical\\\"===y&&n in m?[new i(t.key,t.value,\\\"stop domain values must be unique\\\")]:(m[n]=!0,[])):[new i(t.key,t.value,\\\"integer expected, found %s\\\",n)]}var p,f,h,d=t.valueSpec,y=l(t.value.type),m={},v=\\\"categorical\\\"!==y&&void 0===t.value.property,g=!v,x=\\\"array\\\"===r(t.value.stops)&&\\\"array\\\"===r(t.value.stops[0])&&\\\"object\\\"===r(t.value.stops[0][0]),b=a({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:e}});return\\\"identity\\\"===y||t.value.stops||b.push(new i(t.key,t.value,'missing required property \\\"stops\\\"')),\\\"exponential\\\"===y&&\\\"piecewise-constant\\\"===t.valueSpec.function&&b.push(new i(t.key,t.value,\\\"exponential functions not supported\\\")),t.styleSpec.$version>=8&&(g&&!t.valueSpec[\\\"property-function\\\"]?b.push(new i(t.key,t.value,\\\"property functions not supported\\\")):v&&!t.valueSpec[\\\"zoom-function\\\"]&&b.push(new i(t.key,t.value,\\\"zoom functions not supported\\\"))),\\\"categorical\\\"!==y&&!x||void 0!==t.value.property||b.push(new i(t.key,t.value,'\\\"property\\\" property is required')),b}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(6),o=n(1);t.exports=function(t){var e=t.value,n=t.valueSpec,a=t.style,s=t.styleSpec,u=t.key,l=t.arrayElementValidator||r;if(\\\"array\\\"!==i(e))return[new o(u,e,\\\"array expected, %s found\\\",i(e))];if(n.length&&e.length!==n.length)return[new o(u,e,\\\"array length %d expected, length %d found\\\",n.length,e.length)];if(n[\\\"min-length\\\"]&&e.length<n[\\\"min-length\\\"])return[new o(u,e,\\\"array length at least %d expected, length %d found\\\",n[\\\"min-length\\\"],e.length)];var c={type:n.value};s.$version<7&&(c.function=n.function),\\\"object\\\"===i(n.value)&&(c=n.value);for(var p=[],f=0;f<e.length;f++)p=p.concat(l({array:e,arrayIndex:f,value:e[f],valueSpec:c,style:a,styleSpec:s,key:u+\\\"[\\\"+f+\\\"]\\\"}));return p}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=i(n);return\\\"number\\\"!==a?[new r(e,n,\\\"number expected, %s found\\\",a)]:\\\"minimum\\\"in o&&n<o.minimum?[new r(e,n,\\\"%s is less than the minimum value %s\\\",n,o.minimum)]:\\\"maximum\\\"in o&&n>o.maximum?[new r(e,n,\\\"%s is greater than the maximum value %s\\\",n,o.maximum)]:[]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10),o=n(9),a=n(15),s=n(36),u=n(37),l=n(31);t.exports=function(t){var e=[],n=t.value,c=t.key,p=t.style,f=t.styleSpec;n.type||n.ref||e.push(new i(c,n,'either \\\"type\\\" or \\\"ref\\\" is required'));var h=r(n.type),d=r(n.ref);if(n.id)for(var y=0;y<t.arrayIndex;y++){var m=p.layers[y];r(m.id)===r(n.id)&&e.push(new i(c,n.id,'duplicate layer id \\\"%s\\\", previously used at line %d',n.id,m.id.__line__))}if(\\\"ref\\\"in n){[\\\"type\\\",\\\"source\\\",\\\"source-layer\\\",\\\"filter\\\",\\\"layout\\\"].forEach(function(t){t in n&&e.push(new i(c,n[t],'\\\"%s\\\" is prohibited for ref layers',t))});var v;p.layers.forEach(function(t){t.id==d&&(v=t)}),v?v.ref?e.push(new i(c,n.ref,\\\"ref cannot reference another ref layer\\\")):h=r(v.type):e.push(new i(c,n.ref,'ref layer \\\"%s\\\" not found',d))}else if(\\\"background\\\"!==h)if(n.source){var g=p.sources&&p.sources[n.source];g?\\\"vector\\\"==g.type&&\\\"raster\\\"==h?e.push(new i(c,n.source,'layer \\\"%s\\\" requires a raster source',n.id)):\\\"raster\\\"==g.type&&\\\"raster\\\"!=h?e.push(new i(c,n.source,'layer \\\"%s\\\" requires a vector source',n.id)):\\\"vector\\\"!=g.type||n[\\\"source-layer\\\"]||e.push(new i(c,n,'layer \\\"%s\\\" must specify a \\\"source-layer\\\"',n.id)):e.push(new i(c,n.source,'source \\\"%s\\\" not found',n.source))}else e.push(new i(c,n,'missing required property \\\"source\\\"'));return e=e.concat(o({key:c,value:n,valueSpec:f.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(){return[]},filter:a,layout:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return u(l({layerType:h},t))}}})},paint:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return s(l({layerType:h},t))}}})}}}))}},function(t,e,n){\\\"use strict\\\";var i=n(6),r=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"paint_\\\"+t.layerType];if(!u)return[];var l=s.match(/^(.*)-transition$/);return l&&u[l[1]]&&u[l[1]].transition?i({key:e,value:a,valueSpec:o.transition,style:n,styleSpec:o}):t.valueSpec||u[s]?i({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}):[new r(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var i=n(6),r=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"layout_\\\"+t.layerType];if(!u)return[];if(t.valueSpec||u[s]){var l=[];return\\\"symbol\\\"===t.layerType&&(\\\"icon-image\\\"===s&&n&&!n.sprite?l.push(new r(e,a,'use of \\\"icon-image\\\" requires a style \\\"sprite\\\" property')):\\\"text-field\\\"===s&&n&&!n.glyphs&&l.push(new r(e,a,'use of \\\"text-field\\\" requires a style \\\"glyphs\\\" property'))),l.concat(i({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}))}return[new r(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10),o=n(9),a=n(14);t.exports=function(t){var e=t.value,n=t.key,s=t.styleSpec,u=t.style;if(!e.type)return[new i(n,e,'\\\"type\\\" is required')];switch(r(e.type)){case\\\"vector\\\":case\\\"raster\\\":var l=[];if(l=l.concat(o({key:n,value:e,valueSpec:s.source_tile,style:t.style,styleSpec:s})),\\\"url\\\"in e)for(var c in e)[\\\"type\\\",\\\"url\\\",\\\"tileSize\\\"].indexOf(c)<0&&l.push(new i(n+\\\".\\\"+c,e[c],'a source with a \\\"url\\\" property may not include a \\\"%s\\\" property',c));return l;case\\\"geojson\\\":return o({key:n,value:e,valueSpec:s.source_geojson,style:u,styleSpec:s});case\\\"video\\\":return o({key:n,value:e,valueSpec:s.source_video,style:u,styleSpec:s});case\\\"image\\\":return o({key:n,value:e,valueSpec:s.source_image,style:u,styleSpec:s});default:return a({key:n+\\\".type\\\",value:e.type,valueSpec:{values:[\\\"vector\\\",\\\"raster\\\",\\\"geojson\\\",\\\"video\\\",\\\"image\\\"]},style:u,styleSpec:s})}}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6);t.exports=function(t){var e=t.value,n=t.styleSpec,a=n.light,s=t.style,u=[],l=r(e);if(void 0===e)return u;if(\\\"object\\\"!==l)return u=u.concat([new i(\\\"light\\\",e,\\\"object expected, %s found\\\",l)]);for(var c in e){var p=c.match(/^(.*)-transition$/);u=p&&a[p[1]]&&a[p[1]].transition?u.concat(o({key:c,value:e[c],valueSpec:n.transition,style:s,styleSpec:n})):a[c]?u.concat(o({key:c,value:e[c],valueSpec:a[c],style:s,styleSpec:n})):u.concat([new i(c,e[c],'unknown property \\\"%s\\\"',c)])}return u}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.value,n=t.key,o=i(e);return\\\"string\\\"!==o?[new r(n,e,\\\"string expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,a,s,u,l){if(n/=e,i/=e,u>=n&&l<=i)return t;if(u>i||l<n)return null;for(var c=[],p=0;p<t.length;p++){var f,h,d=t[p],y=d.geometry,m=d.type;if(f=d.min[a],h=d.max[a],f>=n&&h<=i)c.push(d);else if(!(f>i||h<n)){var v=1===m?r(y,n,i,a):o(y,n,i,a,s,3===m);v.length&&c.push({geometry:v,type:m,tags:t[p].tags||null,min:d.min,max:d.max})}}return c.length?c:null}function r(t,e,n,i){for(var r=[],o=0;o<t.length;o++){var a=t[o],s=a[i];s>=e&&s<=n&&r.push(a)}return r}function o(t,e,n,i,r,o){for(var s=[],u=0;u<t.length;u++){var l,c,p,f=0,h=0,d=null,y=t[u],m=y.area,v=y.dist,g=y.length,x=[];for(c=0;c<g-1;c++)l=d||y[c],d=y[c+1],f=h||l[i],h=d[i],f<e?h>n?(x.push(r(l,d,e),r(l,d,n)),o||(x=a(s,x,m,v))):h>=e&&x.push(r(l,d,e)):f>n?h<e?(x.push(r(l,d,n),r(l,d,e)),o||(x=a(s,x,m,v))):h<=n&&x.push(r(l,d,n)):(x.push(l),h<e?(x.push(r(l,d,e)),o||(x=a(s,x,m,v))):h>n&&(x.push(r(l,d,n)),o||(x=a(s,x,m,v))));l=y[g-1],f=l[i],f>=e&&f<=n&&x.push(l),p=x[x.length-1],o&&p&&(x[0][0]!==p[0]||x[0][1]!==p[1])&&x.push(x[0]),a(s,x,m,v)}return s}function a(t,e,n,i){return e.length&&(e.area=n,e.dist=i,t.push(e)),[]}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t){this.self=t,this.actor=new o(t,this),this.loading={},this.loaded={},this.geoJSONIndexes={}}function r(t){var e={};for(var n in t){var i=t[n],r=i.ref||i.id,o=t[r];o.layout&&\\\"none\\\"===o.layout.visibility||(e[r]=e[r]||[],n===r?e[r].unshift(i):e[r].push(i))}return e}var o=n(43),a=n(44),s=n(5),u=n(0),l=n(97),c=n(12),p=n(13),f=n(98),h=n(103),d=n(109),y=n(112),m=n(113);t.exports=function(t){return new i(t)},u.extend(i.prototype,{\\\"set layers\\\":function(t){function e(t){var e=s.create(t,t.ref&&n.layers[t.ref]);e.updatePaintTransitions({},{transition:!1}),n.layers[e.id]=e}this.layers={};for(var n=this,i=[],o=0;o<t.length;o++){var a=t[o];\\\"fill\\\"!==a.type&&\\\"line\\\"!==a.type&&\\\"circle\\\"!==a.type&&\\\"symbol\\\"!==a.type||(a.ref?i.push(o):e(a))}for(var u=0;u<i.length;u++)e(t[i[u]]);this.layerFamilies=r(this.layers)},\\\"update layers\\\":function(t){function e(t){var e=o.layers[t.ref];o.layers[t.id]?o.layers[t.id].set(t,e):o.layers[t.id]=s.create(t,e),o.layers[t.id].updatePaintTransitions({},{transition:!1})}var n,i,o=this;for(n in t)i=t[n],i.ref&&e(i);for(n in t)i=t[n],i.ref||e(i);this.layerFamilies=r(this.layers)},\\\"load tile\\\":function(t,e){function n(t,n){if(delete this.loading[i][r],t)return e(t);o.data=new c.VectorTile(new p(new Uint8Array(n))),o.parse(o.data,this.layerFamilies,this.actor,n,e),this.loaded[i]=this.loaded[i]||{},this.loaded[i][r]=o}var i=t.source,r=t.uid;this.loading[i]||(this.loading[i]={});var o=this.loading[i][r]=new a(t);o.xhr=l.getArrayBuffer(t.url,n.bind(this))},\\\"reload tile\\\":function(t,e){var n=this.loaded[t.source],i=t.uid;if(n&&n[i]){var r=n[i];r.parse(r.data,this.layerFamilies,this.actor,t.rawTileData,e)}},\\\"abort tile\\\":function(t){var e=this.loading[t.source],n=t.uid;e&&e[n]&&(e[n].xhr.abort(),delete e[n])},\\\"remove tile\\\":function(t){var e=this.loaded[t.source],n=t.uid;e&&e[n]&&delete e[n]},\\\"redo placement\\\":function(t,e){var n=this.loaded[t.source],i=this.loading[t.source],r=t.uid;if(n&&n[r]){var o=n[r],a=o.redoPlacement(t.angle,t.pitch,t.showCollisionBoxes);a.result&&e(null,a.result,a.transferables)}else i&&i[r]&&(i[r].angle=t.angle)},\\\"parse geojson\\\":function(t,e){var n=function(n,i){if(d(i,!0),n)return e(n);if(\\\"object\\\"!=typeof i)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));try{this.geoJSONIndexes[t.source]=t.cluster?f(t.superclusterOptions).load(i.features):h(i,t.geojsonVtOptions)}catch(n){return e(n)}e(null)}.bind(this);if(t.url)l.getJSON(t.url,n);else{if(\\\"string\\\"!=typeof t.data)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));n(null,JSON.parse(t.data))}},\\\"load geojson tile\\\":function(t,e){var n=t.source,i=t.coord;if(!this.geoJSONIndexes[n])return e(null,null);var r=this.geoJSONIndexes[n].getTile(Math.min(i.z,t.maxZoom),i.x,i.y),o=r?new a(t):void 0;if(this.loaded[n]=this.loaded[n]||{},this.loaded[n][t.uid]=o,!r)return e(null,null);var s=new y(r.features);s.name=\\\"_geojsonTileLayer\\\";var u=m({layers:{_geojsonTileLayer:s}});0===u.byteOffset&&u.byteLength===u.buffer.byteLength||(u=new Uint8Array(u)),o.parse(s,this.layerFamilies,this.actor,u.buffer,e)}}),t.exports(self)},function(t,e,n){\\\"use strict\\\";function i(t,e){this.target=t,this.parent=e,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener(\\\"message\\\",this.receive,!1)}t.exports=i,i.prototype.receive=function(t){var e,n=t.data;if(\\\"<response>\\\"===n.type)e=this.callbacks[n.id],delete this.callbacks[n.id],e(n.error||null,n.data);else if(void 0!==n.id){var i=n.id;this.parent[n.type](n.data,function(t,e,n){this.postMessage({type:\\\"<response>\\\",id:String(i),error:t?String(t):null,data:e},n)}.bind(this))}else this.parent[n.type](n.data)},i.prototype.send=function(t,e,n,i){var r=null;n&&(this.callbacks[r=this.callbackID++]=n),this.postMessage({type:t,id:String(r),data:e},i)},i.prototype.postMessage=function(t,e){this.target.postMessage(t,e)}},function(t,e,n){\\\"use strict\\\";function i(t){this.coord=t.coord,this.uid=t.uid,this.zoom=t.zoom,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=t.overscaling,this.angle=t.angle,this.pitch=t.pitch,this.showCollisionBoxes=t.showCollisionBoxes}function r(t){for(var e in t.arrayGroups)for(var n=t.arrayGroups[e],i=0;i<n.length;i++){var r=n[i];for(var o in r){var a=r[o];for(var s in a)if(a[s].length>0)return!0}}return!1}function o(t){return t.serialize()}function a(t){var e=[];for(var n in t){var i=t[n];for(var r in i.arrayGroups)for(var o=i.arrayGroups[r],a=0;a<o.length;a++){var s=o[a];for(var u in s){var l=s[u];for(var c in l)e.push(l[c].arrayBuffer)}}}return e}function s(t){return t.id}var u=n(45),l=n(73),c=n(4),p=n(74),f=n(24),h=n(0),d=n(75),y=n(76);t.exports=i,i.prototype.parse=function(t,e,n,i,m){function v(t,e){for(var n=0;n<t.length;n++){var i=t.feature(n);i.index=n;for(var r in e)e[r].filter(i)&&e[r].features.push(i)}}function g(t){if(t)return m(t);if(2===++D){for(var e=q.length-1;e>=0;e--)x(I,q[e]);b()}}function x(t,e){var n=Date.now();e.populateBuffers(z,C,B);var i=Date.now()-n;if(\\\"symbol\\\"!==e.type)for(var r=0;r<e.features.length;r++){var o=e.features[r];T.insert(o,o.index,e.sourceLayerIndex,e.index)}e.features=null,M._total+=i,M[e.id]=(M[e.id]||0)+i}function b(){I.status=\\\"done\\\",I.redoPlacementAfterDone&&(I.redoPlacement(I.angle,I.pitch,null),I.redoPlacementAfterDone=!1);var t=T.serialize(),e=z.serialize(),n=I.collisionBoxArray.serialize(),s=I.symbolInstancesArray.serialize(),u=I.symbolQuadsArray.serialize(),l=[i].concat(t.transferables).concat(e.transferables),c=V.filter(r);m(null,{buckets:c.map(o),bucketStats:M,featureIndex:t.data,collisionTile:e.data,collisionBoxArray:n,symbolInstancesArray:s,symbolQuadsArray:u,rawTileData:i},a(c).concat(l))}this.status=\\\"parsing\\\",this.data=t,this.collisionBoxArray=new p,this.symbolInstancesArray=new d,this.symbolQuadsArray=new y;var w,k,_,S,z=new l(this.angle,this.pitch,this.collisionBoxArray),T=new u(this.coord,this.overscaling,z,t.layers),j=new f(t.layers?Object.keys(t.layers).sort():[\\\"_geojsonTileLayer\\\"]),M={_total:0},I=this,P={},E={},F=0;for(var A in e)k=e[A][0],k.source===this.source&&(k.ref||k.minzoom&&this.zoom<k.minzoom||k.maxzoom&&this.zoom>=k.maxzoom||k.layout&&\\\"none\\\"===k.layout.visibility||t.layers&&!t.layers[k.sourceLayer]||(S=c.create({layer:k,index:F++,childLayers:e[A],zoom:this.zoom,overscaling:this.overscaling,showCollisionBoxes:this.showCollisionBoxes,collisionBoxArray:this.collisionBoxArray,symbolQuadsArray:this.symbolQuadsArray,symbolInstancesArray:this.symbolInstancesArray,sourceLayerIndex:j.encode(k.sourceLayer||\\\"_geojsonTileLayer\\\")}),S.createFilter(),P[k.id]=S,t.layers&&(_=k.sourceLayer,E[_]=E[_]||{},E[_][k.id]=S)));if(t.layers)for(_ in E)1===k.version&&h.warnOnce('Vector tile source \\\"'+this.source+'\\\" layer \\\"'+_+'\\\" does not use vector tile spec v2 and therefore may have some rendering errors.'),(k=t.layers[_])&&v(k,E[_]);else v(t,P);var V=[],q=this.symbolBuckets=[],L=[];T.bucketLayerIDs={};for(var O in P)S=P[O],0!==S.features.length&&(T.bucketLayerIDs[S.index]=S.childLayers.map(s),V.push(S),\\\"symbol\\\"===S.type?q.push(S):L.push(S));var B={},C={},D=0;if(q.length>0){for(w=q.length-1;w>=0;w--)q[w].updateIcons(B),q[w].updateFont(C);for(var N in C)C[N]=Object.keys(C[N]).map(Number);B=Object.keys(B),n.send(\\\"get glyphs\\\",{uid:this.uid,stacks:C},function(t,e){C=e,g(t)}),B.length?n.send(\\\"get icons\\\",{icons:B},function(t,e){B=e,g(t)}):g()}for(w=L.length-1;w>=0;w--)x(this,L[w]);if(0===q.length)return b()},i.prototype.redoPlacement=function(t,e,n){if(\\\"done\\\"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=t,{};for(var i=new l(t,e,this.collisionBoxArray),s=this.symbolBuckets,u=s.length-1;u>=0;u--)s[u].placeFeatures(i,n);var c=i.serialize(),p=s.filter(r);return{result:{buckets:p.map(o),collisionTile:c.data},transferables:a(p).concat(c.transferables)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){if(t.grid){var i=t,r=e;t=i.coord,e=i.overscaling,this.grid=new d(i.grid),this.featureIndexArray=new S(i.featureIndexArray),this.rawTileData=r,this.bucketLayerIDs=i.bucketLayerIDs}else this.grid=new d(p,16,0),this.featureIndexArray=new S;this.coord=t,this.overscaling=e,this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.setCollisionTile(n)}function r(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function o(t,e){return e-t}function a(t){return t[\\\"line-gap-width\\\"]>0?t[\\\"line-gap-width\\\"]+2*t[\\\"line-width\\\"]:t[\\\"line-width\\\"]}function s(t,e,n,i,r){if(!e[0]&&!e[1])return t;e=l.convert(e),\\\"viewport\\\"===n&&e._rotate(-i);for(var o=[],a=0;a<t.length;a++){for(var s=t[a],u=[],c=0;c<s.length;c++)u.push(s[c].sub(e._mult(r)));o.push(u)}return o}function u(t,e){for(var n=[],i=new l(0,0),r=0;r<t.length;r++){for(var o=t[r],a=[],s=0;s<o.length;s++){var u=o[s-1],c=o[s],p=o[s+1],f=0===s?i:c.sub(u)._unit()._perp(),h=s===o.length-1?i:p.sub(c)._unit()._perp(),d=f._add(h)._unit(),y=d.x*h.x+d.y*h.y;d._mult(1/y),a.push(d._mult(e)._add(c))}n.push(a)}return n}var l=n(2),c=n(7),p=n(4).EXTENT,f=n(16),h=n(8),d=n(23),y=n(24),m=n(12),v=n(13),g=n(71),x=n(0).arraysIntersect,b=n(72),w=b.multiPolygonIntersectsBufferedMultiPoint,k=b.multiPolygonIntersectsMultiPolygon,_=b.multiPolygonIntersectsBufferedMultiLine,S=new h({members:[{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"}]});t.exports=i,i.prototype.insert=function(t,e,n,i){var r=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(e,n,i);for(var o=c(t),a=0;a<o.length;a++){for(var s=o[a],u=[1/0,1/0,-1/0,-1/0],l=0;l<s.length;l++){var p=s[l];u[0]=Math.min(u[0],p.x),u[1]=Math.min(u[1],p.y),u[2]=Math.max(u[2],p.x),u[3]=Math.max(u[3],p.y)}this.grid.insert(r,u[0],u[1],u[2],u[3])}},i.prototype.setCollisionTile=function(t){this.collisionTile=t},i.prototype.serialize=function(){var t={coord:this.coord,overscaling:this.overscaling,grid:this.grid.toArrayBuffer(),featureIndexArray:this.featureIndexArray.serialize(),bucketLayerIDs:this.bucketLayerIDs};return{data:t,transferables:[t.grid,t.featureIndexArray.arrayBuffer]}},i.prototype.query=function(t,e){this.vtLayers||(this.vtLayers=new m.VectorTile(new v(new Uint8Array(this.rawTileData))).layers,this.sourceLayerCoder=new y(this.vtLayers?Object.keys(this.vtLayers).sort():[\\\"_geojsonTileLayer\\\"]));var n={},i=t.params||{},s=p/t.tileSize/t.scale,u=f(i.filter),c=0;for(var h in e){var d=e[h],g=d.paint,x=0;\\\"line\\\"===d.type?x=a(g)/2+Math.abs(g[\\\"line-offset\\\"])+r(g[\\\"line-translate\\\"]):\\\"fill\\\"===d.type?x=r(g[\\\"fill-translate\\\"]):\\\"circle\\\"===d.type&&(x=g[\\\"circle-radius\\\"]+r(g[\\\"circle-translate\\\"])),c=Math.max(c,x*s)}for(var b=t.queryGeometry.map(function(t){return t.map(function(t){return new l(t.x,t.y)})}),w=1/0,k=1/0,_=-1/0,S=-1/0,z=0;z<b.length;z++)for(var T=b[z],j=0;j<T.length;j++){var M=T[j];w=Math.min(w,M.x),k=Math.min(k,M.y),_=Math.max(_,M.x),S=Math.max(S,M.y)}var I=this.grid.query(w-c,k-c,_+c,S+c);I.sort(o),this.filterMatching(n,I,this.featureIndexArray,b,u,i.layers,e,t.bearing,s);var P=this.collisionTile.queryRenderedSymbols(w,k,_,S,t.scale);return P.sort(),this.filterMatching(n,P,this.collisionTile.collisionBoxArray,b,u,i.layers,e,t.bearing,s),n},i.prototype.filterMatching=function(t,e,n,i,r,o,l,p,f){for(var h,d=0;d<e.length;d++){var y=e[d];if(y!==h){h=y;var m=n.get(y),v=this.bucketLayerIDs[m.bucketIndex];if(!o||x(o,v)){var b=this.sourceLayerCoder.decode(m.sourceLayerIndex),S=this.vtLayers[b],z=S.feature(m.featureIndex);if(r(z))for(var T=null,j=0;j<v.length;j++){var M=v[j];if(!(o&&o.indexOf(M)<0)){var I=l[M];if(I){var P;if(\\\"symbol\\\"!==I.type){T||(T=c(z));var E=I.paint;if(\\\"line\\\"===I.type){P=s(i,E[\\\"line-translate\\\"],E[\\\"line-translate-anchor\\\"],p,f);var F=a(E)/2*f;if(E[\\\"line-offset\\\"]&&(T=u(T,E[\\\"line-offset\\\"]*f)),!_(P,T,F))continue}else if(\\\"fill\\\"===I.type){if(P=s(i,E[\\\"fill-translate\\\"],E[\\\"fill-translate-anchor\\\"],p,f),!k(P,T))continue}else if(\\\"circle\\\"===I.type){P=s(i,E[\\\"circle-translate\\\"],E[\\\"circle-translate-anchor\\\"],p,f);var A=E[\\\"circle-radius\\\"]*f;if(!w(P,T,A))continue}}var V=new g(z,this.z,this.x,this.y);V.layer=I.serialize({includeRefProperties:!0});var q=t[M];void 0===q&&(q=t[M]=[]),q.push(V)}}}}}}}},function(t,e){function n(t,e,n,i){this.cx=3*t,this.bx=3*(n-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(i-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=i,this.p2x=n,this.p2y=i}t.exports=n,n.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){void 0===e&&(e=1e-6);var n,i,r,o,a;for(r=t,a=0;a<8;a++){if(o=this.sampleCurveX(r)-t,Math.abs(o)<e)return r;var s=this.sampleCurveDerivativeX(r);if(Math.abs(s)<1e-6)break;r-=o/s}if(n=0,i=1,(r=t)<n)return n;if(r>i)return i;for(;n<i;){if(o=this.sampleCurveX(r),Math.abs(o-t)<e)return r;t>o?n=r:i=r,r=.5*(i-n)+n}return r},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){this.column=t,this.row=e,this.zoom=n}t.exports=i,i.prototype={clone:function(){return new i(this.column,this.row,this.zoom)},zoomTo:function(t){return this.clone()._zoomTo(t)},sub:function(t){return this.clone()._sub(t)},_zoomTo:function(t){var e=Math.pow(2,t-this.zoom);return this.column*=e,this.row*=e,this.zoom=t,this},_sub:function(t){return t=t.zoomTo(this.zoom),this.column-=t.column,this.row-=t.row,this}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.attributes=e.members,this.itemSize=e.bytesPerElement,this.type=n,this.arrayType=e}t.exports=i,i.prototype.bind=function(t){var e=t[this.type];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.arrayBuffer,t.STATIC_DRAW),this.arrayBuffer=null)};var r={Int8:\\\"BYTE\\\",Uint8:\\\"UNSIGNED_BYTE\\\",Int16:\\\"SHORT\\\",Uint16:\\\"UNSIGNED_SHORT\\\"};i.prototype.setVertexAttribPointers=function(t,e){for(var n=0;n<this.attributes.length;n++){var i=this.attributes[n],o=e[i.name];void 0!==o&&t.vertexAttribPointer(o,i.components,t[r[i.type]],!1,this.arrayType.bytesPerElement,i.offset)}},i.prototype.destroy=function(t){this.buffer&&t.deleteBuffer(this.buffer)},i.BufferType={VERTEX:\\\"ARRAY_BUFFER\\\",ELEMENT:\\\"ELEMENT_ARRAY_BUFFER\\\"},i.ELEMENT_ATTRIBUTE_TYPE=\\\"Uint16\\\",i.VERTEX_ATTRIBUTE_ALIGNMENT=4},function(t,e,n){\\\"use strict\\\";function i(t){if(null===t||void 0===t)throw new TypeError(\\\"Object.assign cannot be called with null or undefined\\\");return Object(t)}var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\\\"abc\\\");if(t[5]=\\\"de\\\",\\\"5\\\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e[\\\"_\\\"+String.fromCharCode(n)]=n;if(\\\"0123456789\\\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\\\"\\\"))return!1;var i={};return\\\"abcdefghijklmnopqrst\\\".split(\\\"\\\").forEach(function(t){i[t]=t}),\\\"abcdefghijklmnopqrst\\\"===Object.keys(Object.assign({},i)).join(\\\"\\\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,s,u=i(t),l=1;l<arguments.length;l++){n=Object(arguments[l]);for(var c in n)o.call(n,c)&&(u[c]=n[c]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(t,e){function n(){throw new Error(\\\"setTimeout has not been defined\\\")}function i(){throw new Error(\\\"clearTimeout has not been defined\\\")}function r(t){if(c===setTimeout)return setTimeout(t,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function o(t){if(p===clearTimeout)return clearTimeout(t);if((p===i||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(t);try{return p(t)}catch(e){try{return p.call(null,t)}catch(e){return p.call(this,t)}}}function a(){y&&h&&(y=!1,h.length?d=h.concat(d):m=-1,d.length&&s())}function s(){if(!y){var t=r(a);y=!0;for(var e=d.length;e;){for(h=d,d=[];++m<e;)h&&h[m].run();m=-1,e=d.length}h=null,y=!1,o(t)}}function u(t,e){this.fun=t,this.array=e}function l(){}var c,p,f=t.exports={};!function(){try{c=\\\"function\\\"==typeof setTimeout?setTimeout:n}catch(t){c=n}try{p=\\\"function\\\"==typeof clearTimeout?clearTimeout:i}catch(t){p=i}}();var h,d=[],y=!1,m=-1;f.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];d.push(new u(t,e)),1!==d.length||y||r(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\\\"browser\\\",f.browser=!0,f.env={},f.argv=[],f.version=\\\"\\\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(t){return[]},f.binding=function(t){throw new Error(\\\"process.binding is not supported\\\")},f.cwd=function(){return\\\"/\\\"},f.chdir=function(t){throw new Error(\\\"process.chdir is not supported\\\")},f.umask=function(){return 0}},function(t,e){t.exports=function(t){return t&&\\\"object\\\"==typeof t&&\\\"function\\\"==typeof t.copy&&\\\"function\\\"==typeof t.fill&&\\\"function\\\"==typeof t.readUInt8}},function(t,e){\\\"function\\\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e,n){\\\"use strict\\\";function i(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.vao=null}var r=n(11);t.exports=i,i.prototype.bind=function(t,e,n,i,r){void 0===t.extVertexArrayObject&&(t.extVertexArrayObject=t.getExtension(\\\"OES_vertex_array_object\\\"));var o=!this.vao||this.boundProgram!==e||this.boundVertexBuffer!==n||this.boundVertexBuffer2!==r||this.boundElementBuffer!==i;!t.extVertexArrayObject||o?this.freshBind(t,e,n,i,r):t.extVertexArrayObject.bindVertexArrayOES(this.vao)},i.prototype.freshBind=function(t,e,n,i,o){var a,s=e.numAttributes;if(t.extVertexArrayObject)this.vao&&this.destroy(t),this.vao=t.extVertexArrayObject.createVertexArrayOES(),t.extVertexArrayObject.bindVertexArrayOES(this.vao),a=0,this.boundProgram=e,this.boundVertexBuffer=n,this.boundVertexBuffer2=o,this.boundElementBuffer=i;else{a=t.currentNumAttributes||0;for(var u=s;u<a;u++)r(0!==u),t.disableVertexAttribArray(u)}for(var l=a;l<s;l++)t.enableVertexAttribArray(l);n.bind(t),n.setVertexAttribPointers(t,e),o&&(o.bind(t),o.setVertexAttribPointers(t,e)),i&&i.bind(t),t.currentNumAttributes=s},i.prototype.unbind=function(t){var e=t.extVertexArrayObject;e&&e.bindVertexArrayOES(null)},i.prototype.destroy=function(t){var e=t.extVertexArrayObject;e&&this.vao&&(e.deleteVertexArrayOES(this.vao),this.vao=null)}},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=n(55),u=n(56);t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.programInterfaces={fill:{vertexBuffer:!0,elementBuffer:!0,elementBufferComponents:1,elementBuffer2:!0,elementBuffer2Components:2,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}],paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-color\\\"},{name:\\\"a_outline_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-outline-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-outline-color\\\"}]}},i.prototype.addFeature=function(t){for(var e=a(t),n=u(e,500),i=this.makeRoomFor(\\\"fill\\\",0),r=i.layout.vertex.length,o=0;o<n.length;o++)this.addPolygon(n[o]);this.populatePaintArrays(\\\"fill\\\",{zoom:this.zoom},t.properties,i,r)},i.prototype.addPolygon=function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n].length;for(var i=this.makeRoomFor(\\\"fill\\\",e),r=[],o=[],a=i.layout.vertex.length,u=0;u<t.length;u++){var l=t[u];u>0&&o.push(r.length/2);for(var c=0;c<l.length;c++){var p=l[c],f=i.layout.vertex.emplaceBack(p.x,p.y);c>=1&&i.layout.element2.emplaceBack(f-1,f),r.push(p.x),r.push(p.y)}}for(var h=s(r,o),d=0;d<h.length;d++)i.layout.element.emplaceBack(h[d]+a)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){n=n||2;var i=e&&e.length,o=i?e[0]*n:t.length,s=r(t,0,o,n,!0),u=[];if(!s||s.next===s.prev)return u;var l,c,f,h,d,y,m;if(i&&(s=p(t,e,s,n)),t.length>80*n){l=f=t[0],c=h=t[1];for(var v=n;v<o;v+=n)d=t[v],y=t[v+1],d<l&&(l=d),y<c&&(c=y),d>f&&(f=d),y>h&&(h=y);m=Math.max(f-l,h-c),m=0!==m?1/m:0}return a(s,u,n,l,c,m),u}function r(t,e,n,i,r){var o,a;if(r===V(t,e,n,i)>0)for(o=e;o<n;o+=i)a=E(o,t[o],t[o+1],a);else for(o=n-i;o>=e;o-=i)a=E(o,t[o],t[o+1],a);return a&&_(a,a.next)&&(F(a),a=a.next),a}function o(t,e){if(!t)return t;e||(e=t);var n,i=t;do{if(n=!1,i.steiner||!_(i,i.next)&&0!==k(i.prev,i,i.next))i=i.next;else{if(F(i),(i=e=i.prev)===i.next)break;n=!0}}while(n||i!==e);return e}function a(t,e,n,i,r,p,f){if(t){!f&&p&&m(t,i,r,p);for(var h,d,y=t;t.prev!==t.next;)if(h=t.prev,d=t.next,p?u(t,i,r,p):s(t))e.push(h.i/n),e.push(t.i/n),e.push(d.i/n),F(t),t=d.next,y=d.next;else if((t=d)===y){f?1===f?(t=l(o(t),e,n),a(t,e,n,i,r,p,2)):2===f&&c(t,e,n,i,r,p):a(o(t),e,n,i,r,p,1);break}}}function s(t){var e=t.prev,n=t,i=t.next;if(k(e,n,i)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(b(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&k(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function u(t,e,n,i){var r=t.prev,o=t,a=t.next;if(k(r,o,a)>=0)return!1;for(var s=r.x<o.x?r.x<a.x?r.x:a.x:o.x<a.x?o.x:a.x,u=r.y<o.y?r.y<a.y?r.y:a.y:o.y<a.y?o.y:a.y,l=r.x>o.x?r.x>a.x?r.x:a.x:o.x>a.x?o.x:a.x,c=r.y>o.y?r.y>a.y?r.y:a.y:o.y>a.y?o.y:a.y,p=g(s,u,e,n,i),f=g(l,c,e,n,i),h=t.prevZ,d=t.nextZ;h&&h.z>=p&&d&&d.z<=f;){if(h!==t.prev&&h!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,h.x,h.y)&&k(h.prev,h,h.next)>=0)return!1;if(h=h.prevZ,d!==t.prev&&d!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,d.x,d.y)&&k(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;h&&h.z>=p;){if(h!==t.prev&&h!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,h.x,h.y)&&k(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;d&&d.z<=f;){if(d!==t.prev&&d!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,d.x,d.y)&&k(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function l(t,e,n){var i=t;do{var r=i.prev,a=i.next.next;!_(r,a)&&S(r,i,i.next,a)&&M(r,a)&&M(a,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(a.i/n),F(i),F(i.next),i=t=a),i=i.next}while(i!==t);return o(i)}function c(t,e,n,i,r,s){var u=t;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&w(u,l)){var c=P(u,l);return u=o(u,u.next),c=o(c,c.next),a(u,e,n,i,r,s),void a(c,e,n,i,r,s)}l=l.next}u=u.next}while(u!==t)}function p(t,e,n,i){var a,s,u,l,c,p=[];for(a=0,s=e.length;a<s;a++)u=e[a]*i,l=a<s-1?e[a+1]*i:t.length,c=r(t,u,l,i,!1),c===c.next&&(c.steiner=!0),p.push(x(c));for(p.sort(f),a=0;a<p.length;a++)h(p[a],n),n=o(n,n.next);return n}function f(t,e){return t.x-e.x}function h(t,e){if(e=d(t,e)){var n=P(e,t);o(e,e.next),o(n,n.next)}}function d(t,e){var n,i=e,r=t.x,o=t.y,a=-1/0;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){var s=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(s<=r&&s>a){if(a=s,s===r){if(o===i.y)return i;if(o===i.next.y)return i.next}n=i.x<i.next.x?i:i.next}}i=i.next}while(i!==e);if(!n)return null;if(r===a)return n;var u,l=n,c=n.x,p=n.y,f=1/0;i=n;do{r>=i.x&&i.x>=c&&r!==i.x&&b(o<p?r:a,o,c,p,o<p?a:r,o,i.x,i.y)&&(u=Math.abs(o-i.y)/(r-i.x),M(i,t)&&(u<f||u===f&&(i.x>n.x||i.x===n.x&&y(n,i)))&&(n=i,f=u)),i=i.next}while(i!==l);return n}function y(t,e){return k(t.prev,t,e.prev)<0&&k(e.next,t,t.next)<0}function m(t,e,n,i){var r=t;do{null===r.z&&(r.z=g(r.x,r.y,e,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,v(r)}function v(t){var e,n,i,r,o,a,s,u,l=1;do{for(n=t,t=null,o=null,a=0;n;){for(a++,i=n,s=0,e=0;e<l&&(s++,i=i.nextZ);e++);for(u=l;s>0||u>0&&i;)0!==s&&(0===u||!i||n.z<=i.z)?(r=n,n=n.nextZ,s--):(r=i,i=i.nextZ,u--),o?o.nextZ=r:t=r,r.prevZ=o,o=r;n=i}o.nextZ=null,l*=2}while(a>1);return t}function g(t,e,n,i,r){return t=32767*(t-n)*r,e=32767*(e-i)*r,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function x(t){var e=t,n=t;do{(e.x<n.x||e.x===n.x&&e.y<n.y)&&(n=e),e=e.next}while(e!==t);return n}function b(t,e,n,i,r,o,a,s){return(r-a)*(e-s)-(t-a)*(o-s)>=0&&(t-a)*(i-s)-(n-a)*(e-s)>=0&&(n-a)*(o-s)-(r-a)*(i-s)>=0}function w(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!j(t,e)&&(M(t,e)&&M(e,t)&&I(t,e)&&(k(t.prev,t,e.prev)||k(t,e.prev,e))||_(t,e)&&k(t.prev,t,t.next)>0&&k(e.prev,e,e.next)>0)}function k(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _(t,e){return t.x===e.x&&t.y===e.y}function S(t,e,n,i){var r=T(k(t,e,n)),o=T(k(t,e,i)),a=T(k(n,i,t)),s=T(k(n,i,e));return r!==o&&a!==s||(!(0!==r||!z(t,n,e))||(!(0!==o||!z(t,i,e))||(!(0!==a||!z(n,t,i))||!(0!==s||!z(n,e,i)))))}function z(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function T(t){return t>0?1:t<0?-1:0}function j(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&S(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function M(t,e){return k(t.prev,t,t.next)<0?k(t,e,t.next)>=0&&k(t,t.prev,e)>=0:k(t,e,t.prev)<0||k(t,t.next,e)<0}function I(t,e){var n=t,i=!1,r=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&r<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==t);return i}function P(t,e){var n=new A(t.i,t.x,t.y),i=new A(e.i,e.x,e.y),r=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=r,r.prev=n,i.next=n,n.prev=i,o.next=i,i.prev=o,i}function E(t,e,n,i){var r=new A(t,e,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function F(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function A(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function V(t,e,n,i){for(var r=0,o=e,a=n-i;o<n;o+=i)r+=(t[a]-t[o])*(t[o+1]+t[a+1]),a=o;return r}t.exports=i,t.exports.default=i,i.deviation=function(t,e,n,i){var r=e&&e.length,o=r?e[0]*n:t.length,a=Math.abs(V(t,0,o,n));if(r)for(var s=0,u=e.length;s<u;s++){var l=e[s]*n,c=s<u-1?e[s+1]*n:t.length;a-=Math.abs(V(t,l,c,n))}var p=0;for(s=0;s<i.length;s+=3){var f=i[s]*n,h=i[s+1]*n,d=i[s+2]*n;p+=Math.abs((t[f]-t[d])*(t[h+1]-t[f+1])-(t[f]-t[h])*(t[d+1]-t[f+1]))}return 0===a&&0===p?0:Math.abs((p-a)/a)},i.flatten=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},i=0,r=0;r<t.length;r++){for(var o=0;o<t[r].length;o++)for(var a=0;a<e;a++)n.vertices.push(t[r][o][a]);r>0&&(i+=t[r-1].length,n.holes.push(i))}return n}},function(t,e,n){\\\"use strict\\\";function i(t,e){return e.area-t.area}function r(t){for(var e,n,i=0,r=0,o=t.length,a=o-1;r<o;a=r++)e=t[r],n=t[a],i+=(n.x-e.x)*(e.y+n.y);return i}var o=n(57);t.exports=function(t,e){var n=t.length;if(n<=1)return[t];for(var a,s,u=[],l=0;l<n;l++){var c=r(t[l]);0!==c&&(t[l].area=Math.abs(c),void 0===s&&(s=c<0),s===c<0?(a&&u.push(a),a=[t[l]]):a.push(t[l]))}if(a&&u.push(a),e>1)for(var p=0;p<u.length;p++)u[p].length<=e||(o(u[p],e,1,u[p].length-1,i),u[p]=u[p].slice(0,e));return u}},function(t,e,n){!function(e,n){t.exports=n()}(0,function(){\\\"use strict\\\";function t(t,n,r,o,a){e(t,n,r||0,o||t.length-1,a||i)}function e(t,i,r,o,a){for(;o>r;){if(o-r>600){var s=o-r+1,u=i-r+1,l=Math.log(s),c=.5*Math.exp(2*l/3),p=.5*Math.sqrt(l*c*(s-c)/s)*(u-s/2<0?-1:1);e(t,i,Math.max(r,Math.floor(i-u*c/s+p)),Math.min(o,Math.floor(i+(s-u)*c/s+p)),a)}var f=t[i],h=r,d=o;for(n(t,r,i),a(t[o],f)>0&&n(t,r,o);h<d;){for(n(t,h,d),h++,d--;a(t[h],f)<0;)h++;for(;a(t[d],f)>0;)d--}0===a(t[r],f)?n(t,r,d):(d++,n(t,d,o)),d<=i&&(r=d+1),i<=d&&(o=d-1)}}function n(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}function i(t,e){return t<e?-1:t>e?1:0}return t})},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=r.EXTENT,u=Math.cos(Math.PI/180*37.5),l=Math.pow(2,14)/.5;t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.addLineVertex=function(t,e,n,i,r,o,a){return t.emplaceBack(e.x<<1|i,e.y<<1|r,Math.round(63*n.x)+128,Math.round(63*n.y)+128,1+(0===o?0:o<0?-1:1)|(.5*a&63)<<2,.5*a>>6)},i.prototype.programInterfaces={line:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]}},i.prototype.addFeature=function(t){for(var e=a(t),n=0;n<e.length;n++)this.addLine(e[n],this.layer.layout[\\\"line-join\\\"],this.layer.layout[\\\"line-cap\\\"],this.layer.layout[\\\"line-miter-limit\\\"],this.layer.layout[\\\"line-round-limit\\\"])},i.prototype.addLine=function(t,e,n,i,r){for(var o=t.length;o>2&&t[o-1].equals(t[o-2]);)o--;if(!(t.length<2)){\\\"bevel\\\"===e&&(i=1.05);var a=s/(512*this.overscaling)*15,l=t[0],c=t[o-1],p=l.equals(c);if(this.makeRoomFor(\\\"line\\\",10*o),2!==o||!p){this.distance=0;var f,h,d,y,m,v,g,x=n,b=p?\\\"butt\\\":n,w=!0;this.e1=this.e2=this.e3=-1,p&&(f=t[o-2],m=l.sub(f)._unit()._perp());for(var k=0;k<o;k++)if(!(d=p&&k===o-1?t[1]:t[k+1])||!t[k].equals(d)){m&&(y=m),f&&(h=f),f=t[k],m=d?d.sub(f)._unit()._perp():y,y=y||m;var _=y.add(m)._unit(),S=_.x*m.x+_.y*m.y,z=1/S,T=S<u&&h&&d;if(T&&k>0){var j=f.dist(h);if(j>2*a){var M=f.sub(f.sub(h)._mult(a/j)._round());this.distance+=M.dist(h),this.addCurrentVertex(M,this.distance,y.mult(1),0,0,!1),h=M}}var I=h&&d,P=I?e:d?x:b;if(I&&\\\"round\\\"===P&&(z<r?P=\\\"miter\\\":z<=2&&(P=\\\"fakeround\\\")),\\\"miter\\\"===P&&z>i&&(P=\\\"bevel\\\"),\\\"bevel\\\"===P&&(z>2&&(P=\\\"flipbevel\\\"),z<i&&(P=\\\"miter\\\")),h&&(this.distance+=f.dist(h)),\\\"miter\\\"===P)_._mult(z),this.addCurrentVertex(f,this.distance,_,0,0,!1);else if(\\\"flipbevel\\\"===P){if(z>100)_=m.clone();else{var E=y.x*m.y-y.y*m.x>0?-1:1,F=z*y.add(m).mag()/y.sub(m).mag();_._perp()._mult(F*E)}this.addCurrentVertex(f,this.distance,_,0,0,!1),this.addCurrentVertex(f,this.distance,_.mult(-1),0,0,!1)}else if(\\\"bevel\\\"===P||\\\"fakeround\\\"===P){var A=y.x*m.y-y.y*m.x>0,V=-Math.sqrt(z*z-1);if(A?(g=0,v=V):(v=0,g=V),w||this.addCurrentVertex(f,this.distance,y,v,g,!1),\\\"fakeround\\\"===P){for(var q,L=Math.floor(8*(.5-(S-.5))),O=0;O<L;O++)q=m.mult((O+1)/(L+1))._add(y)._unit(),this.addPieSliceVertex(f,this.distance,q,A);this.addPieSliceVertex(f,this.distance,_,A);for(var B=L-1;B>=0;B--)q=y.mult((B+1)/(L+1))._add(m)._unit(),this.addPieSliceVertex(f,this.distance,q,A)}d&&this.addCurrentVertex(f,this.distance,m,-v,-g,!1)}else\\\"butt\\\"===P?(w||this.addCurrentVertex(f,this.distance,y,0,0,!1),d&&this.addCurrentVertex(f,this.distance,m,0,0,!1)):\\\"square\\\"===P?(w||(this.addCurrentVertex(f,this.distance,y,1,1,!1),this.e1=this.e2=-1),d&&this.addCurrentVertex(f,this.distance,m,-1,-1,!1)):\\\"round\\\"===P&&(w||(this.addCurrentVertex(f,this.distance,y,0,0,!1),this.addCurrentVertex(f,this.distance,y,1,1,!0),this.e1=this.e2=-1),d&&(this.addCurrentVertex(f,this.distance,m,-1,-1,!0),this.addCurrentVertex(f,this.distance,m,0,0,!1)));if(T&&k<o-1){var C=f.dist(d);if(C>2*a){var D=f.add(d.sub(f)._mult(a/C)._round());this.distance+=D.dist(f),this.addCurrentVertex(D,this.distance,m.mult(1),0,0,!1),f=D}}w=!1}}}},i.prototype.addCurrentVertex=function(t,e,n,i,r,o){var a,s=o?1:0,u=this.arrayGroups.line[this.arrayGroups.line.length-1].layout,c=u.vertex,p=u.element;a=n.clone(),i&&a._sub(n.perp()._mult(i)),this.e3=this.addLineVertex(c,t,a,s,0,i,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,a=n.mult(-1),r&&a._sub(n.perp()._mult(r)),this.e3=this.addLineVertex(c,t,a,s,1,-r,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,e>l/2&&(this.distance=0,this.addCurrentVertex(t,this.distance,n,i,r,o))},i.prototype.addPieSliceVertex=function(t,e,n,i){var r=i?1:0;n=n.mult(i?-1:1);var o=this.arrayGroups.line[this.arrayGroups.line.length-1].layout,a=o.vertex,s=o.element;this.e3=this.addLineVertex(a,t,n,0,r,0,e),this.e1>=0&&this.e2>=0&&s.emplaceBack(this.e1,this.e2,this.e3),i?this.e2=this.e3:this.e1=this.e3}},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=r.EXTENT;t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.addCircleVertex=function(t,e,n,i,r){return t.emplaceBack(2*e+(i+1)/2,2*n+(r+1)/2)},i.prototype.programInterfaces={circle:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}],paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"circle-color\\\",e,n)},multiplier:255,paintProperty:\\\"circle-color\\\"},{name:\\\"a_radius\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-radius\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-radius\\\"},{name:\\\"a_blur\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-blur\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-blur\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"circle-opacity\\\"}]}},i.prototype.addFeature=function(t){for(var e={zoom:this.zoom},n=a(t),i=this.makeRoomFor(\\\"circle\\\",0),r=i.layout.vertex.length,o=0;o<n.length;o++)for(var u=0;u<n[o].length;u++){var l=n[o][u].x,c=n[o][u].y;if(!(l<0||l>=s||c<0||c>=s)){var p=this.makeRoomFor(\\\"circle\\\",4),f=p.layout.vertex,h=this.addCircleVertex(f,l,c,-1,-1);this.addCircleVertex(f,l,c,1,-1),this.addCircleVertex(f,l,c,1,1),this.addCircleVertex(f,l,c,-1,1),p.layout.element.emplaceBack(h,h+1,h+2),p.layout.element.emplaceBack(h,h+3,h+2)}}this.populatePaintArrays(\\\"circle\\\",e,t.properties,i,r)}},function(t,e,n){\\\"use strict\\\";function i(t){a.apply(this,arguments),this.showCollisionBoxes=t.showCollisionBoxes,this.overscaling=t.overscaling,this.collisionBoxArray=t.collisionBoxArray,this.symbolQuadsArray=t.symbolQuadsArray,this.symbolInstancesArray=t.symbolInstancesArray,this.sdfIcons=t.sdfIcons,this.iconsNeedLinear=t.iconsNeedLinear,this.adjustedTextSize=t.adjustedTextSize,this.adjustedIconSize=t.adjustedIconSize,this.fontstack=t.fontstack}function r(t,e,n,i,r,o,a,s,u,l){return t.emplaceBack(e,n,Math.round(64*i),Math.round(64*r),o/4,a/4,10*(l||0),0,10*(s||0),10*Math.min(u||25,25))}var o=n(2),a=n(4),s=n(19),u=n(61),l=n(21),c=n(22),p=n(63),f=n(64),h=n(65),d=n(66),y=n(0),m=n(7),v=n(67),g=p.shapeText,x=p.shapeIcon,b=c.getGlyphQuads,w=c.getIconQuads,k=a.EXTENT;t.exports=i,i.prototype=y.inherit(a,{}),i.prototype.serialize=function(){var t=a.prototype.serialize.apply(this);return t.sdfIcons=this.sdfIcons,t.iconsNeedLinear=this.iconsNeedLinear,t.adjustedTextSize=this.adjustedTextSize,t.adjustedIconSize=this.adjustedIconSize,t.fontstack=this.fontstack,t};var _=[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_offset\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data1\\\",components:4,type:\\\"Uint8\\\"},{name:\\\"a_data2\\\",components:2,type:\\\"Uint8\\\"}];i.prototype.addCollisionBoxVertex=function(t,e,n,i,r){return t.emplaceBack(e.x,e.y,Math.round(n.x),Math.round(n.y),10*i,10*r)},i.prototype.programInterfaces={glyph:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:_},icon:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:_},collisionBox:{vertexBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_extrude\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:2,type:\\\"Uint8\\\"}]}},i.prototype.populateBuffers=function(t,e,n){var i={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};this.adjustedTextMaxSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:18,zoomHistory:i}),this.adjustedTextSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:this.zoom+1,zoomHistory:i}),this.adjustedIconMaxSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:18,zoomHistory:i}),this.adjustedIconSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:this.zoom+1,zoomHistory:i});var r=512*this.overscaling;this.tilePixelRatio=k/r,this.compareText={},this.iconsNeedLinear=!1,this.symbolInstancesStartIndex=this.symbolInstancesArray.length;var o=this.layer.layout,a=this.features,s=this.textFeatures,u=.5,c=.5;switch(o[\\\"text-anchor\\\"]){case\\\"right\\\":case\\\"top-right\\\":case\\\"bottom-right\\\":u=1;break;case\\\"left\\\":case\\\"top-left\\\":case\\\"bottom-left\\\":u=0}switch(o[\\\"text-anchor\\\"]){case\\\"bottom\\\":case\\\"bottom-right\\\":case\\\"bottom-left\\\":c=1;break;case\\\"top\\\":case\\\"top-right\\\":case\\\"top-left\\\":c=0}for(var p=\\\"right\\\"===o[\\\"text-justify\\\"]?1:\\\"left\\\"===o[\\\"text-justify\\\"]?0:.5,f=24*o[\\\"text-line-height\\\"],d=\\\"line\\\"!==o[\\\"symbol-placement\\\"]?24*o[\\\"text-max-width\\\"]:0,v=24*o[\\\"text-letter-spacing\\\"],b=[24*o[\\\"text-offset\\\"][0],24*o[\\\"text-offset\\\"][1]],w=this.fontstack=o[\\\"text-font\\\"].join(\\\",\\\"),_=[],S=0;S<a.length;S++)_.push(m(a[S]));if(\\\"line\\\"===o[\\\"symbol-placement\\\"]){var z=h(a,s,_);_=z.geometries,a=z.features,s=z.textFeatures}for(var T,j,M=0;M<a.length;M++)if(_[M]){if(T=s[M]?g(s[M],e[w],d,f,u,c,p,v,b):null,o[\\\"icon-image\\\"]){var I=l(a[M].properties,o[\\\"icon-image\\\"]),P=n[I];j=x(P,o),P&&(void 0===this.sdfIcons?this.sdfIcons=P.sdf:this.sdfIcons!==P.sdf&&y.warnOnce(\\\"Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer\\\"),1!==P.pixelRatio&&(this.iconsNeedLinear=!0))}else j=null;(T||j)&&this.addFeature(_[M],T,j,a[M].index)}this.symbolInstancesEndIndex=this.symbolInstancesArray.length,this.placeFeatures(t,this.showCollisionBoxes),this.trimArrays()},i.prototype.addFeature=function(t,e,n,i){var r=this.layer.layout,o=this.adjustedTextSize/24,a=void 0!==this.adjustedTextMaxSize?this.adjustedTextMaxSize:this.adjustedTextSize,l=this.tilePixelRatio*o,c=this.tilePixelRatio*a/24,p=this.tilePixelRatio*this.adjustedIconSize,f=this.tilePixelRatio*r[\\\"symbol-spacing\\\"],h=r[\\\"symbol-avoid-edges\\\"],y=r[\\\"text-padding\\\"]*this.tilePixelRatio,m=r[\\\"icon-padding\\\"]*this.tilePixelRatio,v=r[\\\"text-max-angle\\\"]/180*Math.PI,g=\\\"map\\\"===r[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===r[\\\"symbol-placement\\\"],x=\\\"map\\\"===r[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===r[\\\"symbol-placement\\\"],b=r[\\\"text-allow-overlap\\\"]||r[\\\"icon-allow-overlap\\\"]||r[\\\"text-ignore-placement\\\"]||r[\\\"icon-ignore-placement\\\"],w=\\\"line\\\"===r[\\\"symbol-placement\\\"],_=f/2;w&&(t=d(t,0,0,k,k));for(var S=0;S<t.length;S++){var z,T=t[S];z=w?u(T,f,v,e,n,24,c,this.overscaling,k):[new s(T[0].x,T[0].y,0)];for(var j=0,M=z.length;j<M;j++){var I=z[j];if(!(e&&w&&this.anchorIsTooClose(e.text,_,I))){var P=!(I.x<0||I.x>k||I.y<0||I.y>k);if(!h||P){var E=P||b;this.addSymbolInstance(I,T,e,n,r,E,this.symbolInstancesArray.length,this.collisionBoxArray,i,this.sourceLayerIndex,this.index,l,y,g,p,m,x)}}}}},i.prototype.anchorIsTooClose=function(t,e,n){var i=this.compareText;if(t in i){for(var r=i[t],o=r.length-1;o>=0;o--)if(n.dist(r[o])<e)return!0}else i[t]=[];return i[t].push(n),!1},i.prototype.placeFeatures=function(t,e){this.recalculateStyleLayers(),this.createArrays();var n=this.layer.layout,i=t.maxScale,r=\\\"map\\\"===n[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"],o=\\\"map\\\"===n[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"];if(n[\\\"text-allow-overlap\\\"]||n[\\\"icon-allow-overlap\\\"]||n[\\\"text-ignore-placement\\\"]||n[\\\"icon-ignore-placement\\\"]){var a=this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex,this.symbolInstancesEndIndex),s=t.angle,u=Math.sin(s),l=Math.cos(s);this.sortedSymbolInstances=a.sort(function(t,e){return(u*t.anchorPointX+l*t.anchorPointY|0)-(u*e.anchorPointX+l*e.anchorPointY|0)||e.index-t.index})}for(var c=this.symbolInstancesStartIndex;c<this.symbolInstancesEndIndex;c++){var p=this.sortedSymbolInstances?this.sortedSymbolInstances[c-this.symbolInstancesStartIndex]:this.symbolInstancesArray.get(c),f={boxStartIndex:p.textBoxStartIndex,boxEndIndex:p.textBoxEndIndex},h={boxStartIndex:p.iconBoxStartIndex,boxEndIndex:p.iconBoxEndIndex},d=!(p.textBoxStartIndex===p.textBoxEndIndex),y=!(p.iconBoxStartIndex===p.iconBoxEndIndex),m=n[\\\"text-optional\\\"]||!d,v=n[\\\"icon-optional\\\"]||!y,g=d?t.placeCollisionFeature(f,n[\\\"text-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale,x=y?t.placeCollisionFeature(h,n[\\\"icon-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale;m||v?!v&&g?g=Math.max(x,g):!m&&x&&(x=Math.max(x,g)):x=g=Math.max(x,g),d&&(t.insertCollisionFeature(f,g,n[\\\"text-ignore-placement\\\"]),g<=i&&this.addSymbols(\\\"glyph\\\",p.glyphQuadStartIndex,p.glyphQuadEndIndex,g,n[\\\"text-keep-upright\\\"],r,t.angle)),y&&(t.insertCollisionFeature(h,x,n[\\\"icon-ignore-placement\\\"]),x<=i&&this.addSymbols(\\\"icon\\\",p.iconQuadStartIndex,p.iconQuadEndIndex,x,n[\\\"icon-keep-upright\\\"],o,t.angle))}e&&this.addToDebugBuffers(t)},i.prototype.addSymbols=function(t,e,n,i,o,a,s){for(var u=this.makeRoomFor(t,4*(n-e)),l=u.layout.element,c=u.layout.vertex,p=this.zoom,f=Math.max(Math.log(i)/Math.LN2+p,0),h=e;h<n;h++){var d=this.symbolQuadsArray.get(h).SymbolQuad,y=d.angle,m=(y+s+Math.PI)%(2*Math.PI);if(!(o&&a&&(m<=Math.PI/2||m>3*Math.PI/2))){var v=d.tl,g=d.tr,x=d.bl,b=d.br,w=d.tex,k=d.anchorPoint,_=Math.max(p+Math.log(d.minScale)/Math.LN2,f),S=Math.min(p+Math.log(d.maxScale)/Math.LN2,25);if(!(S<=_)){_===f&&(_=0);var z=r(c,k.x,k.y,v.x,v.y,w.x,w.y,_,S,f);r(c,k.x,k.y,g.x,g.y,w.x+w.w,w.y,_,S,f),r(c,k.x,k.y,x.x,x.y,w.x,w.y+w.h,_,S,f),r(c,k.x,k.y,b.x,b.y,w.x+w.w,w.y+w.h,_,S,f),l.emplaceBack(z,z+1,z+2),l.emplaceBack(z+1,z+2,z+3)}}}},i.prototype.updateIcons=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"icon-image\\\"];if(e)for(var n=0;n<this.features.length;n++){var i=l(this.features[n].properties,e);i&&(t[i]=!0)}},i.prototype.updateFont=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"text-font\\\"],n=t[e]=t[e]||{};this.textFeatures=f(this.features,this.layer.layout,n)},i.prototype.addToDebugBuffers=function(t){for(var e=this.makeRoomFor(\\\"collisionBox\\\",0),n=e.layout.vertex,i=-t.angle,r=t.yStretch,a=this.symbolInstancesStartIndex;a<this.symbolInstancesEndIndex;a++){var s=this.symbolInstancesArray.get(a);s.textCollisionFeature={boxStartIndex:s.textBoxStartIndex,boxEndIndex:s.textBoxEndIndex},s.iconCollisionFeature={boxStartIndex:s.iconBoxStartIndex,boxEndIndex:s.iconBoxEndIndex};for(var u=0;u<2;u++){var l=s[0===u?\\\"textCollisionFeature\\\":\\\"iconCollisionFeature\\\"];if(l)for(var c=l.boxStartIndex;c<l.boxEndIndex;c++){var p=this.collisionBoxArray.get(c),f=p.anchorPoint,h=new o(p.x1,p.y1*r)._rotate(i),d=new o(p.x2,p.y1*r)._rotate(i),y=new o(p.x1,p.y2*r)._rotate(i),m=new o(p.x2,p.y2*r)._rotate(i),v=Math.max(0,Math.min(25,this.zoom+Math.log(p.maxScale)/Math.LN2)),g=Math.max(0,Math.min(25,this.zoom+Math.log(p.placementScale)/Math.LN2));this.addCollisionBoxVertex(n,f,h,v,g),this.addCollisionBoxVertex(n,f,d,v,g),this.addCollisionBoxVertex(n,f,d,v,g),this.addCollisionBoxVertex(n,f,m,v,g),this.addCollisionBoxVertex(n,f,m,v,g),this.addCollisionBoxVertex(n,f,y,v,g),this.addCollisionBoxVertex(n,f,y,v,g),this.addCollisionBoxVertex(n,f,h,v,g)}}}},i.prototype.addSymbolInstance=function(t,e,n,i,r,o,a,s,u,l,c,p,f,h,d,y,m){var g,x,k,_,S,z,T,j;if(n&&(T=o?b(t,n,p,e,r,h):[],S=new v(s,e,t,u,l,c,n,p,f,h,!1)),g=this.symbolQuadsArray.length,T&&T.length)for(var M=0;M<T.length;M++)this.addSymbolQuad(T[M]);x=this.symbolQuadsArray.length;var I=S?S.boxStartIndex:this.collisionBoxArray.length,P=S?S.boxEndIndex:this.collisionBoxArray.length;i&&(j=o?w(t,i,d,e,r,m):[],z=new v(s,e,t,u,l,c,i,d,y,m,!0)),k=this.symbolQuadsArray.length,j&&1===j.length&&this.addSymbolQuad(j[0]),_=this.symbolQuadsArray.length;var E=z?z.boxStartIndex:this.collisionBoxArray.length,F=z?z.boxEndIndex:this.collisionBoxArray.length;return this.symbolInstancesArray.emplaceBack(I,P,E,F,g,x,k,_,t.x,t.y,a)},i.prototype.addSymbolQuad=function(t){return this.symbolQuadsArray.emplaceBack(t.anchorPoint.x,t.anchorPoint.y,t.tl.x,t.tl.y,t.tr.x,t.tr.y,t.bl.x,t.bl.y,t.br.x,t.br.y,t.tex.h,t.tex.w,t.tex.x,t.tex.y,t.angle,t.maxScale,t.minScale)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a,s,u,l){var c=i?.6*a*s:0,p=Math.max(i?i.right-i.left:0,o?o.right-o.left:0),f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;e-p*s<e/4&&(e=p*s+e/4);var h=2*a;return r(t,f?e/2*u%e:(p/2+h)*s*u%e,e,c,n,p*s,f,!1,l)}function r(t,e,n,i,u,l,c,p,f){for(var h=l/2,d=0,y=0;y<t.length-1;y++)d+=t[y].dist(t[y+1]);for(var m=0,v=e-n,g=[],x=0;x<t.length-1;x++){for(var b=t[x],w=t[x+1],k=b.dist(w),_=w.angleTo(b);v+n<m+k;){v+=n;var S=(v-m)/k,z=o(b.x,w.x,S),T=o(b.y,w.y,S);if(z>=0&&z<f&&T>=0&&T<f&&v-h>=0&&v+h<=d){var j=new a(z,T,_,x)._round();i&&!s(t,j,l,i,u)||g.push(j)}}m+=k}return p||g.length||c||(g=r(t,m/2,n,i,u,l,c,!0,f)),g}var o=n(20),a=n(19),s=n(62);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r){if(void 0===e.segment)return!0;for(var o=e,a=e.segment+1,s=0;s>-n/2;){if(--a<0)return!1;s-=t[a].dist(o),o=t[a]}s+=t[a].dist(t[a+1]),a++;for(var u=[],l=0;s<n/2;){var c=t[a-1],p=t[a],f=t[a+1];if(!f)return!1;var h=c.angleTo(p)-p.angleTo(f);for(h=Math.abs((h+3*Math.PI)%(2*Math.PI)-Math.PI),u.push({distance:s,angleDelta:h}),l+=h;s-u[0].distance>i;)l-=u.shift().angleDelta;if(l>r)return!1;a++,s+=p.dist(f)}return!0}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.codePoint=t,this.x=e,this.y=n,this.glyph=i}function r(t,e,n,i,r,o){this.positionedGlyphs=t,this.text=e,this.top=n,this.bottom=i,this.left=r,this.right=o}function o(t,e,n,o,s,u,l,c,p){for(var f=[],h=new r(f,t,p[1],p[1],p[0],p[0]),d=0,y=0;y<t.length;y++){var m=t.charCodeAt(y),v=e[m];v&&(f.push(new i(m,d,-17,v)),d+=v.advance+c)}return!!f.length&&(a(h,e,o,n,s,u,l,p),h)}function a(t,e,n,i,r,o,a,l){var c=null,h=0,d=0,y=0,m=0,v=t.positionedGlyphs;if(i)for(var g=0;g<v.length;g++){var x=v[g];if(x.x-=h,x.y+=n*y,x.x>i&&null!==c){var b=v[c+1].x;m=Math.max(b,m);for(var w=c+1;w<=g;w++)v[w].y+=n,v[w].x-=b;if(a){var k=c;p[v[c].codePoint]&&k--,s(v,e,d,k,a)}d=c+1,c=null,h+=b,y++}f[x.codePoint]&&(c=g)}var _=v[v.length-1],S=_.x+e[_.codePoint].advance;m=Math.max(m,S);var z=(y+1)*n;s(v,e,d,v.length-1,a),u(v,a,r,o,m,n,y,l),t.top+=-o*z,t.bottom=t.top+z,t.left+=-r*m,t.right=t.left+m}function s(t,e,n,i,r){for(var o=e[t[i].codePoint].advance,a=(t[i].x+o)*r,s=n;s<=i;s++)t[s].x-=a}function u(t,e,n,i,r,o,a,s){for(var u=(e-n)*r+s[0],l=(-i*(a+1)+.5)*o+s[1],c=0;c<t.length;c++)t[c].x+=u,t[c].y+=l}function l(t,e){if(!t||!t.rect)return null;var n=e[\\\"icon-offset\\\"][0],i=e[\\\"icon-offset\\\"][1],r=n-t.width/2,o=r+t.width,a=i-t.height/2;return new c(t,a,a+t.height,r,o)}function c(t,e,n,i,r){this.image=t,this.top=e,this.bottom=n,this.left=i,this.right=r}t.exports={shapeText:o,shapeIcon:l};var p={32:!0,8203:!0},f={32:!0,38:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){for(var i=[],o=0,a=t.length;o<a;o++){var s=r(t[o].properties,e[\\\"text-field\\\"]);if(s){s=s.toString();var u=e[\\\"text-transform\\\"];\\\"uppercase\\\"===u?s=s.toLocaleUpperCase():\\\"lowercase\\\"===u&&(s=s.toLocaleLowerCase());for(var l=0;l<s.length;l++)n[s.charCodeAt(l)]=!0;i[o]=s}else i[o]=null}return i}var r=n(21);t.exports=i},function(t,e,n){\\\"use strict\\\";t.exports=function(t,e,n){function i(i){c.push(t[i]),p.push(n[i]),f.push(e[i]),h++}function r(t,e,n){var i=l[t];return delete l[t],l[e]=i,p[i][0].pop(),p[i][0]=p[i][0].concat(n[0]),i}function o(t,e,n){var i=u[e];return delete u[e],u[t]=i,p[i][0].shift(),p[i][0]=n[0].concat(p[i][0]),i}function a(t,e,n){var i=n?e[0][e[0].length-1]:e[0][0];return t+\\\":\\\"+i.x+\\\":\\\"+i.y}var s,u={},l={},c=[],p=[],f=[],h=0;for(s=0;s<t.length;s++){var d=n[s],y=e[s];if(y){var m=a(y,d),v=a(y,d,!0);if(m in l&&v in u&&l[m]!==u[v]){var g=o(m,v,d),x=r(m,v,p[g]);delete u[m],delete l[v],l[a(y,p[x],!0)]=x,p[g]=null}else m in l?r(m,v,d):v in u?o(m,v,d):(i(s),u[m]=h-1,l[v]=h-1)}else i(s)}return{features:c,textFeatures:f,geometries:p}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){for(var a=[],s=0;s<t.length;s++)for(var u,l=t[s],c=0;c<l.length-1;c++){var p=l[c],f=l[c+1];p.x<e&&f.x<e||(p.x<e?p=new r(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round():f.x<e&&(f=new r(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round()),p.y<n&&f.y<n||(p.y<n?p=new r(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round():f.y<n&&(f=new r(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round()),p.x>=i&&f.x>=i||(p.x>=i?p=new r(i,p.y+(f.y-p.y)*((i-p.x)/(f.x-p.x)))._round():f.x>=i&&(f=new r(i,p.y+(f.y-p.y)*((i-p.x)/(f.x-p.x)))._round()),p.y>=o&&f.y>=o||(p.y>=o?p=new r(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round():f.y>=o&&(f=new r(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round()),u&&p.equals(u[u.length-1])||(u=[p],a.push(u)),u.push(f)))))}return a}var r=n(2);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a,s,u,l,c){var p=a.top*s-u,f=a.bottom*s+u,h=a.left*s-u,d=a.right*s+u;if(this.boxStartIndex=t.length,l){var y=f-p,m=d-h;if(y>0)if(y=Math.max(10*s,y),c){var v=e[n.segment+1].sub(e[n.segment])._unit()._mult(m),g=[n.sub(v),n.add(v)];this._addLineCollisionBoxes(t,g,n,0,m,y,i,r,o)}else this._addLineCollisionBoxes(t,e,n,n.segment,m,y,i,r,o)}else t.emplaceBack(n.x,n.y,h,p,d,f,1/0,i,r,o,0,0,0,0,0);this.boxEndIndex=t.length}t.exports=i,i.prototype._addLineCollisionBoxes=function(t,e,n,i,r,o,a,s,u){var l=o/2,c=Math.floor(r/l),p=-o/2,f=this.boxes,h=n,d=i+1,y=p;do{if(--d<0)return f;y-=e[d].dist(h),h=e[d]}while(y>-r/2);for(var m=e[d].dist(e[d+1]),v=0;v<c;v++){for(var g=-r/2+v*l;y+m<g;){if(y+=m,++d+1>=e.length)return f;m=e[d].dist(e[d+1])}var x=g-y,b=e[d],w=e[d+1],k=w.sub(b)._unit()._mult(x)._add(b)._round(),_=Math.max(Math.abs(g-p)-l/2,0),S=r/2/_;t.emplaceBack(k.x,k.y,-o/2,-o/2,o/2,o/2,S,a,s,u,0,0,0,0,0)}return f}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.layers=t.readFields(r,{},e)}function r(t,e,n){if(3===t){var i=new o(n,n.readVarint()+n.pos);i.length&&(e[i.name]=i)}}var o=n(25);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t){var e;t&&t.length&&(e=t,t=e.length);var n=new Uint8Array(t||0);return e&&n.set(e),n.readUInt32LE=o.readUInt32LE,n.writeUInt32LE=o.writeUInt32LE,n.readInt32LE=o.readInt32LE,n.writeInt32LE=o.writeInt32LE,n.readFloatLE=o.readFloatLE,n.writeFloatLE=o.writeFloatLE,n.readDoubleLE=o.readDoubleLE,n.writeDoubleLE=o.writeDoubleLE,n.toString=o.toString,n.write=o.write,n.slice=o.slice,n.copy=o.copy,n._isBuffer=!0,n}function r(t){for(var e,n,i=t.length,r=[],o=0;o<i;o++){if((e=t.charCodeAt(o))>55295&&e<57344){if(!n){e>56319||o+1===i?r.push(239,191,189):n=e;continue}if(e<56320){r.push(239,191,189),n=e;continue}e=n-55296<<10|e-56320|65536,n=null}else n&&(r.push(239,191,189),n=null);e<128?r.push(e):e<2048?r.push(e>>6|192,63&e|128):e<65536?r.push(e>>12|224,e>>6&63|128,63&e|128):r.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return r}t.exports=i;var o,a,s,u=n(70);o={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return u.read(this,t,!0,23,4)},readDoubleLE:function(t){return u.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return u.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return u.write(this,t,e,!0,52,8)},toString:function(t,e,n){var i=\\\"\\\",r=\\\"\\\";e=e||0,n=Math.min(this.length,n||this.length);for(var o=e;o<n;o++){var a=this[o];a<=127?(i+=decodeURIComponent(r)+String.fromCharCode(a),r=\\\"\\\"):r+=\\\"%\\\"+a.toString(16)}return i+=decodeURIComponent(r)},write:function(t,e){for(var n=t===a?s:r(t),i=0;i<n.length;i++)this[e+i]=n[i]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var n=0;n<this.length;n++)t[e+n]=this[n]}},o.writeInt32LE=o.writeUInt32LE,i.byteLength=function(t){return a=t,s=r(t),s.length},i.isBuffer=function(t){return!(!t||!t._isBuffer)}},function(t,e){e.read=function(t,e,n,i,r){var o,a,s=8*r-i-1,u=(1<<s)-1,l=u>>1,c=-7,p=n?r-1:0,f=n?-1:1,h=t[e+p];for(p+=f,o=h&(1<<-c)-1,h>>=-c,c+=s;c>0;o=256*o+t[e+p],p+=f,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=i;c>0;a=256*a+t[e+p],p+=f,c-=8);if(0===o)o=1-l;else{if(o===u)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,i),o-=l}return(h?-1:1)*a*Math.pow(2,o-i)},e.write=function(t,e,n,i,r,o){var a,s,u,l=8*o-r-1,c=(1<<l)-1,p=c>>1,f=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,h=i?0:o-1,d=i?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),e+=a+p>=1?f/u:f*Math.pow(2,1-p),e*u>=2&&(a++,u/=2),a+p>=c?(s=0,a=c):a+p>=1?(s=(e*u-1)*Math.pow(2,r),a+=p):(s=e*Math.pow(2,p-1)*Math.pow(2,r),a=0));r>=8;t[n+h]=255&s,h+=d,s/=256,r-=8);for(a=a<<r|s,l+=r;l>0;t[n+h]=255&a,h+=d,a/=256,l-=8);t[n+h-d]|=128*y}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this._vectorTileFeature=t,t._z=e,t._x=n,t._y=i,this.properties=t.properties,t._id&&(this.id=t._id)}t.exports=i,i.prototype={type:\\\"Feature\\\",get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},set geometry(t){this._geometry=t},toJSON:function(){var t={};for(var e in this)\\\"_geometry\\\"!==e&&\\\"_vectorTileFeature\\\"!==e&&\\\"toJSON\\\"!==e&&(t[e]=this[e]);return t}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){for(var i=0;i<t.length;i++)for(var r=t[i],o=0;o<e.length;o++)for(var a=e[o],s=0;s<a.length;s++){var u=a[s];if(h(r,u))return!0;if(c(u,r,n))return!0}return!1}function r(t,e){if(1===t.length&&1===t[0].length)return f(e,t[0][0]);for(var n=0;n<e.length;n++)for(var i=e[n],r=0;r<i.length;r++)if(f(t,i[r]))return!0;for(var o=0;o<t.length;o++){for(var a=t[o],u=0;u<a.length;u++)if(f(e,a[u]))return!0;for(var l=0;l<e.length;l++)if(s(a,e[l]))return!0}return!1}function o(t,e,n){for(var i=0;i<e.length;i++)for(var r=e[i],o=0;o<t.length;o++){var s=t[o];if(s.length>=3)for(var u=0;u<r.length;u++)if(h(s,r[u]))return!0;if(a(s,r,n))return!0}return!1}function a(t,e,n){if(t.length>1){if(s(t,e))return!0;for(var i=0;i<e.length;i++)if(c(e[i],t,n))return!0}for(var r=0;r<t.length;r++)if(c(t[r],e,n))return!0;return!1}function s(t,e){for(var n=0;n<t.length-1;n++)for(var i=t[n],r=t[n+1],o=0;o<e.length-1;o++){var a=e[o],s=e[o+1];if(l(i,r,a,s))return!0}return!1}function u(t,e,n){return(n.y-t.y)*(e.x-t.x)>(e.y-t.y)*(n.x-t.x)}function l(t,e,n,i){return u(t,n,i)!==u(e,n,i)&&u(t,e,n)!==u(t,e,i)}function c(t,e,n){var i=n*n;if(1===e.length)return t.distSqr(e[0])<i;for(var r=1;r<e.length;r++){if(p(t,e[r-1],e[r])<i)return!0}return!1}function p(t,e,n){var i=e.distSqr(n);if(0===i)return t.distSqr(e);var r=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/i;return r<0?t.distSqr(e):r>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(r)._add(e))}function f(t,e){for(var n,i,r,o=!1,a=0;a<t.length;a++){n=t[a];for(var s=0,u=n.length-1;s<n.length;u=s++)i=n[s],r=n[u],i.y>e.y!=r.y>e.y&&e.x<(r.x-i.x)*(e.y-i.y)/(r.y-i.y)+i.x&&(o=!o)}return o}function h(t,e){for(var n=!1,i=0,r=t.length-1;i<t.length;r=i++){var o=t[i],a=t[r];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}t.exports={multiPolygonIntersectsBufferedMultiPoint:i,multiPolygonIntersectsMultiPolygon:r,multiPolygonIntersectsBufferedMultiLine:o}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){if(\\\"object\\\"==typeof t){var i=t;n=e,t=i.angle,e=i.pitch,this.grid=new a(i.grid),this.ignoredGrid=new a(i.ignoredGrid)}else this.grid=new a(o,12,6),this.ignoredGrid=new a(o,12,0);this.angle=t,this.pitch=e;var r=Math.sin(t),s=Math.cos(t);if(this.rotationMatrix=[s,-r,r,s],this.reverseRotationMatrix=[s,r,-r,s],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=n,0===n.length){n.emplaceBack();n.emplaceBack(0,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(o,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,0,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,o,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=n.get(0),this.edges=[n.get(1),n.get(2),n.get(3),n.get(4)]}var r=n(2),o=n(4).EXTENT,a=n(23);t.exports=i,i.prototype.serialize=function(){var t={angle:this.angle,pitch:this.pitch,grid:this.grid.toArrayBuffer(),ignoredGrid:this.ignoredGrid.toArrayBuffer()};return{data:t,transferables:[t.grid,t.ignoredGrid]}},i.prototype.minScale=.25,i.prototype.maxScale=2,i.prototype.placeCollisionFeature=function(t,e,n){for(var i=this.collisionBoxArray,o=this.minScale,a=this.rotationMatrix,s=this.yStretch,u=t.boxStartIndex;u<t.boxEndIndex;u++){var l=i.get(u),c=l.anchorPoint._matMult(a),p=c.x,f=c.y,h=p+l.x1,d=f+l.y1*s,y=p+l.x2,m=f+l.y2*s;if(l.bbox0=h,l.bbox1=d,l.bbox2=y,l.bbox3=m,!e)for(var v=this.grid.query(h,d,y,m),g=0;g<v.length;g++){var x=i.get(v[g]),b=x.anchorPoint._matMult(a);if((o=this.getPlacementScale(o,c,l,b,x))>=this.maxScale)return o}if(n){var w;if(this.angle){var k=this.reverseRotationMatrix,_=new r(l.x1,l.y1).matMult(k),S=new r(l.x2,l.y1).matMult(k),z=new r(l.x1,l.y2).matMult(k),T=new r(l.x2,l.y2).matMult(k);w=this.tempCollisionBox,w.anchorPointX=l.anchorPoint.x,w.anchorPointY=l.anchorPoint.y,w.x1=Math.min(_.x,S.x,z.x,T.x),w.y1=Math.min(_.y,S.x,z.x,T.x),w.x2=Math.max(_.x,S.x,z.x,T.x),w.y2=Math.max(_.y,S.x,z.x,T.x),w.maxScale=l.maxScale}else w=l;for(var j=0;j<this.edges.length;j++){var M=this.edges[j];if((o=this.getPlacementScale(o,l.anchorPoint,w,M.anchorPoint,M))>=this.maxScale)return o}}}return o},i.prototype.queryRenderedSymbols=function(t,e,n,i,o){var a={},s=[],u=this.collisionBoxArray,l=this.rotationMatrix,c=new r(t,e)._matMult(l),p=this.tempCollisionBox;p.anchorX=c.x,p.anchorY=c.y,p.x1=0,p.y1=0,p.x2=n-t,p.y2=i-e,p.maxScale=o,o=p.maxScale;for(var f=[c.x+p.x1/o,c.y+p.y1/o*this.yStretch,c.x+p.x2/o,c.y+p.y2/o*this.yStretch],h=this.grid.query(f[0],f[1],f[2],f[3]),d=this.ignoredGrid.query(f[0],f[1],f[2],f[3]),y=0;y<d.length;y++)h.push(d[y]);for(var m=0;m<h.length;m++){var v=u.get(h[m]),g=v.sourceLayerIndex,x=v.featureIndex;if(void 0===a[g]&&(a[g]={}),!a[g][x]){var b=v.anchorPoint.matMult(l);this.getPlacementScale(this.minScale,c,p,b,v)>=o&&(a[g][x]=!0,s.push(h[m]))}}return s},i.prototype.getPlacementScale=function(t,e,n,i,r){var o=e.x-i.x,a=e.y-i.y,s=(r.x1-n.x2)/o,u=(r.x2-n.x1)/o,l=(r.y1-n.y2)*this.yStretch/a,c=(r.y2-n.y1)*this.yStretch/a;(isNaN(s)||isNaN(u))&&(s=u=1),(isNaN(l)||isNaN(c))&&(l=c=1);var p=Math.min(Math.max(s,u),Math.max(l,c)),f=r.maxScale,h=n.maxScale;return p>f&&(p=f),p>h&&(p=h),p>t&&p>=r.placementScale&&(t=p),t},i.prototype.insertCollisionFeature=function(t,e,n){for(var i=n?this.ignoredGrid:this.grid,r=this.collisionBoxArray,o=t.boxStartIndex;o<t.boxEndIndex;o++){var a=r.get(o);a.placementScale=e,e<this.maxScale&&i.insert(o,a.bbox0,a.bbox1,a.bbox2,a.bbox3)}}},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=t.exports=new i({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int16\\\",name:\\\"x1\\\"},{type:\\\"Int16\\\",name:\\\"y1\\\"},{type:\\\"Int16\\\",name:\\\"x2\\\"},{type:\\\"Int16\\\",name:\\\"y2\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"},{type:\\\"Int16\\\",name:\\\"bbox0\\\"},{type:\\\"Int16\\\",name:\\\"bbox1\\\"},{type:\\\"Int16\\\",name:\\\"bbox2\\\"},{type:\\\"Int16\\\",name:\\\"bbox3\\\"},{type:\\\"Float32\\\",name:\\\"placementScale\\\"}]});r.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=t.exports=new i({members:[{type:\\\"Uint16\\\",name:\\\"textBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"textBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadEndIndex\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int8\\\",name:\\\"index\\\"}]});r.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=n(22).SymbolQuad,s=t.exports=new i({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Float32\\\",name:\\\"tlX\\\"},{type:\\\"Float32\\\",name:\\\"tlY\\\"},{type:\\\"Float32\\\",name:\\\"trX\\\"},{type:\\\"Float32\\\",name:\\\"trY\\\"},{type:\\\"Float32\\\",name:\\\"blX\\\"},{type:\\\"Float32\\\",name:\\\"blY\\\"},{type:\\\"Float32\\\",name:\\\"brX\\\"},{type:\\\"Float32\\\",name:\\\"brY\\\"},{type:\\\"Int16\\\",name:\\\"texH\\\"},{type:\\\"Int16\\\",name:\\\"texW\\\"},{type:\\\"Int16\\\",name:\\\"texX\\\"},{type:\\\"Int16\\\",name:\\\"texY\\\"},{type:\\\"Float32\\\",name:\\\"angle\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Float32\\\",name:\\\"minScale\\\"}]});r.extendAll(s.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)},get SymbolQuad(){return new a(this.anchorPoint,new o(this.tlX,this.tlY),new o(this.trX,this.trY),new o(this.blX,this.blY),new o(this.brX,this.brY),{x:this.texX,y:this.texY,h:this.texH,w:this.texW,height:this.texH,width:this.texW},this.angle,this.minScale,this.maxScale)}})},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.declaration=e,this.startTime=this.endTime=(new Date).getTime(),\\\"piecewise-constant\\\"===t.function&&t.transition?this.interp=r:this.interp=a[t.type],this.oldTransition=n,this.duration=i.duration||0,this.delay=i.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=o.easeCubicInOut),n&&n.endTime<=this.startTime&&delete n.oldTransition}function r(t,e,n){return void 0===(t&&t.to)||void 0===(e&&e.to)?void 0:{from:t.to,fromScale:t.toScale,to:e.to,toScale:e.toScale,t:n}}var o=n(0),a=n(20);t.exports=i,i.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},i.prototype.calculate=function(t,e){var n=this.declaration.calculate(o.extend({},t,{duration:this.duration}),e);if(this.instant())return n;var i=t.time||Date.now();if(i<this.endTime){var r=this.oldTransition.calculate(o.extend({},t,{time:this.startTime}),e),a=this.ease((i-this.startTime-this.delay)/this.duration);n=this.interp(r,n,a)}return n}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.type=t.type,this.transitionable=t.transition,this.value=s.clone(e),this.isFunction=o.isFunctionDefinition(e),this.json=JSON.stringify(this.value);var n=\\\"color\\\"===this.type?a(this.value):e;if(this.calculate=o[t.function||\\\"piecewise-constant\\\"](n),this.isFeatureConstant=this.calculate.isFeatureConstant,this.isZoomConstant=this.calculate.isZoomConstant,\\\"piecewise-constant\\\"===t.function&&t.transition&&(this.calculate=r(this.calculate)),!this.isFeatureConstant&&!this.isZoomConstant){this.stopZoomLevels=[];for(var i=[],u=this.value.stops,l=0;l<this.value.stops.length;l++){var c=u[l][0].zoom;this.stopZoomLevels.indexOf(c)<0&&(this.stopZoomLevels.push(c),i.push([c,i.length]))}this.calculateInterpolationT=o.interpolated({stops:i,base:e.base})}}function r(t){return function(e,n){var i,r,o,a=e.zoom,s=e.zoomHistory,u=e.duration,l=a%1,c=Math.min((Date.now()-s.lastIntegerZoomTime)/u,1),p=1;return a>s.lastIntegerZoom?(i=l+(1-l)*c,p*=2,r=t({zoom:a-1},n),o=t({zoom:a},n)):(i=1-(1-c)*l,o=t({zoom:a},n),r=t({zoom:a+1},n),p/=2),void 0===r||void 0===o?void 0:{from:r,fromScale:p,to:o,toScale:1,t:i}}}var o=n(27),a=n(28),s=n(0);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){var n;if(p(t)){var u,l=t.stops&&\\\"object\\\"==typeof t.stops[0][0],c=l||void 0!==t.property,f=l||!c,h=t.type||e||\\\"exponential\\\";if(\\\"exponential\\\"===h)u=a;else if(\\\"interval\\\"===h)u=o;else if(\\\"categorical\\\"===h)u=r;else{if(\\\"identity\\\"!==h)throw new Error('Unknown function type \\\"'+h+'\\\"');u=s}if(l){for(var d={},y=[],m=0;m<t.stops.length;m++){var v=t.stops[m];void 0===d[v[0].zoom]&&(d[v[0].zoom]={zoom:v[0].zoom,type:t.type,property:t.property,stops:[]}),d[v[0].zoom].stops.push([v[0].value,v[1]])}for(var g in d)y.push([d[g].zoom,i(d[g])]);n=function(e,n){return a({stops:y,base:t.base},e)(e,n)},n.isFeatureConstant=!1,n.isZoomConstant=!1}else f?(n=function(e){return u(t,e)},n.isFeatureConstant=!0,n.isZoomConstant=!1):(n=function(e,n){return u(t,n[t.property])},n.isFeatureConstant=!1,n.isZoomConstant=!0)}else n=function(){return t},n.isFeatureConstant=!0,n.isZoomConstant=!0;return n}function r(t,e){for(var n=0;n<t.stops.length;n++)if(e===t.stops[n][0])return t.stops[n][1];return t.stops[0][1]}function o(t,e){for(var n=0;n<t.stops.length&&!(e<t.stops[n][0]);n++);return t.stops[Math.max(n-1,0)][1]}function a(t,e){for(var n=void 0!==t.base?t.base:1,i=0;;){if(i>=t.stops.length)break;if(e<=t.stops[i][0])break;i++}return 0===i?t.stops[i][1]:i===t.stops.length?t.stops[i-1][1]:u(e,n,t.stops[i-1][0],t.stops[i][0],t.stops[i-1][1],t.stops[i][1])}function s(t,e){return e}function u(t,e,n,i,r,o){return\\\"function\\\"==typeof r?function(){var a=r.apply(void 0,arguments),s=o.apply(void 0,arguments);return u(t,e,n,i,a,s)}:r.length?c(t,e,n,i,r,o):l(t,e,n,i,r,o)}function l(t,e,n,i,r,o){var a,s=i-n,u=t-n;return a=1===e?u/s:(Math.pow(e,u)-1)/(Math.pow(e,s)-1),r*(1-a)+o*a}function c(t,e,n,i,r,o){for(var a=[],s=0;s<r.length;s++)a[s]=l(t,e,n,i,r[s],o[s]);return a}function p(t){return\\\"object\\\"==typeof t&&(t.stops||\\\"identity\\\"===t.type)}t.exports.isFunctionDefinition=p,t.exports.interpolated=function(t){return i(t,\\\"exponential\\\")},t.exports[\\\"piecewise-constant\\\"]=function(t){return i(t,\\\"interval\\\")}},function(t,e,n){\\\"use strict\\\";t.exports=n(81)},function(t,e,n){t.exports=n(82)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8],doc:\\\"Style specification version number. Must be 8.\\\",example:8},name:{type:\\\"string\\\",doc:\\\"A human-readable name for the style.\\\",example:\\\"Bright\\\"},metadata:{type:\\\"*\\\",doc:\\\"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\\\"},center:{type:\\\"array\\\",value:\\\"number\\\",doc:\\\"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:[-73.9749,40.7736]},zoom:{type:\\\"number\\\",doc:\\\"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:12.5},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",doc:\\\"Default bearing, in degrees clockwise from true north.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:29},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\",doc:\\\"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:50},light:{type:\\\"light\\\",doc:\\\"The global light source.\\\",example:{anchor:\\\"viewport\\\",color:\\\"white\\\",intensity:.4}},sources:{required:!0,type:\\\"sources\\\",doc:\\\"Data source specifications.\\\",example:{\\\"mapbox-streets\\\":{type:\\\"vector\\\",url:\\\"mapbox://mapbox.mapbox-streets-v6\\\"}}},sprite:{type:\\\"string\\\",doc:\\\"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties.\\\",example:\\\"mapbox://sprites/mapbox/bright-v8\\\"},glyphs:{type:\\\"string\\\",doc:\\\"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property.\\\",example:\\\"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\\\"},transition:{type:\\\"transition\\\",doc:\\\"A global transition definition to use as a default across properties.\\\",example:{duration:300,delay:0}},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\",doc:\\\"Layers will be drawn in the order of this array.\\\",example:[{id:\\\"water\\\",source:\\\"mapbox-streets\\\",\\\"source-layer\\\":\\\"water\\\",type:\\\"fill\\\",paint:{\\\"fill-color\\\":\\\"#00ffff\\\"}}]}},sources:{\\\"*\\\":{type:\\\"source\\\",doc:\\\"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:{vector:{doc:\\\"A vector tile source.\\\"},raster:{doc:\\\"A raster tile source.\\\"}},doc:\\\"The data type of the tile source.\\\"},url:{type:\\\"string\\\",doc:\\\"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`.\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\",doc:\\\"An array of one or more tile source URLs, as in the TileJSON spec.\\\"},minzoom:{type:\\\"number\\\",default:0,doc:\\\"Minimum zoom level for which tiles are available, as in the TileJSON spec.\\\"},maxzoom:{type:\\\"number\\\",default:22,doc:\\\"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\\\"},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\",doc:\\\"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\\\"},\\\"*\\\":{type:\\\"*\\\",doc:\\\"Other keys to configure the data source.\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:{geojson:{doc:\\\"A GeoJSON data source.\\\"}},doc:\\\"The data type of the GeoJSON source.\\\"},data:{type:\\\"*\\\",doc:\\\"A URL to a GeoJSON file, or inline GeoJSON.\\\"},maxzoom:{type:\\\"number\\\",default:18,doc:\\\"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\\\"},buffer:{type:\\\"number\\\",default:128,maximum:512,minimum:0,doc:\\\"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\\\"},tolerance:{type:\\\"number\\\",default:.375,doc:\\\"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\\\"},cluster:{type:\\\"boolean\\\",default:!1,doc:\\\"If the data is a collection of point features, setting this to true clusters the points by radius into groups.\\\"},clusterRadius:{type:\\\"number\\\",default:50,minimum:0,doc:\\\"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\\\"},clusterMaxZoom:{type:\\\"number\\\",doc:\\\"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered).\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:{video:{doc:\\\"A video data source.\\\"}},doc:\\\"The data type of the video source.\\\"},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\",doc:\\\"URLs to video content in order of preferred format.\\\"},coordinates:{required:!0,doc:\\\"Corners of video specified in longitude, latitude pairs.\\\",type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\",doc:\\\"A single longitude, latitude pair.\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:{image:{doc:\\\"An image data source.\\\"}},doc:\\\"The data type of the image source.\\\"},url:{required:!0,type:\\\"string\\\",doc:\\\"URL that points to an image.\\\"},coordinates:{required:!0,doc:\\\"Corners of image specified in longitude, latitude pairs.\\\",type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\",doc:\\\"A single longitude, latitude pair.\\\"}}},layer:{id:{type:\\\"string\\\",doc:\\\"Unique layer name.\\\",required:!0},type:{type:\\\"enum\\\",values:{fill:{doc:\\\"A filled polygon with an optional stroked border.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},line:{doc:\\\"A stroked line.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},symbol:{doc:\\\"An icon or a text label.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},circle:{doc:\\\"A filled circle.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-extrusion\\\":{doc:\\\"An extruded (3D) polygon.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},raster:{doc:\\\"Raster map textures such as satellite imagery.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},background:{doc:\\\"The background color or pattern of the map.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},doc:\\\"Rendering type of this layer.\\\"},metadata:{type:\\\"*\\\",doc:\\\"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\\\"},ref:{type:\\\"string\\\",doc:\\\"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient.\\\"},source:{type:\\\"string\\\",doc:\\\"Name of a source description to be used for this layer.\\\"},\\\"source-layer\\\":{type:\\\"string\\\",doc:\\\"Layer to use from a vector tile source. Required if the source supports multiple layers.\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:24,doc:\\\"The minimum zoom level on which the layer gets parsed and appears on.\\\"},maxzoom:{type:\\\"number\\\",minimum:0,maximum:24,doc:\\\"The maximum zoom level on which the layer gets parsed and appears on.\\\"},filter:{type:\\\"filter\\\",doc:\\\"A expression specifying conditions on source features. Only features that match the filter are displayed.\\\"},layout:{type:\\\"layout\\\",doc:\\\"Layout properties for the layer.\\\"},paint:{type:\\\"paint\\\",doc:\\\"Default paint properties for this layer.\\\"},\\\"paint.*\\\":{type:\\\"paint\\\",doc:\\\"[Deprecated] Class-specific paint properties for this layer. The class name is the part after the first dot. Note: class-specific paint properties are deprecated and will be removed in the next version of this spec.\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_fill-extrusion\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_fill:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_circle:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},\\\"layout_fill-extrusion\\\":{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{butt:{doc:\\\"A cap with a squared-off end which is drawn to the exact endpoint of the line.\\\"},round:{doc:\\\"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\\\"},square:{doc:\\\"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\\\"}},default:\\\"butt\\\",doc:\\\"The display of line endings.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{bevel:{doc:\\\"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\\\"},round:{doc:\\\"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\\\"},miter:{doc:\\\"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\\\"}},default:\\\"miter\\\",doc:\\\"The display of lines when joining.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Used to automatically convert miter joins to bevel joins for sharp angles.\\\",requires:[{\\\"line-join\\\":\\\"miter\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Used to automatically convert round joins to miter joins for shallow angles.\\\",requires:[{\\\"line-join\\\":\\\"round\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{point:{doc:\\\"The label is placed at the point where the geometry is located.\\\"},line:{doc:\\\"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\\\"}},default:\\\"point\\\",doc:\\\"Label placement relative to its geometry.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",doc:\\\"Distance between two symbol anchors.\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the icon will be visible even if it collides with other previously drawn symbols.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, other symbols can be visible even if they collide with the icon.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line`, aligns icon x-axes with the line.\\\"},viewport:{doc:\\\"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\\\"},auto:{doc:\\\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\\\"}},default:\\\"auto\\\",doc:\\\"In combination with `symbol-placement`, determines the rotation behavior of icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Scale factor for icon. 1 is original size, 3 triples the size.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{doc:\\\"The icon is displayed at its intrinsic aspect ratio.\\\"},width:{doc:\\\"The icon is scaled in the x-dimension to fit the width of the text.\\\"},height:{doc:\\\"The icon is scaled in the y-dimension to fit the height of the text.\\\"},both:{doc:\\\"The icon is scaled in both x- and y-dimensions.\\\"}},default:\\\"none\\\",doc:\\\"Scales the icon to fit around the associated text.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\",{\\\"icon-text-fit\\\":[\\\"both\\\",\\\"width\\\",\\\"height\\\"]}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,doc:\\\"A string with {tokens} replaced, referencing the data property to pull from.\\\",tokens:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",doc:\\\"Rotates the icon clockwise.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.21.0\\\"}}},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",doc:\\\"Size of the additional area around the icon bounding box used for detecting symbol collisions.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the icon may be flipped to prevent it from being rendered upside-down.\\\",requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,doc:\\\"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The text is aligned to the plane of the map.\\\"},viewport:{doc:\\\"The text is aligned to the plane of the viewport.\\\"},auto:{doc:\\\"Automatically matches the value of `text-rotation-alignment`.\\\"}},default:\\\"auto\\\",doc:\\\"Orientation of text when map is pitched.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line`, aligns text x-axes with the line.\\\"},viewport:{doc:\\\"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\\\"},auto:{doc:\\\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\\\"}},default:\\\"auto\\\",doc:\\\"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:\\\"\\\",tokens:!0,doc:\\\"Value to use for a text label. Feature properties are specified using tokens like {field_name}.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],doc:\\\"Font stack to use for displaying text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Font size.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"The maximum line width for text wrapping.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Text leading value for multi-line text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Text tracking amount.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{left:{doc:\\\"The text is aligned to the left.\\\"},center:{doc:\\\"The text is centered.\\\"},right:{doc:\\\"The text is aligned to the right.\\\"}},default:\\\"center\\\",doc:\\\"Text justification options.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{center:{doc:\\\"The center of the text is placed closest to the anchor.\\\"},left:{doc:\\\"The left side of the text is placed closest to the anchor.\\\"},right:{doc:\\\"The right side of the text is placed closest to the anchor.\\\"},top:{doc:\\\"The top of the text is placed closest to the anchor.\\\"},bottom:{doc:\\\"The bottom of the text is placed closest to the anchor.\\\"},\\\"top-left\\\":{doc:\\\"The top left corner of the text is placed closest to the anchor.\\\"},\\\"top-right\\\":{doc:\\\"The top right corner of the text is placed closest to the anchor.\\\"},\\\"bottom-left\\\":{doc:\\\"The bottom left corner of the text is placed closest to the anchor.\\\"},\\\"bottom-right\\\":{doc:\\\"The bottom right corner of the text is placed closest to the anchor.\\\"}},default:\\\"center\\\",doc:\\\"Part of the text placed closest to the anchor.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Maximum angle change between adjacent characters.\\\",requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Rotates the text clockwise.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Size of the additional area around the text bounding box used for detecting symbol collisions.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,doc:\\\"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\\\",requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{doc:\\\"The text is not altered.\\\"},uppercase:{doc:\\\"Forces all letters to be displayed in uppercase.\\\"},lowercase:{doc:\\\"Forces all letters to be displayed in lowercase.\\\"}},default:\\\"none\\\",doc:\\\"Specifies how to capitalize text, similar to the CSS `text-transform` property.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-offset\\\":{type:\\\"array\\\",doc:\\\"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the text will be visible even if it collides with other previously drawn symbols.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, other symbols can be visible even if they collide with the text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\\\",requires:[\\\"text-field\\\",\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_raster:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},filter:{type:\\\"array\\\",value:\\\"*\\\",doc:\\\"A filter selects specific features from a layer.\\\"},filter_operator:{type:\\\"enum\\\",values:{\\\"==\\\":{doc:'`[\\\"==\\\", key, value]` equality: `feature[key] = value`'},\\\"!=\\\":{doc:'`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`'},\\\">\\\":{doc:'`[\\\">\\\", key, value]` greater than: `feature[key] > value`'},\\\">=\\\":{doc:'`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`'},\\\"<\\\":{doc:'`[\\\"<\\\", key, value]` less than: `feature[key] < value`'},\\\"<=\\\":{doc:'`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`'},in:{doc:'`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`'},\\\"!in\\\":{doc:'`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`'},all:{doc:'`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`'},any:{doc:'`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`'},none:{doc:'`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`'},has:{doc:'`[\\\"has\\\", key]` `feature[key]` exists'},\\\"!has\\\":{doc:'`[\\\"!has\\\", key]` `feature[key]` does not exist'}},doc:\\\"The filter operator.\\\"},geometry_type:{type:\\\"enum\\\",values:{Point:{doc:\\\"Filter to point geometries.\\\"},LineString:{doc:\\\"Filter to line geometries.\\\"},Polygon:{doc:\\\"Filter to polygon geometries.\\\"}},doc:\\\"The geometry type for the filter to select.\\\"},function:{stops:{type:\\\"array\\\",doc:\\\"An array of stops.\\\",value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0,doc:\\\"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\\\"},property:{type:\\\"string\\\",doc:\\\"The name of a feature property to use as the function input.\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:{identity:{doc:\\\"Return the input value as the output value.\\\"},exponential:{doc:\\\"Generate an output by interpolating between stops just less than and just greater than the function input.\\\"},interval:{doc:\\\"Return the output value of the stop just less than the function input.\\\"},categorical:{doc:\\\"Return the output value of the stop equal to the function input.\\\"}},doc:\\\"The interpolation strategy to use in function evaluation.\\\",default:\\\"exponential\\\"},colorSpace:{type:\\\"enum\\\",values:{rgb:{doc:\\\"Use the RGB color space to interpolate color values\\\"},lab:{doc:\\\"Use the LAB color space to interpolate color values.\\\"},hcl:{doc:\\\"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\\\"}},doc:\\\"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\\\",default:\\\"rgb\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2,doc:\\\"Zoom level and value pair.\\\"},light:{anchor:{type:\\\"enum\\\",default:\\\"viewport\\\",values:{map:{doc:\\\"The position of the light source is aligned to the rotation of the map.\\\"},viewport:{doc:\\\"The position of the light source is aligned to the rotation of the viewport.\\\"}},transition:!1,doc:\\\"Whether extruded geometries are lit relative to the map or viewport.\\\",example:\\\"map\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},position:{type:\\\"array\\\",default:[1.15,210,30],length:3,value:\\\"number\\\",transition:!0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,doc:\\\"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\\\",example:[1.5,90,80],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},color:{type:\\\"color\\\",default:\\\"#ffffff\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0,doc:\\\"Color tint for lighting extruded geometries.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},intensity:{type:\\\"number\\\",default:.5,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0,doc:\\\"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}}},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_fill-extrusion\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,doc:\\\"Whether or not the fill should be antialiased.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,doc:\\\"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.21.0\\\"}}},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.19.0\\\"}}},\\\"fill-outline-color\\\":{type:\\\"color\\\",doc:\\\"The outline color of the fill. Matches the value of `fill-color` if unspecified.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.19.0\\\"}}},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The fill is translated relative to the map.\\\"},viewport:{doc:\\\"The fill is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"fill-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},\\\"paint_fill-extrusion\\\":{\\\"fill-extrusion-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,default:1,minimum:0,maximum:1,doc:\\\"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-extrusion-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The fill extrusion is translated relative to the map.\\\"},viewport:{doc:\\\"The fill extrusion is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"fill-extrusion-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-height\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",doc:\\\"The height with which to extrude this layer.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-base\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",doc:\\\"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\\\",transition:!0,requires:[\\\"fill-extrusion-height\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the line will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-color\\\":{type:\\\"color\\\",doc:\\\"The color with which the line will be drawn.\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.23.0\\\"}}},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The line is translated relative to the map.\\\"},viewport:{doc:\\\"The line is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"line-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Stroke thickness.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,doc:\\\"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-offset\\\":{type:\\\"number\\\",default:0,doc:\\\"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.12.1\\\",ios:\\\"3.1.0\\\",android:\\\"3.0.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Blur applied to the line, in pixels.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,doc:\\\"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.\\\",minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Circle radius.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.18.0\\\"}}},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The fill color of the circle.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.18.0\\\"}}},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,doc:\\\"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.20.0\\\"}}},\\\"circle-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the circle will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.20.0\\\"}}},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The circle is translated relative to the map.\\\"},viewport:{doc:\\\"The circle is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"circle-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"Circles are scaled according to their apparent distance to the camera.\\\"},viewport:{doc:\\\"Circles are not scaled.\\\"}},default:\\\"map\\\",doc:\\\"Controls the scaling behavior of the circle when the map is pitched.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"circle-stroke-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"circle-stroke-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The stroke color of the circle.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"circle-stroke-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity of the circle's stroke.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}}},paint_symbol:{\\\"icon-opacity\\\":{doc:\\\"The opacity at which the icon will be drawn.\\\",type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the icon. This can only be used with sdf icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the icon's halo. Icon halos can only be used with SDF icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance of halo to the icon outline.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Fade out the halo towards the outside.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"Icons are translated relative to the map.\\\"},viewport:{doc:\\\"Icons are translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the text will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-color\\\":{type:\\\"color\\\",doc:\\\"The color with which the text will be drawn.\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the text's halo, which helps it stand out from backgrounds.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The halo's fadeout distance towards the outside.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The text is translated relative to the map.\\\"},viewport:{doc:\\\"The text is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the image will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\",doc:\\\"Rotates hues around the color wheel.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Increase or reduce the brightness of the image. The value is the minimum brightness.\\\",default:0,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Increase or reduce the brightness of the image. The value is the maximum brightness.\\\",default:1,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-saturation\\\":{type:\\\"number\\\",doc:\\\"Increase or reduce the saturation of the image.\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-contrast\\\":{type:\\\"number\\\",doc:\\\"Increase or reduce the contrast of the image.\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\",doc:\\\"Fade duration when a new tile is added.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The color with which the background will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,doc:\\\"The opacity at which the background will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\",doc:\\\"Time allotted for transitions to complete.\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\",doc:\\\"Length of time before a transition begins.\\\"}}}},function(t,e,n){\\\"use strict\\\";t.exports=n(84),t.exports.emitErrors=function(t,e){if(e&&e.length){for(var n=0;n<e.length;n++)t.fire(\\\"error\\\",{error:new Error(e[n].message)});return!0}return!1},t.exports.throwErrors=function(t,e){if(e)for(var n=0;n<e.length;n++)throw new Error(e[n].message)}},function(t,e,n){\\\"use strict\\\";function i(t,e){e=e||u;var n=[];return n=n.concat(s({key:\\\"\\\",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:l,\\\"*\\\":function(){return[]}}})),e.$version>7&&t.constants&&(n=n.concat(a({key:\\\"constants\\\",value:t.constants,style:t,styleSpec:e}))),r(n)}function r(t){return[].concat(t).sort(function(t,e){return t.line-e.line})}function o(t){return function(){return r(t.apply(this,arguments))}}var a=n(30),s=n(6),u=n(87),l=n(89);i.source=o(n(38)),i.light=o(n(39)),i.layer=o(n(35)),i.filter=o(n(15)),i.paintProperty=o(n(36)),i.layoutProperty=o(n(37)),t.exports=i},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.value,n=t.key,o=i(e);return\\\"boolean\\\"!==o?[new r(n,e,\\\"boolean expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(29).parseCSSColor;t.exports=function(t){var e=t.key,n=t.value,a=r(n);return\\\"string\\\"!==a?[new i(e,n,\\\"color expected, %s found\\\",a)]:null===o(n)?[new i(e,n,'color expected, \\\"%s\\\" found',n)]:[]}},function(t,e,n){t.exports=n(88)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8]},name:{type:\\\"string\\\"},metadata:{type:\\\"*\\\"},center:{type:\\\"array\\\",value:\\\"number\\\"},zoom:{type:\\\"number\\\"},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\"},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\"},light:{type:\\\"light\\\"},sources:{required:!0,type:\\\"sources\\\"},sprite:{type:\\\"string\\\"},glyphs:{type:\\\"string\\\"},transition:{type:\\\"transition\\\"},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\"}},sources:{\\\"*\\\":{type:\\\"source\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:{vector:{},raster:{}}},url:{type:\\\"string\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\"},minzoom:{type:\\\"number\\\",default:0},maxzoom:{type:\\\"number\\\",default:22},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\"},\\\"*\\\":{type:\\\"*\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:{geojson:{}}},data:{type:\\\"*\\\"},maxzoom:{type:\\\"number\\\",default:18},buffer:{type:\\\"number\\\",default:128,maximum:512,minimum:0},tolerance:{type:\\\"number\\\",default:.375},cluster:{type:\\\"boolean\\\",default:!1},clusterRadius:{type:\\\"number\\\",default:50,minimum:0},clusterMaxZoom:{type:\\\"number\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:{video:{}}},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:{image:{}}},url:{required:!0,type:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},layer:{id:{type:\\\"string\\\",required:!0},type:{type:\\\"enum\\\",values:{fill:{},line:{},symbol:{},circle:{},\\\"fill-extrusion\\\":{},raster:{},background:{}}},metadata:{type:\\\"*\\\"},ref:{type:\\\"string\\\"},source:{type:\\\"string\\\"},\\\"source-layer\\\":{type:\\\"string\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:24},maxzoom:{type:\\\"number\\\",minimum:0,maximum:24},filter:{type:\\\"filter\\\"},layout:{type:\\\"layout\\\"},paint:{type:\\\"paint\\\"},\\\"paint.*\\\":{type:\\\"paint\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_fill-extrusion\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_fill:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_circle:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},\\\"layout_fill-extrusion\\\":{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{butt:{},round:{},square:{}},default:\\\"butt\\\"},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{bevel:{},round:{},miter:{}},default:\\\"miter\\\"},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[{\\\"line-join\\\":\\\"miter\\\"}]},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[{\\\"line-join\\\":\\\"round\\\"}]},visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{point:{},line:{}},default:\\\"point\\\"},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"icon-image\\\"]},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{},width:{},height:{},both:{}},default:\\\"none\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"icon-image\\\",\\\"text-field\\\",{\\\"icon-text-fit\\\":[\\\"both\\\",\\\"width\\\",\\\"height\\\"]}]},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,tokens:!0},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",requires:[\\\"icon-image\\\"]},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"text-field\\\"]},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"text-field\\\"]},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:\\\"\\\",tokens:!0},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],requires:[\\\"text-field\\\"]},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{left:{},center:{},right:{}},default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{center:{},left:{},right:{},top:{},bottom:{},\\\"top-left\\\":{},\\\"top-right\\\":{},\\\"bottom-left\\\":{},\\\"bottom-right\\\":{}},default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{},uppercase:{},lowercase:{}},default:\\\"none\\\",requires:[\\\"text-field\\\"]},\\\"text-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"]},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\",\\\"icon-image\\\"]},visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_raster:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},filter:{type:\\\"array\\\",value:\\\"*\\\"},filter_operator:{type:\\\"enum\\\",values:{\\\"==\\\":{},\\\"!=\\\":{},\\\">\\\":{},\\\">=\\\":{},\\\"<\\\":{},\\\"<=\\\":{},in:{},\\\"!in\\\":{},all:{},any:{},none:{},has:{},\\\"!has\\\":{}}},geometry_type:{type:\\\"enum\\\",values:{Point:{},LineString:{},Polygon:{}}},function:{stops:{type:\\\"array\\\",value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0},property:{type:\\\"string\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:{identity:{},exponential:{},interval:{},categorical:{}},default:\\\"exponential\\\"},colorSpace:{type:\\\"enum\\\",values:{rgb:{},lab:{},hcl:{}},default:\\\"rgb\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2},light:{anchor:{type:\\\"enum\\\",default:\\\"viewport\\\",values:{map:{},viewport:{}},transition:!1},position:{type:\\\"array\\\",default:[1.15,210,30],length:3,value:\\\"number\\\",transition:!0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1},color:{type:\\\"color\\\",default:\\\"#ffffff\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0},intensity:{type:\\\"number\\\",default:.5,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0}},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_fill-extrusion\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}]},\\\"fill-outline-color\\\":{type:\\\"color\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}]},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"fill-translate\\\"]},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0}},\\\"paint_fill-extrusion\\\":{\\\"fill-extrusion-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-extrusion-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-extrusion-pattern\\\"}]},\\\"fill-extrusion-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-extrusion-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"fill-extrusion-translate\\\"]},\\\"fill-extrusion-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"fill-extrusion-height\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",transition:!0},\\\"fill-extrusion-base\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",transition:!0,requires:[\\\"fill-extrusion-height\\\"]}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"line-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"line-translate\\\"]},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-offset\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"circle-translate\\\"]},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\"},\\\"circle-stroke-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-stroke-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-stroke-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_symbol:{\\\"icon-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"]},\\\"text-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"]}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\"},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:0,minimum:0,maximum:1,transition:!0},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"raster-saturation\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-contrast\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\"}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}]},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\"}}}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(40);t.exports=function(t){var e=t.value,n=t.key,o=r(t);return o.length?o:(-1===e.indexOf(\\\"{fontstack}\\\")&&o.push(new i(n,e,'\\\"glyphs\\\" url must include a \\\"{fontstack}\\\" token')),-1===e.indexOf(\\\"{range}\\\")&&o.push(new i(n,e,'\\\"glyphs\\\" url must include a \\\"{range}\\\" token')),o)}},function(t,e,n){\\\"use strict\\\";var i=n(0),r={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var n=this._events[t].indexOf(e);n>=0&&this._events[t].splice(n,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var n=function(i){this.off(t,n),e.call(this,i)}.bind(this);return this.on(t,n),this},fire:function(t,e){if(!this.listens(t))return this;e=i.extend({},e),i.extend(e,{type:t,target:this});for(var n=this._events[t].slice(),r=0;r<n.length;r++)n[r].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};t.exports=r},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);i.prototype=r.inherit(o,{getPaintValue:function(t,e,n){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValue.call(this,\\\"fill-color\\\",e,n):o.prototype.getPaintValue.call(this,t,e,n)},getPaintValueStopZoomLevels:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValueStopZoomLevels.call(this,\\\"fill-color\\\"):o.prototype.getPaintValueStopZoomLevels.call(this,arguments)},getPaintInterpolationT:function(t,e){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintInterpolationT.call(this,\\\"fill-color\\\",e):o.prototype.getPaintInterpolationT.call(this,t,e)},isPaintValueFeatureConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueFeatureConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueFeatureConstant.call(this,t)},isPaintValueZoomConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueZoomConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueZoomConstant.call(this,t)}}),t.exports=i},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{getPaintValue:function(t,e,n){var i=o.prototype.getPaintValue.apply(this,arguments);if(i&&\\\"line-dasharray\\\"===t){var r=Math.floor(e.zoom);this._flooredZoom!==r&&(this._flooredZoom=r,this._flooredLineWidth=this.getPaintValue(\\\"line-width\\\",e,n)),i.fromScale*=this._flooredLineWidth,i.toScale*=this._flooredLineWidth}return i}})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{isHidden:function(){if(o.prototype.isHidden.apply(this,arguments))return!0;var t=0===this.paint[\\\"text-opacity\\\"]||!this.layout[\\\"text-field\\\"],e=0===this.paint[\\\"icon-opacity\\\"]||!this.layout[\\\"icon-image\\\"];return!(!t||!e)},getLayoutValue:function(t,e,n){return(\\\"text-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"text-rotation-alignment\\\"))&&(\\\"icon-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"icon-rotation-alignment\\\"))?o.prototype.getLayoutValue.apply(this,arguments):\\\"map\\\"}})},function(t,e,n){\\\"use strict\\\";function i(t){var e=document.createElement(\\\"a\\\");return e.href=t,e.protocol===document.location.protocol&&e.host===document.location.host}e.getJSON=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.setRequestHeader(\\\"Accept\\\",\\\"application/json\\\"),n.onerror=function(t){e(t)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var t;try{t=JSON.parse(n.response)}catch(t){return e(t)}e(null,t)}else e(new Error(n.statusText))},n.send(),n},e.getArrayBuffer=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.responseType=\\\"arraybuffer\\\",n.onerror=function(t){e(t)},n.onload=function(){n.status>=200&&n.status<300&&n.response?e(null,n.response):e(new Error(n.statusText))},n.send(),n},e.getImage=function(t,n){return e.getArrayBuffer(t,function(t,e){if(t)return n(t);var i=new Image;i.onload=function(){n(null,i),(window.URL||window.webkitURL).revokeObjectURL(i.src)};var r=new Blob([new Uint8Array(e)],{type:\\\"image/png\\\"});return i.src=(window.URL||window.webkitURL).createObjectURL(r),i.getData=function(){var t=document.createElement(\\\"canvas\\\"),e=t.getContext(\\\"2d\\\");return t.width=i.width,t.height=i.height,e.drawImage(i,0,0),e.getImageData(0,0,i.width,i.height).data},i})},e.getVideo=function(t,e){var n=document.createElement(\\\"video\\\");n.onloadstart=function(){e(null,n)};for(var r=0;r<t.length;r++){var o=document.createElement(\\\"source\\\");i(t[r])||(n.crossOrigin=\\\"Anonymous\\\"),o.src=t[r],n.appendChild(o)}return n.getData=function(){return n},n}},function(t,e,n){\\\"use strict\\\";function i(t){return new r(t)}function r(t){this.options=h(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function o(t,e,n,i,r){return{x:t,y:e,zoom:1/0,id:i,properties:r,parentId:-1,numPoints:n}}function a(t,e){var n=t.geometry.coordinates;return{x:l(n[0]),y:c(n[1]),zoom:1/0,id:e,parentId:-1}}function s(t){return{type:\\\"Feature\\\",properties:u(t),geometry:{type:\\\"Point\\\",coordinates:[p(t.x),f(t.y)]}}}function u(t){var e=t.numPoints,n=e>=1e4?Math.round(e/1e3)+\\\"k\\\":e>=1e3?Math.round(e/100)/10+\\\"k\\\":e;return h(h({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:n})}function l(t){return t/360+.5}function c(t){var e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){return 360*(t-.5)}function f(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function h(t,e){for(var n in e)t[n]=e[n];return t}function d(t){return t.x}function y(t){return t.y}var m=n(99);t.exports=i,r.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,initial:function(){return{}},map:function(t){return t}},load:function(t){var e=this.options.log;e&&console.time(\\\"total time\\\");var n=\\\"prepare \\\"+t.length+\\\" points\\\";e&&console.time(n),this.points=t;var i=t.map(a);e&&console.timeEnd(n);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var o=+Date.now();this.trees[r+1]=m(i,d,y,this.options.nodeSize,Float32Array),i=this._cluster(i,r),e&&console.log(\\\"z%d: %d clusters in %dms\\\",r,i.length,+Date.now()-o)}return this.trees[this.options.minZoom]=m(i,d,y,this.options.nodeSize,Float32Array),e&&console.timeEnd(\\\"total time\\\"),this},getClusters:function(t,e){for(var n=this.trees[this._limitZoom(e)],i=n.range(l(t[0]),c(t[3]),l(t[2]),c(t[1])),r=[],o=0;o<i.length;o++){var a=n.points[i[o]];r.push(a.numPoints?s(a):this.points[a.id])}return r},getChildren:function(t,e){for(var n=this.trees[e+1].points[t],i=this.options.radius/(this.options.extent*Math.pow(2,e)),r=this.trees[e+1].within(n.x,n.y,i),o=[],a=0;a<r.length;a++){var u=this.trees[e+1].points[r[a]];u.parentId===t&&o.push(u.numPoints?s(u):this.points[u.id])}return o},getLeaves:function(t,e,n,i){n=n||10,i=i||0;var r=[];return this._appendLeaves(r,t,e,n,i,0),r},getTile:function(t,e,n){var i=this.trees[this._limitZoom(t)],r=Math.pow(2,t),o=this.options.extent,a=this.options.radius,s=a/o,u=(n-s)/r,l=(n+1+s)/r,c={features:[]};return this._addTileFeatures(i.range((e-s)/r,u,(e+1+s)/r,l),i.points,e,n,r,c),0===e&&this._addTileFeatures(i.range(1-s/r,u,1,l),i.points,r,n,r,c),e===r-1&&this._addTileFeatures(i.range(0,u,s/r,l),i.points,-1,n,r,c),c.features.length?c:null},getClusterExpansionZoom:function(t,e){for(;e<this.options.maxZoom;){var n=this.getChildren(t,e);if(e++,1!==n.length)break;t=n[0].properties.cluster_id}return e},_appendLeaves:function(t,e,n,i,r,o){for(var a=this.getChildren(e,n),s=0;s<a.length;s++){var u=a[s].properties;if(u.cluster?o+u.point_count<=r?o+=u.point_count:o=this._appendLeaves(t,u.cluster_id,n+1,i,r,o):o<r?o++:t.push(a[s]),t.length===i)break}return o},_addTileFeatures:function(t,e,n,i,r,o){for(var a=0;a<t.length;a++){var s=e[t[a]];o.features.push({type:1,geometry:[[Math.round(this.options.extent*(s.x*r-n)),Math.round(this.options.extent*(s.y*r-i))]],tags:s.numPoints?u(s):this.points[s.id].properties})}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var n=[],i=this.options.radius/(this.options.extent*Math.pow(2,e)),r=0;r<t.length;r++){var a=t[r];if(!(a.zoom<=e)){a.zoom=e;var s=this.trees[e+1],u=s.within(a.x,a.y,i),l=a.numPoints||1,c=a.x*l,p=a.y*l,f=null;this.options.reduce&&(f=this.options.initial(),this._accumulate(f,a));for(var h=0;h<u.length;h++){var d=s.points[u[h]];if(e<d.zoom){var y=d.numPoints||1;d.zoom=e,c+=d.x*y,p+=d.y*y,l+=y,d.parentId=r,this.options.reduce&&this._accumulate(f,d)}}1===l?n.push(a):(a.parentId=r,n.push(o(c/l,p/l,l,r,f)))}}return n},_accumulate:function(t,e){var n=e.numPoints?e.properties:this.options.map(this.points[e.id].properties);this.options.reduce(t,n)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){return new r(t,e,n,i,o)}function r(t,e,n,i,r){e=e||o,n=n||a,r=r||Array,this.nodeSize=i||64,this.points=t,this.ids=new r(t.length),this.coords=new r(2*t.length);for(var u=0;u<t.length;u++)this.ids[u]=u,this.coords[2*u]=e(t[u]),this.coords[2*u+1]=n(t[u]);s(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function o(t){return t[0]}function a(t){return t[1]}var s=n(100),u=n(101),l=n(102);t.exports=i,r.prototype={range:function(t,e,n,i){return u(this.ids,this.coords,t,e,n,i,this.nodeSize)},within:function(t,e,n){return l(this.ids,this.coords,t,e,n,this.nodeSize)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,o,a,s){if(!(a-o<=n)){var u=Math.floor((o+a)/2);r(t,e,u,o,a,s%2),i(t,e,n,o,u-1,s+1),i(t,e,n,u+1,a,s+1)}}function r(t,e,n,i,a,s){for(;a>i;){if(a-i>600){var u=a-i+1,l=n-i+1,c=Math.log(u),p=.5*Math.exp(2*c/3),f=.5*Math.sqrt(c*p*(u-p)/u)*(l-u/2<0?-1:1);r(t,e,n,Math.max(i,Math.floor(n-l*p/u+f)),Math.min(a,Math.floor(n+(u-l)*p/u+f)),s)}var h=e[2*n+s],d=i,y=a;for(o(t,e,i,n),e[2*a+s]>h&&o(t,e,i,a);d<y;){for(o(t,e,d,y),d++,y--;e[2*d+s]<h;)d++;for(;e[2*y+s]>h;)y--}e[2*i+s]===h?o(t,e,i,y):(y++,o(t,e,y,a)),y<=n&&(i=y+1),n<=y&&(a=y-1)}}function o(t,e,n,i){a(t,n,i),a(e,2*n,2*i),a(e,2*n+1,2*i+1)}function a(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a){for(var s,u,l=[0,t.length-1,0],c=[];l.length;){var p=l.pop(),f=l.pop(),h=l.pop();if(f-h<=a)for(var d=h;d<=f;d++)s=e[2*d],u=e[2*d+1],s>=n&&s<=r&&u>=i&&u<=o&&c.push(t[d]);else{var y=Math.floor((h+f)/2);s=e[2*y],u=e[2*y+1],s>=n&&s<=r&&u>=i&&u<=o&&c.push(t[y]);var m=(p+1)%2;(0===p?n<=s:i<=u)&&(l.push(h),l.push(y-1),l.push(m)),(0===p?r>=s:o>=u)&&(l.push(y+1),l.push(f),l.push(m))}}return c}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a){for(var s=[0,t.length-1,0],u=[],l=o*o;s.length;){var c=s.pop(),p=s.pop(),f=s.pop();if(p-f<=a)for(var h=f;h<=p;h++)r(e[2*h],e[2*h+1],n,i)<=l&&u.push(t[h]);else{var d=Math.floor((f+p)/2),y=e[2*d],m=e[2*d+1];r(y,m,n,i)<=l&&u.push(t[d]);var v=(c+1)%2;(0===c?n-o<=y:i-o<=m)&&(s.push(f),s.push(d-1),s.push(v)),(0===c?n+o>=y:i+o>=m)&&(s.push(d+1),s.push(p),s.push(v))}}return u}function r(t,e,n,i){var r=t-n,o=e-i;return r*r+o*o}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){return new r(t,e)}function r(t,e){e=this.options=u(Object.create(this.options),e);var n=e.debug;n&&console.time(\\\"preprocess data\\\");var i=1<<e.maxZoom,r=c(t,e.tolerance/(i*e.extent));this.tiles={},this.tileCoords=[],n&&(console.timeEnd(\\\"preprocess data\\\"),console.log(\\\"index: maxZoom: %d, maxPoints: %d\\\",e.indexMaxZoom,e.indexMaxPoints),console.time(\\\"generate tiles\\\"),this.stats={},this.total=0),r=h(r,e.buffer/e.extent,a),r.length&&this.splitTile(r,0,0,0),n&&(r.length&&console.log(\\\"features: %d, points: %d\\\",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd(\\\"generate tiles\\\"),console.log(\\\"tiles generated:\\\",this.total,JSON.stringify(this.stats)))}function o(t,e,n){return 32*((1<<t)*n+e)+t}function a(t,e,n){return[n,(n-t[0])*(e[1]-t[1])/(e[0]-t[0])+t[1],1]}function s(t,e,n){return[(n-t[1])*(e[0]-t[0])/(e[1]-t[1])+t[0],n,1]}function u(t,e){for(var n in e)t[n]=e[n];return t}function l(t,e,n){var i=t.source;if(1!==i.length)return!1;var r=i[0];if(3!==r.type||r.geometry.length>1)return!1;var o=r.geometry[0].length;if(5!==o)return!1;for(var a=0;a<o;a++){var s=p.point(r.geometry[0][a],e,t.z2,t.x,t.y);if(s[0]!==-n&&s[0]!==e+n||s[1]!==-n&&s[1]!==e+n)return!1}return!0}t.exports=i;var c=n(104),p=n(106),f=n(41),h=n(107),d=n(108);r.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},r.prototype.splitTile=function(t,e,n,i,r,u,c){for(var p=[t,e,n,i],h=this.options,y=h.debug,m=null;p.length;){i=p.pop(),n=p.pop(),e=p.pop(),t=p.pop();var v=1<<e,g=o(e,n,i),x=this.tiles[g],b=e===h.maxZoom?0:h.tolerance/(v*h.extent);if(!x&&(y>1&&console.time(\\\"creation\\\"),x=this.tiles[g]=d(t,v,n,i,b,e===h.maxZoom),this.tileCoords.push({z:e,x:n,y:i}),y)){y>1&&(console.log(\\\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\\\",e,n,i,x.numFeatures,x.numPoints,x.numSimplified),console.timeEnd(\\\"creation\\\"));var w=\\\"z\\\"+e;this.stats[w]=(this.stats[w]||0)+1,this.total++}if(x.source=t,r){if(e===h.maxZoom||e===r)continue;var k=1<<r-e;if(n!==Math.floor(u/k)||i!==Math.floor(c/k))continue}else if(e===h.indexMaxZoom||x.numPoints<=h.indexMaxPoints)continue;if(h.solidChildren||!l(x,h.extent,h.buffer)){x.source=null,y>1&&console.time(\\\"clipping\\\");var _,S,z,T,j,M,I=.5*h.buffer/h.extent,P=.5-I,E=.5+I,F=1+I;_=S=z=T=null,j=f(t,v,n-I,n+E,0,a,x.min[0],x.max[0]),M=f(t,v,n+P,n+F,0,a,x.min[0],x.max[0]),j&&(_=f(j,v,i-I,i+E,1,s,x.min[1],x.max[1]),S=f(j,v,i+P,i+F,1,s,x.min[1],x.max[1])),M&&(z=f(M,v,i-I,i+E,1,s,x.min[1],x.max[1]),T=f(M,v,i+P,i+F,1,s,x.min[1],x.max[1])),y>1&&console.timeEnd(\\\"clipping\\\"),_&&p.push(_,e+1,2*n,2*i),S&&p.push(S,e+1,2*n,2*i+1),z&&p.push(z,e+1,2*n+1,2*i),T&&p.push(T,e+1,2*n+1,2*i+1)}else r&&(m=e)}return m},r.prototype.getTile=function(t,e,n){var i=this.options,r=i.extent,a=i.debug,s=1<<t;e=(e%s+s)%s;var u=o(t,e,n);if(this.tiles[u])return p.tile(this.tiles[u],r);a>1&&console.log(\\\"drilling down to z%d-%d-%d\\\",t,e,n);for(var c,f=t,h=e,d=n;!c&&f>0;)f--,h=Math.floor(h/2),d=Math.floor(d/2),c=this.tiles[o(f,h,d)];if(!c||!c.source)return null;if(a>1&&console.log(\\\"found parent tile z%d-%d-%d\\\",f,h,d),l(c,r,i.buffer))return p.tile(c,r);a>1&&console.time(\\\"drilling down\\\");var y=this.splitTile(c.source,f,h,d,t,e,n);if(a>1&&console.timeEnd(\\\"drilling down\\\"),null!==y){var m=1<<t-y;u=o(y,Math.floor(e/m),Math.floor(n/m))}return this.tiles[u]?p.tile(this.tiles[u],r):null}},function(t,e,n){\\\"use strict\\\";function i(t,e){var n=[];if(\\\"FeatureCollection\\\"===t.type)for(var i=0;i<t.features.length;i++)r(n,t.features[i],e);else\\\"Feature\\\"===t.type?r(n,t,e):r(n,{geometry:t},e);return n}function r(t,e,n){var i,u,l,c=e.geometry,p=c.type,f=c.coordinates,h=e.properties;if(\\\"Point\\\"===p)t.push(o(h,1,[s(f)]));else if(\\\"MultiPoint\\\"===p)t.push(o(h,1,a(f)));else if(\\\"LineString\\\"===p)t.push(o(h,2,[a(f,n)]));else if(\\\"MultiLineString\\\"===p||\\\"Polygon\\\"===p){for(l=[],i=0;i<f.length;i++)l.push(a(f[i],n));t.push(o(h,\\\"Polygon\\\"===p?3:2,l))}else if(\\\"MultiPolygon\\\"===p){for(l=[],i=0;i<f.length;i++)for(u=0;u<f[i].length;u++)l.push(a(f[i][u],n));t.push(o(h,3,l))}else{if(\\\"GeometryCollection\\\"!==p)throw new Error(\\\"Input data is not a valid GeoJSON object.\\\");for(i=0;i<c.geometries.length;i++)r(t,{geometry:c.geometries[i],properties:h},n)}}function o(t,e,n){var i={geometry:n,type:e,tags:t||null,min:[2,1],max:[-1,0]};return l(i),i}function a(t,e){for(var n=[],i=0;i<t.length;i++)n.push(s(t[i]));return e&&(p(n,e),u(n)),n}function s(t){var e=Math.sin(t[1]*Math.PI/180),n=t[0]/360+.5,i=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return i=i<-1?-1:i>1?1:i,[n,i,0]}function u(t){for(var e,n,i=0,r=0,o=0;o<t.length-1;o++)e=n||t[o],n=t[o+1],i+=e[0]*n[1]-n[0]*e[1],r+=Math.abs(n[0]-e[0])+Math.abs(n[1]-e[1]);t.area=Math.abs(i/2),t.dist=r}function l(t){var e=t.geometry,n=t.min,i=t.max;if(1===t.type)c(n,i,e);else for(var r=0;r<e.length;r++)c(n,i,e[r]);return t}function c(t,e,n){for(var i,r=0;r<n.length;r++)i=n[r],t[0]=Math.min(i[0],t[0]),e[0]=Math.max(i[0],e[0]),t[1]=Math.min(i[1],t[1]),e[1]=Math.max(i[1],e[1])}t.exports=i;var p=n(105)},function(t,e,n){\\\"use strict\\\";function i(t,e){var n,i,o,a,s=e*e,u=t.length,l=0,c=u-1,p=[];for(t[l][2]=1,t[c][2]=1;c;){for(i=0,n=l+1;n<c;n++)(o=r(t[n],t[l],t[c]))>i&&(a=n,i=o);i>s?(t[a][2]=i,p.push(l),p.push(a),l=a):(c=p.pop(),l=p.pop())}}function r(t,e,n){var i=e[0],r=e[1],o=n[0],a=n[1],s=t[0],u=t[1],l=o-i,c=a-r;if(0!==l||0!==c){var p=((s-i)*l+(u-r)*c)/(l*l+c*c);p>1?(i=o,r=a):p>0&&(i+=l*p,r+=c*p)}return l=s-i,c=u-r,l*l+c*c}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){if(t.transformed)return t;var n,i,o,a=t.z2,s=t.x,u=t.y;for(n=0;n<t.features.length;n++){var l=t.features[n],c=l.geometry;if(1===l.type)for(i=0;i<c.length;i++)c[i]=r(c[i],e,a,s,u);else for(i=0;i<c.length;i++){var p=c[i];for(o=0;o<p.length;o++)p[o]=r(p[o],e,a,s,u)}}return t.transformed=!0,t}function r(t,e,n,i,r){return[Math.round(e*(t[0]*n-i)),Math.round(e*(t[1]*n-r))]}e.tile=i,e.point=r},function(t,e,n){\\\"use strict\\\";function i(t,e,n){var i=t,o=a(t,1,-1-e,e,0,n,-1,2),s=a(t,1,1-e,2+e,0,n,-1,2);return(o||s)&&(i=a(t,1,-e,1+e,0,n,-1,2),o&&(i=r(o,1).concat(i)),s&&(i=i.concat(r(s,-1)))),i}function r(t,e){for(var n=[],i=0;i<t.length;i++){var r,a=t[i],s=a.type;if(1===s)r=o(a.geometry,e);else{r=[];for(var u=0;u<a.geometry.length;u++)r.push(o(a.geometry[u],e))}n.push({geometry:r,type:s,tags:a.tags,min:[a.min[0]+e,a.min[1]],max:[a.max[0]+e,a.max[1]]})}return n}function o(t,e){var n=[];n.area=t.area,n.dist=t.dist;for(var i=0;i<t.length;i++)n.push([t[i][0]+e,t[i][1],t[i][2]]);return n}var a=n(41);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a){for(var s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:n,y:i,z2:e,transformed:!1,min:[2,1],max:[-1,0]},u=0;u<t.length;u++){s.numFeatures++,r(s,t[u],o,a);var l=t[u].min,c=t[u].max;l[0]<s.min[0]&&(s.min[0]=l[0]),l[1]<s.min[1]&&(s.min[1]=l[1]),c[0]>s.max[0]&&(s.max[0]=c[0]),c[1]>s.max[1]&&(s.max[1]=c[1])}return s}function r(t,e,n,i){var r,o,a,s,u=e.geometry,l=e.type,c=[],p=n*n;if(1===l)for(r=0;r<u.length;r++)c.push(u[r]),t.numPoints++,t.numSimplified++;else for(r=0;r<u.length;r++)if(a=u[r],i||!(2===l&&a.dist<n||3===l&&a.area<p)){var f=[];for(o=0;o<a.length;o++)s=a[o],(i||s[2]>p)&&(f.push(s),t.numSimplified++),t.numPoints++;c.push(f)}else t.numPoints+=a.length;c.length&&t.features.push({geometry:c,type:l,tags:e.tags||null})}t.exports=i},function(t,e,n){function i(t,e){switch(t&&t.type||null){case\\\"FeatureCollection\\\":return t.features=t.features.map(r(i,e)),t;case\\\"Feature\\\":return t.geometry=i(t.geometry,e),t;case\\\"Polygon\\\":case\\\"MultiPolygon\\\":return o(t,e);default:return t}}function r(t,e){return function(n){return t(n,e)}}function o(t,e){return\\\"Polygon\\\"===t.type?t.coordinates=a(t.coordinates,e):\\\"MultiPolygon\\\"===t.type&&(t.coordinates=t.coordinates.map(r(a,e))),t}function a(t,e){e=!!e,t[0]=s(t[0],!e);for(var n=1;n<t.length;n++)t[n]=s(t[n],e);return t}function s(t,e){return u(t)===e?t:t.reverse()}function u(t){return l.ring(t)>=0}var l=n(110);t.exports=i},function(t,e,n){function i(t){if(\\\"Polygon\\\"===t.type)return r(t.coordinates);if(\\\"MultiPolygon\\\"===t.type){for(var e=0,n=0;n<t.coordinates.length;n++)e+=r(t.coordinates[n]);return e}return null}function r(t){var e=0;if(t&&t.length>0){e+=Math.abs(o(t[0]));for(var n=1;n<t.length;n++)e-=Math.abs(o(t[n]))}return e}function o(t){var e=0;if(t.length>2){for(var n,i,r=0;r<t.length-1;r++)n=t[r],i=t[r+1],e+=a(i[0]-n[0])*(2+Math.sin(a(n[1]))+Math.sin(a(i[1])));e=e*s.RADIUS*s.RADIUS/2}return e}function a(t){return t*Math.PI/180}var s=n(111);t.exports.geometry=i,t.exports.ring=o},function(t,e){t.exports.RADIUS=6378137,t.exports.FLATTENING=1/298.257223563,t.exports.POLAR_RADIUS=6356752.3142},function(t,e,n){\\\"use strict\\\";function i(t){this.features=t,this.length=t.length,this.extent=s}function r(t){if(this.type=t.type,1===t.type){this.rawGeometry=[];for(var e=0;e<t.geometry.length;e++)this.rawGeometry.push([t.geometry[e]])}else this.rawGeometry=t.geometry;this.properties=t.tags,this.extent=s}var o=n(2),a=n(12).VectorTileFeature,s=n(4).EXTENT;t.exports=i,i.prototype.feature=function(t){return new r(this.features[t])},r.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],i=[],r=0;r<n.length;r++)i.push(new o(n[r][0],n[r][1]));this.geometry.push(i)}return this.geometry},r.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,i=1/0,r=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),i=Math.min(i,u.y),r=Math.max(r,u.y)}return[e,i,n,r]},r.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){function i(t){var e=[];for(var n in t.layers)e.push(o(t.layers[n]));var i=new c;return p.tile.write({layers:e},i),i.finish()}function r(t){var e={};for(var n in t)e[n]=new f(t[n].features),e[n].name=n;return i({layers:e})}function o(t){for(var e={name:t.name||\\\"\\\",version:t.version||1,extent:t.extent||4096,keys:[],values:[],features:[]},n={},i={},r=0;r<t.length;r++){var o=t.feature(r);o.geometry=u(o.loadGeometry());var a=[];for(var s in o.properties){var c=n[s];void 0===c&&(e.keys.push(s),c=e.keys.length-1,n[s]=c);var p=l(o.properties[s]),f=i[p.key];void 0===f&&(e.values.push(p),f=e.values.length-1,i[p.key]=f),a.push(c),a.push(f)}o.tags=a,e.features.push(o)}return e}function a(t,e){return(e<<3)+(7&t)}function s(t){return t<<1^t>>31}function u(t){for(var e=[],n=0,i=0,r=t.length,o=0;o<r;o++){var u=t[o];e.push(a(1,1));for(var l=0;l<u.length;l++){1===l&&e.push(a(2,u.length-1));var c=u[l].x-n,p=u[l].y-i;e.push(s(c),s(p)),n+=c,i+=p}}return e}function l(t){var e,n=typeof t;return\\\"string\\\"===n?e={string_value:t}:\\\"boolean\\\"===n?e={bool_value:t}:\\\"number\\\"===n?e=t%1!=0?{double_value:t}:t<0?{sint_value:t}:{uint_value:t}:(t=JSON.stringify(t),e={string_value:t}),e.key=n+\\\":\\\"+t,e}var c=n(13),p=n(114),f=n(115);t.exports=i,t.exports.fromVectorTileJs=i,t.exports.fromGeojsonVt=r,t.exports.GeoJSONWrapper=f},function(t,e,n){\\\"use strict\\\";function i(t,e){return t.readFields(r,{layers:[]},e)}function r(t,e,n){3===t&&e.layers.push(f(n,n.readVarint()+n.pos))}function o(t,e){var n;if(void 0!==t.layers)for(n=0;n<t.layers.length;n++)e.writeMessage(3,d,t.layers[n])}function a(t,e){return t.readFields(s,{},e)}function s(t,e,n){1===t?e.string_value=n.readString():2===t?e.float_value=n.readFloat():3===t?e.double_value=n.readDouble():4===t?e.int_value=n.readVarint():5===t?e.uint_value=n.readVarint():6===t?e.sint_value=n.readSVarint():7===t&&(e.bool_value=n.readBoolean())}function u(t,e){void 0!==t.string_value&&e.writeStringField(1,t.string_value),void 0!==t.float_value&&e.writeFloatField(2,t.float_value),void 0!==t.double_value&&e.writeDoubleField(3,t.double_value),void 0!==t.int_value&&e.writeVarintField(4,t.int_value),void 0!==t.uint_value&&e.writeVarintField(5,t.uint_value),void 0!==t.sint_value&&e.writeSVarintField(6,t.sint_value),void 0!==t.bool_value&&e.writeBooleanField(7,t.bool_value)}function l(t,e){var n=t.readFields(c,{},e);return void 0===n.type&&(n.type=\\\"Unknown\\\"),n}function c(t,e,n){1===t?e.id=n.readVarint():2===t?e.tags=n.readPackedVarint():3===t?e.type=n.readVarint():4===t&&(e.geometry=n.readPackedVarint())}function p(t,e){void 0!==t.id&&e.writeVarintField(1,t.id),void 0!==t.tags&&e.writePackedVarint(2,t.tags),void 0!==t.type&&e.writeVarintField(3,t.type),void 0!==t.geometry&&e.writePackedVarint(4,t.geometry)}function f(t,e){return t.readFields(h,{features:[],keys:[],values:[]},e)}function h(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():2===t?e.features.push(l(n,n.readVarint()+n.pos)):3===t?e.keys.push(n.readString()):4===t?e.values.push(a(n,n.readVarint()+n.pos)):5===t&&(e.extent=n.readVarint())}function d(t,e){void 0!==t.version&&e.writeVarintField(15,t.version),void 0!==t.name&&e.writeStringField(1,t.name);var n;if(void 0!==t.features)for(n=0;n<t.features.length;n++)e.writeMessage(2,p,t.features[n]);if(void 0!==t.keys)for(n=0;n<t.keys.length;n++)e.writeStringField(3,t.keys[n]);if(void 0!==t.values)for(n=0;n<t.values.length;n++)e.writeMessage(4,u,t.values[n]);void 0!==t.extent&&e.writeVarintField(5,t.extent)}var y=e.tile={read:i,write:o};y.GeomType={Unknown:0,Point:1,LineString:2,Polygon:3},y.value={read:a,write:u},y.feature={read:l,write:p},y.layer={read:f,write:d}},function(t,e,n){\\\"use strict\\\";function i(t){this.features=t,this.length=t.length}function r(t){this.id=\\\"number\\\"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=4096}var o=n(2),a=n(12).VectorTileFeature;t.exports=i,i.prototype.feature=function(t){return new r(this.features[t])},r.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],i=[],r=0;r<n.length;r++)i.push(new o(n[r][0],n[r][1]));this.geometry.push(i)}return this.geometry},r.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,i=1/0,r=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),i=Math.min(i,u.y),r=Math.max(r,u.y)}return[e,i,n,r]},r.prototype.toGeoJSON=a.prototype.toGeoJSON}]);\\n//# sourceMappingURL=cec7116681391ae7493a.worker.js.cec7116681391ae7493a.map\", __webpack_require__.p + \"cec7116681391ae7493a.worker.js\");\n};\n\n/***/ }),\n/* 1038 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(40);\nvar util = __webpack_require__(10);\nvar loadGeometry = __webpack_require__(153);\nvar earcut = __webpack_require__(560);\nvar classifyRings = __webpack_require__(1039);\nvar EARCUT_MAX_RINGS = 500;\n\nmodule.exports = FillBucket;\n\nfunction FillBucket() {\n    Bucket.apply(this, arguments);\n}\n\nFillBucket.prototype = util.inherit(Bucket, {});\n\nFillBucket.prototype.programInterfaces = {\n    fill: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        elementBufferComponents: 1,\n        elementBuffer2: true,\n        elementBuffer2Components: 2,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }],\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-color'\n        }, {\n            name: 'a_outline_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-outline-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-outline-color'\n        }]\n    }\n};\n\nFillBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    var polygons = classifyRings(lines, EARCUT_MAX_RINGS);\n\n    var startGroup = this.makeRoomFor('fill', 0);\n    var startIndex = startGroup.layout.vertex.length;\n\n    for (var i = 0; i < polygons.length; i++) {\n        this.addPolygon(polygons[i]);\n    }\n\n    this.populatePaintArrays('fill', {zoom: this.zoom}, feature.properties, startGroup, startIndex);\n};\n\nFillBucket.prototype.addPolygon = function(polygon) {\n    var numVertices = 0;\n    for (var k = 0; k < polygon.length; k++) {\n        numVertices += polygon[k].length;\n    }\n\n    var group = this.makeRoomFor('fill', numVertices);\n    var flattened = [];\n    var holeIndices = [];\n    var startIndex = group.layout.vertex.length;\n\n    for (var r = 0; r < polygon.length; r++) {\n        var ring = polygon[r];\n\n        if (r > 0) holeIndices.push(flattened.length / 2);\n\n        for (var v = 0; v < ring.length; v++) {\n            var vertex = ring[v];\n\n            var index = group.layout.vertex.emplaceBack(vertex.x, vertex.y);\n\n            if (v >= 1) {\n                group.layout.element2.emplaceBack(index - 1, index);\n            }\n\n            // convert to format used by earcut\n            flattened.push(vertex.x);\n            flattened.push(vertex.y);\n        }\n    }\n\n    var triangleIndices = earcut(flattened, holeIndices);\n\n    for (var i = 0; i < triangleIndices.length; i++) {\n        group.layout.element.emplaceBack(triangleIndices[i] + startIndex);\n    }\n};\n\n\n/***/ }),\n/* 1039 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar quickselect = __webpack_require__(561);\n\n// classifies an array of rings into polygons with outer rings and holes\nmodule.exports = function classifyRings(rings, maxRings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        rings[i].area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrages with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (var j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n};\n\nfunction compareAreas(a, b) {\n    return b.area - a.area;\n}\n\nfunction calculateSignedArea(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\n\n/***/ }),\n/* 1040 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(40);\nvar util = __webpack_require__(10);\nvar loadGeometry = __webpack_require__(153);\nvar EXTENT = Bucket.EXTENT;\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nvar EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nvar COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nvar SHARP_CORNER_OFFSET = 15;\n\n// The number of bits that is used to store the line distance in the buffer.\nvar LINE_DISTANCE_BUFFER_BITS = 14;\n\n// We don't have enough bits for the line distance as we'd like to have, so\n// use this value to scale the line distance (in tile units) down to a smaller\n// value. This lets us store longer distances while sacrificing precision.\nvar LINE_DISTANCE_SCALE = 1 / 2;\n\n// The maximum line distance, in tile units, that fits in the buffer.\nvar MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS) / LINE_DISTANCE_SCALE;\n\n\nmodule.exports = LineBucket;\n\n/**\n * @private\n */\nfunction LineBucket() {\n    Bucket.apply(this, arguments);\n}\n\nLineBucket.prototype = util.inherit(Bucket, {});\n\nLineBucket.prototype.addLineVertex = function(vertexBuffer, point, extrude, tx, ty, dir, linesofar) {\n    return vertexBuffer.emplaceBack(\n            // a_pos\n            (point.x << 1) | tx,\n            (point.y << 1) | ty,\n            // a_data\n            // add 128 to store an byte in an unsigned byte\n            Math.round(EXTRUDE_SCALE * extrude.x) + 128,\n            Math.round(EXTRUDE_SCALE * extrude.y) + 128,\n            // Encode the -1/0/1 direction value into the first two bits of .z of a_data.\n            // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make\n            // room for the direction value). The upper 8 bits of `linesofar` are placed in\n            // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that\n            // we can store longer distances while sacrificing precision.\n            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2),\n            (linesofar * LINE_DISTANCE_SCALE) >> 6);\n};\n\nLineBucket.prototype.programInterfaces = {\n    line: {\n        vertexBuffer: true,\n        elementBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 4,\n            type: 'Uint8'\n        }]\n    }\n};\n\nLineBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    for (var i = 0; i < lines.length; i++) {\n        this.addLine(\n            lines[i],\n            this.layer.layout['line-join'],\n            this.layer.layout['line-cap'],\n            this.layer.layout['line-miter-limit'],\n            this.layer.layout['line-round-limit']\n        );\n    }\n};\n\nLineBucket.prototype.addLine = function(vertices, join, cap, miterLimit, roundLimit) {\n\n    var len = vertices.length;\n    // If the line has duplicate vertices at the end, adjust length to remove them.\n    while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) {\n        len--;\n    }\n\n    // a line must have at least two vertices\n    if (vertices.length < 2) return;\n\n    if (join === 'bevel') miterLimit = 1.05;\n\n    var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling));\n\n    var firstVertex = vertices[0],\n        lastVertex = vertices[len - 1],\n        closed = firstVertex.equals(lastVertex);\n\n    // we could be more precise, but it would only save a negligible amount of space\n    this.makeRoomFor('line', len * 10);\n\n    // a line may not have coincident points\n    if (len === 2 && closed) return;\n\n    this.distance = 0;\n\n    var beginCap = cap,\n        endCap = closed ? 'butt' : cap,\n        startOfLine = true,\n        currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n    // the last three vertices added\n    this.e1 = this.e2 = this.e3 = -1;\n\n    if (closed) {\n        currentVertex = vertices[len - 2];\n        nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n    }\n\n    for (var i = 0; i < len; i++) {\n\n        nextVertex = closed && i === len - 1 ?\n            vertices[1] : // if the line is closed, we treat the last vertex like the first\n            vertices[i + 1]; // just the next vertex\n\n        // if two consecutive vertices exist, skip the current one\n        if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n        if (nextNormal) prevNormal = nextNormal;\n        if (currentVertex) prevVertex = currentVertex;\n\n        currentVertex = vertices[i];\n\n        // Calculate the normal towards the next vertex in this line. In case\n        // there is no next vertex, pretend that the line is continuing straight,\n        // meaning that we are just using the previous normal.\n        nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n        // If we still don't have a previous normal, this is the beginning of a\n        // non-closed line, so we're doing a straight \"join\".\n        prevNormal = prevNormal || nextNormal;\n\n        // Determine the normal of the join extrusion. It is the angle bisector\n        // of the segments between the previous line and the next line.\n        var joinNormal = prevNormal.add(nextNormal)._unit();\n\n        /*  joinNormal     prevNormal\n         *             ↖      ↑\n         *                .________. prevVertex\n         *                |\n         * nextNormal  ←  |  currentVertex\n         *                |\n         *     nextVertex !\n         *\n         */\n\n        // Calculate the length of the miter (the ratio of the miter to the width).\n        // Find the cosine of the angle between the next and join normals\n        // using dot product. The inverse of that is the miter length.\n        var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n        var miterLength = 1 / cosHalfAngle;\n\n        var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n\n        if (isSharpCorner && i > 0) {\n            var prevSegmentLength = currentVertex.dist(prevVertex);\n            if (prevSegmentLength > 2 * sharpCornerOffset) {\n                var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n                this.distance += newPrevVertex.dist(prevVertex);\n                this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false);\n                prevVertex = newPrevVertex;\n            }\n        }\n\n        // The join if a middle vertex, otherwise the cap.\n        var middleVertex = prevVertex && nextVertex;\n        var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n        if (middleVertex && currentJoin === 'round') {\n            if (miterLength < roundLimit) {\n                currentJoin = 'miter';\n            } else if (miterLength <= 2) {\n                currentJoin = 'fakeround';\n            }\n        }\n\n        if (currentJoin === 'miter' && miterLength > miterLimit) {\n            currentJoin = 'bevel';\n        }\n\n        if (currentJoin === 'bevel') {\n            // The maximum extrude length is 128 / 63 = 2 times the width of the line\n            // so if miterLength >= 2 we need to draw a different type of bevel where.\n            if (miterLength > 2) currentJoin = 'flipbevel';\n\n            // If the miterLength is really small and the line bevel wouldn't be visible,\n            // just draw a miter join to save a triangle.\n            if (miterLength < miterLimit) currentJoin = 'miter';\n        }\n\n        // Calculate how far along the line the currentVertex is\n        if (prevVertex) this.distance += currentVertex.dist(prevVertex);\n\n        if (currentJoin === 'miter') {\n\n            joinNormal._mult(miterLength);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n\n        } else if (currentJoin === 'flipbevel') {\n            // miter is too big, flip the direction to make a beveled join\n\n            if (miterLength > 100) {\n                // Almost parallel lines\n                joinNormal = nextNormal.clone();\n\n            } else {\n                var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n                var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n                joinNormal._perp()._mult(bevelLength * direction);\n            }\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false);\n\n        } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n            var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n            var offset = -Math.sqrt(miterLength * miterLength - 1);\n            if (lineTurnsLeft) {\n                offsetB = 0;\n                offsetA = offset;\n            } else {\n                offsetA = 0;\n                offsetB = offset;\n            }\n\n            // Close previous segment with a bevel\n            if (!startOfLine) {\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false);\n            }\n\n            if (currentJoin === 'fakeround') {\n                // The join angle is sharp enough that a round join would be visible.\n                // Bevel joins fill the gap between segments with a single pie slice triangle.\n                // Create a round join by adding multiple pie slices. The join isn't actually round, but\n                // it looks like it is at the sizes we render lines at.\n\n                // Add more triangles for sharper angles.\n                // This math is just a good enough approximation. It isn't \"correct\".\n                var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n                var approxFractionalJoinNormal;\n\n                for (var m = 0; m < n; m++) {\n                    approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n\n                this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft);\n\n                for (var k = n - 1; k >= 0; k--) {\n                    approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false);\n            }\n\n        } else if (currentJoin === 'butt') {\n            if (!startOfLine) {\n                // Close previous segment with a butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n            }\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n\n        } else if (currentJoin === 'square') {\n\n            if (!startOfLine) {\n                // Close previous segment with a square cap\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false);\n            }\n\n        } else if (currentJoin === 'round') {\n\n            if (!startOfLine) {\n                // Close previous segment with butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n\n                // Add round cap or linejoin at end of segment\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                // Add round cap before first segment\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true);\n\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n        }\n\n        if (isSharpCorner && i < len - 1) {\n            var nextSegmentLength = currentVertex.dist(nextVertex);\n            if (nextSegmentLength > 2 * sharpCornerOffset) {\n                var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n                this.distance += newCurrentVertex.dist(currentVertex);\n                this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false);\n                currentVertex = newCurrentVertex;\n            }\n        }\n\n        startOfLine = false;\n    }\n\n};\n\n/**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beginning of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\nLineBucket.prototype.addCurrentVertex = function(currentVertex, distance, normal, endLeft, endRight, round) {\n    var tx = round ? 1 : 0;\n    var extrude;\n    var layoutArrays = this.arrayGroups.line[this.arrayGroups.line.length - 1].layout;\n    var vertexArray = layoutArrays.vertex;\n    var elementArray = layoutArrays.element;\n\n    extrude = normal.clone();\n    if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, tx, 0, endLeft, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    extrude = normal.mult(-1);\n    if (endRight) extrude._sub(normal.perp()._mult(endRight));\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, tx, 1, -endRight, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    // There is a maximum \"distance along the line\" that we can store in the buffers.\n    // When we get close to the distance, reset it to zero and add the vertex again with\n    // a distance of zero. The max distance is determined by the number of bits we allocate\n    // to `linesofar`.\n    if (distance > MAX_LINE_DISTANCE / 2) {\n        this.distance = 0;\n        this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round);\n    }\n};\n\n/**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\nLineBucket.prototype.addPieSliceVertex = function(currentVertex, distance, extrude, lineTurnsLeft) {\n    var ty = lineTurnsLeft ? 1 : 0;\n    extrude = extrude.mult(lineTurnsLeft ? -1 : 1);\n    var layoutArrays = this.arrayGroups.line[this.arrayGroups.line.length - 1].layout;\n    var vertexArray = layoutArrays.vertex;\n    var elementArray = layoutArrays.element;\n\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, 0, ty, 0, distance);\n\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n\n    if (lineTurnsLeft) {\n        this.e2 = this.e3;\n    } else {\n        this.e1 = this.e3;\n    }\n};\n\n\n/***/ }),\n/* 1041 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(40);\nvar util = __webpack_require__(10);\nvar loadGeometry = __webpack_require__(153);\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = CircleBucket;\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nfunction CircleBucket() {\n    Bucket.apply(this, arguments);\n}\n\nCircleBucket.prototype = util.inherit(Bucket, {});\n\nCircleBucket.prototype.addCircleVertex = function(vertexArray, x, y, extrudeX, extrudeY) {\n    return vertexArray.emplaceBack(\n            (x * 2) + ((extrudeX + 1) / 2),\n            (y * 2) + ((extrudeY + 1) / 2));\n};\n\nCircleBucket.prototype.programInterfaces = {\n    circle: {\n        vertexBuffer: true,\n        elementBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }],\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"circle-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'circle-color'\n        }, {\n            name: 'a_radius',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-radius\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-radius'\n        }, {\n            name: 'a_blur',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-blur\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-blur'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'circle-opacity'\n        }]\n    }\n};\n\nCircleBucket.prototype.addFeature = function(feature) {\n    var globalProperties = {zoom: this.zoom};\n    var geometries = loadGeometry(feature);\n\n    var startGroup = this.makeRoomFor('circle', 0);\n    var startIndex = startGroup.layout.vertex.length;\n\n    for (var j = 0; j < geometries.length; j++) {\n        for (var k = 0; k < geometries[j].length; k++) {\n\n            var x = geometries[j][k].x;\n            var y = geometries[j][k].y;\n\n            // Do not include points that are outside the tile boundaries.\n            if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n            // this geometry will be of the Point type, and we'll derive\n            // two triangles from it.\n            //\n            // ┌─────────┐\n            // │ 3     2 │\n            // │         │\n            // │ 0     1 │\n            // └─────────┘\n\n            var group = this.makeRoomFor('circle', 4);\n            var vertexArray = group.layout.vertex;\n\n            var index = this.addCircleVertex(vertexArray, x, y, -1, -1);\n            this.addCircleVertex(vertexArray, x, y, 1, -1);\n            this.addCircleVertex(vertexArray, x, y, 1, 1);\n            this.addCircleVertex(vertexArray, x, y, -1, 1);\n\n            group.layout.element.emplaceBack(index, index + 1, index + 2);\n            group.layout.element.emplaceBack(index, index + 3, index + 2);\n        }\n    }\n\n    this.populatePaintArrays('circle', globalProperties, feature.properties, startGroup, startIndex);\n};\n\n\n/***/ }),\n/* 1042 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nvar Bucket = __webpack_require__(40);\nvar Anchor = __webpack_require__(562);\nvar getAnchors = __webpack_require__(1043);\nvar resolveTokens = __webpack_require__(563);\nvar Quads = __webpack_require__(564);\nvar Shaping = __webpack_require__(1045);\nvar resolveText = __webpack_require__(1046);\nvar mergeLines = __webpack_require__(1047);\nvar clipLine = __webpack_require__(1048);\nvar util = __webpack_require__(10);\nvar loadGeometry = __webpack_require__(153);\nvar CollisionFeature = __webpack_require__(1049);\n\nvar shapeText = Shaping.shapeText;\nvar shapeIcon = Shaping.shapeIcon;\nvar getGlyphQuads = Quads.getGlyphQuads;\nvar getIconQuads = Quads.getIconQuads;\n\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = SymbolBucket;\n\nfunction SymbolBucket(options) {\n    Bucket.apply(this, arguments);\n    this.showCollisionBoxes = options.showCollisionBoxes;\n    this.overscaling = options.overscaling;\n    this.collisionBoxArray = options.collisionBoxArray;\n    this.symbolQuadsArray = options.symbolQuadsArray;\n    this.symbolInstancesArray = options.symbolInstancesArray;\n\n    this.sdfIcons = options.sdfIcons;\n    this.iconsNeedLinear = options.iconsNeedLinear;\n    this.adjustedTextSize = options.adjustedTextSize;\n    this.adjustedIconSize = options.adjustedIconSize;\n    this.fontstack = options.fontstack;\n}\n\nSymbolBucket.prototype = util.inherit(Bucket, {});\n\nSymbolBucket.prototype.serialize = function() {\n    var serialized = Bucket.prototype.serialize.apply(this);\n    serialized.sdfIcons = this.sdfIcons;\n    serialized.iconsNeedLinear = this.iconsNeedLinear;\n    serialized.adjustedTextSize = this.adjustedTextSize;\n    serialized.adjustedIconSize = this.adjustedIconSize;\n    serialized.fontstack = this.fontstack;\n    return serialized;\n};\n\nvar programAttributes = [{\n    name: 'a_pos',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_offset',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_data1',\n    components: 4,\n    type: 'Uint8'\n}, {\n    name: 'a_data2',\n    components: 2,\n    type: 'Uint8'\n}];\n\nfunction addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom) {\n    return array.emplaceBack(\n            // pos\n            x,\n            y,\n            // offset\n            Math.round(ox * 64), // use 1/64 pixels for placement\n            Math.round(oy * 64),\n            // data1\n            tx / 4,                   // tex\n            ty / 4,                   // tex\n            (labelminzoom || 0) * 10, // labelminzoom\n            0,\n            // data2\n            (minzoom || 0) * 10,               // minzoom\n            Math.min(maxzoom || 25, 25) * 10); // minzoom\n}\n\nSymbolBucket.prototype.addCollisionBoxVertex = function(vertexArray, point, extrude, maxZoom, placementZoom) {\n    return vertexArray.emplaceBack(\n            // pos\n            point.x,\n            point.y,\n            // extrude\n            Math.round(extrude.x),\n            Math.round(extrude.y),\n            // data\n            maxZoom * 10,\n            placementZoom * 10);\n};\n\nSymbolBucket.prototype.programInterfaces = {\n\n    glyph: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        layoutAttributes: programAttributes\n    },\n\n    icon: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        layoutAttributes: programAttributes\n    },\n\n    collisionBox: {\n        vertexBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_extrude',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 2,\n            type: 'Uint8'\n        }]\n    }\n};\n\nSymbolBucket.prototype.populateBuffers = function(collisionTile, stacks, icons) {\n\n    // To reduce the number of labels that jump around when zooming we need\n    // to use a text-size value that is the same for all zoom levels.\n    // This calculates text-size at a high zoom level so that all tiles can\n    // use the same value when calculating anchor positions.\n    var zoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\n    this.adjustedTextMaxSize = this.layer.getLayoutValue('text-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedTextSize = this.layer.getLayoutValue('text-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n    this.adjustedIconMaxSize = this.layer.getLayoutValue('icon-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedIconSize = this.layer.getLayoutValue('icon-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n\n    var tileSize = 512 * this.overscaling;\n    this.tilePixelRatio = EXTENT / tileSize;\n    this.compareText = {};\n    this.iconsNeedLinear = false;\n    this.symbolInstancesStartIndex = this.symbolInstancesArray.length;\n\n    var layout = this.layer.layout;\n    var features = this.features;\n    var textFeatures = this.textFeatures;\n\n    var horizontalAlign = 0.5,\n        verticalAlign = 0.5;\n\n    switch (layout['text-anchor']) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        horizontalAlign = 1;\n        break;\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        horizontalAlign = 0;\n        break;\n    }\n\n    switch (layout['text-anchor']) {\n    case 'bottom':\n    case 'bottom-right':\n    case 'bottom-left':\n        verticalAlign = 1;\n        break;\n    case 'top':\n    case 'top-right':\n    case 'top-left':\n        verticalAlign = 0;\n        break;\n    }\n\n    var justify = layout['text-justify'] === 'right' ? 1 :\n        layout['text-justify'] === 'left' ? 0 :\n        0.5;\n\n    var oneEm = 24;\n    var lineHeight = layout['text-line-height'] * oneEm;\n    var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n    var spacing = layout['text-letter-spacing'] * oneEm;\n    var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n    var fontstack = this.fontstack = layout['text-font'].join(',');\n\n    var geometries = [];\n    for (var g = 0; g < features.length; g++) {\n        geometries.push(loadGeometry(features[g]));\n    }\n\n    if (layout['symbol-placement'] === 'line') {\n        // Merge adjacent lines with the same text to improve labelling.\n        // It's better to place labels on one long line than on many short segments.\n        var merged = mergeLines(features, textFeatures, geometries);\n\n        geometries = merged.geometries;\n        features = merged.features;\n        textFeatures = merged.textFeatures;\n    }\n\n    var shapedText, shapedIcon;\n\n    for (var k = 0; k < features.length; k++) {\n        if (!geometries[k]) continue;\n\n        if (textFeatures[k]) {\n            shapedText = shapeText(textFeatures[k], stacks[fontstack], maxWidth,\n                    lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset);\n        } else {\n            shapedText = null;\n        }\n\n        if (layout['icon-image']) {\n            var iconName = resolveTokens(features[k].properties, layout['icon-image']);\n            var image = icons[iconName];\n            shapedIcon = shapeIcon(image, layout);\n\n            if (image) {\n                if (this.sdfIcons === undefined) {\n                    this.sdfIcons = image.sdf;\n                } else if (this.sdfIcons !== image.sdf) {\n                    util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n                }\n                if (image.pixelRatio !== 1) {\n                    this.iconsNeedLinear = true;\n                }\n            }\n        } else {\n            shapedIcon = null;\n        }\n\n        if (shapedText || shapedIcon) {\n            this.addFeature(geometries[k], shapedText, shapedIcon, features[k].index);\n        }\n    }\n    this.symbolInstancesEndIndex = this.symbolInstancesArray.length;\n    this.placeFeatures(collisionTile, this.showCollisionBoxes);\n\n    this.trimArrays();\n};\n\nSymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon, featureIndex) {\n    var layout = this.layer.layout;\n\n    var glyphSize = 24;\n\n    var fontScale = this.adjustedTextSize / glyphSize,\n        textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize,\n        textBoxScale = this.tilePixelRatio * fontScale,\n        textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize,\n        iconBoxScale = this.tilePixelRatio * this.adjustedIconSize,\n        symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'],\n        avoidEdges = layout['symbol-avoid-edges'],\n        textPadding = layout['text-padding'] * this.tilePixelRatio,\n        iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n        textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n        textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n            layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n        isLine = layout['symbol-placement'] === 'line',\n        textRepeatDistance = symbolMinDistance / 2;\n\n    if (isLine) {\n        lines = clipLine(lines, 0, 0, EXTENT, EXTENT);\n    }\n\n    for (var i = 0; i < lines.length; i++) {\n        var line = lines[i];\n\n        // Calculate the anchor points around which you want to place labels\n        var anchors;\n        if (isLine) {\n            anchors = getAnchors(\n                line,\n                symbolMinDistance,\n                textMaxAngle,\n                shapedText,\n                shapedIcon,\n                glyphSize,\n                textMaxBoxScale,\n                this.overscaling,\n                EXTENT\n            );\n        } else {\n            anchors = [ new Anchor(line[0].x, line[0].y, 0) ];\n        }\n\n        // For each potential label, create the placement features used to check for collisions, and the quads use for rendering.\n        for (var j = 0, len = anchors.length; j < len; j++) {\n            var anchor = anchors[j];\n\n            if (shapedText && isLine) {\n                if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n                    continue;\n                }\n            }\n\n            var inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT);\n\n            if (avoidEdges && !inside) continue;\n\n            // Normally symbol layers are drawn across tile boundaries. Only symbols\n            // with their anchors within the tile boundaries are added to the buffers\n            // to prevent symbols from being drawn twice.\n            //\n            // Symbols in layers with overlap are sorted in the y direction so that\n            // symbols lower on the canvas are drawn on top of symbols near the top.\n            // To preserve this order across tile boundaries these symbols can't\n            // be drawn across tile boundaries. Instead they need to be included in\n            // the buffers for both tiles and clipped to tile boundaries at draw time.\n            var addToBuffers = inside || mayOverlap;\n            this.addSymbolInstance(anchor, line, shapedText, shapedIcon, layout,\n                addToBuffers, this.symbolInstancesArray.length, this.collisionBoxArray, featureIndex, this.sourceLayerIndex, this.index,\n                textBoxScale, textPadding, textAlongLine,\n                iconBoxScale, iconPadding, iconAlongLine);\n        }\n    }\n};\n\nSymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) {\n    var compareText = this.compareText;\n    if (!(text in compareText)) {\n        compareText[text] = [];\n    } else {\n        var otherAnchors = compareText[text];\n        for (var k = otherAnchors.length - 1; k >= 0; k--) {\n            if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n                // If it's within repeatDistance of one anchor, stop looking\n                return true;\n            }\n        }\n    }\n    // If anchor is not within repeatDistance of any other anchor, add to array\n    compareText[text].push(anchor);\n    return false;\n};\n\nSymbolBucket.prototype.placeFeatures = function(collisionTile, showCollisionBoxes) {\n    this.recalculateStyleLayers();\n\n    // Calculate which labels can be shown and when they can be shown and\n    // create the bufers used for rendering.\n\n    this.createArrays();\n\n    var layout = this.layer.layout;\n\n    var maxScale = collisionTile.maxScale;\n\n    var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n    var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n    var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n        layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n    // Sort symbols by their y position on the canvas so that the lower symbols\n    // are drawn on top of higher symbols.\n    // Don't sort symbols that won't overlap because it isn't necessary and\n    // because it causes more labels to pop in and out when rotating.\n    if (mayOverlap) {\n        // Only need the symbol instances from the current tile to sort, so convert those instances into an array\n        // of `StructType`s to enable sorting\n        var symbolInstancesStructTypeArray = this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex, this.symbolInstancesEndIndex);\n\n        var angle = collisionTile.angle;\n\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle);\n\n        this.sortedSymbolInstances = symbolInstancesStructTypeArray.sort(function(a, b) {\n            var aRotated = (sin * a.anchorPointX + cos * a.anchorPointY) | 0;\n            var bRotated = (sin * b.anchorPointX + cos * b.anchorPointY) | 0;\n            return (aRotated - bRotated) || (b.index - a.index);\n        });\n    }\n\n    for (var p = this.symbolInstancesStartIndex; p < this.symbolInstancesEndIndex; p++) {\n        var symbolInstance = this.sortedSymbolInstances ? this.sortedSymbolInstances[p - this.symbolInstancesStartIndex] : this.symbolInstancesArray.get(p);\n        var textCollisionFeature = {\n            boxStartIndex: symbolInstance.textBoxStartIndex,\n            boxEndIndex: symbolInstance.textBoxEndIndex\n        };\n        var iconCollisionFeature = {\n            boxStartIndex: symbolInstance.iconBoxStartIndex,\n            boxEndIndex: symbolInstance.iconBoxEndIndex\n        };\n\n        var hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex);\n        var hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex);\n\n        var iconWithoutText = layout['text-optional'] || !hasText,\n            textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n        // Calculate the scales at which the text and icon can be placed without collision.\n\n        var glyphScale = hasText ?\n            collisionTile.placeCollisionFeature(textCollisionFeature,\n\t\t\t\t\tlayout['text-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n        var iconScale = hasIcon ?\n            collisionTile.placeCollisionFeature(iconCollisionFeature,\n                    layout['icon-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n\n        // Combine the scales for icons and text.\n\n        if (!iconWithoutText && !textWithoutIcon) {\n            iconScale = glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!textWithoutIcon && glyphScale) {\n            glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!iconWithoutText && iconScale) {\n            iconScale = Math.max(iconScale, glyphScale);\n        }\n\n\n        // Insert final placement into collision tree and add glyphs/icons to buffers\n\n        if (hasText) {\n            collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']);\n            if (glyphScale <= maxScale) {\n                this.addSymbols('glyph', symbolInstance.glyphQuadStartIndex, symbolInstance.glyphQuadEndIndex, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle);\n            }\n        }\n\n        if (hasIcon) {\n            collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']);\n            if (iconScale <= maxScale) {\n                this.addSymbols('icon', symbolInstance.iconQuadStartIndex, symbolInstance.iconQuadEndIndex, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle);\n            }\n        }\n\n    }\n\n    if (showCollisionBoxes) this.addToDebugBuffers(collisionTile);\n};\n\nSymbolBucket.prototype.addSymbols = function(programName, quadsStart, quadsEnd, scale, keepUpright, alongLine, placementAngle) {\n\n    var group = this.makeRoomFor(programName, 4 * (quadsEnd - quadsStart));\n\n    var elementArray = group.layout.element;\n    var vertexArray = group.layout.vertex;\n\n    var zoom = this.zoom;\n    var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n    for (var k = quadsStart; k < quadsEnd; k++) {\n\n        var symbol = this.symbolQuadsArray.get(k).SymbolQuad,\n            angle = symbol.angle;\n\n        // drop upside down versions of glyphs\n        var a = (angle + placementAngle + Math.PI) % (Math.PI * 2);\n        if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n        var tl = symbol.tl,\n            tr = symbol.tr,\n            bl = symbol.bl,\n            br = symbol.br,\n            tex = symbol.tex,\n            anchorPoint = symbol.anchorPoint,\n\n            minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom),\n            maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n        if (maxZoom <= minZoom) continue;\n\n        // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n        if (minZoom === placementZoom) minZoom = 0;\n\n        var index = addVertex(vertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n\n        elementArray.emplaceBack(index, index + 1, index + 2);\n        elementArray.emplaceBack(index + 1, index + 2, index + 3);\n    }\n\n};\n\nSymbolBucket.prototype.updateIcons = function(icons) {\n    this.recalculateStyleLayers();\n    var iconValue = this.layer.layout['icon-image'];\n    if (!iconValue) return;\n\n    for (var i = 0; i < this.features.length; i++) {\n        var iconName = resolveTokens(this.features[i].properties, iconValue);\n        if (iconName)\n            icons[iconName] = true;\n    }\n};\n\nSymbolBucket.prototype.updateFont = function(stacks) {\n    this.recalculateStyleLayers();\n    var fontName = this.layer.layout['text-font'],\n        stack = stacks[fontName] = stacks[fontName] || {};\n\n    this.textFeatures = resolveText(this.features, this.layer.layout, stack);\n};\n\nSymbolBucket.prototype.addToDebugBuffers = function(collisionTile) {\n    var group = this.makeRoomFor('collisionBox', 0);\n    var vertexArray = group.layout.vertex;\n    var angle = -collisionTile.angle;\n    var yStretch = collisionTile.yStretch;\n\n    for (var j = this.symbolInstancesStartIndex; j < this.symbolInstancesEndIndex; j++) {\n        var symbolInstance = this.symbolInstancesArray.get(j);\n        symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex};\n        symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex};\n\n        for (var i = 0; i < 2; i++) {\n            var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n            if (!feature) continue;\n\n            for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {\n                var box = this.collisionBoxArray.get(b);\n                var anchorPoint = box.anchorPoint;\n\n                var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n                var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n                var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n                var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n                var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n                var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tl, maxZoom, placementZoom);\n            }\n        }\n    }\n};\n\nSymbolBucket.prototype.addSymbolInstance = function(anchor, line, shapedText, shapedIcon, layout, addToBuffers, index, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex,\n    textBoxScale, textPadding, textAlongLine,\n    iconBoxScale, iconPadding, iconAlongLine) {\n\n    var glyphQuadStartIndex, glyphQuadEndIndex, iconQuadStartIndex, iconQuadEndIndex, textCollisionFeature, iconCollisionFeature, glyphQuads, iconQuads;\n    if (shapedText) {\n        glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layout, textAlongLine) : [];\n        textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedText, textBoxScale, textPadding, textAlongLine, false);\n    }\n\n    glyphQuadStartIndex = this.symbolQuadsArray.length;\n    if (glyphQuads && glyphQuads.length) {\n        for (var i = 0; i < glyphQuads.length; i++) {\n            this.addSymbolQuad(glyphQuads[i]);\n        }\n    }\n    glyphQuadEndIndex = this.symbolQuadsArray.length;\n\n    var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    if (shapedIcon) {\n        iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layout, iconAlongLine) : [];\n        iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true);\n    }\n\n    iconQuadStartIndex = this.symbolQuadsArray.length;\n    if (iconQuads && iconQuads.length === 1) {\n        this.addSymbolQuad(iconQuads[0]);\n    }\n    iconQuadEndIndex = this.symbolQuadsArray.length;\n\n    var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    return this.symbolInstancesArray.emplaceBack(\n        textBoxStartIndex,\n        textBoxEndIndex,\n        iconBoxStartIndex,\n        iconBoxEndIndex,\n        glyphQuadStartIndex,\n        glyphQuadEndIndex,\n        iconQuadStartIndex,\n        iconQuadEndIndex,\n        anchor.x,\n        anchor.y,\n        index);\n};\n\nSymbolBucket.prototype.addSymbolQuad = function(symbolQuad) {\n    return this.symbolQuadsArray.emplaceBack(\n        // anchorPoints\n        symbolQuad.anchorPoint.x,\n        symbolQuad.anchorPoint.y,\n        // corners\n        symbolQuad.tl.x,\n        symbolQuad.tl.y,\n        symbolQuad.tr.x,\n        symbolQuad.tr.y,\n        symbolQuad.bl.x,\n        symbolQuad.bl.y,\n        symbolQuad.br.x,\n        symbolQuad.br.y,\n        // texture\n        symbolQuad.tex.h,\n        symbolQuad.tex.w,\n        symbolQuad.tex.x,\n        symbolQuad.tex.y,\n        //angle\n        symbolQuad.angle,\n        // scales\n        symbolQuad.maxScale,\n        symbolQuad.minScale);\n};\n\n\n\n/***/ }),\n/* 1043 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar interpolate = __webpack_require__(191);\nvar Anchor = __webpack_require__(562);\nvar checkMaxAngle = __webpack_require__(1044);\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {\n\n    // Resample a line to get anchor points for labels and check that each\n    // potential label passes text-max-angle check and has enough froom to fit\n    // on the line.\n\n    var angleWindowSize = shapedText ?\n        3 / 5 * glyphSize * boxScale :\n        0;\n\n    var labelLength = Math.max(\n        shapedText ? shapedText.right - shapedText.left : 0,\n        shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n    // Is the line continued from outside the tile boundary?\n    var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n    // Is the label long, relative to the spacing?\n    // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n    if (spacing - labelLength * boxScale  < spacing / 4) {\n        spacing = labelLength * boxScale + spacing / 4;\n    }\n\n    // Offset the first anchor by:\n    // Either half the label length plus a fixed extra offset if the line is not continued\n    // Or half the spacing if the line is continued.\n\n    // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n    var fixedExtraOffset = glyphSize * 2;\n\n    var offset = !isLineContinued ?\n        ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n        (spacing / 2 * overscaling) % spacing;\n\n    return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {\n\n    var halfLabelLength = labelLength / 2;\n    var lineLength = 0;\n    for (var k = 0; k < line.length - 1; k++) {\n        lineLength += line[k].dist(line[k + 1]);\n    }\n\n    var distance = 0,\n        markedDistance = offset - spacing;\n\n    var anchors = [];\n\n    for (var i = 0; i < line.length - 1; i++) {\n\n        var a = line[i],\n            b = line[i + 1];\n\n        var segmentDist = a.dist(b),\n            angle = b.angleTo(a);\n\n        while (markedDistance + spacing < distance + segmentDist) {\n            markedDistance += spacing;\n\n            var t = (markedDistance - distance) / segmentDist,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            // Check that the point is within the tile boundaries and that\n            // the label would fit before the beginning and end of the line\n            // if placed at this point.\n            if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n                    markedDistance - halfLabelLength >= 0 &&\n                    markedDistance + halfLabelLength <= lineLength) {\n                var anchor = new Anchor(x, y, angle, i)._round();\n\n                if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                    anchors.push(anchor);\n                }\n            }\n        }\n\n        distance += segmentDist;\n    }\n\n    if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n        // The first attempt at finding anchors at which labels can be placed failed.\n        // Try again, but this time just try placing one anchor at the middle of the line.\n        // This has the most effect for short lines in overscaled tiles, since the\n        // initial offset used in overscaled tiles is calculated to align labels with positions in\n        // parent tiles instead of placing the label as close to the beginning as possible.\n        anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n    }\n\n    return anchors;\n}\n\n\n/***/ }),\n/* 1044 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n    // horizontal labels always pass\n    if (anchor.segment === undefined) return true;\n\n    var p = anchor;\n    var index = anchor.segment + 1;\n    var anchorDistance = 0;\n\n    // move backwards along the line to the first segment the label appears on\n    while (anchorDistance > -labelLength / 2) {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        if (index < 0) return false;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    }\n\n    anchorDistance += line[index].dist(line[index + 1]);\n    index++;\n\n    // store recent corners and their total angle difference\n    var recentCorners = [];\n    var recentAngleDelta = 0;\n\n    // move forwards by the length of the label and check angles along the way\n    while (anchorDistance < labelLength / 2) {\n        var prev = line[index - 1];\n        var current = line[index];\n        var next = line[index + 1];\n\n        // there isn't enough room for the label before the end of the line\n        if (!next) return false;\n\n        var angleDelta = prev.angleTo(current) - current.angleTo(next);\n        // restrict angle to -pi..pi range\n        angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n        recentCorners.push({\n            distance: anchorDistance,\n            angleDelta: angleDelta\n        });\n        recentAngleDelta += angleDelta;\n\n        // remove corners that are far enough away from the list of recent anchors\n        while (anchorDistance - recentCorners[0].distance > windowSize) {\n            recentAngleDelta -= recentCorners.shift().angleDelta;\n        }\n\n        // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n        if (recentAngleDelta > maxAngle) return false;\n\n        index++;\n        anchorDistance += current.dist(next);\n    }\n\n    // no part of the line had an angle greater than the maximum allowed. check passes.\n    return true;\n}\n\n\n/***/ }),\n/* 1045 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n    shapeText: shapeText,\n    shapeIcon: shapeIcon\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph) {\n    this.codePoint = codePoint;\n    this.x = x;\n    this.y = y;\n    this.glyph = glyph;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right) {\n    this.positionedGlyphs = positionedGlyphs;\n    this.text = text;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) {\n\n    var positionedGlyphs = [];\n    var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]);\n\n    // the y offset *should* be part of the font metadata\n    var yOffset = -17;\n\n    var x = 0;\n    var y = yOffset;\n\n    for (var i = 0; i < text.length; i++) {\n        var codePoint = text.charCodeAt(i);\n        var glyph = glyphs[codePoint];\n\n        if (!glyph) continue;\n\n        positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph));\n        x += glyph.advance + spacing;\n    }\n\n    if (!positionedGlyphs.length) return false;\n\n    linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate);\n\n    return shaping;\n}\n\nvar invisible = {\n    0x20:   true, // space\n    0x200b: true  // zero-width space\n};\n\nvar breakable = {\n    0x20:   true, // space\n    0x26:   true, // ampersand\n    0x2b:   true, // plus sign\n    0x2d:   true, // hyphen-minus\n    0x2f:   true, // solidus\n    0xad:   true, // soft hyphen\n    0xb7:   true, // middle dot\n    0x200b: true, // zero-width space\n    0x2010: true, // hyphen\n    0x2013: true  // en dash\n};\n\nfunction linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate) {\n    var lastSafeBreak = null;\n\n    var lengthBeforeCurrentLine = 0;\n    var lineStartIndex = 0;\n    var line = 0;\n\n    var maxLineLength = 0;\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n\n    if (maxWidth) {\n        for (var i = 0; i < positionedGlyphs.length; i++) {\n            var positionedGlyph = positionedGlyphs[i];\n\n            positionedGlyph.x -= lengthBeforeCurrentLine;\n            positionedGlyph.y += lineHeight * line;\n\n            if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) {\n\n                var lineLength = positionedGlyphs[lastSafeBreak + 1].x;\n                maxLineLength = Math.max(lineLength, maxLineLength);\n\n                for (var k = lastSafeBreak + 1; k <= i; k++) {\n                    positionedGlyphs[k].y += lineHeight;\n                    positionedGlyphs[k].x -= lineLength;\n                }\n\n                if (justify) {\n                    // Collapse invisible characters.\n                    var lineEnd = lastSafeBreak;\n                    if (invisible[positionedGlyphs[lastSafeBreak].codePoint]) {\n                        lineEnd--;\n                    }\n\n                    justifyLine(positionedGlyphs, glyphs, lineStartIndex, lineEnd, justify);\n                }\n\n                lineStartIndex = lastSafeBreak + 1;\n                lastSafeBreak = null;\n                lengthBeforeCurrentLine += lineLength;\n                line++;\n            }\n\n            if (breakable[positionedGlyph.codePoint]) {\n                lastSafeBreak = i;\n            }\n        }\n    }\n\n    var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1];\n    var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance;\n    maxLineLength = Math.max(maxLineLength, lastLineLength);\n\n    var height = (line + 1) * lineHeight;\n\n    justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n    align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate);\n\n    // Calculate the bounding box\n    shaping.top += -verticalAlign * height;\n    shaping.bottom = shaping.top + height;\n    shaping.left += -horizontalAlign * maxLineLength;\n    shaping.right = shaping.left + maxLineLength;\n}\n\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n    var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n    var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n    for (var j = start; j <= end; j++) {\n        positionedGlyphs[j].x -= lineIndent;\n    }\n\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate) {\n    var shiftX = (justify - horizontalAlign) * maxLineLength + translate[0];\n    var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight + translate[1];\n\n    for (var j = 0; j < positionedGlyphs.length; j++) {\n        positionedGlyphs[j].x += shiftX;\n        positionedGlyphs[j].y += shiftY;\n    }\n}\n\n\nfunction shapeIcon(image, layout) {\n    if (!image || !image.rect) return null;\n\n    var dx = layout['icon-offset'][0];\n    var dy = layout['icon-offset'][1];\n    var x1 = dx - image.width / 2;\n    var x2 = x1 + image.width;\n    var y1 = dy - image.height / 2;\n    var y2 = y1 + image.height;\n\n    return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n    this.image = image;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\n\n/***/ }),\n/* 1046 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolveTokens = __webpack_require__(563);\n\nmodule.exports = resolveText;\n\n/**\n * For an array of features determine what glyphs need to be loaded\n * and apply any text preprocessing. The remaining users of text should\n * use the `textFeatures` key returned by this function rather than accessing\n * feature text directly.\n * @private\n */\nfunction resolveText(features, layoutProperties, codepoints) {\n    var textFeatures = [];\n\n    for (var i = 0, fl = features.length; i < fl; i++) {\n        var text = resolveTokens(features[i].properties, layoutProperties['text-field']);\n        if (!text) {\n            textFeatures[i] = null;\n            continue;\n        }\n        text = text.toString();\n\n        var transform = layoutProperties['text-transform'];\n        if (transform === 'uppercase') {\n            text = text.toLocaleUpperCase();\n        } else if (transform === 'lowercase') {\n            text = text.toLocaleLowerCase();\n        }\n\n        for (var j = 0; j < text.length; j++) {\n            codepoints[text.charCodeAt(j)] = true;\n        }\n\n        // Track indexes of features with text.\n        textFeatures[i] = text;\n    }\n\n    return textFeatures;\n}\n\n\n/***/ }),\n/* 1047 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (features, textFeatures, geometries) {\n\n    var leftIndex = {},\n        rightIndex = {},\n        mergedFeatures = [],\n        mergedGeom = [],\n        mergedTexts = [],\n        mergedIndex = 0,\n        k;\n\n    function add(k) {\n        mergedFeatures.push(features[k]);\n        mergedGeom.push(geometries[k]);\n        mergedTexts.push(textFeatures[k]);\n        mergedIndex++;\n    }\n\n    function mergeFromRight(leftKey, rightKey, geom) {\n        var i = rightIndex[leftKey];\n        delete rightIndex[leftKey];\n        rightIndex[rightKey] = i;\n\n        mergedGeom[i][0].pop();\n        mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]);\n        return i;\n    }\n\n    function mergeFromLeft(leftKey, rightKey, geom) {\n        var i = leftIndex[rightKey];\n        delete leftIndex[rightKey];\n        leftIndex[leftKey] = i;\n\n        mergedGeom[i][0].shift();\n        mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]);\n        return i;\n    }\n\n    function getKey(text, geom, onRight) {\n        var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n        return text + ':' + point.x + ':' + point.y;\n    }\n\n    for (k = 0; k < features.length; k++) {\n        var geom = geometries[k],\n            text = textFeatures[k];\n\n        if (!text) {\n            add(k);\n            continue;\n        }\n\n        var leftKey = getKey(text, geom),\n            rightKey = getKey(text, geom, true);\n\n        if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n            // found lines with the same text adjacent to both ends of the current line, merge all three\n            var j = mergeFromLeft(leftKey, rightKey, geom);\n            var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]);\n\n            delete leftIndex[leftKey];\n            delete rightIndex[rightKey];\n\n            rightIndex[getKey(text, mergedGeom[i], true)] = i;\n            mergedGeom[j] = null;\n\n        } else if (leftKey in rightIndex) {\n            // found mergeable line adjacent to the start of the current line, merge\n            mergeFromRight(leftKey, rightKey, geom);\n\n        } else if (rightKey in leftIndex) {\n            // found mergeable line adjacent to the end of the current line, merge\n            mergeFromLeft(leftKey, rightKey, geom);\n\n        } else {\n            // no adjacent lines, add as a new item\n            add(k);\n            leftIndex[leftKey] = mergedIndex - 1;\n            rightIndex[rightKey] = mergedIndex - 1;\n        }\n    }\n\n    return {\n        features: mergedFeatures,\n        textFeatures: mergedTexts,\n        geometries: mergedGeom\n    };\n};\n\n\n/***/ }),\n/* 1048 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array<Array<Point>>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array<Array<Point>>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n    var clippedLines = [];\n\n    for (var l = 0; l < lines.length; l++) {\n        var line = lines[l];\n        var clippedLine;\n\n        for (var i = 0; i < line.length - 1; i++) {\n            var p0 = line[i];\n            var p1 = line[i + 1];\n\n\n            if (p0.x < x1 && p1.x < x1) {\n                continue;\n            } else if (p0.x < x1) {\n                p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x < x1) {\n                p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y < y1 && p1.y < y1) {\n                continue;\n            } else if (p0.y < y1) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            } else if (p1.y < y1) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            }\n\n            if (p0.x >= x2 && p1.x >= x2) {\n                continue;\n            } else if (p0.x >= x2) {\n                p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x >= x2) {\n                p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y >= y2 && p1.y >= y2) {\n                continue;\n            } else if (p0.y >= y2) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            } else if (p1.y >= y2) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            }\n\n            if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n                clippedLine = [p0];\n                clippedLines.push(clippedLine);\n            }\n\n            clippedLine.push(p1);\n        }\n    }\n\n    return clippedLines;\n}\n\n\n/***/ }),\n/* 1049 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = CollisionFeature;\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @class CollisionFeature\n * @param {Array<Point>} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {Array<string>} layerIDs The IDs of the layers that this CollisionFeature is a part of.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n *\n * @private\n */\nfunction CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) {\n\n    var y1 = shaped.top * boxScale - padding;\n    var y2 = shaped.bottom * boxScale + padding;\n    var x1 = shaped.left * boxScale - padding;\n    var x2 = shaped.right * boxScale + padding;\n\n    this.boxStartIndex = collisionBoxArray.length;\n\n    if (alignLine) {\n\n        var height = y2 - y1;\n        var length = x2 - x1;\n\n        if (height > 0) {\n            // set minimum box height to avoid very many small labels\n            height = Math.max(10 * boxScale, height);\n\n            if (straight) {\n                // used for icon labels that are aligned with the line, but don't curve along it\n                var vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length);\n                var straightLine = [anchor.sub(vector), anchor.add(vector)];\n                this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            } else {\n                // used for text labels that curve along a line\n                this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            }\n        }\n\n    } else {\n        collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    this.boxEndIndex = collisionBoxArray.length;\n}\n\n/**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\nCollisionFeature.prototype._addLineCollisionBoxes = function(collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) {\n    var step = boxSize / 2;\n    var nBoxes = Math.floor(labelLength / step);\n\n    // offset the center of the first box by half a box so that the edge of the\n    // box is at the edge of the label.\n    var firstBoxOffset = -boxSize / 2;\n\n    var bboxes = this.boxes;\n\n    var p = anchor;\n    var index = segment + 1;\n    var anchorDistance = firstBoxOffset;\n\n    // move backwards along the line to the first segment the label appears on\n    do {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        // checkMaxAngle should have already caught this\n        if (index < 0) return bboxes;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    } while (anchorDistance > -labelLength / 2);\n\n    var segmentLength = line[index].dist(line[index + 1]);\n\n    for (var i = 0; i < nBoxes; i++) {\n        // the distance the box will be from the anchor\n        var boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n        // the box is not on the current segment. Move to the next segment.\n        while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n            anchorDistance += segmentLength;\n            index++;\n\n            // There isn't enough room before the end of the line.\n            if (index + 1 >= line.length) return bboxes;\n\n            segmentLength = line[index].dist(line[index + 1]);\n        }\n\n        // the distance the box will be from the beginning of the segment\n        var segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n        var p0 = line[index];\n        var p1 = line[index + 1];\n        var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();\n\n        var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n        var maxScale = labelLength / 2 / distanceToInnerEdge;\n\n        collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,\n                -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale,\n                featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    return bboxes;\n};\n\n\n/***/ }),\n/* 1050 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\nvar loadGeometry = __webpack_require__(153);\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar featureFilter = __webpack_require__(124);\nvar StructArrayType = __webpack_require__(102);\nvar Grid = __webpack_require__(565);\nvar DictionaryCoder = __webpack_require__(1051);\nvar vt = __webpack_require__(196);\nvar Protobuf = __webpack_require__(123);\nvar GeoJSONFeature = __webpack_require__(568);\nvar arraysIntersect = __webpack_require__(10).arraysIntersect;\n\nvar intersection = __webpack_require__(1053);\nvar multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint;\nvar multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon;\nvar multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine;\n\n\nvar FeatureIndexArray = new StructArrayType({\n    members: [\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' }\n    ]});\n\nmodule.exports = FeatureIndex;\n\nfunction FeatureIndex(coord, overscaling, collisionTile) {\n    if (coord.grid) {\n        var serialized = coord;\n        var rawTileData = overscaling;\n        coord = serialized.coord;\n        overscaling = serialized.overscaling;\n        this.grid = new Grid(serialized.grid);\n        this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray);\n        this.rawTileData = rawTileData;\n        this.bucketLayerIDs = serialized.bucketLayerIDs;\n    } else {\n        this.grid = new Grid(EXTENT, 16, 0);\n        this.featureIndexArray = new FeatureIndexArray();\n    }\n    this.coord = coord;\n    this.overscaling = overscaling;\n    this.x = coord.x;\n    this.y = coord.y;\n    this.z = coord.z - Math.log(overscaling) / Math.LN2;\n    this.setCollisionTile(collisionTile);\n}\n\nFeatureIndex.prototype.insert = function(feature, featureIndex, sourceLayerIndex, bucketIndex) {\n    var key = this.featureIndexArray.length;\n    this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);\n    var geometry = loadGeometry(feature);\n\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n\n        // TODO: skip holes when we start using vector tile spec 2.0\n\n        var bbox = [Infinity, Infinity, -Infinity, -Infinity];\n        for (var i = 0; i < ring.length; i++) {\n            var p = ring[i];\n            bbox[0] = Math.min(bbox[0], p.x);\n            bbox[1] = Math.min(bbox[1], p.y);\n            bbox[2] = Math.max(bbox[2], p.x);\n            bbox[3] = Math.max(bbox[3], p.y);\n        }\n\n        this.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n    }\n};\n\nFeatureIndex.prototype.setCollisionTile = function(collisionTile) {\n    this.collisionTile = collisionTile;\n};\n\nFeatureIndex.prototype.serialize = function() {\n    var data = {\n        coord: this.coord,\n        overscaling: this.overscaling,\n        grid: this.grid.toArrayBuffer(),\n        featureIndexArray: this.featureIndexArray.serialize(),\n        bucketLayerIDs: this.bucketLayerIDs\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.featureIndexArray.arrayBuffer]\n    };\n};\n\nfunction translateDistance(translate) {\n    return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\n// Finds features in this tile at a particular position.\nFeatureIndex.prototype.query = function(args, styleLayers) {\n    if (!this.vtLayers) {\n        this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n    }\n\n    var result = {};\n\n    var params = args.params || {},\n        pixelsToTileUnits = EXTENT / args.tileSize / args.scale,\n        filter = featureFilter(params.filter);\n\n    // Features are indexed their original geometries. The rendered geometries may\n    // be buffered, translated or offset. Figure out how much the search radius needs to be\n    // expanded by to include these features.\n    var additionalRadius = 0;\n    for (var id in styleLayers) {\n        var styleLayer = styleLayers[id];\n        var paint = styleLayer.paint;\n\n        var styleLayerDistance = 0;\n        if (styleLayer.type === 'line') {\n            styleLayerDistance = getLineWidth(paint) / 2 + Math.abs(paint['line-offset']) + translateDistance(paint['line-translate']);\n        } else if (styleLayer.type === 'fill') {\n            styleLayerDistance = translateDistance(paint['fill-translate']);\n        } else if (styleLayer.type === 'circle') {\n            styleLayerDistance = paint['circle-radius'] + translateDistance(paint['circle-translate']);\n        }\n        additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits);\n    }\n\n    var queryGeometry = args.queryGeometry.map(function(q) {\n        return q.map(function(p) {\n            return new Point(p.x, p.y);\n        });\n    });\n\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        for (var k = 0; k < ring.length; k++) {\n            var p = ring[k];\n            minX = Math.min(minX, p.x);\n            minY = Math.min(minY, p.y);\n            maxX = Math.max(maxX, p.x);\n            maxY = Math.max(maxY, p.y);\n        }\n    }\n\n    var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius);\n    matching.sort(topDownFeatureComparator);\n    this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    var matchingSymbols = this.collisionTile.queryRenderedSymbols(minX, minY, maxX, maxY, args.scale);\n    matchingSymbols.sort();\n    this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    return result;\n};\n\nfunction topDownFeatureComparator(a, b) {\n    return b - a;\n}\n\nfunction getLineWidth(paint) {\n    if (paint['line-gap-width'] > 0) {\n        return paint['line-gap-width'] + 2 * paint['line-width'];\n    } else {\n        return paint['line-width'];\n    }\n}\n\nFeatureIndex.prototype.filterMatching = function(result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) {\n    var previousIndex;\n    for (var k = 0; k < matching.length; k++) {\n        var index = matching[k];\n\n        // don't check the same feature more than once\n        if (index === previousIndex) continue;\n        previousIndex = index;\n\n        var match = array.get(index);\n\n        var layerIDs = this.bucketLayerIDs[match.bucketIndex];\n        if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue;\n\n        var sourceLayerName = this.sourceLayerCoder.decode(match.sourceLayerIndex);\n        var sourceLayer = this.vtLayers[sourceLayerName];\n        var feature = sourceLayer.feature(match.featureIndex);\n\n        if (!filter(feature)) continue;\n\n        var geometry = null;\n\n        for (var l = 0; l < layerIDs.length; l++) {\n            var layerID = layerIDs[l];\n\n            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n                continue;\n            }\n\n            var styleLayer = styleLayers[layerID];\n            if (!styleLayer) continue;\n\n            var translatedPolygon;\n            if (styleLayer.type !== 'symbol') {\n                // all symbols already match the style\n\n                if (!geometry) geometry = loadGeometry(feature);\n\n                var paint = styleLayer.paint;\n\n                if (styleLayer.type === 'line') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['line-translate'], paint['line-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var halfWidth = getLineWidth(paint) / 2 * pixelsToTileUnits;\n                    if (paint['line-offset']) {\n                        geometry = offsetLine(geometry, paint['line-offset'] * pixelsToTileUnits);\n                    }\n                    if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue;\n\n                } else if (styleLayer.type === 'fill') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['fill-translate'], paint['fill-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue;\n\n                } else if (styleLayer.type === 'circle') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['circle-translate'], paint['circle-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var circleRadius = paint['circle-radius'] * pixelsToTileUnits;\n                    if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue;\n                }\n            }\n\n            var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);\n            geojsonFeature.layer = styleLayer.serialize({\n                includeRefProperties: true\n            });\n            var layerResult = result[layerID];\n            if (layerResult === undefined) {\n                layerResult = result[layerID] = [];\n            }\n            layerResult.push(geojsonFeature);\n        }\n    }\n};\n\nfunction translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {\n    if (!translate[0] && !translate[1]) {\n        return queryGeometry;\n    }\n\n    translate = Point.convert(translate);\n\n    if (translateAnchor === \"viewport\") {\n        translate._rotate(-bearing);\n    }\n\n    var translated = [];\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        var translatedRing = [];\n        for (var k = 0; k < ring.length; k++) {\n            translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits)));\n        }\n        translated.push(translatedRing);\n    }\n    return translated;\n}\n\nfunction offsetLine(rings, offset) {\n    var newRings = [];\n    var zero = new Point(0, 0);\n    for (var k = 0; k < rings.length; k++) {\n        var ring = rings[k];\n        var newRing = [];\n        for (var i = 0; i < ring.length; i++) {\n            var a = ring[i - 1];\n            var b = ring[i];\n            var c = ring[i + 1];\n            var aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n            var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n            var extrude = aToB._add(bToC)._unit();\n\n            var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n            extrude._mult(1 / cosHalfAngle);\n\n            newRing.push(extrude._mult(offset)._add(b));\n        }\n        newRings.push(newRing);\n    }\n    return newRings;\n}\n\n\n/***/ }),\n/* 1051 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = DictionaryCoder;\n\nfunction DictionaryCoder(strings) {\n    this._stringToNumber = {};\n    this._numberToString = [];\n    for (var i = 0; i < strings.length; i++) {\n        var string = strings[i];\n        this._stringToNumber[string] = i;\n        this._numberToString[i] = string;\n    }\n}\n\nDictionaryCoder.prototype.encode = function(string) {\n    assert(string in this._stringToNumber);\n    return this._stringToNumber[string];\n};\n\nDictionaryCoder.prototype.decode = function(n) {\n    assert(n < this._numberToString.length);\n    return this._numberToString[n];\n};\n\n\n/***/ }),\n/* 1052 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar VectorTileLayer = __webpack_require__(566);\n\nmodule.exports = VectorTile;\n\nfunction VectorTile(pbf, end) {\n    this.layers = pbf.readFields(readTile, {}, end);\n}\n\nfunction readTile(tag, layers, pbf) {\n    if (tag === 3) {\n        var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n        if (layer.length) layers[layer.name] = layer;\n    }\n}\n\n\n\n/***/ }),\n/* 1053 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n    multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint,\n    multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon,\n    multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine\n};\n\nfunction multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) {\n    for (var j = 0; j < multiPolygon.length; j++) {\n        var polygon = multiPolygon[j];\n        for (var i = 0; i < rings.length; i++) {\n            var ring = rings[i];\n            for (var k = 0; k < ring.length; k++) {\n                var point = ring[k];\n                if (polygonContainsPoint(polygon, point)) return true;\n                if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) {\n\n    if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) {\n        return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]);\n    }\n\n    for (var m = 0; m < multiPolygonB.length; m++) {\n        var ring = multiPolygonB[m];\n        for (var n = 0; n < ring.length; n++) {\n            if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true;\n        }\n    }\n\n    for (var j = 0; j < multiPolygonA.length; j++) {\n        var polygon = multiPolygonA[j];\n        for (var i = 0; i < polygon.length; i++) {\n            if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true;\n        }\n\n        for (var k = 0; k < multiPolygonB.length; k++) {\n            if (lineIntersectsLine(polygon, multiPolygonB[k])) return true;\n        }\n    }\n\n    return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) {\n    for (var i = 0; i < multiLine.length; i++) {\n        var line = multiLine[i];\n\n        for (var j = 0; j < multiPolygon.length; j++) {\n            var polygon = multiPolygon[j];\n\n            if (polygon.length >= 3) {\n                for (var k = 0; k < line.length; k++) {\n                    if (polygonContainsPoint(polygon, line[k])) return true;\n                }\n            }\n\n            if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA, lineB, radius) {\n\n    if (lineA.length > 1) {\n        if (lineIntersectsLine(lineA, lineB)) return true;\n\n        // Check whether any point in either line is within radius of the other line\n        for (var j = 0; j < lineB.length; j++) {\n            if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n        }\n    }\n\n    for (var k = 0; k < lineA.length; k++) {\n        if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n    }\n\n    return false;\n}\n\nfunction lineIntersectsLine(lineA, lineB) {\n    for (var i = 0; i < lineA.length - 1; i++) {\n        var a0 = lineA[i];\n        var a1 = lineA[i + 1];\n        for (var j = 0; j < lineB.length - 1; j++) {\n            var b0 = lineB[j];\n            var b1 = lineB[j + 1];\n            if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n        }\n    }\n    return false;\n}\n\n\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nfunction isCounterClockwise(a, b, c) {\n    return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n}\n\nfunction lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {\n    return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n        isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p, line, radius) {\n    var radiusSquared = radius * radius;\n\n    if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n    for (var i = 1; i < line.length; i++) {\n        // Find line segments that have a distance <= radius^2 to p\n        // In that case, we treat the line as \"containing point p\".\n        var v = line[i - 1], w = line[i];\n        if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n    }\n    return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n    var l2 = v.distSqr(w);\n    if (l2 === 0) return p.distSqr(v);\n    var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n    if (t < 0) return p.distSqr(v);\n    if (t > 1) return p.distSqr(w);\n    return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings, p) {\n    var c = false,\n        ring, p1, p2;\n\n    for (var k = 0; k < rings.length; k++) {\n        ring = rings[k];\n        for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            p1 = ring[i];\n            p2 = ring[j];\n            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n                c = !c;\n            }\n        }\n    }\n    return c;\n}\n\nfunction polygonContainsPoint(ring, p) {\n    var c = false;\n    for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        var p1 = ring[i];\n        var p2 = ring[j];\n        if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n            c = !c;\n        }\n    }\n    return c;\n}\n\n\n/***/ }),\n/* 1054 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar Grid = __webpack_require__(565);\n\nmodule.exports = CollisionTile;\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @class CollisionTile\n * @param {number} angle\n * @param {number} pitch\n * @private\n */\nfunction CollisionTile(angle, pitch, collisionBoxArray) {\n    if (typeof angle === 'object') {\n        var serialized = angle;\n        collisionBoxArray = pitch;\n        angle = serialized.angle;\n        pitch = serialized.pitch;\n        this.grid = new Grid(serialized.grid);\n        this.ignoredGrid = new Grid(serialized.ignoredGrid);\n    } else {\n        this.grid = new Grid(EXTENT, 12, 6);\n        this.ignoredGrid = new Grid(EXTENT, 12, 0);\n    }\n\n    this.angle = angle;\n    this.pitch = pitch;\n\n    var sin = Math.sin(angle),\n        cos = Math.cos(angle);\n    this.rotationMatrix = [cos, -sin, sin, cos];\n    this.reverseRotationMatrix = [cos, sin, -sin, cos];\n\n    // Stretch boxes in y direction to account for the map tilt.\n    this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n    // The amount the map is squished depends on the y position.\n    // Sort of account for this by making all boxes a bit bigger.\n    this.yStretch = Math.pow(this.yStretch, 1.3);\n\n    this.collisionBoxArray = collisionBoxArray;\n    if (collisionBoxArray.length === 0) {\n        // the first collisionBoxArray is passed to a CollisionTile\n\n        // tempCollisionBox\n        collisionBoxArray.emplaceBack();\n\n        var maxInt16 = 32767;\n        //left\n        collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // right\n        collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // top\n        collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // bottom\n        collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n    }\n\n    this.tempCollisionBox = collisionBoxArray.get(0);\n    this.edges = [\n        collisionBoxArray.get(1),\n        collisionBoxArray.get(2),\n        collisionBoxArray.get(3),\n        collisionBoxArray.get(4)\n    ];\n}\n\nCollisionTile.prototype.serialize = function() {\n    var data = {\n        angle: this.angle,\n        pitch: this.pitch,\n        grid: this.grid.toArrayBuffer(),\n        ignoredGrid: this.ignoredGrid.toArrayBuffer()\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.ignoredGrid]\n    };\n};\n\nCollisionTile.prototype.minScale = 0.25;\nCollisionTile.prototype.maxScale = 2;\n\n\n/**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\nCollisionTile.prototype.placeCollisionFeature = function(collisionFeature, allowOverlap, avoidEdges) {\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var minPlacementScale = this.minScale;\n    var rotationMatrix = this.rotationMatrix;\n    var yStretch = this.yStretch;\n\n    for (var b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) {\n\n        var box = collisionBoxArray.get(b);\n\n        var anchorPoint = box.anchorPoint._matMult(rotationMatrix);\n        var x = anchorPoint.x;\n        var y = anchorPoint.y;\n\n        var x1 = x + box.x1;\n        var y1 = y + box.y1 * yStretch;\n        var x2 = x + box.x2;\n        var y2 = y + box.y2 * yStretch;\n\n        box.bbox0 = x1;\n        box.bbox1 = y1;\n        box.bbox2 = x2;\n        box.bbox3 = y2;\n\n        if (!allowOverlap) {\n            var blockingBoxes = this.grid.query(x1, y1, x2, y2);\n\n            for (var i = 0; i < blockingBoxes.length; i++) {\n                var blocking = collisionBoxArray.get(blockingBoxes[i]);\n                var blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix);\n\n                minPlacementScale = this.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n\n        if (avoidEdges) {\n            var rotatedCollisionBox;\n\n            if (this.angle) {\n                var reverseRotationMatrix = this.reverseRotationMatrix;\n                var tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix);\n                var tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix);\n                var bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix);\n                var br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix);\n\n                rotatedCollisionBox = this.tempCollisionBox;\n                rotatedCollisionBox.anchorPointX = box.anchorPoint.x;\n                rotatedCollisionBox.anchorPointY = box.anchorPoint.y;\n                rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.maxScale = box.maxScale;\n            } else {\n                rotatedCollisionBox = box;\n            }\n\n            for (var k = 0; k < this.edges.length; k++) {\n                var edgeBox = this.edges[k];\n                minPlacementScale = this.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n    }\n\n    return minPlacementScale;\n};\n\nCollisionTile.prototype.queryRenderedSymbols = function(minX, minY, maxX, maxY, scale) {\n    var sourceLayerFeatures = {};\n    var result = [];\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var rotationMatrix = this.rotationMatrix;\n    var anchorPoint = new Point(minX, minY)._matMult(rotationMatrix);\n\n    var queryBox = this.tempCollisionBox;\n    queryBox.anchorX = anchorPoint.x;\n    queryBox.anchorY = anchorPoint.y;\n    queryBox.x1 = 0;\n    queryBox.y1 = 0;\n    queryBox.x2 = maxX - minX;\n    queryBox.y2 = maxY - minY;\n    queryBox.maxScale = scale;\n\n    // maxScale is stored using a Float32. Convert `scale` to the stored Float32 value.\n    scale = queryBox.maxScale;\n\n    var searchBox = [\n        anchorPoint.x + queryBox.x1 / scale,\n        anchorPoint.y + queryBox.y1 / scale * this.yStretch,\n        anchorPoint.x + queryBox.x2 / scale,\n        anchorPoint.y + queryBox.y2 / scale * this.yStretch\n    ];\n\n    var blockingBoxKeys = this.grid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    var blockingBoxKeys2 = this.ignoredGrid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    for (var k = 0; k < blockingBoxKeys2.length; k++) {\n        blockingBoxKeys.push(blockingBoxKeys2[k]);\n    }\n\n    for (var i = 0; i < blockingBoxKeys.length; i++) {\n        var blocking = collisionBoxArray.get(blockingBoxKeys[i]);\n\n        var sourceLayer = blocking.sourceLayerIndex;\n        var featureIndex = blocking.featureIndex;\n        if (sourceLayerFeatures[sourceLayer] === undefined) {\n            sourceLayerFeatures[sourceLayer] = {};\n        }\n\n        if (!sourceLayerFeatures[sourceLayer][featureIndex]) {\n            var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix);\n            var minPlacementScale = this.getPlacementScale(this.minScale, anchorPoint, queryBox, blockingAnchorPoint, blocking);\n            if (minPlacementScale >= scale) {\n                sourceLayerFeatures[sourceLayer][featureIndex] = true;\n                result.push(blockingBoxKeys[i]);\n            }\n        }\n    }\n\n    return result;\n};\n\nCollisionTile.prototype.getPlacementScale = function(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) {\n\n    // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n    // Original algorithm:\n    var anchorDiffX = anchorPoint.x - blockingAnchorPoint.x;\n    var anchorDiffY = anchorPoint.y - blockingAnchorPoint.y;\n    var s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box\n    var s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box\n    var s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box\n    var s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box\n\n    if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n    if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n    var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n    var blockingMaxScale = blocking.maxScale;\n    var boxMaxScale = box.maxScale;\n\n    if (collisionFreeScale > blockingMaxScale) {\n        // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n        // so unblock the new box at the scale that the old box disappears.\n        collisionFreeScale = blockingMaxScale;\n    }\n\n    if (collisionFreeScale > boxMaxScale) {\n        // If the box can only be shown after it is visible, then the box can never be shown.\n        // But the label can be shown after this box is not visible.\n        collisionFreeScale = boxMaxScale;\n    }\n\n    if (collisionFreeScale > minPlacementScale &&\n            collisionFreeScale >= blocking.placementScale) {\n        // If this collision occurs at a lower scale than previously found collisions\n        // and the collision occurs while the other label is visible\n\n        // this this is the lowest scale at which the label won't collide with anything\n        minPlacementScale = collisionFreeScale;\n    }\n\n    return minPlacementScale;\n};\n\n\n/**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\nCollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale, ignorePlacement) {\n\n    var grid = ignorePlacement ? this.ignoredGrid : this.grid;\n    var collisionBoxArray = this.collisionBoxArray;\n\n    for (var k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) {\n        var box = collisionBoxArray.get(k);\n        box.placementScale = minPlacementScale;\n        if (minPlacementScale < this.maxScale) {\n            grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3);\n        }\n    }\n};\n\n\n/***/ }),\n/* 1055 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(102);\nvar util = __webpack_require__(10);\nvar Point = __webpack_require__(11);\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBoxArray\n * @private\n */\n\nvar CollisionBoxArray = module.exports = new StructArrayType({\n    members: [\n        // the box is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // distances to the edges from the anchor\n        { type: 'Int16', name: 'x1' },\n        { type: 'Int16', name: 'y1' },\n        { type: 'Int16', name: 'x2' },\n        { type: 'Int16', name: 'y2' },\n\n        // the box is only valid for scales < maxScale.\n        // The box does not block other boxes at scales >= maxScale;\n        { type: 'Float32', name: 'maxScale' },\n\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' },\n\n        // rotated and scaled bbox used for indexing\n        { type: 'Int16', name: 'bbox0' },\n        { type: 'Int16', name: 'bbox1' },\n        { type: 'Int16', name: 'bbox2' },\n        { type: 'Int16', name: 'bbox3' },\n\n        { type: 'Float32', name: 'placementScale' }\n    ]});\n\nutil.extendAll(CollisionBoxArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n/***/ }),\n/* 1056 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(102);\nvar util = __webpack_require__(10);\nvar Point = __webpack_require__(11);\n\n/*\n *\n * A StructArray implementation of symbolInstances from data/bucket/symbol_bucket.js\n * this will allow symbolInstances to be transferred between the worker and main threads\n *\n * @class SymbolInstanceArray\n * @private\n */\n\nvar SymbolInstancesArray = module.exports = new StructArrayType({\n    members: [\n\n        { type: 'Uint16', name: 'textBoxStartIndex' },\n        { type: 'Uint16', name: 'textBoxEndIndex' },\n        { type: 'Uint16', name: 'iconBoxStartIndex' },\n        { type: 'Uint16', name: 'iconBoxEndIndex' },\n        { type: 'Uint16', name: 'glyphQuadStartIndex' },\n        { type: 'Uint16', name: 'glyphQuadEndIndex' },\n        { type: 'Uint16', name: 'iconQuadStartIndex' },\n        { type: 'Uint16', name: 'iconQuadEndIndex' },\n\n        // each symbolInstance is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // index -- not sure if we need this -@mollymerp\n        { type: 'Int8', name: 'index' }\n    ]\n});\n\nutil.extendAll(SymbolInstancesArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n\n/***/ }),\n/* 1057 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(102);\nvar util = __webpack_require__(10);\nvar Point = __webpack_require__(11);\nvar SymbolQuad = __webpack_require__(564).SymbolQuad;\n\n// notes from ansis on slack:\n// it would be best if they are added to a buffer in advance so that they are only created once. There would be a separate buffer with all the individual collision boxes and then SymbolInstance would store the beginning and end indexes of a feature's collisionboxes. CollisionFeature wouldn't really exist as a standalone thing, it would just be a range of boxes in the big collision box buffer\n\n/*\n *\n * A StructArray implementation of glyphQuad from symbol/quads\n * this will allow glyph quads to be transferred between the worker and main threads along with the rest of\n * the symbolInstances\n *\n * @class SymbolQuadsArray\n * @private\n */\n\nvar SymbolQuadsArray = module.exports = new StructArrayType({\n    members: [\n        // the quad is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // the offsets of the tl (top-left), tr, bl, br corners from the anchor point\n        // do these need to be floats?\n        { type: 'Float32', name: 'tlX' },\n        { type: 'Float32', name: 'tlY' },\n        { type: 'Float32', name: 'trX' },\n        { type: 'Float32', name: 'trY' },\n        { type: 'Float32', name: 'blX' },\n        { type: 'Float32', name: 'blY' },\n        { type: 'Float32', name: 'brX' },\n        { type: 'Float32', name: 'brY' },\n\n        // texture coordinates (height, width, x, and y)\n        { type: 'Int16', name: 'texH' },\n        { type: 'Int16', name: 'texW' },\n        { type: 'Int16', name: 'texX' },\n        { type: 'Int16', name: 'texY' },\n\n        //the angle of the label at it's center, not the angle of this quad.\n        { type: 'Float32', name: 'angle' },\n\n        // quad is only valid for scales < maxScale && scale > minScale.\n        { type: 'Float32', name: 'maxScale' },\n        { type: 'Float32', name: 'minScale' }\n    ]\n});\n\nutil.extendAll(SymbolQuadsArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    },\n    get SymbolQuad() {\n        return new SymbolQuad(this.anchorPoint,\n            new Point(this.tlX, this.tlY),\n            new Point(this.trX, this.trY),\n            new Point(this.blX, this.blY),\n            new Point(this.brX, this.brY),\n            { x: this.texX, y: this.texY, h: this.texH, w: this.texW, height: this.texH, width: this.texW },\n            this.angle,\n            this.minScale,\n            this.maxScale);\n    }\n});\n\n\n\n/***/ }),\n/* 1058 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LRUCache;\n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n * @private\n */\nfunction LRUCache(max, onRemove) {\n    this.max = max;\n    this.onRemove = onRemove;\n    this.reset();\n}\n\n/**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.reset = function() {\n    for (var key in this.data) {\n        this.onRemove(this.data[key]);\n    }\n\n    this.data = {};\n    this.order = [];\n\n    return this;\n};\n\n/**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.add = function(key, data) {\n\n    if (this.has(key)) {\n        this.order.splice(this.order.indexOf(key), 1);\n        this.data[key] = data;\n        this.order.push(key);\n\n    } else {\n        this.data[key] = data;\n        this.order.push(key);\n\n        if (this.order.length > this.max) {\n            var removedData = this.get(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n    }\n\n    return this;\n};\n\n/**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\nLRUCache.prototype.has = function(key) {\n    return key in this.data;\n};\n\n/**\n * List all keys in the cache\n *\n * @returns {Array<string>} an array of keys in this cache.\n * @private\n */\nLRUCache.prototype.keys = function() {\n    return this.order;\n};\n\n/**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\nLRUCache.prototype.get = function(key) {\n    if (!this.has(key)) { return null; }\n\n    var data = this.data[key];\n\n    delete this.data[key];\n    this.order.splice(this.order.indexOf(key), 1);\n\n    return data;\n};\n\n/**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.setMaxSize = function(max) {\n    this.max = max;\n\n    while (this.order.length > this.max) {\n        var removedData = this.get(this.order[0]);\n        if (removedData) this.onRemove(removedData);\n    }\n\n    return this;\n};\n\n\n/***/ }),\n/* 1059 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(39);\nvar mat4 = __webpack_require__(90).mat4;\nvar FrameHistory = __webpack_require__(1065);\nvar TilePyramid = __webpack_require__(195);\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar pixelsToTileUnits = __webpack_require__(155);\nvar util = __webpack_require__(10);\nvar StructArrayType = __webpack_require__(102);\nvar Buffer = __webpack_require__(151);\nvar VertexArrayObject = __webpack_require__(152);\nvar RasterBoundsArray = __webpack_require__(197).RasterBoundsArray;\nvar createUniformPragmas = __webpack_require__(576);\n\nmodule.exports = Painter;\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nfunction Painter(gl, transform) {\n    this.gl = gl;\n    this.transform = transform;\n\n    this.reusableTextures = {};\n    this.preFbos = {};\n\n    this.frameHistory = new FrameHistory();\n\n    this.setup();\n\n    // Within each layer there are multiple distinct z-planes that can be drawn to.\n    // This is implemented using the WebGL depth buffer.\n    this.numSublayers = TilePyramid.maxUnderzooming + TilePyramid.maxOverzooming + 1;\n    this.depthEpsilon = 1 / Math.pow(2, 16);\n\n    this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n}\n\nutil.extend(Painter.prototype, __webpack_require__(1066));\n\n/*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\nPainter.prototype.resize = function(width, height) {\n    var gl = this.gl;\n\n    this.width = width * browser.devicePixelRatio;\n    this.height = height * browser.devicePixelRatio;\n    gl.viewport(0, 0, this.width, this.height);\n\n};\n\nPainter.prototype.setup = function() {\n    var gl = this.gl;\n\n    gl.verbose = true;\n\n    // We are blending the new pixels *behind* the existing pixels. That way we can\n    // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.enable(gl.STENCIL_TEST);\n\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n\n    this._depthMask = false;\n    gl.depthMask(false);\n\n    var PosArray = this.PosArray = new StructArrayType({\n        members: [{ name: 'a_pos', type: 'Int16', components: 2 }]\n    });\n\n    var tileExtentArray = new PosArray();\n    tileExtentArray.emplaceBack(0, 0);\n    tileExtentArray.emplaceBack(EXTENT, 0);\n    tileExtentArray.emplaceBack(0, EXTENT);\n    tileExtentArray.emplaceBack(EXTENT, EXTENT);\n    this.tileExtentBuffer = new Buffer(tileExtentArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.tileExtentVAO = new VertexArrayObject();\n    this.tileExtentPatternVAO = new VertexArrayObject();\n\n    var debugArray = new PosArray();\n    debugArray.emplaceBack(0, 0);\n    debugArray.emplaceBack(EXTENT, 0);\n    debugArray.emplaceBack(EXTENT, EXTENT);\n    debugArray.emplaceBack(0, EXTENT);\n    debugArray.emplaceBack(0, 0);\n    this.debugBuffer = new Buffer(debugArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.debugVAO = new VertexArrayObject();\n\n    var rasterBoundsArray = new RasterBoundsArray();\n    rasterBoundsArray.emplaceBack(0, 0, 0, 0);\n    rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0);\n    rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767);\n    rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767);\n    this.rasterBoundsBuffer = new Buffer(rasterBoundsArray.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n    this.rasterBoundsVAO = new VertexArrayObject();\n};\n\n/*\n * Reset the color buffers of the drawing canvas.\n */\nPainter.prototype.clearColor = function() {\n    var gl = this.gl;\n    gl.clearColor(0, 0, 0, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n};\n\n/*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\nPainter.prototype.clearStencil = function() {\n    var gl = this.gl;\n    gl.clearStencil(0x0);\n    gl.stencilMask(0xFF);\n    gl.clear(gl.STENCIL_BUFFER_BIT);\n};\n\nPainter.prototype.clearDepth = function() {\n    var gl = this.gl;\n    gl.clearDepth(1);\n    this.depthMask(true);\n    gl.clear(gl.DEPTH_BUFFER_BIT);\n};\n\nPainter.prototype._renderTileClippingMasks = function(coords) {\n    var gl = this.gl;\n    gl.colorMask(false, false, false, false);\n    this.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n    gl.enable(gl.STENCIL_TEST);\n\n    // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills.\n    gl.stencilMask(0xF8);\n    // Tests will always pass, and ref value will be written to stencil buffer.\n    gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n\n    var idNext = 1;\n    this._tileClippingMaskIDs = {};\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var id = this._tileClippingMaskIDs[coord.id] = (idNext++) << 3;\n\n        gl.stencilFunc(gl.ALWAYS, id, 0xF8);\n\n        var pragmas = createUniformPragmas([{name: 'u_color', components: 4}]);\n        var program = this.useProgram('fill', [], pragmas, pragmas);\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        // Draw the clipping mask\n        this.tileExtentVAO.bind(gl, program, this.tileExtentBuffer);\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.colorMask(true, true, true, true);\n    this.depthMask(true);\n    gl.enable(gl.DEPTH_TEST);\n};\n\nPainter.prototype.enableTileClippingMask = function(coord) {\n    var gl = this.gl;\n    gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8);\n};\n\n// Overridden by headless tests.\nPainter.prototype.prepareBuffers = function() {};\nPainter.prototype.bindDefaultFramebuffer = function() {\n    var gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\nvar draw = {\n    symbol: __webpack_require__(1068),\n    circle: __webpack_require__(1070),\n    line: __webpack_require__(1071),\n    fill: __webpack_require__(1072),\n    raster: __webpack_require__(197),\n    background: __webpack_require__(1073),\n    debug: __webpack_require__(1074)\n};\n\nPainter.prototype.render = function(style, options) {\n    this.style = style;\n    this.options = options;\n\n    this.lineAtlas = style.lineAtlas;\n\n    this.spriteAtlas = style.spriteAtlas;\n    this.spriteAtlas.setSprite(style.sprite);\n\n    this.glyphSource = style.glyphSource;\n\n    this.frameHistory.record(this.transform.zoom);\n\n    this.prepareBuffers();\n    this.clearColor();\n    this.clearDepth();\n\n    this.showOverdrawInspector(options.showOverdrawInspector);\n\n    this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon;\n\n    this.renderPass({isOpaquePass: true});\n    this.renderPass({isOpaquePass: false});\n};\n\nPainter.prototype.renderPass = function(options) {\n    var groups = this.style._groups;\n    var isOpaquePass = options.isOpaquePass;\n    this.currentLayer = isOpaquePass ? this.style._order.length : -1;\n\n    for (var i = 0; i < groups.length; i++) {\n        var group = groups[isOpaquePass ? groups.length - 1 - i : i];\n        var source = this.style.sources[group.source];\n\n        var j;\n        var coords = [];\n        if (source) {\n            coords = source.getVisibleCoordinates();\n            for (j = 0; j < coords.length; j++) {\n                coords[j].posMatrix = this.transform.calculatePosMatrix(coords[j], source.maxzoom);\n            }\n            this.clearStencil();\n            if (source.prepare) source.prepare();\n            if (source.isTileClipped) {\n                this._renderTileClippingMasks(coords);\n            }\n        }\n\n        if (isOpaquePass) {\n            if (!this._showOverdrawInspector) {\n                this.gl.disable(this.gl.BLEND);\n            }\n            this.isOpaquePass = true;\n        } else {\n            this.gl.enable(this.gl.BLEND);\n            this.isOpaquePass = false;\n            coords.reverse();\n        }\n\n        for (j = 0; j < group.length; j++) {\n            var layer = group[isOpaquePass ? group.length - 1 - j : j];\n            this.currentLayer += isOpaquePass ? -1 : 1;\n            this.renderLayer(this, source, layer, coords);\n        }\n\n        if (source) {\n            draw.debug(this, source, coords);\n        }\n    }\n};\n\nPainter.prototype.depthMask = function(mask) {\n    if (mask !== this._depthMask) {\n        this._depthMask = mask;\n        this.gl.depthMask(mask);\n    }\n};\n\nPainter.prototype.renderLayer = function(painter, source, layer, coords) {\n    if (layer.isHidden(this.transform.zoom)) return;\n    if (layer.type !== 'background' && !coords.length) return;\n    this.id = layer.id;\n    draw[layer.type](painter, source, layer, coords);\n};\n\nPainter.prototype.setDepthSublayer = function(n) {\n    var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n    var nearDepth = farDepth - 1 + this.depthRange;\n    this.gl.depthRange(nearDepth, farDepth);\n};\n\nPainter.prototype.translatePosMatrix = function(matrix, tile, translate, anchor) {\n    if (!translate[0] && !translate[1]) return matrix;\n\n    if (anchor === 'viewport') {\n        var sinA = Math.sin(-this.transform.angle);\n        var cosA = Math.cos(-this.transform.angle);\n        translate = [\n            translate[0] * cosA - translate[1] * sinA,\n            translate[0] * sinA + translate[1] * cosA\n        ];\n    }\n\n    var translation = [\n        pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n        pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n        0\n    ];\n\n    var translatedMatrix = new Float32Array(16);\n    mat4.translate(translatedMatrix, matrix, translation);\n    return translatedMatrix;\n};\n\nPainter.prototype.saveTexture = function(texture) {\n    var textures = this.reusableTextures[texture.size];\n    if (!textures) {\n        this.reusableTextures[texture.size] = [texture];\n    } else {\n        textures.push(texture);\n    }\n};\n\n\nPainter.prototype.getTexture = function(size) {\n    var textures = this.reusableTextures[size];\n    return textures && textures.length > 0 ? textures.pop() : null;\n};\n\nPainter.prototype.lineWidth = function(width) {\n    this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1]));\n};\n\nPainter.prototype.showOverdrawInspector = function(enabled) {\n    if (!enabled && !this._showOverdrawInspector) return;\n    this._showOverdrawInspector = enabled;\n\n    var gl = this.gl;\n    if (enabled) {\n        gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE);\n        var numOverdrawSteps = 8;\n        var a = 1 / numOverdrawSteps;\n        gl.blendColor(a, a, a, 0);\n        gl.clearColor(0, 0, 0, 1);\n        gl.clear(gl.COLOR_BUFFER_BIT);\n    } else {\n        gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    }\n};\n\n\n/***/ }),\n/* 1060 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\nvar mat2 = {};\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\nmat2.fromValues = function(m00, m01, m10, m11) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\nmat2.set = function(out, m00, m01, m10, m11) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a1 = a[1];\n        out[1] = a[2];\n        out[2] = a1;\n    } else {\n        out[0] = a[0];\n        out[1] = a[2];\n        out[2] = a[1];\n        out[3] = a[3];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n        // Calculate the determinant\n        det = a0 * a3 - a2 * a1;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n    \n    out[0] =  a3 * det;\n    out[1] = -a1 * det;\n    out[2] = -a2 * det;\n    out[3] =  a0 * det;\n\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n    // Caching this value is nessecary if out == a\n    var a0 = a[0];\n    out[0] =  a[3];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] =  a0;\n\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n    return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.fromRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2} out\n */\nmat2.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n    return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {mat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)))\n};\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {mat2} L the lower triangular matrix \n * @param {mat2} D the diagonal matrix \n * @param {mat2} U the upper triangular matrix \n * @param {mat2} a the input matrix to factorize\n */\n\nmat2.LDU = function (L, D, U, a) { \n    L[2] = a[2]/a[0]; \n    U[0] = a[0]; \n    U[1] = a[1]; \n    U[3] = a[3] - L[2] * U[1]; \n    return [L, D, U];       \n}; \n\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\nmat2.sub = mat2.subtract;\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\nmat2.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\nmat2.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\nmodule.exports = mat2;\n\n\n/***/ }),\n/* 1061 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n * <pre>\n * [a, c, tx,\n *  b, d, ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, c, tx,\n *  b, d, ty,\n *  0, 0, 1]\n * </pre>\n * The last row is ignored so the array is shorter and operations are faster.\n */\nvar mat2d = {};\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\nmat2d.fromValues = function(a, b, c, d, tx, ty) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\nmat2d.set = function(out, a, b, c, d, tx, ty) {\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n    var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n        atx = a[4], aty = a[5];\n\n    var det = aa * ad - ab * ac;\n    if(!det){\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = ad * det;\n    out[1] = -ab * det;\n    out[2] = -ac * det;\n    out[3] = aa * det;\n    out[4] = (ac * aty - ad * atx) * det;\n    out[5] = (ab * atx - aa * aty) * det;\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n    return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    out[4] = a0 * b4 + a2 * b5 + a4;\n    out[5] = a1 * b4 + a3 * b5 + a5;\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0;\n    out[1] = a1;\n    out[2] = a2;\n    out[3] = a3;\n    out[4] = a0 * v0 + a2 * v1 + a4;\n    out[5] = a1 * v0 + a3 * v1 + a5;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2d} out\n */\nmat2d.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat2d} out\n */\nmat2d.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = v[0];\n    out[5] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n    return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {mat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2d.frob = function (a) { \n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1))\n}; \n\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\nmat2d.sub = mat2d.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\nmat2d.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    return out;\n};\n\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\nmat2d.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)));\n};\n\nmodule.exports = mat2d;\n\n\n/***/ }),\n/* 1062 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {\n  scalar: {},\n  SIMD: {},\n};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nmat4.fromValues = function(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nmat4.set = function(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3],\n            a12 = a[6], a13 = a[7],\n            a23 = a[11];\n\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.transpose = function(out, a) {\n    var a0, a1, a2, a3,\n        tmp01, tmp23,\n        out0, out1, out2, out3;\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    a1 = SIMD.Float32x4.load(a, 4);\n    a2 = SIMD.Float32x4.load(a, 8);\n    a3 = SIMD.Float32x4.load(a, 12);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n    out0  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out1  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 0,  out0);\n    SIMD.Float32x4.store(out, 4,  out1);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n    out2  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out3  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 8,  out2);\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Transpse a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = glMatrix.USE_SIMD ? mat4.SIMD.transpose : mat4.scalar.transpose;\n\n/**\n * Inverts a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n};\n\n/**\n * Inverts a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.invert = function(out, a) {\n  var row0, row1, row2, row3,\n      tmp1,\n      minor0, minor1, minor2, minor3,\n      det,\n      a0 = SIMD.Float32x4.load(a, 0),\n      a1 = SIMD.Float32x4.load(a, 4),\n      a2 = SIMD.Float32x4.load(a, 8),\n      a3 = SIMD.Float32x4.load(a, 12);\n\n  // Compute matrix adjugate\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  // Compute matrix determinant\n  det   = SIMD.Float32x4.mul(row0, minor0);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 2, 3, 0, 1), det);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 1, 0, 3, 2), det);\n  tmp1  = SIMD.Float32x4.reciprocalApproximation(det);\n  det   = SIMD.Float32x4.sub(\n               SIMD.Float32x4.add(tmp1, tmp1),\n               SIMD.Float32x4.mul(det, SIMD.Float32x4.mul(tmp1, tmp1)));\n  det   = SIMD.Float32x4.swizzle(det, 0, 0, 0, 0);\n  if (!det) {\n      return null;\n  }\n\n  // Compute matrix inverse\n  SIMD.Float32x4.store(out, 0,  SIMD.Float32x4.mul(det, minor0));\n  SIMD.Float32x4.store(out, 4,  SIMD.Float32x4.mul(det, minor1));\n  SIMD.Float32x4.store(out, 8,  SIMD.Float32x4.mul(det, minor2));\n  SIMD.Float32x4.store(out, 12, SIMD.Float32x4.mul(det, minor3));\n  return out;\n}\n\n/**\n * Inverts a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = glMatrix.USE_SIMD ? mat4.SIMD.invert : mat4.scalar.invert;\n\n/**\n * Calculates the adjugate of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    out[0]  =  (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n    out[1]  = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n    out[2]  =  (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n    out[3]  = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n    out[4]  = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n    out[5]  =  (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n    out[6]  = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n    out[7]  =  (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n    out[8]  =  (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n    out[9]  = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n    out[10] =  (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n    out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n    out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n    out[13] =  (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n    out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n    out[15] =  (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.adjoint = function(out, a) {\n  var a0, a1, a2, a3;\n  var row0, row1, row2, row3;\n  var tmp1;\n  var minor0, minor1, minor2, minor3;\n\n  var a0 = SIMD.Float32x4.load(a, 0);\n  var a1 = SIMD.Float32x4.load(a, 4);\n  var a2 = SIMD.Float32x4.load(a, 8);\n  var a3 = SIMD.Float32x4.load(a, 12);\n\n  // Transpose the source matrix.  Sort of.  Not a true transpose operation\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  SIMD.Float32x4.store(out, 0,  minor0);\n  SIMD.Float32x4.store(out, 4,  minor1);\n  SIMD.Float32x4.store(out, 8,  minor2);\n  SIMD.Float32x4.store(out, 12, minor3);\n  return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n mat4.adjoint = glMatrix.USE_SIMD ? mat4.SIMD.adjoint : mat4.scalar.adjoint;\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's explicitly using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand, must be a Float32Array\n * @param {mat4} b the second operand, must be a Float32Array\n * @returns {mat4} out\n */\nmat4.SIMD.multiply = function (out, a, b) {\n    var a0 = SIMD.Float32x4.load(a, 0);\n    var a1 = SIMD.Float32x4.load(a, 4);\n    var a2 = SIMD.Float32x4.load(a, 8);\n    var a3 = SIMD.Float32x4.load(a, 12);\n\n    var b0 = SIMD.Float32x4.load(b, 0);\n    var out0 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 0, out0);\n\n    var b1 = SIMD.Float32x4.load(b, 4);\n    var out1 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 4, out1);\n\n    var b2 = SIMD.Float32x4.load(b, 8);\n    var out2 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 2, 2, 2, 2), a2),\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 8, out2);\n\n    var b3 = SIMD.Float32x4.load(b, 12);\n    var out3 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                        SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 1, 1, 1, 1), a1),\n                        SIMD.Float32x4.add(\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 2, 2, 2, 2), a2),\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Multiplies two mat4's explicitly not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.scalar.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    // Cache only the current line of the second matrix\n    var b0  = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n    out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n    out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n    out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n    return out;\n};\n\n/**\n * Multiplies two mat4's using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = glMatrix.USE_SIMD ? mat4.SIMD.multiply : mat4.scalar.multiply;\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.scalar.translate = function (out, a, v) {\n    var x = v[0], y = v[1], z = v[2],\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23;\n\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n        a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n        a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n        out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n        out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n        out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.SIMD.translate = function (out, a, v) {\n    var a0 = SIMD.Float32x4.load(a, 0),\n        a1 = SIMD.Float32x4.load(a, 4),\n        a2 = SIMD.Float32x4.load(a, 8),\n        a3 = SIMD.Float32x4.load(a, 12),\n        vec = SIMD.Float32x4(v[0], v[1], v[2] , 0);\n\n    if (a !== out) {\n        out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n        out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n        out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n    }\n\n    a0 = SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0));\n    a1 = SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1));\n    a2 = SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2));\n\n    var t0 = SIMD.Float32x4.add(a0, SIMD.Float32x4.add(a1, SIMD.Float32x4.add(a2, a3)));\n    SIMD.Float32x4.store(out, 12, t0);\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = glMatrix.USE_SIMD ? mat4.SIMD.translate : mat4.scalar.translate;\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scalar.scale = function(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.SIMD.scale = function(out, a, v) {\n    var a0, a1, a2;\n    var vec = SIMD.Float32x4(v[0], v[1], v[2], 0);\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    SIMD.Float32x4.store(\n        out, 0, SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0)));\n\n    a1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(\n        out, 4, SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1)));\n\n    a2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(\n        out, 8, SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2)));\n\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n */\nmat4.scale = glMatrix.USE_SIMD ? mat4.SIMD.scale : mat4.scalar.scale;\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t,\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23,\n        b00, b01, b02,\n        b10, b11, b12,\n        b20, b21, b22;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n    a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n    a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateX = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[0]  = a[0];\n        out[1]  = a[1];\n        out[2]  = a[2];\n        out[3]  = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateX = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n      out[0]  = a[0];\n      out[1]  = a[1];\n      out[2]  = a[2];\n      out[3]  = a[3];\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_2, c), SIMD.Float32x4.mul(a_1, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD if availabe and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = glMatrix.USE_SIMD ? mat4.SIMD.rotateX : mat4.scalar.rotateX;\n\n/**\n * Rotates a matrix by the given angle around the Y axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateY = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateY = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, s), SIMD.Float32x4.mul(a_2, c)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateY = glMatrix.USE_SIMD ? mat4.SIMD.rotateY : mat4.scalar.rotateY;\n\n/**\n * Rotates a matrix by the given angle around the Z axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateZ = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateZ = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_1, s)));\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_0, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateZ = glMatrix.USE_SIMD ? mat4.SIMD.rotateZ : mat4.scalar.rotateZ;\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\nmat4.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.fromRotation = function(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromXRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = 1;\n    out[1]  = 0;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromYRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = 0;\n    out[2]  = -s;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromZRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = s;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nmat4.getTranslation = function (out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n\n  return out;\n};\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nmat4.getRotation = function (out, mat) {\n  // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n  var trace = mat[0] + mat[5] + mat[10];\n  var S = 0;\n\n  if (trace > 0) { \n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (mat[6] - mat[9]) / S;\n    out[1] = (mat[8] - mat[2]) / S; \n    out[2] = (mat[1] - mat[4]) / S; \n  } else if ((mat[0] > mat[5])&(mat[0] > mat[10])) { \n    S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;\n    out[3] = (mat[6] - mat[9]) / S;\n    out[0] = 0.25 * S;\n    out[1] = (mat[1] + mat[4]) / S; \n    out[2] = (mat[8] + mat[2]) / S; \n  } else if (mat[5] > mat[10]) { \n    S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;\n    out[3] = (mat[8] - mat[2]) / S;\n    out[0] = (mat[1] + mat[4]) / S; \n    out[1] = 0.25 * S;\n    out[2] = (mat[6] + mat[9]) / S; \n  } else { \n    S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;\n    out[3] = (mat[1] - mat[4]) / S;\n    out[0] = (mat[8] + mat[2]) / S;\n    out[1] = (mat[6] + mat[9]) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScale = function (out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2,\n        sx = s[0],\n        sy = s[1],\n        sz = s[2];\n\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) {\n  // Quaternion math\n  var x = q[0], y = q[1], z = q[2], w = q[3],\n      x2 = x + x,\n      y2 = y + y,\n      z2 = z + z,\n\n      xx = x * x2,\n      xy = x * y2,\n      xz = x * z2,\n      yy = y * y2,\n      yz = y * z2,\n      zz = z * z2,\n      wx = w * x2,\n      wy = w * y2,\n      wz = w * z2,\n\n      sx = s[0],\n      sy = s[1],\n      sz = s[2],\n\n      ox = o[0],\n      oy = o[1],\n      oz = o[2];\n\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);\n  out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);\n  out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);\n  out[15] = 1;\n\n  return out;\n};\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nmat4.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left),\n        tb = 1 / (top - bottom),\n        nf = 1 / (near - far);\n    out[0] = (near * 2) * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = (near * 2) * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (far * near * 2) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2),\n        nf = 1 / (near - far);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (2 * far * near) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspectiveFromFieldOfView = function (out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI/180.0),\n        downTan = Math.tan(fov.downDegrees * Math.PI/180.0),\n        leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0),\n        rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0),\n        xScale = 2.0 / (leftTan + rightTan),\n        yScale = 2.0 / (upTan + downTan);\n\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = ((upTan - downTan) * yScale * 0.5);\n    out[10] = far / (near - far);\n    out[11] = -1.0;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = (far * near) / (near - far);\n    out[15] = 0.0;\n    return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right),\n        bt = 1 / (bottom - top),\n        nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n        eyex = eye[0],\n        eyey = eye[1],\n        eyez = eye[2],\n        upx = up[0],\n        upy = up[1],\n        upz = up[2],\n        centerx = center[0],\n        centery = center[1],\n        centerz = center[2];\n\n    if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n        Math.abs(eyey - centery) < glMatrix.EPSILON &&\n        Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n        return mat4.identity(out);\n    }\n\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n\n    len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n\n    len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n    return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n                    a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n                    a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' +\n                    a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat4.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) ))\n};\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n};\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nmat4.sub = mat4.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nmat4.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n};\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nmat4.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    out[9] = a[9] + (b[9] * scale);\n    out[10] = a[10] + (b[10] * scale);\n    out[11] = a[11] + (b[11] * scale);\n    out[12] = a[12] + (b[12] * scale);\n    out[13] = a[13] + (b[13] * scale);\n    out[14] = a[14] + (b[14] * scale);\n    out[15] = a[15] + (b[15] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && \n           a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && \n           a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] &&\n           a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.equals = function (a, b) {\n    var a0  = a[0],  a1  = a[1],  a2  = a[2],  a3  = a[3],\n        a4  = a[4],  a5  = a[5],  a6  = a[6],  a7  = a[7], \n        a8  = a[8],  a9  = a[9],  a10 = a[10], a11 = a[11], \n        a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n\n    var b0  = b[0],  b1  = b[1],  b2  = b[2],  b3  = b[3],\n        b4  = b[4],  b5  = b[5],  b6  = b[6],  b7  = b[7], \n        b8  = b[8],  b9  = b[9],  b10 = b[10], b11 = b[11], \n        b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&\n            Math.abs(a9 - b9) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&\n            Math.abs(a10 - b10) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&\n            Math.abs(a11 - b11) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&\n            Math.abs(a12 - b12) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&\n            Math.abs(a13 - b13) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&\n            Math.abs(a14 - b14) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&\n            Math.abs(a15 - b15) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a15), Math.abs(b15)));\n};\n\n\n\nmodule.exports = mat4;\n\n\n/***/ }),\n/* 1063 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\nvar mat3 = __webpack_require__(573);\nvar vec3 = __webpack_require__(574);\nvar vec4 = __webpack_require__(575);\n\n/**\n * @class Quaternion\n * @name quat\n */\nvar quat = {};\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\nquat.rotationTo = (function() {\n    var tmpvec3 = vec3.create();\n    var xUnitVec3 = vec3.fromValues(1,0,0);\n    var yUnitVec3 = vec3.fromValues(0,1,0);\n\n    return function(out, a, b) {\n        var dot = vec3.dot(a, b);\n        if (dot < -0.999999) {\n            vec3.cross(tmpvec3, xUnitVec3, a);\n            if (vec3.length(tmpvec3) < 0.000001)\n                vec3.cross(tmpvec3, yUnitVec3, a);\n            vec3.normalize(tmpvec3, tmpvec3);\n            quat.setAxisAngle(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            vec3.cross(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot;\n            return quat.normalize(out, out);\n        }\n    };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view  the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nquat.setAxes = (function() {\n    var matr = mat3.create();\n\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n\n        return quat.normalize(out, quat.fromMat3(out, matr));\n    };\n})();\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n};\n\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {quat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\nquat.getAxisAngle = function(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s != 0.0) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        by = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bz = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n    var x = a[0], y = a[1], z = a[2];\n\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    var        omega, cosom, sinom, scale0, scale1;\n\n    // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    // adjust signs (if necessary)\n    if ( cosom < 0.0 ) {\n        cosom = -cosom;\n        bx = - bx;\n        by = - by;\n        bz = - bz;\n        bw = - bw;\n    }\n    // calculate coefficients\n    if ( (1.0 - cosom) > 0.000001 ) {\n        // standard case (slerp)\n        omega  = Math.acos(cosom);\n        sinom  = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {        \n        // \"from\" and \"to\" quaternions are very close \n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    \n    return out;\n};\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount\n * @returns {quat} out\n */\nquat.sqlerp = (function () {\n  var temp1 = quat.create();\n  var temp2 = quat.create();\n  \n  return function (out, a, b, c, d, t) {\n    quat.slerp(temp1, a, d, t);\n    quat.slerp(temp2, b, c, t);\n    quat.slerp(out, temp1, temp2, 2 * t * (1 - t));\n    \n    return out;\n  };\n}());\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n        invDot = dot ? 1.0/dot : 0;\n    \n    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n    out[0] = -a0*invDot;\n    out[1] = -a1*invDot;\n    out[2] = -a2*invDot;\n    out[3] = a3*invDot;\n    return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = function(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n\n    if ( fTrace > 0.0 ) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0);  // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5/fRoot;  // 1/(4w)\n        out[0] = (m[5]-m[7])*fRoot;\n        out[1] = (m[6]-m[2])*fRoot;\n        out[2] = (m[1]-m[3])*fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if ( m[4] > m[0] )\n          i = 1;\n        if ( m[8] > m[i*3+i] )\n          i = 2;\n        var j = (i+1)%3;\n        var k = (i+2)%3;\n        \n        fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j*3+k] - m[k*3+j]) * fRoot;\n        out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n        out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n    }\n    \n    return out;\n};\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n    return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {quat} a The first quaternion.\n * @param {quat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.exactEquals = vec4.exactEquals;\n\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {quat} a The first vector.\n * @param {quat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.equals = vec4.equals;\n\nmodule.exports = quat;\n\n\n/***/ }),\n/* 1064 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = __webpack_require__(81);\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = 0;\n    out[1] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\nvec2.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\nvec2.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\nvec2.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n};\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nvec2.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n    var x = a[0],\n        y = a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nvec2.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1];\n    var len = x*x + y*y;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nvec2.random = function (out, scale) {\n    scale = scale || 1.0;\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale;\n    out[1] = Math.sin(r) * scale;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n    var x = a[0], \n        y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n    var vec = vec2.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 2;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n    return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)));\n};\n\nmodule.exports = vec2;\n\n\n/***/ }),\n/* 1065 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = FrameHistory;\n\nfunction FrameHistory() {\n    this.changeTimes = new Float64Array(256);\n    this.changeOpacities = new Uint8Array(256);\n    this.opacities = new Uint8ClampedArray(256);\n    this.array = new Uint8Array(this.opacities.buffer);\n\n    this.fadeDuration = 300;\n    this.previousZoom = 0;\n    this.firstFrame = true;\n}\n\nFrameHistory.prototype.record = function(zoom) {\n    var now = Date.now();\n\n    if (this.firstFrame) {\n        now = 0;\n        this.firstFrame = false;\n    }\n\n    zoom = Math.floor(zoom * 10);\n\n    var z;\n    if (zoom < this.previousZoom) {\n        for (z = zoom + 1; z <= this.previousZoom; z++) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    } else {\n        for (z = zoom; z > this.previousZoom; z--) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    }\n\n    for (z = 0; z < 256; z++) {\n        var timeSince = now - this.changeTimes[z];\n        var opacityChange = timeSince / this.fadeDuration * 255;\n        if (z <= zoom) {\n            this.opacities[z] = this.changeOpacities[z] + opacityChange;\n        } else {\n            this.opacities[z] = this.changeOpacities[z] - opacityChange;\n        }\n    }\n\n    this.changed = true;\n    this.previousZoom = zoom;\n};\n\nFrameHistory.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        if (this.changed) {\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n            this.changed = false;\n        }\n    }\n};\n\n\n/***/ }),\n/* 1066 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\nvar util = __webpack_require__(10);\nvar shaders = __webpack_require__(1067);\n\nvar utilSource = shaders.util;\n\nmodule.exports._createProgram = function(name, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n    var program = gl.createProgram();\n    var definition = shaders[name];\n\n    var definesSource = '#define MAPBOX_GL_JS;\\n';\n    for (var j = 0; j < defines.length; j++) {\n        definesSource += '#define ' + defines[j] + ';\\n';\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, applyPragmas(definesSource + definition.fragmentSource, fragmentPragmas));\n    gl.compileShader(fragmentShader);\n    assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));\n    gl.attachShader(program, fragmentShader);\n\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, applyPragmas(definesSource + utilSource + definition.vertexSource, vertexPragmas));\n    gl.compileShader(vertexShader);\n    assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));\n    gl.attachShader(program, vertexShader);\n\n    gl.linkProgram(program);\n    assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program));\n\n    var attributes = {};\n    var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n    for (var i = 0; i < numAttributes; i++) {\n        var attribute = gl.getActiveAttrib(program, i);\n        attributes[attribute.name] = gl.getAttribLocation(program, attribute.name);\n    }\n\n    var uniforms = {};\n    var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n    for (var ui = 0; ui < numUniforms; ui++) {\n        var uniform = gl.getActiveUniform(program, ui);\n        uniforms[uniform.name] = gl.getUniformLocation(program, uniform.name);\n    }\n\n    return util.extend({\n        program: program,\n        definition: definition,\n        attributes: attributes,\n        numAttributes: numAttributes\n    }, attributes, uniforms);\n};\n\nmodule.exports._createProgramCached = function(name, defines, vertexPragmas, fragmentPragmas) {\n    this.cache = this.cache || {};\n\n    var key = JSON.stringify({\n        name: name,\n        defines: defines,\n        vertexPragmas: vertexPragmas,\n        fragmentPragmas: fragmentPragmas\n    });\n\n    if (!this.cache[key]) {\n        this.cache[key] = this._createProgram(name, defines, vertexPragmas, fragmentPragmas);\n    }\n    return this.cache[key];\n};\n\nmodule.exports.useProgram = function (nextProgramName, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n\n    defines = defines || [];\n    if (this._showOverdrawInspector) {\n        defines = defines.concat('OVERDRAW_INSPECTOR');\n    }\n\n    var nextProgram = this._createProgramCached(nextProgramName, defines, vertexPragmas, fragmentPragmas);\n    var previousProgram = this.currentProgram;\n\n    if (previousProgram !== nextProgram) {\n        gl.useProgram(nextProgram.program);\n        this.currentProgram = nextProgram;\n    }\n\n    return nextProgram;\n};\n\nfunction applyPragmas(source, pragmas) {\n    return source.replace(/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g, function(match, operation, precision, type, name) {\n        return pragmas[operation][name].replace(/{precision}/g, precision);\n    });\n}\n\n\n/***/ }),\n/* 1067 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar path = __webpack_require__(156);\n\n// readFileSync calls must be written out long-form for brfs.\nmodule.exports = {\n  debug: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\n\\nvoid main() {\\n    gl_FragColor = u_color;\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\\n}\\n\"\n  },\n  fill: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\nuniform lowp float u_opacity;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    gl_FragColor = color * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n}\\n\"\n  },\n  circle: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp vec4 blur\\n#pragma mapbox: define lowp vec4 opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp vec4 blur\\n    #pragma mapbox: initialize lowp vec4 opacity\\n\\n    float t = smoothstep(1.0 - max(blur, v_antialiasblur), 1.0, length(v_extrude));\\n    gl_FragColor = color * (1.0 - t) * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_extrude_scale;\\nuniform float u_devicepixelratio;\\n\\nattribute vec2 a_pos;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp vec4 blur\\n#pragma mapbox: define lowp vec4 opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main(void) {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize mediump float radius\\n    #pragma mapbox: initialize lowp vec4 blur\\n    #pragma mapbox: initialize lowp vec4 opacity\\n\\n    // unencode the extrusion vector that we snuck into the a_pos vector\\n    v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\\n\\n    vec2 extrude = v_extrude * radius * u_extrude_scale;\\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\\n    // in extrusion data\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\\n\\n    gl_Position.xy += extrude;\\n\\n    // This is a minimum blur distance that serves as a faux-antialiasing for\\n    // the circle. since blur is a ratio of the circle's size and the intent is\\n    // to keep the blur at roughly 1px, the two are inversely related.\\n    v_antialiasblur = 1.0 / u_devicepixelratio / radius;\\n}\\n\"\n  },\n  line: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform float u_blur;\\n\\nvarying vec2 v_linewidth;\\nvarying vec2 v_normal;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\nuniform mediump float u_blur;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_blur;\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_fade;\\nuniform float u_opacity;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\\n    float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\\n    float y_a = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_a.y);\\n    float y_b = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_b.y);\\n    vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\\n    vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\\n\\n    vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\\n\\n    alpha *= u_opacity;\\n\\n    gl_FragColor = color * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n    v_linesofar = a_linesofar;\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n#ifndef MAPBOX_GL_JS\\n    float perspective_scale = 1.0 / (1.0 - y * u_extra);\\n#else\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n#endif\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linesdfpattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\n\\nuniform float u_blur;\\nuniform sampler2D u_image;\\nuniform float u_sdfgamma;\\nuniform float u_mix;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float sdfdist_a = texture2D(u_image, v_tex_a).a;\\n    float sdfdist_b = texture2D(u_image, v_tex_b).a;\\n    float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\\n    alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform vec2 u_patternscale_a;\\nuniform float u_tex_y_a;\\nuniform vec2 u_patternscale_b;\\nuniform float u_tex_y_b;\\nuniform float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\\n    v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  outline: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    gl_FragColor = outline_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos;\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  outlinepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    // find distance to outline for alpha interpolation\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    \\n\\n    gl_FragColor = mix(color1, color2, u_mix) * alpha * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform vec2 u_patternscale_a;\\nuniform vec2 u_patternscale_b;\\nuniform vec2 u_offset_a;\\nuniform vec2 u_offset_b;\\n#else\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    v_pos_a = u_patternscale_a * a_pos + u_offset_a;\\n    v_pos_b = u_patternscale_b * a_pos + u_offset_b;\\n    v_pos = (gl_Position.xy/gl_Position.w + 1.0) / 2.0 * u_world;\\n#else\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    // \\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n#endif\\n}\\n\"\n  },\n  pattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform mat4 u_matrix;\\nuniform vec2 u_patternscale_a;\\nuniform vec2 u_patternscale_b;\\nuniform vec2 u_offset_a;\\nuniform vec2 u_offset_b;\\n#else\\nuniform mat4 u_matrix;\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    v_pos_a = u_patternscale_a * a_pos + u_offset_a;\\n    v_pos_b = u_patternscale_b * a_pos + u_offset_b;\\n#else\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    // \\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n#endif\\n}\\n\"\n  },\n  raster: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform sampler2D u_image;\\nuniform float u_opacity;\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nvarying vec2 v_pos;\\n#else\\nuniform float u_opacity0;\\nuniform float u_opacity1;\\nuniform sampler2D u_image0;\\nuniform sampler2D u_image1;\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n#endif\\n\\nuniform float u_brightness_low;\\nuniform float u_brightness_high;\\n\\nuniform float u_saturation_factor;\\nuniform float u_contrast_factor;\\nuniform vec3 u_spin_weights;\\n\\nvoid main() {\\n\\n#ifndef MAPBOX_GL_JS\\n    vec4 color = texture2D(u_image, v_pos) * u_opacity;\\n#else\\n    // read and cross-fade colors from the main and parent tiles\\n    vec4 color0 = texture2D(u_image0, v_pos0);\\n    vec4 color1 = texture2D(u_image1, v_pos1);\\n    vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\\n#endif\\n    vec3 rgb = color.rgb;\\n\\n    // spin\\n    rgb = vec3(\\n        dot(rgb, u_spin_weights.xyz),\\n        dot(rgb, u_spin_weights.zxy),\\n        dot(rgb, u_spin_weights.yzx));\\n\\n    // saturation\\n    float average = (color.r + color.g + color.b) / 3.0;\\n    rgb += (average - rgb) * u_saturation_factor;\\n\\n    // contrast\\n    rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\\n\\n    // brightness\\n    vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\\n    vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\\n\\n    gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\n#ifndef MAPBOX_GL_JS\\nuniform float u_buffer;\\n#else\\nuniform vec2 u_tl_parent;\\nuniform float u_scale_parent;\\nuniform float u_buffer_scale;\\n#endif\\n\\nattribute vec2 a_pos;\\n#ifdef MAPBOX_GL_JS\\nattribute vec2 a_texture_pos;\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nvarying vec2 v_pos;\\n\\n#else\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n#endif\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    float dimension = (8192.0 + 2.0 * u_buffer);\\n    v_pos = (a_pos / dimension) + (u_buffer / dimension);\\n#else\\n    v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\\n    v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\\n#endif\\n}\\n\"\n  },\n  icon: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\\n    gl_FragColor = texture2D(u_texture, v_tex) * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec4 a_data1;\\nattribute vec4 a_data2;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_skewed;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    vec2 a_tex = a_data1.xy;\\n    mediump float a_labelminzoom = a_data1[2];\\n    mediump vec2 a_zoom = a_data2.st;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_skewed) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  sdf: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform lowp float u_buffer;\\nuniform lowp float u_gamma;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    lowp float dist = texture2D(u_texture, v_tex).a;\\n    lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\\n    lowp float gamma = u_gamma * v_gamma_scale;\\n    lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec4 a_data1;\\nattribute vec4 a_data2;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_skewed;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_tex = a_data1.xy;\\n    mediump float a_labelminzoom = a_data1[2];\\n    mediump vec2 a_zoom = a_data2.st;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_skewed) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_gamma_scale = (gl_Position.w - 0.5);\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  collisionbox: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_zoom;\\nuniform float u_maxzoom;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n\\n    float alpha = 0.5;\\n\\n    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n    if (v_placement_zoom > u_zoom) {\\n        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n    }\\n\\n    if (u_zoom >= v_max_zoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\\n    }\\n\\n    if (v_placement_zoom >= u_maxzoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\\n    }\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_extrude;\\nattribute vec2 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform float u_scale;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n    v_max_zoom = a_data.x;\\n    v_placement_zoom = a_data.y;\\n}\\n\"\n  }\n};\n\nmodule.exports.util = \"float evaluate_zoom_function_1(const vec4 values, const float t) {\\n    if (t < 1.0) {\\n        return mix(values[0], values[1], t);\\n    } else if (t < 2.0) {\\n        return mix(values[1], values[2], t - 1.0);\\n    } else {\\n        return mix(values[2], values[3], t - 2.0);\\n    }\\n}\\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\\n    if (t < 1.0) {\\n        return mix(value0, value1, t);\\n    } else if (t < 2.0) {\\n        return mix(value1, value2, t - 1.0);\\n    } else {\\n        return mix(value2, value3, t - 2.0);\\n    }\\n}\\n\";\n\n\n/***/ }),\n/* 1068 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(39);\nvar drawCollisionDebug = __webpack_require__(1069);\nvar pixelsToTileUnits = __webpack_require__(155);\n\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] ||\n        layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']);\n\n    var gl = painter.gl;\n\n    // Disable the stencil test so that labels aren't clipped to tile boundaries.\n    //\n    // Layers with features that may be drawn overlapping aren't clipped. These\n    // layers are sorted in the y direction, and to draw the correct ordering near\n    // tile edges the icons are included in both tiles and clipped when drawing.\n    if (drawAcrossEdges) {\n        gl.disable(gl.STENCIL_TEST);\n    } else {\n        gl.enable(gl.STENCIL_TEST);\n    }\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n\n    drawLayerSymbols(painter, source, layer, coords, false,\n            layer.paint['icon-translate'],\n            layer.paint['icon-translate-anchor'],\n            layer.layout['icon-rotation-alignment'],\n            layer.layout['icon-size'],\n            layer.paint['icon-halo-width'],\n            layer.paint['icon-halo-color'],\n            layer.paint['icon-halo-blur'],\n            layer.paint['icon-opacity'],\n            layer.paint['icon-color']);\n\n    drawLayerSymbols(painter, source, layer, coords, true,\n            layer.paint['text-translate'],\n            layer.paint['text-translate-anchor'],\n            layer.layout['text-rotation-alignment'],\n            layer.layout['text-size'],\n            layer.paint['text-halo-width'],\n            layer.paint['text-halo-color'],\n            layer.paint['text-halo-blur'],\n            layer.paint['text-opacity'],\n            layer.paint['text-color']);\n\n    gl.enable(gl.DEPTH_TEST);\n\n    drawCollisionDebug(painter, source, layer, coords);\n}\n\nfunction drawLayerSymbols(painter, source, layer, coords, isText,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    for (var j = 0; j < coords.length; j++) {\n        var tile = source.getTile(coords[j]);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bothBufferGroups = bucket.bufferGroups;\n        var bufferGroups = isText ? bothBufferGroups.glyph : bothBufferGroups.icon;\n        if (!bufferGroups.length) continue;\n\n        painter.enableTileClippingMask(coords[j]);\n        drawSymbol(painter, layer, coords[j].posMatrix, tile, bucket, bufferGroups, isText,\n                isText || bucket.sdfIcons, !isText && bucket.iconsNeedLinear,\n                isText ? bucket.adjustedTextSize : bucket.adjustedIconSize, bucket.fontstack,\n                translate,\n                translateAnchor,\n                rotationAlignment,\n                size,\n                haloWidth,\n                haloColor,\n                haloBlur,\n                opacity,\n                color);\n    }\n}\n\nfunction drawSymbol(painter, layer, posMatrix, tile, bucket, bufferGroups, isText, sdf, iconsNeedLinear, adjustedSize, fontstack,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n    var gl = painter.gl;\n    var tr = painter.transform;\n    var alignedWithMap = rotationAlignment === 'map';\n\n    var defaultSize = isText ? 24 : 1;\n    var fontScale = size / defaultSize;\n\n    var extrudeScale, s, gammaScale;\n    if (alignedWithMap) {\n        s = pixelsToTileUnits(tile, 1, painter.transform.zoom) * fontScale;\n        gammaScale = 1 / Math.cos(tr._pitch);\n        extrudeScale = [s, s];\n    } else {\n        s = painter.transform.altitude * fontScale;\n        gammaScale = 1;\n        extrudeScale = [ tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s];\n    }\n\n    if (!isText && !painter.style.sprite.loaded())\n        return;\n\n    var program = painter.useProgram(sdf ? 'sdf' : 'icon');\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(posMatrix, tile, translate, translateAnchor));\n    gl.uniform1i(program.u_skewed, alignedWithMap);\n    gl.uniform2fv(program.u_extrude_scale, extrudeScale);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(program.u_texture, 0);\n\n    if (isText) {\n        // use the fonstack used when parsing the tile, not the fontstack\n        // at the current zoom level (layout['text-font']).\n        var glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack);\n        if (!glyphAtlas) return;\n\n        glyphAtlas.updateTexture(gl);\n        gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4);\n    } else {\n        var mapMoving = painter.options.rotating || painter.options.zooming;\n        var iconScaled = fontScale !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear;\n        var iconTransformed = alignedWithMap || painter.transform.pitch;\n        painter.spriteAtlas.bind(gl, sdf || mapMoving || iconScaled || iconTransformed);\n        gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4);\n    }\n\n    // adjust min/max zooms for variable font sizes\n    var zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0;\n    gl.uniform1f(program.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level\n\n    gl.activeTexture(gl.TEXTURE1);\n    painter.frameHistory.bind(gl);\n    gl.uniform1i(program.u_fadetexture, 1);\n\n    var group;\n\n    if (sdf) {\n        var sdfPx = 8;\n        var blurOffset = 1.19;\n        var haloOffset = 6;\n        var gamma = 0.105 * defaultSize / size / browser.devicePixelRatio;\n\n        if (haloWidth) {\n            // Draw halo underneath the text.\n            gl.uniform1f(program.u_gamma, (haloBlur * blurOffset / fontScale / sdfPx + gamma) * gammaScale);\n            gl.uniform4fv(program.u_color, haloColor);\n            gl.uniform1f(program.u_opacity, opacity);\n            gl.uniform1f(program.u_buffer, (haloOffset - haloWidth / fontScale) / sdfPx);\n\n            for (var j = 0; j < bufferGroups.length; j++) {\n                group = bufferGroups[j];\n                group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n                gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n            }\n        }\n\n        gl.uniform1f(program.u_gamma, gamma * gammaScale);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        gl.uniform1f(program.u_buffer, (256 - 64) / 256);\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n\n    } else {\n        gl.uniform1f(program.u_opacity, opacity);\n        for (var k = 0; k < bufferGroups.length; k++) {\n            group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n/***/ }),\n/* 1069 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = drawCollisionDebug;\n\nfunction drawCollisionDebug(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n    var program = painter.useProgram('collisionbox');\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.collisionBox;\n\n        if (!bufferGroups || !bufferGroups.length) continue;\n        var group = bufferGroups[0];\n        if (group.layout.vertex.length === 0) continue;\n\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        painter.enableTileClippingMask(coord);\n\n        painter.lineWidth(1);\n        gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n        gl.uniform1f(program.u_zoom, painter.transform.zoom * 10);\n        gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10);\n\n        group.vaos[layer.id].bind(gl, program, group.layout.vertex);\n        gl.drawArrays(gl.LINES, 0, group.layout.vertex.length);\n    }\n}\n\n\n/***/ }),\n/* 1070 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(39);\n\nmodule.exports = drawCircles;\n\nfunction drawCircles(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    // Allow circles to be drawn across boundaries, so that\n    // large circles are not clipped to tiles\n    gl.disable(gl.STENCIL_TEST);\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.circle;\n        if (!bufferGroups) continue;\n\n        var programOptions = bucket.paintAttributes.circle[layer.id];\n        var program = painter.useProgram(\n            'circle',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform2f(program.u_extrude_scale,\n                painter.transform.pixelsToGLUnits[0] * painter.transform.altitude,\n                painter.transform.pixelsToGLUnits[1] * painter.transform.altitude);\n        gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n            coord.posMatrix,\n            tile,\n            layer.paint['circle-translate'],\n            layer.paint['circle-translate-anchor']\n        ));\n\n        bucket.setUniforms(gl, 'circle', program, layer, {zoom: painter.transform.zoom});\n\n        for (var k = 0; k < bufferGroups.length; k++) {\n            var group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element, group.paint[layer.id]);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n/***/ }),\n/* 1071 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(39);\nvar mat2 = __webpack_require__(90).mat2;\nvar pixelsToTileUnits = __webpack_require__(155);\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    // don't draw zero-width lines\n    if (layer.paint['line-width'] <= 0) return;\n\n    // the distance over which the line edge fades out.\n    // Retina devices need a smaller distance to avoid aliasing.\n    var antialiasing = 1 / browser.devicePixelRatio;\n\n    var blur = layer.paint['line-blur'] + antialiasing;\n    var color = layer.paint['line-color'];\n\n    var tr = painter.transform;\n\n    var antialiasingMatrix = mat2.create();\n    mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]);\n    mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle);\n\n    // calculate how much longer the real world distance is at the top of the screen\n    // than at the middle of the screen.\n    var topedgelength = Math.sqrt(tr.height * tr.height / 4  * (1 + tr.altitude * tr.altitude));\n    var x = tr.height / 2 * Math.tan(tr._pitch);\n    var extra = (topedgelength + x) / topedgelength - 1;\n\n    var dasharray = layer.paint['line-dasharray'];\n    var image = layer.paint['line-pattern'];\n    var program, posA, posB, imagePosA, imagePosB;\n\n    if (dasharray) {\n        program = painter.useProgram('linesdfpattern');\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n\n        posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n        posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.lineAtlas.bind(gl);\n\n        gl.uniform1f(program.u_tex_y_a, posA.y);\n        gl.uniform1f(program.u_tex_y_b, posB.y);\n        gl.uniform1f(program.u_mix, dasharray.t);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else if (image) {\n        imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n        imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n        if (!imagePosA || !imagePosB) return;\n\n        program = painter.useProgram('linepattern');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_fade, image.t);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else {\n        program = painter.useProgram('line');\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n    }\n\n    for (var k = 0; k < coords.length; k++) {\n        var coord = coords[k];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.line;\n        if (!bufferGroups) continue;\n\n        painter.enableTileClippingMask(coord);\n\n        // set uniforms that are different for each tile\n        var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n        gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n        var ratio = 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom);\n\n        if (dasharray) {\n            var widthA = posA.width * dasharray.fromScale;\n            var widthB = posB.width * dasharray.toScale;\n            var scaleA = [1 / pixelsToTileUnits(tile, widthA, painter.transform.tileZoom), -posA.height / 2];\n            var scaleB = [1 / pixelsToTileUnits(tile, widthB, painter.transform.tileZoom), -posB.height / 2];\n            var gamma = painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2;\n            gl.uniform1f(program.u_ratio, ratio);\n            gl.uniform2fv(program.u_patternscale_a, scaleA);\n            gl.uniform2fv(program.u_patternscale_b, scaleB);\n            gl.uniform1f(program.u_sdfgamma, gamma);\n\n        } else if (image) {\n            gl.uniform1f(program.u_ratio, ratio);\n            gl.uniform2fv(program.u_pattern_size_a, [\n                pixelsToTileUnits(tile, imagePosA.size[0] * image.fromScale, painter.transform.tileZoom),\n                imagePosB.size[1]\n            ]);\n            gl.uniform2fv(program.u_pattern_size_b, [\n                pixelsToTileUnits(tile, imagePosB.size[0] * image.toScale, painter.transform.tileZoom),\n                imagePosB.size[1]\n            ]);\n\n        } else {\n            gl.uniform1f(program.u_ratio, ratio);\n        }\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            var group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n\n};\n\n\n/***/ }),\n/* 1072 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar pixelsToTileUnits = __webpack_require__(155);\n\nmodule.exports = draw;\n\nfunction draw(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    var color = layer.paint['fill-color'];\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    // Draw fill\n    if (image ? !painter.isOpaquePass : painter.isOpaquePass === (color[3] === 1 && opacity === 1)) {\n        // Once we switch to earcut drawing we can pull most of the WebGL setup\n        // outside of this coords loop.\n        painter.setDepthSublayer(1);\n        for (var i = 0; i < coords.length; i++) {\n            drawFill(painter, source, layer, coords[i]);\n        }\n    }\n\n    if (!painter.isOpaquePass && layer.paint['fill-antialias']) {\n        if (isOutlineColorDefined || !layer.paint['fill-pattern']) {\n            painter.lineWidth(2);\n            painter.depthMask(false);\n\n            if (isOutlineColorDefined) {\n                // If we defined a different color for the fill outline, we are\n                // going to ignore the bits in 0x07 and just care about the global\n                // clipping mask.\n                painter.setDepthSublayer(2);\n            } else {\n                // Otherwise, we only want to drawFill the antialiased parts that are\n                // *outside* the current shape. This is important in case the fill\n                // or stroke color is translucent. If we wouldn't clip to outside\n                // the current shape, some pixels from the outline stroke overlapped\n                // the (non-antialiased) fill.\n                painter.setDepthSublayer(0);\n            }\n\n            for (var j = 0; j < coords.length; j++) {\n                drawStroke(painter, source, layer, coords[j]);\n            }\n        } else {\n            painter.lineWidth(2);\n            painter.depthMask(false);\n            // Otherwise, we only want to drawFill the antialiased parts that are\n            // *outside* the current shape. This is important in case the fill\n            // or stroke color is translucent. If we wouldn't clip to outside\n            // the current shape, some pixels from the outline stroke overlapped\n            // the (non-antialiased) fill.\n            painter.setDepthSublayer(0);\n\n            for (var k = 0; k < coords.length; k++) {\n                drawStroke(painter, source, layer, coords[k]);\n            }\n        }\n\n    }\n}\n\nfunction drawFill(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.fill;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var program;\n\n    if (!image) {\n\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'fill',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n        gl.uniform1f(program.u_opacity, opacity);\n\n    } else {\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        setPattern(image, opacity, tile, coord, painter, program);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    painter.enableTileClippingMask(coord);\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element, group.paint[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.layout.element.length, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\nfunction drawStroke(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n\n    var gl = painter.gl;\n    var bufferGroups = bucket.bufferGroups.fill;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    var program;\n    if (image && !isOutlineColorDefined) {\n        program = painter.useProgram('outlinepattern');\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    } else {\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'outline',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n        gl.uniform1f(program.u_opacity, opacity);\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    if (image) { setPattern(image, opacity, tile, coord, painter, program); }\n\n    painter.enableTileClippingMask(coord);\n\n    for (var k = 0; k < bufferGroups.length; k++) {\n        var group = bufferGroups[k];\n        group.secondVaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element2, group.paint[layer.id]);\n        gl.drawElements(gl.LINES, group.layout.element2.length * 2, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\nfunction setPattern(image, opacity, tile, coord, painter, program) {\n    var gl = painter.gl;\n\n    var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n    var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n    if (!imagePosA || !imagePosB) return;\n\n    gl.uniform1i(program.u_image, 0);\n    gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n    gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n    gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n    gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n    gl.uniform1f(program.u_opacity, opacity);\n    gl.uniform1f(program.u_mix, image.t);\n\n    gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n    gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n    gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n    gl.uniform1f(program.u_scale_a, image.fromScale);\n    gl.uniform1f(program.u_scale_b, image.toScale);\n\n    var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n    var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n    var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n    // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n    gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n    gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n\n    gl.activeTexture(gl.TEXTURE0);\n    painter.spriteAtlas.bind(gl, true);\n}\n\n\n/***/ }),\n/* 1073 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar TilePyramid = __webpack_require__(195);\nvar pyramid = new TilePyramid({ tileSize: 512 });\nvar pixelsToTileUnits = __webpack_require__(155);\nvar createUniformPragmas = __webpack_require__(576);\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, source, layer) {\n    var gl = painter.gl;\n    var transform = painter.transform;\n    var color = layer.paint['background-color'];\n    var image = layer.paint['background-pattern'];\n    var opacity = layer.paint['background-opacity'];\n    var program;\n\n    var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null;\n    var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null;\n\n    painter.setDepthSublayer(0);\n    if (imagePosA && imagePosB) {\n\n        if (painter.isOpaquePass) return;\n\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        gl.uniform1i(program.u_image, 0);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_opacity, opacity);\n\n        gl.uniform1f(program.u_mix, image.t);\n\n        gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n        gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n        gl.uniform1f(program.u_scale_a, image.fromScale);\n        gl.uniform1f(program.u_scale_b, image.toScale);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer);\n    } else {\n        // Draw filling rectangle.\n        if (painter.isOpaquePass !== (color[3] === 1)) return;\n\n        var pragmas = createUniformPragmas([{name: 'u_color', components: 4}]);\n        program = painter.useProgram('fill', [], pragmas, pragmas);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer);\n    }\n\n    gl.disable(gl.STENCIL_TEST);\n\n    // We need to draw the background in tiles in order to use calculatePosMatrix\n    // which applies the projection matrix (transform.projMatrix). Otherwise\n    // the depth and stencil buffers get into a bad state.\n    // This can be refactored into a single draw call once earcut lands and\n    // we don't have so much going on in the stencil buffer.\n    var coords = pyramid.coveringTiles(transform);\n    for (var c = 0; c < coords.length; c++) {\n        var coord = coords[c];\n        var tileSize = 512;\n        // var pixelsToTileUnitsBound = pixelsToTileUnits.bind({coord:coord, tileSize: tileSize});\n        if (imagePosA && imagePosB) {\n            var tile = {coord:coord, tileSize: tileSize};\n\n            gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n\n            var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n            var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n            var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n            // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n            gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n            gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n        }\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord));\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n\n\n/***/ }),\n/* 1074 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar textVertices = __webpack_require__(1075);\nvar browser = __webpack_require__(39);\nvar mat4 = __webpack_require__(90).mat4;\nvar EXTENT = __webpack_require__(40).EXTENT;\nvar Buffer = __webpack_require__(151);\nvar VertexArrayObject = __webpack_require__(152);\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, source, coords) {\n    if (painter.isOpaquePass) return;\n    if (!painter.options.debug) return;\n\n    for (var i = 0; i < coords.length; i++) {\n        drawDebugTile(painter, source, coords[i]);\n    }\n}\n\nfunction drawDebugTile(painter, source, coord) {\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n    painter.lineWidth(1 * browser.devicePixelRatio);\n\n    var posMatrix = coord.posMatrix;\n    var program = painter.useProgram('debug');\n\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.uniform4f(program.u_color, 1, 0, 0, 1);\n    painter.debugVAO.bind(gl, program, painter.debugBuffer);\n    gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length);\n\n    var vertices = textVertices(coord.toString(), 50, 200, 5);\n    var debugTextArray = new painter.PosArray();\n    for (var v = 0; v < vertices.length; v += 2) {\n        debugTextArray.emplaceBack(vertices[v], vertices[v + 1]);\n    }\n    var debugTextBuffer = new Buffer(debugTextArray.serialize(), painter.PosArray.serialize(), Buffer.BufferType.VERTEX);\n    var debugTextVAO = new VertexArrayObject();\n    debugTextVAO.bind(gl, program, debugTextBuffer);\n    gl.uniform4f(program.u_color, 1, 1, 1, 1);\n\n    // Draw the halo with multiple 1px lines instead of one wider line because\n    // the gl spec doesn't guarantee support for lines with width > 1.\n    var tileSize = source.getTile(coord).tileSize;\n    var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize);\n    var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]];\n    for (var i = 0; i < translations.length; i++) {\n        var translation = translations[i];\n        gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0]));\n        gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n    }\n\n    gl.uniform4f(program.u_color, 0, 0, 0, 1);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n}\n\n\n/***/ }),\n/* 1075 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nvar simplexFont = {\n    \" \": [16, []],\n    \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n    \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n    \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n    \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n    \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n    \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n    \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n    \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n    \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n    \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"-\": [26, [4, 9, 22, 9]],\n    \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"/\": [22, [20, 25, 2, -7]],\n    \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n    \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n    \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n    \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n    \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n    \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n    \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n    \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n    \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"<\": [24, [20, 18, 4, 9, 20, 0]],\n    \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n    \">\": [24, [4, 18, 20, 9, 4, 0]],\n    \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n    \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n    \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n    \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n    \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n    \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n    \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n    \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n    \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n    \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n    \"I\": [8, [4, 21, 4, 0]],\n    \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n    \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n    \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n    \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n    \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n    \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n    \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n    \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n    \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n    \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n    \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n    \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n    \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n    \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n    \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n    \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n    \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n    \"\\\\\": [14, [0, 21, 14, -3]],\n    \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n    \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n    \"_\": [16, [0, -2, 16, -2]],\n    \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n    \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n    \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n    \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n    \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n    \"l\": [8, [4, 21, 4, 0]],\n    \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n    \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n    \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n    \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n    \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n    \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n    \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n    \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n    \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n    \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n    \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n    \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n    \"|\": [8, [4, 25, 4, -7]],\n    \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n    \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nmodule.exports = function textVertices(text, left, baseline, scale) {\n    scale = scale || 1;\n\n    var strokes = [],\n        i, len, j, len2, glyph, x, y, prev;\n\n    for (i = 0, len = text.length; i < len; i++) {\n        glyph = simplexFont[text[i]];\n        if (!glyph) continue;\n        prev = null;\n\n        for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n            if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n                prev = null;\n\n            } else {\n                x = left + glyph[1][j] * scale;\n                y = baseline - glyph[1][j + 1] * scale;\n                if (prev) {\n                    strokes.push(prev.x, prev.y, x, y);\n                }\n                prev = {x: x, y: y};\n            }\n        }\n        left += glyph[0] * scale;\n    }\n\n    return strokes;\n};\n\n\n/***/ }),\n/* 1076 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @class mapboxgl.Hash\n * @returns {Hash} `this`\n */\nmodule.exports = Hash;\n\nvar util = __webpack_require__(10);\n\nfunction Hash() {\n    util.bindAll([\n        '_onHashChange',\n        '_updateHash'\n    ], this);\n}\n\nHash.prototype = {\n    /*\n     * Map element to listen for coordinate changes\n     *\n     * @param {Object} map\n     * @returns {Hash} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        window.addEventListener('hashchange', this._onHashChange, false);\n        this._map.on('moveend', this._updateHash);\n        return this;\n    },\n\n    /*\n     * Removes hash\n     *\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        window.removeEventListener('hashchange', this._onHashChange, false);\n        this._map.off('moveend', this._updateHash);\n        delete this._map;\n        return this;\n    },\n\n    _onHashChange: function() {\n        var loc = location.hash.replace('#', '').split('/');\n        if (loc.length >= 3) {\n            this._map.jumpTo({\n                center: [+loc[2], +loc[1]],\n                zoom: +loc[0],\n                bearing: +(loc[3] || 0)\n            });\n            return true;\n        }\n        return false;\n    },\n\n    _updateHash: function() {\n        var center = this._map.getCenter(),\n            zoom = this._map.getZoom(),\n            bearing = this._map.getBearing(),\n            precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),\n\n            hash = '#' + (Math.round(zoom * 100) / 100) +\n                '/' + center.lat.toFixed(precision) +\n                '/' + center.lng.toFixed(precision) +\n                (bearing ? '/' + (Math.round(bearing * 10) / 10) : '');\n\n        window.history.replaceState('', '', hash);\n    }\n};\n\n\n/***/ }),\n/* 1077 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62);\nvar Point = __webpack_require__(11);\n\nvar handlers = {\n    scrollZoom: __webpack_require__(1078),\n    boxZoom: __webpack_require__(1079),\n    dragRotate: __webpack_require__(1080),\n    dragPan: __webpack_require__(1081),\n    keyboard: __webpack_require__(1082),\n    doubleClickZoom: __webpack_require__(1083),\n    touchZoomRotate: __webpack_require__(1084)\n};\n\nmodule.exports = function bindHandlers(map, bindOptions, mapOptions) {\n    var el = map.getCanvasContainer();\n    var contextMenuEvent = null;\n    var startPos = null;\n    var tapped = null;\n\n    for (var name in handlers) {\n        map[name] = new handlers[name](map, mapOptions);\n        if (bindOptions[name]) {\n            map[name].enable();\n        }\n    }\n\n    el.addEventListener('mousedown', onMouseDown, false);\n    el.addEventListener('mouseup', onMouseUp, false);\n    el.addEventListener('mousemove', onMouseMove, false);\n    el.addEventListener('touchstart', onTouchStart, false);\n    el.addEventListener('touchend', onTouchEnd, false);\n    el.addEventListener('touchmove', onTouchMove, false);\n    el.addEventListener('touchcancel', onTouchCancel, false);\n    el.addEventListener('click', onClick, false);\n    el.addEventListener('dblclick', onDblClick, false);\n    el.addEventListener('contextmenu', onContextMenu, false);\n\n    function onMouseDown(e) {\n        map.stop();\n        startPos = DOM.mousePos(el, e);\n        fireMouseEvent('mousedown', e);\n    }\n\n    function onMouseUp(e) {\n        var rotating = map.dragRotate && map.dragRotate.isActive();\n\n        if (contextMenuEvent && !rotating) {\n            fireMouseEvent('contextmenu', contextMenuEvent);\n        }\n\n        contextMenuEvent = null;\n        fireMouseEvent('mouseup', e);\n    }\n\n    function onMouseMove(e) {\n        if (map.dragPan && map.dragPan.isActive()) return;\n        if (map.dragRotate && map.dragRotate.isActive()) return;\n\n        var target = e.toElement || e.target;\n        while (target && target !== el) target = target.parentNode;\n        if (target !== el) return;\n\n        fireMouseEvent('mousemove', e);\n    }\n\n    function onTouchStart(e) {\n        map.stop();\n        fireTouchEvent('touchstart', e);\n\n        if (!e.touches || e.touches.length > 1) return;\n\n        if (!tapped) {\n            tapped = setTimeout(onTouchTimeout, 300);\n\n        } else {\n            clearTimeout(tapped);\n            tapped = null;\n            fireMouseEvent('dblclick', e);\n        }\n    }\n\n    function onTouchMove(e) {\n        fireTouchEvent('touchmove', e);\n    }\n\n    function onTouchEnd(e) {\n        fireTouchEvent('touchend', e);\n    }\n\n    function onTouchCancel(e) {\n        fireTouchEvent('touchcancel', e);\n    }\n\n    function onTouchTimeout() {\n        tapped = null;\n    }\n\n    function onClick(e) {\n        var pos = DOM.mousePos(el, e);\n\n        if (pos.equals(startPos)) {\n            fireMouseEvent('click', e);\n        }\n    }\n\n    function onDblClick(e) {\n        fireMouseEvent('dblclick', e);\n        e.preventDefault();\n    }\n\n    function onContextMenu(e) {\n        contextMenuEvent = e;\n        e.preventDefault();\n    }\n\n    function fireMouseEvent(type, e) {\n        var pos = DOM.mousePos(el, e);\n\n        return map.fire(type, {\n            lngLat: map.unproject(pos),\n            point: pos,\n            originalEvent: e\n        });\n    }\n\n    function fireTouchEvent(type, e) {\n        var touches = DOM.touchPos(el, e);\n        var singular = touches.reduce(function(prev, curr, i, arr) {\n            return prev.add(curr.div(arr.length));\n        }, new Point(0, 0));\n\n        return map.fire(type, {\n            lngLat: map.unproject(singular),\n            point: singular,\n            lngLats: touches.map(function(t) { return map.unproject(t); }, this),\n            points: touches,\n            originalEvent: e\n        });\n    }\n};\n\n\n/***/ }),\n/* 1078 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62),\n    browser = __webpack_require__(39),\n    util = __webpack_require__(10);\n\nmodule.exports = ScrollZoomHandler;\n\n\nvar ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '',\n    firefox = ua.indexOf('firefox') !== -1,\n    safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n\n/**\n * The `ScrollZoomHandler` allows a user to zoom the map by scrolling.\n * @class ScrollZoomHandler\n */\nfunction ScrollZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nScrollZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"scroll to zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"scroll to zoom\" interaction.\n     * @example\n     *   map.scrollZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('wheel', this._onWheel, false);\n        this._el.addEventListener('mousewheel', this._onWheel, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"scroll to zoom\" interaction.\n     * @example\n     *   map.scrollZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('wheel', this._onWheel);\n        this._el.removeEventListener('mousewheel', this._onWheel);\n        this._enabled = false;\n    },\n\n    _onWheel: function (e) {\n        var value;\n\n        if (e.type === 'wheel') {\n            value = e.deltaY;\n            // Firefox doubles the values on retina screens...\n            if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n            if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n        } else if (e.type === 'mousewheel') {\n            value = -e.wheelDeltaY;\n            if (safari) value = value / 3;\n        }\n\n        var now = browser.now(),\n            timeDelta = now - (this._time || 0);\n\n        this._pos = DOM.mousePos(this._el, e);\n        this._time = now;\n\n        if (value !== 0 && (value % 4.000244140625) === 0) {\n            // This one is definitely a mouse wheel event.\n            this._type = 'wheel';\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / 4);\n\n        } else if (value !== 0 && Math.abs(value) < 4) {\n            // This one is definitely a trackpad event because it is so small.\n            this._type = 'trackpad';\n\n        } else if (timeDelta > 400) {\n            // This is likely a new scroll action.\n            this._type = null;\n            this._lastValue = value;\n\n            // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n            this._timeout = setTimeout(this._onTimeout, 40);\n\n        } else if (!this._type) {\n            // This is a repeating event, but we don't know the type of event just yet.\n            // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n            this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n            // Make sure our delayed event isn't fired again, because we accumulate\n            // the previous event (which was less than 40ms ago) into this event.\n            if (this._timeout) {\n                clearTimeout(this._timeout);\n                this._timeout = null;\n                value += this._lastValue;\n            }\n        }\n\n        // Slow down zoom if shift key is held for more precise zooming\n        if (e.shiftKey && value) value = value / 4;\n\n        // Only fire the callback if we actually know what type of scrolling device the user uses.\n        if (this._type) this._zoom(-value, e);\n\n        e.preventDefault();\n    },\n\n    _onTimeout: function () {\n        this._type = 'wheel';\n        this._zoom(-this._lastValue);\n    },\n\n    _zoom: function (delta, e) {\n        if (delta === 0) return;\n        var map = this._map;\n\n        // Scale by sigmoid of scroll wheel delta.\n        var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n        if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n        var fromScale = map.ease ? map.ease.to : map.transform.scale,\n            targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n        map.zoomTo(targetZoom, {\n            duration: 0,\n            around: map.unproject(this._pos),\n            delayEndEvents: 200\n        }, { originalEvent: e });\n    }\n};\n\n\n/**\n * Zoom start event. This event is emitted just before the map begins a transition from one\n * zoom level to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoomstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n/**\n * Zoom event. This event is emitted repeatedly during animated transitions from one zoom level to\n * another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoom\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n/**\n * Zoom end event. This event is emitted just after the map completes a transition from one\n * zoom level to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoomend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n\n/***/ }),\n/* 1079 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62),\n    LngLatBounds = __webpack_require__(198),\n    util = __webpack_require__(10);\n\nmodule.exports = BoxZoomHandler;\n\n/**\n * The `BoxZoomHandler` allows a user to zoom the map to fit a bounding box.\n * The bounding box is defined by holding `shift` while dragging the cursor.\n * @class BoxZoomHandler\n */\nfunction BoxZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._container = map.getContainer();\n\n    util.bindHandlers(this);\n}\n\nBoxZoomHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"box zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"box zoom\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"box zoom\" interaction.\n     * @example\n     *   map.boxZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onMouseDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"box zoom\" interaction.\n     * @example\n     *   map.boxZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onMouseDown);\n        this._enabled = false;\n    },\n\n    _onMouseDown: function (e) {\n        if (!(e.shiftKey && e.button === 0)) return;\n\n        document.addEventListener('mousemove', this._onMouseMove, false);\n        document.addEventListener('keydown', this._onKeyDown, false);\n        document.addEventListener('mouseup', this._onMouseUp, false);\n\n        DOM.disableDrag();\n        this._startPos = DOM.mousePos(this._el, e);\n        this._active = true;\n    },\n\n    _onMouseMove: function (e) {\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e);\n\n        if (!this._box) {\n            this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n            this._container.classList.add('mapboxgl-crosshair');\n            this._fireEvent('boxzoomstart', e);\n        }\n\n        var minX = Math.min(p0.x, p1.x),\n            maxX = Math.max(p0.x, p1.x),\n            minY = Math.min(p0.y, p1.y),\n            maxY = Math.max(p0.y, p1.y);\n\n        DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)');\n\n        this._box.style.width = (maxX - minX) + 'px';\n        this._box.style.height = (maxY - minY) + 'px';\n    },\n\n    _onMouseUp: function (e) {\n        if (e.button !== 0) return;\n\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e),\n            bounds = new LngLatBounds(this._map.unproject(p0), this._map.unproject(p1));\n\n        this._finish();\n\n        if (p0.x === p1.x && p0.y === p1.y) {\n            this._fireEvent('boxzoomcancel', e);\n        } else {\n            this._map\n                .fitBounds(bounds, {linear: true})\n                .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds });\n        }\n    },\n\n    _onKeyDown: function (e) {\n        if (e.keyCode === 27) {\n            this._finish();\n            this._fireEvent('boxzoomcancel', e);\n        }\n    },\n\n    _finish: function () {\n        this._active = false;\n\n        document.removeEventListener('mousemove', this._onMouseMove, false);\n        document.removeEventListener('keydown', this._onKeyDown, false);\n        document.removeEventListener('mouseup', this._onMouseUp, false);\n\n        this._container.classList.remove('mapboxgl-crosshair');\n\n        if (this._box) {\n            this._box.parentNode.removeChild(this._box);\n            this._box = null;\n        }\n\n        DOM.enableDrag();\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    }\n};\n\n\n/**\n * Boxzoom start event. This event is emitted at the start of a box zoom interaction.\n *\n * @event boxzoomstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Boxzoom end event. This event is emitted at the end of a box zoom interaction\n *\n * @event boxzoomend\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {Event} originalEvent the original DOM event\n * @property {LngLatBounds} boxZoomBounds the bounds of the box zoom target\n */\n\n/**\n * Boxzoom cancel event.  This event is emitted when the user cancels a box zoom interaction,\n *   or when the box zoom does not meet the minimum size threshold.\n *\n * @event boxzoomcancel\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n/***/ }),\n/* 1080 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62),\n    Point = __webpack_require__(11),\n    util = __webpack_require__(10);\n\nmodule.exports = DragRotateHandler;\n\nvar inertiaLinearity = 0.25,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 180, // deg/s\n    inertiaDeceleration = 720; // deg/s^2\n\n\n/**\n * The `DragRotateHandler` allows a user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or the `ctrl` key.\n * @class DragRotateHandler\n */\nfunction DragRotateHandler(map, options) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._bearingSnap = options.bearingSnap;\n\n    util.bindHandlers(this);\n}\n\nDragRotateHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"drag to rotate\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"drag to rotate\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"drag to rotate\" interaction.\n     * @example\n     * map.dragRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"drag to rotate\" interaction.\n     * @example\n     * map.dragRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        document.addEventListener('mousemove', this._onMove);\n        document.addEventListener('mouseup', this._onUp);\n\n        this._active = false;\n        this._inertia = [[Date.now(), this._map.getBearing()]];\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._center = this._map.transform.centerPoint;  // Center of rotation\n\n        // If the first click was too close to the center, move the center of rotation by 200 pixels\n        // in the direction of the click.\n        var startToCenter = this._startPos.sub(this._center),\n            startToCenterDist = startToCenter.mag();\n\n        if (startToCenterDist < 200) {\n            this._center = this._startPos.add(new Point(-200, 0)._rotate(startToCenter.angle()));\n        }\n\n        e.preventDefault();\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('rotatestart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var map = this._map;\n        map.stop();\n\n        var p1 = this._pos,\n            p2 = DOM.mousePos(this._el, e),\n            center = this._center,\n            bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180,\n            bearing = map.getBearing() - bearingDiff,\n            inertia = this._inertia,\n            last = inertia[inertia.length - 1];\n\n        this._drainInertiaBuffer();\n        inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]);\n\n        map.transform.bearing = bearing;\n\n        this._fireEvent('rotate', e);\n        this._fireEvent('move', e);\n\n        this._pos = p2;\n    },\n\n    _onUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onUp);\n\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('rotateend', e);\n        this._drainInertiaBuffer();\n\n        var map = this._map,\n            mapBearing = map.getBearing(),\n            inertia = this._inertia;\n\n        var finish = function() {\n            if (Math.abs(mapBearing) < this._bearingSnap) {\n                map.resetNorth({noMoveStart: true}, { originalEvent: e });\n            } else {\n                this._fireEvent('moveend', e);\n            }\n        }.bind(this);\n\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var first = inertia[0],\n            last = inertia[inertia.length - 1],\n            previous = inertia[inertia.length - 2],\n            bearing = map._normalizeBearing(mapBearing, previous[1]),\n            flingDiff = last[1] - first[1],\n            sign = flingDiff < 0 ? -1 : 1,\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDiff === 0 || flingDuration === 0) {\n            finish();\n            return;\n        }\n\n        var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration));  // deg/s\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = sign * speed * (duration / 2);\n\n        bearing += offset;\n\n        if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) {\n            bearing = map._normalizeBearing(0, bearing);\n        }\n\n        map.rotateTo(bearing, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragPan && map.dragPan.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            var buttons = (e.ctrlKey ? 1 : 2),  // ? ctrl+left button : right button\n                button = (e.ctrlKey ? 0 : 2);   // ? ctrl+left button : right button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   //msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff)\n            inertia.shift();\n    }\n\n};\n\n\n/**\n * Rotate start event. This event is emitted at the start of a user-initiated rotate interaction.\n *\n * @event rotatestart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Rotate event. This event is emitted repeatedly during a user-initiated rotate interaction.\n *\n * @event rotate\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Rotate end event. This event is emitted at the end of a user-initiated rotate interaction.\n *\n * @event rotateend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n/***/ }),\n/* 1081 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62),\n    util = __webpack_require__(10);\n\nmodule.exports = DragPanHandler;\n\nvar inertiaLinearity = 0.3,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 1400, // px/s\n    inertiaDeceleration = 2500; // px/s^2\n\n\n/**\n * The `DragPanHandler` allows a user to pan the map by clicking and dragging\n * the cursor.\n * @class DragPanHandler\n */\nfunction DragPanHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nDragPanHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"drag to pan\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"drag to pan\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"drag to pan\" interaction.\n     * @example\n     * map.dragPan.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._el.addEventListener('touchstart', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"drag to pan\" interaction.\n     * @example\n     * map.dragPan.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._el.removeEventListener('touchstart', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        if (e.touches) {\n            document.addEventListener('touchmove', this._onMove);\n            document.addEventListener('touchend', this._onTouchEnd);\n        } else {\n            document.addEventListener('mousemove', this._onMove);\n            document.addEventListener('mouseup', this._onMouseUp);\n        }\n\n        this._active = false;\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._inertia = [[Date.now(), this._pos]];\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('dragstart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var pos = DOM.mousePos(this._el, e),\n            map = this._map;\n\n        map.stop();\n        this._drainInertiaBuffer();\n        this._inertia.push([Date.now(), pos]);\n\n        map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n\n        this._fireEvent('drag', e);\n        this._fireEvent('move', e);\n\n        this._pos = pos;\n\n        e.preventDefault();\n    },\n\n    _onUp: function (e) {\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('dragend', e);\n        this._drainInertiaBuffer();\n\n        var finish = function() {\n            this._fireEvent('moveend', e);\n        }.bind(this);\n\n        var inertia = this._inertia;\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            flingOffset = last[1].sub(first[1]),\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDuration === 0 || last[1].equals(first[1])) {\n            finish();\n            return;\n        }\n\n        // calculate px/s velocity & adjust for increased initial animation speed when easing out\n        var velocity = flingOffset.mult(inertiaLinearity / flingDuration),\n            speed = velocity.mag(); // px/s\n\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n            velocity._unit()._mult(speed);\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = velocity.mult(-duration / 2);\n\n        this._map.panBy(offset, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _onMouseUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onMouseUp);\n    },\n\n    _onTouchEnd: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onTouchEnd);\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragRotate && map.dragRotate.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            if (e.ctrlKey) return true;\n            var buttons = 1,  // left button\n                button = 0;   // left button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   // msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/**\n * Drag start event. This event is emitted at the start of a user-initiated pan interaction.\n *\n * @event dragstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Drag event. This event is emitted repeatedly during a user-initiated pan interaction.\n *\n * @event drag\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Drag end event. This event is emitted at the end of a user-initiated pan interaction.\n *\n * @event dragend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n/***/ }),\n/* 1082 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = KeyboardHandler;\n\n\nvar panDelta = 80,\n    rotateDelta = 2,\n    pitchDelta = 5;\n\n/**\n * The `KeyboardHandler` allows a user to zoom, rotate, and pan the map using\n * following keyboard shortcuts:\n *  * `=` / `+`: increase zoom level by 1\n *  * `Shift-=` / `Shift-+`: increase zoom level by 2\n *  * `-`: decrease zoom level by 1\n *  * `Shift--`: decrease zoom level by 2\n *  * Arrow keys: pan by 80 pixels\n *  * `Shift+⇢`: increase rotation by 2 degrees\n *  * `Shift+⇠`: decrease rotation by 2 degrees\n *  * `Shift+⇡`: increase pitch by 5 degrees\n *  * `Shift+⇣`: decrease pitch by 5 degrees\n * @class KeyboardHandler\n */\nfunction KeyboardHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    this._onKeyDown = this._onKeyDown.bind(this);\n}\n\nKeyboardHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of keyboard interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the ability to interact with the map using keyboard input.\n     * @example\n     * map.keyboard.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('keydown', this._onKeyDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the ability to interact with the map using keyboard input.\n     * @example\n     * map.keyboard.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('keydown', this._onKeyDown);\n        this._enabled = false;\n    },\n\n    _onKeyDown: function (e) {\n        if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n        var map = this._map,\n            eventData = { originalEvent: e };\n\n        if (map.isEasing()) return;\n\n        switch (e.keyCode) {\n        case 61:\n        case 107:\n        case 171:\n        case 187:\n            map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 189:\n        case 109:\n        case 173:\n            map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 37:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() - rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([-panDelta, 0], eventData);\n            }\n            break;\n\n        case 39:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() + rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([panDelta, 0], eventData);\n            }\n            break;\n\n        case 38:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: map.getPitch() + pitchDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, -panDelta], eventData);\n            }\n            break;\n\n        case 40:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: Math.max(map.getPitch() - pitchDelta, 0) }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, panDelta], eventData);\n            }\n            break;\n        }\n    }\n};\n\n\n/***/ }),\n/* 1083 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = DoubleClickZoomHandler;\n\n/**\n * The `DoubleClickZoomHandler` allows a user to zoom the map around point by\n * double clicking.\n * @class DoubleClickZoomHandler\n */\nfunction DoubleClickZoomHandler(map) {\n    this._map = map;\n    this._onDblClick = this._onDblClick.bind(this);\n}\n\nDoubleClickZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"double click to zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"double click to zoom\" interaction.\n     * @example\n     * map.doubleClickZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._map.on('dblclick', this._onDblClick);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"double click to zoom\" interaction.\n     * @example\n     * map.doubleClickZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._map.off('dblclick', this._onDblClick);\n        this._enabled = false;\n    },\n\n    _onDblClick: function (e) {\n        this._map.zoomTo(this._map.getZoom() +\n            (e.originalEvent.shiftKey ? -1 : 1), {around: e.lngLat});\n    }\n};\n\n\n/***/ }),\n/* 1084 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(62),\n    util = __webpack_require__(10);\n\nmodule.exports = TouchZoomRotateHandler;\n\nvar inertiaLinearity = 0.15,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaDeceleration = 12, // scale / s^2\n    inertiaMaxSpeed = 2.5, // scale / s\n    significantScaleThreshold = 0.15,\n    significantRotateThreshold = 4;\n\n\n/**\n * The `TouchZoomRotateHandler` allows a user to zoom and rotate the map by\n * pinching on a touchscreen.\n * @class TouchZoomRotateHandler\n */\nfunction TouchZoomRotateHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nTouchZoomRotateHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"pinch to rotate and zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"pinch to rotate and zoom\" interaction.\n     * @example\n     *   map.touchZoomRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('touchstart', this._onStart, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"pinch to rotate and zoom\" interaction.\n     * @example\n     *   map.touchZoomRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('touchstart', this._onStart);\n        this._enabled = false;\n    },\n\n    /**\n     * Disable the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n     * interaction enabled.\n     * @example\n     *   map.touchZoomRotate.disableRotation();\n     */\n    disableRotation: function() {\n        this._rotationDisabled = true;\n    },\n\n    /**\n     * Enable the \"pinch to rotate\" interaction, undoing a call to\n     * `disableRotation`.\n     * @example\n     *   map.touchZoomRotate.enable();\n     *   map.touchZoomRotate.enableRotation();\n     */\n    enableRotation: function() {\n        this._rotationDisabled = false;\n    },\n\n    _onStart: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]);\n\n        this._startVec = p0.sub(p1);\n        this._startScale = this._map.transform.scale;\n        this._startBearing = this._map.transform.bearing;\n        this._gestureIntent = undefined;\n        this._inertia = [];\n\n        document.addEventListener('touchmove', this._onMove, false);\n        document.addEventListener('touchend', this._onEnd, false);\n    },\n\n    _onMove: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]),\n            p = p0.add(p1).div(2),\n            vec = p0.sub(p1),\n            scale = vec.mag() / this._startVec.mag(),\n            bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI,\n            map = this._map;\n\n        // Determine 'intent' by whichever threshold is surpassed first,\n        // then keep that state for the duration of this gesture.\n        if (!this._gestureIntent) {\n            var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold),\n                rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold);\n\n            if (rotatingSignificantly) {\n                this._gestureIntent = 'rotate';\n            } else if (scalingSignificantly) {\n                this._gestureIntent = 'zoom';\n            }\n\n            if (this._gestureIntent) {\n                this._startVec = vec;\n                this._startScale = map.transform.scale;\n                this._startBearing = map.transform.bearing;\n            }\n\n        } else {\n            var param = { duration: 0, around: map.unproject(p) };\n\n            if (this._gestureIntent === 'rotate') {\n                param.bearing = this._startBearing + bearing;\n            }\n            if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') {\n                param.zoom = map.transform.scaleZoom(this._startScale * scale);\n            }\n\n            map.stop();\n            this._drainInertiaBuffer();\n            this._inertia.push([Date.now(), scale, p]);\n\n            map.easeTo(param, { originalEvent: e });\n        }\n\n        e.preventDefault();\n    },\n\n    _onEnd: function (e) {\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onEnd);\n        this._drainInertiaBuffer();\n\n        var inertia = this._inertia,\n            map = this._map;\n\n        if (inertia.length < 2) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            lastScale = map.transform.scaleZoom(this._startScale * last[1]),\n            firstScale = map.transform.scaleZoom(this._startScale * first[1]),\n            scaleOffset = lastScale - firstScale,\n            scaleDuration = (last[0] - first[0]) / 1000,\n            p = last[2];\n\n        if (scaleDuration === 0 || lastScale === firstScale) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        // calculate scale/s speed and adjust for increased initial animation speed when easing\n        var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s\n\n        if (Math.abs(speed) > inertiaMaxSpeed) {\n            if (speed > 0) {\n                speed = inertiaMaxSpeed;\n            } else {\n                speed = -inertiaMaxSpeed;\n            }\n        }\n\n        var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000,\n            targetScale = lastScale + speed * duration / 2000;\n\n        if (targetScale < 0) {\n            targetScale = 0;\n        }\n\n        map.easeTo({\n            zoom: targetScale,\n            duration: duration,\n            easing: inertiaEasing,\n            around: map.unproject(p)\n        }, { originalEvent: e });\n    },\n\n    _drainInertiaBuffer: function() {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160; // msec\n\n        while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/***/ }),\n/* 1085 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(10);\nvar interpolate = __webpack_require__(191);\nvar browser = __webpack_require__(39);\nvar LngLat = __webpack_require__(89);\nvar LngLatBounds = __webpack_require__(198);\nvar Point = __webpack_require__(11);\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo},\n * controlling the destination location, zoom level, bearing and pitch.\n * All properties are options; unspecified\n * options will default to the current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLat} center Map center\n * @property {number} zoom Map zoom level\n * @property {number} bearing Map rotation bearing in degrees counter-clockwise from north\n * @property {number} pitch Map angle in degrees at which the camera is looking at the ground\n * @property {LngLat} around If zooming, the zoom center (defaults to map center)\n */\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration of the animation and easing function. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration Number in milliseconds\n * @property {Function} easing\n * @property {Array} offset point, origin of movement relative to map center\n * @property {boolean} animate When set to false, no animation happens\n */\n\nvar Camera = module.exports = function() {};\n\nutil.extend(Camera.prototype, /** @lends Map.prototype */{\n    /**\n     * Get the current view geographical point.\n     * @returns {LngLat}\n     */\n    getCenter: function() { return this.transform.center; },\n\n    /**\n     * Sets a map location. Equivalent to `jumpTo({center: center})`.\n     *\n     * @param {LngLat} center Map center to jump to\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * map.setCenter([-74, 38]);\n     */\n    setCenter: function(center, eventData) {\n        this.jumpTo({center: center}, eventData);\n        return this;\n    },\n\n    /**\n     * Pan by a certain number of pixels\n     *\n     * @param {Array<number>} offset [x, y]\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panBy: function(offset, options, eventData) {\n        this.panTo(this.transform.center,\n            util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Pan to a certain location with easing\n     *\n     * @param {LngLat} lnglat Location to pan to\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panTo: function(lnglat, options, eventData) {\n        return this.easeTo(util.extend({\n            center: lnglat\n        }, options), eventData);\n    },\n\n\n    /**\n     * Get the current zoom\n     * @returns {number}\n     */\n    getZoom: function() { return this.transform.zoom; },\n\n    /**\n     * Sets a map zoom. Equivalent to `jumpTo({zoom: zoom})`.\n     *\n     * @param {number} zoom Map zoom level\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     * @example\n     * // zoom the map to 5\n     * map.setZoom(5);\n     */\n    setZoom: function(zoom, eventData) {\n        this.jumpTo({zoom: zoom}, eventData);\n        return this;\n    },\n\n    /**\n     * Zooms to a certain zoom level with easing.\n     *\n     * @param {number} zoom\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomTo: function(zoom, options, eventData) {\n        return this.easeTo(util.extend({\n            zoom: zoom\n        }, options), eventData);\n    },\n\n    /**\n     * Zoom in by 1 level\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomIn: function(options, eventData) {\n        this.zoomTo(this.getZoom() + 1, options, eventData);\n        return this;\n    },\n\n    /**\n     * Zoom out by 1 level\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomOut: function(options, eventData) {\n        this.zoomTo(this.getZoom() - 1, options, eventData);\n        return this;\n    },\n\n\n    /**\n     * Get the current bearing in degrees\n     * @returns {number}\n     */\n    getBearing: function() { return this.transform.bearing; },\n\n    /**\n     * Sets a map rotation. Equivalent to `jumpTo({bearing: bearing})`.\n     *\n     * @param {number} bearing Map rotation bearing in degrees counter-clockwise from north\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // rotate the map to 90 degrees\n     * map.setBearing(90);\n     */\n    setBearing: function(bearing, eventData) {\n        this.jumpTo({bearing: bearing}, eventData);\n        return this;\n    },\n\n    /**\n     * Rotate bearing by a certain number of degrees with easing\n     *\n     * @param {number} bearing\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    rotateTo: function(bearing, options, eventData) {\n        return this.easeTo(util.extend({\n            bearing: bearing\n        }, options), eventData);\n    },\n\n    /**\n     * Sets map bearing to 0 (north) with easing\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    resetNorth: function(options, eventData) {\n        this.rotateTo(0, util.extend({duration: 1000}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Animates map bearing to 0 (north) if it's already close to it.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    snapToNorth: function(options, eventData) {\n        if (Math.abs(this.getBearing()) < this.options.bearingSnap) {\n            return this.resetNorth(options, eventData);\n        }\n        return this;\n    },\n\n    /**\n     * Get the current angle in degrees\n     * @returns {number}\n     */\n    getPitch: function() { return this.transform.pitch; },\n\n    /**\n     * Sets a map angle. Equivalent to `jumpTo({pitch: pitch})`.\n     *\n     * @param {number} pitch The angle at which the camera is looking at the ground\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    setPitch: function(pitch, eventData) {\n        this.jumpTo({pitch: pitch}, eventData);\n        return this;\n    },\n\n\n    /**\n     * Zoom to contain certain geographical bounds\n     *\n     * @param {LngLatBounds|Array<Array<number>>} bounds [[minLng, minLat], [maxLng, maxLat]]\n     * @param {Object} options\n     * @param {boolean} [options.linear] When true, the map transitions to the new camera using\n     *     {@link Map#easeTo}. When false, the map transitions using {@link Map#flyTo}. See\n     *     {@link Map#flyTo} for information on options specific to that animation transition.\n     * @param {Function} options.easing\n     * @param {number} options.padding how much padding there is around the given bounds on each side in pixels\n     * @param {number} options.maxZoom The resulting zoom level will be at most\n     *     this value.\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    fitBounds: function(bounds, options, eventData) {\n\n        options = util.extend({\n            padding: 0,\n            offset: [0, 0],\n            maxZoom: Infinity\n        }, options);\n\n        bounds = LngLatBounds.convert(bounds);\n\n        var offset = Point.convert(options.offset),\n            tr = this.transform,\n            nw = tr.project(bounds.getNorthWest()),\n            se = tr.project(bounds.getSouthEast()),\n            size = se.sub(nw),\n            scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x,\n            scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n        options.center = tr.unproject(nw.add(se).div(2));\n        options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n        options.bearing = 0;\n\n        return options.linear ?\n            this.easeTo(options, eventData) :\n            this.flyTo(options, eventData);\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, without\n     * a transition. The map will retain the current values for any options\n     * not included in `options`.\n     *\n     * @param {CameraOptions} options map view options\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    jumpTo: function(options, eventData) {\n        this.stop();\n\n        var tr = this.transform,\n            zoomChanged = false,\n            bearingChanged = false,\n            pitchChanged = false;\n\n        if ('zoom' in options && tr.zoom !== +options.zoom) {\n            zoomChanged = true;\n            tr.zoom = +options.zoom;\n        }\n\n        if ('center' in options) {\n            tr.center = LngLat.convert(options.center);\n        }\n\n        if ('bearing' in options && tr.bearing !== +options.bearing) {\n            bearingChanged = true;\n            tr.bearing = +options.bearing;\n        }\n\n        if ('pitch' in options && tr.pitch !== +options.pitch) {\n            pitchChanged = true;\n            tr.pitch = +options.pitch;\n        }\n\n        this.fire('movestart', eventData)\n            .fire('move', eventData);\n\n        if (zoomChanged) {\n            this.fire('zoomstart', eventData)\n                .fire('zoom', eventData)\n                .fire('zoomend', eventData);\n        }\n\n        if (bearingChanged) {\n            this.fire('rotate', eventData);\n        }\n\n        if (pitchChanged) {\n            this.fire('pitch', eventData);\n        }\n\n        return this.fire('moveend', eventData);\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, with a smooth animation\n     * between old and new values. The map will retain the current values for any options\n     * not included in `options`.\n     *\n     * @param {CameraOptions|AnimationOptions} options map view and animation options\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    easeTo: function(options, eventData) {\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            duration: 500,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n\n            zoom = 'zoom' in options ? +options.zoom : startZoom,\n            bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n            pitch = 'pitch' in options ? +options.pitch : startPitch,\n\n            toLngLat,\n            toPoint;\n\n        if ('center' in options) {\n            toLngLat = LngLat.convert(options.center);\n            toPoint = tr.centerPoint.add(offset);\n        } else if ('around' in options) {\n            toLngLat = LngLat.convert(options.around);\n            toPoint = tr.locationPoint(toLngLat);\n        } else {\n            toPoint = tr.centerPoint.add(offset);\n            toLngLat = tr.pointLocation(toPoint);\n        }\n\n        var fromPoint = tr.locationPoint(toLngLat);\n\n        if (options.animate === false) options.duration = 0;\n\n        this.zooming = (zoom !== startZoom);\n        this.rotating = (startBearing !== bearing);\n        this.pitching = (pitch !== startPitch);\n\n        if (!options.noMoveStart) {\n            this.fire('movestart', eventData);\n        }\n        if (this.zooming) {\n            this.fire('zoomstart', eventData);\n        }\n\n        clearTimeout(this._onEaseEnd);\n\n        this._ease(function (k) {\n            if (this.zooming) {\n                tr.zoom = interpolate(startZoom, zoom, k);\n            }\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k)));\n\n            this.fire('move', eventData);\n            if (this.zooming) {\n                this.fire('zoom', eventData);\n            }\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            if (options.delayEndEvents) {\n                this._onEaseEnd = setTimeout(this._easeToEnd.bind(this, eventData), options.delayEndEvents);\n            } else {\n                this._easeToEnd(eventData);\n            }\n        }.bind(this), options);\n\n        return this;\n    },\n\n    _easeToEnd: function(eventData) {\n        if (this.zooming) {\n            this.fire('zoomend', eventData);\n        }\n        this.fire('moveend', eventData);\n\n        this.zooming = false;\n        this.rotating = false;\n        this.pitching = false;\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, animated along a curve that\n     * evokes flight. The transition animation seamlessly incorporates zooming and panning to help\n     * the user find his or her bearings even after traversing a great distance.\n     *\n     * @param {CameraOptions|AnimationOptions} options map view and animation options\n     * @param {number} [options.curve=1.42] Relative amount of zooming that takes place along the\n     *     flight path. A high value maximizes zooming for an exaggerated animation, while a low\n     *     value minimizes zooming for something closer to {@link Map#easeTo}. 1.42 is the average\n     *     value selected by participants in the user study in\n     *     [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n     *     `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n     *     value of 1 would produce a circular motion.\n     * @param {number} [options.minZoom] Zero-based zoom level at the peak of the flight path. If\n     *     `options.curve` is specified, this option is ignored.\n     * @param {number} [options.speed=1.2] Average speed of the animation. A speed of 1.2 means that\n     *     the map appears to move along the flight path by 1.2 times `options.curve` screenfuls every\n     *     second. A _screenful_ is the visible span in pixels. It does not correspond to a fixed\n     *     physical distance but rather varies by zoom level.\n     * @param {number} [options.screenSpeed] Average speed of the animation, measured in screenfuls\n     *     per second, assuming a linear timing curve. If `options.speed` is specified, this option\n     *     is ignored.\n     * @param {Function} [options.easing] Transition timing curve\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {this}\n     * @example\n     * // fly with default options to null island\n     * map.flyTo({center: [0, 0], zoom: 9});\n     * // using flyTo options\n     * map.flyTo({\n     *   center: [0, 0],\n     *   zoom: 9,\n     *   speed: 0.2,\n     *   curve: 1,\n     *   easing: function(t) {\n     *     return t;\n     *   }\n     * });\n     */\n    flyTo: function(options, eventData) {\n        // This method implements an “optimal path” animation, as detailed in:\n        //\n        // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n        //   ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.\n        //\n        // Where applicable, local variable documentation begins with the associated variable or\n        // function in van Wijk (2003).\n\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            speed: 1.2,\n            curve: 1.42,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch();\n\n        var center = 'center' in options ? LngLat.convert(options.center) : this.getCenter();\n        var zoom = 'zoom' in options ?  +options.zoom : startZoom;\n        var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n        var pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n        // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n        // interpolating between the two endpoints will cross it.\n        if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) {\n            if (tr.center.lng > 0 && center.lng < 0) {\n                center.lng += 360;\n            } else if (tr.center.lng < 0 && center.lng > 0) {\n                center.lng -= 360;\n            }\n        }\n\n        var scale = tr.zoomScale(zoom - startZoom),\n            from = tr.point,\n            to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from;\n\n        var startWorldSize = tr.worldSize,\n            rho = options.curve,\n\n            // w₀: Initial visible span, measured in pixels at the initial scale.\n            w0 = Math.max(tr.width, tr.height),\n            // w₁: Final visible span, measured in pixels with respect to the initial scale.\n            w1 = w0 / scale,\n            // Length of the flight path as projected onto the ground plane, measured in pixels from\n            // the world image origin at the initial scale.\n            u1 = to.sub(from).mag();\n\n        if ('minZoom' in options) {\n            var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n            // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial\n            // scale.\n            var wMax = w0 / tr.zoomScale(minZoom - startZoom);\n            rho = Math.sqrt(wMax / u1 * 2);\n        }\n\n        // ρ²\n        var rho2 = rho * rho;\n\n        /**\n         * rᵢ: Returns the zoom-out factor at one end of the animation.\n         *\n         * @param i 0 for the ascent or 1 for the descent.\n         * @private\n         */\n        function r(i) {\n            var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n            return Math.log(Math.sqrt(b * b + 1) - b);\n        }\n\n        function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n        function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n        function tanh(n) { return sinh(n) / cosh(n); }\n\n        // r₀: Zoom-out factor during ascent.\n        var r0 = r(0),\n            /**\n             * w(s): Returns the visible span on the ground, measured in pixels with respect to the\n             * initial scale.\n             *\n             * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n             * @private\n             */\n            w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n            /**\n             * u(s): Returns the distance along the flight path as projected onto the ground plane,\n             * measured in pixels from the world image origin at the initial scale.\n             * @private\n             */\n            u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n            // S: Total length of the flight path, measured in ρ-screenfuls.\n            S = (r(1) - r0) / rho;\n\n        // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n        if (Math.abs(u1) < 0.000001) {\n            // Perform a more or less instantaneous transition if the path is too short.\n            if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options);\n\n            var k = w1 < w0 ? -1 : 1;\n            S = Math.abs(Math.log(w1 / w0)) / rho;\n\n            u = function() { return 0; };\n            w = function(s) { return Math.exp(k * rho * s); };\n        }\n\n        if ('duration' in options) {\n            options.duration = +options.duration;\n        } else {\n            var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n            options.duration = 1000 * S / V;\n        }\n\n        this.zooming = true;\n        if (startBearing !== bearing) this.rotating = true;\n        if (startPitch !== pitch) this.pitching = true;\n\n        this.fire('movestart', eventData);\n        this.fire('zoomstart', eventData);\n\n        this._ease(function (k) {\n            // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n            var s = k * S,\n                us = u(s);\n\n            tr.zoom = startZoom + tr.scaleZoom(1 / w(s));\n            tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize);\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            this.fire('move', eventData);\n            this.fire('zoom', eventData);\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            this.fire('zoomend', eventData);\n            this.fire('moveend', eventData);\n            this.zooming = false;\n            this.rotating = false;\n            this.pitching = false;\n        }, options);\n\n        return this;\n    },\n\n    isEasing: function() {\n        return !!this._abortFn;\n    },\n\n    /**\n     * Stop current animation\n     *\n     * @returns {Map} `this`\n     */\n    stop: function() {\n        if (this._abortFn) {\n            this._abortFn();\n            this._finishEase();\n        }\n        return this;\n    },\n\n    _ease: function(frame, finish, options) {\n        this._finishFn = finish;\n        this._abortFn = browser.timed(function (t) {\n            frame.call(this, options.easing(t));\n            if (t === 1) {\n                this._finishEase();\n            }\n        }, options.animate === false ? 0 : options.duration, this);\n    },\n\n    _finishEase: function() {\n        delete this._abortFn;\n        // The finish function might emit events which trigger new eases, which\n        // set a new _finishFn. Ensure we don't delete it unintentionally.\n        var finish = this._finishFn;\n        delete this._finishFn;\n        finish.call(this);\n    },\n\n    // convert bearing so that it's numerically close to the current one so that it interpolates properly\n    _normalizeBearing: function(bearing, currentBearing) {\n        bearing = util.wrap(bearing, -180, 180);\n        var diff = Math.abs(bearing - currentBearing);\n        if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n        if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n        return bearing;\n    },\n\n    _updateEasing: function(duration, zoom, bezier) {\n        var easing;\n\n        if (this.ease) {\n            var ease = this.ease,\n                t = (Date.now() - ease.start) / ease.duration,\n                speed = ease.easing(t + 0.01) - ease.easing(t),\n\n                // Quick hack to make new bezier that is continuous with last\n                x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n                y = Math.sqrt(0.27 * 0.27 - x * x);\n\n            easing = util.bezier(x, y, 0.25, 1);\n        } else {\n            easing = bezier ? util.bezier.apply(util, bezier) : util.ease;\n        }\n\n        // store information on current easing\n        this.ease = {\n            start: (new Date()).getTime(),\n            to: Math.pow(2, zoom),\n            duration: duration,\n            easing: easing\n        };\n\n        return easing;\n    }\n});\n\n/**\n * Pitch event. This event is emitted whenever the map's pitch changes.\n *\n * @event pitch\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n/***/ }),\n/* 1086 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(199);\nvar DOM = __webpack_require__(62);\nvar util = __webpack_require__(10);\n\nmodule.exports = Navigation;\n\n/**\n * Creates a navigation control with zoom buttons and a compass\n * @class Navigation\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * map.addControl(new mapboxgl.Navigation({position: 'top-left'})); // position is optional\n */\nfunction Navigation(options) {\n    util.setOptions(this, options);\n}\n\nNavigation.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map));\n        this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map));\n        this._compass = this._createButton(className + '-icon ' + className + '-compass', map.resetNorth.bind(map));\n\n        this._compassArrow = DOM.create('div', 'arrow', this._compass);\n\n        this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n        this._onCompassMove = this._onCompassMove.bind(this);\n        this._onCompassUp = this._onCompassUp.bind(this);\n\n        map.on('rotate', this._rotateCompassArrow.bind(this));\n        this._rotateCompassArrow();\n\n        this._el = map.getCanvasContainer();\n\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onCompassDown: function(e) {\n        if (e.button !== 0) return;\n\n        DOM.disableDrag();\n        document.addEventListener('mousemove', this._onCompassMove);\n        document.addEventListener('mouseup', this._onCompassUp);\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassMove: function(e) {\n        if (e.button !== 0) return;\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassUp: function(e) {\n        if (e.button !== 0) return;\n\n        document.removeEventListener('mousemove', this._onCompassMove);\n        document.removeEventListener('mouseup', this._onCompassUp);\n        DOM.enableDrag();\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _createButton: function(className, fn) {\n        var a = DOM.create('button', className, this._container);\n        a.addEventListener('click', function() { fn(); });\n        return a;\n    },\n\n    _rotateCompassArrow: function() {\n        var rotate = 'rotate(' + (this._map.transform.angle * (180 / Math.PI)) + 'deg)';\n        this._compassArrow.style.transform = rotate;\n    }\n});\n\n\nfunction copyMouseEvent(e) {\n    return new MouseEvent(e.type, {\n        button: 2,    // right click\n        buttons: 2,   // right click\n        bubbles: true,\n        cancelable: true,\n        detail: e.detail,\n        view: e.view,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        movementX: e.movementX,\n        movementY: e.movementY,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey\n    });\n}\n\n\n\n/***/ }),\n/* 1087 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(199);\nvar browser = __webpack_require__(39);\nvar DOM = __webpack_require__(62);\nvar util = __webpack_require__(10);\n\nmodule.exports = Geolocate;\n\nvar geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };\n\n\n/**\n * Creates a geolocation control\n * @class Geolocate\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * map.addControl(new mapboxgl.Geolocate({position: 'top-left'})); // position is optional\n */\nfunction Geolocate(options) {\n    util.setOptions(this, options);\n}\n\nGeolocate.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        if (!browser.supportsGeolocation) return container;\n\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._geolocateButton = DOM.create('button', (className + '-icon ' + className + '-geolocate'), this._container);\n        this._geolocateButton.addEventListener('click', this._onClickGeolocate.bind(this));\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onClickGeolocate: function() {\n        navigator.geolocation.getCurrentPosition(this._success.bind(this), this._error.bind(this), geoOptions);\n\n        // This timeout ensures that we still call finish() even if\n        // the user declines to share their location in Firefox\n        this._timeoutId = setTimeout(this._finish.bind(this), 10000 /* 10sec */);\n    },\n\n    _success: function(position) {\n        this._map.jumpTo({\n            center: [position.coords.longitude, position.coords.latitude],\n            zoom: 17,\n            bearing: 0,\n            pitch: 0\n        });\n\n        this.fire('geolocate', position);\n        this._finish();\n    },\n\n    _error: function(error) {\n        this.fire('error', error);\n        this._finish();\n    },\n\n    _finish: function() {\n        if (this._timeoutId) { clearTimeout(this._timeoutId); }\n        this._timeoutId = undefined;\n    }\n\n});\n\n /**\n  * geolocate event.\n  *\n  * @event geolocate\n  * @memberof Control\n  * @instance\n  * @property {EventData} data The returned Position object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition)\n  *\n  */\n\n /**\n  * error event.\n  *\n  * @event error\n  * @memberof Control\n  * @instance\n  * @property {EventData} data The returned PositionError object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition)\n  *\n  */\n\n\n/***/ }),\n/* 1088 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Popup;\n\nvar util = __webpack_require__(10);\nvar Evented = __webpack_require__(55);\nvar DOM = __webpack_require__(62);\nvar LngLat = __webpack_require__(89);\n\n/**\n * Creates a popup component\n * @class Popup\n * @param {Object} options\n * @param {boolean} options.closeButton whether to show a close button in the\n * top right corner of the popup.\n * @param {boolean} options.closeOnClick whether to close the popup when the\n * map is clicked.\n * @param {string} options.anchor - One of \"top\", \"bottom\", \"left\", \"right\", \"top-left\",\n * \"top-right\", \"bottom-left\", or \"bottom-right\", describing where the popup's anchor\n * relative to the coordinate set via `setLngLat`.\n * @example\n * var tooltip = new mapboxgl.Popup()\n *   .setLngLat(e.lngLat)\n *   .setHTML(\"<h1>Hello World!</h1>\")\n *   .addTo(map);\n */\nfunction Popup(options) {\n    util.setOptions(this, options);\n    util.bindAll([\n        '_update',\n        '_onClickClose'],\n        this);\n}\n\nPopup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{\n    options: {\n        closeButton: true,\n        closeOnClick: true\n    },\n\n    /**\n     * Attaches the popup to a map\n     * @param {Map} map\n     * @returns {Popup} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        this._map.on('move', this._update);\n        if (this.options.closeOnClick) {\n            this._map.on('click', this._onClickClose);\n        }\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the popup from a map\n     * @example\n     * var popup = new mapboxgl.Popup().addTo(map);\n     * popup.remove();\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map.off('click', this._onClickClose);\n            delete this._map;\n        }\n\n        return this;\n    },\n\n    /**\n     * Get the popup's geographical location\n     * @returns {LngLat}\n     */\n    getLngLat: function() {\n        return this._lngLat;\n    },\n\n    /**\n     * Set the popup's geographical position and move it.\n     * @param {LngLat} lnglat\n     * @returns {Popup} `this`\n     */\n    setLngLat: function(lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Fill a popup element with text only content. This creates a text node\n     * in the DOM, so it cannot end up appending raw HTML. Use this method\n     * if you want an added level of security against XSS if the popup\n     * content is user-provided.\n     * @param {string} text\n     * @returns {Popup} `this`\n     * @example\n     * var tooltip = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setText('Hello, world!')\n     *   .addTo(map);\n     */\n    setText: function(text) {\n        return this.setDOMContent(document.createTextNode(text));\n    },\n\n    /**\n     * Fill a popup element with HTML content, provided as a string.\n     * @param {string} html\n     * @returns {Popup} `this`\n     */\n    setHTML: function(html) {\n        var frag = document.createDocumentFragment();\n        var temp = document.createElement('body'), child;\n        temp.innerHTML = html;\n        while (true) {\n            child = temp.firstChild;\n            if (!child) break;\n            frag.appendChild(child);\n        }\n\n        return this.setDOMContent(frag);\n    },\n\n    /**\n     * Fill a popup element with DOM content\n     * @param {Node} htmlNode Popup content as a DOM node\n     * @returns {Popup} `this`\n     * @example\n     * // create an element with the popup content\n     * var div = document.createElement('div');\n     * div.innerHTML = 'Hello, world!';\n     * var tooltip = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setDOMContent(div)\n     *   .addTo(map);\n     */\n    setDOMContent: function(htmlNode) {\n        this._createContent();\n        this._content.appendChild(htmlNode);\n        this._update();\n        return this;\n    },\n\n    _createContent: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        this._content = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n        if (this.options.closeButton) {\n            this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content);\n            this._closeButton.innerHTML = '&#215;';\n            this._closeButton.addEventListener('click', this._onClickClose);\n        }\n    },\n\n    _update: function() {\n        if (!this._map || !this._lngLat || !this._content) { return; }\n\n        if (!this._container) {\n            this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n            this._tip       = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n            this._container.appendChild(this._content);\n        }\n\n        var pos = this._map.project(this._lngLat).round(),\n            anchor = this.options.anchor;\n\n        if (!anchor) {\n            var width = this._container.offsetWidth,\n                height = this._container.offsetHeight;\n\n            if (pos.y < height) {\n                anchor = ['top'];\n            } else if (pos.y > this._map.transform.height - height) {\n                anchor = ['bottom'];\n            } else {\n                anchor = [];\n            }\n\n            if (pos.x < width / 2) {\n                anchor.push('left');\n            } else if (pos.x > this._map.transform.width - width / 2) {\n                anchor.push('right');\n            }\n\n            if (anchor.length === 0) {\n                anchor = 'bottom';\n            } else {\n                anchor = anchor.join('-');\n            }\n        }\n\n        var anchorTranslate = {\n            'top': 'translate(-50%,0)',\n            'top-left': 'translate(0,0)',\n            'top-right': 'translate(-100%,0)',\n            'bottom': 'translate(-50%,-100%)',\n            'bottom-left': 'translate(0,-100%)',\n            'bottom-right': 'translate(-100%,-100%)',\n            'left': 'translate(0,-50%)',\n            'right': 'translate(-100%,-50%)'\n        };\n\n        var classList = this._container.classList;\n        for (var key in anchorTranslate) {\n            classList.remove('mapboxgl-popup-anchor-' + key);\n        }\n        classList.add('mapboxgl-popup-anchor-' + anchor);\n\n        DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + pos.x + 'px,' + pos.y + 'px)');\n    },\n\n    _onClickClose: function() {\n        this.remove();\n    }\n});\n\n\n/***/ }),\n/* 1089 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * Bowser - a browser detector\n * https://github.com/ded/bowser\n * MIT License | (c) Dustin Diaz 2015\n */\n\n!function (root, name, definition) {\n  if (typeof module != 'undefined' && module.exports) module.exports = definition()\n  else if (true) __webpack_require__(1090)(name, definition)\n  else root[name] = definition()\n}(this, 'bowser', function () {\n  /**\n    * See useragents.js for examples of navigator.userAgent\n    */\n\n  var t = true\n\n  function detect(ua) {\n\n    function getFirstMatch(regex) {\n      var match = ua.match(regex);\n      return (match && match.length > 1 && match[1]) || '';\n    }\n\n    function getSecondMatch(regex) {\n      var match = ua.match(regex);\n      return (match && match.length > 1 && match[2]) || '';\n    }\n\n    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()\n      , likeAndroid = /like android/i.test(ua)\n      , android = !likeAndroid && /android/i.test(ua)\n      , nexusMobile = /nexus\\s*[0-6]\\s*/i.test(ua)\n      , nexusTablet = !nexusMobile && /nexus\\s*[0-9]+/i.test(ua)\n      , chromeos = /CrOS/.test(ua)\n      , silk = /silk/i.test(ua)\n      , sailfish = /sailfish/i.test(ua)\n      , tizen = /tizen/i.test(ua)\n      , webos = /(web|hpw)(o|0)s/i.test(ua)\n      , windowsphone = /windows phone/i.test(ua)\n      , samsungBrowser = /SamsungBrowser/i.test(ua)\n      , windows = !windowsphone && /windows/i.test(ua)\n      , mac = !iosdevice && !silk && /macintosh/i.test(ua)\n      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)\n      , edgeVersion = getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.\\d+)?)/i)\n      , versionIdentifier = getFirstMatch(/version\\/(\\d+(\\.\\d+)?)/i)\n      , tablet = /tablet/i.test(ua) && !/tablet pc/i.test(ua)\n      , mobile = !tablet && /[^-]mobi/i.test(ua)\n      , xbox = /xbox/i.test(ua)\n      , result\n\n    if (/opera/i.test(ua)) {\n      //  an old Opera\n      result = {\n        name: 'Opera'\n      , opera: t\n      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    } else if (/opr\\/|opios/i.test(ua)) {\n      // a new Opera\n      result = {\n        name: 'Opera'\n        , opera: t\n        , version: getFirstMatch(/(?:opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (/SamsungBrowser/i.test(ua)) {\n      result = {\n        name: 'Samsung Internet for Android'\n        , samsungBrowser: t\n        , version: versionIdentifier || getFirstMatch(/(?:SamsungBrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/Whale/i.test(ua)) {\n      result = {\n        name: 'NAVER Whale browser'\n        , whale: t\n        , version: getFirstMatch(/(?:whale)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/MZBrowser/i.test(ua)) {\n      result = {\n        name: 'MZ Browser'\n        , mzbrowser: t\n        , version: getFirstMatch(/(?:MZBrowser)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/coast/i.test(ua)) {\n      result = {\n        name: 'Opera Coast'\n        , coast: t\n        , version: versionIdentifier || getFirstMatch(/(?:coast)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/focus/i.test(ua)) {\n      result = {\n        name: 'Focus'\n        , focus: t\n        , version: getFirstMatch(/(?:focus)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/yabrowser/i.test(ua)) {\n      result = {\n        name: 'Yandex Browser'\n      , yandexbrowser: t\n      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/ucbrowser/i.test(ua)) {\n      result = {\n          name: 'UC Browser'\n        , ucbrowser: t\n        , version: getFirstMatch(/(?:ucbrowser)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/mxios/i.test(ua)) {\n      result = {\n        name: 'Maxthon'\n        , maxthon: t\n        , version: getFirstMatch(/(?:mxios)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/epiphany/i.test(ua)) {\n      result = {\n        name: 'Epiphany'\n        , epiphany: t\n        , version: getFirstMatch(/(?:epiphany)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/puffin/i.test(ua)) {\n      result = {\n        name: 'Puffin'\n        , puffin: t\n        , version: getFirstMatch(/(?:puffin)[\\s\\/](\\d+(?:\\.\\d+)?)/i)\n      }\n    }\n    else if (/sleipnir/i.test(ua)) {\n      result = {\n        name: 'Sleipnir'\n        , sleipnir: t\n        , version: getFirstMatch(/(?:sleipnir)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/k-meleon/i.test(ua)) {\n      result = {\n        name: 'K-Meleon'\n        , kMeleon: t\n        , version: getFirstMatch(/(?:k-meleon)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (windowsphone) {\n      result = {\n        name: 'Windows Phone'\n      , osname: 'Windows Phone'\n      , windowsphone: t\n      }\n      if (edgeVersion) {\n        result.msedge = t\n        result.version = edgeVersion\n      }\n      else {\n        result.msie = t\n        result.version = getFirstMatch(/iemobile\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/msie|trident/i.test(ua)) {\n      result = {\n        name: 'Internet Explorer'\n      , msie: t\n      , version: getFirstMatch(/(?:msie |rv:)(\\d+(\\.\\d+)?)/i)\n      }\n    } else if (chromeos) {\n      result = {\n        name: 'Chrome'\n      , osname: 'Chrome OS'\n      , chromeos: t\n      , chromeBook: t\n      , chrome: t\n      , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n      }\n    } else if (/edg([ea]|ios)/i.test(ua)) {\n      result = {\n        name: 'Microsoft Edge'\n      , msedge: t\n      , version: edgeVersion\n      }\n    }\n    else if (/vivaldi/i.test(ua)) {\n      result = {\n        name: 'Vivaldi'\n        , vivaldi: t\n        , version: getFirstMatch(/vivaldi\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (sailfish) {\n      result = {\n        name: 'Sailfish'\n      , osname: 'Sailfish OS'\n      , sailfish: t\n      , version: getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/seamonkey\\//i.test(ua)) {\n      result = {\n        name: 'SeaMonkey'\n      , seamonkey: t\n      , version: getFirstMatch(/seamonkey\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/firefox|iceweasel|fxios/i.test(ua)) {\n      result = {\n        name: 'Firefox'\n      , firefox: t\n      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \\/](\\d+(\\.\\d+)?)/i)\n      }\n      if (/\\((mobile|tablet);[^\\)]*rv:[\\d\\.]+\\)/i.test(ua)) {\n        result.firefoxos = t\n        result.osname = 'Firefox OS'\n      }\n    }\n    else if (silk) {\n      result =  {\n        name: 'Amazon Silk'\n      , silk: t\n      , version : getFirstMatch(/silk\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/phantom/i.test(ua)) {\n      result = {\n        name: 'PhantomJS'\n      , phantom: t\n      , version: getFirstMatch(/phantomjs\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/slimerjs/i.test(ua)) {\n      result = {\n        name: 'SlimerJS'\n        , slimer: t\n        , version: getFirstMatch(/slimerjs\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/blackberry|\\bbb\\d+/i.test(ua) || /rim\\stablet/i.test(ua)) {\n      result = {\n        name: 'BlackBerry'\n      , osname: 'BlackBerry OS'\n      , blackberry: t\n      , version: versionIdentifier || getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (webos) {\n      result = {\n        name: 'WebOS'\n      , osname: 'WebOS'\n      , webos: t\n      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\\/(\\d+(\\.\\d+)?)/i)\n      };\n      /touchpad\\//i.test(ua) && (result.touchpad = t)\n    }\n    else if (/bada/i.test(ua)) {\n      result = {\n        name: 'Bada'\n      , osname: 'Bada'\n      , bada: t\n      , version: getFirstMatch(/dolfin\\/(\\d+(\\.\\d+)?)/i)\n      };\n    }\n    else if (tizen) {\n      result = {\n        name: 'Tizen'\n      , osname: 'Tizen'\n      , tizen: t\n      , version: getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n      };\n    }\n    else if (/qupzilla/i.test(ua)) {\n      result = {\n        name: 'QupZilla'\n        , qupzilla: t\n        , version: getFirstMatch(/(?:qupzilla)[\\s\\/](\\d+(?:\\.\\d+)+)/i) || versionIdentifier\n      }\n    }\n    else if (/chromium/i.test(ua)) {\n      result = {\n        name: 'Chromium'\n        , chromium: t\n        , version: getFirstMatch(/(?:chromium)[\\s\\/](\\d+(?:\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (/chrome|crios|crmo/i.test(ua)) {\n      result = {\n        name: 'Chrome'\n        , chrome: t\n        , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (android) {\n      result = {\n        name: 'Android'\n        , version: versionIdentifier\n      }\n    }\n    else if (/safari|applewebkit/i.test(ua)) {\n      result = {\n        name: 'Safari'\n      , safari: t\n      }\n      if (versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    }\n    else if (iosdevice) {\n      result = {\n        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'\n      }\n      // WTF: version is not part of user agent in web apps\n      if (versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    }\n    else if(/googlebot/i.test(ua)) {\n      result = {\n        name: 'Googlebot'\n      , googlebot: t\n      , version: getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i) || versionIdentifier\n      }\n    }\n    else {\n      result = {\n        name: getFirstMatch(/^(.*)\\/(.*) /),\n        version: getSecondMatch(/^(.*)\\/(.*) /)\n     };\n   }\n\n    // set webkit or gecko flag for browsers based on these engines\n    if (!result.msedge && /(apple)?webkit/i.test(ua)) {\n      if (/(apple)?webkit\\/537\\.36/i.test(ua)) {\n        result.name = result.name || \"Blink\"\n        result.blink = t\n      } else {\n        result.name = result.name || \"Webkit\"\n        result.webkit = t\n      }\n      if (!result.version && versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    } else if (!result.opera && /gecko\\//i.test(ua)) {\n      result.name = result.name || \"Gecko\"\n      result.gecko = t\n      result.version = result.version || getFirstMatch(/gecko\\/(\\d+(\\.\\d+)?)/i)\n    }\n\n    // set OS flags for platforms that have multiple browsers\n    if (!result.windowsphone && (android || result.silk)) {\n      result.android = t\n      result.osname = 'Android'\n    } else if (!result.windowsphone && iosdevice) {\n      result[iosdevice] = t\n      result.ios = t\n      result.osname = 'iOS'\n    } else if (mac) {\n      result.mac = t\n      result.osname = 'macOS'\n    } else if (xbox) {\n      result.xbox = t\n      result.osname = 'Xbox'\n    } else if (windows) {\n      result.windows = t\n      result.osname = 'Windows'\n    } else if (linux) {\n      result.linux = t\n      result.osname = 'Linux'\n    }\n\n    function getWindowsVersion (s) {\n      switch (s) {\n        case 'NT': return 'NT'\n        case 'XP': return 'XP'\n        case 'NT 5.0': return '2000'\n        case 'NT 5.1': return 'XP'\n        case 'NT 5.2': return '2003'\n        case 'NT 6.0': return 'Vista'\n        case 'NT 6.1': return '7'\n        case 'NT 6.2': return '8'\n        case 'NT 6.3': return '8.1'\n        case 'NT 10.0': return '10'\n        default: return undefined\n      }\n    }\n\n    // OS version extraction\n    var osVersion = '';\n    if (result.windows) {\n      osVersion = getWindowsVersion(getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i))\n    } else if (result.windowsphone) {\n      osVersion = getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i);\n    } else if (result.mac) {\n      osVersion = getFirstMatch(/Mac OS X (\\d+([_\\.\\s]\\d+)*)/i);\n      osVersion = osVersion.replace(/[_\\s]/g, '.');\n    } else if (iosdevice) {\n      osVersion = getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i);\n      osVersion = osVersion.replace(/[_\\s]/g, '.');\n    } else if (android) {\n      osVersion = getFirstMatch(/android[ \\/-](\\d+(\\.\\d+)*)/i);\n    } else if (result.webos) {\n      osVersion = getFirstMatch(/(?:web|hpw)os\\/(\\d+(\\.\\d+)*)/i);\n    } else if (result.blackberry) {\n      osVersion = getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i);\n    } else if (result.bada) {\n      osVersion = getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i);\n    } else if (result.tizen) {\n      osVersion = getFirstMatch(/tizen[\\/\\s](\\d+(\\.\\d+)*)/i);\n    }\n    if (osVersion) {\n      result.osversion = osVersion;\n    }\n\n    // device type extraction\n    var osMajorVersion = !result.windows && osVersion.split('.')[0];\n    if (\n         tablet\n      || nexusTablet\n      || iosdevice == 'ipad'\n      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))\n      || result.silk\n    ) {\n      result.tablet = t\n    } else if (\n         mobile\n      || iosdevice == 'iphone'\n      || iosdevice == 'ipod'\n      || android\n      || nexusMobile\n      || result.blackberry\n      || result.webos\n      || result.bada\n    ) {\n      result.mobile = t\n    }\n\n    // Graded Browser Support\n    // http://developer.yahoo.com/yui/articles/gbs\n    if (result.msedge ||\n        (result.msie && result.version >= 10) ||\n        (result.yandexbrowser && result.version >= 15) ||\n\t\t    (result.vivaldi && result.version >= 1.0) ||\n        (result.chrome && result.version >= 20) ||\n        (result.samsungBrowser && result.version >= 4) ||\n        (result.whale && compareVersions([result.version, '1.0']) === 1) ||\n        (result.mzbrowser && compareVersions([result.version, '6.0']) === 1) ||\n        (result.focus && compareVersions([result.version, '1.0']) === 1) ||\n        (result.firefox && result.version >= 20.0) ||\n        (result.safari && result.version >= 6) ||\n        (result.opera && result.version >= 10.0) ||\n        (result.ios && result.osversion && result.osversion.split(\".\")[0] >= 6) ||\n        (result.blackberry && result.version >= 10.1)\n        || (result.chromium && result.version >= 20)\n        ) {\n      result.a = t;\n    }\n    else if ((result.msie && result.version < 10) ||\n        (result.chrome && result.version < 20) ||\n        (result.firefox && result.version < 20.0) ||\n        (result.safari && result.version < 6) ||\n        (result.opera && result.version < 10.0) ||\n        (result.ios && result.osversion && result.osversion.split(\".\")[0] < 6)\n        || (result.chromium && result.version < 20)\n        ) {\n      result.c = t\n    } else result.x = t\n\n    return result\n  }\n\n  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent || '' : '')\n\n  bowser.test = function (browserList) {\n    for (var i = 0; i < browserList.length; ++i) {\n      var browserItem = browserList[i];\n      if (typeof browserItem=== 'string') {\n        if (browserItem in bowser) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Get version precisions count\n   *\n   * @example\n   *   getVersionPrecision(\"1.10.3\") // 3\n   *\n   * @param  {string} version\n   * @return {number}\n   */\n  function getVersionPrecision(version) {\n    return version.split(\".\").length;\n  }\n\n  /**\n   * Array::map polyfill\n   *\n   * @param  {Array} arr\n   * @param  {Function} iterator\n   * @return {Array}\n   */\n  function map(arr, iterator) {\n    var result = [], i;\n    if (Array.prototype.map) {\n      return Array.prototype.map.call(arr, iterator);\n    }\n    for (i = 0; i < arr.length; i++) {\n      result.push(iterator(arr[i]));\n    }\n    return result;\n  }\n\n  /**\n   * Calculate browser version weight\n   *\n   * @example\n   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1\n   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1\n   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0\n   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1\n   *\n   * @param  {Array<String>} versions versions to compare\n   * @return {Number} comparison result\n   */\n  function compareVersions(versions) {\n    // 1) get common precision for both versions, for example for \"10.0\" and \"9\" it should be 2\n    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));\n    var chunks = map(versions, function (version) {\n      var delta = precision - getVersionPrecision(version);\n\n      // 2) \"9\" -> \"9.0\" (for precision = 2)\n      version = version + new Array(delta + 1).join(\".0\");\n\n      // 3) \"9.0\" -> [\"000000000\"\", \"000000009\"]\n      return map(version.split(\".\"), function (chunk) {\n        return new Array(20 - chunk.length).join(\"0\") + chunk;\n      }).reverse();\n    });\n\n    // iterate in reverse order by reversed chunks array\n    while (--precision >= 0) {\n      // 4) compare: \"000000009\" > \"000000010\" = false (but \"9\" > \"10\" = true)\n      if (chunks[0][precision] > chunks[1][precision]) {\n        return 1;\n      }\n      else if (chunks[0][precision] === chunks[1][precision]) {\n        if (precision === 0) {\n          // all version chunks are same\n          return 0;\n        }\n      }\n      else {\n        return -1;\n      }\n    }\n  }\n\n  /**\n   * Check if browser is unsupported\n   *\n   * @example\n   *   bowser.isUnsupportedBrowser({\n   *     msie: \"10\",\n   *     firefox: \"23\",\n   *     chrome: \"29\",\n   *     safari: \"5.1\",\n   *     opera: \"16\",\n   *     phantom: \"534\"\n   *   });\n   *\n   * @param  {Object}  minVersions map of minimal version to browser\n   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map\n   * @param  {String}  [ua] user agent string\n   * @return {Boolean}\n   */\n  function isUnsupportedBrowser(minVersions, strictMode, ua) {\n    var _bowser = bowser;\n\n    // make strictMode param optional with ua param usage\n    if (typeof strictMode === 'string') {\n      ua = strictMode;\n      strictMode = void(0);\n    }\n\n    if (strictMode === void(0)) {\n      strictMode = false;\n    }\n    if (ua) {\n      _bowser = detect(ua);\n    }\n\n    var version = \"\" + _bowser.version;\n    for (var browser in minVersions) {\n      if (minVersions.hasOwnProperty(browser)) {\n        if (_bowser[browser]) {\n          if (typeof minVersions[browser] !== 'string') {\n            throw new Error('Browser version in the minVersion map should be a string: ' + browser + ': ' + String(minVersions));\n          }\n\n          // browser version and min supported version.\n          return compareVersions([version, minVersions[browser]]) < 0;\n        }\n      }\n    }\n\n    return strictMode; // not found\n  }\n\n  /**\n   * Check if browser is supported\n   *\n   * @param  {Object} minVersions map of minimal version to browser\n   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map\n   * @param  {String}  [ua] user agent string\n   * @return {Boolean}\n   */\n  function check(minVersions, strictMode, ua) {\n    return !isUnsupportedBrowser(minVersions, strictMode, ua);\n  }\n\n  bowser.isUnsupportedBrowser = isUnsupportedBrowser;\n  bowser.compareVersions = compareVersions;\n  bowser.check = check;\n\n  /*\n   * Set our detect method to the main bowser object so we can\n   * reuse it to test other user agents.\n   * This is needed to implement future tests.\n   */\n  bowser._detect = detect;\n\n  /*\n   * Set our detect public method to the main bowser object\n   * This is needed to implement bowser in server side\n   */\n  bowser.detect = detect;\n  return bowser\n});\n\n\n/***/ }),\n/* 1090 */\n/***/ (function(module, exports) {\n\nmodule.exports = function() {\r\n\tthrow new Error(\"define cannot be used indirect\");\r\n};\r\n\n\n/***/ }),\n/* 1091 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _desc, _value, _class; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = __webpack_require__(270);\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _mapboxGl = __webpack_require__(272);\n\nvar _document = __webpack_require__(281);\n\nvar _document2 = _interopRequireDefault(_document);\n\nvar _window = __webpack_require__(157);\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _noop = __webpack_require__(579);\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar ua = typeof _window2.default.navigator !== 'undefined' ? _window2.default.navigator.userAgent.toLowerCase() : '';\nvar firefox = ua.indexOf('firefox') !== -1;\n\nfunction mousePos(el, event) {\n  var rect = el.getBoundingClientRect();\n  event = event.touches ? event.touches[0] : event;\n  return new _mapboxGl.Point(event.clientX - rect.left - el.clientLeft, event.clientY - rect.top - el.clientTop);\n}\n\n/* eslint-disable max-len */\n// Portions of the code below originally from:\n// https://github.com/mapbox/mapbox-gl-js/blob/master/js/ui/handler/scroll_zoom.js\n/* eslint-enable max-len */\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  height: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  onMouseDown: _propTypes2.default.func,\n  onMouseDrag: _propTypes2.default.func,\n  onMouseRotate: _propTypes2.default.func,\n  onMouseUp: _propTypes2.default.func,\n  onMouseMove: _propTypes2.default.func,\n  onZoom: _propTypes2.default.func,\n  onZoomEnd: _propTypes2.default.func\n};\n\nvar DEFAULT_PROPS = {\n  onMouseDown: _noop2.default,\n  onMouseDrag: _noop2.default,\n  onMouseRotate: _noop2.default,\n  onMouseUp: _noop2.default,\n  onMouseMove: _noop2.default,\n  onZoom: _noop2.default,\n  onZoomEnd: _noop2.default\n};\n\nvar MapInteractions = (_class = function (_Component) {\n  _inherits(MapInteractions, _Component);\n\n  function MapInteractions(props) {\n    _classCallCheck(this, MapInteractions);\n\n    var _this = _possibleConstructorReturn(this, (MapInteractions.__proto__ || Object.getPrototypeOf(MapInteractions)).call(this, props));\n\n    _this.state = {\n      startPos: null,\n      pos: null,\n      mouseWheelPos: null\n    };\n    return _this;\n  }\n\n  _createClass(MapInteractions, [{\n    key: '_getMousePos',\n    value: function _getMousePos(event) {\n      var el = this.refs.container;\n      return mousePos(el, event);\n    }\n  }, {\n    key: '_onMouseDown',\n    value: function _onMouseDown(event) {\n      var pos = this._getMousePos(event);\n      this.setState({\n        startPos: pos,\n        pos: pos,\n        metaKey: Boolean(event.metaKey)\n      });\n      this.props.onMouseDown({ pos: pos });\n      _document2.default.addEventListener('mousemove', this._onMouseDrag, false);\n      _document2.default.addEventListener('mouseup', this._onMouseUp, false);\n    }\n  }, {\n    key: '_onMouseDrag',\n    value: function _onMouseDrag(event) {\n      var pos = this._getMousePos(event);\n      this.setState({ pos: pos });\n      if (this.state.metaKey) {\n        var startPos = this.state.startPos;\n\n        this.props.onMouseRotate({ pos: pos, startPos: startPos });\n      } else {\n        this.props.onMouseDrag({ pos: pos });\n      }\n    }\n  }, {\n    key: '_onMouseUp',\n    value: function _onMouseUp(event) {\n      _document2.default.removeEventListener('mousemove', this._onMouseDrag, false);\n      _document2.default.removeEventListener('mouseup', this._onMouseUp, false);\n      var pos = this._getMousePos(event);\n      this.setState({ pos: pos });\n      this.props.onMouseUp({ pos: pos });\n    }\n  }, {\n    key: '_onMouseMove',\n    value: function _onMouseMove(event) {\n      var pos = this._getMousePos(event);\n      this.props.onMouseMove({ pos: pos });\n    }\n\n    /* eslint-disable complexity, max-statements */\n\n  }, {\n    key: '_onWheel',\n    value: function _onWheel(event) {\n      // the following have been disabled because they eliminate\n      // the ability to scroll selects/select-like elements in popups\n      if (this.props.zoomDisabled) {\n        return;\n      }\n\n      event.stopPropagation();\n      event.preventDefault();\n      var value = event.deltaY;\n      // Firefox doubles the values on retina screens...\n      if (firefox && event.deltaMode === _window2.default.WheelEvent.DOM_DELTA_PIXEL) {\n        value /= _window2.default.devicePixelRatio;\n      }\n      if (event.deltaMode === _window2.default.WheelEvent.DOM_DELTA_LINE) {\n        value *= 40;\n      }\n\n      var type = this.state.mouseWheelType;\n      var timeout = this.state.mouseWheelTimeout;\n      var lastValue = this.state.mouseWheelLastValue;\n      var time = this.state.mouseWheelTime;\n\n      var now = (_window2.default.performance || Date).now();\n      var timeDelta = now - (time || 0);\n\n      var pos = this._getMousePos(event);\n      time = now;\n\n      if (value !== 0 && value % 4.000244140625 === 0) {\n        // This one is definitely a mouse wheel event.\n        type = 'wheel';\n        // Normalize this value to match trackpad.\n        value = Math.floor(value / 4);\n      } else if (value !== 0 && Math.abs(value) < 4) {\n        // This one is definitely a trackpad event because it is so small.\n        type = 'trackpad';\n      } else if (timeDelta > 400) {\n        // This is likely a new scroll action.\n        type = null;\n        lastValue = value;\n\n        // Start a timeout in case this was a singular event, and delay it by up\n        // to 40ms.\n        timeout = _window2.default.setTimeout(function setTimeout() {\n          var _type = 'wheel';\n          this._zoom(-this.state.mouseWheelLastValue, this.state.mouseWheelPos);\n          this.setState({ mouseWheelType: _type });\n        }.bind(this), 40);\n      } else if (!this._type) {\n        // This is a repeating event, but we don't know the type of event just\n        // yet.\n        // If the delta per time is small, we assume it's a fast trackpad;\n        // otherwise we switch into wheel mode.\n        type = Math.abs(timeDelta * value) < 200 ? 'trackpad' : 'wheel';\n\n        // Make sure our delayed event isn't fired again, because we accumulate\n        // the previous event (which was less than 40ms ago) into this event.\n        if (timeout) {\n          _window2.default.clearTimeout(timeout);\n          timeout = null;\n          value += lastValue;\n        }\n      }\n\n      // Slow down zoom if shift key is held for more precise zooming\n      if (event.shiftKey && value) {\n        value = value / 4;\n      }\n\n      // Only fire the callback if we actually know what type of scrolling device\n      // the user uses.\n      if (type) {\n        this._zoom(-value, pos);\n      }\n\n      this.setState({\n        mouseWheelTime: time,\n        mouseWheelPos: pos,\n        mouseWheelType: type,\n        mouseWheelTimeout: timeout,\n        mouseWheelLastValue: lastValue\n      });\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: '_zoom',\n    value: function _zoom(delta, pos) {\n\n      // Scale by sigmoid of scroll wheel delta.\n      var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n      if (delta < 0 && scale !== 0) {\n        scale = 1 / scale;\n      }\n      this.props.onZoom({ pos: pos, scale: scale });\n      _window2.default.clearTimeout(this._zoomEndTimeout);\n      this._zoomEndTimeout = _window2.default.setTimeout(function _setTimeout() {\n        this.props.onZoomEnd();\n      }.bind(this), 200);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        {\n          ref: 'container',\n          onMouseMove: this._onMouseMove,\n          onMouseDown: this._onMouseDown,\n          onContextMenu: this._onMouseDown,\n          onWheel: this._onWheel,\n          style: {\n            width: this.props.width,\n            height: this.props.height,\n            position: 'relative'\n          } },\n        this.props.children\n      );\n    }\n  }]);\n\n  return MapInteractions;\n}(_react.Component), (_applyDecoratedDescriptor(_class.prototype, '_onMouseDown', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseDown'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseDrag'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseUp', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseUp'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseMove', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseMove'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onWheel', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onWheel'), _class.prototype)), _class);\nexports.default = MapInteractions;\n\n\nMapInteractions.propTypes = PROP_TYPES;\nMapInteractions.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtaW50ZXJhY3Rpb25zLnJlYWN0LmpzIl0sIm5hbWVzIjpbInVhIiwid2luZG93IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJmaXJlZm94IiwiaW5kZXhPZiIsIm1vdXNlUG9zIiwiZWwiLCJldmVudCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3VjaGVzIiwiUG9pbnQiLCJjbGllbnRYIiwibGVmdCIsImNsaWVudExlZnQiLCJjbGllbnRZIiwidG9wIiwiY2xpZW50VG9wIiwiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwib25lT2ZUeXBlIiwibnVtYmVyIiwic3RyaW5nIiwiaGVpZ2h0Iiwib25Nb3VzZURvd24iLCJmdW5jIiwib25Nb3VzZURyYWciLCJvbk1vdXNlUm90YXRlIiwib25Nb3VzZVVwIiwib25Nb3VzZU1vdmUiLCJvblpvb20iLCJvblpvb21FbmQiLCJERUZBVUxUX1BST1BTIiwibm9vcCIsIk1hcEludGVyYWN0aW9ucyIsInByb3BzIiwic3RhdGUiLCJzdGFydFBvcyIsInBvcyIsIm1vdXNlV2hlZWxQb3MiLCJyZWZzIiwiY29udGFpbmVyIiwiX2dldE1vdXNlUG9zIiwic2V0U3RhdGUiLCJtZXRhS2V5IiwiQm9vbGVhbiIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbk1vdXNlRHJhZyIsIl9vbk1vdXNlVXAiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiem9vbURpc2FibGVkIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJ2YWx1ZSIsImRlbHRhWSIsImRlbHRhTW9kZSIsIldoZWVsRXZlbnQiLCJET01fREVMVEFfUElYRUwiLCJkZXZpY2VQaXhlbFJhdGlvIiwiRE9NX0RFTFRBX0xJTkUiLCJ0eXBlIiwibW91c2VXaGVlbFR5cGUiLCJ0aW1lb3V0IiwibW91c2VXaGVlbFRpbWVvdXQiLCJsYXN0VmFsdWUiLCJtb3VzZVdoZWVsTGFzdFZhbHVlIiwidGltZSIsIm1vdXNlV2hlZWxUaW1lIiwibm93IiwicGVyZm9ybWFuY2UiLCJEYXRlIiwidGltZURlbHRhIiwiTWF0aCIsImZsb29yIiwiYWJzIiwic2V0VGltZW91dCIsIl90eXBlIiwiX3pvb20iLCJiaW5kIiwiY2xlYXJUaW1lb3V0Iiwic2hpZnRLZXkiLCJkZWx0YSIsInNjYWxlIiwiZXhwIiwiX3pvb21FbmRUaW1lb3V0IiwiX3NldFRpbWVvdXQiLCJfb25Nb3VzZU1vdmUiLCJfb25Nb3VzZURvd24iLCJfb25XaGVlbCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJDb21wb25lbnQiLCJhdXRvYmluZCIsInByb3BUeXBlcyIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OzJCQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxLQUFLLE9BQU9DLGlCQUFPQyxTQUFkLEtBQTRCLFdBQTVCLEdBQ1RELGlCQUFPQyxTQUFQLENBQWlCQyxTQUFqQixDQUEyQkMsV0FBM0IsRUFEUyxHQUNrQyxFQUQ3QztBQUVBLElBQU1DLFVBQVVMLEdBQUdNLE9BQUgsQ0FBVyxTQUFYLE1BQTBCLENBQUMsQ0FBM0M7O0FBRUEsU0FBU0MsUUFBVCxDQUFrQkMsRUFBbEIsRUFBc0JDLEtBQXRCLEVBQTZCO0FBQzNCLE1BQU1DLE9BQU9GLEdBQUdHLHFCQUFILEVBQWI7QUFDQUYsVUFBUUEsTUFBTUcsT0FBTixHQUFnQkgsTUFBTUcsT0FBTixDQUFjLENBQWQsQ0FBaEIsR0FBbUNILEtBQTNDO0FBQ0EsU0FBTyxJQUFJSSxlQUFKLENBQ0xKLE1BQU1LLE9BQU4sR0FBZ0JKLEtBQUtLLElBQXJCLEdBQTRC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Z0IxQ0MsMkIsc0pBYUFBLDJCLG9KQVlBQSwyQixvSkFTQUEsMkIsa0pBT0FBLDJCO2tCQXpEa0IzRCxlOzs7QUFtTHJCQSxnQkFBZ0I0RCxTQUFoQixHQUE0QjdFLFVBQTVCO0FBQ0FpQixnQkFBZ0I2RCxZQUFoQixHQUErQi9ELGFBQS9CIiwiZmlsZSI6Im1hcC1pbnRlcmFjdGlvbnMucmVhY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCB7UG9pbnR9IGZyb20gJ21hcGJveC1nbCc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgbm9vcCBmcm9tICcuL25vb3AnO1xuXG5jb25zdCB1YSA9IHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/XG4gIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJztcbmNvbnN0IGZpcmVmb3ggPSB1YS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuXG5mdW5jdGlvbiBtb3VzZVBvcyhlbCwgZXZlbnQpIHtcbiAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBldmVudCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gIHJldHVybiBuZXcgUG9pbnQoXG4gICAgZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICk7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8vIFBvcnRpb25zIG9mIHRoZSBjb2RlIGJlbG93IG9yaWdpbmFsbHkgZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2Jsb2IvbWFzdGVyL2pzL3VpL2hhbmRsZXIvc2Nyb2xsX3pvb20uanNcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICBQcm9wVHlwZXMuc3RyaW5nXG4gIF0pLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5udW1iZXIsXG4gICAgUHJvcFR5cGVzLnN0cmluZ1xuICBdKSxcbiAgb25Nb3VzZURvd246IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRHJhZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VSb3RhdGU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlVXA6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTW92ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uWm9vbTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uWm9vbUVuZDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IERFRkFVTFRfUFJPUFMgPSB7XG4gIG9uTW91c2VEb3duOiBub29wLFxuICBvbk1vdXNlRHJhZzogbm9vcCxcbiAgb25Nb3VzZVJvdGF0ZTogbm9vcCxcbiAgb25Nb3VzZVVwOiBub29wLFxuICBvbk1vdXNlTW92ZTogbm9vcCxcbiAgb25ab29tOiBub29wLFxuICBvblpvb21FbmQ6IG5vb3Bcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcEludGVyYWN0aW9ucyBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHN0YXJ0UG9zOiBudWxsLFxuICAgICAgcG9zOiBudWxsLFxuICAgICAgbW91c2VXaGVlbFBvczogbnVsbFxuICAgIH07XG4gIH1cblxuICBfZ2V0TW91c2VQb3MoZXZlbnQpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMucmVmcy5jb250YWluZXI7XG4gICAgcmV0dXJuIG1vdXNlUG9zKGVsLCBldmVudCk7XG4gIH1cblxuICBAYXV0b2JpbmRcbiAgX29uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3MoZXZlbnQpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3RhcnRQb3M6IHBvcyxcbiAgICAgIHBvcyxcbiAgICAgIG1ldGFLZXk6IEJvb2xlYW4oZXZlbnQubWV0YUtleSlcbiAgICB9KTtcbiAgICB0aGlzLnByb3BzLm9uTW91c2VEb3duKHtwb3N9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlRHJhZywgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25Nb3VzZURyYWcoZXZlbnQpIHtcbiAgICBjb25zdCBwb3MgPSB0aGlzLl9nZXRNb3VzZVBvcyhldmVudCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7cG9zfSk7XG4gICAgaWYgKHRoaXMuc3RhdGUubWV0YUtleSkge1xuICAgICAgY29uc3Qge3N0YXJ0UG9zfSA9IHRoaXMuc3RhdGU7XG4gICAgICB0aGlzLnByb3BzLm9uTW91c2VSb3RhdGUoe3Bvcywgc3RhcnRQb3N9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdXNlRHJhZyh7cG9zfSk7XG4gICAgfVxuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9vbk1vdXNlVXAoZXZlbnQpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlRHJhZywgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgICBjb25zdCBwb3MgPSB0aGlzLl9nZXRNb3VzZVBvcyhldmVudCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7cG9zfSk7XG4gICAgdGhpcy5wcm9wcy5vbk1vdXNlVXAoe3Bvc30pO1xuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9vbk1vdXNlTW92ZShldmVudCkge1xuICAgIGNvbnN0IHBvcyA9IHRoaXMuX2dldE1vdXNlUG9zKGV2ZW50KTtcbiAgICB0aGlzLnByb3BzLm9uTW91c2VNb3ZlKHtwb3N9KTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzICovXG4gIEBhdXRvYmluZFxuICBfb25XaGVlbChldmVudCkge1xuICAgIC8vIHRoZSBmb2xsb3dpbmcgaGF2ZSBiZWVuIGRpc2FibGVkIGJlY2F1c2UgdGhleSBlbGltaW5hdGVcbiAgICAvLyB0aGUgYWJpbGl0eSB0byBzY3JvbGwgc2VsZWN0cy9zZWxlY3QtbGlrZSBlbGVtZW50cyBpbiBwb3B1cHNcbiAgICBpZiAodGhpcy5wcm9wcy56b29tRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LmRlbHRhWTtcbiAgICAvLyBGaXJlZm94IGRvdWJsZXMgdGhlIHZhbHVlcyBvbiByZXRpbmEgc2NyZWVucy4uLlxuICAgIGlmIChmaXJlZm94ICYmIGV2ZW50LmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMKSB7XG4gICAgICB2YWx1ZSAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB9XG4gICAgaWYgKGV2ZW50LmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHtcbiAgICAgIHZhbHVlICo9IDQwO1xuICAgIH1cblxuICAgIGxldCB0eXBlID0gdGhpcy5zdGF0ZS5tb3VzZVdoZWVsVHlwZTtcbiAgICBsZXQgdGltZW91dCA9IHRoaXMuc3RhdGUubW91c2VXaGVlbFRpbWVvdXQ7XG4gICAgbGV0IGxhc3RWYWx1ZSA9IHRoaXMuc3RhdGUubW91c2VXaGVlbExhc3RWYWx1ZTtcbiAgICBsZXQgdGltZSA9IHRoaXMuc3RhdGUubW91c2VXaGVlbFRpbWU7XG5cbiAgICBjb25zdCBub3cgPSAod2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGUpLm5vdygpO1xuICAgIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtICh0aW1lIHx8IDApO1xuXG4gICAgY29uc3QgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3MoZXZlbnQpO1xuICAgIHRpbWUgPSBub3c7XG5cbiAgICBpZiAodmFsdWUgIT09IDAgJiYgdmFsdWUgJSA0LjAwMDI0NDE0MDYyNSA9PT0gMCkge1xuICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgICAgdHlwZSA9ICd3aGVlbCc7XG4gICAgICAvLyBOb3JtYWxpemUgdGhpcyB2YWx1ZSB0byBtYXRjaCB0cmFja3BhZC5cbiAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSAvIDQpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IDAgJiYgTWF0aC5hYnModmFsdWUpIDwgNCkge1xuICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIHRyYWNrcGFkIGV2ZW50IGJlY2F1c2UgaXQgaXMgc28gc21hbGwuXG4gICAgICB0eXBlID0gJ3RyYWNrcGFkJztcbiAgICB9IGVsc2UgaWYgKHRpbWVEZWx0YSA+IDQwMCkge1xuICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgIHR5cGUgPSBudWxsO1xuICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIC8vIFN0YXJ0IGEgdGltZW91dCBpbiBjYXNlIHRoaXMgd2FzIGEgc2luZ3VsYXIgZXZlbnQsIGFuZCBkZWxheSBpdCBieSB1cFxuICAgICAgLy8gdG8gNDBtcy5cbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiBzZXRUaW1lb3V0KCkge1xuICAgICAgICBjb25zdCBfdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX3pvb20oLXRoaXMuc3RhdGUubW91c2VXaGVlbExhc3RWYWx1ZSwgdGhpcy5zdGF0ZS5tb3VzZVdoZWVsUG9zKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bW91c2VXaGVlbFR5cGU6IF90eXBlfSk7XG4gICAgICB9LmJpbmQodGhpcyksIDQwKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0XG4gICAgICAvLyB5ZXQuXG4gICAgICAvLyBJZiB0aGUgZGVsdGEgcGVyIHRpbWUgaXMgc21hbGwsIHdlIGFzc3VtZSBpdCdzIGEgZmFzdCB0cmFja3BhZDtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgdHlwZSA9IE1hdGguYWJzKHRpbWVEZWx0YSAqIHZhbHVlKSA8IDIwMCA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdmFsdWUgKz0gbGFzdFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB2YWx1ZSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlXG4gICAgLy8gdGhlIHVzZXIgdXNlcy5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy5fem9vbSgtdmFsdWUsIHBvcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtb3VzZVdoZWVsVGltZTogdGltZSxcbiAgICAgIG1vdXNlV2hlZWxQb3M6IHBvcyxcbiAgICAgIG1vdXNlV2hlZWxUeXBlOiB0eXBlLFxuICAgICAgbW91c2VXaGVlbFRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICBtb3VzZVdoZWVsTGFzdFZhbHVlOiBsYXN0VmFsdWVcbiAgICB9KTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzICovXG5cbiAgX3pvb20oZGVsdGEsIHBvcykge1xuXG4gICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgbGV0IHNjYWxlID0gMiAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKGRlbHRhIC8gMTAwKSkpO1xuICAgIGlmIChkZWx0YSA8IDAgJiYgc2NhbGUgIT09IDApIHtcbiAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uWm9vbSh7cG9zLCBzY2FsZX0pO1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fem9vbUVuZFRpbWVvdXQpO1xuICAgIHRoaXMuX3pvb21FbmRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gX3NldFRpbWVvdXQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uWm9vbUVuZCgpO1xuICAgIH0uYmluZCh0aGlzKSwgMjAwKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9XCJjb250YWluZXJcIlxuICAgICAgICBvbk1vdXNlTW92ZT17IHRoaXMuX29uTW91c2VNb3ZlIH1cbiAgICAgICAgb25Nb3VzZURvd249eyB0aGlzLl9vbk1vdXNlRG93biB9XG4gICAgICAgIG9uQ29udGV4dE1lbnU9eyB0aGlzLl9vbk1vdXNlRG93biB9XG4gICAgICAgIG9uV2hlZWw9eyB0aGlzLl9vbldoZWVsIH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgd2lkdGg6IHRoaXMucHJvcHMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLnByb3BzLmhlaWdodCxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9IH0+XG5cbiAgICAgICAgeyB0aGlzLnByb3BzLmNoaWxkcmVuIH1cblxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5NYXBJbnRlcmFjdGlvbnMucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcbk1hcEludGVyYWN0aW9ucy5kZWZhdWx0UHJvcHMgPSBERUZBVUxUX1BST1BTO1xuIl19\n\n/***/ }),\n/* 1092 */\n/***/ (function(module, exports) {\n\n/* (ignored) */\n\n/***/ }),\n/* 1093 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.diffSources = diffSources;\nexports.diffLayers = diffLayers;\nexports.default = diffStyle;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable max-statements */\nfunction diffSources(prevStyle, nextStyle) {\n  var prevSources = prevStyle.get('sources');\n  var nextSources = nextStyle.get('sources');\n  var enter = [];\n  var update = [];\n  var exit = [];\n  var prevIds = prevSources.keySeq().toArray();\n  var nextIds = nextSources.keySeq().toArray();\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = prevIds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var id = _step.value;\n\n      var nextSource = nextSources.get(id);\n      if (nextSource) {\n        if (!nextSource.equals(prevSources.get(id))) {\n          update.push({ id: id, source: nextSources.get(id) });\n        }\n      } else {\n        exit.push({ id: id, source: prevSources.get(id) });\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = nextIds[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var _id = _step2.value;\n\n      var prevSource = prevSources.get(_id);\n      if (!prevSource) {\n        enter.push({ id: _id, source: nextSources.get(_id) });\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n\n  return { enter: enter, update: update, exit: exit };\n}\n/* eslint-enable max-statements */\n\nfunction diffLayers(prevStyle, nextStyle) {\n  var prevLayers = prevStyle.get('layers');\n  var nextLayers = nextStyle.get('layers');\n  var updates = [];\n  var exiting = [];\n  var prevMap = {};\n  var nextMap = {};\n  nextLayers.forEach(function (layer, index) {\n    var id = layer.get('id');\n    var layerImBehind = nextLayers.get(index + 1);\n    nextMap[id] = {\n      layer: layer,\n      id: id,\n      // The `id` of the layer before this one.\n      before: layerImBehind ? layerImBehind.get('id') : null,\n      enter: true\n    };\n  });\n  prevLayers.forEach(function (layer, index) {\n    var id = layer.get('id');\n    var layerImBehind = prevLayers.get(index + 1);\n    prevMap[id] = {\n      layer: layer,\n      id: id,\n      before: layerImBehind ? layerImBehind.get('id') : null\n    };\n    if (nextMap[id]) {\n      // Not a new layer.\n      nextMap[id].enter = false;\n    } else {\n      // This layer is being removed.\n      exiting.push(prevMap[id]);\n    }\n  });\n  var _iteratorNormalCompletion3 = true;\n  var _didIteratorError3 = false;\n  var _iteratorError3 = undefined;\n\n  try {\n    for (var _iterator3 = nextLayers.reverse()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n      var layer = _step3.value;\n\n      var id = layer.get('id');\n      if (!prevMap[id] || !prevMap[id].layer.equals(nextMap[id].layer) || prevMap[id].before !== nextMap[id].before) {\n        // This layer is being changed.\n        updates.push(nextMap[id]);\n      }\n    }\n  } catch (err) {\n    _didIteratorError3 = true;\n    _iteratorError3 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion3 && _iterator3.return) {\n        _iterator3.return();\n      }\n    } finally {\n      if (_didIteratorError3) {\n        throw _iteratorError3;\n      }\n    }\n  }\n\n  return { updates: updates, exiting: exiting };\n}\n\nfunction diffStyle(prevStyle, nextStyle) {\n  return {\n    sourcesDiff: diffSources(prevStyle, nextStyle),\n    layersDiff: diffLayers(prevStyle, nextStyle)\n  };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaWZmLXN0eWxlcy5qcyJdLCJuYW1lcyI6WyJkaWZmU291cmNlcyIsImRpZmZMYXllcnMiLCJkaWZmU3R5bGUiLCJwcmV2U3R5bGUiLCJuZXh0U3R5bGUiLCJwcmV2U291cmNlcyIsImdldCIsIm5leHRTb3VyY2VzIiwiZW50ZXIiLCJ1cGRhdGUiLCJleGl0IiwicHJldklkcyIsImtleVNlcSIsInRvQXJyYXkiLCJuZXh0SWRzIiwiaWQiLCJuZXh0U291cmNlIiwiZXF1YWxzIiwicHVzaCIsInNvdXJjZSIsInByZXZTb3VyY2UiLCJwcmV2TGF5ZXJzIiwibmV4dExheWVycyIsInVwZGF0ZXMiLCJleGl0aW5nIiwicHJldk1hcCIsIm5leHRNYXAiLCJmb3JFYWNoIiwibGF5ZXIiLCJpbmRleCIsImxheWVySW1CZWhpbmQiLCJiZWZvcmUiLCJyZXZlcnNlIiwic291cmNlc0RpZmYiLCJsYXllcnNEaWZmIl0sIm1hcHBpbmdzIjoiOzs7OztRQXFCZ0JBLFcsR0FBQUEsVztRQTRCQUMsVSxHQUFBQSxVO2tCQWdEUUMsUztBQWpHeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDTyxTQUFTRixXQUFULENBQXFCRyxTQUFyQixFQUFnQ0MsU0FBaEMsRUFBMkM7QUFDaEQsTUFBTUMsY0FBY0YsVUFBVUcsR0FBVixDQUFjLFNBQWQsQ0FBcEI7QUFDQSxNQUFNQyxjQUFjSCxVQUFVRSxHQUFWLENBQWMsU0FBZCxDQUFwQjtBQUNBLE1BQU1FLFFBQVEsRUFBZDtBQUNBLE1BQU1DLFNBQVMsRUFBZjtBQUNBLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE1BQU1DLFVBQVVOLFlBQVlPLE1BQVosR0FBcUJDLE9BQXJCLEVBQWhCO0FBQ0EsTUFBTUMsVUFBVVAsWUFBWUssTUFBWixHQUFxQkMsT0FBckIsRUFBaEI7QUFQZ0Q7QUFBQTtBQUFBOztBQUFBO0FB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QVdVLE9BQVgsRUFBcEIsbUlBQTBDO0FBQUEsVUFBL0JKLEtBQStCOztBQUN4QyxVQUFNYixLQUFLYSxNQUFNdEIsR0FBTixDQUFVLElBQVYsQ0FBWDtBQUNBLFVBQ0UsQ0FBQ21CLFFBQVFWLEVBQVIsQ0FBRCxJQUNBLENBQUNVLFFBQVFWLEVBQVIsRUFBWWEsS0FBWixDQUFrQlgsTUFBbEIsQ0FBeUJTLFFBQVFYLEVBQVIsRUFBWWEsS0FBckMsQ0FERCxJQUVBSCxRQUFRVixFQUFSLEVBQVlnQixNQUFaLEtBQXVCTCxRQUFRWCxFQUFSLEVBQVlnQixNQUhyQyxFQUlFO0FBQ0E7QUFDQVIsZ0JBQVFMLElBQVIsQ0FBYVEsUUFBUVgsRUFBUixDQUFiO0FBQ0Q7QUFDRjtBQTVDOEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUE2Qy9DLFNBQU8sRUFBQ1EsZ0JBQUQsRUFBVUMsZ0JBQVYsRUFBUDtBQUNEOztBQUVjLFNBQVN0QixTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsU0FBOUIsRUFBeUM7QUFDdEQsU0FBTztBQUNMNkIsaUJBQWFqQyxZQUFZRyxTQUFaLEVBQXVCQyxTQUF2QixDQURSO0FBRUw4QixnQkFBWWpDLFdBQVdFLFNBQVgsRUFBc0JDLFNBQXRCO0FBRlAsR0FBUDtBQUlEIiwiZmlsZSI6ImRpZmYtc3R5bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmU291cmNlcyhwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICBjb25zdCBwcmV2U291cmNlcyA9IHByZXZTdHlsZS5nZXQoJ3NvdXJjZXMnKTtcbiAgY29uc3QgbmV4dFNvdXJjZXMgPSBuZXh0U3R5bGUuZ2V0KCdzb3VyY2VzJyk7XG4gIGNvbnN0IGVudGVyID0gW107XG4gIGNvbnN0IHVwZGF0ZSA9IFtdO1xuICBjb25zdCBleGl0ID0gW107XG4gIGNvbnN0IHByZXZJZHMgPSBwcmV2U291cmNlcy5rZXlTZXEoKS50b0FycmF5KCk7XG4gIGNvbnN0IG5leHRJZHMgPSBuZXh0U291cmNlcy5rZXlTZXEoKS50b0FycmF5KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgcHJldklkcykge1xuICAgIGNvbnN0IG5leHRTb3VyY2UgPSBuZXh0U291cmNlcy5nZXQoaWQpO1xuICAgIGlmIChuZXh0U291cmNlKSB7XG4gICAgICBpZiAoIW5leHRTb3VyY2UuZXF1YWxzKHByZXZTb3VyY2VzLmdldChpZCkpKSB7XG4gICAgICAgIHVwZGF0ZS5wdXNoKHtpZCwgc291cmNlOiBuZXh0U291cmNlcy5nZXQoaWQpfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXQucHVzaCh7aWQsIHNvdXJjZTogcHJldlNvdXJjZXMuZ2V0KGlkKX0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIG5leHRJZHMpIHtcbiAgICBjb25zdCBwcmV2U291cmNlID0gcHJldlNvdXJjZXMuZ2V0KGlkKTtcbiAgICBpZiAoIXByZXZTb3VyY2UpIHtcbiAgICAgIGVudGVyLnB1c2goe2lkLCBzb3VyY2U6IG5leHRTb3VyY2VzLmdldChpZCl9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtlbnRlciwgdXBkYXRlLCBleGl0fTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZMYXllcnMocHJldlN0eWxlLCBuZXh0U3R5bGUpIHtcbiAgY29uc3QgcHJldkxheWVycyA9IHByZXZTdHlsZS5nZXQoJ2xheWVycycpO1xuICBjb25zdCBuZXh0TGF5ZXJzID0gbmV4dFN0eWxlLmdldCgnbGF5ZXJzJyk7XG4gIGNvbnN0IHVwZGF0ZXMgPSBbXTtcbiAgY29uc3QgZXhpdGluZyA9IFtdO1xuICBjb25zdCBwcmV2TWFwID0ge307XG4gIGNvbnN0IG5leHRNYXAgPSB7fTtcbiAgbmV4dExheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZCA9IGxheWVyLmdldCgnaWQnKTtcbiAgICBjb25zdCBsYXllckltQmVoaW5kID0gbmV4dExheWVycy5nZXQoaW5kZXggKyAxKTtcbiAgICBuZXh0TWFwW2lkXSA9IHtcbiAgICAgIGxheWVyLFxuICAgICAgaWQsXG4gICAgICAvLyBUaGUgYGlkYCBvZiB0aGUgbGF5ZXIgYmVmb3JlIHRoaXMgb25lLlxuICAgICAgYmVmb3JlOiBsYXllckltQmVoaW5kID8gbGF5ZXJJbUJlaGluZC5nZXQoJ2lkJykgOiBudWxsLFxuICAgICAgZW50ZXI6IHRydWVcbiAgICB9O1xuICB9KTtcbiAgcHJldkxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZCA9IGxheWVyLmdldCgnaWQnKTtcbiAgICBjb25zdCBsYXllckltQmVoaW5kID0gcHJldkxheWVycy5nZXQoaW5kZXggKyAxKTtcbiAgICBwcmV2TWFwW2lkXSA9IHtcbiAgICAgIGxheWVyLFxuICAgICAgaWQsXG4gICAgICBiZWZvcmU6IGxheWVySW1CZWhpbmQgPyBsYXllckltQmVoaW5kLmdldCgnaWQnKSA6IG51bGxcbiAgICB9O1xuICAgIGlmIChuZXh0TWFwW2lkXSkge1xuICAgICAgLy8gTm90IGEgbmV3IGxheWVyLlxuICAgICAgbmV4dE1hcFtpZF0uZW50ZXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBsYXllciBpcyBiZWluZyByZW1vdmVkLlxuICAgICAgZXhpdGluZy5wdXNoKHByZXZNYXBbaWRdKTtcbiAgICB9XG4gIH0pO1xuICBmb3IgKGNvbnN0IGxheWVyIG9mIG5leHRMYXllcnMucmV2ZXJzZSgpKSB7XG4gICAgY29uc3QgaWQgPSBsYXllci5nZXQoJ2lkJyk7XG4gICAgaWYgKFxuICAgICAgIXByZXZNYXBbaWRdIHx8XG4gICAgICAhcHJldk1hcFtpZF0ubGF5ZXIuZXF1YWxzKG5leHRNYXBbaWRdLmxheWVyKSB8fFxuICAgICAgcHJldk1hcFtpZF0uYmVmb3JlICE9PSBuZXh0TWFwW2lkXS5iZWZvcmVcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgbGF5ZXIgaXMgYmVpbmcgY2hhbmdlZC5cbiAgICAgIHVwZGF0ZXMucHVzaChuZXh0TWFwW2lkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7dXBkYXRlcywgZXhpdGluZ307XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZTdHlsZShwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICByZXR1cm4ge1xuICAgIHNvdXJjZXNEaWZmOiBkaWZmU291cmNlcyhwcmV2U3R5bGUsIG5leHRTdHlsZSksXG4gICAgbGF5ZXJzRGlmZjogZGlmZkxheWVycyhwcmV2U3R5bGUsIG5leHRTdHlsZSlcbiAgfTtcbn1cbiJdfQ==\n\n/***/ }),\n/* 1094 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = fitBounds;\n\nvar _mapboxGl = __webpack_require__(272);\n\nvar _transform = __webpack_require__(280);\n\nvar _transform2 = _interopRequireDefault(_transform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction fitBounds(width, height, _bounds, options) {\n  var bounds = new _mapboxGl.LngLatBounds([_bounds[0].reverse(), _bounds[1].reverse()]);\n  options = options || {};\n  var padding = typeof options.padding === 'undefined' ? 0 : options.padding;\n  var offset = _mapboxGl.Point.convert([0, 0]);\n  var tr = new _transform2.default();\n  tr.width = width;\n  tr.height = height;\n  var nw = tr.project(bounds.getNorthWest());\n  var se = tr.project(bounds.getSouthEast());\n  var size = se.sub(nw);\n  var scaleX = (tr.width - padding * 2 - Math.abs(offset.x) * 2) / size.x;\n  var scaleY = (tr.height - padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n  var center = tr.unproject(nw.add(se).div(2));\n  var zoom = tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY));\n  return {\n    latitude: center.lat,\n    longitude: center.lng,\n    zoom: zoom\n  };\n}\n\n// NOTE: Transform is not a public API so we should be careful to always lock\n// down mapbox-gl to a specific major, minor, and patch version.\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9maXQtYm91bmRzLmpzIl0sIm5hbWVzIjpbImZpdEJvdW5kcyIsIndpZHRoIiwiaGVpZ2h0IiwiX2JvdW5kcyIsIm9wdGlvbnMiLCJib3VuZHMiLCJMbmdMYXRCb3VuZHMiLCJyZXZlcnNlIiwicGFkZGluZyIsIm9mZnNldCIsIlBvaW50IiwiY29udmVydCIsInRyIiwiVHJhbnNmb3JtIiwibnciLCJwcm9qZWN0IiwiZ2V0Tm9ydGhXZXN0Iiwic2UiLCJnZXRTb3V0aEVhc3QiLCJzaXplIiwic3ViIiwic2NhbGVYIiwiTWF0aCIsImFicyIsIngiLCJzY2FsZVkiLCJ5IiwiY2VudGVyIiwidW5wcm9qZWN0IiwiYWRkIiwiZGl2Iiwiem9vbSIsInNjYWxlWm9vbSIsInNjYWxlIiwibWluIiwibGF0aXR1ZGUiLCJsYXQiLCJsb25naXR1ZGUiLCJsbmciXSwibWFwcGluZ3MiOiI7Ozs7O2tCQTBCd0JBLFM7O0FBTnhCOztBQUlBOzs7Ozs7QUF4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUWUsU0FBU0EsU0FBVCxDQUFtQkMsS0FBbkIsRUFBMEJDLE1BQTFCLEVBQWtDQyxPQUFsQyxFQUEyQ0MsT0FBM0MsRUFBb0Q7QUFDakUsTUFBTUMsU0FBUyxJQUFJQyxzQkFBSixDQUFpQixDQUFDSCxRQUFRLENBQVIsRUFBV0ksT0FBWCxFQUFELEVBQXVCSixRQUFRLENBQVIsRUFBV0ksT0FBWCxFQUF2QixDQUFqQixDQUFmO0FBQ0FILFlBQVVBLFdBQVcsRUFBckI7QUFDQSxNQUFNSSxVQUFVLE9BQU9KLFFBQVFJLE9BQWYsS0FBMkIsV0FBM0IsR0FBeUMsQ0FBekMsR0FBNkNKLFFBQVFJLE9BQXJFO0FBQ0EsTUFBTUMsU0FBU0MsZ0JBQU1DLE9BQU4sQ0FBYyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWQsQ0FBZjtBQUNBLE1BQU1DLEtBQUssSUFBSUMsbUJBQUosRUFBWDtBQUNBRCxLQUFHWCxLQUFILEdBQVdBLEtBQVg7QUFDQVcsS0FBR1YsTUFBSCxHQUFZQSxNQUFaO0FBQ0EsTUFBTVksS0FBS0YsR0FBR0csT0FBSCxDQUFXVixPQUFPVyxZQUFQLEVBQVgsQ0FBWDtBQUNBLE1BQU1DLEtBQUtMLEdBQUdHLE9BQUgsQ0FBV1YsT0FBT2EsWUFBUCxFQUFYLENBQVg7QUFDQSxNQUFNQyxPQUFPRixHQUFHRyxHQUFILENBQU9OLEVBQVAsQ0FBYjtBQUNBLE1BQU1PLFNBQVMsQ0FBQ1QsR0FBR1gsS0FBSCxHQUFXTyxVQUFVLENBQXJCLEdBQXlCYyxLQUFLQyxHQUFMLENBQVNkLE9BQU9lLENBQWhCLElBQXFCLENBQS9DLElBQW9ETCxLQUFLSyxDQUF4RTtBQUNBLE1BQU1DLFNBQVMsQ0FBQ2IsR0FBR1YsTUFBSCxHQUFZTSxVQUFVLENBQXRCLEdBQTBCYyxLQUFLQyxHQUFMLENBQVNkLE9BQU9pQixDQUFoQixJQUFxQixDQUFoRCxJQUFxRFAsS0FBS08sQ0FBekU7O0FBRUEsTUFBTUMsU0FBU2YsR0FBR2dCLFNBQUgsQ0FBYWQsR0FBR2UsR0FBSCxDQUFPWixFQUFQLEVBQVdhLEdBQVgsQ0FBZSxDQUFmLENBQWIsQ0FBZjtBQUNBLE1BQU1DLE9BQU9uQixHQUFHb0IsU0FBSCxDQUFhcEIsR0FBR3FCLEtBQUgsR0FBV1gsS0FBS1ksR0FBTCxDQUFTYixNQUFULEVBQWlCSSxNQUFqQixDQUF4QixDQUFiO0FBQ0EsU0FBTztBQUNMVSxjQUFVUixPQUFPUyxHQURaO0FBRUxDLGVBQVdWLE9BQU9XLEdBRmI7QUFHTFA7QUFISyxHQUFQO0FBS0Q7O0FBekJEO0FBQ0EiLCJmaWxlIjoiZml0LWJvdW5kcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7TG5nTGF0Qm91bmRzLCBQb2ludH0gZnJvbSAnbWFwYm94LWdsJztcblxuLy8gTk9URTogVHJhbnNmb3JtIGlzIG5vdCBhIHB1YmxpYyBBUEkgc28gd2Ugc2hvdWxkIGJlIGNhcmVmdWwgdG8gYWx3YXlzIGxvY2tcbi8vIGRvd24gbWFwYm94LWdsIHRvIGEgc3BlY2lmaWMgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggdmVyc2lvbi5cbmltcG9ydCBUcmFuc2Zvcm0gZnJvbSAnbWFwYm94LWdsL2pzL2dlby90cmFuc2Zvcm0nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaXRCb3VuZHMod2lkdGgsIGhlaWdodCwgX2JvdW5kcywgb3B0aW9ucykge1xuICBjb25zdCBib3VuZHMgPSBuZXcgTG5nTGF0Qm91bmRzKFtfYm91bmRzWzBdLnJldmVyc2UoKSwgX2JvdW5kc1sxXS5yZXZlcnNlKCldKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBhZGRpbmcgPSB0eXBlb2Ygb3B0aW9ucy5wYWRkaW5nID09PSAndW5kZWZpbmVkJyA/IDAgOiBvcHRpb25zLnBhZGRpbmc7XG4gIGNvbnN0IG9mZnNldCA9IFBvaW50LmNvbnZlcnQoWzAsIDBdKTtcbiAgY29uc3QgdHIgPSBuZXcgVHJhbnNmb3JtKCk7XG4gIHRyLndpZHRoID0gd2lkdGg7XG4gIHRyLmhlaWdodCA9IGhlaWdodDtcbiAgY29uc3QgbncgPSB0ci5wcm9qZWN0KGJvdW5kcy5nZXROb3J0aFdlc3QoKSk7XG4gIGNvbnN0IHNlID0gdHIucHJvamVjdChib3VuZHMuZ2V0U291dGhFYXN0KCkpO1xuICBjb25zdCBzaXplID0gc2Uuc3ViKG53KTtcbiAgY29uc3Qgc2NhbGVYID0gKHRyLndpZHRoIC0gcGFkZGluZyAqIDIgLSBNYXRoLmFicyhvZmZzZXQueCkgKiAyKSAvIHNpemUueDtcbiAgY29uc3Qgc2NhbGVZID0gKHRyLmhlaWdodCAtIHBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LnkpICogMikgLyBzaXplLnk7XG5cbiAgY29uc3QgY2VudGVyID0gdHIudW5wcm9qZWN0KG53LmFkZChzZSkuZGl2KDIpKTtcbiAgY29uc3Qgem9vbSA9IHRyLnNjYWxlWm9vbSh0ci5zY2FsZSAqIE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSk7XG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IGNlbnRlci5sYXQsXG4gICAgbG9uZ2l0dWRlOiBjZW50ZXIubG5nLFxuICAgIHpvb21cbiAgfTtcbn1cbiJdfQ==\n\n/***/ }),\n/* 1095 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _canvas = __webpack_require__(1096);\n\nObject.defineProperty(exports, 'CanvasOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_canvas).default;\n  }\n});\n\nvar _choropleth = __webpack_require__(1097);\n\nObject.defineProperty(exports, 'ChoroplethOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_choropleth).default;\n  }\n});\n\nvar _draggablePoints = __webpack_require__(1098);\n\nObject.defineProperty(exports, 'DraggablePointsOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_draggablePoints).default;\n  }\n});\n\nvar _html = __webpack_require__(1101);\n\nObject.defineProperty(exports, 'HTMLOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_html).default;\n  }\n});\n\nvar _scatterplot = __webpack_require__(1102);\n\nObject.defineProperty(exports, 'ScatterplotOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_scatterplot).default;\n  }\n});\n\nvar _svg = __webpack_require__(1104);\n\nObject.defineProperty(exports, 'SVGOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_svg).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzsyQ0FBUUEsTzs7Ozs7Ozs7OytDQUNBQSxPOzs7Ozs7Ozs7b0RBQ0FBLE87Ozs7Ozs7Ozt5Q0FDQUEsTzs7Ozs7Ozs7O2dEQUNBQSxPOzs7Ozs7Ozs7d0NBQ0FBLE8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge2RlZmF1bHQgYXMgQ2FudmFzT3ZlcmxheX0gZnJvbSAnLi9jYW52YXMucmVhY3QnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIENob3JvcGxldGhPdmVybGF5fSBmcm9tICcuL2Nob3JvcGxldGgucmVhY3QnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIERyYWdnYWJsZVBvaW50c092ZXJsYXl9IGZyb20gJy4vZHJhZ2dhYmxlLXBvaW50cy5yZWFjdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgSFRNTE92ZXJsYXl9IGZyb20gJy4vaHRtbC5yZWFjdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgU2NhdHRlcnBsb3RPdmVybGF5fSBmcm9tICcuL3NjYXR0ZXJwbG90LnJlYWN0JztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBTVkdPdmVybGF5fSBmcm9tICcuL3N2Zy5yZWFjdCc7XG4iXX0=\n\n/***/ }),\n/* 1096 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nvar _window = __webpack_require__(157);\n\nvar _window2 = _interopRequireDefault(_window);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n};\n\nvar CanvasOverlay = function (_Component) {\n  _inherits(CanvasOverlay, _Component);\n\n  function CanvasOverlay() {\n    _classCallCheck(this, CanvasOverlay);\n\n    return _possibleConstructorReturn(this, (CanvasOverlay.__proto__ || Object.getPrototypeOf(CanvasOverlay)).apply(this, arguments));\n  }\n\n  _createClass(CanvasOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      this.props.redraw({\n        width: this.props.width,\n        height: this.props.height,\n        ctx: ctx,\n        project: mercator.project,\n        unproject: mercator.unproject,\n        isDragging: this.props.isDragging\n      });\n      ctx.restore();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: this.props.width * pixelRatio,\n        height: this.props.height * pixelRatio,\n        style: {\n          width: this.props.width + 'px',\n          height: this.props.height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return CanvasOverlay;\n}(_react.Component);\n\nexports.default = CanvasOverlay;\n\n\nCanvasOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9jYW52YXMucmVhY3QuanMiXSwibmFtZXMiOlsiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiem9vbSIsInJlZHJhdyIsImZ1bmMiLCJpc0RyYWdnaW5nIiwiYm9vbCIsIkNhbnZhc092ZXJsYXkiLCJfcmVkcmF3IiwicGl4ZWxSYXRpbyIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJjYW52YXMiLCJyZWZzIiwib3ZlcmxheSIsImN0eCIsImdldENvbnRleHQiLCJzYXZlIiwic2NhbGUiLCJtZXJjYXRvciIsInByb3BzIiwicHJvamVjdCIsInVucHJvamVjdCIsInJlc3RvcmUiLCJwb3NpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJsZWZ0IiwidG9wIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7K2VBdkJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9BLElBQU1BLGFBQWE7QUFDakJDLFNBQU9DLG9CQUFVQyxNQUFWLENBQWlCQyxVQURQO0FBRWpCQyxVQUFRSCxvQkFBVUMsTUFBVixDQUFpQkMsVUFGUjtBQUdqQkUsWUFBVUosb0JBQVVDLE1BQVYsQ0FBaUJDLFVBSFY7QUFJakJHLGFBQVdMLG9CQUFVQyxNQUFWLENBQWlCQyxVQUpYO0FBS2pCSSxRQUFNTixvQkFBVUMsTUFBVixDQUFpQkMsVUFMTjtBQU1qQkssVUFBUVAsb0JBQVVRLElBQVYsQ0FBZU4sVUFOTjtBQU9qQk8sY0FBWVQsb0JBQVVVLElBQVYsQ0FBZVI7QUFQVixDQUFuQjs7SUFVcUJTLGE7Ozs7Ozs7Ozs7O3dDQUVDO0FBQ2xCLFdBQUtDLE9BQUw7QUFDRDs7O3lDQUVvQjtBQUNuQixXQUFLQSxPQUFMO0FBQ0Q7Ozs4QkFFUztBQUNSLFVBQU1DLGFBQWFDLGlCQUFPQyxnQkFBUCxJQUEyQixDQUE5QztBQUNBLFVBQU1DLFNBQVMsS0FBS0MsSUFBTCxDQUFVQyxPQUF6QjtBQUNBLFVBQU1DLE1BQU1ILE9BQU9JLFVBQVAsQ0FBa0IsSUFBbEIsQ0FBWjtBQUNBRCxVQUFJRSxJQUFKO0FBQ0FGLFVBQUlHLEtBQUosQ0FBVVQsVUFBVixFQUFzQkEsVUFBdEI7QUFDQSxVQUFNVSxXQUFXLHVDQUFpQixLQUFLQyxLQUF0QixDQUFqQjtBQUNBLFdBQUtBLEtBQUwsQ0FBV2pCLE1BQVgsQ0FBa0I7QUFDaEJSLGVBQU8sS0FBS3lCLEtBQUwsQ0FBV3pCLEtBREY7QUFFaEJJLGdCQUFRLEtBQUtxQixLQUFMLENBQVdyQixNQUZIO0FBR2hCZ0IsZ0JBSGdCO0FBSWhCTSxpQkFBU0YsU0FBU0UsT0FKRjtBQUtoQkMsbUJBQVdILFNBQVNHLFNBTEo7QUFNaEJqQixvQkFBWSxLQUFLZSxLQUFMLENBQVdmO0FBTlAsT0FBbEI7QUFRQVUsVUFBSVEsT0FBSjtBQUNEOzs7NkJBRVE7QUFDUCxVQUFNZCxhQUFhQyxpQkFBT0MsZ0JBQVAsSUFBMkIsQ0FBOUM7QUFDQSxhQUNFO0FBQ0UsYUFBSSxTQUROO0FBRUUsZUFBUSxLQUFLUyxLQUFMLENBQVd6QixLQUFYLEdBQW1CYyxVQUY3QjtBQUdFLGdCQUFTLEtBQUtXLEtBQUwsQ0FBV3JCLE1BQVgsR0FBb0JVLFVBSC9CO0FBSUUsZUFBUTtBQUNOZCxpQkFBVSxLQUFLeUIsS0FBTCxDQUFXekIsS0FBckIsT0FETTtBQUVOSSxrQkFBVyxLQUFLcUIsS0FBTCxDQUFXckIsTUFBdEIsT0FGTTtBQUdOeUIsb0JBQVUsVUFISjtBQUlOQyx5QkFBZSxNQUpUO0FBS05DLGdCQUFNLENBTEE7QUFNTkMsZUFBSztBQU5DLFNBSlYsR0FERjtBQWNEOzs7O0VBNUN3Q0MsZ0I7O2tCQUF0QnJCLGE7OztBQStDckJBLGNBQWNzQixTQUFkLEdBQTBCbkMsVUFBMUIiLCJmaWxlIjoiY2FudmFzLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgbGF0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgbG9uZ2l0dWRlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHpvb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVkcmF3OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW52YXNPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIF9yZWRyYXcoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZWZzLm92ZXJsYXk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMucHJvcHMucmVkcmF3KHtcbiAgICAgIHdpZHRoOiB0aGlzLnByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLnByb3BzLmhlaWdodCxcbiAgICAgIGN0eCxcbiAgICAgIHByb2plY3Q6IG1lcmNhdG9yLnByb2plY3QsXG4gICAgICB1bnByb2plY3Q6IG1lcmNhdG9yLnVucHJvamVjdCxcbiAgICAgIGlzRHJhZ2dpbmc6IHRoaXMucHJvcHMuaXNEcmFnZ2luZ1xuICAgIH0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgcmV0dXJuIChcbiAgICAgIDxjYW52YXNcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgdGhpcy5wcm9wcy53aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyB0aGlzLnByb3BzLmhlaWdodCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBzdHlsZT17IHtcbiAgICAgICAgICB3aWR0aDogYCR7dGhpcy5wcm9wcy53aWR0aH1weGAsXG4gICAgICAgICAgaGVpZ2h0OiBgJHt0aGlzLnByb3BzLmhlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgdG9wOiAwXG4gICAgICAgIH0gfS8+XG4gICAgKTtcbiAgfVxufVxuXG5DYW52YXNPdmVybGF5LnByb3BUeXBlcyA9IFBST1BfVFlQRVM7XG4iXX0=\n\n/***/ }),\n/* 1097 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nvar _window = __webpack_require__(157);\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _d = __webpack_require__(271);\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  renderWhileDragging: _propTypes2.default.bool.isRequired,\n  globalOpacity: _propTypes2.default.number.isRequired,\n  /**\n    * An Immutable List of feature objects.\n    */\n  features: _propTypes2.default.instanceOf(_immutable2.default.List),\n  colorDomain: _propTypes2.default.array,\n  colorRange: _propTypes2.default.array.isRequired,\n  valueAccessor: _propTypes2.default.func.isRequired\n};\n\nvar DEFAULT_PROPS = {\n  renderWhileDragging: true,\n  globalOpacity: 1,\n  colorDomain: null,\n  colorRange: ['#FFFFFF', '#1FBAD6'],\n  valueAccessor: function valueAccessor(feature) {\n    return feature.get('properties').get('value');\n  }\n};\n\nvar ChoroplethOverlay = function (_Component) {\n  _inherits(ChoroplethOverlay, _Component);\n\n  function ChoroplethOverlay() {\n    _classCallCheck(this, ChoroplethOverlay);\n\n    return _possibleConstructorReturn(this, (ChoroplethOverlay.__proto__ || Object.getPrototypeOf(ChoroplethOverlay)).apply(this, arguments));\n  }\n\n  _createClass(ChoroplethOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var pixelRatio = _window2.default.devicePixelRatio;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      ctx.clearRect(0, 0, this.props.width, this.props.height);\n\n      function projectPoint(lon, lat) {\n        var point = mercator.project([lon, lat]);\n        /* eslint-disable no-invalid-this */\n        this.stream.point(point[0], point[1]);\n        /* eslint-enable no-invalid-this */\n      }\n\n      if (this.props.renderWhileDragging || !this.props.isDragging) {\n        var transform = _d2.default.geo.transform({ point: projectPoint });\n        var path = _d2.default.geo.path().projection(transform).context(ctx);\n        this._drawFeatures(ctx, path);\n      }\n      ctx.restore();\n    }\n  }, {\n    key: '_drawFeatures',\n    value: function _drawFeatures(ctx, path) {\n      var features = this.props.features;\n\n      if (!features) {\n        return;\n      }\n      var colorDomain = this.props.colorDomain || _d2.default.extent(features.toArray(), this.props.valueAccessor);\n\n      var colorScale = _d2.default.scale.linear().domain(colorDomain).range(this.props.colorRange).clamp(true);\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = features[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var feature = _step.value;\n\n          ctx.beginPath();\n          ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';\n          ctx.lineWidth = '1';\n          ctx.fillStyle = colorScale(this.props.valueAccessor(feature));\n          var geometry = feature.get('geometry');\n          path({\n            type: geometry.get('type'),\n            coordinates: geometry.get('coordinates').toJS()\n          });\n          ctx.fill();\n          ctx.stroke();\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: this.props.width * pixelRatio,\n        height: this.props.height * pixelRatio,\n        style: {\n          width: this.props.width + 'px',\n          height: this.props.height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          opacity: this.props.globalOpacity,\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return ChoroplethOverlay;\n}(_react.Component);\n\nexports.default = ChoroplethOverlay;\n\n\nChoroplethOverlay.propTypes = PROP_TYPES;\nChoroplethOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9jaG9yb3BsZXRoLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInpvb20iLCJpc0RyYWdnaW5nIiwiYm9vbCIsInJlbmRlcldoaWxlRHJhZ2dpbmciLCJnbG9iYWxPcGFjaXR5IiwiZmVhdHVyZXMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImNvbG9yRG9tYWluIiwiYXJyYXkiLCJjb2xvclJhbmdlIiwidmFsdWVBY2Nlc3NvciIsImZ1bmMiLCJERUZBVUxUX1BST1BTIiwiZmVhdHVyZSIsImdldCIsIkNob3JvcGxldGhPdmVybGF5IiwiX3JlZHJhdyIsInBpeGVsUmF0aW8iLCJ3aW5kb3ciLCJkZXZpY2VQaXhlbFJhdGlvIiwiY2FudmFzIiwicmVmcyIsIm92ZXJsYXkiLCJjdHgiLCJnZXRDb250ZXh0IiwibWVyY2F0b3IiLCJwcm9wcyIsInNhdmUiLCJzY2FsZSIsImNsZWFyUmVjdCIsInByb2plY3RQb2ludCIsImxvbiIsImxhdCIsInBvaW50IiwicHJvamVjdCIsInN0cmVhbSIsInRyYW5zZm9ybSIsImQzIiwiZ2VvIiwicGF0aCIsInByb2plY3Rpb24iLCJjb250ZXh0IiwiX2RyYXdGZWF0dXJlcyIsInJlc3RvcmUiLCJleHRlbnQiLCJ0b0FycmF5IiwiY29sb3JTY2FsZSIsImxpbmVhciIsImRvbWFpbiIsInJhbmdlIiwiY2xhbXAiLCJiZWdpblBhdGgiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImZpbGxTdHlsZSIsImdlb21ldHJ5IiwidHlwZSIsImNvb3JkaW5hdGVzIiwidG9KUyIsImZpbGwiLCJzdHJva2UiLCJwb3NpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJvcGFjaXR5IiwibGVmdCIsInRvcCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIs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Ozs2QkFFUTtBQUNQLFVBQU0zQyxhQUFhQyxpQkFBT0MsZ0JBQVAsSUFBMkIsQ0FBOUM7QUFDQSxhQUNFO0FBQ0UsYUFBSSxTQUROO0FBRUUsZUFBUSxLQUFLTyxLQUFMLENBQVduQyxLQUFYLEdBQW1CMEIsVUFGN0I7QUFHRSxnQkFBUyxLQUFLUyxLQUFMLENBQVcvQixNQUFYLEdBQW9Cc0IsVUFIL0I7QUFJRSxlQUFRO0FBQ04xQixpQkFBVSxLQUFLbUMsS0FBTCxDQUFXbkMsS0FBckIsT0FETTtBQUVOSSxrQkFBVyxLQUFLK0IsS0FBTCxDQUFXL0IsTUFBdEIsT0FGTTtBQUdOa0Usb0JBQVUsVUFISjtBQUlOQyx5QkFBZSxNQUpUO0FBS05DLG1CQUFTLEtBQUtyQyxLQUFMLENBQVd4QixhQUxkO0FBTU44RCxnQkFBTSxDQU5BO0FBT05DLGVBQUs7QUFQQyxTQUpWLEdBREY7QUFlRDs7OztFQWhGNENDLGdCOztrQkFBMUJuRCxpQjs7O0FBbUZyQkEsa0JBQWtCb0QsU0FBbEIsR0FBOEI3RSxVQUE5QjtBQUNBeUIsa0JBQWtCcUQsWUFBbEIsR0FBaUN4RCxhQUFqQyIsImZpbGUiOiJjaG9yb3BsZXRoLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBWaWV3cG9ydE1lcmNhdG9yIGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICByZW5kZXJXaGlsZURyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBnbG9iYWxPcGFjaXR5OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIC8qKlxuICAgICogQW4gSW1tdXRhYmxlIExpc3Qgb2YgZmVhdHVyZSBvYmplY3RzLlxuICAgICovXG4gIGZlYXR1cmVzOiBQcm9wVHlwZXMuaW5zdGFuY2VPZihJbW11dGFibGUuTGlzdCksXG4gIGNvbG9yRG9tYWluOiBQcm9wVHlwZXMuYXJyYXksXG4gIGNvbG9yUmFuZ2U6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICB2YWx1ZUFjY2Vzc29yOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBERUZBVUxUX1BST1BTID0ge1xuICByZW5kZXJXaGlsZURyYWdnaW5nOiB0cnVlLFxuICBnbG9iYWxPcGFjaXR5OiAxLFxuICBjb2xvckRvbWFpbjogbnVsbCxcbiAgY29sb3JSYW5nZTogWycjRkZGRkZGJywgJyMxRkJBRDYnXSxcbiAgdmFsdWVBY2Nlc3NvcihmZWF0dXJlKSB7XG4gICAgcmV0dXJuIGZlYXR1cmUuZ2V0KCdwcm9wZXJ0aWVzJykuZ2V0KCd2YWx1ZScpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaG9yb3BsZXRoT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gIH1cblxuICBfcmVkcmF3KCkge1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLnJlZnMub3ZlcmxheTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb25zdCBtZXJjYXRvciA9IFZpZXdwb3J0TWVyY2F0b3IodGhpcy5wcm9wcyk7XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMucHJvcHMud2lkdGgsIHRoaXMucHJvcHMuaGVpZ2h0KTtcblxuICAgIGZ1bmN0aW9uIHByb2plY3RQb2ludChsb24sIGxhdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBtZXJjYXRvci5wcm9qZWN0KFtsb24sIGxhdF0pO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG4gICAgICB0aGlzLnN0cmVhbS5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5yZW5kZXJXaGlsZURyYWdnaW5nIHx8ICF0aGlzLnByb3BzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGQzLmdlby50cmFuc2Zvcm0oe3BvaW50OiBwcm9qZWN0UG9pbnR9KTtcbiAgICAgIGNvbnN0IHBhdGggPSBkMy5nZW8ucGF0aCgpLnByb2plY3Rpb24odHJhbnNmb3JtKS5jb250ZXh0KGN0eCk7XG4gICAgICB0aGlzLl9kcmF3RmVhdHVyZXMoY3R4LCBwYXRoKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIF9kcmF3RmVhdHVyZXMoY3R4LCBwYXRoKSB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFmZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xvckRvbWFpbiA9IHRoaXMucHJvcHMuY29sb3JEb21haW4gfHxcbiAgICAgIGQzLmV4dGVudChmZWF0dXJlcy50b0FycmF5KCksIHRoaXMucHJvcHMudmFsdWVBY2Nlc3Nvcik7XG5cbiAgICBjb25zdCBjb2xvclNjYWxlID0gZDMuc2NhbGUubGluZWFyKClcbiAgICAgIC5kb21haW4oY29sb3JEb21haW4pXG4gICAgICAucmFuZ2UodGhpcy5wcm9wcy5jb2xvclJhbmdlKVxuICAgICAgLmNsYW1wKHRydWUpO1xuXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJztcbiAgICAgIGN0eC5saW5lV2lkdGggPSAnMSc7XG4gICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JTY2FsZSh0aGlzLnByb3BzLnZhbHVlQWNjZXNzb3IoZmVhdHVyZSkpO1xuICAgICAgY29uc3QgZ2VvbWV0cnkgPSBmZWF0dXJlLmdldCgnZ2VvbWV0cnknKTtcbiAgICAgIHBhdGgoe1xuICAgICAgICB0eXBlOiBnZW9tZXRyeS5nZXQoJ3R5cGUnKSxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGdlb21ldHJ5LmdldCgnY29vcmRpbmF0ZXMnKS50b0pTKClcbiAgICAgIH0pO1xuICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgcmV0dXJuIChcbiAgICAgIDxjYW52YXNcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgdGhpcy5wcm9wcy53aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyB0aGlzLnByb3BzLmhlaWdodCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBzdHlsZT17IHtcbiAgICAgICAgICB3aWR0aDogYCR7dGhpcy5wcm9wcy53aWR0aH1weGAsXG4gICAgICAgICAgaGVpZ2h0OiBgJHt0aGlzLnByb3BzLmhlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIG9wYWNpdHk6IHRoaXMucHJvcHMuZ2xvYmFsT3BhY2l0eSxcbiAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgIHRvcDogMFxuICAgICAgICB9IH0vPlxuICAgICk7XG4gIH1cbn1cblxuQ2hvcm9wbGV0aE92ZXJsYXkucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcbkNob3JvcGxldGhPdmVybGF5LmRlZmF1bHRQcm9wcyA9IERFRkFVTFRfUFJPUFM7XG4iXX0=\n\n/***/ }),\n/* 1098 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _desc, _value, _class; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = __webpack_require__(270);\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _svgTransform = __webpack_require__(1099);\n\nvar _svgTransform2 = _interopRequireDefault(_svgTransform);\n\nvar _document = __webpack_require__(281);\n\nvar _document2 = _interopRequireDefault(_document);\n\nvar _noop = __webpack_require__(579);\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _config = __webpack_require__(578);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _utils = __webpack_require__(1100);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  points: _propTypes2.default.instanceOf(_immutable2.default.List).isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  keyAccessor: _propTypes2.default.func.isRequired,\n  lngLatAccessor: _propTypes2.default.func.isRequired,\n  onAddPoint: _propTypes2.default.func.isRequired,\n  onUpdatePoint: _propTypes2.default.func.isRequired,\n  renderPoint: _propTypes2.default.func.isRequired\n};\n\nvar DEFAULT_PROPS = {\n  keyAccessor: function keyAccessor(point) {\n    return point.get('id');\n  },\n  lngLatAccessor: function lngLatAccessor(point) {\n    return point.get('location').toArray();\n  },\n\n  onAddPoint: _noop2.default,\n  onUpdatePoint: _noop2.default,\n  renderPoint: _noop2.default,\n  isDragging: false\n};\n\nvar DraggablePointsOverlay = (_class = function (_Component) {\n  _inherits(DraggablePointsOverlay, _Component);\n\n  function DraggablePointsOverlay(props) {\n    _classCallCheck(this, DraggablePointsOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DraggablePointsOverlay.__proto__ || Object.getPrototypeOf(DraggablePointsOverlay)).call(this, props));\n\n    _this.state = {\n      draggedPointKey: null\n    };\n    return _this;\n  }\n\n  _createClass(DraggablePointsOverlay, [{\n    key: '_onDragStart',\n    value: function _onDragStart(point, event) {\n      event.stopPropagation();\n      _document2.default.addEventListener('mousemove', this._onDrag, false);\n      _document2.default.addEventListener('mouseup', this._onDragEnd, false);\n      this.setState({ draggedPointKey: this.props.keyAccessor(point) });\n    }\n  }, {\n    key: '_onDrag',\n    value: function _onDrag(event) {\n      event.stopPropagation();\n      var pixel = (0, _utils.relativeMousePosition)(this.refs.container, event);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var lngLat = mercator.unproject(pixel);\n      var key = this.state.draggedPointKey;\n      this.props.onUpdatePoint({ key: key, location: lngLat });\n    }\n  }, {\n    key: '_onDragEnd',\n    value: function _onDragEnd(event) {\n      event.stopPropagation();\n      _document2.default.removeEventListener('mousemove', this._onDrag, false);\n      _document2.default.removeEventListener('mouseup', this._onDragEnd, false);\n      this.setState({ draggedPoint: null });\n    }\n  }, {\n    key: '_addPoint',\n    value: function _addPoint(event) {\n      event.stopPropagation();\n      event.preventDefault();\n      var pixel = (0, _utils.relativeMousePosition)(this.refs.container, event);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      this.props.onAddPoint(mercator.unproject(pixel));\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props = this.props,\n          points = _props.points,\n          width = _props.width,\n          height = _props.height,\n          isDragging = _props.isDragging,\n          style = _props.style;\n\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      return _react2.default.createElement(\n        'svg',\n        {\n          ref: 'container',\n          width: width,\n          height: height,\n          style: _extends({\n            pointerEvents: 'all',\n            position: 'absolute',\n            left: 0,\n            top: 0,\n            cursor: isDragging ? _config2.default.CURSOR.GRABBING : _config2.default.CURSOR.GRAB\n          }, style),\n          onContextMenu: this._addPoint },\n        _react2.default.createElement(\n          'g',\n          { style: { cursor: 'pointer' } },\n          points.map(function (point, index) {\n            var pixel = mercator.project(_this2.props.lngLatAccessor(point));\n            return _react2.default.createElement(\n              'g',\n              {\n                key: index,\n                style: { pointerEvents: 'all' },\n                transform: (0, _svgTransform2.default)([{ translate: pixel }]),\n                onMouseDown: _this2._onDragStart.bind(_this2, point) },\n              _this2.props.renderPoint.call(_this2, point, pixel)\n            );\n          })\n        )\n      );\n    }\n  }]);\n\n  return DraggablePointsOverlay;\n}(_react.Component), (_applyDecoratedDescriptor(_class.prototype, '_onDragStart', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDragStart'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDrag'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onDragEnd', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDragEnd'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_addPoint', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_addPoint'), _class.prototype)), _class);\nexports.default = DraggablePointsOverlay;\n\n\nDraggablePointsOverlay.propTypes = PROP_TYPES;\nDraggablePointsOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9kcmFnZ2FibGUtcG9pbnRzLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInpvb20iLCJwb2ludHMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImlzRHJhZ2dpbmciLCJib29sIiwia2V5QWNjZXNzb3IiLCJmdW5jIiwibG5nTGF0QWNjZXNzb3IiLCJvbkFkZFBvaW50Iiwib25VcGRhdGVQb2ludCIsInJlbmRlclBvaW50IiwiREVGQVVMVF9QUk9QUyIsInBvaW50IiwiZ2V0IiwidG9BcnJheSIsIm5vb3AiLCJEcmFnZ2FibGVQb2ludHNPdmVybGF5IiwicHJvcHMiLCJzdGF0ZSIsImRyYWdnZWRQb2ludEtleSIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uRHJhZyIsIl9vbkRyYWdFbmQiLCJzZXRTdGF0ZSIsInBpeGVsIiwicmVmcyIsImNvbnRhaW5lciIsIm1lcmNhdG9yIiwibG5nTGF0IiwidW5wcm9qZWN0Iiwia2V5IiwibG9jYXRpb24iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZHJhZ2dlZFBvaW50IiwicHJldmVudERlZmF1bHQiLCJzdHlsZSIsInBvaW50ZXJFdmVudHMiLCJwb3NpdGlvbiIsImxlZnQiLCJ0b3AiLCJjdXJzb3IiLCJjb25maWciLCJDVVJTT1IiLCJHUkFCQklORyIsIkdSQUIiLCJfYWRkUG9pbnQiLCJtYXAiLCJpbmRleCIsInByb2plY3QiLCJ0cmFuc2xhdGUiLCJfb25EcmFnU3RhcnQiLCJiaW5kIiwiY2FsbCIsIkNvbXBvbmVudCIsImF1dG9iaW5kIiwicHJvcFR5cGVzIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzsyQkFBQTs7QUFFQTtB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Q0FBakIsQ0FBZDtBQUNBLG1CQUNFO0FBQUE7QUFBQTtBQUNFLHFCQUFNc0MsS0FEUjtBQUVFLHVCQUFRLEVBQUNYLGVBQWUsS0FBaEIsRUFGVjtBQUdFLDJCQUFZLDRCQUFVLENBQUMsRUFBQ2EsV0FBV3pCLEtBQVosRUFBRCxDQUFWLENBSGQ7QUFJRSw2QkFBYyxPQUFLMEIsWUFBTCxDQUFrQkMsSUFBbEIsQ0FBdUIsTUFBdkIsRUFBNkIxQyxLQUE3QixDQUpoQjtBQU1JLHFCQUFLSyxLQUFMLENBQVdQLFdBQVgsQ0FBdUI2QyxJQUF2QixDQUE0QixNQUE1QixFQUFrQzNDLEtBQWxDLEVBQXlDZSxLQUF6QztBQU5KLGFBREY7QUFXRCxXQWJEO0FBRkY7QUFkRixPQURGO0FBbUNEOzs7O0VBbEZpRDZCLGdCLGlFQVNqREMsMkIsaUpBUUFBLDJCLCtJQVVBQSwyQixpSkFRQUEsMkI7a0JBbkNrQnpDLHNCOzs7QUFxRnJCQSx1QkFBdUIwQyxTQUF2QixHQUFtQ3BFLFVBQW5DO0FBQ0EwQix1QkFBdUIyQyxZQUF2QixHQUFzQ2hELGFBQXRDIiwiZmlsZSI6ImRyYWdnYWJsZS1wb2ludHMucmVhY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcblxuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJ3N2Zy10cmFuc2Zvcm0nO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgbm9vcCBmcm9tICcuLi9ub29wJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7cmVsYXRpdmVNb3VzZVBvc2l0aW9uIGFzIG1vdXNlfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgVmlld3BvcnRNZXJjYXRvciBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcblxuY29uc3QgUFJPUF9UWVBFUyA9IHtcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxhdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxvbmdpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB6b29tOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBvaW50czogUHJvcFR5cGVzLmluc3RhbmNlT2YoSW1tdXRhYmxlLkxpc3QpLmlzUmVxdWlyZWQsXG4gIGlzRHJhZ2dpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGtleUFjY2Vzc29yOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBsbmdMYXRBY2Nlc3NvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25BZGRQb2ludDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25VcGRhdGVQb2ludDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgcmVuZGVyUG9pbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IERFRkFVTFRfUFJPUFMgPSB7XG4gIGtleUFjY2Vzc29yKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50LmdldCgnaWQnKTtcbiAgfSxcbiAgbG5nTGF0QWNjZXNzb3IocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnQuZ2V0KCdsb2NhdGlvbicpLnRvQXJyYXkoKTtcbiAgfSxcbiAgb25BZGRQb2ludDogbm9vcCxcbiAgb25VcGRhdGVQb2ludDogbm9vcCxcbiAgcmVuZGVyUG9pbnQ6IG5vb3AsXG4gIGlzRHJhZ2dpbmc6IGZhbHNlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnZ2FibGVQb2ludHNPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ2dlZFBvaW50S2V5OiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnU3RhcnQocG9pbnQsIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25EcmFnLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uRHJhZ0VuZCwgZmFsc2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdnZWRQb2ludEtleTogdGhpcy5wcm9wcy5rZXlBY2Nlc3Nvcihwb2ludCl9KTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcGl4ZWwgPSBtb3VzZSh0aGlzLnJlZnMuY29udGFpbmVyLCBldmVudCk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIGNvbnN0IGxuZ0xhdCA9IG1lcmNhdG9yLnVucHJvamVjdChwaXhlbCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zdGF0ZS5kcmFnZ2VkUG9pbnRLZXk7XG4gICAgdGhpcy5wcm9wcy5vblVwZGF0ZVBvaW50KHtrZXksIGxvY2F0aW9uOiBsbmdMYXR9KTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnRW5kKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25EcmFnLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uRHJhZ0VuZCwgZmFsc2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdnZWRQb2ludDogbnVsbH0pO1xuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9hZGRQb2ludChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGl4ZWwgPSBtb3VzZSh0aGlzLnJlZnMuY29udGFpbmVyLCBldmVudCk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMucHJvcHMub25BZGRQb2ludChtZXJjYXRvci51bnByb2plY3QocGl4ZWwpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7cG9pbnRzLCB3aWR0aCwgaGVpZ2h0LCBpc0RyYWdnaW5nLCBzdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1lcmNhdG9yID0gVmlld3BvcnRNZXJjYXRvcih0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPHN2Z1xuICAgICAgICByZWY9XCJjb250YWluZXJcIlxuICAgICAgICB3aWR0aD17IHdpZHRoIH1cbiAgICAgICAgaGVpZ2h0PXsgaGVpZ2h0IH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCcsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgY3Vyc29yOiBpc0RyYWdnaW5nID8gY29uZmlnLkNVUlNPUi5HUkFCQklORyA6IGNvbmZpZy5DVVJTT1IuR1JBQixcbiAgICAgICAgICAuLi5zdHlsZVxuICAgICAgICB9IH1cbiAgICAgICAgb25Db250ZXh0TWVudT17IHRoaXMuX2FkZFBvaW50IH0+XG5cbiAgICAgICAgPGcgc3R5bGU9eyB7Y3Vyc29yOiAncG9pbnRlcid9IH0+XG4gICAgICAgIHtcbiAgICAgICAgICBwb2ludHMubWFwKChwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gbWVyY2F0b3IucHJvamVjdCh0aGlzLnByb3BzLmxuZ0xhdEFjY2Vzc29yKHBvaW50KSk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Z1xuICAgICAgICAgICAgICAgIGtleT17IGluZGV4IH1cbiAgICAgICAgICAgICAgICBzdHlsZT17IHtwb2ludGVyRXZlbnRzOiAnYWxsJ30gfVxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybT17IHRyYW5zZm9ybShbe3RyYW5zbGF0ZTogcGl4ZWx9XSkgfVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXsgdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzLCBwb2ludCkgfT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbmRlclBvaW50LmNhbGwodGhpcywgcG9pbnQsIHBpeGVsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgICk7XG4gIH1cbn1cblxuRHJhZ2dhYmxlUG9pbnRzT3ZlcmxheS5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuRHJhZ2dhYmxlUG9pbnRzT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBERUZBVUxUX1BST1BTO1xuIl19\n\n/***/ }),\n/* 1099 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function transform(props) {\n  var transform = [];\n  if (Array.isArray(props)) {\n    props.forEach(function forEachAccessor(prop) {\n      var key = Object.keys(prop)[0];\n      transform.push(key + '(' + prop[key] + ')');\n    });\n  }\n  return transform.join(' ');\n};\n\n\n/***/ }),\n/* 1100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.relativeMousePosition = relativeMousePosition;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction relativeMousePosition(container, event) {\n  var rect = container.getBoundingClientRect();\n  var x = event.clientX - rect.left - container.clientLeft;\n  var y = event.clientY - rect.top - container.clientTop;\n  return [x, y];\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJyZWxhdGl2ZU1vdXNlUG9zaXRpb24iLCJjb250YWluZXIiLCJldmVudCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ4IiwiY2xpZW50WCIsImxlZnQiLCJjbGllbnRMZWZ0IiwieSIsImNsaWVudFkiLCJ0b3AiLCJjbGllbnRUb3AiXSwibWFwcGluZ3MiOiI7Ozs7O1FBb0JnQkEscUIsR0FBQUEscUI7QUFwQmhCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNBLHFCQUFULENBQStCQyxTQUEvQixFQUEwQ0MsS0FBMUMsRUFBaUQ7QUFDdEQsTUFBTUMsT0FBT0YsVUFBVUcscUJBQVYsRUFBYjtBQUNBLE1BQU1DLElBQUlILE1BQU1JLE9BQU4sR0FBZ0JILEtBQUtJLElBQXJCLEdBQTRCTixVQUFVTyxVQUFoRDtBQUNBLE1BQU1DLElBQUlQLE1BQU1RLE9BQU4sR0FBZ0JQLEtBQUtRLEdBQXJCLEdBQTJCVixVQUFVVyxTQUEvQztBQUNBLFNBQU8sQ0FBQ1AsQ0FBRCxFQUFJSSxDQUFKLENBQVA7QUFDRCIsImZpbGUiOiJ1dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZU1vdXNlUG9zaXRpb24oY29udGFpbmVyLCBldmVudCkge1xuICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0O1xuICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcDtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbiJdfQ==\n\n/***/ }),\n/* 1101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  project: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n  // TODO: style\n};\n\nvar HTMLOverlay = function (_Component) {\n  _inherits(HTMLOverlay, _Component);\n\n  function HTMLOverlay() {\n    _classCallCheck(this, HTMLOverlay);\n\n    return _possibleConstructorReturn(this, (HTMLOverlay.__proto__ || Object.getPrototypeOf(HTMLOverlay)).apply(this, arguments));\n  }\n\n  _createClass(HTMLOverlay, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          project = _props.project,\n          isDragging = _props.isDragging;\n\n      var style = _extends({\n        position: 'absolute',\n        pointerEvents: 'none',\n        left: 0,\n        top: 0,\n        width: width,\n        height: height\n      }, this.props.style);\n      return _react2.default.createElement(\n        'div',\n        { ref: 'overlay', style: style },\n        this.props.redraw({ width: width, height: height, project: project, isDragging: isDragging })\n      );\n    }\n  }]);\n\n  return HTMLOverlay;\n}(_react.Component);\n\nexports.default = HTMLOverlay;\n\n\nHTMLOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9odG1sLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJyZWRyYXciLCJmdW5jIiwicHJvamVjdCIsImlzRHJhZ2dpbmciLCJib29sIiwiSFRNTE92ZXJsYXkiLCJwcm9wcyIsInN0eWxlIiwicG9zaXRpb24iLCJwb2ludGVyRXZlbnRzIiwibGVmdCIsInRvcCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7Ozs7Ozs7OzsrZUFyQkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBS0EsSUFBTUEsYUFBYTtBQUNqQkMsU0FBT0Msb0JBQVVDLE1BQVYsQ0FBaUJDLFVBRFA7QUFFakJDLFVBQVFILG9CQUFVQyxNQUFWLENBQWlCQyxVQUZSO0FBR2pCRSxVQUFRSixvQkFBVUssSUFBVixDQUFlSCxVQUhOO0FBSWpCSSxXQUFTTixvQkFBVUssSUFBVixDQUFlSCxVQUpQO0FBS2pCSyxjQUFZUCxvQkFBVVEsSUFBVixDQUFlTjtBQUMzQjtBQU5pQixDQUFuQjs7SUFTcUJPLFc7Ozs7Ozs7Ozs7OzZCQUVWO0FBQUEsbUJBQ3NDLEtBQUtDLEtBRDNDO0FBQUEsVUFDQVgsS0FEQSxVQUNBQSxLQURBO0FBQUEsVUFDT0ksTUFEUCxVQUNPQSxNQURQO0FBQUEsVUFDZUcsT0FEZixVQUNlQSxPQURmO0FBQUEsVUFDd0JDLFVBRHhCLFVBQ3dCQSxVQUR4Qjs7QUFFUCxVQUFNSTtBQUNKQyxrQkFBVSxVQUROO0FBRUpDLHVCQUFlLE1BRlg7QUFHSkMsY0FBTSxDQUhGO0FBSUpDLGFBQUssQ0FKRDtBQUtKaEIsb0JBTEk7QUFNSkk7QUFOSSxTQU9ELEtBQUtPLEtBQUwsQ0FBV0MsS0FQVixDQUFOO0FBU0EsYUFDRTtBQUFBO0FBQUEsVUFBSyxLQUFJLFNBQVQsRUFBbUIsT0FBUUEsS0FBM0I7QUFDSSxhQUFLRCxLQUFMLENBQVdOLE1BQVgsQ0FBa0IsRUFBQ0wsWUFBRCxFQUFRSSxjQUFSLEVBQWdCRyxnQkFBaEIsRUFBeUJDLHNCQUF6QixFQUFsQjtBQURKLE9BREY7QUFLRDs7OztFQWxCc0NTLGdCOztrQkFBcEJQLFc7OztBQXFCckJBLFlBQVlRLFNBQVosR0FBd0JuQixVQUF4QiIsImZpbGUiOiJodG1sLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVkcmF3OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBwcm9qZWN0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG4gIC8vIFRPRE86IHN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBwcm9qZWN0LCBpc0RyYWdnaW5nfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIC4uLnRoaXMucHJvcHMuc3R5bGVcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj1cIm92ZXJsYXlcIiBzdHlsZT17IHN0eWxlIH0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5yZWRyYXcoe3dpZHRoLCBoZWlnaHQsIHByb2plY3QsIGlzRHJhZ2dpbmd9KSB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbkhUTUxPdmVybGF5LnByb3BUeXBlcyA9IFBST1BfVFlQRVM7XG4iXX0=\n\n/***/ }),\n/* 1102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _window = __webpack_require__(157);\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _d = __webpack_require__(271);\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _canvasCompositeTypes = __webpack_require__(1103);\n\nvar _canvasCompositeTypes2 = _interopRequireDefault(_canvasCompositeTypes);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  locations: _propTypes2.default.instanceOf(_immutable2.default.List).isRequired,\n  lngLatAccessor: _propTypes2.default.func.isRequired,\n  renderWhileDragging: _propTypes2.default.bool,\n  globalOpacity: _propTypes2.default.number.isRequired,\n  dotRadius: _propTypes2.default.number.isRequired,\n  dotFill: _propTypes2.default.string.isRequired,\n  compositeOperation: _propTypes2.default.oneOf(_canvasCompositeTypes2.default).isRequired\n};\n\nvar DEFAULT_PROPS = {\n  lngLatAccessor: function lngLatAccessor(location) {\n    return [location.get(0), location.get(1)];\n  },\n\n  renderWhileDragging: true,\n  dotRadius: 4,\n  dotFill: '#1FBAD6',\n  globalOpacity: 1,\n  // Same as browser default.\n  compositeOperation: 'source-over'\n};\n\nvar ScatterplotOverlay = function (_Component) {\n  _inherits(ScatterplotOverlay, _Component);\n\n  function ScatterplotOverlay() {\n    _classCallCheck(this, ScatterplotOverlay);\n\n    return _possibleConstructorReturn(this, (ScatterplotOverlay.__proto__ || Object.getPrototypeOf(ScatterplotOverlay)).apply(this, arguments));\n  }\n\n  _createClass(ScatterplotOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n\n    /* eslint-disable max-statements */\n\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          dotRadius = _props.dotRadius,\n          dotFill = _props.dotFill,\n          compositeOperation = _props.compositeOperation,\n          renderWhileDragging = _props.renderWhileDragging,\n          isDragging = _props.isDragging,\n          locations = _props.locations,\n          lngLatAccessor = _props.lngLatAccessor;\n\n\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      ctx.clearRect(0, 0, width, height);\n      ctx.globalCompositeOperation = compositeOperation;\n\n      if ((renderWhileDragging || !isDragging) && locations) {\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n          for (var _iterator = locations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n            var location = _step.value;\n\n            var pixel = mercator.project(lngLatAccessor(location));\n            var pixelRounded = [_d2.default.round(pixel[0], 1), _d2.default.round(pixel[1], 1)];\n            if (pixelRounded[0] + dotRadius >= 0 && pixelRounded[0] - dotRadius < width && pixelRounded[1] + dotRadius >= 0 && pixelRounded[1] - dotRadius < height) {\n              ctx.fillStyle = dotFill;\n              ctx.beginPath();\n              ctx.arc(pixelRounded[0], pixelRounded[1], dotRadius, 0, Math.PI * 2);\n              ctx.fill();\n            }\n          }\n        } catch (err) {\n          _didIteratorError = true;\n          _iteratorError = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion && _iterator.return) {\n              _iterator.return();\n            }\n          } finally {\n            if (_didIteratorError) {\n              throw _iteratorError;\n            }\n          }\n        }\n      }\n\n      ctx.restore();\n    }\n    /* eslint-enable max-statements */\n\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          width = _props2.width,\n          height = _props2.height,\n          globalOpacity = _props2.globalOpacity;\n\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: width * pixelRatio,\n        height: height * pixelRatio,\n        style: {\n          width: width + 'px',\n          height: height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          opacity: globalOpacity,\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return ScatterplotOverlay;\n}(_react.Component);\n\nexports.default = ScatterplotOverlay;\n\n\nScatterplotOverlay.propTypes = PROP_TYPES;\nScatterplotOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9zY2F0dGVycGxvdC5yZWFjdC5qcyJdLCJuYW1lcyI6WyJQUk9QX1RZUEVTIiwid2lkdGgiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiaGVpZ2h0IiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiaXNEcmFnZ2luZyIsImJvb2wiLCJsb2NhdGlvbnMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImxuZ0xhdEFjY2Vzc29yIiwiZnVuYyIsInJlbmRlcldoaWxlRHJhZ2dpbmciLCJnbG9iYWxPcGFjaXR5IiwiZG90UmFkaXVzIiwiZG90RmlsbCIsInN0cmluZyIsImNvbXBvc2l0ZU9wZXJhdGlvbiIsIm9uZU9mIiwiQ09NUE9TSVRFX1RZUEVTIiwiREVGQVVMVF9QUk9QUyIsImxvY2F0aW9uIiwiZ2V0IiwiU2NhdHRlcnBsb3RPdmVybGF5IiwiX3JlZHJhdyIsInByb3BzIiwibWVyY2F0b3IiLCJwaXhlbFJhdGlvIiwid2luZG93IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImNhbnZhcyIsInJlZnMiLCJvdmVybGF5IiwiY3R4IiwiZ2V0Q29udGV4dCIsInNhdmUiLCJzY2FsZSIsImNsZWFyUmVjdCIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsInBpeGVsIiwicHJvamVjdCIsInBpeGVsUm91bmRlZCIsImQzIiwicm91bmQiLCJmaWxsU3R5bGUiLCJiZWdpblBhdGgiLCJhcmMiLCJNYXRoIiwiUEkiLCJmaWxsIiwicmVzdG9yZSIsInBvc2l0aW9uIiwicG9pbnRlckV2ZW50cyIsIm9wYWNpdHkiLCJsZWZ0IiwidG9wIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7K2VBMUJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVVBLElBQU1BLGFBQWE7QUFDakJDLFNBQU9DLG9CQUFVQyxNQUFWLENBQWlCQyxVQURQO0FBRWpCQyxVQUFRSCxvQkFBVUMsTUFBVixDQUFpQkMsVUFGUjtBQUdqQkUsWUFBVUosb0JBQVVDLE1BQVYsQ0FBaUJDLFVBSFY7QUFJakJHLGFBQVdMLG9CQUFVQyxNQUFWLENBQWlCQyxVQUpYO0FBS2pCSSxRQUFNTixvQkFBVUMsTUFBVixDQUFpQkMsVUFMTjtBQU1qQkssY0FBWVAsb0JBQVVRLElBQVYsQ0FBZU4sVUFOVjtBQU9qQk8sYUFBV1Qsb0JBQVVVLFVBQVYsQ0FBcUJDLG9CQUFVQyxJQUEvQixFQUFxQ1YsVUFQL0I7QUFRakJXLGtCQUFnQmIsb0JBQVVjLElBQVYsQ0FBZVosVUFSZDtBQVNqQmEsdUJBQXFCZixvQkFBVVEsSUFUZDtBQVVqQlEsaUJBQWVoQixvQkFBVUMsTUFBVixDQUFpQkMsVUFWZjtBQVdqQmUsYUFBV2pCLG9CQUFVQyxNQUFWLENBQWlCQyxVQVhYO0FBWWpCZ0IsV0FBU2xCLG9CQUFVbUIsTUFBVixDQUFpQmpCLFVBWlQ7QUFhakJrQixzQkFBb0JwQixvQkFBVXFCLEtBQVYsQ0FBZ0JDLDhCQUFoQixFQUFpQ3BCO0FBYnBDLENBQW5COztBQWdCQSxJQUFNcUIsZ0JBQWdCO0FBQ3BCVixnQkFEb0IsMEJBQ0xXLFFBREssRUFDSztBQUN2QixXQUFPLENBQUNBLFNBQVNDLEdBQVQsQ0FBYSxDQUFiLENBQUQsRUFBa0JELFNBQVNDLEdBQVQsQ0FBYSxDQUFiLENBQWxCLENBQVA7QUFDRCxHQUhtQjs7QUFJcEJWLHVCQUFxQixJQUpEO0FBS3BCRSxhQUFXLENBTFM7QUFNcEJDLFdBQVMsU0FOVztBQU9wQkYsaUJBQWUsQ0FQSztBQVFwQjtBQUNBSSxzQkFBb0I7QUFUQSxDQUF0Qjs7SUFZcUJNLGtCOzs7Ozs7Ozs7Ozt3Q0FFQztBQUNsQixXQUFLQyxPQUFMO0FBQ0Q7Ozt5Q0FFb0I7QUFDbkIsV0FBS0EsT0FBTDtBQUNEOztBQUVEOzs7OzhCQUNVO0FBQUEsbUJBSUosS0FBS0MsS0FKRDtBQUFBLFVBRU43QixLQUZNLFVBRU5BLEtBRk07QUFBQSxVQUVDSSxNQUZELFVBRUNBLE1BRkQ7QUFBQSxVQUVTYyxTQUZULFVBRVNBLFNBRlQ7QUFBQSxVQUVvQkMsT0FGcEIsVUFFb0JBLE9BRnBCO0FBQUEsVUFFNkJFLGtCQUY3QixVQUU2QkEsa0JBRjdCO0FBQUEsVUFHTkwsbUJBSE0sVUFHTkEsbUJBSE07QUFBQSxVQUdlUixVQUhmLFVBR2VBLFVBSGY7QUFBQSxVQUcyQkUsU0FIM0IsVUFHMkJBLFNBSDNCO0FBQUEsVUFHc0NJLGNBSHRDLFVBR3NDQSxjQUh0Qzs7O0FBTVIsVUFBTWdCLFdBQVcsdUNBQWlCLEtBQUtELEtBQXRCLENBQWpCO0FBQ0EsVUFBTUUsYUFBYUMsaUJBQU9DLGdCQUFQLElBQTJCLENBQTlDO0FBQ0EsVUFBTUMsU0FBUyxLQUFLQyxJQUFMLENBQVVDLE9BQXpCO0FBQ0EsVUFBTUMsTUFBTUgsT0FBT0ksVUFBUCxDQUFrQixJQUFsQixDQUFaOztBQUVBRCxVQUFJRSxJQUFKO0FBQ0FGLFVBQUlHLEtBQUosQ0FBVVQsVUFBVixFQUFzQkEsVUFBdEI7QUFDQU0sVUFBSUksU0FBSixDQUFjLENBQWQsRUFBaUIsQ0FBakIsRUFBb0J6QyxLQUFwQixFQUEyQkksTUFBM0I7QUFDQWlDLFVBQUlLLHdCQUFKLEdBQStCckIsa0JBQS9COztBQUVBLFVBQUksQ0FBQ0wsdUJBQXVCLENBQUNSLFVBQXpCLEtBQXdDRSxTQUE1QyxFQUF1RDtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUNyRCwrQkFBdUJBLFNBQXZCLDhIQUFrQztBQUFBLGdCQUF2QmUsUUFBdUI7O0FBQ2hDLGdCQUFNa0IsUUFBUWIsU0FBU2MsT0FBVCxDQUFpQjlCLGVBQWVXLFFBQWYsQ0FBakIsQ0FBZDtBQUNBLGdCQUFNb0IsZUFBZSxDQUFDQyxZQUFHQyxLQUFILENBQVNKLE1BQU0sQ0FBTixDQUFULEVBQW1CLENBQW5CLENBQUQsRUFBd0JHLFlBQUdDLEtBQUgsQ0FBU0osTUFBTSxDQUFOLENBQVQsRUFBbUIsQ0FBbkIsQ0FBeEIsQ0FBckI7QUFDQSxnQkFBSUUsYUFBYSxDQUFiLElBQWtCM0IsU0FBbEIsSUFBK0IsQ0FBL0IsSUFDQTJCLGFBQWEsQ0FBYixJQUFrQjNCLFNBQWxCLEdBQThCbEIsS0FEOUIsSUFFQTZDLGFBQWEsQ0FBYixJQUFrQjNCLFNBQWxCLElBQStCLENBRi9CLElBR0EyQixhQUFhLENBQWIsSUFBa0IzQixTQUFsQixHQUE4QmQsTUFIbEMsRUFJRTtBQUNBaUMsa0JBQUlXLFNBQUosR0FBZ0I3QixPQUFoQjtBQUNBa0Isa0JBQUlZLFNBQUo7QUFDQVosa0JBQUlhLEdBQUosQ0FBUUwsYUFBYSxDQUFiLENBQVIsRUFBeUJBLGFBQWEsQ0FBYixDQUF6QixFQUEwQzNCLFNBQTFDLEVBQXFELENBQXJELEVBQXdEaUMsS0FBS0MsRUFBTCxHQUFVLENBQWxFO0FBQ0FmLGtCQUFJZ0IsSUFBSjtBQUNEO0FBQ0Y7QUFkb0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWV0RDs7QUFFRGhCLFVBQUlpQixPQUFKO0FBQ0Q7QUFDRDs7Ozs2QkFFUztBQUFBLG9CQUNnQyxLQUFLekIsS0FEckM7QUFBQSxVQUNBN0IsS0FEQSxXQUNBQSxLQURBO0FBQUEsVUFDT0ksTUFEUCxXQUNPQSxNQURQO0FBQUEsVUFDZWEsYUFEZixXQUNlQSxhQURmOztBQUVQLFVBQU1jLGFBQWFDLGlCQUFPQyxnQkFBUCxJQUEyQixDQUE5QztBQUNBLGFBQ0U7QUFDRSxhQUFJLFNBRE47QUFFRSxlQUFRakMsUUFBUStCLFVBRmxCO0FBR0UsZ0JBQVMzQixTQUFTMkIsVUFIcEI7QUFJRSxlQUFRO0FBQ04vQixpQkFBVUEsS0FBVixPQURNO0FBRU5JLGtCQUFXQSxNQUFYLE9BRk07QUFHTm1ELG9CQUFVLFVBSEo7QUFJTkMseUJBQWUsTUFKVDtBQUtOQyxtQkFBU3hDLGFBTEg7QUFNTnlDLGdCQUFNLENBTkE7QUFPTkMsZUFBSztBQVBDLFNBSlYsR0FERjtBQWVEOzs7O0VBbEU2Q0MsZ0I7O2tCQUEzQmpDLGtCOzs7QUFxRXJCQSxtQkFBbUJrQyxTQUFuQixHQUErQjlELFVBQS9CO0FBQ0E0QixtQkFBbUJtQyxZQUFuQixHQUFrQ3RDLGFBQWxDIiwiZmlsZSI6InNjYXR0ZXJwbG90LnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgQ09NUE9TSVRFX1RZUEVTIGZyb20gJ2NhbnZhcy1jb21wb3NpdGUtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBsb2NhdGlvbnM6IFByb3BUeXBlcy5pbnN0YW5jZU9mKEltbXV0YWJsZS5MaXN0KS5pc1JlcXVpcmVkLFxuICBsbmdMYXRBY2Nlc3NvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgcmVuZGVyV2hpbGVEcmFnZ2luZzogUHJvcFR5cGVzLmJvb2wsXG4gIGdsb2JhbE9wYWNpdHk6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgZG90UmFkaXVzOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGRvdEZpbGw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgY29tcG9zaXRlT3BlcmF0aW9uOiBQcm9wVHlwZXMub25lT2YoQ09NUE9TSVRFX1RZUEVTKS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBERUZBVUxUX1BST1BTID0ge1xuICBsbmdMYXRBY2Nlc3Nvcihsb2NhdGlvbikge1xuICAgIHJldHVybiBbbG9jYXRpb24uZ2V0KDApLCBsb2NhdGlvbi5nZXQoMSldO1xuICB9LFxuICByZW5kZXJXaGlsZURyYWdnaW5nOiB0cnVlLFxuICBkb3RSYWRpdXM6IDQsXG4gIGRvdEZpbGw6ICcjMUZCQUQ2JyxcbiAgZ2xvYmFsT3BhY2l0eTogMSxcbiAgLy8gU2FtZSBhcyBicm93c2VyIGRlZmF1bHQuXG4gIGNvbXBvc2l0ZU9wZXJhdGlvbjogJ3NvdXJjZS1vdmVyJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NhdHRlcnBsb3RPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzICovXG4gIF9yZWRyYXcoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsIGhlaWdodCwgZG90UmFkaXVzLCBkb3RGaWxsLCBjb21wb3NpdGVPcGVyYXRpb24sXG4gICAgICByZW5kZXJXaGlsZURyYWdnaW5nLCBpc0RyYWdnaW5nLCBsb2NhdGlvbnMsIGxuZ0xhdEFjY2Vzc29yXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBtZXJjYXRvciA9IFZpZXdwb3J0TWVyY2F0b3IodGhpcy5wcm9wcyk7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZWZzLm92ZXJsYXk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjb21wb3NpdGVPcGVyYXRpb247XG5cbiAgICBpZiAoKHJlbmRlcldoaWxlRHJhZ2dpbmcgfHwgIWlzRHJhZ2dpbmcpICYmIGxvY2F0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGl4ZWwgPSBtZXJjYXRvci5wcm9qZWN0KGxuZ0xhdEFjY2Vzc29yKGxvY2F0aW9uKSk7XG4gICAgICAgIGNvbnN0IHBpeGVsUm91bmRlZCA9IFtkMy5yb3VuZChwaXhlbFswXSwgMSksIGQzLnJvdW5kKHBpeGVsWzFdLCAxKV07XG4gICAgICAgIGlmIChwaXhlbFJvdW5kZWRbMF0gKyBkb3RSYWRpdXMgPj0gMCAmJlxuICAgICAgICAgICAgcGl4ZWxSb3VuZGVkWzBdIC0gZG90UmFkaXVzIDwgd2lkdGggJiZcbiAgICAgICAgICAgIHBpeGVsUm91bmRlZFsxXSArIGRvdFJhZGl1cyA+PSAwICYmXG4gICAgICAgICAgICBwaXhlbFJvdW5kZWRbMV0gLSBkb3RSYWRpdXMgPCBoZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGRvdEZpbGw7XG4gICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgIGN0eC5hcmMocGl4ZWxSb3VuZGVkWzBdLCBwaXhlbFJvdW5kZWRbMV0sIGRvdFJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGdsb2JhbE9wYWNpdHl9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICByZXR1cm4gKFxuICAgICAgPGNhbnZhc1xuICAgICAgICByZWY9XCJvdmVybGF5XCJcbiAgICAgICAgd2lkdGg9eyB3aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyBoZWlnaHQgKiBwaXhlbFJhdGlvIH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIG9wYWNpdHk6IGdsb2JhbE9wYWNpdHksXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IDBcbiAgICAgICAgfSB9Lz5cbiAgICApO1xuICB9XG59XG5cblNjYXR0ZXJwbG90T3ZlcmxheS5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuU2NhdHRlcnBsb3RPdmVybGF5LmRlZmF1bHRQcm9wcyA9IERFRkFVTFRfUFJPUFM7XG4iXX0=\n\n/***/ }),\n/* 1103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = [\n  'source-over',\n  'source-in',\n  'source-out',\n  'source-atop',\n  'destination-over',\n  'destination-in',\n  'destination-out',\n  'destination-atop',\n  'lighter',\n  'copy',\n  'xor',\n  'multiply',\n  'screen',\n  'overlay',\n  'darken',\n  'lighten',\n  'color-dodge',\n  'color-burn',\n  'hard-light',\n  'soft-light',\n  'difference',\n  'exclusion',\n  'hue',\n  'saturation',\n  'color',\n  'luminosity'\n];\n\n/***/ }),\n/* 1104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n};\n\nvar SVGOverlay = function (_Component) {\n  _inherits(SVGOverlay, _Component);\n\n  function SVGOverlay() {\n    _classCallCheck(this, SVGOverlay);\n\n    return _possibleConstructorReturn(this, (SVGOverlay.__proto__ || Object.getPrototypeOf(SVGOverlay)).apply(this, arguments));\n  }\n\n  _createClass(SVGOverlay, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          isDragging = _props.isDragging;\n\n      var style = _extends({\n        pointerEvents: 'none',\n        position: 'absolute',\n        left: 0,\n        top: 0\n      }, this.props.style);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var project = mercator.project,\n          unproject = mercator.unproject;\n\n\n      return _react2.default.createElement(\n        'svg',\n        {\n          ref: 'overlay',\n          width: width,\n          height: height,\n          style: style },\n        this.props.redraw({ width: width, height: height, project: project, unproject: unproject, isDragging: isDragging })\n      );\n    }\n  }]);\n\n  return SVGOverlay;\n}(_react.Component);\n\nexports.default = SVGOverlay;\n\n\nSVGOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9zdmcucmVhY3QuanMiXSwibmFtZXMiOlsiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiem9vbSIsInJlZHJhdyIsImZ1bmMiLCJpc0RyYWdnaW5nIiwiYm9vbCIsIlNWR092ZXJsYXkiLCJwcm9wcyIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsInBvc2l0aW9uIiwibGVmdCIsInRvcCIsIm1lcmNhdG9yIiwicHJvamVjdCIsInVucHJvamVjdCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQXRCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQSxJQUFNQSxhQUFhO0FBQ2pCQyxTQUFPQyxvQkFBVUMsTUFBVixDQUFpQkMsVUFEUDtBQUVqQkMsVUFBUUgsb0JBQVVDLE1BQVYsQ0FBaUJDLFVBRlI7QUFHakJFLFlBQVVKLG9CQUFVQyxNQUFWLENBQWlCQyxVQUhWO0FBSWpCRyxhQUFXTCxvQkFBVUMsTUFBVixDQUFpQkMsVUFKWDtBQUtqQkksUUFBTU4sb0JBQVVDLE1BQVYsQ0FBaUJDLFVBTE47QUFNakJLLFVBQVFQLG9CQUFVUSxJQUFWLENBQWVOLFVBTk47QUFPakJPLGNBQVlULG9CQUFVVSxJQUFWLENBQWVSO0FBUFYsQ0FBbkI7O0lBVXFCUyxVOzs7Ozs7Ozs7Ozs2QkFDVjtBQUFBLG1CQUM2QixLQUFLQyxLQURsQztBQUFBLFVBQ0FiLEtBREEsVUFDQUEsS0FEQTtBQUFBLFVBQ09JLE1BRFAsVUFDT0EsTUFEUDtBQUFBLFVBQ2VNLFVBRGYsVUFDZUEsVUFEZjs7QUFFUCxVQUFNSTtBQUNKQyx1QkFBZSxNQURYO0FBRUpDLGtCQUFVLFVBRk47QUFHSkMsY0FBTSxDQUhGO0FBSUpDLGFBQUs7QUFKRCxTQUtELEtBQUtMLEtBQUwsQ0FBV0MsS0FMVixDQUFOO0FBT0EsVUFBTUssV0FBVyx1Q0FBaUIsS0FBS04sS0FBdEIsQ0FBakI7QUFUTyxVQVVBTyxPQVZBLEdBVXNCRCxRQVZ0QixDQVVBQyxPQVZBO0FBQUEsVUFVU0MsU0FWVCxHQVVzQkYsUUFWdEIsQ0FVU0UsU0FWVDs7O0FBWVAsYUFDRTtBQUFBO0FBQUE7QUFDRSxlQUFJLFNBRE47QUFFRSxpQkFBUXJCLEtBRlY7QUFHRSxrQkFBU0ksTUFIWDtBQUlFLGlCQUFRVSxLQUpWO0FBTUksYUFBS0QsS0FBTCxDQUFXTCxNQUFYLENBQWtCLEVBQUNSLFlBQUQsRUFBUUksY0FBUixFQUFnQmdCLGdCQUFoQixFQUF5QkMsb0JBQXpCLEVBQW9DWCxzQkFBcEMsRUFBbEI7QUFOSixPQURGO0FBV0Q7Ozs7RUF4QnFDWSxnQjs7a0JBQW5CVixVOzs7QUEyQnJCQSxXQUFXVyxTQUFYLEdBQXVCeEIsVUFBdkIiLCJmaWxlIjoic3ZnLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByZWRyYXc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzRHJhZ2dpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNWR092ZXJsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGlzRHJhZ2dpbmd9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIC4uLnRoaXMucHJvcHMuc3R5bGVcbiAgICB9O1xuICAgIGNvbnN0IG1lcmNhdG9yID0gVmlld3BvcnRNZXJjYXRvcih0aGlzLnByb3BzKTtcbiAgICBjb25zdCB7cHJvamVjdCwgdW5wcm9qZWN0fSA9IG1lcmNhdG9yO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxzdmdcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgd2lkdGggfVxuICAgICAgICBoZWlnaHQ9eyBoZWlnaHQgfVxuICAgICAgICBzdHlsZT17IHN0eWxlIH0+XG5cbiAgICAgICAgeyB0aGlzLnByb3BzLnJlZHJhdyh7d2lkdGgsIGhlaWdodCwgcHJvamVjdCwgdW5wcm9qZWN0LCBpc0RyYWdnaW5nfSkgfVxuXG4gICAgICA8L3N2Zz5cbiAgICApO1xuICB9XG59XG5cblNWR092ZXJsYXkucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcblxuIl19\n\n/***/ }),\n/* 1105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(setImmediate) {\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _geodata_utils = __webpack_require__(147);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FeatureLayer = function (_React$PureComponent) {\n    _inherits(FeatureLayer, _React$PureComponent);\n\n    function FeatureLayer() {\n        _classCallCheck(this, FeatureLayer);\n\n        var _this = _possibleConstructorReturn(this, (FeatureLayer.__proto__ || Object.getPrototypeOf(FeatureLayer)).apply(this, arguments));\n\n        _this.onClick = function (evt) {\n            var _this$props = _this.props,\n                layer = _this$props.layer,\n                map = _this$props.map,\n                onFeaturesClick = _this$props.onFeaturesClick;\n\n            var features = map.queryRenderedFeatures(evt.point, { layers: [layer.get('id')] });\n            if (features.length == 0) {\n                return;\n            }\n            onFeaturesClick && onFeaturesClick(features);\n        };\n        _this._updateFeatures = _lodash2.default.debounce(function (props) {\n            var data = props.data,\n                layer = props.layer,\n                map = props.map,\n                onLoading = props.onLoading;\n\n            onLoading && onLoading();\n            // It's possible that the map is in the process of unmounting and will fail on the\n            // `map.getSource` call below because `map.style` is not defined\n            if (!map.style) {\n                return;\n            }\n            var dataSource = map.getSource(layer.get('source'));\n            // It's possible that the user was interacting with the filter\n            // and then changed the map type, which means this layer\n            // may have been unmounted before this debounced function is actually executed\n            if (dataSource) {\n                dataSource.setData((0, _geodata_utils.buildFeatureCollection)(data));\n            }\n        }, 100);\n        return _this;\n    }\n\n    _createClass(FeatureLayer, [{\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n            var layer = nextProps.layer,\n                map = nextProps.map;\n            var prevLayer = this.props.layer;\n\n            if (layer.get('type') !== prevLayer.get('type')) {\n                this._destroy();\n                this._init();\n                return;\n            }\n            if (layer !== prevLayer) {\n                layer.get('paint').filter(function (paintVal, paintKey) {\n                    return paintVal !== prevLayer.getIn(['paint', paintKey]);\n                }).forEach(function (paintVal, paintKey) {\n                    map.setPaintProperty(layer.get('id'), paintKey, _immutable2.default.isImmutable(paintVal) ? paintVal.toJS() : paintVal);\n                });\n            }\n        }\n    }, {\n        key: '_init',\n        value: function _init() {\n            var _props = this.props,\n                data = _props.data,\n                layer = _props.layer,\n                map = _props.map,\n                onLoading = _props.onLoading;\n\n            onLoading && setImmediate(function () {\n                return onLoading();\n            });\n            this.source = {\n                type: 'geojson',\n                data: (0, _geodata_utils.buildFeatureCollection)(data)\n            };\n            map.addSource(layer.get('source'), this.source);\n            map.addLayer(layer.toJS());\n            map.on('click', this.onClick);\n        }\n    }, {\n        key: '_destroy',\n        value: function _destroy() {\n            var _props2 = this.props,\n                layer = _props2.layer,\n                map = _props2.map;\n\n            var id = layer.get('id');\n            // If the entire map is unmounting we don't need to do it ourselves\n            if (!map.style || !map.getLayer(id)) {\n                return;\n            }\n            map.removeLayer(id);\n            map.removeSource(layer.get('source'));\n            map.off('click', this.onClick);\n        }\n    }, {\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this._init();\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._destroy();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            this._updateFeatures(this.props);\n            return null;\n        }\n    }]);\n\n    return FeatureLayer;\n}(_react2.default.PureComponent);\n\nexports.default = FeatureLayer;\n\nFeatureLayer.propTypes = {\n    data: _propTypes2.default.array.isRequired,\n    layer: _propTypes2.default.instanceOf(_immutable.Map).isRequired,\n    map: _propTypes2.default.object.isRequired,\n    onLoading: _propTypes2.default.func,\n    onFeaturesClick: _propTypes2.default.func\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(134).setImmediate))\n\n/***/ }),\n/* 1106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _immutable = __webpack_require__(14);\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _webglHeatmap = __webpack_require__(1107);\n\nvar _webglHeatmap2 = _interopRequireDefault(_webglHeatmap);\n\nvar _viewportMercatorProject = __webpack_require__(125);\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nvar _map_constants = __webpack_require__(45);\n\nvar _geodata_utils = __webpack_require__(147);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar HeatmapConfig = _map_constants.MapTypes.Heatmap.configuration;\n\nvar INTENSITY_FACTOR = 1 / (HeatmapConfig.max * 3) / _map_constants.MapboxGl.maxZoom;\n\nvar HeatmapLayer = function (_React$PureComponent) {\n    _inherits(HeatmapLayer, _React$PureComponent);\n\n    function HeatmapLayer() {\n        _classCallCheck(this, HeatmapLayer);\n\n        var _this = _possibleConstructorReturn(this, (HeatmapLayer.__proto__ || Object.getPrototypeOf(HeatmapLayer)).apply(this, arguments));\n\n        _this._prevGradientColors = null;\n        _this._gradientTexture = null;\n        return _this;\n    }\n\n    _createClass(HeatmapLayer, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            this._update();\n        }\n    }, {\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate() {\n            this._update();\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._heatmap = null;\n        }\n    }, {\n        key: '_getGradientTexture',\n        value: function _getGradientTexture() {\n            if (this._prevGradientColors === this.props.gradientColors) {\n                return this._gradientTexture;\n            }\n            var canvas = document.createElement('canvas');\n            var width = this.context.map.transform.tileSize;\n            var height = this.context.map.transform.height;\n            canvas.width = String(width);\n            canvas.height = String(height);\n            var ctx = canvas.getContext('2d');\n            var gradient = ctx.createLinearGradient(0, height / 2, width, height / 2);\n            _lodash2.default.each(this.props.gradientColors, function (color, stop) {\n                gradient.addColorStop(stop, color);\n            });\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, width, height);\n            var image = new window.Image();\n            image.src = canvas.toDataURL('image/png');\n            return image;\n        }\n    }, {\n        key: '_interpolateWithZoom',\n        value: function _interpolateWithZoom(rawVal) {\n            return rawVal * this.props.zoom;\n        }\n    }, {\n        key: '_redraw',\n        value: function _redraw() {\n            var _this2 = this;\n\n            var mercator = (0, _viewportMercatorProject2.default)(this.props);\n            this._heatmap.clear();\n            this._heatmap.adjustSize();\n            this.props.data.forEach(function (location) {\n                var size = _this2.props.sizeExtractor(location);\n                var intensity = _this2.props.intensityExtractor(location, _this2.props.zoom);\n                var lngLat = _this2.props.lngLatExtractor(location);\n                if ((0, _geodata_utils.shouldIgnoreLngLat)(lngLat)) {\n                    return;\n                }\n                var pixel = mercator.project(lngLat);\n                _this2._heatmap.addPoint(pixel[0], pixel[1], _this2._interpolateWithZoom(size), intensity);\n            });\n            this._heatmap.update();\n            this._heatmap.display();\n        }\n    }, {\n        key: '_update',\n        value: function _update() {\n            var gradientTexture = this._getGradientTexture();\n            if (this._gradientTexture !== gradientTexture) {\n                this._heatmap = new _webglHeatmap2.default({\n                    canvas: this.refs.overlay,\n                    intensityToAlpha: true,\n                    alphaRange: [0, 0.1],\n                    gradientTexture: gradientTexture\n                });\n                this._gradientTexture = gradientTexture;\n            }\n            this._redraw();\n            this._prevGradientColors = this.props.gradientColors;\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var pixelRatio = window.devicePixelRatio || 1;\n            return _react2.default.createElement(\"canvas\", { ref: \"overlay\", width: this.props.width * pixelRatio, height: this.props.height * pixelRatio, style: {\n                    width: this.props.width + 'px',\n                    height: this.props.height + 'px',\n                    position: 'absolute',\n                    pointerEvents: 'none',\n                    left: 0,\n                    top: 0,\n                    opacity: 0.8\n                } });\n        }\n    }]);\n\n    return HeatmapLayer;\n}(_react2.default.PureComponent);\n\nexports.default = HeatmapLayer;\n\nHeatmapLayer.contextTypes = {\n    map: _propTypes2.default.object\n};\nHeatmapLayer.propTypes = {\n    width: _propTypes2.default.number.isRequired,\n    height: _propTypes2.default.number.isRequired,\n    longitude: _propTypes2.default.number.isRequired,\n    latitude: _propTypes2.default.number.isRequired,\n    zoom: _propTypes2.default.number.isRequired,\n    data: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.instanceOf(_immutable2.default.List)]),\n    lngLatExtractor: _propTypes2.default.func,\n    intensityExtractor: _propTypes2.default.func,\n    sizeExtractor: _propTypes2.default.func,\n    gradientColors: _propTypes2.default.object\n};\nHeatmapLayer.defaultProps = {\n    lngLatExtractor: function lngLatExtractor() {\n        return _geodata_utils.lngLatExtractor;\n    },\n    intensityExtractor: function intensityExtractor(row, zoom) {\n        return zoom * INTENSITY_FACTOR;\n    },\n    sizeExtractor: function sizeExtractor() {\n        return HeatmapConfig.radius;\n    },\n\n    gradientColors: _map_constants.HeatMapGradient,\n    width: '100%'\n};\n\n/***/ }),\n/* 1107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Generated by CoffeeScript 1.8.0\n\nvar WebGLHeatmap = __webpack_require__(1108);\nvar HeatmapTexture = __webpack_require__(282);\n\nvar path = __webpack_require__(156);\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\n\nvar __indexOf = [].indexOf || function(item) {\n  for (var i = 0, l = this.length; i < l; i++) {\n    if (i in this && this[i] === item) {\n      return i;\n    }\n  }\n  return -1;\n};\n\nfunction nukeVendorPrefix() {\n  var getExtension, getSupportedExtensions, vendorRe, vendors;\n  if (window.WebGLRenderingContext != null) {\n    vendors = ['WEBKIT', 'MOZ', 'MS', 'O'];\n    vendorRe = /^WEBKIT_(.*)|MOZ_(.*)|MS_(.*)|O_(.*)/;\n    getExtension = WebGLRenderingContext.prototype.getExtension;\n    WebGLRenderingContext.prototype.getExtension = function(name) {\n      var extobj, match, vendor, _i, _len;\n      match = name.match(vendorRe);\n      if (match !== null) {\n        name = match[1];\n      }\n      extobj = getExtension.call(this, name);\n      if (extobj === null) {\n        for (_i = 0, _len = vendors.length; _i < _len; _i++) {\n          vendor = vendors[_i];\n          extobj = getExtension.call(this, vendor + '_' + name);\n          if (extobj !== null) {\n            return extobj;\n          }\n        }\n        return null;\n      } else {\n        return extobj;\n      }\n    };\n    getSupportedExtensions = WebGLRenderingContext.prototype.getSupportedExtensions;\n    return WebGLRenderingContext.prototype.getSupportedExtensions = function() {\n      var extension, match, result, supported, _i, _len;\n      supported = getSupportedExtensions.call(this);\n      result = [];\n      for (_i = 0, _len = supported.length; _i < _len; _i++) {\n        extension = supported[_i];\n        match = extension.match(vendorRe);\n        if (match !== null) {\n          extension = match[1];\n        }\n        if (__indexOf.call(result, extension) < 0) {\n          result.push(extension);\n        }\n      }\n      return result;\n    };\n  }\n};\n\nfunction textureFloatShims() {\n  var checkColorBuffer, checkFloatLinear, checkSupport, checkTexture, createSourceCanvas, getExtension, getSupportedExtensions, name, shimExtensions, shimLookup, unshimExtensions, unshimLookup, _i, _len;\n  createSourceCanvas = function() {\n    var canvas, ctx, imageData;\n    canvas = document.createElement('canvas');\n    canvas.width = 2;\n    canvas.height = 2;\n    ctx = canvas.getContext('2d');\n    imageData = ctx.getImageData(0, 0, 2, 2);\n    imageData.data.set(new Uint8ClampedArray([0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255]));\n    ctx.putImageData(imageData, 0, 0);\n    return canvas;\n  };\n  createSourceCanvas();\n  checkFloatLinear = function(gl, sourceType) {\n    var buffer, cleanup, fragmentShader, framebuffer, positionLoc, program, readBuffer, result, source, sourceCanvas, sourceLoc, target, vertexShader, vertices;\n    program = gl.createProgram();\n    vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.attachShader(program, vertexShader);\n    gl.shaderSource(vertexShader, 'attribute vec2 position;\\nvoid main(){\\n    gl_Position = vec4(position, 0.0, 1.0);\\n}');\n    gl.compileShader(vertexShader);\n    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n      throw gl.getShaderInfoLog(vertexShader);\n    }\n    fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.attachShader(program, fragmentShader);\n    gl.shaderSource(fragmentShader, 'uniform sampler2D source;\\nvoid main(){\\n    gl_FragColor = texture2D(source, vec2(1.0, 1.0));\\n}');\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      throw gl.getShaderInfoLog(fragmentShader);\n    }\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      throw gl.getProgramInfoLog(program);\n    }\n    gl.useProgram(program);\n    cleanup = function() {\n      gl.deleteShader(fragmentShader);\n      gl.deleteShader(vertexShader);\n      gl.deleteProgram(program);\n      gl.deleteBuffer(buffer);\n      gl.deleteTexture(source);\n      gl.deleteTexture(target);\n      gl.deleteFramebuffer(framebuffer);\n      gl.bindBuffer(gl.ARRAY_BUFFER, null);\n      gl.useProgram(null);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    };\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target, 0);\n    sourceCanvas = createSourceCanvas();\n    source = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, source);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, sourceType, sourceCanvas);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1]);\n    buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n    positionLoc = gl.getAttribLocation(program, 'position');\n    sourceLoc = gl.getUniformLocation(program, 'source');\n    gl.enableVertexAttribArray(positionLoc);\n    gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(sourceLoc, 0);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    readBuffer = new Uint8Array(4 * 4);\n    gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, readBuffer);\n    result = Math.abs(readBuffer[0] - 127) < 10;\n    cleanup();\n    return result;\n  };\n  checkTexture = function(gl, targetType) {\n    var target;\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, targetType, null);\n    if (gl.getError() === 0) {\n      gl.deleteTexture(target);\n      return true;\n    } else {\n      gl.deleteTexture(target);\n      return false;\n    }\n  };\n  checkColorBuffer = function(gl, targetType) {\n    var check, framebuffer, target;\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, targetType, null);\n    framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target, 0);\n    check = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    gl.deleteTexture(target);\n    gl.deleteFramebuffer(framebuffer);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    if (check === gl.FRAMEBUFFER_COMPLETE) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n  shimExtensions = [];\n  shimLookup = {};\n  unshimExtensions = [];\n  checkSupport = function() {\n    var canvas, extobj, gl, halfFloatExt, halfFloatTexturing, singleFloatExt, singleFloatTexturing;\n    canvas = document.createElement('canvas');\n    gl = null;\n    try {\n      gl = canvas.getContext('experimental-webgl');\n      if (gl === null) {\n        gl = canvas.getContext('webgl');\n      }\n    } catch (_error) {}\n    if (gl != null) {\n      singleFloatExt = gl.getExtension('OES_texture_float');\n      if (singleFloatExt === null) {\n        if (checkTexture(gl, gl.FLOAT)) {\n          singleFloatTexturing = true;\n          shimExtensions.push('OES_texture_float');\n          shimLookup.OES_texture_float = {\n            shim: true\n          };\n        } else {\n          singleFloatTexturing = false;\n          unshimExtensions.push('OES_texture_float');\n        }\n      } else {\n        if (checkTexture(gl, gl.FLOAT)) {\n          singleFloatTexturing = true;\n          shimExtensions.push('OES_texture_float');\n        } else {\n          singleFloatTexturing = false;\n          unshimExtensions.push('OES_texture_float');\n        }\n      }\n      if (singleFloatTexturing) {\n        extobj = gl.getExtension('WEBGL_color_buffer_float');\n        if (extobj === null) {\n          if (checkColorBuffer(gl, gl.FLOAT)) {\n            shimExtensions.push('WEBGL_color_buffer_float');\n            shimLookup.WEBGL_color_buffer_float = {\n              shim: true,\n              RGBA32F_EXT: 0x8814,\n              RGB32F_EXT: 0x8815,\n              FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n              UNSIGNED_NORMALIZED_EXT: 0x8C17\n            };\n          } else {\n            unshimExtensions.push('WEBGL_color_buffer_float');\n          }\n        } else {\n          if (checkColorBuffer(gl, gl.FLOAT)) {\n            shimExtensions.push('WEBGL_color_buffer_float');\n          } else {\n            unshimExtensions.push('WEBGL_color_buffer_float');\n          }\n        }\n        extobj = gl.getExtension('OES_texture_float_linear');\n        if (extobj === null) {\n          if (checkFloatLinear(gl, gl.FLOAT)) {\n            shimExtensions.push('OES_texture_float_linear');\n            shimLookup.OES_texture_float_linear = {\n              shim: true\n            };\n          } else {\n            unshimExtensions.push('OES_texture_float_linear');\n          }\n        } else {\n          if (checkFloatLinear(gl, gl.FLOAT)) {\n            shimExtensions.push('OES_texture_float_linear');\n          } else {\n            unshimExtensions.push('OES_texture_float_linear');\n          }\n        }\n      }\n      halfFloatExt = gl.getExtension('OES_texture_half_float');\n      if (halfFloatExt === null) {\n        if (checkTexture(gl, 0x8D61)) {\n          halfFloatTexturing = true;\n          shimExtensions.push('OES_texture_half_float');\n          halfFloatExt = shimLookup.OES_texture_half_float = {\n            HALF_FLOAT_OES: 0x8D61,\n            shim: true\n          };\n        } else {\n          halfFloatTexturing = false;\n          unshimExtensions.push('OES_texture_half_float');\n        }\n      } else {\n        if (checkTexture(gl, halfFloatExt.HALF_FLOAT_OES)) {\n          halfFloatTexturing = true;\n          shimExtensions.push('OES_texture_half_float');\n        } else {\n          halfFloatTexturing = false;\n          unshimExtensions.push('OES_texture_half_float');\n        }\n      }\n      if (halfFloatTexturing) {\n        extobj = gl.getExtension('EXT_color_buffer_half_float');\n        if (extobj === null) {\n          if (checkColorBuffer(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('EXT_color_buffer_half_float');\n            shimLookup.EXT_color_buffer_half_float = {\n              shim: true,\n              RGBA16F_EXT: 0x881A,\n              RGB16F_EXT: 0x881B,\n              FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n              UNSIGNED_NORMALIZED_EXT: 0x8C17\n            };\n          } else {\n            unshimExtensions.push('EXT_color_buffer_half_float');\n          }\n        } else {\n          if (checkColorBuffer(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('EXT_color_buffer_half_float');\n          } else {\n            unshimExtensions.push('EXT_color_buffer_half_float');\n          }\n        }\n        extobj = gl.getExtension('OES_texture_half_float_linear');\n        if (extobj === null) {\n          if (checkFloatLinear(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('OES_texture_half_float_linear');\n            return shimLookup.OES_texture_half_float_linear = {\n              shim: true\n            };\n          } else {\n            return unshimExtensions.push('OES_texture_half_float_linear');\n          }\n        } else {\n          if (checkFloatLinear(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            return shimExtensions.push('OES_texture_half_float_linear');\n          } else {\n            return unshimExtensions.push('OES_texture_half_float_linear');\n          }\n        }\n      }\n    }\n  };\n  if (window.WebGLRenderingContext != null) {\n    checkSupport();\n    unshimLookup = {};\n    for (_i = 0, _len = unshimExtensions.length; _i < _len; _i++) {\n      name = unshimExtensions[_i];\n      unshimLookup[name] = true;\n    }\n    getExtension = WebGLRenderingContext.prototype.getExtension;\n    WebGLRenderingContext.prototype.getExtension = function(name) {\n      var extobj;\n      extobj = shimLookup[name];\n      if (extobj === void 0) {\n        if (unshimLookup[name]) {\n          return null;\n        } else {\n          return getExtension.call(this, name);\n        }\n      } else {\n        return extobj;\n      }\n    };\n    getSupportedExtensions = WebGLRenderingContext.prototype.getSupportedExtensions;\n    WebGLRenderingContext.prototype.getSupportedExtensions = function() {\n      var extension, result, supported, _j, _k, _len1, _len2;\n      supported = getSupportedExtensions.call(this);\n      result = [];\n      for (_j = 0, _len1 = supported.length; _j < _len1; _j++) {\n        extension = supported[_j];\n        if (unshimLookup[extension] === void 0) {\n          result.push(extension);\n        }\n      }\n      for (_k = 0, _len2 = shimExtensions.length; _k < _len2; _k++) {\n        extension = shimExtensions[_k];\n        if (__indexOf.call(result, extension) < 0) {\n          result.push(extension);\n        }\n      }\n      return result;\n    };\n    return WebGLRenderingContext.prototype.getFloatExtension = function(spec) {\n      var candidate, candidates, half, halfFramebuffer, halfLinear, halfTexture, i, importance, preference, result, single, singleFramebuffer, singleLinear, singleTexture, use, _j, _k, _l, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2;\n      if (spec.prefer == null) {\n        spec.prefer = ['half'];\n      }\n      if (spec.require == null) {\n        spec.require = [];\n      }\n      if (spec.throws == null) {\n        spec.throws = true;\n      }\n      singleTexture = this.getExtension('OES_texture_float');\n      halfTexture = this.getExtension('OES_texture_half_float');\n      singleFramebuffer = this.getExtension('WEBGL_color_buffer_float');\n      halfFramebuffer = this.getExtension('EXT_color_buffer_half_float');\n      singleLinear = this.getExtension('OES_texture_float_linear');\n      halfLinear = this.getExtension('OES_texture_half_float_linear');\n      single = {\n        texture: singleTexture !== null,\n        filterable: singleLinear !== null,\n        renderable: singleFramebuffer !== null,\n        score: 0,\n        precision: 'single',\n        half: false,\n        single: true,\n        type: this.FLOAT\n      };\n      half = {\n        texture: halfTexture !== null,\n        filterable: halfLinear !== null,\n        renderable: halfFramebuffer !== null,\n        score: 0,\n        precision: 'half',\n        half: true,\n        single: false,\n        type: (_ref = halfTexture != null ? halfTexture.HALF_FLOAT_OES : void 0) != null ? _ref : null\n      };\n      candidates = [];\n      if (single.texture) {\n        candidates.push(single);\n      }\n      if (half.texture) {\n        candidates.push(half);\n      }\n      result = [];\n      for (_j = 0, _len1 = candidates.length; _j < _len1; _j++) {\n        candidate = candidates[_j];\n        use = true;\n        _ref1 = spec.require;\n        for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {\n          name = _ref1[_k];\n          if (candidate[name] === false) {\n            use = false;\n          }\n        }\n        if (use) {\n          result.push(candidate);\n        }\n      }\n      for (_l = 0, _len3 = result.length; _l < _len3; _l++) {\n        candidate = result[_l];\n        _ref2 = spec.prefer;\n        for (i = _m = 0, _len4 = _ref2.length; _m < _len4; i = ++_m) {\n          preference = _ref2[i];\n          importance = Math.pow(2, spec.prefer.length - i - 1);\n          if (candidate[preference]) {\n            candidate.score += importance;\n          }\n        }\n      }\n      result.sort(function sort(a, b) {\n        if (a.score === b.score) {\n          return 0;\n        } else if (a.score < b.score) {\n          return 1;\n        } else if (a.score > b.score) {\n          return -1;\n        }\n      });\n      if (result.length === 0) {\n        if (spec.throws) {\n          throw 'No floating point texture support that is ' +\n            spec.require.join(', ');\n        } else {\n          return null;\n        }\n      } else {\n        result = result[0];\n        return {\n          filterable: result.filterable,\n          renderable: result.renderable,\n          type: result.type,\n          precision: result.precision\n        };\n      }\n    };\n  }\n}\n\nnukeVendorPrefix();\ntextureFloatShims();\n\nmodule.exports = WebGLHeatmap;\n\n\n/***/ }),\n/* 1108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar document = __webpack_require__(281);\nvar window = __webpack_require__(157);\n\nvar path = __webpack_require__(156);\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\nvar HeatmapTexture = __webpack_require__(282);\nvar HeatmapHeights = __webpack_require__(1109);\nvar HeatmapShader = __webpack_require__(580);\n\nfunction WebGLHeatmap(_arg) {\n  var alphaEnd, alphaRange, alphaStart, error, getColorFun, gradientTexture, image, intensityToAlpha, output, quad, textureGradient, _ref, _ref1;\n  _ref = _arg != null ? _arg : {}, this.canvas = _ref.canvas, this.width = _ref.width, this.height = _ref.height, intensityToAlpha = _ref.intensityToAlpha, gradientTexture = _ref.gradientTexture, alphaRange = _ref.alphaRange;\n  if (!this.canvas) {\n    this.canvas = document.createElement('canvas');\n  }\n  try {\n    this.gl = this.canvas.getContext('experimental-webgl', {\n      depth: false,\n      antialias: false\n    });\n    if (this.gl === null) {\n      this.gl = this.canvas.getContext('webgl', {\n        depth: false,\n        antialias: false\n      });\n      if (this.gl === null) {\n        throw 'WebGL not supported';\n      }\n    }\n  } catch (_error) {\n    error = _error;\n    throw 'WebGL not supported';\n  }\n  if (window.WebGLDebugUtils != null) {\n    console.log('debugging mode');\n    this.gl = WebGLDebugUtils.makeDebugContext(this.gl, function(err, funcName, args) {\n      throw WebGLDebugUtils.glEnumToString(err) + \" was caused by call to: \" + funcName;\n    });\n  }\n  this.gl.enableVertexAttribArray(0);\n  this.gl.blendFunc(this.gl.ONE, this.gl.ONE);\n  if (gradientTexture) {\n    textureGradient = this.gradientTexture = new HeatmapTexture(this.gl, {\n      channels: 'rgba'\n    }).bind(0).setSize(2, 2).nearest().clampToEdge();\n    if (typeof gradientTexture === 'string') {\n      image = new window.Image();\n      image.onload = function() {\n        return textureGradient.bind().upload(image);\n      };\n      image.src = gradientTexture;\n    } else {\n      if (gradientTexture.width > 0 && gradientTexture.height > 0) {\n        textureGradient.upload(gradientTexture);\n      } else {\n        gradientTexture.onload = function() {\n          return textureGradient.upload(gradientTexture);\n        };\n      }\n    }\n    getColorFun = 'uniform sampler2D gradientTexture;\\nvec3 getColor(float intensity){\\n    return texture2D(gradientTexture, vec2(intensity, 0.0)).rgb;\\n}';\n  } else {\n    textureGradient = null;\n    getColorFun = 'vec3 getColor(float intensity){\\n    vec3 blue = vec3(0.0, 0.0, 1.0);\\n    vec3 cyan = vec3(0.0, 1.0, 1.0);\\n    vec3 green = vec3(0.0, 1.0, 0.0);\\n    vec3 yellow = vec3(1.0, 1.0, 0.0);\\n    vec3 red = vec3(1.0, 0.0, 0.0);\\n\\n    vec3 color = (\\n        fade(-0.25, 0.25, intensity)*blue +\\n        fade(0.0, 0.5, intensity)*cyan +\\n        fade(0.25, 0.75, intensity)*green +\\n        fade(0.5, 1.0, intensity)*yellow +\\n        smoothstep(0.75, 1.0, intensity)*red\\n    );\\n    return color;\\n}';\n  }\n  if (intensityToAlpha == null) {\n    intensityToAlpha = true;\n  }\n  if (intensityToAlpha) {\n    _ref1 = alphaRange != null ? alphaRange : [0, 1], alphaStart = _ref1[0], alphaEnd = _ref1[1];\n    output = \"vec4 alphaFun(vec3 color, float intensity){\\n    float alpha = smoothstep(\" + (alphaStart.toFixed(8)) + \", \" + (alphaEnd.toFixed(8)) + \", intensity);\\n    return vec4(color*alpha, alpha);\\n}\";\n  } else {\n    output = 'vec4 alphaFun(vec3 color, float intensity){\\n    return vec4(color, 1.0);\\n}';\n  }\n  this.shader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + (\"float linstep(float low, float high, float value){\\n    return clamp((value-low)/(high-low), 0.0, 1.0);\\n}\\n\\nfloat fade(float low, float high, float value){\\n    float mid = (low+high)*0.5;\\n    float range = (high-low)*0.5;\\n    float x = 1.0 - clamp(abs(mid-value)/range, 0.0, 1.0);\\n    return smoothstep(0.0, 1.0, x);\\n}\\n\\n\" + getColorFun + \"\\n\" + output + \"\\n\\nvoid main(){\\n    float intensity = smoothstep(0.0, 1.0, texture2D(source, texcoord).r);\\n    vec3 color = getColor(intensity);\\n    gl_FragColor = alphaFun(color, intensity);\\n}\")\n  });\n  if (this.width == null) {\n    this.width = this.canvas.offsetWidth || 2;\n  }\n  if (this.height == null) {\n    this.height = this.canvas.offsetHeight || 2;\n  }\n  this.canvas.width = this.width;\n  this.canvas.height = this.height;\n  this.gl.viewport(0, 0, this.width, this.height);\n  this.quad = this.gl.createBuffer();\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quad);\n  quad = new Float32Array([-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, 1, 0, 1, 1, -1, 0, 1, 1, 1, 0, 1]);\n  this.gl.bufferData(this.gl.ARRAY_BUFFER, quad, this.gl.STATIC_DRAW);\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);\n  this.heights = new HeatmapHeights(this, this.gl, this.width, this.height);\n}\n\nWebGLHeatmap.prototype.adjustSize = function() {\n  var canvasHeight, canvasWidth;\n  canvasWidth = this.canvas.offsetWidth || 2;\n  canvasHeight = this.canvas.offsetHeight || 2;\n  if (this.width !== canvasWidth || this.height !== canvasHeight) {\n    this.gl.viewport(0, 0, canvasWidth, canvasHeight);\n    this.canvas.width = canvasWidth;\n    this.canvas.height = canvasHeight;\n    this.width = canvasWidth;\n    this.height = canvasHeight;\n    return this.heights.resize(this.width, this.height);\n  }\n};\n\nWebGLHeatmap.prototype.display = function() {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.heights.nodeFront.bind(0);\n  if (this.gradientTexture) {\n    this.gradientTexture.bind(1);\n  }\n  this.shader.use().int('source', 0).int('gradientTexture', 1);\n  return this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n};\n\nWebGLHeatmap.prototype.update = function() {\n  return this.heights.update();\n};\n\nWebGLHeatmap.prototype.clear = function() {\n  return this.heights.clear();\n};\n\nWebGLHeatmap.prototype.clamp = function(min, max) {\n  if (min == null) {\n    min = 0;\n  }\n  if (max == null) {\n    max = 1;\n  }\n  return this.heights.clamp(min, max);\n};\n\nWebGLHeatmap.prototype.multiply = function(value) {\n  if (value == null) {\n    value = 0.95;\n  }\n  return this.heights.multiply(value);\n};\n\nWebGLHeatmap.prototype.blur = function() {\n  return this.heights.blur();\n};\n\nWebGLHeatmap.prototype.addPoint = function(x, y, size, intensity) {\n  return this.heights.addPoint(x, y, size, intensity);\n};\n\nWebGLHeatmap.prototype.addPoints = function(items) {\n  var item, _i, _len, _results;\n  _results = [];\n  for (_i = 0, _len = items.length; _i < _len; _i++) {\n    item = items[_i];\n    _results.push(this.addPoint(item.x, item.y, item.size, item.intensity));\n  }\n  return _results;\n};\n\nmodule.exports = WebGLHeatmap;\n\n\n/***/ }),\n/* 1109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar HeatmapShader = __webpack_require__(580);\n\nvar path = __webpack_require__(156);\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\nvar HeatmapNode = __webpack_require__(1110);\n\nfunction HeatmapHeights(heatmap, gl, width, height) {\n  var i, _i, _ref;\n  this.heatmap = heatmap;\n  this.gl = gl;\n  this.width = width;\n  this.height = height;\n  this.shader = new HeatmapShader(this.gl, {\n    vertex: 'attribute vec4 position, intensity;\\nvarying vec2 off, dim;\\nvarying float vIntensity;\\nuniform vec2 viewport;\\n\\nvoid main(){\\n    dim = abs(position.zw);\\n    off = position.zw;\\n    vec2 pos = position.xy + position.zw;\\n    vIntensity = intensity.x;\\n    gl_Position = vec4((pos/viewport)*2.0-1.0, 0.0, 1.0);\\n}',\n    fragment: '#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nvarying vec2 off, dim;\\nvarying float vIntensity;\\nvoid main(){\\n    float falloff = (1.0 - smoothstep(0.0, 1.0, length(off/dim)));\\n    float intensity = falloff*vIntensity;\\n    gl_FragColor = vec4(intensity);\\n}'\n  });\n  this.clampShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform float low, high;\\nvoid main(){\\n    gl_FragColor = vec4(clamp(texture2D(source, texcoord).rgb, low, high), 1.0);\\n}'\n  });\n  this.multiplyShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform float value;\\nvoid main(){\\n    gl_FragColor = vec4(texture2D(source, texcoord).rgb*value, 1.0);\\n}'\n  });\n  this.blurShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform vec2 viewport;\\nvoid main(){\\n    vec4 result = vec4(0.0);\\n    for(int x=-1; x<=1; x++){\\n        for(int y=-1; y<=1; y++){\\n            vec2 off = vec2(x,y)/viewport;\\n            //float factor = 1.0 - smoothstep(0.0, 1.5, length(off));\\n            float factor = 1.0;\\n            result += vec4(texture2D(source, texcoord+off).rgb*factor, factor);\\n        }\\n    }\\n    gl_FragColor = vec4(result.rgb/result.w, 1.0);\\n}'\n  });\n  this.nodeBack = new HeatmapNode(this.gl, this.width, this.height);\n  this.nodeFront = new HeatmapNode(this.gl, this.width, this.height);\n  this.vertexBuffer = this.gl.createBuffer();\n  this.vertexSize = 8;\n  this.maxPointCount = 1024 * 10;\n  this.vertexBufferData = new Float32Array(this.maxPointCount * this.vertexSize * 6);\n  this.vertexBufferViews = [];\n  for (i = _i = 0, _ref = this.maxPointCount; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n    this.vertexBufferViews.push(new Float32Array(this.vertexBufferData.buffer, 0, i * this.vertexSize * 6));\n  }\n  this.bufferIndex = 0;\n  this.pointCount = 0;\n}\n\nHeatmapHeights.prototype.resize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  this.nodeBack.resize(this.width, this.height);\n  return this.nodeFront.resize(this.width, this.height);\n};\n\nHeatmapHeights.prototype.update = function() {\n  var intensityLoc, positionLoc;\n  if (this.pointCount > 0) {\n    this.gl.enable(this.gl.BLEND);\n    this.nodeFront.use();\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexBufferViews[this.pointCount], this.gl.STREAM_DRAW);\n    positionLoc = this.shader.attribLocation('position');\n    intensityLoc = this.shader.attribLocation('intensity');\n    this.gl.enableVertexAttribArray(1);\n    this.gl.vertexAttribPointer(positionLoc, 4, this.gl.FLOAT, false, 8 * 4, 0 * 4);\n    this.gl.vertexAttribPointer(intensityLoc, 4, this.gl.FLOAT, false, 8 * 4, 4 * 4);\n    this.shader.use().vec2('viewport', this.width, this.height);\n    this.gl.drawArrays(this.gl.TRIANGLES, 0, this.pointCount * 6);\n    this.gl.disableVertexAttribArray(1);\n    this.pointCount = 0;\n    this.bufferIndex = 0;\n    this.nodeFront.end();\n    return this.gl.disable(this.gl.BLEND);\n  }\n};\n\nHeatmapHeights.prototype.clear = function() {\n  this.nodeFront.use();\n  this.gl.clearColor(0, 0, 0, 1);\n  this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n  return this.nodeFront.end();\n};\n\nHeatmapHeights.prototype.clamp = function(min, max) {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.clampShader.use().int('source', 0).float('low', min).float('high', max);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.multiply = function(value) {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.multiplyShader.use().int('source', 0).float('value', value);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.blur = function() {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.blurShader.use().int('source', 0).vec2('viewport', this.width, this.height);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.swap = function() {\n  var tmp;\n  tmp = this.nodeFront;\n  this.nodeFront = this.nodeBack;\n  return this.nodeBack = tmp;\n};\n\nHeatmapHeights.prototype.addVertex = function(x, y, xs, ys, intensity) {\n  this.vertexBufferData[this.bufferIndex++] = x;\n  this.vertexBufferData[this.bufferIndex++] = y;\n  this.vertexBufferData[this.bufferIndex++] = xs;\n  this.vertexBufferData[this.bufferIndex++] = ys;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  return this.vertexBufferData[this.bufferIndex++] = intensity;\n};\n\nHeatmapHeights.prototype.addPoint = function(x, y, size, intensity) {\n  var s;\n  if (size == null) {\n    size = 50;\n  }\n  if (intensity == null) {\n    intensity = 0.2;\n  }\n  if (this.pointCount >= this.maxPointCount - 1) {\n    this.update();\n  }\n  y = this.height - y;\n  s = size / 2;\n  this.addVertex(x, y, -s, -s, intensity);\n  this.addVertex(x, y, +s, -s, intensity);\n  this.addVertex(x, y, -s, +s, intensity);\n  this.addVertex(x, y, -s, +s, intensity);\n  this.addVertex(x, y, +s, -s, intensity);\n  this.addVertex(x, y, +s, +s, intensity);\n  return this.pointCount += 1;\n};\n\nmodule.exports = HeatmapHeights;\n\n/***/ }),\n/* 1110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar HeatmapTexture = __webpack_require__(282);\nvar Framebuffer = __webpack_require__(1111);\n\nfunction HeatmapNode(gl, width, height) {\n  var floatExt;\n  this.gl = gl;\n  this.width = width;\n  this.height = height;\n  floatExt = this.gl.getFloatExtension({\n    require: ['renderable']\n  });\n  this.texture = new HeatmapTexture(this.gl, {\n    type: floatExt.type\n  }).bind(0).setSize(this.width, this.height).nearest().clampToEdge();\n  this.fbo = new Framebuffer(this.gl).bind().color(this.texture).unbind();\n}\n\nHeatmapNode.prototype.use = function() {\n  return this.fbo.bind();\n};\n\nHeatmapNode.prototype.bind = function(unit) {\n  return this.texture.bind(unit);\n};\n\nHeatmapNode.prototype.end = function() {\n  return this.fbo.unbind();\n};\n\nHeatmapNode.prototype.resize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  return this.texture.bind(0).setSize(this.width, this.height);\n};\n\nmodule.exports = HeatmapNode;\n\n\n/***/ }),\n/* 1111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction Framebuffer(gl) {\n  this.gl = gl;\n  this.buffer = this.gl.createFramebuffer();\n}\n\nFramebuffer.prototype.destroy = function() {\n  return this.gl.deleteFRamebuffer(this.buffer);\n};\n\nFramebuffer.prototype.bind = function() {\n  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.buffer);\n  return this;\n};\n\nFramebuffer.prototype.unbind = function() {\n  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n  return this;\n};\n\nFramebuffer.prototype.check = function() {\n  var result;\n  result = this.gl.checkFramebufferStatus(this.gl.FRAMEBUFFER);\n  switch (result) {\n    case this.gl.FRAMEBUFFER_UNSUPPORTED:\n      throw 'Framebuffer is unsupported';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n      throw 'Framebuffer incomplete attachment';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n      throw 'Framebuffer incomplete dimensions';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n      throw 'Framebuffer incomplete missing attachment';\n  }\n  return this;\n};\n\nFramebuffer.prototype.color = function(texture) {\n  this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, texture.target, texture.handle, 0);\n  this.check();\n  return this;\n};\n\nFramebuffer.prototype.depth = function(buffer) {\n  this.gl.framebufferRenderbuffer(this.gl.FRAMEBUFFER, this.gl.DEPTH_ATTACHMENT, this.gl.RENDERBUFFER, buffer.id);\n  this.check();\n  return this;\n};\n\nFramebuffer.prototype.destroy = function() {\n  return this.gl.deleteFramebuffer(this.buffer);\n};\n\nmodule.exports = Framebuffer;\n\n\n/***/ }),\n/* 1112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _tooltip_editor = __webpack_require__(1113);\n\nvar _tooltip_editor2 = _interopRequireDefault(_tooltip_editor);\n\nvar _tooltip = __webpack_require__(1336);\n\nvar _tooltip2 = _interopRequireDefault(_tooltip);\n\nvar _gl_popup = __webpack_require__(1337);\n\nvar _gl_popup2 = _interopRequireDefault(_gl_popup);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GLMapTooltip = function (_React$PureComponent) {\n    _inherits(GLMapTooltip, _React$PureComponent);\n\n    function GLMapTooltip() {\n        _classCallCheck(this, GLMapTooltip);\n\n        return _possibleConstructorReturn(this, (GLMapTooltip.__proto__ || Object.getPrototypeOf(GLMapTooltip)).apply(this, arguments));\n    }\n\n    _createClass(GLMapTooltip, [{\n        key: 'getLngLatForTooltip',\n        value: function getLngLatForTooltip() {\n            var _props$tooltip$get = this.props.tooltip.get('locationForTooltip'),\n                lat = _props$tooltip$get.lat,\n                lng = _props$tooltip$get.lng;\n\n            return [lng, lat];\n        }\n    }, {\n        key: 'renderEditor',\n        value: function renderEditor() {\n            var _props = this.props,\n                tooltip = _props.tooltip,\n                locale = _props.locale;\n\n            return _react2.default.createElement(_tooltip_editor2.default, { locale: locale, rowForTooltip: tooltip.get('itemsForTooltip').first(), currentTooltip: tooltip.get('draft'), selectableColumns: tooltip.get('selectableColumns'), updateCurrentTooltip: _grid_report_actions2.default.mapTooltipEdited, saveTooltip: _grid_report_actions2.default.mapTooltipSaved });\n        }\n    }, {\n        key: 'renderTooltip',\n        value: function renderTooltip() {\n            var _props2 = this.props,\n                colorExtractor = _props2.colorExtractor,\n                tooltip = _props2.tooltip,\n                locale = _props2.locale;\n\n            return _react2.default.createElement(_tooltip2.default, { locale: locale, editable: tooltip.get('editable'), currentItems: tooltip.get('itemsForTooltip'), config: tooltip.get('config'), colorExtractor: colorExtractor });\n        }\n    }, {\n        key: 'renderLoading',\n        value: function renderLoading() {\n            return _react2.default.createElement(\"div\", { className: \"tooltip__container\" }, _react2.default.createElement(\"div\", { className: \"tooltip__column_container\" }, \"Loading...\"));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props3 = this.props,\n                colorMapLoading = _props3.colorMapLoading,\n                style = _props3.style,\n                tooltip = _props3.tooltip;\n\n            var isLoading = tooltip.get('loading') || colorMapLoading;\n            var isEditing = tooltip.get('editing');\n            var shouldRenderEditor = !isLoading && isEditing;\n            var shouldRenderTooltip = !isLoading && !isEditing;\n            return _react2.default.createElement(_gl_popup2.default, Object.assign({ key: \"popup-tooltip\", className: \"grid_report__map-popup-tooltip\", coordinates: this.getLngLatForTooltip(), closeButton: false, closeOnClick: shouldRenderTooltip, onClose: _grid_report_actions2.default.clearRowsForTooltip, keepInView: true, anchor: \"bottom\", disableScroll: shouldRenderEditor }, this.props), _react2.default.createElement(\"div\", { style: style, onClick: function onClick(e) {\n                    return e.preventDefault();\n                } }, isLoading && this.renderLoading(), shouldRenderEditor && this.renderEditor(), shouldRenderTooltip && this.renderTooltip()));\n        }\n    }]);\n\n    return GLMapTooltip;\n}(_react2.default.PureComponent);\n\nexports.default = GLMapTooltip;\n\n/***/ }),\n/* 1113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(3);\n\nvar _reactDnd = __webpack_require__(581);\n\nvar _reactDndHtml5Backend = __webpack_require__(1226);\n\nvar _reactDndHtml5Backend2 = _interopRequireDefault(_reactDndHtml5Backend);\n\nvar _sortable_tooltip_editor_item = __webpack_require__(1299);\n\nvar _sortable_tooltip_editor_item2 = _interopRequireDefault(_sortable_tooltip_editor_item);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n    var c = arguments.length,\n        r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n        d;\n    if ((typeof Reflect === \"undefined\" ? \"undefined\" : _typeof(Reflect)) === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) {\n        if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    }return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar addNewColumn = _map_constants.currentMapTooltipSchema.addNewColumn,\n    _removeColumn = _map_constants.currentMapTooltipSchema.removeColumn,\n    updateColumnInTooltip = _map_constants.currentMapTooltipSchema.updateColumnInTooltip,\n    reorderColumns = _map_constants.currentMapTooltipSchema.reorderColumns;\n\nvar MapTooltipEditor = function (_React$Component) {\n    _inherits(MapTooltipEditor, _React$Component);\n\n    function MapTooltipEditor() {\n        _classCallCheck(this, MapTooltipEditor);\n\n        return _possibleConstructorReturn(this, (MapTooltipEditor.__proto__ || Object.getPrototypeOf(MapTooltipEditor)).apply(this, arguments));\n    }\n\n    _createClass(MapTooltipEditor, [{\n        key: \"render\",\n        value: function render() {\n            var _props = this.props,\n                currentTooltip = _props.currentTooltip,\n                updateCurrentTooltip = _props.updateCurrentTooltip,\n                selectableColumns = _props.selectableColumns,\n                rowForTooltip = _props.rowForTooltip,\n                saveTooltip = _props.saveTooltip,\n                locale = _props.locale;\n\n            var columns = currentTooltip.get('columns');\n            var addItemDisabled = columns.size >= _map_constants.MAX_NUMBER_OF_TOOLTIP_FIELDS;\n            var addItemClasses = (0, _classnames2.default)('tooltip_editor__add_button', { disabled: addItemDisabled });\n            var addItemCallback = function addItemCallback() {\n                return updateCurrentTooltip(addNewColumn(currentTooltip, selectableColumns.first()));\n            };\n            return _react2.default.createElement(\"div\", { className: \"tooltip_editor\" }, _react2.default.createElement(\"div\", { className: \"tooltip_editor__show_column_name\" }, \"SHOW COLUMN NAME\"), _react2.default.createElement(\"table\", null, _react2.default.createElement(\"tbody\", null, columns.map(function (column, i) {\n                return _react2.default.createElement(_sortable_tooltip_editor_item2.default, { key: i, id: column, moveItem: function moveItem(moved, movedOver) {\n                        return updateCurrentTooltip(reorderColumns(currentTooltip, moved, movedOver));\n                    }, setItem: _lodash.noop, isDraggable: true, wrapper: false, isFirst: i == 0, rowForTooltip: rowForTooltip, locale: locale, column: column, selectableColumns: selectableColumns, updateColumn: function updateColumn(newColumn) {\n                        return updateCurrentTooltip(updateColumnInTooltip(column, newColumn, currentTooltip));\n                    }, removeColumn: function removeColumn() {\n                        return updateCurrentTooltip(_removeColumn(column, currentTooltip));\n                    } });\n            })), _react2.default.createElement(\"tfoot\", { className: \"tooltip_editor__footer\" }, _react2.default.createElement(\"tr\", null, _react2.default.createElement(\"th\", { className: \"tooltip_editor__show_column_name_footer\" }), _react2.default.createElement(\"td\", { colSpan: 2, className: \"tooltip_editor__footer_add-item\" }, _react2.default.createElement(\"a\", { className: addItemClasses, onClick: !addItemDisabled && addItemCallback }, _react2.default.createElement(\"span\", null, _react2.default.createElement(\"i\", { className: \"tooltip_editor__add_button_icon icon-plus-1\" }), \"ADD ITEM\"))), _react2.default.createElement(\"td\", { className: \"tooltip_editor__save_button_column\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary small tooltip_editor__save_button\", onClick: function onClick() {\n                    return saveTooltip(currentTooltip);\n                } }, _react2.default.createElement(\"span\", null, \"SAVE\")))))));\n        }\n    }]);\n\n    return MapTooltipEditor;\n}(_react2.default.Component);\nMapTooltipEditor.propTypes = {\n    locale: _propTypes2.default.string.isRequired,\n    rowForTooltip: _propTypes2.default.object.isRequired,\n    currentTooltip: _propTypes2.default.object.isRequired,\n    selectableColumns: _propTypes2.default.object.isRequired,\n    updateCurrentTooltip: _propTypes2.default.func.isRequired,\n    saveTooltip: _propTypes2.default.func.isRequired\n};\nMapTooltipEditor = __decorate([(0, _reactDnd.DragDropContext)(_reactDndHtml5Backend2.default)], MapTooltipEditor);\nexports.default = MapTooltipEditor;\n\n/***/ }),\n/* 1114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _DragDropManager = __webpack_require__(1115);\n\nObject.defineProperty(exports, 'DragDropManager', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropManager).default;\n  }\n});\n\nvar _DragSource = __webpack_require__(1197);\n\nObject.defineProperty(exports, 'DragSource', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragSource).default;\n  }\n});\n\nvar _DropTarget = __webpack_require__(1198);\n\nObject.defineProperty(exports, 'DropTarget', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DropTarget).default;\n  }\n});\n\nvar _createTestBackend = __webpack_require__(1199);\n\nObject.defineProperty(exports, 'createTestBackend', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_createTestBackend).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 1115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _createStore = __webpack_require__(1116);\n\nvar _createStore2 = _interopRequireDefault(_createStore);\n\nvar _reducers = __webpack_require__(1129);\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _dragDrop = __webpack_require__(200);\n\nvar dragDropActions = _interopRequireWildcard(_dragDrop);\n\nvar _DragDropMonitor = __webpack_require__(1192);\n\nvar _DragDropMonitor2 = _interopRequireDefault(_DragDropMonitor);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragDropManager = function () {\n\tfunction DragDropManager(createBackend) {\n\t\tvar context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, DragDropManager);\n\n\t\tvar store = (0, _createStore2.default)(_reducers2.default);\n\t\tthis.context = context;\n\t\tthis.store = store;\n\t\tthis.monitor = new _DragDropMonitor2.default(store);\n\t\tthis.registry = this.monitor.registry;\n\t\tthis.backend = createBackend(this);\n\n\t\tstore.subscribe(this.handleRefCountChange.bind(this));\n\t}\n\n\t_createClass(DragDropManager, [{\n\t\tkey: 'handleRefCountChange',\n\t\tvalue: function handleRefCountChange() {\n\t\t\tvar shouldSetUp = this.store.getState().refCount > 0;\n\t\t\tif (shouldSetUp && !this.isSetUp) {\n\t\t\t\tthis.backend.setup();\n\t\t\t\tthis.isSetUp = true;\n\t\t\t} else if (!shouldSetUp && this.isSetUp) {\n\t\t\t\tthis.backend.teardown();\n\t\t\t\tthis.isSetUp = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getContext',\n\t\tvalue: function getContext() {\n\t\t\treturn this.context;\n\t\t}\n\t}, {\n\t\tkey: 'getMonitor',\n\t\tvalue: function getMonitor() {\n\t\t\treturn this.monitor;\n\t\t}\n\t}, {\n\t\tkey: 'getBackend',\n\t\tvalue: function getBackend() {\n\t\t\treturn this.backend;\n\t\t}\n\t}, {\n\t\tkey: 'getRegistry',\n\t\tvalue: function getRegistry() {\n\t\t\treturn this.registry;\n\t\t}\n\t}, {\n\t\tkey: 'getActions',\n\t\tvalue: function getActions() {\n\t\t\tvar manager = this;\n\t\t\tvar dispatch = this.store.dispatch;\n\n\n\t\t\tfunction bindActionCreator(actionCreator) {\n\t\t\t\treturn function () {\n\t\t\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\t\t\targs[_key] = arguments[_key];\n\t\t\t\t\t}\n\n\t\t\t\t\tvar action = actionCreator.apply(manager, args);\n\t\t\t\t\tif (typeof action !== 'undefined') {\n\t\t\t\t\t\tdispatch(action);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn Object.keys(dragDropActions).filter(function (key) {\n\t\t\t\treturn typeof dragDropActions[key] === 'function';\n\t\t\t}).reduce(function (boundActions, key) {\n\t\t\t\tvar action = dragDropActions[key];\n\t\t\t\tboundActions[key] = bindActionCreator(action); // eslint-disable-line no-param-reassign\n\t\t\t\treturn boundActions;\n\t\t\t}, {});\n\t\t}\n\t}]);\n\n\treturn DragDropManager;\n}();\n\nexports.default = DragDropManager;\n\n/***/ }),\n/* 1116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ActionTypes = undefined;\nexports['default'] = createStore;\n\nvar _isPlainObject = __webpack_require__(1117);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _symbolObservable = __webpack_require__(1126);\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar ActionTypes = exports.ActionTypes = {\n  INIT: '@@redux/INIT'\n\n  /**\n   * Creates a Redux store that holds the state tree.\n   * The only way to change the data in the store is to call `dispatch()` on it.\n   *\n   * There should only be a single store in your app. To specify how different\n   * parts of the state tree respond to actions, you may combine several reducers\n   * into a single reducer function by using `combineReducers`.\n   *\n   * @param {Function} reducer A function that returns the next state tree, given\n   * the current state tree and the action to handle.\n   *\n   * @param {any} [preloadedState] The initial state. You may optionally specify it\n   * to hydrate the state from the server in universal apps, or to restore a\n   * previously serialized user session.\n   * If you use `combineReducers` to produce the root reducer function, this must be\n   * an object with the same shape as `combineReducers` keys.\n   *\n   * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n   * to enhance the store with third-party capabilities such as middleware,\n   * time travel, persistence, etc. The only store enhancer that ships with Redux\n   * is `applyMiddleware()`.\n   *\n   * @returns {Store} A Redux store that lets you read the state, dispatch actions\n   * and subscribe to changes.\n   */\n};function createStore(reducer, preloadedState, enhancer) {\n  var _ref2;\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n    enhancer = preloadedState;\n    preloadedState = undefined;\n  }\n\n  if (typeof enhancer !== 'undefined') {\n    if (typeof enhancer !== 'function') {\n      throw new Error('Expected the enhancer to be a function.');\n    }\n\n    return enhancer(createStore)(reducer, preloadedState);\n  }\n\n  if (typeof reducer !== 'function') {\n    throw new Error('Expected the reducer to be a function.');\n  }\n\n  var currentReducer = reducer;\n  var currentState = preloadedState;\n  var currentListeners = [];\n  var nextListeners = currentListeners;\n  var isDispatching = false;\n\n  function ensureCanMutateNextListeners() {\n    if (nextListeners === currentListeners) {\n      nextListeners = currentListeners.slice();\n    }\n  }\n\n  /**\n   * Reads the state tree managed by the store.\n   *\n   * @returns {any} The current state tree of your application.\n   */\n  function getState() {\n    return currentState;\n  }\n\n  /**\n   * Adds a change listener. It will be called any time an action is dispatched,\n   * and some part of the state tree may potentially have changed. You may then\n   * call `getState()` to read the current state tree inside the callback.\n   *\n   * You may call `dispatch()` from a change listener, with the following\n   * caveats:\n   *\n   * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n   * If you subscribe or unsubscribe while the listeners are being invoked, this\n   * will not have any effect on the `dispatch()` that is currently in progress.\n   * However, the next `dispatch()` call, whether nested or not, will use a more\n   * recent snapshot of the subscription list.\n   *\n   * 2. The listener should not expect to see all state changes, as the state\n   * might have been updated multiple times during a nested `dispatch()` before\n   * the listener is called. It is, however, guaranteed that all subscribers\n   * registered before the `dispatch()` started will be called with the latest\n   * state by the time it exits.\n   *\n   * @param {Function} listener A callback to be invoked on every dispatch.\n   * @returns {Function} A function to remove this change listener.\n   */\n  function subscribe(listener) {\n    if (typeof listener !== 'function') {\n      throw new Error('Expected listener to be a function.');\n    }\n\n    var isSubscribed = true;\n\n    ensureCanMutateNextListeners();\n    nextListeners.push(listener);\n\n    return function unsubscribe() {\n      if (!isSubscribed) {\n        return;\n      }\n\n      isSubscribed = false;\n\n      ensureCanMutateNextListeners();\n      var index = nextListeners.indexOf(listener);\n      nextListeners.splice(index, 1);\n    };\n  }\n\n  /**\n   * Dispatches an action. It is the only way to trigger a state change.\n   *\n   * The `reducer` function, used to create the store, will be called with the\n   * current state tree and the given `action`. Its return value will\n   * be considered the **next** state of the tree, and the change listeners\n   * will be notified.\n   *\n   * The base implementation only supports plain object actions. If you want to\n   * dispatch a Promise, an Observable, a thunk, or something else, you need to\n   * wrap your store creating function into the corresponding middleware. For\n   * example, see the documentation for the `redux-thunk` package. Even the\n   * middleware will eventually dispatch plain object actions using this method.\n   *\n   * @param {Object} action A plain object representing “what changed”. It is\n   * a good idea to keep actions serializable so you can record and replay user\n   * sessions, or use the time travelling `redux-devtools`. An action must have\n   * a `type` property which may not be `undefined`. It is a good idea to use\n   * string constants for action types.\n   *\n   * @returns {Object} For convenience, the same action object you dispatched.\n   *\n   * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n   * return something else (for example, a Promise you can await).\n   */\n  function dispatch(action) {\n    if (!(0, _isPlainObject2['default'])(action)) {\n      throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n    }\n\n    if (typeof action.type === 'undefined') {\n      throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n    }\n\n    if (isDispatching) {\n      throw new Error('Reducers may not dispatch actions.');\n    }\n\n    try {\n      isDispatching = true;\n      currentState = currentReducer(currentState, action);\n    } finally {\n      isDispatching = false;\n    }\n\n    var listeners = currentListeners = nextListeners;\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      listener();\n    }\n\n    return action;\n  }\n\n  /**\n   * Replaces the reducer currently used by the store to calculate the state.\n   *\n   * You might need this if your app implements code splitting and you want to\n   * load some of the reducers dynamically. You might also need this if you\n   * implement a hot reloading mechanism for Redux.\n   *\n   * @param {Function} nextReducer The reducer for the store to use instead.\n   * @returns {void}\n   */\n  function replaceReducer(nextReducer) {\n    if (typeof nextReducer !== 'function') {\n      throw new Error('Expected the nextReducer to be a function.');\n    }\n\n    currentReducer = nextReducer;\n    dispatch({ type: ActionTypes.INIT });\n  }\n\n  /**\n   * Interoperability point for observable/reactive libraries.\n   * @returns {observable} A minimal observable of state changes.\n   * For more information, see the observable proposal:\n   * https://github.com/tc39/proposal-observable\n   */\n  function observable() {\n    var _ref;\n\n    var outerSubscribe = subscribe;\n    return _ref = {\n      /**\n       * The minimal observable subscription method.\n       * @param {Object} observer Any object that can be used as an observer.\n       * The observer object should have a `next` method.\n       * @returns {subscription} An object with an `unsubscribe` method that can\n       * be used to unsubscribe the observable from the store, and prevent further\n       * emission of values from the observable.\n       */\n      subscribe: function subscribe(observer) {\n        if (typeof observer !== 'object') {\n          throw new TypeError('Expected the observer to be an object.');\n        }\n\n        function observeState() {\n          if (observer.next) {\n            observer.next(getState());\n          }\n        }\n\n        observeState();\n        var unsubscribe = outerSubscribe(observeState);\n        return { unsubscribe: unsubscribe };\n      }\n    }, _ref[_symbolObservable2['default']] = function () {\n      return this;\n    }, _ref;\n  }\n\n  // When a store is created, an \"INIT\" action is dispatched so that every\n  // reducer returns their initial state. This effectively populates\n  // the initial state tree.\n  dispatch({ type: ActionTypes.INIT });\n\n  return _ref2 = {\n    dispatch: dispatch,\n    subscribe: subscribe,\n    getState: getState,\n    replaceReducer: replaceReducer\n  }, _ref2[_symbolObservable2['default']] = observable, _ref2;\n}\n\n/***/ }),\n/* 1117 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(1118),\n    getPrototype = __webpack_require__(1123),\n    isObjectLike = __webpack_require__(1125);\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n\n\n/***/ }),\n/* 1118 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(583),\n    getRawTag = __webpack_require__(1121),\n    objectToString = __webpack_require__(1122);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 1119 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(1120);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n/* 1120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1121 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(583);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 1122 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n/* 1123 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar overArg = __webpack_require__(1124);\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n\n\n/***/ }),\n/* 1124 */\n/***/ (function(module, exports) {\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n/***/ }),\n/* 1125 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 1126 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ponyfill_js__ = __webpack_require__(1128);\n/* global window */\n\n\nvar root;\n\nif (typeof self !== 'undefined') {\n  root = self;\n} else if (typeof window !== 'undefined') {\n  root = window;\n} else if (typeof global !== 'undefined') {\n  root = global;\n} else if (true) {\n  root = module;\n} else {\n  root = Function('return this')();\n}\n\nvar result = Object(__WEBPACK_IMPORTED_MODULE_0__ponyfill_js__[\"a\" /* default */])(root);\n/* harmony default export */ __webpack_exports__[\"default\"] = (result);\n\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(17), __webpack_require__(1127)(module)))\n\n/***/ }),\n/* 1127 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(originalModule) {\r\n\tif(!originalModule.webpackPolyfill) {\r\n\t\tvar module = Object.create(originalModule);\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"exports\", {\r\n\t\t\tenumerable: true,\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n/***/ }),\n/* 1128 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = symbolObservablePonyfill;\nfunction symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n\n\n/***/ }),\n/* 1129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = reduce;\n\nvar _dragOffset = __webpack_require__(584);\n\nvar _dragOffset2 = _interopRequireDefault(_dragOffset);\n\nvar _dragOperation = __webpack_require__(1130);\n\nvar _dragOperation2 = _interopRequireDefault(_dragOperation);\n\nvar _refCount = __webpack_require__(1176);\n\nvar _refCount2 = _interopRequireDefault(_refCount);\n\nvar _dirtyHandlerIds = __webpack_require__(591);\n\nvar _dirtyHandlerIds2 = _interopRequireDefault(_dirtyHandlerIds);\n\nvar _stateId = __webpack_require__(1191);\n\nvar _stateId2 = _interopRequireDefault(_stateId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction reduce() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\tvar action = arguments[1];\n\n\treturn {\n\t\tdirtyHandlerIds: (0, _dirtyHandlerIds2.default)(state.dirtyHandlerIds, action, state.dragOperation),\n\t\tdragOffset: (0, _dragOffset2.default)(state.dragOffset, action),\n\t\trefCount: (0, _refCount2.default)(state.refCount, action),\n\t\tdragOperation: (0, _dragOperation2.default)(state.dragOperation, action),\n\t\tstateId: (0, _stateId2.default)(state.stateId)\n\t};\n}\n\n/***/ }),\n/* 1130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = dragOperation;\n\nvar _without = __webpack_require__(1131);\n\nvar _without2 = _interopRequireDefault(_without);\n\nvar _dragDrop = __webpack_require__(200);\n\nvar _registry = __webpack_require__(206);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar initialState = {\n\titemType: null,\n\titem: null,\n\tsourceId: null,\n\ttargetIds: [],\n\tdropResult: null,\n\tdidDrop: false,\n\tisSourcePublic: null\n};\n\nfunction dragOperation() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\t\treturn _extends({}, state, {\n\t\t\t\titemType: action.itemType,\n\t\t\t\titem: action.item,\n\t\t\t\tsourceId: action.sourceId,\n\t\t\t\tisSourcePublic: action.isSourcePublic,\n\t\t\t\tdropResult: null,\n\t\t\t\tdidDrop: false\n\t\t\t});\n\t\tcase _dragDrop.PUBLISH_DRAG_SOURCE:\n\t\t\treturn _extends({}, state, {\n\t\t\t\tisSourcePublic: true\n\t\t\t});\n\t\tcase _dragDrop.HOVER:\n\t\t\treturn _extends({}, state, {\n\t\t\t\ttargetIds: action.targetIds\n\t\t\t});\n\t\tcase _registry.REMOVE_TARGET:\n\t\t\tif (state.targetIds.indexOf(action.targetId) === -1) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn _extends({}, state, {\n\t\t\t\ttargetIds: (0, _without2.default)(state.targetIds, action.targetId)\n\t\t\t});\n\t\tcase _dragDrop.DROP:\n\t\t\treturn _extends({}, state, {\n\t\t\t\tdropResult: action.dropResult,\n\t\t\t\tdidDrop: true,\n\t\t\t\ttargetIds: []\n\t\t\t});\n\t\tcase _dragDrop.END_DRAG:\n\t\t\treturn _extends({}, state, {\n\t\t\t\titemType: null,\n\t\t\t\titem: null,\n\t\t\t\tsourceId: null,\n\t\t\t\tdropResult: null,\n\t\t\t\tdidDrop: false,\n\t\t\t\tisSourcePublic: null,\n\t\t\t\ttargetIds: []\n\t\t\t});\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n/***/ }),\n/* 1131 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseDifference = __webpack_require__(586),\n    baseRest = __webpack_require__(290),\n    isArrayLikeObject = __webpack_require__(291);\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n\n\n/***/ }),\n/* 1132 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar mapCacheClear = __webpack_require__(1133),\n    mapCacheDelete = __webpack_require__(1156),\n    mapCacheGet = __webpack_require__(1158),\n    mapCacheHas = __webpack_require__(1159),\n    mapCacheSet = __webpack_require__(1160);\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n/***/ }),\n/* 1133 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Hash = __webpack_require__(1134),\n    ListCache = __webpack_require__(1148),\n    Map = __webpack_require__(1155);\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n/***/ }),\n/* 1134 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hashClear = __webpack_require__(1135),\n    hashDelete = __webpack_require__(1144),\n    hashGet = __webpack_require__(1145),\n    hashHas = __webpack_require__(1146),\n    hashSet = __webpack_require__(1147);\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n/***/ }),\n/* 1135 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(201);\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n/***/ }),\n/* 1136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isFunction = __webpack_require__(587),\n    isMasked = __webpack_require__(1140),\n    isObject = __webpack_require__(283),\n    toSource = __webpack_require__(1142);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n/***/ }),\n/* 1137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1138 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(285);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 1139 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n/* 1140 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar coreJsData = __webpack_require__(1141);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n/***/ }),\n/* 1141 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(203);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n/***/ }),\n/* 1142 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n/***/ }),\n/* 1143 */\n/***/ (function(module, exports) {\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n/***/ }),\n/* 1144 */\n/***/ (function(module, exports) {\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n/***/ }),\n/* 1145 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(201);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n/***/ }),\n/* 1146 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(201);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n/***/ }),\n/* 1147 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(201);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n/***/ }),\n/* 1148 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar listCacheClear = __webpack_require__(1149),\n    listCacheDelete = __webpack_require__(1150),\n    listCacheGet = __webpack_require__(1152),\n    listCacheHas = __webpack_require__(1153),\n    listCacheSet = __webpack_require__(1154);\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n/***/ }),\n/* 1149 */\n/***/ (function(module, exports) {\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n/***/ }),\n/* 1150 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(204);\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n/***/ }),\n/* 1151 */\n/***/ (function(module, exports) {\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n/***/ }),\n/* 1152 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(204);\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n/***/ }),\n/* 1153 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(204);\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n/***/ }),\n/* 1154 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(204);\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n/***/ }),\n/* 1155 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(202),\n    root = __webpack_require__(203);\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n/***/ }),\n/* 1156 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(205);\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n/***/ }),\n/* 1157 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n/***/ }),\n/* 1158 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(205);\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n/***/ }),\n/* 1159 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(205);\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n/***/ }),\n/* 1160 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(205);\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n/***/ }),\n/* 1161 */\n/***/ (function(module, exports) {\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n/***/ }),\n/* 1162 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n/***/ }),\n/* 1163 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseFindIndex = __webpack_require__(1164),\n    baseIsNaN = __webpack_require__(1165),\n    strictIndexOf = __webpack_require__(1166);\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n/***/ }),\n/* 1164 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n/***/ }),\n/* 1165 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n/***/ }),\n/* 1166 */\n/***/ (function(module, exports) {\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n/***/ }),\n/* 1167 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar apply = __webpack_require__(1168);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n/***/ }),\n/* 1168 */\n/***/ (function(module, exports) {\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n/***/ }),\n/* 1169 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseSetToString = __webpack_require__(1170),\n    shortOut = __webpack_require__(1173);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n/***/ }),\n/* 1170 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar constant = __webpack_require__(1171),\n    defineProperty = __webpack_require__(1172),\n    identity = __webpack_require__(590);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n/***/ }),\n/* 1171 */\n/***/ (function(module, exports) {\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n/***/ }),\n/* 1172 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(202);\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n/***/ }),\n/* 1173 */\n/***/ (function(module, exports) {\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n/***/ }),\n/* 1174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isFunction = __webpack_require__(587),\n    isLength = __webpack_require__(1175);\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n/***/ }),\n/* 1175 */\n/***/ (function(module, exports) {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n/***/ }),\n/* 1176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = refCount;\n\nvar _registry = __webpack_require__(206);\n\nfunction refCount() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _registry.ADD_SOURCE:\n\t\tcase _registry.ADD_TARGET:\n\t\t\treturn state + 1;\n\t\tcase _registry.REMOVE_SOURCE:\n\t\tcase _registry.REMOVE_TARGET:\n\t\t\treturn state - 1;\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n/***/ }),\n/* 1177 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayFilter = __webpack_require__(1178),\n    baseRest = __webpack_require__(290),\n    baseXor = __webpack_require__(1179),\n    isArrayLikeObject = __webpack_require__(291);\n\n/**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\nvar xor = baseRest(function(arrays) {\n  return baseXor(arrayFilter(arrays, isArrayLikeObject));\n});\n\nmodule.exports = xor;\n\n\n/***/ }),\n/* 1178 */\n/***/ (function(module, exports) {\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n\n\n/***/ }),\n/* 1179 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseDifference = __webpack_require__(586),\n    baseFlatten = __webpack_require__(1180),\n    baseUniq = __webpack_require__(1185);\n\n/**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\nfunction baseXor(arrays, iteratee, comparator) {\n  var length = arrays.length;\n  if (length < 2) {\n    return length ? baseUniq(arrays[0]) : [];\n  }\n  var index = -1,\n      result = Array(length);\n\n  while (++index < length) {\n    var array = arrays[index],\n        othIndex = -1;\n\n    while (++othIndex < length) {\n      if (othIndex != index) {\n        result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n      }\n    }\n  }\n  return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n}\n\nmodule.exports = baseXor;\n\n\n/***/ }),\n/* 1180 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayPush = __webpack_require__(1181),\n    isFlattenable = __webpack_require__(1182);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n/***/ }),\n/* 1181 */\n/***/ (function(module, exports) {\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n/***/ }),\n/* 1182 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(285),\n    isArguments = __webpack_require__(1183),\n    isArray = __webpack_require__(158);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n/***/ }),\n/* 1183 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsArguments = __webpack_require__(1184),\n    isObjectLike = __webpack_require__(292);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n/***/ }),\n/* 1184 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(588),\n    isObjectLike = __webpack_require__(292);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n/***/ }),\n/* 1185 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar SetCache = __webpack_require__(284),\n    arrayIncludes = __webpack_require__(286),\n    arrayIncludesWith = __webpack_require__(287),\n    cacheHas = __webpack_require__(289),\n    createSet = __webpack_require__(1186),\n    setToArray = __webpack_require__(593);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n/***/ }),\n/* 1186 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Set = __webpack_require__(1187),\n    noop = __webpack_require__(592),\n    setToArray = __webpack_require__(593);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n/***/ }),\n/* 1187 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(202),\n    root = __webpack_require__(203);\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n/***/ }),\n/* 1188 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayMap = __webpack_require__(288),\n    baseIntersection = __webpack_require__(1189),\n    baseRest = __webpack_require__(290),\n    castArrayLikeObject = __webpack_require__(1190);\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n  var mapped = arrayMap(arrays, castArrayLikeObject);\n  return (mapped.length && mapped[0] === arrays[0])\n    ? baseIntersection(mapped)\n    : [];\n});\n\nmodule.exports = intersection;\n\n\n/***/ }),\n/* 1189 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar SetCache = __webpack_require__(284),\n    arrayIncludes = __webpack_require__(286),\n    arrayIncludesWith = __webpack_require__(287),\n    arrayMap = __webpack_require__(288),\n    baseUnary = __webpack_require__(589),\n    cacheHas = __webpack_require__(289);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n  var includes = comparator ? arrayIncludesWith : arrayIncludes,\n      length = arrays[0].length,\n      othLength = arrays.length,\n      othIndex = othLength,\n      caches = Array(othLength),\n      maxLength = Infinity,\n      result = [];\n\n  while (othIndex--) {\n    var array = arrays[othIndex];\n    if (othIndex && iteratee) {\n      array = arrayMap(array, baseUnary(iteratee));\n    }\n    maxLength = nativeMin(array.length, maxLength);\n    caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n      ? new SetCache(othIndex && array)\n      : undefined;\n  }\n  array = arrays[0];\n\n  var index = -1,\n      seen = caches[0];\n\n  outer:\n  while (++index < length && result.length < maxLength) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (!(seen\n          ? cacheHas(seen, computed)\n          : includes(result, computed, comparator)\n        )) {\n      othIndex = othLength;\n      while (--othIndex) {\n        var cache = caches[othIndex];\n        if (!(cache\n              ? cacheHas(cache, computed)\n              : includes(arrays[othIndex], computed, comparator))\n            ) {\n          continue outer;\n        }\n      }\n      if (seen) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseIntersection;\n\n\n/***/ }),\n/* 1190 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isArrayLikeObject = __webpack_require__(291);\n\n/**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n  return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n\n\n/***/ }),\n/* 1191 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = stateId;\nfunction stateId() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n\treturn state + 1;\n}\n\n/***/ }),\n/* 1192 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = __webpack_require__(158);\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _matchesType = __webpack_require__(585);\n\nvar _matchesType2 = _interopRequireDefault(_matchesType);\n\nvar _HandlerRegistry = __webpack_require__(1193);\n\nvar _HandlerRegistry2 = _interopRequireDefault(_HandlerRegistry);\n\nvar _dragOffset = __webpack_require__(584);\n\nvar _dirtyHandlerIds = __webpack_require__(591);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragDropMonitor = function () {\n\tfunction DragDropMonitor(store) {\n\t\t_classCallCheck(this, DragDropMonitor);\n\n\t\tthis.store = store;\n\t\tthis.registry = new _HandlerRegistry2.default(store);\n\t}\n\n\t_createClass(DragDropMonitor, [{\n\t\tkey: 'subscribeToStateChange',\n\t\tvalue: function subscribeToStateChange(listener) {\n\t\t\tvar _this = this;\n\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\t\tvar handlerIds = options.handlerIds;\n\n\t\t\t(0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.');\n\t\t\t(0, _invariant2.default)(typeof handlerIds === 'undefined' || (0, _isArray2.default)(handlerIds), 'handlerIds, when specified, must be an array of strings.');\n\n\t\t\tvar prevStateId = this.store.getState().stateId;\n\t\t\tvar handleChange = function handleChange() {\n\t\t\t\tvar state = _this.store.getState();\n\t\t\t\tvar currentStateId = state.stateId;\n\t\t\t\ttry {\n\t\t\t\t\tvar canSkipListener = currentStateId === prevStateId || currentStateId === prevStateId + 1 && !(0, _dirtyHandlerIds.areDirty)(state.dirtyHandlerIds, handlerIds);\n\n\t\t\t\t\tif (!canSkipListener) {\n\t\t\t\t\t\tlistener();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tprevStateId = currentStateId;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn this.store.subscribe(handleChange);\n\t\t}\n\t}, {\n\t\tkey: 'subscribeToOffsetChange',\n\t\tvalue: function subscribeToOffsetChange(listener) {\n\t\t\tvar _this2 = this;\n\n\t\t\t(0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.');\n\n\t\t\tvar previousState = this.store.getState().dragOffset;\n\t\t\tvar handleChange = function handleChange() {\n\t\t\t\tvar nextState = _this2.store.getState().dragOffset;\n\t\t\t\tif (nextState === previousState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpreviousState = nextState;\n\t\t\t\tlistener();\n\t\t\t};\n\n\t\t\treturn this.store.subscribe(handleChange);\n\t\t}\n\t}, {\n\t\tkey: 'canDragSource',\n\t\tvalue: function canDragSource(sourceId) {\n\t\t\tvar source = this.registry.getSource(sourceId);\n\t\t\t(0, _invariant2.default)(source, 'Expected to find a valid source.');\n\n\t\t\tif (this.isDragging()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn source.canDrag(this, sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'canDropOnTarget',\n\t\tvalue: function canDropOnTarget(targetId) {\n\t\t\tvar target = this.registry.getTarget(targetId);\n\t\t\t(0, _invariant2.default)(target, 'Expected to find a valid target.');\n\n\t\t\tif (!this.isDragging() || this.didDrop()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetType = this.registry.getTargetType(targetId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\treturn (0, _matchesType2.default)(targetType, draggedItemType) && target.canDrop(this, targetId);\n\t\t}\n\t}, {\n\t\tkey: 'isDragging',\n\t\tvalue: function isDragging() {\n\t\t\treturn Boolean(this.getItemType());\n\t\t}\n\t}, {\n\t\tkey: 'isDraggingSource',\n\t\tvalue: function isDraggingSource(sourceId) {\n\t\t\tvar source = this.registry.getSource(sourceId, true);\n\t\t\t(0, _invariant2.default)(source, 'Expected to find a valid source.');\n\n\t\t\tif (!this.isDragging() || !this.isSourcePublic()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar sourceType = this.registry.getSourceType(sourceId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\tif (sourceType !== draggedItemType) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn source.isDragging(this, sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'isOverTarget',\n\t\tvalue: function isOverTarget(targetId) {\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { shallow: false };\n\t\t\tvar shallow = options.shallow;\n\n\t\t\tif (!this.isDragging()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetType = this.registry.getTargetType(targetId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\tif (!(0, _matchesType2.default)(targetType, draggedItemType)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetIds = this.getTargetIds();\n\t\t\tif (!targetIds.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar index = targetIds.indexOf(targetId);\n\t\t\tif (shallow) {\n\t\t\t\treturn index === targetIds.length - 1;\n\t\t\t} else {\n\t\t\t\treturn index > -1;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.store.getState().dragOperation.itemType;\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.store.getState().dragOperation.item;\n\t\t}\n\t}, {\n\t\tkey: 'getSourceId',\n\t\tvalue: function getSourceId() {\n\t\t\treturn this.store.getState().dragOperation.sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'getTargetIds',\n\t\tvalue: function getTargetIds() {\n\t\t\treturn this.store.getState().dragOperation.targetIds;\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.store.getState().dragOperation.dropResult;\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.store.getState().dragOperation.didDrop;\n\t\t}\n\t}, {\n\t\tkey: 'isSourcePublic',\n\t\tvalue: function isSourcePublic() {\n\t\t\treturn this.store.getState().dragOperation.isSourcePublic;\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.initialClientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.initialSourceClientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.clientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn (0, _dragOffset.getSourceClientOffset)(this.store.getState().dragOffset);\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn (0, _dragOffset.getDifferenceFromInitialOffset)(this.store.getState().dragOffset);\n\t\t}\n\t}]);\n\n\treturn DragDropMonitor;\n}();\n\nexports.default = DragDropMonitor;\n\n/***/ }),\n/* 1193 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = __webpack_require__(158);\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _asap = __webpack_require__(1194);\n\nvar _asap2 = _interopRequireDefault(_asap);\n\nvar _registry = __webpack_require__(206);\n\nvar _getNextUniqueId = __webpack_require__(1196);\n\nvar _getNextUniqueId2 = _interopRequireDefault(_getNextUniqueId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HandlerRoles = {\n\tSOURCE: 'SOURCE',\n\tTARGET: 'TARGET'\n};\n\nfunction validateSourceContract(source) {\n\t(0, _invariant2.default)(typeof source.canDrag === 'function', 'Expected canDrag to be a function.');\n\t(0, _invariant2.default)(typeof source.beginDrag === 'function', 'Expected beginDrag to be a function.');\n\t(0, _invariant2.default)(typeof source.endDrag === 'function', 'Expected endDrag to be a function.');\n}\n\nfunction validateTargetContract(target) {\n\t(0, _invariant2.default)(typeof target.canDrop === 'function', 'Expected canDrop to be a function.');\n\t(0, _invariant2.default)(typeof target.hover === 'function', 'Expected hover to be a function.');\n\t(0, _invariant2.default)(typeof target.drop === 'function', 'Expected beginDrag to be a function.');\n}\n\nfunction validateType(type, allowArray) {\n\tif (allowArray && (0, _isArray2.default)(type)) {\n\t\ttype.forEach(function (t) {\n\t\t\treturn validateType(t, false);\n\t\t});\n\t\treturn;\n\t}\n\n\t(0, _invariant2.default)(typeof type === 'string' || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'symbol', allowArray ? 'Type can only be a string, a symbol, or an array of either.' : 'Type can only be a string or a symbol.');\n}\n\nfunction getNextHandlerId(role) {\n\tvar id = (0, _getNextUniqueId2.default)().toString();\n\tswitch (role) {\n\t\tcase HandlerRoles.SOURCE:\n\t\t\treturn 'S' + id;\n\t\tcase HandlerRoles.TARGET:\n\t\t\treturn 'T' + id;\n\t\tdefault:\n\t\t\t(0, _invariant2.default)(false, 'Unknown role: ' + role);\n\t}\n}\n\nfunction parseRoleFromHandlerId(handlerId) {\n\tswitch (handlerId[0]) {\n\t\tcase 'S':\n\t\t\treturn HandlerRoles.SOURCE;\n\t\tcase 'T':\n\t\t\treturn HandlerRoles.TARGET;\n\t\tdefault:\n\t\t\t(0, _invariant2.default)(false, 'Cannot parse handler ID: ' + handlerId);\n\t}\n}\n\nvar HandlerRegistry = function () {\n\tfunction HandlerRegistry(store) {\n\t\t_classCallCheck(this, HandlerRegistry);\n\n\t\tthis.store = store;\n\n\t\tthis.types = {};\n\t\tthis.handlers = {};\n\n\t\tthis.pinnedSourceId = null;\n\t\tthis.pinnedSource = null;\n\t}\n\n\t_createClass(HandlerRegistry, [{\n\t\tkey: 'addSource',\n\t\tvalue: function addSource(type, source) {\n\t\t\tvalidateType(type);\n\t\t\tvalidateSourceContract(source);\n\n\t\t\tvar sourceId = this.addHandler(HandlerRoles.SOURCE, type, source);\n\t\t\tthis.store.dispatch((0, _registry.addSource)(sourceId));\n\t\t\treturn sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'addTarget',\n\t\tvalue: function addTarget(type, target) {\n\t\t\tvalidateType(type, true);\n\t\t\tvalidateTargetContract(target);\n\n\t\t\tvar targetId = this.addHandler(HandlerRoles.TARGET, type, target);\n\t\t\tthis.store.dispatch((0, _registry.addTarget)(targetId));\n\t\t\treturn targetId;\n\t\t}\n\t}, {\n\t\tkey: 'addHandler',\n\t\tvalue: function addHandler(role, type, handler) {\n\t\t\tvar id = getNextHandlerId(role);\n\t\t\tthis.types[id] = type;\n\t\t\tthis.handlers[id] = handler;\n\n\t\t\treturn id;\n\t\t}\n\t}, {\n\t\tkey: 'containsHandler',\n\t\tvalue: function containsHandler(handler) {\n\t\t\tvar _this = this;\n\n\t\t\treturn Object.keys(this.handlers).some(function (key) {\n\t\t\t\treturn _this.handlers[key] === handler;\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getSource',\n\t\tvalue: function getSource(sourceId, includePinned) {\n\t\t\t(0, _invariant2.default)(this.isSourceId(sourceId), 'Expected a valid source ID.');\n\n\t\t\tvar isPinned = includePinned && sourceId === this.pinnedSourceId;\n\t\t\tvar source = isPinned ? this.pinnedSource : this.handlers[sourceId];\n\n\t\t\treturn source;\n\t\t}\n\t}, {\n\t\tkey: 'getTarget',\n\t\tvalue: function getTarget(targetId) {\n\t\t\t(0, _invariant2.default)(this.isTargetId(targetId), 'Expected a valid target ID.');\n\t\t\treturn this.handlers[targetId];\n\t\t}\n\t}, {\n\t\tkey: 'getSourceType',\n\t\tvalue: function getSourceType(sourceId) {\n\t\t\t(0, _invariant2.default)(this.isSourceId(sourceId), 'Expected a valid source ID.');\n\t\t\treturn this.types[sourceId];\n\t\t}\n\t}, {\n\t\tkey: 'getTargetType',\n\t\tvalue: function getTargetType(targetId) {\n\t\t\t(0, _invariant2.default)(this.isTargetId(targetId), 'Expected a valid target ID.');\n\t\t\treturn this.types[targetId];\n\t\t}\n\t}, {\n\t\tkey: 'isSourceId',\n\t\tvalue: function isSourceId(handlerId) {\n\t\t\tvar role = parseRoleFromHandlerId(handlerId);\n\t\t\treturn role === HandlerRoles.SOURCE;\n\t\t}\n\t}, {\n\t\tkey: 'isTargetId',\n\t\tvalue: function isTargetId(handlerId) {\n\t\t\tvar role = parseRoleFromHandlerId(handlerId);\n\t\t\treturn role === HandlerRoles.TARGET;\n\t\t}\n\t}, {\n\t\tkey: 'removeSource',\n\t\tvalue: function removeSource(sourceId) {\n\t\t\tvar _this2 = this;\n\n\t\t\t(0, _invariant2.default)(this.getSource(sourceId), 'Expected an existing source.');\n\t\t\tthis.store.dispatch((0, _registry.removeSource)(sourceId));\n\n\t\t\t(0, _asap2.default)(function () {\n\t\t\t\tdelete _this2.handlers[sourceId];\n\t\t\t\tdelete _this2.types[sourceId];\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'removeTarget',\n\t\tvalue: function removeTarget(targetId) {\n\t\t\tvar _this3 = this;\n\n\t\t\t(0, _invariant2.default)(this.getTarget(targetId), 'Expected an existing target.');\n\t\t\tthis.store.dispatch((0, _registry.removeTarget)(targetId));\n\n\t\t\t(0, _asap2.default)(function () {\n\t\t\t\tdelete _this3.handlers[targetId];\n\t\t\t\tdelete _this3.types[targetId];\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'pinSource',\n\t\tvalue: function pinSource(sourceId) {\n\t\t\tvar source = this.getSource(sourceId);\n\t\t\t(0, _invariant2.default)(source, 'Expected an existing source.');\n\n\t\t\tthis.pinnedSourceId = sourceId;\n\t\t\tthis.pinnedSource = source;\n\t\t}\n\t}, {\n\t\tkey: 'unpinSource',\n\t\tvalue: function unpinSource() {\n\t\t\t(0, _invariant2.default)(this.pinnedSource, 'No source is pinned at the time.');\n\n\t\t\tthis.pinnedSourceId = null;\n\t\t\tthis.pinnedSource = null;\n\t\t}\n\t}]);\n\n\treturn HandlerRegistry;\n}();\n\nexports.default = HandlerRegistry;\n\n/***/ }),\n/* 1194 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = __webpack_require__(1195);\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n    if (pendingErrors.length) {\n        throw pendingErrors.shift();\n    }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n    var rawTask;\n    if (freeTasks.length) {\n        rawTask = freeTasks.pop();\n    } else {\n        rawTask = new RawTask();\n    }\n    rawTask.task = task;\n    rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects.  A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n    this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n    try {\n        this.task.call();\n    } catch (error) {\n        if (asap.onerror) {\n            // This hook exists purely for testing purposes.\n            // Its name will be periodically randomized to break any code that\n            // depends on its existence.\n            asap.onerror(error);\n        } else {\n            // In a web browser, exceptions are not fatal. However, to avoid\n            // slowing down the queue of pending tasks, we rethrow the error in a\n            // lower priority turn.\n            pendingErrors.push(error);\n            requestErrorThrow();\n        }\n    } finally {\n        this.task = null;\n        freeTasks[freeTasks.length] = this;\n    }\n};\n\n\n/***/ }),\n/* 1195 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n    if (!queue.length) {\n        requestFlush();\n        flushing = true;\n    }\n    // Equivalent to push, but avoids a function call.\n    queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n    while (index < queue.length) {\n        var currentIndex = index;\n        // Advance the index before calling the task. This ensures that we will\n        // begin flushing on the next task the task throws an error.\n        index = index + 1;\n        queue[currentIndex].call();\n        // Prevent leaking memory for long chains of recursive calls to `asap`.\n        // If we call `asap` within tasks scheduled by `asap`, the queue will\n        // grow, but to avoid an O(n) walk for every task we execute, we don't\n        // shift tasks off the queue after they have been executed.\n        // Instead, we periodically shift 1024 tasks off the queue.\n        if (index > capacity) {\n            // Manually shift all values starting at the index back to the\n            // beginning of the queue.\n            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n                queue[scan] = queue[scan + index];\n            }\n            queue.length -= index;\n            index = 0;\n        }\n    }\n    queue.length = 0;\n    index = 0;\n    flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n    requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n    requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n    var toggle = 1;\n    var observer = new BrowserMutationObserver(callback);\n    var node = document.createTextNode(\"\");\n    observer.observe(node, {characterData: true});\n    return function requestCall() {\n        toggle = -toggle;\n        node.data = toggle;\n    };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n//     var channel = new MessageChannel();\n//     channel.port1.onmessage = callback;\n//     return function requestCall() {\n//         channel.port2.postMessage(0);\n//     };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n//     return function requestCall() {\n//         setImmediate(callback);\n//     };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n    return function requestCall() {\n        // We dispatch a timeout with a specified delay of 0 for engines that\n        // can reliably accommodate that request. This will usually be snapped\n        // to a 4 milisecond delay, but once we're flushing, there's no delay\n        // between events.\n        var timeoutHandle = setTimeout(handleTimer, 0);\n        // However, since this timer gets frequently dropped in Firefox\n        // workers, we enlist an interval handle that will try to fire\n        // an event 20 times per second until it succeeds.\n        var intervalHandle = setInterval(handleTimer, 50);\n\n        function handleTimer() {\n            // Whichever timer succeeds will cancel both timers and\n            // execute the callback.\n            clearTimeout(timeoutHandle);\n            clearInterval(intervalHandle);\n            callback();\n        }\n    };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1196 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = getNextUniqueId;\nvar nextUniqueId = 0;\n\nfunction getNextUniqueId() {\n\treturn nextUniqueId++;\n}\n\n/***/ }),\n/* 1197 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragSource = function () {\n\tfunction DragSource() {\n\t\t_classCallCheck(this, DragSource);\n\t}\n\n\t_createClass(DragSource, [{\n\t\tkey: \"canDrag\",\n\t\tvalue: function canDrag() {\n\t\t\treturn true;\n\t\t}\n\t}, {\n\t\tkey: \"isDragging\",\n\t\tvalue: function isDragging(monitor, handle) {\n\t\t\treturn handle === monitor.getSourceId();\n\t\t}\n\t}, {\n\t\tkey: \"endDrag\",\n\t\tvalue: function endDrag() {}\n\t}]);\n\n\treturn DragSource;\n}();\n\nexports.default = DragSource;\n\n/***/ }),\n/* 1198 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DropTarget = function () {\n\tfunction DropTarget() {\n\t\t_classCallCheck(this, DropTarget);\n\t}\n\n\t_createClass(DropTarget, [{\n\t\tkey: \"canDrop\",\n\t\tvalue: function canDrop() {\n\t\t\treturn true;\n\t\t}\n\t}, {\n\t\tkey: \"hover\",\n\t\tvalue: function hover() {}\n\t}, {\n\t\tkey: \"drop\",\n\t\tvalue: function drop() {}\n\t}]);\n\n\treturn DropTarget;\n}();\n\nexports.default = DropTarget;\n\n/***/ }),\n/* 1199 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createBackend;\n\nvar _noop = __webpack_require__(592);\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TestBackend = function () {\n\tfunction TestBackend(manager) {\n\t\t_classCallCheck(this, TestBackend);\n\n\t\tthis.actions = manager.getActions();\n\t}\n\n\t_createClass(TestBackend, [{\n\t\tkey: 'setup',\n\t\tvalue: function setup() {\n\t\t\tthis.didCallSetup = true;\n\t\t}\n\t}, {\n\t\tkey: 'teardown',\n\t\tvalue: function teardown() {\n\t\t\tthis.didCallTeardown = true;\n\t\t}\n\t}, {\n\t\tkey: 'connectDragSource',\n\t\tvalue: function connectDragSource() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'connectDragPreview',\n\t\tvalue: function connectDragPreview() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'connectDropTarget',\n\t\tvalue: function connectDropTarget() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'simulateBeginDrag',\n\t\tvalue: function simulateBeginDrag(sourceIds, options) {\n\t\t\tthis.actions.beginDrag(sourceIds, options);\n\t\t}\n\t}, {\n\t\tkey: 'simulatePublishDragSource',\n\t\tvalue: function simulatePublishDragSource() {\n\t\t\tthis.actions.publishDragSource();\n\t\t}\n\t}, {\n\t\tkey: 'simulateHover',\n\t\tvalue: function simulateHover(targetIds, options) {\n\t\t\tthis.actions.hover(targetIds, options);\n\t\t}\n\t}, {\n\t\tkey: 'simulateDrop',\n\t\tvalue: function simulateDrop() {\n\t\t\tthis.actions.drop();\n\t\t}\n\t}, {\n\t\tkey: 'simulateEndDrag',\n\t\tvalue: function simulateEndDrag() {\n\t\t\tthis.actions.endDrag();\n\t\t}\n\t}]);\n\n\treturn TestBackend;\n}();\n\nfunction createBackend(manager) {\n\treturn new TestBackend(manager);\n}\n\n/***/ }),\n/* 1200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class, _temp;\n\nvar _react = __webpack_require__(0);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _DragDropContext = __webpack_require__(582);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * This class is a React-Component based version of the DragDropContext.\n * This is an alternative to decorating an application component with an ES7 decorator.\n */\nvar DragDropContextProvider = (_temp = _class = function (_Component) {\n\t_inherits(DragDropContextProvider, _Component);\n\n\tfunction DragDropContextProvider(props, context) {\n\t\t_classCallCheck(this, DragDropContextProvider);\n\n\t\t/**\n   * This property determines which window global to use for creating the DragDropManager.\n   * If a window has been injected explicitly via props, that is used first. If it is available\n   * as a context value, then use that, otherwise use the browser global.\n   */\n\t\tvar _this = _possibleConstructorReturn(this, (DragDropContextProvider.__proto__ || Object.getPrototypeOf(DragDropContextProvider)).call(this, props, context));\n\n\t\tvar getWindow = function getWindow() {\n\t\t\tif (props && props.window) {\n\t\t\t\treturn props.window;\n\t\t\t} else if (context && context.window) {\n\t\t\t\treturn context.window;\n\t\t\t} else if (typeof window !== 'undefined') {\n\t\t\t\treturn window;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\n\t\t_this.backend = (0, _DragDropContext.unpackBackendForEs5Users)(props.backend);\n\t\t_this.childContext = (0, _DragDropContext.createChildContext)(_this.backend, {\n\t\t\twindow: getWindow()\n\t\t});\n\t\treturn _this;\n\t}\n\n\t_createClass(DragDropContextProvider, [{\n\t\tkey: 'componentWillReceiveProps',\n\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\tif (nextProps.backend !== this.props.backend || nextProps.window !== this.props.window) {\n\t\t\t\tthrow new Error('DragDropContextProvider backend and window props must not change.');\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getChildContext',\n\t\tvalue: function getChildContext() {\n\t\t\treturn this.childContext;\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\treturn _react.Children.only(this.props.children);\n\t\t}\n\t}]);\n\n\treturn DragDropContextProvider;\n}(_react.Component), _class.propTypes = {\n\tbackend: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.object]).isRequired,\n\tchildren: _propTypes2.default.element.isRequired,\n\twindow: _propTypes2.default.object // eslint-disable-line react/forbid-prop-types\n}, _class.defaultProps = {\n\twindow: undefined\n}, _class.childContextTypes = _DragDropContext.CHILD_CONTEXT_TYPES, _class.displayName = 'DragDropContextProvider', _class.contextTypes = {\n\twindow: _propTypes2.default.object\n}, _temp);\nexports.default = DragDropContextProvider;\n\n/***/ }),\n/* 1201 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = DragLayer;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _hoistNonReactStatics = __webpack_require__(189);\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _shallowEqual = __webpack_require__(293);\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _shallowEqualScalar = __webpack_require__(595);\n\nvar _shallowEqualScalar2 = _interopRequireDefault(_shallowEqualScalar);\n\nvar _checkDecoratorArguments = __webpack_require__(207);\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction DragLayer(collect) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragLayer', 'collect[, options]'].concat(Array.prototype.slice.call(arguments))); // eslint-disable-line prefer-rest-params\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the first argument to DragLayer to be a function that collects props to inject into the component. ', 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs-drag-layer.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the second argument to DragLayer to be a plain object when specified. ' + 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs-drag-layer.html', options);\n\n\treturn function decorateLayer(DecoratedComponent) {\n\t\tvar _class, _temp;\n\n\t\tvar _options$arePropsEqua = options.arePropsEqual,\n\t\t    arePropsEqual = _options$arePropsEqua === undefined ? _shallowEqualScalar2.default : _options$arePropsEqua;\n\n\t\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\t\tvar DragLayerContainer = (_temp = _class = function (_Component) {\n\t\t\t_inherits(DragLayerContainer, _Component);\n\n\t\t\t_createClass(DragLayerContainer, [{\n\t\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\t\t(0, _invariant2.default)(this.child, 'In order to access an instance of the decorated component it can not be a stateless component.');\n\t\t\t\t\treturn this.child;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'shouldComponentUpdate',\n\t\t\t\tvalue: function shouldComponentUpdate(nextProps, nextState) {\n\t\t\t\t\treturn !arePropsEqual(nextProps, this.props) || !(0, _shallowEqual2.default)(nextState, this.state);\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\tfunction DragLayerContainer(props, context) {\n\t\t\t\t_classCallCheck(this, DragLayerContainer);\n\n\t\t\t\tvar _this = _possibleConstructorReturn(this, (DragLayerContainer.__proto__ || Object.getPrototypeOf(DragLayerContainer)).call(this, props));\n\n\t\t\t\t_this.handleChange = _this.handleChange.bind(_this);\n\n\t\t\t\t_this.manager = context.dragDropManager;\n\t\t\t\t(0, _invariant2.default)(_typeof(_this.manager) === 'object', 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to wrap the top-level component of your app with DragDropContext. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);\n\n\t\t\t\t_this.state = _this.getCurrentState();\n\t\t\t\treturn _this;\n\t\t\t}\n\n\t\t\t_createClass(DragLayerContainer, [{\n\t\t\t\tkey: 'componentDidMount',\n\t\t\t\tvalue: function componentDidMount() {\n\t\t\t\t\tthis.isCurrentlyMounted = true;\n\n\t\t\t\t\tvar monitor = this.manager.getMonitor();\n\t\t\t\t\tthis.unsubscribeFromOffsetChange = monitor.subscribeToOffsetChange(this.handleChange);\n\t\t\t\t\tthis.unsubscribeFromStateChange = monitor.subscribeToStateChange(this.handleChange);\n\n\t\t\t\t\tthis.handleChange();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'componentWillUnmount',\n\t\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\t\tthis.isCurrentlyMounted = false;\n\n\t\t\t\t\tthis.unsubscribeFromOffsetChange();\n\t\t\t\t\tthis.unsubscribeFromStateChange();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'handleChange',\n\t\t\t\tvalue: function handleChange() {\n\t\t\t\t\tif (!this.isCurrentlyMounted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar nextState = this.getCurrentState();\n\t\t\t\t\tif (!(0, _shallowEqual2.default)(nextState, this.state)) {\n\t\t\t\t\t\tthis.setState(nextState);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getCurrentState',\n\t\t\t\tvalue: function getCurrentState() {\n\t\t\t\t\tvar monitor = this.manager.getMonitor();\n\t\t\t\t\treturn collect(monitor, this.props);\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'render',\n\t\t\t\tvalue: function render() {\n\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, this.state, {\n\t\t\t\t\t\tref: function ref(child) {\n\t\t\t\t\t\t\t_this2.child = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\treturn DragLayerContainer;\n\t\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = 'DragLayer(' + displayName + ')', _class.contextTypes = {\n\t\t\tdragDropManager: _propTypes2.default.object.isRequired\n\t\t}, _temp);\n\n\n\t\treturn (0, _hoistNonReactStatics2.default)(DragLayerContainer, DecoratedComponent);\n\t};\n}\n\n/***/ }),\n/* 1202 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(594),\n    getRawTag = __webpack_require__(1205),\n    objectToString = __webpack_require__(1206);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 1203 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(1204);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n/* 1204 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1205 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(594);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 1206 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n/* 1207 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar overArg = __webpack_require__(1208);\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n\n\n/***/ }),\n/* 1208 */\n/***/ (function(module, exports) {\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n/***/ }),\n/* 1209 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 1210 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = DragSource;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _checkDecoratorArguments = __webpack_require__(207);\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nvar _decorateHandler = __webpack_require__(596);\n\nvar _decorateHandler2 = _interopRequireDefault(_decorateHandler);\n\nvar _registerSource = __webpack_require__(1215);\n\nvar _registerSource2 = _interopRequireDefault(_registerSource);\n\nvar _createSourceFactory = __webpack_require__(1216);\n\nvar _createSourceFactory2 = _interopRequireDefault(_createSourceFactory);\n\nvar _createSourceMonitor = __webpack_require__(1217);\n\nvar _createSourceMonitor2 = _interopRequireDefault(_createSourceMonitor);\n\nvar _createSourceConnector = __webpack_require__(1218);\n\nvar _createSourceConnector2 = _interopRequireDefault(_createSourceConnector);\n\nvar _isValidType = __webpack_require__(599);\n\nvar _isValidType2 = _interopRequireDefault(_isValidType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction DragSource(type, spec, collect) {\n\tvar options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragSource', 'type, spec, collect[, options]'].concat(Array.prototype.slice.call(arguments)));\n\tvar getType = type;\n\tif (typeof type !== 'function') {\n\t\t(0, _invariant2.default)((0, _isValidType2.default)(type), 'Expected \"type\" provided as the first argument to DragSource to be ' + 'a string, or a function that returns a string given the current props. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', type);\n\t\tgetType = function getType() {\n\t\t\treturn type;\n\t\t};\n\t}\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(spec), 'Expected \"spec\" provided as the second argument to DragSource to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', spec);\n\tvar createSource = (0, _createSourceFactory2.default)(spec);\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the third argument to DragSource to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the fourth argument to DragSource to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', collect);\n\n\treturn function decorateSource(DecoratedComponent) {\n\t\treturn (0, _decorateHandler2.default)({\n\t\t\tconnectBackend: function connectBackend(backend, sourceId) {\n\t\t\t\treturn backend.connectDragSource(sourceId);\n\t\t\t},\n\t\t\tcontainerDisplayName: 'DragSource',\n\t\t\tcreateHandler: createSource,\n\t\t\tregisterHandler: _registerSource2.default,\n\t\t\tcreateMonitor: _createSourceMonitor2.default,\n\t\t\tcreateConnector: _createSourceConnector2.default,\n\t\t\tDecoratedComponent: DecoratedComponent,\n\t\t\tgetType: getType,\n\t\t\tcollect: collect,\n\t\t\toptions: options\n\t\t});\n\t};\n}\n\n/***/ }),\n/* 1211 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _isDisposable2 = __webpack_require__(294);\n\nvar _isDisposable3 = _interopRequireDefault(_isDisposable2);\n\nexports.isDisposable = _isDisposable3['default'];\n\nvar _Disposable2 = __webpack_require__(1212);\n\nvar _Disposable3 = _interopRequireDefault(_Disposable2);\n\nexports.Disposable = _Disposable3['default'];\n\nvar _CompositeDisposable2 = __webpack_require__(1213);\n\nvar _CompositeDisposable3 = _interopRequireDefault(_CompositeDisposable2);\n\nexports.CompositeDisposable = _CompositeDisposable3['default'];\n\nvar _SerialDisposable2 = __webpack_require__(1214);\n\nvar _SerialDisposable3 = _interopRequireDefault(_SerialDisposable2);\n\nexports.SerialDisposable = _SerialDisposable3['default'];\n\n/***/ }),\n/* 1212 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar noop = function noop() {};\n\n/**\n * The basic disposable.\n */\n\nvar Disposable = (function () {\n  _createClass(Disposable, null, [{\n    key: \"empty\",\n    value: { dispose: noop },\n    enumerable: true\n  }]);\n\n  function Disposable(action) {\n    _classCallCheck(this, Disposable);\n\n    this.isDisposed = false;\n    this.action = action || noop;\n  }\n\n  Disposable.prototype.dispose = function dispose() {\n    if (!this.isDisposed) {\n      this.action.call(null);\n      this.isDisposed = true;\n    }\n  };\n\n  return Disposable;\n})();\n\nexports[\"default\"] = Disposable;\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 1213 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _isDisposable = __webpack_require__(294);\n\nvar _isDisposable2 = _interopRequireDefault(_isDisposable);\n\n/**\n * Represents a group of disposable resources that are disposed together.\n */\n\nvar CompositeDisposable = (function () {\n  function CompositeDisposable() {\n    for (var _len = arguments.length, disposables = Array(_len), _key = 0; _key < _len; _key++) {\n      disposables[_key] = arguments[_key];\n    }\n\n    _classCallCheck(this, CompositeDisposable);\n\n    if (Array.isArray(disposables[0]) && disposables.length === 1) {\n      disposables = disposables[0];\n    }\n\n    for (var i = 0; i < disposables.length; i++) {\n      if (!_isDisposable2['default'](disposables[i])) {\n        throw new Error('Expected a disposable');\n      }\n    }\n\n    this.disposables = disposables;\n    this.isDisposed = false;\n  }\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Disposable} item Disposable to add.\n   */\n\n  CompositeDisposable.prototype.add = function add(item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Disposable} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n\n  CompositeDisposable.prototype.remove = function remove(item) {\n    if (this.isDisposed) {\n      return false;\n    }\n\n    var index = this.disposables.indexOf(item);\n    if (index === -1) {\n      return false;\n    }\n\n    this.disposables.splice(index, 1);\n    item.dispose();\n    return true;\n  };\n\n  /**\n   * Disposes all disposables in the group and removes them from the group.\n   */\n\n  CompositeDisposable.prototype.dispose = function dispose() {\n    if (this.isDisposed) {\n      return;\n    }\n\n    var len = this.disposables.length;\n    var currentDisposables = new Array(len);\n    for (var i = 0; i < len; i++) {\n      currentDisposables[i] = this.disposables[i];\n    }\n\n    this.isDisposed = true;\n    this.disposables = [];\n    this.length = 0;\n\n    for (var i = 0; i < len; i++) {\n      currentDisposables[i].dispose();\n    }\n  };\n\n  return CompositeDisposable;\n})();\n\nexports['default'] = CompositeDisposable;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1214 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _isDisposable = __webpack_require__(294);\n\nvar _isDisposable2 = _interopRequireDefault(_isDisposable);\n\nvar SerialDisposable = (function () {\n  function SerialDisposable() {\n    _classCallCheck(this, SerialDisposable);\n\n    this.isDisposed = false;\n    this.current = null;\n  }\n\n  /**\n   * Gets the underlying disposable.\n   * @return The underlying disposable.\n   */\n\n  SerialDisposable.prototype.getDisposable = function getDisposable() {\n    return this.current;\n  };\n\n  /**\n   * Sets the underlying disposable.\n   * @param {Disposable} value The new underlying disposable.\n   */\n\n  SerialDisposable.prototype.setDisposable = function setDisposable() {\n    var value = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0];\n\n    if (value != null && !_isDisposable2['default'](value)) {\n      throw new Error('Expected either an empty value or a valid disposable');\n    }\n\n    var isDisposed = this.isDisposed;\n    var previous = undefined;\n\n    if (!isDisposed) {\n      previous = this.current;\n      this.current = value;\n    }\n\n    if (previous) {\n      previous.dispose();\n    }\n\n    if (isDisposed && value) {\n      value.dispose();\n    }\n  };\n\n  /**\n   * Disposes the underlying disposable as well as all future replacements.\n   */\n\n  SerialDisposable.prototype.dispose = function dispose() {\n    if (this.isDisposed) {\n      return;\n    }\n\n    this.isDisposed = true;\n    var previous = this.current;\n    this.current = null;\n\n    if (previous) {\n      previous.dispose();\n    }\n  };\n\n  return SerialDisposable;\n})();\n\nexports['default'] = SerialDisposable;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1215 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = registerSource;\nfunction registerSource(type, source, manager) {\n\tvar registry = manager.getRegistry();\n\tvar sourceId = registry.addSource(type, source);\n\n\tfunction unregisterSource() {\n\t\tregistry.removeSource(sourceId);\n\t}\n\n\treturn {\n\t\thandlerId: sourceId,\n\t\tunregister: unregisterSource\n\t};\n}\n\n/***/ }),\n/* 1216 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createSourceFactory;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ALLOWED_SPEC_METHODS = ['canDrag', 'beginDrag', 'isDragging', 'endDrag'];\nvar REQUIRED_SPEC_METHODS = ['beginDrag'];\n\nfunction createSourceFactory(spec) {\n\tObject.keys(spec).forEach(function (key) {\n\t\t(0, _invariant2.default)(ALLOWED_SPEC_METHODS.indexOf(key) > -1, 'Expected the drag source specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected \"%s\" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', ALLOWED_SPEC_METHODS.join(', '), key);\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', key, key, spec[key]);\n\t});\n\tREQUIRED_SPEC_METHODS.forEach(function (key) {\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', key, key, spec[key]);\n\t});\n\n\tvar Source = function () {\n\t\tfunction Source(monitor) {\n\t\t\t_classCallCheck(this, Source);\n\n\t\t\tthis.monitor = monitor;\n\t\t\tthis.props = null;\n\t\t\tthis.component = null;\n\t\t}\n\n\t\t_createClass(Source, [{\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.props = props;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveComponent',\n\t\t\tvalue: function receiveComponent(component) {\n\t\t\t\tthis.component = component;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrag',\n\t\t\tvalue: function canDrag() {\n\t\t\t\tif (!spec.canDrag) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn spec.canDrag(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'isDragging',\n\t\t\tvalue: function isDragging(globalMonitor, sourceId) {\n\t\t\t\tif (!spec.isDragging) {\n\t\t\t\t\treturn sourceId === globalMonitor.getSourceId();\n\t\t\t\t}\n\n\t\t\t\treturn spec.isDragging(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'beginDrag',\n\t\t\tvalue: function beginDrag() {\n\t\t\t\tvar item = spec.beginDrag(this.props, this.monitor, this.component);\n\t\t\t\tif (false) {\n\t\t\t\t\t(0, _invariant2.default)((0, _isPlainObject2.default)(item), 'beginDrag() must return a plain object that represents the dragged item. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', item);\n\t\t\t\t}\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'endDrag',\n\t\t\tvalue: function endDrag() {\n\t\t\t\tif (!spec.endDrag) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tspec.endDrag(this.props, this.monitor, this.component);\n\t\t\t}\n\t\t}]);\n\n\t\treturn Source;\n\t}();\n\n\treturn function createSource(monitor) {\n\t\treturn new Source(monitor);\n\t};\n}\n\n/***/ }),\n/* 1217 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createSourceMonitor;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar isCallingCanDrag = false;\nvar isCallingIsDragging = false;\n\nvar SourceMonitor = function () {\n\tfunction SourceMonitor(manager) {\n\t\t_classCallCheck(this, SourceMonitor);\n\n\t\tthis.internalMonitor = manager.getMonitor();\n\t}\n\n\t_createClass(SourceMonitor, [{\n\t\tkey: 'receiveHandlerId',\n\t\tvalue: function receiveHandlerId(sourceId) {\n\t\t\tthis.sourceId = sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'canDrag',\n\t\tvalue: function canDrag() {\n\t\t\t(0, _invariant2.default)(!isCallingCanDrag, 'You may not call monitor.canDrag() inside your canDrag() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingCanDrag = true;\n\t\t\t\treturn this.internalMonitor.canDragSource(this.sourceId);\n\t\t\t} finally {\n\t\t\t\tisCallingCanDrag = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'isDragging',\n\t\tvalue: function isDragging() {\n\t\t\t(0, _invariant2.default)(!isCallingIsDragging, 'You may not call monitor.isDragging() inside your isDragging() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingIsDragging = true;\n\t\t\t\treturn this.internalMonitor.isDraggingSource(this.sourceId);\n\t\t\t} finally {\n\t\t\t\tisCallingIsDragging = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.internalMonitor.getItemType();\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.internalMonitor.getItem();\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.internalMonitor.getDropResult();\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.internalMonitor.didDrop();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.internalMonitor.getClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn this.internalMonitor.getDifferenceFromInitialOffset();\n\t\t}\n\t}]);\n\n\treturn SourceMonitor;\n}();\n\nfunction createSourceMonitor(manager) {\n\treturn new SourceMonitor(manager);\n}\n\n/***/ }),\n/* 1218 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = createSourceConnector;\n\nvar _wrapConnectorHooks = __webpack_require__(597);\n\nvar _wrapConnectorHooks2 = _interopRequireDefault(_wrapConnectorHooks);\n\nvar _areOptionsEqual = __webpack_require__(598);\n\nvar _areOptionsEqual2 = _interopRequireDefault(_areOptionsEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createSourceConnector(backend) {\n\tvar currentHandlerId = void 0;\n\n\tvar currentDragSourceNode = void 0;\n\tvar currentDragSourceOptions = void 0;\n\tvar disconnectCurrentDragSource = void 0;\n\n\tvar currentDragPreviewNode = void 0;\n\tvar currentDragPreviewOptions = void 0;\n\tvar disconnectCurrentDragPreview = void 0;\n\n\tfunction reconnectDragSource() {\n\t\tif (disconnectCurrentDragSource) {\n\t\t\tdisconnectCurrentDragSource();\n\t\t\tdisconnectCurrentDragSource = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDragSourceNode) {\n\t\t\tdisconnectCurrentDragSource = backend.connectDragSource(currentHandlerId, currentDragSourceNode, currentDragSourceOptions);\n\t\t}\n\t}\n\n\tfunction reconnectDragPreview() {\n\t\tif (disconnectCurrentDragPreview) {\n\t\t\tdisconnectCurrentDragPreview();\n\t\t\tdisconnectCurrentDragPreview = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDragPreviewNode) {\n\t\t\tdisconnectCurrentDragPreview = backend.connectDragPreview(currentHandlerId, currentDragPreviewNode, currentDragPreviewOptions);\n\t\t}\n\t}\n\n\tfunction receiveHandlerId(handlerId) {\n\t\tif (handlerId === currentHandlerId) {\n\t\t\treturn;\n\t\t}\n\n\t\tcurrentHandlerId = handlerId;\n\t\treconnectDragSource();\n\t\treconnectDragPreview();\n\t}\n\n\tvar hooks = (0, _wrapConnectorHooks2.default)({\n\t\tdragSource: function connectDragSource(node, options) {\n\t\t\tif (node === currentDragSourceNode && (0, _areOptionsEqual2.default)(options, currentDragSourceOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDragSourceNode = node;\n\t\t\tcurrentDragSourceOptions = options;\n\n\t\t\treconnectDragSource();\n\t\t},\n\n\t\tdragPreview: function connectDragPreview(node, options) {\n\t\t\tif (node === currentDragPreviewNode && (0, _areOptionsEqual2.default)(options, currentDragPreviewOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDragPreviewNode = node;\n\t\t\tcurrentDragPreviewOptions = options;\n\n\t\t\treconnectDragPreview();\n\t\t}\n\t});\n\n\treturn {\n\t\treceiveHandlerId: receiveHandlerId,\n\t\thooks: hooks\n\t};\n}\n\n/***/ }),\n/* 1219 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = cloneWithRef;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _react = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction cloneWithRef(element, newRef) {\n\tvar previousRef = element.ref;\n\t(0, _invariant2.default)(typeof previousRef !== 'string', 'Cannot connect React DnD to an element with an existing string ref. ' + 'Please convert it to use a callback ref instead, or wrap it into a <span> or <div>. ' + 'Read more: https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute');\n\n\tif (!previousRef) {\n\t\t// When there is no ref on the element, use the new ref directly\n\t\treturn (0, _react.cloneElement)(element, {\n\t\t\tref: newRef\n\t\t});\n\t}\n\n\treturn (0, _react.cloneElement)(element, {\n\t\tref: function ref(node) {\n\t\t\tnewRef(node);\n\n\t\t\tif (previousRef) {\n\t\t\t\tpreviousRef(node);\n\t\t\t}\n\t\t}\n\t});\n}\n\n/***/ }),\n/* 1220 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n/* 1221 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = DropTarget;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _checkDecoratorArguments = __webpack_require__(207);\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nvar _decorateHandler = __webpack_require__(596);\n\nvar _decorateHandler2 = _interopRequireDefault(_decorateHandler);\n\nvar _registerTarget = __webpack_require__(1222);\n\nvar _registerTarget2 = _interopRequireDefault(_registerTarget);\n\nvar _createTargetFactory = __webpack_require__(1223);\n\nvar _createTargetFactory2 = _interopRequireDefault(_createTargetFactory);\n\nvar _createTargetMonitor = __webpack_require__(1224);\n\nvar _createTargetMonitor2 = _interopRequireDefault(_createTargetMonitor);\n\nvar _createTargetConnector = __webpack_require__(1225);\n\nvar _createTargetConnector2 = _interopRequireDefault(_createTargetConnector);\n\nvar _isValidType = __webpack_require__(599);\n\nvar _isValidType2 = _interopRequireDefault(_isValidType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction DropTarget(type, spec, collect) {\n\tvar options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DropTarget', 'type, spec, collect[, options]'].concat(Array.prototype.slice.call(arguments)));\n\tvar getType = type;\n\tif (typeof type !== 'function') {\n\t\t(0, _invariant2.default)((0, _isValidType2.default)(type, true), 'Expected \"type\" provided as the first argument to DropTarget to be ' + 'a string, an array of strings, or a function that returns either given ' + 'the current props. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', type);\n\t\tgetType = function getType() {\n\t\t\treturn type;\n\t\t};\n\t}\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(spec), 'Expected \"spec\" provided as the second argument to DropTarget to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', spec);\n\tvar createTarget = (0, _createTargetFactory2.default)(spec);\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the third argument to DropTarget to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the fourth argument to DropTarget to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', collect);\n\n\treturn function decorateTarget(DecoratedComponent) {\n\t\treturn (0, _decorateHandler2.default)({\n\t\t\tconnectBackend: function connectBackend(backend, targetId) {\n\t\t\t\treturn backend.connectDropTarget(targetId);\n\t\t\t},\n\t\t\tcontainerDisplayName: 'DropTarget',\n\t\t\tcreateHandler: createTarget,\n\t\t\tregisterHandler: _registerTarget2.default,\n\t\t\tcreateMonitor: _createTargetMonitor2.default,\n\t\t\tcreateConnector: _createTargetConnector2.default,\n\t\t\tDecoratedComponent: DecoratedComponent,\n\t\t\tgetType: getType,\n\t\t\tcollect: collect,\n\t\t\toptions: options\n\t\t});\n\t};\n}\n\n/***/ }),\n/* 1222 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = registerTarget;\nfunction registerTarget(type, target, manager) {\n\tvar registry = manager.getRegistry();\n\tvar targetId = registry.addTarget(type, target);\n\n\tfunction unregisterTarget() {\n\t\tregistry.removeTarget(targetId);\n\t}\n\n\treturn {\n\t\thandlerId: targetId,\n\t\tunregister: unregisterTarget\n\t};\n}\n\n/***/ }),\n/* 1223 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createTargetFactory;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = __webpack_require__(126);\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ALLOWED_SPEC_METHODS = ['canDrop', 'hover', 'drop'];\n\nfunction createTargetFactory(spec) {\n\tObject.keys(spec).forEach(function (key) {\n\t\t(0, _invariant2.default)(ALLOWED_SPEC_METHODS.indexOf(key) > -1, 'Expected the drop target specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected \"%s\" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', ALLOWED_SPEC_METHODS.join(', '), key);\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drop target specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', key, key, spec[key]);\n\t});\n\n\tvar Target = function () {\n\t\tfunction Target(monitor) {\n\t\t\t_classCallCheck(this, Target);\n\n\t\t\tthis.monitor = monitor;\n\t\t\tthis.props = null;\n\t\t\tthis.component = null;\n\t\t}\n\n\t\t_createClass(Target, [{\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.props = props;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveMonitor',\n\t\t\tvalue: function receiveMonitor(monitor) {\n\t\t\t\tthis.monitor = monitor;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveComponent',\n\t\t\tvalue: function receiveComponent(component) {\n\t\t\t\tthis.component = component;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrop',\n\t\t\tvalue: function canDrop() {\n\t\t\t\tif (!spec.canDrop) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn spec.canDrop(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'hover',\n\t\t\tvalue: function hover() {\n\t\t\t\tif (!spec.hover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tspec.hover(this.props, this.monitor, this.component);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'drop',\n\t\t\tvalue: function drop() {\n\t\t\t\tif (!spec.drop) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tvar dropResult = spec.drop(this.props, this.monitor, this.component);\n\t\t\t\tif (false) {\n\t\t\t\t\t(0, _invariant2.default)(typeof dropResult === 'undefined' || (0, _isPlainObject2.default)(dropResult), 'drop() must either return undefined, or an object that represents the drop result. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', dropResult);\n\t\t\t\t}\n\t\t\t\treturn dropResult;\n\t\t\t}\n\t\t}]);\n\n\t\treturn Target;\n\t}();\n\n\treturn function createTarget(monitor) {\n\t\treturn new Target(monitor);\n\t};\n}\n\n/***/ }),\n/* 1224 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createTargetMonitor;\n\nvar _invariant = __webpack_require__(26);\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar isCallingCanDrop = false;\n\nvar TargetMonitor = function () {\n\tfunction TargetMonitor(manager) {\n\t\t_classCallCheck(this, TargetMonitor);\n\n\t\tthis.internalMonitor = manager.getMonitor();\n\t}\n\n\t_createClass(TargetMonitor, [{\n\t\tkey: 'receiveHandlerId',\n\t\tvalue: function receiveHandlerId(targetId) {\n\t\t\tthis.targetId = targetId;\n\t\t}\n\t}, {\n\t\tkey: 'canDrop',\n\t\tvalue: function canDrop() {\n\t\t\t(0, _invariant2.default)(!isCallingCanDrop, 'You may not call monitor.canDrop() inside your canDrop() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingCanDrop = true;\n\t\t\t\treturn this.internalMonitor.canDropOnTarget(this.targetId);\n\t\t\t} finally {\n\t\t\t\tisCallingCanDrop = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'isOver',\n\t\tvalue: function isOver(options) {\n\t\t\treturn this.internalMonitor.isOverTarget(this.targetId, options);\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.internalMonitor.getItemType();\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.internalMonitor.getItem();\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.internalMonitor.getDropResult();\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.internalMonitor.didDrop();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.internalMonitor.getClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn this.internalMonitor.getDifferenceFromInitialOffset();\n\t\t}\n\t}]);\n\n\treturn TargetMonitor;\n}();\n\nfunction createTargetMonitor(manager) {\n\treturn new TargetMonitor(manager);\n}\n\n/***/ }),\n/* 1225 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = createTargetConnector;\n\nvar _wrapConnectorHooks = __webpack_require__(597);\n\nvar _wrapConnectorHooks2 = _interopRequireDefault(_wrapConnectorHooks);\n\nvar _areOptionsEqual = __webpack_require__(598);\n\nvar _areOptionsEqual2 = _interopRequireDefault(_areOptionsEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createTargetConnector(backend) {\n\tvar currentHandlerId = void 0;\n\n\tvar currentDropTargetNode = void 0;\n\tvar currentDropTargetOptions = void 0;\n\tvar disconnectCurrentDropTarget = void 0;\n\n\tfunction reconnectDropTarget() {\n\t\tif (disconnectCurrentDropTarget) {\n\t\t\tdisconnectCurrentDropTarget();\n\t\t\tdisconnectCurrentDropTarget = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDropTargetNode) {\n\t\t\tdisconnectCurrentDropTarget = backend.connectDropTarget(currentHandlerId, currentDropTargetNode, currentDropTargetOptions);\n\t\t}\n\t}\n\n\tfunction receiveHandlerId(handlerId) {\n\t\tif (handlerId === currentHandlerId) {\n\t\t\treturn;\n\t\t}\n\n\t\tcurrentHandlerId = handlerId;\n\t\treconnectDropTarget();\n\t}\n\n\tvar hooks = (0, _wrapConnectorHooks2.default)({\n\t\tdropTarget: function connectDropTarget(node, options) {\n\t\t\tif (node === currentDropTargetNode && (0, _areOptionsEqual2.default)(options, currentDropTargetOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDropTargetNode = node;\n\t\t\tcurrentDropTargetOptions = options;\n\n\t\t\treconnectDropTarget();\n\t\t}\n\t});\n\n\treturn {\n\t\treceiveHandlerId: receiveHandlerId,\n\t\thooks: hooks\n\t};\n}\n\n/***/ }),\n/* 1226 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getEmptyImage = exports.NativeTypes = undefined;\nexports.default = createHTML5Backend;\n\nvar _HTML5Backend = __webpack_require__(1227);\n\nvar _HTML5Backend2 = _interopRequireDefault(_HTML5Backend);\n\nvar _getEmptyImage = __webpack_require__(1298);\n\nvar _getEmptyImage2 = _interopRequireDefault(_getEmptyImage);\n\nvar _NativeTypes = __webpack_require__(300);\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.NativeTypes = NativeTypes;\nexports.getEmptyImage = _getEmptyImage2.default;\nfunction createHTML5Backend(manager) {\n\treturn new _HTML5Backend2.default(manager);\n}\n\n/***/ }),\n/* 1227 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* eslint-disable no-underscore-dangle */\n\n\nvar _defaults = __webpack_require__(1228);\n\nvar _defaults2 = _interopRequireDefault(_defaults);\n\nvar _shallowEqual = __webpack_require__(1256);\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _EnterLeaveCounter = __webpack_require__(1257);\n\nvar _EnterLeaveCounter2 = _interopRequireDefault(_EnterLeaveCounter);\n\nvar _BrowserDetector = __webpack_require__(615);\n\nvar _OffsetUtils = __webpack_require__(1295);\n\nvar _NativeDragSources = __webpack_require__(1297);\n\nvar _NativeTypes = __webpack_require__(300);\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HTML5Backend = function () {\n\tfunction HTML5Backend(manager) {\n\t\t_classCallCheck(this, HTML5Backend);\n\n\t\tthis.actions = manager.getActions();\n\t\tthis.monitor = manager.getMonitor();\n\t\tthis.registry = manager.getRegistry();\n\t\tthis.context = manager.getContext();\n\n\t\tthis.sourcePreviewNodes = {};\n\t\tthis.sourcePreviewNodeOptions = {};\n\t\tthis.sourceNodes = {};\n\t\tthis.sourceNodeOptions = {};\n\t\tthis.enterLeaveCounter = new _EnterLeaveCounter2.default();\n\n\t\tthis.dragStartSourceIds = [];\n\t\tthis.dropTargetIds = [];\n\t\tthis.dragEnterTargetIds = [];\n\t\tthis.currentNativeSource = null;\n\t\tthis.currentNativeHandle = null;\n\t\tthis.currentDragSourceNode = null;\n\t\tthis.currentDragSourceNodeOffset = null;\n\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\t\tthis.altKeyPressed = false;\n\t\tthis.mouseMoveTimeoutTimer = null;\n\n\t\tthis.getSourceClientOffset = this.getSourceClientOffset.bind(this);\n\t\tthis.handleTopDragStart = this.handleTopDragStart.bind(this);\n\t\tthis.handleTopDragStartCapture = this.handleTopDragStartCapture.bind(this);\n\t\tthis.handleTopDragEndCapture = this.handleTopDragEndCapture.bind(this);\n\t\tthis.handleTopDragEnter = this.handleTopDragEnter.bind(this);\n\t\tthis.handleTopDragEnterCapture = this.handleTopDragEnterCapture.bind(this);\n\t\tthis.handleTopDragLeaveCapture = this.handleTopDragLeaveCapture.bind(this);\n\t\tthis.handleTopDragOver = this.handleTopDragOver.bind(this);\n\t\tthis.handleTopDragOverCapture = this.handleTopDragOverCapture.bind(this);\n\t\tthis.handleTopDrop = this.handleTopDrop.bind(this);\n\t\tthis.handleTopDropCapture = this.handleTopDropCapture.bind(this);\n\t\tthis.handleSelectStart = this.handleSelectStart.bind(this);\n\t\tthis.endDragIfSourceWasRemovedFromDOM = this.endDragIfSourceWasRemovedFromDOM.bind(this);\n\t\tthis.endDragNativeItem = this.endDragNativeItem.bind(this);\n\t\tthis.asyncEndDragNativeItem = this.asyncEndDragNativeItem.bind(this);\n\t\tthis.isNodeInDocument = this.isNodeInDocument.bind(this);\n\t}\n\n\t_createClass(HTML5Backend, [{\n\t\tkey: 'setup',\n\t\tvalue: function setup() {\n\t\t\tif (this.window === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.window.__isReactDndBackendSetUp) {\n\t\t\t\tthrow new Error('Cannot have two HTML5 backends at the same time.');\n\t\t\t}\n\t\t\tthis.window.__isReactDndBackendSetUp = true;\n\t\t\tthis.addEventListeners(this.window);\n\t\t}\n\t}, {\n\t\tkey: 'teardown',\n\t\tvalue: function teardown() {\n\t\t\tif (this.window === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.window.__isReactDndBackendSetUp = false;\n\t\t\tthis.removeEventListeners(this.window);\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tif (this.asyncEndDragFrameId) {\n\t\t\t\tthis.window.cancelAnimationFrame(this.asyncEndDragFrameId);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'addEventListeners',\n\t\tvalue: function addEventListeners(target) {\n\t\t\t// SSR Fix (https://github.com/react-dnd/react-dnd/pull/813\n\t\t\tif (!target.addEventListener) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget.addEventListener('dragstart', this.handleTopDragStart);\n\t\t\ttarget.addEventListener('dragstart', this.handleTopDragStartCapture, true);\n\t\t\ttarget.addEventListener('dragend', this.handleTopDragEndCapture, true);\n\t\t\ttarget.addEventListener('dragenter', this.handleTopDragEnter);\n\t\t\ttarget.addEventListener('dragenter', this.handleTopDragEnterCapture, true);\n\t\t\ttarget.addEventListener('dragleave', this.handleTopDragLeaveCapture, true);\n\t\t\ttarget.addEventListener('dragover', this.handleTopDragOver);\n\t\t\ttarget.addEventListener('dragover', this.handleTopDragOverCapture, true);\n\t\t\ttarget.addEventListener('drop', this.handleTopDrop);\n\t\t\ttarget.addEventListener('drop', this.handleTopDropCapture, true);\n\t\t}\n\t}, {\n\t\tkey: 'removeEventListeners',\n\t\tvalue: function removeEventListeners(target) {\n\t\t\t// SSR Fix (https://github.com/react-dnd/react-dnd/pull/813\n\t\t\tif (!target.removeEventListener) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget.removeEventListener('dragstart', this.handleTopDragStart);\n\t\t\ttarget.removeEventListener('dragstart', this.handleTopDragStartCapture, true);\n\t\t\ttarget.removeEventListener('dragend', this.handleTopDragEndCapture, true);\n\t\t\ttarget.removeEventListener('dragenter', this.handleTopDragEnter);\n\t\t\ttarget.removeEventListener('dragenter', this.handleTopDragEnterCapture, true);\n\t\t\ttarget.removeEventListener('dragleave', this.handleTopDragLeaveCapture, true);\n\t\t\ttarget.removeEventListener('dragover', this.handleTopDragOver);\n\t\t\ttarget.removeEventListener('dragover', this.handleTopDragOverCapture, true);\n\t\t\ttarget.removeEventListener('drop', this.handleTopDrop);\n\t\t\ttarget.removeEventListener('drop', this.handleTopDropCapture, true);\n\t\t}\n\t}, {\n\t\tkey: 'connectDragPreview',\n\t\tvalue: function connectDragPreview(sourceId, node, options) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.sourcePreviewNodeOptions[sourceId] = options;\n\t\t\tthis.sourcePreviewNodes[sourceId] = node;\n\n\t\t\treturn function () {\n\t\t\t\tdelete _this.sourcePreviewNodes[sourceId];\n\t\t\t\tdelete _this.sourcePreviewNodeOptions[sourceId];\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'connectDragSource',\n\t\tvalue: function connectDragSource(sourceId, node, options) {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.sourceNodes[sourceId] = node;\n\t\t\tthis.sourceNodeOptions[sourceId] = options;\n\n\t\t\tvar handleDragStart = function handleDragStart(e) {\n\t\t\t\treturn _this2.handleDragStart(e, sourceId);\n\t\t\t};\n\t\t\tvar handleSelectStart = function handleSelectStart(e) {\n\t\t\t\treturn _this2.handleSelectStart(e, sourceId);\n\t\t\t};\n\n\t\t\tnode.setAttribute('draggable', true);\n\t\t\tnode.addEventListener('dragstart', handleDragStart);\n\t\t\tnode.addEventListener('selectstart', handleSelectStart);\n\n\t\t\treturn function () {\n\t\t\t\tdelete _this2.sourceNodes[sourceId];\n\t\t\t\tdelete _this2.sourceNodeOptions[sourceId];\n\n\t\t\t\tnode.removeEventListener('dragstart', handleDragStart);\n\t\t\t\tnode.removeEventListener('selectstart', handleSelectStart);\n\t\t\t\tnode.setAttribute('draggable', false);\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'connectDropTarget',\n\t\tvalue: function connectDropTarget(targetId, node) {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar handleDragEnter = function handleDragEnter(e) {\n\t\t\t\treturn _this3.handleDragEnter(e, targetId);\n\t\t\t};\n\t\t\tvar handleDragOver = function handleDragOver(e) {\n\t\t\t\treturn _this3.handleDragOver(e, targetId);\n\t\t\t};\n\t\t\tvar handleDrop = function handleDrop(e) {\n\t\t\t\treturn _this3.handleDrop(e, targetId);\n\t\t\t};\n\n\t\t\tnode.addEventListener('dragenter', handleDragEnter);\n\t\t\tnode.addEventListener('dragover', handleDragOver);\n\t\t\tnode.addEventListener('drop', handleDrop);\n\n\t\t\treturn function () {\n\t\t\t\tnode.removeEventListener('dragenter', handleDragEnter);\n\t\t\t\tnode.removeEventListener('dragover', handleDragOver);\n\t\t\t\tnode.removeEventListener('drop', handleDrop);\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentSourceNodeOptions',\n\t\tvalue: function getCurrentSourceNodeOptions() {\n\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\tvar sourceNodeOptions = this.sourceNodeOptions[sourceId];\n\n\t\t\treturn (0, _defaults2.default)(sourceNodeOptions || {}, {\n\t\t\t\tdropEffect: this.altKeyPressed ? 'copy' : 'move'\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentDropEffect',\n\t\tvalue: function getCurrentDropEffect() {\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\t// It makes more sense to default to 'copy' for native resources\n\t\t\t\treturn 'copy';\n\t\t\t}\n\n\t\t\treturn this.getCurrentSourceNodeOptions().dropEffect;\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentSourcePreviewNodeOptions',\n\t\tvalue: function getCurrentSourcePreviewNodeOptions() {\n\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\tvar sourcePreviewNodeOptions = this.sourcePreviewNodeOptions[sourceId];\n\n\t\t\treturn (0, _defaults2.default)(sourcePreviewNodeOptions || {}, {\n\t\t\t\tanchorX: 0.5,\n\t\t\t\tanchorY: 0.5,\n\t\t\t\tcaptureDraggingState: false\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset(sourceId) {\n\t\t\treturn (0, _OffsetUtils.getNodeClientOffset)(this.sourceNodes[sourceId]);\n\t\t}\n\t}, {\n\t\tkey: 'isDraggingNativeItem',\n\t\tvalue: function isDraggingNativeItem() {\n\t\t\tvar itemType = this.monitor.getItemType();\n\t\t\treturn Object.keys(NativeTypes).some(function (key) {\n\t\t\t\treturn NativeTypes[key] === itemType;\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'beginDragNativeItem',\n\t\tvalue: function beginDragNativeItem(type) {\n\t\t\tthis.clearCurrentDragSourceNode();\n\n\t\t\tvar SourceType = (0, _NativeDragSources.createNativeDragSource)(type);\n\t\t\tthis.currentNativeSource = new SourceType();\n\t\t\tthis.currentNativeHandle = this.registry.addSource(type, this.currentNativeSource);\n\t\t\tthis.actions.beginDrag([this.currentNativeHandle]);\n\t\t}\n\t}, {\n\t\tkey: 'asyncEndDragNativeItem',\n\t\tvalue: function asyncEndDragNativeItem() {\n\t\t\tthis.asyncEndDragFrameId = this.window.requestAnimationFrame(this.endDragNativeItem);\n\t\t}\n\t}, {\n\t\tkey: 'endDragNativeItem',\n\t\tvalue: function endDragNativeItem() {\n\t\t\tif (!this.isDraggingNativeItem()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.actions.endDrag();\n\t\t\tthis.registry.removeSource(this.currentNativeHandle);\n\t\t\tthis.currentNativeHandle = null;\n\t\t\tthis.currentNativeSource = null;\n\t\t}\n\t}, {\n\t\tkey: 'isNodeInDocument',\n\t\tvalue: function isNodeInDocument(node) {\n\t\t\t// Check the node either in the main document or in the current context\n\t\t\treturn document.body.contains(node) || this.window ? this.window.document.body.contains(node) : false;\n\t\t}\n\t}, {\n\t\tkey: 'endDragIfSourceWasRemovedFromDOM',\n\t\tvalue: function endDragIfSourceWasRemovedFromDOM() {\n\t\t\tvar node = this.currentDragSourceNode;\n\t\t\tif (this.isNodeInDocument(node)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.clearCurrentDragSourceNode()) {\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'setCurrentDragSourceNode',\n\t\tvalue: function setCurrentDragSourceNode(node) {\n\t\t\tvar _this4 = this;\n\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tthis.currentDragSourceNode = node;\n\t\t\tthis.currentDragSourceNodeOffset = (0, _OffsetUtils.getNodeClientOffset)(node);\n\t\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\n\t\t\t// A timeout of > 0 is necessary to resolve Firefox issue referenced\n\t\t\t// See:\n\t\t\t//   * https://github.com/react-dnd/react-dnd/pull/928\n\t\t\t//   * https://github.com/react-dnd/react-dnd/issues/869\n\t\t\tvar MOUSE_MOVE_TIMEOUT = 1000;\n\n\t\t\t// Receiving a mouse event in the middle of a dragging operation\n\t\t\t// means it has ended and the drag source node disappeared from DOM,\n\t\t\t// so the browser didn't dispatch the dragend event.\n\t\t\t//\n\t\t\t// We need to wait before we start listening for mousemove events.\n\t\t\t// This is needed because the drag preview needs to be drawn or else it fires an 'mousemove' event\n\t\t\t// immediately in some browsers.\n\t\t\t//\n\t\t\t// See:\n\t\t\t//   * https://github.com/react-dnd/react-dnd/pull/928\n\t\t\t//   * https://github.com/react-dnd/react-dnd/issues/869\n\t\t\t//\n\t\t\tthis.mouseMoveTimeoutTimer = setTimeout(function () {\n\t\t\t\t_this4.mouseMoveTimeoutId = null;\n\t\t\t\treturn _this4.window.addEventListener('mousemove', _this4.endDragIfSourceWasRemovedFromDOM, true);\n\t\t\t}, MOUSE_MOVE_TIMEOUT);\n\t\t}\n\t}, {\n\t\tkey: 'clearCurrentDragSourceNode',\n\t\tvalue: function clearCurrentDragSourceNode() {\n\t\t\tif (this.currentDragSourceNode) {\n\t\t\t\tthis.currentDragSourceNode = null;\n\t\t\t\tthis.currentDragSourceNodeOffset = null;\n\t\t\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\t\t\t\tthis.window.clearTimeout(this.mouseMoveTimeoutTimer);\n\t\t\t\tthis.window.removeEventListener('mousemove', this.endDragIfSourceWasRemovedFromDOM, true);\n\t\t\t\tthis.mouseMoveTimeoutTimer = null;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}, {\n\t\tkey: 'checkIfCurrentDragSourceRectChanged',\n\t\tvalue: function checkIfCurrentDragSourceRectChanged() {\n\t\t\tvar node = this.currentDragSourceNode;\n\t\t\tif (!node) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.currentDragSourceNodeOffsetChanged) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.currentDragSourceNodeOffsetChanged = !(0, _shallowEqual2.default)((0, _OffsetUtils.getNodeClientOffset)(node), this.currentDragSourceNodeOffset);\n\n\t\t\treturn this.currentDragSourceNodeOffsetChanged;\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragStartCapture',\n\t\tvalue: function handleTopDragStartCapture() {\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tthis.dragStartSourceIds = [];\n\t\t}\n\t}, {\n\t\tkey: 'handleDragStart',\n\t\tvalue: function handleDragStart(e, sourceId) {\n\t\t\tthis.dragStartSourceIds.unshift(sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragStart',\n\t\tvalue: function handleTopDragStart(e) {\n\t\t\tvar _this5 = this;\n\n\t\t\tvar dragStartSourceIds = this.dragStartSourceIds;\n\n\t\t\tthis.dragStartSourceIds = null;\n\n\t\t\tvar clientOffset = (0, _OffsetUtils.getEventClientOffset)(e);\n\n\t\t\t// Avoid crashing if we missed a drop event or our previous drag died\n\t\t\tif (this.monitor.isDragging()) {\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\n\t\t\t// Don't publish the source just yet (see why below)\n\t\t\tthis.actions.beginDrag(dragStartSourceIds, {\n\t\t\t\tpublishSource: false,\n\t\t\t\tgetSourceClientOffset: this.getSourceClientOffset,\n\t\t\t\tclientOffset: clientOffset\n\t\t\t});\n\n\t\t\tvar dataTransfer = e.dataTransfer;\n\n\t\t\tvar nativeType = (0, _NativeDragSources.matchNativeItemType)(dataTransfer);\n\n\t\t\tif (this.monitor.isDragging()) {\n\t\t\t\tif (typeof dataTransfer.setDragImage === 'function') {\n\t\t\t\t\t// Use custom drag image if user specifies it.\n\t\t\t\t\t// If child drag source refuses drag but parent agrees,\n\t\t\t\t\t// use parent's node as drag image. Neither works in IE though.\n\t\t\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\t\t\tvar sourceNode = this.sourceNodes[sourceId];\n\t\t\t\t\tvar dragPreview = this.sourcePreviewNodes[sourceId] || sourceNode;\n\n\t\t\t\t\tvar _getCurrentSourcePrev = this.getCurrentSourcePreviewNodeOptions(),\n\t\t\t\t\t    anchorX = _getCurrentSourcePrev.anchorX,\n\t\t\t\t\t    anchorY = _getCurrentSourcePrev.anchorY,\n\t\t\t\t\t    offsetX = _getCurrentSourcePrev.offsetX,\n\t\t\t\t\t    offsetY = _getCurrentSourcePrev.offsetY;\n\n\t\t\t\t\tvar anchorPoint = { anchorX: anchorX, anchorY: anchorY };\n\t\t\t\t\tvar offsetPoint = { offsetX: offsetX, offsetY: offsetY };\n\t\t\t\t\tvar dragPreviewOffset = (0, _OffsetUtils.getDragPreviewOffset)(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint);\n\n\t\t\t\t\tdataTransfer.setDragImage(dragPreview, dragPreviewOffset.x, dragPreviewOffset.y);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\t// Firefox won't drag without setting data\n\t\t\t\t\tdataTransfer.setData('application/json', {});\n\t\t\t\t} catch (err) {}\n\t\t\t\t// IE doesn't support MIME types in setData\n\n\n\t\t\t\t// Store drag source node so we can check whether\n\t\t\t\t// it is removed from DOM and trigger endDrag manually.\n\t\t\t\tthis.setCurrentDragSourceNode(e.target);\n\n\t\t\t\t// Now we are ready to publish the drag source.. or are we not?\n\n\t\t\t\tvar _getCurrentSourcePrev2 = this.getCurrentSourcePreviewNodeOptions(),\n\t\t\t\t    captureDraggingState = _getCurrentSourcePrev2.captureDraggingState;\n\n\t\t\t\tif (!captureDraggingState) {\n\t\t\t\t\t// Usually we want to publish it in the next tick so that browser\n\t\t\t\t\t// is able to screenshot the current (not yet dragging) state.\n\t\t\t\t\t//\n\t\t\t\t\t// It also neatly avoids a situation where render() returns null\n\t\t\t\t\t// in the same tick for the source element, and browser freaks out.\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\treturn _this5.actions.publishDragSource();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// In some cases the user may want to override this behavior, e.g.\n\t\t\t\t\t// to work around IE not supporting custom drag previews.\n\t\t\t\t\t//\n\t\t\t\t\t// When using a custom drag layer, the only way to prevent\n\t\t\t\t\t// the default drag preview from drawing in IE is to screenshot\n\t\t\t\t\t// the dragging state in which the node itself has zero opacity\n\t\t\t\t\t// and height. In this case, though, returning null from render()\n\t\t\t\t\t// will abruptly end the dragging, which is not obvious.\n\t\t\t\t\t//\n\t\t\t\t\t// This is the reason such behavior is strictly opt-in.\n\t\t\t\t\tthis.actions.publishDragSource();\n\t\t\t\t}\n\t\t\t} else if (nativeType) {\n\t\t\t\t// A native item (such as URL) dragged from inside the document\n\t\t\t\tthis.beginDragNativeItem(nativeType);\n\t\t\t} else if (!dataTransfer.types && (!e.target.hasAttribute || !e.target.hasAttribute('draggable'))) {\n\t\t\t\t// Looks like a Safari bug: dataTransfer.types is null, but there was no draggable.\n\t\t\t\t// Just let it drag. It's a native type (URL or text) and will be picked up in\n\t\t\t\t// dragenter handler.\n\t\t\t\treturn; // eslint-disable-line no-useless-return\n\t\t\t} else {\n\t\t\t\t// If by this time no drag source reacted, tell browser not to drag.\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEndCapture',\n\t\tvalue: function handleTopDragEndCapture() {\n\t\t\tif (this.clearCurrentDragSourceNode()) {\n\t\t\t\t// Firefox can dispatch this event in an infinite loop\n\t\t\t\t// if dragend handler does something like showing an alert.\n\t\t\t\t// Only proceed if we have not handled it already.\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEnterCapture',\n\t\tvalue: function handleTopDragEnterCapture(e) {\n\t\t\tthis.dragEnterTargetIds = [];\n\n\t\t\tvar isFirstEnter = this.enterLeaveCounter.enter(e.target);\n\t\t\tif (!isFirstEnter || this.monitor.isDragging()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar dataTransfer = e.dataTransfer;\n\n\t\t\tvar nativeType = (0, _NativeDragSources.matchNativeItemType)(dataTransfer);\n\n\t\t\tif (nativeType) {\n\t\t\t\t// A native item (such as file or URL) dragged from outside the document\n\t\t\t\tthis.beginDragNativeItem(nativeType);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleDragEnter',\n\t\tvalue: function handleDragEnter(e, targetId) {\n\t\t\tthis.dragEnterTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEnter',\n\t\tvalue: function handleTopDragEnter(e) {\n\t\t\tvar _this6 = this;\n\n\t\t\tvar dragEnterTargetIds = this.dragEnterTargetIds;\n\n\t\t\tthis.dragEnterTargetIds = [];\n\n\t\t\tif (!this.monitor.isDragging()) {\n\t\t\t\t// This is probably a native item type we don't understand.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.altKeyPressed = e.altKey;\n\n\t\t\tif (!(0, _BrowserDetector.isFirefox)()) {\n\t\t\t\t// Don't emit hover in `dragenter` on Firefox due to an edge case.\n\t\t\t\t// If the target changes position as the result of `dragenter`, Firefox\n\t\t\t\t// will still happily dispatch `dragover` despite target being no longer\n\t\t\t\t// there. The easy solution is to only fire `hover` in `dragover` on FF.\n\t\t\t\tthis.actions.hover(dragEnterTargetIds, {\n\t\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar canDrop = dragEnterTargetIds.some(function (targetId) {\n\t\t\t\treturn _this6.monitor.canDropOnTarget(targetId);\n\t\t\t});\n\n\t\t\tif (canDrop) {\n\t\t\t\t// IE requires this to fire dragover events\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = this.getCurrentDropEffect();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragOverCapture',\n\t\tvalue: function handleTopDragOverCapture() {\n\t\t\tthis.dragOverTargetIds = [];\n\t\t}\n\t}, {\n\t\tkey: 'handleDragOver',\n\t\tvalue: function handleDragOver(e, targetId) {\n\t\t\tthis.dragOverTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragOver',\n\t\tvalue: function handleTopDragOver(e) {\n\t\t\tvar _this7 = this;\n\n\t\t\tvar dragOverTargetIds = this.dragOverTargetIds;\n\n\t\t\tthis.dragOverTargetIds = [];\n\n\t\t\tif (!this.monitor.isDragging()) {\n\t\t\t\t// This is probably a native item type we don't understand.\n\t\t\t\t// Prevent default \"drop and blow away the whole document\" action.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'none';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.altKeyPressed = e.altKey;\n\n\t\t\tthis.actions.hover(dragOverTargetIds, {\n\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t});\n\n\t\t\tvar canDrop = dragOverTargetIds.some(function (targetId) {\n\t\t\t\treturn _this7.monitor.canDropOnTarget(targetId);\n\t\t\t});\n\n\t\t\tif (canDrop) {\n\t\t\t\t// Show user-specified drop effect.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = this.getCurrentDropEffect();\n\t\t\t} else if (this.isDraggingNativeItem()) {\n\t\t\t\t// Don't show a nice cursor but still prevent default\n\t\t\t\t// \"drop and blow away the whole document\" action.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'none';\n\t\t\t} else if (this.checkIfCurrentDragSourceRectChanged()) {\n\t\t\t\t// Prevent animating to incorrect position.\n\t\t\t\t// Drop effect must be other than 'none' to prevent animation.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragLeaveCapture',\n\t\tvalue: function handleTopDragLeaveCapture(e) {\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tvar isLastLeave = this.enterLeaveCounter.leave(e.target);\n\t\t\tif (!isLastLeave) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.endDragNativeItem();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDropCapture',\n\t\tvalue: function handleTopDropCapture(e) {\n\t\t\tthis.dropTargetIds = [];\n\t\t\te.preventDefault();\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.currentNativeSource.mutateItemByReadingDataTransfer(e.dataTransfer);\n\t\t\t}\n\n\t\t\tthis.enterLeaveCounter.reset();\n\t\t}\n\t}, {\n\t\tkey: 'handleDrop',\n\t\tvalue: function handleDrop(e, targetId) {\n\t\t\tthis.dropTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDrop',\n\t\tvalue: function handleTopDrop(e) {\n\t\t\tvar dropTargetIds = this.dropTargetIds;\n\n\t\t\tthis.dropTargetIds = [];\n\n\t\t\tthis.actions.hover(dropTargetIds, {\n\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t});\n\t\t\tthis.actions.drop({ dropEffect: this.getCurrentDropEffect() });\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.endDragNativeItem();\n\t\t\t} else {\n\t\t\t\tthis.endDragIfSourceWasRemovedFromDOM();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleSelectStart',\n\t\tvalue: function handleSelectStart(e) {\n\t\t\tvar target = e.target;\n\n\t\t\t// Only IE requires us to explicitly say\n\t\t\t// we want drag drop operation to start\n\n\t\t\tif (typeof target.dragDrop !== 'function') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Inputs and textareas should be selectable\n\t\t\tif (target.tagName === 'INPUT' || target.tagName === 'SELECT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For other targets, ask IE\n\t\t\t// to enable drag and drop\n\t\t\te.preventDefault();\n\t\t\ttarget.dragDrop();\n\t\t}\n\t}, {\n\t\tkey: 'window',\n\t\tget: function get() {\n\t\t\tif (this.context && this.context.window) {\n\t\t\t\treturn this.context.window;\n\t\t\t} else if (typeof window !== 'undefined') {\n\t\t\t\treturn window;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t}]);\n\n\treturn HTML5Backend;\n}();\n\nexports.default = HTML5Backend;\n\n/***/ }),\n/* 1228 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseRest = __webpack_require__(295),\n    eq = __webpack_require__(298),\n    isIterateeCall = __webpack_require__(1243),\n    keysIn = __webpack_require__(1244);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n  object = Object(object);\n\n  var index = -1;\n  var length = sources.length;\n  var guard = length > 2 ? sources[2] : undefined;\n\n  if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n    length = 1;\n  }\n\n  while (++index < length) {\n    var source = sources[index];\n    var props = keysIn(source);\n    var propsIndex = -1;\n    var propsLength = props.length;\n\n    while (++propsIndex < propsLength) {\n      var key = props[propsIndex];\n      var value = object[key];\n\n      if (value === undefined ||\n          (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        object[key] = source[key];\n      }\n    }\n  }\n\n  return object;\n});\n\nmodule.exports = defaults;\n\n\n/***/ }),\n/* 1229 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar apply = __webpack_require__(1230);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n/***/ }),\n/* 1230 */\n/***/ (function(module, exports) {\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n/***/ }),\n/* 1231 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseSetToString = __webpack_require__(1232),\n    shortOut = __webpack_require__(1242);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n/***/ }),\n/* 1232 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar constant = __webpack_require__(1233),\n    defineProperty = __webpack_require__(1234),\n    identity = __webpack_require__(600);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n/***/ }),\n/* 1233 */\n/***/ (function(module, exports) {\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n/***/ }),\n/* 1234 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(208);\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n/***/ }),\n/* 1235 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isFunction = __webpack_require__(601),\n    isMasked = __webpack_require__(1238),\n    isObject = __webpack_require__(209),\n    toSource = __webpack_require__(1240);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n/***/ }),\n/* 1236 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(297);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 1237 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n/* 1238 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar coreJsData = __webpack_require__(1239);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n/***/ }),\n/* 1239 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(159);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n/***/ }),\n/* 1240 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n/***/ }),\n/* 1241 */\n/***/ (function(module, exports) {\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n/***/ }),\n/* 1242 */\n/***/ (function(module, exports) {\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n/***/ }),\n/* 1243 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar eq = __webpack_require__(298),\n    isArrayLike = __webpack_require__(299),\n    isIndex = __webpack_require__(604),\n    isObject = __webpack_require__(209);\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n\n\n/***/ }),\n/* 1244 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayLikeKeys = __webpack_require__(1245),\n    baseKeysIn = __webpack_require__(1253),\n    isArrayLike = __webpack_require__(299);\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n\n\n/***/ }),\n/* 1245 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseTimes = __webpack_require__(1246),\n    isArguments = __webpack_require__(605),\n    isArray = __webpack_require__(606),\n    isBuffer = __webpack_require__(1248),\n    isIndex = __webpack_require__(604),\n    isTypedArray = __webpack_require__(1250);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n\n\n/***/ }),\n/* 1246 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n\n\n/***/ }),\n/* 1247 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(296),\n    isObjectLike = __webpack_require__(210);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n/***/ }),\n/* 1248 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(159),\n    stubFalse = __webpack_require__(1249);\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module)))\n\n/***/ }),\n/* 1249 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n\n\n/***/ }),\n/* 1250 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsTypedArray = __webpack_require__(1251),\n    baseUnary = __webpack_require__(607),\n    nodeUtil = __webpack_require__(1252);\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n\n\n/***/ }),\n/* 1251 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(296),\n    isLength = __webpack_require__(603),\n    isObjectLike = __webpack_require__(210);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n\n\n/***/ }),\n/* 1252 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(602);\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(69)(module)))\n\n/***/ }),\n/* 1253 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(209),\n    isPrototype = __webpack_require__(1254),\n    nativeKeysIn = __webpack_require__(1255);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n\n\n/***/ }),\n/* 1254 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n\n\n/***/ }),\n/* 1255 */\n/***/ (function(module, exports) {\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n\n\n/***/ }),\n/* 1256 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = shallowEqual;\nfunction shallowEqual(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/***/ }),\n/* 1257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _union = __webpack_require__(1258);\n\nvar _union2 = _interopRequireDefault(_union);\n\nvar _without = __webpack_require__(1291);\n\nvar _without2 = _interopRequireDefault(_without);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EnterLeaveCounter = function () {\n\tfunction EnterLeaveCounter() {\n\t\t_classCallCheck(this, EnterLeaveCounter);\n\n\t\tthis.entered = [];\n\t}\n\n\t_createClass(EnterLeaveCounter, [{\n\t\tkey: 'enter',\n\t\tvalue: function enter(enteringNode) {\n\t\t\tvar previousLength = this.entered.length;\n\n\t\t\tvar isNodeEntered = function isNodeEntered(node) {\n\t\t\t\treturn document.documentElement.contains(node) && (!node.contains || node.contains(enteringNode));\n\t\t\t};\n\n\t\t\tthis.entered = (0, _union2.default)(this.entered.filter(isNodeEntered), [enteringNode]);\n\n\t\t\treturn previousLength === 0 && this.entered.length > 0;\n\t\t}\n\t}, {\n\t\tkey: 'leave',\n\t\tvalue: function leave(leavingNode) {\n\t\t\tvar previousLength = this.entered.length;\n\n\t\t\tthis.entered = (0, _without2.default)(this.entered.filter(function (node) {\n\t\t\t\treturn document.documentElement.contains(node);\n\t\t\t}), leavingNode);\n\n\t\t\treturn previousLength > 0 && this.entered.length === 0;\n\t\t}\n\t}, {\n\t\tkey: 'reset',\n\t\tvalue: function reset() {\n\t\t\tthis.entered = [];\n\t\t}\n\t}]);\n\n\treturn EnterLeaveCounter;\n}();\n\nexports.default = EnterLeaveCounter;\n\n/***/ }),\n/* 1258 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseFlatten = __webpack_require__(1259),\n    baseRest = __webpack_require__(295),\n    baseUniq = __webpack_require__(1262),\n    isArrayLikeObject = __webpack_require__(614);\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n\n\n/***/ }),\n/* 1259 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayPush = __webpack_require__(1260),\n    isFlattenable = __webpack_require__(1261);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n/***/ }),\n/* 1260 */\n/***/ (function(module, exports) {\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n/***/ }),\n/* 1261 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(297),\n    isArguments = __webpack_require__(605),\n    isArray = __webpack_require__(606);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n/***/ }),\n/* 1262 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar SetCache = __webpack_require__(608),\n    arrayIncludes = __webpack_require__(610),\n    arrayIncludesWith = __webpack_require__(611),\n    cacheHas = __webpack_require__(612),\n    createSet = __webpack_require__(1288),\n    setToArray = __webpack_require__(613);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n/***/ }),\n/* 1263 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Hash = __webpack_require__(1264),\n    ListCache = __webpack_require__(1270),\n    Map = __webpack_require__(1276);\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n/***/ }),\n/* 1264 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hashClear = __webpack_require__(1265),\n    hashDelete = __webpack_require__(1266),\n    hashGet = __webpack_require__(1267),\n    hashHas = __webpack_require__(1268),\n    hashSet = __webpack_require__(1269);\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n/***/ }),\n/* 1265 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(211);\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n/***/ }),\n/* 1266 */\n/***/ (function(module, exports) {\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n/***/ }),\n/* 1267 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(211);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n/***/ }),\n/* 1268 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(211);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n/***/ }),\n/* 1269 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar nativeCreate = __webpack_require__(211);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n/***/ }),\n/* 1270 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar listCacheClear = __webpack_require__(1271),\n    listCacheDelete = __webpack_require__(1272),\n    listCacheGet = __webpack_require__(1273),\n    listCacheHas = __webpack_require__(1274),\n    listCacheSet = __webpack_require__(1275);\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n/***/ }),\n/* 1271 */\n/***/ (function(module, exports) {\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n/***/ }),\n/* 1272 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(212);\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n/***/ }),\n/* 1273 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(212);\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n/***/ }),\n/* 1274 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(212);\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n/***/ }),\n/* 1275 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar assocIndexOf = __webpack_require__(212);\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n/***/ }),\n/* 1276 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(208),\n    root = __webpack_require__(159);\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n/***/ }),\n/* 1277 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(213);\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n/***/ }),\n/* 1278 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n/***/ }),\n/* 1279 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(213);\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n/***/ }),\n/* 1280 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(213);\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n/***/ }),\n/* 1281 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getMapData = __webpack_require__(213);\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n/***/ }),\n/* 1282 */\n/***/ (function(module, exports) {\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n/***/ }),\n/* 1283 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n/***/ }),\n/* 1284 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseFindIndex = __webpack_require__(1285),\n    baseIsNaN = __webpack_require__(1286),\n    strictIndexOf = __webpack_require__(1287);\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n/***/ }),\n/* 1285 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n/***/ }),\n/* 1286 */\n/***/ (function(module, exports) {\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n/***/ }),\n/* 1287 */\n/***/ (function(module, exports) {\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n/***/ }),\n/* 1288 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Set = __webpack_require__(1289),\n    noop = __webpack_require__(1290),\n    setToArray = __webpack_require__(613);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n/***/ }),\n/* 1289 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(208),\n    root = __webpack_require__(159);\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n/***/ }),\n/* 1290 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n/***/ }),\n/* 1291 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseDifference = __webpack_require__(1292),\n    baseRest = __webpack_require__(295),\n    isArrayLikeObject = __webpack_require__(614);\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n\n\n/***/ }),\n/* 1292 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar SetCache = __webpack_require__(608),\n    arrayIncludes = __webpack_require__(610),\n    arrayIncludesWith = __webpack_require__(611),\n    arrayMap = __webpack_require__(1293),\n    baseUnary = __webpack_require__(607),\n    cacheHas = __webpack_require__(612);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n\n\n/***/ }),\n/* 1293 */\n/***/ (function(module, exports) {\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n/***/ }),\n/* 1294 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MapCache = __webpack_require__(609);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n\n\n/***/ }),\n/* 1295 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getNodeClientOffset = getNodeClientOffset;\nexports.getEventClientOffset = getEventClientOffset;\nexports.getDragPreviewOffset = getDragPreviewOffset;\n\nvar _BrowserDetector = __webpack_require__(615);\n\nvar _MonotonicInterpolant = __webpack_require__(1296);\n\nvar _MonotonicInterpolant2 = _interopRequireDefault(_MonotonicInterpolant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint\n   no-mixed-operators: off\n*/\nvar ELEMENT_NODE = 1;\n\nfunction getNodeClientOffset(node) {\n\tvar el = node.nodeType === ELEMENT_NODE ? node : node.parentElement;\n\n\tif (!el) {\n\t\treturn null;\n\t}\n\n\tvar _el$getBoundingClient = el.getBoundingClientRect(),\n\t    top = _el$getBoundingClient.top,\n\t    left = _el$getBoundingClient.left;\n\n\treturn { x: left, y: top };\n}\n\nfunction getEventClientOffset(e) {\n\treturn {\n\t\tx: e.clientX,\n\t\ty: e.clientY\n\t};\n}\n\nfunction isImageNode(node) {\n\treturn node.nodeName === 'IMG' && ((0, _BrowserDetector.isFirefox)() || !document.documentElement.contains(node));\n}\n\nfunction getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight) {\n\tvar dragPreviewWidth = isImage ? dragPreview.width : sourceWidth;\n\tvar dragPreviewHeight = isImage ? dragPreview.height : sourceHeight;\n\n\t// Work around @2x coordinate discrepancies in browsers\n\tif ((0, _BrowserDetector.isSafari)() && isImage) {\n\t\tdragPreviewHeight /= window.devicePixelRatio;\n\t\tdragPreviewWidth /= window.devicePixelRatio;\n\t}\n\treturn { dragPreviewWidth: dragPreviewWidth, dragPreviewHeight: dragPreviewHeight };\n}\n\nfunction getDragPreviewOffset(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint) {\n\t// The browsers will use the image intrinsic size under different conditions.\n\t// Firefox only cares if it's an image, but WebKit also wants it to be detached.\n\tvar isImage = isImageNode(dragPreview);\n\tvar dragPreviewNode = isImage ? sourceNode : dragPreview;\n\tvar dragPreviewNodeOffsetFromClient = getNodeClientOffset(dragPreviewNode);\n\tvar offsetFromDragPreview = {\n\t\tx: clientOffset.x - dragPreviewNodeOffsetFromClient.x,\n\t\ty: clientOffset.y - dragPreviewNodeOffsetFromClient.y\n\t};\n\tvar sourceWidth = sourceNode.offsetWidth,\n\t    sourceHeight = sourceNode.offsetHeight;\n\tvar anchorX = anchorPoint.anchorX,\n\t    anchorY = anchorPoint.anchorY;\n\n\tvar _getDragPreviewSize = getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight),\n\t    dragPreviewWidth = _getDragPreviewSize.dragPreviewWidth,\n\t    dragPreviewHeight = _getDragPreviewSize.dragPreviewHeight;\n\n\tvar calculateYOffset = function calculateYOffset() {\n\t\tvar interpolantY = new _MonotonicInterpolant2.default([0, 0.5, 1], [\n\t\t// Dock to the top\n\t\toffsetFromDragPreview.y,\n\t\t// Align at the center\n\t\toffsetFromDragPreview.y / sourceHeight * dragPreviewHeight,\n\t\t// Dock to the bottom\n\t\toffsetFromDragPreview.y + dragPreviewHeight - sourceHeight]);\n\t\tvar y = interpolantY.interpolate(anchorY);\n\t\t// Work around Safari 8 positioning bug\n\t\tif ((0, _BrowserDetector.isSafari)() && isImage) {\n\t\t\t// We'll have to wait for @3x to see if this is entirely correct\n\t\t\ty += (window.devicePixelRatio - 1) * dragPreviewHeight;\n\t\t}\n\t\treturn y;\n\t};\n\n\tvar calculateXOffset = function calculateXOffset() {\n\t\t// Interpolate coordinates depending on anchor point\n\t\t// If you know a simpler way to do this, let me know\n\t\tvar interpolantX = new _MonotonicInterpolant2.default([0, 0.5, 1], [\n\t\t// Dock to the left\n\t\toffsetFromDragPreview.x,\n\t\t// Align at the center\n\t\toffsetFromDragPreview.x / sourceWidth * dragPreviewWidth,\n\t\t// Dock to the right\n\t\toffsetFromDragPreview.x + dragPreviewWidth - sourceWidth]);\n\t\treturn interpolantX.interpolate(anchorX);\n\t};\n\n\t// Force offsets if specified in the options.\n\tvar offsetX = offsetPoint.offsetX,\n\t    offsetY = offsetPoint.offsetY;\n\n\tvar isManualOffsetX = offsetX === 0 || offsetX;\n\tvar isManualOffsetY = offsetY === 0 || offsetY;\n\treturn {\n\t\tx: isManualOffsetX ? offsetX : calculateXOffset(),\n\t\ty: isManualOffsetY ? offsetY : calculateYOffset()\n\t};\n}\n\n/***/ }),\n/* 1296 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint\n   no-plusplus: off,\n   no-mixed-operators: off\n*/\nvar MonotonicInterpolant = function () {\n\tfunction MonotonicInterpolant(xs, ys) {\n\t\t_classCallCheck(this, MonotonicInterpolant);\n\n\t\tvar length = xs.length;\n\n\t\t// Rearrange xs and ys so that xs is sorted\n\t\tvar indexes = [];\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tindexes.push(i);\n\t\t}\n\t\tindexes.sort(function (a, b) {\n\t\t\treturn xs[a] < xs[b] ? -1 : 1;\n\t\t});\n\n\t\t// Get consecutive differences and slopes\n\t\tvar dys = [];\n\t\tvar dxs = [];\n\t\tvar ms = [];\n\t\tvar dx = void 0;\n\t\tvar dy = void 0;\n\t\tfor (var _i = 0; _i < length - 1; _i++) {\n\t\t\tdx = xs[_i + 1] - xs[_i];\n\t\t\tdy = ys[_i + 1] - ys[_i];\n\t\t\tdxs.push(dx);\n\t\t\tdys.push(dy);\n\t\t\tms.push(dy / dx);\n\t\t}\n\n\t\t// Get degree-1 coefficients\n\t\tvar c1s = [ms[0]];\n\t\tfor (var _i2 = 0; _i2 < dxs.length - 1; _i2++) {\n\t\t\tvar _m = ms[_i2];\n\t\t\tvar mNext = ms[_i2 + 1];\n\t\t\tif (_m * mNext <= 0) {\n\t\t\t\tc1s.push(0);\n\t\t\t} else {\n\t\t\t\tdx = dxs[_i2];\n\t\t\t\tvar dxNext = dxs[_i2 + 1];\n\t\t\t\tvar common = dx + dxNext;\n\t\t\t\tc1s.push(3 * common / ((common + dxNext) / _m + (common + dx) / mNext));\n\t\t\t}\n\t\t}\n\t\tc1s.push(ms[ms.length - 1]);\n\n\t\t// Get degree-2 and degree-3 coefficients\n\t\tvar c2s = [];\n\t\tvar c3s = [];\n\t\tvar m = void 0;\n\t\tfor (var _i3 = 0; _i3 < c1s.length - 1; _i3++) {\n\t\t\tm = ms[_i3];\n\t\t\tvar c1 = c1s[_i3];\n\t\t\tvar invDx = 1 / dxs[_i3];\n\t\t\tvar _common = c1 + c1s[_i3 + 1] - m - m;\n\t\t\tc2s.push((m - c1 - _common) * invDx);\n\t\t\tc3s.push(_common * invDx * invDx);\n\t\t}\n\n\t\tthis.xs = xs;\n\t\tthis.ys = ys;\n\t\tthis.c1s = c1s;\n\t\tthis.c2s = c2s;\n\t\tthis.c3s = c3s;\n\t}\n\n\t_createClass(MonotonicInterpolant, [{\n\t\tkey: \"interpolate\",\n\t\tvalue: function interpolate(x) {\n\t\t\tvar xs = this.xs,\n\t\t\t    ys = this.ys,\n\t\t\t    c1s = this.c1s,\n\t\t\t    c2s = this.c2s,\n\t\t\t    c3s = this.c3s;\n\n\t\t\t// The rightmost point in the dataset should give an exact result\n\n\t\t\tvar i = xs.length - 1;\n\t\t\tif (x === xs[i]) {\n\t\t\t\treturn ys[i];\n\t\t\t}\n\n\t\t\t// Search for the interval x is in, returning the corresponding y if x is one of the original xs\n\t\t\tvar low = 0;\n\t\t\tvar high = c3s.length - 1;\n\t\t\tvar mid = void 0;\n\t\t\twhile (low <= high) {\n\t\t\t\tmid = Math.floor(0.5 * (low + high));\n\t\t\t\tvar xHere = xs[mid];\n\t\t\t\tif (xHere < x) {\n\t\t\t\t\tlow = mid + 1;\n\t\t\t\t} else if (xHere > x) {\n\t\t\t\t\thigh = mid - 1;\n\t\t\t\t} else {\n\t\t\t\t\treturn ys[mid];\n\t\t\t\t}\n\t\t\t}\n\t\t\ti = Math.max(0, high);\n\n\t\t\t// Interpolate\n\t\t\tvar diff = x - xs[i];\n\t\t\tvar diffSq = diff * diff;\n\t\t\treturn ys[i] + c1s[i] * diff + c2s[i] * diffSq + c3s[i] * diff * diffSq;\n\t\t}\n\t}]);\n\n\treturn MonotonicInterpolant;\n}();\n\nexports.default = MonotonicInterpolant;\n\n/***/ }),\n/* 1297 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _nativeTypesConfig;\n\nexports.createNativeDragSource = createNativeDragSource;\nexports.matchNativeItemType = matchNativeItemType;\n\nvar _NativeTypes = __webpack_require__(300);\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; desc.configurable = desc.enumerable = true; if (\"value\" in desc) desc.writable = true; Object.defineProperty(obj, key, desc); } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction getDataFromDataTransfer(dataTransfer, typesToTry, defaultValue) {\n\tvar result = typesToTry.reduce(function (resultSoFar, typeToTry) {\n\t\treturn resultSoFar || dataTransfer.getData(typeToTry);\n\t}, null);\n\n\treturn result != null // eslint-disable-line eqeqeq\n\t? result : defaultValue;\n}\n\nvar nativeTypesConfig = (_nativeTypesConfig = {}, _defineProperty(_nativeTypesConfig, NativeTypes.FILE, {\n\texposeProperty: 'files',\n\tmatchesTypes: ['Files'],\n\tgetData: function getData(dataTransfer) {\n\t\treturn Array.prototype.slice.call(dataTransfer.files);\n\t}\n}), _defineProperty(_nativeTypesConfig, NativeTypes.URL, {\n\texposeProperty: 'urls',\n\tmatchesTypes: ['Url', 'text/uri-list'],\n\tgetData: function getData(dataTransfer, matchesTypes) {\n\t\treturn getDataFromDataTransfer(dataTransfer, matchesTypes, '').split('\\n');\n\t}\n}), _defineProperty(_nativeTypesConfig, NativeTypes.TEXT, {\n\texposeProperty: 'text',\n\tmatchesTypes: ['Text', 'text/plain'],\n\tgetData: function getData(dataTransfer, matchesTypes) {\n\t\treturn getDataFromDataTransfer(dataTransfer, matchesTypes, '');\n\t}\n}), _nativeTypesConfig);\n\nfunction createNativeDragSource(type) {\n\tvar _nativeTypesConfig$ty = nativeTypesConfig[type],\n\t    exposeProperty = _nativeTypesConfig$ty.exposeProperty,\n\t    matchesTypes = _nativeTypesConfig$ty.matchesTypes,\n\t    getData = _nativeTypesConfig$ty.getData;\n\n\n\treturn function () {\n\t\tfunction NativeDragSource() {\n\t\t\tvar _item, _mutatorMap;\n\n\t\t\t_classCallCheck(this, NativeDragSource);\n\n\t\t\tthis.item = (_item = {}, _mutatorMap = {}, _mutatorMap[exposeProperty] = _mutatorMap[exposeProperty] || {}, _mutatorMap[exposeProperty].get = function () {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn('Browser doesn\\'t allow reading \"' + exposeProperty + '\" until the drop event.');\n\t\t\t\treturn null;\n\t\t\t}, _defineEnumerableProperties(_item, _mutatorMap), _item);\n\t\t}\n\n\t\t_createClass(NativeDragSource, [{\n\t\t\tkey: 'mutateItemByReadingDataTransfer',\n\t\t\tvalue: function mutateItemByReadingDataTransfer(dataTransfer) {\n\t\t\t\tdelete this.item[exposeProperty];\n\t\t\t\tthis.item[exposeProperty] = getData(dataTransfer, matchesTypes);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrag',\n\t\t\tvalue: function canDrag() {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'beginDrag',\n\t\t\tvalue: function beginDrag() {\n\t\t\t\treturn this.item;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'isDragging',\n\t\t\tvalue: function isDragging(monitor, handle) {\n\t\t\t\treturn handle === monitor.getSourceId();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'endDrag',\n\t\t\tvalue: function endDrag() {}\n\t\t}]);\n\n\t\treturn NativeDragSource;\n\t}();\n}\n\nfunction matchNativeItemType(dataTransfer) {\n\tvar dataTransferTypes = Array.prototype.slice.call(dataTransfer.types || []);\n\n\treturn Object.keys(nativeTypesConfig).filter(function (nativeItemType) {\n\t\tvar matchesTypes = nativeTypesConfig[nativeItemType].matchesTypes;\n\n\t\treturn matchesTypes.some(function (t) {\n\t\t\treturn dataTransferTypes.indexOf(t) > -1;\n\t\t});\n\t})[0] || null;\n}\n\n/***/ }),\n/* 1298 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = getEmptyImage;\nvar emptyImage = void 0;\nfunction getEmptyImage() {\n\tif (!emptyImage) {\n\t\temptyImage = new Image();\n\t\temptyImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t}\n\n\treturn emptyImage;\n}\n\n/***/ }),\n/* 1299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.TooltipEditorItem = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDnd = __webpack_require__(581);\n\nvar _compose = __webpack_require__(1300);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _tooltip_editor_column_select = __webpack_require__(1335);\n\nvar _tooltip_editor_column_select2 = _interopRequireDefault(_tooltip_editor_column_select);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar itemSource = {\n    beginDrag: function beginDrag(props) {\n        return {\n            id: props.id\n        };\n    },\n    endDrag: function endDrag(props, monitor) {\n        if (!monitor.didDrop()) {\n            return;\n        }\n        props.setItem();\n    }\n};\nvar itemTarget = {\n    hover: function hover(props, monitor) {\n        var draggedId = monitor.getItem().id;\n        if (draggedId !== props.id) {\n            props.moveItem(draggedId, props.id);\n        }\n    }\n};\n\nvar TooltipEditorItem = exports.TooltipEditorItem = function (_React$Component) {\n    _inherits(TooltipEditorItem, _React$Component);\n\n    function TooltipEditorItem() {\n        _classCallCheck(this, TooltipEditorItem);\n\n        return _possibleConstructorReturn(this, (TooltipEditorItem.__proto__ || Object.getPrototypeOf(TooltipEditorItem)).apply(this, arguments));\n    }\n\n    _createClass(TooltipEditorItem, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                connectDragSource = _props.connectDragSource,\n                connectDropTarget = _props.connectDropTarget,\n                isDraggable = _props.isDraggable,\n                rowForTooltip = _props.rowForTooltip,\n                column = _props.column,\n                selectableColumns = _props.selectableColumns,\n                updateColumn = _props.updateColumn,\n                removeColumn = _props.removeColumn,\n                locale = _props.locale;\n\n            var tooltipRow = _react2.default.createElement(\"tr\", { className: \"tooltip_editor__option\" }, _react2.default.createElement(\"td\", { className: \"checkbox_column\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", { className: \"ui-form__checkbox-label\" }, _react2.default.createElement(\"input\", { type: \"checkbox\", checked: column.get('showColumnName'), onChange: function onChange() {\n                    return updateColumn(column.set('showColumnName', !column.get('showColumnName')));\n                } })))), _react2.default.createElement(\"td\", { className: \"remove_column\" }, _react2.default.createElement(\"a\", { onClick: function onClick() {\n                    return removeColumn(column);\n                } }, _react2.default.createElement(\"i\", { className: \"tooltip_editor__add_button_icon icon-remove-1\" }))), _react2.default.createElement(\"td\", null, _react2.default.createElement(_tooltip_editor_column_select2.default, { locale: locale, rowForTooltip: rowForTooltip, selectedColumn: column, selectableColumns: selectableColumns, onSelect: function onSelect(newColumn) {\n                    return updateColumn(newColumn);\n                } })), _react2.default.createElement(\"td\", { className: \"tooltip_editor__draggable\" }, _react2.default.createElement(\"span\", { className: \"tooltip_editor__draggable_icon\" })));\n            if (isDraggable) {\n                return connectDragSource(connectDropTarget(tooltipRow));\n            }\n            return tooltipRow;\n        }\n    }]);\n\n    return TooltipEditorItem;\n}(_react2.default.Component);\n\nTooltipEditorItem.propTypes = {\n    connectDragSource: _propTypes2.default.func.isRequired,\n    connectDropTarget: _propTypes2.default.func.isRequired,\n    isDragging: _propTypes2.default.bool.isRequired,\n    wrapper: _propTypes2.default.bool,\n    isDraggable: _propTypes2.default.bool,\n    children: _propTypes2.default.object,\n    locale: _propTypes2.default.string.isRequired,\n    rowForTooltip: _propTypes2.default.object.isRequired,\n    column: _propTypes2.default.object.isRequired,\n    selectableColumns: _propTypes2.default.object.isRequired,\n    updateColumn: _propTypes2.default.func.isRequired,\n    removeColumn: _propTypes2.default.func.isRequired\n};\nvar SortableTooltipEditorItem = (0, _compose2.default)((0, _reactDnd.DropTarget)('ITEM', itemTarget, function (connect) {\n    return {\n        connectDropTarget: connect.dropTarget()\n    };\n}), (0, _reactDnd.DragSource)('ITEM', itemSource, function (connect, monitor) {\n    return {\n        connectDragSource: connect.dragSource(),\n        isDragging: monitor.isDragging()\n    };\n}))(TooltipEditorItem);\nexports.default = SortableTooltipEditorItem;\n\n/***/ }),\n/* 1300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _flowRight = __webpack_require__(1301);\n\nvar _flowRight2 = _interopRequireDefault(_flowRight);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _flowRight2.default;\n\n/***/ }),\n/* 1301 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar createFlow = __webpack_require__(1302);\n\n/**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flowRight = createFlow(true);\n\nmodule.exports = flowRight;\n\n\n/***/ }),\n/* 1302 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LodashWrapper = __webpack_require__(301),\n    flatRest = __webpack_require__(1303),\n    getData = __webpack_require__(619),\n    getFuncName = __webpack_require__(620),\n    isArray = __webpack_require__(307),\n    isLaziable = __webpack_require__(1331);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n  return flatRest(function(funcs) {\n    var length = funcs.length,\n        index = length,\n        prereq = LodashWrapper.prototype.thru;\n\n    if (fromRight) {\n      funcs.reverse();\n    }\n    while (index--) {\n      var func = funcs[index];\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n        var wrapper = new LodashWrapper([], true);\n      }\n    }\n    index = wrapper ? index : length;\n    while (++index < length) {\n      func = funcs[index];\n\n      var funcName = getFuncName(func),\n          data = funcName == 'wrapper' ? getData(func) : undefined;\n\n      if (data && isLaziable(data[0]) &&\n            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n            !data[4].length && data[9] == 1\n          ) {\n        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n      } else {\n        wrapper = (func.length == 1 && isLaziable(func))\n          ? wrapper[funcName]()\n          : wrapper.thru(func);\n      }\n    }\n    return function() {\n      var args = arguments,\n          value = args[0];\n\n      if (wrapper && args.length == 1 && isArray(value)) {\n        return wrapper.plant(value).value();\n      }\n      var index = 0,\n          result = length ? funcs[index].apply(this, args) : value;\n\n      while (++index < length) {\n        result = funcs[index].call(this, result);\n      }\n      return result;\n    };\n  });\n}\n\nmodule.exports = createFlow;\n\n\n/***/ }),\n/* 1303 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar flatten = __webpack_require__(1304),\n    overRest = __webpack_require__(1313),\n    setToString = __webpack_require__(1315);\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n\n\n/***/ }),\n/* 1304 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseFlatten = __webpack_require__(1305);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n\n\n/***/ }),\n/* 1305 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayPush = __webpack_require__(1306),\n    isFlattenable = __webpack_require__(1307);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n/***/ }),\n/* 1306 */\n/***/ (function(module, exports) {\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n/***/ }),\n/* 1307 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(304),\n    isArguments = __webpack_require__(1309),\n    isArray = __webpack_require__(307);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n/***/ }),\n/* 1308 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1309 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseIsArguments = __webpack_require__(1310),\n    isObjectLike = __webpack_require__(306);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n/***/ }),\n/* 1310 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(617),\n    isObjectLike = __webpack_require__(306);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n/***/ }),\n/* 1311 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(304);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 1312 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n/* 1313 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar apply = __webpack_require__(1314);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n/***/ }),\n/* 1314 */\n/***/ (function(module, exports) {\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n/***/ }),\n/* 1315 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseSetToString = __webpack_require__(1316),\n    shortOut = __webpack_require__(1326);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n/***/ }),\n/* 1316 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar constant = __webpack_require__(1317),\n    defineProperty = __webpack_require__(1318),\n    identity = __webpack_require__(1325);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n/***/ }),\n/* 1317 */\n/***/ (function(module, exports) {\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n/***/ }),\n/* 1318 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(618);\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n/***/ }),\n/* 1319 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isFunction = __webpack_require__(1320),\n    isMasked = __webpack_require__(1321),\n    isObject = __webpack_require__(302),\n    toSource = __webpack_require__(1323);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n/***/ }),\n/* 1320 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(617),\n    isObject = __webpack_require__(302);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n/***/ }),\n/* 1321 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar coreJsData = __webpack_require__(1322);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n/***/ }),\n/* 1322 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(305);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n/***/ }),\n/* 1323 */\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n/***/ }),\n/* 1324 */\n/***/ (function(module, exports) {\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n/***/ }),\n/* 1325 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n/***/ }),\n/* 1326 */\n/***/ (function(module, exports) {\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n/***/ }),\n/* 1327 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar WeakMap = __webpack_require__(1328);\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n\n\n/***/ }),\n/* 1328 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getNative = __webpack_require__(618),\n    root = __webpack_require__(305);\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n\n\n/***/ }),\n/* 1329 */\n/***/ (function(module, exports) {\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n/***/ }),\n/* 1330 */\n/***/ (function(module, exports) {\n\n/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n\n\n/***/ }),\n/* 1331 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LazyWrapper = __webpack_require__(308),\n    getData = __webpack_require__(619),\n    getFuncName = __webpack_require__(620),\n    lodash = __webpack_require__(1332);\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n *  else `false`.\n */\nfunction isLaziable(func) {\n  var funcName = getFuncName(func),\n      other = lodash[funcName];\n\n  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n    return false;\n  }\n  if (func === other) {\n    return true;\n  }\n  var data = getData(other);\n  return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n\n\n/***/ }),\n/* 1332 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LazyWrapper = __webpack_require__(308),\n    LodashWrapper = __webpack_require__(301),\n    baseLodash = __webpack_require__(303),\n    isArray = __webpack_require__(307),\n    isObjectLike = __webpack_require__(306),\n    wrapperClone = __webpack_require__(1333);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n    if (value instanceof LodashWrapper) {\n      return value;\n    }\n    if (hasOwnProperty.call(value, '__wrapped__')) {\n      return wrapperClone(value);\n    }\n  }\n  return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n\n\n/***/ }),\n/* 1333 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LazyWrapper = __webpack_require__(308),\n    LodashWrapper = __webpack_require__(301),\n    copyArray = __webpack_require__(1334);\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n  if (wrapper instanceof LazyWrapper) {\n    return wrapper.clone();\n  }\n  var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n  result.__actions__ = copyArray(wrapper.__actions__);\n  result.__index__  = wrapper.__index__;\n  result.__values__ = wrapper.__values__;\n  return result;\n}\n\nmodule.exports = wrapperClone;\n\n\n/***/ }),\n/* 1334 */\n/***/ (function(module, exports) {\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n\n\n/***/ }),\n/* 1335 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _tooltip_value = __webpack_require__(621);\n\nvar _tooltip_value2 = _interopRequireDefault(_tooltip_value);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TooltipEditorColumnSelect = function (_React$Component) {\n    _inherits(TooltipEditorColumnSelect, _React$Component);\n\n    function TooltipEditorColumnSelect() {\n        _classCallCheck(this, TooltipEditorColumnSelect);\n\n        var _this = _possibleConstructorReturn(this, (TooltipEditorColumnSelect.__proto__ || Object.getPrototypeOf(TooltipEditorColumnSelect)).apply(this, arguments));\n\n        _this.state = {\n            display: false\n        };\n        return _this;\n    }\n\n    _createClass(TooltipEditorColumnSelect, [{\n        key: 'toggleMenu',\n        value: function toggleMenu() {\n            this.setState({ display: !this.state.display });\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _props = this.props,\n                rowForTooltip = _props.rowForTooltip,\n                selectedColumn = _props.selectedColumn,\n                selectableColumns = _props.selectableColumns,\n                onSelect = _props.onSelect,\n                locale = _props.locale;\n\n            var dropDownStyle = this.state.display ? { display: 'inline-block' } : null;\n            var columnValue = rowForTooltip.get(selectedColumn.get('name')) || '- no data -'; // TODO a better option here\n            var labelClasses = (0, _classnames2.default)('field-label', { unshown: !selectedColumn.get('showColumnName') });\n            return _react2.default.createElement(\"div\", { className: \"tooltip_editor__column_select\" }, _react2.default.createElement(\"div\", { className: labelClasses }, ('' + selectedColumn.get('label')).toUpperCase()), _react2.default.createElement(\"div\", { className: \"ui-dropdown\" }, _react2.default.createElement(\"a\", { className: \"ui-dropdown__toggle ui-button\", onClick: function onClick() {\n                    return _this2.toggleMenu();\n                } }, _react2.default.createElement(_tooltip_value2.default, { locale: locale, value: columnValue, columnName: selectedColumn.get('name'), columnType: selectedColumn.get('type') })), _react2.default.createElement(\"div\", { className: \"ui-dropdown__target\", style: dropDownStyle }, _react2.default.createElement(\"div\", { className: \"column_select_container\" }, _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, selectableColumns.map(function (column) {\n                return _react2.default.createElement(\"li\", { key: column.get('name') }, _react2.default.createElement(\"a\", { onClick: function onClick() {\n                        _this2.toggleMenu();onSelect(column);\n                    } }, column.get('label')));\n            }))), _react2.default.createElement(\"footer\", { className: \"ui-dropdown__footer\" }, _react2.default.createElement(\"a\", { className: \"ui-dropdown__action\", onClick: function onClick() {\n                    return _this2.toggleMenu();\n                } }, \"Cancel\")))));\n        }\n    }]);\n\n    return TooltipEditorColumnSelect;\n}(_react2.default.Component);\n\nexports.default = TooltipEditorColumnSelect;\n\nTooltipEditorColumnSelect.propTypes = {\n    locale: _propTypes2.default.string.isRequired,\n    rowForTooltip: _propTypes2.default.object.isRequired,\n    selectedColumn: _propTypes2.default.object.isRequired,\n    selectableColumns: _propTypes2.default.object.isRequired,\n    onSelect: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 1336 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _immutable = __webpack_require__(14);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _tooltip_value = __webpack_require__(621);\n\nvar _tooltip_value2 = _interopRequireDefault(_tooltip_value);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Tooltip = function (_Component) {\n    _inherits(Tooltip, _Component);\n\n    function Tooltip() {\n        _classCallCheck(this, Tooltip);\n\n        return _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).apply(this, arguments));\n    }\n\n    _createClass(Tooltip, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                colorExtractor = _props.colorExtractor,\n                config = _props.config,\n                currentItems = _props.currentItems,\n                editable = _props.editable;\n\n            if (currentItems.size == 1) {\n                return _react2.default.createElement(SingleItemTooltip, { colorExtractor: colorExtractor, config: config, currentItem: currentItems.first(), editable: editable });\n            }\n            return _react2.default.createElement(MultiItemTooltip, { colorExtractor: colorExtractor, config: config, currentItems: currentItems, editable: editable });\n        }\n    }]);\n\n    return Tooltip;\n}(_react.Component);\n\nexports.default = Tooltip;\n\nTooltip.propTypes = {\n    colorExtractor: _propTypes2.default.func.isRequired,\n    config: _propTypes2.default.object.isRequired,\n    currentItems: _propTypes2.default.instanceOf(_immutable.List).isRequired,\n    editable: _propTypes2.default.bool\n};\nvar EditButton = function EditButton() {\n    return _react2.default.createElement(\"div\", { className: \"tooltip__edit_button\" }, _react2.default.createElement(\"a\", { onClick: _grid_report_actions2.default.setMapTooltipEditing }, _react2.default.createElement(\"i\", { className: \"tooltip__edit_icon icon-app-manage\" })));\n};\nvar groupItemsByColorAndSort = function groupItemsByColorAndSort(props) {\n    return props.currentItems.groupBy(function (item) {\n        return props.colorExtractor(item);\n    }).reduce(function (groups, items, color) {\n        return groups.push((0, _immutable.Map)({\n            color: color,\n            items: items\n        }));\n    }, (0, _immutable.List)()).sortBy(function (group) {\n        return -group.get('items').size;\n    }).reduce(function (groups, group, index) {\n        return groups.push(group.set('startIndex', index == 0 ? 0 : groups.getIn([index - 1, 'items']).size + groups.getIn([index - 1, 'startIndex'])));\n    }, (0, _immutable.List)());\n};\nvar TooltipItemGroup = function TooltipItemGroup(_ref) {\n    var color = _ref.color,\n        count = _ref.count,\n        index = _ref.index,\n        _onClick = _ref.onClick;\n    return _react2.default.createElement(\"div\", { className: \"group\", onClick: function onClick() {\n            return _onClick(index);\n        } }, _react2.default.createElement(\"div\", { className: \"group_color_indicator legend__item__decorator map__legend__item__decorator\", style: { color: color, background: color } }), _react2.default.createElement(\"div\", { className: \"group_count\" }, count));\n};\nvar TooltipValueWrapper = function TooltipValueWrapper(_ref2) {\n    var index = _ref2.index,\n        label = _ref2.label,\n        name = _ref2.name,\n        showColumnName = _ref2.showColumnName,\n        type = _ref2.type,\n        value = _ref2.value,\n        valueClass = _ref2.valueClass;\n    return _react2.default.createElement(\"div\", { key: index, className: \"tooltip__column_container\" }, showColumnName && _react2.default.createElement(\"header\", { className: \"tooltip__label\" }, ('' + label).toUpperCase()), _react2.default.createElement(\"div\", { className: valueClass }, _react2.default.createElement(_tooltip_value2.default, { value: value, columnName: name, columnType: type })));\n};\nvar mapValueWrapperProps = function mapValueWrapperProps(item, config) {\n    return config.get('columns').map(function (column, index) {\n        return {\n            index: index,\n            key: index,\n            label: column.get('label'),\n            name: column.get('name'),\n            showColumnName: column.get('showColumnName'),\n            type: column.get('type'),\n            value: item.get(column.get('name')),\n            valueClass: (0, _classnames2.default)('tooltip__value', { leading: index == 0 })\n        };\n    }).toJS();\n};\n\nvar MultiItemTooltip = function (_Component2) {\n    _inherits(MultiItemTooltip, _Component2);\n\n    function MultiItemTooltip() {\n        _classCallCheck(this, MultiItemTooltip);\n\n        var _this2 = _possibleConstructorReturn(this, (MultiItemTooltip.__proto__ || Object.getPrototypeOf(MultiItemTooltip)).apply(this, arguments));\n\n        _this2.state = {\n            currentIndex: 0,\n            groupedItems: groupItemsByColorAndSort(_this2.props),\n            items: groupItemsByColorAndSort(_this2.props).map(function (group) {\n                return group.get('items');\n            }).flatten(1),\n            contentClass: ''\n        };\n        _this2._handleIndexChange = function (newIndex) {\n            var _this2$state = _this2.state,\n                currentIndex = _this2$state.currentIndex,\n                items = _this2$state.items;\n\n            if (newIndex < 0 || newIndex >= items.size || newIndex == currentIndex) {\n                return;\n            }\n            _this2.setState({\n                currentIndex: newIndex,\n                contentClass: newIndex > _this2.state.currentIndex ? 'tooltip__multi__animation_right' : 'tooltip__multi__animation_left'\n            });\n            setTimeout(function () {\n                return _this2.setState({ contentClass: '' });\n            }, 100);\n        };\n        _this2._onBack = function () {\n            return _this2._handleIndexChange(_this2.state.currentIndex - 1);\n        };\n        _this2._onForward = function () {\n            return _this2._handleIndexChange(_this2.state.currentIndex + 1);\n        };\n        _this2._onJumpTo = function (index) {\n            return _this2._handleIndexChange(index);\n        };\n        return _this2;\n    }\n\n    _createClass(MultiItemTooltip, [{\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n            var _this3 = this;\n\n            if (_lodash2.default.some(['colorExtractor', 'currentItems'], function (key) {\n                return nextProps[key] !== _this3.props[key];\n            })) {\n                this.setState({\n                    groupedItems: groupItemsByColorAndSort(nextProps),\n                    items: groupItemsByColorAndSort(nextProps).map(function (group) {\n                        return group.get('items');\n                    }).flatten(1)\n                });\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this4 = this;\n\n            var _props2 = this.props,\n                colorExtractor = _props2.colorExtractor,\n                config = _props2.config,\n                editable = _props2.editable;\n            var _state = this.state,\n                currentIndex = _state.currentIndex,\n                contentClass = _state.contentClass,\n                groupedItems = _state.groupedItems,\n                items = _state.items;\n\n            var currentItem = items.get(currentIndex);\n            var color = colorExtractor(currentItem);\n            return _react2.default.createElement(\"div\", { className: \"tooltip__container multi\" }, _react2.default.createElement(\"div\", { className: \"tooltip__multi__header\", style: { backgroundColor: color } }, _react2.default.createElement(\"div\", { className: \"header_count\" }, currentIndex + 1, \"/\", items.size), _react2.default.createElement(\"div\", { className: \"header_nav\" }, _react2.default.createElement(\"div\", { className: \"header_nav_button_back\", onClick: this._onBack }, _react2.default.createElement(\"span\", { className: \"icon-lefthead-3\", style: { color: color } }), _react2.default.createElement(\"span\", { className: \"icon-circle-1 base\" })), _react2.default.createElement(\"div\", { className: \"header_nav_button_forward\", onClick: this._onForward }, _react2.default.createElement(\"span\", { className: \"icon-righthead-3\", style: { color: color } }), _react2.default.createElement(\"span\", { className: \"icon-circle-1 base\" })))), _react2.default.createElement(\"div\", { className: \"tooltip__multi__content\" }, _react2.default.createElement(\"div\", { className: \"tooltip__multi__item\" }, _react2.default.createElement(\"div\", { className: contentClass }, mapValueWrapperProps(currentItem, config).map(function (props) {\n                return _react2.default.createElement(TooltipValueWrapper, Object.assign({}, props));\n            })), editable && _react2.default.createElement(EditButton, null)), _react2.default.createElement(\"div\", { className: \"tooltip__multi__groups\" }, groupedItems.map(function (group) {\n                return _react2.default.createElement(TooltipItemGroup, { key: group.get('startIndex'), color: group.get('color'), count: group.get('items').size, index: group.get('startIndex'), onClick: _this4._onJumpTo });\n            }))));\n        }\n    }]);\n\n    return MultiItemTooltip;\n}(_react.Component);\n\nMultiItemTooltip.propTypes = {\n    colorExtractor: _propTypes2.default.func.isRequired,\n    config: _propTypes2.default.object.isRequired,\n    currentItems: _propTypes2.default.object.isRequired,\n    editable: _propTypes2.default.bool\n};\n\nvar SingleItemTooltip = function (_Component3) {\n    _inherits(SingleItemTooltip, _Component3);\n\n    function SingleItemTooltip() {\n        _classCallCheck(this, SingleItemTooltip);\n\n        return _possibleConstructorReturn(this, (SingleItemTooltip.__proto__ || Object.getPrototypeOf(SingleItemTooltip)).apply(this, arguments));\n    }\n\n    _createClass(SingleItemTooltip, [{\n        key: 'render',\n        value: function render() {\n            var _props3 = this.props,\n                colorExtractor = _props3.colorExtractor,\n                config = _props3.config,\n                currentItem = _props3.currentItem,\n                editable = _props3.editable;\n\n            var colorForItem = colorExtractor(currentItem);\n            var containerStyle = !!colorForItem ? { borderTop: '4px ' + colorForItem + ' solid' } : null;\n            return _react2.default.createElement(\"div\", { className: \"tooltip__container\", style: containerStyle }, mapValueWrapperProps(currentItem, config).map(function (props) {\n                return _react2.default.createElement(TooltipValueWrapper, Object.assign({}, props));\n            }), editable && _react2.default.createElement(EditButton, null));\n        }\n    }]);\n\n    return SingleItemTooltip;\n}(_react.Component);\n\nSingleItemTooltip.propTypes = {\n    colorExtractor: _propTypes2.default.func.isRequired,\n    config: _propTypes2.default.object.isRequired,\n    currentItem: _propTypes2.default.object.isRequired,\n    editable: _propTypes2.default.bool\n};\n\n/***/ }),\n/* 1337 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _mapboxGl = __webpack_require__(623);\n\nvar _mapboxGl2 = _interopRequireDefault(_mapboxGl);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GLPopup = function (_React$PureComponent) {\n    _inherits(GLPopup, _React$PureComponent);\n\n    function GLPopup() {\n        _classCallCheck(this, GLPopup);\n\n        var _this = _possibleConstructorReturn(this, (GLPopup.__proto__ || Object.getPrototypeOf(GLPopup)).apply(this, arguments));\n\n        _this.div = document.createElement('div');\n        _this.popup = new _mapboxGl2.default.Popup({\n            closeButton: _this.props.closeButton,\n            closeOnClick: false,\n            anchor: _this.props.anchor\n        });\n        // The following two functions are debounced to avoid bouncy/jittery updates to the map\n        _this._update = _lodash2.default.debounce(function () {\n            (0, _reactDom.render)(_this.renderPopupContent(), _this.div, function () {\n                _this.popup.setDOMContent(_this.div);\n            });\n        }, 90);\n        _this._panTo = _lodash2.default.debounce(function (coordinates) {\n            _this.context.map.panTo(coordinates, { offset: [0, 110] });\n        }, 250);\n        _this._onClose = function () {\n            _this.props.onClose();\n            _this.context.map.off('click', _this._onClose);\n        };\n        _this._clickAttached = null;\n        return _this;\n    }\n\n    _createClass(GLPopup, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            var _this2 = this;\n\n            var div = this.div,\n                popup = this.popup;\n            var map = this.context.map;\n            var _props = this.props,\n                coordinates = _props.coordinates,\n                children = _props.children,\n                dangerouslySetInnerHTML = _props.dangerouslySetInnerHTML,\n                text = _props.text;\n\n            if (children) {\n                popup.setDOMContent(div);\n            } else if (dangerouslySetInnerHTML) {\n                popup.setHTML(dangerouslySetInnerHTML);\n            } else {\n                popup.setText(text || '');\n            }\n            popup.setLngLat(coordinates);\n            (0, _reactDom.render)(this.renderPopupContent(), div, function () {\n                popup.addTo(map);\n                _this2._panTo(coordinates);\n            });\n        }\n    }, {\n        key: 'renderPopupContent',\n        value: function renderPopupContent() {\n            return _react2.default.createElement(\"div\", { className: this.props.className, style: { maxWidth: this.props.maxWidth, minWidth: this.props.minWidth } }, this.props.children);\n        }\n    }, {\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            if (this.props.onClose) {\n                this._clickAttached = this.context.map.on('click', this._onClose);\n            }\n        }\n    }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n            var popup = this.popup;\n            var children = nextProps.children,\n                coordinates = nextProps.coordinates,\n                dangerouslySetInnerHTML = nextProps.dangerouslySetInnerHTML,\n                text = nextProps.text;\n\n            if (!children) {\n                if (this.props.dangerouslySetInnerHTML && dangerouslySetInnerHTML !== this.props.dangerouslySetInnerHTML) {\n                    popup.setHTML(dangerouslySetInnerHTML);\n                } else if (text !== this.props.text) {\n                    popup.setText(text);\n                }\n            } else {\n                this._update();\n            }\n            if (this.props.coordinates !== coordinates) {\n                popup.setLngLat(coordinates);\n                this._panTo(coordinates);\n            }\n            if (nextProps.onClose && this.props.onClose != nextProps.onClose) {\n                this._clickAttached = this.context.map.on('click', this._onClose);\n            }\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            var popup = this.popup,\n                div = this.div;\n\n            popup.remove();\n            (0, _reactDom.unmountComponentAtNode)(div);\n            if (this.props.onClose) {\n                this.context.map.off('click', this._clickAttached);\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return null;\n        }\n    }]);\n\n    return GLPopup;\n}(_react2.default.PureComponent);\n\nexports.default = GLPopup;\n\nGLPopup.contextTypes = {\n    map: _propTypes2.default.object\n};\nGLPopup.propTypes = {\n    coordinates: _propTypes2.default.arrayOf(_propTypes2.default.number).isRequired,\n    dangerouslySetInnerHTML: _propTypes2.default.string,\n    text: _propTypes2.default.string,\n    closeButton: _propTypes2.default.bool,\n    closeOnClick: _propTypes2.default.bool,\n    anchor: _propTypes2.default.oneOf(['top', 'bottom', 'left', 'right', 'top-left', 'top-right', 'bottom-left', 'bottom-right']),\n    disableScroll: _propTypes2.default.bool,\n    onClose: _propTypes2.default.func\n};\n\n/***/ }),\n/* 1338 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"_args\":[[\"mapbox-gl@0.23.0\",\"/srv/opengov\"]],\"_from\":\"mapbox-gl@0.23.0\",\"_id\":\"mapbox-gl@0.23.0\",\"_inBundle\":false,\"_integrity\":\"sha1-3tby1wV99IBpXtXF6/U+1HiThkM=\",\"_location\":\"/mapbox-gl\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"mapbox-gl@0.23.0\",\"name\":\"mapbox-gl\",\"escapedName\":\"mapbox-gl\",\"rawSpec\":\"0.23.0\",\"saveSpec\":null,\"fetchSpec\":\"0.23.0\"},\"_requiredBy\":[\"/\"],\"_resolved\":\"https://artifactory.opengov.zone:443/artifactory/api/npm/npm/mapbox-gl/-/mapbox-gl-0.23.0.tgz\",\"_spec\":\"0.23.0\",\"_where\":\"/srv/opengov\",\"browser\":{\"./js/util/ajax.js\":\"./js/util/browser/ajax.js\",\"./js/util/browser.js\":\"./js/util/browser/browser.js\",\"./js/util/canvas.js\":\"./js/util/browser/canvas.js\",\"./js/util/dom.js\":\"./js/util/browser/dom.js\",\"./js/util/web_worker.js\":\"./js/util/browser/web_worker.js\"},\"bugs\":{\"url\":\"https://github.com/mapbox/mapbox-gl-js/issues\"},\"dependencies\":{\"csscolorparser\":\"^1.0.2\",\"earcut\":\"^2.0.3\",\"feature-filter\":\"^2.2.0\",\"geojson-rewind\":\"^0.1.0\",\"geojson-vt\":\"^2.4.0\",\"gl-matrix\":\"^2.3.1\",\"grid-index\":\"^1.0.0\",\"mapbox-gl-function\":\"^1.2.1\",\"mapbox-gl-shaders\":\"github:mapbox/mapbox-gl-shaders#df162476980d9ee2ab6f8d0cf5a06e27aac60472\",\"mapbox-gl-style-spec\":\"github:mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae\",\"mapbox-gl-supported\":\"^1.2.0\",\"pbf\":\"^1.3.2\",\"pngjs\":\"^2.2.0\",\"point-geometry\":\"^0.0.0\",\"quickselect\":\"^1.0.0\",\"request\":\"^2.39.0\",\"resolve-url\":\"^0.2.1\",\"shelf-pack\":\"^1.0.0\",\"supercluster\":\"^2.0.1\",\"tinyqueue\":\"^1.1.0\",\"unassertify\":\"^2.0.0\",\"unitbezier\":\"^0.0.0\",\"vector-tile\":\"^1.3.0\",\"vt-pbf\":\"^2.0.2\",\"webworkify\":\"^1.3.0\",\"whoots-js\":\"^2.0.0\"},\"description\":\"A WebGL interactive maps library\",\"devDependencies\":{\"babel-preset-react\":\"^6.11.1\",\"babelify\":\"^7.3.0\",\"benchmark\":\"~2.1.0\",\"browserify\":\"^13.0.0\",\"clipboard\":\"^1.5.12\",\"concat-stream\":\"1.5.1\",\"coveralls\":\"^2.11.8\",\"doctrine\":\"^1.2.1\",\"documentation\":\"https://github.com/documentationjs/documentation/archive/bb41619c734e59ef3fbc3648610032efcfdaaace.tar.gz\",\"documentation-theme-utils\":\"3.0.0\",\"envify\":\"^3.4.0\",\"eslint\":\"^3.3.1\",\"eslint-config-mourner\":\"^2.0.0\",\"eslint-plugin-html\":\"^1.5.1\",\"gl\":\"^4.0.1\",\"handlebars\":\"4.0.5\",\"highlight.js\":\"9.3.0\",\"istanbul\":\"^0.4.2\",\"jsdom\":\"^9.4.2\",\"jsdom-global\":\"^2.1.0\",\"json-loader\":\"^0.5.4\",\"lodash\":\"^4.13.1\",\"mapbox-gl-test-suite\":\"github:mapbox/mapbox-gl-test-suite#35efbce663a0f13d37d34afac799e33178ee610a\",\"memory-fs\":\"^0.3.0\",\"minifyify\":\"^7.0.1\",\"npm-run-all\":\"^3.0.0\",\"nyc\":\"6.4.0\",\"proxyquire\":\"^1.7.9\",\"remark\":\"4.2.2\",\"remark-html\":\"3.0.0\",\"sinon\":\"^1.15.4\",\"st\":\"^1.2.0\",\"tap\":\"^5.7.0\",\"transform-loader\":\"^0.2.3\",\"unist-util-visit\":\"1.1.0\",\"vinyl\":\"1.1.1\",\"vinyl-fs\":\"2.4.3\",\"watchify\":\"^3.7.0\",\"webpack\":\"^1.13.1\",\"webworkify-webpack\":\"^1.1.3\"},\"engines\":{\"node\":\">=4.0.0\"},\"homepage\":\"https://github.com/mapbox/mapbox-gl-js#readme\",\"license\":\"BSD-3-Clause\",\"main\":\"js/mapbox-gl.js\",\"name\":\"mapbox-gl\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/mapbox/mapbox-gl-js.git\"},\"scripts\":{\"build\":\"npm run build-docs # invoked by publisher when publishing docs on the mb-pages branch\",\"build-dev\":\"browserify js/mapbox-gl.js --debug --standalone mapboxgl > dist/mapbox-gl-dev.js && tap --no-coverage test/build/dev.test.js\",\"build-docs\":\"documentation build --github --format html --config documentation.yml --theme ./docs/_theme --output docs/api/\",\"build-min\":\"browserify js/mapbox-gl.js --debug --transform unassertify --plugin [minifyify --map mapbox-gl.js.map --output dist/mapbox-gl.js.map] --standalone mapboxgl > dist/mapbox-gl.js && tap --no-coverage test/build/min.test.js\",\"build-token\":\"browserify debug/access-token.js --debug --transform envify > debug/access-token-generated.js\",\"lint\":\"eslint  --ignore-path .gitignore js test bench docs/_posts/examples/*.html\",\"open-changed-examples\":\"git diff --name-only mb-pages HEAD -- docs/_posts/examples/*.html | awk '{print \\\"http://127.0.0.1:4000/mapbox-gl-js/example/\\\" substr($0,33,length($0)-37)}' | xargs open\",\"start\":\"run-p build-token watch-dev watch-bench start-server\",\"start-bench\":\"run-p build-token watch-bench start-server\",\"start-debug\":\"run-p build-token watch-dev start-server\",\"start-docs\":\"npm run build-min && npm run build-docs && jekyll serve --watch\",\"start-server\":\"st --no-cache --localhost --port 9966 --index index.html .\",\"test\":\"npm run lint && tap --reporter dot test/js test/build/webpack.test.js\",\"test-suite\":\"node test/render.test.js && node test/query.test.js\",\"watch-bench\":\"node bench/download-data.js && watchify bench/index.js --plugin [minifyify --no-map] --transform [babelify --presets react] --transform unassertify --transform envify --outfile bench/index-generated.js --verbose\",\"watch-dev\":\"watchify js/mapbox-gl.js --debug --standalone mapboxgl --outfile dist/mapbox-gl-dev.js --verbose\"},\"version\":\"0.23.0\"}\n\n/***/ }),\n/* 1339 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Canvas = __webpack_require__(1340);\nvar util = __webpack_require__(6);\nvar browser = __webpack_require__(37);\nvar window = __webpack_require__(37).window;\nvar Evented = __webpack_require__(47);\nvar DOM = __webpack_require__(48);\n\nvar Style = __webpack_require__(624);\nvar AnimationLoop = __webpack_require__(642);\nvar Painter = __webpack_require__(1399);\n\nvar Transform = __webpack_require__(1411);\nvar Hash = __webpack_require__(1412);\n\nvar bindHandlers = __webpack_require__(1413);\n\nvar Camera = __webpack_require__(1421);\nvar LngLat = __webpack_require__(82);\nvar LngLatBounds = __webpack_require__(219);\nvar Point = __webpack_require__(11);\nvar Attribution = __webpack_require__(654);\n\nvar defaultMinZoom = 0;\nvar defaultMaxZoom = 20;\nvar defaultOptions = {\n    center: [0, 0],\n    zoom: 0,\n    bearing: 0,\n    pitch: 0,\n\n    minZoom: defaultMinZoom,\n    maxZoom: defaultMaxZoom,\n\n    interactive: true,\n\n    scrollZoom: true,\n    boxZoom: true,\n    dragRotate: true,\n    dragPan: true,\n    keyboard: true,\n    doubleClickZoom: true,\n    touchZoomRotate: true,\n\n    bearingSnap: 7,\n\n    hash: false,\n\n    attributionControl: true,\n\n    failIfMajorPerformanceCaveat: false,\n    preserveDrawingBuffer: false,\n\n    trackResize: true\n};\n\n/**\n * The `Map` object represents the map on your page. It exposes methods\n * and properties that enable you to programmatically change the map,\n * and fires events as users interact with it.\n *\n * You create a `Map` by specifying a `container` and other options.\n * Then Mapbox GL JS initializes the map on the page and returns your `Map`\n * object.\n *\n * The `Map` class mixes in [`Evented`](#Evented) methods.\n *\n * @class Map\n * @param {Object} options\n * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`.\n * @param {number} [options.minZoom=0] The minimum zoom level of the map (1-20).\n * @param {number} [options.maxZoom=20] The maximum zoom level of the map (1-20).\n * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to\n * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to\n * such JSON.\n *\n * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`,\n * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following\n * [the predefined Mapbox styles](https://www.mapbox.com/maps/):\n *\n *  * `mapbox://styles/mapbox/streets-v9`\n *  * `mapbox://styles/mapbox/outdoors-v9`\n *  * `mapbox://styles/mapbox/light-v9`\n *  * `mapbox://styles/mapbox/dark-v9`\n *  * `mapbox://styles/mapbox/satellite-v9`\n *  * `mapbox://styles/mapbox/satellite-streets-v9`\n *\n * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, and bearing) will be synced with the hash fragment of the page's URL.\n *   For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1`.\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.\n * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's\n *   bearing (rotation) will snap to north. For example, with a `bearingSnap` of 7, if the user rotates\n *   the map within 7 degrees of north, the map will automatically snap to exact north.\n * @param {Array<string>} [options.classes] Mapbox style class names with which to initialize the map.\n *   Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n *   in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n *   [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n * @param {boolean} [options.attributionControl=true] If `true`, an [Attribution](#Attribution) control will be added to the map.\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox\n *   GL JS would be dramatically worse than expected (i.e. a software renderer would be used).\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.\n * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds.\n * @param {boolean} [options.scrollZoom=true] If `true`, the \"scroll to zoom\" interaction is enabled (see [`ScrollZoomHandler`](#ScrollZoomHandler)).\n * @param {boolean} [options.boxZoom=true] If `true`, the \"box zoom\" interaction is enabled (see [`BoxZoomHandler`](#BoxZoomHandler)).\n * @param {boolean} [options.dragRotate=true] If `true`, the \"drag to rotate\" interaction is enabled (see [`DragRotateHandler`](#DragRotateHandler)).\n * @param {boolean} [options.dragPan=true] If `true`, the \"drag to pan\" interaction is enabled (see [`DragPanHandler`](#DragPanHandler)).\n * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see [`KeyboardHandler`](#KeyboardHandler)).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, the \"double click to zoom\" interaction is enabled (see [`DoubleClickZoomHandler`](#DoubleClickZoomHandler)).\n * @param {boolean} [options.touchZoomRotate=true] If `true`, the \"pinch to rotate and zoom\" interaction is enabled (see [`TouchZoomRotateHandler`](#TouchZoomRotateHandler)).\n * @param {boolean} [options.trackResize=true]  If `true`, the map will automatically resize when the browser window resizes.\n * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]`.\n * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @example\n * var map = new mapboxgl.Map({\n *   container: 'map',\n *   center: [-122.420679, 37.772537],\n *   zoom: 13,\n *   style: style_object,\n *   hash: true\n * });\n */\nvar Map = module.exports = function(options) {\n\n    options = util.extend({}, defaultOptions, options);\n\n    this._interactive = options.interactive;\n    this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n    this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n    this._trackResize = options.trackResize;\n    this._bearingSnap = options.bearingSnap;\n\n    if (typeof options.container === 'string') {\n        this._container = document.getElementById(options.container);\n    } else {\n        this._container = options.container;\n    }\n\n    this.animationLoop = new AnimationLoop();\n    this.transform = new Transform(options.minZoom, options.maxZoom);\n\n    if (options.maxBounds) {\n        this.setMaxBounds(options.maxBounds);\n    }\n\n    util.bindAll([\n        '_forwardStyleEvent',\n        '_forwardSourceEvent',\n        '_forwardLayerEvent',\n        '_forwardTileEvent',\n        '_onStyleLoad',\n        '_onStyleChange',\n        '_onSourceAdd',\n        '_onSourceRemove',\n        '_onSourceUpdate',\n        '_onWindowOnline',\n        '_onWindowResize',\n        '_update',\n        '_render'\n    ], this);\n\n    this._setupContainer();\n    this._setupPainter();\n\n    this.on('move', this._update.bind(this, false));\n    this.on('zoom', this._update.bind(this, true));\n    this.on('moveend', function() {\n        this.animationLoop.set(300); // text fading\n        this._rerender();\n    }.bind(this));\n\n    if (typeof window !== 'undefined') {\n        window.addEventListener('online', this._onWindowOnline, false);\n        window.addEventListener('resize', this._onWindowResize, false);\n    }\n\n    bindHandlers(this, options);\n\n    this._hash = options.hash && (new Hash()).addTo(this);\n    // don't set position from options if set through hash\n    if (!this._hash || !this._hash._onHashChange()) {\n        this.jumpTo({\n            center: options.center,\n            zoom: options.zoom,\n            bearing: options.bearing,\n            pitch: options.pitch\n        });\n    }\n\n    this.stacks = {};\n    this._classes = [];\n\n    this.resize();\n\n    if (options.classes) this.setClasses(options.classes);\n    if (options.style) this.setStyle(options.style);\n    if (options.attributionControl) this.addControl(new Attribution(options.attributionControl));\n\n    var fireError = this.fire.bind(this, 'error');\n    this.on('style.error', fireError);\n    this.on('source.error', fireError);\n    this.on('tile.error', fireError);\n    this.on('layer.error', fireError);\n};\n\nutil.extend(Map.prototype, Evented);\nutil.extend(Map.prototype, Camera.prototype);\nutil.extend(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Adds a [`Control`](#Control) to the map, calling `control.addTo(this)`.\n     *\n     * @param {Control} control The [`Control`](#Control) to add.\n     * @returns {Map} `this`\n     */\n    addControl: function(control) {\n        control.addTo(this);\n        return this;\n    },\n\n    /**\n     * Adds a Mapbox style class to the map.\n     *\n     * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n     * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n     * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n     *\n     * @param {string} klass The style class to add.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    addClass: function(klass, options) {\n        if (this._classes.indexOf(klass) >= 0 || klass === '') return this;\n        this._classes.push(klass);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Removes a Mapbox style class from the map.\n     *\n     * @param {string} klass The style class to remove.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    removeClass: function(klass, options) {\n        var i = this._classes.indexOf(klass);\n        if (i < 0 || klass === '') return this;\n        this._classes.splice(i, 1);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Replaces the map's existing Mapbox style classes with a new array of classes.\n     *\n     * @param {Array<string>} klasses The style classes to set.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    setClasses: function(klasses, options) {\n        var uniqueClasses = {};\n        for (var i = 0; i < klasses.length; i++) {\n            if (klasses[i] !== '') uniqueClasses[klasses[i]] = true;\n        }\n        this._classes = Object.keys(uniqueClasses);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Returns a Boolean indicating whether the map has the\n     * specified Mapbox style class.\n     *\n     * @param {string} klass The style class to test.\n     * @returns {boolean} `true` if the map has the specified style class.\n     */\n    hasClass: function(klass) {\n        return this._classes.indexOf(klass) >= 0;\n    },\n\n    /**\n     * Returns the map's Mapbox style classes.\n     *\n     * @returns {Array<string>} The map's style classes.\n     */\n    getClasses: function() {\n        return this._classes;\n    },\n\n    /**\n     * Resizes the map according to the dimensions of its\n     * `container` element.\n     *\n     * This method must be called after the map's `container` is resized by another script,\n     * or when the map is shown after being initially hidden with CSS.\n     *\n     * @returns {Map} `this`\n     */\n    resize: function() {\n        var width = 0, height = 0;\n\n        if (this._container) {\n            width = this._container.offsetWidth || 400;\n            height = this._container.offsetHeight || 300;\n        }\n\n        this._canvas.resize(width, height);\n        this.transform.resize(width, height);\n        this.painter.resize(width, height);\n\n        return this\n            .fire('movestart')\n            .fire('move')\n            .fire('resize')\n            .fire('moveend');\n    },\n\n    /**\n     * Returns the map's geographical bounds.\n     *\n     * @returns {LngLatBounds} The map's geographical bounds.\n     */\n    getBounds: function() {\n        var bounds = new LngLatBounds(\n            this.transform.pointLocation(new Point(0, 0)),\n            this.transform.pointLocation(this.transform.size));\n\n        if (this.transform.angle || this.transform.pitch) {\n            bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0)));\n            bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y)));\n        }\n\n        return bounds;\n    },\n\n    /**\n     * Sets or clears the map's geographical bounds.\n     *\n     * Pan and zoom operations are constrained within these bounds.\n     * If a pan or zoom is performed that would\n     * display regions outside these bounds, the map will\n     * instead display a position and zoom level\n     * as close as possible to the operation's request while still\n     * remaining within the bounds.\n     *\n     * @param {LngLatBoundsLike | null | undefined} lnglatbounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.\n     * @returns {Map} `this`\n     */\n    setMaxBounds: function (lnglatbounds) {\n        if (lnglatbounds) {\n            var b = LngLatBounds.convert(lnglatbounds);\n            this.transform.lngRange = [b.getWest(), b.getEast()];\n            this.transform.latRange = [b.getSouth(), b.getNorth()];\n            this.transform._constrain();\n            this._update();\n        } else if (lnglatbounds === null || lnglatbounds === undefined) {\n            this.transform.lngRange = [];\n            this.transform.latRange = [];\n            this._update();\n        }\n        return this;\n\n    },\n    /**\n     * Sets or clears the map's minimum zoom level.\n     * If the map's current zoom level is lower than the new minimum,\n     * the map will zoom to the new minimum.\n     *\n     * @param {?number} minZoom The minimum zoom level to set (0-20).\n     *   If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0).\n     * @returns {Map} `this`\n     */\n    setMinZoom: function(minZoom) {\n\n        minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n        if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n            this.transform.minZoom = minZoom;\n            this._update();\n\n            if (this.getZoom() < minZoom) this.setZoom(minZoom);\n\n            return this;\n\n        } else throw new Error('minZoom must be between ' + defaultMinZoom + ' and the current maxZoom, inclusive');\n    },\n\n    /**\n     * Sets or clears the map's maximum zoom level.\n     * If the map's current zoom level is higher than the new maximum,\n     * the map will zoom to the new maximum.\n     *\n     * @param {?number} maxZoom The maximum zoom level to set (0-20).\n     *   If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 20).\n     * @returns {Map} `this`\n     */\n    setMaxZoom: function(maxZoom) {\n\n        maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n        if (maxZoom >= this.transform.minZoom && maxZoom <= defaultMaxZoom) {\n            this.transform.maxZoom = maxZoom;\n            this._update();\n\n            if (this.getZoom() > maxZoom) this.setZoom(maxZoom);\n\n            return this;\n\n        } else throw new Error('maxZoom must be between the current minZoom and ' + defaultMaxZoom + ', inclusive');\n    },\n    /**\n     * Returns a [`Point`](#Point) representing pixel coordinates, relative to the map's `container`,\n     * that correspond to the specified geographical location.\n     *\n     * @param {LngLatLike} lnglat The geographical location to project.\n     * @returns {Point} The [`Point`](#Point) corresponding to `lnglat`, relative to the map's `container`.\n     */\n    project: function(lnglat) {\n        return this.transform.locationPoint(LngLat.convert(lnglat));\n    },\n\n    /**\n     * Returns a [`LngLat`](#LngLat) representing geographical coordinates that correspond\n     * to the specified pixel coordinates.\n     *\n     * @param {PointLike} point The pixel coordinates to unproject.\n     * @returns {LngLat} The [`LngLat`](#LngLat) corresponding to `point`.\n     */\n    unproject: function(point) {\n        return this.transform.pointLocation(Point.convert(point));\n    },\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n     * representing visible features that satisfy the query parameters.\n     *\n     * @param {PointLike|Array<PointLike>} [geometry] - The geometry of the query region:\n     * either a single point or southwest and northeast points describing a bounding box.\n     * Omitting this parameter (i.e. calling [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures) with zero arguments,\n     * or with only a `parameters` argument) is equivalent to passing a bounding box encompassing the entire\n     * map viewport.\n     * @param {Object} [parameters]\n     * @param {Array<string>} [parameters.layers] An array of style layer IDs for the query to inspect.\n     *   Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.\n     * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     *   to limit query results.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n     *\n     * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only\n     * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported).\n     *\n     * Each feature includes a top-level `layer` property whose value is an object representing the style layer to\n     * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated\n     * for the given zoom level and feature.\n     *\n     * Only visible features are returned. The topmost rendered feature appears first in the returned array, and\n     * subsequent features are sorted by descending z-order. Features that are rendered multiple times (due to wrapping\n     * across the antimeridian at low zoom levels) are returned only once (though subject to the following caveat).\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and, as a result, features may appear multiple times in query\n     * results when they span multiple tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     *\n     * @example\n     * // Find all features at a point\n     * var features = map.queryRenderedFeatures(\n     *   [20, 35],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a static bounding box\n     * var features = map.queryRenderedFeatures(\n     *   [[10, 20], [30, 50]],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a bounding box around a point\n     * var width = 10;\n     * var height = 20;\n     * var features = map.queryRenderedFeatures([\n     *   [point.x - width / 2, point.y - height / 2],\n     *   [point.x + width / 2, point.y + height / 2]\n     * ], { layers: ['my-layer-name'] });\n     *\n     * @example\n     * // Query all rendered features from a single layer\n     * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });\n     */\n    queryRenderedFeatures: function() {\n        var params = {};\n        var geometry;\n\n        if (arguments.length === 2) {\n            geometry = arguments[0];\n            params = arguments[1];\n        } else if (arguments.length === 1 && isPointLike(arguments[0])) {\n            geometry = arguments[0];\n        } else if (arguments.length === 1) {\n            params = arguments[0];\n        }\n\n        return this.style.queryRenderedFeatures(\n            this._makeQueryGeometry(geometry),\n            params,\n            this.transform.zoom,\n            this.transform.angle\n        );\n\n        function isPointLike(input) {\n            return input instanceof Point || Array.isArray(input);\n        }\n    },\n\n    _makeQueryGeometry: function(pointOrBox) {\n        if (pointOrBox === undefined) {\n            // bounds was omitted: use full viewport\n            pointOrBox = [\n                Point.convert([0, 0]),\n                Point.convert([this.transform.width, this.transform.height])\n            ];\n        }\n\n        var queryGeometry;\n        var isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number';\n\n        if (isPoint) {\n            var point = Point.convert(pointOrBox);\n            queryGeometry = [point];\n        } else {\n            var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])];\n            queryGeometry = [\n                box[0],\n                new Point(box[1].x, box[0].y),\n                box[1],\n                new Point(box[0].x, box[1].y),\n                box[0]\n            ];\n        }\n\n        queryGeometry = queryGeometry.map(function(p) {\n            return this.transform.pointCoordinate(p);\n        }.bind(this));\n\n        return queryGeometry;\n    },\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n     * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.\n     *\n     * @param {string} sourceID The ID of the vector tile or GeoJSON source to query.\n     * @param {Object} parameters\n     * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile\n     *   sources, this parameter is required.* For GeoJSON sources, it is ignored.\n     * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     *   to limit query results.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n     *\n     * In contrast to [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures), this function\n     * returns all features matching the query parameters,\n     * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded\n     * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently\n     * visible viewport.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and, as a result, features may appear multiple times in query\n     * results when they span multiple tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     */\n    querySourceFeatures: function(sourceID, params) {\n        return this.style.querySourceFeatures(sourceID, params);\n    },\n\n    /**\n     * Replaces the map's Mapbox style object with a new value.\n     *\n     * @param {Object|string} style A JSON object conforming to the schema described in the\n     *   [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON.\n     * @returns {Map} `this`\n     */\n    setStyle: function(style) {\n        if (this.style) {\n            this.style\n                .off('load', this._onStyleLoad)\n                .off('error', this._forwardStyleEvent)\n                .off('change', this._onStyleChange)\n                .off('source.add', this._onSourceAdd)\n                .off('source.remove', this._onSourceRemove)\n                .off('source.load', this._onSourceUpdate)\n                .off('source.error', this._forwardSourceEvent)\n                .off('source.change', this._onSourceUpdate)\n                .off('layer.add', this._forwardLayerEvent)\n                .off('layer.remove', this._forwardLayerEvent)\n                .off('layer.error', this._forwardLayerEvent)\n                .off('tile.add', this._forwardTileEvent)\n                .off('tile.remove', this._forwardTileEvent)\n                .off('tile.load', this._update)\n                .off('tile.error', this._forwardTileEvent)\n                .off('tile.stats', this._forwardTileEvent)\n                ._remove();\n\n            this.off('rotate', this.style._redoPlacement);\n            this.off('pitch', this.style._redoPlacement);\n        }\n\n        if (!style) {\n            this.style = null;\n            return this;\n        } else if (style instanceof Style) {\n            this.style = style;\n        } else {\n            this.style = new Style(style, this.animationLoop);\n        }\n\n        this.style\n            .on('load', this._onStyleLoad)\n            .on('error', this._forwardStyleEvent)\n            .on('change', this._onStyleChange)\n            .on('source.add', this._onSourceAdd)\n            .on('source.remove', this._onSourceRemove)\n            .on('source.load', this._onSourceUpdate)\n            .on('source.error', this._forwardSourceEvent)\n            .on('source.change', this._onSourceUpdate)\n            .on('layer.add', this._forwardLayerEvent)\n            .on('layer.remove', this._forwardLayerEvent)\n            .on('layer.error', this._forwardLayerEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.load', this._update)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this.on('rotate', this.style._redoPlacement);\n        this.on('pitch', this.style._redoPlacement);\n\n        return this;\n    },\n\n    /**\n     * Returns the map's Mapbox style object, which can be used to recreate the map's style.\n     *\n     * @returns {Object} The map's style object.\n     */\n    getStyle: function() {\n        if (this.style) {\n            return this.style.serialize();\n        }\n    },\n\n    /**\n     * Adds a source to the map's style.\n     *\n     * @param {string} id The ID of the source to add. Must not conflict with existing sources.\n     * @param {Object} source The source object, conforming to the\n     * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources).\n     * @param {string} source.type The source type, which must be either one of the core Mapbox GL source types defined in the style specification or a custom type that has been added to the map with {@link Map#addSourceType}.\n     * @fires source.add\n     * @returns {Map} `this`\n     */\n    addSource: function(id, source) {\n        this.style.addSource(id, source);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Adds a [custom source type](#Custom Sources), making it available for use with\n     * {@link Map#addSource}.\n     * @private\n     * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.\n     * @param {Function} SourceType A {@link Source} constructor.\n     * @param {Function} callback Called when the source type is ready or with an error argument if there is an error.\n     */\n    addSourceType: function (name, SourceType, callback) {\n        return this.style.addSourceType(name, SourceType, callback);\n    },\n\n    /**\n     * Removes a source from the map's style.\n     *\n     * @param {string} id The ID of the source to remove.\n     * @fires source.remove\n     * @returns {Map} `this`\n     */\n    removeSource: function(id) {\n        this.style.removeSource(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the source with the specified ID in the map's style.\n     *\n     * @param {string} id The ID of the source to get.\n     * @returns {?Object} The style source with the specified ID, or `undefined`\n     *   if the ID corresponds to no existing sources.\n     */\n    getSource: function(id) {\n        return this.style.getSource(id);\n    },\n\n    /**\n     * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers)\n     * to the map's style.\n     *\n     * A layer defines styling for data from a specified source.\n     *\n     * @param {Object} layer The style layer to add, conforming to the Mapbox Style Specification's\n     *   [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers).\n     * @param {string} [before] The ID of an existing layer to insert the new layer before.\n     *   If this argument is omitted, the layer will be appended to the end of the layers array.\n     * @fires layer.add\n     * @returns {Map} `this`\n     */\n    addLayer: function(layer, before) {\n        this.style.addLayer(layer, before);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Removes a layer from the map's style.\n     *\n     * Also removes any layers which refer to the specified layer via a\n     * [`ref` property](https://www.mapbox.com/mapbox-gl-style-spec/#layer-ref).\n     *\n     * @param {string} id The ID of the layer to remove.\n     * @throws {Error} if no layer with the specified `id` exists.\n     * @fires layer.remove\n     * @returns {Map} `this`\n     */\n    removeLayer: function(id) {\n        this.style.removeLayer(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the layer with the specified ID in the map's style.\n     *\n     * @param {string} id The ID of the layer to get.\n     * @returns {?Object} The layer with the specified ID, or `undefined`\n     *   if the ID corresponds to no existing layers.\n     */\n    getLayer: function(id) {\n        return this.style.getLayer(id);\n    },\n\n    /**\n     * Sets the filter for the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to which the filter will be applied.\n     * @param {Array} filter The filter, conforming to the Mapbox Style Specification's\n     *   [filter definition](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     * @returns {Map} `this`\n     * @example\n     * map.setFilter('my-layer', ['==', 'name', 'USA']);\n     */\n    setFilter: function(layer, filter) {\n        this.style.setFilter(layer, filter);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Sets the zoom extent for the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to which the zoom extent will be applied.\n     * @param {number} minzoom The minimum zoom to set (0-20).\n     * @param {number} maxzoom The maximum zoom to set (0-20).\n     * @returns {Map} `this`\n     * @example\n     * map.setLayerZoomRange('my-layer', 2, 5);\n     */\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the filter applied to the specified style layer.\n     *\n     * @param {string} layer The ID of the style layer whose filter to get.\n     * @returns {Array} The layer's filter.\n     */\n    getFilter: function(layer) {\n        return this.style.getFilter(layer);\n    },\n\n    /**\n     * Sets the value of a paint property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to set the paint property in.\n     * @param {string} name The name of the paint property to set.\n     * @param {*} value The value of the paint propery to set.\n     *   Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @param {string=} klass A style class specifier for the paint property.\n     * @returns {Map} `this`\n     * @example\n     * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n     */\n    setPaintProperty: function(layer, name, value, klass) {\n        this.style.setPaintProperty(layer, name, value, klass);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the value of a paint property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to get the paint property from.\n     * @param {string} name The name of a paint property to get.\n     * @param {string=} klass A class specifier for the paint property.\n     * @returns {*} The value of the specified paint property.\n     */\n    getPaintProperty: function(layer, name, klass) {\n        return this.style.getPaintProperty(layer, name, klass);\n    },\n\n    /**\n     * Sets the value of a layout property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to set the layout property in.\n     * @param {string} name The name of the layout property to set.\n     * @param {*} value The value of the layout propery. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @returns {Map} `this`\n     * @example\n     * map.setLayoutProperty('my-layer', 'visibility', 'none');\n     */\n    setLayoutProperty: function(layer, name, value) {\n        this.style.setLayoutProperty(layer, name, value);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the value of a layout property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to get the layout property from.\n     * @param {string} name The name of the layout property to get.\n     * @returns {*} The value of the specified layout property.\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.style.getLayoutProperty(layer, name);\n    },\n\n    /**\n     * Returns the map's containing HTML element.\n     *\n     * @returns {HTMLElement} The map's container.\n     */\n    getContainer: function() {\n        return this._container;\n    },\n\n    /**\n     * Returns the HTML element containing the map's `<canvas>` element.\n     *\n     * If you want to add non-GL overlays to the map, you should append them to this element.\n     *\n     * This is the element to which event bindings for map interactivity (such as panning and zooming) are\n     * attached. It will receive bubbled events from child elements such as the `<canvas>`, but not from\n     * map controls.\n     *\n     * @returns {HTMLElement} The container of the map's `<canvas>`.\n     */\n    getCanvasContainer: function() {\n        return this._canvasContainer;\n    },\n\n    /**\n     * Returns the map's `<canvas>` element.\n     *\n     * @returns {HTMLCanvasElement} The map's `<canvas>` element.\n     */\n    getCanvas: function() {\n        return this._canvas.getElement();\n    },\n\n    _setupContainer: function() {\n        var container = this._container;\n        container.classList.add('mapboxgl-map');\n\n        var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n        if (this._interactive) {\n            canvasContainer.classList.add('mapboxgl-interactive');\n        }\n        this._canvas = new Canvas(this, canvasContainer);\n\n        var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n        var corners = this._controlCorners = {};\n        ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) {\n            corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer);\n        });\n    },\n\n    _setupPainter: function() {\n        var gl = this._canvas.getWebGLContext({\n            failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n            preserveDrawingBuffer: this._preserveDrawingBuffer\n        });\n\n        if (!gl) {\n            this.fire('error', { error: new Error('Failed to initialize WebGL') });\n            return;\n        }\n\n        this.painter = new Painter(gl, this.transform);\n    },\n\n    /**\n     * Fired when the WebGL context is lost.\n     *\n     * @event webglcontextlost\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {WebGLContextEvent} originalEvent The original DOM event.\n     */\n    _contextLost: function(event) {\n        event.preventDefault();\n        if (this._frameId) {\n            browser.cancelFrame(this._frameId);\n        }\n        this.fire('webglcontextlost', {originalEvent: event});\n    },\n\n    /**\n     * Fired when the WebGL context is restored.\n     *\n     * @event webglcontextrestored\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {WebGLContextEvent} originalEvent The original DOM event.\n     */\n    _contextRestored: function(event) {\n        this._setupPainter();\n        this.resize();\n        this._update();\n        this.fire('webglcontextrestored', {originalEvent: event});\n    },\n\n    /**\n     * Returns a Boolean indicating whether the map is fully loaded.\n     *\n     * Returns `false` if the style is not yet fully loaded,\n     * or if there has been a change to the sources or style that\n     * has not yet fully loaded.\n     *\n     * @returns {boolean} A Boolean indicating whether the map is fully loaded.\n     */\n    loaded: function() {\n        if (this._styleDirty || this._sourcesDirty)\n            return false;\n        if (!this.style || !this.style.loaded())\n            return false;\n        return true;\n    },\n\n    /**\n     * Update this map's style and sources, and re-render the map.\n     *\n     * @param {boolean} updateStyle mark the map's style for reprocessing as\n     * well as its sources\n     * @returns {Map} this\n     * @private\n     */\n    _update: function(updateStyle) {\n        if (!this.style) return this;\n\n        this._styleDirty = this._styleDirty || updateStyle;\n        this._sourcesDirty = true;\n\n        this._rerender();\n\n        return this;\n    },\n\n    /**\n     * Call when a (re-)render of the map is required, e.g. when the\n     * user panned or zoomed,f or new data is available.\n     * @returns {Map} this\n     * @private\n     */\n    _render: function() {\n        try {\n            if (this.style && this._styleDirty) {\n                this._styleDirty = false;\n                this.style.update(this._classes, this._classOptions);\n                this._classOptions = null;\n                this.style._recalculate(this.transform.zoom);\n            }\n\n            if (this.style && this._sourcesDirty) {\n                this._sourcesDirty = false;\n                this.style._updateSources(this.transform);\n            }\n\n            this.painter.render(this.style, {\n                debug: this.showTileBoundaries,\n                showOverdrawInspector: this._showOverdrawInspector,\n                vertices: this.vertices,\n                rotating: this.rotating,\n                zooming: this.zooming\n            });\n\n            this.fire('render');\n\n            if (this.loaded() && !this._loaded) {\n                this._loaded = true;\n                this.fire('load');\n            }\n\n            this._frameId = null;\n\n            if (!this.animationLoop.stopped()) {\n                this._styleDirty = true;\n            }\n\n            if (this._sourcesDirty || this._repaint || this._styleDirty) {\n                this._rerender();\n            }\n\n        } catch (error) {\n            this.fire('error', {error: error});\n        }\n\n        return this;\n    },\n\n    /**\n     * Destroys the map's underlying resources, including web workers and DOM elements.\n     *\n     * After calling this method, you must not call any other methods on the map.\n     */\n    remove: function() {\n        if (this._hash) this._hash.remove();\n        browser.cancelFrame(this._frameId);\n        this.setStyle(null);\n        if (typeof window !== 'undefined') {\n            window.removeEventListener('resize', this._onWindowResize, false);\n        }\n        var extension = this.painter.gl.getExtension('WEBGL_lose_context');\n        if (extension) extension.loseContext();\n        removeNode(this._canvasContainer);\n        removeNode(this._controlContainer);\n        this._container.classList.remove('mapboxgl-map');\n    },\n\n    _rerender: function() {\n        if (this.style && !this._frameId) {\n            this._frameId = browser.frame(this._render);\n        }\n    },\n\n    _forwardStyleEvent: function(e) {\n        this.fire('style.' + e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _onStyleLoad: function(e) {\n        if (this.transform.unmodified) {\n            this.jumpTo(this.style.stylesheet);\n        }\n        this.style.update(this._classes, {transition: false});\n        this._forwardStyleEvent(e);\n    },\n\n    _onStyleChange: function(e) {\n        this._update(true);\n        this._forwardStyleEvent(e);\n    },\n\n    _onSourceAdd: function(e) {\n        var source = e.source;\n        if (source.onAdd)\n            source.onAdd(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceRemove: function(e) {\n        var source = e.source;\n        if (source.onRemove)\n            source.onRemove(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceUpdate: function(e) {\n        this._update();\n        this._forwardSourceEvent(e);\n    },\n\n    _onWindowOnline: function() {\n        this._update();\n    },\n\n    _onWindowResize: function() {\n        if (this._trackResize) {\n            this.stop().resize()._update();\n        }\n    }\n});\n\nutil.extendAll(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render an outline\n     * around each tile. These tile boundaries are useful for debugging.\n     *\n     * @name showTileBoundaries\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showTileBoundaries: false,\n    get showTileBoundaries() { return this._showTileBoundaries; },\n    set showTileBoundaries(value) {\n        if (this._showTileBoundaries === value) return;\n        this._showTileBoundaries = value;\n        this._update();\n    },\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render boxes\n     * around all symbols in the data source, revealing which symbols\n     * were rendered or which were hidden due to collisions.\n     * This information is useful for debugging.\n     *\n     * @name showCollisionBoxes\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showCollisionBoxes: false,\n    get showCollisionBoxes() { return this._showCollisionBoxes; },\n    set showCollisionBoxes(value) {\n        if (this._showCollisionBoxes === value) return;\n        this._showCollisionBoxes = value;\n        this.style._redoPlacement();\n    },\n\n    /*\n     * Gets and sets a Boolean indicating whether the map should color-code\n     * each fragment to show how many times it has been shaded.\n     * White fragments have been shaded 8 or more times.\n     * Black fragments have been shaded 0 times.\n     * This information is useful for debugging.\n     *\n     * @name showOverdraw\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showOverdrawInspector: false,\n    get showOverdrawInspector() { return this._showOverdrawInspector; },\n    set showOverdrawInspector(value) {\n        if (this._showOverdrawInspector === value) return;\n        this._showOverdrawInspector = value;\n        this._update();\n    },\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will\n     * continuously repaint. This information is useful for analyzing performance.\n     *\n     * @name repaint\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _repaint: false,\n    get repaint() { return this._repaint; },\n    set repaint(value) { this._repaint = value; this._update(); },\n\n    // show vertices\n    _vertices: false,\n    get vertices() { return this._vertices; },\n    set vertices(value) { this._vertices = value; this._update(); }\n});\n\nfunction removeNode(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\n\n/**\n * A [`LngLat`](#LngLat) object or an array of two numbers representing longitude and latitude.\n *\n * @typedef {(LngLat | Array<number>)} LngLatLike\n * @example\n * var v1 = new mapboxgl.LngLat(-122.420679, 37.772537);\n * var v2 = [-122.420679, 37.772537];\n */\n\n/**\n * A [`LngLatBounds`](#LngLatBounds) object or an array of [`LngLatLike`](#LngLatLike) objects.\n *\n * @typedef {(LngLatBounds | Array<LngLatLike>)} LngLatBoundsLike\n * @example\n * var v1 = new mapboxgl.LngLatBounds(\n *   new mapboxgl.LngLat(-73.9876, 40.7661),\n *   new mapboxgl.LngLat(-73.9397, 40.8002)\n * );\n * var v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002])\n * var v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n */\n\n/**\n * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has\n * `x` and `y` properties representing coordinates.\n *\n * @typedef {Object} Point\n */\n\n/**\n * A [`Point`](#Point) or an array of two numbers representing `x` and `y` coordinates.\n *\n * @typedef {(Point | Array<number>)} PointLike\n */\n\n/**\n * Options common to {@link Map#addClass}, {@link Map#removeClass},\n * and {@link Map#setClasses}, controlling\n * whether or not to smoothly transition property changes triggered by a class change.\n *\n * @typedef {Object} StyleOptions\n * @property {boolean} transition If `true`, property changes will smootly transition.\n */\n\n/**\n * Fired whenever the map is drawn to the screen, as the result of\n *\n * - a change to the map's position, zoom, pitch, or bearing\n * - a change to the map's style\n * - a change to a GeoJSON source\n * - the loading of a vector tile, GeoJSON file, glyph, or sprite\n *\n * @event render\n * @memberof Map\n * @instance\n */\n\n/**\n * Fired when a point device (usually a mouse) leaves the map's canvas.\n *\n * @event mouseout\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed within the map.\n *\n * @event mousedown\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is released within the map.\n *\n * @event mouseup\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is moved within the map.\n *\n * @event mousemove\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a touch point is placed on the map.\n *\n * @event touchstart\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is removed from the map.\n *\n * @event touchend\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is moved within the map.\n *\n * @event touchmove\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point has been disrupted.\n *\n * @event touchcancel\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed and released at the same point on the map.\n *\n * @event click\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is clicked twice at the same point on the map.\n *\n * @event dblclick\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when the right button of the mouse is clicked or the context menu key is pressed within the map.\n *\n * @event contextmenu\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired immediately after all necessary resources have been downloaded\n * and the first visually complete rendering of the map has occurred.\n *\n * @event load\n * @memberof Map\n * @instance\n * @type {Object}\n */\n\n/**\n * Fired just before the map begins a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event movestart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one view to\n * another, as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event move\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired just after the map completes a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event moveend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n /**\n  * Fired if any error occurs. This is GL JS's primary error reporting\n  * mechanism. We use an event instead of `throw` to better accommodate\n  * asyncronous operations. If no listeners are bound to the `error` event, the\n  * error will be printed to the console.\n  *\n  * @event error\n  * @memberof Map\n  * @instance\n  * @property {{error: {message: string}}} data\n  */\n\n\n/***/ }),\n/* 1340 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar isSupported = __webpack_require__(267);\n\nmodule.exports = Canvas;\n\nfunction Canvas(parent, container) {\n    this.canvas = document.createElement('canvas');\n\n    if (parent && container) {\n        this.canvas.style.position = 'absolute';\n        this.canvas.classList.add('mapboxgl-canvas');\n        this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false);\n        this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false);\n        this.canvas.setAttribute('tabindex', 0);\n        container.appendChild(this.canvas);\n    }\n}\n\nCanvas.prototype.resize = function(width, height) {\n    var pixelRatio = window.devicePixelRatio || 1;\n\n    // Request the required canvas size taking the pixelratio into account.\n    this.canvas.width = pixelRatio * width;\n    this.canvas.height = pixelRatio * height;\n\n    // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n    this.canvas.style.width = width + 'px';\n    this.canvas.style.height = height + 'px';\n};\n\nCanvas.prototype.getWebGLContext = function(attributes) {\n    attributes = util.extend({}, attributes, isSupported.webGLContextAttributes);\n\n    return this.canvas.getContext('webgl', attributes) ||\n        this.canvas.getContext('experimental-webgl', attributes);\n};\n\nCanvas.prototype.getElement = function() {\n    return this.canvas;\n};\n\n\n/***/ }),\n/* 1341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar interpolate = __webpack_require__(216);\n\nmodule.exports = StyleTransition;\n\n/*\n * Represents a transition between two declarations\n */\nfunction StyleTransition(reference, declaration, oldTransition, value) {\n\n    this.declaration = declaration;\n    this.startTime = this.endTime = (new Date()).getTime();\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.interp = interpZoomTransitioned;\n    } else {\n        this.interp = interpolate[reference.type];\n    }\n\n    this.oldTransition = oldTransition;\n    this.duration = value.duration || 0;\n    this.delay = value.delay || 0;\n\n    if (!this.instant()) {\n        this.endTime = this.startTime + this.duration + this.delay;\n        this.ease = util.easeCubicInOut;\n    }\n\n    if (oldTransition && oldTransition.endTime <= this.startTime) {\n        // Old transition is done running, so we can\n        // delete its reference to its old transition.\n\n        delete oldTransition.oldTransition;\n    }\n}\n\nStyleTransition.prototype.instant = function() {\n    return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n};\n\n/*\n * Return the value of the transitioning property at zoom level `z` and optional time `t`\n */\nStyleTransition.prototype.calculate = function(globalProperties, featureProperties) {\n    var value = this.declaration.calculate(\n        util.extend({}, globalProperties, {duration: this.duration}),\n        featureProperties\n    );\n\n    if (this.instant()) return value;\n\n    var t = globalProperties.time || Date.now();\n\n    if (t < this.endTime) {\n        var oldValue = this.oldTransition.calculate(\n            util.extend({}, globalProperties, {time: this.startTime}),\n            featureProperties\n        );\n        var eased = this.ease((t - this.startTime - this.delay) / this.duration);\n        value = this.interp(oldValue, value, eased);\n    }\n\n    return value;\n\n};\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction interpZoomTransitioned(from, to, t) {\n    if ((from && from.to) === undefined || (to && to.to) === undefined) {\n        return undefined;\n    } else {\n        return {\n            from: from.to,\n            fromScale: from.toScale,\n            to: to.to,\n            toScale: to.toScale,\n            t: t\n        };\n    }\n}\n\n\n/***/ }),\n/* 1342 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar MapboxGLFunction = __webpack_require__(309);\nvar parseColor = __webpack_require__(625);\nvar util = __webpack_require__(6);\n\nmodule.exports = StyleDeclaration;\n\nfunction StyleDeclaration(reference, value) {\n    this.value = util.clone(value);\n    this.isFunction = MapboxGLFunction.isFunctionDefinition(value);\n\n    // immutable representation of value. used for comparison\n    this.json = JSON.stringify(this.value);\n\n    var parsedValue = reference.type === 'color' && this.value ? parseColor(this.value) : value;\n    this.calculate = MapboxGLFunction[reference.function || 'piecewise-constant'](parsedValue);\n    this.isFeatureConstant = this.calculate.isFeatureConstant;\n    this.isZoomConstant = this.calculate.isZoomConstant;\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.calculate = transitioned(this.calculate);\n    }\n\n    if (!this.isFeatureConstant && !this.isZoomConstant) {\n        this.stopZoomLevels = [];\n        var interpolationAmountStops = [];\n        var stops = this.value.stops;\n        for (var i = 0; i < this.value.stops.length; i++) {\n            var zoom = stops[i][0].zoom;\n            if (this.stopZoomLevels.indexOf(zoom) < 0) {\n                this.stopZoomLevels.push(zoom);\n                interpolationAmountStops.push([zoom, interpolationAmountStops.length]);\n            }\n        }\n\n        this.calculateInterpolationT = MapboxGLFunction.interpolated({\n            stops: interpolationAmountStops,\n            base: value.base\n        });\n    }\n}\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction transitioned(calculate) {\n    return function(globalProperties, featureProperties) {\n        var z = globalProperties.zoom;\n        var zh = globalProperties.zoomHistory;\n        var duration = globalProperties.duration;\n\n        var fraction = z % 1;\n        var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1);\n        var fromScale = 1;\n        var toScale = 1;\n        var mix, from, to;\n\n        if (z > zh.lastIntegerZoom) {\n            mix = fraction + (1 - fraction) * t;\n            fromScale *= 2;\n            from = calculate({zoom: z - 1}, featureProperties);\n            to = calculate({zoom: z}, featureProperties);\n        } else {\n            mix = 1 - (1 - t) * fraction;\n            to = calculate({zoom: z}, featureProperties);\n            from = calculate({zoom: z + 1}, featureProperties);\n            fromScale /= 2;\n        }\n\n        if (from === undefined || to === undefined) {\n            return undefined;\n        } else {\n            return {\n                from: from,\n                fromScale: fromScale,\n                to: to,\n                toScale: toScale,\n                t: mix\n            };\n        }\n    };\n}\n\n\n/***/ }),\n/* 1343 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8]},\"name\":{\"type\":\"string\"},\"metadata\":{\"type\":\"*\"},\"center\":{\"type\":\"array\",\"value\":\"number\"},\"zoom\":{\"type\":\"number\"},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\"},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\"},\"sources\":{\"required\":true,\"type\":\"sources\"},\"sprite\":{\"type\":\"string\"},\"glyphs\":{\"type\":\"string\"},\"transition\":{\"type\":\"transition\"},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\"}},\"sources\":{\"*\":{\"type\":\"source\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"vector\",\"raster\"]},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"*\":{\"type\":\"*\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"geojson\"]},\"data\":{\"type\":\"*\"},\"maxzoom\":{\"type\":\"number\",\"default\":14},\"buffer\":{\"type\":\"number\",\"default\":64},\"tolerance\":{\"type\":\"number\",\"default\":3},\"cluster\":{\"type\":\"boolean\",\"default\":false},\"clusterRadius\":{\"type\":\"number\",\"default\":400},\"clusterMaxZoom\":{\"type\":\"number\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"video\"]},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"image\"]},\"url\":{\"required\":true,\"type\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":[\"fill\",\"line\",\"symbol\",\"circle\",\"raster\",\"background\"]},\"metadata\":{\"type\":\"*\"},\"ref\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"source-layer\":{\"type\":\"string\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22},\"interactive\":{\"type\":\"boolean\",\"default\":false},\"filter\":{\"type\":\"filter\"},\"layout\":{\"type\":\"layout\"},\"paint\":{\"type\":\"paint\"},\"paint.*\":{\"type\":\"paint\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"butt\",\"round\",\"square\"],\"default\":\"butt\"},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"bevel\",\"round\",\"miter\"],\"default\":\"miter\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[{\"line-join\":\"miter\"}]},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[{\"line-join\":\"round\"}]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"point\",\"line\"],\"default\":\"point\"},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"pixels\",\"requires\":[{\"symbol-placement\":\"line\"}]},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\",\"text-field\"]},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"requires\":[\"icon-image\"]},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":false,\"values\":[\"none\",\"both\",\"width\",\"height\"],\"default\":\"none\",\"requires\":[\"icon-image\",\"text-field\"]},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\",\"icon-text-fit\",\"text-field\"]},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"tokens\":true},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"requires\":[\"icon-image\"]},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"requires\":[\"text-field\"]},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"requires\":[\"text-field\"]},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":\"\",\"tokens\":true},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"requires\":[\"text-field\"]},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"left\",\"center\",\"right\"],\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"center\",\"left\",\"right\",\"top\",\"bottom\",\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}]},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":true,\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"none\",\"uppercase\",\"lowercase\"],\"default\":\"none\",\"requires\":[\"text-field\"]},\"text-offset\":{\"type\":\"array\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"]},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\",\"icon-image\"]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_operator\":{\"type\":\"enum\",\"values\":[\"==\",\"!=\",\">\",\">=\",\"<\",\"<=\",\"in\",\"!in\",\"all\",\"any\",\"none\",\"has\",\"!has\"]},\"geometry_type\":{\"type\":\"enum\",\"values\":[\"Point\",\"LineString\",\"Polygon\"]},\"color_operation\":{\"type\":\"enum\",\"values\":[\"lighten\",\"saturate\",\"spin\",\"fade\",\"mix\"]},\"function\":{\"stops\":{\"type\":\"array\",\"required\":true,\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":[\"exponential\",\"interval\",\"categorical\"],\"default\":\"exponential\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":true},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}]},\"fill-outline-color\":{\"type\":\"color\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}]},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"circle-translate\"]},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\"}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}]},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}}}\n\n/***/ }),\n/* 1344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar validateConstants = __webpack_require__(629);\nvar validate = __webpack_require__(127);\nvar latestStyleSpec = __webpack_require__(627);\nvar validateGlyphsURL = __webpack_require__(1347);\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n *     If omitted, the latest style spec is used.\n * @returns {Array<ValidationError>}\n * @example\n *   var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n *   var errors = validate(style);\n */\nfunction validateStyleMin(style, styleSpec) {\n    styleSpec = styleSpec || latestStyleSpec;\n\n    var errors = [];\n\n    errors = errors.concat(validate({\n        key: '',\n        value: style,\n        valueSpec: styleSpec.$root,\n        styleSpec: styleSpec,\n        style: style,\n        objectElementValidators: {\n            glyphs: validateGlyphsURL\n        }\n    }));\n\n    if (styleSpec.$version > 7 && style.constants) {\n        errors = errors.concat(validateConstants({\n            key: 'constants',\n            value: style.constants,\n            style: style,\n            styleSpec: styleSpec\n        }));\n    }\n\n    return sortErrors(errors);\n}\n\nvalidateStyleMin.source = wrapCleanErrors(__webpack_require__(637));\nvalidateStyleMin.layer = wrapCleanErrors(__webpack_require__(634));\nvalidateStyleMin.filter = wrapCleanErrors(__webpack_require__(311));\nvalidateStyleMin.paintProperty = wrapCleanErrors(__webpack_require__(635));\nvalidateStyleMin.layoutProperty = wrapCleanErrors(__webpack_require__(636));\n\nfunction sortErrors(errors) {\n    return [].concat(errors).sort(function (a, b) {\n        return a.line - b.line;\n    });\n}\n\nfunction wrapCleanErrors(inner) {\n    return function() {\n        return sortErrors(inner.apply(this, arguments));\n    };\n}\n\nmodule.exports = validateStyleMin;\n\n\n/***/ }),\n/* 1345 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getType = __webpack_require__(72);\nvar ValidationError = __webpack_require__(41);\n\nmodule.exports = function validateBoolean(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'boolean') {\n        return [new ValidationError(key, value, 'boolean expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 1346 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar getType = __webpack_require__(72);\nvar parseCSSColor = __webpack_require__(192).parseCSSColor;\n\nmodule.exports = function validateColor(options) {\n    var key = options.key;\n    var value = options.value;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'color expected, %s found', type)];\n    }\n\n    if (parseCSSColor(value) === null) {\n        return [new ValidationError(key, value, 'color expected, \"%s\" found', value)];\n    }\n\n    return [];\n};\n\n\n/***/ }),\n/* 1347 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ValidationError = __webpack_require__(41);\nvar validateString = __webpack_require__(638);\n\nmodule.exports = function(options) {\n    var value = options.value;\n    var key = options.key;\n\n    var errors = validateString(options);\n    if (errors.length) return errors;\n\n    if (value.indexOf('{fontstack}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n    }\n\n    if (value.indexOf('{range}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n    }\n\n    return errors;\n};\n\n\n/***/ }),\n/* 1348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction BackgroundStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = BackgroundStyleLayer;\n\nBackgroundStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1349 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction CircleStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = CircleStyleLayer;\n\nCircleStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1350 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction FillStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nFillStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValue.call(this, 'fill-color', globalProperties, featureProperties);\n        } else {\n            return StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties);\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, arguments);\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, 'fill-color', zoom);\n        } else {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, name, zoom);\n        }\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, name);\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, name);\n        }\n    },\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n\n        var isFillHidden = (\n            (this.isPaintValueFeatureConstant('fill-opacity') && this.paint['fill-opacity'] === 0) ||\n            (this.isPaintValueFeatureConstant('fill-color') && this.paint['fill-color'][3] === 0)\n        );\n\n        var isOutlineHidden = (\n            this.isPaintValueFeatureConstant('fill-outline-color') &&\n            this.paint['fill-outline-color'][3] === 0\n        );\n\n        return isFillHidden && isOutlineHidden;\n    }\n\n});\n\nmodule.exports = FillStyleLayer;\n\n\n/***/ }),\n/* 1351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction LineStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = LineStyleLayer;\n\nLineStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var value = StyleLayer.prototype.getPaintValue.apply(this, arguments);\n\n        // If the line is dashed, scale the dash lengths by the line\n        // width at the previous round zoom level.\n        if (value && name === 'line-dasharray') {\n            var flooredZoom = Math.floor(globalProperties.zoom);\n            if (this._flooredZoom !== flooredZoom) {\n                this._flooredZoom = flooredZoom;\n                this._flooredLineWidth = this.getPaintValue('line-width', globalProperties, featureProperties);\n            }\n\n            value.fromScale *= this._flooredLineWidth;\n            value.toScale *= this._flooredLineWidth;\n        }\n\n        return value;\n    }\n});\n\n\n/***/ }),\n/* 1352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction RasterStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = RasterStyleLayer;\n\nRasterStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n/***/ }),\n/* 1353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar StyleLayer = __webpack_require__(103);\n\nfunction SymbolStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = SymbolStyleLayer;\n\nSymbolStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    isHidden: function() {\n        if (StyleLayer.prototype.isHidden.apply(this, arguments)) return true;\n\n        var isTextHidden = this.paint['text-opacity'] === 0 || !this.layout['text-field'];\n        var isIconHidden = this.paint['icon-opacity'] === 0 || !this.layout['icon-image'];\n        if (isTextHidden && isIconHidden) return true;\n\n        return false;\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        if (name === 'text-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('text-rotation-alignment')) {\n            return 'map';\n        } else if (name === 'icon-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('icon-rotation-alignment')) {\n            return 'map';\n        // If unspecified `text-pitch-alignment` inherits `text-rotation-alignment`\n        } else if (name === 'text-pitch-alignment' && !this.getLayoutProperty('text-pitch-alignment')) {\n            return this.getLayoutValue('text-rotation-alignment');\n        } else {\n            return StyleLayer.prototype.getLayoutValue.apply(this, arguments);\n        }\n    }\n\n});\n\n\n/***/ }),\n/* 1354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(47);\nvar ajax = __webpack_require__(91);\nvar browser = __webpack_require__(37);\nvar normalizeURL = __webpack_require__(128).normalizeSpriteURL;\n\nmodule.exports = ImageSprite;\n\nfunction ImageSprite(base) {\n    this.base = base;\n    this.retina = browser.devicePixelRatio > 1;\n\n    var format = this.retina ? '@2x' : '';\n\n    ajax.getJSON(normalizeURL(base, format, '.json'), function(err, data) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        this.data = data;\n        if (this.img) this.fire('load');\n    }.bind(this));\n\n    ajax.getImage(normalizeURL(base, format, '.png'), function(err, img) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        // premultiply the sprite\n        var data = img.getData();\n        var newdata = img.data = new Uint8Array(data.length);\n        for (var i = 0; i < data.length; i += 4) {\n            var alpha = data[i + 3] / 255;\n            newdata[i + 0] = data[i + 0] * alpha;\n            newdata[i + 1] = data[i + 1] * alpha;\n            newdata[i + 2] = data[i + 2] * alpha;\n            newdata[i + 3] = data[i + 3];\n        }\n\n        this.img = img;\n        if (this.data) this.fire('load');\n    }.bind(this));\n}\n\nImageSprite.prototype = Object.create(Evented);\n\nImageSprite.prototype.toJSON = function() {\n    return this.base;\n};\n\nImageSprite.prototype.loaded = function() {\n    return !!(this.data && this.img);\n};\n\nImageSprite.prototype.resize = function(/*gl*/) {\n    if (browser.devicePixelRatio > 1 !== this.retina) {\n        var newSprite = new ImageSprite(this.base);\n        newSprite.on('load', function() {\n            this.img = newSprite.img;\n            this.data = newSprite.data;\n            this.retina = newSprite.retina;\n        }.bind(this));\n    }\n};\n\nfunction SpritePosition() {}\nSpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false };\n\nImageSprite.prototype.getSpritePosition = function(name) {\n    if (!this.loaded()) return new SpritePosition();\n\n    var pos = this.data && this.data[name];\n    if (pos && this.img) return pos;\n\n    return new SpritePosition();\n};\n\n\n/***/ }),\n/* 1355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar punycode = __webpack_require__(640);\nvar util = __webpack_require__(1356);\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n  this.protocol = null;\n  this.slashes = null;\n  this.auth = null;\n  this.host = null;\n  this.port = null;\n  this.hostname = null;\n  this.hash = null;\n  this.search = null;\n  this.query = null;\n  this.pathname = null;\n  this.path = null;\n  this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n    portPattern = /:[0-9]*$/,\n\n    // Special case for a simple path URL\n    simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n    // RFC 2396: characters reserved for delimiting URLs.\n    // We actually just auto-escape these.\n    delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n    // RFC 2396: characters not allowed for various reasons.\n    unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.\n    autoEscape = ['\\''].concat(unwise),\n    // Characters that are never ever allowed in a hostname.\n    // Note that any invalid chars are also handled, but these\n    // are the ones that are *expected* to be seen, so we fast-path\n    // them.\n    nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n    hostEndingChars = ['/', '?', '#'],\n    hostnameMaxLen = 255,\n    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n    // protocols that can allow \"unsafe\" and \"unwise\" chars.\n    unsafeProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that never have a hostname.\n    hostlessProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that always contain a // bit.\n    slashedProtocol = {\n      'http': true,\n      'https': true,\n      'ftp': true,\n      'gopher': true,\n      'file': true,\n      'http:': true,\n      'https:': true,\n      'ftp:': true,\n      'gopher:': true,\n      'file:': true\n    },\n    querystring = __webpack_require__(641);\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n  if (url && util.isObject(url) && url instanceof Url) return url;\n\n  var u = new Url;\n  u.parse(url, parseQueryString, slashesDenoteHost);\n  return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n  if (!util.isString(url)) {\n    throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n  }\n\n  // Copy chrome, IE, opera backslash-handling behavior.\n  // Back slashes before the query string get converted to forward slashes\n  // See: https://code.google.com/p/chromium/issues/detail?id=25916\n  var queryIndex = url.indexOf('?'),\n      splitter =\n          (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n      uSplit = url.split(splitter),\n      slashRegex = /\\\\/g;\n  uSplit[0] = uSplit[0].replace(slashRegex, '/');\n  url = uSplit.join(splitter);\n\n  var rest = url;\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim();\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    var simplePath = simplePathPattern.exec(rest);\n    if (simplePath) {\n      this.path = rest;\n      this.href = rest;\n      this.pathname = simplePath[1];\n      if (simplePath[2]) {\n        this.search = simplePath[2];\n        if (parseQueryString) {\n          this.query = querystring.parse(this.search.substr(1));\n        } else {\n          this.query = this.search.substr(1);\n        }\n      } else if (parseQueryString) {\n        this.search = '';\n        this.query = {};\n      }\n      return this;\n    }\n  }\n\n  var proto = protocolPattern.exec(rest);\n  if (proto) {\n    proto = proto[0];\n    var lowerProto = proto.toLowerCase();\n    this.protocol = lowerProto;\n    rest = rest.substr(proto.length);\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    var slashes = rest.substr(0, 2) === '//';\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2);\n      this.slashes = true;\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    var hostEnd = -1;\n    for (var i = 0; i < hostEndingChars.length; i++) {\n      var hec = rest.indexOf(hostEndingChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    var auth, atSign;\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@');\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd);\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign);\n      rest = rest.slice(atSign + 1);\n      this.auth = decodeURIComponent(auth);\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1;\n    for (var i = 0; i < nonHostChars.length; i++) {\n      var hec = rest.indexOf(nonHostChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1)\n      hostEnd = rest.length;\n\n    this.host = rest.slice(0, hostEnd);\n    rest = rest.slice(hostEnd);\n\n    // pull out port.\n    this.parseHost();\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || '';\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    var ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']';\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      var hostparts = this.hostname.split(/\\./);\n      for (var i = 0, l = hostparts.length; i < l; i++) {\n        var part = hostparts[i];\n        if (!part) continue;\n        if (!part.match(hostnamePartPattern)) {\n          var newpart = '';\n          for (var j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x';\n            } else {\n              newpart += part[j];\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            var validParts = hostparts.slice(0, i);\n            var notHost = hostparts.slice(i + 1);\n            var bit = part.match(hostnamePartStart);\n            if (bit) {\n              validParts.push(bit[1]);\n              notHost.unshift(bit[2]);\n            }\n            if (notHost.length) {\n              rest = '/' + notHost.join('.') + rest;\n            }\n            this.hostname = validParts.join('.');\n            break;\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = '';\n    } else {\n      // hostnames are always lower case.\n      this.hostname = this.hostname.toLowerCase();\n    }\n\n    if (!ipv6Hostname) {\n      // IDNA Support: Returns a punycoded representation of \"domain\".\n      // It only converts parts of the domain name that\n      // have non-ASCII characters, i.e. it doesn't matter if\n      // you call it with a domain that already is ASCII-only.\n      this.hostname = punycode.toASCII(this.hostname);\n    }\n\n    var p = this.port ? ':' + this.port : '';\n    var h = this.hostname || '';\n    this.host = h + p;\n    this.href += this.host;\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n      if (rest[0] !== '/') {\n        rest = '/' + rest;\n      }\n    }\n  }\n\n  // now rest is set to the post-host stuff.\n  // chop off any delim chars.\n  if (!unsafeProtocol[lowerProto]) {\n\n    // First, make 100% sure that any \"autoEscape\" chars get\n    // escaped, even if encodeURIComponent doesn't think they\n    // need to be.\n    for (var i = 0, l = autoEscape.length; i < l; i++) {\n      var ae = autoEscape[i];\n      if (rest.indexOf(ae) === -1)\n        continue;\n      var esc = encodeURIComponent(ae);\n      if (esc === ae) {\n        esc = escape(ae);\n      }\n      rest = rest.split(ae).join(esc);\n    }\n  }\n\n\n  // chop off from the tail first.\n  var hash = rest.indexOf('#');\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash);\n    rest = rest.slice(0, hash);\n  }\n  var qm = rest.indexOf('?');\n  if (qm !== -1) {\n    this.search = rest.substr(qm);\n    this.query = rest.substr(qm + 1);\n    if (parseQueryString) {\n      this.query = querystring.parse(this.query);\n    }\n    rest = rest.slice(0, qm);\n  } else if (parseQueryString) {\n    // no query string, but parseQueryString still requested\n    this.search = '';\n    this.query = {};\n  }\n  if (rest) this.pathname = rest;\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = '/';\n  }\n\n  //to support http.request\n  if (this.pathname || this.search) {\n    var p = this.pathname || '';\n    var s = this.search || '';\n    this.path = p + s;\n  }\n\n  // finally, reconstruct the href based on what has been validated.\n  this.href = this.format();\n  return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n  // ensure it's an object, and not a string url.\n  // If it's an obj, this is a no-op.\n  // this way, you can call url_format() on strings\n  // to clean up potentially wonky urls.\n  if (util.isString(obj)) obj = urlParse(obj);\n  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n  return obj.format();\n}\n\nUrl.prototype.format = function() {\n  var auth = this.auth || '';\n  if (auth) {\n    auth = encodeURIComponent(auth);\n    auth = auth.replace(/%3A/i, ':');\n    auth += '@';\n  }\n\n  var protocol = this.protocol || '',\n      pathname = this.pathname || '',\n      hash = this.hash || '',\n      host = false,\n      query = '';\n\n  if (this.host) {\n    host = auth + this.host;\n  } else if (this.hostname) {\n    host = auth + (this.hostname.indexOf(':') === -1 ?\n        this.hostname :\n        '[' + this.hostname + ']');\n    if (this.port) {\n      host += ':' + this.port;\n    }\n  }\n\n  if (this.query &&\n      util.isObject(this.query) &&\n      Object.keys(this.query).length) {\n    query = querystring.stringify(this.query);\n  }\n\n  var search = this.search || (query && ('?' + query)) || '';\n\n  if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n  // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.\n  // unless they had them to begin with.\n  if (this.slashes ||\n      (!protocol || slashedProtocol[protocol]) && host !== false) {\n    host = '//' + (host || '');\n    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n  } else if (!host) {\n    host = '';\n  }\n\n  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n  if (search && search.charAt(0) !== '?') search = '?' + search;\n\n  pathname = pathname.replace(/[?#]/g, function(match) {\n    return encodeURIComponent(match);\n  });\n  search = search.replace('#', '%23');\n\n  return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n  return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n  return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n  if (!source) return relative;\n  return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n  if (util.isString(relative)) {\n    var rel = new Url();\n    rel.parse(relative, false, true);\n    relative = rel;\n  }\n\n  var result = new Url();\n  var tkeys = Object.keys(this);\n  for (var tk = 0; tk < tkeys.length; tk++) {\n    var tkey = tkeys[tk];\n    result[tkey] = this[tkey];\n  }\n\n  // hash is always overridden, no matter what.\n  // even href=\"\" will remove it.\n  result.hash = relative.hash;\n\n  // if the relative url is empty, then there's nothing left to do here.\n  if (relative.href === '') {\n    result.href = result.format();\n    return result;\n  }\n\n  // hrefs like //foo/bar always cut to the protocol.\n  if (relative.slashes && !relative.protocol) {\n    // take everything except the protocol from relative\n    var rkeys = Object.keys(relative);\n    for (var rk = 0; rk < rkeys.length; rk++) {\n      var rkey = rkeys[rk];\n      if (rkey !== 'protocol')\n        result[rkey] = relative[rkey];\n    }\n\n    //urlParse appends trailing / to urls like http://www.example.com\n    if (slashedProtocol[result.protocol] &&\n        result.hostname && !result.pathname) {\n      result.path = result.pathname = '/';\n    }\n\n    result.href = result.format();\n    return result;\n  }\n\n  if (relative.protocol && relative.protocol !== result.protocol) {\n    // if it's a known url protocol, then changing\n    // the protocol does weird things\n    // first, if it's not file:, then we MUST have a host,\n    // and if there was a path\n    // to begin with, then we MUST have a path.\n    // if it is file:, then the host is dropped,\n    // because that's known to be hostless.\n    // anything else is assumed to be absolute.\n    if (!slashedProtocol[relative.protocol]) {\n      var keys = Object.keys(relative);\n      for (var v = 0; v < keys.length; v++) {\n        var k = keys[v];\n        result[k] = relative[k];\n      }\n      result.href = result.format();\n      return result;\n    }\n\n    result.protocol = relative.protocol;\n    if (!relative.host && !hostlessProtocol[relative.protocol]) {\n      var relPath = (relative.pathname || '').split('/');\n      while (relPath.length && !(relative.host = relPath.shift()));\n      if (!relative.host) relative.host = '';\n      if (!relative.hostname) relative.hostname = '';\n      if (relPath[0] !== '') relPath.unshift('');\n      if (relPath.length < 2) relPath.unshift('');\n      result.pathname = relPath.join('/');\n    } else {\n      result.pathname = relative.pathname;\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    result.host = relative.host || '';\n    result.auth = relative.auth;\n    result.hostname = relative.hostname || relative.host;\n    result.port = relative.port;\n    // to support http.request\n    if (result.pathname || result.search) {\n      var p = result.pathname || '';\n      var s = result.search || '';\n      result.path = p + s;\n    }\n    result.slashes = result.slashes || relative.slashes;\n    result.href = result.format();\n    return result;\n  }\n\n  var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n      isRelAbs = (\n          relative.host ||\n          relative.pathname && relative.pathname.charAt(0) === '/'\n      ),\n      mustEndAbs = (isRelAbs || isSourceAbs ||\n                    (result.host && relative.pathname)),\n      removeAllDots = mustEndAbs,\n      srcPath = result.pathname && result.pathname.split('/') || [],\n      relPath = relative.pathname && relative.pathname.split('/') || [],\n      psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n  // if the url is a non-slashed url, then relative\n  // links like ../.. should be able\n  // to crawl up to the hostname, as well.  This is strange.\n  // result.protocol has already been set by now.\n  // Later on, put the first path part into the host field.\n  if (psychotic) {\n    result.hostname = '';\n    result.port = null;\n    if (result.host) {\n      if (srcPath[0] === '') srcPath[0] = result.host;\n      else srcPath.unshift(result.host);\n    }\n    result.host = '';\n    if (relative.protocol) {\n      relative.hostname = null;\n      relative.port = null;\n      if (relative.host) {\n        if (relPath[0] === '') relPath[0] = relative.host;\n        else relPath.unshift(relative.host);\n      }\n      relative.host = null;\n    }\n    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n  }\n\n  if (isRelAbs) {\n    // it's absolute.\n    result.host = (relative.host || relative.host === '') ?\n                  relative.host : result.host;\n    result.hostname = (relative.hostname || relative.hostname === '') ?\n                      relative.hostname : result.hostname;\n    result.search = relative.search;\n    result.query = relative.query;\n    srcPath = relPath;\n    // fall through to the dot-handling below.\n  } else if (relPath.length) {\n    // it's relative\n    // throw away the existing file, and take the new path instead.\n    if (!srcPath) srcPath = [];\n    srcPath.pop();\n    srcPath = srcPath.concat(relPath);\n    result.search = relative.search;\n    result.query = relative.query;\n  } else if (!util.isNullOrUndefined(relative.search)) {\n    // just pull out the search.\n    // like href='?foo'.\n    // Put this after the other two cases because it simplifies the booleans\n    if (psychotic) {\n      result.hostname = result.host = srcPath.shift();\n      //occationaly the auth can get stuck only in host\n      //this especially happens in cases like\n      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n      var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                       result.host.split('@') : false;\n      if (authInHost) {\n        result.auth = authInHost.shift();\n        result.host = result.hostname = authInHost.shift();\n      }\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    //to support http.request\n    if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n      result.path = (result.pathname ? result.pathname : '') +\n                    (result.search ? result.search : '');\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  if (!srcPath.length) {\n    // no path at all.  easy.\n    // we've already handled the other stuff above.\n    result.pathname = null;\n    //to support http.request\n    if (result.search) {\n      result.path = '/' + result.search;\n    } else {\n      result.path = null;\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  // if a url ENDs in . or .., then it must get a trailing slash.\n  // however, if it ends in anything else non-slashy,\n  // then it must NOT get a trailing slash.\n  var last = srcPath.slice(-1)[0];\n  var hasTrailingSlash = (\n      (result.host || relative.host || srcPath.length > 1) &&\n      (last === '.' || last === '..') || last === '');\n\n  // strip single dots, resolve double dots to parent dir\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = srcPath.length; i >= 0; i--) {\n    last = srcPath[i];\n    if (last === '.') {\n      srcPath.splice(i, 1);\n    } else if (last === '..') {\n      srcPath.splice(i, 1);\n      up++;\n    } else if (up) {\n      srcPath.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (!mustEndAbs && !removeAllDots) {\n    for (; up--; up) {\n      srcPath.unshift('..');\n    }\n  }\n\n  if (mustEndAbs && srcPath[0] !== '' &&\n      (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n    srcPath.unshift('');\n  }\n\n  if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n    srcPath.push('');\n  }\n\n  var isAbsolute = srcPath[0] === '' ||\n      (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n  // put the host back\n  if (psychotic) {\n    result.hostname = result.host = isAbsolute ? '' :\n                                    srcPath.length ? srcPath.shift() : '';\n    //occationaly the auth can get stuck only in host\n    //this especially happens in cases like\n    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n    var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                     result.host.split('@') : false;\n    if (authInHost) {\n      result.auth = authInHost.shift();\n      result.host = result.hostname = authInHost.shift();\n    }\n  }\n\n  mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n  if (mustEndAbs && !isAbsolute) {\n    srcPath.unshift('');\n  }\n\n  if (!srcPath.length) {\n    result.pathname = null;\n    result.path = null;\n  } else {\n    result.pathname = srcPath.join('/');\n  }\n\n  //to support request.http\n  if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n    result.path = (result.pathname ? result.pathname : '') +\n                  (result.search ? result.search : '');\n  }\n  result.auth = relative.auth || result.auth;\n  result.slashes = result.slashes || relative.slashes;\n  result.href = result.format();\n  return result;\n};\n\nUrl.prototype.parseHost = function() {\n  var host = this.host;\n  var port = portPattern.exec(host);\n  if (port) {\n    port = port[0];\n    if (port !== ':') {\n      this.port = port.substr(1);\n    }\n    host = host.substr(0, host.length - port.length);\n  }\n  if (host) this.hostname = host;\n};\n\n\n/***/ }),\n/* 1356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n  isString: function(arg) {\n    return typeof(arg) === 'string';\n  },\n  isObject: function(arg) {\n    return typeof(arg) === 'object' && arg !== null;\n  },\n  isNull: function(arg) {\n    return arg === null;\n  },\n  isNullOrUndefined: function(arg) {\n    return arg == null;\n  }\n};\n\n\n/***/ }),\n/* 1357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n  sep = sep || '&';\n  eq = eq || '=';\n  var obj = {};\n\n  if (typeof qs !== 'string' || qs.length === 0) {\n    return obj;\n  }\n\n  var regexp = /\\+/g;\n  qs = qs.split(sep);\n\n  var maxKeys = 1000;\n  if (options && typeof options.maxKeys === 'number') {\n    maxKeys = options.maxKeys;\n  }\n\n  var len = qs.length;\n  // maxKeys <= 0 means that we should not limit keys count\n  if (maxKeys > 0 && len > maxKeys) {\n    len = maxKeys;\n  }\n\n  for (var i = 0; i < len; ++i) {\n    var x = qs[i].replace(regexp, '%20'),\n        idx = x.indexOf(eq),\n        kstr, vstr, k, v;\n\n    if (idx >= 0) {\n      kstr = x.substr(0, idx);\n      vstr = x.substr(idx + 1);\n    } else {\n      kstr = x;\n      vstr = '';\n    }\n\n    k = decodeURIComponent(kstr);\n    v = decodeURIComponent(vstr);\n\n    if (!hasOwnProperty(obj, k)) {\n      obj[k] = v;\n    } else if (isArray(obj[k])) {\n      obj[k].push(v);\n    } else {\n      obj[k] = [obj[k], v];\n    }\n  }\n\n  return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n/***/ }),\n/* 1358 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar stringifyPrimitive = function(v) {\n  switch (typeof v) {\n    case 'string':\n      return v;\n\n    case 'boolean':\n      return v ? 'true' : 'false';\n\n    case 'number':\n      return isFinite(v) ? v : '';\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n  sep = sep || '&';\n  eq = eq || '=';\n  if (obj === null) {\n    obj = undefined;\n  }\n\n  if (typeof obj === 'object') {\n    return map(objectKeys(obj), function(k) {\n      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n      if (isArray(obj[k])) {\n        return map(obj[k], function(v) {\n          return ks + encodeURIComponent(stringifyPrimitive(v));\n        }).join(sep);\n      } else {\n        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n      }\n    }).join(sep);\n\n  }\n\n  if (!name) return '';\n  return encodeURIComponent(stringifyPrimitive(name)) + eq +\n         encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n  if (xs.map) return xs.map(f);\n  var res = [];\n  for (var i = 0; i < xs.length; i++) {\n    res.push(f(xs[i], i));\n  }\n  return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n  var res = [];\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n  }\n  return res;\n};\n\n\n/***/ }),\n/* 1359 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar normalizeURL = __webpack_require__(128).normalizeGlyphsURL;\nvar getArrayBuffer = __webpack_require__(91).getArrayBuffer;\nvar Glyphs = __webpack_require__(1360);\nvar GlyphAtlas = __webpack_require__(1361);\nvar Protobuf = __webpack_require__(123);\n\nmodule.exports = GlyphSource;\n\n/**\n * A glyph source has a URL from which to load new glyphs and manages\n * GlyphAtlases in which to store glyphs used by the requested fontstacks\n * and ranges.\n *\n * @param {string} url glyph template url\n * @private\n */\nfunction GlyphSource(url) {\n    this.url = url && normalizeURL(url);\n    this.atlases = {};\n    this.stacks = {};\n    this.loading = {};\n}\n\nGlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) {\n    if (this.stacks[fontstack] === undefined) {\n        this.stacks[fontstack] = {};\n    }\n    if (this.atlases[fontstack] === undefined) {\n        this.atlases[fontstack] = new GlyphAtlas();\n    }\n\n    var glyphs = {};\n    var stack = this.stacks[fontstack];\n    var atlas = this.atlases[fontstack];\n\n    // the number of pixels the sdf bitmaps are padded by\n    var buffer = 3;\n\n    var missing = {};\n    var remaining = 0;\n    var range;\n\n    for (var i = 0; i < glyphIDs.length; i++) {\n        var glyphID = glyphIDs[i];\n        range = Math.floor(glyphID / 256);\n\n        if (stack[range]) {\n            var glyph = stack[range].glyphs[glyphID];\n            var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n            if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n        } else {\n            if (missing[range] === undefined) {\n                missing[range] = [];\n                remaining++;\n            }\n            missing[range].push(glyphID);\n        }\n    }\n\n    if (!remaining) callback(undefined, glyphs, fontstack);\n\n    var onRangeLoaded = function(err, range, data) {\n        if (!err) {\n            var stack = this.stacks[fontstack][range] = data.stacks[0];\n            for (var i = 0; i < missing[range].length; i++) {\n                var glyphID = missing[range][i];\n                var glyph = stack.glyphs[glyphID];\n                var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n                if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n            }\n        }\n        remaining--;\n        if (!remaining) callback(undefined, glyphs, fontstack);\n    }.bind(this);\n\n    for (var r in missing) {\n        this.loadRange(fontstack, r, onRangeLoaded);\n    }\n};\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nfunction SimpleGlyph(glyph, rect, buffer) {\n    var padding = 1;\n    this.advance = glyph.advance;\n    this.left = glyph.left - buffer - padding;\n    this.top = glyph.top + buffer + padding;\n    this.rect = rect;\n}\n\nGlyphSource.prototype.loadRange = function(fontstack, range, callback) {\n    if (range * 256 > 65535) return callback('glyphs > 65535 not supported');\n\n    if (this.loading[fontstack] === undefined) {\n        this.loading[fontstack] = {};\n    }\n    var loading = this.loading[fontstack];\n\n    if (loading[range]) {\n        loading[range].push(callback);\n    } else {\n        loading[range] = [callback];\n\n        var rangeName = (range * 256) + '-' + (range * 256 + 255);\n        var url = glyphUrl(fontstack, rangeName, this.url);\n\n        getArrayBuffer(url, function(err, data) {\n            var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data)));\n            for (var i = 0; i < loading[range].length; i++) {\n                loading[range][i](err, range, glyphs);\n            }\n            delete loading[range];\n        });\n    }\n};\n\nGlyphSource.prototype.getGlyphAtlas = function(fontstack) {\n    return this.atlases[fontstack];\n};\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n    subdomains = subdomains || 'abc';\n\n    return url\n        .replace('{s}', subdomains[fontstack.length % subdomains.length])\n        .replace('{fontstack}', fontstack)\n        .replace('{range}', range);\n}\n\n\n/***/ }),\n/* 1360 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n    this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n    if (tag === 1) {\n        var fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n        stacks.push(fontstack);\n    }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n    if (tag === 1) fontstack.name = pbf.readString();\n    else if (tag === 2) fontstack.range = pbf.readString();\n    else if (tag === 3) {\n        var glyph = pbf.readMessage(readGlyph, {});\n        fontstack.glyphs[glyph.id] = glyph;\n    }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n    if (tag === 1) glyph.id = pbf.readVarint();\n    else if (tag === 2) glyph.bitmap = pbf.readBytes();\n    else if (tag === 3) glyph.width = pbf.readVarint();\n    else if (tag === 4) glyph.height = pbf.readVarint();\n    else if (tag === 5) glyph.left = pbf.readSVarint();\n    else if (tag === 6) glyph.top = pbf.readSVarint();\n    else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n\n\n/***/ }),\n/* 1361 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ShelfPack = __webpack_require__(193);\nvar util = __webpack_require__(6);\n\nvar SIZE_GROWTH_RATE = 4;\nvar DEFAULT_SIZE = 128;\n// must be \"DEFAULT_SIZE * SIZE_GROWTH_RATE ^ n\" for some integer n\nvar MAX_SIZE = 2048;\n\nmodule.exports = GlyphAtlas;\nfunction GlyphAtlas() {\n    this.width = DEFAULT_SIZE;\n    this.height = DEFAULT_SIZE;\n\n    this.bin = new ShelfPack(this.width, this.height);\n    this.index = {};\n    this.ids = {};\n    this.data = new Uint8Array(this.width * this.height);\n}\n\nGlyphAtlas.prototype.getGlyphs = function() {\n    var glyphs = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!glyphs[name]) glyphs[name] = [];\n        glyphs[name].push(id);\n    }\n\n    return glyphs;\n};\n\nGlyphAtlas.prototype.getRects = function() {\n    var rects = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!rects[name]) rects[name] = {};\n        rects[name][id] = this.index[key];\n    }\n\n    return rects;\n};\n\n\nGlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) {\n    if (!glyph) return null;\n\n    var key = name + \"#\" + glyph.id;\n\n    // The glyph is already in this texture.\n    if (this.index[key]) {\n        if (this.ids[key].indexOf(id) < 0) {\n            this.ids[key].push(id);\n        }\n        return this.index[key];\n    }\n\n    // The glyph bitmap has zero width.\n    if (!glyph.bitmap) {\n        return null;\n    }\n\n    var bufferedWidth = glyph.width + buffer * 2;\n    var bufferedHeight = glyph.height + buffer * 2;\n\n    // Add a 1px border around every image.\n    var padding = 1;\n    var packWidth = bufferedWidth + 2 * padding;\n    var packHeight = bufferedHeight + 2 * padding;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into fewer bytes.\n    packWidth += (4 - packWidth % 4);\n    packHeight += (4 - packHeight % 4);\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        this.resize();\n        rect = this.bin.packOne(packWidth, packHeight);\n    }\n    if (!rect) {\n        util.warnOnce('glyph bitmap overflow');\n        return null;\n    }\n\n    this.index[key] = rect;\n    this.ids[key] = [id];\n\n    var target = this.data;\n    var source = glyph.bitmap;\n    for (var y = 0; y < bufferedHeight; y++) {\n        var y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n        var y2 = bufferedWidth * y;\n        for (var x = 0; x < bufferedWidth; x++) {\n            target[y1 + x] = source[y2 + x];\n        }\n    }\n\n    this.dirty = true;\n\n    return rect;\n};\n\nGlyphAtlas.prototype.resize = function() {\n    var prevWidth = this.width;\n    var prevHeight = this.height;\n\n    if (prevWidth >= MAX_SIZE || prevHeight >= MAX_SIZE) return;\n\n    if (this.texture) {\n        if (this.gl) {\n            this.gl.deleteTexture(this.texture);\n        }\n        this.texture = null;\n    }\n\n    this.width *= SIZE_GROWTH_RATE;\n    this.height *= SIZE_GROWTH_RATE;\n    this.bin.resize(this.width, this.height);\n\n    var buf = new ArrayBuffer(this.width * this.height);\n    for (var i = 0; i < prevHeight; i++) {\n        var src = new Uint8Array(this.data.buffer, prevHeight * i, prevWidth);\n        var dst = new Uint8Array(buf, prevHeight * i * SIZE_GROWTH_RATE, prevWidth);\n        dst.set(src);\n    }\n    this.data = new Uint8Array(buf);\n};\n\nGlyphAtlas.prototype.bind = function(gl) {\n    this.gl = gl;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n};\n\nGlyphAtlas.prototype.updateTexture = function(gl) {\n    this.bind(gl);\n    if (this.dirty) {\n        gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n        this.dirty = false;\n    }\n};\n\n\n/***/ }),\n/* 1362 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ShelfPack = __webpack_require__(193);\nvar browser = __webpack_require__(37);\nvar util = __webpack_require__(6);\n\nmodule.exports = SpriteAtlas;\nfunction SpriteAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.images = {};\n    this.data = false;\n    this.texture = 0; // WebGL ID\n    this.filter = 0; // WebGL ID\n    this.pixelRatio = 1;\n    this.dirty = true;\n}\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n    var srcI = srcY * srcStride + srcX;\n    var dstI = dstY * dstStride + dstX;\n    var x, y;\n\n    if (wrap) {\n        // add 1 pixel wrapped padding on each side of the image\n        dstI -= dstStride;\n        for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) {\n            for (x = -1; x <= width; x++) {\n                dst[dstI + x] = src[srcI + ((x + width) % width)];\n            }\n        }\n\n    } else {\n        for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n            for (x = 0; x < width; x++) {\n                dst[dstI + x] = src[srcI + x];\n            }\n        }\n    }\n}\n\nSpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) {\n\n    pixelWidth = pixelWidth / this.pixelRatio;\n    pixelHeight = pixelHeight / this.pixelRatio;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    // Pad icons to prevent them from polluting neighbours during linear interpolation\n    var padding = 2;\n    var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n    var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        util.warnOnce('SpriteAtlas out of space.');\n        return null;\n    }\n\n    return rect;\n};\n\nSpriteAtlas.prototype.getImage = function(name, wrap) {\n    if (this.images[name]) {\n        return this.images[name];\n    }\n\n    if (!this.sprite) {\n        return null;\n    }\n\n    var pos = this.sprite.getSpritePosition(name);\n    if (!pos.width || !pos.height) {\n        return null;\n    }\n\n    var rect = this.allocateImage(pos.width, pos.height);\n    if (!rect) {\n        return null;\n    }\n\n    var image = new AtlasImage(rect, pos.width / pos.pixelRatio, pos.height / pos.pixelRatio, pos.sdf, pos.pixelRatio / this.pixelRatio);\n    this.images[name] = image;\n\n    this.copy(rect, pos, wrap);\n\n    return image;\n};\n\n\n// Return position of a repeating fill pattern.\nSpriteAtlas.prototype.getPosition = function(name, repeating) {\n    var image = this.getImage(name, repeating);\n    var rect = image && image.rect;\n\n    if (!rect) {\n        return null;\n    }\n\n    var width = image.width * image.pixelRatio;\n    var height = image.height * image.pixelRatio;\n    var padding = 1;\n\n    return {\n        size: [image.width, image.height],\n        tl: [(rect.x + padding)         / this.width, (rect.y + padding)          / this.height],\n        br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n    };\n};\n\n\nSpriteAtlas.prototype.allocate = function() {\n    if (!this.data) {\n        var w = Math.floor(this.width * this.pixelRatio);\n        var h = Math.floor(this.height * this.pixelRatio);\n        this.data = new Uint32Array(w * h);\n        for (var i = 0; i < this.data.length; i++) {\n            this.data[i] = 0;\n        }\n    }\n};\n\n\nSpriteAtlas.prototype.copy = function(dst, src, wrap) {\n    if (!this.sprite.img.data) return;\n    var srcImg = new Uint32Array(this.sprite.img.data.buffer);\n\n    this.allocate();\n    var dstImg = this.data;\n\n    var padding = 1;\n\n    copyBitmap(\n        /* source buffer */  srcImg,\n        /* source stride */  this.sprite.img.width,\n        /* source x */       src.x,\n        /* source y */       src.y,\n        /* dest buffer */    dstImg,\n        /* dest stride */    this.width * this.pixelRatio,\n        /* dest x */         (dst.x + padding) * this.pixelRatio,\n        /* dest y */         (dst.y + padding) * this.pixelRatio,\n        /* icon dimension */ src.width,\n        /* icon dimension */ src.height,\n        /* wrap */ wrap\n    );\n\n    this.dirty = true;\n};\n\nSpriteAtlas.prototype.setSprite = function(sprite) {\n    if (sprite) {\n        this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1;\n\n        if (this.canvas) {\n            this.canvas.width = this.width * this.pixelRatio;\n            this.canvas.height = this.height * this.pixelRatio;\n        }\n    }\n    this.sprite = sprite;\n};\n\nSpriteAtlas.prototype.addIcons = function(icons, callback) {\n    for (var i = 0; i < icons.length; i++) {\n        this.getImage(icons[i]);\n    }\n\n    callback(null, this.images);\n};\n\nSpriteAtlas.prototype.bind = function(gl, linear) {\n    var first = false;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        first = true;\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n\n    var filterVal = linear ? gl.LINEAR : gl.NEAREST;\n    if (filterVal !== this.filter) {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n        this.filter = filterVal;\n    }\n\n    if (this.dirty) {\n        this.allocate();\n\n        if (first) {\n            gl.texImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // ind level\n                gl.RGBA, // ind internalformat\n                this.width * this.pixelRatio, // GLsizei width\n                this.height * this.pixelRatio, // GLsizei height\n                0, // ind border\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object data\n            );\n        } else {\n            gl.texSubImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // int level\n                0, // int xoffset\n                0, // int yoffset\n                this.width * this.pixelRatio, // long width\n                this.height * this.pixelRatio, // long height\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object pixels\n            );\n        }\n\n        this.dirty = false;\n    }\n};\n\nfunction AtlasImage(rect, width, height, sdf, pixelRatio) {\n    this.rect = rect;\n    this.width = width;\n    this.height = height;\n    this.sdf = sdf;\n    this.pixelRatio = pixelRatio;\n}\n\n\n/***/ }),\n/* 1363 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\n\nmodule.exports = LineAtlas;\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nfunction LineAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n    this.nextRow = 0;\n\n    this.bytes = 4;\n    this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n    this.positions = {};\n}\n\nLineAtlas.prototype.setSprite = function(sprite) {\n    this.sprite = sprite;\n};\n\n/**\n * Get or create a dash line pattern.\n *\n * @param {Array<number>} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\nLineAtlas.prototype.getDash = function(dasharray, round) {\n    var key = dasharray.join(\",\") + round;\n\n    if (!this.positions[key]) {\n        this.positions[key] = this.addDash(dasharray, round);\n    }\n    return this.positions[key];\n};\n\nLineAtlas.prototype.addDash = function(dasharray, round) {\n\n    var n = round ? 7 : 0;\n    var height = 2 * n + 1;\n    var offset = 128;\n\n    if (this.nextRow + height > this.height) {\n        util.warnOnce('LineAtlas out of space');\n        return null;\n    }\n\n    var length = 0;\n    for (var i = 0; i < dasharray.length; i++) {\n        length += dasharray[i];\n    }\n\n    var stretch = this.width / length;\n    var halfWidth = stretch / 2;\n\n    // If dasharray has an odd length, both the first and last parts\n    // are dashes and should be joined seamlessly.\n    var oddLength = dasharray.length % 2 === 1;\n\n    for (var y = -n; y <= n; y++) {\n        var row = this.nextRow + n + y;\n        var index = this.width * row;\n\n        var left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n        var right = dasharray[0];\n        var partIndex = 1;\n\n        for (var x = 0; x < this.width; x++) {\n\n            while (right < x / stretch) {\n                left = right;\n                right = right + dasharray[partIndex];\n\n                if (oddLength && partIndex === dasharray.length - 1) {\n                    right += dasharray[0];\n                }\n\n                partIndex++;\n            }\n\n            var distLeft = Math.abs(x - left * stretch);\n            var distRight = Math.abs(x - right * stretch);\n            var dist = Math.min(distLeft, distRight);\n            var inside = (partIndex % 2) === 1;\n            var signedDistance;\n\n            if (round) {\n                // Add circle caps\n                var distMiddle = n ? y / n * (halfWidth + 1) : 0;\n                if (inside) {\n                    var distEdge = halfWidth - Math.abs(distMiddle);\n                    signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n                } else {\n                    signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n                }\n            } else {\n                signedDistance = (inside ? 1 : -1) * dist;\n            }\n\n            this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n        }\n    }\n\n    var pos = {\n        y: (this.nextRow + n + 0.5) / this.height,\n        height: 2 * n / this.height,\n        width: length\n    };\n\n    this.nextRow += height;\n    this.dirty = true;\n\n    return pos;\n};\n\nLineAtlas.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (this.dirty) {\n            this.dirty = false;\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n        }\n    }\n};\n\n\n/***/ }),\n/* 1364 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar Actor = __webpack_require__(1365);\n\nmodule.exports = Dispatcher;\n\n/**\n * Responsible for sending messages from a {@link Source} to an associated\n * {@link WorkerSource}.\n *\n * @interface Dispatcher\n * @private\n */\nfunction Dispatcher(workerPool, parent) {\n    this.workerPool = workerPool;\n    this.actors = [];\n    this.currentActor = 0;\n    this.id = util.uniqueId();\n    var workers = this.workerPool.acquire(this.id);\n    for (var i = 0; i < workers.length; i++) {\n        var worker = workers[i];\n        var actor = new Actor(worker, parent, this.id);\n        actor.name = \"Worker \" + i;\n        this.actors.push(actor);\n    }\n}\n\nDispatcher.prototype = {\n    /**\n     * Broadcast a message to all Workers.\n     * @method\n     * @name broadcast\n     * @param {string} type\n     * @param {object} data\n     * @param {Function} callback\n     * @memberof Dispatcher\n     * @instance\n     */\n    broadcast: function(type, data, cb) {\n        cb = cb || function () {};\n        util.asyncAll(this.actors, function (actor, done) {\n            actor.send(type, data, done);\n        }, cb);\n    },\n\n    /**\n     * Send a message to a Worker.\n     * @method\n     * @name send\n     * @param {string} type\n     * @param {object} data\n     * @param {Function} callback\n     * @param {number|undefined} [targetID] The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose.\n     * @returns {number} The ID of the worker to which the message was sent.\n     * @memberof Dispatcher\n     * @instance\n     */\n    send: function(type, data, callback, targetID, buffers) {\n        if (typeof targetID !== 'number' || isNaN(targetID)) {\n            // Use round robin to send requests to web workers.\n            targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n        }\n\n        this.actors[targetID].send(type, data, callback, buffers);\n        return targetID;\n    },\n\n    remove: function() {\n        this.workerPool.release(this.id);\n        this.actors = [];\n    }\n};\n\n\n\n/***/ }),\n/* 1365 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = Actor;\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @param {string|number} mapId A unique identifier for the Map instance using this Actor.\n * @private\n */\nfunction Actor(target, parent, mapId) {\n    this.target = target;\n    this.parent = parent;\n    this.mapId = mapId;\n    this.callbacks = {};\n    this.callbackID = 0;\n    this.receive = this.receive.bind(this);\n    this.target.addEventListener('message', this.receive, false);\n}\n\nActor.prototype.receive = function(message) {\n    var data = message.data,\n        id = data.id,\n        callback;\n\n    if (data.type === '<response>') {\n        callback = this.callbacks[data.id];\n        delete this.callbacks[data.id];\n        if (callback) callback(data.error || null, data.data);\n    } else if (typeof data.id !== 'undefined' && this.parent[data.type]) {\n        // data.type == 'load tile', 'remove tile', etc.\n        this.parent[data.type](data.mapId, data.data, done.bind(this));\n    } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) {\n        // data.type == sourcetype.method\n        var keys = data.type.split('.');\n        var workerSource = this.parent.getWorkerSource(data.mapId, keys[0]);\n        workerSource[keys[1]](data.data, done.bind(this));\n    } else {\n        this.parent[data.type](data.data);\n    }\n\n    function done(err, data, buffers) {\n        this.postMessage({\n            mapId: this.mapId,\n            type: '<response>',\n            id: String(id),\n            error: err ? String(err) : null,\n            data: data\n        }, buffers);\n    }\n};\n\nActor.prototype.send = function(type, data, callback, buffers) {\n    var id = callback ? this.mapId + ':' + this.callbackID++ : null;\n    if (callback) this.callbacks[id] = callback;\n    this.postMessage({ mapId: this.mapId, type: type, id: String(id), data: data }, buffers);\n};\n\n/**\n * Wrapped postMessage API that abstracts around IE's lack of\n * `transferList` support.\n *\n * @param {Object} message\n * @param {Object} transferList\n * @private\n */\nActor.prototype.postMessage = function(message, transferList) {\n    this.target.postMessage(message, transferList);\n};\n\n\n/***/ }),\n/* 1366 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(47);\nvar util = __webpack_require__(6);\nvar loadTileJSON = __webpack_require__(644);\nvar normalizeURL = __webpack_require__(128).normalizeTileURL;\n\nmodule.exports = VectorTileSource;\n\nfunction VectorTileSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    this._options = util.extend({ type: 'vector' }, options);\n\n    if (this.tileSize !== 512) {\n        throw new Error('vector tile sources must have a tileSize of 512');\n    }\n\n    loadTileJSON(options, function (err, tileJSON) {\n        if (err) {\n            this.fire('error', err);\n            return;\n        }\n        util.extend(this, tileJSON);\n        this.fire('load');\n    }.bind(this));\n}\n\nVectorTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    scheme: 'xyz',\n    tileSize: 512,\n    reparseOverscaled: true,\n    isTileClipped: true,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    serialize: function() {\n        return util.extend({}, this._options);\n    },\n\n    loadTile: function(tile, callback) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url),\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            tileSize: this.tileSize * overscaling,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        if (tile.workerID) {\n            if (tile.state === 'loading') {\n                // schedule tile reloading after it has been loaded\n                tile.reloadCallback = callback;\n            } else {\n                params.rawTileData = tile.rawTileData;\n                this.dispatcher.send('reload tile', params, done.bind(this), tile.workerID);\n            }\n        } else {\n            tile.workerID = this.dispatcher.send('load tile', params, done.bind(this));\n        }\n\n        function done(err, data) {\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            callback(null);\n\n            if (tile.reloadCallback) {\n                this.loadTile(tile, tile.reloadCallback);\n                tile.reloadCallback = null;\n            }\n        }\n    },\n\n    abortTile: function(tile) {\n        this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    }\n});\n\n\n/***/ }),\n/* 1367 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar ajax = __webpack_require__(91);\nvar Evented = __webpack_require__(47);\nvar loadTileJSON = __webpack_require__(644);\nvar normalizeURL = __webpack_require__(128).normalizeTileURL;\n\nmodule.exports = RasterTileSource;\n\nfunction RasterTileSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    loadTileJSON(options, function (err, tileJSON) {\n        if (err) {\n            return this.fire('error', err);\n        }\n        util.extend(this, tileJSON);\n        this.fire('load');\n    }.bind(this));\n}\n\nRasterTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    roundZoom: true,\n    scheme: 'xyz',\n    tileSize: 512,\n    _loaded: false,\n\n    onAdd: function (map) {\n        this.map = map;\n    },\n\n    serialize: function() {\n        return {\n            type: 'raster',\n            url: this.url,\n            tileSize: this.tileSize\n        };\n    },\n\n    loadTile: function(tile, callback) {\n        var url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize);\n\n        tile.request = ajax.getImage(url, done.bind(this));\n\n        function done(err, img) {\n            delete tile.request;\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            var gl = this.map.painter.gl;\n            tile.texture = this.map.painter.getTexture(img.width);\n            if (tile.texture) {\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n            } else {\n                tile.texture = gl.createTexture();\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n                tile.texture.size = img.width;\n            }\n            gl.generateMipmap(gl.TEXTURE_2D);\n\n            this.map.animationLoop.set(this.map.style.rasterFadeDuration);\n\n            tile.state = 'loaded';\n\n            callback(null);\n        }\n    },\n\n    abortTile: function(tile) {\n        if (tile.request) {\n            tile.request.abort();\n            delete tile.request;\n        }\n    },\n\n    unloadTile: function(tile) {\n        if (tile.texture) this.map.painter.saveTexture(tile.texture);\n    }\n});\n\n\n/***/ }),\n/* 1368 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Evented = __webpack_require__(47);\nvar util = __webpack_require__(6);\nvar urlResolve = __webpack_require__(572);\nvar EXTENT = __webpack_require__(42).EXTENT;\n\nmodule.exports = GeoJSONSource;\n\n/**\n * A source containing GeoJSON.\n *\n * @class GeoJSONSource\n * @param {Object} [options]\n * @param {Object|string} [options.data] A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON objects.\n * @param {number} [options.maxzoom=18] The maximum zoom level at which to preserve detail (1-20).\n * @param {number} [options.buffer=128] The tile buffer, measured in pixels. The buffer extends each\n *   tile's data just past its visible edges, helping to ensure seamless rendering across tile boundaries.\n *   The default value, 128, is a safe value for label layers, preventing text clipping at boundaries.\n *   You can read more about buffers and clipping in the\n *   [Mapbox Vector Tile Specification](https://www.mapbox.com/vector-tiles/specification/#clipping).\n * @param {number} [options.tolerance=0.375] The simplification tolerance, measured in pixels.\n *   This value is passed into a modified [Ramer–Douglas–Peucker algorithm](https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm)\n *   to simplify (i.e. reduce the number of points) in curves. Higher values result in greater simplification.\n * @param {boolean} [options.cluster] If `true`, a collection of point features will be clustered into groups,\n *   according to `options.clusterRadius`.\n * @param {number} [options.clusterRadius=50] The radius of each cluster when clustering points, measured in pixels.\n * @param {number} [options.clusterMaxZoom] The maximum zoom level to cluster points in. By default, this value is\n *   one zoom level less than the map's `maxzoom`, so that at the highest zoom level features are not clustered.\n *\n * @example\n * map.addSource('some id', {\n *     data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'\n * });\n *\n * @example\n * map.addSource('some id', {\n *    type: 'geojson',\n *    data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [\n *                    -76.53063297271729,\n *                    39.18174077994108\n *                ]\n *            }\n *        }]\n *    }\n * });\n *\n * @example\n * map.getSource('some id').setData({\n *     data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"properties\": { \"name\": \"Null Island\" },\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [ 0, 0 ]\n *            }\n *        }]\n *     }\n * });\n */\nfunction GeoJSONSource(id, options, dispatcher) {\n    options = options || {};\n    this.id = id;\n    this.dispatcher = dispatcher;\n\n    this._data = options.data;\n\n    if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n    if (options.type) this.type = options.type;\n\n    var scale = EXTENT / this.tileSize;\n\n    // sent to the worker, along with `url: ...` or `data: literal geojson`,\n    // so that it can load/parse/index the geojson data\n    // extending with `options.workerOptions` helps to make it easy for\n    // third-party sources to hack/reuse GeoJSONSource.\n    this.workerOptions = util.extend({\n        source: this.id,\n        cluster: options.cluster || false,\n        geojsonVtOptions: {\n            buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n            tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n            extent: EXTENT,\n            maxZoom: this.maxzoom\n        },\n        superclusterOptions: {\n            maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom - 1) || (this.maxzoom - 1),\n            extent: EXTENT,\n            radius: (options.clusterRadius || 50) * scale,\n            log: false\n        }\n    }, options.workerOptions);\n\n    this._updateWorkerData(function done(err) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n        this.fire('load');\n    }.bind(this));\n}\n\nGeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */ {\n    // `type` is a property rather than a constant to make it easy for 3rd\n    // parties to use GeoJSONSource to build their own source types.\n    type: 'geojson',\n    minzoom: 0,\n    maxzoom: 18,\n    tileSize: 512,\n    isTileClipped: true,\n    reparseOverscaled: true,\n\n    onAdd: function (map) {\n        this.map = map;\n    },\n\n    /**\n     * Sets the GeoJSON data and re-renders the map.\n     *\n     * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.\n     * @returns {GeoJSONSource} this\n     */\n    setData: function(data) {\n        this._data = data;\n\n        this._updateWorkerData(function (err) {\n            if (err) {\n                return this.fire('error', { error: err });\n            }\n            this.fire('change');\n        }.bind(this));\n\n        return this;\n    },\n\n    /*\n     * Responsible for invoking WorkerSource's geojson.loadData target, which\n     * handles loading the geojson data and preparing to serve it up as tiles,\n     * using geojson-vt or supercluster as appropriate.\n     */\n    _updateWorkerData: function(callback) {\n        var options = util.extend({}, this.workerOptions);\n        var data = this._data;\n        if (typeof data === 'string') {\n            options.url = typeof window != 'undefined' ? urlResolve(window.location.href, data) : data;\n        } else {\n            options.data = JSON.stringify(data);\n        }\n\n        // target {this.type}.loadData rather than literally geojson.loadData,\n        // so that other geojson-like source types can easily reuse this\n        // implementation\n        this.workerID = this.dispatcher.send(this.type + '.loadData', options, function(err) {\n            this._loaded = true;\n            callback(err);\n\n        }.bind(this));\n    },\n\n    loadTile: function (tile, callback) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            type: this.type,\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            maxZoom: this.maxzoom,\n            tileSize: this.tileSize,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        tile.workerID = this.dispatcher.send('load tile', params, function(err, data) {\n\n            tile.unloadVectorData(this.map.painter);\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            return callback(null);\n\n        }.bind(this), this.workerID);\n    },\n\n    abortTile: function(tile) {\n        tile.aborted = true;\n    },\n\n    unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, function() {}, tile.workerID);\n    },\n\n    serialize: function() {\n        return {\n            type: this.type,\n            data: this._data\n        };\n    }\n});\n\n\n/***/ }),\n/* 1369 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\n\nmodule.exports = ArrayGroup;\n\n/**\n * A class that manages vertex and element arrays for a range of features. It handles initialization,\n * serialization for transfer to the main thread, and certain intervening mutations.\n *\n * Array elements are broken into array groups based on inherent limits of WebGL. Within a group is:\n *\n * * A \"layout\" vertex array, with fixed layout, containing values calculated from layout properties.\n * * Zero, one, or two element arrays, with fixed layout, typically for eventual use in\n *   `gl.drawElements(gl.TRIANGLES, ...)`.\n * * Zero or more \"paint\" vertex arrays keyed by layer ID, each with a dynamic layout which depends\n *   on which paint properties of that layer use data-driven-functions (property functions or\n *   property-and-zoom functions). Values are calculated by evaluating those functions.\n *\n * @private\n */\nfunction ArrayGroup(arrayTypes) {\n    var LayoutVertexArrayType = arrayTypes.layoutVertexArrayType;\n    this.layoutVertexArray = new LayoutVertexArrayType();\n\n    var ElementArrayType = arrayTypes.elementArrayType;\n    if (ElementArrayType) this.elementArray = new ElementArrayType();\n\n    var ElementArrayType2 = arrayTypes.elementArrayType2;\n    if (ElementArrayType2) this.elementArray2 = new ElementArrayType2();\n\n    this.paintVertexArrays = util.mapObject(arrayTypes.paintVertexArrayTypes, function (PaintVertexArrayType) {\n        return new PaintVertexArrayType();\n    });\n}\n\n/**\n * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit\n * addressing of vertex buffers.\n * @private\n * @readonly\n */\nArrayGroup.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;\n\nArrayGroup.prototype.hasCapacityFor = function(numVertices) {\n    return this.layoutVertexArray.length + numVertices <= ArrayGroup.MAX_VERTEX_ARRAY_LENGTH;\n};\n\nArrayGroup.prototype.isEmpty = function() {\n    return this.layoutVertexArray.length === 0;\n};\n\nArrayGroup.prototype.trim = function() {\n    this.layoutVertexArray.trim();\n\n    if (this.elementArray) {\n        this.elementArray.trim();\n    }\n\n    if (this.elementArray2) {\n        this.elementArray2.trim();\n    }\n\n    for (var layerName in this.paintVertexArrays) {\n        this.paintVertexArrays[layerName].trim();\n    }\n};\n\nArrayGroup.prototype.serialize = function() {\n    return {\n        layoutVertexArray: this.layoutVertexArray.serialize(),\n        elementArray: this.elementArray && this.elementArray.serialize(),\n        elementArray2: this.elementArray2 && this.elementArray2.serialize(),\n        paintVertexArrays: util.mapObject(this.paintVertexArrays, function(array) {\n            return array.serialize();\n        })\n    };\n};\n\nArrayGroup.prototype.getTransferables = function(transferables) {\n    transferables.push(this.layoutVertexArray.arrayBuffer);\n\n    if (this.elementArray) {\n        transferables.push(this.elementArray.arrayBuffer);\n    }\n\n    if (this.elementArray2) {\n        transferables.push(this.elementArray2.arrayBuffer);\n    }\n\n    for (var layerName in this.paintVertexArrays) {\n        transferables.push(this.paintVertexArrays[layerName].arrayBuffer);\n    }\n};\n\n\n/***/ }),\n/* 1370 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar Buffer = __webpack_require__(161);\nvar VertexArrayObject = __webpack_require__(162);\n\nmodule.exports = BufferGroup;\n\nfunction BufferGroup(arrayGroup, arrayTypes) {\n    this.layoutVertexBuffer = new Buffer(arrayGroup.layoutVertexArray,\n        arrayTypes.layoutVertexArrayType, Buffer.BufferType.VERTEX);\n\n    if (arrayGroup.elementArray) {\n        this.elementBuffer = new Buffer(arrayGroup.elementArray,\n            arrayTypes.elementArrayType, Buffer.BufferType.ELEMENT);\n    }\n\n    var vaos = this.vaos = {};\n    var secondVaos;\n\n    if (arrayGroup.elementArray2) {\n        this.elementBuffer2 = new Buffer(arrayGroup.elementArray2,\n            arrayTypes.elementArrayType2, Buffer.BufferType.ELEMENT);\n        secondVaos = this.secondVaos = {};\n    }\n\n    this.paintVertexBuffers = util.mapObject(arrayGroup.paintVertexArrays, function(array, name) {\n        vaos[name] = new VertexArrayObject();\n        if (arrayGroup.elementArray2) {\n            secondVaos[name] = new VertexArrayObject();\n        }\n        return new Buffer(array, arrayTypes.paintVertexArrayTypes[name], Buffer.BufferType.VERTEX);\n    });\n}\n\nBufferGroup.prototype.destroy = function(gl) {\n    this.layoutVertexBuffer.destroy(gl);\n    if (this.elementBuffer) {\n        this.elementBuffer.destroy(gl);\n    }\n    if (this.elementBuffer2) {\n        this.elementBuffer2.destroy(gl);\n    }\n    for (var n in this.paintVertexBuffers) {\n        this.paintVertexBuffers[n].destroy(gl);\n    }\n    for (var j in this.vaos) {\n        this.vaos[j].destroy(gl);\n    }\n    for (var k in this.secondVaos) {\n        this.secondVaos[k].destroy(gl);\n    }\n};\n\n\n/***/ }),\n/* 1371 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(42);\nvar util = __webpack_require__(6);\nvar loadGeometry = __webpack_require__(163);\nvar earcut = __webpack_require__(560);\nvar classifyRings = __webpack_require__(645);\nvar EARCUT_MAX_RINGS = 500;\n\nmodule.exports = FillBucket;\n\nfunction FillBucket() {\n    Bucket.apply(this, arguments);\n}\n\nFillBucket.prototype = util.inherit(Bucket, {});\n\nFillBucket.prototype.programInterfaces = {\n    fill: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }]),\n        elementArrayType: new Bucket.ElementArrayType(1),\n        elementArrayType2: new Bucket.ElementArrayType(2),\n\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-color'\n        }, {\n            name: 'a_outline_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-outline-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-outline-color'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"fill-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'fill-opacity'\n        }]\n    }\n};\n\nFillBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    var polygons = classifyRings(lines, EARCUT_MAX_RINGS);\n\n    var startGroup = this.prepareArrayGroup('fill', 0);\n    var startIndex = startGroup.layoutVertexArray.length;\n\n    for (var i = 0; i < polygons.length; i++) {\n        this.addPolygon(polygons[i]);\n    }\n\n    this.populatePaintArrays('fill', {zoom: this.zoom}, feature.properties, startGroup, startIndex);\n};\n\nFillBucket.prototype.addPolygon = function(polygon) {\n    var numVertices = 0;\n    for (var k = 0; k < polygon.length; k++) {\n        numVertices += polygon[k].length;\n    }\n\n    var group = this.prepareArrayGroup('fill', numVertices);\n    var flattened = [];\n    var holeIndices = [];\n    var startIndex = group.layoutVertexArray.length;\n\n    for (var r = 0; r < polygon.length; r++) {\n        var ring = polygon[r];\n\n        if (r > 0) holeIndices.push(flattened.length / 2);\n\n        for (var v = 0; v < ring.length; v++) {\n            var vertex = ring[v];\n\n            var index = group.layoutVertexArray.emplaceBack(vertex.x, vertex.y);\n\n            if (v >= 1) {\n                group.elementArray2.emplaceBack(index - 1, index);\n            }\n\n            // convert to format used by earcut\n            flattened.push(vertex.x);\n            flattened.push(vertex.y);\n        }\n    }\n\n    var triangleIndices = earcut(flattened, holeIndices);\n\n    for (var i = 0; i < triangleIndices.length; i++) {\n        group.elementArray.emplaceBack(triangleIndices[i] + startIndex);\n    }\n};\n\n\n/***/ }),\n/* 1372 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(42);\nvar util = __webpack_require__(6);\nvar loadGeometry = __webpack_require__(163);\nvar EXTENT = Bucket.EXTENT;\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nvar EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nvar COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nvar SHARP_CORNER_OFFSET = 15;\n\n// The number of bits that is used to store the line distance in the buffer.\nvar LINE_DISTANCE_BUFFER_BITS = 15;\n\n// We don't have enough bits for the line distance as we'd like to have, so\n// use this value to scale the line distance (in tile units) down to a smaller\n// value. This lets us store longer distances while sacrificing precision.\nvar LINE_DISTANCE_SCALE = 1 / 2;\n\n// The maximum line distance, in tile units, that fits in the buffer.\nvar MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;\n\n\nmodule.exports = LineBucket;\n\n/**\n * @private\n */\nfunction LineBucket() {\n    Bucket.apply(this, arguments);\n}\n\nLineBucket.prototype = util.inherit(Bucket, {});\n\nLineBucket.prototype.addLineVertex = function(layoutVertexBuffer, point, extrude, tx, ty, dir, linesofar) {\n    return layoutVertexBuffer.emplaceBack(\n            // a_pos\n            (point.x << 1) | tx,\n            (point.y << 1) | ty,\n            // a_data\n            // add 128 to store an byte in an unsigned byte\n            Math.round(EXTRUDE_SCALE * extrude.x) + 128,\n            Math.round(EXTRUDE_SCALE * extrude.y) + 128,\n            // Encode the -1/0/1 direction value into the first two bits of .z of a_data.\n            // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make\n            // room for the direction value). The upper 8 bits of `linesofar` are placed in\n            // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that\n            // we can store longer distances while sacrificing precision.\n            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2),\n            (linesofar * LINE_DISTANCE_SCALE) >> 6);\n};\n\nLineBucket.prototype.programInterfaces = {\n    line: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 4,\n            type: 'Uint8'\n        }]),\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"line-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'line-color'\n        }],\n        elementArrayType: new Bucket.ElementArrayType()\n    }\n};\n\nLineBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature, LINE_DISTANCE_BUFFER_BITS);\n    for (var i = 0; i < lines.length; i++) {\n        this.addLine(\n            lines[i],\n            feature.properties,\n            this.layer.layout['line-join'],\n            this.layer.layout['line-cap'],\n            this.layer.layout['line-miter-limit'],\n            this.layer.layout['line-round-limit']\n        );\n    }\n};\n\nLineBucket.prototype.addLine = function(vertices, featureProperties, join, cap, miterLimit, roundLimit) {\n\n    var len = vertices.length;\n    // If the line has duplicate vertices at the end, adjust length to remove them.\n    while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) {\n        len--;\n    }\n\n    // a line must have at least two vertices\n    if (vertices.length < 2) return;\n\n    if (join === 'bevel') miterLimit = 1.05;\n\n    var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling));\n\n    var firstVertex = vertices[0],\n        lastVertex = vertices[len - 1],\n        closed = firstVertex.equals(lastVertex);\n\n    // we could be more precise, but it would only save a negligible amount of space\n    var group = this.prepareArrayGroup('line', len * 10);\n    var startIndex = group.layoutVertexArray.length;\n\n    // a line may not have coincident points\n    if (len === 2 && closed) return;\n\n    this.distance = 0;\n\n    var beginCap = cap,\n        endCap = closed ? 'butt' : cap,\n        startOfLine = true,\n        currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n    // the last three vertices added\n    this.e1 = this.e2 = this.e3 = -1;\n\n    if (closed) {\n        currentVertex = vertices[len - 2];\n        nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n    }\n\n    for (var i = 0; i < len; i++) {\n\n        nextVertex = closed && i === len - 1 ?\n            vertices[1] : // if the line is closed, we treat the last vertex like the first\n            vertices[i + 1]; // just the next vertex\n\n        // if two consecutive vertices exist, skip the current one\n        if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n        if (nextNormal) prevNormal = nextNormal;\n        if (currentVertex) prevVertex = currentVertex;\n\n        currentVertex = vertices[i];\n\n        // Calculate the normal towards the next vertex in this line. In case\n        // there is no next vertex, pretend that the line is continuing straight,\n        // meaning that we are just using the previous normal.\n        nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n        // If we still don't have a previous normal, this is the beginning of a\n        // non-closed line, so we're doing a straight \"join\".\n        prevNormal = prevNormal || nextNormal;\n\n        // Determine the normal of the join extrusion. It is the angle bisector\n        // of the segments between the previous line and the next line.\n        var joinNormal = prevNormal.add(nextNormal)._unit();\n\n        /*  joinNormal     prevNormal\n         *             ↖      ↑\n         *                .________. prevVertex\n         *                |\n         * nextNormal  ←  |  currentVertex\n         *                |\n         *     nextVertex !\n         *\n         */\n\n        // Calculate the length of the miter (the ratio of the miter to the width).\n        // Find the cosine of the angle between the next and join normals\n        // using dot product. The inverse of that is the miter length.\n        var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n        var miterLength = 1 / cosHalfAngle;\n\n        var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n\n        if (isSharpCorner && i > 0) {\n            var prevSegmentLength = currentVertex.dist(prevVertex);\n            if (prevSegmentLength > 2 * sharpCornerOffset) {\n                var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n                this.distance += newPrevVertex.dist(prevVertex);\n                this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false);\n                prevVertex = newPrevVertex;\n            }\n        }\n\n        // The join if a middle vertex, otherwise the cap.\n        var middleVertex = prevVertex && nextVertex;\n        var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n        if (middleVertex && currentJoin === 'round') {\n            if (miterLength < roundLimit) {\n                currentJoin = 'miter';\n            } else if (miterLength <= 2) {\n                currentJoin = 'fakeround';\n            }\n        }\n\n        if (currentJoin === 'miter' && miterLength > miterLimit) {\n            currentJoin = 'bevel';\n        }\n\n        if (currentJoin === 'bevel') {\n            // The maximum extrude length is 128 / 63 = 2 times the width of the line\n            // so if miterLength >= 2 we need to draw a different type of bevel where.\n            if (miterLength > 2) currentJoin = 'flipbevel';\n\n            // If the miterLength is really small and the line bevel wouldn't be visible,\n            // just draw a miter join to save a triangle.\n            if (miterLength < miterLimit) currentJoin = 'miter';\n        }\n\n        // Calculate how far along the line the currentVertex is\n        if (prevVertex) this.distance += currentVertex.dist(prevVertex);\n\n        if (currentJoin === 'miter') {\n\n            joinNormal._mult(miterLength);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n\n        } else if (currentJoin === 'flipbevel') {\n            // miter is too big, flip the direction to make a beveled join\n\n            if (miterLength > 100) {\n                // Almost parallel lines\n                joinNormal = nextNormal.clone();\n\n            } else {\n                var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n                var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n                joinNormal._perp()._mult(bevelLength * direction);\n            }\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false);\n\n        } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n            var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n            var offset = -Math.sqrt(miterLength * miterLength - 1);\n            if (lineTurnsLeft) {\n                offsetB = 0;\n                offsetA = offset;\n            } else {\n                offsetA = 0;\n                offsetB = offset;\n            }\n\n            // Close previous segment with a bevel\n            if (!startOfLine) {\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false);\n            }\n\n            if (currentJoin === 'fakeround') {\n                // The join angle is sharp enough that a round join would be visible.\n                // Bevel joins fill the gap between segments with a single pie slice triangle.\n                // Create a round join by adding multiple pie slices. The join isn't actually round, but\n                // it looks like it is at the sizes we render lines at.\n\n                // Add more triangles for sharper angles.\n                // This math is just a good enough approximation. It isn't \"correct\".\n                var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n                var approxFractionalJoinNormal;\n\n                for (var m = 0; m < n; m++) {\n                    approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n\n                this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft);\n\n                for (var k = n - 1; k >= 0; k--) {\n                    approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false);\n            }\n\n        } else if (currentJoin === 'butt') {\n            if (!startOfLine) {\n                // Close previous segment with a butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n            }\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n\n        } else if (currentJoin === 'square') {\n\n            if (!startOfLine) {\n                // Close previous segment with a square cap\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false);\n            }\n\n        } else if (currentJoin === 'round') {\n\n            if (!startOfLine) {\n                // Close previous segment with butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n\n                // Add round cap or linejoin at end of segment\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                // Add round cap before first segment\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true);\n\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n        }\n\n        if (isSharpCorner && i < len - 1) {\n            var nextSegmentLength = currentVertex.dist(nextVertex);\n            if (nextSegmentLength > 2 * sharpCornerOffset) {\n                var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n                this.distance += newCurrentVertex.dist(currentVertex);\n                this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false);\n                currentVertex = newCurrentVertex;\n            }\n        }\n\n        startOfLine = false;\n    }\n\n    this.populatePaintArrays(\n        'line', {zoom: this.zoom},\n        featureProperties,\n        group,\n        startIndex\n    );\n};\n\n/**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beginning of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\nLineBucket.prototype.addCurrentVertex = function(currentVertex, distance, normal, endLeft, endRight, round) {\n    var tx = round ? 1 : 0;\n    var extrude;\n    var arrayGroup = this.arrayGroups.line[this.arrayGroups.line.length - 1];\n    var layoutVertexArray = arrayGroup.layoutVertexArray;\n    var elementArray = arrayGroup.elementArray;\n\n    extrude = normal.clone();\n    if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 0, endLeft, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    extrude = normal.mult(-1);\n    if (endRight) extrude._sub(normal.perp()._mult(endRight));\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 1, -endRight, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    // There is a maximum \"distance along the line\" that we can store in the buffers.\n    // When we get close to the distance, reset it to zero and add the vertex again with\n    // a distance of zero. The max distance is determined by the number of bits we allocate\n    // to `linesofar`.\n    if (distance > MAX_LINE_DISTANCE / 2) {\n        this.distance = 0;\n        this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round);\n    }\n};\n\n/**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\nLineBucket.prototype.addPieSliceVertex = function(currentVertex, distance, extrude, lineTurnsLeft) {\n    var ty = lineTurnsLeft ? 1 : 0;\n    extrude = extrude.mult(lineTurnsLeft ? -1 : 1);\n    var arrayGroup = this.arrayGroups.line[this.arrayGroups.line.length - 1];\n    var layoutVertexArray = arrayGroup.layoutVertexArray;\n    var elementArray = arrayGroup.elementArray;\n\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, 0, ty, 0, distance);\n\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n\n    if (lineTurnsLeft) {\n        this.e2 = this.e3;\n    } else {\n        this.e1 = this.e3;\n    }\n};\n\n\n/***/ }),\n/* 1373 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Bucket = __webpack_require__(42);\nvar util = __webpack_require__(6);\nvar loadGeometry = __webpack_require__(163);\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = CircleBucket;\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nfunction CircleBucket() {\n    Bucket.apply(this, arguments);\n}\n\nCircleBucket.prototype = util.inherit(Bucket, {});\n\nCircleBucket.prototype.addCircleVertex = function(layoutVertexArray, x, y, extrudeX, extrudeY) {\n    return layoutVertexArray.emplaceBack(\n            (x * 2) + ((extrudeX + 1) / 2),\n            (y * 2) + ((extrudeY + 1) / 2));\n};\n\nCircleBucket.prototype.programInterfaces = {\n    circle: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }]),\n        elementArrayType: new Bucket.ElementArrayType(),\n\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"circle-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'circle-color'\n        }, {\n            name: 'a_radius',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-radius\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-radius'\n        }, {\n            name: 'a_blur',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-blur\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-blur'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'circle-opacity'\n        }]\n    }\n};\n\nCircleBucket.prototype.addFeature = function(feature) {\n    var globalProperties = {zoom: this.zoom};\n    var geometries = loadGeometry(feature);\n\n    var startGroup = this.prepareArrayGroup('circle', 0);\n    var startIndex = startGroup.layoutVertexArray.length;\n\n    for (var j = 0; j < geometries.length; j++) {\n        for (var k = 0; k < geometries[j].length; k++) {\n\n            var x = geometries[j][k].x;\n            var y = geometries[j][k].y;\n\n            // Do not include points that are outside the tile boundaries.\n            if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n            // this geometry will be of the Point type, and we'll derive\n            // two triangles from it.\n            //\n            // ┌─────────┐\n            // │ 3     2 │\n            // │         │\n            // │ 0     1 │\n            // └─────────┘\n\n            var group = this.prepareArrayGroup('circle', 4);\n            var layoutVertexArray = group.layoutVertexArray;\n\n            var index = this.addCircleVertex(layoutVertexArray, x, y, -1, -1);\n            this.addCircleVertex(layoutVertexArray, x, y, 1, -1);\n            this.addCircleVertex(layoutVertexArray, x, y, 1, 1);\n            this.addCircleVertex(layoutVertexArray, x, y, -1, 1);\n\n            group.elementArray.emplaceBack(index, index + 1, index + 2);\n            group.elementArray.emplaceBack(index, index + 3, index + 2);\n        }\n    }\n\n    this.populatePaintArrays('circle', globalProperties, feature.properties, startGroup, startIndex);\n};\n\n\n/***/ }),\n/* 1374 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nvar Bucket = __webpack_require__(42);\nvar Anchor = __webpack_require__(646);\nvar getAnchors = __webpack_require__(1375);\nvar resolveTokens = __webpack_require__(647);\nvar Quads = __webpack_require__(648);\nvar Shaping = __webpack_require__(1377);\nvar resolveText = __webpack_require__(1378);\nvar mergeLines = __webpack_require__(1379);\nvar clipLine = __webpack_require__(1380);\nvar util = __webpack_require__(6);\nvar loadGeometry = __webpack_require__(163);\nvar CollisionFeature = __webpack_require__(1381);\nvar findPoleOfInaccessibility = __webpack_require__(1382);\nvar classifyRings = __webpack_require__(645);\n\nvar shapeText = Shaping.shapeText;\nvar shapeIcon = Shaping.shapeIcon;\nvar getGlyphQuads = Quads.getGlyphQuads;\nvar getIconQuads = Quads.getIconQuads;\n\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = SymbolBucket;\n\nfunction SymbolBucket(options) {\n    Bucket.apply(this, arguments);\n    this.showCollisionBoxes = options.showCollisionBoxes;\n    this.overscaling = options.overscaling;\n    this.collisionBoxArray = options.collisionBoxArray;\n    this.symbolQuadsArray = options.symbolQuadsArray;\n    this.symbolInstancesArray = options.symbolInstancesArray;\n\n    this.sdfIcons = options.sdfIcons;\n    this.iconsNeedLinear = options.iconsNeedLinear;\n    this.adjustedTextSize = options.adjustedTextSize;\n    this.adjustedIconSize = options.adjustedIconSize;\n    this.fontstack = options.fontstack;\n}\n\n// this constant is based on the size of the glyphQuadEndIndex and iconQuadEndIndex\n// in the symbol_instances StructArrayType\n// eg the max valid UInt16 is 65,535\nSymbolBucket.MAX_QUADS = 65535;\n\nSymbolBucket.prototype = util.inherit(Bucket, {});\n\nSymbolBucket.prototype.serialize = function() {\n    var serialized = Bucket.prototype.serialize.apply(this);\n    serialized.sdfIcons = this.sdfIcons;\n    serialized.iconsNeedLinear = this.iconsNeedLinear;\n    serialized.adjustedTextSize = this.adjustedTextSize;\n    serialized.adjustedIconSize = this.adjustedIconSize;\n    serialized.fontstack = this.fontstack;\n    return serialized;\n};\n\nvar layoutVertexArrayType = new Bucket.VertexArrayType([{\n    name: 'a_pos',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_offset',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_texture_pos',\n    components: 2,\n    type: 'Uint16'\n}, {\n    name: 'a_data',\n    components: 4,\n    type: 'Uint8'\n}]);\n\nvar elementArrayType = new Bucket.ElementArrayType();\n\nfunction addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom, labelangle) {\n    return array.emplaceBack(\n            // a_pos\n            x,\n            y,\n\n            // a_offset\n            Math.round(ox * 64),\n            Math.round(oy * 64),\n\n            // a_texture_pos\n            tx / 4, // x coordinate of symbol on glyph atlas texture\n            ty / 4, // y coordinate of symbol on glyph atlas texture\n\n            // a_data\n            (labelminzoom || 0) * 10, // labelminzoom\n            labelangle, // labelangle\n            (minzoom || 0) * 10, // minzoom\n            Math.min(maxzoom || 25, 25) * 10); // maxzoom\n}\n\nSymbolBucket.prototype.addCollisionBoxVertex = function(layoutVertexArray, point, extrude, maxZoom, placementZoom) {\n    return layoutVertexArray.emplaceBack(\n            // pos\n            point.x,\n            point.y,\n            // extrude\n            Math.round(extrude.x),\n            Math.round(extrude.y),\n            // data\n            maxZoom * 10,\n            placementZoom * 10);\n};\n\nSymbolBucket.prototype.programInterfaces = {\n\n    glyph: {\n        layoutVertexArrayType: layoutVertexArrayType,\n        elementArrayType: elementArrayType\n    },\n\n    icon: {\n        layoutVertexArrayType: layoutVertexArrayType,\n        elementArrayType: elementArrayType\n    },\n\n    collisionBox: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_extrude',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 2,\n            type: 'Uint8'\n        }])\n    }\n};\n\nSymbolBucket.prototype.populateArrays = function(collisionTile, stacks, icons) {\n\n    // To reduce the number of labels that jump around when zooming we need\n    // to use a text-size value that is the same for all zoom levels.\n    // This calculates text-size at a high zoom level so that all tiles can\n    // use the same value when calculating anchor positions.\n    var zoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\n    this.adjustedTextMaxSize = this.layer.getLayoutValue('text-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedTextSize = this.layer.getLayoutValue('text-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n    this.adjustedIconMaxSize = this.layer.getLayoutValue('icon-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedIconSize = this.layer.getLayoutValue('icon-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n\n    var tileSize = 512 * this.overscaling;\n    this.tilePixelRatio = EXTENT / tileSize;\n    this.compareText = {};\n    this.iconsNeedLinear = false;\n    this.symbolInstancesStartIndex = this.symbolInstancesArray.length;\n\n    var layout = this.layer.layout;\n    var features = this.features;\n    var textFeatures = this.textFeatures;\n\n    var horizontalAlign = 0.5,\n        verticalAlign = 0.5;\n\n    switch (layout['text-anchor']) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        horizontalAlign = 1;\n        break;\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        horizontalAlign = 0;\n        break;\n    }\n\n    switch (layout['text-anchor']) {\n    case 'bottom':\n    case 'bottom-right':\n    case 'bottom-left':\n        verticalAlign = 1;\n        break;\n    case 'top':\n    case 'top-right':\n    case 'top-left':\n        verticalAlign = 0;\n        break;\n    }\n\n    var justify = layout['text-justify'] === 'right' ? 1 :\n        layout['text-justify'] === 'left' ? 0 :\n        0.5;\n\n    var oneEm = 24;\n    var lineHeight = layout['text-line-height'] * oneEm;\n    var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n    var spacing = layout['text-letter-spacing'] * oneEm;\n    var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n    var fontstack = this.fontstack = layout['text-font'].join(',');\n\n    var geometries = [];\n    for (var g = 0; g < features.length; g++) {\n        geometries.push(loadGeometry(features[g]));\n    }\n\n    if (layout['symbol-placement'] === 'line') {\n        // Merge adjacent lines with the same text to improve labelling.\n        // It's better to place labels on one long line than on many short segments.\n        var merged = mergeLines(features, textFeatures, geometries);\n\n        geometries = merged.geometries;\n        features = merged.features;\n        textFeatures = merged.textFeatures;\n    }\n\n    var shapedText, shapedIcon;\n\n    for (var k = 0; k < features.length; k++) {\n        if (!geometries[k]) continue;\n\n        if (textFeatures[k]) {\n            shapedText = shapeText(textFeatures[k], stacks[fontstack], maxWidth,\n                    lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset);\n        } else {\n            shapedText = null;\n        }\n\n        if (layout['icon-image']) {\n            var iconName = resolveTokens(features[k].properties, layout['icon-image']);\n            var image = icons[iconName];\n            shapedIcon = shapeIcon(image, layout);\n\n            if (image) {\n                if (this.sdfIcons === undefined) {\n                    this.sdfIcons = image.sdf;\n                } else if (this.sdfIcons !== image.sdf) {\n                    util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n                }\n                if (image.pixelRatio !== 1) {\n                    this.iconsNeedLinear = true;\n                } else if (layout['icon-rotate'] !== 0 || !this.layer.isLayoutValueFeatureConstant('icon-rotate')) {\n                    this.iconsNeedLinear = true;\n                }\n            }\n        } else {\n            shapedIcon = null;\n        }\n\n        if (shapedText || shapedIcon) {\n            this.addFeature(geometries[k], shapedText, shapedIcon, features[k]);\n        }\n    }\n    this.symbolInstancesEndIndex = this.symbolInstancesArray.length;\n    this.placeFeatures(collisionTile, this.showCollisionBoxes);\n\n    this.trimArrays();\n};\n\nSymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon, feature) {\n    var layout = this.layer.layout;\n\n    var glyphSize = 24;\n\n    var fontScale = this.adjustedTextSize / glyphSize,\n        textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize,\n        textBoxScale = this.tilePixelRatio * fontScale,\n        textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize,\n        iconBoxScale = this.tilePixelRatio * this.adjustedIconSize,\n        symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'],\n        avoidEdges = layout['symbol-avoid-edges'],\n        textPadding = layout['text-padding'] * this.tilePixelRatio,\n        iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n        textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n        textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n            layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n        symbolPlacement = layout['symbol-placement'],\n        isLine = symbolPlacement === 'line',\n        textRepeatDistance = symbolMinDistance / 2;\n\n    var list = null;\n    if (isLine) {\n        list = clipLine(lines, 0, 0, EXTENT, EXTENT);\n    } else {\n        // Only care about looping through the outer rings\n        list = classifyRings(lines, 0);\n    }\n\n    for (var i = 0; i < list.length; i++) {\n        var anchors = null;\n        // At this point it is a list of points for a line or a list of polygon rings\n        var pointsOrRings = list[i];\n        var line = null;\n\n        // Calculate the anchor points around which you want to place labels\n        if (isLine) {\n            line = pointsOrRings;\n            anchors = getAnchors(\n                line,\n                symbolMinDistance,\n                textMaxAngle,\n                shapedText,\n                shapedIcon,\n                glyphSize,\n                textMaxBoxScale,\n                this.overscaling,\n                EXTENT\n            );\n        } else {\n            line = pointsOrRings[0];\n            anchors = this.findPolygonAnchors(pointsOrRings);\n        }\n\n\n        // Here line is a list of points that is either the outer ring of a polygon or just a line\n\n        // For each potential label, create the placement features used to check for collisions, and the quads use for rendering.\n        for (var j = 0, len = anchors.length; j < len; j++) {\n            var anchor = anchors[j];\n\n            if (shapedText && isLine) {\n                if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n                    continue;\n                }\n            }\n\n            var inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT);\n\n            if (avoidEdges && !inside) continue;\n\n            // Normally symbol layers are drawn across tile boundaries. Only symbols\n            // with their anchors within the tile boundaries are added to the buffers\n            // to prevent symbols from being drawn twice.\n            //\n            // Symbols in layers with overlap are sorted in the y direction so that\n            // symbols lower on the canvas are drawn on top of symbols near the top.\n            // To preserve this order across tile boundaries these symbols can't\n            // be drawn across tile boundaries. Instead they need to be included in\n            // the buffers for both tiles and clipped to tile boundaries at draw time.\n            var addToBuffers = inside || mayOverlap;\n            this.addSymbolInstance(anchor, line, shapedText, shapedIcon, this.layer,\n                addToBuffers, this.symbolInstancesArray.length, this.collisionBoxArray, feature.index, this.sourceLayerIndex, this.index,\n                textBoxScale, textPadding, textAlongLine,\n                iconBoxScale, iconPadding, iconAlongLine, {zoom: this.zoom}, feature.properties);\n        }\n    }\n};\n\nSymbolBucket.prototype.findPolygonAnchors = function(polygonRings) {\n\n    var outerRing = polygonRings[0];\n    if (outerRing.length === 0) {\n        return [];\n    } else if (outerRing.length < 3 || !util.isClosedPolygon(outerRing)) {\n        return [ new Anchor(outerRing[0].x, outerRing[0].y, 0) ];\n    }\n\n    var anchors = null;\n    // 16 here represents 2 pixels\n    var poi = findPoleOfInaccessibility(polygonRings, 16);\n    anchors = [ new Anchor(poi.x, poi.y, 0) ];\n\n    return anchors;\n};\n\nSymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) {\n    var compareText = this.compareText;\n    if (!(text in compareText)) {\n        compareText[text] = [];\n    } else {\n        var otherAnchors = compareText[text];\n        for (var k = otherAnchors.length - 1; k >= 0; k--) {\n            if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n                // If it's within repeatDistance of one anchor, stop looking\n                return true;\n            }\n        }\n    }\n    // If anchor is not within repeatDistance of any other anchor, add to array\n    compareText[text].push(anchor);\n    return false;\n};\n\nSymbolBucket.prototype.placeFeatures = function(collisionTile, showCollisionBoxes) {\n    this.recalculateStyleLayers();\n\n    // Calculate which labels can be shown and when they can be shown and\n    // create the bufers used for rendering.\n\n    this.createArrays();\n\n    var layout = this.layer.layout;\n\n    var maxScale = collisionTile.maxScale;\n\n    var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n    var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n    var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n        layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n    // Sort symbols by their y position on the canvas so that the lower symbols\n    // are drawn on top of higher symbols.\n    // Don't sort symbols that won't overlap because it isn't necessary and\n    // because it causes more labels to pop in and out when rotating.\n    if (mayOverlap) {\n        // Only need the symbol instances from the current tile to sort, so convert those instances into an array\n        // of `StructType`s to enable sorting\n        var symbolInstancesStructTypeArray = this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex, this.symbolInstancesEndIndex);\n\n        var angle = collisionTile.angle;\n\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle);\n\n        this.sortedSymbolInstances = symbolInstancesStructTypeArray.sort(function(a, b) {\n            var aRotated = (sin * a.anchorPointX + cos * a.anchorPointY) | 0;\n            var bRotated = (sin * b.anchorPointX + cos * b.anchorPointY) | 0;\n            return (aRotated - bRotated) || (b.index - a.index);\n        });\n    }\n\n    for (var p = this.symbolInstancesStartIndex; p < this.symbolInstancesEndIndex; p++) {\n        var symbolInstance = this.sortedSymbolInstances ? this.sortedSymbolInstances[p - this.symbolInstancesStartIndex] : this.symbolInstancesArray.get(p);\n        var textCollisionFeature = {\n            boxStartIndex: symbolInstance.textBoxStartIndex,\n            boxEndIndex: symbolInstance.textBoxEndIndex\n        };\n        var iconCollisionFeature = {\n            boxStartIndex: symbolInstance.iconBoxStartIndex,\n            boxEndIndex: symbolInstance.iconBoxEndIndex\n        };\n\n        var hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex);\n        var hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex);\n\n        var iconWithoutText = layout['text-optional'] || !hasText,\n            textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n        // Calculate the scales at which the text and icon can be placed without collision.\n\n        var glyphScale = hasText ?\n            collisionTile.placeCollisionFeature(textCollisionFeature,\n\t\t\t\t\tlayout['text-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n        var iconScale = hasIcon ?\n            collisionTile.placeCollisionFeature(iconCollisionFeature,\n                    layout['icon-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n\n        // Combine the scales for icons and text.\n\n        if (!iconWithoutText && !textWithoutIcon) {\n            iconScale = glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!textWithoutIcon && glyphScale) {\n            glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!iconWithoutText && iconScale) {\n            iconScale = Math.max(iconScale, glyphScale);\n        }\n\n\n        // Insert final placement into collision tree and add glyphs/icons to buffers\n\n        if (hasText) {\n            collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']);\n            if (glyphScale <= maxScale) {\n                this.addSymbols('glyph', symbolInstance.glyphQuadStartIndex, symbolInstance.glyphQuadEndIndex, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle);\n            }\n        }\n\n        if (hasIcon) {\n            collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']);\n            if (iconScale <= maxScale) {\n                this.addSymbols('icon', symbolInstance.iconQuadStartIndex, symbolInstance.iconQuadEndIndex, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle);\n            }\n        }\n\n    }\n\n    if (showCollisionBoxes) this.addToDebugBuffers(collisionTile);\n};\n\nSymbolBucket.prototype.addSymbols = function(programName, quadsStart, quadsEnd, scale, keepUpright, alongLine, placementAngle) {\n\n    var group = this.prepareArrayGroup(programName, 4 * (quadsEnd - quadsStart));\n\n    var elementArray = group.elementArray;\n    var layoutVertexArray = group.layoutVertexArray;\n\n    var zoom = this.zoom;\n    var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n    for (var k = quadsStart; k < quadsEnd; k++) {\n\n        var symbol = this.symbolQuadsArray.get(k).SymbolQuad;\n\n        // drop upside down versions of glyphs\n        var a = (symbol.anchorAngle + placementAngle + Math.PI) % (Math.PI * 2);\n        if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n        var tl = symbol.tl,\n            tr = symbol.tr,\n            bl = symbol.bl,\n            br = symbol.br,\n            tex = symbol.tex,\n            anchorPoint = symbol.anchorPoint,\n\n            minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom),\n            maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n        if (maxZoom <= minZoom) continue;\n\n        // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n        if (minZoom === placementZoom) minZoom = 0;\n\n        // Encode angle of glyph\n        var glyphAngle = Math.round((symbol.glyphAngle / (Math.PI * 2)) * 256);\n\n        var index = addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n\n        elementArray.emplaceBack(index, index + 1, index + 2);\n        elementArray.emplaceBack(index + 1, index + 2, index + 3);\n    }\n\n};\n\nSymbolBucket.prototype.updateIcons = function(icons) {\n    this.recalculateStyleLayers();\n    var iconValue = this.layer.layout['icon-image'];\n    if (!iconValue) return;\n\n    for (var i = 0; i < this.features.length; i++) {\n        var iconName = resolveTokens(this.features[i].properties, iconValue);\n        if (iconName)\n            icons[iconName] = true;\n    }\n};\n\nSymbolBucket.prototype.updateFont = function(stacks) {\n    this.recalculateStyleLayers();\n    var fontName = this.layer.layout['text-font'],\n        stack = stacks[fontName] = stacks[fontName] || {};\n\n    this.textFeatures = resolveText(this.features, this.layer.layout, stack);\n};\n\nSymbolBucket.prototype.addToDebugBuffers = function(collisionTile) {\n    var group = this.prepareArrayGroup('collisionBox', 0);\n    var layoutVertexArray = group.layoutVertexArray;\n    var angle = -collisionTile.angle;\n    var yStretch = collisionTile.yStretch;\n\n    for (var j = this.symbolInstancesStartIndex; j < this.symbolInstancesEndIndex; j++) {\n        var symbolInstance = this.symbolInstancesArray.get(j);\n        symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex};\n        symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex};\n\n        for (var i = 0; i < 2; i++) {\n            var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n            if (!feature) continue;\n\n            for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {\n                var box = this.collisionBoxArray.get(b);\n                var anchorPoint = box.anchorPoint;\n\n                var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n                var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n                var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n                var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n                var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n                var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom);\n            }\n        }\n    }\n};\n\nSymbolBucket.prototype.addSymbolInstance = function(anchor, line, shapedText, shapedIcon, layer, addToBuffers, index, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex,\n    textBoxScale, textPadding, textAlongLine,\n    iconBoxScale, iconPadding, iconAlongLine, globalProperties, featureProperties) {\n\n    var glyphQuadStartIndex, glyphQuadEndIndex, iconQuadStartIndex, iconQuadEndIndex, textCollisionFeature, iconCollisionFeature, glyphQuads, iconQuads;\n    if (shapedText) {\n        glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layer, textAlongLine) : [];\n        textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedText, textBoxScale, textPadding, textAlongLine, false);\n    }\n\n    glyphQuadStartIndex = this.symbolQuadsArray.length;\n    if (glyphQuads && glyphQuads.length) {\n        for (var i = 0; i < glyphQuads.length; i++) {\n            this.addSymbolQuad(glyphQuads[i]);\n        }\n    }\n    glyphQuadEndIndex = this.symbolQuadsArray.length;\n\n    var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    if (shapedIcon) {\n        iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layer, iconAlongLine, shapedText, globalProperties, featureProperties) : [];\n        iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true);\n    }\n\n    iconQuadStartIndex = this.symbolQuadsArray.length;\n    if (iconQuads && iconQuads.length === 1) {\n        this.addSymbolQuad(iconQuads[0]);\n    }\n    iconQuadEndIndex = this.symbolQuadsArray.length;\n\n    var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n    if (iconQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce(\"Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n    if (glyphQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n\n    return this.symbolInstancesArray.emplaceBack(\n        textBoxStartIndex,\n        textBoxEndIndex,\n        iconBoxStartIndex,\n        iconBoxEndIndex,\n        glyphQuadStartIndex,\n        glyphQuadEndIndex,\n        iconQuadStartIndex,\n        iconQuadEndIndex,\n        anchor.x,\n        anchor.y,\n        index);\n};\n\nSymbolBucket.prototype.addSymbolQuad = function(symbolQuad) {\n    return this.symbolQuadsArray.emplaceBack(\n        // anchorPoints\n        symbolQuad.anchorPoint.x,\n        symbolQuad.anchorPoint.y,\n        // corners\n        symbolQuad.tl.x,\n        symbolQuad.tl.y,\n        symbolQuad.tr.x,\n        symbolQuad.tr.y,\n        symbolQuad.bl.x,\n        symbolQuad.bl.y,\n        symbolQuad.br.x,\n        symbolQuad.br.y,\n        // texture\n        symbolQuad.tex.h,\n        symbolQuad.tex.w,\n        symbolQuad.tex.x,\n        symbolQuad.tex.y,\n        //angle\n        symbolQuad.anchorAngle,\n        symbolQuad.glyphAngle,\n        // scales\n        symbolQuad.maxScale,\n        symbolQuad.minScale);\n};\n\n\n/***/ }),\n/* 1375 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar interpolate = __webpack_require__(216);\nvar Anchor = __webpack_require__(646);\nvar checkMaxAngle = __webpack_require__(1376);\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {\n\n    // Resample a line to get anchor points for labels and check that each\n    // potential label passes text-max-angle check and has enough froom to fit\n    // on the line.\n\n    var angleWindowSize = shapedText ?\n        3 / 5 * glyphSize * boxScale :\n        0;\n\n    var labelLength = Math.max(\n        shapedText ? shapedText.right - shapedText.left : 0,\n        shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n    // Is the line continued from outside the tile boundary?\n    var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n    // Is the label long, relative to the spacing?\n    // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n    if (spacing - labelLength * boxScale  < spacing / 4) {\n        spacing = labelLength * boxScale + spacing / 4;\n    }\n\n    // Offset the first anchor by:\n    // Either half the label length plus a fixed extra offset if the line is not continued\n    // Or half the spacing if the line is continued.\n\n    // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n    var fixedExtraOffset = glyphSize * 2;\n\n    var offset = !isLineContinued ?\n        ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n        (spacing / 2 * overscaling) % spacing;\n\n    return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {\n\n    var halfLabelLength = labelLength / 2;\n    var lineLength = 0;\n    for (var k = 0; k < line.length - 1; k++) {\n        lineLength += line[k].dist(line[k + 1]);\n    }\n\n    var distance = 0,\n        markedDistance = offset - spacing;\n\n    var anchors = [];\n\n    for (var i = 0; i < line.length - 1; i++) {\n\n        var a = line[i],\n            b = line[i + 1];\n\n        var segmentDist = a.dist(b),\n            angle = b.angleTo(a);\n\n        while (markedDistance + spacing < distance + segmentDist) {\n            markedDistance += spacing;\n\n            var t = (markedDistance - distance) / segmentDist,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            // Check that the point is within the tile boundaries and that\n            // the label would fit before the beginning and end of the line\n            // if placed at this point.\n            if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n                    markedDistance - halfLabelLength >= 0 &&\n                    markedDistance + halfLabelLength <= lineLength) {\n                var anchor = new Anchor(x, y, angle, i)._round();\n\n                if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                    anchors.push(anchor);\n                }\n            }\n        }\n\n        distance += segmentDist;\n    }\n\n    if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n        // The first attempt at finding anchors at which labels can be placed failed.\n        // Try again, but this time just try placing one anchor at the middle of the line.\n        // This has the most effect for short lines in overscaled tiles, since the\n        // initial offset used in overscaled tiles is calculated to align labels with positions in\n        // parent tiles instead of placing the label as close to the beginning as possible.\n        anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n    }\n\n    return anchors;\n}\n\n\n/***/ }),\n/* 1376 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n    // horizontal labels always pass\n    if (anchor.segment === undefined) return true;\n\n    var p = anchor;\n    var index = anchor.segment + 1;\n    var anchorDistance = 0;\n\n    // move backwards along the line to the first segment the label appears on\n    while (anchorDistance > -labelLength / 2) {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        if (index < 0) return false;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    }\n\n    anchorDistance += line[index].dist(line[index + 1]);\n    index++;\n\n    // store recent corners and their total angle difference\n    var recentCorners = [];\n    var recentAngleDelta = 0;\n\n    // move forwards by the length of the label and check angles along the way\n    while (anchorDistance < labelLength / 2) {\n        var prev = line[index - 1];\n        var current = line[index];\n        var next = line[index + 1];\n\n        // there isn't enough room for the label before the end of the line\n        if (!next) return false;\n\n        var angleDelta = prev.angleTo(current) - current.angleTo(next);\n        // restrict angle to -pi..pi range\n        angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n        recentCorners.push({\n            distance: anchorDistance,\n            angleDelta: angleDelta\n        });\n        recentAngleDelta += angleDelta;\n\n        // remove corners that are far enough away from the list of recent anchors\n        while (anchorDistance - recentCorners[0].distance > windowSize) {\n            recentAngleDelta -= recentCorners.shift().angleDelta;\n        }\n\n        // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n        if (recentAngleDelta > maxAngle) return false;\n\n        index++;\n        anchorDistance += current.dist(next);\n    }\n\n    // no part of the line had an angle greater than the maximum allowed. check passes.\n    return true;\n}\n\n\n/***/ }),\n/* 1377 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n    shapeText: shapeText,\n    shapeIcon: shapeIcon\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph) {\n    this.codePoint = codePoint;\n    this.x = x;\n    this.y = y;\n    this.glyph = glyph;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right) {\n    this.positionedGlyphs = positionedGlyphs;\n    this.text = text;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) {\n\n    var positionedGlyphs = [];\n    var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]);\n\n    // the y offset *should* be part of the font metadata\n    var yOffset = -17;\n\n    var x = 0;\n    var y = yOffset;\n\n    for (var i = 0; i < text.length; i++) {\n        var codePoint = text.charCodeAt(i);\n        var glyph = glyphs[codePoint];\n\n        if (!glyph) continue;\n\n        positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph));\n        x += glyph.advance + spacing;\n    }\n\n    if (!positionedGlyphs.length) return false;\n\n    linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate);\n\n    return shaping;\n}\n\nvar invisible = {\n    0x20:   true, // space\n    0x200b: true  // zero-width space\n};\n\nvar breakable = {\n    0x20:   true, // space\n    0x26:   true, // ampersand\n    0x2b:   true, // plus sign\n    0x2d:   true, // hyphen-minus\n    0x2f:   true, // solidus\n    0xad:   true, // soft hyphen\n    0xb7:   true, // middle dot\n    0x200b: true, // zero-width space\n    0x2010: true, // hyphen\n    0x2013: true  // en dash\n};\n\nfunction linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate) {\n    var lastSafeBreak = null;\n\n    var lengthBeforeCurrentLine = 0;\n    var lineStartIndex = 0;\n    var line = 0;\n\n    var maxLineLength = 0;\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n\n    if (maxWidth) {\n        for (var i = 0; i < positionedGlyphs.length; i++) {\n            var positionedGlyph = positionedGlyphs[i];\n\n            positionedGlyph.x -= lengthBeforeCurrentLine;\n            positionedGlyph.y += lineHeight * line;\n\n            if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) {\n\n                var lineLength = positionedGlyphs[lastSafeBreak + 1].x;\n                maxLineLength = Math.max(lineLength, maxLineLength);\n\n                for (var k = lastSafeBreak + 1; k <= i; k++) {\n                    positionedGlyphs[k].y += lineHeight;\n                    positionedGlyphs[k].x -= lineLength;\n                }\n\n                if (justify) {\n                    // Collapse invisible characters.\n                    var lineEnd = lastSafeBreak;\n                    if (invisible[positionedGlyphs[lastSafeBreak].codePoint]) {\n                        lineEnd--;\n                    }\n\n                    justifyLine(positionedGlyphs, glyphs, lineStartIndex, lineEnd, justify);\n                }\n\n                lineStartIndex = lastSafeBreak + 1;\n                lastSafeBreak = null;\n                lengthBeforeCurrentLine += lineLength;\n                line++;\n            }\n\n            if (breakable[positionedGlyph.codePoint]) {\n                lastSafeBreak = i;\n            }\n        }\n    }\n\n    var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1];\n    var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance;\n    maxLineLength = Math.max(maxLineLength, lastLineLength);\n\n    var height = (line + 1) * lineHeight;\n\n    justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n    align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate);\n\n    // Calculate the bounding box\n    shaping.top += -verticalAlign * height;\n    shaping.bottom = shaping.top + height;\n    shaping.left += -horizontalAlign * maxLineLength;\n    shaping.right = shaping.left + maxLineLength;\n}\n\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n    var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n    var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n    for (var j = start; j <= end; j++) {\n        positionedGlyphs[j].x -= lineIndent;\n    }\n\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate) {\n    var shiftX = (justify - horizontalAlign) * maxLineLength + translate[0];\n    var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight + translate[1];\n\n    for (var j = 0; j < positionedGlyphs.length; j++) {\n        positionedGlyphs[j].x += shiftX;\n        positionedGlyphs[j].y += shiftY;\n    }\n}\n\n\nfunction shapeIcon(image, layout) {\n    if (!image || !image.rect) return null;\n\n    var dx = layout['icon-offset'][0];\n    var dy = layout['icon-offset'][1];\n    var x1 = dx - image.width / 2;\n    var x2 = x1 + image.width;\n    var y1 = dy - image.height / 2;\n    var y2 = y1 + image.height;\n\n    return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n    this.image = image;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\n\n/***/ }),\n/* 1378 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolveTokens = __webpack_require__(647);\n\nmodule.exports = resolveText;\n\n/**\n * For an array of features determine what glyphs need to be loaded\n * and apply any text preprocessing. The remaining users of text should\n * use the `textFeatures` key returned by this function rather than accessing\n * feature text directly.\n * @private\n */\nfunction resolveText(features, layoutProperties, codepoints) {\n    var textFeatures = [];\n\n    for (var i = 0, fl = features.length; i < fl; i++) {\n        var text = resolveTokens(features[i].properties, layoutProperties['text-field']);\n        if (!text) {\n            textFeatures[i] = null;\n            continue;\n        }\n        text = text.toString();\n\n        var transform = layoutProperties['text-transform'];\n        if (transform === 'uppercase') {\n            text = text.toLocaleUpperCase();\n        } else if (transform === 'lowercase') {\n            text = text.toLocaleLowerCase();\n        }\n\n        for (var j = 0; j < text.length; j++) {\n            codepoints[text.charCodeAt(j)] = true;\n        }\n\n        // Track indexes of features with text.\n        textFeatures[i] = text;\n    }\n\n    return textFeatures;\n}\n\n\n/***/ }),\n/* 1379 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (features, textFeatures, geometries) {\n\n    var leftIndex = {},\n        rightIndex = {},\n        mergedFeatures = [],\n        mergedGeom = [],\n        mergedTexts = [],\n        mergedIndex = 0,\n        k;\n\n    function add(k) {\n        mergedFeatures.push(features[k]);\n        mergedGeom.push(geometries[k]);\n        mergedTexts.push(textFeatures[k]);\n        mergedIndex++;\n    }\n\n    function mergeFromRight(leftKey, rightKey, geom) {\n        var i = rightIndex[leftKey];\n        delete rightIndex[leftKey];\n        rightIndex[rightKey] = i;\n\n        mergedGeom[i][0].pop();\n        mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]);\n        return i;\n    }\n\n    function mergeFromLeft(leftKey, rightKey, geom) {\n        var i = leftIndex[rightKey];\n        delete leftIndex[rightKey];\n        leftIndex[leftKey] = i;\n\n        mergedGeom[i][0].shift();\n        mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]);\n        return i;\n    }\n\n    function getKey(text, geom, onRight) {\n        var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n        return text + ':' + point.x + ':' + point.y;\n    }\n\n    for (k = 0; k < features.length; k++) {\n        var geom = geometries[k],\n            text = textFeatures[k];\n\n        if (!text) {\n            add(k);\n            continue;\n        }\n\n        var leftKey = getKey(text, geom),\n            rightKey = getKey(text, geom, true);\n\n        if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n            // found lines with the same text adjacent to both ends of the current line, merge all three\n            var j = mergeFromLeft(leftKey, rightKey, geom);\n            var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]);\n\n            delete leftIndex[leftKey];\n            delete rightIndex[rightKey];\n\n            rightIndex[getKey(text, mergedGeom[i], true)] = i;\n            mergedGeom[j] = null;\n\n        } else if (leftKey in rightIndex) {\n            // found mergeable line adjacent to the start of the current line, merge\n            mergeFromRight(leftKey, rightKey, geom);\n\n        } else if (rightKey in leftIndex) {\n            // found mergeable line adjacent to the end of the current line, merge\n            mergeFromLeft(leftKey, rightKey, geom);\n\n        } else {\n            // no adjacent lines, add as a new item\n            add(k);\n            leftIndex[leftKey] = mergedIndex - 1;\n            rightIndex[rightKey] = mergedIndex - 1;\n        }\n    }\n\n    return {\n        features: mergedFeatures,\n        textFeatures: mergedTexts,\n        geometries: mergedGeom\n    };\n};\n\n\n/***/ }),\n/* 1380 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array<Array<Point>>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array<Array<Point>>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n    var clippedLines = [];\n\n    for (var l = 0; l < lines.length; l++) {\n        var line = lines[l];\n        var clippedLine;\n\n        for (var i = 0; i < line.length - 1; i++) {\n            var p0 = line[i];\n            var p1 = line[i + 1];\n\n\n            if (p0.x < x1 && p1.x < x1) {\n                continue;\n            } else if (p0.x < x1) {\n                p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x < x1) {\n                p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y < y1 && p1.y < y1) {\n                continue;\n            } else if (p0.y < y1) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            } else if (p1.y < y1) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            }\n\n            if (p0.x >= x2 && p1.x >= x2) {\n                continue;\n            } else if (p0.x >= x2) {\n                p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x >= x2) {\n                p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y >= y2 && p1.y >= y2) {\n                continue;\n            } else if (p0.y >= y2) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            } else if (p1.y >= y2) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            }\n\n            if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n                clippedLine = [p0];\n                clippedLines.push(clippedLine);\n            }\n\n            clippedLine.push(p1);\n        }\n    }\n\n    return clippedLines;\n}\n\n\n/***/ }),\n/* 1381 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = CollisionFeature;\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @class CollisionFeature\n * @param {Array<Point>} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {Array<string>} layerIDs The IDs of the layers that this CollisionFeature is a part of.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n *\n * @private\n */\nfunction CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) {\n\n    var y1 = shaped.top * boxScale - padding;\n    var y2 = shaped.bottom * boxScale + padding;\n    var x1 = shaped.left * boxScale - padding;\n    var x2 = shaped.right * boxScale + padding;\n\n    this.boxStartIndex = collisionBoxArray.length;\n\n    if (alignLine) {\n\n        var height = y2 - y1;\n        var length = x2 - x1;\n\n        if (height > 0) {\n            // set minimum box height to avoid very many small labels\n            height = Math.max(10 * boxScale, height);\n\n            if (straight) {\n                // used for icon labels that are aligned with the line, but don't curve along it\n                var vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length);\n                var straightLine = [anchor.sub(vector), anchor.add(vector)];\n                this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            } else {\n                // used for text labels that curve along a line\n                this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            }\n        }\n\n    } else {\n        collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    this.boxEndIndex = collisionBoxArray.length;\n}\n\n/**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\nCollisionFeature.prototype._addLineCollisionBoxes = function(collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) {\n    var step = boxSize / 2;\n    var nBoxes = Math.floor(labelLength / step);\n\n    // offset the center of the first box by half a box so that the edge of the\n    // box is at the edge of the label.\n    var firstBoxOffset = -boxSize / 2;\n\n    var bboxes = this.boxes;\n\n    var p = anchor;\n    var index = segment + 1;\n    var anchorDistance = firstBoxOffset;\n\n    // move backwards along the line to the first segment the label appears on\n    do {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        // checkMaxAngle should have already caught this\n        if (index < 0) return bboxes;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    } while (anchorDistance > -labelLength / 2);\n\n    var segmentLength = line[index].dist(line[index + 1]);\n\n    for (var i = 0; i < nBoxes; i++) {\n        // the distance the box will be from the anchor\n        var boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n        // the box is not on the current segment. Move to the next segment.\n        while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n            anchorDistance += segmentLength;\n            index++;\n\n            // There isn't enough room before the end of the line.\n            if (index + 1 >= line.length) return bboxes;\n\n            segmentLength = line[index].dist(line[index + 1]);\n        }\n\n        // the distance the box will be from the beginning of the segment\n        var segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n        var p0 = line[index];\n        var p1 = line[index + 1];\n        var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();\n\n        var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n        var maxScale = labelLength / 2 / distanceToInnerEdge;\n\n        collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,\n                -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale,\n                featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    return bboxes;\n};\n\n\n/***/ }),\n/* 1382 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Queue = __webpack_require__(1383);\nvar Point = __webpack_require__(11);\nvar distToSegmentSquared = __webpack_require__(649).distToSegmentSquared;\n\n/**\n * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility\n * This is a copy of http://github.com/mapbox/polylabel adapted to use Points\n *\n * @param {Array<Array<Point>>} List of polygon rings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings\n * @param {number} [precision=1] Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision\n * @param {bool} [debug=false] Print some statistics to the console during execution\n *\n * @returns {Point} Pole of Inaccessibiliy.\n */\nmodule.exports = function (polygonRings, precision, debug) {\n    precision = precision || 1.0;\n\n    // find the bounding box of the outer ring\n    var minX, minY, maxX, maxY;\n    var outerRing = polygonRings[0];\n    for (var i = 0; i < outerRing.length; i++) {\n        var p = outerRing[i];\n        if (!i || p.x < minX) minX = p.x;\n        if (!i || p.y < minY) minY = p.y;\n        if (!i || p.x > maxX) maxX = p.x;\n        if (!i || p.y > maxY) maxY = p.y;\n    }\n\n    var width = maxX - minX;\n    var height = maxY - minY;\n    var cellSize = Math.min(width, height);\n    var h = cellSize / 2;\n\n    // a priority queue of cells in order of their \"potential\" (max distance to polygon)\n    var cellQueue = new Queue(null, compareMax);\n\n    // cover polygon with initial cells\n    for (var x = minX; x < maxX; x += cellSize) {\n        for (var y = minY; y < maxY; y += cellSize) {\n            cellQueue.push(new Cell(x + h, y + h, h, polygonRings));\n        }\n    }\n\n    // take centroid as the first best guess\n    var bestCell = getCentroidCell(polygonRings);\n    var numProbes = cellQueue.length;\n\n    while (cellQueue.length) {\n        // pick the most promising cell from the queue\n        var cell = cellQueue.pop();\n\n        // update the best cell if we found a better one\n        if (cell.d > bestCell.d) {\n            bestCell = cell;\n            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);\n        }\n\n        // do not drill down further if there's no chance of a better solution\n        if (cell.max - bestCell.d <= precision) continue;\n\n        // split the cell into four cells\n        h = cell.h / 2;\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));\n        numProbes += 4;\n    }\n\n    if (debug) {\n        console.log('num probes: ' + numProbes);\n        console.log('best distance: ' + bestCell.d);\n    }\n\n    return bestCell.p;\n};\n\nfunction compareMax(a, b) {\n    return b.max - a.max;\n}\n\nfunction Cell(x, y, h, polygon) {\n    this.p = new Point(x, y);\n    this.h = h; // half the cell size\n    this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon\n    this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell\n}\n\n// signed distance from point to polygon outline (negative if point is outside)\nfunction pointToPolygonDist(p, polygon) {\n    var inside = false;\n    var minDistSq = Infinity;\n\n    for (var k = 0; k < polygon.length; k++) {\n        var ring = polygon[k];\n\n        for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {\n            var a = ring[i];\n            var b = ring[j];\n\n            if ((a.y > p.y !== b.y > p.y) &&\n                (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside;\n\n            minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));\n        }\n    }\n\n    return (inside ? 1 : -1) * Math.sqrt(minDistSq);\n}\n\n// get polygon centroid\nfunction getCentroidCell(polygon) {\n    var area = 0;\n    var x = 0;\n    var y = 0;\n    var points = polygon[0];\n    for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) {\n        var a = points[i];\n        var b = points[j];\n        var f = a.x * b.y - b.x * a.y;\n        x += (a.x + b.x) * f;\n        y += (a.y + b.y) * f;\n        area += f * 3;\n    }\n    return new Cell(x / area, y / area, 0, polygon);\n}\n\n\n/***/ }),\n/* 1383 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = TinyQueue;\nmodule.exports.default = TinyQueue;\n\nfunction TinyQueue(data, compare) {\n    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);\n\n    this.data = data || [];\n    this.length = this.data.length;\n    this.compare = compare || defaultCompare;\n\n    if (this.length > 0) {\n        for (var i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n    }\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nTinyQueue.prototype = {\n\n    push: function (item) {\n        this.data.push(item);\n        this.length++;\n        this._up(this.length - 1);\n    },\n\n    pop: function () {\n        if (this.length === 0) return undefined;\n\n        var top = this.data[0];\n        this.length--;\n\n        if (this.length > 0) {\n            this.data[0] = this.data[this.length];\n            this._down(0);\n        }\n        this.data.pop();\n\n        return top;\n    },\n\n    peek: function () {\n        return this.data[0];\n    },\n\n    _up: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var item = data[pos];\n\n        while (pos > 0) {\n            var parent = (pos - 1) >> 1;\n            var current = data[parent];\n            if (compare(item, current) >= 0) break;\n            data[pos] = current;\n            pos = parent;\n        }\n\n        data[pos] = item;\n    },\n\n    _down: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var halfLength = this.length >> 1;\n        var item = data[pos];\n\n        while (pos < halfLength) {\n            var left = (pos << 1) + 1;\n            var right = left + 1;\n            var best = data[left];\n\n            if (right < this.length && compare(data[right], best) < 0) {\n                left = right;\n                best = data[right];\n            }\n            if (compare(best, item) >= 0) break;\n\n            data[pos] = best;\n            pos = left;\n        }\n\n        data[pos] = item;\n    }\n};\n\n\n/***/ }),\n/* 1384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar TileCoord = __webpack_require__(164);\nvar LngLat = __webpack_require__(82);\nvar Point = __webpack_require__(11);\nvar Evented = __webpack_require__(47);\nvar ajax = __webpack_require__(91);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar RasterBoundsArray = __webpack_require__(218).RasterBoundsArray;\nvar Buffer = __webpack_require__(161);\nvar VertexArrayObject = __webpack_require__(162);\n\nmodule.exports = VideoSource;\n\n/**\n * A data source containing video.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.)\n * @interface VideoSource\n * @example\n * // add to map\n * map.addSource('some id', {\n *    type: 'video',\n *    url: [\n *        'https://www.mapbox.com/videos/baltimore-smoke.mp4',\n *        'https://www.mapbox.com/videos/baltimore-smoke.webm'\n *    ],\n *    coordinates: [\n *        [-76.54, 39.18],\n *        [-76.52, 39.18],\n *        [-76.52, 39.17],\n *        [-76.54, 39.17]\n *    ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n */\nfunction VideoSource(id, options) {\n    this.id = id;\n    this.urls = options.urls;\n    this.coordinates = options.coordinates;\n\n    ajax.getVideo(options.urls, function(err, video) {\n        if (err) return this.fire('error', {error: err});\n\n        this.video = video;\n        this.video.loop = true;\n\n        var loopID;\n\n        // start repainting when video starts playing\n        this.video.addEventListener('playing', function() {\n            loopID = this.map.style.animationLoop.set(Infinity);\n            this.map._rerender();\n        }.bind(this));\n\n        // stop repainting when video stops\n        this.video.addEventListener('pause', function() {\n            this.map.style.animationLoop.cancel(loopID);\n        }.bind(this));\n\n        if (this.map) {\n            this.video.play();\n            this.setCoordinates(options.coordinates);\n        }\n\n        this.fire('load');\n    }.bind(this));\n}\n\nVideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{\n    minzoom: 0,\n    maxzoom: 22,\n    tileSize: 512,\n    roundZoom: true,\n\n    /**\n     * Returns the HTML `video` element.\n     *\n     * @returns {HTMLVideoElement} The HTML `video` element.\n     */\n    getVideo: function() {\n        return this.video;\n    },\n\n    onAdd: function(map) {\n        if (this.map) return;\n        this.map = map;\n        if (this.video) {\n            this.video.play();\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Sets the video's coordinates and re-renders the map.\n     *\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     *   represented as arrays of longitude and latitude numbers, which define the corners of the video.\n     *   The coordinates start at the top left corner of the video and proceed in clockwise order.\n     *   They do not have to represent a rectangle.\n     * @returns {VideoSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        this.minzoom = this.maxzoom = centerCoord.zoom;\n        this._coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row);\n        this._tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        this.fire('change');\n        return this;\n    },\n\n    _setTile: function (tile) {\n        this._prepared = false;\n        this.tile = tile;\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0);\n        array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n        this.tile.state = 'loaded';\n    },\n\n    prepare: function() {\n        if (this.video.readyState < 2) return; // not enough data for current position\n        if (!this.tile) return;\n\n        var gl = this.map.painter.gl;\n        if (!this._prepared) {\n            this._prepared = true;\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        }\n\n        this._currentTime = this.video.currentTime;\n    },\n\n    loadTile: function(tile, callback) {\n        // We have a single tile -- whoose coordinates are this._coord -- that\n        // covers the video frame we want to render.  If that's the one being\n        // requested, set it up with the image; otherwise, mark the tile as\n        // `errored` to indicate that we have no data for it.\n        if (this._coord && this._coord.toString() === tile.coord.toString()) {\n            this._setTile(tile);\n            callback(null);\n        } else {\n            tile.state = 'errored';\n            callback(null);\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'video',\n            urls: this.urls,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n/***/ }),\n/* 1385 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar TileCoord = __webpack_require__(164);\nvar LngLat = __webpack_require__(82);\nvar Point = __webpack_require__(11);\nvar Evented = __webpack_require__(47);\nvar ajax = __webpack_require__(91);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar RasterBoundsArray = __webpack_require__(218).RasterBoundsArray;\nvar Buffer = __webpack_require__(161);\nvar VertexArrayObject = __webpack_require__(162);\n\nmodule.exports = ImageSource;\n\n/**\n * A data source containing an image.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.)\n *\n * @interface ImageSource\n * @example\n * // add to map\n * map.addSource('some id', {\n *    type: 'image',\n *    url: 'https://www.mapbox.com/images/foo.png',\n *    coordinates: [\n *        [-76.54, 39.18],\n *        [-76.52, 39.18],\n *        [-76.52, 39.17],\n *        [-76.54, 39.17]\n *    ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n */\nfunction ImageSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    this.url = options.url;\n    this.coordinates = options.coordinates;\n\n    ajax.getImage(options.url, function(err, image) {\n        if (err) return this.fire('error', {error: err});\n\n        this.image = image;\n\n        this.image.addEventListener('load', function() {\n            this.map._rerender();\n        }.bind(this));\n\n        this._loaded = true;\n        this.fire('load');\n\n        if (this.map) {\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nImageSource.prototype = util.inherit(Evented, /** @lends ImageSource.prototype */ {\n    minzoom: 0,\n    maxzoom: 22,\n    tileSize: 512,\n    onAdd: function(map) {\n        this.map = map;\n        if (this.image) {\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Sets the image's coordinates and re-renders the map.\n     *\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     *   represented as arrays of longitude and latitude numbers, which define the corners of the image.\n     *   The coordinates start at the top left corner of the image and proceed in clockwise order.\n     *   They do not have to represent a rectangle.\n     * @returns {ImageSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        this.minzoom = this.maxzoom = centerCoord.zoom;\n        this._coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row);\n        this._tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        this.fire('change');\n        return this;\n    },\n\n    _setTile: function (tile) {\n        this._prepared = false;\n        this.tile = tile;\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0);\n        array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n        this.tile.state = 'loaded';\n    },\n\n    prepare: function() {\n        if (!this._loaded || !this.image || !this.image.complete) return;\n        if (!this.tile) return;\n\n        var painter = this.map.painter;\n        var gl = painter.gl;\n\n        if (!this._prepared) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        }\n    },\n\n    loadTile: function(tile, callback) {\n        // We have a single tile -- whoose coordinates are this._coord -- that\n        // covers the image we want to render.  If that's the one being\n        // requested, set it up with the image; otherwise, mark the tile as\n        // `errored` to indicate that we have no data for it.\n        if (this._coord && this._coord.toString() === tile.coord.toString()) {\n            this._setTile(tile);\n            callback(null);\n        } else {\n            tile.state = 'errored';\n            callback(null);\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'image',\n            urls: this.url,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n/***/ }),\n/* 1386 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar TileCoord = __webpack_require__(164);\n\nexports.rendered = function(sourceCache, styleLayers, queryGeometry, params, zoom, bearing) {\n    var tilesIn = sourceCache.tilesIn(queryGeometry);\n\n    tilesIn.sort(sortTilesIn);\n\n    var renderedFeatureLayers = [];\n    for (var r = 0; r < tilesIn.length; r++) {\n        var tileIn = tilesIn[r];\n        if (!tileIn.tile.featureIndex) continue;\n\n        renderedFeatureLayers.push(tileIn.tile.featureIndex.query({\n            queryGeometry: tileIn.queryGeometry,\n            scale: tileIn.scale,\n            tileSize: tileIn.tile.tileSize,\n            bearing: bearing,\n            params: params\n        }, styleLayers));\n    }\n    return mergeRenderedFeatureLayers(renderedFeatureLayers);\n};\n\nexports.source = function(sourceCache, params) {\n    var tiles = sourceCache.getRenderableIds().map(function(id) {\n        return sourceCache.getTileByID(id);\n    });\n\n    var result = [];\n\n    var dataTiles = {};\n    for (var i = 0; i < tiles.length; i++) {\n        var tile = tiles[i];\n        var dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id;\n        if (!dataTiles[dataID]) {\n            dataTiles[dataID] = true;\n            tile.querySourceFeatures(result, params);\n        }\n    }\n\n    return result;\n};\n\nfunction sortTilesIn(a, b) {\n    var coordA = a.coord;\n    var coordB = b.coord;\n    return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles) {\n    var result = tiles[0] || {};\n    for (var i = 1; i < tiles.length; i++) {\n        var tile = tiles[i];\n        for (var layerID in tile) {\n            var tileFeatures = tile[layerID];\n            var resultFeatures = result[layerID];\n            if (resultFeatures === undefined) {\n                resultFeatures = result[layerID] = tileFeatures;\n            } else {\n                for (var f = 0; f < tileFeatures.length; f++) {\n                    resultFeatures.push(tileFeatures[f]);\n                }\n            }\n        }\n    }\n    return result;\n}\n\n\n\n/***/ }),\n/* 1387 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar Bucket = __webpack_require__(42);\nvar FeatureIndex = __webpack_require__(1388);\nvar vt = __webpack_require__(196);\nvar Protobuf = __webpack_require__(123);\nvar GeoJSONFeature = __webpack_require__(652);\nvar featureFilter = __webpack_require__(124);\nvar CollisionTile = __webpack_require__(1390);\nvar CollisionBoxArray = __webpack_require__(1391);\nvar SymbolInstancesArray = __webpack_require__(1392);\nvar SymbolQuadsArray = __webpack_require__(1393);\n\nmodule.exports = Tile;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @param {Coordinate} coord\n * @param {number} size\n * @private\n */\nfunction Tile(coord, size, sourceMaxZoom) {\n    this.coord = coord;\n    this.uid = util.uniqueId();\n    this.uses = 0;\n    this.tileSize = size;\n    this.sourceMaxZoom = sourceMaxZoom;\n    this.buckets = {};\n\n    // `this.state` must be one of\n    //\n    // - `loading`:   Tile data is in the process of loading.\n    // - `loaded`:    Tile data has been loaded. Tile can be rendered.\n    // - `reloading`: Tile data has been loaded and is being updated. Tile can be rendered.\n    // - `unloaded`:  Tile data has been deleted.\n    // - `errored`:   Tile data was not loaded because of an error.\n    this.state = 'loading';\n}\n\nTile.prototype = {\n\n    /**\n     * Given a data object with a 'buffers' property, load it into\n     * this tile's elementGroups and buffers properties and set loaded\n     * to true. If the data is null, like in the case of an empty\n     * GeoJSON tile, no-op but still set loaded to true.\n     * @param {Object} data\n     * @returns {undefined}\n     * @private\n     */\n    loadVectorData: function(data, style) {\n        this.state = 'loaded';\n\n        // empty GeoJSON tile\n        if (!data) return;\n\n        this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray);\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.symbolInstancesArray = new SymbolInstancesArray(data.symbolInstancesArray);\n        this.symbolQuadsArray = new SymbolQuadsArray(data.symbolQuadsArray);\n        this.featureIndex = new FeatureIndex(data.featureIndex, data.rawTileData, this.collisionTile);\n        this.rawTileData = data.rawTileData;\n        this.buckets = unserializeBuckets(data.buckets, style);\n    },\n\n    /**\n     * given a data object and a GL painter, destroy and re-create\n     * all of its buffers.\n     * @param {Object} data\n     * @param {Object} painter\n     * @returns {undefined}\n     * @private\n     */\n    reloadSymbolData: function(data, painter, style) {\n        if (this.state === 'unloaded') return;\n\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.featureIndex.setCollisionTile(this.collisionTile);\n\n        // Destroy and delete existing symbol buckets\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            if (bucket.type === 'symbol') {\n                bucket.destroy(painter.gl);\n                delete this.buckets[id];\n            }\n        }\n\n        // Add new symbol buckets\n        util.extend(this.buckets, unserializeBuckets(data.buckets, style));\n    },\n\n    /**\n     * Make sure that this tile doesn't own any data within a given\n     * painter, so that it doesn't consume any memory or maintain\n     * any references to the painter.\n     * @param {Object} painter gl painter object\n     * @returns {undefined}\n     * @private\n     */\n    unloadVectorData: function(painter) {\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            bucket.destroy(painter.gl);\n        }\n\n        this.collisionBoxArray = null;\n        this.symbolQuadsArray = null;\n        this.symbolInstancesArray = null;\n        this.collisionTile = null;\n        this.featureIndex = null;\n        this.rawTileData = null;\n        this.buckets = null;\n        this.state = 'unloaded';\n    },\n\n    redoPlacement: function(source) {\n        if (this.state !== 'loaded' || this.state === 'reloading') {\n            this.redoWhenDone = true;\n            return;\n        }\n\n        this.state = 'reloading';\n\n        source.dispatcher.send('redo placement', {\n            uid: this.uid,\n            source: source.id,\n            angle: source.map.transform.angle,\n            pitch: source.map.transform.pitch,\n            showCollisionBoxes: source.map.showCollisionBoxes\n        }, done.bind(this), this.workerID);\n\n        function done(_, data) {\n            this.reloadSymbolData(data, source.map.painter, source.map.style);\n            source.fire('tile.load', {tile: this});\n\n            this.state = 'loaded';\n            if (this.redoWhenDone) {\n                this.redoPlacement(source);\n                this.redoWhenDone = false;\n            }\n        }\n    },\n\n    getBucket: function(layer) {\n        return this.buckets && this.buckets[layer.ref || layer.id];\n    },\n\n    querySourceFeatures: function(result, params) {\n        if (!this.rawTileData) return;\n\n        if (!this.vtLayers) {\n            this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        }\n\n        var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer];\n\n        if (!layer) return;\n\n        var filter = featureFilter(params.filter);\n        var coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y };\n\n        for (var i = 0; i < layer.length; i++) {\n            var feature = layer.feature(i);\n            if (filter(feature)) {\n                var geojsonFeature = new GeoJSONFeature(feature, this.coord.z, this.coord.x, this.coord.y);\n                geojsonFeature.tile = coord;\n                result.push(geojsonFeature);\n            }\n        }\n    },\n\n    isRenderable: function() {\n        return this.state === 'loaded' || this.state === 'reloading';\n    }\n};\n\nfunction unserializeBuckets(input, style) {\n    // Guard against the case where the map's style has been set to null while\n    // this bucket has been parsing.\n    if (!style) return;\n\n    var output = {};\n    for (var i = 0; i < input.length; i++) {\n        var layer = style.getLayer(input[i].layerId);\n        if (!layer) continue;\n\n        var bucket = Bucket.create(util.extend({\n            layer: layer,\n            childLayers: input[i].childLayerIds\n                .map(style.getLayer.bind(style))\n                .filter(function(layer) { return layer; })\n        }, input[i]));\n        output[bucket.id] = bucket;\n    }\n    return output;\n}\n\n\n/***/ }),\n/* 1388 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\nvar loadGeometry = __webpack_require__(163);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar featureFilter = __webpack_require__(124);\nvar StructArrayType = __webpack_require__(104);\nvar Grid = __webpack_require__(651);\nvar DictionaryCoder = __webpack_require__(1389);\nvar vt = __webpack_require__(196);\nvar Protobuf = __webpack_require__(123);\nvar GeoJSONFeature = __webpack_require__(652);\nvar arraysIntersect = __webpack_require__(6).arraysIntersect;\n\nvar intersection = __webpack_require__(649);\nvar multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint;\nvar multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon;\nvar multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine;\n\n\nvar FeatureIndexArray = new StructArrayType({\n    members: [\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' }\n    ]});\n\nmodule.exports = FeatureIndex;\n\nfunction FeatureIndex(coord, overscaling, collisionTile) {\n    if (coord.grid) {\n        var serialized = coord;\n        var rawTileData = overscaling;\n        coord = serialized.coord;\n        overscaling = serialized.overscaling;\n        this.grid = new Grid(serialized.grid);\n        this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray);\n        this.rawTileData = rawTileData;\n        this.bucketLayerIDs = serialized.bucketLayerIDs;\n    } else {\n        this.grid = new Grid(EXTENT, 16, 0);\n        this.featureIndexArray = new FeatureIndexArray();\n    }\n    this.coord = coord;\n    this.overscaling = overscaling;\n    this.x = coord.x;\n    this.y = coord.y;\n    this.z = coord.z - Math.log(overscaling) / Math.LN2;\n    this.setCollisionTile(collisionTile);\n}\n\nFeatureIndex.prototype.insert = function(feature, featureIndex, sourceLayerIndex, bucketIndex) {\n    var key = this.featureIndexArray.length;\n    this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);\n    var geometry = loadGeometry(feature);\n\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n\n        var bbox = [Infinity, Infinity, -Infinity, -Infinity];\n        for (var i = 0; i < ring.length; i++) {\n            var p = ring[i];\n            bbox[0] = Math.min(bbox[0], p.x);\n            bbox[1] = Math.min(bbox[1], p.y);\n            bbox[2] = Math.max(bbox[2], p.x);\n            bbox[3] = Math.max(bbox[3], p.y);\n        }\n\n        this.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n    }\n};\n\nFeatureIndex.prototype.setCollisionTile = function(collisionTile) {\n    this.collisionTile = collisionTile;\n};\n\nFeatureIndex.prototype.serialize = function() {\n    var data = {\n        coord: this.coord,\n        overscaling: this.overscaling,\n        grid: this.grid.toArrayBuffer(),\n        featureIndexArray: this.featureIndexArray.serialize(),\n        bucketLayerIDs: this.bucketLayerIDs\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.featureIndexArray.arrayBuffer]\n    };\n};\n\nfunction translateDistance(translate) {\n    return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\n// Finds features in this tile at a particular position.\nFeatureIndex.prototype.query = function(args, styleLayers) {\n    if (!this.vtLayers) {\n        this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n    }\n\n    var result = {};\n\n    var params = args.params || {},\n        pixelsToTileUnits = EXTENT / args.tileSize / args.scale,\n        filter = featureFilter(params.filter);\n\n    // Features are indexed their original geometries. The rendered geometries may\n    // be buffered, translated or offset. Figure out how much the search radius needs to be\n    // expanded by to include these features.\n    var additionalRadius = 0;\n    for (var id in styleLayers) {\n        var styleLayer = styleLayers[id];\n        var paint = styleLayer.paint;\n\n        var styleLayerDistance = 0;\n        if (styleLayer.type === 'line') {\n            styleLayerDistance = getLineWidth(paint) / 2 + Math.abs(paint['line-offset']) + translateDistance(paint['line-translate']);\n        } else if (styleLayer.type === 'fill') {\n            styleLayerDistance = translateDistance(paint['fill-translate']);\n        } else if (styleLayer.type === 'circle') {\n            styleLayerDistance = paint['circle-radius'] + translateDistance(paint['circle-translate']);\n        }\n        additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits);\n    }\n\n    var queryGeometry = args.queryGeometry.map(function(q) {\n        return q.map(function(p) {\n            return new Point(p.x, p.y);\n        });\n    });\n\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        for (var k = 0; k < ring.length; k++) {\n            var p = ring[k];\n            minX = Math.min(minX, p.x);\n            minY = Math.min(minY, p.y);\n            maxX = Math.max(maxX, p.x);\n            maxY = Math.max(maxY, p.y);\n        }\n    }\n\n    var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius);\n    matching.sort(topDownFeatureComparator);\n    this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    var matchingSymbols = this.collisionTile.queryRenderedSymbols(minX, minY, maxX, maxY, args.scale);\n    matchingSymbols.sort();\n    this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    return result;\n};\n\nfunction topDownFeatureComparator(a, b) {\n    return b - a;\n}\n\nfunction getLineWidth(paint) {\n    if (paint['line-gap-width'] > 0) {\n        return paint['line-gap-width'] + 2 * paint['line-width'];\n    } else {\n        return paint['line-width'];\n    }\n}\n\nFeatureIndex.prototype.filterMatching = function(result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) {\n    var previousIndex;\n    for (var k = 0; k < matching.length; k++) {\n        var index = matching[k];\n\n        // don't check the same feature more than once\n        if (index === previousIndex) continue;\n        previousIndex = index;\n\n        var match = array.get(index);\n\n        var layerIDs = this.bucketLayerIDs[match.bucketIndex];\n        if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue;\n\n        var sourceLayerName = this.sourceLayerCoder.decode(match.sourceLayerIndex);\n        var sourceLayer = this.vtLayers[sourceLayerName];\n        var feature = sourceLayer.feature(match.featureIndex);\n\n        if (!filter(feature)) continue;\n\n        var geometry = null;\n\n        for (var l = 0; l < layerIDs.length; l++) {\n            var layerID = layerIDs[l];\n\n            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n                continue;\n            }\n\n            var styleLayer = styleLayers[layerID];\n            if (!styleLayer) continue;\n\n            var translatedPolygon;\n            if (styleLayer.type !== 'symbol') {\n                // all symbols already match the style\n\n                if (!geometry) geometry = loadGeometry(feature);\n\n                var paint = styleLayer.paint;\n\n                if (styleLayer.type === 'line') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['line-translate'], paint['line-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var halfWidth = getLineWidth(paint) / 2 * pixelsToTileUnits;\n                    if (paint['line-offset']) {\n                        geometry = offsetLine(geometry, paint['line-offset'] * pixelsToTileUnits);\n                    }\n                    if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue;\n\n                } else if (styleLayer.type === 'fill') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['fill-translate'], paint['fill-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue;\n\n                } else if (styleLayer.type === 'circle') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['circle-translate'], paint['circle-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var circleRadius = paint['circle-radius'] * pixelsToTileUnits;\n                    if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue;\n                }\n            }\n\n            var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);\n            geojsonFeature.layer = styleLayer.serialize({\n                includeRefProperties: true\n            });\n            var layerResult = result[layerID];\n            if (layerResult === undefined) {\n                layerResult = result[layerID] = [];\n            }\n            layerResult.push(geojsonFeature);\n        }\n    }\n};\n\nfunction translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {\n    if (!translate[0] && !translate[1]) {\n        return queryGeometry;\n    }\n\n    translate = Point.convert(translate);\n\n    if (translateAnchor === \"viewport\") {\n        translate._rotate(-bearing);\n    }\n\n    var translated = [];\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        var translatedRing = [];\n        for (var k = 0; k < ring.length; k++) {\n            translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits)));\n        }\n        translated.push(translatedRing);\n    }\n    return translated;\n}\n\nfunction offsetLine(rings, offset) {\n    var newRings = [];\n    var zero = new Point(0, 0);\n    for (var k = 0; k < rings.length; k++) {\n        var ring = rings[k];\n        var newRing = [];\n        for (var i = 0; i < ring.length; i++) {\n            var a = ring[i - 1];\n            var b = ring[i];\n            var c = ring[i + 1];\n            var aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n            var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n            var extrude = aToB._add(bToC)._unit();\n\n            var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n            extrude._mult(1 / cosHalfAngle);\n\n            newRing.push(extrude._mult(offset)._add(b));\n        }\n        newRings.push(newRing);\n    }\n    return newRings;\n}\n\n\n/***/ }),\n/* 1389 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\n\nmodule.exports = DictionaryCoder;\n\nfunction DictionaryCoder(strings) {\n    this._stringToNumber = {};\n    this._numberToString = [];\n    for (var i = 0; i < strings.length; i++) {\n        var string = strings[i];\n        this._stringToNumber[string] = i;\n        this._numberToString[i] = string;\n    }\n}\n\nDictionaryCoder.prototype.encode = function(string) {\n    assert(string in this._stringToNumber);\n    return this._stringToNumber[string];\n};\n\nDictionaryCoder.prototype.decode = function(n) {\n    assert(n < this._numberToString.length);\n    return this._numberToString[n];\n};\n\n\n/***/ }),\n/* 1390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Point = __webpack_require__(11);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar Grid = __webpack_require__(651);\n\nmodule.exports = CollisionTile;\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @class CollisionTile\n * @param {number} angle\n * @param {number} pitch\n * @private\n */\nfunction CollisionTile(angle, pitch, collisionBoxArray) {\n    if (typeof angle === 'object') {\n        var serialized = angle;\n        collisionBoxArray = pitch;\n        angle = serialized.angle;\n        pitch = serialized.pitch;\n        this.grid = new Grid(serialized.grid);\n        this.ignoredGrid = new Grid(serialized.ignoredGrid);\n    } else {\n        this.grid = new Grid(EXTENT, 12, 6);\n        this.ignoredGrid = new Grid(EXTENT, 12, 0);\n    }\n\n    this.angle = angle;\n    this.pitch = pitch;\n\n    var sin = Math.sin(angle),\n        cos = Math.cos(angle);\n    this.rotationMatrix = [cos, -sin, sin, cos];\n    this.reverseRotationMatrix = [cos, sin, -sin, cos];\n\n    // Stretch boxes in y direction to account for the map tilt.\n    this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n    // The amount the map is squished depends on the y position.\n    // Sort of account for this by making all boxes a bit bigger.\n    this.yStretch = Math.pow(this.yStretch, 1.3);\n\n    this.collisionBoxArray = collisionBoxArray;\n    if (collisionBoxArray.length === 0) {\n        // the first collisionBoxArray is passed to a CollisionTile\n\n        // tempCollisionBox\n        collisionBoxArray.emplaceBack();\n\n        var maxInt16 = 32767;\n        //left\n        collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // right\n        collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // top\n        collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // bottom\n        collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n    }\n\n    this.tempCollisionBox = collisionBoxArray.get(0);\n    this.edges = [\n        collisionBoxArray.get(1),\n        collisionBoxArray.get(2),\n        collisionBoxArray.get(3),\n        collisionBoxArray.get(4)\n    ];\n}\n\nCollisionTile.prototype.serialize = function() {\n    var data = {\n        angle: this.angle,\n        pitch: this.pitch,\n        grid: this.grid.toArrayBuffer(),\n        ignoredGrid: this.ignoredGrid.toArrayBuffer()\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.ignoredGrid]\n    };\n};\n\nCollisionTile.prototype.minScale = 0.25;\nCollisionTile.prototype.maxScale = 2;\n\n\n/**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\nCollisionTile.prototype.placeCollisionFeature = function(collisionFeature, allowOverlap, avoidEdges) {\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var minPlacementScale = this.minScale;\n    var rotationMatrix = this.rotationMatrix;\n    var yStretch = this.yStretch;\n\n    for (var b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) {\n\n        var box = collisionBoxArray.get(b);\n\n        var anchorPoint = box.anchorPoint._matMult(rotationMatrix);\n        var x = anchorPoint.x;\n        var y = anchorPoint.y;\n\n        var x1 = x + box.x1;\n        var y1 = y + box.y1 * yStretch;\n        var x2 = x + box.x2;\n        var y2 = y + box.y2 * yStretch;\n\n        box.bbox0 = x1;\n        box.bbox1 = y1;\n        box.bbox2 = x2;\n        box.bbox3 = y2;\n\n        if (!allowOverlap) {\n            var blockingBoxes = this.grid.query(x1, y1, x2, y2);\n\n            for (var i = 0; i < blockingBoxes.length; i++) {\n                var blocking = collisionBoxArray.get(blockingBoxes[i]);\n                var blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix);\n\n                minPlacementScale = this.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n\n        if (avoidEdges) {\n            var rotatedCollisionBox;\n\n            if (this.angle) {\n                var reverseRotationMatrix = this.reverseRotationMatrix;\n                var tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix);\n                var tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix);\n                var bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix);\n                var br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix);\n\n                rotatedCollisionBox = this.tempCollisionBox;\n                rotatedCollisionBox.anchorPointX = box.anchorPoint.x;\n                rotatedCollisionBox.anchorPointY = box.anchorPoint.y;\n                rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.maxScale = box.maxScale;\n            } else {\n                rotatedCollisionBox = box;\n            }\n\n            for (var k = 0; k < this.edges.length; k++) {\n                var edgeBox = this.edges[k];\n                minPlacementScale = this.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n    }\n\n    return minPlacementScale;\n};\n\nCollisionTile.prototype.queryRenderedSymbols = function(minX, minY, maxX, maxY, scale) {\n    var sourceLayerFeatures = {};\n    var result = [];\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var rotationMatrix = this.rotationMatrix;\n    var anchorPoint = new Point(minX, minY)._matMult(rotationMatrix);\n\n    var queryBox = this.tempCollisionBox;\n    queryBox.anchorX = anchorPoint.x;\n    queryBox.anchorY = anchorPoint.y;\n    queryBox.x1 = 0;\n    queryBox.y1 = 0;\n    queryBox.x2 = maxX - minX;\n    queryBox.y2 = maxY - minY;\n    queryBox.maxScale = scale;\n\n    // maxScale is stored using a Float32. Convert `scale` to the stored Float32 value.\n    scale = queryBox.maxScale;\n\n    var searchBox = [\n        anchorPoint.x + queryBox.x1 / scale,\n        anchorPoint.y + queryBox.y1 / scale * this.yStretch,\n        anchorPoint.x + queryBox.x2 / scale,\n        anchorPoint.y + queryBox.y2 / scale * this.yStretch\n    ];\n\n    var blockingBoxKeys = this.grid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    var blockingBoxKeys2 = this.ignoredGrid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    for (var k = 0; k < blockingBoxKeys2.length; k++) {\n        blockingBoxKeys.push(blockingBoxKeys2[k]);\n    }\n\n    for (var i = 0; i < blockingBoxKeys.length; i++) {\n        var blocking = collisionBoxArray.get(blockingBoxKeys[i]);\n\n        var sourceLayer = blocking.sourceLayerIndex;\n        var featureIndex = blocking.featureIndex;\n        if (sourceLayerFeatures[sourceLayer] === undefined) {\n            sourceLayerFeatures[sourceLayer] = {};\n        }\n\n        if (!sourceLayerFeatures[sourceLayer][featureIndex]) {\n            var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix);\n            var minPlacementScale = this.getPlacementScale(this.minScale, anchorPoint, queryBox, blockingAnchorPoint, blocking);\n            if (minPlacementScale >= scale) {\n                sourceLayerFeatures[sourceLayer][featureIndex] = true;\n                result.push(blockingBoxKeys[i]);\n            }\n        }\n    }\n\n    return result;\n};\n\nCollisionTile.prototype.getPlacementScale = function(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) {\n\n    // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n    // Original algorithm:\n    var anchorDiffX = anchorPoint.x - blockingAnchorPoint.x;\n    var anchorDiffY = anchorPoint.y - blockingAnchorPoint.y;\n    var s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box\n    var s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box\n    var s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box\n    var s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box\n\n    if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n    if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n    var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n    var blockingMaxScale = blocking.maxScale;\n    var boxMaxScale = box.maxScale;\n\n    if (collisionFreeScale > blockingMaxScale) {\n        // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n        // so unblock the new box at the scale that the old box disappears.\n        collisionFreeScale = blockingMaxScale;\n    }\n\n    if (collisionFreeScale > boxMaxScale) {\n        // If the box can only be shown after it is visible, then the box can never be shown.\n        // But the label can be shown after this box is not visible.\n        collisionFreeScale = boxMaxScale;\n    }\n\n    if (collisionFreeScale > minPlacementScale &&\n            collisionFreeScale >= blocking.placementScale) {\n        // If this collision occurs at a lower scale than previously found collisions\n        // and the collision occurs while the other label is visible\n\n        // this this is the lowest scale at which the label won't collide with anything\n        minPlacementScale = collisionFreeScale;\n    }\n\n    return minPlacementScale;\n};\n\n\n/**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\nCollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale, ignorePlacement) {\n\n    var grid = ignorePlacement ? this.ignoredGrid : this.grid;\n    var collisionBoxArray = this.collisionBoxArray;\n\n    for (var k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) {\n        var box = collisionBoxArray.get(k);\n        box.placementScale = minPlacementScale;\n        if (minPlacementScale < this.maxScale) {\n            grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3);\n        }\n    }\n};\n\n\n/***/ }),\n/* 1391 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(104);\nvar util = __webpack_require__(6);\nvar Point = __webpack_require__(11);\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBoxArray\n * @private\n */\n\nvar CollisionBoxArray = module.exports = new StructArrayType({\n    members: [\n        // the box is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // distances to the edges from the anchor\n        { type: 'Int16', name: 'x1' },\n        { type: 'Int16', name: 'y1' },\n        { type: 'Int16', name: 'x2' },\n        { type: 'Int16', name: 'y2' },\n\n        // the box is only valid for scales < maxScale.\n        // The box does not block other boxes at scales >= maxScale;\n        { type: 'Float32', name: 'maxScale' },\n\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' },\n\n        // rotated and scaled bbox used for indexing\n        { type: 'Int16', name: 'bbox0' },\n        { type: 'Int16', name: 'bbox1' },\n        { type: 'Int16', name: 'bbox2' },\n        { type: 'Int16', name: 'bbox3' },\n\n        { type: 'Float32', name: 'placementScale' }\n    ]});\n\nutil.extendAll(CollisionBoxArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n/***/ }),\n/* 1392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(104);\nvar util = __webpack_require__(6);\nvar Point = __webpack_require__(11);\n\n/*\n *\n * A StructArray implementation of symbolInstances from data/bucket/symbol_bucket.js\n * this will allow symbolInstances to be transferred between the worker and main threads\n *\n * @class SymbolInstanceArray\n * @private\n */\n\nvar SymbolInstancesArray = module.exports = new StructArrayType({\n    members: [\n\n        { type: 'Uint16', name: 'textBoxStartIndex' },\n        { type: 'Uint16', name: 'textBoxEndIndex' },\n        { type: 'Uint16', name: 'iconBoxStartIndex' },\n        { type: 'Uint16', name: 'iconBoxEndIndex' },\n        { type: 'Uint16', name: 'glyphQuadStartIndex' },\n        { type: 'Uint16', name: 'glyphQuadEndIndex' },\n        { type: 'Uint16', name: 'iconQuadStartIndex' },\n        { type: 'Uint16', name: 'iconQuadEndIndex' },\n\n        // each symbolInstance is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // index -- not sure if we need this -@mollymerp\n        { type: 'Int8', name: 'index' }\n    ]\n});\n\nutil.extendAll(SymbolInstancesArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n\n/***/ }),\n/* 1393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar StructArrayType = __webpack_require__(104);\nvar util = __webpack_require__(6);\nvar Point = __webpack_require__(11);\nvar SymbolQuad = __webpack_require__(648).SymbolQuad;\n\n// notes from ansis on slack:\n// it would be best if they are added to a buffer in advance so that they are only created once. There would be a separate buffer with all the individual collision boxes and then SymbolInstance would store the beginning and end indexes of a feature's collisionboxes. CollisionFeature wouldn't really exist as a standalone thing, it would just be a range of boxes in the big collision box buffer\n\n/*\n *\n * A StructArray implementation of glyphQuad from symbol/quads\n * this will allow glyph quads to be transferred between the worker and main threads along with the rest of\n * the symbolInstances\n *\n * @class SymbolQuadsArray\n * @private\n */\n\nvar SymbolQuadsArray = module.exports = new StructArrayType({\n    members: [\n        // the quad is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // the offsets of the tl (top-left), tr, bl, br corners from the anchor point\n        // do these need to be floats?\n        { type: 'Float32', name: 'tlX' },\n        { type: 'Float32', name: 'tlY' },\n        { type: 'Float32', name: 'trX' },\n        { type: 'Float32', name: 'trY' },\n        { type: 'Float32', name: 'blX' },\n        { type: 'Float32', name: 'blY' },\n        { type: 'Float32', name: 'brX' },\n        { type: 'Float32', name: 'brY' },\n\n        // texture coordinates (height, width, x, and y)\n        { type: 'Int16', name: 'texH' },\n        { type: 'Int16', name: 'texW' },\n        { type: 'Int16', name: 'texX' },\n        { type: 'Int16', name: 'texY' },\n\n        // the angle of the label at it's center, not the angle of this quad.\n        { type: 'Float32', name: 'anchorAngle' },\n        // the angle of this quad.\n        { type: 'Float32', name: 'glyphAngle' },\n\n        // quad is only valid for scales < maxScale && scale > minScale.\n        { type: 'Float32', name: 'maxScale' },\n        { type: 'Float32', name: 'minScale' }\n    ]\n});\n\nutil.extendAll(SymbolQuadsArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    },\n    get SymbolQuad() {\n        return new SymbolQuad(this.anchorPoint,\n            new Point(this.tlX, this.tlY),\n            new Point(this.trX, this.trY),\n            new Point(this.blX, this.blY),\n            new Point(this.brX, this.brY),\n            { x: this.texX, y: this.texY, h: this.texH, w: this.texW, height: this.texH, width: this.texW },\n            this.anchorAngle,\n            this.glyphAngle,\n            this.minScale,\n            this.maxScale);\n    }\n});\n\n\n\n/***/ }),\n/* 1394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = LRUCache;\n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n * @private\n */\nfunction LRUCache(max, onRemove) {\n    this.max = max;\n    this.onRemove = onRemove;\n    this.reset();\n}\n\n/**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.reset = function() {\n    for (var key in this.data) {\n        this.onRemove(this.data[key]);\n    }\n\n    this.data = {};\n    this.order = [];\n\n    return this;\n};\n\n/**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.add = function(key, data) {\n\n    if (this.has(key)) {\n        this.order.splice(this.order.indexOf(key), 1);\n        this.data[key] = data;\n        this.order.push(key);\n\n    } else {\n        this.data[key] = data;\n        this.order.push(key);\n\n        if (this.order.length > this.max) {\n            var removedData = this.get(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n    }\n\n    return this;\n};\n\n/**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\nLRUCache.prototype.has = function(key) {\n    return key in this.data;\n};\n\n/**\n * List all keys in the cache\n *\n * @returns {Array<string>} an array of keys in this cache.\n * @private\n */\nLRUCache.prototype.keys = function() {\n    return this.order;\n};\n\n/**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\nLRUCache.prototype.get = function(key) {\n    if (!this.has(key)) { return null; }\n\n    var data = this.data[key];\n\n    delete this.data[key];\n    this.order.splice(this.order.indexOf(key), 1);\n\n    return data;\n};\n\n/**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.setMaxSize = function(max) {\n    this.max = max;\n\n    while (this.order.length > this.max) {\n        var removedData = this.get(this.order[0]);\n        if (removedData) this.onRemove(removedData);\n    }\n\n    return this;\n};\n\n\n/***/ }),\n/* 1395 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar WorkerPool = __webpack_require__(1396);\n\nvar globalWorkerPool;\n\n/**\n * Creates (if necessary) and returns the single, global WorkerPool instance\n * to be shared across each Map\n * @private\n */\nmodule.exports = function getGlobalWorkerPool () {\n    if (!globalWorkerPool) {\n        globalWorkerPool = new WorkerPool();\n    }\n    return globalWorkerPool;\n};\n\n\n/***/ }),\n/* 1396 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\nvar WebWorker = __webpack_require__(1397);\n\nmodule.exports = WorkerPool;\n\n/**\n * Constructs a worker pool.\n * @private\n */\nfunction WorkerPool() {\n    this.active = {};\n}\n\nWorkerPool.prototype = {\n    acquire: function (mapId) {\n        if (!this.workers) {\n            // Lazily look up the value of mapboxgl.workerCount.  This allows\n            // client code a chance to set it while circumventing cyclic\n            // dependency problems\n            var workerCount = __webpack_require__(623).workerCount;\n            assert(typeof workerCount === 'number' && workerCount < Infinity);\n\n            this.workers = [];\n            while (this.workers.length < workerCount) {\n                this.workers.push(new WebWorker());\n            }\n        }\n\n        this.active[mapId] = true;\n        return this.workers.slice();\n    },\n\n    release: function (mapId) {\n        delete this.active[mapId];\n        if (Object.keys(this.active).length === 0) {\n            this.workers.forEach(function (w) { w.terminate(); });\n            this.workers = null;\n        }\n    }\n};\n\n\n\n/***/ }),\n/* 1397 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar WebWorkify = __webpack_require__(557);\n\nmodule.exports = function () {\n    return new WebWorkify(__webpack_require__(1398));\n};\n\n\n/***/ }),\n/* 1398 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = function() {\n\treturn __webpack_require__(558)(\"!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\\\"a\\\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\\\"\\\",e(e.s=47)}([function(t,e,n){\\\"use strict\\\";var r=n(49),i=n(50);e.easeCubicInOut=function(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,n=e*t;return 4*(t<.5?n:3*(t-e)+n-.75)},e.bezier=function(t,e,n,i){var o=new r(t,e,n,i);return function(t){return o.solve(t)}},e.ease=e.bezier(.25,.1,.25,1),e.clamp=function(t,e,n){return Math.min(n,Math.max(e,t))},e.wrap=function(t,e,n){var r=n-e,i=((t-e)%r+r)%r+e;return i===e?n:i},e.coalesce=function(){for(var t=0;t<arguments.length;t++){var e=arguments[t];if(null!==e&&void 0!==e)return e}},e.asyncAll=function(t,e,n){if(!t.length)return n(null,[]);var r=t.length,i=new Array(t.length),o=null;t.forEach(function(t,a){e(t,function(t,e){t&&(o=t),i[a]=e,0==--r&&n(o,i)})})},e.keysDifference=function(t,e){var n=[];for(var r in t)r in e||n.push(r);return n},e.extend=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t},e.extendAll=function(t,e){for(var n in e)Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n));return t},e.inherit=function(t,n){var r=\\\"function\\\"==typeof t?t.prototype:t,i=Object.create(r);return e.extendAll(i,n),i},e.pick=function(t,e){for(var n={},r=0;r<e.length;r++){var i=e[r];i in t&&(n[i]=t[i])}return n};var o=1;e.uniqueId=function(){return o++},e.debounce=function(t,e){var n,r;return function(){r=arguments,clearTimeout(n),n=setTimeout(function(){t.apply(null,r)},e)}},e.bindAll=function(t,e){t.forEach(function(t){e[t]&&(e[t]=e[t].bind(e))})},e.bindHandlers=function(t){for(var e in t)\\\"function\\\"==typeof t[e]&&0===e.indexOf(\\\"_on\\\")&&(t[e]=t[e].bind(t))},e.setOptions=function(t,e){t.hasOwnProperty(\\\"options\\\")||(t.options=t.options?Object.create(t.options):{});for(var n in e)t.options[n]=e[n];return t.options},e.getCoordinatesCenter=function(t){for(var e=1/0,n=1/0,r=-1/0,o=-1/0,a=0;a<t.length;a++)e=Math.min(e,t[a].column),n=Math.min(n,t[a].row),r=Math.max(r,t[a].column),o=Math.max(o,t[a].row);var s=r-e,u=o-n,l=Math.max(s,u);return new i((e+r)/2,(n+o)/2,0).zoomTo(Math.floor(-Math.log(l)/Math.LN2))},e.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)},e.startsWith=function(t,e){return 0===t.indexOf(e)},e.mapObject=function(t,e,n){var r={};for(var i in t)r[i]=e.call(n||this,t[i],i,t);return r},e.filterObject=function(t,e,n){var r={};for(var i in t)e.call(n||this,t[i],i,t)&&(r[i]=t[i]);return r},e.deepEqual=function t(e,n){if(Array.isArray(e)){if(!Array.isArray(n)||e.length!==n.length)return!1;for(var r=0;r<e.length;r++)if(!t(e[r],n[r]))return!1;return!0}if(\\\"object\\\"==typeof e&&null!==e&&null!==n){if(\\\"object\\\"!=typeof n)return!1;if(Object.keys(e).length!==Object.keys(n).length)return!1;for(var i in e)if(!t(e[i],n[i]))return!1;return!0}return e===n},e.clone=function(t){return Array.isArray(t)?t.map(e.clone):\\\"object\\\"==typeof t?e.mapObject(t,e.clone):t},e.arraysIntersect=function(t,e){for(var n=0;n<t.length;n++)if(e.indexOf(t[n])>=0)return!0;return!1};var a={};e.warnOnce=function(t){a[t]||(\\\"undefined\\\"!=typeof console&&console.warn(t),a[t]=!0)},e.isCounterClockwise=function(t,e,n){return(n.y-t.y)*(e.x-t.x)>(e.y-t.y)*(n.x-t.x)},e.calculateSignedArea=function(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n.x-e.x)*(e.y+n.y);return r},e.isClosedPolygon=function(t){if(t.length<4)return!1;var n=t[0],r=t[t.length-1];return!(Math.abs(n.x-r.x)>0||Math.abs(n.y-r.y)>0)&&Math.abs(e.calculateSignedArea(t))>.01}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.message=(t?t+\\\": \\\":\\\"\\\")+i.apply(i,Array.prototype.slice.call(arguments,2)),null!==e&&void 0!==e&&e.__line__&&(this.line=e.__line__)}var i=n(23).format;t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){this.x=t,this.y=e}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,n=t.y-this.y;return e*e+n*n},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,n=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=n,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),n=Math.sin(t),r=e*this.x-n*this.y,i=n*this.x+e*this.y;return this.x=r,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(t){return t instanceof r?t:Array.isArray(t)?new r(t[0],t[1]):t}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number?\\\"number\\\":t instanceof String?\\\"string\\\":t instanceof Boolean?\\\"boolean\\\":Array.isArray(t)?\\\"array\\\":null===t?\\\"null\\\":typeof t}},function(t,e,n){\\\"use strict\\\";function r(t){if(this.zoom=t.zoom,this.overscaling=t.overscaling,this.layer=t.layer,this.childLayers=t.childLayers,this.type=this.layer.type,this.features=[],this.id=this.layer.id,this.index=t.index,this.sourceLayer=this.layer.sourceLayer,this.sourceLayerIndex=t.sourceLayerIndex,this.minZoom=this.layer.minzoom,this.maxZoom=this.layer.maxzoom,this.paintAttributes=i(this),t.arrays){var e=this.programInterfaces;this.bufferGroups=c.mapObject(t.arrays,function(n,r){var i=e[r],o=t.paintVertexArrayTypes[r];return n.map(function(t){return new l(t,{layoutVertexArrayType:i.layoutVertexArrayType.serialize(),elementArrayType:i.elementArrayType&&i.elementArrayType.serialize(),elementArrayType2:i.elementArrayType2&&i.elementArrayType2.serialize(),paintVertexArrayTypes:o})})})}}function i(t){var e={};for(var n in t.programInterfaces){for(var r=e[n]={},i=0;i<t.childLayers.length;i++){r[t.childLayers[i].id]={attributes:[],uniforms:[],defines:[],vertexPragmas:{define:{},initialize:{}},fragmentPragmas:{define:{},initialize:{}}}}var s=t.programInterfaces[n];if(s.paintAttributes)for(var u=0;u<s.paintAttributes.length;u++){var l=s.paintAttributes[u];l.multiplier=l.multiplier||1;for(var p=0;p<t.childLayers.length;p++){var h=t.childLayers[p],y=r[h.id],d=l.name;f(\\\"a_\\\"===l.name.slice(0,2));var m,v=l.name.slice(2);if(y.fragmentPragmas.initialize[v]=\\\"\\\",h.isPaintValueFeatureConstant(l.paintProperty))y.uniforms.push(l),y.fragmentPragmas.define[v]=y.vertexPragmas.define[v]=[\\\"uniform\\\",\\\"{precision}\\\",\\\"{type}\\\",d].join(\\\" \\\")+\\\";\\\",y.fragmentPragmas.initialize[v]=y.vertexPragmas.initialize[v]=[\\\"{precision}\\\",\\\"{type}\\\",v,\\\"=\\\",d].join(\\\" \\\")+\\\";\\\\n\\\";else if(h.isPaintValueZoomConstant(l.paintProperty)){y.attributes.push(c.extend({},l,{name:d})),m=[\\\"varying\\\",\\\"{precision}\\\",\\\"{type}\\\",v].join(\\\" \\\")+\\\";\\\\n\\\";var x=[y.fragmentPragmas.define[v],\\\"attribute\\\",\\\"{precision}\\\",\\\"{type}\\\",d].join(\\\" \\\")+\\\";\\\\n\\\";y.fragmentPragmas.define[v]=m,y.vertexPragmas.define[v]=m+x,y.vertexPragmas.initialize[v]=[v,\\\"=\\\",d,\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}else{for(var g=\\\"u_\\\"+d.slice(2)+\\\"_t\\\",b=h.getPaintValueStopZoomLevels(l.paintProperty),w=0;w<b.length&&b[w]<t.zoom;)w++;for(var S=Math.max(0,Math.min(b.length-4,w-2)),_=[],A=0;A<4;A++)_.push(b[Math.min(S+A,b.length-1)]);m=[\\\"varying\\\",\\\"{precision}\\\",\\\"{type}\\\",v].join(\\\" \\\")+\\\";\\\\n\\\",y.vertexPragmas.define[v]=m+[\\\"uniform\\\",\\\"lowp\\\",\\\"float\\\",g].join(\\\" \\\")+\\\";\\\\n\\\",y.fragmentPragmas.define[v]=m,y.uniforms.push(c.extend({},l,{name:g,getValue:a(l,S),components:1}));var M=l.components;if(1===M)y.attributes.push(c.extend({},l,{getValue:o(l,_),isFunction:!0,components:4*M})),y.vertexPragmas.define[v]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"vec4\\\",d].join(\\\" \\\")+\\\";\\\\n\\\",y.vertexPragmas.initialize[v]=[v,\\\"=\\\",\\\"evaluate_zoom_function_1(\\\"+d+\\\", \\\"+g+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\";else{for(var P=[],z=0;z<4;z++)P.push(d+z),y.attributes.push(c.extend({},l,{getValue:o(l,[_[z]]),isFunction:!0,name:d+z})),y.vertexPragmas.define[v]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"{type}\\\",d+z].join(\\\" \\\")+\\\";\\\\n\\\";y.vertexPragmas.initialize[v]=[v,\\\" = \\\",\\\"evaluate_zoom_function_4(\\\"+P.join(\\\", \\\")+\\\", \\\"+g+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}}}}}return e}function o(t,e){return function(n,r,i){if(1===e.length)return t.getValue(n,c.extend({},r,{zoom:e[0]}),i);for(var o=[],a=0;a<e.length;a++){var s=e[a];o.push(t.getValue(n,c.extend({},r,{zoom:s}),i)[0])}return o}}function a(t,e){return function(n,r){var i=n.getPaintInterpolationT(t.paintProperty,r.zoom);return[Math.max(0,Math.min(4,i-e))]}}var s=n(38),u=n(76),l=n(77),c=n(0),p=n(10),f=n(9);t.exports=r,r.create=function(t){return new({fill:n(81),line:n(84),circle:n(85),symbol:n(86)}[t.layer.type])(t)},r.EXTENT=8192,r.prototype.populateArrays=function(){this.createArrays(),this.recalculateStyleLayers();for(var t=0;t<this.features.length;t++)this.addFeature(this.features[t]);this.trimArrays()},r.prototype.prepareArrayGroup=function(t,e){var n=this.arrayGroups[t],r=n.length&&n[n.length-1];return r&&r.hasCapacityFor(e)||(r=new u({layoutVertexArrayType:this.programInterfaces[t].layoutVertexArrayType,elementArrayType:this.programInterfaces[t].elementArrayType,elementArrayType2:this.programInterfaces[t].elementArrayType2,paintVertexArrayTypes:this.paintVertexArrayTypes[t]}),r.index=n.length,n.push(r)),r},r.prototype.createArrays=function(){this.arrayGroups={},this.paintVertexArrayTypes={};for(var t in this.programInterfaces){this.arrayGroups[t]=[];var e=this.paintVertexArrayTypes[t]={},n=this.paintAttributes[t];for(var i in n)e[i]=new r.VertexArrayType(n[i].attributes)}},r.prototype.destroy=function(t){for(var e in this.bufferGroups)for(var n=this.bufferGroups[e],r=0;r<n.length;r++)n[r].destroy(t)},r.prototype.trimArrays=function(){for(var t in this.arrayGroups)for(var e=this.arrayGroups[t],n=0;n<e.length;n++)e[n].trim()},r.prototype.isEmpty=function(){for(var t in this.arrayGroups)for(var e=this.arrayGroups[t],n=0;n<e.length;n++)if(!e[n].isEmpty())return!1;return!0},r.prototype.getTransferables=function(t){for(var e in this.arrayGroups)for(var n=this.arrayGroups[e],r=0;r<n.length;r++)n[r].getTransferables(t)},r.prototype.setUniforms=function(t,e,n,r,i){for(var o=this.paintAttributes[e][r.id].uniforms,a=0;a<o.length;a++){var s=o[a],u=n[s.name];t[\\\"uniform\\\"+s.components+\\\"fv\\\"](u,s.getValue(r,i))}},r.prototype.serialize=function(){return{layerId:this.layer.id,zoom:this.zoom,arrays:c.mapObject(this.arrayGroups,function(t){return t.map(function(t){return t.serialize()})}),paintVertexArrayTypes:c.mapObject(this.paintVertexArrayTypes,function(t){return c.mapObject(t,function(t){return t.serialize()})}),childLayerIds:this.childLayers.map(function(t){return t.id})}},r.prototype.createFilter=function(){this.filter||(this.filter=s(this.layer.filter))};var h={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};r.prototype.recalculateStyleLayers=function(){for(var t=0;t<this.childLayers.length;t++)this.childLayers[t].recalculate(this.zoom,h)},r.prototype.populatePaintArrays=function(t,e,n,r,i){for(var o=0;o<this.childLayers.length;o++)for(var a=this.childLayers[o],s=this.arrayGroups[t],u=r.index;u<s.length;u++){var l=s[u],c=l.layoutVertexArray.length,p=l.paintVertexArrays[a.id];p.resize(c);for(var f=this.paintAttributes[t][a.id].attributes,h=0;h<f.length;h++)for(var y=f[h],d=y.getValue(a,e,n),m=y.multiplier||1,v=y.components||1,x=u===r.index?i:0,g=x;g<c;g++)for(var b=p.get(g),w=0;w<v;w++){var S=v>1?y.name+w:y.name;b[S]=d[w]*m}}},r.VertexArrayType=function(t){return new p({members:t,alignment:4})},r.ElementArrayType=function(t){return new p({members:[{type:\\\"Uint16\\\",name:\\\"vertices\\\",components:t||3}]})}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.set(t,e)}function i(t){return t.value}var o=n(0),a=n(51),s=n(52),u=n(54),l=n(56),c=n(19),p=n(64);t.exports=r;r.create=function(t,e){return new({background:n(65),circle:n(66),fill:n(67),line:n(68),raster:n(69),symbol:n(70)}[(e||t).type])(t,e)},r.prototype=o.inherit(p,{set:function(t,e){this.id=t.id,this.ref=t.ref,this.metadata=t.metadata,this.type=(e||t).type,this.source=(e||t).source,this.sourceLayer=(e||t)[\\\"source-layer\\\"],this.minzoom=(e||t).minzoom,this.maxzoom=(e||t).maxzoom,this.filter=(e||t).filter,this.paint={},this.layout={},this._paintSpecifications=u[\\\"paint_\\\"+this.type],this._layoutSpecifications=u[\\\"layout_\\\"+this.type],this._paintTransitions={},this._paintTransitionOptions={},this._paintDeclarations={},this._layoutDeclarations={},this._layoutFunctions={};var n,r;for(var i in t){var o=i.match(/^paint(?:\\\\.(.*))?$/);if(o){var a=o[1]||\\\"\\\";for(n in t[i])this.setPaintProperty(n,t[i][n],a)}}if(this.ref)this._layoutDeclarations=e._layoutDeclarations;else for(r in t.layout)this.setLayoutProperty(r,t.layout[r]);for(n in this._paintSpecifications)this.paint[n]=this.getPaintValue(n);for(r in this._layoutSpecifications)this._updateLayoutValue(r)},setLayoutProperty:function(t,e){if(null==e)delete this._layoutDeclarations[t];else{var n=\\\"layers.\\\"+this.id+\\\".layout.\\\"+t;if(this._handleErrors(l.layoutProperty,n,t,e))return;this._layoutDeclarations[t]=new s(this._layoutSpecifications[t],e)}this._updateLayoutValue(t)},getLayoutProperty:function(t){return this._layoutDeclarations[t]&&this._layoutDeclarations[t].value},getLayoutValue:function(t,e,n){var r=this._layoutSpecifications[t],i=this._layoutDeclarations[t];return i?i.calculate(e,n):r.default},setPaintProperty:function(t,e,n){var r=\\\"layers.\\\"+this.id+(n?'[\\\"paint.'+n+'\\\"].':\\\".paint.\\\")+t;if(o.endsWith(t,\\\"-transition\\\"))if(this._paintTransitionOptions[n||\\\"\\\"]||(this._paintTransitionOptions[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintTransitionOptions[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,r,t,e))return;this._paintTransitionOptions[n||\\\"\\\"][t]=e}else if(this._paintDeclarations[n||\\\"\\\"]||(this._paintDeclarations[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintDeclarations[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,r,t,e))return;this._paintDeclarations[n||\\\"\\\"][t]=new s(this._paintSpecifications[t],e)}},getPaintProperty:function(t,e){return e=e||\\\"\\\",o.endsWith(t,\\\"-transition\\\")?this._paintTransitionOptions[e]&&this._paintTransitionOptions[e][t]:this._paintDeclarations[e]&&this._paintDeclarations[e][t]&&this._paintDeclarations[e][t].value},getPaintValue:function(t,e,n){var r=this._paintSpecifications[t],i=this._paintTransitions[t];return i?i.calculate(e,n):\\\"color\\\"===r.type&&r.default?c(r.default):r.default},getPaintValueStopZoomLevels:function(t){var e=this._paintTransitions[t];return e?e.declaration.stopZoomLevels:[]},getPaintInterpolationT:function(t,e){return this._paintTransitions[t].declaration.calculateInterpolationT({zoom:e})},isPaintValueFeatureConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isFeatureConstant},isLayoutValueFeatureConstant:function(t){var e=this._layoutDeclarations[t];return!e||e.isFeatureConstant},isPaintValueZoomConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isZoomConstant},isHidden:function(t){return!!(this.minzoom&&t<this.minzoom)||(!!(this.maxzoom&&t>=this.maxzoom)||(\\\"none\\\"===this.layout.visibility||(!(!this.isPaintValueFeatureConstant(this.type+\\\"-opacity\\\")||0!==this.paint[this.type+\\\"-opacity\\\"])||!(!this.isPaintValueFeatureConstant(this.type+\\\"-color\\\")||!this.paint[this.type+\\\"-color\\\"]||0!==this.paint[this.type+\\\"-color\\\"][3]))))},updatePaintTransitions:function(t,e,n,r){for(var i=o.extend({},this._paintDeclarations[\\\"\\\"]),a=0;a<t.length;a++)o.extend(i,this._paintDeclarations[t[a]]);var s;for(s in i)this._applyPaintDeclaration(s,i[s],e,n,r);for(s in this._paintTransitions)s in i||this._applyPaintDeclaration(s,null,e,n,r)},updatePaintTransition:function(t,e,n,r,i){for(var o=this._paintDeclarations[\\\"\\\"][t],a=0;a<e.length;a++){var s=this._paintDeclarations[e[a]];s&&s[t]&&(o=s[t])}this._applyPaintDeclaration(t,o,n,r,i)},recalculate:function(t,e){for(var n in this._paintTransitions)this.paint[n]=this.getPaintValue(n,{zoom:t,zoomHistory:e});for(var r in this._layoutFunctions)this.layout[r]=this.getLayoutValue(r,{zoom:t,zoomHistory:e})},serialize:function(t){var e={id:this.id,ref:this.ref,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom};for(var n in this._paintDeclarations){e[\\\"\\\"===n?\\\"paint\\\":\\\"paint.\\\"+n]=o.mapObject(this._paintDeclarations[n],i)}return(!this.ref||t&&t.includeRefProperties)&&o.extend(e,{type:this.type,source:this.source,\\\"source-layer\\\":this.sourceLayer,filter:this.filter,layout:o.mapObject(this._layoutDeclarations,i)}),o.filterObject(e,function(t,e){return void 0!==t&&!(\\\"layout\\\"===e&&!Object.keys(t).length)})},_applyPaintDeclaration:function(t,e,n,r,i){var u=n.transition?this._paintTransitions[t]:void 0,l=this._paintSpecifications[t];if(null!==e&&void 0!==e||(e=new s(l,l.default)),!u||u.declaration.json!==e.json){var c=o.extend({duration:300,delay:0},r,this.getPaintProperty(t+\\\"-transition\\\")),p=this._paintTransitions[t]=new a(l,e,u,c);p.instant()||(p.loopID=i.set(p.endTime-Date.now())),u&&i.cancel(u.loopID)}},_updateLayoutValue:function(t){var e=this._layoutDeclarations[t];e&&e.isFunction?this._layoutFunctions[t]=!0:(delete this._layoutFunctions[t],this.layout[t]=this.getLayoutValue(t))},_handleErrors:function(t,e,n,r){return l.emitErrors(this,t.call(l,{key:e,layerType:this.type,objectKey:n,value:r,styleSpec:u,style:{glyphs:!0,sprite:!0}}))}})},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(24);t.exports=function(t){var e=n(25),a=n(7),s={\\\"*\\\":function(){return[]},array:n(26),boolean:n(61),number:n(27),color:n(62),constants:n(22),enum:n(13),filter:n(14),function:n(25),layer:n(28),object:n(7),source:n(31),string:n(32)},u=t.value,l=t.valueSpec,c=t.key,p=t.styleSpec,f=t.style;if(\\\"string\\\"===i(u)&&\\\"@\\\"===u[0]){if(p.$version>7)return[new r(c,u,\\\"constants have been deprecated as of v8\\\")];if(!(u in f.constants))return[new r(c,u,'constant \\\"%s\\\" not found',u)];t=o({},t,{value:f.constants[u]})}return l.function&&\\\"object\\\"===i(u)?e(t):l.type&&s[l.type]?s[l.type](t):a(o({},t,{valueSpec:l.type?p[l.type]:l}))}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(6);t.exports=function(t){var e=t.key,n=t.value,a=t.valueSpec,s=t.objectElementValidators||{},u=t.style,l=t.styleSpec,c=[],p=i(n);if(\\\"object\\\"!==p)return[new r(e,n,\\\"object expected, %s found\\\",p)];for(var f in n){var h=f.split(\\\".\\\")[0],y=a&&(a[h]||a[\\\"*\\\"]),d=s[h]||s[\\\"*\\\"];y||d?c=c.concat((d||o)({key:(e?e+\\\".\\\":e)+f,value:n[f],valueSpec:y,style:u,styleSpec:l,object:n,objectKey:f})):\\\"\\\"!==e&&1!==e.split(\\\".\\\").length&&c.push(new r(e,n[f],'unknown property \\\"%s\\\"',f))}for(h in a)a[h].required&&void 0===a[h].default&&void 0===n[h]&&c.push(new r(e,n,'missing required property \\\"%s\\\"',h));return c}},function(t,e,n){\\\"use strict\\\";function r(t){return{min:-1*Math.pow(2,t-1),max:Math.pow(2,t-1)-1}}var i=n(0),o=n(4).EXTENT,a=n(9),s={15:r(15),16:r(16)};t.exports=function(t,e){var n=s[e||16];a(n);for(var r=o/t.extent,u=t.loadGeometry(),l=0;l<u.length;l++)for(var c=u[l],p=0;p<c.length;p++){var f=c[p];f.x=Math.round(f.x*r),f.y=Math.round(f.y*r),(f.x<n.min||f.x>n.max||f.y<n.min||f.y>n.max)&&i.warnOnce(\\\"Geometry exceeds allowed extent, reduce your vector tile buffer size\\\")}return u}},function(t,e,n){\\\"use strict\\\";(function(e){function r(t,e){if(t===e)return 0;for(var n=t.length,r=e.length,i=0,o=Math.min(n,r);i<o;++i)if(t[i]!==e[i]){n=t[i],r=e[i];break}return n<r?-1:r<n?1:0}function i(t){return e.Buffer&&\\\"function\\\"==typeof e.Buffer.isBuffer?e.Buffer.isBuffer(t):!(null==t||!t._isBuffer)}function o(t){return Object.prototype.toString.call(t)}function a(t){return!i(t)&&(\\\"function\\\"==typeof e.ArrayBuffer&&(\\\"function\\\"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):!!t&&(t instanceof DataView||!!(t.buffer&&t.buffer instanceof ArrayBuffer))))}function s(t){if(S.isFunction(t)){if(M)return t.name;var e=t.toString(),n=e.match(z);return n&&n[1]}}function u(t,e){return\\\"string\\\"==typeof t?t.length<e?t:t.slice(0,e):t}function l(t){if(M||!S.isFunction(t))return S.inspect(t);var e=s(t);return\\\"[Function\\\"+(e?\\\": \\\"+e:\\\"\\\")+\\\"]\\\"}function c(t){return u(l(t.actual),128)+\\\" \\\"+t.operator+\\\" \\\"+u(l(t.expected),128)}function p(t,e,n,r,i){throw new P.AssertionError({message:n,actual:t,expected:e,operator:r,stackStartFunction:i})}function f(t,e){t||p(t,!0,e,\\\"==\\\",P.ok)}function h(t,e,n,s){if(t===e)return!0;if(i(t)&&i(e))return 0===r(t,e);if(S.isDate(t)&&S.isDate(e))return t.getTime()===e.getTime();if(S.isRegExp(t)&&S.isRegExp(e))return t.source===e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&\\\"object\\\"==typeof t||null!==e&&\\\"object\\\"==typeof e){if(a(t)&&a(e)&&o(t)===o(e)&&!(t instanceof Float32Array||t instanceof Float64Array))return 0===r(new Uint8Array(t.buffer),new Uint8Array(e.buffer));if(i(t)!==i(e))return!1;s=s||{actual:[],expected:[]};var u=s.actual.indexOf(t);return-1!==u&&u===s.expected.indexOf(e)||(s.actual.push(t),s.expected.push(e),d(t,e,n,s))}return n?t===e:t==e}function y(t){return\\\"[object Arguments]\\\"==Object.prototype.toString.call(t)}function d(t,e,n,r){if(null===t||void 0===t||null===e||void 0===e)return!1;if(S.isPrimitive(t)||S.isPrimitive(e))return t===e;if(n&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var i=y(t),o=y(e);if(i&&!o||!i&&o)return!1;if(i)return t=A.call(t),e=A.call(e),h(t,e,n);var a,s,u=I(t),l=I(e);if(u.length!==l.length)return!1;for(u.sort(),l.sort(),s=u.length-1;s>=0;s--)if(u[s]!==l[s])return!1;for(s=u.length-1;s>=0;s--)if(a=u[s],!h(t[a],e[a],n,r))return!1;return!0}function m(t,e,n){h(t,e,!0)&&p(t,e,n,\\\"notDeepStrictEqual\\\",m)}function v(t,e){if(!t||!e)return!1;if(\\\"[object RegExp]\\\"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function x(t){var e;try{t()}catch(t){e=t}return e}function g(t,e,n,r){var i;if(\\\"function\\\"!=typeof e)throw new TypeError('\\\"block\\\" argument must be a function');\\\"string\\\"==typeof n&&(r=n,n=null),i=x(e),r=(n&&n.name?\\\" (\\\"+n.name+\\\").\\\":\\\".\\\")+(r?\\\" \\\"+r:\\\".\\\"),t&&!i&&p(i,n,\\\"Missing expected exception\\\"+r);var o=\\\"string\\\"==typeof r,a=!t&&S.isError(i),s=!t&&i&&!n;if((a&&o&&v(i,n)||s)&&p(i,n,\\\"Got unwanted exception\\\"+r),t&&i&&n&&!v(i,n)||!t&&i)throw i}function b(t,e){t||p(t,!0,e,\\\"==\\\",b)}var w=n(80),S=n(23),_=Object.prototype.hasOwnProperty,A=Array.prototype.slice,M=function(){return\\\"foo\\\"===function(){}.name}(),P=t.exports=f,z=/\\\\s*function\\\\s+([^\\\\(\\\\s]*)\\\\s*/;P.AssertionError=function(t){this.name=\\\"AssertionError\\\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=c(this),this.generatedMessage=!0);var e=t.stackStartFunction||p;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var n=new Error;if(n.stack){var r=n.stack,i=s(e),o=r.indexOf(\\\"\\\\n\\\"+i);if(o>=0){var a=r.indexOf(\\\"\\\\n\\\",o+1);r=r.substring(a+1)}this.stack=r}}},S.inherits(P.AssertionError,Error),P.fail=p,P.ok=f,P.equal=function(t,e,n){t!=e&&p(t,e,n,\\\"==\\\",P.equal)},P.notEqual=function(t,e,n){t==e&&p(t,e,n,\\\"!=\\\",P.notEqual)},P.deepEqual=function(t,e,n){h(t,e,!1)||p(t,e,n,\\\"deepEqual\\\",P.deepEqual)},P.deepStrictEqual=function(t,e,n){h(t,e,!0)||p(t,e,n,\\\"deepStrictEqual\\\",P.deepStrictEqual)},P.notDeepEqual=function(t,e,n){h(t,e,!1)&&p(t,e,n,\\\"notDeepEqual\\\",P.notDeepEqual)},P.notDeepStrictEqual=m,P.strictEqual=function(t,e,n){t!==e&&p(t,e,n,\\\"===\\\",P.strictEqual)},P.notStrictEqual=function(t,e,n){t===e&&p(t,e,n,\\\"!==\\\",P.notStrictEqual)},P.throws=function(t,e,n){g(!0,t,e,n)},P.doesNotThrow=function(t,e,n){g(!1,t,e,n)},P.ifError=function(t){if(t)throw t},P.strict=w(b,P,{equal:P.strictEqual,deepEqual:P.deepStrictEqual,notEqual:P.notStrictEqual,notDeepEqual:P.notDeepStrictEqual}),P.strict.strict=P.strict;var I=Object.keys||function(t){var e=[];for(var n in t)_.call(t,n)&&e.push(n);return e}}).call(e,n(37))},function(t,e,n){\\\"use strict\\\";function r(t){function e(){f.apply(this,arguments)}function n(){h.apply(this,arguments),this.members=e.prototype.members}var r=JSON.stringify(t);if(m[r])return m[r];void 0===t.alignment&&(t.alignment=1),e.prototype=Object.create(f.prototype);var s=0,l=0,v=[\\\"Uint8\\\"];return e.prototype.members=t.members.map(function(n){n={name:n.name,type:n.type,components:n.components||1},y(n.name.length),y(n.type in d),v.indexOf(n.type)<0&&v.push(n.type);var r=a(n.type);l=Math.max(l,r),n.offset=s=o(s,Math.max(t.alignment,r));for(var i=0;i<n.components;i++)Object.defineProperty(e.prototype,n.name+(1===n.components?\\\"\\\":i),{get:c(n,i),set:p(n,i)});return s+=r*n.components,n}),e.prototype.alignment=t.alignment,e.prototype.size=o(s,Math.max(l,t.alignment)),n.serialize=i,n.prototype=Object.create(h.prototype),n.prototype.StructType=e,n.prototype.bytesPerElement=e.prototype.size,n.prototype.emplaceBack=u(e.prototype.members,e.prototype.size),n.prototype._usedTypes=v,m[r]=n,n}function i(){return{members:this.prototype.StructType.prototype.members,alignment:this.prototype.StructType.prototype.alignment,bytesPerElement:this.prototype.bytesPerElement}}function o(t,e){return Math.ceil(t/e)*e}function a(t){return d[t].BYTES_PER_ELEMENT}function s(t){return t.toLowerCase()}function u(t,e){for(var n=[],r=[],i=\\\"var i = this.length;\\\\nthis.resize(this.length + 1);\\\\n\\\",o=0;o<t.length;o++){var u=t[o],l=a(u.type);n.indexOf(l)<0&&(n.push(l),i+=\\\"var o\\\"+l.toFixed(0)+\\\" = i * \\\"+(e/l).toFixed(0)+\\\";\\\\n\\\");for(var c=0;c<u.components;c++){var p=\\\"v\\\"+r.length,f=\\\"o\\\"+l.toFixed(0)+\\\" + \\\"+(u.offset/l+c).toFixed(0);i+=\\\"this.\\\"+s(u.type)+\\\"[\\\"+f+\\\"] = \\\"+p+\\\";\\\\n\\\",r.push(p)}}return i+=\\\"return i;\\\",new Function(r,i)}function l(t,e){var n=\\\"this._pos\\\"+a(t.type).toFixed(0),r=(t.offset/a(t.type)+e).toFixed(0),i=n+\\\" + \\\"+r;return\\\"this._structArray.\\\"+s(t.type)+\\\"[\\\"+i+\\\"]\\\"}function c(t,e){return new Function([],\\\"return \\\"+l(t,e)+\\\";\\\")}function p(t,e){return new Function([\\\"x\\\"],l(t,e)+\\\" = x;\\\")}function f(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8}function h(t){void 0!==t?(this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.capacity=this.arrayBuffer.byteLength/this.bytesPerElement,this._refreshViews()):(this.capacity=-1,this.resize(0))}var y=n(9);t.exports=r;var d={Int8:Int8Array,Uint8:Uint8Array,Uint8Clamped:Uint8ClampedArray,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array,Float64:Float64Array},m={};h.prototype.DEFAULT_CAPACITY=128,h.prototype.RESIZE_MULTIPLIER=5,h.prototype.serialize=function(){return this.trim(),{length:this.length,arrayBuffer:this.arrayBuffer}},h.prototype.get=function(t){return new this.StructType(this,t)},h.prototype.trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},h.prototype.resize=function(t){if(this.length=t,t>this.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*this.RESIZE_MULTIPLIER),this.DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},h.prototype._refreshViews=function(){for(var t=0;t<this._usedTypes.length;t++){var e=this._usedTypes[t];this[s(e)]=new d[e](this.arrayBuffer)}},h.prototype.toArray=function(t,e){for(var n=[],r=t;r<e;r++){var i=this.get(r);n.push(i)}return n}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}},function(t,e,n){t.exports.VectorTile=n(71),t.exports.VectorTileFeature=n(36),t.exports.VectorTileLayer=n(35)},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=[];return-1===o.values.indexOf(i(n))&&a.push(new r(e,n,\\\"expected one of [%s], %s found\\\",o.values.join(\\\", \\\"),n)),a}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(13),o=n(3),a=n(11);t.exports=function t(e){var n,s=e.value,u=e.key,l=e.styleSpec,c=[];if(\\\"array\\\"!==o(s))return[new r(u,s,\\\"array expected, %s found\\\",o(s))];if(s.length<1)return[new r(u,s,\\\"filter array must have at least 1 element\\\")];switch(c=c.concat(i({key:u+\\\"[0]\\\",value:s[0],valueSpec:l.filter_operator,style:e.style,styleSpec:e.styleSpec})),a(s[0])){case\\\"<\\\":case\\\"<=\\\":case\\\">\\\":case\\\">=\\\":s.length>=2&&\\\"$type\\\"==s[1]&&c.push(new r(u,s,'\\\"$type\\\" cannot be use with operator \\\"%s\\\"',s[0]));case\\\"==\\\":case\\\"!=\\\":3!=s.length&&c.push(new r(u,s,'filter array for operator \\\"%s\\\" must have 3 elements',s[0]));case\\\"in\\\":case\\\"!in\\\":s.length>=2&&(n=o(s[1]),\\\"string\\\"!==n?c.push(new r(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new r(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\")));for(var p=2;p<s.length;p++)n=o(s[p]),\\\"$type\\\"==s[1]?c=c.concat(i({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],valueSpec:l.geometry_type,style:e.style,styleSpec:e.styleSpec})):\\\"string\\\"===n&&\\\"@\\\"===s[p][0]?c.push(new r(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"filter value cannot be a constant\\\")):\\\"string\\\"!==n&&\\\"number\\\"!==n&&\\\"boolean\\\"!==n&&c.push(new r(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"string, number, or boolean expected, %s found\\\",n));break;case\\\"any\\\":case\\\"all\\\":case\\\"none\\\":for(p=1;p<s.length;p++)c=c.concat(t({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],style:e.style,styleSpec:e.styleSpec}));break;case\\\"has\\\":case\\\"!has\\\":n=o(s[1]),2!==s.length?c.push(new r(u,s,'filter array for \\\"%s\\\" operator must have 2 elements',s[0])):\\\"string\\\"!==n?c.push(new r(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new r(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\"))}return c}},function(t,e,n){\\\"use strict\\\";(function(e){function r(t){this.buf=m.isBuffer(t)?t:new m(t||0),this.pos=0,this.length=this.buf.length}function i(t,e){var n,r=e.buf;if(n=r[e.pos++],t+=268435456*(127&n),n<128)return t;if(n=r[e.pos++],t+=34359738368*(127&n),n<128)return t;if(n=r[e.pos++],t+=4398046511104*(127&n),n<128)return t;if(n=r[e.pos++],t+=562949953421312*(127&n),n<128)return t;if(n=r[e.pos++],t+=72057594037927940*(127&n),n<128)return t;if(n=r[e.pos++],t+=0x8000000000000000*(127&n),n<128)return t;throw new Error(\\\"Expected varint not more than 10 bytes\\\")}function o(t,e){e.realloc(10);for(var n=e.pos+10;t>=1;){if(e.pos>=n)throw new Error(\\\"Given varint doesn't fit into 10 bytes\\\");var r=255&t;e.buf[e.pos++]=r|(t>=128?128:0),t/=128}}function a(t,e,n){var r=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.ceil(Math.log(e)/(7*Math.LN2));n.realloc(r);for(var i=n.pos-1;i>=t;i--)n.buf[i+r]=n.buf[i]}function s(t,e){for(var n=0;n<t.length;n++)e.writeVarint(t[n])}function u(t,e){for(var n=0;n<t.length;n++)e.writeSVarint(t[n])}function l(t,e){for(var n=0;n<t.length;n++)e.writeFloat(t[n])}function c(t,e){for(var n=0;n<t.length;n++)e.writeDouble(t[n])}function p(t,e){for(var n=0;n<t.length;n++)e.writeBoolean(t[n])}function f(t,e){for(var n=0;n<t.length;n++)e.writeFixed32(t[n])}function h(t,e){for(var n=0;n<t.length;n++)e.writeSFixed32(t[n])}function y(t,e){for(var n=0;n<t.length;n++)e.writeFixed64(t[n])}function d(t,e){for(var n=0;n<t.length;n++)e.writeSFixed64(t[n])}t.exports=r;var m=e.Buffer||n(72);r.Varint=0,r.Fixed64=1,r.Bytes=2,r.Fixed32=5;var v=Math.pow(2,63);r.prototype={destroy:function(){this.buf=null},readFields:function(t,e,n){for(n=n||this.length;this.pos<n;){var r=this.readVarint(),i=r>>3,o=this.pos;t(i,e,this),this.pos===o&&this.skip(r)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readUInt32LE(this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readInt32LE(this.pos+4);return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,e,n=this.buf;return e=n[this.pos++],t=127&e,e<128?t:(e=n[this.pos++],t|=(127&e)<<7,e<128?t:(e=n[this.pos++],t|=(127&e)<<14,e<128?t:(e=n[this.pos++],t|=(127&e)<<21,e<128?t:i(t,this))))},readVarint64:function(){var t=this.pos,e=this.readVarint();if(e<v)return e;for(var n=this.pos-2;255===this.buf[n];)n--;n<t&&(n=t),e=0;for(var r=0;r<n-t+1;r++){var i=127&~this.buf[t+r];e+=r<4?i<<7*r:i*Math.pow(2,7*r)}return-e-1},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.buf.toString(\\\"utf8\\\",this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.slice(this.pos,t);return this.pos=t,e},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readVarint());return e},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(t){var e=7&t;if(e===r.Varint)for(;this.buf[this.pos++]>127;);else if(e===r.Bytes)this.pos=this.readVarint()+this.pos;else if(e===r.Fixed32)this.pos+=4;else{if(e!==r.Fixed64)throw new Error(\\\"Unimplemented type: \\\"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var n=new m(e);this.buf.copy(n),this.buf=n,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(t){if((t=+t)>268435455)return void o(t,this);this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var e=m.byteLength(t);this.writeVarint(e),this.realloc(e),this.buf.write(t,this.pos),this.pos+=e},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var n=0;n<e;n++)this.buf[this.pos++]=t[n]},writeRawMessage:function(t,e){this.pos++;var n=this.pos;t(e,this);var r=this.pos-n;r>=128&&a(n,r,this),this.pos=n-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,e,n){this.writeTag(t,r.Bytes),this.writeRawMessage(e,n)},writePackedVarint:function(t,e){this.writeMessage(t,s,e)},writePackedSVarint:function(t,e){this.writeMessage(t,u,e)},writePackedBoolean:function(t,e){this.writeMessage(t,p,e)},writePackedFloat:function(t,e){this.writeMessage(t,l,e)},writePackedDouble:function(t,e){this.writeMessage(t,c,e)},writePackedFixed32:function(t,e){this.writeMessage(t,f,e)},writePackedSFixed32:function(t,e){this.writeMessage(t,h,e)},writePackedFixed64:function(t,e){this.writeMessage(t,y,e)},writePackedSFixed64:function(t,e){this.writeMessage(t,d,e)},writeBytesField:function(t,e){this.writeTag(t,r.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,r.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,r.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,r.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,r.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,r.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,r.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,r.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,r.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,r.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}}}).call(e,n(37))},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){var o={id:r||null,type:e,geometry:n,tags:t||null,min:[1/0,1/0],max:[-1/0,-1/0]};return i(o),o}function i(t){var e=t.geometry,n=t.min,r=t.max;if(1===t.type)o(n,r,e);else for(var i=0;i<e.length;i++)o(n,r,e[i]);return t}function o(t,e,n){for(var r,i=0;i<n.length;i++)r=n[i],t[0]=Math.min(r[0],t[0]),e[0]=Math.max(r[0],e[0]),t[1]=Math.min(r[1],t[1]),e[1]=Math.max(r[1],e[1])}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n){return t*(1-n)+e*n}t.exports=r,r.number=r,r.vec2=function(t,e,n){return[r(t[0],e[0],n),r(t[1],e[1],n)]},r.color=function(t,e,n){return[r(t[0],e[0],n),r(t[1],e[1],n),r(t[2],e[2],n),r(t[3],e[3],n)]},r.array=function(t,e,n){return t.map(function(t,i){return r(t,e[i],n)})}},function(t,e,n){\\\"use strict\\\";var r=n(53);e.interpolated=function(t){var e=r.interpolated(t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e[\\\"piecewise-constant\\\"]=function(t){var e=r[\\\"piecewise-constant\\\"](t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e.isFunctionDefinition=r.isFunctionDefinition},function(t,e,n){\\\"use strict\\\";var r=n(20).parseCSSColor,i=n(0),o=n(18),a={};t.exports=function t(e){if(o.isFunctionDefinition(e))return i.extend({},e,{stops:e.stops.map(function(e){return[e[0],t(e[1])]})});if(\\\"string\\\"==typeof e){if(!a[e]){var n=r(e);if(!n)throw new Error(\\\"Invalid color \\\"+e);a[e]=[n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3]]}return a[e]}throw new Error(\\\"Invalid color \\\"+e)}},function(t,e){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t<0?0:t>1?1:t}function i(t){return n(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function o(t){return r(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))}function a(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function s(t){var e=t.replace(/ /g,\\\"\\\").toLowerCase();if(e in u)return u[e].slice();if(\\\"#\\\"===e[0]){if(4===e.length){var r=parseInt(e.substr(1),16);return r>=0&&r<=4095?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===e.length){var r=parseInt(e.substr(1),16);return r>=0&&r<=16777215?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var s=e.indexOf(\\\"(\\\"),l=e.indexOf(\\\")\\\");if(-1!==s&&l+1===e.length){var c=e.substr(0,s),p=e.substr(s+1,l-(s+1)).split(\\\",\\\"),f=1;switch(c){case\\\"rgba\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"rgb\\\":return 3!==p.length?null:[i(p[0]),i(p[1]),i(p[2]),f];case\\\"hsla\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"hsl\\\":if(3!==p.length)return null;var h=(parseFloat(p[0])%360+360)%360/360,y=o(p[1]),d=o(p[2]),m=d<=.5?d*(y+1):d+y-d*y,v=2*d-m;return[n(255*a(v,m,h+1/3)),n(255*a(v,m,h)),n(255*a(v,m,h-1/3)),f];default:return null}}return null}var u={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{e.parseCSSColor=s}catch(t){}},function(t,e,n){t.exports=n(55)},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3);t.exports=function(t){var e=t.key,n=t.value;if(t.styleSpec.$version>7)return n?[new r(e,n,\\\"constants have been deprecated as of v8\\\")]:[];var o=i(n);if(\\\"object\\\"!==o)return[new r(e,n,\\\"object expected, %s found\\\",o)];var a=[];for(var s in n)\\\"@\\\"!==s[0]&&a.push(new r(e+\\\".\\\"+s,n[s],'constants must start with \\\"@\\\"'));return a}},function(t,e,n){(function(t){function r(t,n){var r={seen:[],stylize:o};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),y(n)?r.showHidden=n:n&&e._extend(r,n),b(r.showHidden)&&(r.showHidden=!1),b(r.depth)&&(r.depth=2),b(r.colors)&&(r.colors=!1),b(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=i),s(r,t,r.depth)}function i(t,e){var n=r.styles[e];return n?\\\"\\u001b[\\\"+r.colors[n][0]+\\\"m\\\"+t+\\\"\\u001b[\\\"+r.colors[n][1]+\\\"m\\\":t}function o(t,e){return t}function a(t){var e={};return t.forEach(function(t,n){e[t]=!0}),e}function s(t,n,r){if(t.customInspect&&n&&M(n.inspect)&&n.inspect!==e.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,t);return x(i)||(i=s(t,i,r)),i}var o=u(t,n);if(o)return o;var y=Object.keys(n),d=a(y);if(t.showHidden&&(y=Object.getOwnPropertyNames(n)),A(n)&&(y.indexOf(\\\"message\\\")>=0||y.indexOf(\\\"description\\\")>=0))return l(n);if(0===y.length){if(M(n)){var m=n.name?\\\": \\\"+n.name:\\\"\\\";return t.stylize(\\\"[Function\\\"+m+\\\"]\\\",\\\"special\\\")}if(w(n))return t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\");if(_(n))return t.stylize(Date.prototype.toString.call(n),\\\"date\\\");if(A(n))return l(n)}var v=\\\"\\\",g=!1,b=[\\\"{\\\",\\\"}\\\"];if(h(n)&&(g=!0,b=[\\\"[\\\",\\\"]\\\"]),M(n)){v=\\\" [Function\\\"+(n.name?\\\": \\\"+n.name:\\\"\\\")+\\\"]\\\"}if(w(n)&&(v=\\\" \\\"+RegExp.prototype.toString.call(n)),_(n)&&(v=\\\" \\\"+Date.prototype.toUTCString.call(n)),A(n)&&(v=\\\" \\\"+l(n)),0===y.length&&(!g||0==n.length))return b[0]+v+b[1];if(r<0)return w(n)?t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\"):t.stylize(\\\"[Object]\\\",\\\"special\\\");t.seen.push(n);var S;return S=g?c(t,n,r,d,y):y.map(function(e){return p(t,n,r,d,e,g)}),t.seen.pop(),f(S,v,b)}function u(t,e){if(b(e))return t.stylize(\\\"undefined\\\",\\\"undefined\\\");if(x(e)){var n=\\\"'\\\"+JSON.stringify(e).replace(/^\\\"|\\\"$/g,\\\"\\\").replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"')+\\\"'\\\";return t.stylize(n,\\\"string\\\")}return v(e)?t.stylize(\\\"\\\"+e,\\\"number\\\"):y(e)?t.stylize(\\\"\\\"+e,\\\"boolean\\\"):d(e)?t.stylize(\\\"null\\\",\\\"null\\\"):void 0}function l(t){return\\\"[\\\"+Error.prototype.toString.call(t)+\\\"]\\\"}function c(t,e,n,r,i){for(var o=[],a=0,s=e.length;a<s;++a)V(e,String(a))?o.push(p(t,e,n,r,String(a),!0)):o.push(\\\"\\\");return i.forEach(function(i){i.match(/^\\\\d+$/)||o.push(p(t,e,n,r,i,!0))}),o}function p(t,e,n,r,i,o){var a,u,l;if(l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]},l.get?u=l.set?t.stylize(\\\"[Getter/Setter]\\\",\\\"special\\\"):t.stylize(\\\"[Getter]\\\",\\\"special\\\"):l.set&&(u=t.stylize(\\\"[Setter]\\\",\\\"special\\\")),V(r,i)||(a=\\\"[\\\"+i+\\\"]\\\"),u||(t.seen.indexOf(l.value)<0?(u=d(n)?s(t,l.value,null):s(t,l.value,n-1),u.indexOf(\\\"\\\\n\\\")>-1&&(u=o?u.split(\\\"\\\\n\\\").map(function(t){return\\\"  \\\"+t}).join(\\\"\\\\n\\\").substr(2):\\\"\\\\n\\\"+u.split(\\\"\\\\n\\\").map(function(t){return\\\"   \\\"+t}).join(\\\"\\\\n\\\"))):u=t.stylize(\\\"[Circular]\\\",\\\"special\\\")),b(a)){if(o&&i.match(/^\\\\d+$/))return u;a=JSON.stringify(\\\"\\\"+i),a.match(/^\\\"([a-zA-Z_][a-zA-Z_0-9]*)\\\"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,\\\"name\\\")):(a=a.replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"').replace(/(^\\\"|\\\"$)/g,\\\"'\\\"),a=t.stylize(a,\\\"string\\\"))}return a+\\\": \\\"+u}function f(t,e,n){var r=0;return t.reduce(function(t,e){return r++,e.indexOf(\\\"\\\\n\\\")>=0&&r++,t+e.replace(/\\\\u001b\\\\[\\\\d\\\\d?m/g,\\\"\\\").length+1},0)>60?n[0]+(\\\"\\\"===e?\\\"\\\":e+\\\"\\\\n \\\")+\\\" \\\"+t.join(\\\",\\\\n  \\\")+\\\" \\\"+n[1]:n[0]+e+\\\" \\\"+t.join(\\\", \\\")+\\\" \\\"+n[1]}function h(t){return Array.isArray(t)}function y(t){return\\\"boolean\\\"==typeof t}function d(t){return null===t}function m(t){return null==t}function v(t){return\\\"number\\\"==typeof t}function x(t){return\\\"string\\\"==typeof t}function g(t){return\\\"symbol\\\"==typeof t}function b(t){return void 0===t}function w(t){return S(t)&&\\\"[object RegExp]\\\"===z(t)}function S(t){return\\\"object\\\"==typeof t&&null!==t}function _(t){return S(t)&&\\\"[object Date]\\\"===z(t)}function A(t){return S(t)&&(\\\"[object Error]\\\"===z(t)||t instanceof Error)}function M(t){return\\\"function\\\"==typeof t}function P(t){return null===t||\\\"boolean\\\"==typeof t||\\\"number\\\"==typeof t||\\\"string\\\"==typeof t||\\\"symbol\\\"==typeof t||void 0===t}function z(t){return Object.prototype.toString.call(t)}function I(t){return t<10?\\\"0\\\"+t.toString(10):t.toString(10)}function T(){var t=new Date,e=[I(t.getHours()),I(t.getMinutes()),I(t.getSeconds())].join(\\\":\\\");return[t.getDate(),B[t.getMonth()],e].join(\\\" \\\")}function V(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function k(t,e){if(!t){var n=new Error(\\\"Promise was rejected with a falsy value\\\");n.reason=t,t=n}return e(t)}function E(e){function n(){for(var n=[],r=0;r<arguments.length;r++)n.push(arguments[r]);var i=n.pop();if(\\\"function\\\"!=typeof i)throw new TypeError(\\\"The last argument must be of type Function\\\");var o=this,a=function(){return i.apply(o,arguments)};e.apply(this,n).then(function(e){t.nextTick(a,null,e)},function(e){t.nextTick(k,e,a)})}if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"original\\\" argument must be of type Function');return Object.setPrototypeOf(n,Object.getPrototypeOf(e)),Object.defineProperties(n,F(e)),n}var F=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),n={},r=0;r<e.length;r++)n[e[r]]=Object.getOwnPropertyDescriptor(t,e[r]);return n},j=/%[sdj%]/g;e.format=function(t){if(!x(t)){for(var e=[],n=0;n<arguments.length;n++)e.push(r(arguments[n]));return e.join(\\\" \\\")}for(var n=1,i=arguments,o=i.length,a=String(t).replace(j,function(t){if(\\\"%%\\\"===t)return\\\"%\\\";if(n>=o)return t;switch(t){case\\\"%s\\\":return String(i[n++]);case\\\"%d\\\":return Number(i[n++]);case\\\"%j\\\":try{return JSON.stringify(i[n++])}catch(t){return\\\"[Circular]\\\"}default:return t}}),s=i[n];n<o;s=i[++n])d(s)||!S(s)?a+=\\\" \\\"+s:a+=\\\" \\\"+r(s);return a},e.deprecate=function(n,r){function i(){if(!o){if(t.throwDeprecation)throw new Error(r);t.traceDeprecation?console.trace(r):console.error(r),o=!0}return n.apply(this,arguments)}if(void 0!==t&&!0===t.noDeprecation)return n;if(void 0===t)return function(){return e.deprecate(n,r).apply(this,arguments)};var o=!1;return i};var L,O={};e.debuglog=function(n){if(b(L)&&(L=Object({NODE_ENV:\\\"production\\\"}).NODE_DEBUG||\\\"\\\"),n=n.toUpperCase(),!O[n])if(new RegExp(\\\"\\\\\\\\b\\\"+n+\\\"\\\\\\\\b\\\",\\\"i\\\").test(L)){var r=t.pid;O[n]=function(){var t=e.format.apply(e,arguments);console.error(\\\"%s %d: %s\\\",n,r,t)}}else O[n]=function(){};return O[n]},e.inspect=r,r.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r.styles={special:\\\"cyan\\\",number:\\\"yellow\\\",boolean:\\\"yellow\\\",undefined:\\\"grey\\\",null:\\\"bold\\\",string:\\\"green\\\",date:\\\"magenta\\\",regexp:\\\"red\\\"},e.isArray=h,e.isBoolean=y,e.isNull=d,e.isNullOrUndefined=m,e.isNumber=v,e.isString=x,e.isSymbol=g,e.isUndefined=b,e.isRegExp=w,e.isObject=S,e.isDate=_,e.isError=A,e.isFunction=M,e.isPrimitive=P,e.isBuffer=n(59);var B=[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"];e.log=function(){console.log(\\\"%s - %s\\\",T(),e.format.apply(e,arguments))},e.inherits=n(60),e._extend=function(t,e){if(!e||!S(e))return t;for(var n=Object.keys(e),r=n.length;r--;)t[n[r]]=e[n[r]];return t};var C=\\\"undefined\\\"!=typeof Symbol?Symbol(\\\"util.promisify.custom\\\"):void 0;e.promisify=function(t){function e(){for(var e,n,r=new Promise(function(t,r){e=t,n=r}),i=[],o=0;o<arguments.length;o++)i.push(arguments[o]);i.push(function(t,r){t?n(t):e(r)});try{t.apply(this,i)}catch(t){n(t)}return r}if(\\\"function\\\"!=typeof t)throw new TypeError('The \\\"original\\\" argument must be of type Function');if(C&&t[C]){var e=t[C];if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"util.promisify.custom\\\" argument must be of type Function');return Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),C&&Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,F(t))},e.promisify.custom=C,e.callbackify=E}).call(e,n(58))},function(t,e,n){\\\"use strict\\\";t.exports=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(6),a=n(7),s=n(26),u=n(27);t.exports=function(t){function e(t){var e=[],o=t.value;return e=e.concat(s({key:t.key,value:o,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:n})),\\\"array\\\"===i(o)&&0===o.length&&e.push(new r(t.key,o,\\\"array must have at least one stop\\\")),e}function n(t){var e=[],n=t.value,s=t.key;if(\\\"array\\\"!==i(n))return[new r(s,n,\\\"array expected, %s found\\\",i(n))];if(2!==n.length)return[new r(s,n,\\\"array length %d expected, length %d found\\\",2,n.length)];var f=i(n[0]);if(c||(c=f),f!==c)return[new r(s,n,\\\"%s stop key type must match previous stop key type %s\\\",f,c)];if(\\\"object\\\"===f){if(void 0===n[0].zoom)return[new r(s,n,\\\"object stop key must have zoom\\\")];if(void 0===n[0].value)return[new r(s,n,\\\"object stop key must have value\\\")];e=e.concat(a({key:s+\\\"[0]\\\",value:n[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:u,value:l}}))}else e=e.concat((h?u:l)({key:s+\\\"[0]\\\",value:n[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec}));return e=e.concat(o({key:s+\\\"[1]\\\",value:n[1],valueSpec:p,style:t.style,styleSpec:t.styleSpec})),\\\"number\\\"===i(n[0])&&(\\\"piecewise-constant\\\"===p.function&&n[0]%1!=0&&e.push(new r(s+\\\"[0]\\\",n[0],\\\"zoom level for piecewise-constant functions must be an integer\\\")),0!==t.arrayIndex&&n[0]<t.array[t.arrayIndex-1][0]&&e.push(new r(s+\\\"[0]\\\",n[0],\\\"array stops must appear in ascending order\\\"))),e}function l(t){var e=[],n=i(t.value);return\\\"number\\\"!==n&&\\\"string\\\"!==n&&\\\"array\\\"!==n&&e.push(new r(t.key,t.value,\\\"property value must be a number, string or array\\\")),e}var c,p=t.valueSpec,f=void 0!==t.value.property||\\\"object\\\"===c,h=void 0===t.value.property||\\\"object\\\"===c,y=a({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:e}});return t.styleSpec.$version>=8&&(f&&!t.valueSpec[\\\"property-function\\\"]?y.push(new r(t.key,t.value,\\\"property functions not supported\\\")):h&&!t.valueSpec[\\\"zoom-function\\\"]&&y.push(new r(t.key,t.value,\\\"zoom functions not supported\\\"))),y}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(6),o=n(1);t.exports=function(t){var e=t.value,n=t.valueSpec,a=t.style,s=t.styleSpec,u=t.key,l=t.arrayElementValidator||i;if(\\\"array\\\"!==r(e))return[new o(u,e,\\\"array expected, %s found\\\",r(e))];if(n.length&&e.length!==n.length)return[new o(u,e,\\\"array length %d expected, length %d found\\\",n.length,e.length)];if(n[\\\"min-length\\\"]&&e.length<n[\\\"min-length\\\"])return[new o(u,e,\\\"array length at least %d expected, length %d found\\\",n[\\\"min-length\\\"],e.length)];var c={type:n.value};s.$version<7&&(c.function=n.function),\\\"object\\\"===r(n.value)&&(c=n.value);for(var p=[],f=0;f<e.length;f++)p=p.concat(l({array:e,arrayIndex:f,value:e[f],valueSpec:c,style:a,styleSpec:s,key:u+\\\"[\\\"+f+\\\"]\\\"}));return p}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=r(n);return\\\"number\\\"!==a?[new i(e,n,\\\"number expected, %s found\\\",a)]:\\\"minimum\\\"in o&&n<o.minimum?[new i(e,n,\\\"%s is less than the minimum value %s\\\",n,o.minimum)]:\\\"maximum\\\"in o&&n>o.maximum?[new i(e,n,\\\"%s is greater than the maximum value %s\\\",n,o.maximum)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11),o=n(7),a=n(14),s=n(29),u=n(30),l=n(24);t.exports=function(t){var e=[],n=t.value,c=t.key,p=t.style,f=t.styleSpec;n.type||n.ref||e.push(new r(c,n,'either \\\"type\\\" or \\\"ref\\\" is required'));var h=i(n.type),y=i(n.ref);if(n.id)for(var d=0;d<t.arrayIndex;d++){var m=p.layers[d];i(m.id)===i(n.id)&&e.push(new r(c,n.id,'duplicate layer id \\\"%s\\\", previously used at line %d',n.id,m.id.__line__))}if(\\\"ref\\\"in n){[\\\"type\\\",\\\"source\\\",\\\"source-layer\\\",\\\"filter\\\",\\\"layout\\\"].forEach(function(t){t in n&&e.push(new r(c,n[t],'\\\"%s\\\" is prohibited for ref layers',t))});var v;p.layers.forEach(function(t){t.id==y&&(v=t)}),v?v.ref?e.push(new r(c,n.ref,\\\"ref cannot reference another ref layer\\\")):h=i(v.type):e.push(new r(c,n.ref,'ref layer \\\"%s\\\" not found',y))}else if(\\\"background\\\"!==h)if(n.source){var x=p.sources&&p.sources[n.source];x?\\\"vector\\\"==x.type&&\\\"raster\\\"==h?e.push(new r(c,n.source,'layer \\\"%s\\\" requires a raster source',n.id)):\\\"raster\\\"==x.type&&\\\"raster\\\"!=h?e.push(new r(c,n.source,'layer \\\"%s\\\" requires a vector source',n.id)):\\\"vector\\\"!=x.type||n[\\\"source-layer\\\"]||e.push(new r(c,n,'layer \\\"%s\\\" must specify a \\\"source-layer\\\"',n.id)):e.push(new r(c,n.source,'source \\\"%s\\\" not found',n.source))}else e.push(new r(c,n,'missing required property \\\"source\\\"'));return e=e.concat(o({key:c,value:n,valueSpec:f.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{filter:a,layout:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return u(l({layerType:h},t))}}})},paint:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return s(l({layerType:h},t))}}})}}}))}},function(t,e,n){\\\"use strict\\\";var r=n(6),i=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"paint_\\\"+t.layerType],l=s.match(/^(.*)-transition$/);return l&&u[l[1]]&&u[l[1]].transition?r({key:e,value:a,valueSpec:o.transition,style:n,styleSpec:o}):t.valueSpec||u[s]?r({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}):[new i(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var r=n(6),i=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"layout_\\\"+t.layerType];if(t.valueSpec||u[s]){var l=[];return\\\"symbol\\\"===t.layerType&&(\\\"icon-image\\\"===s&&n&&!n.sprite?l.push(new i(e,a,'use of \\\"icon-image\\\" requires a style \\\"sprite\\\" property')):\\\"text-field\\\"===s&&n&&!n.glyphs&&l.push(new i(e,a,'use of \\\"text-field\\\" requires a style \\\"glyphs\\\" property'))),l.concat(r({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}))}return[new i(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11),o=n(7),a=n(13);t.exports=function(t){var e=t.value,n=t.key,s=t.styleSpec,u=t.style;if(!e.type)return[new r(n,e,'\\\"type\\\" is required')];switch(i(e.type)){case\\\"vector\\\":case\\\"raster\\\":var l=[];if(l=l.concat(o({key:n,value:e,valueSpec:s.source_tile,style:t.style,styleSpec:s})),\\\"url\\\"in e)for(var c in e)[\\\"type\\\",\\\"url\\\",\\\"tileSize\\\"].indexOf(c)<0&&l.push(new r(n+\\\".\\\"+c,e[c],'a source with a \\\"url\\\" property may not include a \\\"%s\\\" property',c));return l;case\\\"geojson\\\":return o({key:n,value:e,valueSpec:s.source_geojson,style:u,styleSpec:s});case\\\"video\\\":return o({key:n,value:e,valueSpec:s.source_video,style:u,styleSpec:s});case\\\"image\\\":return o({key:n,value:e,valueSpec:s.source_image,style:u,styleSpec:s});default:return a({key:n+\\\".type\\\",value:e.type,valueSpec:{values:[\\\"vector\\\",\\\"raster\\\",\\\"geojson\\\",\\\"video\\\",\\\"image\\\"]},style:u,styleSpec:s})}}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.value,n=t.key,o=r(e);return\\\"string\\\"!==o?[new i(n,e,\\\"string expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.actor=t,this.styleLayers=e,n&&(this.loadVectorData=n),this.loading={},this.loaded={}}var i=n(34),o=n(12),a=n(15),s=n(74);t.exports=r,r.prototype={loadTile:function(t,e){function n(t,n){return delete this.loading[r][i],t?e(t):n?(o.data=n.tile,o.parse(o.data,this.styleLayers.getLayerFamilies(),this.actor,n.rawTileData,e),this.loaded[r]=this.loaded[r]||{},void(this.loaded[r][i]=o)):e(null,null)}var r=t.source,i=t.uid;this.loading[r]||(this.loading[r]={});var o=this.loading[r][i]=new s(t);o.abort=this.loadVectorData(t,n.bind(this))},reloadTile:function(t,e){var n=this.loaded[t.source],r=t.uid;if(n&&n[r]){var i=n[r];i.parse(i.data,this.styleLayers.getLayerFamilies(),this.actor,t.rawTileData,e)}},abortTile:function(t){var e=this.loading[t.source],n=t.uid;e&&e[n]&&e[n].abort&&(e[n].abort(),delete e[n])},removeTile:function(t){var e=this.loaded[t.source],n=t.uid;e&&e[n]&&delete e[n]},loadVectorData:function(t,e){function n(t,n){if(t)return e(t);var r=new o.VectorTile(new a(new Uint8Array(n)));e(t,{tile:r,rawTileData:n})}var r=i.getArrayBuffer(t.url,n.bind(this));return function(){r.abort()}},redoPlacement:function(t,e){var n=this.loaded[t.source],r=this.loading[t.source],i=t.uid;if(n&&n[i]){var o=n[i],a=o.redoPlacement(t.angle,t.pitch,t.showCollisionBoxes);a.result&&e(null,a.result,a.transferables)}else r&&r[i]&&(r[i].angle=t.angle)}}},function(t,e,n){\\\"use strict\\\";function r(t){var e=document.createElement(\\\"a\\\");return e.href=t,e.protocol===document.location.protocol&&e.host===document.location.host}e.getJSON=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.setRequestHeader(\\\"Accept\\\",\\\"application/json\\\"),n.onerror=function(t){e(t)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var t;try{t=JSON.parse(n.response)}catch(t){return e(t)}e(null,t)}else e(new Error(n.statusText))},n.send(),n},e.getArrayBuffer=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.responseType=\\\"arraybuffer\\\",n.onerror=function(t){e(t)},n.onload=function(){n.status>=200&&n.status<300&&n.response?e(null,n.response):e(new Error(n.statusText))},n.send(),n},e.getImage=function(t,n){return e.getArrayBuffer(t,function(t,e){if(t)return n(t);var r=new Image;r.onload=function(){n(null,r),(window.URL||window.webkitURL).revokeObjectURL(r.src)};var i=new Blob([new Uint8Array(e)],{type:\\\"image/png\\\"});return r.src=(window.URL||window.webkitURL).createObjectURL(i),r.getData=function(){var t=document.createElement(\\\"canvas\\\"),e=t.getContext(\\\"2d\\\");return t.width=r.width,t.height=r.height,e.drawImage(r,0,0),e.getImageData(0,0,r.width,r.height).data},r})},e.getVideo=function(t,e){var n=document.createElement(\\\"video\\\");n.onloadstart=function(){e(null,n)};for(var i=0;i<t.length;i++){var o=document.createElement(\\\"source\\\");r(t[i])||(n.crossOrigin=\\\"Anonymous\\\"),o.src=t[i],n.appendChild(o)}return n.getData=function(){return n},n}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(i,this,e),this.length=this._features.length}function i(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():5===t?e.extent=n.readVarint():2===t?e._features.push(n.pos):3===t?e._keys.push(n.readString()):4===t&&e._values.push(o(n))}function o(t){for(var e=null,n=t.readVarint()+t.pos;t.pos<n;){var r=t.readVarint()>>3;e=1===r?t.readString():2===r?t.readFloat():3===r?t.readDouble():4===r?t.readVarint64():5===r?t.readVarint():6===r?t.readSVarint():7===r?t.readBoolean():null}return e}var a=n(36);t.exports=r,r.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\\\"feature index out of bounds\\\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new a(this._pbf,e,this.extent,this._keys,this._values)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){this.properties={},this.extent=n,this.type=0,this._pbf=t,this._geometry=-1,this._keys=r,this._values=o,t.readFields(i,this,e)}function i(t,e,n){1==t?e.id=n.readVarint():2==t?o(n,e):3==t?e.type=n.readVarint():4==t&&(e._geometry=n.pos)}function o(t,e){for(var n=t.readVarint()+t.pos;t.pos<n;){var r=e._keys[t.readVarint()],i=e._values[t.readVarint()];e.properties[r]=i}}function a(t){var e=t.length;if(e<=1)return[t];for(var n,r,i=[],o=0;o<e;o++){var a=s(t[o]);0!==a&&(void 0===r&&(r=a<0),r===a<0?(n&&i.push(n),n=[t[o]]):n.push(t[o]))}return n&&i.push(n),i}function s(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n.x-e.x)*(e.y+n.y);return r}var u=n(2);t.exports=r,r.types=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"],r.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,n=t.readVarint()+t.pos,r=1,i=0,o=0,a=0,s=[];t.pos<n;){if(!i){var l=t.readVarint();r=7&l,i=l>>3}if(i--,1===r||2===r)o+=t.readSVarint(),a+=t.readSVarint(),1===r&&(e&&s.push(e),e=[]),e.push(new u(o,a));else{if(7!==r)throw new Error(\\\"unknown command \\\"+r);e&&e.push(e[0].clone())}}return e&&s.push(e),s},r.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,n=1,r=0,i=0,o=0,a=1/0,s=-1/0,u=1/0,l=-1/0;t.pos<e;){if(!r){var c=t.readVarint();n=7&c,r=c>>3}if(r--,1===n||2===n)i+=t.readSVarint(),o+=t.readSVarint(),i<a&&(a=i),i>s&&(s=i),o<u&&(u=o),o>l&&(l=o);else if(7!==n)throw new Error(\\\"unknown command \\\"+n)}return[a,u,s,l]},r.prototype.toGeoJSON=function(t,e,n){function i(t){for(var e=0;e<t.length;e++){var n=t[e],r=180-360*(n.y+c)/u;t[e]=[360*(n.x+l)/u-180,360/Math.PI*Math.atan(Math.exp(r*Math.PI/180))-90]}}var o,s,u=this.extent*Math.pow(2,n),l=this.extent*t,c=this.extent*e,p=this.loadGeometry(),f=r.types[this.type];switch(this.type){case 1:var h=[];for(o=0;o<p.length;o++)h[o]=p[o][0];p=h,i(p);break;case 2:for(o=0;o<p.length;o++)i(p[o]);break;case 3:for(p=a(p),o=0;o<p.length;o++)for(s=0;s<p[o].length;s++)i(p[o][s])}1===p.length?p=p[0]:f=\\\"Multi\\\"+f;var y={type:\\\"Feature\\\",geometry:{type:f,coordinates:p},properties:this.properties};return\\\"id\\\"in this&&(y.id=this.id),y}},function(t,e){var n;n=function(){return this}();try{n=n||Function(\\\"return this\\\")()||(0,eval)(\\\"this\\\")}catch(t){\\\"object\\\"==typeof window&&(n=window)}t.exports=n},function(t,e,n){\\\"use strict\\\";function r(t){return new Function(\\\"f\\\",\\\"var p = (f && f.properties || {}); return \\\"+i(t))}function i(t){if(!t)return\\\"true\\\";var e=t[0];return t.length<=1?\\\"any\\\"===e?\\\"false\\\":\\\"true\\\":\\\"(\\\"+(\\\"==\\\"===e?a(t[1],t[2],\\\"===\\\",!1):\\\"!=\\\"===e?a(t[1],t[2],\\\"!==\\\",!1):\\\"<\\\"===e||\\\">\\\"===e||\\\"<=\\\"===e||\\\">=\\\"===e?a(t[1],t[2],e,!0):\\\"any\\\"===e?s(t.slice(1),\\\"||\\\"):\\\"all\\\"===e?s(t.slice(1),\\\"&&\\\"):\\\"none\\\"===e?c(s(t.slice(1),\\\"||\\\")):\\\"in\\\"===e?u(t[1],t.slice(2)):\\\"!in\\\"===e?c(u(t[1],t.slice(2))):\\\"has\\\"===e?l(t[1]):\\\"!has\\\"===e?c(l([t[1]])):\\\"true\\\")+\\\")\\\"}function o(t){return\\\"$type\\\"===t?\\\"f.type\\\":\\\"$id\\\"===t?\\\"f.id\\\":\\\"p[\\\"+JSON.stringify(t)+\\\"]\\\"}function a(t,e,n,r){var i=o(t),a=\\\"$type\\\"===t?f.indexOf(e):JSON.stringify(e);return(r?\\\"typeof \\\"+i+\\\"=== typeof \\\"+a+\\\"&&\\\":\\\"\\\")+i+n+a}function s(t,e){return t.map(i).join(e)}function u(t,e){\\\"$type\\\"===t&&(e=e.map(function(t){return f.indexOf(t)}));var n=JSON.stringify(e.sort(p)),r=o(t);return e.length<=200?n+\\\".indexOf(\\\"+r+\\\") !== -1\\\":\\\"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1;    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }(\\\"+r+\\\", \\\"+n+\\\",0,\\\"+(e.length-1)+\\\")\\\"}function l(t){return JSON.stringify(t)+\\\" in p\\\"}function c(t){return\\\"!(\\\"+t+\\\")\\\"}function p(t,e){return t<e?-1:t>e?1:0}t.exports=r;var f=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.area-t.area}var i=n(83),o=n(0).calculateSignedArea;t.exports=function(t,e){var n=t.length;if(n<=1)return[t];for(var a,s,u=[],l=0;l<n;l++){var c=o(t[l]);0!==c&&(t[l].area=Math.abs(c),void 0===s&&(s=c<0),s===c<0?(a&&u.push(a),a=[t[l]]):a.push(t[l]))}if(a&&u.push(a),e>1)for(var p=0;p<u.length;p++)u[p].length<=e||(i(u[p],e,1,u[p].length-1,r),u[p]=u[p].slice(0,e));return u}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.x=t,this.y=e,this.angle=n,void 0!==r&&(this.segment=r)}var i=n(2);t.exports=r,r.prototype=Object.create(i.prototype),r.prototype.clone=function(){return new r(this.x,this.y,this.angle,this.segment)}},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.replace(/{([^{}]+)}/g,function(e,n){return n in t?t[n]:\\\"\\\"})}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a,s,u,l){this.anchorPoint=t,this.tl=e,this.tr=n,this.bl=r,this.br=i,this.tex=o,this.anchorAngle=a,this.glyphAngle=s,this.minScale=u,this.maxScale=l}function i(t,e,n,i,o,a,l,c,p){var f,h,y,d,m=e.image.rect,v=o.layout,x=e.left-1,g=x+m.w/e.image.pixelRatio,b=e.top-1,w=b+m.h/e.image.pixelRatio;if(\\\"none\\\"!==v[\\\"icon-text-fit\\\"]&&l){var S=g-x,_=w-b,A=v[\\\"text-size\\\"]/24,M=l.left*A,P=l.right*A,z=l.top*A,I=l.bottom*A,T=P-M,V=I-z,k=v[\\\"icon-text-fit-padding\\\"][0],E=v[\\\"icon-text-fit-padding\\\"][1],F=v[\\\"icon-text-fit-padding\\\"][2],j=v[\\\"icon-text-fit-padding\\\"][3],L=\\\"width\\\"===v[\\\"icon-text-fit\\\"]?.5*(V-_):0,O=\\\"height\\\"===v[\\\"icon-text-fit\\\"]?.5*(T-S):0,B=\\\"width\\\"===v[\\\"icon-text-fit\\\"]||\\\"both\\\"===v[\\\"icon-text-fit\\\"]?T:S,C=\\\"height\\\"===v[\\\"icon-text-fit\\\"]||\\\"both\\\"===v[\\\"icon-text-fit\\\"]?V:_;f=new s(M+O-j,z+L-k),h=new s(M+O+E+B,z+L-k),y=new s(M+O+E+B,z+L+F+C),d=new s(M+O-j,z+L+F+C)}else f=new s(x,b),h=new s(g,b),y=new s(g,w),d=new s(x,w);var q=o.getLayoutValue(\\\"icon-rotate\\\",c,p)*Math.PI/180;if(a){var D=i[t.segment];if(t.y===D.y&&t.x===D.x&&t.segment+1<i.length){var N=i[t.segment+1];q+=Math.atan2(t.y-N.y,t.x-N.x)+Math.PI}else q+=Math.atan2(t.y-D.y,t.x-D.x)}if(q){var U=Math.sin(q),Z=Math.cos(q),G=[Z,-U,U,Z];f=f.matMult(G),h=h.matMult(G),d=d.matMult(G),y=y.matMult(G)}return[new r(new s(t.x,t.y),f,h,d,y,e.image.rect,0,0,u,1/0)]}function o(t,e,n,i,o,l){for(var c=o.layout[\\\"text-rotate\\\"]*Math.PI/180,p=o.layout[\\\"text-keep-upright\\\"],f=e.positionedGlyphs,h=[],y=0;y<f.length;y++){var d=f[y],m=d.glyph,v=m.rect;if(v){var x,g=(d.x+m.advance/2)*n,b=u;l?(x=[],b=a(x,t,g,i,t.segment,!0),p&&(b=Math.min(b,a(x,t,g,i,t.segment,!1)))):x=[{anchorPoint:new s(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:u}];for(var w=d.x+m.left,S=d.y-m.top,_=w+v.w,A=S+v.h,M=new s(w,S),P=new s(_,S),z=new s(w,A),I=new s(_,A),T=0;T<x.length;T++){var V=x[T],k=M,E=P,F=z,j=I;if(c){var L=Math.sin(c),O=Math.cos(c),B=[O,-L,L,O];k=k.matMult(B),E=E.matMult(B),F=F.matMult(B),j=j.matMult(B)}var C=Math.max(V.minScale,b),q=(t.angle+V.offset+2*Math.PI)%(2*Math.PI),D=(V.angle+V.offset+2*Math.PI)%(2*Math.PI);h.push(new r(V.anchorPoint,k,E,F,j,v,q,D,C,V.maxScale))}}}return h}function a(t,e,n,r,i,o){var a=!o;n<0&&(o=!o),o&&i++;var l=new s(e.x,e.y),c=r[i],p=1/0;n=Math.abs(n);for(var f=u;;){var h=l.dist(c),y=n/h,d=Math.atan2(c.y-l.y,c.x-l.x);if(o||(d+=Math.PI),t.push({anchorPoint:l,offset:a?Math.PI:0,minScale:y,maxScale:p,angle:(d+2*Math.PI)%(2*Math.PI)}),y<=f)break;for(l=c;l.equals(c);)if(i+=o?1:-1,!(c=r[i]))return y;var m=c.sub(l)._unit();l=l.sub(m._mult(h)),p=y}return f}var s=n(2);t.exports={getIconQuads:i,getGlyphQuads:o,SymbolQuad:r};var u=.5},function(t,e,n){\\\"use strict\\\";function r(t,e,n){for(var r=0;r<t.length;r++)for(var i=t[r],o=0;o<e.length;o++)for(var a=e[o],s=0;s<a.length;s++){var u=a[s];if(f(i,u))return!0;if(l(u,i,n))return!0}return!1}function i(t,e){if(1===t.length&&1===t[0].length)return p(e,t[0][0]);for(var n=0;n<e.length;n++)for(var r=e[n],i=0;i<r.length;i++)if(p(t,r[i]))return!0;for(var o=0;o<t.length;o++){for(var a=t[o],u=0;u<a.length;u++)if(p(e,a[u]))return!0;for(var l=0;l<e.length;l++)if(s(a,e[l]))return!0}return!1}function o(t,e,n){for(var r=0;r<e.length;r++)for(var i=e[r],o=0;o<t.length;o++){var s=t[o];if(s.length>=3)for(var u=0;u<i.length;u++)if(f(s,i[u]))return!0;if(a(s,i,n))return!0}return!1}function a(t,e,n){if(t.length>1){if(s(t,e))return!0;for(var r=0;r<e.length;r++)if(l(e[r],t,n))return!0}for(var i=0;i<t.length;i++)if(l(t[i],e,n))return!0;return!1}function s(t,e){for(var n=0;n<t.length-1;n++)for(var r=t[n],i=t[n+1],o=0;o<e.length-1;o++){var a=e[o],s=e[o+1];if(u(r,i,a,s))return!0}return!1}function u(t,e,n,r){return h(t,n,r)!==h(e,n,r)&&h(t,e,n)!==h(t,e,r)}function l(t,e,n){var r=n*n;if(1===e.length)return t.distSqr(e[0])<r;for(var i=1;i<e.length;i++){if(c(t,e[i-1],e[i])<r)return!0}return!1}function c(t,e,n){var r=e.distSqr(n);if(0===r)return t.distSqr(e);var i=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/r;return i<0?t.distSqr(e):i>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(i)._add(e))}function p(t,e){for(var n,r,i,o=!1,a=0;a<t.length;a++){n=t[a];for(var s=0,u=n.length-1;s<n.length;u=s++)r=n[s],i=n[u],r.y>e.y!=i.y>e.y&&e.x<(i.x-r.x)*(e.y-r.y)/(i.y-r.y)+r.x&&(o=!o)}return o}function f(t,e){for(var n=!1,r=0,i=t.length-1;r<t.length;i=r++){var o=t[r],a=t[i];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}var h=n(0).isCounterClockwise;t.exports={multiPolygonIntersectsBufferedMultiPoint:r,multiPolygonIntersectsMultiPolygon:i,multiPolygonIntersectsBufferedMultiLine:o,distToSegmentSquared:c}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){var r=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var o=new Int32Array(this.arrayBuffer);t=o[0],e=o[1],n=o[2],this.d=e+2*n;for(var a=0;a<this.d*this.d;a++){var s=o[i+a],u=o[i+a+1];r.push(s===u?null:o.subarray(s,u))}var l=o[i+r.length],c=o[i+r.length+1];this.keys=o.subarray(l,c),this.bboxes=o.subarray(c),this.insert=this._insertReadonly}else{this.d=e+2*n;for(var p=0;p<this.d*this.d;p++)r.push([]);this.keys=[],this.bboxes=[]}this.n=e,this.extent=t,this.padding=n,this.scale=e/t,this.uid=0;var f=n/e*t;this.min=-f,this.max=t+f}t.exports=r;var i=3;r.prototype.insert=function(t,e,n,r,i){this._forEachCell(e,n,r,i,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(n),this.bboxes.push(r),this.bboxes.push(i)},r.prototype._insertReadonly=function(){throw\\\"Cannot insert into a GridIndex created from an ArrayBuffer.\\\"},r.prototype._insertCell=function(t,e,n,r,i,o){this.cells[i].push(o)},r.prototype.query=function(t,e,n,r,i){var o=this.min,a=this.max;if(t<=o&&e<=o&&a<=n&&a<=r&&!i)return Array.prototype.slice.call(this.keys);var s=[],u={};return this._forEachCell(t,e,n,r,this._queryCell,s,u,i),s},r.prototype._queryCell=function(t,e,n,r,i,o,a,s){var u=this.cells[i];if(null!==u)for(var l=this.keys,c=this.bboxes,p=0;p<u.length;p++){var f=u[p];if(void 0===a[f]){var h=4*f;(s?s(c[h+0],c[h+1],c[h+2],c[h+3]):t<=c[h+2]&&e<=c[h+3]&&n>=c[h+0]&&r>=c[h+1])?(a[f]=!0,o.push(l[f])):a[f]=!1}}},r.prototype._forEachCell=function(t,e,n,r,i,o,a,s){for(var u=this._convertToCellCoord(t),l=this._convertToCellCoord(e),c=this._convertToCellCoord(n),p=this._convertToCellCoord(r),f=u;f<=c;f++)for(var h=l;h<=p;h++){var y=this.d*h+f;if((!s||s(this._convertFromCellCoord(f),this._convertFromCellCoord(h),this._convertFromCellCoord(f+1),this._convertFromCellCoord(h+1)))&&i.call(this,t,e,n,r,y,o,a,s))return}},r.prototype._convertFromCellCoord=function(t){return(t-this.padding)/this.scale},r.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},r.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=i+this.cells.length+1+1,n=0,r=0;r<this.cells.length;r++)n+=this.cells[r].length;var o=new Int32Array(e+n+this.keys.length+this.bboxes.length);o[0]=this.extent,o[1]=this.n,o[2]=this.padding;for(var a=e,s=0;s<t.length;s++){var u=t[s];o[i+s]=a,o.set(u,a),a+=u.length}return o[i+t.length]=a,o.set(this.keys,a),a+=this.keys.length,o[i+t.length+1]=a,o.set(this.bboxes,a),a+=this.bboxes.length,o.buffer}},function(t,e,n){\\\"use strict\\\";function r(t){this._stringToNumber={},this._numberToString=[];for(var e=0;e<t.length;e++){var n=t[e];this._stringToNumber[n]=e,this._numberToString[e]=n}}var i=n(9);t.exports=r,r.prototype.encode=function(t){return i(t in this._stringToNumber),this._stringToNumber[t]},r.prototype.decode=function(t){return i(t<this._numberToString.length),this._numberToString[t]}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,a,u,l,c){if(n/=e,r/=e,l>=n&&c<=r)return t;if(l>r||c<n)return null;for(var p=[],f=0;f<t.length;f++){var h,y,d=t[f],m=d.geometry,v=d.type;if(h=d.min[a],y=d.max[a],h>=n&&y<=r)p.push(d);else if(!(h>r||y<n)){var x=1===v?i(m,n,r,a):o(m,n,r,a,u,3===v);x.length&&p.push(s(d.tags,v,x,d.id))}}return p.length?p:null}function i(t,e,n,r){for(var i=[],o=0;o<t.length;o++){var a=t[o],s=a[r];s>=e&&s<=n&&i.push(a)}return i}function o(t,e,n,r,i,o){for(var s=[],u=0;u<t.length;u++){var l,c,p,f=0,h=0,y=null,d=t[u],m=d.area,v=d.dist,x=d.outer,g=d.length,b=[];for(c=0;c<g-1;c++)l=y||d[c],y=d[c+1],f=h||l[r],h=y[r],f<e?h>n?(b.push(i(l,y,e),i(l,y,n)),o||(b=a(s,b,m,v,x))):h>=e&&b.push(i(l,y,e)):f>n?h<e?(b.push(i(l,y,n),i(l,y,e)),o||(b=a(s,b,m,v,x))):h<=n&&b.push(i(l,y,n)):(b.push(l),h<e?(b.push(i(l,y,e)),o||(b=a(s,b,m,v,x))):h>n&&(b.push(i(l,y,n)),o||(b=a(s,b,m,v,x))));l=d[g-1],f=l[r],f>=e&&f<=n&&b.push(l),p=b[b.length-1],o&&p&&(b[0][0]!==p[0]||b[0][1]!==p[1])&&b.push(b[0]),a(s,b,m,v,x)}return s}function a(t,e,n,r,i){return e.length&&(e.area=n,e.dist=r,void 0!==i&&(e.outer=i),t.push(e)),[]}t.exports=r;var s=n(16)},function(t,e,n){\\\"use strict\\\";function r(t){this.self=t,this.actor=new o(t,this),this.layers={},this.layerFamilies={},this.workerSourceTypes={vector:u,geojson:l},this.workerSources={},this.self.registerWorkerSource=function(t,e){if(this.workerSourceTypes[t])throw new Error('Worker source with name \\\"'+t+'\\\" already registered.');this.workerSourceTypes[t]=e}.bind(this)}function i(t){var e={};for(var n in t){var r=t[n],i=r.ref||r.id,o=t[i];o.layout&&\\\"none\\\"===o.layout.visibility||(e[i]=e[i]||[],n===i?e[i].unshift(r):e[i].push(r))}return e}var o=n(48),a=n(5),s=n(0),u=n(33),l=n(101);t.exports=function(t){return new r(t)},s.extend(r.prototype,{\\\"set layers\\\":function(t,e){function n(t){var e=a.create(t,t.ref&&r[t.ref]);e.updatePaintTransitions({},{transition:!1}),r[e.id]=e}for(var r=this.layers[t]={},o=[],s=0;s<e.length;s++){var u=e[s];\\\"fill\\\"!==u.type&&\\\"line\\\"!==u.type&&\\\"circle\\\"!==u.type&&\\\"symbol\\\"!==u.type||(u.ref?o.push(s):n(u))}for(var l=0;l<o.length;l++)n(e[o[l]]);this.layerFamilies[t]=i(this.layers[t])},\\\"update layers\\\":function(t,e){function n(t){var e=s[t.ref];s[t.id]?s[t.id].set(t,e):s[t.id]=a.create(t,e),s[t.id].updatePaintTransitions({},{transition:!1})}var r,o,s=this.layers[t];for(r in e)o=e[r],o.ref&&n(o);for(r in e)o=e[r],o.ref||n(o);this.layerFamilies[t]=i(this.layers[t])},\\\"load tile\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).loadTile(e,n)},\\\"reload tile\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).reloadTile(e,n)},\\\"abort tile\\\":function(t,e){var n=e.type||\\\"vector\\\";this.getWorkerSource(t,n).abortTile(e)},\\\"remove tile\\\":function(t,e){var n=e.type||\\\"vector\\\";this.getWorkerSource(t,n).removeTile(e)},\\\"redo placement\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).redoPlacement(e,n)},\\\"load worker source\\\":function(t,e,n){try{this.self.importScripts(e.url),n()}catch(t){n(t)}},getWorkerSource:function(t,e){if(this.workerSources[t]||(this.workerSources[t]={}),!this.workerSources[t][e]){var n={getLayers:function(){return this.layers[t]}.bind(this),getLayerFamilies:function(){return this.layerFamilies[t]}.bind(this)};this.workerSources[t][e]=new this.workerSourceTypes[e](this.actor,n)}return this.workerSources[t][e]}}),t.exports(self)},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.target=t,this.parent=e,this.mapId=n,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener(\\\"message\\\",this.receive,!1)}t.exports=r,r.prototype.receive=function(t){function e(t,e,n){this.postMessage({mapId:this.mapId,type:\\\"<response>\\\",id:String(i),error:t?String(t):null,data:e},n)}var n,r=t.data,i=r.id;if(\\\"<response>\\\"===r.type)n=this.callbacks[r.id],delete this.callbacks[r.id],n&&n(r.error||null,r.data);else if(void 0!==r.id&&this.parent[r.type])this.parent[r.type](r.mapId,r.data,e.bind(this));else if(void 0!==r.id&&this.parent.getWorkerSource){var o=r.type.split(\\\".\\\"),a=this.parent.getWorkerSource(r.mapId,o[0]);a[o[1]](r.data,e.bind(this))}else this.parent[r.type](r.data)},r.prototype.send=function(t,e,n,r){var i=n?this.mapId+\\\":\\\"+this.callbackID++:null;n&&(this.callbacks[i]=n),this.postMessage({mapId:this.mapId,type:t,id:String(i),data:e},r)},r.prototype.postMessage=function(t,e){this.target.postMessage(t,e)}},function(t,e){function n(t,e,n,r){this.cx=3*t,this.bx=3*(n-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(r-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=n,this.p2y=r}t.exports=n,n.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){void 0===e&&(e=1e-6);var n,r,i,o,a;for(i=t,a=0;a<8;a++){if(o=this.sampleCurveX(i)-t,Math.abs(o)<e)return i;var s=this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=o/s}if(n=0,r=1,(i=t)<n)return n;if(i>r)return r;for(;n<r;){if(o=this.sampleCurveX(i),Math.abs(o-t)<e)return i;t>o?n=i:r=i,i=.5*(r-n)+n}return i},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.column=t,this.row=e,this.zoom=n}t.exports=r,r.prototype={clone:function(){return new r(this.column,this.row,this.zoom)},zoomTo:function(t){return this.clone()._zoomTo(t)},sub:function(t){return this.clone()._sub(t)},_zoomTo:function(t){var e=Math.pow(2,t-this.zoom);return this.column*=e,this.row*=e,this.zoom=t,this},_sub:function(t){return t=t.zoomTo(this.zoom),this.column-=t.column,this.row-=t.row,this}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.declaration=e,this.startTime=this.endTime=(new Date).getTime(),\\\"piecewise-constant\\\"===t.function&&t.transition?this.interp=i:this.interp=a[t.type],this.oldTransition=n,this.duration=r.duration||0,this.delay=r.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=o.easeCubicInOut),n&&n.endTime<=this.startTime&&delete n.oldTransition}function i(t,e,n){return void 0===(t&&t.to)||void 0===(e&&e.to)?void 0:{from:t.to,fromScale:t.toScale,to:e.to,toScale:e.toScale,t:n}}var o=n(0),a=n(17);t.exports=r,r.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},r.prototype.calculate=function(t,e){var n=this.declaration.calculate(o.extend({},t,{duration:this.duration}),e);if(this.instant())return n;var r=t.time||Date.now();if(r<this.endTime){var i=this.oldTransition.calculate(o.extend({},t,{time:this.startTime}),e),a=this.ease((r-this.startTime-this.delay)/this.duration);n=this.interp(i,n,a)}return n}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.value=s.clone(e),this.isFunction=o.isFunctionDefinition(e),this.json=JSON.stringify(this.value);var n=\\\"color\\\"===t.type&&this.value?a(this.value):e;if(this.calculate=o[t.function||\\\"piecewise-constant\\\"](n),this.isFeatureConstant=this.calculate.isFeatureConstant,this.isZoomConstant=this.calculate.isZoomConstant,\\\"piecewise-constant\\\"===t.function&&t.transition&&(this.calculate=i(this.calculate)),!this.isFeatureConstant&&!this.isZoomConstant){this.stopZoomLevels=[];for(var r=[],u=this.value.stops,l=0;l<this.value.stops.length;l++){var c=u[l][0].zoom;this.stopZoomLevels.indexOf(c)<0&&(this.stopZoomLevels.push(c),r.push([c,r.length]))}this.calculateInterpolationT=o.interpolated({stops:r,base:e.base})}}function i(t){return function(e,n){var r,i,o,a=e.zoom,s=e.zoomHistory,u=e.duration,l=a%1,c=Math.min((Date.now()-s.lastIntegerZoomTime)/u,1),p=1;return a>s.lastIntegerZoom?(r=l+(1-l)*c,p*=2,i=t({zoom:a-1},n),o=t({zoom:a},n)):(r=1-(1-c)*l,o=t({zoom:a},n),i=t({zoom:a+1},n),p/=2),void 0===i||void 0===o?void 0:{from:i,fromScale:p,to:o,toScale:1,t:r}}}var o=n(18),a=n(19),s=n(0);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){var n;if(p(t)){var u,l=t.stops&&\\\"object\\\"==typeof t.stops[0][0],c=l||void 0!==t.property,f=l||!c,h=t.type||e||\\\"exponential\\\";if(\\\"exponential\\\"===h)u=a;else if(\\\"interval\\\"===h)u=o;else if(\\\"categorical\\\"===h)u=i;else{if(\\\"identity\\\"!==h)throw new Error('Unknown function type \\\"'+h+'\\\"');u=s}if(l){for(var y={},d=[],m=0;m<t.stops.length;m++){var v=t.stops[m];void 0===y[v[0].zoom]&&(y[v[0].zoom]={zoom:v[0].zoom,type:t.type,property:t.property,stops:[]}),y[v[0].zoom].stops.push([v[0].value,v[1]])}for(var x in y)d.push([y[x].zoom,r(y[x])]);n=function(e,n){return a({stops:d,base:t.base},e)(e,n)},n.isFeatureConstant=!1,n.isZoomConstant=!1}else f?(n=function(e){return u(t,e)},n.isFeatureConstant=!0,n.isZoomConstant=!1):(n=function(e,n){return u(t,n[t.property])},n.isFeatureConstant=!1,n.isZoomConstant=!0)}else n=function(){return t},n.isFeatureConstant=!0,n.isZoomConstant=!0;return n}function i(t,e){for(var n=0;n<t.stops.length;n++)if(e===t.stops[n][0])return t.stops[n][1];return t.stops[0][1]}function o(t,e){for(var n=0;n<t.stops.length&&!(e<t.stops[n][0]);n++);return t.stops[Math.max(n-1,0)][1]}function a(t,e){for(var n=void 0!==t.base?t.base:1,r=0;;){if(r>=t.stops.length)break;if(e<=t.stops[r][0])break;r++}return 0===r?t.stops[r][1]:r===t.stops.length?t.stops[r-1][1]:u(e,n,t.stops[r-1][0],t.stops[r][0],t.stops[r-1][1],t.stops[r][1])}function s(t,e){return e}function u(t,e,n,r,i,o){return\\\"function\\\"==typeof i?function(){var a=i.apply(void 0,arguments),s=o.apply(void 0,arguments);return u(t,e,n,r,a,s)}:i.length?c(t,e,n,r,i,o):l(t,e,n,r,i,o)}function l(t,e,n,r,i,o){var a,s=r-n,u=t-n;return a=1===e?u/s:(Math.pow(e,u)-1)/(Math.pow(e,s)-1),i*(1-a)+o*a}function c(t,e,n,r,i,o){for(var a=[],s=0;s<i.length;s++)a[s]=l(t,e,n,r,i[s],o[s]);return a}function p(t){return\\\"object\\\"==typeof t&&(t.stops||\\\"identity\\\"===t.type)}t.exports.isFunctionDefinition=p,t.exports.interpolated=function(t){return r(t,\\\"exponential\\\")},t.exports[\\\"piecewise-constant\\\"]=function(t){return r(t,\\\"interval\\\")}},function(t,e,n){\\\"use strict\\\";t.exports=n(21)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8]},name:{type:\\\"string\\\"},metadata:{type:\\\"*\\\"},center:{type:\\\"array\\\",value:\\\"number\\\"},zoom:{type:\\\"number\\\"},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\"},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\"},sources:{required:!0,type:\\\"sources\\\"},sprite:{type:\\\"string\\\"},glyphs:{type:\\\"string\\\"},transition:{type:\\\"transition\\\"},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\"}},sources:{\\\"*\\\":{type:\\\"source\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:[\\\"vector\\\",\\\"raster\\\"]},url:{type:\\\"string\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\"},minzoom:{type:\\\"number\\\",default:0},maxzoom:{type:\\\"number\\\",default:22},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\"},\\\"*\\\":{type:\\\"*\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:[\\\"geojson\\\"]},data:{type:\\\"*\\\"},maxzoom:{type:\\\"number\\\",default:14},buffer:{type:\\\"number\\\",default:64},tolerance:{type:\\\"number\\\",default:3},cluster:{type:\\\"boolean\\\",default:!1},clusterRadius:{type:\\\"number\\\",default:400},clusterMaxZoom:{type:\\\"number\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:[\\\"video\\\"]},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:[\\\"image\\\"]},url:{required:!0,type:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},layer:{id:{type:\\\"string\\\",required:!0},type:{type:\\\"enum\\\",values:[\\\"fill\\\",\\\"line\\\",\\\"symbol\\\",\\\"circle\\\",\\\"raster\\\",\\\"background\\\"]},metadata:{type:\\\"*\\\"},ref:{type:\\\"string\\\"},source:{type:\\\"string\\\"},\\\"source-layer\\\":{type:\\\"string\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:22},maxzoom:{type:\\\"number\\\",minimum:0,maximum:22},interactive:{type:\\\"boolean\\\",default:!1},filter:{type:\\\"filter\\\"},layout:{type:\\\"layout\\\"},paint:{type:\\\"paint\\\"},\\\"paint.*\\\":{type:\\\"paint\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_fill:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_circle:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"butt\\\",\\\"round\\\",\\\"square\\\"],default:\\\"butt\\\"},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"bevel\\\",\\\"round\\\",\\\"miter\\\"],default:\\\"miter\\\"},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[{\\\"line-join\\\":\\\"miter\\\"}]},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[{\\\"line-join\\\":\\\"round\\\"}]},visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"point\\\",\\\"line\\\"],default:\\\"point\\\"},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"pixels\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"viewport\\\",requires:[\\\"icon-image\\\"]},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,values:[\\\"none\\\",\\\"both\\\",\\\"width\\\",\\\"height\\\"],default:\\\"none\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\",\\\"icon-text-fit\\\",\\\"text-field\\\"]},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,tokens:!0},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",requires:[\\\"icon-image\\\"]},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],requires:[\\\"text-field\\\"]},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"viewport\\\",requires:[\\\"text-field\\\"]},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:\\\"\\\",tokens:!0},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],requires:[\\\"text-field\\\"]},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"left\\\",\\\"center\\\",\\\"right\\\"],default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"center\\\",\\\"left\\\",\\\"right\\\",\\\"top\\\",\\\"bottom\\\",\\\"top-left\\\",\\\"top-right\\\",\\\"bottom-left\\\",\\\"bottom-right\\\"],default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!0,requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"none\\\",\\\"uppercase\\\",\\\"lowercase\\\"],default:\\\"none\\\",requires:[\\\"text-field\\\"]},\\\"text-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"]},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\",\\\"icon-image\\\"]},visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_raster:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},filter:{type:\\\"array\\\",value:\\\"*\\\"},filter_operator:{type:\\\"enum\\\",values:[\\\"==\\\",\\\"!=\\\",\\\">\\\",\\\">=\\\",\\\"<\\\",\\\"<=\\\",\\\"in\\\",\\\"!in\\\",\\\"all\\\",\\\"any\\\",\\\"none\\\",\\\"has\\\",\\\"!has\\\"]},geometry_type:{type:\\\"enum\\\",values:[\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},color_operation:{type:\\\"enum\\\",values:[\\\"lighten\\\",\\\"saturate\\\",\\\"spin\\\",\\\"fade\\\",\\\"mix\\\"]},function:{stops:{type:\\\"array\\\",required:!0,value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0},property:{type:\\\"string\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:[\\\"exponential\\\",\\\"interval\\\",\\\"categorical\\\"],default:\\\"exponential\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!0},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}]},\\\"fill-outline-color\\\":{type:\\\"color\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}]},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"fill-translate\\\"]},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"line-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"line-translate\\\"]},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-offset\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"circle-translate\\\"]},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\"}},paint_symbol:{\\\"icon-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"]},\\\"text-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"]}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\"},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:0,minimum:0,maximum:1,transition:!0},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"raster-saturation\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-contrast\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\"}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}]},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\"}}}},function(t,e,n){\\\"use strict\\\";t.exports=n(57),t.exports.emitErrors=function(t,e){if(e&&e.length){for(var n=0;n<e.length;n++)t.fire(\\\"error\\\",{error:new Error(e[n].message)});return!0}return!1},t.exports.throwErrors=function(t,e){if(e)for(var n=0;n<e.length;n++)throw new Error(e[n].message)}},function(t,e,n){\\\"use strict\\\";function r(t,e){e=e||u;var n=[];return n=n.concat(s({key:\\\"\\\",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:l}})),e.$version>7&&t.constants&&(n=n.concat(a({key:\\\"constants\\\",value:t.constants,style:t,styleSpec:e}))),i(n)}function i(t){return[].concat(t).sort(function(t,e){return t.line-e.line})}function o(t){return function(){return i(t.apply(this,arguments))}}var a=n(22),s=n(6),u=n(21),l=n(63);r.source=o(n(31)),r.layer=o(n(28)),r.filter=o(n(14)),r.paintProperty=o(n(29)),r.layoutProperty=o(n(30)),t.exports=r},function(t,e){function n(){throw new Error(\\\"setTimeout has not been defined\\\")}function r(){throw new Error(\\\"clearTimeout has not been defined\\\")}function i(t){if(c===setTimeout)return setTimeout(t,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function o(t){if(p===clearTimeout)return clearTimeout(t);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(t);try{return p(t)}catch(e){try{return p.call(null,t)}catch(e){return p.call(this,t)}}}function a(){d&&h&&(d=!1,h.length?y=h.concat(y):m=-1,y.length&&s())}function s(){if(!d){var t=i(a);d=!0;for(var e=y.length;e;){for(h=y,y=[];++m<e;)h&&h[m].run();m=-1,e=y.length}h=null,d=!1,o(t)}}function u(t,e){this.fun=t,this.array=e}function l(){}var c,p,f=t.exports={};!function(){try{c=\\\"function\\\"==typeof setTimeout?setTimeout:n}catch(t){c=n}try{p=\\\"function\\\"==typeof clearTimeout?clearTimeout:r}catch(t){p=r}}();var h,y=[],d=!1,m=-1;f.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];y.push(new u(t,e)),1!==y.length||d||i(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\\\"browser\\\",f.browser=!0,f.env={},f.argv=[],f.version=\\\"\\\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(t){return[]},f.binding=function(t){throw new Error(\\\"process.binding is not supported\\\")},f.cwd=function(){return\\\"/\\\"},f.chdir=function(t){throw new Error(\\\"process.chdir is not supported\\\")},f.umask=function(){return 0}},function(t,e){t.exports=function(t){return t&&\\\"object\\\"==typeof t&&\\\"function\\\"==typeof t.copy&&\\\"function\\\"==typeof t.fill&&\\\"function\\\"==typeof t.readUInt8}},function(t,e){\\\"function\\\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.value,n=t.key,o=r(e);return\\\"boolean\\\"!==o?[new i(n,e,\\\"boolean expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(20).parseCSSColor;t.exports=function(t){var e=t.key,n=t.value,a=i(n);return\\\"string\\\"!==a?[new r(e,n,\\\"color expected, %s found\\\",a)]:null===o(n)?[new r(e,n,'color expected, \\\"%s\\\" found',n)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(32);t.exports=function(t){var e=t.value,n=t.key,o=i(t);return o.length?o:(-1===e.indexOf(\\\"{fontstack}\\\")&&o.push(new r(n,e,'\\\"glyphs\\\" url must include a \\\"{fontstack}\\\" token')),-1===e.indexOf(\\\"{range}\\\")&&o.push(new r(n,e,'\\\"glyphs\\\" url must include a \\\"{range}\\\" token')),o)}},function(t,e,n){\\\"use strict\\\";var r=n(0),i={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var n=this._events[t].indexOf(e);n>=0&&this._events[t].splice(n,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var n=function(r){this.off(t,n),e.call(this,r)}.bind(this);return this.on(t,n),this},fire:function(t,e){if(!this.listens(t))return r.endsWith(t,\\\"error\\\")&&console.error(e&&e.error||e||\\\"Empty error event\\\"),this;e=r.extend({},e),r.extend(e,{type:t,target:this});for(var n=this._events[t].slice(),i=0;i<n.length;i++)n[i].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};t.exports=i},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);r.prototype=i.inherit(o,{getPaintValue:function(t,e,n){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValue.call(this,\\\"fill-color\\\",e,n):o.prototype.getPaintValue.call(this,t,e,n)},getPaintValueStopZoomLevels:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValueStopZoomLevels.call(this,\\\"fill-color\\\"):o.prototype.getPaintValueStopZoomLevels.call(this,arguments)},getPaintInterpolationT:function(t,e){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintInterpolationT.call(this,\\\"fill-color\\\",e):o.prototype.getPaintInterpolationT.call(this,t,e)},isPaintValueFeatureConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueFeatureConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueFeatureConstant.call(this,t)},isPaintValueZoomConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueZoomConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueZoomConstant.call(this,t)},isHidden:function(t){if(this.minzoom&&t<this.minzoom)return!0;if(this.maxzoom&&t>=this.maxzoom)return!0;if(\\\"none\\\"===this.layout.visibility)return!0;var e=this.isPaintValueFeatureConstant(\\\"fill-opacity\\\")&&0===this.paint[\\\"fill-opacity\\\"]||this.isPaintValueFeatureConstant(\\\"fill-color\\\")&&0===this.paint[\\\"fill-color\\\"][3],n=this.isPaintValueFeatureConstant(\\\"fill-outline-color\\\")&&0===this.paint[\\\"fill-outline-color\\\"][3];return e&&n}}),t.exports=r},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{getPaintValue:function(t,e,n){var r=o.prototype.getPaintValue.apply(this,arguments);if(r&&\\\"line-dasharray\\\"===t){var i=Math.floor(e.zoom);this._flooredZoom!==i&&(this._flooredZoom=i,this._flooredLineWidth=this.getPaintValue(\\\"line-width\\\",e,n)),r.fromScale*=this._flooredLineWidth,r.toScale*=this._flooredLineWidth}return r}})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{isHidden:function(){if(o.prototype.isHidden.apply(this,arguments))return!0;var t=0===this.paint[\\\"text-opacity\\\"]||!this.layout[\\\"text-field\\\"],e=0===this.paint[\\\"icon-opacity\\\"]||!this.layout[\\\"icon-image\\\"];return!(!t||!e)},getLayoutValue:function(t,e,n){return(\\\"text-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"text-rotation-alignment\\\"))&&(\\\"icon-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"icon-rotation-alignment\\\"))?\\\"text-pitch-alignment\\\"!==t||this.getLayoutProperty(\\\"text-pitch-alignment\\\")?o.prototype.getLayoutValue.apply(this,arguments):this.getLayoutValue(\\\"text-rotation-alignment\\\"):\\\"map\\\"}})},function(t,e,n){\\\"use strict\\\";function r(t,e){this.layers=t.readFields(i,{},e)}function i(t,e,n){if(3===t){var r=new o(n,n.readVarint()+n.pos);r.length&&(e[r.name]=r)}}var o=n(35);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t){var e;t&&t.length&&(e=t,t=e.length);var n=new Uint8Array(t||0);return e&&n.set(e),n.readUInt32LE=o.readUInt32LE,n.writeUInt32LE=o.writeUInt32LE,n.readInt32LE=o.readInt32LE,n.writeInt32LE=o.writeInt32LE,n.readFloatLE=o.readFloatLE,n.writeFloatLE=o.writeFloatLE,n.readDoubleLE=o.readDoubleLE,n.writeDoubleLE=o.writeDoubleLE,n.toString=o.toString,n.write=o.write,n.slice=o.slice,n.copy=o.copy,n._isBuffer=!0,n}function i(t){for(var e,n,r=t.length,i=[],o=0;o<r;o++){if((e=t.charCodeAt(o))>55295&&e<57344){if(!n){e>56319||o+1===r?i.push(239,191,189):n=e;continue}if(e<56320){i.push(239,191,189),n=e;continue}e=n-55296<<10|e-56320|65536,n=null}else n&&(i.push(239,191,189),n=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}t.exports=r;var o,a,s,u=n(73);o={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return u.read(this,t,!0,23,4)},readDoubleLE:function(t){return u.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return u.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return u.write(this,t,e,!0,52,8)},toString:function(t,e,n){var r=\\\"\\\",i=\\\"\\\";e=e||0,n=Math.min(this.length,n||this.length);for(var o=e;o<n;o++){var a=this[o];a<=127?(r+=decodeURIComponent(i)+String.fromCharCode(a),i=\\\"\\\"):i+=\\\"%\\\"+a.toString(16)}return r+=decodeURIComponent(i)},write:function(t,e){for(var n=t===a?s:i(t),r=0;r<n.length;r++)this[e+r]=n[r]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var n=0;n<this.length;n++)t[e+n]=this[n]}},o.writeInt32LE=o.writeUInt32LE,r.byteLength=function(t){return a=t,s=i(t),s.length},r.isBuffer=function(t){return!(!t||!t._isBuffer)}},function(t,e){e.read=function(t,e,n,r,i){var o,a,s=8*i-r-1,u=(1<<s)-1,l=u>>1,c=-7,p=n?i-1:0,f=n?-1:1,h=t[e+p];for(p+=f,o=h&(1<<-c)-1,h>>=-c,c+=s;c>0;o=256*o+t[e+p],p+=f,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=r;c>0;a=256*a+t[e+p],p+=f,c-=8);if(0===o)o=1-l;else{if(o===u)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,r),o-=l}return(h?-1:1)*a*Math.pow(2,o-r)},e.write=function(t,e,n,r,i,o){var a,s,u,l=8*o-i-1,c=(1<<l)-1,p=c>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,y=r?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),e+=a+p>=1?f/u:f*Math.pow(2,1-p),e*u>=2&&(a++,u/=2),a+p>=c?(s=0,a=c):a+p>=1?(s=(e*u-1)*Math.pow(2,i),a+=p):(s=e*Math.pow(2,p-1)*Math.pow(2,i),a=0));i>=8;t[n+h]=255&s,h+=y,s/=256,i-=8);for(a=a<<i|s,l+=i;l>0;t[n+h]=255&a,h+=y,a/=256,l-=8);t[n+h-y]|=128*d}},function(t,e,n){\\\"use strict\\\";function r(t){this.coord=t.coord,this.uid=t.uid,this.zoom=t.zoom,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=t.overscaling,this.angle=t.angle,this.pitch=t.pitch,this.showCollisionBoxes=t.showCollisionBoxes}function i(t){return!t.isEmpty()}function o(t){return t.serialize()}function a(t){var e=[];for(var n in t)t[n].getTransferables(e);return e}function s(t){return t.id}var u=n(75),l=n(97),c=n(4),p=n(98),f=n(45),h=n(0),y=n(99),d=n(100);t.exports=r,r.prototype.parse=function(t,e,n,r,m){function v(t,e){for(var n=0;n<t.length;n++){var r=t.feature(n);r.index=n;for(var i in e)e[i].filter(r)&&e[i].features.push(r)}}function x(t){if(t)return m(t);if(2===++q){for(var e=j.length-1;e>=0;e--)g(I,j[e]);b()}}function g(t,e){if(e.populateArrays(M,C,B),\\\"symbol\\\"!==e.type)for(var n=0;n<e.features.length;n++){var r=e.features[n];P.insert(r,r.index,e.sourceLayerIndex,e.index)}e.features=null}function b(){I.status=\\\"done\\\",I.redoPlacementAfterDone&&(I.redoPlacement(I.angle,I.pitch,null),I.redoPlacementAfterDone=!1);var t=P.serialize(),e=M.serialize(),n=I.collisionBoxArray.serialize(),s=I.symbolInstancesArray.serialize(),u=I.symbolQuadsArray.serialize(),l=[r].concat(t.transferables).concat(e.transferables),c=F.filter(i);m(null,{buckets:c.map(o),featureIndex:t.data,collisionTile:e.data,collisionBoxArray:n,symbolInstancesArray:s,symbolQuadsArray:u,rawTileData:r},a(c).concat(l))}this.status=\\\"parsing\\\",this.data=t,this.collisionBoxArray=new p,this.symbolInstancesArray=new y,this.symbolQuadsArray=new d;var w,S,_,A,M=new l(this.angle,this.pitch,this.collisionBoxArray),P=new u(this.coord,this.overscaling,M,t.layers),z=new f(t.layers?Object.keys(t.layers).sort():[\\\"_geojsonTileLayer\\\"]),I=this,T={},V={},k=0;for(var E in e)S=e[E][0],S.source===this.source&&(S.ref||S.minzoom&&this.zoom<S.minzoom||S.maxzoom&&this.zoom>=S.maxzoom||S.layout&&\\\"none\\\"===S.layout.visibility||t.layers&&!t.layers[S.sourceLayer]||(A=c.create({layer:S,index:k++,childLayers:e[E],zoom:this.zoom,overscaling:this.overscaling,showCollisionBoxes:this.showCollisionBoxes,collisionBoxArray:this.collisionBoxArray,symbolQuadsArray:this.symbolQuadsArray,symbolInstancesArray:this.symbolInstancesArray,sourceLayerIndex:z.encode(S.sourceLayer||\\\"_geojsonTileLayer\\\")}),A.createFilter(),T[S.id]=A,t.layers&&(_=S.sourceLayer,V[_]=V[_]||{},V[_][S.id]=A)));if(t.layers)for(_ in V)1===S.version&&h.warnOnce('Vector tile source \\\"'+this.source+'\\\" layer \\\"'+_+'\\\" does not use vector tile spec v2 and therefore may have some rendering errors.'),(S=t.layers[_])&&v(S,V[_]);else v(t,T);var F=[],j=this.symbolBuckets=[],L=[];P.bucketLayerIDs={};for(var O in T)A=T[O],0!==A.features.length&&(P.bucketLayerIDs[A.index]=A.childLayers.map(s),F.push(A),\\\"symbol\\\"===A.type?j.push(A):L.push(A));var B={},C={},q=0;if(j.length>0){for(w=j.length-1;w>=0;w--)j[w].updateIcons(B),j[w].updateFont(C);for(var D in C)C[D]=Object.keys(C[D]).map(Number);B=Object.keys(B),n.send(\\\"get glyphs\\\",{uid:this.uid,stacks:C},function(t,e){C=e,x(t)}),B.length?n.send(\\\"get icons\\\",{icons:B},function(t,e){B=e,x(t)}):x()}for(w=L.length-1;w>=0;w--)g(this,L[w]);if(0===j.length)return b()},r.prototype.redoPlacement=function(t,e,n){if(\\\"done\\\"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=t,{};for(var r=new l(t,e,this.collisionBoxArray),s=this.symbolBuckets,u=s.length-1;u>=0;u--)s[u].placeFeatures(r,n);var c=r.serialize(),p=s.filter(i);return{result:{buckets:p.map(o),collisionTile:c.data},transferables:a(p).concat(c.transferables)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){if(t.grid){var r=t,i=e;t=r.coord,e=r.overscaling,this.grid=new y(r.grid),this.featureIndexArray=new A(r.featureIndexArray),this.rawTileData=i,this.bucketLayerIDs=r.bucketLayerIDs}else this.grid=new y(p,16,0),this.featureIndexArray=new A;this.coord=t,this.overscaling=e,this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.setCollisionTile(n)}function i(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function o(t,e){return e-t}function a(t){return t[\\\"line-gap-width\\\"]>0?t[\\\"line-gap-width\\\"]+2*t[\\\"line-width\\\"]:t[\\\"line-width\\\"]}function s(t,e,n,r,i){if(!e[0]&&!e[1])return t;e=l.convert(e),\\\"viewport\\\"===n&&e._rotate(-r);for(var o=[],a=0;a<t.length;a++){for(var s=t[a],u=[],c=0;c<s.length;c++)u.push(s[c].sub(e._mult(i)));o.push(u)}return o}function u(t,e){for(var n=[],r=new l(0,0),i=0;i<t.length;i++){for(var o=t[i],a=[],s=0;s<o.length;s++){var u=o[s-1],c=o[s],p=o[s+1],f=0===s?r:c.sub(u)._unit()._perp(),h=s===o.length-1?r:p.sub(c)._unit()._perp(),y=f._add(h)._unit(),d=y.x*h.x+y.y*h.y;y._mult(1/d),a.push(y._mult(e)._add(c))}n.push(a)}return n}var l=n(2),c=n(8),p=n(4).EXTENT,f=n(38),h=n(10),y=n(44),d=n(45),m=n(12),v=n(15),x=n(96),g=n(0).arraysIntersect,b=n(43),w=b.multiPolygonIntersectsBufferedMultiPoint,S=b.multiPolygonIntersectsMultiPolygon,_=b.multiPolygonIntersectsBufferedMultiLine,A=new h({members:[{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"}]});t.exports=r,r.prototype.insert=function(t,e,n,r){var i=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(e,n,r);for(var o=c(t),a=0;a<o.length;a++){for(var s=o[a],u=[1/0,1/0,-1/0,-1/0],l=0;l<s.length;l++){var p=s[l];u[0]=Math.min(u[0],p.x),u[1]=Math.min(u[1],p.y),u[2]=Math.max(u[2],p.x),u[3]=Math.max(u[3],p.y)}this.grid.insert(i,u[0],u[1],u[2],u[3])}},r.prototype.setCollisionTile=function(t){this.collisionTile=t},r.prototype.serialize=function(){var t={coord:this.coord,overscaling:this.overscaling,grid:this.grid.toArrayBuffer(),featureIndexArray:this.featureIndexArray.serialize(),bucketLayerIDs:this.bucketLayerIDs};return{data:t,transferables:[t.grid,t.featureIndexArray.arrayBuffer]}},r.prototype.query=function(t,e){this.vtLayers||(this.vtLayers=new m.VectorTile(new v(new Uint8Array(this.rawTileData))).layers,this.sourceLayerCoder=new d(this.vtLayers?Object.keys(this.vtLayers).sort():[\\\"_geojsonTileLayer\\\"]));var n={},r=t.params||{},s=p/t.tileSize/t.scale,u=f(r.filter),c=0;for(var h in e){var y=e[h],x=y.paint,g=0;\\\"line\\\"===y.type?g=a(x)/2+Math.abs(x[\\\"line-offset\\\"])+i(x[\\\"line-translate\\\"]):\\\"fill\\\"===y.type?g=i(x[\\\"fill-translate\\\"]):\\\"circle\\\"===y.type&&(g=x[\\\"circle-radius\\\"]+i(x[\\\"circle-translate\\\"])),c=Math.max(c,g*s)}for(var b=t.queryGeometry.map(function(t){return t.map(function(t){return new l(t.x,t.y)})}),w=1/0,S=1/0,_=-1/0,A=-1/0,M=0;M<b.length;M++)for(var P=b[M],z=0;z<P.length;z++){var I=P[z];w=Math.min(w,I.x),S=Math.min(S,I.y),_=Math.max(_,I.x),A=Math.max(A,I.y)}var T=this.grid.query(w-c,S-c,_+c,A+c);T.sort(o),this.filterMatching(n,T,this.featureIndexArray,b,u,r.layers,e,t.bearing,s);var V=this.collisionTile.queryRenderedSymbols(w,S,_,A,t.scale);return V.sort(),this.filterMatching(n,V,this.collisionTile.collisionBoxArray,b,u,r.layers,e,t.bearing,s),n},r.prototype.filterMatching=function(t,e,n,r,i,o,l,p,f){for(var h,y=0;y<e.length;y++){var d=e[y];if(d!==h){h=d;var m=n.get(d),v=this.bucketLayerIDs[m.bucketIndex];if(!o||g(o,v)){var b=this.sourceLayerCoder.decode(m.sourceLayerIndex),A=this.vtLayers[b],M=A.feature(m.featureIndex);if(i(M))for(var P=null,z=0;z<v.length;z++){var I=v[z];if(!(o&&o.indexOf(I)<0)){var T=l[I];if(T){var V;if(\\\"symbol\\\"!==T.type){P||(P=c(M));var k=T.paint;if(\\\"line\\\"===T.type){V=s(r,k[\\\"line-translate\\\"],k[\\\"line-translate-anchor\\\"],p,f);var E=a(k)/2*f;if(k[\\\"line-offset\\\"]&&(P=u(P,k[\\\"line-offset\\\"]*f)),!_(V,P,E))continue}else if(\\\"fill\\\"===T.type){if(V=s(r,k[\\\"fill-translate\\\"],k[\\\"fill-translate-anchor\\\"],p,f),!S(V,P))continue}else if(\\\"circle\\\"===T.type){V=s(r,k[\\\"circle-translate\\\"],k[\\\"circle-translate-anchor\\\"],p,f);var F=k[\\\"circle-radius\\\"]*f;if(!w(V,P,F))continue}}var j=new x(M,this.z,this.x,this.y);j.layer=T.serialize({includeRefProperties:!0});var L=t[I];void 0===L&&(L=t[I]=[]),L.push(j)}}}}}}}},function(t,e,n){\\\"use strict\\\";function r(t){var e=t.layoutVertexArrayType;this.layoutVertexArray=new e;var n=t.elementArrayType;n&&(this.elementArray=new n);var r=t.elementArrayType2;r&&(this.elementArray2=new r),this.paintVertexArrays=i.mapObject(t.paintVertexArrayTypes,function(t){return new t})}var i=n(0);t.exports=r,r.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,r.prototype.hasCapacityFor=function(t){return this.layoutVertexArray.length+t<=r.MAX_VERTEX_ARRAY_LENGTH},r.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},r.prototype.trim=function(){this.layoutVertexArray.trim(),this.elementArray&&this.elementArray.trim(),this.elementArray2&&this.elementArray2.trim();for(var t in this.paintVertexArrays)this.paintVertexArrays[t].trim()},r.prototype.serialize=function(){return{layoutVertexArray:this.layoutVertexArray.serialize(),elementArray:this.elementArray&&this.elementArray.serialize(),elementArray2:this.elementArray2&&this.elementArray2.serialize(),paintVertexArrays:i.mapObject(this.paintVertexArrays,function(t){return t.serialize()})}},r.prototype.getTransferables=function(t){t.push(this.layoutVertexArray.arrayBuffer),this.elementArray&&t.push(this.elementArray.arrayBuffer),this.elementArray2&&t.push(this.elementArray2.arrayBuffer);for(var e in this.paintVertexArrays)t.push(this.paintVertexArrays[e].arrayBuffer)}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.layoutVertexBuffer=new o(t.layoutVertexArray,e.layoutVertexArrayType,o.BufferType.VERTEX),t.elementArray&&(this.elementBuffer=new o(t.elementArray,e.elementArrayType,o.BufferType.ELEMENT));var n,r=this.vaos={};t.elementArray2&&(this.elementBuffer2=new o(t.elementArray2,e.elementArrayType2,o.BufferType.ELEMENT),n=this.secondVaos={}),this.paintVertexBuffers=i.mapObject(t.paintVertexArrays,function(i,s){return r[s]=new a,t.elementArray2&&(n[s]=new a),new o(i,e.paintVertexArrayTypes[s],o.BufferType.VERTEX)})}var i=n(0),o=n(78),a=n(79);t.exports=r,r.prototype.destroy=function(t){this.layoutVertexBuffer.destroy(t),this.elementBuffer&&this.elementBuffer.destroy(t),this.elementBuffer2&&this.elementBuffer2.destroy(t);for(var e in this.paintVertexBuffers)this.paintVertexBuffers[e].destroy(t);for(var n in this.vaos)this.vaos[n].destroy(t);for(var r in this.secondVaos)this.secondVaos[r].destroy(t)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.attributes=e.members,this.itemSize=e.bytesPerElement,this.type=n,this.arrayType=e}t.exports=r,r.prototype.bind=function(t){var e=t[this.type];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.arrayBuffer,t.STATIC_DRAW),this.arrayBuffer=null)};var i={Int8:\\\"BYTE\\\",Uint8:\\\"UNSIGNED_BYTE\\\",Int16:\\\"SHORT\\\",Uint16:\\\"UNSIGNED_SHORT\\\"};r.prototype.setVertexAttribPointers=function(t,e){for(var n=0;n<this.attributes.length;n++){var r=this.attributes[n],o=e[r.name];void 0!==o&&t.vertexAttribPointer(o,r.components,t[i[r.type]],!1,this.arrayType.bytesPerElement,r.offset)}},r.prototype.destroy=function(t){this.buffer&&t.deleteBuffer(this.buffer)},r.BufferType={VERTEX:\\\"ARRAY_BUFFER\\\",ELEMENT:\\\"ELEMENT_ARRAY_BUFFER\\\"}},function(t,e,n){\\\"use strict\\\";function r(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.vao=null}var i=n(9);t.exports=r,r.prototype.bind=function(t,e,n,r,i){void 0===t.extVertexArrayObject&&(t.extVertexArrayObject=t.getExtension(\\\"OES_vertex_array_object\\\"));var o=!this.vao||this.boundProgram!==e||this.boundVertexBuffer!==n||this.boundVertexBuffer2!==i||this.boundElementBuffer!==r;!t.extVertexArrayObject||o?this.freshBind(t,e,n,r,i):t.extVertexArrayObject.bindVertexArrayOES(this.vao)},r.prototype.freshBind=function(t,e,n,r,o){var a,s=e.numAttributes;if(t.extVertexArrayObject)this.vao&&this.destroy(t),this.vao=t.extVertexArrayObject.createVertexArrayOES(),t.extVertexArrayObject.bindVertexArrayOES(this.vao),a=0,this.boundProgram=e,this.boundVertexBuffer=n,this.boundVertexBuffer2=o,this.boundElementBuffer=r;else{a=t.currentNumAttributes||0;for(var u=s;u<a;u++)i(0!==u),t.disableVertexAttribArray(u)}for(var l=a;l<s;l++)t.enableVertexAttribArray(l);n.bind(t),n.setVertexAttribPointers(t,e),o&&(o.bind(t),o.setVertexAttribPointers(t,e)),r&&r.bind(t),t.currentNumAttributes=s},r.prototype.unbind=function(t){var e=t.extVertexArrayObject;e&&e.bindVertexArrayOES(null)},r.prototype.destroy=function(t){var e=t.extVertexArrayObject;e&&this.vao&&(e.deleteVertexArrayOES(this.vao),this.vao=null)}},function(t,e,n){\\\"use strict\\\";function r(t){if(null===t||void 0===t)throw new TypeError(\\\"Object.assign cannot be called with null or undefined\\\");return Object(t)}var i=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\\\"abc\\\");if(t[5]=\\\"de\\\",\\\"5\\\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e[\\\"_\\\"+String.fromCharCode(n)]=n;if(\\\"0123456789\\\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\\\"\\\"))return!1;var r={};return\\\"abcdefghijklmnopqrst\\\".split(\\\"\\\").forEach(function(t){r[t]=t}),\\\"abcdefghijklmnopqrst\\\"===Object.keys(Object.assign({},r)).join(\\\"\\\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,s,u=r(t),l=1;l<arguments.length;l++){n=Object(arguments[l]);for(var c in n)o.call(n,c)&&(u[c]=n[c]);if(i){s=i(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=n(82),u=n(39);t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.programInterfaces={fill:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}]),elementArrayType:new i.ElementArrayType(1),elementArrayType2:new i.ElementArrayType(2),paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-color\\\"},{name:\\\"a_outline_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-outline-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-outline-color\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint8\\\",getValue:function(t,e,n){return[t.getPaintValue(\\\"fill-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"fill-opacity\\\"}]}},r.prototype.addFeature=function(t){for(var e=a(t),n=u(e,500),r=this.prepareArrayGroup(\\\"fill\\\",0),i=r.layoutVertexArray.length,o=0;o<n.length;o++)this.addPolygon(n[o]);this.populatePaintArrays(\\\"fill\\\",{zoom:this.zoom},t.properties,r,i)},r.prototype.addPolygon=function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n].length;for(var r=this.prepareArrayGroup(\\\"fill\\\",e),i=[],o=[],a=r.layoutVertexArray.length,u=0;u<t.length;u++){var l=t[u];u>0&&o.push(i.length/2);for(var c=0;c<l.length;c++){var p=l[c],f=r.layoutVertexArray.emplaceBack(p.x,p.y);c>=1&&r.elementArray2.emplaceBack(f-1,f),i.push(p.x),i.push(p.y)}}for(var h=s(i,o),y=0;y<h.length;y++)r.elementArray.emplaceBack(h[y]+a)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){n=n||2;var r=e&&e.length,o=r?e[0]*n:t.length,s=i(t,0,o,n,!0),u=[];if(!s||s.next===s.prev)return u;var l,c,f,h,y,d,m;if(r&&(s=p(t,e,s,n)),t.length>80*n){l=f=t[0],c=h=t[1];for(var v=n;v<o;v+=n)y=t[v],d=t[v+1],y<l&&(l=y),d<c&&(c=d),y>f&&(f=y),d>h&&(h=d);m=Math.max(f-l,h-c),m=0!==m?1/m:0}return a(s,u,n,l,c,m),u}function i(t,e,n,r,i){var o,a;if(i===j(t,e,n,r)>0)for(o=e;o<n;o+=r)a=k(o,t[o],t[o+1],a);else for(o=n-r;o>=e;o-=r)a=k(o,t[o],t[o+1],a);return a&&_(a,a.next)&&(E(a),a=a.next),a}function o(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!_(r,r.next)&&0!==S(r.prev,r,r.next))r=r.next;else{if(E(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function a(t,e,n,r,i,p,f){if(t){!f&&p&&m(t,r,i,p);for(var h,y,d=t;t.prev!==t.next;)if(h=t.prev,y=t.next,p?u(t,r,i,p):s(t))e.push(h.i/n),e.push(t.i/n),e.push(y.i/n),E(t),t=y.next,d=y.next;else if((t=y)===d){f?1===f?(t=l(o(t),e,n),a(t,e,n,r,i,p,2)):2===f&&c(t,e,n,r,i,p):a(o(t),e,n,r,i,p,1);break}}}function s(t){var e=t.prev,n=t,r=t.next;if(S(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(b(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&S(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function u(t,e,n,r){var i=t.prev,o=t,a=t.next;if(S(i,o,a)>=0)return!1;for(var s=i.x<o.x?i.x<a.x?i.x:a.x:o.x<a.x?o.x:a.x,u=i.y<o.y?i.y<a.y?i.y:a.y:o.y<a.y?o.y:a.y,l=i.x>o.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,c=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,p=x(s,u,e,n,r),f=x(l,c,e,n,r),h=t.prevZ,y=t.nextZ;h&&h.z>=p&&y&&y.z<=f;){if(h!==t.prev&&h!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&S(h.prev,h,h.next)>=0)return!1;if(h=h.prevZ,y!==t.prev&&y!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,y.x,y.y)&&S(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;h&&h.z>=p;){if(h!==t.prev&&h!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&S(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;y&&y.z<=f;){if(y!==t.prev&&y!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,y.x,y.y)&&S(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function l(t,e,n){var r=t;do{var i=r.prev,a=r.next.next;!_(i,a)&&A(i,r,r.next,a)&&I(i,a)&&I(a,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(a.i/n),E(r),E(r.next),r=t=a),r=r.next}while(r!==t);return o(r)}function c(t,e,n,r,i,s){var u=t;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&w(u,l)){var c=V(u,l);return u=o(u,u.next),c=o(c,c.next),a(u,e,n,r,i,s),void a(c,e,n,r,i,s)}l=l.next}u=u.next}while(u!==t)}function p(t,e,n,r){var a,s,u,l,c,p=[];for(a=0,s=e.length;a<s;a++)u=e[a]*r,l=a<s-1?e[a+1]*r:t.length,c=i(t,u,l,r,!1),c===c.next&&(c.steiner=!0),p.push(g(c));for(p.sort(f),a=0;a<p.length;a++)h(p[a],n),n=o(n,n.next);return n}function f(t,e){return t.x-e.x}function h(t,e){if(e=y(t,e)){var n=V(e,t);o(e,e.next),o(n,n.next)}}function y(t,e){var n,r=e,i=t.x,o=t.y,a=-1/0;do{if(o<=r.y&&o>=r.next.y&&r.next.y!==r.y){var s=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=i&&s>a){if(a=s,s===i){if(o===r.y)return r;if(o===r.next.y)return r.next}n=r.x<r.next.x?r:r.next}}r=r.next}while(r!==e);if(!n)return null;if(i===a)return n;var u,l=n,c=n.x,p=n.y,f=1/0;r=n;do{i>=r.x&&r.x>=c&&i!==r.x&&b(o<p?i:a,o,c,p,o<p?a:i,o,r.x,r.y)&&(u=Math.abs(o-r.y)/(i-r.x),I(r,t)&&(u<f||u===f&&(r.x>n.x||r.x===n.x&&d(n,r)))&&(n=r,f=u)),r=r.next}while(r!==l);return n}function d(t,e){return S(t.prev,t,e.prev)<0&&S(e.next,t,t.next)<0}function m(t,e,n,r){var i=t;do{null===i.z&&(i.z=x(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,v(i)}function v(t){var e,n,r,i,o,a,s,u,l=1;do{for(n=t,t=null,o=null,a=0;n;){for(a++,r=n,s=0,e=0;e<l&&(s++,r=r.nextZ);e++);for(u=l;s>0||u>0&&r;)0!==s&&(0===u||!r||n.z<=r.z)?(i=n,n=n.nextZ,s--):(i=r,r=r.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;n=r}o.nextZ=null,l*=2}while(a>1);return t}function x(t,e,n,r,i){return t=32767*(t-n)*i,e=32767*(e-r)*i,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function g(t){var e=t,n=t;do{(e.x<n.x||e.x===n.x&&e.y<n.y)&&(n=e),e=e.next}while(e!==t);return n}function b(t,e,n,r,i,o,a,s){return(i-a)*(e-s)-(t-a)*(o-s)>=0&&(t-a)*(r-s)-(n-a)*(e-s)>=0&&(n-a)*(o-s)-(i-a)*(r-s)>=0}function w(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!z(t,e)&&(I(t,e)&&I(e,t)&&T(t,e)&&(S(t.prev,t,e.prev)||S(t,e.prev,e))||_(t,e)&&S(t.prev,t,t.next)>0&&S(e.prev,e,e.next)>0)}function S(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _(t,e){return t.x===e.x&&t.y===e.y}function A(t,e,n,r){var i=P(S(t,e,n)),o=P(S(t,e,r)),a=P(S(n,r,t)),s=P(S(n,r,e));return i!==o&&a!==s||(!(0!==i||!M(t,n,e))||(!(0!==o||!M(t,r,e))||(!(0!==a||!M(n,t,r))||!(0!==s||!M(n,e,r)))))}function M(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function P(t){return t>0?1:t<0?-1:0}function z(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&A(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function I(t,e){return S(t.prev,t,t.next)<0?S(t,e,t.next)>=0&&S(t,t.prev,e)>=0:S(t,e,t.prev)<0||S(t,t.next,e)<0}function T(t,e){var n=t,r=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&i<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}function V(t,e){var n=new F(t.i,t.x,t.y),r=new F(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,o.next=r,r.prev=o,r}function k(t,e,n,r){var i=new F(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function E(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function F(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function j(t,e,n,r){for(var i=0,o=e,a=n-r;o<n;o+=r)i+=(t[a]-t[o])*(t[o+1]+t[a+1]),a=o;return i}t.exports=r,t.exports.default=r,r.deviation=function(t,e,n,r){var i=e&&e.length,o=i?e[0]*n:t.length,a=Math.abs(j(t,0,o,n));if(i)for(var s=0,u=e.length;s<u;s++){var l=e[s]*n,c=s<u-1?e[s+1]*n:t.length;a-=Math.abs(j(t,l,c,n))}var p=0;for(s=0;s<r.length;s+=3){var f=r[s]*n,h=r[s+1]*n,y=r[s+2]*n;p+=Math.abs((t[f]-t[y])*(t[h+1]-t[f+1])-(t[f]-t[h])*(t[y+1]-t[f+1]))}return 0===a&&0===p?0:Math.abs((p-a)/a)},r.flatten=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},r=0,i=0;i<t.length;i++){for(var o=0;o<t[i].length;o++)for(var a=0;a<e;a++)n.vertices.push(t[i][o][a]);i>0&&(r+=t[i-1].length,n.holes.push(r))}return n}},function(t,e,n){!function(e,n){t.exports=n()}(0,function(){\\\"use strict\\\";function t(t,n,i,o,a){e(t,n,i||0,o||t.length-1,a||r)}function e(t,r,i,o,a){for(;o>i;){if(o-i>600){var s=o-i+1,u=r-i+1,l=Math.log(s),c=.5*Math.exp(2*l/3),p=.5*Math.sqrt(l*c*(s-c)/s)*(u-s/2<0?-1:1);e(t,r,Math.max(i,Math.floor(r-u*c/s+p)),Math.min(o,Math.floor(r+(s-u)*c/s+p)),a)}var f=t[r],h=i,y=o;for(n(t,i,r),a(t[o],f)>0&&n(t,i,o);h<y;){for(n(t,h,y),h++,y--;a(t[h],f)<0;)h++;for(;a(t[y],f)>0;)y--}0===a(t[i],f)?n(t,i,y):(y++,n(t,y,o)),y<=r&&(i=y+1),r<=y&&(o=y-1)}}function n(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function r(t,e){return t<e?-1:t>e?1:0}return t})},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=i.EXTENT,u=Math.cos(Math.PI/180*37.5),l=Math.pow(2,14)/.5;t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.addLineVertex=function(t,e,n,r,i,o,a){return t.emplaceBack(e.x<<1|r,e.y<<1|i,Math.round(63*n.x)+128,Math.round(63*n.y)+128,1+(0===o?0:o<0?-1:1)|(.5*a&63)<<2,.5*a>>6)},r.prototype.programInterfaces={line:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]),paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"line-color\\\",e,n)},multiplier:255,paintProperty:\\\"line-color\\\"}],elementArrayType:new i.ElementArrayType}},r.prototype.addFeature=function(t){for(var e=a(t,15),n=0;n<e.length;n++)this.addLine(e[n],t.properties,this.layer.layout[\\\"line-join\\\"],this.layer.layout[\\\"line-cap\\\"],this.layer.layout[\\\"line-miter-limit\\\"],this.layer.layout[\\\"line-round-limit\\\"])},r.prototype.addLine=function(t,e,n,r,i,o){for(var a=t.length;a>2&&t[a-1].equals(t[a-2]);)a--;if(!(t.length<2)){\\\"bevel\\\"===n&&(i=1.05);var l=s/(512*this.overscaling)*15,c=t[0],p=t[a-1],f=c.equals(p),h=this.prepareArrayGroup(\\\"line\\\",10*a),y=h.layoutVertexArray.length;if(2!==a||!f){this.distance=0;var d,m,v,x,g,b,w,S=r,_=f?\\\"butt\\\":r,A=!0;this.e1=this.e2=this.e3=-1,f&&(d=t[a-2],g=c.sub(d)._unit()._perp());for(var M=0;M<a;M++)if(!(v=f&&M===a-1?t[1]:t[M+1])||!t[M].equals(v)){g&&(x=g),d&&(m=d),d=t[M],g=v?v.sub(d)._unit()._perp():x,x=x||g;var P=x.add(g)._unit(),z=P.x*g.x+P.y*g.y,I=1/z,T=z<u&&m&&v;if(T&&M>0){var V=d.dist(m);if(V>2*l){var k=d.sub(d.sub(m)._mult(l/V)._round());this.distance+=k.dist(m),this.addCurrentVertex(k,this.distance,x.mult(1),0,0,!1),m=k}}var E=m&&v,F=E?n:v?S:_;if(E&&\\\"round\\\"===F&&(I<o?F=\\\"miter\\\":I<=2&&(F=\\\"fakeround\\\")),\\\"miter\\\"===F&&I>i&&(F=\\\"bevel\\\"),\\\"bevel\\\"===F&&(I>2&&(F=\\\"flipbevel\\\"),I<i&&(F=\\\"miter\\\")),m&&(this.distance+=d.dist(m)),\\\"miter\\\"===F)P._mult(I),this.addCurrentVertex(d,this.distance,P,0,0,!1);else if(\\\"flipbevel\\\"===F){if(I>100)P=g.clone();else{var j=x.x*g.y-x.y*g.x>0?-1:1,L=I*x.add(g).mag()/x.sub(g).mag();P._perp()._mult(L*j)}this.addCurrentVertex(d,this.distance,P,0,0,!1),this.addCurrentVertex(d,this.distance,P.mult(-1),0,0,!1)}else if(\\\"bevel\\\"===F||\\\"fakeround\\\"===F){var O=x.x*g.y-x.y*g.x>0,B=-Math.sqrt(I*I-1);if(O?(w=0,b=B):(b=0,w=B),A||this.addCurrentVertex(d,this.distance,x,b,w,!1),\\\"fakeround\\\"===F){for(var C,q=Math.floor(8*(.5-(z-.5))),D=0;D<q;D++)C=g.mult((D+1)/(q+1))._add(x)._unit(),this.addPieSliceVertex(d,this.distance,C,O);this.addPieSliceVertex(d,this.distance,P,O);for(var N=q-1;N>=0;N--)C=x.mult((N+1)/(q+1))._add(g)._unit(),this.addPieSliceVertex(d,this.distance,C,O)}v&&this.addCurrentVertex(d,this.distance,g,-b,-w,!1)}else\\\"butt\\\"===F?(A||this.addCurrentVertex(d,this.distance,x,0,0,!1),v&&this.addCurrentVertex(d,this.distance,g,0,0,!1)):\\\"square\\\"===F?(A||(this.addCurrentVertex(d,this.distance,x,1,1,!1),this.e1=this.e2=-1),v&&this.addCurrentVertex(d,this.distance,g,-1,-1,!1)):\\\"round\\\"===F&&(A||(this.addCurrentVertex(d,this.distance,x,0,0,!1),this.addCurrentVertex(d,this.distance,x,1,1,!0),this.e1=this.e2=-1),v&&(this.addCurrentVertex(d,this.distance,g,-1,-1,!0),this.addCurrentVertex(d,this.distance,g,0,0,!1)));if(T&&M<a-1){var U=d.dist(v);if(U>2*l){var Z=d.add(v.sub(d)._mult(l/U)._round());this.distance+=Z.dist(d),this.addCurrentVertex(Z,this.distance,g.mult(1),0,0,!1),d=Z}}A=!1}this.populatePaintArrays(\\\"line\\\",{zoom:this.zoom},e,h,y)}}},r.prototype.addCurrentVertex=function(t,e,n,r,i,o){var a,s=o?1:0,u=this.arrayGroups.line[this.arrayGroups.line.length-1],c=u.layoutVertexArray,p=u.elementArray;a=n.clone(),r&&a._sub(n.perp()._mult(r)),this.e3=this.addLineVertex(c,t,a,s,0,r,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,a=n.mult(-1),i&&a._sub(n.perp()._mult(i)),this.e3=this.addLineVertex(c,t,a,s,1,-i,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,e>l/2&&(this.distance=0,this.addCurrentVertex(t,this.distance,n,r,i,o))},r.prototype.addPieSliceVertex=function(t,e,n,r){var i=r?1:0;n=n.mult(r?-1:1);var o=this.arrayGroups.line[this.arrayGroups.line.length-1],a=o.layoutVertexArray,s=o.elementArray;this.e3=this.addLineVertex(a,t,n,0,i,0,e),this.e1>=0&&this.e2>=0&&s.emplaceBack(this.e1,this.e2,this.e3),r?this.e2=this.e3:this.e1=this.e3}},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=i.EXTENT;t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.addCircleVertex=function(t,e,n,r,i){return t.emplaceBack(2*e+(r+1)/2,2*n+(i+1)/2)},r.prototype.programInterfaces={circle:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}]),elementArrayType:new i.ElementArrayType,paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"circle-color\\\",e,n)},multiplier:255,paintProperty:\\\"circle-color\\\"},{name:\\\"a_radius\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-radius\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-radius\\\"},{name:\\\"a_blur\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-blur\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-blur\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"circle-opacity\\\"}]}},r.prototype.addFeature=function(t){for(var e={zoom:this.zoom},n=a(t),r=this.prepareArrayGroup(\\\"circle\\\",0),i=r.layoutVertexArray.length,o=0;o<n.length;o++)for(var u=0;u<n[o].length;u++){var l=n[o][u].x,c=n[o][u].y;if(!(l<0||l>=s||c<0||c>=s)){var p=this.prepareArrayGroup(\\\"circle\\\",4),f=p.layoutVertexArray,h=this.addCircleVertex(f,l,c,-1,-1);this.addCircleVertex(f,l,c,1,-1),this.addCircleVertex(f,l,c,1,1),this.addCircleVertex(f,l,c,-1,1),p.elementArray.emplaceBack(h,h+1,h+2),p.elementArray.emplaceBack(h,h+3,h+2)}}this.populatePaintArrays(\\\"circle\\\",e,t.properties,r,i)}},function(t,e,n){\\\"use strict\\\";function r(t){a.apply(this,arguments),this.showCollisionBoxes=t.showCollisionBoxes,this.overscaling=t.overscaling,this.collisionBoxArray=t.collisionBoxArray,this.symbolQuadsArray=t.symbolQuadsArray,this.symbolInstancesArray=t.symbolInstancesArray,this.sdfIcons=t.sdfIcons,this.iconsNeedLinear=t.iconsNeedLinear,this.adjustedTextSize=t.adjustedTextSize,this.adjustedIconSize=t.adjustedIconSize,this.fontstack=t.fontstack}function i(t,e,n,r,i,o,a,s,u,l,c){return t.emplaceBack(e,n,Math.round(64*r),Math.round(64*i),o/4,a/4,10*(l||0),c,10*(s||0),10*Math.min(u||25,25))}var o=n(2),a=n(4),s=n(40),u=n(87),l=n(41),c=n(42),p=n(89),f=n(90),h=n(91),y=n(92),d=n(0),m=n(8),v=n(93),x=n(94),g=n(39),b=p.shapeText,w=p.shapeIcon,S=c.getGlyphQuads,_=c.getIconQuads,A=a.EXTENT;t.exports=r,r.MAX_QUADS=65535,r.prototype=d.inherit(a,{}),r.prototype.serialize=function(){var t=a.prototype.serialize.apply(this);return t.sdfIcons=this.sdfIcons,t.iconsNeedLinear=this.iconsNeedLinear,t.adjustedTextSize=this.adjustedTextSize,t.adjustedIconSize=this.adjustedIconSize,t.fontstack=this.fontstack,t};var M=new a.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_offset\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_texture_pos\\\",components:2,type:\\\"Uint16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]),P=new a.ElementArrayType;r.prototype.addCollisionBoxVertex=function(t,e,n,r,i){return t.emplaceBack(e.x,e.y,Math.round(n.x),Math.round(n.y),10*r,10*i)},r.prototype.programInterfaces={glyph:{layoutVertexArrayType:M,elementArrayType:P},icon:{layoutVertexArrayType:M,elementArrayType:P},collisionBox:{layoutVertexArrayType:new a.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_extrude\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:2,type:\\\"Uint8\\\"}])}},r.prototype.populateArrays=function(t,e,n){var r={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};this.adjustedTextMaxSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:18,zoomHistory:r}),this.adjustedTextSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:this.zoom+1,zoomHistory:r}),this.adjustedIconMaxSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:18,zoomHistory:r}),this.adjustedIconSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:this.zoom+1,zoomHistory:r});var i=512*this.overscaling;this.tilePixelRatio=A/i,this.compareText={},this.iconsNeedLinear=!1,this.symbolInstancesStartIndex=this.symbolInstancesArray.length;var o=this.layer.layout,a=this.features,s=this.textFeatures,u=.5,c=.5;switch(o[\\\"text-anchor\\\"]){case\\\"right\\\":case\\\"top-right\\\":case\\\"bottom-right\\\":u=1;break;case\\\"left\\\":case\\\"top-left\\\":case\\\"bottom-left\\\":u=0}switch(o[\\\"text-anchor\\\"]){case\\\"bottom\\\":case\\\"bottom-right\\\":case\\\"bottom-left\\\":c=1;break;case\\\"top\\\":case\\\"top-right\\\":case\\\"top-left\\\":c=0}for(var p=\\\"right\\\"===o[\\\"text-justify\\\"]?1:\\\"left\\\"===o[\\\"text-justify\\\"]?0:.5,f=24*o[\\\"text-line-height\\\"],y=\\\"line\\\"!==o[\\\"symbol-placement\\\"]?24*o[\\\"text-max-width\\\"]:0,v=24*o[\\\"text-letter-spacing\\\"],x=[24*o[\\\"text-offset\\\"][0],24*o[\\\"text-offset\\\"][1]],g=this.fontstack=o[\\\"text-font\\\"].join(\\\",\\\"),S=[],_=0;_<a.length;_++)S.push(m(a[_]));if(\\\"line\\\"===o[\\\"symbol-placement\\\"]){var M=h(a,s,S);S=M.geometries,a=M.features,s=M.textFeatures}for(var P,z,I=0;I<a.length;I++)if(S[I]){if(P=s[I]?b(s[I],e[g],y,f,u,c,p,v,x):null,o[\\\"icon-image\\\"]){var T=l(a[I].properties,o[\\\"icon-image\\\"]),V=n[T];z=w(V,o),V&&(void 0===this.sdfIcons?this.sdfIcons=V.sdf:this.sdfIcons!==V.sdf&&d.warnOnce(\\\"Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer\\\"),1!==V.pixelRatio?this.iconsNeedLinear=!0:0===o[\\\"icon-rotate\\\"]&&this.layer.isLayoutValueFeatureConstant(\\\"icon-rotate\\\")||(this.iconsNeedLinear=!0))}else z=null;(P||z)&&this.addFeature(S[I],P,z,a[I])}this.symbolInstancesEndIndex=this.symbolInstancesArray.length,this.placeFeatures(t,this.showCollisionBoxes),this.trimArrays()},r.prototype.addFeature=function(t,e,n,r){var i=this.layer.layout,o=this.adjustedTextSize/24,a=void 0!==this.adjustedTextMaxSize?this.adjustedTextMaxSize:this.adjustedTextSize,s=this.tilePixelRatio*o,l=this.tilePixelRatio*a/24,c=this.tilePixelRatio*this.adjustedIconSize,p=this.tilePixelRatio*i[\\\"symbol-spacing\\\"],f=i[\\\"symbol-avoid-edges\\\"],h=i[\\\"text-padding\\\"]*this.tilePixelRatio,d=i[\\\"icon-padding\\\"]*this.tilePixelRatio,m=i[\\\"text-max-angle\\\"]/180*Math.PI,v=\\\"map\\\"===i[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===i[\\\"symbol-placement\\\"],x=\\\"map\\\"===i[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===i[\\\"symbol-placement\\\"],b=i[\\\"text-allow-overlap\\\"]||i[\\\"icon-allow-overlap\\\"]||i[\\\"text-ignore-placement\\\"]||i[\\\"icon-ignore-placement\\\"],w=i[\\\"symbol-placement\\\"],S=\\\"line\\\"===w,_=p/2,M=null;M=S?y(t,0,0,A,A):g(t,0);for(var P=0;P<M.length;P++){var z=null,I=M[P],T=null;S?(T=I,z=u(T,p,m,e,n,24,l,this.overscaling,A)):(T=I[0],z=this.findPolygonAnchors(I));for(var V=0,k=z.length;V<k;V++){var E=z[V];if(!(e&&S&&this.anchorIsTooClose(e.text,_,E))){var F=!(E.x<0||E.x>A||E.y<0||E.y>A);if(!f||F){var j=F||b;this.addSymbolInstance(E,T,e,n,this.layer,j,this.symbolInstancesArray.length,this.collisionBoxArray,r.index,this.sourceLayerIndex,this.index,s,h,v,c,d,x,{zoom:this.zoom},r.properties)}}}}},r.prototype.findPolygonAnchors=function(t){var e=t[0];if(0===e.length)return[];if(e.length<3||!d.isClosedPolygon(e))return[new s(e[0].x,e[0].y,0)];var n=x(t,16);return[new s(n.x,n.y,0)]},r.prototype.anchorIsTooClose=function(t,e,n){var r=this.compareText;if(t in r){for(var i=r[t],o=i.length-1;o>=0;o--)if(n.dist(i[o])<e)return!0}else r[t]=[];return r[t].push(n),!1},r.prototype.placeFeatures=function(t,e){this.recalculateStyleLayers(),this.createArrays();var n=this.layer.layout,r=t.maxScale,i=\\\"map\\\"===n[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"],o=\\\"map\\\"===n[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"];if(n[\\\"text-allow-overlap\\\"]||n[\\\"icon-allow-overlap\\\"]||n[\\\"text-ignore-placement\\\"]||n[\\\"icon-ignore-placement\\\"]){var a=this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex,this.symbolInstancesEndIndex),s=t.angle,u=Math.sin(s),l=Math.cos(s);this.sortedSymbolInstances=a.sort(function(t,e){return(u*t.anchorPointX+l*t.anchorPointY|0)-(u*e.anchorPointX+l*e.anchorPointY|0)||e.index-t.index})}for(var c=this.symbolInstancesStartIndex;c<this.symbolInstancesEndIndex;c++){var p=this.sortedSymbolInstances?this.sortedSymbolInstances[c-this.symbolInstancesStartIndex]:this.symbolInstancesArray.get(c),f={boxStartIndex:p.textBoxStartIndex,boxEndIndex:p.textBoxEndIndex},h={boxStartIndex:p.iconBoxStartIndex,boxEndIndex:p.iconBoxEndIndex},y=!(p.textBoxStartIndex===p.textBoxEndIndex),d=!(p.iconBoxStartIndex===p.iconBoxEndIndex),m=n[\\\"text-optional\\\"]||!y,v=n[\\\"icon-optional\\\"]||!d,x=y?t.placeCollisionFeature(f,n[\\\"text-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale,g=d?t.placeCollisionFeature(h,n[\\\"icon-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale;m||v?!v&&x?x=Math.max(g,x):!m&&g&&(g=Math.max(g,x)):g=x=Math.max(g,x),y&&(t.insertCollisionFeature(f,x,n[\\\"text-ignore-placement\\\"]),x<=r&&this.addSymbols(\\\"glyph\\\",p.glyphQuadStartIndex,p.glyphQuadEndIndex,x,n[\\\"text-keep-upright\\\"],i,t.angle)),d&&(t.insertCollisionFeature(h,g,n[\\\"icon-ignore-placement\\\"]),g<=r&&this.addSymbols(\\\"icon\\\",p.iconQuadStartIndex,p.iconQuadEndIndex,g,n[\\\"icon-keep-upright\\\"],o,t.angle))}e&&this.addToDebugBuffers(t)},r.prototype.addSymbols=function(t,e,n,r,o,a,s){for(var u=this.prepareArrayGroup(t,4*(n-e)),l=u.elementArray,c=u.layoutVertexArray,p=this.zoom,f=Math.max(Math.log(r)/Math.LN2+p,0),h=e;h<n;h++){var y=this.symbolQuadsArray.get(h).SymbolQuad,d=(y.anchorAngle+s+Math.PI)%(2*Math.PI);if(!(o&&a&&(d<=Math.PI/2||d>3*Math.PI/2))){var m=y.tl,v=y.tr,x=y.bl,g=y.br,b=y.tex,w=y.anchorPoint,S=Math.max(p+Math.log(y.minScale)/Math.LN2,f),_=Math.min(p+Math.log(y.maxScale)/Math.LN2,25);if(!(_<=S)){S===f&&(S=0);var A=Math.round(y.glyphAngle/(2*Math.PI)*256),M=i(c,w.x,w.y,m.x,m.y,b.x,b.y,S,_,f,A);i(c,w.x,w.y,v.x,v.y,b.x+b.w,b.y,S,_,f,A),i(c,w.x,w.y,x.x,x.y,b.x,b.y+b.h,S,_,f,A),i(c,w.x,w.y,g.x,g.y,b.x+b.w,b.y+b.h,S,_,f,A),l.emplaceBack(M,M+1,M+2),l.emplaceBack(M+1,M+2,M+3)}}}},r.prototype.updateIcons=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"icon-image\\\"];if(e)for(var n=0;n<this.features.length;n++){var r=l(this.features[n].properties,e);r&&(t[r]=!0)}},r.prototype.updateFont=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"text-font\\\"],n=t[e]=t[e]||{};this.textFeatures=f(this.features,this.layer.layout,n)},r.prototype.addToDebugBuffers=function(t){for(var e=this.prepareArrayGroup(\\\"collisionBox\\\",0),n=e.layoutVertexArray,r=-t.angle,i=t.yStretch,a=this.symbolInstancesStartIndex;a<this.symbolInstancesEndIndex;a++){var s=this.symbolInstancesArray.get(a);s.textCollisionFeature={boxStartIndex:s.textBoxStartIndex,boxEndIndex:s.textBoxEndIndex},s.iconCollisionFeature={boxStartIndex:s.iconBoxStartIndex,boxEndIndex:s.iconBoxEndIndex};for(var u=0;u<2;u++){var l=s[0===u?\\\"textCollisionFeature\\\":\\\"iconCollisionFeature\\\"];if(l)for(var c=l.boxStartIndex;c<l.boxEndIndex;c++){var p=this.collisionBoxArray.get(c),f=p.anchorPoint,h=new o(p.x1,p.y1*i)._rotate(r),y=new o(p.x2,p.y1*i)._rotate(r),d=new o(p.x1,p.y2*i)._rotate(r),m=new o(p.x2,p.y2*i)._rotate(r),v=Math.max(0,Math.min(25,this.zoom+Math.log(p.maxScale)/Math.LN2)),x=Math.max(0,Math.min(25,this.zoom+Math.log(p.placementScale)/Math.LN2));this.addCollisionBoxVertex(n,f,h,v,x),this.addCollisionBoxVertex(n,f,y,v,x),this.addCollisionBoxVertex(n,f,y,v,x),this.addCollisionBoxVertex(n,f,m,v,x),this.addCollisionBoxVertex(n,f,m,v,x),this.addCollisionBoxVertex(n,f,d,v,x),this.addCollisionBoxVertex(n,f,d,v,x),this.addCollisionBoxVertex(n,f,h,v,x)}}}},r.prototype.addSymbolInstance=function(t,e,n,i,o,a,s,u,l,c,p,f,h,y,m,x,g,b,w){var A,M,P,z,I,T,V,k;if(n&&(V=a?S(t,n,f,e,o,y):[],I=new v(u,e,t,l,c,p,n,f,h,y,!1)),A=this.symbolQuadsArray.length,V&&V.length)for(var E=0;E<V.length;E++)this.addSymbolQuad(V[E]);M=this.symbolQuadsArray.length;var F=I?I.boxStartIndex:this.collisionBoxArray.length,j=I?I.boxEndIndex:this.collisionBoxArray.length;i&&(k=a?_(t,i,m,e,o,g,n,b,w):[],T=new v(u,e,t,l,c,p,i,m,x,g,!0)),P=this.symbolQuadsArray.length,k&&1===k.length&&this.addSymbolQuad(k[0]),z=this.symbolQuadsArray.length;var L=T?T.boxStartIndex:this.collisionBoxArray.length,O=T?T.boxEndIndex:this.collisionBoxArray.length;return z>r.MAX_QUADS&&d.warnOnce(\\\"Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\\\"),M>r.MAX_QUADS&&d.warnOnce(\\\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\\\"),this.symbolInstancesArray.emplaceBack(F,j,L,O,A,M,P,z,t.x,t.y,s)},r.prototype.addSymbolQuad=function(t){return this.symbolQuadsArray.emplaceBack(t.anchorPoint.x,t.anchorPoint.y,t.tl.x,t.tl.y,t.tr.x,t.tr.y,t.bl.x,t.bl.y,t.br.x,t.br.y,t.tex.h,t.tex.w,t.tex.x,t.tex.y,t.anchorAngle,t.glyphAngle,t.maxScale,t.minScale)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a,s,u,l){var c=r?.6*a*s:0,p=Math.max(r?r.right-r.left:0,o?o.right-o.left:0),f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;e-p*s<e/4&&(e=p*s+e/4);var h=2*a;return i(t,f?e/2*u%e:(p/2+h)*s*u%e,e,c,n,p*s,f,!1,l)}function i(t,e,n,r,u,l,c,p,f){for(var h=l/2,y=0,d=0;d<t.length-1;d++)y+=t[d].dist(t[d+1]);for(var m=0,v=e-n,x=[],g=0;g<t.length-1;g++){for(var b=t[g],w=t[g+1],S=b.dist(w),_=w.angleTo(b);v+n<m+S;){v+=n;var A=(v-m)/S,M=o(b.x,w.x,A),P=o(b.y,w.y,A);if(M>=0&&M<f&&P>=0&&P<f&&v-h>=0&&v+h<=y){var z=new a(M,P,_,g)._round();r&&!s(t,z,l,r,u)||x.push(z)}}m+=S}return p||x.length||c||(x=i(t,m/2,n,r,u,l,c,!0,f)),x}var o=n(17),a=n(40),s=n(88);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i){if(void 0===e.segment)return!0;for(var o=e,a=e.segment+1,s=0;s>-n/2;){if(--a<0)return!1;s-=t[a].dist(o),o=t[a]}s+=t[a].dist(t[a+1]),a++;for(var u=[],l=0;s<n/2;){var c=t[a-1],p=t[a],f=t[a+1];if(!f)return!1;var h=c.angleTo(p)-p.angleTo(f);for(h=Math.abs((h+3*Math.PI)%(2*Math.PI)-Math.PI),u.push({distance:s,angleDelta:h}),l+=h;s-u[0].distance>r;)l-=u.shift().angleDelta;if(l>i)return!1;a++,s+=p.dist(f)}return!0}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.codePoint=t,this.x=e,this.y=n,this.glyph=r}function i(t,e,n,r,i,o){this.positionedGlyphs=t,this.text=e,this.top=n,this.bottom=r,this.left=i,this.right=o}function o(t,e,n,o,s,u,l,c,p){for(var f=[],h=new i(f,t,p[1],p[1],p[0],p[0]),y=0,d=0;d<t.length;d++){var m=t.charCodeAt(d),v=e[m];v&&(f.push(new r(m,y,-17,v)),y+=v.advance+c)}return!!f.length&&(a(h,e,o,n,s,u,l,p),h)}function a(t,e,n,r,i,o,a,l){var c=null,h=0,y=0,d=0,m=0,v=t.positionedGlyphs;if(r)for(var x=0;x<v.length;x++){var g=v[x];if(g.x-=h,g.y+=n*d,g.x>r&&null!==c){var b=v[c+1].x;m=Math.max(b,m);for(var w=c+1;w<=x;w++)v[w].y+=n,v[w].x-=b;if(a){var S=c;p[v[c].codePoint]&&S--,s(v,e,y,S,a)}y=c+1,c=null,h+=b,d++}f[g.codePoint]&&(c=x)}var _=v[v.length-1],A=_.x+e[_.codePoint].advance;m=Math.max(m,A);var M=(d+1)*n;s(v,e,y,v.length-1,a),u(v,a,i,o,m,n,d,l),t.top+=-o*M,t.bottom=t.top+M,t.left+=-i*m,t.right=t.left+m}function s(t,e,n,r,i){for(var o=e[t[r].codePoint].advance,a=(t[r].x+o)*i,s=n;s<=r;s++)t[s].x-=a}function u(t,e,n,r,i,o,a,s){for(var u=(e-n)*i+s[0],l=(-r*(a+1)+.5)*o+s[1],c=0;c<t.length;c++)t[c].x+=u,t[c].y+=l}function l(t,e){if(!t||!t.rect)return null;var n=e[\\\"icon-offset\\\"][0],r=e[\\\"icon-offset\\\"][1],i=n-t.width/2,o=i+t.width,a=r-t.height/2;return new c(t,a,a+t.height,i,o)}function c(t,e,n,r,i){this.image=t,this.top=e,this.bottom=n,this.left=r,this.right=i}t.exports={shapeText:o,shapeIcon:l};var p={32:!0,8203:!0},f={32:!0,38:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){for(var r=[],o=0,a=t.length;o<a;o++){var s=i(t[o].properties,e[\\\"text-field\\\"]);if(s){s=s.toString();var u=e[\\\"text-transform\\\"];\\\"uppercase\\\"===u?s=s.toLocaleUpperCase():\\\"lowercase\\\"===u&&(s=s.toLocaleLowerCase());for(var l=0;l<s.length;l++)n[s.charCodeAt(l)]=!0;r[o]=s}else r[o]=null}return r}var i=n(41);t.exports=r},function(t,e,n){\\\"use strict\\\";t.exports=function(t,e,n){function r(r){c.push(t[r]),p.push(n[r]),f.push(e[r]),h++}function i(t,e,n){var r=l[t];return delete l[t],l[e]=r,p[r][0].pop(),p[r][0]=p[r][0].concat(n[0]),r}function o(t,e,n){var r=u[e];return delete u[e],u[t]=r,p[r][0].shift(),p[r][0]=n[0].concat(p[r][0]),r}function a(t,e,n){var r=n?e[0][e[0].length-1]:e[0][0];return t+\\\":\\\"+r.x+\\\":\\\"+r.y}var s,u={},l={},c=[],p=[],f=[],h=0;for(s=0;s<t.length;s++){var y=n[s],d=e[s];if(d){var m=a(d,y),v=a(d,y,!0);if(m in l&&v in u&&l[m]!==u[v]){var x=o(m,v,y),g=i(m,v,p[x]);delete u[m],delete l[v],l[a(d,p[g],!0)]=g,p[x]=null}else m in l?i(m,v,y):v in u?o(m,v,y):(r(s),u[m]=h-1,l[v]=h-1)}else r(s)}return{features:c,textFeatures:f,geometries:p}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){for(var a=[],s=0;s<t.length;s++)for(var u,l=t[s],c=0;c<l.length-1;c++){var p=l[c],f=l[c+1];p.x<e&&f.x<e||(p.x<e?p=new i(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round():f.x<e&&(f=new i(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round()),p.y<n&&f.y<n||(p.y<n?p=new i(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round():f.y<n&&(f=new i(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round()),p.x>=r&&f.x>=r||(p.x>=r?p=new i(r,p.y+(f.y-p.y)*((r-p.x)/(f.x-p.x)))._round():f.x>=r&&(f=new i(r,p.y+(f.y-p.y)*((r-p.x)/(f.x-p.x)))._round()),p.y>=o&&f.y>=o||(p.y>=o?p=new i(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round():f.y>=o&&(f=new i(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round()),u&&p.equals(u[u.length-1])||(u=[p],a.push(u)),u.push(f)))))}return a}var i=n(2);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a,s,u,l,c){var p=a.top*s-u,f=a.bottom*s+u,h=a.left*s-u,y=a.right*s+u;if(this.boxStartIndex=t.length,l){var d=f-p,m=y-h;if(d>0)if(d=Math.max(10*s,d),c){var v=e[n.segment+1].sub(e[n.segment])._unit()._mult(m),x=[n.sub(v),n.add(v)];this._addLineCollisionBoxes(t,x,n,0,m,d,r,i,o)}else this._addLineCollisionBoxes(t,e,n,n.segment,m,d,r,i,o)}else t.emplaceBack(n.x,n.y,h,p,y,f,1/0,r,i,o,0,0,0,0,0);this.boxEndIndex=t.length}t.exports=r,r.prototype._addLineCollisionBoxes=function(t,e,n,r,i,o,a,s,u){var l=o/2,c=Math.floor(i/l),p=-o/2,f=this.boxes,h=n,y=r+1,d=p;do{if(--y<0)return f;d-=e[y].dist(h),h=e[y]}while(d>-i/2);for(var m=e[y].dist(e[y+1]),v=0;v<c;v++){for(var x=-i/2+v*l;d+m<x;){if(d+=m,++y+1>=e.length)return f;m=e[y].dist(e[y+1])}var g=x-d,b=e[y],w=e[y+1],S=w.sub(b)._unit()._mult(g)._add(b)._round(),_=Math.max(Math.abs(x-p)-l/2,0),A=i/2/_;t.emplaceBack(S.x,S.y,-o/2,-o/2,o/2,o/2,A,a,s,u,0,0,0,0,0)}return f}},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.max-t.max}function i(t,e,n,r){this.p=new u(t,e),this.h=n,this.d=o(this.p,r),this.max=this.d+this.h*Math.SQRT2}function o(t,e){for(var n=!1,r=1/0,i=0;i<e.length;i++)for(var o=e[i],a=0,s=o.length,u=s-1;a<s;u=a++){var c=o[a],p=o[u];c.y>t.y!=p.y>t.y&&t.x<(p.x-c.x)*(t.y-c.y)/(p.y-c.y)+c.x&&(n=!n),r=Math.min(r,l(t,c,p))}return(n?1:-1)*Math.sqrt(r)}function a(t){for(var e=0,n=0,r=0,o=t[0],a=0,s=o.length,u=s-1;a<s;u=a++){var l=o[a],c=o[u],p=l.x*c.y-c.x*l.y;n+=(l.x+c.x)*p,r+=(l.y+c.y)*p,e+=3*p}return new i(n/e,r/e,0,t)}var s=n(95),u=n(2),l=n(43).distToSegmentSquared;t.exports=function(t,e,n){e=e||1;for(var o,u,l,c,p=t[0],f=0;f<p.length;f++){var h=p[f];(!f||h.x<o)&&(o=h.x),(!f||h.y<u)&&(u=h.y),(!f||h.x>l)&&(l=h.x),(!f||h.y>c)&&(c=h.y)}for(var y=l-o,d=c-u,m=Math.min(y,d),v=m/2,x=new s(null,r),g=o;g<l;g+=m)for(var b=u;b<c;b+=m)x.push(new i(g+v,b+v,v,t));for(var w=a(t),S=x.length;x.length;){var _=x.pop();_.d>w.d&&(w=_,n&&console.log(\\\"found best %d after %d probes\\\",Math.round(1e4*_.d)/1e4,S)),_.max-w.d<=e||(v=_.h/2,x.push(new i(_.p.x-v,_.p.y-v,v,t)),x.push(new i(_.p.x+v,_.p.y-v,v,t)),x.push(new i(_.p.x-v,_.p.y+v,v,t)),x.push(new i(_.p.x+v,_.p.y+v,v,t)),S+=4)}return n&&(console.log(\\\"num probes: \\\"+S),console.log(\\\"best distance: \\\"+w.d)),w.p}},function(t,e,n){\\\"use strict\\\";function r(t,e){if(!(this instanceof r))return new r(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||i,this.length>0)for(var n=(this.length>>1)-1;n>=0;n--)this._down(n)}function i(t,e){return t<e?-1:t>e?1:0}t.exports=r,t.exports.default=r,r.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,n=this.compare,r=e[t];t>0;){var i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r},_down:function(t){for(var e=this.data,n=this.compare,r=this.length>>1,i=e[t];t<r;){var o=1+(t<<1),a=o+1,s=e[o];if(a<this.length&&n(e[a],s)<0&&(o=a,s=e[a]),n(s,i)>=0)break;e[t]=s,t=o}e[t]=i}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this._vectorTileFeature=t,t._z=e,t._x=n,t._y=r,this.properties=t.properties,null!=t.id&&(this.id=t.id)}t.exports=r,r.prototype={type:\\\"Feature\\\",get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},set geometry(t){this._geometry=t},toJSON:function(){var t={};for(var e in this)\\\"_geometry\\\"!==e&&\\\"_vectorTileFeature\\\"!==e&&\\\"toJSON\\\"!==e&&(t[e]=this[e]);return t}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){if(\\\"object\\\"==typeof t){var r=t;n=e,t=r.angle,e=r.pitch,this.grid=new a(r.grid),this.ignoredGrid=new a(r.ignoredGrid)}else this.grid=new a(o,12,6),this.ignoredGrid=new a(o,12,0);this.angle=t,this.pitch=e;var i=Math.sin(t),s=Math.cos(t);if(this.rotationMatrix=[s,-i,i,s],this.reverseRotationMatrix=[s,i,-i,s],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=n,0===n.length){n.emplaceBack();n.emplaceBack(0,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(o,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,0,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,o,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=n.get(0),this.edges=[n.get(1),n.get(2),n.get(3),n.get(4)]}var i=n(2),o=n(4).EXTENT,a=n(44);t.exports=r,r.prototype.serialize=function(){var t={angle:this.angle,pitch:this.pitch,grid:this.grid.toArrayBuffer(),ignoredGrid:this.ignoredGrid.toArrayBuffer()};return{data:t,transferables:[t.grid,t.ignoredGrid]}},r.prototype.minScale=.25,r.prototype.maxScale=2,r.prototype.placeCollisionFeature=function(t,e,n){for(var r=this.collisionBoxArray,o=this.minScale,a=this.rotationMatrix,s=this.yStretch,u=t.boxStartIndex;u<t.boxEndIndex;u++){var l=r.get(u),c=l.anchorPoint._matMult(a),p=c.x,f=c.y,h=p+l.x1,y=f+l.y1*s,d=p+l.x2,m=f+l.y2*s;if(l.bbox0=h,l.bbox1=y,l.bbox2=d,l.bbox3=m,!e)for(var v=this.grid.query(h,y,d,m),x=0;x<v.length;x++){var g=r.get(v[x]),b=g.anchorPoint._matMult(a);if((o=this.getPlacementScale(o,c,l,b,g))>=this.maxScale)return o}if(n){var w;if(this.angle){var S=this.reverseRotationMatrix,_=new i(l.x1,l.y1).matMult(S),A=new i(l.x2,l.y1).matMult(S),M=new i(l.x1,l.y2).matMult(S),P=new i(l.x2,l.y2).matMult(S);w=this.tempCollisionBox,w.anchorPointX=l.anchorPoint.x,w.anchorPointY=l.anchorPoint.y,w.x1=Math.min(_.x,A.x,M.x,P.x),w.y1=Math.min(_.y,A.x,M.x,P.x),w.x2=Math.max(_.x,A.x,M.x,P.x),w.y2=Math.max(_.y,A.x,M.x,P.x),w.maxScale=l.maxScale}else w=l;for(var z=0;z<this.edges.length;z++){var I=this.edges[z];if((o=this.getPlacementScale(o,l.anchorPoint,w,I.anchorPoint,I))>=this.maxScale)return o}}}return o},r.prototype.queryRenderedSymbols=function(t,e,n,r,o){var a={},s=[],u=this.collisionBoxArray,l=this.rotationMatrix,c=new i(t,e)._matMult(l),p=this.tempCollisionBox;p.anchorX=c.x,p.anchorY=c.y,p.x1=0,p.y1=0,p.x2=n-t,p.y2=r-e,p.maxScale=o,o=p.maxScale;for(var f=[c.x+p.x1/o,c.y+p.y1/o*this.yStretch,c.x+p.x2/o,c.y+p.y2/o*this.yStretch],h=this.grid.query(f[0],f[1],f[2],f[3]),y=this.ignoredGrid.query(f[0],f[1],f[2],f[3]),d=0;d<y.length;d++)h.push(y[d]);for(var m=0;m<h.length;m++){var v=u.get(h[m]),x=v.sourceLayerIndex,g=v.featureIndex;if(void 0===a[x]&&(a[x]={}),!a[x][g]){var b=v.anchorPoint.matMult(l);this.getPlacementScale(this.minScale,c,p,b,v)>=o&&(a[x][g]=!0,s.push(h[m]))}}return s},r.prototype.getPlacementScale=function(t,e,n,r,i){var o=e.x-r.x,a=e.y-r.y,s=(i.x1-n.x2)/o,u=(i.x2-n.x1)/o,l=(i.y1-n.y2)*this.yStretch/a,c=(i.y2-n.y1)*this.yStretch/a;(isNaN(s)||isNaN(u))&&(s=u=1),(isNaN(l)||isNaN(c))&&(l=c=1);var p=Math.min(Math.max(s,u),Math.max(l,c)),f=i.maxScale,h=n.maxScale;return p>f&&(p=f),p>h&&(p=h),p>t&&p>=i.placementScale&&(t=p),t},r.prototype.insertCollisionFeature=function(t,e,n){for(var r=n?this.ignoredGrid:this.grid,i=this.collisionBoxArray,o=t.boxStartIndex;o<t.boxEndIndex;o++){var a=i.get(o);a.placementScale=e,e<this.maxScale&&r.insert(o,a.bbox0,a.bbox1,a.bbox2,a.bbox3)}}},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=t.exports=new r({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int16\\\",name:\\\"x1\\\"},{type:\\\"Int16\\\",name:\\\"y1\\\"},{type:\\\"Int16\\\",name:\\\"x2\\\"},{type:\\\"Int16\\\",name:\\\"y2\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"},{type:\\\"Int16\\\",name:\\\"bbox0\\\"},{type:\\\"Int16\\\",name:\\\"bbox1\\\"},{type:\\\"Int16\\\",name:\\\"bbox2\\\"},{type:\\\"Int16\\\",name:\\\"bbox3\\\"},{type:\\\"Float32\\\",name:\\\"placementScale\\\"}]});i.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=t.exports=new r({members:[{type:\\\"Uint16\\\",name:\\\"textBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"textBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadEndIndex\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int8\\\",name:\\\"index\\\"}]});i.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=n(42).SymbolQuad,s=t.exports=new r({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Float32\\\",name:\\\"tlX\\\"},{type:\\\"Float32\\\",name:\\\"tlY\\\"},{type:\\\"Float32\\\",name:\\\"trX\\\"},{type:\\\"Float32\\\",name:\\\"trY\\\"},{type:\\\"Float32\\\",name:\\\"blX\\\"},{type:\\\"Float32\\\",name:\\\"blY\\\"},{type:\\\"Float32\\\",name:\\\"brX\\\"},{type:\\\"Float32\\\",name:\\\"brY\\\"},{type:\\\"Int16\\\",name:\\\"texH\\\"},{type:\\\"Int16\\\",name:\\\"texW\\\"},{type:\\\"Int16\\\",name:\\\"texX\\\"},{type:\\\"Int16\\\",name:\\\"texY\\\"},{type:\\\"Float32\\\",name:\\\"anchorAngle\\\"},{type:\\\"Float32\\\",name:\\\"glyphAngle\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Float32\\\",name:\\\"minScale\\\"}]});i.extendAll(s.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)},get SymbolQuad(){return new a(this.anchorPoint,new o(this.tlX,this.tlY),new o(this.trX,this.trY),new o(this.blX,this.blY),new o(this.brX,this.brY),{x:this.texX,y:this.texY,h:this.texH,w:this.texW,height:this.texH,width:this.texW},this.anchorAngle,this.glyphAngle,this.minScale,this.maxScale)}})},function(t,e,n){\\\"use strict\\\";function r(t,e,n){n&&(this.loadGeoJSON=n),p.call(this,t,e)}var i=n(0),o=n(34),a=n(102),s=n(105),u=n(106),l=n(109),c=n(114),p=n(33);t.exports=r,r.prototype=i.inherit(p,{_geoJSONIndexes:{},loadVectorData:function(t,e){var n=t.source,r=t.coord;if(!this._geoJSONIndexes[n])return e(null,null);var i=this._geoJSONIndexes[n].getTile(Math.min(r.z,t.maxZoom),r.x,r.y);if(!i)return e(null,null);var o=new s(i.features);o.name=\\\"_geojsonTileLayer\\\";var a=u({layers:{_geojsonTileLayer:o}});0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),e(null,{tile:o,rawTileData:a.buffer})},loadData:function(t,e){var n=function(n,r){return n?e(n):\\\"object\\\"!=typeof r?e(new Error(\\\"Input data is not a valid GeoJSON object.\\\")):(a(r,!0),void this._indexData(r,t,function(n,r){if(n)return e(n);this._geoJSONIndexes[t.source]=r,e(null)}.bind(this)))}.bind(this);this.loadGeoJSON(t,n)},loadGeoJSON:function(t,e){if(t.url)o.getJSON(t.url,e);else{if(\\\"string\\\"!=typeof t.data)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));try{return e(null,JSON.parse(t.data))}catch(t){return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"))}}},_indexData:function(t,e,n){try{e.cluster?n(null,l(e.superclusterOptions).load(t.features)):n(null,c(t,e.geojsonVtOptions))}catch(t){return n(t)}}})},function(t,e,n){function r(t,e){switch(t&&t.type||null){case\\\"FeatureCollection\\\":return t.features=t.features.map(i(r,e)),t;case\\\"Feature\\\":return t.geometry=r(t.geometry,e),t;case\\\"Polygon\\\":case\\\"MultiPolygon\\\":return o(t,e);default:return t}}function i(t,e){return function(n){return t(n,e)}}function o(t,e){return\\\"Polygon\\\"===t.type?t.coordinates=a(t.coordinates,e):\\\"MultiPolygon\\\"===t.type&&(t.coordinates=t.coordinates.map(i(a,e))),t}function a(t,e){e=!!e,t[0]=s(t[0],!e);for(var n=1;n<t.length;n++)t[n]=s(t[n],e);return t}function s(t,e){return u(t)===e?t:t.reverse()}function u(t){return l.ring(t)>=0}var l=n(103);t.exports=r},function(t,e,n){function r(t){if(\\\"Polygon\\\"===t.type)return i(t.coordinates);if(\\\"MultiPolygon\\\"===t.type){for(var e=0,n=0;n<t.coordinates.length;n++)e+=i(t.coordinates[n]);return e}return null}function i(t){var e=0;if(t&&t.length>0){e+=Math.abs(o(t[0]));for(var n=1;n<t.length;n++)e-=Math.abs(o(t[n]))}return e}function o(t){var e=0;if(t.length>2){for(var n,r,i=0;i<t.length-1;i++)n=t[i],r=t[i+1],e+=a(r[0]-n[0])*(2+Math.sin(a(n[1]))+Math.sin(a(r[1])));e=e*s.RADIUS*s.RADIUS/2}return e}function a(t){return t*Math.PI/180}var s=n(104);t.exports.geometry=r,t.exports.ring=o},function(t,e){t.exports.RADIUS=6378137,t.exports.FLATTENING=1/298.257223563,t.exports.POLAR_RADIUS=6356752.3142},function(t,e,n){\\\"use strict\\\";function r(t){this.features=t,this.length=t.length,this.extent=s}function i(t){if(this.type=t.type,1===t.type){this.rawGeometry=[];for(var e=0;e<t.geometry.length;e++)this.rawGeometry.push([t.geometry[e]])}else this.rawGeometry=t.geometry;this.properties=t.tags,this.extent=s}var o=n(2),a=n(12).VectorTileFeature,s=n(4).EXTENT;t.exports=r,r.prototype.feature=function(t){return new i(this.features[t])},i.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],r=[],i=0;i<n.length;i++)r.push(new o(n[i][0],n[i][1]));this.geometry.push(r)}return this.geometry},i.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,r=1/0,i=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),r=Math.min(r,u.y),i=Math.max(i,u.y)}return[e,r,n,i]},i.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){function r(t){var e=[];for(var n in t.layers)e.push(o(t.layers[n]));var r=new c;return p.tile.write({layers:e},r),r.finish()}function i(t){var e={};for(var n in t)e[n]=new f(t[n].features),e[n].name=n;return r({layers:e})}function o(t){for(var e={name:t.name||\\\"\\\",version:t.version||1,extent:t.extent||4096,keys:[],values:[],features:[]},n={},r={},i=0;i<t.length;i++){var o=t.feature(i);o.geometry=u(o.loadGeometry());var a=[];for(var s in o.properties){var c=n[s];void 0===c&&(e.keys.push(s),c=e.keys.length-1,n[s]=c);var p=l(o.properties[s]),f=r[p.key];void 0===f&&(e.values.push(p),f=e.values.length-1,r[p.key]=f),a.push(c),a.push(f)}o.tags=a,e.features.push(o)}return e}function a(t,e){return(e<<3)+(7&t)}function s(t){return t<<1^t>>31}function u(t){for(var e=[],n=0,r=0,i=t.length,o=0;o<i;o++){var u=t[o];e.push(a(1,1));for(var l=0;l<u.length;l++){1===l&&e.push(a(2,u.length-1));var c=u[l].x-n,p=u[l].y-r;e.push(s(c),s(p)),n+=c,r+=p}}return e}function l(t){var e,n=typeof t;return\\\"string\\\"===n?e={string_value:t}:\\\"boolean\\\"===n?e={bool_value:t}:\\\"number\\\"===n?e=t%1!=0?{double_value:t}:t<0?{sint_value:t}:{uint_value:t}:(t=JSON.stringify(t),e={string_value:t}),e.key=n+\\\":\\\"+t,e}var c=n(15),p=n(107),f=n(108);t.exports=r,t.exports.fromVectorTileJs=r,t.exports.fromGeojsonVt=i,t.exports.GeoJSONWrapper=f},function(t,e,n){\\\"use strict\\\";function r(t,e){return t.readFields(i,{layers:[]},e)}function i(t,e,n){3===t&&e.layers.push(f(n,n.readVarint()+n.pos))}function o(t,e){var n;if(void 0!==t.layers)for(n=0;n<t.layers.length;n++)e.writeMessage(3,y,t.layers[n])}function a(t,e){return t.readFields(s,{},e)}function s(t,e,n){1===t?e.string_value=n.readString():2===t?e.float_value=n.readFloat():3===t?e.double_value=n.readDouble():4===t?e.int_value=n.readVarint():5===t?e.uint_value=n.readVarint():6===t?e.sint_value=n.readSVarint():7===t&&(e.bool_value=n.readBoolean())}function u(t,e){void 0!==t.string_value&&e.writeStringField(1,t.string_value),void 0!==t.float_value&&e.writeFloatField(2,t.float_value),void 0!==t.double_value&&e.writeDoubleField(3,t.double_value),void 0!==t.int_value&&e.writeVarintField(4,t.int_value),void 0!==t.uint_value&&e.writeVarintField(5,t.uint_value),void 0!==t.sint_value&&e.writeSVarintField(6,t.sint_value),void 0!==t.bool_value&&e.writeBooleanField(7,t.bool_value)}function l(t,e){var n=t.readFields(c,{},e);return void 0===n.type&&(n.type=\\\"Unknown\\\"),n}function c(t,e,n){1===t?e.id=n.readVarint():2===t?e.tags=n.readPackedVarint():3===t?e.type=n.readVarint():4===t&&(e.geometry=n.readPackedVarint())}function p(t,e){void 0!==t.id&&e.writeVarintField(1,t.id),void 0!==t.tags&&e.writePackedVarint(2,t.tags),void 0!==t.type&&e.writeVarintField(3,t.type),void 0!==t.geometry&&e.writePackedVarint(4,t.geometry)}function f(t,e){return t.readFields(h,{features:[],keys:[],values:[]},e)}function h(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():2===t?e.features.push(l(n,n.readVarint()+n.pos)):3===t?e.keys.push(n.readString()):4===t?e.values.push(a(n,n.readVarint()+n.pos)):5===t&&(e.extent=n.readVarint())}function y(t,e){void 0!==t.version&&e.writeVarintField(15,t.version),void 0!==t.name&&e.writeStringField(1,t.name);var n;if(void 0!==t.features)for(n=0;n<t.features.length;n++)e.writeMessage(2,p,t.features[n]);if(void 0!==t.keys)for(n=0;n<t.keys.length;n++)e.writeStringField(3,t.keys[n]);if(void 0!==t.values)for(n=0;n<t.values.length;n++)e.writeMessage(4,u,t.values[n]);void 0!==t.extent&&e.writeVarintField(5,t.extent)}var d=e.tile={read:r,write:o};d.GeomType={Unknown:0,Point:1,LineString:2,Polygon:3},d.value={read:a,write:u},d.feature={read:l,write:p},d.layer={read:f,write:y}},function(t,e,n){\\\"use strict\\\";function r(t){this.features=t,this.length=t.length}function i(t){this.id=\\\"number\\\"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=4096}var o=n(2),a=n(12).VectorTileFeature;t.exports=r,r.prototype.feature=function(t){return new i(this.features[t])},i.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],r=[],i=0;i<n.length;i++)r.push(new o(n[i][0],n[i][1]));this.geometry.push(r)}return this.geometry},i.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,r=1/0,i=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),r=Math.min(r,u.y),i=Math.max(i,u.y)}return[e,r,n,i]},i.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){\\\"use strict\\\";function r(t){return new i(t)}function i(t){this.options=h(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function o(t,e,n,r,i){return{x:t,y:e,zoom:1/0,id:r,properties:i,parentId:-1,numPoints:n}}function a(t,e){var n=t.geometry.coordinates;return{x:l(n[0]),y:c(n[1]),zoom:1/0,id:e,parentId:-1}}function s(t){return{type:\\\"Feature\\\",properties:u(t),geometry:{type:\\\"Point\\\",coordinates:[p(t.x),f(t.y)]}}}function u(t){var e=t.numPoints,n=e>=1e4?Math.round(e/1e3)+\\\"k\\\":e>=1e3?Math.round(e/100)/10+\\\"k\\\":e;return h(h({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:n})}function l(t){return t/360+.5}function c(t){var e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){return 360*(t-.5)}function f(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function h(t,e){for(var n in e)t[n]=e[n];return t}function y(t){return t.x}function d(t){return t.y}var m=n(110);t.exports=r,i.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,initial:function(){return{}},map:function(t){return t}},load:function(t){var e=this.options.log;e&&console.time(\\\"total time\\\");var n=\\\"prepare \\\"+t.length+\\\" points\\\";e&&console.time(n),this.points=t;var r=t.map(a);e&&console.timeEnd(n);for(var i=this.options.maxZoom;i>=this.options.minZoom;i--){var o=+Date.now();this.trees[i+1]=m(r,y,d,this.options.nodeSize,Float32Array),r=this._cluster(r,i),e&&console.log(\\\"z%d: %d clusters in %dms\\\",i,r.length,+Date.now()-o)}return this.trees[this.options.minZoom]=m(r,y,d,this.options.nodeSize,Float32Array),e&&console.timeEnd(\\\"total time\\\"),this},getClusters:function(t,e){for(var n=this.trees[this._limitZoom(e)],r=n.range(l(t[0]),c(t[3]),l(t[2]),c(t[1])),i=[],o=0;o<r.length;o++){var a=n.points[r[o]];i.push(a.numPoints?s(a):this.points[a.id])}return i},getChildren:function(t,e){for(var n=this.trees[e+1].points[t],r=this.options.radius/(this.options.extent*Math.pow(2,e)),i=this.trees[e+1].within(n.x,n.y,r),o=[],a=0;a<i.length;a++){var u=this.trees[e+1].points[i[a]];u.parentId===t&&o.push(u.numPoints?s(u):this.points[u.id])}return o},getLeaves:function(t,e,n,r){n=n||10,r=r||0;var i=[];return this._appendLeaves(i,t,e,n,r,0),i},getTile:function(t,e,n){var r=this.trees[this._limitZoom(t)],i=Math.pow(2,t),o=this.options.extent,a=this.options.radius,s=a/o,u=(n-s)/i,l=(n+1+s)/i,c={features:[]};return this._addTileFeatures(r.range((e-s)/i,u,(e+1+s)/i,l),r.points,e,n,i,c),0===e&&this._addTileFeatures(r.range(1-s/i,u,1,l),r.points,i,n,i,c),e===i-1&&this._addTileFeatures(r.range(0,u,s/i,l),r.points,-1,n,i,c),c.features.length?c:null},getClusterExpansionZoom:function(t,e){for(;e<this.options.maxZoom;){var n=this.getChildren(t,e);if(e++,1!==n.length)break;t=n[0].properties.cluster_id}return e},_appendLeaves:function(t,e,n,r,i,o){for(var a=this.getChildren(e,n),s=0;s<a.length;s++){var u=a[s].properties;if(u.cluster?o+u.point_count<=i?o+=u.point_count:o=this._appendLeaves(t,u.cluster_id,n+1,r,i,o):o<i?o++:t.push(a[s]),t.length===r)break}return o},_addTileFeatures:function(t,e,n,r,i,o){for(var a=0;a<t.length;a++){var s=e[t[a]];o.features.push({type:1,geometry:[[Math.round(this.options.extent*(s.x*i-n)),Math.round(this.options.extent*(s.y*i-r))]],tags:s.numPoints?u(s):this.points[s.id].properties})}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var n=[],r=this.options.radius/(this.options.extent*Math.pow(2,e)),i=0;i<t.length;i++){var a=t[i];if(!(a.zoom<=e)){a.zoom=e;var s=this.trees[e+1],u=s.within(a.x,a.y,r),l=a.numPoints||1,c=a.x*l,p=a.y*l,f=null;this.options.reduce&&(f=this.options.initial(),this._accumulate(f,a));for(var h=0;h<u.length;h++){var y=s.points[u[h]];if(e<y.zoom){var d=y.numPoints||1;y.zoom=e,c+=y.x*d,p+=y.y*d,l+=d,y.parentId=i,this.options.reduce&&this._accumulate(f,y)}}1===l?n.push(a):(a.parentId=i,n.push(o(c/l,p/l,l,i,f)))}}return n},_accumulate:function(t,e){var n=e.numPoints?e.properties:this.options.map(this.points[e.id].properties);this.options.reduce(t,n)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){return new i(t,e,n,r,o)}function i(t,e,n,r,i){e=e||o,n=n||a,i=i||Array,this.nodeSize=r||64,this.points=t,this.ids=new i(t.length),this.coords=new i(2*t.length);for(var u=0;u<t.length;u++)this.ids[u]=u,this.coords[2*u]=e(t[u]),this.coords[2*u+1]=n(t[u]);s(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function o(t){return t[0]}function a(t){return t[1]}var s=n(111),u=n(112),l=n(113);t.exports=r,i.prototype={range:function(t,e,n,r){return u(this.ids,this.coords,t,e,n,r,this.nodeSize)},within:function(t,e,n){return l(this.ids,this.coords,t,e,n,this.nodeSize)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,o,a,s){if(!(a-o<=n)){var u=Math.floor((o+a)/2);i(t,e,u,o,a,s%2),r(t,e,n,o,u-1,s+1),r(t,e,n,u+1,a,s+1)}}function i(t,e,n,r,a,s){for(;a>r;){if(a-r>600){var u=a-r+1,l=n-r+1,c=Math.log(u),p=.5*Math.exp(2*c/3),f=.5*Math.sqrt(c*p*(u-p)/u)*(l-u/2<0?-1:1);i(t,e,n,Math.max(r,Math.floor(n-l*p/u+f)),Math.min(a,Math.floor(n+(u-l)*p/u+f)),s)}var h=e[2*n+s],y=r,d=a;for(o(t,e,r,n),e[2*a+s]>h&&o(t,e,r,a);y<d;){for(o(t,e,y,d),y++,d--;e[2*y+s]<h;)y++;for(;e[2*d+s]>h;)d--}e[2*r+s]===h?o(t,e,r,d):(d++,o(t,e,d,a)),d<=n&&(r=d+1),n<=d&&(a=d-1)}}function o(t,e,n,r){a(t,n,r),a(e,2*n,2*r),a(e,2*n+1,2*r+1)}function a(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a){for(var s,u,l=[0,t.length-1,0],c=[];l.length;){var p=l.pop(),f=l.pop(),h=l.pop();if(f-h<=a)for(var y=h;y<=f;y++)s=e[2*y],u=e[2*y+1],s>=n&&s<=i&&u>=r&&u<=o&&c.push(t[y]);else{var d=Math.floor((h+f)/2);s=e[2*d],u=e[2*d+1],s>=n&&s<=i&&u>=r&&u<=o&&c.push(t[d]);var m=(p+1)%2;(0===p?n<=s:r<=u)&&(l.push(h),l.push(d-1),l.push(m)),(0===p?i>=s:o>=u)&&(l.push(d+1),l.push(f),l.push(m))}}return c}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a){for(var s=[0,t.length-1,0],u=[],l=o*o;s.length;){var c=s.pop(),p=s.pop(),f=s.pop();if(p-f<=a)for(var h=f;h<=p;h++)i(e[2*h],e[2*h+1],n,r)<=l&&u.push(t[h]);else{var y=Math.floor((f+p)/2),d=e[2*y],m=e[2*y+1];i(d,m,n,r)<=l&&u.push(t[y]);var v=(c+1)%2;(0===c?n-o<=d:r-o<=m)&&(s.push(f),s.push(y-1),s.push(v)),(0===c?n+o>=d:r+o>=m)&&(s.push(y+1),s.push(p),s.push(v))}}return u}function i(t,e,n,r){var i=t-n,o=e-r;return i*i+o*o}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){return new i(t,e)}function i(t,e){e=this.options=u(Object.create(this.options),e);var n=e.debug;n&&console.time(\\\"preprocess data\\\");var r=1<<e.maxZoom,i=c(t,e.tolerance/(r*e.extent));this.tiles={},this.tileCoords=[],n&&(console.timeEnd(\\\"preprocess data\\\"),console.log(\\\"index: maxZoom: %d, maxPoints: %d\\\",e.indexMaxZoom,e.indexMaxPoints),console.time(\\\"generate tiles\\\"),this.stats={},this.total=0),i=h(i,e.buffer/e.extent,a),i.length&&this.splitTile(i,0,0,0),n&&(i.length&&console.log(\\\"features: %d, points: %d\\\",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd(\\\"generate tiles\\\"),console.log(\\\"tiles generated:\\\",this.total,JSON.stringify(this.stats)))}function o(t,e,n){return 32*((1<<t)*n+e)+t}function a(t,e,n){return[n,(n-t[0])*(e[1]-t[1])/(e[0]-t[0])+t[1],1]}function s(t,e,n){return[(n-t[1])*(e[0]-t[0])/(e[1]-t[1])+t[0],n,1]}function u(t,e){for(var n in e)t[n]=e[n];return t}function l(t,e,n){var r=t.source;if(1!==r.length)return!1;var i=r[0];if(3!==i.type||i.geometry.length>1)return!1;var o=i.geometry[0].length;if(5!==o)return!1;for(var a=0;a<o;a++){var s=p.point(i.geometry[0][a],e,t.z2,t.x,t.y);if(s[0]!==-n&&s[0]!==e+n||s[1]!==-n&&s[1]!==e+n)return!1}return!0}t.exports=r;var c=n(115),p=n(117),f=n(46),h=n(118),y=n(119);i.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},i.prototype.splitTile=function(t,e,n,r,i,u,c){for(var p=[t,e,n,r],h=this.options,d=h.debug,m=null;p.length;){r=p.pop(),n=p.pop(),e=p.pop(),t=p.pop();var v=1<<e,x=o(e,n,r),g=this.tiles[x],b=e===h.maxZoom?0:h.tolerance/(v*h.extent);if(!g&&(d>1&&console.time(\\\"creation\\\"),g=this.tiles[x]=y(t,v,n,r,b,e===h.maxZoom),this.tileCoords.push({z:e,x:n,y:r}),d)){d>1&&(console.log(\\\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\\\",e,n,r,g.numFeatures,g.numPoints,g.numSimplified),console.timeEnd(\\\"creation\\\"));var w=\\\"z\\\"+e;this.stats[w]=(this.stats[w]||0)+1,this.total++}if(g.source=t,i){if(e===h.maxZoom||e===i)continue;var S=1<<i-e;if(n!==Math.floor(u/S)||r!==Math.floor(c/S))continue}else if(e===h.indexMaxZoom||g.numPoints<=h.indexMaxPoints)continue;if(h.solidChildren||!l(g,h.extent,h.buffer)){g.source=null,d>1&&console.time(\\\"clipping\\\");var _,A,M,P,z,I,T=.5*h.buffer/h.extent,V=.5-T,k=.5+T,E=1+T;_=A=M=P=null,z=f(t,v,n-T,n+k,0,a,g.min[0],g.max[0]),I=f(t,v,n+V,n+E,0,a,g.min[0],g.max[0]),z&&(_=f(z,v,r-T,r+k,1,s,g.min[1],g.max[1]),A=f(z,v,r+V,r+E,1,s,g.min[1],g.max[1])),I&&(M=f(I,v,r-T,r+k,1,s,g.min[1],g.max[1]),P=f(I,v,r+V,r+E,1,s,g.min[1],g.max[1])),d>1&&console.timeEnd(\\\"clipping\\\"),t.length&&(p.push(_||[],e+1,2*n,2*r),p.push(A||[],e+1,2*n,2*r+1),p.push(M||[],e+1,2*n+1,2*r),p.push(P||[],e+1,2*n+1,2*r+1))}else i&&(m=e)}return m},i.prototype.getTile=function(t,e,n){var r=this.options,i=r.extent,a=r.debug,s=1<<t;e=(e%s+s)%s;var u=o(t,e,n);if(this.tiles[u])return p.tile(this.tiles[u],i);a>1&&console.log(\\\"drilling down to z%d-%d-%d\\\",t,e,n);for(var c,f=t,h=e,y=n;!c&&f>0;)f--,h=Math.floor(h/2),y=Math.floor(y/2),c=this.tiles[o(f,h,y)];if(!c||!c.source)return null;if(a>1&&console.log(\\\"found parent tile z%d-%d-%d\\\",f,h,y),l(c,i,r.buffer))return p.tile(c,i);a>1&&console.time(\\\"drilling down\\\");var d=this.splitTile(c.source,f,h,y,t,e,n);if(a>1&&console.timeEnd(\\\"drilling down\\\"),null!==d){var m=1<<t-d;u=o(d,Math.floor(e/m),Math.floor(n/m))}return this.tiles[u]?p.tile(this.tiles[u],i):null}},function(t,e,n){\\\"use strict\\\";function r(t,e){var n=[];if(\\\"FeatureCollection\\\"===t.type)for(var r=0;r<t.features.length;r++)i(n,t.features[r],e);else\\\"Feature\\\"===t.type?i(n,t,e):i(n,{geometry:t},e);return n}function i(t,e,n){if(null!==e.geometry){var r,s,u,c,p=e.geometry,f=p.type,h=p.coordinates,y=e.properties,d=e.id;if(\\\"Point\\\"===f)t.push(l(y,1,[a(h)],d));else if(\\\"MultiPoint\\\"===f)t.push(l(y,1,o(h),d));else if(\\\"LineString\\\"===f)t.push(l(y,2,[o(h,n)],d));else if(\\\"MultiLineString\\\"===f||\\\"Polygon\\\"===f){for(u=[],r=0;r<h.length;r++)c=o(h[r],n),\\\"Polygon\\\"===f&&(c.outer=0===r),u.push(c);t.push(l(y,\\\"Polygon\\\"===f?3:2,u,d))}else if(\\\"MultiPolygon\\\"===f){for(u=[],r=0;r<h.length;r++)for(s=0;s<h[r].length;s++)c=o(h[r][s],n),c.outer=0===s,u.push(c);t.push(l(y,3,u,d))}else{if(\\\"GeometryCollection\\\"!==f)throw new Error(\\\"Input data is not a valid GeoJSON object.\\\");for(r=0;r<p.geometries.length;r++)i(t,{geometry:p.geometries[r],properties:y},n)}}}function o(t,e){for(var n=[],r=0;r<t.length;r++)n.push(a(t[r]));return e&&(u(n,e),s(n)),n}function a(t){var e=Math.sin(t[1]*Math.PI/180),n=t[0]/360+.5,r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r=r<0?0:r>1?1:r,[n,r,0]}function s(t){for(var e,n,r=0,i=0,o=0;o<t.length-1;o++)e=n||t[o],n=t[o+1],r+=e[0]*n[1]-n[0]*e[1],i+=Math.abs(n[0]-e[0])+Math.abs(n[1]-e[1]);t.area=Math.abs(r/2),t.dist=i}t.exports=r;var u=n(116),l=n(16)},function(t,e,n){\\\"use strict\\\";function r(t,e){var n,r,o,a,s=e*e,u=t.length,l=0,c=u-1,p=[];for(t[l][2]=1,t[c][2]=1;c;){for(r=0,n=l+1;n<c;n++)(o=i(t[n],t[l],t[c]))>r&&(a=n,r=o);r>s?(t[a][2]=r,p.push(l),p.push(a),l=a):(c=p.pop(),l=p.pop())}}function i(t,e,n){var r=e[0],i=e[1],o=n[0],a=n[1],s=t[0],u=t[1],l=o-r,c=a-i;if(0!==l||0!==c){var p=((s-r)*l+(u-i)*c)/(l*l+c*c);p>1?(r=o,i=a):p>0&&(r+=l*p,i+=c*p)}return l=s-r,c=u-i,l*l+c*c}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){if(t.transformed)return t;var n,r,o,a=t.z2,s=t.x,u=t.y;for(n=0;n<t.features.length;n++){var l=t.features[n],c=l.geometry;if(1===l.type)for(r=0;r<c.length;r++)c[r]=i(c[r],e,a,s,u);else for(r=0;r<c.length;r++){var p=c[r];for(o=0;o<p.length;o++)p[o]=i(p[o],e,a,s,u)}}return t.transformed=!0,t}function i(t,e,n,r,i){return[Math.round(e*(t[0]*n-r)),Math.round(e*(t[1]*n-i))]}e.tile=r,e.point=i},function(t,e,n){\\\"use strict\\\";function r(t,e,n){var r=t,o=a(t,1,-1-e,e,0,n,-1,2),s=a(t,1,1-e,2+e,0,n,-1,2);return(o||s)&&(r=a(t,1,-e,1+e,0,n,-1,2)||[],o&&(r=i(o,1).concat(r)),s&&(r=r.concat(i(s,-1)))),r}function i(t,e){for(var n=[],r=0;r<t.length;r++){var i,a=t[r],u=a.type;if(1===u)i=o(a.geometry,e);else{i=[];for(var l=0;l<a.geometry.length;l++)i.push(o(a.geometry[l],e))}n.push(s(a.tags,u,i,a.id))}return n}function o(t,e){var n=[];n.area=t.area,n.dist=t.dist;for(var r=0;r<t.length;r++)n.push([t[r][0]+e,t[r][1],t[r][2]]);return n}var a=n(46),s=n(16);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a){for(var s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:n,y:r,z2:e,transformed:!1,min:[2,1],max:[-1,0]},u=0;u<t.length;u++){s.numFeatures++,i(s,t[u],o,a);var l=t[u].min,c=t[u].max;l[0]<s.min[0]&&(s.min[0]=l[0]),l[1]<s.min[1]&&(s.min[1]=l[1]),c[0]>s.max[0]&&(s.max[0]=c[0]),c[1]>s.max[1]&&(s.max[1]=c[1])}return s}function i(t,e,n,r){var i,a,s,u,l=e.geometry,c=e.type,p=[],f=n*n;if(1===c)for(i=0;i<l.length;i++)p.push(l[i]),t.numPoints++,t.numSimplified++;else for(i=0;i<l.length;i++)if(s=l[i],r||!(2===c&&s.dist<n||3===c&&s.area<f)){var h=[];for(a=0;a<s.length;a++)u=s[a],(r||u[2]>f)&&(h.push(u),t.numSimplified++),t.numPoints++;3===c&&o(h,s.outer),p.push(h)}else t.numPoints+=s.length;if(p.length){var y={geometry:p,type:c,tags:e.tags||null};null!==e.id&&(y.id=e.id),t.features.push(y)}}function o(t,e){a(t)<0===e&&t.reverse()}function a(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n[0]-e[0])*(e[1]+n[1]);return r}t.exports=r}]);\\n//# sourceMappingURL=07cc73f5e73e7d2ddb99.worker.js.07cc73f5e73e7d2ddb99.map\", __webpack_require__.p + \"07cc73f5e73e7d2ddb99.worker.js\");\n};\n\n/***/ }),\n/* 1399 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(37);\nvar mat4 = __webpack_require__(90).mat4;\nvar FrameHistory = __webpack_require__(1400);\nvar SourceCache = __webpack_require__(650);\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar pixelsToTileUnits = __webpack_require__(165);\nvar util = __webpack_require__(6);\nvar StructArrayType = __webpack_require__(104);\nvar Buffer = __webpack_require__(161);\nvar VertexArrayObject = __webpack_require__(162);\nvar RasterBoundsArray = __webpack_require__(218).RasterBoundsArray;\nvar createUniformPragmas = __webpack_require__(653);\n\nmodule.exports = Painter;\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nfunction Painter(gl, transform) {\n    this.gl = gl;\n    this.transform = transform;\n\n    this.reusableTextures = {};\n    this.preFbos = {};\n\n    this.frameHistory = new FrameHistory();\n\n    this.setup();\n\n    // Within each layer there are multiple distinct z-planes that can be drawn to.\n    // This is implemented using the WebGL depth buffer.\n    this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;\n    this.depthEpsilon = 1 / Math.pow(2, 16);\n\n    this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n}\n\nutil.extend(Painter.prototype, __webpack_require__(1401));\n\n/*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\nPainter.prototype.resize = function(width, height) {\n    var gl = this.gl;\n\n    this.width = width * browser.devicePixelRatio;\n    this.height = height * browser.devicePixelRatio;\n    gl.viewport(0, 0, this.width, this.height);\n\n};\n\nPainter.prototype.setup = function() {\n    var gl = this.gl;\n\n    gl.verbose = true;\n\n    // We are blending the new pixels *behind* the existing pixels. That way we can\n    // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.enable(gl.STENCIL_TEST);\n\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n\n    this._depthMask = false;\n    gl.depthMask(false);\n\n    var PosArray = this.PosArray = new StructArrayType({\n        members: [{ name: 'a_pos', type: 'Int16', components: 2 }]\n    });\n\n    var tileExtentArray = new PosArray();\n    tileExtentArray.emplaceBack(0, 0);\n    tileExtentArray.emplaceBack(EXTENT, 0);\n    tileExtentArray.emplaceBack(0, EXTENT);\n    tileExtentArray.emplaceBack(EXTENT, EXTENT);\n    this.tileExtentBuffer = new Buffer(tileExtentArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.tileExtentVAO = new VertexArrayObject();\n    this.tileExtentPatternVAO = new VertexArrayObject();\n\n    var debugArray = new PosArray();\n    debugArray.emplaceBack(0, 0);\n    debugArray.emplaceBack(EXTENT, 0);\n    debugArray.emplaceBack(EXTENT, EXTENT);\n    debugArray.emplaceBack(0, EXTENT);\n    debugArray.emplaceBack(0, 0);\n    this.debugBuffer = new Buffer(debugArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.debugVAO = new VertexArrayObject();\n\n    var rasterBoundsArray = new RasterBoundsArray();\n    rasterBoundsArray.emplaceBack(0, 0, 0, 0);\n    rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0);\n    rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767);\n    rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767);\n    this.rasterBoundsBuffer = new Buffer(rasterBoundsArray.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n    this.rasterBoundsVAO = new VertexArrayObject();\n};\n\n/*\n * Reset the color buffers of the drawing canvas.\n */\nPainter.prototype.clearColor = function() {\n    var gl = this.gl;\n    gl.clearColor(0, 0, 0, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n};\n\n/*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\nPainter.prototype.clearStencil = function() {\n    var gl = this.gl;\n    gl.clearStencil(0x0);\n    gl.stencilMask(0xFF);\n    gl.clear(gl.STENCIL_BUFFER_BIT);\n};\n\nPainter.prototype.clearDepth = function() {\n    var gl = this.gl;\n    gl.clearDepth(1);\n    this.depthMask(true);\n    gl.clear(gl.DEPTH_BUFFER_BIT);\n};\n\nPainter.prototype._renderTileClippingMasks = function(coords) {\n    var gl = this.gl;\n    gl.colorMask(false, false, false, false);\n    this.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n    gl.enable(gl.STENCIL_TEST);\n\n    // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills.\n    gl.stencilMask(0xF8);\n    // Tests will always pass, and ref value will be written to stencil buffer.\n    gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n\n    var idNext = 1;\n    this._tileClippingMaskIDs = {};\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var id = this._tileClippingMaskIDs[coord.id] = (idNext++) << 3;\n\n        gl.stencilFunc(gl.ALWAYS, id, 0xF8);\n\n        var pragmas = createUniformPragmas([\n            {name: 'u_color', components: 4},\n            {name: 'u_opacity', components: 1}\n        ]);\n        var program = this.useProgram('fill', [], pragmas, pragmas);\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        // Draw the clipping mask\n        this.tileExtentVAO.bind(gl, program, this.tileExtentBuffer);\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.colorMask(true, true, true, true);\n    this.depthMask(true);\n    gl.enable(gl.DEPTH_TEST);\n};\n\nPainter.prototype.enableTileClippingMask = function(coord) {\n    var gl = this.gl;\n    gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8);\n};\n\n// Overridden by headless tests.\nPainter.prototype.prepareBuffers = function() {};\nPainter.prototype.bindDefaultFramebuffer = function() {\n    var gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\nvar draw = {\n    symbol: __webpack_require__(1403),\n    circle: __webpack_require__(1405),\n    line: __webpack_require__(1406),\n    fill: __webpack_require__(1407),\n    raster: __webpack_require__(218),\n    background: __webpack_require__(1408),\n    debug: __webpack_require__(1409)\n};\n\nPainter.prototype.render = function(style, options) {\n    this.style = style;\n    this.options = options;\n\n    this.lineAtlas = style.lineAtlas;\n\n    this.spriteAtlas = style.spriteAtlas;\n    this.spriteAtlas.setSprite(style.sprite);\n\n    this.glyphSource = style.glyphSource;\n\n    this.frameHistory.record(this.transform.zoom);\n\n    this.prepareBuffers();\n    this.clearColor();\n    this.clearDepth();\n\n    this.showOverdrawInspector(options.showOverdrawInspector);\n\n    this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon;\n\n    this.renderPass({isOpaquePass: true});\n    this.renderPass({isOpaquePass: false});\n};\n\nPainter.prototype.renderPass = function(options) {\n    var groups = this.style._groups;\n    var isOpaquePass = options.isOpaquePass;\n    this.currentLayer = isOpaquePass ? this.style._order.length : -1;\n\n    for (var i = 0; i < groups.length; i++) {\n        var group = groups[isOpaquePass ? groups.length - 1 - i : i];\n        var source = this.style.sources[group.source];\n\n        var j;\n        var coords = [];\n        if (source) {\n            coords = source.getVisibleCoordinates();\n            for (j = 0; j < coords.length; j++) {\n                coords[j].posMatrix = this.transform.calculatePosMatrix(coords[j], source.maxzoom);\n            }\n            this.clearStencil();\n            if (source.prepare) source.prepare();\n            if (source.isTileClipped) {\n                this._renderTileClippingMasks(coords);\n            }\n        }\n\n        if (isOpaquePass) {\n            if (!this._showOverdrawInspector) {\n                this.gl.disable(this.gl.BLEND);\n            }\n            this.isOpaquePass = true;\n        } else {\n            this.gl.enable(this.gl.BLEND);\n            this.isOpaquePass = false;\n            coords.reverse();\n        }\n\n        for (j = 0; j < group.length; j++) {\n            var layer = group[isOpaquePass ? group.length - 1 - j : j];\n            this.currentLayer += isOpaquePass ? -1 : 1;\n            this.renderLayer(this, source, layer, coords);\n        }\n\n        if (source) {\n            draw.debug(this, source, coords);\n        }\n    }\n};\n\nPainter.prototype.depthMask = function(mask) {\n    if (mask !== this._depthMask) {\n        this._depthMask = mask;\n        this.gl.depthMask(mask);\n    }\n};\n\nPainter.prototype.renderLayer = function(painter, source, layer, coords) {\n    if (layer.isHidden(this.transform.zoom)) return;\n    if (layer.type !== 'background' && !coords.length) return;\n    this.id = layer.id;\n    draw[layer.type](painter, source, layer, coords);\n};\n\nPainter.prototype.setDepthSublayer = function(n) {\n    var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n    var nearDepth = farDepth - 1 + this.depthRange;\n    this.gl.depthRange(nearDepth, farDepth);\n};\n\nPainter.prototype.translatePosMatrix = function(matrix, tile, translate, anchor) {\n    if (!translate[0] && !translate[1]) return matrix;\n\n    if (anchor === 'viewport') {\n        var sinA = Math.sin(-this.transform.angle);\n        var cosA = Math.cos(-this.transform.angle);\n        translate = [\n            translate[0] * cosA - translate[1] * sinA,\n            translate[0] * sinA + translate[1] * cosA\n        ];\n    }\n\n    var translation = [\n        pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n        pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n        0\n    ];\n\n    var translatedMatrix = new Float32Array(16);\n    mat4.translate(translatedMatrix, matrix, translation);\n    return translatedMatrix;\n};\n\nPainter.prototype.saveTexture = function(texture) {\n    var textures = this.reusableTextures[texture.size];\n    if (!textures) {\n        this.reusableTextures[texture.size] = [texture];\n    } else {\n        textures.push(texture);\n    }\n};\n\n\nPainter.prototype.getTexture = function(size) {\n    var textures = this.reusableTextures[size];\n    return textures && textures.length > 0 ? textures.pop() : null;\n};\n\nPainter.prototype.lineWidth = function(width) {\n    this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1]));\n};\n\nPainter.prototype.showOverdrawInspector = function(enabled) {\n    if (!enabled && !this._showOverdrawInspector) return;\n    this._showOverdrawInspector = enabled;\n\n    var gl = this.gl;\n    if (enabled) {\n        gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE);\n        var numOverdrawSteps = 8;\n        var a = 1 / numOverdrawSteps;\n        gl.blendColor(a, a, a, 0);\n        gl.clearColor(0, 0, 0, 1);\n        gl.clear(gl.COLOR_BUFFER_BIT);\n    } else {\n        gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    }\n};\n\n\n/***/ }),\n/* 1400 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = FrameHistory;\n\nfunction FrameHistory() {\n    this.changeTimes = new Float64Array(256);\n    this.changeOpacities = new Uint8Array(256);\n    this.opacities = new Uint8ClampedArray(256);\n    this.array = new Uint8Array(this.opacities.buffer);\n\n    this.fadeDuration = 300;\n    this.previousZoom = 0;\n    this.firstFrame = true;\n}\n\nFrameHistory.prototype.record = function(zoom) {\n    var now = Date.now();\n\n    if (this.firstFrame) {\n        now = 0;\n        this.firstFrame = false;\n    }\n\n    zoom = Math.floor(zoom * 10);\n\n    var z;\n    if (zoom < this.previousZoom) {\n        for (z = zoom + 1; z <= this.previousZoom; z++) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    } else {\n        for (z = zoom; z > this.previousZoom; z--) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    }\n\n    for (z = 0; z < 256; z++) {\n        var timeSince = now - this.changeTimes[z];\n        var opacityChange = timeSince / this.fadeDuration * 255;\n        if (z <= zoom) {\n            this.opacities[z] = this.changeOpacities[z] + opacityChange;\n        } else {\n            this.opacities[z] = this.changeOpacities[z] - opacityChange;\n        }\n    }\n\n    this.changed = true;\n    this.previousZoom = zoom;\n};\n\nFrameHistory.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        if (this.changed) {\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n            this.changed = false;\n        }\n    }\n};\n\n\n/***/ }),\n/* 1401 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar assert = __webpack_require__(35);\nvar util = __webpack_require__(6);\nvar shaders = __webpack_require__(1402);\n\nvar utilSource = shaders.util;\n\nmodule.exports._createProgram = function(name, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n    var program = gl.createProgram();\n    var definition = shaders[name];\n\n    var definesSource = '#define MAPBOX_GL_JS;\\n';\n    for (var j = 0; j < defines.length; j++) {\n        definesSource += '#define ' + defines[j] + ';\\n';\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, applyPragmas(definesSource + definition.fragmentSource, fragmentPragmas));\n    gl.compileShader(fragmentShader);\n    assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));\n    gl.attachShader(program, fragmentShader);\n\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, applyPragmas(definesSource + utilSource + definition.vertexSource, vertexPragmas));\n    gl.compileShader(vertexShader);\n    assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));\n    gl.attachShader(program, vertexShader);\n\n    gl.linkProgram(program);\n    assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program));\n\n    var attributes = {};\n    var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n    for (var i = 0; i < numAttributes; i++) {\n        var attribute = gl.getActiveAttrib(program, i);\n        attributes[attribute.name] = gl.getAttribLocation(program, attribute.name);\n    }\n\n    var uniforms = {};\n    var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n    for (var ui = 0; ui < numUniforms; ui++) {\n        var uniform = gl.getActiveUniform(program, ui);\n        uniforms[uniform.name] = gl.getUniformLocation(program, uniform.name);\n    }\n\n    return util.extend({\n        program: program,\n        definition: definition,\n        attributes: attributes,\n        numAttributes: numAttributes\n    }, attributes, uniforms);\n};\n\nmodule.exports._createProgramCached = function(name, defines, vertexPragmas, fragmentPragmas) {\n    this.cache = this.cache || {};\n\n    var key = JSON.stringify({\n        name: name,\n        defines: defines,\n        vertexPragmas: vertexPragmas,\n        fragmentPragmas: fragmentPragmas\n    });\n\n    if (!this.cache[key]) {\n        this.cache[key] = this._createProgram(name, defines, vertexPragmas, fragmentPragmas);\n    }\n    return this.cache[key];\n};\n\nmodule.exports.useProgram = function (nextProgramName, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n\n    defines = defines || [];\n    if (this._showOverdrawInspector) {\n        defines = defines.concat('OVERDRAW_INSPECTOR');\n    }\n\n    var nextProgram = this._createProgramCached(nextProgramName, defines, vertexPragmas, fragmentPragmas);\n    var previousProgram = this.currentProgram;\n\n    if (previousProgram !== nextProgram) {\n        gl.useProgram(nextProgram.program);\n        this.currentProgram = nextProgram;\n    }\n\n    return nextProgram;\n};\n\nfunction applyPragmas(source, pragmas) {\n    return source.replace(/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g, function(match, operation, precision, type, name) {\n        return pragmas[operation][name].replace(/{type}/g, type).replace(/{precision}/g, precision);\n    });\n}\n\n\n/***/ }),\n/* 1402 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar path = __webpack_require__(156);\n\n// readFileSync calls must be written out long-form for brfs.\nmodule.exports = {\n  debug: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\n\\nvoid main() {\\n    gl_FragColor = u_color;\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\\n}\\n\"\n  },\n  fill: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_FragColor = color * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n}\\n\"\n  },\n  circle: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float blur\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    float t = smoothstep(1.0 - max(blur, v_antialiasblur), 1.0, length(v_extrude));\\n    gl_FragColor = color * (1.0 - t) * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform bool u_scale_with_map;\\nuniform vec2 u_extrude_scale;\\nuniform float u_devicepixelratio;\\n\\nattribute vec2 a_pos;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main(void) {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize mediump float radius\\n    #pragma mapbox: initialize lowp float blur\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    // unencode the extrusion vector that we snuck into the a_pos vector\\n    v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\\n\\n    vec2 extrude = v_extrude * radius * u_extrude_scale;\\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\\n    // in extrusion data\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\\n\\n    if (u_scale_with_map) {\\n        gl_Position.xy += extrude;\\n    } else {\\n        gl_Position.xy += extrude * gl_Position.w;\\n    }\\n\\n    // This is a minimum blur distance that serves as a faux-antialiasing for\\n    // the circle. since blur is a ratio of the circle's size and the intent is\\n    // to keep the blur at roughly 1px, the two are inversely related.\\n    v_antialiasblur = 1.0 / u_devicepixelratio / radius;\\n}\\n\"\n  },\n  line: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp float u_opacity;\\nuniform float u_blur;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvarying vec2 v_linewidth;\\nvarying vec2 v_normal;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    gl_FragColor = color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\nuniform mediump float u_blur;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_blur;\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_fade;\\nuniform float u_opacity;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\\n    float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\\n    float y_a = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_a.y);\\n    float y_b = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_b.y);\\n    vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\\n    vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\\n\\n    vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\\n\\n    alpha *= u_opacity;\\n\\n    gl_FragColor = color * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n    v_linesofar = a_linesofar;\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linesdfpattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp float u_opacity;\\n\\nuniform float u_blur;\\nuniform sampler2D u_image;\\nuniform float u_sdfgamma;\\nuniform float u_mix;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float sdfdist_a = texture2D(u_image, v_tex_a).a;\\n    float sdfdist_b = texture2D(u_image, v_tex_b).a;\\n    float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\\n    alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\\n\\n    gl_FragColor = color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform vec2 u_patternscale_a;\\nuniform float u_tex_y_a;\\nuniform vec2 u_patternscale_b;\\nuniform float u_tex_y_b;\\nuniform float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\\n    v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  outline: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    gl_FragColor = outline_color * (alpha * opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos;\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  outlinepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    // find distance to outline for alpha interpolation\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    \\n\\n    gl_FragColor = mix(color1, color2, u_mix) * alpha * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    //\\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  pattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n\\nattribute vec2 a_pos;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    //\\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n}\\n\"\n  },\n  raster: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity0;\\nuniform float u_opacity1;\\nuniform sampler2D u_image0;\\nuniform sampler2D u_image1;\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n\\nuniform float u_brightness_low;\\nuniform float u_brightness_high;\\n\\nuniform float u_saturation_factor;\\nuniform float u_contrast_factor;\\nuniform vec3 u_spin_weights;\\n\\nvoid main() {\\n\\n    // read and cross-fade colors from the main and parent tiles\\n    vec4 color0 = texture2D(u_image0, v_pos0);\\n    vec4 color1 = texture2D(u_image1, v_pos1);\\n    vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\\n    vec3 rgb = color.rgb;\\n\\n    // spin\\n    rgb = vec3(\\n        dot(rgb, u_spin_weights.xyz),\\n        dot(rgb, u_spin_weights.zxy),\\n        dot(rgb, u_spin_weights.yzx));\\n\\n    // saturation\\n    float average = (color.r + color.g + color.b) / 3.0;\\n    rgb += (average - rgb) * u_saturation_factor;\\n\\n    // contrast\\n    rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\\n\\n    // brightness\\n    vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\\n    vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\\n\\n    gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_tl_parent;\\nuniform float u_scale_parent;\\nuniform float u_buffer_scale;\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_texture_pos;\\n\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\\n    v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\\n}\\n\"\n  },\n  icon: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\\n    gl_FragColor = texture2D(u_texture, v_tex) * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec2 a_texture_pos;\\nattribute vec4 a_data;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_rotate_with_map;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    vec2 a_tex = a_texture_pos.xy;\\n    mediump float a_labelminzoom = a_data[0];\\n    mediump vec2 a_zoom = a_data.pq;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_rotate_with_map) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  sdf: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform lowp float u_buffer;\\nuniform lowp float u_gamma;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    lowp float dist = texture2D(u_texture, v_tex).a;\\n    lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\\n    lowp float gamma = u_gamma * v_gamma_scale;\\n    lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nconst float PI = 3.141592653589793;\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec2 a_texture_pos;\\nattribute vec4 a_data;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_rotate_with_map;\\nuniform bool u_pitch_with_map;\\nuniform mediump float u_pitch;\\nuniform mediump float u_bearing;\\nuniform mediump float u_aspect_ratio;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_tex = a_texture_pos.xy;\\n    mediump float a_labelminzoom = a_data[0];\\n    mediump vec2 a_zoom = a_data.pq;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    // pitch-alignment: map\\n    // rotation-alignment: map | viewport\\n    if (u_pitch_with_map) {\\n        lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\\n        lowp float asin = sin(angle);\\n        lowp float acos = cos(angle);\\n        mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\\n        vec2 offset = RotationMatrix * a_offset;\\n        vec2 extrude = u_extrude_scale * (offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    // pitch-alignment: viewport\\n    // rotation-alignment: map\\n    } else if (u_rotate_with_map) {\\n        // foreshortening factor to apply on pitched maps\\n        // as a label goes from horizontal <=> vertical in angle\\n        // it goes from 0% foreshortening to up to around 70% foreshortening\\n        lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\\n\\n        lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\\n\\n        // use the lineangle to position points a,b along the line\\n        // project the points and calculate the label angle in projected space\\n        // this calculation allows labels to be rendered unskewed on pitched maps\\n        vec4 a = u_matrix * vec4(a_pos, 0, 1);\\n        vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\\n        lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\\n        lowp float asin = sin(angle);\\n        lowp float acos = cos(angle);\\n        mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\\n\\n        vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\\n        vec2 extrude = u_extrude_scale * (offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n        gl_Position.z += z * gl_Position.w;\\n    // pitch-alignment: viewport\\n    // rotation-alignment: viewport\\n    } else {\\n        vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_gamma_scale = (gl_Position.w - 0.5);\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  collisionbox: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_zoom;\\nuniform float u_maxzoom;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n\\n    float alpha = 0.5;\\n\\n    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n    if (v_placement_zoom > u_zoom) {\\n        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n    }\\n\\n    if (u_zoom >= v_max_zoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\\n    }\\n\\n    if (v_placement_zoom >= u_maxzoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\\n    }\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_extrude;\\nattribute vec2 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform float u_scale;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n    v_max_zoom = a_data.x;\\n    v_placement_zoom = a_data.y;\\n}\\n\"\n  }\n};\n\nmodule.exports.util = \"float evaluate_zoom_function_1(const vec4 values, const float t) {\\n    if (t < 1.0) {\\n        return mix(values[0], values[1], t);\\n    } else if (t < 2.0) {\\n        return mix(values[1], values[2], t - 1.0);\\n    } else {\\n        return mix(values[2], values[3], t - 2.0);\\n    }\\n}\\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\\n    if (t < 1.0) {\\n        return mix(value0, value1, t);\\n    } else if (t < 2.0) {\\n        return mix(value1, value2, t - 1.0);\\n    } else {\\n        return mix(value2, value3, t - 2.0);\\n    }\\n}\\n\";\n\n\n/***/ }),\n/* 1403 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(37);\nvar drawCollisionDebug = __webpack_require__(1404);\nvar pixelsToTileUnits = __webpack_require__(165);\n\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] ||\n        layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']);\n\n    var gl = painter.gl;\n\n    // Disable the stencil test so that labels aren't clipped to tile boundaries.\n    //\n    // Layers with features that may be drawn overlapping aren't clipped. These\n    // layers are sorted in the y direction, and to draw the correct ordering near\n    // tile edges the icons are included in both tiles and clipped when drawing.\n    if (drawAcrossEdges) {\n        gl.disable(gl.STENCIL_TEST);\n    } else {\n        gl.enable(gl.STENCIL_TEST);\n    }\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n\n    drawLayerSymbols(painter, source, layer, coords, false,\n            layer.paint['icon-translate'],\n            layer.paint['icon-translate-anchor'],\n            layer.layout['icon-rotation-alignment'],\n            // icon-pitch-alignment is not yet implemented\n            // and we simply inherit the rotation alignment\n            layer.layout['icon-rotation-alignment'],\n            layer.layout['icon-size'],\n            layer.paint['icon-halo-width'],\n            layer.paint['icon-halo-color'],\n            layer.paint['icon-halo-blur'],\n            layer.paint['icon-opacity'],\n            layer.paint['icon-color']);\n\n    drawLayerSymbols(painter, source, layer, coords, true,\n            layer.paint['text-translate'],\n            layer.paint['text-translate-anchor'],\n            layer.layout['text-rotation-alignment'],\n            layer.layout['text-pitch-alignment'],\n            layer.layout['text-size'],\n            layer.paint['text-halo-width'],\n            layer.paint['text-halo-color'],\n            layer.paint['text-halo-blur'],\n            layer.paint['text-opacity'],\n            layer.paint['text-color']);\n\n    gl.enable(gl.DEPTH_TEST);\n\n    if (source.map.showCollisionBoxes) {\n        drawCollisionDebug(painter, source, layer, coords);\n    }\n}\n\nfunction drawLayerSymbols(painter, source, layer, coords, isText,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        pitchAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    for (var j = 0; j < coords.length; j++) {\n        var tile = source.getTile(coords[j]);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bothBufferGroups = bucket.bufferGroups;\n        var bufferGroups = isText ? bothBufferGroups.glyph : bothBufferGroups.icon;\n        if (!bufferGroups.length) continue;\n\n        painter.enableTileClippingMask(coords[j]);\n        drawSymbol(painter, layer, coords[j].posMatrix, tile, bucket, bufferGroups, isText,\n                isText || bucket.sdfIcons, !isText && bucket.iconsNeedLinear,\n                isText ? bucket.adjustedTextSize : bucket.adjustedIconSize, bucket.fontstack,\n                translate,\n                translateAnchor,\n                rotationAlignment,\n                pitchAlignment,\n                size,\n                haloWidth,\n                haloColor,\n                haloBlur,\n                opacity,\n                color);\n    }\n}\n\nfunction drawSymbol(painter, layer, posMatrix, tile, bucket, bufferGroups, isText, sdf, iconsNeedLinear, adjustedSize, fontstack,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        pitchAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    var gl = painter.gl;\n    var tr = painter.transform;\n    var rotateWithMap = rotationAlignment === 'map';\n    var pitchWithMap = pitchAlignment === 'map';\n\n    var defaultSize = isText ? 24 : 1;\n    var fontScale = size / defaultSize;\n\n    var extrudeScale, s, gammaScale;\n    if (pitchWithMap) {\n        s = pixelsToTileUnits(tile, 1, painter.transform.zoom) * fontScale;\n        gammaScale = 1 / Math.cos(tr._pitch);\n        extrudeScale = [s, s];\n    } else {\n        s = painter.transform.altitude * fontScale;\n        gammaScale = 1;\n        extrudeScale = [ tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s];\n    }\n\n    if (!isText && !painter.style.sprite.loaded())\n        return;\n\n    var program = painter.useProgram(sdf ? 'sdf' : 'icon');\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(posMatrix, tile, translate, translateAnchor));\n    gl.uniform1i(program.u_rotate_with_map, rotateWithMap);\n    gl.uniform1i(program.u_pitch_with_map, pitchWithMap);\n    gl.uniform2fv(program.u_extrude_scale, extrudeScale);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(program.u_texture, 0);\n\n    if (isText) {\n        // use the fonstack used when parsing the tile, not the fontstack\n        // at the current zoom level (layout['text-font']).\n        var glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack);\n        if (!glyphAtlas) return;\n\n        glyphAtlas.updateTexture(gl);\n        gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4);\n    } else {\n        var mapMoving = painter.options.rotating || painter.options.zooming;\n        var iconScaled = fontScale !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear;\n        var iconTransformed = pitchWithMap || painter.transform.pitch;\n        painter.spriteAtlas.bind(gl, sdf || mapMoving || iconScaled || iconTransformed);\n        gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4);\n    }\n\n    // adjust min/max zooms for variable font sizes\n    var zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0;\n    gl.uniform1f(program.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level\n\n    gl.activeTexture(gl.TEXTURE1);\n    painter.frameHistory.bind(gl);\n    gl.uniform1i(program.u_fadetexture, 1);\n\n    var group;\n\n    if (sdf) {\n        var sdfPx = 8;\n        var blurOffset = 1.19;\n        var haloOffset = 6;\n        var gamma = 0.105 * defaultSize / size / browser.devicePixelRatio;\n\n        if (haloWidth) {\n            // Draw halo underneath the text.\n            gl.uniform1f(program.u_gamma, (haloBlur * blurOffset / fontScale / sdfPx + gamma) * gammaScale);\n            gl.uniform4fv(program.u_color, haloColor);\n            gl.uniform1f(program.u_opacity, opacity);\n            gl.uniform1f(program.u_buffer, (haloOffset - haloWidth / fontScale) / sdfPx);\n\n            for (var j = 0; j < bufferGroups.length; j++) {\n                group = bufferGroups[j];\n                group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n                gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n            }\n        }\n\n        gl.uniform1f(program.u_gamma, gamma * gammaScale);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        gl.uniform1f(program.u_buffer, (256 - 64) / 256);\n        gl.uniform1f(program.u_pitch, tr.pitch / 360 * 2 * Math.PI);\n        gl.uniform1f(program.u_bearing, tr.bearing / 360 * 2 * Math.PI);\n        gl.uniform1f(program.u_aspect_ratio, tr.width / tr.height);\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n\n    } else {\n        gl.uniform1f(program.u_opacity, opacity);\n        for (var k = 0; k < bufferGroups.length; k++) {\n            group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n/***/ }),\n/* 1404 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = drawCollisionDebug;\n\nfunction drawCollisionDebug(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n    var program = painter.useProgram('collisionbox');\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.collisionBox;\n\n        if (!bufferGroups || !bufferGroups.length) continue;\n        var group = bufferGroups[0];\n        if (group.layoutVertexBuffer.length === 0) continue;\n\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        painter.enableTileClippingMask(coord);\n\n        painter.lineWidth(1);\n        gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n        gl.uniform1f(program.u_zoom, painter.transform.zoom * 10);\n        gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10);\n\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer);\n        gl.drawArrays(gl.LINES, 0, group.layoutVertexBuffer.length);\n    }\n}\n\n\n/***/ }),\n/* 1405 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(37);\n\nmodule.exports = drawCircles;\n\nfunction drawCircles(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    // Allow circles to be drawn across boundaries, so that\n    // large circles are not clipped to tiles\n    gl.disable(gl.STENCIL_TEST);\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.circle;\n        if (!bufferGroups) continue;\n\n        var programOptions = bucket.paintAttributes.circle[layer.id];\n        var program = painter.useProgram(\n            'circle',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        if (layer.paint['circle-pitch-scale'] === 'map') {\n            gl.uniform1i(program.u_scale_with_map, true);\n            gl.uniform2f(program.u_extrude_scale,\n                painter.transform.pixelsToGLUnits[0] * painter.transform.altitude,\n                painter.transform.pixelsToGLUnits[1] * painter.transform.altitude);\n        } else {\n            gl.uniform1i(program.u_scale_with_map, false);\n            gl.uniform2fv(program.u_extrude_scale, painter.transform.pixelsToGLUnits);\n        }\n\n        gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n            coord.posMatrix,\n            tile,\n            layer.paint['circle-translate'],\n            layer.paint['circle-translate-anchor']\n        ));\n\n        bucket.setUniforms(gl, 'circle', program, layer, {zoom: painter.transform.zoom});\n\n        for (var k = 0; k < bufferGroups.length; k++) {\n            var group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n/***/ }),\n/* 1406 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar browser = __webpack_require__(37);\nvar mat2 = __webpack_require__(90).mat2;\nvar pixelsToTileUnits = __webpack_require__(165);\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    // don't draw zero-width lines\n    if (layer.paint['line-width'] <= 0) return;\n\n    for (var k = 0; k < coords.length; k++) {\n        drawLineTile(painter, source, layer, coords[k]);\n    }\n\n};\n\nfunction drawLineTile(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.line;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var programOptions = bucket.paintAttributes.line[layer.id];\n\n    // the distance over which the line edge fades out.\n    // Retina devices need a smaller distance to avoid aliasing.\n    var antialiasing = 1 / browser.devicePixelRatio;\n\n    var blur = layer.paint['line-blur'] + antialiasing;\n    var color = layer.paint['line-color'];\n\n    var tr = painter.transform;\n\n    var antialiasingMatrix = mat2.create();\n    mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]);\n    mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle);\n\n    // calculate how much longer the real world distance is at the top of the screen\n    // than at the middle of the screen.\n    var topedgelength = Math.sqrt(tr.height * tr.height / 4  * (1 + tr.altitude * tr.altitude));\n    var x = tr.height / 2 * Math.tan(tr._pitch);\n    var extra = (topedgelength + x) / topedgelength - 1;\n\n    var dasharray = layer.paint['line-dasharray'];\n    var image = layer.paint['line-pattern'];\n    var program, posA, posB, imagePosA, imagePosB;\n\n    if (dasharray) {\n        program = painter.useProgram(\n            'linesdfpattern',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n\n        posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n        posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.lineAtlas.bind(gl);\n\n        gl.uniform1f(program.u_tex_y_a, posA.y);\n        gl.uniform1f(program.u_tex_y_b, posB.y);\n        gl.uniform1f(program.u_mix, dasharray.t);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else if (image) {\n        imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n        imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n        if (!imagePosA || !imagePosB) return;\n\n        program = painter.useProgram(\n            'linepattern',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_fade, image.t);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else {\n        program = painter.useProgram(\n            'line',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n    }\n\n    painter.enableTileClippingMask(coord);\n\n    // set uniforms that are different for each tile\n    var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    var ratio = 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom);\n\n    if (dasharray) {\n        var widthA = posA.width * dasharray.fromScale;\n        var widthB = posB.width * dasharray.toScale;\n        var scaleA = [1 / pixelsToTileUnits(tile, widthA, painter.transform.tileZoom), -posA.height / 2];\n        var scaleB = [1 / pixelsToTileUnits(tile, widthB, painter.transform.tileZoom), -posB.height / 2];\n        var gamma = painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2;\n        gl.uniform1f(program.u_ratio, ratio);\n        gl.uniform2fv(program.u_patternscale_a, scaleA);\n        gl.uniform2fv(program.u_patternscale_b, scaleB);\n        gl.uniform1f(program.u_sdfgamma, gamma);\n\n    } else if (image) {\n        gl.uniform1f(program.u_ratio, ratio);\n        gl.uniform2fv(program.u_pattern_size_a, [\n            pixelsToTileUnits(tile, imagePosA.size[0] * image.fromScale, painter.transform.tileZoom),\n            imagePosB.size[1]\n        ]);\n        gl.uniform2fv(program.u_pattern_size_b, [\n            pixelsToTileUnits(tile, imagePosB.size[0] * image.toScale, painter.transform.tileZoom),\n            imagePosB.size[1]\n        ]);\n\n    } else {\n        gl.uniform1f(program.u_ratio, ratio);\n    }\n\n    bucket.setUniforms(gl, 'line', program, layer, {zoom: painter.transform.zoom});\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\n/***/ }),\n/* 1407 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar pixelsToTileUnits = __webpack_require__(165);\n\nmodule.exports = draw;\n\nfunction draw(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    var isOpaque;\n    if (layer.paint['fill-pattern']) {\n        isOpaque = false;\n    } else {\n        isOpaque = (\n            layer.isPaintValueFeatureConstant('fill-color') &&\n            layer.isPaintValueFeatureConstant('fill-opacity') &&\n            layer.paint['fill-color'][3] === 1 &&\n            layer.paint['fill-opacity'] === 1\n        );\n    }\n\n    // Draw fill\n    if (painter.isOpaquePass === isOpaque) {\n        // Once we switch to earcut drawing we can pull most of the WebGL setup\n        // outside of this coords loop.\n        painter.setDepthSublayer(1);\n        for (var i = 0; i < coords.length; i++) {\n            drawFill(painter, source, layer, coords[i]);\n        }\n    }\n\n    if (!painter.isOpaquePass && layer.paint['fill-antialias']) {\n        painter.lineWidth(2);\n        painter.depthMask(false);\n\n        var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n        if (isOutlineColorDefined || !layer.paint['fill-pattern']) {\n            if (isOutlineColorDefined) {\n                // If we defined a different color for the fill outline, we are\n                // going to ignore the bits in 0x07 and just care about the global\n                // clipping mask.\n                painter.setDepthSublayer(2);\n            } else {\n                // Otherwise, we only want to drawFill the antialiased parts that are\n                // *outside* the current shape. This is important in case the fill\n                // or stroke color is translucent. If we wouldn't clip to outside\n                // the current shape, some pixels from the outline stroke overlapped\n                // the (non-antialiased) fill.\n                painter.setDepthSublayer(0);\n            }\n        } else {\n            // Otherwise, we only want to drawFill the antialiased parts that are\n            // *outside* the current shape. This is important in case the fill\n            // or stroke color is translucent. If we wouldn't clip to outside\n            // the current shape, some pixels from the outline stroke overlapped\n            // the (non-antialiased) fill.\n            painter.setDepthSublayer(0);\n        }\n\n        for (var j = 0; j < coords.length; j++) {\n            drawStroke(painter, source, layer, coords[j]);\n        }\n    }\n}\n\nfunction drawFill(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.fill;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var image = layer.paint['fill-pattern'];\n    var program;\n\n    if (!image) {\n\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'fill',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n\n    } else {\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        setPattern(image, layer.paint['fill-opacity'], tile, coord, painter, program);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    painter.enableTileClippingMask(coord);\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.elementBuffer.length, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\nfunction drawStroke(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n\n    var gl = painter.gl;\n    var bufferGroups = bucket.bufferGroups.fill;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    var program;\n    if (image && !isOutlineColorDefined) {\n        program = painter.useProgram('outlinepattern');\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    } else {\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'outline',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n        gl.uniform1f(program.u_opacity, opacity);\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    if (image) { setPattern(image, opacity, tile, coord, painter, program); }\n\n    painter.enableTileClippingMask(coord);\n\n    for (var k = 0; k < bufferGroups.length; k++) {\n        var group = bufferGroups[k];\n        group.secondVaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer2, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.LINES, group.elementBuffer2.length * 2, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\nfunction setPattern(image, opacity, tile, coord, painter, program) {\n    var gl = painter.gl;\n\n    var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n    var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n    if (!imagePosA || !imagePosB) return;\n\n    gl.uniform1i(program.u_image, 0);\n    gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n    gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n    gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n    gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n    gl.uniform1f(program.u_opacity, opacity);\n    gl.uniform1f(program.u_mix, image.t);\n\n    gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n    gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n    gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n    gl.uniform1f(program.u_scale_a, image.fromScale);\n    gl.uniform1f(program.u_scale_b, image.toScale);\n\n    var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n    var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n    var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n    // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n    gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n    gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n\n    gl.activeTexture(gl.TEXTURE0);\n    painter.spriteAtlas.bind(gl, true);\n}\n\n\n/***/ }),\n/* 1408 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar pixelsToTileUnits = __webpack_require__(165);\nvar createUniformPragmas = __webpack_require__(653);\n\nvar tileSize = 512;\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, source, layer) {\n    var gl = painter.gl;\n    var transform = painter.transform;\n    var color = layer.paint['background-color'];\n    var image = layer.paint['background-pattern'];\n    var opacity = layer.paint['background-opacity'];\n    var program;\n\n    var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null;\n    var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null;\n\n    painter.setDepthSublayer(0);\n    if (imagePosA && imagePosB) {\n\n        if (painter.isOpaquePass) return;\n\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        gl.uniform1i(program.u_image, 0);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_opacity, opacity);\n\n        gl.uniform1f(program.u_mix, image.t);\n\n        gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n        gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n        gl.uniform1f(program.u_scale_a, image.fromScale);\n        gl.uniform1f(program.u_scale_b, image.toScale);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer);\n    } else {\n        // Draw filling rectangle.\n        if (painter.isOpaquePass !== (color[3] === 1)) return;\n\n        var pragmas = createUniformPragmas([\n            {name: 'u_color', components: 4},\n            {name: 'u_opacity', components: 1}\n        ]);\n        program = painter.useProgram('fill', [], pragmas, pragmas);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer);\n    }\n\n    gl.disable(gl.STENCIL_TEST);\n\n    // We need to draw the background in tiles in order to use calculatePosMatrix\n    // which applies the projection matrix (transform.projMatrix). Otherwise\n    // the depth and stencil buffers get into a bad state.\n    // This can be refactored into a single draw call once earcut lands and\n    // we don't have so much going on in the stencil buffer.\n    var coords = transform.coveringTiles({ tileSize: tileSize });\n    for (var c = 0; c < coords.length; c++) {\n        var coord = coords[c];\n        // var pixelsToTileUnitsBound = pixelsToTileUnits.bind({coord:coord, tileSize: tileSize});\n        if (imagePosA && imagePosB) {\n            var tile = {coord:coord, tileSize: tileSize};\n\n            gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n\n            var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n            var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n            var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n            // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n            gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n            gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n        }\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord));\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n\n\n/***/ }),\n/* 1409 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar textVertices = __webpack_require__(1410);\nvar browser = __webpack_require__(37);\nvar mat4 = __webpack_require__(90).mat4;\nvar EXTENT = __webpack_require__(42).EXTENT;\nvar Buffer = __webpack_require__(161);\nvar VertexArrayObject = __webpack_require__(162);\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, source, coords) {\n    if (painter.isOpaquePass) return;\n    if (!painter.options.debug) return;\n\n    for (var i = 0; i < coords.length; i++) {\n        drawDebugTile(painter, source, coords[i]);\n    }\n}\n\nfunction drawDebugTile(painter, source, coord) {\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n    painter.lineWidth(1 * browser.devicePixelRatio);\n\n    var posMatrix = coord.posMatrix;\n    var program = painter.useProgram('debug');\n\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.uniform4f(program.u_color, 1, 0, 0, 1);\n    painter.debugVAO.bind(gl, program, painter.debugBuffer);\n    gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length);\n\n    var vertices = textVertices(coord.toString(), 50, 200, 5);\n    var debugTextArray = new painter.PosArray();\n    for (var v = 0; v < vertices.length; v += 2) {\n        debugTextArray.emplaceBack(vertices[v], vertices[v + 1]);\n    }\n    var debugTextBuffer = new Buffer(debugTextArray.serialize(), painter.PosArray.serialize(), Buffer.BufferType.VERTEX);\n    var debugTextVAO = new VertexArrayObject();\n    debugTextVAO.bind(gl, program, debugTextBuffer);\n    gl.uniform4f(program.u_color, 1, 1, 1, 1);\n\n    // Draw the halo with multiple 1px lines instead of one wider line because\n    // the gl spec doesn't guarantee support for lines with width > 1.\n    var tileSize = source.getTile(coord).tileSize;\n    var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize);\n    var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]];\n    for (var i = 0; i < translations.length; i++) {\n        var translation = translations[i];\n        gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0]));\n        gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n    }\n\n    gl.uniform4f(program.u_color, 0, 0, 0, 1);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n}\n\n\n/***/ }),\n/* 1410 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nvar simplexFont = {\n    \" \": [16, []],\n    \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n    \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n    \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n    \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n    \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n    \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n    \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n    \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n    \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n    \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"-\": [26, [4, 9, 22, 9]],\n    \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"/\": [22, [20, 25, 2, -7]],\n    \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n    \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n    \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n    \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n    \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n    \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n    \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n    \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n    \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"<\": [24, [20, 18, 4, 9, 20, 0]],\n    \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n    \">\": [24, [4, 18, 20, 9, 4, 0]],\n    \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n    \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n    \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n    \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n    \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n    \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n    \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n    \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n    \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n    \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n    \"I\": [8, [4, 21, 4, 0]],\n    \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n    \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n    \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n    \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n    \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n    \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n    \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n    \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n    \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n    \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n    \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n    \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n    \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n    \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n    \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n    \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n    \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n    \"\\\\\": [14, [0, 21, 14, -3]],\n    \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n    \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n    \"_\": [16, [0, -2, 16, -2]],\n    \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n    \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n    \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n    \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n    \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n    \"l\": [8, [4, 21, 4, 0]],\n    \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n    \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n    \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n    \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n    \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n    \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n    \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n    \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n    \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n    \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n    \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n    \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n    \"|\": [8, [4, 25, 4, -7]],\n    \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n    \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nmodule.exports = function textVertices(text, left, baseline, scale) {\n    scale = scale || 1;\n\n    var strokes = [],\n        i, len, j, len2, glyph, x, y, prev;\n\n    for (i = 0, len = text.length; i < len; i++) {\n        glyph = simplexFont[text[i]];\n        if (!glyph) continue;\n        prev = null;\n\n        for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n            if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n                prev = null;\n\n            } else {\n                x = left + glyph[1][j] * scale;\n                y = baseline - glyph[1][j + 1] * scale;\n                if (prev) {\n                    strokes.push(prev.x, prev.y, x, y);\n                }\n                prev = {x: x, y: y};\n            }\n        }\n        left += glyph[0] * scale;\n    }\n\n    return strokes;\n};\n\n\n/***/ }),\n/* 1411 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LngLat = __webpack_require__(82),\n    Point = __webpack_require__(11),\n    Coordinate = __webpack_require__(215),\n    wrap = __webpack_require__(6).wrap,\n    interp = __webpack_require__(216),\n    TileCoord = __webpack_require__(164),\n    EXTENT = __webpack_require__(42).EXTENT,\n    glmatrix = __webpack_require__(90);\n\nvar vec4 = glmatrix.vec4,\n    mat4 = glmatrix.mat4,\n    mat2 = glmatrix.mat2;\n\nmodule.exports = Transform;\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n *\n * @param {number} minZoom\n * @param {number} maxZoom\n * @private\n */\nfunction Transform(minZoom, maxZoom) {\n    this.tileSize = 512; // constant\n\n    this._minZoom = minZoom || 0;\n    this._maxZoom = maxZoom || 22;\n\n    this.latRange = [-85.05113, 85.05113];\n\n    this.width = 0;\n    this.height = 0;\n    this._center = new LngLat(0, 0);\n    this.zoom = 0;\n    this.angle = 0;\n    this._altitude = 1.5;\n    this._pitch = 0;\n    this._unmodified = true;\n}\n\nTransform.prototype = {\n    get minZoom() { return this._minZoom; },\n    set minZoom(zoom) {\n        if (this._minZoom === zoom) return;\n        this._minZoom = zoom;\n        this.zoom = Math.max(this.zoom, zoom);\n    },\n\n    get maxZoom() { return this._maxZoom; },\n    set maxZoom(zoom) {\n        if (this._maxZoom === zoom) return;\n        this._maxZoom = zoom;\n        this.zoom = Math.min(this.zoom, zoom);\n    },\n\n    get worldSize() {\n        return this.tileSize * this.scale;\n    },\n\n    get centerPoint() {\n        return this.size._div(2);\n    },\n\n    get size() {\n        return new Point(this.width, this.height);\n    },\n\n    get bearing() {\n        return -this.angle / Math.PI * 180;\n    },\n    set bearing(bearing) {\n        var b = -wrap(bearing, -180, 180) * Math.PI / 180;\n        if (this.angle === b) return;\n        this._unmodified = false;\n        this.angle = b;\n        this._calcMatrices();\n\n        // 2x2 matrix for rotating points\n        this.rotationMatrix = mat2.create();\n        mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n    },\n\n    get pitch() {\n        return this._pitch / Math.PI * 180;\n    },\n    set pitch(pitch) {\n        var p = Math.min(60, pitch) / 180 * Math.PI;\n        if (this._pitch === p) return;\n        this._unmodified = false;\n        this._pitch = p;\n        this._calcMatrices();\n    },\n\n    get altitude() {\n        return this._altitude;\n    },\n    set altitude(altitude) {\n        var a = Math.max(0.75, altitude);\n        if (this._altitude === a) return;\n        this._unmodified = false;\n        this._altitude = a;\n        this._calcMatrices();\n    },\n\n    get zoom() { return this._zoom; },\n    set zoom(zoom) {\n        var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n        if (this._zoom === z) return;\n        this._unmodified = false;\n        this._zoom = z;\n        this.scale = this.zoomScale(z);\n        this.tileZoom = Math.floor(z);\n        this.zoomFraction = z - this.tileZoom;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get center() { return this._center; },\n    set center(center) {\n        if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n        this._unmodified = false;\n        this._center = center;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    /**\n     * Return a zoom level that will cover all tiles the transform\n     * @param {Object} options\n     * @param {number} options.tileSize\n     * @param {boolean} options.roundZoom\n     * @returns {number} zoom level\n     * @private\n     */\n    coveringZoomLevel: function(options) {\n        return (options.roundZoom ? Math.round : Math.floor)(\n            this.zoom + this.scaleZoom(this.tileSize / options.tileSize)\n        );\n    },\n\n    /**\n     * Return all coordinates that could cover this transform for a covering\n     * zoom level.\n     * @param {Object} options\n     * @param {number} options.tileSize\n     * @param {number} options.minzoom\n     * @param {number} options.maxzoom\n     * @param {boolean} options.roundZoom\n     * @param {boolean} options.reparseOverscaled\n     * @returns {Array<Tile>} tiles\n     * @private\n     */\n    coveringTiles: function(options) {\n        var z = this.coveringZoomLevel(options);\n        var actualZ = z;\n\n        if (z < options.minzoom) return [];\n        if (z > options.maxzoom) z = options.maxzoom;\n\n        var tr = this,\n            tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z),\n            centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5);\n\n        return TileCoord.cover(z, [\n            tr.pointCoordinate(new Point(0, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z),\n            tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z)\n        ], options.reparseOverscaled ? actualZ : z).sort(function(a, b) {\n            return centerPoint.dist(a) - centerPoint.dist(b);\n        });\n    },\n\n    resize: function(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.pixelsToGLUnits = [2 / width, -2 / height];\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get unmodified() { return this._unmodified; },\n\n    zoomScale: function(zoom) { return Math.pow(2, zoom); },\n    scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; },\n\n    project: function(lnglat, worldSize) {\n        return new Point(\n            this.lngX(lnglat.lng, worldSize),\n            this.latY(lnglat.lat, worldSize));\n    },\n\n    unproject: function(point, worldSize) {\n        return new LngLat(\n            this.xLng(point.x, worldSize),\n            this.yLat(point.y, worldSize));\n    },\n\n    get x() { return this.lngX(this.center.lng); },\n    get y() { return this.latY(this.center.lat); },\n\n    get point() { return new Point(this.x, this.y); },\n\n    /**\n     * latitude to absolute x coord\n     * @param {number} lon\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    lngX: function(lng, worldSize) {\n        return (180 + lng) * (worldSize || this.worldSize) / 360;\n    },\n    /**\n     * latitude to absolute y coord\n     * @param {number} lat\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    latY: function(lat, worldSize) {\n        var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n        return (180 - y) * (worldSize || this.worldSize) / 360;\n    },\n\n    xLng: function(x, worldSize) {\n        return x * 360 / (worldSize || this.worldSize) - 180;\n    },\n    yLat: function(y, worldSize) {\n        var y2 = 180 - y * 360 / (worldSize || this.worldSize);\n        return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n    },\n\n    panBy: function(offset) {\n        var point = this.centerPoint._add(offset);\n        this.center = this.pointLocation(point);\n    },\n\n    setLocationAtPoint: function(lnglat, point) {\n        var c = this.locationCoordinate(lnglat);\n        var coordAtPoint = this.pointCoordinate(point);\n        var coordCenter = this.pointCoordinate(this.centerPoint);\n        var translate = coordAtPoint._sub(c);\n        this._unmodified = false;\n        this.center = this.coordinateLocation(coordCenter._sub(translate));\n    },\n\n    /**\n     * Given a location, return the screen point that corresponds to it\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint: function(lnglat) {\n        return this.coordinatePoint(this.locationCoordinate(lnglat));\n    },\n\n    /**\n     * Given a point on screen, return its lnglat\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation: function(p) {\n        return this.coordinateLocation(this.pointCoordinate(p));\n    },\n\n    /**\n     * Given a geographical lnglat, return an unrounded\n     * coordinate that represents it at this transform's zoom level and\n     * worldsize.\n     * @param {LngLat} lnglat\n     * @returns {Coordinate}\n     * @private\n     */\n    locationCoordinate: function(lnglat) {\n        var k = this.zoomScale(this.tileZoom) / this.worldSize,\n            ll = LngLat.convert(lnglat);\n\n        return new Coordinate(\n            this.lngX(ll.lng) * k,\n            this.latY(ll.lat) * k,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a Coordinate, return its geographical position.\n     * @param {Coordinate} coord\n     * @returns {LngLat} lnglat\n     * @private\n     */\n    coordinateLocation: function(coord) {\n        var worldSize = this.zoomScale(coord.zoom);\n        return new LngLat(\n            this.xLng(coord.column, worldSize),\n            this.yLat(coord.row, worldSize));\n    },\n\n    pointCoordinate: function(p) {\n\n        var targetZ = 0;\n        // since we don't know the correct projected z value for the point,\n        // unproject two points to get a line and then find the point on that\n        // line with z=0\n\n        var coord0 = [p.x, p.y, 0, 1];\n        var coord1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse);\n        vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse);\n\n        var w0 = coord0[3];\n        var w1 = coord1[3];\n        var x0 = coord0[0] / w0;\n        var x1 = coord1[0] / w1;\n        var y0 = coord0[1] / w0;\n        var y1 = coord1[1] / w1;\n        var z0 = coord0[2] / w0;\n        var z1 = coord1[2] / w1;\n\n\n        var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n        var scale = this.worldSize / this.zoomScale(this.tileZoom);\n\n        return new Coordinate(\n            interp(x0, x1, t) / scale,\n            interp(y0, y1, t) / scale,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a coordinate, return the screen point that corresponds to it\n     * @param {Coordinate} coord\n     * @returns {Point} screen point\n     * @private\n     */\n    coordinatePoint: function(coord) {\n        var scale = this.worldSize / this.zoomScale(coord.zoom);\n        var p = [coord.column * scale, coord.row * scale, 0, 1];\n        vec4.transformMat4(p, p, this.pixelMatrix);\n        return new Point(p[0] / p[3], p[1] / p[3]);\n    },\n\n    /**\n     * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.\n     * @param {TileCoord|Coordinate} coord\n     * @param {Number} maxZoom maximum source zoom to account for overscaling\n     * @private\n     */\n    calculatePosMatrix: function(coord, maxZoom) {\n        if (maxZoom === undefined) maxZoom = Infinity;\n        if (coord instanceof TileCoord) coord = coord.toCoordinate(maxZoom);\n\n        // Initialize model-view matrix that converts from the tile coordinates to screen coordinates.\n\n        // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n        // so calculate the matrix the maxzoom tile would use.\n        var z = Math.min(coord.zoom, maxZoom);\n\n        var scale = this.worldSize / Math.pow(2, z);\n        var posMatrix = new Float64Array(16);\n\n        mat4.identity(posMatrix);\n        mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]);\n        mat4.scale(posMatrix, posMatrix, [ scale / EXTENT, scale / EXTENT, 1 ]);\n        mat4.multiply(posMatrix, this.projMatrix, posMatrix);\n\n        return new Float32Array(posMatrix);\n    },\n\n    _constrain: function() {\n        if (!this.center || !this.width || !this.height || this._constraining) return;\n\n        this._constraining = true;\n\n        var minY, maxY, minX, maxX, sy, sx, x2, y2,\n            size = this.size,\n            unmodified = this._unmodified;\n\n        if (this.latRange) {\n            minY = this.latY(this.latRange[1]);\n            maxY = this.latY(this.latRange[0]);\n            sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n        }\n\n        if (this.lngRange) {\n            minX = this.lngX(this.lngRange[0]);\n            maxX = this.lngX(this.lngRange[1]);\n            sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n        }\n\n        // how much the map should scale to fit the screen into given latitude/longitude ranges\n        var s = Math.max(sx || 0, sy || 0);\n\n        if (s) {\n            this.center = this.unproject(new Point(\n                sx ? (maxX + minX) / 2 : this.x,\n                sy ? (maxY + minY) / 2 : this.y));\n            this.zoom += this.scaleZoom(s);\n            this._unmodified = unmodified;\n            this._constraining = false;\n            return;\n        }\n\n        if (this.latRange) {\n            var y = this.y,\n                h2 = size.y / 2;\n\n            if (y - h2 < minY) y2 = minY + h2;\n            if (y + h2 > maxY) y2 = maxY - h2;\n        }\n\n        if (this.lngRange) {\n            var x = this.x,\n                w2 = size.x / 2;\n\n            if (x - w2 < minX) x2 = minX + w2;\n            if (x + w2 > maxX) x2 = maxX - w2;\n        }\n\n        // pan the map if the screen goes off the range\n        if (x2 !== undefined || y2 !== undefined) {\n            this.center = this.unproject(new Point(\n                x2 !== undefined ? x2 : this.x,\n                y2 !== undefined ? y2 : this.y));\n        }\n\n        this._unmodified = unmodified;\n        this._constraining = false;\n    },\n\n    _calcMatrices: function() {\n        if (!this.height) return;\n\n        // Find the distance from the center point to the center top in altitude units using law of sines.\n        var halfFov = Math.atan(0.5 / this.altitude);\n        var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov);\n\n        // Calculate z value of the farthest fragment that should be rendered.\n        var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude;\n\n        // matrix for conversion from location to GL coordinates (-1 .. 1)\n        var m = new Float64Array(16);\n        mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ);\n        mat4.translate(m, m, [0, 0, -this.altitude]);\n\n        // After the rotateX, z values are in pixel units. Convert them to\n        // altitude units. 1 altitude unit = the screen height.\n        mat4.scale(m, m, [1, -1, 1 / this.height]);\n\n        mat4.rotateX(m, m, this._pitch);\n        mat4.rotateZ(m, m, this.angle);\n        mat4.translate(m, m, [-this.x, -this.y, 0]);\n\n        this.projMatrix = m;\n\n        // matrix for conversion from location to screen coordinates\n        m = mat4.create();\n        mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n        mat4.translate(m, m, [1, -1, 0]);\n        this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix);\n\n        // inverse matrix for conversion from screen coordinaes to location\n        m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n        if (!m) throw new Error(\"failed to invert matrix\");\n        this.pixelMatrixInverse = m;\n    }\n};\n\n\n/***/ }),\n/* 1412 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @class mapboxgl.Hash\n * @returns {Hash} `this`\n */\nmodule.exports = Hash;\n\nvar util = __webpack_require__(6);\n\nfunction Hash() {\n    util.bindAll([\n        '_onHashChange',\n        '_updateHash'\n    ], this);\n}\n\nHash.prototype = {\n    /*\n     * Map element to listen for coordinate changes\n     *\n     * @param {Object} map\n     * @returns {Hash} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        window.addEventListener('hashchange', this._onHashChange, false);\n        this._map.on('moveend', this._updateHash);\n        return this;\n    },\n\n    /*\n     * Removes hash\n     *\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        window.removeEventListener('hashchange', this._onHashChange, false);\n        this._map.off('moveend', this._updateHash);\n        delete this._map;\n        return this;\n    },\n\n    _onHashChange: function() {\n        var loc = location.hash.replace('#', '').split('/');\n        if (loc.length >= 3) {\n            this._map.jumpTo({\n                center: [+loc[2], +loc[1]],\n                zoom: +loc[0],\n                bearing: +(loc[3] || 0)\n            });\n            return true;\n        }\n        return false;\n    },\n\n    _updateHash: function() {\n        var center = this._map.getCenter(),\n            zoom = this._map.getZoom(),\n            bearing = this._map.getBearing(),\n            precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),\n\n            hash = '#' + (Math.round(zoom * 100) / 100) +\n                '/' + center.lat.toFixed(precision) +\n                '/' + center.lng.toFixed(precision) +\n                (bearing ? '/' + (Math.round(bearing * 10) / 10) : '');\n\n        window.history.replaceState('', '', hash);\n    }\n};\n\n\n/***/ }),\n/* 1413 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48);\nvar Point = __webpack_require__(11);\n\nvar handlers = {\n    scrollZoom: __webpack_require__(1414),\n    boxZoom: __webpack_require__(1415),\n    dragRotate: __webpack_require__(1416),\n    dragPan: __webpack_require__(1417),\n    keyboard: __webpack_require__(1418),\n    doubleClickZoom: __webpack_require__(1419),\n    touchZoomRotate: __webpack_require__(1420)\n};\n\nmodule.exports = function bindHandlers(map, options) {\n    var el = map.getCanvasContainer();\n    var contextMenuEvent = null;\n    var startPos = null;\n    var tapped = null;\n\n    for (var name in handlers) {\n        map[name] = new handlers[name](map, options);\n        if (options.interactive && options[name]) {\n            map[name].enable();\n        }\n    }\n\n    el.addEventListener('mouseout', onMouseOut, false);\n    el.addEventListener('mousedown', onMouseDown, false);\n    el.addEventListener('mouseup', onMouseUp, false);\n    el.addEventListener('mousemove', onMouseMove, false);\n    el.addEventListener('touchstart', onTouchStart, false);\n    el.addEventListener('touchend', onTouchEnd, false);\n    el.addEventListener('touchmove', onTouchMove, false);\n    el.addEventListener('touchcancel', onTouchCancel, false);\n    el.addEventListener('click', onClick, false);\n    el.addEventListener('dblclick', onDblClick, false);\n    el.addEventListener('contextmenu', onContextMenu, false);\n\n    function onMouseOut(e) {\n        fireMouseEvent('mouseout', e);\n    }\n\n    function onMouseDown(e) {\n        map.stop();\n        startPos = DOM.mousePos(el, e);\n        fireMouseEvent('mousedown', e);\n    }\n\n    function onMouseUp(e) {\n        var rotating = map.dragRotate && map.dragRotate.isActive();\n\n        if (contextMenuEvent && !rotating) {\n            fireMouseEvent('contextmenu', contextMenuEvent);\n        }\n\n        contextMenuEvent = null;\n        fireMouseEvent('mouseup', e);\n    }\n\n    function onMouseMove(e) {\n        if (map.dragPan && map.dragPan.isActive()) return;\n        if (map.dragRotate && map.dragRotate.isActive()) return;\n\n        var target = e.toElement || e.target;\n        while (target && target !== el) target = target.parentNode;\n        if (target !== el) return;\n\n        fireMouseEvent('mousemove', e);\n    }\n\n    function onTouchStart(e) {\n        map.stop();\n        fireTouchEvent('touchstart', e);\n\n        if (!e.touches || e.touches.length > 1) return;\n\n        if (!tapped) {\n            tapped = setTimeout(onTouchTimeout, 300);\n\n        } else {\n            clearTimeout(tapped);\n            tapped = null;\n            fireMouseEvent('dblclick', e);\n        }\n    }\n\n    function onTouchMove(e) {\n        fireTouchEvent('touchmove', e);\n    }\n\n    function onTouchEnd(e) {\n        fireTouchEvent('touchend', e);\n    }\n\n    function onTouchCancel(e) {\n        fireTouchEvent('touchcancel', e);\n    }\n\n    function onTouchTimeout() {\n        tapped = null;\n    }\n\n    function onClick(e) {\n        var pos = DOM.mousePos(el, e);\n\n        if (pos.equals(startPos)) {\n            fireMouseEvent('click', e);\n        }\n    }\n\n    function onDblClick(e) {\n        fireMouseEvent('dblclick', e);\n        e.preventDefault();\n    }\n\n    function onContextMenu(e) {\n        contextMenuEvent = e;\n        e.preventDefault();\n    }\n\n    function fireMouseEvent(type, e) {\n        var pos = DOM.mousePos(el, e);\n\n        return map.fire(type, {\n            lngLat: map.unproject(pos),\n            point: pos,\n            originalEvent: e\n        });\n    }\n\n    function fireTouchEvent(type, e) {\n        var touches = DOM.touchPos(el, e);\n        var singular = touches.reduce(function(prev, curr, i, arr) {\n            return prev.add(curr.div(arr.length));\n        }, new Point(0, 0));\n\n        return map.fire(type, {\n            lngLat: map.unproject(singular),\n            point: singular,\n            lngLats: touches.map(function(t) { return map.unproject(t); }, this),\n            points: touches,\n            originalEvent: e\n        });\n    }\n};\n\n/**\n * @typedef {Object} MapMouseEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {MouseEvent} originalEvent\n * @property {Point} point The pixel coordinates of the mouse event target, relative to the map\n *   and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the mouse event target.\n */\n\n/**\n * @typedef {Object} MapTouchEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {TouchEvent} originalEvent\n * @property {Point} point The pixel coordinates of the center of the touch event points, relative to the map\n *   and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the center of the touch event points.\n * @property {Array<Point>} points The array of pixel coordinates corresponding to\n *   a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n *   property.\n * @property {Array<LngLat>} lngLats The geographical locations on the map corresponding to\n *   a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n *   property.\n */\n\n\n/***/ }),\n/* 1414 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48),\n    browser = __webpack_require__(37),\n    util = __webpack_require__(6);\n\nmodule.exports = ScrollZoomHandler;\n\n\nvar ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '',\n    firefox = ua.indexOf('firefox') !== -1,\n    safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.\n *\n * @class ScrollZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction ScrollZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nScrollZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"scroll to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"scroll to zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"scroll to zoom\" interaction.\n     *\n     * @example\n     *   map.scrollZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('wheel', this._onWheel, false);\n        this._el.addEventListener('mousewheel', this._onWheel, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"scroll to zoom\" interaction.\n     *\n     * @example\n     *   map.scrollZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('wheel', this._onWheel);\n        this._el.removeEventListener('mousewheel', this._onWheel);\n        this._enabled = false;\n    },\n\n    _onWheel: function (e) {\n        var value;\n\n        if (e.type === 'wheel') {\n            value = e.deltaY;\n            // Firefox doubles the values on retina screens...\n            if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n            if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n        } else if (e.type === 'mousewheel') {\n            value = -e.wheelDeltaY;\n            if (safari) value = value / 3;\n        }\n\n        var now = browser.now(),\n            timeDelta = now - (this._time || 0);\n\n        this._pos = DOM.mousePos(this._el, e);\n        this._time = now;\n\n        if (value !== 0 && (value % 4.000244140625) === 0) {\n            // This one is definitely a mouse wheel event.\n            this._type = 'wheel';\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / 4);\n\n        } else if (value !== 0 && Math.abs(value) < 4) {\n            // This one is definitely a trackpad event because it is so small.\n            this._type = 'trackpad';\n\n        } else if (timeDelta > 400) {\n            // This is likely a new scroll action.\n            this._type = null;\n            this._lastValue = value;\n\n            // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n            this._timeout = setTimeout(this._onTimeout, 40);\n\n        } else if (!this._type) {\n            // This is a repeating event, but we don't know the type of event just yet.\n            // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n            this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n            // Make sure our delayed event isn't fired again, because we accumulate\n            // the previous event (which was less than 40ms ago) into this event.\n            if (this._timeout) {\n                clearTimeout(this._timeout);\n                this._timeout = null;\n                value += this._lastValue;\n            }\n        }\n\n        // Slow down zoom if shift key is held for more precise zooming\n        if (e.shiftKey && value) value = value / 4;\n\n        // Only fire the callback if we actually know what type of scrolling device the user uses.\n        if (this._type) this._zoom(-value, e);\n\n        e.preventDefault();\n    },\n\n    _onTimeout: function () {\n        this._type = 'wheel';\n        this._zoom(-this._lastValue);\n    },\n\n    _zoom: function (delta, e) {\n        if (delta === 0) return;\n        var map = this._map;\n\n        // Scale by sigmoid of scroll wheel delta.\n        var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n        if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n        var fromScale = map.ease ? map.ease.to : map.transform.scale,\n            targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n        map.zoomTo(targetZoom, {\n            duration: 0,\n            around: map.unproject(this._pos),\n            delayEndEvents: 200\n        }, { originalEvent: e });\n    }\n};\n\n\n/**\n * Fired just before the map begins a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomstart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoom\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired just after the map completes a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n/***/ }),\n/* 1415 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48),\n    LngLatBounds = __webpack_require__(219),\n    util = __webpack_require__(6);\n\nmodule.exports = BoxZoomHandler;\n\n/**\n * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.\n * The bounding box is defined by clicking and holding `shift` while dragging the cursor.\n *\n * @class BoxZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction BoxZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._container = map.getContainer();\n\n    util.bindHandlers(this);\n}\n\nBoxZoomHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"box zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"box zoom\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"box zoom\" interaction.\n     *\n     * @example\n     *   map.boxZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onMouseDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"box zoom\" interaction.\n     *\n     * @example\n     *   map.boxZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onMouseDown);\n        this._enabled = false;\n    },\n\n    _onMouseDown: function (e) {\n        if (!(e.shiftKey && e.button === 0)) return;\n\n        document.addEventListener('mousemove', this._onMouseMove, false);\n        document.addEventListener('keydown', this._onKeyDown, false);\n        document.addEventListener('mouseup', this._onMouseUp, false);\n\n        DOM.disableDrag();\n        this._startPos = DOM.mousePos(this._el, e);\n        this._active = true;\n    },\n\n    _onMouseMove: function (e) {\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e);\n\n        if (!this._box) {\n            this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n            this._container.classList.add('mapboxgl-crosshair');\n            this._fireEvent('boxzoomstart', e);\n        }\n\n        var minX = Math.min(p0.x, p1.x),\n            maxX = Math.max(p0.x, p1.x),\n            minY = Math.min(p0.y, p1.y),\n            maxY = Math.max(p0.y, p1.y);\n\n        DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)');\n\n        this._box.style.width = (maxX - minX) + 'px';\n        this._box.style.height = (maxY - minY) + 'px';\n    },\n\n    _onMouseUp: function (e) {\n        if (e.button !== 0) return;\n\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e),\n            bounds = new LngLatBounds(this._map.unproject(p0), this._map.unproject(p1));\n\n        this._finish();\n\n        if (p0.x === p1.x && p0.y === p1.y) {\n            this._fireEvent('boxzoomcancel', e);\n        } else {\n            this._map\n                .fitBounds(bounds, {linear: true})\n                .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds });\n        }\n    },\n\n    _onKeyDown: function (e) {\n        if (e.keyCode === 27) {\n            this._finish();\n            this._fireEvent('boxzoomcancel', e);\n        }\n    },\n\n    _finish: function () {\n        this._active = false;\n\n        document.removeEventListener('mousemove', this._onMouseMove, false);\n        document.removeEventListener('keydown', this._onKeyDown, false);\n        document.removeEventListener('mouseup', this._onMouseUp, false);\n\n        this._container.classList.remove('mapboxgl-crosshair');\n\n        if (this._box) {\n            this._box.parentNode.removeChild(this._box);\n            this._box = null;\n        }\n\n        DOM.enableDrag();\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    }\n};\n\n/**\n * @typedef {Object} MapBoxZoomEvent\n * @property {MouseEvent} originalEvent\n * @property {LngLatBounds} boxZoomBounds The bounding box of the \"box zoom\" interaction.\n *   This property is only provided for `boxzoomend` events.\n */\n\n/**\n * Fired when a \"box zoom\" interaction starts. See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomstart\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when a \"box zoom\" interaction ends.  See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomend\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when the user cancels a \"box zoom\" interaction, or when the bounding box does not meet the minimum size threshold.\n * See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomcancel\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n\n\n/***/ }),\n/* 1416 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48),\n    Point = __webpack_require__(11),\n    util = __webpack_require__(6);\n\nmodule.exports = DragRotateHandler;\n\nvar inertiaLinearity = 0.25,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 180, // deg/s\n    inertiaDeceleration = 720; // deg/s^2\n\n\n/**\n * The `DragRotateHandler` allows the user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or `ctrl` key.\n *\n * @class DragRotateHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n * @param {Object} [options]\n * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's\n *   bearing (rotation) will snap to north.\n */\nfunction DragRotateHandler(map, options) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._bearingSnap = options.bearingSnap;\n\n    util.bindHandlers(this);\n}\n\nDragRotateHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"drag to rotate\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"drag to rotate\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        document.addEventListener('mousemove', this._onMove);\n        document.addEventListener('mouseup', this._onUp);\n\n        this._active = false;\n        this._inertia = [[Date.now(), this._map.getBearing()]];\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._center = this._map.transform.centerPoint;  // Center of rotation\n\n        // If the first click was too close to the center, move the center of rotation by 200 pixels\n        // in the direction of the click.\n        var startToCenter = this._startPos.sub(this._center),\n            startToCenterDist = startToCenter.mag();\n\n        if (startToCenterDist < 200) {\n            this._center = this._startPos.add(new Point(-200, 0)._rotate(startToCenter.angle()));\n        }\n\n        e.preventDefault();\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('rotatestart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var map = this._map;\n        map.stop();\n\n        var p1 = this._pos,\n            p2 = DOM.mousePos(this._el, e),\n            center = this._center,\n            bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180,\n            bearing = map.getBearing() - bearingDiff,\n            inertia = this._inertia,\n            last = inertia[inertia.length - 1];\n\n        this._drainInertiaBuffer();\n        inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]);\n\n        map.transform.bearing = bearing;\n\n        this._fireEvent('rotate', e);\n        this._fireEvent('move', e);\n\n        this._pos = p2;\n    },\n\n    _onUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onUp);\n\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('rotateend', e);\n        this._drainInertiaBuffer();\n\n        var map = this._map,\n            mapBearing = map.getBearing(),\n            inertia = this._inertia;\n\n        var finish = function() {\n            if (Math.abs(mapBearing) < this._bearingSnap) {\n                map.resetNorth({noMoveStart: true}, { originalEvent: e });\n            } else {\n                this._fireEvent('moveend', e);\n            }\n        }.bind(this);\n\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var first = inertia[0],\n            last = inertia[inertia.length - 1],\n            previous = inertia[inertia.length - 2],\n            bearing = map._normalizeBearing(mapBearing, previous[1]),\n            flingDiff = last[1] - first[1],\n            sign = flingDiff < 0 ? -1 : 1,\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDiff === 0 || flingDuration === 0) {\n            finish();\n            return;\n        }\n\n        var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration));  // deg/s\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = sign * speed * (duration / 2);\n\n        bearing += offset;\n\n        if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) {\n            bearing = map._normalizeBearing(0, bearing);\n        }\n\n        map.rotateTo(bearing, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragPan && map.dragPan.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            var buttons = (e.ctrlKey ? 1 : 2),  // ? ctrl+left button : right button\n                button = (e.ctrlKey ? 0 : 2);   // ? ctrl+left button : right button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   //msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff)\n            inertia.shift();\n    }\n\n};\n\n\n/**\n * Fired when a \"drag to rotate\" interaction starts. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotatestart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during a \"drag to rotate\" interaction. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotate\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to rotate\" interaction ends. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotateend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n/***/ }),\n/* 1417 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48),\n    util = __webpack_require__(6);\n\nmodule.exports = DragPanHandler;\n\nvar inertiaLinearity = 0.3,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 1400, // px/s\n    inertiaDeceleration = 2500; // px/s^2\n\n\n/**\n * The `DragPanHandler` allows the user to pan the map by clicking and dragging\n * the cursor.\n *\n * @class DragPanHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction DragPanHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nDragPanHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"drag to pan\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"drag to pan\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"drag to pan\" interaction.\n     *\n     * @example\n     * map.dragPan.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._el.addEventListener('touchstart', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"drag to pan\" interaction.\n     *\n     * @example\n     * map.dragPan.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._el.removeEventListener('touchstart', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        if (e.touches) {\n            document.addEventListener('touchmove', this._onMove);\n            document.addEventListener('touchend', this._onTouchEnd);\n        } else {\n            document.addEventListener('mousemove', this._onMove);\n            document.addEventListener('mouseup', this._onMouseUp);\n        }\n\n        this._active = false;\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._inertia = [[Date.now(), this._pos]];\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('dragstart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var pos = DOM.mousePos(this._el, e),\n            map = this._map;\n\n        map.stop();\n        this._drainInertiaBuffer();\n        this._inertia.push([Date.now(), pos]);\n\n        map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n\n        this._fireEvent('drag', e);\n        this._fireEvent('move', e);\n\n        this._pos = pos;\n\n        e.preventDefault();\n    },\n\n    _onUp: function (e) {\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('dragend', e);\n        this._drainInertiaBuffer();\n\n        var finish = function() {\n            this._fireEvent('moveend', e);\n        }.bind(this);\n\n        var inertia = this._inertia;\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            flingOffset = last[1].sub(first[1]),\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDuration === 0 || last[1].equals(first[1])) {\n            finish();\n            return;\n        }\n\n        // calculate px/s velocity & adjust for increased initial animation speed when easing out\n        var velocity = flingOffset.mult(inertiaLinearity / flingDuration),\n            speed = velocity.mag(); // px/s\n\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n            velocity._unit()._mult(speed);\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = velocity.mult(-duration / 2);\n\n        this._map.panBy(offset, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _onMouseUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onMouseUp);\n    },\n\n    _onTouchEnd: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onTouchEnd);\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragRotate && map.dragRotate.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            if (e.ctrlKey) return true;\n            var buttons = 1,  // left button\n                button = 0;   // left button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   // msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/**\n * Fired when a \"drag to pan\" interaction starts. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragstart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during a \"drag to pan\" interaction. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event drag\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to pan\" interaction ends. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n/***/ }),\n/* 1418 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = KeyboardHandler;\n\n\nvar panDelta = 80,\n    rotateDelta = 2,\n    pitchDelta = 5;\n\n/**\n * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using\n * the following keyboard shortcuts:\n *\n * - `=` / `+`: Increase the zoom level by 1.\n * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.\n * - `-`: Decrease the zoom level by 1.\n * - `Shift--`: Decrease the zoom level by 2.\n * - Arrow keys: Pan by 80 pixels.\n * - `Shift+⇢`: Increase the rotation by 2 degrees.\n * - `Shift+⇠`: Decrease the rotation by 2 degrees.\n * - `Shift+⇡`: Increase the pitch by 5 degrees.\n * - `Shift+⇣`: Decrease the pitch by 5 degrees.\n *\n * @class KeyboardHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction KeyboardHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    this._onKeyDown = this._onKeyDown.bind(this);\n}\n\nKeyboardHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether keyboard interaction is enabled.\n     *\n     * @returns {boolean} `true` if keyboard interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables keyboard interaction.\n     *\n     * @example\n     * map.keyboard.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('keydown', this._onKeyDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables keyboard interaction.\n     *\n     * @example\n     * map.keyboard.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('keydown', this._onKeyDown);\n        this._enabled = false;\n    },\n\n    _onKeyDown: function (e) {\n        if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n        var map = this._map,\n            eventData = { originalEvent: e };\n\n        if (map.isEasing()) return;\n\n        switch (e.keyCode) {\n        case 61:\n        case 107:\n        case 171:\n        case 187:\n            map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 189:\n        case 109:\n        case 173:\n            map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 37:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() - rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([-panDelta, 0], eventData);\n            }\n            break;\n\n        case 39:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() + rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([panDelta, 0], eventData);\n            }\n            break;\n\n        case 38:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: map.getPitch() + pitchDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, -panDelta], eventData);\n            }\n            break;\n\n        case 40:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: Math.max(map.getPitch() - pitchDelta, 0) }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, panDelta], eventData);\n            }\n            break;\n        }\n    }\n};\n\n\n/***/ }),\n/* 1419 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = DoubleClickZoomHandler;\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by\n * double clicking.\n *\n * @class DoubleClickZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction DoubleClickZoomHandler(map) {\n    this._map = map;\n    this._onDblClick = this._onDblClick.bind(this);\n}\n\nDoubleClickZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"double click to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"double click to zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._map.on('dblclick', this._onDblClick);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._map.off('dblclick', this._onDblClick);\n        this._enabled = false;\n    },\n\n    _onDblClick: function (e) {\n        this._map.zoomTo(\n            this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1),\n            {around: e.lngLat},\n            e\n        );\n    }\n};\n\n\n/***/ }),\n/* 1420 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar DOM = __webpack_require__(48),\n    util = __webpack_require__(6);\n\nmodule.exports = TouchZoomRotateHandler;\n\nvar inertiaLinearity = 0.15,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaDeceleration = 12, // scale / s^2\n    inertiaMaxSpeed = 2.5, // scale / s\n    significantScaleThreshold = 0.15,\n    significantRotateThreshold = 4;\n\n\n/**\n * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by\n * pinching on a touchscreen.\n *\n * @class TouchZoomRotateHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction TouchZoomRotateHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nTouchZoomRotateHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"pinch to rotate and zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"pinch to rotate and zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('touchstart', this._onStart, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('touchstart', this._onStart);\n        this._enabled = false;\n    },\n\n    /**\n     * Disables the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n     * interaction enabled.\n     *\n     * @example\n     *   map.touchZoomRotate.disableRotation();\n     */\n    disableRotation: function() {\n        this._rotationDisabled = true;\n    },\n\n    /**\n     * Enables the \"pinch to rotate\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.enable();\n     *   map.touchZoomRotate.enableRotation();\n     */\n    enableRotation: function() {\n        this._rotationDisabled = false;\n    },\n\n    _onStart: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]);\n\n        this._startVec = p0.sub(p1);\n        this._startScale = this._map.transform.scale;\n        this._startBearing = this._map.transform.bearing;\n        this._gestureIntent = undefined;\n        this._inertia = [];\n\n        document.addEventListener('touchmove', this._onMove, false);\n        document.addEventListener('touchend', this._onEnd, false);\n    },\n\n    _onMove: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]),\n            p = p0.add(p1).div(2),\n            vec = p0.sub(p1),\n            scale = vec.mag() / this._startVec.mag(),\n            bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI,\n            map = this._map;\n\n        // Determine 'intent' by whichever threshold is surpassed first,\n        // then keep that state for the duration of this gesture.\n        if (!this._gestureIntent) {\n            var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold),\n                rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold);\n\n            if (rotatingSignificantly) {\n                this._gestureIntent = 'rotate';\n            } else if (scalingSignificantly) {\n                this._gestureIntent = 'zoom';\n            }\n\n            if (this._gestureIntent) {\n                this._startVec = vec;\n                this._startScale = map.transform.scale;\n                this._startBearing = map.transform.bearing;\n            }\n\n        } else {\n            var param = { duration: 0, around: map.unproject(p) };\n\n            if (this._gestureIntent === 'rotate') {\n                param.bearing = this._startBearing + bearing;\n            }\n            if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') {\n                param.zoom = map.transform.scaleZoom(this._startScale * scale);\n            }\n\n            map.stop();\n            this._drainInertiaBuffer();\n            this._inertia.push([Date.now(), scale, p]);\n\n            map.easeTo(param, { originalEvent: e });\n        }\n\n        e.preventDefault();\n    },\n\n    _onEnd: function (e) {\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onEnd);\n        this._drainInertiaBuffer();\n\n        var inertia = this._inertia,\n            map = this._map;\n\n        if (inertia.length < 2) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            lastScale = map.transform.scaleZoom(this._startScale * last[1]),\n            firstScale = map.transform.scaleZoom(this._startScale * first[1]),\n            scaleOffset = lastScale - firstScale,\n            scaleDuration = (last[0] - first[0]) / 1000,\n            p = last[2];\n\n        if (scaleDuration === 0 || lastScale === firstScale) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        // calculate scale/s speed and adjust for increased initial animation speed when easing\n        var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s\n\n        if (Math.abs(speed) > inertiaMaxSpeed) {\n            if (speed > 0) {\n                speed = inertiaMaxSpeed;\n            } else {\n                speed = -inertiaMaxSpeed;\n            }\n        }\n\n        var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000,\n            targetScale = lastScale + speed * duration / 2000;\n\n        if (targetScale < 0) {\n            targetScale = 0;\n        }\n\n        map.easeTo({\n            zoom: targetScale,\n            duration: duration,\n            easing: inertiaEasing,\n            around: map.unproject(p)\n        }, { originalEvent: e });\n    },\n\n    _drainInertiaBuffer: function() {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160; // msec\n\n        while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/***/ }),\n/* 1421 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(6);\nvar interpolate = __webpack_require__(216);\nvar browser = __webpack_require__(37);\nvar LngLat = __webpack_require__(82);\nvar LngLatBounds = __webpack_require__(219);\nvar Point = __webpack_require__(11);\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo},\n * controlling the destination's location, zoom level, bearing, and pitch.\n * All properties are optional. Unspecified\n * options will default to the map's current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLatLike} center The destination's center.\n * @property {number} zoom The destination's zoom level.\n * @property {number} bearing The destination's bearing (rotation), measured in degrees counter-clockwise from north.\n * @property {number} pitch The destination's pitch (tilt), measured in degrees.\n * @property {LngLatLike} around If a `zoom` is specified, `around` determines the zoom center (defaults to the center of the map).\n */\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration The animation's duration, measured in milliseconds.\n * @property {Function} easing The animation's easing function.\n * @property {PointLike} offset `x` and `y` coordinates representing the animation's origin of movement relative to the map's center.\n * @property {boolean} animate If `false`, no animation will occur.\n */\n\nvar Camera = module.exports = function() {};\n\nutil.extend(Camera.prototype, /** @lends Map.prototype */{\n    /**\n     * Returns the map's geographical centerpoint.\n     *\n     * @returns {LngLat} The map's geographical centerpoint.\n     */\n    getCenter: function() { return this.transform.center; },\n\n    /**\n     * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.\n     *\n     * @param {LngLatLike} center The centerpoint to set.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * map.setCenter([-74, 38]);\n     */\n    setCenter: function(center, eventData) {\n        this.jumpTo({center: center}, eventData);\n        return this;\n    },\n\n    /**\n     * Pans the map by the specified offest.\n     *\n     * @param {Array<number>} offset `x` and `y` coordinates by which to pan the map.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panBy: function(offset, options, eventData) {\n        this.panTo(this.transform.center,\n            util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Pans the map to the specified location, with an animated transition.\n     *\n     * @param {LngLatLike} lnglat The location to pan the map to.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panTo: function(lnglat, options, eventData) {\n        return this.easeTo(util.extend({\n            center: lnglat\n        }, options), eventData);\n    },\n\n\n    /**\n     * Returns the map's current zoom level.\n     *\n     * @returns {number} The map's current zoom level.\n     */\n    getZoom: function() { return this.transform.zoom; },\n\n    /**\n     * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.\n     *\n     * @param {number} zoom The zoom level to set (0-20).\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     * @example\n     * // zoom the map to 5\n     * map.setZoom(5);\n     */\n    setZoom: function(zoom, eventData) {\n        this.jumpTo({zoom: zoom}, eventData);\n        return this;\n    },\n\n    /**\n     * Zooms the map to the specified zoom level, with an animated transition.\n     *\n     * @param {number} zoom The zoom level to transition to.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomTo: function(zoom, options, eventData) {\n        return this.easeTo(util.extend({\n            zoom: zoom\n        }, options), eventData);\n    },\n\n    /**\n     * Increases the map's zoom level by 1.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomIn: function(options, eventData) {\n        this.zoomTo(this.getZoom() + 1, options, eventData);\n        return this;\n    },\n\n    /**\n     * Decreases the map's zoom level by 1.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomOut: function(options, eventData) {\n        this.zoomTo(this.getZoom() - 1, options, eventData);\n        return this;\n    },\n\n\n    /**\n     * Returns the map's current bearing (rotation).\n     *\n     * @returns {number} The map's current bearing, measured in degrees counter-clockwise from north.\n     */\n    getBearing: function() { return this.transform.bearing; },\n\n    /**\n     * Sets the maps' bearing (rotation). Equivalent to `jumpTo({bearing: bearing})`.\n     *\n     * @param {number} bearing The bearing to set, measured in degrees counter-clockwise from north.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // rotate the map to 90 degrees\n     * map.setBearing(90);\n     */\n    setBearing: function(bearing, eventData) {\n        this.jumpTo({bearing: bearing}, eventData);\n        return this;\n    },\n\n    /**\n     * Rotates the map to the specified bearing, with an animated transition.\n     *\n     * @param {number} bearing The bearing to rotate the map to, measured in degrees counter-clockwise from north.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    rotateTo: function(bearing, options, eventData) {\n        return this.easeTo(util.extend({\n            bearing: bearing\n        }, options), eventData);\n    },\n\n    /**\n     * Rotates the map to a bearing of 0 (due north), with an animated transition.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    resetNorth: function(options, eventData) {\n        this.rotateTo(0, util.extend({duration: 1000}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Snaps the map's bearing to 0 (due north), if the current bearing is close enough to it (i.e. within the `bearingSnap` threshold).\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    snapToNorth: function(options, eventData) {\n        if (Math.abs(this.getBearing()) < this._bearingSnap) {\n            return this.resetNorth(options, eventData);\n        }\n        return this;\n    },\n\n    /**\n     * Returns the map's current pitch (tilt).\n     *\n     * @returns {number} The map's current pitch, measured in degrees away from the plane of the screen.\n     */\n    getPitch: function() { return this.transform.pitch; },\n\n    /**\n     * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`.\n     *\n     * @param {number} pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    setPitch: function(pitch, eventData) {\n        this.jumpTo({pitch: pitch}, eventData);\n        return this;\n    },\n\n\n    /**\n     * Pans and zooms the map to contain its visible area within the specified geographical bounds.\n     *\n     * @param {LngLatBoundsLike} bounds The bounds to fit the visible area into.\n     * @param {Object} [options]\n     * @param {boolean} [options.linear=false] If `true`, the map transitions using\n     *     {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See\n     *     {@link Map#flyTo} for information about the options specific to that animated transition.\n     * @param {Function} [options.easing] An easing function for the animated transition.\n     * @param {number} [options.padding=0] The amount of padding, in pixels, to allow around the specified bounds.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    fitBounds: function(bounds, options, eventData) {\n\n        options = util.extend({\n            padding: 0,\n            offset: [0, 0],\n            maxZoom: Infinity\n        }, options);\n\n        bounds = LngLatBounds.convert(bounds);\n\n        var offset = Point.convert(options.offset),\n            tr = this.transform,\n            nw = tr.project(bounds.getNorthWest()),\n            se = tr.project(bounds.getSouthEast()),\n            size = se.sub(nw),\n            scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x,\n            scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n        options.center = tr.unproject(nw.add(se).div(2));\n        options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n        options.bearing = 0;\n\n        return options.linear ?\n            this.easeTo(options, eventData) :\n            this.flyTo(options, eventData);\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, without\n     * an animated transition. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * @param {CameraOptions} options\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    jumpTo: function(options, eventData) {\n        this.stop();\n\n        var tr = this.transform,\n            zoomChanged = false,\n            bearingChanged = false,\n            pitchChanged = false;\n\n        if ('zoom' in options && tr.zoom !== +options.zoom) {\n            zoomChanged = true;\n            tr.zoom = +options.zoom;\n        }\n\n        if ('center' in options) {\n            tr.center = LngLat.convert(options.center);\n        }\n\n        if ('bearing' in options && tr.bearing !== +options.bearing) {\n            bearingChanged = true;\n            tr.bearing = +options.bearing;\n        }\n\n        if ('pitch' in options && tr.pitch !== +options.pitch) {\n            pitchChanged = true;\n            tr.pitch = +options.pitch;\n        }\n\n        this.fire('movestart', eventData)\n            .fire('move', eventData);\n\n        if (zoomChanged) {\n            this.fire('zoomstart', eventData)\n                .fire('zoom', eventData)\n                .fire('zoomend', eventData);\n        }\n\n        if (bearingChanged) {\n            this.fire('rotate', eventData);\n        }\n\n        if (pitchChanged) {\n            this.fire('pitch', eventData);\n        }\n\n        return this.fire('moveend', eventData);\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, with an animated transition\n     * between old and new values. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * @param {CameraOptions|AnimationOptions} options Options describing the destination and animation of the transition.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    easeTo: function(options, eventData) {\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            duration: 500,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n\n            zoom = 'zoom' in options ? +options.zoom : startZoom,\n            bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n            pitch = 'pitch' in options ? +options.pitch : startPitch,\n\n            toLngLat,\n            toPoint;\n\n        if ('center' in options) {\n            toLngLat = LngLat.convert(options.center);\n            toPoint = tr.centerPoint.add(offset);\n        } else if ('around' in options) {\n            toLngLat = LngLat.convert(options.around);\n            toPoint = tr.locationPoint(toLngLat);\n        } else {\n            toPoint = tr.centerPoint.add(offset);\n            toLngLat = tr.pointLocation(toPoint);\n        }\n\n        var fromPoint = tr.locationPoint(toLngLat);\n\n        if (options.animate === false) options.duration = 0;\n\n        this.zooming = (zoom !== startZoom);\n        this.rotating = (startBearing !== bearing);\n        this.pitching = (pitch !== startPitch);\n\n        if (!options.noMoveStart) {\n            this.fire('movestart', eventData);\n        }\n        if (this.zooming) {\n            this.fire('zoomstart', eventData);\n        }\n\n        clearTimeout(this._onEaseEnd);\n\n        this._ease(function (k) {\n            if (this.zooming) {\n                tr.zoom = interpolate(startZoom, zoom, k);\n            }\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k)));\n\n            this.fire('move', eventData);\n            if (this.zooming) {\n                this.fire('zoom', eventData);\n            }\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            if (options.delayEndEvents) {\n                this._onEaseEnd = setTimeout(this._easeToEnd.bind(this, eventData), options.delayEndEvents);\n            } else {\n                this._easeToEnd(eventData);\n            }\n        }.bind(this), options);\n\n        return this;\n    },\n\n    _easeToEnd: function(eventData) {\n        var wasZooming = this.zooming;\n        this.zooming = false;\n        this.rotating = false;\n        this.pitching = false;\n\n        if (wasZooming) {\n            this.fire('zoomend', eventData);\n        }\n        this.fire('moveend', eventData);\n\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that\n     * evokes flight. The animation seamlessly incorporates zooming and panning to help\n     * the user maintain her bearings even after traversing a great distance.\n     *\n     * @param {Object} options Options describing the destination and animation of the transition.\n     *     Accepts [CameraOptions](#CameraOptions), [AnimationOptions](#AnimationOptions),\n     *     and the following additional options.\n     * @param {number} [options.curve=1.42] The zooming \"curve\" that will occur along the\n     *     flight path. A high value maximizes zooming for an exaggerated animation, while a low\n     *     value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average\n     *     value selected by participants in the user study discussed in\n     *     [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n     *     `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n     *     value of 1 would produce a circular motion.\n     * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If\n     *     `options.curve` is specified, this option is ignored.\n     * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to\n     *     `options.curve`. A speed of 1.2 means that the map appears to move along the flight path\n     *     by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.\n     *     It does not correspond to a fixed physical distance, but varies by zoom level.\n     * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls\n     *     per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.\n     * @param {Function} [options.easing] An easing function for the animated transition.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // fly with default options to null island\n     * map.flyTo({center: [0, 0], zoom: 9});\n     * // using flyTo options\n     * map.flyTo({\n     *   center: [0, 0],\n     *   zoom: 9,\n     *   speed: 0.2,\n     *   curve: 1,\n     *   easing: function(t) {\n     *     return t;\n     *   }\n     * });\n     */\n    flyTo: function(options, eventData) {\n        // This method implements an “optimal path” animation, as detailed in:\n        //\n        // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n        //   ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.\n        //\n        // Where applicable, local variable documentation begins with the associated variable or\n        // function in van Wijk (2003).\n\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            speed: 1.2,\n            curve: 1.42,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch();\n\n        var center = 'center' in options ? LngLat.convert(options.center) : this.getCenter();\n        var zoom = 'zoom' in options ?  +options.zoom : startZoom;\n        var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n        var pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n        // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n        // interpolating between the two endpoints will cross it.\n        if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) {\n            if (tr.center.lng > 0 && center.lng < 0) {\n                center.lng += 360;\n            } else if (tr.center.lng < 0 && center.lng > 0) {\n                center.lng -= 360;\n            }\n        }\n\n        var scale = tr.zoomScale(zoom - startZoom),\n            from = tr.point,\n            to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from;\n\n        var startWorldSize = tr.worldSize,\n            rho = options.curve,\n\n            // w₀: Initial visible span, measured in pixels at the initial scale.\n            w0 = Math.max(tr.width, tr.height),\n            // w₁: Final visible span, measured in pixels with respect to the initial scale.\n            w1 = w0 / scale,\n            // Length of the flight path as projected onto the ground plane, measured in pixels from\n            // the world image origin at the initial scale.\n            u1 = to.sub(from).mag();\n\n        if ('minZoom' in options) {\n            var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n            // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial\n            // scale.\n            var wMax = w0 / tr.zoomScale(minZoom - startZoom);\n            rho = Math.sqrt(wMax / u1 * 2);\n        }\n\n        // ρ²\n        var rho2 = rho * rho;\n\n        /**\n         * rᵢ: Returns the zoom-out factor at one end of the animation.\n         *\n         * @param i 0 for the ascent or 1 for the descent.\n         * @private\n         */\n        function r(i) {\n            var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n            return Math.log(Math.sqrt(b * b + 1) - b);\n        }\n\n        function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n        function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n        function tanh(n) { return sinh(n) / cosh(n); }\n\n        // r₀: Zoom-out factor during ascent.\n        var r0 = r(0),\n            /**\n             * w(s): Returns the visible span on the ground, measured in pixels with respect to the\n             * initial scale.\n             *\n             * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n             * @private\n             */\n            w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n            /**\n             * u(s): Returns the distance along the flight path as projected onto the ground plane,\n             * measured in pixels from the world image origin at the initial scale.\n             * @private\n             */\n            u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n            // S: Total length of the flight path, measured in ρ-screenfuls.\n            S = (r(1) - r0) / rho;\n\n        // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n        if (Math.abs(u1) < 0.000001) {\n            // Perform a more or less instantaneous transition if the path is too short.\n            if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options);\n\n            var k = w1 < w0 ? -1 : 1;\n            S = Math.abs(Math.log(w1 / w0)) / rho;\n\n            u = function() { return 0; };\n            w = function(s) { return Math.exp(k * rho * s); };\n        }\n\n        if ('duration' in options) {\n            options.duration = +options.duration;\n        } else {\n            var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n            options.duration = 1000 * S / V;\n        }\n\n        this.zooming = true;\n        if (startBearing !== bearing) this.rotating = true;\n        if (startPitch !== pitch) this.pitching = true;\n\n        this.fire('movestart', eventData);\n        this.fire('zoomstart', eventData);\n\n        this._ease(function (k) {\n            // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n            var s = k * S,\n                us = u(s);\n\n            tr.zoom = startZoom + tr.scaleZoom(1 / w(s));\n            tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize);\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            this.fire('move', eventData);\n            this.fire('zoom', eventData);\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            this.zooming = false;\n            this.rotating = false;\n            this.pitching = false;\n\n            this.fire('zoomend', eventData);\n            this.fire('moveend', eventData);\n        }, options);\n\n        return this;\n    },\n\n    isEasing: function() {\n        return !!this._abortFn;\n    },\n\n    /**\n     * Stops any animated transition underway.\n     *\n     * @returns {Map} `this`\n     */\n    stop: function() {\n        if (this._abortFn) {\n            this._abortFn();\n            this._finishEase();\n        }\n        return this;\n    },\n\n    _ease: function(frame, finish, options) {\n        this._finishFn = finish;\n        this._abortFn = browser.timed(function (t) {\n            frame.call(this, options.easing(t));\n            if (t === 1) {\n                this._finishEase();\n            }\n        }, options.animate === false ? 0 : options.duration, this);\n    },\n\n    _finishEase: function() {\n        delete this._abortFn;\n        // The finish function might emit events which trigger new eases, which\n        // set a new _finishFn. Ensure we don't delete it unintentionally.\n        var finish = this._finishFn;\n        delete this._finishFn;\n        finish.call(this);\n    },\n\n    // convert bearing so that it's numerically close to the current one so that it interpolates properly\n    _normalizeBearing: function(bearing, currentBearing) {\n        bearing = util.wrap(bearing, -180, 180);\n        var diff = Math.abs(bearing - currentBearing);\n        if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n        if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n        return bearing;\n    },\n\n    _updateEasing: function(duration, zoom, bezier) {\n        var easing;\n\n        if (this.ease) {\n            var ease = this.ease,\n                t = (Date.now() - ease.start) / ease.duration,\n                speed = ease.easing(t + 0.01) - ease.easing(t),\n\n                // Quick hack to make new bezier that is continuous with last\n                x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n                y = Math.sqrt(0.27 * 0.27 - x * x);\n\n            easing = util.bezier(x, y, 0.25, 1);\n        } else {\n            easing = bezier ? util.bezier.apply(util, bezier) : util.ease;\n        }\n\n        // store information on current easing\n        this.ease = {\n            start: (new Date()).getTime(),\n            to: Math.pow(2, zoom),\n            duration: duration,\n            easing: easing\n        };\n\n        return easing;\n    }\n});\n\n/**\n * Fired whenever the map's pitch (tilt) changes.\n *\n * @event pitch\n * @memberof Map\n * @instance\n * @property {MapEventData} data\n */\n\n\n/***/ }),\n/* 1422 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(166);\nvar DOM = __webpack_require__(48);\nvar util = __webpack_require__(6);\n\nmodule.exports = Navigation;\n\n/**\n * A `Navigation` control contains zoom buttons and a compass.\n * Extends [`Control`](#Control).\n *\n * @class Navigation\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * var nav = new mapboxgl.Navigation({position: 'top-left'}); // position is optional\n * map.addControl(nav);\n */\nfunction Navigation(options) {\n    util.setOptions(this, options);\n}\n\nNavigation.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map));\n        this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map));\n        this._compass = this._createButton(className + '-icon ' + className + '-compass', map.resetNorth.bind(map));\n\n        this._compassArrow = DOM.create('div', 'arrow', this._compass);\n\n        this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n        this._onCompassMove = this._onCompassMove.bind(this);\n        this._onCompassUp = this._onCompassUp.bind(this);\n\n        map.on('rotate', this._rotateCompassArrow.bind(this));\n        this._rotateCompassArrow();\n\n        this._el = map.getCanvasContainer();\n\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onCompassDown: function(e) {\n        if (e.button !== 0) return;\n\n        DOM.disableDrag();\n        document.addEventListener('mousemove', this._onCompassMove);\n        document.addEventListener('mouseup', this._onCompassUp);\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassMove: function(e) {\n        if (e.button !== 0) return;\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassUp: function(e) {\n        if (e.button !== 0) return;\n\n        document.removeEventListener('mousemove', this._onCompassMove);\n        document.removeEventListener('mouseup', this._onCompassUp);\n        DOM.enableDrag();\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _createButton: function(className, fn) {\n        var a = DOM.create('button', className, this._container);\n        a.type = 'button';\n        a.addEventListener('click', function() { fn(); });\n        return a;\n    },\n\n    _rotateCompassArrow: function() {\n        var rotate = 'rotate(' + (this._map.transform.angle * (180 / Math.PI)) + 'deg)';\n        this._compassArrow.style.transform = rotate;\n    }\n});\n\n\nfunction copyMouseEvent(e) {\n    return new MouseEvent(e.type, {\n        button: 2,    // right click\n        buttons: 2,   // right click\n        bubbles: true,\n        cancelable: true,\n        detail: e.detail,\n        view: e.view,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        movementX: e.movementX,\n        movementY: e.movementY,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey\n    });\n}\n\n\n/***/ }),\n/* 1423 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Control = __webpack_require__(166);\nvar browser = __webpack_require__(37);\nvar DOM = __webpack_require__(48);\nvar util = __webpack_require__(6);\n\nmodule.exports = Geolocate;\n\nvar geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };\n\n\n/**\n * A `Geolocate` control provides a button that uses the browser's geolocation\n * API to locate the user on the map. Extends [`Control`](#Control).\n *\n * @class Geolocate\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * map.addControl(new mapboxgl.Geolocate({position: 'top-left'})); // position is optional\n */\nfunction Geolocate(options) {\n    util.setOptions(this, options);\n}\n\nGeolocate.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        if (!browser.supportsGeolocation) return container;\n\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._geolocateButton = DOM.create('button', (className + '-icon ' + className + '-geolocate'), this._container);\n        this._geolocateButton.type = 'button';\n        this._geolocateButton.addEventListener('click', this._onClickGeolocate.bind(this));\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onClickGeolocate: function() {\n        navigator.geolocation.getCurrentPosition(this._success.bind(this), this._error.bind(this), geoOptions);\n\n        // This timeout ensures that we still call finish() even if\n        // the user declines to share their location in Firefox\n        this._timeoutId = setTimeout(this._finish.bind(this), 10000 /* 10sec */);\n    },\n\n    _success: function(position) {\n        this._map.jumpTo({\n            center: [position.coords.longitude, position.coords.latitude],\n            zoom: 17,\n            bearing: 0,\n            pitch: 0\n        });\n\n        this.fire('geolocate', position);\n        this._finish();\n    },\n\n    _error: function(error) {\n        this.fire('error', error);\n        this._finish();\n    },\n\n    _finish: function() {\n        if (this._timeoutId) { clearTimeout(this._timeoutId); }\n        this._timeoutId = undefined;\n    }\n\n});\n\n/**\n * geolocate event.\n *\n * @event geolocate\n * @memberof Geolocate\n * @instance\n * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n\n/**\n * error event.\n *\n * @event error\n * @memberof Geolocate\n * @instance\n * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n\n\n/***/ }),\n/* 1424 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar util = __webpack_require__(6);\nvar Control = __webpack_require__(166);\nvar DOM = __webpack_require__(48);\n\nmodule.exports = Scale;\n\n/**\n * A `Scale` control displays the ratio of a distance on the map to the corresponding distance on the ground.\n * Extends [`Control`](#Control).\n *\n * @class Scale\n * @param {Object} [options]\n * @param {string} [options.position='bottom-left'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @param {number} [options.maxWidth='150'] The maximum length of the scale control in pixels.\n * @example\n * map.addControl(new mapboxgl.Scale({position: 'top-left'})); // position is optional\n * map.addControl(new mapboxgl.Scale({maxWidth: 80})); //maxWidth is optional\n */\nfunction Scale(options) {\n    util.setOptions(this, options);\n}\n\nScale.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-left'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-scale',\n            container = this._container = DOM.create('div', className, map.getContainer()),\n            options = this.options;\n\n        updateScale(map, container, options);\n        map.on('move', function() {\n            updateScale(map, container, options);\n        });\n\n        return container;\n    }\n});\n\nfunction updateScale(map, scale, options) {\n    // A horizontal scale is imagined to be present at center of the map\n    // container with maximum length (Default) as 100px.\n    // Using spherical law of cosines approximation, the real distance is\n    // found between the two coordinates.\n    var maxWidth = options && options.maxWidth || 100;\n\n    var y = map._container.clientHeight / 2;\n    var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y]));\n\n    // The real distance corresponding to 100px scale length is rounded off to\n    // near pretty number and the scale length for the same is found out.\n    var meters = getRoundNum(maxMeters);\n    var ratio = meters / maxMeters;\n    scale.style.width = maxWidth * ratio + 'px';\n    scale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n}\n\nfunction getDistance(latlng1, latlng2) {\n    // Uses spherical law of cosines approximation.\n    var R = 6371000;\n\n    var rad = Math.PI / 180,\n        lat1 = latlng1.lat * rad,\n        lat2 = latlng2.lat * rad,\n        a = Math.sin(lat1) * Math.sin(lat2) +\n          Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n    var maxMeters = R * Math.acos(Math.min(a, 1));\n    return maxMeters;\n\n}\n\nfunction getRoundNum(num) {\n    var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n        d = num / pow10;\n\n    d = d >= 10 ? 10 :\n        d >= 5 ? 5 :\n        d >= 3 ? 3 :\n        d >= 2 ? 2 : 1;\n\n    return pow10 * d;\n}\n\n\n/***/ }),\n/* 1425 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable */\n\n\nmodule.exports = Marker;\n\nvar DOM = __webpack_require__(48);\nvar util = __webpack_require__(6);\nvar LngLat = __webpack_require__(82);\nvar Point = __webpack_require__(11);\nvar Popup = __webpack_require__(655);\n\n/**\n * Creates a marker component\n * @class Marker\n * @param {HTMLElement=} element DOM element to use as a marker (creates a div element by default)\n * @param {Object=} options\n * @param {PointLike=} options.offset The offset in pixels as a [`PointLike`](#PointLike) object to apply relative to the element's top left corner. Negatives indicate left and up.\n * @example\n * var marker = new mapboxgl.Marker()\n *   .setLngLat([30.5, 50.5])\n *   .addTo(map);\n */\nfunction Marker(element, options) {\n    if (!element) {\n        element = DOM.create('div');\n    }\n    element.classList.add('mapboxgl-marker');\n    this._el = element;\n\n    this._offset = Point.convert(options && options.offset || [0, 0]);\n\n    this._update = this._update.bind(this);\n}\n\nMarker.prototype = {\n    /**\n     * Attaches the marker to a map\n     * @param {Map} map\n     * @returns {Marker} `this`\n     */\n    addTo: function (map) {\n        this.remove();\n        this._map = map;\n        map.getCanvasContainer().appendChild(this._el);\n        map.on('move', this._update);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the marker from a map\n     * @example\n     * var marker = new mapboxgl.Marker().addTo(map);\n     * marker.remove();\n     * @returns {Marker} `this`\n     */\n    remove: function () {\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map = null;\n        }\n        var parent = this._el.parentNode;\n        if (parent) parent.removeChild(this._el);\n        if (this._popup) this._closePopup();\n        return this;\n    },\n\n    /**\n     * Get the marker's geographical location\n     * @returns {LngLat}\n     */\n    getLngLat: function () {\n        return this._lngLat;\n    },\n\n    /**\n     * Set the marker's geographical position and move it.\n     * @param {LngLat} lnglat\n     * @returns {Marker} `this`\n     */\n    setLngLat: function (lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        if (this._popup) this._popup.setLngLat(this._lngLat);\n        this._update();\n        return this;\n    },\n\n    getElement: function () {\n        return this._el;\n    },\n\n    /**\n     * Binds a Popup to the Marker\n     * @param {Popup=} popup an instance of the `Popup` class. If undefined or null, any popup \n     * set on this `Marker` instance is unset\n     * @returns {Marker} `this`\n     */\n\n    setPopup: function (popup) {\n        if (popup == null) {\n            this._closePopup();\n            delete this._popupHandlersAdded;\n            delete this._popup;\n        } else if (popup instanceof Popup) {\n            this._popup = popup;\n        } else {\n            util.warnOnce('Marker.setPopup only accepts an instance of the Popup class as an argument. If no argument is provided, the popup is unset from this Marker instance');\n        }\n\n        if (this._popup && this._lngLat) this._popup.setLngLat(this._lngLat);\n\n        if (!this._popupHandlersAdded) {\n            this.getElement().addEventListener('click', this._openPopup.bind(this));\n            this._popupHandlersAdded = true;\n        }\n        return this;\n    },\n\n    /**\n     * Returns the Popup instance that is bound to the Marker\n     * @returns {Popup} popup\n     */\n    getPopup: function () {\n        return this._popup;\n    },\n\n    /**\n     * Opens or closes the bound popup, depending on the current state\n     * @returns {Marker} `this`\n     */\n    togglePopup: function () {\n        if (this._popup) {\n            if (this._popup._map) {\n                this._closePopup();\n            } else {\n                this._openPopup();\n            }\n        }\n    },\n\n    _openPopup: function (e) {\n        // prevent event from bubbling up to the map canvas\n        e.stopPropagation();\n\n        if (!this._popup || !this._map) return;\n\n        if (!this._popup._map) {\n            this._popup.addTo(this._map);\n        }\n\n        return this;\n    },\n\n    _closePopup: function () {\n        if (this._popup) {\n            this._popup.remove();\n        }\n\n        return this;\n    },\n\n    _update: function () {\n        if (!this._map) return;\n        var pos = this._map.project(this._lngLat)._add(this._offset);\n        DOM.setTransform(this._el, 'translate(' + pos.x + 'px,' + pos.y + 'px)');\n    }\n};\n\n\n\n/***/ }),\n/* 1426 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar VisualizationButton = function (_React$Component) {\n    _inherits(VisualizationButton, _React$Component);\n\n    function VisualizationButton() {\n        _classCallCheck(this, VisualizationButton);\n\n        return _possibleConstructorReturn(this, (VisualizationButton.__proto__ || Object.getPrototypeOf(VisualizationButton)).apply(this, arguments));\n    }\n\n    _createClass(VisualizationButton, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"button\", { className: \"visualization-button\", onClick: _grid_report_actions2.default.toggleVisualizations }, _react2.default.createElement(\"span\", { className: 'icon-righthead-3 ' + (this.props.isVisible ? 'active' : '') }), _react2.default.createElement(\"h3\", null, \"Visualization\"));\n        }\n    }]);\n\n    return VisualizationButton;\n}(_react2.default.Component);\n\nexports.default = VisualizationButton;\n\n/***/ }),\n/* 1427 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar _share_links = __webpack_require__(220);\n\nvar _share_links2 = _interopRequireDefault(_share_links);\n\nvar _shared_link_helper = __webpack_require__(221);\n\nvar _shared_link_helper2 = _interopRequireDefault(_shared_link_helper);\n\nvar _grid_help_menu = __webpack_require__(1428);\n\nvar _grid_help_menu2 = _interopRequireDefault(_grid_help_menu);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _share_options = __webpack_require__(656);\n\nvar _share_options2 = _interopRequireDefault(_share_options);\n\nvar _grid_download_menu = __webpack_require__(1454);\n\nvar _grid_download_menu2 = _interopRequireDefault(_grid_download_menu);\n\nvar _TransparencyLoginButton = __webpack_require__(661);\n\nvar _TransparencyLoginButton2 = _interopRequireDefault(_TransparencyLoginButton);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HeaderActions = (0, _createReactClass2.default)({\n    displayName: 'HeaderActions',\n    getInitialState: function getInitialState() {\n        return {\n            renderedDownloads: false,\n            linkHelper: null\n        };\n    },\n    render: function render() {\n        var headerOptions = this.props.headerOptions;\n\n        var content = headerOptions && headerOptions.entity && this.state.linkHelper ? [_react2.default.createElement(_ovid.Dropdown, { title: \"Download\", position: \"align-right\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small ghost no-color\", ignoreContentClicks: true, key: \"download\" }, _react2.default.createElement(_grid_download_menu2.default, Object.assign({}, this.props, { fiscalYears: headerOptions.downloads.fiscalYears, fullDataSet: headerOptions.downloads.fullDataSet, showExportFilter: headerOptions.showExportFilter, isLoading: headerOptions.downloads.isLoading, report: this.props.report }))), !this.props.embedded && _react2.default.createElement(_TransparencyLoginButton2.default, { entityId: headerOptions.entity.id, key: \"login\", transparencyUrl: gon && gon.entity && gon.entity.transparency_url }), _react2.default.createElement(_ovid.Dropdown, { title: \"Help\", position: \"align-right\", targetClass: \"ui-dropdown__target help-menu\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small ghost no-color\", key: \"help\" }, _react2.default.createElement(_grid_help_menu2.default, { entity: headerOptions.entity, showHowTo: !headerOptions.showHowToModal, showWelcome: !this.props.embedded })), this.props.embedded ? this.props.showShareMenu ? _react2.default.createElement(_share_options2.default, { key: \"options\", report: this.props.report }) : null : _react2.default.createElement(_ovid.Dropdown, { title: \"Share\", position: \"align-right\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small no-color\", key: \"share\" }, _react2.default.createElement(_share_links2.default, { linkHelper: this.state.linkHelper }))] : null;\n        return _react2.default.createElement(\"header\", null, _react2.default.createElement(\"nav\", { \"aria-label\": \"Header menu\", className: \"ui-main__actions ui-nav-bar\", style: this.props.embed === 'y' ? { width: '100%' } : null }, content));\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (this.state.linkHelper === null && nextProps.headerOptions.entity) {\n            this.setState({ linkHelper: _shared_link_helper2.default.create(nextProps.headerOptions.entity) });\n        }\n    },\n    componentDidMount: function componentDidMount() {\n        _grid_report_actions2.default.setDownloadsLoading();\n    }\n});\nexports.default = HeaderActions;\n\n/***/ }),\n/* 1428 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GridHelpMenu = function (_React$Component) {\n    _inherits(GridHelpMenu, _React$Component);\n\n    function GridHelpMenu() {\n        _classCallCheck(this, GridHelpMenu);\n\n        var _this = _possibleConstructorReturn(this, (GridHelpMenu.__proto__ || Object.getPrototypeOf(GridHelpMenu)).apply(this, arguments));\n\n        _this.handleOpenHowTo = function (e) {\n            e.preventDefault();\n            _grid_report_actions2.default.showHowToModal();\n        };\n        _this.handleOpenFeedback = function (e) {\n            e.preventDefault();\n            _report_actions2.default.showFeedback();\n        };\n        _this.handleOpenWelcome = function (e) {\n            e.preventDefault();\n            // Forgive me for my hacky and sinful JavaScript ways...\n            // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n            // nope.\n            var isTallahasseeFl = _this.props.entity && _this.props.entity.get('subdomain') === 'tallahasseefl';\n            if (isTallahasseeFl) {\n                _report_actions2.default.showWelcomeModal();\n            } else {\n                _grid_report_actions2.default.showWelcomeModal();\n            }\n        };\n        _this.handleOpenBudget101 = function (e) {\n            e.preventDefault();\n            _grid_report_actions2.default.showBudget101();\n        };\n        _this.entityHasWelcomeDisabled = function () {\n            return _this.props.entity && _this.props.entity.get('feature_permissions') && _this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1;\n        };\n        return _this;\n    }\n\n    _createClass(GridHelpMenu, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, this.props.showHowTo && _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"howto\", className: \"modal__open\", \"data-modal\": \"checkbook_howto\", onClick: this.handleOpenHowTo }, \"How to use this report\")), this.props.showWelcome && !this.entityHasWelcomeDisabled() && _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"welcome\", className: \"modal__open\", \"data-modal\": \"welcome\", onClick: this.handleOpenWelcome }, \"View welcome message\")), !!this.props.entity.attributes && !!this.props.entity.attributes.budget_101 && _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"budget101\", className: \"modal__open\", onClick: this.handleOpenBudget101 }, \"Multi-Fund Accounting 101\")), _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"entity-feedback-help\", className: \"modal__open\", \"data-modal\": \"feedback\", onClick: this.handleOpenFeedback }, \"Contact \", this.props.entity.get('display_name'))));\n        }\n    }]);\n\n    return GridHelpMenu;\n}(_react2.default.Component);\n\nexports.default = GridHelpMenu;\n\n/***/ }),\n/* 1429 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _TetherComponent = __webpack_require__(1430);\n\nvar _TetherComponent2 = _interopRequireDefault(_TetherComponent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _TetherComponent2.default;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1430 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _tether = __webpack_require__(1431);\n\nvar _tether2 = _interopRequireDefault(_tether);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nif (!_tether2.default) {\n  console.error('It looks like Tether has not been included. Please load this dependency first https://github.com/HubSpot/tether');\n}\n\nvar renderElementToPropTypes = [_propTypes2.default.string, _propTypes2.default.shape({\n  appendChild: _propTypes2.default.func.isRequired\n})];\n\nvar childrenPropType = function childrenPropType(_ref, propName, componentName) {\n  var children = _ref.children;\n\n  var childCount = _react.Children.count(children);\n  if (childCount <= 0) {\n    return new Error(componentName + ' expects at least one child to use as the target element.');\n  } else if (childCount > 2) {\n    return new Error('Only a max of two children allowed in ' + componentName + '.');\n  }\n};\n\nvar attachmentPositions = ['auto auto', 'top left', 'top center', 'top right', 'middle left', 'middle center', 'middle right', 'bottom left', 'bottom center', 'bottom right'];\n\nvar TetherComponent = function (_Component) {\n  _inherits(TetherComponent, _Component);\n\n  function TetherComponent() {\n    var _ref2;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, TetherComponent);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = TetherComponent.__proto__ || Object.getPrototypeOf(TetherComponent)).call.apply(_ref2, [this].concat(args))), _this), _this._targetNode = null, _this._elementParentNode = null, _this._tether = false, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(TetherComponent, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._targetNode = _reactDom2.default.findDOMNode(this);\n      this._update();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      this._targetNode = _reactDom2.default.findDOMNode(this);\n      this._update();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this._destroy();\n    }\n  }, {\n    key: 'getTetherInstance',\n    value: function getTetherInstance() {\n      return this._tether;\n    }\n  }, {\n    key: 'disable',\n    value: function disable() {\n      this._tether.disable();\n    }\n  }, {\n    key: 'enable',\n    value: function enable() {\n      this._tether.enable();\n    }\n  }, {\n    key: 'on',\n    value: function on(event, handler, ctx) {\n      this._tether.on(event, handler, ctx);\n    }\n  }, {\n    key: 'once',\n    value: function once(event, handler, ctx) {\n      this._tether.once(event, handler, ctx);\n    }\n  }, {\n    key: 'off',\n    value: function off(event, handler) {\n      this._tether.off(event, handler);\n    }\n  }, {\n    key: 'position',\n    value: function position() {\n      this._tether.position();\n    }\n  }, {\n    key: '_registerEventListeners',\n    value: function _registerEventListeners() {\n      var _this2 = this,\n          _arguments = arguments;\n\n      this.on('update', function () {\n        return _this2.props.onUpdate && _this2.props.onUpdate.apply(_this2, _arguments);\n      });\n\n      this.on('repositioned', function () {\n        return _this2.props.onRepositioned && _this2.props.onRepositioned.apply(_this2, _arguments);\n      });\n    }\n  }, {\n    key: '_destroy',\n    value: function _destroy() {\n      if (this._elementParentNode) {\n        _reactDom2.default.unmountComponentAtNode(this._elementParentNode);\n        this._elementParentNode.parentNode.removeChild(this._elementParentNode);\n      }\n\n      if (this._tether) {\n        this._tether.destroy();\n      }\n\n      this._elementParentNode = null;\n      this._tether = null;\n    }\n  }, {\n    key: '_update',\n    value: function _update() {\n      var _this3 = this;\n\n      var _props = this.props,\n          children = _props.children,\n          renderElementTag = _props.renderElementTag;\n\n      var elementComponent = _react.Children.toArray(children)[1];\n\n      // if no element component provided, bail out\n      if (!elementComponent) {\n        // destroy Tether element if it has been created\n        if (this._tether) {\n          this._destroy();\n        }\n        return;\n      }\n\n      // create element node container if it hasn't been yet\n      if (!this._elementParentNode) {\n        // create a node that we can stick our content Component in\n        this._elementParentNode = document.createElement(renderElementTag);\n\n        // append node to the render node\n        this._renderNode.appendChild(this._elementParentNode);\n      }\n\n      // render element component into the DOM\n      _reactDom2.default.unstable_renderSubtreeIntoContainer(this, elementComponent, this._elementParentNode, function () {\n        // if we're not destroyed, update Tether once the subtree has finished rendering\n        if (_this3._elementParentNode) {\n          _this3._updateTether();\n        }\n      });\n    }\n  }, {\n    key: '_updateTether',\n    value: function _updateTether() {\n      var _this4 = this;\n\n      var _props2 = this.props,\n          children = _props2.children,\n          renderElementTag = _props2.renderElementTag,\n          renderElementTo = _props2.renderElementTo,\n          id = _props2.id,\n          className = _props2.className,\n          style = _props2.style,\n          options = _objectWithoutProperties(_props2, ['children', 'renderElementTag', 'renderElementTo', 'id', 'className', 'style']);\n\n      var tetherOptions = _extends({\n        target: this._targetNode,\n        element: this._elementParentNode\n      }, options);\n\n      if (id) {\n        this._elementParentNode.id = id;\n      }\n\n      if (className) {\n        this._elementParentNode.className = className;\n      }\n\n      if (style) {\n        Object.keys(style).forEach(function (key) {\n          _this4._elementParentNode.style[key] = style[key];\n        });\n      }\n\n      if (!this._tether) {\n        this._tether = new _tether2.default(tetherOptions);\n        this._registerEventListeners();\n      } else {\n        this._tether.setOptions(tetherOptions);\n      }\n\n      this._tether.position();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react.Children.toArray(this.props.children)[0];\n    }\n  }, {\n    key: '_renderNode',\n    get: function get() {\n      var renderElementTo = this.props.renderElementTo;\n\n      if (typeof renderElementTo === 'string') {\n        return document.querySelector(renderElementTo);\n      } else {\n        return renderElementTo || document.body;\n      }\n    }\n  }]);\n\n  return TetherComponent;\n}(_react.Component);\n\nTetherComponent.propTypes = {\n  renderElementTag: _propTypes2.default.string,\n  renderElementTo: _propTypes2.default.oneOfType(renderElementToPropTypes),\n  attachment: _propTypes2.default.oneOf(attachmentPositions).isRequired,\n  targetAttachment: _propTypes2.default.oneOf(attachmentPositions),\n  offset: _propTypes2.default.string,\n  targetOffset: _propTypes2.default.string,\n  targetModifier: _propTypes2.default.string,\n  enabled: _propTypes2.default.bool,\n  classes: _propTypes2.default.object,\n  classPrefix: _propTypes2.default.string,\n  optimizations: _propTypes2.default.object,\n  constraints: _propTypes2.default.array,\n  id: _propTypes2.default.string,\n  className: _propTypes2.default.string,\n  style: _propTypes2.default.object,\n  onUpdate: _propTypes2.default.func,\n  onRepositioned: _propTypes2.default.func,\n  children: childrenPropType\n};\nTetherComponent.defaultProps = {\n  renderElementTag: 'div',\n  renderElementTo: null\n};\nexports.default = TetherComponent;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1431 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! tether 1.4.7 */\n\n(function(root, factory) {\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.Tether = factory();\n  }\n}(this, function() {\n\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar TetherBase = undefined;\nif (typeof TetherBase === 'undefined') {\n  TetherBase = { modules: [] };\n}\n\nvar zeroElement = null;\n\n// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets\n// if the element lies within a nested document (<frame> or <iframe>-like).\nfunction getActualBoundingClientRect(node) {\n  var boundingRect = node.getBoundingClientRect();\n\n  // The original object returned by getBoundingClientRect is immutable, so we clone it\n  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9\n  var rect = {};\n  for (var k in boundingRect) {\n    rect[k] = boundingRect[k];\n  }\n\n  try {\n    if (node.ownerDocument !== document) {\n      var _frameElement = node.ownerDocument.defaultView.frameElement;\n      if (_frameElement) {\n        var frameRect = getActualBoundingClientRect(_frameElement);\n        rect.top += frameRect.top;\n        rect.bottom += frameRect.top;\n        rect.left += frameRect.left;\n        rect.right += frameRect.left;\n      }\n    }\n  } catch (err) {\n    // Ignore \"Access is denied\" in IE11/Edge\n  }\n\n  return rect;\n}\n\nfunction getScrollParents(el) {\n  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n  var computedStyle = getComputedStyle(el) || {};\n  var position = computedStyle.position;\n  var parents = [];\n\n  if (position === 'fixed') {\n    return [el];\n  }\n\n  var parent = el;\n  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {\n    var style = undefined;\n    try {\n      style = getComputedStyle(parent);\n    } catch (err) {}\n\n    if (typeof style === 'undefined' || style === null) {\n      parents.push(parent);\n      return parents;\n    }\n\n    var _style = style;\n    var overflow = _style.overflow;\n    var overflowX = _style.overflowX;\n    var overflowY = _style.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {\n        parents.push(parent);\n      }\n    }\n  }\n\n  parents.push(el.ownerDocument.body);\n\n  // If the node is within a frame, account for the parent window scroll\n  if (el.ownerDocument !== document) {\n    parents.push(el.ownerDocument.defaultView);\n  }\n\n  return parents;\n}\n\nvar uniqueId = (function () {\n  var id = 0;\n  return function () {\n    return ++id;\n  };\n})();\n\nvar zeroPosCache = {};\nvar getOrigin = function getOrigin() {\n  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of\n  // jitter as the user scrolls that messes with our ability to detect if two positions\n  // are equivilant or not.  We place an element at the top left of the page that will\n  // get the same jitter, so we can cancel the two out.\n  var node = zeroElement;\n  if (!node || !document.body.contains(node)) {\n    node = document.createElement('div');\n    node.setAttribute('data-tether-id', uniqueId());\n    extend(node.style, {\n      top: 0,\n      left: 0,\n      position: 'absolute'\n    });\n\n    document.body.appendChild(node);\n\n    zeroElement = node;\n  }\n\n  var id = node.getAttribute('data-tether-id');\n  if (typeof zeroPosCache[id] === 'undefined') {\n    zeroPosCache[id] = getActualBoundingClientRect(node);\n\n    // Clear the cache when this position call is done\n    defer(function () {\n      delete zeroPosCache[id];\n    });\n  }\n\n  return zeroPosCache[id];\n};\n\nfunction removeUtilElements() {\n  if (zeroElement) {\n    document.body.removeChild(zeroElement);\n  }\n  zeroElement = null;\n};\n\nfunction getBounds(el) {\n  var doc = undefined;\n  if (el === document) {\n    doc = document;\n    el = document.documentElement;\n  } else {\n    doc = el.ownerDocument;\n  }\n\n  var docEl = doc.documentElement;\n\n  var box = getActualBoundingClientRect(el);\n\n  var origin = getOrigin();\n\n  box.top -= origin.top;\n  box.left -= origin.left;\n\n  if (typeof box.width === 'undefined') {\n    box.width = document.body.scrollWidth - box.left - box.right;\n  }\n  if (typeof box.height === 'undefined') {\n    box.height = document.body.scrollHeight - box.top - box.bottom;\n  }\n\n  box.top = box.top - docEl.clientTop;\n  box.left = box.left - docEl.clientLeft;\n  box.right = doc.body.clientWidth - box.width - box.left;\n  box.bottom = doc.body.clientHeight - box.height - box.top;\n\n  return box;\n}\n\nfunction getOffsetParent(el) {\n  return el.offsetParent || document.documentElement;\n}\n\nvar _scrollBarSize = null;\nfunction getScrollBarSize() {\n  if (_scrollBarSize) {\n    return _scrollBarSize;\n  }\n  var inner = document.createElement('div');\n  inner.style.width = '100%';\n  inner.style.height = '200px';\n\n  var outer = document.createElement('div');\n  extend(outer.style, {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    pointerEvents: 'none',\n    visibility: 'hidden',\n    width: '200px',\n    height: '150px',\n    overflow: 'hidden'\n  });\n\n  outer.appendChild(inner);\n\n  document.body.appendChild(outer);\n\n  var widthContained = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var widthScroll = inner.offsetWidth;\n\n  if (widthContained === widthScroll) {\n    widthScroll = outer.clientWidth;\n  }\n\n  document.body.removeChild(outer);\n\n  var width = widthContained - widthScroll;\n\n  _scrollBarSize = { width: width, height: width };\n  return _scrollBarSize;\n}\n\nfunction extend() {\n  var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n  var args = [];\n\n  Array.prototype.push.apply(args, arguments);\n\n  args.slice(1).forEach(function (obj) {\n    if (obj) {\n      for (var key in obj) {\n        if (({}).hasOwnProperty.call(obj, key)) {\n          out[key] = obj[key];\n        }\n      }\n    }\n  });\n\n  return out;\n}\n\nfunction removeClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    name.split(' ').forEach(function (cls) {\n      if (cls.trim()) {\n        el.classList.remove(cls);\n      }\n    });\n  } else {\n    var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');\n    var className = getClassName(el).replace(regex, ' ');\n    setClassName(el, className);\n  }\n}\n\nfunction addClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    name.split(' ').forEach(function (cls) {\n      if (cls.trim()) {\n        el.classList.add(cls);\n      }\n    });\n  } else {\n    removeClass(el, name);\n    var cls = getClassName(el) + (' ' + name);\n    setClassName(el, cls);\n  }\n}\n\nfunction hasClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    return el.classList.contains(name);\n  }\n  var className = getClassName(el);\n  return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);\n}\n\nfunction getClassName(el) {\n  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have\n  // completely separately SVGAnimatedString base classes\n  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {\n    return el.className.baseVal;\n  }\n  return el.className;\n}\n\nfunction setClassName(el, className) {\n  el.setAttribute('class', className);\n}\n\nfunction updateClasses(el, add, all) {\n  // Of the set of 'all' classes, we need the 'add' classes, and only the\n  // 'add' classes to be set.\n  all.forEach(function (cls) {\n    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {\n      removeClass(el, cls);\n    }\n  });\n\n  add.forEach(function (cls) {\n    if (!hasClass(el, cls)) {\n      addClass(el, cls);\n    }\n  });\n}\n\nvar deferred = [];\n\nvar defer = function defer(fn) {\n  deferred.push(fn);\n};\n\nvar flush = function flush() {\n  var fn = undefined;\n  while (fn = deferred.pop()) {\n    fn();\n  }\n};\n\nvar Evented = (function () {\n  function Evented() {\n    _classCallCheck(this, Evented);\n  }\n\n  _createClass(Evented, [{\n    key: 'on',\n    value: function on(event, handler, ctx) {\n      var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\n      if (typeof this.bindings === 'undefined') {\n        this.bindings = {};\n      }\n      if (typeof this.bindings[event] === 'undefined') {\n        this.bindings[event] = [];\n      }\n      this.bindings[event].push({ handler: handler, ctx: ctx, once: once });\n    }\n  }, {\n    key: 'once',\n    value: function once(event, handler, ctx) {\n      this.on(event, handler, ctx, true);\n    }\n  }, {\n    key: 'off',\n    value: function off(event, handler) {\n      if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {\n        return;\n      }\n\n      if (typeof handler === 'undefined') {\n        delete this.bindings[event];\n      } else {\n        var i = 0;\n        while (i < this.bindings[event].length) {\n          if (this.bindings[event][i].handler === handler) {\n            this.bindings[event].splice(i, 1);\n          } else {\n            ++i;\n          }\n        }\n      }\n    }\n  }, {\n    key: 'trigger',\n    value: function trigger(event) {\n      if (typeof this.bindings !== 'undefined' && this.bindings[event]) {\n        var i = 0;\n\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        while (i < this.bindings[event].length) {\n          var _bindings$event$i = this.bindings[event][i];\n          var handler = _bindings$event$i.handler;\n          var ctx = _bindings$event$i.ctx;\n          var once = _bindings$event$i.once;\n\n          var context = ctx;\n          if (typeof context === 'undefined') {\n            context = this;\n          }\n\n          handler.apply(context, args);\n\n          if (once) {\n            this.bindings[event].splice(i, 1);\n          } else {\n            ++i;\n          }\n        }\n      }\n    }\n  }]);\n\n  return Evented;\n})();\n\nTetherBase.Utils = {\n  getActualBoundingClientRect: getActualBoundingClientRect,\n  getScrollParents: getScrollParents,\n  getBounds: getBounds,\n  getOffsetParent: getOffsetParent,\n  extend: extend,\n  addClass: addClass,\n  removeClass: removeClass,\n  hasClass: hasClass,\n  updateClasses: updateClasses,\n  defer: defer,\n  flush: flush,\n  uniqueId: uniqueId,\n  Evented: Evented,\n  getScrollBarSize: getScrollBarSize,\n  removeUtilElements: removeUtilElements\n};\n/* globals TetherBase, performance */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nif (typeof TetherBase === 'undefined') {\n  throw new Error('You must include the utils.js file before tether.js');\n}\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getScrollParents = _TetherBase$Utils.getScrollParents;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar getOffsetParent = _TetherBase$Utils.getOffsetParent;\nvar extend = _TetherBase$Utils.extend;\nvar addClass = _TetherBase$Utils.addClass;\nvar removeClass = _TetherBase$Utils.removeClass;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\nvar flush = _TetherBase$Utils.flush;\nvar getScrollBarSize = _TetherBase$Utils.getScrollBarSize;\nvar removeUtilElements = _TetherBase$Utils.removeUtilElements;\n\nfunction within(a, b) {\n  var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];\n\n  return a + diff >= b && b >= a - diff;\n}\n\nvar transformKey = (function () {\n  if (typeof document === 'undefined') {\n    return '';\n  }\n  var el = document.createElement('div');\n\n  var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];\n  for (var i = 0; i < transforms.length; ++i) {\n    var key = transforms[i];\n    if (el.style[key] !== undefined) {\n      return key;\n    }\n  }\n})();\n\nvar tethers = [];\n\nvar position = function position() {\n  tethers.forEach(function (tether) {\n    tether.position(false);\n  });\n  flush();\n};\n\nfunction now() {\n  if (typeof performance === 'object' && typeof performance.now === 'function') {\n    return performance.now();\n  }\n  return +new Date();\n}\n\n(function () {\n  var lastCall = null;\n  var lastDuration = null;\n  var pendingTimeout = null;\n\n  var tick = function tick() {\n    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {\n      // We voluntarily throttle ourselves if we can't manage 60fps\n      lastDuration = Math.min(lastDuration - 16, 250);\n\n      // Just in case this is the last event, remember to position just once more\n      pendingTimeout = setTimeout(tick, 250);\n      return;\n    }\n\n    if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {\n      // Some browsers call events a little too frequently, refuse to run more than is reasonable\n      return;\n    }\n\n    if (pendingTimeout != null) {\n      clearTimeout(pendingTimeout);\n      pendingTimeout = null;\n    }\n\n    lastCall = now();\n    position();\n    lastDuration = now() - lastCall;\n  };\n\n  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {\n    ['resize', 'scroll', 'touchmove'].forEach(function (event) {\n      window.addEventListener(event, tick);\n    });\n  }\n})();\n\nvar MIRROR_LR = {\n  center: 'center',\n  left: 'right',\n  right: 'left'\n};\n\nvar MIRROR_TB = {\n  middle: 'middle',\n  top: 'bottom',\n  bottom: 'top'\n};\n\nvar OFFSET_MAP = {\n  top: 0,\n  left: 0,\n  middle: '50%',\n  center: '50%',\n  bottom: '100%',\n  right: '100%'\n};\n\nvar autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {\n  var left = attachment.left;\n  var top = attachment.top;\n\n  if (left === 'auto') {\n    left = MIRROR_LR[relativeToAttachment.left];\n  }\n\n  if (top === 'auto') {\n    top = MIRROR_TB[relativeToAttachment.top];\n  }\n\n  return { left: left, top: top };\n};\n\nvar attachmentToOffset = function attachmentToOffset(attachment) {\n  var left = attachment.left;\n  var top = attachment.top;\n\n  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {\n    left = OFFSET_MAP[attachment.left];\n  }\n\n  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {\n    top = OFFSET_MAP[attachment.top];\n  }\n\n  return { left: left, top: top };\n};\n\nfunction addOffset() {\n  var out = { top: 0, left: 0 };\n\n  for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {\n    offsets[_key] = arguments[_key];\n  }\n\n  offsets.forEach(function (_ref) {\n    var top = _ref.top;\n    var left = _ref.left;\n\n    if (typeof top === 'string') {\n      top = parseFloat(top, 10);\n    }\n    if (typeof left === 'string') {\n      left = parseFloat(left, 10);\n    }\n\n    out.top += top;\n    out.left += left;\n  });\n\n  return out;\n}\n\nfunction offsetToPx(offset, size) {\n  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {\n    offset.left = parseFloat(offset.left, 10) / 100 * size.width;\n  }\n  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {\n    offset.top = parseFloat(offset.top, 10) / 100 * size.height;\n  }\n\n  return offset;\n}\n\nvar parseOffset = function parseOffset(value) {\n  var _value$split = value.split(' ');\n\n  var _value$split2 = _slicedToArray(_value$split, 2);\n\n  var top = _value$split2[0];\n  var left = _value$split2[1];\n\n  return { top: top, left: left };\n};\nvar parseAttachment = parseOffset;\n\nvar TetherClass = (function (_Evented) {\n  _inherits(TetherClass, _Evented);\n\n  function TetherClass(options) {\n    var _this = this;\n\n    _classCallCheck(this, TetherClass);\n\n    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);\n    this.position = this.position.bind(this);\n\n    tethers.push(this);\n\n    this.history = [];\n\n    this.setOptions(options, false);\n\n    TetherBase.modules.forEach(function (module) {\n      if (typeof module.initialize !== 'undefined') {\n        module.initialize.call(_this);\n      }\n    });\n\n    this.position();\n  }\n\n  _createClass(TetherClass, [{\n    key: 'getClass',\n    value: function getClass() {\n      var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n      var classes = this.options.classes;\n\n      if (typeof classes !== 'undefined' && classes[key]) {\n        return this.options.classes[key];\n      } else if (this.options.classPrefix) {\n        return this.options.classPrefix + '-' + key;\n      } else {\n        return key;\n      }\n    }\n  }, {\n    key: 'setOptions',\n    value: function setOptions(options) {\n      var _this2 = this;\n\n      var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n      var defaults = {\n        offset: '0 0',\n        targetOffset: '0 0',\n        targetAttachment: 'auto auto',\n        classPrefix: 'tether'\n      };\n\n      this.options = extend(defaults, options);\n\n      var _options = this.options;\n      var element = _options.element;\n      var target = _options.target;\n      var targetModifier = _options.targetModifier;\n\n      this.element = element;\n      this.target = target;\n      this.targetModifier = targetModifier;\n\n      if (this.target === 'viewport') {\n        this.target = document.body;\n        this.targetModifier = 'visible';\n      } else if (this.target === 'scroll-handle') {\n        this.target = document.body;\n        this.targetModifier = 'scroll-handle';\n      }\n\n      ['element', 'target'].forEach(function (key) {\n        if (typeof _this2[key] === 'undefined') {\n          throw new Error('Tether Error: Both element and target must be defined');\n        }\n\n        if (typeof _this2[key].jquery !== 'undefined') {\n          _this2[key] = _this2[key][0];\n        } else if (typeof _this2[key] === 'string') {\n          _this2[key] = document.querySelector(_this2[key]);\n        }\n      });\n\n      addClass(this.element, this.getClass('element'));\n      if (!(this.options.addTargetClasses === false)) {\n        addClass(this.target, this.getClass('target'));\n      }\n\n      if (!this.options.attachment) {\n        throw new Error('Tether Error: You must provide an attachment');\n      }\n\n      this.targetAttachment = parseAttachment(this.options.targetAttachment);\n      this.attachment = parseAttachment(this.options.attachment);\n      this.offset = parseOffset(this.options.offset);\n      this.targetOffset = parseOffset(this.options.targetOffset);\n\n      if (typeof this.scrollParents !== 'undefined') {\n        this.disable();\n      }\n\n      if (this.targetModifier === 'scroll-handle') {\n        this.scrollParents = [this.target];\n      } else {\n        this.scrollParents = getScrollParents(this.target);\n      }\n\n      if (!(this.options.enabled === false)) {\n        this.enable(pos);\n      }\n    }\n  }, {\n    key: 'getTargetBounds',\n    value: function getTargetBounds() {\n      if (typeof this.targetModifier !== 'undefined') {\n        if (this.targetModifier === 'visible') {\n          if (this.target === document.body) {\n            return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };\n          } else {\n            var bounds = getBounds(this.target);\n\n            var out = {\n              height: bounds.height,\n              width: bounds.width,\n              top: bounds.top,\n              left: bounds.left\n            };\n\n            out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));\n            out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));\n            out.height = Math.min(innerHeight, out.height);\n            out.height -= 2;\n\n            out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));\n            out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));\n            out.width = Math.min(innerWidth, out.width);\n            out.width -= 2;\n\n            if (out.top < pageYOffset) {\n              out.top = pageYOffset;\n            }\n            if (out.left < pageXOffset) {\n              out.left = pageXOffset;\n            }\n\n            return out;\n          }\n        } else if (this.targetModifier === 'scroll-handle') {\n          var bounds = undefined;\n          var target = this.target;\n          if (target === document.body) {\n            target = document.documentElement;\n\n            bounds = {\n              left: pageXOffset,\n              top: pageYOffset,\n              height: innerHeight,\n              width: innerWidth\n            };\n          } else {\n            bounds = getBounds(target);\n          }\n\n          var style = getComputedStyle(target);\n\n          var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;\n\n          var scrollBottom = 0;\n          if (hasBottomScroll) {\n            scrollBottom = 15;\n          }\n\n          var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;\n\n          var out = {\n            width: 15,\n            height: height * 0.975 * (height / target.scrollHeight),\n            left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15\n          };\n\n          var fitAdj = 0;\n          if (height < 408 && this.target === document.body) {\n            fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;\n          }\n\n          if (this.target !== document.body) {\n            out.height = Math.max(out.height, 24);\n          }\n\n          var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);\n          out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);\n\n          if (this.target === document.body) {\n            out.height = Math.max(out.height, 24);\n          }\n\n          return out;\n        }\n      } else {\n        return getBounds(this.target);\n      }\n    }\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this._cache = {};\n    }\n  }, {\n    key: 'cache',\n    value: function cache(k, getter) {\n      // More than one module will often need the same DOM info, so\n      // we keep a cache which is cleared on each position call\n      if (typeof this._cache === 'undefined') {\n        this._cache = {};\n      }\n\n      if (typeof this._cache[k] === 'undefined') {\n        this._cache[k] = getter.call(this);\n      }\n\n      return this._cache[k];\n    }\n  }, {\n    key: 'enable',\n    value: function enable() {\n      var _this3 = this;\n\n      var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n      if (!(this.options.addTargetClasses === false)) {\n        addClass(this.target, this.getClass('enabled'));\n      }\n      addClass(this.element, this.getClass('enabled'));\n      this.enabled = true;\n\n      this.scrollParents.forEach(function (parent) {\n        if (parent !== _this3.target.ownerDocument) {\n          parent.addEventListener('scroll', _this3.position);\n        }\n      });\n\n      if (pos) {\n        this.position();\n      }\n    }\n  }, {\n    key: 'disable',\n    value: function disable() {\n      var _this4 = this;\n\n      removeClass(this.target, this.getClass('enabled'));\n      removeClass(this.element, this.getClass('enabled'));\n      this.enabled = false;\n\n      if (typeof this.scrollParents !== 'undefined') {\n        this.scrollParents.forEach(function (parent) {\n          parent.removeEventListener('scroll', _this4.position);\n        });\n      }\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this5 = this;\n\n      this.disable();\n\n      tethers.forEach(function (tether, i) {\n        if (tether === _this5) {\n          tethers.splice(i, 1);\n        }\n      });\n\n      // Remove any elements we were using for convenience from the DOM\n      if (tethers.length === 0) {\n        removeUtilElements();\n      }\n    }\n  }, {\n    key: 'updateAttachClasses',\n    value: function updateAttachClasses(elementAttach, targetAttach) {\n      var _this6 = this;\n\n      elementAttach = elementAttach || this.attachment;\n      targetAttach = targetAttach || this.targetAttachment;\n      var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];\n\n      if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {\n        // updateAttachClasses can be called more than once in a position call, so\n        // we need to clean up after ourselves such that when the last defer gets\n        // ran it doesn't add any extra classes from previous calls.\n        this._addAttachClasses.splice(0, this._addAttachClasses.length);\n      }\n\n      if (typeof this._addAttachClasses === 'undefined') {\n        this._addAttachClasses = [];\n      }\n      var add = this._addAttachClasses;\n\n      if (elementAttach.top) {\n        add.push(this.getClass('element-attached') + '-' + elementAttach.top);\n      }\n      if (elementAttach.left) {\n        add.push(this.getClass('element-attached') + '-' + elementAttach.left);\n      }\n      if (targetAttach.top) {\n        add.push(this.getClass('target-attached') + '-' + targetAttach.top);\n      }\n      if (targetAttach.left) {\n        add.push(this.getClass('target-attached') + '-' + targetAttach.left);\n      }\n\n      var all = [];\n      sides.forEach(function (side) {\n        all.push(_this6.getClass('element-attached') + '-' + side);\n        all.push(_this6.getClass('target-attached') + '-' + side);\n      });\n\n      defer(function () {\n        if (!(typeof _this6._addAttachClasses !== 'undefined')) {\n          return;\n        }\n\n        updateClasses(_this6.element, _this6._addAttachClasses, all);\n        if (!(_this6.options.addTargetClasses === false)) {\n          updateClasses(_this6.target, _this6._addAttachClasses, all);\n        }\n\n        delete _this6._addAttachClasses;\n      });\n    }\n  }, {\n    key: 'position',\n    value: function position() {\n      var _this7 = this;\n\n      var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n      // flushChanges commits the changes immediately, leave true unless you are positioning multiple\n      // tethers (in which case call Tether.Utils.flush yourself when you're done)\n\n      if (!this.enabled) {\n        return;\n      }\n\n      this.clearCache();\n\n      // Turn 'auto' attachments into the appropriate corner or edge\n      var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);\n\n      this.updateAttachClasses(this.attachment, targetAttachment);\n\n      var elementPos = this.cache('element-bounds', function () {\n        return getBounds(_this7.element);\n      });\n\n      var width = elementPos.width;\n      var height = elementPos.height;\n\n      if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\n        var _lastSize = this.lastSize;\n\n        // We cache the height and width to make it possible to position elements that are\n        // getting hidden.\n        width = _lastSize.width;\n        height = _lastSize.height;\n      } else {\n        this.lastSize = { width: width, height: height };\n      }\n\n      var targetPos = this.cache('target-bounds', function () {\n        return _this7.getTargetBounds();\n      });\n      var targetSize = targetPos;\n\n      // Get an actual px offset from the attachment\n      var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });\n      var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);\n\n      var manualOffset = offsetToPx(this.offset, { width: width, height: height });\n      var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);\n\n      // Add the manually provided offset\n      offset = addOffset(offset, manualOffset);\n      targetOffset = addOffset(targetOffset, manualTargetOffset);\n\n      // It's now our goal to make (element position + offset) == (target position + target offset)\n      var left = targetPos.left + targetOffset.left - offset.left;\n      var top = targetPos.top + targetOffset.top - offset.top;\n\n      for (var i = 0; i < TetherBase.modules.length; ++i) {\n        var _module2 = TetherBase.modules[i];\n        var ret = _module2.position.call(this, {\n          left: left,\n          top: top,\n          targetAttachment: targetAttachment,\n          targetPos: targetPos,\n          elementPos: elementPos,\n          offset: offset,\n          targetOffset: targetOffset,\n          manualOffset: manualOffset,\n          manualTargetOffset: manualTargetOffset,\n          scrollbarSize: scrollbarSize,\n          attachment: this.attachment\n        });\n\n        if (ret === false) {\n          return false;\n        } else if (typeof ret === 'undefined' || typeof ret !== 'object') {\n          continue;\n        } else {\n          top = ret.top;\n          left = ret.left;\n        }\n      }\n\n      // We describe the position three different ways to give the optimizer\n      // a chance to decide the best possible way to position the element\n      // with the fewest repaints.\n      var next = {\n        // It's position relative to the page (absolute positioning when\n        // the element is a child of the body)\n        page: {\n          top: top,\n          left: left\n        },\n\n        // It's position relative to the viewport (fixed positioning)\n        viewport: {\n          top: top - pageYOffset,\n          bottom: pageYOffset - top - height + innerHeight,\n          left: left - pageXOffset,\n          right: pageXOffset - left - width + innerWidth\n        }\n      };\n\n      var doc = this.target.ownerDocument;\n      var win = doc.defaultView;\n\n      var scrollbarSize = undefined;\n      if (win.innerHeight > doc.documentElement.clientHeight) {\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n        next.viewport.bottom -= scrollbarSize.height;\n      }\n\n      if (win.innerWidth > doc.documentElement.clientWidth) {\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n        next.viewport.right -= scrollbarSize.width;\n      }\n\n      if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {\n        // Absolute positioning in the body will be relative to the page, not the 'initial containing block'\n        next.page.bottom = doc.body.scrollHeight - top - height;\n        next.page.right = doc.body.scrollWidth - left - width;\n      }\n\n      if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {\n        (function () {\n          var offsetParent = _this7.cache('target-offsetparent', function () {\n            return getOffsetParent(_this7.target);\n          });\n          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {\n            return getBounds(offsetParent);\n          });\n          var offsetParentStyle = getComputedStyle(offsetParent);\n          var offsetParentSize = offsetPosition;\n\n          var offsetBorder = {};\n          ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {\n            offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);\n          });\n\n          offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;\n          offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;\n\n          if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {\n            if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {\n              // We're within the visible part of the target's scroll parent\n              var scrollTop = offsetParent.scrollTop;\n              var scrollLeft = offsetParent.scrollLeft;\n\n              // It's position relative to the target's offset parent (absolute positioning when\n              // the element is moved to be a child of the target's offset parent).\n              next.offset = {\n                top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,\n                left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left\n              };\n            }\n          }\n        })();\n      }\n\n      // We could also travel up the DOM and try each containing context, rather than only\n      // looking at the body, but we're gonna get diminishing returns.\n\n      this.move(next);\n\n      this.history.unshift(next);\n\n      if (this.history.length > 3) {\n        this.history.pop();\n      }\n\n      if (flushChanges) {\n        flush();\n      }\n\n      return true;\n    }\n\n    // THE ISSUE\n  }, {\n    key: 'move',\n    value: function move(pos) {\n      var _this8 = this;\n\n      if (!(typeof this.element.parentNode !== 'undefined')) {\n        return;\n      }\n\n      var same = {};\n\n      for (var type in pos) {\n        same[type] = {};\n\n        for (var key in pos[type]) {\n          var found = false;\n\n          for (var i = 0; i < this.history.length; ++i) {\n            var point = this.history[i];\n            if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            same[type][key] = true;\n          }\n        }\n      }\n\n      var css = { top: '', left: '', right: '', bottom: '' };\n\n      var transcribe = function transcribe(_same, _pos) {\n        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';\n        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;\n        if (gpu !== false) {\n          var yPos = undefined,\n              xPos = undefined;\n          if (_same.top) {\n            css.top = 0;\n            yPos = _pos.top;\n          } else {\n            css.bottom = 0;\n            yPos = -_pos.bottom;\n          }\n\n          if (_same.left) {\n            css.left = 0;\n            xPos = _pos.left;\n          } else {\n            css.right = 0;\n            xPos = -_pos.right;\n          }\n\n          if (typeof window.devicePixelRatio === 'number' && devicePixelRatio % 1 === 0) {\n            xPos = Math.round(xPos * devicePixelRatio) / devicePixelRatio;\n            yPos = Math.round(yPos * devicePixelRatio) / devicePixelRatio;\n          }\n\n          css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';\n\n          if (transformKey !== 'msTransform') {\n            // The Z transform will keep this in the GPU (faster, and prevents artifacts),\n            // but IE9 doesn't support 3d transforms and will choke.\n            css[transformKey] += \" translateZ(0)\";\n          }\n        } else {\n          if (_same.top) {\n            css.top = _pos.top + 'px';\n          } else {\n            css.bottom = _pos.bottom + 'px';\n          }\n\n          if (_same.left) {\n            css.left = _pos.left + 'px';\n          } else {\n            css.right = _pos.right + 'px';\n          }\n        }\n      };\n\n      var moved = false;\n      if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {\n        css.position = 'absolute';\n        transcribe(same.page, pos.page);\n      } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {\n        css.position = 'fixed';\n        transcribe(same.viewport, pos.viewport);\n      } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {\n        (function () {\n          css.position = 'absolute';\n          var offsetParent = _this8.cache('target-offsetparent', function () {\n            return getOffsetParent(_this8.target);\n          });\n\n          if (getOffsetParent(_this8.element) !== offsetParent) {\n            defer(function () {\n              _this8.element.parentNode.removeChild(_this8.element);\n              offsetParent.appendChild(_this8.element);\n            });\n          }\n\n          transcribe(same.offset, pos.offset);\n          moved = true;\n        })();\n      } else {\n        css.position = 'absolute';\n        transcribe({ top: true, left: true }, pos.page);\n      }\n\n      if (!moved) {\n        if (this.options.bodyElement) {\n          if (this.element.parentNode !== this.options.bodyElement) {\n            this.options.bodyElement.appendChild(this.element);\n          }\n        } else {\n          var isFullscreenElement = function isFullscreenElement(e) {\n            var d = e.ownerDocument;\n            var fe = d.fullscreenElement || d.webkitFullscreenElement || d.mozFullScreenElement || d.msFullscreenElement;\n            return fe === e;\n          };\n\n          var offsetParentIsBody = true;\n\n          var currentNode = this.element.parentNode;\n          while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY' && !isFullscreenElement(currentNode)) {\n            if (getComputedStyle(currentNode).position !== 'static') {\n              offsetParentIsBody = false;\n              break;\n            }\n\n            currentNode = currentNode.parentNode;\n          }\n\n          if (!offsetParentIsBody) {\n            this.element.parentNode.removeChild(this.element);\n            this.element.ownerDocument.body.appendChild(this.element);\n          }\n        }\n      }\n\n      // Any css change will trigger a repaint, so let's avoid one if nothing changed\n      var writeCSS = {};\n      var write = false;\n      for (var key in css) {\n        var val = css[key];\n        var elVal = this.element.style[key];\n\n        if (elVal !== val) {\n          write = true;\n          writeCSS[key] = val;\n        }\n      }\n\n      if (write) {\n        defer(function () {\n          extend(_this8.element.style, writeCSS);\n          _this8.trigger('repositioned');\n        });\n      }\n    }\n  }]);\n\n  return TetherClass;\n})(Evented);\n\nTetherClass.modules = [];\n\nTetherBase.position = position;\n\nvar Tether = extend(TetherClass, TetherBase);\n/* globals TetherBase */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar extend = _TetherBase$Utils.extend;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\n\nvar BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];\n\nfunction getBoundingRect(tether, to) {\n  if (to === 'scrollParent') {\n    to = tether.scrollParents[0];\n  } else if (to === 'window') {\n    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];\n  }\n\n  if (to === document) {\n    to = to.documentElement;\n  }\n\n  if (typeof to.nodeType !== 'undefined') {\n    (function () {\n      var node = to;\n      var size = getBounds(to);\n      var pos = size;\n      var style = getComputedStyle(to);\n\n      to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];\n\n      // Account any parent Frames scroll offset\n      if (node.ownerDocument !== document) {\n        var win = node.ownerDocument.defaultView;\n        to[0] += win.pageXOffset;\n        to[1] += win.pageYOffset;\n        to[2] += win.pageXOffset;\n        to[3] += win.pageYOffset;\n      }\n\n      BOUNDS_FORMAT.forEach(function (side, i) {\n        side = side[0].toUpperCase() + side.substr(1);\n        if (side === 'Top' || side === 'Left') {\n          to[i] += parseFloat(style['border' + side + 'Width']);\n        } else {\n          to[i] -= parseFloat(style['border' + side + 'Width']);\n        }\n      });\n    })();\n  }\n\n  return to;\n}\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var _this = this;\n\n    var top = _ref.top;\n    var left = _ref.left;\n    var targetAttachment = _ref.targetAttachment;\n\n    if (!this.options.constraints) {\n      return true;\n    }\n\n    var _cache = this.cache('element-bounds', function () {\n      return getBounds(_this.element);\n    });\n\n    var height = _cache.height;\n    var width = _cache.width;\n\n    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\n      var _lastSize = this.lastSize;\n\n      // Handle the item getting hidden as a result of our positioning without glitching\n      // the classes in and out\n      width = _lastSize.width;\n      height = _lastSize.height;\n    }\n\n    var targetSize = this.cache('target-bounds', function () {\n      return _this.getTargetBounds();\n    });\n\n    var targetHeight = targetSize.height;\n    var targetWidth = targetSize.width;\n\n    var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];\n\n    this.options.constraints.forEach(function (constraint) {\n      var outOfBoundsClass = constraint.outOfBoundsClass;\n      var pinnedClass = constraint.pinnedClass;\n\n      if (outOfBoundsClass) {\n        allClasses.push(outOfBoundsClass);\n      }\n      if (pinnedClass) {\n        allClasses.push(pinnedClass);\n      }\n    });\n\n    allClasses.forEach(function (cls) {\n      ['left', 'top', 'right', 'bottom'].forEach(function (side) {\n        allClasses.push(cls + '-' + side);\n      });\n    });\n\n    var addClasses = [];\n\n    var tAttachment = extend({}, targetAttachment);\n    var eAttachment = extend({}, this.attachment);\n\n    this.options.constraints.forEach(function (constraint) {\n      var to = constraint.to;\n      var attachment = constraint.attachment;\n      var pin = constraint.pin;\n\n      if (typeof attachment === 'undefined') {\n        attachment = '';\n      }\n\n      var changeAttachX = undefined,\n          changeAttachY = undefined;\n      if (attachment.indexOf(' ') >= 0) {\n        var _attachment$split = attachment.split(' ');\n\n        var _attachment$split2 = _slicedToArray(_attachment$split, 2);\n\n        changeAttachY = _attachment$split2[0];\n        changeAttachX = _attachment$split2[1];\n      } else {\n        changeAttachX = changeAttachY = attachment;\n      }\n\n      var bounds = getBoundingRect(_this, to);\n\n      if (changeAttachY === 'target' || changeAttachY === 'both') {\n        if (top < bounds[1] && tAttachment.top === 'top') {\n          top += targetHeight;\n          tAttachment.top = 'bottom';\n        }\n\n        if (top + height > bounds[3] && tAttachment.top === 'bottom') {\n          top -= targetHeight;\n          tAttachment.top = 'top';\n        }\n      }\n\n      if (changeAttachY === 'together') {\n        if (tAttachment.top === 'top') {\n          if (eAttachment.top === 'bottom' && top < bounds[1]) {\n            top += targetHeight;\n            tAttachment.top = 'bottom';\n\n            top += height;\n            eAttachment.top = 'top';\n          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {\n            top -= height - targetHeight;\n            tAttachment.top = 'bottom';\n\n            eAttachment.top = 'bottom';\n          }\n        }\n\n        if (tAttachment.top === 'bottom') {\n          if (eAttachment.top === 'top' && top + height > bounds[3]) {\n            top -= targetHeight;\n            tAttachment.top = 'top';\n\n            top -= height;\n            eAttachment.top = 'bottom';\n          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {\n            top += height - targetHeight;\n            tAttachment.top = 'top';\n\n            eAttachment.top = 'top';\n          }\n        }\n\n        if (tAttachment.top === 'middle') {\n          if (top + height > bounds[3] && eAttachment.top === 'top') {\n            top -= height;\n            eAttachment.top = 'bottom';\n          } else if (top < bounds[1] && eAttachment.top === 'bottom') {\n            top += height;\n            eAttachment.top = 'top';\n          }\n        }\n      }\n\n      if (changeAttachX === 'target' || changeAttachX === 'both') {\n        if (left < bounds[0] && tAttachment.left === 'left') {\n          left += targetWidth;\n          tAttachment.left = 'right';\n        }\n\n        if (left + width > bounds[2] && tAttachment.left === 'right') {\n          left -= targetWidth;\n          tAttachment.left = 'left';\n        }\n      }\n\n      if (changeAttachX === 'together') {\n        if (left < bounds[0] && tAttachment.left === 'left') {\n          if (eAttachment.left === 'right') {\n            left += targetWidth;\n            tAttachment.left = 'right';\n\n            left += width;\n            eAttachment.left = 'left';\n          } else if (eAttachment.left === 'left') {\n            left += targetWidth;\n            tAttachment.left = 'right';\n\n            left -= width;\n            eAttachment.left = 'right';\n          }\n        } else if (left + width > bounds[2] && tAttachment.left === 'right') {\n          if (eAttachment.left === 'left') {\n            left -= targetWidth;\n            tAttachment.left = 'left';\n\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (eAttachment.left === 'right') {\n            left -= targetWidth;\n            tAttachment.left = 'left';\n\n            left += width;\n            eAttachment.left = 'left';\n          }\n        } else if (tAttachment.left === 'center') {\n          if (left + width > bounds[2] && eAttachment.left === 'left') {\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (left < bounds[0] && eAttachment.left === 'right') {\n            left += width;\n            eAttachment.left = 'left';\n          }\n        }\n      }\n\n      if (changeAttachY === 'element' || changeAttachY === 'both') {\n        if (top < bounds[1] && eAttachment.top === 'bottom') {\n          top += height;\n          eAttachment.top = 'top';\n        }\n\n        if (top + height > bounds[3] && eAttachment.top === 'top') {\n          top -= height;\n          eAttachment.top = 'bottom';\n        }\n      }\n\n      if (changeAttachX === 'element' || changeAttachX === 'both') {\n        if (left < bounds[0]) {\n          if (eAttachment.left === 'right') {\n            left += width;\n            eAttachment.left = 'left';\n          } else if (eAttachment.left === 'center') {\n            left += width / 2;\n            eAttachment.left = 'left';\n          }\n        }\n\n        if (left + width > bounds[2]) {\n          if (eAttachment.left === 'left') {\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (eAttachment.left === 'center') {\n            left -= width / 2;\n            eAttachment.left = 'right';\n          }\n        }\n      }\n\n      if (typeof pin === 'string') {\n        pin = pin.split(',').map(function (p) {\n          return p.trim();\n        });\n      } else if (pin === true) {\n        pin = ['top', 'left', 'right', 'bottom'];\n      }\n\n      pin = pin || [];\n\n      var pinned = [];\n      var oob = [];\n\n      if (top < bounds[1]) {\n        if (pin.indexOf('top') >= 0) {\n          top = bounds[1];\n          pinned.push('top');\n        } else {\n          oob.push('top');\n        }\n      }\n\n      if (top + height > bounds[3]) {\n        if (pin.indexOf('bottom') >= 0) {\n          top = bounds[3] - height;\n          pinned.push('bottom');\n        } else {\n          oob.push('bottom');\n        }\n      }\n\n      if (left < bounds[0]) {\n        if (pin.indexOf('left') >= 0) {\n          left = bounds[0];\n          pinned.push('left');\n        } else {\n          oob.push('left');\n        }\n      }\n\n      if (left + width > bounds[2]) {\n        if (pin.indexOf('right') >= 0) {\n          left = bounds[2] - width;\n          pinned.push('right');\n        } else {\n          oob.push('right');\n        }\n      }\n\n      if (pinned.length) {\n        (function () {\n          var pinnedClass = undefined;\n          if (typeof _this.options.pinnedClass !== 'undefined') {\n            pinnedClass = _this.options.pinnedClass;\n          } else {\n            pinnedClass = _this.getClass('pinned');\n          }\n\n          addClasses.push(pinnedClass);\n          pinned.forEach(function (side) {\n            addClasses.push(pinnedClass + '-' + side);\n          });\n        })();\n      }\n\n      if (oob.length) {\n        (function () {\n          var oobClass = undefined;\n          if (typeof _this.options.outOfBoundsClass !== 'undefined') {\n            oobClass = _this.options.outOfBoundsClass;\n          } else {\n            oobClass = _this.getClass('out-of-bounds');\n          }\n\n          addClasses.push(oobClass);\n          oob.forEach(function (side) {\n            addClasses.push(oobClass + '-' + side);\n          });\n        })();\n      }\n\n      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {\n        eAttachment.left = tAttachment.left = false;\n      }\n      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {\n        eAttachment.top = tAttachment.top = false;\n      }\n\n      if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {\n        _this.updateAttachClasses(eAttachment, tAttachment);\n        _this.trigger('update', {\n          attachment: eAttachment,\n          targetAttachment: tAttachment\n        });\n      }\n    });\n\n    defer(function () {\n      if (!(_this.options.addTargetClasses === false)) {\n        updateClasses(_this.target, addClasses, allClasses);\n      }\n      updateClasses(_this.element, addClasses, allClasses);\n    });\n\n    return { top: top, left: left };\n  }\n});\n/* globals TetherBase */\n\n'use strict';\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var _this = this;\n\n    var top = _ref.top;\n    var left = _ref.left;\n\n    var _cache = this.cache('element-bounds', function () {\n      return getBounds(_this.element);\n    });\n\n    var height = _cache.height;\n    var width = _cache.width;\n\n    var targetPos = this.getTargetBounds();\n\n    var bottom = top + height;\n    var right = left + width;\n\n    var abutted = [];\n    if (top <= targetPos.bottom && bottom >= targetPos.top) {\n      ['left', 'right'].forEach(function (side) {\n        var targetPosSide = targetPos[side];\n        if (targetPosSide === left || targetPosSide === right) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    if (left <= targetPos.right && right >= targetPos.left) {\n      ['top', 'bottom'].forEach(function (side) {\n        var targetPosSide = targetPos[side];\n        if (targetPosSide === top || targetPosSide === bottom) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    var allClasses = [];\n    var addClasses = [];\n\n    var sides = ['left', 'top', 'right', 'bottom'];\n    allClasses.push(this.getClass('abutted'));\n    sides.forEach(function (side) {\n      allClasses.push(_this.getClass('abutted') + '-' + side);\n    });\n\n    if (abutted.length) {\n      addClasses.push(this.getClass('abutted'));\n    }\n\n    abutted.forEach(function (side) {\n      addClasses.push(_this.getClass('abutted') + '-' + side);\n    });\n\n    defer(function () {\n      if (!(_this.options.addTargetClasses === false)) {\n        updateClasses(_this.target, addClasses, allClasses);\n      }\n      updateClasses(_this.element, addClasses, allClasses);\n    });\n\n    return true;\n  }\n});\n/* globals TetherBase */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var top = _ref.top;\n    var left = _ref.left;\n\n    if (!this.options.shift) {\n      return;\n    }\n\n    var shift = this.options.shift;\n    if (typeof this.options.shift === 'function') {\n      shift = this.options.shift.call(this, { top: top, left: left });\n    }\n\n    var shiftTop = undefined,\n        shiftLeft = undefined;\n    if (typeof shift === 'string') {\n      shift = shift.split(' ');\n      shift[1] = shift[1] || shift[0];\n\n      var _shift = shift;\n\n      var _shift2 = _slicedToArray(_shift, 2);\n\n      shiftTop = _shift2[0];\n      shiftLeft = _shift2[1];\n\n      shiftTop = parseFloat(shiftTop, 10);\n      shiftLeft = parseFloat(shiftLeft, 10);\n    } else {\n      shiftTop = shift.top;\n      shiftLeft = shift.left;\n    }\n\n    top += shiftTop;\n    left += shiftLeft;\n\n    return { top: top, left: left };\n  }\n});\nreturn Tether;\n\n}));\n\n\n/***/ }),\n/* 1432 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _share_message_footer = __webpack_require__(1433);\n\nvar _share_message_footer2 = _interopRequireDefault(_share_message_footer);\n\nvar _share_message_header = __webpack_require__(1434);\n\nvar _share_message_header2 = _interopRequireDefault(_share_message_header);\n\nvar _share_message_action = __webpack_require__(1435);\n\nvar _share_message_action2 = _interopRequireDefault(_share_message_action);\n\nvar _message_search = __webpack_require__(1436);\n\nvar _message_search2 = _interopRequireDefault(_message_search);\n\nvar _intercom_utils = __webpack_require__(121);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShareMessage = function (_Component) {\n    _inherits(ShareMessage, _Component);\n\n    function ShareMessage() {\n        _classCallCheck(this, ShareMessage);\n\n        var _this = _possibleConstructorReturn(this, (ShareMessage.__proto__ || Object.getPrototypeOf(ShareMessage)).apply(this, arguments));\n\n        _this.handleUpdateMessageField = function (event) {\n            _this.props.updateMessage(event.target.value);\n        };\n        _this.handleSubmit = function (event) {\n            event.preventDefault();\n            _this.props.send();\n            var metadata = {\n                count: _this.props.messageUsers.size,\n                message: _this.props.message,\n                reportId: _this.props.reportId\n            };\n            (0, _intercom_utils.trackIntercomEvent)('report-share', metadata);\n        };\n        return _this;\n    }\n\n    _createClass(ShareMessage, [{\n        key: 'handleInviteAll',\n        value: function handleInviteAll() {\n            InviteActions.addMessageAllUsers();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                showOverview = _props.showOverview,\n                messageUsers = _props.messageUsers,\n                currentInvitedUsers = _props.currentInvitedUsers,\n                permission = _props.permission,\n                message = _props.message,\n                cancel = _props.cancel,\n                isSendingMessage = _props.isSendingMessage,\n                currentUser = _props.currentUser,\n                reportOwner = _props.reportOwner;\n\n            var isDisabled = messageUsers.isEmpty();\n            return _react2.default.createElement(\"span\", null, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(_share_message_header2.default, { title: \"Invite & Update\", message: \"Send the latest report to colleagues and stay on the same page.\" }), _react2.default.createElement(_message_search2.default, Object.assign({}, this.props)), _react2.default.createElement(\"a\", { onClick: this.handleInviteAll }, _react2.default.createElement(\"p\", { className: \"share-panel-invite-all\" }, \"Invite everyone this report is shared with.\")), _react2.default.createElement(_share_message_action2.default, { handleSubmit: this.handleSubmit, isDisabled: isDisabled, isSendingMessage: isSendingMessage, cancel: cancel, description: _react2.default.createElement(\"span\", null, \"Newly invited users will have \", _react2.default.createElement(\"strong\", { className: \"view-only-color\" }, \"view-only\"), \" report access \") }, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"textarea\", { value: message, name: \"report-actions-share-message\", onChange: this.handleUpdateMessageField, rows: 3, placeholder: \"Include a personal note with the email message (optional)\" })))), _react2.default.createElement(_share_message_footer2.default, { currentInvitedUsers: currentInvitedUsers, currentUser: currentUser, permission: permission, reportOwner: reportOwner, showOverview: showOverview }));\n        }\n    }]);\n\n    return ShareMessage;\n}(_react.Component);\n\nexports.default = ShareMessage;\n\nShareMessage.propTypes = {\n    showOverview: _propTypes2.default.func.isRequired,\n    currentUser: _propTypes2.default.object.isRequired,\n    currentInvitedUsers: _propTypes2.default.object.isRequired,\n    messageUsers: _propTypes2.default.object.isRequired,\n    query: _propTypes2.default.string,\n    results: _propTypes2.default.object,\n    permission: _propTypes2.default.object,\n    message: _propTypes2.default.string,\n    isSendingMessage: _propTypes2.default.bool,\n    isLoadingUsers: _propTypes2.default.bool.isRequired,\n    send: _propTypes2.default.func.isRequired,\n    cancel: _propTypes2.default.func.isRequired,\n    updateMessage: _propTypes2.default.func.isRequired,\n    addUser: _propTypes2.default.func.isRequired,\n    removeUser: _propTypes2.default.func.isRequired,\n    reportId: _propTypes2.default.number.isRequired,\n    reportOwner: _propTypes2.default.object.isRequired,\n    disableSearch: _propTypes2.default.bool,\n    email: _propTypes2.default.string\n};\n\n/***/ }),\n/* 1433 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _share_icons = __webpack_require__(188);\n\nvar _share_icons2 = _interopRequireDefault(_share_icons);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar formatShareMessageFooter = _strings2.default.formatShareMessageFooter;\n\nvar ShareMessageFooter = function (_Component) {\n    _inherits(ShareMessageFooter, _Component);\n\n    function ShareMessageFooter() {\n        _classCallCheck(this, ShareMessageFooter);\n\n        return _possibleConstructorReturn(this, (ShareMessageFooter.__proto__ || Object.getPrototypeOf(ShareMessageFooter)).apply(this, arguments));\n    }\n\n    _createClass(ShareMessageFooter, [{\n        key: 'render',\n        value: function render() {\n            var props = this.props;\n            // We need to push the `reportOwner` into this list and filter the\n            // `currentUser` from it because `formatShareMessageFooter` expects an array\n            // of users who have access that are not the current user\n            // e.g.: Report Editors\n\n            var currentInvitedUserNames = props.currentInvitedUsers.push(props.reportOwner).filter(function (user) {\n                return user.get('id') !== props.currentUser.get('id');\n            }).map(function (user) {\n                return user.get('first_name') + ' ' + user.get('last_name');\n            });\n            var shareDescription = formatShareMessageFooter(currentInvitedUserNames.toArray(), 4);\n            return _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"div\", { className: \"share__options\" }, _react2.default.createElement(\"div\", { className: \"share__option\" }, _react2.default.createElement(_share_icons2.default, { type: props.permission.id, size: 42 }), _react2.default.createElement(\"div\", { className: \"share__option__body\" }, _react2.default.createElement(\"strong\", null, props.permission.name), _react2.default.createElement(\"p\", { className: \"share__option__description\" }, shareDescription)), _react2.default.createElement(\"a\", { className: \"share-panel-navigation-link share__option__edit__access\", onClick: props.showOverview }, \"Edit Access\", _react2.default.createElement(\"span\", { className: \"icon-righthead-2 share-panel-navigation-link-arrow\" })))));\n        }\n    }]);\n\n    return ShareMessageFooter;\n}(_react.Component);\n\nexports.default = ShareMessageFooter;\n\nShareMessageFooter.propTypes = {\n    currentInvitedUsers: _propTypes2.default.object.isRequired,\n    currentUser: _propTypes2.default.object.isRequired,\n    permission: _propTypes2.default.shape({\n        id: _propTypes2.default.string,\n        name: _propTypes2.default.string\n    }).isRequired,\n    reportOwner: _propTypes2.default.object.isRequired,\n    showOverview: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 1434 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ShareMessageHeader = function ShareMessageHeader(_ref) {\n    var title = _ref.title,\n        message = _ref.message;\n\n    return _react2.default.createElement(\"div\", { className: \"share-panel-message-header-container\" }, _react2.default.createElement(\"span\", { className: \"icon-email-1 color-gray_6\" }), _react2.default.createElement(\"div\", { className: \"share-panel-message-header\" }, _react2.default.createElement(\"h3\", null, title), _react2.default.createElement(\"p\", null, message)));\n};\nexports.default = ShareMessageHeader;\n\n/***/ }),\n/* 1435 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ShareMessageAction = function ShareMessageAction(_ref) {\n    var handleSubmit = _ref.handleSubmit,\n        children = _ref.children,\n        description = _ref.description,\n        cancel = _ref.cancel,\n        isDisabled = _ref.isDisabled,\n        isSendingMessage = _ref.isSendingMessage;\n\n    return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"form\", { onSubmit: handleSubmit }, children, _react2.default.createElement(\"fieldset\", { className: \"share-panel-to-description\" }, description), _react2.default.createElement(\"fieldset\", { className: \"share-panel-message-actions\" }, _react2.default.createElement(\"a\", { onClick: cancel, className: \"ui-button ghost\" }, \"Cancel\"), _react2.default.createElement(\"button\", { type: \"submit\", name: \"report-actions-submit-message\", className: \"ui-button primary\", disabled: isDisabled }, isSendingMessage && _react2.default.createElement(\"span\", { className: \"ui-loading_button\" }), \"Send\"))));\n};\nexports.default = ShareMessageAction;\n\n/***/ }),\n/* 1436 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactScroll = __webpack_require__(1437);\n\nvar Scroll = _interopRequireWildcard(_reactScroll);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nvar _ovid = __webpack_require__(8);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar scroll = Scroll.animateScroll;\n\nvar MessageUser = function (_Component) {\n    _inherits(MessageUser, _Component);\n\n    function MessageUser() {\n        _classCallCheck(this, MessageUser);\n\n        var _this = _possibleConstructorReturn(this, (MessageUser.__proto__ || Object.getPrototypeOf(MessageUser)).apply(this, arguments));\n\n        _this.onRemoveMessageUser = function (user) {\n            _this.props.removeUser(user);\n        };\n        return _this;\n    }\n\n    _createClass(MessageUser, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                user = _props.user,\n                isNewUser = _props.isNewUser,\n                isCurrentUser = _props.isCurrentUser,\n                removeUser = _props.removeUser;\n\n            var userClasses = (0, _classnames2.default)('ui-button', 'small', { 'new-user': isNewUser });\n            return _react2.default.createElement(\"span\", { title: isCurrentUser && 'Added automatically', className: userClasses }, user.get('full_name'), _react2.default.createElement(\"span\", { className: \"icon-remove-4\", onClick: function onClick() {\n                    return removeUser(user);\n                } }));\n        }\n    }]);\n\n    return MessageUser;\n}(_react.Component);\n\nMessageUser.propTypes = {\n    user: _propTypes2.default.object.isRequired,\n    isNewUser: _propTypes2.default.bool.isRequired,\n    isCurrentUser: _propTypes2.default.bool.isRequired,\n    removeUser: _propTypes2.default.func\n};\n\nvar MessageSearch = function (_Component2) {\n    _inherits(MessageSearch, _Component2);\n\n    function MessageSearch() {\n        _classCallCheck(this, MessageSearch);\n\n        var _this2 = _possibleConstructorReturn(this, (MessageSearch.__proto__ || Object.getPrototypeOf(MessageSearch)).apply(this, arguments));\n\n        _this2.onInputChange = _lodash2.default.debounce(function (value) {\n            InviteActions.updateSearchQuery(value);\n        }, 150);\n        _this2.onSelectResult = function (index) {\n            var _this2$props = _this2.props,\n                results = _this2$props.results,\n                addUser = _this2$props.addUser;\n\n            var user = results.get(index);\n            if (user) {\n                addUser(user);\n                scroll.scrollToBottom({\n                    containerId: 'message-search-pill-container',\n                    smooth: true,\n                    isDynamic: true\n                });\n            }\n        };\n        _this2.isCurrentUser = function (user) {\n            return _this2.props.currentUser && user.get('id') === _this2.props.currentUser.get('id');\n        };\n        _this2.renderMessageUsers = function () {\n            var _this2$props2 = _this2.props,\n                messageUsers = _this2$props2.messageUsers,\n                currentInvitedUsers = _this2$props2.currentInvitedUsers,\n                removeUser = _this2$props2.removeUser;\n\n            return messageUsers.map(function (user) {\n                return _react2.default.createElement(MessageUser, { key: user.get('id'), user: user, isNewUser: currentInvitedUsers.filter(function (eachUser) {\n                        return eachUser.get('id') === user.get('id');\n                    }).isEmpty() && !_this2.isCurrentUser(user), isCurrentUser: _this2.isCurrentUser(user), removeUser: removeUser });\n            }, _this2);\n        };\n        _this2.handleSearchClick = function () {\n            _this2.refs.search.focusInput();\n        };\n        return _this2;\n    }\n\n    _createClass(MessageSearch, [{\n        key: 'getResults',\n        value: function getResults() {\n            if (_lodash2.default.isEmpty(this.props.query)) {\n                return;\n            }\n            var _props2 = this.props,\n                query = _props2.query,\n                results = _props2.results;\n\n            return {\n                heading: results.count() + ' matches to \"' + query + '\" in your organization',\n                items: results.map(function (user) {\n                    return {\n                        title: user.get('full_name'),\n                        type: user.get('email')\n                    };\n                }).toArray()\n            };\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"share__options\" }, _react2.default.createElement(\"div\", { className: \"share__option message-search\" }, _react2.default.createElement(\"div\", { className: \"prefix\" }, \"To:\"), _react2.default.createElement(\"div\", { className: \"ui-search ui-search-div search\", onClick: this.handleSearchClick }, _react2.default.createElement(\"div\", { id: \"message-search-pill-container\", className: \"pill-container\" }, this.renderMessageUsers()), _react2.default.createElement(_ovid.Search, { ref: \"search\", results: this.getResults(), onInputChange: this.onInputChange, onSelectResult: this.onSelectResult, placeholder: this.props.isLoadingUsers ? 'Loading members...' : null }))));\n        }\n    }]);\n\n    return MessageSearch;\n}(_react.Component);\n\nexports.default = MessageSearch;\n\nMessageSearch.propTypes = {\n    query: _propTypes2.default.string,\n    results: _propTypes2.default.object,\n    currentUser: _propTypes2.default.object.isRequired,\n    currentInvitedUsers: _propTypes2.default.object.isRequired,\n    isLoadingUsers: _propTypes2.default.bool.isRequired,\n    messageUsers: _propTypes2.default.object.isRequired,\n    addUser: _propTypes2.default.func,\n    removeUser: _propTypes2.default.func\n};\n\n/***/ }),\n/* 1437 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Helpers = exports.ScrollElement = exports.ScrollLink = exports.animateScroll = exports.scrollSpy = exports.Events = exports.scroller = exports.Element = exports.Button = exports.Link = undefined;\n\nvar _Link = __webpack_require__(1438);\n\nvar _Link2 = _interopRequireDefault(_Link);\n\nvar _Button = __webpack_require__(1442);\n\nvar _Button2 = _interopRequireDefault(_Button);\n\nvar _Element = __webpack_require__(1443);\n\nvar _Element2 = _interopRequireDefault(_Element);\n\nvar _scroller = __webpack_require__(222);\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _scrollEvents = __webpack_require__(316);\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nvar _scrollSpy = __webpack_require__(314);\n\nvar _scrollSpy2 = _interopRequireDefault(_scrollSpy);\n\nvar _animateScroll = __webpack_require__(657);\n\nvar _animateScroll2 = _interopRequireDefault(_animateScroll);\n\nvar _scrollLink = __webpack_require__(313);\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nvar _scrollElement = __webpack_require__(659);\n\nvar _scrollElement2 = _interopRequireDefault(_scrollElement);\n\nvar _Helpers = __webpack_require__(1444);\n\nvar _Helpers2 = _interopRequireDefault(_Helpers);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Link = _Link2.default;\nexports.Button = _Button2.default;\nexports.Element = _Element2.default;\nexports.scroller = _scroller2.default;\nexports.Events = _scrollEvents2.default;\nexports.scrollSpy = _scrollSpy2.default;\nexports.animateScroll = _animateScroll2.default;\nexports.ScrollLink = _scrollLink2.default;\nexports.ScrollElement = _scrollElement2.default;\nexports.Helpers = _Helpers2.default;\nexports.default = { Link: _Link2.default, Button: _Button2.default, Element: _Element2.default, scroller: _scroller2.default, Events: _scrollEvents2.default, scrollSpy: _scrollSpy2.default, animateScroll: _animateScroll2.default, ScrollLink: _scrollLink2.default, ScrollElement: _scrollElement2.default, Helpers: _Helpers2.default };\n\n/***/ }),\n/* 1438 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollLink = __webpack_require__(313);\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LinkElement = function (_React$Component) {\n  _inherits(LinkElement, _React$Component);\n\n  function LinkElement() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LinkElement);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = LinkElement.__proto__ || Object.getPrototypeOf(LinkElement)).call.apply(_ref, [this].concat(args))), _this), _this.render = function () {\n      return _react2.default.createElement(\n        'a',\n        _this.props,\n        _this.props.children\n      );\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  return LinkElement;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _scrollLink2.default)(LinkElement);\n\n/***/ }),\n/* 1439 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1440 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n  /*\r\n   * https://github.com/oblador/angular-scroll (duScrollDefaultEasing)\r\n   */\n  defaultEasing: function defaultEasing(x) {\n    if (x < 0.5) {\n      return Math.pow(x * 2, 2) / 2;\n    }\n    return 1 - Math.pow((1 - x) * 2, 2) / 2;\n  },\n  /*\r\n   * https://gist.github.com/gre/1650294\r\n   */\n  // no easing, no acceleration\n  linear: function linear(x) {\n    return x;\n  },\n  // accelerating from zero velocity\n  easeInQuad: function easeInQuad(x) {\n    return x * x;\n  },\n  // decelerating to zero velocity\n  easeOutQuad: function easeOutQuad(x) {\n    return x * (2 - x);\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuad: function easeInOutQuad(x) {\n    return x < .5 ? 2 * x * x : -1 + (4 - 2 * x) * x;\n  },\n  // accelerating from zero velocity \n  easeInCubic: function easeInCubic(x) {\n    return x * x * x;\n  },\n  // decelerating to zero velocity π\n  easeOutCubic: function easeOutCubic(x) {\n    return --x * x * x + 1;\n  },\n  // acceleration until halfway, then deceleration \n  easeInOutCubic: function easeInOutCubic(x) {\n    return x < .5 ? 4 * x * x * x : (x - 1) * (2 * x - 2) * (2 * x - 2) + 1;\n  },\n  // accelerating from zero velocity \n  easeInQuart: function easeInQuart(x) {\n    return x * x * x * x;\n  },\n  // decelerating to zero velocity \n  easeOutQuart: function easeOutQuart(x) {\n    return 1 - --x * x * x * x;\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuart: function easeInOutQuart(x) {\n    return x < .5 ? 8 * x * x * x * x : 1 - 8 * --x * x * x * x;\n  },\n  // accelerating from zero velocity\n  easeInQuint: function easeInQuint(x) {\n    return x * x * x * x * x;\n  },\n  // decelerating to zero velocity\n  easeOutQuint: function easeOutQuint(x) {\n    return 1 + --x * x * x * x * x;\n  },\n  // acceleration until halfway, then deceleration \n  easeInOutQuint: function easeInOutQuint(x) {\n    return x < .5 ? 16 * x * x * x * x * x : 1 + 16 * --x * x * x * x * x;\n  }\n};\n\n/***/ }),\n/* 1441 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _passiveEventListeners = __webpack_require__(315);\n\nvar events = ['mousedown', 'mousewheel', 'touchmove', 'keydown'];\n\nexports.default = {\n  subscribe: function subscribe(cancelEvent) {\n    return typeof document !== 'undefined' && events.forEach(function (event) {\n      return (0, _passiveEventListeners.addPassiveEventListener)(document, event, cancelEvent);\n    });\n  }\n};\n\n/***/ }),\n/* 1442 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollLink = __webpack_require__(313);\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ButtonElement = function (_React$Component) {\n  _inherits(ButtonElement, _React$Component);\n\n  function ButtonElement() {\n    _classCallCheck(this, ButtonElement);\n\n    return _possibleConstructorReturn(this, (ButtonElement.__proto__ || Object.getPrototypeOf(ButtonElement)).apply(this, arguments));\n  }\n\n  _createClass(ButtonElement, [{\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'input',\n        this.props,\n        this.props.children\n      );\n    }\n  }]);\n\n  return ButtonElement;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _scrollLink2.default)(ButtonElement);\n\n/***/ }),\n/* 1443 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollElement = __webpack_require__(659);\n\nvar _scrollElement2 = _interopRequireDefault(_scrollElement);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ElementWrapper = function (_React$Component) {\n  _inherits(ElementWrapper, _React$Component);\n\n  function ElementWrapper() {\n    _classCallCheck(this, ElementWrapper);\n\n    return _possibleConstructorReturn(this, (ElementWrapper.__proto__ || Object.getPrototypeOf(ElementWrapper)).apply(this, arguments));\n  }\n\n  _createClass(ElementWrapper, [{\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      // Remove `parentBindings` from props\n      var newProps = _extends({}, this.props);\n      if (newProps.parentBindings) {\n        delete newProps.parentBindings;\n      }\n\n      return _react2.default.createElement(\n        'div',\n        _extends({}, newProps, { ref: function ref(el) {\n            _this2.props.parentBindings.domNode = el;\n          } }),\n        this.props.children\n      );\n    }\n  }]);\n\n  return ElementWrapper;\n}(_react2.default.Component);\n\n;\n\nElementWrapper.propTypes = {\n  name: _propTypes2.default.string,\n  id: _propTypes2.default.string\n};\n\nexports.default = (0, _scrollElement2.default)(ElementWrapper);\n\n/***/ }),\n/* 1444 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/* DEPRECATED */\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = __webpack_require__(0);\nvar ReactDOM = __webpack_require__(28);\n\nvar utils = __webpack_require__(167);\nvar scrollSpy = __webpack_require__(314);\nvar defaultScroller = __webpack_require__(222);\nvar PropTypes = __webpack_require__(1);\nvar scrollHash = __webpack_require__(658);\n\nvar protoTypes = {\n  to: PropTypes.string.isRequired,\n  containerId: PropTypes.string,\n  container: PropTypes.object,\n  activeClass: PropTypes.string,\n  spy: PropTypes.bool,\n  smooth: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n  offset: PropTypes.number,\n  delay: PropTypes.number,\n  isDynamic: PropTypes.bool,\n  onClick: PropTypes.func,\n  duration: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),\n  absolute: PropTypes.bool,\n  onSetActive: PropTypes.func,\n  onSetInactive: PropTypes.func,\n  ignoreCancelEvents: PropTypes.bool,\n  hashSpy: PropTypes.bool\n};\n\nvar Helpers = {\n  Scroll: function Scroll(Component, customScroller) {\n\n    console.warn(\"Helpers.Scroll is deprecated since v1.7.0\");\n\n    var scroller = customScroller || defaultScroller;\n\n    var Scroll = function (_React$Component) {\n      _inherits(Scroll, _React$Component);\n\n      function Scroll(props) {\n        _classCallCheck(this, Scroll);\n\n        var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, props));\n\n        _initialiseProps.call(_this);\n\n        _this.state = {\n          active: false\n        };\n        return _this;\n      }\n\n      _createClass(Scroll, [{\n        key: 'getScrollSpyContainer',\n        value: function getScrollSpyContainer() {\n          var containerId = this.props.containerId;\n          var container = this.props.container;\n\n          if (containerId) {\n            return document.getElementById(containerId);\n          }\n\n          if (container && container.nodeType) {\n            return container;\n          }\n\n          return document;\n        }\n      }, {\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n          if (this.props.spy || this.props.hashSpy) {\n            var scrollSpyContainer = this.getScrollSpyContainer();\n\n            if (!scrollSpy.isMounted(scrollSpyContainer)) {\n              scrollSpy.mount(scrollSpyContainer);\n            }\n\n            if (this.props.hashSpy) {\n              if (!scrollHash.isMounted()) {\n                scrollHash.mount(scroller);\n              }\n              scrollHash.mapContainer(this.props.to, scrollSpyContainer);\n            }\n\n            if (this.props.spy) {\n              scrollSpy.addStateHandler(this.stateHandler);\n            }\n\n            scrollSpy.addSpyHandler(this.spyHandler, scrollSpyContainer);\n\n            this.setState({\n              container: scrollSpyContainer\n            });\n          }\n        }\n      }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n          scrollSpy.unmount(this.stateHandler, this.spyHandler);\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          var className = \"\";\n\n          if (this.state && this.state.active) {\n            className = ((this.props.className || \"\") + \" \" + (this.props.activeClass || \"active\")).trim();\n          } else {\n            className = this.props.className;\n          }\n\n          var props = _extends({}, this.props);\n\n          for (var prop in protoTypes) {\n            if (props.hasOwnProperty(prop)) {\n              delete props[prop];\n            }\n          }\n\n          props.className = className;\n          props.onClick = this.handleClick;\n\n          return React.createElement(Component, props);\n        }\n      }]);\n\n      return Scroll;\n    }(React.Component);\n\n    var _initialiseProps = function _initialiseProps() {\n      var _this2 = this;\n\n      this.scrollTo = function (to, props) {\n        scroller.scrollTo(to, _extends({}, _this2.state, props));\n      };\n\n      this.handleClick = function (event) {\n\n        /*\r\n         * give the posibility to override onClick\r\n         */\n\n        if (_this2.props.onClick) {\n          _this2.props.onClick(event);\n        }\n\n        /*\r\n         * dont bubble the navigation\r\n         */\n\n        if (event.stopPropagation) event.stopPropagation();\n        if (event.preventDefault) event.preventDefault();\n\n        /*\r\n         * do the magic!\r\n         */\n        _this2.scrollTo(_this2.props.to, _this2.props);\n      };\n\n      this.stateHandler = function () {\n        if (scroller.getActiveLink() !== _this2.props.to) {\n          if (_this2.state !== null && _this2.state.active && _this2.props.onSetInactive) {\n            _this2.props.onSetInactive();\n          }\n          _this2.setState({ active: false });\n        }\n      };\n\n      this.spyHandler = function (y) {\n\n        var scrollSpyContainer = _this2.getScrollSpyContainer();\n\n        if (scrollHash.isMounted() && !scrollHash.isInitialized()) {\n          return;\n        }\n\n        var to = _this2.props.to;\n        var element = null;\n        var elemTopBound = 0;\n        var elemBottomBound = 0;\n        var containerTop = 0;\n\n        if (scrollSpyContainer.getBoundingClientRect) {\n          var containerCords = scrollSpyContainer.getBoundingClientRect();\n          containerTop = containerCords.top;\n        }\n\n        if (!element || _this2.props.isDynamic) {\n          element = scroller.get(to);\n          if (!element) {\n            return;\n          }\n\n          var cords = element.getBoundingClientRect();\n          elemTopBound = cords.top - containerTop + y;\n          elemBottomBound = elemTopBound + cords.height;\n        }\n\n        var offsetY = y - _this2.props.offset;\n        var isInside = offsetY >= Math.floor(elemTopBound) && offsetY < Math.floor(elemBottomBound);\n        var isOutside = offsetY < Math.floor(elemTopBound) || offsetY >= Math.floor(elemBottomBound);\n        var activeLink = scroller.getActiveLink();\n\n        if (isOutside) {\n          if (to === activeLink) {\n            scroller.setActiveLink(void 0);\n          }\n\n          if (_this2.props.hashSpy && scrollHash.getHash() === to) {\n            scrollHash.changeHash();\n          }\n\n          if (_this2.props.spy && _this2.state.active) {\n            _this2.setState({ active: false });\n            _this2.props.onSetInactive && _this2.props.onSetInactive();\n          }\n\n          return scrollSpy.updateStates();\n        }\n\n        if (isInside && activeLink !== to) {\n          scroller.setActiveLink(to);\n\n          _this2.props.hashSpy && scrollHash.changeHash(to);\n\n          if (_this2.props.spy) {\n            _this2.setState({ active: true });\n            _this2.props.onSetActive && _this2.props.onSetActive(to);\n          }\n          return scrollSpy.updateStates();\n        }\n      };\n    };\n\n    ;\n\n    Scroll.propTypes = protoTypes;\n\n    Scroll.defaultProps = { offset: 0 };\n\n    return Scroll;\n  },\n  Element: function Element(Component) {\n\n    console.warn(\"Helpers.Element is deprecated since v1.7.0\");\n\n    var Element = function (_React$Component2) {\n      _inherits(Element, _React$Component2);\n\n      function Element(props) {\n        _classCallCheck(this, Element);\n\n        var _this3 = _possibleConstructorReturn(this, (Element.__proto__ || Object.getPrototypeOf(Element)).call(this, props));\n\n        _this3.childBindings = {\n          domNode: null\n        };\n        return _this3;\n      }\n\n      _createClass(Element, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n          if (typeof window === 'undefined') {\n            return false;\n          }\n          this.registerElems(this.props.name);\n        }\n      }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n          if (this.props.name !== nextProps.name) {\n            this.registerElems(nextProps.name);\n          }\n        }\n      }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n          if (typeof window === 'undefined') {\n            return false;\n          }\n          defaultScroller.unregister(this.props.name);\n        }\n      }, {\n        key: 'registerElems',\n        value: function registerElems(name) {\n          defaultScroller.register(name, this.childBindings.domNode);\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          return React.createElement(Component, _extends({}, this.props, { parentBindings: this.childBindings }));\n        }\n      }]);\n\n      return Element;\n    }(React.Component);\n\n    ;\n\n    Element.propTypes = {\n      name: PropTypes.string,\n      id: PropTypes.string\n    };\n\n    return Element;\n  }\n};\n\nmodule.exports = Helpers;\n\n/***/ }),\n/* 1445 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShareNotification = function (_Component) {\n    _inherits(ShareNotification, _Component);\n\n    function ShareNotification() {\n        _classCallCheck(this, ShareNotification);\n\n        return _possibleConstructorReturn(this, (ShareNotification.__proto__ || Object.getPrototypeOf(ShareNotification)).apply(this, arguments));\n    }\n\n    _createClass(ShareNotification, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"ui-modal share-notification\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"h2\", null, \"We see you've made changes!\"), _react2.default.createElement(\"p\", null, \"Would you like to share with your colleagues?\"), _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { id: \"share-report-notification-accept\", className: \"ui-button primary report-share-share-button\", onClick: this.props.onYes }, \"Yes, share\"), _react2.default.createElement(\"button\", { id: \"share-report-notification-ignore\", className: \"ui-button ghost report-share-ignore-button\", onClick: this.props.onNo }, \"Not now\")), _react2.default.createElement(\"button\", { id: \"share-report-notification-disable\", className: \"ui-button ghost no-color small dismiss-forever-button\", onClick: this.props.onNever }, \"Do not show this notification again\")));\n        }\n    }]);\n\n    return ShareNotification;\n}(_react.Component);\n\nexports.default = ShareNotification;\n\nShareNotification.propTypes = {\n    onYes: _propTypes2.default.func.isRequired,\n    onNo: _propTypes2.default.func.isRequired,\n    onNever: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 1446 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _report_permission_options = __webpack_require__(660);\n\nvar _report_permission_options2 = _interopRequireDefault(_report_permission_options);\n\nvar _report_permission_option = __webpack_require__(1447);\n\nvar _report_permission_option2 = _interopRequireDefault(_report_permission_option);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ChangeReportPermission = function (_React$Component) {\n    _inherits(ChangeReportPermission, _React$Component);\n\n    function ChangeReportPermission(props) {\n        _classCallCheck(this, ChangeReportPermission);\n\n        var _this = _possibleConstructorReturn(this, (ChangeReportPermission.__proto__ || Object.getPrototypeOf(ChangeReportPermission)).call(this, props));\n\n        _this.onOptionClick = function (selectedOption) {\n            _this.setState({ selectedOption: selectedOption });\n        };\n        _this.onSaveClick = function () {\n            var selectedOption = _this.state.selectedOption;\n\n            _report_actions2.default.updateReportPermission({\n                visibility: selectedOption.id\n            });\n            if (_this.props.onSave) {\n                _this.props.onSave();\n            }\n        };\n        _this.state = { selectedOption: props.initialPermission };\n        return _this;\n    }\n\n    _createClass(ChangeReportPermission, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"h3\", null, \"Edit sharing settings\"), _react2.default.createElement(\"p\", null, \"Change who is able to see this report.\"), _react2.default.createElement(\"ul\", { className: \"ui-select-list\" }, _report_permission_options2.default.map(function (option) {\n                return _react2.default.createElement(_report_permission_option2.default, Object.assign({}, option, { selected: option === _this2.state.selectedOption, onClick: function onClick() {\n                        return _this2.onOptionClick(option);\n                    } }));\n            }))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"a\", { onClick: this.props.onCancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.onSaveClick }, \"Save\"))));\n        }\n    }]);\n\n    return ChangeReportPermission;\n}(_react2.default.Component);\n\nexports.default = ChangeReportPermission;\n\nChangeReportPermission.propTypes = {\n    initialPermission: _propTypes2.default.object,\n    onSave: _propTypes2.default.func,\n    onCancel: _propTypes2.default.func\n};\n\n/***/ }),\n/* 1447 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _share_icons = __webpack_require__(188);\n\nvar _share_icons2 = _interopRequireDefault(_share_icons);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportPermissionOption = function (_React$Component) {\n    _inherits(ReportPermissionOption, _React$Component);\n\n    function ReportPermissionOption() {\n        _classCallCheck(this, ReportPermissionOption);\n\n        return _possibleConstructorReturn(this, (ReportPermissionOption.__proto__ || Object.getPrototypeOf(ReportPermissionOption)).apply(this, arguments));\n    }\n\n    _createClass(ReportPermissionOption, [{\n        key: 'render',\n        value: function render() {\n            var itemClassName = (0, _classnames2.default)({\n                'ui-select-list__item': true,\n                'is-selected': this.props.selected\n            });\n            return _react2.default.createElement(\"li\", { onClick: this.props.onClick }, _react2.default.createElement(\"a\", { className: itemClassName }, _react2.default.createElement(_share_icons2.default, { type: this.props.id, size: 42 }), _react2.default.createElement(\"div\", { className: \"share__option__body\" }, _react2.default.createElement(\"strong\", null, this.props.name), _react2.default.createElement(\"p\", { className: \"share__option__description\" }, this.props.description))));\n        }\n    }]);\n\n    return ReportPermissionOption;\n}(_react2.default.Component);\n\nexports.default = ReportPermissionOption;\n\nReportPermissionOption.propTypes = {\n    name: _propTypes2.default.string,\n    description: _propTypes2.default.string,\n    selected: _propTypes2.default.bool,\n    onClick: _propTypes2.default.func\n};\n\n/***/ }),\n/* 1448 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _invitable_user = __webpack_require__(1449);\n\nvar _invitable_user2 = _interopRequireDefault(_invitable_user);\n\nvar _share_icons = __webpack_require__(188);\n\nvar _share_icons2 = _interopRequireDefault(_share_icons);\n\nvar _error_display = __webpack_require__(1452);\n\nvar _error_display2 = _interopRequireDefault(_error_display);\n\nvar _invitee_search = __webpack_require__(1453);\n\nvar _invitee_search2 = _interopRequireDefault(_invitee_search);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShareOptionsContent = function (_React$Component) {\n    _inherits(ShareOptionsContent, _React$Component);\n\n    function ShareOptionsContent() {\n        _classCallCheck(this, ShareOptionsContent);\n\n        var _this = _possibleConstructorReturn(this, (ShareOptionsContent.__proto__ || Object.getPrototypeOf(ShareOptionsContent)).apply(this, arguments));\n\n        _this.onClick = function () {\n            if (!_this.props.currentPermission.readonly) {\n                _this.props.onEditPermission();\n            }\n        };\n        _this.onRemoveUser = function (user) {\n            InviteActions.removeUser(user);\n            if (user.get('id') === _this.props.sessionId) {\n                _this._loadReportIndex();\n            }\n        };\n        _this.renderInvitedUsers = function () {\n            var _this$props$invites = _this.props.invites,\n                users = _this$props$invites.users,\n                currentInvitedUsers = _this$props$invites.currentInvitedUsers,\n                reportRoles = _this$props$invites.reportRoles;\n\n            return users.map(function (user) {\n                var invite = currentInvitedUsers.filter(function (u) {\n                    return u.get('id') === user.get('id');\n                }).first();\n                return _react2.default.createElement(_invitable_user2.default, { user: user, key: user.get('id'), invite: invite, reportRoles: reportRoles, onRemoveUser: _this.onRemoveUser, updateRole: _this._updateRole });\n            });\n        };\n        _this._updateRole = function (userId, role) {\n            var _this$props = _this.props,\n                reportId = _this$props.reportId,\n                sessionId = _this$props.sessionId;\n            // TODO: GRA-462: actually handle the response from the server correctly\n            // fix this method as well as _loadReportIndex() and _reloadReport()\n\n            InviteActions.updateUserRole(userId, reportId, role).then(function () {\n                //if we are changing the owner redirect to the report page\n                if (role === 'owner') {\n                    _this._loadReportIndex();\n                }\n                //if we are editing a role for current user reload page\n                if (userId === sessionId) {\n                    _this._reloadReport();\n                }\n            });\n        };\n        return _this;\n    }\n\n    _createClass(ShareOptionsContent, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                currentPermission = _props.currentPermission,\n                onBack = _props.onBack;\n\n            return _react2.default.createElement(\"span\", null, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"a\", { className: \"share-panel-navigation-link back-link\", onClick: onBack }, _react2.default.createElement(\"span\", { className: \"icon-lefthead-2 share-panel-navigation-link-arrow\" }), \"Back\"), _react2.default.createElement(\"h3\", { className: \"share-panel-inline-header\" }, \"Report Access\")), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"div\", { className: \"share__options\" }, _react2.default.createElement(\"div\", { className: \"share__option\" }, _react2.default.createElement(_share_icons2.default, { type: currentPermission.id, size: 42 }), !currentPermission.readonly ? _react2.default.createElement(\"a\", { className: \"ui-button small ghost\", onClick: this.onClick }, \"Change\") : null, _react2.default.createElement(\"div\", { className: \"share__option__body\" }, _react2.default.createElement(\"strong\", { className: \"share__option__name\" }, currentPermission.name), _react2.default.createElement(\"p\", { className: \"share__option__description\" }, currentPermission.description))))), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, this.props.error ? _react2.default.createElement(_error_display2.default, { error: this.props.error }) : null, _react2.default.createElement(\"h3\", null, \"Who can see this report?\"), _react2.default.createElement(\"p\", null, \"Invite members of your organization to this report.\"), _react2.default.createElement(\"div\", { className: \"share__users\" }, _react2.default.createElement(_invitee_search2.default, Object.assign({}, this.props.invites.search, { isLoadingUsers: this.props.isLoadingUsers })), currentPermission.id === 'my_organization' ? _react2.default.createElement(\"div\", { className: \"share__user share__user_my-org\" }, _react2.default.createElement(_share_icons2.default, { type: \"my_organization\" }), _react2.default.createElement(\"strong\", { className: \"share__user__name\" }, \"My organization\")) : null, this.props.invites.owner && this.props.invites.owner.get('id') ? _react2.default.createElement(_invitable_user2.default, { user: this.props.invites.owner, key: this.props.invites.owner.get('id'), isOwner: true, reportRoles: this.props.invites.reportRoles, onRemoveUser: this.onRemoveUser, updateRole: this._updateRole }) : null, this.renderInvitedUsers(), this.props.invites.pendingUser ? _react2.default.createElement(_invitable_user2.default, { user: this.props.invites.pendingUser, pending: true, key: this.props.invites.pendingUser.get('id'), reportRoles: this.props.invites.reportRoles, onRemoveUser: this.onRemoveUser, updateRole: this._updateRole }) : null)));\n        }\n    }, {\n        key: '_loadReportIndex',\n        value: function _loadReportIndex() {\n            var entity = this.props.entity;\n\n            this.props.transitionTo('report-index', { entity: entity });\n        }\n    }, {\n        key: '_reloadReport',\n        value: function _reloadReport() {\n            window.location.reload();\n        }\n    }]);\n\n    return ShareOptionsContent;\n}(_react2.default.Component);\n\nexports.default = ShareOptionsContent;\n\nShareOptionsContent.propTypes = {\n    reportId: _propTypes2.default.number.isRequired,\n    sessionId: _propTypes2.default.number.isRequired,\n    entity: _propTypes2.default.string.isRequired,\n    currentPermission: _propTypes2.default.object,\n    transitionTo: _propTypes2.default.func.isRequired,\n    invites: _propTypes2.default.object.isRequired,\n    isLoadingUsers: _propTypes2.default.bool.isRequired\n};\n\n/***/ }),\n/* 1449 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _ovid = __webpack_require__(8);\n\nvar _owner_confirmation = __webpack_require__(1450);\n\nvar _owner_confirmation2 = _interopRequireDefault(_owner_confirmation);\n\nvar _share_options_dropdown = __webpack_require__(1451);\n\nvar _share_options_dropdown2 = _interopRequireDefault(_share_options_dropdown);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar InvitableUser = function (_React$Component) {\n    _inherits(InvitableUser, _React$Component);\n\n    function InvitableUser() {\n        _classCallCheck(this, InvitableUser);\n\n        var _this = _possibleConstructorReturn(this, (InvitableUser.__proto__ || Object.getPrototypeOf(InvitableUser)).apply(this, arguments));\n\n        _this.state = {\n            showConfirmation: false\n        };\n        _this._getActionSection = function () {\n            var _this$props = _this.props,\n                user = _this$props.user,\n                reportRoles = _this$props.reportRoles,\n                onRemoveUser = _this$props.onRemoveUser;\n\n            var content = _this.props.pending ? _react2.default.createElement(\"div\", { className: \"share__user__action pending__label\" }, \"Pending...\") : _react2.default.createElement(\"div\", { className: \"share__user__action\" }, _react2.default.createElement(_share_options_dropdown2.default, { options: reportRoles, onChange: _this._onChangeRole, user: user }), _react2.default.createElement(\"a\", { className: \"share__user__remove ui-button small ghost negative icon-remove-2\", \"data-hint\": \"Remove user from report\", \"data-hint-position\": \"bottom\", \"data-hint-align\": \"right\", onClick: function onClick() {\n                    return onRemoveUser(user);\n                } }));\n            return _react2.default.createElement(\"div\", { className: \"share__user__action\" }, content);\n        };\n        _this._onChangeRole = function (value) {\n            var confirmOwner = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n            var _this$props2 = _this.props,\n                user = _this$props2.user,\n                updateRole = _this$props2.updateRole;\n\n            if (value === 'owner' && confirmOwner) {\n                _this.setState({ showConfirmation: true });\n                return;\n            }\n            updateRole(user.get('id'), value);\n        };\n        _this._hideConfirmation = function () {\n            _this.setState({ showConfirmation: false });\n        };\n        return _this;\n    }\n\n    _createClass(InvitableUser, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                user = _props.user,\n                pending = _props.pending,\n                invite = _props.invite,\n                isOwner = _props.isOwner;\n\n            var userClasses = (0, _classnames2.default)({\n                share__user: true,\n                share__user__pending: pending\n            });\n            var userMessage = void 0;\n            if (invite) {\n                var hasUserSeenReport = invite.get('last_seen') !== null;\n                userMessage = hasUserSeenReport ? 'Viewed' : 'Invited';\n                if (hasUserSeenReport) {\n                    userMessage += ' ' + (0, _moment2.default)(invite.get('last_seen')).fromNow();\n                }\n            }\n            if (isOwner) {\n                userMessage = 'Report Owner';\n            }\n            return _react2.default.createElement(\"div\", { key: user.get('id'), className: userClasses }, _react2.default.createElement(_ovid.Avatar, { id: user.get('id'), size: \"small\", firstName: user.get('first_name'), lastName: user.get('last_name'), email: user.get('email'), url: user.get('avatar') }), _react2.default.createElement(\"span\", { className: \"share__user__name\" }, _react2.default.createElement(\"strong\", null, user.get('full_name')), \" \", user.get('isCurrentUser') && _react2.default.createElement(\"span\", null, \"(You)\"), userMessage && _react2.default.createElement(\"small\", null, userMessage)), !isOwner && this._getActionSection(), this.state.showConfirmation && _react2.default.createElement(_owner_confirmation2.default, { confirm: this._onChangeRole, cancel: this._hideConfirmation }));\n        }\n    }]);\n\n    return InvitableUser;\n}(_react2.default.Component);\n\nexports.default = InvitableUser;\n\nInvitableUser.propTypes = {\n    user: _propTypes2.default.object.isRequired,\n    reportRoles: _propTypes2.default.object.isRequired,\n    updateRole: _propTypes2.default.func.isRequired,\n    onRemoveUser: _propTypes2.default.func.isRequired,\n    pending: _propTypes2.default.bool\n};\n\n/***/ }),\n/* 1450 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar OwnerConfirmation = function (_React$Component) {\n    _inherits(OwnerConfirmation, _React$Component);\n\n    function OwnerConfirmation() {\n        _classCallCheck(this, OwnerConfirmation);\n\n        var _this = _possibleConstructorReturn(this, (OwnerConfirmation.__proto__ || Object.getPrototypeOf(OwnerConfirmation)).apply(this, arguments));\n\n        _this._onConfirm = function () {\n            var confirm = _this.props.confirm;\n\n            confirm('owner', false);\n        };\n        return _this;\n    }\n\n    _createClass(OwnerConfirmation, [{\n        key: 'render',\n        value: function render() {\n            var cancel = this.props.cancel;\n\n            return _react2.default.createElement(\"div\", { className: \"share__confirmation\" }, _react2.default.createElement(\"h5\", null, \"Are you sure?\"), _react2.default.createElement(\"p\", null, \"Changing owners will remove your access to this report unless you are invited again.\"), _react2.default.createElement(\"div\", { className: \"share__confirmation__buttons\" }, _react2.default.createElement(\"button\", { className: \"ui-button small ghost\", onClick: cancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button primary small\", onClick: this._onConfirm }, \"Confirm\")));\n        }\n    }]);\n\n    return OwnerConfirmation;\n}(_react2.default.Component);\n\nexports.default = OwnerConfirmation;\n\nOwnerConfirmation.propTypes = {\n    confirm: _propTypes2.default.func.isRequired,\n    cancel: _propTypes2.default.func.isRequired\n};\n\n/***/ }),\n/* 1451 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ovid = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ShareOptionsDropdown = function (_React$Component) {\n    _inherits(ShareOptionsDropdown, _React$Component);\n\n    function ShareOptionsDropdown() {\n        _classCallCheck(this, ShareOptionsDropdown);\n\n        return _possibleConstructorReturn(this, (ShareOptionsDropdown.__proto__ || Object.getPrototypeOf(ShareOptionsDropdown)).apply(this, arguments));\n    }\n\n    _createClass(ShareOptionsDropdown, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                options = _props.options,\n                onChange = _props.onChange,\n                user = _props.user;\n\n            return _react2.default.createElement(_ovid.DropdownList, { defaultTitle: user.get('reportRole'), position: \"align-right\", onChange: onChange }, options.map(function (option) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { title: option.get('display_name'), key: option.get('name'), value: option.get('name') });\n            }));\n        }\n    }]);\n\n    return ShareOptionsDropdown;\n}(_react2.default.Component);\n\nexports.default = ShareOptionsDropdown;\n\nShareOptionsDropdown.propTypes = {\n    options: _propTypes2.default.object.isRequired,\n    onChange: _propTypes2.default.func.isRequired,\n    user: _propTypes2.default.object.isRequired\n};\n\n/***/ }),\n/* 1452 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getInviteErrorMessage = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar getInviteErrorMessage = exports.getInviteErrorMessage = function getInviteErrorMessage(type) {\n    switch (type) {\n        case 'inviteFailed':\n            return 'Could not invite the user';\n        case 'notAuthorized':\n            return 'You are not authorized to make this change';\n        default:\n            return 'An error has occurred';\n    }\n};\nvar ErrorDisplay = function ErrorDisplay(_ref) {\n    var error = _ref.error;\n    return _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), getInviteErrorMessage(error), _react2.default.createElement(\"div\", { className: \"ui-alert__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button small\", onClick: InviteActions.dismissError }, \"Ok\")));\n};\nexports.default = ErrorDisplay;\n\n/***/ }),\n/* 1453 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _ovid = __webpack_require__(8);\n\nvar _invite_actions = __webpack_require__(80);\n\nvar InviteActions = _interopRequireWildcard(_invite_actions);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar InviteeSearch = function (_Component) {\n    _inherits(InviteeSearch, _Component);\n\n    function InviteeSearch() {\n        _classCallCheck(this, InviteeSearch);\n\n        var _this = _possibleConstructorReturn(this, (InviteeSearch.__proto__ || Object.getPrototypeOf(InviteeSearch)).apply(this, arguments));\n\n        _this.onInputChange = (0, _lodash.debounce)(function (value) {\n            InviteActions.updateSearchQuery(value);\n        }, 150);\n        _this.onSelectResult = function (index) {\n            var results = _this.props.results;\n\n            var user = results.get(index);\n            if (user) {\n                InviteActions.addUser(user);\n            }\n        };\n        return _this;\n    }\n\n    _createClass(InviteeSearch, [{\n        key: 'getResults',\n        value: function getResults() {\n            if ((0, _lodash.isEmpty)(this.props.query)) {\n                return;\n            }\n            var _props = this.props,\n                query = _props.query,\n                results = _props.results;\n\n            return {\n                heading: results.count() + ' matches to \"' + query + '\" in your organization',\n                items: results.map(function (user) {\n                    return {\n                        title: user.get('full_name'),\n                        type: user.get('email')\n                    };\n                }).toArray()\n            };\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(_ovid.Search, { placeholder: this.props.isLoadingUsers ? 'Loading members...' : 'Search by name or email', results: this.getResults(), onInputChange: this.onInputChange, onSelectResult: this.onSelectResult });\n        }\n    }]);\n\n    return InviteeSearch;\n}(_react.Component);\n\nexports.default = InviteeSearch;\n\nInviteeSearch.propTypes = {\n    query: _propTypes2.default.string,\n    results: _propTypes2.default.object,\n    isLoadingUsers: _propTypes2.default.bool.isRequired\n};\n\n/***/ }),\n/* 1454 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _grid_download_menu = __webpack_require__(1455);\n\nvar _grid_download_menu2 = _interopRequireDefault(_grid_download_menu);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ExportFilter = (0, _createReactClass2.default)({\n    displayName: 'ExportFilter',\n\n    mixins: [(0, _og_flux.StoreListener)(_grid_report_store2.default)],\n    propTypes: {\n        fiscalYears: _propTypes2.default.array,\n        fullDataSet: _propTypes2.default.object,\n        showExportFilter: _propTypes2.default.bool,\n        hideExportFilter: _propTypes2.default.bool,\n        isLoading: _propTypes2.default.bool\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            email: null,\n            fiscalYears: [],\n            showExportFilter: false,\n            fullDataSet: null\n        };\n    },\n    getInitialState: function getInitialState() {\n        return {\n            shouldShowExportFilter: _grid_report_store2.default.isShowingExportFilter(),\n            parallelCapable: _grid_report_store2.default.getSchema().get('dbParallelCapable')\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState({\n            shouldShowExportFilter: _grid_report_store2.default.isShowingExportFilter(),\n            parallelCapable: _grid_report_store2.default.getSchema().get('dbParallelCapable')\n        });\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { id: \"grid-download-content\" }, !this.state.shouldShowExportFilter && _react2.default.createElement(_grid_download_menu2.default, { stateScaleEntity: this.state.parallelCapable, fiscalYears: this.props.fiscalYears, fullDataSet: this.props.fullDataSet, onExportFilter: _grid_report_actions2.default.showExportFilter, isLoading: this.props.isLoading }));\n    }\n});\nexports.default = ExportFilter;\n\n/***/ }),\n/* 1455 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ROW_LIMIT = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ROW_LIMIT = exports.ROW_LIMIT = 50000;\nvar GridDownloadMenu = (0, _createReactClass2.default)({\n    displayName: 'GridDownloadMenu',\n\n    propTypes: {\n        stateScaleEntity: _propTypes2.default.bool,\n        fiscalYears: _propTypes2.default.array,\n        fullDataSet: _propTypes2.default.object,\n        isLoading: _propTypes2.default.bool,\n        reportDataSize: _propTypes2.default.number,\n        onExportFilter: _propTypes2.default.func.isRequired,\n        headerOptions: _propTypes2.default.object\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            fiscalYears: [],\n            fullDataSet: null,\n            reportDataSize: 0\n        };\n    },\n    buttonItem: function buttonItem(fiscalYear, index) {\n        return _react2.default.createElement(\"a\", { className: \"ui-button flex-btn\", target: \"_blank\", href: fiscalYear.url, key: fiscalYear.name + '_' + index }, _react2.default.createElement(\"span\", { className: \"flex-item icon-csv-1\", \"aria-label\": \"File type CSV\" }, fiscalYear.name), _react2.default.createElement(\"small\", { className: \"icon-download-1\", \"aria-label\": \"File size\" }, fiscalYear.size));\n    },\n    buttonContainer: function buttonContainer(content, key, stacked) {\n        return _react2.default.createElement(\"div\", { className: (0, _classnames2.default)('transaction-download', { 'ui-button-stack': stacked }) }, content);\n    },\n    tooManyRowsError: function tooManyRowsError(rowsLimit) {\n        return 'Filter selections with more than ' + _utils2.default.formatNumberComma(rowsLimit) + ' rows are not available for export at this time';\n    },\n    exportFilterButton: function exportFilterButton() {\n        var _props = this.props,\n            headerOptions = _props.headerOptions,\n            onExportFilter = _props.onExportFilter;\n\n        var session = _session_store2.default.getSession();\n        var rowsCount = headerOptions && headerOptions.griddleState.count;\n        var exportDisabled = !session && rowsCount > ROW_LIMIT;\n        return _react2.default.createElement(\"div\", { \"data-hint-position\": \"bottom\", \"data-hint\": exportDisabled ? this.tooManyRowsError(ROW_LIMIT) : null }, _react2.default.createElement(\"button\", { className: (0, _classnames2.default)('ui-button primary block', { disabled: exportDisabled }), onClick: onExportFilter }, exportDisabled ? 'Exporting Unavailable' : 'Export Current View'));\n    },\n    renderContent: function renderContent() {\n        var _props2 = this.props,\n            stateScaleEntity = _props2.stateScaleEntity,\n            isLoading = _props2.isLoading,\n            fiscalYears = _props2.fiscalYears,\n            fullDataSet = _props2.fullDataSet;\n\n        if (!isLoading && (fiscalYears.length > 0 || fullDataSet)) {\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"p\", { className: \"message\" }, \"Export the currently filtered view or select which file to download:\"), this.exportFilterButton(), fullDataSet && this.buttonContainer(this.buttonItem(fullDataSet), 'fullDataSetContainer', false), this.buttonContainer(_lodash2.default.map(fiscalYears, this.buttonItem), 'fiscalYears', true));\n        }\n        return _react2.default.createElement(\"div\", null, this.exportFilterButton(), !stateScaleEntity && _react2.default.createElement(\"p\", { className: \"no-data\" }, \"We are generating yearly export files. Check back later for more options.\"));\n    },\n    render: function render() {\n        var isLoading = this.props.isLoading;\n\n        return _react2.default.createElement(\"div\", { id: \"dropdown-grid-download\" }, _react2.default.createElement(\"div\", { className: \"ui-card__header\" }, _react2.default.createElement(\"h4\", null, \"Download Data\")), _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, isLoading ? _react2.default.createElement(\"div\", { className: \"ui-loading_small\" }) : this.renderContent()));\n    }\n});\nexports.default = GridDownloadMenu;\n\n/***/ }),\n/* 1456 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _target_utils = __webpack_require__(99);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TargetToggle = function (_React$Component) {\n    _inherits(TargetToggle, _React$Component);\n\n    function TargetToggle() {\n        _classCallCheck(this, TargetToggle);\n\n        return _possibleConstructorReturn(this, (TargetToggle.__proto__ || Object.getPrototypeOf(TargetToggle)).apply(this, arguments));\n    }\n\n    _createClass(TargetToggle, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                isControlPanel = _props.isControlPanel,\n                isPanelOpen = _props.isPanelOpen,\n                graphType = _props.graphType,\n                isVisShown = _props.isVisShown,\n                target = _props.target;\n\n            if (isControlPanel) {\n                return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Target\"), _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: 'filter-toggle ui-button small target-toggle ' + (isPanelOpen ? 'active' : '') + ' ' + (!(isVisShown && (0, _target_utils.isTargetGraph)(graphType)) ? 'disabled' : ''), onClick: _grid_report_actions2.default.toggleTargetPanel }, _react2.default.createElement(\"span\", { className: \"target-toggle__text\" }, (0, _target_utils.isTargetValid)(target) ? (0, _target_utils.getTargetText)(target) : 'Add a Target'), _react2.default.createElement(\"div\", { className: \"filter-toggle__actions\" }, _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__close\" }), _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__open\" })))));\n            } else {\n                if ((0, _target_utils.isTargetValid)(target)) {\n                    return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Target\"), _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, (0, _target_utils.getTargetText)(target)));\n                } else {\n                    return null;\n                }\n            }\n        }\n    }]);\n\n    return TargetToggle;\n}(_react2.default.Component);\n\nexports.default = TargetToggle;\n\n/***/ }),\n/* 1457 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _immutable = __webpack_require__(14);\n\nvar _ovid = __webpack_require__(8);\n\nvar _target_utils = __webpack_require__(99);\n\nvar _target_progress_bar = __webpack_require__(1458);\n\nvar _target_progress_bar2 = _interopRequireDefault(_target_progress_bar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TargetPanelContainer = function (_React$Component) {\n    _inherits(TargetPanelContainer, _React$Component);\n\n    function TargetPanelContainer(props) {\n        _classCallCheck(this, TargetPanelContainer);\n\n        var _this = _possibleConstructorReturn(this, (TargetPanelContainer.__proto__ || Object.getPrototypeOf(TargetPanelContainer)).call(this, props));\n\n        _this._subscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).on('click', _this.handleDocumentClick);\n        };\n        _this._unsubscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).off('click', _this.handleDocumentClick);\n        };\n        _this.isBetweenValuesValid = function () {\n            var _this$state$value = _this.state.value,\n                from = _this$state$value.from,\n                to = _this$state$value.to;\n\n            return !(from && to) || parseFloat(to) > parseFloat(from);\n        };\n        _this.isTargetValid = function () {\n            var _this$state = _this.state,\n                type = _this$state.type,\n                value = _this$state.value;\n\n            if ((0, _target_utils.isBetweenTarget)(type)) {\n                return (0, _target_utils.isNumeric)(value.from) && (0, _target_utils.isNumeric)(value.to) && _this.isBetweenValuesValid() && _lodash2.default.every(_this.isWarningThresholdValid(), Boolean);\n            } else {\n                return (0, _target_utils.isNumeric)(value) && _this.isWarningThresholdValid();\n            }\n        };\n        _this.isWarningThresholdValid = function () {\n            var _this$state2 = _this.state,\n                type = _this$state2.type,\n                value = _this$state2.value,\n                warning = _this$state2.warning;\n\n            if ((0, _target_utils.isBetweenTarget)(type)) {\n                var noWarningProvided = !(warning.from && warning.to);\n                return {\n                    from: noWarningProvided || parseFloat(warning.from) < parseFloat(value.from),\n                    to: noWarningProvided || parseFloat(warning.to) > parseFloat(value.to)\n                };\n            } else {\n                var valueAsFloat = parseFloat(value);\n                var warningAsFloat = parseFloat(warning);\n                return !warning || (type === _target_utils.targetTypes.Above ? warningAsFloat < valueAsFloat : warningAsFloat > valueAsFloat);\n            }\n        };\n        _this.handleDocumentClick = function (e) {\n            var inContainer = _jquery2.default.contains((0, _reactDom.findDOMNode)(_this.targetPanel), e.target);\n            if (!inContainer) {\n                _grid_report_actions2.default.toggleTargetPanel();\n            }\n        };\n        _this.handleTargetChange = function () {\n            var type = _this.state.type;\n\n            var stripInput = function stripInput(input) {\n                return input.replace(/[^0-9.]/g, '');\n            };\n            if ((0, _target_utils.isBetweenTarget)(type)) {\n                _this.setState({\n                    value: {\n                        from: stripInput(_this.fromInput.value),\n                        to: stripInput(_this.toInput.value)\n                    },\n                    warning: {\n                        from: stripInput(_this.warningFromInput.value),\n                        to: stripInput(_this.warningToInput.value)\n                    }\n                });\n            } else {\n                _this.setState({ value: stripInput(_this.valueInput.value), warning: stripInput(_this.warningInput.value) });\n            }\n        };\n        _this.handleTargetSave = function () {\n            var _this$state3 = _this.state,\n                type = _this$state3.type,\n                value = _this$state3.value,\n                warning = _this$state3.warning;\n\n            if ((0, _target_utils.isBetweenTarget)(type)) {\n                _grid_report_actions2.default.setTarget({\n                    type: type,\n                    value: (0, _immutable.Map)({ from: value.from, to: value.to }),\n                    warning: (0, _immutable.Map)({ from: warning.from, to: warning.to })\n                });\n            } else {\n                // If warning value is no provided we must set it to `null`\n                // otherwise the grid state api will not accept it. Attribute values\n                // may not contain empty strings.\n                _grid_report_actions2.default.setTarget({ type: type, value: value, warning: warning || null });\n            }\n            _grid_report_actions2.default.toggleTargetPanel();\n        };\n        _this.handleTypeChange = function (type) {\n            _this.setState({\n                type: type,\n                value: (0, _target_utils.isBetweenTarget)(type) ? {} : '',\n                warning: (0, _target_utils.isBetweenTarget)(type) ? {} : ''\n            });\n        };\n        var target = _this.props.target;\n\n        var type = target.get('type') || _target_utils.targetTypes.Above;\n        if ((0, _target_utils.isBetweenTarget)(type)) {\n            _this.state = {\n                type: type,\n                value: {\n                    from: target.getIn(['value', 'from']),\n                    to: target.getIn(['value', 'to'])\n                },\n                warning: {\n                    from: target.getIn(['warning', 'from']),\n                    to: target.getIn(['warning', 'to'])\n                }\n            };\n        } else {\n            _this.state = {\n                type: type,\n                value: target.get('value'),\n                warning: target.get('warning')\n            };\n        }\n        return _this;\n    }\n\n    _createClass(TargetPanelContainer, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this._subscribeDOMEvents();\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._unsubscribeDOMEvents();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _state = this.state,\n                type = _state.type,\n                value = _state.value,\n                warning = _state.warning;\n\n            var warningThresholdValid = this.isWarningThresholdValid();\n            return _react2.default.createElement(\"div\", { ref: function ref(targetPanel) {\n                    _this2.targetPanel = targetPanel;\n                }, className: \"subpanels js-subpanels is-expanded\" }, _react2.default.createElement(\"div\", { className: \"subpanel ui-panel js-subpanel ready open\" }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, \"Targets\"), _react2.default.createElement(\"span\", { className: \"ui-panel__close\", onClick: _grid_report_actions2.default.toggleTargetPanel })), _react2.default.createElement(\"div\", { className: \"ui-panel__content target_panel\" }, _react2.default.createElement(\"div\", { className: \"subpanel__options form_section\" }, \"My \", _react2.default.createElement(\"span\", { className: \"onTarget\" }, \"Target\"), \" is\", _react2.default.createElement(\"div\", { className: \"types-select\" }, _react2.default.createElement(_ovid.DropdownList, { value: type, onChange: this.handleTypeChange }, _lodash2.default.map(_target_utils.targetTypes, function (value, key) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: key, title: key, value: value });\n            }))), (0, _target_utils.isBetweenTarget)(type) ? _react2.default.createElement(\"span\", null, _react2.default.createElement(\"input\", { className: \"shortestShortest\", placeholder: \"ex. 500\", type: \"text\", value: value.from, ref: function ref(fromInput) {\n                    return _this2.fromInput = fromInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"br\", null), _react2.default.createElement(\"span\", null, \" and \"), _react2.default.createElement(\"input\", { className: \"shortestShortest\", placeholder: \"ex. 1000\", type: \"text\", value: value.to, ref: function ref(toInput) {\n                    return _this2.toInput = toInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"span\", { className: 'error betweenError ' + (this.isBetweenValuesValid() ? 'hidden' : '') }, _react2.default.createElement(\"span\", { className: \"icon-remove-2\" }), \" This value needs to be higher than the first.\"), _react2.default.createElement(\"span\", null, \", and consider \", _react2.default.createElement(\"span\", { className: \"onTrack\" }, \"On Track\")), _react2.default.createElement(\"br\", null), _react2.default.createElement(\"span\", null, \"above\"), _react2.default.createElement(\"input\", { className: \"shortestShortest\", placeholder: \"ex. 300\", type: \"text\", value: warning.from, ref: function ref(warningFromInput) {\n                    return _this2.warningFromInput = warningFromInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"span\", { className: 'error targetWarningError ' + (warningThresholdValid.from ? 'hidden' : '') }, _react2.default.createElement(\"span\", { className: \"icon-remove-2\" }), \" This value needs to be \", _react2.default.createElement(\"br\", null), \" lower than your target.\"), _react2.default.createElement(\"span\", null, \"and below\"), _react2.default.createElement(\"input\", { className: \"shortestShortest\", placeholder: \"ex. 1200\", type: \"text\", value: warning.to, ref: function ref(warningToInput) {\n                    return _this2.warningToInput = warningToInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"span\", { className: 'error targetWarningError ' + (warningThresholdValid.to ? 'hidden' : '') }, _react2.default.createElement(\"span\", { className: \"icon-remove-2\" }), \" This value needs to be \", _react2.default.createElement(\"br\", null), \" higher than your target.\"), _react2.default.createElement(\"span\", null, \".\"), _react2.default.createElement(\"br\", null)) : _react2.default.createElement(\"span\", null, _react2.default.createElement(\"input\", { type: \"text\", className: \"shortestShortest target-panel__target_input\", placeholder: type === _target_utils.targetTypes.Above ? 'ex. 1000' : 'ex. 500', value: value, ref: function ref(valueInput) {\n                    return _this2.valueInput = valueInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"span\", null, \",\"), _react2.default.createElement(\"br\", null), _react2.default.createElement(\"span\", null, \"and I consider \", _react2.default.createElement(\"span\", { className: \"onTrack\" }, \"On Track\"), \" \", type), _react2.default.createElement(\"input\", { type: \"text\", className: \"shortestShortest\", placeholder: type === _target_utils.targetTypes.Above ? 'ex. 500' : 'ex. 1000', value: warning, ref: function ref(warningInput) {\n                    return _this2.warningInput = warningInput;\n                }, onChange: this.handleTargetChange }), _react2.default.createElement(\"span\", { className: 'error targetWarningError ' + (warningThresholdValid ? 'hidden' : '') }, _react2.default.createElement(\"span\", { className: \"icon-remove-2\" }), \" This value needs to be \", _react2.default.createElement(\"br\", null), \" \", type === _target_utils.targetTypes.Above ? 'lower' : 'higher', \" than your target.\"), _react2.default.createElement(\"span\", null, \".\"))), _react2.default.createElement(\"div\", { className: \"subpanel__options progress_section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"RESULT\"), _react2.default.createElement(_target_progress_bar2.default, { type: type, value: value, warning: warning })), _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost no-color\", onClick: _grid_report_actions2.default.toggleTargetPanel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: 'ui-button primary ' + (!this.isTargetValid() ? 'disabled' : ''), onClick: this.handleTargetSave, disabled: !this.isTargetValid() ? true : false }, \"Add Target\"))))));\n        }\n    }]);\n\n    return TargetPanelContainer;\n}(_react2.default.Component);\n\nexports.default = TargetPanelContainer;\n\n/***/ }),\n/* 1458 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _target_utils = __webpack_require__(99);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar formatNumberComma = _utils2.default.formatNumberComma;\n\nvar TargetProgressBar = function (_React$Component) {\n    _inherits(TargetProgressBar, _React$Component);\n\n    function TargetProgressBar() {\n        _classCallCheck(this, TargetProgressBar);\n\n        var _this = _possibleConstructorReturn(this, (TargetProgressBar.__proto__ || Object.getPrototypeOf(TargetProgressBar)).apply(this, arguments));\n\n        _this.renderBarComponent = function (status) {\n            var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n            var amount = value.amount;\n            var placeholder = value.placeholder;\n            return _react2.default.createElement(\"div\", { className: 'progress-bar ' + status }, _react2.default.createElement(\"div\", { className: 'value ' + (amount ? '' : 'placeholder') }, amount ? formatNumberComma(amount) : 'ex. ' + placeholder), _react2.default.createElement(\"div\", { className: \"bar\" }, _react2.default.createElement(\"div\", { className: \"inner\" })), _react2.default.createElement(\"div\", { className: \"text\" }, _target_utils.targetStatuses[status]));\n        };\n        return _this;\n    }\n\n    _createClass(TargetProgressBar, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _props = this.props,\n                type = _props.type,\n                value = _props.value,\n                warning = _props.warning;\n\n            var bars = (0, _target_utils.getProgressBars)(type);\n            var progressValues = (0, _target_utils.getProgressValues)(type, value, warning);\n            return _react2.default.createElement(\"div\", { className: 'progress ' + type }, bars.map(function (status, i) {\n                return _this2.renderBarComponent(status, progressValues[i]);\n            }));\n        }\n    }]);\n\n    return TargetProgressBar;\n}(_react2.default.Component);\n\nexports.default = TargetProgressBar;\n\n/***/ }),\n/* 1459 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _target_utils = __webpack_require__(99);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TargetStatus = function (_React$Component) {\n    _inherits(TargetStatus, _React$Component);\n\n    function TargetStatus() {\n        _classCallCheck(this, TargetStatus);\n\n        return _possibleConstructorReturn(this, (TargetStatus.__proto__ || Object.getPrototypeOf(TargetStatus)).apply(this, arguments));\n    }\n\n    _createClass(TargetStatus, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                target = _props.target,\n                current = _props.current;\n\n            var status = (0, _target_utils.getTargetStatus)(target, current);\n            return _react2.default.createElement(\"div\", { className: 'ui-mainpanel__section target-status ' + status }, _react2.default.createElement(\"span\", { className: \"target-status__dot\" }), _react2.default.createElement(\"span\", { className: \"target-status__text\" }, _target_utils.targetStatuses[status]));\n        }\n    }]);\n\n    return TargetStatus;\n}(_react2.default.Component);\n\nexports.default = TargetStatus;\n\n/***/ }),\n/* 1460 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.CheckDescriptionItems = exports.PdfButton = exports.CheckMessage = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _reactTransitionGroup = __webpack_require__(139);\n\nvar _css_transition_defaults = __webpack_require__(184);\n\nvar _css_transition_defaults2 = _interopRequireDefault(_css_transition_defaults);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _shared_link_helper = __webpack_require__(221);\n\nvar _shared_link_helper2 = _interopRequireDefault(_shared_link_helper);\n\nvar _share_links = __webpack_require__(220);\n\nvar _share_links2 = _interopRequireDefault(_share_links);\n\nvar _config = __webpack_require__(146);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar CheckSettings = _config2.default.CheckSettings;\n\nvar CheckMessageLink = (0, _createReactClass2.default)({\n    displayName: 'CheckMessageLink',\n\n    propTypes: {\n        itemKey: _propTypes2.default.string.isRequired,\n        text: _propTypes2.default.string.isRequired,\n        value: _propTypes2.default.string.isRequired,\n        handleFilter: _propTypes2.default.func.isRequired\n    },\n    handleFilter: function handleFilter(e) {\n        e.preventDefault();\n        this.props.handleFilter(this.props.itemKey, this.props.value);\n    },\n    render: function render() {\n        return _react2.default.createElement(\"a\", { href: \"#\", onClick: this.handleFilter }, this.props.text);\n    }\n});\nvar CheckMessage = exports.CheckMessage = (0, _createReactClass2.default)({\n    displayName: 'CheckMessage',\n\n    propTypes: {\n        voucherId: _propTypes2.default.string,\n        handleFilter: _propTypes2.default.func.isRequired,\n        amountColumn: _propTypes2.default.string.isRequired,\n        relatedTransactions: _propTypes2.default.object,\n        checkData: _propTypes2.default.object\n    },\n    handleFilter: function handleFilter(key, value) {\n        this.props.handleFilter({ value: value, key: key });\n    },\n    getLink: function getLink(key, text, value) {\n        return _react2.default.createElement(CheckMessageLink, { itemKey: key, text: text, value: value || text, handleFilter: this.handleFilter });\n    },\n    getCheckMessage: function getCheckMessage() {\n        if (!this.props.relatedTransactions || this.props.relatedTransactions.loading) {\n            return _react2.default.createElement(\"div\", { className: \"ui-loading_small\" });\n        }\n        return this.props.relatedTransactions.amount ? _react2.default.createElement(\"p\", null, \"This $\", _utils2.default.formatMonetary(this.props.checkData[this.props.amountColumn]), \" payment for \", this.getLink('expense_type', this.props.checkData.expense_type), \" is part of a larger check total of $\", _utils2.default.formatMonetary(this.props.relatedTransactions.amount), \" from the \", this.getLink('department', this.props.checkData.department), \". If you would like to see a list of the other payments included in \", _lodash2.default.find(CheckSettings.descriptionFields, { key: 'voucher_id' }).label, \" \", this.getLink('voucher_id', this.props.checkData.voucher_id), \", \", this.getLink('voucher_id', 'click here', this.props.checkData.voucher_id), \".\") : null;\n    },\n    render: function render() {\n        var cx = (0, _classnames2.default)({\n            'check-panel__description': true,\n            'message-loading': !this.props.relatedTransactions || this.props.relatedTransactions.loading\n        });\n        return _react2.default.createElement(\"div\", { className: cx }, this.getCheckMessage());\n    }\n});\nvar PdfButton = exports.PdfButton = (0, _createReactClass2.default)({\n    displayName: 'PdfButton',\n\n    propTypes: {\n        entity: _propTypes2.default.string,\n        issuer: _propTypes2.default.string,\n        checkDate: _propTypes2.default.string,\n        checkNumber: _propTypes2.default.string,\n        recipient: _propTypes2.default.string,\n        dollarAmount: _propTypes2.default.string,\n        centsAmount: _propTypes2.default.string,\n        memo: _propTypes2.default.string\n    },\n    //this operation is in more recent versions of lodash\n    toSnakeCase: function toSnakeCase(value) {\n        return value.replace(/([A-Z])/g, function (word) {\n            return '_' + word.toLowerCase();\n        });\n    },\n    getQueryStringPart: function getQueryStringPart(key, value) {\n        var parseValues = ['dollarAmount', 'centsAmount'];\n        return this.toSnakeCase(key) + '=' + (_lodash2.default.includes(parseValues, key) && typeof value === 'string' ? _utils2.default.parseMonetary(value) : encodeURIComponent(value));\n    },\n    getUrl: function getUrl(baseUrl, checkData) {\n        var queryString = this.getQueryString(checkData);\n        baseUrl += baseUrl.indexOf('?') > -1 ? '&' + queryString : '?' + queryString;\n        return baseUrl;\n    },\n    getQueryString: function getQueryString(checkData) {\n        var checkProperties = _lodash2.default.chain(checkData).toPairs().filter(function (checkProperty) {\n            return !!checkProperty[1];\n        }).map(_lodash2.default.bind(function (checkProperty) {\n            return this.getQueryStringPart(checkProperty[0], checkProperty[1]);\n        }, this));\n        return checkProperties.join('&');\n    },\n    render: function render() {\n        var url = this.getUrl('' + _og_api2.default.core._apiUrl + CheckSettings.pdfPath, this.props);\n        return _react2.default.createElement(\"a\", { href: url, className: \"ui-button\", target: \"_blank\" }, \"Save PDF\");\n    }\n});\nvar CheckDescriptionItems = exports.CheckDescriptionItems = (0, _createReactClass2.default)({\n    displayName: 'CheckDescriptionItems',\n\n    propTypes: {\n        checkData: _propTypes2.default.object.isRequired,\n        entity: _propTypes2.default.string.isRequired,\n        locale: _propTypes2.default.string\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            descriptionFields: CheckSettings.descriptionFields,\n            checkData: null,\n            entity: null\n        };\n    },\n    getValue: function getValue(checkDescription) {\n        if (checkDescription.key === 'entity') {\n            return this.props.entity;\n        } else if (checkDescription.key === 'amount') {\n            return this.props.checkData[this.props.amountColumn];\n        } else {\n            return this.props.checkData[checkDescription.key];\n        }\n    },\n    render: function render() {\n        var _this = this;\n\n        var getColumn = function getColumn(checkDescription) {\n            var checkDescriptionValue = _this.getValue(checkDescription);\n            var currentField = _lodash2.default.find(_this.props.descriptionFields, { key: checkDescription.key });\n            var format = !!currentField ? currentField.format : null;\n            return _react2.default.createElement(\"div\", { className: \"ui-col-3of6\", key: checkDescription.key }, _react2.default.createElement(CheckDescriptionItem, { label: checkDescription.label, value: checkDescriptionValue ? checkDescriptionValue : 'NA', resourceKey: checkDescription.key, filterable: !!(checkDescription.hasOwnProperty('filter') && checkDescription.filter && checkDescriptionValue), format: format, locale: _this.props.locale, handleFilter: _this.props.handleFilter }));\n        };\n        //_.chunk isn't available in current lodash\n        var filteredFields = _lodash2.default.reject(this.props.descriptionFields, function (element) {\n            return element.hidden === true;\n        });\n        var descriptionPairs = _lodash2.default.toArray(_lodash2.default.groupBy(filteredFields, function (element) {\n            var index = filteredFields.indexOf(element);\n            return Math.floor(index / 2);\n        }));\n        var rows = descriptionPairs.map(function (items) {\n            return _react2.default.createElement(\"div\", { className: \"ui-row\", key: items[0].label }, items.length > 1 ? [getColumn(items[0]), getColumn(items[1])] : getColumn(items[0]));\n        });\n        return _react2.default.createElement(\"div\", { className: \"check-panel__details\" }, rows);\n    }\n});\nvar CheckDescriptionItem = (0, _createReactClass2.default)({\n    displayName: 'CheckDescriptionItem',\n\n    propTypes: {\n        label: _propTypes2.default.string.isRequired,\n        value: _propTypes2.default.string,\n        resourceKey: _propTypes2.default.string,\n        filterable: _propTypes2.default.bool,\n        format: _propTypes2.default.string,\n        locale: _propTypes2.default.string,\n        handleFilter: _propTypes2.default.func.isRequired\n    },\n    handleClick: function handleClick(e) {\n        e.preventDefault();\n        //do something to filter the grid based on the current key / value and close the panel\n        this.props.handleFilter({ label: this.props.label, value: this.props.value, key: this.props.resourceKey });\n    },\n    render: function render() {\n        var value = this.props.value;\n        if (this.props.format === 'money') {\n            value = '$' + _utils2.default.formatMonetary(value);\n        } else if (this.props.format === 'date') {\n            value = _utils2.default.formatDate(this.props.locale)(value);\n        } else if (this.props.format === 'capitalize') {\n            value = _utils2.default.capitalize(value);\n        }\n        return _react2.default.createElement(\"dl\", null, _react2.default.createElement(\"dt\", null, this.props.label), this.props.filterable ? _react2.default.createElement(\"dd\", null, _react2.default.createElement(\"a\", { onClick: this.handleClick, className: \"check-filter\" }, _react2.default.createElement(\"strong\", { className: \"check-filter-value\" }, value))) : _react2.default.createElement(\"dd\", null, _react2.default.createElement(\"strong\", { className: \"check-filter-value\" }, value)));\n    }\n});\nvar CheckPanel = (0, _createReactClass2.default)({\n    displayName: 'CheckPanel',\n    getInitialState: function getInitialState() {\n        return { linkHelper: null };\n    },\n    handleClose: function handleClose() {\n        _grid_report_actions2.default.hideCheckImagePanel();\n    },\n    handleQuestions: function handleQuestions() {\n        this.props.openFeedbackModal();\n    },\n    handleFilter: function handleFilter(props) {\n        //do something here to filter griddle\n        _grid_report_actions2.default.filterColumn(props.key, 'eq', props.value);\n    },\n    onWrapperClick: function onWrapperClick(e) {\n        // Close the settings panel when the user clicks outside it.\n        if (e.target === _reactDom2.default.findDOMNode(this)) {\n            _grid_report_actions2.default.hideCheckImagePanel();\n        }\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (this.state.linkHelper === null && nextProps.checkData) {\n            this.setState({ linkHelper: _shared_link_helper2.default.create(nextProps.entity) });\n        }\n    },\n    render: function render() {\n        var amountColumn = this.props.checkData && this.props.checkData.data && this.props.checkData.amountColumn;\n        var amount = !!amountColumn ? _utils2.default.formatMonetary(this.props.checkData.data[this.props.checkData.amountColumn]).split('.') : null;\n        var entity = !!(this.props.entity && this.props.entity.attributes && this.props.entity.attributes.display_name) ? _utils2.default.capitalize(this.props.entity.attributes.display_name) : null;\n        var featurePermissions = !!(this.props.entity && this.props.entity.attributes && this.props.entity.attributes.feature_permissions) ? this.props.entity.attributes.feature_permissions : [];\n        return _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, Object.assign({ transitionName: \"check-panel\" }, _css_transition_defaults2.default), this.props.checkData && this.props.checkData.visible ? _react2.default.createElement(\"div\", { className: \"check-panel__wrapper ui-panel__wrapper\" }, _react2.default.createElement(\"div\", { className: \"check-panel ui-panel\", ref: \"checkPanel\" }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, \"Check Details\"), _react2.default.createElement(\"div\", { className: \"ui-panel__close\", onClick: this.handleClose })), this.props.checkData.loading ? _react2.default.createElement(\"footer\", null) : _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(PdfButton, { entity: this.props.entity.attributes.display_name, issuer: this.props.checkData.data.department, checkDate: _utils2.default.formatDate(this.props.locale)(this.props.checkData.data.check_date), checkNumber: this.props.checkData.data.check_no, recipient: this.props.checkData.data.paid_to, dollarAmount: amount[0], centsAmount: amount[1], memo: this.props.checkData.data.expense_type }), _react2.default.createElement(_ovid.Dropdown, { title: \"Share\", dropdownClass: \"ui-button check-panel__share-button\", position: \"align-top\" }, _react2.default.createElement(_share_links2.default, { entity: this.props.entity, linkHelper: this.state.linkHelper })), _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"a\", { className: \"ui-button primary\", onClick: this.handleQuestions }, \"Questions about this payment\"))), this.props.checkData.loading ? _react2.default.createElement(\"div\", { className: \"ui-loading\" }) : _react2.default.createElement(\"div\", { className: \"ui-container_scroll\" }, _react2.default.createElement(_ovid.CheckMock, { entity: entity, issuer: this.props.checkData.data.department, checkDate: _utils2.default.formatDate(this.props.locale)(this.props.checkData.data.check_date), checkNumber: this.props.checkData.data.check_no, recipient: this.props.checkData.data.paid_to, dollarAmount: amount[0], centsAmount: amount[1], memo: this.props.checkData.data.expense_type, handleFilter: this.handleFilter }), _react2.default.createElement(\"div\", { className: \"ui-panel__content\" }, _react2.default.createElement(CheckMessage, { voucherId: this.props.checkData.data.voucher_id, amountColumn: amountColumn, relatedTransactions: this.props.relatedTransactions, checkData: this.props.checkData.data, handleFilter: this.handleFilter }), _react2.default.createElement(\"div\", { className: \"ui-card\" }, _react2.default.createElement(\"header\", { className: \"ui-card__header\" }, _react2.default.createElement(\"h3\", null, \"Who's getting paid?\")), _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, _react2.default.createElement(CheckDescriptionItems, { amountColumn: amountColumn, handleFilter: this.handleFilter, checkData: this.props.checkData.data, descriptionFields: _lodash2.default.filter(CheckSettings.descriptionFields, { type: 'description' }).filter(function (_ref) {\n                var requiresFeaturePermission = _ref.requiresFeaturePermission;\n                return !requiresFeaturePermission || featurePermissions.indexOf(requiresFeaturePermission) > -1;\n            }), entity: this.props.entity.attributes.display_name, locale: this.props.locale }))), _react2.default.createElement(\"div\", { className: \"ui-card\" }, _react2.default.createElement(\"header\", { className: \"ui-card__header\" }, _react2.default.createElement(\"h3\", null, \"Where's the money coming from?\")), _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, _react2.default.createElement(CheckDescriptionItems, { handleFilter: this.handleFilter, amountColumn: amountColumn, checkData: this.props.checkData.data, descriptionFields: _lodash2.default.filter(CheckSettings.descriptionFields, { type: 'money' }), entity: this.props.entity.attributes.display_name, locale: this.props.locale })))))), _react2.default.createElement(\"div\", { className: \"check-panel__overlay\", onClick: this.handleClose })) : null);\n    }\n});\nexports.default = CheckPanel;\n\n/***/ }),\n/* 1461 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HowToModal = (0, _createReactClass2.default)({\n    displayName: 'HowToModal',\n    hideModal: function hideModal(e) {\n        e.preventDefault();\n        _grid_report_actions2.default.hideHowToModal();\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open\", id: \"overlay-modal_gridhowto\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"How To\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", onClick: this.hideModal })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"article\", { className: \"howto-content\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/grid_report/grid_report_view.png'), className: \"howto-content__graphic\", alt: \"Diagram of an OpenGov report\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, 'OpenGov\\u2019s Grid Reports allow you to explore individual transactions in a simple user interface. The main view, depicted here, includes a grid with various controls to view all or individual expenses.'), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/grid_report/search_bar.gif'), className: \"howto-content__graphic\", alt: \"Diagram showing the search bar\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"There is a search bar located at the top of the screen. This search bar allows you to search for any text across the grid.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/grid_report/filters.gif'), className: \"howto-content__graphic\", alt: \"Diagram of the various methods to filter report data\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"There are many ways to apply filters to the grid data. You may use the Filter panel located to the left of the report. You can also click on the filter icon for a specific column to apply a filter.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/grid_report/visualization.gif'), className: \"howto-content__graphic\", alt: \"Diagram showing how to toggle data visualizations\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"At any point you are able to visualize the data, or display a graphical representation of the data, in the grid. To do this, click on the Visualizations button on the left hand side of the screen. The visualization will show total amounts, grouped by year. You are able to control the breakdown of the visualization in the Breakdown menu.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/grid_report/share_download.gif'), className: \"howto-content__graphic\", alt: \"Diagram showing how to download report data\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"You can share any grid view via social media or through email. There is also the option to download the source data as a .csv spreadsheet in the Download menu.\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.hideModal }, \"Done\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\", onClick: this.hideModal }));\n    }\n});\nexports.default = HowToModal;\n\n/***/ }),\n/* 1462 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Banner = (0, _createReactClass2.default)({\n    displayName: 'Banner',\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"banner\" }, this.props.children);\n    }\n});\nexports.default = Banner;\n\n/***/ }),\n/* 1463 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WelcomeModal = (0, _createReactClass2.default)({\n    displayName: 'WelcomeModal',\n    handleOpenHowTo: function handleOpenHowTo(e) {\n        e.preventDefault();\n        _grid_report_actions2.default.showHowToModal();\n    },\n    handleOpenBudget101: function handleOpenBudget101(e) {\n        e.preventDefault();\n        _grid_report_actions2.default.showBudget101();\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper modal_welcome\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"h1\", { className: \"welcome__title\" }, \"Welcome to \", this.props.entity.get('display_name'), \"'s Report\"), _react2.default.createElement(\"p\", null, \"This site is designed to help you understand more about the operations and performance of \", this.props.entity.get('name'), \". Start exploring and learn more.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"small\", null, \"You can read our quick \", _react2.default.createElement(\"a\", { onClick: this.handleOpenHowTo }, \"How-to instructions\"), \" or view other topics in the Help menu.\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: this.props.closeWelcomeModal }, \"Just get started\"), _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.props.startTour }, \"Take tour\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n    }\n});\nexports.default = WelcomeModal;\n\n/***/ }),\n/* 1464 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = GridBreakDownDropdown;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _breakdown_menu = __webpack_require__(1465);\n\nvar _breakdown_menu2 = _interopRequireDefault(_breakdown_menu);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _map_constants = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction GridBreakDownDropdown(props) {\n    var visualization = props.visualization;\n    var currentBreakdown = visualization.get('breakdown');\n    var visibleBreakdowns = (0, _transactions_utils.filterBreakdown)(visualization);\n    var breakdowns = !props.showBreakdownsSettingsPanel ? visibleBreakdowns || visualization.get('breakdownColumns') : visualization.get('breakdownColumns');\n    var graphType = visualization.get('graphType');\n    var isMap = graphType === 'map';\n    var currentMapType = visualization.get('currentMapType');\n    var isTypeWithBreakdown = !(isMap && currentMapType === _map_constants.MapTypes.Heatmap.name);\n    if (isTypeWithBreakdown) {\n        return _react2.default.createElement(_breakdown_menu2.default, { currentBreakdown: currentBreakdown, breakdowns: breakdowns, showBreakdownsSettingsPanel: props.showBreakdownsSettingsPanel, columns: visualization.get('breakdownColumns'), visualization: props.visualization, isControlPanel: props.isControlPanel });\n    } else {\n        return null;\n    }\n}\n\n/***/ }),\n/* 1465 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _breakdowns_settings_toggle = __webpack_require__(1466);\n\nvar _breakdowns_settings_toggle2 = _interopRequireDefault(_breakdowns_settings_toggle);\n\nvar _breakdowns_settings_panel = __webpack_require__(1467);\n\nvar _breakdowns_settings_panel2 = _interopRequireDefault(_breakdowns_settings_panel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar BreakdownMenu = function (_React$Component) {\n    _inherits(BreakdownMenu, _React$Component);\n\n    function BreakdownMenu() {\n        _classCallCheck(this, BreakdownMenu);\n\n        return _possibleConstructorReturn(this, (BreakdownMenu.__proto__ || Object.getPrototypeOf(BreakdownMenu)).apply(this, arguments));\n    }\n\n    _createClass(BreakdownMenu, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section griddle_breakdown\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Broken down by\", this.props.isControlPanel && _react2.default.createElement(_breakdowns_settings_toggle2.default, null)), this.props.showBreakdownsSettingsPanel && _react2.default.createElement(_breakdowns_settings_panel2.default, { columns: this.props.columns, panelType: \"Breakdown\", visualization: this.props.visualization }), _react2.default.createElement(_ovid.DropdownList, { value: this.props.currentBreakdown, onChange: _grid_report_actions2.default.setVisualBreakdown }, this.props.breakdowns.map(function (column, i) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: i, value: column.get('name'), title: column.get('label') });\n            }).toArray()));\n        }\n    }]);\n\n    return BreakdownMenu;\n}(_react2.default.Component);\n\nexports.default = BreakdownMenu;\n\n/***/ }),\n/* 1466 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = BreakdownsSettingsToggle;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction BreakdownsSettingsToggle() {\n    return _react2.default.createElement(\"div\", { className: \"visibility-settings-icon icon-settings-1 breakdown_column_toggle\", onClick: _grid_report_actions2.default.toggleBreakdownsSettingsPanel });\n}\n\n/***/ }),\n/* 1467 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _panel_header = __webpack_require__(528);\n\nvar _panel_header2 = _interopRequireDefault(_panel_header);\n\nvar _error = __webpack_require__(526);\n\nvar _error2 = _interopRequireDefault(_error);\n\nvar _panel_data = __webpack_require__(527);\n\nvar _panel_data2 = _interopRequireDefault(_panel_data);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _visibility_utils = __webpack_require__(529);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar BreakdownsSettingsPanelContainer = function (_React$Component) {\n    _inherits(BreakdownsSettingsPanelContainer, _React$Component);\n\n    function BreakdownsSettingsPanelContainer() {\n        _classCallCheck(this, BreakdownsSettingsPanelContainer);\n\n        var _this = _possibleConstructorReturn(this, (BreakdownsSettingsPanelContainer.__proto__ || Object.getPrototypeOf(BreakdownsSettingsPanelContainer)).apply(this, arguments));\n\n        _this._subscribeDOMEvents = function () {\n            (0, _jquery2.default)(document).on('click', _this.handleDocumentClick);\n        };\n        _this._unsubscribeDOMEvents = function () {\n            _this.resetColumns();\n            (0, _jquery2.default)(document).off('click', _this.handleDocumentClick);\n        };\n        _this.handleDocumentClick = function (e) {\n            var inContainer = _jquery2.default.contains((0, _reactDom.findDOMNode)(_this.breakdownsSettingsPanel), e.target);\n            var inBreakdownColumnSettingToggle = e.target.className.indexOf('breakdown_column_toggle');\n            //check if the click is not in the panel container and the gear toggle icon\n            if (!inContainer && inBreakdownColumnSettingToggle == -1) {\n                _this.handleBreakdownsSettingsCancel();\n            }\n        };\n        //Returns false if all columns are hidden\n        _this.isVisibilityValid = function () {\n            var visibleBreakdowns = (0, _transactions_utils.filterBreakdown)(_this.props.visualization);\n            return visibleBreakdowns.size > 0 ? true : false;\n        };\n        _this.handleBreakdownsSettingsSave = function () {\n            _this.setCurrentBreakdown();\n            _this.settingsColumns = [];\n            _grid_report_actions2.default.toggleBreakdownsSettingsPanel();\n        };\n        _this.resetColumns = function () {\n            if (_this.settingsColumns.length > 0) {\n                _grid_report_actions2.default.resetColumns(_this.settingsColumns, 'breakdown');\n            }\n        };\n        _this.handleBreakdownsSettingsCancel = function () {\n            _this.resetColumns();\n            _this.settingsColumns = [];\n            _grid_report_actions2.default.toggleBreakdownsSettingsPanel();\n        };\n        //set breakdown in the visualization\n        _this.setCurrentBreakdown = function () {\n            var visibleBreakdowns = (0, _transactions_utils.filterBreakdown)(_this.props.visualization);\n            if (visibleBreakdowns) {\n                var currentBreakdown = _this.props.visualization.get('breakdown');\n                var filteredBreakdowns = _lodash2.default.map(visibleBreakdowns.filter(function (column) {\n                    return column.get('visible') === true;\n                }).toJS(), 'id');\n                if (filteredBreakdowns.indexOf(currentBreakdown) === -1) {\n                    var newBreakdown = filteredBreakdowns[0];\n                    _grid_report_actions2.default.setVisualBreakdown(newBreakdown);\n                }\n            }\n        };\n        _this.toggleBreakdownVisibility = function (column, visibility) {\n            _grid_report_actions2.default.hideColumn(column, visibility, 'breakdown', false);\n            var index = _this.settingsColumns.indexOf(column.get('id'));\n            _lodash2.default.includes(_this.settingsColumns, column.get('id')) ? _this.settingsColumns.splice(index, 1) : _this.settingsColumns.push(column.get('id'));\n        };\n        //Returns true if all the columns are checked\n        //the columns that will undergo a change in its visibility\n        _this.isAllBreakdownsVisible = function () {\n            var visibleBreakdowns = _lodash2.default.map((0, _transactions_utils.filterBreakdown)(_this.props.visualization).toJS(), 'id');\n            var isAllBreakdownsChecked = visibleBreakdowns.length === _this.props.columns.size;\n            var hiddenColumns = isAllBreakdownsChecked ? _this.props.columns : _this.props.columns.filter(function (breakdownColumn) {\n                return !_lodash2.default.includes(visibleBreakdowns, breakdownColumn.get('id'));\n            });\n            return { isAllBreakdownsChecked: isAllBreakdownsChecked, hiddenColumns: hiddenColumns };\n        };\n        _this.toggleAllBreakdownVisibility = function () {\n            var _this$isAllBreakdowns = _this.isAllBreakdownsVisible(),\n                isAllBreakdownsChecked = _this$isAllBreakdowns.isAllBreakdownsChecked,\n                hiddenColumns = _this$isAllBreakdowns.hiddenColumns;\n            //Update the settingsColumns used for reseting\n\n\n            var hiddenColumnsIds = _lodash2.default.map(hiddenColumns.toJS(), 'id');\n            _lodash2.default.each(hiddenColumnsIds, function (hiddenColumn) {\n                var index = _this.settingsColumns.indexOf(hiddenColumn);\n                _lodash2.default.includes(_this.settingsColumns, hiddenColumn) ? _this.settingsColumns.splice(index, 1) : _this.settingsColumns.push(hiddenColumn);\n            });\n            //if any one unchecked -> isVisibilityValid = true then check all.\n            var visibility = _this.isVisibilityValid() ? !isAllBreakdownsChecked : false;\n            _grid_report_actions2.default.hideColumn(hiddenColumns, visibility, 'breakdown', true);\n        };\n        return _this;\n    }\n\n    _createClass(BreakdownsSettingsPanelContainer, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this._subscribeDOMEvents();\n            //settingsColumns holds the list of ids of changed columns.\n            //This is tracked to handle reset of columns in cancel\n            this.settingsColumns = [];\n        }\n    }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this._unsubscribeDOMEvents();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _props = this.props,\n                columns = _props.columns,\n                panelType = _props.panelType;\n\n            var isEditingDefaultState = _report_view_store2.default.isEditingDefaultState();\n            var footerClass = (0, _visibility_utils.getFooterClass)(isEditingDefaultState);\n            var visibilityPanelClass = (0, _visibility_utils.getVisibilityPanelClass)(isEditingDefaultState);\n            return _react2.default.createElement(\"div\", { ref: function ref(breakdownsSettingsPanel) {\n                    _this2.breakdownsSettingsPanel = breakdownsSettingsPanel;\n                }, className: \"subpanels js-subpanels is-expanded\" }, _react2.default.createElement(\"div\", { className: \"subpanel ui-panel js-subpanel ready open\" }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, panelType, \" Columns\"), _react2.default.createElement(\"span\", { className: \"ui-panel__close\", onClick: this.handleBreakdownsSettingsCancel })), _react2.default.createElement(\"footer\", { className: footerClass }, _react2.default.createElement(\"button\", { className: \"ui-button ghost no-color pull-right visibility-panel-cancel\", onClick: this.handleBreakdownsSettingsCancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: 'ui-button primary pull-right ' + (!this.isVisibilityValid() ? 'disabled' : ''), onClick: this.handleBreakdownsSettingsSave }, \"Save\")), _react2.default.createElement(\"div\", { className: visibilityPanelClass }, _react2.default.createElement(\"div\", { className: \"visibility-panel-sub-header subpanel__options\" }, !this.isVisibilityValid() ? _react2.default.createElement(_error2.default, { message: 'You must select at least one breakdown column' }) : null, _react2.default.createElement(_panel_header2.default, { panelType: panelType, toggleAllColumnVisibility: this.toggleAllBreakdownVisibility })), _react2.default.createElement(\"ul\", { className: \"visibility-panel-container drop-item1__wrapper sortable-items\" }, columns.map(function (column) {\n                return _react2.default.createElement(_panel_data2.default, { column: column, toggleColumnVisibility: _this2.toggleBreakdownVisibility });\n            })))));\n        }\n    }]);\n\n    return BreakdownsSettingsPanelContainer;\n}(_react2.default.Component);\n\nexports.default = BreakdownsSettingsPanelContainer;\n\n/***/ }),\n/* 1468 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GridReportTotal = function (_React$Component) {\n    _inherits(GridReportTotal, _React$Component);\n\n    function GridReportTotal() {\n        _classCallCheck(this, GridReportTotal);\n\n        return _possibleConstructorReturn(this, (GridReportTotal.__proto__ || Object.getPrototypeOf(GridReportTotal)).apply(this, arguments));\n    }\n\n    _createClass(GridReportTotal, [{\n        key: \"render\",\n        value: function render() {\n            var _props = this.props,\n                totalString = _props.totalString,\n                calculatedTotal = _props.calculatedTotal;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, totalString), _react2.default.createElement(\"span\", { id: \"js-grid-total-value\", className: \"ui-mainpanel__section__value\", title: calculatedTotal }, calculatedTotal));\n        }\n    }]);\n\n    return GridReportTotal;\n}(_react2.default.Component);\n\nexports.default = GridReportTotal;\n\n/***/ }),\n/* 1469 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = EmailOrExportFilter;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _index = __webpack_require__(1470);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _email_logged_in_user = __webpack_require__(1473);\n\nvar _email_logged_in_user2 = _interopRequireDefault(_email_logged_in_user);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _schema_utils = __webpack_require__(120);\n\nvar _transactions_utils = __webpack_require__(54);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EmailOrExportFilter(props) {\n    var _props$state = props.state,\n        session = _props$state.session,\n        reportCurrentFilter = _props$state.reportCurrentFilter,\n        report = _props$state.report,\n        gridReport = _props$state.gridReport,\n        visualization = _props$state.visualization;\n\n    var transactionId = report.get('transaction_id');\n    var reportId = report.get('id');\n    var schema = gridReport.get('schema');\n    if (session) {\n        return _react2.default.createElement(_email_logged_in_user2.default, Object.assign({}, props.state, { reportId: reportId, transactionId: transactionId, currentFilter: reportCurrentFilter, onCancelExportFilter: _grid_report_actions2.default.hideExportFilter, email: session.attributes.email, onClose: props.handleCloseDownloadPanel }));\n    } else {\n        return _react2.default.createElement(_index2.default, Object.assign({}, props.state, { reportId: reportId, transactionId: transactionId, currentFilter: reportCurrentFilter, amountColumnState: getAmountColumnState(visualization, schema, props.griddleState), onClose: _grid_report_actions2.default.hideExportFilter }));\n    }\n}\nfunction getAmountColumnState(visualization, schema, griddleState) {\n    var amountColumnName = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n    var targetCol = (0, _schema_utils.findColumnByName)(schema, amountColumnName);\n    var friendlyColumnName = targetCol.get('label');\n    var total = griddleState.get('amount');\n    return { total: total, 'column_name': friendlyColumnName };\n}\n\n/***/ }),\n/* 1470 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _export_modal = __webpack_require__(223);\n\nvar _export_modal2 = _interopRequireDefault(_export_modal);\n\nvar _report_download_actions = __webpack_require__(312);\n\nvar _report_download_actions2 = _interopRequireDefault(_report_download_actions);\n\nvar _processing_export = __webpack_require__(1471);\n\nvar _processing_export2 = _interopRequireDefault(_processing_export);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar updateFilteredExportJob = _grid_report_actions2.default.updateFilteredExportJob,\n    errorFilteredExportJob = _grid_report_actions2.default.errorFilteredExportJob;\nvar exportCurrentFilterWithJobPoll = _report_download_actions2.default.exportCurrentFilterWithJobPoll,\n    STATES = _report_download_actions2.default.STATES;\n\nvar PublicUser = function (_React$Component) {\n    _inherits(PublicUser, _React$Component);\n\n    function PublicUser(props) {\n        _classCallCheck(this, PublicUser);\n\n        var _this = _possibleConstructorReturn(this, (PublicUser.__proto__ || Object.getPrototypeOf(PublicUser)).call(this, props));\n\n        _this.handleConfirm = function () {\n            var _this$props = _this.props,\n                reportId = _this$props.reportId,\n                transactionId = _this$props.transactionId,\n                currentFilter = _this$props.currentFilter,\n                amountColumnState = _this$props.amountColumnState;\n\n            _this.setState({\n                nextState: true\n            });\n            _this.jobObservable = exportCurrentFilterWithJobPoll(transactionId, reportId, currentFilter, amountColumnState).subscribe(function (res) {\n                if (res.state === STATES.FAILED) {\n                    errorFilteredExportJob(res.state, res.errors.map(function (m) {\n                        return m.message;\n                    }));\n                } else {\n                    updateFilteredExportJob(res.state, res.job_result);\n                }\n            }, function () {\n                return errorFilteredExportJob(STATES.FAILED, ['There was an error exporting your file. Please try again later.']);\n            });\n            return _this.jobObservable;\n        };\n        _this.state = {\n            nextState: false\n        };\n        return _this;\n    }\n\n    _createClass(PublicUser, [{\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n            this.jobObservable && this.jobObservable.dispose();\n        }\n    }, {\n        key: 'renderError',\n        value: function renderError(errors) {\n            return _react2.default.createElement(_export_modal2.default, { title: \"Error Exporting File\", confirmText: \"Close\", onClose: this.props.onClose, onConfirm: this.props.onClose, confirmable: true }, _react2.default.createElement(\"div\", null, errors));\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var state = this.props.gridReport.getIn(['filteredExport', 'state']);\n            if (state === STATES.FAILED) {\n                return this.renderError(this.props.gridReport.getIn(['filteredExport', 'errors']));\n            }\n            if (this.state.nextState) {\n                return _react2.default.createElement(_processing_export2.default, Object.assign({}, this.props));\n            } else {\n                return _react2.default.createElement(_export_modal2.default, { title: \"Export Generation Time\", onConfirm: this.handleConfirm, onClose: this.props.onClose, confirmText: \"Yes, Continue\", confirmable: true, cancelable: true, rightButtonClass: \"primary\" }, _react2.default.createElement(\"span\", null, _react2.default.createElement(\"div\", null, \"Sometimes generating files from a filtered view can take a while, especially if there are a lot of rows in the view.\"), _react2.default.createElement(\"div\", { className: \"small-margin-top\" }, \" Are you sure you would like to continue?\")));\n            }\n        }\n    }]);\n\n    return PublicUser;\n}(_react2.default.Component);\n\nexports.default = PublicUser;\n\n/***/ }),\n/* 1471 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _export_modal = __webpack_require__(223);\n\nvar _export_modal2 = _interopRequireDefault(_export_modal);\n\nvar _finished_export = __webpack_require__(1472);\n\nvar _finished_export2 = _interopRequireDefault(_finished_export);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ProcessingExport = function (_React$Component) {\n    _inherits(ProcessingExport, _React$Component);\n\n    function ProcessingExport(props) {\n        _classCallCheck(this, ProcessingExport);\n\n        return _possibleConstructorReturn(this, (ProcessingExport.__proto__ || Object.getPrototypeOf(ProcessingExport)).call(this, props));\n    }\n\n    _createClass(ProcessingExport, [{\n        key: 'render',\n        value: function render() {\n            var state = this.props.gridReport.getIn(['filteredExport', 'state']);\n            if (state === 'finished') {\n                return _react2.default.createElement(_finished_export2.default, Object.assign({}, this.props));\n            } else {\n                return _react2.default.createElement(_export_modal2.default, { title: \"Generate File\", onClose: this.props.onClose }, _react2.default.createElement(\"div\", { className: \"ui-loader\" }, _react2.default.createElement(\"div\", { className: \"ui-loading\" }), _react2.default.createElement(\"div\", { className: \"ui-loader__message\" }, _react2.default.createElement(\"strong\", null, \"Generating file for download\"))));\n            }\n        }\n    }]);\n\n    return ProcessingExport;\n}(_react2.default.Component);\n\nexports.default = ProcessingExport;\n\n/***/ }),\n/* 1472 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _export_modal = __webpack_require__(223);\n\nvar _export_modal2 = _interopRequireDefault(_export_modal);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FinishedExport = function (_React$Component) {\n    _inherits(FinishedExport, _React$Component);\n\n    function FinishedExport() {\n        _classCallCheck(this, FinishedExport);\n\n        return _possibleConstructorReturn(this, (FinishedExport.__proto__ || Object.getPrototypeOf(FinishedExport)).apply(this, arguments));\n    }\n\n    _createClass(FinishedExport, [{\n        key: 'render',\n        value: function render() {\n            var jobResult = this.props.gridReport.getIn(['filteredExport', 'jobResult']);\n            var report = _report_view_store2.default.getRenderedReport();\n            var reportName = report.get('name');\n            var onClose = this.props.onClose;\n\n            return _react2.default.createElement(_export_modal2.default, { title: \"Export Complete\", confirmText: \"Done\", onClose: onClose, onConfirm: onClose, confirmable: true }, _react2.default.createElement(\"div\", null, _react2.default.createElement(\"span\", null, \"Click to download:\"), _react2.default.createElement(\"br\", null), _react2.default.createElement(\"p\", { className: \"transaction-download\" }, _react2.default.createElement(\"a\", { className: \"ui-button\", href: jobResult.get('url'), onClick: onClose }, _react2.default.createElement(\"span\", { className: \"button-left icon-csv-1\" }, reportName)))));\n        }\n    }]);\n\n    return FinishedExport;\n}(_react2.default.Component);\n\nexports.default = FinishedExport;\n\n/***/ }),\n/* 1473 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = exports.UserEmail = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _export_modal = __webpack_require__(223);\n\nvar _export_modal2 = _interopRequireDefault(_export_modal);\n\nvar _report_download_actions = __webpack_require__(312);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar UserEmail = exports.UserEmail = function UserEmail(_ref) {\n    var email = _ref.email;\n    return _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"Your email: \"), \" \", _react2.default.createElement(\"span\", { className: \"user-email\" }, email));\n};\n\nvar EmailLoggedInUser = function (_React$Component) {\n    _inherits(EmailLoggedInUser, _React$Component);\n\n    function EmailLoggedInUser(props) {\n        _classCallCheck(this, EmailLoggedInUser);\n\n        var _this = _possibleConstructorReturn(this, (EmailLoggedInUser.__proto__ || Object.getPrototypeOf(EmailLoggedInUser)).call(this, props));\n\n        _this.submitExport = function (e) {\n            e.preventDefault();\n            var _this$props = _this.props,\n                reportId = _this$props.reportId,\n                transactionId = _this$props.transactionId,\n                currentFilter = _this$props.currentFilter;\n\n            (0, _report_download_actions.exportCurrentFilter)(transactionId, reportId, currentFilter).subscribe(function () {\n                Ovid.Flash.ftw({ title: 'Request sent!', message: 'We\\'ll send a link to your email when your file is ready.' });\n            }, function () {\n                _this.errorWithRequest();\n            });\n            _this.props.onClose();\n        };\n        return _this;\n    }\n\n    _createClass(EmailLoggedInUser, [{\n        key: 'errorWithRequest',\n        value: function errorWithRequest() {\n            Ovid.Flash.show({\n                title: 'Whoops, something went wrong',\n                message: 'There was an error when trying to generate your request. Try again later.',\n                modifiers: {\n                    whoops: true\n                }\n            });\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                onClose = _props.onClose,\n                email = _props.email;\n\n            return _react2.default.createElement(_export_modal2.default, { title: \"Generate Export File\", onConfirm: this.submitExport, onClose: onClose, confirmText: \"Export & Send\", confirmable: true, cancelable: true, leftButtonClass: \"cancel\", rightButtonClass: \"primary\" }, _react2.default.createElement(\"div\", { className: \"hero-icon\" }, _react2.default.createElement(\"span\", { className: \"icon-email-1 color-primary_3\" })), _react2.default.createElement(\"div\", null, _react2.default.createElement(\"p\", null, \"Generating files from a filtered view can take a long time. For your convenience, we will email you a link to download the file once it is ready (typically within 30 minutes).\")), _react2.default.createElement(\"br\", null), _react2.default.createElement(UserEmail, { email: email }));\n        }\n    }]);\n\n    return EmailLoggedInUser;\n}(_react2.default.Component);\n\nexports.default = EmailLoggedInUser;\n\n/***/ }),\n/* 1474 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SummaryTable = function (_React$Component) {\n    _inherits(SummaryTable, _React$Component);\n\n    function SummaryTable(props) {\n        _classCallCheck(this, SummaryTable);\n\n        var _this = _possibleConstructorReturn(this, (SummaryTable.__proto__ || Object.getPrototypeOf(SummaryTable)).call(this, props));\n\n        _this.handleOnScroll = function (event) {\n            _this.setState({\n                scrollTop: event.target.scrollTop,\n                scrollLeft: event.target.scrollLeft\n            });\n        };\n        _this.state = {\n            scrollTop: 0,\n            scrollLeft: 0\n        };\n        return _this;\n    }\n\n    _createClass(SummaryTable, [{\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate() {\n            var summaryTableContainer = (0, _jquery2.default)('.summary-table-container');\n            this.state = {\n                scrollTop: summaryTableContainer[0] && summaryTableContainer[0].scrollTop,\n                scrollLeft: summaryTableContainer[0] && summaryTableContainer[0].scrollLeft\n            };\n        }\n    }, {\n        key: 'getFixedRowStyle',\n        value: function getFixedRowStyle() {\n            var customStyles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            return Object.assign({\n                position: 'relative',\n                top: this.state.scrollTop,\n                zIndex: 3\n            }, customStyles);\n        }\n    }, {\n        key: 'getFixedColumnStyle',\n        value: function getFixedColumnStyle() {\n            var customStyles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            return Object.assign({\n                borderRightWidth: this.state.scrollLeft > 0 ? '1px' : 0,\n                left: this.state.scrollLeft,\n                position: 'relative',\n                zIndex: 3\n            }, customStyles);\n        }\n    }, {\n        key: 'renderHeaderCells',\n        value: function renderHeaderCells(breakdownData) {\n            var _this2 = this;\n\n            var header = [];\n            var visualization = this.props.visualization;\n            var breakdown = visualization.get('breakdown');\n            var breakdownTitle = visualization.get('breakdownColumns').find(function (b) {\n                return b.get('name') == breakdown;\n            }).get('label');\n            var firstElementData = _lodash2.default.head(_lodash2.default.values(breakdownData));\n            var headerTitle = _lodash2.default.keys(firstElementData);\n            var categories = visualization.get('xAxis').map(function (d) {\n                return d.value;\n            }).toJS();\n            categories.push('Total');\n            header.push(_react2.default.createElement(\"th\", { key: \"head\", className: \"fixed-column row-header\", style: this.getFixedRowStyle(this.getFixedColumnStyle({\n                    zIndex: 4\n                })) }, _react2.default.createElement(\"span\", { className: \"ui-drop-item__placeholder is-disabled\" }), _react2.default.createElement(\"strong\", null, breakdownTitle)));\n            _lodash2.default.each(headerTitle, function (title, key) {\n                header.push(_react2.default.createElement(\"th\", { key: key, className: \"row-header\", style: _this2.getFixedRowStyle() }, _react2.default.createElement(\"strong\", null, categories[key])));\n            });\n            return header;\n        }\n    }, {\n        key: 'renderHeader',\n        value: function renderHeader(breakdownData) {\n            return _react2.default.createElement(\"thead\", null, _react2.default.createElement(\"tr\", { className: \"fixed-row-background\" }, this.renderHeaderCells(breakdownData)));\n        }\n    }, {\n        key: 'renderRows',\n        value: function renderRows(breakdownData, rowKey) {\n            var rows = [];\n            var row = [];\n            var legend = _lodash2.default.head(_lodash2.default.keys(breakdownData));\n            var rowItemValues = _lodash2.default.head(_lodash2.default.values(breakdownData));\n            var _props = this.props,\n                visualization = _props.visualization,\n                schema = _props.schema;\n\n            var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n            row.push(_react2.default.createElement(\"th\", { key: \"row_legend\", className: \"fixed-column\", style: this.getFixedColumnStyle() }, _react2.default.createElement(\"span\", { className: \"ui-drop-item__placeholder is-disabled\" }), legend == 'Others' ? _react2.default.createElement(\"span\", null, legend) : _react2.default.createElement(\"span\", { className: \"ui-table__cell__link\", onClick: this.handleFilterClick.bind(this, legend) }, legend)));\n            _lodash2.default.each(rowItemValues, function (item, key) {\n                var showCurrencySymbol = rowKey == 0 ? true : false;\n                var formatedItem = (0, _transactions_utils.formatUnits)(schema, amountColumn, item, showCurrencySymbol);\n                row.push(_react2.default.createElement(\"td\", { key: key }, _react2.default.createElement(\"span\", null, formatedItem)));\n            });\n            rows.push(row);\n            return rows;\n        }\n    }, {\n        key: 'renderBody',\n        value: function renderBody(breakdownData) {\n            var _this3 = this;\n\n            return _react2.default.createElement(\"tbody\", null, _lodash2.default.map(breakdownData, function (data, key) {\n                return _react2.default.createElement(\"tr\", { key: key }, _this3.renderRows(data, key));\n            }));\n        }\n    }, {\n        key: 'renderFooterCells',\n        value: function renderFooterCells(yearTotals) {\n            var footer = [];\n            var footerData = _lodash2.default.values(yearTotals);\n            var _props2 = this.props,\n                visualization = _props2.visualization,\n                schema = _props2.schema;\n\n            var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n            var grandTotal = 0;\n            footer.push(_react2.default.createElement(\"td\", { key: \"foot_first\", className: \"fixed-column row-footer\", style: this.getFixedColumnStyle() }, _react2.default.createElement(\"span\", { className: \"ui-drop-item__placeholder is-disabled\" }), _react2.default.createElement(\"strong\", null, \"Total\")));\n            _lodash2.default.each(footerData, function (total, key) {\n                grandTotal += total;\n                var formatedTotal = (0, _transactions_utils.formatUnits)(schema, amountColumn, total);\n                footer.push(_react2.default.createElement(\"td\", { key: key, className: \"row-footer\" }, _react2.default.createElement(\"strong\", null, formatedTotal)));\n            });\n            // If cumulative grand total is just the last period's total.\n            var isCumulative = visualization && visualization.get('amountsType') === _transactions_utils.AmountsTypes.Cumulative;\n            grandTotal = (0, _transactions_utils.formatUnits)(schema, amountColumn, isCumulative ? _lodash2.default.last(footerData) : grandTotal);\n            footer.push(_react2.default.createElement(\"td\", { key: \"foot_last\", className: \"row-footer\" }, _react2.default.createElement(\"strong\", null, grandTotal)));\n            return footer;\n        }\n    }, {\n        key: 'renderFooter',\n        value: function renderFooter(yearTotals) {\n            return _react2.default.createElement(\"tfoot\", null, _react2.default.createElement(\"tr\", { className: \"fixed-row-background\" }, this.renderFooterCells(yearTotals)));\n        }\n    }, {\n        key: 'handleFilterClick',\n        value: function handleFilterClick(legend) {\n            var column = this.props.visualization.get('breakdown');\n            var operator = legend === '- Blank -' ? null : 'eq';\n            legend = legend === '- Blank -' ? true : legend;\n            this.props.columnOnClick(column, operator, legend);\n        }\n    }, {\n        key: 'processData',\n        value: function processData(aggregatesData) {\n            var summaryData = [];\n            var breakdownDataBySeriesName = [];\n            var breakdownTotals = {};\n            var breakdownData = [];\n            var yearTotals = {};\n            var _props3 = this.props,\n                visualization = _props3.visualization,\n                schema = _props3.schema;\n\n            var breakdown = visualization.get('breakdown');\n            var amountColumn = (0, _transactions_utils.getAmountColumn)(visualization, schema);\n            var sumField = amountColumn + '_sum';\n            var noSeriesName = '- Blank -';\n            var isCumulative = visualization && visualization.get('amountsType') === _transactions_utils.AmountsTypes.Cumulative;\n            aggregatesData.forEach(function (yearData) {\n                var yearTotal = 0;\n                var year = yearData.get('fiscal_year') || yearData.get('year') + _lodash2.default.padStart(yearData.get('month'), 2, '0');\n                yearData.get('transactions').forEach(function (v) {\n                    var seriesName = v.get(breakdown);\n                    var sum = v.get(sumField);\n                    // If breakdown is undefined, don't continue\n                    if (_lodash2.default.isUndefined(seriesName) || _lodash2.default.isUndefined(sum)) {\n                        return false;\n                    }\n                    seriesName = seriesName == 'Show More' ? 'Others' : seriesName || noSeriesName;\n                    if (!breakdownDataBySeriesName[seriesName]) {\n                        breakdownDataBySeriesName[seriesName] = [];\n                    }\n                    if (!breakdownDataBySeriesName[seriesName][year]) {\n                        breakdownDataBySeriesName[seriesName][year] = {};\n                    }\n                    breakdownDataBySeriesName[seriesName] = Object.assign(_extends({}, breakdownDataBySeriesName[seriesName]), _defineProperty({}, year, sum));\n                    breakdownTotals[seriesName] = (breakdownTotals[seriesName] ? breakdownTotals[seriesName] : 0) + sum;\n                    yearTotal += sum;\n                });\n                yearTotals[year] = yearTotal;\n            });\n            // Check for any missing years\n            Object.keys(breakdownDataBySeriesName).forEach(function (seriesName) {\n                Object.keys(yearTotals).forEach(function (year) {\n                    if (!_lodash2.default.includes(_lodash2.default.keys(breakdownDataBySeriesName[seriesName]), year)) {\n                        breakdownDataBySeriesName[seriesName] = Object.assign(_extends({}, breakdownDataBySeriesName[seriesName]), _defineProperty({}, year, 0));\n                    }\n                });\n                breakdownDataBySeriesName[seriesName] = _lodash2.default.sortBy(breakdownDataBySeriesName[seriesName], function (value, key) {\n                    return key;\n                });\n            });\n            // Totals of each breakdown for all years\n            Object.keys(breakdownDataBySeriesName).forEach(function (seriesName) {\n                // When amounts are cumulative the totals column is just the last period in the table.\n                var yearTotal = isCumulative ? _lodash2.default.last(breakdownDataBySeriesName[seriesName]) : breakdownTotals[seriesName];\n                breakdownDataBySeriesName[seriesName] = Object.assign(_extends({}, breakdownDataBySeriesName[seriesName]), { 'Total': yearTotal });\n                breakdownData.push(_defineProperty({}, seriesName, breakdownDataBySeriesName[seriesName]));\n            });\n            // Sort data based on legendSortBy\n            breakdownData = this.sortData(breakdownData, visualization.get('legendSortBy'));\n            summaryData.push({ breakdownData: breakdownData });\n            summaryData.push({ yearTotals: yearTotals });\n            return summaryData;\n        }\n    }, {\n        key: 'sortData',\n        value: function sortData(breakdownData, sortBy) {\n            if (sortBy == 'asc') {\n                breakdownData = _lodash2.default.sortBy(breakdownData, function (data) {\n                    return _lodash2.default.head(_lodash2.default.values(data)).Total;\n                });\n            }\n            if (sortBy == 'desc') {\n                breakdownData = _lodash2.default.sortBy(breakdownData, function (data) {\n                    return _lodash2.default.head(_lodash2.default.values(data)).Total;\n                }).reverse();\n            }\n            if (sortBy == 'alpha') {\n                breakdownData = _lodash2.default.sortBy(breakdownData, function (data) {\n                    return _lodash2.default.head(_lodash2.default.keys(data));\n                });\n            }\n            if (sortBy == 'alpha_rev') {\n                breakdownData = _lodash2.default.sortBy(breakdownData, function (data) {\n                    return _lodash2.default.head(_lodash2.default.keys(data));\n                }).reverse();\n            }\n            breakdownData.push(_lodash2.default.remove(breakdownData, function (data) {\n                return _lodash2.default.head(_lodash2.default.keys(data)) == 'Others';\n            }));\n            breakdownData = _lodash2.default.flattenDeep(breakdownData);\n            return breakdownData;\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var aggregatesData = this.props.aggregatesData;\n\n            var summaryData = this.processData(aggregatesData);\n            if (_lodash2.default.size(summaryData) > 0 && _lodash2.default.size(summaryData[0].breakdownData) > 0) {\n                var breakdownData = summaryData[0].breakdownData;\n                return _react2.default.createElement(\"div\", { className: \"summary-table-container summary-table ui-table js-table-container layout_expansion\", onScroll: this.handleOnScroll }, _react2.default.createElement(\"table\", { className: \"table summary_table\" }, this.renderHeader(breakdownData[0]), this.renderBody(breakdownData), this.renderFooter(summaryData[1].yearTotals)));\n            } else {\n                return null;\n            }\n        }\n    }]);\n\n    return SummaryTable;\n}(_react2.default.Component);\n\nexports.default = SummaryTable;\n\nSummaryTable.propTypes = {\n    visualization: _propTypes2.default.object,\n    schema: _propTypes2.default.object,\n    columnOnClick: _propTypes2.default.func,\n    aggregatesData: _propTypes2.default.object\n};\n\n/***/ }),\n/* 1475 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.SavedViewButton = exports.ToggleIcons = exports.SetDefaultStateButton = exports.SettingsButton = exports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _saved_view_actions = __webpack_require__(187);\n\nvar _saved_view_actions2 = _interopRequireDefault(_saved_view_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ReportConfigButtons = function (_React$Component) {\n    _inherits(ReportConfigButtons, _React$Component);\n\n    function ReportConfigButtons() {\n        _classCallCheck(this, ReportConfigButtons);\n\n        return _possibleConstructorReturn(this, (ReportConfigButtons.__proto__ || Object.getPrototypeOf(ReportConfigButtons)).apply(this, arguments));\n    }\n\n    _createClass(ReportConfigButtons, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                isNetwork = _props.isNetwork,\n                isGridReport = _props.isGridReport,\n                report = _props.report,\n                isEditingDefaultState = _props.isEditingDefaultState,\n                disableEditDefaultState = _props.disableEditDefaultState,\n                isControlPanel = _props.isControlPanel,\n                entity = _props.entity;\n\n            var settingsButton = void 0;\n            var canUpdateReport = report && _lodash2.default.get(report.get('abilities'), ['update']);\n            var canCreateSavedViews = report && _lodash2.default.get(report.get('user_abilities'), ['saved_views', 'create']);\n            var showCreateViews = isControlPanel && canCreateSavedViews;\n            if (isGridReport && (isNetwork || !canUpdateReport)) {\n                return null;\n            }\n            var reportActionsClassName = (0, _classnames2.default)({\n                'ui-mainpanel__section': true,\n                'ui-button-stack': true,\n                report__actions: true,\n                'report__actions__configure-report': canUpdateReport,\n                'report__actions__create-saved-view': showCreateViews,\n                'editing-default-state': isEditingDefaultState\n            });\n            // TODO: GRA-470: even though we dynamically render a SettingsCategoryItem,\n            // we don't have an easy way of knowing which category we are actually rendering in this component\n            // we would need to do some precomputation when the report loads in order to know,\n            // all the settings panel cateogry item visibilty state should be hoisted into state anyway\n            //Show Presentation when Public View and not a Grid Report\n            //Show Presentation when ControlPanel and demoted User\n            var isPresentation = !isControlPanel && !isGridReport || isControlPanel && !canUpdateReport;\n            if (isControlPanel || !isGridReport) {\n                if (isPresentation && entity.get('population') !== null && entity.get('population') > 0) {\n                    settingsButton = _react2.default.createElement(SettingsButton, { title: \"Presentation\" });\n                } else {\n                    settingsButton = _react2.default.createElement(SettingsButton, { title: \"Settings\" });\n                }\n            }\n            return _react2.default.createElement(\"div\", { className: reportActionsClassName }, showCreateViews && _react2.default.createElement(\"div\", { className: \"saved-view-add-btn__container\" }, _react2.default.createElement(SavedViewButton, null)), isControlPanel && canUpdateReport && _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Configure report\"), (isControlPanel || !isGridReport || isControlPanel && canUpdateReport && !isEditingDefaultState) && _react2.default.createElement(\"div\", { className: \"ui-button-stack\" }, settingsButton, isControlPanel && canUpdateReport && !isEditingDefaultState && _react2.default.createElement(SetDefaultStateButton, { disabled: disableEditDefaultState })));\n        }\n    }]);\n\n    return ReportConfigButtons;\n}(_react2.default.Component);\n\nexports.default = ReportConfigButtons;\n\nReportConfigButtons.propTypes = {\n    isNetwork: _propTypes2.default.bool,\n    isGridReport: _propTypes2.default.bool,\n    report: _propTypes2.default.object,\n    disableEditDefaultState: _propTypes2.default.bool,\n    isEditingDefaultState: _propTypes2.default.bool,\n    isControlPanel: _propTypes2.default.bool,\n    entity: _propTypes2.default.any\n};\nvar SettingsButton = exports.SettingsButton = function SettingsButton(_ref) {\n    var title = _ref.title;\n    return _react2.default.createElement(\"button\", { className: \"ui-button small\", onClick: _report_actions2.default.openSettingsPanel }, _react2.default.createElement(\"span\", { className: \"icon-settings-1\" }), \" \", title, _react2.default.createElement(ToggleIcons, null));\n};\nvar SetDefaultStateButton = exports.SetDefaultStateButton = function SetDefaultStateButton(_ref2) {\n    var disabled = _ref2.disabled;\n    return _react2.default.createElement(\"button\", { className: \"ui-button small\", onClick: _report_actions2.default.enableEditDefaultStateMode, disabled: disabled }, _react2.default.createElement(\"span\", { className: \"icon-preview-1\" }), \" Set default state\", _react2.default.createElement(ToggleIcons, null));\n};\nvar ToggleIcons = exports.ToggleIcons = function ToggleIcons() {\n    return _react2.default.createElement(\"div\", { className: \"ui-panel-toggle\" }, _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__close\" }), _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__open\" }));\n};\nvar SavedViewButton = exports.SavedViewButton = function SavedViewButton() {\n    return _react2.default.createElement(\"button\", { className: \"saved-view-add-btn ui-button small\", onClick: _saved_view_actions2.default.newView }, _react2.default.createElement(\"span\", { className: \"saved-view-add-btn__icon icon-plus-2\" }), \" Save view\");\n};\n\n/***/ }),\n/* 1476 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar EntityLogo = function (_React$Component) {\n    _inherits(EntityLogo, _React$Component);\n\n    function EntityLogo() {\n        _classCallCheck(this, EntityLogo);\n\n        return _possibleConstructorReturn(this, (EntityLogo.__proto__ || Object.getPrototypeOf(EntityLogo)).apply(this, arguments));\n    }\n\n    _createClass(EntityLogo, [{\n        key: 'render',\n        value: function render() {\n            var entity = this.props.entity;\n\n            var displayName = entity.get('display_name');\n            var logo = entity.get('logo');\n            var logoSrc = logo ? logo : 'app/Ovid/dist/images/default-logo.png';\n            return _react2.default.createElement(\"a\", { href: \"/\", className: \"entity-logo ui-mainpanel__section\" }, _react2.default.createElement(\"img\", { src: logoSrc, alt: 'Go to ' + displayName + ' Transparency Home' }));\n        }\n    }]);\n\n    return EntityLogo;\n}(_react2.default.Component);\n\nexports.default = EntityLogo;\n\n/***/ }),\n/* 1477 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ReportListItem = undefined;\n\nvar _lodash = __webpack_require__(3);\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar getListItemId = function getListItemId(report) {\n    var reportType = report.get('report_type');\n    if (reportType !== 'grid') {\n        return reportType;\n    }\n    var isGeoEnabled = report.get('is_geo_enabled');\n    return isGeoEnabled ? 'map' : reportType;\n};\nvar ReportListItem = exports.ReportListItem = (0, _createReactClass2.default)({\n    displayName: 'ReportListItem',\n\n    propTypes: {\n        report: _propTypes2.default.object.isRequired,\n        active: _propTypes2.default.bool\n    },\n    render: function render() {\n        var report = this.props.report;\n        var rowButtonClasses = (0, _classnames2.default)({\n            'ui-nav-list__item': true,\n            'is-selected': this.props.active\n        });\n        var reportPath = report.get('report_type') === 'grid' && !gon.isPreview ? 'data' : 'transparency';\n        return _react2.default.createElement(\"a\", { className: rowButtonClasses, id: 'product_' + getListItemId(report), href: '/' + reportPath + '#' + report.id, onClick: this.handleClick }, _react2.default.createElement(\"div\", { className: \"product-icon\" }, _react2.default.createElement(\"span\", { className: \"product-icon__foreground\" }), _react2.default.createElement(\"span\", { className: \"product-icon__background\" })), _react2.default.createElement(\"span\", { className: \"ui-nav-list__item__text\" }, report.get('name')));\n    },\n    handleClick: function handleClick(e) {\n        // Clicking the active report item should be a no-op.\n        if (this.props.active) {\n            e.preventDefault();\n        }\n    }\n});\nvar ReportList = (0, _createReactClass2.default)({\n    displayName: 'ReportList',\n\n    propTypes: {\n        reports: _propTypes2.default.object,\n        activeReport: _propTypes2.default.object\n    },\n    render: function render() {\n        if (!this.props.reports) {\n            return _react2.default.createElement(\"noscript\", null);\n        }\n        var activeReport = this.props.activeReport;\n        var reports = (0, _lodash.sortBy)(this.props.reports.models, 'attributes.position');\n        var reportItems = (0, _lodash.map)(reports, function (report) {\n            return _react2.default.createElement(ReportListItem, { key: report.id, report: report, active: report === activeReport });\n        });\n        return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section product-list\" }, _react2.default.createElement(\"nav\", { \"aria-label\": \"List of reports\", className: \"ui-nav-list\" }, reportItems));\n    }\n});\nexports.default = ReportList;\n\n/***/ }),\n/* 1478 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _saved_views_store = __webpack_require__(145);\n\nvar _saved_views_store2 = _interopRequireDefault(_saved_views_store);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _saved_views_panel = __webpack_require__(1479);\n\nvar _saved_views_panel2 = _interopRequireDefault(_saved_views_panel);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TogglePanel = (0, _createReactClass2.default)({\n    displayName: 'TogglePanel',\n\n    propTypes: {\n        entity: _propTypes2.default.object,\n        session: _propTypes2.default.object,\n        isControlPanel: _propTypes2.default.bool\n    },\n    mixins: [(0, _og_flux.StoreListener)(_report_view_store2.default, _saved_views_store2.default)],\n    getInitialState: function getInitialState() {\n        return this.getStateFromStore();\n    },\n    getStateFromStore: function getStateFromStore() {\n        return {\n            activePanel: _report_view_store2.default.getActiveMainPanel(),\n            isSavedViewsEnabled: this.isSavedViewsEnabled(),\n            report: _report_view_store2.default.getRenderedReport()\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState(this.getStateFromStore());\n    },\n    isSavedViewsEnabled: function isSavedViewsEnabled() {\n        // Disable in public or network reports ( isControlPanel ) if the report has no saved views.\n        // also don't bother showing if no views and they can't create one\n        var publicFacing = !this.props.isControlPanel;\n        var hasSavedViews = _saved_views_store2.default.getSavedViewsCount() > 0;\n        var canCreate = this.state && this.state.report && this.state.report.getIn(['user_abilities', 'saved_views', 'create'], false);\n        return !publicFacing && canCreate || hasSavedViews;\n    },\n    render: function render() {\n        if (!this.state.isSavedViewsEnabled) {\n            return _react2.default.createElement(\"div\", null, this.props.children);\n        }\n        var activePanelClass = this.state.activePanel === 'filter' ? 'is-first' : 'is-second';\n        return _react2.default.createElement(\"div\", { className: 'ui-togglepanel ' + activePanelClass }, _react2.default.createElement(\"div\", { className: \"ui-togglepanel__control\", role: \"tablist\" }, _react2.default.createElement(\"div\", { className: \"ui-togglepanel__control-pointer\" }), _react2.default.createElement(\"button\", { role: \"tab\", className: \"ui-togglepanel__control-label_first\", onClick: this.handleFilterClick }, \"Filters\"), _react2.default.createElement(\"button\", { role: \"tab\", className: \"ui-togglepanel__control-label_second\", onClick: this.handleSavedClick }, \"Views\")), _react2.default.createElement(\"div\", { className: \"ui-togglepanel__body\" }, _react2.default.createElement(\"div\", { className: \"ui-togglepanel__body-inner\" }, _react2.default.createElement(\"div\", { className: \"ui-togglepanel__panel_first\" }, _react2.default.createElement(\"p\", { className: \"panel-detail\" }, \"Changing filters will update visualization automatically.\"), this.props.children), _react2.default.createElement(\"div\", { className: \"ui-togglepanel__panel_second\" }, _react2.default.createElement(_saved_views_panel2.default, { entity: this.props.entity, session: this.props.session, isControlPanel: this.props.isControlPanel, isGridReport: this.props.isGridReport, report: this.state.report })))));\n    },\n    handleChange: function handleChange() {\n        this.setState(this.getStateFromStore());\n    },\n    handleSavedClick: function handleSavedClick() {\n        _report_actions2.default.toggleMainPanel('saved');\n    },\n    handleFilterClick: function handleFilterClick() {\n        _report_actions2.default.toggleMainPanel('filter');\n    }\n});\nexports.default = TogglePanel;\n\n/***/ }),\n/* 1479 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _saved_views_store = __webpack_require__(145);\n\nvar _saved_views_store2 = _interopRequireDefault(_saved_views_store);\n\nvar _saved_view_actions = __webpack_require__(187);\n\nvar _saved_view_actions2 = _interopRequireDefault(_saved_view_actions);\n\nvar _saved_views_list = __webpack_require__(1480);\n\nvar _saved_views_list2 = _interopRequireDefault(_saved_views_list);\n\nvar _saved_view_modal = __webpack_require__(1482);\n\nvar _saved_view_modal2 = _interopRequireDefault(_saved_view_modal);\n\nvar _intercom_utils = __webpack_require__(121);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SavedViewsPanel = (0, _createReactClass2.default)({\n    displayName: 'SavedViewsPanel',\n\n    mixins: [(0, _og_flux.StoreListener)(_saved_views_store2.default)],\n    propTypes: {\n        entity: _propTypes2.default.object,\n        session: _propTypes2.default.object,\n        isControlPanel: _propTypes2.default.bool,\n        report: _propTypes2.default.object.isRequired\n    },\n    getInitialState: function getInitialState() {\n        return this.getStateFromStore();\n    },\n    getStateFromStore: function getStateFromStore() {\n        return {\n            savedViews: _saved_views_store2.default.getSortedViews(),\n            visitedSavedViews: _saved_views_store2.default.getVisitedViews(),\n            activeSavedView: _saved_views_store2.default.getActiveView(),\n            editView: _saved_views_store2.default.getEditView(),\n            isEditViewSyncing: _saved_views_store2.default.isEditViewSyncing()\n        };\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState(this.getStateFromStore());\n    },\n    render: function render() {\n        var modalView = this.state.editView;\n        return _react2.default.createElement(\"div\", { className: \"ui-saved-views-panel\" }, _react2.default.createElement(_saved_views_list2.default, { report: this.props.report, items: this.state.savedViews, visitedItems: this.state.visitedSavedViews, activeItem: this.state.activeSavedView, entity: this.props.entity, isEditable: this.canUserEditViews(), isControlPanel: this.props.isControlPanel, isGridReport: this.props.isGridReport, onEditItem: this.handleEditClick }), modalView ? _react2.default.createElement(Ovid.Overlay, { id: \"saved-view-modal\" }, _react2.default.createElement(_saved_view_modal2.default, { savedView: modalView, isSyncing: this.state.isEditViewSyncing, onSubmit: this.handleSubmit, onDelete: this.handleDelete, onClose: this.handleClose })) : null);\n    },\n    isSameEntityOrOpenGov: function isSameEntityOrOpenGov() {\n        if (this.props.session.isOpenGov() || this.props.entity.id === this.props.session.entity.id) {\n            return true;\n        }\n        return false;\n    },\n    canUserEditViews: function canUserEditViews() {\n        var session = this.props.session;\n        var canManage = this.props.report.get('user_abilities').get('saved_views').get('update');\n        return this.props.isControlPanel && session && canManage;\n    },\n    handleChange: function handleChange() {\n        this.setState(this.getStateFromStore());\n    },\n    handleSubmit: function handleSubmit(savedView, description) {\n        if (this.state.editView.id) {\n            _saved_view_actions2.default.updateView(this.state.editView.id, { description: description });\n            var metadata = {\n                reportId: savedView.report_id,\n                description: description\n            };\n            (0, _intercom_utils.trackIntercomEvent)('update-saved-view', metadata);\n        } else {\n            _saved_view_actions2.default.createView(description);\n            var metadata = {\n                reportId: savedView.report_id,\n                description: description\n            };\n            (0, _intercom_utils.trackIntercomEvent)('create-saved-view', metadata);\n        }\n    },\n    handleEditClick: function handleEditClick(savedView) {\n        _saved_view_actions2.default.editView(savedView.id);\n    },\n    handleDelete: function handleDelete(savedView) {\n        _saved_view_actions2.default.deleteView(savedView.id);\n        var metadata = {\n            reportId: savedView.report_id,\n            description: savedView.description\n        };\n        (0, _intercom_utils.trackIntercomEvent)('delete-saved-view', metadata);\n    },\n    handleClose: function handleClose() {\n        _saved_view_actions2.default.cancelView();\n    }\n});\nexports.default = SavedViewsPanel;\n\n/***/ }),\n/* 1480 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _querystring = __webpack_require__(641);\n\nvar _querystring2 = _interopRequireDefault(_querystring);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _saved_view_item = __webpack_require__(1481);\n\nvar _saved_view_item2 = _interopRequireDefault(_saved_view_item);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SavedViewsList = (0, _createReactClass2.default)({\n    displayName: 'SavedViewsList',\n\n    propTypes: {\n        items: _propTypes2.default.array,\n        activeItem: _propTypes2.default.object,\n        visitedItems: _propTypes2.default.array,\n        entity: _propTypes2.default.object,\n        isEditable: _propTypes2.default.bool,\n        isConrolPanel: _propTypes2.default.bool,\n        onEditItem: _propTypes2.default.func\n    },\n    render: function render() {\n        var items = this.props.items;\n        if (_lodash2.default.isEmpty(items)) {\n            return _react2.default.createElement(\"div\", { className: \"saved-view-empty\" }, \"You haven't added any saved views to this report. To save the view you're currently looking at, click the Save button below.\");\n        }\n        return _react2.default.createElement(\"nav\", { \"aria-label\": \"List of saved views\", className: \"ui-saved-views-list\" }, items.map(this.renderItem));\n    },\n    renderItem: function renderItem(savedView, index) {\n        var state = savedView.view_state;\n        var fiscalYearRange = state.fiscal_year_range;\n        var params = void 0;\n        if (this.props.isGridReport) {\n            params = _querystring2.default.stringify({\n                query: state.query\n            });\n        } else {\n            params = _querystring2.default.stringify({\n                breakdown: state.breakdown_id,\n                accountType: state.ledger,\n                graph: state.graph,\n                month: state.month || 'latest',\n                year: state.year || 'latest',\n                selection: state.selection,\n                legend_sort: state.sort_order,\n                saved_view: savedView.id,\n                projections: state.projections === true,\n                projectionType: state.projection_type,\n                highlightingVariance: state.highlighting_variance,\n                highlighting: state.highlighting === true,\n                fiscal_start: _lodash2.default.result(fiscalYearRange, 'start'),\n                fiscal_end: _lodash2.default.result(fiscalYearRange, 'end'),\n                currentYearPeriod: state.current_year_period,\n                currentYearAmount: state.current_year_amount,\n                selectedDataSetIndex: state.selected_data_set_index == null ? 'latest' : state.selected_data_set_index\n            });\n        }\n        var href = void 0;\n        if (this.props.isControlPanel && this.props.entity) {\n            href = '#/' + this.props.entity.id + '/reports/' + savedView.report_id + '/' + params;\n        } else {\n            href = '#/' + savedView.report_id + '/' + params;\n        }\n        return _react2.default.createElement(_saved_view_item2.default, { key: index, savedView: savedView, href: href, isActive: this.props.activeItem === savedView, isVisited: _lodash2.default.last(this.props.visitedItems) === savedView.id, isEditable: this.props.isEditable, onEditClick: this.handleEditClick.bind(null, savedView) });\n    },\n    handleEditClick: function handleEditClick(item) {\n        if (this.props.onEditItem) {\n            this.props.onEditItem(item);\n        }\n    }\n});\nexports.default = SavedViewsList;\n\n/***/ }),\n/* 1481 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _saved_view_actions = __webpack_require__(187);\n\nvar _saved_view_actions2 = _interopRequireDefault(_saved_view_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The distance from the center of an item another item must\n// be dragged to before the will swap positions.\nvar ITEM_SWAP_THRESHOLD = 2;\n\nvar SavedViewItem = (0, _createReactClass2.default)({\n    displayName: 'SavedViewItem',\n\n    propTypes: {\n        savedView: _propTypes2.default.object.isRequired,\n        href: _propTypes2.default.string.isRequired,\n        isActive: _propTypes2.default.bool,\n        isEditable: _propTypes2.default.bool,\n        isVisited: _propTypes2.default.bool,\n        onEditClick: _propTypes2.default.func\n    },\n    render: function render() {\n        var savedView = this.props.savedView;\n        var savedViewModifiers = '\\n      ' + (this.props.isActive ? 'is-active' : '') + '\\n      ' + (!this.props.isActive && this.props.isVisited ? 'is-visited' : '') + '\\n    ';\n        return _react2.default.createElement(\"div\", { draggable: this.props.isEditable, onDragStart: this.handleDragStart, onDragOver: this.handleDragOver, onDragEnter: this.handleDragEnter, onDrop: this.handleDrop }, _react2.default.createElement(\"a\", { className: 'saved-view ' + savedViewModifiers, href: this.props.href, draggable: false, onClick: this.handleViewClick, title: savedView.description }, savedView.description, this.renderEditControls()));\n    },\n    renderEditControls: function renderEditControls() {\n        if (!this.props.isEditable) {\n            return null;\n        }\n        return _react2.default.createElement(\"span\", null, _react2.default.createElement(\"span\", { className: \"saved-view__edit-btn\", onClick: this.handleEditClick }, \"EDIT\"), _react2.default.createElement(\"span\", { className: \"saved-view__drag-btn icon-drag-n-drop-1\" }));\n    },\n    handleViewClick: function handleViewClick() {\n        _saved_view_actions2.default.selectView(this.props.savedView);\n    },\n    handleEditClick: function handleEditClick(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        if (this.props.onEditClick) {\n            this.props.onEditClick();\n        }\n    },\n    handleDragStart: function handleDragStart(e) {\n        try {\n            // Firefox won't drag without setting data\n            e.dataTransfer.setData('application/json', {});\n        } catch (err) {\n            // IE doesn't support MIME types in setData\n        }\n        e.dataTransfer.effectAllowed = 'move';\n        _saved_view_actions2.default.startViewDrag(this.props.savedView.id);\n    },\n    handleDragOver: function handleDragOver(e) {\n        e.preventDefault();\n        e.dataTransfer.dropEffect = 'move';\n        var el = _reactDom2.default.findDOMNode(this);\n        var rect = el.getBoundingClientRect();\n        var relY = e.clientY - rect.top;\n        var middle = rect.height / 2;\n        var distanceToMiddle = Math.abs(middle - relY);\n        if (distanceToMiddle <= ITEM_SWAP_THRESHOLD) {\n            _saved_view_actions2.default.dragViewAfter(this.props.savedView.id);\n        }\n    },\n    handleDragEnter: function handleDragEnter(e) {\n        e.preventDefault();\n    },\n    handleDrop: function handleDrop(e) {\n        e.preventDefault();\n        _saved_view_actions2.default.dropView();\n    }\n});\nexports.default = SavedViewItem;\n\n/***/ }),\n/* 1482 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SavedViewModal = (0, _createReactClass2.default)({\n    displayName: 'SavedViewModal',\n\n    propTypes: {\n        savedView: _propTypes2.default.object,\n        isSyncing: _propTypes2.default.bool,\n        onSubmit: _propTypes2.default.func,\n        onClose: _propTypes2.default.func\n    },\n    getInitialState: function getInitialState() {\n        return {\n            description: null\n        };\n    },\n    componentDidMount: function componentDidMount() {\n        if (this.props.savedView) {\n            this.focusDescription();\n        }\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (this.props.savedView !== nextProps.savedView) {\n            this.setState({\n                description: _lodash2.default.result(nextProps.savedView, 'description')\n            });\n        }\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps) {\n        if (!prevProps.savedView && this.props.savedView) {\n            this.focusDescription();\n        }\n    },\n    render: function render() {\n        var savedView = this.props.savedView;\n        if (!savedView) {\n            return null;\n        }\n        var isNew = !_lodash2.default.has(savedView, 'id');\n        var isPending = _lodash2.default.has(savedView, '__clientId') || this.props.isSyncing;\n        var description = this.currentDescription();\n        var count = _lodash2.default.size(description);\n        return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper\", style: { display: 'block' } }, _react2.default.createElement(\"div\", { className: \"ui-modal\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, isNew ? 'Add' : 'Edit', \" Saved View\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", onClick: this.props.onClose })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"div\", { className: 'savedview-modal ' + (count > 70 ? 'is-long-title' : '') }, _react2.default.createElement(\"div\", { className: \"savedview-modal__input\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Title\"), _react2.default.createElement(\"div\", { className: \"savedview-modal__count\" }, count), _react2.default.createElement(\"textarea\", { className: \"savedview-modal__textarea\", ref: \"descriptionField\", placeholder: \"Your message...\", value: description, onChange: this.handleChange }))), savedView.__error ? _react2.default.createElement(\"div\", { className: \"savedview-modal__error\" }, savedView.__error) : _react2.default.createElement(\"div\", { className: \"savedview-modal__hint\" }, count > 70 ? _react2.default.createElement(\"span\", null, _react2.default.createElement(\"strong\", null, \"Tip:\"), \" Great titles are less than 70 characters. Try shortening your message.\") : _react2.default.createElement(\"span\", null, \"Give this saved view a title.\", _react2.default.createElement(\"br\", null), \"For example: \\\"How much does our Police Department spend?\\\"\")))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, !isNew ? _react2.default.createElement(\"button\", { className: \"ui-button negative\", disabled: isPending, onClick: this.handleDelete }, \"Delete\") : null, isPending ? _react2.default.createElement(\"div\", { className: \"ui-modal__actions ui-flex-1\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", disabled: true }, _react2.default.createElement(\"span\", { className: \"ui-loading_button\" }), \" \", isNew ? 'Adding...' : 'Updating...')) : _react2.default.createElement(\"div\", { className: \"ui-modal__actions ui-flex-1\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost secondary\", onClick: this.props.onClose }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button primary\", disabled: count === 0, onClick: this.handleSubmit }, isNew ? 'Add Saved View' : 'Update Title')))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n    },\n\n    // Focus and position cursor at the end of the description field.\n    focusDescription: function focusDescription() {\n        var el = this.refs.descriptionField;\n        if (el.setSelectionRange) {\n            var pos = el.value.length;\n            el.focus();\n            el.setSelectionRange(pos, pos);\n        } else {\n            var range = el.createTextRange();\n            range.collapse(false);\n            range.select();\n        }\n    },\n    currentDescription: function currentDescription() {\n        if (_lodash2.default.isNull(this.state.description)) {\n            return _lodash2.default.result(this.props.savedView, 'description');\n        }\n        return this.state.description;\n    },\n    handleChange: function handleChange(e) {\n        this.setState({\n            description: e.target.value\n        });\n    },\n    handleSubmit: function handleSubmit() {\n        if (this.props.onSubmit) {\n            this.props.onSubmit(this.props.savedView, this.currentDescription());\n        }\n    },\n    handleDelete: function handleDelete() {\n        if (this.props.onDelete) {\n            this.props.onDelete(this.props.savedView);\n        }\n    }\n});\nexports.default = SavedViewModal;\n\n/***/ }),\n/* 1483 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar StoryListItem = function StoryListItem(props) {\n    var rowButtonClasses = (0, _classnames2.default)({\n        'ui-nav-list__item': true,\n        'is-selected': props.active\n    });\n    return _react2.default.createElement(\"a\", { className: rowButtonClasses, href: props.story.get('public_url'), target: \"_blank\" }, _react2.default.createElement(\"span\", { className: \"ui-nav-list__item__text\" }, props.story.get('title')));\n};\nvar StoryList = function StoryList(props) {\n    return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section product-list\" }, _react2.default.createElement(\"nav\", { \"aria-label\": \"List of stories\", className: \"ui-nav-list\" }, props.stories && props.stories.sortBy(function (s) {\n        return s.get('order');\n    }).map(function (s) {\n        return _react2.default.createElement(StoryListItem, { key: s.get('_id'), story: s, active: s.get('_id') === props.selectedStoryId });\n    })));\n};\nexports.default = StoryList;\n\n/***/ }),\n/* 1484 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FilterButtons = function (_React$Component) {\n    _inherits(FilterButtons, _React$Component);\n\n    function FilterButtons() {\n        _classCallCheck(this, FilterButtons);\n\n        var _this = _possibleConstructorReturn(this, (FilterButtons.__proto__ || Object.getPrototypeOf(FilterButtons)).apply(this, arguments));\n\n        _this.handleFilterClick = function (item) {\n            if (_this.props.activeFilterIds.get(item.id)) {\n                _this.props.removeFilter(item.id);\n            } else {\n                _this.props.addFilter(item.id);\n            }\n        };\n        _this.handleFilterAll = function (e) {\n            e.preventDefault();\n            _this.props.toggleAll();\n        };\n        return _this;\n    }\n\n    _createClass(FilterButtons, [{\n        key: \"render\",\n        value: function render() {\n            var _this2 = this;\n\n            var items = this.props.items;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\", id: \"section-filter\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Filtered By\", _react2.default.createElement(\"button\", { className: \"ui-mainpanel__section-expand-all js-show-filter-all\", id: \"wd-filter-button-all\", onClick: this.handleFilterAll }, \"All\", _react2.default.createElement(\"span\", { className: \"icon-righthead-2\" }))), _react2.default.createElement(\"div\", { className: \"ui-button-stack\" }, items.map(function (item) {\n                var isActive = _this2.props.activeFilterIds.get(item.id);\n                return _react2.default.createElement(\"button\", { key: item.id, className: \"filter-toggle ui-button small \" + (isActive ? 'active' : ''), onClick: function onClick() {\n                        return _this2.handleFilterClick(item);\n                    } }, _react2.default.createElement(\"span\", { className: \"filter-toggle__text\" }, item.name), _react2.default.createElement(\"div\", { className: \"filter-toggle__actions\" }, _react2.default.createElement(\"span\", { className: \"filter-annotation\", id: \"filter-annotation_\" + item.id }), _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__close\" }), _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__open\" })));\n            })));\n        }\n    }]);\n\n    return FilterButtons;\n}(_react2.default.Component);\n\nexports.default = FilterButtons;\n\n/***/ }),\n/* 1485 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _immutabilityHelper = __webpack_require__(185);\n\nvar _immutabilityHelper2 = _interopRequireDefault(_immutabilityHelper);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _router = __webpack_require__(317);\n\nvar _router2 = _interopRequireDefault(_router);\n\nvar _header = __webpack_require__(520);\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _footer = __webpack_require__(521);\n\nvar _footer2 = _interopRequireDefault(_footer);\n\nvar _report_header = __webpack_require__(1486);\n\nvar _report_header2 = _interopRequireDefault(_report_header);\n\nvar _header_actions = __webpack_require__(1489);\n\nvar _header_actions2 = _interopRequireDefault(_header_actions);\n\nvar _graphtype = __webpack_require__(1492);\n\nvar _graphtype2 = _interopRequireDefault(_graphtype);\n\nvar _document_list = __webpack_require__(663);\n\nvar _document_list2 = _interopRequireDefault(_document_list);\n\nvar _filter_panel_options = __webpack_require__(1493);\n\nvar _filter_panel_options2 = _interopRequireDefault(_filter_panel_options);\n\nvar _legend = __webpack_require__(1494);\n\nvar _legend2 = _interopRequireDefault(_legend);\n\nvar _recoverable_error = __webpack_require__(258);\n\nvar _recoverable_error2 = _interopRequireDefault(_recoverable_error);\n\nvar _download = __webpack_require__(1499);\n\nvar _download2 = _interopRequireDefault(_download);\n\nvar _graph = __webpack_require__(667);\n\nvar graph = _interopRequireWildcard(_graph);\n\nvar _summary_graph = __webpack_require__(1501);\n\nvar _summary_graph2 = _interopRequireDefault(_summary_graph);\n\nvar _annotations_panel = __webpack_require__(1504);\n\nvar _annotations_panel2 = _interopRequireDefault(_annotations_panel);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _summary_report_filters_panel = __webpack_require__(1509);\n\nvar _summary_report_filters_panel2 = _interopRequireDefault(_summary_report_filters_panel);\n\nvar _global_alert = __webpack_require__(1515);\n\nvar _global_alert2 = _interopRequireDefault(_global_alert);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _saved_views_store = __webpack_require__(145);\n\nvar _saved_views_store2 = _interopRequireDefault(_saved_views_store);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _modal_store = __webpack_require__(257);\n\nvar _modal_store2 = _interopRequireDefault(_modal_store);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _budget = __webpack_require__(665);\n\nvar _budget2 = _interopRequireDefault(_budget);\n\nvar _summary_welcome = __webpack_require__(666);\n\nvar _summary_welcome2 = _interopRequireDefault(_summary_welcome);\n\nvar _howto = __webpack_require__(1516);\n\nvar _howto2 = _interopRequireDefault(_howto);\n\nvar _feedback = __webpack_require__(662);\n\nvar _feedback2 = _interopRequireDefault(_feedback);\n\nvar _termsOfService = __webpack_require__(664);\n\nvar _termsOfService2 = _interopRequireDefault(_termsOfService);\n\nvar _download3 = __webpack_require__(1517);\n\nvar _download4 = _interopRequireDefault(_download3);\n\nvar _filter_panel = __webpack_require__(1545);\n\nvar _filter_panel2 = _interopRequireDefault(_filter_panel);\n\nvar _metric_data_constants = __webpack_require__(261);\n\nvar _projections_utils = __webpack_require__(1550);\n\nvar _transactions_utils = __webpack_require__(54);\n\nvar _summary_table = __webpack_require__(678);\n\nvar _summary_table2 = _interopRequireDefault(_summary_table);\n\nvar _datagrid_container_component = __webpack_require__(1553);\n\nvar _datagrid_container_component2 = _interopRequireDefault(_datagrid_container_component);\n\nvar _cookiesJs = __webpack_require__(174);\n\nvar _cookiesJs2 = _interopRequireDefault(_cookiesJs);\n\nvar _cookie_helper = __webpack_require__(262);\n\nvar _cookie_helper2 = _interopRequireDefault(_cookie_helper);\n\nvar _sidebar = __webpack_require__(318);\n\nvar _sidebar2 = _interopRequireDefault(_sidebar);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar summaryTableHeight = void 0;\nvar gridHeaderHeight = 28;\n\nvar SummaryReport = (0, _createReactClass2.default)({\n    displayName: 'SummaryReport',\n\n    mixins: [(0, _og_flux.StoreListener)(_modal_store2.default)],\n    getInitialState: function getInitialState() {\n        this.events = _lodash2.default.extend({}, _backbone2.default.Events);\n        return _lodash2.default.assign({\n            initialized: false,\n            loading: true,\n            store: _summary_report_store2.default.getState()\n        }, _summary_report_store2.default.getState().toObject(), { showWelcome: this.showWelcome() });\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        //this is just the modal store currently\n        this.setState((0, _immutabilityHelper2.default)(this.state, {\n            showWelcome: {\n                $set: _modal_store2.default.getState().get('showWelcome') === null ? this.state.welcomeModal : _modal_store2.default.getState().get('showWelcome')\n            },\n            showHowTo: {\n                $set: _modal_store2.default.getState().get('showHowTo')\n            },\n            showDownloadModal: {\n                $set: _modal_store2.default.getState().get('showDownloadModal')\n            },\n            showTOS: {\n                $set: _modal_store2.default.getState().get('showTOS')\n            },\n            showBudget101: {\n                $set: _modal_store2.default.getState().get('showBudget101')\n            },\n            showFeedback: {\n                $set: _modal_store2.default.getState().get('feedback').get('showFeedback')\n            },\n            feedbackSaving: {\n                $set: _modal_store2.default.getState().get('feedback').get('saving')\n            },\n            feedbackError: {\n                $set: _modal_store2.default.getState().get('feedback').get('showError')\n            },\n            feedbackErrorMessage: {\n                $set: _modal_store2.default.getState().get('feedback').get('errorMessage')\n            }\n        }));\n    },\n    componentDidMount: function componentDidMount() {\n        var $graph = (0, _jquery2.default)(_reactDom2.default.findDOMNode(this.refs.graph));\n        summaryTableHeight = $graph.height() - gridHeaderHeight;\n        if (_lodash2.default.includes(this.props.entity.get('feature_permissions'), 'metric_data') && _lodash2.default.includes(_metric_data_constants.compatibleReports, this.props.report.get('technical_name'))) {\n            _summary_report_actions2.default.getMetricsAvailable();\n        }\n        _summary_report_store2.default.addChangeListener(this.handleChange);\n        var entity = this.props.entity.toJSON();\n        var report = this.report = this.props.report;\n        this.events.on('reset', function () {\n            _report_actions2.default.resetState();\n            _summary_report_actions2.default.getAggregations();\n        });\n        if (this.state.showWelcome) {\n            _cookie_helper2.default.setVisitedCookie('transparency_visited');\n        }\n        var athena = this.athena = new Athena({\n            showLogo: this.props.showLogo,\n            entity: entity,\n            report: report,\n            reportParams: this.props.reportParams,\n            embedded: this.props.embedded,\n            onParamsChange: this.props.onParamsChange,\n            reportEvents: this.events,\n            auditModeEnabled: this.props.auditModeEnabled\n        });\n        _saved_views_store2.default.addChangeListener(this.handleSavedViewsStoreChange);\n        if (!report.dataSets.isEmpty()) {\n            athena.on('initialized', this.handleAthenaInitialized);\n            athena.on('loaded', this.handleAthenaLoaded);\n            athena.on('error', this.handleAthenaError);\n        } else {\n            this.handleAthenaInitialized();\n            this.handleAthenaLoaded();\n        }\n        if (this.props.onStateChange) {\n            athena.on('stateChange', this.handleDefaultStateChange);\n        }\n        /**\r\n        * every time athena_state gets event renderData, Athena re-triggers this event in this this handler\r\n        */\n        athena.on('renderData', this.handleRenderData);\n        if (this.props.onDataSetChange) {\n            athena.on('dataSetChange', this.props.onDataSetChange);\n        }\n        if (this.props.onCoaMaskChange) {\n            athena.on('coaMaskChange', this.props.onCoaMaskChange);\n        }\n        var pkg = _summary_report_store2.default.getState().get('pkg');\n        if (pkg) {\n            athena.renderPackage(pkg);\n        }\n    },\n\n    /**\r\n    * every time Summary Report Store state is updated, this function is called\r\n    * basically we update Summary report state from the Summary Report Store state <-- go figure\r\n    *\r\n    * _/﹋\\_\r\n    * (҂`_´)\r\n    * <,︻╦╤─ ҉ - -\r\n    * _/﹋\\_\r\n    */\n    handleChange: function handleChange() {\n        var state = _summary_report_store2.default.getState();\n        this.setState({\n            store: state,\n            amountUnit: _summary_report_store2.default.getAmountUnit(),\n            filterPanels: _summary_report_store2.default.getFilterPanels(),\n            yAxisScale: state.get('yAxisScale') && state.get('yAxisScale').toJS()\n        });\n        if (this.athena) {\n            this.athena.state.set('showAnnotations', state.isAnnotationsPanelOpen);\n        }\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        _summary_report_store2.default.removeChangeListener(this.handleChange);\n        if (this.athena) {\n            this.athena.unmount();\n            this.athena.off('initialized', this.handleAthenaInitialized);\n            this.athena.off('renderData', this.handleRenderData);\n            if (this.props.onStateChange) {\n                this.athena.off('stateChange', this.handleDefaultStateChange);\n            }\n            this.athena.stopListening();\n            if (this.loadPackageRequest) {\n                this.loadPackageRequest.abort();\n            }\n        }\n        _saved_views_store2.default.removeChangeListener(this.handleSavedViewsStoreChange);\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        var _this = this;\n\n        if (nextProps.renderedReport.get('data_sets') !== this.props.renderedReport.get('data_sets')) {\n            _lodash2.default.defer(function () {\n                _this.athena.updateDataSets(nextProps.renderedReport.get('data_sets').toJS());\n            });\n        }\n        if (nextProps.renderedReport.get('coa_mask_id') !== this.props.renderedReport.get('coa_mask_id')) {\n            _lodash2.default.defer(function () {\n                _this.athena.updateCoaMask(nextProps.renderedReport.get('coa_mask_id'));\n            });\n        }\n        if (nextProps.editingDefaultState !== this.props.editingDefaultState) {\n            this.events.trigger('editingDefaultState', nextProps.editingDefaultState);\n        }\n        if (nextProps.reportParams !== this.props.reportParams) {\n            if (this.state.initialized) {\n                this.athena.updateParams(nextProps.reportParams);\n            } else {\n                this.athena.reportParams = nextProps.reportParams;\n            }\n        }\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps, prevState) {\n        var pkg = this.state.store.get('pkg');\n        if (prevState.store.get('pkg') !== pkg) {\n            this.athena.renderPackage(pkg);\n        }\n    },\n    handleSavedViewsStoreChange: function handleSavedViewsStoreChange() {\n        var activeView = _saved_views_store2.default.getActiveView();\n        if (activeView) {\n            //The store is expecting the range to be an array\n            _lodash2.default.defer(_summary_report_actions2.default.setFiscalYearRange, _lodash2.default.values(activeView.view_state.fiscal_year_range));\n            this.athena.state.set('saved_view', _lodash2.default.result(_saved_views_store2.default.getActiveView(), 'id'));\n        }\n    },\n\n    /**\r\n    * every time Athena receives 'renderData' event, it re-triggers this event with budgetData on itself\r\n    */\n    handleRenderData: function handleRenderData() {\n        if (!this.props.report) {\n            return;\n        }\n        var renderedData = _summary_report_store2.default.getRenderedData();\n        var fiscalYearStartMonth = this.props.entity.get('fiscal_year_start_month');\n        var product = this.props.report.get('technical_name');\n        var xAxisLabels = [];\n        if (renderedData && !_lodash2.default.isEmpty(renderedData.lines)) {\n            var dataSets = _summary_report_store2.default.getRenderedDataSets();\n            _lodash2.default.each(dataSets, _lodash2.default.bind(function (dataSet) {\n                var label = _strings2.default.dataSetLabel(dataSet, product, _summary_report_store2.default.getState().get('currentYearPeriod'), //Issue was that state was not uptodate\n                _summary_report_store2.default.getState().get('currentYearAmount'), fiscalYearStartMonth, {\n                    proration: _summary_report_store2.default.getState().get('proration'),\n                    projections: _summary_report_store2.default.getState().get('athenaState').get('projections')\n                });\n                xAxisLabels.push(label);\n            }, this));\n        }\n        if (!this.isFirstRenderComplete) {\n            this.isFirstRenderComplete = true;\n            this.props.onLoaded(true /*isTriggeredFromSummaryReport*/);\n        }\n        this.setState({ xAxisLabels: xAxisLabels });\n    },\n\n    /**\r\n    * every time Athena's state is changed, this function is called\r\n    */\n    handleDefaultStateChange: function handleDefaultStateChange() {\n        if (_lodash2.default.includes(this.props.entity.get('feature_permissions'), 'linkage_view')) {\n            var versusView = this.state.store.get('versusView');\n            var includedLedgerTypes = versusView ? versusView.get('trees').toJS() : [this.state.store.get('accountType')];\n            var selectedNodes = this.athena.budgetData.minimalSelectedNodeList(includedLedgerTypes);\n            var nodesForLinkage = this.state.store.get('nodesForLinkage');\n            var masks = this.state.store.get('masksForLinkage');\n            var linkageNodes = (0, _transactions_utils.coaNodesToLinkageNodes)(selectedNodes, nodesForLinkage);\n            var maskNodesForLinkage = [];\n            if (!_lodash2.default.isEmpty(masks)) {\n                maskNodesForLinkage = (0, _transactions_utils.getMaskNodesForLinkage)(masks, nodesForLinkage);\n            }\n            this.setState({\n                linkageNodes: linkageNodes\n            });\n            this.setState({\n                maskNodesForLinkage: maskNodesForLinkage\n            });\n        } else {\n            this.setState({\n                accountCodeQuery: this.athena.state.getLeafAccountCodeTreeMap()\n            });\n        }\n        var changingProps = _summary_report_store2.default.generateSummaryReportState();\n        this.props.onStateChange(changingProps);\n    },\n    handleAthenaInitialized: function handleAthenaInitialized() {\n        this.setState({\n            // Only mark report as initialized if data sets have been loaded.\n            initialized: !this.props.report.dataSets.isEmpty(),\n            headerOptions: {\n                athenaState: this.athena.state,\n                onMakeDefaultReport: this.props.onMakeDefaultReport,\n                report: this.props.report,\n                renderedReport: this.props.renderedReport,\n                router: this.athena.router,\n                budgetData: this.athena.budgetData,\n                entity: this.props.entity,\n                extraFiles: this.athena.report.extra_files,\n                filterMenu: this.athena.filterMenu,\n                downloadModel: new _download2.default({ entity: this.props.entity, athena: this.athena }),\n                embedded: this.props.embedded,\n                showBudget101: !this.props.embedded && this.props.entity.get('budget_101')\n            }\n        });\n    },\n    handleAthenaLoaded: function handleAthenaLoaded() {\n        if (this._isMounted) {\n            this.setState({ athenaLoaded: true });\n        }\n    },\n    handleAthenaError: function handleAthenaError(err) {\n        this.setState({ loading: false, error: err });\n    },\n    handleLegendSelect: function handleLegendSelect(lineId) {\n        var graph = this.refs.graph.graph;\n        graph.unhighlightSeries(lineId);\n        _summary_report_actions2.default.drill(lineId);\n    },\n    handleLegendMore: function handleLegendMore() {\n        this.athena.state.expandMore();\n    },\n    handleLegendLess: function handleLegendLess() {\n        this.athena.state.collapseMore();\n    },\n    handleLegendSortChange: function handleLegendSortChange(sortId) {\n        this.athena.state.set('legendSort', sortId);\n    },\n    handleLegendItemEnter: function handleLegendItemEnter(lineId) {\n        this.events.trigger('highlightNode', lineId);\n        var graph = this.refs.graph.graph;\n        if (!graph.legendOver) {\n            graph.legendOver = true;\n            graph.highlightSeries(lineId);\n        }\n    },\n    showWelcome: function showWelcome() {\n        // this.props.embedded is tied to isControlPanel.\n        // isEmbed() is checking to see if url has 'embed=table' etc.\n        return !(0, _embed_utils.isEmbed)() && !this.props.embedded && !_cookiesJs2.default.get('transparency_visited');\n    },\n    handleLegendItemLeave: function handleLegendItemLeave(lineId) {\n        this.events.trigger('highlightNode');\n        var graph = this.refs.graph.graph;\n        if (graph.legendOver) {\n            graph.legendOver = false;\n            graph.unhighlightSeries(lineId);\n        }\n    },\n    handleRetryClick: function handleRetryClick() {\n        this.athena.budgetData.triggerSelectionChange();\n        _report_actions2.default.hasValidData();\n    },\n    entityHasWelcomeDisabled: function entityHasWelcomeDisabled() {\n        return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1;\n    },\n    render: function render() {\n        var retryButton = _react2.default.createElement(\"button\", { type: \"button\", className: \"ui-button primary small js-button\", onClick: this.handleRetryClick, key: \"retry-button\" }, \"Retry\");\n        var linkedYears = _lodash2.default.map(this.props.report.dataSets.models, function (reportModel) {\n            return reportModel.attributes.year;\n        });\n        var welcomeModal = this.state.initialized && this.state.showWelcome && !this.entityHasWelcomeDisabled() ? _react2.default.createElement(_summary_welcome2.default, { entity: this.props.entity, showBudget101: !this.props.embedded ? this.props.entity.get('budget_101') : false }) : null;\n        var howToModal = this.state.initialized && this.state.showHowTo ? _react2.default.createElement(_howto2.default, null) : null;\n        var downloadModal = this.state.initialized && this.state.showDownloadModal ? _react2.default.createElement(_download4.default, { athenaState: this.state.athenaState, budgetData: this.athena && this.athena.budgetData, breakdown: this.state.store.get('breakdown'), entity: this.props.entity }) : null;\n        var budget101Modal = this.state.initialized && this.state.showBudget101 ? _react2.default.createElement(_budget2.default, null) : null;\n        var tosModal = this.state.initialized && this.state.showTOS ? _react2.default.createElement(_termsOfService2.default, null) : null;\n        var feedbackModal = this.state.showFeedback ? _react2.default.createElement(_feedback2.default, { entityDisplayName: this.props.entity.get('display_name'), showError: this.state.feedbackError, errorMessage: this.state.feedbackErrorMessage, feedbackSaving: this.state.feedbackSaving, reportId: this.props.report.id, entityId: this.props.entity.get('entity_id') }) : null;\n        var athenaState = this.athena && this.athena.state;\n        var isHighlightingEnabled = this.state.store.get('highlighting') !== true ? false : this.state.store.get('highlighting');\n        var highlightingVariance = this.state.store.get('highlightingVariance');\n        var isProjectionsEnabled = athenaState && athenaState.get('projections') || false;\n        var projectionType = athenaState && athenaState.get('projectionType') || 'auto_year_avg';\n        var sourceDatasets = athenaState && athenaState.get('report').get('source_datasets');\n        var projectionsErrors = (0, _projections_utils.getErrorsByProjectionTypesFromSourceDatasets)(sourceDatasets);\n        var embedMainContentStyle = (0, _embed_utils.isEmbed)() ? { paddingLeft: '0px' } : {};\n        var embedReportStyle = (0, _embed_utils.isEmbed)() ? { paddingTop: '10px' } : {};\n        var embedTableStyle = (0, _embed_utils.hideTable)() ? { display: 'none' } : {};\n        var embedVizStyle = (0, _embed_utils.hideViz)() ? { display: 'none' } : {};\n        var isBalanceSheetReport = this.props.report && this.props.report.attributes && this.props.report.attributes.report_type === 'balance';\n        return _react2.default.createElement(\"div\", { className: \"report__container report_summary\", style: embedReportStyle }, !this.props.hasValidData ? _react2.default.createElement(_global_alert2.default, { title: \"Unable to request data from the server\", message: \"Please try again in a moment.\", buttons: [retryButton] }) : null, _react2.default.createElement(\"div\", { ref: \"panels\" }, !(0, _embed_utils.isEmbed)() && _react2.default.createElement(Ovid.MainPanel, { ref: \"sidebar\" }, _react2.default.createElement(_sidebar2.default, { entity: this.props.entity, session: this.props.session, report: this.props.report, reports: this.props.reports, embedded: this.props.embedded, stories: this.props.stories, activeSidebar: this.props.activeSidebar, isEditingDefaultState: this.props.editingDefaultState, isNetwork: this.props.isNetwork, reportError: this.state.reportError, initialized: this.state.initialized, isControlPanel: this.props.isControlPanel }, _react2.default.createElement(_summary_report_filters_panel2.default, { accountType: this.state.store.get('accountType'), accountTypes: this.athena && this.athena.budgetData && this.athena.budgetData.visibleAccounts, versusView: this.state.store.get('versusView'), versusViews: _summary_report_store2.default.getVersusViews(), breakdown: this.state.store.get('breakdown'), breakdowns: this.athena && this.athena.state.breakdowns.toArray(), month: this.state.store.get('month'), months: this.state.store.get('months'), minYear: this.state.store.get('minYear'), maxYear: this.state.store.get('maxYear'), fiscalYearRange: this.state.store.get('fiscalYearRange'), year: this.state.store.get('year'), filterPanels: this.state.filterPanels, years: this.athena && this.athena.budgetData && this.athena.budgetData.years, athena: this.state.initialized && this.state.athenaLoaded ? this.athena : null, entity: this.props.entity, currentYearPeriod: this.state.store.get('currentYearPeriod'), reportType: this.props.report.get('technical_name') }), _react2.default.createElement(_document_list2.default, { embedded: this.props.embedded, entity: this.props.entity }), _react2.default.createElement(_filter_panel_options2.default, { entity: this.props.entity, isNetwork: this.props.isNetwork, isControlPanel: this.props.isControlPanel, scalePerCapitaEnabled: this.props.scalePerCapitaEnabled }))), this.state.store.get('isAnnotationsPanelOpen') ? _react2.default.createElement(_annotations_panel2.default, { events: this.events, annotations: this.athena.budgetData.activeAnnotations(), fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'), breakdown: this.state.store.get('breakdown') }) : null, this.state.initialized && this.state.athenaLoaded ? _react2.default.createElement(_filter_panel2.default, { filterPanels: this.state.filterPanels, budgetData: this.athena.budgetData, athenaState: this.athena.state, accountType: this.state.store.get('accountType') }) : null), this.state.initialized ? _react2.default.createElement(\"header\", null, _react2.default.createElement(_header_actions2.default, Object.assign({ embedded: this.props.embedded }, this.state, { entity: this.props.entity, report: this.props.renderedReport, reportState: this.props.reportState, isNetwork: this.props.isNetwork, showHowTo: true, showDownloadModal: true, showBudget101: !this.props.embedded ? this.props.entity.attributes.budget_101 : false, showShareMenu: this.props.renderedReport.getIn(['abilities', 'update']), session: this.props.session }))) : null, _react2.default.createElement(_header2.default, { entity: this.props.entity, isNetwork: this.props.isNetwork, headerOptions: this.state.headerOptions, report: this.props.renderedReport, reports: this.props.reports, embedded: this.props.embedded }), _react2.default.createElement(\"main\", { style: embedMainContentStyle, className: \"ui-main__content\" }, this.state.initialized ? _react2.default.createElement(_report_header2.default, Object.assign({}, this.state.headerOptions, { yAxisScale: this.state.store.get('yAxisScale'), scale: this.state.store.get('scale'), amountUnit: this.state.amountUnit, accountType: this.state.store.get('accountType'), breakdown: this.state.store.get('breakdown'), isControlPanel: this.props.isControlPanel })) : null, _react2.default.createElement(\"section\", { id: \"transparency-content\", className: \"report__section\" }, this.state.initialized && !(0, _embed_utils.hideViz)() ? _react2.default.createElement(_graphtype2.default, { graphTypes: graph.validGraphTypes, athenaState: this.athena.state }) : null, _react2.default.createElement(\"div\", { className: 'report__header_updated_on' }, isBalanceSheetReport && _react2.default.createElement(\"small\", null, \"Calculated Change in Fund Balance / Net Assets is not shown in the visualization\")), _react2.default.createElement(\"div\", { className: \"report__graph-wrapper\", style: embedVizStyle }, _react2.default.createElement(\"h3\", null, \"Visualization\"), _react2.default.createElement(\"div\", { id: \"template-modal-recoverable-error\" }), this.props.report.dataSets.isEmpty() || !this.props.hasValidData ? _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No data available for this report.\"), this.props.embedded && this.props.report.canEdit() ? _react2.default.createElement(\"span\", null, \"Please \", _react2.default.createElement(\"a\", { onClick: _report_actions2.default.openEditData }, \"choose\"), \" which data sets to include in this report.\") : null) : null, _react2.default.createElement(_summary_graph2.default, { ref: \"graph\", isBalanceSheetReport: isBalanceSheetReport, showAnnotations: this.state.store.get('isAnnotationsPanelOpen'), loading: this.state.store.get('loading'), graphLoading: this.state.store.get('graphLoading'), shouldRenderGraph: this.state.initialized && this.state.athenaLoaded, xAxisLabels: this.state.xAxisLabels, xAxisTitle: this.props.renderedReport.getIn(['properties', 'fiscal_year_text']), reportEvents: this.events, budgetData: this.athena && this.athena.budgetData, entity: this.props.entity, athenaState: this.athena && this.athena.state, router: this.props.router, yAxisScale: this.state.yAxisScale, overlay: this.state.store.get('overlay'), metricData: this.state.store.get('metricData'), accountType: this.state.store.get('accountType'), projections: isProjectionsEnabled, projectionType: projectionType, projectionsErrors: projectionsErrors }), this.state.store.get('loading') && !this.props.report.dataSets.isEmpty() ? _react2.default.createElement(\"div\", { className: \"ui-loader\" }, _react2.default.createElement(\"div\", { className: \"ui-loading\" }), _react2.default.createElement(\"div\", { className: \"ui-loader__message\" }, _react2.default.createElement(\"small\", null, \"Loading\"), _react2.default.createElement(\"strong\", null, \"Report Data\"))) : null, this.state.error ? _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, this.state.error.message)) : null), this.state.initialized && this.state.athenaLoaded && !(0, _embed_utils.hideViz)() ? _react2.default.createElement(_legend2.default, { lines: _summary_report_store2.default.getRenderedData(true).lines, isExpanded: this.athena.state.legendExpanded(), sortBy: this.athena.state.get('legendSort'), onItemClick: this.handleLegendSelect, onItemEnter: this.handleLegendItemEnter, onItemLeave: this.handleLegendItemLeave, onShowMore: this.handleLegendMore, onShowLess: this.handleLegendLess, annotationCount: this.athena.budgetData.activeAnnotations().length, onSortChange: this.handleLegendSortChange, entity: this.props.entity }) : null), !this.state.store.get('loading') && this.athena ? _react2.default.createElement(\"section\", { className: \"table__wrapper\", style: embedTableStyle }, _react2.default.createElement(\"h3\", null, \"Data\"), _lodash2.default.includes(this.props.entity.get('feature_permissions'), 'transaction_linkage') ? _react2.default.createElement(_datagrid_container_component2.default, { locale: this.props.report.attributes.locale, isBalanceSheetReport: isBalanceSheetReport, athenaState: this.athena.state, embedded: this.props.embedded, entity: this.props.entity, isPublic: !this.props.embedded, onOpenSettingsPanel: this.props.onOpenSettingsPanel, query: this.state.accountCodeQuery, linkageNodes: this.state.linkageNodes, maskNodesForLinkage: this.state.maskNodesForLinkage, report: this.props.report.associatedReport, canEdit: this.props.report.canEdit(), linkedYears: linkedYears, reportEvents: this.events, expandedNodes: this.state.store.get('expandedNodes').toJSON(), height: summaryTableHeight, accountType: this.state.store.get('accountType'), overlay: this.state.store.get('overlay'), scale: this.state.store.get('scale'), metricData: this.state.store.get('metricData'), highlighting: isHighlightingEnabled, highlightingVariance: highlightingVariance, projections: isProjectionsEnabled, projectionType: projectionType }) : _react2.default.createElement(_summary_table2.default, { isBalanceSheetReport: isBalanceSheetReport, expandedNodes: this.state.store.get('expandedNodes').toJSON(), fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'), athenaState: this.athena.state, yAxisScale: this.state.yAxisScale, reportEvents: this.events, height: summaryTableHeight, accountType: this.state.store.get('accountType'), overlay: this.state.store.get('overlay'), scale: this.state.store.get('scale'), metricData: this.state.store.get('metricData'), highlighting: isHighlightingEnabled, highlightingVariance: highlightingVariance, projections: isProjectionsEnabled, projectionType: projectionType })) : null, !this.props.isControlPanel && !this.props.embedded ? _react2.default.createElement(_footer2.default, { ref: \"footer\", entity: this.props.entity }) : null, welcomeModal, howToModal, feedbackModal, downloadModal, budget101Modal, tosModal));\n    }\n});\nvar Athena = og.View.extend({\n    el: 'body',\n    initialize: function initialize(options) {\n        this.options = options;\n        this.entity = options.entity;\n        this.report = options.report;\n        this.reportParams = this.lastParams = options.reportParams;\n        this.state = _summary_report_store2.default.getState().get('athenaState');\n        this.state.set('mounted', true);\n        /**\r\n        * This function listens to the athena_state event 'renderData'\r\n        */\n        this.state.on('renderData', function () {\n            this.trigger('renderData', this.state, this.budgetData);\n            this.trigger('stateChange', _summary_report_store2.default.hashState());\n            var downloadButtons = this.$('#template-download_menu > .ui-dropdown');\n            if (this.budgetData.hasAggregations()) {\n                this.recoverableErrorModal.close();\n                downloadButtons.removeClass('disabled');\n            } else {\n                downloadButtons.addClass('disabled');\n            }\n        }, this);\n        this.listenTo(this.state, 'error', function (err) {\n            this.state.pauseRendering();\n            this.trigger('error', err);\n        });\n        /**\r\n        * Athena created backbone router\r\n        */\n        this.router = new _router2.default({\n            state: this.state\n        });\n        /**\r\n        * this function is called whenever the Backbone router updates the pushState in the browser,\r\n        */\n        this.listenTo(this.router, 'change:params', function routerParamsChanged(newParams) {\n            if (!this.report.isNew()) {\n                this.lastParams = newParams;\n                /**\r\n                * see report_view.setReportParams, which calls React's Routes (routes.js) handleRouteChange\r\n                */\n                options.onParamsChange(newParams);\n            }\n        });\n        this.recoverableErrorModal = new _recoverable_error2.default({});\n        this.render();\n    },\n    unmount: function unmount() {\n        this.state.set('mounted', false);\n    },\n    renderPackage: function renderPackage() {\n        var budgetData = this.budgetData = _summary_report_store2.default.getState().get('budgetData');\n        this.listenTo(this.budgetData, 'changeDataSets', function () {\n            this.trigger('dataSetChange', this.budgetData.dataSets);\n        }, this);\n        this.trigger('initialized');\n        this.render();\n        budgetData.on('aggregation', function (aggregations) {\n            // Always replace our expansion state with minimal expansions\n            _summary_report_actions2.default.summarySetExpandedNodes(aggregations.expanded_nodes, true);\n            this.trigger('loaded');\n        }, this);\n        // This changes the athenaState\n        this.state.changeProduct(this.report.toJSON(), !this.report.isNew() ? { hash: (0, _router.parseParameters)(this.reportParams) } : null);\n    },\n    updateDataSets: function updateDataSets(dataSets) {\n        if (!this.budgetData) {\n            return;\n        }\n        dataSets.forEach(function (dataSet) {\n            return dataSet.label = dataSet.name;\n        });\n        this.report.dataSets.reset(dataSets);\n        this.budgetData.dataSets = dataSets;\n        this.budgetData.trigger('changeDataSets');\n        this.state.trigger('renderData');\n    },\n    updateCoaMask: function updateCoaMask() {\n        this.trigger('coaMaskChange');\n        this.state.trigger('renderData');\n    },\n\n    /**\r\n    * this is called from SummaryReport.componentWillReceiveProps\r\n    */\n    updateParams: function updateParams(params) {\n        if (this.lastParams && this.lastParams === params) {\n            this.lastParams = null;\n            return;\n        }\n        var parsedParams = (0, _router.parseParameters)(params);\n        this.state.changeState(parsedParams);\n        _summary_report_actions2.default.getAggregations();\n    }\n});\nexports.default = SummaryReport;\n\n/***/ }),\n/* 1486 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _breadcrumbs = __webpack_require__(1487);\n\nvar _breadcrumbs2 = _interopRequireDefault(_breadcrumbs);\n\nvar _title = __webpack_require__(1488);\n\nvar _title2 = _interopRequireDefault(_title);\n\nvar _report_description = __webpack_require__(522);\n\nvar _report_description2 = _interopRequireDefault(_report_description);\n\nvar _report_updated_info = __webpack_require__(524);\n\nvar _report_updated_info2 = _interopRequireDefault(_report_updated_info);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _embed_utils = __webpack_require__(71);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportHeader = (0, _createReactClass2.default)({\n    displayName: 'ReportHeader',\n\n    propTypes: {\n        isControlPanel: _propTypes2.default.bool,\n        athenaState: _propTypes2.default.object,\n        budgetData: _propTypes2.default.object,\n        yAxisScale: _propTypes2.default.object,\n        scale: _propTypes2.default.object,\n        amountUnit: _propTypes2.default.string\n    },\n    render: function render() {\n        var backClass = (0, _classnames2.default)('ui-button', 'icon-left-1', 'small', {\n            'disabled': !this.props.router.backEnabled()\n        });\n        var resetClass = (0, _classnames2.default)('ui-button', 'icon-rotateleft-1', 'small', {\n            'disabled': !this.props.router.resetEnabled()\n        });\n        var breakdownTree = void 0;\n        var budgetData = this.props.budgetData;\n        // Find the breakdown tree which will be used to build the breadcrumbs history.\n        // If breaking down by account types or budget data is not laoded, no tree\n        // will be provided causing the breadcrumbs history to be disabled.\n        if (budgetData && this.props.accountType !== 'types') {\n            breakdownTree = budgetData.getBreakdownTree(this.props.breakdown);\n        }\n        var perCapitaValue = 'Look at table below for values';\n        var embedHeaderStyle = (0, _embed_utils.isEmbed)() ? { left: 0 } : {};\n        return _react2.default.createElement(\"div\", { className: \"report__header\", style: embedHeaderStyle }, !this.props.isControlPanel && !(0, _embed_utils.isEmbed)() && _react2.default.createElement(\"h1\", null, this.props.report.attributes.name), _react2.default.createElement(_report_description2.default, { report: this.props.renderedReport }), _react2.default.createElement(\"div\", { className: \"report__header_updated_on\" }, _react2.default.createElement(_report_updated_info2.default, { description: 'Updated On ', timeStamp: this.props.report.get('data_updated_at') })), _react2.default.createElement(\"div\", { className: \"page-navigation\" }, _react2.default.createElement(\"div\", { className: \"ui-button-group\" }, _react2.default.createElement(\"button\", { className: backClass, onClick: this.handleClickBack, disabled: !this.props.router.backEnabled() }, \"Back\"), _react2.default.createElement(_breadcrumbs2.default, { tree: breakdownTree })), _react2.default.createElement(\"button\", { id: \"reset_button\", className: resetClass, onClick: this.handleReset, disabled: !this.props.router.resetEnabled() }, \"Reset\")), _react2.default.createElement(_title2.default, Object.assign({}, this.props, { perCapitaValue: perCapitaValue })));\n    },\n    handleClickBack: function handleClickBack() {\n        this.props.router.back();\n    },\n    handleReset: function handleReset() {\n        _report_actions2.default.resetState();\n        _report_actions2.default.clearHistory();\n        _summary_report_actions2.default.getAggregations();\n    }\n});\nexports.default = ReportHeader;\n\n/***/ }),\n/* 1487 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Breadcrumbs = exports.Crumb = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Dropdown = Ovid.Dropdown;\n\n;\nvar Crumb = exports.Crumb = (0, _createReactClass2.default)({\n    displayName: 'Crumb',\n    getDefaultProps: function getDefaultProps() {\n        return {\n            name: 'Unknown',\n            onSelect: _lodash2.default.noop,\n            count: 0,\n            selected: false\n        };\n    },\n    render: function render() {\n        var itemClasses = (0, _classnames2.default)({\n            'nav-history__item': true,\n            'js-crumb': true,\n            'is-selected': this.props.selected\n        });\n        return _react2.default.createElement(\"button\", { className: itemClasses, onClick: this.handleSelect }, this.props.name, \" \", this.props.count > 1 ? '(' + this.props.count + ')' : null);\n    },\n    handleSelect: function handleSelect() {\n        if (!this.props.selected) {\n            this.props.onSelect();\n        }\n    }\n});\nvar Breadcrumbs = exports.Breadcrumbs = (0, _createReactClass2.default)({\n    displayName: 'Breadcrumbs',\n    getDefaultProps: function getDefaultProps() {\n        return {\n            onSelect: _lodash2.default.noop,\n            tree: null\n        };\n    },\n    render: function render() {\n        var crumbs = this.computeCrumbs();\n        return _react2.default.createElement(Dropdown, { toggleClass: \"icon-history-1 nav-history__button\", title: \"History\", hint: \"Show the drill-down history\", hintPosition: \"bottom\", disabled: crumbs.length <= 1 }, _react2.default.createElement(\"header\", { className: \"ui-dropdown__header\" }, _react2.default.createElement(\"h4\", null, \"Navigation Path\")), _react2.default.createElement(\"nav\", { className: \"nav-history\" }, this.renderCrumbItems(crumbs)));\n    },\n    handleCrumbSelect: function handleCrumbSelect(crumb) {\n        crumb.nodes.forEach(function (node) {\n            node.select();\n        });\n        _summary_report_actions2.default.getAggregations();\n    },\n    computeCrumbs: function computeCrumbs() {\n        var crumbs = [];\n        var queue = [];\n        var node = void 0;\n        var i = void 0;\n        var count = void 0;\n        var crumb = void 0;\n        if (this.props.tree) {\n            queue.push(this.props.tree);\n        }\n        while (queue.length > 0) {\n            node = queue.shift();\n            crumb = crumbs[node.depth] || (crumbs[node.depth] = { nodes: [] });\n            if (node.selected || node.partiallySelected) {\n                crumb.name = node.name;\n                crumb.nodes.push(node);\n                if (node.partiallySelected) {\n                    for (i = 0, count = node.children.length; i < count; i++) {\n                        queue.push(node.children[i]);\n                    }\n                }\n            }\n        }\n        return crumbs;\n    },\n    renderCrumbItems: function renderCrumbItems(crumbs) {\n        var lastIndex = crumbs.length - 1;\n        var categories = this.props.tree && this.props.tree.categories || [];\n        return crumbs.map(function (crumb, index) {\n            var count = crumb.nodes.length;\n            var name = count === 1 ? crumb.nodes[0].name : categories[index - 1];\n            return _react2.default.createElement(Crumb, { key: index, name: name, count: count, selected: index === lastIndex, onSelect: this.handleCrumbSelect.bind(this, crumb) });\n        }, this);\n    }\n});\nexports.default = Breadcrumbs;\n\n/***/ }),\n/* 1488 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _numeral = __webpack_require__(144);\n\nvar _numeral2 = _interopRequireDefault(_numeral);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Title = (0, _createReactClass2.default)({\n    displayName: 'Title',\n\n    propTypes: {\n        budgetData: _propTypes2.default.object,\n        yAxisScale: _propTypes2.default.object,\n        scale: _propTypes2.default.object,\n        perCapitaValue: _propTypes2.default.string,\n        amountUnit: _propTypes2.default.string\n    },\n    render: function render() {\n        var _this = this;\n\n        var titles = this.props.budgetData.titles(this.props.breakdown);\n        var primary = titles.primary;\n        var secondary = titles.secondary;\n        var yAxisScale = this.props.yAxisScale;\n        var validScale = Boolean(yAxisScale && yAxisScale.type && yAxisScale.value);\n        var scaleDescription = validScale ? yAxisScale.description : null;\n        var validNumericScale = validScale && yAxisScale.type === 'numeric';\n        var scaleValue = validNumericScale ? (0, _numeral2.default)(yAxisScale.value).format('0,0') : null;\n        scaleDescription = validNumericScale ? yAxisScale.description + ' (' + scaleValue + ')' : scaleDescription;\n        var currentScale = this.props.scale.getIn(['selected', 0]);\n        return _react2.default.createElement(\"div\", { id: \"report-drilldown-title\" }, _react2.default.createElement(\"h2\", { title: primary.partiallySelected ? '*This is a partial selection of ' + primary.name : '', className: \"page-title__primary-title js-show-filter\", id: \"primary-title\", \"data-id\": primary.breakdownId }, _react2.default.createElement(\"small\", null, \"Broken down by\"), primary.name ? primary.name + (primary.partiallySelected ? '*' : '') : ''), secondary.map(function (title) {\n            var nodeName = title.node.name + (title.node.partiallySelected ? ' ' : '');\n            return _react2.default.createElement(\"span\", { key: title.node.name, className: \"page-title__filter-tag\", \"data-id\": title.node.breakdownId, onClick: _lodash2.default.partial(_this.handleClick, title.breakdownId), \"data-hint\": title.node.partiallySelected ? 'This is a partial selection of ' + title.node.name : null, \"data-hint-position\": title.node.partiallySelected ? 'bottom' : null }, _react2.default.createElement(\"button\", { className: \"ui-button pill tiny icon-filter-1\" }, nodeName, title.node.partiallySelected ? _react2.default.createElement(\"span\", { className: \"icon-more-1\" }) : null));\n        }), currentScale !== null || yAxisScale ? _react2.default.createElement(YAxisScalePill, { scaleValue: this.props.perCapitaValue, scale: this.props.scale, amountUnit: this.props.amountUnit }) : null, false ? _react2.default.createElement(\"span\", { className: \"page-title__filter-tag\", \"data-hint\": scaleDescription, \"data-hint-position\": \"bottom\" }, _react2.default.createElement(\"button\", { className: \"ui-button pill tiny icon-dollar-1\" }, yAxisScale.name)) : null);\n    },\n    handleClick: function handleClick(breakdownId) {\n        _summary_report_actions2.default.toggleFilterPanel(breakdownId);\n    }\n});\nvar YAxisScalePill = (0, _createReactClass2.default)({\n    displayName: 'YAxisScalePill',\n\n    propTypes: {\n        amountUnit: _propTypes2.default.string.isRequired,\n        scaleValue: _propTypes2.default.string.isRequired,\n        scale: _propTypes2.default.object\n    },\n    render: function render() {\n        var amountUnit = this.props.amountUnit;\n        var amountUnitLabel = _strings2.default.amountUnitLabel(amountUnit);\n        var pillTextBody = 'Per Capita';\n        var perSomething = '';\n        var classNameForIcon = _strings2.default.pillIconToUse(amountUnit);\n        switch (amountUnit) {\n            case '$':\n                perSomething = 'per capita';\n                break;\n            case 'FTE':\n                perSomething = 'per capita';\n                break;\n        }\n        var selected = this.props.scale.getIn(['selected', 0]);\n        var state = _summary_report_store2.default.getState();\n        var selectedData = state.getIn(['metricData', 'data', selected]);\n        if (selectedData) {\n            var units = selectedData.get('units');\n            classNameForIcon = _strings2.default.pillIconToUse(units);\n            pillTextBody = 'Per ' + selectedData.get('name');\n            amountUnitLabel = selectedData.get('name');\n            perSomething = units === 'people' && amountUnitLabel ? 'per capita' : '';\n        }\n        // Note the different units are : [%, US cents/person (converted to $/person), US cents, person, incidents]\n        var dataHint = 'Amounts scaled to/by ' + amountUnitLabel + ' ' + perSomething + ' (' + this.props.scaleValue + ')';\n        // TODO the prior action `ReportActions.openAdvancedSettings` doesn't exist- do we want `openSettingsPanel`?\n        return _react2.default.createElement(\"span\", { className: \"page-title__filter-tag\", \"data-hint\": dataHint, \"data-hint-position\": \"bottom\", onClick: null /*ReportActions.openSettingsPanel*/ }, _react2.default.createElement(\"button\", { className: (0, _classnames2.default)({ 'ui-button pill tiny': true }, classNameForIcon), style: { maxWidth: '300px' } }, pillTextBody));\n    }\n});\nexports.default = Title;\n\n/***/ }),\n/* 1489 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _share_links = __webpack_require__(220);\n\nvar _share_links2 = _interopRequireDefault(_share_links);\n\nvar _shared_link_helper = __webpack_require__(221);\n\nvar _shared_link_helper2 = _interopRequireDefault(_shared_link_helper);\n\nvar _ovid = __webpack_require__(8);\n\nvar _help_menu = __webpack_require__(1490);\n\nvar _help_menu2 = _interopRequireDefault(_help_menu);\n\nvar _share_options = __webpack_require__(656);\n\nvar _share_options2 = _interopRequireDefault(_share_options);\n\nvar _create_copy_menu = __webpack_require__(1491);\n\nvar _create_copy_menu2 = _interopRequireDefault(_create_copy_menu);\n\nvar _reports = __webpack_require__(140);\n\nvar _reports2 = _interopRequireDefault(_reports);\n\nvar _TransparencyLoginButton = __webpack_require__(661);\n\nvar _TransparencyLoginButton2 = _interopRequireDefault(_TransparencyLoginButton);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar reports = new _reports2.default();\n\nvar DropDownCopyMenu = (0, _createReactClass2.default)({\n    displayName: 'DropDownCopyMenu',\n    getInitialState: function getInitialState() {\n        return {\n            existingReports: reports\n        };\n    },\n    componentWillMount: function componentWillMount() {\n        var _this = this;\n\n        reports.fetch({\n            data: _jquery2.default.param({\n                fields: 'name',\n                entity_id: this.props.entity.get('entity_id')\n            }),\n            success: function success(reports) {\n                _this.setState({\n                    existingReports: reports\n                });\n            }\n        });\n    },\n    render: function render() {\n        var _props = this.props,\n            report = _props.report,\n            reportState = _props.reportState;\n        var existingReports = this.state.existingReports;\n\n        return _react2.default.createElement(_ovid.Dropdown, { title: \"Create Copy\", position: \"align-right\", dropdownClass: \"ui-nav-bar__item create-copy-menu\", toggleClass: \"ui-button small no-color\", ignoreContentClicks: true, key: \"createCopy\" }, _react2.default.createElement(_create_copy_menu2.default, { report: report, existingReports: existingReports, reportState: reportState }));\n    }\n});\nvar HeaderActions = (0, _createReactClass2.default)({\n    displayName: 'HeaderActions',\n\n    propTypes: {\n        entity: _propTypes2.default.object.isRequired,\n        headerOptions: _propTypes2.default.object,\n        showHowTo: _propTypes2.default.bool,\n        showBudget101: _propTypes2.default.bool,\n        showShareMenu: _propTypes2.default.bool,\n        showCreateCopyMenu: _propTypes2.default.bool,\n        isNetwork: _propTypes2.default.bool\n    },\n    componentWillMount: function componentWillMount() {\n        this.linkHelper = _shared_link_helper2.default.create(this.props.entity);\n    },\n    render: function render() {\n        var _props2 = this.props,\n            entity = _props2.entity,\n            session = _props2.session,\n            embedded = _props2.embedded,\n            isNetwork = _props2.isNetwork;\n\n        var dropdownName = embedded ? 'Download' : 'Share';\n        var canCreateReport = session && _lodash2.default.get(session.get('abilities'), ['report', 'create']);\n        return _react2.default.createElement(\"nav\", { \"aria-label\": \"Header menu\", className: \"ui-main__actions ui-nav-bar\", style: this.props.embed === 'y' ? { width: \"100%\" } : null }, !embedded && _react2.default.createElement(_TransparencyLoginButton2.default, { entityId: entity.id, transparencyUrl: gon && gon.entity && gon.entity.transparency_url }), _react2.default.createElement(_ovid.Dropdown, { title: \"Help\", position: \"align-right\", targetClass: \"ui-dropdown__target help-menu\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small ghost no-color\", key: \"help\" }, _react2.default.createElement(_help_menu2.default, { showHowTo: this.props.showHowTo, showBudget101: this.props.showBudget101, showWelcome: !embedded, entity: entity })), _react2.default.createElement(_ovid.Dropdown, { title: dropdownName, position: \"align-right\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small no-color\", key: \"share\" }, _react2.default.createElement(_share_links2.default, { linkHelper: this.linkHelper, options: this.props.headerOptions, showShareMenu: embedded, showDownloadItems: true })), canCreateReport && !isNetwork && _react2.default.createElement(DropDownCopyMenu, { entity: entity, report: this.props.report, reportState: this.props.reportState }), embedded && this.props.showShareMenu && _react2.default.createElement(_share_options2.default, { report: this.props.report }));\n    }\n});\nexports.default = HeaderActions;\n\n/***/ }),\n/* 1490 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HelpMenu = (0, _createReactClass2.default)({\n    displayName: 'HelpMenu',\n\n    propTypes: {\n        showBudget101: _propTypes2.default.bool,\n        showHowTo: _propTypes2.default.bool,\n        entity: _propTypes2.default.object.isRequired\n    },\n    showHowTo: function showHowTo(e) {\n        e.preventDefault();\n        _report_actions2.default.showHowTo();\n    },\n    showWelcome: function showWelcome(e) {\n        e.preventDefault();\n        _report_actions2.default.showWelcomeModal();\n    },\n    showBudget101: function showBudget101(e) {\n        e.preventDefault();\n        _report_actions2.default.showBudget101();\n    },\n    showFeedback: function showFeedback(e) {\n        e.preventDefault();\n        _report_actions2.default.showFeedback();\n    },\n    entityHasWelcomeDisabled: function entityHasWelcomeDisabled() {\n        return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1;\n    },\n    render: function render() {\n        return _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, this.props.showHowTo ? _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"howto\", className: \"modal__open\", onClick: this.showHowTo }, \"How To\")) : null, this.props.showWelcome && !this.entityHasWelcomeDisabled() ? _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"welcome\", className: \"modal__open\", onClick: this.showWelcome }, \"Welcome Screen\")) : null, this.props.showBudget101 ? _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"budget101\", className: \"modal__open\", onClick: this.showBudget101 }, \"Multi-Fund Accounting 101\")) : null, _react2.default.createElement(\"li\", null, _react2.default.createElement(\"button\", { id: \"entity-feedback-help\", className: \"modal__open\", onClick: this.showFeedback }, \"Contact \", this.props.entity.get('name'))));\n    }\n});\nexports.default = HelpMenu;\n\n/***/ }),\n/* 1491 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _ovid = __webpack_require__(8);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CreateCopyMenu = function (_Component) {\n    _inherits(CreateCopyMenu, _Component);\n\n    function CreateCopyMenu() {\n        _classCallCheck(this, CreateCopyMenu);\n\n        var _this = _possibleConstructorReturn(this, (CreateCopyMenu.__proto__ || Object.getPrototypeOf(CreateCopyMenu)).apply(this, arguments));\n\n        _this.state = {\n            name: null,\n            useCurrentReportState: true,\n            copySavedViews: true,\n            invalidName: false,\n            isSubmitting: false\n        };\n        _this.handleNameChange = function (event) {\n            var name = event.target.value;\n            var invalidName = !!_this.props.existingReports.where({ name: name }).length;\n            _this.setState({\n                name: name,\n                invalidName: invalidName\n            });\n        };\n        _this.toggleSetDefaultState = function () {\n            _this.setState({\n                useCurrentReportState: !_this.state.useCurrentReportState\n            });\n        };\n        _this.toggleCopySavedViews = function () {\n            _this.setState({\n                copySavedViews: !_this.state.copySavedViews\n            });\n        };\n        _this.handleCloneReport = function () {\n            var report = _this.props.report;\n            var _this$state = _this.state,\n                invalidName = _this$state.invalidName,\n                name = _this$state.name,\n                useCurrentReportState = _this$state.useCurrentReportState,\n                copySavedViews = _this$state.copySavedViews,\n                isSubmitting = _this$state.isSubmitting;\n\n            if (invalidName || isSubmitting) {\n                return;\n            }\n            var cloneReportOptions = {\n                report: report,\n                name: name,\n                copySavedViews: copySavedViews,\n                properties: null\n            };\n            if (useCurrentReportState) {\n                cloneReportOptions.properties = _this.props.reportState;\n            }\n            _this.setState({\n                isSubmitting: true\n            });\n            _report_actions2.default.cloneReport(cloneReportOptions);\n        };\n        _this.handleFormSubmit = function (event) {\n            event.preventDefault();\n            _this.handleCloneReport();\n        };\n        _this.handleFormCancel = function () {\n            // the dropdown component does not provide a close function to its children\n            // so we do this as a hack until it does\n            document.body.click();\n        };\n        return _this;\n    }\n\n    _createClass(CreateCopyMenu, [{\n        key: 'componentDidUpdate',\n        value: function componentDidUpdate() {\n            this.refs['report-name'].focus();\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var report = this.props.report;\n            var _state = this.state,\n                name = _state.name,\n                useCurrentReportState = _state.useCurrentReportState,\n                copySavedViews = _state.copySavedViews,\n                invalidName = _state.invalidName,\n                isSubmitting = _state.isSubmitting;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-card\" }, _react2.default.createElement(\"form\", { onSubmit: this.handleFormSubmit }, _react2.default.createElement(\"div\", { className: \"ui-card__header\" }, \"Copy this report\"), _react2.default.createElement(\"div\", { className: \"ui-card__content\" }, _react2.default.createElement(\"fieldset\", { className: (0, _classnames2.default)('ui-form', 'required', {\n                    whoops: invalidName\n                }) }, _react2.default.createElement(\"label\", null, \"Report name\"), _react2.default.createElement(\"input\", { ref: \"report-name\", type: \"text\", required: true, placeholder: report.get('name') + ' (Copy)', value: name, onChange: this.handleNameChange }), invalidName ? _react2.default.createElement(\"p\", { className: \"hint whoops\" }, \"This name is already taken.\") : ''), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Use the current view as the new Default State?\"), _react2.default.createElement(_ovid.ToggleSwitch, { state: useCurrentReportState ? 'on' : 'off', onToggle: this.toggleSetDefaultState })), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Copy Saved Views with report?\"), _react2.default.createElement(_ovid.ToggleSwitch, { state: copySavedViews ? 'on' : 'off', onToggle: this.toggleCopySavedViews }))), _react2.default.createElement(\"div\", { className: \"ui-card__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-card__actions\" }, _react2.default.createElement(\"button\", { type: \"button\", className: \"ui-button ghost\", disabled: isSubmitting, onClick: this.handleFormCancel }, \"Cancel\"), _react2.default.createElement(\"button\", { type: \"submit\", className: \"ui-button primary\", disabled: !name || invalidName || isSubmitting }, isSubmitting && _react2.default.createElement(\"span\", { className: \"ui-loading_button card__actions__button__loading\" }), _react2.default.createElement(\"span\", { className: \"no-left-margin\" }, \"Copy\"))))));\n        }\n    }]);\n\n    return CreateCopyMenu;\n}(_react.Component);\n\nexports.default = CreateCopyMenu;\n\nCreateCopyMenu.propTypes = {\n    existingReports: _propTypes2.default.object.isRequired,\n    report: _propTypes2.default.object.isRequired,\n    reportState: _propTypes2.default.object.isRequired\n};\n\n/***/ }),\n/* 1492 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.GraphType = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactI18next = __webpack_require__(148);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GraphType = exports.GraphType = function (_React$Component) {\n    _inherits(GraphType, _React$Component);\n\n    function GraphType() {\n        _classCallCheck(this, GraphType);\n\n        var _this = _possibleConstructorReturn(this, (GraphType.__proto__ || Object.getPrototypeOf(GraphType)).apply(this, arguments));\n\n        _this.graphTypes = {\n            table: {\n                icon: 'ui-graphtype__table',\n                name: 'Table View'\n            },\n            line: {\n                icon: 'ui-graphtype__line',\n                name: 'Line Graph'\n            },\n            stacked: {\n                icon: 'ui-graphtype__stacked',\n                name: 'Stacked Graph'\n            },\n            percentage: {\n                icon: 'ui-graphtype__percentage',\n                name: 'Percentage Graph'\n            },\n            pie: {\n                icon: 'ui-graphtype__pie',\n                name: 'Pie Graph'\n            },\n            bar: {\n                icon: 'ui-graphtype__bar',\n                name: 'Bar Graph'\n            },\n            map: {\n                icon: 'ui-graphtype__map',\n                name: 'Map'\n            }\n        };\n        _this.handleChangeGraphType = function (id) {\n            _this.props.athenaState.set('graphType', id);\n        };\n        return _this;\n    }\n\n    _createClass(GraphType, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var t = this.props.t;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-graphtype ui-button-group\" }, this.props.graphTypes.map(function (id) {\n                var graphType = _this2.graphTypes[id];\n                var classes = {};\n                var name = t('strings.graph.types.' + id);\n                classes[graphType.icon] = true;\n                classes['ui-button'] = true;\n                //find a class that has a graphtype get method, pass in a function\n                classes['is-selected'] = id === _this2.props.athenaState.get('graphType');\n                return _react2.default.createElement(\"button\", { id: 'wd-change-graph-type_' + id, key: id, ref: id, className: (0, _classnames2.default)(classes), onClick: _this2.handleChangeGraphType.bind(_this2, id), \"data-hint\": name, \"data-hint-position\": \"bottom\" }, _react2.default.createElement(\"span\", { className: \"ui-graphtype__icon\", \"aria-label\": 'Switch to ' + name }));\n            }));\n        }\n    }]);\n\n    return GraphType;\n}(_react2.default.Component);\n\nGraphType.propTypes = {\n    athenaState: _propTypes2.default.object.isRequired,\n    graphTypes: _propTypes2.default.array.isRequired\n};\nvar TranslatedGraphType = (0, _reactI18next.translate)('report', { wait: true })(GraphType);\nTranslatedGraphType.contextTypes = {\n    i18n: _propTypes2.default.object\n};\nexports.default = TranslatedGraphType;\n\n/***/ }),\n/* 1493 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar FilterPanelOptions = function (_React$Component) {\n    _inherits(FilterPanelOptions, _React$Component);\n\n    function FilterPanelOptions() {\n        _classCallCheck(this, FilterPanelOptions);\n\n        return _possibleConstructorReturn(this, (FilterPanelOptions.__proto__ || Object.getPrototypeOf(FilterPanelOptions)).apply(this, arguments));\n    }\n\n    _createClass(FilterPanelOptions, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                entity = _props.entity,\n                isControlPanel = _props.isControlPanel,\n                isNetwork = _props.isNetwork,\n                scalePerCapitaEnabled = _props.scalePerCapitaEnabled;\n\n            var summaryReportState = _summary_report_store2.default.getState();\n            var toggleState = summaryReportState.get('yAxisScale') ? 'on' : 'off';\n            var toggleLabel = summaryReportState.get('yAxisScale') ? 'Scale by per capita' : 'Don\\'t scale amounts';\n            var disabled = !entity.get('population');\n            var onToggle = disabled ? null : function () {\n                return _summary_report_actions2.default.togglePerCapitaScale();\n            };\n            var yAxisScaleToggle = _lodash2.default.includes(entity.get('feature_permissions'), 'metric_data') || !isControlPanel && disabled;\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Options\"), isControlPanel && !isNetwork && _react2.default.createElement(\"div\", { className: \"filter_panel_option\" }, _react2.default.createElement(\"div\", { className: \"ui-form\" }, _react2.default.createElement(Ovid.ToggleSwitch, { size: \"small\", state: _report_view_store2.default.getAuditModeEnabled() ? 'on' : 'off', onToggle: _report_actions2.default.toggleAuditMode }, \"Account Codes\"))), scalePerCapitaEnabled && !yAxisScaleToggle ? _react2.default.createElement(\"div\", { className: \"filter_panel_option\" }, _react2.default.createElement(\"div\", { className: \"ui-form\" }, _react2.default.createElement(Ovid.ToggleSwitch, { size: \"small\", state: toggleState, onToggle: onToggle }, toggleLabel))) : null);\n        }\n    }]);\n\n    return FilterPanelOptions;\n}(_react2.default.Component);\n\nexports.default = FilterPanelOptions;\n\nFilterPanelOptions.propTypes = {\n    entity: _propTypes2.default.object.isRequired,\n    isNetwork: _propTypes2.default.bool,\n    isControlPanel: _propTypes2.default.bool,\n    scalePerCapitaEnabled: _propTypes2.default.bool\n};\n\n/***/ }),\n/* 1494 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _annotations_button = __webpack_require__(1495);\n\nvar _annotations_button2 = _interopRequireDefault(_annotations_button);\n\nvar _legend_item = __webpack_require__(1496);\n\nvar _legend_item2 = _interopRequireDefault(_legend_item);\n\nvar _legend_more_button = __webpack_require__(1497);\n\nvar _legend_more_button2 = _interopRequireDefault(_legend_more_button);\n\nvar _legend_sort = __webpack_require__(1498);\n\nvar _legend_sort2 = _interopRequireDefault(_legend_sort);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Legend = (0, _createReactClass2.default)({\n    displayName: 'Legend',\n\n    propTypes: {\n        lines: _propTypes2.default.array.isRequired,\n        isExpanded: _propTypes2.default.bool,\n        sortBy: _propTypes2.default.string,\n        onItemClick: _propTypes2.default.func,\n        onItemEnter: _propTypes2.default.func,\n        onItemLeave: _propTypes2.default.func,\n        onSortChange: _propTypes2.default.func\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            onItemClick: _lodash2.default.noop,\n            onItemEnter: _lodash2.default.noop,\n            onItemLeave: _lodash2.default.noop,\n            onSortChange: _lodash2.default.noop\n        };\n    },\n    render: function render() {\n        var singleRow = _lodash2.default.size(this.props.lines) === 1;\n        var items = this.props.lines.map(function (line) {\n            return _react2.default.createElement(_legend_item2.default, { key: line.id, line: line, color: og.colorIntTohtmlRGB(line.color), childless: line.childless && singleRow || line.ungrouped, onClick: _lodash2.default.partial(this.props.onItemClick, line.id), onMouseEnter: _lodash2.default.partial(this.props.onItemEnter, line.id), onMouseLeave: _lodash2.default.partial(this.props.onItemLeave, line.id) });\n        }, this);\n        var hasMore = _lodash2.default.some(this.props.lines, { id: '_moreLine' });\n        return _react2.default.createElement(\"div\", { className: \"report__legend-wrapper\", id: \"legend\" }, _react2.default.createElement(_annotations_button2.default, { annotationCount: this.props.annotationCount }), _react2.default.createElement(_legend_sort2.default, { selection: this.props.sortBy, onSelect: this.props.onSortChange }), _react2.default.createElement(\"div\", { className: \"legend__items\" }, items, _react2.default.createElement(_legend_more_button2.default, { ref: \"moreButton\", hasMore: hasMore, isExpanded: this.props.isExpanded, onShowMore: this.props.onShowMore, onShowLess: this.props.onShowLess })));\n    },\n    handleTableLinkClick: function handleTableLinkClick() {\n        var duration = 800;\n        var scrollPadding = 56;\n        var tableOffsetTop = (0, _jquery2.default)('.js-table-container').offset().top;\n        var reportOffsetTop = (0, _jquery2.default)('.js-report-container').offset().top;\n        (0, _jquery2.default)('html, body').animate({\n            scrollTop: tableOffsetTop - reportOffsetTop - scrollPadding\n        }, duration);\n    }\n});\nexports.default = Legend;\n\n/***/ }),\n/* 1495 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n;\n\nvar AnnotationsButton = function (_React$Component) {\n    _inherits(AnnotationsButton, _React$Component);\n\n    function AnnotationsButton() {\n        _classCallCheck(this, AnnotationsButton);\n\n        return _possibleConstructorReturn(this, (AnnotationsButton.__proto__ || Object.getPrototypeOf(AnnotationsButton)).apply(this, arguments));\n    }\n\n    _createClass(AnnotationsButton, [{\n        key: 'render',\n        value: function render() {\n            if (!this.props.annotationCount) {\n                return null;\n            }\n            var plural = this.props.annotationCount > 1;\n            return _react2.default.createElement(\"a\", { className: \"legend__item legend__annotations-button  wd-show-annotations\", onClick: _report_actions2.default.openAnnotationsPanel }, _react2.default.createElement(\"span\", { className: \"icon-annotation-1\" }), _react2.default.createElement(\"span\", { className: \"legend__item__text\" }, _react2.default.createElement(\"strong\", null, this.props.annotationCount, \" Note\", plural ? 's' : null), \" in this view\"));\n        }\n    }]);\n\n    return AnnotationsButton;\n}(_react2.default.Component);\n\n;\nexports.default = AnnotationsButton;\n\n/***/ }),\n/* 1496 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar LegendItem = (0, _createReactClass2.default)({\n    displayName: 'LegendItem',\n\n    propTypes: {\n        line: _propTypes2.default.object.isRequired,\n        color: _propTypes2.default.string,\n        childless: _propTypes2.default.bool,\n        onClick: _propTypes2.default.func,\n        onMouseEnter: _propTypes2.default.func,\n        onMouseLeave: _propTypes2.default.func\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            onClick: _lodash2.default.noop,\n            onMouseEnter: _lodash2.default.noop,\n            onMouseLeave: _lodash2.default.noop\n        };\n    },\n    render: function render() {\n        var itemClasses = (0, _classnames2.default)({\n            legend__item: true,\n            childless: this.props.childless\n        });\n        var name = _strings2.default.nodeName(this.props.line);\n        return _react2.default.createElement(\"button\", { id: 'legend_' + this.props.line.id, className: itemClasses, style: { color: this.props.color }, title: name, \"aria-label\": 'Filter visualization by ' + name, onClick: this.handleClick, onMouseEnter: this.props.onMouseEnter, onMouseLeave: this.props.onMouseLeave }, _react2.default.createElement(\"div\", { className: \"legend__item__decorator\", style: { background: this.props.color } }), _react2.default.createElement(\"span\", { className: \"legend__item__text\" }, name));\n    },\n    handleClick: function handleClick(e) {\n        e.preventDefault();\n        // Only emit a click event if this legend item has children.\n        if (!this.props.childless) {\n            this.props.onClick();\n        }\n    }\n});\nexports.default = LegendItem;\n\n/***/ }),\n/* 1497 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar LegendMoreButton = (0, _createReactClass2.default)({\n    displayName: 'LegendMoreButton',\n\n    propTypes: {\n        hasMore: _propTypes2.default.bool,\n        isExpanded: _propTypes2.default.bool,\n        onShowMore: _propTypes2.default.func,\n        onShowLess: _propTypes2.default.func\n    },\n    render: function render() {\n        if (!this.props.hasMore && !this.props.isExpanded) {\n            return null;\n        }\n        return _react2.default.createElement(\"div\", { className: \"legend__button-wrapper\" }, this.props.hasMore ? _react2.default.createElement(\"button\", { className: \"ui-button small wd-legend-show-more\", onClick: this.props.onShowMore }, \"Show More\") : null, this.props.isExpanded ? _react2.default.createElement(\"button\", { className: \"ui-button small wd-legend-show-fewer\", onClick: this.props.onShowLess }, \"Show Fewer\") : null);\n    }\n});\nexports.default = LegendMoreButton;\n\n/***/ }),\n/* 1498 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SortItemFactories = {\n    alpha: function alpha() {\n        return _react2.default.createElement(\"span\", { className: \"wd-alpha-sort\" }, \"A to Z\");\n    },\n    coa: function coa() {\n        return _react2.default.createElement(\"span\", { className: \"wd-coa-sort\" }, \"By Chart of Accounts\");\n    },\n    desc: function desc() {\n        return _react2.default.createElement(\"span\", { className: \"wd-desc-sort\" }, \"Large to Small\");\n    },\n    asc: function asc() {\n        return _react2.default.createElement(\"span\", { className: \"wd-asc-sort\" }, \"Small to Large\");\n    }\n};\nvar SortItemOrder = ['alpha', 'coa', 'desc', 'asc'];\n\nvar LegendSort = (0, _createReactClass2.default)({\n    displayName: 'LegendSort',\n\n    propTypes: {\n        selection: _propTypes2.default.string,\n        onSelect: _propTypes2.default.func\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            selection: _lodash2.default.head(SortItemOrder),\n            onSelect: _lodash2.default.noop\n        };\n    },\n    render: function render() {\n        var selection = this.props.selection;\n\n        var items = SortItemOrder.map(function (sortId) {\n            return _react2.default.createElement(\"li\", { key: sortId }, _react2.default.createElement(\"a\", { className: selection === sortId ? 'active' : '', onClick: this.handleClick.bind(this, sortId) }, SortItemFactories[sortId]()));\n        }, this);\n        var currentSort = SortItemFactories[selection]();\n        return _react2.default.createElement(\"div\", { className: \"legend__sort\" }, _react2.default.createElement(Ovid.Dropdown, { title: currentSort, toggleClass: \"legend__sort__target wd-legend-toggle\", label: \"Sort\" }, _react2.default.createElement(\"header\", { className: \"ui-dropdown__header\" }, _react2.default.createElement(\"h4\", null, \"Sort by\")), _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list wd-legend-options\" }, items)));\n    },\n    handleClick: function handleClick(sortId) {\n        this.props.onSelect(sortId);\n    }\n});\nexports.default = LegendSort;\n\n/***/ }),\n/* 1499 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    downloadUrls: {\n        csv: '/download/csv.csv',\n        table: '/download/table_image.png',\n        graph: '/download/image.png'\n    },\n    downloadCsv: function downloadCsv(data) {\n        this.createAndSubmitForm(this.downloadUrls.csv, data);\n    },\n    createAndSubmitForm: function createAndSubmitForm(downloadUrl, data) {\n        var newForm = this.createForm(downloadUrl, data);\n        newForm.appendTo('body').submit().remove();\n    },\n    createForm: function createForm(downloadUrl, data) {\n        var newForm = (0, _jquery2.default)('<form>', {\n            action: downloadUrl,\n            method: 'POST'\n        });\n        var entity = this.get('entity');\n        newForm.append((0, _jquery2.default)('<input>', {\n            name: 'entity',\n            value: entity.get('entity_id'),\n            type: 'hidden'\n        }));\n        var renderedReport = _report_view_store2.default.getRenderedReport();\n        newForm.append((0, _jquery2.default)('<input>', {\n            name: 'report_type',\n            value: renderedReport.get('name'),\n            type: 'hidden'\n        }));\n        _lodash2.default.each(data, function (value, key) {\n            newForm.append((0, _jquery2.default)('<input>', {\n                name: key,\n                value: value,\n                type: 'hidden'\n            }));\n        });\n        return newForm;\n    }\n});\n\n/***/ }),\n/* 1500 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (textStyle, text) {\n    var span = measureSpan;\n    var style = span.style;\n    if (textStyle.fontSize) {\n        style.fontSize = textStyle.fontSize;\n    }\n    if (textStyle.fontFamily) {\n        style.fontFamily = textStyle.fontFamily;\n    }\n    document.body.appendChild(span);\n    span.innerHTML = text.replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1<br>$2');\n    var bounds = span.getBoundingClientRect();\n    return [bounds.right - bounds.left, bounds.bottom - bounds.top];\n};\n\nvar measureSpan = document.createElement('measurespan');\nmeasureSpan.style.cssText = 'position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1.2';\n\n;\n\n/***/ }),\n/* 1501 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _summary_pie_slider = __webpack_require__(533);\n\nvar _summary_pie_slider2 = _interopRequireDefault(_summary_pie_slider);\n\nvar _graph = __webpack_require__(667);\n\nvar graph = _interopRequireWildcard(_graph);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _summary_tooltip = __webpack_require__(532);\n\nvar _summary_tooltip2 = _interopRequireDefault(_summary_tooltip);\n\nvar _series_tooltip = __webpack_require__(1502);\n\nvar _series_tooltip2 = _interopRequireDefault(_series_tooltip);\n\nvar _single_point_tooltip = __webpack_require__(1503);\n\nvar _single_point_tooltip2 = _interopRequireDefault(_single_point_tooltip);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _event_observer_mixin = __webpack_require__(141);\n\nvar _event_observer_mixin2 = _interopRequireDefault(_event_observer_mixin);\n\nvar _mini_loader = __webpack_require__(536);\n\nvar _mini_loader2 = _interopRequireDefault(_mini_loader);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SummaryGraph = (0, _createReactClass2.default)({\n    displayName: 'SummaryGraph',\n\n    mixins: [_event_observer_mixin2.default],\n    propTypes: {\n        isBalanceSheetReport: _propTypes2.default.bool,\n        loading: _propTypes2.default.bool.isRequired,\n        shouldRenderGraph: _propTypes2.default.bool,\n        xAxisLabels: _propTypes2.default.array,\n        reportEvents: _propTypes2.default.object,\n        budgetData: _propTypes2.default.object,\n        entity: _propTypes2.default.object,\n        athenaState: _propTypes2.default.object,\n        router: _propTypes2.default.object,\n        yAxisScale: _propTypes2.default.object,\n        overlay: _propTypes2.default.object,\n        metricData: _propTypes2.default.object,\n        projections: _propTypes2.default.bool\n    },\n    render: function render() {\n        var _this = this;\n\n        var graphType = this.props.athenaState ? this.props.athenaState.get('graphType') : '';\n        var tip = this.state.singleTooltip;\n        var unit = _summary_report_store2.default.getReportAmountType();\n        var items = _typeof(this.props.xAxisLabels) === 'object' ? _lodash2.default.map(this.props.xAxisLabels, function (year, index) {\n            return { key: index.toString(), value: year };\n        }) : []; //defaults\n        return _react2.default.createElement(\"div\", { onMouseLeave: this.handleMouseLeave }, this.renderDataError(), !this.props.loading && this.props.graphLoading ? _react2.default.createElement(\"div\", { className: \"summary_report_ui_loading\" }, _react2.default.createElement(_mini_loader2.default, { isError: false, isLoading: true })) : null, _react2.default.createElement(\"div\", { className: \"graph\", id: \"graph\", ref: \"graph\" }), graphType === 'pie' ? _react2.default.createElement(_summary_pie_slider2.default, { ref: \"slider\", items: items, initialSelection:\n            //Would be best to centralise in the flux model\n            typeof this.props.athenaState.get('selectedDataSetIndex') === 'string' && _typeof(this.props.xAxisLabels) === 'object' ? Math.min(_lodash2.default.size(items) - 1, this.props.athenaState.get('selectedDataSetIndex')).toString() : _lodash2.default.size(items) - 1 + '' //default\n            , onChange: this.handleDataSetChange }) : null, tip ? _react2.default.createElement(_summary_tooltip2.default, { left: tip.left, top: tip.top, color: tip.color, key: tip.index }, _react2.default.createElement(_single_point_tooltip2.default, Object.assign({}, tip, { yAxisScale: this.props.yAxisScale, unit: unit }))) : _lodash2.default.map(this.filterSummaryTooltips(), function (tip, index) {\n            return _react2.default.createElement(_summary_tooltip2.default, { left: tip.left, top: tip.top, color: tip.color, key: index }, _react2.default.createElement(_series_tooltip2.default, Object.assign({}, tip, { yAxisScale: _this.props.yAxisScale, unit: unit })));\n        }));\n    },\n\n    /**\r\n     * Returns only the tooltips that have a corresponding\r\n     * label in the x-axis\r\n     *\r\n     * @returns {Array}\r\n     */\n    filterSummaryTooltips: function filterSummaryTooltips() {\n        var tooltips = this.state.tooltips;\n        var hasChart = !!this.graph && !!this.graph.chart;\n        var hasAxis = hasChart && !!this.graph.chart.xAxis && this.graph.chart.xAxis.length > 0;\n        var hasTooltips = !!this.state.tooltips && this.state.tooltips.length > 0;\n        if (hasTooltips && hasChart && hasAxis) {\n            tooltips = [];\n            var ticks = this.graph.chart.xAxis[0].tickPositions;\n            this.state.tooltips.forEach(function (tooltip, index) {\n                if (ticks.indexOf(index) >= 0) {\n                    tooltips.push(tooltip);\n                }\n            });\n        }\n        return tooltips;\n    },\n    getInitialState: function getInitialState() {\n        return {};\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            minimumHeight: 250\n        };\n    },\n    handleDataSetChange: function handleDataSetChange(index) {\n        this.props.athenaState.set('selectedDataSetIndex', index);\n    },\n    componentDidMount: function componentDidMount() {\n        (0, _jquery2.default)(window).on('resize', this.updateGraphSize);\n        this.updateGraphSize();\n        if (this.props.shouldRenderGraph) {\n            this.renderGraph();\n        }\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        (0, _jquery2.default)(window).off('resize', this.updateGraphSize);\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        var _this2 = this;\n\n        if (this.props.xAxisTitle !== nextProps.xAxisTitle) {\n            _lodash2.default.defer(function () {\n                _this2.props.athenaState.trigger('renderData');\n            });\n        }\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps) {\n        var _props = this.props,\n            overlay = _props.overlay,\n            metricData = _props.metricData,\n            projections = _props.projections,\n            projectionType = _props.projectionType,\n            projectionsErrors = _props.projectionsErrors,\n            shouldRenderGraph = _props.shouldRenderGraph,\n            showAnnotations = _props.showAnnotations,\n            yAxisScale = _props.yAxisScale,\n            athenaState = _props.athenaState;\n\n        var projectionsChanged = projections !== prevProps.projections;\n        var projectionTypeChanged = projectionType !== prevProps.projectionType;\n        var projectionTypeHasNoErrors = !(projectionsErrors && !_lodash2.default.isEmpty(projectionsErrors[projectionType]));\n        if (!Immutable.is(overlay, prevProps.overlay) || !Immutable.is(metricData.get('data'), prevProps.metricData.get('data'))) {\n            var overlayData = metricData.get('data');\n            if (this.graph && overlayData.size > 0) {\n                this.graph.removeAllOverlays();\n                this.graph.constructOverlay(overlay, overlayData);\n            }\n        }\n        if (this.shouldUpdateGraphSize) {\n            this.shouldUpdateGraphSize = false;\n            this.updateGraphSize();\n        }\n        if ((!this.graph || projectionsChanged || projectionTypeChanged && projectionTypeHasNoErrors) && shouldRenderGraph) {\n            this.renderGraph();\n        }\n        if (showAnnotations !== prevProps.showAnnotations) {\n            this.graph.addAnnotations();\n        }\n        if (yAxisScale !== prevProps.yAxisScale) {\n            athenaState.selectionChange();\n        }\n    },\n    renderGraph: function renderGraph() {\n        this.graph = new graph.Graph(this.refs.graph, this.props.reportEvents, this.props.budgetData, this.props.athenaState, this.handleTooltip);\n        /**\r\n        * Please see router.js for who triggers this event\r\n        */\n        this.listenToProp('athenaState', 'renderData', function (skipGraph) {\n            if (!skipGraph) {\n                this.update(this.props.athenaState, this.props.budgetData);\n            }\n        });\n        this.listenToProp('reportEvents', 'highlightNode', this.handleTooltip.bind(this, 'highlightNode'));\n        this.update(this.props.athenaState, this.props.budgetData);\n    },\n    renderDataError: function renderDataError() {\n        if (this.props.loading) {\n            return null;\n        }\n        var dataError = _summary_report_store2.default.getDataError();\n        if (dataError === 'DATA_ERROR_NO_MONTHLY_DATA_SETS') {\n            return _react2.default.createElement(\"div\", { className: \"graph-nodata__overlay\" }, _react2.default.createElement(\"div\", { className: \"graph-nomonthdata\" }, _react2.default.createElement(\"h3\", null, \"This report has a case of missing months\"), _react2.default.createElement(\"p\", null, \"Our \", _react2.default.createElement(\"strong\", null, \"Monthly Reports\"), \" require you to select at least one month of data for this report.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"How to fix this and view your report\"), _react2.default.createElement(\"br\", null), \"Under \", _react2.default.createElement(\"span\", { className: \"caps\" }, \"Report Settings > Report Data\"), \" select a row that lists the month you'd like to visualize in the month column. Do this for each of the months you want shown in the report.\")));\n        }\n        if (dataError === 'DATA_ERROR_MISSING_BALANCE_SHEET_TREES') {\n            return _react2.default.createElement(\"div\", { className: \"graph-nodata__overlay\" }, _react2.default.createElement(\"div\", { className: \"graph-nodata\" }, _react2.default.createElement(\"h3\", null, \"No balance sheet data available.\")));\n        }\n        if (dataError === 'DATA_ERROR_NO_RENDERED_DATA_SETS') {\n            return _react2.default.createElement(\"div\", { className: \"graph-nodata__overlay\" }, _react2.default.createElement(\"div\", { className: \"graph-nodata\" }, _react2.default.createElement(\"h3\", null, \"Your Fiscal Year selection has no data.\"), _react2.default.createElement(\"p\", null, \"Use the \", _react2.default.createElement(\"b\", null, \"\\\"Fiscal Year\\\"\"), \" menu on the left to change your year selection.\")));\n        }\n        if (!this.hasData()) {\n            return _react2.default.createElement(\"div\", { className: \"graph-nodata__overlay\" }, _react2.default.createElement(\"div\", { className: \"graph-nodata\" }, _react2.default.createElement(\"h3\", null, \"Your Filter Selection has no data.\"), _react2.default.createElement(\"p\", null, _react2.default.createElement(\"b\", null, _react2.default.createElement(\"a\", { onClick: this.handleReset }, \"Reset\")), \" the selection or use the \", _react2.default.createElement(\"b\", null, \"\\\"Filtered By\\\"\"), \" menu on the left to change your filter selection.\")));\n        }\n        return null;\n    },\n    handleTooltip: function handleTooltip(type, id, index) {\n        if (type === 'highlightNode') {\n            this.setSeriesTooltipState(id);\n        }\n        if (type === 'highlightNodeAmount') {\n            this.setSingleTooltipState(id, index);\n        }\n    },\n    handleMouseLeave: function handleMouseLeave() {\n        this.setState({ tooltips: null, singleTooltip: null });\n    },\n    setSingleTooltipState: function setSingleTooltipState(id, index) {\n        var graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n        if (graphType === 'pie') {\n            return;\n        }\n        var line = _lodash2.default.find(this.renderedData.lines, { id: id });\n        var selected = this.props.overlay.getIn(['selected', 0]);\n        if (!line && selected !== id) {\n            return this.setState({ singleTooltip: null, tooltips: null });\n        }\n        var graphPoints = this.graph.getPointsFromSeries(id);\n        var isOverlay = false;\n        if (selected === id) {\n            graphPoints = _lodash2.default.uniqBy(graphPoints, function (graphPoint) {\n                return graphPoint.x;\n            });\n            graphPoints = _lodash2.default.sortBy(graphPoints, function (graphPoint) {\n                return graphPoint.x;\n            });\n            var amounts = _lodash2.default.map(graphPoints, function (point) {\n                return { value: point.y, year: point.year };\n            });\n            line = {\n                amounts: amounts,\n                name: this.props.metricData.getIn(['data', selected, 'name']),\n                color: '#000000',\n                units: this.props.metricData.getIn(['data', selected, 'units'])\n            };\n            isOverlay = true;\n        }\n        var graphPoint = graphPoints[index] || {};\n        this.setState({ singleTooltip: this.tooltipData(line, index, graphPoint, isOverlay), tooltips: null });\n    },\n    setSeriesTooltipState: function setSeriesTooltipState(id) {\n        var _this3 = this;\n\n        var graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n        if (graphType === 'pie') {\n            return;\n        }\n        var line = _lodash2.default.find(this.renderedData.lines, { id: id });\n        if (!line) {\n            return this.setState({ tooltips: null, singleTooltip: null });\n        }\n        var graphPoints = this.graph.getPointsFromSeries(id);\n        this.setState({ tooltips: _lodash2.default.map(line.amounts, function (data, index) {\n                var graphPoint = graphPoints[index] || {};\n                return _this3.tooltipData(line, index, graphPoint, false);\n            }), singleTooltip: null });\n    },\n    tooltipData: function tooltipData(line, index, graphPoint, isOverlay) {\n        var accountType = this.props.accountType;\n        var data = line.amounts[index];\n        var change = void 0;\n        var total = void 0;\n        var percentage = void 0;\n        var unit = _summary_report_store2.default.getAmountUnit();\n        var category = graphPoint.category;\n        if (index !== 0) {\n            var previousValue = line.amounts[index - 1].value;\n            change = 100 * (data.value - previousValue) / previousValue;\n        }\n        var totalData = this.renderedData.totals[index];\n        if (totalData) {\n            if (accountType !== 'types') {\n                total = totalData.amount;\n                percentage = 100 * data.value / total;\n            } else {\n                total = totalData.delta;\n            }\n        }\n        var left = this.graph.chart.plotLeft;\n        var top = _lodash2.default.max([this.graph.chart.plotTop + graphPoint.plotY, 0]); //Values cannot be negative\n        left += graphPoint.barX ? graphPoint.barX + graphPoint.pointWidth / 2 : graphPoint.plotX;\n        if (isOverlay) {\n            total = null;\n            percentage = null;\n            var interpolation = !_lodash2.default.isUndefined(graphPoint.interpolate) ? ' Interpolated - ' + graphPoint.interpolate : '';\n            category = graphPoint.year + interpolation;\n            unit = line.units;\n        }\n        return {\n            index: index,\n            name: line.name,\n            value: data.value,\n            category: category,\n            left: left,\n            top: top,\n            color: line.htmlColor,\n            aggregateTitle: _strings2.default.aggregateRowLabel(accountType, this.props.budgetData.visibleAccounts, this.props.isBalanceSheetReport),\n            change: change, total: total, percentage: percentage, unit: unit\n        };\n    },\n    updateGraphSize: function updateGraphSize() {\n        var $graph = (0, _jquery2.default)(this.refs.graph);\n        var graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n        var width = $graph.width();\n        var top = $graph.offset().top;\n        var windowHeight = (0, _jquery2.default)(window).height();\n        var height = windowHeight - top;\n        if (graphType === 'pie' && this.refs.slider) {\n            var $slider = (0, _jquery2.default)(_reactDom2.default.findDOMNode(this.refs.slider));\n            height -= $slider.height() + 28;\n        }\n        if (height < this.props.minimumHeight) {\n            height = this.props.minimumHeight;\n        }\n        $graph.height(height);\n        if (this.graph) {\n            this.graph.size(width, height);\n        }\n        // We need this to occur on the next tick because we're usually already in an action response\n        _lodash2.default.debounce(function () {\n            _report_actions2.default.graphResized(width, height);\n        }, 10);\n    },\n    hasData: function hasData() {\n        return this.renderedData && !_lodash2.default.isEmpty(this.renderedData.lines);\n    },\n    update: function update(athenaState, budgetData, reportState) {\n        this.setState({\n            singleTooltip: null,\n            tooltips: null\n        });\n        this.renderedData = _summary_report_store2.default.getRenderedData(true);\n        this.shouldUpdateGraphSize = true;\n        // Mostly allow passing the report state in for testing. :\\\n        var state = reportState || _summary_report_store2.default.getState();\n        var dataSets = _summary_report_store2.default.getRenderedDataSets();\n        if (!_lodash2.default.isEmpty(dataSets) && this.hasData()) {\n            this.xAxisLabels = [];\n            _lodash2.default.each(dataSets, _lodash2.default.bind(function (dataSet) {\n                var label = _strings2.default.dataSetLabel(dataSet, athenaState.get('product').technical_name, state.get('currentYearPeriod'), state.get('currentYearAmount'), this.props.entity.get('fiscal_year_start_month'), {\n                    proration: state.get('proration')\n                });\n                this.xAxisLabels.push(label);\n            }, this));\n            var graphType = athenaState.get('graphType');\n            var xAxisTitle = this.props.xAxisTitle || _strings2.default.xAxis({\n                reportType: athenaState.get('product').report_type,\n                currentYearPeriod: state.get('currentYearPeriod'),\n                currentYearAmount: state.get('currentYearAmount'),\n                year: state.get('year'),\n                fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'),\n                month: athenaState.get('month')\n            });\n            var accountType = state.get('accountType');\n            var product = athenaState.get('product').report_type;\n            var selection = athenaState.get('selection');\n            var yAxisScale = this.props.yAxisScale;\n            //Two ways for overlay data to propagate -> update function + dedicated overlay passing function\n            var overlay = this.props.overlay;\n            var metricData = this.props.metricData.get('data'); //Issues with percentage chart having maxAxis be off.....\n            this.graph.update(this.renderedData.lines, this.renderedData.totals, graphType, accountType, xAxisTitle, this.xAxisLabels, !(product === 'balance' && accountType === 'types'), selection === this.lastSelection && accountType === this.lastAccountType, yAxisScale, metricData, overlay);\n            this.lastAccountType = accountType;\n            this.lastSelection = selection;\n        }\n    },\n    handleReset: function handleReset() {\n        this.props.reportEvents.trigger('reset');\n    }\n});\nexports.default = SummaryGraph;\n\n/***/ }),\n/* 1502 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _amount = __webpack_require__(214);\n\nvar _amount2 = _interopRequireDefault(_amount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SeriesTooltip = function (_React$Component) {\n    _inherits(SeriesTooltip, _React$Component);\n\n    function SeriesTooltip() {\n        _classCallCheck(this, SeriesTooltip);\n\n        return _possibleConstructorReturn(this, (SeriesTooltip.__proto__ || Object.getPrototypeOf(SeriesTooltip)).apply(this, arguments));\n    }\n\n    _createClass(SeriesTooltip, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                value = _props.value,\n                unit = _props.unit,\n                percentage = _props.percentage,\n                change = _props.change,\n                total = _props.total,\n                aggregateTitle = _props.aggregateTitle;\n\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, _react2.default.createElement(_amount2.default, { value: value, unit: unit, abbreviated: true })), _lodash2.default.isFinite(percentage) && _react2.default.createElement(\"span\", { ref: \"percentage\", \"data-test\": \"percentage\" }, '(' + _strings2.default.percentage(percentage) + ')')), _lodash2.default.isFinite(change) && _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, \"Change\"), _strings2.default.percentage(change)), _lodash2.default.isFinite(total) && _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, aggregateTitle.split(' ').map(function (str, index) {\n                return _react2.default.createElement(\"div\", { key: index }, str);\n            })), _react2.default.createElement(\"span\", { ref: \"aggregateValue\", \"data-test\": \"aggregate-value\" }, _react2.default.createElement(_amount2.default, { value: total, unit: unit, abbreviated: true }))));\n        }\n    }]);\n\n    return SeriesTooltip;\n}(_react2.default.Component);\n\nexports.default = SeriesTooltip;\n\nSeriesTooltip.propTypes = {\n    value: _propTypes2.default.number.isRequired,\n    percentage: _propTypes2.default.number,\n    change: _propTypes2.default.number,\n    aggregateTitle: _propTypes2.default.string,\n    total: _propTypes2.default.number,\n    unit: _propTypes2.default.shape({\n        formatter: _propTypes2.default.func.isRequired,\n        symbol: _propTypes2.default.string\n    })\n};\n\n/***/ }),\n/* 1503 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _amount = __webpack_require__(214);\n\nvar _amount2 = _interopRequireDefault(_amount);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SinglePointTooltip = function (_React$Component) {\n    _inherits(SinglePointTooltip, _React$Component);\n\n    function SinglePointTooltip() {\n        _classCallCheck(this, SinglePointTooltip);\n\n        return _possibleConstructorReturn(this, (SinglePointTooltip.__proto__ || Object.getPrototypeOf(SinglePointTooltip)).apply(this, arguments));\n    }\n\n    _createClass(SinglePointTooltip, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                name = _props.name,\n                category = _props.category,\n                value = _props.value,\n                unit = _props.unit,\n                percentage = _props.percentage,\n                change = _props.change,\n                total = _props.total,\n                aggregateTitle = _props.aggregateTitle;\n\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"h5\", { className: \"graph-tooltip__section\" }, name), _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"span\", { dangerouslySetInnerHTML: { __html: category } })), _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, _react2.default.createElement(_amount2.default, { value: value, unit: unit })), _lodash2.default.isFinite(percentage) && _react2.default.createElement(\"span\", { ref: \"percentage\", \"data-test\": \"percentage\" }, '(' + percentage.toFixed(2) + '%)')), _lodash2.default.isFinite(change) && _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, \"Change\"), _strings2.default.percentage(change)), _lodash2.default.isFinite(total) && _react2.default.createElement(\"div\", { className: \"graph-tooltip__section\" }, _react2.default.createElement(\"h5\", null, aggregateTitle), _react2.default.createElement(\"h5\", { ref: \"aggregateValue\", \"data-test\": \"aggregate-value\" }, _react2.default.createElement(_amount2.default, { value: total, unit: unit }))));\n        }\n    }]);\n\n    return SinglePointTooltip;\n}(_react2.default.Component);\n\nexports.default = SinglePointTooltip;\n\nSinglePointTooltip.propTypes = {\n    name: _propTypes2.default.string.isRequired,\n    value: _propTypes2.default.number.isRequired,\n    percentage: _propTypes2.default.number,\n    change: _propTypes2.default.number,\n    aggregateTitle: _propTypes2.default.string,\n    total: _propTypes2.default.number,\n    unit: _propTypes2.default.object\n};\n\n/***/ }),\n/* 1504 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _reactAutolinkText = __webpack_require__(1505);\n\nvar _reactAutolinkText2 = _interopRequireDefault(_reactAutolinkText);\n\nvar _event_observer_mixin = __webpack_require__(141);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AnnotationsPanel = (0, _createReactClass2.default)({\n    displayName: 'AnnotationsPanel',\n\n    mixins: [_event_observer_mixin.EventObserver],\n    getDefaultProps: function getDefaultProps() {\n        return {\n            maxAnnotationLength: 100,\n            annotations: [],\n            breakdown: null,\n            fiscalYearStartMonth: null,\n            events: null\n        };\n    },\n    render: function render() {\n        var _this = this;\n\n        var annotations = this.props.annotations;\n        var selectedAnnotation = this.state.selectedAnnotation;\n        return _react2.default.createElement(\"div\", { className: (0, _classnames2.default)({ 'annotations-panel': true, 'ui-panel': true, open: true, wide: selectedAnnotation }) }, _react2.default.createElement(\"div\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, \"Notes\"), _react2.default.createElement(\"span\", { className: \"ui-panel__close\", onClick: _report_actions2.default.closeAnnotationsPanel })), selectedAnnotation ? _react2.default.createElement(\"header\", { className: \"ui-panel__sub-header\" }, _react2.default.createElement(\"h4\", null, _react2.default.createElement(\"span\", { className: \"ui-panel__back\", onClick: this.handleBack }, \"Back to all notes\"))) : null, _react2.default.createElement(\"div\", { className: \"ui-panel__content ui-container_scroll\", ref: \"scrollContainer\" }, selectedAnnotation ? _react2.default.createElement(\"div\", { className: \"annotation_single\" }, _react2.default.createElement(\"header\", { className: \"annotation__header\" }, _react2.default.createElement(\"strong\", { className: \"annotation__title icon-annotation-1\" }, this.annotationNodeNames(selectedAnnotation)), _react2.default.createElement(\"small\", { className: \"annotation__subtitle\" }, _strings2.default.fiscalYear(selectedAnnotation.dataSet.year, this.props.fiscalYearStartMonth), \" \", selectedAnnotation.dataSet.description)), _react2.default.createElement(\"div\", { className: \"annotation__content\" }, _react2.default.createElement(_reactAutolinkText2.default, { text: selectedAnnotation.text }))) : annotations.map(function (annotation) {\n            var readMore = annotation.text.length > _this.props.maxAnnotationLength;\n            var dataSetYear = _strings2.default.fiscalYear(annotation.dataSet.year, _this.props.fiscalYearStartMonth);\n            var onClick = readMore ? function () {\n                _this.handleReadMore(annotation);\n            } : null;\n            var node = annotation.primaryNode;\n            if (!node) {\n                return null;\n            }\n            var secondaryNodes = annotation.secondaryNodes;\n            var classes = { annotation: true };\n            classes['annotation-' + annotation.id] = true;\n            classes['annotation-node-' + node.id] = true;\n            classes['is-truncated'] = readMore;\n            return _react2.default.createElement(\"div\", { className: (0, _classnames2.default)(classes), key: annotation.id, onClick: onClick, onMouseEnter: function onMouseEnter() {\n                    _this.handleMouseEnter(annotation.id);\n                }, onMouseLeave: function onMouseLeave() {\n                    _this.handleMouseLeave(annotation.id);\n                } }, _react2.default.createElement(\"header\", { className: \"annotation__header\" }, _react2.default.createElement(\"strong\", { className: \"annotation__title icon-annotation-1\" }, node.name), _react2.default.createElement(\"small\", { className: \"annotation__subtitle\" }, secondaryNodes.map(function (node) {\n                return _react2.default.createElement(\"div\", null, node.name);\n            }), dataSetYear, \" \", annotation.dataSet.description)), _react2.default.createElement(\"div\", { className: \"annotation__content\" }, _react2.default.createElement(_reactAutolinkText2.default, { ref: \"annotationText\", \"data-test\": \"annotation-text\", text: annotation.text, maxLength: _this.props.maxAnnotationLength }), readMore ? _react2.default.createElement(\"span\", null, _react2.default.createElement(\"span\", null, '\\u2026'), _react2.default.createElement(\"a\", { className: \"annotation__read-more\" }, \"Read More\")) : null));\n        })));\n    },\n    scrollToNode: function scrollToNode(id) {\n        var $node = (0, _jquery2.default)('.annotation-node-' + id);\n        var $scroll = (0, _jquery2.default)(this.refs.scrollContainer);\n        $scroll.scrollTop($node[0].offsetTop);\n    },\n    annotationNodeNames: function annotationNodeNames(annotation) {\n        return _lodash2.default.map(annotation.nodes, 'name').join(', ');\n    },\n    handleMouseLeave: function handleMouseLeave(id) {\n        (0, _jquery2.default)('.annotation-' + id).removeClass('hover');\n    },\n    handleMouseEnter: function handleMouseEnter(id) {\n        (0, _jquery2.default)('.annotation-' + id).addClass('hover');\n    },\n    handleReadMore: function handleReadMore(annotation) {\n        this.setState({ selectedAnnotation: annotation });\n    },\n    handleBack: function handleBack() {\n        this.setState({ selectedAnnotation: null });\n    },\n    componentDidMount: function componentDidMount() {\n        this.props.events.on('scrollToAnnotationNode', this.scrollToNode);\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this.props.events.off('scrollToAnnotationNode', this.scrollToNode);\n    },\n    getInitialState: function getInitialState() {\n        return {\n            selectedAnnotation: null\n        };\n    }\n});\nexports.default = AnnotationsPanel;\n\n/***/ }),\n/* 1505 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactPureRenderFunction = __webpack_require__(534);\n\nvar _reactPureRenderFunction2 = _interopRequireDefault(_reactPureRenderFunction);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _match_parser = __webpack_require__(1506);\n\nvar _match_parser2 = _interopRequireDefault(_match_parser);\n\nvar AutoLinkText = (function (_React$Component) {\n  _inherits(AutoLinkText, _React$Component);\n\n  function AutoLinkText() {\n    _classCallCheck(this, AutoLinkText);\n\n    _get(Object.getPrototypeOf(AutoLinkText.prototype), 'constructor', this).apply(this, arguments);\n\n    this.shouldComponentUpdate = _reactPureRenderFunction2['default'];\n  }\n\n  _createClass(AutoLinkText, [{\n    key: 'render',\n    value: function render() {\n      var _context;\n\n      var text = this.props.text || '';\n      return _react2['default'].createElement(\n        'span',\n        null,\n        (_context = (_context = (_context = (0, _match_parser2['default'])(text), prepareElements).call(_context, text), truncate).call(_context, this.props.maxLength), keyElements).call(_context)\n      );\n    }\n  }]);\n\n  return AutoLinkText;\n})(_react2['default'].Component);\n\nexports['default'] = AutoLinkText;\n\nfunction prepareElements(text) {\n  var elements = [];\n  var lastIndex = 0;\n\n  this.forEach(function (match) {\n    if (match.position.start !== 0) {\n      elements.push(_react2['default'].createElement(\n        'span',\n        null,\n        text.slice(lastIndex, match.position.start)\n      ));\n    }\n    elements.push(_react2['default'].createElement(\n      'a',\n      { href: match.getAnchorHref() },\n      match.getAnchorText()\n    ));\n    lastIndex = match.position.end;\n  });\n\n  if (lastIndex < text.length) {\n    elements.push(_react2['default'].createElement(\n      'span',\n      null,\n      text.slice(lastIndex)\n    ));\n  }\n\n  return elements;\n}\n\nfunction truncate(maxLength) {\n  if (!maxLength) return this;\n\n  var elements = [];\n  var length = 0;\n\n  this.some(function (el) {\n    length += el.props.children.length;\n\n    if (length > maxLength) {\n      var truncatedText = el.props.children.slice(0, -(length - maxLength));\n      elements.push(_react2['default'].cloneElement(el, {}, truncatedText));\n      return true; // stop iterating through the elements\n    }\n\n    elements.push(el);\n  });\n\n  return elements;\n}\n\n/*\n * Generate unique keys for each of the elements.\n * The key will be based on the index of the element.\n */\nfunction keyElements() {\n  return this.map(function (el, index) {\n    return _react2['default'].cloneElement(el, { key: index });\n  });\n}\n\nAutoLinkText.propTypes = {\n  text: _propTypes2['default'].string,\n  maxLength: _propTypes2['default'].oneOfType([_propTypes2['default'].number, _propTypes2['default'].string])\n};\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1506 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _match_validator = __webpack_require__(1507);\n\nvar _url_match = __webpack_require__(1508);\n\nvar _url_match2 = _interopRequireDefault(_url_match);\n\n// match protocol, allow in format \"http://\" or \"mailto:\". However, do not match\n// the first part of something like 'link:http://www.google.com' (i.e. don't match \"link:\").\n// Also, make sure we don't interpret 'google.com:8000' as if 'google.com' was a\n// protocol here (i.e. ignore a trailing port number in this regex)\nvar protocolRegex = /(?:[A-Za-z][-.+A-Za-z0-9]+:(?![A-Za-z][-.+A-Za-z0-9]+:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/;\n\n// starting with 'www.'\nvar wwwRegex = /(?:www\\.)/;\n\n// anything looking at all like a domain, non-unicode domains, not ending in a period\nvar domainNameRegex = /[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/;\n\n// match our known top level domains (TLDs)\nvar tldRegex = /\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/;\n\n// Allow optional path, query string, and hash anchor, not ending in the following characters: \"?!:,.;\"\n// http://blog.codinghorror.com/the-problem-with-urls/\nvar urlSuffixRegex = /[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]?!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]]/;\n\nvar charBeforeProtocolRelMatchRegex = /^(.)?\\/\\//;\n\nvar urlRegex = ['(?:', // parens to cover match for protocol (optional), and domain\n'(', // *** Capturing group $1, for a protocol-prefixed url (ex: http://google.com)\nprotocolRegex.source, domainNameRegex.source, ')', '|', '(?:', // non-capturing paren for a 'www.' prefixed url (ex: www.google.com)\n'(.?//)?', // *** Capturing group $2 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\nwwwRegex.source, domainNameRegex.source, ')', '|', '(?:', // non-capturing paren for known a TLD url (ex: google.com)\n'(.?//)?', // *** Capturing group $3 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\ndomainNameRegex.source, tldRegex.source, ')', ')', '(?:' + urlSuffixRegex.source + ')?']. // match for path, query string, and/or hash anchor - optional\njoin('');\n\nexports['default'] = function () {\n  var text = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n  var regex = new RegExp(urlRegex, 'gi');\n  var matches = [];\n\n  var match;\n  while ((match = regex.exec(text)) !== null) {\n    var _match = match;\n\n    var _match2 = _slicedToArray(_match, 4);\n\n    var matchedText = _match2[0];\n    var protocolUrlMatch = _match2[1];\n    var wwwProtocolRelativeMatch = _match2[2];\n    var tldProtocolRelativeMatch = _match2[3];\n\n    var protocolRelativeMatch = wwwProtocolRelativeMatch || tldProtocolRelativeMatch;\n\n    // If it's a protocol-relative '//' match, remove the character\n    // before the '//' (which the matcherRegex needed to match due to\n    // the lack of a negative look-behind in JavaScript regular\n    // expressions)\n    if (protocolRelativeMatch) {\n      var charBeforeMatch = protocolRelativeMatch.match(charBeforeProtocolRelMatchRegex)[1] || '';\n\n      // fix up the `matchStr` if there was a preceding char before a protocol-relative match, which was needed to determine the match itself (since there are no look-behinds in JS regexes)\n      if (charBeforeMatch) {\n        matchedText = matchedText.slice(1); // remove the prefixed char from the match\n        match.index++;\n      }\n    }\n\n    if ((0, _match_validator.isValidMatch)(matchedText, protocolUrlMatch, protocolRelativeMatch)) {\n      var position = { start: match.index, end: regex.lastIndex };\n      matches.push(new _url_match2['default'](matchedText, protocolUrlMatch, protocolRelativeMatch, position));\n    }\n  }\n\n  return matches;\n};\n\n;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 1507 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\nexports.isValidMatch = isValidMatch;\nvar uriSchemeRegex = /^[A-Za-z][-.+A-Za-z0-9]+:/;\nvar hasFullProtocolRegex = /^[A-Za-z][-.+A-Za-z0-9]+:\\/\\//;\nvar hasWordCharAfterProtocolRegex = /:[^\\s]*?[A-Za-z]/;\nvar invalidProtocolRelMatchRegex = /^[\\w]\\/\\//;\n\n/**\n * Determines if a given match found by the match parser is valid.\n * Will return `false` for:\n *\n * 1) URL matches which do not have at least have one period ('.') in the\n *    domain name (effectively skipping over matches like \"abc:def\").\n *    However, URL matches with a protocol will be allowed (ex: 'http://localhost')\n * 2) URL matches which do not have at least one word character in the\n *    domain name (effectively skipping over matches like \"git:1.0\").\n * 3) A protocol-relative url match (a URL beginning with '//') whose\n *    previous character is a word character (effectively skipping over\n *    strings like \"abc//google.com\")\n *\n * Otherwise, returns `true`.\n *\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to match something like\n *   'http://localhost', where we won't double check that the domain name\n *   has at least one '.' in it.\n * @param {String} protocolRelativeMatch The protocol-relative string for a\n *   URL match (i.e. '//'), possibly with a preceding character (ex, a\n *   space, such as: ' //', or a letter, such as: 'a//'). The match is\n *   invalid if there is a word character preceding the '//'.\n * @return {Boolean} `true` if the match given is valid and should be\n *   processed, or `false` if the match is invalid and/or should just not be\n *   processed.\n */\n\nfunction isValidMatch(urlMatch, protocolUrlMatch, protocolRelativeMatch) {\n  if (protocolUrlMatch && !isValidUriScheme(protocolUrlMatch) || urlMatchDoesNotHaveProtocolOrDot(urlMatch, protocolUrlMatch) || // At least one period ('.') must exist in the URL match for us to consider it an actual URL, *unless* it was a full protocol match (like 'http://localhost')\n  urlMatchDoesNotHaveAtLeastOneWordChar(urlMatch, protocolUrlMatch) || // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\n  isInvalidProtocolRelativeMatch(protocolRelativeMatch) // A protocol-relative match which has a word character in front of it (so we can skip something like \"abc//google.com\")\n  ) {\n      return false;\n    }\n\n  return true;\n}\n\n/**\n * Determines if the URI scheme is a valid scheme to be autolinked. Returns\n * `false` if the scheme is 'javascript:' or 'vbscript:'\n *\n * @private\n * @param {String} uriSchemeMatch The match URL string for a full URI scheme\n *   match. Ex: 'http://yahoo.com' or 'mailto:a@a.com'.\n * @return {Boolean} `true` if the scheme is a valid one, `false` otherwise.\n */\nfunction isValidUriScheme(uriSchemeMatch) {\n  var uriScheme = uriSchemeMatch.match(uriSchemeRegex)[0].toLowerCase();\n\n  return uriScheme !== 'javascript:' && uriScheme !== 'vbscript:';\n}\n\n/**\n * Determines if a URL match does not have either:\n *\n * a) a full protocol (i.e. 'http://'), or\n * b) at least one dot ('.') in the domain name (for a non-full-protocol\n *    match).\n *\n * Either situation is considered an invalid URL (ex: 'git:d' does not have\n * either the '://' part, or at least one dot in the domain name. If the\n * match was 'git:abc.com', we would consider this valid.)\n *\n * @private\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to match something like\n *   'http://localhost', where we won't double check that the domain name\n *   has at least one '.' in it.\n * @return {Boolean} `true` if the URL match does not have a full protocol,\n *   or at least one dot ('.') in a non-full-protocol match.\n */\nfunction urlMatchDoesNotHaveProtocolOrDot(urlMatch, protocolUrlMatch) {\n  return !!urlMatch && (!protocolUrlMatch || !hasFullProtocolRegex.test(protocolUrlMatch)) && urlMatch.indexOf('.') === -1;\n}\n\n/**\n * Determines if a URL match does not have at least one word character after\n * the protocol (i.e. in the domain name).\n *\n * At least one letter character must exist in the domain name after a\n * protocol match. Ex: skip over something like \"git:1.0\"\n *\n * @private\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to know whether or not we\n *   have a protocol in the URL string, in order to check for a word\n *   character after the protocol separator (':').\n * @return {Boolean} `true` if the URL match does not have at least one word\n *   character in it after the protocol, `false` otherwise.\n */\nfunction urlMatchDoesNotHaveAtLeastOneWordChar(urlMatch, protocolUrlMatch) {\n  if (urlMatch && protocolUrlMatch) {\n    return !hasWordCharAfterProtocolRegex.test(urlMatch);\n  } else {\n    return false;\n  }\n}\n\n/**\n * Determines if a protocol-relative match is an invalid one. This method\n * returns `true` if there is a `protocolRelativeMatch`, and that match\n * contains a word character before the '//' (i.e. it must contain\n * whitespace or nothing before the '//' in order to be considered valid).\n *\n * @private\n * @param {String} protocolRelativeMatch The protocol-relative string for a\n *   URL match (i.e. '//'), possibly with a preceding character (ex, a\n *   space, such as: ' //', or a letter, such as: 'a//'). The match is\n *   invalid if there is a word character preceding the '//'.\n * @return {Boolean} `true` if it is an invalid protocol-relative match,\n *   `false` otherwise.\n */\nfunction isInvalidProtocolRelativeMatch(protocolRelativeMatch) {\n  return !!protocolRelativeMatch && invalidProtocolRelMatchRegex.test(protocolRelativeMatch);\n}\n\n/***/ }),\n/* 1508 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * @class Autolinker.match.Url\n *\n * Represents a Url match found in an input string which should be Autolinked.\n */\n\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar URLMatch = (function () {\n  function URLMatch(url, protocolUrlMatch, protocolRelativeMatch, position) {\n    _classCallCheck(this, URLMatch);\n\n    this.urlPrefixRegex = /^(https?:\\/\\/)?(www\\.)?/i;\n    this.protocolRelativeRegex = /^\\/\\//;\n    this.protocolPrepended = false;\n    this.stripPrefix = true;\n\n    this._url = url;\n    this._protocolUrlMatch = protocolUrlMatch;\n    this._protocolRelativeMatch = protocolRelativeMatch;\n    this.position = position;\n  }\n\n  /**\n   * A regular expression used to remove the 'http://' or 'https://' and/or the 'www.' from URLs.\n   */\n\n  _createClass(URLMatch, [{\n    key: 'getUrl',\n\n    /**\n     * Returns the url that was matched, assuming the protocol to be 'http://' if the original\n     * match was missing a protocol.\n     *\n     * @return {String}\n     */\n    value: function getUrl() {\n      var url = this._url;\n\n      // if the url string doesn't begin with a protocol, assume 'http://'\n      if (!this._protocolRelativeMatch && !this._protocolUrlMatch && !this.protocolPrepended) {\n        url = this._url = 'http://' + url;\n\n        this.protocolPrepended = true;\n      }\n\n      return url;\n    }\n\n    /**\n     * Returns the anchor href that should be generated for the match.\n     *\n     * @return {String}\n     */\n  }, {\n    key: 'getAnchorHref',\n    value: function getAnchorHref() {\n      var url = this.getUrl();\n\n      return url.replace(/&amp;/g, '&'); // any &amp;'s in the URL should be converted back to '&' if they were displayed as &amp; in the source html\n    }\n\n    /**\n     * Returns the anchor text that should be generated for the match.\n     *\n     * @return {String}\n     */\n  }, {\n    key: 'getAnchorText',\n    value: function getAnchorText() {\n      var anchorText = this.getUrl();\n\n      if (this._protocolRelativeMatch) {\n        // Strip off any protocol-relative '//' from the anchor text\n        anchorText = this.stripProtocolRelativePrefix(anchorText);\n      }\n      if (this.stripPrefix) {\n        anchorText = this.stripUrlPrefix(anchorText);\n      }\n      anchorText = this.removeTrailingSlash(anchorText); // remove trailing slash, if there is one\n\n      return anchorText;\n    }\n\n    // ---------------------------------------\n\n    // Utility Functionality\n\n    /**\n     * Strips the URL prefix (such as \"http://\" or \"https://\") from the given text.\n     *\n     * @private\n     * @param {String} text The text of the anchor that is being generated, for which to strip off the\n     *   url prefix (such as stripping off \"http://\")\n     * @return {String} The `anchorText`, with the prefix stripped.\n     */\n  }, {\n    key: 'stripUrlPrefix',\n    value: function stripUrlPrefix(text) {\n      return text.replace(this.urlPrefixRegex, '');\n    }\n\n    /**\n     * Strips any protocol-relative '//' from the anchor text.\n     *\n     * @private\n     * @param {String} text The text of the anchor that is being generated, for which to strip off the\n     *   protocol-relative prefix (such as stripping off \"//\")\n     * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\n     */\n  }, {\n    key: 'stripProtocolRelativePrefix',\n    value: function stripProtocolRelativePrefix(text) {\n      return text.replace(this.protocolRelativeRegex, '');\n    }\n\n    /**\n     * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\n     *\n     * @private\n     * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\n     *   slash ('/') that may exist.\n     * @return {String} The `anchorText`, with the trailing slash removed.\n     */\n  }, {\n    key: 'removeTrailingSlash',\n    value: function removeTrailingSlash(anchorText) {\n      if (anchorText.charAt(anchorText.length - 1) === '/') {\n        anchorText = anchorText.slice(0, -1);\n      }\n      return anchorText;\n    }\n  }]);\n\n  return URLMatch;\n})();\n\nexports['default'] = URLMatch;\nmodule.exports = exports['default'];\n\n/**\n * The regular expression used to remove the protocol-relative '//' from the {@link #url} string, for purposes\n * of {@link #getAnchorText}. A protocol-relative URL is, for example, \"//yahoo.com\"\n */\n\n/**\n * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\n * {@link #url} did not have a protocol)\n */\n\n/***/ }),\n/* 1509 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _breakdown_switcher = __webpack_require__(1510);\n\nvar _breakdown_switcher2 = _interopRequireDefault(_breakdown_switcher);\n\nvar _filter_menu_toggles = __webpack_require__(1511);\n\nvar _filter_menu_toggles2 = _interopRequireDefault(_filter_menu_toggles);\n\nvar _time_period = __webpack_require__(1512);\n\nvar _time_period2 = _interopRequireDefault(_time_period);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _fiscal_year_dropdown = __webpack_require__(1514);\n\nvar _fiscal_year_dropdown2 = _interopRequireDefault(_fiscal_year_dropdown);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SummaryReportFiltersPanel = function (_React$Component) {\n    _inherits(SummaryReportFiltersPanel, _React$Component);\n\n    function SummaryReportFiltersPanel() {\n        _classCallCheck(this, SummaryReportFiltersPanel);\n\n        return _possibleConstructorReturn(this, (SummaryReportFiltersPanel.__proto__ || Object.getPrototypeOf(SummaryReportFiltersPanel)).apply(this, arguments));\n    }\n\n    _createClass(SummaryReportFiltersPanel, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                accountType = _props.accountType,\n                breakdowns = _props.breakdowns,\n                breakdown = _props.breakdown,\n                year = _props.year,\n                years = _props.years,\n                versusView = _props.versusView;\n\n            var fiscalYearStartMonth = this.props.entity.get('fiscal_year_start_month');\n            var action = _summary_report_actions2.default.setYear;\n            var fiscal_year_dropdown = (0, _fiscal_year_dropdown2.default)(year, years, action, _strings2.default, fiscalYearStartMonth);\n            return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(AccountTypesDropdown, Object.assign({}, this.props)), _react2.default.createElement(_breakdown_switcher2.default, { accountType: accountType, breakdowns: breakdowns, breakdown: breakdown, versusView: versusView }), this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'years' ? _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Fiscal year through\"), _react2.default.createElement(_ovid.DropdownList, { value: this.props.month, onChange: _summary_report_actions2.default.setMonth }, this.props.months.map(function (month) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: month, value: month, title: _strings2.default.month(month) });\n            }))) : null, this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'months' ? fiscal_year_dropdown : null), _react2.default.createElement(_filter_menu_toggles2.default, { accountType: this.props.accountType, reportType: this.props.reportType, filterPanels: this.props.filterPanels, breakdown: this.props.breakdown, visibleAccounts: this.props.accountTypes }), this.props.athena && !(this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'months') ? _react2.default.createElement(_time_period2.default, { minYear: this.props.minYear, maxYear: this.props.maxYear, fiscalYearRange: this.props.fiscalYearRange, budgetData: this.props.athena.budgetData }) : null);\n        }\n    }]);\n\n    return SummaryReportFiltersPanel;\n}(_react2.default.Component);\n\nexports.default = SummaryReportFiltersPanel;\n\nvar AccountTypesDropdown = function (_React$Component2) {\n    _inherits(AccountTypesDropdown, _React$Component2);\n\n    function AccountTypesDropdown() {\n        _classCallCheck(this, AccountTypesDropdown);\n\n        return _possibleConstructorReturn(this, (AccountTypesDropdown.__proto__ || Object.getPrototypeOf(AccountTypesDropdown)).apply(this, arguments));\n    }\n\n    _createClass(AccountTypesDropdown, [{\n        key: '_onSelectAccountType',\n        value: function _onSelectAccountType(value) {\n            if (this.props.versusViews.find(function (view) {\n                return view.get('id') === value;\n            })) {\n                _summary_report_actions2.default.setVersusView(value);\n            } else {\n                _summary_report_actions2.default.setAccountType(value);\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this3 = this;\n\n            var selectedValue = this.props.versusView ? this.props.versusView.get('id') : this.props.accountType;\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section account_types\", title: \"Select which measure is shown in your report\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Show\"), _react2.default.createElement(_ovid.DropdownList, { value: selectedValue, onChange: function onChange(value) {\n                    return _this3._onSelectAccountType(value);\n                } }, _lodash2.default.map(this.props.accountTypes, function (accountType) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: accountType.id, value: accountType.id, title: accountType.name });\n            }), this.props.versusViews.map(function (view) {\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: view.get('id'), value: view.get('id'), title: view.get('name') });\n            })));\n        }\n    }]);\n\n    return AccountTypesDropdown;\n}(_react2.default.Component);\n\n/***/ }),\n/* 1510 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _ovid = __webpack_require__(8);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar BreakdownSwitcher = function (_React$Component) {\n    _inherits(BreakdownSwitcher, _React$Component);\n\n    function BreakdownSwitcher() {\n        _classCallCheck(this, BreakdownSwitcher);\n\n        return _possibleConstructorReturn(this, (BreakdownSwitcher.__proto__ || Object.getPrototypeOf(BreakdownSwitcher)).apply(this, arguments));\n    }\n\n    _createClass(BreakdownSwitcher, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var disabled = !!this.props.versusView;\n            var accountType = disabled ? this.props.versusView.get('name') : null;\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\", title: 'Select how the data is broken down. For\\n        example, breaking down by department will force the graph to show names of\\n        departments or children of departments.' }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Broken down by\"), _react2.default.createElement(_ovid.DropdownList, { value: this.props.breakdown, disabled: disabled, onChange: _summary_report_actions2.default.setBreakdown }, _lodash2.default.map(this.props.breakdowns, function (breakdown) {\n                var name = _strings2.default.breakdownName(breakdown, _this2.props.accountType);\n                return _react2.default.createElement(_ovid.DropdownListItem, { key: breakdown.get('id'), value: breakdown.get('id'), title: accountType || name });\n            })));\n        }\n    }]);\n\n    return BreakdownSwitcher;\n}(_react2.default.Component);\n\nexports.default = BreakdownSwitcher;\n\n/***/ }),\n/* 1511 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n;\n\nvar FilterMenuToggles = function (_React$Component) {\n    _inherits(FilterMenuToggles, _React$Component);\n\n    function FilterMenuToggles() {\n        _classCallCheck(this, FilterMenuToggles);\n\n        return _possibleConstructorReturn(this, (FilterMenuToggles.__proto__ || Object.getPrototypeOf(FilterMenuToggles)).apply(this, arguments));\n    }\n\n    _createClass(FilterMenuToggles, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var filterPanels = this.props.filterPanels;\n\n            return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\", id: \"wd-section-filter\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Filtered By\", _react2.default.createElement(\"button\", { className: \"ui-mainpanel__section-expand-all\", id: \"wd-filter-button-all\", onClick: _summary_report_actions2.default.toggleAllFilterPanels }, \"All\", _react2.default.createElement(\"span\", { className: \"icon-righthead-2\" }))), _react2.default.createElement(\"div\", { className: \"ui-button-stack\" }, !!filterPanels.size && filterPanels.filter(function (breakdown) {\n                return breakdown.get('visible');\n            }).map(function (breakdown) {\n                var isBreakdown = _this2.props.breakdown === breakdown.get('id');\n                var isActive = breakdown.get('isOpen');\n                return _react2.default.createElement(\"button\", { className: (0, _classnames2.default)('filter-toggle', 'ui-button', 'small', { active_breakdown: isBreakdown, active: isActive }), key: breakdown.get('id'), onClick: function onClick() {\n                        return _summary_report_actions2.default.toggleFilterPanel(breakdown.get('id'));\n                    } }, _react2.default.createElement(\"span\", { className: \"filter-toggle__text\" }, _strings2.default.breakdownName(breakdown, _this2.props.accountType, _this2.props.visibleAccounts, _this2.props.reportType)), _react2.default.createElement(\"div\", { className: \"filter-toggle__actions\" }, _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__close\" }), _react2.default.createElement(\"span\", { className: \"ui-panel-toggle__open\" })));\n            })));\n        }\n    }]);\n\n    return FilterMenuToggles;\n}(_react2.default.Component);\n\nexports.default = FilterMenuToggles;\n\n/***/ }),\n/* 1512 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _toggle_mixin = __webpack_require__(1513);\n\nvar _toggle_mixin2 = _interopRequireDefault(_toggle_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TimePeriod = (0, _createReactClass2.default)({\n    displayName: 'TimePeriod',\n\n    mixins: [_toggle_mixin2.default],\n    propTypes: {\n        budgetData: _propTypes2.default.object,\n        // Only show time period selector if report has this number of data sets or more.\n        minDataSetCount: _propTypes2.default.number\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            ignoreContentClicks: true,\n            minDataSetCount: 3\n        };\n    },\n    getInitialState: function getInitialState() {\n        return {\n            selectedHandle: null\n        };\n    },\n    render: function render() {\n        if (!this.props.budgetData || this.props.budgetData.dataSets.length < this.props.minDataSetCount) {\n            return null;\n        }\n        var handleClasses = {};\n        if (this.state.open) {\n            handleClasses[this.state.selectedHandle] = { 'is-picked': true };\n        }\n        if (this.props.minYear === this.props.maxYear) {\n            // Hide time slider if only 1 year of data sets exists in the report.\n            return null;\n        }\n        return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"Fiscal Year\"), _react2.default.createElement(\"div\", { className: \"time-period\" }, _react2.default.createElement(Ovid.Slider, { ref: \"slider\", min: this.props.minYear, max: this.props.maxYear, value: this.props.fiscalYearRange.toArray(), handleClasses: handleClasses, onChange: _lodash2.default.throttle(this.handleChange, 250), onSliderClick: this.handleSliderClick }), this.renderPicker()));\n    },\n    renderPicker: function renderPicker() {\n        if (!this.state.open) {\n            return null;\n        }\n        var handle = this.state.selectedHandle;\n        var selectedYear = this.props.fiscalYearRange.get(handle);\n        var pickerMinYear = void 0;\n        var pickerMaxYear = void 0;\n        if (handle === 0) {\n            pickerMinYear = this.props.minYear;\n            pickerMaxYear = this.props.fiscalYearRange.get(1);\n        } else {\n            pickerMinYear = this.props.fiscalYearRange.get(0);\n            pickerMaxYear = this.props.maxYear;\n        }\n        return _react2.default.createElement(\"div\", { className: \"time-period__datepicker ui-dropdown__target\", onClick: this.handlePickerClick }, _react2.default.createElement(\"header\", { className: \"ui-dropdown__header\" }, _react2.default.createElement(\"h4\", null, \"Choose \", handle === 0 ? 'a start' : 'an end', \" date:\")), _react2.default.createElement(Ovid.Calendar, { date: new Date(selectedYear, 0), minSelectionMode: \"years\", minYear: new Date(pickerMinYear, 0), maxYear: new Date(pickerMaxYear, 0), selectionRange: { min: this.props.minYear, max: this.props.maxYear }, onDateSelected: this.handlePickerSelect }));\n    },\n    handleChange: function handleChange(value) {\n        _summary_report_actions2.default.setFiscalYearRange(value);\n        _summary_report_actions2.default.getAggregations();\n    },\n    handleSliderClick: function handleSliderClick(index) {\n        this.setState({\n            selectedHandle: index\n        });\n        if (!this.state.open) {\n            this.toggle(true);\n        }\n        if (this.state.selectedHandle !== index) {\n            this.ignoreClick = true;\n        }\n    },\n    handlePickerClick: function handlePickerClick() {\n        this.ignoreClick = true;\n    },\n    handlePickerSelect: function handlePickerSelect(selection) {\n        var nextYear = selection.year();\n        var selectedHandle = this.state.selectedHandle;\n        var prevYear = this.props.fiscalYearRange.get(selectedHandle);\n        if (nextYear === prevYear) {\n            return;\n        }\n        this.handleChange(this.props.fiscalYearRange.set(selectedHandle, nextYear).toArray());\n        this.toggle();\n    }\n});\nexports.default = TimePeriod;\n\n/***/ }),\n/* 1513 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n    getInitialState: function getInitialState() {\n        return {\n            open: false\n        };\n    },\n    componentDidMount: function componentDidMount() {\n        document.addEventListener('click', this.handleDocumentClick);\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        document.removeEventListener('click', this.handleDocumentClick);\n    },\n    handleToggleClick: function handleToggleClick() {\n        if (this.props.disabled) {\n            return;\n        }\n        if (!this.ignoreToggle) {\n            this.toggle();\n        }\n        this.ignoreClick = true;\n        this.ignoreToggle = false;\n    },\n    handleContentClick: function handleContentClick() {\n        if (this.props.ignoreContentClicks) {\n            this.ignoreToggle = true;\n        }\n    },\n    handleDocumentClick: function handleDocumentClick() {\n        var self = this;\n        // Allow the handleClick handler a chance to run first\n        // before checking if we should toggle the menu closed.\n        // It isn't defined what order the click handlers will run.\n        _lodash2.default.defer(function () {\n            if (!self.ignoreClick && self.state.open) {\n                self.toggle();\n            }\n            self.ignoreClick = !self.ignoreClick;\n        });\n    },\n\n    // When calling this from a click event listener be sure to\n    // pass true for ignoreClick otherwise the menu will never open.\n    toggle: function toggle(ignoreClick) {\n        var opening = !this.state.open;\n        this.setState({ open: opening });\n        var onToggle = this.onToggle;\n        if (onToggle) {\n            onToggle(opening);\n        }\n        this.ignoreClick = ignoreClick;\n    }\n};\n\n/***/ }),\n/* 1514 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = fiscalYearDropdown;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fiscalYearDropdown(year, years, action, strings, fiscalYearStartMonth) {\n    return _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section\" }, _react2.default.createElement(\"div\", { className: \"ui-mainpanel__section-header\" }, \"For Fiscal Year\"), _react2.default.createElement(_ovid.DropdownList, { value: year || _lodash2.default.head(years), onChange: action }, _lodash2.default.map(years, function (yr) {\n        return _react2.default.createElement(_ovid.DropdownListItem, { key: yr, value: yr, title: strings.fiscalYear(yr, fiscalYearStartMonth) });\n    })));\n}\n\n/***/ }),\n/* 1515 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar GlobalAlert = (0, _createReactClass2.default)({\n    displayName: 'GlobalAlert',\n\n    propTypes: {\n        title: _propTypes2.default.string,\n        message: _propTypes2.default.node,\n        buttons: _propTypes2.default.arrayOf(_propTypes2.default.element)\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-alert retry-alert open\" }, _react2.default.createElement(\"p\", null, this.props.title ? _react2.default.createElement(\"strong\", { className: \"retry-alert-title\" }, this.props.title) : null, this.props.message ? this.props.message : null), this.props.buttons ? _react2.default.createElement(\"div\", { className: \"ui-alert__actions\" }, this.props.buttons) : null);\n    }\n});\nexports.default = GlobalAlert;\n\n/***/ }),\n/* 1516 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _asset_helpers = __webpack_require__(119);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HowToModal = function HowToModal() {\n    return _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open\", id: \"overlay-modal_howto\" }, _react2.default.createElement(\"div\", { className: \"ui-modal wide\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"How To\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", onClick: _report_actions2.default.hideHowTo })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"article\", { className: \"howto-content\" }, _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/1.png'), className: \"howto-content__graphic\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"OpenGov allows you to explore budget and historical finances in a simple graphical user interface. The main view, depicted here, includes a graph, legend, and various controls to view expenses by departments out of all funds.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/2.png'), className: \"howto-content__graphic\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"You'll notice the title of the graph you are viewing on top along with the account type selector. You can use the filter to see the data of most interest to you.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/3.png'), className: \"howto-content__graphic\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, 'To focus on specific data \\u2014 like a fund, department, expense type, or any combination \\u2014 use the menu on the side panel. The \"Breakdown by\" allows you to specify which breakdown you want the graphs and table rows to represent on the graph. The \"Data Filter\" shows you the hierarchical relationships of Funds, Departments, and Account Types.'), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/4.png'), className: \"howto-content__graphic\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"In the \\\"Data Filter,\\\" you can see that, if a particular department never gets money from a particular fund, selecting only that department will gray out the fund.\"), _react2.default.createElement(\"img\", { src: (0, _asset_helpers.assetPath)('images/howto/5.png'), className: \"howto-content__graphic\" }), _react2.default.createElement(\"p\", { className: \"howto-content__graphic-desc\" }, \"There are five graph types overall: an area graph, an area graph by percentage, a line graph, a pie graph, and a table. You can share any view on a social network or by email. There are also options to download the displayed data in .csv spreadsheet and .png image formats.\"))), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: _report_actions2.default.hideHowTo }, \"Done\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" }));\n};\nexports.default = HowToModal;\n\n/***/ }),\n/* 1517 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _download_operations = __webpack_require__(1518);\n\nvar _ovid = __webpack_require__(8);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar DownloadModal = (0, _createReactClass2.default)({\n    displayName: 'DownloadModal',\n\n    getInitialState: function getInitialState() {\n        var renderedReport = _report_view_store2.default.getRenderedReport();\n        var desc = renderedReport.get('description');\n        var title = renderedReport.get('name');\n        return {\n            optionValue: 'chart+table',\n            status: false,\n            includeDetails: true,\n            title: title ? title : '',\n            description: desc ? desc : '',\n            textChanged: false,\n            exportError: false,\n            warning: ''\n        };\n    },\n    setOption: function setOption(value) {\n        this.setState({ optionValue: value });\n        this.addRemoveDetails();\n        var type = this.props.athenaState.get('graphType');\n        (0, _download_operations.setDownloadOption)(value, type);\n        (0, _download_operations.generatePreview)(this.updateStatus);\n    },\n    addRemoveDetails: function addRemoveDetails() {\n        if (!this.state.includeDetails) {\n            this.removeDetails();\n        } else {\n            this.updateDetails();\n        }\n    },\n    toggleCustomDetails: function toggleCustomDetails() {\n        if (this.state.includeDetails) {\n            this.removeDetails();\n        } else {\n            this.updateDetails();\n        }\n        var type = this.props.athenaState.get('graphType');\n        (0, _download_operations.setDownloadOption)(this.state.optionValue, type);\n        (0, _download_operations.generatePreview)(this.updateStatus);\n        this.setState({\n            includeDetails: !this.state.includeDetails\n        });\n    },\n    removeDetails: function removeDetails() {\n        (0, _download_operations.updateDesc)('');\n        (0, _download_operations.updateTitle)('');\n    },\n    updateDetails: function updateDetails() {\n        (0, _download_operations.updateDesc)(this.state.description);\n        (0, _download_operations.updateTitle)(this.state.title);\n    },\n    updateStatus: function updateStatus(status) {\n        this.setState({ status: status });\n    },\n    checkRows: function checkRows() {\n        var renderedData = _summary_report_store2.default.getRenderedData(false, true);\n        var lines = renderedData.lines;\n        return lines.length > 150 ? true : false;\n    },\n    checkColumn: function checkColumn() {\n        var renderedData = _summary_report_store2.default.getRenderedData(false, true);\n        var dataSets = _summary_report_store2.default.getRenderedDataSets();\n        var totals = renderedData.totals;\n        var varianceColCount = 0;\n        _lodash2.default.forEach(totals, function (total) {\n            varianceColCount = total.variance ? varianceColCount + 1 : varianceColCount;\n        });\n        var numberOfColumns = dataSets.length + varianceColCount * 2;\n        return numberOfColumns > 10 ? true : false;\n    },\n    hasTable: function hasTable() {\n        return this.state.optionValue == 'table' || this.state.optionValue == 'chart+table' ? true : false;\n    },\n    download: function download() {\n        var option = this.state.optionValue;\n        this.addRemoveDetails();\n        var type = this.props.athenaState.get('graphType');\n        (0, _download_operations.setDownloadOption)(option, type);\n        try {\n            this.setState({ exportError: false });\n            if (this.state.textChanged) {\n                (0, _download_operations.generatePreview)(this.updateStatus, _download_operations.downloadPreviewImage, option);\n                this.setState({ textChanged: false });\n            } else {\n                (0, _download_operations.downloadPreviewImage)(option);\n            }\n        } catch (err) {\n            this.setState({ exportError: true });\n        }\n    },\n    print: function print() {\n        var type = this.props.athenaState.get('graphType');\n        var option = this.state.optionValue;\n        this.addRemoveDetails();\n        (0, _download_operations.setDownloadOption)(option, type);\n        (0, _download_operations.printSetup)(option);\n        _report_actions2.default.printReport();\n        window.print();\n    },\n    componentDidMount: function componentDidMount() {\n        var renderedData = _summary_report_store2.default.getRenderedData(false, true);\n        var lines = renderedData.lines;\n        var rerender = this.props.athenaState;\n        var titles = this.props.budgetData.titles(this.props.breakdown);\n        var primary = titles.primary;\n        var secondary = titles.secondary;\n        var filter = secondary.map(function (title) {\n            return title.node.name;\n        });\n        filter.unshift(primary.name);\n        var type = this.props.athenaState.get('graphType');\n        (0, _download_operations.createDummyReport)(this.state.title, this.state.description, lines.length, rerender, filter, type, this.updateStatus);\n    },\n    renderReportDescription: function renderReportDescription() {\n        return _react2.default.createElement(_ovid.TextArea, { name: \"description\", label: \"Report Description\", placeholder: \"Add a description for this report\", maxLength: 250 });\n    },\n    previewWarning: function previewWarning() {\n        var renderedData = _summary_report_store2.default.getRenderedData(false, true);\n        var lines = renderedData.lines;\n        return this.hasTable() && lines.length > 90 ? 'Preview might take sometime' : 'Loading';\n    },\n    renderWarning: function renderWarning() {\n        if (this.hasTable() && this.checkColumn() && this.checkRows()) {\n            return _react2.default.createElement(\"div\", { className: \" ui-alert-box notice\" }, _react2.default.createElement(\"strong\", null, \"Print table, for best result\"), _react2.default.createElement(\"p\", null, \" This report include more than 150 rows and 10 columns, which may not display well in the image download. We recommend that you print it as a Acrobat PDF\"));\n        }\n        if (this.hasTable() && this.checkRows()) {\n            return _react2.default.createElement(\"div\", { className: \" ui-alert-box notice\" }, _react2.default.createElement(\"strong\", null, \"Print table, for best result\"), _react2.default.createElement(\"p\", null, \" This report include more than 150 rows, which may not display well in the image download. We recommend that you print it as a Acrobat PDF\"));\n        }\n        if (this.hasTable() && this.checkColumn()) {\n            return _react2.default.createElement(\"div\", { className: \" ui-alert-box notice\" }, _react2.default.createElement(\"strong\", null, \"Print table, for best result\"), _react2.default.createElement(\"p\", null, \"This report include more than 10 columns, which may not display well in the image download. We recommend that you print it as a Acrobat PDF\"));\n        }\n        return null;\n    },\n    renderReportTitle: function renderReportTitle() {\n        return _react2.default.createElement(_ovid.InputField, { name: \"title\", label: \"Report Title\", placeholder: \"Add a Title for this report\", maxLength: 75 });\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        (0, _download_operations.removeDummyReport)();\n        this.props.athenaState.trigger('renderData', false);\n    },\n    componentDidUpdate: function componentDidUpdate(prevProps, prevState) {\n        if (this.state.title != prevState.title || this.state.description != prevState.description) {\n            this.setState({ textChanged: true });\n        }\n    },\n    checkMaxCharacters: function checkMaxCharacters() {\n        return this.state.title && this.state.title.length > 75 || this.state.description && this.state.description.length > 250 ? true : false;\n    },\n    _onFormChange: function _onFormChange(fieldName, newValue) {\n        this.setState(_defineProperty({}, fieldName, newValue));\n    },\n    render: function render() {\n        var initialValues = _extends({}, this.state);\n        var errors = {};\n        var reportDetails = this.state.includeDetails ? _react2.default.createElement(\"div\", null, _react2.default.createElement(_ovid.Form, { initialValues: initialValues, errors: errors, onChange: this._onFormChange }, this.renderReportTitle(), this.renderReportDescription())) : null;\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-modal__wrapper open\", id: \"overlay-modal_download\" }, _react2.default.createElement(\"div\", { className: \"ui-modal lg-modal\" }, _react2.default.createElement(\"header\", { className: \"ui-modal__header\" }, _react2.default.createElement(\"h3\", null, \"Download Image\"), _react2.default.createElement(\"span\", { className: \"ui-modal__close\", onClick: _report_actions2.default.hideDownloadModal })), _react2.default.createElement(\"div\", { className: \"ui-modal__content\" }, _react2.default.createElement(\"div\", { className: \"download_wrapper\" }, _react2.default.createElement(\"div\", { className: \"download_options\" }, this.renderWarning(), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", { className: \"ui-form__checkbox-label\", onClick: this.toggleCustomDetails }, _react2.default.createElement(\"div\", { className: this.state.includeDetails ? 'ui-form__checkbox is-checked' : 'ui-form__checkbox' }), \" Include report title and description\")), reportDetails, _react2.default.createElement(\"fieldset\", { className: \"ui-form option\" }, _react2.default.createElement(\"label\", null, \"Image Options\"), _react2.default.createElement(_ovid.DropdownList, { value: this.state.optionValue, onChange: this.setOption }, _react2.default.createElement(_ovid.DropdownListItem, { key: \"1\", value: \"chart\", title: \"Chart only\" }), _react2.default.createElement(_ovid.DropdownListItem, { key: \"2\", value: \"table\", title: \"Table only\" }), _react2.default.createElement(_ovid.DropdownListItem, { key: \"3\", value: \"chart+table\", title: \"Chart & Table\" })))), _react2.default.createElement(\"div\", { className: \"download_preview_conatiner\" }, this.state.status ? _react2.default.createElement(\"div\", { className: \"ui-loader\" }, _react2.default.createElement(\"div\", { className: \"ui-loading\" }), _react2.default.createElement(\"div\", { className: \"ui-loader__message\" }, _react2.default.createElement(\"strong\", null, this.previewWarning()))) : '', _react2.default.createElement(\"div\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Preview\")), this.state.exportError ? _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), \" The download failed. Please retry\") : null, _react2.default.createElement(\"div\", { className: \"download_preview\" }, _react2.default.createElement(\"img\", { className: \"download_preview_image\" })))), _react2.default.createElement(\"div\", { id: \"download_status\" })), _react2.default.createElement(\"footer\", { className: \"ui-modal__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-modal__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button cancel_button\", disabled: this.state.status, onClick: _report_actions2.default.hideDownloadModal }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button print_button\", disabled: this.state.status || this.checkMaxCharacters(), onClick: this.print }, \"Print\"), _react2.default.createElement(\"button\", { className: \"ui-button download_button primary\", disabled: this.state.status || this.checkMaxCharacters(), onClick: this.download }, \"Download Image\")))), _react2.default.createElement(\"div\", { className: \"ui-modal__background\" })));\n    }\n});\nexports.default = DownloadModal;\n\n/***/ }),\n/* 1518 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.createDummyReport = createDummyReport;\nexports.updateDesc = updateDesc;\nexports.updateTitle = updateTitle;\nexports.setDownloadOption = setDownloadOption;\nexports.downloadPreviewImage = downloadPreviewImage;\nexports.generatePreview = generatePreview;\nexports.printSetup = printSetup;\nexports.removeDummyReport = removeDummyReport;\n\nvar _html2canvas_operations = __webpack_require__(1519);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar currentCanvas = void 0;\nfunction createDummyReport(title, desc, rowsLength, render, filters, type, updateStatus) {\n    if (document.getElementById('transparency-content')) {\n        updateStatus(true);\n        document.documentElement.style.overflow = 'hidden';\n        var dummyContainer = createReportContainer(render, isScalable());\n        setTimeout(function () {\n            addTitle(dummyContainer, title);\n            addDesc(dummyContainer, desc);\n            var graph = addGraph('dummyGraph', dummyContainer, type, false);\n            var reportDesc = graph.querySelector('.report-description');\n            if (reportDesc) {\n                reportDesc.innerHTML = '';\n            }\n            (0, _html2canvas_operations.convertSvgToCanvas)(graph);\n            var scale = document.getElementById('scaling');\n            if (scale) {\n                scale.innerHTML = '';\n            }\n            render.trigger('renderData', false);\n            setTimeout(function () {\n                var graph = addGraph('dummyGraph2', dummyContainer, type, true);\n                (0, _html2canvas_operations.convertSvgToCanvas)(graph);\n                var style = document.createElement('style');\n                style.innerHTML = '@media print { #App{display:none; }  #dummy_report_footer { display:block; }   #dummyContainer tr{page-break-inside: avoid !important;} #dummyContainer { display: block; height: 100%; width: 100%; -webkit-print-color-adjust:exact;print-color-adjust:exact;}}';\n                dummyContainer.appendChild(style);\n                addSummaryTable(dummyContainer, rowsLength);\n                addFooter(dummyContainer, filters);\n                generatePreview(updateStatus);\n                find(dummyContainer, '.highcharts-container > div > span', function (ele) {\n                    ele.style.fontFamily = 'arial';\n                });\n                find(dummyContainer, '.highcharts-container > div > div > span', function (ele) {\n                    ele.style.fontFamily = 'arial';\n                });\n            }, 2000);\n        }, 2000);\n    }\n}\nfunction isScalable() {\n    var summaryTable = document.getElementsByClassName('summary-table');\n    if (summaryTable) {\n        var summaryTableWidth = summaryTable[0].offsetWidth;\n        var tableWidth = document.getElementById('table').offsetWidth;\n        return summaryTableWidth < tableWidth ? true : false;\n    }\n    return false;\n}\nfunction createReportContainer(render, resize) {\n    var dummyContainer = (0, _html2canvas_operations.createDummyContainer)();\n    if (resize) {\n        var css = document.createElement('style');\n        css.type = 'text/css';\n        css.id = 'scaling';\n        css.innerHTML = '.ui-main__content{display: inline-block} .table__wrapper{display: inline-block} ';\n        dummyContainer.appendChild(css);\n        render.trigger('renderData', false);\n    }\n    return dummyContainer;\n}\nfunction addTitle(dummyContainer, title) {\n    var titleElement = document.createElement('div');\n    titleElement.id = 'dummy_report_title';\n    titleElement.innerHTML = title;\n    dummyContainer.appendChild(titleElement);\n    return titleElement;\n}\nfunction addDesc(dummyContainer, desc) {\n    var desciptionElement = document.createElement('div');\n    desciptionElement.id = 'dummy_report_desc';\n    desciptionElement.class = 'report-description';\n    desciptionElement.innerHTML = desc;\n    dummyContainer.appendChild(desciptionElement);\n    return desciptionElement;\n}\nfunction addFooter(dummyContainer, filters) {\n    var titleElement = document.createElement('div');\n    var filtersMessage = filters.length > 0 ? 'Data filtered by ' + filters.join(', ') + ' and exported on ' : 'Exported on ';\n    titleElement.id = 'dummy_report_footer';\n    titleElement.innerHTML = '<span>' + filtersMessage + '' + (0, _moment2.default)().format('MMMM D, YYYY') + '. </span> <span>Created with OpenGov</span>';\n    dummyContainer.appendChild(titleElement);\n    return titleElement;\n}\nfunction updateDesc(desc) {\n    var desciptionElement = document.getElementById('dummy_report_desc');\n    if (desciptionElement) desciptionElement.innerHTML = desc;\n}\nfunction updateTitle(title) {\n    var titleElement = document.getElementById('dummy_report_title');\n    if (titleElement) titleElement.innerHTML = title;\n}\nfunction addGraph(id, dummyContainer, type, secondaryGraph) {\n    var graph = document.getElementById('transparency-content').cloneNode(true);\n    graph.id = id;\n    if (type == 'pie' && !secondaryGraph || type != 'pie' && secondaryGraph) {\n        graph.style.display = 'none';\n    }\n    dummyContainer.appendChild(graph);\n    find(dummyContainer, '.wd-show-annotations', function (element) {\n        element.style.cssText = 'display: none;';\n    });\n    return graph;\n}\nfunction find(element, query, callback) {\n    var elems = element.querySelectorAll(query);\n    Array.from(elems).forEach(function (elem) {\n        callback(elem);\n    });\n}\nfunction addCss(element, query, cssStyle) {\n    var elems = element.querySelectorAll(query);\n    Array.from(elems).forEach(function (elem) {\n        elem.style.cssText = cssStyle;\n    });\n}\nfunction removeAttribute(element, query, atrib) {\n    var elems = element.querySelectorAll(query);\n    Array.from(elems).forEach(function (elem) {\n        elem.removeAttribute(atrib);\n    });\n}\nfunction addSummaryTable(dummyContainer, rowsLength) {\n    var summaryTable = document.getElementsByClassName('summary-table')[0].cloneNode(true);\n    summaryTable.id = 'dummySummaryTable';\n    summaryTable.className = summaryTable.className.replace(/\\bsummary-table\\b/, ' ');\n    var isChrome = !!window.chrome && !!window.chrome.webstore;\n    var table = summaryTable.querySelector('#table');\n    var cssStyle = 'position: relative; top: 0px; z-index: 3;';\n    var rowHeader = 'border-right-width: 0px; left: 0px;';\n    find(table, 'thead th', function (element) {\n        element.removeAttribute('data-hint');\n        element.style.cssText = cssStyle;\n    });\n    if (isChrome) {\n        removeAttribute(table, '.ui-drop-item__icon', 'class');\n    }\n    removeAttribute(table, '.icon-info-1', 'class');\n    addCss(table, '.row-header', rowHeader);\n    if (rowsLength > 100) {\n        addCss(table, 'tr', 'height:auto;font-size:10px;');\n    } else {\n        addCss(table, 'tr', 'height:30px;font-size:10px;');\n    }\n    table.id = 'dummyTable';\n    dummyContainer.appendChild(summaryTable);\n    return summaryTable;\n}\nfunction setDownloadOption(option, type) {\n    var graph = document.getElementById('dummyGraph');\n    var table = document.getElementById('dummySummaryTable');\n    var graph2 = document.getElementById('dummyGraph2');\n    if (graph) {\n        graph.style.cssText = 'display: inline-flex;';\n        table.style.cssText = 'display: inline-block';\n        graph2.style.cssText = 'display: none;';\n        if (option == 'table') {\n            graph.style.cssText = 'display: none;';\n        } else if (option == 'chart') {\n            table.style.cssText = 'display: none;';\n            graph.style.cssText = 'display: none;';\n            graph2.style.cssText = 'inline-flex;';\n        } else if (option == 'chart+table' && type == 'pie') {\n            graph.style.cssText = 'display: none;';\n            graph2.style.cssText = 'inline-flex;';\n        }\n    }\n}\nfunction dataURLtoBlob(dataurl) {\n    var arr = dataurl.split(',');\n    var mime = arr[0].match(/:(.*?);/)[1];\n    var bstr = atob(arr[1]);\n    var n = bstr.length;\n    var u8arr = new Uint8Array(n);\n    while (n--) {\n        u8arr[n] = bstr.charCodeAt(n);\n    }\n    return new Blob([u8arr], { type: mime });\n}\nfunction convertCanvasToImage(canvas) {\n    currentCanvas = canvas;\n    var imgData = canvas.toDataURL({ format: 'png', multiplier: 4 });\n    var blob = dataURLtoBlob(imgData);\n    return URL.createObjectURL(blob);\n}\nfunction downloadPreviewImage(filename) {\n    if (currentCanvas.msToBlob) {\n        var blob = currentCanvas.msToBlob();\n        window.navigator.msSaveBlob(blob, filename + '.png');\n    } else {\n        var a = document.createElement('a');\n        var preview = document.getElementsByClassName('download_preview_image')[0];\n        a.href = preview.src;\n        document.body.appendChild(a);\n        a.download = filename;\n        a.click();\n        a.remove();\n    }\n}\nfunction generatePreview(statusCallBack, previewCallBack, option) {\n    var dummyContainer = document.getElementById('dummyContainer');\n    if (dummyContainer) {\n        dummyContainer.style.display = 'inline-block';\n    }\n    statusCallBack(true);\n    (0, _html2canvas_operations.generateCanvas)(function (canvas) {\n        var image = convertCanvasToImage(canvas);\n        var preview = document.getElementsByClassName('download_preview_image')[0];\n        preview.src = image;\n        statusCallBack(false);\n        if (previewCallBack) {\n            previewCallBack(option);\n        }\n    });\n}\nfunction printSetup(option) {\n    var dummyContainer = document.getElementById('dummyContainer');\n    if (dummyContainer) {\n        var dummySummaryTable = document.getElementById('dummySummaryTable');\n        dummyContainer.style.display = 'block';\n        if (option != 'chart') {\n            dummySummaryTable.style.display = 'block';\n        }\n    }\n}\nfunction removeDummyReport() {\n    (0, _html2canvas_operations.removeDummyContainer)();\n    document.documentElement.style.overflow = 'auto';\n}\n\n/***/ }),\n/* 1519 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.convertSvgToCanvas = convertSvgToCanvas;\nexports.createDummyContainer = createDummyContainer;\nexports.removeDummyContainer = removeDummyContainer;\nexports.generateCanvas = generateCanvas;\n\nvar _html2canvas = __webpack_require__(1520);\n\nvar _html2canvas2 = _interopRequireDefault(_html2canvas);\n\nvar _canvg = __webpack_require__(1542);\n\nvar _canvg2 = _interopRequireDefault(_canvg);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction convertSvgToCanvas(graph) {\n    var svgimage = graph.querySelector('svg');\n    if (svgimage) {\n        var serializer = new XMLSerializer();\n        var str = serializer.serializeToString(svgimage);\n        var canvas = document.createElement('canvas');\n        canvas.setAttribute('width', '150px;');\n        canvas.setAttribute('height', '150px;');\n        (0, _canvg2.default)(canvas, str);\n        var image = document.createElement('img');\n        var imgData = canvas.toDataURL();\n        image.src = imgData;\n        graph.querySelector('svg').parentNode.replaceChild(image, svgimage);\n    }\n}\nfunction createDummyContainer() {\n    var dummyContainer = document.createElement('div');\n    dummyContainer.id = 'dummyContainer';\n    dummyContainer.style.cssText = 'display: inline-block; background: white; font-family: arial;';\n    document.body.appendChild(dummyContainer);\n    return dummyContainer;\n}\nfunction removeDummyContainer() {\n    var element = document.getElementById('dummyContainer');\n    element.parentNode.removeChild(element);\n}\nfunction generateCanvas(callback) {\n    var doc = document.getElementById('dummyContainer');\n    if (doc) {\n        (0, _html2canvas2.default)(doc, {\n            logging: false,\n            useCORS: true,\n            scale: 1.5,\n            allowTaint: true\n        }).then(function (canvas) {\n            callback(canvas);\n        });\n    }\n}\n\n/***/ }),\n/* 1520 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _CanvasRenderer = __webpack_require__(668);\n\nvar _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer);\n\nvar _Logger = __webpack_require__(669);\n\nvar _Logger2 = _interopRequireDefault(_Logger);\n\nvar _Window = __webpack_require__(1521);\n\nvar _Bounds = __webpack_require__(93);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar html2canvas = function html2canvas(element, conf) {\n    // eslint-disable-next-line no-console\n    if ((typeof console === 'undefined' ? 'undefined' : _typeof(console)) === 'object' && typeof console.log === 'function') {\n        // eslint-disable-next-line no-console\n        console.log('html2canvas ' + \"$npm_package_version\");\n    }\n\n    var config = conf || {};\n    var logger = new _Logger2.default(typeof config.logging === 'boolean' ? config.logging : true);\n\n    if (false) {\n        logger.error('onrendered option is deprecated, html2canvas returns a Promise with the canvas as the value');\n    }\n\n    var ownerDocument = element.ownerDocument;\n    if (!ownerDocument) {\n        return Promise.reject('Provided element is not within a Document');\n    }\n    var defaultView = ownerDocument.defaultView;\n\n    var scrollX = defaultView.pageXOffset;\n    var scrollY = defaultView.pageYOffset;\n\n    var isDocument = element.tagName === 'HTML' || element.tagName === 'BODY';\n\n    var _ref = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(element, scrollX, scrollY),\n        width = _ref.width,\n        height = _ref.height,\n        left = _ref.left,\n        top = _ref.top;\n\n    var defaultOptions = {\n        async: true,\n        allowTaint: false,\n        backgroundColor: '#ffffff',\n        imageTimeout: 15000,\n        logging: true,\n        proxy: null,\n        removeContainer: true,\n        foreignObjectRendering: false,\n        scale: defaultView.devicePixelRatio || 1,\n        target: new _CanvasRenderer2.default(config.canvas),\n        x: left,\n        y: top,\n        width: Math.ceil(width),\n        height: Math.ceil(height),\n        windowWidth: defaultView.innerWidth,\n        windowHeight: defaultView.innerHeight,\n        scrollX: defaultView.pageXOffset,\n        scrollY: defaultView.pageYOffset\n    };\n\n    var result = (0, _Window.renderElement)(element, _extends({}, defaultOptions, config), logger);\n\n    if (false) {\n        return result.catch(function (e) {\n            logger.error(e);\n            throw e;\n        });\n    }\n    return result;\n};\n\nhtml2canvas.CanvasRenderer = _CanvasRenderer2.default;\n\nmodule.exports = html2canvas;\n\n/***/ }),\n/* 1521 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.renderElement = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _Logger = __webpack_require__(669);\n\nvar _Logger2 = _interopRequireDefault(_Logger);\n\nvar _NodeParser = __webpack_require__(1522);\n\nvar _Renderer = __webpack_require__(1537);\n\nvar _Renderer2 = _interopRequireDefault(_Renderer);\n\nvar _ForeignObjectRenderer = __webpack_require__(675);\n\nvar _ForeignObjectRenderer2 = _interopRequireDefault(_ForeignObjectRenderer);\n\nvar _Feature = __webpack_require__(228);\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nvar _Bounds = __webpack_require__(93);\n\nvar _Clone = __webpack_require__(1540);\n\nvar _Font = __webpack_require__(676);\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar renderElement = exports.renderElement = function renderElement(element, options, logger) {\n    var ownerDocument = element.ownerDocument;\n\n    var windowBounds = new _Bounds.Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight);\n\n    // http://www.w3.org/TR/css3-background/#special-backgrounds\n    var documentBackgroundColor = ownerDocument.documentElement ? new _Color2.default(getComputedStyle(ownerDocument.documentElement).backgroundColor) : _Color.TRANSPARENT;\n    var bodyBackgroundColor = ownerDocument.body ? new _Color2.default(getComputedStyle(ownerDocument.body).backgroundColor) : _Color.TRANSPARENT;\n\n    var backgroundColor = element === ownerDocument.documentElement ? documentBackgroundColor.isTransparent() ? bodyBackgroundColor.isTransparent() ? options.backgroundColor ? new _Color2.default(options.backgroundColor) : null : bodyBackgroundColor : documentBackgroundColor : options.backgroundColor ? new _Color2.default(options.backgroundColor) : null;\n\n    return (options.foreignObjectRendering ? // $FlowFixMe\n    _Feature2.default.SUPPORT_FOREIGNOBJECT_DRAWING : Promise.resolve(false)).then(function (supportForeignObject) {\n        return supportForeignObject ? function (cloner) {\n            if (false) {\n                logger.log('Document cloned, using foreignObject rendering');\n            }\n\n            return cloner.inlineFonts(ownerDocument).then(function () {\n                return cloner.resourceLoader.ready();\n            }).then(function () {\n                var renderer = new _ForeignObjectRenderer2.default(cloner.documentElement);\n                return renderer.render({\n                    backgroundColor: backgroundColor,\n                    logger: logger,\n                    scale: options.scale,\n                    x: options.x,\n                    y: options.y,\n                    width: options.width,\n                    height: options.height,\n                    windowWidth: options.windowWidth,\n                    windowHeight: options.windowHeight,\n                    scrollX: options.scrollX,\n                    scrollY: options.scrollY\n                });\n            });\n        }(new _Clone.DocumentCloner(element, options, logger, true, renderElement)) : (0, _Clone.cloneWindow)(ownerDocument, windowBounds, element, options, logger, renderElement).then(function (_ref) {\n            var _ref2 = _slicedToArray(_ref, 3),\n                container = _ref2[0],\n                clonedElement = _ref2[1],\n                resourceLoader = _ref2[2];\n\n            if (false) {\n                logger.log('Document cloned, using computed rendering');\n            }\n\n            var stack = (0, _NodeParser.NodeParser)(clonedElement, resourceLoader, logger);\n            var clonedDocument = clonedElement.ownerDocument;\n\n            if (backgroundColor === stack.container.style.background.backgroundColor) {\n                stack.container.style.background.backgroundColor = _Color.TRANSPARENT;\n            }\n\n            return resourceLoader.ready().then(function (imageStore) {\n                if (options.removeContainer === true) {\n                    if (container.parentNode) {\n                        container.parentNode.removeChild(container);\n                    } else if (false) {\n                        logger.log('Cannot detach cloned iframe as it is not in the DOM anymore');\n                    }\n                }\n\n                var fontMetrics = new _Font.FontMetrics(clonedDocument);\n                if (false) {\n                    logger.log('Starting renderer');\n                }\n\n                var renderOptions = {\n                    backgroundColor: backgroundColor,\n                    fontMetrics: fontMetrics,\n                    imageStore: imageStore,\n                    logger: logger,\n                    scale: options.scale,\n                    x: options.x,\n                    y: options.y,\n                    width: options.width,\n                    height: options.height\n                };\n\n                if (Array.isArray(options.target)) {\n                    return Promise.all(options.target.map(function (target) {\n                        var renderer = new _Renderer2.default(target, renderOptions);\n                        return renderer.render(stack);\n                    }));\n                } else {\n                    var renderer = new _Renderer2.default(options.target, renderOptions);\n                    return renderer.render(stack);\n                }\n            });\n        });\n    });\n};\n\n/***/ }),\n/* 1522 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.NodeParser = undefined;\n\nvar _StackingContext = __webpack_require__(1523);\n\nvar _StackingContext2 = _interopRequireDefault(_StackingContext);\n\nvar _NodeContainer = __webpack_require__(225);\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _TextContainer = __webpack_require__(321);\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _Input = __webpack_require__(673);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NodeParser = exports.NodeParser = function NodeParser(node, resourceLoader, logger) {\n    if (false) {\n        logger.log('Starting node parsing');\n    }\n\n    var index = 0;\n\n    var container = new _NodeContainer2.default(node, null, resourceLoader, index++);\n    var stack = new _StackingContext2.default(container, null, true);\n\n    parseNodeTree(node, container, stack, resourceLoader, index);\n\n    if (false) {\n        logger.log('Finished parsing node tree');\n    }\n\n    return stack;\n};\n\nvar IGNORED_NODE_NAMES = ['SCRIPT', 'HEAD', 'TITLE', 'OBJECT', 'BR', 'OPTION'];\n\nvar parseNodeTree = function parseNodeTree(node, parent, stack, resourceLoader, index) {\n    if (false) {\n        throw new Error('Recursion error while parsing node tree');\n    }\n\n    for (var childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {\n        nextNode = childNode.nextSibling;\n        var defaultView = childNode.ownerDocument.defaultView;\n        if (childNode instanceof defaultView.Text || childNode instanceof Text || defaultView.parent && childNode instanceof defaultView.parent.Text) {\n            if (childNode.data.trim().length > 0) {\n                parent.childNodes.push(_TextContainer2.default.fromTextNode(childNode, parent));\n            }\n        } else if (childNode instanceof defaultView.HTMLElement || childNode instanceof HTMLElement || defaultView.parent && childNode instanceof defaultView.parent.HTMLElement) {\n            if (IGNORED_NODE_NAMES.indexOf(childNode.nodeName) === -1) {\n                var container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++);\n                if (container.isVisible()) {\n                    if (childNode.tagName === 'INPUT') {\n                        // $FlowFixMe\n                        (0, _Input.inlineInputElement)(childNode, container);\n                    } else if (childNode.tagName === 'TEXTAREA') {\n                        // $FlowFixMe\n                        (0, _Input.inlineTextAreaElement)(childNode, container);\n                    } else if (childNode.tagName === 'SELECT') {\n                        // $FlowFixMe\n                        (0, _Input.inlineSelectElement)(childNode, container);\n                    }\n\n                    var SHOULD_TRAVERSE_CHILDREN = childNode.tagName !== 'TEXTAREA';\n                    var treatAsRealStackingContext = createsRealStackingContext(container, childNode);\n                    if (treatAsRealStackingContext || createsStackingContext(container)) {\n                        // for treatAsRealStackingContext:false, any positioned descendants and descendants\n                        // which actually create a new stacking context should be considered part of the parent stacking context\n                        var parentStack = treatAsRealStackingContext || container.isPositioned() ? stack.getRealParentStackingContext() : stack;\n                        var childStack = new _StackingContext2.default(container, parentStack, treatAsRealStackingContext);\n                        parentStack.contexts.push(childStack);\n                        if (SHOULD_TRAVERSE_CHILDREN) {\n                            parseNodeTree(childNode, container, childStack, resourceLoader, index);\n                        }\n                    } else {\n                        stack.children.push(container);\n                        if (SHOULD_TRAVERSE_CHILDREN) {\n                            parseNodeTree(childNode, container, stack, resourceLoader, index);\n                        }\n                    }\n                }\n            }\n        } else if (childNode instanceof defaultView.SVGSVGElement || childNode instanceof SVGSVGElement || defaultView.parent && childNode instanceof defaultView.parent.SVGSVGElement) {\n            var _container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++);\n            var _treatAsRealStackingContext = createsRealStackingContext(_container, childNode);\n            if (_treatAsRealStackingContext || createsStackingContext(_container)) {\n                // for treatAsRealStackingContext:false, any positioned descendants and descendants\n                // which actually create a new stacking context should be considered part of the parent stacking context\n                var _parentStack = _treatAsRealStackingContext || _container.isPositioned() ? stack.getRealParentStackingContext() : stack;\n                var _childStack = new _StackingContext2.default(_container, _parentStack, _treatAsRealStackingContext);\n                _parentStack.contexts.push(_childStack);\n            } else {\n                stack.children.push(_container);\n            }\n        }\n    }\n};\n\nvar createsRealStackingContext = function createsRealStackingContext(container, node) {\n    return container.isRootElement() || container.isPositionedWithZIndex() || container.style.opacity < 1 || container.isTransformed() || isBodyWithTransparentRoot(container, node);\n};\n\nvar createsStackingContext = function createsStackingContext(container) {\n    return container.isPositioned() || container.isFloating();\n};\n\nvar isBodyWithTransparentRoot = function isBodyWithTransparentRoot(container, node) {\n    return node.nodeName === 'BODY' && container.parent instanceof _NodeContainer2.default && container.parent.style.background.backgroundColor.isTransparent();\n};\n\n/***/ }),\n/* 1523 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _NodeContainer = __webpack_require__(225);\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _position = __webpack_require__(671);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar StackingContext = function () {\n    function StackingContext(container, parent, treatAsRealStackingContext) {\n        _classCallCheck(this, StackingContext);\n\n        this.container = container;\n        this.parent = parent;\n        this.contexts = [];\n        this.children = [];\n        this.treatAsRealStackingContext = treatAsRealStackingContext;\n    }\n\n    _createClass(StackingContext, [{\n        key: 'getOpacity',\n        value: function getOpacity() {\n            return this.parent ? this.container.style.opacity * this.parent.getOpacity() : this.container.style.opacity;\n        }\n    }, {\n        key: 'getRealParentStackingContext',\n        value: function getRealParentStackingContext() {\n            return !this.parent || this.treatAsRealStackingContext ? this : this.parent.getRealParentStackingContext();\n        }\n    }]);\n\n    return StackingContext;\n}();\n\nexports.default = StackingContext;\n\n/***/ }),\n/* 1524 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Size = function Size(width, height) {\n    _classCallCheck(this, Size);\n\n    this.width = width;\n    this.height = height;\n};\n\nexports.default = Size;\n\n/***/ }),\n/* 1525 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Path = __webpack_require__(224);\n\nvar _Vector = __webpack_require__(227);\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar lerp = function lerp(a, b, t) {\n    return new _Vector2.default(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\n};\n\nvar BezierCurve = function () {\n    function BezierCurve(start, startControl, endControl, end) {\n        _classCallCheck(this, BezierCurve);\n\n        this.type = _Path.PATH.BEZIER_CURVE;\n        this.start = start;\n        this.startControl = startControl;\n        this.endControl = endControl;\n        this.end = end;\n    }\n\n    _createClass(BezierCurve, [{\n        key: 'subdivide',\n        value: function subdivide(t, firstHalf) {\n            var ab = lerp(this.start, this.startControl, t);\n            var bc = lerp(this.startControl, this.endControl, t);\n            var cd = lerp(this.endControl, this.end, t);\n            var abbc = lerp(ab, bc, t);\n            var bccd = lerp(bc, cd, t);\n            var dest = lerp(abbc, bccd, t);\n            return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);\n        }\n    }, {\n        key: 'reverse',\n        value: function reverse() {\n            return new BezierCurve(this.end, this.endControl, this.startControl, this.start);\n        }\n    }]);\n\n    return BezierCurve;\n}();\n\nexports.default = BezierCurve;\n\n/***/ }),\n/* 1526 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBorderRadius = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SIDES = ['top-left', 'top-right', 'bottom-right', 'bottom-left'];\n\nvar parseBorderRadius = exports.parseBorderRadius = function parseBorderRadius(style) {\n    return SIDES.map(function (side) {\n        var value = style.getPropertyValue('border-' + side + '-radius');\n\n        var _value$split$map = value.split(' ').map(_Length2.default.create),\n            _value$split$map2 = _slicedToArray(_value$split$map, 2),\n            horizontal = _value$split$map2[0],\n            vertical = _value$split$map2[1];\n\n        return typeof vertical === 'undefined' ? [horizontal, horizontal] : [horizontal, vertical];\n    });\n};\n\n/***/ }),\n/* 1527 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar DISPLAY = exports.DISPLAY = {\n    NONE: 1 << 0,\n    BLOCK: 1 << 1,\n    INLINE: 1 << 2,\n    RUN_IN: 1 << 3,\n    FLOW: 1 << 4,\n    FLOW_ROOT: 1 << 5,\n    TABLE: 1 << 6,\n    FLEX: 1 << 7,\n    GRID: 1 << 8,\n    RUBY: 1 << 9,\n    SUBGRID: 1 << 10,\n    LIST_ITEM: 1 << 11,\n    TABLE_ROW_GROUP: 1 << 12,\n    TABLE_HEADER_GROUP: 1 << 13,\n    TABLE_FOOTER_GROUP: 1 << 14,\n    TABLE_ROW: 1 << 15,\n    TABLE_CELL: 1 << 16,\n    TABLE_COLUMN_GROUP: 1 << 17,\n    TABLE_COLUMN: 1 << 18,\n    TABLE_CAPTION: 1 << 19,\n    RUBY_BASE: 1 << 20,\n    RUBY_TEXT: 1 << 21,\n    RUBY_BASE_CONTAINER: 1 << 22,\n    RUBY_TEXT_CONTAINER: 1 << 23,\n    CONTENTS: 1 << 24,\n    INLINE_BLOCK: 1 << 25,\n    INLINE_LIST_ITEM: 1 << 26,\n    INLINE_TABLE: 1 << 27,\n    INLINE_FLEX: 1 << 28,\n    INLINE_GRID: 1 << 29\n};\n\nvar parseDisplayValue = function parseDisplayValue(display) {\n    switch (display) {\n        case 'block':\n            return DISPLAY.BLOCK;\n        case 'inline':\n            return DISPLAY.INLINE;\n        case 'run-in':\n            return DISPLAY.RUN_IN;\n        case 'flow':\n            return DISPLAY.FLOW;\n        case 'flow-root':\n            return DISPLAY.FLOW_ROOT;\n        case 'table':\n            return DISPLAY.TABLE;\n        case 'flex':\n            return DISPLAY.FLEX;\n        case 'grid':\n            return DISPLAY.GRID;\n        case 'ruby':\n            return DISPLAY.RUBY;\n        case 'subgrid':\n            return DISPLAY.SUBGRID;\n        case 'list-item':\n            return DISPLAY.LIST_ITEM;\n        case 'table-row-group':\n            return DISPLAY.TABLE_ROW_GROUP;\n        case 'table-header-group':\n            return DISPLAY.TABLE_HEADER_GROUP;\n        case 'table-footer-group':\n            return DISPLAY.TABLE_FOOTER_GROUP;\n        case 'table-row':\n            return DISPLAY.TABLE_ROW;\n        case 'table-cell':\n            return DISPLAY.TABLE_CELL;\n        case 'table-column-group':\n            return DISPLAY.TABLE_COLUMN_GROUP;\n        case 'table-column':\n            return DISPLAY.TABLE_COLUMN;\n        case 'table-caption':\n            return DISPLAY.TABLE_CAPTION;\n        case 'ruby-base':\n            return DISPLAY.RUBY_BASE;\n        case 'ruby-text':\n            return DISPLAY.RUBY_TEXT;\n        case 'ruby-base-container':\n            return DISPLAY.RUBY_BASE_CONTAINER;\n        case 'ruby-text-container':\n            return DISPLAY.RUBY_TEXT_CONTAINER;\n        case 'contents':\n            return DISPLAY.CONTENTS;\n        case 'inline-block':\n            return DISPLAY.INLINE_BLOCK;\n        case 'inline-list-item':\n            return DISPLAY.INLINE_LIST_ITEM;\n        case 'inline-table':\n            return DISPLAY.INLINE_TABLE;\n        case 'inline-flex':\n            return DISPLAY.INLINE_FLEX;\n        case 'inline-grid':\n            return DISPLAY.INLINE_GRID;\n    }\n\n    return DISPLAY.NONE;\n};\n\nvar setDisplayBit = function setDisplayBit(bit, display) {\n    return bit | parseDisplayValue(display);\n};\n\nvar parseDisplay = exports.parseDisplay = function parseDisplay(display) {\n    return display.split(' ').reduce(setDisplayBit, 0);\n};\n\n/***/ }),\n/* 1528 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar FLOAT = exports.FLOAT = {\n    NONE: 0,\n    LEFT: 1,\n    RIGHT: 2,\n    INLINE_START: 3,\n    INLINE_END: 4\n};\n\nvar parseCSSFloat = exports.parseCSSFloat = function parseCSSFloat(float) {\n    switch (float) {\n        case 'left':\n            return FLOAT.LEFT;\n        case 'right':\n            return FLOAT.RIGHT;\n        case 'inline-start':\n            return FLOAT.INLINE_START;\n        case 'inline-end':\n            return FLOAT.INLINE_END;\n    }\n    return FLOAT.NONE;\n};\n\n/***/ }),\n/* 1529 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n\nvar parseFontWeight = function parseFontWeight(weight) {\n    switch (weight) {\n        case 'normal':\n            return 400;\n        case 'bold':\n            return 700;\n    }\n\n    var value = parseInt(weight, 10);\n    return isNaN(value) ? 400 : value;\n};\n\nvar parseFont = exports.parseFont = function parseFont(style) {\n    var fontFamily = style.fontFamily;\n    var fontSize = style.fontSize;\n    var fontStyle = style.fontStyle;\n    var fontVariant = style.fontVariant;\n    var fontWeight = parseFontWeight(style.fontWeight);\n\n    return {\n        fontFamily: fontFamily,\n        fontSize: fontSize,\n        fontStyle: fontStyle,\n        fontVariant: fontVariant,\n        fontWeight: fontWeight\n    };\n};\n\n/***/ }),\n/* 1530 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar parseLetterSpacing = exports.parseLetterSpacing = function parseLetterSpacing(letterSpacing) {\n    if (letterSpacing === 'normal') {\n        return 0;\n    }\n    var value = parseFloat(letterSpacing);\n    return isNaN(value) ? 0 : value;\n};\n\n/***/ }),\n/* 1531 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar OVERFLOW = exports.OVERFLOW = {\n    VISIBLE: 0,\n    HIDDEN: 1,\n    SCROLL: 2,\n    AUTO: 3\n};\n\nvar parseOverflow = exports.parseOverflow = function parseOverflow(overflow) {\n    switch (overflow) {\n        case 'hidden':\n            return OVERFLOW.HIDDEN;\n        case 'scroll':\n            return OVERFLOW.SCROLL;\n        case 'auto':\n            return OVERFLOW.AUTO;\n        case 'visible':\n        default:\n            return OVERFLOW.VISIBLE;\n    }\n};\n\n/***/ }),\n/* 1532 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextShadow = undefined;\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NUMBER = /^([+-]|\\d|\\.)$/i;\n\nvar parseTextShadow = exports.parseTextShadow = function parseTextShadow(textShadow) {\n    if (textShadow === 'none' || typeof textShadow !== 'string') {\n        return null;\n    }\n\n    var currentValue = '';\n    var isLength = false;\n    var values = [];\n    var shadows = [];\n    var numParens = 0;\n    var color = null;\n\n    var appendValue = function appendValue() {\n        if (currentValue.length) {\n            if (isLength) {\n                values.push(parseFloat(currentValue));\n            } else {\n                color = new _Color2.default(currentValue);\n            }\n        }\n        isLength = false;\n        currentValue = '';\n    };\n\n    var appendShadow = function appendShadow() {\n        if (values.length && color !== null) {\n            shadows.push({\n                color: color,\n                offsetX: values[0] || 0,\n                offsetY: values[1] || 0,\n                blur: values[2] || 0\n            });\n        }\n        values.splice(0, values.length);\n        color = null;\n    };\n\n    for (var i = 0; i < textShadow.length; i++) {\n        var c = textShadow[i];\n        switch (c) {\n            case '(':\n                currentValue += c;\n                numParens++;\n                break;\n            case ')':\n                currentValue += c;\n                numParens--;\n                break;\n            case ',':\n                if (numParens === 0) {\n                    appendValue();\n                    appendShadow();\n                } else {\n                    currentValue += c;\n                }\n                break;\n            case ' ':\n                if (numParens === 0) {\n                    appendValue();\n                } else {\n                    currentValue += c;\n                }\n                break;\n            default:\n                if (currentValue.length === 0 && NUMBER.test(c)) {\n                    isLength = true;\n                }\n                currentValue += c;\n        }\n    }\n\n    appendValue();\n    appendShadow();\n\n    if (shadows.length === 0) {\n        return null;\n    }\n\n    return shadows;\n};\n\n/***/ }),\n/* 1533 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTransform = undefined;\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toFloat = function toFloat(s) {\n    return parseFloat(s.trim());\n};\n\nvar MATRIX = /(matrix|matrix3d)\\((.+)\\)/;\n\nvar parseTransform = exports.parseTransform = function parseTransform(style) {\n    var transform = parseTransformMatrix(style.transform || style.webkitTransform || style.mozTransform ||\n    // $FlowFixMe\n    style.msTransform ||\n    // $FlowFixMe\n    style.oTransform);\n    if (transform === null) {\n        return null;\n    }\n\n    return {\n        transform: transform,\n        transformOrigin: parseTransformOrigin(style.transformOrigin || style.webkitTransformOrigin || style.mozTransformOrigin ||\n        // $FlowFixMe\n        style.msTransformOrigin ||\n        // $FlowFixMe\n        style.oTransformOrigin)\n    };\n};\n\n// $FlowFixMe\nvar parseTransformOrigin = function parseTransformOrigin(origin) {\n    if (typeof origin !== 'string') {\n        var v = new _Length2.default('0');\n        return [v, v];\n    }\n    var values = origin.split(' ').map(_Length2.default.create);\n    return [values[0], values[1]];\n};\n\n// $FlowFixMe\nvar parseTransformMatrix = function parseTransformMatrix(transform) {\n    if (transform === 'none' || typeof transform !== 'string') {\n        return null;\n    }\n\n    var match = transform.match(MATRIX);\n    if (match) {\n        if (match[1] === 'matrix') {\n            var matrix = match[2].split(',').map(toFloat);\n            return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]];\n        } else {\n            var matrix3d = match[2].split(',').map(toFloat);\n            return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]];\n        }\n    }\n    return null;\n};\n\n/***/ }),\n/* 1534 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar VISIBILITY = exports.VISIBILITY = {\n    VISIBLE: 0,\n    HIDDEN: 1,\n    COLLAPSE: 2\n};\n\nvar parseVisibility = exports.parseVisibility = function parseVisibility(visibility) {\n    switch (visibility) {\n        case 'hidden':\n            return VISIBILITY.HIDDEN;\n        case 'collapse':\n            return VISIBILITY.COLLAPSE;\n        case 'visible':\n        default:\n            return VISIBILITY.VISIBLE;\n    }\n};\n\n/***/ }),\n/* 1535 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar parseZIndex = exports.parseZIndex = function parseZIndex(zIndex) {\n    var auto = zIndex === 'auto';\n    return {\n        auto: auto,\n        order: auto ? 0 : parseInt(zIndex, 10)\n    };\n};\n\n/***/ }),\n/* 1536 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _Path = __webpack_require__(224);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Circle = function Circle(x, y, radius) {\n    _classCallCheck(this, Circle);\n\n    this.type = _Path.PATH.CIRCLE;\n    this.x = x;\n    this.y = y;\n    this.radius = radius;\n    if (false) {\n        if (isNaN(x)) {\n            console.error('Invalid x value given for Circle');\n        }\n        if (isNaN(y)) {\n            console.error('Invalid y value given for Circle');\n        }\n        if (isNaN(radius)) {\n            console.error('Invalid radius value given for Circle');\n        }\n    }\n};\n\nexports.default = Circle;\n\n/***/ }),\n/* 1537 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Bounds = __webpack_require__(93);\n\nvar _Font = __webpack_require__(676);\n\nvar _Gradient = __webpack_require__(1538);\n\nvar _TextContainer = __webpack_require__(321);\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _background = __webpack_require__(226);\n\nvar _border = __webpack_require__(320);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function () {\n    function Renderer(target, options) {\n        _classCallCheck(this, Renderer);\n\n        this.target = target;\n        this.options = options;\n        target.render(options);\n    }\n\n    _createClass(Renderer, [{\n        key: 'renderNode',\n        value: function renderNode(container) {\n            if (container.isVisible()) {\n                this.renderNodeBackgroundAndBorders(container);\n                this.renderNodeContent(container);\n            }\n        }\n    }, {\n        key: 'renderNodeContent',\n        value: function renderNodeContent(container) {\n            var _this = this;\n\n            var callback = function callback() {\n                if (container.childNodes.length) {\n                    container.childNodes.forEach(function (child) {\n                        if (child instanceof _TextContainer2.default) {\n                            var style = child.parent.style;\n                            _this.target.renderTextNode(child.bounds, style.color, style.font, style.textDecoration, style.textShadow);\n                        } else {\n                            _this.target.drawShape(child, container.style.color);\n                        }\n                    });\n                }\n\n                if (container.image) {\n                    var _image = _this.options.imageStore.get(container.image);\n                    if (_image) {\n                        var contentBox = (0, _Bounds.calculateContentBox)(container.bounds, container.style.padding, container.style.border);\n                        var _width = typeof _image.width === 'number' && _image.width > 0 ? _image.width : contentBox.width;\n                        var _height = typeof _image.height === 'number' && _image.height > 0 ? _image.height : contentBox.height;\n                        if (_width > 0 && _height > 0) {\n                            _this.target.clip([(0, _Bounds.calculatePaddingBoxPath)(container.curvedBounds)], function () {\n                                _this.target.drawImage(_image, new _Bounds.Bounds(0, 0, _width, _height), contentBox);\n                            });\n                        }\n                    }\n                }\n            };\n            var paths = container.getClipPaths();\n            if (paths.length) {\n                this.target.clip(paths, callback);\n            } else {\n                callback();\n            }\n        }\n    }, {\n        key: 'renderNodeBackgroundAndBorders',\n        value: function renderNodeBackgroundAndBorders(container) {\n            var _this2 = this;\n\n            var HAS_BACKGROUND = !container.style.background.backgroundColor.isTransparent() || container.style.background.backgroundImage.length;\n\n            var renderableBorders = container.style.border.filter(function (border) {\n                return border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent();\n            });\n\n            var callback = function callback() {\n                var backgroundPaintingArea = (0, _background.calculateBackgroungPaintingArea)(container.curvedBounds, container.style.background.backgroundClip);\n\n                if (HAS_BACKGROUND) {\n                    _this2.target.clip([backgroundPaintingArea], function () {\n                        if (!container.style.background.backgroundColor.isTransparent()) {\n                            _this2.target.fill(container.style.background.backgroundColor);\n                        }\n\n                        _this2.renderBackgroundImage(container);\n                    });\n                }\n\n                renderableBorders.forEach(function (border, side) {\n                    _this2.renderBorder(border, side, container.curvedBounds);\n                });\n            };\n\n            if (HAS_BACKGROUND || renderableBorders.length) {\n                var paths = container.parent ? container.parent.getClipPaths() : [];\n                if (paths.length) {\n                    this.target.clip(paths, callback);\n                } else {\n                    callback();\n                }\n            }\n        }\n    }, {\n        key: 'renderBackgroundImage',\n        value: function renderBackgroundImage(container) {\n            var _this3 = this;\n\n            container.style.background.backgroundImage.slice(0).reverse().forEach(function (backgroundImage) {\n                if (backgroundImage.source.method === 'url' && backgroundImage.source.args.length) {\n                    _this3.renderBackgroundRepeat(container, backgroundImage);\n                } else if (/gradient/i.test(backgroundImage.source.method)) {\n                    _this3.renderBackgroundGradient(container, backgroundImage);\n                }\n            });\n        }\n    }, {\n        key: 'renderBackgroundRepeat',\n        value: function renderBackgroundRepeat(container, background) {\n            var image = this.options.imageStore.get(background.source.args[0]);\n            if (image) {\n                var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border);\n                var backgroundImageSize = (0, _background.calculateBackgroundSize)(background, image, backgroundPositioningArea);\n                var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea);\n                var _path = (0, _background.calculateBackgroundRepeatPath)(background, position, backgroundImageSize, backgroundPositioningArea, container.bounds);\n\n                var _offsetX = Math.round(backgroundPositioningArea.left + position.x);\n                var _offsetY = Math.round(backgroundPositioningArea.top + position.y);\n                this.target.renderRepeat(_path, image, backgroundImageSize, _offsetX, _offsetY);\n            }\n        }\n    }, {\n        key: 'renderBackgroundGradient',\n        value: function renderBackgroundGradient(container, background) {\n            var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border);\n            var backgroundImageSize = (0, _background.calculateGradientBackgroundSize)(background, backgroundPositioningArea);\n            var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea);\n            var gradientBounds = new _Bounds.Bounds(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y), backgroundImageSize.width, backgroundImageSize.height);\n\n            var gradient = (0, _Gradient.parseGradient)(container, background.source, gradientBounds);\n            if (gradient) {\n                switch (gradient.type) {\n                    case _Gradient.GRADIENT_TYPE.LINEAR_GRADIENT:\n                        // $FlowFixMe\n                        this.target.renderLinearGradient(gradientBounds, gradient);\n                        break;\n                    case _Gradient.GRADIENT_TYPE.RADIAL_GRADIENT:\n                        // $FlowFixMe\n                        this.target.renderRadialGradient(gradientBounds, gradient);\n                        break;\n                }\n            }\n        }\n    }, {\n        key: 'renderBorder',\n        value: function renderBorder(border, side, curvePoints) {\n            this.target.drawShape((0, _Bounds.parsePathForBorder)(curvePoints, side), border.borderColor);\n        }\n    }, {\n        key: 'renderStack',\n        value: function renderStack(stack) {\n            var _this4 = this;\n\n            if (stack.container.isVisible()) {\n                var _opacity = stack.getOpacity();\n                if (_opacity !== this._opacity) {\n                    this.target.setOpacity(stack.getOpacity());\n                    this._opacity = _opacity;\n                }\n\n                var _transform = stack.container.style.transform;\n                if (_transform !== null) {\n                    this.target.transform(stack.container.bounds.left + _transform.transformOrigin[0].value, stack.container.bounds.top + _transform.transformOrigin[1].value, _transform.transform, function () {\n                        return _this4.renderStackContent(stack);\n                    });\n                } else {\n                    this.renderStackContent(stack);\n                }\n            }\n        }\n    }, {\n        key: 'renderStackContent',\n        value: function renderStackContent(stack) {\n            var _splitStackingContext = splitStackingContexts(stack),\n                _splitStackingContext2 = _slicedToArray(_splitStackingContext, 5),\n                negativeZIndex = _splitStackingContext2[0],\n                zeroOrAutoZIndexOrTransformedOrOpacity = _splitStackingContext2[1],\n                positiveZIndex = _splitStackingContext2[2],\n                nonPositionedFloats = _splitStackingContext2[3],\n                nonPositionedInlineLevel = _splitStackingContext2[4];\n\n            var _splitDescendants = splitDescendants(stack),\n                _splitDescendants2 = _slicedToArray(_splitDescendants, 2),\n                inlineLevel = _splitDescendants2[0],\n                nonInlineLevel = _splitDescendants2[1];\n\n            // https://www.w3.org/TR/css-position-3/#painting-order\n            // 1. the background and borders of the element forming the stacking context.\n\n\n            this.renderNodeBackgroundAndBorders(stack.container);\n            // 2. the child stacking contexts with negative stack levels (most negative first).\n            negativeZIndex.sort(sortByZIndex).forEach(this.renderStack, this);\n            // 3. For all its in-flow, non-positioned, block-level descendants in tree order:\n            this.renderNodeContent(stack.container);\n            nonInlineLevel.forEach(this.renderNode, this);\n            // 4. All non-positioned floating descendants, in tree order. For each one of these,\n            // treat the element as if it created a new stacking context, but any positioned descendants and descendants\n            // which actually create a new stacking context should be considered part of the parent stacking context,\n            // not this new one.\n            nonPositionedFloats.forEach(this.renderStack, this);\n            // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.\n            nonPositionedInlineLevel.forEach(this.renderStack, this);\n            inlineLevel.forEach(this.renderNode, this);\n            // 6. All positioned, opacity or transform descendants, in tree order that fall into the following categories:\n            //  All positioned descendants with 'z-index: auto' or 'z-index: 0', in tree order.\n            //  For those with 'z-index: auto', treat the element as if it created a new stacking context,\n            //  but any positioned descendants and descendants which actually create a new stacking context should be\n            //  considered part of the parent stacking context, not this new one. For those with 'z-index: 0',\n            //  treat the stacking context generated atomically.\n            //\n            //  All opacity descendants with opacity less than 1\n            //\n            //  All transform descendants with transform other than none\n            zeroOrAutoZIndexOrTransformedOrOpacity.forEach(this.renderStack, this);\n            // 7. Stacking contexts formed by positioned descendants with z-indices greater than or equal to 1 in z-index\n            // order (smallest first) then tree order.\n            positiveZIndex.sort(sortByZIndex).forEach(this.renderStack, this);\n        }\n    }, {\n        key: 'render',\n        value: function render(stack) {\n            var _this5 = this;\n\n            if (this.options.backgroundColor) {\n                this.target.rectangle(this.options.x, this.options.y, this.options.width, this.options.height, this.options.backgroundColor);\n            }\n            this.renderStack(stack);\n            var target = this.target.getTarget();\n            if (false) {\n                return target.then(function (output) {\n                    _this5.options.logger.log('Render completed');\n                    return output;\n                });\n            }\n            return target;\n        }\n    }]);\n\n    return Renderer;\n}();\n\nexports.default = Renderer;\n\n\nvar splitDescendants = function splitDescendants(stack) {\n    var inlineLevel = [];\n    var nonInlineLevel = [];\n\n    var length = stack.children.length;\n    for (var i = 0; i < length; i++) {\n        var child = stack.children[i];\n        if (child.isInlineLevel()) {\n            inlineLevel.push(child);\n        } else {\n            nonInlineLevel.push(child);\n        }\n    }\n    return [inlineLevel, nonInlineLevel];\n};\n\nvar splitStackingContexts = function splitStackingContexts(stack) {\n    var negativeZIndex = [];\n    var zeroOrAutoZIndexOrTransformedOrOpacity = [];\n    var positiveZIndex = [];\n    var nonPositionedFloats = [];\n    var nonPositionedInlineLevel = [];\n    var length = stack.contexts.length;\n    for (var i = 0; i < length; i++) {\n        var child = stack.contexts[i];\n        if (child.container.isPositioned() || child.container.style.opacity < 1 || child.container.isTransformed()) {\n            if (child.container.style.zIndex.order < 0) {\n                negativeZIndex.push(child);\n            } else if (child.container.style.zIndex.order > 0) {\n                positiveZIndex.push(child);\n            } else {\n                zeroOrAutoZIndexOrTransformedOrOpacity.push(child);\n            }\n        } else {\n            if (child.container.isFloating()) {\n                nonPositionedFloats.push(child);\n            } else {\n                nonPositionedInlineLevel.push(child);\n            }\n        }\n    }\n    return [negativeZIndex, zeroOrAutoZIndexOrTransformedOrOpacity, positiveZIndex, nonPositionedFloats, nonPositionedInlineLevel];\n};\n\nvar sortByZIndex = function sortByZIndex(a, b) {\n    if (a.container.style.zIndex.order > b.container.style.zIndex.order) {\n        return 1;\n    } else if (a.container.style.zIndex.order < b.container.style.zIndex.order) {\n        return -1;\n    }\n\n    return a.container.index > b.container.index ? 1 : -1;\n};\n\n/***/ }),\n/* 1538 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.transformWebkitRadialGradientArgs = exports.parseGradient = exports.RadialGradient = exports.LinearGradient = exports.RADIAL_GRADIENT_SHAPE = exports.GRADIENT_TYPE = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _NodeContainer = __webpack_require__(225);\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _Angle = __webpack_require__(1539);\n\nvar _Color = __webpack_require__(92);\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = __webpack_require__(129);\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Util = __webpack_require__(168);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SIDE_OR_CORNER = /^(to )?(left|top|right|bottom)( (left|top|right|bottom))?$/i;\nvar PERCENTAGE_ANGLES = /^([+-]?\\d*\\.?\\d+)% ([+-]?\\d*\\.?\\d+)%$/i;\nvar ENDS_WITH_LENGTH = /(px)|%|( 0)$/i;\nvar FROM_TO_COLORSTOP = /^(from|to|color-stop)\\((?:([\\d.]+)(%)?,\\s*)?(.+?)\\)$/i;\nvar RADIAL_SHAPE_DEFINITION = /^\\s*(circle|ellipse)?\\s*((?:([\\d.]+)(px|r?em|%)\\s*(?:([\\d.]+)(px|r?em|%))?)|closest-side|closest-corner|farthest-side|farthest-corner)?\\s*(?:at\\s*(?:(left|center|right)|([\\d.]+)(px|r?em|%))\\s+(?:(top|center|bottom)|([\\d.]+)(px|r?em|%)))?(?:\\s|$)/i;\n\nvar GRADIENT_TYPE = exports.GRADIENT_TYPE = {\n    LINEAR_GRADIENT: 0,\n    RADIAL_GRADIENT: 1\n};\n\nvar RADIAL_GRADIENT_SHAPE = exports.RADIAL_GRADIENT_SHAPE = {\n    CIRCLE: 0,\n    ELLIPSE: 1\n};\n\nvar LENGTH_FOR_POSITION = {\n    left: new _Length2.default('0%'),\n    top: new _Length2.default('0%'),\n    center: new _Length2.default('50%'),\n    right: new _Length2.default('100%'),\n    bottom: new _Length2.default('100%')\n};\n\nvar LinearGradient = exports.LinearGradient = function LinearGradient(colorStops, direction) {\n    _classCallCheck(this, LinearGradient);\n\n    this.type = GRADIENT_TYPE.LINEAR_GRADIENT;\n    this.colorStops = colorStops;\n    this.direction = direction;\n};\n\nvar RadialGradient = exports.RadialGradient = function RadialGradient(colorStops, shape, center, radius) {\n    _classCallCheck(this, RadialGradient);\n\n    this.type = GRADIENT_TYPE.RADIAL_GRADIENT;\n    this.colorStops = colorStops;\n    this.shape = shape;\n    this.center = center;\n    this.radius = radius;\n};\n\nvar parseGradient = exports.parseGradient = function parseGradient(container, _ref, bounds) {\n    var args = _ref.args,\n        method = _ref.method,\n        prefix = _ref.prefix;\n\n    if (method === 'linear-gradient') {\n        return parseLinearGradient(args, bounds, !!prefix);\n    } else if (method === 'gradient' && args[0] === 'linear') {\n        // TODO handle correct angle\n        return parseLinearGradient(['to bottom'].concat(transformObsoleteColorStops(args.slice(3))), bounds, !!prefix);\n    } else if (method === 'radial-gradient') {\n        return parseRadialGradient(container, prefix === '-webkit-' ? transformWebkitRadialGradientArgs(args) : args, bounds);\n    } else if (method === 'gradient' && args[0] === 'radial') {\n        return parseRadialGradient(container, transformObsoleteColorStops(transformWebkitRadialGradientArgs(args.slice(1))), bounds);\n    }\n};\n\nvar parseColorStops = function parseColorStops(args, firstColorStopIndex, lineLength) {\n    var colorStops = [];\n\n    for (var i = firstColorStopIndex; i < args.length; i++) {\n        var value = args[i];\n        var HAS_LENGTH = ENDS_WITH_LENGTH.test(value);\n        var lastSpaceIndex = value.lastIndexOf(' ');\n        var _color = new _Color2.default(HAS_LENGTH ? value.substring(0, lastSpaceIndex) : value);\n        var _stop = HAS_LENGTH ? new _Length2.default(value.substring(lastSpaceIndex + 1)) : i === firstColorStopIndex ? new _Length2.default('0%') : i === args.length - 1 ? new _Length2.default('100%') : null;\n        colorStops.push({ color: _color, stop: _stop });\n    }\n\n    var absoluteValuedColorStops = colorStops.map(function (_ref2) {\n        var color = _ref2.color,\n            stop = _ref2.stop;\n\n        var absoluteStop = lineLength === 0 ? 0 : stop ? stop.getAbsoluteValue(lineLength) / lineLength : null;\n\n        return {\n            color: color,\n            // $FlowFixMe\n            stop: absoluteStop\n        };\n    });\n\n    var previousColorStop = absoluteValuedColorStops[0].stop;\n    for (var _i = 0; _i < absoluteValuedColorStops.length; _i++) {\n        if (previousColorStop !== null) {\n            var _stop2 = absoluteValuedColorStops[_i].stop;\n            if (_stop2 === null) {\n                var n = _i;\n                while (absoluteValuedColorStops[n].stop === null) {\n                    n++;\n                }\n                var steps = n - _i + 1;\n                var nextColorStep = absoluteValuedColorStops[n].stop;\n                var stepSize = (nextColorStep - previousColorStop) / steps;\n                for (; _i < n; _i++) {\n                    previousColorStop = absoluteValuedColorStops[_i].stop = previousColorStop + stepSize;\n                }\n            } else {\n                previousColorStop = _stop2;\n            }\n        }\n    }\n\n    return absoluteValuedColorStops;\n};\n\nvar parseLinearGradient = function parseLinearGradient(args, bounds, hasPrefix) {\n    var angle = (0, _Angle.parseAngle)(args[0]);\n    var HAS_SIDE_OR_CORNER = SIDE_OR_CORNER.test(args[0]);\n    var HAS_DIRECTION = HAS_SIDE_OR_CORNER || angle !== null || PERCENTAGE_ANGLES.test(args[0]);\n    var direction = HAS_DIRECTION ? angle !== null ? calculateGradientDirection(\n    // if there is a prefix, the 0° angle points due East (instead of North per W3C)\n    hasPrefix ? angle - Math.PI * 0.5 : angle, bounds) : HAS_SIDE_OR_CORNER ? parseSideOrCorner(args[0], bounds) : parsePercentageAngle(args[0], bounds) : calculateGradientDirection(Math.PI, bounds);\n    var firstColorStopIndex = HAS_DIRECTION ? 1 : 0;\n\n    // TODO: Fix some inaccuracy with color stops with px values\n    var lineLength = Math.min((0, _Util.distance)(Math.abs(direction.x0) + Math.abs(direction.x1), Math.abs(direction.y0) + Math.abs(direction.y1)), bounds.width * 2, bounds.height * 2);\n\n    return new LinearGradient(parseColorStops(args, firstColorStopIndex, lineLength), direction);\n};\n\nvar parseRadialGradient = function parseRadialGradient(container, args, bounds) {\n    var m = args[0].match(RADIAL_SHAPE_DEFINITION);\n    var shape = m && (m[1] === 'circle' || // explicit shape specification\n    m[3] !== undefined && m[5] === undefined) // only one radius coordinate\n    ? RADIAL_GRADIENT_SHAPE.CIRCLE : RADIAL_GRADIENT_SHAPE.ELLIPSE;\n    var radius = {};\n    var center = {};\n\n    if (m) {\n        // Radius\n        if (m[3] !== undefined) {\n            radius.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[3], m[4]).getAbsoluteValue(bounds.width);\n        }\n\n        if (m[5] !== undefined) {\n            radius.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[5], m[6]).getAbsoluteValue(bounds.height);\n        }\n\n        // Position\n        if (m[7]) {\n            center.x = LENGTH_FOR_POSITION[m[7].toLowerCase()];\n        } else if (m[8] !== undefined) {\n            center.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[8], m[9]);\n        }\n\n        if (m[10]) {\n            center.y = LENGTH_FOR_POSITION[m[10].toLowerCase()];\n        } else if (m[11] !== undefined) {\n            center.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[11], m[12]);\n        }\n    }\n\n    var gradientCenter = {\n        x: center.x === undefined ? bounds.width / 2 : center.x.getAbsoluteValue(bounds.width),\n        y: center.y === undefined ? bounds.height / 2 : center.y.getAbsoluteValue(bounds.height)\n    };\n    var gradientRadius = calculateRadius(m && m[2] || 'farthest-corner', shape, gradientCenter, radius, bounds);\n\n    return new RadialGradient(parseColorStops(args, m ? 1 : 0, Math.min(gradientRadius.x, gradientRadius.y)), shape, gradientCenter, gradientRadius);\n};\n\nvar calculateGradientDirection = function calculateGradientDirection(radian, bounds) {\n    var width = bounds.width;\n    var height = bounds.height;\n    var HALF_WIDTH = width * 0.5;\n    var HALF_HEIGHT = height * 0.5;\n    var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\n    var HALF_LINE_LENGTH = lineLength / 2;\n\n    var x0 = HALF_WIDTH + Math.sin(radian) * HALF_LINE_LENGTH;\n    var y0 = HALF_HEIGHT - Math.cos(radian) * HALF_LINE_LENGTH;\n    var x1 = width - x0;\n    var y1 = height - y0;\n\n    return { x0: x0, x1: x1, y0: y0, y1: y1 };\n};\n\nvar parseTopRight = function parseTopRight(bounds) {\n    return Math.acos(bounds.width / 2 / ((0, _Util.distance)(bounds.width, bounds.height) / 2));\n};\n\nvar parseSideOrCorner = function parseSideOrCorner(side, bounds) {\n    switch (side) {\n        case 'bottom':\n        case 'to top':\n            return calculateGradientDirection(0, bounds);\n        case 'left':\n        case 'to right':\n            return calculateGradientDirection(Math.PI / 2, bounds);\n        case 'right':\n        case 'to left':\n            return calculateGradientDirection(3 * Math.PI / 2, bounds);\n        case 'top right':\n        case 'right top':\n        case 'to bottom left':\n        case 'to left bottom':\n            return calculateGradientDirection(Math.PI + parseTopRight(bounds), bounds);\n        case 'top left':\n        case 'left top':\n        case 'to bottom right':\n        case 'to right bottom':\n            return calculateGradientDirection(Math.PI - parseTopRight(bounds), bounds);\n        case 'bottom left':\n        case 'left bottom':\n        case 'to top right':\n        case 'to right top':\n            return calculateGradientDirection(parseTopRight(bounds), bounds);\n        case 'bottom right':\n        case 'right bottom':\n        case 'to top left':\n        case 'to left top':\n            return calculateGradientDirection(2 * Math.PI - parseTopRight(bounds), bounds);\n        case 'top':\n        case 'to bottom':\n        default:\n            return calculateGradientDirection(Math.PI, bounds);\n    }\n};\n\nvar parsePercentageAngle = function parsePercentageAngle(angle, bounds) {\n    var _angle$split$map = angle.split(' ').map(parseFloat),\n        _angle$split$map2 = _slicedToArray(_angle$split$map, 2),\n        left = _angle$split$map2[0],\n        top = _angle$split$map2[1];\n\n    var ratio = left / 100 * bounds.width / (top / 100 * bounds.height);\n\n    return calculateGradientDirection(Math.atan(isNaN(ratio) ? 1 : ratio) + Math.PI / 2, bounds);\n};\n\nvar findCorner = function findCorner(bounds, x, y, closest) {\n    var corners = [{ x: 0, y: 0 }, { x: 0, y: bounds.height }, { x: bounds.width, y: 0 }, { x: bounds.width, y: bounds.height }];\n\n    // $FlowFixMe\n    return corners.reduce(function (stat, corner) {\n        var d = (0, _Util.distance)(x - corner.x, y - corner.y);\n        if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\n            return {\n                optimumCorner: corner,\n                optimumDistance: d\n            };\n        }\n\n        return stat;\n    }, {\n        optimumDistance: closest ? Infinity : -Infinity,\n        optimumCorner: null\n    }).optimumCorner;\n};\n\nvar calculateRadius = function calculateRadius(extent, shape, center, radius, bounds) {\n    var x = center.x;\n    var y = center.y;\n    var rx = 0;\n    var ry = 0;\n\n    switch (extent) {\n        case 'closest-side':\n            // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, it exactly meets the closest side in each dimension.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.min(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                rx = Math.min(Math.abs(x), Math.abs(x - bounds.width));\n                ry = Math.min(Math.abs(y), Math.abs(y - bounds.height));\n            }\n            break;\n\n        case 'closest-corner':\n            // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.min((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\n                var c = Math.min(Math.abs(y), Math.abs(y - bounds.height)) / Math.min(Math.abs(x), Math.abs(x - bounds.width));\n                var corner = findCorner(bounds, x, y, true);\n                rx = (0, _Util.distance)(corner.x - x, (corner.y - y) / c);\n                ry = c * rx;\n            }\n            break;\n\n        case 'farthest-side':\n            // Same as closest-side, except the ending shape is sized based on the farthest side(s)\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.max(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                rx = Math.max(Math.abs(x), Math.abs(x - bounds.width));\n                ry = Math.max(Math.abs(y), Math.abs(y - bounds.height));\n            }\n            break;\n\n        case 'farthest-corner':\n            // Same as closest-corner, except the ending shape is sized based on the farthest corner.\n            // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.max((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\n                var _c = Math.max(Math.abs(y), Math.abs(y - bounds.height)) / Math.max(Math.abs(x), Math.abs(x - bounds.width));\n                var _corner = findCorner(bounds, x, y, false);\n                rx = (0, _Util.distance)(_corner.x - x, (_corner.y - y) / _c);\n                ry = _c * rx;\n            }\n            break;\n\n        default:\n            // pixel or percentage values\n            rx = radius.x || 0;\n            ry = radius.y !== undefined ? radius.y : rx;\n            break;\n    }\n\n    return {\n        x: rx,\n        y: ry\n    };\n};\n\nvar transformWebkitRadialGradientArgs = exports.transformWebkitRadialGradientArgs = function transformWebkitRadialGradientArgs(args) {\n    var shape = '';\n    var radius = '';\n    var extent = '';\n    var position = '';\n    var idx = 0;\n\n    var POSITION = /^(left|center|right|\\d+(?:px|r?em|%)?)(?:\\s+(top|center|bottom|\\d+(?:px|r?em|%)?))?$/i;\n    var SHAPE_AND_EXTENT = /^(circle|ellipse)?\\s*(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)?$/i;\n    var RADIUS = /^\\d+(px|r?em|%)?(?:\\s+\\d+(px|r?em|%)?)?$/i;\n\n    var matchStartPosition = args[idx].match(POSITION);\n    if (matchStartPosition) {\n        idx++;\n    }\n\n    var matchShapeExtent = args[idx].match(SHAPE_AND_EXTENT);\n    if (matchShapeExtent) {\n        shape = matchShapeExtent[1] || '';\n        extent = matchShapeExtent[2] || '';\n        if (extent === 'contain') {\n            extent = 'closest-side';\n        } else if (extent === 'cover') {\n            extent = 'farthest-corner';\n        }\n        idx++;\n    }\n\n    var matchStartRadius = args[idx].match(RADIUS);\n    if (matchStartRadius) {\n        idx++;\n    }\n\n    var matchEndPosition = args[idx].match(POSITION);\n    if (matchEndPosition) {\n        idx++;\n    }\n\n    var matchEndRadius = args[idx].match(RADIUS);\n    if (matchEndRadius) {\n        idx++;\n    }\n\n    var matchPosition = matchEndPosition || matchStartPosition;\n    if (matchPosition && matchPosition[1]) {\n        position = matchPosition[1] + (/^\\d+$/.test(matchPosition[1]) ? 'px' : '');\n        if (matchPosition[2]) {\n            position += ' ' + matchPosition[2] + (/^\\d+$/.test(matchPosition[2]) ? 'px' : '');\n        }\n    }\n\n    var matchRadius = matchEndRadius || matchStartRadius;\n    if (matchRadius) {\n        radius = matchRadius[0];\n        if (!matchRadius[1]) {\n            radius += 'px';\n        }\n    }\n\n    if (position && !shape && !radius && !extent) {\n        radius = position;\n        position = '';\n    }\n\n    if (position) {\n        position = 'at ' + position;\n    }\n\n    return [[shape, extent, radius, position].filter(function (s) {\n        return !!s;\n    }).join(' ')].concat(args.slice(idx));\n};\n\nvar transformObsoleteColorStops = function transformObsoleteColorStops(args) {\n    return args.map(function (color) {\n        return color.match(FROM_TO_COLORSTOP);\n    })\n    // $FlowFixMe\n    .map(function (v, index) {\n        if (!v) {\n            return args[index];\n        }\n\n        switch (v[1]) {\n            case 'from':\n                return v[4] + ' 0%';\n            case 'to':\n                return v[4] + ' 100%';\n            case 'color-stop':\n                if (v[3] === '%') {\n                    return v[4] + ' ' + v[2];\n                }\n                return v[4] + ' ' + parseFloat(v[2]) * 100 + '%';\n        }\n    });\n};\n\n/***/ }),\n/* 1539 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar ANGLE = /([+-]?\\d*\\.?\\d+)(deg|grad|rad|turn)/i;\n\nvar parseAngle = exports.parseAngle = function parseAngle(angle) {\n    var match = angle.match(ANGLE);\n\n    if (match) {\n        var value = parseFloat(match[1]);\n        switch (match[2].toLowerCase()) {\n            case 'deg':\n                return Math.PI * value / 180;\n            case 'grad':\n                return Math.PI / 200 * value;\n            case 'rad':\n                return value;\n            case 'turn':\n                return Math.PI * 2 * value;\n        }\n    }\n\n    return null;\n};\n\n/***/ }),\n/* 1540 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.cloneWindow = exports.DocumentCloner = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Bounds = __webpack_require__(93);\n\nvar _Proxy = __webpack_require__(677);\n\nvar _ResourceLoader = __webpack_require__(1541);\n\nvar _ResourceLoader2 = _interopRequireDefault(_ResourceLoader);\n\nvar _Util = __webpack_require__(168);\n\nvar _background = __webpack_require__(226);\n\nvar _CanvasRenderer = __webpack_require__(668);\n\nvar _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\n\nvar DocumentCloner = exports.DocumentCloner = function () {\n    function DocumentCloner(element, options, logger, copyInline, renderer) {\n        _classCallCheck(this, DocumentCloner);\n\n        this.referenceElement = element;\n        this.scrolledElements = [];\n        this.copyStyles = copyInline;\n        this.inlineImages = copyInline;\n        this.logger = logger;\n        this.options = options;\n        this.renderer = renderer;\n        this.resourceLoader = new _ResourceLoader2.default(options, logger, window);\n        // $FlowFixMe\n        this.documentElement = this.cloneNode(element.ownerDocument.documentElement);\n    }\n\n    _createClass(DocumentCloner, [{\n        key: 'inlineAllImages',\n        value: function inlineAllImages(node) {\n            var _this = this;\n\n            if (this.inlineImages && node) {\n                var style = node.style;\n                Promise.all((0, _background.parseBackgroundImage)(style.backgroundImage).map(function (backgroundImage) {\n                    if (backgroundImage.method === 'url') {\n                        return _this.resourceLoader.inlineImage(backgroundImage.args[0]).then(function (img) {\n                            return img && typeof img.src === 'string' ? 'url(\"' + img.src + '\")' : 'none';\n                        }).catch(function (e) {\n                            if (false) {\n                                _this.logger.log('Unable to load image', e);\n                            }\n                        });\n                    }\n                    return Promise.resolve('' + backgroundImage.prefix + backgroundImage.method + '(' + backgroundImage.args.join(',') + ')');\n                })).then(function (backgroundImages) {\n                    if (backgroundImages.length > 1) {\n                        // TODO Multiple backgrounds somehow broken in Chrome\n                        style.backgroundColor = '';\n                    }\n                    style.backgroundImage = backgroundImages.join(',');\n                });\n\n                if (node instanceof HTMLImageElement) {\n                    this.resourceLoader.inlineImage(node.src).then(function (img) {\n                        if (img && node instanceof HTMLImageElement && node.parentNode) {\n                            var parentNode = node.parentNode;\n                            var clonedChild = (0, _Util.copyCSSStyles)(node.style, img.cloneNode(false));\n                            parentNode.replaceChild(clonedChild, node);\n                        }\n                    }).catch(function (e) {\n                        if (false) {\n                            _this.logger.log('Unable to load image', e);\n                        }\n                    });\n                }\n            }\n        }\n    }, {\n        key: 'inlineFonts',\n        value: function inlineFonts(document) {\n            var _this2 = this;\n\n            return Promise.all(Array.from(document.styleSheets).map(function (sheet) {\n                if (sheet.href) {\n                    return fetch(sheet.href).then(function (res) {\n                        return res.text();\n                    }).then(function (text) {\n                        return createStyleSheetFontsFromText(text, sheet.href);\n                    }).catch(function (e) {\n                        if (false) {\n                            _this2.logger.log('Unable to load stylesheet', e);\n                        }\n                        return [];\n                    });\n                }\n                return getSheetFonts(sheet, document);\n            })).then(function (fonts) {\n                return fonts.reduce(function (acc, font) {\n                    return acc.concat(font);\n                }, []);\n            }).then(function (fonts) {\n                return Promise.all(fonts.map(function (font) {\n                    return fetch(font.formats[0].src).then(function (response) {\n                        return response.blob();\n                    }).then(function (blob) {\n                        return new Promise(function (resolve, reject) {\n                            var reader = new FileReader();\n                            reader.onerror = reject;\n                            reader.onload = function () {\n                                // $FlowFixMe\n                                var result = reader.result;\n                                resolve(result);\n                            };\n                            reader.readAsDataURL(blob);\n                        });\n                    }).then(function (dataUri) {\n                        font.fontFace.setProperty('src', 'url(\"' + dataUri + '\")');\n                        return '@font-face {' + font.fontFace.cssText + ' ';\n                    });\n                }));\n            }).then(function (fontCss) {\n                var style = document.createElement('style');\n                style.textContent = fontCss.join('\\n');\n                _this2.documentElement.appendChild(style);\n            });\n        }\n    }, {\n        key: 'createElementClone',\n        value: function createElementClone(node) {\n            var _this3 = this;\n\n            if (this.copyStyles && node instanceof HTMLCanvasElement) {\n                var img = node.ownerDocument.createElement('img');\n                try {\n                    img.src = node.toDataURL();\n                    return img;\n                } catch (e) {\n                    if (false) {\n                        this.logger.log('Unable to clone canvas contents, canvas is tainted');\n                    }\n                }\n            }\n\n            if (node instanceof HTMLIFrameElement) {\n                var tempIframe = node.cloneNode(false);\n                var iframeKey = generateIframeKey();\n                tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);\n\n                var _parseBounds = (0, _Bounds.parseBounds)(node, 0, 0),\n                    width = _parseBounds.width,\n                    height = _parseBounds.height;\n\n                this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(node, this.options).then(function (documentElement) {\n                    return _this3.renderer(documentElement, {\n                        async: _this3.options.async,\n                        allowTaint: _this3.options.allowTaint,\n                        backgroundColor: '#ffffff',\n                        canvas: null,\n                        imageTimeout: _this3.options.imageTimeout,\n                        logging: _this3.options.logging,\n                        proxy: _this3.options.proxy,\n                        removeContainer: _this3.options.removeContainer,\n                        scale: _this3.options.scale,\n                        foreignObjectRendering: _this3.options.foreignObjectRendering,\n                        target: new _CanvasRenderer2.default(),\n                        width: width,\n                        height: height,\n                        x: 0,\n                        y: 0,\n                        windowWidth: documentElement.ownerDocument.defaultView.innerWidth,\n                        windowHeight: documentElement.ownerDocument.defaultView.innerHeight,\n                        scrollX: documentElement.ownerDocument.defaultView.pageXOffset,\n                        scrollY: documentElement.ownerDocument.defaultView.pageYOffset\n                    }, _this3.logger.child(iframeKey));\n                }).then(function (canvas) {\n                    return new Promise(function (resolve, reject) {\n                        var iframeCanvas = document.createElement('img');\n                        iframeCanvas.onload = function () {\n                            return resolve(canvas);\n                        };\n                        iframeCanvas.onerror = reject;\n                        iframeCanvas.src = canvas.toDataURL();\n                        if (tempIframe.parentNode) {\n                            tempIframe.parentNode.replaceChild((0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), iframeCanvas), tempIframe);\n                        }\n                    });\n                });\n                return tempIframe;\n            }\n\n            return node.cloneNode(false);\n        }\n    }, {\n        key: 'cloneNode',\n        value: function cloneNode(node) {\n            var clone = node.nodeType === Node.TEXT_NODE ? document.createTextNode(node.nodeValue) : this.createElementClone(node);\n\n            var window = node.ownerDocument.defaultView;\n\n            if (this.referenceElement === node && clone instanceof window.HTMLElement) {\n                this.clonedReferenceElement = clone;\n            }\n\n            if (clone instanceof window.HTMLBodyElement) {\n                createPseudoHideStyles(clone);\n            }\n\n            for (var child = node.firstChild; child; child = child.nextSibling) {\n                if (child.nodeType !== Node.ELEMENT_NODE ||\n                // $FlowFixMe\n                child.nodeName !== 'SCRIPT' && !child.hasAttribute(IGNORE_ATTRIBUTE)) {\n                    if (!this.copyStyles || child.nodeName !== 'STYLE') {\n                        clone.appendChild(this.cloneNode(child));\n                    }\n                }\n            }\n            if (node instanceof window.HTMLElement && clone instanceof window.HTMLElement) {\n                this.inlineAllImages(inlinePseudoElement(node, clone, PSEUDO_BEFORE));\n                this.inlineAllImages(inlinePseudoElement(node, clone, PSEUDO_AFTER));\n                if (this.copyStyles && !(node instanceof HTMLIFrameElement)) {\n                    (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), clone);\n                }\n                this.inlineAllImages(clone);\n                if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\n                    this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);\n                }\n                switch (node.nodeName) {\n                    case 'CANVAS':\n                        if (!this.copyStyles) {\n                            cloneCanvasContents(node, clone);\n                        }\n                        break;\n                    case 'TEXTAREA':\n                    case 'SELECT':\n                        clone.value = node.value;\n                        break;\n                }\n            }\n            return clone;\n        }\n    }]);\n\n    return DocumentCloner;\n}();\n\nvar getSheetFonts = function getSheetFonts(sheet, document) {\n    // $FlowFixMe\n    return (sheet.cssRules ? Array.from(sheet.cssRules) : []).filter(function (rule) {\n        return rule.type === CSSRule.FONT_FACE_RULE;\n    }).map(function (rule) {\n        var src = (0, _background.parseBackgroundImage)(rule.style.getPropertyValue('src'));\n        var formats = [];\n        for (var i = 0; i < src.length; i++) {\n            if (src[i].method === 'url' && src[i + 1] && src[i + 1].method === 'format') {\n                var a = document.createElement('a');\n                a.href = src[i].args[0];\n                if (document.body) {\n                    document.body.appendChild(a);\n                }\n\n                var font = {\n                    src: a.href,\n                    format: src[i + 1].args[0]\n                };\n                formats.push(font);\n            }\n        }\n\n        return {\n            // TODO select correct format for browser),\n\n            formats: formats.filter(function (font) {\n                return (/^woff/i.test(font.format)\n                );\n            }),\n            fontFace: rule.style\n        };\n    }).filter(function (font) {\n        return font.formats.length;\n    });\n};\n\nvar createStyleSheetFontsFromText = function createStyleSheetFontsFromText(text, baseHref) {\n    var doc = document.implementation.createHTMLDocument('');\n    var base = document.createElement('base');\n    // $FlowFixMe\n    base.href = baseHref;\n    var style = document.createElement('style');\n\n    style.textContent = text;\n    if (doc.head) {\n        doc.head.appendChild(base);\n    }\n    if (doc.body) {\n        doc.body.appendChild(style);\n    }\n\n    return style.sheet ? getSheetFonts(style.sheet, doc) : [];\n};\n\nvar restoreOwnerScroll = function restoreOwnerScroll(ownerDocument, x, y) {\n    if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {\n        ownerDocument.defaultView.scrollTo(x, y);\n    }\n};\n\nvar cloneCanvasContents = function cloneCanvasContents(canvas, clonedCanvas) {\n    try {\n        if (clonedCanvas) {\n            clonedCanvas.width = canvas.width;\n            clonedCanvas.height = canvas.height;\n            var ctx = canvas.getContext('2d');\n            var clonedCtx = clonedCanvas.getContext('2d');\n            if (ctx) {\n                clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);\n            } else {\n                clonedCtx.drawImage(canvas, 0, 0);\n            }\n        }\n    } catch (e) {}\n};\n\nvar inlinePseudoElement = function inlinePseudoElement(node, clone, pseudoElt) {\n    var style = node.ownerDocument.defaultView.getComputedStyle(node, pseudoElt);\n    if (!style || !style.content || style.content === 'none' || style.content === '-moz-alt-content' || style.display === 'none') {\n        return;\n    }\n\n    var content = stripQuotes(style.content);\n    var image = content.match(URL_REGEXP);\n    var anonymousReplacedElement = clone.ownerDocument.createElement(image ? 'img' : 'html2canvaspseudoelement');\n    if (image) {\n        // $FlowFixMe\n        anonymousReplacedElement.src = stripQuotes(image[1]);\n    } else {\n        anonymousReplacedElement.textContent = content;\n    }\n\n    (0, _Util.copyCSSStyles)(style, anonymousReplacedElement);\n\n    anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\n    clone.className += pseudoElt === PSEUDO_BEFORE ? ' ' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE : ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\n    if (pseudoElt === PSEUDO_BEFORE) {\n        clone.insertBefore(anonymousReplacedElement, clone.firstChild);\n    } else {\n        clone.appendChild(anonymousReplacedElement);\n    }\n\n    return anonymousReplacedElement;\n};\n\nvar stripQuotes = function stripQuotes(content) {\n    var first = content.substr(0, 1);\n    return first === content.substr(content.length - 1) && first.match(/['\"]/) ? content.substr(1, content.length - 2) : content;\n};\n\nvar URL_REGEXP = /^url\\((.+)\\)$/i;\nvar PSEUDO_BEFORE = ':before';\nvar PSEUDO_AFTER = ':after';\nvar PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';\nvar PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';\n\nvar PSEUDO_HIDE_ELEMENT_STYLE = '{\\n    content: \"\" !important;\\n    display: none !important;\\n}';\n\nvar createPseudoHideStyles = function createPseudoHideStyles(body) {\n    createStyles(body, '.' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + '\\n         .' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE);\n};\n\nvar createStyles = function createStyles(body, styles) {\n    var style = body.ownerDocument.createElement('style');\n    style.innerHTML = styles;\n    body.appendChild(style);\n};\n\nvar initNode = function initNode(_ref) {\n    var _ref2 = _slicedToArray(_ref, 3),\n        element = _ref2[0],\n        x = _ref2[1],\n        y = _ref2[2];\n\n    element.scrollLeft = x;\n    element.scrollTop = y;\n};\n\nvar generateIframeKey = function generateIframeKey() {\n    return Math.ceil(Date.now() + Math.random() * 10000000).toString(16);\n};\n\nvar DATA_URI_REGEXP = /^data:text\\/(.+);(base64)?,(.*)$/i;\n\nvar getIframeDocumentElement = function getIframeDocumentElement(node, options) {\n    try {\n        return Promise.resolve(node.contentWindow.document.documentElement);\n    } catch (e) {\n        return options.proxy ? (0, _Proxy.Proxy)(node.src, options).then(function (html) {\n            var match = html.match(DATA_URI_REGEXP);\n            if (!match) {\n                return Promise.reject();\n            }\n\n            return match[2] === 'base64' ? window.atob(decodeURIComponent(match[3])) : decodeURIComponent(match[3]);\n        }).then(function (html) {\n            return createIframeContainer(node.ownerDocument, (0, _Bounds.parseBounds)(node, 0, 0)).then(function (cloneIframeContainer) {\n                var cloneWindow = cloneIframeContainer.contentWindow;\n                var documentClone = cloneWindow.document;\n\n                documentClone.open();\n                documentClone.write(html);\n                var iframeLoad = iframeLoader(cloneIframeContainer).then(function () {\n                    return documentClone.documentElement;\n                });\n\n                documentClone.close();\n                return iframeLoad;\n            });\n        }) : Promise.reject();\n    }\n};\n\nvar createIframeContainer = function createIframeContainer(ownerDocument, bounds) {\n    var cloneIframeContainer = ownerDocument.createElement('iframe');\n\n    cloneIframeContainer.className = 'html2canvas-container';\n    cloneIframeContainer.style.visibility = 'hidden';\n    cloneIframeContainer.style.position = 'fixed';\n    cloneIframeContainer.style.left = '-10000px';\n    cloneIframeContainer.style.top = '0px';\n    cloneIframeContainer.style.border = '0';\n    cloneIframeContainer.width = bounds.width.toString();\n    cloneIframeContainer.height = bounds.height.toString();\n    cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it\n    cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');\n    if (!ownerDocument.body) {\n        return Promise.reject( false ? 'Body element not found in Document that is getting rendered' : '');\n    }\n\n    ownerDocument.body.appendChild(cloneIframeContainer);\n\n    return Promise.resolve(cloneIframeContainer);\n};\n\nvar iframeLoader = function iframeLoader(cloneIframeContainer) {\n    var cloneWindow = cloneIframeContainer.contentWindow;\n    var documentClone = cloneWindow.document;\n\n    return new Promise(function (resolve, reject) {\n        cloneWindow.onload = cloneIframeContainer.onload = documentClone.onreadystatechange = function () {\n            var interval = setInterval(function () {\n                if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {\n                    clearInterval(interval);\n                    resolve(cloneIframeContainer);\n                }\n            }, 50);\n        };\n    });\n};\n\nvar cloneWindow = exports.cloneWindow = function cloneWindow(ownerDocument, bounds, referenceElement, options, logger, renderer) {\n    var cloner = new DocumentCloner(referenceElement, options, logger, false, renderer);\n    var scrollX = ownerDocument.defaultView.pageXOffset;\n    var scrollY = ownerDocument.defaultView.pageYOffset;\n\n    return createIframeContainer(ownerDocument, bounds).then(function (cloneIframeContainer) {\n        var cloneWindow = cloneIframeContainer.contentWindow;\n        var documentClone = cloneWindow.document;\n\n        /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle\n             if window url is about:blank, we can assign the url to current by writing onto the document\n             */\n\n        var iframeLoad = iframeLoader(cloneIframeContainer).then(function () {\n            cloner.scrolledElements.forEach(initNode);\n            cloneWindow.scrollTo(bounds.left, bounds.top);\n            if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) && (cloneWindow.scrollY !== bounds.top || cloneWindow.scrollX !== bounds.left)) {\n                documentClone.documentElement.style.top = -bounds.top + 'px';\n                documentClone.documentElement.style.left = -bounds.left + 'px';\n                documentClone.documentElement.style.position = 'absolute';\n            }\n            return cloner.clonedReferenceElement instanceof cloneWindow.HTMLElement || cloner.clonedReferenceElement instanceof ownerDocument.defaultView.HTMLElement || cloner.clonedReferenceElement instanceof HTMLElement ? Promise.resolve([cloneIframeContainer, cloner.clonedReferenceElement, cloner.resourceLoader]) : Promise.reject( false ? 'Error finding the ' + referenceElement.nodeName + ' in the cloned document' : '');\n        });\n\n        documentClone.open();\n        documentClone.write('<!DOCTYPE html><html></html>');\n        // Chrome scrolls the parent document for some reason after the write to the cloned window???\n        restoreOwnerScroll(referenceElement.ownerDocument, scrollX, scrollY);\n        documentClone.replaceChild(documentClone.adoptNode(cloner.documentElement), documentClone.documentElement);\n        documentClone.close();\n\n        return iframeLoad;\n    });\n};\n\n/***/ }),\n/* 1541 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ResourceStore = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Feature = __webpack_require__(228);\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nvar _Proxy = __webpack_require__(677);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ResourceLoader = function () {\n    function ResourceLoader(options, logger, window) {\n        _classCallCheck(this, ResourceLoader);\n\n        this.options = options;\n        this._window = window;\n        this.origin = this.getOrigin(window.location.href);\n        this.cache = {};\n        this.logger = logger;\n        this._index = 0;\n    }\n\n    _createClass(ResourceLoader, [{\n        key: 'loadImage',\n        value: function loadImage(src) {\n            var _this = this;\n\n            if (this.hasResourceInCache(src)) {\n                return src;\n            }\n\n            if (!isSVG(src) || _Feature2.default.SUPPORT_SVG_DRAWING) {\n                if (this.options.allowTaint === true || isInlineImage(src) || this.isSameOrigin(src)) {\n                    return this.addImage(src, src, false);\n                } else if (!this.isSameOrigin(src)) {\n                    if (typeof this.options.proxy === 'string') {\n                        this.cache[src] = (0, _Proxy.Proxy)(src, this.options).then(function (src) {\n                            return _loadImage(src, _this.options.imageTimeout || 0);\n                        });\n                        return src;\n                    } else if (this.options.useCORS === true && _Feature2.default.SUPPORT_CORS_IMAGES) {\n                        return this.addImage(src, src, true);\n                    }\n                }\n            }\n        }\n    }, {\n        key: 'inlineImage',\n        value: function inlineImage(src) {\n            var _this2 = this;\n\n            if (isInlineImage(src)) {\n                return _loadImage(src, this.options.imageTimeout || 0);\n            }\n            if (this.hasResourceInCache(src)) {\n                return this.cache[src];\n            }\n            if (!this.isSameOrigin(src) && typeof this.options.proxy === 'string') {\n                return this.cache[src] = (0, _Proxy.Proxy)(src, this.options).then(function (src) {\n                    return _loadImage(src, _this2.options.imageTimeout || 0);\n                });\n            }\n\n            return this.xhrImage(src);\n        }\n    }, {\n        key: 'xhrImage',\n        value: function xhrImage(src) {\n            var _this3 = this;\n\n            this.cache[src] = new Promise(function (resolve, reject) {\n                var xhr = new XMLHttpRequest();\n                xhr.onreadystatechange = function () {\n                    if (xhr.readyState === 4) {\n                        if (xhr.status !== 200) {\n                            reject('Failed to fetch image ' + src.substring(0, 256) + ' with status code ' + xhr.status);\n                        } else {\n                            var reader = new FileReader();\n                            reader.addEventListener('load', function () {\n                                // $FlowFixMe\n                                var result = reader.result;\n                                resolve(result);\n                            }, false);\n                            reader.addEventListener('error', function (e) {\n                                return reject(e);\n                            }, false);\n                            reader.readAsDataURL(xhr.response);\n                        }\n                    }\n                };\n                xhr.responseType = 'blob';\n                if (_this3.options.imageTimeout) {\n                    var timeout = _this3.options.imageTimeout;\n                    xhr.timeout = timeout;\n                    xhr.ontimeout = function () {\n                        return reject( false ? 'Timed out (' + timeout + 'ms) fetching ' + src.substring(0, 256) : '');\n                    };\n                }\n                xhr.open('GET', src, true);\n                xhr.send();\n            }).then(function (src) {\n                return _loadImage(src, _this3.options.imageTimeout || 0);\n            });\n\n            return this.cache[src];\n        }\n    }, {\n        key: 'loadCanvas',\n        value: function loadCanvas(node) {\n            var key = String(this._index++);\n            this.cache[key] = Promise.resolve(node);\n            return key;\n        }\n    }, {\n        key: 'hasResourceInCache',\n        value: function hasResourceInCache(key) {\n            return typeof this.cache[key] !== 'undefined';\n        }\n    }, {\n        key: 'addImage',\n        value: function addImage(key, src, useCORS) {\n            var _this4 = this;\n\n            if (false) {\n                this.logger.log('Added image ' + key.substring(0, 256));\n            }\n\n            var imageLoadHandler = function imageLoadHandler(supportsDataImages) {\n                return new Promise(function (resolve, reject) {\n                    var img = new Image();\n                    img.onload = function () {\n                        return resolve(img);\n                    };\n                    //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous\n                    if (!supportsDataImages || useCORS) {\n                        img.crossOrigin = 'anonymous';\n                    }\n\n                    img.onerror = reject;\n                    img.src = src;\n                    if (img.complete === true) {\n                        // Inline XML images may fail to parse, throwing an Error later on\n                        setTimeout(function () {\n                            resolve(img);\n                        }, 500);\n                    }\n                    if (_this4.options.imageTimeout) {\n                        var timeout = _this4.options.imageTimeout;\n                        setTimeout(function () {\n                            return reject( false ? 'Timed out (' + timeout + 'ms) fetching ' + src.substring(0, 256) : '');\n                        }, timeout);\n                    }\n                });\n            };\n\n            this.cache[key] = isInlineBase64Image(src) && !isSVG(src) ? // $FlowFixMe\n            _Feature2.default.SUPPORT_BASE64_DRAWING(src).then(imageLoadHandler) : imageLoadHandler(true);\n            return key;\n        }\n    }, {\n        key: 'isSameOrigin',\n        value: function isSameOrigin(url) {\n            return this.getOrigin(url) === this.origin;\n        }\n    }, {\n        key: 'getOrigin',\n        value: function getOrigin(url) {\n            var link = this._link || (this._link = this._window.document.createElement('a'));\n            link.href = url;\n            link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/\n            return link.protocol + link.hostname + link.port;\n        }\n    }, {\n        key: 'ready',\n        value: function ready() {\n            var _this5 = this;\n\n            var keys = Object.keys(this.cache);\n            var values = keys.map(function (str) {\n                return _this5.cache[str].catch(function (e) {\n                    if (false) {\n                        _this5.logger.log('Unable to load image', e);\n                    }\n                    return null;\n                });\n            });\n            return Promise.all(values).then(function (images) {\n                if (false) {\n                    _this5.logger.log('Finished loading ' + images.length + ' images', images);\n                }\n                return new ResourceStore(keys, images);\n            });\n        }\n    }]);\n\n    return ResourceLoader;\n}();\n\nexports.default = ResourceLoader;\n\nvar ResourceStore = exports.ResourceStore = function () {\n    function ResourceStore(keys, resources) {\n        _classCallCheck(this, ResourceStore);\n\n        this._keys = keys;\n        this._resources = resources;\n    }\n\n    _createClass(ResourceStore, [{\n        key: 'get',\n        value: function get(key) {\n            var index = this._keys.indexOf(key);\n            return index === -1 ? null : this._resources[index];\n        }\n    }]);\n\n    return ResourceStore;\n}();\n\nvar INLINE_SVG = /^data:image\\/svg\\+xml/i;\nvar INLINE_BASE64 = /^data:image\\/.*;base64,/i;\nvar INLINE_IMG = /^data:image\\/.*/i;\n\nvar isInlineImage = function isInlineImage(src) {\n    return INLINE_IMG.test(src);\n};\nvar isInlineBase64Image = function isInlineBase64Image(src) {\n    return INLINE_BASE64.test(src);\n};\n\nvar isSVG = function isSVG(src) {\n    return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src);\n};\n\nvar _loadImage = function _loadImage(src, timeout) {\n    return new Promise(function (resolve, reject) {\n        var img = new Image();\n        img.onload = function () {\n            return resolve(img);\n        };\n        img.onerror = reject;\n        img.src = src;\n        if (img.complete === true) {\n            // Inline XML images may fail to parse, throwing an Error later on\n            setTimeout(function () {\n                resolve(img);\n            }, 500);\n        }\n        if (timeout) {\n            setTimeout(function () {\n                return reject( false ? 'Timed out (' + timeout + 'ms) loading image' : '');\n            }, timeout);\n        }\n    });\n};\n\n/***/ }),\n/* 1542 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\n * canvg.js - Javascript SVG parser and renderer on Canvas\r\n * MIT Licensed\r\n * Gabe Lerner (gabelerner@gmail.com)\r\n * http://code.google.com/p/canvg/\r\n *\r\n * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\r\n */\r\n (function ( global, factory ) {\r\n\r\n\t'use strict';\r\n\r\n\t// export as AMD...\r\n\tif ( true ) {\r\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1543), __webpack_require__(1544) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\t}\r\n\r\n\t// ...or as browserify\r\n\telse if ( typeof module !== 'undefined' && module.exports ) {\r\n\t\tmodule.exports = factory( require( 'rgbcolor' ), require( 'stackblur' ) );\r\n\t}\r\n\r\n\tglobal.canvg = factory( global.RGBColor, global.stackBlur );\r\n\r\n}( typeof window !== 'undefined' ? window : this, function ( RGBColor, stackBlur ) {\r\n\r\n\t// canvg(target, s)\r\n\t// empty parameters: replace all 'svg' elements on page with 'canvas' elements\r\n\t// target: canvas element or the id of a canvas element\r\n\t// s: svg string, url to svg file, or xml document\r\n\t// opts: optional hash of options\r\n\t//\t\t ignoreMouse: true => ignore mouse events\r\n\t//\t\t ignoreAnimation: true => ignore animations\r\n\t//\t\t ignoreDimensions: true => does not try to resize canvas\r\n\t//\t\t ignoreClear: true => does not clear canvas\r\n\t//\t\t offsetX: int => draws at a x offset\r\n\t//\t\t offsetY: int => draws at a y offset\r\n\t//\t\t scaleWidth: int => scales horizontally to width\r\n\t//\t\t scaleHeight: int => scales vertically to height\r\n\t//\t\t renderCallback: function => will call the function after the first render is completed\r\n\t//\t\t forceRedraw: function => will call the function on every frame, if it returns true, will redraw\r\n\tvar canvg = function (target, s, opts) {\r\n\t\t// no parameters\r\n\t\tif (target == null && s == null && opts == null) {\r\n\t\t\tvar svgTags = document.querySelectorAll('svg');\r\n\t\t\tfor (var i=0; i<svgTags.length; i++) {\r\n\t\t\t\tvar svgTag = svgTags[i];\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = svgTag.clientWidth;\r\n\t\t\t\tc.height = svgTag.clientHeight;\r\n\t\t\t\tsvgTag.parentNode.insertBefore(c, svgTag);\r\n\t\t\t\tsvgTag.parentNode.removeChild(svgTag);\r\n\t\t\t\tvar div = document.createElement('div');\r\n\t\t\t\tdiv.appendChild(svgTag);\r\n\t\t\t\tcanvg(c, div.innerHTML);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof target == 'string') {\r\n\t\t\ttarget = document.getElementById(target);\r\n\t\t}\r\n\r\n\t\t// store class on canvas\r\n\t\tif (target.svg != null) target.svg.stop();\r\n\t\tvar svg = build(opts || {});\r\n\t\t// on i.e. 8 for flash canvas, we can't assign the property so check for it\r\n\t\tif (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == 'OBJECT')) target.svg = svg;\r\n\r\n\t\tvar ctx = target.getContext('2d');\r\n\t\tif (typeof s.documentElement != 'undefined') {\r\n\t\t\t// load from xml doc\r\n\t\t\tsvg.loadXmlDoc(ctx, s);\r\n\t\t}\r\n\t\telse if (s.substr(0,1) == '<') {\r\n\t\t\t// load from xml string\r\n\t\t\tsvg.loadXml(ctx, s);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// load from url\r\n\t\t\tsvg.load(ctx, s);\r\n\t\t}\r\n\t}\r\n\r\n\t// see https://developer.mozilla.org/en-US/docs/Web/API/Element.matches\r\n\tvar matchesSelector;\r\n\tif (typeof Element == 'undefined') {\r\n\t\t// We include this test, as otherwise IE7 will throw an error simply by\r\n\t\t// including this file, as it does not support the Element object.\r\n\t} else if (typeof Element.prototype.matches != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.matches(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.webkitMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.webkitMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.mozMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.mozMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.msMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.msMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.oMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.oMatchesSelector(selector);\r\n\t\t};\r\n\t} else {\r\n\t\t// requires Sizzle: https://github.com/jquery/sizzle/wiki/Sizzle-Documentation\r\n\t\t// or jQuery: http://jquery.com/download/\r\n\t\t// or Zepto: http://zeptojs.com/#\r\n\t\t// without it, this is a ReferenceError\r\n\r\n\t\tif (typeof jQuery === 'function' || typeof Zepto === 'function') {\r\n\t\t\tmatchesSelector = function (node, selector) {\r\n\t\t\t\treturn $(node).is(selector);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (typeof matchesSelector === 'undefined') {\r\n\t\t\tmatchesSelector = Sizzle.matchesSelector;\r\n\t\t}\r\n\t}\r\n\r\n\t// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\r\n\tvar attributeRegex = /(\\[[^\\]]+\\])/g;\r\n\tvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\r\n\tvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\r\n\tvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\r\n\tfunction getSelectorSpecificity(selector) {\r\n\t\tvar typeCount = [0, 0, 0];\r\n\t\tvar findMatch = function(regex, type) {\r\n\t\t\tvar matches = selector.match(regex);\r\n\t\t\tif (matches == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttypeCount[type] += matches.length;\r\n\t\t\tselector = selector.replace(regex, ' ');\r\n\t\t};\r\n\r\n\t\tselector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ');\r\n\t\tselector = selector.replace(/{[\\s\\S]*/gm, ' ');\r\n\t\tfindMatch(attributeRegex, 1);\r\n\t\tfindMatch(idRegex, 0);\r\n\t\tfindMatch(classRegex, 1);\r\n\t\tfindMatch(pseudoElementRegex, 2);\r\n\t\tfindMatch(pseudoClassWithBracketsRegex, 1);\r\n\t\tfindMatch(pseudoClassRegex, 1);\r\n\t\tselector = selector.replace(/[\\*\\s\\+>~]/g, ' ');\r\n\t\tselector = selector.replace(/[#\\.]/g, ' ');\r\n\t\tfindMatch(elementRegex, 2);\r\n\t\treturn typeCount.join('');\r\n\t}\r\n\r\n\tfunction build(opts) {\r\n\t\tvar svg = { opts: opts };\r\n\r\n\t\tsvg.FRAMERATE = 30;\r\n\t\tsvg.MAX_VIRTUAL_PIXELS = 30000;\r\n\r\n\t\tsvg.log = function(msg) {};\r\n\t\tif (svg.opts['log'] == true && typeof console != 'undefined') {\r\n\t\t\tsvg.log = function(msg) { console.log(msg); };\r\n\t\t};\r\n\r\n\t\t// globals\r\n\t\tsvg.init = function(ctx) {\r\n\t\t\tvar uniqueId = 0;\r\n\t\t\tsvg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId;\t};\r\n\t\t\tsvg.Definitions = {};\r\n\t\t\tsvg.Styles = {};\r\n\t\t\tsvg.StylesSpecificity = {};\r\n\t\t\tsvg.Animations = [];\r\n\t\t\tsvg.Images = [];\r\n\t\t\tsvg.ctx = ctx;\r\n\t\t\tsvg.ViewPort = new (function () {\r\n\t\t\t\tthis.viewPorts = [];\r\n\t\t\t\tthis.Clear = function() { this.viewPorts = []; }\r\n\t\t\t\tthis.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }\r\n\t\t\t\tthis.RemoveCurrent = function() { this.viewPorts.pop(); }\r\n\t\t\t\tthis.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }\r\n\t\t\t\tthis.width = function() { return this.Current().width; }\r\n\t\t\t\tthis.height = function() { return this.Current().height; }\r\n\t\t\t\tthis.ComputeSize = function(d) {\r\n\t\t\t\t\tif (d != null && typeof d == 'number') return d;\r\n\t\t\t\t\tif (d == 'x') return this.width();\r\n\t\t\t\t\tif (d == 'y') return this.height();\r\n\t\t\t\t\treturn Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tsvg.init();\r\n\r\n\t\t// images loaded\r\n\t\tsvg.ImagesLoaded = function() {\r\n\t\t\tfor (var i=0; i<svg.Images.length; i++) {\r\n\t\t\t\tif (!svg.Images[i].loaded) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// trim\r\n\t\tsvg.trim = function(s) { return s.replace(/^\\s+|\\s+$/g, ''); }\r\n\r\n\t\t// compress spaces\r\n\t\tsvg.compressSpaces = function(s) { return s.replace(/[\\s\\r\\t\\n]+/gm,' '); }\r\n\r\n\t\t// ajax\r\n\t\tsvg.ajax = function(url) {\r\n\t\t\tvar AJAX;\r\n\t\t\tif(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}\r\n\t\t\telse{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}\r\n\t\t\tif(AJAX){\r\n\t\t\t   AJAX.open('GET',url,false);\r\n\t\t\t   AJAX.send(null);\r\n\t\t\t   return AJAX.responseText;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// parse xml\r\n\t\tsvg.parseXml = function(xml) {\r\n\t\t\tif (typeof Windows != 'undefined' && typeof Windows.Data != 'undefined' && typeof Windows.Data.Xml != 'undefined') {\r\n\t\t\t\tvar xmlDoc = new Windows.Data.Xml.Dom.XmlDocument();\r\n\t\t\t\tvar settings = new Windows.Data.Xml.Dom.XmlLoadSettings();\r\n\t\t\t\tsettings.prohibitDtd = false;\r\n\t\t\t\txmlDoc.loadXml(xml, settings);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t\telse if (window.DOMParser)\r\n\t\t\t{\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar parser = new DOMParser();\r\n\t\t\t\t\treturn parser.parseFromString(xml, 'image/svg+xml');\r\n\t\t\t\t}\r\n\t\t\t\tcatch(e){\r\n\t\t\t\t\tparser = new DOMParser();\r\n\t\t\t\t\treturn parser.parseFromString(xml, 'text/xml');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\txml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\r\n\t\t\t\tvar xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\r\n\t\t\t\txmlDoc.async = 'false';\r\n\t\t\t\txmlDoc.loadXML(xml);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Property = function(name, value) {\r\n\t\t\tthis.name = name;\r\n\t\t\tthis.value = value;\r\n\t\t}\r\n\t\t\tsvg.Property.prototype.getValue = function() {\r\n\t\t\t\treturn this.value;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.hasValue = function() {\r\n\t\t\t\treturn (this.value != null && this.value !== '');\r\n\t\t\t}\r\n\r\n\t\t\t// return the numerical value of the property\r\n\t\t\tsvg.Property.prototype.numValue = function() {\r\n\t\t\t\tif (!this.hasValue()) return 0;\r\n\r\n\t\t\t\tvar n = parseFloat(this.value);\r\n\t\t\t\tif ((this.value + '').match(/%$/)) {\r\n\t\t\t\t\tn = n / 100.0;\r\n\t\t\t\t}\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.valueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.value;\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.numValueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.numValue();\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\t// color extensions\r\n\t\t\t\t// augment the current color value with the opacity\r\n\t\t\t\tsvg.Property.prototype.addOpacity = function(opacityProp) {\r\n\t\t\t\t\tvar newValue = this.value;\r\n\t\t\t\t\tif (opacityProp.value != null && opacityProp.value != '' && typeof this.value == 'string') { // can only add opacity to colors, not patterns\r\n\t\t\t\t\t\tvar color = new RGBColor(this.value);\r\n\t\t\t\t\t\tif (color.ok) {\r\n\t\t\t\t\t\t\tnewValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new svg.Property(this.name, newValue);\r\n\t\t\t\t}\r\n\r\n\t\t\t// definition extensions\r\n\t\t\t\t// get the definition from the definitions table\r\n\t\t\t\tsvg.Property.prototype.getDefinition = function() {\r\n\t\t\t\t\tvar name = this.value.match(/#([^\\)'\"]+)/);\r\n\t\t\t\t\tif (name) { name = name[1]; }\r\n\t\t\t\t\tif (!name) { name = this.value; }\r\n\t\t\t\t\treturn svg.Definitions[name];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.isUrlDefinition = function() {\r\n\t\t\t\t\treturn this.value.indexOf('url(') == 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {\r\n\t\t\t\t\tvar def = this.getDefinition();\r\n\r\n\t\t\t\t\t// gradient\r\n\t\t\t\t\tif (def != null && def.createGradient) {\r\n\t\t\t\t\t\treturn def.createGradient(svg.ctx, e, opacityProp);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// pattern\r\n\t\t\t\t\tif (def != null && def.createPattern) {\r\n\t\t\t\t\t\tif (def.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\t\t\tvar pt = def.attribute('patternTransform');\r\n\t\t\t\t\t\t\tdef = def.getHrefAttribute().getDefinition();\r\n\t\t\t\t\t\t\tif (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn def.createPattern(svg.ctx, e);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t// length extensions\r\n\t\t\t\tsvg.Property.prototype.getDPI = function(viewPort) {\r\n\t\t\t\t\treturn 96.0; // TODO: compute?\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getEM = function(viewPort) {\r\n\t\t\t\t\tvar em = 12;\r\n\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tif (fontSize.hasValue()) em = fontSize.toPixels(viewPort);\r\n\r\n\t\t\t\t\treturn em;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getUnits = function() {\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\treturn s.replace(/[0-9\\.\\-]/g,'');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get the length as pixels\r\n\t\t\t\tsvg.Property.prototype.toPixels = function(viewPort, processPercent) {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);\r\n\t\t\t\t\tif (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0;\r\n\t\t\t\t\tif (s.match(/px$/)) return this.numValue();\r\n\t\t\t\t\tif (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);\r\n\t\t\t\t\tif (s.match(/pc$/)) return this.numValue() * 15;\r\n\t\t\t\t\tif (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;\r\n\t\t\t\t\tif (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;\r\n\t\t\t\t\tif (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);\r\n\t\t\t\t\tif (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\tvar n = this.numValue();\r\n\t\t\t\t\tif (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\treturn n;\r\n\t\t\t\t}\r\n\r\n\t\t\t// time extensions\r\n\t\t\t\t// get the time as milliseconds\r\n\t\t\t\tsvg.Property.prototype.toMilliseconds = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/s$/)) return this.numValue() * 1000;\r\n\t\t\t\t\tif (s.match(/ms$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue();\r\n\t\t\t\t}\r\n\r\n\t\t\t// angle extensions\r\n\t\t\t\t// get the angle as radians\r\n\t\t\t\tsvg.Property.prototype.toRadians = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t\tif (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0);\r\n\t\t\t\t\tif (s.match(/rad$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t}\r\n\r\n\t\t\t// text extensions\r\n\t\t\t\t// get the text baseline\r\n\t\t\t\tvar textBaselineMapping = {\r\n\t\t\t\t\t'baseline': 'alphabetic',\r\n\t\t\t\t\t'before-edge': 'top',\r\n\t\t\t\t\t'text-before-edge': 'top',\r\n\t\t\t\t\t'middle': 'middle',\r\n\t\t\t\t\t'central': 'middle',\r\n\t\t\t\t\t'after-edge': 'bottom',\r\n\t\t\t\t\t'text-after-edge': 'bottom',\r\n\t\t\t\t\t'ideographic': 'ideographic',\r\n\t\t\t\t\t'alphabetic': 'alphabetic',\r\n\t\t\t\t\t'hanging': 'hanging',\r\n\t\t\t\t\t'mathematical': 'alphabetic'\r\n\t\t\t\t};\r\n\t\t\t\tsvg.Property.prototype.toTextBaseline = function () {\r\n\t\t\t\t\tif (!this.hasValue()) return null;\r\n\t\t\t\t\treturn textBaselineMapping[this.value];\r\n\t\t\t\t}\r\n\r\n\t\t// fonts\r\n\t\tsvg.Font = new (function() {\r\n\t\t\tthis.Styles = 'normal|italic|oblique|inherit';\r\n\t\t\tthis.Variants = 'normal|small-caps|inherit';\r\n\t\t\tthis.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\r\n\r\n\t\t\tthis.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\r\n\t\t\t\tvar f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tfontFamily: fontFamily || f.fontFamily,\r\n\t\t\t\t\tfontSize: fontSize || f.fontSize,\r\n\t\t\t\t\tfontStyle: fontStyle || f.fontStyle,\r\n\t\t\t\t\tfontWeight: fontWeight || f.fontWeight,\r\n\t\t\t\t\tfontVariant: fontVariant || f.fontVariant,\r\n\t\t\t\t\ttoString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Parse = function(s) {\r\n\t\t\t\tvar f = {};\r\n\t\t\t\tvar d = svg.trim(svg.compressSpaces(s || '')).split(' ');\r\n\t\t\t\tvar set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }\r\n\t\t\t\tvar ff = '';\r\n\t\t\t\tfor (var i=0; i<d.length; i++) {\r\n\t\t\t\t\tif (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }\r\n\t\t\t\t\telse if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;\t}\r\n\t\t\t\t\telse if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {\tif (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }\r\n\t\t\t\t\telse if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }\r\n\t\t\t\t\telse { if (d[i] != 'inherit') ff += d[i]; }\r\n\t\t\t\t} if (ff != '') f.fontFamily = ff;\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// points and paths\r\n\t\tsvg.ToNumberArray = function(s) {\r\n\t\t\tvar a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\r\n\t\t\tfor (var i=0; i<a.length; i++) {\r\n\t\t\t\ta[i] = parseFloat(a[i]);\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\t\tsvg.Point = function(x, y) {\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t}\r\n\t\t\tsvg.Point.prototype.angleTo = function(p) {\r\n\t\t\t\treturn Math.atan2(p.y - this.y, p.x - this.x);\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Point.prototype.applyTransform = function(v) {\r\n\t\t\t\tvar xp = this.x * v[0] + this.y * v[2] + v[4];\r\n\t\t\t\tvar yp = this.x * v[1] + this.y * v[3] + v[5];\r\n\t\t\t\tthis.x = xp;\r\n\t\t\t\tthis.y = yp;\r\n\t\t\t}\r\n\r\n\t\tsvg.CreatePoint = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\treturn new svg.Point(a[0], a[1]);\r\n\t\t}\r\n\t\tsvg.CreatePath = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\tvar path = [];\r\n\t\t\tfor (var i=0; i<a.length; i+=2) {\r\n\t\t\t\tpath.push(new svg.Point(a[i], a[i+1]));\r\n\t\t\t}\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t// bounding box\r\n\t\tsvg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want\r\n\t\t\tthis.x1 = Number.NaN;\r\n\t\t\tthis.y1 = Number.NaN;\r\n\t\t\tthis.x2 = Number.NaN;\r\n\t\t\tthis.y2 = Number.NaN;\r\n\r\n\t\t\tthis.x = function() { return this.x1; }\r\n\t\t\tthis.y = function() { return this.y1; }\r\n\t\t\tthis.width = function() { return this.x2 - this.x1; }\r\n\t\t\tthis.height = function() { return this.y2 - this.y1; }\r\n\r\n\t\t\tthis.addPoint = function(x, y) {\r\n\t\t\t\tif (x != null) {\r\n\t\t\t\t\tif (isNaN(this.x1) || isNaN(this.x2)) {\r\n\t\t\t\t\t\tthis.x1 = x;\r\n\t\t\t\t\t\tthis.x2 = x;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x < this.x1) this.x1 = x;\r\n\t\t\t\t\tif (x > this.x2) this.x2 = x;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (y != null) {\r\n\t\t\t\t\tif (isNaN(this.y1) || isNaN(this.y2)) {\r\n\t\t\t\t\t\tthis.y1 = y;\r\n\t\t\t\t\t\tthis.y2 = y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y < this.y1) this.y1 = y;\r\n\t\t\t\t\tif (y > this.y2) this.y2 = y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.addX = function(x) { this.addPoint(x, null); }\r\n\t\t\tthis.addY = function(y) { this.addPoint(null, y); }\r\n\r\n\t\t\tthis.addBoundingBox = function(bb) {\r\n\t\t\t\tthis.addPoint(bb.x1, bb.y1);\r\n\t\t\t\tthis.addPoint(bb.x2, bb.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {\r\n\t\t\t\tvar cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tvar cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tthis.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,\tcp2y, p2x, p2y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\r\n\t\t\t\t// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\r\n\t\t\t\tvar p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\r\n\t\t\t\tthis.addPoint(p0[0], p0[1]);\r\n\t\t\t\tthis.addPoint(p3[0], p3[1]);\r\n\r\n\t\t\t\tfor (i=0; i<=1; i++) {\r\n\t\t\t\t\tvar f = function(t) {\r\n\t\t\t\t\t\treturn Math.pow(1-t, 3) * p0[i]\r\n\t\t\t\t\t\t+ 3 * Math.pow(1-t, 2) * t * p1[i]\r\n\t\t\t\t\t\t+ 3 * (1-t) * Math.pow(t, 2) * p2[i]\r\n\t\t\t\t\t\t+ Math.pow(t, 3) * p3[i];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\r\n\t\t\t\t\tvar a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\r\n\t\t\t\t\tvar c = 3 * p1[i] - 3 * p0[i];\r\n\r\n\t\t\t\t\tif (a == 0) {\r\n\t\t\t\t\t\tif (b == 0) continue;\r\n\t\t\t\t\t\tvar t = -c / b;\r\n\t\t\t\t\t\tif (0 < t && t < 1) {\r\n\t\t\t\t\t\t\tif (i == 0) this.addX(f(t));\r\n\t\t\t\t\t\t\tif (i == 1) this.addY(f(t));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b2ac = Math.pow(b, 2) - 4 * c * a;\r\n\t\t\t\t\tif (b2ac < 0) continue;\r\n\t\t\t\t\tvar t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t1 && t1 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t1));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t1));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t2 && t2 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t2));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t2));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.isPointInBox = function(x, y) {\r\n\t\t\t\treturn (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addPoint(x1, y1);\r\n\t\t\tthis.addPoint(x2, y2);\r\n\t\t}\r\n\r\n\t\t// transforms\r\n\t\tsvg.Transform = function(v) {\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Type = {}\r\n\r\n\t\t\t// translate\r\n\t\t\tthis.Type.translate = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.p.x || 0.0, this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// rotate\r\n\t\t\tthis.Type.rotate = function(s) {\r\n\t\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', a[0]);\r\n\t\t\t\tthis.cx = a[1] || 0;\r\n\t\t\t\tthis.cy = a[2] || 0;\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(-1.0 * this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tvar a = this.angle.toRadians();\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t\tp.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.scale = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.matrix = function(s) {\r\n\t\t\t\tthis.m = svg.ToNumberArray(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tvar a = this.m[0];\r\n\t\t\t\t\tvar b = this.m[2];\r\n\t\t\t\t\tvar c = this.m[4];\r\n\t\t\t\t\tvar d = this.m[1];\r\n\t\t\t\t\tvar e = this.m[3];\r\n\t\t\t\t\tvar f = this.m[5];\r\n\t\t\t\t\tvar g = 0.0;\r\n\t\t\t\t\tvar h = 0.0;\r\n\t\t\t\t\tvar i = 1.0;\r\n\t\t\t\t\tvar det = 1 / (a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g));\r\n\t\t\t\t\tctx.transform(\r\n\t\t\t\t\t\tdet*(e*i-f*h),\r\n\t\t\t\t\t\tdet*(f*g-d*i),\r\n\t\t\t\t\t\tdet*(c*h-b*i),\r\n\t\t\t\t\t\tdet*(a*i-c*g),\r\n\t\t\t\t\t\tdet*(b*f-c*e),\r\n\t\t\t\t\t\tdet*(c*d-a*f)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform(this.m);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.SkewBase = function(s) {\r\n\t\t\t\tthis.base = that.Type.matrix;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', s);\r\n\t\t\t}\r\n\t\t\tthis.Type.SkewBase.prototype = new this.Type.matrix;\r\n\r\n\t\t\tthis.Type.skewX = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewX.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.Type.skewY = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewY.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.transforms = [];\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].apply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\tfor (var i=this.transforms.length-1; i>=0; i--) {\r\n\t\t\t\t\tthis.transforms[i].unapply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].applyToPoint(p);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar data = svg.trim(svg.compressSpaces(v)).replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g,') ').split(/\\s(?=[a-z])/);\r\n\t\t\tfor (var i=0; i<data.length; i++) {\r\n\t\t\t\tvar type = svg.trim(data[i].split('(')[0]);\r\n\t\t\t\tvar s = data[i].split('(')[1].replace(')','');\r\n\t\t\t\tvar transformType = this.Type[type];\r\n\t\t\t\tif (typeof transformType != 'undefined') {\r\n\t\t\t\t\tvar transform = new transformType(s);\r\n\t\t\t\t\ttransform.type = type;\r\n\t\t\t\t\tthis.transforms.push(transform);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// aspect ratio\r\n\t\tsvg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\r\n\t\t\t// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\r\n\t\t\taspectRatio = svg.compressSpaces(aspectRatio);\r\n\t\t\taspectRatio = aspectRatio.replace(/^defer\\s/,''); // ignore defer\r\n\t\t\tvar align = aspectRatio.split(' ')[0] || 'xMidYMid';\r\n\t\t\tvar meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\r\n\r\n\t\t\t// calculate scale\r\n\t\t\tvar scaleX = width / desiredWidth;\r\n\t\t\tvar scaleY = height / desiredHeight;\r\n\t\t\tvar scaleMin = Math.min(scaleX, scaleY);\r\n\t\t\tvar scaleMax = Math.max(scaleX, scaleY);\r\n\t\t\tif (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\r\n\t\t\tif (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\r\n\r\n\t\t\trefX = new svg.Property('refX', refX);\r\n\t\t\trefY = new svg.Property('refY', refY);\r\n\t\t\tif (refX.hasValue() && refY.hasValue()) {\r\n\t\t\t\tctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// align\r\n\t\t\t\tif (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0);\r\n\t\t\t\tif (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0);\r\n\t\t\t\tif (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0);\r\n\t\t\t\tif (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight);\r\n\t\t\t}\r\n\r\n\t\t\t// scale\r\n\t\t\tif (align == 'none') ctx.scale(scaleX, scaleY);\r\n\t\t\telse if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin);\r\n\t\t\telse if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax);\r\n\r\n\t\t\t// translate\r\n\t\t\tctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);\r\n\t\t}\r\n\r\n\t\t// elements\r\n\t\tsvg.Element = {}\r\n\r\n\t\tsvg.EmptyProperty = new svg.Property('EMPTY', '');\r\n\r\n\t\tsvg.Element.ElementBase = function(node) {\r\n\t\t\tthis.attributes = {};\r\n\t\t\tthis.styles = {};\r\n\t\t\tthis.stylesSpecificity = {};\r\n\t\t\tthis.children = [];\r\n\r\n\t\t\t// get or create attribute\r\n\t\t\tthis.attribute = function(name, createIfNotExists) {\r\n\t\t\t\tvar a = this.attributes[name];\r\n\t\t\t\tif (a != null) return a;\r\n\r\n\t\t\t\tif (createIfNotExists == true) { a = new svg.Property(name, ''); this.attributes[name] = a; }\r\n\t\t\t\treturn a || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getHrefAttribute = function() {\r\n\t\t\t\tfor (var a in this.attributes) {\r\n\t\t\t\t\tif (a == 'href' || a.match(/:href$/)) {\r\n\t\t\t\t\t\treturn this.attributes[a];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// get or create style, crawls up node tree\r\n\t\t\tthis.style = function(name, createIfNotExists, skipAncestors) {\r\n\t\t\t\tvar s = this.styles[name];\r\n\t\t\t\tif (s != null) return s;\r\n\r\n\t\t\t\tvar a = this.attribute(name);\r\n\t\t\t\tif (a != null && a.hasValue()) {\r\n\t\t\t\t\tthis.styles[name] = a; // move up to me to cache\r\n\t\t\t\t\treturn a;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (skipAncestors != true) {\r\n\t\t\t\t\tvar p = this.parent;\r\n\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\tvar ps = p.style(name);\r\n\t\t\t\t\t\tif (ps != null && ps.hasValue()) {\r\n\t\t\t\t\t\t\treturn ps;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (createIfNotExists == true) { s = new svg.Property(name, ''); this.styles[name] = s; }\r\n\t\t\t\treturn s || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// base render\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// don't render display=none\r\n\t\t\t\tif (this.style('display').value == 'none') return;\r\n\r\n\t\t\t\t// don't render visibility=hidden\r\n\t\t\t\tif (this.style('visibility').value == 'hidden') return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (this.style('mask').hasValue()) { // mask\r\n\t\t\t\t\tvar mask = this.style('mask').getDefinition();\r\n\t\t\t\t\tif (mask != null) mask.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('filter').hasValue()) { // filter\r\n\t\t\t\t\tvar filter = this.style('filter').getDefinition();\r\n\t\t\t\t\tif (filter != null) filter.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\t\tthis.renderChildren(ctx);\r\n\t\t\t\t\tthis.clearContext(ctx);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\t// base set context\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base clear context\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base render children\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.children[i].render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addChild = function(childNode, create) {\r\n\t\t\t\tvar child = childNode;\r\n\t\t\t\tif (create) child = svg.CreateElement(childNode);\r\n\t\t\t\tchild.parent = this;\r\n\t\t\t\tif (child.type != 'title') { this.children.push(child);\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addStylesFromStyleDefinition = function () {\r\n\t\t\t\t// add styles\r\n\t\t\t\tfor (var selector in svg.Styles) {\r\n\t\t\t\t\tif (selector[0] != '@' && matchesSelector(node, selector)) {\r\n\t\t\t\t\t\tvar styles = svg.Styles[selector];\r\n\t\t\t\t\t\tvar specificity = svg.StylesSpecificity[selector];\r\n\t\t\t\t\t\tif (styles != null) {\r\n\t\t\t\t\t\t\tfor (var name in styles) {\r\n\t\t\t\t\t\t\t\tvar existingSpecificity = this.stylesSpecificity[name];\r\n\t\t\t\t\t\t\t\tif (typeof existingSpecificity == 'undefined') {\r\n\t\t\t\t\t\t\t\t\texistingSpecificity = '000';\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (specificity > existingSpecificity) {\r\n\t\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\r\n\t\t\t\t\t\t\t\t\tthis.stylesSpecificity[name] = specificity;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// Microsoft Edge fix\r\n\t\t\tvar allUppercase = new RegExp(\"^[A-Z\\-]+$\");\r\n\t\t\tvar normalizeAttributeName = function (name) {\r\n\t\t\t\tif (allUppercase.test(name)) {\r\n\t\t\t\t\treturn name.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\treturn name;\r\n\t\t\t};\r\n\r\n\t\t\tif (node != null && node.nodeType == 1) { //ELEMENT_NODE\r\n\t\t\t\t// add attributes\r\n\t\t\t\tfor (var i=0; i<node.attributes.length; i++) {\r\n\t\t\t\t\tvar attribute = node.attributes[i];\r\n\t\t\t\t\tvar nodeName = normalizeAttributeName(attribute.nodeName);\r\n\t\t\t\t\tthis.attributes[nodeName] = new svg.Property(nodeName, attribute.value);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addStylesFromStyleDefinition();\r\n\r\n\t\t\t\t// add inline styles\r\n\t\t\t\tif (this.attribute('style').hasValue()) {\r\n\t\t\t\t\tvar styles = this.attribute('style').value.split(';');\r\n\t\t\t\t\tfor (var i=0; i<styles.length; i++) {\r\n\t\t\t\t\t\tif (svg.trim(styles[i]) != '') {\r\n\t\t\t\t\t\t\tvar style = styles[i].split(':');\r\n\t\t\t\t\t\t\tvar name = svg.trim(style[0]);\r\n\t\t\t\t\t\t\tvar value = svg.trim(style[1]);\r\n\t\t\t\t\t\t\tthis.styles[name] = new svg.Property(name, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add id\r\n\t\t\t\tif (this.attribute('id').hasValue()) {\r\n\t\t\t\t\tif (svg.Definitions[this.attribute('id').value] == null) {\r\n\t\t\t\t\t\tsvg.Definitions[this.attribute('id').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add children\r\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\t\tvar childNode = node.childNodes[i];\r\n\t\t\t\t\tif (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE\r\n\t\t\t\t\tif (this.captureTextNodes && (childNode.nodeType == 3 || childNode.nodeType == 4)) {\r\n\t\t\t\t\t\tvar text = childNode.value || childNode.text || childNode.textContent || '';\r\n\t\t\t\t\t\tif (svg.compressSpaces(text) != '') {\r\n\t\t\t\t\t\t\tthis.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Element.RenderedElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// fill\r\n\t\t\t\tif (this.style('fill').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.fillStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('fill').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = this.style('fill');\r\n\t\t\t\t\tif (fillStyle.value == 'currentColor') fillStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (fillStyle.value != 'inherit') ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('fill-opacity').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = new svg.Property('fill', ctx.fillStyle);\r\n\t\t\t\t\tfillStyle = fillStyle.addOpacity(this.style('fill-opacity'));\r\n\t\t\t\t\tctx.fillStyle = fillStyle.value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// stroke\r\n\t\t\t\tif (this.style('stroke').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.strokeStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('stroke').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = this.style('stroke');\r\n\t\t\t\t\tif (strokeStyle.value == 'currentColor') strokeStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (strokeStyle.value != 'inherit') ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-opacity').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = new svg.Property('stroke', ctx.strokeStyle);\r\n\t\t\t\t\tstrokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));\r\n\t\t\t\t\tctx.strokeStyle = strokeStyle.value;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-width').hasValue()) {\r\n\t\t\t\t\tvar newLineWidth = this.style('stroke-width').toPixels();\r\n\t\t\t\t\tctx.lineWidth = newLineWidth == 0 ? 0.001 : newLineWidth; // browsers don't respect 0\r\n\t\t\t    }\r\n\t\t\t\tif (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\r\n\t\t\t\tif (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\r\n\t\t\t\tif (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\r\n\t\t\t\tif (this.style('paint-order').hasValue()) ctx.paintOrder = this.style('paint-order').value;\r\n\t\t\t\tif (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value != 'none') {\r\n\t\t\t\t\tvar gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);\r\n\t\t\t\t\tif (typeof ctx.setLineDash != 'undefined') { ctx.setLineDash(gaps); }\r\n\t\t\t\t\telse if (typeof ctx.webkitLineDash != 'undefined') { ctx.webkitLineDash = gaps; }\r\n\t\t\t\t\telse if (typeof ctx.mozDash != 'undefined' && !(gaps.length==1 && gaps[0]==0)) { ctx.mozDash = gaps; }\r\n\r\n\t\t\t\t\tvar offset = this.style('stroke-dashoffset').numValueOrDefault(1);\r\n\t\t\t\t\tif (typeof ctx.lineDashOffset != 'undefined') { ctx.lineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof ctx.webkitLineDashOffset != 'undefined') { ctx.webkitLineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof ctx.mozDashOffset != 'undefined') { ctx.mozDashOffset = offset; }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// font\r\n\t\t\t\tif (typeof ctx.font != 'undefined') {\r\n\t\t\t\t\tctx.font = svg.Font.CreateFont(\r\n\t\t\t\t\t\tthis.style('font-style').value,\r\n\t\t\t\t\t\tthis.style('font-variant').value,\r\n\t\t\t\t\t\tthis.style('font-weight').value,\r\n\t\t\t\t\t\tthis.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '',\r\n\t\t\t\t\t\tthis.style('font-family').value).toString();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// transform\r\n\t\t\t\tif (this.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\tvar transform = new svg.Transform(this.style('transform', false, true).value);\r\n\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clip\r\n\t\t\t\tif (this.style('clip-path', false, true).hasValue()) {\r\n\t\t\t\t\tvar clip = this.style('clip-path', false, true).getDefinition();\r\n\t\t\t\t\tif (clip != null) clip.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// opacity\r\n\t\t\t\tif (this.style('opacity').hasValue()) {\r\n\t\t\t\t\tctx.globalAlpha = this.style('opacity').numValue();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.PathElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\treturn new svg.BoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.path(ctx);\r\n\t\t\t\tsvg.Mouse.checkPath(this, ctx);\r\n\t\t\t\tif (ctx.fillStyle != '') {\r\n\t\t\t\t\tif (this.style('fill-rule').valueOrDefault('inherit') != 'inherit') { ctx.fill(this.style('fill-rule').value); }\r\n\t\t\t\t\telse { ctx.fill(); }\r\n\t\t\t\t}\r\n\t\t\t\tif (ctx.strokeStyle != '') ctx.stroke();\r\n\r\n\t\t\t\tvar markers = this.getMarkers();\r\n\t\t\t\tif (markers != null) {\r\n\t\t\t\t\tif (this.style('marker-start').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-start').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[0][0], markers[0][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-mid').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-mid').getDefinition();\r\n\t\t\t\t\t\tfor (var i=1;i<markers.length-1;i++) {\r\n\t\t\t\t\t\t\tmarker.render(ctx, markers[i][0], markers[i][1]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-end').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-end').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\treturn this.path();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// svg element\r\n\t\tsvg.Element.svg = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseClearContext = this.clearContext;\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\tthis.baseClearContext(ctx);\r\n\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// initial values and defaults\r\n\t\t\t\tctx.strokeStyle = 'rgba(0,0,0,0)';\r\n\t\t\t\tctx.lineCap = 'butt';\r\n\t\t\t\tctx.lineJoin = 'miter';\r\n\t\t\t\tctx.miterLimit = 4;\r\n\t\t\t\tif (typeof ctx.font != 'undefined' && typeof window.getComputedStyle != 'undefined') {\r\n\t\t\t\t\tctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\t// create new view port\r\n\t\t\t\tif (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;\r\n\t\t\t\tif (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;\r\n\t\t\t\tctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));\r\n\r\n\t\t\t\tvar width = svg.ViewPort.width();\r\n\t\t\t\tvar height = svg.ViewPort.height();\r\n\r\n\t\t\t\tif (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';\r\n\t\t\t\tif (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';\r\n\t\t\t\tif (typeof this.root == 'undefined') {\r\n\t\t\t\t\twidth = this.attribute('width').toPixels('x');\r\n\t\t\t\t\theight = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\t\tvar x = 0;\r\n\t\t\t\t\tvar y = 0;\r\n\t\t\t\t\tif (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\r\n\t\t\t\t\t\tx = -this.attribute('refX').toPixels('x');\r\n\t\t\t\t\t\ty = -this.attribute('refY').toPixels('y');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.attribute('overflow').valueOrDefault('hidden') != 'visible') {\r\n\t\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\t\tctx.moveTo(x, y);\r\n\t\t\t\t\t\tctx.lineTo(width, y);\r\n\t\t\t\t\t\tctx.lineTo(width, height);\r\n\t\t\t\t\t\tctx.lineTo(x, height);\r\n\t\t\t\t\t\tctx.closePath();\r\n\t\t\t\t\t\tctx.clip();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(width, height);\r\n\r\n\t\t\t\t// viewbox\r\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\r\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\r\n\t\t\t\t\tvar minX = viewBox[0];\r\n\t\t\t\t\tvar minY = viewBox[1];\r\n\t\t\t\t\twidth = viewBox[2];\r\n\t\t\t\t\theight = viewBox[3];\r\n\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.width(),\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.height(),\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tminX,\r\n\t\t\t\t\t\t\t\t\tminY,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refX').value,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refY').value);\r\n\r\n\t\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.svg.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// rect element\r\n\t\tsvg.Element.rect = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tif (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\r\n\t\t\t\tif (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\r\n\t\t\t\trx = Math.min(rx, width / 2.0);\r\n\t\t\t\try = Math.min(ry, height / 2.0);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(x + rx, y);\r\n\t\t\t\t\tctx.lineTo(x + width - rx, y);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\r\n\t\t\t\t\tctx.lineTo(x + width, y + height - ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\r\n\t\t\t\t\tctx.lineTo(x + rx, y + height);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\r\n\t\t\t\t\tctx.lineTo(x, y + ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + rx, y)\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.rect.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// circle element\r\n\t\tsvg.Element.circle = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\t\t\t\tvar r = this.attribute('r').toPixels();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.arc(cx, cy, r, 0, Math.PI * 2, true);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.circle.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// ellipse element\r\n\t\tsvg.Element.ellipse = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(cx, cy - ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.ellipse.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// line element\r\n\t\tsvg.Element.line = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getPoints = function() {\r\n\t\t\t\treturn [\r\n\t\t\t\t\tnew svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),\r\n\t\t\t\t\tnew svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))];\r\n\t\t\t}\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar points = this.getPoints();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\r\n\t\t\t\t\tctx.lineTo(points[1].x, points[1].y);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.getPoints();\r\n\t\t\t\tvar a = points[0].angleTo(points[1]);\r\n\t\t\t\treturn [[points[0], a], [points[1], a]];\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.line.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polyline element\r\n\t\tsvg.Element.polyline = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.points = svg.CreatePath(this.attribute('points').value);\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i=1; i<this.points.length; i++) {\r\n\t\t\t\t\tbb.addPoint(this.points[i].x, this.points[i].y);\r\n\t\t\t\t\tif (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<this.points.length - 1; i++) {\r\n\t\t\t\t\tmarkers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);\r\n\t\t\t\t}\r\n\t\t\t\tif (markers.length > 0) {\r\n\t\t\t\t\tmarkers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);\r\n\t\t\t\t}\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polyline.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polygon element\r\n\t\tsvg.Element.polygon = function(node) {\r\n\t\t\tthis.base = svg.Element.polyline;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.basePath = this.path;\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = this.basePath(ctx);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.lineTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polygon.prototype = new svg.Element.polyline;\r\n\r\n\t\t// path element\r\n\t\tsvg.Element.path = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar d = this.attribute('d').value;\r\n\t\t\t// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF\r\n\t\t\td = d.replace(/,/gm,' '); // get rid of all commas\r\n\t\t\t// As the end of a match can also be the start of the next match, we need to run this replace twice.\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,'$1 $2'); // suffix commands with spaces\r\n\t\t\td = d.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // prefix commands with spaces\r\n\t\t\td = d.replace(/([0-9])([+\\-])/gm,'$1 $2'); // separate digits on +- signs\r\n\t\t\t// Again, we need to run this twice to find all occurances\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/(\\.[0-9]*)(\\.)/gm,'$1 $2'); // separate digits when they start with a comma\r\n\t\t\td = d.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax\r\n\t\t\td = svg.compressSpaces(d); // compress multiple spaces\r\n\t\t\td = svg.trim(d);\r\n\t\t\tthis.PathParser = new (function(d) {\r\n\t\t\t\tthis.tokens = d.split(' ');\r\n\r\n\t\t\t\tthis.reset = function() {\r\n\t\t\t\t\tthis.i = -1;\r\n\t\t\t\t\tthis.command = '';\r\n\t\t\t\t\tthis.previousCommand = '';\r\n\t\t\t\t\tthis.start = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.control = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.current = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.points = [];\r\n\t\t\t\t\tthis.angles = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isEnd = function() {\r\n\t\t\t\t\treturn this.i >= this.tokens.length - 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isCommandOrEnd = function() {\r\n\t\t\t\t\tif (this.isEnd()) return true;\r\n\t\t\t\t\treturn this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isRelativeCommand = function() {\r\n\t\t\t\t\tswitch(this.command)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getToken = function() {\r\n\t\t\t\t\tthis.i++;\r\n\t\t\t\t\treturn this.tokens[this.i];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getScalar = function() {\r\n\t\t\t\t\treturn parseFloat(this.getToken());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.nextCommand = function() {\r\n\t\t\t\t\tthis.previousCommand = this.command;\r\n\t\t\t\t\tthis.command = this.getToken();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getPoint = function() {\r\n\t\t\t\t\tvar p = new svg.Point(this.getScalar(), this.getScalar());\r\n\t\t\t\t\treturn this.makeAbsolute(p);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsControlPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.control = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsCurrentPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.current = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getReflectedControlPoint = function() {\r\n\t\t\t\t\tif (this.previousCommand.toLowerCase() != 'c' &&\r\n\t\t\t\t\t    this.previousCommand.toLowerCase() != 's' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 'q' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 't' ){\r\n\t\t\t\t\t\treturn this.current;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// reflect point\r\n\t\t\t\t\tvar p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.makeAbsolute = function(p) {\r\n\t\t\t\t\tif (this.isRelativeCommand()) {\r\n\t\t\t\t\t\tp.x += this.current.x;\r\n\t\t\t\t\t\tp.y += this.current.y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarker = function(p, from, priorTo) {\r\n\t\t\t\t\t// if the last angle isn't filled in because we didn't have this point yet ...\r\n\t\t\t\t\tif (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {\r\n\t\t\t\t\t\tthis.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.addMarkerAngle(p, from == null ? null : from.angleTo(p));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarkerAngle = function(p, a) {\r\n\t\t\t\t\tthis.points.push(p);\r\n\t\t\t\t\tthis.angles.push(a);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getMarkerPoints = function() { return this.points; }\r\n\t\t\t\tthis.getMarkerAngles = function() {\r\n\t\t\t\t\tfor (var i=0; i<this.angles.length; i++) {\r\n\t\t\t\t\t\tif (this.angles[i] == null) {\r\n\t\t\t\t\t\t\tfor (var j=i+1; j<this.angles.length; j++) {\r\n\t\t\t\t\t\t\t\tif (this.angles[j] != null) {\r\n\t\t\t\t\t\t\t\t\tthis.angles[i] = this.angles[j];\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.angles;\r\n\t\t\t\t}\r\n\t\t\t})(d);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar pp = this.PathParser;\r\n\t\t\t\tpp.reset();\r\n\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\twhile (!pp.isEnd()) {\r\n\t\t\t\t\tpp.nextCommand();\r\n\t\t\t\t\tswitch (pp.command) {\r\n\t\t\t\t\tcase 'M':\r\n\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\tpp.addMarker(p);\r\n\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\tif (ctx != null) ctx.moveTo(p.x, p.y);\r\n\t\t\t\t\t\tpp.start = pp.current;\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, pp.start);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'L':\r\n\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar c = pp.current;\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, c);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'H':\r\n\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'V':\r\n\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'C':\r\n\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'S':\r\n\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Q':\r\n\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'T':\r\n\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tpp.control = cntrl;\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'A':\r\n\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t    var curr = pp.current;\r\n\t\t\t\t\t\t\tvar rx = pp.getScalar();\r\n\t\t\t\t\t\t\tvar ry = pp.getScalar();\r\n\t\t\t\t\t\t\tvar xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\r\n\t\t\t\t\t\t\tvar largeArcFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar sweepFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\r\n\t\t\t\t\t\t\t// Conversion from endpoint to center parameterization\r\n\t\t\t\t\t\t\t// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\r\n\t\t\t\t\t\t\t// x1', y1'\r\n\t\t\t\t\t\t\tvar currp = new svg.Point(\r\n\t\t\t\t\t\t\t\tMath.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\r\n\t\t\t\t\t\t\t\t-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// adjust radii\r\n\t\t\t\t\t\t\tvar l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);\r\n\t\t\t\t\t\t\tif (l > 1) {\r\n\t\t\t\t\t\t\t\trx *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t\try *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// cx', cy'\r\n\t\t\t\t\t\t\tvar s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(\r\n\t\t\t\t\t\t\t\t((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /\r\n\t\t\t\t\t\t\t\t(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tif (isNaN(s)) s = 0;\r\n\t\t\t\t\t\t\tvar cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\r\n\t\t\t\t\t\t\t// cx, cy\r\n\t\t\t\t\t\t\tvar centp = new svg.Point(\r\n\t\t\t\t\t\t\t\t(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\r\n\t\t\t\t\t\t\t\t(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// vector magnitude\r\n\t\t\t\t\t\t\tvar m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }\r\n\t\t\t\t\t\t\t// ratio between two vectors\r\n\t\t\t\t\t\t\tvar r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }\r\n\t\t\t\t\t\t\t// angle between two vectors\r\n\t\t\t\t\t\t\tvar a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }\r\n\t\t\t\t\t\t\t// initial angle\r\n\t\t\t\t\t\t\tvar a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);\r\n\t\t\t\t\t\t\t// angle delta\r\n\t\t\t\t\t\t\tvar u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar ad = a(u, v);\r\n\t\t\t\t\t\t\tif (r(u,v) <= -1) ad = Math.PI;\r\n\t\t\t\t\t\t\tif (r(u,v) >= 1) ad = 0;\r\n\r\n\t\t\t\t\t\t\t// for markers\r\n\t\t\t\t\t\t\tvar dir = 1 - sweepFlag ? 1.0 : -1.0;\r\n\t\t\t\t\t\t\tvar ah = a1 + dir * (ad / 2.0);\r\n\t\t\t\t\t\t\tvar halfWay = new svg.Point(\r\n\t\t\t\t\t\t\t\tcentp.x + rx * Math.cos(ah),\r\n\t\t\t\t\t\t\t\tcentp.y + ry * Math.sin(ah)\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(cp, ah - dir * Math.PI);\r\n\r\n\t\t\t\t\t\t\tbb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\r\n\t\t\t\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\t\t\t\tvar r = rx > ry ? rx : ry;\r\n\t\t\t\t\t\t\t\tvar sx = rx > ry ? 1 : rx / ry;\r\n\t\t\t\t\t\t\t\tvar sy = rx > ry ? ry / rx : 1;\r\n\r\n\t\t\t\t\t\t\t\tctx.translate(centp.x, centp.y);\r\n\t\t\t\t\t\t\t\tctx.rotate(xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.scale(sx, sy);\r\n\t\t\t\t\t\t\t\tctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);\r\n\t\t\t\t\t\t\t\tctx.scale(1/sx, 1/sy);\r\n\t\t\t\t\t\t\t\tctx.rotate(-xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.translate(-centp.x, -centp.y);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Z':\r\n\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\tif (ctx != null) ctx.closePath();\r\n\t\t\t\t\t\tpp.current = pp.start;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.PathParser.getMarkerPoints();\r\n\t\t\t\tvar angles = this.PathParser.getMarkerAngles();\r\n\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<points.length; i++) {\r\n\t\t\t\t\tmarkers.push([points[i], angles[i]]);\r\n\t\t\t\t}\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.path.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// pattern element\r\n\t\tsvg.Element.pattern = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.createPattern = function(ctx, element) {\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x', true);\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y', true);\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', width + 'px');\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', height + 'px');\r\n\t\t\t\ttempSvg.attributes['transform'] = new svg.Property('transform', this.attribute('patternTransform').value);\r\n\t\t\t\ttempSvg.children = this.children;\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width;\r\n\t\t\t\tc.height = height;\r\n\t\t\t\tvar cctx = c.getContext('2d');\r\n\t\t\t\tif (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\r\n\t\t\t\t\tcctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));\r\n\t\t\t\t}\r\n\t\t\t\t// render 3x3 grid so when we transform there's no white space on edges\r\n\t\t\t\tfor (var x=-1; x<=1; x++) {\r\n\t\t\t\t\tfor (var y=-1; y<=1; y++) {\r\n\t\t\t\t\t\tcctx.save();\r\n\t\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', x * c.width);\r\n\t\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', y * c.height);\r\n\t\t\t\t\t\ttempSvg.render(cctx);\r\n\t\t\t\t\t\tcctx.restore();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar pattern = ctx.createPattern(c, 'repeat');\r\n\t\t\t\treturn pattern;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.pattern.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// marker element\r\n\t\tsvg.Element.marker = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseRender = this.render;\r\n\t\t\tthis.render = function(ctx, point, angle) {\r\n\t\t\t\tctx.translate(point.x, point.y);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\r\n\t\t\t\tctx.save();\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);\r\n\t\t\t\ttempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);\r\n\t\t\t\ttempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));\r\n\t\t\t\ttempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));\r\n\t\t\t\ttempSvg.children = this.children;\r\n\t\t\t\ttempSvg.render(ctx);\r\n\r\n\t\t\t\tctx.restore();\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);\r\n\t\t\t\tctx.translate(-point.x, -point.y);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.marker.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// definitions element\r\n\t\tsvg.Element.defs = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NOOP\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.defs.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// base for gradients\r\n\t\tsvg.Element.GradientBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.stops = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'stop') this.stops.push(child);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getGradient = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\tthis.gradientUnits = function () {\r\n\t\t\t\treturn this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\r\n\t\t\t}\r\n\r\n\t\t\tthis.attributesToInherit = ['gradientUnits'];\r\n\r\n\t\t\tthis.inheritStopContainer = function (stopsContainer) {\r\n\t\t\t\tfor (var i=0; i<this.attributesToInherit.length; i++) {\r\n\t\t\t\t\tvar attributeToInherit = this.attributesToInherit[i];\r\n\t\t\t\t\tif (!this.attribute(attributeToInherit).hasValue() && stopsContainer.attribute(attributeToInherit).hasValue()) {\r\n\t\t\t\t\t\tthis.attribute(attributeToInherit, true).value = stopsContainer.attribute(attributeToInherit).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.createGradient = function(ctx, element, parentOpacityProp) {\r\n\t\t\t\tvar stopsContainer = this;\r\n\t\t\t\tif (this.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\tstopsContainer = this.getHrefAttribute().getDefinition();\r\n\t\t\t\t\tthis.inheritStopContainer(stopsContainer);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar addParentOpacity = function (color) {\r\n\t\t\t\t\tif (parentOpacityProp.hasValue()) {\r\n\t\t\t\t\t\tvar p = new svg.Property('color', color);\r\n\t\t\t\t\t\treturn p.addOpacity(parentOpacityProp).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn color;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar g = this.getGradient(ctx, element);\r\n\t\t\t\tif (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);\r\n\t\t\t\tfor (var i=0; i<stopsContainer.stops.length; i++) {\r\n\t\t\t\t\tg.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.attribute('gradientTransform').hasValue()) {\r\n\t\t\t\t\t// render as transformed pattern on temporary canvas\r\n\t\t\t\t\tvar rootView = svg.ViewPort.viewPorts[0];\r\n\r\n\t\t\t\t\tvar rect = new svg.Element.rect();\r\n\t\t\t\t\trect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\r\n\t\t\t\t\trect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\r\n\r\n\t\t\t\t\tvar group = new svg.Element.g();\r\n\t\t\t\t\tgroup.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);\r\n\t\t\t\t\tgroup.children = [ rect ];\r\n\r\n\t\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', 0);\r\n\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', 0);\r\n\t\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', rootView.width);\r\n\t\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', rootView.height);\r\n\t\t\t\t\ttempSvg.children = [ group ];\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = rootView.width;\r\n\t\t\t\t\tc.height = rootView.height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\ttempCtx.fillStyle = g;\r\n\t\t\t\t\ttempSvg.render(tempCtx);\r\n\t\t\t\t\treturn tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn g;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.GradientBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// linear gradient element\r\n\t\tsvg.Element.linearGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.attributesToInherit.push('x1');\r\n\t\t\tthis.attributesToInherit.push('y1');\r\n\t\t\tthis.attributesToInherit.push('x2');\r\n\t\t\tthis.attributesToInherit.push('y2');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = this.gradientUnits() == 'objectBoundingBox' ? element.getBoundingBox() : null;\r\n\r\n\t\t\t\tif (!this.attribute('x1').hasValue()\r\n\t\t\t\t && !this.attribute('y1').hasValue()\r\n\t\t\t\t && !this.attribute('x2').hasValue()\r\n\t\t\t\t && !this.attribute('y2').hasValue()) {\r\n\t\t\t\t\tthis.attribute('x1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('y1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('x2', true).value = 1;\r\n\t\t\t\t\tthis.attribute('y2', true).value = 0;\r\n\t\t\t\t }\r\n\r\n\t\t\t\tvar x1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x1').numValue()\r\n\t\t\t\t\t: this.attribute('x1').toPixels('x'));\r\n\t\t\t\tvar y1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y1').numValue()\r\n\t\t\t\t\t: this.attribute('y1').toPixels('y'));\r\n\t\t\t\tvar x2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x2').numValue()\r\n\t\t\t\t\t: this.attribute('x2').toPixels('x'));\r\n\t\t\t\tvar y2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y2').numValue()\r\n\t\t\t\t\t: this.attribute('y2').toPixels('y'));\r\n\r\n\t\t\t\tif (x1 == x2 && y1 == y2) return null;\r\n\t\t\t\treturn ctx.createLinearGradient(x1, y1, x2, y2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.linearGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// radial gradient element\r\n\t\tsvg.Element.radialGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.attributesToInherit.push('cx');\r\n\t\t\tthis.attributesToInherit.push('cy');\r\n\t\t\tthis.attributesToInherit.push('r');\r\n\t\t\tthis.attributesToInherit.push('fx');\r\n\t\t\tthis.attributesToInherit.push('fy');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\r\n\t\t\t\tif (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';\r\n\r\n\t\t\t\tvar cx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('cx').numValue()\r\n\t\t\t\t\t: this.attribute('cx').toPixels('x'));\r\n\t\t\t\tvar cy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('cy').numValue()\r\n\t\t\t\t\t: this.attribute('cy').toPixels('y'));\r\n\r\n\t\t\t\tvar fx = cx;\r\n\t\t\t\tvar fy = cy;\r\n\t\t\t\tif (this.attribute('fx').hasValue()) {\r\n\t\t\t\t\tfx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('fx').numValue()\r\n\t\t\t\t\t: this.attribute('fx').toPixels('x'));\r\n\t\t\t\t}\r\n\t\t\t\tif (this.attribute('fy').hasValue()) {\r\n\t\t\t\t\tfy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('fy').numValue()\r\n\t\t\t\t\t: this.attribute('fy').toPixels('y'));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar r = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\r\n\t\t\t\t\t: this.attribute('r').toPixels());\r\n\r\n\t\t\t\treturn ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.radialGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// gradient stop element\r\n\t\tsvg.Element.stop = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.offset = this.attribute('offset').numValue();\r\n\t\t\tif (this.offset < 0) this.offset = 0;\r\n\t\t\tif (this.offset > 1) this.offset = 1;\r\n\r\n\t\t\tvar stopColor = this.style('stop-color', true);\r\n\t\t\tif (stopColor.value === '') stopColor.value = '#000';\r\n\t\t\tif (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity'));\r\n\t\t\tthis.color = stopColor.value;\r\n\t\t}\r\n\t\tsvg.Element.stop.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animation base element\r\n\t\tsvg.Element.AnimateBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tsvg.Animations.push(this);\r\n\r\n\t\t\tthis.duration = 0.0;\r\n\t\t\tthis.begin = this.attribute('begin').toMilliseconds();\r\n\t\t\tthis.maxDuration = this.begin + this.attribute('dur').toMilliseconds();\r\n\r\n\t\t\tthis.getProperty = function() {\r\n\t\t\t\tvar attributeType = this.attribute('attributeType').value;\r\n\t\t\t\tvar attributeName = this.attribute('attributeName').value;\r\n\r\n\t\t\t\tif (attributeType == 'CSS') {\r\n\t\t\t\t\treturn this.parent.style(attributeName, true);\r\n\t\t\t\t}\r\n\t\t\t\treturn this.parent.attribute(attributeName, true);\r\n\t\t\t};\r\n\r\n\t\t\tthis.initialValue = null;\r\n\t\t\tthis.initialUnits = '';\r\n\t\t\tthis.removed = false;\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t\treturn '';\r\n\t\t\t}\r\n\r\n\t\t\tthis.update = function(delta) {\r\n\t\t\t\t// set initial value\r\n\t\t\t\tif (this.initialValue == null) {\r\n\t\t\t\t\tthis.initialValue = this.getProperty().value;\r\n\t\t\t\t\tthis.initialUnits = this.getProperty().getUnits();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if we're past the end time\r\n\t\t\t\tif (this.duration > this.maxDuration) {\r\n\t\t\t\t\t// loop for indefinitely repeating animations\r\n\t\t\t\t\tif (this.attribute('repeatCount').value == 'indefinite'\r\n\t\t\t\t\t || this.attribute('repeatDur').value == 'indefinite') {\r\n\t\t\t\t\t\tthis.duration = 0.0\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) {\r\n\t\t\t\t\t\tthis.frozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozenValue = this.getProperty().value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {\r\n\t\t\t\t\t\tthis.removed = true;\r\n\t\t\t\t\t\tthis.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.duration = this.duration + delta;\r\n\r\n\t\t\t\t// if we're past the begin time\r\n\t\t\t\tvar updated = false;\r\n\t\t\t\tif (this.begin < this.duration) {\r\n\t\t\t\t\tvar newValue = this.calcValue(); // tween\r\n\r\n\t\t\t\t\tif (this.attribute('type').hasValue()) {\r\n\t\t\t\t\t\t// for transform, etc.\r\n\t\t\t\t\t\tvar type = this.attribute('type').value;\r\n\t\t\t\t\t\tnewValue = type + '(' + newValue + ')';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.getProperty().value = newValue;\r\n\t\t\t\t\tupdated = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn updated;\r\n\t\t\t}\r\n\r\n\t\t\tthis.from = this.attribute('from');\r\n\t\t\tthis.to = this.attribute('to');\r\n\t\t\tthis.values = this.attribute('values');\r\n\t\t\tif (this.values.hasValue()) this.values.value = this.values.value.split(';');\r\n\r\n\t\t\t// fraction of duration we've covered\r\n\t\t\tthis.progress = function() {\r\n\t\t\t\tvar ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) };\r\n\t\t\t\tif (this.values.hasValue()) {\r\n\t\t\t\t\tvar p = ret.progress * (this.values.value.length - 1);\r\n\t\t\t\t\tvar lb = Math.floor(p), ub = Math.ceil(p);\r\n\t\t\t\t\tret.from = new svg.Property('from', parseFloat(this.values.value[lb]));\r\n\t\t\t\t\tret.to = new svg.Property('to', parseFloat(this.values.value[ub]));\r\n\t\t\t\t\tret.progress = (p - lb) / (ub - lb);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tret.from = this.from;\r\n\t\t\t\t\tret.to = this.to;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.AnimateBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animate element\r\n\t\tsvg.Element.animate = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;\r\n\t\t\t\treturn newValue + this.initialUnits;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animate.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate color element\r\n\t\tsvg.Element.animateColor = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\t\t\t\tvar from = new RGBColor(p.from.value);\r\n\t\t\t\tvar to = new RGBColor(p.to.value);\r\n\r\n\t\t\t\tif (from.ok && to.ok) {\r\n\t\t\t\t\t// tween color linearly\r\n\t\t\t\t\tvar r = from.r + (to.r - from.r) * p.progress;\r\n\t\t\t\t\tvar g = from.g + (to.g - from.g) * p.progress;\r\n\t\t\t\t\tvar b = from.b + (to.b - from.b) * p.progress;\r\n\t\t\t\t\treturn 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';\r\n\t\t\t\t}\r\n\t\t\t\treturn this.attribute('from').value;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateColor.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate transform element\r\n\t\tsvg.Element.animateTransform = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar from = svg.ToNumberArray(p.from.value);\r\n\t\t\t\tvar to = svg.ToNumberArray(p.to.value);\r\n\t\t\t\tvar newValue = '';\r\n\t\t\t\tfor (var i=0; i<from.length; i++) {\r\n\t\t\t\t\tnewValue += from[i] + (to[i] - from[i]) * p.progress + ' ';\r\n\t\t\t\t}\r\n\t\t\t\treturn newValue;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateTransform.prototype = new svg.Element.animate;\r\n\r\n\t\t// font element\r\n\t\tsvg.Element.font = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\r\n\t\t\tthis.isRTL = false;\r\n\t\t\tthis.isArabic = false;\r\n\t\t\tthis.fontFace = null;\r\n\t\t\tthis.missingGlyph = null;\r\n\t\t\tthis.glyphs = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'font-face') {\r\n\t\t\t\t\tthis.fontFace = child;\r\n\t\t\t\t\tif (child.style('font-family').hasValue()) {\r\n\t\t\t\t\t\tsvg.Definitions[child.style('font-family').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (child.type == 'missing-glyph') this.missingGlyph = child;\r\n\t\t\t\telse if (child.type == 'glyph') {\r\n\t\t\t\t\tif (child.arabicForm != '') {\r\n\t\t\t\t\t\tthis.isRTL = true;\r\n\t\t\t\t\t\tthis.isArabic = true;\r\n\t\t\t\t\t\tif (typeof this.glyphs[child.unicode] == 'undefined') this.glyphs[child.unicode] = [];\r\n\t\t\t\t\t\tthis.glyphs[child.unicode][child.arabicForm] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.glyphs[child.unicode] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.font.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// font-face element\r\n\t\tsvg.Element.fontface = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.ascent = this.attribute('ascent').value;\r\n\t\t\tthis.descent = this.attribute('descent').value;\r\n\t\t\tthis.unitsPerEm = this.attribute('units-per-em').numValue();\r\n\t\t}\r\n\t\tsvg.Element.fontface.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// missing-glyph element\r\n\t\tsvg.Element.missingglyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = 0;\r\n\t\t}\r\n\t\tsvg.Element.missingglyph.prototype = new svg.Element.path;\r\n\r\n\t\t// glyph element\r\n\t\tsvg.Element.glyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\t\t\tthis.unicode = this.attribute('unicode').value;\r\n\t\t\tthis.arabicForm = this.attribute('arabic-form').value;\r\n\t\t}\r\n\t\tsvg.Element.glyph.prototype = new svg.Element.path;\r\n\r\n\t\t// text element\r\n\t\tsvg.Element.text = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\tvar textBaseline = this.style('dominant-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline == null) textBaseline = this.style('alignment-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline != null) ctx.textBaseline = textBaseline;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function () {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\treturn new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.x = this.attribute('x').toPixels('x');\r\n\t\t\t\tthis.y = this.attribute('y').toPixels('y');\r\n\t\t\t\tif (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');\r\n\t\t\t\tif (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');\r\n\t\t\t\tthis.x += this.getAnchorDelta(ctx, this, 0);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.renderChild(ctx, this, this, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getAnchorDelta = function (ctx, parent, startI) {\r\n\t\t\t\tvar textAnchor = this.style('text-anchor').valueOrDefault('start');\r\n\t\t\t\tif (textAnchor != 'start') {\r\n\t\t\t\t\tvar width = 0;\r\n\t\t\t\t\tfor (var i=startI; i<parent.children.length; i++) {\r\n\t\t\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\t\t\tif (i > startI && child.attribute('x').hasValue()) break; // new group\r\n\t\t\t\t\t\twidth += child.measureTextRecursive(ctx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn -1 * (textAnchor == 'end' ? width : width / 2.0);\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChild = function(ctx, textParent, parent, i) {\r\n\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\tif (child.attribute('x').hasValue()) {\r\n\t\t\t\t\tchild.x = child.attribute('x').toPixels('x') + textParent.getAnchorDelta(ctx, parent, i);\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) textParent.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t\tchild.x = textParent.x;\r\n\t\t\t\t}\r\n\t\t\t\ttextParent.x = child.x + child.measureText(ctx);\r\n\r\n\t\t\t\tif (child.attribute('y').hasValue()) {\r\n\t\t\t\t\tchild.y = child.attribute('y').toPixels('y');\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) textParent.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t\tchild.y = textParent.y;\r\n\t\t\t\t}\r\n\t\t\t\ttextParent.y = child.y;\r\n\r\n\t\t\t\tchild.render(ctx);\r\n\r\n\t\t\t\tfor (var i=0; i<child.children.length; i++) {\r\n\t\t\t\t\ttextParent.renderChild(ctx, textParent, child, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.text.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// text base\r\n\t\tsvg.Element.TextElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getGlyph = function(font, text, i) {\r\n\t\t\t\tvar c = text[i];\r\n\t\t\t\tvar glyph = null;\r\n\t\t\t\tif (font.isArabic) {\r\n\t\t\t\t\tvar arabicForm = 'isolated';\r\n\t\t\t\t\tif ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';\r\n\t\t\t\t\tif (typeof font.glyphs[c] != 'undefined') {\r\n\t\t\t\t\t\tglyph = font.glyphs[c][arabicForm];\r\n\t\t\t\t\t\tif (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tglyph = font.glyphs[c];\r\n\t\t\t\t}\r\n\t\t\t\tif (glyph == null) glyph = font.missingGlyph;\r\n\t\t\t\treturn glyph;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tvar scale = fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tctx.translate(this.x, this.y);\r\n\t\t\t\t\t\tctx.scale(scale, -scale);\r\n\t\t\t\t\t\tvar lw = ctx.lineWidth;\r\n\t\t\t\t\t\tctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);\r\n\t\t\t\t\t\tglyph.render(ctx);\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);\r\n\t\t\t\t\t\tctx.lineWidth = lw;\r\n\t\t\t\t\t\tctx.scale(1/scale, -1/scale);\r\n\t\t\t\t\t\tctx.translate(-this.x, -this.y);\r\n\r\n\t\t\t\t\t\tthis.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof dx[i] != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tthis.x += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif(ctx.paintOrder == \"stroke\") {\r\n\t\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// OVERRIDE ME\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureTextRecursive = function(ctx) {\r\n\t\t\t\tvar width = this.measureText(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\twidth += this.children[i].measureTextRecursive(ctx);\r\n\t\t\t\t}\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureText = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar measure = 0;\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tmeasure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof dx[i] != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tmeasure += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn measure;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar textToMeasure = svg.compressSpaces(this.getText());\r\n\t\t\t\tif (!ctx.measureText) return textToMeasure.length * 10;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\tvar width = ctx.measureText(textToMeasure).width;\r\n\t\t\t\tctx.restore();\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// tspan\r\n\t\tsvg.Element.tspan = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.text = svg.compressSpaces(node.value || node.text || node.textContent || '');\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// if this node has children, then they own the text\r\n\t\t\t\tif (this.children.length > 0) { return ''; }\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tspan.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// tref\r\n\t\tsvg.Element.tref = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\t\t\t\tif (element != null) return element.children[0].getText();\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tref.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// a element\r\n\t\tsvg.Element.a = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.hasText = node.childNodes.length > 0;\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\tif (node.childNodes[i].nodeType != 3) this.hasText = false;\r\n\t\t\t}\r\n\r\n\t\t\t// this might contain text\r\n\t\t\tthis.text = this.hasText ? node.childNodes[0].value : '';\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseRenderChildren = this.renderChildren;\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (this.hasText) {\r\n\t\t\t\t\t// render as text element\r\n\t\t\t\t\tthis.baseRenderChildren(ctx);\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tsvg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y));\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.children.length > 0) {\r\n\t\t\t\t\t// render as temporary group\r\n\t\t\t\t\tvar g = new svg.Element.g();\r\n\t\t\t\t\tg.children = this.children;\r\n\t\t\t\t\tg.parent = this;\r\n\t\t\t\t\tg.render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.onclick = function() {\r\n\t\t\t\twindow.open(this.getHrefAttribute().value);\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = 'pointer';\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.a.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// image element\r\n\t\tsvg.Element.image = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar href = this.getHrefAttribute().value;\r\n\t\t\tif (href == '') { return; }\r\n\t\t\tvar isSvg = href.match(/\\.svg$/)\r\n\r\n\t\t\tsvg.Images.push(this);\r\n\t\t\tthis.loaded = false;\r\n\t\t\tif (!isSvg) {\r\n\t\t\t\tthis.img = document.createElement('img');\r\n\t\t\t\tif (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; }\r\n\t\t\t\tvar self = this;\r\n\t\t\t\tthis.img.onload = function() { self.loaded = true; }\r\n\t\t\t\tthis.img.onerror = function() { svg.log('ERROR: image \"' + href + '\" not found'); self.loaded = true; }\r\n\t\t\t\tthis.img.src = href;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.img = svg.ajax(href);\r\n\t\t\t\tthis.loaded = true;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tif (width == 0 || height == 0) return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (isSvg) {\r\n\t\t\t\t\tctx.drawSvg(this.img, x, y, width, height);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tctx.translate(x, y);\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tthis.img.width,\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tthis.img.height,\r\n\t\t\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\t\t\t0);\r\n\t\t\t\t\tctx.drawImage(this.img, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.image.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// group element\r\n\t\tsvg.Element.g = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.g.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// symbol element\r\n\t\tsvg.Element.symbol = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.symbol.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// style element\r\n\t\tsvg.Element.style = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\t// text, or spaces then CDATA\r\n\t\t\tvar css = ''\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t  css += node.childNodes[i].data;\r\n\t\t\t}\r\n\t\t\tcss = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, ''); // remove comments\r\n\t\t\tcss = svg.compressSpaces(css); // replace whitespace\r\n\t\t\tvar cssDefs = css.split('}');\r\n\t\t\tfor (var i=0; i<cssDefs.length; i++) {\r\n\t\t\t\tif (svg.trim(cssDefs[i]) != '') {\r\n\t\t\t\t\tvar cssDef = cssDefs[i].split('{');\r\n\t\t\t\t\tvar cssClasses = cssDef[0].split(',');\r\n\t\t\t\t\tvar cssProps = cssDef[1].split(';');\r\n\t\t\t\t\tfor (var j=0; j<cssClasses.length; j++) {\r\n\t\t\t\t\t\tvar cssClass = svg.trim(cssClasses[j]);\r\n\t\t\t\t\t\tif (cssClass != '') {\r\n\t\t\t\t\t\t\tvar props = svg.Styles[cssClass] || {};\r\n\t\t\t\t\t\t\tfor (var k=0; k<cssProps.length; k++) {\r\n\t\t\t\t\t\t\t\tvar prop = cssProps[k].indexOf(':');\r\n\t\t\t\t\t\t\t\tvar name = cssProps[k].substr(0, prop);\r\n\t\t\t\t\t\t\t\tvar value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);\r\n\t\t\t\t\t\t\t\tif (name != null && value != null) {\r\n\t\t\t\t\t\t\t\t\tprops[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsvg.Styles[cssClass] = props;\r\n\t\t\t\t\t\t\tsvg.StylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\r\n\t\t\t\t\t\t\tif (cssClass == '@font-face') {\r\n\t\t\t\t\t\t\t\tvar fontFamily = props['font-family'].value.replace(/\"/g,'');\r\n\t\t\t\t\t\t\t\tvar srcs = props['src'].value.split(',');\r\n\t\t\t\t\t\t\t\tfor (var s=0; s<srcs.length; s++) {\r\n\t\t\t\t\t\t\t\t\tif (srcs[s].indexOf('format(\"svg\")') > 0) {\r\n\t\t\t\t\t\t\t\t\t\tvar urlStart = srcs[s].indexOf('url');\r\n\t\t\t\t\t\t\t\t\t\tvar urlEnd = srcs[s].indexOf(')', urlStart);\r\n\t\t\t\t\t\t\t\t\t\tvar url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);\r\n\t\t\t\t\t\t\t\t\t\tvar doc = svg.parseXml(svg.ajax(url));\r\n\t\t\t\t\t\t\t\t\t\tvar fonts = doc.getElementsByTagName('font');\r\n\t\t\t\t\t\t\t\t\t\tfor (var f=0; f<fonts.length; f++) {\r\n\t\t\t\t\t\t\t\t\t\t\tvar font = svg.CreateElement(fonts[f]);\r\n\t\t\t\t\t\t\t\t\t\t\tsvg.Definitions[fontFamily] = font;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.style.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// use element\r\n\t\tsvg.Element.use = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\t\t\t\tif (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);\r\n\t\t\t\tif (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));\r\n\t\t\t}\r\n\r\n\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (element != null) element.path(ctx);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tif (element != null) return element.getBoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (element != null) {\r\n\t\t\t\t\tvar tempSvg = element;\r\n\t\t\t\t\tif (element.type == 'symbol') {\r\n\t\t\t\t\t\t// render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\r\n\t\t\t\t\t\ttempSvg = new svg.Element.svg();\r\n\t\t\t\t\t\ttempSvg.type = 'svg';\r\n\t\t\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', element.attribute('viewBox').value);\r\n\t\t\t\t\t\ttempSvg.attributes['preserveAspectRatio'] = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value);\r\n\t\t\t\t\t\ttempSvg.attributes['overflow'] = new svg.Property('overflow', element.attribute('overflow').value);\r\n\t\t\t\t\t\ttempSvg.children = element.children;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tempSvg.type == 'svg') {\r\n\t\t\t\t\t\t// if symbol or svg, inherit width/height from me\r\n\t\t\t\t\t\tif (this.attribute('width').hasValue()) tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);\r\n\t\t\t\t\t\tif (this.attribute('height').hasValue()) tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar oldParent = tempSvg.parent;\r\n\t\t\t\t\ttempSvg.parent = null;\r\n\t\t\t\t\ttempSvg.render(ctx);\r\n\t\t\t\t\ttempSvg.parent = oldParent;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.use.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// mask element\r\n\t\tsvg.Element.mask = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\tif (width == 0 && height == 0) {\r\n\t\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// temporarily remove mask to avoid recursion\r\n\t\t\t\tvar mask = element.attribute('mask').value;\r\n\t\t\t\telement.attribute('mask').value = '';\r\n\r\n\t\t\t\t\tvar cMask = document.createElement('canvas');\r\n\t\t\t\t\tcMask.width = x + width;\r\n\t\t\t\t\tcMask.height = y + height;\r\n\t\t\t\t\tvar maskCtx = cMask.getContext('2d');\r\n\t\t\t\t\tthis.renderChildren(maskCtx);\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = x + width;\r\n\t\t\t\t\tc.height = y + height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\telement.render(tempCtx);\r\n\t\t\t\t\ttempCtx.globalCompositeOperation = 'destination-in';\r\n\t\t\t\t\ttempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\r\n\t\t\t\t\ttempCtx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t\tctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t\tctx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t// reassign mask\r\n\t\t\t\telement.attribute('mask').value = mask;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.mask.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// clip element\r\n\t\tsvg.Element.clipPath = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tvar oldBeginPath = CanvasRenderingContext2D.prototype.beginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = function () { };\r\n\r\n\t\t\t\tvar oldClosePath = CanvasRenderingContext2D.prototype.closePath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = function () { };\r\n\r\n\t\t\t\toldBeginPath.call(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar child = this.children[i];\r\n\t\t\t\t\tif (typeof child.path != 'undefined') {\r\n\t\t\t\t\t\tvar transform = null;\r\n\t\t\t\t\t\tif (child.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\t\t\ttransform = new svg.Transform(child.style('transform', false, true).value);\r\n\t\t\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tchild.path(ctx);\r\n\t\t\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t\t\t\tif (transform) { transform.unapply(ctx); }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\toldClosePath.call(ctx);\r\n\t\t\t\tctx.clip();\r\n\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = oldBeginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.clipPath.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// filters\r\n\t\tsvg.Element.filter = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\r\n\t\t\t\t// temporarily remove filter to avoid recursion\r\n\t\t\t\tvar filter = element.style('filter').value;\r\n\t\t\t\telement.style('filter').value = '';\r\n\r\n\t\t\t\tvar px = 0, py = 0;\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar efd = this.children[i].extraFilterDistance || 0;\r\n\t\t\t\t\tpx = Math.max(px, efd);\r\n\t\t\t\t\tpy = Math.max(py, efd);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width + 2*px;\r\n\t\t\t\tc.height = height + 2*py;\r\n\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\ttempCtx.translate(-x + px, -y + py);\r\n\t\t\t\telement.render(tempCtx);\r\n\r\n\t\t\t\t// apply filters\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tif (typeof this.children[i].apply == 'function') {\r\n\t\t\t\t\t\tthis.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render on me\r\n\t\t\t\tctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);\r\n\r\n\t\t\t\t// reassign filter\r\n\t\t\t\telement.style('filter', true).value = filter;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.filter.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feMorphology = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feMorphology.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feComposite = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feComposite.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feColorMatrix = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar matrix = svg.ToNumberArray(this.attribute('values').value);\r\n\t\t\tswitch (this.attribute('type').valueOrDefault('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\r\n\t\t\t\tcase 'saturate':\r\n\t\t\t\t\tvar s = matrix[0];\r\n\t\t\t\t\tmatrix = [0.213+0.787*s,0.715-0.715*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715+0.285*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715-0.715*s,0.072+0.928*s,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'hueRotate':\r\n\t\t\t\t\tvar a = matrix[0] * Math.PI / 180.0;\r\n\t\t\t\t\tvar c = function (m1,m2,m3) { return m1 + Math.cos(a)*m2 + Math.sin(a)*m3; };\r\n\t\t\t\t\tmatrix = [c(0.213,0.787,-0.213),c(0.715,-0.715,-0.715),c(0.072,-0.072,0.928),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,0.143),c(0.715,0.285,0.140),c(0.072,-0.072,-0.283),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,-0.787),c(0.715,-0.715,0.715),c(0.072,0.928,0.072),0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'luminanceToAlpha':\r\n\t\t\t\t\tmatrix = [0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0.2125,0.7154,0.0721,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tfunction imGet(img, x, y, width, height, rgba) {\r\n\t\t\t\treturn img[y*width*4 + x*4 + rgba];\r\n\t\t\t}\r\n\r\n\t\t\tfunction imSet(img, x, y, width, height, rgba, val) {\r\n\t\t\t\timg[y*width*4 + x*4 + rgba] = val;\r\n\t\t\t}\r\n\r\n\t\t\tfunction m(i, v) {\r\n\t\t\t\tvar mi = matrix[i];\r\n\t\t\t\treturn mi * (mi < 0 ? v - 255 : v);\r\n\t\t\t}\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// assuming x==0 && y==0 for now\r\n\t\t\t\tvar srcData = ctx.getImageData(0, 0, width, height);\r\n\t\t\t\tfor (var y = 0; y < height; y++) {\r\n\t\t\t\t\tfor (var x = 0; x < width; x++) {\r\n\t\t\t\t\t\tvar r = imGet(srcData.data, x, y, width, height, 0);\r\n\t\t\t\t\t\tvar g = imGet(srcData.data, x, y, width, height, 1);\r\n\t\t\t\t\t\tvar b = imGet(srcData.data, x, y, width, height, 2);\r\n\t\t\t\t\t\tvar a = imGet(srcData.data, x, y, width, height, 3);\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 0, m(0,r)+m(1,g)+m(2,b)+m(3,a)+m(4,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 1, m(5,r)+m(6,g)+m(7,b)+m(8,a)+m(9,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 2, m(10,r)+m(11,g)+m(12,b)+m(13,a)+m(14,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 3, m(15,r)+m(16,g)+m(17,b)+m(18,a)+m(19,1));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tctx.clearRect(0, 0, width, height);\r\n\t\t\t\tctx.putImageData(srcData, 0, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feColorMatrix.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feGaussianBlur = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());\r\n\t\t\tthis.extraFilterDistance = this.blurRadius;\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\tif (typeof stackBlur.canvasRGBA == 'undefined') {\r\n\t\t\t\t\tsvg.log('ERROR: StackBlur.js must be included for blur to work');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// StackBlur requires canvas be on document\r\n\t\t\t\tctx.canvas.id = svg.UniqueId();\r\n\t\t\t\tctx.canvas.style.display = 'none';\r\n\t\t\t\tdocument.body.appendChild(ctx.canvas);\r\n\t\t\t\tstackBlur.canvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);\r\n\t\t\t\tdocument.body.removeChild(ctx.canvas);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// title element, do nothing\r\n\t\tsvg.Element.title = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.title.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// desc element, do nothing\r\n\t\tsvg.Element.desc = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.desc.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.MISSING = function(node) {\r\n\t\t\tsvg.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\r\n\t\t}\r\n\t\tsvg.Element.MISSING.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// element factory\r\n\t\tsvg.CreateElement = function(node) {\r\n\t\t\tvar className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace\r\n\t\t\tclassName = className.replace(/\\-/g,''); // remove dashes\r\n\t\t\tvar e = null;\r\n\t\t\tif (typeof svg.Element[className] != 'undefined') {\r\n\t\t\t\te = new svg.Element[className](node);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\te = new svg.Element.MISSING(node);\r\n\t\t\t}\r\n\r\n\t\t\te.type = node.nodeName;\r\n\t\t\treturn e;\r\n\t\t}\r\n\r\n\t\t// load from url\r\n\t\tsvg.load = function(ctx, url) {\r\n\t\t\tsvg.loadXml(ctx, svg.ajax(url));\r\n\t\t}\r\n\r\n\t\t// load from xml\r\n\t\tsvg.loadXml = function(ctx, xml) {\r\n\t\t\tsvg.loadXmlDoc(ctx, svg.parseXml(xml));\r\n\t\t}\r\n\r\n\t\tsvg.loadXmlDoc = function(ctx, dom) {\r\n\t\t\tsvg.init(ctx);\r\n\r\n\t\t\tvar mapXY = function(p) {\r\n\t\t\t\tvar e = ctx.canvas;\r\n\t\t\t\twhile (e) {\r\n\t\t\t\t\tp.x -= e.offsetLeft;\r\n\t\t\t\t\tp.y -= e.offsetTop;\r\n\t\t\t\t\te = e.offsetParent;\r\n\t\t\t\t}\r\n\t\t\t\tif (window.scrollX) p.x += window.scrollX;\r\n\t\t\t\tif (window.scrollY) p.y += window.scrollY;\r\n\t\t\t\treturn p;\r\n\t\t\t}\r\n\r\n\t\t\t// bind mouse\r\n\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\tctx.canvas.onclick = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onclick(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t\tctx.canvas.onmousemove = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onmousemove(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar e = svg.CreateElement(dom.documentElement);\r\n\t\t\te.root = true;\r\n\t\t\te.addStylesFromStyleDefinition();\r\n\r\n\t\t\t// render loop\r\n\t\t\tvar isFirstRender = true;\r\n\t\t\tvar draw = function() {\r\n\t\t\t\tsvg.ViewPort.Clear();\r\n\t\t\t\tif (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);\r\n\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] != true) {\r\n\t\t\t\t\t// set canvas size\r\n\t\t\t\t\tif (e.style('width').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.width = e.style('width').toPixels('x');\r\n\t\t\t\t\t\tctx.canvas.style.width = ctx.canvas.width + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.style('height').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.height = e.style('height').toPixels('y');\r\n\t\t\t\t\t\tctx.canvas.style.height = ctx.canvas.height + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\r\n\t\t\t\tvar cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] == true && e.style('width').hasValue() && e.style('height').hasValue()) {\r\n\t\t\t\t\tcWidth = e.style('width').toPixels('x');\r\n\t\t\t\t\tcHeight = e.style('height').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(cWidth, cHeight);\r\n\r\n\t\t\t\tif (svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];\r\n\t\t\t\tif (svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];\r\n\t\t\t\tif (svg.opts['scaleWidth'] != null || svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\tvar xRatio = null, yRatio = null, viewBox = svg.ToNumberArray(e.attribute('viewBox').value);\r\n\r\n\t\t\t\t\tif (svg.opts['scaleWidth'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('width').hasValue()) xRatio = e.attribute('width').toPixels('x') / svg.opts['scaleWidth'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts['scaleWidth'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('height').hasValue()) yRatio = e.attribute('height').toPixels('y') / svg.opts['scaleHeight'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts['scaleHeight'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (xRatio == null) { xRatio = yRatio; }\r\n\t\t\t\t\tif (yRatio == null) { yRatio = xRatio; }\r\n\r\n\t\t\t\t\te.attribute('width', true).value = svg.opts['scaleWidth'];\r\n\t\t\t\t\te.attribute('height', true).value = svg.opts['scaleHeight'];\r\n\t\t\t\t\te.style('transform', true, true).value += ' scale('+(1.0/xRatio)+','+(1.0/yRatio)+')';\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clear and render\r\n\t\t\t\tif (svg.opts['ignoreClear'] != true) {\r\n\t\t\t\t\tctx.clearRect(0, 0, cWidth, cHeight);\r\n\t\t\t\t}\r\n\t\t\t\te.render(ctx);\r\n\t\t\t\tif (isFirstRender) {\r\n\t\t\t\t\tisFirstRender = false;\r\n\t\t\t\t\tif (typeof svg.opts['renderCallback'] == 'function') svg.opts['renderCallback'](dom);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar waitingForImages = true;\r\n\t\t\tif (svg.ImagesLoaded()) {\r\n\t\t\t\twaitingForImages = false;\r\n\t\t\t\tdraw();\r\n\t\t\t}\r\n\t\t\tsvg.intervalID = setInterval(function() {\r\n\t\t\t\tvar needUpdate = false;\r\n\r\n\t\t\t\tif (waitingForImages && svg.ImagesLoaded()) {\r\n\t\t\t\t\twaitingForImages = false;\r\n\t\t\t\t\tneedUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from mouse events?\r\n\t\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\t\tneedUpdate = needUpdate | svg.Mouse.hasEvents();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from animations?\r\n\t\t\t\tif (svg.opts['ignoreAnimation'] != true) {\r\n\t\t\t\t\tfor (var i=0; i<svg.Animations.length; i++) {\r\n\t\t\t\t\t\tneedUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from redraw?\r\n\t\t\t\tif (typeof svg.opts['forceRedraw'] == 'function') {\r\n\t\t\t\t\tif (svg.opts['forceRedraw']() == true) needUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render if needed\r\n\t\t\t\tif (needUpdate) {\r\n\t\t\t\t\tdraw();\r\n\t\t\t\t\tsvg.Mouse.runEvents(); // run and clear our events\r\n\t\t\t\t}\r\n\t\t\t}, 1000 / svg.FRAMERATE);\r\n\t\t}\r\n\r\n\t\tsvg.stop = function() {\r\n\t\t\tif (svg.intervalID) {\r\n\t\t\t\tclearInterval(svg.intervalID);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Mouse = new (function() {\r\n\t\t\tthis.events = [];\r\n\t\t\tthis.hasEvents = function() { return this.events.length != 0; }\r\n\r\n\t\t\tthis.onclick = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onclick', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onclick) e.onclick(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onmousemove', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onmousemove) e.onmousemove(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.eventElements = [];\r\n\r\n\t\t\tthis.checkPath = function(element, ctx) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkBoundingBox = function(element, bb) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.runEvents = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = '';\r\n\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tvar element = this.eventElements[i];\r\n\t\t\t\t\twhile (element) {\r\n\t\t\t\t\t\te.run(element);\r\n\t\t\t\t\t\telement = element.parent;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// done running, clear\r\n\t\t\t\tthis.events = [];\r\n\t\t\t\tthis.eventElements = [];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn svg;\r\n\t};\r\n\r\n\tif (typeof CanvasRenderingContext2D  != 'undefined') {\r\n\t\tCanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh, opts) {\r\n\t\t\tvar cOpts = {\r\n\t\t\t\tignoreMouse: true,\r\n\t\t\t\tignoreAnimation: true,\r\n\t\t\t\tignoreDimensions: true,\r\n\t\t\t\tignoreClear: true,\r\n\t\t\t\toffsetX: dx,\r\n\t\t\t\toffsetY: dy,\r\n\t\t\t\tscaleWidth: dw,\r\n\t\t\t\tscaleHeight: dh\r\n\t\t\t}\r\n\r\n\t\t\tfor(var prop in opts) {\r\n\t\t\t\tif(opts.hasOwnProperty(prop)){\r\n\t\t\t\t\tcOpts[prop] = opts[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcanvg(this.canvas, s, cOpts);\r\n\t\t}\r\n\t}\r\n\r\n\treturn canvg;\r\n\r\n}));\r\n\n\n/***/ }),\n/* 1543 */\n/***/ (function(module, exports) {\n\n/*\n\tBased on rgbcolor.js by Stoyan Stefanov <sstoo@gmail.com>\n\thttp://www.phpied.com/rgb-color-parser-in-javascript/\n*/\n\nmodule.exports = function(color_string) {\n    this.ok = false;\n    this.alpha = 1.0;\n\n    // strip any leading #\n    if (color_string.charAt(0) == '#') { // remove # if any\n        color_string = color_string.substr(1,6);\n    }\n\n    color_string = color_string.replace(/ /g,'');\n    color_string = color_string.toLowerCase();\n\n    // before getting into regexps, try simple matches\n    // and overwrite the input\n    var simple_colors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dodgerblue: '1e90ff',\n        feldspar: 'd19275',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred : 'cd5c5c',\n        indigo : '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslateblue: '8470ff',\n        lightslategray: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        violetred: 'd02090',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    color_string = simple_colors[color_string] || color_string;\n    // emd of simple type-in colors\n\n    // array of color definition objects\n    var color_defs = [\n        {\n            re: /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*((?:\\d?\\.)?\\d)\\)$/,\n            example: ['rgba(123, 234, 45, 0.8)', 'rgba(255,234,245,1.0)'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1]),\n                    parseInt(bits[2]),\n                    parseInt(bits[3]),\n                    parseFloat(bits[4])\n                ];\n            }\n        },\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1]),\n                    parseInt(bits[2]),\n                    parseInt(bits[3])\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            example: ['#00ff00', '336699'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1], 16),\n                    parseInt(bits[2], 16),\n                    parseInt(bits[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            example: ['#fb0', 'f0f'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1] + bits[1], 16),\n                    parseInt(bits[2] + bits[2], 16),\n                    parseInt(bits[3] + bits[3], 16)\n                ];\n            }\n        }\n    ];\n\n    // search through the definitions to find a match\n    for (var i = 0; i < color_defs.length; i++) {\n        var re = color_defs[i].re;\n        var processor = color_defs[i].process;\n        var bits = re.exec(color_string);\n        if (bits) {\n            var channels = processor(bits);\n            this.r = channels[0];\n            this.g = channels[1];\n            this.b = channels[2];\n            if (channels.length > 3) {\n                this.alpha = channels[3];\n            }\n            this.ok = true;\n        }\n\n    }\n\n    // validate/cleanup values\n    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n    this.alpha = (this.alpha < 0) ? 0 : ((this.alpha > 1.0 || isNaN(this.alpha)) ? 1.0 : this.alpha);\n\n    // some getters\n    this.toRGB = function () {\n        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n    }\n    this.toRGBA = function () {\n        return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.alpha + ')';\n    }\n    this.toHex = function () {\n        var r = this.r.toString(16);\n        var g = this.g.toString(16);\n        var b = this.b.toString(16);\n        if (r.length == 1) r = '0' + r;\n        if (g.length == 1) g = '0' + g;\n        if (b.length == 1) b = '0' + b;\n        return '#' + r + g + b;\n    }\n\n    // help\n    this.getHelpXML = function () {\n\n        var examples = new Array();\n        // add regexps\n        for (var i = 0; i < color_defs.length; i++) {\n            var example = color_defs[i].example;\n            for (var j = 0; j < example.length; j++) {\n                examples[examples.length] = example[j];\n            }\n        }\n        // add type-in colors\n        for (var sc in simple_colors) {\n            examples[examples.length] = sc;\n        }\n\n        var xml = document.createElement('ul');\n        xml.setAttribute('id', 'rgbcolor-examples');\n        for (var i = 0; i < examples.length; i++) {\n            try {\n                var list_item = document.createElement('li');\n                var list_color = new RGBColor(examples[i]);\n                var example_div = document.createElement('div');\n                example_div.style.cssText =\n                        'margin: 3px; '\n                        + 'border: 1px solid black; '\n                        + 'background:' + list_color.toHex() + '; '\n                        + 'color:' + list_color.toHex()\n                ;\n                example_div.appendChild(document.createTextNode('test'));\n                var list_item_value = document.createTextNode(\n                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n                );\n                list_item.appendChild(example_div);\n                list_item.appendChild(list_item_value);\n                xml.appendChild(list_item);\n\n            } catch(e){}\n        }\n        return xml;\n\n    }\n\n}\n\n\n/***/ }),\n/* 1544 */\n/***/ (function(module, exports) {\n\n/*\n\nStackBlur - a fast almost Gaussian Blur For Canvas\n\nVersion: \t0.5\nAuthor:\t\tMario Klingemann\nContact: \tmario@quasimondo.com\nWebsite:\thttp://www.quasimondo.com/StackBlurForCanvas\nTwitter:\t@quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr: \nhttps://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2010 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\nvar mul_table = [\n        512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,\n        454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,\n        482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,\n        437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,\n        497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,\n        320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,\n        446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,\n        329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,\n        505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,\n        399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,\n        324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,\n        268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,\n        451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,\n        385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,\n        332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,\n        289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];\n        \n   \nvar shg_table = [\n\t     9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, \n\t\t17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, \n\t\t19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,\n\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,\n\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, \n\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, \n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, \n\t\t23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ];\n\nfunction blur( pixels, width, height, radius )\n{\n\tif ( isNaN(radius) || radius < 1 ) return;\n\tradius |= 0;\n\n\tvar x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, \n\tr_out_sum, g_out_sum, b_out_sum, a_out_sum,\n\tr_in_sum, g_in_sum, b_in_sum, a_in_sum, \n\tpr, pg, pb, pa, rbs;\n\t\t\t\n\tvar div = radius + radius + 1;\n\tvar w4 = width << 2;\n\tvar widthMinus1  = width - 1;\n\tvar heightMinus1 = height - 1;\n\tvar radiusPlus1  = radius + 1;\n\tvar sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2;\n\t\n\tvar stackStart = new BlurStack();\n\tvar stack = stackStart;\n\tfor ( i = 1; i < div; i++ )\n\t{\n\t\tstack = stack.next = new BlurStack();\n\t\tif ( i == radiusPlus1 ) var stackEnd = stack;\n\t}\n\tstack.next = stackStart;\n\tvar stackIn = null;\n\tvar stackOut = null;\n\t\n\tyw = yi = 0;\n\t\n\tvar mul_sum = mul_table[radius];\n\tvar shg_sum = shg_table[radius];\n\t\n\tfor ( y = 0; y < height; y++ )\n\t{\n\t\tr_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;\n\t\t\n\t\tr_out_sum = radiusPlus1 * ( pr = pixels[yi] );\n\t\tg_out_sum = radiusPlus1 * ( pg = pixels[yi+1] );\n\t\tb_out_sum = radiusPlus1 * ( pb = pixels[yi+2] );\n\t\ta_out_sum = radiusPlus1 * ( pa = pixels[yi+3] );\n\t\t\n\t\tr_sum += sumFactor * pr;\n\t\tg_sum += sumFactor * pg;\n\t\tb_sum += sumFactor * pb;\n\t\ta_sum += sumFactor * pa;\n\t\t\n\t\tstack = stackStart;\n\t\t\n\t\tfor( i = 0; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tstack.r = pr;\n\t\t\tstack.g = pg;\n\t\t\tstack.b = pb;\n\t\t\tstack.a = pa;\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\tfor( i = 1; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tp = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 );\n\t\t\tr_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i );\n\t\t\tg_sum += ( stack.g = ( pg = pixels[p+1])) * rbs;\n\t\t\tb_sum += ( stack.b = ( pb = pixels[p+2])) * rbs;\n\t\t\ta_sum += ( stack.a = ( pa = pixels[p+3])) * rbs;\n\t\t\t\n\t\t\tr_in_sum += pr;\n\t\t\tg_in_sum += pg;\n\t\t\tb_in_sum += pb;\n\t\t\ta_in_sum += pa;\n\t\t\t\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\t\n\t\tstackIn = stackStart;\n\t\tstackOut = stackEnd;\n\t\tfor ( x = 0; x < width; x++ )\n\t\t{\n\t\t\tpixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum;\n\t\t\tif ( pa != 0 )\n\t\t\t{\n\t\t\t\tpa = 255 / pa;\n\t\t\t\tpixels[yi]   = ((r_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t\tpixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t\tpixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t} else {\n\t\t\t\tpixels[yi] = pixels[yi+1] = pixels[yi+2] = 0;\n\t\t\t}\n\t\t\t\n\t\t\tr_sum -= r_out_sum;\n\t\t\tg_sum -= g_out_sum;\n\t\t\tb_sum -= b_out_sum;\n\t\t\ta_sum -= a_out_sum;\n\t\t\t\n\t\t\tr_out_sum -= stackIn.r;\n\t\t\tg_out_sum -= stackIn.g;\n\t\t\tb_out_sum -= stackIn.b;\n\t\t\ta_out_sum -= stackIn.a;\n\t\t\t\n\t\t\tp =  ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2;\n\t\t\t\n\t\t\tr_in_sum += ( stackIn.r = pixels[p]);\n\t\t\tg_in_sum += ( stackIn.g = pixels[p+1]);\n\t\t\tb_in_sum += ( stackIn.b = pixels[p+2]);\n\t\t\ta_in_sum += ( stackIn.a = pixels[p+3]);\n\t\t\t\n\t\t\tr_sum += r_in_sum;\n\t\t\tg_sum += g_in_sum;\n\t\t\tb_sum += b_in_sum;\n\t\t\ta_sum += a_in_sum;\n\t\t\t\n\t\t\tstackIn = stackIn.next;\n\t\t\t\n\t\t\tr_out_sum += ( pr = stackOut.r );\n\t\t\tg_out_sum += ( pg = stackOut.g );\n\t\t\tb_out_sum += ( pb = stackOut.b );\n\t\t\ta_out_sum += ( pa = stackOut.a );\n\t\t\t\n\t\t\tr_in_sum -= pr;\n\t\t\tg_in_sum -= pg;\n\t\t\tb_in_sum -= pb;\n\t\t\ta_in_sum -= pa;\n\t\t\t\n\t\t\tstackOut = stackOut.next;\n\n\t\t\tyi += 4;\n\t\t}\n\t\tyw += width;\n\t}\n\n\t\n\tfor ( x = 0; x < width; x++ )\n\t{\n\t\tg_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;\n\t\t\n\t\tyi = x << 2;\n\t\tr_out_sum = radiusPlus1 * ( pr = pixels[yi]);\n\t\tg_out_sum = radiusPlus1 * ( pg = pixels[yi+1]);\n\t\tb_out_sum = radiusPlus1 * ( pb = pixels[yi+2]);\n\t\ta_out_sum = radiusPlus1 * ( pa = pixels[yi+3]);\n\t\t\n\t\tr_sum += sumFactor * pr;\n\t\tg_sum += sumFactor * pg;\n\t\tb_sum += sumFactor * pb;\n\t\ta_sum += sumFactor * pa;\n\t\t\n\t\tstack = stackStart;\n\t\t\n\t\tfor( i = 0; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tstack.r = pr;\n\t\t\tstack.g = pg;\n\t\t\tstack.b = pb;\n\t\t\tstack.a = pa;\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\typ = width;\n\t\t\n\t\tfor( i = 1; i <= radius; i++ )\n\t\t{\n\t\t\tyi = ( yp + x ) << 2;\n\t\t\t\n\t\t\tr_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i );\n\t\t\tg_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs;\n\t\t\tb_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs;\n\t\t\ta_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs;\n\t\t   \n\t\t\tr_in_sum += pr;\n\t\t\tg_in_sum += pg;\n\t\t\tb_in_sum += pb;\n\t\t\ta_in_sum += pa;\n\t\t\t\n\t\t\tstack = stack.next;\n\t\t\n\t\t\tif( i < heightMinus1 )\n\t\t\t{\n\t\t\t\typ += width;\n\t\t\t}\n\t\t}\n\t\t\n\t\tyi = x;\n\t\tstackIn = stackStart;\n\t\tstackOut = stackEnd;\n\t\tfor ( y = 0; y < height; y++ )\n\t\t{\n\t\t\tp = yi << 2;\n\t\t\tpixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum;\n\t\t\tif ( pa > 0 )\n\t\t\t{\n\t\t\t\tpa = 255 / pa;\n\t\t\t\tpixels[p]   = ((r_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t\tpixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t\tpixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t} else {\n\t\t\t\tpixels[p] = pixels[p+1] = pixels[p+2] = 0;\n\t\t\t}\n\t\t\t\n\t\t\tr_sum -= r_out_sum;\n\t\t\tg_sum -= g_out_sum;\n\t\t\tb_sum -= b_out_sum;\n\t\t\ta_sum -= a_out_sum;\n\t\t   \n\t\t\tr_out_sum -= stackIn.r;\n\t\t\tg_out_sum -= stackIn.g;\n\t\t\tb_out_sum -= stackIn.b;\n\t\t\ta_out_sum -= stackIn.a;\n\t\t\t\n\t\t\tp = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2;\n\t\t\t\n\t\t\tr_sum += ( r_in_sum += ( stackIn.r = pixels[p]));\n\t\t\tg_sum += ( g_in_sum += ( stackIn.g = pixels[p+1]));\n\t\t\tb_sum += ( b_in_sum += ( stackIn.b = pixels[p+2]));\n\t\t\ta_sum += ( a_in_sum += ( stackIn.a = pixels[p+3]));\n\t\t   \n\t\t\tstackIn = stackIn.next;\n\t\t\t\n\t\t\tr_out_sum += ( pr = stackOut.r );\n\t\t\tg_out_sum += ( pg = stackOut.g );\n\t\t\tb_out_sum += ( pb = stackOut.b );\n\t\t\ta_out_sum += ( pa = stackOut.a );\n\t\t\t\n\t\t\tr_in_sum -= pr;\n\t\t\tg_in_sum -= pg;\n\t\t\tb_in_sum -= pb;\n\t\t\ta_in_sum -= pa;\n\t\t\t\n\t\t\tstackOut = stackOut.next;\n\t\t\t\n\t\t\tyi += width;\n\t\t}\n\t}\n}\n\nfunction BlurStack()\n{\n\tthis.r = 0;\n\tthis.g = 0;\n\tthis.b = 0;\n\tthis.a = 0;\n\tthis.next = null;\n}\n\nmodule.exports = blur;\n\n/***/ }),\n/* 1545 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _panel = __webpack_require__(1546);\n\nvar _panel2 = _interopRequireDefault(_panel);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\r\n * Filter Panel Container\r\n *\r\n * Component hierarchy:\r\n *                                                                                                                                +-+\r\n * +----------------------------------------+\r\n * |    <FilterPanel>              |\r\n * |    +----------------------+       +----+\r\n * |    | <Panel>              |       | <Pa|\r\n * |    | +------------------+ |       | +--+\r\n * |    | | <Node>           | |       | |  |\r\n * |    | | +---------------++ |       | |  |\r\n * |    | | | <Node>        || |       | |  |\r\n * |    | | | +------------+-| |       | |  |\r\n * |    | | | |            |-| |       | |  |\r\n * |    | | | |   ...      |-| |       | |  |\r\n * |    | | | |            |-| |       | |  |\r\n * |    | | | |            |-| |       | |  |\r\n * |    | | | +--------------| |       | |  |\r\n * |    | | +-+--------------+ |       | |  |\r\n * |    | |        .         | |       | |  |\r\n * |    | +------------------+ |       | +--+\r\n * |    +-+------------------+-+       +-+--+\r\n * +----------------------------------------+\r\n *\r\n * This container 'owns' the budgetData instance and is responsible for generating <Panel> components for each breakdown,\r\n * along with handling all node toggle/sort events that originate from either <Panel>s or the <Node> components owned by those\r\n * <Panel>s\r\n *\r\n */\nvar FilterPanel = (0, _createReactClass2.default)({\n    displayName: 'FilterPanel',\n\n    propTypes: {\n        accountType: _propTypes2.default.string,\n        athenaState: _propTypes2.default.object.isRequired,\n        budgetData: _propTypes2.default.object.isRequired,\n        filterPanels: _propTypes2.default.object\n    },\n    componentWillMount: function componentWillMount() {\n        this.athenaState = this.props.athenaState;\n        this.budgetData = this.props.budgetData;\n        this._subscribeDOMEvents();\n        this._subscribeBudgetDataEvents();\n        this._setAccountTypeChildren(this.props.accountType);\n        var panels = _lodash2.default.chain(this.athenaState.breakdowns.toJSON()).filter({ visible: true }).map(function (panel) {\n            return {\n                id: panel.id,\n                name: panel.name,\n                visible: false\n            };\n        }).value();\n        this.setState({ panelState: panels });\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this._unsubscribeBudgetDataEvents();\n        this._unsubscribeDOMEvents();\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        if (this.props.accountType !== nextProps.accountType) {\n            this._setAccountTypeChildren(nextProps.accountType);\n        }\n    },\n    _subscribeDOMEvents: function _subscribeDOMEvents() {\n        (0, _jquery2.default)(document).on('click', this.handleDocumentClick);\n    },\n    _subscribeBudgetDataEvents: function _subscribeBudgetDataEvents() {\n        var budgetData = this.budgetData;\n        var typesBreakdown = budgetData.breakdowns.get('types');\n        budgetData.on('change:accountType', function (m, accountType) {\n            this._setAccountTypeChildren(accountType);\n        }, this);\n        typesBreakdown.on('change:name', function (breakdown, name) {\n            this._setPanelTitle('types', name);\n        }, this);\n    },\n    _unsubscribeDOMEvents: function _unsubscribeDOMEvents() {\n        (0, _jquery2.default)(document).off('click', this.handleDocumentClick);\n    },\n    _unsubscribeBudgetDataEvents: function _unsubscribeBudgetDataEvents() {\n        var budgetData = this.budgetData;\n        var typesBreakdown = budgetData.breakdowns.get('types');\n        budgetData.off();\n        typesBreakdown.off();\n    },\n    handleSort: function handleSort(id, sort) {\n        this.athenaState.setTreeSort(id, sort);\n        this.forceUpdate();\n    },\n    handleDocumentClick: function handleDocumentClick(e) {\n        if (!this._getVisiblePanels().size) {\n            // we can bail early if no panels are open\n            return;\n        }\n        //TODO: figure out better approach for excluding click targets for closing all panels\n        var isFilterButtonClick = (0, _jquery2.default)('#wd-section-filter').get(0) && _jquery2.default.contains((0, _jquery2.default)('#wd-section-filter').get(0), e.target);\n        var isTitleFilterClick = (0, _jquery2.default)('#report-drilldown-title').get(0) && _jquery2.default.contains((0, _jquery2.default)('#report-drilldown-title').get(0), e.target);\n        var inContainer = _jquery2.default.contains(_reactDom2.default.findDOMNode(this), e.target);\n        var targetClassName = e.target.className || '';\n        var isFilterCloseClick = targetClassName.includes('ui-panel__close');\n        if (!isFilterButtonClick && !isTitleFilterClick && !inContainer && !isFilterCloseClick) {\n            _summary_report_actions2.default.closeAllFilterPanels();\n        }\n    },\n    _setPanelTitle: function _setPanelTitle(id, title) {\n        var panelStateCopy = this.state.panelState.slice(0);\n        var panel = _lodash2.default.find(panelStateCopy, { id: id });\n        panel.name = title;\n        this.setState({ panelState: panelStateCopy });\n    },\n\n    /**\r\n     * Sets the child nodes under the special 'types' tree based on the selected account type (this allows\r\n     * for multiple account type trees to be rendered by a <Panel> component, since it expects a single root node to be passed\r\n     *\r\n     * @param {string} accountType\r\n     */\n    _setAccountTypeChildren: function _setAccountTypeChildren(accountType) {\n        var filterPredicate = accountType === 'types' ? function (t) {\n            return t.visible;\n        } : function (t) {\n            return t.id === accountType;\n        };\n        this.budgetData.trees.types.children = _lodash2.default.chain(this.budgetData.accountTrees).filter(filterPredicate).map(function (t) {\n            return t.children;\n        }).flatten().value();\n    },\n    _getVisiblePanels: function _getVisiblePanels() {\n        return this.props.filterPanels.filter(function (panel) {\n            return panel.get('isOpen');\n        });\n    },\n    render: function render() {\n        var _this = this;\n\n        var visiblePanels = this._getVisiblePanels();\n        if (!visiblePanels.size) {\n            return null;\n        }\n        return _react2.default.createElement(\"div\", { className: \"subpanels js-subpanels\" }, visiblePanels.map(function (panel) {\n            return _react2.default.createElement(_panel2.default, { key: panel.get('id'), title: panel.get('name'), visible: panel.get('isOpen'), changeSort: _this.handleSort, sort: _this.athenaState.getTreeSort(panel.get('id')), node: _this.budgetData.trees[panel.get('id')] });\n        }));\n    }\n});\nexports.default = FilterPanel;\n\n/***/ }),\n/* 1546 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Panel = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _node = __webpack_require__(1547);\n\nvar _node2 = _interopRequireDefault(_node);\n\nvar _search_input = __webpack_require__(1548);\n\nvar _search_input2 = _interopRequireDefault(_search_input);\n\nvar _sort_dropdown = __webpack_require__(1549);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _reactI18next = __webpack_require__(148);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Panel = exports.Panel = function (_React$Component) {\n    _inherits(Panel, _React$Component);\n\n    function Panel() {\n        _classCallCheck(this, Panel);\n\n        var _this = _possibleConstructorReturn(this, (Panel.__proto__ || Object.getPrototypeOf(Panel)).apply(this, arguments));\n\n        _this.state = {\n            filterText: '',\n            searchOverflow: 0,\n            searchResultCount: null\n        };\n        _this.handleUserInput = function (filterText) {\n            var searchResultCount = 0;\n            if (filterText !== '') {\n                searchResultCount = _this._tagMatchedNodes(filterText);\n            } else {\n                _this._clearTaggedNodes();\n            }\n            _this.setState({\n                filterText: filterText,\n                searchResultCount: searchResultCount\n            });\n        };\n        /**\r\n         * DFS for visiting all descendent nodes under root\r\n         *\r\n         * @param {BudgetNode} node\r\n         * @param {function} visitorFunc\r\n         */\n        _this._visitChildNodes = function (node, visitorFunc) {\n            if (visitorFunc) {\n                visitorFunc(node);\n            }\n            _lodash2.default.each(node.children, _lodash2.default.bind(function (child) {\n                this._visitChildNodes(child, visitorFunc);\n            }, _this));\n        };\n        /**\r\n         * Visits all descendent nodes and tags those matching a search string (along with their parents and ancestors)\r\n         * with attributes that the <Node> component will use during rendering (the 'search{Attribute}' properties)\r\n         *\r\n         * @param {string} search - Term to match node titles on\r\n         */\n        _this._tagMatchedNodes = function (search) {\n            var matchedNodes = [];\n            var expandStrategy = _this.props.node.id === 'types' ? _this._accountTreeNodeExpand : _this._nodeExpand;\n            var regexpSearch = new RegExp(search, 'i');\n            var count = 0;\n            //Build up an array of nodes matching the search term and decorate them\n            //with attributes to be rendered out\n            _this._visitChildNodes(_this.props.node, function (n) {\n                n.searchExpanded = false;\n                n.searchHidden = true;\n                n.searchIndexStart = undefined;\n                n.searchIndexEnd = undefined;\n                var name = _strings2.default.nodeName(n);\n                var startMatchIndex = name.search(regexpSearch);\n                if (startMatchIndex !== -1) {\n                    if (count++ < _this.props.maxSearchResults) {\n                        _this._tagMatchedNode(n, startMatchIndex, startMatchIndex + search.length);\n                        matchedNodes.push(n);\n                    }\n                }\n            });\n            //Expand out parents based on the strategy determined by the tree type\n            //The 'types' tree differs from other trees in that it is a \"virtual\" parent of its children\n            //since they don't actually contain a parent pointer back to it\n            matchedNodes.forEach(expandStrategy);\n            return count;\n        };\n        _this._accountTreeNodeExpand = function (n) {\n            var p = n;\n            var typesTree = _this.props.node;\n            while (p.parent) {\n                if (p.parent.isAccountTypeTree) {\n                    typesTree.searchExpanded = true;\n                    typesTree.searchHidden = false;\n                } else {\n                    p.parent.searchExpanded = true;\n                    p.parent.searchHidden = false;\n                }\n                p = p.parent;\n            }\n        };\n        _this._clearTaggedNodes = function () {\n            _this._visitChildNodes(_this.props.node, function (n) {\n                n.searchExpanded = false;\n                n.searchHidden = false;\n                n.searchIndexStart = undefined;\n                n.searchIndexEnd = undefined;\n            });\n        };\n        _this._selectAllNodes = function () {\n            _summary_report_actions2.default.treeSelect(_this.props.node.id);\n        };\n        _this._closePanel = function () {\n            _summary_report_actions2.default.toggleFilterPanel(_this.props.node.id);\n        };\n        return _this;\n    }\n\n    _createClass(Panel, [{\n        key: '_tagMatchedNode',\n        value: function _tagMatchedNode(node, startMatchIndex, endMatchIndex) {\n            node.searchHidden = false;\n            node.searchIndexStart = startMatchIndex;\n            node.searchIndexEnd = endMatchIndex;\n        }\n    }, {\n        key: '_nodeExpand',\n        value: function _nodeExpand(n) {\n            var p = n;\n            while (p.parent) {\n                p.parent.searchExpanded = true;\n                p.parent.searchHidden = false;\n                p = p.parent;\n            }\n        }\n    }, {\n        key: 'shouldComponentUpdate',\n        value: function shouldComponentUpdate(nextProps) {\n            return !nextProps.visible ? this.props.visible : true;\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                t = _props.t,\n                visible = _props.visible,\n                title = _props.title,\n                sort = _props.sort,\n                changeSort = _props.changeSort,\n                node = _props.node,\n                maxSearchResults = _props.maxSearchResults;\n\n            return _react2.default.createElement(\"div\", { className: 'subpanel ui-panel js-subpanel ' + (visible ? 'ready open' : '') }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, title), _react2.default.createElement(\"button\", { className: \"ui-panel__close\", onClick: this._closePanel })), _react2.default.createElement(\"div\", { className: \"ui-panel__content\" }, _react2.default.createElement(\"div\", { className: \"subpanel__options\" }, _react2.default.createElement(_search_input2.default, { filterText: this.state.filterText, placeholderText: t('components.FilterPanel.searchPlaceholder') + ' ' + title, onUserInput: this.handleUserInput })), _react2.default.createElement(\"div\", { className: \"subpanel__options\" }, _react2.default.createElement(_sort_dropdown.SortDropdown, { treeId: node.id, sort: sort, changeSort: changeSort }), _react2.default.createElement(\"button\", { className: \"subpanel__options__reset ui-button small no-color\", onClick: this._selectAllNodes }, _react2.default.createElement(\"i\", { className: \"fonticon icon-confirm-1\" }), \"All\")), _react2.default.createElement(\"div\", { className: \"subpanel__content\" }, this.state.searchResultCount > maxSearchResults ? _react2.default.createElement(\"div\", { className: \"report-state-alert ui-alert-box notice\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), _react2.default.createElement(\"strong\", null, maxSearchResults, \" results shown of \", this.state.searchResultCount)) : null, node.children.every(function (n) {\n                return n.searchHidden;\n            }) ? _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No results found\")) : _react2.default.createElement(_node2.default, { node: node }))));\n        }\n    }]);\n\n    return Panel;\n}(_react2.default.Component);\n\nPanel.defaultProps = {\n    maxSearchResults: 100\n};\nvar TranslatedPanel = (0, _reactI18next.translate)('report', { wait: true })(Panel);\nTranslatedPanel.contextTypes = {\n    i18n: _propTypes2.default.object\n};\nexports.default = TranslatedPanel;\n\n/***/ }),\n/* 1547 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Node = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Node = exports.Node = function (_React$Component) {\n    _inherits(Node, _React$Component);\n\n    function Node() {\n        _classCallCheck(this, Node);\n\n        var _this = _possibleConstructorReturn(this, (Node.__proto__ || Object.getPrototypeOf(Node)).apply(this, arguments));\n\n        _this._toggleNode = function (id) {\n            _summary_report_actions2.default.nodeToggleSelect(id);\n            _this.forceUpdate();\n        };\n        _this._expandNode = function (node) {\n            node.expanded = !node.expanded;\n            _this.forceUpdate();\n        };\n        _this._selectExclusiveNode = function (id) {\n            _summary_report_actions2.default.nodeExclusiveSelect(id);\n        };\n        _this._renderDropItemBar = function (node) {\n            var name = _strings2.default.nodeName(node);\n            var hasChildren = node.children.length > 0;\n            var isUngrouped = node.ungrouped;\n            var dropItemBarClassNames = (0, _classnames2.default)({\n                'drop-item__bar': true,\n                locked: isUngrouped,\n                'no-children': !hasChildren\n            });\n            var textClasses = (0, _classnames2.default)({\n                'drop-item__text': true,\n                locked: isUngrouped\n            });\n            if (hasChildren) {\n                return _react2.default.createElement(\"button\", { className: dropItemBarClassNames, onClick: _this._expandNode.bind(null, node) }, _react2.default.createElement(\"span\", { className: \"drop-item__bar__icon\" }), _react2.default.createElement(\"span\", { className: textClasses, title: name, onClick: !isUngrouped && _this._selectExclusiveNode.bind(null, node.id) }, _this._renderHighlightNode(name, node.searchIndexStart, node.searchIndexEnd)));\n            } else {\n                return _react2.default.createElement(\"div\", { className: dropItemBarClassNames }, _react2.default.createElement(\"span\", { className: \"drop-item__bar__icon__blank\" }), _react2.default.createElement(\"span\", { className: textClasses, title: name, onClick: !isUngrouped && _this._selectExclusiveNode.bind(null, node.id) }, _this._renderHighlightNode(name, node.searchIndexStart, node.searchIndexEnd)));\n            }\n        };\n        return _this;\n    }\n\n    _createClass(Node, [{\n        key: '_renderHighlightNode',\n        value: function _renderHighlightNode(text, indexStart, indexEnd) {\n            if (!_lodash2.default.isUndefined(indexStart)) {\n                return _react2.default.createElement(\"span\", null, _react2.default.createElement(\"span\", null, text.slice(0, indexStart)), _react2.default.createElement(\"span\", { className: \"ui-highlight\" }, text.slice(indexStart, indexEnd)), _react2.default.createElement(\"span\", null, text.slice(indexEnd)));\n            }\n            return _react2.default.createElement(\"span\", null, text);\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var childNodes = void 0;\n            var isCurExpanded = this.props.node.isTree ? true : !!this.props.node.searchExpanded || !!this.props.node.expanded;\n            if (this.props.node.children && !this.props.node.searchHidden && isCurExpanded) {\n                childNodes = this.props.node.children.map(function (n) {\n                    var liClasses = (0, _classnames2.default)({\n                        'drop-item': true,\n                        expanded: n.searchExpanded || n.expanded,\n                        disabled: n.disabled\n                    });\n                    var buttonsClasses = (0, _classnames2.default)({\n                        'drop-item__checkbox js-node-checkbox': true,\n                        checked: n.selected,\n                        'checked checked_partial': n.partiallySelected\n                    });\n                    if (!n.searchHidden) {\n                        return _react2.default.createElement(\"li\", { key: n.id, className: liClasses }, _this2._renderDropItemBar(n), _react2.default.createElement(\"div\", { className: \"drop-item__buttons\" }, !n.ungrouped ? _react2.default.createElement(\"button\", { role: \"checkbox\", onClick: _this2._toggleNode.bind(null, n.id), className: buttonsClasses, \"data-id\": n.id }, _react2.default.createElement(\"span\", { className: \"fonticon checkmark-icon\" })) : null), _react2.default.createElement(Node, { node: n }));\n                    }\n                });\n            }\n            return _react2.default.createElement(\"ul\", { className: \"drop-item__wrapper\" }, childNodes);\n        }\n    }]);\n\n    return Node;\n}(_react2.default.Component);\n\nexports.default = Node;\n\n/***/ }),\n/* 1548 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SearchInput = (0, _createReactClass2.default)({\n    displayName: 'SearchInput',\n    componentDidMount: function componentDidMount() {\n        this.props.onUserInput('');\n    },\n    handleChange: function handleChange(e) {\n        this.props.onUserInput(e.target.value);\n    },\n    render: function render() {\n        return _react2.default.createElement(\"div\", { className: \"ui-search small\" }, _react2.default.createElement(\"span\", { className: \"icon-search-1\" }), _react2.default.createElement(\"input\", { type: \"search\", placeholder: this.props.placeholderText, value: this.props.filterText, onChange: this.handleChange }), _react2.default.createElement(\"span\", { className: \"icon-remove-2\" }));\n    }\n});\nexports.default = SearchInput;\n\n/***/ }),\n/* 1549 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.SortDropdown = undefined;\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Dropdown = Ovid.Dropdown;\nvar sortMethods = [{ id: 'alpha', name: _react2.default.createElement(\"span\", null, \"Sort A \", _react2.default.createElement(\"i\", { className: \"fonticon icon-right-1\" }), \" Z \") }, { id: 'coa', name: _react2.default.createElement(\"span\", null, \"Sort by Chart of Accounts\") }];\nvar SortDropdown = exports.SortDropdown = function SortDropdown(_ref) {\n    var sort = _ref.sort,\n        changeSort = _ref.changeSort,\n        treeId = _ref.treeId;\n\n    var sortOptions = _lodash2.default.map(sortMethods, _lodash2.default.bind(function (item) {\n        return _react2.default.createElement(\"li\", { key: item.id }, _react2.default.createElement(\"a\", { onClick: changeSort.bind(null, treeId, item.id) }, \" \", item.name, \" \"));\n    }, undefined));\n    var curSort = _lodash2.default.find(sortMethods, function (item) {\n        return item.id === sort;\n    }, undefined);\n    var title = curSort ? curSort.name : '';\n    return _react2.default.createElement(Dropdown, { dropdownClass: \"subpanel__options__sort-by\", title: title, disabled: false }, _react2.default.createElement(\"ul\", { className: \"ui-dropdown__list\" }, sortOptions));\n};\n\n/***/ }),\n/* 1550 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getErrorsByProjectionTypesFromSourceDatasets = exports.formatError = exports.cleanSourceDatasetErrors = exports.getReadableProjectionsErrors = exports.getReadableErrorYears = exports.getProjectionDropdownListItemTitleAndDescription = exports.PROJECTION_ERROR_MESSAGE = exports.PROJECTION_TYPE_VALUES = exports.PROJECTION_TYPES = exports.PROJECTIONS_ERROR_TYPE_VALUES = exports.PROJECTIONS_ERROR_TYPE_MESSAGES = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar PROJECTIONS_ERROR_TYPE_MESSAGES = exports.PROJECTIONS_ERROR_TYPE_MESSAGES = {\n    'missing_months': 'In order to use projections you need five full years of monthly data. It looks like you are missing expense and revenue information for:',\n    'duplicative_months': 'It looks like you have duplicate datasets in your report. Please review the following time periods and remove the duplicates:',\n    'future_months': 'It looks like you have monthly actuals in your report for time periods that have not occurred. In order to run projections you need to remove the following datasets:'\n};\nvar PROJECTIONS_ERROR_TYPE_VALUES = exports.PROJECTIONS_ERROR_TYPE_VALUES = _lodash2.default.keys(PROJECTIONS_ERROR_TYPE_MESSAGES);\nvar isValidErrorType = function isValidErrorType(errorType) {\n    return _lodash2.default.includes(PROJECTIONS_ERROR_TYPE_VALUES, errorType);\n};\nvar getErrorMessage = function getErrorMessage(errorType) {\n    return PROJECTIONS_ERROR_TYPE_MESSAGES[errorType];\n};\nvar PROJECTION_TYPE_BASE_DESCRIPTION = 'Based on YTD actuals and activity from the previous';\nvar PROJECTION_TYPES = exports.PROJECTION_TYPES = {\n    '1_year_avg': {\n        title: 'Prior-Year Actuals',\n        description: PROJECTION_TYPE_BASE_DESCRIPTION + ' year'\n    },\n    '2_year_avg': {\n        title: '2-Year Average',\n        description: PROJECTION_TYPE_BASE_DESCRIPTION + ' 2 years'\n    },\n    '3_year_avg': {\n        title: '3-Year Average',\n        description: PROJECTION_TYPE_BASE_DESCRIPTION + ' 3 years'\n    },\n    '4_year_avg': {\n        title: '4-Year Average',\n        description: PROJECTION_TYPE_BASE_DESCRIPTION + ' 4 years'\n    },\n    'auto_year_avg': {\n        title: 'OpenGov Trend Analysis (Recommended)',\n        description: 'Use the method that performs best on previous years'\n    }\n};\nvar PROJECTION_TYPE_VALUES = exports.PROJECTION_TYPE_VALUES = _lodash2.default.keys(PROJECTION_TYPES);\nvar PROJECTION_ERROR_MESSAGE = exports.PROJECTION_ERROR_MESSAGE = 'Click here to learn more about this error';\n/**\r\n * Returns a object of props to be consumed by a DropdowListItem component.\r\n * @param  {object}  projection    The current projection\r\n * @param  {boolean} typehasErrors If the current projection type has errors\r\n * @return {object}                An object with title and description values\r\n */\nvar getProjectionDropdownListItemTitleAndDescription = exports.getProjectionDropdownListItemTitleAndDescription = function getProjectionDropdownListItemTitleAndDescription(projection, typehasErrors) {\n    var title = projection.title,\n        description = projection.description;\n\n    title = typehasErrors ? _react2.default.createElement(\"span\", { className: \"projections-warning\" }, _react2.default.createElement(\"span\", { className: \"icon-warning-1\" }), \" \", title) : title;\n    description = typehasErrors ? PROJECTION_ERROR_MESSAGE : description;\n    return {\n        title: title,\n        description: description\n    };\n};\n/**\r\n * Return a string with a list of years and months.\r\n * @param  {object} error The error object with keys being years, and values being an array of months\r\n * @return {string}       A string with the years and months that the error has\r\n */\nvar getReadableErrorYears = exports.getReadableErrorYears = function getReadableErrorYears(error) {\n    return _lodash2.default.map(error, function (months, year) {\n        // if we have a years worth of errors, then just show the year\n        if (months.length === 12) {\n            return '' + year;\n        }\n        return '' + months.map(function (m) {\n            return (0, _moment2.default)().month(m - 1).format('MMM') + ' ' + year;\n        }).join(', ');\n    }).join(', ');\n};\nvar getReadableProjectionsErrors = exports.getReadableProjectionsErrors = function getReadableProjectionsErrors(error, errorType) {\n    if (isValidErrorType(errorType)) {\n        return getErrorMessage(errorType) + ' ' + getReadableErrorYears(error);\n    }\n};\n/**\r\n * Returns the sourceDatasets without any errors with an invalid type.\r\n * @param  {array}  sourceDatasets Array of source datasets from the server.\r\n * @return {array}                 Array of source dataset without any invalid error types.\r\n */\nvar cleanSourceDatasetErrors = exports.cleanSourceDatasetErrors = function cleanSourceDatasetErrors(sourceDatasets) {\n    return sourceDatasets && sourceDatasets.map(function (sourceDataset) {\n        return _extends({}, sourceDataset, {\n            data_errors: sourceDataset.data_errors.filter(function (e) {\n                return isValidErrorType(e.name);\n            })\n        });\n    });\n};\nvar formatError = exports.formatError = function formatError(previousError, currentError, errorType) {\n    if (isValidErrorType(errorType)) {\n        var currentErrorValue = currentError.fields.date;\n        var calendarYear = currentErrorValue.calendar_year,\n            calendarMonth = currentErrorValue.calendar_month;\n        // this checks for the existence of the calendar for the given error and concats it\n        // otherwise sends a new array with the calendar month\n\n        var calendarYearErrors = previousError && previousError[calendarYear];\n        calendarYearErrors = calendarYearErrors && calendarYearErrors.concat(calendarMonth) || [calendarMonth];\n        return _extends({}, previousError, _defineProperty({}, calendarYear, calendarYearErrors));\n    }\n    return previousError;\n};\n/**\r\n * Returns an object tof the following shape:\r\n * {\r\n *   [<projectionType]: {\r\n *     [<errorType]: {\r\n *       [<calendarYear]: [<calendarMonth1, ..., calendarMonth12]\r\n *     },\r\n *     ...\r\n *   },\r\n *   ...\r\n * }\r\n *\r\n * @param  {array<object>} sourceDatasets Array of source datasets form the server\r\n * @return {object}                       An object with aforementioned shape\r\n */\nvar getErrorsByProjectionTypesFromSourceDatasets = exports.getErrorsByProjectionTypesFromSourceDatasets = function getErrorsByProjectionTypesFromSourceDatasets(sourceDatasets) {\n    var cleanedSourceDatasets = cleanSourceDatasetErrors(sourceDatasets);\n    return cleanedSourceDatasets && cleanedSourceDatasets.reduce(function (previousDatasets, currentDataset) {\n        var dataErrors = currentDataset.data_errors,\n            projectionType = currentDataset.metadata.name;\n\n        return _extends(_defineProperty({}, projectionType, dataErrors.reduce(function (previousErrors, currentError) {\n            var errorType = currentError.name;\n\n            var previousError = previousErrors && previousErrors[errorType];\n            return _extends({}, previousErrors, _defineProperty({}, errorType, formatError(previousError, currentError, errorType)));\n        }, {})), previousDatasets);\n    }, {});\n};\n\n/***/ }),\n/* 1551 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SummaryTableHead = function (_Component) {\n    _inherits(SummaryTableHead, _Component);\n\n    function SummaryTableHead() {\n        _classCallCheck(this, SummaryTableHead);\n\n        return _possibleConstructorReturn(this, (SummaryTableHead.__proto__ || Object.getPrototypeOf(SummaryTableHead)).apply(this, arguments));\n    }\n\n    _createClass(SummaryTableHead, [{\n        key: 'getFixedRowStyle',\n        value: function getFixedRowStyle() {\n            var customStyles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            return Object.assign({\n                position: 'relative',\n                top: this.props.scrollTop,\n                zIndex: 3\n            }, customStyles);\n        }\n    }, {\n        key: 'getFixedColumnStyle',\n        value: function getFixedColumnStyle() {\n            var customStyles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            return Object.assign({\n                borderRightWidth: this.props.scrollLeft ? '1px' : 0,\n                position: 'relative',\n                left: this.props.scrollLeft,\n                zIndex: 3\n            }, customStyles);\n        }\n    }, {\n        key: 'renderCollapseCell',\n        value: function renderCollapseCell() {\n            var _props = this.props,\n                handleAllExpansion = _props.handleAllExpansion,\n                pendingExpandAll = _props.pendingExpandAll,\n                expandedLines = _props.expandedLines,\n                trueLines = _props.trueLines,\n                lines = _props.lines,\n                expandedNodes = _props.expandedNodes;\n\n            var anyExpandedRootLines = _lodash2.default.some(expandedLines, function (_ref) {\n                var _ref2 = _slicedToArray(_ref, 1),\n                    line = _ref2[0];\n\n                return expandedNodes[line.id] === 'expanded';\n            });\n            var firstColumnStyle = this.getFixedRowStyle(this.getFixedColumnStyle({\n                paddingLeft: pendingExpandAll ? 7 : null,\n                zIndex: 4\n            }));\n            if (_lodash2.default.every(trueLines, 'childless')) {\n                return _react2.default.createElement(\"th\", { style: firstColumnStyle, className: \"row-header\" });\n            } else {\n                return _react2.default.createElement(\"th\", { style: firstColumnStyle, className: \"no-sort expander row-header\" }, _react2.default.createElement(\"button\", { className: \"ui-drop-item__button\", onClick: handleAllExpansion.bind(null, lines) }, pendingExpandAll ? _react2.default.createElement(\"span\", { className: \"ui-drop-item__icon\" }) : null, _react2.default.createElement(\"span\", { className: \"ui-table__cell__link\" }, anyExpandedRootLines ? 'Collapse All' : 'Expand All')));\n            }\n        }\n    }, {\n        key: 'renderHeaderCell',\n        value: function renderHeaderCell(dataSet) {\n            var headers = [];\n            var headerTitle = dataSet.title;\n            var classes = (0, _classnames2.default)('header', {\n                'no-sort uncertain': dataSet.type === 'budget',\n                currency: _summary_report_store2.default.getReportAmountType().isCurrency\n            });\n            headers.push(_react2.default.createElement(\"th\", { style: this.getFixedRowStyle(), className: classes, \"data-hint\": dataSet.prorated ? 'Prorated' : null, \"data-hint-position\": \"bottom\", \"data-hint-align\": \"right\", key: headerTitle }, _react2.default.createElement(\"strong\", { dangerouslySetInnerHTML: { __html: headerTitle } }), dataSet.prorated ? _react2.default.createElement(\"a\", { className: \"ui-table__cell__label icon-info-1\" }) : null));\n            if (dataSet.showVariance) {\n                headers.push(_react2.default.createElement(\"th\", { style: this.getFixedRowStyle(), className: classes, \"data-hint\": dataSet.varianceBaseType === 'projection' ? 'Projection vs Budget' : 'Actual vs Budget', \"data-hint-position\": \"bottom\", \"data-hint-align\": \"right\", key: dataSet.year + '-value' }, _react2.default.createElement(\"strong\", null, dataSet.year), \" Variance\", _react2.default.createElement(\"a\", { className: \"ui-table__cell__label icon-info-1\" })));\n                headers.push(_react2.default.createElement(\"th\", { style: this.getFixedRowStyle(), className: classes, \"data-hint\": dataSet.varianceBaseType === 'projection' ? 'Projection vs Budget' : 'Actual vs Budget', \"data-hint-position\": \"bottom\", \"data-hint-align\": \"right\", key: dataSet.year + '-percent' }, _react2.default.createElement(\"strong\", null, dataSet.year), \" Variance\", _react2.default.createElement(\"a\", { className: \"ui-table__cell__label icon-info-1\" })));\n            }\n            return headers;\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            var _props2 = this.props,\n                dataSets = _props2.dataSets,\n                pendingExpandAll = _props2.pendingExpandAll,\n                headerHeight = _props2.headerHeight;\n\n            return _react2.default.createElement(\"thead\", null, _react2.default.createElement(\"tr\", { style: this.getFixedRowStyle(this.getFixedColumnStyle({\n                    height: headerHeight,\n                    position: 'absolute'\n                })), className: \"fixed-row-background\" }), _react2.default.createElement(\"tr\", { style: { position: 'relative' }, className: (0, _classnames2.default)({\n                    loading: pendingExpandAll\n                }) }, this.renderCollapseCell(), dataSets.map(function (dataSet) {\n                return _this2.renderHeaderCell(dataSet);\n            })));\n        }\n    }]);\n\n    return SummaryTableHead;\n}(_react.Component);\n\nexports.default = SummaryTableHead;\n\n/***/ }),\n/* 1552 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar getHighlightingClass = exports.getHighlightingClass = function getHighlightingClass(account_type, highlight_variance, current_variance, variance_formulas) {\n    var delta = Math.abs(current_variance);\n    if (variance_formulas.isVarianceOverOrUnderBudget(account_type, current_variance)) {\n        if (delta > 0 && delta <= highlight_variance) {\n            return 'over1x';\n        } else if (delta > highlight_variance && delta <= 2 * highlight_variance) {\n            return 'over2x';\n        } else if (delta > 2 * highlight_variance) {\n            return 'over3x';\n        }\n    }\n    return 'normal';\n};\n\n/***/ }),\n/* 1553 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _datagrid_component = __webpack_require__(1554);\n\nvar _datagrid_component2 = _interopRequireDefault(_datagrid_component);\n\nvar _summary_table = __webpack_require__(678);\n\nvar _summary_table2 = _interopRequireDefault(_summary_table);\n\nvar _utils = __webpack_require__(33);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _grid_report_actions = __webpack_require__(12);\n\nvar _grid_report_actions2 = _interopRequireDefault(_grid_report_actions);\n\nvar _grid_report_store = __webpack_require__(70);\n\nvar _grid_report_store2 = _interopRequireDefault(_grid_report_store);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _report_header_row_count = __webpack_require__(525);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EmbeddedGriddleComponent = (0, _createReactClass2.default)({\n    displayName: 'EmbeddedGriddleComponent',\n\n    propTypes: {\n        isBalanceSheetReport: _propTypes2.default.bool,\n        isPublic: _propTypes2.default.bool,\n        query: _propTypes2.default.object,\n        report: _propTypes2.default.object,\n        locale: _propTypes2.default.string,\n        entity: _propTypes2.default.object,\n        linkedYears: _propTypes2.default.array,\n        overlay: _propTypes2.default.object,\n        scale: _propTypes2.default.object,\n        metricData: _propTypes2.default.object,\n        projections: _propTypes2.default.bool,\n        projectionType: _propTypes2.default.string\n    },\n    mixins: [(0, _og_flux.StoreListener)(_grid_report_store2.default)],\n    storeDidUpdate: function storeDidUpdate() {\n        //make sure this has grid + columns before setting the property\n        var grid = _grid_report_store2.default.getState().get('grid');\n        if (!_grid_report_store2.default.getState().get('loading') && grid && grid.get('columns')) {\n            this.setState({ columnProperties: grid.get('columns').toJSON() });\n        }\n    },\n    getInitialState: function getInitialState() {\n        var state = _grid_report_store2.default.getState();\n        return {\n            initialized: false,\n            loading: true,\n            errorMessage: null,\n            griddleState: null,\n            filter: '',\n            fromDate: null,\n            toDate: null,\n            availableYears: [],\n            date: (0, _moment2.default)(),\n            transactionTableHeight: 500,\n            queryModel: state.get('queryModel'),\n            columnProperties: [],\n            selectedTab: 0\n        };\n    },\n    shouldRenderDatagrid: function shouldRenderDatagrid() {\n        if (!this.props.report) {\n            return false;\n        }\n        var isPublicMode = !this.props.embedded;\n        var isHidden = this.props.report.get('hidden');\n        //Don't show the linked tx report if there isn't a child report, or if this is in public mode and the linked report is private\n        return !(isPublicMode && isHidden);\n    },\n    componentDidMount: function componentDidMount() {\n        var _this = this;\n\n        if (this.shouldRenderDatagrid()) {\n            _lodash2.default.defer(function () {\n                return _grid_report_actions2.default.loadGridState({ query: _this.props.report.get('properties').grid_state_id });\n            });\n        }\n    },\n    handleFetchAvailableYears: function handleFetchAvailableYears(years) {\n        var minYear = (0, _moment2.default)([years[0], 0, 1]);\n        var maxYear = (0, _moment2.default)([years[years.length - 1], 0, 1]);\n        if (this._isMounted) {\n            this.setState({ minYear: minYear, maxYear: maxYear, date: maxYear });\n            this.handleDateChange(maxYear);\n            this.formatYearSelection(maxYear);\n        }\n    },\n    griddleStateChangeHandler: function griddleStateChangeHandler(state) {\n        this.setState({ griddleState: state });\n    },\n    onKeyUp: function onKeyUp(ev) {\n        var text = this.refs.search.value;\n        //Trap for enter keypress\n        if (ev.which === 13) {\n            _grid_report_actions2.default.filterColumn('all', 'contains', _utils2.default.parseNumber(text) || text);\n        }\n    },\n    changeHandler: function changeHandler(event) {\n        if (event.target.value === '') {\n            _grid_report_actions2.default.filterColumn('all', 'contains', '');\n        }\n    },\n    handleFilterReset: function handleFilterReset() {\n        this.refs.search.value = '';\n        _grid_report_actions2.default.filterColumn('all', 'contains', '');\n    },\n    handleDateChange: function handleDateChange(date) {\n        var fyMonthOffset = this.props.entity.get('fiscal_year_start_month') - 1;\n        var fiscalAdjust = fyMonthOffset === 0 ? 1 : 0;\n        var from = (0, _moment2.default)([date.year() - 1 + fiscalAdjust, fyMonthOffset, 1]).locale(this.props.locale);\n        var to = from.clone().add(1, 'years').subtract(1, 'second');\n        this.setState({ fromDate: from, toDate: to, date: date });\n    },\n    buildFormattedFYString: function buildFormattedFYString(from, to) {\n        return from && to ? _react2.default.createElement(\"span\", null, \"FY \", from.year() + ' - ' + to.year()) : null;\n    },\n    handleSelectedTab: function handleSelectedTab(index) {\n        if (index === 1) {\n            this.setState({\n                transactionTableHeight: _reactDom2.default.findDOMNode(this.refs.container).offsetHeight,\n                isGridVisible: true,\n                selectedTab: index\n            });\n        } else {\n            this.setState({\n                isGridVisible: false,\n                selectedTab: index\n            });\n        }\n    },\n    formatYearSelection: function formatYearSelection(date) {\n        return _react2.default.createElement(\"span\", null, \"Transactions for \", _react2.default.createElement(\"strong\", null, \"FYE \", date.year()), \" \");\n    },\n    getTabContent: function getTabContent(griddleState, isGridVisible) {\n        if (isGridVisible && griddleState && !griddleState.loadingTotals) {\n            var txTabCount = griddleState.count || 0;\n            return txTabCount > 9999 ? '9999+' : txTabCount.toString();\n        }\n        if (!isGridVisible && griddleState && !griddleState.loadingTotals && griddleState.count === 0) {\n            return '0';\n        }\n        return '';\n    },\n    getTabIcons: function getTabIcons(griddleState, isGridVisible) {\n        if (griddleState && griddleState.loadingTotals) {\n            return _react2.default.createElement(\"span\", { className: \"ui-badge_loader_container\" }, _react2.default.createElement(\"div\", { className: \"querygrid-loader__icon_loading ui-badge_loader\" }));\n        }\n        if (!isGridVisible && griddleState && !griddleState.loadingTotals && griddleState.count !== 0) {\n            return _react2.default.createElement(\"div\", { className: \"ui-badge_exists\" });\n        }\n        return null;\n    },\n    render: function render() {\n        var txTabCount = this.getTabContent(this.state.griddleState, this.state.isGridVisible);\n        var txTabIcons = this.getTabIcons(this.state.griddleState, this.state.isGridVisible);\n        return _react2.default.createElement(\"span\", null, this.shouldRenderDatagrid() ? _react2.default.createElement(Ovid.Tabs.Container, { minimal: true, selectedTabIndex: this.state.selectedTab, selectedTabHandler: this.handleSelectedTab, ref: \"container\" }, _react2.default.createElement(Ovid.Tabs.Tab, { title: \"Summary Table\", tabPanelClasses: \"table-tab-panel table-tab-panel_breakdown\" }, _react2.default.createElement(_summary_table2.default, { isBalanceSheetReport: this.props.isBalanceSheetReport, fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'), athenaState: this.props.athenaState, reportEvents: this.props.reportEvents, expandedNodes: this.props.expandedNodes, height: this.props.height, accountType: this.props.accountType, overlay: this.props.overlay, metricData: this.props.metricData, scale: this.props.scale, stickyHeader: true, highlighting: this.props.highlighting, highlightingVariance: this.props.highlightingVariance, projections: this.props.projections, projectionType: this.props.projectionType })), _react2.default.createElement(Ovid.Tabs.Tab, { title: _react2.default.createElement(\"span\", null, this.props.report.get('name'), txTabIcons), tabPanelClasses: \"table-tab-panel table-tab-panel_datagrid\", tabCount: txTabCount }, _react2.default.createElement(\"header\", { className: \"table__header\" }, _react2.default.createElement(\"div\", { className: \"ui-col-2of6\" }, _react2.default.createElement(\"div\", { className: \"ui-search small\" }, _react2.default.createElement(\"span\", { className: \"icon-search-1\" }), _react2.default.createElement(\"input\", { type: \"search\", ref: \"search\", placeholder: \"Search in table\", onChange: this.changeHandler, onKeyUp: this.onKeyUp }), _react2.default.createElement(\"span\", { className: 'icon-remove-2 ' + (0, _classnames2.default)({ 'is-active': this.state.value }), onClick: this.clearSearch }))), _react2.default.createElement(\"div\", { className: \"ui-col-2of6\" }, this.state.griddleState != null ? _react2.default.createElement(_report_header_row_count.ReportHeaderRowCount, { className: \"row-count\", count: this.state.griddleState.count, estimate: this.state.griddleState.estimate }) : null), _react2.default.createElement(\"div\", { className: \"date-pagination ui-col-2of6\" }, _react2.default.createElement(Ovid.DatePicker, { minYear: this.state.minYear, maxYear: this.state.maxYear, formatDisplayDate: this.formatYearSelection, minSelectionMode: \"years\", date: this.state.date, onDateSelected: this.handleDateChange }))), _react2.default.createElement(_datagrid_component2.default, { ref: \"griddle\", locale: this.props.locale, height: this.state.transactionTableHeight, entity: this.props.entity, isVisible: this.state.selectedTab === 1, fromDate: this.state.fromDate, toDate: this.state.toDate, query: this.props.query, queryModel: this.state.queryModel, linkageNodes: this.props.linkageNodes, maskNodesForLinkage: this.props.maskNodesForLinkage, filter: this.state.filter, report: this.props.report, columnProperties: this.state.columnProperties, linkedYears: this.props.linkedYears, onFilterReset: this.handleFilterReset, onGriddleStateChange: this.griddleStateChangeHandler, onBreakdownTableSwitch: this.props.handleBreakdownTabSwitch, onFetchAvailableYears: this.handleFetchAvailableYears }))) : _react2.default.createElement(_summary_table2.default, { isBalanceSheetReport: this.props.isBalanceSheetReport, fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'), athenaState: this.props.athenaState, reportEvents: this.props.reportEvents, expandedNodes: this.props.expandedNodes, height: this.props.height, accountType: this.props.accountType, overlay: this.props.overlay, scale: this.props.scale, metricData: this.props.metricData, highlighting: this.props.highlighting, highlightingVariance: this.props.highlightingVariance, projections: this.props.projections, projectionType: this.props.projectionType }));\n    }\n});\nexports.default = EmbeddedGriddleComponent;\n\n/***/ }),\n/* 1554 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _og = __webpack_require__(53);\n\nvar og = _interopRequireWildcard(_og);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _moment = __webpack_require__(2);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _querygrid = __webpack_require__(516);\n\nvar _querygrid2 = _interopRequireDefault(_querygrid);\n\nvar _remotemodel = __webpack_require__(263);\n\nvar _remotemodel2 = _interopRequireDefault(_remotemodel);\n\nvar _contextmenu = __webpack_require__(264);\n\nvar _contextmenu2 = _interopRequireDefault(_contextmenu);\n\nvar _headermenu = __webpack_require__(518);\n\nvar _headermenu2 = _interopRequireDefault(_headermenu);\n\nvar _numberTypes = __webpack_require__(87);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DataGrid = (0, _createReactClass2.default)({\n    displayName: 'DataGrid',\n\n    propTypes: {\n        query: _propTypes2.default.object,\n        queryModel: _propTypes2.default.object,\n        filter: _propTypes2.default.string,\n        report: _propTypes2.default.object,\n        linkedYears: _propTypes2.default.array,\n        fromDate: _propTypes2.default.object,\n        toDate: _propTypes2.default.object,\n        locale: _propTypes2.default.string,\n        onFetchAvailableYears: _propTypes2.default.func,\n        onGriddleStateChange: _propTypes2.default.func\n    },\n    getInitialState: function getInitialState() {\n        return {\n            initialized: false,\n            loading: true,\n            errorMessage: null,\n            griddleState: null,\n            columns: [],\n            reportNumberType: _numberTypes.numberTypes.dollar,\n            dateColumn: ''\n        };\n    },\n    getDefaultProps: function getDefaultProps() {\n        return {\n            height: 0,\n            width: 0\n        };\n    },\n    componentDidMount: function componentDidMount() {\n        this._createModels(this.props.report, this.props.isVisible);\n        this._createGridInstance(this.props.report);\n        this._adjustGridDimensions(this.props.height, this.props.width);\n    },\n    componentWillReceiveProps: function componentWillReceiveProps(nextProps) {\n        var tableHeaderHeight = (0, _jquery2.default)('.table__header').outerHeight();\n        var tabHeadingHeight = (0, _jquery2.default)('.ui-tab-card__header').outerHeight();\n        this._adjustGridDimensions(this.props.height, this.props.width);\n        if (nextProps.width !== this.props.width || nextProps.height !== this.props.height) {\n            this._adjustGridDimensions(nextProps.height - (tableHeaderHeight + tabHeadingHeight), nextProps.width);\n        }\n        //re-fetch all schema data for a new report that gets passed in\n        if (nextProps.report.id !== this.props.report.id) {\n            this._createModels(nextProps.report, nextProps.isVisible);\n            this._createGridInstance(nextProps.report);\n        }\n        var locale = nextProps.locale ? nextProps.locale : this.props.report && this.props.report.attributes.locale;\n        if (nextProps.columnProperties !== this.props.columnProperties && nextProps.columnProperties.length > 0 && this.grid) {\n            this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), nextProps.columnProperties), locale);\n        }\n        //Dates\n        if (this.props.fromDate && this.props.toDate) {\n            this.props.queryModel.filterColumn(this.state.dateColumn, 'ge', nextProps.fromDate.format('YYYY-MM-DD'));\n            this.props.queryModel.filterColumn(this.state.dateColumn, 'le', nextProps.toDate.format('YYYY-MM-DD'));\n        }\n        //CoA Filters\n        if (nextProps.linkageNodes) {\n            this.props.queryModel.setLinkageNodes(nextProps.linkageNodes, nextProps.maskNodesForLinkage);\n        } else {\n            this.props.queryModel.setAccountCodeQuery(nextProps.query);\n        }\n        //Visiblity prop (Prevents blank grid bug when grid is tabbed into view)\n        if (nextProps.isVisible !== this.props.isVisible && this.grid) {\n            this.grid.resizeCanvas();\n            this.grid.handleViewportChanged();\n            this.grid.adjustHeader();\n        }\n        if (nextProps.isVisible !== this.props.isVisible) {\n            this.loader.options.endpoint = nextProps.isVisible ? this.createFetchDataHandler(nextProps.report) : this.emptyFetchDataHandler();\n            if (nextProps.isVisible) {\n                this.props.queryModel.trigger('load');\n            }\n        }\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this.loader.off();\n        this.props.queryModel.off();\n        this.griddleState.off();\n    },\n    _createGridInstance: function _createGridInstance(report) {\n        var _this = this;\n\n        this.fetchGridState(report).then(function (_ref) {\n            var grid_state = _ref.grid_state;\n\n            var columns = _lodash2.default.get(grid_state, 'columns', []);\n            _this.fetchSchema(report).then(function (data) {\n                var locale = _this.props.locale || report.get('locale');\n                var reportNumberType = (0, _numberTypes.localeToCurrency)(locale);\n                _this.setState({ reportNumberType: reportNumberType, dateColumn: data.meta.date_column });\n                var transformedCols = _this.getColumnProperties(data.schema, columns, reportNumberType);\n                _this._createSlickgridInstance(transformedCols, data.meta, locale);\n                return data;\n            }).then(function (data) {\n                var dateColumn = _lodash2.default.find(data.schema, { name: data.meta.date_column });\n                if (dateColumn) {\n                    var transformedYears = _this._fiscalYearRange(dateColumn.min_value, dateColumn.max_value);\n                    _this.props.onFetchAvailableYears(_lodash2.default.intersection(transformedYears, _this.props.linkedYears));\n                }\n            });\n        });\n    },\n    _fiscalYearRange: function _fiscalYearRange(minDate, maxDate) {\n        var fiscalYearStartMonth = this.props.entity.fiscal_year_start_month;\n        minDate = (0, _moment2.default)(minDate);\n        maxDate = (0, _moment2.default)(maxDate);\n        var minDateAfterFYBreak = fiscalYearStartMonth !== 1 && minDate.month() + 1 >= fiscalYearStartMonth;\n        var maxDateBeforeFYBreak = fiscalYearStartMonth === 1 || maxDate.month() + 1 < fiscalYearStartMonth;\n        return _lodash2.default.range(minDate.year() + (minDateAfterFYBreak ? 1 : 0), maxDate.year() + (maxDateBeforeFYBreak ? 1 : 2));\n    },\n\n    _adjustGridDimensions: _lodash2.default.debounce(function (height, width) {\n        var container = (0, _jquery2.default)('.querygrid');\n        container.css({\n            width: width === 0 ? '100%' : width,\n            height: height === 0 ? '100%' : height\n        });\n        if (this.grid) {\n            this.grid.resizeCanvas();\n            this.onViewportChanged();\n            this.grid.adjustHeader();\n        }\n    }, 250, { leading: true }),\n    _createModels: function _createModels(report, isVisible) {\n        this.griddleState = new _backbone2.default.Model();\n        this.loader = new _remotemodel2.default({\n            endpoint: isVisible ? this.createFetchDataHandler(report) : this.emptyFetchDataHandler(),\n            queryModel: this.props.queryModel\n        });\n    },\n    fetchTotal: function fetchTotal(report, query) {\n        var _this2 = this;\n\n        var $deferred = _jquery2.default.Deferred();\n        var parameters = { filter: query.filter, entity_id: this.props.entity.id };\n        if (query.linkage_nodes) {\n            parameters.linkage_nodes = query.linkage_nodes;\n            parameters.mask_nodes_for_linkage = query.mask_nodes_for_linkage;\n        } else {\n            parameters.account_codes = query.account_codes;\n        }\n        og.api.trapi.post('total', report.get('transaction_id'), parameters, function (error, response) {\n            if (error || response && response.error) {\n                _this2.setState({ isError: true });\n                $deferred.reject();\n                return;\n            }\n            $deferred.resolve(response && response.body);\n        });\n        return $deferred;\n    },\n    fetchSchema: function fetchSchema(report) {\n        var _this3 = this;\n\n        var params = {};\n        var entity = this.props.entity;\n        var featurePermissions = this.props.entity.get('feature_permissions');\n        if (_lodash2.default.includes(featurePermissions, 'linkage_view')) {\n            params.linkage_view = true;\n            params.entity_id = entity.id;\n        }\n        var $deferred = _jquery2.default.Deferred();\n        og.api.trapi.get('schema', report.get('transaction_id'), params, function (error, response) {\n            if (error || response && response.error) {\n                _this3.setState({ isError: true });\n                $deferred.reject();\n                return;\n            }\n            $deferred.resolve(response && response.body);\n        });\n        return $deferred;\n    },\n    fetchGridState: function fetchGridState(report) {\n        var _this4 = this;\n\n        var $deferred = _jquery2.default.Deferred();\n        var gridStateId = report.get('properties').grid_state_id;\n        // If grid report is not configured defult grid_state_id\n        // will be null and break grid_state query.\n        // Bypass here to apply defaults\n        if (!gridStateId) {\n            $deferred.resolve({});\n            return $deferred;\n        }\n        og.api.get('grid_state', gridStateId, function (error, response) {\n            if (error || response && response.error) {\n                _this4.setState({ isError: true });\n                $deferred.reject();\n                return;\n            }\n            $deferred.resolve(response && response.body);\n        });\n        return $deferred;\n    },\n    createFetchDataHandler: function createFetchDataHandler(report) {\n        return function (q, cb) {\n            var query = _extends({}, q, { entity_id: report.get('entity') });\n            return og.api.trapi.post('query', report.get('transaction_id'), query, function (error, response) {\n                cb(error, response);\n            });\n        };\n    },\n    emptyFetchDataHandler: function emptyFetchDataHandler() {\n        return function (q, cb) {\n            var response = { body: { transactions: [] } };\n            cb(null, response);\n            return _jquery2.default.ajax();\n        };\n    },\n    _createSlickgridInstance: function _createSlickgridInstance(columns, meta, locale) {\n        var _this5 = this;\n\n        var grid = this.grid = new _querygrid2.default({\n            container: '.querygrid',\n            gridOptions: {},\n            characterWidth: 7,\n            cellPadding: 40,\n            autoWidth: true,\n            height: '500px',\n            queryModel: this.props.queryModel,\n            loader: this.loader,\n            columns: columns,\n            meta: meta,\n            showDropdown: true,\n            sendVisibleFieldsOnly: true\n        });\n        // header menu plugin for filtering and querying\n        var headerMenuPlugin = new _headermenu2.default({\n            locale: locale,\n            queryModel: this.props.queryModel,\n            features: {\n                hideColumn: false\n            }\n        });\n        grid.registerPlugin(headerMenuPlugin);\n        // plugin for right-click menu actions\n        var contextMenuPlugin = new _contextmenu2.default({\n            queryModel: this.props.queryModel,\n            positionCallback: function positionCallback(elementPosition, otherProperties) {\n                (0, _jquery2.default)(this).css({\n                    top: otherProperties.element.top,\n                    left: otherProperties.element.left\n                });\n            }\n        });\n        grid.registerPlugin(contextMenuPlugin);\n        grid.on('viewportChanged', this.onViewportChanged, this);\n        this.setReportState(this.props.report.get('properties'));\n        grid.handleViewportChanged();\n        grid.adjustHeader();\n        this.loader.on('loading', function () {\n            _this5.setState({ loading: true });\n        });\n        this.loader.on('loaded', function () {\n            _this5.setState({ loading: false });\n            _this5.grid.adjustHeader();\n        });\n        this.loader.on('error', function (e) {\n            _this5.setState({ errorMessage: JSON.stringify(e) });\n        });\n        //'load' is emitted when the query model attributes changed (which invalidates all local data and count totals)\n        this.props.queryModel.on('load', function () {\n            var _this6 = this;\n\n            var query = this.props.queryModel.toJSON();\n            this.loader.processQuery(query);\n            this.loader.clear();\n            this.griddleState.set({\n                loadingTotals: true\n            });\n            this.fetchTotal(this.props.report, query).then(function (data) {\n                _this6.griddleState.set({\n                    count: data.count,\n                    amount: data.total,\n                    loadingTotals: false\n                });\n            });\n            this.grid.handleViewportChanged();\n            this.grid.adjustHeader();\n        }, this);\n        this.griddleState.on('change', function () {\n            _this5.setState({ griddleState: _this5.griddleState.toJSON() }, function () {\n                if (_this5.props.onGriddleStateChange) {\n                    _this5.props.onGriddleStateChange(_this5.griddleState.toJSON());\n                }\n            });\n        });\n    },\n    getColumnProperties: function getColumnProperties(schema, columnSettings) {\n        var numberType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.reportNumberType;\n\n        var schemaColumns = _lodash2.default.chain(schema).map(function (c) {\n            var label = c.type === 'monetary' && c.label.indexOf(numberType.symbol) < 0 ? c.label + ' (' + numberType.symbol + ')' : c.label;\n            return _lodash2.default.extend(c, {\n                id: c.id || c.name,\n                label: label\n            });\n        }).keyBy('id').value();\n        var settingsColumns = columnSettings || [];\n        var columns = [];\n        // get columns in the order that was set in report settings\n        _lodash2.default.each(settingsColumns, function (c) {\n            if (c.id in schemaColumns) {\n                columns.push(_lodash2.default.extend({}, schemaColumns[c.id], c));\n                delete schemaColumns[c.id];\n            }\n        });\n        // add the rest of the columns from schema\n        _lodash2.default.each(schema, function (c) {\n            if (c.id in schemaColumns) {\n                columns.push(_lodash2.default.extend({ visible: !c.hidden }, schemaColumns[c.id]));\n            }\n        });\n        return columns;\n    },\n    onViewportChanged: function onViewportChanged() {\n        var vp = this.grid.getViewport();\n        this.griddleState.set({\n            top: vp.top,\n            bottom: vp.bottom\n        });\n    },\n    resetFilters: function resetFilters() {\n        var queryModel = this.props.queryModel;\n        queryModel.beginUpdate();\n        queryModel.filterClear();\n        queryModel.sort([]);\n        queryModel.endUpdate();\n    },\n    setReportState: function setReportState(state) {\n        var locale = this.props && this.props.locale ? this.props.locale : this.props && this.props.report && this.props.report.attributes.locale;\n        this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), state.columns), locale);\n        this.props.queryModel.setQuery(_lodash2.default.cloneDeep(state.query));\n    },\n    handleFilterReset: function handleFilterReset() {\n        this.props.onFilterReset();\n        this.resetFilters();\n    },\n    render: function render() {\n        var loaderClasses = (0, _classnames2.default)({\n            'error-state': this.state.isError,\n            'querygrid-loader ajax-loader': true\n        });\n        return _react2.default.createElement(\"div\", null, this.state.griddleState && this.state.griddleState.count === 0 && !this.state.loading ? _react2.default.createElement(\"p\", { className: \"ui-null align-center\" }, \"There's no transaction data for the given year or filter, try \", _react2.default.createElement(\"a\", { onClick: this.handleFilterReset }, \"resetting\"), \" your selection.\") : null, _react2.default.createElement(\"div\", { className: \"querygrid\", style: { display: 'inline-block' } }), _react2.default.createElement(\"div\", { className: loaderClasses, style: { display: this.state.loading ? 'block' : 'none' } }, _react2.default.createElement(\"div\", { className: \"querygrid-loader__icon_loading\" }), _react2.default.createElement(\"div\", { className: \"querygrid-loader__icon_error icon-exclamation-4\" }), _react2.default.createElement(\"div\", { className: \"querygrid-loader__text_loading\" }, \"Loading...\"), _react2.default.createElement(\"div\", { className: \"querygrid-loader__text_error\" }, \"Transactions Unavailable\"), !this.state.isError ? _react2.default.createElement(\"div\", { className: \"querygrid-loader__button js-griddle-loader-button\" }, \"Cancel\") : null));\n    }\n});\nexports.default = DataGrid;\n\n/***/ }),\n/* 1555 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _wizard = __webpack_require__(1556);\n\nvar _wizard2 = _interopRequireDefault(_wizard);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportVisibility = (0, _createReactClass2.default)({\n    displayName: 'ReportVisibility',\n\n    propTypes: {\n        hidden: _propTypes2.default.bool.isRequired\n    },\n    render: function render() {\n        var hidden = this.props.hidden;\n        var visibiltyClass = hidden ? 'icon-team-1' : 'icon-public-1';\n        var visibilityHint = hidden ? 'Visible only to my organization' : 'Visible to the public';\n        return _react2.default.createElement(\"span\", { className: visibiltyClass, \"data-hint\": visibilityHint, \"data-hint-align\": \"right\", \"data-hint-position\": \"bottom\" });\n    }\n});\nvar ReportPanelItem = (0, _createReactClass2.default)({\n    displayName: 'ReportPanelItem',\n\n    propTypes: {\n        report: _propTypes2.default.object.isRequired,\n        href: _propTypes2.default.string.isRequired,\n        selected: _propTypes2.default.bool,\n        isOtherEntity: _propTypes2.default.bool,\n        isDefault: _propTypes2.default.bool\n    },\n    render: function render() {\n        var report = this.props.report;\n        var itemClasses = (0, _classnames2.default)({\n            'report-menu__item': true,\n            'is-selected': !!this.props.selected\n        });\n        var productIconClass = 'report-menu__item__type icon-px-' + report.get('technical_name') + '-1';\n        return _react2.default.createElement(\"a\", { onClick: this.props.onClick, href: this.props.href, className: itemClasses }, _react2.default.createElement(\"div\", { className: \"report-menu__item__title\" }, _react2.default.createElement(\"span\", { className: productIconClass }), _react2.default.createElement(\"h3\", null, report.get('name')), !this.props.isOtherEntity ? _react2.default.createElement(\"div\", { className: \"report-menu__actions\" }, _react2.default.createElement(ReportVisibility, { hidden: report.get('hidden') })) : null), report.has('description') ? _react2.default.createElement(\"small\", null, report.get('description')) : null);\n    },\n    handleSettings: function handleSettings(e) {\n        e.stopPropagation();\n        this.props.report.editSettings();\n    }\n});\nvar ReportPanelList = (0, _createReactClass2.default)({\n    displayName: 'ReportPanelList',\n\n    propTypes: {\n        reports: _propTypes2.default.object,\n        entity: _propTypes2.default.object.isRequired,\n        entityDefaultReportId: _propTypes2.default.any,\n        isOtherEntity: _propTypes2.default.bool,\n        onClose: _propTypes2.default.func\n    },\n    render: function render() {\n        if (this.props.reports.isEmpty()) {\n            return _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No reports available to view.\"));\n        }\n        return _react2.default.createElement(\"nav\", { className: \"report-menu\" }, this.props.reports.map(function (report) {\n            return _react2.default.createElement(ReportPanelItem, { key: report.id, report: report, selected: this.props.selectedReportId === report.id, isDefault: report.id === this.props.entityDefaultReportId, href: '#/' + this.props.entity.id + '/reports/' + report.id, isOtherEntity: this.props.isOtherEntity, onClick: this.props.onClose, onMakeDefault: this.props.onMakeDefaultReport });\n        }, this));\n    }\n});\nvar ReportsTab = (0, _createReactClass2.default)({\n    displayName: 'ReportsTab',\n\n    propTypes: {\n        entity: _propTypes2.default.object.isRequired,\n        reports: _propTypes2.default.object\n    },\n    render: function render() {\n        var entity = this.props.entity;\n        var entityDefaultReportId = this.props.reportEntity.get('default_report_id');\n        return _react2.default.createElement(\"div\", null, !this.isOtherEntity() && this.props.session.can('create', 'report') ? _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"a\", { id: \"wd-create-report-button\", className: \"ui-button primary\", href: '#' + entity.id + '/reports/new' }, \"Create new\"))) : null, _react2.default.createElement(\"div\", { className: \"ui-panel__content ui-container_scroll\" }, this.props.reports ? _react2.default.createElement(ReportPanelList, { entity: entity, reports: this.props.reports, selectedReportId: _lodash2.default.result(this.props.selectedReport, 'id'), entityDefaultReportId: entityDefaultReportId, isOtherEntity: this.isOtherEntity(), onMakeDefaultReport: this.props.onMakeDefaultReport, onClose: this.props.onClose }) : _react2.default.createElement(\"div\", { className: \"ui-loading\" })), this.isOtherEntity() ? _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: this.props.onClickAllEntities }, _react2.default.createElement(\"span\", { className: \"icon-left-1\" }), \"All Entities\")) : null);\n    },\n    isOtherEntity: function isOtherEntity() {\n        return this.props.entity !== this.props.reportEntity;\n    }\n});\nexports.default = (0, _createReactClass2.default)({\n    displayName: 'report_panel',\n    render: function render() {\n        if (!this.props.isOpen) {\n            return _react2.default.createElement(\"div\", null);\n        }\n        return _react2.default.createElement(\"div\", { className: \"ui-panel__wrapper\", onClick: this.handleWrapperClick }, _react2.default.createElement(\"div\", { className: \"report-panel ui-panel wide\", onClick: this.handleRootClick }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, \"Reports\"), _react2.default.createElement(\"span\", { className: \"ui-panel__close\", onClick: this.props.onClose })), _react2.default.createElement(ReportsTab, { reports: this.props.reports, entity: this.props.entity, reportEntity: this.props.entity, session: this.props.session, selectedReport: this.props.selectedReport, onClose: this.props.onClose, onMakeDefaultReport: this.props.onMakeDefaultReport })), this.props.editReport ? _react2.default.createElement(_wizard2.default, { session: this.props.session, flowKey: this.props.flowKey, entity: this.props.entity, report: this.props.editReport, onComplete: this.props.onWizardComplete, onClose: this.props.onClose, onClick: this.handleRootClick }) : null);\n    },\n    getInitialState: function getInitialState() {\n        return {\n            tab: 'reports'\n        };\n    },\n    handleTabClick: function handleTabClick(tab) {\n        this.setState({\n            tab: tab\n        });\n    },\n    handleWrapperClick: function handleWrapperClick() {\n        if (!this.clicked && this.props.onClose) {\n            this.props.onClose();\n        }\n        this.clicked = false;\n    },\n    handleRootClick: function handleRootClick() {\n        this.clicked = true;\n    }\n});\n\n/***/ }),\n/* 1556 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactTransitionGroup = __webpack_require__(139);\n\nvar _css_transition_defaults = __webpack_require__(184);\n\nvar _css_transition_defaults2 = _interopRequireDefault(_css_transition_defaults);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _report_creation_flow = __webpack_require__(1557);\n\nvar _report_creation_flow2 = _interopRequireDefault(_report_creation_flow);\n\nvar _report_edit_flow = __webpack_require__(1569);\n\nvar _report_edit_flow2 = _interopRequireDefault(_report_edit_flow);\n\nvar _report_linking_flow = __webpack_require__(1570);\n\nvar _report_linking_flow2 = _interopRequireDefault(_report_linking_flow);\n\nvar _event_observer_mixin = __webpack_require__(141);\n\nvar _event_observer_mixin2 = _interopRequireDefault(_event_observer_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//Maps from flowKey prop to a machina.Fsm flow definition\nvar flowMap = {\n    NewReport: _report_creation_flow2.default,\n    EditDatasets: _report_edit_flow2.default,\n    LinkGridReport: _report_linking_flow2.default\n};\n\nvar ReportWizard = (0, _createReactClass2.default)({\n    displayName: 'ReportWizard',\n\n    mixins: [_event_observer_mixin2.default],\n    propTypes: {\n        report: _propTypes2.default.object.isRequired,\n        entity: _propTypes2.default.object.isRequired,\n        flow: _propTypes2.default.func,\n        flowKey: _propTypes2.default.oneOf(Object.keys(flowMap)),\n        onCancel: _propTypes2.default.func,\n        onClose: _propTypes2.default.func\n    },\n    getInitialState: function getInitialState() {\n        return {\n            history: [],\n            saving: false\n        };\n    },\n    componentWillMount: function componentWillMount() {\n        var ReportFlow = this.props.flow || flowMap[this.props.flowKey];\n        this.originalReport = this.props.report;\n        var role = !!this.props.session && this.props.session.get('role');\n        var hasCOASelectionRights = !!role && (role.name === 'opengov_admin' || role.name === 'opengov_tsd');\n        this.stateMachine = new ReportFlow({\n            entity: this.props.entity,\n            report: this.originalReport,\n            showCOASelection: hasCOASelectionRights,\n            eventListeners: {\n                transition: [this.handleStateTransition],\n                complete: [this.props.onComplete],\n                close: [this.props.onClose]\n            }\n        });\n        this.listenToProp('report', 'error', this.handleReportError);\n        this.listenToProp('report', 'request sync error', this.toggleSaving);\n    },\n    componentWillUnmount: function componentWillUnmount() {\n        this.props.onClose();\n    },\n    render: function render() {\n        var stepComponent = this.stateMachine.getStateComponent();\n        this.modifiedReport = this.originalReport.clone();\n        //Pass clone of report model to wizard step components that modify the existing report (these steps only exist in ReportEditFlow)\n        //this.handleNext() will provide the stateMachine with both versions where it can decide how to update the original model and persist the updates\n        var report = this.props.report.isNew() ? this.originalReport : this.modifiedReport;\n        if (stepComponent) {\n            stepComponent = _react2.default.cloneElement(stepComponent, {\n                report: report,\n                entity: this.props.entity,\n                errors: this.state.errors,\n                saving: this.state.saving,\n                canGoBack: this.state.history.length > 1,\n                onNextStep: this.handleNext,\n                onPrevStep: this.handlePrev,\n                onCancel: this.props.onClose\n            });\n        }\n        var displayName = report && report.get('display_name');\n        var heading = this.props.flowKey === 'NewReport' ? _react2.default.createElement(\"span\", null, \"New Report \", displayName ? _react2.default.createElement(\"span\", { className: \"icon-righthead-3\" }, displayName) : null) : _react2.default.createElement(\"span\", null, _react2.default.createElement(\"span\", { className: \"icon-settings-1\" }), \" Settings\");\n        return _react2.default.createElement(_reactTransitionGroup.CSSTransitionGroup, Object.assign({ transitionName: \"ui-panel\" }, _css_transition_defaults2.default), _react2.default.createElement(\"div\", { className: \"report-wizard-panel ui-panel\", onClick: this.props.onClick }, _react2.default.createElement(\"header\", { className: \"ui-panel__header\" }, _react2.default.createElement(\"h3\", null, heading), _react2.default.createElement(\"div\", { className: \"ui-panel__close\", onClick: this.props.onClose })), stepComponent));\n    },\n    handleStateTransition: function handleStateTransition(transition) {\n        var nextHistory = void 0;\n        if (transition.toState === _lodash2.default.last(this.state.history)) {\n            // Going back in history to the previous step.\n            nextHistory = this.state.history.slice(0, -1);\n        } else if (transition.fromState) {\n            // Moving forward to the next step.\n            nextHistory = this.state.history.concat(transition.fromState);\n        }\n        if (nextHistory) {\n            this.setState({\n                history: nextHistory\n            });\n        }\n    },\n    handleComponentSetProps: function handleComponentSetProps(nextProps) {\n        this.setState({\n            stepComponentProps: nextProps\n        });\n    },\n    handleNext: function handleNext() {\n        this.stateMachine.handle('next', this.originalReport, this.modifiedReport);\n    },\n    handlePrev: function handlePrev() {\n        var prevState = _lodash2.default.last(this.state.history);\n        this.stateMachine.transition(prevState);\n    },\n    handleReportError: function handleReportError(model, response) {\n        if (response.status === 422) {\n            var err = model.parseError(response);\n            this.stateMachine.handle('error', err);\n            this.setState({\n                errors: err.errors\n            });\n        } else {\n            var message = _lodash2.default.result(response.responseJSON, 'message');\n            Ovid.Alert.open({\n                title: 'There was an error while saving the report.',\n                content: _react2.default.createElement(\"p\", null, message || 'Please try again and if you continue having issues contact our support team.')\n            });\n        }\n    },\n    toggleSaving: function toggleSaving() {\n        this.setState({ saving: !this.state.saving });\n    }\n});\nexports.default = ReportWizard;\n\n/***/ }),\n/* 1557 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _base_report_flow = __webpack_require__(322);\n\nvar _base_report_flow2 = _interopRequireDefault(_base_report_flow);\n\nvar _start = __webpack_require__(323);\n\nvar _start2 = _interopRequireDefault(_start);\n\nvar _report_type = __webpack_require__(1559);\n\nvar _report_type2 = _interopRequireDefault(_report_type);\n\nvar _ledger_types = __webpack_require__(1560);\n\nvar _ledger_types2 = _interopRequireDefault(_ledger_types);\n\nvar _gl_data_sets = __webpack_require__(681);\n\nvar _gl_data_sets2 = _interopRequireDefault(_gl_data_sets);\n\nvar _coa = __webpack_require__(1562);\n\nvar _coa2 = _interopRequireDefault(_coa);\n\nvar _tx_data_sets = __webpack_require__(682);\n\nvar _tx_data_sets2 = _interopRequireDefault(_tx_data_sets);\n\nvar _report_name = __webpack_require__(1563);\n\nvar _report_name2 = _interopRequireDefault(_report_name);\n\nvar _report_created = __webpack_require__(1564);\n\nvar _report_created2 = _interopRequireDefault(_report_created);\n\nvar _no_data = __webpack_require__(1565);\n\nvar _no_data2 = _interopRequireDefault(_no_data);\n\nvar _report_creation_utils = __webpack_require__(1566);\n\nvar _intercom_utils = __webpack_require__(121);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction chooseLedgerTypes() {\n    if (this.report.get('technical_name') === 'balance') {\n        this.report.get('properties').ledger_types = { 'Assets': true, 'Liabilities & Equities': true };\n        this.transition('ChooseLedgerDataSets');\n    } else {\n        this.transition('ChooseLedgerTypes');\n    }\n}\nvar ReportCreationFlow = _base_report_flow2.default.extend({\n    initialState: 'Start',\n    validateFlow: function validateFlow(flow) {\n        return this === flow;\n    },\n    loadReportTypes: function loadReportTypes() {\n        return (0, _report_creation_utils.fetchReportTypes)(this);\n    },\n    loadDataSets: function loadDataSets() {\n        return (0, _report_creation_utils.fetchDataSets)(this);\n    },\n    onDataSetsLoaded: function onDataSetsLoaded() {\n        this.chartOfAccountsIds = this.ledgerDataSets.getChartOfAccountsIds();\n        this.reportTypes.forEach(function (type) {\n            var disabled = void 0;\n            if (type.get('technical_name') === 'grid') {\n                if (this.failedDataSetRequests.transactions) {\n                    disabled = 'Grid report creation is not available right now.';\n                } else if (this.transactionDataSets.length < 1) {\n                    disabled = 'No transaction data sets uploaded.';\n                }\n            } else {\n                if (this.failedDataSetRequests.ledger) {\n                    disabled = 'Summary report creation is not available right now.';\n                } else if (this.ledgerDataSets.isEmpty()) {\n                    disabled = 'No general ledger data sets uploaded.';\n                }\n            }\n            type.set('disabled', disabled);\n        }, this);\n        this.handle('dataSetsLoaded');\n    },\n\n    states: {\n        Start: {\n            _component: function _component() {\n                return _react2.default.createElement(_start2.default, null);\n            },\n            _onEnter: function _onEnter() {\n                var _this = this;\n\n                _jquery2.default.when(this.loadReportTypes(), this.loadDataSets()).then(function () {\n                    return _this.onDataSetsLoaded();\n                });\n            },\n            dataSetsLoaded: function dataSetsLoaded() {\n                if (!this.ledgerDataSets.isEmpty() || this.transactionDataSets && this.transactionDataSets.length > 0) {\n                    this.transition('ChooseReportType');\n                } else {\n                    this.transition('NoData');\n                }\n            }\n        },\n        NoData: {\n            _component: function _component() {\n                return _react2.default.createElement(_no_data2.default, null);\n            }\n        },\n        ChooseReportType: {\n            _component: function _component() {\n                return _react2.default.createElement(_report_type2.default, { isFirstStep: true, reportTypes: this.reportTypes.toJSON() });\n            },\n            next: function next(report) {\n                if (report.get('technical_name') === 'grid') {\n                    this.transition('ChooseTransactionDataSet');\n                } else if (this.showCOASelection && this.chartOfAccountsIds.length > 1) {\n                    this.transition('ChooseChartOfAccounts');\n                } else {\n                    report.set('coa_id', this.entity.attributes.default_coa_id);\n                    chooseLedgerTypes.bind(this)();\n                }\n            }\n        },\n        ChooseChartOfAccounts: {\n            _component: function _component() {\n                return _react2.default.createElement(_coa2.default, null);\n            },\n            next: function next() {\n                chooseLedgerTypes.bind(this)();\n            }\n        },\n        ChooseLedgerTypes: {\n            _component: function _component() {\n                return _react2.default.createElement(_ledger_types2.default, null);\n            },\n            next: function next() {\n                this.transition('ChooseLedgerDataSets');\n            }\n        },\n        ChooseLedgerDataSets: {\n            _component: function _component() {\n                var dataSets = _lodash2.default.filter(this.ledgerDataSets.toJSON(), { coa_id: this.report.get('coa_id') });\n                return _react2.default.createElement(_gl_data_sets2.default, { dataSets: dataSets });\n            },\n            next: function next() {\n                this.transition('ReportDetails');\n            }\n        },\n        ChooseTransactionDataSet: {\n            _component: function _component() {\n                return _react2.default.createElement(_tx_data_sets2.default, null);\n            },\n            next: function next() {\n                this.transition('ReportDetails');\n            }\n        },\n        ReportDetails: {\n            _component: function _component() {\n                return _react2.default.createElement(_report_name2.default, { isLastStep: true });\n            },\n            next: function next() {\n                var _this2 = this;\n\n                this.report.save(null, {\n                    success: function success(response) {\n                        _this2.emit('complete');\n                        if (response && response.attributes) {\n                            var metadata = {\n                                name: response.attributes.name,\n                                coa_mask_id: response.attributes.coa_mask_id,\n                                visibility: response.attributes.visibility,\n                                reportType: response.attributes.report_type,\n                                entityId: response.attributes.entity_id\n                            };\n                            (0, _intercom_utils.trackIntercomEvent)('create-new-report', metadata);\n                        }\n                    }\n                });\n            },\n            error: function error(response) {\n                var reportType = this.report.get('technical_name');\n                var errors = response.errors || {};\n                if (reportType === 'grid') {\n                    if (errors.coa) {\n                        this.transition('ChooseTransactionDataSet');\n                    }\n                } else {\n                    if (errors.data_sets) {\n                        this.transition('ChooseLedgerDataSets');\n                    } else if (errors.coa) {\n                        this.report.unset('coa_id');\n                        this.transition('ChooseChartOfAccounts');\n                    }\n                }\n            }\n        },\n        ReportCreated: {\n            _component: function _component() {\n                return _react2.default.createElement(_report_created2.default, null);\n            }\n        }\n    }\n});\nexports.default = ReportCreationFlow;\n\n/***/ }),\n/* 1558 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * machina - A library for creating powerful and flexible finite state machines.  Loosely inspired by Erlang/OTP's gen_fsm behavior.\n * Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)\n * Version: v0.3.8\n * Url: http://machina-js.org/\n * License(s): MIT, GPL\n */\n\n(function (root, factory) {\n    if (typeof module === \"object\" && module.exports) {\n        // Node, or CommonJS-Like environments\n        module.exports = function (_) {\n            _ = _ || __webpack_require__(679);\n            return factory(_);\n        };\n    } else if (true) {\n        // AMD. Register as an anonymous module.\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(679)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (_) {\n            return factory(_, root);\n        }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    } else {\n        // Browser globals\n        root.machina = factory(root._, root);\n    }\n}(this, function (_, global, undefined) {\n    var slice = [].slice;\n    var NEXT_TRANSITION = \"transition\";\n    var NEXT_HANDLER = \"handler\";\n    var HANDLING = \"handling\";\n    var HANDLED = \"handled\";\n    var NO_HANDLER = \"nohandler\";\n    var TRANSITION = \"transition\";\n    var INVALID_STATE = \"invalidstate\";\n    var DEFERRED = \"deferred\";\n    var NEW_FSM = \"newfsm\";\n    var utils = {\n        makeFsmNamespace: (function () {\n            var machinaCount = 0;\n            return function () {\n                return \"fsm.\" + machinaCount++;\n            };\n        })(),\n        getDefaultOptions: function () {\n            return {\n                initialState: \"uninitialized\",\n                eventListeners: {\n                    \"*\": []\n                },\n                states: {},\n                eventQueue: [],\n                namespace: utils.makeFsmNamespace(),\n                targetReplayState: \"\",\n                state: undefined,\n                priorState: undefined,\n                _priorAction: \"\",\n                _currentAction: \"\"\n            };\n        }\n    };\n\n    if (!_.deepExtend) {\n        var behavior = {\n            \"*\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = sourcePropVal;\n            },\n            \"object\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = deepExtend({}, obj[sourcePropKey] || {}, sourcePropVal);\n            },\n            \"array\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = [];\n                _.each(sourcePropVal, function (item, idx) {\n                    behavior[getHandlerName(item)](obj[sourcePropKey], idx, item);\n                }, this);\n            }\n        },\n            getActualType = function (val) {\n                if (_.isArray(val)) {\n                    return \"array\";\n                }\n                if (_.isDate(val)) {\n                    return \"date\";\n                }\n                if (_.isRegExp(val)) {\n                    return \"regex\";\n                }\n                return typeof val;\n            },\n            getHandlerName = function (val) {\n                var propType = getActualType(val);\n                return behavior[propType] ? propType : \"*\";\n            },\n            deepExtend = function (obj) {\n                _.each(slice.call(arguments, 1), function (source) {\n                    _.each(source, function (sourcePropVal, sourcePropKey) {\n                        behavior[getHandlerName(sourcePropVal)](obj, sourcePropKey, sourcePropVal);\n                    });\n                });\n                return obj;\n            };\n\n        _.mixin({\n            deepExtend: deepExtend\n        });\n    }\n    var Fsm = function (options) {\n        _.extend(this, options);\n        _.defaults(this, utils.getDefaultOptions());\n        this.initialize.apply(this, arguments);\n        machina.emit(NEW_FSM, this);\n        if (this.initialState) {\n            this.transition(this.initialState);\n        }\n    };\n\n    _.extend(Fsm.prototype, {\n        initialize: function () {},\n        emit: function (eventName) {\n            var args = arguments;\n            if (this.eventListeners[\"*\"]) {\n                _.each(this.eventListeners[\"*\"], function (callback) {\n                    try {\n                        callback.apply(this, slice.call(args, 0));\n                    } catch (exception) {\n                        if (console && typeof console.log !== \"undefined\") {\n                            console.log(exception.toString());\n                        }\n                    }\n                }, this);\n            }\n            if (this.eventListeners[eventName]) {\n                _.each(this.eventListeners[eventName], function (callback) {\n                    try {\n                        callback.apply(this, slice.call(args, 1));\n                    } catch (exception) {\n                        if (console && typeof console.log !== \"undefined\") {\n                            console.log(exception.toString());\n                        }\n                    }\n                }, this);\n            }\n        },\n        handle: function (inputType) {\n            if (!this.inExitHandler) {\n                var states = this.states,\n                    current = this.state,\n                    args = slice.call(arguments, 0),\n                    handlerName, handler, catchAll, action;\n                this.currentActionArgs = args;\n                if (states[current][inputType] || states[current][\"*\"] || this[\"*\"]) {\n                    handlerName = states[current][inputType] ? inputType : \"*\";\n                    catchAll = handlerName === \"*\";\n                    if (states[current][handlerName]) {\n                        handler = states[current][handlerName];\n                        action = current + \".\" + handlerName;\n                    } else {\n                        handler = this[\"*\"];\n                        action = \"*\";\n                    }\n                    if (!this._currentAction) this._currentAction = action;\n                    this.emit.call(this, HANDLING, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                    if (_.isFunction(handler)) handler = handler.apply(this, catchAll ? args : args.slice(1));\n                    if (_.isString(handler)) this.transition(handler);\n                    this.emit.call(this, HANDLED, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                    this._priorAction = this._currentAction;\n                    this._currentAction = \"\";\n                    this.processQueue(NEXT_HANDLER);\n                } else {\n                    this.emit.call(this, NO_HANDLER, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                }\n                this.currentActionArgs = undefined;\n            }\n        },\n        transition: function (newState) {\n            if (!this.inExitHandler && newState !== this.state) {\n                var curState = this.state;\n                if (this.states[newState]) {\n                    if (curState && this.states[curState] && this.states[curState]._onExit) {\n                        this.inExitHandler = true;\n                        this.states[curState]._onExit.call(this);\n                        this.inExitHandler = false;\n                    }\n                    this.targetReplayState = newState;\n                    this.priorState = curState;\n                    this.state = newState;\n                    this.emit.call(this, TRANSITION, {\n                        fromState: this.priorState,\n                        action: this._currentAction,\n                        toState: newState\n                    });\n                    if (this.states[newState]._onEnter) {\n                        this.states[newState]._onEnter.call(this);\n                    }\n                    if (this.targetReplayState === newState) {\n                        this.processQueue(NEXT_TRANSITION);\n                    }\n                    return;\n                }\n                this.emit.call(this, INVALID_STATE, {\n                    state: this.state,\n                    attemptedState: newState\n                });\n            }\n        },\n        processQueue: function (type) {\n            var filterFn = type === NEXT_TRANSITION ?\n            function (item) {\n                return item.type === NEXT_TRANSITION && ((!item.untilState) || (item.untilState === this.state));\n            } : function (item) {\n                return item.type === NEXT_HANDLER;\n            };\n            var toProcess = _.filter(this.eventQueue, filterFn, this);\n            this.eventQueue = _.difference(this.eventQueue, toProcess);\n            _.each(toProcess, function (item) {\n                this.handle.apply(this, item.args);\n            }, this);\n        },\n        clearQueue: function (type, name) {\n            if (!type) {\n                this.eventQueue = [];\n            } else {\n                var filter;\n                if (type === NEXT_TRANSITION) {\n                    filter = function (evnt) {\n                        return (evnt.type === NEXT_TRANSITION && (name ? evnt.untilState === name : true));\n                    };\n                } else if (type === NEXT_HANDLER) {\n                    filter = function (evnt) {\n                        return evnt.type === NEXT_HANDLER;\n                    };\n                }\n                this.eventQueue = _.filter(this.eventQueue, filter);\n            }\n        },\n        deferUntilTransition: function (stateName) {\n            if (this.currentActionArgs) {\n                var queued = {\n                    type: NEXT_TRANSITION,\n                    untilState: stateName,\n                    args: this.currentActionArgs\n                };\n                this.eventQueue.push(queued);\n                this.emit.call(this, DEFERRED, {\n                    state: this.state,\n                    queuedArgs: queued\n                });\n            }\n        },\n        deferUntilNextHandler: function () {\n            if (this.currentActionArgs) {\n                var queued = {\n                    type: NEXT_HANDLER,\n                    args: this.currentActionArgs\n                };\n                this.eventQueue.push(queued);\n                this.emit.call(this, DEFERRED, {\n                    state: this.state,\n                    queuedArgs: queued\n                });\n            }\n        },\n        on: function (eventName, callback) {\n            var self = this;\n            if (!self.eventListeners[eventName]) {\n                self.eventListeners[eventName] = [];\n            }\n            self.eventListeners[eventName].push(callback);\n            return {\n                eventName: eventName,\n                callback: callback,\n                off: function () {\n                    self.off(eventName, callback);\n                }\n            };\n        },\n        off: function (eventName, callback) {\n            if (!eventName) {\n                this.eventListeners = {};\n            } else {\n                if (this.eventListeners[eventName]) {\n                    if (callback) {\n                        this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);\n                    } else {\n                        this.eventListeners[eventName] = [];\n                    }\n                }\n            }\n        }\n    });\n\n    Fsm.prototype.trigger = Fsm.prototype.emit;\n\n    // _machKeys are members we want to track across the prototype chain of an extended FSM constructor\n    // Since we want to eventually merge the aggregate of those values onto the instance so that FSMs\n    // that share the same extended prototype won't share state *on* those prototypes.\n    var _machKeys = [\"states\", \"initialState\"];\n    var inherits = function (parent, protoProps, staticProps) {\n        var fsm; // placeholder for instance constructor\n        var machObj = {}; // object used to hold initialState & states from prototype for instance-level merging\n        var ctor = function () {}; // placeholder ctor function used to insert level in prototype chain\n        // The constructor function for the new subclass is either defined by you\n        // (the \"constructor\" property in your `extend` definition), or defaulted\n        // by us to simply call the parent's constructor.\n        if (protoProps && protoProps.hasOwnProperty('constructor')) {\n            fsm = protoProps.constructor;\n        } else {\n            // The default machina constructor (when using inheritance) creates a\n            // deep copy of the states/initialState values from the prototype and\n            // extends them over the instance so that they'll be instance-level.\n            // If an options arg (args[0]) is passed in, a states or intialState\n            // value will be preferred over any data pulled up from the prototype.\n            fsm = function () {\n                var args = slice.call(arguments, 0);\n                args[0] = args[0] || {};\n                var blendedState;\n                var instanceStates = args[0].states || {};\n                blendedState = _.deepExtend(_.cloneDeep(machObj), {\n                    states: instanceStates\n                });\n                blendedState.initialState = args[0].initialState || this.initialState;\n                _.extend(args[0], blendedState);\n                parent.apply(this, args);\n            };\n        }\n\n        // Inherit class (static) properties from parent.\n        _.deepExtend(fsm, parent);\n\n        // Set the prototype chain to inherit from `parent`, without calling\n        // `parent`'s constructor function.\n        ctor.prototype = parent.prototype;\n        fsm.prototype = new ctor();\n\n        // Add prototype properties (instance properties) to the subclass,\n        // if supplied.\n        if (protoProps) {\n            _.extend(fsm.prototype, protoProps);\n            _.deepExtend(machObj, _.transform(protoProps, function (accum, val, key) {\n                if (_machKeys.indexOf(key) !== -1) {\n                    accum[key] = val;\n                }\n            }));\n        }\n\n        // Add static properties to the constructor function, if supplied.\n        if (staticProps) {\n            _.deepExtend(fsm, staticProps);\n        }\n\n        // Correctly set child's `prototype.constructor`.\n        fsm.prototype.constructor = fsm;\n\n        // Set a convenience property in case the parent's prototype is needed later.\n        fsm.__super__ = parent.prototype;\n\n        return fsm;\n    };\n\n    // The self-propagating extend function that Backbone classes use.\n    Fsm.extend = function (protoProps, classProps) {\n        var fsm = inherits(this, protoProps, classProps);\n        fsm.extend = this.extend;\n        return fsm;\n    };\n    var machina = {\n        Fsm: Fsm,\n        utils: utils,\n        on: function (eventName, callback) {\n            if (!this.eventListeners[eventName]) {\n                this.eventListeners[eventName] = [];\n            }\n            this.eventListeners[eventName].push(callback);\n            return callback;\n        },\n        off: function (eventName, callback) {\n            if (this.eventListeners[eventName]) {\n                this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);\n            }\n        },\n        trigger: function (eventName) {\n            var i = 0,\n                len, args = arguments,\n                listeners = this.eventListeners[eventName] || [];\n            if (listeners && listeners.length) {\n                _.each(listeners, function (callback) {\n                    callback.apply(null, slice.call(args, 1));\n                });\n            }\n        },\n        eventListeners: {\n            newFsm: []\n        }\n    };\n\n    machina.emit = machina.trigger;\n    return machina;\n}));\n\n/***/ }),\n/* 1559 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _classnames = __webpack_require__(7);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportTypeItem = (0, _createReactClass2.default)({\n    displayName: 'ReportTypeItem',\n\n    propTypes: {\n        reportType: _propTypes2.default.object.isRequired,\n        selected: _propTypes2.default.bool,\n        disabled: _propTypes2.default.bool,\n        tooltip: _propTypes2.default.string,\n        onSelect: _propTypes2.default.func\n    },\n    render: function render() {\n        var reportType = this.props.reportType;\n        var itemClasses = (0, _classnames2.default)({\n            'ui-select-list__item wd-report-type': true,\n            'is-selected': this.props.selected,\n            disabled: this.props.disabled\n        });\n        var iconClass = 'icon-px-' + this.props.reportType.technical_name + '-1';\n        return _react2.default.createElement(\"li\", null, _react2.default.createElement(\"a\", { className: itemClasses, onClick: this.handleClick, title: this.props.tooltip }, _react2.default.createElement(\"h3\", null, _react2.default.createElement(\"span\", { className: iconClass }), _react2.default.createElement(\"b\", { className: \"wd-report-type__name\" }, reportType.name)), _react2.default.createElement(\"small\", null, reportType.description)));\n    },\n    handleClick: function handleClick() {\n        if (!this.props.disabled && this.props.onSelect) {\n            this.props.onSelect(this.props.reportType);\n        }\n    }\n});\nvar ChooseReportType = (0, _createReactClass2.default)({\n    displayName: 'ChooseReportType',\n\n    mixins: [_wizard_step_mixin2.default],\n    propTypes: {\n        reportTypes: _propTypes2.default.array.isRequired,\n        report: _propTypes2.default.object.isRequired\n    },\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Select a report type\");\n    },\n    renderContent: function renderContent() {\n        var currentType = this.getSelectedType();\n        var reportTypes = _lodash2.default.filter(this.props.reportTypes, function (type) {\n            return _lodash2.default.isUndefined(type.disabled);\n        });\n        var reportTypeItems = reportTypes && _lodash2.default.sortBy(reportTypes, 'id').map(function (reportType) {\n            var selected = reportType.technical_name === currentType;\n            return _react2.default.createElement(ReportTypeItem, { key: reportType.id, reportType: reportType, selected: selected, disabled: !!reportType.disabled, tooltip: reportType.disabled, onSelect: this.handleSelect });\n        }, this);\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"p\", null, _react2.default.createElement(\"strong\", null, \"Looking for some inspiration on what you can build?\"), _react2.default.createElement(\"span\", null, \" Finance Directors across the country have built unique reports with OpenGov.\"), _react2.default.createElement(\"span\", null, \" \", _react2.default.createElement(\"a\", { href: \"https://opengov.zendesk.com/hc/en-us/articles/205335120-Unique-Reports-\", target: \"_blank\" }, \"Check them out in the Resource Center\")), \".\"), _react2.default.createElement(\"ul\", { className: \"ui-select-list\" }, reportTypeItems));\n    },\n    getSelectedType: function getSelectedType() {\n        return this.props.report.get('technical_name');\n    },\n    isValid: function isValid() {\n        return !!this.getSelectedType();\n    },\n    handleSelect: function handleSelect(reportType) {\n        this.props.report.set('technical_name', reportType.technical_name);\n        this.props.report.set('display_name', reportType.name);\n        this.nextStep();\n    }\n}); // this sucks but render gets defined in the WizardStep mixin and the type defs for mixins are bad so even that's casted to any\nexports.default = ChooseReportType;\n\n/***/ }),\n/* 1560 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _immutable = __webpack_require__(14);\n\nvar Immutable = _interopRequireWildcard(_immutable);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ChooseLedgerTypes = (0, _createReactClass2.default)({\n    displayName: 'ChooseLedgerTypes',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            ledgerTypes: Immutable.fromJS({\n                revenues: { title: 'Revenues', included: false },\n                expenses: { title: 'Expenses', included: false },\n                assets: { title: 'Assets', included: false },\n                liabilities: { title: 'Liabilities & Equities', included: false },\n                fteCount: { title: 'FTE Count', included: false }\n            })\n        };\n    },\n    isValid: function isValid() {\n        if (!this.state.ledgerTypes.some(function (ledger) {\n            return ledger.get('included');\n        })) {\n            return false;\n        }\n        var reportProps = this.props.report.get('properties');\n        reportProps.ledger_types = this.state.ledgerTypes.filter(function (ledgerType) {\n            return ledgerType.get('included');\n        }).keySeq().toJS();\n        return true;\n    },\n    _toggleLedgerType: function _toggleLedgerType(ledgerType) {\n        var ledgerTypes = this.state.ledgerTypes;\n\n        this.setState({\n            ledgerTypes: ledgerTypes.updateIn([ledgerType, 'included'], function (included) {\n                return !included;\n            })\n        });\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Choose ledger types to include in this report\");\n    },\n    renderContent: function renderContent() {\n        var _this = this;\n\n        var ledgerTypes = this.state.ledgerTypes;\n\n        return _react2.default.createElement(\"div\", null, ledgerTypes.entrySeq().map(function (_ref) {\n            var _ref2 = _slicedToArray(_ref, 2),\n                key = _ref2[0],\n                ledgerType = _ref2[1];\n\n            return _react2.default.createElement(LedgerTypeOption, { type: ledgerType, onChange: function onChange() {\n                    return _this._toggleLedgerType(key);\n                } });\n        }));\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nvar LedgerTypeOption = (0, _createReactClass2.default)({\n    displayName: 'LedgerTypeOption',\n    render: function render() {\n        return _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", { className: \"ui-form__checkbox-label\" }, _react2.default.createElement(\"input\", { type: \"checkbox\", checked: this.props.type.get('included'), onChange: this.props.onChange }), \" \", this.props.type.get('title')));\n    }\n});\nexports.default = ChooseLedgerTypes;\n\n/***/ }),\n/* 1561 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = checkDataSetSubSet;\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//check if all the coaDataSets are included in the reports dataset in order to evaluate selectAll checkbox status\nfunction checkDataSetSubSet(filteredDataSets, reportDataSets) {\n    var differenceDataSetsCounter = filteredDataSets.length;\n    if (differenceDataSetsCounter !== 0) {\n        _lodash2.default.forEach(filteredDataSets, function (coaDataSet) {\n            _lodash2.default.forEach(reportDataSets.models, function (dataSet) {\n                if (dataSet.id === coaDataSet.id) {\n                    differenceDataSetsCounter -= 1;\n                }\n            });\n        });\n    }\n    return differenceDataSetsCounter === 0 ? true : false;\n}\n\n/***/ }),\n/* 1562 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _chart_of_accounts = __webpack_require__(502);\n\nvar _chart_of_accounts2 = _interopRequireDefault(_chart_of_accounts);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Table = Ovid.Table;\n\nvar ChooseChartOfAccounts = (0, _createReactClass2.default)({\n    displayName: 'ChooseChartOfAccounts',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            charts: new _chart_of_accounts2.default(),\n            loading: true\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Select a Chart of Accounts\");\n    },\n    renderContent: function renderContent() {\n        var selectedChart = this.getSelectedChart();\n        // Sort the chart of accounts by most recently updated.\n        var charts = _lodash2.default.sortBy(this.state.charts, function (chart) {\n            return -Date.parse(chart.updated);\n        });\n        if (_lodash2.default.isEmpty(charts)) {\n            return _react2.default.createElement(\"h3\", null, \"No Charts.\");\n        }\n        var columns = [new Ovid.RadioColumn({\n            key: 'select',\n            selectedRow: selectedChart\n        }), { key: 'name', name: 'Name', sortable: false, formatter: function formatter(row, value) {\n                return value + ' ' + (row.is_default ? '(Default)' : '');\n            } }, { key: 'date_created', name: 'Created', sortable: false }, { key: 'date_updated', name: 'Last Updated', sortable: false }];\n        var coaErrors = _lodash2.default.result(this.props.errors, 'coa');\n        return _react2.default.createElement(\"div\", null, coaErrors ? _react2.default.createElement(\"div\", { className: \"ui-alert-box whoops\" }, _react2.default.createElement(\"span\", { className: \"icon-exclamation-1\" }), \" The Chart of Accounts you selected \", coaErrors[0], \".\") : null, _react2.default.createElement(\"p\", null, \"From the list of Chart of Accounts you've uploaded and configured, choose one for this report. Only Charts of Accounts with data sets associated with them appear in this list. Once the report is created, you won't be able to change which Chart of Accounts is associated with the report.\"), _react2.default.createElement(\"div\", { className: \"ui-card\" }, _react2.default.createElement(\"div\", { className: \"data-table__scroll-container\" }, _react2.default.createElement(Table, { columns: columns, rows: charts, onRowClick: this.handleSelect, layout: \"scale\" }))));\n    },\n    componentDidMount: function componentDidMount() {\n        var _this = this;\n\n        var charts = this.charts = new _chart_of_accounts2.default();\n        charts.fetch({\n            data: { entity_id: this.props.report.get('entity_id'), embed: 'ledger_data_set_ids' },\n            success: function success() {\n                var chartsWithDataSets = charts.filterWithDataSets();\n                _this.setState({\n                    charts: chartsWithDataSets.map(function (coa) {\n                        return coa.toJSON();\n                    }),\n                    loading: false\n                });\n            }\n        });\n    },\n    getSelectedChart: function getSelectedChart() {\n        return this.props.report.get('coa_id');\n    },\n    isValid: function isValid() {\n        return this.props.report.has('coa_id');\n    },\n    handleSelect: function handleSelect(chart) {\n        this.props.report.set('coa_id', chart.id);\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = ChooseChartOfAccounts;\n\n/***/ }),\n/* 1563 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Form = Ovid.Form;\nvar InputField = Ovid.InputField;\nvar TextArea = Ovid.TextArea;\n\nvar ChooseReportName = (0, _createReactClass2.default)({\n    displayName: 'ChooseReportName',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Report Information\");\n    },\n    renderContent: function renderContent() {\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(Form, { initialValues: this.props.report.attributes, errors: this.props.errors, onChange: this.handleFormChange, onSubmit: this.handleFormSubmit }, _react2.default.createElement(InputField, { name: \"name\", label: \"Report Name\", description: \"Report names can be as long as you like, however shorter titles are best for public reports. Long titles will automatically be truncated\", placeholder: \"Annual, for example\" }), _react2.default.createElement(TextArea, { name: \"description\", label: \"Description\", maxLength: 250, hint: \"You may include links to other resources in your report description\" })));\n    },\n    handleFormChange: function handleFormChange(fieldName, newValue) {\n        this.props.report.set(fieldName, newValue);\n    },\n    handleFormSubmit: function handleFormSubmit(event) {\n        event.preventDefault();\n        this.handleClickNext();\n    },\n    isValid: function isValid() {\n        return !_lodash2.default.isEmpty(this.props.report.get('name'));\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = ChooseReportName;\n\n/***/ }),\n/* 1564 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportCreated = (0, _createReactClass2.default)({\n    displayName: 'ReportCreated',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderContent: function renderContent() {\n        return _react2.default.createElement(\"div\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"New report successfully created!\"), \"Customize your new report by \", _react2.default.createElement(\"a\", { onClick: this.handleSettings }, \"configuring its settings\"), \".\");\n    },\n    renderFooter: function renderFooter() {\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.cancel }, \"Close\")));\n    },\n    isValid: function isValid() {\n        return true;\n    },\n    handleSettings: function handleSettings(e) {\n        e.preventDefault();\n        this.cancel();\n        this.props.report.trigger('action:editSettings');\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = ReportCreated;\n\n/***/ }),\n/* 1565 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NoData = (0, _createReactClass2.default)({\n    displayName: 'NoData',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderContent: function renderContent() {\n        var manageDataURL = 'data_manager/' + this.props.entity.id;\n        return _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No General Ledger or Transaction data sets uploaded to create a report.\"), \"Go to \", _react2.default.createElement(\"a\", { href: manageDataURL }, \"manage data\"), \" to upload a data set.\");\n    },\n    isValid: function isValid() {\n        return false;\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = NoData;\n\n/***/ }),\n/* 1566 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.fetchDataSets = exports.fetchReportTypes = undefined;\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _report_types = __webpack_require__(1567);\n\nvar _report_types2 = _interopRequireDefault(_report_types);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar fetchReportTypes = exports.fetchReportTypes = function fetchReportTypes(self) {\n    self.reportTypes = new _report_types2.default();\n    return self.reportTypes.fetch();\n};\nvar fetchDataSets = exports.fetchDataSets = function fetchDataSets(self) {\n    var defer = _jquery2.default.Deferred();\n    var pendingRequests = 2;\n    var failedRequests = self.failedDataSetRequests = {};\n    var onRequestCompleted = function onRequestCompleted() {\n        pendingRequests--;\n        if (!pendingRequests) {\n            defer.resolve();\n        }\n    };\n    self.loadLedgerDataSets().fail(function () {\n        failedRequests.ledger = true;\n    }).always(onRequestCompleted);\n    self.transactionDataSets = [];\n    self.loadTransactionDataSets().end().then(function (results) {\n        self.transactionDataSets = results.body.hasOwnProperty('data_sets') ? results.body.data_sets : [];\n    }).catch(function () {\n        failedRequests.transactions = true;\n    }).finally(onRequestCompleted);\n    return defer.promise();\n};\n\n/***/ }),\n/* 1567 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _report_type = __webpack_require__(1568);\n\nvar _report_type2 = _interopRequireDefault(_report_type);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Collection.extend({\n    url: '/api/v1/report_types',\n    model: _report_type2.default,\n    parse: function parse(resp) {\n        return resp.report_types;\n    }\n});\n\n/***/ }),\n/* 1568 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _backbone2.default.Model.extend({\n    urlRoot: '/api/v1/report_types'\n});\n\n/***/ }),\n/* 1569 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _base_report_flow = __webpack_require__(322);\n\nvar _base_report_flow2 = _interopRequireDefault(_base_report_flow);\n\nvar _start = __webpack_require__(323);\n\nvar _start2 = _interopRequireDefault(_start);\n\nvar _gl_data_sets = __webpack_require__(681);\n\nvar _gl_data_sets2 = _interopRequireDefault(_gl_data_sets);\n\nvar _tx_data_sets = __webpack_require__(682);\n\nvar _tx_data_sets2 = _interopRequireDefault(_tx_data_sets);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportEditFlow = _base_report_flow2.default.extend({\n    initialState: 'Start',\n    save: function save() {\n        var _this = this;\n\n        this.report.save(null, {\n            success: function success() {\n                _this.emit('complete');\n                _this.emit('close');\n            }\n        });\n    },\n\n    states: {\n        Start: {\n            _component: function _component() {\n                return _react2.default.createElement(_start2.default, null);\n            },\n            _onEnter: function _onEnter() {\n                var _this2 = this;\n\n                if (this.report.get('report_type') === 'grid') {\n                    this.transition('ChooseTransactionDataSet');\n                } else {\n                    this.loadLedgerDataSets().then(function () {\n                        _this2.transition('ChooseLedgerDataSets');\n                    });\n                }\n            }\n        },\n        ChooseLedgerDataSets: {\n            _component: function _component() {\n                return _react2.default.createElement(_gl_data_sets2.default, { isLastStep: true, dataSets: this.ledgerDataSets.toJSON() });\n            },\n            next: function next(original, modified) {\n                var _this3 = this;\n\n                var originalReport = original;\n                var originalDataSetIds = originalReport.dataSets.models.map(function (m) {\n                    return m.attributes.id;\n                });\n                var modifiedReport = modified;\n                var updatedDataSets = modifiedReport.dataSets.map(function (ds) {\n                    // Omit the original dataset name (on new datasets) so our default label logic kicks in\n                    // Otherwise the label in the chart will be incorrect.\n                    return originalDataSetIds.indexOf(ds.id) > -1 ? ds.toJSON() : _lodash2.default.omit(ds.toJSON(), 'name');\n                });\n                originalReport.dataSets.reset(updatedDataSets);\n                originalReport.save(null, {\n                    success: function success() {\n                        _this3.emit('complete');\n                        _this3.emit('close');\n                    }\n                });\n            }\n        },\n        ChooseTransactionDataSet: {\n            _component: function _component() {\n                return _react2.default.createElement(_tx_data_sets2.default, { isLastStep: true });\n            },\n            next: function next(originalReport, modifiedReport) {\n                var _this4 = this;\n\n                originalReport.set({\n                    transaction_id: modifiedReport.get('transaction_id'),\n                    coa_id: modifiedReport.get('coa_id'),\n                    properties: modifiedReport.get('properties')\n                });\n                originalReport.save(null, {\n                    success: function success() {\n                        _this4.emit('complete');\n                        _this4.emit('close');\n                    }\n                });\n            }\n        }\n    }\n});\nexports.default = ReportEditFlow;\n\n/***/ }),\n/* 1570 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _base_report_flow = __webpack_require__(322);\n\nvar _base_report_flow2 = _interopRequireDefault(_base_report_flow);\n\nvar _ajax_error = __webpack_require__(1571);\n\nvar _ajax_error2 = _interopRequireDefault(_ajax_error);\n\nvar _no_grid_reports = __webpack_require__(1572);\n\nvar _no_grid_reports2 = _interopRequireDefault(_no_grid_reports);\n\nvar _start = __webpack_require__(323);\n\nvar _start2 = _interopRequireDefault(_start);\n\nvar _embed_grid_report = __webpack_require__(1573);\n\nvar _embed_grid_report2 = _interopRequireDefault(_embed_grid_report);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportLinkFlow = _base_report_flow2.default.extend({\n    initialState: 'Start',\n    loadDataSets: function loadDataSets() {\n        var _this = this;\n\n        this.transactionDataSets = [];\n        this.loadTransactionDataSets().end().then(function (result) {\n            _this.transactionDataSets = result.body.hasOwnProperty('data_sets') ? result.body.data_sets : [];\n            _this.onDataSetsLoaded();\n        }).catch(function () {\n            _this.onDataSetsError();\n        });\n    },\n    onDataSetsLoaded: function onDataSetsLoaded() {\n        this.handle('loadDataSets:done');\n    },\n    onDataSetsError: function onDataSetsError() {\n        this.handle('loadDataSets:error');\n    },\n    save: function save() {\n        var _this2 = this;\n\n        this.report.save(null, {\n            success: function success() {\n                _this2.emit('complete');\n                _this2.emit('close');\n            }\n        });\n    },\n\n    states: {\n        Start: {\n            _component: function _component() {\n                return _react2.default.createElement(_start2.default, null);\n            },\n            _onEnter: function _onEnter() {\n                this.loadDataSets();\n            },\n\n            'loadDataSets:done': function loadDataSetsDone() {\n                if (this.transactionDataSets.length > 0) {\n                    this.transition('EmbedGridReport');\n                } else {\n                    this.transition('NotData');\n                }\n            },\n            'loadDataSets:error': function loadDataSetsError() {\n                this.transition('Error');\n            }\n        },\n        Error: {\n            _component: function _component() {\n                return _react2.default.createElement(_ajax_error2.default, { message: \"Error loading report data\" });\n            }\n        },\n        NotData: {\n            _component: function _component() {\n                return _react2.default.createElement(_no_grid_reports2.default, { entity: this.entity });\n            }\n        },\n        EmbedGridReport: {\n            _component: function _component() {\n                return _react2.default.createElement(_embed_grid_report2.default, { isLastStep: true, report: this.report, entity: this.entity });\n            },\n            next: function next(original, modified) {\n                var _this3 = this;\n\n                var originalReport = original;\n                var modifiedReport = modified;\n                if (modifiedReport.associatedReport) {\n                    originalReport.setAssocReport(modifiedReport.associatedReport);\n                } else {\n                    originalReport.unsetAssocReport();\n                }\n                originalReport.save(null, {\n                    success: function success() {\n                        _this3.emit('complete');\n                        _this3.emit('close');\n                    }\n                });\n            }\n        }\n    }\n});\nexports.default = ReportLinkFlow;\n\n/***/ }),\n/* 1571 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AjaxError = (0, _createReactClass2.default)({\n    displayName: 'AjaxError',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderContent: function renderContent() {\n        return _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, this.props.message));\n    },\n    renderFooter: function renderFooter() {\n        return _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost\", onClick: this.cancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: this.prevStep }, \"Retry\"));\n    },\n    isValid: function isValid() {\n        return true;\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = AjaxError;\n\n/***/ }),\n/* 1572 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NoData = (0, _createReactClass2.default)({\n    displayName: 'NoData',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: false\n        };\n    },\n    renderContent: function renderContent() {\n        return _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No available grid reports\"), \"Create a new grid report before using this feature.\");\n    },\n    isValid: function isValid() {\n        return false;\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = NoData;\n\n/***/ }),\n/* 1573 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _wizard_step_mixin = __webpack_require__(56);\n\nvar _wizard_step_mixin2 = _interopRequireDefault(_wizard_step_mixin);\n\nvar _reports = __webpack_require__(140);\n\nvar _reports2 = _interopRequireDefault(_reports);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Table = Ovid.Table;\nvar Alert = Ovid.Alert;\n\nvar LinkGridReports = (0, _createReactClass2.default)({\n    displayName: 'LinkGridReports',\n\n    mixins: [_wizard_step_mixin2.default],\n    getInitialState: function getInitialState() {\n        return {\n            loading: true,\n            sortBy: 'name'\n        };\n    },\n    renderHeader: function renderHeader() {\n        return _react2.default.createElement(\"h4\", null, \"Link Transaction Report\");\n    },\n    renderContent: function renderContent() {\n        var availableReports = _lodash2.default.sortBy(this.state.availableReports, this.state.sortBy);\n        availableReports.push({\n            id: 'none',\n            name: 'No linked report'\n        });\n        if (this.state.sortAsc) {\n            availableReports.reverse();\n        }\n        var assocReportID = _lodash2.default.get(this.props.report.associatedReport, 'id', 'none');\n        if (_lodash2.default.isEmpty(availableReports)) {\n            return _react2.default.createElement(\"p\", { className: \"ui-null\" }, _react2.default.createElement(\"strong\", null, \"No available grid reports\"), \"Create a new grid report using the\", _react2.default.createElement(\"a\", { onClick: this.navigateNewReport }, \" new report wizard\"), \"before using this feature.\");\n        }\n        var columns = [new Ovid.RadioColumn({\n            key: 'select',\n            selectedRow: assocReportID,\n            onSelect: this.handleSelect\n        }), { key: 'name', name: 'Name' }, { key: 'visibility', name: 'Visibility' }];\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"p\", null, \"Select a transaction report to be associated with the current one.  It will be accessible as a tab next to the Summary tab at the bottom of this report.\"), _react2.default.createElement(\"p\", null, \"Links to private reports will only be available for your organization's users.\"), _react2.default.createElement(\"br\", null), _react2.default.createElement(\"div\", { className: \"ui-card overflow-auto\" }, _react2.default.createElement(Table, { columns: columns, rows: availableReports, onSort: this.handleSort, sortBy: this.state.sortBy, sortAsc: this.state.sortAsc, layout: \"scale\" })));\n    },\n    renderFooter: function renderFooter() {\n        return _react2.default.createElement(\"div\", null, this.props.canGoBack ? _react2.default.createElement(\"button\", { className: \"ui-button pull-left\", onClick: this.prevStep }, _react2.default.createElement(\"span\", { className: \"icon-left-1\" }), \"Back\") : null, this.renderActions());\n    },\n    navigateNewReport: function navigateNewReport(e) {\n        e.preventDefault();\n        window.location.hash = '#/' + this.props.entity.get('subdomain') + '/reports/new';\n        Alert.close();\n    },\n    componentDidMount: function componentDidMount() {\n        var _this = this;\n\n        var report = this.props.report;\n        var reports = this.availableReports = new _reports2.default();\n        reports.fetch({\n            data: { entity_id: report.get('entity_id') },\n            success: function success() {\n                _this.setState({\n                    availableReports: (0, _lodash2.default)(reports.toJSON()).filter(function (r) {\n                        console.log('r', r);\n                        return r.report_type === 'grid' && r.coa_id === report.get('coa_id');\n                    }).map(function (r) {\n                        r.visibility = r.hidden ? 'Private' : 'Public';\n                        return r;\n                    }).value(),\n                    loading: false\n                });\n            }\n        });\n    },\n    isValid: function isValid() {\n        return true;\n    },\n    handleSort: function handleSort(sortBy, ascending) {\n        this.setState({ sortBy: sortBy, sortAsc: ascending });\n    },\n    handleSearchChange: function handleSearchChange(items) {\n        this.setState({ filteredReports: items });\n    },\n    handleSelect: function handleSelect(r) {\n        if (r.id === 'none') {\n            this.props.report.unsetAssocReport();\n        } else {\n            this.props.report.setAssocReport(this.availableReports.get(r.id), { silent: true });\n        }\n        this.forceUpdate();\n    }\n}); // TODO again, this any cast here is because the WizardStep defines render, not the component\nexports.default = LinkGridReports;\n\n/***/ }),\n/* 1574 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PasswordModal = function (_React$Component) {\n    _inherits(PasswordModal, _React$Component);\n\n    function PasswordModal() {\n        _classCallCheck(this, PasswordModal);\n\n        var _this = _possibleConstructorReturn(this, (PasswordModal.__proto__ || Object.getPrototypeOf(PasswordModal)).apply(this, arguments));\n\n        _this.state = {\n            password: '',\n            showError: false\n        };\n        _this.onClose = function () {\n            _this.props.onClose();\n        };\n        _this.onSubmit = function () {\n            var password = _this.state.password;\n\n            if (_this.props.accessCode !== password) {\n                _this.setState({ showError: true });\n            } else {\n                _this.props.onSubmit(_this.state.password);\n            }\n        };\n        _this.handlePasswordChange = function (e) {\n            _this.setState({ password: e.target.value });\n        };\n        return _this;\n    }\n\n    _createClass(PasswordModal, [{\n        key: 'render',\n        value: function render() {\n            var _state = this.state,\n                password = _state.password,\n                showError = _state.showError;\n\n            return _react2.default.createElement(\"div\", { className: \"alert__overlay open ready\", id: \"overlay-modal_password\" }, _react2.default.createElement(\"div\", { className: \"alert_full\" }, _react2.default.createElement(\"div\", { className: \"alert__close-btn\" }, _react2.default.createElement(\"a\", { onClick: this.onClose, href: \"/\", className: \"fonticon icon-remove-3\" })), _react2.default.createElement(\"div\", { className: \"alert__inner\" }, _react2.default.createElement(\"div\", { className: \"alert__inner__text\" }, \"Limited Access: Password Required\"), showError && _react2.default.createElement(\"div\", { className: \"alert__inner__subtext\" }, \"Password does not match\"), _react2.default.createElement(\"div\", { className: \"alert__inner__password-wrapper\" }, _react2.default.createElement(\"label\", { className: \"alert__inner__password-label\", htmlFor: \"password-form__input\" }, \"Password:\"), _react2.default.createElement(\"input\", { className: \"alert__inner__password-input\", value: password, onChange: this.handlePasswordChange, type: \"password\", name: \"password\", placeholder: \"•••••••\", autoFocus: true }), _react2.default.createElement(\"button\", { className: \"ui-button alert__inner__password-submit\", onClick: this.onSubmit }, \"Submit\")))));\n        }\n    }]);\n\n    return PasswordModal;\n}(_react2.default.Component);\n\nexports.default = PasswordModal;\n\n/***/ }),\n/* 1575 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = (0, _createReactClass2.default)({\n    displayName: 'editor_footer',\n    render: function render() {\n        return _react2.default.createElement(\"footer\", { className: \"editor-footer ui-flex ui-align-items-center\" }, _react2.default.createElement(\"div\", { className: \"ui-flex-1\" }, _react2.default.createElement(\"strong\", null, \"Configuring the report's default state.\"), \" \", this.props.subMessage), _react2.default.createElement(\"div\", { className: \"editor-footer__actions ui-justify-content-end\" }, _react2.default.createElement(\"button\", { className: \"ui-button ghost\", onClick: this.props.onCancel }, \"Cancel\"), _react2.default.createElement(\"button\", { className: \"ui-button primary\", onClick: this.props.onSave }, \"Save Report\")));\n    }\n});\n\n/***/ }),\n/* 1576 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nexports.default = function (text, response) {\n    var responseJSON = response.responseJSON;\n\n    Ovid.Alert.open({\n        title: text,\n        content: _react2.default.createElement(\"p\", null, responseJSON && responseJSON.message || unexpectedErrorMessage)\n    });\n    Raven.captureException(new Error(text), { extra: {\n            responseText: response.responseText,\n            status: response.status,\n            statusText: response.statusText,\n            statusCode: response.statusCode(),\n            responseJSON: responseJSON\n        } });\n};\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar unexpectedErrorMessage = _react2.default.createElement(\"span\", null, \"An unexpected error occurred. Please try again. If the problem persists contact us at\", _react2.default.createElement(\"a\", { href: \"mailto:support@opengov.com\" }, \"support@opengov.com\"));\n\n;\n\n/***/ }),\n/* 1577 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = __webpack_require__(28);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _mixin = __webpack_require__(268);\n\nvar _mixin2 = _interopRequireDefault(_mixin);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _session_store = __webpack_require__(61);\n\nvar _session_store2 = _interopRequireDefault(_session_store);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _settings_panel_store = __webpack_require__(680);\n\nvar _settings_panel_store2 = _interopRequireDefault(_settings_panel_store);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _settings_category_list = __webpack_require__(1578);\n\nvar _settings_category_list2 = _interopRequireDefault(_settings_category_list);\n\nvar _settings_category_item = __webpack_require__(1580);\n\nvar _settings_category_item2 = _interopRequireDefault(_settings_category_item);\n\nvar _settings_category_panel = __webpack_require__(1581);\n\nvar _settings_category_panel2 = _interopRequireDefault(_settings_category_panel);\n\nvar _general_settings = __webpack_require__(1582);\n\nvar _general_settings2 = _interopRequireDefault(_general_settings);\n\nvar _view_settings = __webpack_require__(1584);\n\nvar _view_settings2 = _interopRequireDefault(_view_settings);\n\nvar _default_configuration = __webpack_require__(1587);\n\nvar _default_configuration2 = _interopRequireDefault(_default_configuration);\n\nvar _current_year_settings = __webpack_require__(1589);\n\nvar _current_year_settings2 = _interopRequireDefault(_current_year_settings);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ReportSettingsPanel = (0, _createReactClass2.default)({\n    displayName: 'ReportSettingsPanel',\n\n    propTypes: {\n        isControlPanel: _propTypes2.default.bool,\n        entity: _propTypes2.default.object.isRequired,\n        session: _propTypes2.default.object,\n        scalePerCapitaEnabled: _propTypes2.default.bool\n    },\n    mixins: [(0, _og_flux.StoreListener)(_settings_panel_store2.default, _report_view_store2.default, _session_store2.default, _summary_report_store2.default), _mixin2.default],\n    getInitialState: function getInitialState() {\n        return this._getStateFromStore();\n    },\n    storeDidUpdate: function storeDidUpdate() {\n        this.setState(this._getStateFromStore());\n    },\n    _getStateFromStore: function _getStateFromStore() {\n        var settingsPanelState = _settings_panel_store2.default.getState().toObject();\n        var summaryReportState = _summary_report_store2.default.getState();\n        var session = _session_store2.default.getSession();\n        var report = _settings_panel_store2.default.getState().get('updatedReport');\n        var athenaState = summaryReportState.get('athenaState');\n        var canDelete = session && report && report.get('abilities') && report.get('abilities').get('destroy');\n        return _lodash2.default.extend(settingsPanelState, {\n            amountUnit: _summary_report_store2.default.getAmountUnit(),\n            auditModeEnabled: _report_view_store2.default.getAuditModeEnabled(),\n            canDelete: canDelete,\n            canUpdate: session && report.getIn(['abilities', 'update']),\n            canUpdateMask: session && session.can('update', 'data_manager/coa_mask'),\n            canUpdateReportName: report.getIn(['abilities', 'update_name']),\n            currentYearAmount: summaryReportState.get('currentYearAmount'),\n            currentYearPeriod: summaryReportState.get('currentYearPeriod'),\n            hasChanges: _settings_panel_store2.default.isDirty(),\n            isControlPanel: this.props.isControlPanel,\n            isNetwork: this.props.isNetwork,\n            isEntityAdmin: session && _lodash2.default.result(session.get('role'), 'name') === 'entity_admin',\n            isOpengovAdmin: session && _lodash2.default.result(session.get('role'), 'name') === 'opengov_admin',\n            isOpengovTSD: session && _lodash2.default.result(session.get('role'), 'name') === 'opengov_tsd',\n            isTitleTooLong: _settings_panel_store2.default.isTitleTooLong(),\n            maskOptions: _report_view_store2.default.getMaskOptions(),\n            overlay: summaryReportState.get('overlay'),\n            highlighting: summaryReportState.get('highlighting') !== true ? false : summaryReportState.get('highlighting'),\n            highlightingVariance: summaryReportState.get('highlightingVariance'),\n            proration: summaryReportState.get('proration'),\n            projections: athenaState && athenaState.get('projections'),\n            projectionType: athenaState && athenaState.get('projectionType'),\n            sourceDatasets: athenaState && athenaState.get('report') && athenaState.get('report').get('source_datasets'),\n            reportType: report.get('report_type'),\n            scale: summaryReportState.get('scale'),\n            yAxisScale: summaryReportState.get('yAxisScale'),\n            scalePerCapitaEnabled: this.props.scalePerCapitalEnabled\n        });\n    },\n    _shouldShowLinkage: function _shouldShowLinkage() {\n        var isNotGrid = this.state.reportType !== 'grid';\n        var hasLinkageEnabled = _lodash2.default.includes(this.props.entity.get('feature_permissions'), 'transaction_linkage');\n        if (isNotGrid && this.state.canUpdate && hasLinkageEnabled) {\n            return true;\n        }\n        return false;\n    },\n    _onWrapperClick: function _onWrapperClick(e) {\n        // Close the settings panel when the user clicks outside it.\n        if (e.target === _reactDom2.default.findDOMNode(this)) {\n            _settings_panel_actions2.default.cancel();\n        }\n    },\n    _getCategories: function _getCategories() {\n        var _props = this.props,\n            isControlPanel = _props.isControlPanel,\n            isNetwork = _props.isNetwork;\n\n        var showReportSettings = isControlPanel && this.state.canUpdate;\n        var isYTDReport = this.state.reportType === 'ytd';\n        var isGridReport = this.state.reportType === 'grid';\n        return [_react2.default.createElement(_settings_category_item2.default, { title: \"General\", key: \"General\", description: \"Basic report settings, including description\", saveable: true, hidden: !showReportSettings, handler: _general_settings2.default }), _react2.default.createElement(_settings_category_item2.default, { title: \"Link transactional data\", key: \"Link transactional data\", description: \"Include transactional data in your report\", hidden: !this._shouldShowLinkage(), onClick: _report_actions2.default.openEditLinkage }), _react2.default.createElement(_settings_category_item2.default, { title: \"Monthly report options\", key: \"Monthly report options\", description: \"Fine-tune how monthly data is displayed\", hidden: !isYTDReport, handler: _current_year_settings2.default }), _react2.default.createElement(_settings_category_item2.default, { title: \"Presentation\", key: \"Presentation\", description: 'Control display of ' + (isControlPanel && !isNetwork && 'account codes and' || '') + ' per capita scaling', hidden: isGridReport, handler: _view_settings2.default }), _react2.default.createElement(_settings_category_item2.default, { title: \"Report data\", key: \"Report data\", description: \"Determine what data is included in this report\", hidden: !showReportSettings, onClick: _report_actions2.default.openEditData }), _react2.default.createElement(_settings_category_item2.default, { title: \"X-axis configuration\", key: \"X-axis configuration\", description: \"Refine the order and titles of data on the X-axis\", saveable: true, hidden: isGridReport || !showReportSettings, handler: _default_configuration2.default })];\n    },\n    render: function render() {\n        if (!this.state.isOpen) {\n            return null;\n        }\n        var entity = this.props.entity;\n\n        var categories = this._getCategories();\n        var visibleCategories = _lodash2.default.filter(categories, function (category) {\n            return !category.props.hidden;\n        });\n        var oneVisibleCategory = _lodash2.default.size(visibleCategories) === 1 && _lodash2.default.head(visibleCategories);\n        return _react2.default.createElement(\"div\", { className: \"ui-panel__wrapper settings__wrapper\", onClick: this._onWrapperClick }, _react2.default.createElement(_settings_category_list2.default, { oneVisibleCategory: oneVisibleCategory }, categories), _react2.default.createElement(_settings_category_panel2.default, Object.assign({}, this.state, { entity: entity, oneVisibleCategory: oneVisibleCategory })));\n    }\n});\nexports.default = ReportSettingsPanel;\n\n/***/ }),\n/* 1578 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _settings_panel_header = __webpack_require__(683);\n\nvar _settings_panel_header2 = _interopRequireDefault(_settings_panel_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SettingsCategoryList = function (_React$Component) {\n    _inherits(SettingsCategoryList, _React$Component);\n\n    function SettingsCategoryList() {\n        _classCallCheck(this, SettingsCategoryList);\n\n        return _possibleConstructorReturn(this, (SettingsCategoryList.__proto__ || Object.getPrototypeOf(SettingsCategoryList)).apply(this, arguments));\n    }\n\n    _createClass(SettingsCategoryList, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            var oneVisibleCategory = this.props.oneVisibleCategory;\n\n            if (oneVisibleCategory) {\n                _settings_panel_actions2.default.selectCategory({\n                    title: oneVisibleCategory.props.title,\n                    saveable: oneVisibleCategory.props.saveable,\n                    handler: oneVisibleCategory.props.handler\n                });\n            }\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"ui-panel\" }, _react2.default.createElement(_settings_panel_header2.default, null), _react2.default.createElement(\"div\", { className: \"ui-panel__content\" }, _react2.default.createElement(\"ul\", { className: \"ui-nav-list\" }, this.props.children)), _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: _settings_panel_actions2.default.cancel }, \"Cancel\"))));\n        }\n    }]);\n\n    return SettingsCategoryList;\n}(_react2.default.Component);\n\nexports.default = SettingsCategoryList;\n\n/***/ }),\n/* 1579 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AdditionalTitle = (0, _createReactClass2.default)({\n    displayName: 'AdditionalTitle',\n\n    propTypes: {\n        additionalHeadingText: _propTypes2.default.string,\n        additionalHeadingDescription: _propTypes2.default.string\n    },\n    render: function render() {\n        return _react2.default.createElement(\"span\", { className: \"ui-panel__header-additional\" }, _react2.default.createElement(\"span\", { className: \"icon-righthead-3\" }), this.props.additionalHeadingText, _react2.default.createElement(\"small\", null, \" (\", this.props.additionalHeadingDescription, \")\"));\n    }\n});\nvar SettingsPanelHeaderText = (0, _createReactClass2.default)({\n    displayName: 'SettingsPanelHeaderText',\n\n    propTypes: {\n        additionalHeadingText: _propTypes2.default.string,\n        additionalHeadingDescription: _propTypes2.default.string\n    },\n    render: function render() {\n        var additional = this.props.additionalHeadingText || this.props.additionalHeadingDescription ? _react2.default.createElement(AdditionalTitle, { additionalHeadingText: this.props.additionalHeadingText, additionalHeadingDescription: this.props.additionalHeadingDescription }) : null;\n        return _react2.default.createElement(\"h3\", null, _react2.default.createElement(\"span\", { className: \"icon-settings-1\" }), \" Settings \", additional);\n    }\n});\nexports.default = SettingsPanelHeaderText;\n\n/***/ }),\n/* 1580 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SettingsCategoryItem = function (_React$Component) {\n    _inherits(SettingsCategoryItem, _React$Component);\n\n    function SettingsCategoryItem() {\n        _classCallCheck(this, SettingsCategoryItem);\n\n        var _this = _possibleConstructorReturn(this, (SettingsCategoryItem.__proto__ || Object.getPrototypeOf(SettingsCategoryItem)).apply(this, arguments));\n\n        _this._onClick = function () {\n            if (_this.props.onClick) {\n                _this.props.onClick();\n            } else {\n                _settings_panel_actions2.default.selectCategory({\n                    title: _this.props.title,\n                    saveable: _this.props.saveable,\n                    handler: _this.props.handler\n                });\n            }\n        };\n        return _this;\n    }\n\n    _createClass(SettingsCategoryItem, [{\n        key: 'render',\n        value: function render() {\n            if (this.props.hidden) {\n                return null;\n            }\n            return _react2.default.createElement(\"button\", { className: \"ui-nav-list__item multiline\", onClick: this._onClick }, _react2.default.createElement(\"h3\", { className: \"ui-nav-list__item__title\" }, this.props.title), _react2.default.createElement(\"span\", { className: \"ui-nav-list__item__description\" }, this.props.description), _react2.default.createElement(\"span\", { className: \"ui-nav-list__item__right-arrow icon-righthead-3\" }));\n        }\n    }]);\n\n    return SettingsCategoryItem;\n}(_react2.default.Component);\n\nexports.default = SettingsCategoryItem;\n\nSettingsCategoryItem.propTypes = {\n    title: _propTypes2.default.string,\n    description: _propTypes2.default.string,\n    hidden: _propTypes2.default.bool,\n    handler: _propTypes2.default.func,\n    onClick: _propTypes2.default.func,\n    entity: _propTypes2.default.object,\n    yAxisScale: _propTypes2.default.object,\n    isControlPanel: _propTypes2.default.bool\n};\n\n/***/ }),\n/* 1581 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(178);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _settings_panel_header = __webpack_require__(683);\n\nvar _settings_panel_header2 = _interopRequireDefault(_settings_panel_header);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SettingsCategoryPanel = (0, _createReactClass2.default)({\n    displayName: 'SettingsCategoryPanel',\n\n    mixins: [_reactRouter.Navigation],\n    render: function render() {\n        var _props = this.props,\n            activeCategory = _props.activeCategory,\n            oneVisibleCategory = _props.oneVisibleCategory;\n\n        if (!activeCategory) {\n            return null;\n        }\n        var CategoryHandler = activeCategory.get('handler');\n        return _react2.default.createElement(\"div\", { className: \"ui-panel\" }, _react2.default.createElement(_settings_panel_header2.default, { report: this.props.updatedReport, oneVisibleCategory: oneVisibleCategory }), !oneVisibleCategory && _react2.default.createElement(\"header\", { className: \"ui-panel__sub-header\" }, _react2.default.createElement(\"h4\", null, _react2.default.createElement(\"button\", { className: \"ui-panel__back\", onClick: _settings_panel_actions2.default.goBack }, \"Back\"), activeCategory.get('title'))), _react2.default.createElement(\"footer\", { className: \"ui-panel__footer\" }, _react2.default.createElement(\"div\", { className: \"ui-panel__actions\" }, _react2.default.createElement(\"button\", { className: \"ui-button\", onClick: _settings_panel_actions2.default.cancel }, \"Cancel\"), this.props.activeCategory.get('saveable') ? _react2.default.createElement(\"button\", { className: \"ui-button primary\", disabled: !this.props.hasChanges, onClick: _settings_panel_actions2.default.save }, this.props.saving ? 'Saving...' : 'Save') : null)), _react2.default.createElement(\"div\", { className: \"ui-container_scroll\" }, _react2.default.createElement(\"div\", { className: \"ui-panel__content\" }, _react2.default.createElement(CategoryHandler, Object.assign({ transitionTo: this.transitionTo }, this.props)))));\n    }\n});\nexports.default = SettingsCategoryPanel;\n\n/***/ }),\n/* 1582 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ovid = __webpack_require__(8);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _mask_field = __webpack_require__(1583);\n\nvar _mask_field2 = _interopRequireDefault(_mask_field);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar GeneralSettings = function (_React$Component) {\n    _inherits(GeneralSettings, _React$Component);\n\n    function GeneralSettings() {\n        _classCallCheck(this, GeneralSettings);\n\n        var _this = _possibleConstructorReturn(this, (GeneralSettings.__proto__ || Object.getPrototypeOf(GeneralSettings)).apply(this, arguments));\n\n        _this._onContinue = function () {\n            var entity = _this.props.updatedReport.get('entity');\n            _settings_panel_actions2.default.finishDeleteReport();\n            _this.props.transitionTo('report-index', { entity: entity });\n        };\n        return _this;\n    }\n\n    _createClass(GeneralSettings, [{\n        key: '_onFormChange',\n        value: function _onFormChange(fieldName, newValue) {\n            _settings_panel_actions2.default.changeAttribute(fieldName, newValue);\n        }\n    }, {\n        key: '_onDeleteConfirm',\n        value: function _onDeleteConfirm(confirmed) {\n            if (confirmed) {\n                _settings_panel_actions2.default.confirmedDeleteReport();\n            } else {\n                _settings_panel_actions2.default.cancelDeleteReport();\n            }\n        }\n    }, {\n        key: 'renderUpdateReportName',\n        value: function renderUpdateReportName() {\n            return this.props.canUpdateReportName && _react2.default.createElement(_ovid.InputField, { name: \"name\", label: \"Report name\", description: \"Report names can be as long as you like, however shorter titles are best for public reports. Long titles will be automatically truncated.\" });\n        }\n    }, {\n        key: 'renderTotalToggle',\n        value: function renderTotalToggle() {\n            var report = this.props.updatedReport;\n            var canShowTotal = report && report.get('report_type') == 'grid' && (this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin);\n            return canShowTotal && [_react2.default.createElement(_ovid.Toggle, { className: 'total_text_visible_toggle', name: ['properties', 'total_text_visible'], label: \"Show total amount\", description: \"Calculate the sum of your transactions and display it in the side bar\", toggleLabel: { true: 'Show total amount', false: \"Don't show total amount\" }, key: \"toggle\" }), _react2.default.createElement(\"hr\", { key: \"hr\" })];\n        }\n    }, {\n        key: 'renderCheckImages',\n        value: function renderCheckImages() {\n            var report = this.props.updatedReport;\n            var canShowCheckImages = report && report.get('report_type') === 'grid' && this.props.canUpdate;\n            return canShowCheckImages && [_react2.default.createElement(_ovid.Toggle, { className: 'check_image_visible_toggle', name: ['properties', 'check_image_visible'], label: \"Check images\", description: \"Clicking on a transaction row will give the option to view a simulated check image of the transaction.\", toggleLabel: { true: 'Show check images', false: \"Don't show check images\" }, key: \"toggle\" }), _react2.default.createElement(\"hr\", { key: \"hr\" })];\n        }\n    }, {\n        key: 'renderDeleteStatus',\n        value: function renderDeleteStatus(deleteStatus, name) {\n            if (deleteStatus === 'confirm') {\n                return _react2.default.createElement(_ovid.Alert, { title: \"Confirm delete report\", confirmText: \"Yes, delete the report\", confirmButtonModifiers: { negative: true }, cancelable: true, onConfirm: this._onDeleteConfirm }, _react2.default.createElement(\"p\", null, \"Are you sure you want to delete the \", _react2.default.createElement(\"strong\", null, name), \" report?\"));\n            }\n            if (deleteStatus === 'completed') {\n                return _react2.default.createElement(_ovid.Alert, { title: \"Successfully deleted report\", confirmText: \"Continue\", onConfirm: this._onContinue }, _react2.default.createElement(\"p\", null, \"The \", _react2.default.createElement(\"strong\", null, name), \" report has been deleted.\"));\n            }\n        }\n    }, {\n        key: 'renderLocaleField',\n        value: function renderLocaleField() {\n            var canShowLocale = this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin || this.props.canUpdate;\n            return canShowLocale && [_react2.default.createElement(_ovid.SelectField, { name: \"locale\", key: \"select\", label: \"Report Locale\", items: [{ option: 'United States', value: 'en_US' }, { option: 'United Kingdom', value: 'en_GB' }, { option: 'Australia', value: 'en_AU' }] }), _react2.default.createElement(\"hr\", { key: \"hr\" })];\n        }\n    }, {\n        key: 'renderCanDelete',\n        value: function renderCanDelete() {\n            var isReportHidden = this.props.updatedReport.get('hidden');\n            var isDeleting = this.props.deleteStatus === 'pending';\n            return this.props.canDelete && _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", { className: \"hint negative\" }, \"Careful, this action cannot be undone\"), _react2.default.createElement(\"button\", { type: \"button\", className: \"ui-button negative pull-left\", disabled: !isReportHidden || isDeleting, title: isReportHidden ? 'Delete this report' : 'Can\\'t delete public report', onClick: _settings_panel_actions2.default.deleteReport }, isDeleting ? 'Deleting report...' : 'Delete report'));\n        }\n    }, {\n        key: 'renderReportDescription',\n        value: function renderReportDescription() {\n            return _react2.default.createElement(_ovid.TextArea, { name: \"description\", label: \"Report Description\", placeholder: \"Add a description for this report\", hint: \"You may include links to other resources in your report description\", maxLength: 250 });\n        }\n    }, {\n        key: 'renderSetReportDescriptionVisible',\n        value: function renderSetReportDescriptionVisible() {\n            return _react2.default.createElement(_ovid.Toggle, { className: 'description_visible_toggle', name: ['properties', 'description_visible'], toggleLabel: { true: 'Visible in report', false: 'Not visible in report' } });\n        }\n    }, {\n        key: 'renderSetReportAutoUpdate',\n        value: function renderSetReportAutoUpdate() {\n            // DSVC-174 only general ledger report will have auto update ability\n            // https://opengovinc.atlassian.net/browse/DSVC-174\n            var report = this.props.updatedReport;\n            var canSetAutoUpdate = report && report.get('report_type') !== 'grid';\n            return canSetAutoUpdate && _react2.default.createElement(_ovid.Toggle, { className: 'auto_update_toggle', name: \"include_new_periods\", description: \"Automatically add new periods when they are added to the source dataset(s). Changes will appear on the next update.\", toggleLabel: {\n                    true: 'Automatic updates',\n                    false: 'Automatic updates'\n                } });\n        }\n    }, {\n        key: 'renderSummaryTableToggle',\n        value: function renderSummaryTableToggle() {\n            var report = this.props.updatedReport;\n            var canShowSummaryTable = report && report.get('report_type') == 'grid' && (this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin);\n            return canShowSummaryTable && [_react2.default.createElement(_ovid.Toggle, { className: 'summary_table_visible_toggle', name: ['properties', 'summary_table_visible'], label: \"Show summary table\", description: \"Show a summary table of the report breakdown\", toggleLabel: { true: 'Show summary table', false: \"Don't show summary table\" }, key: \"toggle\" }), _react2.default.createElement(\"hr\", { key: \"hr\" })];\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            var report = this.props.updatedReport;\n\n            var errors = this.props.errors ? this.props.errors.toJS() : {};\n            return _react2.default.createElement(_ovid.Form, { initialValues: report.toJS(), errors: errors, onChange: this._onFormChange }, this.renderUpdateReportName(), this.renderReportDescription(), this.renderSetReportDescriptionVisible(), this.renderSetReportAutoUpdate(), _react2.default.createElement(\"hr\", null), this.renderCheckImages(), this.renderTotalToggle(), this.renderSummaryTableToggle(), _react2.default.createElement(_ovid.InputField, { name: \"access_code\", label: \"Password\", hint: \"Require a password to access this report\" }), _react2.default.createElement(\"hr\", null), (0, _mask_field2.default)(this.props), this.renderLocaleField(), this.renderCanDelete(), _react2.default.createElement(_ovid.Overlay, { id: \"report_general_settings_modals\" }, this.renderDeleteStatus(this.props.deleteStatus, report.get('name'))));\n        }\n    }]);\n\n    return GeneralSettings;\n}(_react2.default.Component);\n\nexports.default = GeneralSettings;\n\nGeneralSettings.propTypes = {\n    updatedReport: _propTypes2.default.object.isRequired,\n    errors: _propTypes2.default.object,\n    isOpengovAdmin: _propTypes2.default.bool,\n    canUpdate: _propTypes2.default.bool,\n    isOpengovTSD: _propTypes2.default.bool,\n    isEntityAdmin: _propTypes2.default.bool,\n    canUpdateMask: _propTypes2.default.bool,\n    deleteStatus: _propTypes2.default.string,\n    reportType: _propTypes2.default.string,\n    transitionTo: _propTypes2.default.func\n};\nGeneralSettings.contextTypes = {\n    router: _propTypes2.default.func\n};\n\n/***/ }),\n/* 1583 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MaskField = function MaskField(props) {\n    return props.reportType !== 'grid' && props.canUpdateMask && [_react2.default.createElement(_ovid.SelectField, { name: \"coa_mask_id\", label: \"Chart of Accounts Mask\", hint: \"Select a Chart of Accounts Mask to apply to this report\", disabled: _lodash2.default.isEmpty(props.maskOptions), items: [{ option: 'No mask', value: '' }].concat(props.maskOptions) }), _react2.default.createElement(\"hr\", null)];\n};\nexports.default = MaskField;\n\n/***/ }),\n/* 1584 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _y_axis_scale = __webpack_require__(1585);\n\nvar _y_axis_scale2 = _interopRequireDefault(_y_axis_scale);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _metric_data_constants = __webpack_require__(261);\n\nvar _metrics_dropdown = __webpack_require__(1586);\n\nvar _metrics_dropdown2 = _interopRequireDefault(_metrics_dropdown);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ViewSettings = (0, _createReactClass2.default)({\n    displayName: 'ViewSettings',\n\n    propTypes: {\n        entity: _propTypes2.default.object.isRequired,\n        isControlPanel: _propTypes2.default.bool,\n        yAxisScale: _propTypes2.default.object,\n        overlay: _propTypes2.default.object,\n        scale: _propTypes2.default.object,\n        reportType: _propTypes2.default.string,\n        scalePerCapitaEnabled: _propTypes2.default.bool\n    },\n    render: function render() {\n        var summaryReportState = _summary_report_store2.default.getState();\n        var _props = this.props,\n            isControlPanel = _props.isControlPanel,\n            isNetwork = _props.isNetwork,\n            scalePerCapitaEnabled = _props.scalePerCapitaEnabled;\n\n        return _react2.default.createElement(\"div\", null, isControlPanel && !isNetwork && _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Account codes\"), _react2.default.createElement(\"p\", null, \"Governments use Chart of Account codes to track and classify spending in their accounting systems. Toggle this feature to include account codes in the report presentation.\"), _react2.default.createElement(Ovid.ToggleSwitch, { state: this.props.auditModeEnabled ? 'on' : 'off', onToggle: _report_actions2.default.toggleAuditMode }, \"Show account codes\"), _react2.default.createElement(\"p\", { className: \"hint\" })), scalePerCapitaEnabled && _react2.default.createElement(_y_axis_scale2.default, { yAxisScale: this.props.yAxisScale, amountUnit: this.props.amountUnit, isControlPanel: this.props.isControlPanel, entity: this.props.entity }), _lodash2.default.includes(this.props.entity.get('feature_permissions'), 'metric_data') && _lodash2.default.includes(_metric_data_constants.compatibleReports, this.props.reportType) ? _react2.default.createElement(_metrics_dropdown2.default, { isControlPanel: this.props.isControlPanel, graphType: summaryReportState.get('athenaState').attributes.graphType || '', overlay: this.props.overlay, scale: this.props.scale }) : null);\n    }\n});\nexports.default = ViewSettings;\n\n/***/ }),\n/* 1585 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _ovid = __webpack_require__(8);\n\nvar Ovid = _interopRequireWildcard(_ovid);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar YAxisScale = (0, _createReactClass2.default)({\n    displayName: 'YAxisScale',\n\n    propTypes: {\n        entity: _propTypes2.default.object.isRequired,\n        isControlPanel: _propTypes2.default.bool,\n        yAxisScale: _propTypes2.default.object,\n        amountUnit: _propTypes2.default.string\n    },\n    render: function render() {\n        var disabled = !this.props.entity.get('population');\n        if (_lodash2.default.includes(this.props.entity.get('feature_permissions'), 'metric_data') || !this.props.isControlPanel && disabled) {\n            return null;\n        }\n        var toggleState = this.props.yAxisScale ? 'on' : 'off';\n        var toggleLabel = this.props.yAxisScale ? 'Scale by per capita' : 'Don\\'t scale amounts';\n        var entitySettingsLink = 'controlpanel#/' + this.props.entity.get('subdomain') + '/manage';\n        var unitLabel = _strings2.default.amountUnitLabel(this.props.amountUnit);\n        var description = 'Display ' + unitLabel + ' amounts as per capita. To calculate amount shown, we will divide any ' + unitLabel + ' value by your population';\n        var scaleValue = 'Toggle and view the table below to see population by year';\n        var onToggle = disabled ? null : function () {\n            return _summary_report_actions2.default.togglePerCapitaScale();\n        };\n        return _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"span\", null, _react2.default.createElement(\"label\", null, \"Scale Per Capita\"), this.props.isControlPanel ? _react2.default.createElement(\"p\", { className: \"info-text\" }, _react2.default.createElement(\"small\", null, \"This setting will be active only for this session, and won't be included in your default state.\")) : null, disabled ? _react2.default.createElement(\"p\", null, description, \". Go to \", _react2.default.createElement(\"a\", { href: entitySettingsLink }, \"Entity Settings\"), \" to set your population and then return here to enable this feature.\") : _react2.default.createElement(\"p\", null, description + ' (' + scaleValue + ').'), _react2.default.createElement(Ovid.ToggleSwitch, { state: toggleState, onToggle: onToggle }, toggleLabel)));\n    }\n});\nexports.default = YAxisScale;\n\n/***/ }),\n/* 1586 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _summary_report_store = __webpack_require__(38);\n\nvar _summary_report_store2 = _interopRequireDefault(_summary_report_store);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nvar _ovid = __webpack_require__(8);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MetricsDropdown = (0, _createReactClass2.default)({\n    displayName: 'MetricsDropdown',\n\n    propTypes: {\n        isControlPanel: _propTypes2.default.bool,\n        overlay: _propTypes2.default.object.isRequired,\n        scale: _propTypes2.default.object.isRequired,\n        graphType: _propTypes2.default.string.isRequired\n    },\n    render: function render() {\n        var overlaysAvailable = this.props.overlay.get('available');\n        var scalesAvailable = this.props.scale.get('available');\n        var overlaySelected = this.props.overlay.get('selected').first();\n        var scaleSelected = this.props.scale.get('selected').first();\n        var overlayCompatibleCharts = _summary_report_store2.default.getInitialState().getIn(['overlay', 'overlayCompatibleCharts']);\n        var disableOverdownDropdown = !overlayCompatibleCharts.includes(this.props.graphType);\n        var overlayDescription = \"Compare your financial data with measurement's we've collected from public data sources.\";\n        var scaleDescription = \"Scale your financial data by measurement's we've collected from public data sources.\";\n        return _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Overlay \", _react2.default.createElement(\"span\", { className: 'feature-version-badge beta' }, \"beta\")), this.props.isControlPanel ? _react2.default.createElement(\"p\", { className: \"info-text\" }, _react2.default.createElement(\"small\", null, \"This setting will be active only for this session, and won't be included in your default state.\")) : null, _react2.default.createElement(\"p\", null, overlayDescription), _react2.default.createElement(_ovid.DropdownList, { value: overlaySelected, onChange: _summary_report_actions2.default.setOverlays, disabled: disableOverdownDropdown }, overlaysAvailable.map(function (overlay) {\n            return _react2.default.createElement(_ovid.DropdownListItem, { key: overlay.get('metric_type'), value: overlay.get('metric_type'), title: overlay.get('name') });\n        })), _react2.default.createElement(\"label\", null, \"Scale By \", _react2.default.createElement(\"span\", { className: 'feature-version-badge beta' }, \"beta\")), this.props.isControlPanel ? _react2.default.createElement(\"p\", { className: \"info-text\" }, _react2.default.createElement(\"small\", null, \"This setting will be active only for this session, and won't be included in your default state.\")) : null, _react2.default.createElement(\"p\", null, scaleDescription), _react2.default.createElement(_ovid.DropdownList, { value: scaleSelected, onChange: _summary_report_actions2.default.setScale }, scalesAvailable.map(function (scale) {\n            return _react2.default.createElement(_ovid.DropdownListItem, { key: scale.get('metric_type'), value: scale.get('metric_type'), title: scale.get('name') });\n        })));\n    }\n});\nexports.default = MetricsDropdown;\n\n/***/ }),\n/* 1587 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _x_axis_editor = __webpack_require__(1588);\n\nvar _x_axis_editor2 = _interopRequireDefault(_x_axis_editor);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DefaultConfiguration = (0, _createReactClass2.default)({\n    displayName: 'DefaultConfiguration',\n\n    statics: {\n        title: 'Default configuration'\n    },\n    _onChangeXAxisLabel: function _onChangeXAxisLabel(e) {\n        _settings_panel_actions2.default.changeXAxisLabel(e.target.value);\n    },\n    render: function render() {\n        var dataSets = this.props.updatedReport.get('data_sets');\n        var fiscalYearText = this.props.updatedReport.getIn(['properties', 'fiscal_year_text']);\n        return _react2.default.createElement(\"div\", null, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Customize the X-axis label\"), _react2.default.createElement(\"input\", { type: \"text\", value: fiscalYearText, onChange: this._onChangeXAxisLabel }), _react2.default.createElement(\"p\", { className: \"hint\" }, \"Default value: Fiscal Year\")), _react2.default.createElement(\"hr\", null), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Edit and re-arrange x-axis columns\"), _react2.default.createElement(_x_axis_editor2.default, { entity: this.props.entity, dataSets: dataSets.toJS() })));\n    }\n});\nexports.default = DefaultConfiguration;\n\n/***/ }),\n/* 1588 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _strings = __webpack_require__(22);\n\nvar _strings2 = _interopRequireDefault(_strings);\n\nvar _settings_panel_actions = __webpack_require__(83);\n\nvar _settings_panel_actions2 = _interopRequireDefault(_settings_panel_actions);\n\nvar _createReactClass = __webpack_require__(5);\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar XAxisEditor = (0, _createReactClass2.default)({\n    displayName: 'XAxisEditor',\n    getInitialState: function getInitialState() {\n        var dataSets = void 0;\n        if (!this.props.dataSets) {\n            dataSets = [];\n        } else {\n            dataSets = this.props.dataSets.map(function (dataSet) {\n                return _lodash2.default.cloneDeep(dataSet);\n            });\n        }\n        return {\n            xAxisLabel: this.props.xAxisLabel,\n            dataSets: dataSets\n        };\n    },\n    render: function render() {\n        var dataSets = this.props.dataSets;\n        return _react2.default.createElement(\"div\", { className: \"x-axis-edit\" }, _react2.default.createElement(\"div\", { className: \"x-axis-edit__columns\" }, dataSets.map(function (dataSet, i) {\n            var isLast = i === dataSets.length - 1;\n            return _react2.default.createElement(DataSet, { dataSet: dataSet, entity: this.props.entity, onDataSetUp: this.handleDataSetUp, onDataSetDown: this.handleDataSetDown, isLast: isLast, onDrop: this.handleDrop, index: i, key: dataSet.id });\n        }, this)));\n    },\n    handleConfirm: function handleConfirm(success) {\n        if (success) {\n            this.props.onConfirm(this.state.dataSets, this.state.xAxisLabel);\n        }\n    },\n    handleDrop: function handleDrop(index, evt) {\n        var otherIndex = evt.dataTransfer.getData('index');\n        _settings_panel_actions2.default.changeDataSetOrder(index, otherIndex);\n    },\n    handleDataSetUp: function handleDataSetUp(index) {\n        if (index > 0) {\n            _settings_panel_actions2.default.changeDataSetOrder(index, index - 1);\n        }\n    },\n    handleDataSetDown: function handleDataSetDown(index) {\n        if (index < this.props.dataSets.length - 1) {\n            _settings_panel_actions2.default.changeDataSetOrder(index, index + 1);\n        }\n    }\n});\nvar DataSet = (0, _createReactClass2.default)({\n    displayName: 'DataSet',\n    render: function render() {\n        var dataSet = this.props.dataSet;\n        var index = this.props.index;\n        var defaultLabel = _strings2.default.summaryHeaderLabel(dataSet, null, this.props.entity.get('fiscal_year_start_month'));\n        return _react2.default.createElement(\"div\", { className: \"x-axis-edit__row\", draggable: true, onDragStart: _lodash2.default.partial(this.handleDragStart, this.props.index), onDrop: _lodash2.default.partial(this.props.onDrop, this.props.index), onDragOver: this.preventDefault }, _react2.default.createElement(\"div\", { className: \"icon-drag-n-drop-1\" }), _react2.default.createElement(\"div\", { className: \"ui-button-stack\" }, _react2.default.createElement(\"button\", { className: \"ui-button small icon-up-1\", disabled: index === 0, onClick: _lodash2.default.partial(this.props.onDataSetUp, index), title: \"Move up\" }), _react2.default.createElement(\"button\", { className: \"ui-button small icon-down-1\", disabled: this.props.isLast, onClick: _lodash2.default.partial(this.props.onDataSetDown, index), title: \"Move down\" })), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"textarea\", { rows: 2, defaultValue: this.props.dataSet.name ? this.props.dataSet.name : defaultLabel, onChange: _lodash2.default.partial(this.handleNameChange, index) }), _react2.default.createElement(\"p\", { className: \"hint\" }, \"Default: \", _react2.default.createElement(\"strong\", null, defaultLabel))));\n    },\n    handleNameChange: function handleNameChange(index, evt) {\n        _settings_panel_actions2.default.renameDataSet(index, evt.target.value);\n    },\n    handleDragStart: function handleDragStart(index, evt) {\n        evt.dataTransfer.setData('index', index);\n    },\n    preventDefault: function preventDefault(evt) {\n        evt.preventDefault();\n    }\n});\nexports.default = XAxisEditor;\n\n/***/ }),\n/* 1589 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar _disableable_toggle = __webpack_require__(1590);\n\nvar _disableable_toggle2 = _interopRequireDefault(_disableable_toggle);\n\nvar _summary_report_actions = __webpack_require__(30);\n\nvar _summary_report_actions2 = _interopRequireDefault(_summary_report_actions);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar invalidProrationProps = function invalidProrationProps(props) {\n    return props.currentYearAmount === 'cumulative' && props.currentYearPeriod === 'months';\n};\n\nvar CurrentYearSettings = function (_React$Component) {\n    _inherits(CurrentYearSettings, _React$Component);\n\n    function CurrentYearSettings() {\n        _classCallCheck(this, CurrentYearSettings);\n\n        return _possibleConstructorReturn(this, (CurrentYearSettings.__proto__ || Object.getPrototypeOf(CurrentYearSettings)).apply(this, arguments));\n    }\n\n    _createClass(CurrentYearSettings, [{\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { id: \"current-year-settings\" }, _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Data Representation\"), _react2.default.createElement(\"p\", null, \"Show your expenses/revenues trends within a fiscal year or across many years.\"), _react2.default.createElement(_ovid.DropdownList, { value: this.props.currentYearPeriod, onChange: _summary_report_actions2.default.changeCurrentYearPeriod }, _react2.default.createElement(_ovid.DropdownListItem, { key: \"years\", value: \"years\", title: \"Year over year\", description: \"Displays years on the x-axis\" }), _react2.default.createElement(_ovid.DropdownListItem, { key: \"months\", value: \"months\", title: \"Month over month\", description: \"Displays months on the x-axis\" }))), _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"label\", null, \"Amounts\"), _react2.default.createElement(\"p\", null, \"Select how you want your amounts displayed in your report.\"), _react2.default.createElement(_ovid.DropdownList, { value: this.props.currentYearAmount, onChange: _summary_report_actions2.default.changeCurrentYearAmount }, _react2.default.createElement(_ovid.DropdownListItem, { key: \"cumulative\", value: \"cumulative\", title: \"Cumulative\", description: 'Data in the report completes the sentence \"through the month of ...\"' }), _react2.default.createElement(_ovid.DropdownListItem, { key: \"monthly\", value: \"monthly\", title: \"Incremental\", description: 'Data in the report completes the sentence \"in the month of ...\"' }))), _react2.default.createElement(_disableable_toggle2.default, Object.assign({}, this.props, { title: \"Budget Proration\", isEnabled: this.props.proration, description: \"Proration adjusts budget amounts linearly (divided by 1/12) based on the current point within the fiscal year.\", enabledToggleLabel: \"Proration enabled\", disabledToggleLabel: \"Proration disabled\", disabledHint: \"Proration is disabled when viewing cumulative amounts in a single fiscal year.\", onToggle: _summary_report_actions2.default.toggleProration, hasInvalidProps: invalidProrationProps })));\n        }\n    }]);\n\n    return CurrentYearSettings;\n}(_react2.default.Component);\n\nexports.default = CurrentYearSettings;\n\n/***/ }),\n/* 1590 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = exports.TOGGLE_ON_STATE = exports.TOGGLE_OFF_STATE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TOGGLE_OFF_STATE = exports.TOGGLE_OFF_STATE = 'off';\nvar TOGGLE_ON_STATE = exports.TOGGLE_ON_STATE = 'on';\n\nvar DisableableToggle = function (_Component) {\n    _inherits(DisableableToggle, _Component);\n\n    function DisableableToggle() {\n        _classCallCheck(this, DisableableToggle);\n\n        var _this = _possibleConstructorReturn(this, (DisableableToggle.__proto__ || Object.getPrototypeOf(DisableableToggle)).apply(this, arguments));\n\n        _this.handleOnToggle = function () {\n            var _this$props = _this.props,\n                hasInvalidProps = _this$props.hasInvalidProps,\n                onToggle = _this$props.onToggle;\n\n            if (!hasInvalidProps(_this.props)) {\n                onToggle();\n            }\n        };\n        return _this;\n    }\n\n    _createClass(DisableableToggle, [{\n        key: 'render',\n        value: function render() {\n            var _props = this.props,\n                title = _props.title,\n                description = _props.description,\n                isEnabled = _props.isEnabled,\n                enabledToggleLabel = _props.enabledToggleLabel,\n                disabledToggleLabel = _props.disabledToggleLabel,\n                disabledHint = _props.disabledHint,\n                hasInvalidProps = _props.hasInvalidProps;\n\n            var toggleState = isEnabled ? TOGGLE_ON_STATE : TOGGLE_OFF_STATE;\n            var toggleLabel = isEnabled ? enabledToggleLabel : disabledToggleLabel;\n            var invalidProps = hasInvalidProps(this.props);\n            var showHint = invalidProps && disabledHint;\n            if (invalidProps) {\n                toggleState = TOGGLE_OFF_STATE;\n                toggleLabel = disabledToggleLabel;\n            }\n            return _react2.default.createElement(\"fieldset\", { className: \"ui-form\" }, _react2.default.createElement(\"span\", null, _react2.default.createElement(\"label\", null, title), _react2.default.createElement(\"p\", { className: \"info-text\" }, _react2.default.createElement(\"small\", null, description)), _react2.default.createElement(_ovid.ToggleSwitch, Object.assign({}, this.props, { state: toggleState, onToggle: this.handleOnToggle }), toggleLabel), showHint && _react2.default.createElement(\"span\", { className: \"hint\" }, disabledHint)));\n        }\n    }]);\n\n    return DisableableToggle;\n}(_react.Component);\n\nexports.default = DisableableToggle;\n\n/***/ }),\n/* 1591 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _og_api = __webpack_require__(34);\n\nvar _og_api2 = _interopRequireDefault(_og_api);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar selectedEntity = void 0;\n_og_api2.default.trapi.use(function (request) {\n    var useGridData = selectedEntity && _lodash2.default.includes(selectedEntity.get('feature_permissions'), 'data_manager');\n    if (useGridData && request.url.indexOf('grid_state') === -1) {\n        request.url = request.url.replace('v1', 'v2');\n    }\n    return request;\n});\nexports.default = {\n    setEntity: function setEntity(entity) {\n        selectedEntity = entity;\n    }\n};\n\n/***/ }),\n/* 1592 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.StoryView = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _lodash = __webpack_require__(3);\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _og_flux = __webpack_require__(15);\n\nvar _ovid = __webpack_require__(8);\n\nvar _report_view_store = __webpack_require__(29);\n\nvar _report_view_store2 = _interopRequireDefault(_report_view_store);\n\nvar _report_actions = __webpack_require__(21);\n\nvar _report_actions2 = _interopRequireDefault(_report_actions);\n\nvar _stories_store = __webpack_require__(685);\n\nvar _stories_store2 = _interopRequireDefault(_stories_store);\n\nvar _stories_actions = __webpack_require__(684);\n\nvar StoryActions = _interopRequireWildcard(_stories_actions);\n\nvar _stories_header_actions = __webpack_require__(1593);\n\nvar _stories_header_actions2 = _interopRequireDefault(_stories_header_actions);\n\nvar _sidebar = __webpack_require__(318);\n\nvar _sidebar2 = _interopRequireDefault(_sidebar);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar StoryView = exports.StoryView = function (_Component) {\n    _inherits(StoryView, _Component);\n\n    function StoryView() {\n        _classCallCheck(this, StoryView);\n\n        return _possibleConstructorReturn(this, (StoryView.__proto__ || Object.getPrototypeOf(StoryView)).apply(this, arguments));\n    }\n\n    _createClass(StoryView, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n            StoryActions.fetchStories(this.props.entity.get('entity_id'));\n            if (this.props.params.storyId) {\n                StoryActions.selectStoryToView(this.props.params.storyId);\n            }\n            if (this.props.activeSidebar !== 'stories') {\n                // Handle the case when we load the application from a stories URL.\n                // The selected sidebar should be stories not the default reports one.\n                _report_actions2.default.selectSidebar('stories');\n            }\n        }\n    }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps() {\n            var _this2 = this;\n\n            _lodash2.default.defer(function () {\n                // Seems to be a bug with the `props.params.storyId` not updating when the route changes.\n                // So to workaround this we will just parse out the story ID from the location hash ourselves.\n                var nextStoryId = _lodash2.default.last(window.location.hash.split('/'));\n                if (_this2.props.selectedStoryId !== nextStoryId) {\n                    StoryActions.selectStoryToView(nextStoryId);\n                }\n            });\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"div\", { className: \"story-view__container\" }, _react2.default.createElement(_ovid.MainPanel, null, _react2.default.createElement(_sidebar2.default, { session: this.props.session, entity: this.props.entity, reports: this.props.reports, stories: this.props.stories, selectedStoryId: this.props.selectedStoryId, activeSidebar: this.props.activeSidebar })), _react2.default.createElement(_stories_header_actions2.default, { entity: this.props.entity }), _react2.default.createElement(\"div\", { className: \"ui-main__content\" }, _react2.default.createElement(\"iframe\", { className: \"story-view__iframe\", src: this.props.selectedStoryPublicURL, frameBorder: \"0\" })));\n        }\n    }]);\n\n    return StoryView;\n}(_react.Component);\n\nexports.default = (0, _og_flux.Connect)(function () {\n    var state = _stories_store2.default.getState();\n    return {\n        stories: state.get('stories'),\n        selectedStoryId: state.get('selectedStoryId'),\n        selectedStoryPublicURL: _stories_store2.default.selectedStoryPublicURL(),\n        activeSidebar: _report_view_store2.default.getActiveSidebar()\n    };\n}, _stories_store2.default, _report_view_store2.default)(StoryView);\n\n/***/ }),\n/* 1593 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _ovid = __webpack_require__(8);\n\nvar _share_links = __webpack_require__(220);\n\nvar _share_links2 = _interopRequireDefault(_share_links);\n\nvar _shared_link_helper = __webpack_require__(221);\n\nvar _shared_link_helper2 = _interopRequireDefault(_shared_link_helper);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar StoriesHeaderActions = function (_Component) {\n    _inherits(StoriesHeaderActions, _Component);\n\n    function StoriesHeaderActions() {\n        _classCallCheck(this, StoriesHeaderActions);\n\n        return _possibleConstructorReturn(this, (StoriesHeaderActions.__proto__ || Object.getPrototypeOf(StoriesHeaderActions)).apply(this, arguments));\n    }\n\n    _createClass(StoriesHeaderActions, [{\n        key: 'componentWillMount',\n        value: function componentWillMount() {\n            this.linkHelper = _shared_link_helper2.default.create(this.props.entity);\n        }\n    }, {\n        key: 'render',\n        value: function render() {\n            return _react2.default.createElement(\"nav\", { className: \"ui-main__actions ui-nav-bar\" }, _react2.default.createElement(_ovid.Dropdown, { title: _react2.default.createElement(\"span\", null, \"Share \", _react2.default.createElement(\"i\", { className: \"icon-downhead-3\" })), position: \"align-right\", dropdownClass: \"ui-nav-bar__item\", toggleClass: \"ui-button small no-color\", key: \"share\" }, _react2.default.createElement(_share_links2.default, { linkHelper: this.linkHelper })));\n        }\n    }]);\n\n    return StoriesHeaderActions;\n}(_react.Component);\n\nexports.default = StoriesHeaderActions;\n\n/***/ }),\n/* 1594 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.getSortedReports = getSortedReports;\n/**\r\n * Gets the reports, sorted by position\r\n * @param {array<Object>} reports - The reports to sort\r\n */\nfunction getSortedReports(reports) {\n    if (!reports) {\n        return reports;\n    }\n    return reports.sort(function (a, b) {\n        if (a.position < b.position) {\n            return -1;\n        } else if (a.position > b.position) {\n            return 1;\n        }\n        return 0;\n    });\n}\n\n/***/ }),\n/* 1595 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\n__webpack_require__(1596);\n\n__webpack_require__(1793);\n\n__webpack_require__(1794);\n\nif (global._babelPolyfill) {\n  throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n\nvar DEFINE_PROPERTY = \"defineProperty\";\nfunction define(O, key, value) {\n  O[key] || Object[DEFINE_PROPERTY](O, key, {\n    writable: true,\n    configurable: true,\n    value: value\n  });\n}\n\ndefine(String.prototype, \"padLeft\", \"\".padStart);\ndefine(String.prototype, \"padRight\", \"\".padEnd);\n\n\"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\".split(\",\").forEach(function (key) {\n  [][key] && define(Array, key, Function.call.bind([][key]));\n});\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1596 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(1597);\n__webpack_require__(1600);\n__webpack_require__(1601);\n__webpack_require__(1602);\n__webpack_require__(1603);\n__webpack_require__(1604);\n__webpack_require__(1605);\n__webpack_require__(1606);\n__webpack_require__(1607);\n__webpack_require__(1608);\n__webpack_require__(1609);\n__webpack_require__(1610);\n__webpack_require__(1611);\n__webpack_require__(1612);\n__webpack_require__(1613);\n__webpack_require__(1614);\n__webpack_require__(1615);\n__webpack_require__(1616);\n__webpack_require__(1617);\n__webpack_require__(1618);\n__webpack_require__(1619);\n__webpack_require__(1620);\n__webpack_require__(1621);\n__webpack_require__(1622);\n__webpack_require__(1623);\n__webpack_require__(1624);\n__webpack_require__(1625);\n__webpack_require__(1626);\n__webpack_require__(1627);\n__webpack_require__(1628);\n__webpack_require__(1629);\n__webpack_require__(1630);\n__webpack_require__(1631);\n__webpack_require__(1632);\n__webpack_require__(1633);\n__webpack_require__(1634);\n__webpack_require__(1635);\n__webpack_require__(1636);\n__webpack_require__(1637);\n__webpack_require__(1638);\n__webpack_require__(1639);\n__webpack_require__(1640);\n__webpack_require__(1641);\n__webpack_require__(1642);\n__webpack_require__(1643);\n__webpack_require__(1644);\n__webpack_require__(1645);\n__webpack_require__(1646);\n__webpack_require__(1647);\n__webpack_require__(1648);\n__webpack_require__(1649);\n__webpack_require__(1650);\n__webpack_require__(1651);\n__webpack_require__(1652);\n__webpack_require__(1653);\n__webpack_require__(1654);\n__webpack_require__(1655);\n__webpack_require__(1656);\n__webpack_require__(1657);\n__webpack_require__(1658);\n__webpack_require__(1659);\n__webpack_require__(1660);\n__webpack_require__(1661);\n__webpack_require__(1662);\n__webpack_require__(1663);\n__webpack_require__(1664);\n__webpack_require__(1665);\n__webpack_require__(1666);\n__webpack_require__(1667);\n__webpack_require__(1668);\n__webpack_require__(1669);\n__webpack_require__(1670);\n__webpack_require__(1671);\n__webpack_require__(1672);\n__webpack_require__(1673);\n__webpack_require__(1674);\n__webpack_require__(1675);\n__webpack_require__(1677);\n__webpack_require__(1678);\n__webpack_require__(1680);\n__webpack_require__(1681);\n__webpack_require__(1682);\n__webpack_require__(1683);\n__webpack_require__(1684);\n__webpack_require__(1685);\n__webpack_require__(1686);\n__webpack_require__(1688);\n__webpack_require__(1689);\n__webpack_require__(1690);\n__webpack_require__(1691);\n__webpack_require__(1692);\n__webpack_require__(1693);\n__webpack_require__(1694);\n__webpack_require__(1695);\n__webpack_require__(1696);\n__webpack_require__(1697);\n__webpack_require__(1698);\n__webpack_require__(1699);\n__webpack_require__(1700);\n__webpack_require__(344);\n__webpack_require__(1701);\n__webpack_require__(705);\n__webpack_require__(1702);\n__webpack_require__(706);\n__webpack_require__(1703);\n__webpack_require__(1704);\n__webpack_require__(1705);\n__webpack_require__(1706);\n__webpack_require__(1707);\n__webpack_require__(709);\n__webpack_require__(711);\n__webpack_require__(712);\n__webpack_require__(1708);\n__webpack_require__(1709);\n__webpack_require__(1710);\n__webpack_require__(1711);\n__webpack_require__(1712);\n__webpack_require__(1713);\n__webpack_require__(1714);\n__webpack_require__(1715);\n__webpack_require__(1716);\n__webpack_require__(1717);\n__webpack_require__(1718);\n__webpack_require__(1719);\n__webpack_require__(1720);\n__webpack_require__(1721);\n__webpack_require__(1722);\n__webpack_require__(1723);\n__webpack_require__(1724);\n__webpack_require__(1725);\n__webpack_require__(1726);\n__webpack_require__(1727);\n__webpack_require__(1728);\n__webpack_require__(1729);\n__webpack_require__(1730);\n__webpack_require__(1731);\n__webpack_require__(1732);\n__webpack_require__(1733);\n__webpack_require__(1734);\n__webpack_require__(1735);\n__webpack_require__(1736);\n__webpack_require__(1737);\n__webpack_require__(1738);\n__webpack_require__(1739);\n__webpack_require__(1740);\n__webpack_require__(1741);\n__webpack_require__(1742);\n__webpack_require__(1743);\n__webpack_require__(1744);\n__webpack_require__(1745);\n__webpack_require__(1746);\n__webpack_require__(1747);\n__webpack_require__(1748);\n__webpack_require__(1749);\n__webpack_require__(1750);\n__webpack_require__(1751);\n__webpack_require__(1752);\n__webpack_require__(1753);\n__webpack_require__(1754);\n__webpack_require__(1755);\n__webpack_require__(1756);\n__webpack_require__(1757);\n__webpack_require__(1758);\n__webpack_require__(1759);\n__webpack_require__(1760);\n__webpack_require__(1761);\n__webpack_require__(1762);\n__webpack_require__(1763);\n__webpack_require__(1764);\n__webpack_require__(1765);\n__webpack_require__(1766);\n__webpack_require__(1767);\n__webpack_require__(1768);\n__webpack_require__(1769);\n__webpack_require__(1770);\n__webpack_require__(1771);\n__webpack_require__(1772);\n__webpack_require__(1773);\n__webpack_require__(1774);\n__webpack_require__(1775);\n__webpack_require__(1776);\n__webpack_require__(1777);\n__webpack_require__(1778);\n__webpack_require__(1779);\n__webpack_require__(1780);\n__webpack_require__(1781);\n__webpack_require__(1782);\n__webpack_require__(1783);\n__webpack_require__(1784);\n__webpack_require__(1785);\n__webpack_require__(1786);\n__webpack_require__(1787);\n__webpack_require__(1788);\n__webpack_require__(1789);\n__webpack_require__(1790);\n__webpack_require__(1791);\n__webpack_require__(1792);\nmodule.exports = __webpack_require__(64);\n\n\n/***/ }),\n/* 1597 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(16);\nvar has = __webpack_require__(57);\nvar DESCRIPTORS = __webpack_require__(27);\nvar $export = __webpack_require__(4);\nvar redefine = __webpack_require__(50);\nvar META = __webpack_require__(95).KEY;\nvar $fails = __webpack_require__(19);\nvar shared = __webpack_require__(169);\nvar setToStringTag = __webpack_require__(130);\nvar uid = __webpack_require__(106);\nvar wks = __webpack_require__(23);\nvar wksExt = __webpack_require__(687);\nvar wksDefine = __webpack_require__(325);\nvar enumKeys = __webpack_require__(1599);\nvar isArray = __webpack_require__(231);\nvar anObject = __webpack_require__(13);\nvar isObject = __webpack_require__(20);\nvar toObject = __webpack_require__(32);\nvar toIObject = __webpack_require__(58);\nvar toPrimitive = __webpack_require__(73);\nvar createDesc = __webpack_require__(105);\nvar _create = __webpack_require__(109);\nvar gOPNExt = __webpack_require__(690);\nvar $GOPD = __webpack_require__(59);\nvar $GOPS = __webpack_require__(230);\nvar $DP = __webpack_require__(31);\nvar $keys = __webpack_require__(107);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(110).f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(171).f = $propertyIsEnumerable;\n  $GOPS.f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(94)) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });\n\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    return $GOPS.f(toObject(it));\n  }\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(49)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 1598 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(169)('native-function-to-string', Function.toString);\n\n\n/***/ }),\n/* 1599 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(107);\nvar gOPS = __webpack_require__(230);\nvar pIE = __webpack_require__(171);\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n/***/ }),\n/* 1600 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: __webpack_require__(109) });\n\n\n/***/ }),\n/* 1601 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !__webpack_require__(27), 'Object', { defineProperty: __webpack_require__(31).f });\n\n\n/***/ }),\n/* 1602 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !__webpack_require__(27), 'Object', { defineProperties: __webpack_require__(689) });\n\n\n/***/ }),\n/* 1603 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(58);\nvar $getOwnPropertyDescriptor = __webpack_require__(59).f;\n\n__webpack_require__(75)('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n/***/ }),\n/* 1604 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(32);\nvar $getPrototypeOf = __webpack_require__(60);\n\n__webpack_require__(75)('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 1605 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(32);\nvar $keys = __webpack_require__(107);\n\n__webpack_require__(75)('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 1606 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(75)('getOwnPropertyNames', function () {\n  return __webpack_require__(690).f;\n});\n\n\n/***/ }),\n/* 1607 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(20);\nvar meta = __webpack_require__(95).onFreeze;\n\n__webpack_require__(75)('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 1608 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(20);\nvar meta = __webpack_require__(95).onFreeze;\n\n__webpack_require__(75)('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 1609 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(20);\nvar meta = __webpack_require__(95).onFreeze;\n\n__webpack_require__(75)('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 1610 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(20);\n\n__webpack_require__(75)('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 1611 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(20);\n\n__webpack_require__(75)('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 1612 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(20);\n\n__webpack_require__(75)('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n/***/ }),\n/* 1613 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(4);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(691) });\n\n\n/***/ }),\n/* 1614 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(4);\n$export($export.S, 'Object', { is: __webpack_require__(692) });\n\n\n/***/ }),\n/* 1615 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(4);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(329).set });\n\n\n/***/ }),\n/* 1616 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.3.6 Object.prototype.toString()\nvar classof = __webpack_require__(131);\nvar test = {};\ntest[__webpack_require__(23)('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  __webpack_require__(50)(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n\n\n/***/ }),\n/* 1617 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = __webpack_require__(4);\n\n$export($export.P, 'Function', { bind: __webpack_require__(693) });\n\n\n/***/ }),\n/* 1618 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(31).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(27) && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n/* 1619 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar isObject = __webpack_require__(20);\nvar getPrototypeOf = __webpack_require__(60);\nvar HAS_INSTANCE = __webpack_require__(23)('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(31).f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n  if (typeof this != 'function' || !isObject(O)) return false;\n  if (!isObject(this.prototype)) return O instanceof this;\n  // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n  while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n  return false;\n} });\n\n\n/***/ }),\n/* 1620 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar $parseInt = __webpack_require__(695);\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n\n\n/***/ }),\n/* 1621 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar $parseFloat = __webpack_require__(696);\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n\n\n/***/ }),\n/* 1622 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(16);\nvar has = __webpack_require__(57);\nvar cof = __webpack_require__(66);\nvar inheritIfRequired = __webpack_require__(331);\nvar toPrimitive = __webpack_require__(73);\nvar fails = __webpack_require__(19);\nvar gOPN = __webpack_require__(110).f;\nvar gOPD = __webpack_require__(59).f;\nvar dP = __webpack_require__(31).f;\nvar $trim = __webpack_require__(132).trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(109)(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0);\n    var third, radix, maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n        default: return +it;\n      }\n      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof $Number\n      // check on 1..constructor(foo) case\n      && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n        ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n  };\n  for (var keys = __webpack_require__(27) ? gOPN(Base) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES6 (in case, if modules with ES6 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (has(Base, key = keys[j]) && !has($Number, key)) {\n      dP($Number, key, gOPD(Base, key));\n    }\n  }\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  __webpack_require__(50)(global, NUMBER, $Number);\n}\n\n\n/***/ }),\n/* 1623 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toInteger = __webpack_require__(67);\nvar aNumberValue = __webpack_require__(697);\nvar repeat = __webpack_require__(332);\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n  var i = -1;\n  var c2 = c;\n  while (++i < 6) {\n    c2 += n * data[i];\n    data[i] = c2 % 1e7;\n    c2 = floor(c2 / 1e7);\n  }\n};\nvar divide = function (n) {\n  var i = 6;\n  var c = 0;\n  while (--i >= 0) {\n    c += data[i];\n    data[i] = floor(c / n);\n    c = (c % n) * 1e7;\n  }\n};\nvar numToString = function () {\n  var i = 6;\n  var s = '';\n  while (--i >= 0) {\n    if (s !== '' || i === 0 || data[i] !== 0) {\n      var t = String(data[i]);\n      s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n    }\n  } return s;\n};\nvar pow = function (x, n, acc) {\n  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n  var n = 0;\n  var x2 = x;\n  while (x2 >= 4096) {\n    n += 12;\n    x2 /= 4096;\n  }\n  while (x2 >= 2) {\n    n += 1;\n    x2 /= 2;\n  } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n  0.00008.toFixed(3) !== '0.000' ||\n  0.9.toFixed(0) !== '1' ||\n  1.255.toFixed(2) !== '1.25' ||\n  1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !__webpack_require__(19)(function () {\n  // V8 ~ Android 4.3-\n  $toFixed.call({});\n})), 'Number', {\n  toFixed: function toFixed(fractionDigits) {\n    var x = aNumberValue(this, ERROR);\n    var f = toInteger(fractionDigits);\n    var s = '';\n    var m = ZERO;\n    var e, z, j, k;\n    if (f < 0 || f > 20) throw RangeError(ERROR);\n    // eslint-disable-next-line no-self-compare\n    if (x != x) return 'NaN';\n    if (x <= -1e21 || x >= 1e21) return String(x);\n    if (x < 0) {\n      s = '-';\n      x = -x;\n    }\n    if (x > 1e-21) {\n      e = log(x * pow(2, 69, 1)) - 69;\n      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n      z *= 0x10000000000000;\n      e = 52 - e;\n      if (e > 0) {\n        multiply(0, z);\n        j = f;\n        while (j >= 7) {\n          multiply(1e7, 0);\n          j -= 7;\n        }\n        multiply(pow(10, j, 1), 0);\n        j = e - 1;\n        while (j >= 23) {\n          divide(1 << 23);\n          j -= 23;\n        }\n        divide(1 << j);\n        multiply(1, 1);\n        divide(2);\n        m = numToString();\n      } else {\n        multiply(0, z);\n        multiply(1 << -e, 0);\n        m = numToString() + repeat.call(ZERO, f);\n      }\n    }\n    if (f > 0) {\n      k = m.length;\n      m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n    } else {\n      m = s + m;\n    } return m;\n  }\n});\n\n\n/***/ }),\n/* 1624 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $fails = __webpack_require__(19);\nvar aNumberValue = __webpack_require__(697);\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n  // IE7-\n  return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n  // V8 ~ Android 4.3-\n  $toPrecision.call({});\n})), 'Number', {\n  toPrecision: function toPrecision(precision) {\n    var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n    return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n  }\n});\n\n\n/***/ }),\n/* 1625 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n/***/ }),\n/* 1626 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(4);\nvar _isFinite = __webpack_require__(16).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n/* 1627 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(698) });\n\n\n/***/ }),\n/* 1628 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n/***/ }),\n/* 1629 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(4);\nvar isInteger = __webpack_require__(698);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n/***/ }),\n/* 1630 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n/***/ }),\n/* 1631 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n/***/ }),\n/* 1632 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar $parseFloat = __webpack_require__(696);\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n\n\n/***/ }),\n/* 1633 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar $parseInt = __webpack_require__(695);\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n\n\n/***/ }),\n/* 1634 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(4);\nvar log1p = __webpack_require__(699);\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n  // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n  && Math.floor($acosh(Number.MAX_VALUE)) == 710\n  // Tor Browser bug: Math.acosh(Infinity) -> NaN\n  && $acosh(Infinity) == Infinity\n), 'Math', {\n  acosh: function acosh(x) {\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156\n      ? Math.log(x) + Math.LN2\n      : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n\n\n/***/ }),\n/* 1635 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(4);\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n\n\n/***/ }),\n/* 1636 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(4);\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n  atanh: function atanh(x) {\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n\n\n/***/ }),\n/* 1637 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(4);\nvar sign = __webpack_require__(333);\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x) {\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n\n\n/***/ }),\n/* 1638 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x) {\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n\n\n/***/ }),\n/* 1639 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(4);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n  cosh: function cosh(x) {\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n\n\n/***/ }),\n/* 1640 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(4);\nvar $expm1 = __webpack_require__(334);\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n\n\n/***/ }),\n/* 1641 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.16 Math.fround(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { fround: __webpack_require__(700) });\n\n\n/***/ }),\n/* 1642 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpack_require__(4);\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n    var sum = 0;\n    var i = 0;\n    var aLen = arguments.length;\n    var larg = 0;\n    var arg, div;\n    while (i < aLen) {\n      arg = abs(arguments[i++]);\n      if (larg < arg) {\n        div = larg / arg;\n        sum = sum * div * div + 1;\n        larg = arg;\n      } else if (arg > 0) {\n        div = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n\n\n/***/ }),\n/* 1643 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(4);\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * __webpack_require__(19)(function () {\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y) {\n    var UINT16 = 0xffff;\n    var xn = +x;\n    var yn = +y;\n    var xl = UINT16 & xn;\n    var yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n\n\n/***/ }),\n/* 1644 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  log10: function log10(x) {\n    return Math.log(x) * Math.LOG10E;\n  }\n});\n\n\n/***/ }),\n/* 1645 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { log1p: __webpack_require__(699) });\n\n\n/***/ }),\n/* 1646 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n\n\n/***/ }),\n/* 1647 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { sign: __webpack_require__(333) });\n\n\n/***/ }),\n/* 1648 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(4);\nvar expm1 = __webpack_require__(334);\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * __webpack_require__(19)(function () {\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x) {\n    return Math.abs(x = +x) < 1\n      ? (expm1(x) - expm1(-x)) / 2\n      : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n\n\n/***/ }),\n/* 1649 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(4);\nvar expm1 = __webpack_require__(334);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n  tanh: function tanh(x) {\n    var a = expm1(x = +x);\n    var b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n\n\n/***/ }),\n/* 1650 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it) {\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n\n\n/***/ }),\n/* 1651 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar toAbsoluteIndex = __webpack_require__(108);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 1652 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar toIObject = __webpack_require__(58);\nvar toLength = __webpack_require__(25);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 1653 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.1.3.25 String.prototype.trim()\n__webpack_require__(132)('trim', function ($trim) {\n  return function trim() {\n    return $trim(this, 3);\n  };\n});\n\n\n/***/ }),\n/* 1654 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $at = __webpack_require__(232)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(335)(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n\n\n/***/ }),\n/* 1655 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $at = __webpack_require__(232)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 1656 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(4);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(337);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(338)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n/***/ }),\n/* 1657 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(4);\nvar context = __webpack_require__(337);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(338)(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n/***/ }),\n/* 1658 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(332)\n});\n\n\n/***/ }),\n/* 1659 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(4);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(337);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(338)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n/***/ }),\n/* 1660 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.2 String.prototype.anchor(name)\n__webpack_require__(51)('anchor', function (createHTML) {\n  return function anchor(name) {\n    return createHTML(this, 'a', 'name', name);\n  };\n});\n\n\n/***/ }),\n/* 1661 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.3 String.prototype.big()\n__webpack_require__(51)('big', function (createHTML) {\n  return function big() {\n    return createHTML(this, 'big', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1662 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.4 String.prototype.blink()\n__webpack_require__(51)('blink', function (createHTML) {\n  return function blink() {\n    return createHTML(this, 'blink', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1663 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.5 String.prototype.bold()\n__webpack_require__(51)('bold', function (createHTML) {\n  return function bold() {\n    return createHTML(this, 'b', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1664 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.6 String.prototype.fixed()\n__webpack_require__(51)('fixed', function (createHTML) {\n  return function fixed() {\n    return createHTML(this, 'tt', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1665 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.7 String.prototype.fontcolor(color)\n__webpack_require__(51)('fontcolor', function (createHTML) {\n  return function fontcolor(color) {\n    return createHTML(this, 'font', 'color', color);\n  };\n});\n\n\n/***/ }),\n/* 1666 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.8 String.prototype.fontsize(size)\n__webpack_require__(51)('fontsize', function (createHTML) {\n  return function fontsize(size) {\n    return createHTML(this, 'font', 'size', size);\n  };\n});\n\n\n/***/ }),\n/* 1667 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.9 String.prototype.italics()\n__webpack_require__(51)('italics', function (createHTML) {\n  return function italics() {\n    return createHTML(this, 'i', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1668 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.10 String.prototype.link(url)\n__webpack_require__(51)('link', function (createHTML) {\n  return function link(url) {\n    return createHTML(this, 'a', 'href', url);\n  };\n});\n\n\n/***/ }),\n/* 1669 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.11 String.prototype.small()\n__webpack_require__(51)('small', function (createHTML) {\n  return function small() {\n    return createHTML(this, 'small', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1670 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.12 String.prototype.strike()\n__webpack_require__(51)('strike', function (createHTML) {\n  return function strike() {\n    return createHTML(this, 'strike', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1671 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.13 String.prototype.sub()\n__webpack_require__(51)('sub', function (createHTML) {\n  return function sub() {\n    return createHTML(this, 'sub', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1672 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// B.2.3.14 String.prototype.sup()\n__webpack_require__(51)('sup', function (createHTML) {\n  return function sup() {\n    return createHTML(this, 'sup', '', '');\n  };\n});\n\n\n/***/ }),\n/* 1673 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n\n\n/***/ }),\n/* 1674 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar toPrimitive = __webpack_require__(73);\n\n$export($export.P + $export.F * __webpack_require__(19)(function () {\n  return new Date(NaN).toJSON() !== null\n    || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n  // eslint-disable-next-line no-unused-vars\n  toJSON: function toJSON(key) {\n    var O = toObject(this);\n    var pv = toPrimitive(O);\n    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n  }\n});\n\n\n/***/ }),\n/* 1675 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = __webpack_require__(4);\nvar toISOString = __webpack_require__(1676);\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n  toISOString: toISOString\n});\n\n\n/***/ }),\n/* 1676 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = __webpack_require__(19);\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n  return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n  return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n  $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n  var d = this;\n  var y = d.getUTCFullYear();\n  var m = d.getUTCMilliseconds();\n  var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n  return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n    '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n    'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n    ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n\n\n/***/ }),\n/* 1677 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n  __webpack_require__(50)(DateProto, TO_STRING, function toString() {\n    var value = getTime.call(this);\n    // eslint-disable-next-line no-self-compare\n    return value === value ? $toString.call(this) : INVALID_DATE;\n  });\n}\n\n\n/***/ }),\n/* 1678 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar TO_PRIMITIVE = __webpack_require__(23)('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) __webpack_require__(49)(proto, TO_PRIMITIVE, __webpack_require__(1679));\n\n\n/***/ }),\n/* 1679 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar anObject = __webpack_require__(13);\nvar toPrimitive = __webpack_require__(73);\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n  if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n  return toPrimitive(anObject(this), hint != NUMBER);\n};\n\n\n/***/ }),\n/* 1680 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Array', { isArray: __webpack_require__(231) });\n\n\n/***/ }),\n/* 1681 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(65);\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar call = __webpack_require__(701);\nvar isArrayIter = __webpack_require__(339);\nvar toLength = __webpack_require__(25);\nvar createProperty = __webpack_require__(340);\nvar getIterFn = __webpack_require__(341);\n\n$export($export.S + $export.F * !__webpack_require__(234)(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 1682 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar createProperty = __webpack_require__(340);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(19)(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 1683 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = __webpack_require__(4);\nvar toIObject = __webpack_require__(58);\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (__webpack_require__(170) != Object || !__webpack_require__(68)(arrayJoin)), 'Array', {\n  join: function join(separator) {\n    return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n\n/***/ }),\n/* 1684 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar html = __webpack_require__(328);\nvar cof = __webpack_require__(66);\nvar toAbsoluteIndex = __webpack_require__(108);\nvar toLength = __webpack_require__(25);\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * __webpack_require__(19)(function () {\n  if (html) arraySlice.call(html);\n}), 'Array', {\n  slice: function slice(begin, end) {\n    var len = toLength(this.length);\n    var klass = cof(this);\n    end = end === undefined ? len : end;\n    if (klass == 'Array') return arraySlice.call(this, begin, end);\n    var start = toAbsoluteIndex(begin, len);\n    var upTo = toAbsoluteIndex(end, len);\n    var size = toLength(upTo - start);\n    var cloned = new Array(size);\n    var i = 0;\n    for (; i < size; i++) cloned[i] = klass == 'String'\n      ? this.charAt(start + i)\n      : this[start + i];\n    return cloned;\n  }\n});\n\n\n/***/ }),\n/* 1685 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar aFunction = __webpack_require__(46);\nvar toObject = __webpack_require__(32);\nvar fails = __webpack_require__(19);\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n  // IE8-\n  test.sort(undefined);\n}) || !fails(function () {\n  // V8 bug\n  test.sort(null);\n  // Old WebKit\n}) || !__webpack_require__(68)($sort)), 'Array', {\n  // 22.1.3.25 Array.prototype.sort(comparefn)\n  sort: function sort(comparefn) {\n    return comparefn === undefined\n      ? $sort.call(toObject(this))\n      : $sort.call(toObject(this), aFunction(comparefn));\n  }\n});\n\n\n/***/ }),\n/* 1686 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $forEach = __webpack_require__(76)(0);\nvar STRICT = __webpack_require__(68)([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: function forEach(callbackfn /* , thisArg */) {\n    return $forEach(this, callbackfn, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1687 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(20);\nvar isArray = __webpack_require__(231);\nvar SPECIES = __webpack_require__(23)('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n/***/ }),\n/* 1688 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $map = __webpack_require__(76)(1);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].map, true), 'Array', {\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: function map(callbackfn /* , thisArg */) {\n    return $map(this, callbackfn, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1689 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $filter = __webpack_require__(76)(2);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].filter, true), 'Array', {\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: function filter(callbackfn /* , thisArg */) {\n    return $filter(this, callbackfn, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1690 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $some = __webpack_require__(76)(3);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].some, true), 'Array', {\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: function some(callbackfn /* , thisArg */) {\n    return $some(this, callbackfn, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1691 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $every = __webpack_require__(76)(4);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].every, true), 'Array', {\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: function every(callbackfn /* , thisArg */) {\n    return $every(this, callbackfn, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1692 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $reduce = __webpack_require__(702);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].reduce, true), 'Array', {\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n  }\n});\n\n\n/***/ }),\n/* 1693 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $reduce = __webpack_require__(702);\n\n$export($export.P + $export.F * !__webpack_require__(68)([].reduceRight, true), 'Array', {\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n  }\n});\n\n\n/***/ }),\n/* 1694 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $indexOf = __webpack_require__(229)(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(68)($native)), 'Array', {\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n    return NEGATIVE_ZERO\n      // convert -0 to +0\n      ? $native.apply(this, arguments) || 0\n      : $indexOf(this, searchElement, arguments[1]);\n  }\n});\n\n\n/***/ }),\n/* 1695 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toIObject = __webpack_require__(58);\nvar toInteger = __webpack_require__(67);\nvar toLength = __webpack_require__(25);\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(68)($native)), 'Array', {\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n    // convert -0 to +0\n    if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n    var O = toIObject(this);\n    var length = toLength(O.length);\n    var index = length - 1;\n    if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n    if (index < 0) index = length + index;\n    for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n    return -1;\n  }\n});\n\n\n/***/ }),\n/* 1696 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(4);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(703) });\n\n__webpack_require__(96)('copyWithin');\n\n\n/***/ }),\n/* 1697 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(4);\n\n$export($export.P, 'Array', { fill: __webpack_require__(343) });\n\n__webpack_require__(96)('fill');\n\n\n/***/ }),\n/* 1698 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(4);\nvar $find = __webpack_require__(76)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(96)(KEY);\n\n\n/***/ }),\n/* 1699 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(4);\nvar $find = __webpack_require__(76)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(96)(KEY);\n\n\n/***/ }),\n/* 1700 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(111)('Array');\n\n\n/***/ }),\n/* 1701 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(16);\nvar inheritIfRequired = __webpack_require__(331);\nvar dP = __webpack_require__(31).f;\nvar gOPN = __webpack_require__(110).f;\nvar isRegExp = __webpack_require__(233);\nvar $flags = __webpack_require__(172);\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(27) && (!CORRECT_NEW || __webpack_require__(19)(function () {\n  re2[__webpack_require__(23)('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var tiRE = this instanceof $RegExp;\n    var piRE = isRegExp(p);\n    var fiU = f === undefined;\n    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n      : inheritIfRequired(CORRECT_NEW\n        ? new Base(piRE && !fiU ? p.source : p, f)\n        : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n      , tiRE ? this : proto, $RegExp);\n  };\n  var proxy = function (key) {\n    key in $RegExp || dP($RegExp, key, {\n      configurable: true,\n      get: function () { return Base[key]; },\n      set: function (it) { Base[key] = it; }\n    });\n  };\n  for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  __webpack_require__(50)(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(111)('RegExp');\n\n\n/***/ }),\n/* 1702 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n__webpack_require__(706);\nvar anObject = __webpack_require__(13);\nvar $flags = __webpack_require__(172);\nvar DESCRIPTORS = __webpack_require__(27);\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n  __webpack_require__(50)(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (__webpack_require__(19)(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n  define(function toString() {\n    var R = anObject(this);\n    return '/'.concat(R.source, '/',\n      'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n  });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n  define(function toString() {\n    return $toString.call(this);\n  });\n}\n\n\n/***/ }),\n/* 1703 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(13);\nvar toLength = __webpack_require__(25);\nvar advanceStringIndex = __webpack_require__(346);\nvar regExpExec = __webpack_require__(235);\n\n// @@match logic\n__webpack_require__(236)('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[MATCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n    function (regexp) {\n      var res = maybeCallNative($match, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      if (!rx.global) return regExpExec(rx, S);\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = String(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n\n\n/***/ }),\n/* 1704 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(13);\nvar toObject = __webpack_require__(32);\nvar toLength = __webpack_require__(25);\nvar toInteger = __webpack_require__(67);\nvar advanceStringIndex = __webpack_require__(346);\nvar regExpExec = __webpack_require__(235);\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(236)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = defined(this);\n      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n      return fn !== undefined\n        ? fn.call(searchValue, O, replaceValue)\n        : $replace.call(String(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n    function (regexp, replaceValue) {\n      var res = maybeCallNative($replace, regexp, this, replaceValue);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var functionalReplace = typeof replaceValue === 'function';\n      if (!functionalReplace) replaceValue = String(replaceValue);\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n        results.push(result);\n        if (!global) break;\n        var matchStr = String(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n        var matched = String(result[0]);\n        var position = max(min(toInteger(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = [matched].concat(captures, position, S);\n          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + S.slice(nextSourcePosition);\n    }\n  ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n      switch (ch.charAt(0)) {\n        case '$': return '$';\n        case '&': return matched;\n        case '`': return str.slice(0, position);\n        case \"'\": return str.slice(tailPos);\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n        default: // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n          capture = captures[n - 1];\n      }\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n\n\n/***/ }),\n/* 1705 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(13);\nvar sameValue = __webpack_require__(692);\nvar regExpExec = __webpack_require__(235);\n\n// @@search logic\n__webpack_require__(236)('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n  return [\n    // `String.prototype.search` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.search\n    function search(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[SEARCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n    },\n    // `RegExp.prototype[@@search]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n    function (regexp) {\n      var res = maybeCallNative($search, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      var previousLastIndex = rx.lastIndex;\n      if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n      var result = regExpExec(rx, S);\n      if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n      return result === null ? -1 : result.index;\n    }\n  ];\n});\n\n\n/***/ }),\n/* 1706 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar isRegExp = __webpack_require__(233);\nvar anObject = __webpack_require__(13);\nvar speciesConstructor = __webpack_require__(173);\nvar advanceStringIndex = __webpack_require__(346);\nvar toLength = __webpack_require__(25);\nvar callRegExpExec = __webpack_require__(235);\nvar regexpExec = __webpack_require__(345);\nvar fails = __webpack_require__(19);\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\n__webpack_require__(236)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n  var internalSplit;\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    // based on es5-shim implementation, need to rework it\n    internalSplit = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return $split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var match, lastIndex, lastLength;\n      while (match = regexpExec.call(separatorCopy, string)) {\n        lastIndex = separatorCopy[LAST_INDEX];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    internalSplit = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n    };\n  } else {\n    internalSplit = $split;\n  }\n\n  return [\n    // `String.prototype.split` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.split\n    function split(separator, limit) {\n      var O = defined(this);\n      var splitter = separator == undefined ? undefined : separator[SPLIT];\n      return splitter !== undefined\n        ? splitter.call(separator, O, limit)\n        : internalSplit.call(String(O), separator, limit);\n    },\n    // `RegExp.prototype[@@split]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n    //\n    // NOTE: This cannot be properly polyfilled in engines that don't support\n    // the 'y' flag.\n    function (regexp, limit) {\n      var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var C = speciesConstructor(rx, RegExp);\n\n      var unicodeMatching = rx.unicode;\n      var flags = (rx.ignoreCase ? 'i' : '') +\n                  (rx.multiline ? 'm' : '') +\n                  (rx.unicode ? 'u' : '') +\n                  (SUPPORTS_Y ? 'y' : 'g');\n\n      // ^(? + rx + ) is needed, in combination with some S slicing, to\n      // simulate the 'y' flag.\n      var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n      var p = 0;\n      var q = 0;\n      var A = [];\n      while (q < S.length) {\n        splitter.lastIndex = SUPPORTS_Y ? q : 0;\n        var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n        var e;\n        if (\n          z === null ||\n          (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n        ) {\n          q = advanceStringIndex(S, q, unicodeMatching);\n        } else {\n          A.push(S.slice(p, q));\n          if (A.length === lim) return A;\n          for (var i = 1; i <= z.length - 1; i++) {\n            A.push(z[i]);\n            if (A.length === lim) return A;\n          }\n          q = p = e;\n        }\n      }\n      A.push(S.slice(p));\n      return A;\n    }\n  ];\n});\n\n\n/***/ }),\n/* 1707 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(94);\nvar global = __webpack_require__(16);\nvar ctx = __webpack_require__(65);\nvar classof = __webpack_require__(131);\nvar $export = __webpack_require__(4);\nvar isObject = __webpack_require__(20);\nvar aFunction = __webpack_require__(46);\nvar anInstance = __webpack_require__(112);\nvar forOf = __webpack_require__(113);\nvar speciesConstructor = __webpack_require__(173);\nvar task = __webpack_require__(347).set;\nvar microtask = __webpack_require__(348)();\nvar newPromiseCapabilityModule = __webpack_require__(349);\nvar perform = __webpack_require__(707);\nvar userAgent = __webpack_require__(237);\nvar promiseResolve = __webpack_require__(708);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(23)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(114)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(130)($Promise, PROMISE);\n__webpack_require__(111)(PROMISE);\nWrapper = __webpack_require__(64)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(234)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 1708 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar weak = __webpack_require__(713);\nvar validate = __webpack_require__(115);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(238)(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n/***/ }),\n/* 1709 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar $typed = __webpack_require__(239);\nvar buffer = __webpack_require__(350);\nvar anObject = __webpack_require__(13);\nvar toAbsoluteIndex = __webpack_require__(108);\nvar toLength = __webpack_require__(25);\nvar isObject = __webpack_require__(20);\nvar ArrayBuffer = __webpack_require__(16).ArrayBuffer;\nvar speciesConstructor = __webpack_require__(173);\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n  // 24.1.3.1 ArrayBuffer.isView(arg)\n  isView: function isView(it) {\n    return $isView && $isView(it) || isObject(it) && VIEW in it;\n  }\n});\n\n$export($export.P + $export.U + $export.F * __webpack_require__(19)(function () {\n  return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n  // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n  slice: function slice(start, end) {\n    if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n    var len = anObject(this).byteLength;\n    var first = toAbsoluteIndex(start, len);\n    var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n    var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n    var viewS = new $DataView(this);\n    var viewT = new $DataView(result);\n    var index = 0;\n    while (first < fin) {\n      viewT.setUint8(index++, viewS.getUint8(first++));\n    } return result;\n  }\n});\n\n__webpack_require__(111)(ARRAY_BUFFER);\n\n\n/***/ }),\n/* 1710 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\n$export($export.G + $export.W + $export.F * !__webpack_require__(239).ABV, {\n  DataView: __webpack_require__(350).DataView\n});\n\n\n/***/ }),\n/* 1711 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Int8', 1, function (init) {\n  return function Int8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1712 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Uint8', 1, function (init) {\n  return function Uint8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1713 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Uint8', 1, function (init) {\n  return function Uint8ClampedArray(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n}, true);\n\n\n/***/ }),\n/* 1714 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Int16', 2, function (init) {\n  return function Int16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1715 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Uint16', 2, function (init) {\n  return function Uint16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1716 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Int32', 4, function (init) {\n  return function Int32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1717 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Uint32', 4, function (init) {\n  return function Uint32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1718 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Float32', 4, function (init) {\n  return function Float32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1719 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(84)('Float64', 8, function (init) {\n  return function Float64Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n/***/ }),\n/* 1720 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = __webpack_require__(4);\nvar aFunction = __webpack_require__(46);\nvar anObject = __webpack_require__(13);\nvar rApply = (__webpack_require__(16).Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !__webpack_require__(19)(function () {\n  rApply(function () { /* empty */ });\n}), 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList) {\n    var T = aFunction(target);\n    var L = anObject(argumentsList);\n    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n  }\n});\n\n\n/***/ }),\n/* 1721 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = __webpack_require__(4);\nvar create = __webpack_require__(109);\nvar aFunction = __webpack_require__(46);\nvar anObject = __webpack_require__(13);\nvar isObject = __webpack_require__(20);\nvar fails = __webpack_require__(19);\nvar bind = __webpack_require__(693);\nvar rConstruct = (__webpack_require__(16).Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n  function F() { /* empty */ }\n  return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n  rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n  construct: function construct(Target, args /* , newTarget */) {\n    aFunction(Target);\n    anObject(args);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n    if (Target == newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      switch (args.length) {\n        case 0: return new Target();\n        case 1: return new Target(args[0]);\n        case 2: return new Target(args[0], args[1]);\n        case 3: return new Target(args[0], args[1], args[2]);\n        case 4: return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args))();\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto = newTarget.prototype;\n    var instance = create(isObject(proto) ? proto : Object.prototype);\n    var result = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n\n\n/***/ }),\n/* 1722 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = __webpack_require__(31);\nvar $export = __webpack_require__(4);\nvar anObject = __webpack_require__(13);\nvar toPrimitive = __webpack_require__(73);\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * __webpack_require__(19)(function () {\n  // eslint-disable-next-line no-undef\n  Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes) {\n    anObject(target);\n    propertyKey = toPrimitive(propertyKey, true);\n    anObject(attributes);\n    try {\n      dP.f(target, propertyKey, attributes);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n/***/ }),\n/* 1723 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = __webpack_require__(4);\nvar gOPD = __webpack_require__(59).f;\nvar anObject = __webpack_require__(13);\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey) {\n    var desc = gOPD(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n\n\n/***/ }),\n/* 1724 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 26.1.5 Reflect.enumerate(target)\nvar $export = __webpack_require__(4);\nvar anObject = __webpack_require__(13);\nvar Enumerate = function (iterated) {\n  this._t = anObject(iterated); // target\n  this._i = 0;                  // next index\n  var keys = this._k = [];      // keys\n  var key;\n  for (key in iterated) keys.push(key);\n};\n__webpack_require__(336)(Enumerate, 'Object', function () {\n  var that = this;\n  var keys = that._k;\n  var key;\n  do {\n    if (that._i >= keys.length) return { value: undefined, done: true };\n  } while (!((key = keys[that._i++]) in that._t));\n  return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target) {\n    return new Enumerate(target);\n  }\n});\n\n\n/***/ }),\n/* 1725 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = __webpack_require__(59);\nvar getPrototypeOf = __webpack_require__(60);\nvar has = __webpack_require__(57);\nvar $export = __webpack_require__(4);\nvar isObject = __webpack_require__(20);\nvar anObject = __webpack_require__(13);\n\nfunction get(target, propertyKey /* , receiver */) {\n  var receiver = arguments.length < 3 ? target : arguments[2];\n  var desc, proto;\n  if (anObject(target) === receiver) return target[propertyKey];\n  if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n    ? desc.value\n    : desc.get !== undefined\n      ? desc.get.call(receiver)\n      : undefined;\n  if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n\n\n/***/ }),\n/* 1726 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = __webpack_require__(59);\nvar $export = __webpack_require__(4);\nvar anObject = __webpack_require__(13);\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n    return gOPD.f(anObject(target), propertyKey);\n  }\n});\n\n\n/***/ }),\n/* 1727 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = __webpack_require__(4);\nvar getProto = __webpack_require__(60);\nvar anObject = __webpack_require__(13);\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target) {\n    return getProto(anObject(target));\n  }\n});\n\n\n/***/ }),\n/* 1728 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey) {\n    return propertyKey in target;\n  }\n});\n\n\n/***/ }),\n/* 1729 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.10 Reflect.isExtensible(target)\nvar $export = __webpack_require__(4);\nvar anObject = __webpack_require__(13);\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target) {\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n\n\n/***/ }),\n/* 1730 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Reflect', { ownKeys: __webpack_require__(715) });\n\n\n/***/ }),\n/* 1731 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.12 Reflect.preventExtensions(target)\nvar $export = __webpack_require__(4);\nvar anObject = __webpack_require__(13);\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target) {\n    anObject(target);\n    try {\n      if ($preventExtensions) $preventExtensions(target);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n/***/ }),\n/* 1732 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = __webpack_require__(31);\nvar gOPD = __webpack_require__(59);\nvar getPrototypeOf = __webpack_require__(60);\nvar has = __webpack_require__(57);\nvar $export = __webpack_require__(4);\nvar createDesc = __webpack_require__(105);\nvar anObject = __webpack_require__(13);\nvar isObject = __webpack_require__(20);\n\nfunction set(target, propertyKey, V /* , receiver */) {\n  var receiver = arguments.length < 4 ? target : arguments[3];\n  var ownDesc = gOPD.f(anObject(target), propertyKey);\n  var existingDescriptor, proto;\n  if (!ownDesc) {\n    if (isObject(proto = getPrototypeOf(target))) {\n      return set(proto, propertyKey, V, receiver);\n    }\n    ownDesc = createDesc(0);\n  }\n  if (has(ownDesc, 'value')) {\n    if (ownDesc.writable === false || !isObject(receiver)) return false;\n    if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n      existingDescriptor.value = V;\n      dP.f(receiver, propertyKey, existingDescriptor);\n    } else dP.f(receiver, propertyKey, createDesc(0, V));\n    return true;\n  }\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n\n\n/***/ }),\n/* 1733 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = __webpack_require__(4);\nvar setProto = __webpack_require__(329);\n\nif (setProto) $export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto) {\n    setProto.check(target, proto);\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n/***/ }),\n/* 1734 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(4);\nvar $includes = __webpack_require__(229)(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(96)('includes');\n\n\n/***/ }),\n/* 1735 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\nvar $export = __webpack_require__(4);\nvar flattenIntoArray = __webpack_require__(716);\nvar toObject = __webpack_require__(32);\nvar toLength = __webpack_require__(25);\nvar aFunction = __webpack_require__(46);\nvar arraySpeciesCreate = __webpack_require__(342);\n\n$export($export.P, 'Array', {\n  flatMap: function flatMap(callbackfn /* , thisArg */) {\n    var O = toObject(this);\n    var sourceLen, A;\n    aFunction(callbackfn);\n    sourceLen = toLength(O.length);\n    A = arraySpeciesCreate(O, 0);\n    flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n    return A;\n  }\n});\n\n__webpack_require__(96)('flatMap');\n\n\n/***/ }),\n/* 1736 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten\nvar $export = __webpack_require__(4);\nvar flattenIntoArray = __webpack_require__(716);\nvar toObject = __webpack_require__(32);\nvar toLength = __webpack_require__(25);\nvar toInteger = __webpack_require__(67);\nvar arraySpeciesCreate = __webpack_require__(342);\n\n$export($export.P, 'Array', {\n  flatten: function flatten(/* depthArg = 1 */) {\n    var depthArg = arguments[0];\n    var O = toObject(this);\n    var sourceLen = toLength(O.length);\n    var A = arraySpeciesCreate(O, 0);\n    flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n    return A;\n  }\n});\n\n__webpack_require__(96)('flatten');\n\n\n/***/ }),\n/* 1737 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/mathiasbynens/String.prototype.at\nvar $export = __webpack_require__(4);\nvar $at = __webpack_require__(232)(true);\n\n$export($export.P, 'String', {\n  at: function at(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 1738 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(4);\nvar $pad = __webpack_require__(717);\nvar userAgent = __webpack_require__(237);\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n/***/ }),\n/* 1739 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(4);\nvar $pad = __webpack_require__(717);\nvar userAgent = __webpack_require__(237);\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n/***/ }),\n/* 1740 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__webpack_require__(132)('trimLeft', function ($trim) {\n  return function trimLeft() {\n    return $trim(this, 1);\n  };\n}, 'trimStart');\n\n\n/***/ }),\n/* 1741 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__webpack_require__(132)('trimRight', function ($trim) {\n  return function trimRight() {\n    return $trim(this, 2);\n  };\n}, 'trimEnd');\n\n\n/***/ }),\n/* 1742 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://tc39.github.io/String.prototype.matchAll/\nvar $export = __webpack_require__(4);\nvar defined = __webpack_require__(74);\nvar toLength = __webpack_require__(25);\nvar isRegExp = __webpack_require__(233);\nvar getFlags = __webpack_require__(172);\nvar RegExpProto = RegExp.prototype;\n\nvar $RegExpStringIterator = function (regexp, string) {\n  this._r = regexp;\n  this._s = string;\n};\n\n__webpack_require__(336)($RegExpStringIterator, 'RegExp String', function next() {\n  var match = this._r.exec(this._s);\n  return { value: match, done: match === null };\n});\n\n$export($export.P, 'String', {\n  matchAll: function matchAll(regexp) {\n    defined(this);\n    if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');\n    var S = String(this);\n    var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);\n    var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);\n    rx.lastIndex = toLength(regexp.lastIndex);\n    return new $RegExpStringIterator(rx, S);\n  }\n});\n\n\n/***/ }),\n/* 1743 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(325)('asyncIterator');\n\n\n/***/ }),\n/* 1744 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(325)('observable');\n\n\n/***/ }),\n/* 1745 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(4);\nvar ownKeys = __webpack_require__(715);\nvar toIObject = __webpack_require__(58);\nvar gOPD = __webpack_require__(59);\nvar createProperty = __webpack_require__(340);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 1746 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(4);\nvar $values = __webpack_require__(718)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n/***/ }),\n/* 1747 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(4);\nvar $entries = __webpack_require__(718)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n/***/ }),\n/* 1748 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar aFunction = __webpack_require__(46);\nvar $defineProperty = __webpack_require__(31);\n\n// B.2.2.2 Object.prototype.__defineGetter__(P, getter)\n__webpack_require__(27) && $export($export.P + __webpack_require__(240), 'Object', {\n  __defineGetter__: function __defineGetter__(P, getter) {\n    $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n  }\n});\n\n\n/***/ }),\n/* 1749 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar aFunction = __webpack_require__(46);\nvar $defineProperty = __webpack_require__(31);\n\n// B.2.2.3 Object.prototype.__defineSetter__(P, setter)\n__webpack_require__(27) && $export($export.P + __webpack_require__(240), 'Object', {\n  __defineSetter__: function __defineSetter__(P, setter) {\n    $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });\n  }\n});\n\n\n/***/ }),\n/* 1750 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar toPrimitive = __webpack_require__(73);\nvar getPrototypeOf = __webpack_require__(60);\nvar getOwnPropertyDescriptor = __webpack_require__(59).f;\n\n// B.2.2.4 Object.prototype.__lookupGetter__(P)\n__webpack_require__(27) && $export($export.P + __webpack_require__(240), 'Object', {\n  __lookupGetter__: function __lookupGetter__(P) {\n    var O = toObject(this);\n    var K = toPrimitive(P, true);\n    var D;\n    do {\n      if (D = getOwnPropertyDescriptor(O, K)) return D.get;\n    } while (O = getPrototypeOf(O));\n  }\n});\n\n\n/***/ }),\n/* 1751 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(4);\nvar toObject = __webpack_require__(32);\nvar toPrimitive = __webpack_require__(73);\nvar getPrototypeOf = __webpack_require__(60);\nvar getOwnPropertyDescriptor = __webpack_require__(59).f;\n\n// B.2.2.5 Object.prototype.__lookupSetter__(P)\n__webpack_require__(27) && $export($export.P + __webpack_require__(240), 'Object', {\n  __lookupSetter__: function __lookupSetter__(P) {\n    var O = toObject(this);\n    var K = toPrimitive(P, true);\n    var D;\n    do {\n      if (D = getOwnPropertyDescriptor(O, K)) return D.set;\n    } while (O = getPrototypeOf(O));\n  }\n});\n\n\n/***/ }),\n/* 1752 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = __webpack_require__(4);\n\n$export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(719)('Map') });\n\n\n/***/ }),\n/* 1753 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = __webpack_require__(4);\n\n$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(719)('Set') });\n\n\n/***/ }),\n/* 1754 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\n__webpack_require__(241)('Map');\n\n\n/***/ }),\n/* 1755 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\n__webpack_require__(241)('Set');\n\n\n/***/ }),\n/* 1756 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\n__webpack_require__(241)('WeakMap');\n\n\n/***/ }),\n/* 1757 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\n__webpack_require__(241)('WeakSet');\n\n\n/***/ }),\n/* 1758 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\n__webpack_require__(242)('Map');\n\n\n/***/ }),\n/* 1759 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\n__webpack_require__(242)('Set');\n\n\n/***/ }),\n/* 1760 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\n__webpack_require__(242)('WeakMap');\n\n\n/***/ }),\n/* 1761 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\n__webpack_require__(242)('WeakSet');\n\n\n/***/ }),\n/* 1762 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-global\nvar $export = __webpack_require__(4);\n\n$export($export.G, { global: __webpack_require__(16) });\n\n\n/***/ }),\n/* 1763 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-global\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'System', { global: __webpack_require__(16) });\n\n\n/***/ }),\n/* 1764 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/ljharb/proposal-is-error\nvar $export = __webpack_require__(4);\nvar cof = __webpack_require__(66);\n\n$export($export.S, 'Error', {\n  isError: function isError(it) {\n    return cof(it) === 'Error';\n  }\n});\n\n\n/***/ }),\n/* 1765 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  clamp: function clamp(x, lower, upper) {\n    return Math.min(upper, Math.max(lower, x));\n  }\n});\n\n\n/***/ }),\n/* 1766 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });\n\n\n/***/ }),\n/* 1767 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\nvar RAD_PER_DEG = 180 / Math.PI;\n\n$export($export.S, 'Math', {\n  degrees: function degrees(radians) {\n    return radians * RAD_PER_DEG;\n  }\n});\n\n\n/***/ }),\n/* 1768 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\nvar scale = __webpack_require__(721);\nvar fround = __webpack_require__(700);\n\n$export($export.S, 'Math', {\n  fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n    return fround(scale(x, inLow, inHigh, outLow, outHigh));\n  }\n});\n\n\n/***/ }),\n/* 1769 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  iaddh: function iaddh(x0, x1, y0, y1) {\n    var $x0 = x0 >>> 0;\n    var $x1 = x1 >>> 0;\n    var $y0 = y0 >>> 0;\n    return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n  }\n});\n\n\n/***/ }),\n/* 1770 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  isubh: function isubh(x0, x1, y0, y1) {\n    var $x0 = x0 >>> 0;\n    var $x1 = x1 >>> 0;\n    var $y0 = y0 >>> 0;\n    return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n  }\n});\n\n\n/***/ }),\n/* 1771 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  imulh: function imulh(u, v) {\n    var UINT16 = 0xffff;\n    var $u = +u;\n    var $v = +v;\n    var u0 = $u & UINT16;\n    var v0 = $v & UINT16;\n    var u1 = $u >> 16;\n    var v1 = $v >> 16;\n    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n    return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n  }\n});\n\n\n/***/ }),\n/* 1772 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });\n\n\n/***/ }),\n/* 1773 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\nvar DEG_PER_RAD = Math.PI / 180;\n\n$export($export.S, 'Math', {\n  radians: function radians(degrees) {\n    return degrees * DEG_PER_RAD;\n  }\n});\n\n\n/***/ }),\n/* 1774 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { scale: __webpack_require__(721) });\n\n\n/***/ }),\n/* 1775 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', {\n  umulh: function umulh(u, v) {\n    var UINT16 = 0xffff;\n    var $u = +u;\n    var $v = +v;\n    var u0 = $u & UINT16;\n    var v0 = $v & UINT16;\n    var u1 = $u >>> 16;\n    var v1 = $v >>> 16;\n    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n    return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n  }\n});\n\n\n/***/ }),\n/* 1776 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// http://jfbastien.github.io/papers/Math.signbit.html\nvar $export = __webpack_require__(4);\n\n$export($export.S, 'Math', { signbit: function signbit(x) {\n  // eslint-disable-next-line no-self-compare\n  return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;\n} });\n\n\n/***/ }),\n/* 1777 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(4);\nvar core = __webpack_require__(64);\nvar global = __webpack_require__(16);\nvar speciesConstructor = __webpack_require__(173);\nvar promiseResolve = __webpack_require__(708);\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n\n\n/***/ }),\n/* 1778 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-promise-try\nvar $export = __webpack_require__(4);\nvar newPromiseCapability = __webpack_require__(349);\nvar perform = __webpack_require__(707);\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n  var promiseCapability = newPromiseCapability.f(this);\n  var result = perform(callbackfn);\n  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n  return promiseCapability.promise;\n} });\n\n\n/***/ }),\n/* 1779 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar toMetaKey = metadata.key;\nvar ordinaryDefineOwnMetadata = metadata.set;\n\nmetadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {\n  ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));\n} });\n\n\n/***/ }),\n/* 1780 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar toMetaKey = metadata.key;\nvar getOrCreateMetadataMap = metadata.map;\nvar store = metadata.store;\n\nmetadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n  var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);\n  var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n  if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n  if (metadataMap.size) return true;\n  var targetMetadata = store.get(target);\n  targetMetadata['delete'](targetKey);\n  return !!targetMetadata.size || store['delete'](target);\n} });\n\n\n/***/ }),\n/* 1781 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar getPrototypeOf = __webpack_require__(60);\nvar ordinaryHasOwnMetadata = metadata.has;\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n  if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n  var parent = getPrototypeOf(O);\n  return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\nmetadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n/***/ }),\n/* 1782 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Set = __webpack_require__(711);\nvar from = __webpack_require__(720);\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar getPrototypeOf = __webpack_require__(60);\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nvar ordinaryMetadataKeys = function (O, P) {\n  var oKeys = ordinaryOwnMetadataKeys(O, P);\n  var parent = getPrototypeOf(O);\n  if (parent === null) return oKeys;\n  var pKeys = ordinaryMetadataKeys(parent, P);\n  return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;\n};\n\nmetadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n  return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n\n\n/***/ }),\n/* 1783 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryGetOwnMetadata(metadataKey, anObject(target)\n    , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n/***/ }),\n/* 1784 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n  return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n\n\n/***/ }),\n/* 1785 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar getPrototypeOf = __webpack_require__(60);\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n  if (hasOwn) return true;\n  var parent = getPrototypeOf(O);\n  return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\nmetadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n/***/ }),\n/* 1786 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryHasOwnMetadata(metadataKey, anObject(target)\n    , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n/***/ }),\n/* 1787 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $metadata = __webpack_require__(85);\nvar anObject = __webpack_require__(13);\nvar aFunction = __webpack_require__(46);\nvar toMetaKey = $metadata.key;\nvar ordinaryDefineOwnMetadata = $metadata.set;\n\n$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {\n  return function decorator(target, targetKey) {\n    ordinaryDefineOwnMetadata(\n      metadataKey, metadataValue,\n      (targetKey !== undefined ? anObject : aFunction)(target),\n      toMetaKey(targetKey)\n    );\n  };\n} });\n\n\n/***/ }),\n/* 1788 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask\nvar $export = __webpack_require__(4);\nvar microtask = __webpack_require__(348)();\nvar process = __webpack_require__(16).process;\nvar isNode = __webpack_require__(66)(process) == 'process';\n\n$export($export.G, {\n  asap: function asap(fn) {\n    var domain = isNode && process.domain;\n    microtask(domain ? domain.bind(fn) : fn);\n  }\n});\n\n\n/***/ }),\n/* 1789 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/zenparsing/es-observable\nvar $export = __webpack_require__(4);\nvar global = __webpack_require__(16);\nvar core = __webpack_require__(64);\nvar microtask = __webpack_require__(348)();\nvar OBSERVABLE = __webpack_require__(23)('observable');\nvar aFunction = __webpack_require__(46);\nvar anObject = __webpack_require__(13);\nvar anInstance = __webpack_require__(112);\nvar redefineAll = __webpack_require__(114);\nvar hide = __webpack_require__(49);\nvar forOf = __webpack_require__(113);\nvar RETURN = forOf.RETURN;\n\nvar getMethod = function (fn) {\n  return fn == null ? undefined : aFunction(fn);\n};\n\nvar cleanupSubscription = function (subscription) {\n  var cleanup = subscription._c;\n  if (cleanup) {\n    subscription._c = undefined;\n    cleanup();\n  }\n};\n\nvar subscriptionClosed = function (subscription) {\n  return subscription._o === undefined;\n};\n\nvar closeSubscription = function (subscription) {\n  if (!subscriptionClosed(subscription)) {\n    subscription._o = undefined;\n    cleanupSubscription(subscription);\n  }\n};\n\nvar Subscription = function (observer, subscriber) {\n  anObject(observer);\n  this._c = undefined;\n  this._o = observer;\n  observer = new SubscriptionObserver(this);\n  try {\n    var cleanup = subscriber(observer);\n    var subscription = cleanup;\n    if (cleanup != null) {\n      if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };\n      else aFunction(cleanup);\n      this._c = cleanup;\n    }\n  } catch (e) {\n    observer.error(e);\n    return;\n  } if (subscriptionClosed(this)) cleanupSubscription(this);\n};\n\nSubscription.prototype = redefineAll({}, {\n  unsubscribe: function unsubscribe() { closeSubscription(this); }\n});\n\nvar SubscriptionObserver = function (subscription) {\n  this._s = subscription;\n};\n\nSubscriptionObserver.prototype = redefineAll({}, {\n  next: function next(value) {\n    var subscription = this._s;\n    if (!subscriptionClosed(subscription)) {\n      var observer = subscription._o;\n      try {\n        var m = getMethod(observer.next);\n        if (m) return m.call(observer, value);\n      } catch (e) {\n        try {\n          closeSubscription(subscription);\n        } finally {\n          throw e;\n        }\n      }\n    }\n  },\n  error: function error(value) {\n    var subscription = this._s;\n    if (subscriptionClosed(subscription)) throw value;\n    var observer = subscription._o;\n    subscription._o = undefined;\n    try {\n      var m = getMethod(observer.error);\n      if (!m) throw value;\n      value = m.call(observer, value);\n    } catch (e) {\n      try {\n        cleanupSubscription(subscription);\n      } finally {\n        throw e;\n      }\n    } cleanupSubscription(subscription);\n    return value;\n  },\n  complete: function complete(value) {\n    var subscription = this._s;\n    if (!subscriptionClosed(subscription)) {\n      var observer = subscription._o;\n      subscription._o = undefined;\n      try {\n        var m = getMethod(observer.complete);\n        value = m ? m.call(observer, value) : undefined;\n      } catch (e) {\n        try {\n          cleanupSubscription(subscription);\n        } finally {\n          throw e;\n        }\n      } cleanupSubscription(subscription);\n      return value;\n    }\n  }\n});\n\nvar $Observable = function Observable(subscriber) {\n  anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);\n};\n\nredefineAll($Observable.prototype, {\n  subscribe: function subscribe(observer) {\n    return new Subscription(observer, this._f);\n  },\n  forEach: function forEach(fn) {\n    var that = this;\n    return new (core.Promise || global.Promise)(function (resolve, reject) {\n      aFunction(fn);\n      var subscription = that.subscribe({\n        next: function (value) {\n          try {\n            return fn(value);\n          } catch (e) {\n            reject(e);\n            subscription.unsubscribe();\n          }\n        },\n        error: reject,\n        complete: resolve\n      });\n    });\n  }\n});\n\nredefineAll($Observable, {\n  from: function from(x) {\n    var C = typeof this === 'function' ? this : $Observable;\n    var method = getMethod(anObject(x)[OBSERVABLE]);\n    if (method) {\n      var observable = anObject(method.call(x));\n      return observable.constructor === C ? observable : new C(function (observer) {\n        return observable.subscribe(observer);\n      });\n    }\n    return new C(function (observer) {\n      var done = false;\n      microtask(function () {\n        if (!done) {\n          try {\n            if (forOf(x, false, function (it) {\n              observer.next(it);\n              if (done) return RETURN;\n            }) === RETURN) return;\n          } catch (e) {\n            if (done) throw e;\n            observer.error(e);\n            return;\n          } observer.complete();\n        }\n      });\n      return function () { done = true; };\n    });\n  },\n  of: function of() {\n    for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];\n    return new (typeof this === 'function' ? this : $Observable)(function (observer) {\n      var done = false;\n      microtask(function () {\n        if (!done) {\n          for (var j = 0; j < items.length; ++j) {\n            observer.next(items[j]);\n            if (done) return;\n          } observer.complete();\n        }\n      });\n      return function () { done = true; };\n    });\n  }\n});\n\nhide($Observable.prototype, OBSERVABLE, function () { return this; });\n\n$export($export.G, { Observable: $Observable });\n\n__webpack_require__(111)('Observable');\n\n\n/***/ }),\n/* 1790 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// ie9- setTimeout & setInterval additional parameters fix\nvar global = __webpack_require__(16);\nvar $export = __webpack_require__(4);\nvar userAgent = __webpack_require__(237);\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n  return function (fn, time /* , ...args */) {\n    var boundArgs = arguments.length > 2;\n    var args = boundArgs ? slice.call(arguments, 2) : false;\n    return set(boundArgs ? function () {\n      // eslint-disable-next-line no-new-func\n      (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n    } : fn, time);\n  };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout: wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n\n\n/***/ }),\n/* 1791 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(4);\nvar $task = __webpack_require__(347);\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n/***/ }),\n/* 1792 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(344);\nvar getKeys = __webpack_require__(107);\nvar redefine = __webpack_require__(50);\nvar global = __webpack_require__(16);\nvar hide = __webpack_require__(49);\nvar Iterators = __webpack_require__(133);\nvar wks = __webpack_require__(23);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n/* 1793 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    if (typeof global.process === \"object\" && global.process.domain) {\n      invoke = global.process.domain.bind(invoke);\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // Among the various tricks for obtaining a reference to the global\n  // object, this seems to be the most reliable technique that does not\n  // use indirect eval (which violates Content Security Policy).\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this\n);\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(17)))\n\n/***/ }),\n/* 1794 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(1795);\nmodule.exports = __webpack_require__(64).RegExp.escape;\n\n\n/***/ }),\n/* 1795 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/benjamingr/RexExp.escape\nvar $export = __webpack_require__(4);\nvar $re = __webpack_require__(1796)(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });\n\n\n/***/ }),\n/* 1796 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (regExp, replace) {\n  var replacer = replace === Object(replace) ? function (part) {\n    return replace[part];\n  } : replace;\n  return function (it) {\n    return String(it).replace(regExp, replacer);\n  };\n};\n\n\n/***/ }),\n/* 1797 */,\n/* 1798 */,\n/* 1799 */,\n/* 1800 */,\n/* 1801 */,\n/* 1802 */,\n/* 1803 */,\n/* 1804 */,\n/* 1805 */,\n/* 1806 */,\n/* 1807 */,\n/* 1808 */,\n/* 1809 */,\n/* 1810 */,\n/* 1811 */,\n/* 1812 */,\n/* 1813 */,\n/* 1814 */,\n/* 1815 */,\n/* 1816 */,\n/* 1817 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _cookiesJs = __webpack_require__(174);\n\nvar _cookiesJs2 = _interopRequireDefault(_cookiesJs);\n\nvar _backbone = __webpack_require__(18);\n\nvar _backbone2 = _interopRequireDefault(_backbone);\n\nvar _jquery = __webpack_require__(9);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _i18n = __webpack_require__(176);\n\nvar _i18n2 = _interopRequireDefault(_i18n);\n\nvar _routes = __webpack_require__(740);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(1595);\n__webpack_require__(117).initialize();\n\n// :-( For jquery-ui which slickgrid depends on\n_backbone2.default.$ = window.jQuery = _jquery2.default;\n\nvar router = (0, _routes.createRouter)(_routes.externalRoutes);\n_i18n2.default.on('initialized', function () {\n    router.run((0, _routes.createRunCallback)(router, document.getElementById('App'), (0, _routes.createStandalonePropExtractor)()));\n});\nwindow.jQuery(document).ready(function () {\n    /**\r\n    * if user has Spanish locale, we tell Google widget to invoke translation immediately\r\n    */\n    if (_i18n.currentLanguage === 'es-MX') {\n        _cookiesJs2.default.set('googtrans', '/en-US/es-MX');\n        window.jQuery(document).on('translate', function () {\n            /* eslint-disable no-new */\n            new google.translate.TranslateElement({\n                pageLanguage: 'en-US',\n                includedLanguages: 'es-MX',\n                layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL,\n                gaTrack: true,\n                gaId: 'UA-33531311-2'\n            }, 'google_translate_element');\n        });\n    } else {\n        // NOTE: we remove cookie if the locale was changed back\n        _cookiesJs2.default.expire('googtrans');\n    }\n});\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// rapp_standalone.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1817);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 70709c645e05ad0335bf","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/index.js\n// module id = 0\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/prop-types/index.js\n// module id = 1\n// module chunks = 0 1","//! moment.js\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n        return (Object.getOwnPropertyNames(obj).length === 0);\n    } else {\n        var k;\n        for (k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.weekdayMismatch &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n        }\n        else {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction mod(n, x) {\n    return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nfunction daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n        return NaN;\n    }\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return globalLocale;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            var aliasedRequire = require;\n            aliasedRequire('./locale/' + name);\n            getSetGlobalLocale(oldLocale);\n        } catch (e) {}\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n        else {\n            if ((typeof console !==  'undefined') && console.warn) {\n                //warn user if arguments are passed but the locale could not be set\n                console.warn('Locale ' + key +  ' not found. Did you forget to load it?');\n            }\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var locale, parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                locale = loadLocale(config.parentLocale);\n                if (locale != null) {\n                    parentConfig = locale._config;\n                } else {\n                    if (!localeFamilies[config.parentLocale]) {\n                        localeFamilies[config.parentLocale] = [];\n                    }\n                    localeFamilies[config.parentLocale].push({\n                        name: name,\n                        config: config\n                    });\n                    return null;\n                }\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, tmpLocale, parentConfig = baseConfig;\n        // MERGE\n        tmpLocale = loadLocale(name);\n        if (tmpLocale != null) {\n            parentConfig = tmpLocale._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n\n    // check for mismatching day of week\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n        getParsingFlags(config).weekdayMismatch = true;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [\n        untruncateYear(yearStr),\n        defaultLocaleMonthsShort.indexOf(monthStr),\n        parseInt(dayStr, 10),\n        parseInt(hourStr, 10),\n        parseInt(minuteStr, 10)\n    ];\n\n    if (secondStr) {\n        result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n}\n\nfunction untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n    if (year <= 49) {\n        return 2000 + year;\n    } else if (year <= 999) {\n        return 1900 + year;\n    }\n    return year;\n}\n\nfunction preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n        if (weekdayProvided !== weekdayActual) {\n            getParsingFlags(config).weekdayMismatch = true;\n            config._isValid = false;\n            return false;\n        }\n    }\n    return true;\n}\n\nvar obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n};\n\nfunction calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n        return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n        // the only allowed military tz is Z\n        return 0;\n    } else {\n        var hm = parseInt(numOffset, 10);\n        var m = hm % 100, h = (hm - m) / 100;\n        return h * 60 + m;\n    }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i));\n    if (match) {\n        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n        if (!checkWeekday(match[1], parsedArray, config)) {\n            return;\n        }\n\n        config._a = parsedArray;\n        config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n        config._d = createUTCDate.apply(null, config._a);\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    switch (units) {\n        case 'year': output = monthDiff(this, that) / 12; break;\n        case 'month': output = monthDiff(this, that); break;\n        case 'quarter': output = monthDiff(this, that) / 3; break;\n        case 'second': output = (this - that) / 1e3; break; // 1000\n        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n        default: output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n    if (!this.isValid()) {\n        return null;\n    }\n    var utc = keepOffset !== true;\n    var m = utc ? this.clone().utc() : this;\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        if (utc) {\n            return this.toDate().toISOString();\n        } else {\n            return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n        }\n    }\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\nproto.quarter = proto.quarters = getSetQuarter;\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\nproto.hour = proto.hours = getSetHour;\nproto.minute = proto.minutes = getSetMinute;\nproto.second = proto.seconds = getSetSecond;\nproto.millisecond = proto.milliseconds = getSetMillisecond;\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\n\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction clone$1 () {\n    return createDuration(this);\n}\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n    return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    var totalSign = total < 0 ? '-' : '';\n    var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n    return totalSign + 'P' +\n        (Y ? ymSign + Y + 'Y' : '') +\n        (M ? ymSign + M + 'M' : '') +\n        (D ? daysSign + D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? hmsSign + h + 'H' : '') +\n        (m ? hmsSign + m + 'M' : '') +\n        (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.clone          = clone$1;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.21.0';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding  = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n    TIME: 'HH:mm',                                  // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n    MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/moment.js\n// module id = 2\n// module chunks = 0 1","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.12';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      var index = -1;\n      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array == null ? 0 : array.length,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(array);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // with lookup (in case of e.g. prototype pollution), and strip newlines if any.\n      // A newline wouldn't be a valid sourceURL anyway, and it'd enable code injection.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/[\\r\\n]/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      // Like with sourceURL, we take care to not check the option's prototype,\n      // as this configuration is a code injection vector.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/lodash/lodash.js\n// module id = 3\n// module chunks = 0 1","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_export.js\n// module id = 4\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar React = require('react');\nvar factory = require('./factory');\n\nif (typeof React === 'undefined') {\n  throw Error(\n    'create-react-class could not find the React object. If you are using script tags, ' +\n      'make sure that React is being loaded before create-react-class.'\n  );\n}\n\n// Hack to grab NoopUpdateQueue from isomorphic React\nvar ReactNoopUpdateQueue = new React.Component().updater;\n\nmodule.exports = factory(\n  React.Component,\n  React.isValidElement,\n  ReactNoopUpdateQueue\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/create-react-class/index.js\n// module id = 5\n// module chunks = 0 1","'use strict';\n\nvar UnitBezier = require('unitbezier');\nvar Coordinate = require('../geo/coordinate');\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @param {number} t input\n * @returns {number} input\n * @private\n */\nexports.easeCubicInOut = function (t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t,\n        t3 = t2 * t;\n    return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param {number} p1x control point 1 x coordinate\n * @param {number} p1y control point 1 y coordinate\n * @param {number} p2x control point 2 x coordinate\n * @param {number} p2y control point 2 y coordinate\n * @returns {Function} interpolator: receives number value, returns\n * number value.\n * @private\n */\nexports.bezier = function(p1x, p1y, p2x, p2y) {\n    var bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n    return function(t) {\n        return bezier.solve(t);\n    };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @param {number} t\n * @returns {number} output\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param {number} n value\n * @param {number} min the minimum value to be returned\n * @param {number} max the maximum value to be returned\n * @returns {number} the clamped value\n * @private\n */\nexports.clamp = function (n, min, max) {\n    return Math.min(max, Math.max(min, n));\n};\n\n/*\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n * @param {number} n value\n * @param {number} min the minimum value to be returned, exclusive\n * @param {number} max the maximum value to be returned, inclusive\n * @returns {number} constrained number\n * @private\n */\nexports.wrap = function (n, min, max) {\n    var d = max - min;\n    var w = ((n - min) % d + d) % d + min;\n    return (w === min) ? max : w;\n};\n\n/*\n * return the first non-null and non-undefined argument to this function.\n * @returns {*} argument\n * @private\n */\nexports.coalesce = function() {\n    for (var i = 0; i < arguments.length; i++) {\n        var arg = arguments[i];\n        if (arg !== null && arg !== undefined)\n            return arg;\n    }\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param {Array<*>} array input to each call of the async function.\n * @param {Function} fn an async function with signature (data, callback)\n * @param {Function} callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @returns {undefined}\n * @private\n */\nexports.asyncAll = function (array, fn, callback) {\n    if (!array.length) { return callback(null, []); }\n    var remaining = array.length;\n    var results = new Array(array.length);\n    var error = null;\n    array.forEach(function (item, i) {\n        fn(item, function (err, result) {\n            if (err) error = err;\n            results[i] = result;\n            if (--remaining === 0) callback(error, results);\n        });\n    });\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @param {Object} obj\n * @param {Object} other\n * @returns {Array<string>} keys difference\n * @private\n */\nexports.keysDifference = function (obj, other) {\n    var difference = [];\n    for (var i in obj) {\n        if (!(i in other)) {\n            difference.push(i);\n        }\n    }\n    return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n * @param {Object} dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @returns {Object} dest\n * @private\n */\nexports.extend = function (dest) {\n    for (var i = 1; i < arguments.length; i++) {\n        var src = arguments[i];\n        for (var k in src) {\n            dest[k] = src[k];\n        }\n    }\n    return dest;\n};\n\n/**\n * Extend a destination object with all properties of the src object,\n * using defineProperty instead of simple assignment.\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n * @private\n */\nexports.extendAll = function (dest, src) {\n    for (var i in src) {\n        Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i));\n    }\n    return dest;\n};\n\n/**\n * Extend a parent's prototype with all properties in a properties\n * object.\n *\n * @param {Object} parent\n * @param {Object} props\n * @returns {Object}\n * @private\n */\nexports.inherit = function (parent, props) {\n    var parentProto = typeof parent === 'function' ? parent.prototype : parent,\n        proto = Object.create(parentProto);\n    exports.extendAll(proto, props);\n    return proto;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param {Object} src the object\n * @param {Array<string>} properties an array of property names chosen\n * to appear on the resulting object.\n * @returns {Object} object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src, properties) {\n    var result = {};\n    for (var i = 0; i < properties.length; i++) {\n        var k = properties[i];\n        if (k in src) {\n            result[k] = src[k];\n        }\n    }\n    return result;\n};\n\nvar id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns {number} unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n    return id++;\n};\n\n/**\n * Create a version of `fn` that is only called `time` milliseconds\n * after its last invocation\n *\n * @param {Function} fn the function to be debounced\n * @param {number} time millseconds after which the function will be invoked\n * @returns {Function} debounced function\n * @private\n */\nexports.debounce = function(fn, time) {\n    var timer, args;\n\n    return function() {\n        args = arguments;\n        clearTimeout(timer);\n\n        timer = setTimeout(function() {\n            fn.apply(null, args);\n        }, time);\n    };\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param {Array<string>} fns list of member function names\n * @param {*} context the context value\n * @returns {undefined} changes functions in-place\n * @example\n * function MyClass() {\n *   bindAll(['ontimer'], this);\n *   this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n *   alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns, context) {\n    fns.forEach(function(fn) {\n        if (!context[fn]) { return; }\n        context[fn] = context[fn].bind(context);\n    });\n};\n\n/**\n * Given a class, bind all of the methods that look like handlers: that\n * begin with _on, and bind them to the class.\n *\n * @param {Object} context an object with methods\n * @private\n */\nexports.bindHandlers = function(context) {\n    for (var i in context) {\n        if (typeof context[i] === 'function' && i.indexOf('_on') === 0) {\n            context[i] = context[i].bind(context);\n        }\n    }\n};\n\n/**\n * Set the 'options' property on `obj` with properties\n * from the `options` argument. Properties in the `options`\n * object will override existing properties.\n *\n * @param {Object} obj destination object\n * @param {Object} options object of override options\n * @returns {Object} derived options object.\n * @private\n */\nexports.setOptions = function(obj, options) {\n    if (!obj.hasOwnProperty('options')) {\n        obj.options = obj.options ? Object.create(obj.options) : {};\n    }\n    for (var i in options) {\n        obj.options[i] = options[i];\n    }\n    return obj.options;\n};\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n * @param {Array<Coordinate>} coords\n * @returns {Coordinate} centerpoint\n * @private\n */\nexports.getCoordinatesCenter = function(coords) {\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n\n    for (var i = 0; i < coords.length; i++) {\n        minX = Math.min(minX, coords[i].column);\n        minY = Math.min(minY, coords[i].row);\n        maxX = Math.max(maxX, coords[i].column);\n        maxY = Math.max(maxY, coords[i].row);\n    }\n\n    var dx = maxX - minX;\n    var dy = maxY - minY;\n    var dMax = Math.max(dx, dy);\n    return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n        .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n};\n\n/**\n * Determine if a string ends with a particular substring\n * @param {string} string\n * @param {string} suffix\n * @returns {boolean}\n * @private\n */\nexports.endsWith = function(string, suffix) {\n    return string.indexOf(suffix, string.length - suffix.length) !== -1;\n};\n\n/**\n * Determine if a string starts with a particular substring\n * @param {string} string\n * @param {string} prefix\n * @returns {boolean}\n * @private\n */\nexports.startsWith = function(string, prefix) {\n    return string.indexOf(prefix) === 0;\n};\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.mapObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        output[key] = iterator.call(context || this, input[key], key, input);\n    }\n    return output;\n};\n\n/**\n * Create an object by filtering out values of an existing object\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.filterObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        if (iterator.call(context || this, input[key], key, input)) {\n            output[key] = input[key];\n        }\n    }\n    return output;\n};\n\n/**\n * Deeply compares two object literals.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.deepEqual = function deepEqual(a, b) {\n    if (Array.isArray(a)) {\n        if (!Array.isArray(b) || a.length !== b.length) return false;\n        for (var i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    if (typeof a === 'object' && a !== null && b !== null) {\n        if (!(typeof b === 'object')) return false;\n        var keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) return false;\n        for (var key in a) {\n            if (!deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n    return a === b;\n};\n\n/**\n * Deeply clones two objects.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.clone = function deepEqual(input) {\n    if (Array.isArray(input)) {\n        return input.map(exports.clone);\n    } else if (typeof input === 'object') {\n        return exports.mapObject(input, exports.clone);\n    } else {\n        return input;\n    }\n};\n\n/**\n * Check if two arrays have at least one common element.\n * @param {Array} a\n * @param {Array} b\n * @returns {boolean}\n * @private\n */\nexports.arraysIntersect = function(a, b) {\n    for (var l = 0; l < a.length; l++) {\n        if (b.indexOf(a[l]) >= 0) return true;\n    }\n    return false;\n};\n\nvar warnOnceHistory = {};\nexports.warnOnce = function(message) {\n    if (!warnOnceHistory[message]) {\n        // console isn't defined in some WebWorkers, see #2558\n        if (typeof console !== \"undefined\") console.warn(message);\n        warnOnceHistory[message] = true;\n    }\n};\n\n/**\n * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order\n *\n * @param {Point} a\n * @param {Point} b\n * @param {Point} c\n *\n * @returns {boolean} true for a counter clockwise set of points\n */\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nexports.isCounterClockwise = function(a, b, c) {\n    return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n};\n\n/**\n * Returns the signed area for the polygon ring.  Postive areas are exterior rings and\n * have a clockwise winding.  Negative areas are interior rings and have a counter clockwise\n * ordering.\n *\n * @param {Array<Point>} ring - Exterior or interior ring\n *\n * @returns {number}\n */\nexports.calculateSignedArea = function(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n};\n\n/**\n * Detects closed polygons, first + last point are equal\n * @param {Array<Point>} points array of points\n *\n * @return {boolean} true if the points are a closed polygon\n */\nexports.isClosedPolygon = function(points) {\n    // If it is 2 points that are the same then it is a point\n    // If it is 3 points with start and end the same then it is a line\n    if (points.length < 4)\n        return false;\n\n    var p1 = points[0];\n    var p2 = points[points.length - 1];\n\n    if (Math.abs(p1.x - p2.x) > 0 ||\n        Math.abs(p1.y - p2.y) > 0) {\n        return false;\n    }\n\n    // polygon simplification can produce polygons with zero area and more than 3 points\n    return (Math.abs(exports.calculateSignedArea(points)) > 0.01);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/util.js\n// module id = 6\n// module chunks = 0 1","/*!\n  Copyright (c) 2017 Jed Watson.\n  Licensed under the MIT License (MIT), see\n  http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/classnames/index.js\n// module id = 7\n// module chunks = 0 1","import Timeout from './jsx/timeout_mixin';\nimport Toggle from './jsx/toggle_mixin';\n\nexport const mixin = {\n  Timeout,\n  Toggle\n};\n\n// FORMS\nexport { default as Form } from './jsx/forms/form';\nexport { default as Field } from './jsx/forms/field';\nexport { default as InputField } from './jsx/forms/input_field';\nexport { default as Toggle } from './jsx/forms/toggle';\nexport { default as TextArea } from './jsx/forms/textarea';\nexport { default as SelectField } from './jsx/forms/select_field';\nexport { default as DatePicker } from './jsx/date_picker';\nexport { default as Calendar } from './jsx/calendar';\nexport { default as Slider } from './jsx/slider';\nexport { default as Search } from './jsx/search/search';\n\n// BOOLEANS\nexport { default as ToggleSwitch } from './jsx/toggle_switch';\nexport { default as CheckButton } from './jsx/check_button';\n\n// DROPDOWNS\nexport { default as Dropdown } from './jsx/dropdown';\n\nexport { DropdownList, DropdownListItem } from './jsx/dropdown_list';\n\n// STATUS\nexport { default as Alert } from './jsx/alert_modal';\nexport { default as Flash } from './jsx/flash';\nexport { default as Overlays } from './jsx/overlays';\nexport { default as Overlay } from './jsx/overlay';\nexport { default as GlobalAlert } from './jsx/global_alert';\nexport { default as Loader } from './jsx/loader';\nexport { default as ProgressBar } from './jsx/progress_bar';\n\n// TABLES\nexport { default as Table } from './jsx/table';\nexport { CheckboxColumn, RadioColumn } from './jsx/table_columns';\n\n// SEARCH\nexport { default as CollectionSearch } from './jsx/collection_search';\n\n// LAYOUT\nexport { default as MainPanel } from './jsx/main_panel';\nexport { default as Tabs } from './jsx/tabs';\n\n// MISC\nexport { default as Avatar } from './jsx/avatar';\nexport { default as ReportCard } from './jsx/report_card';\nexport { default as CheckMock } from './jsx/check_mock';\nexport { default as OpenGovLogo } from './jsx/opengov_logo';\nexport { default as Onboarding } from './jsx/onboarding';\n\n\n\n// WEBPACK FOOTER //\n// ../../../src/javascripts/index.js","/*!\n * jQuery JavaScript Library v1.11.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-04-28T16:19Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper window is present,\n\t\t// execute the factory and get jQuery\n\t\t// For environments that do not inherently posses a window with a document\n\t\t// (such as Node.js), expose a jQuery-making factory as module.exports\n\t\t// This accentuates the need for the creation of a real window\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\n\nvar deletedIds = [];\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"1.11.3\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1, IE<9\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: deletedIds.sort,\n\tsplice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1, IE<9\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\twhile ( j < len ) {\n\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n\t\tif ( len !== len ) {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: function() {\n\t\treturn +( new Date() );\n\t},\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\n\t\t\t\t\t} else if ( !(--remaining) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n\tif ( document.addEventListener ) {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t} else {\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\twindow.detachEvent( \"onload\", completed );\n\t}\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\tdetach();\n\t\tjQuery.ready();\n\t}\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n\nvar strundefined = typeof undefined;\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n\tbreak;\n}\nsupport.ownLast = i !== \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery(function() {\n\t// Minified: var a,b,c,d\n\tvar val, div, body, container;\n\n\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\tif ( !body || !body.style ) {\n\t\t// Return for frameset docs that don't have a body\n\t\treturn;\n\t}\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\tbody.appendChild( container ).appendChild( div );\n\n\tif ( typeof div.style.zoom !== strundefined ) {\n\t\t// Support: IE<8\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\tdiv.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n\t\tsupport.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n\t\tif ( val ) {\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t// Support: IE<8\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\t}\n\n\tbody.removeChild( container );\n});\n\n\n\n\n(function() {\n\tvar div = document.createElement( \"div\" );\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( elem ) {\n\tvar noData = jQuery.noData[ (elem.nodeName + \" \").toLowerCase() ],\n\t\tnodeType = +elem.nodeType || 1;\n\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n\treturn nodeType !== 1 && nodeType !== 9 ?\n\t\tfalse :\n\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\n\t\t!noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n};\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\n\t// throw uncatchable exceptions if you attempt to set expando properties\n\tnoData: {\n\t\t\"applet \": true,\n\t\t\"embed \": true,\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[0],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlength = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n};\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\t// Minified: var a,b,c\n\tvar input = document.createElement( \"input\" ),\n\t\tdiv = document.createElement( \"div\" ),\n\t\tfragment = document.createDocumentFragment();\n\n\t// Setup\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone =\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tinput.type = \"checkbox\";\n\tinput.checked = true;\n\tfragment.appendChild( input );\n\tsupport.appendChecked = input.checked;\n\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\t// Support: IE6-IE11+\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tfragment.appendChild( div );\n\tdiv.innerHTML = \"<input type='radio' checked='checked' name='t'/>\";\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tsupport.noCloneEvent = true;\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Execute the test only if not already executed in another module.\n\tif (support.deleteExpando == null) {\n\t\t// Support: IE<9\n\t\tsupport.deleteExpando = true;\n\t\ttry {\n\t\t\tdelete div.test;\n\t\t} catch( e ) {\n\t\t\tsupport.deleteExpando = false;\n\t\t}\n\t}\n})();\n\n\n(function() {\n\tvar i, eventName,\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\teventName = \"on\" + i;\n\n\t\tif ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\tsupport[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n})();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: IE < 9, Android < 4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tjQuery._removeData( doc, fix );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery._data( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!support.noCloneEvent || !support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = (rtagName.exec( elem ) || [ \"\", \"\" ])[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdeletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ (rtagName.exec( value ) || [ \"\", \"\" ])[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optmization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n\n(function() {\n\tvar shrinkWrapBlocksVal;\n\n\tsupport.shrinkWrapBlocks = function() {\n\t\tif ( shrinkWrapBlocksVal != null ) {\n\t\t\treturn shrinkWrapBlocksVal;\n\t\t}\n\n\t\t// Will be changed later if needed.\n\t\tshrinkWrapBlocksVal = false;\n\n\t\t// Minified: var b,c,d\n\t\tvar div, body, container;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE6\n\t\t// Check if elements with layout shrink-wrap their children\n\t\tif ( typeof div.style.zoom !== strundefined ) {\n\t\t\t// Reset CSS: box-sizing; display; margin; border\n\t\t\tdiv.style.cssText =\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;\" +\n\t\t\t\t\"padding:1px;width:1px;zoom:1\";\n\t\t\tdiv.appendChild( document.createElement( \"div\" ) ).style.width = \"5px\";\n\t\t\tshrinkWrapBlocksVal = div.offsetWidth !== 3;\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\treturn shrinkWrapBlocksVal;\n\t};\n\n})();\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\n\n\nvar getStyles, curCSS,\n\trposition = /^(top|right|bottom|left)$/;\n\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar width, minWidth, maxWidth, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\";\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar left, rs, rsLeft, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\t\tret = computed ? computed[ name ] : undefined;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\" || \"auto\";\n\t};\n}\n\n\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tvar condition = conditionFn();\n\n\t\t\tif ( condition == null ) {\n\t\t\t\t// The test was not ready at this point; screw the hook this time\n\t\t\t\t// but check again when needed next time.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( condition ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due to missing dependency),\n\t\t\t\t// remove it.\n\t\t\t\t// Since there are no other hooks for marginRight, remove the whole object.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\t// Minified: var b,c,d,e,f,g, h,i\n\tvar div, style, a, pixelPositionVal, boxSizingReliableVal,\n\t\treliableHiddenOffsetsVal, reliableMarginRightVal;\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\tstyle = a && a.style;\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !style ) {\n\t\treturn;\n\t}\n\n\tstyle.cssText = \"float:left;opacity:.5\";\n\n\t// Support: IE<9\n\t// Make sure that element opacity exists (as opposed to filter)\n\tsupport.opacity = style.opacity === \"0.5\";\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!style.cssFloat;\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: Firefox<29, Android 2.3\n\t// Vendor-prefix box-sizing\n\tsupport.boxSizing = style.boxSizing === \"\" || style.MozBoxSizing === \"\" ||\n\t\tstyle.WebkitBoxSizing === \"\";\n\n\tjQuery.extend(support, {\n\t\treliableHiddenOffsets: function() {\n\t\t\tif ( reliableHiddenOffsetsVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableHiddenOffsetsVal;\n\t\t},\n\n\t\tboxSizingReliable: function() {\n\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\n\t\tpixelPosition: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelPositionVal;\n\t\t},\n\n\t\t// Support: Android 2.3\n\t\treliableMarginRight: function() {\n\t\t\tif ( reliableMarginRightVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginRightVal;\n\t\t}\n\t});\n\n\tfunction computeStyleTests() {\n\t\t// Minified: var b,c,d,j\n\t\tvar div, body, container, contents;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\n\t\t// Support: IE<9\n\t\t// Assume reasonable values in the absence of getComputedStyle\n\t\tpixelPositionVal = boxSizingReliableVal = false;\n\t\treliableMarginRightVal = true;\n\n\t\t// Check for getComputedStyle so that this code is not run in IE<9.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tpixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tboxSizingReliableVal =\n\t\t\t\t( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tcontents = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\tcontents.style.cssText = div.style.cssText =\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\tcontents.style.marginRight = contents.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\treliableMarginRightVal =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );\n\n\t\t\tdiv.removeChild( contents );\n\t\t}\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\tcontents = div.getElementsByTagName( \"td\" );\n\t\tcontents[ 0 ].style.cssText = \"margin:0;border:0;padding:0;display:none\";\n\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\tcontents[ 0 ].style.display = \"\";\n\t\t\tcontents[ 1 ].style.display = \"none\";\n\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t}\n\n\t\tbody.removeChild( container );\n\t}\n\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set. See: #7116\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Support: IE\n\t\t\t\t// Swallow errors from 'invalid' CSS values (#5509)\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tsupport.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tjQuery._data( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !support.shrinkWrapBlocks() ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\t// Minified: var a,b,c,d,e\n\tvar input, div, select, a, opt;\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\n\t// First batch of tests.\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE8 only\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\tif ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {\n\n\t\t\t\t\t\t// Support: IE6\n\t\t\t\t\t\t// When new option element is added to select box we need to\n\t\t\t\t\t\t// force reflow of newly added node in order to workaround delay\n\t\t\t\t\t\t// of initialization properties\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toption.selected = optionSet = true;\n\n\t\t\t\t\t\t} catch ( _ ) {\n\n\t\t\t\t\t\t\t// Will be executed only in IE6\n\t\t\t\t\t\t\toption.scrollHeight;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption.selected = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = support.getSetAttribute,\n\tgetSetInput = support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\n\n// Retrieve booleans specially\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret, handle;\n\t\t\tif ( !isXML ) {\n\t\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\t\thandle = attrHandle[ name ];\n\t\t\t\tattrHandle[ name ] = ret;\n\t\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t\tattrHandle[ name ] = handle;\n\t\t\t}\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn elem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\tif ( name === \"value\" || value === elem.getAttribute( name ) ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Some attributes are constructed with empty-string values when not defined\n\tattrHandle.id = attrHandle.name = attrHandle.coords =\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn (ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\n\t// Fixing value retrieval on a button requires this module\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret && ret.specified ) {\n\t\t\t\treturn ret.value;\n\t\t\t}\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\n// Support: Safari, IE9+\n// mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\n\njQuery.parseJSON = function( data ) {\n\t// Attempt to parse using the native JSON parser first\n\tif ( window.JSON && window.JSON.parse ) {\n\t\t// Support: Android 2.3\n\t\t// Workaround failure to string-cast null input\n\t\treturn window.JSON.parse( data + \"\" );\n\t}\n\n\tvar requireNonComma,\n\t\tdepth = null,\n\t\tstr = jQuery.trim( data + \"\" );\n\n\t// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\n\t// after removing valid tokens\n\treturn str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\n\n\t\t// Force termination if we see a misplaced comma\n\t\tif ( requireNonComma && comma ) {\n\t\t\tdepth = 0;\n\t\t}\n\n\t\t// Perform no more replacements after returning to outermost depth\n\t\tif ( depth === 0 ) {\n\t\t\treturn token;\n\t\t}\n\n\t\t// Commas must not follow \"[\", \"{\", or \",\"\n\t\trequireNonComma = open || comma;\n\n\t\t// Determine new depth\n\t\t// array/object open (\"[\" or \"{\"): depth += true - false (increment)\n\t\t// array/object close (\"]\" or \"}\"): depth += false - true (decrement)\n\t\t// other cases (\",\" or primitive): depth += true - true (numeric cast)\n\t\tdepth += !close - !open;\n\n\t\t// Remove this token\n\t\treturn \"\";\n\t}) ) ?\n\t\t( Function( \"return \" + str ) )() :\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\t} catch( e ) {\n\t\txml = undefined;\n\t}\n\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType.charAt( 0 ) === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t(!support.reliableHiddenOffsets() &&\n\t\t\t((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n};\n\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\n\t// Support: IE6+\n\tfunction() {\n\n\t\t// XHR cannot access local files, always use ActiveX for that case\n\t\treturn !this.isLocal &&\n\n\t\t\t// Support: IE7-8\n\t\t\t// oldIE XHR does not support non-RFC2616 methods (#13240)\n\t\t\t// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\n\t\t\t// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\n\t\t\t// Although this check for six methods instead of eight\n\t\t\t// since IE also does not support \"trace\" and \"connect\"\n\t\t\t/^(get|post|head|put|delete|options)$/i.test( this.type ) &&\n\n\t\t\tcreateStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE<10\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t});\n}\n\n// Determine support properties\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( options ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !options.crossDomain || support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\t\t\t\t\tvar i,\n\t\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set headers\n\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE's ActiveXObject throws a 'Type Mismatch' exception when setting\n\t\t\t\t\t\t// request header to a null-value.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// To keep consistent with other XHR implementations, cast the value\n\t\t\t\t\t\t// to string and ignore `undefined`.\n\t\t\t\t\t\tif ( headers[ i ] !== undefined ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] + \"\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( options.hasContent && options.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, statusText, responses;\n\n\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\t\t\t\t\t\t\t// Clean up\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = undefined;\n\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\n\t\t\t\t\t\t\t// Abort manually if needed\n\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\tstatus = xhr.status;\n\n\t\t\t\t\t\t\t\t// Support: IE<10\n\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\tif ( !status && options.isLocal && !options.crossDomain ) {\n\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, xhr.getAllResponseHeaders() );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !options.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Add to the list of active xhr callbacks\n\t\t\t\t\t\txhr.onreadystatechange = xhrCallbacks[ id ] = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off, url.length ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\tjQuery.inArray(\"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ],\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\t// BlackBerry 5, iOS 3 (original iPhone)\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// getComputedStyle returns percent when specified for top/left/bottom/right\n// rather than make the css module depend on the offset module, we just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery/dist/jquery.js\n// module id = 9\n// module chunks = 0 1","'use strict';\n\nvar UnitBezier = require('unitbezier');\nvar Coordinate = require('../geo/coordinate');\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @param {number} t input\n * @returns {number} input\n * @private\n */\nexports.easeCubicInOut = function (t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t,\n        t3 = t2 * t;\n    return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param {number} p1x control point 1 x coordinate\n * @param {number} p1y control point 1 y coordinate\n * @param {number} p2x control point 2 x coordinate\n * @param {number} p2y control point 2 y coordinate\n * @returns {Function} interpolator: receives number value, returns\n * number value.\n * @private\n */\nexports.bezier = function(p1x, p1y, p2x, p2y) {\n    var bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n    return function(t) {\n        return bezier.solve(t);\n    };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @param {number} t\n * @returns {number} output\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param {number} n value\n * @param {number} min the minimum value to be returned\n * @param {number} max the maximum value to be returned\n * @returns {number} the clamped value\n * @private\n */\nexports.clamp = function (n, min, max) {\n    return Math.min(max, Math.max(min, n));\n};\n\n/*\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n * @param {number} n value\n * @param {number} min the minimum value to be returned, exclusive\n * @param {number} max the maximum value to be returned, inclusive\n * @returns {number} constrained number\n * @private\n */\nexports.wrap = function (n, min, max) {\n    var d = max - min;\n    var w = ((n - min) % d + d) % d + min;\n    return (w === min) ? max : w;\n};\n\n/*\n * return the first non-null and non-undefined argument to this function.\n * @returns {*} argument\n * @private\n */\nexports.coalesce = function() {\n    for (var i = 0; i < arguments.length; i++) {\n        var arg = arguments[i];\n        if (arg !== null && arg !== undefined)\n            return arg;\n    }\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param {Array<*>} array input to each call of the async function.\n * @param {Function} fn an async function with signature (data, callback)\n * @param {Function} callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @returns {undefined}\n * @private\n */\nexports.asyncAll = function (array, fn, callback) {\n    if (!array.length) { return callback(null, []); }\n    var remaining = array.length;\n    var results = new Array(array.length);\n    var error = null;\n    array.forEach(function (item, i) {\n        fn(item, function (err, result) {\n            if (err) error = err;\n            results[i] = result;\n            if (--remaining === 0) callback(error, results);\n        });\n    });\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @param {Object} obj\n * @param {Object} other\n * @returns {Array<string>} keys difference\n * @private\n */\nexports.keysDifference = function (obj, other) {\n    var difference = [];\n    for (var i in obj) {\n        if (!(i in other)) {\n            difference.push(i);\n        }\n    }\n    return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n * @param {Object} dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @returns {Object} dest\n * @private\n */\nexports.extend = function (dest) {\n    for (var i = 1; i < arguments.length; i++) {\n        var src = arguments[i];\n        for (var k in src) {\n            dest[k] = src[k];\n        }\n    }\n    return dest;\n};\n\n/**\n * Extend a destination object with all properties of the src object,\n * using defineProperty instead of simple assignment.\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n * @private\n */\nexports.extendAll = function (dest, src) {\n    for (var i in src) {\n        Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i));\n    }\n    return dest;\n};\n\n/**\n * Extend a parent's prototype with all properties in a properties\n * object.\n *\n * @param {Object} parent\n * @param {Object} props\n * @returns {Object}\n * @private\n */\nexports.inherit = function (parent, props) {\n    var parentProto = typeof parent === 'function' ? parent.prototype : parent,\n        proto = Object.create(parentProto);\n    exports.extendAll(proto, props);\n    return proto;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param {Object} src the object\n * @param {Array<string>} properties an array of property names chosen\n * to appear on the resulting object.\n * @returns {Object} object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src, properties) {\n    var result = {};\n    for (var i = 0; i < properties.length; i++) {\n        var k = properties[i];\n        if (k in src) {\n            result[k] = src[k];\n        }\n    }\n    return result;\n};\n\nvar id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns {number} unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n    return id++;\n};\n\n/**\n * Create a version of `fn` that is only called `time` milliseconds\n * after its last invocation\n *\n * @param {Function} fn the function to be debounced\n * @param {number} time millseconds after which the function will be invoked\n * @returns {Function} debounced function\n * @private\n */\nexports.debounce = function(fn, time) {\n    var timer, args;\n\n    return function() {\n        args = arguments;\n        clearTimeout(timer);\n\n        timer = setTimeout(function() {\n            fn.apply(null, args);\n        }, time);\n    };\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param {Array<string>} fns list of member function names\n * @param {*} context the context value\n * @returns {undefined} changes functions in-place\n * @example\n * function MyClass() {\n *   bindAll(['ontimer'], this);\n *   this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n *   alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns, context) {\n    fns.forEach(function(fn) {\n        context[fn] = context[fn].bind(context);\n    });\n};\n\n/**\n * Given a class, bind all of the methods that look like handlers: that\n * begin with _on, and bind them to the class.\n *\n * @param {Object} context an object with methods\n * @private\n */\nexports.bindHandlers = function(context) {\n    for (var i in context) {\n        if (typeof context[i] === 'function' && i.indexOf('_on') === 0) {\n            context[i] = context[i].bind(context);\n        }\n    }\n};\n\n/**\n * Set the 'options' property on `obj` with properties\n * from the `options` argument. Properties in the `options`\n * object will override existing properties.\n *\n * @param {Object} obj destination object\n * @param {Object} options object of override options\n * @returns {Object} derived options object.\n * @private\n */\nexports.setOptions = function(obj, options) {\n    if (!obj.hasOwnProperty('options')) {\n        obj.options = obj.options ? Object.create(obj.options) : {};\n    }\n    for (var i in options) {\n        obj.options[i] = options[i];\n    }\n    return obj.options;\n};\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n * @param {Array<Coordinate>} coords\n * @returns {Coordinate} centerpoint\n * @private\n */\nexports.getCoordinatesCenter = function(coords) {\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n\n    for (var i = 0; i < coords.length; i++) {\n        minX = Math.min(minX, coords[i].column);\n        minY = Math.min(minY, coords[i].row);\n        maxX = Math.max(maxX, coords[i].column);\n        maxY = Math.max(maxY, coords[i].row);\n    }\n\n    var dx = maxX - minX;\n    var dy = maxY - minY;\n    var dMax = Math.max(dx, dy);\n    return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n        .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n};\n\n/**\n * Determine if a string ends with a particular substring\n * @param {string} string\n * @param {string} suffix\n * @returns {boolean}\n * @private\n */\nexports.endsWith = function(string, suffix) {\n    return string.indexOf(suffix, string.length - suffix.length) !== -1;\n};\n\n/**\n * Determine if a string starts with a particular substring\n * @param {string} string\n * @param {string} prefix\n * @returns {boolean}\n * @private\n */\nexports.startsWith = function(string, prefix) {\n    return string.indexOf(prefix) === 0;\n};\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.mapObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        output[key] = iterator.call(context || this, input[key], key, input);\n    }\n    return output;\n};\n\n/**\n * Create an object by filtering out values of an existing object\n * @param {Object} input\n * @param {Function} iterator\n * @returns {Object}\n * @private\n */\nexports.filterObject = function(input, iterator, context) {\n    var output = {};\n    for (var key in input) {\n        if (iterator.call(context || this, input[key], key, input)) {\n            output[key] = input[key];\n        }\n    }\n    return output;\n};\n\n/**\n * Deeply compares two object literals.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.deepEqual = function deepEqual(a, b) {\n    if (Array.isArray(a)) {\n        if (!Array.isArray(b) || a.length !== b.length) return false;\n        for (var i = 0; i < a.length; i++) {\n            if (!deepEqual(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    if (typeof a === 'object') {\n        if (!(typeof b === 'object')) return false;\n        var keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) return false;\n        for (var key in a) {\n            if (!deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n    return a === b;\n};\n\n/**\n * Deeply clones two objects.\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {boolean}\n * @private\n */\nexports.clone = function deepEqual(input) {\n    if (Array.isArray(input)) {\n        return input.map(exports.clone);\n    } else if (typeof input === 'object') {\n        return exports.mapObject(input, exports.clone);\n    } else {\n        return input;\n    }\n};\n\n/**\n * Check if two arrays have at least one common element.\n * @param {Array} a\n * @param {Array} b\n * @returns {boolean}\n * @private\n */\nexports.arraysIntersect = function(a, b) {\n    for (var l = 0; l < a.length; l++) {\n        if (b.indexOf(a[l]) >= 0) return true;\n    }\n    return false;\n};\n\nvar warnOnceHistory = {};\nexports.warnOnce = function(message) {\n    if (!warnOnceHistory[message]) {\n        // console isn't defined in some WebWorkers, see #2558\n        if (typeof console !== \"undefined\") console.warn(message);\n        warnOnceHistory[message] = true;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/util.js\n// module id = 10\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Point;\n\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n    clone: function() { return new Point(this.x, this.y); },\n\n    add:     function(p) { return this.clone()._add(p);     },\n    sub:     function(p) { return this.clone()._sub(p);     },\n    mult:    function(k) { return this.clone()._mult(k);    },\n    div:     function(k) { return this.clone()._div(k);     },\n    rotate:  function(a) { return this.clone()._rotate(a);  },\n    matMult: function(m) { return this.clone()._matMult(m); },\n    unit:    function() { return this.clone()._unit(); },\n    perp:    function() { return this.clone()._perp(); },\n    round:   function() { return this.clone()._round(); },\n\n    mag: function() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    equals: function(p) {\n        return this.x === p.x &&\n               this.y === p.y;\n    },\n\n    dist: function(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    distSqr: function(p) {\n        var dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    angle: function() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    angleTo: function(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    angleWith: function(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ.\n    angleWithSep: function(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    _matMult: function(m) {\n        var x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _add: function(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    _sub: function(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    _mult: function(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    _div: function(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    _unit: function() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp: function() {\n        var y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    _rotate: function(angle) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round: function() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n};\n\n// constructs Point from an array if necessary\nPoint.convert = function (a) {\n    if (a instanceof Point) {\n        return a;\n    }\n    if (Array.isArray(a)) {\n        return new Point(a[0], a[1]);\n    }\n    return a;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/point-geometry/index.js\n// module id = 11\n// module chunks = 0 1","import { Dispatcher } from '@opengov/og_flux';\nimport api from '@opengov/og_api';\nimport moment from 'moment';\nimport Promise, { CancellationError } from 'bluebird';\nimport { List, Map, fromJS } from 'immutable';\nimport _ from 'lodash';\n\nimport ReportActions from './report_actions';\nimport GridReportStore from '../stores/grid_report_store';\nimport { buildVisualAggregatesQueryPlan } from '../query_planners/visual_aggregate_planner';\nimport ReportViewStore from '../stores/report_view_store';\nimport { trackIntercomEvent } from '../utils/intercom_utils';\n\nimport {\n  createMapLoaderGrid,\n  currentMapTooltipSchema,\n  getBoundingBoxFromMeta\n} from '../maps/map_constants';\n\nimport {\n  boundsIntersect,\n  buildObjectsFromGeoResponse,\n  getLngLatFromFeature\n} from '../maps/utils/geodata_utils';\n\nconst gridDataApi = new api.OgApi('/api/grid_data/v0');\n\nconst getYear = (index) => {\n  // Note this method is only called when the `result` object has the `fiscal_year` key\n  return GridReportStore.getState().getIn(['visualization', 'xAxis']).get(index).result.fiscal_year;\n};\n\nconst addLeadingZero = (number) => ('0' + number).slice(-2);\n\nconst getTimePeriodQuery = (index) => {\n  const schema = GridReportStore.getState().get('schema');\n  const dateColumnName = schema.get('dateColumn');\n\n  const xAxis = GridReportStore.getState().getIn(['visualization', 'xAxis']);\n  const xAxisTick = xAxis.get(index);\n\n  let query = {\n    query: {\n      filter: {\n        [dateColumnName]: {} as any\n      }\n    }\n  };\n\n  if (xAxisTick.result.month) {\n    const { year } = xAxisTick.result;\n    let { month, start_day, end_day } = xAxisTick.result;\n    // add leading zeroes if any month or day is less than 10\n    month = addLeadingZero(month);\n    start_day = addLeadingZero(start_day);\n    end_day = addLeadingZero(end_day);\n\n    query.query.filter[dateColumnName].ge = `${year}-${month}-${start_day}`;\n    query.query.filter[dateColumnName].le = `${year}-${month}-${end_day}`;\n\n    return query;\n  }\n\n  const { fiscal_year } = xAxisTick.result;\n  const entity = ReportViewStore.getReportEntity();\n  const fiscalYearStartMonth = entity.get('fiscal_year_start_month');\n\n  if (fiscalYearStartMonth) {\n    let start = fiscalYearStartMonth === 1 ? moment(fiscal_year, 'YYYY') : moment().set({year: fiscal_year - 1, month:fiscalYearStartMonth - 1, date: 1});\n    const end = moment(start).add(12, 'months').subtract(1, 'day');\n\n    query.query.filter[dateColumnName].ge = start.format('YYYY-MM-DD');\n    query.query.filter[dateColumnName].le = end.format('YYYY-MM-DD');\n  } else {\n    query.query.filter[dateColumnName].ge = `${fiscal_year}-01-01`;\n    query.query.filter[dateColumnName].le = `${fiscal_year}-12-31`;\n  }\n\n  return query;\n};\n\n//\n// Visual Aggregate Queries\n//\n\nlet visualAggregateRequests = []; // We declare this out here so we can keep requests in flight\nexport const cancelAggregateRequests = () => {\n  visualAggregateRequests.forEach(req => {\n    if (req && req.called) { req.abort(); }\n  });\n  visualAggregateRequests = [];\n};\n\nexport const mapReduceAllAggregateTransactions = (aggReqs, queryPlan) => {\n  const reducer = queryPlan.reducer;\n  const mapper = queryPlan.mapper;\n  const isSummaryTableQuery = queryPlan.isSummaryTableQuery;\n\n  const reduceStep = (transactions) => reducer ? reducer(transactions) : transactions;\n\n  const mapStep = (req) => {\n    return req.end().then(({ body }) => body.transactions)\n                    .then((transactions) => mapper ? mapper(transactions) : transactions);\n  };\n\n  const successStep = (transactions) => isSummaryTableQuery ? GridReportActions.getSummaryTableAggregatesSuccess(transactions) : GridReportActions.getVisualAggregatesSuccess(transactions);\n\n  cancelAggregateRequests();\n  visualAggregateRequests = aggReqs;\n  return Promise.map(aggReqs, mapStep, { concurrency: 15 }) // Maximum Concurrency\n                .then((transactionCollection) => _.flatten(transactionCollection))\n                .then(reduceStep)\n                .then(successStep);\n};\n\nconst executeQueryPlan = (queryPlan) => {\n  if (queryPlan == null) { return Promise.resolve(); }\n\n  const report = ReportViewStore.getRenderedReport();\n  const transactionsDataSetId = report.get('transaction_id');\n\n  const requests = _.map(queryPlan.queries, (query) => {\n    return api.trapi.post('query', transactionsDataSetId, query);\n  });\n\n  return mapReduceAllAggregateTransactions(requests, queryPlan);\n};\n\nconst updateData = (isSummaryTableQuery: boolean) => {\n  const state = GridReportStore.getState();\n  const dbParallelCapable = GridReportStore.getSchema().get('dbParallelCapable');\n\n  let queryPlannerOptions = {\n    allowParallel: !dbParallelCapable, // allow parallel when db is not parallel capable\n    isSummaryTableQuery: !!isSummaryTableQuery\n  };\n\n  const queryPlan = buildVisualAggregatesQueryPlan(state, queryPlannerOptions);\n  let backupPlan;\n\n  if (queryPlannerOptions.allowParallel) {\n    backupPlan = buildVisualAggregatesQueryPlan(state, { ...queryPlannerOptions, allowParallel: false });\n  }\n\n  executeQueryPlan(queryPlan)\n    .catch((error) => {\n      console.log(error.message);\n      if (backupPlan) { return backupPlan; }\n      throw error;\n    })\n    .then((plan) => {\n      // If primary plan worked, then transactions will already have been sent to renderer, and we'll get undefined.\n      if (plan) { return executeQueryPlan(plan); }\n    })\n    .catch((error) => {\n      cancelAggregateRequests();\n\n      GridReportActions.getVisualAggregatesError();\n      throw error;\n    });\n};\n\n//\n// Maps\n//\n\nconst shouldFetchMapDataBounds = () => {\n  return !GridReportStore.getMapDataBounds();\n};\n\nconst shouldFitMapToDataBounds = () => {\n  return !GridReportStore.getMapViewportBounds();\n};\n\nconst fitMapToDataBounds = () => {\n  // If we're not loading from a saved view we set the bounds of the map view to fit the map data\n  const dataBounds = GridReportStore.getMapDataStats().get('bounds');\n  GridReportActions.mapFitBounds(List([\n    List([dataBounds.get('x1'), dataBounds.get('y1')]),\n    List([dataBounds.get('x2'), dataBounds.get('y2')])\n  ]));\n};\n\nconst shouldGetRowForTooltipEditor = () => {\n  return GridReportStore.getFirstRowOfMapData() && GridReportStore.isEditingMapTooltip();\n};\n\nconst getRowForTooltipEditor = () => {\n  const firstRowWithLocation = GridReportStore.getFirstRowOfMapData();\n  const transactionsDataSetId = ReportViewStore.getRenderedReport().get('transaction_id');\n  GridReportActions.getRowsForTooltip(transactionsDataSetId, [firstRowWithLocation]);\n};\n\nconst shouldUpdateTooltipSchema = () => {\n  const tooltip = GridReportStore.getMapTooltip();\n  const tooltipVersion = tooltip.getIn(['config', 'version']);\n  return tooltip.get('config') != null && (!tooltipVersion || tooltipVersion !== currentMapTooltipSchema.version);\n};\n\nconst updateTooltipSchema = () => {\n  const tooltip = GridReportStore.getMapTooltip();\n  const schema = GridReportStore.getSchema();\n  const updatedTooltip = currentMapTooltipSchema.migrateFromPrevious(tooltip, schema);\n  GridReportActions.mapTooltipSaved(updatedTooltip.get('config'));\n  GridReportActions.mapTooltipEdited(updatedTooltip.get('draft'));\n};\n\nconst fetchCellsForNewBounds = (grid, bounds) => {\n  return grid.get('cells')\n    .filter(cell => !cell.get('loaded') && !cell.get('loader').isPending() && boundsIntersect(cell.get('bounds'), bounds))\n    .map(cell => cell.set('loader', GridReportActions.loadMapGridCell(cell)));\n};\n\nconst currentReportWasJustCreated = () => {\n  const lastCreatedReport = GridReportStore.getState().get('lastCreatedReport');\n\n  if (!lastCreatedReport) {\n    return false;\n  }\n\n  const renderedReport = ReportViewStore.getRenderedReport();\n\n  return lastCreatedReport.get('id') == renderedReport.get('id')\n    && lastCreatedReport.get('entity_id') == renderedReport.get('entity_id');\n};\n\nconst getIntercomReportAttributes = () => {\n  const report = ReportViewStore.getRenderedReport();\n\n  return {\n    entity: report.get('entity'),\n    reportId: report.get('id'),\n    reportName: report.get('name')\n  };\n};\n\nconst loadMap = () => {\n  return Promise.resolve()\n    .then(() => {\n      if (shouldFetchMapDataBounds()) {\n        return GridReportActions.getMapMeta();\n      } else {\n        return Promise.resolve(GridReportStore.getMapDataStats());\n      }\n    })\n    .tap(GridReportActions.getMapStatsForDataset())\n    .tap(mapMeta => {\n      const boundingBox = getBoundingBoxFromMeta(mapMeta);\n      return GridReportActions.setMapGrid(\n        createMapLoaderGrid(\n          boundingBox.x1,\n          boundingBox.x2,\n          boundingBox.y1,\n          boundingBox.y2,\n          5\n        )\n      );\n    })\n    .tap(() => shouldFitMapToDataBounds() && fitMapToDataBounds())\n    .tap(() => shouldUpdateTooltipSchema() && updateTooltipSchema())\n    .tap(() => {\n      GridReportActions.loadMapGridCellsInViewport()\n        .tap(() => shouldGetRowForTooltipEditor() && getRowForTooltipEditor());\n    });\n};\n\nconst mapPromises = {\n  _rowsForTooltipPromise: null,\n  _saveGridStatePromise: null,\n  _rowForTooltipPromise: null,\n  _getMapMetaPromise: null,\n  _getMapStatsForDataset: null,\n  _getMapBreakdownValuesPromise: null,\n  _mapMinMaxValuesPromise: null,\n  _resetAndLoadPromise: null\n};\nconst cancelMapPromises = () => _.each(mapPromises, (mapPromise: Promise<any>) => mapPromise && mapPromise.cancel());\n\nconst trackAndLoadMap = () => {\n  cancelMapPromises();\n\n  const notLoadedFromSavedState = !GridReportStore.hasPreviousSavedState();\n\n  if (notLoadedFromSavedState) {\n    GridReportActions.setVisualizationType('map');\n  }\n\n  if (currentReportWasJustCreated()) {\n    GridReportActions.clearLastCreatedReport();\n    trackIntercomEvent('grid-report-map-report-created', { ...getIntercomReportAttributes() });\n  }\n\n  trackIntercomEvent('grid-report-map-load', { ...getIntercomReportAttributes() });\n\n  return loadMap();\n};\n\nexport const GridReportActions = {\n  // For Tests\n  mapReduceAllAggregateTransactions,\n  cancelAggregateRequests,\n  executeQueryPlan, // TODO: Needs Tests\n  updateData, // TODO: Needs Tests\n\n  // Real exports\n\n  setSchema(meta, schema, fiscalYearStartMonth) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_SCHEMA',\n      meta, schema, fiscalYearStartMonth\n    });\n\n    // If the grid state loaded before the schema then we must fetch the\n    // visual aggregates otherwise no data will be rendered in the graph.\n    if (GridReportStore.getState().get('savedStateId') && !GridReportStore.isLoading()) {\n      GridReportActions.getVisualAggregates();\n    }\n\n    if (GridReportStore.isMapEnabled(GridReportStore.getState()) && !GridReportStore.isLoading()) {\n      trackAndLoadMap();\n    } else {\n      if (GridReportStore.getState().getIn(['visualization', 'graphType']) == 'map') {\n        GridReportActions.setVisualizationType('bar');\n      }\n    }\n  },\n\n  fetchData() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_FETCH_DATA'\n    });\n    GridReportStore.getState().get('queryModel').triggerUpdate(false, true);\n  },\n\n  filterByFiscalYear(index) {\n    const fiscalYear = getYear(index);\n\n    //Do not execute dispatcher if drilled down into monthly view (as currently no weekly or monthly view)\n    if (fiscalYear) {\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_GRID_FILTER_BY_FISCAL_YEAR',\n        fiscalYear\n      });\n\n      // we should not call saveGridState here because the handleStateChange method\n      // in the GridReport component calls saveGridState for us\n      GridReportActions.fetchData();\n    }\n  },\n\n  filterColumn(column, operator, value) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_FILTER_COLUMN',\n      column,\n      operator,\n      value\n    });\n\n    // we should not call saveGridState here because the handleStateChange method\n    // in the GridReport component calls saveGridState for us\n    GridReportActions.fetchData();\n  },\n\n  filterRemainingAggregates() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_FILTER_REMAINING_AGGREGATES'\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  toggleVisualizations() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_TOGGLE_VISUALIZATIONS'\n    });\n\n    // false is passed here because toggling visualizations should not fetch visual aggregates\n    GridReportActions.saveGridState(GridReportStore.getSavedState(), false);\n    GridReportActions.mapReset();\n  },\n\n  setLastXYZDays(days) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_LAST_XYZ_DAYS',\n      days\n    });\n\n    GridReportActions.fetchData();\n  },\n\n  setVisualizationType(graphType) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_VISUALIZATION_TYPE',\n      graphType\n    });\n\n    const previousSavedState = GridReportStore.getPreviousSavedState();\n    const previousGraphType = previousSavedState && previousSavedState.getIn(['visualization', 'graphType']);\n\n    let savedState = GridReportStore.getSavedState();\n\n    const dateColumn = GridReportStore.getState().getIn(['schema', 'dateColumn']);\n\n    if (previousGraphType !== graphType) {\n      if (previousGraphType === 'map') {\n        GridReportActions.mapReset();\n      }\n\n      if (graphType === 'bar' || graphType === 'line' || graphType === 'map') {\n        if ((previousGraphType !== 'bar' && previousGraphType !== 'line' && previousGraphType !== 'map') && (savedState.get('query') !== null)) {\n          // bar charts, line graphs and maps display all datasets so we need to clear the date column query\n          const lastState = GridReportStore.getState().get('history').findLast(\n            state => (state.getIn(['visualization', 'graphType']) === graphType)\n          );\n          const dateFilter =\n            (lastState && lastState.getIn(['query', 'filter', dateColumn]))\n            || Map();\n          savedState = savedState.setIn(['query', 'filter', dateColumn], dateFilter);\n        }\n\n        GridReportActions.saveGridState(savedState, false);\n      } else if (previousGraphType === 'bar' || previousGraphType === 'line') {\n        // Clear date filters when switching to a single-year visualizations\n        if ((graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') && savedState.getIn(['query', 'filter', dateColumn])) {\n          savedState = savedState.deleteIn(['query', 'filter', dateColumn]);\n        }\n\n        GridReportActions.setVisualizationYear(\n          savedState.getIn(['visualization', 'index']) || 0,\n          true\n        );\n        GridReportActions.saveGridState(savedState, false);\n      } else {\n        // For all other graph types just save the state\n        // Clear date filters when switching to a single-year visualizations\n        if ((graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') && savedState.getIn(['query', 'filter', dateColumn])) {\n          savedState = savedState.deleteIn(['query', 'filter', dateColumn]);\n        }\n\n        GridReportActions.saveGridState(savedState, false);\n      }\n    }\n    // Clear target when graph type changes\n    GridReportActions.clearTarget();\n\n    trackIntercomEvent('grid-report-selected-viz-type', {\n      ...getIntercomReportAttributes(),\n      selectedVizType: graphType\n    });\n  },\n\n  setVisualizationYear(index, shouldSaveState = false) {\n    const timePeriodQuery = getTimePeriodQuery(index);\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_VISUALIZATION_YEAR',\n      index,\n      timePeriodQuery\n    });\n\n    if (shouldSaveState) {\n      const savedState = GridReportStore.getSavedState().mergeDeep(fromJS(timePeriodQuery));\n\n      GridReportActions.saveGridState(savedState, false);\n    }\n  },\n\n  getVisualAggregates() {\n    const showingSummaryTable = ReportViewStore.getRenderedReport().getIn(['properties', 'summary_table_visible']);\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS'\n    });\n\n    updateData(false); // Visualization\n\n    if (showingSummaryTable) {\n      updateData(true); // Summary Table\n    }\n  },\n\n  getVisualAggregatesSuccess(data) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS',\n      transactionsByFiscalYear: data\n    });\n  },\n\n  getSummaryTableAggregatesSuccess(data) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS',\n      transactionsByFiscalYear: data\n    });\n  },\n\n  toggleLegend() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_TOGGLE_LEGEND'\n    });\n\n    // false is passed here because toggling the legend should not fetch visual aggregates\n    GridReportActions.saveGridState(GridReportStore.getSavedState(), false);\n  },\n\n  getVisualAggregatesError() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR'\n    });\n  },\n\n  reset() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_RESET'\n    });\n    GridReportActions.getVisualAggregates();\n  },\n\n  setVisualBreakdown(breakdown) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_VISUAL_BREAKDOWN',\n      breakdown\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  showVisualizationTooltip(left, top, name, value, percentage) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP',\n      left, top, name, value, percentage\n    });\n  },\n\n  hideVisualizationTooltip() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP'\n    });\n  },\n\n  setDownloadsLoading() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_LOAD_TRANSACTION_DOWNLOADS',\n    });\n  },\n\n  transactionDownloadsLoaded(downloadData) {\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_LOADED_TRANSACTION_DOWNLOADS',\n      downloads: downloadData\n    });\n  },\n\n  setInSyncStatus(meta) {\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_IN_SYNC_STATUS',\n      meta: meta\n    });\n  },\n\n  showCheckImagePanel(quasiId, gridQuery, transactionId, saveState = true, rowTop = 0) {\n    Dispatcher.handleServerAction({\n      actionType: 'CHECK_IMAGE_LOADING',\n      quasiId\n    });\n\n    const amountColumn = GridReportStore.getState().getIn(['schema', 'amountColumn']);\n\n    if (quasiId) {\n      Dispatcher.handleViewAction({\n        actionType: 'LOADING_CHECK_IMAGE'\n      });\n\n      const query = _.clone(gridQuery);\n      query.filter = {quasi_id: { eq: quasiId}};\n      query.isCheckImageQuery = true;\n\n      api.trapi\n        .post('query', transactionId, query)\n        .end()\n        .then((response) => {\n          const transaction = response.body.transactions[0];\n\n          Dispatcher.handleServerAction({\n            actionType: 'SHOW_CHECK_IMAGE',\n            checkData: transaction,\n            amountColumn,\n            loadingMessage: !!transaction.voucher_id,\n            rowTop\n          });\n\n          const query: any = _.omit(gridQuery, 'sort');\n          query.filter = {voucher_id: { eq: transaction.voucher_id}};\n\n          if (transaction.voucher_id) {\n            return api.trapi\n            .post('total', transactionId, query)\n            .end();\n          }\n        })\n        .then((response) => {\n          if (response) {\n            Dispatcher.handleServerAction({\n              actionType: 'RELATED_CHECK_INFORMATION_LOADED',\n              relatedTransactionAmount: response.body.count <= 1 ? null : response.body.total\n            });\n          }\n\n          if (saveState) {\n            GridReportActions.saveGridState(GridReportStore.getSavedState(), false);\n          }\n        })\n        .catch((err) => {\n          Dispatcher.handleServerAction({\n            actionType: 'CHECK_IMAGE_LOAD_ERROR'\n          });\n          throw err;\n        });\n    }\n  },\n\n  hideCheckImagePanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_CHECK_IMAGE'\n    });\n  },\n\n  saveGridState(nextSavedState, getVisualAggregates = true) {\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_STATE_SAVING',\n      nextSavedState\n    });\n\n    if (mapPromises._saveGridStatePromise) {\n      mapPromises._saveGridStatePromise.cancel();\n    }\n\n    const ignoredFields = ['id', 'map'];\n\n    // Clear target if the user leaves the saved view (through filtering, changing chart type, etc.)\n    const state = getVisualAggregates ? nextSavedState.setIn(['visualization', 'target'], Map()) : nextSavedState;\n\n    mapPromises._saveGridStatePromise = api.core\n      .post('grid_state', _.omit(state.toJS(), ignoredFields))\n      .end()\n      .then((res) => {\n        Dispatcher.handleServerAction({\n          actionType: 'GRID_REPORT_STATE_SAVED',\n          id: res.body.grid_state.id,\n          nextSavedState: state\n        });\n      })\n      .then(() => {\n        if (getVisualAggregates) {\n          // clear the target again so it will operate on the other? state\n          GridReportActions.clearTarget();\n          GridReportActions.getVisualAggregates();\n        }\n      })\n      .catch((err) => {\n        Dispatcher.handleServerAction({\n          actionType: 'GRID_REPORT_STATE_SAVE_ERROR'\n        });\n        throw err;\n      });\n\n    return mapPromises._saveGridStatePromise;\n  },\n\n  dispatchGridStateLoad(query?, state?, updateHistory?, lastXYZDays?, schema?) {\n    Dispatcher.handleServerAction({\n      actionType: 'GRID_REPORT_STATE_LOADED',\n      id: query,\n      loadedState: state,\n      updateHistory,\n      lastXYZDays,\n      schema\n    });\n    GridReportActions.getVisualAggregates();\n    if (GridReportStore.isMapEnabled(GridReportStore.getState())) {\n      trackAndLoadMap();\n    }\n  },\n\n  loadedGridState(query, state, updateHistory, lastXYZDays, transactionId) {\n    Promise.resolve(api.trapi.get('schema', transactionId).end()).then((response) => {\n      const schema = response.body.schema;\n\n      // Clear date filters when switching to a single-year visualizations\n      const visualization = state.visualization;\n      const graphType = visualization.graphType;\n      if (graphType === 'pie' || graphType === 'treemap' || graphType === 'horizontal_stacked') {\n        schema.forEach(function(column) {\n          if (column.type === 'date' && state.query && state.query.filter && state.query.filter.length) {\n            delete state.query.filter[column.name];\n          }\n        });\n      }\n      GridReportActions.dispatchGridStateLoad(query, state, updateHistory, lastXYZDays, schema);\n    })\n    .catch((err) => {\n      GridReportActions.errorLoadingGridData();\n    });\n  },\n\n  loadGridState(state: any = {}, updateHistory?, lastXYZDaysParam?) { //state is the URL,this is where it is being loaded from\n    const report = ReportViewStore.getRenderedReport();\n    const query = state.query ||\n                  report.getIn(['properties', 'grid_state_id']);\n    // No grid state id was provided and the report has no configured default state.\n    // Return false to signal to the caller we are not loading any grid state.\n    if (!query) {\n      return false;\n    }\n\n    if (GridReportStore.isGridStateLoaded(query)) {\n      return true;\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_STATE_LOADING',\n      stateId: query\n    });\n\n    api.core\n      .get('grid_state', query)\n      .end()\n      .then((res) => {\n        const state = res.body.grid_state;\n        const transactionId = ReportViewStore.getRenderedReport().get('transaction_id');\n\n        // this doesn't appear to be an error state but more of a sequencing issue\n        // or maybe transactionId is somewhere else in the state :shrug:\n        if (transactionId !== undefined) {\n          this.loadedGridState(query, state, updateHistory, lastXYZDaysParam, transactionId);\n        }\n      })\n      .catch((err) => {\n        const { requestResponse } = err;\n\n        if (requestResponse && requestResponse.notFound) {\n          Dispatcher.handleServerAction({\n            actionType: 'GRID_REPORT_STATE_NOT_FOUND'\n          });\n        } else {\n          Dispatcher.handleServerAction({\n            actionType: 'GRID_REPORT_STATE_LOAD_ERROR'\n          });\n          throw err;\n        }\n      });\n\n    return true;\n  },\n\n  dismissAlert() {\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_DISMISS_ALERT'\n    });\n  },\n\n  loadingGridData() {\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_DATA_LOADING'\n    });\n  },\n\n  loadedGridData() {\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_DATA_LOADED'\n    });\n  },\n\n  errorLoadingGridData() {\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_DATA_LOAD_ERROR'\n    });\n  },\n\n  showBudget101() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_BUDGET_101'\n    });\n  },\n\n  hideBudget101() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_BUDGET_101'\n    });\n  },\n\n  showTOS() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_TOS'\n    });\n  },\n\n  hideTOS() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_TOS'\n    });\n  },\n\n  showExportFilter() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_EXPORT_FILTER'\n    });\n  },\n\n  hideExportFilter() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_EXPORT_FILTER'\n    });\n  },\n\n  toggleTargetPanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'TOGGLE_TARGET_PANEL'\n    });\n  },\n\n  toggleColumnsSettingsPanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'TOGGLE_COLUMNS_SETTINGS_PANEL'\n    });\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  toggleBreakdownsSettingsPanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'TOGGLE_BREAKDOWNS_SETTINGS_PANEL'\n    });\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  hideColumn(column, visibility, settingsType, selectAll) {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_COLUMN',\n      column,\n      visibility,\n      settingsType,\n      selectAll\n    });\n  },\n\n  resetColumns(settingsData, settingsType) {\n    Dispatcher.handleViewAction({\n      actionType: 'RESET_COLUMN',\n      settingsData,\n      settingsType\n    });\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  clearTarget() {\n    Dispatcher.handleViewAction({\n      actionType: 'CLEAR_TARGET'\n    });\n  },\n\n  setTarget(target) {\n    Dispatcher.handleViewAction({\n      actionType: 'SET_TARGET',\n      target\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState(), false);\n  },\n\n  showHowToModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_GRID_HOWTO'\n    });\n  },\n\n  showWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_GRID_WELCOME'\n    });\n  },\n\n  hideHowToModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_GRID_HOWTO'\n    });\n  },\n\n  hideWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_GRID_WELCOME'\n    });\n  },\n\n  startWelcomeTour() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_GRID_TOUR'\n    });\n  },\n\n  endTour() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_GRID_TOUR'\n    });\n  },\n\n  gotoTourStep(step) {\n    Dispatcher.handleViewAction({\n      actionType: 'GOTO_TOUR_WAYPOINT',\n      currentStep: step\n    });\n  },\n\n  goBack() {\n    const currentSavedState = GridReportStore.getSavedState();\n    const currentBreakdown = currentSavedState.getIn(['visualization', 'breakdown']);\n    const currentLimit = currentSavedState.getIn(['visualization', 'limit']);\n    const currentQueryFilter = currentSavedState.getIn(['query', 'filter']);\n    const currentAmountColumn = currentSavedState.getIn(['visualization', 'amountColumn']);\n    const currentLegendSortBy = currentSavedState.getIn(['visualization', 'legendSortBy']);\n\n    const pastSavedState = GridReportStore.getPreviousSavedState(true);\n    const pastBreakdown = pastSavedState.getIn(['visualization', 'breakdown']);\n    const pastLimit = pastSavedState.getIn(['visualization', 'limit']);\n    const pastQueryFilter = pastSavedState.getIn(['query', 'filter']);\n    const pastAmountColumn = pastSavedState.getIn(['visualization', 'amountColumn']);\n    const pastLegendSortBy = pastSavedState.getIn(['visualization', 'legendSortBy']);\n\n    const breakdownValueNames = GridReportStore.getState().getIn(['visualization', 'breakdownValueNames']);\n\n    Dispatcher.handleViewAction({\n      actionType: 'GRID_REPORT_GO_BACK'\n    });\n\n    // fetch visual aggreagates if the chart needs updating\n    if (breakdownValueNames.length === 1 ||\n        // if the legend item amount (index represents this) has changed...\n        currentLimit !== pastLimit ||\n        // if the breakdown has changed...\n        currentBreakdown !== pastBreakdown ||\n        // if our query filters have changed...\n        currentQueryFilter !== pastQueryFilter ||\n        // if our amount column changed...\n        currentAmountColumn !== pastAmountColumn ||\n        // if our legend sort by changed...\n        currentLegendSortBy !== pastLegendSortBy) {\n      GridReportActions.getVisualAggregates();\n    }\n  },\n\n  setMapType(mapType) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_MAP_TYPE',\n      mapType\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  clearRowsForTooltip() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP'\n    });\n  },\n\n  getRowsForTooltip(datasetId, items) {\n    const location = getLngLatFromFeature(items[0]);\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP',\n      location\n    });\n\n    if (mapPromises._rowsForTooltipPromise) {\n      mapPromises._rowsForTooltipPromise.cancel();\n    }\n\n    if (!datasetId) {\n      datasetId = ReportViewStore.getRenderedReport().get('transaction_id');\n    }\n\n    const query = {\n      filter: { quasi_id: { in: items.map(item => item.properties.quasi_id) } },\n      limit: items.length\n    };\n\n    mapPromises._rowsForTooltipPromise = api.trapi.post('query', datasetId, query).end().then((result) => {\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS',\n        rowsForTooltip: result.body.transactions\n      });\n\n      return result.body.transactions;\n    }).catch((error) => {\n      mapPromises._rowsForTooltipPromise.cancel();\n\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR',\n        error\n      });\n\n      throw error;\n    });\n\n    return mapPromises._rowForTooltipPromise;\n  },\n\n  mapLegendShowMoreClicked() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED'\n    });\n  },\n\n  mapLegendShowPreviousClicked() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED'\n    });\n  },\n\n  mapLegendReset() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_LEGEND_RESET'\n    });\n  },\n\n  mapTooltipSaved(tooltip) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_TOOLTIP_SAVED',\n      tooltip\n    });\n\n    ReportActions.updateMapTooltip(tooltip);\n  },\n\n  mapTooltipEdited(tooltip) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_TOOLTIP_EDITED',\n      tooltip\n    });\n  },\n\n  setMapTooltipEditing() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_MAP_TOOLTIP_EDITING'\n    });\n  },\n\n  mapLoading() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_MAP_LOADING'\n    });\n  },\n\n  mapLoaded() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_MAP_LOADED'\n    });\n  },\n\n  mapFitBounds(bounds) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_FIT_BOUNDS',\n      bounds\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState())\n      .tap(GridReportActions.loadMapGridCellsInViewport);\n  },\n\n  mapMoveStart() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_MOVE_START'\n    });\n\n    if (mapPromises._saveGridStatePromise) {\n      mapPromises._saveGridStatePromise.cancel();\n    }\n  },\n\n  getMapMeta() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_MAP_META'\n    });\n\n    if (mapPromises._getMapMetaPromise) {\n      mapPromises._getMapMetaPromise.cancel && mapPromises._getMapMetaPromise.cancel();\n    }\n\n    const report = ReportViewStore.getRenderedReport();\n    const transactionsDataSetId = report.get('transaction_id');\n    const params = { entity_id: report.get('entity') };\n\n    mapPromises._getMapMetaPromise = gridDataApi\n      .get(`transaction_datasets/${transactionsDataSetId}/geometa`, params)\n      .end().then((response) => {\n        const {\n          centroid_x: centerLng,\n          centroid_y: centerLat,\n          bbox_x1: x1,\n          bbox_y1: y1,\n          bbox_x2: x2,\n          bbox_y2: y2\n        } = response.body.query_results;\n\n        const mapMeta = Map({\n          center: Map({ lng: centerLng, lat: centerLat }),\n          bounds: Map({\n            x1,\n            y1,\n            x2,\n            y2\n          })\n        });\n\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_GET_MAP_META_SUCCESS',\n          mapMeta\n        });\n\n        return Promise.resolve(mapMeta);\n      }).catch((error) => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_GET_MAP_META_ERROR',\n          error\n        });\n\n        throw error;\n      });\n\n    return mapPromises._getMapMetaPromise;\n  },\n\n  getMapStatsForDataset() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_GET_MAP_STATS_FOR_DATASET'\n    });\n\n    if (mapPromises._getMapStatsForDataset) {\n      mapPromises._getMapStatsForDataset.cancel && mapPromises._getMapStatsForDataset.cancel();\n    }\n\n    const state = GridReportStore.getState();\n    const report = ReportViewStore.getRenderedReport();\n    const transactionsDataSetId = report.get('transaction_id');\n    const amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n    const breakdown = state.getIn(['visualization', 'breakdown']);\n\n    const baseMinMaxParams = {\n      entity_id: report.get('entity'),\n      fields: [amountColumn],\n      filter: state.getIn(['grid', 'query', 'filter']),\n      limit: 1\n    };\n\n    const breakdownParams = {\n      group: breakdown,\n      filter: state.getIn(['grid', 'query', 'filter']),\n      sort: [{ [breakdown]: 'asc' }],\n      fields: [],\n      offset: 0,\n      limit: 1000\n    };\n\n    mapPromises._getMapStatsForDataset = Promise.join(\n        GridReportActions.getMapBreakdownValues(transactionsDataSetId, breakdown, breakdownParams),\n        GridReportActions.getMapMinMaxValues(transactionsDataSetId, amountColumn, baseMinMaxParams)\n      )\n      .cancellable()\n      .then(() => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS'\n        });\n      })\n      .catch(CancellationError, _.noop);\n\n    return mapPromises._getMapStatsForDataset;\n  },\n\n  getMapBreakdownValues(transactionsDataSetId, breakdown, breakdownParams) {\n    const maxBreakdownValues = 10000;\n\n    if (mapPromises._getMapBreakdownValuesPromise) {\n      mapPromises._getMapBreakdownValuesPromise.cancel();\n    }\n\n    const collectBreakdownValues = (params, breakdownValues) => {\n      return Promise.resolve(api.trapi.post('query', transactionsDataSetId, params)\n        .end().then((response) => {\n          const values = response.body.transactions.map(row => row[breakdown]);\n          breakdownValues = breakdownValues.concat(values);\n\n          if (breakdownValues.length < maxBreakdownValues && values.length == params.limit) {\n            return collectBreakdownValues({ ...params, offset: breakdownValues.length }, breakdownValues);\n          }\n\n          return Promise.resolve(breakdownValues);\n        }));\n    };\n\n    mapPromises._getMapBreakdownValuesPromise = collectBreakdownValues(breakdownParams, [])\n      .cancellable()\n      .tap(breakdownValues => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS',\n          breakdownValues\n        });\n      })\n      .catch(CancellationError, _.noop);\n\n    return mapPromises._getMapBreakdownValuesPromise;\n  },\n\n  getMapMinMaxValues(transactionsDataSetId, amountColumn, baseMinMaxParams) {\n    if (mapPromises._mapMinMaxValuesPromise) {\n      mapPromises._mapMinMaxValuesPromise.cancel();\n    }\n\n    const getPromiseForSortDirection = sort => {\n      return api.trapi\n          .post('query', transactionsDataSetId, _.assign({}, { sort: [{ [amountColumn]: sort }] }, baseMinMaxParams))\n          .end()\n          .then(response => Promise.resolve(response.body.transactions[0][amountColumn]));\n    };\n\n    mapPromises._mapMinMaxValuesPromise = Promise.join(getPromiseForSortDirection('asc'), getPromiseForSortDirection('desc'))\n      .cancellable()\n      .tap(responses => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS',\n          min: parseFloat(responses[0].replace(/\\$|,/g, '')),\n          max: parseFloat(responses[1].replace(/\\$|,/g, ''))\n        });\n      })\n      .catch(CancellationError, _.noop);\n\n    return mapPromises._mapMinMaxValuesPromise;\n  },\n\n  mapReset() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_RESET'\n    });\n  },\n\n  resetAndLoadMap() {\n    GridReportActions.mapReset();\n\n    if (mapPromises._resetAndLoadPromise) {\n      mapPromises._resetAndLoadPromise.cancel();\n    }\n\n    mapPromises._resetAndLoadPromise = loadMap().cancellable().catch(CancellationError, _.noop);\n\n    return mapPromises._resetAndLoadPromise;\n  },\n\n  setMapGrid(grid) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_SET_GRID',\n      grid\n    });\n  },\n\n  loadMapGridCellsInViewport() {\n    const viewportBounds = GridReportStore.getMapViewportBounds();\n\n    const boundsForFetch = Map({\n      x1: viewportBounds.getIn([0, 0]),\n      x2: viewportBounds.getIn([1, 0]),\n      y1: viewportBounds.getIn([0, 1]),\n      y2: viewportBounds.getIn([1, 1])\n    });\n\n    const loadingGridCells = fetchCellsForNewBounds(GridReportStore.getMapGrid(), boundsForFetch);\n\n    if (loadingGridCells.size == 0) {\n      return Promise.resolve();\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS',\n      loadingGridCells\n    });\n\n    return Promise.all(loadingGridCells.map(cell => cell.get('loader')).toJS())\n      .then(() => {})\n      .tap(() => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS'\n        });\n      })\n      .catch((error) => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELLS_ERROR',\n          error\n        });\n      });\n  },\n\n  loadMapGridCell(cell) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL',\n      cell\n    });\n\n    const bounds = cell.get('bounds');\n    const state = GridReportStore.getState();\n    const report = ReportViewStore.getRenderedReport();\n    const transactionsDataSetId = report.get('transaction_id');\n    const amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n    const breakdown = state.getIn(['visualization', 'breakdown']);\n\n    const params = {\n      entity_id: report.get('entity'),\n      fields: [breakdown, amountColumn],\n      filter: state.getIn(['grid', 'query', 'filter']),\n      ...bounds.toJS()\n    };\n\n    return gridDataApi.post(`transaction_datasets/${transactionsDataSetId}/geo`, params)\n      .end().tap((result) => {\n        const mapData = buildObjectsFromGeoResponse(result);\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS',\n          loadedCell: cell,\n          mapData\n        });\n      }).catch((error) => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_GRID_MAP_LOAD_GRID_CELL_ERROR',\n          error,\n          cell\n        });\n        throw error;\n      });\n  },\n\n  setLastCreatedReport(report) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_LAST_CREATED_REPORT',\n      report\n    });\n  },\n\n  clearLastCreatedReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_CLEAR_LAST_CREATED_REPORT'\n    });\n  },\n\n  reloadProperties(properties) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_RELOAD_PROPERTIES',\n      properties\n    });\n  },\n\n  setMapAmountColumn(mapAmountColumn) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_MAP_AMOUNT_COLUMN',\n      mapAmountColumn\n    });\n\n    GridReportActions.resetAndLoadMap();\n  },\n\n  updateFilteredExportJob(state, jobResult?, errors = []) {\n    const properties = Map({ state, jobResult: Map(jobResult), errors: List(errors)});\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_FILTERED_EXPORT',\n      properties\n    });\n  },\n\n  errorFilteredExportJob(state, messages) {\n    const properties = Map({ state, errors: List(messages) });\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_FILTERED_EXPORT',\n      properties\n    });\n  },\n\n  setHeatmapType(heatmapType) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_HEATMAP_TYPE',\n      heatmapType\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  setAmountsType(amountsType) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_AMOUNTS_TYPE',\n      amountsType\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  setAmountColumn(amountColumn) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_AMOUNT_COLUMN',\n      amountColumn\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  setLegendSortBy(sortId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_SET_LEGEND_SORT_BY',\n      sortId\n    });\n\n    GridReportActions.saveGridState(GridReportStore.getSavedState());\n  },\n\n  addActiveFilter(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_ADD_ACTIVE_FILTER',\n      id\n    });\n  },\n\n  removeActiveFilter(id) {\n     Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRID_REMOVE_ACTIVE_FILTER',\n      id\n    });\n  }\n};\n\nexport default GridReportActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/grid_report_actions.ts","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js\n// module id = 13\n// module chunks = 0 1","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// Used for setting prototype methods that IE8 chokes on.\nvar DELETE = 'delete';\n\n// Constants describing the size of trie nodes.\nvar SHIFT = 5; // Resulted in best performance after ______?\nvar SIZE = 1 << SHIFT;\nvar MASK = SIZE - 1;\n\n// A consistent shared value representing \"not set\" which equals nothing other\n// than itself, and nothing that could be provided externally.\nvar NOT_SET = {};\n\n// Boolean references, Rough equivalent of `bool &`.\nvar CHANGE_LENGTH = { value: false };\nvar DID_ALTER = { value: false };\n\nfunction MakeRef(ref) {\n  ref.value = false;\n  return ref;\n}\n\nfunction SetRef(ref) {\n  ref && (ref.value = true);\n}\n\n// A function which returns a value representing an \"owner\" for transient writes\n// to tries. The return value will only ever equal itself, and will not equal\n// the return of any subsequent call of this function.\nfunction OwnerID() {}\n\nfunction ensureSize(iter) {\n  if (iter.size === undefined) {\n    iter.size = iter.__iterate(returnTrue);\n  }\n  return iter.size;\n}\n\nfunction wrapIndex(iter, index) {\n  // This implements \"is array index\" which the ECMAString spec defines as:\n  //\n  //     A String property name P is an array index if and only if\n  //     ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal\n  //     to 2^32−1.\n  //\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects\n  if (typeof index !== 'number') {\n    var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32\n    if ('' + uint32Index !== index || uint32Index === 4294967295) {\n      return NaN;\n    }\n    index = uint32Index;\n  }\n  return index < 0 ? ensureSize(iter) + index : index;\n}\n\nfunction returnTrue() {\n  return true;\n}\n\nfunction wholeSlice(begin, end, size) {\n  return (\n    ((begin === 0 && !isNeg(begin)) ||\n      (size !== undefined && begin <= -size)) &&\n    (end === undefined || (size !== undefined && end >= size))\n  );\n}\n\nfunction resolveBegin(begin, size) {\n  return resolveIndex(begin, size, 0);\n}\n\nfunction resolveEnd(end, size) {\n  return resolveIndex(end, size, size);\n}\n\nfunction resolveIndex(index, size, defaultIndex) {\n  // Sanitize indices using this shorthand for ToInt32(argument)\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n  return index === undefined\n    ? defaultIndex\n    : isNeg(index)\n      ? size === Infinity ? size : Math.max(0, size + index) | 0\n      : size === undefined || size === index\n        ? index\n        : Math.min(size, index) | 0;\n}\n\nfunction isNeg(value) {\n  // Account for -0 which is negative, but not less than 0.\n  return value < 0 || (value === 0 && 1 / value === -Infinity);\n}\n\nfunction isImmutable(maybeImmutable) {\n  return isCollection(maybeImmutable) || isRecord(maybeImmutable);\n}\n\nfunction isCollection(maybeCollection) {\n  return !!(maybeCollection && maybeCollection[IS_ITERABLE_SENTINEL]);\n}\n\nfunction isKeyed(maybeKeyed) {\n  return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);\n}\n\nfunction isIndexed(maybeIndexed) {\n  return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);\n}\n\nfunction isAssociative(maybeAssociative) {\n  return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);\n}\n\nfunction isOrdered(maybeOrdered) {\n  return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);\n}\n\nfunction isRecord(maybeRecord) {\n  return !!(maybeRecord && maybeRecord[IS_RECORD_SENTINEL]);\n}\n\nfunction isValueObject(maybeValue) {\n  return !!(\n    maybeValue &&\n    typeof maybeValue.equals === 'function' &&\n    typeof maybeValue.hashCode === 'function'\n  );\n}\n\nvar IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\nvar IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\nvar IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';\nvar IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\nvar IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@';\n\nvar Collection = function Collection(value) {\n  return isCollection(value) ? value : Seq(value);\n};\n\nvar KeyedCollection = (function (Collection) {\n  function KeyedCollection(value) {\n    return isKeyed(value) ? value : KeyedSeq(value);\n  }\n\n  if ( Collection ) KeyedCollection.__proto__ = Collection;\n  KeyedCollection.prototype = Object.create( Collection && Collection.prototype );\n  KeyedCollection.prototype.constructor = KeyedCollection;\n\n  return KeyedCollection;\n}(Collection));\n\nvar IndexedCollection = (function (Collection) {\n  function IndexedCollection(value) {\n    return isIndexed(value) ? value : IndexedSeq(value);\n  }\n\n  if ( Collection ) IndexedCollection.__proto__ = Collection;\n  IndexedCollection.prototype = Object.create( Collection && Collection.prototype );\n  IndexedCollection.prototype.constructor = IndexedCollection;\n\n  return IndexedCollection;\n}(Collection));\n\nvar SetCollection = (function (Collection) {\n  function SetCollection(value) {\n    return isCollection(value) && !isAssociative(value) ? value : SetSeq(value);\n  }\n\n  if ( Collection ) SetCollection.__proto__ = Collection;\n  SetCollection.prototype = Object.create( Collection && Collection.prototype );\n  SetCollection.prototype.constructor = SetCollection;\n\n  return SetCollection;\n}(Collection));\n\nCollection.Keyed = KeyedCollection;\nCollection.Indexed = IndexedCollection;\nCollection.Set = SetCollection;\n\nvar ITERATE_KEYS = 0;\nvar ITERATE_VALUES = 1;\nvar ITERATE_ENTRIES = 2;\n\nvar REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\n\nvar ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;\n\nvar Iterator = function Iterator(next) {\n  this.next = next;\n};\n\nIterator.prototype.toString = function toString () {\n  return '[Iterator]';\n};\n\nIterator.KEYS = ITERATE_KEYS;\nIterator.VALUES = ITERATE_VALUES;\nIterator.ENTRIES = ITERATE_ENTRIES;\n\nIterator.prototype.inspect = Iterator.prototype.toSource = function() {\n  return this.toString();\n};\nIterator.prototype[ITERATOR_SYMBOL] = function() {\n  return this;\n};\n\nfunction iteratorValue(type, k, v, iteratorResult) {\n  var value = type === 0 ? k : type === 1 ? v : [k, v];\n  iteratorResult\n    ? (iteratorResult.value = value)\n    : (iteratorResult = {\n        value: value,\n        done: false\n      });\n  return iteratorResult;\n}\n\nfunction iteratorDone() {\n  return { value: undefined, done: true };\n}\n\nfunction hasIterator(maybeIterable) {\n  return !!getIteratorFn(maybeIterable);\n}\n\nfunction isIterator(maybeIterator) {\n  return maybeIterator && typeof maybeIterator.next === 'function';\n}\n\nfunction getIterator(iterable) {\n  var iteratorFn = getIteratorFn(iterable);\n  return iteratorFn && iteratorFn.call(iterable);\n}\n\nfunction getIteratorFn(iterable) {\n  var iteratorFn =\n    iterable &&\n    ((REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||\n      iterable[FAUX_ITERATOR_SYMBOL]);\n  if (typeof iteratorFn === 'function') {\n    return iteratorFn;\n  }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isArrayLike(value) {\n  return value && typeof value.length === 'number';\n}\n\nvar Seq = (function (Collection$$1) {\n  function Seq(value) {\n    return value === null || value === undefined\n      ? emptySequence()\n      : isImmutable(value) ? value.toSeq() : seqFromValue(value);\n  }\n\n  if ( Collection$$1 ) Seq.__proto__ = Collection$$1;\n  Seq.prototype = Object.create( Collection$$1 && Collection$$1.prototype );\n  Seq.prototype.constructor = Seq;\n\n  Seq.prototype.toSeq = function toSeq () {\n    return this;\n  };\n\n  Seq.prototype.toString = function toString () {\n    return this.__toString('Seq {', '}');\n  };\n\n  Seq.prototype.cacheResult = function cacheResult () {\n    if (!this._cache && this.__iterateUncached) {\n      this._cache = this.entrySeq().toArray();\n      this.size = this._cache.length;\n    }\n    return this;\n  };\n\n  // abstract __iterateUncached(fn, reverse)\n\n  Seq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var cache = this._cache;\n    if (cache) {\n      var size = cache.length;\n      var i = 0;\n      while (i !== size) {\n        var entry = cache[reverse ? size - ++i : i++];\n        if (fn(entry[1], entry[0], this$1) === false) {\n          break;\n        }\n      }\n      return i;\n    }\n    return this.__iterateUncached(fn, reverse);\n  };\n\n  // abstract __iteratorUncached(type, reverse)\n\n  Seq.prototype.__iterator = function __iterator (type, reverse) {\n    var cache = this._cache;\n    if (cache) {\n      var size = cache.length;\n      var i = 0;\n      return new Iterator(function () {\n        if (i === size) {\n          return iteratorDone();\n        }\n        var entry = cache[reverse ? size - ++i : i++];\n        return iteratorValue(type, entry[0], entry[1]);\n      });\n    }\n    return this.__iteratorUncached(type, reverse);\n  };\n\n  return Seq;\n}(Collection));\n\nvar KeyedSeq = (function (Seq) {\n  function KeyedSeq(value) {\n    return value === null || value === undefined\n      ? emptySequence().toKeyedSeq()\n      : isCollection(value)\n        ? isKeyed(value) ? value.toSeq() : value.fromEntrySeq()\n        : isRecord(value) ? value.toSeq() : keyedSeqFromValue(value);\n  }\n\n  if ( Seq ) KeyedSeq.__proto__ = Seq;\n  KeyedSeq.prototype = Object.create( Seq && Seq.prototype );\n  KeyedSeq.prototype.constructor = KeyedSeq;\n\n  KeyedSeq.prototype.toKeyedSeq = function toKeyedSeq () {\n    return this;\n  };\n\n  return KeyedSeq;\n}(Seq));\n\nvar IndexedSeq = (function (Seq) {\n  function IndexedSeq(value) {\n    return value === null || value === undefined\n      ? emptySequence()\n      : isCollection(value)\n        ? isKeyed(value) ? value.entrySeq() : value.toIndexedSeq()\n        : isRecord(value)\n          ? value.toSeq().entrySeq()\n          : indexedSeqFromValue(value);\n  }\n\n  if ( Seq ) IndexedSeq.__proto__ = Seq;\n  IndexedSeq.prototype = Object.create( Seq && Seq.prototype );\n  IndexedSeq.prototype.constructor = IndexedSeq;\n\n  IndexedSeq.of = function of (/*...values*/) {\n    return IndexedSeq(arguments);\n  };\n\n  IndexedSeq.prototype.toIndexedSeq = function toIndexedSeq () {\n    return this;\n  };\n\n  IndexedSeq.prototype.toString = function toString () {\n    return this.__toString('Seq [', ']');\n  };\n\n  return IndexedSeq;\n}(Seq));\n\nvar SetSeq = (function (Seq) {\n  function SetSeq(value) {\n    return (isCollection(value) && !isAssociative(value)\n      ? value\n      : IndexedSeq(value)\n    ).toSetSeq();\n  }\n\n  if ( Seq ) SetSeq.__proto__ = Seq;\n  SetSeq.prototype = Object.create( Seq && Seq.prototype );\n  SetSeq.prototype.constructor = SetSeq;\n\n  SetSeq.of = function of (/*...values*/) {\n    return SetSeq(arguments);\n  };\n\n  SetSeq.prototype.toSetSeq = function toSetSeq () {\n    return this;\n  };\n\n  return SetSeq;\n}(Seq));\n\nSeq.isSeq = isSeq;\nSeq.Keyed = KeyedSeq;\nSeq.Set = SetSeq;\nSeq.Indexed = IndexedSeq;\n\nvar IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';\n\nSeq.prototype[IS_SEQ_SENTINEL] = true;\n\n// #pragma Root Sequences\n\nvar ArraySeq = (function (IndexedSeq) {\n  function ArraySeq(array) {\n    this._array = array;\n    this.size = array.length;\n  }\n\n  if ( IndexedSeq ) ArraySeq.__proto__ = IndexedSeq;\n  ArraySeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  ArraySeq.prototype.constructor = ArraySeq;\n\n  ArraySeq.prototype.get = function get (index, notSetValue) {\n    return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;\n  };\n\n  ArraySeq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var array = this._array;\n    var size = array.length;\n    var i = 0;\n    while (i !== size) {\n      var ii = reverse ? size - ++i : i++;\n      if (fn(array[ii], ii, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  ArraySeq.prototype.__iterator = function __iterator (type, reverse) {\n    var array = this._array;\n    var size = array.length;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var ii = reverse ? size - ++i : i++;\n      return iteratorValue(type, ii, array[ii]);\n    });\n  };\n\n  return ArraySeq;\n}(IndexedSeq));\n\nvar ObjectSeq = (function (KeyedSeq) {\n  function ObjectSeq(object) {\n    var keys = Object.keys(object);\n    this._object = object;\n    this._keys = keys;\n    this.size = keys.length;\n  }\n\n  if ( KeyedSeq ) ObjectSeq.__proto__ = KeyedSeq;\n  ObjectSeq.prototype = Object.create( KeyedSeq && KeyedSeq.prototype );\n  ObjectSeq.prototype.constructor = ObjectSeq;\n\n  ObjectSeq.prototype.get = function get (key, notSetValue) {\n    if (notSetValue !== undefined && !this.has(key)) {\n      return notSetValue;\n    }\n    return this._object[key];\n  };\n\n  ObjectSeq.prototype.has = function has (key) {\n    return hasOwnProperty.call(this._object, key);\n  };\n\n  ObjectSeq.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var object = this._object;\n    var keys = this._keys;\n    var size = keys.length;\n    var i = 0;\n    while (i !== size) {\n      var key = keys[reverse ? size - ++i : i++];\n      if (fn(object[key], key, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  ObjectSeq.prototype.__iterator = function __iterator (type, reverse) {\n    var object = this._object;\n    var keys = this._keys;\n    var size = keys.length;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var key = keys[reverse ? size - ++i : i++];\n      return iteratorValue(type, key, object[key]);\n    });\n  };\n\n  return ObjectSeq;\n}(KeyedSeq));\nObjectSeq.prototype[IS_ORDERED_SENTINEL] = true;\n\nvar CollectionSeq = (function (IndexedSeq) {\n  function CollectionSeq(collection) {\n    this._collection = collection;\n    this.size = collection.length || collection.size;\n  }\n\n  if ( IndexedSeq ) CollectionSeq.__proto__ = IndexedSeq;\n  CollectionSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  CollectionSeq.prototype.constructor = CollectionSeq;\n\n  CollectionSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var collection = this._collection;\n    var iterator = getIterator(collection);\n    var iterations = 0;\n    if (isIterator(iterator)) {\n      var step;\n      while (!(step = iterator.next()).done) {\n        if (fn(step.value, iterations++, this$1) === false) {\n          break;\n        }\n      }\n    }\n    return iterations;\n  };\n\n  CollectionSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var collection = this._collection;\n    var iterator = getIterator(collection);\n    if (!isIterator(iterator)) {\n      return new Iterator(iteratorDone);\n    }\n    var iterations = 0;\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done ? step : iteratorValue(type, iterations++, step.value);\n    });\n  };\n\n  return CollectionSeq;\n}(IndexedSeq));\n\nvar IteratorSeq = (function (IndexedSeq) {\n  function IteratorSeq(iterator) {\n    this._iterator = iterator;\n    this._iteratorCache = [];\n  }\n\n  if ( IndexedSeq ) IteratorSeq.__proto__ = IndexedSeq;\n  IteratorSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n  IteratorSeq.prototype.constructor = IteratorSeq;\n\n  IteratorSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterator = this._iterator;\n    var cache = this._iteratorCache;\n    var iterations = 0;\n    while (iterations < cache.length) {\n      if (fn(cache[iterations], iterations++, this$1) === false) {\n        return iterations;\n      }\n    }\n    var step;\n    while (!(step = iterator.next()).done) {\n      var val = step.value;\n      cache[iterations] = val;\n      if (fn(val, iterations++, this$1) === false) {\n        break;\n      }\n    }\n    return iterations;\n  };\n\n  IteratorSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = this._iterator;\n    var cache = this._iteratorCache;\n    var iterations = 0;\n    return new Iterator(function () {\n      if (iterations >= cache.length) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        cache[iterations] = step.value;\n      }\n      return iteratorValue(type, iterations, cache[iterations++]);\n    });\n  };\n\n  return IteratorSeq;\n}(IndexedSeq));\n\n// # pragma Helper functions\n\nfunction isSeq(maybeSeq) {\n  return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]);\n}\n\nvar EMPTY_SEQ;\n\nfunction emptySequence() {\n  return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));\n}\n\nfunction keyedSeqFromValue(value) {\n  var seq = Array.isArray(value)\n    ? new ArraySeq(value)\n    : isIterator(value)\n      ? new IteratorSeq(value)\n      : hasIterator(value) ? new CollectionSeq(value) : undefined;\n  if (seq) {\n    return seq.fromEntrySeq();\n  }\n  if (typeof value === 'object') {\n    return new ObjectSeq(value);\n  }\n  throw new TypeError(\n    'Expected Array or collection object of [k, v] entries, or keyed object: ' +\n      value\n  );\n}\n\nfunction indexedSeqFromValue(value) {\n  var seq = maybeIndexedSeqFromValue(value);\n  if (seq) {\n    return seq;\n  }\n  throw new TypeError(\n    'Expected Array or collection object of values: ' + value\n  );\n}\n\nfunction seqFromValue(value) {\n  var seq = maybeIndexedSeqFromValue(value);\n  if (seq) {\n    return seq;\n  }\n  if (typeof value === 'object') {\n    return new ObjectSeq(value);\n  }\n  throw new TypeError(\n    'Expected Array or collection object of values, or keyed object: ' + value\n  );\n}\n\nfunction maybeIndexedSeqFromValue(value) {\n  return isArrayLike(value)\n    ? new ArraySeq(value)\n    : isIterator(value)\n      ? new IteratorSeq(value)\n      : hasIterator(value) ? new CollectionSeq(value) : undefined;\n}\n\n/**\n * An extension of the \"same-value\" algorithm as [described for use by ES6 Map\n * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)\n *\n * NaN is considered the same as NaN, however -0 and 0 are considered the same\n * value, which is different from the algorithm described by\n * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).\n *\n * This is extended further to allow Objects to describe the values they\n * represent, by way of `valueOf` or `equals` (and `hashCode`).\n *\n * Note: because of this extension, the key equality of Immutable.Map and the\n * value equality of Immutable.Set will differ from ES6 Map and Set.\n *\n * ### Defining custom values\n *\n * The easiest way to describe the value an object represents is by implementing\n * `valueOf`. For example, `Date` represents a value by returning a unix\n * timestamp for `valueOf`:\n *\n *     var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...\n *     var date2 = new Date(1234567890000);\n *     date1.valueOf(); // 1234567890000\n *     assert( date1 !== date2 );\n *     assert( Immutable.is( date1, date2 ) );\n *\n * Note: overriding `valueOf` may have other implications if you use this object\n * where JavaScript expects a primitive, such as implicit string coercion.\n *\n * For more complex types, especially collections, implementing `valueOf` may\n * not be performant. An alternative is to implement `equals` and `hashCode`.\n *\n * `equals` takes another object, presumably of similar type, and returns true\n * if it is equal. Equality is symmetrical, so the same result should be\n * returned if this and the argument are flipped.\n *\n *     assert( a.equals(b) === b.equals(a) );\n *\n * `hashCode` returns a 32bit integer number representing the object which will\n * be used to determine how to store the value object in a Map or Set. You must\n * provide both or neither methods, one must not exist without the other.\n *\n * Also, an important relationship between these methods must be upheld: if two\n * values are equal, they *must* return the same hashCode. If the values are not\n * equal, they might have the same hashCode; this is called a hash collision,\n * and while undesirable for performance reasons, it is acceptable.\n *\n *     if (a.equals(b)) {\n *       assert( a.hashCode() === b.hashCode() );\n *     }\n *\n * All Immutable collections are Value Objects: they implement `equals()`\n * and `hashCode()`.\n */\nfunction is(valueA, valueB) {\n  if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n    return true;\n  }\n  if (!valueA || !valueB) {\n    return false;\n  }\n  if (\n    typeof valueA.valueOf === 'function' &&\n    typeof valueB.valueOf === 'function'\n  ) {\n    valueA = valueA.valueOf();\n    valueB = valueB.valueOf();\n    if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n      return true;\n    }\n    if (!valueA || !valueB) {\n      return false;\n    }\n  }\n  return !!(\n    isValueObject(valueA) &&\n    isValueObject(valueB) &&\n    valueA.equals(valueB)\n  );\n}\n\nvar imul =\n  typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2\n    ? Math.imul\n    : function imul(a, b) {\n        a |= 0; // int\n        b |= 0; // int\n        var c = a & 0xffff;\n        var d = b & 0xffff;\n        // Shift by 0 fixes the sign on the high part.\n        return (c * d + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0)) | 0; // int\n      };\n\n// v8 has an optimization for storing 31-bit signed numbers.\n// Values which have either 00 or 11 as the high order bits qualify.\n// This function drops the highest order bit in a signed number, maintaining\n// the sign bit.\nfunction smi(i32) {\n  return ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff);\n}\n\nfunction hash(o) {\n  if (o === false || o === null || o === undefined) {\n    return 0;\n  }\n  if (typeof o.valueOf === 'function') {\n    o = o.valueOf();\n    if (o === false || o === null || o === undefined) {\n      return 0;\n    }\n  }\n  if (o === true) {\n    return 1;\n  }\n  var type = typeof o;\n  if (type === 'number') {\n    if (o !== o || o === Infinity) {\n      return 0;\n    }\n    var h = o | 0;\n    if (h !== o) {\n      h ^= o * 0xffffffff;\n    }\n    while (o > 0xffffffff) {\n      o /= 0xffffffff;\n      h ^= o;\n    }\n    return smi(h);\n  }\n  if (type === 'string') {\n    return o.length > STRING_HASH_CACHE_MIN_STRLEN\n      ? cachedHashString(o)\n      : hashString(o);\n  }\n  if (typeof o.hashCode === 'function') {\n    // Drop any high bits from accidentally long hash codes.\n    return smi(o.hashCode());\n  }\n  if (type === 'object') {\n    return hashJSObj(o);\n  }\n  if (typeof o.toString === 'function') {\n    return hashString(o.toString());\n  }\n  throw new Error('Value type ' + type + ' cannot be hashed.');\n}\n\nfunction cachedHashString(string) {\n  var hashed = stringHashCache[string];\n  if (hashed === undefined) {\n    hashed = hashString(string);\n    if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {\n      STRING_HASH_CACHE_SIZE = 0;\n      stringHashCache = {};\n    }\n    STRING_HASH_CACHE_SIZE++;\n    stringHashCache[string] = hashed;\n  }\n  return hashed;\n}\n\n// http://jsperf.com/hashing-strings\nfunction hashString(string) {\n  // This is the hash from JVM\n  // The hash code for a string is computed as\n  // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n  // where s[i] is the ith character of the string and n is the length of\n  // the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n  // (exclusive) by dropping high bits.\n  var hashed = 0;\n  for (var ii = 0; ii < string.length; ii++) {\n    hashed = (31 * hashed + string.charCodeAt(ii)) | 0;\n  }\n  return smi(hashed);\n}\n\nfunction hashJSObj(obj) {\n  var hashed;\n  if (usingWeakMap) {\n    hashed = weakMap.get(obj);\n    if (hashed !== undefined) {\n      return hashed;\n    }\n  }\n\n  hashed = obj[UID_HASH_KEY];\n  if (hashed !== undefined) {\n    return hashed;\n  }\n\n  if (!canDefineProperty) {\n    hashed = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];\n    if (hashed !== undefined) {\n      return hashed;\n    }\n\n    hashed = getIENodeHash(obj);\n    if (hashed !== undefined) {\n      return hashed;\n    }\n  }\n\n  hashed = ++objHashUID;\n  if (objHashUID & 0x40000000) {\n    objHashUID = 0;\n  }\n\n  if (usingWeakMap) {\n    weakMap.set(obj, hashed);\n  } else if (isExtensible !== undefined && isExtensible(obj) === false) {\n    throw new Error('Non-extensible objects are not allowed as keys.');\n  } else if (canDefineProperty) {\n    Object.defineProperty(obj, UID_HASH_KEY, {\n      enumerable: false,\n      configurable: false,\n      writable: false,\n      value: hashed\n    });\n  } else if (\n    obj.propertyIsEnumerable !== undefined &&\n    obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable\n  ) {\n    // Since we can't define a non-enumerable property on the object\n    // we'll hijack one of the less-used non-enumerable properties to\n    // save our hash on it. Since this is a function it will not show up in\n    // `JSON.stringify` which is what we want.\n    obj.propertyIsEnumerable = function() {\n      return this.constructor.prototype.propertyIsEnumerable.apply(\n        this,\n        arguments\n      );\n    };\n    obj.propertyIsEnumerable[UID_HASH_KEY] = hashed;\n  } else if (obj.nodeType !== undefined) {\n    // At this point we couldn't get the IE `uniqueID` to use as a hash\n    // and we couldn't use a non-enumerable property to exploit the\n    // dontEnum bug so we simply add the `UID_HASH_KEY` on the node\n    // itself.\n    obj[UID_HASH_KEY] = hashed;\n  } else {\n    throw new Error('Unable to set a non-enumerable property on object.');\n  }\n\n  return hashed;\n}\n\n// Get references to ES5 object methods.\nvar isExtensible = Object.isExtensible;\n\n// True if Object.defineProperty works as expected. IE8 fails this test.\nvar canDefineProperty = (function() {\n  try {\n    Object.defineProperty({}, '@', {});\n    return true;\n  } catch (e) {\n    return false;\n  }\n})();\n\n// IE has a `uniqueID` property on DOM nodes. We can construct the hash from it\n// and avoid memory leaks from the IE cloneNode bug.\nfunction getIENodeHash(node) {\n  if (node && node.nodeType > 0) {\n    switch (node.nodeType) {\n      case 1: // Element\n        return node.uniqueID;\n      case 9: // Document\n        return node.documentElement && node.documentElement.uniqueID;\n    }\n  }\n}\n\n// If possible, use a WeakMap.\nvar usingWeakMap = typeof WeakMap === 'function';\nvar weakMap;\nif (usingWeakMap) {\n  weakMap = new WeakMap();\n}\n\nvar objHashUID = 0;\n\nvar UID_HASH_KEY = '__immutablehash__';\nif (typeof Symbol === 'function') {\n  UID_HASH_KEY = Symbol(UID_HASH_KEY);\n}\n\nvar STRING_HASH_CACHE_MIN_STRLEN = 16;\nvar STRING_HASH_CACHE_MAX_SIZE = 255;\nvar STRING_HASH_CACHE_SIZE = 0;\nvar stringHashCache = {};\n\nvar ToKeyedSequence = (function (KeyedSeq$$1) {\n  function ToKeyedSequence(indexed, useKeys) {\n    this._iter = indexed;\n    this._useKeys = useKeys;\n    this.size = indexed.size;\n  }\n\n  if ( KeyedSeq$$1 ) ToKeyedSequence.__proto__ = KeyedSeq$$1;\n  ToKeyedSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n  ToKeyedSequence.prototype.constructor = ToKeyedSequence;\n\n  ToKeyedSequence.prototype.get = function get (key, notSetValue) {\n    return this._iter.get(key, notSetValue);\n  };\n\n  ToKeyedSequence.prototype.has = function has (key) {\n    return this._iter.has(key);\n  };\n\n  ToKeyedSequence.prototype.valueSeq = function valueSeq () {\n    return this._iter.valueSeq();\n  };\n\n  ToKeyedSequence.prototype.reverse = function reverse () {\n    var this$1 = this;\n\n    var reversedSequence = reverseFactory(this, true);\n    if (!this._useKeys) {\n      reversedSequence.valueSeq = function () { return this$1._iter.toSeq().reverse(); };\n    }\n    return reversedSequence;\n  };\n\n  ToKeyedSequence.prototype.map = function map (mapper, context) {\n    var this$1 = this;\n\n    var mappedSequence = mapFactory(this, mapper, context);\n    if (!this._useKeys) {\n      mappedSequence.valueSeq = function () { return this$1._iter.toSeq().map(mapper, context); };\n    }\n    return mappedSequence;\n  };\n\n  ToKeyedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (v, k) { return fn(v, k, this$1); }, reverse);\n  };\n\n  ToKeyedSequence.prototype.__iterator = function __iterator (type, reverse) {\n    return this._iter.__iterator(type, reverse);\n  };\n\n  return ToKeyedSequence;\n}(KeyedSeq));\nToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true;\n\nvar ToIndexedSequence = (function (IndexedSeq$$1) {\n  function ToIndexedSequence(iter) {\n    this._iter = iter;\n    this.size = iter.size;\n  }\n\n  if ( IndexedSeq$$1 ) ToIndexedSequence.__proto__ = IndexedSeq$$1;\n  ToIndexedSequence.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  ToIndexedSequence.prototype.constructor = ToIndexedSequence;\n\n  ToIndexedSequence.prototype.includes = function includes (value) {\n    return this._iter.includes(value);\n  };\n\n  ToIndexedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var i = 0;\n    reverse && ensureSize(this);\n    return this._iter.__iterate(\n      function (v) { return fn(v, reverse ? this$1.size - ++i : i++, this$1); },\n      reverse\n    );\n  };\n\n  ToIndexedSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var this$1 = this;\n\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    var i = 0;\n    reverse && ensureSize(this);\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done\n        ? step\n        : iteratorValue(\n            type,\n            reverse ? this$1.size - ++i : i++,\n            step.value,\n            step\n          );\n    });\n  };\n\n  return ToIndexedSequence;\n}(IndexedSeq));\n\nvar ToSetSequence = (function (SetSeq$$1) {\n  function ToSetSequence(iter) {\n    this._iter = iter;\n    this.size = iter.size;\n  }\n\n  if ( SetSeq$$1 ) ToSetSequence.__proto__ = SetSeq$$1;\n  ToSetSequence.prototype = Object.create( SetSeq$$1 && SetSeq$$1.prototype );\n  ToSetSequence.prototype.constructor = ToSetSequence;\n\n  ToSetSequence.prototype.has = function has (key) {\n    return this._iter.includes(key);\n  };\n\n  ToSetSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (v) { return fn(v, v, this$1); }, reverse);\n  };\n\n  ToSetSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      return step.done\n        ? step\n        : iteratorValue(type, step.value, step.value, step);\n    });\n  };\n\n  return ToSetSequence;\n}(SetSeq));\n\nvar FromEntriesSequence = (function (KeyedSeq$$1) {\n  function FromEntriesSequence(entries) {\n    this._iter = entries;\n    this.size = entries.size;\n  }\n\n  if ( KeyedSeq$$1 ) FromEntriesSequence.__proto__ = KeyedSeq$$1;\n  FromEntriesSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n  FromEntriesSequence.prototype.constructor = FromEntriesSequence;\n\n  FromEntriesSequence.prototype.entrySeq = function entrySeq () {\n    return this._iter.toSeq();\n  };\n\n  FromEntriesSequence.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._iter.__iterate(function (entry) {\n      // Check if entry exists first so array access doesn't throw for holes\n      // in the parent iteration.\n      if (entry) {\n        validateEntry(entry);\n        var indexedCollection = isCollection(entry);\n        return fn(\n          indexedCollection ? entry.get(1) : entry[1],\n          indexedCollection ? entry.get(0) : entry[0],\n          this$1\n        );\n      }\n    }, reverse);\n  };\n\n  FromEntriesSequence.prototype.__iterator = function __iterator (type, reverse) {\n    var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n    return new Iterator(function () {\n      while (true) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        var entry = step.value;\n        // Check if entry exists first so array access doesn't throw for holes\n        // in the parent iteration.\n        if (entry) {\n          validateEntry(entry);\n          var indexedCollection = isCollection(entry);\n          return iteratorValue(\n            type,\n            indexedCollection ? entry.get(0) : entry[0],\n            indexedCollection ? entry.get(1) : entry[1],\n            step\n          );\n        }\n      }\n    });\n  };\n\n  return FromEntriesSequence;\n}(KeyedSeq));\n\nToIndexedSequence.prototype.cacheResult = ToKeyedSequence.prototype.cacheResult = ToSetSequence.prototype.cacheResult = FromEntriesSequence.prototype.cacheResult = cacheResultThrough;\n\nfunction flipFactory(collection) {\n  var flipSequence = makeSequence(collection);\n  flipSequence._iter = collection;\n  flipSequence.size = collection.size;\n  flipSequence.flip = function () { return collection; };\n  flipSequence.reverse = function() {\n    var reversedSequence = collection.reverse.apply(this); // super.reverse()\n    reversedSequence.flip = function () { return collection.reverse(); };\n    return reversedSequence;\n  };\n  flipSequence.has = function (key) { return collection.includes(key); };\n  flipSequence.includes = function (key) { return collection.has(key); };\n  flipSequence.cacheResult = cacheResultThrough;\n  flipSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    return collection.__iterate(function (v, k) { return fn(k, v, this$1) !== false; }, reverse);\n  };\n  flipSequence.__iteratorUncached = function(type, reverse) {\n    if (type === ITERATE_ENTRIES) {\n      var iterator = collection.__iterator(type, reverse);\n      return new Iterator(function () {\n        var step = iterator.next();\n        if (!step.done) {\n          var k = step.value[0];\n          step.value[0] = step.value[1];\n          step.value[1] = k;\n        }\n        return step;\n      });\n    }\n    return collection.__iterator(\n      type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES,\n      reverse\n    );\n  };\n  return flipSequence;\n}\n\nfunction mapFactory(collection, mapper, context) {\n  var mappedSequence = makeSequence(collection);\n  mappedSequence.size = collection.size;\n  mappedSequence.has = function (key) { return collection.has(key); };\n  mappedSequence.get = function (key, notSetValue) {\n    var v = collection.get(key, NOT_SET);\n    return v === NOT_SET\n      ? notSetValue\n      : mapper.call(context, v, key, collection);\n  };\n  mappedSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    return collection.__iterate(\n      function (v, k, c) { return fn(mapper.call(context, v, k, c), k, this$1) !== false; },\n      reverse\n    );\n  };\n  mappedSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      var key = entry[0];\n      return iteratorValue(\n        type,\n        key,\n        mapper.call(context, entry[1], key, collection),\n        step\n      );\n    });\n  };\n  return mappedSequence;\n}\n\nfunction reverseFactory(collection, useKeys) {\n  var this$1 = this;\n\n  var reversedSequence = makeSequence(collection);\n  reversedSequence._iter = collection;\n  reversedSequence.size = collection.size;\n  reversedSequence.reverse = function () { return collection; };\n  if (collection.flip) {\n    reversedSequence.flip = function() {\n      var flipSequence = flipFactory(collection);\n      flipSequence.reverse = function () { return collection.flip(); };\n      return flipSequence;\n    };\n  }\n  reversedSequence.get = function (key, notSetValue) { return collection.get(useKeys ? key : -1 - key, notSetValue); };\n  reversedSequence.has = function (key) { return collection.has(useKeys ? key : -1 - key); };\n  reversedSequence.includes = function (value) { return collection.includes(value); };\n  reversedSequence.cacheResult = cacheResultThrough;\n  reversedSequence.__iterate = function(fn, reverse) {\n    var this$1 = this;\n\n    var i = 0;\n    reverse && ensureSize(collection);\n    return collection.__iterate(\n      function (v, k) { return fn(v, useKeys ? k : reverse ? this$1.size - ++i : i++, this$1); },\n      !reverse\n    );\n  };\n  reversedSequence.__iterator = function (type, reverse) {\n    var i = 0;\n    reverse && ensureSize(collection);\n    var iterator = collection.__iterator(ITERATE_ENTRIES, !reverse);\n    return new Iterator(function () {\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      return iteratorValue(\n        type,\n        useKeys ? entry[0] : reverse ? this$1.size - ++i : i++,\n        entry[1],\n        step\n      );\n    });\n  };\n  return reversedSequence;\n}\n\nfunction filterFactory(collection, predicate, context, useKeys) {\n  var filterSequence = makeSequence(collection);\n  if (useKeys) {\n    filterSequence.has = function (key) {\n      var v = collection.get(key, NOT_SET);\n      return v !== NOT_SET && !!predicate.call(context, v, key, collection);\n    };\n    filterSequence.get = function (key, notSetValue) {\n      var v = collection.get(key, NOT_SET);\n      return v !== NOT_SET && predicate.call(context, v, key, collection)\n        ? v\n        : notSetValue;\n    };\n  }\n  filterSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    collection.__iterate(function (v, k, c) {\n      if (predicate.call(context, v, k, c)) {\n        iterations++;\n        return fn(v, useKeys ? k : iterations - 1, this$1);\n      }\n    }, reverse);\n    return iterations;\n  };\n  filterSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var iterations = 0;\n    return new Iterator(function () {\n      while (true) {\n        var step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n        var entry = step.value;\n        var key = entry[0];\n        var value = entry[1];\n        if (predicate.call(context, value, key, collection)) {\n          return iteratorValue(type, useKeys ? key : iterations++, value, step);\n        }\n      }\n    });\n  };\n  return filterSequence;\n}\n\nfunction countByFactory(collection, grouper, context) {\n  var groups = Map().asMutable();\n  collection.__iterate(function (v, k) {\n    groups.update(grouper.call(context, v, k, collection), 0, function (a) { return a + 1; });\n  });\n  return groups.asImmutable();\n}\n\nfunction groupByFactory(collection, grouper, context) {\n  var isKeyedIter = isKeyed(collection);\n  var groups = (isOrdered(collection) ? OrderedMap() : Map()).asMutable();\n  collection.__iterate(function (v, k) {\n    groups.update(\n      grouper.call(context, v, k, collection),\n      function (a) { return ((a = a || []), a.push(isKeyedIter ? [k, v] : v), a); }\n    );\n  });\n  var coerce = collectionClass(collection);\n  return groups.map(function (arr) { return reify(collection, coerce(arr)); });\n}\n\nfunction sliceFactory(collection, begin, end, useKeys) {\n  var originalSize = collection.size;\n\n  if (wholeSlice(begin, end, originalSize)) {\n    return collection;\n  }\n\n  var resolvedBegin = resolveBegin(begin, originalSize);\n  var resolvedEnd = resolveEnd(end, originalSize);\n\n  // begin or end will be NaN if they were provided as negative numbers and\n  // this collection's size is unknown. In that case, cache first so there is\n  // a known size and these do not resolve to NaN.\n  if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) {\n    return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys);\n  }\n\n  // Note: resolvedEnd is undefined when the original sequence's length is\n  // unknown and this slice did not supply an end and should contain all\n  // elements after resolvedBegin.\n  // In that case, resolvedSize will be NaN and sliceSize will remain undefined.\n  var resolvedSize = resolvedEnd - resolvedBegin;\n  var sliceSize;\n  if (resolvedSize === resolvedSize) {\n    sliceSize = resolvedSize < 0 ? 0 : resolvedSize;\n  }\n\n  var sliceSeq = makeSequence(collection);\n\n  // If collection.size is undefined, the size of the realized sliceSeq is\n  // unknown at this point unless the number of items to slice is 0\n  sliceSeq.size =\n    sliceSize === 0 ? sliceSize : (collection.size && sliceSize) || undefined;\n\n  if (!useKeys && isSeq(collection) && sliceSize >= 0) {\n    sliceSeq.get = function(index, notSetValue) {\n      index = wrapIndex(this, index);\n      return index >= 0 && index < sliceSize\n        ? collection.get(index + resolvedBegin, notSetValue)\n        : notSetValue;\n    };\n  }\n\n  sliceSeq.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (sliceSize === 0) {\n      return 0;\n    }\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var skipped = 0;\n    var isSkipping = true;\n    var iterations = 0;\n    collection.__iterate(function (v, k) {\n      if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) {\n        iterations++;\n        return (\n          fn(v, useKeys ? k : iterations - 1, this$1) !== false &&\n          iterations !== sliceSize\n        );\n      }\n    });\n    return iterations;\n  };\n\n  sliceSeq.__iteratorUncached = function(type, reverse) {\n    if (sliceSize !== 0 && reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    // Don't bother instantiating parent iterator if taking 0.\n    if (sliceSize === 0) {\n      return new Iterator(iteratorDone);\n    }\n    var iterator = collection.__iterator(type, reverse);\n    var skipped = 0;\n    var iterations = 0;\n    return new Iterator(function () {\n      while (skipped++ < resolvedBegin) {\n        iterator.next();\n      }\n      if (++iterations > sliceSize) {\n        return iteratorDone();\n      }\n      var step = iterator.next();\n      if (useKeys || type === ITERATE_VALUES || step.done) {\n        return step;\n      }\n      if (type === ITERATE_KEYS) {\n        return iteratorValue(type, iterations - 1, undefined, step);\n      }\n      return iteratorValue(type, iterations - 1, step.value[1], step);\n    });\n  };\n\n  return sliceSeq;\n}\n\nfunction takeWhileFactory(collection, predicate, context) {\n  var takeSequence = makeSequence(collection);\n  takeSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterations = 0;\n    collection.__iterate(\n      function (v, k, c) { return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$1); }\n    );\n    return iterations;\n  };\n  takeSequence.__iteratorUncached = function(type, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var iterating = true;\n    return new Iterator(function () {\n      if (!iterating) {\n        return iteratorDone();\n      }\n      var step = iterator.next();\n      if (step.done) {\n        return step;\n      }\n      var entry = step.value;\n      var k = entry[0];\n      var v = entry[1];\n      if (!predicate.call(context, v, k, this$1)) {\n        iterating = false;\n        return iteratorDone();\n      }\n      return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n    });\n  };\n  return takeSequence;\n}\n\nfunction skipWhileFactory(collection, predicate, context, useKeys) {\n  var skipSequence = makeSequence(collection);\n  skipSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var isSkipping = true;\n    var iterations = 0;\n    collection.__iterate(function (v, k, c) {\n      if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) {\n        iterations++;\n        return fn(v, useKeys ? k : iterations - 1, this$1);\n      }\n    });\n    return iterations;\n  };\n  skipSequence.__iteratorUncached = function(type, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n    var skipping = true;\n    var iterations = 0;\n    return new Iterator(function () {\n      var step;\n      var k;\n      var v;\n      do {\n        step = iterator.next();\n        if (step.done) {\n          if (useKeys || type === ITERATE_VALUES) {\n            return step;\n          }\n          if (type === ITERATE_KEYS) {\n            return iteratorValue(type, iterations++, undefined, step);\n          }\n          return iteratorValue(type, iterations++, step.value[1], step);\n        }\n        var entry = step.value;\n        k = entry[0];\n        v = entry[1];\n        skipping && (skipping = predicate.call(context, v, k, this$1));\n      } while (skipping);\n      return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n    });\n  };\n  return skipSequence;\n}\n\nfunction concatFactory(collection, values) {\n  var isKeyedCollection = isKeyed(collection);\n  var iters = [collection]\n    .concat(values)\n    .map(function (v) {\n      if (!isCollection(v)) {\n        v = isKeyedCollection\n          ? keyedSeqFromValue(v)\n          : indexedSeqFromValue(Array.isArray(v) ? v : [v]);\n      } else if (isKeyedCollection) {\n        v = KeyedCollection(v);\n      }\n      return v;\n    })\n    .filter(function (v) { return v.size !== 0; });\n\n  if (iters.length === 0) {\n    return collection;\n  }\n\n  if (iters.length === 1) {\n    var singleton = iters[0];\n    if (\n      singleton === collection ||\n      (isKeyedCollection && isKeyed(singleton)) ||\n      (isIndexed(collection) && isIndexed(singleton))\n    ) {\n      return singleton;\n    }\n  }\n\n  var concatSeq = new ArraySeq(iters);\n  if (isKeyedCollection) {\n    concatSeq = concatSeq.toKeyedSeq();\n  } else if (!isIndexed(collection)) {\n    concatSeq = concatSeq.toSetSeq();\n  }\n  concatSeq = concatSeq.flatten(true);\n  concatSeq.size = iters.reduce(function (sum, seq) {\n    if (sum !== undefined) {\n      var size = seq.size;\n      if (size !== undefined) {\n        return sum + size;\n      }\n    }\n  }, 0);\n  return concatSeq;\n}\n\nfunction flattenFactory(collection, depth, useKeys) {\n  var flatSequence = makeSequence(collection);\n  flatSequence.__iterateUncached = function(fn, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterate(fn, reverse);\n    }\n    var iterations = 0;\n    var stopped = false;\n    function flatDeep(iter, currentDepth) {\n      iter.__iterate(function (v, k) {\n        if ((!depth || currentDepth < depth) && isCollection(v)) {\n          flatDeep(v, currentDepth + 1);\n        } else {\n          iterations++;\n          if (fn(v, useKeys ? k : iterations - 1, flatSequence) === false) {\n            stopped = true;\n          }\n        }\n        return !stopped;\n      }, reverse);\n    }\n    flatDeep(collection, 0);\n    return iterations;\n  };\n  flatSequence.__iteratorUncached = function(type, reverse) {\n    if (reverse) {\n      return this.cacheResult().__iterator(type, reverse);\n    }\n    var iterator = collection.__iterator(type, reverse);\n    var stack = [];\n    var iterations = 0;\n    return new Iterator(function () {\n      while (iterator) {\n        var step = iterator.next();\n        if (step.done !== false) {\n          iterator = stack.pop();\n          continue;\n        }\n        var v = step.value;\n        if (type === ITERATE_ENTRIES) {\n          v = v[1];\n        }\n        if ((!depth || stack.length < depth) && isCollection(v)) {\n          stack.push(iterator);\n          iterator = v.__iterator(type, reverse);\n        } else {\n          return useKeys ? step : iteratorValue(type, iterations++, v, step);\n        }\n      }\n      return iteratorDone();\n    });\n  };\n  return flatSequence;\n}\n\nfunction flatMapFactory(collection, mapper, context) {\n  var coerce = collectionClass(collection);\n  return collection\n    .toSeq()\n    .map(function (v, k) { return coerce(mapper.call(context, v, k, collection)); })\n    .flatten(true);\n}\n\nfunction interposeFactory(collection, separator) {\n  var interposedSequence = makeSequence(collection);\n  interposedSequence.size = collection.size && collection.size * 2 - 1;\n  interposedSequence.__iterateUncached = function(fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    collection.__iterate(\n      function (v) { return (!iterations || fn(separator, iterations++, this$1) !== false) &&\n        fn(v, iterations++, this$1) !== false; },\n      reverse\n    );\n    return iterations;\n  };\n  interposedSequence.__iteratorUncached = function(type, reverse) {\n    var iterator = collection.__iterator(ITERATE_VALUES, reverse);\n    var iterations = 0;\n    var step;\n    return new Iterator(function () {\n      if (!step || iterations % 2) {\n        step = iterator.next();\n        if (step.done) {\n          return step;\n        }\n      }\n      return iterations % 2\n        ? iteratorValue(type, iterations++, separator)\n        : iteratorValue(type, iterations++, step.value, step);\n    });\n  };\n  return interposedSequence;\n}\n\nfunction sortFactory(collection, comparator, mapper) {\n  if (!comparator) {\n    comparator = defaultComparator;\n  }\n  var isKeyedCollection = isKeyed(collection);\n  var index = 0;\n  var entries = collection\n    .toSeq()\n    .map(function (v, k) { return [k, v, index++, mapper ? mapper(v, k, collection) : v]; })\n    .valueSeq()\n    .toArray();\n  entries.sort(function (a, b) { return comparator(a[3], b[3]) || a[2] - b[2]; }).forEach(\n    isKeyedCollection\n      ? function (v, i) {\n          entries[i].length = 2;\n        }\n      : function (v, i) {\n          entries[i] = v[1];\n        }\n  );\n  return isKeyedCollection\n    ? KeyedSeq(entries)\n    : isIndexed(collection) ? IndexedSeq(entries) : SetSeq(entries);\n}\n\nfunction maxFactory(collection, comparator, mapper) {\n  if (!comparator) {\n    comparator = defaultComparator;\n  }\n  if (mapper) {\n    var entry = collection\n      .toSeq()\n      .map(function (v, k) { return [v, mapper(v, k, collection)]; })\n      .reduce(function (a, b) { return (maxCompare(comparator, a[1], b[1]) ? b : a); });\n    return entry && entry[0];\n  }\n  return collection.reduce(function (a, b) { return (maxCompare(comparator, a, b) ? b : a); });\n}\n\nfunction maxCompare(comparator, a, b) {\n  var comp = comparator(b, a);\n  // b is considered the new max if the comparator declares them equal, but\n  // they are not equal and b is in fact a nullish value.\n  return (\n    (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) ||\n    comp > 0\n  );\n}\n\nfunction zipWithFactory(keyIter, zipper, iters, zipAll) {\n  var zipSequence = makeSequence(keyIter);\n  var sizes = new ArraySeq(iters).map(function (i) { return i.size; });\n  zipSequence.size = zipAll ? sizes.max() : sizes.min();\n  // Note: this a generic base implementation of __iterate in terms of\n  // __iterator which may be more generically useful in the future.\n  zipSequence.__iterate = function(fn, reverse) {\n    var this$1 = this;\n\n    /* generic:\n    var iterator = this.__iterator(ITERATE_ENTRIES, reverse);\n    var step;\n    var iterations = 0;\n    while (!(step = iterator.next()).done) {\n      iterations++;\n      if (fn(step.value[1], step.value[0], this) === false) {\n        break;\n      }\n    }\n    return iterations;\n    */\n    // indexed:\n    var iterator = this.__iterator(ITERATE_VALUES, reverse);\n    var step;\n    var iterations = 0;\n    while (!(step = iterator.next()).done) {\n      if (fn(step.value, iterations++, this$1) === false) {\n        break;\n      }\n    }\n    return iterations;\n  };\n  zipSequence.__iteratorUncached = function(type, reverse) {\n    var iterators = iters.map(\n      function (i) { return ((i = Collection(i)), getIterator(reverse ? i.reverse() : i)); }\n    );\n    var iterations = 0;\n    var isDone = false;\n    return new Iterator(function () {\n      var steps;\n      if (!isDone) {\n        steps = iterators.map(function (i) { return i.next(); });\n        isDone = zipAll ? steps.every(function (s) { return s.done; }) : steps.some(function (s) { return s.done; });\n      }\n      if (isDone) {\n        return iteratorDone();\n      }\n      return iteratorValue(\n        type,\n        iterations++,\n        zipper.apply(null, steps.map(function (s) { return s.value; }))\n      );\n    });\n  };\n  return zipSequence;\n}\n\n// #pragma Helper Functions\n\nfunction reify(iter, seq) {\n  return iter === seq ? iter : isSeq(iter) ? seq : iter.constructor(seq);\n}\n\nfunction validateEntry(entry) {\n  if (entry !== Object(entry)) {\n    throw new TypeError('Expected [K, V] tuple: ' + entry);\n  }\n}\n\nfunction collectionClass(collection) {\n  return isKeyed(collection)\n    ? KeyedCollection\n    : isIndexed(collection) ? IndexedCollection : SetCollection;\n}\n\nfunction makeSequence(collection) {\n  return Object.create(\n    (isKeyed(collection)\n      ? KeyedSeq\n      : isIndexed(collection) ? IndexedSeq : SetSeq\n    ).prototype\n  );\n}\n\nfunction cacheResultThrough() {\n  if (this._iter.cacheResult) {\n    this._iter.cacheResult();\n    this.size = this._iter.size;\n    return this;\n  }\n  return Seq.prototype.cacheResult.call(this);\n}\n\nfunction defaultComparator(a, b) {\n  if (a === undefined && b === undefined) {\n    return 0;\n  }\n\n  if (a === undefined) {\n    return 1;\n  }\n\n  if (b === undefined) {\n    return -1;\n  }\n\n  return a > b ? 1 : a < b ? -1 : 0;\n}\n\n// http://jsperf.com/copy-array-inline\nfunction arrCopy(arr, offset) {\n  offset = offset || 0;\n  var len = Math.max(0, arr.length - offset);\n  var newArr = new Array(len);\n  for (var ii = 0; ii < len; ii++) {\n    newArr[ii] = arr[ii + offset];\n  }\n  return newArr;\n}\n\nfunction invariant(condition, error) {\n  if (!condition) { throw new Error(error); }\n}\n\nfunction assertNotInfinite(size) {\n  invariant(\n    size !== Infinity,\n    'Cannot perform this action with an infinite size.'\n  );\n}\n\nfunction coerceKeyPath(keyPath) {\n  if (isArrayLike(keyPath) && typeof keyPath !== 'string') {\n    return keyPath;\n  }\n  if (isOrdered(keyPath)) {\n    return keyPath.toArray();\n  }\n  throw new TypeError(\n    'Invalid keyPath: expected Ordered Collection or Array: ' + keyPath\n  );\n}\n\nfunction isPlainObj(value) {\n  return (\n    value && (value.constructor === Object || value.constructor === undefined)\n  );\n}\n\n/**\n * Returns true if the value is a potentially-persistent data structure, either\n * provided by Immutable.js or a plain Array or Object.\n */\nfunction isDataStructure(value) {\n  return isImmutable(value) || Array.isArray(value) || isPlainObj(value);\n}\n\n/**\n * Converts a value to a string, adding quotes if a string was provided.\n */\nfunction quoteString(value) {\n  try {\n    return typeof value === 'string' ? JSON.stringify(value) : String(value);\n  } catch (_ignoreError) {\n    return JSON.stringify(value);\n  }\n}\n\nfunction has(collection, key) {\n  return isImmutable(collection)\n    ? collection.has(key)\n    : isDataStructure(collection) && hasOwnProperty.call(collection, key);\n}\n\nfunction get(collection, key, notSetValue) {\n  return isImmutable(collection)\n    ? collection.get(key, notSetValue)\n    : !has(collection, key)\n      ? notSetValue\n      : typeof collection.get === 'function'\n        ? collection.get(key)\n        : collection[key];\n}\n\nfunction shallowCopy(from) {\n  if (Array.isArray(from)) {\n    return arrCopy(from);\n  }\n  var to = {};\n  for (var key in from) {\n    if (hasOwnProperty.call(from, key)) {\n      to[key] = from[key];\n    }\n  }\n  return to;\n}\n\nfunction remove(collection, key) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot update non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    if (!collection.remove) {\n      throw new TypeError(\n        'Cannot update immutable value without .remove() method: ' + collection\n      );\n    }\n    return collection.remove(key);\n  }\n  if (!hasOwnProperty.call(collection, key)) {\n    return collection;\n  }\n  var collectionCopy = shallowCopy(collection);\n  if (Array.isArray(collectionCopy)) {\n    collectionCopy.splice(key, 1);\n  } else {\n    delete collectionCopy[key];\n  }\n  return collectionCopy;\n}\n\nfunction set(collection, key, value) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot update non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    if (!collection.set) {\n      throw new TypeError(\n        'Cannot update immutable value without .set() method: ' + collection\n      );\n    }\n    return collection.set(key, value);\n  }\n  if (hasOwnProperty.call(collection, key) && value === collection[key]) {\n    return collection;\n  }\n  var collectionCopy = shallowCopy(collection);\n  collectionCopy[key] = value;\n  return collectionCopy;\n}\n\nfunction updateIn(collection, keyPath, notSetValue, updater) {\n  if (!updater) {\n    updater = notSetValue;\n    notSetValue = undefined;\n  }\n  var updatedValue = updateInDeeply(\n    isImmutable(collection),\n    collection,\n    coerceKeyPath(keyPath),\n    0,\n    notSetValue,\n    updater\n  );\n  return updatedValue === NOT_SET ? notSetValue : updatedValue;\n}\n\nfunction updateInDeeply(\n  inImmutable,\n  existing,\n  keyPath,\n  i,\n  notSetValue,\n  updater\n) {\n  var wasNotSet = existing === NOT_SET;\n  if (i === keyPath.length) {\n    var existingValue = wasNotSet ? notSetValue : existing;\n    var newValue = updater(existingValue);\n    return newValue === existingValue ? existing : newValue;\n  }\n  if (!wasNotSet && !isDataStructure(existing)) {\n    throw new TypeError(\n      'Cannot update within non-data-structure value in path [' +\n        keyPath.slice(0, i).map(quoteString) +\n        ']: ' +\n        existing\n    );\n  }\n  var key = keyPath[i];\n  var nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET);\n  var nextUpdated = updateInDeeply(\n    nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting),\n    nextExisting,\n    keyPath,\n    i + 1,\n    notSetValue,\n    updater\n  );\n  return nextUpdated === nextExisting\n    ? existing\n    : nextUpdated === NOT_SET\n      ? remove(existing, key)\n      : set(\n          wasNotSet ? (inImmutable ? emptyMap() : {}) : existing,\n          key,\n          nextUpdated\n        );\n}\n\nfunction setIn$1(collection, keyPath, value) {\n  return updateIn(collection, keyPath, NOT_SET, function () { return value; });\n}\n\nfunction setIn$$1(keyPath, v) {\n  return setIn$1(this, keyPath, v);\n}\n\nfunction removeIn(collection, keyPath) {\n  return updateIn(collection, keyPath, function () { return NOT_SET; });\n}\n\nfunction deleteIn(keyPath) {\n  return removeIn(this, keyPath);\n}\n\nfunction update$1(collection, key, notSetValue, updater) {\n  return updateIn(collection, [key], notSetValue, updater);\n}\n\nfunction update$$1(key, notSetValue, updater) {\n  return arguments.length === 1\n    ? key(this)\n    : update$1(this, key, notSetValue, updater);\n}\n\nfunction updateIn$1(keyPath, notSetValue, updater) {\n  return updateIn(this, keyPath, notSetValue, updater);\n}\n\nfunction merge() {\n  var iters = [], len = arguments.length;\n  while ( len-- ) iters[ len ] = arguments[ len ];\n\n  return mergeIntoKeyedWith(this, iters);\n}\n\nfunction mergeWith(merger) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return mergeIntoKeyedWith(this, iters, merger);\n}\n\nfunction mergeIntoKeyedWith(collection, collections, merger) {\n  var iters = [];\n  for (var ii = 0; ii < collections.length; ii++) {\n    var collection$1 = KeyedCollection(collections[ii]);\n    if (collection$1.size !== 0) {\n      iters.push(collection$1);\n    }\n  }\n  if (iters.length === 0) {\n    return collection;\n  }\n  if (collection.size === 0 && !collection.__ownerID && iters.length === 1) {\n    return collection.constructor(iters[0]);\n  }\n  return collection.withMutations(function (collection) {\n    var mergeIntoCollection = merger\n      ? function (value, key) {\n          update$1(\n            collection,\n            key,\n            NOT_SET,\n            function (oldVal) { return (oldVal === NOT_SET ? value : merger(oldVal, value, key)); }\n          );\n        }\n      : function (value, key) {\n          collection.set(key, value);\n        };\n    for (var ii = 0; ii < iters.length; ii++) {\n      iters[ii].forEach(mergeIntoCollection);\n    }\n  });\n}\n\nfunction merge$1(collection) {\n  var sources = [], len = arguments.length - 1;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n  return mergeWithSources(collection, sources);\n}\n\nfunction mergeWith$1(merger, collection) {\n  var sources = [], len = arguments.length - 2;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n  return mergeWithSources(collection, sources, merger);\n}\n\nfunction mergeDeep$1(collection) {\n  var sources = [], len = arguments.length - 1;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n  return mergeDeepWithSources(collection, sources);\n}\n\nfunction mergeDeepWith$1(merger, collection) {\n  var sources = [], len = arguments.length - 2;\n  while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n  return mergeDeepWithSources(collection, sources, merger);\n}\n\nfunction mergeDeepWithSources(collection, sources, merger) {\n  return mergeWithSources(collection, sources, deepMergerWith(merger));\n}\n\nfunction mergeWithSources(collection, sources, merger) {\n  if (!isDataStructure(collection)) {\n    throw new TypeError(\n      'Cannot merge into non-data-structure value: ' + collection\n    );\n  }\n  if (isImmutable(collection)) {\n    return collection.mergeWith\n      ? collection.mergeWith.apply(collection, [ merger ].concat( sources ))\n      : collection.concat.apply(collection, sources);\n  }\n  var isArray = Array.isArray(collection);\n  var merged = collection;\n  var Collection$$1 = isArray ? IndexedCollection : KeyedCollection;\n  var mergeItem = isArray\n    ? function (value) {\n        // Copy on write\n        if (merged === collection) {\n          merged = shallowCopy(merged);\n        }\n        merged.push(value);\n      }\n    : function (value, key) {\n        var hasVal = hasOwnProperty.call(merged, key);\n        var nextVal =\n          hasVal && merger ? merger(merged[key], value, key) : value;\n        if (!hasVal || nextVal !== merged[key]) {\n          // Copy on write\n          if (merged === collection) {\n            merged = shallowCopy(merged);\n          }\n          merged[key] = nextVal;\n        }\n      };\n  for (var i = 0; i < sources.length; i++) {\n    Collection$$1(sources[i]).forEach(mergeItem);\n  }\n  return merged;\n}\n\nfunction deepMergerWith(merger) {\n  function deepMerger(oldValue, newValue, key) {\n    return isDataStructure(oldValue) && isDataStructure(newValue)\n      ? mergeWithSources(oldValue, [newValue], deepMerger)\n      : merger ? merger(oldValue, newValue, key) : newValue;\n  }\n  return deepMerger;\n}\n\nfunction mergeDeep() {\n  var iters = [], len = arguments.length;\n  while ( len-- ) iters[ len ] = arguments[ len ];\n\n  return mergeDeepWithSources(this, iters);\n}\n\nfunction mergeDeepWith(merger) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return mergeDeepWithSources(this, iters, merger);\n}\n\nfunction mergeIn(keyPath) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return updateIn(this, keyPath, emptyMap(), function (m) { return mergeWithSources(m, iters); });\n}\n\nfunction mergeDeepIn(keyPath) {\n  var iters = [], len = arguments.length - 1;\n  while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n  return updateIn(this, keyPath, emptyMap(), function (m) { return mergeDeepWithSources(m, iters); }\n  );\n}\n\nfunction withMutations(fn) {\n  var mutable = this.asMutable();\n  fn(mutable);\n  return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;\n}\n\nfunction asMutable() {\n  return this.__ownerID ? this : this.__ensureOwner(new OwnerID());\n}\n\nfunction asImmutable() {\n  return this.__ensureOwner();\n}\n\nfunction wasAltered() {\n  return this.__altered;\n}\n\nvar Map = (function (KeyedCollection$$1) {\n  function Map(value) {\n    return value === null || value === undefined\n      ? emptyMap()\n      : isMap(value) && !isOrdered(value)\n        ? value\n        : emptyMap().withMutations(function (map) {\n            var iter = KeyedCollection$$1(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v, k) { return map.set(k, v); });\n          });\n  }\n\n  if ( KeyedCollection$$1 ) Map.__proto__ = KeyedCollection$$1;\n  Map.prototype = Object.create( KeyedCollection$$1 && KeyedCollection$$1.prototype );\n  Map.prototype.constructor = Map;\n\n  Map.of = function of () {\n    var keyValues = [], len = arguments.length;\n    while ( len-- ) keyValues[ len ] = arguments[ len ];\n\n    return emptyMap().withMutations(function (map) {\n      for (var i = 0; i < keyValues.length; i += 2) {\n        if (i + 1 >= keyValues.length) {\n          throw new Error('Missing value for key: ' + keyValues[i]);\n        }\n        map.set(keyValues[i], keyValues[i + 1]);\n      }\n    });\n  };\n\n  Map.prototype.toString = function toString () {\n    return this.__toString('Map {', '}');\n  };\n\n  // @pragma Access\n\n  Map.prototype.get = function get (k, notSetValue) {\n    return this._root\n      ? this._root.get(0, undefined, k, notSetValue)\n      : notSetValue;\n  };\n\n  // @pragma Modification\n\n  Map.prototype.set = function set (k, v) {\n    return updateMap(this, k, v);\n  };\n\n  Map.prototype.remove = function remove (k) {\n    return updateMap(this, k, NOT_SET);\n  };\n\n  Map.prototype.deleteAll = function deleteAll (keys) {\n    var collection = Collection(keys);\n\n    if (collection.size === 0) {\n      return this;\n    }\n\n    return this.withMutations(function (map) {\n      collection.forEach(function (key) { return map.remove(key); });\n    });\n  };\n\n  Map.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._root = null;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyMap();\n  };\n\n  // @pragma Composition\n\n  Map.prototype.sort = function sort (comparator) {\n    // Late binding\n    return OrderedMap(sortFactory(this, comparator));\n  };\n\n  Map.prototype.sortBy = function sortBy (mapper, comparator) {\n    // Late binding\n    return OrderedMap(sortFactory(this, comparator, mapper));\n  };\n\n  // @pragma Mutability\n\n  Map.prototype.__iterator = function __iterator (type, reverse) {\n    return new MapIterator(this, type, reverse);\n  };\n\n  Map.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var iterations = 0;\n    this._root &&\n      this._root.iterate(function (entry) {\n        iterations++;\n        return fn(entry[1], entry[0], this$1);\n      }, reverse);\n    return iterations;\n  };\n\n  Map.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyMap();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeMap(this.size, this._root, ownerID, this.__hash);\n  };\n\n  return Map;\n}(KeyedCollection));\n\nfunction isMap(maybeMap) {\n  return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]);\n}\n\nMap.isMap = isMap;\n\nvar IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';\n\nvar MapPrototype = Map.prototype;\nMapPrototype[IS_MAP_SENTINEL] = true;\nMapPrototype[DELETE] = MapPrototype.remove;\nMapPrototype.removeAll = MapPrototype.deleteAll;\nMapPrototype.concat = MapPrototype.merge;\nMapPrototype.setIn = setIn$$1;\nMapPrototype.removeIn = MapPrototype.deleteIn = deleteIn;\nMapPrototype.update = update$$1;\nMapPrototype.updateIn = updateIn$1;\nMapPrototype.merge = merge;\nMapPrototype.mergeWith = mergeWith;\nMapPrototype.mergeDeep = mergeDeep;\nMapPrototype.mergeDeepWith = mergeDeepWith;\nMapPrototype.mergeIn = mergeIn;\nMapPrototype.mergeDeepIn = mergeDeepIn;\nMapPrototype.withMutations = withMutations;\nMapPrototype.wasAltered = wasAltered;\nMapPrototype.asImmutable = asImmutable;\nMapPrototype['@@transducer/init'] = MapPrototype.asMutable = asMutable;\nMapPrototype['@@transducer/step'] = function(result, arr) {\n  return result.set(arr[0], arr[1]);\n};\nMapPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\n// #pragma Trie Nodes\n\nvar ArrayMapNode = function ArrayMapNode(ownerID, entries) {\n  this.ownerID = ownerID;\n  this.entries = entries;\n};\n\nArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  var entries = this.entries;\n  for (var ii = 0, len = entries.length; ii < len; ii++) {\n    if (is(key, entries[ii][0])) {\n      return entries[ii][1];\n    }\n  }\n  return notSetValue;\n};\n\nArrayMapNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  var removed = value === NOT_SET;\n\n  var entries = this.entries;\n  var idx = 0;\n  var len = entries.length;\n  for (; idx < len; idx++) {\n    if (is(key, entries[idx][0])) {\n      break;\n    }\n  }\n  var exists = idx < len;\n\n  if (exists ? entries[idx][1] === value : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n  (removed || !exists) && SetRef(didChangeSize);\n\n  if (removed && entries.length === 1) {\n    return; // undefined\n  }\n\n  if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n    return createNodes(ownerID, entries, key, value);\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newEntries = isEditable ? entries : arrCopy(entries);\n\n  if (exists) {\n    if (removed) {\n      idx === len - 1\n        ? newEntries.pop()\n        : (newEntries[idx] = newEntries.pop());\n    } else {\n      newEntries[idx] = [key, value];\n    }\n  } else {\n    newEntries.push([key, value]);\n  }\n\n  if (isEditable) {\n    this.entries = newEntries;\n    return this;\n  }\n\n  return new ArrayMapNode(ownerID, newEntries);\n};\n\nvar BitmapIndexedNode = function BitmapIndexedNode(ownerID, bitmap, nodes) {\n  this.ownerID = ownerID;\n  this.bitmap = bitmap;\n  this.nodes = nodes;\n};\n\nBitmapIndexedNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK);\n  var bitmap = this.bitmap;\n  return (bitmap & bit) === 0\n    ? notSetValue\n    : this.nodes[popCount(bitmap & (bit - 1))].get(\n        shift + SHIFT,\n        keyHash,\n        key,\n        notSetValue\n      );\n};\n\nBitmapIndexedNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var bit = 1 << keyHashFrag;\n  var bitmap = this.bitmap;\n  var exists = (bitmap & bit) !== 0;\n\n  if (!exists && value === NOT_SET) {\n    return this;\n  }\n\n  var idx = popCount(bitmap & (bit - 1));\n  var nodes = this.nodes;\n  var node = exists ? nodes[idx] : undefined;\n  var newNode = updateNode(\n    node,\n    ownerID,\n    shift + SHIFT,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n\n  if (newNode === node) {\n    return this;\n  }\n\n  if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n    return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);\n  }\n\n  if (\n    exists &&\n    !newNode &&\n    nodes.length === 2 &&\n    isLeafNode(nodes[idx ^ 1])\n  ) {\n    return nodes[idx ^ 1];\n  }\n\n  if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n    return newNode;\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit;\n  var newNodes = exists\n    ? newNode\n      ? setAt(nodes, idx, newNode, isEditable)\n      : spliceOut(nodes, idx, isEditable)\n    : spliceIn(nodes, idx, newNode, isEditable);\n\n  if (isEditable) {\n    this.bitmap = newBitmap;\n    this.nodes = newNodes;\n    return this;\n  }\n\n  return new BitmapIndexedNode(ownerID, newBitmap, newNodes);\n};\n\nvar HashArrayMapNode = function HashArrayMapNode(ownerID, count, nodes) {\n  this.ownerID = ownerID;\n  this.count = count;\n  this.nodes = nodes;\n};\n\nHashArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var node = this.nodes[idx];\n  return node\n    ? node.get(shift + SHIFT, keyHash, key, notSetValue)\n    : notSetValue;\n};\n\nHashArrayMapNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n  var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n  var removed = value === NOT_SET;\n  var nodes = this.nodes;\n  var node = nodes[idx];\n\n  if (removed && !node) {\n    return this;\n  }\n\n  var newNode = updateNode(\n    node,\n    ownerID,\n    shift + SHIFT,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n  if (newNode === node) {\n    return this;\n  }\n\n  var newCount = this.count;\n  if (!node) {\n    newCount++;\n  } else if (!newNode) {\n    newCount--;\n    if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n      return packNodes(ownerID, nodes, newCount, idx);\n    }\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newNodes = setAt(nodes, idx, newNode, isEditable);\n\n  if (isEditable) {\n    this.count = newCount;\n    this.nodes = newNodes;\n    return this;\n  }\n\n  return new HashArrayMapNode(ownerID, newCount, newNodes);\n};\n\nvar HashCollisionNode = function HashCollisionNode(ownerID, keyHash, entries) {\n  this.ownerID = ownerID;\n  this.keyHash = keyHash;\n  this.entries = entries;\n};\n\nHashCollisionNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  var entries = this.entries;\n  for (var ii = 0, len = entries.length; ii < len; ii++) {\n    if (is(key, entries[ii][0])) {\n      return entries[ii][1];\n    }\n  }\n  return notSetValue;\n};\n\nHashCollisionNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  if (keyHash === undefined) {\n    keyHash = hash(key);\n  }\n\n  var removed = value === NOT_SET;\n\n  if (keyHash !== this.keyHash) {\n    if (removed) {\n      return this;\n    }\n    SetRef(didAlter);\n    SetRef(didChangeSize);\n    return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]);\n  }\n\n  var entries = this.entries;\n  var idx = 0;\n  var len = entries.length;\n  for (; idx < len; idx++) {\n    if (is(key, entries[idx][0])) {\n      break;\n    }\n  }\n  var exists = idx < len;\n\n  if (exists ? entries[idx][1] === value : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n  (removed || !exists) && SetRef(didChangeSize);\n\n  if (removed && len === 2) {\n    return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]);\n  }\n\n  var isEditable = ownerID && ownerID === this.ownerID;\n  var newEntries = isEditable ? entries : arrCopy(entries);\n\n  if (exists) {\n    if (removed) {\n      idx === len - 1\n        ? newEntries.pop()\n        : (newEntries[idx] = newEntries.pop());\n    } else {\n      newEntries[idx] = [key, value];\n    }\n  } else {\n    newEntries.push([key, value]);\n  }\n\n  if (isEditable) {\n    this.entries = newEntries;\n    return this;\n  }\n\n  return new HashCollisionNode(ownerID, this.keyHash, newEntries);\n};\n\nvar ValueNode = function ValueNode(ownerID, keyHash, entry) {\n  this.ownerID = ownerID;\n  this.keyHash = keyHash;\n  this.entry = entry;\n};\n\nValueNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n  return is(key, this.entry[0]) ? this.entry[1] : notSetValue;\n};\n\nValueNode.prototype.update = function update$$1 (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n  var removed = value === NOT_SET;\n  var keyMatch = is(key, this.entry[0]);\n  if (keyMatch ? value === this.entry[1] : removed) {\n    return this;\n  }\n\n  SetRef(didAlter);\n\n  if (removed) {\n    SetRef(didChangeSize);\n    return; // undefined\n  }\n\n  if (keyMatch) {\n    if (ownerID && ownerID === this.ownerID) {\n      this.entry[1] = value;\n      return this;\n    }\n    return new ValueNode(ownerID, this.keyHash, [key, value]);\n  }\n\n  SetRef(didChangeSize);\n  return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]);\n};\n\n// #pragma Iterators\n\nArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = function(\n  fn,\n  reverse\n) {\n  var entries = this.entries;\n  for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) {\n    if (fn(entries[reverse ? maxIndex - ii : ii]) === false) {\n      return false;\n    }\n  }\n};\n\nBitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = function(\n  fn,\n  reverse\n) {\n  var nodes = this.nodes;\n  for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) {\n    var node = nodes[reverse ? maxIndex - ii : ii];\n    if (node && node.iterate(fn, reverse) === false) {\n      return false;\n    }\n  }\n};\n\n// eslint-disable-next-line no-unused-vars\nValueNode.prototype.iterate = function(fn, reverse) {\n  return fn(this.entry);\n};\n\nvar MapIterator = (function (Iterator$$1) {\n  function MapIterator(map, type, reverse) {\n    this._type = type;\n    this._reverse = reverse;\n    this._stack = map._root && mapIteratorFrame(map._root);\n  }\n\n  if ( Iterator$$1 ) MapIterator.__proto__ = Iterator$$1;\n  MapIterator.prototype = Object.create( Iterator$$1 && Iterator$$1.prototype );\n  MapIterator.prototype.constructor = MapIterator;\n\n  MapIterator.prototype.next = function next () {\n    var this$1 = this;\n\n    var type = this._type;\n    var stack = this._stack;\n    while (stack) {\n      var node = stack.node;\n      var index = stack.index++;\n      var maxIndex = (void 0);\n      if (node.entry) {\n        if (index === 0) {\n          return mapIteratorValue(type, node.entry);\n        }\n      } else if (node.entries) {\n        maxIndex = node.entries.length - 1;\n        if (index <= maxIndex) {\n          return mapIteratorValue(\n            type,\n            node.entries[this$1._reverse ? maxIndex - index : index]\n          );\n        }\n      } else {\n        maxIndex = node.nodes.length - 1;\n        if (index <= maxIndex) {\n          var subNode = node.nodes[this$1._reverse ? maxIndex - index : index];\n          if (subNode) {\n            if (subNode.entry) {\n              return mapIteratorValue(type, subNode.entry);\n            }\n            stack = this$1._stack = mapIteratorFrame(subNode, stack);\n          }\n          continue;\n        }\n      }\n      stack = this$1._stack = this$1._stack.__prev;\n    }\n    return iteratorDone();\n  };\n\n  return MapIterator;\n}(Iterator));\n\nfunction mapIteratorValue(type, entry) {\n  return iteratorValue(type, entry[0], entry[1]);\n}\n\nfunction mapIteratorFrame(node, prev) {\n  return {\n    node: node,\n    index: 0,\n    __prev: prev\n  };\n}\n\nfunction makeMap(size, root, ownerID, hash$$1) {\n  var map = Object.create(MapPrototype);\n  map.size = size;\n  map._root = root;\n  map.__ownerID = ownerID;\n  map.__hash = hash$$1;\n  map.__altered = false;\n  return map;\n}\n\nvar EMPTY_MAP;\nfunction emptyMap() {\n  return EMPTY_MAP || (EMPTY_MAP = makeMap(0));\n}\n\nfunction updateMap(map, k, v) {\n  var newRoot;\n  var newSize;\n  if (!map._root) {\n    if (v === NOT_SET) {\n      return map;\n    }\n    newSize = 1;\n    newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]);\n  } else {\n    var didChangeSize = MakeRef(CHANGE_LENGTH);\n    var didAlter = MakeRef(DID_ALTER);\n    newRoot = updateNode(\n      map._root,\n      map.__ownerID,\n      0,\n      undefined,\n      k,\n      v,\n      didChangeSize,\n      didAlter\n    );\n    if (!didAlter.value) {\n      return map;\n    }\n    newSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0);\n  }\n  if (map.__ownerID) {\n    map.size = newSize;\n    map._root = newRoot;\n    map.__hash = undefined;\n    map.__altered = true;\n    return map;\n  }\n  return newRoot ? makeMap(newSize, newRoot) : emptyMap();\n}\n\nfunction updateNode(\n  node,\n  ownerID,\n  shift,\n  keyHash,\n  key,\n  value,\n  didChangeSize,\n  didAlter\n) {\n  if (!node) {\n    if (value === NOT_SET) {\n      return node;\n    }\n    SetRef(didAlter);\n    SetRef(didChangeSize);\n    return new ValueNode(ownerID, keyHash, [key, value]);\n  }\n  return node.update(\n    ownerID,\n    shift,\n    keyHash,\n    key,\n    value,\n    didChangeSize,\n    didAlter\n  );\n}\n\nfunction isLeafNode(node) {\n  return (\n    node.constructor === ValueNode || node.constructor === HashCollisionNode\n  );\n}\n\nfunction mergeIntoNode(node, ownerID, shift, keyHash, entry) {\n  if (node.keyHash === keyHash) {\n    return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]);\n  }\n\n  var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK;\n  var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n\n  var newNode;\n  var nodes =\n    idx1 === idx2\n      ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)]\n      : ((newNode = new ValueNode(ownerID, keyHash, entry)),\n        idx1 < idx2 ? [node, newNode] : [newNode, node]);\n\n  return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes);\n}\n\nfunction createNodes(ownerID, entries, key, value) {\n  if (!ownerID) {\n    ownerID = new OwnerID();\n  }\n  var node = new ValueNode(ownerID, hash(key), [key, value]);\n  for (var ii = 0; ii < entries.length; ii++) {\n    var entry = entries[ii];\n    node = node.update(ownerID, 0, undefined, entry[0], entry[1]);\n  }\n  return node;\n}\n\nfunction packNodes(ownerID, nodes, count, excluding) {\n  var bitmap = 0;\n  var packedII = 0;\n  var packedNodes = new Array(count);\n  for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n    var node = nodes[ii];\n    if (node !== undefined && ii !== excluding) {\n      bitmap |= bit;\n      packedNodes[packedII++] = node;\n    }\n  }\n  return new BitmapIndexedNode(ownerID, bitmap, packedNodes);\n}\n\nfunction expandNodes(ownerID, nodes, bitmap, including, node) {\n  var count = 0;\n  var expandedNodes = new Array(SIZE);\n  for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n    expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined;\n  }\n  expandedNodes[including] = node;\n  return new HashArrayMapNode(ownerID, count + 1, expandedNodes);\n}\n\nfunction popCount(x) {\n  x -= (x >> 1) & 0x55555555;\n  x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n  x = (x + (x >> 4)) & 0x0f0f0f0f;\n  x += x >> 8;\n  x += x >> 16;\n  return x & 0x7f;\n}\n\nfunction setAt(array, idx, val, canEdit) {\n  var newArray = canEdit ? array : arrCopy(array);\n  newArray[idx] = val;\n  return newArray;\n}\n\nfunction spliceIn(array, idx, val, canEdit) {\n  var newLen = array.length + 1;\n  if (canEdit && idx + 1 === newLen) {\n    array[idx] = val;\n    return array;\n  }\n  var newArray = new Array(newLen);\n  var after = 0;\n  for (var ii = 0; ii < newLen; ii++) {\n    if (ii === idx) {\n      newArray[ii] = val;\n      after = -1;\n    } else {\n      newArray[ii] = array[ii + after];\n    }\n  }\n  return newArray;\n}\n\nfunction spliceOut(array, idx, canEdit) {\n  var newLen = array.length - 1;\n  if (canEdit && idx === newLen) {\n    array.pop();\n    return array;\n  }\n  var newArray = new Array(newLen);\n  var after = 0;\n  for (var ii = 0; ii < newLen; ii++) {\n    if (ii === idx) {\n      after = 1;\n    }\n    newArray[ii] = array[ii + after];\n  }\n  return newArray;\n}\n\nvar MAX_ARRAY_MAP_SIZE = SIZE / 4;\nvar MAX_BITMAP_INDEXED_SIZE = SIZE / 2;\nvar MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4;\n\nvar List = (function (IndexedCollection$$1) {\n  function List(value) {\n    var empty = emptyList();\n    if (value === null || value === undefined) {\n      return empty;\n    }\n    if (isList(value)) {\n      return value;\n    }\n    var iter = IndexedCollection$$1(value);\n    var size = iter.size;\n    if (size === 0) {\n      return empty;\n    }\n    assertNotInfinite(size);\n    if (size > 0 && size < SIZE) {\n      return makeList(0, size, SHIFT, null, new VNode(iter.toArray()));\n    }\n    return empty.withMutations(function (list) {\n      list.setSize(size);\n      iter.forEach(function (v, i) { return list.set(i, v); });\n    });\n  }\n\n  if ( IndexedCollection$$1 ) List.__proto__ = IndexedCollection$$1;\n  List.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n  List.prototype.constructor = List;\n\n  List.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  List.prototype.toString = function toString () {\n    return this.__toString('List [', ']');\n  };\n\n  // @pragma Access\n\n  List.prototype.get = function get (index, notSetValue) {\n    index = wrapIndex(this, index);\n    if (index >= 0 && index < this.size) {\n      index += this._origin;\n      var node = listNodeFor(this, index);\n      return node && node.array[index & MASK];\n    }\n    return notSetValue;\n  };\n\n  // @pragma Modification\n\n  List.prototype.set = function set (index, value) {\n    return updateList(this, index, value);\n  };\n\n  List.prototype.remove = function remove (index) {\n    return !this.has(index)\n      ? this\n      : index === 0\n        ? this.shift()\n        : index === this.size - 1 ? this.pop() : this.splice(index, 1);\n  };\n\n  List.prototype.insert = function insert (index, value) {\n    return this.splice(index, 0, value);\n  };\n\n  List.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = this._origin = this._capacity = 0;\n      this._level = SHIFT;\n      this._root = this._tail = null;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyList();\n  };\n\n  List.prototype.push = function push (/*...values*/) {\n    var values = arguments;\n    var oldSize = this.size;\n    return this.withMutations(function (list) {\n      setListBounds(list, 0, oldSize + values.length);\n      for (var ii = 0; ii < values.length; ii++) {\n        list.set(oldSize + ii, values[ii]);\n      }\n    });\n  };\n\n  List.prototype.pop = function pop () {\n    return setListBounds(this, 0, -1);\n  };\n\n  List.prototype.unshift = function unshift (/*...values*/) {\n    var values = arguments;\n    return this.withMutations(function (list) {\n      setListBounds(list, -values.length);\n      for (var ii = 0; ii < values.length; ii++) {\n        list.set(ii, values[ii]);\n      }\n    });\n  };\n\n  List.prototype.shift = function shift () {\n    return setListBounds(this, 1);\n  };\n\n  // @pragma Composition\n\n  List.prototype.concat = function concat (/*...collections*/) {\n    var arguments$1 = arguments;\n\n    var seqs = [];\n    for (var i = 0; i < arguments.length; i++) {\n      var argument = arguments$1[i];\n      var seq = IndexedCollection$$1(\n        typeof argument !== 'string' && hasIterator(argument)\n          ? argument\n          : [argument]\n      );\n      if (seq.size !== 0) {\n        seqs.push(seq);\n      }\n    }\n    if (seqs.length === 0) {\n      return this;\n    }\n    if (this.size === 0 && !this.__ownerID && seqs.length === 1) {\n      return this.constructor(seqs[0]);\n    }\n    return this.withMutations(function (list) {\n      seqs.forEach(function (seq) { return seq.forEach(function (value) { return list.push(value); }); });\n    });\n  };\n\n  List.prototype.setSize = function setSize (size) {\n    return setListBounds(this, 0, size);\n  };\n\n  // @pragma Iteration\n\n  List.prototype.slice = function slice (begin, end) {\n    var size = this.size;\n    if (wholeSlice(begin, end, size)) {\n      return this;\n    }\n    return setListBounds(\n      this,\n      resolveBegin(begin, size),\n      resolveEnd(end, size)\n    );\n  };\n\n  List.prototype.__iterator = function __iterator (type, reverse) {\n    var index = reverse ? this.size : 0;\n    var values = iterateList(this, reverse);\n    return new Iterator(function () {\n      var value = values();\n      return value === DONE\n        ? iteratorDone()\n        : iteratorValue(type, reverse ? --index : index++, value);\n    });\n  };\n\n  List.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var index = reverse ? this.size : 0;\n    var values = iterateList(this, reverse);\n    var value;\n    while ((value = values()) !== DONE) {\n      if (fn(value, reverse ? --index : index++, this$1) === false) {\n        break;\n      }\n    }\n    return index;\n  };\n\n  List.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyList();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeList(\n      this._origin,\n      this._capacity,\n      this._level,\n      this._root,\n      this._tail,\n      ownerID,\n      this.__hash\n    );\n  };\n\n  return List;\n}(IndexedCollection));\n\nfunction isList(maybeList) {\n  return !!(maybeList && maybeList[IS_LIST_SENTINEL]);\n}\n\nList.isList = isList;\n\nvar IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';\n\nvar ListPrototype = List.prototype;\nListPrototype[IS_LIST_SENTINEL] = true;\nListPrototype[DELETE] = ListPrototype.remove;\nListPrototype.merge = ListPrototype.concat;\nListPrototype.setIn = setIn$$1;\nListPrototype.deleteIn = ListPrototype.removeIn = deleteIn;\nListPrototype.update = update$$1;\nListPrototype.updateIn = updateIn$1;\nListPrototype.mergeIn = mergeIn;\nListPrototype.mergeDeepIn = mergeDeepIn;\nListPrototype.withMutations = withMutations;\nListPrototype.wasAltered = wasAltered;\nListPrototype.asImmutable = asImmutable;\nListPrototype['@@transducer/init'] = ListPrototype.asMutable = asMutable;\nListPrototype['@@transducer/step'] = function(result, arr) {\n  return result.push(arr);\n};\nListPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nvar VNode = function VNode(array, ownerID) {\n  this.array = array;\n  this.ownerID = ownerID;\n};\n\n// TODO: seems like these methods are very similar\n\nVNode.prototype.removeBefore = function removeBefore (ownerID, level, index) {\n  if (index === level ? 1 << level : 0 || this.array.length === 0) {\n    return this;\n  }\n  var originIndex = (index >>> level) & MASK;\n  if (originIndex >= this.array.length) {\n    return new VNode([], ownerID);\n  }\n  var removingFirst = originIndex === 0;\n  var newChild;\n  if (level > 0) {\n    var oldChild = this.array[originIndex];\n    newChild =\n      oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index);\n    if (newChild === oldChild && removingFirst) {\n      return this;\n    }\n  }\n  if (removingFirst && !newChild) {\n    return this;\n  }\n  var editable = editableVNode(this, ownerID);\n  if (!removingFirst) {\n    for (var ii = 0; ii < originIndex; ii++) {\n      editable.array[ii] = undefined;\n    }\n  }\n  if (newChild) {\n    editable.array[originIndex] = newChild;\n  }\n  return editable;\n};\n\nVNode.prototype.removeAfter = function removeAfter (ownerID, level, index) {\n  if (index === (level ? 1 << level : 0) || this.array.length === 0) {\n    return this;\n  }\n  var sizeIndex = ((index - 1) >>> level) & MASK;\n  if (sizeIndex >= this.array.length) {\n    return this;\n  }\n\n  var newChild;\n  if (level > 0) {\n    var oldChild = this.array[sizeIndex];\n    newChild =\n      oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index);\n    if (newChild === oldChild && sizeIndex === this.array.length - 1) {\n      return this;\n    }\n  }\n\n  var editable = editableVNode(this, ownerID);\n  editable.array.splice(sizeIndex + 1);\n  if (newChild) {\n    editable.array[sizeIndex] = newChild;\n  }\n  return editable;\n};\n\nvar DONE = {};\n\nfunction iterateList(list, reverse) {\n  var left = list._origin;\n  var right = list._capacity;\n  var tailPos = getTailOffset(right);\n  var tail = list._tail;\n\n  return iterateNodeOrLeaf(list._root, list._level, 0);\n\n  function iterateNodeOrLeaf(node, level, offset) {\n    return level === 0\n      ? iterateLeaf(node, offset)\n      : iterateNode(node, level, offset);\n  }\n\n  function iterateLeaf(node, offset) {\n    var array = offset === tailPos ? tail && tail.array : node && node.array;\n    var from = offset > left ? 0 : left - offset;\n    var to = right - offset;\n    if (to > SIZE) {\n      to = SIZE;\n    }\n    return function () {\n      if (from === to) {\n        return DONE;\n      }\n      var idx = reverse ? --to : from++;\n      return array && array[idx];\n    };\n  }\n\n  function iterateNode(node, level, offset) {\n    var values;\n    var array = node && node.array;\n    var from = offset > left ? 0 : (left - offset) >> level;\n    var to = ((right - offset) >> level) + 1;\n    if (to > SIZE) {\n      to = SIZE;\n    }\n    return function () {\n      while (true) {\n        if (values) {\n          var value = values();\n          if (value !== DONE) {\n            return value;\n          }\n          values = null;\n        }\n        if (from === to) {\n          return DONE;\n        }\n        var idx = reverse ? --to : from++;\n        values = iterateNodeOrLeaf(\n          array && array[idx],\n          level - SHIFT,\n          offset + (idx << level)\n        );\n      }\n    };\n  }\n}\n\nfunction makeList(origin, capacity, level, root, tail, ownerID, hash) {\n  var list = Object.create(ListPrototype);\n  list.size = capacity - origin;\n  list._origin = origin;\n  list._capacity = capacity;\n  list._level = level;\n  list._root = root;\n  list._tail = tail;\n  list.__ownerID = ownerID;\n  list.__hash = hash;\n  list.__altered = false;\n  return list;\n}\n\nvar EMPTY_LIST;\nfunction emptyList() {\n  return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT));\n}\n\nfunction updateList(list, index, value) {\n  index = wrapIndex(list, index);\n\n  if (index !== index) {\n    return list;\n  }\n\n  if (index >= list.size || index < 0) {\n    return list.withMutations(function (list) {\n      index < 0\n        ? setListBounds(list, index).set(0, value)\n        : setListBounds(list, 0, index + 1).set(index, value);\n    });\n  }\n\n  index += list._origin;\n\n  var newTail = list._tail;\n  var newRoot = list._root;\n  var didAlter = MakeRef(DID_ALTER);\n  if (index >= getTailOffset(list._capacity)) {\n    newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter);\n  } else {\n    newRoot = updateVNode(\n      newRoot,\n      list.__ownerID,\n      list._level,\n      index,\n      value,\n      didAlter\n    );\n  }\n\n  if (!didAlter.value) {\n    return list;\n  }\n\n  if (list.__ownerID) {\n    list._root = newRoot;\n    list._tail = newTail;\n    list.__hash = undefined;\n    list.__altered = true;\n    return list;\n  }\n  return makeList(list._origin, list._capacity, list._level, newRoot, newTail);\n}\n\nfunction updateVNode(node, ownerID, level, index, value, didAlter) {\n  var idx = (index >>> level) & MASK;\n  var nodeHas = node && idx < node.array.length;\n  if (!nodeHas && value === undefined) {\n    return node;\n  }\n\n  var newNode;\n\n  if (level > 0) {\n    var lowerNode = node && node.array[idx];\n    var newLowerNode = updateVNode(\n      lowerNode,\n      ownerID,\n      level - SHIFT,\n      index,\n      value,\n      didAlter\n    );\n    if (newLowerNode === lowerNode) {\n      return node;\n    }\n    newNode = editableVNode(node, ownerID);\n    newNode.array[idx] = newLowerNode;\n    return newNode;\n  }\n\n  if (nodeHas && node.array[idx] === value) {\n    return node;\n  }\n\n  SetRef(didAlter);\n\n  newNode = editableVNode(node, ownerID);\n  if (value === undefined && idx === newNode.array.length - 1) {\n    newNode.array.pop();\n  } else {\n    newNode.array[idx] = value;\n  }\n  return newNode;\n}\n\nfunction editableVNode(node, ownerID) {\n  if (ownerID && node && ownerID === node.ownerID) {\n    return node;\n  }\n  return new VNode(node ? node.array.slice() : [], ownerID);\n}\n\nfunction listNodeFor(list, rawIndex) {\n  if (rawIndex >= getTailOffset(list._capacity)) {\n    return list._tail;\n  }\n  if (rawIndex < 1 << (list._level + SHIFT)) {\n    var node = list._root;\n    var level = list._level;\n    while (node && level > 0) {\n      node = node.array[(rawIndex >>> level) & MASK];\n      level -= SHIFT;\n    }\n    return node;\n  }\n}\n\nfunction setListBounds(list, begin, end) {\n  // Sanitize begin & end using this shorthand for ToInt32(argument)\n  // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n  if (begin !== undefined) {\n    begin |= 0;\n  }\n  if (end !== undefined) {\n    end |= 0;\n  }\n  var owner = list.__ownerID || new OwnerID();\n  var oldOrigin = list._origin;\n  var oldCapacity = list._capacity;\n  var newOrigin = oldOrigin + begin;\n  var newCapacity =\n    end === undefined\n      ? oldCapacity\n      : end < 0 ? oldCapacity + end : oldOrigin + end;\n  if (newOrigin === oldOrigin && newCapacity === oldCapacity) {\n    return list;\n  }\n\n  // If it's going to end after it starts, it's empty.\n  if (newOrigin >= newCapacity) {\n    return list.clear();\n  }\n\n  var newLevel = list._level;\n  var newRoot = list._root;\n\n  // New origin might need creating a higher root.\n  var offsetShift = 0;\n  while (newOrigin + offsetShift < 0) {\n    newRoot = new VNode(\n      newRoot && newRoot.array.length ? [undefined, newRoot] : [],\n      owner\n    );\n    newLevel += SHIFT;\n    offsetShift += 1 << newLevel;\n  }\n  if (offsetShift) {\n    newOrigin += offsetShift;\n    oldOrigin += offsetShift;\n    newCapacity += offsetShift;\n    oldCapacity += offsetShift;\n  }\n\n  var oldTailOffset = getTailOffset(oldCapacity);\n  var newTailOffset = getTailOffset(newCapacity);\n\n  // New size might need creating a higher root.\n  while (newTailOffset >= 1 << (newLevel + SHIFT)) {\n    newRoot = new VNode(\n      newRoot && newRoot.array.length ? [newRoot] : [],\n      owner\n    );\n    newLevel += SHIFT;\n  }\n\n  // Locate or create the new tail.\n  var oldTail = list._tail;\n  var newTail =\n    newTailOffset < oldTailOffset\n      ? listNodeFor(list, newCapacity - 1)\n      : newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail;\n\n  // Merge Tail into tree.\n  if (\n    oldTail &&\n    newTailOffset > oldTailOffset &&\n    newOrigin < oldCapacity &&\n    oldTail.array.length\n  ) {\n    newRoot = editableVNode(newRoot, owner);\n    var node = newRoot;\n    for (var level = newLevel; level > SHIFT; level -= SHIFT) {\n      var idx = (oldTailOffset >>> level) & MASK;\n      node = node.array[idx] = editableVNode(node.array[idx], owner);\n    }\n    node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail;\n  }\n\n  // If the size has been reduced, there's a chance the tail needs to be trimmed.\n  if (newCapacity < oldCapacity) {\n    newTail = newTail && newTail.removeAfter(owner, 0, newCapacity);\n  }\n\n  // If the new origin is within the tail, then we do not need a root.\n  if (newOrigin >= newTailOffset) {\n    newOrigin -= newTailOffset;\n    newCapacity -= newTailOffset;\n    newLevel = SHIFT;\n    newRoot = null;\n    newTail = newTail && newTail.removeBefore(owner, 0, newOrigin);\n\n    // Otherwise, if the root has been trimmed, garbage collect.\n  } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) {\n    offsetShift = 0;\n\n    // Identify the new top root node of the subtree of the old root.\n    while (newRoot) {\n      var beginIndex = (newOrigin >>> newLevel) & MASK;\n      if ((beginIndex !== newTailOffset >>> newLevel) & MASK) {\n        break;\n      }\n      if (beginIndex) {\n        offsetShift += (1 << newLevel) * beginIndex;\n      }\n      newLevel -= SHIFT;\n      newRoot = newRoot.array[beginIndex];\n    }\n\n    // Trim the new sides of the new root.\n    if (newRoot && newOrigin > oldOrigin) {\n      newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift);\n    }\n    if (newRoot && newTailOffset < oldTailOffset) {\n      newRoot = newRoot.removeAfter(\n        owner,\n        newLevel,\n        newTailOffset - offsetShift\n      );\n    }\n    if (offsetShift) {\n      newOrigin -= offsetShift;\n      newCapacity -= offsetShift;\n    }\n  }\n\n  if (list.__ownerID) {\n    list.size = newCapacity - newOrigin;\n    list._origin = newOrigin;\n    list._capacity = newCapacity;\n    list._level = newLevel;\n    list._root = newRoot;\n    list._tail = newTail;\n    list.__hash = undefined;\n    list.__altered = true;\n    return list;\n  }\n  return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail);\n}\n\nfunction getTailOffset(size) {\n  return size < SIZE ? 0 : ((size - 1) >>> SHIFT) << SHIFT;\n}\n\nvar OrderedMap = (function (Map$$1) {\n  function OrderedMap(value) {\n    return value === null || value === undefined\n      ? emptyOrderedMap()\n      : isOrderedMap(value)\n        ? value\n        : emptyOrderedMap().withMutations(function (map) {\n            var iter = KeyedCollection(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v, k) { return map.set(k, v); });\n          });\n  }\n\n  if ( Map$$1 ) OrderedMap.__proto__ = Map$$1;\n  OrderedMap.prototype = Object.create( Map$$1 && Map$$1.prototype );\n  OrderedMap.prototype.constructor = OrderedMap;\n\n  OrderedMap.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  OrderedMap.prototype.toString = function toString () {\n    return this.__toString('OrderedMap {', '}');\n  };\n\n  // @pragma Access\n\n  OrderedMap.prototype.get = function get (k, notSetValue) {\n    var index = this._map.get(k);\n    return index !== undefined ? this._list.get(index)[1] : notSetValue;\n  };\n\n  // @pragma Modification\n\n  OrderedMap.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._map.clear();\n      this._list.clear();\n      return this;\n    }\n    return emptyOrderedMap();\n  };\n\n  OrderedMap.prototype.set = function set (k, v) {\n    return updateOrderedMap(this, k, v);\n  };\n\n  OrderedMap.prototype.remove = function remove (k) {\n    return updateOrderedMap(this, k, NOT_SET);\n  };\n\n  OrderedMap.prototype.wasAltered = function wasAltered () {\n    return this._map.wasAltered() || this._list.wasAltered();\n  };\n\n  OrderedMap.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._list.__iterate(\n      function (entry) { return entry && fn(entry[1], entry[0], this$1); },\n      reverse\n    );\n  };\n\n  OrderedMap.prototype.__iterator = function __iterator (type, reverse) {\n    return this._list.fromEntrySeq().__iterator(type, reverse);\n  };\n\n  OrderedMap.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    var newMap = this._map.__ensureOwner(ownerID);\n    var newList = this._list.__ensureOwner(ownerID);\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyOrderedMap();\n      }\n      this.__ownerID = ownerID;\n      this._map = newMap;\n      this._list = newList;\n      return this;\n    }\n    return makeOrderedMap(newMap, newList, ownerID, this.__hash);\n  };\n\n  return OrderedMap;\n}(Map));\n\nfunction isOrderedMap(maybeOrderedMap) {\n  return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap);\n}\n\nOrderedMap.isOrderedMap = isOrderedMap;\n\nOrderedMap.prototype[IS_ORDERED_SENTINEL] = true;\nOrderedMap.prototype[DELETE] = OrderedMap.prototype.remove;\n\nfunction makeOrderedMap(map, list, ownerID, hash) {\n  var omap = Object.create(OrderedMap.prototype);\n  omap.size = map ? map.size : 0;\n  omap._map = map;\n  omap._list = list;\n  omap.__ownerID = ownerID;\n  omap.__hash = hash;\n  return omap;\n}\n\nvar EMPTY_ORDERED_MAP;\nfunction emptyOrderedMap() {\n  return (\n    EMPTY_ORDERED_MAP ||\n    (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList()))\n  );\n}\n\nfunction updateOrderedMap(omap, k, v) {\n  var map = omap._map;\n  var list = omap._list;\n  var i = map.get(k);\n  var has = i !== undefined;\n  var newMap;\n  var newList;\n  if (v === NOT_SET) {\n    // removed\n    if (!has) {\n      return omap;\n    }\n    if (list.size >= SIZE && list.size >= map.size * 2) {\n      newList = list.filter(function (entry, idx) { return entry !== undefined && i !== idx; });\n      newMap = newList\n        .toKeyedSeq()\n        .map(function (entry) { return entry[0]; })\n        .flip()\n        .toMap();\n      if (omap.__ownerID) {\n        newMap.__ownerID = newList.__ownerID = omap.__ownerID;\n      }\n    } else {\n      newMap = map.remove(k);\n      newList = i === list.size - 1 ? list.pop() : list.set(i, undefined);\n    }\n  } else if (has) {\n    if (v === list.get(i)[1]) {\n      return omap;\n    }\n    newMap = map;\n    newList = list.set(i, [k, v]);\n  } else {\n    newMap = map.set(k, list.size);\n    newList = list.set(list.size, [k, v]);\n  }\n  if (omap.__ownerID) {\n    omap.size = newMap.size;\n    omap._map = newMap;\n    omap._list = newList;\n    omap.__hash = undefined;\n    return omap;\n  }\n  return makeOrderedMap(newMap, newList);\n}\n\nvar Stack = (function (IndexedCollection$$1) {\n  function Stack(value) {\n    return value === null || value === undefined\n      ? emptyStack()\n      : isStack(value) ? value : emptyStack().pushAll(value);\n  }\n\n  if ( IndexedCollection$$1 ) Stack.__proto__ = IndexedCollection$$1;\n  Stack.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n  Stack.prototype.constructor = Stack;\n\n  Stack.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  Stack.prototype.toString = function toString () {\n    return this.__toString('Stack [', ']');\n  };\n\n  // @pragma Access\n\n  Stack.prototype.get = function get (index, notSetValue) {\n    var head = this._head;\n    index = wrapIndex(this, index);\n    while (head && index--) {\n      head = head.next;\n    }\n    return head ? head.value : notSetValue;\n  };\n\n  Stack.prototype.peek = function peek () {\n    return this._head && this._head.value;\n  };\n\n  // @pragma Modification\n\n  Stack.prototype.push = function push (/*...values*/) {\n    var arguments$1 = arguments;\n\n    if (arguments.length === 0) {\n      return this;\n    }\n    var newSize = this.size + arguments.length;\n    var head = this._head;\n    for (var ii = arguments.length - 1; ii >= 0; ii--) {\n      head = {\n        value: arguments$1[ii],\n        next: head\n      };\n    }\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  Stack.prototype.pushAll = function pushAll (iter) {\n    iter = IndexedCollection$$1(iter);\n    if (iter.size === 0) {\n      return this;\n    }\n    if (this.size === 0 && isStack(iter)) {\n      return iter;\n    }\n    assertNotInfinite(iter.size);\n    var newSize = this.size;\n    var head = this._head;\n    iter.__iterate(function (value) {\n      newSize++;\n      head = {\n        value: value,\n        next: head\n      };\n    }, /* reverse */ true);\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  Stack.prototype.pop = function pop () {\n    return this.slice(1);\n  };\n\n  Stack.prototype.clear = function clear () {\n    if (this.size === 0) {\n      return this;\n    }\n    if (this.__ownerID) {\n      this.size = 0;\n      this._head = undefined;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return emptyStack();\n  };\n\n  Stack.prototype.slice = function slice (begin, end) {\n    if (wholeSlice(begin, end, this.size)) {\n      return this;\n    }\n    var resolvedBegin = resolveBegin(begin, this.size);\n    var resolvedEnd = resolveEnd(end, this.size);\n    if (resolvedEnd !== this.size) {\n      // super.slice(begin, end);\n      return IndexedCollection$$1.prototype.slice.call(this, begin, end);\n    }\n    var newSize = this.size - resolvedBegin;\n    var head = this._head;\n    while (resolvedBegin--) {\n      head = head.next;\n    }\n    if (this.__ownerID) {\n      this.size = newSize;\n      this._head = head;\n      this.__hash = undefined;\n      this.__altered = true;\n      return this;\n    }\n    return makeStack(newSize, head);\n  };\n\n  // @pragma Mutability\n\n  Stack.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    if (!ownerID) {\n      if (this.size === 0) {\n        return emptyStack();\n      }\n      this.__ownerID = ownerID;\n      this.__altered = false;\n      return this;\n    }\n    return makeStack(this.size, this._head, ownerID, this.__hash);\n  };\n\n  // @pragma Iteration\n\n  Stack.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    if (reverse) {\n      return new ArraySeq(this.toArray()).__iterate(\n        function (v, k) { return fn(v, k, this$1); },\n        reverse\n      );\n    }\n    var iterations = 0;\n    var node = this._head;\n    while (node) {\n      if (fn(node.value, iterations++, this$1) === false) {\n        break;\n      }\n      node = node.next;\n    }\n    return iterations;\n  };\n\n  Stack.prototype.__iterator = function __iterator (type, reverse) {\n    if (reverse) {\n      return new ArraySeq(this.toArray()).__iterator(type, reverse);\n    }\n    var iterations = 0;\n    var node = this._head;\n    return new Iterator(function () {\n      if (node) {\n        var value = node.value;\n        node = node.next;\n        return iteratorValue(type, iterations++, value);\n      }\n      return iteratorDone();\n    });\n  };\n\n  return Stack;\n}(IndexedCollection));\n\nfunction isStack(maybeStack) {\n  return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]);\n}\n\nStack.isStack = isStack;\n\nvar IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';\n\nvar StackPrototype = Stack.prototype;\nStackPrototype[IS_STACK_SENTINEL] = true;\nStackPrototype.shift = StackPrototype.pop;\nStackPrototype.unshift = StackPrototype.push;\nStackPrototype.unshiftAll = StackPrototype.pushAll;\nStackPrototype.withMutations = withMutations;\nStackPrototype.wasAltered = wasAltered;\nStackPrototype.asImmutable = asImmutable;\nStackPrototype['@@transducer/init'] = StackPrototype.asMutable = asMutable;\nStackPrototype['@@transducer/step'] = function(result, arr) {\n  return result.unshift(arr);\n};\nStackPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nfunction makeStack(size, head, ownerID, hash) {\n  var map = Object.create(StackPrototype);\n  map.size = size;\n  map._head = head;\n  map.__ownerID = ownerID;\n  map.__hash = hash;\n  map.__altered = false;\n  return map;\n}\n\nvar EMPTY_STACK;\nfunction emptyStack() {\n  return EMPTY_STACK || (EMPTY_STACK = makeStack(0));\n}\n\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (\n    !isCollection(b) ||\n    (a.size !== undefined && b.size !== undefined && a.size !== b.size) ||\n    (a.__hash !== undefined &&\n      b.__hash !== undefined &&\n      a.__hash !== b.__hash) ||\n    isKeyed(a) !== isKeyed(b) ||\n    isIndexed(a) !== isIndexed(b) ||\n    isOrdered(a) !== isOrdered(b)\n  ) {\n    return false;\n  }\n\n  if (a.size === 0 && b.size === 0) {\n    return true;\n  }\n\n  var notAssociative = !isAssociative(a);\n\n  if (isOrdered(a)) {\n    var entries = a.entries();\n    return (\n      b.every(function (v, k) {\n        var entry = entries.next().value;\n        return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));\n      }) && entries.next().done\n    );\n  }\n\n  var flipped = false;\n\n  if (a.size === undefined) {\n    if (b.size === undefined) {\n      if (typeof a.cacheResult === 'function') {\n        a.cacheResult();\n      }\n    } else {\n      flipped = true;\n      var _ = a;\n      a = b;\n      b = _;\n    }\n  }\n\n  var allEqual = true;\n  var bSize = b.__iterate(function (v, k) {\n    if (\n      notAssociative\n        ? !a.has(v)\n        : flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)\n    ) {\n      allEqual = false;\n      return false;\n    }\n  });\n\n  return allEqual && a.size === bSize;\n}\n\n/**\n * Contributes additional methods to a constructor\n */\nfunction mixin(ctor, methods) {\n  var keyCopier = function (key) {\n    ctor.prototype[key] = methods[key];\n  };\n  Object.keys(methods).forEach(keyCopier);\n  Object.getOwnPropertySymbols &&\n    Object.getOwnPropertySymbols(methods).forEach(keyCopier);\n  return ctor;\n}\n\nfunction toJS(value) {\n  return isDataStructure(value)\n    ? Seq(value)\n        .map(toJS)\n        .toJSON()\n    : value;\n}\n\nvar Set = (function (SetCollection$$1) {\n  function Set(value) {\n    return value === null || value === undefined\n      ? emptySet()\n      : isSet(value) && !isOrdered(value)\n        ? value\n        : emptySet().withMutations(function (set) {\n            var iter = SetCollection$$1(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v) { return set.add(v); });\n          });\n  }\n\n  if ( SetCollection$$1 ) Set.__proto__ = SetCollection$$1;\n  Set.prototype = Object.create( SetCollection$$1 && SetCollection$$1.prototype );\n  Set.prototype.constructor = Set;\n\n  Set.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  Set.fromKeys = function fromKeys (value) {\n    return this(KeyedCollection(value).keySeq());\n  };\n\n  Set.intersect = function intersect (sets) {\n    sets = Collection(sets).toArray();\n    return sets.length\n      ? SetPrototype.intersect.apply(Set(sets.pop()), sets)\n      : emptySet();\n  };\n\n  Set.union = function union (sets) {\n    sets = Collection(sets).toArray();\n    return sets.length\n      ? SetPrototype.union.apply(Set(sets.pop()), sets)\n      : emptySet();\n  };\n\n  Set.prototype.toString = function toString () {\n    return this.__toString('Set {', '}');\n  };\n\n  // @pragma Access\n\n  Set.prototype.has = function has (value) {\n    return this._map.has(value);\n  };\n\n  // @pragma Modification\n\n  Set.prototype.add = function add (value) {\n    return updateSet(this, this._map.set(value, value));\n  };\n\n  Set.prototype.remove = function remove (value) {\n    return updateSet(this, this._map.remove(value));\n  };\n\n  Set.prototype.clear = function clear () {\n    return updateSet(this, this._map.clear());\n  };\n\n  // @pragma Composition\n\n  Set.prototype.union = function union () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    iters = iters.filter(function (x) { return x.size !== 0; });\n    if (iters.length === 0) {\n      return this;\n    }\n    if (this.size === 0 && !this.__ownerID && iters.length === 1) {\n      return this.constructor(iters[0]);\n    }\n    return this.withMutations(function (set) {\n      for (var ii = 0; ii < iters.length; ii++) {\n        SetCollection$$1(iters[ii]).forEach(function (value) { return set.add(value); });\n      }\n    });\n  };\n\n  Set.prototype.intersect = function intersect () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    if (iters.length === 0) {\n      return this;\n    }\n    iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n    var toRemove = [];\n    this.forEach(function (value) {\n      if (!iters.every(function (iter) { return iter.includes(value); })) {\n        toRemove.push(value);\n      }\n    });\n    return this.withMutations(function (set) {\n      toRemove.forEach(function (value) {\n        set.remove(value);\n      });\n    });\n  };\n\n  Set.prototype.subtract = function subtract () {\n    var iters = [], len = arguments.length;\n    while ( len-- ) iters[ len ] = arguments[ len ];\n\n    if (iters.length === 0) {\n      return this;\n    }\n    iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n    var toRemove = [];\n    this.forEach(function (value) {\n      if (iters.some(function (iter) { return iter.includes(value); })) {\n        toRemove.push(value);\n      }\n    });\n    return this.withMutations(function (set) {\n      toRemove.forEach(function (value) {\n        set.remove(value);\n      });\n    });\n  };\n\n  Set.prototype.sort = function sort (comparator) {\n    // Late binding\n    return OrderedSet(sortFactory(this, comparator));\n  };\n\n  Set.prototype.sortBy = function sortBy (mapper, comparator) {\n    // Late binding\n    return OrderedSet(sortFactory(this, comparator, mapper));\n  };\n\n  Set.prototype.wasAltered = function wasAltered () {\n    return this._map.wasAltered();\n  };\n\n  Set.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    return this._map.__iterate(function (k) { return fn(k, k, this$1); }, reverse);\n  };\n\n  Set.prototype.__iterator = function __iterator (type, reverse) {\n    return this._map.__iterator(type, reverse);\n  };\n\n  Set.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n    if (ownerID === this.__ownerID) {\n      return this;\n    }\n    var newMap = this._map.__ensureOwner(ownerID);\n    if (!ownerID) {\n      if (this.size === 0) {\n        return this.__empty();\n      }\n      this.__ownerID = ownerID;\n      this._map = newMap;\n      return this;\n    }\n    return this.__make(newMap, ownerID);\n  };\n\n  return Set;\n}(SetCollection));\n\nfunction isSet(maybeSet) {\n  return !!(maybeSet && maybeSet[IS_SET_SENTINEL]);\n}\n\nSet.isSet = isSet;\n\nvar IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';\n\nvar SetPrototype = Set.prototype;\nSetPrototype[IS_SET_SENTINEL] = true;\nSetPrototype[DELETE] = SetPrototype.remove;\nSetPrototype.merge = SetPrototype.concat = SetPrototype.union;\nSetPrototype.withMutations = withMutations;\nSetPrototype.asImmutable = asImmutable;\nSetPrototype['@@transducer/init'] = SetPrototype.asMutable = asMutable;\nSetPrototype['@@transducer/step'] = function(result, arr) {\n  return result.add(arr);\n};\nSetPrototype['@@transducer/result'] = function(obj) {\n  return obj.asImmutable();\n};\n\nSetPrototype.__empty = emptySet;\nSetPrototype.__make = makeSet;\n\nfunction updateSet(set, newMap) {\n  if (set.__ownerID) {\n    set.size = newMap.size;\n    set._map = newMap;\n    return set;\n  }\n  return newMap === set._map\n    ? set\n    : newMap.size === 0 ? set.__empty() : set.__make(newMap);\n}\n\nfunction makeSet(map, ownerID) {\n  var set = Object.create(SetPrototype);\n  set.size = map ? map.size : 0;\n  set._map = map;\n  set.__ownerID = ownerID;\n  return set;\n}\n\nvar EMPTY_SET;\nfunction emptySet() {\n  return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap()));\n}\n\n/**\n * Returns a lazy seq of nums from start (inclusive) to end\n * (exclusive), by step, where start defaults to 0, step to 1, and end to\n * infinity. When start is equal to end, returns empty list.\n */\nvar Range = (function (IndexedSeq$$1) {\n  function Range(start, end, step) {\n    if (!(this instanceof Range)) {\n      return new Range(start, end, step);\n    }\n    invariant(step !== 0, 'Cannot step a Range by 0');\n    start = start || 0;\n    if (end === undefined) {\n      end = Infinity;\n    }\n    step = step === undefined ? 1 : Math.abs(step);\n    if (end < start) {\n      step = -step;\n    }\n    this._start = start;\n    this._end = end;\n    this._step = step;\n    this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);\n    if (this.size === 0) {\n      if (EMPTY_RANGE) {\n        return EMPTY_RANGE;\n      }\n      EMPTY_RANGE = this;\n    }\n  }\n\n  if ( IndexedSeq$$1 ) Range.__proto__ = IndexedSeq$$1;\n  Range.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  Range.prototype.constructor = Range;\n\n  Range.prototype.toString = function toString () {\n    if (this.size === 0) {\n      return 'Range []';\n    }\n    return (\n      'Range [ ' +\n      this._start +\n      '...' +\n      this._end +\n      (this._step !== 1 ? ' by ' + this._step : '') +\n      ' ]'\n    );\n  };\n\n  Range.prototype.get = function get (index, notSetValue) {\n    return this.has(index)\n      ? this._start + wrapIndex(this, index) * this._step\n      : notSetValue;\n  };\n\n  Range.prototype.includes = function includes (searchValue) {\n    var possibleIndex = (searchValue - this._start) / this._step;\n    return (\n      possibleIndex >= 0 &&\n      possibleIndex < this.size &&\n      possibleIndex === Math.floor(possibleIndex)\n    );\n  };\n\n  Range.prototype.slice = function slice (begin, end) {\n    if (wholeSlice(begin, end, this.size)) {\n      return this;\n    }\n    begin = resolveBegin(begin, this.size);\n    end = resolveEnd(end, this.size);\n    if (end <= begin) {\n      return new Range(0, 0);\n    }\n    return new Range(\n      this.get(begin, this._end),\n      this.get(end, this._end),\n      this._step\n    );\n  };\n\n  Range.prototype.indexOf = function indexOf (searchValue) {\n    var offsetValue = searchValue - this._start;\n    if (offsetValue % this._step === 0) {\n      var index = offsetValue / this._step;\n      if (index >= 0 && index < this.size) {\n        return index;\n      }\n    }\n    return -1;\n  };\n\n  Range.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n    return this.indexOf(searchValue);\n  };\n\n  Range.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var step = this._step;\n    var value = reverse ? this._start + (size - 1) * step : this._start;\n    var i = 0;\n    while (i !== size) {\n      if (fn(value, reverse ? size - ++i : i++, this$1) === false) {\n        break;\n      }\n      value += reverse ? -step : step;\n    }\n    return i;\n  };\n\n  Range.prototype.__iterator = function __iterator (type, reverse) {\n    var size = this.size;\n    var step = this._step;\n    var value = reverse ? this._start + (size - 1) * step : this._start;\n    var i = 0;\n    return new Iterator(function () {\n      if (i === size) {\n        return iteratorDone();\n      }\n      var v = value;\n      value += reverse ? -step : step;\n      return iteratorValue(type, reverse ? size - ++i : i++, v);\n    });\n  };\n\n  Range.prototype.equals = function equals (other) {\n    return other instanceof Range\n      ? this._start === other._start &&\n          this._end === other._end &&\n          this._step === other._step\n      : deepEqual(this, other);\n  };\n\n  return Range;\n}(IndexedSeq));\n\nvar EMPTY_RANGE;\n\nfunction getIn$1(collection, searchKeyPath, notSetValue) {\n  var keyPath = coerceKeyPath(searchKeyPath);\n  var i = 0;\n  while (i !== keyPath.length) {\n    collection = get(collection, keyPath[i++], NOT_SET);\n    if (collection === NOT_SET) {\n      return notSetValue;\n    }\n  }\n  return collection;\n}\n\nfunction getIn$$1(searchKeyPath, notSetValue) {\n  return getIn$1(this, searchKeyPath, notSetValue);\n}\n\nfunction hasIn$1(collection, keyPath) {\n  return getIn$1(collection, keyPath, NOT_SET) !== NOT_SET;\n}\n\nfunction hasIn$$1(searchKeyPath) {\n  return hasIn$1(this, searchKeyPath);\n}\n\nfunction toObject() {\n  assertNotInfinite(this.size);\n  var object = {};\n  this.__iterate(function (v, k) {\n    object[k] = v;\n  });\n  return object;\n}\n\n// Note: all of these methods are deprecated.\nCollection.isIterable = isCollection;\nCollection.isKeyed = isKeyed;\nCollection.isIndexed = isIndexed;\nCollection.isAssociative = isAssociative;\nCollection.isOrdered = isOrdered;\n\nCollection.Iterator = Iterator;\n\nmixin(Collection, {\n  // ### Conversion to other types\n\n  toArray: function toArray() {\n    assertNotInfinite(this.size);\n    var array = new Array(this.size || 0);\n    var useTuples = isKeyed(this);\n    var i = 0;\n    this.__iterate(function (v, k) {\n      // Keyed collections produce an array of tuples.\n      array[i++] = useTuples ? [k, v] : v;\n    });\n    return array;\n  },\n\n  toIndexedSeq: function toIndexedSeq() {\n    return new ToIndexedSequence(this);\n  },\n\n  toJS: function toJS$1() {\n    return toJS(this);\n  },\n\n  toKeyedSeq: function toKeyedSeq() {\n    return new ToKeyedSequence(this, true);\n  },\n\n  toMap: function toMap() {\n    // Use Late Binding here to solve the circular dependency.\n    return Map(this.toKeyedSeq());\n  },\n\n  toObject: toObject,\n\n  toOrderedMap: function toOrderedMap() {\n    // Use Late Binding here to solve the circular dependency.\n    return OrderedMap(this.toKeyedSeq());\n  },\n\n  toOrderedSet: function toOrderedSet() {\n    // Use Late Binding here to solve the circular dependency.\n    return OrderedSet(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toSet: function toSet() {\n    // Use Late Binding here to solve the circular dependency.\n    return Set(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toSetSeq: function toSetSeq() {\n    return new ToSetSequence(this);\n  },\n\n  toSeq: function toSeq() {\n    return isIndexed(this)\n      ? this.toIndexedSeq()\n      : isKeyed(this) ? this.toKeyedSeq() : this.toSetSeq();\n  },\n\n  toStack: function toStack() {\n    // Use Late Binding here to solve the circular dependency.\n    return Stack(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  toList: function toList() {\n    // Use Late Binding here to solve the circular dependency.\n    return List(isKeyed(this) ? this.valueSeq() : this);\n  },\n\n  // ### Common JavaScript methods and properties\n\n  toString: function toString() {\n    return '[Collection]';\n  },\n\n  __toString: function __toString(head, tail) {\n    if (this.size === 0) {\n      return head + tail;\n    }\n    return (\n      head +\n      ' ' +\n      this.toSeq()\n        .map(this.__toStringMapper)\n        .join(', ') +\n      ' ' +\n      tail\n    );\n  },\n\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  concat: function concat() {\n    var values = [], len = arguments.length;\n    while ( len-- ) values[ len ] = arguments[ len ];\n\n    return reify(this, concatFactory(this, values));\n  },\n\n  includes: function includes(searchValue) {\n    return this.some(function (value) { return is(value, searchValue); });\n  },\n\n  entries: function entries() {\n    return this.__iterator(ITERATE_ENTRIES);\n  },\n\n  every: function every(predicate, context) {\n    assertNotInfinite(this.size);\n    var returnValue = true;\n    this.__iterate(function (v, k, c) {\n      if (!predicate.call(context, v, k, c)) {\n        returnValue = false;\n        return false;\n      }\n    });\n    return returnValue;\n  },\n\n  filter: function filter(predicate, context) {\n    return reify(this, filterFactory(this, predicate, context, true));\n  },\n\n  find: function find(predicate, context, notSetValue) {\n    var entry = this.findEntry(predicate, context);\n    return entry ? entry[1] : notSetValue;\n  },\n\n  forEach: function forEach(sideEffect, context) {\n    assertNotInfinite(this.size);\n    return this.__iterate(context ? sideEffect.bind(context) : sideEffect);\n  },\n\n  join: function join(separator) {\n    assertNotInfinite(this.size);\n    separator = separator !== undefined ? '' + separator : ',';\n    var joined = '';\n    var isFirst = true;\n    this.__iterate(function (v) {\n      isFirst ? (isFirst = false) : (joined += separator);\n      joined += v !== null && v !== undefined ? v.toString() : '';\n    });\n    return joined;\n  },\n\n  keys: function keys() {\n    return this.__iterator(ITERATE_KEYS);\n  },\n\n  map: function map(mapper, context) {\n    return reify(this, mapFactory(this, mapper, context));\n  },\n\n  reduce: function reduce$1(reducer, initialReduction, context) {\n    return reduce(\n      this,\n      reducer,\n      initialReduction,\n      context,\n      arguments.length < 2,\n      false\n    );\n  },\n\n  reduceRight: function reduceRight(reducer, initialReduction, context) {\n    return reduce(\n      this,\n      reducer,\n      initialReduction,\n      context,\n      arguments.length < 2,\n      true\n    );\n  },\n\n  reverse: function reverse() {\n    return reify(this, reverseFactory(this, true));\n  },\n\n  slice: function slice(begin, end) {\n    return reify(this, sliceFactory(this, begin, end, true));\n  },\n\n  some: function some(predicate, context) {\n    return !this.every(not(predicate), context);\n  },\n\n  sort: function sort(comparator) {\n    return reify(this, sortFactory(this, comparator));\n  },\n\n  values: function values() {\n    return this.__iterator(ITERATE_VALUES);\n  },\n\n  // ### More sequential methods\n\n  butLast: function butLast() {\n    return this.slice(0, -1);\n  },\n\n  isEmpty: function isEmpty() {\n    return this.size !== undefined ? this.size === 0 : !this.some(function () { return true; });\n  },\n\n  count: function count(predicate, context) {\n    return ensureSize(\n      predicate ? this.toSeq().filter(predicate, context) : this\n    );\n  },\n\n  countBy: function countBy(grouper, context) {\n    return countByFactory(this, grouper, context);\n  },\n\n  equals: function equals(other) {\n    return deepEqual(this, other);\n  },\n\n  entrySeq: function entrySeq() {\n    var collection = this;\n    if (collection._cache) {\n      // We cache as an entries array, so we can just return the cache!\n      return new ArraySeq(collection._cache);\n    }\n    var entriesSequence = collection\n      .toSeq()\n      .map(entryMapper)\n      .toIndexedSeq();\n    entriesSequence.fromEntrySeq = function () { return collection.toSeq(); };\n    return entriesSequence;\n  },\n\n  filterNot: function filterNot(predicate, context) {\n    return this.filter(not(predicate), context);\n  },\n\n  findEntry: function findEntry(predicate, context, notSetValue) {\n    var found = notSetValue;\n    this.__iterate(function (v, k, c) {\n      if (predicate.call(context, v, k, c)) {\n        found = [k, v];\n        return false;\n      }\n    });\n    return found;\n  },\n\n  findKey: function findKey(predicate, context) {\n    var entry = this.findEntry(predicate, context);\n    return entry && entry[0];\n  },\n\n  findLast: function findLast(predicate, context, notSetValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .find(predicate, context, notSetValue);\n  },\n\n  findLastEntry: function findLastEntry(predicate, context, notSetValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .findEntry(predicate, context, notSetValue);\n  },\n\n  findLastKey: function findLastKey(predicate, context) {\n    return this.toKeyedSeq()\n      .reverse()\n      .findKey(predicate, context);\n  },\n\n  first: function first() {\n    return this.find(returnTrue);\n  },\n\n  flatMap: function flatMap(mapper, context) {\n    return reify(this, flatMapFactory(this, mapper, context));\n  },\n\n  flatten: function flatten(depth) {\n    return reify(this, flattenFactory(this, depth, true));\n  },\n\n  fromEntrySeq: function fromEntrySeq() {\n    return new FromEntriesSequence(this);\n  },\n\n  get: function get(searchKey, notSetValue) {\n    return this.find(function (_, key) { return is(key, searchKey); }, undefined, notSetValue);\n  },\n\n  getIn: getIn$$1,\n\n  groupBy: function groupBy(grouper, context) {\n    return groupByFactory(this, grouper, context);\n  },\n\n  has: function has(searchKey) {\n    return this.get(searchKey, NOT_SET) !== NOT_SET;\n  },\n\n  hasIn: hasIn$$1,\n\n  isSubset: function isSubset(iter) {\n    iter = typeof iter.includes === 'function' ? iter : Collection(iter);\n    return this.every(function (value) { return iter.includes(value); });\n  },\n\n  isSuperset: function isSuperset(iter) {\n    iter = typeof iter.isSubset === 'function' ? iter : Collection(iter);\n    return iter.isSubset(this);\n  },\n\n  keyOf: function keyOf(searchValue) {\n    return this.findKey(function (value) { return is(value, searchValue); });\n  },\n\n  keySeq: function keySeq() {\n    return this.toSeq()\n      .map(keyMapper)\n      .toIndexedSeq();\n  },\n\n  last: function last() {\n    return this.toSeq()\n      .reverse()\n      .first();\n  },\n\n  lastKeyOf: function lastKeyOf(searchValue) {\n    return this.toKeyedSeq()\n      .reverse()\n      .keyOf(searchValue);\n  },\n\n  max: function max(comparator) {\n    return maxFactory(this, comparator);\n  },\n\n  maxBy: function maxBy(mapper, comparator) {\n    return maxFactory(this, comparator, mapper);\n  },\n\n  min: function min(comparator) {\n    return maxFactory(\n      this,\n      comparator ? neg(comparator) : defaultNegComparator\n    );\n  },\n\n  minBy: function minBy(mapper, comparator) {\n    return maxFactory(\n      this,\n      comparator ? neg(comparator) : defaultNegComparator,\n      mapper\n    );\n  },\n\n  rest: function rest() {\n    return this.slice(1);\n  },\n\n  skip: function skip(amount) {\n    return amount === 0 ? this : this.slice(Math.max(0, amount));\n  },\n\n  skipLast: function skipLast(amount) {\n    return amount === 0 ? this : this.slice(0, -Math.max(0, amount));\n  },\n\n  skipWhile: function skipWhile(predicate, context) {\n    return reify(this, skipWhileFactory(this, predicate, context, true));\n  },\n\n  skipUntil: function skipUntil(predicate, context) {\n    return this.skipWhile(not(predicate), context);\n  },\n\n  sortBy: function sortBy(mapper, comparator) {\n    return reify(this, sortFactory(this, comparator, mapper));\n  },\n\n  take: function take(amount) {\n    return this.slice(0, Math.max(0, amount));\n  },\n\n  takeLast: function takeLast(amount) {\n    return this.slice(-Math.max(0, amount));\n  },\n\n  takeWhile: function takeWhile(predicate, context) {\n    return reify(this, takeWhileFactory(this, predicate, context));\n  },\n\n  takeUntil: function takeUntil(predicate, context) {\n    return this.takeWhile(not(predicate), context);\n  },\n\n  update: function update(fn) {\n    return fn(this);\n  },\n\n  valueSeq: function valueSeq() {\n    return this.toIndexedSeq();\n  },\n\n  // ### Hashable Object\n\n  hashCode: function hashCode() {\n    return this.__hash || (this.__hash = hashCollection(this));\n  }\n\n  // ### Internal\n\n  // abstract __iterate(fn, reverse)\n\n  // abstract __iterator(type, reverse)\n});\n\nvar CollectionPrototype = Collection.prototype;\nCollectionPrototype[IS_ITERABLE_SENTINEL] = true;\nCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.values;\nCollectionPrototype.toJSON = CollectionPrototype.toArray;\nCollectionPrototype.__toStringMapper = quoteString;\nCollectionPrototype.inspect = CollectionPrototype.toSource = function() {\n  return this.toString();\n};\nCollectionPrototype.chain = CollectionPrototype.flatMap;\nCollectionPrototype.contains = CollectionPrototype.includes;\n\nmixin(KeyedCollection, {\n  // ### More sequential methods\n\n  flip: function flip() {\n    return reify(this, flipFactory(this));\n  },\n\n  mapEntries: function mapEntries(mapper, context) {\n    var this$1 = this;\n\n    var iterations = 0;\n    return reify(\n      this,\n      this.toSeq()\n        .map(function (v, k) { return mapper.call(context, [k, v], iterations++, this$1); })\n        .fromEntrySeq()\n    );\n  },\n\n  mapKeys: function mapKeys(mapper, context) {\n    var this$1 = this;\n\n    return reify(\n      this,\n      this.toSeq()\n        .flip()\n        .map(function (k, v) { return mapper.call(context, k, v, this$1); })\n        .flip()\n    );\n  }\n});\n\nvar KeyedCollectionPrototype = KeyedCollection.prototype;\nKeyedCollectionPrototype[IS_KEYED_SENTINEL] = true;\nKeyedCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.entries;\nKeyedCollectionPrototype.toJSON = toObject;\nKeyedCollectionPrototype.__toStringMapper = function (v, k) { return quoteString(k) + ': ' + quoteString(v); };\n\nmixin(IndexedCollection, {\n  // ### Conversion to other types\n\n  toKeyedSeq: function toKeyedSeq() {\n    return new ToKeyedSequence(this, false);\n  },\n\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  filter: function filter(predicate, context) {\n    return reify(this, filterFactory(this, predicate, context, false));\n  },\n\n  findIndex: function findIndex(predicate, context) {\n    var entry = this.findEntry(predicate, context);\n    return entry ? entry[0] : -1;\n  },\n\n  indexOf: function indexOf(searchValue) {\n    var key = this.keyOf(searchValue);\n    return key === undefined ? -1 : key;\n  },\n\n  lastIndexOf: function lastIndexOf(searchValue) {\n    var key = this.lastKeyOf(searchValue);\n    return key === undefined ? -1 : key;\n  },\n\n  reverse: function reverse() {\n    return reify(this, reverseFactory(this, false));\n  },\n\n  slice: function slice(begin, end) {\n    return reify(this, sliceFactory(this, begin, end, false));\n  },\n\n  splice: function splice(index, removeNum /*, ...values*/) {\n    var numArgs = arguments.length;\n    removeNum = Math.max(removeNum || 0, 0);\n    if (numArgs === 0 || (numArgs === 2 && !removeNum)) {\n      return this;\n    }\n    // If index is negative, it should resolve relative to the size of the\n    // collection. However size may be expensive to compute if not cached, so\n    // only call count() if the number is in fact negative.\n    index = resolveBegin(index, index < 0 ? this.count() : this.size);\n    var spliced = this.slice(0, index);\n    return reify(\n      this,\n      numArgs === 1\n        ? spliced\n        : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum))\n    );\n  },\n\n  // ### More collection methods\n\n  findLastIndex: function findLastIndex(predicate, context) {\n    var entry = this.findLastEntry(predicate, context);\n    return entry ? entry[0] : -1;\n  },\n\n  first: function first() {\n    return this.get(0);\n  },\n\n  flatten: function flatten(depth) {\n    return reify(this, flattenFactory(this, depth, false));\n  },\n\n  get: function get(index, notSetValue) {\n    index = wrapIndex(this, index);\n    return index < 0 ||\n      (this.size === Infinity || (this.size !== undefined && index > this.size))\n      ? notSetValue\n      : this.find(function (_, key) { return key === index; }, undefined, notSetValue);\n  },\n\n  has: function has(index) {\n    index = wrapIndex(this, index);\n    return (\n      index >= 0 &&\n      (this.size !== undefined\n        ? this.size === Infinity || index < this.size\n        : this.indexOf(index) !== -1)\n    );\n  },\n\n  interpose: function interpose(separator) {\n    return reify(this, interposeFactory(this, separator));\n  },\n\n  interleave: function interleave(/*...collections*/) {\n    var collections = [this].concat(arrCopy(arguments));\n    var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, collections);\n    var interleaved = zipped.flatten(true);\n    if (zipped.size) {\n      interleaved.size = zipped.size * collections.length;\n    }\n    return reify(this, interleaved);\n  },\n\n  keySeq: function keySeq() {\n    return Range(0, this.size);\n  },\n\n  last: function last() {\n    return this.get(-1);\n  },\n\n  skipWhile: function skipWhile(predicate, context) {\n    return reify(this, skipWhileFactory(this, predicate, context, false));\n  },\n\n  zip: function zip(/*, ...collections */) {\n    var collections = [this].concat(arrCopy(arguments));\n    return reify(this, zipWithFactory(this, defaultZipper, collections));\n  },\n\n  zipAll: function zipAll(/*, ...collections */) {\n    var collections = [this].concat(arrCopy(arguments));\n    return reify(this, zipWithFactory(this, defaultZipper, collections, true));\n  },\n\n  zipWith: function zipWith(zipper /*, ...collections */) {\n    var collections = arrCopy(arguments);\n    collections[0] = this;\n    return reify(this, zipWithFactory(this, zipper, collections));\n  }\n});\n\nvar IndexedCollectionPrototype = IndexedCollection.prototype;\nIndexedCollectionPrototype[IS_INDEXED_SENTINEL] = true;\nIndexedCollectionPrototype[IS_ORDERED_SENTINEL] = true;\n\nmixin(SetCollection, {\n  // ### ES6 Collection methods (ES6 Array and Map)\n\n  get: function get(value, notSetValue) {\n    return this.has(value) ? value : notSetValue;\n  },\n\n  includes: function includes(value) {\n    return this.has(value);\n  },\n\n  // ### More sequential methods\n\n  keySeq: function keySeq() {\n    return this.valueSeq();\n  }\n});\n\nSetCollection.prototype.has = CollectionPrototype.includes;\nSetCollection.prototype.contains = SetCollection.prototype.includes;\n\n// Mixin subclasses\n\nmixin(KeyedSeq, KeyedCollection.prototype);\nmixin(IndexedSeq, IndexedCollection.prototype);\nmixin(SetSeq, SetCollection.prototype);\n\n// #pragma Helper functions\n\nfunction reduce(collection, reducer, reduction, context, useFirst, reverse) {\n  assertNotInfinite(collection.size);\n  collection.__iterate(function (v, k, c) {\n    if (useFirst) {\n      useFirst = false;\n      reduction = v;\n    } else {\n      reduction = reducer.call(context, reduction, v, k, c);\n    }\n  }, reverse);\n  return reduction;\n}\n\nfunction keyMapper(v, k) {\n  return k;\n}\n\nfunction entryMapper(v, k) {\n  return [k, v];\n}\n\nfunction not(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\nfunction neg(predicate) {\n  return function() {\n    return -predicate.apply(this, arguments);\n  };\n}\n\nfunction defaultZipper() {\n  return arrCopy(arguments);\n}\n\nfunction defaultNegComparator(a, b) {\n  return a < b ? 1 : a > b ? -1 : 0;\n}\n\nfunction hashCollection(collection) {\n  if (collection.size === Infinity) {\n    return 0;\n  }\n  var ordered = isOrdered(collection);\n  var keyed = isKeyed(collection);\n  var h = ordered ? 1 : 0;\n  var size = collection.__iterate(\n    keyed\n      ? ordered\n        ? function (v, k) {\n            h = (31 * h + hashMerge(hash(v), hash(k))) | 0;\n          }\n        : function (v, k) {\n            h = (h + hashMerge(hash(v), hash(k))) | 0;\n          }\n      : ordered\n        ? function (v) {\n            h = (31 * h + hash(v)) | 0;\n          }\n        : function (v) {\n            h = (h + hash(v)) | 0;\n          }\n  );\n  return murmurHashOfSize(size, h);\n}\n\nfunction murmurHashOfSize(size, h) {\n  h = imul(h, 0xcc9e2d51);\n  h = imul((h << 15) | (h >>> -15), 0x1b873593);\n  h = imul((h << 13) | (h >>> -13), 5);\n  h = ((h + 0xe6546b64) | 0) ^ size;\n  h = imul(h ^ (h >>> 16), 0x85ebca6b);\n  h = imul(h ^ (h >>> 13), 0xc2b2ae35);\n  h = smi(h ^ (h >>> 16));\n  return h;\n}\n\nfunction hashMerge(a, b) {\n  return (a ^ (b + 0x9e3779b9 + (a << 6) + (a >> 2))) | 0; // int\n}\n\nvar OrderedSet = (function (Set$$1) {\n  function OrderedSet(value) {\n    return value === null || value === undefined\n      ? emptyOrderedSet()\n      : isOrderedSet(value)\n        ? value\n        : emptyOrderedSet().withMutations(function (set) {\n            var iter = SetCollection(value);\n            assertNotInfinite(iter.size);\n            iter.forEach(function (v) { return set.add(v); });\n          });\n  }\n\n  if ( Set$$1 ) OrderedSet.__proto__ = Set$$1;\n  OrderedSet.prototype = Object.create( Set$$1 && Set$$1.prototype );\n  OrderedSet.prototype.constructor = OrderedSet;\n\n  OrderedSet.of = function of (/*...values*/) {\n    return this(arguments);\n  };\n\n  OrderedSet.fromKeys = function fromKeys (value) {\n    return this(KeyedCollection(value).keySeq());\n  };\n\n  OrderedSet.prototype.toString = function toString () {\n    return this.__toString('OrderedSet {', '}');\n  };\n\n  return OrderedSet;\n}(Set));\n\nfunction isOrderedSet(maybeOrderedSet) {\n  return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet);\n}\n\nOrderedSet.isOrderedSet = isOrderedSet;\n\nvar OrderedSetPrototype = OrderedSet.prototype;\nOrderedSetPrototype[IS_ORDERED_SENTINEL] = true;\nOrderedSetPrototype.zip = IndexedCollectionPrototype.zip;\nOrderedSetPrototype.zipWith = IndexedCollectionPrototype.zipWith;\n\nOrderedSetPrototype.__empty = emptyOrderedSet;\nOrderedSetPrototype.__make = makeOrderedSet;\n\nfunction makeOrderedSet(map, ownerID) {\n  var set = Object.create(OrderedSetPrototype);\n  set.size = map ? map.size : 0;\n  set._map = map;\n  set.__ownerID = ownerID;\n  return set;\n}\n\nvar EMPTY_ORDERED_SET;\nfunction emptyOrderedSet() {\n  return (\n    EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap()))\n  );\n}\n\nvar Record = function Record(defaultValues, name) {\n  var hasInitialized;\n\n  var RecordType = function Record(values) {\n    var this$1 = this;\n\n    if (values instanceof RecordType) {\n      return values;\n    }\n    if (!(this instanceof RecordType)) {\n      return new RecordType(values);\n    }\n    if (!hasInitialized) {\n      hasInitialized = true;\n      var keys = Object.keys(defaultValues);\n      var indices = (RecordTypePrototype._indices = {});\n      RecordTypePrototype._name = name;\n      RecordTypePrototype._keys = keys;\n      RecordTypePrototype._defaultValues = defaultValues;\n      for (var i = 0; i < keys.length; i++) {\n        var propName = keys[i];\n        indices[propName] = i;\n        if (RecordTypePrototype[propName]) {\n          /* eslint-disable no-console */\n          typeof console === 'object' &&\n            console.warn &&\n            console.warn(\n              'Cannot define ' +\n                recordName(this$1) +\n                ' with property \"' +\n                propName +\n                '\" since that property name is part of the Record API.'\n            );\n          /* eslint-enable no-console */\n        } else {\n          setProp(RecordTypePrototype, propName);\n        }\n      }\n    }\n    this.__ownerID = undefined;\n    this._values = List().withMutations(function (l) {\n      l.setSize(this$1._keys.length);\n      KeyedCollection(values).forEach(function (v, k) {\n        l.set(this$1._indices[k], v === this$1._defaultValues[k] ? undefined : v);\n      });\n    });\n  };\n\n  var RecordTypePrototype = (RecordType.prototype = Object.create(\n    RecordPrototype\n  ));\n  RecordTypePrototype.constructor = RecordType;\n\n  return RecordType;\n};\n\nRecord.prototype.toString = function toString () {\n    var this$1 = this;\n\n  var str = recordName(this) + ' { ';\n  var keys = this._keys;\n  var k;\n  for (var i = 0, l = keys.length; i !== l; i++) {\n    k = keys[i];\n    str += (i ? ', ' : '') + k + ': ' + quoteString(this$1.get(k));\n  }\n  return str + ' }';\n};\n\nRecord.prototype.equals = function equals (other) {\n  return (\n    this === other ||\n    (other &&\n      this._keys === other._keys &&\n      recordSeq(this).equals(recordSeq(other)))\n  );\n};\n\nRecord.prototype.hashCode = function hashCode () {\n  return recordSeq(this).hashCode();\n};\n\n// @pragma Access\n\nRecord.prototype.has = function has (k) {\n  return this._indices.hasOwnProperty(k);\n};\n\nRecord.prototype.get = function get (k, notSetValue) {\n  if (!this.has(k)) {\n    return notSetValue;\n  }\n  var index = this._indices[k];\n  var value = this._values.get(index);\n  return value === undefined ? this._defaultValues[k] : value;\n};\n\n// @pragma Modification\n\nRecord.prototype.set = function set (k, v) {\n  if (this.has(k)) {\n    var newValues = this._values.set(\n      this._indices[k],\n      v === this._defaultValues[k] ? undefined : v\n    );\n    if (newValues !== this._values && !this.__ownerID) {\n      return makeRecord(this, newValues);\n    }\n  }\n  return this;\n};\n\nRecord.prototype.remove = function remove (k) {\n  return this.set(k);\n};\n\nRecord.prototype.clear = function clear () {\n  var newValues = this._values.clear().setSize(this._keys.length);\n  return this.__ownerID ? this : makeRecord(this, newValues);\n};\n\nRecord.prototype.wasAltered = function wasAltered () {\n  return this._values.wasAltered();\n};\n\nRecord.prototype.toSeq = function toSeq () {\n  return recordSeq(this);\n};\n\nRecord.prototype.toJS = function toJS$1 () {\n  return toJS(this);\n};\n\nRecord.prototype.entries = function entries () {\n  return this.__iterator(ITERATE_ENTRIES);\n};\n\nRecord.prototype.__iterator = function __iterator (type, reverse) {\n  return recordSeq(this).__iterator(type, reverse);\n};\n\nRecord.prototype.__iterate = function __iterate (fn, reverse) {\n  return recordSeq(this).__iterate(fn, reverse);\n};\n\nRecord.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n  if (ownerID === this.__ownerID) {\n    return this;\n  }\n  var newValues = this._values.__ensureOwner(ownerID);\n  if (!ownerID) {\n    this.__ownerID = ownerID;\n    this._values = newValues;\n    return this;\n  }\n  return makeRecord(this, newValues, ownerID);\n};\n\nRecord.isRecord = isRecord;\nRecord.getDescriptiveName = recordName;\nvar RecordPrototype = Record.prototype;\nRecordPrototype[IS_RECORD_SENTINEL] = true;\nRecordPrototype[DELETE] = RecordPrototype.remove;\nRecordPrototype.deleteIn = RecordPrototype.removeIn = deleteIn;\nRecordPrototype.getIn = getIn$$1;\nRecordPrototype.hasIn = CollectionPrototype.hasIn;\nRecordPrototype.merge = merge;\nRecordPrototype.mergeWith = mergeWith;\nRecordPrototype.mergeIn = mergeIn;\nRecordPrototype.mergeDeep = mergeDeep;\nRecordPrototype.mergeDeepWith = mergeDeepWith;\nRecordPrototype.mergeDeepIn = mergeDeepIn;\nRecordPrototype.setIn = setIn$$1;\nRecordPrototype.update = update$$1;\nRecordPrototype.updateIn = updateIn$1;\nRecordPrototype.withMutations = withMutations;\nRecordPrototype.asMutable = asMutable;\nRecordPrototype.asImmutable = asImmutable;\nRecordPrototype[ITERATOR_SYMBOL] = RecordPrototype.entries;\nRecordPrototype.toJSON = RecordPrototype.toObject =\n  CollectionPrototype.toObject;\nRecordPrototype.inspect = RecordPrototype.toSource = function() {\n  return this.toString();\n};\n\nfunction makeRecord(likeRecord, values, ownerID) {\n  var record = Object.create(Object.getPrototypeOf(likeRecord));\n  record._values = values;\n  record.__ownerID = ownerID;\n  return record;\n}\n\nfunction recordName(record) {\n  return record._name || record.constructor.name || 'Record';\n}\n\nfunction recordSeq(record) {\n  return keyedSeqFromValue(record._keys.map(function (k) { return [k, record.get(k)]; }));\n}\n\nfunction setProp(prototype, name) {\n  try {\n    Object.defineProperty(prototype, name, {\n      get: function() {\n        return this.get(name);\n      },\n      set: function(value) {\n        invariant(this.__ownerID, 'Cannot set on an immutable record.');\n        this.set(name, value);\n      }\n    });\n  } catch (error) {\n    // Object.defineProperty failed. Probably IE8.\n  }\n}\n\n/**\n * Returns a lazy Seq of `value` repeated `times` times. When `times` is\n * undefined, returns an infinite sequence of `value`.\n */\nvar Repeat = (function (IndexedSeq$$1) {\n  function Repeat(value, times) {\n    if (!(this instanceof Repeat)) {\n      return new Repeat(value, times);\n    }\n    this._value = value;\n    this.size = times === undefined ? Infinity : Math.max(0, times);\n    if (this.size === 0) {\n      if (EMPTY_REPEAT) {\n        return EMPTY_REPEAT;\n      }\n      EMPTY_REPEAT = this;\n    }\n  }\n\n  if ( IndexedSeq$$1 ) Repeat.__proto__ = IndexedSeq$$1;\n  Repeat.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n  Repeat.prototype.constructor = Repeat;\n\n  Repeat.prototype.toString = function toString () {\n    if (this.size === 0) {\n      return 'Repeat []';\n    }\n    return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';\n  };\n\n  Repeat.prototype.get = function get (index, notSetValue) {\n    return this.has(index) ? this._value : notSetValue;\n  };\n\n  Repeat.prototype.includes = function includes (searchValue) {\n    return is(this._value, searchValue);\n  };\n\n  Repeat.prototype.slice = function slice (begin, end) {\n    var size = this.size;\n    return wholeSlice(begin, end, size)\n      ? this\n      : new Repeat(\n          this._value,\n          resolveEnd(end, size) - resolveBegin(begin, size)\n        );\n  };\n\n  Repeat.prototype.reverse = function reverse () {\n    return this;\n  };\n\n  Repeat.prototype.indexOf = function indexOf (searchValue) {\n    if (is(this._value, searchValue)) {\n      return 0;\n    }\n    return -1;\n  };\n\n  Repeat.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n    if (is(this._value, searchValue)) {\n      return this.size;\n    }\n    return -1;\n  };\n\n  Repeat.prototype.__iterate = function __iterate (fn, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var i = 0;\n    while (i !== size) {\n      if (fn(this$1._value, reverse ? size - ++i : i++, this$1) === false) {\n        break;\n      }\n    }\n    return i;\n  };\n\n  Repeat.prototype.__iterator = function __iterator (type, reverse) {\n    var this$1 = this;\n\n    var size = this.size;\n    var i = 0;\n    return new Iterator(\n      function () { return i === size\n          ? iteratorDone()\n          : iteratorValue(type, reverse ? size - ++i : i++, this$1._value); }\n    );\n  };\n\n  Repeat.prototype.equals = function equals (other) {\n    return other instanceof Repeat\n      ? is(this._value, other._value)\n      : deepEqual(other);\n  };\n\n  return Repeat;\n}(IndexedSeq));\n\nvar EMPTY_REPEAT;\n\nfunction fromJS(value, converter) {\n  return fromJSWith(\n    [],\n    converter || defaultConverter,\n    value,\n    '',\n    converter && converter.length > 2 ? [] : undefined,\n    { '': value }\n  );\n}\n\nfunction fromJSWith(stack, converter, value, key, keyPath, parentValue) {\n  var toSeq = Array.isArray(value)\n    ? IndexedSeq\n    : isPlainObj(value) ? KeyedSeq : null;\n  if (toSeq) {\n    if (~stack.indexOf(value)) {\n      throw new TypeError('Cannot convert circular structure to Immutable');\n    }\n    stack.push(value);\n    keyPath && key !== '' && keyPath.push(key);\n    var converted = converter.call(\n      parentValue,\n      key,\n      toSeq(value).map(function (v, k) { return fromJSWith(stack, converter, v, k, keyPath, value); }\n      ),\n      keyPath && keyPath.slice()\n    );\n    stack.pop();\n    keyPath && keyPath.pop();\n    return converted;\n  }\n  return value;\n}\n\nfunction defaultConverter(k, v) {\n  return isKeyed(v) ? v.toMap() : v.toList();\n}\n\nvar version = \"4.0.0-rc.9\";\n\n// Functional read/write API\nvar Immutable = {\n  version: version,\n\n  Collection: Collection,\n  // Note: Iterable is deprecated\n  Iterable: Collection,\n\n  Seq: Seq,\n  Map: Map,\n  OrderedMap: OrderedMap,\n  List: List,\n  Stack: Stack,\n  Set: Set,\n  OrderedSet: OrderedSet,\n\n  Record: Record,\n  Range: Range,\n  Repeat: Repeat,\n\n  is: is,\n  fromJS: fromJS,\n  hash: hash,\n\n  isImmutable: isImmutable,\n  isCollection: isCollection,\n  isKeyed: isKeyed,\n  isIndexed: isIndexed,\n  isAssociative: isAssociative,\n  isOrdered: isOrdered,\n  isValueObject: isValueObject,\n\n  get: get,\n  getIn: getIn$1,\n  has: has,\n  hasIn: hasIn$1,\n  merge: merge$1,\n  mergeDeep: mergeDeep$1,\n  mergeWith: mergeWith$1,\n  mergeDeepWith: mergeDeepWith$1,\n  remove: remove,\n  removeIn: removeIn,\n  set: set,\n  setIn: setIn$1,\n  update: update$1,\n  updateIn: updateIn\n};\n\n// Note: Iterable is deprecated\nvar Iterable = Collection;\n\nexport { version, Collection, Iterable, Seq, Map, OrderedMap, List, Stack, Set, OrderedSet, Record, Range, Repeat, is, fromJS, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, isValueObject, get, getIn$1 as getIn, has, hasIn$1 as hasIn, merge$1 as merge, mergeDeep$1 as mergeDeep, mergeWith$1 as mergeWith, mergeDeepWith$1 as mergeDeepWith, remove, removeIn, set, setIn$1 as setIn, update$1 as update, updateIn };\nexport default Immutable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/immutable/dist/immutable.es.js\n// module id = 14\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _connect = require('./connect');\n\nObject.defineProperty(exports, 'Connect', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_connect).default;\n  }\n});\n\nvar _base_store = require('./stores/base_store');\n\nObject.defineProperty(exports, 'BaseStore', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_base_store).default;\n  }\n});\n\nvar _immutable_store = require('./stores/immutable_store');\n\nObject.defineProperty(exports, 'ImmutableStore', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_immutable_store).default;\n  }\n});\n\nvar _store_listener = require('./mixins/store_listener');\n\nObject.defineProperty(exports, 'StoreListener', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_store_listener).default;\n  }\n});\n\nvar _dispatcher = require('./dispatcher');\n\nObject.defineProperty(exports, 'Dispatcher', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_dispatcher).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/index.js\n// module id = 15\n// module chunks = 0 1","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_global.js\n// module id = 16\n// module chunks = 0 1","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 17\n// module chunks = 0 1","//     Backbone.js 1.1.2\n\n//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(root, factory) {\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (typeof define === 'function' && define.amd) {\n    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    });\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    var _ = require('underscore');\n    factory(root, exports, _);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n\n}(this, function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create local references to array methods we'll want to use later.\n  var array = [];\n  var push = array.push;\n  var slice = array.slice;\n  var splice = array.splice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.1.2';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may bind with `on` or remove with `off` callback\n  // functions to an event; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {\n\n    // Bind an event to a `callback` function. Passing `\"all\"` will bind\n    // the callback to all events fired.\n    on: function(name, callback, context) {\n      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n      this._events || (this._events = {});\n      var events = this._events[name] || (this._events[name] = []);\n      events.push({callback: callback, context: context, ctx: context || this});\n      return this;\n    },\n\n    // Bind an event to only be triggered a single time. After the first time\n    // the callback is invoked, it will be removed.\n    once: function(name, callback, context) {\n      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n      var self = this;\n      var once = _.once(function() {\n        self.off(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n      return this.on(name, once, context);\n    },\n\n    // Remove one or many callbacks. If `context` is null, removes all\n    // callbacks with that function. If `callback` is null, removes all\n    // callbacks for the event. If `name` is null, removes all bound\n    // callbacks for all events.\n    off: function(name, callback, context) {\n      var retain, ev, events, names, i, l, j, k;\n      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n      if (!name && !callback && !context) {\n        this._events = void 0;\n        return this;\n      }\n      names = name ? [name] : _.keys(this._events);\n      for (i = 0, l = names.length; i < l; i++) {\n        name = names[i];\n        if (events = this._events[name]) {\n          this._events[name] = retain = [];\n          if (callback || context) {\n            for (j = 0, k = events.length; j < k; j++) {\n              ev = events[j];\n              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||\n                  (context && context !== ev.context)) {\n                retain.push(ev);\n              }\n            }\n          }\n          if (!retain.length) delete this._events[name];\n        }\n      }\n\n      return this;\n    },\n\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\n    // passed the same arguments as `trigger` is, apart from the event name\n    // (unless you're listening on `\"all\"`, which will cause your callback to\n    // receive the true name of the event as the first argument).\n    trigger: function(name) {\n      if (!this._events) return this;\n      var args = slice.call(arguments, 1);\n      if (!eventsApi(this, 'trigger', name, args)) return this;\n      var events = this._events[name];\n      var allEvents = this._events.all;\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, arguments);\n      return this;\n    },\n\n    // Tell this object to stop listening to either specific events ... or\n    // to every object it's currently listening to.\n    stopListening: function(obj, name, callback) {\n      var listeningTo = this._listeningTo;\n      if (!listeningTo) return this;\n      var remove = !name && !callback;\n      if (!callback && typeof name === 'object') callback = this;\n      if (obj) (listeningTo = {})[obj._listenId] = obj;\n      for (var id in listeningTo) {\n        obj = listeningTo[id];\n        obj.off(name, callback, this);\n        if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];\n      }\n      return this;\n    }\n\n  };\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Implement fancy features of the Events API such as multiple event\n  // names `\"change blur\"` and jQuery-style event maps `{change: action}`\n  // in terms of the existing API.\n  var eventsApi = function(obj, action, name, rest) {\n    if (!name) return true;\n\n    // Handle event maps.\n    if (typeof name === 'object') {\n      for (var key in name) {\n        obj[action].apply(obj, [key, name[key]].concat(rest));\n      }\n      return false;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return false;\n    }\n\n    return true;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};\n\n  // Inversion-of-control versions of `on` and `once`. Tell *this* object to\n  // listen to an event in another object ... keeping track of what it's\n  // listening to.\n  _.each(listenMethods, function(implementation, method) {\n    Events[method] = function(obj, name, callback) {\n      var listeningTo = this._listeningTo || (this._listeningTo = {});\n      var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n      listeningTo[id] = obj;\n      if (!callback && typeof name === 'object') callback = this;\n      obj[implementation](name, callback, this);\n      return this;\n    };\n  });\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId('c');\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      var attr, attrs, unset, changes, silent, changing, prev, current;\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      unset           = options.unset;\n      silent          = options.silent;\n      changes         = [];\n      changing        = this._changing;\n      this._changing  = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n      current = this.attributes, prev = this._previousAttributes;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // For each `set` attribute, update or delete the current value.\n      for (attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          this.changed[attr] = val;\n        } else {\n          delete this.changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0, l = changes.length; i < l; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var val, changed = false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      for (var attr in diff) {\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\n        (changed || (changed = {}))[attr] = val;\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overridden,\n    // triggering a `\"change\"` event.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (!model.set(model.parse(resp, options), options)) return false;\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      var attrs, method, xhr, attributes = this.attributes;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true}, options);\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !options.wait) {\n        if (!this.set(attrs, options)) return false;\n      } else {\n        if (!this._validate(attrs, options)) return false;\n      }\n\n      // Set temporary attributes if `{wait: true}`.\n      if (attrs && options.wait) {\n        this.attributes = _.extend({}, attributes, attrs);\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = model.parse(resp, options);\n        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);\n        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {\n          return false;\n        }\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch') options.attrs = attrs;\n      xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      if (attrs && options.wait) this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n\n      var destroy = function() {\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (options.wait || model.isNew()) destroy();\n        if (success) success(model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      if (this.isNew()) {\n        options.success();\n        return false;\n      }\n      wrapError(this, options);\n\n      var xhr = this.sync('delete', this, options);\n      if (!options.wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      return base.replace(/([^\\/])$/, '$1/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend(options || {}, { validate: true }));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model.\n  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  _.each(modelMethods, function(method) {\n    Model.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.attributes);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analagous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model){ return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      var singular = !_.isArray(models);\n      models = singular ? [models] : _.clone(models);\n      options || (options = {});\n      var i, l, index, model;\n      for (i = 0, l = models.length; i < l; i++) {\n        model = models[i] = this.get(models[i]);\n        if (!model) continue;\n        delete this._byId[model.id];\n        delete this._byId[model.cid];\n        index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n        this._removeReference(model, options);\n      }\n      return singular ? models[0] : models;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      options = _.defaults({}, options, setOptions);\n      if (options.parse) models = this.parse(models, options);\n      var singular = !_.isArray(models);\n      models = singular ? (models ? [models] : []) : _.clone(models);\n      var i, l, id, model, attrs, existing, sort;\n      var at = options.at;\n      var targetModel = this.model;\n      var sortable = this.comparator && (at == null) && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n      var toAdd = [], toRemove = [], modelMap = {};\n      var add = options.add, merge = options.merge, remove = options.remove;\n      var order = !sortable && add && remove ? [] : false;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      for (i = 0, l = models.length; i < l; i++) {\n        attrs = models[i] || {};\n        if (attrs instanceof Model) {\n          id = model = attrs;\n        } else {\n          id = attrs[targetModel.prototype.idAttribute || 'id'];\n        }\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        if (existing = this.get(id)) {\n          if (remove) modelMap[existing.cid] = true;\n          if (merge) {\n            attrs = attrs === model ? model.attributes : attrs;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(attrs, options);\n          if (!model) continue;\n          toAdd.push(model);\n          this._addReference(model, options);\n        }\n\n        // Do not add multiple models with the same `id`.\n        model = existing || model;\n        if (order && (model.isNew() || !modelMap[model.id])) order.push(model);\n        modelMap[model.id] = true;\n      }\n\n      // Remove nonexistent models if appropriate.\n      if (remove) {\n        for (i = 0, l = this.length; i < l; ++i) {\n          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this.remove(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      if (toAdd.length || (order && order.length)) {\n        if (sortable) sort = true;\n        this.length += toAdd.length;\n        if (at != null) {\n          for (i = 0, l = toAdd.length; i < l; i++) {\n            this.models.splice(at + i, 0, toAdd[i]);\n          }\n        } else {\n          if (order) this.models.length = 0;\n          var orderedModels = order || toAdd;\n          for (i = 0, l = orderedModels.length; i < l; i++) {\n            this.models.push(orderedModels[i]);\n          }\n        }\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort events.\n      if (!options.silent) {\n        for (i = 0, l = toAdd.length; i < l; i++) {\n          (model = toAdd[i]).trigger('add', model, this, options);\n        }\n        if (sort || (order && order.length)) this.trigger('sort', this, options);\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options || (options = {});\n      for (var i = 0, l = this.models.length; i < l; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      if (_.isEmpty(attrs)) return first ? void 0 : [];\n      return this[first ? 'find' : 'filter'](function(model) {\n        for (var key in attrs) {\n          if (attrs[key] !== model.get(key)) return false;\n        }\n        return true;\n      });\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      // Run sort based on type of `comparator`.\n      if (_.isString(this.comparator) || this.comparator.length === 1) {\n        this.models = this.sortBy(this.comparator, this);\n      } else {\n        this.models.sort(_.bind(this.comparator, this));\n      }\n\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return _.invoke(this.models, 'get', attr);\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success(collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      if (!(model = this._prepareModel(model, options))) return false;\n      if (!options.wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(model, resp) {\n        if (options.wait) collection.add(model, options);\n        if (success) success(model, resp, options);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (attrs instanceof Model) return attrs;\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      if (model.id != null) this._byId[model.id] = model;\n      if (!model.collection) model.collection = this;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if ((event === 'add' || event === 'remove') && collection !== this) return;\n      if (event === 'destroy') this.remove(model, options);\n      if (model && event === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        if (model.id != null) this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',\n    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',\n    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',\n    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',\n    'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',\n    'lastIndexOf', 'isEmpty', 'chain', 'sample'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Collection.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.models);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Underscore methods that take a property name as an argument.\n  var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];\n\n  // Use attributes instead of properties.\n  _.each(attributeMethods, function(method) {\n    Collection.prototype[method] = function(value, context) {\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _[method](this.models, iterator, context);\n    };\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    options || (options = {});\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n    this.delegateEvents();\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this.$el.remove();\n      this.stopListening();\n      return this;\n    },\n\n    // Change the view's element (`this.el` property), including event\n    // re-delegation.\n    setElement: function(element, delegate) {\n      if (this.$el) this.undelegateEvents();\n      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);\n      this.el = this.$el[0];\n      if (delegate !== false) this.delegateEvents();\n      return this;\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents: function(events) {\n      if (!(events || (events = _.result(this, 'events')))) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[events[key]];\n        if (!method) continue;\n\n        var match = key.match(delegateEventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          this.$el.on(eventName, method);\n        } else {\n          this.$el.on(eventName, selector, method);\n        }\n      }\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);\n        this.setElement($el, false);\n      } else {\n        this.setElement(_.result(this, 'el'), false);\n      }\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // If we're sending a `PATCH` request, and we're in an old Internet Explorer\n    // that still has ActiveX enabled by default, override jQuery to use that\n    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.\n    if (params.type === 'PATCH' && noXhrPatch) {\n      params.xhr = function() {\n        return new ActiveXObject(\"Microsoft.XMLHTTP\");\n      };\n    }\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  var noXhrPatch =\n    typeof window !== 'undefined' && !!window.ActiveXObject &&\n      !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch':  'PATCH',\n    'delete': 'DELETE',\n    'read':   'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        router.execute(callback, args);\n        router.trigger.apply(router, ['route:' + name].concat(args));\n        router.trigger('route', name, args);\n        Backbone.history.trigger('route', router, name, args);\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional) {\n                     return optional ? match : '([^/?]+)';\n                   })\n                   .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Cached regex for removing a trailing slash.\n  var trailingSlash = /\\/$/;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment: function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || !this._wantsHashChange || forcePushState) {\n          fragment = decodeURI(this.location.pathname + this.location.search);\n          var root = this.root.replace(trailingSlash, '');\n          if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      if (oldIE && this._wantsHashChange) {\n        var frame = Backbone.$('<iframe src=\"javascript:0\" tabindex=\"-1\">');\n        this.iframe = frame.hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        Backbone.$(window).on('popstate', this.checkUrl);\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n        Backbone.$(window).on('hashchange', this.checkUrl);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      var loc = this.location;\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          this.fragment = this.getFragment(null, true);\n          this.location.replace(this.root + '#' + this.fragment);\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot() && loc.hash) {\n          this.fragment = this.getHash().replace(routeStripper, '');\n          this.history.replaceState({}, document.title, this.root + this.fragment);\n        }\n\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n      if (current === this.fragment && this.iframe) {\n        current = this.getFragment(this.getHash(this.iframe));\n      }\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      var url = this.root + (fragment = this.getFragment(fragment || ''));\n\n      // Strip the hash for matching.\n      fragment = fragment.replace(pathStripper, '');\n\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n\n      // Don't include a trailing slash on the root.\n      if (fragment === '' && url !== '/') url = url.slice(0, -1);\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._hasPushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if(!options.replace) this.iframe.document.open().close();\n          this._updateHash(this.iframe.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent's constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    var Surrogate = function(){ this.constructor = child; };\n    Surrogate.prototype = parent.prototype;\n    child.prototype = new Surrogate;\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error(model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/backbone/backbone.js\n// module id = 18\n// module chunks = 0 1","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js\n// module id = 19\n// module chunks = 0 1","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js\n// module id = 20\n// module chunks = 0 1","import Immutable from 'immutable';\n\nimport { Dispatcher } from '@opengov/og_flux';\nimport analytics from '@opengov/og_analytics';\nimport api from '@opengov/og_api';\n\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport ReportViewStore from '../stores/report_view_store';\nimport MaskActions from './mask_actions';\nimport SummaryReportActions from './summary_report_actions';\nimport * as InviteActions from './invite_actions';\nimport _s from 'underscore.string';\n\nimport { canEditTooltips, packageTooltipForSave } from '../maps/map_constants';\n\nconst ReportActions = {\n  newReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_NEW'\n    });\n  },\n\n  cloneReport({ report, name, properties, copySavedViews }) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_CLONE'\n    });\n\n    api\n      .post(`reports/${report.get('id')}/clone`, {\n        name,\n        properties,\n        saved_views: copySavedViews\n      }).end()\n      .then((response) => {\n        const { entity, id } = response.body;\n        (window as any).location = `reports#/${entity}/${id}`;\n      });\n  },\n\n  loadReport(reportId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_LOAD',\n      reportId\n    });\n  },\n\n  loadedReport(report, entity) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_LOADED',\n      report,\n      entity\n    });\n\n    const invites = report && report.get('invites');\n\n    if (invites) {\n      InviteActions.loadedInvitedUsers(invites);\n    }\n\n    if (!ReportViewStore.isGridReport()) {\n      return SummaryReportActions.getPackage();\n    }\n\n    return Promise.resolve();\n  },\n\n  updatedReport(report) {\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_UPDATED',\n      updatedReport: report\n    });\n  },\n\n  updateReportPermission({ visibility }) {\n    const report = ReportViewStore.getRenderedReport();\n\n    api.put('reports', report.get('id'), { visibility })\n      .end()\n      .then(() => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_UPDATE_PERMISSION',\n          visibility\n        });\n      });\n  },\n\n  updateState(state) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_STATE_CHANGE',\n      state\n    });\n  },\n\n  loadedBackboneReport(report) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_BACKBONE_LOADED',\n      report\n    });\n  },\n\n  resetState() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_STATE_RESET'\n    });\n  },\n\n  defaultStateUpdated(properties) {\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_DEFAULT_STATE_UPDATED',\n      properties\n    });\n  },\n\n  selectSidebar(sidebar) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_SELECT_SIDEBAR',\n      sidebar\n    });\n  },\n\n  toggleMainPanel(panel) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_TOGGLE_MAIN_PANEL',\n      panel\n    });\n  },\n\n  openAnnotationsPanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_OPEN_ANNOTATIONS_PANEL'\n    });\n  },\n\n  closeAnnotationsPanel() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL'\n    });\n  },\n\n  pushHistory(item) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_PUSH_HISTORY',\n      item\n    });\n  },\n\n  popHistory() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_POP_HISTORY'\n    });\n  },\n\n  clearHistory() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_VIEW_CLEAR_HISTORY'\n    });\n  },\n\n  toggleAuditMode() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_TOGGLE_AUDIT_MODE'\n    });\n    SummaryReportActions.getPackage();\n\n    const auditModeEnabled = ReportViewStore.getAuditModeEnabled();\n    analytics.pushEvent('ReportActions', 'ToggleAuditMode', '', auditModeEnabled);\n  },\n\n  enableEditDefaultStateMode() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_ENABLE_EDIT_DEFAULT_STATE_MODE'\n    });\n  },\n\n  cancelEditDefaultStateMode() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_CANCEL_EDIT_DEFAULT_STATE_MODE'\n    });\n  },\n\n  openSettingsPanel() {\n    const report = ReportViewStore.getRenderedReport();\n    MaskActions.getMasks(report.get('coa_id'));\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_OPEN_SETTINGS_PANEL'\n    });\n  },\n\n  openEditData() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_OPEN_EDIT_DATA'\n    });\n  },\n\n  closeEditData() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_CLOSE_EDIT_DATA'\n    });\n  },\n\n  openEditLinkage() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_OPEN_EDIT_LINKAGE'\n    });\n  },\n\n  summaryToggleNode(nodeId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_TOGGLE_NODE',\n      nodeId\n    });\n  },\n\n  summarySetExpandedNodes(nodes, loaded) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_EXPANDED_NODES',\n      nodes, loaded\n    });\n  },\n\n  hasInvalidData() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_INVALID_DATA'\n    });\n  },\n\n  hasValidData() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_VALID_DATA'\n    });\n  },\n\n  graphResized(width, height) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GRAPH_RESIZE',\n      width,\n      height\n    });\n  },\n\n  downloadCSV() {\n    Dispatcher.handleViewAction({\n      actionType: 'DOWNLOAD_CSV'\n    });\n  },\n\n  printReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'PRINT_REPORT'\n    });\n  },\n\n  updateUrlParams(params) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_UPDATE_URL_PARAMS',\n      params\n    });\n  },\n\n  showBudget101(persistState?) {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_BUDGET_101',\n      persistState\n    });\n  },\n\n  hideBudget101() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_BUDGET_101'\n    });\n  },\n\n  showTOS() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_TOS'\n    });\n  },\n\n  hideTOS() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_TOS'\n    });\n  },\n\n  showHowTo() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_HOWTO'\n    });\n  },\n\n  hideHowTo() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_HOWTO'\n    });\n  },\n\n  showWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_WELCOME'\n    });\n  },\n\n  hideWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_WELCOME'\n    });\n  },\n\n  showReportWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_REPORT_WELCOME'\n    });\n  },\n\n  hideReportWelcomeModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_REPORT_WELCOME'\n    });\n  },\n\n  showFeedback() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_FEEDBACK_FORM'\n    });\n  },\n\n  hideFeedback() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_FEEDBACK_FORM'\n    });\n  },\n\n  showDownloadModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'SHOW_DOWNLOAD'\n    });\n  },\n\n  hideDownloadModal() {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_DOWNLOAD'\n    });\n  },\n\n  sendFeedback(name, phone, email, message, reportId, entityId) {\n    const data = {\n      name,\n      email,\n      phone,\n      message,\n      entity_id: entityId,\n      url: window.location.href,\n      report_id: null\n    };\n\n    if (reportId) {\n      data.report_id = reportId;\n    }\n\n    if (_s.trim(data.message) !== '') {\n      api.core.post('feedbacks', data)\n        .end()\n        .then(() => {\n          Dispatcher.handleServerAction({\n            actionType: 'FEEDBACK_SAVED'\n          });\n        })\n        .catch(() => {\n          Dispatcher.handleViewAction({\n            actionType: 'SHOW_FEEDBACK_ERROR',\n            errorMessage: 'An error occurred when trying to send feedback'\n          });\n        });\n    } else {\n      Dispatcher.handleViewAction({\n        actionType: 'SHOW_FEEDBACK_ERROR',\n        errorMessage: 'Please input a message'\n      });\n    }\n  },\n\n  updateMapTooltip(mapTooltip) {\n    if (!canEditTooltips(SessionStore.getSession())) {\n      return;\n    }\n\n    const report = ReportViewStore.getRenderedReport();\n    const currentTooltips = report.getIn(['properties', 'map_tooltips']) || Immutable.List();\n    const mapTooltips = currentTooltips.push(packageTooltipForSave(mapTooltip));\n    const properties = report\n      .get('properties')\n      .set('map_tooltips', mapTooltips)\n      .toJS();\n\n    api.put('reports', report.get('id'), { properties })\n      .end()\n      .then(() => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_UPDATE_MAP_TOOLTIPS',\n          mapTooltips\n        });\n      });\n  },\n};\n\nexport default ReportActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/report_actions.ts","import _s from 'underscore.string';\nimport _ from 'lodash';\nimport numeral from 'numeral';\nimport moment from 'moment';\n\nimport * as DataSetUtils from './utils/dataset_utils';\nimport Immutable from 'immutable';\n\nimport i18n from './i18n';\n\nconst translate = (key, options?) => {\n  const t = i18n.getFixedT(null, 'report');\n  return t(key, options);\n};\n\nimport ReportViewStore from './stores/report_view_store';\n\nconst isBalanceSheetLedger = ledger => ledger.id === 'assets' || ledger.id === 'liabilities';\n\nconst isVariance = (accountType, visibleAccounts) => {\n  return accountType === 'types' && visibleAccounts && visibleAccounts.length && visibleAccounts.every(isBalanceSheetLedger);\n};\n\nconst strings = {\n  versusViewsStrings() {\n    return Immutable.fromJS([\n      {id: 'balanceSheet', name: translate('strings.versusViews.balanceSheet'), trees: ['assets', 'liabilities']},\n      {id: 'revenuesVersusExpenses', name: translate('strings.versusViews.revenuesVersusExpenses'), trees: ['revenues', 'expenses']}\n    ]);\n  },\n\n  accountTypeCategories() {\n    return {\n      revenues: translate('strings.accountTypeCategories.revenues'),\n      expenses: translate('strings.accountTypeCategories.expenses'),\n      assets: translate('strings.accountTypeCategories.assets'),\n      liabilities: translate('strings.accountTypeCategories.liabilities'),\n      revAndExp: translate('strings.accountTypeCategories.revAndExp'),\n      assetAndLiability: translate('strings.accountTypeCategories.assetAndLiability'),\n    };\n  },\n\n  month(month) {\n    let months = translate('strings.months', {returnObjects: true});\n    return months[month - 1];\n  },\n\n  aggregateRowLabel(accountType?, visibleAccounts?, isBalanceSheetReport?) {\n    if (isBalanceSheetReport && accountType === 'types') {\n      return translate('strings.tableTotalFooters.balanceSheet');\n    }\n    if (accountType === 'types' ) {\n      if (isVariance(accountType, visibleAccounts)) {\n        return translate('strings.tableTotalFooters.variance');\n      }\n      return translate('strings.tableTotalFooters.revLessExp');\n    }\n    return translate('strings.tableTotalFooters.total');\n  },\n\n  // taken from php.js\n  nl2br(str) {\n    return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1<br>$2');\n  },\n\n  nl2space(str) {\n    return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1 $2');\n  },\n\n  br2space(str) {\n    return (str + '').replace(/<br>/gi, ' ');\n  },\n\n  yAxis(options) {\n    const validScale = options.yAxisScale && options.yAxisScale.type && options.yAxisScale.value;\n    let scaleName = validScale ? options.yAxisScale.get('name') : null;\n    const scaleValue = validScale ? options.yAxisScale.value : null;\n    scaleName = validScale ? (' ' + scaleName + ' (' + numeral(scaleValue).format('0,0') + ')') : '';\n\n    switch (options.units) {\n    case '£':\n      return 'Pounds' + scaleName;\n    case '$':\n      return 'Dollars' + scaleName;\n    case '%':\n      return 'Percent of Total' + scaleName;\n    case 'FTE':\n      return 'FTE';\n    default:\n      throw new Error('Unrecognized units');\n    }\n  },\n\n  xAxis(options) {\n    if (options.reportType === 'ytd') {\n      const spending = options.currentYearAmount === 'cumulative' ?\n        'cumulative amounts' : 'incremental amounts';\n\n      if (options.currentYearPeriod === 'months') {\n        return `Fiscal Year ${this.fiscalYear(options.year, options.fiscalYearStartMonth)} (${spending})`;\n      }\n\n      if (options.month) {\n        if (options.currentYearAmount === 'monthly') {\n          return `${this.month(options.month)} (${spending})`;\n        }\n        return `Fiscal Year Through ${this.month(options.month)} (${spending})`;\n      }\n    }\n\n    return 'Fiscal Year';\n  },\n\n  yAxisLabel(value, yAxisScale) {\n    let num;\n\n    if (yAxisScale && yAxisScale.type === 'monetary') {\n      num = value / yAxisScale.value;\n      num = numeral(num).format('0,0.[00]');\n      if (yAxisScale.name === 'in Thousands') {\n        return num + 'k';\n      } else if (yAxisScale.name === 'in Millions') {\n        return num + 'M';\n      }\n    }\n\n    const label = numeral(value).format('0.[00]a');\n    return (label.indexOf('k') !== -1) ? label : label.toUpperCase();\n  },\n\n  currencyNoDollar(number, yAxisScale?) {\n    if (yAxisScale && number < 1 && number > 0) {\n      return _s.numberFormat(Number(number), 2);\n    }\n    return _s.numberFormat(Math.round(Number(number)));\n  },\n\n  addCommasKeepDecimal(number) {\n    const parts = (Math.round(number * 100) / 100).toString().split('.');\n    parts[0] = _s.numberFormat(Number(parts[0]));\n    return parts.join('.');\n  },\n\n  generateDownloadString(locale = 'en_US') {\n    const m = moment();\n    m.locale(locale);\n    return `Download generated on ${m.format('L')}`;\n  },\n\n  percentage(number) {\n    if (!_.isFinite(number)) {\n      return '--';\n    }\n    return _s.numberFormat(number, 2) + '%';\n  },\n\n  amountUnitLabel(unit) {\n    switch (unit) {\n    case 'FTE':\n      return 'FTE Count';\n    case '$':\n      return 'dollar';\n    default:\n      return '';\n    }\n  },\n\n  dataSetLabel(dataSet, reportType, currentYearPeriod, currentYearAmount, startMonth, options: { proration, projections? }) {\n    const label = [];\n\n    if (dataSet.label) {\n      if (DataSetUtils.isProjectionDataset(dataSet) && dataSet.month) {\n        label.push(this.month(dataSet.month));\n        label.push(this.fiscalYear(dataSet.year, startMonth));\n      } else {\n        if (DataSetUtils.isProjectionDataset(dataSet)) {\n          label.push(this.fiscalYear(dataSet.year, startMonth));\n          label.push(dataSet.description);\n        } else {\n          label.push(dataSet.label);\n        }\n      }\n    } else {\n      if (dataSet.month) {\n        label.push(this.month(dataSet.month));\n      }\n\n      label.push(this.fiscalYear(dataSet.year, startMonth));\n      label.push(dataSet.description);\n    }\n\n    if (reportType === 'ytd'\n      && !dataSet.month\n      && !(currentYearAmount === 'cumulative' && currentYearPeriod === 'months')\n      && (options && options.proration || dataSet.type === 'actual')\n    ) {\n      label.push('(Prorated)');\n    }\n\n    if (DataSetUtils.isProjectionDataset(dataSet)) {\n      label.push('(Projected)');\n    }\n\n    return label.join('\\n');\n  },\n\n  summaryHeaderLabel(dataSet, product, startMonth) {\n    const label = [];\n\n    if (dataSet.month) {\n      label.push(this.month(dataSet.month));\n    }\n\n    label.push(this.fiscalYear(dataSet.year, startMonth));\n    label.push(dataSet.description);\n\n    return label.join(' ');\n  },\n\n  fiscalYear(year, startMonth) {\n    if (!startMonth) {\n      throw new Error('Cannot display fiscal year without starting month');\n    }\n\n    if (startMonth === 1) {\n      return '' + year;\n    }\n\n    let twoDigitYear: number | string = year % 100;\n    twoDigitYear = (twoDigitYear < 10 ? '0' : '') + twoDigitYear;\n    return (year - 1) + '-' + twoDigitYear;\n  },\n\n  accountTypeBreakdown(accountTypeId, reportType) {\n    if (accountTypeId === 'types') {\n      accountTypeId = reportType === 'balance' ? 'assetAndLiability' : 'revAndExp';\n    }\n    const accountTypeBreakdowns = translate('strings.accountTypeBreakdowns', {returnObjects: true});\n    return accountTypeBreakdowns[accountTypeId];\n  },\n\n  breakdownName(breakdown, accountType, visibleAccounts?, reportType?) {\n    if (breakdown.get('id') === 'types' ) {\n      if (isVariance(breakdown.get('id'), visibleAccounts)) {\n        return translate('strings.accountTypeBreakdowns.assetAndLiability');\n      }\n      return strings.accountTypeBreakdown(accountType, reportType);\n    }\n    return breakdown.get('name');\n  },\n\n  accountCategoryName(accountTypeId, product?) {\n    if (accountTypeId === 'types') {\n      accountTypeId = product === 'balance' ? 'assetAndLiability' : 'revAndExp';\n    }\n    return this.accountTypeCategories()[accountTypeId];\n  },\n\n  nodeName(node) {\n    let name = node.name;\n    const auditModeEnabled = ReportViewStore.getAuditModeEnabled();\n\n    if (auditModeEnabled && !_.isEmpty(node.accountCodeChains)) {\n      const parts = [];\n      for (let i = 0, len = node.accountCodeChains.length; i < len; ++i) {\n        const codes = node.accountCodeChains[i];\n        parts.push(codes.join('.'));\n      }\n      name = `(${ parts.join(', ') }) ${ name }`;\n    }\n\n    return name;\n  },\n\n  aggregationsCombinedName(aggregations?) {\n    const isBalanceSheet = !_.isEmpty(aggregations) && _.every(aggregations, function(tree: { id: string }) {\n      return tree.id === 'assets' || tree.id === 'liabilities';\n    });\n\n    if (isBalanceSheet) {\n      return translate('strings.versusViews.balanceSheet');\n    } else {\n      return _.map(aggregations, function(tree: { get(s: string) }) {\n        return tree ? tree.get('name') : '';\n      }).join(' & ');\n    }\n  },\n\n  exportTitle(reportType, entity, breakdownTitles, yearText, yAxisScale) {\n    const validNumericScale = yAxisScale && yAxisScale.get('type') === 'numeric';\n    const scaleValue = validNumericScale ? ' (' + numeral(yAxisScale.value).format('0,0') + ')' : null;\n    let scaleName = yAxisScale ? ' - ' + yAxisScale.get('name') : '';\n    scaleName = validNumericScale ? scaleName + scaleValue : scaleName;\n\n    return _.template('${entityName}<br />${reportType} - ${breakdown}${yearText}${yAxisScale}')({\n      entityName: _s.capitalize(entity.name),\n      reportType: reportType,\n      breakdown: breakdownTitles.primary.name,\n      yearText: yearText ? '<br/>' + yearText : '',\n      yAxisScale: yAxisScale ? scaleName : ''\n    });\n  },\n\n  formatFTE(value) {\n    const precision = parseInt(value) === parseFloat(value.toFixed(3)) ? 0 : 3;\n    return _s.numberFormat(value, precision);\n  },\n\n  truncateLabel(str) {\n    const len = 25;\n    if (str.length > len + 3) { //3 is due to decimal places that are added\n      return str.slice(0, len) + '...';\n    }\n    return str;\n  },\n\n  unitIsPrefix(unit) {\n    if (unit === '$') {\n      return true;\n    }\n    return false;\n  },\n\n  pillIconToUse(unit) {\n    unit = _.includes(unit, '$') ? '$' : unit; // Unit may be a string with more than just '$'\n    switch (unit) {\n    case '$':\n      return 'icon-dollar-1';\n    case 'FTE':\n      return 'icon-clock-1';\n    case 'people':\n      return 'icon-user-1'; //icon-team-1\n    case 'incidents':\n      return '';\n    default:\n      return '';\n    }\n  },\n\n  centsToDollars(metric, values) {\n    if (_.includes(metric.units, 'US cents')) {\n      metric.units = metric.units.replace('US cents', '$');\n      _.forEach(values, (yr) => yr.value /= 100);\n    }\n  },\n\n  generateTotalLabel: function(visualization, dateColumn) {\n    const isBarGraph = visualization && visualization.get('graphType') === 'bar';\n    const isLineGraph = visualization && visualization.get('graphType') === 'line';\n    const isVisualizationVisible = visualization && visualization.get('isVisible');\n    const isSingleXAxis = visualization && visualization.get('xAxis') && visualization.get('xAxis').size === 1;\n    const isPlural = (isBarGraph || isLineGraph) && !isSingleXAxis;\n\n    const firstTick = visualization && visualization.get('xAxis').first();\n    const hasMonths = firstTick && _.has(firstTick.result, 'month');\n    const isComputed = dateColumn && dateColumn.get('computed');\n\n    const plurality = isPlural ? 'all' : 'a';\n    const timeUnits = (hasMonths && !isComputed) ? 'month' : 'year';\n    const pluralEnding = isPlural ? 's' : '';\n\n    const totalValueLabel = `Total for ${plurality} ${timeUnits}${pluralEnding}`;\n    return isVisualizationVisible ? totalValueLabel : 'Total';\n  },\n\n  formatShareMessageFooter(list, limit) {\n    if (list.length === 0) {\n      return 'You have not invited anyone to access this report';\n    }\n    var fullNames = _.take(list, limit).join(', ');\n\n    if (list.length > limit) {\n      var more = list.length - limit;\n      fullNames += ', and ' + (more) + (more > 1 ? ' others' : ' other');\n    } else if (list.length === 1) {\n      fullNames = 'and ' + fullNames;\n    } else {\n      fullNames = fullNames.replace(/\\,(?=[^,]*$)/, ', and');\n    }\n    return `You${list.length > 1 ? ',' : ''} ${fullNames} have access`;\n  },\n\n  formatShareMessageFlash(list, count?) {\n    if (list.length === 0) {\n      return 'No one has been sent a link to this report';\n    }\n    const limit = 0;\n    var startName = list[0];\n    var remainderList = list.slice(1);\n\n    var fullNames = _.take(remainderList, limit).join(', ');\n\n    if (remainderList.length > limit) {\n      var more = remainderList.length - limit;\n      fullNames += `${limit > 0 ? ', ' : ''}`;\n      fullNames += 'and ' + (more) + (more > 1 ? ' other users' : ' other user');\n    } else if (remainderList.length === 1) {\n      fullNames = 'and ' + fullNames;\n    } else {\n      fullNames = fullNames.replace(/\\,(?=[^,]*$)/, ', and');\n    }\n    var potentialComma = remainderList.length > 1 && limit > 0 ? ',' : '';\n    var potentialSpace = remainderList.length > 0 ? ' ' : '';\n    var verb = remainderList.length > 0 || _.endsWith(startName, '(You)') ? 'have' : 'has';\n    return `${startName}${potentialComma} ${fullNames}${potentialSpace}${verb} been sent a link to this report.`;\n  }\n};\n\nexport default strings;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/strings.ts","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js\n// module id = 23\n// module chunks = 0 1","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/runtime.js\n// module id = 24\n// module chunks = 0 1","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js\n// module id = 25\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/invariant/browser.js\n// module id = 26\n// module chunks = 0 1","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js\n// module id = 27\n// module chunks = 0 1","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/index.js\n// module id = 28\n// module chunks = 0 1","import { Dispatcher } from '@opengov/og_flux';\nimport { BaseStore } from '@opengov/og_flux';\nimport * as Immutable from 'immutable';\nimport _ from 'lodash';\n\nclass ReportViewStore extends BaseStore {\n  _report: Immutable.Map<any, any>;\n  _entity: Immutable.Map<any, any>;\n  _activeSidebar: string;\n  _activeMainPanel: string;\n  _history: any[];\n  _editingDefaultState: boolean;\n  _editingData: boolean;\n  _hasValidData: boolean;\n  _wizardFlow: any;\n  _maskOptions: any[];\n  _state: any;\n  _urlParams: any;\n  emitChange: () => void;\n\n  constructor(options) {\n    super();\n\n    options = options || {};\n\n    this._report = Immutable.Map();\n    this._entity = Immutable.Map();\n    this._activeSidebar = 'reports';\n    this._activeMainPanel = options.standalone ? 'saved' : 'filter';\n    this._history = [];\n    this._editingDefaultState = false;\n    this._editingData = false;\n    this._hasValidData = true;\n    this._wizardFlow = null;\n    this._maskOptions = [];\n\n    Dispatcher.register((payload) => {\n      this._handleAction(payload.action);\n    });\n  }\n\n  getRenderedReport() {\n    return this._report;\n  }\n\n  getReportEntity() {\n    return this._entity;\n  }\n\n  getReportDataSets() {\n    return this._report.get('data_sets');\n  }\n\n  getState() {\n    return this._state;\n  }\n\n  getActiveSidebar() {\n    return this._activeSidebar;\n  }\n\n  getActiveMainPanel() {\n    return this._activeMainPanel;\n  }\n\n  getHistory() {\n    return this._history;\n  }\n\n  getUrlParams() {\n    return this._urlParams;\n  }\n\n  getAuditModeEnabled() {\n    return this._report.getIn(['properties', 'audit_mode_enabled']) || false;\n  }\n\n  getMaskOptions() {\n    return this._maskOptions;\n  }\n\n  isEditingDefaultState() {\n    return this._editingDefaultState;\n  }\n\n  isEditingData() {\n    return this._editingData;\n  }\n\n  getWizardFlow() {\n    return this._wizardFlow;\n  }\n\n  getHasValidData() {\n    return this._hasValidData;\n  }\n\n  isDefaultReport() {\n    return this._report.get('position') === 0;\n  }\n\n  isGridReport() {\n    return this._report.get('report_type') === 'grid';\n  }\n\n  isMonthlyReport() {\n    return this._report.get('report_type') === 'ytd';\n  }\n\n  isBalanceSheetReport() {\n    return this._report.get('report_type') === 'balance';\n  }\n\n  _handleAction(action) {\n    switch (action.actionType) {\n    case 'MASK_GET_MASKS_COMPLETE':\n      this._maskOptions = _.map(action.masks, (mask: { name, id }) => {\n        return {option: mask.name, value: mask.id};\n      });\n      this.emitChange();\n      break;\n\n    case 'REPORT_NEW':\n      this._editingData = true;\n      this._wizardFlow = 'NewReport';\n      this.emitChange();\n      break;\n\n    case 'REPORT_LOADED':\n      this._report = action.report.toImmutable();\n      if (this._report.getIn(['properties', 'total_text_visible']) === null) {\n        this._report = this._report.setIn(['properties', 'total_text_visible'], true);\n      }\n      if (this._report.getIn(['properties', 'summary_table_visible']) === null) {\n        this._report = this._report.setIn(['properties', 'summary_table_visible'], false);\n      }\n      this._entity = Immutable.fromJS(action.entity.toJSON());\n      this._history = [];\n      this.emitChange();\n      break;\n\n    case 'REPORT_UPDATED':\n      this._report = action.updatedReport;\n      this.emitChange();\n      break;\n\n    case 'REPORT_UPDATE_PERMISSION':\n      this._report = this._report.set('visibility', action.visibility);\n      this.emitChange();\n      break;\n\n    case 'REPORT_STATE_CHANGE':\n      if (!_.isEqual(this._state, action.state)) {\n        this._state = action.state;\n        this.emitChange();\n      }\n      break;\n\n    case 'REPORT_VIEW_TOGGLE_MAIN_PANEL':\n      this._activeMainPanel = action.panel;\n      this.emitChange();\n      break;\n\n    case 'REPORT_VIEW_PUSH_HISTORY':\n      this._history = this._history.concat(action.item);\n      this.emitChange();\n      break;\n\n    case 'REPORT_VIEW_POP_HISTORY':\n      this._history = this._history.slice(0, -1);\n      this.emitChange();\n      break;\n\n    case 'REPORT_VIEW_CLEAR_HISTORY':\n      this._history = [];\n      this.emitChange();\n      break;\n\n    case 'REPORT_ENABLE_EDIT_DEFAULT_STATE_MODE':\n      this._editingDefaultState = true;\n      this.emitChange();\n      break;\n\n    case 'REPORT_DEFAULT_STATE_UPDATED':\n      this._editingDefaultState = false;\n      this._report = this._report.set('properties', action.properties);\n      this.emitChange();\n      break;\n\n    case 'REPORT_CANCEL_EDIT_DEFAULT_STATE_MODE':\n      this._editingDefaultState = false;\n      this.emitChange();\n      break;\n\n    case 'REPORT_OPEN_EDIT_DATA':\n      this._editingData = true;\n      this._wizardFlow = 'EditDatasets';\n      this.emitChange();\n      break;\n\n    case 'REPORT_CLOSE_EDIT_DATA':\n      this._editingData = false;\n      this.emitChange();\n      break;\n\n    case 'REPORT_OPEN_EDIT_LINKAGE':\n      this._editingData = true;\n      this._wizardFlow = 'LinkGridReport';\n      this.emitChange();\n      break;\n\n    case 'REPORT_SUMMARY_INVALID_DATA':\n      this._hasValidData = false;\n      this.emitChange();\n      break;\n\n    case 'REPORT_SUMMARY_VALID_DATA':\n      this._hasValidData = true;\n      this.emitChange();\n      break;\n\n    case 'REPORT_TOGGLE_AUDIT_MODE':\n      this._report = this._report.setIn(['properties', 'audit_mode_enabled'], !this.getAuditModeEnabled());\n      this.emitChange();\n      break;\n\n    case 'REPORT_UPDATE_URL_PARAMS':\n      this._urlParams = action.params;\n      break;\n\n    case 'SAVED_VIEW_SELECTED':\n        // When user selects a saved view, show the saved views panel.\n      this._activeMainPanel = 'saved';\n      this.emitChange();\n      break;\n\n    case 'REPORT_VIEW_SELECT_SIDEBAR':\n      this._activeSidebar = action.sidebar;\n      this.emitChange();\n      break;\n\n    case 'REPORT_UPDATE_MAP_TOOLTIPS':\n      this._report = this._report.setIn(['properties', 'map_tooltips'], action.mapTooltips);\n      this.emitChange();\n      break;\n    }\n  }\n}\n\nconst store = new ReportViewStore({\n  standalone: gon.standalone\n});\n\n(store as any).__class = ReportViewStore;\n\nexport default store;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/report_view_store.ts","import { Dispatcher } from '@opengov/og_flux';\nimport api from '@opengov/og_api';\nimport _ from 'lodash';\n\nimport ReportViewStore from '../stores/report_view_store';\nimport SummaryReportStore from '../stores/summary_report_store';\nimport googleTranslateAPI from '../utils/google_translate';\nimport { shouldTranslate } from '../i18n';\nimport { trackIntercomEvent } from '../utils/intercom_utils';\n\nconst GET_AGGREGATIONS_DEBOUNCE_TIME = 800;\n\nconst SummaryReportActions = {\n\n  getAggregationsDebounced: _.debounce((skipGraph?: boolean) => {\n    SummaryReportActions.getAggregationsRequest(skipGraph);\n  }, GET_AGGREGATIONS_DEBOUNCE_TIME),\n\n  getAggregations(skipGraph?: boolean) {\n    SummaryReportActions.getAggregationsRequest(skipGraph);\n  },\n\n  getAggregationsRequest(skipGraph) {\n    const report = ReportViewStore.getRenderedReport();\n    const entity = ReportViewStore.getReportEntity();\n    const state = SummaryReportStore.getState();\n    const athenaState = state.get('athenaState');\n    const budgetData = state.get('budgetData');\n    const pkg = state.get('pkg');\n    const accountType = state.get('accountType');\n\n    const visibleAccounts = budgetData.visibleAccounts.map((account) => {\n      const res = { id: account.id, active: null };\n      if (account.id === accountType) {\n        res.active = true;\n      }\n      return res;\n    });\n\n    if (state.get('versusView')) {\n      visibleAccounts.push({id: 'types', active: true});\n    }\n\n    var state_scale_flag = false;\n    if(entity.get('feature_permissions')!== undefined && _.includes(entity.get('feature_permissions').toArray(), 'linkage_view')){\n      state_scale_flag = true;\n    }\n\n    const requestData = {\n      data_sets: budgetData.report.dataSets.pluck('id'),\n      coa_mask_id: report.get('coa_mask_id'),\n      cache_key: pkg.cache_key,\n      breakdown: accountType === 'types' ? 'types' : state.get('breakdown'),\n      visible_accounts: [].concat(visibleAccounts, budgetData.invisibleAccounts),\n      time_period: state.get('fiscalYearRange').toJS(),\n      mask: state.get('mask'),\n      serve_old: true,\n      state_scale: state_scale_flag,\n      ungroup: null,\n      selection: null,\n      checked_nodes: null,\n      expanded_nodes: null,\n      api: null\n    };\n\n    if (ReportViewStore.getAuditModeEnabled()) {\n      requestData.ungroup = true;\n    }\n\n    if (athenaState.pendingSelection) {\n      requestData.selection = athenaState.pendingSelection;\n      athenaState.pendingSelection = null;\n    } else {\n      requestData.checked_nodes = _.map(budgetData.minimalSelectedNodeList(), 'id');\n      requestData.expanded_nodes = _.keys(SummaryReportStore.getState().get('expandedNodes').toObject());\n    }\n\n    if ((window as any).gon && gon.dataApi) {\n      requestData.api = gon.dataApi;\n    }\n\n    SummaryReportActions.updateGraphLoadingStatus(true);\n\n    api.tapi.post('select', report.get('coa_id'), requestData).end()\n      .then((res) => {\n        SummaryReportActions.getAggregationsSuccess(res.body, skipGraph);\n      }).catch(error => {\n        SummaryReportActions.getAggregationsError(error);\n      }).finally(() => {\n        SummaryReportActions.updateGraphLoadingStatus(false);\n      });\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_AGGREGATIONS'\n    });\n  },\n\n  getMetricsAvailable() {\n    const report = ReportViewStore.getRenderedReport();\n    const entity = report.get('entity');\n    const requestData = {embed:'metrics'};\n\n    api.entitydata.get('entities', entity, requestData).end()\n      .then((res) => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_SET_METRICS_AVAILABLE',\n          metricsAvailable: res.body.metrics\n        });\n      }).catch(() => {\n        Dispatcher.handleViewAction({\n          actionType: 'REPORT_METRICS_UNAVAILABLE'\n        });\n      });\n  },\n\n  getMetricData() {\n    const report = ReportViewStore.getRenderedReport();\n    const state = SummaryReportStore.getState();\n    const overlaysSelected = state.getIn(['overlay', 'selected']);\n    const scaleSelected = state.getIn(['scale', 'selected']);\n    const selection = overlaysSelected.concat(scaleSelected);\n\n    // Filtering null + items that have already been queried for\n    const selectionFiltered = selection.filter((selected) => {\n      const dataHasntBeenRetrievedYet = state.getIn(['metricData', 'data']).filter((existingItem) => existingItem.get('metric_type') === selected).size === 0;\n      return !_.isNull(selected) && !_.isUndefined(selected) && dataHasntBeenRetrievedYet;\n    });\n\n    let apiCalls = [];\n    // It is preferable to make only 1 API call, however current API does not allow for different interpolation types for each selectedItem\n    selectionFiltered.forEach((selected) => {\n      // Getting entire year range instead of `fiscalYearRange`, as do not have to rerun query when fiscalYearRange changes\n      const years = state.get('years');\n      const entity = report.get('entity');\n\n      const requestData = {\n        embed: selected + ':' + years.min() + '..' + years.max(),\n        interpolate: true\n      };\n\n      apiCalls.push(new Promise((resolve) => {\n        api.entitydata.get('entities', entity, requestData).end()\n          .then((res) => {\n            Dispatcher.handleViewAction({\n              actionType: 'REPORT_SET_METRIC_DATA',\n              metricData: res.body.metrics\n            });\n            resolve();\n          }).catch((err) => { console.error(err); resolve(); });\n      }));\n    });\n    return Promise.all(apiCalls);\n  },\n\n  reset() {\n    Dispatcher.handleViewAction({\n      actionType: 'SUMMARY_REPORT_RESET'\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  setInitialState(initialState) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_INITIAL_STATE',\n      initialState\n    });\n  },\n\n  goBack(previousState) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GO_BACK',\n      previousState\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  updateGraphLoadingStatus(status) {\n    Dispatcher.handleViewAction({\n      actionType: 'UPDATE_GRAPH_LOADING_STATUS',\n      status: status\n    });\n  },\n\n  getAggregationsError(error) {\n    const state = SummaryReportStore.getState();\n    const budgetData = state.get('budgetData');\n    budgetData.trigger('aggregation:error', error);\n    Raven.captureException(error);\n  },\n\n  getAggregationsSuccess(aggregations, skipGraph) {\n    const state = SummaryReportStore.getState();\n    const budgetData = state.get('budgetData');\n\n    budgetData.updateEnabledState(aggregations.enabled_nodes);\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_AGGREGATIONS_SUCCESS',\n      aggregations\n    });\n\n    budgetData.aggregations = aggregations;\n    budgetData.aggregations.skipGraph = skipGraph;\n    budgetData.trigger('aggregation', aggregations);\n  },\n\n  getPackage() {\n    const report = ReportViewStore.getRenderedReport();\n    const entity = ReportViewStore.getReportEntity();\n\n    var state_scale_flag = false;\n    if(entity.get('feature_permissions')!== undefined && _.includes(entity.get('feature_permissions').toArray(), 'linkage_view')){\n      state_scale_flag = true;\n    }\n\n    const params = {\n      coa_mask_id: report.get('coa_mask_id'),\n      data_sets: report.get('data_sets').map((ds) => ds.get('id')).toArray(),\n      mask: SummaryReportStore.getState().get('mask'),\n      serve_old: true,\n      state_scale: state_scale_flag,\n      ungroup: null,\n      api: null\n    };\n    if (ReportViewStore.getAuditModeEnabled()) {\n      params.ungroup = true;\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_PACKAGE'\n    });\n\n    if ((window as any).gon && gon.dataApi) {\n      params.api = gon.dataApi;\n    }\n\n    return api.tapi.post('package', report.get('coa_id'), params).end()\n      .then((res) => {\n        return res.body;\n      })\n      .then((pkg) => {\n        if (shouldTranslate()) {\n          return new Promise((resolve) => {\n            // lets gather things we need to translate\n            const treeNames = _.map(pkg.trees, (obj: any) => obj.name);\n            const treeCategories = _(pkg.trees).map((obj) => obj.categories).flatten().value();\n            googleTranslateAPI(_.flatten([treeNames, treeCategories]))\n              .then((dictionary) => {\n                // replace translations\n                _.each(pkg.trees, (obj) => {\n                  obj.name = dictionary[obj.name];\n                  obj.categories = _.map(obj.categories, (categoryName: any) => dictionary[categoryName]);\n                });\n                resolve(pkg);\n              })\n              .catch((error) => {\n                resolve(pkg);\n                // NOTE: we should resolve first and then deal with Raven!\n                (window as any).Raven && (window as any).Raven.captureException(error);\n              });\n          });\n        } else {\n          return pkg;\n        }\n      })\n      .then((pkg) => {\n        if (!_.size(pkg.data_sets)) {\n          SummaryReportActions.loadedPackageNoDataSets(pkg);\n        }\n\n        // Hack to defer loading the selections before the summary report has\n        // fully reloaded after you change the selected data sets.\n        _.defer(() => {\n          SummaryReportActions.getPackageSuccess(pkg);\n        });\n      })\n      .catch((err) => {\n        setTimeout(SummaryReportActions.getPackageError(err), 1);\n        throw err;\n      });\n  },\n\n  getAnnotations() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_ANNOTATIONS'\n    });\n\n    const report = ReportViewStore.getRenderedReport();\n\n    api.get('annotations',\n      {\n        report_id: report.get('id'),\n        limit: 1000\n      },\n      (error, response) => {\n        if (error || !response.ok) {\n          (window as any).Raven && (window as any).Raven.captureException(new Error('Failed to load annotations'));\n          return;\n        }\n        const annotations = response.body.annotations;\n        SummaryReportActions.getAnnotationsSuccess(annotations);\n      }\n    );\n  },\n\n  getAnnotationsSuccess(annotations) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_ANNOTATIONS_SUCCESS',\n      annotations\n    });\n  },\n\n  setBreakdown(breakdownId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_BREAKDOWN',\n      breakdownId\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  setAccountType(accountTypeId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_ACCOUNT_TYPE',\n      accountTypeId\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  setVersusView(versusViewId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_VERSUS_VIEW',\n      versusViewId\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  togglePerCapitaScale(disableAggregations = false) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_TOGGLE_PER_CAPITA_SCALE'\n    });\n    SummaryReportActions.getMetricData().then(() => {\n      if (!disableAggregations) {\n        SummaryReportActions.getAggregations();\n      }\n    });\n  },\n\n  setMonth(month) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_MONTH',\n      month\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  setYear(year) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_YEAR',\n      year\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  setOverlays(overlaysSelected) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_OVERLAYS',\n      overlaysSelected\n    });\n\n    SummaryReportActions.getMetricData().then();\n  },\n\n  setScale(scaleSelected) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_SCALE',\n      scaleSelected\n    });\n\n    SummaryReportActions.getMetricData().then(() => {\n      SummaryReportActions.getAggregations(); //This force updates the table\n    });\n  },\n\n  toggleFilterPanel(panelId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_TOGGLE_FILTER_PANEL',\n      panelId\n    });\n  },\n\n  toggleAllFilterPanels() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS'\n    });\n  },\n\n  closeAllFilterPanels() {\n    // close panels only if they are open\n    const countOpenedPanels = SummaryReportStore\n      .getState()\n      .get('filterPanels')\n      .reduce((prev, current) => { return prev + (current === true ? 1 : 0); }, 0);\n    if (countOpenedPanels) {\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS'\n      });\n    }\n  },\n\n  getPackageError(err) {\n    Dispatcher.handleViewAction({\n      actionType: 'GET_PACKAGE_ERR',\n      err\n    });\n  },\n\n  loadedPackageNoDataSets(pkg) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_LOADED_PACKAGE_NO_DATA_SETS',\n      pkg\n    });\n  },\n\n  getPackageSuccess(pkg) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_GET_PACKAGE_SUCCESS',\n      pkg,\n      urlParams: ReportViewStore.getUrlParams()\n    });\n    SummaryReportActions.getAnnotations();\n    SummaryReportActions.getAggregations();\n  },\n\n  drill(id) {\n    const athenaState = SummaryReportStore.getState().get('athenaState');\n\n    if (id === '_moreLine') {\n      athenaState.expandMore();\n    } else {\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_DRILL',\n        id\n      });\n      SummaryReportActions.getAggregations();\n    }\n  },\n\n  treeSelect(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_TREE_SELECT',\n      id\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  nodeToggleSelect(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_NODE_TOGGLE_SELECT',\n      id\n    });\n\n    SummaryReportActions.getAggregationsDebounced();\n  },\n\n  nodeExclusiveSelect(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_NODE_EXCLUSIVE_SELECT',\n      id\n    });\n\n    SummaryReportActions.getAggregationsDebounced();\n  },\n\n  changeCurrentYearPeriod(period) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_CHANGE_CURRENT_YEAR_PERIOD',\n      period\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  toggleProration() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_TOGGLE_PRORATION'\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  toggleHighlightingVariance() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_TOGGLE_HIGHLIGHTING_VARIANCE'\n    });\n  },\n\n  setHighlightingVariance(highlightingVariance) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SET_HIGHLIGHTING_VARIANCE',\n      highlightingVariance\n    });\n  },\n\n  toggleProjections() {\n    // store this in athena state because we don't want to persist it to the DB\n    const athenaState = SummaryReportStore.getState().get('athenaState');\n    athenaState.set('projections', !athenaState.get('projections'));\n    /**\n    * Forgive me my coding sins, but we could've done it through athena_state triggering the change.\n    * However, making athena_state to trigger the change is really inefficient way because we store\n    * one state in the other and athena state also triggers URL params change, which triggers tons of other changes.\n    * Have had we done it through the athena_state triggering the change, we would've experienced a really degrading\n    * performance.\n    * Bottom line, we just mirror both projections and projectionType in the summary report store.\n    */\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_MIRROR_PROJECTIONS'\n    });\n    const metadata = {\n      toggled: athenaState.get('projections')\n    };\n    trackIntercomEvent('toggle-projections', metadata);\n  },\n\n  setProjectionType(projectionType) {\n    // store this in athena state because we don't want to persist it to the DB\n    const athenaState = SummaryReportStore.getState().get('athenaState');\n    athenaState.set('projectionType', projectionType);\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_MIRROR_PROJECTION_TYPE'\n    });\n  },\n\n  setFiscalYearRange(range) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE',\n      range\n    });\n  },\n\n  changeCurrentYearAmount(amount) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_CHANGE_CURRENT_YEAR_AMOUNT',\n      amount\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  summaryToggleNode(nodeId) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_TOGGLE_NODE',\n      nodeId\n    });\n    SummaryReportActions.getAggregations(true);\n  },\n\n  summarySetExpandedNodes(nodes, loaded?) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SUMMARY_EXPANDED_NODES',\n      nodes, loaded\n    });\n    if (!loaded) {\n      SummaryReportActions.getAggregations(true);\n    }\n  }\n};\n\nexport default SummaryReportActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/summary_report_actions.ts","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js\n// module id = 31\n// module chunks = 0 1","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js\n// module id = 32\n// module chunks = 0 1","import _ from 'lodash';\nimport moment from 'moment';\n\n/** @class Utils\n    @static */\nconst utils =\n/** @lends Utils */\n  {\n\n/* === General Helpers */\n\n  /** @static */\n    parseValue(val, type, format?) {\n      if (type === 'numeric') {\n        return utils.parseNumber(val);\n      } else if (type === 'monetary') {\n        return utils.parseMonetary(val);\n      } else if (type === 'date') {\n        return utils.parseDate(val, format);\n      } else if (type === 'percent') {\n        return utils.parsePercent(val);\n      }\n      return val;\n    },\n  /** Get formatter used in grid\n      @static */\n    getFormatter(column, locale) {\n      const func = utils.getGridValueFormatter(column, locale);\n      return function(row, cell, value) {\n        return func(value);\n      };\n    },\n  /** Get formatters for grid\n      @static */\n      getGridValueFormatter(column, locale = 'en_US') {\n        let func = utils.formatTextForTable;\n        if (column.type === 'numeric') {\n          func = utils.formatNumber;\n        } else if (column.type === 'monetary') {\n          func = (value) => {\n            return utils.formatMonetary(value);\n          };\n        } else if (column.type === 'date') {\n          func = utils.formatDate(locale);\n        } else if (column.type === 'percent') {\n          func = utils.formatPercent;\n        }\n        return func;\n      },\n  /** Get formatter which can be simply used\n      @static */\n    getSimpleFormatter(column, locale = 'en_US') {\n      let func = utils.formatText;\n      if (column.type === 'numeric') {\n        func = utils.formatNumber;\n      } else if (column.type === 'monetary') {\n        func = (value) => {\n          return utils.formatMonetary(value);\n        };\n      } else if (column.type === 'date') {\n        func = utils.formatDate(locale);\n      } else if (column.type === 'percent') {\n        func = utils.formatPercent;\n      }\n      return func;\n    },\n  /** Get formatter used for inputs\n      @static */\n    getInputFormatter(column, locale?): (value, resolution?) => string {\n      let func = utils.formatText;\n      if (column.type === 'numeric') {\n        func = utils.formatNumber;\n      } else if (column.type === 'monetary') {\n        func = utils.formatFloatNumberComma;\n      } else if (column.type === 'date') {\n        func = utils.formatDateInput(locale);\n      }\n      return func;\n    },\n\n/* === Text related === */\n\n  /** Capitalize string.\n   *  @param {string} str * @return {string} * @static */\n    capitalize(str) {\n      return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n  /** Strips whitespace from beginning and end of a string. */\n    strip(str) {\n      return str.replace(/^\\s+|\\s+$/g, '');\n    },\n  /** @static */\n    formatText(value) {\n      return value;\n    },\n    /** @static */\n    formatTextForTable(value) {\n      if (value == null) {\n        return '';\n      }\n      return (value + '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');\n    },\n  /** @static\n      function to enable future localization\n  */\n    tr(x) {\n      return x;\n    },\n\n/* === Number Related === */\n\n    numberSuffix: {\n      k: 1e3,\n      m: 1e6,\n      mil: 1e6,\n      million: 1e6,\n      b: 1e9,\n      billion: 1e9\n    },\n  /** @static */\n    parseNumber(value) {\n      let matchResult;\n\n      if (value !== null && value !== undefined) {\n      // Allow negative numbers to be presented as numbers wrapped in parens\n        matchResult = value.match(/^\\s*\\((.*)\\)\\s*$/);\n        if (matchResult) {\n          value = '-' + matchResult[1];\n        }\n\n      // Remove thousands delimiters and regex match\n        matchResult = value.replace(/,/g, '').match(/(\\-?[\\d.,]+)\\s*([\\w]*)/);\n        if (matchResult) {\n          return parseFloat(matchResult[1]) * (utils.numberSuffix[matchResult[2].toLowerCase()] || 1);\n        }\n      }\n      return '';\n    },\n  /** @static */\n    formatNumberComma(value) {\n      if (value !== null && value !== undefined) {\n        value = parseInt(value, 10);\n        if (!_.isNaN(value)) {\n          return ('' + value).replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n        }\n      }\n      return '';\n    },\n  /** @static */\n    formatFloatNumberComma(value) {\n      if (value !== null && value !== undefined) {\n        value = parseFloat(value);\n        if (!_.isNaN(value)) {\n          return value.toFixed(2).replace(/(\\d)(?=(\\d{3})+[\\.$])/g, '$1,');\n        }\n      }\n      return '';\n    },\n  /** @static */\n    formatNumber(value) {\n      if (value !== null && value !== undefined) {\n        return '' + value;\n      }\n      return '';\n    },\n\n/* === Money related === */\n\n  /** @static */\n    parseMonetary(x) {\n      return utils.parseNumber(x);\n    },\n  /** @static */\n    translateAccountingFloat(value) {\n      const valStr = Math.abs(value).toFixed(2).replace(/(\\d)(?=(\\d{3})+[\\.$])/g, '$1,');\n      return (value < 0) ? '(' + valStr + ')' : valStr;\n    },\n  /** @static */\n    formatMonetary(value) {\n      if (value !== null && value !== undefined) {\n        value = parseFloat(value);\n        if (!_.isNaN(value)) {\n          return utils.translateAccountingFloat(value);\n        }\n      }\n      return '';\n    },\n\n/* === Date related === */\n\n    // 'L' is the locale version of 'MM/DD/YYYY' for moment\n    DATE_FORMAT: 'L',\n  /** @static */\n    parseDate(x, format?) {\n      const val = format ? moment(x, format) : moment(x);\n      return val.isValid() ? val.format('YYYY-MM-DD') : '';\n    },\n\n    localeDateStringToMoment(dateString, locale) {\n      const m = moment();\n      m.locale(locale);\n      const format = m.localeData().longDateFormat(utils.DATE_FORMAT as any);\n      const localeM = moment(dateString, format, locale);\n\n      return localeM;\n    },\n\n    momentToLocaleDate(m, locale) {\n      const usM = m.clone();\n      usM.locale(locale);\n      return usM.toDate();\n    },\n\n  /** @static */\n    formatDate(locale = 'en_US') {\n      return (value) => {\n        if (value) {\n          const vm = moment(value, 'YYYY-MM-DDTHH:mm:ss.SSS');\n          if (vm.isValid()) {\n            vm.locale(locale);\n            return vm.format(utils.DATE_FORMAT);\n          }\n        }\n        return '';\n      };\n    },\n\n  /** @static */\n    formatDateInput(locale = 'en_US') {\n      return (value, resolution?) => {\n        if (value && !_.isBoolean(value) && value.indexOf('/') !== -1) {\n          resolution = utils.DATE_FORMAT;\n        } else {\n          resolution = resolution || 'YYYY-MM-DD';\n        }\n        if (value) {\n          const vm = moment(value, resolution);\n          if (vm.isValid()) {\n            vm.locale(locale);\n            const d = vm.format(utils.DATE_FORMAT);\n            return d;\n          }\n        }\n        return '';\n      };\n    },\n\n/* === Percent related === */\n\n  /** @static */\n    parsePercent(val) {\n      const matchResult = val.trim().match(/^(\\d*\\.?\\d+)(%?)$/);\n      if (matchResult) {\n        let res = matchResult[1];\n        if (matchResult[2]) {\n          res = res / 100;\n        }\n        return res;\n      }\n      return '';\n    },\n  /** @static */\n    formatPercent(value) {\n      if (value !== null && value !== undefined) {\n        value = parseFloat(value);\n        if (!_.isNaN(value)) {\n          return (value * 100).toFixed(2) + '%';\n        }\n      }\n      return '';\n    },\n\n    stringComparator(a, b) {\n      const aLabel = a.label;\n      const bLabel = b.label;\n\n      return aLabel === bLabel ? 0 : (aLabel < bLabel ? -1 : 1);\n    },\n\n    stringComparatorReverse(a, b) {\n      return -1 * utils.stringComparator(a, b);\n    }\n  };\n\nexport default utils;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/utils.ts","var OgApi = require('./og_api');\nvar retry = require('./retry_middleware');\n\nexports.OgApi = OgApi;\nexports.core = new OgApi(process.env.npm_package_config_ogApi_core || '/api/v1');\nexports.entitydata = new OgApi(process.env.npm_package_config_ogApi_entitydata || '/api/entitydata/v1');\nexports.tapi = new OgApi(process.env.npm_package_config_ogApi_tapi || '/api/transparency/v1');\nexports.trapi = new OgApi(process.env.npm_package_config_ogApi_trapi || '/api/transactions/v1');\n\nexports.get = exports.core.get.bind(exports.core);\nexports.post = exports.core.post.bind(exports.core);\nexports.put = exports.core.put.bind(exports.core);\nexports.del = exports.core.del.bind(exports.core);\n\nexports.core.use(retry());\nexports.tapi.use(retry());\nexports.trapi.use(retry());\n\nmodule.exports = exports;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/og_api/lib/index.js","'use strict';\n\nvar objectAssign = require('object-assign');\n\n// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\nfunction compare(a, b) {\n  if (a === b) {\n    return 0;\n  }\n\n  var x = a.length;\n  var y = b.length;\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i];\n      y = b[i];\n      break;\n    }\n  }\n\n  if (x < y) {\n    return -1;\n  }\n  if (y < x) {\n    return 1;\n  }\n  return 0;\n}\nfunction isBuffer(b) {\n  if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {\n    return global.Buffer.isBuffer(b);\n  }\n  return !!(b != null && b._isBuffer);\n}\n\n// based on node assert, original notice:\n// NB: The URL to the CommonJS spec is kept just for tradition.\n//     node-assert has evolved a lot since then, both in API and behavior.\n\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = require('util/');\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar pSlice = Array.prototype.slice;\nvar functionsHaveNames = (function () {\n  return function foo() {}.name === 'foo';\n}());\nfunction pToString (obj) {\n  return Object.prototype.toString.call(obj);\n}\nfunction isView(arrbuf) {\n  if (isBuffer(arrbuf)) {\n    return false;\n  }\n  if (typeof global.ArrayBuffer !== 'function') {\n    return false;\n  }\n  if (typeof ArrayBuffer.isView === 'function') {\n    return ArrayBuffer.isView(arrbuf);\n  }\n  if (!arrbuf) {\n    return false;\n  }\n  if (arrbuf instanceof DataView) {\n    return true;\n  }\n  if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {\n    return true;\n  }\n  return false;\n}\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\nvar regex = /\\s*function\\s+([^\\(\\s]*)\\s*/;\n// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js\nfunction getName(func) {\n  if (!util.isFunction(func)) {\n    return;\n  }\n  if (functionsHaveNames) {\n    return func.name;\n  }\n  var str = func.toString();\n  var match = str.match(regex);\n  return match && match[1];\n}\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  if (options.message) {\n    this.message = options.message;\n    this.generatedMessage = false;\n  } else {\n    this.message = getMessage(this);\n    this.generatedMessage = true;\n  }\n  var stackStartFunction = options.stackStartFunction || fail;\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  } else {\n    // non v8 browsers so we can have a stacktrace\n    var err = new Error();\n    if (err.stack) {\n      var out = err.stack;\n\n      // try to strip useless frames\n      var fn_name = getName(stackStartFunction);\n      var idx = out.indexOf('\\n' + fn_name);\n      if (idx >= 0) {\n        // once we have located the function frame\n        // we need to strip out everything before it (and its line)\n        var next_line = out.indexOf('\\n', idx + 1);\n        out = out.substring(next_line + 1);\n      }\n\n      this.stack = out;\n    }\n  }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction truncate(s, n) {\n  if (typeof s === 'string') {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\nfunction inspect(something) {\n  if (functionsHaveNames || !util.isFunction(something)) {\n    return util.inspect(something);\n  }\n  var rawname = getName(something);\n  var name = rawname ? ': ' + rawname : '';\n  return '[Function' +  name + ']';\n}\nfunction getMessage(self) {\n  return truncate(inspect(self.actual), 128) + ' ' +\n         self.operator + ' ' +\n         truncate(inspect(self.expected), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n  if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected, strict, memos) {\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n  } else if (isBuffer(actual) && isBuffer(expected)) {\n    return compare(actual, expected) === 0;\n\n  // 7.2. If the expected value is a Date object, the actual value is\n  // equivalent if it is also a Date object that refers to the same time.\n  } else if (util.isDate(actual) && util.isDate(expected)) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3 If the expected value is a RegExp object, the actual value is\n  // equivalent if it is also a RegExp object with the same source and\n  // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n    return actual.source === expected.source &&\n           actual.global === expected.global &&\n           actual.multiline === expected.multiline &&\n           actual.lastIndex === expected.lastIndex &&\n           actual.ignoreCase === expected.ignoreCase;\n\n  // 7.4. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if ((actual === null || typeof actual !== 'object') &&\n             (expected === null || typeof expected !== 'object')) {\n    return strict ? actual === expected : actual == expected;\n\n  // If both values are instances of typed arrays, wrap their underlying\n  // ArrayBuffers in a Buffer each to increase performance\n  // This optimization requires the arrays to have the same type as checked by\n  // Object.prototype.toString (aka pToString). Never perform binary\n  // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their\n  // bit patterns are not identical.\n  } else if (isView(actual) && isView(expected) &&\n             pToString(actual) === pToString(expected) &&\n             !(actual instanceof Float32Array ||\n               actual instanceof Float64Array)) {\n    return compare(new Uint8Array(actual.buffer),\n                   new Uint8Array(expected.buffer)) === 0;\n\n  // 7.5 For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else if (isBuffer(actual) !== isBuffer(expected)) {\n    return false;\n  } else {\n    memos = memos || {actual: [], expected: []};\n\n    var actualIndex = memos.actual.indexOf(actual);\n    if (actualIndex !== -1) {\n      if (actualIndex === memos.expected.indexOf(expected)) {\n        return true;\n      }\n    }\n\n    memos.actual.push(actual);\n    memos.expected.push(expected);\n\n    return objEquiv(actual, expected, strict, memos);\n  }\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b, strict, actualVisitedObjects) {\n  if (a === null || a === undefined || b === null || b === undefined)\n    return false;\n  // if one is a primitive, the other must be same\n  if (util.isPrimitive(a) || util.isPrimitive(b))\n    return a === b;\n  if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))\n    return false;\n  var aIsArgs = isArguments(a);\n  var bIsArgs = isArguments(b);\n  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n    return false;\n  if (aIsArgs) {\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b, strict);\n  }\n  var ka = objectKeys(a);\n  var kb = objectKeys(b);\n  var key, i;\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length !== kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] !== kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))\n      return false;\n  }\n  return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);\n  }\n}\n\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n    return expected.test(actual);\n  }\n\n  try {\n    if (actual instanceof expected) {\n      return true;\n    }\n  } catch (e) {\n    // Ignore.  The instanceof check doesn't work for arrow functions.\n  }\n\n  if (Error.isPrototypeOf(expected)) {\n    return false;\n  }\n\n  return expected.call({}, actual) === true;\n}\n\nfunction _tryBlock(block) {\n  var error;\n  try {\n    block();\n  } catch (e) {\n    error = e;\n  }\n  return error;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (typeof block !== 'function') {\n    throw new TypeError('\"block\" argument must be a function');\n  }\n\n  if (typeof expected === 'string') {\n    message = expected;\n    expected = null;\n  }\n\n  actual = _tryBlock(block);\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail(actual, expected, 'Missing expected exception' + message);\n  }\n\n  var userProvidedMessage = typeof message === 'string';\n  var isUnwantedException = !shouldThrow && util.isError(actual);\n  var isUnexpectedException = !shouldThrow && actual && !expected;\n\n  if ((isUnwantedException &&\n      userProvidedMessage &&\n      expectedException(actual, expected)) ||\n      isUnexpectedException) {\n    fail(actual, expected, 'Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws(true, block, error, message);\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {\n  _throws(false, block, error, message);\n};\n\nassert.ifError = function(err) { if (err) throw err; };\n\n// Expose a strict only variant of assert\nfunction strict(value, message) {\n  if (!value) fail(value, true, message, '==', strict);\n}\nassert.strict = objectAssign(strict, assert, {\n  equal: assert.strictEqual,\n  deepEqual: assert.deepStrictEqual,\n  notEqual: assert.notStrictEqual,\n  notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (hasOwn.call(obj, key)) keys.push(key);\n  }\n  return keys;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/assert/assert.js\n// module id = 35\n// module chunks = 0 1","'use strict';\n\nvar format = require('util').format;\n\nfunction ValidationError(key, value /*, message, ...*/) {\n    this.message = (\n        (key ? key + ': ' : '') +\n        format.apply(format, Array.prototype.slice.call(arguments, 2))\n    );\n\n    if (value !== null && value !== undefined && value.__line__) {\n        this.line = value.__line__;\n    }\n}\n\nmodule.exports = ValidationError;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/error/validation_error.js\n// module id = 36\n// module chunks = 0 1","'use strict';\n\n/**\n * Unlike js/util/browser.js, this code is written with the expectation\n * of a browser environment with a global 'window' object\n * @module browser\n * @private\n */\n\nexports.window = window;\n\n/**\n * Provides a function that outputs milliseconds: either performance.now()\n * or a fallback to Date.now()\n */\nmodule.exports.now = (function() {\n    if (window.performance &&\n        window.performance.now) {\n        return window.performance.now.bind(window.performance);\n    } else {\n        return Date.now.bind(Date);\n    }\n}());\n\nvar frame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n    return frame(fn);\n};\n\nvar cancel = window.cancelAnimationFrame ||\n    window.mozCancelAnimationFrame ||\n    window.webkitCancelAnimationFrame ||\n    window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n    cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n    if (!dur) {\n        fn.call(ctx, 1);\n        return null;\n    }\n\n    var abort = false,\n        start = module.exports.now();\n\n    function tick(now) {\n        if (abort) return;\n        now = module.exports.now();\n\n        if (now >= start + dur) {\n            fn.call(ctx, 1);\n        } else {\n            fn.call(ctx, (now - start) / dur);\n            exports.frame(tick);\n        }\n    }\n\n    exports.frame(tick);\n\n    return function() { abort = true; };\n};\n\n/**\n * Test if the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer would be used)\n * @return {boolean}\n */\nexports.supported = require('mapbox-gl-supported');\n\nexports.hardwareConcurrency = navigator.hardwareConcurrency || 4;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n    get: function() { return window.devicePixelRatio; }\n});\n\nexports.supportsWebp = false;\n\nvar webpImgTest = document.createElement('img');\nwebpImgTest.onload = function() {\n    exports.supportsWebp = true;\n};\nwebpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n\nexports.supportsGeolocation = !!navigator.geolocation;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/browser/browser.js\n// module id = 37\n// module chunks = 0 1","// Summary Report ~= GL Report ¯\\_(ツ)_/¯\n\nimport _ from 'lodash';\n\nimport { ImmutableStore } from '@opengov/og_flux';\nimport { fromJS, List } from 'immutable';\n\nimport BudgetData from '../budget_data';\nimport Report from '../models/report';\nimport ReportViewStore from './report_view_store';\nimport AthenaState from '../athena_state';\nimport convertUUID from '../utils/uuid_converter';\nimport strings from '../strings';\nimport {currentLimits, scaleLimit} from '../metric_data_constants';\nimport SummaryReportActions from '../actions/summary_report_actions';\nimport { numberTypes, accountTypeAndLocaleToNumberType } from '../numberTypes';\nimport { getEmbedType } from '../utils/embed_utils';\n\nfunction initialState() {\n  return fromJS({\n    standalone: gon.standalone,\n\n    initialized: false,\n    loading: true,\n    graphLoading: true,\n    rebuilding: false,\n\n    breakdown: '',\n    versusView: null,\n    embed: getEmbedType(),\n    isAnnotationsPanelOpen: false,\n    mask: (window as any).gon.mask,\n    expandedNodes: {},\n    graphSize: { width: 1000, height: 500 },\n    yAxisScale: null,\n    reportAmountType: numberTypes.dollar,\n    locale: 'en_US',\n    scales: {\n      actualValue: {\n        name: 'Actual Value',\n        description: 'No scaling applied'\n      },\n      perCapita: {\n        name: 'Per Capita',\n        description: 'Amounts scaled to dollars per person',\n        type: 'numeric',\n        value: null\n      },\n      inThousands: {\n        name: 'in Thousands',\n        description: 'Amounts scaled to thousands of dollars',\n        type: 'monetary',\n        value: 1e3\n      },\n      inMillions: {\n        name: 'in Millions',\n        description: 'Amounts scaled to millions of dollars',\n        type: 'monetary',\n        value: 1e6\n      }\n    },\n\n    metricData: {\n      data: {}\n    },\n    overlay: {\n      selected: [null],\n      available: [{none: {metric_type: null, name: 'None'} }],\n      overlayCompatibleCharts: ['line', 'bar', 'stacked']\n    },\n    scale: {\n      selected: [null],\n      available: [{none: {metric_type: null, name: 'None'} }]\n    },\n\n    filterPanels: {},\n\n    currentYearPeriod: 'years',\n    currentYearAmount: 'cumulative',\n\n    year: 0,\n    month: 0,\n    months: [],\n    years: [],\n    fiscalYearRange: [0, Infinity],\n\n    urlState: {\n      embed: getEmbedType()\n    }\n  });\n}\n\nconst SummaryReportStore = new ImmutableStore({\n  getInitialState() {\n    return initialState();\n  },\n\n  /**\n  * This function is called from:\n  * 1) summary_graph.hasDataSets\n  * 2) share_links.\n  * 3) summary_report.handleRenderData\n  * 4) summary_table.getViewData\n  * 5) download_menu.tableHeader\n  * wow, so many places call this function to get the same result.\n  * TODO: we should optimize these calls so that when data is rendered once, it stays in the state\n  * everybody who needs this data, gets it. Once we change any params, we re-render/re-calculate the data\n  * and update the state again.\n  */\n  getRenderedDataSets() {\n    const state = this.getState();\n    const athenaState = state.get('athenaState');\n    const budgetData = state.get('budgetData');\n    const entity = athenaState.get('entity');\n\n    return budgetData.renderedDataSets(\n      this.getState(),\n      entity.fiscal_year_start_month\n    );\n  },\n\n  getRenderedData(limit, expand) {\n    const state = this.getState()\n      .set('amountUnit', this.getAmountUnit()); // We need to inject the amount unit being used here for budget data to the right precision for amount values.\n\n    const athenaState = state.get('athenaState');\n    const entity = athenaState.get('entity');\n\n    return athenaState.renderedData(\n      state,\n      entity.fiscal_year_start_month,\n      !limit,\n      limit,\n      expand);\n  },\n\n  getVersusViews() {\n    const budgetData = this.getState().get('budgetData');\n    if (!budgetData) return List();\n    const visibleAccounts = _.keyBy(budgetData.visibleAccounts, 'id');\n    return strings.versusViewsStrings().filter((view) => view.get('trees').every((tree) => visibleAccounts[tree]));\n  },\n\n  // deprecated\n  getAmountType() {\n    return this.getReportAmountType().isCurrency ? 'currency' : 'float';\n  },\n\n  getReportAmountType() {\n    return this.getState().get('reportAmountType');\n  },\n\n  // deprecated\n  getAmountUnit() {\n    return this.getState().get('reportAmountType').get('symbol');\n  },\n\n  getFilterPanels() {\n    const filterPanels = this.getState().get('filterPanels');\n    const budgetData = this.getState().get('budgetData');\n    if (!budgetData) {\n      return List();\n    }\n    return fromJS(budgetData.breakdowns.map((breakdown) => {\n      const id = breakdown.get('id');\n      const tree = budgetData.trees[breakdown.id];\n      const visible = (breakdown.id === 'types' || tree.visible) && breakdown.get('visible');\n      return {id, name: breakdown.get('name'), visible, isOpen: filterPanels.get(id)};\n    }));\n  },\n\n  /**\n  * NOTE: remember to do a snake style property names here because we are persisting it into Rails\n  */\n  generateSummaryReportState() {\n    const state = this.getState();\n    const athenaState = state.get('athenaState');\n    const budgetData = state.get('budgetData');\n\n    const breakdown = budgetData.breakdowns.get(state.get('breakdown'));\n    const fiscalYearRangeStart = state.getIn(['fiscalYearRange', 0]);\n    const fiscalYearRangeEnd = state.getIn(['fiscalYearRange', 1]);\n\n    let changingProps = {\n      breakdown_id: breakdown && breakdown.toHash(),\n      ledger: state.getIn(['versusView', 'id']) || state.get('accountType'),\n      graph: athenaState.get('graphType'),\n      selection: athenaState.get('selection'),\n      sort_order: athenaState.get('legendSort'),\n      current_year_period: state.get('currentYearPeriod'),\n      current_year_amount: state.get('currentYearAmount'),\n      proration: state.get('proration'),\n      projections: athenaState.get('projections'),\n      projection_type: athenaState.get('projectionType'),\n      highlighting: state.get('highlighting'),\n      highlighting_variance: state.get('highlightingVariance'),\n      fiscal_year_range: {\n        start: fiscalYearRangeStart === state.get('minYear') ? 'earliest' : fiscalYearRangeStart,\n        end: fiscalYearRangeEnd === state.get('maxYear') ? 'latest' : fiscalYearRangeEnd\n      },\n      saved_view: athenaState.get('saved_view'),\n      selected_data_set_index : athenaState.get('selectedDataSetIndex'),\n      // These state of these properties is not persisted to the URL by\n      // the component so we must saved them manually in the saved view.\n      scale: {\n        // toJS because `selected` is an array\n        selected: state.getIn(['scale', 'selected']).toJS()\n      },\n      y_axis_scale: state.get('yAxisScale') && state.get('yAxisScale').toJS(),\n      month: null,\n      year: null\n    };\n\n    // if we are in current year report, we should push month and year\n    // whatever we push here, is saved into the current saved view.\n    if (athenaState.get('report').get('technical_name') === 'ytd') {\n      // we push month only if it's not the last actual month\n      if (state.get('month') !== state.get('latestRange').get('month')) {\n        changingProps.month = state.get('month');\n      }\n      // we push year only if it's not the last year for the available actuals. I.e. if a user\n      // selected different year\n      if (state.get('year') !== state.get('latestRange').get('year')) {\n        changingProps.year = state.get('year');\n      }\n    }\n\n    return changingProps;\n  },\n\n  hashState() {\n    const state = this.getState();\n    const athenaState = state.get('athenaState');\n    const budgetData = state.get('budgetData');\n    const year = state.get('year');\n\n    if (!budgetData) {\n      return {};\n    }\n\n    const accountType = state.getIn(['versusView', 'id']) || state.get('accountType');\n\n    const breakdown = budgetData.breakdowns.get(state.get('breakdown'));\n\n    const hash = {\n      accountType,\n      embed: getEmbedType(),\n      breakdown: breakdown && breakdown.toHash(),\n      currentYearAmount: state.get('currentYearAmount'),\n      currentYearPeriod: state.get('currentYearPeriod'),\n      graph: athenaState.get('graphType'),\n      legendSort: athenaState.get('legendSort'),\n      month: state.get('month'),\n      proration: state.get('proration'),\n      saved_view: athenaState.get('saved_view'),\n      selection: athenaState.get('selection'),\n      projections: null,\n      projectionType: null,\n      highlighting: null,\n      highlightingVariance: null,\n      // To prevent an invalid fiscal year message\n      year,\n      selectedDataSetIndex: null,\n      fiscal_start: null,\n      fiscal_end: null\n    };\n\n    if (athenaState.get('projections')) {\n      hash.projections = athenaState.get('projections');\n      hash.projectionType = athenaState.get('projectionType');\n    }\n\n    if (state.get('highlighting')) {\n      hash.highlighting = state.get('highlighting');\n      hash.highlightingVariance = state.get('highlightingVariance');\n    }\n\n    if (hash.graph === 'pie') {\n      let defaultSelectedDataSetIndex = state.get('months').size;\n      if (hash.currentYearPeriod === 'years') {\n        defaultSelectedDataSetIndex = state.get('years').size;\n      }\n      hash.selectedDataSetIndex = athenaState.get('selectedDataSetIndex') || defaultSelectedDataSetIndex;\n    }\n\n    const fiscalYearRangeStart = state.getIn(['fiscalYearRange', 0]);\n    const fiscalYearRangeEnd = state.getIn(['fiscalYearRange', 1]);\n    /**\n    * wow, we never respected what current fiscal_start we had in the state.\n    */\n    hash.fiscal_start = fiscalYearRangeStart === state.get('minYear') ? 'earliest' : fiscalYearRangeStart;\n    hash.fiscal_end = fiscalYearRangeEnd === state.get('maxYear') ? 'latest' : fiscalYearRangeEnd;\n\n    return hash;\n  },\n\n  getDataError() {\n    const state = SummaryReportStore.getState();\n    const budgetData = state.get('budgetData');\n\n    const reportDataSets = ReportViewStore.getReportDataSets();\n    const hasMonthlyDataSets = reportDataSets && reportDataSets.some(dataSet => dataSet.get('month') !== null);\n    if (ReportViewStore.isMonthlyReport() && !hasMonthlyDataSets) {\n      return 'DATA_ERROR_NO_MONTHLY_DATA_SETS';\n    }\n\n    const { trees } = budgetData;\n    if (ReportViewStore.isBalanceSheetReport() && (!trees.assets && !trees.liabilities)) {\n      return 'DATA_ERROR_MISSING_BALANCE_SHEET_TREES';\n    }\n\n    const renderedDataSets = SummaryReportStore.getRenderedDataSets();\n    if (_.isEmpty(renderedDataSets)) {\n      return 'DATA_ERROR_NO_RENDERED_DATA_SETS';\n    }\n  },\n\n  actions: {\n\n    REPORT_STATE_RESET(state) {\n      const initialState = state.get('initialState');\n      /*\n          [aykutsimseks]\n          This is a quick and non-elegant fix for back & reset button behavior (GRA-410).\n          The root cause of the issue was, accoutType is expected to be \"types\" for \"revenuesVersusExpenses\" and \"balanceSheet\" type reports.\n          This requires us handling those cases back and forth seperately all over the code base, and needs further investigation for a permanent fix.\n\n          See also: REPORT_GO_BACK\n       */\n      if (initialState.accountType == 'revenuesVersusExpenses' || initialState.accountType == 'balanceSheet') {\n        initialState.accountType = 'types';\n      }\n\n      const athenaState = state.get('athenaState');\n      athenaState.changeState(initialState);\n\n      const report = athenaState.report;\n      const locale = report ? report.get('locale') : initialState.get('locale');\n      const reportAmountType = accountTypeAndLocaleToNumberType(state.get('accountType'), locale);\n      const mappedParams = mapUrlParamsToState(state, initialState);\n      const replaceState = mappedParams.merge(initialState, reportAmountType, fromJS({ locale: locale }));\n\n      return state.merge(replaceState);\n    },\n\n    UPDATE_GRAPH_LOADING_STATUS(state, { status }) {\n      return state.set('graphLoading', status);\n    },\n\n    REPORT_SET_INITIAL_STATE(state, action) {\n      return state.set('initialState', action.initialState);\n    },\n\n    REPORT_TOGGLE_PRORATION(state) {\n      return state.set('proration', !state.get('proration'));\n    },\n\n    REPORT_MIRROR_PROJECTIONS(state) {\n      return state.set('projections', state.get('athenaState').get('projections'));\n    },\n\n    REPORT_MIRROR_PROJECTION_TYPE(state) {\n      return state.set('projectionType', state.get('athenaState').get('projectionType'));\n    },\n\n    REPORT_TOGGLE_HIGHLIGHTING_VARIANCE(state) {\n      return state.set('highlighting', !state.get('highlighting'));\n    },\n\n    REPORT_SET_HIGHLIGHTING_VARIANCE(state, action) {\n      return state.set('highlightingVariance', parseInt(action.highlightingVariance));\n    },\n\n    /**\n    * fired up from summary_report_actions.goBack\n    */\n    REPORT_GO_BACK(state, action) {\n      /*\n          [aykutsimseks]\n          This is a quick and non-elegant fix for back & reset button behavior (GRA-410).\n          The root cause of the issue was, accoutType is expected to be \"types\" for \"revenuesVersusExpenses\" and \"balanceSheet\" reports.\n          This requires us handling those cases back and forth seperately all over the code base, and needs further investigation for a permanent fix.\n\n          See also: REPORT_STATE_RESET\n       */\n      let previousState = fromJS(action.previousState);\n      if (previousState.get('accountType') == 'revenuesVersusExpenses' || previousState.get('accountType') == 'balanceSheet') {\n        previousState = previousState.set('accountType', 'types');\n      }\n      return state.merge(previousState);\n    },\n\n    REPORT_GET_AGGREGATIONS_SUCCESS(state, action) {\n      const budgetData = state.get('budgetData');\n\n      if (action.aggregations.checked_nodes) {\n        budgetData.deselectAll();\n        budgetData.selectNodes(action.aggregations.checked_nodes);\n      }\n\n      const activeAnnotations = budgetData.filterActiveAnnotations(\n          state,\n          state.get('breakdown'));\n\n      return state.mergeDeep(fromJS({\n        loading: false,\n        reportAmountType: generateReportAmountType(state.get('accountType')),\n        isAnnotationsPanelOpen: activeAnnotations.length ? state.get('isAnnotationsPanelOpen') : false\n      }));\n    },\n\n    REPORT_GET_ANNOTATIONS_SUCCESS(state, {annotations}) {\n      const budgetData = state.get('budgetData');\n      const nextState = state.set('annotations', annotations);\n\n      budgetData.filterActiveAnnotations(\n        nextState,\n        nextState.get('breakdown'));\n\n      return nextState;\n    },\n\n    SAVED_VIEW_SELECTED(state, {savedView}) {\n      const yAxisScale = state.get('yAxisScale');\n      const savedViewYAxisScale = _.get(savedView, 'view_state.y_axis_scale');\n      if (!!yAxisScale !== !!savedViewYAxisScale) {\n        _.defer(() => {\n          SummaryReportActions.togglePerCapitaScale(true);\n        });\n      }\n    },\n\n    REPORT_SUMMARY_SET_FISCAL_YEAR_RANGE(state, {range}) {\n      return state.set('fiscalYearRange', List([\n        parseInt(range[0]) || state.get('minYear'),\n        parseInt(range[1]) || state.get('maxYear')]));\n    },\n\n    REPORT_GET_PACKAGE(state, {payloadEntity}) {\n      const reportData = ReportViewStore.getRenderedReport().toJS();\n      const report = new Report(reportData);\n      report.parse(reportData);\n      const entity = ReportViewStore.getReportEntity().toJS();\n\n      const athenaState = new AthenaState({\n        report,\n        entity: payloadEntity || entity\n      });\n\n      const storedInitialState = state.get('initialState') || null;\n      const locale = report.get('locale');\n      const reportAmountType = accountTypeAndLocaleToNumberType(state.get('accountType'), locale);\n\n      return initialState()\n        .set('athenaState', athenaState)\n        .set('reportAmountType', reportAmountType)\n        .set('locale', locale)\n        .set('reportType', (reportData as any).report_type)\n        .set('loading', true)\n        .set('graphLoading', true)\n        .set('initialized', false)\n        .set('isAnnotationsPanelOpen', false)\n        .set('yAxisScale', state.get('yAxisScale'))\n        .set('initialState', storedInitialState);\n    },\n\n    REPORT_GET_PACKAGE_SUCCESS(state, {pkg, urlParams}) {\n      const athenaState = state.get('athenaState');\n      const report = athenaState.get('report');\n      const entity = athenaState.get('entity');\n\n      const years = _(pkg.data_sets)\n                      .map('year')\n                      .sort()\n                      .uniq()\n                      .map((i: any) => parseInt(i))\n                      .value();\n\n      const minYear = _.min(years);\n      const maxYear = _.max(years);\n\n      const shouldShowAllMonths = report.get('report_type') === 'ytd' && state.get('currentYearPeriod') === 'years';\n      const months = shouldShowAllMonths ?\n        monthsWithActuals(\n          pkg.data_sets,\n          entity.fiscal_year_start_month\n        ) :\n        mostRecentMonthsWithActuals(\n                          pkg.data_sets,\n                          entity.fiscal_year_start_month);\n\n      const nodesForLinkage = pkg.nodes_for_linkage;\n      const masksForLinkage = pkg.masks_for_linkage;\n\n      const budgetData = new BudgetData({\n        entity: athenaState.get('entity'),\n        report: athenaState.get('report'),\n        pkg,\n        mask: state.get('mask'),\n        store: SummaryReportStore\n      });\n      athenaState.initBudgetData(budgetData);\n\n      const filterPanels = budgetData.breakdowns.reduce((panels, breakdown) => {\n        return {...panels, [breakdown.get('id')]: false};\n      }, {});\n\n      const newState = state\n        .mergeDeep(fromJS({\n          years,\n          minYear,\n          maxYear,\n          months,\n          filterPanels\n        }))\n        .mergeDeep({\n          budgetData,\n          pkg,\n          nodesForLinkage,\n          masksForLinkage\n        });\n\n      const urlState = mapUrlParamsToState(newState, urlParams);\n\n      let month = urlState.get('month') !== 'latest' && urlState.get('month');\n      month = (!!~months.indexOf(month) && month) || (shouldShowAllMonths ?\n        mostRecentMonthWithActuals(pkg.data_sets, entity.fiscal_year_start_month) :\n        _.last(months));\n\n      const selectedYear = (urlState.get('year') !== 'latest' && urlState.get('year')) || mostRecentYearWithMonthlyActuals(pkg.data_sets);\n\n      const defaultState: any = getDefaultState(newState, report.get('properties'));\n      const { fiscalYearRange, year: defaultYear } = defaultState;\n      const defaultFiscal = getFiscalYearRange(fiscalYearRange);\n\n      const urlFiscalStart = urlState.getIn(['fiscalYearRange', 0]) || null;\n      const urlFiscalEnd = urlState.getIn(['fiscalYearRange', 1]) || null;\n\n      const lastYearWithMonthlyActuals = mostRecentYearWithMonthlyActuals(pkg.data_sets);\n      const lastMonthOfLastYearWithMonthlyActuals = _.last(monthsWithActuals(pkg.data_sets, entity.fiscal_year_start_month, [lastYearWithMonthlyActuals]));\n\n      const fiscalYearStart = urlFiscalStart || defaultFiscal.fiscalStart || minYear;\n      const fiscalYearEnd = urlFiscalEnd || defaultFiscal.fiscalEnd || maxYear;\n      const startState = newState.mergeDeep(fromJS(defaultState)).mergeDeep(fromJS(urlState)).mergeDeep(fromJS({\n        latestRange: {\n          month: lastMonthOfLastYearWithMonthlyActuals,\n          year: lastYearWithMonthlyActuals\n        },\n        year: state.get('year') || selectedYear || defaultYear,\n        month: state.get('month') || month,\n        rebuilding: pkg.rebuilding\n      }))\n      .set('fiscalYearRange', List([\n        fiscalYearStart < minYear ? minYear : fiscalYearStart,\n        fiscalYearEnd > maxYear ? maxYear : fiscalYearEnd\n      ]))\n\n      return startState;\n    },\n\n    REPORT_SUMMARY_TOGGLE_ALL_FILTER_PANELS(state) {\n      const filterPanels = state.get('filterPanels');\n      const isOpen = filterPanels.every(isOpen => isOpen);\n\n      return state.update('filterPanels', filterPanels => filterPanels.map(() => !isOpen));\n    },\n\n    REPORT_SUMMARY_TOGGLE_FILTER_PANEL(state, {panelId}) {\n      return state.updateIn(['filterPanels', panelId], isOpen => !isOpen);\n    },\n\n    REPORT_SUMMARY_CLOSE_ALL_FILTER_PANELS(state) {\n      return state.update('filterPanels', filterPanels => filterPanels.map(() => false));\n    },\n\n    REPORT_VIEW_OPEN_ANNOTATIONS_PANEL(state) {\n      return state.set('isAnnotationsPanelOpen', true);\n    },\n\n    REPORT_VIEW_CLOSE_ANNOTATIONS_PANEL(state) {\n      return state.set('isAnnotationsPanelOpen', false);\n    },\n\n    REPORT_SUMMARY_TOGGLE_NODE(state, action) {\n      const path = ['expandedNodes', action.nodeId];\n\n      if (state.getIn(path)) {\n        return state.removeIn(path);\n      } else {\n        return state.setIn(path, 'pending');\n      }\n    },\n\n    REPORT_GRAPH_RESIZE(state, action) {\n      return state\n        .setIn(['graphSize', 'width'], action.width)\n        .setIn(['graphSize', 'height'], action.height);\n    },\n\n    REPORT_TOGGLE_PER_CAPITA_SCALE(state) {\n      const perCapita = state.getIn(['scales', 'perCapita']);\n\n      if (state.getIn(['scale', 'selected', 0]) === 'population') {\n        return state.set('yAxisScale', null)\n          .setIn(['scale', 'selected'], fromJS([null]));\n      }\n      return state.setIn(['scale', 'selected'], fromJS(['population']))\n        .set('yAxisScale', perCapita);\n    },\n\n    REPORT_SUMMARY_EXPANDED_NODES(state, action) {\n      if (_.isArray(action.nodes)) {\n        action.nodes = _.zipObject(action.nodes, _.map(action.nodes, () => action.loaded ? 'expanded' : 'pendingAll'));\n      } else if (action.nodes == null) {\n        action.nodes = {};\n      }\n      return state.set('expandedNodes', fromJS(action.nodes));\n    },\n\n    REPORT_SET_BREAKDOWN(state, action) {\n      const athenaState = state.get('athenaState');\n      athenaState.set('breakdown', action.breakdownId);\n      return state.set('breakdown', action.breakdownId);\n    },\n\n    REPORT_SET_ACCOUNT_TYPE(state, action) {\n      return state.set('accountType', action.accountTypeId).set('versusView', null).set('reportAmountType', generateReportAmountType(action.accountTypeId));\n    },\n\n    REPORT_SET_VERSUS_VIEW(state, action) {\n      const versusView = strings.versusViewsStrings().find((view) => view.get('id') === action.versusViewId);\n      return state\n        .set('versusView', versusView)\n        .set('accountType', 'types')\n        .set('breakdown', 'types');\n    },\n\n    REPORT_SET_MONTH(state, action) {\n      const athenaState = state.get('athenaState');\n      athenaState.set('month', action.month);\n      return state.set('month', action.month);\n    },\n\n    REPORT_SET_YEAR(state, action) {\n      return state.set('year', action.year);\n    },\n\n    REPORT_SET_OVERLAYS(state, action) {\n      const selected = action.overlaysSelected;\n      const overlays = _.isArray(selected) ? selected : [selected];\n      return state.setIn(['overlay', 'selected'], fromJS(overlays));\n    },\n\n    REPORT_SET_SCALE(state, action) {\n      const selected = action.scaleSelected;\n      const scale = _.isArray(selected) ? selected : [selected];\n      if (_.isNull(scale[0])) {\n        return state.setIn(['scale', 'selected'], fromJS([null])).set('yAxisScale', null);\n      }\n      return state.setIn(['scale', 'selected'], fromJS(scale));\n    },\n\n    REPORT_SET_METRIC_DATA(state, action) {\n      _.forEach(action.metricData, (metric) => {\n        strings.centsToDollars(metric, metric.years);\n      });\n      return state.mergeDeepIn(['metricData', 'data'], fromJS(action.metricData));\n    },\n\n    REPORT_SET_METRICS_AVAILABLE(state, action) {\n      if (_.isUndefined(action.metricsAvailable)) {\n        return SummaryReportStore.actions.REPORT_METRICS_UNAVAILABLE(state);\n      } else {\n        //Currently the amount of metrics are limited\n        const metricsSorted = _.sortBy(action.metricsAvailable, (metric: any) => {\n          if (metric.metric_type === 'population') {\n            metric.name += ' (as reported by the US Census Bureau)';\n          }\n          if (metric.metric_type === 'population_served') {\n            metric.name = 'Current Population (' + strings.currencyNoDollar((_.head(metric.years) as any).value) + ' residents)';\n          }\n          return metric.name;\n        });\n        const metricsAllowed = _.filter(metricsSorted, (metric) => _.includes(currentLimits, metric.metric_type) && metric.units !== '%');\n        metricsAllowed.unshift({ metric_type: null, name: 'None' });\n        const scalesAllowed = _.filter(metricsSorted, (metric) => _.includes(scaleLimit, metric.metric_type));\n        scalesAllowed.unshift({ metric_type: null, name: 'None' });\n\n        return state.setIn(['overlay', 'available'], fromJS(metricsAllowed))\n          .setIn(['scale', 'available'], fromJS(scalesAllowed));\n      }\n    },\n\n    REPORT_METRICS_UNAVAILABLE(state) {\n      const unavailable = [{metric_type: null, name: 'Unavailable'}];\n      return state.setIn(['overlay', 'available'], fromJS(unavailable))\n        .setIn(['scale', 'available'], fromJS(unavailable));\n    },\n\n    REPORT_DRILL(state, {id}) {\n      const budgetData = state.get('budgetData');\n\n      if (id === '_moreLine') {\n        return state;\n      }\n\n      if (state.get('accountType') === 'types') {\n        const node = budgetData.nodes[id];\n        const accountType = (node && node.aggregationGroup) || id;\n        return state.set('accountType', accountType).set('versusView', null);\n      }\n\n      budgetData.exclusiveSelect(id);\n    },\n\n    REPORT_NODE_TOGGLE_SELECT(state, action) {\n      const budgetData = state.get('budgetData');\n      budgetData.toggleSelect(action.id);\n    },\n\n    REPORT_NODE_EXCLUSIVE_SELECT(state, action) {\n      const budgetData = state.get('budgetData');\n      budgetData.exclusiveSelect(action.id);\n    },\n\n    REPORT_TREE_SELECT(state, action) {\n      const budgetData = state.get('budgetData');\n      budgetData.treeSelect(action.id);\n    },\n\n    REPORT_CHANGE_CURRENT_YEAR_PERIOD(state, action) {\n      let nextState = state;\n\n      // Proration is disabled when viewing months over months cumulatively\n      if (nextState.get('currentYearAmount') === 'cumulative' && action.period === 'months') {\n        nextState = nextState.set('proration', false);\n      }\n\n      // Projections are disabled when viewing yearly data\n      if (action.period === 'years') {\n        nextState = nextState.set('projections', false);\n      }\n\n      return nextState.set('currentYearPeriod', action.period);\n    },\n\n    REPORT_CHANGE_CURRENT_YEAR_AMOUNT(state, action) {\n      let nextState = state;\n\n      // Proration is disabled when viewing months over months cumulatively\n      if (nextState.get('currentYearPeriod') === 'months' && action.amount === 'cumulative') {\n        nextState = nextState.set('proration', false);\n      }\n\n      return nextState.set('currentYearAmount', action.amount);\n    },\n\n    /**\n    * basically we rely on URL params for the state\n    * This action is called from:\n    * 1) report_view.willTransitionTo\n    */\n    REPORT_UPDATE_URL_PARAMS(state, action) {\n      const urlState = mapUrlParamsToState(state, action.params);\n      return state.merge(urlState);\n    }\n  }\n});\n\nfunction monthsWithActuals(dataSets, fiscalYearStartMonth, years = null) {\n  years = years || yearsWithMonthlyActuals(dataSets);\n  const months = _(dataSets)\n    .filter((ds) => {\n      return ds.month && years.indexOf(parseInt(ds.year)) >= 0 && ds.type === 'actual';\n    })\n    .map('month')\n    .map((i: any) => parseInt(i))\n    .uniq()\n    .sortBy((month) => monthAsFiscalYearOffset(month, fiscalYearStartMonth))\n    .value();\n\n  return months;\n}\n\n//This gets the last month that has actual data\nfunction mostRecentMonthWithActuals(dataSets, fiscalYearStartMonth) {\n  return _.last(mostRecentMonthsWithActuals(dataSets, fiscalYearStartMonth));\n}\n\nfunction mostRecentMonthsWithActuals(dataSets, fiscalYearStartMonth) {\n  const year = mostRecentYearWithMonthlyActuals(dataSets);\n\n  return monthsWithActuals(dataSets, fiscalYearStartMonth, [year]);\n}\n\nfunction yearsWithMonthlyActuals(dataSets) {\n  return _.reduce(dataSets, (years, ds: any) => {\n    if (ds.month && ds.type === 'actual') {\n      years.push(ds.year);\n    }\n    return years;\n  }, []);\n}\n\nfunction mostRecentYearWithMonthlyActuals(dataSets) {\n  const years = yearsWithMonthlyActuals(dataSets);\n\n  // Added safety here because if years === [] this will return NaN\n  if (years && years.length > 0) {\n    return parseInt(_.max(years));\n  }\n\n  return null;\n}\n\nfunction monthAsFiscalYearOffset(month, fiscalYearStartMonth) {\n  if (!fiscalYearStartMonth) {\n    throw new Error('Cannot calculate month as of fiscal year without fiscal year start month');\n  }\n  return (12 + month - fiscalYearStartMonth) % 12 + 1;\n}\n\nfunction generateReportAmountType(accountType) {\n  return accountTypeAndLocaleToNumberType(accountType, ReportViewStore.getRenderedReport().get('locale'));\n}\n\nfunction getDefaultState(state, props) {\n  const defaults: any = {};\n  const budgetData = state.get('budgetData');\n\n  if (props.fiscal_year_range) {\n    defaults.fiscalYearRange = validFiscalYearRange(\n      state,\n      [props.fiscal_year_range.start, props.fiscal_year_range.end]);\n  } else {\n    defaults.fiscalYearRange = [state.get('minYear'), state.get('maxYear')];\n  }\n\n  defaults.currentYearPeriod = validCurrentYearPeriod(props.current_year_period);\n  defaults.currentYearAmount = validCurrentYearAmount(props.current_year_amount);\n  defaults.year = validYear(state, props.year);\n  defaults.month = validMonth(state, props.month);\n\n  const accountType = state.get('accountType') || props.ledger;\n  if (!accountType || accountType === 'types') {\n    const visibleAccounts = _.keyBy(budgetData.visibleAccounts, 'id');\n    defaults.versusView = strings.versusViewsStrings().find((view) => {\n      return view.get('trees').every((tree) => visibleAccounts[tree]);\n    });\n\n  } else {\n    defaults.versusView = strings.versusViewsStrings().find((view) => view.get('id') === accountType);\n  }\n\n  if (defaults.versusView) {\n    defaults.accountType = 'types';\n    defaults.breakdown = 'types';\n  } else {\n    defaults.accountType = accountType || _.result(_.head(budgetData.visibleAccounts), 'id');\n    defaults.breakdown = convertUUID(props.breakdown_id) || 'types';\n  }\n\n  defaults.reportAmountType = generateReportAmountType(defaults.accountType);\n\n  const intialState = SummaryReportStore.getInitialState().toJS();\n  defaults.metricData = intialState.metricData;\n  defaults.overlay = intialState.overlay;\n  defaults.scale = intialState.scale;\n\n  // if proration setting is intentionally disabled use that, otherwise enabled by default\n  defaults.proration = props.proration === false ? false : true;\n  defaults.projections = (props.projections === true);\n  defaults.projectionType = props.projection_type || 'auto_year_avg';\n  defaults.highlighting = (props.highlighting === true);\n  defaults.highlightingVariance = ~ ~ props.highlighting_variance || 10;\n\n  return defaults;\n}\n\nfunction validCurrentYearPeriod(period) {\n  return _.includes(['months', 'years'], period) ? period : 'years';\n}\n\nfunction validCurrentYearAmount(amount) {\n  return _.includes(['cumulative', 'monthly'], amount) ? amount : 'cumulative';\n}\n\nfunction validMonth(state, month) {\n  const months = state.get('months').toArray();\n  return _.includes(months, month) ? month : _.last(months);\n}\n\nfunction validYear(state, year) {\n  const years = state.get('years').toArray();\n  return _.includes(years, year) ? year : _.last(years);\n}\n\nfunction getFiscalYearRange(range) {\n  if (range && range[0] && range[1]) {\n    return { fiscalStart: range[0], fiscalEnd: range[1] };\n  }\n\n  return { fiscalStart: null, fiscalEnd: null };\n}\n\nfunction validFiscalYearRange(state, range) {\n  const iStart = parseInt(range[0]);\n  const iEnd = parseInt(range[1]);\n  const minYear = state.get('minYear');\n  const maxYear = state.get('maxYear');\n\n  const start = inRange(iStart, minYear, maxYear + 1) ? iStart : minYear;\n  const end = inRange(iEnd, minYear, maxYear + 1) ? iEnd : maxYear;\n\n  return [start < end ? start : end, end];\n}\n\nfunction inRange(n, low, high) {\n  return n >= low && n < high;\n}\n\n/**\n* year and month URL params might have 'latest' value, which will translate into the latest\n* present actuals in datasets.\n* NOTE: we don't want to return NaN\n*/\nexport const parseDateParams = function parseDataParams(state, paramValue, paramName) {\n  if (paramValue && paramValue === 'latest' && state.get('latestRange')) {\n    return state.get('latestRange').get(paramName);\n  } else if (paramValue && !isNaN(parseInt(paramValue))) {\n    return parseInt(paramValue);\n  }\n\n  return null;\n};\n\n/**\n* this function is called on the initial report load and\n* whenever URL is updated either through the push state or manual user update.\n* It parses the passed URL params and replaces them again.\n*\n* ──────▄▀▄─────▄▀▄\n* ─────▄█░░▀▀▀▀▀░░█▄\n* ─▄▄──█░░░░░░░░░░░█──▄▄\n* █▄▄█─█░░▀░░┬░░▀░░█─█▄▄█\n*\n* it took me some time to find this animal.\n*/\nexport const mapUrlParamsToState = function mapUrlParamsToState(state, params: any = {}) {\n  const urlState: any = {\n    currentYearPeriod: !_.isEmpty(params.currentYearPeriod) ? params.currentYearPeriod : null,\n    currentYearAmount: !_.isEmpty(params.currentYearAmount) ? params.currentYearAmount : null,\n    year: parseDateParams(state, params.year, 'year'),\n    month: parseDateParams(state, params.month, 'month'),\n    breakdown: convertUUID(params.breakdown)\n  };\n\n  urlState.selectedDataSetIndex = params.selectedDataSetIndex ? params.selectedDataSetIndex : state.get('selectedDataSetIndex');\n\n  if (params.projections) {\n    urlState.projections = _.get(params, 'projections', false) + '' === 'true';\n    urlState.projectionType = _.get(params, 'projectionType', 'auto_year_avg');\n  }\n\n  if (params.highlighting) {\n    urlState.highlighting = _.get(params, 'highlighting', false) + '' === 'true';\n    urlState.highlightingVariance = Math.min(parseInt(_.get(params, 'highlightingVariance', 10) as any), 9999);\n  }\n\n  const fiscalYearRange = [];\n  if (params.fiscal_start) {\n    fiscalYearRange[0] = getFiscalYearMinMaxRange(params.fiscal_start, params.currentYearPeriod, state.get('minYear'), 0, 'earliest');\n  }\n\n  if (params.fiscal_end) {\n    fiscalYearRange[1] = getFiscalYearMinMaxRange(params.fiscal_end, params.currentYearPeriod, state.get('maxYear'), Infinity, 'latest');\n  }\n\n  if (params.fiscal_start || params.fiscal_end) {\n    urlState.fiscalYearRange = fiscalYearRange;\n  }\n\n  if (params.embed) {\n    urlState.embed = params.embed;\n  }\n\n  if (params.accountType) {\n    urlState.accountType = params.accountType;\n    urlState.versusView = null;\n\n    if (params.accountType === 'types') {\n      urlState.versusView = findDefaultVersusView(state);\n\n    } else {\n      urlState.versusView = strings.versusViewsStrings().find((view) => view.get('id') === params.accountType);\n      if (urlState.versusView) {\n        urlState.accountType = 'types';\n      }\n    }\n  }\n\n  return fromJS(urlState).filter((value, key) => key === 'versusView' || value != null);\n};\n\nexport const getFiscalYearMinMaxRange = function getFiscalYearMinMaxRange(fiscalDate, representationFormat, minMaxYear, minMaxYearDefault, fiscalRangeValue) {\n  let fiscalYearValue = 0;\n  const isNumber = (num) => (!!num && !isNaN(num));\n  //params.representationFormat === 'months' indicates MoM view\n  //For MoM, reset the fiscal_start and fiscal_end so that we get the report data for all years\n  if (representationFormat === 'months') {\n    fiscalYearValue = minMaxYear || minMaxYearDefault;\n  } else {\n    //params.representationFormat === 'years' indicates YoY view\n    //For YoY, save the fiscal_start and fiscal_end\n    if (fiscalDate === fiscalRangeValue) {\n      fiscalYearValue = minMaxYear || minMaxYearDefault;\n    } else if (isNumber(fiscalDate)) {\n      fiscalYearValue = parseInt(fiscalDate);\n    }\n  }\n  return fiscalYearValue;\n};\n\nfunction findDefaultVersusView(state) {\n  const budgetData = state.get('budgetData');\n  if (!budgetData) {\n    return;\n  }\n\n  const visibleAccounts = _.keyBy(budgetData.visibleAccounts, 'id');\n  return strings.versusViewsStrings().find((view) => {\n    return view.get('trees').every((tree) => visibleAccounts[tree]);\n  });\n}\n\nexport default SummaryReportStore;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/summary_report_store.ts","'use strict';\n\n/**\n * Unlike js/util/browser.js, this code is written with the expectation\n * of a browser environment with a global 'window' object\n * @module browser\n * @private\n */\n\nexports.window = window;\n\n/**\n * Provides a function that outputs milliseconds: either performance.now()\n * or a fallback to Date.now()\n */\nmodule.exports.now = (function() {\n    if (window.performance &&\n        window.performance.now) {\n        return window.performance.now.bind(window.performance);\n    } else {\n        return Date.now.bind(Date);\n    }\n}());\n\nvar frame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n    return frame(fn);\n};\n\nvar cancel = window.cancelAnimationFrame ||\n    window.mozCancelAnimationFrame ||\n    window.webkitCancelAnimationFrame ||\n    window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n    cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n    if (!dur) {\n        fn.call(ctx, 1);\n        return null;\n    }\n\n    var abort = false,\n        start = module.exports.now();\n\n    function tick(now) {\n        if (abort) return;\n        now = module.exports.now();\n\n        if (now >= start + dur) {\n            fn.call(ctx, 1);\n        } else {\n            fn.call(ctx, (now - start) / dur);\n            exports.frame(tick);\n        }\n    }\n\n    exports.frame(tick);\n\n    return function() { abort = true; };\n};\n\n/**\n * Test if the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer would be used)\n * @return {boolean}\n */\nexports.supported = require('mapbox-gl-js-supported');\n\nexports.hardwareConcurrency = navigator.hardwareConcurrency || 4;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n    get: function() { return window.devicePixelRatio; }\n});\n\nexports.supportsWebp = false;\n\nvar webpImgTest = document.createElement('img');\nwebpImgTest.onload = function() {\n    exports.supportsWebp = true;\n};\nwebpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n\nexports.supportsGeolocation = !!navigator.geolocation;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/browser.js\n// module id = 39\n// module chunks = 0 1","'use strict';\n\nvar featureFilter = require('feature-filter');\nvar Buffer = require('./buffer');\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\nvar VertexArrayObject = require('../render/vertex_array_object');\nvar assert = require('assert');\n\nmodule.exports = Bucket;\n\n/**\n * Instantiate the appropriate subclass of `Bucket` for `options`.\n * @private\n * @param options See `Bucket` constructor options\n * @returns {Bucket}\n */\nBucket.create = function(options) {\n    var Classes = {\n        fill: require('./bucket/fill_bucket'),\n        line: require('./bucket/line_bucket'),\n        circle: require('./bucket/circle_bucket'),\n        symbol: require('./bucket/symbol_bucket')\n    };\n    return new Classes[options.layer.type](options);\n};\n\n\n/**\n * The maximum extent of a feature that can be safely stored in the buffer.\n * In practice, all features are converted to this extent before being added.\n *\n * Positions are stored as signed 16bit integers.\n * One bit is lost for signedness to support featuers extending past the left edge of the tile.\n * One bit is lost because the line vertex buffer packs 1 bit of other data into the int.\n * One bit is lost to support features extending past the extent on the right edge of the tile.\n * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nBucket.EXTENT = 8192;\n\n/**\n * The `Bucket` class is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract class. A subclass exists for each Mapbox GL\n * style spec layer type. Because `Bucket` is an abstract class,\n * instances should be created via the `Bucket.create` method.\n *\n * @class Bucket\n * @private\n * @param options\n * @param {number} options.zoom Zoom level of the buffers being built. May be\n *     a fractional zoom level.\n * @param options.layer A Mapbox GL style layer object\n * @param {Object.<string, Buffer>} options.buffers The set of `Buffer`s being\n *     built for this tile. This object facilitates sharing of `Buffer`s be\n       between `Bucket`s.\n */\nfunction Bucket(options) {\n    this.zoom = options.zoom;\n    this.overscaling = options.overscaling;\n    this.layer = options.layer;\n    this.childLayers = options.childLayers;\n\n    this.type = this.layer.type;\n    this.features = [];\n    this.id = this.layer.id;\n    this.index = options.index;\n    this.sourceLayer = this.layer.sourceLayer;\n    this.sourceLayerIndex = options.sourceLayerIndex;\n    this.minZoom = this.layer.minzoom;\n    this.maxZoom = this.layer.maxzoom;\n\n    this.paintAttributes = createPaintAttributes(this);\n\n    if (options.arrays) {\n        var childLayers = this.childLayers;\n        this.bufferGroups = util.mapObject(options.arrays, function(programArrayGroups, programName) {\n            return programArrayGroups.map(function(programArrayGroup) {\n\n                var group = util.mapObject(programArrayGroup, function(arrays, layoutOrPaint) {\n                    return util.mapObject(arrays, function(array, name) {\n                        var arrayType = options.arrayTypes[programName][layoutOrPaint][name];\n                        var type = (arrayType.members.length && arrayType.members[0].name === 'vertices' ? Buffer.BufferType.ELEMENT : Buffer.BufferType.VERTEX);\n                        return new Buffer(array, arrayType, type);\n                    });\n                });\n\n                group.vaos = {};\n                if (group.layout.element2) group.secondVaos = {};\n                for (var l = 0; l < childLayers.length; l++) {\n                    var layerName = childLayers[l].id;\n                    group.vaos[layerName] = new VertexArrayObject();\n                    if (group.layout.element2) group.secondVaos[layerName] = new VertexArrayObject();\n                }\n\n                return group;\n            });\n        });\n    }\n}\n\n/**\n * Build the buffers! Features are set directly to the `features` property.\n * @private\n */\nBucket.prototype.populateBuffers = function() {\n    this.createArrays();\n    this.recalculateStyleLayers();\n\n    for (var i = 0; i < this.features.length; i++) {\n        this.addFeature(this.features[i]);\n    }\n\n    this.trimArrays();\n};\n\n/**\n * Check if there is enough space available in the current element group for\n * `vertexLength` vertices. If not, append a new elementGroup. Should be called\n * by `populateBuffers` and its callees.\n * @private\n * @param {string} programName the name of the program associated with the buffer that will receive the vertices\n * @param {number} vertexLength The number of vertices that will be inserted to the buffer.\n * @returns The current element group\n */\nBucket.prototype.makeRoomFor = function(programName, numVertices) {\n    var groups = this.arrayGroups[programName];\n    var currentGroup = groups.length && groups[groups.length - 1];\n\n    if (!currentGroup || currentGroup.layout.vertex.length + numVertices > 65535) {\n\n        var arrayTypes = this.arrayTypes[programName];\n        var VertexArrayType = arrayTypes.layout.vertex;\n        var ElementArrayType = arrayTypes.layout.element;\n        var ElementArrayType2 = arrayTypes.layout.element2;\n\n        currentGroup = {\n            index: groups.length,\n            layout: {},\n            paint: {}\n        };\n\n        currentGroup.layout.vertex = new VertexArrayType();\n        if (ElementArrayType) currentGroup.layout.element = new ElementArrayType();\n        if (ElementArrayType2) currentGroup.layout.element2 = new ElementArrayType2();\n\n        for (var i = 0; i < this.childLayers.length; i++) {\n            var layerName = this.childLayers[i].id;\n            var PaintVertexArrayType = arrayTypes.paint[layerName];\n            currentGroup.paint[layerName] = new PaintVertexArrayType();\n        }\n\n        groups.push(currentGroup);\n    }\n\n    return currentGroup;\n};\n\n/**\n * Start using a new shared `buffers` object and recreate instances of `Buffer`\n * as necessary.\n * @private\n */\nBucket.prototype.createArrays = function() {\n    this.arrayGroups = {};\n    this.arrayTypes = {};\n\n    for (var programName in this.programInterfaces) {\n        var programInterface = this.programInterfaces[programName];\n        var programArrayTypes = this.arrayTypes[programName] = { layout: {}, paint: {} };\n        this.arrayGroups[programName] = [];\n\n        if (programInterface.vertexBuffer) {\n            var VertexArrayType = new StructArrayType({\n                members: this.programInterfaces[programName].layoutAttributes,\n                alignment: Buffer.VERTEX_ATTRIBUTE_ALIGNMENT\n            });\n\n            programArrayTypes.layout.vertex = VertexArrayType;\n\n            var layerPaintAttributes = this.paintAttributes[programName];\n            for (var layerName in layerPaintAttributes) {\n                var PaintVertexArrayType = new StructArrayType({\n                    members: layerPaintAttributes[layerName].attributes,\n                    alignment: Buffer.VERTEX_ATTRIBUTE_ALIGNMENT\n                });\n\n                programArrayTypes.paint[layerName] = PaintVertexArrayType;\n            }\n        }\n\n        if (programInterface.elementBuffer) {\n            var ElementArrayType = createElementBufferType(programInterface.elementBufferComponents);\n            programArrayTypes.layout.element = ElementArrayType;\n        }\n\n        if (programInterface.elementBuffer2) {\n            var ElementArrayType2 = createElementBufferType(programInterface.elementBuffer2Components);\n            programArrayTypes.layout.element2 = ElementArrayType2;\n        }\n    }\n};\n\nBucket.prototype.destroy = function(gl) {\n    for (var programName in this.bufferGroups) {\n        var programBufferGroups = this.bufferGroups[programName];\n        for (var i = 0; i < programBufferGroups.length; i++) {\n            var programBuffers = programBufferGroups[i];\n            for (var paintBuffer in programBuffers.paint) {\n                programBuffers.paint[paintBuffer].destroy(gl);\n            }\n            for (var layoutBuffer in programBuffers.layout) {\n                programBuffers.layout[layoutBuffer].destroy(gl);\n            }\n            for (var j in programBuffers.vaos) {\n                programBuffers.vaos[j].destroy(gl);\n            }\n            for (var k in programBuffers.secondVaos) {\n                programBuffers.secondVaos[k].destroy(gl);\n            }\n        }\n    }\n\n};\n\nBucket.prototype.trimArrays = function() {\n    for (var programName in this.arrayGroups) {\n        var programArrays = this.arrayGroups[programName];\n        for (var paintArray in programArrays.paint) {\n            programArrays.paint[paintArray].trim();\n        }\n        for (var layoutArray in programArrays.layout) {\n            programArrays.layout[layoutArray].trim();\n        }\n    }\n};\n\nBucket.prototype.setUniforms = function(gl, programName, program, layer, globalProperties) {\n    var uniforms = this.paintAttributes[programName][layer.id].uniforms;\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        var uniformLocation = program[uniform.name];\n        gl['uniform' + uniform.components + 'fv'](uniformLocation, uniform.getValue(layer, globalProperties));\n    }\n};\n\nBucket.prototype.serialize = function() {\n    return {\n        layerId: this.layer.id,\n        zoom: this.zoom,\n        arrays: util.mapObject(this.arrayGroups, function(programArrayGroups) {\n            return programArrayGroups.map(function(arrayGroup) {\n                return util.mapObject(arrayGroup, function(arrays) {\n                    return util.mapObject(arrays, function(array) {\n                        return array.serialize();\n                    });\n                });\n            });\n        }),\n        arrayTypes: util.mapObject(this.arrayTypes, function(programArrayTypes) {\n            return util.mapObject(programArrayTypes, function(arrayTypes) {\n                return util.mapObject(arrayTypes, function(arrayType) {\n                    return arrayType.serialize();\n                });\n            });\n        }),\n\n        childLayerIds: this.childLayers.map(function(layer) {\n            return layer.id;\n        })\n    };\n};\n\nBucket.prototype.createFilter = function() {\n    if (!this.filter) {\n        this.filter = featureFilter(this.layer.filter);\n    }\n};\n\nvar FAKE_ZOOM_HISTORY = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\nBucket.prototype.recalculateStyleLayers = function() {\n    for (var i = 0; i < this.childLayers.length; i++) {\n        this.childLayers[i].recalculate(this.zoom, FAKE_ZOOM_HISTORY);\n    }\n};\n\nBucket.prototype.populatePaintArrays = function(interfaceName, globalProperties, featureProperties, startGroup, startIndex) {\n    for (var l = 0; l < this.childLayers.length; l++) {\n        var layer = this.childLayers[l];\n        var groups = this.arrayGroups[interfaceName];\n        for (var g = startGroup.index; g < groups.length; g++) {\n            var group = groups[g];\n            var length = group.layout.vertex.length;\n            var vertexArray = group.paint[layer.id];\n            vertexArray.resize(length);\n\n            var attributes = this.paintAttributes[interfaceName][layer.id].attributes;\n            for (var m = 0; m < attributes.length; m++) {\n                var attribute = attributes[m];\n\n                var value = attribute.getValue(layer, globalProperties, featureProperties);\n                var multiplier = attribute.multiplier || 1;\n                var components = attribute.components || 1;\n\n                for (var i = startIndex; i < length; i++) {\n                    var vertex = vertexArray.get(i);\n                    for (var c = 0; c < components; c++) {\n                        var memberName = components > 1 ? (attribute.name + c) : attribute.name;\n                        vertex[memberName] = value[c] * multiplier;\n                    }\n                }\n            }\n        }\n    }\n};\n\nfunction createElementBufferType(components) {\n    return new StructArrayType({\n        members: [{\n            type: Buffer.ELEMENT_ATTRIBUTE_TYPE,\n            name: 'vertices',\n            components: components || 3\n        }]\n    });\n}\n\nfunction createPaintAttributes(bucket) {\n    var attributes = {};\n    for (var interfaceName in bucket.programInterfaces) {\n        var layerPaintAttributes = attributes[interfaceName] = {};\n\n        for (var c = 0; c < bucket.childLayers.length; c++) {\n            var childLayer = bucket.childLayers[c];\n\n            layerPaintAttributes[childLayer.id] = {\n                attributes: [],\n                uniforms: [],\n                defines: [],\n                vertexPragmas: { define: {}, initialize: {} },\n                fragmentPragmas: { define: {}, initialize: {} }\n            };\n        }\n\n        var interface_ = bucket.programInterfaces[interfaceName];\n        if (!interface_.paintAttributes) continue;\n        for (var i = 0; i < interface_.paintAttributes.length; i++) {\n            var attribute = interface_.paintAttributes[i];\n            attribute.multiplier = attribute.multiplier || 1;\n\n            for (var j = 0; j < bucket.childLayers.length; j++) {\n                var layer = bucket.childLayers[j];\n                var paintAttributes = layerPaintAttributes[layer.id];\n\n                var attributeType = attribute.components === 1 ? 'float' : 'vec' + attribute.components;\n                var attributeInputName = attribute.name;\n                assert(attribute.name.slice(0, 2) === 'a_');\n                var attributeInnerName = attribute.name.slice(2);\n                var attributeVaryingDefinition;\n\n                paintAttributes.fragmentPragmas.initialize[attributeInnerName] = '';\n\n                // This token is replaced by the first argument to the pragma,\n                // which must be the attribute's precision (\"lowp\", \"mediump\",\n                // or \"highp\")\n                var attributePrecision = '{precision}';\n\n                if (layer.isPaintValueFeatureConstant(attribute.paintProperty)) {\n                    paintAttributes.uniforms.push(attribute);\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = paintAttributes.vertexPragmas.define[attributeInnerName] = [\n                        'uniform',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';';\n\n                    paintAttributes.fragmentPragmas.initialize[attributeInnerName] = paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName,\n                        '=',\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                } else if (layer.isPaintValueZoomConstant(attribute.paintProperty)) {\n                    paintAttributes.attributes.push(util.extend({}, attribute, {\n                        name: attributeInputName\n                    }));\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    var attributeAttributeDefinition = [\n                        paintAttributes.fragmentPragmas.define[attributeInnerName],\n                        'attribute',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + attributeAttributeDefinition;\n\n                    paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributeInnerName,\n                        '=',\n                        attributeInputName,\n                        '/',\n                        attribute.multiplier.toFixed(1)\n                    ].join(' ') + ';\\n';\n\n                } else {\n\n                    var tName = 'u_' + attributeInputName.slice(2) + '_t';\n                    var zoomLevels = layer.getPaintValueStopZoomLevels(attribute.paintProperty);\n\n                    // Pick the index of the first offset to add to the buffers.\n                    // Find the four closest stops, ideally with two on each side of the zoom level.\n                    var numStops = 0;\n                    while (numStops < zoomLevels.length && zoomLevels[numStops] < bucket.zoom) numStops++;\n                    var stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2));\n\n                    var fourZoomLevels = [];\n                    for (var s = 0; s < 4; s++) {\n                        fourZoomLevels.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]);\n                    }\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + [\n                        'uniform',\n                        'lowp',\n                        'float',\n                        tName\n                    ].join(' ') + ';\\n';\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.uniforms.push(util.extend({}, attribute, {\n                        name: tName,\n                        getValue: createGetUniform(attribute, stopOffset),\n                        components: 1\n                    }));\n\n                    var components = attribute.components;\n                    if (components === 1) {\n\n                        paintAttributes.attributes.push(util.extend({}, attribute, {\n                            getValue: createFunctionGetValue(attribute, fourZoomLevels),\n                            isFunction: true,\n                            components: components * 4\n                        }));\n\n                        paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                            'attribute',\n                            attributePrecision,\n                            'vec4',\n                            attributeInputName\n                        ].join(' ') + ';\\n';\n\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            '=',\n                            'evaluate_zoom_function_1(' + attributeInputName + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n\n                    } else {\n\n                        var attributeInputNames = [];\n                        for (var k = 0; k < 4; k++) {\n                            attributeInputNames.push(attributeInputName + k);\n                            paintAttributes.attributes.push(util.extend({}, attribute, {\n                                getValue: createFunctionGetValue(attribute, [fourZoomLevels[k]]),\n                                isFunction: true,\n                                name: attributeInputName + k\n                            }));\n                            paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                                'attribute',\n                                attributePrecision,\n                                attributeType,\n                                attributeInputName + k\n                            ].join(' ') + ';\\n';\n                        }\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            ' = ',\n                            'evaluate_zoom_function_4(' + attributeInputNames.join(', ') + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n                    }\n                }\n            }\n        }\n    }\n    return attributes;\n}\n\nfunction createFunctionGetValue(attribute, stopZoomLevels) {\n    return function(layer, globalProperties, featureProperties) {\n        if (stopZoomLevels.length === 1) {\n            // return one multi-component value like color0\n            return attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevels[0] }), featureProperties);\n        } else {\n            // pack multiple single-component values into a four component attribute\n            var values = [];\n            for (var z = 0; z < stopZoomLevels.length; z++) {\n                var stopZoomLevel = stopZoomLevels[z];\n                values.push(attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevel }), featureProperties)[0]);\n            }\n            return values;\n        }\n    };\n}\n\nfunction createGetUniform(attribute, stopOffset) {\n    return function(layer, globalProperties) {\n        // stopInterp indicates which stops need to be interpolated.\n        // If stopInterp is 3.5 then interpolate half way between stops 3 and 4.\n        var stopInterp = layer.getPaintInterpolationT(attribute.paintProperty, globalProperties.zoom);\n        // We can only store four stop values in the buffers. stopOffset is the number of stops that come\n        // before the stops that were added to the buffers.\n        return [Math.max(0, Math.min(4, stopInterp - stopOffset))];\n    };\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket.js\n// module id = 40\n// module chunks = 0 1","'use strict';\n\nvar format = require('util').format;\n\nfunction ValidationError(key, value /*, message, ...*/) {\n    this.message = (\n        (key ? key + ': ' : '') +\n        format.apply(format, Array.prototype.slice.call(arguments, 2))\n    );\n\n    if (value !== null && value !== undefined && value.__line__) {\n        this.line = value.__line__;\n    }\n}\n\nmodule.exports = ValidationError;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/error/validation_error.js\n// module id = 41\n// module chunks = 0 1","'use strict';\n\nvar featureFilter = require('feature-filter');\nvar ArrayGroup = require('./array_group');\nvar BufferGroup = require('./buffer_group');\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\nvar assert = require('assert');\n\nmodule.exports = Bucket;\n\n/**\n * Instantiate the appropriate subclass of `Bucket` for `options`.\n * @private\n * @param options See `Bucket` constructor options\n * @returns {Bucket}\n */\nBucket.create = function(options) {\n    var Classes = {\n        fill: require('./bucket/fill_bucket'),\n        line: require('./bucket/line_bucket'),\n        circle: require('./bucket/circle_bucket'),\n        symbol: require('./bucket/symbol_bucket')\n    };\n    return new Classes[options.layer.type](options);\n};\n\n\n/**\n * The maximum extent of a feature that can be safely stored in the buffer.\n * In practice, all features are converted to this extent before being added.\n *\n * Positions are stored as signed 16bit integers.\n * One bit is lost for signedness to support featuers extending past the left edge of the tile.\n * One bit is lost because the line vertex buffer packs 1 bit of other data into the int.\n * One bit is lost to support features extending past the extent on the right edge of the tile.\n * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nBucket.EXTENT = 8192;\n\n/**\n * The `Bucket` class is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract class. A subclass exists for each Mapbox GL\n * style spec layer type. Because `Bucket` is an abstract class,\n * instances should be created via the `Bucket.create` method.\n *\n * @class Bucket\n * @private\n * @param options\n * @param {number} options.zoom Zoom level of the buffers being built. May be\n *     a fractional zoom level.\n * @param options.layer A Mapbox style layer object\n * @param {Object.<string, Buffer>} options.buffers The set of `Buffer`s being\n *     built for this tile. This object facilitates sharing of `Buffer`s be\n       between `Bucket`s.\n */\nfunction Bucket(options) {\n    this.zoom = options.zoom;\n    this.overscaling = options.overscaling;\n    this.layer = options.layer;\n    this.childLayers = options.childLayers;\n\n    this.type = this.layer.type;\n    this.features = [];\n    this.id = this.layer.id;\n    this.index = options.index;\n    this.sourceLayer = this.layer.sourceLayer;\n    this.sourceLayerIndex = options.sourceLayerIndex;\n    this.minZoom = this.layer.minzoom;\n    this.maxZoom = this.layer.maxzoom;\n\n    this.paintAttributes = createPaintAttributes(this);\n\n    if (options.arrays) {\n        var programInterfaces = this.programInterfaces;\n        this.bufferGroups = util.mapObject(options.arrays, function(programArrayGroups, programName) {\n            var programInterface = programInterfaces[programName];\n            var paintVertexArrayTypes = options.paintVertexArrayTypes[programName];\n            return programArrayGroups.map(function(arrayGroup) {\n                return new BufferGroup(arrayGroup, {\n                    layoutVertexArrayType: programInterface.layoutVertexArrayType.serialize(),\n                    elementArrayType: programInterface.elementArrayType && programInterface.elementArrayType.serialize(),\n                    elementArrayType2: programInterface.elementArrayType2 && programInterface.elementArrayType2.serialize(),\n                    paintVertexArrayTypes: paintVertexArrayTypes\n                });\n            });\n        });\n    }\n}\n\n/**\n * Build the arrays! Features are set directly to the `features` property.\n * @private\n */\nBucket.prototype.populateArrays = function() {\n    this.createArrays();\n    this.recalculateStyleLayers();\n\n    for (var i = 0; i < this.features.length; i++) {\n        this.addFeature(this.features[i]);\n    }\n\n    this.trimArrays();\n};\n\n/**\n * Check if there is enough space available in the current array group for\n * `vertexLength` vertices. If not, append a new array group. Should be called\n * by `populateArrays` and its callees.\n *\n * Array groups are added to this.arrayGroups[programName].\n *\n * @private\n * @param {string} programName the name of the program associated with the buffer that will receive the vertices\n * @param {number} vertexLength The number of vertices that will be inserted to the buffer.\n * @returns The current array group\n */\nBucket.prototype.prepareArrayGroup = function(programName, numVertices) {\n    var groups = this.arrayGroups[programName];\n    var currentGroup = groups.length && groups[groups.length - 1];\n\n    if (!currentGroup || !currentGroup.hasCapacityFor(numVertices)) {\n        currentGroup = new ArrayGroup({\n            layoutVertexArrayType: this.programInterfaces[programName].layoutVertexArrayType,\n            elementArrayType: this.programInterfaces[programName].elementArrayType,\n            elementArrayType2: this.programInterfaces[programName].elementArrayType2,\n            paintVertexArrayTypes: this.paintVertexArrayTypes[programName]\n        });\n\n        currentGroup.index = groups.length;\n\n        groups.push(currentGroup);\n    }\n\n    return currentGroup;\n};\n\n/**\n * Sets up `this.paintVertexArrayTypes` as { [programName]: { [layerName]: PaintArrayType, ... }, ... }\n *\n * And `this.arrayGroups` as { [programName]: [], ... }; these get populated\n * with array group structure over in `prepareArrayGroup`.\n *\n * @private\n */\nBucket.prototype.createArrays = function() {\n    this.arrayGroups = {};\n    this.paintVertexArrayTypes = {};\n\n    for (var programName in this.programInterfaces) {\n        this.arrayGroups[programName] = [];\n\n        var paintVertexArrayTypes = this.paintVertexArrayTypes[programName] = {};\n        var layerPaintAttributes = this.paintAttributes[programName];\n\n        for (var layerName in layerPaintAttributes) {\n            paintVertexArrayTypes[layerName] = new Bucket.VertexArrayType(layerPaintAttributes[layerName].attributes);\n        }\n    }\n};\n\nBucket.prototype.destroy = function(gl) {\n    for (var programName in this.bufferGroups) {\n        var programBufferGroups = this.bufferGroups[programName];\n        for (var i = 0; i < programBufferGroups.length; i++) {\n            programBufferGroups[i].destroy(gl);\n        }\n    }\n};\n\nBucket.prototype.trimArrays = function() {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            arrayGroups[i].trim();\n        }\n    }\n};\n\nBucket.prototype.isEmpty = function() {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            if (!arrayGroups[i].isEmpty()) {\n                return false;\n            }\n        }\n    }\n    return true;\n};\n\nBucket.prototype.getTransferables = function(transferables) {\n    for (var programName in this.arrayGroups) {\n        var arrayGroups = this.arrayGroups[programName];\n        for (var i = 0; i < arrayGroups.length; i++) {\n            arrayGroups[i].getTransferables(transferables);\n        }\n    }\n};\n\nBucket.prototype.setUniforms = function(gl, programName, program, layer, globalProperties) {\n    var uniforms = this.paintAttributes[programName][layer.id].uniforms;\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        var uniformLocation = program[uniform.name];\n        gl['uniform' + uniform.components + 'fv'](uniformLocation, uniform.getValue(layer, globalProperties));\n    }\n};\n\nBucket.prototype.serialize = function() {\n    return {\n        layerId: this.layer.id,\n        zoom: this.zoom,\n        arrays: util.mapObject(this.arrayGroups, function(programArrayGroups) {\n            return programArrayGroups.map(function(arrayGroup) {\n                return arrayGroup.serialize();\n            });\n        }),\n        paintVertexArrayTypes: util.mapObject(this.paintVertexArrayTypes, function(arrayTypes) {\n            return util.mapObject(arrayTypes, function(arrayType) {\n                return arrayType.serialize();\n            });\n        }),\n\n        childLayerIds: this.childLayers.map(function(layer) {\n            return layer.id;\n        })\n    };\n};\n\nBucket.prototype.createFilter = function() {\n    if (!this.filter) {\n        this.filter = featureFilter(this.layer.filter);\n    }\n};\n\nvar FAKE_ZOOM_HISTORY = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\nBucket.prototype.recalculateStyleLayers = function() {\n    for (var i = 0; i < this.childLayers.length; i++) {\n        this.childLayers[i].recalculate(this.zoom, FAKE_ZOOM_HISTORY);\n    }\n};\n\nBucket.prototype.populatePaintArrays = function(interfaceName, globalProperties, featureProperties, startGroup, startIndex) {\n    for (var l = 0; l < this.childLayers.length; l++) {\n        var layer = this.childLayers[l];\n        var groups = this.arrayGroups[interfaceName];\n        for (var g = startGroup.index; g < groups.length; g++) {\n            var group = groups[g];\n            var length = group.layoutVertexArray.length;\n            var paintArray = group.paintVertexArrays[layer.id];\n            paintArray.resize(length);\n\n            var attributes = this.paintAttributes[interfaceName][layer.id].attributes;\n            for (var m = 0; m < attributes.length; m++) {\n                var attribute = attributes[m];\n\n                var value = attribute.getValue(layer, globalProperties, featureProperties);\n                var multiplier = attribute.multiplier || 1;\n                var components = attribute.components || 1;\n\n                var start = g === startGroup.index  ? startIndex : 0;\n                for (var i = start; i < length; i++) {\n                    var vertex = paintArray.get(i);\n                    for (var c = 0; c < components; c++) {\n                        var memberName = components > 1 ? (attribute.name + c) : attribute.name;\n                        vertex[memberName] = value[c] * multiplier;\n                    }\n                }\n            }\n        }\n    }\n};\n\n/**\n * A vertex array stores data for each vertex in a geometry. Elements are aligned to 4 byte\n * boundaries for best performance in WebGL.\n * @private\n */\nBucket.VertexArrayType = function (members) {\n    return new StructArrayType({\n        members: members,\n        alignment: 4\n    });\n};\n\n/**\n * An element array stores Uint16 indicies of vertexes in a corresponding vertex array. With no\n * arguments, it defaults to three components per element, forming triangles.\n * @private\n */\nBucket.ElementArrayType = function (components) {\n    return new StructArrayType({\n        members: [{\n            type: 'Uint16',\n            name: 'vertices',\n            components: components || 3\n        }]\n    });\n};\n\nfunction createPaintAttributes(bucket) {\n    var attributes = {};\n    for (var interfaceName in bucket.programInterfaces) {\n        var layerPaintAttributes = attributes[interfaceName] = {};\n\n        for (var c = 0; c < bucket.childLayers.length; c++) {\n            var childLayer = bucket.childLayers[c];\n\n            layerPaintAttributes[childLayer.id] = {\n                attributes: [],\n                uniforms: [],\n                defines: [],\n                vertexPragmas: { define: {}, initialize: {} },\n                fragmentPragmas: { define: {}, initialize: {} }\n            };\n        }\n\n        var interface_ = bucket.programInterfaces[interfaceName];\n        if (!interface_.paintAttributes) continue;\n\n        // These tokens are replaced by arguments to the pragma\n        // https://github.com/mapbox/mapbox-gl-shaders#pragmas\n        var attributePrecision = '{precision}';\n        var attributeType = '{type}';\n\n        for (var i = 0; i < interface_.paintAttributes.length; i++) {\n            var attribute = interface_.paintAttributes[i];\n            attribute.multiplier = attribute.multiplier || 1;\n\n            for (var j = 0; j < bucket.childLayers.length; j++) {\n                var layer = bucket.childLayers[j];\n                var paintAttributes = layerPaintAttributes[layer.id];\n\n                var attributeInputName = attribute.name;\n                assert(attribute.name.slice(0, 2) === 'a_');\n                var attributeInnerName = attribute.name.slice(2);\n                var attributeVaryingDefinition;\n\n                paintAttributes.fragmentPragmas.initialize[attributeInnerName] = '';\n\n                if (layer.isPaintValueFeatureConstant(attribute.paintProperty)) {\n                    paintAttributes.uniforms.push(attribute);\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = paintAttributes.vertexPragmas.define[attributeInnerName] = [\n                        'uniform',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';';\n\n                    paintAttributes.fragmentPragmas.initialize[attributeInnerName] = paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName,\n                        '=',\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                } else if (layer.isPaintValueZoomConstant(attribute.paintProperty)) {\n                    paintAttributes.attributes.push(util.extend({}, attribute, {\n                        name: attributeInputName\n                    }));\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    var attributeAttributeDefinition = [\n                        paintAttributes.fragmentPragmas.define[attributeInnerName],\n                        'attribute',\n                        attributePrecision,\n                        attributeType,\n                        attributeInputName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + attributeAttributeDefinition;\n\n                    paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                        attributeInnerName,\n                        '=',\n                        attributeInputName,\n                        '/',\n                        attribute.multiplier.toFixed(1)\n                    ].join(' ') + ';\\n';\n\n                } else {\n\n                    var tName = 'u_' + attributeInputName.slice(2) + '_t';\n                    var zoomLevels = layer.getPaintValueStopZoomLevels(attribute.paintProperty);\n\n                    // Pick the index of the first offset to add to the buffers.\n                    // Find the four closest stops, ideally with two on each side of the zoom level.\n                    var numStops = 0;\n                    while (numStops < zoomLevels.length && zoomLevels[numStops] < bucket.zoom) numStops++;\n                    var stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2));\n\n                    var fourZoomLevels = [];\n                    for (var s = 0; s < 4; s++) {\n                        fourZoomLevels.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]);\n                    }\n\n                    attributeVaryingDefinition = [\n                        'varying',\n                        attributePrecision,\n                        attributeType,\n                        attributeInnerName\n                    ].join(' ') + ';\\n';\n\n                    paintAttributes.vertexPragmas.define[attributeInnerName] = attributeVaryingDefinition + [\n                        'uniform',\n                        'lowp',\n                        'float',\n                        tName\n                    ].join(' ') + ';\\n';\n                    paintAttributes.fragmentPragmas.define[attributeInnerName] = attributeVaryingDefinition;\n\n                    paintAttributes.uniforms.push(util.extend({}, attribute, {\n                        name: tName,\n                        getValue: createGetUniform(attribute, stopOffset),\n                        components: 1\n                    }));\n\n                    var components = attribute.components;\n                    if (components === 1) {\n\n                        paintAttributes.attributes.push(util.extend({}, attribute, {\n                            getValue: createFunctionGetValue(attribute, fourZoomLevels),\n                            isFunction: true,\n                            components: components * 4\n                        }));\n\n                        paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                            'attribute',\n                            attributePrecision,\n                            'vec4',\n                            attributeInputName\n                        ].join(' ') + ';\\n';\n\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            '=',\n                            'evaluate_zoom_function_1(' + attributeInputName + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n\n                    } else {\n\n                        var attributeInputNames = [];\n                        for (var k = 0; k < 4; k++) {\n                            attributeInputNames.push(attributeInputName + k);\n                            paintAttributes.attributes.push(util.extend({}, attribute, {\n                                getValue: createFunctionGetValue(attribute, [fourZoomLevels[k]]),\n                                isFunction: true,\n                                name: attributeInputName + k\n                            }));\n                            paintAttributes.vertexPragmas.define[attributeInnerName] += [\n                                'attribute',\n                                attributePrecision,\n                                attributeType,\n                                attributeInputName + k\n                            ].join(' ') + ';\\n';\n                        }\n                        paintAttributes.vertexPragmas.initialize[attributeInnerName] = [\n                            attributeInnerName,\n                            ' = ',\n                            'evaluate_zoom_function_4(' + attributeInputNames.join(', ') + ', ' + tName + ')',\n                            '/',\n                            attribute.multiplier.toFixed(1)\n                        ].join(' ') + ';\\n';\n                    }\n                }\n            }\n        }\n    }\n    return attributes;\n}\n\nfunction createFunctionGetValue(attribute, stopZoomLevels) {\n    return function(layer, globalProperties, featureProperties) {\n        if (stopZoomLevels.length === 1) {\n            // return one multi-component value like color0\n            return attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevels[0] }), featureProperties);\n        } else {\n            // pack multiple single-component values into a four component attribute\n            var values = [];\n            for (var z = 0; z < stopZoomLevels.length; z++) {\n                var stopZoomLevel = stopZoomLevels[z];\n                values.push(attribute.getValue(layer, util.extend({}, globalProperties, { zoom: stopZoomLevel }), featureProperties)[0]);\n            }\n            return values;\n        }\n    };\n}\n\nfunction createGetUniform(attribute, stopOffset) {\n    return function(layer, globalProperties) {\n        // stopInterp indicates which stops need to be interpolated.\n        // If stopInterp is 3.5 then interpolate half way between stops 3 and 4.\n        var stopInterp = layer.getPaintInterpolationT(attribute.paintProperty, globalProperties.zoom);\n        // We can only store four stop values in the buffers. stopOffset is the number of stops that come\n        // before the stops that were added to the buffers.\n        return [Math.max(0, Math.min(4, stopInterp - stopOffset))];\n    };\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/bucket.js\n// module id = 42\n// module chunks = 0 1","/**\n * @license\n * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n      descriptor.value = null;\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function(object) {\n      var index, iterable = object, result = [];\n      if (!iterable) return result;\n      if (!(objectTypes[typeof object])) return result;\n        for (index in iterable) {\n          if (hasOwnProperty.call(iterable, index)) {\n            result.push(index);\n          }\n        }\n      return result\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        for (index in iterable) {\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * https://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.2';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return _;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/ovid/node_modules/lodash/dist/lodash.js","import Immutable, { List, Map } from 'immutable';\nimport _ from 'lodash';\nimport color from 'color';\nimport Promise from 'bluebird';\n\nimport colors from '../og_colors';\nimport { getColumnTypeByName } from '../utils/schema_utils';\n\nexport const MapBoxAPIAccessToken = (window as any).gon && gon.mapBoxApiAccessToken;\nexport const OpenGovVectorTileLayerURL = 'mapbox://styles/opengov/ciom010hc0006axnld5s0ylyp';\nexport const MapboxGl = {\n  maxZoom: 20,\n};\nexport const MAX_NUMBER_OF_TOOLTIP_FIELDS = 5; // the max that will comfortably fit in the map pane\n\nexport const MapDataTypes = {\n  longitude: 'longitude',\n  latitude: 'latitude',\n  address: 'address',\n  city: 'city',\n  state: 'state',\n  zipcode: 'zipcode',\n  country_code: 'country_code',\n};\n\nexport const AllMapDataTypes = _.values(MapDataTypes);\n\nexport const GeocoderMapDataTypes = [\n  MapDataTypes.address,\n  MapDataTypes.city,\n  MapDataTypes.state,\n  MapDataTypes.zipcode,\n  MapDataTypes.country_code,\n];\n\n// TODO: null and other `undefined-ish` values break the aggregate request so,\n// we have to use quasi_id below to simulate no grouping; preferably this goes away at some point?\nexport const MapSpecificBreakdowns = {\n  None: { name: 'quasi_id', label: '- none -' }\n};\n\nexport const MapSpecificBreakdownValues = Immutable.List(_.values(MapSpecificBreakdowns)).map(v => Immutable.fromJS(v));\n\nexport const MapTypes = {\n  Point: {\n    name: 'point',\n    label: 'Point',\n    layerType: 'circle'\n  },\n  Heatmap: {\n    name: 'heatmap',\n    label: 'Heatmap',\n    configuration: {\n      // These values were arrived at by manually tweaking them with existing visualizations\n      intensityExponent: 1 / 3, // Near 0 all points will have very similar intensities, higher and they will diverge\n      max: 8,\n      min: 1,\n      radius: 6.5,\n      sizeExponent: 1 + 2 / 3, // The range this exponent is applied to is 0 -> 1 so this dampens size for higher values\n      zoomExponent: 1.15\n    },\n    types: {\n      amount: 'amount',\n      density: 'density'\n    }\n  },\n  Bubble: {\n    name: 'bubble',\n    label: 'Bubble',\n    layerType: 'circle',\n    configuration: {\n      minBubbleRadius: 4,\n      maxBubbleRadius: 25,\n      bubbleFillAlpha: 0.75\n    }\n  }\n};\n\nexport const MapTypeNames = _.map(MapTypes, t => t.name);\n\nexport const MapLegendConfig = {\n  // This is 6 just to fit the items in the legend container\n  itemsPerPage: 6\n};\n\nexport const MapColors = [\n  0x4781BF, 0xA1BBE5, 0xE59539, 0xE8CE8B, 0x6F5DA8,\n  0xCDABDB, 0x3D9990, 0x7CCFB4, 0x4C5FB5, 0x979ACC,\n  0xCC5E69, 0xEDA19F, 0x4692B0, 0x8BD4D6, 0xE0694F,\n  0xF5A482, 0x549970, 0x9AD9A4, 0x9C4174, 0xCF7C92\n];\n\nexport const HeatMapGradient = {\n  0.1: '#89BDE0',\n  0.2: '#96E3E6',\n  0.4: '#82CEB6',\n  0.6: '#FAF3A5',\n  0.8: '#F5D98B',\n  1.0: '#DE9A96'\n};\n\nexport const HeatMapGradientStops = _.sortBy(\n  _.map(HeatMapGradient, (color, stop) => ({ color, stop })),\n  ({ stop }) => parseFloat(stop)\n);\n\nexport const HtmlMapColors = MapColors.map((color) => colors.intToHtmlColor(color));\n\nexport function getColor(index) {\n  return MapColors[index % MapColors.length];\n}\n\nexport function getHtmlColor(index) {\n  return HtmlMapColors[index % HtmlMapColors.length];\n}\n\nexport function getColorExtractorFor(breakdown, colorMap) {\n  return row => {\n    const breakdownValue = Immutable.isImmutable(row) ? row.get(breakdown) : row[breakdown];\n    return colorMap[breakdown][breakdownValue];\n  };\n}\n\nexport const bubbleColorTransform = c => color(c).alpha(MapTypes.Bubble.configuration.bubbleFillAlpha).rgbaString();\n\nexport function getColorMapFor(newValues, breakdown, currentColorMap) {\n  return _.set(currentColorMap, breakdown,\n    _.reduce(\n      newValues,\n      (result, value: any, i) => _.defaults(result, { [value]: value == null ? getHtmlColor(0) : getHtmlColor(i) }),\n      _.get(_.defaults(currentColorMap || {}, { [breakdown]: {} }), breakdown)\n    )\n  );\n}\n\nexport function getLegendColorMap(values, breakdown, colorMap) {\n  return _.reduce(values, (legendMap, value: any) => {\n    legendMap[breakdown][value] = colorMap[breakdown][value];\n    return legendMap;\n  }, { [breakdown]: {} });\n}\n\nconst removeColumn = (toRemove, tooltip) => {\n  return tooltip.set('columns', tooltip.get('columns').filter(column => column !== toRemove));\n};\n\nconst updateColumnInTooltip = (origColumn, newColumn, tooltip) => {\n  return tooltip.set('columns', tooltip.get('columns').map((column) => {\n    if (column === origColumn) {\n      return origColumn.merge(newColumn);\n    }\n\n    return column;\n  }));\n};\n\nconst reorderColumns = (currentTooltip, moved, movedOver) => {\n  return currentTooltip.set('columns',\n    currentTooltip.get('columns').map((column) => {\n      if (column === moved) {\n        return movedOver;\n      }\n\n      if (column === movedOver) {\n        return moved;\n      }\n\n      return column;\n    })\n  );\n};\n\nexport const mapTooltipSchemas = [\n  {\n    version: 'v1',\n\n    removeColumn,\n\n    updateColumnInTooltip,\n\n    reorderColumns,\n\n    createDefault(columns) {\n      return Immutable.fromJS({\n        columns: columns.map(column => {\n          return {\n            name: _.result(column, 'name'),\n            label: _.result(column, 'label'),\n            showColumnName: true\n          };\n        })\n      });\n    },\n\n    addNewColumn(currentTooltip, column) {\n      return currentTooltip.set('columns',\n        currentTooltip.get('columns').push(\n          Immutable.fromJS({\n            name: column.get('name'),\n            label: column.get('label'),\n            showColumnName: true\n          })\n        )\n      );\n    },\n\n    migrateFromPrevious: null\n  },\n  {\n    version: 'v2',\n\n    removeColumn,\n\n    updateColumnInTooltip,\n\n    reorderColumns,\n\n    createDefault(columns) {\n      return Immutable.fromJS({\n        version: 'v2',\n        columns: columns.map(column => {\n          return {\n            name: _.result(column, 'name'),\n            label: _.result(column, 'label'),\n            type: _.result(column, 'type'),\n            showColumnName: true\n          };\n        })\n      });\n    },\n\n    addNewColumn(currentTooltip, column) {\n      return currentTooltip.set('columns',\n        currentTooltip.get('columns').push(\n          Immutable.fromJS({\n            name: column.get('name'),\n            label: column.get('label'),\n            type: column.get('type'),\n            showColumnName: true\n          })\n        )\n      );\n    },\n\n    migrateFromPrevious(tooltip, schema) {\n      const updatedColumns = tooltip.getIn(['config', 'columns']).map((column) => {\n        return column.set('type', getColumnTypeByName(schema, column.get('name')));\n      });\n      return tooltip\n        .setIn(['config', 'columns'], updatedColumns)\n        .setIn(['config', 'columns'], updatedColumns);\n    }\n  }\n];\n\nexport const currentMapTooltipSchema = _.last(mapTooltipSchemas);\n\nexport const packageTooltipForSave = (tooltip) => {\n  return Immutable.fromJS({ schema: currentMapTooltipSchema.version }).set('tooltip', tooltip);\n};\n\nexport const getCurrentTooltipFromProperties = (properties) => {\n  return Immutable.fromJS((_.last(properties.map_tooltips) as any).tooltip);\n};\n\nexport const canEditTooltips = session => session && _.get(session.get('abilities'), ['report', 'update']);\n\nexport const getBoundingBoxFromMeta = meta => {\n  const margin = 0.001;\n  return {\n    x1: meta.getIn(['bounds', 'x1']) - margin,\n    y1: meta.getIn(['bounds', 'y1']) - margin,\n    x2: meta.getIn(['bounds', 'x2']) + margin,\n    y2: meta.getIn(['bounds', 'y2']) + margin\n  };\n};\n\nexport const createMapLoaderGrid = (x1, x2, y1, y2, partitions) => {\n  const xPartitionSize = (x2 - x1) / partitions;\n  const yPartitionSize = (y2 - y1) / partitions;\n  const lngRange = _.range(x1, x2, xPartitionSize);\n  const latRange = _.range(y1, y2, yPartitionSize);\n\n  return _.reduce(lngRange, (outerGrid, lng) => {\n    return _.reduce(latRange, (grid, lat) => {\n      return grid.set('cells',\n        grid.get('cells').push(Map({\n          bounds: Map({\n            x1: lng,\n            y1: lat,\n            x2: lng + xPartitionSize,\n            y2: lat + yPartitionSize\n          }),\n          loaded: false,\n          loader: Promise.resolve()\n        }))\n      );\n    }, outerGrid);\n  }, Map({ cells: List(), x1, x2, y1, y2, xPartitionSize, yPartitionSize }));\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/map_constants.ts","module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js\n// module id = 46\n// module chunks = 0 1","'use strict';\n\nvar util = require('./util');\n\n/**\n * Methods mixed in to other classes for event capabilities.\n *\n * @mixin Evented\n */\nvar Evented = {\n\n    /**\n     * Adds a listener to a specified event type.\n     *\n     * @param {string} type The event type to add a listen for.\n     * @param {Function} listener The function to be called when the event is fired.\n     *   The listener function is called with the data object passed to `fire`,\n     *   extended with `target` and `type` properties.\n     * @returns {Object} `this`\n     */\n    on: function(type, listener) {\n        this._events = this._events || {};\n        this._events[type] = this._events[type] || [];\n        this._events[type].push(listener);\n\n        return this;\n    },\n\n    /**\n     * Removes a previously registered event listener.\n     *\n     * @param {string} [type] The event type to remove listeners for.\n     *   If none is specified, listeners will be removed for all event types.\n     * @param {Function} [listener] The listener function to remove.\n     *   If none is specified, all listeners will be removed for the event type.\n     * @returns {Object} `this`\n     */\n    off: function(type, listener) {\n        if (!type) {\n            // clear all listeners if no arguments specified\n            delete this._events;\n            return this;\n        }\n\n        if (!this.listens(type)) return this;\n\n        if (listener) {\n            var idx = this._events[type].indexOf(listener);\n            if (idx >= 0) {\n                this._events[type].splice(idx, 1);\n            }\n            if (!this._events[type].length) {\n                delete this._events[type];\n            }\n        } else {\n            delete this._events[type];\n        }\n\n        return this;\n    },\n\n    /**\n     * Adds a listener that will be called only once to a specified event type.\n     *\n     * The listener will be called first time the event fires after the listener is registered.\n     *\n     * @param {string} type The event type to listen for.\n     * @param {Function} listener The function to be called when the event is fired the first time.\n     * @returns {Object} `this`\n     */\n    once: function(type, listener) {\n        var wrapper = function(data) {\n            this.off(type, wrapper);\n            listener.call(this, data);\n        }.bind(this);\n        this.on(type, wrapper);\n        return this;\n    },\n\n    /**\n     * Fires an event of the specified type.\n     *\n     * @param {string} type The type of event to fire.\n     * @param {Object} [data] Data to be passed to any listeners.\n     * @returns {Object} `this`\n     */\n    fire: function(type, data) {\n        if (!this.listens(type)) {\n            // To ensure that no error events are dropped, print them to the\n            // console if they have no listeners.\n            if (util.endsWith(type, 'error')) {\n                console.error((data && data.error) || data || 'Empty error event');\n            }\n            return this;\n        }\n\n        data = util.extend({}, data);\n        util.extend(data, {type: type, target: this});\n\n        // make sure adding/removing listeners inside other listeners won't cause infinite loop\n        var listeners = this._events[type].slice();\n\n        for (var i = 0; i < listeners.length; i++) {\n            listeners[i].call(this, data);\n        }\n\n        return this;\n    },\n\n    /**\n     * Returns a Boolean indicating whether any listeners are registered for a specified event type.\n     *\n     * @param {string} type The event type to check.\n     * @returns {boolean} `true` if there is at least one registered listener for specified event type.\n     */\n    listens: function(type) {\n        return !!(this._events && this._events[type]);\n    }\n};\n\nmodule.exports = Evented;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/evented.js\n// module id = 47\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nexports.create = function (tagName, className, container) {\n    var el = document.createElement(tagName);\n    if (className) el.className = className;\n    if (container) container.appendChild(el);\n    return el;\n};\n\nvar docStyle = document.documentElement.style;\n\nfunction testProp(props) {\n    for (var i = 0; i < props.length; i++) {\n        if (props[i] in docStyle) {\n            return props[i];\n        }\n    }\n}\n\nvar selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']),\n    userSelect;\nexports.disableDrag = function () {\n    if (selectProp) {\n        userSelect = docStyle[selectProp];\n        docStyle[selectProp] = 'none';\n    }\n};\nexports.enableDrag = function () {\n    if (selectProp) {\n        docStyle[selectProp] = userSelect;\n    }\n};\n\nvar transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n    el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n    window.addEventListener('click', suppressClick, true);\n    window.setTimeout(function() {\n        window.removeEventListener('click', suppressClick, true);\n    }, 0);\n};\n\nexports.mousePos = function (el, e) {\n    var rect = el.getBoundingClientRect();\n    e = e.touches ? e.touches[0] : e;\n    return new Point(\n        e.clientX - rect.left - el.clientLeft,\n        e.clientY - rect.top - el.clientTop\n    );\n};\n\nexports.touchPos = function (el, e) {\n    var rect = el.getBoundingClientRect(),\n        points = [];\n    for (var i = 0; i < e.touches.length; i++) {\n        points.push(new Point(\n            e.touches[i].clientX - rect.left - el.clientLeft,\n            e.touches[i].clientY - rect.top - el.clientTop\n        ));\n    }\n    return points;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/browser/dom.js\n// module id = 48\n// module chunks = 0 1","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js\n// module id = 49\n// module chunks = 0 1","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js\n// module id = 50\n// module chunks = 0 1","var $export = require('./_export');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n  var S = String(defined(string));\n  var p1 = '<' + tag;\n  if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n  return p1 + '>' + S + '</' + tag + '>';\n};\nmodule.exports = function (NAME, exec) {\n  var O = {};\n  O[NAME] = exec(createHTML);\n  $export($export.P + $export.F * fails(function () {\n    var test = ''[NAME]('\"');\n    return test !== test.toLowerCase() || test.split('\"').length > 3;\n  }), 'String', O);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js\n// module id = 51\n// module chunks = 0 1","//  Underscore.string\n//  (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org>\n//  Underscore.string is freely distributable under the terms of the MIT license.\n//  Documentation: https://github.com/epeli/underscore.string\n//  Some code is borrowed from MooTools and Alexandru Marasteanu.\n//  Version '2.3.2'\n\n!function(root, String){\n  'use strict';\n\n  // Defining helper functions.\n\n  var nativeTrim = String.prototype.trim;\n  var nativeTrimRight = String.prototype.trimRight;\n  var nativeTrimLeft = String.prototype.trimLeft;\n\n  var parseNumber = function(source) { return source * 1 || 0; };\n\n  var strRepeat = function(str, qty){\n    if (qty < 1) return '';\n    var result = '';\n    while (qty > 0) {\n      if (qty & 1) result += str;\n      qty >>= 1, str += str;\n    }\n    return result;\n  };\n\n  var slice = [].slice;\n\n  var defaultToWhiteSpace = function(characters) {\n    if (characters == null)\n      return '\\\\s';\n    else if (characters.source)\n      return characters.source;\n    else\n      return '[' + _s.escapeRegExp(characters) + ']';\n  };\n\n  // Helper for toBoolean\n  function boolMatch(s, matchers) {\n    var i, matcher, down = s.toLowerCase();\n    matchers = [].concat(matchers);\n    for (i = 0; i < matchers.length; i += 1) {\n      matcher = matchers[i];\n      if (!matcher) continue;\n      if (matcher.test && matcher.test(s)) return true;\n      if (matcher.toLowerCase() === down) return true;\n    }\n  }\n\n  var escapeChars = {\n    lt: '<',\n    gt: '>',\n    quot: '\"',\n    amp: '&',\n    apos: \"'\"\n  };\n\n  var reversedEscapeChars = {};\n  for(var key in escapeChars) reversedEscapeChars[escapeChars[key]] = key;\n  reversedEscapeChars[\"'\"] = '#39';\n\n  // sprintf() for JavaScript 0.7-beta1\n  // http://www.diveintojavascript.com/projects/javascript-sprintf\n  //\n  // Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>\n  // All rights reserved.\n\n  var sprintf = (function() {\n    function get_type(variable) {\n      return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n    }\n\n    var str_repeat = strRepeat;\n\n    var str_format = function() {\n      if (!str_format.cache.hasOwnProperty(arguments[0])) {\n        str_format.cache[arguments[0]] = str_format.parse(arguments[0]);\n      }\n      return str_format.format.call(null, str_format.cache[arguments[0]], arguments);\n    };\n\n    str_format.format = function(parse_tree, argv) {\n      var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n      for (i = 0; i < tree_length; i++) {\n        node_type = get_type(parse_tree[i]);\n        if (node_type === 'string') {\n          output.push(parse_tree[i]);\n        }\n        else if (node_type === 'array') {\n          match = parse_tree[i]; // convenience purposes only\n          if (match[2]) { // keyword argument\n            arg = argv[cursor];\n            for (k = 0; k < match[2].length; k++) {\n              if (!arg.hasOwnProperty(match[2][k])) {\n                throw new Error(sprintf('[_.sprintf] property \"%s\" does not exist', match[2][k]));\n              }\n              arg = arg[match[2][k]];\n            }\n          } else if (match[1]) { // positional argument (explicit)\n            arg = argv[match[1]];\n          }\n          else { // positional argument (implicit)\n            arg = argv[cursor++];\n          }\n\n          if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {\n            throw new Error(sprintf('[_.sprintf] expecting number but found %s', get_type(arg)));\n          }\n          switch (match[8]) {\n            case 'b': arg = arg.toString(2); break;\n            case 'c': arg = String.fromCharCode(arg); break;\n            case 'd': arg = parseInt(arg, 10); break;\n            case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n            case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n            case 'o': arg = arg.toString(8); break;\n            case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;\n            case 'u': arg = Math.abs(arg); break;\n            case 'x': arg = arg.toString(16); break;\n            case 'X': arg = arg.toString(16).toUpperCase(); break;\n          }\n          arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);\n          pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';\n          pad_length = match[6] - String(arg).length;\n          pad = match[6] ? str_repeat(pad_character, pad_length) : '';\n          output.push(match[5] ? arg + pad : pad + arg);\n        }\n      }\n      return output.join('');\n    };\n\n    str_format.cache = {};\n\n    str_format.parse = function(fmt) {\n      var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n      while (_fmt) {\n        if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n          parse_tree.push(match[0]);\n        }\n        else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n          parse_tree.push('%');\n        }\n        else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n          if (match[2]) {\n            arg_names |= 1;\n            var field_list = [], replacement_field = match[2], field_match = [];\n            if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n              field_list.push(field_match[1]);\n              while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n                if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n                  field_list.push(field_match[1]);\n                }\n                else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n                  field_list.push(field_match[1]);\n                }\n                else {\n                  throw new Error('[_.sprintf] huh?');\n                }\n              }\n            }\n            else {\n              throw new Error('[_.sprintf] huh?');\n            }\n            match[2] = field_list;\n          }\n          else {\n            arg_names |= 2;\n          }\n          if (arg_names === 3) {\n            throw new Error('[_.sprintf] mixing positional and named placeholders is not (yet) supported');\n          }\n          parse_tree.push(match);\n        }\n        else {\n          throw new Error('[_.sprintf] huh?');\n        }\n        _fmt = _fmt.substring(match[0].length);\n      }\n      return parse_tree;\n    };\n\n    return str_format;\n  })();\n\n\n\n  // Defining underscore.string\n\n  var _s = {\n\n    VERSION: '2.3.0',\n\n    isBlank: function(str){\n      if (str == null) str = '';\n      return (/^\\s*$/).test(str);\n    },\n\n    stripTags: function(str){\n      if (str == null) return '';\n      return String(str).replace(/<\\/?[^>]+>/g, '');\n    },\n\n    capitalize : function(str){\n      str = str == null ? '' : String(str);\n      return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n\n    chop: function(str, step){\n      if (str == null) return [];\n      str = String(str);\n      step = ~~step;\n      return step > 0 ? str.match(new RegExp('.{1,' + step + '}', 'g')) : [str];\n    },\n\n    clean: function(str){\n      return _s.strip(str).replace(/\\s+/g, ' ');\n    },\n\n    count: function(str, substr){\n      if (str == null || substr == null) return 0;\n\n      str = String(str);\n      substr = String(substr);\n\n      var count = 0,\n        pos = 0,\n        length = substr.length;\n\n      while (true) {\n        pos = str.indexOf(substr, pos);\n        if (pos === -1) break;\n        count++;\n        pos += length;\n      }\n\n      return count;\n    },\n\n    chars: function(str) {\n      if (str == null) return [];\n      return String(str).split('');\n    },\n\n    swapCase: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/\\S/g, function(c){\n        return c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase();\n      });\n    },\n\n    escapeHTML: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/[&<>\"']/g, function(m){ return '&' + reversedEscapeChars[m] + ';'; });\n    },\n\n    unescapeHTML: function(str) {\n      if (str == null) return '';\n      return String(str).replace(/\\&([^;]+);/g, function(entity, entityCode){\n        var match;\n\n        if (entityCode in escapeChars) {\n          return escapeChars[entityCode];\n        } else if (match = entityCode.match(/^#x([\\da-fA-F]+)$/)) {\n          return String.fromCharCode(parseInt(match[1], 16));\n        } else if (match = entityCode.match(/^#(\\d+)$/)) {\n          return String.fromCharCode(~~match[1]);\n        } else {\n          return entity;\n        }\n      });\n    },\n\n    escapeRegExp: function(str){\n      if (str == null) return '';\n      return String(str).replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n    },\n\n    splice: function(str, i, howmany, substr){\n      var arr = _s.chars(str);\n      arr.splice(~~i, ~~howmany, substr);\n      return arr.join('');\n    },\n\n    insert: function(str, i, substr){\n      return _s.splice(str, i, 0, substr);\n    },\n\n    include: function(str, needle){\n      if (needle === '') return true;\n      if (str == null) return false;\n      return String(str).indexOf(needle) !== -1;\n    },\n\n    join: function() {\n      var args = slice.call(arguments),\n        separator = args.shift();\n\n      if (separator == null) separator = '';\n\n      return args.join(separator);\n    },\n\n    lines: function(str) {\n      if (str == null) return [];\n      return String(str).split(\"\\n\");\n    },\n\n    reverse: function(str){\n      return _s.chars(str).reverse().join('');\n    },\n\n    startsWith: function(str, starts){\n      if (starts === '') return true;\n      if (str == null || starts == null) return false;\n      str = String(str); starts = String(starts);\n      return str.length >= starts.length && str.slice(0, starts.length) === starts;\n    },\n\n    endsWith: function(str, ends){\n      if (ends === '') return true;\n      if (str == null || ends == null) return false;\n      str = String(str); ends = String(ends);\n      return str.length >= ends.length && str.slice(str.length - ends.length) === ends;\n    },\n\n    succ: function(str){\n      if (str == null) return '';\n      str = String(str);\n      return str.slice(0, -1) + String.fromCharCode(str.charCodeAt(str.length-1) + 1);\n    },\n\n    titleize: function(str){\n      if (str == null) return '';\n      str  = String(str).toLowerCase();\n      return str.replace(/(?:^|\\s|-)\\S/g, function(c){ return c.toUpperCase(); });\n    },\n\n    camelize: function(str){\n      return _s.trim(str).replace(/[-_\\s]+(.)?/g, function(match, c){ return c ? c.toUpperCase() : \"\"; });\n    },\n\n    underscored: function(str){\n      return _s.trim(str).replace(/([a-z\\d])([A-Z]+)/g, '$1_$2').replace(/[-\\s]+/g, '_').toLowerCase();\n    },\n\n    dasherize: function(str){\n      return _s.trim(str).replace(/([A-Z])/g, '-$1').replace(/[-_\\s]+/g, '-').toLowerCase();\n    },\n\n    classify: function(str){\n      return _s.titleize(String(str).replace(/[\\W_]/g, ' ')).replace(/\\s/g, '');\n    },\n\n    humanize: function(str){\n      return _s.capitalize(_s.underscored(str).replace(/_id$/,'').replace(/_/g, ' '));\n    },\n\n    trim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrim) return nativeTrim.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp('\\^' + characters + '+|' + characters + '+$', 'g'), '');\n    },\n\n    ltrim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrimLeft) return nativeTrimLeft.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp('^' + characters + '+'), '');\n    },\n\n    rtrim: function(str, characters){\n      if (str == null) return '';\n      if (!characters && nativeTrimRight) return nativeTrimRight.call(str);\n      characters = defaultToWhiteSpace(characters);\n      return String(str).replace(new RegExp(characters + '+$'), '');\n    },\n\n    truncate: function(str, length, truncateStr){\n      if (str == null) return '';\n      str = String(str); truncateStr = truncateStr || '...';\n      length = ~~length;\n      return str.length > length ? str.slice(0, length) + truncateStr : str;\n    },\n\n    /**\n     * _s.prune: a more elegant version of truncate\n     * prune extra chars, never leaving a half-chopped word.\n     * @author github.com/rwz\n     */\n    prune: function(str, length, pruneStr){\n      if (str == null) return '';\n\n      str = String(str); length = ~~length;\n      pruneStr = pruneStr != null ? String(pruneStr) : '...';\n\n      if (str.length <= length) return str;\n\n      var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },\n        template = str.slice(0, length+1).replace(/.(?=\\W*\\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'\n\n      if (template.slice(template.length-2).match(/\\w\\w/))\n        template = template.replace(/\\s*\\S+$/, '');\n      else\n        template = _s.rtrim(template.slice(0, template.length-1));\n\n      return (template+pruneStr).length > str.length ? str : str.slice(0, template.length)+pruneStr;\n    },\n\n    words: function(str, delimiter) {\n      if (_s.isBlank(str)) return [];\n      return _s.trim(str, delimiter).split(delimiter || /\\s+/);\n    },\n\n    pad: function(str, length, padStr, type) {\n      str = str == null ? '' : String(str);\n      length = ~~length;\n\n      var padlen  = 0;\n\n      if (!padStr)\n        padStr = ' ';\n      else if (padStr.length > 1)\n        padStr = padStr.charAt(0);\n\n      switch(type) {\n        case 'right':\n          padlen = length - str.length;\n          return str + strRepeat(padStr, padlen);\n        case 'both':\n          padlen = length - str.length;\n          return strRepeat(padStr, Math.ceil(padlen/2)) + str\n                  + strRepeat(padStr, Math.floor(padlen/2));\n        default: // 'left'\n          padlen = length - str.length;\n          return strRepeat(padStr, padlen) + str;\n        }\n    },\n\n    lpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr);\n    },\n\n    rpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr, 'right');\n    },\n\n    lrpad: function(str, length, padStr) {\n      return _s.pad(str, length, padStr, 'both');\n    },\n\n    sprintf: sprintf,\n\n    vsprintf: function(fmt, argv){\n      argv.unshift(fmt);\n      return sprintf.apply(null, argv);\n    },\n\n    toNumber: function(str, decimals) {\n      if (!str) return 0;\n      str = _s.trim(str);\n      if (!str.match(/^-?\\d+(?:\\.\\d+)?$/)) return NaN;\n      return parseNumber(parseNumber(str).toFixed(~~decimals));\n    },\n\n    numberFormat : function(number, dec, dsep, tsep) {\n      if (isNaN(number) || number == null) return '';\n\n      number = number.toFixed(~~dec);\n      tsep = typeof tsep == 'string' ? tsep : ',';\n\n      var parts = number.split('.'), fnums = parts[0],\n        decimals = parts[1] ? (dsep || '.') + parts[1] : '';\n\n      return fnums.replace(/(\\d)(?=(?:\\d{3})+$)/g, '$1' + tsep) + decimals;\n    },\n\n    strRight: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.indexOf(sep);\n      return ~pos ? str.slice(pos+sep.length, str.length) : str;\n    },\n\n    strRightBack: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.lastIndexOf(sep);\n      return ~pos ? str.slice(pos+sep.length, str.length) : str;\n    },\n\n    strLeft: function(str, sep){\n      if (str == null) return '';\n      str = String(str); sep = sep != null ? String(sep) : sep;\n      var pos = !sep ? -1 : str.indexOf(sep);\n      return ~pos ? str.slice(0, pos) : str;\n    },\n\n    strLeftBack: function(str, sep){\n      if (str == null) return '';\n      str += ''; sep = sep != null ? ''+sep : sep;\n      var pos = str.lastIndexOf(sep);\n      return ~pos ? str.slice(0, pos) : str;\n    },\n\n    toSentence: function(array, separator, lastSeparator, serial) {\n      separator = separator || ', ';\n      lastSeparator = lastSeparator || ' and ';\n      var a = array.slice(), lastMember = a.pop();\n\n      if (array.length > 2 && serial) lastSeparator = _s.rtrim(separator) + lastSeparator;\n\n      return a.length ? a.join(separator) + lastSeparator + lastMember : lastMember;\n    },\n\n    toSentenceSerial: function() {\n      var args = slice.call(arguments);\n      args[3] = true;\n      return _s.toSentence.apply(_s, args);\n    },\n\n    slugify: function(str) {\n      if (str == null) return '';\n\n      var from  = \"ąàáäâãåæăćęèéëêìíïîłńòóöôõøśșțùúüûñçżź\",\n          to    = \"aaaaaaaaaceeeeeiiiilnoooooosstuuuunczz\",\n          regex = new RegExp(defaultToWhiteSpace(from), 'g');\n\n      str = String(str).toLowerCase().replace(regex, function(c){\n        var index = from.indexOf(c);\n        return to.charAt(index) || '-';\n      });\n\n      return _s.dasherize(str.replace(/[^\\w\\s-]/g, ''));\n    },\n\n    surround: function(str, wrapper) {\n      return [wrapper, str, wrapper].join('');\n    },\n\n    quote: function(str, quoteChar) {\n      return _s.surround(str, quoteChar || '\"');\n    },\n\n    unquote: function(str, quoteChar) {\n      quoteChar = quoteChar || '\"';\n      if (str[0] === quoteChar && str[str.length-1] === quoteChar)\n        return str.slice(1,str.length-1);\n      else return str;\n    },\n\n    exports: function() {\n      var result = {};\n\n      for (var prop in this) {\n        if (!this.hasOwnProperty(prop) || prop.match(/^(?:include|contains|reverse)$/)) continue;\n        result[prop] = this[prop];\n      }\n\n      return result;\n    },\n\n    repeat: function(str, qty, separator){\n      if (str == null) return '';\n\n      qty = ~~qty;\n\n      // using faster implementation if separator is not needed;\n      if (separator == null) return strRepeat(String(str), qty);\n\n      // this one is about 300x slower in Google Chrome\n      for (var repeat = []; qty > 0; repeat[--qty] = str) {}\n      return repeat.join(separator);\n    },\n\n    naturalCmp: function(str1, str2){\n      if (str1 == str2) return 0;\n      if (!str1) return -1;\n      if (!str2) return 1;\n\n      var cmpRegex = /(\\.\\d+)|(\\d+)|(\\D+)/g,\n        tokens1 = String(str1).toLowerCase().match(cmpRegex),\n        tokens2 = String(str2).toLowerCase().match(cmpRegex),\n        count = Math.min(tokens1.length, tokens2.length);\n\n      for(var i = 0; i < count; i++) {\n        var a = tokens1[i], b = tokens2[i];\n\n        if (a !== b){\n          var num1 = parseInt(a, 10);\n          if (!isNaN(num1)){\n            var num2 = parseInt(b, 10);\n            if (!isNaN(num2) && num1 - num2)\n              return num1 - num2;\n          }\n          return a < b ? -1 : 1;\n        }\n      }\n\n      if (tokens1.length === tokens2.length)\n        return tokens1.length - tokens2.length;\n\n      return str1 < str2 ? -1 : 1;\n    },\n\n    levenshtein: function(str1, str2) {\n      if (str1 == null && str2 == null) return 0;\n      if (str1 == null) return String(str2).length;\n      if (str2 == null) return String(str1).length;\n\n      str1 = String(str1); str2 = String(str2);\n\n      var current = [], prev, value;\n\n      for (var i = 0; i <= str2.length; i++)\n        for (var j = 0; j <= str1.length; j++) {\n          if (i && j)\n            if (str1.charAt(j - 1) === str2.charAt(i - 1))\n              value = prev;\n            else\n              value = Math.min(current[j], current[j - 1], prev) + 1;\n          else\n            value = i + j;\n\n          prev = current[j];\n          current[j] = value;\n        }\n\n      return current.pop();\n    },\n\n    toBoolean: function(str, trueValues, falseValues) {\n      if (typeof str === \"number\") str = \"\" + str;\n      if (typeof str !== \"string\") return !!str;\n      str = _s.trim(str);\n      if (boolMatch(str, trueValues || [\"true\", \"1\"])) return true;\n      if (boolMatch(str, falseValues || [\"false\", \"0\"])) return false;\n    }\n  };\n\n  // Aliases\n\n  _s.strip    = _s.trim;\n  _s.lstrip   = _s.ltrim;\n  _s.rstrip   = _s.rtrim;\n  _s.center   = _s.lrpad;\n  _s.rjust    = _s.lpad;\n  _s.ljust    = _s.rpad;\n  _s.contains = _s.include;\n  _s.q        = _s.quote;\n  _s.toBool   = _s.toBoolean;\n\n  // Exporting\n\n  // CommonJS module is defined\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports)\n      module.exports = _s;\n\n    exports._s = _s;\n  }\n\n  // Register as a named module with AMD.\n  if (typeof define === 'function' && define.amd)\n    define('underscore.string', [], function(){ return _s; });\n\n\n  // Integrate with Underscore.js if defined\n  // or create our own underscore object.\n  root._ = root._ || {};\n  root._.string = root._.str = _s;\n}(this, String);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/underscore.string/lib/underscore.string.js\n// module id = 52\n// module chunks = 0 1","import _ from 'lodash';\nimport Backbone from 'backbone';\nimport $ from 'jquery';\nimport JST from './templates';\nimport api from '@opengov/og_api';\n\nimport './handlebars_helpers';\n\nexport { api };\n\nconst closeItems = [];\nfunction closeOpenItems() {\n  _.each(closeItems, function(item) {\n    if (item.isOpen) {\n      if (!item.selfClicked) {\n        item.close();\n        item.isOpen = false;\n      } else {\n        item.selfClicked = false;\n      }\n    }\n  });\n}\n$('body').on('click', closeOpenItems);\n\nexport const View = Backbone.View.extend({\n  tagName: 'athena',\n\n  constructor(options) {\n    this.views = {};\n    this.options = options || {};\n    if (options) {\n      if (options.template) {\n        this.template = options.template;\n      }\n      if (options.placeholder) {\n        this.placeholder = options.placeholder;\n      }\n    }\n    Backbone.View.prototype.constructor.call(this, options);\n  },\n\n  view(name, viewId, view) {\n    if (arguments.length === 2) {\n      view = viewId;\n    }\n    if (arguments.length === 3) {\n      name = name + '__' + viewId;\n      view.viewId = viewId;\n    }\n    if (arguments.length === 1) {\n      view = this.views[name];\n    } else {\n      view.parentView = this;\n      this.views[name] = view;\n    }\n    return view;\n  },\n\n  remove() {\n    this.$el.replaceWith(this.$placeholder);\n    Backbone.View.prototype.remove.call(this);\n    this.stopListening();\n    return this;\n  },\n\n  //Views can provide an isSelfClick function to determine what\n  //qualifies as a \"self click\" (main use case is parent containers\n  //with larger dimensions than all of its contained children)\n\n  registerCloseItem(isSelfClick) {\n    const self = this;\n    closeItems.push(this);\n    this.$el.on('click', function(e) {\n      self.selfClicked = _.isFunction(isSelfClick) ? isSelfClick(e) : true;\n    });\n  },\n\n  popup(uri, name, features) {\n    window.open(uri, name, features);\n  },\n\n  viewData(data) {\n    if (data) {\n      this._viewData = data;\n      return;\n    }\n\n    if (this._viewData) {\n      return this._viewData;\n    }\n\n    return this;\n  },\n\n  find(prefix, id) {\n    return this.$('#' + prefix + '_' + id);\n  },\n\n  getParent() {\n    if (this.parentView) {\n      return this.parentView.$el;\n    }\n    return $('body');\n  },\n\n  stopListening() {\n    (Backbone.Events as any).stopListening.apply(this, arguments);\n    _.each(this.views, function(view) {\n      view.stopListening();\n    });\n  },\n\n  render(replaceContainer) {\n    if (this.template) {\n      const placeholder = exports.renderTo(\n        this.getParent(),\n        this.$el,\n        this.template,\n        this.placeholder,\n        this.viewId,\n        this.viewData(),\n        replaceContainer);\n\n      if (placeholder) {\n        this.$placeholder = placeholder;\n      }\n\n      this.setElement(this.el);\n    }\n\n    _.each(this.views, function(view) {\n      view.render();\n    });\n  }\n});\n\nexport const renderTo = function($parent, $el, template, placeholder, id, data, replaceContainer) {\n  let $container;\n  let templateId;\n\n  placeholder = placeholder || template;\n  templateId = !_.isUndefined(id) ? placeholder + '__' + id : placeholder;\n\n  $container = $parent.find('#template-' + templateId);\n  if (!$container.length) {\n    throw new Error('Could not find placeholder render element ' + templateId);\n  }\n\n  const templateName = $container.data('template') || ('athena/' + template);\n  const templateFunc = JST[templateName];\n\n  if (!templateFunc) {\n    throw new Error('Could not find handlebars template: ' + templateName);\n  }\n\n  $el.html(templateFunc(data));\n\n  // Figure out what's going on here...\n  if (replaceContainer || !$container.hasClass('inserted')) {\n    $el.addClass('inserted');\n    $el.attr('id', $container.attr('id'));\n    $container.replaceWith($el);\n    return $container;\n  }\n};\n\nexport const svgSupported = function() {\n  return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Shape', '1.1');\n};\n\nexport const colorIntTohtmlRGB = function(i) {\n  const r = (i >> 16 & 255);\n  const g = (i >> 8 & 255);\n  const b = (i & 255);\n\n  return 'rgb(' + r + ',' + g + ',' + b + ')';\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/og.ts","import * as Immutable from 'immutable';\nimport { findColumnByName } from './schema_utils';\nimport utils from '../querygrid/utils';\nimport strings from '../strings';\nimport _ from 'lodash';\nimport { columnTypeToNumberType } from '../numberTypes';\n\nexport const isMultipleAmountColumnsEnabled = (entity) => _.some(entity.attributes.feature_permissions, fp => fp === 'multiple_amount_columns');\n\n/**\n * Constants of supported amount types.\n *\n * Incremental - amounts for each period is the total of only the transactions dated during that period\n * Cumulative - amounts for each period is the total of previous periods plus the total of transactions during that period\n *              (totals accumulate over each period)\n */\nexport const AmountsTypes = {\n  Incremental: 'incremental',\n  Cumulative: 'cumulative'\n};\n\nexport type IAmountType = 'incremental' | 'cumulative';\n\n/**\n * Creates a Immutable.OrderedMap indexing it using the provided `keyProperty`\n *\n * @param {Immutable.List} transactions - A collection of transactions to be converted to an ordered map\n * @param {string} keyProperty - The name of the property on each transaction object to be used as keys in the created map\n * @returns {Immutable.OrderedMap}\n */\nexport const toMap = (transactions, keyProperty) =>\n  transactions.reduce((r, t) => r.set(t.get(keyProperty), t), Immutable.OrderedMap());\n\n/**\n * Converts the transaction amounts from incremental to cumulative.\n *\n * @param {Immutable.List} aggregates - A collection of aggregate results from the query endpoint\n * @param {string} breakdownColumn - The column used for the breakdown\n * @param {string} amountColumn - The column used for the amounts\n * @returns {Immutable.List}\n */\nexport const convertToCumulativeAmounts = (aggregates, breakdownColumn, amountColumn) => {\n  let prev = Immutable.OrderedMap();\n  const aggs = aggregates || Immutable.List();\n  return aggs.map(agg => {\n    return agg.update('transactions', trans => {\n      prev = prev.mergeWith((prevVal: any, nextVal: any) => {\n        return prevVal.update(amountColumn, amt => amt + nextVal.get(amountColumn));\n      }, toMap(trans, breakdownColumn));\n      return prev.toList();\n    });\n  });\n};\n\n/**\n * Filter visible amount columns or default amount column if all amount columns are hidden\n *\n * @param {Immutable.List} schema - A collection that contains the schema\n * @returns { {Immutable.List} , {boolean} }\n */\nexport const filterAmountColumns = (visualization) => {\n  const amountColumnOptions = visualization.get('amountColumns');\n  // Filter out only the visible columns\n  return amountColumnOptions ? amountColumnOptions.filter((column) => column.get('visible') === true) : {};\n};\n\n/**\n * Filter breakdown according to the visible columns\n * @param {Immutable.List} visualization - An object that contains the visualization\n * @returns {Immutable.List}\n */\nexport const filterBreakdown = (visualization) => {\n  const breakdowns = visualization.get('breakdownColumns');\n  return breakdowns ? breakdowns.filter((column) => column.get('visible') === true) : {};\n};\n\n/**\n * Update visible parameter in the columns\n * @param {Immutable.List} columns - A collection of columns\n * @param {string} columnId - column Id\n * @param {boolean} visibility - A boolean to determine the visibility of the column\n * @returns { {Immutable.List} }\n */\nexport const getUpdatedHiddenColumns = (columns, columnId, visibility) => {\n  return columns.size > 0 ? columns.update(\n   columns.findIndex(\n      (breakdownAmountColumn) => breakdownAmountColumn.get('id') === columnId),\n      (breakdownAmountColumn) => {\n        const columnVisibility = visibility ? visibility : !breakdownAmountColumn.get('visible');\n        return breakdownAmountColumn.set('visible', columnVisibility);\n      }\n  ) : columns;\n};\n\n/**\n * reset visible parameter in the columns when action is cancelled\n * @param {Immutable.List} columns - A collection of columns\n * @param {string} columnId - column Id\n * @param {boolean} visibility - A boolean to determine the visibility of the column\n * @returns { {Immutable.List} }\n */\nexport const getUpdatedResetColumns = (columns, columnId) => {\n  return columns.update(\n   columns.findIndex(\n      (breakdownAmountColumn) => columnId === breakdownAmountColumn.get('id')),\n      (breakdownAmountColumn) => {\n        return breakdownAmountColumn.set('visible', !breakdownAmountColumn.get('visible'));\n      }\n  );\n};\n\n/**\n * Filter amount columns according to the visible columns\n * @param {Immutable.List} stateColumns - A collection of available amount columns\n * @returns {Array}\n */\nexport const getVisibleAmountColumns = (stateColumns) => {\n  return stateColumns ? _.map(stateColumns.filter((column) => column.get('visible') === true).toJS(), 'id') : [];\n};\n/**\n * Formats units based on their type\n *\n * @param {Immutable.List} schema - A collection that contains the schema of the report\n * @param {string} amountColumnName - The column used for the amounts\n * @param {string} units - The units that need to be formatted\n * @returns {string}\n */\nexport const formatUnits = (schema, amountColumnName, units, showCurrencySymbol = true) => {\n  if (!_.isUndefined(units) && !_.isNull(units)) {\n    const targetCol = findColumnByName(schema, amountColumnName);\n    const targetColType = targetCol ? targetCol.get('type') : 'monetary';\n    const reportAmountType = columnTypeToNumberType(targetColType, schema.get('locale'));\n    if (targetColType === 'monetary') {\n      const formattedUnits = showCurrencySymbol ? reportAmountType.formatter(utils.formatMonetary(units)) : utils.formatMonetary(units);\n      return formattedUnits;\n    } else {\n      return strings.addCommasKeepDecimal(units);\n    }\n  }\n\n  return null;\n};\n\n/**\n * Get the amount column from the visualization object\n *\n * @param {Immutable.List} visualization - A collection that contains the visualization object\n * @returns {string}\n */\nexport const getAmountColumn = (visualization, schema) => {\n  if (visualization && visualization.get('amountColumn')) {\n    return visualization.get('amountColumn');\n  }\n  // If for any reason the visualization object doesn't contain the amountColumn\n  // use the amountColumn from schema\n  return schema.get('amountColumn');\n};\n\nfunction isLedgerTree(treeId) {\n  return _.includes(['expenses', 'revenues', 'assets', 'liabilities', 'fteCount'], treeId);\n}\n\nexport const coaNodesToLinkageNodes = (nodes, nodesForLinkage) => {\n  const nodesWithTreesExpanded = _.reduce(nodes, (acc, node: { isTree, id, children }) => {\n    // If a tree is fully selected we can just exclude it from the linkage nodes query.\n    // But if the tree is a ledger tree, we must still send up each of the root ledger nodes.\n    if (node.isTree) {\n      if (isLedgerTree(node.id)) {\n        return acc.concat(node.children);\n      }\n\n      return acc;\n    }\n\n    return acc.concat(node);\n  }, []);\n\n  // Produce an object that indexes trees and their categories by ID.\n  // {\n  //   'tree_id': { 'category_0': [node_0, node_1, ...] }\n  // }\n  const trees = _.reduce(nodesWithTreesExpanded, (acc, node) => {\n    const treeId = isLedgerTree(node.tree_id) ? 'ledger_tree' : node.tree_id;\n    const categories = acc[treeId] || (acc[treeId] = {});\n    const memberIds = node.memberIds || [node.id];\n    _.each(memberIds, (member) => {\n      const depth = nodesForLinkage[member]['depth'];\n      if (categories[depth]) {\n        categories[depth].push(member);\n      } else {\n        categories[depth] = [member];\n      }\n    });\n\n    return acc;\n  }, {});\n\n  return _.reduce(trees, (acc, categories: any, treeId) => {\n    return acc.concat(..._.map(categories, (categoryNodes, depth: any) => {\n      return {\n        tree_id: treeId,\n        category: parseInt(depth),\n        selected_node_ids: categoryNodes\n      };\n    }));\n  }, []);\n};\n\n\nexport const getMaskNodesForLinkage = (masksForLinkage, nodesForLinkage) => {\n  /***\n   * TODO: REP-1495 This can be merged as part of linkage node as a separate attributed\n  ***/\n\n\n  /***\n   * Produce an object that indexes trees and their categories by ID.\n   * {\n   *   'tree_id': { 'category_0': [node_0, node_1, ...] }\n   * }\n  ***/\n\n\n  const mask_node_array = masksForLinkage['nodes'];\n\n  if(!Array.isArray(mask_node_array) || !mask_node_array.length){\n    return [];\n  }\n\n  const trees = _.reduce(mask_node_array, (acc, node) => {\n    const treeId = isLedgerTree(node.tree_id) ? 'ledger_tree' : node.tree_id;\n    const categories = acc[treeId] || (acc[treeId] = {});\n    var memberIds = node.memberIds;\n    if(!Array.isArray(memberIds) || !memberIds.length){\n       memberIds = [node.id];\n    }\n    _.each(memberIds, (member) => {\n      const depth = nodesForLinkage[member]['depth'];\n      if (categories[depth]) {\n        categories[depth].push(member);\n      } else {\n        categories[depth] = [member];\n      }\n    });\n\n    return acc;\n  }, {});\n\n  return _.reduce(trees, (acc, categories: any, treeId) => {\n    return acc.concat(..._.map(categories, (categoryNodes, depth: any) => {\n      return {\n        tree_id: treeId,\n        category: parseInt(depth),\n        masked_node_ids: categoryNodes\n      };\n    }));\n  }, []);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/transactions_utils.ts","'use strict';\n\nvar util = require('./util');\n\n/**\n * Methods mixed in to other classes for event capabilities.\n * @mixin Evented\n */\nvar Evented = {\n\n    /**\n     * Subscribe to a specified event with a listener function the latter gets the data object that was passed to `fire` and additionally `target` and `type` properties\n     *\n     * @param {string} type Event type\n     * @param {Function} listener Function to be called when the event is fired\n     * @returns {Object} `this`\n     */\n    on: function(type, listener) {\n        this._events = this._events || {};\n        this._events[type] = this._events[type] || [];\n        this._events[type].push(listener);\n\n        return this;\n    },\n\n    /**\n     * Remove a event listener\n     *\n     * @param {string} [type] Event type. If none is specified, remove all listeners\n     * @param {Function} [listener] Function to be called when the event is fired. If none is specified all listeners are removed\n     * @returns {Object} `this`\n     */\n    off: function(type, listener) {\n        if (!type) {\n            // clear all listeners if no arguments specified\n            delete this._events;\n            return this;\n        }\n\n        if (!this.listens(type)) return this;\n\n        if (listener) {\n            var idx = this._events[type].indexOf(listener);\n            if (idx >= 0) {\n                this._events[type].splice(idx, 1);\n            }\n            if (!this._events[type].length) {\n                delete this._events[type];\n            }\n        } else {\n            delete this._events[type];\n        }\n\n        return this;\n    },\n\n    /**\n     * Call a function once when an event has fired\n     *\n     * @param {string} type Event type.\n     * @param {Function} listener Function to be called once when the event is fired\n     * @returns {Object} `this`\n     */\n    once: function(type, listener) {\n        var wrapper = function(data) {\n            this.off(type, wrapper);\n            listener.call(this, data);\n        }.bind(this);\n        this.on(type, wrapper);\n        return this;\n    },\n\n    /**\n     * Fire event of a given string type with the given data object\n     *\n     * @param {string} type Event type\n     * @param {Object} [data] Optional data passed to the event receiver (e.g. {@link EventData})\n     * @returns {Object} `this`\n     */\n    fire: function(type, data) {\n        if (!this.listens(type)) return this;\n\n        data = util.extend({}, data);\n        util.extend(data, {type: type, target: this});\n\n        // make sure adding/removing listeners inside other listeners won't cause infinite loop\n        var listeners = this._events[type].slice();\n\n        for (var i = 0; i < listeners.length; i++) {\n            listeners[i].call(this, data);\n        }\n\n        return this;\n    },\n\n    /**\n     * Check if an event is registered to a type\n     * @param {string} type Event type\n     * @returns {boolean} `true` if there is at least one registered listener for events of type `type`\n     */\n    listens: function(type) {\n        return !!(this._events && this._events[type]);\n    }\n};\n\nmodule.exports = Evented;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/evented.js\n// module id = 55\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\n\nconst WizardStep = {\n  propTypes: {\n    report: PropTypes.object.isRequired,\n    onNextStep: PropTypes.func\n  },\n\n  _isMounted: null,\n\n  render() {\n    if (this.state.loading) {\n      return (\n        <div>\n          <div className=\"ui-loading\" />\n        </div>\n      );\n    }\n\n    return (\n      <div>\n        <footer className=\"ui-panel__footer\">\n          {this.renderFooter ? this.renderFooter() : this.renderActions()}\n        </footer>\n        {!this.props.report.isNew() ?\n          <header className=\"ui-panel__sub-header\">\n            <h4>\n              <a className=\"ui-panel__back\" onClick={SettingsPanelActions.goBack}>Back</a>\n              Report data\n            </h4>\n          </header>\n        : null}\n        {this.props.report.isNew() && this.renderHeader ?\n          <header className=\"ui-panel__sub-header\">{this.renderHeader()}</header>\n        : null}\n        <div className=\"ui-panel__content ui-container_scroll\">\n          {this.renderContent()}\n        </div>\n      </div>\n      );\n  },\n\n  renderActions() {\n    let nextButtonText = 'Next';\n\n    if (this.props.isLastStep) {\n      if (this.props.report.isNew()) {\n        nextButtonText = this.props.saving ? 'Creating...' : 'Create';\n      } else {\n        nextButtonText = this.props.saving ? 'Saving...' : 'Save';\n      }\n    }\n\n    return (\n      <div>\n        {this.props.canGoBack ?\n          <button className=\"ui-button pull-left back\" onClick={this.prevStep}>\n            <span className=\"icon-left-1\" />\n            Back\n          </button> : null}\n\n        <div className=\"ui-panel__actions\">\n          <button className=\"ui-button ghost\" onClick={this.cancel}>Cancel</button>\n          {!this.props.isFirstStep ?\n            <button className=\"ui-button primary\" disabled={!this.isValid() || this.props.saving} onClick={this.handleClickNext}>{nextButtonText}</button>\n          : null }\n        </div>\n      </div>\n    );\n  },\n\n  componentDidMount() {\n    this._isMounted = true;\n    this.props.report.on('change', this.handleChange, this);\n  },\n\n  componentWillUmount() {\n    this._isMounted = false;\n    this.props.report.off(null, null, this);\n  },\n\n  handleChange() {\n    this._isMounted && this.forceUpdate();\n  },\n\n  handleClickNext() {\n    this.nextStep();\n  },\n\n  nextStep(skip) {\n    const onNextStep = this.props.onNextStep;\n    if (onNextStep && this.isValid()) {\n      onNextStep(skip);\n    }\n  },\n\n  prevStep() {\n    this.props.onPrevStep && this.props.onPrevStep();\n  },\n\n  cancel() {\n    this.props.onCancel && this.props.onCancel();\n  }\n};\n\n\nexport default WizardStep;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/wizard_step_mixin.tsx","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_has.js\n// module id = 57\n// module chunks = 0 1","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js\n// module id = 58\n// module chunks = 0 1","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js\n// module id = 59\n// module chunks = 0 1","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js\n// module id = 60\n// module chunks = 0 1","import _ from 'lodash';\n\nimport { BaseStore, Dispatcher } from '@opengov/og_flux';\n\nclass SessionStore extends BaseStore {\n  constructor() {\n    super();\n\n    this._session = null;\n    this._onSessionChange = null;\n\n    Dispatcher.register(payload => this._handleAction(payload.action));\n  }\n\n  getSession = () => {\n    return this._session;\n  }\n\n  getEntity = () => {\n    if (!this._session || this._session.isOpenGov()) {\n      return null;\n    }\n\n    return this._session && this._session.entity.toJSON();\n  }\n\n  // NOTE: The meat of this function should probably live in og_analytics,\n  //       but it has outstanding PRs that other projects are relying on.\n  //       Once those are merged, we can move this over there.\n  analyticsIdentify() {\n    if (this._session) {\n      const session = this._session;\n      const entity = session.entity;\n      const email = session.attributes.email;\n\n      if (entity && email) {\n        const role = session.attributes.role && session.attributes.role.name;\n        window.intercomSettings = {\n          email: email,\n          user_id: session.attributes.id,\n          role: role,\n          full_name: session.attributes.full_name,\n          app_id: window.gon && window.gon.intercomAppId,\n          user_hash: session.attributes.user_intercom_hash,\n          company: {\n            id: entity.attributes.entity_id,\n            name: entity.attributes.name,\n            created_at: entity.attributes.created_at\n          }\n        };\n        if (window.heap) {\n          const identityHash = {\n            og_user_id: session.attributes.id,\n            role: role,\n            subdomain: entity.attributes.subdomain\n          };\n          window.heap.identify(email);\n          window.heap.addUserProperties(identityHash);\n        }\n      }\n    }\n  }\n\n  hasFeaturePermission = (feature) => {\n    if (!this._session) {\n      return false;\n    }\n\n    // OpenGov users should have all features enabled.\n    if (this._session.isOpenGov()) {\n      return true;\n    }\n\n    return _.contains(this._session.get('feature_permissions'), feature);\n  }\n\n  _handleAction(action) {\n    switch (action.actionType) {\n      case 'CONTROL_PANEL_INITIALIZE':\n        this._onSessionChange = action.onSessionChange;\n        break;\n\n      case 'SESSION_SYNC':\n        this._session = action.session;\n        this.analyticsIdentify();\n        if (this._onSessionChange) {\n          this._onSessionChange(action.session);\n        }\n        this.emitChange();\n        break;\n\n      default:\n        // do nothing\n    }\n  }\n}\n\nexport default new SessionStore();\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/stores/session_store.js","'use strict';\n\nvar Point = require('point-geometry');\n\nexports.create = function (tagName, className, container) {\n    var el = document.createElement(tagName);\n    if (className) el.className = className;\n    if (container) container.appendChild(el);\n    return el;\n};\n\nvar docStyle = document.documentElement.style;\n\nfunction testProp(props) {\n    for (var i = 0; i < props.length; i++) {\n        if (props[i] in docStyle) {\n            return props[i];\n        }\n    }\n}\n\nvar selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']),\n    userSelect;\nexports.disableDrag = function () {\n    if (selectProp) {\n        userSelect = docStyle[selectProp];\n        docStyle[selectProp] = 'none';\n    }\n};\nexports.enableDrag = function () {\n    if (selectProp) {\n        docStyle[selectProp] = userSelect;\n    }\n};\n\nvar transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n    el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n    window.addEventListener('click', suppressClick, true);\n    window.setTimeout(function() {\n        window.removeEventListener('click', suppressClick, true);\n    }, 0);\n};\n\nexports.mousePos = function (el, e) {\n    var rect = el.getBoundingClientRect();\n    e = e.touches ? e.touches[0] : e;\n    return new Point(\n        e.clientX - rect.left - el.clientLeft,\n        e.clientY - rect.top - el.clientTop\n    );\n};\n\nexports.touchPos = function (el, e) {\n    var rect = el.getBoundingClientRect(),\n        points = [];\n    for (var i = 0; i < e.touches.length; i++) {\n        points.push(new Point(\n            e.touches[i].clientX - rect.left - el.clientLeft,\n            e.touches[i].clientY - rect.top - el.clientTop\n        ));\n    }\n    return points;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/dom.js\n// module id = 62\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function getType(val) {\n    if (val instanceof Number) {\n        return 'number';\n    } else if (val instanceof String) {\n        return 'string';\n    } else if (val instanceof Boolean) {\n        return 'boolean';\n    } else if (Array.isArray(val)) {\n        return 'array';\n    } else if (val === null) {\n        return 'null';\n    } else {\n        return typeof val;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/get_type.js\n// module id = 63\n// module chunks = 0 1","var core = module.exports = { version: '2.6.11' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_core.js\n// module id = 64\n// module chunks = 0 1","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js\n// module id = 65\n// module chunks = 0 1","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js\n// module id = 66\n// module chunks = 0 1","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js\n// module id = 67\n// module chunks = 0 1","'use strict';\nvar fails = require('./_fails');\n\nmodule.exports = function (method, arg) {\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call\n    arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n  });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js\n// module id = 68\n// module chunks = 0 1","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 69\n// module chunks = 0 1","import { ImmutableStore } from '@opengov/og_flux';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport ReportViewStore from './report_view_store';\nimport Immutable, { fromJS } from 'immutable';\nimport _ from 'lodash';\nimport filesize from 'filesize';\nimport moment from 'moment';\nimport strings from '../strings';\nimport utils from '../querygrid/utils';\nimport { setMomentFormat, setMomentDate } from './date_utils';\nimport QueryModel from '../querygrid/querymodel';\nimport { GriddleSettings } from '../config';\nimport { numberTypes, localeToCurrency, columnTypeToNumberType } from '../numberTypes';\nimport { isTargetValid } from '../utils/target_utils';\nimport { getUpdatedHiddenColumns, getUpdatedResetColumns } from '../utils/transactions_utils';\nimport { getEmbedType } from '../utils/embed_utils';\n\nimport {\n  MapTypes,\n  getColorMapFor,\n  getLegendColorMap,\n  getColorExtractorFor,\n  getCurrentTooltipFromProperties,\n  currentMapTooltipSchema,\n  canEditTooltips,\n  AllMapDataTypes,\n  GeocoderMapDataTypes\n} from '../maps/map_constants';\n\nimport {\n  FeatureLayerTypes,\n  getLayerForMapType\n} from '../maps/utils/layer_utils';\n\nimport {\n  getFeatureCoordinates,\n  ingestRowsForMap,\n  parseGeoJson\n} from '../maps/utils/geodata_utils';\n\nimport { findColumnByName } from '../utils/schema_utils';\nimport { AmountsTypes } from '../utils/transactions_utils';\n\nexport type IResult = {\n  transactions: Object[],\n  remaining: number,\n  month: number,\n  year: number,\n  end_day: any,\n  start_day: any\n};\n\n// used for Immuatable equivalents of omit and pick\n// taken from https://github.com/facebook/immutable-js/wiki/Predicates#pick--omit\nexport function keyIn(...keys: any[]) {\n  const keySet = Immutable.Set(arguments);\n  return function(v, k) {\n    return keySet.has(k);\n  };\n}\n\nfunction makeCheckDataObject(fiscalData, title?) {\n  if (!fiscalData) {\n    return null;\n  }\n\n  return {name: title || `FY ${fiscalData.fiscal_year}`, url: fiscalData.file_url, size: filesize(fiscalData.file_size, {round: 0})};\n}\n\nfunction pushHistory(state, history) {\n  const currentStateId = state.get('savedStateId');\n\n  if (currentStateId) {\n    const item = savedStateApiFormat(state);\n    return history.push(item);\n  }\n\n  return history;\n}\n//get the breakdownColumns and amountColumns from the schema\nfunction getschemaAmountBreakdownColumns(schema) {\n  const columns = rejectInvisible(schema);\n\n  const breakdownColumns = Immutable.fromJS(_.sortBy(_.filter(columns, (column: { type }) => {\n    return column.type === 'text' || _.includes(GeocoderMapDataTypes, column.type);\n  }), 'name'));\n\n  const amountColumnTypes = ['monetary', 'numeric'];\n  const amountColumns = Immutable.fromJS(_.sortBy(_.filter(columns, (column: { type }) => {\n    return amountColumnTypes.indexOf(column.type) > -1;\n  }), 'name'));\n  return { breakdownColumns, amountColumns};\n}\n//convert comma seperated string of visible column ids to column metadata objects\nfunction getVisualizationObjects(schemaBreakdownColumns, columnsString) {\n  const visibleBreakdownColumnsArray = columnsString.split(',');\n  let updatedschemaBreakdownColumns = fromJS(schemaBreakdownColumns);\n  updatedschemaBreakdownColumns.filter((column) => {\n    const visibility = _.includes(visibleBreakdownColumnsArray, column.get('id'));\n    updatedschemaBreakdownColumns = getUpdatedHiddenColumns(updatedschemaBreakdownColumns, column.get('id'), visibility);\n  });\n  return updatedschemaBreakdownColumns;\n}\n//convert objects to comma seperated string of visible column ids\nfunction visualizationApiFormat(state) {\n  const visualization = state.get('visualization');\n  const breakdownColumns = visualization.get('breakdownColumns');\n  const amountColumns = visualization.get('amountColumns');\n  const visibleBreakdownColumnsString = _.isEmpty(breakdownColumns) ? '' : getApiString(breakdownColumns);\n  const visibleAmountColumnsString = _.isEmpty(amountColumns) ? '' : getApiString(amountColumns);\n  return {visibleBreakdownColumnsString, visibleAmountColumnsString};\n}\n\nfunction getApiString(columns) {\n  //TODO Change string to JSON\n  const visibleColumns = typeof columns == 'string' ? columns : _.map(columns.filter((column) => column.get('visible') == true).toJS(), 'id');\n  const visibleColumnsString = typeof visibleColumns == 'string' ? visibleColumns : visibleColumns.join(',');\n  return visibleColumnsString;\n}\n//called when saving from the grid report\nfunction getSchemaVisualizationColumnsSaving(nextSavedState, state) {\n  let updatedSchemaBreakdownColumns = nextSavedState ? nextSavedState.getIn(['visualization', 'breakdownColumns']) : [];\n  let updatedSchemaAmountColumns = nextSavedState ? nextSavedState.getIn(['visualization', 'amountColumns']) : [];\n  if (typeof updatedSchemaBreakdownColumns == 'string') {\n    const schemaBreakdownColumns = state.getIn(['schema', 'breakdownColumns']);\n    updatedSchemaBreakdownColumns = getVisualizationObjects(fromJS(schemaBreakdownColumns), updatedSchemaBreakdownColumns);\n  }\n  if (typeof updatedSchemaAmountColumns == 'string') {\n    const schemaAmountColumns = state.getIn(['schema', 'amountColumns']);\n    updatedSchemaAmountColumns = getVisualizationObjects(fromJS(schemaAmountColumns), updatedSchemaAmountColumns);\n  }\n\n  return {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns};\n}\n\nfunction getSchemaVisualizationColumnsLoading(state, schema, breakdownColumns, amountColumns) {\n  let schemaBreakdownColumns = state.getIn(['schema', 'breakdownColumns']);\n  let schemaAmountColumns = state.getIn(['schema', 'amountColumns']);\n  let updatedSchemaBreakdownColumns = {};\n  let updatedSchemaAmountColumns = {};\n\n  if (schemaBreakdownColumns.size == 0 ) {\n    const {breakdownColumns, amountColumns} = getschemaAmountBreakdownColumns(schema);\n    schemaBreakdownColumns = breakdownColumns;\n    schemaAmountColumns = amountColumns;\n  }\n\n  updatedSchemaBreakdownColumns = (typeof breakdownColumns == 'string' && schemaBreakdownColumns.size !== 0) ? getVisualizationObjects(schemaBreakdownColumns, breakdownColumns) : breakdownColumns;\n  updatedSchemaAmountColumns = (typeof amountColumns == 'string' && schemaAmountColumns.size !== 0) ? getVisualizationObjects(schemaAmountColumns, amountColumns) : amountColumns;\n\n  return {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns};\n}\n\nexport function savedStateApiFormat(state) {\n  let grid = state.get('grid');\n\n  const currentCheckData = state.get('currentCheckData');\n  const visualization = state.get('visualization');\n  const {visibleBreakdownColumnsString, visibleAmountColumnsString} = visualizationApiFormat(state);\n  grid = grid.mergeDeep(fromJS({\n    embed: getEmbedType(),\n    id: state.get('savedStateId'),\n    currentCheckData:{\n      quasiId: currentCheckData.get('quasiId'),\n      rowTop: currentCheckData.get('rowTop')\n    },\n    visualization: {\n      breakdown: visualization.get('breakdown'),\n      index: visualization.get('index'),\n      graphType: visualization.get('graphType'),\n      isVisible: visualization.get('isVisible'),\n      showLegend: visualization.get('showLegend'),\n      currentMapType: visualization.get('currentMapType'),\n      mapBounds: visualization.get('mapBounds'),\n      heatmapType: visualization.get('heatmapType'),\n      mapAmountColumn: visualization.get('mapAmountColumn'),\n      target: visualization.get('target'),\n      amountsType: visualization.get('amountsType'),\n      amountColumn: visualization.get('amountColumn'),\n      legendSortBy: visualization.get('legendSortBy'),\n      breakdownColumns: visibleBreakdownColumnsString,\n      amountColumns: visibleAmountColumnsString\n    },\n    lastXYZDays: state.get('lastXYZDays')\n  }));\n  if (visualization.get('limit') !== Infinity) {\n    grid = grid.setIn(['visualization', 'limit'], visualization.get('limit'));\n  }\n\n  return Immutable.fromJS(grid);\n}\n\nfunction generateMoment(year, month, date) {\n  return moment().set({\n    month: month - 1,  //Moment expects months and days to start at 0\n    date,\n    year\n  });\n}\n\nfunction getTickInfo(tick) {\n  return {\n    fiscal_year: tick.fiscal_year,\n    year: tick.year,\n    month: tick.month,\n    start_day: tick.start_day,\n    end_day: tick.end_day\n  };\n}\n\nexport function generateXAxis(transactions, fiscalYearStartMonth, isDateColumnComputed?) {\n  const transactionsSize = _.size(transactions);\n  const isSingleTick = transactionsSize === 1;\n\n  // if we only have one tick to display on the x-axis...\n  if (isSingleTick) {\n    let tickLabel;\n    const tick = transactions[0];\n    const { fiscal_year, year, month, start_day, end_day } = getTickInfo(tick);\n    const m = generateMoment(year, month, start_day);\n\n    // if our date has been computed, we should just show the fiscal year\n    if (isDateColumnComputed) {\n      // if fiscalYearStartMonth is other than January, then we should re-calculate fiscalYear to be sent\n      // e.g. for fiscalYearStartMonth=July, year=2016, month=October, year should be incremented to 2017 and result in 2016-17\n      // e.g. for fiscalYearStartMonth=July, year=2016, month=February, year should remain the same and result in 2015-16\n      const adjustedFiscalYear = (fiscalYearStartMonth !== 1 && month >= fiscalYearStartMonth) ? year + 1 : year;\n      tickLabel = strings.fiscalYear(adjustedFiscalYear, fiscalYearStartMonth);\n    // otherwise, show the range of days the tick contains\n    } else if (start_day && end_day) {\n      // module.exports allows to spy on & insure setMomentFormat is called with the right format\n      // no.\n      const startDayString = setMomentFormat(setMomentDate(m, start_day), 'MMM Do');\n      const endDayString = setMomentFormat(setMomentDate(m, end_day), 'MMM Do, YYYY');\n      tickLabel = startDayString + ' to ' + endDayString;\n    } else if (fiscal_year) {\n      tickLabel = fiscal_year;\n    }\n\n    return [{\n      index: 0,\n      value: tickLabel,\n      result: tick\n    }];\n  }\n\n  // if we have multiple ticks to display on the x-axis...\n  return _.map(transactions, _.bind((tick, index) => {\n    const { fiscal_year, year, month, start_day } = getTickInfo(tick);\n    let tickLabel;\n    // if we have years for xAxis ticks...\n    if (fiscal_year) {\n      tickLabel = strings.fiscalYear(fiscal_year, fiscalYearStartMonth);\n    // if we have months for xAxis ticks...\n    } else if (year && month) {\n      const m = generateMoment(year, month, start_day);\n      tickLabel = setMomentFormat(m, 'MMM YYYY');\n    }\n\n    return {\n      index: index,\n      value: tickLabel,\n      result: tick\n    };\n  }, this));\n}\n\nexport function getGridState(state) {\n  const filter = state.getIn(['grid', 'query', 'filter']);\n  const columns = state.getIn(['schema', 'columns']);\n\n  // Exclude any filters referencing columns that do not exist\n  if (filter && columns) {\n    const filterColumnIds = _.keys(filter.toObject());\n    const columnIds = columns.map((c) => c.get('id')).toArray().concat(GriddleSettings.ignoredFields);\n    const invalidColumns = _.difference(filterColumnIds, columnIds);\n\n    const cleanFilter = _.reduce(invalidColumns, (filter, column) => {\n      return filter.remove(column);\n    }, filter);\n\n    return state.get('grid').setIn(['query', 'filter'], cleanFilter);\n  }\n\n  return state.get('grid');\n}\n\n\nconst initialModalState = {\n  showHowTo: false,\n  showTOS: false,\n  showExportFilter: false,\n  showWelcome: false,\n  showBudget101: false,\n  onboardingTour: {\n    showTour: false,\n    currentStep: 0\n  }\n};\n\nfunction rejectInvisible(columns: { id, name }) {\n  return _.reject(columns, (c) => { return _.includes(GriddleSettings.ignoredFields, c.id); });\n}\n\nexport function isMapEnabled(state?) {\n  const schema = state && state.get('schema');\n  const entity = ReportViewStore && ReportViewStore.getReportEntity();\n\n  if (!schema || !entity) {\n    return false;\n  }\n\n  const columns = schema.get('columns');\n  const features = entity.get('feature_permissions');\n\n  if (!columns || !features) {\n    return false;\n  }\n\n  const hasMapsFeaturePermission = _.some(['maps_light', 'maps_pro'],\n    feature => _.includes(_.isArray(features) ? features : features.toJS(), feature)\n  );\n\n  const hasMapColumns = columns.some(c => _.some(AllMapDataTypes, type => type === c.get('type')));\n  return hasMapsFeaturePermission && hasMapColumns;\n}\n\nexport function isQueryOptimizationEnabled() {\n  const entity = ReportViewStore && ReportViewStore.getReportEntity();\n  const features = entity.get('feature_permissions') || [];\n  return features.includes('optimize_queries');\n}\n\nfunction areMapTooltipsEditable(state) {\n  return isMapEnabled(state) && canEditTooltips(SessionStore.getSession());\n}\n\nconst DEFAULT_LIMIT = 8;\nconst LIMIT_INCREMENT = 4;\n\nexport function initialState(defaults: any = {}) {\n  return {\n    loading: false,\n    rebuilding: false,\n    embed: getEmbedType(),\n    locale: defaults.locale || 'en_US',\n\n    visualization: {\n      availableGraphTypes: ['horizontal_stacked', 'treemap', 'line', 'bar', 'pie', 'map'],\n      reportAmountType: defaults.reportAmountType || numberTypes.dollar,\n      xAxis: Immutable.List(),\n      index: Infinity,\n      isVisible: defaults.visualization_visible !== false,\n      showLegend: true,\n      isLoading: true,\n      isSummaryLoading: true,\n      mapLoading: false,\n      mapDataLoading: false,\n      isError: false,\n      graphType: isMapEnabled() ? 'map' : 'bar',\n      breakdown: defaults.visualization_breakdown || '',\n      breakdownColumns: [],\n      amountColumns: [],\n      breakdownValueNames: [],\n      amountsType: AmountsTypes.Incremental,\n      limit: DEFAULT_LIMIT,\n      tooltip: {\n        isVisible: false,\n        name: '',\n        value: 0,\n        left: 0,\n        top: 0,\n        percentage: 0\n      },\n      mapTooltip: {\n        config: defaults.map_tooltips ? getCurrentTooltipFromProperties(defaults) : null,\n        draft: null,\n        selectableColumns: [],\n        setupComplete: !!defaults.map_tooltips,\n        editing: false,\n        editable: false,\n        itemsForTooltip: null,\n        locationForTooltip: null,\n        loading: false\n      },\n      aggregates: {},\n      currentMapType: MapTypes.Point.name,\n      availableMapTypes: [MapTypes.Point, MapTypes.Bubble, MapTypes.Heatmap],\n      mapLegendPage: 1,\n      mapBounds: null,\n      mapAmountColumn: null,\n      heatmapType: MapTypes.Heatmap.types.density,\n      target: Immutable.Map(),\n      amountColumn: defaults.amount_column || '',\n      legendSortBy: 'desc'\n    },\n\n    map: {\n      data: null,\n      extractors: {},\n      legendColorMap: null,\n      dataStats: {\n        minAmount: 0,\n        maxAmount: 0,\n        bounds: null,\n        isInvalid: true\n      },\n      loaderGrid: null\n    },\n\n    visualizationDefaultState: {\n      index: Infinity,\n      isLoading: true,\n      isSummaryLoading: true,\n      isVisible: defaults.visualization_visible !== false,\n      showLegend: true,\n      graphType: 'bar',\n      breakdown: defaults.visualization_breakdown || '',\n      limit: DEFAULT_LIMIT,\n      xAxis: Immutable.List()\n    },\n\n    lastXYZDays: null,\n\n    schema: {\n      fiscalYearStartMonth: 1,\n      dateColumn: '',\n      columns: [],\n      reportAmountType: numberTypes.dollar,\n      number_of_decimals: 2,\n      breakdownColumns: [],\n      amountColumns: [],\n      defaultBreakdown: ''\n    },\n\n    queryModel: new QueryModel(),\n    downloads: null,\n    currentCheckData: {\n      loading: false,\n      data: null,\n      visible: false,\n      quasiId: null,\n      amountColumn: null\n    },\n    showHowTo: false,\n    showTOS: false,\n    showExportFilter: false,\n    showTargetPanel: false,\n    relatedTransactions: {\n      loading: true,\n      amount: null\n    },\n    showBudget101: false,\n    showWelcome: null,\n    onboardingTour: {\n      currentStep: 0,\n      showTour: false\n    },\n    grid: { },\n    savedStateId: null,\n    defaultSavedStateId: defaults.grid_state_id,\n\n    history: [ ],\n\n    filteredExport: {\n      state: 'enqueued',\n      job_result: {}\n    },\n\n    filterState: {\n      activeFilterIds: {}\n    }\n  };\n}\n\nconst modifyDateFilter = (state, ge, le) => {\n  state.get('queryModel').filterColumn(state.getIn(['schema', 'dateColumn']), 'ge', ge);\n  state.get('queryModel').filterColumn(state.getIn(['schema', 'dateColumn']), 'le', le);\n};\n\nexport const updateColorMap = (state) => {\n  const breakdownValues = state.get('breakdownValues');\n  if (!breakdownValues || breakdownValues.length == 0) {\n    return state;\n  }\n\n  const breakdown = state.getIn(['visualization', 'breakdown']);\n  const currentColorMap = state.getIn(['map', 'dataColorMap']) || {};\n  const dataColorMap = getColorMapFor(breakdownValues, breakdown, currentColorMap);\n\n  return state\n    .setIn(['visualization', 'dataColorMap'], dataColorMap)\n    .setIn(['map', 'legendColorMap'], getLegendColorMap(breakdownValues, breakdown, dataColorMap))\n    .setIn(['map', 'extractors', 'colorExtractor'], getColorExtractorFor(breakdown, dataColorMap));\n};\n\nexport const buildLegendColorMap = (mapData, breakdown, colorMap) => {\n  return mapData\n    .map(row => row[breakdown])\n    .filter(label => !_.isNull(label) && colorMap && colorMap[label])\n    .reduce((map, label) => _.assign(map, { [label]: colorMap[label] }), {});\n};\n\nconst updateMapLayer = state => {\n  if (state.getIn(['visualization', 'graphType']) !== 'map') {\n    return state;\n  }\n\n  const currentMapType = state.getIn(['visualization', 'currentMapType']);\n\n  if (FeatureLayerTypes.some(typeName => typeName === currentMapType)) {\n    state = state.setIn(['map', 'layer'], getLayerForMapType(currentMapType, state));\n  }\n\n  return state;\n};\n\nconst updateMapState = (state) => {\n  const itemsForTooltip = state.getIn(['visualization', 'mapTooltip', 'itemsForTooltip']);\n  const locationForTooltip = state.getIn(['visualization', 'mapTooltip', 'locationForTooltip']);\n  const isLoadingTooltip = !itemsForTooltip && locationForTooltip;\n\n  if (!isLoadingTooltip) {\n    state = state\n              .setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null)\n              .setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null);\n  }\n\n  return state;\n};\n\nconst initializeMapTooltip = (state) => {\n  const visualization = state.get('visualization');\n  const schema = state.get('schema');\n  const columns = schema.get('columns');\n  const mapTooltip = visualization.get('mapTooltip') || Immutable.fromJS({});\n  const amountCol = columns.find(col => col.get('name') === visualization.get('amountColumn'));\n\n  const defaultColumns = [visualization.getIn(['breakdownColumns', 0]).toJS(), amountCol && amountCol.toJS()];\n  const tooltipsEditable = areMapTooltipsEditable(state);\n\n  return state.setIn(['visualization', 'mapTooltip'],\n    mapTooltip.mergeDeep(fromJS({\n      draft: !!mapTooltip.get('config') ? mapTooltip.get('config') : currentMapTooltipSchema.createDefault(defaultColumns),\n      editing: !mapTooltip.get('setupComplete') && tooltipsEditable,\n      editable: tooltipsEditable,\n      setupComplete: !!mapTooltip.get('config'),\n      selectableColumns: columns\n    })\n  ));\n};\n\nconst GridReportStore = new ImmutableStore({\n  getInitialState() {\n    return initialState();\n  },\n\n  getDownloads() {\n    if (this._state.get('downloads')) {\n      const downloadData = this._state.get('downloads').toJS();\n      const fiscalYearData = _.map(\n        _.filter(downloadData, 'fiscal_year'),\n        _.bind(function(download) {\n          return makeCheckDataObject(download);\n        },\n        this)\n      );\n\n      const fullData = makeCheckDataObject(_.find(downloadData, {fiscal_year: null}), 'All fiscal years');\n\n      return {\n        fiscalYears: fiscalYearData,\n        fullDataSet: fullData\n      };\n    }\n  },\n\n  getPreviousSavedState(goBack = false) {\n    if (this.hasPreviousSavedState()) {\n      let history = this._state.get('history');\n      if (goBack) {\n        history = history.pop();\n      }\n      return history.last();\n    }\n  },\n\n  hasPreviousSavedState() {\n    return !!this._state.get('history').size;\n  },\n\n  getMap() {\n    return this._state.get('map');\n  },\n\n  getMapData() {\n    return this._state.getIn(['map', 'data']);\n  },\n\n  getMapDataStats() {\n    return this._state.getIn(['map', 'dataStats']);\n  },\n\n  getMapExtractors() {\n    return this._state.getIn(['map', 'extractors']);\n  },\n\n  getSchema() {\n    return this._state.get('schema');\n  },\n\n  getGridReportDownload() {\n    return this._state.get('gridReportDownload');\n  },\n\n  actions: {\n    REPORT_LOADED(state, {report}) {\n      // When loading a grid report re-initialize the store state for the loaded report.\n      if (report.get('report_type') === 'grid') {\n        const properties = report.get('properties');\n        const attributes = report.attributes;\n        properties.locale = attributes.locale || 'en_US';\n\n        const reportAmountType = localeToCurrency(report.attributes.locale);\n        properties.reportAmountType = reportAmountType;\n\n        return initialState(properties);\n      }\n\n      // If we are loading a GL report with an embedded grid report,\n      // we must clear the grid state since another grid report may have been loaded before.\n      if (report.associatedReport) {\n        return initialState();\n      }\n    },\n\n    REPORT_GRID_FILTER_COLUMN(state, action) {\n      state.get('queryModel').filterColumn(action.column, action.operator, action.value);\n    },\n\n    REPORT_GRID_FILTER_BY_FISCAL_YEAR(state, action) {\n      const range = this.fiscalYearRange(action.fiscalYear);\n      modifyDateFilter(state, range.start, range.end);\n    },\n\n    REPORT_GRID_TOGGLE_VISUALIZATIONS(state) {\n      return state.setIn(['visualization', 'isVisible'], !state.getIn(['visualization', 'isVisible']));\n    },\n\n    REPORT_GRID_SET_LAST_XYZ_DAYS(state, action) {\n      const end = action.days && moment().subtract(action.days, 'days').format('YYYY-MM-DD') || undefined;\n      const today = action.days && moment().format('YYYY-MM-DD') || undefined;\n      modifyDateFilter(state, end, today);\n\n      return state.set('lastXYZDays', action.days); //Do not need to update history as changes are in query hash\n    },\n\n    REPORT_GRID_SET_VISUALIZATION_TYPE(state, action) {\n      return state\n        .setIn(['visualization', 'graphType'], action.graphType)\n        .setIn(['grid', 'graphType'], action.graphType);\n    },\n\n    REPORT_GRID_TOGGLE_LEGEND(state) {\n      return state.setIn(['visualization', 'showLegend'], !state.getIn(['visualization', 'showLegend']));\n    },\n\n    REPORT_GRID_GET_VISUAL_AGGREGATIONS(state) {\n      return state\n        .setIn(['visualization', 'isLoading'], true)\n        .setIn(['visualization', 'isSummaryLoading'], true);\n    },\n\n    REPORT_GRID_FILTER_REMAINING_AGGREGATES(state) {\n      return state.updateIn(['visualization', 'limit'], (limit) => limit + LIMIT_INCREMENT);\n    },\n\n    REPORT_GRID_GET_VISUAL_AGGREGATIONS_SUCCESS(state, {transactionsByFiscalYear}) {\n      const breakdown = state.getIn(['visualization', 'breakdown']);\n      const transactions = _.flatten(_.map(transactionsByFiscalYear, 'transactions'));\n      const names = _.map(transactions, breakdown);\n      const breakdownValueNames = _.uniq(names);\n      const amountColumn = state.getIn(['visualization', 'amountColumn']);\n      const sumField = `${amountColumn}_sum`;\n      //removing years that do not have transaction data\n      const transactionsByFiscalYearCleaned = _.filter(\n        transactionsByFiscalYear,\n        (result: IResult) => result.transactions.length !== 0\n      );\n\n      const isMonthly = _.has(transactionsByFiscalYearCleaned[0], 'month');\n      const dateColumnMeta = isMonthly ? findColumnByName(state.get('schema'), state.getIn(['schema', 'dateColumn'])) : null;\n      const max_date = isMonthly ? moment(dateColumnMeta.get('max_value'), 'YYYY-MM-DD') : null;\n      const min_date = isMonthly ? moment(dateColumnMeta.get('min_value'), 'YYYY-MM-DD') : null;\n\n      const dateColumn = state.get('queryModel').getColumnQuery(state.getIn(['schema', 'dateColumn'])).filter;\n      const ge = _.has(dateColumn, 'ge') ? dateColumn.ge : null;\n      const dayDiff = moment().diff(moment(ge, 'YYYY-MM-DD'), 'days') || null;\n\n      _.each(transactionsByFiscalYearCleaned, result => {\n\n        //Issues might occur here later when `count` has a result.remaining\n        if (result.remaining >= 0.001 || result.remaining <= -0.001) {\n          result.transactions.push({\n            [breakdown]: 'Show More',\n            [sumField]: result.remaining,\n            isRemaining: true\n          });\n        }\n\n        if (isMonthly && result.year === max_date.year() && result.month - 1 === max_date.month()) {\n          result.end_day = max_date.date();\n        }\n        if (isMonthly && result.year === min_date.year() && result.month - 1 === min_date.month()) {\n          result.start_day = min_date.date();\n        }\n      });\n\n      const fiscalYearStartMonth = state.getIn(['schema', 'fiscalYearStartMonth']);\n      const isDateColumnComputed = dateColumnMeta && dateColumnMeta.get('computed');\n      const xAxis = generateXAxis(transactionsByFiscalYearCleaned, fiscalYearStartMonth, isDateColumnComputed);\n\n      //Checking to see if index is a contained within possible list of indexes\n      let index = state.getIn(['visualization', 'index']);\n\n      // Double equals since we don't always know what type the index is\n      const yearIndex = _.findIndex(xAxis, (axis) => axis.index === Number(index));\n      const mostRecentYear = _.maxBy(xAxis, (axis) => axis.index);\n      const mostRecentYearIndex = mostRecentYear && mostRecentYear.index;\n\n      if (yearIndex === - 1) {\n        index = mostRecentYearIndex;\n      }\n\n      // Enables rendering of the horizontal stacked bar, treemap, and pie if only one year of data is displayed.\n      if (index === null) {\n        index = 0;\n      }\n\n      const xAxisValues = Immutable.List(_.sortBy(xAxis, (n) => n.index));\n      const defaultXAxis = state.getIn(['visualizationDefaultState', 'xAxis']);\n      const xAxisSet = Immutable.is(defaultXAxis, Immutable.List()) ? xAxisValues : defaultXAxis; //Only set the default once\n\n      return state.setIn(['visualization', 'aggregates'], Immutable.fromJS(transactionsByFiscalYearCleaned))\n                  .setIn(['visualization', 'breakdownValueNames'], breakdownValueNames)\n                  .setIn(['visualization', 'isLoading'], false)\n                  .setIn(['visualization', 'isSummaryLoading'], false)\n                  .setIn(['visualization', 'xAxis'], xAxisValues)\n                  .setIn(['visualizationDefaultState', 'xAxis'], Immutable.fromJS(xAxisSet))\n                  .setIn(['visualization', 'index'], index)\n                  .setIn(['visualizationDefaultState', 'index'], mostRecentYearIndex)\n                  .set('lastXYZDays', dayDiff)\n                  .setIn(['visualization', 'isError'], false);\n    },\n\n    REPORT_GRID_GET_SUMMARY_TABLE_AGGREGATIONS_SUCCESS(state, {transactionsByFiscalYear}) {\n      const breakdown = state.getIn(['visualization', 'breakdown']);\n      const amountColumn = state.getIn(['visualization', 'amountColumn']);\n      const sumField = `${amountColumn}_sum`;\n      //removing years that do not have transaction data\n      const transactionsByFiscalYearCleaned = _.filter(\n        transactionsByFiscalYear,\n        (result : IResult) => result.transactions.length !== 0\n      );\n\n      const isMonthly = _.has(transactionsByFiscalYearCleaned[0], 'month');\n      const dateColumnMeta = isMonthly ? findColumnByName(state.get('schema'), state.getIn(['schema', 'dateColumn'])) : null;\n      const max_date = isMonthly ? moment(dateColumnMeta.get('max_value'), 'YYYY-MM-DD') : null;\n      const min_date = isMonthly ? moment(dateColumnMeta.get('min_value'), 'YYYY-MM-DD') : null;\n\n      _.each(transactionsByFiscalYearCleaned, result => {\n\n        //Issues might occur here later when `count` has a result.remaining\n        if (result.remaining >= 0.001 || result.remaining <= -0.001) {\n          result.transactions.push({\n            [breakdown]: 'Show More',\n            [sumField]: result.remaining,\n            isRemaining: true\n          });\n        }\n\n        if (isMonthly && result.year === max_date.year() && result.month - 1 === max_date.month()) {\n          result.end_day = max_date.date();\n        }\n        if (isMonthly && result.year === min_date.year() && result.month - 1 === min_date.month()) {\n          result.start_day = min_date.date();\n        }\n      });\n\n      return state.setIn(['visualization', 'tableAggregates'], Immutable.fromJS(transactionsByFiscalYearCleaned))\n                  .setIn(['visualization', 'isSummaryLoading'], false);\n    },\n\n    REPORT_GRID_GET_VISUAL_AGGREGATIONS_ERROR(state) {\n      return state.setIn(['visualization', 'isLoading'], false)\n                  .setIn(['visualization', 'isError'], true);\n    },\n\n    REPORT_GRID_SET_VISUAL_BREAKDOWN(state, action) {\n      return state.setIn(['visualization', 'breakdown'], action.breakdown);\n    },\n\n    REPORT_GRID_RESET(state) {\n      const first = state.get('history').first();\n      const {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns} = getSchemaVisualizationColumnsSaving(first, state);\n\n      return state.set('history', Immutable.List([first]))\n                  .set('grid', first.filter(keyIn('query', 'columns', 'amountColumn')))\n                  .mergeIn(['visualization'], first.get('visualization'))\n                  .setIn(['visualization', 'amountColumns'], first.getIn(['visualization', 'amountColumns']))\n                  .setIn(['visualization', 'mapBounds'], first.getIn(['visualization', 'mapBounds']))\n                  .set('lastXYZDays', first.get('lastXYZDays'))\n                  .set('savedStateId', first.get('id'))\n                  .setIn(['visualization', 'breakdownColumns'], updatedSchemaBreakdownColumns)\n                  .setIn(['visualization', 'amountColumns'], updatedSchemaAmountColumns)\n                  .updateIn(['visualization', 'amountColumn'], amountColumn => {\n                    return amountColumn || state.getIn(['schema', 'amountColumn']);\n                  })\n                  .updateIn(['visualization', 'breakdown'], breakdown => {\n                    return breakdown || state.getIn(['schema', 'defaultBreakdown']);\n                  });\n    },\n\n    REPORT_GRID_SET_SCHEMA(state, action) {\n      const columns: any = rejectInvisible(action.schema);\n      if (!columns.length && !columns.size) {\n        throw new Error('Schema has no columns');\n      }\n\n      let dateColumn = action.meta.date_column;\n      const dbParallelCapable = action.meta.db_parallel_capable;\n      const dateColumnSchema = _.filter(columns, {type: 'date'});\n      const dateColumnExists = _.includes(_.map(dateColumnSchema, (col: { name }) => col.name), dateColumn);\n\n      if ((!dateColumn || !dateColumnExists) && !_.isEmpty(dateColumnSchema)) {\n        dateColumn = (_.head(dateColumnSchema) as any).name;\n      } else if (!dateColumn && _.isEmpty(dateColumnSchema)) {\n        throw new Error('Could not find a date column');\n      }\n\n      const amountColumnName = action.meta.amount_column;\n      if (!amountColumnName) {\n        throw new Error('Could not find an amount column');\n      }\n\n      const breakdownColumns = _.sortBy(_.filter(columns, (column: any) => {\n        return column.type === 'text' || _.includes(GeocoderMapDataTypes, column.type);\n      }), 'name');\n\n      if (!breakdownColumns.length) {\n        throw new Error('Could not find any text columns for visualization breakdowns');\n      }\n\n      let defaultBreakdown = state.getIn(['visualizationDefaultState', 'breakdown']);\n      const breakdownFromSchema = _.find(breakdownColumns, {name: defaultBreakdown});\n\n      if (!breakdownFromSchema) {\n        const departments = _.find(breakdownColumns, {name: 'department' as any}) ||\n                              _.find(breakdownColumns, {name: 'departments' as any});\n\n        defaultBreakdown = departments ? departments.name : breakdownColumns[0].name;\n      }\n\n      const amountColumnTypes = ['monetary', 'numeric'];\n      const amountColumns = _.sortBy(_.filter(columns, (column: any) => {\n        return amountColumnTypes.indexOf(column.type) > -1;\n      }), 'name');\n\n      const amountTypes = ['monetary', 'numeric', 'percent'];\n      const mapAmountColumnOptions = columns.filter(column => amountTypes.indexOf(column.type) > -1);\n      const amountColumn = columns.filter((c) => c.name === amountColumnName)[0];\n      const reportAmountType = columnTypeToNumberType(amountColumn.type, state.get('locale'));\n\n      const stateBreakdownColumns = state.getIn(['visualization', 'breakdownColumns']) || Immutable.fromJS(breakdownColumns);\n      const stateAmountColumns = state.getIn(['visualization', 'amountColumns']) || Immutable.fromJS(amountColumns)\n      let finalResult = initializeMapTooltip(state.mergeDeep(fromJS({\n        schema: {\n          dateColumn,\n          dbParallelCapable,\n          amountColumn: amountColumnName,\n          sumField: `${amountColumnName}_sum`,\n          columns: Immutable.fromJS(columns),\n          fiscalYearStartMonth: action.fiscalYearStartMonth,\n          reportAmountType,\n          locale: state.get('locale'),\n          breakdownColumns,\n          amountColumns,\n          defaultBreakdown\n        },\n        visualization: {\n          breakdownColumns: stateBreakdownColumns.size == 0 ? Immutable.fromJS(breakdownColumns) : fromJS(stateBreakdownColumns),\n          breakdown: state.getIn(['visualization', 'breakdown']) || defaultBreakdown,\n          defaultBreakdown: defaultBreakdown,\n          mapAmountColumn: state.getIn(['visualization', 'mapAmountColumn']) || amountColumnName,\n          mapAmountColumnOptions: Immutable.fromJS(mapAmountColumnOptions),\n          amountColumn: state.getIn(['visualization', 'amountColumn']) || amountColumnName,\n          amountColumns: stateAmountColumns.size == 0 ? Immutable.fromJS(amountColumns) : fromJS(stateAmountColumns)\n        },\n        visualizationDefaultState: {\n          breakdown: state.getIn(['visualizationDefaultState', 'breakdown']) || defaultBreakdown\n        }\n      }))\n      .setIn(['visualization', 'mapAmountColumnOptions'], Immutable.fromJS(mapAmountColumnOptions))\n      .setIn(['visualization', 'mapBounds'], state.getIn(['visualization', 'mapBounds']))\n      .setIn(['schema', 'columns'], fromJS(columns))\n      .setIn(['schema', 'breakdownColumns'], breakdownColumns)\n      .setIn(['schema', 'amountColumns'], amountColumns)\n      .setIn(['visualization', 'breakdownColumns'], stateBreakdownColumns.size == 0 ? Immutable.fromJS(breakdownColumns) : stateBreakdownColumns)\n      .setIn(['visualization', 'amountColumns'], stateAmountColumns.size == 0 ? Immutable.fromJS(amountColumns) : stateAmountColumns)\n      );\n      return finalResult\n    },\n\n    REPORT_GRID_SHOW_VISUALIZATION_TOOLTIP(state, action) {\n      return state.mergeDeep(fromJS({\n        visualization: {\n          tooltip: {\n            isVisible: true,\n            left: action.left,\n            name: action.name,\n            value: action.value,\n            percentage: action.percentage,\n            top: action.top\n          }\n        }\n      }));\n    },\n\n    REPORT_GRID_HIDE_VISUALIZATION_TOOLTIP(state) {\n      return state.setIn(['visualization', 'tooltip', 'isVisible'], false);\n    },\n\n    REPORT_LOADED_TRANSACTION_DOWNLOADS(state, action) {\n      return state.set('downloads', Immutable.fromJS(action.downloads));\n    },\n\n    CHECK_IMAGE_LOADING(state, action) {\n      return state.mergeDeep(fromJS({\n        currentCheckData: {\n          loading: true,\n          visible: true,\n          data: null,\n          rowTop: action.rowTop,\n          quasiId: action.quasiId\n        }\n      }));\n    },\n\n    CHECK_IMAGE_LOAD_ERROR(state) {\n      return state.mergeDeep(fromJS({\n        alert: 'checkLoadError',\n        currentCheckData: {\n          loading: false,\n          visible: false,\n          quasiId: null,\n          rowTop: null\n        }\n      }));\n    },\n\n    REPORT_IN_SYNC_STATUS(state, payload) {\n      const isRebuilding = _.isUndefined(payload.meta.in_sync) ? false : !payload.meta.in_sync;\n      return state.set('rebuilding', isRebuilding);\n    },\n\n    SHOW_CHECK_IMAGE(state, action) {\n      return state.mergeDeep(fromJS({\n        currentCheckData: {\n          loading: false,\n          data: Immutable.fromJS(action.checkData),\n          quasiId: action.checkData.quasi_id || null,\n          visible: true,\n          rowTop: action.rowTop,\n          amountColumn: action.amountColumn\n        },\n        relatedTransactions: {\n          loading: action.loadingMessage,\n        }\n      }));\n    },\n\n    HIDE_CHECK_IMAGE(state) {\n      return state.mergeDeep(fromJS({\n        currentCheckData: {\n          loading: false,\n          data: null,\n          visible: false,\n          quasiId: null,\n          rowTop: null,\n          amountColumn: null\n        },\n        relatedTransactions: {\n          loading: true,\n          amount: null\n        }\n      }));\n    },\n\n    REPORT_GRID_SET_VISUALIZATION_YEAR(state, { index, timePeriodQuery }) {\n      return state.setIn(['visualization', 'index'], index).set('timePeriodQuery', timePeriodQuery.query);\n    },\n\n    GRID_REPORT_STATE_SAVING(state, { nextSavedState }) {\n      // last XYZ days?\n      const {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns} = getSchemaVisualizationColumnsSaving(nextSavedState, state);\n      const nextState = state.mergeIn(['grid'], nextSavedState.filter(keyIn('query', 'columns', 'amountColumn', 'graphType')))\n                              .mergeDeepIn(['currentCheckData'], fromJS(nextSavedState.get('currentCheckData')))\n                              .mergeDeepIn(['visualization'], fromJS(nextSavedState.get('visualization')))\n                              .setIn(['visualization', 'amountColumns'], fromJS(nextSavedState.getIn(['visualization', 'amountColumns'])))\n                              .setIn(['visualization', 'breakdownColumns'], fromJS(updatedSchemaBreakdownColumns))\n                              .setIn(['visualization', 'amountColumns'], fromJS(updatedSchemaAmountColumns))\n                              .setIn(['visualization', 'mapBounds'], fromJS(nextSavedState.getIn(['visualization', 'mapBounds'])))\n      return nextState.update('history', (history) => pushHistory(nextState, history));\n    },\n\n    GRID_REPORT_STATE_SAVED(state, { id, nextSavedState }) {\n      const target = nextSavedState.getIn(['visualization', 'target']);\n\n      const formattedState =\n        savedStateApiFormat(state)\n          .remove('id')\n          .removeIn(['visualization', 'target']);\n\n      const nextSavedStateWithoutIdOrTarget =\n        nextSavedState\n          .remove('id')\n          .removeIn(['visualization', 'target']);\n\n      // Verify this saved state is the one currently be rendered in the report.\n      // It is possible that pending requests for previous states may be delayed\n      // and finish after new states have been saved.\n      if (nextSavedStateWithoutIdOrTarget.equals(formattedState)) {\n        const historyState =\n          formattedState\n            .set('id', id)\n            .setIn(['visualization', 'target'], target);\n\n        return state.set('savedStateId', id)\n                    .update('history', (history) => history.set(history.size - 1, historyState));\n      }\n\n      return state;\n    },\n\n    GRID_REPORT_STATE_LOADING(state, { stateId }) {\n      return state.mergeDeep(fromJS({ loading: true, savedStateId: stateId }));\n    },\n\n    GRID_REPORT_STATE_LOADED(state, { id, loadedState, updateHistory, lastXYZDays, schema }) {\n      const {\n        visualization,\n        currentCheckData,\n        query,\n        columns\n      } = loadedState;\n\n      const dateColumn = state.getIn(['schema', 'dateColumn']);\n      const amountColumn = visualization && visualization.amountColumn ? visualization.amountColumn : (state.getIn(['schema', 'amountColumn']) || '');\n      const legendSortBy = visualization && visualization.legendSortBy ? visualization.legendSortBy : 'desc';\n      const graphType = visualization && visualization.graphType ? visualization.graphType : '';\n      const limit = visualization && visualization.limit ? visualization.limit : DEFAULT_LIMIT;\n      const breakdownColumns = visualization && visualization.breakdownColumns ? visualization.breakdownColumns : state.getIn(['schema', 'breakdownColumns']);\n      const amountColumns = visualization && visualization.amountColumns ? visualization.amountColumns : state.getIn(['schema', 'amountColumns']);\n      const breakdownColumn = visualization && visualization.defaultBreakdown ? visualization.defaultBreakdown : state.getIn(['schema', 'defaultBreakdown']);\n\n      const {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns} = getSchemaVisualizationColumnsLoading(state, schema, breakdownColumns, amountColumns);\n      // loadedState is overridden by lastXYZDays because to look at the last 30 days must look at lastXYZ rather than filter state which is hard coded to a day\n      if (dateColumn && lastXYZDays) {\n        const end = moment().subtract(lastXYZDays, 'days').format('YYYY-MM-DD');\n        query['filter'] = {[dateColumn]: {ge: end}};\n      }\n      let nextState = state.set('savedStateId', id)\n                           .set('loading', false)\n                           .set('lastXYZDays', lastXYZDays)\n                           .mergeDeepIn(['visualization'], fromJS(visualization))\n                           .set('grid', Immutable.fromJS({ query, columns, amountColumn, graphType }));\n\n      if (visualization && visualization.mapBounds) {\n        nextState = nextState.setIn(['visualization', 'mapBounds'], fromJS(visualization.mapBounds));\n      }\n      // set the deserialized breakdownColumns\n      nextState = nextState.setIn(['visualization', 'breakdownColumns'], fromJS(updatedSchemaBreakdownColumns));\n\n      // set the deserialized amountColumns\n      nextState = nextState.setIn(['visualization', 'amountColumns'], fromJS(updatedSchemaAmountColumns));\n      // If grid state has no amounts type set, default to showing incremental amounts.\n      if (visualization && !visualization.amountsType) {\n        nextState = nextState.setIn(['visualization', 'amountsType'], AmountsTypes.Incremental);\n      }\n\n      // If grid state has no amountcolumn, default to showing defaultamount column.\n      if (visualization && !visualization.amountColumn) {\n        nextState = nextState.setIn(['visualization', 'amountColumn'], amountColumn);\n      }\n\n      // If grid state has no breakdown, default to showing defaultbreakdown column.\n      if (visualization && !visualization.breakdown) {\n        nextState = nextState.setIn(['visualization', 'breakdown'], breakdownColumn);\n      }\n\n      // Default target if not set\n      if (visualization && !isTargetValid(Immutable.fromJS(visualization.target))) {\n        nextState = nextState.setIn(['visualization', 'target'], Immutable.Map());\n      }\n\n      // Default legendSortBy if not set\n      if (visualization && !visualization.legendSortBy) {\n        nextState = nextState.setIn(['visualization', 'legendSortBy'], legendSortBy);\n      }\n\n      // Default limit if not set\n      if (visualization && !visualization.limit) {\n        nextState = nextState.setIn(['visualization', 'limit'], limit);\n      }\n\n      // Reset limit if greater than default for pie charts\n      if (graphType === 'pie' && nextState.getIn(['visualization', 'limit']) > DEFAULT_LIMIT) {\n        nextState = nextState.setIn(['visualization', 'limit'], DEFAULT_LIMIT);\n      }\n\n      // To handle cases when some columns may not be present\n      // i.e. customized via the Data Manager\n      if (nextState.getIn(['visualization', 'breakdown'])) {\n        const currentBreakdown = nextState.getIn(['visualization', 'breakdown']);\n        const columns = nextState.getIn(['visualization', 'breakdownColumns']);\n        const visibleBreakdowns = columns ? columns.filter((column) => column.get('visible')) : {};\n\n        if (!visibleBreakdowns.find((column) => column.get('id') === currentBreakdown)) {\n          const newBreakdown = visibleBreakdowns.get(0).get('id');\n          nextState = nextState.setIn(['visualization', 'breakdown'], newBreakdown);\n        }\n      }\n\n      // if this is the first call, add the initial state into the history array\n      if (updateHistory) {\n        // if we are loading up a check image on first load, insure that the history\n        // is updated with another entry so the user can dismiss the check image\n        if (currentCheckData && currentCheckData.quasiId && !isNaN(currentCheckData.rowTop)) {\n          nextState = nextState.update('history', (history) => pushHistory(nextState, history));\n          nextState = nextState.update('currentCheckData', () => fromJS(currentCheckData));\n        }\n\n        return nextState.update('history', (history) => pushHistory(nextState, history));\n      }\n\n      return nextState;\n    },\n\n    GRID_REPORT_STATE_NOT_FOUND(state) {\n      return state.set('alert', 'gridStateNotFound')\n                  .set('loading', false);\n    },\n\n    GRID_REPORT_DISMISS_ALERT(state) {\n      return state.set('alert', null);\n    },\n\n    GRID_REPORT_STATE_LOAD_ERROR(state) {\n      return state.set('alert', 'gridStateUnexpectedError');\n    },\n\n    GRID_REPORT_DATA_LOADING(state) {\n      return state.set('loading', true)\n                  .set('gridDataError', false);\n    },\n\n    GRID_REPORT_DATA_LOADED(state) {\n      return state.set('loading', false);\n    },\n\n    GRID_REPORT_DATA_LOAD_ERROR(state) {\n      return state.set('loading', false)\n                  .set('gridDataError', true);\n    },\n\n    SHOW_TOS(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {showTOS: true})));\n    },\n\n    HIDE_TOS(state) {\n      return state.set('showTOS', false);\n    },\n\n    SHOW_BUDGET_101(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {showBudget101: true})));\n    },\n\n    HIDE_BUDGET_101(state) {\n      return state.set('showBudget101', false);\n    },\n\n    SHOW_GRID_HOWTO(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {showHowTo: true})));\n    },\n\n    HIDE_GRID_HOWTO(state) {\n      return state.set('showHowTo', false);\n    },\n\n    SHOW_EXPORT_FILTER(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {showExportFilter: true})));\n    },\n\n    HIDE_EXPORT_FILTER(state) {\n      return state.set('showExportFilter', false);\n    },\n\n    CLEAR_TARGET(state) {\n      return state.setIn(['visualization', 'target'], Immutable.Map());\n    },\n\n    SET_TARGET(state, { target: { type, value, warning } }) {\n      return state\n        .setIn(['visualization', 'target', 'type'], type)\n        .setIn(['visualization', 'target', 'value'], value)\n        .setIn(['visualization', 'target', 'warning'], warning);\n    },\n\n    HIDE_COLUMN(state, {column, visibility, settingsType, selectAll}) {\n      let updatedColumns = settingsType === 'breakdown' ? state.getIn(['visualization', 'breakdownColumns']) : state.getIn(['visualization', 'amountColumns']);\n      if (selectAll) {\n        column.map((columnData) => {\n          updatedColumns = getUpdatedHiddenColumns(updatedColumns, columnData.get('id'), visibility);\n        });\n      } else {\n        updatedColumns = getUpdatedHiddenColumns(updatedColumns, column.get('id'), visibility);\n      }\n      if (settingsType === 'breakdown') {\n        return state\n          .setIn(['visualization', 'breakdownColumns'], updatedColumns);\n      } else {\n        return state\n          .setIn(['visualization', 'amountColumns'], updatedColumns);\n      }\n    },\n\n    RESET_COLUMN(state, {settingsData, settingsType}) {\n      let updatedColumns = settingsType === 'breakdown' ? state.getIn(['visualization', 'breakdownColumns']) : state.getIn(['visualization', 'amountColumns']);\n      _.each(settingsData, function(data) {\n        updatedColumns = getUpdatedResetColumns(updatedColumns, data);\n      });\n      if (settingsType === 'breakdown') {\n        return state\n          .setIn(['visualization', 'breakdownColumns'], updatedColumns);\n      } else {\n        return state\n          .setIn(['visualization', 'amountColumns'], updatedColumns);\n      }\n    },\n\n    TOGGLE_TARGET_PANEL(state) {\n      return state.set('showTargetPanel', !state.get('showTargetPanel'));\n    },\n\n    TOGGLE_COLUMNS_SETTINGS_PANEL(state) {\n      return state\n        .set('showAmountColumnPanel', !state.get('showAmountColumnPanel'));\n    },\n\n    TOGGLE_BREAKDOWNS_SETTINGS_PANEL(state) {\n      return state\n        .set('showBreakdownsSettingsPanel', !state.get('showBreakdownsSettingsPanel'));\n    },\n\n    RELATED_CHECK_INFORMATION_LOADED(state, action) {\n      return state\n        .setIn(['relatedTransactions', 'loading'], false)\n        .setIn(['relatedTransactions', 'amount'], action.relatedTransactionAmount);\n    },\n\n    SHOW_GRID_WELCOME(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {showWelcome: true})));\n    },\n\n    HIDE_GRID_WELCOME(state) {\n      return state.set('showWelcome', false);\n    },\n\n    SHOW_GRID_TOUR(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {\n        onboardingTour: {\n          showTour: true\n        }\n      })));\n    },\n\n    HIDE_GRID_TOUR(state) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState)));\n    },\n\n    GOTO_TOUR_WAYPOINT(state, action) {\n      return state.mergeDeep(fromJS(_.extend({}, initialModalState, {\n        onboardingTour: {\n          showTour: true,\n          currentStep: action.currentStep\n        }\n      })));\n    },\n\n    GRID_REPORT_GO_BACK(state) {\n      let history = state.get('history');\n      history = history.pop();\n\n      const last = history.last();\n      const {updatedSchemaBreakdownColumns, updatedSchemaAmountColumns} = getSchemaVisualizationColumnsSaving(last, state);\n\n      if (!last) {\n        return state.set('savedStateId', state.get('defaultSavedStateId'));\n      }\n\n      return state.set('history', history)\n                  .set('grid', last.filter(keyIn('query', 'columns', 'amountColumn')))\n                  .set('savedStateId', last.get('id'))\n                  .set('lastXYZDays', last.get('lastXYZDays'))\n                  .mergeDeepIn(['visualization'], fromJS(last.get('visualization')))\n                  .setIn(['visualization', 'amountColumns'], fromJS(last.getIn(['visualization', 'amountColumns'])))\n                  .setIn(['visualization', 'target'], fromJS(last.getIn(['visualization', 'target'])))\n                  .mergeDeepIn(['currentCheckData'], fromJS(last.get('currentCheckData')))\n                  .setIn(['visualization', 'breakdownColumns'], updatedSchemaBreakdownColumns)\n                  .setIn(['visualization', 'amountColumns'], updatedSchemaAmountColumns)\n                  .updateIn(['visualization', 'amountColumn'], amountColumn => {\n                    return amountColumn || state.getIn(['schema', 'amountColumn']);\n                  })\n                  .updateIn(['visualization', 'breakdown'], breakdown => {\n                    return breakdown || state.getIn(['schema', 'breakdown']);\n        });\n    },\n\n    REPORT_GRID_SET_MAP_TYPE(state, action) {\n      return updateMapState(\n        state\n          .setIn(['visualization', 'currentMapType'], action.mapType)\n          .setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null)\n          .setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null)\n      );\n    },\n\n    REPORT_GRID_MAP_LEGEND_SHOW_PREVIOUS_CLICKED(state) {\n      return state.setIn(\n        ['visualization', 'mapLegendPage'],\n        _.max([state.getIn(['visualization', 'mapLegendPage']) - 1, 1])\n      );\n    },\n\n    REPORT_GRID_MAP_LEGEND_SHOW_MORE_CLICKED(state) {\n      return state.setIn(['visualization', 'mapLegendPage'], state.getIn(['visualization', 'mapLegendPage']) + 1);\n    },\n\n    REPORT_GRID_MAP_LEGEND_RESET(state) {\n      return state.setIn(['visualization', 'mapLegendPage'], 1);\n    },\n\n    REPORT_GRID_MAP_TOOLTIP_EDITED(state, action) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'draft'], action.tooltip);\n    },\n\n    REPORT_GRID_MAP_TOOLTIP_SAVED(state, action) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'config'], action.tooltip)\n              .setIn(['visualization', 'mapTooltip', 'draft'], action.tooltip)\n              .setIn(['visualization', 'mapTooltip', 'setupComplete'], true)\n              .setIn(['visualization', 'mapTooltip', 'editing'], false);\n    },\n\n    REPORT_GRID_GET_ROWS_FOR_TOOLTIP(state, action) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'loading'], true)\n              .setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null)\n              .setIn(['visualization', 'mapTooltip', 'locationForTooltip'], action.location);\n    },\n\n    REPORT_GRID_GET_ROWS_FOR_TOOLTIP_SUCCESS(state, action) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'loading'], false)\n              .setIn(['visualization', 'mapTooltip', 'itemsForTooltip'],\n                Immutable.fromJS(action.rowsForTooltip.map(row => parseGeoJson(row)))\n              );\n    },\n\n    REPORT_GRID_GET_ROWS_FOR_TOOLTIP_ERROR(state) {\n      return state.setIn(['visualization', 'mapTooltip', 'loading'], false);\n    },\n\n    REPORT_GRID_SET_MAP_TOOLTIP_EDITING(state) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'editing'], true)\n              .setIn(['visualization', 'mapTooltip', 'draft'], state.getIn(['visualization', 'mapTooltip', 'config']));\n    },\n\n    REPORT_GRID_CLEAR_ROWS_FOR_TOOLTIP(state) {\n      return state\n              .setIn(['visualization', 'mapTooltip', 'loading'], false)\n              .setIn(['visualization', 'mapTooltip', 'itemsForTooltip'], null)\n              .setIn(['visualization', 'mapTooltip', 'locationForTooltip'], null);\n    },\n\n    REPORT_GRID_SET_MAP_LOADING(state) {\n      return state.setIn(['visualization', 'mapLoading'], true);\n    },\n\n    REPORT_GRID_SET_MAP_LOADED(state) {\n      return state.setIn(['visualization', 'mapLoading'], false);\n    },\n\n    REPORT_GRID_MAP_FIT_BOUNDS(state, { bounds }) {\n      return state.setIn(['visualization', 'mapBounds'], bounds);\n    },\n\n    REPORT_GRID_MAP_SET_GRID(state, { grid }) {\n      return state.setIn(['map', 'loaderGrid'], grid);\n    },\n\n    REPORT_GRID_GET_MAP_META_SUCCESS(state, { mapMeta }) {\n      return state.setIn(['map', 'dataStats'],\n        state.getIn(['map', 'dataStats'])\n          .set('isInvalid', false)\n          .set('center', mapMeta.get('center'))\n          .set('bounds', mapMeta.get('bounds'))\n      ).setIn(['map', 'data'], []);\n    },\n\n    REPORT_GRID_GET_MAP_MIN_MAX_VALUES_SUCCESS(state, { min, max }) {\n      const mapAmountColumn = state\n        .getIn(['visualization', 'mapAmountColumnOptions'])\n        .find(option => option.get('id') === state.getIn(['visualization', 'mapAmountColumn']))\n        .toJS();\n\n      const formatter = rawValue => {\n        const value = rawValue === 0 ? rawValue : utils.getSimpleFormatter(mapAmountColumn)(rawValue);\n        const reportAmountType = state.getIn(['visualization', 'reportAmountType']);\n        if (reportAmountType.isCurrency && mapAmountColumn.type === 'monetary') {\n          return reportAmountType.formatter(value);\n        }\n        return value;\n      };\n\n      const newStats = state.getIn(['map', 'dataStats'])\n        .set('minAmount', min)\n        .set('maxAmount', max)\n        .set('formattedMinAmount', formatter(min))\n        .set('formattedMaxAmount', formatter(max));\n\n      return state.setIn(['map', 'dataStats'], newStats);\n    },\n\n    REPORT_GRID_GET_MAP_BREAKDOWN_VALUES_SUCCESS(state, { breakdownValues }) {\n      return updateColorMap(state.set('breakdownValues', breakdownValues));\n    },\n\n    REPORT_GRID_GET_MAP_STATS_FOR_DATASET_SUCCESS(state) {\n      return updateMapLayer(state);\n    },\n\n    REPORT_GRID_MAP_LOAD_GRID_CELLS(state, { loadingGridCells }) {\n      return state\n        .setIn(['map', 'loaderGrid', 'cells'],\n          state.getIn(['map', 'loaderGrid', 'cells']).map(cell => {\n            return loadingGridCells.find(loadingCell => loadingCell.get('bounds') === cell.get('bounds')) || cell;\n          })\n        )\n        .setIn(['visualization', 'mapDataLoading'], true);\n    },\n\n    REPORT_GRID_MAP_LOAD_GRID_CELL_SUCCESS(state, { mapData, loadedCell }) {\n      const currentMapType = state.getIn(['visualization', 'currentMapType']);\n      const dataMax = state.getIn(['map', 'dataStats', 'maxAmount']);\n      const amountColumn = state.getIn(['visualization', 'mapAmountColumn']);\n\n      const updatedMapData = (state.getIn(['map', 'data']) || []).concat(\n        ingestRowsForMap(mapData, currentMapType, amountColumn, dataMax)\n      );\n\n      const updatedLoaderGrid = state.getIn(['map', 'loaderGrid', 'cells']).map(cell => {\n        return loadedCell.get('bounds') === cell.get('bounds') ? loadedCell.set('loaded', true) : cell;\n      });\n\n      return updateMapState(\n        state\n          .setIn(['map', 'loaderGrid', 'cells'], updatedLoaderGrid)\n          .setIn(['map', 'data'], updatedMapData)\n      );\n    },\n\n    REPORT_GRID_MAP_LOAD_GRID_CELLS_SUCCESS(state) {\n      return state.setIn(['visualization', 'mapDataLoading'], false);\n    },\n\n    REPORT_GRID_MAP_RESET(state) {\n      return state.setIn(['map', 'data'], [])\n        .setIn(['map', 'loaderGrid'], null)\n        .setIn(['map', 'legendColorMap'],\n          _.mapValues(state.getIn(['map', 'legendColorMap']), () => null)\n        )\n        .setIn(['map', 'layer'], null);\n    },\n\n    REPORT_GRID_SET_LAST_CREATED_REPORT(state, { report }) {\n      return state.set('lastCreatedReport', report);\n    },\n\n    REPORT_GRID_CLEAR_LAST_CREATED_REPORT(state) {\n      return state.delete('lastCreatedReport');\n    },\n\n    REPORT_GRID_RELOAD_PROPERTIES(state, { properties }) {\n      return Immutable.fromJS(initialState(properties));\n    },\n\n    REPORT_GRID_SET_MAP_AMOUNT_COLUMN(state, { mapAmountColumn }) {\n      return updateMapState(state.setIn(['visualization', 'mapAmountColumn'], mapAmountColumn));\n    },\n\n    REPORT_GRID_SET_HEATMAP_TYPE(state, { heatmapType }) {\n      return state.setIn(['visualization', 'heatmapType'], heatmapType);\n    },\n\n    REPORT_GRID_FILTERED_EXPORT(state, { properties }) {\n      return state.set('filteredExport', properties);\n    },\n\n    REPORT_GRID_SET_AMOUNTS_TYPE(state, { amountsType }) {\n      return state.setIn(['visualization', 'amountsType'], amountsType);\n    },\n\n    REPORT_GRID_SET_AMOUNT_COLUMN(state, action) {\n      return state\n        .setIn(['visualization', 'amountColumn'], action.amountColumn)\n        .setIn(['grid', 'amountColumn'], action.amountColumn);\n    },\n\n    REPORT_GRID_SET_LEGEND_SORT_BY(state, action) {\n      return state.setIn(['visualization', 'legendSortBy'], action.sortId);\n    },\n\n    REPORT_GRID_ADD_ACTIVE_FILTER(state, action) {\n      return state.setIn(['filterState', 'activeFilterIds', action.id], true);\n    },\n\n    REPORT_GRID_REMOVE_ACTIVE_FILTER(state, action) {\n      return state.deleteIn(['filterState', 'activeFilterIds', action.id]);\n    }\n  },\n\n  isGridStateLoaded(id) {\n    return this.getState().get('savedStateId') === id;\n  },\n\n  getUrlState() { //where is the url being read from?\n    const urlState: { query?, embed? } = {};\n    const state = this.getState();\n\n    const query = state.get('savedStateId');\n    if (query) {\n      urlState.query = query;\n    }\n    urlState.embed = getEmbedType();\n\n    return urlState;\n  },\n\n  getSavedState() { //change here if want to update query string with Viz information....\n    //Do not combine check book data with viz information\n    //They are suppose to be seperated, so do not put into hash\n    return savedStateApiFormat(this.getState());\n  },\n\n  isShowingExportFilter() {\n    return this.getState().get('showExportFilter');\n  },\n\n  isLoading() {\n    return this.getState().get('loading');\n  },\n\n  hasError() {\n    return this.getState().get('gridDataError');\n  },\n\n  fiscalYearRange(year) {\n    let start;\n    const fiscalYearStartMonth = this._state.getIn(['schema', 'fiscalYearStartMonth']);\n\n    if (fiscalYearStartMonth === 1) {\n      start = moment([year]);\n    } else {\n      start = moment([year - 1, fiscalYearStartMonth - 1]);\n    }\n\n    const end = moment(start).add(12, 'months').subtract(1, 'day');\n\n    return {start: start.format(), end: end.format()};\n  },\n\n  canGoBack() {\n    return this._state.get('history').size > 1;\n  },\n\n  canReset() {\n    const defaultSavedStateId = this._state.get('defaultSavedStateId');\n\n    if (defaultSavedStateId) {\n      const savedStateId = this._state.get('savedStateId');\n      return this.canGoBack() && savedStateId !== defaultSavedStateId;\n    }\n\n    return this.canGoBack();\n  },\n\n  isEditingMapTooltip() {\n    return this._state.getIn(['visualization', 'mapTooltip', 'editing']);\n  },\n\n  getMapDataBounds() {\n    return this._state.getIn(['map', 'dataStats', 'bounds']);\n  },\n\n  getMapViewportBounds() {\n    return this._state.getIn(['visualization', 'mapBounds']);\n  },\n\n  getMapTooltip() {\n    return this._state.getIn(['visualization', 'mapTooltip']);\n  },\n\n  getMapGrid() {\n    return this._state.getIn(['map', 'loaderGrid']);\n  },\n\n  isMapGraphType() {\n    return this._state.getIn(['visualization', 'graphType']) === 'map';\n  },\n\n  getFirstRowOfMapData() {\n    return this.getMapData().find(getFeatureCoordinates);\n  },\n\n  getMapLayer() {\n    return this._state.getIn(['map', 'layer']);\n  },\n\n  isMapEnabled\n\n});\n\nexport default GridReportStore;\n\nexport { setMomentDate, setMomentFormat }\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/grid_report_store.ts","export const getEmbedType = () => {\n  const embedRegex = /.*embed\\=(graph|table|y|n)/g;\n  const matches = embedRegex.exec(window.location.href)\n  return matches ? matches[1] : 'n';\n}\n\nexport const isEmbed = () => getEmbedType() !== 'n';\n\nexport const hideTable = () => {\n  const embedType = getEmbedType();\n  return embedType === 'graph';\n}\n\nexport const hideViz = () => {\n  return getEmbedType() === 'table';\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/embed_utils.ts","'use strict';\n\nmodule.exports = function getType(val) {\n    if (val instanceof Number) {\n        return 'number';\n    } else if (val instanceof String) {\n        return 'string';\n    } else if (val instanceof Boolean) {\n        return 'boolean';\n    } else if (Array.isArray(val)) {\n        return 'array';\n    } else if (val === null) {\n        return 'null';\n    } else {\n        return typeof val;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/util/get_type.js\n// module id = 72\n// module chunks = 0 1","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js\n// module id = 73\n// module chunks = 0 1","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js\n// module id = 74\n// module chunks = 0 1","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js\n// module id = 75\n// module chunks = 0 1","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js\n// module id = 76\n// module chunks = 0 1","'use strict';\n\nfunction ToObject(val) {\n\tif (val == null) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar keys;\n\tvar to = ToObject(target);\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = arguments[s];\n\t\tkeys = Object.keys(Object(from));\n\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tto[keys[i]] = from[keys[i]];\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/object-assign/index.js\n// module id = 77\n// module chunks = 0 1","'use strict';\n\nvar assign = require('object-assign');\nvar ReactPropTypes = require('prop-types');\nvar Route = require('./Route');\n\nvar PropTypes = assign({}, ReactPropTypes, {\n\n  /**\n   * Indicates that a prop should be falsy.\n   */\n  falsy: function falsy(props, propName, componentName) {\n    if (props[propName]) return new Error('<' + componentName + '> should not have a \"' + propName + '\" prop');\n  },\n\n  /**\n   * Indicates that a prop should be a Route object.\n   */\n  route: ReactPropTypes.instanceOf(Route),\n\n  /**\n   * Indicates that a prop should be a Router object.\n   */\n  //router: ReactPropTypes.instanceOf(Router) // TODO\n  router: ReactPropTypes.func\n\n});\n\nmodule.exports = PropTypes;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/PropTypes.js\n// module id = 78\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.extend = extend;\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.createFrame = createFrame;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;',\n  '=': '&#x3D;'\n};\n\nvar badChars = /[&<>\"'`=]/g,\n    possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n  return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n  for (var i = 1; i < arguments.length; i++) {\n    for (var key in arguments[i]) {\n      if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n        obj[key] = arguments[i][key];\n      }\n    }\n  }\n\n  return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nvar isFunction = function isFunction(value) {\n  return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n  exports.isFunction = isFunction = function (value) {\n    return typeof value === 'function' && toString.call(value) === '[object Function]';\n  };\n}\nexports.isFunction = isFunction;\n\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n  return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};\n\nexports.isArray = isArray;\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\nfunction indexOf(array, value) {\n  for (var i = 0, len = array.length; i < len; i++) {\n    if (array[i] === value) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nfunction escapeExpression(string) {\n  if (typeof string !== 'string') {\n    // don't escape SafeStrings, since they're already safe\n    if (string && string.toHTML) {\n      return string.toHTML();\n    } else if (string == null) {\n      return '';\n    } else if (!string) {\n      return string + '';\n    }\n\n    // Force a string conversion as this will be done by the append regardless and\n    // the regex test will do this transparently behind the scenes, causing issues if\n    // an object's to string has escaped characters in it.\n    string = '' + string;\n  }\n\n  if (!possible.test(string)) {\n    return string;\n  }\n  return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n  if (!value && value !== 0) {\n    return true;\n  } else if (isArray(value) && value.length === 0) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nfunction createFrame(object) {\n  var frame = extend({}, object);\n  frame._parent = object;\n  return frame;\n}\n\nfunction blockParams(params, ids) {\n  params.path = ids;\n  return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n  return (contextPath ? contextPath + '.' : '') + id;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/utils.js\n// module id = 79\n// module chunks = 0 1","import api from '@opengov/og_api';\nimport { Dispatcher } from '@opengov/og_flux';\nimport * as Ovid from '@opengov/ovid';\nimport ReportViewStore from '../stores/report_view_store';\nimport InvitesStore from '../stores/invites_store';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport strings from '../strings';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport Immutable from 'immutable';\n\nexport function loadReportRoles() {\n  const report = ReportViewStore.getRenderedReport();\n\n  api.core.get('reports', report.get('id'), 'report_roles')\n  .end()\n  .then((resp) => {\n    const { report_roles } = resp.body;\n\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_ROLES_LOADED',\n      report_roles\n    });\n  });\n}\n\nexport function updateUserRole(userId, reportId, role) {\n  return api.core.put('reports', reportId, 'invites', userId, { role })\n  .end()\n  .then((resp) => {\n    const invite = resp.body;\n\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_INVITE_ROLE_UPDATED',\n      invite\n    });\n  })\n  .catch((error) => {\n    const { status } = error.requestResponse;\n\n    const errorType = status === 403 ?\n      'notAuthorized' :\n      'error';\n\n    Dispatcher.handleServerAction({\n      actionType: 'REPORT_UPDATE_ROLE_ERROR',\n      errorType\n    });\n  });\n}\n\nexport function dismissError() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_INVITE_DISMISS_ERROR'\n  });\n}\n\nexport function loadEntityUsers() {\n  const entity = ReportViewStore.getReportEntity();\n\n  if (!entity) {\n    return;\n  }\n\n  api.core.get('users', {entity_id: entity.get('entity_id'), limit: 1000})\n    .end()\n    .then((resp) => {\n      const { users } = resp.body;\n\n      Dispatcher.handleServerAction({\n        actionType: 'INVITABLE_USERS_LOADED',\n        users\n      });\n    });\n}\n\nexport function loadedInvitedUsers(invites) {\n  Dispatcher.handleServerAction({\n    actionType: 'INVITED_USERS_LOADED',\n    invites\n  });\n\n  const userId = SessionStore.getSession().get('id');\n  const isInvited = invites && invites.some((invite) => invite.id === userId);\n\n  if (isInvited) {\n    // sinon.spy does not work unless module.exports is here\n    // no.\n    userLastSeenReport(userId);\n  }\n}\n\nexport function userLastSeenReport(userId) {\n  const report = ReportViewStore.getRenderedReport();\n\n  api.core\n    .put(`reports/${report.get('id')}/invites/seen`, {\n      user_id: userId,\n      last_seen: moment().format()\n    })\n    .end()\n    .then(() => {\n      Dispatcher.handleViewAction({\n        actionType: 'REPORT_USER_LAST_SEEN',\n        userId\n      });\n    });\n}\n\nexport function updateSearchQuery(query) {\n  Dispatcher.handleViewAction({\n    actionType: 'UPDATE_INVITEE_SEARCH_QUERY',\n    query\n  });\n}\n\nexport function addMessageUser(user) {\n  Dispatcher.handleViewAction({\n    actionType: 'ADD_USER_TO_MESSAGE_USERS',\n    user\n  });\n}\n\nexport function addMessageAllUsers() {\n  Dispatcher.handleViewAction({\n    actionType: 'ADD_ALL_USERS_TO_MESSAGE_USERS'\n  });\n}\n\nexport function removeMessageUser(user) {\n  Dispatcher.handleViewAction({\n    actionType: 'REMOVE_USER_FROM_MESSAGE_USERS',\n    user\n  });\n}\n\nexport function addUser(user) {\n  const report = ReportViewStore.getRenderedReport();\n  if (!report) {\n    return;\n  }\n\n  Dispatcher.handleViewAction({\n    actionType: 'ADDING_USER_TO_INVITES',\n    user\n  });\n\n  api.core.post('reports', report.get('id'), 'invites', {user_id: user.get('id')})\n    .end()\n    .then(resp => {\n      const filteredUsers = resp.body.filter(item => item.id === user.get('id'));\n\n      if (filteredUsers.length < 1) {\n        Dispatcher.handleServerAction({\n          actionType: 'REPORT_ADD_USER_ERROR',\n          errorType: 'inviteFailed'\n        });\n        return;\n      }\n\n      const updatedUser = filteredUsers[0];\n      Dispatcher.handleViewAction({\n        actionType: 'ADD_USER_TO_INVITES',\n        user: Immutable.fromJS(updatedUser)\n      });\n    });\n}\n\nexport function removeUser(user) {\n  const report = ReportViewStore.getRenderedReport();\n  if (!report) {\n    return;\n  }\n\n  Dispatcher.handleViewAction({\n    actionType: 'REMOVE_USER_FROM_INVITES',\n    user\n  });\n\n  api.core.del('reports', report.get('id'), 'invites', user.get('id'))\n    .end();\n}\n\n\nexport function goToMessagePanel() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n    panel: 'message'\n  });\n}\n\nexport function goToPermissionPanel() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n    panel: 'permission'\n  });\n}\n\nexport function goToOverviewPanel() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_HEADER_SET_SHARE_PANEL',\n    panel: 'overview'\n  });\n}\n\nexport function updateMessage(message) {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_SHARE_UPDATE_MESSAGE',\n    message\n  });\n}\nexport function showSending() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_SHARE_SHOW_SENDING'\n  });\n}\n\nexport function hideSending() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_SHARE_HIDE_SENDING'\n  });\n}\n\nexport function resetShareMessagePanel() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_SHARE_RESET'\n  });\n}\n\nexport function sendMessage({userIds, message}, onSuccess) {\n  const report = ReportViewStore.getRenderedReport();\n  if (!report) {\n    return console.error('You must be viewing a report to send a message about it.');\n  }\n\n  const messageUserNames = InvitesStore.getMessageUsers().toSeq().map(user => user.get('full_name'));\n  const successString = strings.formatShareMessageFlash(messageUserNames.toArray());\n\n  api.core\n    .post('reports', report.get('id'), 'invites', {\n      user_id: userIds,\n      message\n    })\n    .end().then((response) => {\n      resetShareMessagePanel();\n\n      const invites = response.body;\n\n      Dispatcher.handleServerAction({\n        actionType: 'INVITED_USERS_LOADED',\n        invites\n      });\n\n      Ovid.Flash.ftw({\n        title: 'Email sent',\n        message: successString\n      });\n\n      onSuccess();\n    })\n    .catch(() => {\n      hideSending();\n\n      Ovid.Flash.show({\n        title: 'Email cannot be sent',\n        message: 'There was a error sending the report. Try again later.',\n        modifiers: { whoops: true }\n      });\n    });\n}\n\n//This function takes the current time and the cached time the notification was recently stored.\n//If the cache is unset or the current time exceeds the interval during which we do not reshow the notification\n//(1 day), we return false. Otherwise, true\nexport function isPastDeadline(notificationLastSeen, currentDateTime) {\n  return notificationLastSeen === undefined ? true : moment(notificationLastSeen).add(1, 'day').isBefore(currentDateTime);\n}\n\nexport function determineNotificationProperties(userPreferences, currentDateTime) {\n  const reportSharingPreferences = _.get(userPreferences, 'report_sharing_preferences');\n\n  //If server has values set, overwrite the defaults\n  let canShowNotification = _.get(reportSharingPreferences, 'notification_enabled')\n    && isPastDeadline(_.get(reportSharingPreferences, 'notification_last_seen'), currentDateTime);\n  let notificationLastSeen = !canShowNotification ?\n    _.get(reportSharingPreferences, 'notification_last_seen') : currentDateTime;\n\n  //Update preferences object\n  _.extend(userPreferences.report_sharing_preferences, {notification_last_seen: notificationLastSeen});\n\n  return {\n    userPreferences : userPreferences,\n    canShowNotification : canShowNotification\n  };\n}\n\nexport function openNotification() {\n  const userId = SessionStore.getSession().get('id');\n  let cachedUserPreferences = InvitesStore.getUserPreferences();\n  const currentDateTime = moment().format();\n\n  //Only update if we have no cache or current cache is out of date\n  if (cachedUserPreferences === null || isPastDeadline(_.get(cachedUserPreferences, 'report_sharing_preferences.notification_last_seen'), currentDateTime)) {\n    api.core.get('users', userId, 'application_preferences')\n      .end()\n      .then((response) => {\n        let currentUserPreferences = response.body;\n        Dispatcher.handleViewAction({\n          actionType: 'SET_USER_PREFERENCES',\n          userPreferences : currentUserPreferences\n        });\n\n        if (_.get(currentUserPreferences, 'report_sharing_preferences.notification_enabled') === null ||\n          _.get(currentUserPreferences, 'report_sharing_preferences.notification_enabled') === undefined) {\n          _.set(currentUserPreferences, 'report_sharing_preferences.notification_enabled', true);\n        }\n\n        const notificationProperties = determineNotificationProperties(currentUserPreferences, currentDateTime);\n\n        if (_.get(notificationProperties, 'canShowNotification')) {\n          api.core.put('users', userId, 'application_preferences', _.get(notificationProperties, 'userPreferences'))\n            .end()\n            .then(() => {\n              Dispatcher.handleViewAction({\n                actionType: 'REPORT_SHARE_OPEN_NOTIFICATION'\n              });\n            })\n            .catch((error) => {\n              Raven.captureException(error);\n            });\n        }\n      });\n  }\n}\n\nexport function closeNotification() {\n  Dispatcher.handleViewAction({\n    actionType: 'REPORT_SHARE_CLOSE_NOTIFICATION'\n  });\n}\n\nexport function closeAndNeverShowNotification() {\n  const userId = SessionStore.getSession().get('id');\n  let userPreferences = InvitesStore.getUserPreferences();\n\n  closeNotification();\n\n  if (userPreferences) {\n    userPreferences.report_sharing_preferences.notification_enabled = false;\n    api.core.put('users', userId, 'application_preferences', userPreferences).end()\n    .catch((error) => {\n      Raven.captureException(error);\n    });\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/invite_actions.ts","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n// Configuration Constants\nglMatrix.EPSILON = 0.000001;\nglMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\nglMatrix.RANDOM = Math.random;\nglMatrix.ENABLE_SIMD = false;\n\n// Capability detection\nglMatrix.SIMD_AVAILABLE = (glMatrix.ARRAY_TYPE === Float32Array) && ('SIMD' in this);\nglMatrix.USE_SIMD = glMatrix.ENABLE_SIMD && glMatrix.SIMD_AVAILABLE;\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n    glMatrix.ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n\n/**\n* Convert Degree To Radian\n*\n* @param {Number} Angle in Degrees\n*/\nglMatrix.toRadian = function(a){\n     return a * degree;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less \n * than or equal to 1.0, and a relative tolerance is used for larger values)\n * \n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nglMatrix.equals = function(a, b) {\n\treturn Math.abs(a - b) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nmodule.exports = glMatrix;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/common.js\n// module id = 81\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LngLat;\n\nvar wrap = require('../util/util').wrap;\n\n/**\n * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.\n *\n * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option\n * can also accept an `Array` of two numbers and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatLike`](#LngLatLike).\n *\n * @class LngLat\n * @param {number} lng Longitude, measured in degrees.\n * @param {number} lat Latitude, measured in degrees.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n */\nfunction LngLat(lng, lat) {\n    if (isNaN(lng) || isNaN(lat)) {\n        throw new Error('Invalid LngLat object: (' + lng + ', ' + lat + ')');\n    }\n    this.lng = +lng;\n    this.lat = +lat;\n    if (this.lat > 90 || this.lat < -90) {\n        throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n    }\n}\n\n/**\n * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LngLat} The wrapped `LngLat` object.\n * @example\n * var ll = new mapboxgl.LngLat(286.0251, 40.7736);\n * var wrapped = ll.wrap();\n * wrapped.lng; // = -73.9749\n */\nLngLat.prototype.wrap = function () {\n    return new LngLat(wrap(this.lng, -180, 180), this.lat);\n};\n\n/**\n * Returns the coordinates represented as an array of two numbers.\n *\n * @returns {Array<number>} The coordinates represeted as an array of longitude and latitude.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toArray(); // = [-73.9749, 40.7736]\n */\nLngLat.prototype.toArray = function () {\n    return [this.lng, this.lat];\n};\n\n/**\n * Returns the coordinates represent as a string.\n *\n * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n */\nLngLat.prototype.toString = function () {\n    return 'LngLat(' + this.lng + ', ' + this.lat + ')';\n};\n\n/**\n * Converts an array of two numbers to a `LngLat` object.\n *\n * If a `LngLat` object is passed in, the function returns it unchanged.\n *\n * @param {LngLatLike} input An array of two numbers to convert, or a `LngLat` object to return.\n * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.\n * @example\n * var arr = [-73.9749, 40.7736];\n * var ll = mapboxgl.LngLat.convert(arr);\n * ll;   // = LngLat {lng: -73.9749, lat: 40.7736}\n */\nLngLat.convert = function (input) {\n    if (input instanceof LngLat) {\n        return input;\n    }\n    if (Array.isArray(input)) {\n        return new LngLat(input[0], input[1]);\n    }\n    return input;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/geo/lng_lat.js\n// module id = 82\n// module chunks = 0 1","import { Dispatcher } from '@opengov/og_flux';\nimport api from '@opengov/og_api';\nimport * as Ovid from '@opengov/ovid';\n\nimport ReportActions from '../actions/report_actions';\nimport SettingsPanelStore from '../stores/settings_panel_store';\n\nimport { trackIntercomEvent } from '../utils/intercom_utils';\nimport { GridReportActions } from './grid_report_actions';\n\nexport default {\n  selectCategory(category) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_SELECT_CATEGORY',\n      category\n    });\n  },\n\n  goBack() {\n    // Close the report data wizard panel if we are backing out of it.\n    if (!SettingsPanelStore.getState().get('isOpen')) {\n      ReportActions.closeEditData();\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_GO_BACK'\n    });\n  },\n\n  changeAttribute(fieldPath, newValue) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_CHANGE_ATTRIBUTE',\n      fieldPath,\n      newValue\n    });\n  },\n\n  cancel() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_CANCEL'\n    });\n  },\n\n  save() {\n    const updatedReport = SettingsPanelStore.getState().get('updatedReport');\n\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_SAVE'\n    });\n\n    api.put('reports', updatedReport.get('id'), updatedReport.toJS()).end()\n      .then(() => {\n        ReportActions.updatedReport(updatedReport);\n        const metadata = {\n          name: updatedReport.get('name'),\n          coa_mask_id: updatedReport.get('coa_mask_id'),\n          visibility: updatedReport.get('visibility')\n        };\n        trackIntercomEvent('update-report', metadata);\n        Dispatcher.handleServerAction({\n          actionType: 'REPORT_SETTINGS_SAVE_SUCCESS'\n        });\n        Ovid.Flash.ftw({\n          title: 'Success!',\n          message: 'Report settings successfully saved'\n        });\n\n        if (updatedReport.getIn(['properties', 'summary_table_visible'])) {\n          GridReportActions.getVisualAggregates();\n        }\n      })\n      .catch(err => {\n        const {requestResponse} = err;\n\n        if (requestResponse && requestResponse.status === 422) {\n          Dispatcher.handleServerAction({\n            actionType: 'REPORT_SETTINGS_SAVE_ERROR',\n            errors: requestResponse.body.errors\n          });\n\n        } else {\n          Ovid.Alert.unexpectedError();\n        }\n      })\n      .finally(() => {\n        Dispatcher.handleServerAction({\n          actionType: 'REPORT_SETTINGS_SAVE_DONE'\n        });\n      });\n  },\n\n  deleteReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_DELETE_REPORT'\n    });\n  },\n\n  confirmedDeleteReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_DELETE_REPORT_CONFIRMED'\n    });\n\n    const reportId = SettingsPanelStore.getState().getIn(['updatedReport', 'id']);\n    api.del('reports', reportId).end()\n      .then((res) => {\n        if (res.ok) {\n          Dispatcher.handleServerAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT_SUCCESS'\n          });\n          trackIntercomEvent('delete-report');\n        } else {\n          Dispatcher.handleServerAction({\n            actionType: 'REPORT_SETTINGS_DELETE_REPORT_ERROR'\n          });\n        }\n      });\n  },\n\n  cancelDeleteReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_DELETE_REPORT_CANCELED'\n    });\n  },\n\n  finishDeleteReport() {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_DELETE_REPORT_FINISHED'\n    });\n  },\n\n  changeDataSetOrder(from, to) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_CHANGE_DATA_SET_ORDER',\n      from, to\n    });\n  },\n\n  renameDataSet(dataSetIndex, name) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_RENAME_DATA_SET',\n      dataSetIndex, name\n    });\n  },\n\n  changeXAxisLabel(label) {\n    Dispatcher.handleViewAction({\n      actionType: 'REPORT_SETTINGS_CHANGE_XAXIS_LABEL',\n      label\n    });\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/settings_panel_actions.ts","'use strict';\nif (require('./_descriptors')) {\n  var LIBRARY = require('./_library');\n  var global = require('./_global');\n  var fails = require('./_fails');\n  var $export = require('./_export');\n  var $typed = require('./_typed');\n  var $buffer = require('./_typed-buffer');\n  var ctx = require('./_ctx');\n  var anInstance = require('./_an-instance');\n  var propertyDesc = require('./_property-desc');\n  var hide = require('./_hide');\n  var redefineAll = require('./_redefine-all');\n  var toInteger = require('./_to-integer');\n  var toLength = require('./_to-length');\n  var toIndex = require('./_to-index');\n  var toAbsoluteIndex = require('./_to-absolute-index');\n  var toPrimitive = require('./_to-primitive');\n  var has = require('./_has');\n  var classof = require('./_classof');\n  var isObject = require('./_is-object');\n  var toObject = require('./_to-object');\n  var isArrayIter = require('./_is-array-iter');\n  var create = require('./_object-create');\n  var getPrototypeOf = require('./_object-gpo');\n  var gOPN = require('./_object-gopn').f;\n  var getIterFn = require('./core.get-iterator-method');\n  var uid = require('./_uid');\n  var wks = require('./_wks');\n  var createArrayMethod = require('./_array-methods');\n  var createArrayIncludes = require('./_array-includes');\n  var speciesConstructor = require('./_species-constructor');\n  var ArrayIterators = require('./es6.array.iterator');\n  var Iterators = require('./_iterators');\n  var $iterDetect = require('./_iter-detect');\n  var setSpecies = require('./_set-species');\n  var arrayFill = require('./_array-fill');\n  var arrayCopyWithin = require('./_array-copy-within');\n  var $DP = require('./_object-dp');\n  var $GOPD = require('./_object-gopd');\n  var dP = $DP.f;\n  var gOPD = $GOPD.f;\n  var RangeError = global.RangeError;\n  var TypeError = global.TypeError;\n  var Uint8Array = global.Uint8Array;\n  var ARRAY_BUFFER = 'ArrayBuffer';\n  var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n  var PROTOTYPE = 'prototype';\n  var ArrayProto = Array[PROTOTYPE];\n  var $ArrayBuffer = $buffer.ArrayBuffer;\n  var $DataView = $buffer.DataView;\n  var arrayForEach = createArrayMethod(0);\n  var arrayFilter = createArrayMethod(2);\n  var arraySome = createArrayMethod(3);\n  var arrayEvery = createArrayMethod(4);\n  var arrayFind = createArrayMethod(5);\n  var arrayFindIndex = createArrayMethod(6);\n  var arrayIncludes = createArrayIncludes(true);\n  var arrayIndexOf = createArrayIncludes(false);\n  var arrayValues = ArrayIterators.values;\n  var arrayKeys = ArrayIterators.keys;\n  var arrayEntries = ArrayIterators.entries;\n  var arrayLastIndexOf = ArrayProto.lastIndexOf;\n  var arrayReduce = ArrayProto.reduce;\n  var arrayReduceRight = ArrayProto.reduceRight;\n  var arrayJoin = ArrayProto.join;\n  var arraySort = ArrayProto.sort;\n  var arraySlice = ArrayProto.slice;\n  var arrayToString = ArrayProto.toString;\n  var arrayToLocaleString = ArrayProto.toLocaleString;\n  var ITERATOR = wks('iterator');\n  var TAG = wks('toStringTag');\n  var TYPED_CONSTRUCTOR = uid('typed_constructor');\n  var DEF_CONSTRUCTOR = uid('def_constructor');\n  var ALL_CONSTRUCTORS = $typed.CONSTR;\n  var TYPED_ARRAY = $typed.TYPED;\n  var VIEW = $typed.VIEW;\n  var WRONG_LENGTH = 'Wrong length!';\n\n  var $map = createArrayMethod(1, function (O, length) {\n    return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n  });\n\n  var LITTLE_ENDIAN = fails(function () {\n    // eslint-disable-next-line no-undef\n    return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n  });\n\n  var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n    new Uint8Array(1).set({});\n  });\n\n  var toOffset = function (it, BYTES) {\n    var offset = toInteger(it);\n    if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n    return offset;\n  };\n\n  var validate = function (it) {\n    if (isObject(it) && TYPED_ARRAY in it) return it;\n    throw TypeError(it + ' is not a typed array!');\n  };\n\n  var allocate = function (C, length) {\n    if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n      throw TypeError('It is not a typed array constructor!');\n    } return new C(length);\n  };\n\n  var speciesFromList = function (O, list) {\n    return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n  };\n\n  var fromList = function (C, list) {\n    var index = 0;\n    var length = list.length;\n    var result = allocate(C, length);\n    while (length > index) result[index] = list[index++];\n    return result;\n  };\n\n  var addGetter = function (it, key, internal) {\n    dP(it, key, { get: function () { return this._d[internal]; } });\n  };\n\n  var $from = function from(source /* , mapfn, thisArg */) {\n    var O = toObject(source);\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var iterFn = getIterFn(O);\n    var i, length, values, result, step, iterator;\n    if (iterFn != undefined && !isArrayIter(iterFn)) {\n      for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n        values.push(step.value);\n      } O = values;\n    }\n    if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n    for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n      result[i] = mapping ? mapfn(O[i], i) : O[i];\n    }\n    return result;\n  };\n\n  var $of = function of(/* ...items */) {\n    var index = 0;\n    var length = arguments.length;\n    var result = allocate(this, length);\n    while (length > index) result[index] = arguments[index++];\n    return result;\n  };\n\n  // iOS Safari 6.x fails here\n  var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n  var $toLocaleString = function toLocaleString() {\n    return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n  };\n\n  var proto = {\n    copyWithin: function copyWithin(target, start /* , end */) {\n      return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n    },\n    every: function every(callbackfn /* , thisArg */) {\n      return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n      return arrayFill.apply(validate(this), arguments);\n    },\n    filter: function filter(callbackfn /* , thisArg */) {\n      return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n        arguments.length > 1 ? arguments[1] : undefined));\n    },\n    find: function find(predicate /* , thisArg */) {\n      return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    findIndex: function findIndex(predicate /* , thisArg */) {\n      return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    forEach: function forEach(callbackfn /* , thisArg */) {\n      arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    indexOf: function indexOf(searchElement /* , fromIndex */) {\n      return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    includes: function includes(searchElement /* , fromIndex */) {\n      return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    join: function join(separator) { // eslint-disable-line no-unused-vars\n      return arrayJoin.apply(validate(this), arguments);\n    },\n    lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n      return arrayLastIndexOf.apply(validate(this), arguments);\n    },\n    map: function map(mapfn /* , thisArg */) {\n      return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n      return arrayReduce.apply(validate(this), arguments);\n    },\n    reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n      return arrayReduceRight.apply(validate(this), arguments);\n    },\n    reverse: function reverse() {\n      var that = this;\n      var length = validate(that).length;\n      var middle = Math.floor(length / 2);\n      var index = 0;\n      var value;\n      while (index < middle) {\n        value = that[index];\n        that[index++] = that[--length];\n        that[length] = value;\n      } return that;\n    },\n    some: function some(callbackfn /* , thisArg */) {\n      return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n    },\n    sort: function sort(comparefn) {\n      return arraySort.call(validate(this), comparefn);\n    },\n    subarray: function subarray(begin, end) {\n      var O = validate(this);\n      var length = O.length;\n      var $begin = toAbsoluteIndex(begin, length);\n      return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n        O.buffer,\n        O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n        toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n      );\n    }\n  };\n\n  var $slice = function slice(start, end) {\n    return speciesFromList(this, arraySlice.call(validate(this), start, end));\n  };\n\n  var $set = function set(arrayLike /* , offset */) {\n    validate(this);\n    var offset = toOffset(arguments[1], 1);\n    var length = this.length;\n    var src = toObject(arrayLike);\n    var len = toLength(src.length);\n    var index = 0;\n    if (len + offset > length) throw RangeError(WRONG_LENGTH);\n    while (index < len) this[offset + index] = src[index++];\n  };\n\n  var $iterators = {\n    entries: function entries() {\n      return arrayEntries.call(validate(this));\n    },\n    keys: function keys() {\n      return arrayKeys.call(validate(this));\n    },\n    values: function values() {\n      return arrayValues.call(validate(this));\n    }\n  };\n\n  var isTAIndex = function (target, key) {\n    return isObject(target)\n      && target[TYPED_ARRAY]\n      && typeof key != 'symbol'\n      && key in target\n      && String(+key) == String(key);\n  };\n  var $getDesc = function getOwnPropertyDescriptor(target, key) {\n    return isTAIndex(target, key = toPrimitive(key, true))\n      ? propertyDesc(2, target[key])\n      : gOPD(target, key);\n  };\n  var $setDesc = function defineProperty(target, key, desc) {\n    if (isTAIndex(target, key = toPrimitive(key, true))\n      && isObject(desc)\n      && has(desc, 'value')\n      && !has(desc, 'get')\n      && !has(desc, 'set')\n      // TODO: add validation descriptor w/o calling accessors\n      && !desc.configurable\n      && (!has(desc, 'writable') || desc.writable)\n      && (!has(desc, 'enumerable') || desc.enumerable)\n    ) {\n      target[key] = desc.value;\n      return target;\n    } return dP(target, key, desc);\n  };\n\n  if (!ALL_CONSTRUCTORS) {\n    $GOPD.f = $getDesc;\n    $DP.f = $setDesc;\n  }\n\n  $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n    getOwnPropertyDescriptor: $getDesc,\n    defineProperty: $setDesc\n  });\n\n  if (fails(function () { arrayToString.call({}); })) {\n    arrayToString = arrayToLocaleString = function toString() {\n      return arrayJoin.call(this);\n    };\n  }\n\n  var $TypedArrayPrototype$ = redefineAll({}, proto);\n  redefineAll($TypedArrayPrototype$, $iterators);\n  hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n  redefineAll($TypedArrayPrototype$, {\n    slice: $slice,\n    set: $set,\n    constructor: function () { /* noop */ },\n    toString: arrayToString,\n    toLocaleString: $toLocaleString\n  });\n  addGetter($TypedArrayPrototype$, 'buffer', 'b');\n  addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n  addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n  addGetter($TypedArrayPrototype$, 'length', 'e');\n  dP($TypedArrayPrototype$, TAG, {\n    get: function () { return this[TYPED_ARRAY]; }\n  });\n\n  // eslint-disable-next-line max-statements\n  module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n    CLAMPED = !!CLAMPED;\n    var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n    var GETTER = 'get' + KEY;\n    var SETTER = 'set' + KEY;\n    var TypedArray = global[NAME];\n    var Base = TypedArray || {};\n    var TAC = TypedArray && getPrototypeOf(TypedArray);\n    var FORCED = !TypedArray || !$typed.ABV;\n    var O = {};\n    var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n    var getter = function (that, index) {\n      var data = that._d;\n      return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n    };\n    var setter = function (that, index, value) {\n      var data = that._d;\n      if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n      data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n    };\n    var addElement = function (that, index) {\n      dP(that, index, {\n        get: function () {\n          return getter(this, index);\n        },\n        set: function (value) {\n          return setter(this, index, value);\n        },\n        enumerable: true\n      });\n    };\n    if (FORCED) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME, '_d');\n        var index = 0;\n        var offset = 0;\n        var buffer, byteLength, length, klass;\n        if (!isObject(data)) {\n          length = toIndex(data);\n          byteLength = length * BYTES;\n          buffer = new $ArrayBuffer(byteLength);\n        } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          buffer = data;\n          offset = toOffset($offset, BYTES);\n          var $len = data.byteLength;\n          if ($length === undefined) {\n            if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n            byteLength = $len - offset;\n            if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n          } else {\n            byteLength = toLength($length) * BYTES;\n            if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n          }\n          length = byteLength / BYTES;\n        } else if (TYPED_ARRAY in data) {\n          return fromList(TypedArray, data);\n        } else {\n          return $from.call(TypedArray, data);\n        }\n        hide(that, '_d', {\n          b: buffer,\n          o: offset,\n          l: byteLength,\n          e: length,\n          v: new $DataView(buffer)\n        });\n        while (index < length) addElement(that, index++);\n      });\n      TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n      hide(TypedArrayPrototype, 'constructor', TypedArray);\n    } else if (!fails(function () {\n      TypedArray(1);\n    }) || !fails(function () {\n      new TypedArray(-1); // eslint-disable-line no-new\n    }) || !$iterDetect(function (iter) {\n      new TypedArray(); // eslint-disable-line no-new\n      new TypedArray(null); // eslint-disable-line no-new\n      new TypedArray(1.5); // eslint-disable-line no-new\n      new TypedArray(iter); // eslint-disable-line no-new\n    }, true)) {\n      TypedArray = wrapper(function (that, data, $offset, $length) {\n        anInstance(that, TypedArray, NAME);\n        var klass;\n        // `ws` module bug, temporarily remove validation length for Uint8Array\n        // https://github.com/websockets/ws/pull/645\n        if (!isObject(data)) return new Base(toIndex(data));\n        if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n          return $length !== undefined\n            ? new Base(data, toOffset($offset, BYTES), $length)\n            : $offset !== undefined\n              ? new Base(data, toOffset($offset, BYTES))\n              : new Base(data);\n        }\n        if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n        return $from.call(TypedArray, data);\n      });\n      arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n        if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n      });\n      TypedArray[PROTOTYPE] = TypedArrayPrototype;\n      if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n    }\n    var $nativeIterator = TypedArrayPrototype[ITERATOR];\n    var CORRECT_ITER_NAME = !!$nativeIterator\n      && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n    var $iterator = $iterators.values;\n    hide(TypedArray, TYPED_CONSTRUCTOR, true);\n    hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n    hide(TypedArrayPrototype, VIEW, true);\n    hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n    if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n      dP(TypedArrayPrototype, TAG, {\n        get: function () { return NAME; }\n      });\n    }\n\n    O[NAME] = TypedArray;\n\n    $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n    $export($export.S, NAME, {\n      BYTES_PER_ELEMENT: BYTES\n    });\n\n    $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n      from: $from,\n      of: $of\n    });\n\n    if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n    $export($export.P, NAME, proto);\n\n    setSpecies(NAME);\n\n    $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n    $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n    if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n    $export($export.P + $export.F * fails(function () {\n      new TypedArray(1).slice();\n    }), NAME, { slice: $slice });\n\n    $export($export.P + $export.F * (fails(function () {\n      return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n    }) || !fails(function () {\n      TypedArrayPrototype.toLocaleString.call([1, 2]);\n    })), NAME, { toLocaleString: $toLocaleString });\n\n    Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n    if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n  };\n} else module.exports = function () { /* empty */ };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js\n// module id = 84\n// module chunks = 0 1","var Map = require('./es6.map');\nvar $export = require('./_export');\nvar shared = require('./_shared')('metadata');\nvar store = shared.store || (shared.store = new (require('./es6.weak-map'))());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n  var targetMetadata = store.get(target);\n  if (!targetMetadata) {\n    if (!create) return undefined;\n    store.set(target, targetMetadata = new Map());\n  }\n  var keyMetadata = targetMetadata.get(targetKey);\n  if (!keyMetadata) {\n    if (!create) return undefined;\n    targetMetadata.set(targetKey, keyMetadata = new Map());\n  } return keyMetadata;\n};\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n  var metadataMap = getOrCreateMetadataMap(O, P, false);\n  return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n  var metadataMap = getOrCreateMetadataMap(O, P, false);\n  return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n  getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n  var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n  var keys = [];\n  if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });\n  return keys;\n};\nvar toMetaKey = function (it) {\n  return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\nvar exp = function (O) {\n  $export($export.S, 'Reflect', O);\n};\n\nmodule.exports = {\n  store: store,\n  map: getOrCreateMetadataMap,\n  has: ordinaryHasOwnMetadata,\n  get: ordinaryGetOwnMetadata,\n  set: ordinaryDefineOwnMetadata,\n  keys: ordinaryOwnMetadataKeys,\n  key: toMetaKey,\n  exp: exp\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js\n// module id = 85\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar consoleLogger = {\n  type: 'logger',\n\n  log: function log(args) {\n    this._output('log', args);\n  },\n  warn: function warn(args) {\n    this._output('warn', args);\n  },\n  error: function error(args) {\n    this._output('error', args);\n  },\n  _output: function _output(type, args) {\n    if (console && console[type]) console[type].apply(console, Array.prototype.slice.call(args));\n  }\n};\n\nvar Logger = function () {\n  function Logger(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Logger);\n\n    this.subs = [];\n    this.init(concreteLogger, options);\n  }\n\n  Logger.prototype.init = function init(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    this.prefix = options.prefix || 'i18next:';\n    this.logger = concreteLogger || consoleLogger;\n    this.options = options;\n    this.debug = options.debug === false ? false : true;\n  };\n\n  Logger.prototype.setDebug = function setDebug(bool) {\n    this.debug = bool;\n    this.subs.forEach(function (sub) {\n      sub.setDebug(bool);\n    });\n  };\n\n  Logger.prototype.log = function log() {\n    this.forward(arguments, 'log', '', true);\n  };\n\n  Logger.prototype.warn = function warn() {\n    this.forward(arguments, 'warn', '', true);\n  };\n\n  Logger.prototype.error = function error() {\n    this.forward(arguments, 'error', '');\n  };\n\n  Logger.prototype.deprecate = function deprecate() {\n    this.forward(arguments, 'warn', 'WARNING DEPRECATED: ', true);\n  };\n\n  Logger.prototype.forward = function forward(args, lvl, prefix, debugOnly) {\n    if (debugOnly && !this.debug) return;\n    if (typeof args[0] === 'string') args[0] = prefix + this.prefix + ' ' + args[0];\n    this.logger[lvl](args);\n  };\n\n  Logger.prototype.create = function create(moduleName) {\n    var sub = new Logger(this.logger, _extends({ prefix: this.prefix + ':' + moduleName + ':' }, this.options));\n    this.subs.push(sub);\n\n    return sub;\n  };\n\n  // createInstance(options = {}) {\n  //   return new Logger(options, callback);\n  // }\n\n  return Logger;\n}();\n\n;\n\nexports.default = new Logger();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/logger.js\n// module id = 86\n// module chunks = 0 1","// Definitions of number types and their formatters\nimport { Record } from 'immutable';\n\nconst base = Record({\n  symbol: '',\n  isCurrency: false,\n  label: '',\n  formatter: value => value\n});\n\nexport const numberTypes = {\n  dollar: base({\n    symbol: '$',\n    isCurrency: true,\n    label: 'Dollar',\n    formatter: (value, space = '') => `$${space}${value}`\n  }),\n  pound: base({\n    symbol: '£',\n    isCurrency: true,\n    label: 'Pound',\n    formatter: (value, space = '') => `£${space}${value}`\n  }),\n  fte: base({\n    symbol: 'FTE',\n    isCurrency: false,\n    label: 'FTE'\n  }),\n  number: base({\n    symbol: '',\n    isCurrency: false,\n    label: ''\n  }),\n  percentage: base({\n    symbol: '%',\n    isCurrency: false,\n    label: 'Percentage',\n    formatter: value => `${value}%`\n  }),\n  interpolated: base({\n    symbol: 'interpolated',\n    isCurrency: false,\n    label: 'Interpolated'\n  }),\n  incidents: base({\n    symbol: '',\n    isCurrency: false,\n    label: 'Incidents',\n    formatter: value => `${value} incidents`\n  }),\n  // 'type' is any other format type\n  per: (type, name) => base(({\n    isCurrency: type.isCurrency,\n    label: 'Per',\n    formatter: value => `${type.formatter(value)} per ${name}`\n  })),\n  none: base()\n};\n\nexport const accountTypeAndLocaleToNumberType = (accountType, locale) => {\n  return accountType === 'fteCount'\n      ? numberTypes.fte\n      : localeToCurrency(locale);\n};\n\n// this assumes the default locale is 'en_US'\nexport const localeToCurrency = locale => {\n  switch (locale) {\n  case 'en_GB':\n    return numberTypes.pound;\n  }\n  return numberTypes.dollar;\n};\n\nexport const columnTypeToNumberType = (columnType, locale) => {\n  switch (columnType) {\n  case 'monetary':\n    return localeToCurrency(locale);\n  case 'percent':\n    return numberTypes.percentage;\n  case 'numeric':\n  default:\n    return numberTypes.number;\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/numberTypes.ts","'use strict';\n\nexports.getJSON = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.setRequestHeader('Accept', 'application/json');\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            var data;\n            try {\n                data = JSON.parse(xhr.response);\n            } catch (err) {\n                return callback(err);\n            }\n            callback(null, data);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.responseType = 'arraybuffer';\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            callback(null, xhr.response);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nfunction sameOrigin(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.protocol === document.location.protocol && a.host === document.location.host;\n}\n\nexports.getImage = function(url, callback) {\n    return exports.getArrayBuffer(url, function(err, imgData) {\n        if (err) return callback(err);\n        var img = new Image();\n        img.onload = function() {\n            callback(null, img);\n            (window.URL || window.webkitURL).revokeObjectURL(img.src);\n        };\n        var blob = new Blob([new Uint8Array(imgData)], { type: 'image/png' });\n        img.src = (window.URL || window.webkitURL).createObjectURL(blob);\n        img.getData = function() {\n            var canvas = document.createElement('canvas');\n            var context = canvas.getContext('2d');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            context.drawImage(img, 0, 0);\n            return context.getImageData(0, 0, img.width, img.height).data;\n        };\n        return img;\n    });\n};\n\nexports.getVideo = function(urls, callback) {\n    var video = document.createElement('video');\n    video.onloadstart = function() {\n        callback(null, video);\n    };\n    for (var i = 0; i < urls.length; i++) {\n        var s = document.createElement('source');\n        if (!sameOrigin(urls[i])) {\n            video.crossOrigin = 'Anonymous';\n        }\n        s.src = urls[i];\n        video.appendChild(s);\n    }\n    video.getData = function() { return video; };\n    return video;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/ajax.js\n// module id = 88\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LngLat;\n\nvar wrap = require('../util/util').wrap;\n\n/**\n * Create a longitude, latitude object from a given longitude and latitude pair in degrees.\n * Mapbox GL uses Longitude, Latitude coordinate order to match GeoJSON.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object can also accept an\n * `Array` and will perform an implicit conversion.  The following lines are equivalent:\n ```\n map.setCenter([-73.9749, 40.7736]);\n map.setCenter( new mapboxgl.LngLat(-73.9749, 40.7736) );\n ```\n *\n * @class LngLat\n * @classdesc A representation of a longitude, latitude point, in degrees.\n * @param {number} lng longitude\n * @param {number} lat latitude\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n */\nfunction LngLat(lng, lat) {\n    if (isNaN(lng) || isNaN(lat)) {\n        throw new Error('Invalid LngLat object: (' + lng + ', ' + lat + ')');\n    }\n    this.lng = +lng;\n    this.lat = +lat;\n    if (this.lat > 90 || this.lat < -90) {\n        throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n    }\n}\n\n/**\n * Return a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LngLat} wrapped LngLat object\n * @example\n * var ll = new mapboxgl.LngLat(286.0251, 40.7736);\n * var wrapped = ll.wrap();\n * wrapped.lng; // = -73.9749\n */\nLngLat.prototype.wrap = function () {\n    return new LngLat(wrap(this.lng, -180, 180), this.lat);\n};\n\n/**\n * Return a `LngLat` as an array\n *\n * @returns {array} [lng, lat]\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toArray(); // = [-73.9749, 40.7736]\n */\nLngLat.prototype.toArray = function () {\n    return [this.lng, this.lat];\n};\n\n/**\n * Return a `LngLat` as a string\n *\n * @returns {string} \"LngLat(lng, lat)\"\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n */\nLngLat.prototype.toString = function () {\n    return 'LngLat(' + this.lng + ', ' + this.lat + ')';\n};\n\n/**\n * Convert an array to a `LngLat` object, or return an existing `LngLat` object\n * unchanged.\n *\n * @param {Array<number>|LngLat} input `input` to convert\n * @returns {LngLat} LngLat object or original input\n * @example\n * var arr = [-73.9749, 40.7736];\n * var ll = mapboxgl.LngLat.convert(arr);\n * ll;   // = LngLat {lng: -73.9749, lat: 40.7736}\n */\nLngLat.convert = function (input) {\n    if (input instanceof LngLat) {\n        return input;\n    }\n    if (Array.isArray(input)) {\n        return new LngLat(input[0], input[1]);\n    }\n    return input;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/lng_lat.js\n// module id = 89\n// module chunks = 0 1","/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.3.2\n */\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n// END HEADER\n\nexports.glMatrix = require(\"./gl-matrix/common.js\");\nexports.mat2 = require(\"./gl-matrix/mat2.js\");\nexports.mat2d = require(\"./gl-matrix/mat2d.js\");\nexports.mat3 = require(\"./gl-matrix/mat3.js\");\nexports.mat4 = require(\"./gl-matrix/mat4.js\");\nexports.quat = require(\"./gl-matrix/quat.js\");\nexports.vec2 = require(\"./gl-matrix/vec2.js\");\nexports.vec3 = require(\"./gl-matrix/vec3.js\");\nexports.vec4 = require(\"./gl-matrix/vec4.js\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix.js\n// module id = 90\n// module chunks = 0 1","'use strict';\n\nexports.getJSON = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.setRequestHeader('Accept', 'application/json');\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            var data;\n            try {\n                data = JSON.parse(xhr.response);\n            } catch (err) {\n                return callback(err);\n            }\n            callback(null, data);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.responseType = 'arraybuffer';\n    xhr.onerror = function(e) {\n        callback(e);\n    };\n    xhr.onload = function() {\n        if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n            callback(null, xhr.response);\n        } else {\n            callback(new Error(xhr.statusText));\n        }\n    };\n    xhr.send();\n    return xhr;\n};\n\nfunction sameOrigin(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.protocol === document.location.protocol && a.host === document.location.host;\n}\n\nexports.getImage = function(url, callback) {\n    return exports.getArrayBuffer(url, function(err, imgData) {\n        if (err) return callback(err);\n        var img = new Image();\n        img.onload = function() {\n            callback(null, img);\n            (window.URL || window.webkitURL).revokeObjectURL(img.src);\n        };\n        var blob = new Blob([new Uint8Array(imgData)], { type: 'image/png' });\n        img.src = (window.URL || window.webkitURL).createObjectURL(blob);\n        img.getData = function() {\n            var canvas = document.createElement('canvas');\n            var context = canvas.getContext('2d');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            context.drawImage(img, 0, 0);\n            return context.getImageData(0, 0, img.width, img.height).data;\n        };\n        return img;\n    });\n};\n\nexports.getVideo = function(urls, callback) {\n    var video = document.createElement('video');\n    video.onloadstart = function() {\n        callback(null, video);\n    };\n    for (var i = 0; i < urls.length; i++) {\n        var s = document.createElement('source');\n        if (!sameOrigin(urls[i])) {\n            video.crossOrigin = 'Anonymous';\n        }\n        s.src = urls[i];\n        video.appendChild(s);\n    }\n    video.getData = function() { return video; };\n    return video;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/browser/ajax.js\n// module id = 91\n// module chunks = 0 1","'use strict';\n\n// http://dev.w3.org/csswg/css-color/\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HEX3 = /^#([a-f0-9]{3})$/i;\nvar hex3 = function hex3(value) {\n    var match = value.match(HEX3);\n    if (match) {\n        return [parseInt(match[1][0] + match[1][0], 16), parseInt(match[1][1] + match[1][1], 16), parseInt(match[1][2] + match[1][2], 16), null];\n    }\n    return false;\n};\n\nvar HEX6 = /^#([a-f0-9]{6})$/i;\nvar hex6 = function hex6(value) {\n    var match = value.match(HEX6);\n    if (match) {\n        return [parseInt(match[1].substring(0, 2), 16), parseInt(match[1].substring(2, 4), 16), parseInt(match[1].substring(4, 6), 16), null];\n    }\n    return false;\n};\n\nvar RGB = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/;\nvar rgb = function rgb(value) {\n    var match = value.match(RGB);\n    if (match) {\n        return [Number(match[1]), Number(match[2]), Number(match[3]), null];\n    }\n    return false;\n};\n\nvar RGBA = /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?\\.?\\d+)\\s*\\)$/;\nvar rgba = function rgba(value) {\n    var match = value.match(RGBA);\n    if (match && match.length > 4) {\n        return [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4])];\n    }\n    return false;\n};\n\nvar fromArray = function fromArray(array) {\n    return [Math.min(array[0], 255), Math.min(array[1], 255), Math.min(array[2], 255), array.length > 3 ? array[3] : null];\n};\n\nvar namedColor = function namedColor(name) {\n    var color = NAMED_COLORS[name.toLowerCase()];\n    return color ? color : false;\n};\n\nvar Color = function () {\n    function Color(value) {\n        _classCallCheck(this, Color);\n\n        var _ref = Array.isArray(value) ? fromArray(value) : hex3(value) || rgb(value) || rgba(value) || namedColor(value) || hex6(value) || [0, 0, 0, null],\n            _ref2 = _slicedToArray(_ref, 4),\n            r = _ref2[0],\n            g = _ref2[1],\n            b = _ref2[2],\n            a = _ref2[3];\n\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n    }\n\n    _createClass(Color, [{\n        key: 'isTransparent',\n        value: function isTransparent() {\n            return this.a === 0;\n        }\n    }, {\n        key: 'toString',\n        value: function toString() {\n            return this.a !== null && this.a !== 1 ? 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + this.a + ')' : 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';\n        }\n    }]);\n\n    return Color;\n}();\n\nexports.default = Color;\n\n\nvar NAMED_COLORS = {\n    transparent: [0, 0, 0, 0],\n    aliceblue: [240, 248, 255, null],\n    antiquewhite: [250, 235, 215, null],\n    aqua: [0, 255, 255, null],\n    aquamarine: [127, 255, 212, null],\n    azure: [240, 255, 255, null],\n    beige: [245, 245, 220, null],\n    bisque: [255, 228, 196, null],\n    black: [0, 0, 0, null],\n    blanchedalmond: [255, 235, 205, null],\n    blue: [0, 0, 255, null],\n    blueviolet: [138, 43, 226, null],\n    brown: [165, 42, 42, null],\n    burlywood: [222, 184, 135, null],\n    cadetblue: [95, 158, 160, null],\n    chartreuse: [127, 255, 0, null],\n    chocolate: [210, 105, 30, null],\n    coral: [255, 127, 80, null],\n    cornflowerblue: [100, 149, 237, null],\n    cornsilk: [255, 248, 220, null],\n    crimson: [220, 20, 60, null],\n    cyan: [0, 255, 255, null],\n    darkblue: [0, 0, 139, null],\n    darkcyan: [0, 139, 139, null],\n    darkgoldenrod: [184, 134, 11, null],\n    darkgray: [169, 169, 169, null],\n    darkgreen: [0, 100, 0, null],\n    darkgrey: [169, 169, 169, null],\n    darkkhaki: [189, 183, 107, null],\n    darkmagenta: [139, 0, 139, null],\n    darkolivegreen: [85, 107, 47, null],\n    darkorange: [255, 140, 0, null],\n    darkorchid: [153, 50, 204, null],\n    darkred: [139, 0, 0, null],\n    darksalmon: [233, 150, 122, null],\n    darkseagreen: [143, 188, 143, null],\n    darkslateblue: [72, 61, 139, null],\n    darkslategray: [47, 79, 79, null],\n    darkslategrey: [47, 79, 79, null],\n    darkturquoise: [0, 206, 209, null],\n    darkviolet: [148, 0, 211, null],\n    deeppink: [255, 20, 147, null],\n    deepskyblue: [0, 191, 255, null],\n    dimgray: [105, 105, 105, null],\n    dimgrey: [105, 105, 105, null],\n    dodgerblue: [30, 144, 255, null],\n    firebrick: [178, 34, 34, null],\n    floralwhite: [255, 250, 240, null],\n    forestgreen: [34, 139, 34, null],\n    fuchsia: [255, 0, 255, null],\n    gainsboro: [220, 220, 220, null],\n    ghostwhite: [248, 248, 255, null],\n    gold: [255, 215, 0, null],\n    goldenrod: [218, 165, 32, null],\n    gray: [128, 128, 128, null],\n    green: [0, 128, 0, null],\n    greenyellow: [173, 255, 47, null],\n    grey: [128, 128, 128, null],\n    honeydew: [240, 255, 240, null],\n    hotpink: [255, 105, 180, null],\n    indianred: [205, 92, 92, null],\n    indigo: [75, 0, 130, null],\n    ivory: [255, 255, 240, null],\n    khaki: [240, 230, 140, null],\n    lavender: [230, 230, 250, null],\n    lavenderblush: [255, 240, 245, null],\n    lawngreen: [124, 252, 0, null],\n    lemonchiffon: [255, 250, 205, null],\n    lightblue: [173, 216, 230, null],\n    lightcoral: [240, 128, 128, null],\n    lightcyan: [224, 255, 255, null],\n    lightgoldenrodyellow: [250, 250, 210, null],\n    lightgray: [211, 211, 211, null],\n    lightgreen: [144, 238, 144, null],\n    lightgrey: [211, 211, 211, null],\n    lightpink: [255, 182, 193, null],\n    lightsalmon: [255, 160, 122, null],\n    lightseagreen: [32, 178, 170, null],\n    lightskyblue: [135, 206, 250, null],\n    lightslategray: [119, 136, 153, null],\n    lightslategrey: [119, 136, 153, null],\n    lightsteelblue: [176, 196, 222, null],\n    lightyellow: [255, 255, 224, null],\n    lime: [0, 255, 0, null],\n    limegreen: [50, 205, 50, null],\n    linen: [250, 240, 230, null],\n    magenta: [255, 0, 255, null],\n    maroon: [128, 0, 0, null],\n    mediumaquamarine: [102, 205, 170, null],\n    mediumblue: [0, 0, 205, null],\n    mediumorchid: [186, 85, 211, null],\n    mediumpurple: [147, 112, 219, null],\n    mediumseagreen: [60, 179, 113, null],\n    mediumslateblue: [123, 104, 238, null],\n    mediumspringgreen: [0, 250, 154, null],\n    mediumturquoise: [72, 209, 204, null],\n    mediumvioletred: [199, 21, 133, null],\n    midnightblue: [25, 25, 112, null],\n    mintcream: [245, 255, 250, null],\n    mistyrose: [255, 228, 225, null],\n    moccasin: [255, 228, 181, null],\n    navajowhite: [255, 222, 173, null],\n    navy: [0, 0, 128, null],\n    oldlace: [253, 245, 230, null],\n    olive: [128, 128, 0, null],\n    olivedrab: [107, 142, 35, null],\n    orange: [255, 165, 0, null],\n    orangered: [255, 69, 0, null],\n    orchid: [218, 112, 214, null],\n    palegoldenrod: [238, 232, 170, null],\n    palegreen: [152, 251, 152, null],\n    paleturquoise: [175, 238, 238, null],\n    palevioletred: [219, 112, 147, null],\n    papayawhip: [255, 239, 213, null],\n    peachpuff: [255, 218, 185, null],\n    peru: [205, 133, 63, null],\n    pink: [255, 192, 203, null],\n    plum: [221, 160, 221, null],\n    powderblue: [176, 224, 230, null],\n    purple: [128, 0, 128, null],\n    rebeccapurple: [102, 51, 153, null],\n    red: [255, 0, 0, null],\n    rosybrown: [188, 143, 143, null],\n    royalblue: [65, 105, 225, null],\n    saddlebrown: [139, 69, 19, null],\n    salmon: [250, 128, 114, null],\n    sandybrown: [244, 164, 96, null],\n    seagreen: [46, 139, 87, null],\n    seashell: [255, 245, 238, null],\n    sienna: [160, 82, 45, null],\n    silver: [192, 192, 192, null],\n    skyblue: [135, 206, 235, null],\n    slateblue: [106, 90, 205, null],\n    slategray: [112, 128, 144, null],\n    slategrey: [112, 128, 144, null],\n    snow: [255, 250, 250, null],\n    springgreen: [0, 255, 127, null],\n    steelblue: [70, 130, 180, null],\n    tan: [210, 180, 140, null],\n    teal: [0, 128, 128, null],\n    thistle: [216, 191, 216, null],\n    tomato: [255, 99, 71, null],\n    turquoise: [64, 224, 208, null],\n    violet: [238, 130, 238, null],\n    wheat: [245, 222, 179, null],\n    white: [255, 255, 255, null],\n    whitesmoke: [245, 245, 245, null],\n    yellow: [255, 255, 0, null],\n    yellowgreen: [154, 205, 50, null]\n};\n\nvar TRANSPARENT = exports.TRANSPARENT = new Color([0, 0, 0, 0]);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Color.js\n// module id = 92\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBoundCurves = exports.calculatePaddingBoxPath = exports.calculateBorderBoxPath = exports.parsePathForBorder = exports.parseDocumentSize = exports.calculateContentBox = exports.calculatePaddingBox = exports.parseBounds = exports.Bounds = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Vector = require('./drawing/Vector');\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _BezierCurve = require('./drawing/BezierCurve');\n\nvar _BezierCurve2 = _interopRequireDefault(_BezierCurve);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TOP = 0;\nvar RIGHT = 1;\nvar BOTTOM = 2;\nvar LEFT = 3;\n\nvar H = 0;\nvar V = 1;\n\nvar Bounds = exports.Bounds = function () {\n    function Bounds(x, y, w, h) {\n        _classCallCheck(this, Bounds);\n\n        this.left = x;\n        this.top = y;\n        this.width = w;\n        this.height = h;\n    }\n\n    _createClass(Bounds, null, [{\n        key: 'fromClientRect',\n        value: function fromClientRect(clientRect, scrollX, scrollY) {\n            return new Bounds(clientRect.left + scrollX, clientRect.top + scrollY, clientRect.width, clientRect.height);\n        }\n    }]);\n\n    return Bounds;\n}();\n\nvar parseBounds = exports.parseBounds = function parseBounds(node, scrollX, scrollY) {\n    return Bounds.fromClientRect(node.getBoundingClientRect(), scrollX, scrollY);\n};\n\nvar calculatePaddingBox = exports.calculatePaddingBox = function calculatePaddingBox(bounds, borders) {\n    return new Bounds(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth));\n};\n\nvar calculateContentBox = exports.calculateContentBox = function calculateContentBox(bounds, padding, borders) {\n    // TODO support percentage paddings\n    var paddingTop = padding[TOP].value;\n    var paddingRight = padding[RIGHT].value;\n    var paddingBottom = padding[BOTTOM].value;\n    var paddingLeft = padding[LEFT].value;\n\n    return new Bounds(bounds.left + paddingLeft + borders[LEFT].borderWidth, bounds.top + paddingTop + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth + paddingLeft + paddingRight), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth + paddingTop + paddingBottom));\n};\n\nvar parseDocumentSize = exports.parseDocumentSize = function parseDocumentSize(document) {\n    var body = document.body;\n    var documentElement = document.documentElement;\n\n    if (!body || !documentElement) {\n        throw new Error(process.env.NODE_ENV !== 'production' ? 'Unable to get document size' : '');\n    }\n    var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));\n\n    var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));\n\n    return new Bounds(0, 0, width, height);\n};\n\nvar parsePathForBorder = exports.parsePathForBorder = function parsePathForBorder(curves, borderSide) {\n    switch (borderSide) {\n        case TOP:\n            return createPathFromCurves(curves.topLeftOuter, curves.topLeftInner, curves.topRightOuter, curves.topRightInner);\n        case RIGHT:\n            return createPathFromCurves(curves.topRightOuter, curves.topRightInner, curves.bottomRightOuter, curves.bottomRightInner);\n        case BOTTOM:\n            return createPathFromCurves(curves.bottomRightOuter, curves.bottomRightInner, curves.bottomLeftOuter, curves.bottomLeftInner);\n        case LEFT:\n        default:\n            return createPathFromCurves(curves.bottomLeftOuter, curves.bottomLeftInner, curves.topLeftOuter, curves.topLeftInner);\n    }\n};\n\nvar createPathFromCurves = function createPathFromCurves(outer1, inner1, outer2, inner2) {\n    var path = [];\n    if (outer1 instanceof _BezierCurve2.default) {\n        path.push(outer1.subdivide(0.5, false));\n    } else {\n        path.push(outer1);\n    }\n\n    if (outer2 instanceof _BezierCurve2.default) {\n        path.push(outer2.subdivide(0.5, true));\n    } else {\n        path.push(outer2);\n    }\n\n    if (inner2 instanceof _BezierCurve2.default) {\n        path.push(inner2.subdivide(0.5, true).reverse());\n    } else {\n        path.push(inner2);\n    }\n\n    if (inner1 instanceof _BezierCurve2.default) {\n        path.push(inner1.subdivide(0.5, false).reverse());\n    } else {\n        path.push(inner1);\n    }\n\n    return path;\n};\n\nvar calculateBorderBoxPath = exports.calculateBorderBoxPath = function calculateBorderBoxPath(curves) {\n    return [curves.topLeftOuter, curves.topRightOuter, curves.bottomRightOuter, curves.bottomLeftOuter];\n};\n\nvar calculatePaddingBoxPath = exports.calculatePaddingBoxPath = function calculatePaddingBoxPath(curves) {\n    return [curves.topLeftInner, curves.topRightInner, curves.bottomRightInner, curves.bottomLeftInner];\n};\n\nvar parseBoundCurves = exports.parseBoundCurves = function parseBoundCurves(bounds, borders, borderRadius) {\n    var HALF_WIDTH = bounds.width / 2;\n    var HALF_HEIGHT = bounds.height / 2;\n    var tlh = borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var tlv = borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var trh = borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var trv = borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var brh = borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var brv = borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n    var blh = borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width) < HALF_WIDTH ? borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width) : HALF_WIDTH;\n    var blv = borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height) < HALF_HEIGHT ? borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height) : HALF_HEIGHT;\n\n    var topWidth = bounds.width - trh;\n    var rightHeight = bounds.height - brv;\n    var bottomWidth = bounds.width - brh;\n    var leftHeight = bounds.height - blv;\n\n    return {\n        topLeftOuter: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT) : new _Vector2.default(bounds.left, bounds.top),\n        topLeftInner: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, Math.max(0, tlh - borders[LEFT].borderWidth), Math.max(0, tlv - borders[TOP].borderWidth), CORNER.TOP_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth),\n        topRightOuter: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top),\n        topRightInner: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borders[LEFT].borderWidth), bounds.top + borders[TOP].borderWidth, topWidth > bounds.width + borders[LEFT].borderWidth ? 0 : trh - borders[LEFT].borderWidth, trv - borders[TOP].borderWidth, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + borders[TOP].borderWidth),\n        bottomRightOuter: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top + bounds.height),\n        bottomRightInner: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borders[LEFT].borderWidth), bounds.top + Math.min(rightHeight, bounds.height + borders[TOP].borderWidth), Math.max(0, brh - borders[RIGHT].borderWidth), brv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth),\n        bottomLeftOuter: blh > 0 || blv > 0 ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left, bounds.top + bounds.height),\n        bottomLeftInner: blh > 0 || blv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + leftHeight, Math.max(0, blh - borders[LEFT].borderWidth), blv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth)\n    };\n};\n\nvar CORNER = {\n    TOP_LEFT: 0,\n    TOP_RIGHT: 1,\n    BOTTOM_RIGHT: 2,\n    BOTTOM_LEFT: 3\n};\n\nvar getCurvePoints = function getCurvePoints(x, y, r1, r2, position) {\n    var kappa = 4 * ((Math.sqrt(2) - 1) / 3);\n    var ox = r1 * kappa; // control point offset horizontal\n    var oy = r2 * kappa; // control point offset vertical\n    var xm = x + r1; // x-middle\n    var ym = y + r2; // y-middle\n\n    switch (position) {\n        case CORNER.TOP_LEFT:\n            return new _BezierCurve2.default(new _Vector2.default(x, ym), new _Vector2.default(x, ym - oy), new _Vector2.default(xm - ox, y), new _Vector2.default(xm, y));\n        case CORNER.TOP_RIGHT:\n            return new _BezierCurve2.default(new _Vector2.default(x, y), new _Vector2.default(x + ox, y), new _Vector2.default(xm, ym - oy), new _Vector2.default(xm, ym));\n        case CORNER.BOTTOM_RIGHT:\n            return new _BezierCurve2.default(new _Vector2.default(xm, y), new _Vector2.default(xm, y + oy), new _Vector2.default(x + ox, ym), new _Vector2.default(x, ym));\n        case CORNER.BOTTOM_LEFT:\n        default:\n            return new _BezierCurve2.default(new _Vector2.default(xm, ym), new _Vector2.default(xm - ox, ym), new _Vector2.default(x, y + oy), new _Vector2.default(x, y));\n    }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Bounds.js\n// module id = 93\n// module chunks = 0 1","module.exports = false;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_library.js\n// module id = 94\n// module chunks = 0 1","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js\n// module id = 95\n// module chunks = 0 1","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js\n// module id = 96\n// module chunks = 0 1","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar assign = require('object-assign');\nvar invariant = require('invariant');\nvar warning = require('./warning');\nvar PathUtils = require('./PathUtils');\n\nvar _currentRoute;\n\nvar Route = (function () {\n  _createClass(Route, null, [{\n    key: 'createRoute',\n\n    /**\n     * Creates and returns a new route. Options may be a URL pathname string\n     * with placeholders for named params or an object with any of the following\n     * properties:\n     *\n     * - name                     The name of the route. This is used to lookup a\n     *                            route relative to its parent route and should be\n     *                            unique among all child routes of the same parent\n     * - path                     A URL pathname string with optional placeholders\n     *                            that specify the names of params to extract from\n     *                            the URL when the path matches. Defaults to `/${name}`\n     *                            when there is a name given, or the path of the parent\n     *                            route, or /\n     * - ignoreScrollBehavior     True to make this route (and all descendants) ignore\n     *                            the scroll behavior of the router\n     * - isDefault                True to make this route the default route among all\n     *                            its siblings\n     * - isNotFound               True to make this route the \"not found\" route among\n     *                            all its siblings\n     * - onEnter                  A transition hook that will be called when the\n     *                            router is going to enter this route\n     * - onLeave                  A transition hook that will be called when the\n     *                            router is going to leave this route\n     * - handler                  A React component that will be rendered when\n     *                            this route is active\n     * - parentRoute              The parent route to use for this route. This option\n     *                            is automatically supplied when creating routes inside\n     *                            the callback to another invocation of createRoute. You\n     *                            only ever need to use this when declaring routes\n     *                            independently of one another to manually piece together\n     *                            the route hierarchy\n     *\n     * The callback may be used to structure your route hierarchy. Any call to\n     * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect\n     * inside the callback automatically uses this route as its parent.\n     */\n    value: function createRoute(options, callback) {\n      options = options || {};\n\n      if (typeof options === 'string') options = { path: options };\n\n      var parentRoute = _currentRoute;\n\n      if (parentRoute) {\n        warning(options.parentRoute == null || options.parentRoute === parentRoute, 'You should not use parentRoute with createRoute inside another route\\'s child callback; it is ignored');\n      } else {\n        parentRoute = options.parentRoute;\n      }\n\n      var name = options.name;\n      var path = options.path || name;\n\n      if (path && !(options.isDefault || options.isNotFound)) {\n        if (PathUtils.isAbsolute(path)) {\n          if (parentRoute) {\n            invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, 'You cannot nest path \"%s\" inside \"%s\"; the parent requires URL parameters', path, parentRoute.path);\n          }\n        } else if (parentRoute) {\n          // Relative paths extend their parent.\n          path = PathUtils.join(parentRoute.path, path);\n        } else {\n          path = '/' + path;\n        }\n      } else {\n        path = parentRoute ? parentRoute.path : '/';\n      }\n\n      if (options.isNotFound && !/\\*$/.test(path)) path += '*'; // Auto-append * to the path of not found routes.\n\n      var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler);\n\n      if (parentRoute) {\n        if (route.isDefault) {\n          invariant(parentRoute.defaultRoute == null, '%s may not have more than one default route', parentRoute);\n\n          parentRoute.defaultRoute = route;\n        } else if (route.isNotFound) {\n          invariant(parentRoute.notFoundRoute == null, '%s may not have more than one not found route', parentRoute);\n\n          parentRoute.notFoundRoute = route;\n        }\n\n        parentRoute.appendChild(route);\n      }\n\n      // Any routes created in the callback\n      // use this route as their parent.\n      if (typeof callback === 'function') {\n        var currentRoute = _currentRoute;\n        _currentRoute = route;\n        callback.call(route, route);\n        _currentRoute = currentRoute;\n      }\n\n      return route;\n    }\n\n    /**\n     * Creates and returns a route that is rendered when its parent matches\n     * the current URL.\n     */\n  }, {\n    key: 'createDefaultRoute',\n    value: function createDefaultRoute(options) {\n      return Route.createRoute(assign({}, options, { isDefault: true }));\n    }\n\n    /**\n     * Creates and returns a route that is rendered when its parent matches\n     * the current URL but none of its siblings do.\n     */\n  }, {\n    key: 'createNotFoundRoute',\n    value: function createNotFoundRoute(options) {\n      return Route.createRoute(assign({}, options, { isNotFound: true }));\n    }\n\n    /**\n     * Creates and returns a route that automatically redirects the transition\n     * to another route. In addition to the normal options to createRoute, this\n     * function accepts the following options:\n     *\n     * - from         An alias for the `path` option. Defaults to *\n     * - to           The path/route/route name to redirect to\n     * - params       The params to use in the redirect URL. Defaults\n     *                to using the current params\n     * - query        The query to use in the redirect URL. Defaults\n     *                to using the current query\n     */\n  }, {\n    key: 'createRedirect',\n    value: function createRedirect(options) {\n      return Route.createRoute(assign({}, options, {\n        path: options.path || options.from || '*',\n        onEnter: function onEnter(transition, params, query) {\n          transition.redirect(options.to, options.params || params, options.query || query);\n        }\n      }));\n    }\n  }]);\n\n  function Route(name, path, ignoreScrollBehavior, isDefault, isNotFound, onEnter, onLeave, handler) {\n    _classCallCheck(this, Route);\n\n    this.name = name;\n    this.path = path;\n    this.paramNames = PathUtils.extractParamNames(this.path);\n    this.ignoreScrollBehavior = !!ignoreScrollBehavior;\n    this.isDefault = !!isDefault;\n    this.isNotFound = !!isNotFound;\n    this.onEnter = onEnter;\n    this.onLeave = onLeave;\n    this.handler = handler;\n  }\n\n  /**\n   * Appends the given route to this route's child routes.\n   */\n\n  _createClass(Route, [{\n    key: 'appendChild',\n    value: function appendChild(route) {\n      invariant(route instanceof Route, 'route.appendChild must use a valid Route');\n\n      if (!this.childRoutes) this.childRoutes = [];\n\n      this.childRoutes.push(route);\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      var string = '<Route';\n\n      if (this.name) string += ' name=\"' + this.name + '\"';\n\n      string += ' path=\"' + this.path + '\">';\n\n      return string;\n    }\n  }]);\n\n  return Route;\n})();\n\nmodule.exports = Route;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Route.js\n// module id = 97\n// module chunks = 0 1","/**\n * @license\n * lodash 3.6.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -d -o ./index.js`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '3.6.0';\n\n  /** Used to compose bitmasks for wrapper metadata. */\n  var BIND_FLAG = 1,\n      BIND_KEY_FLAG = 2,\n      CURRY_BOUND_FLAG = 4,\n      CURRY_FLAG = 8,\n      CURRY_RIGHT_FLAG = 16,\n      PARTIAL_FLAG = 32,\n      PARTIAL_RIGHT_FLAG = 64,\n      ARY_FLAG = 128,\n      REARG_FLAG = 256;\n\n  /** Used as default options for `_.trunc`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect when a function becomes hot. */\n  var HOT_COUNT = 150,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_DROP_WHILE_FLAG = 0,\n      LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2;\n\n  /** Used as the `TypeError` message for \"Functions\" methods. */\n  var FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      objectTag = '[object Object]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      weakMapTag = '[object WeakMap]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,\n      reUnescapedHtml = /[&<>\"'`]/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n   */\n  var reComboMarks = /[\\u0300-\\u036f\\ufe20-\\ufe23]/g;\n\n  /**\n   * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect hexadecimal string values. */\n  var reHexPrefix = /^0[xX]/;\n\n  /** Used to detect host constructors (Safari > 5). */\n  var reHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n  var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /**\n   * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).\n   * In addition to special characters the forward slash is escaped to allow for\n   * easier `eval` use and `Function` compilation.\n   */\n  var reRegExpChars = /[.*+?^${}()|[\\]\\/\\\\]/g,\n      reHasRegExpChars = RegExp(reRegExpChars.source);\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to match words to create compound words. */\n  var reWords = (function() {\n    var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n        lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n    return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n  }());\n\n  /** Used to detect and test for whitespace. */\n  var whitespace = (\n    // Basic whitespace characters.\n    ' \\t\\x0b\\f\\xa0\\ufeff' +\n\n    // Line terminators.\n    '\\n\\r\\u2028\\u2029' +\n\n    // Unicode category \"Zs\" space separators.\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',\n    'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',\n    'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    'window'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dateTag] = typedArrayTags[errorTag] =\n  typedArrayTags[funcTag] = typedArrayTags[mapTag] =\n  typedArrayTags[numberTag] = typedArrayTags[objectTag] =\n  typedArrayTags[regexpTag] = typedArrayTags[setTag] =\n  typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\n  cloneableTags[dateTag] = cloneableTags[float32Tag] =\n  cloneableTags[float64Tag] = cloneableTags[int8Tag] =\n  cloneableTags[int16Tag] = cloneableTags[int32Tag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[stringTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[mapTag] = cloneableTags[setTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used as an internal `_.debounce` options object by `_.throttle`. */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used to map latin-1 supplementary letters to basic latin letters. */\n  var deburredLetters = {\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcC': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xeC': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '`': '&#96;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\",\n    '&#96;': '`'\n  };\n\n  /** Used to determine if values are of the language type `Object`. */\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Detect free variable `exports`. */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n  /** Detect free variable `window`. */\n  var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /**\n   * Used as a reference to the global object.\n   *\n   * The `this` value is used if it is the global object to avoid Greasemonkey's\n   * restricted `window` object, otherwise the `window` object is used.\n   */\n  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `compareAscending` which compares values and\n   * sorts them in ascending order without guaranteeing a stable sort.\n   *\n   * @private\n   * @param {*} value The value to compare to `other`.\n   * @param {*} other The value to compare to `value`.\n   * @returns {number} Returns the sort order indicator for `value`.\n   */\n  function baseCompareAscending(value, other) {\n    if (value !== other) {\n      var valIsReflexive = value === value,\n          othIsReflexive = other === other;\n\n      if (value > other || !valIsReflexive || (typeof value == 'undefined' && othIsReflexive)) {\n        return 1;\n      }\n      if (value < other || !othIsReflexive || (typeof other == 'undefined' && valIsReflexive)) {\n        return -1;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromRight) {\n    var length = array.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    if (value !== value) {\n      return indexOfNaN(array, fromIndex);\n    }\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isFunction` without support for environments\n   * with incorrect `typeof` results.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n   */\n  function baseIsFunction(value) {\n    // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n    // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n    return typeof value == 'function' || false;\n  }\n\n  /**\n   * Converts `value` to a string if it is not one. An empty string is returned\n   * for `null` or `undefined` values.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n  function baseToString(value) {\n    if (typeof value == 'string') {\n      return value;\n    }\n    return value == null ? '' : (value + '');\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback for string values.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the code unit of the first character of the string.\n   */\n  function charAtCallback(string) {\n    return string.charCodeAt(0);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the first character not found in `chars`.\n   */\n  function charsLeftIndex(string, chars) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the last character not found in `chars`.\n   */\n  function charsRightIndex(string, chars) {\n    var index = string.length;\n\n    while (index-- && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.sortBy` to compare transformed elements of a collection and stable\n   * sort them in ascending order.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function compareAscending(object, other) {\n    return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);\n  }\n\n  /**\n   * Used by `_.sortByOrder` to compare multiple properties of each element\n   * in a collection and stable sort them in the following order:\n   *\n   * If orders is unspecified, sort in ascending order for all properties.\n   * Otherwise, for each property, sort in ascending order if its corresponding value in\n   * orders is true, and descending order if false.\n   *\n   * @private\n   * @param {Object} object The object to compare to `other`.\n   * @param {Object} other The object to compare to `object`.\n   * @param {boolean[]} orders The order to sort by for each property.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function compareMultiple(object, other, orders) {\n    var index = -1,\n        objCriteria = object.criteria,\n        othCriteria = other.criteria,\n        length = objCriteria.length,\n        ordersLength = orders.length;\n\n    while (++index < length) {\n      var result = baseCompareAscending(objCriteria[index], othCriteria[index]);\n      if (result) {\n        if (index >= ordersLength) {\n          return result;\n        }\n        return result * (orders[index] ? 1 : -1);\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to provide the same value for\n    // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n    // for more details.\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See https://code.google.com/p/v8/issues/detail?id=90 for more details.\n    return object.index - other.index;\n  }\n\n  /**\n   * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  function deburrLetter(letter) {\n    return deburredLetters[letter];\n  }\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeHtmlChar(chr) {\n    return htmlEscapes[chr];\n  }\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the index at which the first occurrence of `NaN` is found in `array`.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n   */\n  function indexOfNaN(array, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 0 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var other = array[index];\n      if (other !== other) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Checks if `value` is object-like.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   */\n  function isObjectLike(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n   * character code is whitespace.\n   *\n   * @private\n   * @param {number} charCode The character code to inspect.\n   * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n   */\n  function isSpace(charCode) {\n    return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||\n      (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      if (array[index] === placeholder) {\n        array[index] = PLACEHOLDER;\n        result[++resIndex] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * An implementation of `_.uniq` optimized for sorted arrays without support\n   * for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} [iteratee] The function invoked per iteration.\n   * @returns {Array} Returns the new duplicate-value-free array.\n   */\n  function sortedUniq(array, iteratee) {\n    var seen,\n        index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index],\n          computed = iteratee ? iteratee(value, index, array) : value;\n\n      if (!index || seen !== computed) {\n        seen = computed;\n        result[++resIndex] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the first non-whitespace character.\n   */\n  function trimmedLeftIndex(string) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedRightIndex(string) {\n    var index = string.length;\n\n    while (index-- && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  function unescapeHtmlChar(chr) {\n    return htmlUnescapes[chr];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the given `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utility\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // using `context` to mock `Date#getTime` use in `_.now`\n   * var mock = _.runInContext({\n   *   'Date': function() {\n   *     return { 'getTime': getTimeMock };\n   *   }\n   * });\n   *\n   * // or creating a suped-up `defer` in Node.js\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See https://es5.github.io/#x11.1.5 for more details.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for native method references. */\n    var arrayProto = Array.prototype,\n        objectProto = Object.prototype,\n        stringProto = String.prototype;\n\n    /** Used to detect DOM support. */\n    var document = (document = context.window) && document.document;\n\n    /** Used to resolve the decompiled source of functions. */\n    var fnToString = Function.prototype.toString;\n\n    /** Used to the length of n-tuples for `_.unzip`. */\n    var getLength = baseProperty('length');\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /**\n     * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n     * of values.\n     */\n    var objToString = objectProto.toString;\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = context._;\n\n    /** Used to detect if a method is native. */\n    var reNative = RegExp('^' +\n      escapeRegExp(objToString)\n      .replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Native method references. */\n    var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer,\n        bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice,\n        ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        push = arrayProto.push,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        Set = isNative(Set = context.Set) && Set,\n        setTimeout = context.setTimeout,\n        splice = arrayProto.splice,\n        Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array,\n        WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap;\n\n    /** Used to clone array buffers. */\n    var Float64Array = (function() {\n      // Safari 5 errors when using an array buffer to initialize a typed array\n      // where the array buffer's `byteLength` is not a multiple of the typed\n      // array's `BYTES_PER_ELEMENT`.\n      try {\n        var func = isNative(func = context.Float64Array) && func,\n            result = new func(new ArrayBuffer(10), 0, 1) && func;\n      } catch(e) {}\n      return result;\n    }());\n\n    /* Native method references for those with the same name as other `lodash` methods. */\n    var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsFinite = context.isFinite,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = isNative(nativeNow = Date.now) && nativeNow,\n        nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used as references for `-Infinity` and `Infinity`. */\n    var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,\n        POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n    /** Used as references for the maximum length and index of an array. */\n    var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1,\n        MAX_ARRAY_INDEX =  MAX_ARRAY_LENGTH - 1,\n        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n    /** Used as the size, in bytes, of each `Float64Array` element. */\n    var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;\n\n    /**\n     * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n     * of an array-like value.\n     */\n    var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n     * Methods that operate on and return arrays, collections, and functions can\n     * be chained together. Methods that return a boolean or single value will\n     * automatically end the chain returning the unwrapped value. Explicit chaining\n     * may be enabled using `_.chain`. The execution of chained methods is lazy,\n     * that is, execution is deferred until `_#value` is implicitly or explicitly\n     * called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n     * fusion is an optimization that merges iteratees to avoid creating intermediate\n     * arrays and reduce the number of iteratee executions.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n     * `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n     * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n     * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n     * and `where`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n     * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n     * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`,\n     * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`,\n     * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,\n     * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,\n     * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,\n     * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`, `merge`,\n     * `mixin`, `negate`, `noop`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n     * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n     * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,\n     * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,\n     * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`,\n     * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`,\n     * `without`, `wrap`, `xor`, `zip`, and `zipObject`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,\n     * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,\n     * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,\n     * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,\n     * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,\n     * `isFinite`,`isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,\n     * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`,\n     * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`,\n     * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`,\n     * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`,\n     * `startCase`, `startsWith`, `sum`, `template`, `trim`, `trimLeft`,\n     * `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`\n     *\n     * The wrapper method `sample` will return a wrapped value when `n` is provided,\n     * otherwise an unwrapped value is returned.\n     *\n     * @name _\n     * @constructor\n     * @category Chain\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, n) {\n     *   return sum + n;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(n) {\n     *   return n * n;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The function whose prototype all chaining wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n     * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n     */\n    function LodashWrapper(value, chainAll, actions) {\n      this.__wrapped__ = value;\n      this.__actions__ = actions || [];\n      this.__chain__ = !!chainAll;\n    }\n\n    /**\n     * An object environment feature flags.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    (function(x) {\n\n      /**\n       * Detect if functions can be decompiled by `Function#toString`\n       * (all but Firefox OS certified apps, older Opera mobile browsers, and\n       * the PlayStation 3; forced `false` for Windows 8 apps).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcDecomp = /\\bthis\\b/.test(function() { return this; });\n\n      /**\n       * Detect if `Function#name` is supported (all but IE).\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      support.funcNames = typeof Function.name == 'string';\n\n      /**\n       * Detect if the DOM is supported.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      try {\n        support.dom = document.createDocumentFragment().nodeType === 11;\n      } catch(e) {\n        support.dom = false;\n      }\n\n      /**\n       * Detect if `arguments` object indexes are non-enumerable.\n       *\n       * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object\n       * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat\n       * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`\n       * checks for indexes that exceed their function's formal parameters with\n       * associated values of `0`.\n       *\n       * @memberOf _.support\n       * @type boolean\n       */\n      try {\n        support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);\n      } catch(e) {\n        support.nonEnumArgs = true;\n      }\n    }(0, 0));\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB). Change the following template settings to use\n     * alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = null;\n      this.__dir__ = 1;\n      this.__dropCount__ = 0;\n      this.__filtered__ = false;\n      this.__iteratees__ = null;\n      this.__takeCount__ = POSITIVE_INFINITY;\n      this.__views__ = null;\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var actions = this.__actions__,\n          iteratees = this.__iteratees__,\n          views = this.__views__,\n          result = new LazyWrapper(this.__wrapped__);\n\n      result.__actions__ = actions ? arrayCopy(actions) : null;\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = iteratees ? arrayCopy(iteratees) : null;\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = views ? arrayCopy(views) : null;\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value();\n      if (!isArray(array)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var dir = this.__dir__,\n          isRight = dir < 0,\n          view = getView(0, array.length, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          takeCount = nativeMin(length, this.__takeCount__),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees ? iteratees.length : 0,\n          resIndex = 0,\n          result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type;\n\n          if (type == LAZY_DROP_WHILE_FLAG) {\n            if (data.done && (isRight ? (index > data.index) : (index < data.index))) {\n              data.count = 0;\n              data.done = false;\n            }\n            data.index = index;\n            if (!data.done) {\n              var limit = data.limit;\n              if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) {\n                continue outer;\n              }\n            }\n          } else {\n            var computed = iteratee(value);\n            if (type == LAZY_MAP_FLAG) {\n              value = computed;\n            } else if (!computed) {\n              if (type == LAZY_FILTER_FLAG) {\n                continue outer;\n              } else {\n                break outer;\n              }\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a cache object to store key/value pairs.\n     *\n     * @private\n     * @static\n     * @name Cache\n     * @memberOf _.memoize\n     */\n    function MapCache() {\n      this.__data__ = {};\n    }\n\n    /**\n     * Removes `key` and its value from the cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n     */\n    function mapDelete(key) {\n      return this.has(key) && delete this.__data__[key];\n    }\n\n    /**\n     * Gets the cached value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the cached value.\n     */\n    function mapGet(key) {\n      return key == '__proto__' ? undefined : this.__data__[key];\n    }\n\n    /**\n     * Checks if a cached value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapHas(key) {\n      return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n    }\n\n    /**\n     * Adds `value` to `key` of the cache.\n     *\n     * @private\n     * @name set\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to cache.\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache object.\n     */\n    function mapSet(key, value) {\n      if (key != '__proto__') {\n        this.__data__[key] = value;\n      }\n      return this;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates a cache object to store unique values.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var length = values ? values.length : 0;\n\n      this.data = { 'hash': nativeCreate(null), 'set': new Set };\n      while (length--) {\n        this.push(values[length]);\n      }\n    }\n\n    /**\n     * Checks if `value` is in `cache` mimicking the return signature of\n     * `_.indexOf` by returning `0` if the value is found, else `-1`.\n     *\n     * @private\n     * @param {Object} cache The cache to search.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `0` if `value` is found, else `-1`.\n     */\n    function cacheIndexOf(cache, value) {\n      var data = cache.data,\n          result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];\n\n      return result ? 0 : -1;\n    }\n\n    /**\n     * Adds `value` to the cache.\n     *\n     * @private\n     * @name push\n     * @memberOf SetCache\n     * @param {*} value The value to cache.\n     */\n    function cachePush(value) {\n      var data = this.data;\n      if (typeof value == 'string' || isObject(value)) {\n        data.set.add(value);\n      } else {\n        data.hash[value] = true;\n      }\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayCopy(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.forEach` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayEach(array, iteratee) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (iteratee(array[index], index, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.forEachRight` for arrays without support for\n     * callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayEachRight(array, iteratee) {\n      var length = array.length;\n\n      while (length--) {\n        if (iteratee(array[length], length, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.every` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     */\n    function arrayEvery(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (!predicate(array[index], index, array)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * A specialized version of `_.filter` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function arrayFilter(array, predicate) {\n      var index = -1,\n          length = array.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.map` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function arrayMap(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = iteratee(array[index], index, array);\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.max` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     */\n    function arrayMax(array) {\n      var index = -1,\n          length = array.length,\n          result = NEGATIVE_INFINITY;\n\n      while (++index < length) {\n        var value = array[index];\n        if (value > result) {\n          result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.min` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     */\n    function arrayMin(array) {\n      var index = -1,\n          length = array.length,\n          result = POSITIVE_INFINITY;\n\n      while (++index < length) {\n        var value = array[index];\n        if (value < result) {\n          result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.reduce` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the first element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduce(array, iteratee, accumulator, initFromArray) {\n      var index = -1,\n          length = array.length;\n\n      if (initFromArray && length) {\n        accumulator = array[++index];\n      }\n      while (++index < length) {\n        accumulator = iteratee(accumulator, array[index], index, array);\n      }\n      return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.reduceRight` for arrays without support for\n     * callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initFromArray] Specify using the last element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n      var length = array.length;\n      if (initFromArray && length) {\n        accumulator = array[--length];\n      }\n      while (length--) {\n        accumulator = iteratee(accumulator, array[length], length, array);\n      }\n      return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.some` for arrays without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function arraySome(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (predicate(array[index], index, array)) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `_.sum` for arrays without support for iteratees.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     */\n    function arraySum(array) {\n      var length = array.length,\n          result = 0;\n\n      while (length--) {\n        result += +array[length] || 0;\n      }\n      return result;\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assign` use.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignDefaults(objectValue, sourceValue) {\n      return typeof objectValue == 'undefined' ? sourceValue : objectValue;\n    }\n\n    /**\n     * Used by `_.template` to customize its `_.assign` use.\n     *\n     * **Note:** This method is like `assignDefaults` except that it ignores\n     * inherited property values when checking if a property is `undefined`.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @param {string} key The key associated with the object and source values.\n     * @param {Object} object The destination object.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignOwnDefaults(objectValue, sourceValue, key, object) {\n      return (typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key))\n        ? sourceValue\n        : objectValue;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @returns {Object} Returns the destination object.\n     */\n    function baseAssign(object, source, customizer) {\n      var props = keys(source);\n      if (!customizer) {\n        return baseCopy(source, object, props);\n      }\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key],\n            result = customizer(value, source[key], key, object, source);\n\n        if ((result === result ? (result !== value) : (value === value)) ||\n            (typeof value == 'undefined' && !(key in object))) {\n          object[key] = result;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.at` without support for strings and individual\n     * key arguments.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {number[]|string[]} [props] The property names or indexes of elements to pick.\n     * @returns {Array} Returns the new array of picked elements.\n     */\n    function baseAt(collection, props) {\n      var index = -1,\n          length = collection.length,\n          isArr = isLength(length),\n          propsLength = props.length,\n          result = Array(propsLength);\n\n      while(++index < propsLength) {\n        var key = props[index];\n        if (isArr) {\n          key = parseFloat(key);\n          result[index] = isIndex(key, length) ? collection[key] : undefined;\n        } else {\n          result[index] = collection[key];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Array} props The property names to copy.\n     * @returns {Object} Returns `object`.\n     */\n    function baseCopy(source, object, props) {\n      if (!props) {\n        props = object;\n        object = {};\n      }\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n        object[key] = source[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.callback` which supports specifying the\n     * number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function baseCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (type == 'function') {\n        return typeof thisArg == 'undefined'\n          ? func\n          : bindCallback(func, thisArg, argCount);\n      }\n      if (func == null) {\n        return identity;\n      }\n      if (type == 'object') {\n        return baseMatches(func);\n      }\n      return typeof thisArg == 'undefined'\n        ? baseProperty(func + '')\n        : baseMatchesProperty(func + '', thisArg);\n    }\n\n    /**\n     * The base implementation of `_.clone` without support for argument juggling\n     * and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The object `value` belongs to.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n      var result;\n      if (customizer) {\n        result = object ? customizer(value, key, object) : customizer(value);\n      }\n      if (typeof result != 'undefined') {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return arrayCopy(value, result);\n        }\n      } else {\n        var tag = objToString.call(value),\n            isFunc = tag == funcTag;\n\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = initCloneObject(isFunc ? {} : value);\n          if (!isDeep) {\n            return baseCopy(value, result, keys(value));\n          }\n        } else {\n          return cloneableTags[tag]\n            ? initCloneByTag(value, tag, isDeep)\n            : (object ? value : {});\n        }\n      }\n      // Check for circular references and return corresponding clone.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == value) {\n          return stackB[length];\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate it with its clone.\n      stackA.push(value);\n      stackB.push(result);\n\n      // Recursively populate clone (susceptible to call stack limits).\n      (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n        result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function Object() {}\n      return function(prototype) {\n        if (isObject(prototype)) {\n          Object.prototype = prototype;\n          var result = new Object;\n          Object.prototype = null;\n        }\n        return result || context.Object();\n      };\n    }());\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts an index\n     * of where to slice the arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Object} args The arguments provide to `func`.\n     * @returns {number} Returns the timer id.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of `_.difference` which accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var length = array ? array.length : 0,\n          result = [];\n\n      if (!length) {\n        return result;\n      }\n      var index = -1,\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf,\n          cache = (isCommon && values.length >= 200) ? createCache(values) : null,\n          valuesLength = values.length;\n\n      if (cache) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n        values = cache;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index];\n\n        if (isCommon && value === value) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === value) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (indexOf(values, value, 0) < 0) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : (end >>> 0);\n      start >>>= 0;\n\n      while (start < length) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n     * without support for callback shorthands and `this` binding, which iterates\n     * over `collection` using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @param {boolean} [retKey] Specify returning the key of the found element\n     *  instead of the element itself.\n     * @returns {*} Returns the found element or its key, else `undefined`.\n     */\n    function baseFind(collection, predicate, eachFunc, retKey) {\n      var result;\n      eachFunc(collection, function(value, key, collection) {\n        if (predicate(value, key, collection)) {\n          result = retKey ? key : value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with added support for restricting\n     * flattening and specifying the start index.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} isDeep Specify a deep flatten.\n     * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, isDeep, isStrict) {\n      var index = -1,\n          length = array.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {\n          if (isDeep) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            value = baseFlatten(value, isDeep, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[++resIndex] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForIn` and `baseForOwn` which iterates\n     * over `object` properties returned by `keysFunc` invoking `iteratee` for\n     * each property. Iterator functions may exit iteration early by explicitly\n     * returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forIn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForIn(object, iteratee) {\n      return baseFor(object, iteratee, keysIn);\n    }\n\n    /**\n     * The base implementation of `_.forOwn` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from those provided.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the new array of filtered property names.\n     */\n    function baseFunctions(object, props) {\n      var index = -1,\n          length = props.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var key = props[index];\n        if (isFunction(object[key])) {\n          result[++resIndex] = key;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` without support for `this` binding\n     * `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n      // Exit early for identical values.\n      if (value === other) {\n        // Treat `+0` vs. `-0` as not equal.\n        return value !== 0 || (1 / value == 1 / other);\n      }\n      var valType = typeof value,\n          othType = typeof other;\n\n      // Exit early for unlike primitive values.\n      if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||\n          value == null || other == null) {\n        // Return `false` unless both values are `NaN`.\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = arrayTag,\n          othTag = arrayTag;\n\n      if (!objIsArr) {\n        objTag = objToString.call(object);\n        if (objTag == argsTag) {\n          objTag = objectTag;\n        } else if (objTag != objectTag) {\n          objIsArr = isTypedArray(object);\n        }\n      }\n      if (!othIsArr) {\n        othTag = objToString.call(other);\n        if (othTag == argsTag) {\n          othTag = objectTag;\n        } else if (othTag != objectTag) {\n          othIsArr = isTypedArray(other);\n        }\n      }\n      var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)),\n          othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)),\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && !(objIsArr || objIsObj)) {\n        return equalByTag(object, other, objTag);\n      }\n      if (isLoose) {\n        if (!isSameTag && !(objIsObj && othIsObj)) {\n          return false;\n        }\n      } else {\n        var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (valWrapped || othWrapped) {\n          return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n        }\n        if (!isSameTag) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      // For more information on detecting circular references see https://es5.github.io/#JO.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == object) {\n          return stackB[length] == other;\n        }\n      }\n      // Add `object` and `other` to the stack of traversed objects.\n      stackA.push(object);\n      stackB.push(other);\n\n      var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n      stackA.pop();\n      stackB.pop();\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The source property names to match.\n     * @param {Array} values The source values to match.\n     * @param {Array} strictCompareFlags Strict comparison flags for source values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, props, values, strictCompareFlags, customizer) {\n      var index = -1,\n          length = props.length,\n          noCustomizer = !customizer;\n\n      while (++index < length) {\n        if ((noCustomizer && strictCompareFlags[index])\n              ? values[index] !== object[props[index]]\n              : !(props[index] in object)\n            ) {\n          return false;\n        }\n      }\n      index = -1;\n      while (++index < length) {\n        var key = props[index],\n            objValue = object[key],\n            srcValue = values[index];\n\n        if (noCustomizer && strictCompareFlags[index]) {\n          var result = typeof objValue != 'undefined' || (key in object);\n        } else {\n          result = customizer ? customizer(objValue, srcValue, key) : undefined;\n          if (typeof result == 'undefined') {\n            result = baseIsEqual(srcValue, objValue, customizer, true);\n          }\n        }\n        if (!result) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var result = [];\n      baseEach(collection, function(value, key, collection) {\n        result.push(iteratee(value, key, collection));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which does not clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatches(source) {\n      var props = keys(source),\n          length = props.length;\n\n      if (!length) {\n        return constant(true);\n      }\n      if (length == 1) {\n        var key = props[0],\n            value = source[key];\n\n        if (isStrictComparable(value)) {\n          return function(object) {\n            return object != null && object[key] === value &&\n              (typeof value != 'undefined' || (key in toObject(object)));\n          };\n        }\n      }\n      var values = Array(length),\n          strictCompareFlags = Array(length);\n\n      while (length--) {\n        value = source[props[length]];\n        values[length] = value;\n        strictCompareFlags[length] = isStrictComparable(value);\n      }\n      return function(object) {\n        return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which does not coerce `key`\n     * to a string.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} value The value to compare.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatchesProperty(key, value) {\n      if (isStrictComparable(value)) {\n        return function(object) {\n          return object != null && object[key] === value &&\n            (typeof value != 'undefined' || (key in toObject(object)));\n        };\n      }\n      return function(object) {\n        return object != null && baseIsEqual(value, object[key], null, true);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {Object} Returns the destination object.\n     */\n    function baseMerge(object, source, customizer, stackA, stackB) {\n      if (!isObject(object)) {\n        return object;\n      }\n      var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));\n      (isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) {\n        if (isObjectLike(srcValue)) {\n          stackA || (stackA = []);\n          stackB || (stackB = []);\n          return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n        }\n        var value = object[key],\n            result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n            isCommon = typeof result == 'undefined';\n\n        if (isCommon) {\n          result = srcValue;\n        }\n        if ((isSrcArr || typeof result != 'undefined') &&\n            (isCommon || (result === result ? (result !== value) : (value === value)))) {\n          object[key] = result;\n        }\n      });\n      return object;\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n      var length = stackA.length,\n          srcValue = source[key];\n\n      while (length--) {\n        if (stackA[length] == srcValue) {\n          object[key] = stackB[length];\n          return;\n        }\n      }\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = typeof result == 'undefined';\n\n      if (isCommon) {\n        result = srcValue;\n        if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {\n          result = isArray(value)\n            ? value\n            : ((value && value.length) ? arrayCopy(value) : []);\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          result = isArguments(value)\n            ? toPlainObject(value)\n            : (isPlainObject(value) ? value : {});\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate\n      // it with its merged value.\n      stackA.push(srcValue);\n      stackB.push(result);\n\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n      } else if (result === result ? (result !== value) : (value === value)) {\n        object[key] = result;\n      }\n    }\n\n    /**\n     * The base implementation of `_.property` which does not coerce `key` to a string.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     */\n    function baseProperty(key) {\n      return function(object) {\n        return object == null ? undefined : object[key];\n      };\n    }\n\n    /**\n     * The base implementation of `_.random` without support for argument juggling\n     * and returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.reduce` and `_.reduceRight` without support\n     * for callback shorthands and `this` binding, which iterates over `collection`\n     * using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} accumulator The initial value.\n     * @param {boolean} initFromCollection Specify using the first or last element\n     *  of `collection` as the initial value.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @returns {*} Returns the accumulated value.\n     */\n    function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n      eachFunc(collection, function(value, index, collection) {\n        accumulator = initFromCollection\n          ? (initFromCollection = false, value)\n          : iteratee(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop detection.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortBy` which uses `comparer` to define\n     * the sort order of `array` and replaces criteria objects with their\n     * corresponding values.\n     *\n     * @private\n     * @param {Array} array The array to sort.\n     * @param {Function} comparer The function to define sort order.\n     * @returns {Array} Returns `array`.\n     */\n    function baseSortBy(array, comparer) {\n      var length = array.length;\n\n      array.sort(comparer);\n      while (length--) {\n        array[length] = array[length].value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.sortByOrder` without param guards.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string[]} props The property names to sort by.\n     * @param {boolean[]} orders The sort orders of `props`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseSortByOrder(collection, props, orders) {\n      var index = -1,\n          length = collection.length,\n          result = isLength(length) ? Array(length) : [];\n\n      baseEach(collection, function(value) {\n        var length = props.length,\n            criteria = Array(length);\n\n        while (length--) {\n          criteria[length] = value == null ? undefined : value[props[length]];\n        }\n        result[++index] = { 'criteria': criteria, 'index': index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.sum` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {number} Returns the sum.\n     */\n    function baseSum(collection, iteratee) {\n      var result = 0;\n      baseEach(collection, function(value, index, collection) {\n        result += +iteratee(value, index, collection) || 0;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The function invoked per iteration.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     */\n    function baseUniq(array, iteratee) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array.length,\n          isCommon = indexOf == baseIndexOf,\n          isLarge = isCommon && length >= 200,\n          seen = isLarge ? createCache() : null,\n          result = [];\n\n      if (seen) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n      } else {\n        isLarge = false;\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value, index, array) : value;\n\n        if (isCommon && value === value) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (indexOf(seen, computed, 0) < 0) {\n          if (iteratee || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.values` and `_.valuesIn` which creates an\n     * array of `object` property values corresponding to the property names\n     * returned by `keysFunc`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} props The property names to get values for.\n     * @returns {Object} Returns the array of property values.\n     */\n    function baseValues(object, props) {\n      var index = -1,\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,\n     * and `_.takeWhile` without support for callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to peform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      var index = -1,\n          length = actions.length;\n\n      while (++index < length) {\n        var args = [result],\n            action = actions[index];\n\n        push.apply(args, action.args);\n        result = action.func.apply(action.thisArg, args);\n      }\n      return result;\n    }\n\n    /**\n     * Performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndex(array, value, retHighest) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (retHighest ? (computed <= value) : (computed < value)) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return binaryIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * This function is like `binaryIndex` except that it invokes `iteratee` for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array ? array.length : 0,\n          valIsNaN = value !== value,\n          valIsUndef = typeof value == 'undefined';\n\n      while (low < high) {\n        var mid = floor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            isReflexive = computed === computed;\n\n        if (valIsNaN) {\n          var setLow = isReflexive || retHighest;\n        } else if (valIsUndef) {\n          setLow = isReflexive && (retHighest || typeof computed != 'undefined');\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * A specialized version of `baseCallback` which only supports `this` binding\n     * and specifying the number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function bindCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      if (typeof thisArg == 'undefined') {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n        case 5: return function(value, other, key, object, source) {\n          return func.call(thisArg, value, other, key, object, source);\n        };\n      }\n      return function() {\n        return func.apply(thisArg, arguments);\n      };\n    }\n\n    /**\n     * Creates a clone of the given array buffer.\n     *\n     * @private\n     * @param {ArrayBuffer} buffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function bufferClone(buffer) {\n      return bufferSlice.call(buffer, 0);\n    }\n    if (!bufferSlice) {\n      // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.\n      bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {\n        var byteLength = buffer.byteLength,\n            floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,\n            offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,\n            result = new ArrayBuffer(byteLength);\n\n        if (floatLength) {\n          var view = new Float64Array(result, 0, floatLength);\n          view.set(new Float64Array(buffer, 0, floatLength));\n        }\n        if (byteLength != offset) {\n          view = new Uint8Array(result, offset);\n          view.set(new Uint8Array(buffer, offset));\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders) {\n      var holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          leftIndex = -1,\n          leftLength = partials.length,\n          result = Array(argsLength + leftLength);\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        result[holders[argsIndex]] = args[argsIndex];\n      }\n      while (argsLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders) {\n      var holdersIndex = -1,\n          holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          rightIndex = -1,\n          rightLength = partials.length,\n          result = Array(argsLength + rightLength);\n\n      while (++argsIndex < argsLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var pad = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[pad + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        result[pad + holders[holdersIndex]] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an accumulator\n     * object composed from the results of running each element in the collection\n     * through an iteratee.\n     *\n     * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,\n     * and `_.partition`.\n     *\n     * @private\n     * @param {Function} setter The function to set keys and values of the accumulator object.\n     * @param {Function} [initializer] The function to initialize the accumulator object.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee, thisArg) {\n        var result = initializer ? initializer() : {};\n        iteratee = getCallback(iteratee, thisArg, 3);\n\n        if (isArray(collection)) {\n          var index = -1,\n              length = collection.length;\n\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, iteratee(value, index, collection), collection);\n          }\n        } else {\n          baseEach(collection, function(value, key, collection) {\n            setter(result, value, iteratee(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that assigns properties of source object(s) to a given\n     * destination object.\n     *\n     * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return function() {\n        var args = arguments,\n            length = args.length,\n            object = args[0];\n\n        if (length < 2 || object == null) {\n          return object;\n        }\n        var customizer = args[length - 2],\n            thisArg = args[length - 1],\n            guard = args[3];\n\n        if (length > 3 && typeof customizer == 'function') {\n          customizer = bindCallback(customizer, thisArg, 5);\n          length -= 2;\n        } else {\n          customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null;\n          length -= (customizer ? 1 : 0);\n        }\n        if (guard && isIterateeCall(args[1], args[2], guard)) {\n          customizer = length == 3 ? null : customizer;\n          length = 2;\n        }\n        var index = 0;\n        while (++index < length) {\n          var source = args[index];\n          if (source) {\n            assigner(object, source, customizer);\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        var length = collection ? collection.length : 0;\n        if (!isLength(length)) {\n          return eachFunc(collection, iteratee);\n        }\n        var index = fromRight ? length : -1,\n            iterable = toObject(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var iterable = toObject(object),\n            props = keysFunc(object),\n            length = props.length,\n            index = fromRight ? length : -1;\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var key = props[index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createBindWrapper(func, thisArg) {\n      var Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(thisArg, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `Set` cache object to optimize linear searches of large arrays.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n     */\n    var createCache = !(nativeCreate && Set) ? constant(null) : function(values) {\n      return new SetCache(values);\n    };\n\n    /**\n     * Creates a function that produces compound words out of the words in a\n     * given string.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        var index = -1,\n            array = words(deburr(string)),\n            length = array.length,\n            result = '';\n\n        while (++index < length) {\n          result = callback(result, array[index], index);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtorWrapper(Ctor) {\n      return function() {\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, arguments);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a `_.curry` or `_.curryRight` function.\n     *\n     * @private\n     * @param {boolean} flag The curry bit flag.\n     * @returns {Function} Returns the new curry function.\n     */\n    function createCurry(flag) {\n      function curryFunc(func, arity, guard) {\n        if (guard && isIterateeCall(func, arity, guard)) {\n          arity = null;\n        }\n        var result = createWrapper(func, flag, null, null, null, null, null, arity);\n        result.placeholder = curryFunc.placeholder;\n        return result;\n      }\n      return curryFunc;\n    }\n\n    /**\n     * Creates a `_.max` or `_.min` function.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to get the extremum value from an array.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum,\n     *  extremum value.\n     * @returns {Function} Returns the new extremum function.\n     */\n    function createExtremum(arrayFunc, isMin) {\n      return function(collection, iteratee, thisArg) {\n        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n          iteratee = null;\n        }\n        var func = getCallback(),\n            noIteratee = iteratee == null;\n\n        if (!(func === baseCallback && noIteratee)) {\n          noIteratee = false;\n          iteratee = func(iteratee, thisArg, 3);\n        }\n        if (noIteratee) {\n          var isArr = isArray(collection);\n          if (!isArr && isString(collection)) {\n            iteratee = charAtCallback;\n          } else {\n            return arrayFunc(isArr ? collection : toIterable(collection));\n          }\n        }\n        return extremumBy(collection, iteratee, isMin);\n      };\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(eachFunc, fromRight) {\n      return function(collection, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        if (isArray(collection)) {\n          var index = baseFindIndex(collection, predicate, fromRight);\n          return index > -1 ? collection[index] : undefined;\n        }\n        return baseFind(collection, predicate, eachFunc);\n      }\n    }\n\n    /**\n     * Creates a `_.findIndex` or `_.findLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindIndex(fromRight) {\n      return function(array, predicate, thisArg) {\n        if (!(array && array.length)) {\n          return -1;\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFindIndex(array, predicate, fromRight);\n      };\n    }\n\n    /**\n     * Creates a `_.findKey` or `_.findLastKey` function.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindKey(objectFunc) {\n      return function(object, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(object, predicate, objectFunc, true);\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return function() {\n        var length = arguments.length;\n        if (!length) {\n          return function() { return arguments[0]; };\n        }\n        var wrapper,\n            index = fromRight ? length : -1,\n            leftIndex = 0,\n            funcs = Array(length);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var func = funcs[leftIndex++] = arguments[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          var funcName = wrapper ? '' : getFuncName(func);\n          wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;\n        }\n        index = wrapper ? -1 : length;\n        while (++index < length) {\n          func = funcs[index];\n          funcName = getFuncName(func);\n\n          var data = funcName == 'wrapper' ? getData(func) : null;\n          if (data && isLaziable(data[0])) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments;\n          if (wrapper && args.length == 1 && isArray(args[0])) {\n            return wrapper.plant(args[0]).value();\n          }\n          var index = 0,\n              result = funcs[index].apply(this, args);\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      };\n    }\n\n    /**\n     * Creates a function for `_.forEach` or `_.forEachRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForEach(arrayFunc, eachFunc) {\n      return function(collection, iteratee, thisArg) {\n        return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))\n          ? arrayFunc(collection, iteratee)\n          : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n      };\n    }\n\n    /**\n     * Creates a function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForIn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee, keysIn);\n      };\n    }\n\n    /**\n     * Creates a function for `_.forOwn` or `_.forOwnRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForOwn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee);\n      };\n    }\n\n    /**\n     * Creates a function for `_.padLeft` or `_.padRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify padding from the right.\n     * @returns {Function} Returns the new pad function.\n     */\n    function createPadDir(fromRight) {\n      return function(string, length, chars) {\n        string = baseToString(string);\n        return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));\n      };\n    }\n\n    /**\n     * Creates a `_.partial` or `_.partialRight` function.\n     *\n     * @private\n     * @param {boolean} flag The partial bit flag.\n     * @returns {Function} Returns the new partial function.\n     */\n    function createPartial(flag) {\n      var partialFunc = restParam(function(func, partials) {\n        var holders = replaceHolders(partials, partialFunc.placeholder);\n        return createWrapper(func, flag, null, partials, holders);\n      });\n      return partialFunc;\n    }\n\n    /**\n     * Creates a function for `_.reduce` or `_.reduceRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createReduce(arrayFunc, eachFunc) {\n      return function(collection, iteratee, accumulator, thisArg) {\n        var initFromArray = arguments.length < 3;\n        return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))\n          ? arrayFunc(collection, iteratee, accumulator, initFromArray)\n          : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with optional `this`\n     * binding of, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & ARY_FLAG,\n          isBind = bitmask & BIND_FLAG,\n          isBindKey = bitmask & BIND_KEY_FLAG,\n          isCurry = bitmask & CURRY_FLAG,\n          isCurryBound = bitmask & CURRY_BOUND_FLAG,\n          isCurryRight = bitmask & CURRY_RIGHT_FLAG;\n\n      var Ctor = !isBindKey && createCtorWrapper(func),\n          key = func;\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it to other functions.\n        var length = arguments.length,\n            index = length,\n            args = Array(length);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight);\n        }\n        if (isCurry || isCurryRight) {\n          var placeholder = wrapper.placeholder,\n              argsHolders = replaceHolders(args, placeholder);\n\n          length -= argsHolders.length;\n          if (length < arity) {\n            var newArgPos = argPos ? arrayCopy(argPos) : null,\n                newArity = nativeMax(arity - length, 0),\n                newsHolders = isCurry ? argsHolders : null,\n                newHoldersRight = isCurry ? null : argsHolders,\n                newPartials = isCurry ? args : null,\n                newPartialsRight = isCurry ? null : args;\n\n            bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n            bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n            if (!isCurryBound) {\n              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n            }\n            var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n                result = createHybridWrapper.apply(undefined, newData);\n\n            if (isLaziable(func)) {\n              setData(result, newData);\n            }\n            result.placeholder = placeholder;\n            return result;\n          }\n        }\n        var thisBinding = isBind ? thisArg : this;\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (argPos) {\n          args = reorder(args, argPos);\n        }\n        if (isAry && ary < args.length) {\n          args.length = ary;\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func;\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates the padding required for `string` based on the given `length`.\n     * The `chars` string is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {string} string The string to create padding for.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the pad for `string`.\n     */\n    function createPadding(string, length, chars) {\n      var strLength = string.length;\n      length = +length;\n\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return '';\n      }\n      var padLength = length - strLength;\n      chars = chars == null ? ' ' : (chars + '');\n      return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the optional `this`\n     * binding of `thisArg` and the `partials` prepended to those provided to\n     * the wrapper.\n     *\n     * @private\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to the new function.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createPartialWrapper(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & BIND_FLAG,\n          Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it `func`.\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(argsLength + leftLength);\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {Function} Returns the new index function.\n     */\n    function createSortedIndex(retHighest) {\n      return function(array, value, iteratee, thisArg) {\n        var func = getCallback(iteratee);\n        return (func === baseCallback && iteratee == null)\n          ? binaryIndex(array, value, retHighest)\n          : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags.\n     *  The bitmask may be composed of the following flags:\n     *     1 - `_.bind`\n     *     2 - `_.bindKey`\n     *     4 - `_.curry` or `_.curryRight` of a bound function\n     *     8 - `_.curry`\n     *    16 - `_.curryRight`\n     *    32 - `_.partial`\n     *    64 - `_.partialRight`\n     *   128 - `_.rearg`\n     *   256 - `_.ary`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n        partials = holders = null;\n      }\n      length -= (holders ? holders.length : 0);\n      if (bitmask & PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = null;\n      }\n      var data = isBindKey ? null : getData(func),\n          newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n      if (data) {\n        mergeData(newData, data);\n        bitmask = newData[1];\n        arity = newData[9];\n      }\n      newData[9] = arity == null\n        ? (isBindKey ? 0 : func.length)\n        : (nativeMax(arity - length, 0) || 0);\n\n      if (bitmask == BIND_FLAG) {\n        var result = createBindWrapper(newData[0], newData[2]);\n      } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n        result = createPartialWrapper.apply(undefined, newData);\n      } else {\n        result = createHybridWrapper.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setter(result, newData);\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing arrays.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var index = -1,\n          arrLength = array.length,\n          othLength = other.length,\n          result = true;\n\n      if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n        return false;\n      }\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (result && ++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        result = undefined;\n        if (customizer) {\n          result = isLoose\n            ? customizer(othValue, arrValue, index)\n            : customizer(arrValue, othValue, index);\n        }\n        if (typeof result == 'undefined') {\n          // Recursively compare arrays (susceptible to call stack limits).\n          if (isLoose) {\n            var othIndex = othLength;\n            while (othIndex--) {\n              othValue = other[othIndex];\n              result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n              if (result) {\n                break;\n              }\n            }\n          } else {\n            result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n          }\n        }\n      }\n      return !!result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} value The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag) {\n      switch (tag) {\n        case boolTag:\n        case dateTag:\n          // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n          return +object == +other;\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case numberTag:\n          // Treat `NaN` vs. `NaN` as equal.\n          return (object != +object)\n            ? other != +other\n            // But, treat `-0` vs. `+0` as not equal.\n            : (object == 0 ? ((1 / object) == (1 / other)) : object == +other);\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings primitives and string\n          // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n          return object == (other + '');\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objProps = keys(object),\n          objLength = objProps.length,\n          othProps = keys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isLoose) {\n        return false;\n      }\n      var skipCtor = isLoose,\n          index = -1;\n\n      while (++index < objLength) {\n        var key = objProps[index],\n            result = isLoose ? key in other : hasOwnProperty.call(other, key);\n\n        if (result) {\n          var objValue = object[key],\n              othValue = other[key];\n\n          result = undefined;\n          if (customizer) {\n            result = isLoose\n              ? customizer(othValue, objValue, key)\n              : customizer(objValue, othValue, key);\n          }\n          if (typeof result == 'undefined') {\n            // Recursively compare objects (susceptible to call stack limits).\n            result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);\n          }\n        }\n        if (!result) {\n          return false;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (!skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Gets the extremum value of `collection` invoking `iteratee` for each value\n     * in `collection` to generate the criterion by which the value is ranked.\n     * The `iteratee` is invoked with three arguments: (value, index, collection).\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [isMin] Specify returning the minimum, instead of the\n     *  maximum, extremum value.\n     * @returns {*} Returns the extremum value.\n     */\n    function extremumBy(collection, iteratee, isMin) {\n      var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY,\n          computed = exValue,\n          result = computed;\n\n      baseEach(collection, function(value, index, collection) {\n        var current = iteratee(value, index, collection);\n        if ((isMin ? (current < computed) : (current > computed)) ||\n            (current === exValue && current === result)) {\n          computed = current;\n          result = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Gets the appropriate \"callback\" function. If the `_.callback` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseCallback` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getCallback(func, thisArg, argCount) {\n      var result = lodash.callback || callback;\n      result = result === callback ? baseCallback : result;\n      return argCount ? result(func, thisArg, argCount) : result;\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    var getFuncName = (function() {\n      if (!support.funcNames) {\n        return constant('');\n      }\n      if (constant.name == 'constant') {\n        return baseProperty('name');\n      }\n      return function(func) {\n        var result = func.name,\n            array = realNames[result],\n            length = array ? array.length : 0;\n\n        while (length--) {\n          var data = array[length],\n              otherFunc = data.func;\n\n          if (otherFunc == null || otherFunc == func) {\n            return data.name;\n          }\n        }\n        return result;\n      };\n    }());\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseIndexOf` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function|number} Returns the chosen function or its result.\n     */\n    function getIndexOf(collection, target, fromIndex) {\n      var result = lodash.indexOf || indexOf;\n      result = result === indexOf ? baseIndexOf : result;\n      return collection ? result(collection, target, fromIndex) : result;\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} [transforms] The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms ? transforms.length : 0;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add array properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      var Ctor = object.constructor;\n      if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n        Ctor = Object;\n      }\n      return new Ctor;\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return bufferClone(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          var buffer = object.buffer;\n          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          var result = new Ctor(object.source, reFlags.exec(object));\n          result.lastIndex = object.lastIndex;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      value = +value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n      return value > -1 && value % 1 == 0 && value < length;\n    }\n\n    /**\n     * Checks if the provided arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number') {\n        var length = object.length,\n            prereq = isLength(length) && isIndex(index, length);\n      } else {\n        prereq = type == 'string' && index in object;\n      }\n      if (prereq) {\n        var other = object[index];\n        return value === value ? (value === other) : (other !== other);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func);\n      return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     */\n    function isLength(value) {\n      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers required to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n     * augment function arguments, making the order in which they are executed important,\n     * preventing the merging of metadata. However, we make an exception for a safe\n     * common case where curried functions have `_.ary` and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < ARY_FLAG;\n\n      var isCombo =\n        (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n        (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n        (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = arrayCopy(value);\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * A specialized version of `_.pick` that picks `object` properties specified\n     * by the `props` array.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} props The property names to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByArray(object, props) {\n      object = toObject(object);\n\n      var index = -1,\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        if (key in object) {\n          result[key] = object[key];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.pick` that picks `object` properties `predicate`\n     * returns truthy for.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByCallback(object, predicate) {\n      var result = {};\n      baseForIn(object, function(value, key, object) {\n        if (predicate(value, key, object)) {\n          result[key] = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = arrayCopy(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity function\n     * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = (function() {\n      var count = 0,\n          lastCalled = 0;\n\n      return function(key, value) {\n        var stamp = now(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return key;\n          }\n        } else {\n          count = 0;\n        }\n        return baseSetData(key, value);\n      };\n    }());\n\n    /**\n     * A fallback implementation of `_.isPlainObject` which checks if `value`\n     * is an object created by the `Object` constructor or has a `[[Prototype]]`\n     * of `null`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var Ctor,\n          support = lodash.support;\n\n      // Exit early for non `Object` objects.\n      if (!(isObjectLike(value) && objToString.call(value) == objectTag) ||\n          (!hasOwnProperty.call(value, 'constructor') &&\n            (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n        return false;\n      }\n      // IE < 9 iterates inherited properties before own properties. If the first\n      // iterated property is an object's own property then there are no inherited\n      // enumerable properties.\n      var result;\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      baseForIn(value, function(subValue, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * A fallback implementation of `Object.keys` which creates an array of the\n     * own enumerable property names of `object`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     */\n    function shimKeys(object) {\n      var props = keysIn(object),\n          propsLength = props.length,\n          length = propsLength && object.length,\n          support = lodash.support;\n\n      var allowIndexes = length && isLength(length) &&\n        (isArray(object) || (support.nonEnumArgs && isArguments(object)));\n\n      var index = -1,\n          result = [];\n\n      while (++index < propsLength) {\n        var key = props[index];\n        if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to an array-like object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Array|Object} Returns the array-like object.\n     */\n    function toIterable(value) {\n      if (value == null) {\n        return [];\n      }\n      if (!isLength(value.length)) {\n        return values(value);\n      }\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Converts `value` to an object if it is not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Object} Returns the object.\n     */\n    function toObject(value) {\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      return wrapper instanceof LazyWrapper\n        ? wrapper.clone()\n        : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `collection` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new array containing chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if (guard ? isIterateeCall(array, size, guard) : size == null) {\n        size = 1;\n      } else {\n        size = nativeMax(+size || 1, 1);\n      }\n      var index = 0,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = Array(ceil(length / size));\n\n      while (index < length) {\n        result[++resIndex] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3], [4, 2]);\n     * // => [1, 3]\n     */\n    var difference = restParam(function(array, values) {\n      return (isArray(array) || isArguments(array))\n        ? baseDifference(array, baseFlatten(values, false, true))\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that match the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [1]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active', false), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active', false), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8], '*', 1, 2);\n     * // => [4, '*', 8]\n     */\n    function fill(array, value, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(chr) {\n     *   return chr.user == 'barney';\n     * });\n     * // => 0\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findIndex(users, 'active', false);\n     * // => 0\n     *\n     * // using the `_.property` callback shorthand\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    var findIndex = createFindIndex();\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(chr) {\n     *   return chr.user == 'pebbles';\n     * });\n     * // => 2\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastIndex(users, 'active', false);\n     * // => 2\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    var findLastIndex = createFindIndex(true);\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([]);\n     * // => undefined\n     */\n    function first(array) {\n      return array ? array[0] : undefined;\n    }\n\n    /**\n     * Flattens a nested array. If `isDeep` is `true` the array is recursively\n     * flattened, otherwise it is only flattened a single level.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, [4]]\n     *\n     * // using `isDeep`\n     * _.flatten([1, [2, 3, [4]]], true);\n     * // => [1, 2, 3, 4]\n     */\n    function flatten(array, isDeep, guard) {\n      var length = array ? array.length : 0;\n      if (guard && isIterateeCall(array, isDeep, guard)) {\n        isDeep = false;\n      }\n      return length ? baseFlatten(array, isDeep) : [];\n    }\n\n    /**\n     * Recursively flattens a nested array.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to recursively flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, 4]\n     */\n    function flattenDeep(array) {\n      var length = array ? array.length : 0;\n      return length ? baseFlatten(array, true) : [];\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using `SameValueZero` for equality comparisons. If `fromIndex` is negative,\n     * it is used as the offset from the end of `array`. If `array` is sorted\n     * providing `true` for `fromIndex` performs a faster binary search.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // using `fromIndex`\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     *\n     * // performing a binary search\n     * _.indexOf([1, 1, 2, 2], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      if (typeof fromIndex == 'number') {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n      } else if (fromIndex) {\n        var index = binaryIndex(array, value),\n            other = array[index];\n\n        if (value === value ? (value === other) : (other !== other)) {\n          return index;\n        }\n        return -1;\n      }\n      return baseIndexOf(array, value, fromIndex || 0);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      return dropRight(array, 1);\n    }\n\n    /**\n     * Creates an array of unique values in all provided arrays using `SameValueZero`\n     * for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of shared values.\n     * @example\n     * _.intersection([1, 2], [4, 2], [2, 1]);\n     * // => [2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = [],\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf;\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null);\n        }\n      }\n      argsLength = args.length;\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [],\n          seen = caches[0];\n\n      outer:\n      while (++index < length) {\n        value = array[index];\n        if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {\n          argsIndex = argsLength;\n          while (--argsIndex) {\n            var cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(value);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array ? array.length : 0;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n     *  or `true` to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // using `fromIndex`\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     *\n     * // performing a binary search\n     * _.lastIndexOf([1, 1, 2, 2], 2, true);\n     * // => 3\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n      } else if (fromIndex) {\n        index = binaryIndex(array, value, true) - 1;\n        var other = array[index];\n        if (value === value ? (value === other) : (other !== other)) {\n          return index;\n        }\n        return -1;\n      }\n      if (value !== value) {\n        return indexOfNaN(array, index, true);\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from `array` using `SameValueZero` for equality\n     * comparisons.\n     *\n     * **Notes:**\n     *  - Unlike `_.without`, this method mutates `array`\n     *  - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     *    comparisons are like strict equality comparisons, e.g. `===`, except\n     *    that `NaN` matches `NaN`\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     *\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull() {\n      var args = arguments,\n          array = args[0];\n\n      if (!(array && array.length)) {\n        return array;\n      }\n      var index = 0,\n          indexOf = getIndexOf(),\n          length = args.length;\n\n      while (++index < length) {\n        var fromIndex = 0,\n            value = args[index];\n\n        while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to the given indexes and returns\n     * an array of the removed elements. Indexes may be specified as an array of\n     * indexes or as individual arguments.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [5, 10, 15, 20];\n     * var evens = _.pullAt(array, 1, 3);\n     *\n     * console.log(array);\n     * // => [5, 15]\n     *\n     * console.log(evens);\n     * // => [10, 20]\n     */\n    var pullAt = restParam(function(array, indexes) {\n      array || (array = []);\n      indexes = baseFlatten(indexes);\n\n      var length = indexes.length,\n          result = baseAt(array, indexes);\n\n      indexes.sort(baseCompareAscending);\n      while (length--) {\n        var index = parseFloat(indexes[length]);\n        if (index != previous && isIndex(index)) {\n          var previous = index;\n          splice.call(array, index, 1);\n        }\n      }\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      predicate = getCallback(predicate, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias tail\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function rest(array) {\n      return drop(array, 1);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This function is used instead of `Array#slice` to support node\n     * lists in IE < 9 and to ensure dense arrays are returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value` should\n     * be inserted into `array` in order to maintain its sort order. If an iteratee\n     * function is provided it is invoked for `value` and each element of `array`\n     * to compute their sort ranking. The iteratee is bound to `thisArg` and\n     * invoked with one argument; (value).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     *\n     * _.sortedIndex([4, 4, 5, 5], 5);\n     * // => 2\n     *\n     * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n     *\n     * // using an iteratee function\n     * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n     *   return this.data[word];\n     * }, dict);\n     * // => 1\n     *\n     * // using the `_.property` callback shorthand\n     * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 1\n     */\n    var sortedIndex = createSortedIndex();\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 4, 5, 5], 5);\n     * // => 4\n     */\n    var sortedLastIndex = createSortedIndex(true);\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n     * and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active', false), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false},\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active', false), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * `SameValueZero` for equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([1, 2], [4, 2], [2, 1]);\n     * // => [1, 2, 4]\n     */\n    var union = restParam(function(arrays) {\n      return baseUniq(baseFlatten(arrays, false, true));\n    });\n\n    /**\n     * Creates a duplicate-value-free version of an array using `SameValueZero`\n     * for equality comparisons. Providing `true` for `isSorted` performs a faster\n     * search algorithm for sorted arrays. If an iteratee function is provided it\n     * is invoked for each value in the array to generate the criterion by which\n     * uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {boolean} [isSorted] Specify the array is sorted.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1]);\n     * // => [1, 2]\n     *\n     * // using `isSorted`\n     * _.uniq([1, 1, 2], true);\n     * // => [1, 2]\n     *\n     * // using an iteratee function\n     * _.uniq([1, 2.5, 1.5, 2], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => [1, 2.5]\n     *\n     * // using the `_.property` callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, iteratee, thisArg) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (isSorted != null && typeof isSorted != 'boolean') {\n        thisArg = iteratee;\n        iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted;\n        isSorted = false;\n      }\n      var func = getCallback();\n      if (!(func === baseCallback && iteratee == null)) {\n        iteratee = func(iteratee, thisArg, 3);\n      }\n      return (isSorted && getIndexOf() == baseIndexOf)\n        ? sortedUniq(array, iteratee)\n        : baseUniq(array, iteratee);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-`_.zip`\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['fred', 'barney'], [30, 40], [true, false]]\n     */\n    function unzip(array) {\n      var index = -1,\n          length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = arrayMap(array, baseProperty(index));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all provided values using `SameValueZero` for\n     * equality comparisons.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to filter.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 3], 1, 2);\n     * // => [3]\n     */\n    var without = restParam(function(array, values) {\n      return (isArray(array) || isArguments(array))\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the provided arrays.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of values.\n     * @example\n     *\n     * _.xor([1, 2], [4, 2]);\n     * // => [1, 4]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseDifference(result, array).concat(baseDifference(array, result))\n            : array;\n        }\n      }\n      return result ? baseUniq(result) : [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second elements\n     * of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    var zip = restParam(unzip);\n\n    /**\n     * The inverse of `_.pairs`; this method returns an object composed from arrays\n     * of property names and values. Provide either a single two dimensional array,\n     * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names\n     * and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Array\n     * @param {Array} props The property names.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject([['fred', 30], ['barney', 40]]);\n     * // => { 'fred': 30, 'barney': 40 }\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(props, values) {\n      var index = -1,\n          length = props ? props.length : 0,\n          result = {};\n\n      if (length && !values && !isArray(props[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = props[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps `value` with explicit method\n     * chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(users)\n     *   .sortBy('age')\n     *   .map(function(chr) {\n     *     return chr.user + ' is ' + chr.age;\n     *   })\n     *   .first()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor is\n     * bound to `thisArg` and invoked with one argument; (value). The purpose of\n     * this method is to \"tap into\" a method chain in order to perform operations\n     * on intermediate results within the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor, thisArg) {\n      interceptor.call(thisArg, value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor, thisArg) {\n      return interceptor.call(thisArg, value);\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(users).first();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(users).chain()\n     *   .first()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chained sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapper = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapper = wrapper.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapper.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Creates a clone of the chained sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapper = _(array).map(function(value) {\n     *   return Math.pow(value, 2);\n     * });\n     *\n     * var other = [3, 4];\n     * var otherWrapper = wrapper.plant(other);\n     *\n     * otherWrapper.value();\n     * // => [9, 16]\n     *\n     * wrapper.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * Reverses the wrapped array so the first element becomes the last, the\n     * second element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new reversed `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        if (this.__actions__.length) {\n          value = new LazyWrapper(this);\n        }\n        return new LodashWrapper(value.reverse(), this.__chain__);\n      }\n      return this.thru(function(value) {\n        return value.reverse();\n      });\n    }\n\n    /**\n     * Produces the result of coercing the unwrapped value to a string.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chain\n     * @returns {string} Returns the coerced string value.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return (this.value() + '');\n    }\n\n    /**\n     * Executes the chained sequence to extract the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @alias run, toJSON, valueOf\n     * @category Chain\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements corresponding to the given keys, or indexes,\n     * of `collection`. Keys may be specified as individual arguments or as arrays\n     * of keys.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [props] The property names\n     *  or indexes of elements to pick, specified individually or in arrays.\n     * @returns {Array} Returns the new array of picked elements.\n     * @example\n     *\n     * _.at(['a', 'b', 'c'], [0, 2]);\n     * // => ['a', 'c']\n     *\n     * _.at(['barney', 'fred', 'pebbles'], 0, 2);\n     * // => ['barney', 'pebbles']\n     */\n    var at = restParam(function(collection, props) {\n      var length = collection ? collection.length : 0;\n      if (isLength(length)) {\n        collection = toIterable(collection);\n      }\n      return baseAt(collection, baseFlatten(props));\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the number of times the key was returned by `iteratee`.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * The predicate is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': false },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.every(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = null;\n      }\n      if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.filter([4, 5, 6], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [4, 6]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.filter(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.filter(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function filter(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.result(_.find(users, function(chr) {\n     *   return chr.age < 40;\n     * }), 'user');\n     * // => 'barney'\n     *\n     * // using the `_.matches` callback shorthand\n     * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.result(_.find(users, 'active', false), 'user');\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.result(_.find(users, 'active'), 'user');\n     * // => 'barney'\n     */\n    var find = createFind(baseEach);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(baseEachRight, true);\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning the first element that has equivalent property\n     * values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');\n     * // => 'barney'\n     *\n     * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');\n     * // => 'fred'\n     */\n    function findWhere(collection, source) {\n      return find(collection, baseMatches(source));\n    }\n\n    /**\n     * Iterates over elements of `collection` invoking `iteratee` for each element.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection). Iterator functions may exit iteration early\n     * by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEach(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from left to right and returns the array\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n     *   console.log(n, key);\n     * });\n     * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n     */\n    var forEach = createForEach(arrayEach, baseEach);\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEachRight(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from right to left and returns the array\n     */\n    var forEachRight = createForEach(arrayEachRight, baseEachRight);\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using the `_.property` callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        result[key] = [value];\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection` using `SameValueZero` for equality\n     * comparisons. If `fromIndex` is negative, it is used as the offset from\n     * the end of `collection`.\n     *\n     * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n     * comparisons are like strict equality comparisons, e.g. `===`, except that\n     * `NaN` matches `NaN`.\n     *\n     * @static\n     * @memberOf _\n     * @alias contains, include\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {*} target The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n     * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.includes('pebbles', 'eb');\n     * // => true\n     */\n    function includes(collection, target, fromIndex, guard) {\n      var length = collection ? collection.length : 0;\n      if (!isLength(length)) {\n        collection = values(collection);\n        length = collection.length;\n      }\n      if (!length) {\n        return false;\n      }\n      if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {\n        fromIndex = 0;\n      } else {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);\n      }\n      return (typeof collection == 'string' || !isArray(collection) && isString(collection))\n        ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1)\n        : (getIndexOf(collection, target, fromIndex) > -1);\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the last element responsible for generating the key. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keyData = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keyData, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return String.fromCharCode(object.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return this.fromCharCode(object.code);\n     * }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in `collection`,\n     * returning an array of the results of each invoked method. Any additional\n     * arguments are provided to each invoked method. If `methodName` is a function\n     * it is invoked for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invoke = restParam(function(collection, methodName, args) {\n      var index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = isLength(length) ? Array(length) : [];\n\n      baseEach(collection, function(value) {\n        var func = isFunc ? methodName : (value != null && value[methodName]);\n        result[++index] = func ? func.apply(value, args) : undefined;\n      });\n      return result;\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` through\n     * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * Many lodash methods are guarded to work as interatees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,\n     * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,\n     * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,\n     * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     *  create a `_.property` or `_.matches` style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function timesThree(n) {\n     *   return n * 3;\n     * }\n     *\n     * _.map([1, 2], timesThree);\n     * // => [3, 6]\n     *\n     * _.map({ 'a': 1, 'b': 2 }, timesThree);\n     * // => [3, 6] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee, thisArg) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      iteratee = getCallback(iteratee, thisArg, 3);\n      return func(collection, iteratee);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, while the second of which\n     * contains elements `predicate` returns falsey for. The predicate is bound\n     * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * _.partition([1, 2, 3], function(n) {\n     *   return n % 2;\n     * });\n     * // => [[1, 3], [2]]\n     *\n     * _.partition([1.2, 2.3, 3.4], function(n) {\n     *   return this.floor(n) % 2;\n     * }, Math);\n     * // => [[1.2, 3.4], [2.3]]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * var mapper = function(array) {\n     *   return _.pluck(array, 'user');\n     * };\n     *\n     * // using the `_.matches` callback shorthand\n     * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n     * // => [['pebbles'], ['barney', 'fred']]\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.map(_.partition(users, 'active', false), mapper);\n     * // => [['barney', 'pebbles'], ['fred']]\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(_.partition(users, 'active'), mapper);\n     * // => [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Gets the value of `key` from all elements in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} key The key of the property to pluck.\n     * @returns {Array} Returns the property values.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(users, 'user');\n     * // => ['barney', 'fred']\n     *\n     * var userIndex = _.indexBy(users, 'user');\n     * _.pluck(userIndex, 'age');\n     * // => [36, 40] (iteration order is not guaranteed)\n     */\n    function pluck(collection, key) {\n      return map(collection, baseProperty(key));\n    }\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` through `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not provided the first element of `collection` is used as the initial\n     * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as interatees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * });\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n     */\n    var reduce = createReduce(arrayReduce, baseEach);\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    var reduceRight =  createReduce(arrayReduceRight, baseEachRight);\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.reject([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [1, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.reject(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.reject(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function reject(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, function(value, index, collection) {\n        return !predicate(value, index, collection);\n      });\n    }\n\n    /**\n     * Gets a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {*} Returns the random sample(s).\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (guard ? isIterateeCall(collection, n, guard) : n == null) {\n        collection = toIterable(collection);\n        var length = collection.length;\n        return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      collection = toIterable(collection);\n\n      var index = -1,\n          length = collection.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var rand = baseRandom(0, index);\n        if (index != rand) {\n          result[index] = result[rand];\n        }\n        result[rand] = collection[index];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the size of `collection`.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return isLength(length) ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * The function returns as soon as it finds a passing value and does not iterate\n     * over the entire collection. The predicate is bound to `thisArg` and invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.some(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = null;\n      }\n      if (typeof predicate != 'function' || typeof thisArg != 'undefined') {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through `iteratee`. This method performs\n     * a stable sort, that is, it preserves the original sort order of equal elements.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [iteratee=_.identity] The function\n     *  invoked per iteration. If a property name or an object is provided it is\n     *  used to create a `_.property` or `_.matches` style callback respectively.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return Math.sin(n);\n     * });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return this.sin(n);\n     * }, Math);\n     * // => [3, 1, 2]\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'pebbles' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.sortBy(users, 'user'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function sortBy(collection, iteratee, thisArg) {\n      if (collection == null) {\n        return [];\n      }\n      var index = -1,\n          length = collection.length,\n          result = isLength(length) ? Array(length) : [];\n\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = null;\n      }\n      iteratee = getCallback(iteratee, thisArg, 3);\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = { 'criteria': iteratee(value, key, collection), 'index': index, 'value': value };\n      });\n      return baseSortBy(result, compareAscending);\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it sorts by property names\n     * instead of an iteratee function.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(string|string[])} props The property names to sort by,\n     *  specified as individual property names or arrays of property names.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 26 },\n     *   { 'user': 'fred',   'age': 30 }\n     * ];\n     *\n     * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n     * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortByAll() {\n      var args = arguments,\n          collection = args[0],\n          guard = args[3],\n          index = 0,\n          length = args.length - 1;\n\n      if (collection == null) {\n        return [];\n      }\n      var props = Array(length);\n      while (index < length) {\n        props[index] = args[++index];\n      }\n      if (guard && isIterateeCall(args[1], args[2], guard)) {\n        props = args[1];\n      }\n      return baseSortByOrder(collection, baseFlatten(props), []);\n    }\n\n    /**\n     * This method is like `_.sortByAll` except that it allows specifying the\n     * sort orders of the property names to sort by. A truthy value in `orders`\n     * will sort the corresponding property name in ascending order while a\n     * falsey value will sort it in descending order.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string[]} props The property names to sort by.\n     * @param {boolean[]} orders The sort orders of `props`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 26 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 }\n     * ];\n     *\n     * // sort by `user` in ascending order and by `age` in descending order\n     * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values);\n     * // => [['barney', 36], ['barney', 26], ['fred', 40], ['fred', 30]]\n     */\n    function sortByOrder(collection, props, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (guard && isIterateeCall(props, orders, guard)) {\n        orders = null;\n      }\n      if (!isArray(props)) {\n        props = props == null ? [] : [props];\n      }\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseSortByOrder(collection, props, orders);\n    }\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },\n     *   { 'user': 'fred',   'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n     * // => ['fred']\n     */\n    function where(collection, source) {\n      return filter(collection, baseMatches(source));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Date\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => logs the number of milliseconds it took for the deferred function to be invoked\n     */\n    var now = nativeNow || function() {\n      return new Date().getTime();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it is called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'done saving!' after the two async saves have completed\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      n = nativeIsFinite(n = +n) ? n : 0;\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that accepts up to `n` arguments ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      if (guard && isIterateeCall(func, n, guard)) {\n        n = null;\n      }\n      n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);\n      return createWrapper(func, ARY_FLAG, null, null, null, null, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it is called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery('#add').on('click', _.before(5, addContactToList));\n     * // => allows adding up to 4 contacts to the list\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        } else {\n          func = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and prepends any additional `_.bind` arguments to those provided to the\n     * bound function.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind` this method does not set the `length`\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var greet = function(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * };\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // using placeholders\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = restParam(function(func, thisArg, partials) {\n      var bitmask = BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bind.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all enumerable function\n     * properties, own and inherited, of `object` are bound.\n     *\n     * **Note:** This method does not set the `length` property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} [methodNames] The object method names to bind,\n     *  specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs' when the element is clicked\n     */\n    var bindAll = restParam(function(object, methodNames) {\n      methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);\n\n      var index = -1,\n          length = methodNames.length;\n\n      while (++index < length) {\n        var key = methodNames[index];\n        object[key] = createWrapper(object[key], BIND_FLAG, object);\n      }\n      return object;\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` and prepends\n     * any additional `_.bindKey` arguments to those provided to the bound function.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist.\n     * See [Peter Michaux's article](http://michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // using placeholders\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = restParam(function(object, key, partials) {\n      var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bindKey.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts one or more arguments of `func` that when\n     * called either invokes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` may be specified\n     * if `func.length` is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    var curry = createCurry(CURRY_FLAG);\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the `length` property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    var curryRight = createCurry(CURRY_RIGHT_FLAG);\n\n    /**\n     * Creates a function that delays invoking `func` until after `wait` milliseconds\n     * have elapsed since the last time it was invoked. The created function comes\n     * with a `cancel` method to cancel delayed invocations. Provide an options\n     * object to indicate that `func` should be invoked on the leading and/or\n     * trailing edge of the `wait` timeout. Subsequent calls to the debounced\n     * function return the result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n     *  delayed before it is invoked.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // invoke `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // ensure `batchLog` is invoked once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }));\n     *\n     * // cancel a debounced call\n     * var todoChanges = _.debounce(batchLog, 1000);\n     * Object.observe(models.todo, todoChanges);\n     *\n     * Object.observe(models, function(changes) {\n     *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n     *     todoChanges.cancel();\n     *   }\n     * }, ['delete']);\n     *\n     * // ...at some point `models.todo` is changed\n     * models.todo.completed = true;\n     *\n     * // ...before 1 second has passed `models.todo` is deleted\n     * // which cancels the debounced `todoChanges` call\n     * delete models.todo;\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = wait < 0 ? 0 : (+wait || 0);\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n\n      function cancel() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        if (maxTimeoutId) {\n          clearTimeout(maxTimeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n      }\n\n      function delayed() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0 || remaining > wait) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      }\n\n      function maxDelayed() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      }\n\n      function debounced() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0 || remaining > maxWait;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    var defer = restParam(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    var delay = restParam(function(func, wait, args) {\n      return baseDelay(func, wait, args);\n    });\n\n    /**\n     * Creates a function that returns the result of invoking the provided\n     * functions with the `this` binding of the created function, where each\n     * successive invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow(_.add, square);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the provided functions from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias backflow, compose\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight(square, _.add);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is coerced to a string and used as the\n     * cache key. The `func` is invoked with the `this` binding of the memoized\n     * function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)\n     * method interface of `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var upperCase = _.memoize(function(string) {\n     *   return string.toUpperCase();\n     * });\n     *\n     * upperCase('fred');\n     * // => 'FRED'\n     *\n     * // modifying the result cache\n     * upperCase.cache.set('fred', 'BARNEY');\n     * upperCase('fred');\n     * // => 'BARNEY'\n     *\n     * // replacing `_.memoize.Cache`\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'barney' };\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'fred' }\n     *\n     * _.memoize.Cache = WeakMap;\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'barney' }\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            cache = memoized.cache,\n            key = resolver ? resolver.apply(this, args) : args[0];\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        cache.set(key, result);\n        return result;\n      };\n      memoized.cache = new memoize.Cache;\n      return memoized;\n    }\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        return !predicate.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first call. The `func` is invoked\n     * with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` invokes `createApplication` once\n     */\n    function once(func) {\n      return before(func, 2);\n    }\n\n    /**\n     * Creates a function that invokes `func` with `partial` arguments prepended\n     * to those provided to the new function. This method is like `_.bind` except\n     * it does **not** alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // using placeholders\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = createPartial(PARTIAL_FLAG);\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to those provided to the new function.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the `length` property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // using placeholders\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = createPartial(PARTIAL_RIGHT_FLAG);\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified indexes where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, 2, 0, 1);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     *\n     * var map = _.rearg(_.map, [1, 0]);\n     * map(function(n) {\n     *   return n * 3;\n     * }, [1, 2, 3]);\n     * // => [3, 6, 9]\n     */\n    var rearg = restParam(function(func, indexes) {\n      return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes));\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as an array.\n     *\n     * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.restParam(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function restParam(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            rest = Array(length);\n\n        while (++index < length) {\n          rest[index] = args[start + index];\n        }\n        switch (start) {\n          case 0: return func.call(this, rest);\n          case 1: return func.call(this, args[0], rest);\n          case 2: return func.call(this, args[0], args[1], rest);\n        }\n        var otherArgs = Array(start + 1);\n        index = -1;\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = rest;\n        return func.apply(this, otherArgs);\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the created\n     * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).\n     *\n     * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * // with a Promise\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function(array) {\n        return func.apply(this, array);\n      };\n    }\n\n    /**\n     * Creates a function that only invokes `func` at most once per every `wait`\n     * milliseconds. The created function comes with a `cancel` method to cancel\n     * delayed invocations. Provide an options object to indicate that `func`\n     * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n     * Subsequent calls to the throttled function return the result of the last\n     * `func` call.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     *\n     * // cancel a trailing throttled call\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = +wait;\n      debounceOptions.trailing = trailing;\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Any additional arguments provided to the function are\n     * appended to those provided to the wrapper function. The wrapper is invoked\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      wrapper = wrapper == null ? identity : wrapper;\n      return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n     * otherwise they are assigned by reference. If `customizer` is provided it is\n     * invoked to produce the cloned values. If `customizer` returns `undefined`\n     * cloning is handled by the method instead. The `customizer` is bound to\n     * `thisArg` and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var shallow = _.clone(users);\n     * shallow[0] === users[0];\n     * // => true\n     *\n     * var deep = _.clone(users, true);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.clone(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, customizer, thisArg) {\n      if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n        isDeep = false;\n      }\n      else if (typeof isDeep == 'function') {\n        thisArg = customizer;\n        customizer = isDeep;\n        isDeep = false;\n      }\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n      return baseClone(value, isDeep, customizer);\n    }\n\n    /**\n     * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n     * to produce the cloned values. If `customizer` returns `undefined` cloning\n     * is handled by the method instead. The `customizer` is bound to `thisArg`\n     * and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var deep = _.cloneDeep(users);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.cloneDeep(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 20\n     */\n    function cloneDeep(value, customizer, thisArg) {\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1);\n      return baseClone(value, true, customizer);\n    }\n\n    /**\n     * Checks if `value` is classified as an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      var length = isObjectLike(value) ? value.length : undefined;\n      return isLength(length) && objToString.call(value) == argsTag;\n    }\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(function() { return arguments; }());\n     * // => false\n     */\n    var isArray = nativeIsArray || function(value) {\n      return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n    };\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    function isDate(value) {\n      return isObjectLike(value) && objToString.call(value) == dateTag;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return !!value && value.nodeType === 1 && isObjectLike(value) &&\n        (objToString.call(value).indexOf('Element') > -1);\n    }\n    // Fallback for environments without DOM support.\n    if (!support.dom) {\n      isElement = function(value) {\n        return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n      };\n    }\n\n    /**\n     * Checks if `value` is empty. A value is considered empty unless it is an\n     * `arguments` object, array, string, or jQuery-like collection with a length\n     * greater than `0` or an object with own enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      var length = value.length;\n      if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||\n          (isObjectLike(value) && isFunction(value.splice)))) {\n        return !length;\n      }\n      return !keys(value).length;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent. If `customizer` is provided it is invoked to compare values.\n     * If `customizer` returns `undefined` comparisons are handled by the method\n     * instead. The `customizer` is bound to `thisArg` and invoked with three\n     * arguments: (value, other [, index|key]).\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. Functions and DOM nodes\n     * are **not** supported. Provide a customizer function to extend support\n     * for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'fred' };\n     *\n     * object == other;\n     * // => false\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * // using a customizer callback\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqual(array, other, function(value, other) {\n     *   if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n     *     return true;\n     *   }\n     * });\n     * // => true\n     */\n    function isEqual(value, other, customizer, thisArg) {\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n      if (!customizer && isStrictComparable(value) && isStrictComparable(other)) {\n        return value === other;\n      }\n      var result = customizer ? customizer(value, other) : undefined;\n      return typeof result == 'undefined' ? baseIsEqual(value, other, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(10);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => false\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite(Object(10));\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    var isFinite = nativeNumIsFinite || function(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    };\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) {\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in older versions of Chrome and Safari which return 'function' for regexes\n      // and Safari 8 equivalents which return 'object' for typed array constructors.\n      return objToString.call(value) == funcTag;\n    };\n\n    /**\n     * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // Avoid a V8 JIT bug in Chrome 19-20.\n      // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n      var type = typeof value;\n      return type == 'function' || (!!value && type == 'object');\n    }\n\n    /**\n     * Performs a deep comparison between `object` and `source` to determine if\n     * `object` contains equivalent property values. If `customizer` is provided\n     * it is invoked to compare values. If `customizer` returns `undefined`\n     * comparisons are handled by the method instead. The `customizer` is bound\n     * to `thisArg` and invoked with three arguments: (value, other, index|key).\n     *\n     * **Note:** This method supports comparing properties of arrays, booleans,\n     * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n     * and DOM nodes are **not** supported. Provide a customizer function to extend\n     * support for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.isMatch(object, { 'age': 40 });\n     * // => true\n     *\n     * _.isMatch(object, { 'age': 36 });\n     * // => false\n     *\n     * // using a customizer callback\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatch(object, source, function(value, other) {\n     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n     * });\n     * // => true\n     */\n    function isMatch(object, source, customizer, thisArg) {\n      var props = keys(source),\n          length = props.length;\n\n      if (!length) {\n        return true;\n      }\n      if (object == null) {\n        return false;\n      }\n      customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);\n      if (!customizer && length == 1) {\n        var key = props[0],\n            value = source[key];\n\n        if (isStrictComparable(value)) {\n          return value === object[key] && (typeof value != 'undefined' || (key in toObject(object)));\n        }\n      }\n      var values = Array(length),\n          strictCompareFlags = Array(length);\n\n      while (length--) {\n        value = values[length] = source[props[length]];\n        strictCompareFlags[length] = isStrictComparable(value);\n      }\n      return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n     * which returns `true` for `undefined` and other non-numeric values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (value == null) {\n        return false;\n      }\n      if (objToString.call(value) == funcTag) {\n        return reNative.test(fnToString.call(value));\n      }\n      return isObjectLike(value) && reHostCtor.test(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n     * as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4);\n     * // => true\n     *\n     * _.isNumber(NaN);\n     * // => true\n     *\n     * _.isNumber('8.4');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * **Note:** This method assumes objects created by the `Object` constructor\n     * have no inherited enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && objToString.call(value) == objectTag)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    function isRegExp(value) {\n      return (isObjectLike(value) && objToString.call(value) == regexpTag) || false;\n    }\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    function isTypedArray(value) {\n      return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * (function() {\n     *   return _.toArray(arguments).slice(1);\n     * }(1, 2, 3));\n     * // => [2, 3]\n     */\n    function toArray(value) {\n      var length = value ? value.length : 0;\n      if (!isLength(length)) {\n        return values(value);\n      }\n      if (!length) {\n        return [];\n      }\n      return arrayCopy(value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable\n     * properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return baseCopy(value, keysIn(value));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources overwrite property assignments of previous sources.\n     * If `customizer` is provided it is invoked to produce the assigned values.\n     * The `customizer` is bound to `thisArg` and invoked with five arguments:\n     * (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using a customizer callback\n     * var defaults = _.partialRight(_.assign, function(value, other) {\n     *   return typeof value == 'undefined' ? other : value;\n     * });\n     *\n     * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var assign = createAssigner(baseAssign);\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties, guard) {\n      var result = baseCreate(prototype);\n      if (guard && isIterateeCall(prototype, properties, guard)) {\n        properties = null;\n      }\n      return properties ? baseCopy(properties, result, keys(properties)) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional values of the same property are ignored.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var defaults = restParam(function(args) {\n      var object = args[0];\n      if (object == null) {\n        return object;\n      }\n      args.push(assignDefaults);\n      return assign.apply(undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    var findKey = createFindKey(baseForOwn);\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles` assuming `_.findKey` returns `barney`\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    var findLastKey = createFindKey(baseForOwnRight);\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object invoking\n     * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments: (value, key, object). Iterator functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n     */\n    var forIn = createForIn(baseFor);\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n     */\n    var forInRight = createForIn(baseForRight);\n\n    /**\n     * Iterates over own enumerable properties of an object invoking `iteratee`\n     * for each property. The `iteratee` is bound to `thisArg` and invoked with\n     * three arguments: (value, key, object). Iterator functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a' and 'b' (iteration order is not guaranteed)\n     */\n    var forOwn = createForOwn(baseForOwn);\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n     */\n    var forOwnRight = createForOwn(baseForOwnRight);\n\n    /**\n     * Creates an array of function property names from all enumerable properties,\n     * own and inherited, of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of property names.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['after', 'ary', 'assign', ...]\n     */\n    function functions(object) {\n      return baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Checks if `key` exists as a direct property of `object` instead of an\n     * inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` is a direct property, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 3 };\n     *\n     * _.has(object, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite property\n     * assignments of previous values unless `multiValue` is `true`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {boolean} [multiValue] Allow multiple values per key.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     *\n     * // with `multiValue`\n     * _.invert(object, true);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function invert(object, multiValue, guard) {\n      if (guard && isIterateeCall(object, multiValue, guard)) {\n        multiValue = null;\n      }\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key];\n\n        if (multiValue) {\n          if (hasOwnProperty.call(result, value)) {\n            result[value].push(key);\n          } else {\n            result[value] = [key];\n          }\n        }\n        else {\n          result[value] = key;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (object) {\n        var Ctor = object.constructor,\n            length = object.length;\n      }\n      if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n          (typeof object != 'function' && (length && isLength(length)))) {\n        return shimKeys(object);\n      }\n      return isObject(object) ? nativeKeys(object) : [];\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      if (object == null) {\n        return [];\n      }\n      if (!isObject(object)) {\n        object = Object(object);\n      }\n      var length = object.length;\n      length = (length && isLength(length) &&\n        (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0;\n\n      var Ctor = object.constructor,\n          index = -1,\n          isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n          result = Array(length),\n          skipIndexes = length > 0;\n\n      while (++index < length) {\n        result[index] = (index + '');\n      }\n      for (var key in object) {\n        if (!(skipIndexes && isIndex(key, length)) &&\n            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through `iteratee`. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, key, object).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the new mapped object.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n     *   return n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using the `_.property` callback shorthand\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee, thisArg) {\n      var result = {};\n      iteratee = getCallback(iteratee, thisArg, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        result[key] = iteratee(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * overwrite property assignments of previous sources. If `customizer` is\n     * provided it is invoked to produce the merged values of the destination and\n     * source properties. If `customizer` returns `undefined` merging is handled\n     * by the method instead. The `customizer` is bound to `thisArg` and invoked\n     * with five arguments: (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var users = {\n     *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n     * };\n     *\n     * var ages = {\n     *   'data': [{ 'age': 36 }, { 'age': 40 }]\n     * };\n     *\n     * _.merge(users, ages);\n     * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n     *\n     * // using a customizer callback\n     * var object = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var other = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(object, other, function(a, b) {\n     *   if (_.isArray(a)) {\n     *     return a.concat(b);\n     *   }\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n     */\n    var merge = createAssigner(baseMerge);\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable properties of `object` that are not omitted.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If `predicate` is provided it is invoked for each property\n     * of `object` omitting the properties `predicate` returns truthy for. The\n     * predicate is bound to `thisArg` and invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to omit, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.omit(object, 'age');\n     * // => { 'user': 'fred' }\n     *\n     * _.omit(object, _.isNumber);\n     * // => { 'user': 'fred' }\n     */\n    var omit = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      if (typeof props[0] != 'function') {\n        var props = arrayMap(baseFlatten(props), String);\n        return pickByArray(object, baseDifference(keysIn(object), props));\n      }\n      var predicate = bindCallback(props[0], props[1], 3);\n      return pickByCallback(object, function(value, key, object) {\n        return !predicate(value, key, object);\n      });\n    });\n\n    /**\n     * Creates a two dimensional array of the key-value pairs for `object`,\n     * e.g. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties. Property\n     * names may be specified as individual arguments or as arrays of property\n     * names. If `predicate` is provided it is invoked for each property of `object`\n     * picking the properties `predicate` returns truthy for. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.pick(object, 'user');\n     * // => { 'user': 'fred' }\n     *\n     * _.pick(object, _.isString);\n     * // => { 'user': 'fred' }\n     */\n    var pick = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      return typeof props[0] == 'function'\n        ? pickByCallback(object, bindCallback(props[0], props[1], 3))\n        : pickByArray(object, baseFlatten(props));\n    });\n\n    /**\n     * Resolves the value of property `key` on `object`. If the value of `key` is\n     * a function it is invoked with the `this` binding of `object` and its result\n     * is returned, else the property value is returned. If the property value is\n     * `undefined` the `defaultValue` is used in its place.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to resolve.\n     * @param {*} [defaultValue] The value returned if the property value\n     *  resolves to `undefined`.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': _.constant(40) };\n     *\n     * _.result(object, 'user');\n     * // => 'fred'\n     *\n     * _.result(object, 'age');\n     * // => 40\n     *\n     * _.result(object, 'status', 'busy');\n     * // => 'busy'\n     *\n     * _.result(object, 'status', _.constant('busy'));\n     * // => 'busy'\n     */\n    function result(object, key, defaultValue) {\n      var value = object == null ? undefined : object[key];\n      if (typeof value == 'undefined') {\n        value = defaultValue;\n      }\n      return isFunction(value) ? value.call(object) : value;\n    }\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own enumerable\n     * properties through `iteratee`, with each invocation potentially mutating\n     * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n     * with four arguments: (accumulator, value, key, object). Iterator functions\n     * may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * });\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     */\n    function transform(object, iteratee, accumulator, thisArg) {\n      var isArr = isArray(object) || isTypedArray(object);\n      iteratee = getCallback(iteratee, thisArg, 4);\n\n      if (accumulator == null) {\n        if (isArr || isObject(object)) {\n          var Ctor = object.constructor;\n          if (isArr) {\n            accumulator = isArray(object) ? new Ctor : [];\n          } else {\n            accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype);\n          }\n        } else {\n          accumulator = {};\n        }\n      }\n      (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Creates an array of the own enumerable property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property values\n     * of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `n` is between `start` and up to but not including, `end`. If\n     * `end` is not specified it is set to `start` with `start` then set to `0`.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} n The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     */\n    function inRange(value, start, end) {\n      start = +start || 0;\n      if (typeof end === 'undefined') {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      return value >= start && value < end;\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number is returned.\n     * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n     * number is returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      if (floating && isIterateeCall(min, max, floating)) {\n        max = floating = null;\n      }\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (noMax && typeof min == 'boolean') {\n          floating = min;\n          min = 1;\n        }\n        else if (typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n        noMax = false;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__foo_bar__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);\n    });\n\n    /**\n     * Capitalizes the first character of `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('fred');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      string = baseToString(string);\n      return string && (string.charAt(0).toUpperCase() + string.slice(1));\n    }\n\n    /**\n     * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = baseToString(string);\n      return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search from.\n     * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = baseToString(string);\n      target = (target + '');\n\n      var length = string.length;\n      position = typeof position == 'undefined'\n        ? length\n        : nativeMin(position < 0 ? 0 : (+position || 0), length);\n\n      position -= target.length;\n      return position >= 0 && string.indexOf(target, position) == position;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n     * their corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional characters\n     * use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't require escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value.\n     * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * Backticks are escaped because in Internet Explorer < 9, they can break out\n     * of attribute values or HTML comments. See [#102](https://html5sec.org/#102),\n     * [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of\n     * the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.\n     *\n     * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n     * to reduce XSS vectors.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n      string = baseToString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n     * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n     */\n    function escapeRegExp(string) {\n      string = baseToString(string);\n      return (string && reHasRegExpChars.test(string))\n        ? string.replace(reRegExpChars, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__foo_bar__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Pads `string` on the left and right sides if it is shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = baseToString(string);\n      length = +length;\n\n      var strLength = string.length;\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return string;\n      }\n      var mid = (length - strLength) / 2,\n          leftLength = floor(mid),\n          rightLength = ceil(mid);\n\n      chars = createPadding('', rightLength, chars);\n      return chars.slice(0, leftLength) + string + chars;\n    }\n\n    /**\n     * Pads `string` on the left side if it is shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padLeft('abc', 6);\n     * // => '   abc'\n     *\n     * _.padLeft('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padLeft('abc', 3);\n     * // => 'abc'\n     */\n    var padLeft = createPadDir();\n\n    /**\n     * Pads `string` on the right side if it is shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padRight('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padRight('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padRight('abc', 3);\n     * // => 'abc'\n     */\n    var padRight = createPadDir(true);\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n     * in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n     * of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard && isIterateeCall(string, radix, guard)) {\n        radix = 0;\n      }\n      return nativeParseInt(string, radix);\n    }\n    // Fallback for environments with pre-ES5 implementations.\n    if (nativeParseInt(whitespace + '08') != 8) {\n      parseInt = function(string, radix, guard) {\n        // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n        // Chrome fails to trim leading <BOM> whitespace characters.\n        // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n        if (guard ? isIterateeCall(string, radix, guard) : radix == null) {\n          radix = 0;\n        } else if (radix) {\n          radix = +radix;\n        }\n        string = trim(string);\n        return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10));\n      };\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=0] The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n) {\n      var result = '';\n      string = baseToString(string);\n      n = +n;\n      if (n < 1 || !string || !nativeIsFinite(n)) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = floor(n / 2);\n        string += string;\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--foo-bar');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__foo_bar__');\n     * // => 'Foo Bar'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = baseToString(string);\n      position = position == null\n        ? 0\n        : nativeMin(position < 0 ? 0 : (+position || 0), string.length);\n\n      return string.lastIndexOf(target, position) == position;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is provided it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [options.variable] The data object variable name.\n     * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // using the HTML \"escape\" delimiter to escape data property values\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to execute JavaScript and generate HTML\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using the ES delimiter as an alternative to the default \"interpolate\" delimiter\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // using custom template delimiters\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using backslashes to treat delimiters as plain text\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // using the `imports` option to import `jQuery` as `jq`\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, otherOptions) {\n      // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (otherOptions && isIterateeCall(string, options, otherOptions)) {\n        options = otherOptions = null;\n      }\n      string = baseToString(string);\n      options = baseAssign(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);\n\n      var imports = baseAssign(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);\n      }\n      chars = (chars + '');\n      return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimLeft('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimLeft('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimLeft(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string));\n      }\n      return string.slice(charsLeftIndex(string, (chars + '')));\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimRight('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimRight('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimRight(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(0, trimmedRightIndex(string) + 1);\n      }\n      return string.slice(0, charsRightIndex(string, (chars + '')) + 1);\n    }\n\n    /**\n     * Truncates `string` if it is longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object|number} [options] The options object or maximum string length.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.trunc('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', 24);\n     * // => 'hi-diddly-ho there, n...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function trunc(string, options, guard) {\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = null;\n      }\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (options != null) {\n        if (isObject(options)) {\n          var separator = 'separator' in options ? options.separator : separator;\n          length = 'length' in options ? (+options.length || 0) : length;\n          omission = 'omission' in options ? baseToString(options.omission) : omission;\n        } else {\n          length = +options || 0;\n        }\n      }\n      string = baseToString(string);\n      if (length >= string.length) {\n        return string;\n      }\n      var end = length - omission.length;\n      if (end < 1) {\n        return omission;\n      }\n      var result = string.slice(0, end);\n      if (separator == null) {\n        return result + omission;\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              newEnd,\n              substring = string.slice(0, end);\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            newEnd = match.index;\n          }\n          result = result.slice(0, newEnd == null ? end : newEnd);\n        }\n      } else if (string.indexOf(separator, end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their\n     * corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional HTML\n     * entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = baseToString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      if (guard && isIterateeCall(string, pattern, guard)) {\n        pattern = null;\n      }\n      string = baseToString(string);\n      return string.match(pattern || reWords) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function} func The function to attempt.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // avoid throwing errors for invalid selectors\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = restParam(function(func, args) {\n      try {\n        return func.apply(undefined, args);\n      } catch(e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and arguments of the created function. If `func` is a property name the\n     * created callback returns the property value for a given element. If `func`\n     * is an object the created callback returns `true` for elements that contain\n     * the equivalent object properties, otherwise it returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias iteratee\n     * @category Utility\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);\n     *   if (!match) {\n     *     return callback(func, thisArg);\n     *   }\n     *   return function(object) {\n     *     return match[2] == 'gt'\n     *       ? object[match[1]] > match[3]\n     *       : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(users, 'age__gt36');\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     */\n    function callback(func, thisArg, guard) {\n      if (guard && isIterateeCall(func, thisArg, guard)) {\n        thisArg = null;\n      }\n      return isObjectLike(func)\n        ? matches(func)\n        : baseCallback(func, thisArg);\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var getter = _.constant(object);\n     *\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function which performs a deep comparison between a given object\n     * and `source`, returning `true` if the given object has equivalent property\n     * values, else `false`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, _.matches({ 'age': 40, 'active': false }));\n     * // => [{ 'user': 'fred', 'age': 40, 'active': false }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, true));\n    }\n\n    /**\n     * Creates a function which compares the property value of `key` on a given\n     * object to `value`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} key The key of the property to get.\n     * @param {*} value The value to compare.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * _.find(users, _.matchesProperty('user', 'fred'));\n     * // => { 'user': 'fred' }\n     */\n    function matchesProperty(key, value) {\n      return baseMatchesProperty(key + '', baseClone(value, true));\n    }\n\n    /**\n     * Adds all own enumerable function properties of a source object to the\n     * destination object. If `object` is a function then methods are added to\n     * its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function\n     * for mixins to avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function|Object} [object=this] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added\n     *  are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * // use `_.runInContext` to avoid conflicts (esp. in Node.js)\n     * var _ = require('lodash').runInContext();\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      if (options == null) {\n        var isObj = isObject(source),\n            props = isObj && keys(source),\n            methodNames = props && props.length && baseFunctions(source, props);\n\n        if (!(methodNames ? methodNames.length : isObj)) {\n          methodNames = false;\n          options = source;\n          source = object;\n          object = this;\n        }\n      }\n      if (!methodNames) {\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = true,\n          index = -1,\n          isFunc = isFunction(object),\n          length = methodNames.length;\n\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      while (++index < length) {\n        var methodName = methodNames[index],\n            func = source[methodName];\n\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = (function(func) {\n            return function() {\n              var chainAll = this.__chain__;\n              if (chain || chainAll) {\n                var result = object(this.__wrapped__),\n                    actions = result.__actions__ = arrayCopy(this.__actions__);\n\n                actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n                result.__chain__ = chainAll;\n                return result;\n              }\n              var args = [this.value()];\n              push.apply(args, arguments);\n              return func.apply(object, args);\n            };\n          }(func));\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function which returns `undefined` regardless of the\n     * arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function which returns the property value of `key` on a given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * var getName = _.property('user');\n     *\n     * _.map(users, getName);\n     * // => ['fred', 'barney']\n     *\n     * _.pluck(_.sortBy(users, getName), 'user');\n     * // => ['barney', 'fred']\n     */\n    function property(key) {\n      return baseProperty(key + '');\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function which returns\n     * the property value of a given key on `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} object The object to inspect.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'a': 3, 'b': 1, 'c': 2 };\n     *\n     * _.map(['a', 'c'], _.propertyOf(object));\n     * // => [3, 2]\n     *\n     * _.sortBy(['a', 'b', 'c'], _.propertyOf(object));\n     * // => ['b', 'c', 'a']\n     */\n    function propertyOf(object) {\n      return function(key) {\n        return object == null ? undefined : object[key];\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. If `end` is not specified it is\n     * set to `start` with `start` then set to `0`. If `start` is less than `end`\n     * a zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the new array of numbers.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      if (step && isIterateeCall(start, end, step)) {\n        end = step = null;\n      }\n      start = +start || 0;\n      step = step == null ? 1 : (+step || 0);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.\n      // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.\n      var index = -1,\n          length = nativeMax(ceil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Invokes the iteratee function `n` times, returning an array of the results\n     * of each invocation. The `iteratee` is bound to `thisArg` and invoked with\n     * one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) {\n     *   mage.castSpell(n);\n     * });\n     * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) {\n     *   this.cast(n);\n     * }, mage);\n     * // => also invokes `mage.castSpell(n)` three times\n     */\n    function times(n, iteratee, thisArg) {\n      n = +n;\n\n      // Exit early to avoid a JSC JIT bug in Safari 8\n      // where `Array(0)` is treated as `Array(1)`.\n      if (n < 1 || !nativeIsFinite(n)) {\n        return [];\n      }\n      var index = -1,\n          result = Array(nativeMin(n, MAX_ARRAY_LENGTH));\n\n      iteratee = bindCallback(iteratee, thisArg, 1);\n      while (++index < n) {\n        if (index < MAX_ARRAY_LENGTH) {\n          result[index] = iteratee(index);\n        } else {\n          iteratee(index);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID is appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return baseToString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} augend The first number to add.\n     * @param {number} addend The second number to add.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    function add(augend, addend) {\n      return augend + addend;\n    }\n\n    /**\n     * Gets the maximum value of `collection`. If `collection` is empty or falsey\n     * `-Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => -Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.max(users, 'age');\n     * // => { 'user': 'fred', 'age': 40 }\n     */\n    var max = createExtremum(arrayMax);\n\n    /**\n     * Gets the minimum value of `collection`. If `collection` is empty or falsey\n     * `Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.min(users, 'age');\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var min = createExtremum(arrayMin, true);\n\n    /**\n     * Gets the sum of the values in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 6]);\n     * // => 10\n     *\n     * _.sum({ 'a': 4, 'b': 6 });\n     * // => 10\n     *\n     * var objects = [\n     *   { 'n': 4 },\n     *   { 'n': 6 }\n     * ];\n     *\n     * _.sum(objects, function(object) {\n     *   return object.n;\n     * });\n     * // => 10\n     *\n     * // using the `_.property` callback shorthand\n     * _.sum(objects, 'n');\n     * // => 10\n     */\n    function sum(collection, iteratee, thisArg) {\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = null;\n      }\n      var func = getCallback(),\n          noIteratee = iteratee == null;\n\n      if (!(func === baseCallback && noIteratee)) {\n        noIteratee = false;\n        iteratee = func(iteratee, thisArg, 3);\n      }\n      return noIteratee\n        ? arraySum(isArray(collection) ? collection : toIterable(collection))\n        : baseSum(collection, iteratee);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    // Add functions to the `Map` cache.\n    MapCache.prototype['delete'] = mapDelete;\n    MapCache.prototype.get = mapGet;\n    MapCache.prototype.has = mapHas;\n    MapCache.prototype.set = mapSet;\n\n    // Add functions to the `Set` cache.\n    SetCache.prototype.push = cachePush;\n\n    // Assign cache to `_.memoize`.\n    memoize.Cache = MapCache;\n\n    // Add functions that return wrapped values when chaining.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.callback = callback;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.restParam = restParam;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortByAll = sortByAll;\n    lodash.sortByOrder = sortByOrder;\n    lodash.spread = spread;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.unzip = unzip;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // Add aliases.\n    lodash.backflow = flowRight;\n    lodash.collect = map;\n    lodash.compose = flowRight;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.iteratee = callback;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n\n    // Add functions to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions that return unwrapped values when chaining.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.deburr = deburr;\n    lodash.endsWith = endsWith;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.findWhere = findWhere;\n    lodash.first = first;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isMatch = isMatch;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.max = max;\n    lodash.min = min;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padLeft = padLeft;\n    lodash.padRight = padRight;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.sum = sum;\n    lodash.template = template;\n    lodash.trim = trim;\n    lodash.trimLeft = trimLeft;\n    lodash.trimRight = trimRight;\n    lodash.trunc = trunc;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.words = words;\n\n    // Add aliases.\n    lodash.all = every;\n    lodash.any = some;\n    lodash.contains = includes;\n    lodash.detect = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.head = first;\n    lodash.include = includes;\n    lodash.inject = reduce;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), false);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions capable of returning wrapped and unwrapped values when chaining.\n    lodash.sample = sample;\n\n    lodash.prototype.sample = function(n) {\n      if (!this.__chain__ && n == null) {\n        return sample(this.value());\n      }\n      return this.thru(function(value) {\n        return sample(value, n);\n      });\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) {\n      var isFilter = type != LAZY_MAP_FLAG,\n          isDropWhile = type == LAZY_DROP_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {\n        var filtered = this.__filtered__,\n            result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(),\n            iteratees = result.__iteratees__ || (result.__iteratees__ = []);\n\n        iteratees.push({\n          'done': false,\n          'count': 0,\n          'index': 0,\n          'iteratee': getCallback(iteratee, thisArg, 1),\n          'limit': -1,\n          'type': type\n        });\n\n        result.__filtered__ = filtered || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      var whileName = methodName + 'While';\n\n      LazyWrapper.prototype[methodName] = function(n) {\n        var filtered = this.__filtered__,\n            result = (filtered && !index) ? this.dropWhile() : this.clone();\n\n        n = n == null ? 1 : nativeMax(floor(n) || 0, 0);\n        if (filtered) {\n          if (index) {\n            result.__takeCount__ = nativeMin(result.__takeCount__, n);\n          } else {\n            last(result.__iteratees__).limit = n;\n          }\n        } else {\n          var views = result.__views__ || (result.__views__ = []);\n          views.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n\n      LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) {\n        return this.reverse()[whileName](predicate, thisArg).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.first` and `_.last`.\n    arrayEach(['first', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.rest`.\n    arrayEach(['initial', 'rest'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[dropName](1);\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.pluck` and `_.where`.\n    arrayEach(['pluck', 'where'], function(methodName, index) {\n      var operationName = index ? 'filter' : 'map',\n          createCallback = index ? baseMatches : baseProperty;\n\n      LazyWrapper.prototype[methodName] = function(value) {\n        return this[operationName](createCallback(value));\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.reject = function(predicate, thisArg) {\n      predicate = getCallback(predicate, thisArg, 1);\n      return this.filter(function(value) {\n        return !predicate(value);\n      });\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = start == null ? 0 : (+start || 0);\n      var result = start < 0 ? this.takeRight(-start) : this.drop(start);\n\n      if (typeof end != 'undefined') {\n        end = (+end || 0);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.drop(0);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (!lodashFunc) {\n        return;\n      }\n      var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),\n          retUnwrapped = /^(?:first|last)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments,\n            length = args.length,\n            chainAll = this.__chain__,\n            value = this.__wrapped__,\n            isHybrid = !!this.__actions__.length,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // avoid lazy use if the iteratee has a `length` other than `1`\n          isLazy = useLazy = false;\n        }\n        var onlyLazy = isLazy && !isHybrid;\n        if (retUnwrapped && !chainAll) {\n          return onlyLazy\n            ? func.call(value)\n            : lodashFunc.call(lodash, this.value());\n        }\n        var interceptor = function(value) {\n          var otherArgs = [value];\n          push.apply(otherArgs, args);\n          return lodashFunc.apply(lodash, otherArgs);\n        };\n        if (useLazy) {\n          var wrapper = onlyLazy ? value : new LazyWrapper(this),\n              result = func.apply(wrapper, args);\n\n          if (!retUnwrapped && (isHybrid || result.__actions__)) {\n            var actions = result.__actions__ || (result.__actions__ = []);\n            actions.push({ 'func': thru, 'args': [interceptor], 'thisArg': lodash });\n          }\n          return new LodashWrapper(result, chainAll);\n        }\n        return this.thru(interceptor);\n      };\n    });\n\n    // Add `Array` and `String` methods to `lodash.prototype`.\n    arrayEach(['concat', 'join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {\n      var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          return func.apply(this.value(), args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(value, args);\n        });\n      };\n    });\n\n    // Map minified function names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name,\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }];\n\n    // Add functions to the lazy wrapper.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chaining functions to the `lodash` wrapper.\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add function aliases to the `lodash` wrapper.\n    lodash.prototype.collect = lodash.prototype.map;\n    lodash.prototype.head = lodash.prototype.first;\n    lodash.prototype.select = lodash.prototype.filter;\n    lodash.prototype.tail = lodash.prototype.rest;\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose lodash to the global object when an AMD loader is present to avoid\n    // errors in cases where lodash is loaded by a script tag and not intended\n    // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for\n    // more details.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n  else if (freeExports && freeModule) {\n    // Export for Node.js or RingoJS.\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // Export for Narwhal or Rhino -require.\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // Export for a browser or Rhino.\n    root._ = _;\n  }\n}.call(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/controlpanel/node_modules/lodash/index.js\n// module id = 98\n// module chunks = 0 1","import _ from 'lodash';\nimport querygridUtils from '../querygrid/utils';\n\nconst { formatNumberComma } = querygridUtils;\n\nexport const targetTypes = {\n  Above: 'above',\n  Below: 'below',\n  Between: 'between'\n};\n\nexport const targetStatuses = {\n  onTarget: 'On Target',\n  onTrack: 'On Track',\n  needsFocus: 'Needs Focus'\n};\n\nexport const isTargetGraph = (graphType) => graphType === 'bar' || graphType === 'line';\n\nexport const isKPITargetsEnabled = (entity) => _.some(entity.attributes.feature_permissions, fp => fp == 'kpi_targets');\n\nexport const isNumeric = (n) => !isNaN(parseFloat(n)) && isFinite(n);\n\nexport const isBetweenTarget = (type) => type === targetTypes.Between;\n\nexport const isTargetValid = (target) => !!target && !!target.get('type') &&\n    (isBetweenTarget(target.get('type')) ?\n      isNumeric(target.getIn(['value', 'from'])) && isNumeric(target.getIn(['value', 'to'])) :\n      isNumeric(target.get('value')));\n\nexport const getTargetText = (target) => {\n  if (target.get('type') === targetTypes.Between) {\n    return `Between ${formatNumberComma(target.getIn(['value', 'from']))} - ${formatNumberComma(target.getIn(['value', 'to']))}`;\n  }\n  return `${_.capitalize(target.get('type'))} ${formatNumberComma(target.get('value'))}`;\n};\n\nexport const getTargetStatus = (target, current) => {\n  const value = target.get('value');\n  const warning = target.get('warning') || value; // Default warning to target\n  const type = target.get('type');\n\n  switch (type) {\n  case targetTypes.Between:\n    if (current >= value.get('from') && current <= value.get('to')) {\n      return 'onTarget';\n    }\n    if (current >= warning.get('from') && current <= warning.get('to')) {\n      return 'onTrack';\n    }\n    return 'needsFocus';\n\n  case targetTypes.Below:\n    if (current <= value) {\n      return 'onTarget';\n    }\n    if (current <= warning) {\n      return 'onTrack';\n    }\n    return 'needsFocus';\n\n  case targetTypes.Above:\n  default:\n    if (current >= value) {\n      return 'onTarget';\n    }\n    if (current >= warning) {\n      return 'onTrack';\n    }\n    return 'needsFocus';\n  }\n};\n\nexport const getProgressBars = (type) => {\n  switch (type) {\n  case targetTypes.Between:\n    return ['needsFocus', 'onTrack', 'onTarget', 'onTrack', 'needsFocus'];\n\n  case targetTypes.Below:\n    return ['onTarget', 'onTrack', 'needsFocus'];\n\n  case targetTypes.Above:\n  default:\n    return ['needsFocus', 'onTrack', 'onTarget'];\n  }\n};\n\nexport const getProgressValues = (type, value, warning) => {\n  switch (type) {\n  case targetTypes.Between:\n    return [\n      { amount: warning.from, placeholder: 300},\n      { amount: value.from, placeholder: 500},\n      { amount: value.to, placeholder: 1000},\n      { amount: warning.to, placeholder: 1200 }\n    ];\n\n  case targetTypes.Below:\n    return [\n      { amount: value, placeholder: 500},\n      { amount: warning, placeholder: 1000},\n    ];\n\n  case targetTypes.Above:\n  default:\n    return [\n      { amount: warning, placeholder: 500},\n      { amount: value, placeholder: 1000},\n    ];\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/target_utils.ts","'use strict';\n\nvar util = require('../util/util');\nvar StyleTransition = require('./style_transition');\nvar StyleDeclaration = require('./style_declaration');\nvar styleSpec = require('./style_spec');\nvar validateStyle = require('./validate_style');\nvar parseColor = require('./parse_color');\nvar Evented = require('../util/evented');\n\nmodule.exports = StyleLayer;\n\nvar TRANSITION_SUFFIX = '-transition';\n\nStyleLayer.create = function(layer, refLayer) {\n    var Classes = {\n        background: require('./style_layer/background_style_layer'),\n        circle: require('./style_layer/circle_style_layer'),\n        fill: require('./style_layer/fill_style_layer'),\n        line: require('./style_layer/line_style_layer'),\n        raster: require('./style_layer/raster_style_layer'),\n        symbol: require('./style_layer/symbol_style_layer')\n    };\n    return new Classes[(refLayer || layer).type](layer, refLayer);\n};\n\nfunction StyleLayer(layer, refLayer) {\n    this.set(layer, refLayer);\n}\n\nStyleLayer.prototype = util.inherit(Evented, {\n\n    set: function(layer, refLayer) {\n        this.id = layer.id;\n        this.ref = layer.ref;\n        this.metadata = layer.metadata;\n        this.type = (refLayer || layer).type;\n        this.source = (refLayer || layer).source;\n        this.sourceLayer = (refLayer || layer)['source-layer'];\n        this.minzoom = (refLayer || layer).minzoom;\n        this.maxzoom = (refLayer || layer).maxzoom;\n        this.filter = (refLayer || layer).filter;\n\n        this.paint = {};\n        this.layout = {};\n\n        this._paintSpecifications = styleSpec['paint_' + this.type];\n        this._layoutSpecifications = styleSpec['layout_' + this.type];\n\n        this._paintTransitions = {}; // {[propertyName]: StyleTransition}\n        this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}}\n        this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}}\n        this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration}\n        this._layoutFunctions = {}; // {[propertyName]: Boolean}\n\n        var paintName, layoutName;\n\n        // Resolve paint declarations\n        for (var key in layer) {\n            var match = key.match(/^paint(?:\\.(.*))?$/);\n            if (match) {\n                var klass = match[1] || '';\n                for (paintName in layer[key]) {\n                    this.setPaintProperty(paintName, layer[key][paintName], klass);\n                }\n            }\n        }\n\n        // Resolve layout declarations\n        if (this.ref) {\n            this._layoutDeclarations = refLayer._layoutDeclarations;\n        } else {\n            for (layoutName in layer.layout) {\n                this.setLayoutProperty(layoutName, layer.layout[layoutName]);\n            }\n        }\n\n        // set initial layout/paint values\n        for (paintName in this._paintSpecifications) {\n            this.paint[paintName] = this.getPaintValue(paintName);\n        }\n        for (layoutName in this._layoutSpecifications) {\n            this._updateLayoutValue(layoutName);\n        }\n    },\n\n    setLayoutProperty: function(name, value) {\n\n        if (value == null) {\n            delete this._layoutDeclarations[name];\n        } else {\n            var key = 'layers.' + this.id + '.layout.' + name;\n            if (this._handleErrors(validateStyle.layoutProperty, key, name, value)) return;\n            this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value);\n        }\n        this._updateLayoutValue(name);\n    },\n\n    getLayoutProperty: function(name) {\n        return (\n            this._layoutDeclarations[name] &&\n            this._layoutDeclarations[name].value\n        );\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        var specification = this._layoutSpecifications[name];\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.calculate(globalProperties, featureProperties);\n        } else {\n            return specification.default;\n        }\n    },\n\n    setPaintProperty: function(name, value, klass) {\n        var validateStyleKey = 'layers.' + this.id + (klass ? '[\"paint.' + klass + '\"].' : '.paint.') + name;\n\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            if (!this._paintTransitionOptions[klass || '']) {\n                this._paintTransitionOptions[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintTransitionOptions[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintTransitionOptions[klass || ''][name] = value;\n            }\n        } else {\n            if (!this._paintDeclarations[klass || '']) {\n                this._paintDeclarations[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintDeclarations[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value);\n            }\n        }\n    },\n\n    getPaintProperty: function(name, klass) {\n        klass = klass || '';\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            return (\n                this._paintTransitionOptions[klass] &&\n                this._paintTransitionOptions[klass][name]\n            );\n        } else {\n            return (\n                this._paintDeclarations[klass] &&\n                this._paintDeclarations[klass][name] &&\n                this._paintDeclarations[klass][name].value\n            );\n        }\n    },\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var specification = this._paintSpecifications[name];\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.calculate(globalProperties, featureProperties);\n        } else if (specification.type === 'color' && specification.default) {\n            return parseColor(specification.default);\n        } else {\n            return specification.default;\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        var transition = this._paintTransitions[name];\n        if (transition) {\n            return transition.declaration.stopZoomLevels;\n        } else {\n            return [];\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        var transition = this._paintTransitions[name];\n        return transition.declaration.calculateInterpolationT({ zoom: zoom });\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isZoomConstant;\n        } else {\n            return true;\n        }\n    },\n\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n        if (this.paint[this.type + '-opacity'] === 0) return true;\n        return false;\n    },\n\n    updatePaintTransitions: function(classes, options, globalOptions, animationLoop) {\n        var declarations = util.extend({}, this._paintDeclarations['']);\n        for (var i = 0; i < classes.length; i++) {\n            util.extend(declarations, this._paintDeclarations[classes[i]]);\n        }\n\n        var name;\n        for (name in declarations) { // apply new declarations\n            this._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop);\n        }\n        for (name in this._paintTransitions) {\n            if (!(name in declarations)) // apply removed declarations\n                this._applyPaintDeclaration(name, null, options, globalOptions, animationLoop);\n        }\n    },\n\n    updatePaintTransition: function(name, classes, options, globalOptions, animationLoop) {\n        var declaration = this._paintDeclarations[''][name];\n        for (var i = 0; i < classes.length; i++) {\n            var classPaintDeclarations = this._paintDeclarations[classes[i]];\n            if (classPaintDeclarations && classPaintDeclarations[name]) {\n                declaration = classPaintDeclarations[name];\n            }\n        }\n        this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop);\n    },\n\n    // update all zoom-dependent layout/paint values\n    recalculate: function(zoom, zoomHistory) {\n        for (var paintName in this._paintTransitions) {\n            this.paint[paintName] = this.getPaintValue(paintName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n        for (var layoutName in this._layoutFunctions) {\n            this.layout[layoutName] = this.getLayoutValue(layoutName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n    },\n\n    serialize: function(options) {\n        var output = {\n            'id': this.id,\n            'ref': this.ref,\n            'metadata': this.metadata,\n            'minzoom': this.minzoom,\n            'maxzoom': this.maxzoom\n        };\n\n        for (var klass in this._paintDeclarations) {\n            var key = klass === '' ? 'paint' : 'paint.' + klass;\n            output[key] = util.mapObject(this._paintDeclarations[klass], getDeclarationValue);\n        }\n\n        if (!this.ref || (options && options.includeRefProperties)) {\n            util.extend(output, {\n                'type': this.type,\n                'source': this.source,\n                'source-layer': this.sourceLayer,\n                'filter': this.filter,\n                'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue)\n            });\n        }\n\n        return util.filterObject(output, function(value, key) {\n            return value !== undefined && !(key === 'layout' && !Object.keys(value).length);\n        });\n    },\n\n    // set paint transition based on a given paint declaration\n    _applyPaintDeclaration: function (name, declaration, options, globalOptions, animationLoop) {\n        var oldTransition = options.transition ? this._paintTransitions[name] : undefined;\n        var spec = this._paintSpecifications[name];\n\n        if (declaration === null || declaration === undefined) {\n            declaration = new StyleDeclaration(spec, spec.default);\n        }\n\n        if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n        var transitionOptions = util.extend({\n            duration: 300,\n            delay: 0\n        }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX));\n\n        var newTransition = this._paintTransitions[name] =\n            new StyleTransition(spec, declaration, oldTransition, transitionOptions);\n\n        if (!newTransition.instant()) {\n            newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n        }\n        if (oldTransition) {\n            animationLoop.cancel(oldTransition.loopID);\n        }\n    },\n\n    // update layout value if it's constant, or mark it as zoom-dependent\n    _updateLayoutValue: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration && declaration.isFunction) {\n            this._layoutFunctions[name] = true;\n        } else {\n            delete this._layoutFunctions[name];\n            this.layout[name] = this.getLayoutValue(name);\n        }\n    },\n\n    _handleErrors: function(validate, key, name, value) {\n        return validateStyle.emitErrors(this, validate.call(validateStyle, {\n            key: key,\n            layerType: this.type,\n            objectKey: name,\n            value: value,\n            styleSpec: styleSpec,\n            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n            style: {glyphs: true, sprite: true}\n        }));\n    }\n});\n\nfunction getDeclarationValue(declaration) {\n    return declaration.value;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer.js\n// module id = 100\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar extend = require('../util/extend');\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n//   for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n//   high level object that needs to be descended into deeper or a simple\n//   scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n\nmodule.exports = function validate(options) {\n\n    var validateFunction = require('./validate_function');\n    var validateObject = require('./validate_object');\n    var VALIDATORS = {\n        '*': function() {\n            return [];\n        },\n        'array': require('./validate_array'),\n        'boolean': require('./validate_boolean'),\n        'number': require('./validate_number'),\n        'color': require('./validate_color'),\n        'constants': require('./validate_constants'),\n        'enum': require('./validate_enum'),\n        'filter': require('./validate_filter'),\n        'function': require('./validate_function'),\n        'layer': require('./validate_layer'),\n        'object': require('./validate_object'),\n        'source': require('./validate_source'),\n        'light': require('./validate_light'),\n        'string': require('./validate_string')\n    };\n\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (getType(value) === 'string' && value[0] === '@') {\n        if (styleSpec.$version > 7) {\n            return [new ValidationError(key, value, 'constants have been deprecated as of v8')];\n        }\n        if (!(value in style.constants)) {\n            return [new ValidationError(key, value, 'constant \"%s\" not found', value)];\n        }\n        options = extend({}, options, { value: style.constants[value] });\n    }\n\n    if (valueSpec.function && getType(value) === 'object') {\n        return validateFunction(options);\n\n    } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n        return VALIDATORS[valueSpec.type](options);\n\n    } else {\n        return validateObject(extend({}, options, {\n            valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n        }));\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate.js\n// module id = 101\n// module chunks = 0 1","'use strict';\n\n// Note: all \"sizes\" are measured in bytes\n\nvar assert = require('assert');\n\nmodule.exports = StructArrayType;\n\nvar viewTypes = {\n    'Int8': Int8Array,\n    'Uint8': Uint8Array,\n    'Uint8Clamped': Uint8ClampedArray,\n    'Int16': Int16Array,\n    'Uint16': Uint16Array,\n    'Int32': Int32Array,\n    'Uint32': Uint32Array,\n    'Float32': Float32Array,\n    'Float64': Float64Array\n};\n\n/**\n * @typedef StructMember\n * @private\n * @property {string} name\n * @property {string} type\n * @property {number} components\n */\n\nvar structArrayTypeCache = {};\n\n/**\n * `StructArrayType` is used to create new `StructArray` types.\n *\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like\n * an array of typed structs. A StructArray is comprised of elements. Each element has a set of\n * members that are defined when the `StructArrayType` is created.\n *\n * StructArrays useful for creating large arrays that:\n * - can be transferred from workers as a Transferable object\n * - can be copied cheaply\n * - use less memory for lower-precision members\n * - can be used as buffers in WebGL.\n *\n * @class StructArrayType\n * @param {Array.<StructMember>}\n * @param options\n * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1.\n *\n * @example\n *\n * var PointArrayType = new StructArrayType({\n *  members: [\n *      { type: 'Int16', name: 'x' },\n *      { type: 'Int16', name: 'y' }\n *  ]});\n *\n *  var pointArray = new PointArrayType();\n *  pointArray.emplaceBack(10, 15);\n *  pointArray.emplaceBack(20, 35);\n *\n *  point = pointArray.get(0);\n *  assert(point.x === 10);\n *  assert(point.y === 15);\n *\n * @private\n */\nfunction StructArrayType(options) {\n\n    var key = JSON.stringify(options);\n    if (structArrayTypeCache[key]) {\n        return structArrayTypeCache[key];\n    }\n\n    if (options.alignment === undefined) options.alignment = 1;\n\n    function StructType() {\n        Struct.apply(this, arguments);\n    }\n\n    StructType.prototype = Object.create(Struct.prototype);\n\n    var offset = 0;\n    var maxSize = 0;\n    var usedTypes = ['Uint8'];\n\n    StructType.prototype.members = options.members.map(function(member) {\n        member = {\n            name: member.name,\n            type: member.type,\n            components: member.components || 1\n        };\n\n        assert(member.name.length);\n        assert(member.type in viewTypes);\n\n        if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type);\n\n        var typeSize = sizeOf(member.type);\n        maxSize = Math.max(maxSize, typeSize);\n        member.offset = offset = align(offset, Math.max(options.alignment, typeSize));\n\n        for (var c = 0; c < member.components; c++) {\n            Object.defineProperty(StructType.prototype, member.name + (member.components === 1 ? '' : c), {\n                get: createGetter(member, c),\n                set: createSetter(member, c)\n            });\n        }\n\n        offset += typeSize * member.components;\n\n        return member;\n    });\n\n    StructType.prototype.alignment = options.alignment;\n    StructType.prototype.size = align(offset, Math.max(maxSize, options.alignment));\n\n    function StructArrayType() {\n        StructArray.apply(this, arguments);\n        this.members = StructType.prototype.members;\n    }\n\n    StructArrayType.serialize = serializeStructArrayType;\n\n    StructArrayType.prototype = Object.create(StructArray.prototype);\n    StructArrayType.prototype.StructType = StructType;\n    StructArrayType.prototype.bytesPerElement = StructType.prototype.size;\n    StructArrayType.prototype.emplaceBack = createEmplaceBack(StructType.prototype.members, StructType.prototype.size);\n    StructArrayType.prototype._usedTypes = usedTypes;\n\n\n    structArrayTypeCache[key] = StructArrayType;\n\n    return StructArrayType;\n}\n\n/**\n * Serialize the StructArray type. This serializes the *type* not an instance of the type.\n * @private\n */\nfunction serializeStructArrayType() {\n    return {\n        members: this.prototype.StructType.prototype.members,\n        alignment: this.prototype.StructType.prototype.alignment,\n        bytesPerElement: this.prototype.bytesPerElement\n    };\n}\n\n\nfunction align(offset, size) {\n    return Math.ceil(offset / size) * size;\n}\n\nfunction sizeOf(type) {\n    return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction getArrayViewName(type) {\n    return type.toLowerCase();\n}\n\n\n/*\n * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming\n * > elementIndex to i) (likely due to v8 inlining heuristics).\n * - lucaswoj\n */\nfunction createEmplaceBack(members, bytesPerElement) {\n    var usedTypeSizes = [];\n    var argNames = [];\n    var body = '' +\n    'var i = this.length;\\n' +\n    'this.resize(this.length + 1);\\n';\n\n    for (var m = 0; m < members.length; m++) {\n        var member = members[m];\n        var size = sizeOf(member.type);\n\n        if (usedTypeSizes.indexOf(size) < 0) {\n            usedTypeSizes.push(size);\n            body += 'var o' + size.toFixed(0) + ' = i * ' + (bytesPerElement / size).toFixed(0) + ';\\n';\n        }\n\n        for (var c = 0; c < member.components; c++) {\n            var argName = 'v' + argNames.length;\n            var index = 'o' + size.toFixed(0) + ' + ' + (member.offset / size + c).toFixed(0);\n            body += 'this.' + getArrayViewName(member.type) + '[' + index + '] = ' + argName + ';\\n';\n            argNames.push(argName);\n        }\n    }\n\n    body += 'return i;';\n\n    return new Function(argNames, body);\n}\n\nfunction createMemberComponentString(member, component) {\n    var elementOffset = 'this._pos' + sizeOf(member.type).toFixed(0);\n    var componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0);\n    var index = elementOffset + ' + ' + componentOffset;\n    return 'this._structArray.' + getArrayViewName(member.type) + '[' + index + ']';\n\n}\n\nfunction createGetter(member, c) {\n    return new Function([], 'return ' + createMemberComponentString(member, c) + ';');\n}\n\nfunction createSetter(member, c) {\n    return new Function(['x'], createMemberComponentString(member, c) + ' = x;');\n}\n\n/**\n * @class Struct\n * @param {StructArray} structArray The StructArray the struct is stored in\n * @param {number} index The index of the struct in the StructArray.\n * @private\n */\nfunction Struct(structArray, index) {\n    this._structArray = structArray;\n    this._pos1 = index * this.size;\n    this._pos2 = this._pos1 / 2;\n    this._pos4 = this._pos1 / 4;\n    this._pos8 = this._pos1 / 8;\n}\n\n/**\n * @class StructArray\n * The StructArray class is inherited by the custom StructArrayType classes created with\n * `new StructArrayType(members, options)`.\n * @private\n */\nfunction StructArray(serialized) {\n    if (serialized !== undefined) {\n    // Create from an serialized StructArray\n        this.arrayBuffer = serialized.arrayBuffer;\n        this.length = serialized.length;\n        this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement;\n        this._refreshViews();\n\n    // Create a new StructArray\n    } else {\n        this.capacity = -1;\n        this.resize(0);\n    }\n}\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.DEFAULT_CAPACITY = 128;\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.RESIZE_MULTIPLIER = 5;\n\n/**\n * Serialize this StructArray instance\n * @private\n */\nStructArray.prototype.serialize = function() {\n    this.trim();\n    return {\n        length: this.length,\n        arrayBuffer: this.arrayBuffer\n    };\n};\n\n/**\n * Return the Struct at the given location in the array.\n * @private\n * @param {number} index The index of the element.\n */\nStructArray.prototype.get = function(index) {\n    return new this.StructType(this, index);\n};\n\n/**\n * Resize the array to discard unused capacity.\n * @private\n */\nStructArray.prototype.trim = function() {\n    if (this.length !== this.capacity) {\n        this.capacity = this.length;\n        this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n        this._refreshViews();\n    }\n};\n\n/**\n * Resize the array.\n * If `n` is greater than the current length then additional elements with undefined values are added.\n * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n * @param {number} n The new size of the array.\n */\nStructArray.prototype.resize = function(n) {\n    this.length = n;\n    if (n > this.capacity) {\n        this.capacity = Math.max(n, Math.floor(this.capacity * this.RESIZE_MULTIPLIER), this.DEFAULT_CAPACITY);\n        this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n        var oldUint8Array = this.uint8;\n        this._refreshViews();\n        if (oldUint8Array) this.uint8.set(oldUint8Array);\n    }\n};\n\n/**\n * Create TypedArray views for the current ArrayBuffer.\n * @private\n */\nStructArray.prototype._refreshViews = function() {\n    for (var t = 0; t < this._usedTypes.length; t++) {\n        var type = this._usedTypes[t];\n        this[getArrayViewName(type)] = new viewTypes[type](this.arrayBuffer);\n    }\n};\n\n/**\n * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting\n * @param {number} startIndex\n * @param {number} endIndex\n * @private\n */\nStructArray.prototype.toArray = function(startIndex, endIndex) {\n    var array = [];\n\n    for (var i = startIndex; i < endIndex; i++) {\n        var struct = this.get(i);\n        array.push(struct);\n    }\n\n    return array;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/struct_array.js\n// module id = 102\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar StyleTransition = require('./style_transition');\nvar StyleDeclaration = require('./style_declaration');\nvar styleSpec = require('./style_spec');\nvar validateStyle = require('./validate_style');\nvar parseColor = require('./parse_color');\nvar Evented = require('../util/evented');\n\nmodule.exports = StyleLayer;\n\nvar TRANSITION_SUFFIX = '-transition';\n\nStyleLayer.create = function(layer, refLayer) {\n    var Classes = {\n        background: require('./style_layer/background_style_layer'),\n        circle: require('./style_layer/circle_style_layer'),\n        fill: require('./style_layer/fill_style_layer'),\n        line: require('./style_layer/line_style_layer'),\n        raster: require('./style_layer/raster_style_layer'),\n        symbol: require('./style_layer/symbol_style_layer')\n    };\n    return new Classes[(refLayer || layer).type](layer, refLayer);\n};\n\nfunction StyleLayer(layer, refLayer) {\n    this.set(layer, refLayer);\n}\n\nStyleLayer.prototype = util.inherit(Evented, {\n\n    set: function(layer, refLayer) {\n        this.id = layer.id;\n        this.ref = layer.ref;\n        this.metadata = layer.metadata;\n        this.type = (refLayer || layer).type;\n        this.source = (refLayer || layer).source;\n        this.sourceLayer = (refLayer || layer)['source-layer'];\n        this.minzoom = (refLayer || layer).minzoom;\n        this.maxzoom = (refLayer || layer).maxzoom;\n        this.filter = (refLayer || layer).filter;\n\n        this.paint = {};\n        this.layout = {};\n\n        this._paintSpecifications = styleSpec['paint_' + this.type];\n        this._layoutSpecifications = styleSpec['layout_' + this.type];\n\n        this._paintTransitions = {}; // {[propertyName]: StyleTransition}\n        this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}}\n        this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}}\n        this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration}\n        this._layoutFunctions = {}; // {[propertyName]: Boolean}\n\n        var paintName, layoutName;\n\n        // Resolve paint declarations\n        for (var key in layer) {\n            var match = key.match(/^paint(?:\\.(.*))?$/);\n            if (match) {\n                var klass = match[1] || '';\n                for (paintName in layer[key]) {\n                    this.setPaintProperty(paintName, layer[key][paintName], klass);\n                }\n            }\n        }\n\n        // Resolve layout declarations\n        if (this.ref) {\n            this._layoutDeclarations = refLayer._layoutDeclarations;\n        } else {\n            for (layoutName in layer.layout) {\n                this.setLayoutProperty(layoutName, layer.layout[layoutName]);\n            }\n        }\n\n        // set initial layout/paint values\n        for (paintName in this._paintSpecifications) {\n            this.paint[paintName] = this.getPaintValue(paintName);\n        }\n        for (layoutName in this._layoutSpecifications) {\n            this._updateLayoutValue(layoutName);\n        }\n    },\n\n    setLayoutProperty: function(name, value) {\n\n        if (value == null) {\n            delete this._layoutDeclarations[name];\n        } else {\n            var key = 'layers.' + this.id + '.layout.' + name;\n            if (this._handleErrors(validateStyle.layoutProperty, key, name, value)) return;\n            this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value);\n        }\n        this._updateLayoutValue(name);\n    },\n\n    getLayoutProperty: function(name) {\n        return (\n            this._layoutDeclarations[name] &&\n            this._layoutDeclarations[name].value\n        );\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        var specification = this._layoutSpecifications[name];\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.calculate(globalProperties, featureProperties);\n        } else {\n            return specification.default;\n        }\n    },\n\n    setPaintProperty: function(name, value, klass) {\n        var validateStyleKey = 'layers.' + this.id + (klass ? '[\"paint.' + klass + '\"].' : '.paint.') + name;\n\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            if (!this._paintTransitionOptions[klass || '']) {\n                this._paintTransitionOptions[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintTransitionOptions[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintTransitionOptions[klass || ''][name] = value;\n            }\n        } else {\n            if (!this._paintDeclarations[klass || '']) {\n                this._paintDeclarations[klass || ''] = {};\n            }\n            if (value === null || value === undefined) {\n                delete this._paintDeclarations[klass || ''][name];\n            } else {\n                if (this._handleErrors(validateStyle.paintProperty, validateStyleKey, name, value)) return;\n                this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value);\n            }\n        }\n    },\n\n    getPaintProperty: function(name, klass) {\n        klass = klass || '';\n        if (util.endsWith(name, TRANSITION_SUFFIX)) {\n            return (\n                this._paintTransitionOptions[klass] &&\n                this._paintTransitionOptions[klass][name]\n            );\n        } else {\n            return (\n                this._paintDeclarations[klass] &&\n                this._paintDeclarations[klass][name] &&\n                this._paintDeclarations[klass][name].value\n            );\n        }\n    },\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var specification = this._paintSpecifications[name];\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.calculate(globalProperties, featureProperties);\n        } else if (specification.type === 'color' && specification.default) {\n            return parseColor(specification.default);\n        } else {\n            return specification.default;\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        var transition = this._paintTransitions[name];\n        if (transition) {\n            return transition.declaration.stopZoomLevels;\n        } else {\n            return [];\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        var transition = this._paintTransitions[name];\n        return transition.declaration.calculateInterpolationT({ zoom: zoom });\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isLayoutValueFeatureConstant: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration) {\n            return declaration.isFeatureConstant;\n        } else {\n            return true;\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        var transition = this._paintTransitions[name];\n\n        if (transition) {\n            return transition.declaration.isZoomConstant;\n        } else {\n            return true;\n        }\n    },\n\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n        if (this.isPaintValueFeatureConstant(this.type + '-opacity') && this.paint[this.type + '-opacity'] === 0) return true;\n        if (this.isPaintValueFeatureConstant(this.type + '-color') && this.paint[this.type + '-color'] && this.paint[this.type + '-color'][3] === 0) return true;\n\n        return false;\n    },\n\n    updatePaintTransitions: function(classes, options, globalOptions, animationLoop) {\n        var declarations = util.extend({}, this._paintDeclarations['']);\n        for (var i = 0; i < classes.length; i++) {\n            util.extend(declarations, this._paintDeclarations[classes[i]]);\n        }\n\n        var name;\n        for (name in declarations) { // apply new declarations\n            this._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop);\n        }\n        for (name in this._paintTransitions) {\n            if (!(name in declarations)) // apply removed declarations\n                this._applyPaintDeclaration(name, null, options, globalOptions, animationLoop);\n        }\n    },\n\n    updatePaintTransition: function(name, classes, options, globalOptions, animationLoop) {\n        var declaration = this._paintDeclarations[''][name];\n        for (var i = 0; i < classes.length; i++) {\n            var classPaintDeclarations = this._paintDeclarations[classes[i]];\n            if (classPaintDeclarations && classPaintDeclarations[name]) {\n                declaration = classPaintDeclarations[name];\n            }\n        }\n        this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop);\n    },\n\n    // update all zoom-dependent layout/paint values\n    recalculate: function(zoom, zoomHistory) {\n        for (var paintName in this._paintTransitions) {\n            this.paint[paintName] = this.getPaintValue(paintName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n        for (var layoutName in this._layoutFunctions) {\n            this.layout[layoutName] = this.getLayoutValue(layoutName, {zoom: zoom, zoomHistory: zoomHistory});\n        }\n    },\n\n    serialize: function(options) {\n        var output = {\n            'id': this.id,\n            'ref': this.ref,\n            'metadata': this.metadata,\n            'minzoom': this.minzoom,\n            'maxzoom': this.maxzoom\n        };\n\n        for (var klass in this._paintDeclarations) {\n            var key = klass === '' ? 'paint' : 'paint.' + klass;\n            output[key] = util.mapObject(this._paintDeclarations[klass], getDeclarationValue);\n        }\n\n        if (!this.ref || (options && options.includeRefProperties)) {\n            util.extend(output, {\n                'type': this.type,\n                'source': this.source,\n                'source-layer': this.sourceLayer,\n                'filter': this.filter,\n                'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue)\n            });\n        }\n\n        return util.filterObject(output, function(value, key) {\n            return value !== undefined && !(key === 'layout' && !Object.keys(value).length);\n        });\n    },\n\n    // set paint transition based on a given paint declaration\n    _applyPaintDeclaration: function (name, declaration, options, globalOptions, animationLoop) {\n        var oldTransition = options.transition ? this._paintTransitions[name] : undefined;\n        var spec = this._paintSpecifications[name];\n\n        if (declaration === null || declaration === undefined) {\n            declaration = new StyleDeclaration(spec, spec.default);\n        }\n\n        if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n        var transitionOptions = util.extend({\n            duration: 300,\n            delay: 0\n        }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX));\n\n        var newTransition = this._paintTransitions[name] =\n            new StyleTransition(spec, declaration, oldTransition, transitionOptions);\n\n        if (!newTransition.instant()) {\n            newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n        }\n        if (oldTransition) {\n            animationLoop.cancel(oldTransition.loopID);\n        }\n    },\n\n    // update layout value if it's constant, or mark it as zoom-dependent\n    _updateLayoutValue: function(name) {\n        var declaration = this._layoutDeclarations[name];\n\n        if (declaration && declaration.isFunction) {\n            this._layoutFunctions[name] = true;\n        } else {\n            delete this._layoutFunctions[name];\n            this.layout[name] = this.getLayoutValue(name);\n        }\n    },\n\n    _handleErrors: function(validate, key, name, value) {\n        return validateStyle.emitErrors(this, validate.call(validateStyle, {\n            key: key,\n            layerType: this.type,\n            objectKey: name,\n            value: value,\n            styleSpec: styleSpec,\n            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n            style: {glyphs: true, sprite: true}\n        }));\n    }\n});\n\nfunction getDeclarationValue(declaration) {\n    return declaration.value;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer.js\n// module id = 103\n// module chunks = 0 1","'use strict';\n\n// Note: all \"sizes\" are measured in bytes\n\nvar assert = require('assert');\n\nmodule.exports = StructArrayType;\n\nvar viewTypes = {\n    'Int8': Int8Array,\n    'Uint8': Uint8Array,\n    'Uint8Clamped': Uint8ClampedArray,\n    'Int16': Int16Array,\n    'Uint16': Uint16Array,\n    'Int32': Int32Array,\n    'Uint32': Uint32Array,\n    'Float32': Float32Array,\n    'Float64': Float64Array\n};\n\n/**\n * @typedef StructMember\n * @private\n * @property {string} name\n * @property {string} type\n * @property {number} components\n */\n\nvar structArrayTypeCache = {};\n\n/**\n * `StructArrayType` is used to create new `StructArray` types.\n *\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like\n * an array of typed structs. A StructArray is comprised of elements. Each element has a set of\n * members that are defined when the `StructArrayType` is created.\n *\n * StructArrays useful for creating large arrays that:\n * - can be transferred from workers as a Transferable object\n * - can be copied cheaply\n * - use less memory for lower-precision members\n * - can be used as buffers in WebGL.\n *\n * @class StructArrayType\n * @param {Array.<StructMember>}\n * @param options\n * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1.\n *\n * @example\n *\n * var PointArrayType = new StructArrayType({\n *  members: [\n *      { type: 'Int16', name: 'x' },\n *      { type: 'Int16', name: 'y' }\n *  ]});\n *\n *  var pointArray = new PointArrayType();\n *  pointArray.emplaceBack(10, 15);\n *  pointArray.emplaceBack(20, 35);\n *\n *  point = pointArray.get(0);\n *  assert(point.x === 10);\n *  assert(point.y === 15);\n *\n * @private\n */\nfunction StructArrayType(options) {\n\n    var key = JSON.stringify(options);\n    if (structArrayTypeCache[key]) {\n        return structArrayTypeCache[key];\n    }\n\n    if (options.alignment === undefined) options.alignment = 1;\n\n    function StructType() {\n        Struct.apply(this, arguments);\n    }\n\n    StructType.prototype = Object.create(Struct.prototype);\n\n    var offset = 0;\n    var maxSize = 0;\n    var usedTypes = ['Uint8'];\n\n    StructType.prototype.members = options.members.map(function(member) {\n        member = {\n            name: member.name,\n            type: member.type,\n            components: member.components || 1\n        };\n\n        assert(member.name.length);\n        assert(member.type in viewTypes);\n\n        if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type);\n\n        var typeSize = sizeOf(member.type);\n        maxSize = Math.max(maxSize, typeSize);\n        member.offset = offset = align(offset, Math.max(options.alignment, typeSize));\n\n        for (var c = 0; c < member.components; c++) {\n            Object.defineProperty(StructType.prototype, member.name + (member.components === 1 ? '' : c), {\n                get: createGetter(member, c),\n                set: createSetter(member, c)\n            });\n        }\n\n        offset += typeSize * member.components;\n\n        return member;\n    });\n\n    StructType.prototype.alignment = options.alignment;\n    StructType.prototype.size = align(offset, Math.max(maxSize, options.alignment));\n\n    function StructArrayType() {\n        StructArray.apply(this, arguments);\n        this.members = StructType.prototype.members;\n    }\n\n    StructArrayType.serialize = serializeStructArrayType;\n\n    StructArrayType.prototype = Object.create(StructArray.prototype);\n    StructArrayType.prototype.StructType = StructType;\n    StructArrayType.prototype.bytesPerElement = StructType.prototype.size;\n    StructArrayType.prototype.emplaceBack = createEmplaceBack(StructType.prototype.members, StructType.prototype.size);\n    StructArrayType.prototype._usedTypes = usedTypes;\n\n\n    structArrayTypeCache[key] = StructArrayType;\n\n    return StructArrayType;\n}\n\n/**\n * Serialize the StructArray type. This serializes the *type* not an instance of the type.\n * @private\n */\nfunction serializeStructArrayType() {\n    return {\n        members: this.prototype.StructType.prototype.members,\n        alignment: this.prototype.StructType.prototype.alignment,\n        bytesPerElement: this.prototype.bytesPerElement\n    };\n}\n\n\nfunction align(offset, size) {\n    return Math.ceil(offset / size) * size;\n}\n\nfunction sizeOf(type) {\n    return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction getArrayViewName(type) {\n    return type.toLowerCase();\n}\n\n\n/*\n * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming\n * > elementIndex to i) (likely due to v8 inlining heuristics).\n * - lucaswoj\n */\nfunction createEmplaceBack(members, bytesPerElement) {\n    var usedTypeSizes = [];\n    var argNames = [];\n    var body = '' +\n    'var i = this.length;\\n' +\n    'this.resize(this.length + 1);\\n';\n\n    for (var m = 0; m < members.length; m++) {\n        var member = members[m];\n        var size = sizeOf(member.type);\n\n        // array offsets to the end of current data for each type size\n        // var o{SIZE} = i * ROUNDED(bytesPerElement / size);\n        if (usedTypeSizes.indexOf(size) < 0) {\n            usedTypeSizes.push(size);\n            body += 'var o' + size.toFixed(0) + ' = i * ' + (bytesPerElement / size).toFixed(0) + ';\\n';\n        }\n\n        for (var c = 0; c < member.components; c++) {\n            // arguments v0, v1, v2, ... are, in order, the components of\n            // member 0, then the components of member 1, etc.\n            var argName = 'v' + argNames.length;\n            // The index for `member` component `c` into the appropriate type array is:\n            // this.{TYPE}[o{SIZE} + MEMBER_OFFSET + {c}] = v{X}\n            // where MEMBER_OFFSET = ROUND(member.offset / size) is the per-element\n            // offset of this member into the array\n            var index = 'o' + size.toFixed(0) + ' + ' + (member.offset / size + c).toFixed(0);\n            body += 'this.' + getArrayViewName(member.type) + '[' + index + '] = ' + argName + ';\\n';\n            argNames.push(argName);\n        }\n    }\n\n    body += 'return i;';\n\n    return new Function(argNames, body);\n}\n\nfunction createMemberComponentString(member, component) {\n    var elementOffset = 'this._pos' + sizeOf(member.type).toFixed(0);\n    var componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0);\n    var index = elementOffset + ' + ' + componentOffset;\n    return 'this._structArray.' + getArrayViewName(member.type) + '[' + index + ']';\n\n}\n\nfunction createGetter(member, c) {\n    return new Function([], 'return ' + createMemberComponentString(member, c) + ';');\n}\n\nfunction createSetter(member, c) {\n    return new Function(['x'], createMemberComponentString(member, c) + ' = x;');\n}\n\n/**\n * @class Struct\n * @param {StructArray} structArray The StructArray the struct is stored in\n * @param {number} index The index of the struct in the StructArray.\n * @private\n */\nfunction Struct(structArray, index) {\n    this._structArray = structArray;\n    this._pos1 = index * this.size;\n    this._pos2 = this._pos1 / 2;\n    this._pos4 = this._pos1 / 4;\n    this._pos8 = this._pos1 / 8;\n}\n\n/**\n * @class StructArray\n * The StructArray class is inherited by the custom StructArrayType classes created with\n * `new StructArrayType(members, options)`.\n * @private\n */\nfunction StructArray(serialized) {\n    if (serialized !== undefined) {\n    // Create from an serialized StructArray\n        this.arrayBuffer = serialized.arrayBuffer;\n        this.length = serialized.length;\n        this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement;\n        this._refreshViews();\n\n    // Create a new StructArray\n    } else {\n        this.capacity = -1;\n        this.resize(0);\n    }\n}\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.DEFAULT_CAPACITY = 128;\n\n/**\n * @property {number}\n * @private\n * @readonly\n */\nStructArray.prototype.RESIZE_MULTIPLIER = 5;\n\n/**\n * Serialize this StructArray instance\n * @private\n */\nStructArray.prototype.serialize = function() {\n    this.trim();\n    return {\n        length: this.length,\n        arrayBuffer: this.arrayBuffer\n    };\n};\n\n/**\n * Return the Struct at the given location in the array.\n * @private\n * @param {number} index The index of the element.\n */\nStructArray.prototype.get = function(index) {\n    return new this.StructType(this, index);\n};\n\n/**\n * Resize the array to discard unused capacity.\n * @private\n */\nStructArray.prototype.trim = function() {\n    if (this.length !== this.capacity) {\n        this.capacity = this.length;\n        this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n        this._refreshViews();\n    }\n};\n\n/**\n * Resize the array.\n * If `n` is greater than the current length then additional elements with undefined values are added.\n * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n * @param {number} n The new size of the array.\n */\nStructArray.prototype.resize = function(n) {\n    this.length = n;\n    if (n > this.capacity) {\n        this.capacity = Math.max(n, Math.floor(this.capacity * this.RESIZE_MULTIPLIER), this.DEFAULT_CAPACITY);\n        this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n        var oldUint8Array = this.uint8;\n        this._refreshViews();\n        if (oldUint8Array) this.uint8.set(oldUint8Array);\n    }\n};\n\n/**\n * Create TypedArray views for the current ArrayBuffer.\n * @private\n */\nStructArray.prototype._refreshViews = function() {\n    for (var t = 0; t < this._usedTypes.length; t++) {\n        var type = this._usedTypes[t];\n        this[getArrayViewName(type)] = new viewTypes[type](this.arrayBuffer);\n    }\n};\n\n/**\n * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting\n * @param {number} startIndex\n * @param {number} endIndex\n * @private\n */\nStructArray.prototype.toArray = function(startIndex, endIndex) {\n    var array = [];\n\n    for (var i = startIndex; i < endIndex; i++) {\n        var struct = this.get(i);\n        array.push(struct);\n    }\n\n    return array;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/struct_array.js\n// module id = 104\n// module chunks = 0 1","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js\n// module id = 105\n// module chunks = 0 1","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js\n// module id = 106\n// module chunks = 0 1","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js\n// module id = 107\n// module chunks = 0 1","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js\n// module id = 108\n// module chunks = 0 1","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js\n// module id = 109\n// module chunks = 0 1","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js\n// module id = 110\n// module chunks = 0 1","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js\n// module id = 111\n// module chunks = 0 1","module.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js\n// module id = 112\n// module chunks = 0 1","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js\n// module id = 113\n// module chunks = 0 1","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js\n// module id = 114\n// module chunks = 0 1","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js\n// module id = 115\n// module chunks = 0 1","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = 116\n// module chunks = 0 1","\"use strict\";\n\nvar analytics = {};\nvar injectRavenPayload;\nvar handleDispatcherAction;\nvar lastKnownActionPayload = null;\n\nvar ga = require('./ga');\nvar heap = require('./heap');\nvar type = require('./type');\nvar Raven = require('raven-js');\nvar uuid = require('simply-uuid');\nvar location = require('./location');\nvar assign = require('object-assign');\nvar Dispatcher = require('@opengov/og_flux').Dispatcher;\n\nvar subdomains = location.hostname.split('.');\nvar baseDomain = subdomains.slice(1).join('.');\n\nvar defaults = {\n  role: null,\n  userId: null,\n  ravenDSN: '',\n  RavenConfig: {},\n  userEntityId: null,\n  webPropertyId: null\n};\n\nanalytics.initialize = function (options) {\n\n  if (analytics.didInitialize) {\n    throw new Error('Analytics has already initialized');\n  }\n\n  var config = {};\n  analytics.didInitialize = true;\n  ga.initialize();\n\n  config = assign(config, defaults, options);\n\n  if (window.gon) {\n    config.role = gon.role || config.role;\n    config.userId = gon.userId || config.userId;\n    config.ravenDSN = gon.ravenDSN || config.ravenDSN;\n    config.userEntityId = gon.userEntityId || config.userEntityId;\n    config.webPropertyId = gon.gaPropertyId || config.webPropertyId;\n    config.heapProjectId = gon.heapProjectId || config.heapProjectId;\n  }\n\n  analytics.config = config;\n  analytics.pageId = uuid.generate();\n\n  analytics.Raven = Raven;\n  window.Raven = Raven;\n\n  analytics.Raven.config(config.ravenDSN, assign({ dataCallback: injectRavenPayload }, config.RavenConfig)).install();\n\n  Dispatcher.register(handleDispatcherAction);\n  heap.initialize(config.heapProjectId);\n\n  analytics.ga('create', config.webPropertyId);\n  analytics.setUserId(config.userId);\n  analytics.setEntityId(config.userEntityId);\n  analytics.setRole(config.role);\n  analytics.setSubdomain(subdomains[0]);\n  analytics.setBaseDomain(baseDomain);\n  analytics.ga('send', 'pageview');\n};\n\nanalytics.updateSentryUser = function (user) {\n\n  var defaults = {\n    role: analytics.config.role,\n    id: analytics.config.userId\n  };\n  // setUser is Removed/Deprecated in 1.1.16, but npm doesn't have the updated version\n  var ravenUserSetter = analytics.Raven.setUserContext ? analytics.Raven.setUserContext : analytics.Raven.setUser;\n\n  ravenUserSetter(assign(defaults, user || {}));\n};\n\nanalytics.ga = function () {\n\n  if (analytics.config.webPropertyId) {\n    ga.ga.apply(window, arguments);\n  }\n};\n\n/**\n * pushes an event to google analytics\n *\n * @deprecated\n * @param category\n * @param action\n * @param label\n * @param value\n */\nanalytics.pushEvent = function (category, action, label, value) {\n  analytics.ga('send', 'event', category, action, label, value);\n};\n\n/**\n * pushes a page view to both google analytics\n *\n * @param url\n */\nanalytics.pushPageView = function (url) {\n  analytics.ga('send', 'pageview', url);\n};\n\nanalytics.setReportId = function (reportId) {\n  analytics.ga('set', 'dimension6', reportId);\n};\n\nanalytics.setUserId = function (userId) {\n  analytics.config.userId = userId;\n  analytics.ga('set', '&uid', userId);\n  analytics.ga('set', 'dimension1', userId);\n  analytics.updateSentryUser();\n};\n\nanalytics.setEntityId = function (entityId) {\n  analytics.config.entityId = entityId;\n  analytics.ga('set', 'dimension2', entityId);\n};\n\nanalytics.setSubdomain = function (subdomain) {\n  analytics.ga('set', 'dimension3', subdomain);\n};\n\nanalytics.setRole = function (role) {\n  analytics.config.role = role;\n  analytics.ga('set', 'dimension4', role);\n  analytics.updateSentryUser();\n};\n\nanalytics.setBaseDomain = function (baseDomain) {\n  analytics.ga('set', 'dimension5', baseDomain);\n};\n\n/**\n * extracts primitive data from the dispatcher payload\n *\n * @param payload\n */\nhandleDispatcherAction = function handleDispatcherAction(payload) {\n  var actionPayload = {};\n  var action = payload.action;\n\n  var serialize = function serialize(value) {\n\n    var isPrimitive = type.isUndefined(value) || type.isNull(value) || type.isBoolean(value) || type.isNumber(value) || type.isString(value);\n\n    if (isPrimitive) {\n      return value;\n    } else if (type.isObject(value) || type.isArray(value)) {\n      return value && value.id ? '_id:' + value.id : '[object Object]';\n    }\n  };\n\n  for (var key in action) {\n    if (action.hasOwnProperty(key)) {\n\n      var value = action[key];\n\n      if (type.isArray(value)) {\n        var more = value.length - 3;\n        actionPayload[key] = value.map(serialize).slice(0, 3);\n        actionPayload[key].push('...' + (more > 0 ? more : 0) + ' more');\n      } else {\n        actionPayload[key] = serialize(value);\n      }\n    }\n  }\n\n  lastKnownActionPayload = actionPayload;\n};\n\n/**\n * Injects the raven payload on every request with\n * analytics data using the 'extra' field\n *\n * @param payload\n * @returns {*}\n */\ninjectRavenPayload = function injectRavenPayload(payload) {\n\n  var defaults = {\n    lastAction: lastKnownActionPayload,\n    isDispatching: Dispatcher.isDispatching(),\n    userId: analytics.config.userId,\n    pageId: analytics.pageId\n  };\n\n  payload.event_id = uuid.generate().replace(/-/g, '');\n  payload.extra = assign({}, defaults, payload.extra);\n\n  return payload;\n};\n\nmodule.exports = analytics;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/lib/analytics.js\n// module id = 117\n// module chunks = 0 1","'use strict';\n\nvar invariant = require('invariant');\nvar canUseDOM = require('can-use-dom');\n\nvar History = {\n\n  /**\n   * The current number of entries in the history.\n   *\n   * Note: This property is read-only.\n   */\n  length: 1,\n\n  /**\n   * Sends the browser back one entry in the history.\n   */\n  back: function back() {\n    invariant(canUseDOM, 'Cannot use History.back without a DOM');\n\n    // Do this first so that History.length will\n    // be accurate in location change listeners.\n    History.length -= 1;\n\n    window.history.back();\n  }\n\n};\n\nmodule.exports = History;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/History.js\n// module id = 118\n// module chunks = 0 1","const basePath = gon.asset_path || '';\nconst assetManifest = gon.asset_manifest;\n\nexport function assetPath(assetName) {\n  if (assetManifest) {\n    assetName = assetManifest[assetName];\n  }\n  return `${ basePath }/${ assetName }`;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/asset_helpers.ts","import _ from 'lodash';\n\nimport { AllMapDataTypes } from '../maps/map_constants';\n\nexport function getAmountExtractorFor(schema) {\n  const amountColumn = schema.get('amountColumn');\n  return d => d[amountColumn];\n}\n\nexport function createValueExtractorForType(schema, type) {\n  const columns = schema.get('columns');\n  const column = columns.find(c => c.get('type') == type);\n\n  return r => r && r[column.get('name')] && parseFloat(r[column.get('name')]);\n}\n\nexport function findColumnByName(schema, columnName) {\n  return schema.get('columns').find((c) => c.get('name') === columnName);\n}\n\nexport function getColumnTypeByName(schema, columnName) {\n  const column = findColumnByName(schema, columnName);\n  return column ? column.get('type') : null;\n}\n\nexport function hasMapColumns(schema) {\n  return schema.get('columns').some(column => _.includes(AllMapDataTypes, column.get('type')));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/schema_utils.ts","\n/**\n * Returns a call to the Intercom Api registering a tracked event.\n * @param   {String} eventName       The name of the event to be tracked. Preferably of the format: 'update-report'.\n * @param   {Object} event metadata to be passed along with the tracked event\n */\nexport const trackIntercomEvent = (eventName, eventMetadata?) => (\n  (window as any).Intercom && (window as any).Intercom('trackEvent', eventName, eventMetadata)\n);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/intercom_utils.ts","'use strict';\n\nvar config = require('./config');\nvar browser = require('./browser');\n\nfunction normalizeURL(url, pathPrefix, accessToken) {\n    accessToken = accessToken || config.ACCESS_TOKEN;\n\n    if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {\n        throw new Error('An API access token is required to use Mapbox GL. ' +\n            'See https://www.mapbox.com/developers/api/#access-tokens');\n    }\n\n    url = url.replace(/^mapbox:\\/\\//, config.API_URL + pathPrefix);\n    url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';\n\n    if (config.REQUIRE_ACCESS_TOKEN) {\n        if (accessToken[0] === 's') {\n            throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +\n                'See https://www.mapbox.com/developers/api/#access-tokens');\n        }\n\n        url += accessToken;\n    }\n\n    return url;\n}\n\nmodule.exports.normalizeStyleURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\/styles\\//))\n        return url;\n\n    var split = url.split('/');\n    var user = split[3];\n    var style = split[4];\n    var draft = split[5] ? '/draft' : '';\n    return normalizeURL('mapbox://' + user + '/' + style + draft, '/styles/v1/', accessToken);\n};\n\nmodule.exports.normalizeSourceURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\//))\n        return url;\n\n    // TileJSON requests need a secure flag appended to their URLs so\n    // that the server knows to send SSL-ified resource references.\n    return normalizeURL(url + '.json', '/v4/', accessToken) + '&secure';\n};\n\nmodule.exports.normalizeGlyphsURL = function(url, accessToken) {\n    if (!url.match(/^mapbox:\\/\\//))\n        return url;\n\n    var user = url.split('/')[3];\n    return normalizeURL('mapbox://' + user + '/{fontstack}/{range}.pbf', '/fonts/v1/', accessToken);\n};\n\nmodule.exports.normalizeSpriteURL = function(url, format, ext, accessToken) {\n    if (!url.match(/^mapbox:\\/\\/sprites\\//))\n        return url + format + ext;\n\n    var split = url.split('/');\n    var user = split[3];\n    var style = split[4];\n    var draft = split[5] ? '/draft' : '';\n    return normalizeURL('mapbox://' + user + '/' + style + draft + '/sprite' + format + ext, '/styles/v1/', accessToken);\n};\n\nmodule.exports.normalizeTileURL = function(url, sourceUrl, tileSize) {\n    if (!sourceUrl || !sourceUrl.match(/^mapbox:\\/\\//))\n        return url;\n\n    // The v4 mapbox tile API supports 512x512 image tiles only when @2x\n    // is appended to the tile URL. If `tileSize: 512` is specified for\n    // a Mapbox raster source force the @2x suffix even if a non hidpi\n    // device.\n    url = url.replace(/([?&]access_token=)tk\\.[^&]+/, '$1' + config.ACCESS_TOKEN);\n    var extension = browser.supportsWebp ? 'webp' : '$1';\n    return url.replace(/\\.((?:png|jpg)\\d*)(?=$|\\?)/, browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x.' + extension : '.' + extension);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/mapbox.js\n// module id = 122\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Pbf;\n\nvar Buffer = global.Buffer || require('./buffer');\n\nfunction Pbf(buf) {\n    this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf;\n    this.pos = 0;\n    this.length = this.buf.length;\n}\n\nPbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\nPbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32,\n    POW_2_63 = Math.pow(2, 63);\n\nPbf.prototype = {\n\n    destroy: function() {\n        this.buf = null;\n    },\n\n    // === READING =================================================================\n\n    readFields: function(readField, result, end) {\n        end = end || this.length;\n\n        while (this.pos < end) {\n            var val = this.readVarint(),\n                tag = val >> 3,\n                startPos = this.pos;\n\n            readField(tag, result, this);\n\n            if (this.pos === startPos) this.skip(val);\n        }\n        return result;\n    },\n\n    readMessage: function(readField, result) {\n        return this.readFields(readField, result, this.readVarint() + this.pos);\n    },\n\n    readFixed32: function() {\n        var val = this.buf.readUInt32LE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    readSFixed32: function() {\n        var val = this.buf.readInt32LE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n    readFixed64: function() {\n        var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readSFixed64: function() {\n        var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    },\n\n    readFloat: function() {\n        var val = this.buf.readFloatLE(this.pos);\n        this.pos += 4;\n        return val;\n    },\n\n    readDouble: function() {\n        var val = this.buf.readDoubleLE(this.pos);\n        this.pos += 8;\n        return val;\n    },\n\n    readVarint: function() {\n        var buf = this.buf,\n            val, b;\n\n        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;\n\n        return readVarintRemainder(val, this);\n    },\n\n    readVarint64: function() {\n        var startPos = this.pos,\n            val = this.readVarint();\n\n        if (val < POW_2_63) return val;\n\n        var pos = this.pos - 2;\n        while (this.buf[pos] === 0xff) pos--;\n        if (pos < startPos) pos = startPos;\n\n        val = 0;\n        for (var i = 0; i < pos - startPos + 1; i++) {\n            var b = ~this.buf[startPos + i] & 0x7f;\n            val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7);\n        }\n\n        return -val - 1;\n    },\n\n    readSVarint: function() {\n        var num = this.readVarint();\n        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n    },\n\n    readBoolean: function() {\n        return Boolean(this.readVarint());\n    },\n\n    readString: function() {\n        var end = this.readVarint() + this.pos,\n            str = this.buf.toString('utf8', this.pos, end);\n        this.pos = end;\n        return str;\n    },\n\n    readBytes: function() {\n        var end = this.readVarint() + this.pos,\n            buffer = this.buf.slice(this.pos, end);\n        this.pos = end;\n        return buffer;\n    },\n\n    // verbose for performance reasons; doesn't affect gzipped size\n\n    readPackedVarint: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readVarint());\n        return arr;\n    },\n    readPackedSVarint: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSVarint());\n        return arr;\n    },\n    readPackedBoolean: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readBoolean());\n        return arr;\n    },\n    readPackedFloat: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFloat());\n        return arr;\n    },\n    readPackedDouble: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readDouble());\n        return arr;\n    },\n    readPackedFixed32: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFixed32());\n        return arr;\n    },\n    readPackedSFixed32: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSFixed32());\n        return arr;\n    },\n    readPackedFixed64: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readFixed64());\n        return arr;\n    },\n    readPackedSFixed64: function() {\n        var end = this.readVarint() + this.pos, arr = [];\n        while (this.pos < end) arr.push(this.readSFixed64());\n        return arr;\n    },\n\n    skip: function(val) {\n        var type = val & 0x7;\n        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}\n        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;\n        else if (type === Pbf.Fixed32) this.pos += 4;\n        else if (type === Pbf.Fixed64) this.pos += 8;\n        else throw new Error('Unimplemented type: ' + type);\n    },\n\n    // === WRITING =================================================================\n\n    writeTag: function(tag, type) {\n        this.writeVarint((tag << 3) | type);\n    },\n\n    realloc: function(min) {\n        var length = this.length || 16;\n\n        while (length < this.pos + min) length *= 2;\n\n        if (length !== this.length) {\n            var buf = new Buffer(length);\n            this.buf.copy(buf);\n            this.buf = buf;\n            this.length = length;\n        }\n    },\n\n    finish: function() {\n        this.length = this.pos;\n        this.pos = 0;\n        return this.buf.slice(0, this.length);\n    },\n\n    writeFixed32: function(val) {\n        this.realloc(4);\n        this.buf.writeUInt32LE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeSFixed32: function(val) {\n        this.realloc(4);\n        this.buf.writeInt32LE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeFixed64: function(val) {\n        this.realloc(8);\n        this.buf.writeInt32LE(val & -1, this.pos);\n        this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeSFixed64: function(val) {\n        this.realloc(8);\n        this.buf.writeInt32LE(val & -1, this.pos);\n        this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n        this.pos += 8;\n    },\n\n    writeVarint: function(val) {\n        val = +val;\n\n        if (val > 0xfffffff) {\n            writeBigVarint(val, this);\n            return;\n        }\n\n        this.realloc(4);\n\n        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] =   (val >>> 7) & 0x7f;\n    },\n\n    writeSVarint: function(val) {\n        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n    },\n\n    writeBoolean: function(val) {\n        this.writeVarint(Boolean(val));\n    },\n\n    writeString: function(str) {\n        str = String(str);\n        var bytes = Buffer.byteLength(str);\n        this.writeVarint(bytes);\n        this.realloc(bytes);\n        this.buf.write(str, this.pos);\n        this.pos += bytes;\n    },\n\n    writeFloat: function(val) {\n        this.realloc(4);\n        this.buf.writeFloatLE(val, this.pos);\n        this.pos += 4;\n    },\n\n    writeDouble: function(val) {\n        this.realloc(8);\n        this.buf.writeDoubleLE(val, this.pos);\n        this.pos += 8;\n    },\n\n    writeBytes: function(buffer) {\n        var len = buffer.length;\n        this.writeVarint(len);\n        this.realloc(len);\n        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n    },\n\n    writeRawMessage: function(fn, obj) {\n        this.pos++; // reserve 1 byte for short message length\n\n        // write the message directly to the buffer and see how much was written\n        var startPos = this.pos;\n        fn(obj, this);\n        var len = this.pos - startPos;\n\n        if (len >= 0x80) reallocForRawMessage(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    },\n\n    writeMessage: function(tag, fn, obj) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeRawMessage(fn, obj);\n    },\n\n    writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },\n    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },\n    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },\n    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },\n    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },\n    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },\n    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },\n    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },\n    writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },\n\n    writeBytesField: function(tag, buffer) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeBytes(buffer);\n    },\n    writeFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFixed32(val);\n    },\n    writeSFixed32Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeSFixed32(val);\n    },\n    writeFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeFixed64(val);\n    },\n    writeSFixed64Field: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeSFixed64(val);\n    },\n    writeVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeVarint(val);\n    },\n    writeSVarintField: function(tag, val) {\n        this.writeTag(tag, Pbf.Varint);\n        this.writeSVarint(val);\n    },\n    writeStringField: function(tag, str) {\n        this.writeTag(tag, Pbf.Bytes);\n        this.writeString(str);\n    },\n    writeFloatField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed32);\n        this.writeFloat(val);\n    },\n    writeDoubleField: function(tag, val) {\n        this.writeTag(tag, Pbf.Fixed64);\n        this.writeDouble(val);\n    },\n    writeBooleanField: function(tag, val) {\n        this.writeVarintField(tag, Boolean(val));\n    }\n};\n\nfunction readVarintRemainder(val, pbf) {\n    var buf = pbf.buf, b;\n\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x10000000;         if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x800000000;        if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x40000000000;      if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x2000000000000;    if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x100000000000000;  if (b < 0x80) return val;\n    b = buf[pbf.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val;\n\n    throw new Error('Expected varint not more than 10 bytes');\n}\n\nfunction writeBigVarint(val, pbf) {\n    pbf.realloc(10);\n\n    var maxPos = pbf.pos + 10;\n\n    while (val >= 1) {\n        if (pbf.pos >= maxPos) throw new Error('Given varint doesn\\'t fit into 10 bytes');\n        var b = val & 0xff;\n        pbf.buf[pbf.pos++] = b | (val >= 0x80 ? 0x80 : 0);\n        val /= 0x80;\n    }\n}\n\nfunction reallocForRawMessage(startPos, len, pbf) {\n    var extraLen =\n        len <= 0x3fff ? 1 :\n        len <= 0x1fffff ? 2 :\n        len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));\n\n    // if 1 byte isn't enough for encoding message length, shift the data to the right\n    pbf.realloc(extraLen);\n    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];\n}\n\nfunction writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }\nfunction writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }\nfunction writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }\nfunction writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }\nfunction writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }\nfunction writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }\nfunction writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }\nfunction writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }\nfunction writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/pbf/index.js\n// module id = 123\n// module chunks = 0 1","'use strict';\n\nmodule.exports = createFilter;\n\nvar types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\n/**\n * Given a filter expressed as nested arrays, return a new function\n * that evaluates whether a given feature (with a .properties or .tags property)\n * passes its test.\n *\n * @param {Array} filter mapbox gl filter\n * @returns {Function} filter-evaluating function\n */\nfunction createFilter(filter) {\n    return new Function('f', 'var p = (f && f.properties || {}); return ' + compile(filter));\n}\n\nfunction compile(filter) {\n    if (!filter) return 'true';\n    var op = filter[0];\n    if (filter.length <= 1) return op === 'any' ? 'false' : 'true';\n    var str =\n        op === '==' ? compileComparisonOp(filter[1], filter[2], '===', false) :\n        op === '!=' ? compileComparisonOp(filter[1], filter[2], '!==', false) :\n        op === '<' ||\n        op === '>' ||\n        op === '<=' ||\n        op === '>=' ? compileComparisonOp(filter[1], filter[2], op, true) :\n        op === 'any' ? compileLogicalOp(filter.slice(1), '||') :\n        op === 'all' ? compileLogicalOp(filter.slice(1), '&&') :\n        op === 'none' ? compileNegation(compileLogicalOp(filter.slice(1), '||')) :\n        op === 'in' ? compileInOp(filter[1], filter.slice(2)) :\n        op === '!in' ? compileNegation(compileInOp(filter[1], filter.slice(2))) :\n        op === 'has' ? compileHasOp(filter[1]) :\n        op === '!has' ? compileNegation(compileHasOp([filter[1]])) :\n        'true';\n    return '(' + str + ')';\n}\n\nfunction compilePropertyReference(property) {\n    return property === '$type' ? 'f.type' :\n        property === '$id' ? 'f.id' :\n        'p[' + JSON.stringify(property) + ']';\n}\n\nfunction compileComparisonOp(property, value, op, checkType) {\n    var left = compilePropertyReference(property);\n    var right = property === '$type' ? types.indexOf(value) : JSON.stringify(value);\n    return (checkType ? 'typeof ' + left + '=== typeof ' + right + '&&' : '') + left + op + right;\n}\n\nfunction compileLogicalOp(expressions, op) {\n    return expressions.map(compile).join(op);\n}\n\nfunction compileInOp(property, values) {\n    if (property === '$type') values = values.map(function(value) { return types.indexOf(value); });\n    var left = JSON.stringify(values.sort(compare));\n    var right = compilePropertyReference(property);\n\n    if (values.length <= 200) return left + '.indexOf(' + right + ') !== -1';\n\n    return 'function(v, a, i, j) {' +\n        'while (i <= j) { var m = (i + j) >> 1;' +\n        '    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;' +\n        '}' +\n    'return false; }(' + right + ', ' + left + ',0,' + (values.length - 1) + ')';\n}\n\nfunction compileHasOp(property) {\n    return JSON.stringify(property) + ' in p';\n}\n\nfunction compileNegation(expression) {\n    return '!(' + expression + ')';\n}\n\n// Comparison function to sort numbers and strings\nfunction compare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/feature-filter/index.js\n// module id = 124\n// module chunks = 0 1","// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n'use strict';\n\nvar PI = Math.PI;\nvar pow = Math.pow;\nvar tan = Math.tan;\nvar log = Math.log;\nvar atan = Math.atan;\nvar exp = Math.exp;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nfunction radians(value) {\n  return value * DEGREES_TO_RADIANS;\n}\nfunction degrees(value) {\n  return value * RADIANS_TO_DEGREES;\n}\n// see: https://en.wikipedia.org/wiki/Web_Mercator\nfunction ViewportMercator(opts) {\n  var scale = (opts.tileSize || 512) * 0.5 / PI * pow(2, opts.zoom);\n  var lamda = radians(opts.longitude);\n  var phi = radians(opts.latitude);\n  var x = scale * (lamda + PI);\n  var y = scale * (PI - log(tan(PI * 0.25 + phi * 0.5)));\n  var offsetX = opts.width * 0.5 - x;\n  var offsetY = opts.height * 0.5 - y;\n\n  function project(lnglat2) {\n    var lamda2 = lnglat2[0] * DEGREES_TO_RADIANS;\n    var phi2 = lnglat2[1] * DEGREES_TO_RADIANS;\n    var x2 = scale * (lamda2 + PI);\n    var y2 = scale * (PI - log(tan(PI * 0.25 + phi2 * 0.5)));\n    return [x2 + offsetX, y2 + offsetY];\n  }\n\n  function unproject(xy) {\n    var x2 = xy[0] - offsetX;\n    var y2 = xy[1] - offsetY;\n    var lamda2 = x2 / scale - PI;\n    var phi2 = 2 * (atan(exp(PI - y2 / scale)) - PI * 0.25);\n    return [degrees(lamda2), degrees(phi2)];\n  }\n\n  function contains(lnglat2) {\n    var xy = project(lnglat2);\n    var x = xy[0];\n    var y = xy[1];\n    return (\n      x >= 0 && x <= opts.width &&\n      y >= 0 && y <= opts.height\n    );\n  }\n\n  return {project: project, unproject: unproject, contains: contains};\n}\n\nmodule.exports = ViewportMercator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/viewport-mercator-project/index.js\n// module id = 125\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/isPlainObject.js\n// module id = 126\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar extend = require('../util/extend');\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n//   for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n//   high level object that needs to be descended into deeper or a simple\n//   scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n\nmodule.exports = function validate(options) {\n\n    var validateFunction = require('./validate_function');\n    var validateObject = require('./validate_object');\n    var VALIDATORS = {\n        '*': function() {\n            return [];\n        },\n        'array': require('./validate_array'),\n        'boolean': require('./validate_boolean'),\n        'number': require('./validate_number'),\n        'color': require('./validate_color'),\n        'constants': require('./validate_constants'),\n        'enum': require('./validate_enum'),\n        'filter': require('./validate_filter'),\n        'function': require('./validate_function'),\n        'layer': require('./validate_layer'),\n        'object': require('./validate_object'),\n        'source': require('./validate_source'),\n        'string': require('./validate_string')\n    };\n\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (getType(value) === 'string' && value[0] === '@') {\n        if (styleSpec.$version > 7) {\n            return [new ValidationError(key, value, 'constants have been deprecated as of v8')];\n        }\n        if (!(value in style.constants)) {\n            return [new ValidationError(key, value, 'constant \"%s\" not found', value)];\n        }\n        options = extend({}, options, { value: style.constants[value] });\n    }\n\n    if (valueSpec.function && getType(value) === 'object') {\n        return validateFunction(options);\n\n    } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n        return VALIDATORS[valueSpec.type](options);\n\n    } else {\n        return validateObject(extend({}, options, {\n            valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n        }));\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate.js\n// module id = 127\n// module chunks = 0 1","'use strict';\n\nvar config = require('./config');\nvar browser = require('./browser');\nvar URL = require('url');\nvar util = require('./util');\n\nfunction normalizeURL(url, pathPrefix, accessToken) {\n    accessToken = accessToken || config.ACCESS_TOKEN;\n\n    if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {\n        throw new Error('An API access token is required to use Mapbox GL. ' +\n            'See https://www.mapbox.com/developers/api/#access-tokens');\n    }\n\n    url = url.replace(/^mapbox:\\/\\//, config.API_URL + pathPrefix);\n    url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';\n\n    if (config.REQUIRE_ACCESS_TOKEN) {\n        if (accessToken[0] === 's') {\n            throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +\n                'See https://www.mapbox.com/developers/api/#access-tokens');\n        }\n\n        url += accessToken;\n    }\n\n    return url;\n}\n\nmodule.exports.normalizeStyleURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        return normalizeURL(\n            'mapbox:/' + urlObject.pathname + formatQuery(urlObject.query),\n            '/styles/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeSourceURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        // TileJSON requests need a secure flag appended to their URLs so\n        // that the server knows to send SSL-ified resource references.\n        return normalizeURL(\n            url + '.json',\n            '/v4/',\n            accessToken\n        ) + '&secure';\n    }\n\n};\n\nmodule.exports.normalizeGlyphsURL = function(url, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        return url;\n    } else {\n        var user = urlObject.pathname.split('/')[1];\n        return normalizeURL(\n            'mapbox://' + user + '/{fontstack}/{range}.pbf' + formatQuery(urlObject.query),\n            '/fonts/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeSpriteURL = function(url, format, extension, accessToken) {\n    var urlObject = URL.parse(url);\n\n    if (urlObject.protocol !== 'mapbox:') {\n        urlObject.pathname += format + extension;\n        return URL.format(urlObject);\n    } else {\n        return normalizeURL(\n            'mapbox:/' + urlObject.pathname + '/sprite' + format + extension + formatQuery(urlObject.query),\n            '/styles/v1/',\n            accessToken\n        );\n    }\n};\n\nmodule.exports.normalizeTileURL = function(tileURL, sourceURL, tileSize) {\n    var tileURLObject = URL.parse(tileURL, true);\n    if (!sourceURL) return tileURL;\n    var sourceURLObject = URL.parse(sourceURL);\n    if (sourceURLObject.protocol !== 'mapbox:') return tileURL;\n\n    // The v4 mapbox tile API supports 512x512 image tiles only when @2x\n    // is appended to the tile URL. If `tileSize: 512` is specified for\n    // a Mapbox raster source force the @2x suffix even if a non hidpi\n    // device.\n\n    var extension = browser.supportsWebp ? '.webp' : '$1';\n    var resolution = (browser.devicePixelRatio >= 2 || tileSize === 512) ? '@2x' : '';\n\n    return URL.format({\n        protocol: tileURLObject.protocol,\n        hostname: tileURLObject.hostname,\n        pathname: tileURLObject.pathname.replace(/(\\.(?:png|jpg)\\d*)/, resolution + extension),\n        query: replaceTempAccessToken(tileURLObject.query)\n    });\n};\n\nfunction formatQuery(query) {\n    return (query ? '?' + query : '');\n}\n\nfunction replaceTempAccessToken(query) {\n    if (query.access_token && query.access_token.slice(0, 3) === 'tk.') {\n        return util.extend({}, query, {\n            'access_token': config.ACCESS_TOKEN\n        });\n    } else {\n        return query;\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/mapbox.js\n// module id = 128\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.calculateLengthFromValueWithUnit = exports.LENGTH_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _NodeContainer = require('./NodeContainer');\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar LENGTH_WITH_UNIT = /([\\d.]+)(px|r?em|%)/i;\n\nvar LENGTH_TYPE = exports.LENGTH_TYPE = {\n    PX: 0,\n    PERCENTAGE: 1\n};\n\nvar Length = function () {\n    function Length(value) {\n        _classCallCheck(this, Length);\n\n        this.type = value.substr(value.length - 1) === '%' ? LENGTH_TYPE.PERCENTAGE : LENGTH_TYPE.PX;\n        var parsedValue = parseFloat(value);\n        if (process.env.NODE_ENV !== 'production' && isNaN(parsedValue)) {\n            console.error('Invalid value given for Length: \"' + value + '\"');\n        }\n        this.value = isNaN(parsedValue) ? 0 : parsedValue;\n    }\n\n    _createClass(Length, [{\n        key: 'isPercentage',\n        value: function isPercentage() {\n            return this.type === LENGTH_TYPE.PERCENTAGE;\n        }\n    }, {\n        key: 'getAbsoluteValue',\n        value: function getAbsoluteValue(parentLength) {\n            return this.isPercentage() ? parentLength * (this.value / 100) : this.value;\n        }\n    }], [{\n        key: 'create',\n        value: function create(v) {\n            return new Length(v);\n        }\n    }]);\n\n    return Length;\n}();\n\nexports.default = Length;\n\n\nvar getRootFontSize = function getRootFontSize(container) {\n    var parent = container.parent;\n    return parent ? getRootFontSize(parent) : parseFloat(container.style.font.fontSize);\n};\n\nvar calculateLengthFromValueWithUnit = exports.calculateLengthFromValueWithUnit = function calculateLengthFromValueWithUnit(container, value, unit) {\n    switch (unit) {\n        case 'px':\n        case '%':\n            return new Length(value + unit);\n        case 'em':\n        case 'rem':\n            var length = new Length(value);\n            length.value *= unit === 'em' ? parseFloat(container.style.font.fontSize) : getRootFontSize(container);\n            return length;\n        default:\n            // TODO: handle correctly if unknown unit is used\n            return new Length('0');\n    }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Length.js\n// module id = 129\n// module chunks = 0 1","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js\n// module id = 130\n// module chunks = 0 1","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js\n// module id = 131\n// module chunks = 0 1","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n  var exp = {};\n  var FORCE = fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  });\n  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n  if (ALIAS) exp[ALIAS] = fn;\n  $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js\n// module id = 132\n// module chunks = 0 1","module.exports = {};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js\n// module id = 133\n// module chunks = 0 1","var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/timers-browserify/main.js\n// module id = 134\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EventEmitter = function () {\n\tfunction EventEmitter() {\n\t\t_classCallCheck(this, EventEmitter);\n\n\t\tthis.observers = {};\n\t}\n\n\tEventEmitter.prototype.on = function on(events, listener) {\n\t\tvar _this = this;\n\n\t\tevents.split(' ').forEach(function (event) {\n\t\t\t_this.observers[event] = _this.observers[event] || [];\n\t\t\t_this.observers[event].push(listener);\n\t\t});\n\t};\n\n\tEventEmitter.prototype.off = function off(event, listener) {\n\t\tvar _this2 = this;\n\n\t\tif (!this.observers[event]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observers[event].forEach(function () {\n\t\t\tif (!listener) {\n\t\t\t\tdelete _this2.observers[event];\n\t\t\t} else {\n\t\t\t\tvar index = _this2.observers[event].indexOf(listener);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\t_this2.observers[event].splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tEventEmitter.prototype.emit = function emit(event) {\n\t\tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\t\targs[_key - 1] = arguments[_key];\n\t\t}\n\n\t\tif (this.observers[event]) {\n\t\t\tthis.observers[event].forEach(function (observer) {\n\t\t\t\tobserver.apply(undefined, args);\n\t\t\t});\n\t\t}\n\n\t\tif (this.observers['*']) {\n\t\t\tthis.observers['*'].forEach(function (observer) {\n\t\t\t\tvar _ref;\n\n\t\t\t\tobserver.apply(observer, (_ref = [event]).concat.apply(_ref, args));\n\t\t\t});\n\t\t}\n\t};\n\n\treturn EventEmitter;\n}();\n\nexports.default = EventEmitter;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/EventEmitter.js\n// module id = 135\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeString = makeString;\nexports.copy = copy;\nexports.setPath = setPath;\nexports.pushPath = pushPath;\nexports.getPath = getPath;\nexports.deepExtend = deepExtend;\nexports.regexEscape = regexEscape;\nexports.escape = escape;\nfunction makeString(object) {\n  if (object == null) return '';\n  return '' + object;\n}\n\nfunction copy(a, s, t) {\n  a.forEach(function (m) {\n    if (s[m]) t[m] = s[m];\n  });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n  function cleanKey(key) {\n    return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n  }\n\n  var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n  while (stack.length > 1) {\n    if (!object) return {};\n\n    var key = cleanKey(stack.shift());\n    if (!object[key] && Empty) object[key] = new Empty();\n    object = object[key];\n  }\n\n  if (!object) return {};\n  return {\n    obj: object,\n    k: cleanKey(stack.shift())\n  };\n}\n\nfunction setPath(object, path, newValue) {\n  var _getLastOfPath = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath.obj;\n  var k = _getLastOfPath.k;\n\n\n  obj[k] = newValue;\n}\n\nfunction pushPath(object, path, newValue, concat) {\n  var _getLastOfPath2 = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath2.obj;\n  var k = _getLastOfPath2.k;\n\n\n  obj[k] = obj[k] || [];\n  if (concat) obj[k] = obj[k].concat(newValue);\n  if (!concat) obj[k].push(newValue);\n}\n\nfunction getPath(object, path) {\n  var _getLastOfPath3 = getLastOfPath(object, path);\n\n  var obj = _getLastOfPath3.obj;\n  var k = _getLastOfPath3.k;\n\n\n  if (!obj) return undefined;\n  return obj[k];\n}\n\nfunction deepExtend(target, source, overwrite) {\n  for (var prop in source) {\n    if (prop in target) {\n      // If we reached a leaf string in target or source then replace with source or skip depending on the 'overwrite' switch\n      if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n        if (overwrite) target[prop] = source[prop];\n      } else {\n        deepExtend(target[prop], source[prop], overwrite);\n      }\n    } else {\n      target[prop] = source[prop];\n    }\n  }return target;\n}\n\nfunction regexEscape(str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\n\n/* eslint-disable */\nvar _entityMap = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  \"/\": '&#x2F;'\n};\n/* eslint-enable */\n\nfunction escape(data) {\n  if (typeof data === 'string') {\n    return data.replace(/[&<>\"'\\/]/g, function (s) {\n      return _entityMap[s];\n    });\n  } else {\n    return data;\n  }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/utils.js\n// module id = 136\n// module chunks = 0 1","/**\n * Actions that modify the URL.\n */\n'use strict';\n\nvar LocationActions = {\n\n  /**\n   * Indicates a new location is being pushed to the history stack.\n   */\n  PUSH: 'push',\n\n  /**\n   * Indicates the current location should be replaced.\n   */\n  REPLACE: 'replace',\n\n  /**\n   * Indicates the most recent entry should be removed from the history stack.\n   */\n  POP: 'pop'\n\n};\n\nmodule.exports = LocationActions;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/actions/LocationActions.js\n// module id = 137\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst Field = {\n  propTypes: {\n    name: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).isRequired,\n    label: PropTypes.oneOfType([PropTypes.string, PropTypes.component]),\n    hint: PropTypes.string,\n    description: PropTypes.string,\n    required: PropTypes.bool\n  },\n\n  renderFieldSet(control) {\n    let validationError = this.getValidationError();\n\n    const { maxLength, value, name, description, label, hint, required } = this.props;\n    const currentLength = value ? value.length : 0;\n\n    if (maxLength && currentLength > maxLength) {\n      validationError = label + ' has a maximum length of ' + maxLength + ' characters';\n    }\n\n    const classes = {\n      'ui-form': true,\n      required: required,\n      whoops: !!validationError\n    };\n\n    // Add a special class to assist with finding fields while testing.\n    classes['wd-' + name] = true;\n\n    return (\n      <fieldset className={classNames(classes)}>\n        <label>\n          {label}{' '}\n          {maxLength ? (\n            <span className=\"hint\">\n              {currentLength}/{maxLength} characters\n            </span>\n          ) : null}\n        </label>\n        {description ? <p>{description}</p> : null}\n        {control}\n        <p className=\"hint\">{validationError || hint}</p>\n      </fieldset>\n    );\n  },\n\n  getValidationError() {\n    const { errors, label } = this.props;\n    if (!errors) {\n      return '';\n    }\n    return errors\n      .map(error => {\n        return label + ' ' + error;\n      })\n      .join('<b>');\n  }\n};\n\nexport default Field;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/field.js","'use strict';\n\nvar _CSSTransitionGroup = require('./CSSTransitionGroup');\n\nvar _CSSTransitionGroup2 = _interopRequireDefault(_CSSTransitionGroup);\n\nvar _TransitionGroup = require('./TransitionGroup');\n\nvar _TransitionGroup2 = _interopRequireDefault(_TransitionGroup);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = {\n  TransitionGroup: _TransitionGroup2.default,\n  CSSTransitionGroup: _CSSTransitionGroup2.default\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/index.js\n// module id = 139\n// module chunks = 0 1","import Backbone from 'backbone';\n\nimport Report from './report';\n\nconst Reports = Backbone.Collection.extend({\n  url: '/api/v1/reports?limit=1000',\n  model: Report,\n\n  parse(resp) {\n    return resp.reports;\n  },\n\n  getFirst() {\n    return this.first();\n  },\n\n  findParentReportsByChildId(id) {\n    return this.filter(function(report) {\n      const reportJSON = report.toJSON();\n      return report.get('report_type') !== 'grid' && reportJSON.associated_report_ids && reportJSON.associated_report_ids.indexOf(id) !== -1;\n    }, this);\n  },\n\n  // Find a report in this collection that has the given 'id'.\n  // This differs from get() in that it also supports finding models\n  // if given a legacy ID (ex: annual, ytd, balance).\n  findById(id) {\n    return this.get(id) || this.findWhere({report_type: id});\n  }\n});\n\n(window as any).Reports = Reports;\n\nexport default Reports;\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/reports.ts","import Backbone from 'backbone';\nimport _ from 'lodash';\n\nconst EventObserverBase = {\n  listenToProp(propName, event, callback) {\n    event = event || 'all';\n    callback = callback || function() {\n      this.forceUpdate();\n    };\n    this._listenToProps || (this._listenToProps = {});\n    const propListeners = this._listenToProps[propName] || (this._listenToProps[propName] = []);\n    const listener = { event, callback };\n    propListeners.push(listener);\n    this._bindProp(this.props[propName], listener);\n  },\n\n  _bindProp(propObject, listener) {\n    if (propObject) {\n      propObject.on(listener.event, listener.callback, this);\n    }\n  },\n\n  _unbindProp(propObject, listener) {\n    if (propObject) {\n      propObject.off(listener.event, listener.callback, this);\n    }\n  },\n\n  _rebindPropListeners(prevPropObject, nextPropObject, listeners) {\n    _.each(listeners, _.bind(function(listener) {\n      this._unbindProp(prevPropObject, listener);\n      this._bindProp(nextPropObject, listener);\n    }, this));\n  },\n\n  _unbindPropListeners(propObject, listeners) {\n    _.each(listeners, _.bind(function(listener) {\n      this._unbindProp(propObject, listener);\n    }, this));\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (!this._listenToProps) {\n      return;\n    }\n\n    for (let propName in this._listenToProps) {\n      const nextProp = nextProps[propName];\n      const prevProp = this.props[propName];\n      const listeners = this._listenToProps[propName];\n\n      this._rebindPropListeners(prevProp, nextProp, listeners);\n    }\n  },\n\n  componentWillUnmount() {\n    for (let propName in this._listenToProps) {\n      const prop = this.props[propName];\n      const listeners = this._listenToProps[propName];\n\n      this._unbindPropListeners(prop, listeners);\n    }\n\n    delete this._listenToProps;\n  }\n};\n\nexport const EventObserver: typeof EventObserverBase & Backbone.Events = _.extendWith(EventObserverBase, Backbone.Events);\n\nexport default EventObserver;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/event_observer_mixin.ts","import _ from 'lodash';\n\n  /**\n  * isProjectionDataset(dataSet) figure out if dataSet is of a projection type\n  */\n  export function isProjectionDataset(dataSet) {\n    return isProjectionType(dataSet.type);\n  }\n\n  /**\n  * isBudgetType(type) return if type is a budget one\n  */\n  export function isBudgetType(type) {\n    return type === 'budget';\n  }\n\n  /**\n  * isActualType(type) return if type is a actuals one\n  */\n  export function isActualType(type) {\n    return type === 'actual';\n  }\n\n  /**\n  * isProjectionType(type) return if type is a projection one\n  */\n  export function isProjectionType(type) {\n    return type === 'system_projection' || type === 'projection'\n  }\n\n  /**\n   * getSortingIndex(type) sorting order for datasets for visualization:\n   * actuals <-- projections <-- budgets\n   */\n  export function getSortingIndex(type) {\n    switch (type) {\n    case 'actual':\n      return 1;\n    case 'budget':\n      return 0;\n    case 'projection':\n    case 'system_projection':\n      return 2;\n    default:\n      return 0;\n    }\n  }\n\n  /**\n  * fixProjectedDataSets(dataSets) returns fixed dataset\n  * in regard to the projected dataSet\n  * it's a temp function, until we fix the data on back-end\n  */\n export function fixProjectedDataSets(dataSets: { type: string, description: string, label: string }[]) {\n    return _.map(dataSets, (dataSet) => {\n      // temp massage of the data\n      if (~['3_year_avg', '4_year_avg', '2_year_avg', '1_year_avg', 'auto_year_avg'].indexOf(dataSet.label)) {\n        // fix dataSet\n        dataSet.type = 'projection';\n        dataSet.description = 'Projection';\n      }\n      // NOTE: patch for these datasets that do not have label but are still system projections\n      // we basically fall to auto_year_avg by default\n      if (isProjectionType(dataSet.type) && !dataSet.label) {\n        dataSet.label = 'auto_year_avg';\n      }\n\n      return dataSet;\n    });\n  }\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/dataset_utils.ts","'use strict';\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n  var loc = node && node.loc,\n      line = undefined,\n      column = undefined;\n  if (loc) {\n    line = loc.start.line;\n    column = loc.start.column;\n\n    message += ' - ' + line + ':' + column;\n  }\n\n  var tmp = Error.prototype.constructor.call(this, message);\n\n  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n  for (var idx = 0; idx < errorProps.length; idx++) {\n    this[errorProps[idx]] = tmp[errorProps[idx]];\n  }\n\n  /* istanbul ignore else */\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, Exception);\n  }\n\n  try {\n    if (loc) {\n      this.lineNumber = line;\n\n      // Work around issue under safari where we can't directly set the column value\n      /* istanbul ignore next */\n      if (Object.defineProperty) {\n        Object.defineProperty(this, 'column', {\n          value: column,\n          enumerable: true\n        });\n      } else {\n        this.column = column;\n      }\n    }\n  } catch (nop) {\n    /* Ignore if the browser is very particular */\n  }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSTtBQUNGLFFBQUksR0FBRyxFQUFFO0FBQ1AsVUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7QUFJdkIsVUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFO0FBQ3pCLGNBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxlQUFLLEVBQUUsTUFBTTtBQUNiLG9CQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7T0FDSixNQUFNO0FBQ0wsWUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7T0FDdEI7S0FDRjtHQUNGLENBQUMsT0FBTyxHQUFHLEVBQUU7O0dBRWI7Q0FDRjs7QUFFRCxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7O3FCQUVuQixTQUFTIiwiZmlsZSI6ImV4Y2VwdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107XG5cbmZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7XG4gIGxldCBsb2MgPSBub2RlICYmIG5vZGUubG9jLFxuICAgICAgbGluZSxcbiAgICAgIGNvbHVtbjtcbiAgaWYgKGxvYykge1xuICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICBsZXQgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcblxuICAgICAgLy8gV29yayBhcm91bmQgaXNzdWUgdW5kZXIgc2FmYXJpIHdoZXJlIHdlIGNhbid0IGRpcmVjdGx5IHNldCB0aGUgY29sdW1uIHZhbHVlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKG5vcCkge1xuICAgIC8qIElnbm9yZSBpZiB0aGUgYnJvd3NlciBpcyB2ZXJ5IHBhcnRpY3VsYXIgKi9cbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4Y2VwdGlvbjtcbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/exception.js\n// module id = 143\n// module chunks = 0 1","/*!\n * numeral.js\n * version : 1.5.3\n * author : Adam Draper\n * license : MIT\n * http://adamwdraper.github.com/Numeral-js/\n */\n\n(function () {\n\n    /************************************\n        Constants\n    ************************************/\n\n    var numeral,\n        VERSION = '1.5.3',\n        // internal storage for language config files\n        languages = {},\n        currentLanguage = 'en',\n        zeroFormat = null,\n        defaultFormat = '0,0',\n        // check for nodeJS\n        hasModule = (typeof module !== 'undefined' && module.exports);\n\n\n    /************************************\n        Constructors\n    ************************************/\n\n\n    // Numeral prototype object\n    function Numeral (number) {\n        this._value = number;\n    }\n\n    /**\n     * Implementation of toFixed() that treats floats more like decimals\n     *\n     * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\n     * problems for accounting- and finance-related software.\n     */\n    function toFixed (value, precision, roundingFunction, optionals) {\n        var power = Math.pow(10, precision),\n            optionalsRegExp,\n            output;\n            \n        //roundingFunction = (roundingFunction !== undefined ? roundingFunction : Math.round);\n        // Multiply up by precision, round accurately, then divide and use native toFixed():\n        output = (roundingFunction(value * power) / power).toFixed(precision);\n\n        if (optionals) {\n            optionalsRegExp = new RegExp('0{1,' + optionals + '}$');\n            output = output.replace(optionalsRegExp, '');\n        }\n\n        return output;\n    }\n\n    /************************************\n        Formatting\n    ************************************/\n\n    // determine what type of formatting we need to do\n    function formatNumeral (n, format, roundingFunction) {\n        var output;\n\n        // figure out what kind of format we are dealing with\n        if (format.indexOf('$') > -1) { // currency!!!!!\n            output = formatCurrency(n, format, roundingFunction);\n        } else if (format.indexOf('%') > -1) { // percentage\n            output = formatPercentage(n, format, roundingFunction);\n        } else if (format.indexOf(':') > -1) { // time\n            output = formatTime(n, format);\n        } else { // plain ol' numbers or bytes\n            output = formatNumber(n._value, format, roundingFunction);\n        }\n\n        // return string\n        return output;\n    }\n\n    // revert to number\n    function unformatNumeral (n, string) {\n        var stringOriginal = string,\n            thousandRegExp,\n            millionRegExp,\n            billionRegExp,\n            trillionRegExp,\n            suffixes = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n            bytesMultiplier = false,\n            power;\n\n        if (string.indexOf(':') > -1) {\n            n._value = unformatTime(string);\n        } else {\n            if (string === zeroFormat) {\n                n._value = 0;\n            } else {\n                if (languages[currentLanguage].delimiters.decimal !== '.') {\n                    string = string.replace(/\\./g,'').replace(languages[currentLanguage].delimiters.decimal, '.');\n                }\n\n                // see if abbreviations are there so that we can multiply to the correct number\n                thousandRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.thousand + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                millionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.million + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                billionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.billion + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n                trillionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.trillion + '(?:\\\\)|(\\\\' + languages[currentLanguage].currency.symbol + ')?(?:\\\\))?)?$');\n\n                // see if bytes are there so that we can multiply to the correct number\n                for (power = 0; power <= suffixes.length; power++) {\n                    bytesMultiplier = (string.indexOf(suffixes[power]) > -1) ? Math.pow(1024, power + 1) : false;\n\n                    if (bytesMultiplier) {\n                        break;\n                    }\n                }\n\n                // do some math to create our number\n                n._value = ((bytesMultiplier) ? bytesMultiplier : 1) * ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) * ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) * ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) * ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) * ((string.indexOf('%') > -1) ? 0.01 : 1) * (((string.split('-').length + Math.min(string.split('(').length-1, string.split(')').length-1)) % 2)? 1: -1) * Number(string.replace(/[^0-9\\.]+/g, ''));\n\n                // round if we are talking about bytes\n                n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value;\n            }\n        }\n        return n._value;\n    }\n\n    function formatCurrency (n, format, roundingFunction) {\n        var symbolIndex = format.indexOf('$'),\n            openParenIndex = format.indexOf('('),\n            minusSignIndex = format.indexOf('-'),\n            space = '',\n            spliceIndex,\n            output;\n\n        // check for space before or after currency\n        if (format.indexOf(' $') > -1) {\n            space = ' ';\n            format = format.replace(' $', '');\n        } else if (format.indexOf('$ ') > -1) {\n            space = ' ';\n            format = format.replace('$ ', '');\n        } else {\n            format = format.replace('$', '');\n        }\n\n        // format the number\n        output = formatNumber(n._value, format, roundingFunction);\n\n        // position the symbol\n        if (symbolIndex <= 1) {\n            if (output.indexOf('(') > -1 || output.indexOf('-') > -1) {\n                output = output.split('');\n                spliceIndex = 1;\n                if (symbolIndex < openParenIndex || symbolIndex < minusSignIndex){\n                    // the symbol appears before the \"(\" or \"-\"\n                    spliceIndex = 0;\n                }\n                output.splice(spliceIndex, 0, languages[currentLanguage].currency.symbol + space);\n                output = output.join('');\n            } else {\n                output = languages[currentLanguage].currency.symbol + space + output;\n            }\n        } else {\n            if (output.indexOf(')') > -1) {\n                output = output.split('');\n                output.splice(-1, 0, space + languages[currentLanguage].currency.symbol);\n                output = output.join('');\n            } else {\n                output = output + space + languages[currentLanguage].currency.symbol;\n            }\n        }\n\n        return output;\n    }\n\n    function formatPercentage (n, format, roundingFunction) {\n        var space = '',\n            output,\n            value = n._value * 100;\n\n        // check for space before %\n        if (format.indexOf(' %') > -1) {\n            space = ' ';\n            format = format.replace(' %', '');\n        } else {\n            format = format.replace('%', '');\n        }\n\n        output = formatNumber(value, format, roundingFunction);\n        \n        if (output.indexOf(')') > -1 ) {\n            output = output.split('');\n            output.splice(-1, 0, space + '%');\n            output = output.join('');\n        } else {\n            output = output + space + '%';\n        }\n\n        return output;\n    }\n\n    function formatTime (n) {\n        var hours = Math.floor(n._value/60/60),\n            minutes = Math.floor((n._value - (hours * 60 * 60))/60),\n            seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60));\n        return hours + ':' + ((minutes < 10) ? '0' + minutes : minutes) + ':' + ((seconds < 10) ? '0' + seconds : seconds);\n    }\n\n    function unformatTime (string) {\n        var timeArray = string.split(':'),\n            seconds = 0;\n        // turn hours and minutes into seconds and add them all up\n        if (timeArray.length === 3) {\n            // hours\n            seconds = seconds + (Number(timeArray[0]) * 60 * 60);\n            // minutes\n            seconds = seconds + (Number(timeArray[1]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[2]);\n        } else if (timeArray.length === 2) {\n            // minutes\n            seconds = seconds + (Number(timeArray[0]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[1]);\n        }\n        return Number(seconds);\n    }\n\n    function formatNumber (value, format, roundingFunction) {\n        var negP = false,\n            signed = false,\n            optDec = false,\n            abbr = '',\n            abbrK = false, // force abbreviation to thousands\n            abbrM = false, // force abbreviation to millions\n            abbrB = false, // force abbreviation to billions\n            abbrT = false, // force abbreviation to trillions\n            abbrForce = false, // force abbreviation\n            bytes = '',\n            ord = '',\n            abs = Math.abs(value),\n            suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n            min,\n            max,\n            power,\n            w,\n            precision,\n            thousands,\n            d = '',\n            neg = false;\n\n        // check if number is zero and a custom zero format has been set\n        if (value === 0 && zeroFormat !== null) {\n            return zeroFormat;\n        } else {\n            // see if we should use parentheses for negative number or if we should prefix with a sign\n            // if both are present we default to parentheses\n            if (format.indexOf('(') > -1) {\n                negP = true;\n                format = format.slice(1, -1);\n            } else if (format.indexOf('+') > -1) {\n                signed = true;\n                format = format.replace(/\\+/g, '');\n            }\n\n            // see if abbreviation is wanted\n            if (format.indexOf('a') > -1) {\n                // check if abbreviation is specified\n                abbrK = format.indexOf('aK') >= 0;\n                abbrM = format.indexOf('aM') >= 0;\n                abbrB = format.indexOf('aB') >= 0;\n                abbrT = format.indexOf('aT') >= 0;\n                abbrForce = abbrK || abbrM || abbrB || abbrT;\n\n                // check for space before abbreviation\n                if (format.indexOf(' a') > -1) {\n                    abbr = ' ';\n                    format = format.replace(' a', '');\n                } else {\n                    format = format.replace('a', '');\n                }\n\n                if (abs >= Math.pow(10, 12) && !abbrForce || abbrT) {\n                    // trillion\n                    abbr = abbr + languages[currentLanguage].abbreviations.trillion;\n                    value = value / Math.pow(10, 12);\n                } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9) && !abbrForce || abbrB) {\n                    // billion\n                    abbr = abbr + languages[currentLanguage].abbreviations.billion;\n                    value = value / Math.pow(10, 9);\n                } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6) && !abbrForce || abbrM) {\n                    // million\n                    abbr = abbr + languages[currentLanguage].abbreviations.million;\n                    value = value / Math.pow(10, 6);\n                } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3) && !abbrForce || abbrK) {\n                    // thousand\n                    abbr = abbr + languages[currentLanguage].abbreviations.thousand;\n                    value = value / Math.pow(10, 3);\n                }\n            }\n\n            // see if we are formatting bytes\n            if (format.indexOf('b') > -1) {\n                // check for space before\n                if (format.indexOf(' b') > -1) {\n                    bytes = ' ';\n                    format = format.replace(' b', '');\n                } else {\n                    format = format.replace('b', '');\n                }\n\n                for (power = 0; power <= suffixes.length; power++) {\n                    min = Math.pow(1024, power);\n                    max = Math.pow(1024, power+1);\n\n                    if (value >= min && value < max) {\n                        bytes = bytes + suffixes[power];\n                        if (min > 0) {\n                            value = value / min;\n                        }\n                        break;\n                    }\n                }\n            }\n\n            // see if ordinal is wanted\n            if (format.indexOf('o') > -1) {\n                // check for space before\n                if (format.indexOf(' o') > -1) {\n                    ord = ' ';\n                    format = format.replace(' o', '');\n                } else {\n                    format = format.replace('o', '');\n                }\n\n                ord = ord + languages[currentLanguage].ordinal(value);\n            }\n\n            if (format.indexOf('[.]') > -1) {\n                optDec = true;\n                format = format.replace('[.]', '.');\n            }\n\n            w = value.toString().split('.')[0];\n            precision = format.split('.')[1];\n            thousands = format.indexOf(',');\n\n            if (precision) {\n                if (precision.indexOf('[') > -1) {\n                    precision = precision.replace(']', '');\n                    precision = precision.split('[');\n                    d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);\n                } else {\n                    d = toFixed(value, precision.length, roundingFunction);\n                }\n\n                w = d.split('.')[0];\n\n                if (d.split('.')[1].length) {\n                    d = languages[currentLanguage].delimiters.decimal + d.split('.')[1];\n                } else {\n                    d = '';\n                }\n\n                if (optDec && Number(d.slice(1)) === 0) {\n                    d = '';\n                }\n            } else {\n                w = toFixed(value, null, roundingFunction);\n            }\n\n            // format number\n            if (w.indexOf('-') > -1) {\n                w = w.slice(1);\n                neg = true;\n            }\n\n            if (thousands > -1) {\n                w = w.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + languages[currentLanguage].delimiters.thousands);\n            }\n\n            if (format.indexOf('.') === 0) {\n                w = '';\n            }\n\n            return ((negP && neg) ? '(' : '') + ((!negP && neg) ? '-' : '') + ((!neg && signed) ? '+' : '') + w + d + ((ord) ? ord : '') + ((abbr) ? abbr : '') + ((bytes) ? bytes : '') + ((negP && neg) ? ')' : '');\n        }\n    }\n\n    /************************************\n        Top Level Functions\n    ************************************/\n\n    numeral = function (input) {\n        if (numeral.isNumeral(input)) {\n            input = input.value();\n        } else if (input === 0 || typeof input === 'undefined') {\n            input = 0;\n        } else if (!Number(input)) {\n            input = numeral.fn.unformat(input);\n        }\n\n        return new Numeral(Number(input));\n    };\n\n    // version number\n    numeral.version = VERSION;\n\n    // compare numeral object\n    numeral.isNumeral = function (obj) {\n        return obj instanceof Numeral;\n    };\n\n    // This function will load languages and then set the global language.  If\n    // no arguments are passed in, it will simply return the current global\n    // language key.\n    numeral.language = function (key, values) {\n        if (!key) {\n            return currentLanguage;\n        }\n\n        if (key && !values) {\n            if(!languages[key]) {\n                throw new Error('Unknown language : ' + key);\n            }\n            currentLanguage = key;\n        }\n\n        if (values || !languages[key]) {\n            loadLanguage(key, values);\n        }\n\n        return numeral;\n    };\n    \n    // This function provides access to the loaded language data.  If\n    // no arguments are passed in, it will simply return the current\n    // global language object.\n    numeral.languageData = function (key) {\n        if (!key) {\n            return languages[currentLanguage];\n        }\n        \n        if (!languages[key]) {\n            throw new Error('Unknown language : ' + key);\n        }\n        \n        return languages[key];\n    };\n\n    numeral.language('en', {\n        delimiters: {\n            thousands: ',',\n            decimal: '.'\n        },\n        abbreviations: {\n            thousand: 'k',\n            million: 'm',\n            billion: 'b',\n            trillion: 't'\n        },\n        ordinal: function (number) {\n            var b = number % 10;\n            return (~~ (number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n        },\n        currency: {\n            symbol: '$'\n        }\n    });\n\n    numeral.zeroFormat = function (format) {\n        zeroFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numeral.defaultFormat = function (format) {\n        defaultFormat = typeof(format) === 'string' ? format : '0.0';\n    };\n\n    /************************************\n        Helpers\n    ************************************/\n\n    function loadLanguage(key, values) {\n        languages[key] = values;\n    }\n\n    /************************************\n        Floating-point helpers\n    ************************************/\n\n    // The floating-point helper functions and implementation\n    // borrows heavily from sinful.js: http://guipn.github.io/sinful.js/\n\n    /**\n     * Array.prototype.reduce for browsers that don't support it\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Compatibility\n     */\n    if ('function' !== typeof Array.prototype.reduce) {\n        Array.prototype.reduce = function (callback, opt_initialValue) {\n            'use strict';\n            \n            if (null === this || 'undefined' === typeof this) {\n                // At the moment all modern browsers, that support strict mode, have\n                // native implementation of Array.prototype.reduce. For instance, IE8\n                // does not support strict mode, so this check is actually useless.\n                throw new TypeError('Array.prototype.reduce called on null or undefined');\n            }\n            \n            if ('function' !== typeof callback) {\n                throw new TypeError(callback + ' is not a function');\n            }\n\n            var index,\n                value,\n                length = this.length >>> 0,\n                isValueSet = false;\n\n            if (1 < arguments.length) {\n                value = opt_initialValue;\n                isValueSet = true;\n            }\n\n            for (index = 0; length > index; ++index) {\n                if (this.hasOwnProperty(index)) {\n                    if (isValueSet) {\n                        value = callback(value, this[index], index, this);\n                    } else {\n                        value = this[index];\n                        isValueSet = true;\n                    }\n                }\n            }\n\n            if (!isValueSet) {\n                throw new TypeError('Reduce of empty array with no initial value');\n            }\n\n            return value;\n        };\n    }\n\n    \n    /**\n     * Computes the multiplier necessary to make x >= 1,\n     * effectively eliminating miscalculations caused by\n     * finite precision.\n     */\n    function multiplier(x) {\n        var parts = x.toString().split('.');\n        if (parts.length < 2) {\n            return 1;\n        }\n        return Math.pow(10, parts[1].length);\n    }\n\n    /**\n     * Given a variable number of arguments, returns the maximum\n     * multiplier that must be used to normalize an operation involving\n     * all of them.\n     */\n    function correctionFactor() {\n        var args = Array.prototype.slice.call(arguments);\n        return args.reduce(function (prev, next) {\n            var mp = multiplier(prev),\n                mn = multiplier(next);\n        return mp > mn ? mp : mn;\n        }, -Infinity);\n    }        \n\n\n    /************************************\n        Numeral Prototype\n    ************************************/\n\n\n    numeral.fn = Numeral.prototype = {\n\n        clone : function () {\n            return numeral(this);\n        },\n\n        format : function (inputString, roundingFunction) {\n            return formatNumeral(this, \n                  inputString ? inputString : defaultFormat, \n                  (roundingFunction !== undefined) ? roundingFunction : Math.round\n              );\n        },\n\n        unformat : function (inputString) {\n            if (Object.prototype.toString.call(inputString) === '[object Number]') { \n                return inputString; \n            }\n            return unformatNumeral(this, inputString ? inputString : defaultFormat);\n        },\n\n        value : function () {\n            return this._value;\n        },\n\n        valueOf : function () {\n            return this._value;\n        },\n\n        set : function (value) {\n            this._value = Number(value);\n            return this;\n        },\n\n        add : function (value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n            function cback(accum, curr, currI, O) {\n                return accum + corrFactor * curr;\n            }\n            this._value = [this._value, value].reduce(cback, 0) / corrFactor;\n            return this;\n        },\n\n        subtract : function (value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n            function cback(accum, curr, currI, O) {\n                return accum - corrFactor * curr;\n            }\n            this._value = [value].reduce(cback, this._value * corrFactor) / corrFactor;            \n            return this;\n        },\n\n        multiply : function (value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) * (curr * corrFactor) /\n                    (corrFactor * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback, 1);\n            return this;\n        },\n\n        divide : function (value) {\n            function cback(accum, curr, currI, O) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) / (curr * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback);            \n            return this;\n        },\n\n        difference : function (value) {\n            return Math.abs(numeral(this._value).subtract(value).value());\n        }\n\n    };\n\n    /************************************\n        Exposing Numeral\n    ************************************/\n\n    // CommonJS module is defined\n    if (hasModule) {\n        module.exports = numeral;\n    }\n\n    /*global ender:false */\n    if (typeof ender === 'undefined') {\n        // here, `this` means `window` in the browser, or `global` on the server\n        // add `numeral` as a global object via a string identifier,\n        // for Closure Compiler 'advanced' mode\n        this['numeral'] = numeral;\n    }\n\n    /*global define:false */\n    if (typeof define === 'function' && define.amd) {\n        define([], function () {\n            return numeral;\n        });\n    }\n}).call(this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/numeral/numeral.js\n// module id = 144\n// module chunks = 0 1","import update from 'immutability-helper';\nimport _ from 'lodash';\n\nimport { Dispatcher } from '@opengov/og_flux';\nimport { BaseStore } from '@opengov/og_flux';\n\nimport OGAPI from '@opengov/og_api';\n\nexport const maxNumberOfSavedViewsReturned = 1000;\n\n// Clear the active saved view if any of these properties of\n// the current report state differs from the saved view's state.\n// See the \"REPORT_STATE_CHANGE\" action handler for more details.\nconst CLEAR_SAVED_VIEW_PROPERTIES = ['breakdown_id', 'ledger', 'selection'];\n\n/**\n * A store for managing a collection of saved views.\n * Handles management tasks such as creating, editing, and deleting saved views.\n * It's also responsible for fetching saved views when the user views a report.\n */\nclass SavedViewsStore extends BaseStore {\n  _views: any[];\n  _activeView: any;\n  _editView: any;\n  _editViewSyncing: any;\n  _visitedViews: any;\n  _dragViewId: any;\n  emitChange: () => void;\n  addChangeListener: (cb: () => void) => void;\n  removeChangeListener: (cb: () => void) => void;\n\n  constructor() {\n    super();\n\n    // A collection of saved views for the current rendered report.\n    this._views = [];\n\n    // Active saved view the user is currently viewing.\n    this._activeView = null;\n\n    // A new or existing saved view the user is currently editing.\n    this._editView = null;\n\n    // A flag to track if there is a pending request to sync the edit view to the server.\n    this._editViewSyncing = false;\n\n    // A collection of saved views the user has visited.\n    this._visitedViews = [];\n\n    Dispatcher.register((payload) => {\n      this._handleAction(payload.action);\n    });\n  }\n\n  /**\n   * Get the collection of saved views for the current report sorted by position.\n   * @returns {Array}\n   */\n  getSortedViews() {\n    return this._views;\n  }\n\n  /**\n   * Returns an array of saved view ids which have been visited by the user.\n   * @returns {Array} An array of saved view ids.\n   */\n  getVisitedViews() {\n    return this._visitedViews;\n  }\n\n  /**\n   * Get the saved views count currently loaded.\n   * @returns {number}\n   */\n  getSavedViewsCount() {\n    return this._views.length;\n  }\n\n  /**\n   * Get the currently active saved view the user is viewing.\n   * @returns {Object}\n   */\n  getActiveView() {\n    return this._activeView;\n  }\n\n  /**\n   * Get the current saved view being edited by the user.\n   * @returns {Object} - The saved view\n   */\n  getEditView() {\n    return this._editView;\n  }\n\n  /**\n   * Check if the edit view has a pending request to sync it with the server.\n   * @returns {boolean} - True if there is a pending request.\n   */\n  isEditViewSyncing() {\n    return this._editViewSyncing;\n  }\n\n  /**\n   * Get the saved view the user is currently dragging to a new position.\n   * @returns {Object}\n   */\n  getDragView() {\n    return this.findViewById(this._dragViewId);\n  }\n\n  /**\n   * Finds a saved view by its 'id'.\n   * @returns {Object}\n   */\n  findViewById(id) {\n    return _.find(this._views, (view) => view.id === id);\n  }\n\n  /**\n   * Appends a new saved view to the collection.\n   * @private\n   * @param {Object} savedView\n   */\n  _addSavedView(savedView) {\n    (this._views as any) = update(this._views, {\n      $push: [savedView]\n    });\n  }\n\n  /**\n   * Removes the saved view from the collection.\n   * @private\n   * @param {number|Object} id - The 'id' of the view to be removed. May also be the actual view instance.\n   */\n  _removeSavedView(id) {\n    const index = _.findIndex(this._views, (view) => view === id || view.id === id);\n    (this._views as any) = update(this._views, {\n      $splice: [[index, 1]]\n    });\n  }\n\n  /**\n   * Replace a saved view with a new copy.\n   * @private\n   * @param {Object} oldView - Current copy of saved view in the collection.\n   * @param {Object} newView - New copy of saved view to insert into collection.\n   */\n  _replaceSavedView(oldView, newView) {\n    const index = _.findIndex(this._views, (view) => view === oldView);\n    (this._views as any) = update(this._views, {\n      $splice: [[index, 1, newView]]\n    });\n\n    if (this._activeView === oldView) {\n      this._activeView = newView;\n    }\n  }\n\n  /**\n   * Move a saved view to a position after another view in the collection.\n   * @private\n   * @param {number} id - The 'id' of the saved view to move.\n   * @param {number} afterId - The 'id' of the other saved view to position the view after.\n   */\n  _moveSavedView(id, afterId) {\n    const view = this.findViewById(id);\n    const afterView = this.findViewById(afterId);\n    const viewIndex = this._views.indexOf(view);\n    const afterViewIndex = this._views.indexOf(afterView);\n\n    const updatedView = _.assign({}, view, {position: afterViewIndex + 1});\n    if (this._activeView && this._activeView.id === id) {\n      this._activeView = updatedView;\n    }\n\n    (this._views as any) = update(this._views, {\n      $splice: [\n        [viewIndex, 1],\n        [afterViewIndex, 0, updatedView]\n      ]\n    });\n  }\n\n  /**\n   * Mark the saved view as being visited by the user.\n   * @param {Object} view - The saved view to be marked as visited.\n   */\n  _markViewAsVisited(view) {\n    this._visitedViews = update(this._visitedViews, {\n      $push: [view.id]\n    });\n  }\n\n  /**\n   * Prepare a new saved view item and make it the current edit view.\n   * @param {Object} view - The new saved view item\n   */\n  _newView(view) {\n    this._editView = _.clone(view);\n  }\n\n  /**\n   * Clear the edit view state and also the pending request flag if it is set.\n   */\n  _clearEditView() {\n    this._editView = null;\n    this._editViewSyncing = false;\n  }\n\n  /**\n   * Load a collection of saved views from the server for a report.\n   * @private\n   * @param {number} reportId - The 'id' of the report to fetch saved views for.\n   */\n  _fetchSavedViews(reportId) {\n    OGAPI.get('saved_views', {report_id: reportId, limit: maxNumberOfSavedViewsReturned}).end().then((res) => {\n      this._views = res.body.saved_views;\n      this.emitChange();\n    });\n  }\n\n  _handleAction(action) {\n    let view;\n\n    switch (action.actionType) {\n    case 'REPORT_LOADED':\n      this._fetchSavedViews(action.report.id);\n      this._activeView = null;\n      this._clearEditView();\n      this._visitedViews = [];\n      this.emitChange();\n      break;\n\n    case 'REPORT_STATE_RESET':\n      this._activeView = null;\n      this._visitedViews = [];\n      this.emitChange();\n      break;\n\n    case 'REPORT_STATE_CHANGE':\n      // Clear the active saved view if the user navigates away from it.\n      // For example if they make a selection change we will clear the active view.\n      if (this._activeView) {\n        const viewState = _.pick(this._activeView.view_state, CLEAR_SAVED_VIEW_PROPERTIES);\n        const reportState = _.pick(action.state, CLEAR_SAVED_VIEW_PROPERTIES);\n        if (!_.isEqual(viewState, reportState)) {\n          this._activeView = null;\n          this.emitChange();\n        }\n      }\n      break;\n\n    case 'SAVED_VIEW_SELECTED':\n      this._activeView = action.savedView;\n      this._markViewAsVisited(this._activeView);\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_NEW':\n      this._newView(action.savedView);\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_CANCEL':\n      this._clearEditView();\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_CREATE':\n      this._editView = _.assign({}, action.savedView, {__clientId: action.requestId});\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_CREATE_SUCCESS':\n      this._addSavedView(action.savedView);\n      this._activeView = action.savedView;\n      this._clearEditView();\n      this._markViewAsVisited(this._activeView);\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_CREATE_ERROR':\n      view = this._editView = _.omit(this._editView, '__clientId');\n      view.__error = 'There was an error creating the saved view. Please try again.';\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_EDIT':\n      this._editView = this.findViewById(action.savedViewId);\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_UPDATE':\n      view = _.assign({}, this.findViewById(action.savedViewId), action.updatedAttributes);\n      this._editView = view;\n      this._editViewSyncing = true;\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_UPDATE_SUCCESS':\n      const oldView = this.findViewById(action.savedViewId);\n      const newView = this._editView;\n      this._replaceSavedView(oldView, newView);\n      this._clearEditView();\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_UPDATE_ERROR':\n      this._editView = _.assign({}, this._editView, {__error: 'There was an error updating the saved view. Please try again.'});\n      this._editViewSyncing = false;\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DELETE':\n      this._editViewSyncing = true;\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DELETE_SUCCESS':\n      this._removeSavedView(action.savedViewId);\n      this._clearEditView();\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DELETE_ERROR':\n      this._editView = _.assign({}, this._editView, {__error: 'There was an error deleting this saved view. Please try again.'});\n      this._editViewSyncing = false;\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DRAG_START':\n      this._dragViewId = action.savedViewId;\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DRAG_AFTER':\n      this._moveSavedView(this._dragViewId, action.savedViewId);\n      this.emitChange();\n      break;\n\n    case 'SAVED_VIEW_DROP':\n      break;\n    }\n  }\n}\n\nconst store = new SavedViewsStore();\n(store as any).__class = SavedViewsStore;\n\nexport default store;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/saved_views_store.ts","export const CheckSettings = {\n  checkbookDomain: 'ohiocheckbook.com',\n  pdfPath: '/downloads/check_image.pdf',\n  requiredFields: [\n    'check_date',\n    'check_no',\n    'amount',\n    'expense_type',\n    'paid_to',\n    'department'\n  ],\n  descriptionFields: [\n    { key: 'entity', label: 'Paid By', type: 'description', format: 'capitalize'},\n    { key: 'paid_to', label: 'Paid To', type: 'description', filter: true},\n    { key: 'amount', label: 'Payment Amount', type: 'description', format: 'money'},\n    { key: 'vendor_city', label: 'Vendor City', type: 'description'},\n    { key: 'voucher_id', label: 'Voucher ID', type: 'description', filter: true},\n    { key: '__zz0x_document_id', label: 'Document ID', type: 'description', filter: true, requiresFeaturePermission: 'west_virginia_check_fields'},\n    { key: '__zz0x_expense', label: 'Expense', type: 'description', filter: true, requiresFeaturePermission: 'west_virginia_check_fields'},\n    { key: 'vendor_state', label: 'Vendor State', type: 'description'},\n    { key: 'check_no', label: 'Check Number', type: 'description', filter: true},\n    { key: 'vendor_zip', label: 'Vendor Zip', type: 'description'},\n    { key: 'check_date', label: 'Payment Date', type: 'description', format: 'date'},\n    { key: '', label: '' },\n    { key: 'expense_type', label: 'Expense Type', type: 'description', filter: true},\n    { key: 'fund', label: 'Funds', type: 'money', filter: true},\n    { key: 'program', label: 'Program', type: 'money', filter: true},\n    { key: 'department', label: 'Department', hidden: true, filter: true},\n  ] as { key: string, label: string, type?: string, format?: string, filter?: boolean, hidden?: boolean, requiresFeaturePermission?: string}[]\n};\n\nexport const GriddleSettings = {\n  ignoredFields: [\n    'id',\n    'quasi_id',\n    'all'\n  ]\n};\n\n\nlet result: { CheckSettings: typeof CheckSettings, GriddleSettings: typeof GriddleSettings }\n  = {} as any;\n\nif (gon.config) {\n  result = gon.config;\n}\n\nresult.GriddleSettings = GriddleSettings;\nresult.CheckSettings = CheckSettings;\n\nexport default result;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/config.ts","import _ from 'lodash';\nimport { List } from 'immutable';\nimport { MapTypes } from '../map_constants';\n\nexport function buildFeatureCollection(data) {\n  return {\n    type: 'FeatureCollection',\n    features: data\n  };\n}\n\nfunction isInvalid(num) {\n  return !_.isNumber(num) && !num;\n}\n\nfunction isValid(num) {\n  return !isInvalid(num);\n}\n\nexport function getBounds(arr, getLng, getLat) {\n  const lngs = arr.map(getLng).filter(isValid);\n  const lats = arr.map(getLat).filter(isValid);\n  const ne = { lng: _.max(lngs), lat: _.max(lats) };\n  const sw = { lng: _.min(lngs), lat: _.min(lats) };\n\n  return padBounds(List([\n    List([\n      sw.lng,\n      sw.lat\n    ]),\n    List([\n      ne.lng,\n      ne.lat\n    ])\n  ]));\n}\n\nexport function getFeatureLongitude(feature) {\n  return feature.geometry.coordinates[0];\n}\n\nexport function getFeatureLatitude(feature) {\n  return feature.geometry.coordinates[1];\n}\n\nexport function getBoundsForFeatures(features) {\n  return getBounds(features, getFeatureLongitude, getFeatureLatitude);\n}\n\nexport const DEFAULT_BOUNDS_PADDING = 0.25;\nexport const MINIMUM_POINT_DIFF = 0.01;\n\nexport function padBounds(bounds, paddingRatio = DEFAULT_BOUNDS_PADDING) {\n  const ne = bounds.get(0);\n  const sw = bounds.get(1);\n\n  // To avoid invalid bounds where NE and SW are equal\n  // due to stacked features, we implement a minimum diff\n  const lngDiff = _.max([ne.get(0) - sw.get(0), MINIMUM_POINT_DIFF]);\n  const latDiff = _.max([ne.get(1) - sw.get(1), MINIMUM_POINT_DIFF]);\n\n  const lngPadding = lngDiff * paddingRatio / 2;\n  const latPadding = latDiff * paddingRatio / 2;\n\n  return bounds\n    .set(0, List([ne.get(0) + lngPadding, ne.get(1) + latPadding]))\n    .set(1, List([sw.get(0) - lngPadding, sw.get(1) - latPadding]));\n}\n\nfunction coordinateIsInvalid(num) {\n  return (!_.isNumber(num) && !num) || num == Infinity || num == -Infinity;\n}\n\nexport function shouldIgnoreLngLat(lngLat) {\n  return !lngLat || _.some(lngLat, coordinateIsInvalid);\n}\n\n// When returning to a saved state mapbox-gl fits the saved bounds with\n// variable accuracy proportional to zoom level. If we check actual equality it\n// will resave the view/grid state every time it's loaded with no\n// perceivable difference\nexport const BOUNDS_NEAR_EQUAL_DIFF_RATIO = 1 / 25;\n\nexport function boundsNearlyEqual(boundsA, boundsB) {\n  if (!boundsA || !boundsB) {\n    return false;\n  }\n\n  const ne = boundsA.get(0);\n  const sw = boundsA.get(1);\n\n  const lngDiff = Math.abs(ne.get(0) - sw.get(0));\n  const latDiff = Math.abs(ne.get(1) - sw.get(1));\n\n  return boundsA.every((coords, lngLatIndex) => {\n    return coords.every((num, coordIndex) => {\n      const boundsDiff = Math.abs(boundsB.getIn([lngLatIndex, coordIndex]) - num);\n      const maxDiff = BOUNDS_NEAR_EQUAL_DIFF_RATIO * (coordIndex == 0 ? lngDiff : latDiff);\n      return boundsDiff < maxDiff;\n    });\n  });\n}\n\nexport const featureLocationsVirtuallyIdentical = (features) => {\n  if (features && features.length && features.length == 1) {\n    return true;\n  }\n\n  const firstCoord = features && features.length > 0 && features[0] && features[0].geometry.coordinates;\n  return firstCoord && !_.some(_.drop(features, 1), (f: { geometry: { coordinates: number[][]}}) => {\n    return f.geometry.coordinates[0] != firstCoord[0] || f.geometry.coordinates[1] != firstCoord[1];\n  });\n};\n\nexport const boundsIntersect = (boundsA, boundsB) => {\n  return !(\n    boundsB.get('x1') > boundsA.get('x2') ||\n    boundsB.get('x2') < boundsA.get('x1') ||\n    boundsB.get('y1') > boundsA.get('y2') ||\n    boundsB.get('y2') < boundsA.get('y1')\n  );\n};\n\nexport const filterRowsWithoutLocation = rows => _.filter(rows, lngLatExtractor);\n\nexport const transformRowsToFeatures = rows => _.map(\n  rows,\n  row => {\n    const coords = lngLatExtractor(row);\n\n    return {\n      type: 'Feature',\n      properties: row,\n      geometry: {\n        type: 'Point',\n        coordinates: coords\n      }\n    };\n  }\n);\n\nexport function getHeatmapIntensityForAmount(row, amountColumn, dataMax) {\n  const { intensityExponent } = MapTypes.Heatmap.configuration;\n  const parsedNumber = parseFloat(row.properties[amountColumn].replace(/\\$|,/g, ''));\n  return Math.pow(parsedNumber, intensityExponent) / Math.pow(dataMax, intensityExponent);\n}\n\nexport function getHeatmapSizeForAmount(row, amountColumn, dataMax) {\n  const { radius, sizeExponent } = MapTypes.Heatmap.configuration;\n  const parsedNumber = parseFloat(row.properties[amountColumn].replace(/\\$|,/g, ''));\n  return Math.pow(Math.log(parsedNumber) / Math.log(dataMax), sizeExponent) * radius;\n}\n\nexport const mapAmountField = (row, amountColumn, dataMax) => Object.assign(row, {\n  properties: Object.assign(row.properties, {\n    __heatmapIntensity: getHeatmapIntensityForAmount(row, amountColumn, dataMax),\n    __heatmapSize: getHeatmapSizeForAmount(row, amountColumn, dataMax)\n  })\n});\n\nexport const HeatmapExtractorsMap = {\n  [MapTypes.Heatmap.types.amount]: {\n    intensityExtractor: row => row.properties.__heatmapIntensity,\n    sizeExtractor: row => row.properties.__heatmapSize\n  },\n  [MapTypes.Heatmap.types.density]: {}\n};\n\nexport const ingestRowsForMap = (rows, currentMapType, amountColumn, dataMax) => {\n  const transformedRows = transformRowsToFeatures(filterRowsWithoutLocation(rows));\n\n  if (currentMapType === MapTypes.Heatmap.name) {\n    return transformedRows.map(row => mapAmountField(row, amountColumn, dataMax));\n  }\n\n  return transformedRows;\n};\n\nexport function lngLatExtractor(r) {\n  // the location_json field from the API is standard GeoJSON which comes with LngLat coords in this specific format\n  return r\n    && r[locationColumn]\n    && r[locationColumn].coordinates\n    && r[locationColumn].coordinates.length == 2\n    && r[locationColumn].coordinates;\n}\n\nexport function getLngLatFromFeature(feature) {\n  return { lng: feature.geometry.coordinates[0], lat: feature.geometry.coordinates[1] };\n}\n\nexport function getFeatureCoordinates(feature) {\n  return feature.geometry.coordinates;\n}\n\nexport const locationColumn = 'location_json';\n\nconst objectFromKeyArray = columns => row => {\n  return _.reduce(columns, (object, column: any, index) => _.assign(object, { [column]: row[index] }), {});\n};\nconst buildObjectsFromArrays = (arrays, keys) => _.map(arrays, objectFromKeyArray(keys));\n\nexport const parseGeoJson = row => _.mapValues(row, (value, key) => key == locationColumn ? JSON.parse(value) : value);\n\nexport const buildObjectsFromGeoResponse = (result) => {\n  return _.map(buildObjectsFromArrays(result.body.query_results, result.body.query_header), parseGeoJson);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/utils/geodata_utils.ts","export { default as translate } from './translate';\nexport { default as I18n } from './I18n';\nexport { default as Interpolate } from './Interpolate';\nexport { default as Trans } from './Trans';\nexport { default as I18nextProvider } from './I18nextProvider';\nexport { default as loadNamespaces } from './loadNamespaces';\nexport { reactI18nextModule, setDefaults, getDefaults, setI18n, getI18n } from './context';\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/index.js\n// module id = 148\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar validateSpec = require('./validate');\n\nmodule.exports = function validateObject(options) {\n    var key = options.key;\n    var object = options.value;\n    var elementSpecs = options.valueSpec || {};\n    var elementValidators = options.objectElementValidators || {};\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var errors = [];\n\n    var type = getType(object);\n    if (type !== 'object') {\n        return [new ValidationError(key, object, 'object expected, %s found', type)];\n    }\n\n    for (var objectKey in object) {\n        var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n        var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n\n        var validateElement;\n        if (elementValidators[elementSpecKey]) {\n            validateElement = elementValidators[elementSpecKey];\n        } else if (elementSpecs[elementSpecKey]) {\n            validateElement = validateSpec;\n        } else if (elementValidators['*']) {\n            validateElement = elementValidators['*'];\n        } else if (elementSpecs['*']) {\n            validateElement = validateSpec;\n        } else {\n            errors.push(new ValidationError(key, object[objectKey], 'unknown property \"%s\"', objectKey));\n            continue;\n        }\n\n        errors = errors.concat(validateElement({\n            key: (key ? key + '.' : key) + objectKey,\n            value: object[objectKey],\n            valueSpec: elementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            object: object,\n            objectKey: objectKey\n        }));\n    }\n\n    for (elementSpecKey in elementSpecs) {\n        if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {\n            errors.push(new ValidationError(key, object, 'missing required property \"%s\"', elementSpecKey));\n        }\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_object.js\n// module id = 149\n// module chunks = 0 1","'use strict';\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nmodule.exports = function unbundle(value) {\n    if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n        return value.valueOf();\n    } else {\n        return value;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/unbundle_jsonlint.js\n// module id = 150\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Buffer;\n\n/**\n * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n *\n * @class Buffer\n * @private\n * @param {object} array A serialized StructArray.\n * @param {object} arrayType A serialized StructArrayType.\n * @param {BufferType} type\n */\nfunction Buffer(array, arrayType, type) {\n    this.arrayBuffer = array.arrayBuffer;\n    this.length = array.length;\n    this.attributes = arrayType.members;\n    this.itemSize = arrayType.bytesPerElement;\n    this.type = type;\n    this.arrayType = arrayType;\n}\n\n/**\n * Bind this buffer to a WebGL context.\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.bind = function(gl) {\n    var type = gl[this.type];\n\n    if (!this.buffer) {\n        this.buffer = gl.createBuffer();\n        gl.bindBuffer(type, this.buffer);\n        gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW);\n\n        // dump array buffer once it's bound to gl\n        this.arrayBuffer = null;\n    } else {\n        gl.bindBuffer(type, this.buffer);\n    }\n};\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nvar AttributeType = {\n    Int8:   'BYTE',\n    Uint8:  'UNSIGNED_BYTE',\n    Int16:  'SHORT',\n    Uint16: 'UNSIGNED_SHORT'\n};\n\n/**\n * Set the attribute pointers in a WebGL context\n * @private\n * @param gl The WebGL context\n * @param program The active WebGL program\n */\nBuffer.prototype.setVertexAttribPointers = function(gl, program) {\n    for (var j = 0; j < this.attributes.length; j++) {\n        var member = this.attributes[j];\n        var attribIndex = program[member.name];\n\n        if (attribIndex !== undefined) {\n            gl.vertexAttribPointer(\n                attribIndex,\n                member.components,\n                gl[AttributeType[member.type]],\n                false,\n                this.arrayType.bytesPerElement,\n                member.offset\n            );\n        }\n    }\n};\n\n/**\n * Destroy the GL buffer bound to the given WebGL context\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.destroy = function(gl) {\n    if (this.buffer) {\n        gl.deleteBuffer(this.buffer);\n    }\n};\n\n/**\n * @enum {string} BufferType\n * @private\n * @readonly\n */\nBuffer.BufferType = {\n    VERTEX: 'ARRAY_BUFFER',\n    ELEMENT: 'ELEMENT_ARRAY_BUFFER'\n};\n\n/**\n * An `BufferType.ELEMENT` buffer holds indicies of a corresponding `BufferType.VERTEX` buffer.\n * These indicies are stored in the `BufferType.ELEMENT` buffer as `UNSIGNED_SHORT`s.\n *\n * @private\n * @readonly\n */\nBuffer.ELEMENT_ATTRIBUTE_TYPE = 'Uint16';\n\n/**\n * WebGL performs best if vertex attribute offsets are aligned to 4 byte boundaries.\n * @private\n * @readonly\n */\nBuffer.VERTEX_ATTRIBUTE_ALIGNMENT = 4;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/buffer.js\n// module id = 151\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = VertexArrayObject;\n\nfunction VertexArrayObject() {\n    this.boundProgram = null;\n    this.boundVertexBuffer = null;\n    this.boundVertexBuffer2 = null;\n    this.boundElementBuffer = null;\n    this.vao = null;\n}\n\nVertexArrayObject.prototype.bind = function(gl, program, vertexBuffer, elementBuffer, vertexBuffer2) {\n\n    if (gl.extVertexArrayObject === undefined) {\n        gl.extVertexArrayObject = gl.getExtension(\"OES_vertex_array_object\");\n    }\n\n    var isFreshBindRequired = (\n        !this.vao ||\n        this.boundProgram !== program ||\n        this.boundVertexBuffer !== vertexBuffer ||\n        this.boundVertexBuffer2 !== vertexBuffer2 ||\n        this.boundElementBuffer !== elementBuffer\n    );\n\n    if (!gl.extVertexArrayObject || isFreshBindRequired) {\n        this.freshBind(gl, program, vertexBuffer, elementBuffer, vertexBuffer2);\n    } else {\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n    }\n};\n\nVertexArrayObject.prototype.freshBind = function(gl, program, vertexBuffer, elementBuffer, vertexBuffer2) {\n    var numPrevAttributes;\n    var numNextAttributes = program.numAttributes;\n\n    if (gl.extVertexArrayObject) {\n        if (this.vao) this.destroy(gl);\n        this.vao = gl.extVertexArrayObject.createVertexArrayOES();\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n        numPrevAttributes = 0;\n\n        // store the arguments so that we can verify them when the vao is bound again\n        this.boundProgram = program;\n        this.boundVertexBuffer = vertexBuffer;\n        this.boundVertexBuffer2 = vertexBuffer2;\n        this.boundElementBuffer = elementBuffer;\n\n    } else {\n        numPrevAttributes = gl.currentNumAttributes || 0;\n\n        // Disable all attributes from the previous program that aren't used in\n        // the new program. Note: attribute indices are *not* program specific!\n        for (var i = numNextAttributes; i < numPrevAttributes; i++) {\n            // WebGL breaks if you disable attribute 0.\n            // http://stackoverflow.com/questions/20305231\n            assert(i !== 0);\n            gl.disableVertexAttribArray(i);\n        }\n    }\n\n    // Enable all attributes for the new program.\n    for (var j = numPrevAttributes; j < numNextAttributes; j++) {\n        gl.enableVertexAttribArray(j);\n    }\n\n    vertexBuffer.bind(gl);\n    vertexBuffer.setVertexAttribPointers(gl, program);\n    if (vertexBuffer2) {\n        vertexBuffer2.bind(gl);\n        vertexBuffer2.setVertexAttribPointers(gl, program);\n    }\n    if (elementBuffer) {\n        elementBuffer.bind(gl);\n    }\n\n    gl.currentNumAttributes = numNextAttributes;\n};\n\nVertexArrayObject.prototype.unbind = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext) {\n        ext.bindVertexArrayOES(null);\n    }\n};\n\nVertexArrayObject.prototype.destroy = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext && this.vao) {\n        ext.deleteVertexArrayOES(this.vao);\n        this.vao = null;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/vertex_array_object.js\n// module id = 152\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\n\nvar EXTENT = require('./bucket').EXTENT;\nvar EXTENT_MIN = EXTENT * -2;\nvar EXTENT_MAX = (EXTENT * 2) - 1;\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @private\n */\nmodule.exports = function loadGeometry(feature) {\n    var scale = EXTENT / feature.extent;\n    var geometry = feature.loadGeometry();\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n        for (var p = 0; p < ring.length; p++) {\n            var point = ring[p];\n            // round here because mapbox-gl-native uses integers to represent\n            // points and we need to do the same to avoid renering differences.\n            point.x = Math.round(point.x * scale);\n            point.y = Math.round(point.y * scale);\n            if (\n                point.x < EXTENT_MIN ||\n                point.x > EXTENT_MAX ||\n                point.y < EXTENT_MIN ||\n                point.y > EXTENT_MAX) {\n                util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n            }\n        }\n    }\n    return geometry;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/load_geometry.js\n// module id = 153\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\nvar WhooTS = require('whoots-js');\nvar Coordinate = require('../geo/coordinate');\n\nmodule.exports = TileCoord;\n\nfunction TileCoord(z, x, y, w) {\n    assert(!isNaN(z) && z >= 0 && z % 1 === 0);\n    assert(!isNaN(x) && x >= 0 && x % 1 === 0);\n    assert(!isNaN(y) && y >= 0 && y % 1 === 0);\n\n    if (isNaN(w)) w = 0;\n\n    this.z = +z;\n    this.x = +x;\n    this.y = +y;\n    this.w = +w;\n\n    // calculate id\n    w *= 2;\n    if (w < 0) w = w * -1 - 1;\n    var dim = 1 << this.z;\n    this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n\n    // for caching pos matrix calculation when rendering\n    this.posMatrix = null;\n}\n\nTileCoord.prototype.toString = function() {\n    return this.z + \"/\" + this.x + \"/\" + this.y;\n};\n\nTileCoord.prototype.toCoordinate = function(sourceMaxZoom) {\n    var zoom = Math.min(this.z, sourceMaxZoom);\n    var tileScale = Math.pow(2, zoom);\n    var row = this.y;\n    var column = this.x + tileScale * this.w;\n    return new Coordinate(column, row, zoom);\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n    var z = id % 32, dim = 1 << z;\n    var xy = ((id - z) / 32);\n    var x = xy % dim, y = ((xy - x) / dim) % dim;\n    var w = Math.floor(xy / (dim * dim));\n    if (w % 2 !== 0) w = w * -1 - 1;\n    w /= 2;\n    return new TileCoord(z, x, y, w);\n};\n\n// given a list of urls, choose a url template and return a tile URL\nTileCoord.prototype.url = function(urls, sourceMaxZoom, scheme) {\n    var bbox = WhooTS.getTileBBox(this.x, this.y, this.z);\n\n    return urls[(this.x + this.y) % urls.length]\n        .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n        .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n        .replace('{x}', this.x)\n        .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)\n        .replace('{bbox-epsg-3857}', bbox);\n};\n\n// Return the coordinate of the parent tile\nTileCoord.prototype.parent = function(sourceMaxZoom) {\n    if (this.z === 0) return null;\n\n    // the id represents an overscaled tile, return the same coordinates with a lower z\n    if (this.z > sourceMaxZoom) {\n        return new TileCoord(this.z - 1, this.x, this.y, this.w);\n    }\n\n    return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n};\n\nTileCoord.prototype.wrapped = function() {\n    return new TileCoord(this.z, this.x, this.y, 0);\n};\n\n// Return the coordinates of the tile's children\nTileCoord.prototype.children = function(sourceMaxZoom) {\n\n    if (this.z >= sourceMaxZoom) {\n        // return a single tile coord representing a an overscaled tile\n        return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n    }\n\n    var z = this.z + 1;\n    var x = this.x * 2;\n    var y = this.y * 2;\n    return [\n        new TileCoord(z, x, y, this.w),\n        new TileCoord(z, x + 1, y, this.w),\n        new TileCoord(z, x, y + 1, this.w),\n        new TileCoord(z, x + 1, y + 1, this.w)\n    ];\n};\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n    if (a.row > b.row) { var t = a; a = b; b = t; }\n    return {\n        x0: a.column,\n        y0: a.row,\n        x1: b.column,\n        y1: b.row,\n        dx: b.column - a.column,\n        dy: b.row - a.row\n    };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n    var y0 = Math.max(ymin, Math.floor(e1.y0));\n    var y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n    // sort edges by x-coordinate\n    if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n            (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n            (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n        var t = e0; e0 = e1; e1 = t;\n    }\n\n    // scan lines!\n    var m0 = e0.dx / e0.dy;\n    var m1 = e1.dx / e1.dy;\n    var d0 = e0.dx > 0; // use y + 1 to compute x0\n    var d1 = e1.dx < 0; // use y + 1 to compute x1\n    for (var y = y0; y < y1; y++) {\n        var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n        var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n        scanLine(Math.floor(x1), Math.ceil(x0), y);\n    }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n    var ab = edge(a, b),\n        bc = edge(b, c),\n        ca = edge(c, a);\n\n    var t;\n\n    // sort edges by y-length\n    if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n    if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n    if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n    // scan span! scan span!\n    if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n    if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ) {\n    var tiles = 1 << z;\n    var t = {};\n\n    function scanLine(x0, x1, y) {\n        var x, wx, coord;\n        if (y >= 0 && y <= tiles) {\n            for (x = x0; x < x1; x++) {\n                wx = (x % tiles + tiles) % tiles;\n                coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles));\n                t[coord.id] = coord;\n            }\n        }\n    }\n\n    // Divide the screen up in two triangles and scan each of them:\n    // +---/\n    // | / |\n    // /---+\n    scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n    scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n    return Object.keys(t).map(function(id) {\n        return t[id];\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile_coord.js\n// module id = 154\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../data/bucket');\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @param {object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work\n * @param {number} pixelValue\n * @param {number} z\n * @returns {number} value in tile units\n * @private\n */\nmodule.exports = function(tile, pixelValue, z) {\n    return pixelValue * (Bucket.EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z)));\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/pixels_to_tile_units.js\n// module id = 155\n// module chunks = 0 1","// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  if (path.length === 0) return '.';\n  var code = path.charCodeAt(0);\n  var hasRoot = code === 47 /*/*/;\n  var end = -1;\n  var matchedSlash = true;\n  for (var i = path.length - 1; i >= 1; --i) {\n    code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        if (!matchedSlash) {\n          end = i;\n          break;\n        }\n      } else {\n      // We saw the first non-path separator\n      matchedSlash = false;\n    }\n  }\n\n  if (end === -1) return hasRoot ? '/' : '.';\n  if (hasRoot && end === 1) {\n    // return '//';\n    // Backwards-compat fix:\n    return '/';\n  }\n  return path.slice(0, end);\n};\n\nfunction basename(path) {\n  if (typeof path !== 'string') path = path + '';\n\n  var start = 0;\n  var end = -1;\n  var matchedSlash = true;\n  var i;\n\n  for (i = path.length - 1; i >= 0; --i) {\n    if (path.charCodeAt(i) === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          start = i + 1;\n          break;\n        }\n      } else if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // path component\n      matchedSlash = false;\n      end = i + 1;\n    }\n  }\n\n  if (end === -1) return '';\n  return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n  var f = basename(path);\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\nexports.extname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  var startDot = -1;\n  var startPart = 0;\n  var end = -1;\n  var matchedSlash = true;\n  // Track the state of characters (if any) we see before our first dot and\n  // after any path separator we find\n  var preDotState = 0;\n  for (var i = path.length - 1; i >= 0; --i) {\n    var code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          startPart = i + 1;\n          break;\n        }\n        continue;\n      }\n    if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // extension\n      matchedSlash = false;\n      end = i + 1;\n    }\n    if (code === 46 /*.*/) {\n        // If this is our first dot, mark it as the start of our extension\n        if (startDot === -1)\n          startDot = i;\n        else if (preDotState !== 1)\n          preDotState = 1;\n    } else if (startDot !== -1) {\n      // We saw a non-dot and non-path separator before our dot, so we should\n      // have a good chance at having a non-empty extension\n      preDotState = -1;\n    }\n  }\n\n  if (startDot === -1 || end === -1 ||\n      // We saw a non-dot character immediately before the dot\n      preDotState === 0 ||\n      // The (right-most) trimmed path component is exactly '..'\n      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n    return '';\n  }\n  return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/path-browserify/index.js\n// module id = 156\n// module chunks = 0 1","var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/global/window.js\n// module id = 157\n// module chunks = 0 1","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isArray.js\n// module id = 158\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_root.js\n// module id = 159\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\n\nmodule.exports = function validateObject(options) {\n    var key = options.key;\n    var object = options.value;\n    var valueSpec = options.valueSpec;\n    var objectElementValidators = options.objectElementValidators || {};\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var errors = [];\n\n    var type = getType(object);\n    if (type !== 'object') {\n        return [new ValidationError(key, object, 'object expected, %s found', type)];\n    }\n\n    for (var objectKey in object) {\n        var valueSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n        var objectElementSpec = valueSpec && (valueSpec[valueSpecKey] || valueSpec['*']);\n        var objectElementValidator = objectElementValidators[valueSpecKey] || objectElementValidators['*'];\n\n        if (objectElementSpec || objectElementValidator) {\n            errors = errors.concat((objectElementValidator || validate)({\n                key: (key ? key + '.' : key) + objectKey,\n                value: object[objectKey],\n                valueSpec: objectElementSpec,\n                style: style,\n                styleSpec: styleSpec,\n                object: object,\n                objectKey: objectKey\n            }));\n\n        // tolerate root-level extra keys & arbitrary layer properties\n        // TODO remove this layer-specific logic\n        } else if (key !== '' && key.split('.').length !== 1) {\n            errors.push(new ValidationError(key, object[objectKey], 'unknown property \"%s\"', objectKey));\n        }\n    }\n\n    for (valueSpecKey in valueSpec) {\n        if (valueSpec[valueSpecKey].required && valueSpec[valueSpecKey]['default'] === undefined && object[valueSpecKey] === undefined) {\n            errors.push(new ValidationError(key, object, 'missing required property \"%s\"', valueSpecKey));\n        }\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_object.js\n// module id = 160\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Buffer;\n\n/**\n * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n *\n * @class Buffer\n * @private\n * @param {object} array A serialized StructArray.\n * @param {object} arrayType A serialized StructArrayType.\n * @param {BufferType} type\n */\nfunction Buffer(array, arrayType, type) {\n    this.arrayBuffer = array.arrayBuffer;\n    this.length = array.length;\n    this.attributes = arrayType.members;\n    this.itemSize = arrayType.bytesPerElement;\n    this.type = type;\n    this.arrayType = arrayType;\n}\n\n/**\n * Bind this buffer to a WebGL context.\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.bind = function(gl) {\n    var type = gl[this.type];\n\n    if (!this.buffer) {\n        this.buffer = gl.createBuffer();\n        gl.bindBuffer(type, this.buffer);\n        gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW);\n\n        // dump array buffer once it's bound to gl\n        this.arrayBuffer = null;\n    } else {\n        gl.bindBuffer(type, this.buffer);\n    }\n};\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nvar AttributeType = {\n    Int8:   'BYTE',\n    Uint8:  'UNSIGNED_BYTE',\n    Int16:  'SHORT',\n    Uint16: 'UNSIGNED_SHORT'\n};\n\n/**\n * Set the attribute pointers in a WebGL context\n * @private\n * @param gl The WebGL context\n * @param program The active WebGL program\n */\nBuffer.prototype.setVertexAttribPointers = function(gl, program) {\n    for (var j = 0; j < this.attributes.length; j++) {\n        var member = this.attributes[j];\n        var attribIndex = program[member.name];\n\n        if (attribIndex !== undefined) {\n            gl.vertexAttribPointer(\n                attribIndex,\n                member.components,\n                gl[AttributeType[member.type]],\n                false,\n                this.arrayType.bytesPerElement,\n                member.offset\n            );\n        }\n    }\n};\n\n/**\n * Destroy the GL buffer bound to the given WebGL context\n * @private\n * @param gl The WebGL context\n */\nBuffer.prototype.destroy = function(gl) {\n    if (this.buffer) {\n        gl.deleteBuffer(this.buffer);\n    }\n};\n\n/**\n * @enum {string} BufferType\n * @private\n * @readonly\n */\nBuffer.BufferType = {\n    VERTEX: 'ARRAY_BUFFER',\n    ELEMENT: 'ELEMENT_ARRAY_BUFFER'\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/buffer.js\n// module id = 161\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = VertexArrayObject;\n\nfunction VertexArrayObject() {\n    this.boundProgram = null;\n    this.boundVertexBuffer = null;\n    this.boundVertexBuffer2 = null;\n    this.boundElementBuffer = null;\n    this.vao = null;\n}\n\nVertexArrayObject.prototype.bind = function(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2) {\n\n    if (gl.extVertexArrayObject === undefined) {\n        gl.extVertexArrayObject = gl.getExtension(\"OES_vertex_array_object\");\n    }\n\n    var isFreshBindRequired = (\n        !this.vao ||\n        this.boundProgram !== program ||\n        this.boundVertexBuffer !== layoutVertexBuffer ||\n        this.boundVertexBuffer2 !== vertexBuffer2 ||\n        this.boundElementBuffer !== elementBuffer\n    );\n\n    if (!gl.extVertexArrayObject || isFreshBindRequired) {\n        this.freshBind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2);\n    } else {\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n    }\n};\n\nVertexArrayObject.prototype.freshBind = function(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2) {\n    var numPrevAttributes;\n    var numNextAttributes = program.numAttributes;\n\n    if (gl.extVertexArrayObject) {\n        if (this.vao) this.destroy(gl);\n        this.vao = gl.extVertexArrayObject.createVertexArrayOES();\n        gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n        numPrevAttributes = 0;\n\n        // store the arguments so that we can verify them when the vao is bound again\n        this.boundProgram = program;\n        this.boundVertexBuffer = layoutVertexBuffer;\n        this.boundVertexBuffer2 = vertexBuffer2;\n        this.boundElementBuffer = elementBuffer;\n\n    } else {\n        numPrevAttributes = gl.currentNumAttributes || 0;\n\n        // Disable all attributes from the previous program that aren't used in\n        // the new program. Note: attribute indices are *not* program specific!\n        for (var i = numNextAttributes; i < numPrevAttributes; i++) {\n            // WebGL breaks if you disable attribute 0.\n            // http://stackoverflow.com/questions/20305231\n            assert(i !== 0);\n            gl.disableVertexAttribArray(i);\n        }\n    }\n\n    // Enable all attributes for the new program.\n    for (var j = numPrevAttributes; j < numNextAttributes; j++) {\n        gl.enableVertexAttribArray(j);\n    }\n\n    layoutVertexBuffer.bind(gl);\n    layoutVertexBuffer.setVertexAttribPointers(gl, program);\n    if (vertexBuffer2) {\n        vertexBuffer2.bind(gl);\n        vertexBuffer2.setVertexAttribPointers(gl, program);\n    }\n    if (elementBuffer) {\n        elementBuffer.bind(gl);\n    }\n\n    gl.currentNumAttributes = numNextAttributes;\n};\n\nVertexArrayObject.prototype.unbind = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext) {\n        ext.bindVertexArrayOES(null);\n    }\n};\n\nVertexArrayObject.prototype.destroy = function(gl) {\n    var ext = gl.extVertexArrayObject;\n    if (ext && this.vao) {\n        ext.deleteVertexArrayOES(this.vao);\n        this.vao = null;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/vertex_array_object.js\n// module id = 162\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar EXTENT = require('./bucket').EXTENT;\nvar assert = require('assert');\n\n\n// These bounds define the minimum and maximum supported coordinate values.\n// While visible coordinates are within [0, EXTENT], tiles may theoretically\n// contain cordinates within [-Infinity, Infinity]. Our range is limited by the\n// number of bits used to represent the coordinate.\nfunction createBounds(bits) {\n    return {\n        min: -1 * Math.pow(2, bits - 1),\n        max: Math.pow(2, bits - 1) - 1\n    };\n}\n\nvar boundsLookup = {\n    15: createBounds(15),\n    16: createBounds(16)\n};\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @param {VectorTileFeature} feature\n * @param {number} [bits=16] The number of signed integer bits available to store\n *   each coordinate. A warning will be issued if any coordinate will not fits\n *   in the specified number of bits.\n * @private\n */\nmodule.exports = function loadGeometry(feature, bits) {\n    var bounds = boundsLookup[bits || 16];\n    assert(bounds);\n\n    var scale = EXTENT / feature.extent;\n    var geometry = feature.loadGeometry();\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n        for (var p = 0; p < ring.length; p++) {\n            var point = ring[p];\n            // round here because mapbox-gl-native uses integers to represent\n            // points and we need to do the same to avoid renering differences.\n            point.x = Math.round(point.x * scale);\n            point.y = Math.round(point.y * scale);\n\n            if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) {\n                util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n            }\n        }\n    }\n    return geometry;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/load_geometry.js\n// module id = 163\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\nvar WhooTS = require('whoots-js');\nvar Coordinate = require('../geo/coordinate');\n\nmodule.exports = TileCoord;\n\nfunction TileCoord(z, x, y, w) {\n    assert(!isNaN(z) && z >= 0 && z % 1 === 0);\n    assert(!isNaN(x) && x >= 0 && x % 1 === 0);\n    assert(!isNaN(y) && y >= 0 && y % 1 === 0);\n\n    if (isNaN(w)) w = 0;\n\n    this.z = +z;\n    this.x = +x;\n    this.y = +y;\n    this.w = +w;\n\n    // calculate id\n    w *= 2;\n    if (w < 0) w = w * -1 - 1;\n    var dim = 1 << this.z;\n    this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n\n    // for caching pos matrix calculation when rendering\n    this.posMatrix = null;\n}\n\nTileCoord.prototype.toString = function() {\n    return this.z + \"/\" + this.x + \"/\" + this.y;\n};\n\nTileCoord.prototype.toCoordinate = function(sourceMaxZoom) {\n    var zoom = Math.min(this.z, sourceMaxZoom);\n    var tileScale = Math.pow(2, zoom);\n    var row = this.y;\n    var column = this.x + tileScale * this.w;\n    return new Coordinate(column, row, zoom);\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n    var z = id % 32, dim = 1 << z;\n    var xy = ((id - z) / 32);\n    var x = xy % dim, y = ((xy - x) / dim) % dim;\n    var w = Math.floor(xy / (dim * dim));\n    if (w % 2 !== 0) w = w * -1 - 1;\n    w /= 2;\n    return new TileCoord(z, x, y, w);\n};\n\nfunction getQuadkey(z, x, y) {\n    var quadkey = '', mask;\n    for (var i = z; i > 0; i--) {\n        mask = 1 << (i - 1);\n        quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));\n    }\n    return quadkey;\n}\n\n// given a list of urls, choose a url template and return a tile URL\nTileCoord.prototype.url = function(urls, sourceMaxZoom, scheme) {\n    var bbox = WhooTS.getTileBBox(this.x, this.y, this.z);\n    var quadkey = getQuadkey(this.z, this.x, this.y);\n\n    return urls[(this.x + this.y) % urls.length]\n        .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n        .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n        .replace('{x}', this.x)\n        .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)\n        .replace('{quadkey}', quadkey)\n        .replace('{bbox-epsg-3857}', bbox);\n};\n\n// Return the coordinate of the parent tile\nTileCoord.prototype.parent = function(sourceMaxZoom) {\n    if (this.z === 0) return null;\n\n    // the id represents an overscaled tile, return the same coordinates with a lower z\n    if (this.z > sourceMaxZoom) {\n        return new TileCoord(this.z - 1, this.x, this.y, this.w);\n    }\n\n    return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n};\n\nTileCoord.prototype.wrapped = function() {\n    return new TileCoord(this.z, this.x, this.y, 0);\n};\n\n// Return the coordinates of the tile's children\nTileCoord.prototype.children = function(sourceMaxZoom) {\n\n    if (this.z >= sourceMaxZoom) {\n        // return a single tile coord representing a an overscaled tile\n        return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n    }\n\n    var z = this.z + 1;\n    var x = this.x * 2;\n    var y = this.y * 2;\n    return [\n        new TileCoord(z, x, y, this.w),\n        new TileCoord(z, x + 1, y, this.w),\n        new TileCoord(z, x, y + 1, this.w),\n        new TileCoord(z, x + 1, y + 1, this.w)\n    ];\n};\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n    if (a.row > b.row) { var t = a; a = b; b = t; }\n    return {\n        x0: a.column,\n        y0: a.row,\n        x1: b.column,\n        y1: b.row,\n        dx: b.column - a.column,\n        dy: b.row - a.row\n    };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n    var y0 = Math.max(ymin, Math.floor(e1.y0));\n    var y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n    // sort edges by x-coordinate\n    if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n            (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n            (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n        var t = e0; e0 = e1; e1 = t;\n    }\n\n    // scan lines!\n    var m0 = e0.dx / e0.dy;\n    var m1 = e1.dx / e1.dy;\n    var d0 = e0.dx > 0; // use y + 1 to compute x0\n    var d1 = e1.dx < 0; // use y + 1 to compute x1\n    for (var y = y0; y < y1; y++) {\n        var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n        var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n        scanLine(Math.floor(x1), Math.ceil(x0), y);\n    }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n    var ab = edge(a, b),\n        bc = edge(b, c),\n        ca = edge(c, a);\n\n    var t;\n\n    // sort edges by y-length\n    if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n    if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n    if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n    // scan span! scan span!\n    if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n    if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ) {\n    var tiles = 1 << z;\n    var t = {};\n\n    function scanLine(x0, x1, y) {\n        var x, wx, coord;\n        if (y >= 0 && y <= tiles) {\n            for (x = x0; x < x1; x++) {\n                wx = (x % tiles + tiles) % tiles;\n                coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles));\n                t[coord.id] = coord;\n            }\n        }\n    }\n\n    // Divide the screen up in two triangles and scan each of them:\n    // +---/\n    // | / |\n    // /---+\n    scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n    scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n    return Object.keys(t).map(function(id) {\n        return t[id];\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/tile_coord.js\n// module id = 164\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../data/bucket');\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @param {object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work\n * @param {number} pixelValue\n * @param {number} z\n * @returns {number} value in tile units\n * @private\n */\nmodule.exports = function(tile, pixelValue, z) {\n    return pixelValue * (Bucket.EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z)));\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/pixels_to_tile_units.js\n// module id = 165\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar Evented = require('../../util/evented');\nmodule.exports = Control;\n\n/**\n * The base class for map-related interface elements.\n *\n * The `Control` class mixes in [`Evented`](#Evented) methods.\n *\n * @class Control\n */\nfunction Control() {}\n\nControl.prototype = {\n    /**\n     * Adds the control to a map.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the control to.\n     * @returns {Control} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        var container = this._container = this.onAdd(map);\n        if (this.options && this.options.position) {\n            var pos = this.options.position;\n            var corner = map._controlCorners[pos];\n            container.className += ' mapboxgl-ctrl';\n            if (pos.indexOf('bottom') !== -1) {\n                corner.insertBefore(container, corner.firstChild);\n            } else {\n                corner.appendChild(container);\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Removes the control from the map it has been added to.\n     *\n     * @returns {Control} `this`\n     */\n    remove: function() {\n        this._container.parentNode.removeChild(this._container);\n        if (this.onRemove) this.onRemove(this._map);\n        this._map = null;\n        return this;\n    }\n};\n\nutil.extend(Control.prototype, Evented);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/control/control.js\n// module id = 166\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar pushHash = function pushHash(hash) {\n  hash = hash ? hash.indexOf('#') === 0 ? hash : '#' + hash : '';\n\n  if (history.pushState) {\n    var loc = window.location;\n    history.pushState(null, null, hash ? hash\n    // remove hash\n    : loc.pathname + loc.search);\n  } else {\n    location.hash = hash;\n  }\n};\n\nvar getHash = function getHash() {\n  return window.location.hash.replace(/^#/, '');\n};\n\nvar filterElementInContainer = function filterElementInContainer(container) {\n  return function (element) {\n    return container.contains ? container != element && container.contains(element) : !!(container.compareDocumentPosition(element) & 16);\n  };\n};\n\nvar scrollOffset = function scrollOffset(c, t) {\n  return c === document ? t.getBoundingClientRect().top + (window.scrollY || window.pageYOffset) : getComputedStyle(c).position === \"relative\" ? t.offsetTop : t.getBoundingClientRect().top + c.scrollTop;\n};\n\nexports.default = {\n  pushHash: pushHash,\n  getHash: getHash,\n  filterElementInContainer: filterElementInContainer,\n  scrollOffset: scrollOffset\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/utils.js\n// module id = 167\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar contains = exports.contains = function contains(bit, value) {\n    return (bit & value) !== 0;\n};\n\nvar distance = exports.distance = function distance(a, b) {\n    return Math.sqrt(a * a + b * b);\n};\n\nvar copyCSSStyles = exports.copyCSSStyles = function copyCSSStyles(style, target) {\n    // Edge does not provide value for cssText\n    for (var i = style.length - 1; i >= 0; i--) {\n        var property = style.item(i);\n        // Safari shows pseudoelements if content is set\n        if (property !== 'content') {\n            target.style.setProperty(property, style.getPropertyValue(property));\n        }\n    }\n    return target;\n};\n\nvar SMALL_IMAGE = exports.SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Util.js\n// module id = 168\n// module chunks = 0 1","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: require('./_library') ? 'pure' : 'global',\n  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js\n// module id = 169\n// module chunks = 0 1","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js\n// module id = 170\n// module chunks = 0 1","exports.f = {}.propertyIsEnumerable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js\n// module id = 171\n// module chunks = 0 1","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js\n// module id = 172\n// module chunks = 0 1","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js\n// module id = 173\n// module chunks = 0 1","/*!\n * Cookies.js - 0.4.0\n *\n * Copyright (c) 2014, Scott Hamper\n * Licensed under the MIT license,\n * http://www.opensource.org/licenses/MIT\n */\n(function (undefined) {\n    'use strict';\n\n    var Cookies = function (key, value, options) {\n        return arguments.length === 1 ?\n            Cookies.get(key) : Cookies.set(key, value, options);\n    };\n\n    // Allows for setter injection in unit tests\n    Cookies._document = document;\n    Cookies._navigator = navigator;\n\n    Cookies.defaults = {\n        path: '/'\n    };\n\n    Cookies.get = function (key) {\n        if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\n            Cookies._renewCache();\n        }\n\n        return Cookies._cache[key];\n    };\n\n    Cookies.set = function (key, value, options) {\n        options = Cookies._getExtendedOptions(options);\n        options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\n\n        Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\n\n        return Cookies;\n    };\n\n    Cookies.expire = function (key, options) {\n        return Cookies.set(key, undefined, options);\n    };\n\n    Cookies._getExtendedOptions = function (options) {\n        return {\n            path: options && options.path || Cookies.defaults.path,\n            domain: options && options.domain || Cookies.defaults.domain,\n            expires: options && options.expires || Cookies.defaults.expires,\n            secure: options && options.secure !== undefined ?  options.secure : Cookies.defaults.secure\n        };\n    };\n\n    Cookies._isValidDate = function (date) {\n        return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\n    };\n\n    Cookies._getExpiresDate = function (expires, now) {\n        now = now || new Date();\n        switch (typeof expires) {\n            case 'number': expires = new Date(now.getTime() + expires * 1000); break;\n            case 'string': expires = new Date(expires); break;\n        }\n\n        if (expires && !Cookies._isValidDate(expires)) {\n            throw new Error('`expires` parameter cannot be converted to a valid Date instance');\n        }\n\n        return expires;\n    };\n\n    Cookies._generateCookieString = function (key, value, options) {\n        key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\n        key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n        value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\n        options = options || {};\n\n        var cookieString = key + '=' + value;\n        cookieString += options.path ? ';path=' + options.path : '';\n        cookieString += options.domain ? ';domain=' + options.domain : '';\n        cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\n        cookieString += options.secure ? ';secure' : '';\n\n        return cookieString;\n    };\n\n    Cookies._getCookieObjectFromString = function (documentCookie) {\n        var cookieObject = {};\n        var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\n\n        for (var i = 0; i < cookiesArray.length; i++) {\n            var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\n\n            if (cookieObject[cookieKvp.key] === undefined) {\n                cookieObject[cookieKvp.key] = cookieKvp.value;\n            }\n        }\n\n        return cookieObject;\n    };\n\n    Cookies._getKeyValuePairFromCookieString = function (cookieString) {\n        // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\n        var separatorIndex = cookieString.indexOf('=');\n\n        // IE omits the \"=\" when the cookie value is an empty string\n        separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\n\n        return {\n            key: decodeURIComponent(cookieString.substr(0, separatorIndex)),\n            value: decodeURIComponent(cookieString.substr(separatorIndex + 1))\n        };\n    };\n\n    Cookies._renewCache = function () {\n        Cookies._cache = Cookies._getCookieObjectFromString(Cookies._document.cookie);\n        Cookies._cachedDocumentCookie = Cookies._document.cookie;\n    };\n\n    Cookies._areEnabled = function () {\n        var testKey = 'cookies.js';\n        var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\n        Cookies.expire(testKey);\n        return areEnabled;\n    };\n\n    Cookies.enabled = Cookies._areEnabled();\n\n    // AMD support\n    if (typeof define === 'function' && define.amd) {\n        define(function () { return Cookies; });\n    // CommonJS and Node.js module support.\n    } else if (typeof exports !== 'undefined') {\n        // Support Node.js specific `module.exports` (which can be a function)\n        if (typeof module !== 'undefined' && module.exports) {\n            exports = module.exports = Cookies;\n        }\n        // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)\n        exports.Cookies = Cookies;\n    } else {\n        window.Cookies = Cookies;\n    }\n})();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/cookies-js/src/cookies.js\n// module id = 174\n// module chunks = 0 1","import i18n from 'i18next';\n\nexport const getPreferredLanguage = () => (window as any).gon && (window as any).gon.preferred_language;\n\nexport const currentLanguage = getPreferredLanguage();\n\nexport const shouldTranslate = () => (window as any).gon.standalone && currentLanguage && (currentLanguage.toLowerCase().indexOf('en') !== 0);\n\ni18n\n  .init({\n    resources: {\n      'es' : {\n        'report': require('../locales/es/report.json')\n      },\n      'en' : {\n        'report': require('../locales/en/report.json')\n      }\n    },\n    lng: currentLanguage || 'en',\n    lowerCaseLng: true,\n    nonExplicitWhitelist: true,\n    whitelist: ['en', 'es'],\n    fallbackLng: 'en',\n\n    // have a report namespace used around the full app\n    ns: ['report'],\n    defaultNS: 'report',\n\n    debug: false,\n\n    interpolation: {\n      escapeValue: false // not needed for react!!\n    }\n  })\n  .changeLanguage(currentLanguage);\n\n\nexport default i18n;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/i18n.ts","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n  validateFormat = function validateFormat(format) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n  validateFormat(format);\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(format.replace(/%s/g, function () {\n        return args[argIndex++];\n      }));\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n}\n\nmodule.exports = invariant;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/invariant.js\n// module id = 177\n// module chunks = 0 1","'use strict';\n\nexports.DefaultRoute = require('./components/DefaultRoute');\nexports.Link = require('./components/Link');\nexports.NotFoundRoute = require('./components/NotFoundRoute');\nexports.Redirect = require('./components/Redirect');\nexports.Route = require('./components/Route');\nexports.ActiveHandler = require('./components/RouteHandler');\nexports.RouteHandler = exports.ActiveHandler;\n\nexports.HashLocation = require('./locations/HashLocation');\nexports.HistoryLocation = require('./locations/HistoryLocation');\nexports.RefreshLocation = require('./locations/RefreshLocation');\nexports.StaticLocation = require('./locations/StaticLocation');\nexports.TestLocation = require('./locations/TestLocation');\n\nexports.ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior');\nexports.ScrollToTopBehavior = require('./behaviors/ScrollToTopBehavior');\n\nexports.History = require('./History');\nexports.Navigation = require('./Navigation');\nexports.State = require('./State');\n\nexports.createRoute = require('./Route').createRoute;\nexports.createDefaultRoute = require('./Route').createDefaultRoute;\nexports.createNotFoundRoute = require('./Route').createNotFoundRoute;\nexports.createRedirect = require('./Route').createRedirect;\nexports.createRoutesFromReactChildren = require('./createRoutesFromReactChildren');\n\nexports.create = require('./createRouter');\nexports.run = require('./runRouter');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/index.js\n// module id = 178\n// module chunks = 0 1","\"use strict\";\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require(\"react\");\nvar ContextWrapper = require(\"./ContextWrapper\");\nvar assign = require(\"object-assign\");\nvar PropTypes = require(\"../PropTypes\");\n\nvar REF_NAME = \"__routeHandler__\";\n\n/**\n * A <RouteHandler> component renders the active child route handler\n * when routes are nested.\n */\n\nvar RouteHandler = (function (_React$Component) {\n  _inherits(RouteHandler, _React$Component);\n\n  function RouteHandler() {\n    _classCallCheck(this, RouteHandler);\n\n    _get(Object.getPrototypeOf(RouteHandler.prototype), \"constructor\", this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(RouteHandler, [{\n    key: \"getChildContext\",\n    value: function getChildContext() {\n      return {\n        routeDepth: this.context.routeDepth + 1\n      };\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this._updateRouteComponent(this[REF_NAME]);\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      this._updateRouteComponent(this[REF_NAME]);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this._updateRouteComponent(null);\n    }\n  }, {\n    key: \"_updateRouteComponent\",\n    value: function _updateRouteComponent(component) {\n      this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component);\n    }\n  }, {\n    key: \"getRouteDepth\",\n    value: function getRouteDepth() {\n      return this.context.routeDepth;\n    }\n  }, {\n    key: \"createChildRouteHandler\",\n    value: function createChildRouteHandler(props) {\n      var _this = this;\n\n      var route = this.context.router.getRouteAtDepth(this.getRouteDepth());\n\n      if (route == null) return null;\n\n      var childProps = assign({}, props || this.props, {\n        ref: function ref(_ref) {\n          return _this[REF_NAME] = _ref;\n        },\n        params: this.context.router.getCurrentParams(),\n        query: this.context.router.getCurrentQuery()\n      });\n\n      return React.createElement(route.handler, childProps);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var handler = this.createChildRouteHandler();\n      // <script/> for things like <CSSTransitionGroup/> that don't like null\n      return handler ? React.createElement(\n        ContextWrapper,\n        null,\n        handler\n      ) : React.createElement(\"script\", null);\n    }\n  }]);\n\n  return RouteHandler;\n})(React.Component);\n\nRouteHandler.contextTypes = {\n  routeDepth: PropTypes.number.isRequired,\n  router: PropTypes.router.isRequired\n};\n\nRouteHandler.childContextTypes = {\n  routeDepth: PropTypes.number.isRequired\n};\n\nmodule.exports = RouteHandler;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/RouteHandler.js\n// module id = 179\n// module chunks = 0 1","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require('react');\nvar invariant = require('invariant');\nvar PropTypes = require('../PropTypes');\nvar RouteHandler = require('./RouteHandler');\n\n/**\n * <Route> components specify components that are rendered to the page when the\n * URL matches a given pattern.\n *\n * Routes are arranged in a nested tree structure. When a new URL is requested,\n * the tree is searched depth-first to find a route whose path matches the URL.\n * When one is found, all routes in the tree that lead to it are considered\n * \"active\" and their components are rendered into the DOM, nested in the same\n * order as they are in the tree.\n *\n * The preferred way to configure a router is using JSX. The XML-like syntax is\n * a great way to visualize how routes are laid out in an application.\n *\n *   var routes = [\n *     <Route handler={App}>\n *       <Route name=\"login\" handler={Login}/>\n *       <Route name=\"logout\" handler={Logout}/>\n *       <Route name=\"about\" handler={About}/>\n *     </Route>\n *   ];\n *   \n *   Router.run(routes, function (Handler) {\n *     React.render(<Handler/>, document.body);\n *   });\n *\n * Handlers for Route components that contain children can render their active\n * child route using a <RouteHandler> element.\n *\n *   var App = React.createClass({\n *     render: function () {\n *       return (\n *         <div className=\"application\">\n *           <RouteHandler/>\n *         </div>\n *       );\n *     }\n *   });\n *\n * If no handler is provided for the route, it will render a matched child route.\n */\n\nvar Route = (function (_React$Component) {\n  _inherits(Route, _React$Component);\n\n  function Route() {\n    _classCallCheck(this, Route);\n\n    _get(Object.getPrototypeOf(Route.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(Route, [{\n    key: 'render',\n    value: function render() {\n      invariant(false, '%s elements are for router configuration only and should not be rendered', this.constructor.name);\n    }\n  }]);\n\n  return Route;\n})(React.Component);\n\nRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.string,\n  handler: PropTypes.func,\n  ignoreScrollBehavior: PropTypes.bool\n};\n\nRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = Route;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/Route.js\n// module id = 180\n// module chunks = 0 1","var canUseDOM = !!(\n  typeof window !== 'undefined' &&\n  window.document &&\n  window.document.createElement\n);\n\nmodule.exports = canUseDOM;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/can-use-dom/index.js\n// module id = 181\n// module chunks = 0 1","import EventEmitter from 'events';\nimport React from 'react';\nimport _ from 'lodash';\n\nconst overlayEvents = new EventEmitter();\nlet overlayItems = {};\n\nconst show = (key, component) => {\n  overlayItems = _.clone(overlayItems);\n  overlayItems[key] = component;\n  overlayEvents.emit('change');\n  return true;\n};\n\nconst hide = (key) => {\n  overlayItems = _.omit(overlayItems, key);\n  overlayEvents.emit('change');\n  return true;\n};\n\nclass Overlays extends React.Component {\n\n  static show() { show(...arguments) };\n  static hide() { hide(...arguments) };\n\n  show() { show(...arguments); };\n  hide() { hide(...arguments); };\n\n  state = {\n    items: overlayItems\n  };\n\n  componentDidMount() {\n    overlayEvents.on('change', this.handleChange);\n  }\n\n  componentWillUnmount() {\n    overlayEvents.removeListener('change', this.handleChange);\n  }\n\n  handleChange = () => {\n    this.setState({\n      items: overlayItems\n    });\n  }\n\n  render() {\n    return (\n      <span className=\"ui-overlays\">\n        {_.toArray(this.state.items)}\n      </span>\n    );\n  }\n}\n\nexport default Overlays;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/overlays.js","/**\n * Module dependencies.\n */\n\nvar Emitter = require('emitter');\nvar reduce = require('reduce');\n\n/**\n * Root reference for iframes.\n */\n\nvar root = 'undefined' == typeof window\n  ? (this || self)\n  : window;\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * TODO: future proof, move to compoent land\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isHost(obj) {\n  var str = {}.toString.call(obj);\n\n  switch (str) {\n    case '[object File]':\n    case '[object Blob]':\n    case '[object FormData]':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n  if (root.XMLHttpRequest\n      && (!root.location || 'file:' != root.location.protocol\n          || !root.ActiveXObject)) {\n    return new XMLHttpRequest;\n  } else {\n    try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n  }\n  return false;\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n  ? function(s) { return s.trim(); }\n  : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n  return obj === Object(obj);\n}\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n  if (!isObject(obj)) return obj;\n  var pairs = [];\n  for (var key in obj) {\n    if (null != obj[key]) {\n      pairs.push(encodeURIComponent(key)\n        + '=' + encodeURIComponent(obj[key]));\n    }\n  }\n  return pairs.join('&');\n}\n\n/**\n * Expose serialization method.\n */\n\n request.serializeObject = serialize;\n\n /**\n  * Parse the given x-www-form-urlencoded `str`.\n  *\n  * @param {String} str\n  * @return {Object}\n  * @api private\n  */\n\nfunction parseString(str) {\n  var obj = {};\n  var pairs = str.split('&');\n  var parts;\n  var pair;\n\n  for (var i = 0, len = pairs.length; i < len; ++i) {\n    pair = pairs[i];\n    parts = pair.split('=');\n    obj[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);\n  }\n\n  return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n *     superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n  html: 'text/html',\n  json: 'application/json',\n  xml: 'application/xml',\n  urlencoded: 'application/x-www-form-urlencoded',\n  'form': 'application/x-www-form-urlencoded',\n  'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n *     superagent.serialize['application/xml'] = function(obj){\n *       return 'generated xml here';\n *     };\n *\n */\n\n request.serialize = {\n   'application/x-www-form-urlencoded': serialize,\n   'application/json': JSON.stringify\n };\n\n /**\n  * Default parsers.\n  *\n  *     superagent.parse['application/xml'] = function(str){\n  *       return { object parsed from str };\n  *     };\n  *\n  */\n\nrequest.parse = {\n  'application/x-www-form-urlencoded': parseString,\n  'application/json': JSON.parse\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n  var lines = str.split(/\\r?\\n/);\n  var fields = {};\n  var index;\n  var line;\n  var field;\n  var val;\n\n  lines.pop(); // trailing CRLF\n\n  for (var i = 0, len = lines.length; i < len; ++i) {\n    line = lines[i];\n    index = line.indexOf(':');\n    field = line.slice(0, index).toLowerCase();\n    val = trim(line.slice(index + 1));\n    fields[field] = val;\n  }\n\n  return fields;\n}\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction type(str){\n  return str.split(/ *; */).shift();\n};\n\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction params(str){\n  return reduce(str.split(/ *; */), function(obj, str){\n    var parts = str.split(/ *= */)\n      , key = parts.shift()\n      , val = parts.shift();\n\n    if (key && val) obj[key] = val;\n    return obj;\n  }, {});\n};\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n *  - set flags (.ok, .error, etc)\n *  - parse header\n *\n * Examples:\n *\n *  Aliasing `superagent` as `request` is nice:\n *\n *      request = superagent;\n *\n *  We can use the promise-like API, or pass callbacks:\n *\n *      request.get('/').end(function(res){});\n *      request.get('/', function(res){});\n *\n *  Sending data can be chained:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' })\n *        .end(function(res){});\n *\n *  Or passed to `.send()`:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' }, function(res){});\n *\n *  Or passed to `.post()`:\n *\n *      request\n *        .post('/user', { name: 'tj' })\n *        .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n *      request\n *        .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req, options) {\n  options = options || {};\n  this.req = req;\n  this.xhr = this.req.xhr;\n  // responseText is accessible only if responseType is '' or 'text' and on older browsers\n  this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n     ? this.xhr.responseText\n     : null;\n  this.statusText = this.req.xhr.statusText;\n  this.setStatusProperties(this.xhr.status);\n  this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n  // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n  // getResponseHeader still works. so we get content-type even if getting\n  // other headers fails.\n  this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n  this.setHeaderProperties(this.header);\n  this.body = this.req.method != 'HEAD'\n    ? this.parseBody(this.text ? this.text : this.xhr.response)\n    : null;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponse.prototype.get = function(field){\n  return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n *   - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponse.prototype.setHeaderProperties = function(header){\n  // content-type\n  var ct = this.header['content-type'] || '';\n  this.type = type(ct);\n\n  // params\n  var obj = params(ct);\n  for (var key in obj) this[key] = obj[key];\n};\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype.parseBody = function(str){\n  var parse = request.parse[this.type];\n  return parse && str && (str.length || str instanceof Object)\n    ? parse(str)\n    : null;\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n *   - .noContent\n *   - .badRequest\n *   - .unauthorized\n *   - .notAcceptable\n *   - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponse.prototype.setStatusProperties = function(status){\n  // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n  if (status === 1223) {\n    status = 204;\n  }\n\n  var type = status / 100 | 0;\n\n  // status / class\n  this.status = status;\n  this.statusType = type;\n\n  // basics\n  this.info = 1 == type;\n  this.ok = 2 == type;\n  this.clientError = 4 == type;\n  this.serverError = 5 == type;\n  this.error = (4 == type || 5 == type)\n    ? this.toError()\n    : false;\n\n  // sugar\n  this.accepted = 202 == status;\n  this.noContent = 204 == status;\n  this.badRequest = 400 == status;\n  this.unauthorized = 401 == status;\n  this.notAcceptable = 406 == status;\n  this.notFound = 404 == status;\n  this.forbidden = 403 == status;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n  var req = this.req;\n  var method = req.method;\n  var url = req.url;\n\n  var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n  var err = new Error(msg);\n  err.status = this.status;\n  err.method = method;\n  err.url = url;\n\n  return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n  var self = this;\n  Emitter.call(this);\n  this._query = this._query || [];\n  this.method = method;\n  this.url = url;\n  this.header = {};\n  this._header = {};\n  this.on('end', function(){\n    var err = null;\n    var res = null;\n\n    try {\n      res = new Response(self);\n    } catch(e) {\n      err = new Error('Parser is unable to parse the response');\n      err.parse = true;\n      err.original = e;\n      return self.callback(err);\n    }\n\n    self.emit('response', res);\n\n    if (err) {\n      return self.callback(err, res);\n    }\n\n    if (res.status >= 200 && res.status < 300) {\n      return self.callback(err, res);\n    }\n\n    var new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n    new_err.original = err;\n    new_err.response = res;\n    new_err.status = res.status;\n\n    self.callback(err || new_err, res);\n  });\n}\n\n/**\n * Mixin `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Allow for extension\n */\n\nRequest.prototype.use = function(fn) {\n  fn(this);\n  return this;\n}\n\n/**\n * Set timeout to `ms`.\n *\n * @param {Number} ms\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.timeout = function(ms){\n  this._timeout = ms;\n  return this;\n};\n\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.clearTimeout = function(){\n  this._timeout = 0;\n  clearTimeout(this._timer);\n  return this;\n};\n\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request}\n * @api public\n */\n\nRequest.prototype.abort = function(){\n  if (this.aborted) return;\n  this.aborted = true;\n  this.xhr.abort();\n  this.clearTimeout();\n  this.emit('abort');\n  return this;\n};\n\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n *\n * Examples:\n *\n *      req.get('/')\n *        .set('Accept', 'application/json')\n *        .set('X-API-Key', 'foobar')\n *        .end(callback);\n *\n *      req.get('/')\n *        .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n *        .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.set = function(field, val){\n  if (isObject(field)) {\n    for (var key in field) {\n      this.set(key, field[key]);\n    }\n    return this;\n  }\n  this._header[field.toLowerCase()] = val;\n  this.header[field] = val;\n  return this;\n};\n\n/**\n * Remove header `field`.\n *\n * Example:\n *\n *      req.get('/')\n *        .unset('User-Agent')\n *        .end(callback);\n *\n * @param {String} field\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.unset = function(field){\n  delete this._header[field.toLowerCase()];\n  delete this.header[field];\n  return this;\n};\n\n/**\n * Get case-insensitive header `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api private\n */\n\nRequest.prototype.getHeader = function(field){\n  return this._header[field.toLowerCase()];\n};\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.xml = 'application/xml';\n *\n *      request.post('/')\n *        .type('xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n *      request.post('/')\n *        .type('application/xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n  this.set('Content-Type', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.json = 'application/json';\n *\n *      request.get('/agent')\n *        .accept('json')\n *        .end(callback);\n *\n *      request.get('/agent')\n *        .accept('application/json')\n *        .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n  this.set('Accept', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} pass\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass){\n  var str = btoa(user + ':' + pass);\n  this.set('Authorization', 'Basic ' + str);\n  return this;\n};\n\n/**\n* Add query-string `val`.\n*\n* Examples:\n*\n*   request.get('/shoes')\n*     .query('size=10')\n*     .query({ color: 'blue' })\n*\n* @param {Object|String} val\n* @return {Request} for chaining\n* @api public\n*/\n\nRequest.prototype.query = function(val){\n  if ('string' != typeof val) val = serialize(val);\n  if (val) this._query.push(val);\n  return this;\n};\n\n/**\n * Write the field `name` and `val` for \"multipart/form-data\"\n * request bodies.\n *\n * ``` js\n * request.post('/upload')\n *   .field('foo', 'bar')\n *   .end(callback);\n * ```\n *\n * @param {String} name\n * @param {String|Blob|File} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.field = function(name, val){\n  if (!this._formData) this._formData = new root.FormData();\n  this._formData.append(name, val);\n  return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `filename`.\n *\n * ``` js\n * request.post('/upload')\n *   .attach(new Blob(['<a id=\"a\"><b id=\"b\">hey!</b></a>'], { type: \"text/html\"}))\n *   .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String} filename\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, filename){\n  if (!this._formData) this._formData = new root.FormData();\n  this._formData.append(field, file, filename);\n  return this;\n};\n\n/**\n * Send `data`, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n *       // querystring\n *       request.get('/search')\n *         .end(callback)\n *\n *       // multiple data \"writes\"\n *       request.get('/search')\n *         .send({ search: 'query' })\n *         .send({ range: '1..5' })\n *         .send({ order: 'desc' })\n *         .end(callback)\n *\n *       // manual json\n *       request.post('/user')\n *         .type('json')\n *         .send('{\"name\":\"tj\"})\n *         .end(callback)\n *\n *       // auto json\n *       request.post('/user')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // manual x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send('name=tj')\n *         .end(callback)\n *\n *       // auto x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // defaults to x-www-form-urlencoded\n  *      request.post('/user')\n  *        .send('name=tobi')\n  *        .send('species=ferret')\n  *        .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.send = function(data){\n  var obj = isObject(data);\n  var type = this.getHeader('Content-Type');\n\n  // merge\n  if (obj && isObject(this._data)) {\n    for (var key in data) {\n      this._data[key] = data[key];\n    }\n  } else if ('string' == typeof data) {\n    if (!type) this.type('form');\n    type = this.getHeader('Content-Type');\n    if ('application/x-www-form-urlencoded' == type) {\n      this._data = this._data\n        ? this._data + '&' + data\n        : data;\n    } else {\n      this._data = (this._data || '') + data;\n    }\n  } else {\n    this._data = data;\n  }\n\n  if (!obj || isHost(data)) return this;\n  if (!type) this.type('json');\n  return this;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n  var fn = this._callback;\n  this.clearTimeout();\n  fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n  var err = new Error('Origin is not allowed by Access-Control-Allow-Origin');\n  err.crossDomain = true;\n  this.callback(err);\n};\n\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\nRequest.prototype.timeoutError = function(){\n  var timeout = this._timeout;\n  var err = new Error('timeout of ' + timeout + 'ms exceeded');\n  err.timeout = timeout;\n  this.callback(err);\n};\n\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\nRequest.prototype.withCredentials = function(){\n  this._withCredentials = true;\n  return this;\n};\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n  var self = this;\n  var xhr = this.xhr = request.getXHR();\n  var query = this._query.join('&');\n  var timeout = this._timeout;\n  var data = this._formData || this._data;\n\n  // store callback\n  this._callback = fn || noop;\n\n  // state change\n  xhr.onreadystatechange = function(){\n    if (4 != xhr.readyState) return;\n\n    // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n    // result in the error \"Could not complete the operation due to error c00c023f\"\n    var status;\n    try { status = xhr.status } catch(e) { status = 0; }\n\n    if (0 == status) {\n      if (self.timedout) return self.timeoutError();\n      if (self.aborted) return;\n      return self.crossDomainError();\n    }\n    self.emit('end');\n  };\n\n  // progress\n  var handleProgress = function(e){\n    if (e.total > 0) {\n      e.percent = e.loaded / e.total * 100;\n    }\n    self.emit('progress', e);\n  };\n  if (this.hasListeners('progress')) {\n    xhr.onprogress = handleProgress;\n  }\n  try {\n    if (xhr.upload && this.hasListeners('progress')) {\n      xhr.upload.onprogress = handleProgress;\n    }\n  } catch(e) {\n    // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n    // Reported here:\n    // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n  }\n\n  // timeout\n  if (timeout && !this._timer) {\n    this._timer = setTimeout(function(){\n      self.timedout = true;\n      self.abort();\n    }, timeout);\n  }\n\n  // querystring\n  if (query) {\n    query = request.serializeObject(query);\n    this.url += ~this.url.indexOf('?')\n      ? '&' + query\n      : '?' + query;\n  }\n\n  // initiate request\n  xhr.open(this.method, this.url, true);\n\n  // CORS\n  if (this._withCredentials) xhr.withCredentials = true;\n\n  // body\n  if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !isHost(data)) {\n    // serialize stuff\n    var serialize = request.serialize[this.getHeader('Content-Type')];\n    if (serialize) data = serialize(data);\n  }\n\n  // set header fields\n  for (var field in this.header) {\n    if (null == this.header[field]) continue;\n    xhr.setRequestHeader(field, this.header[field]);\n  }\n\n  // send stuff\n  this.emit('request', this);\n  xhr.send(data);\n  return this;\n};\n\n/**\n * Expose `Request`.\n */\n\nrequest.Request = Request;\n\n/**\n * Issue a request:\n *\n * Examples:\n *\n *    request('GET', '/users').end(callback)\n *    request('/users').end(callback)\n *    request('/users', callback)\n *\n * @param {String} method\n * @param {String|Function} url or callback\n * @return {Request}\n * @api public\n */\n\nfunction request(method, url) {\n  // callback\n  if ('function' == typeof url) {\n    return new Request('GET', method).end(url);\n  }\n\n  // url first\n  if (1 == arguments.length) {\n    return new Request('GET', method);\n  }\n\n  return new Request(method, url);\n}\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn){\n  var req = request('GET', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.query(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn){\n  var req = request('HEAD', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * DELETE `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.del = function(url, fn){\n  var req = request('DELETE', url);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn){\n  var req = request('PATCH', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} data\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn){\n  var req = request('POST', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} data or fn\n * @param {Function} fn\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn){\n  var req = request('PUT', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * Expose `request`.\n */\n\nmodule.exports = request;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/superagent/lib/client.js\n// module id = 183\n// module chunks = 0 1","export default {\n  transitionEnterTimeout: 500,\n  transitionLeaveTimeout: 500\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/css_transition_defaults.ts","var invariant = require('invariant');\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar splice = Array.prototype.splice;\n\nvar toString = Object.prototype.toString\nvar type = function(obj) {\n  return toString.call(obj).slice(8, -1);\n}\n\nvar assign = Object.assign || /* istanbul ignore next */ function assign(target, source) {\n  getAllKeys(source).forEach(function(key) {\n    if (hasOwnProperty.call(source, key)) {\n      target[key] = source[key];\n    }\n  });\n  return target;\n};\n\nvar getAllKeys = typeof Object.getOwnPropertySymbols === 'function' ?\n  function(obj) { return Object.keys(obj).concat(Object.getOwnPropertySymbols(obj)) } :\n  /* istanbul ignore next */ function(obj) { return Object.keys(obj) };\n\n/* istanbul ignore next */\nfunction copy(object) {\n  if (Array.isArray(object)) {\n    return assign(object.constructor(object.length), object)\n  } else if (type(object) === 'Map') {\n    return new Map(object)\n  } else if (type(object) === 'Set') {\n    return new Set(object)\n  } else if (object && typeof object === 'object') {\n    var prototype = object.constructor && object.constructor.prototype\n    return assign(Object.create(prototype || null), object);\n  } else {\n    return object;\n  }\n}\n\nfunction newContext() {\n  var commands = assign({}, defaultCommands);\n  update.extend = function(directive, fn) {\n    commands[directive] = fn;\n  };\n  update.isEquals = function(a, b) { return a === b; };\n\n  return update;\n\n  function update(object, spec) {\n    if (typeof spec === 'function') {\n      return spec(object);\n    }\n\n    if (!(Array.isArray(object) && Array.isArray(spec))) {\n      invariant(\n        !Array.isArray(spec),\n        'update(): You provided an invalid spec to update(). The spec may ' +\n        'not contain an array except as the value of $set, $push, $unshift, ' +\n        '$splice or any custom command allowing an array value.'\n      );\n    }\n\n    invariant(\n      typeof spec === 'object' && spec !== null,\n      'update(): You provided an invalid spec to update(). The spec and ' +\n      'every included key path must be plain objects containing one of the ' +\n      'following commands: %s.',\n      Object.keys(commands).join(', ')\n    );\n\n    var nextObject = object;\n    var index, key;\n    getAllKeys(spec).forEach(function(key) {\n      if (hasOwnProperty.call(commands, key)) {\n        var objectWasNextObject = object === nextObject;\n        nextObject = commands[key](spec[key], nextObject, spec, object);\n        if (objectWasNextObject && update.isEquals(nextObject, object)) {\n          nextObject = object;\n        }\n      } else {\n        var nextValueForKey =\n          type(object) === 'Map'\n            ? update(object.get(key), spec[key])\n            : update(object[key], spec[key]);\n        if (!update.isEquals(nextValueForKey, nextObject[key]) || typeof nextValueForKey === 'undefined' && !hasOwnProperty.call(object, key)) {\n          if (nextObject === object) {\n            nextObject = copy(object);\n          }\n          if (type(nextObject) === 'Map') {\n            nextObject.set(key, nextValueForKey);\n          } else {\n            nextObject[key] = nextValueForKey;\n          }\n        }\n      }\n    })\n    return nextObject;\n  }\n\n}\n\nvar defaultCommands = {\n  $push: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$push');\n    return value.length ? nextObject.concat(value) : nextObject;\n  },\n  $unshift: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$unshift');\n    return value.length ? value.concat(nextObject) : nextObject;\n  },\n  $splice: function(value, nextObject, spec, originalObject) {\n    invariantSplices(nextObject, spec);\n    value.forEach(function(args) {\n      invariantSplice(args);\n      if (nextObject === originalObject && args.length) nextObject = copy(originalObject);\n      splice.apply(nextObject, args);\n    });\n    return nextObject;\n  },\n  $set: function(value, nextObject, spec) {\n    invariantSet(spec);\n    return value;\n  },\n  $toggle: function(targets, nextObject) {\n    invariantSpecArray(targets, '$toggle');\n    var nextObjectCopy = targets.length ? copy(nextObject) : nextObject;\n\n    targets.forEach(function(target) {\n      nextObjectCopy[target] = !nextObject[target];\n    });\n\n    return nextObjectCopy;\n  },\n  $unset: function(value, nextObject, spec, originalObject) {\n    invariantSpecArray(value, '$unset');\n    value.forEach(function(key) {\n      if (Object.hasOwnProperty.call(nextObject, key)) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        delete nextObject[key];\n      }\n    });\n    return nextObject;\n  },\n  $add: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$add');\n    invariantSpecArray(value, '$add');\n    if (type(nextObject) === 'Map') {\n      value.forEach(function(pair) {\n        var key = pair[0];\n        var value = pair[1];\n        if (nextObject === originalObject && nextObject.get(key) !== value) nextObject = copy(originalObject);\n        nextObject.set(key, value);\n      });\n    } else {\n      value.forEach(function(value) {\n        if (nextObject === originalObject && !nextObject.has(value)) nextObject = copy(originalObject);\n        nextObject.add(value);\n      });\n    }\n    return nextObject;\n  },\n  $remove: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$remove');\n    invariantSpecArray(value, '$remove');\n    value.forEach(function(key) {\n      if (nextObject === originalObject && nextObject.has(key)) nextObject = copy(originalObject);\n      nextObject.delete(key);\n    });\n    return nextObject;\n  },\n  $merge: function(value, nextObject, spec, originalObject) {\n    invariantMerge(nextObject, value);\n    getAllKeys(value).forEach(function(key) {\n      if (value[key] !== nextObject[key]) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        nextObject[key] = value[key];\n      }\n    });\n    return nextObject;\n  },\n  $apply: function(value, original) {\n    invariantApply(value);\n    return value(original);\n  }\n};\n\nvar contextForExport = newContext();\n\nmodule.exports = contextForExport;\nmodule.exports.default = contextForExport;\nmodule.exports.newContext = newContext;\n\n// invariants\n\nfunction invariantPushAndUnshift(value, spec, command) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected target of %s to be an array; got %s.',\n    command,\n    value\n  );\n  invariantSpecArray(spec[command], command)\n}\n\nfunction invariantSpecArray(spec, command) {\n  invariant(\n    Array.isArray(spec),\n    'update(): expected spec of %s to be an array; got %s. ' +\n    'Did you forget to wrap your parameter in an array?',\n    command,\n    spec\n  );\n}\n\nfunction invariantSplices(value, spec) {\n  invariant(\n    Array.isArray(value),\n    'Expected $splice target to be an array; got %s',\n    value\n  );\n  invariantSplice(spec['$splice']);\n}\n\nfunction invariantSplice(value) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected spec of $splice to be an array of arrays; got %s. ' +\n    'Did you forget to wrap your parameters in an array?',\n    value\n  );\n}\n\nfunction invariantApply(fn) {\n  invariant(\n    typeof fn === 'function',\n    'update(): expected spec of $apply to be a function; got %s.',\n    fn\n  );\n}\n\nfunction invariantSet(spec) {\n  invariant(\n    Object.keys(spec).length === 1,\n    'Cannot have more than one key in an object with $set'\n  );\n}\n\nfunction invariantMerge(target, specValue) {\n  invariant(\n    specValue && typeof specValue === 'object',\n    'update(): $merge expects a spec of type \\'object\\'; got %s',\n    specValue\n  );\n  invariant(\n    target && typeof target === 'object',\n    'update(): $merge expects a target of type \\'object\\'; got %s',\n    target\n  );\n}\n\nfunction invariantMapOrSet(target, command) {\n  var typeOfTarget = type(target);\n  invariant(\n    typeOfTarget === 'Map' || typeOfTarget === 'Set',\n    'update(): %s expects a target of type Set or Map; got %s',\n    command,\n    typeOfTarget\n  );\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/immutability-helper/index.js\n// module id = 185\n// module chunks = 0 1","const colors = [\n  0x4781BF, 0xA1BBE5, 0xE59539, 0xE8CE8B, 0x6F5DA8,\n  0xCDABDB, 0x3D9990, 0x7CCFB4, 0x4C5FB5, 0x979ACC,\n  0xCC5E69, 0xEDA19F, 0x4692B0, 0x8BD4D6, 0xE0694F,\n  0xF5A482, 0x549970, 0x9AD9A4, 0x9C4174, 0xCF7C92\n];\n\nconst moreColor = 0xBDBDBD;\nconst axisColor = 0x666666;\n\nconst htmlColors = colors.map((color) => intToHtmlColor(color));\n\nfunction intToHtmlColor(color) {\n  let hex = color.toString(16);\n  for (let i = hex.length; i < 6; i++) {\n    hex = '0' + hex;\n  }\n  return '#' + hex;\n}\n\nexport default {\n  getColor(index) {\n    return colors[index % colors.length];\n  },\n  getHtmlColor(index) {\n    return htmlColors[index % colors.length];\n  },\n  moreColor,\n  moreHtmlColor: intToHtmlColor(moreColor),\n  axisColor,\n  axisHtmlColor: intToHtmlColor(axisColor),\n  colors,\n  htmlColors,\n  intToHtmlColor\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/og_colors.ts","import _ from 'lodash';\n\nimport { Dispatcher } from '@opengov/og_flux';\n\nimport ReportViewStore from '../stores/report_view_store';\nimport SavedViewsStore from '../stores/saved_views_store';\nimport GridReportStore from '../stores/grid_report_store';\nimport SummaryReportStore from '../stores/summary_report_store';\nimport GridReportActions from '../actions/grid_report_actions';\nimport OGAPI from '@opengov/og_api';\n\nfunction generateRequestId() {\n  return _.uniqueId('saved_view');\n}\n\nexport default {\n  /**\n   * User has selected a different active view to display.\n   * @params {Object} savedView - The newly selected saved view to activate.\n   */\n  selectView(savedView) {\n    if (SavedViewsStore.getActiveView() !== savedView) {\n      Dispatcher.handleViewAction({\n        actionType: 'SAVED_VIEW_SELECTED',\n        savedView\n      });\n\n      if (ReportViewStore.isGridReport()) {\n        // we pass true as the second parameter because we want the history to be updated\n        GridReportActions.loadGridState(savedView.view_state, true);\n      }\n    }\n  },\n\n  /**\n   * User wants to create a new saved view that captures the current report's state.\n   */\n  newView() {\n    const report = ReportViewStore.getRenderedReport();\n    let state;\n\n    if (ReportViewStore.isGridReport()) {\n      state = {\n        query: GridReportStore.getState().get('savedStateId')\n      };\n    } else {\n      state = SummaryReportStore.generateSummaryReportState();\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_NEW',\n      savedView: {\n        report_id: report.get('id'),\n        view_state: state\n      }\n    });\n  },\n\n  /**\n   * User wants to cancel out of the edit saved view modal.\n   */\n  cancelView() {\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_CANCEL'\n    });\n  },\n\n  /**\n   * User wants to add the new saved view to the report.\n   * They have entered in a description and it is ready to be sent to the server.\n   *\n   * @param {string} description - A description text for the new saved view.\n   */\n  createView(description) {\n    const savedView = _.assign({}, SavedViewsStore.getEditView(), {\n      description\n    });\n\n    const req = OGAPI.post('saved_views', savedView).end();\n    const requestId = generateRequestId();\n\n    req.done((res) => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_CREATE_SUCCESS',\n        savedView: res.body,\n        requestId\n      });\n    });\n\n    req.catch(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_CREATE_ERROR',\n        requestId\n      });\n    });\n\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_CREATE',\n      savedView,\n      requestId\n    });\n  },\n\n  /**\n   * User wants to make changes to a saved view.\n   *\n   * @param {number} id - Id of the saved view to edit.\n   */\n  editView(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_EDIT',\n      savedViewId: id\n    });\n  },\n\n  /**\n   * Apply updates to a saved view made by the user.\n   * @param {number} id - The 'id' of the saved view to update.\n   * @param {Object} updatedAttributes - A hash of attributes to update.\n   */\n  updateView(id, updatedAttributes) {\n    const req = OGAPI.put('saved_views', id, updatedAttributes).end();\n\n    req.done(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_UPDATE_SUCCESS',\n        savedViewId: id,\n        updatedAttributes\n      });\n    });\n\n    req.catch(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_UPDATE_ERROR',\n        savedViewId: id\n      });\n    });\n\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_UPDATE',\n      savedViewId: id,\n      updatedAttributes\n    });\n  },\n\n  /**\n   * User wants to delete a saved view.\n   * @param {number} id - The 'id' of the saved view to delete.\n   */\n  deleteView(id) {\n    const req = OGAPI.del('saved_views', id).end();\n\n    req.done(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_DELETE_SUCCESS',\n        savedViewId: id\n      });\n    });\n\n    req.catch(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_DELETE_ERROR'\n      });\n    });\n\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_DELETE',\n      savedViewId: id\n    });\n  },\n\n  /**\n   * User has started a drag operation to reposition a saved view in the collection.\n   * @param {number} id - The id of the saved view to reposition.\n   */\n  startViewDrag(id) {\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_DRAG_START',\n      savedViewId: id\n    });\n  },\n\n  /**\n   * User has dragged a saved view to a new position in the collection.\n   * @params {number} afterId - The id of another saved view to position the view being moved.\n   */\n  dragViewAfter(afterId) {\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_DRAG_AFTER',\n      savedViewId: afterId\n    });\n  },\n\n  /**\n   * User has dropped a saved view into a new position in the collection.\n   * This ends the reposition drag operation and syncs the new position to the server.\n   */\n  dropView() {\n    const view: any = SavedViewsStore.getDragView();\n    const req = OGAPI.put('saved_views', view.id, _.pick(view, 'position')).end();\n\n    req.then(() => {\n      Dispatcher.handleServerAction({\n        actionType: 'SAVED_VIEW_DROP_SUCCESS'\n      });\n    });\n\n    Dispatcher.handleViewAction({\n      actionType: 'SAVED_VIEW_DROP'\n    });\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/saved_view_actions.ts","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ShareIcon extends Component<any, any> {\n  static propTypes = {\n    type: PropTypes.oneOf(['private', 'my_organization', 'network', 'public']).isRequired,\n    size: PropTypes.number\n  }\n\n  static defaultProps = {\n    size: 28\n  };\n  \n  renderPrivate() {\n    return (\n      <g>\n        <path className=\"share-icon__background\" d=\"M12.5,2C6.7,2,2,6.7,2,12.5S6.7,23,12.5,23S23,18.3,23,12.5S18.3,2,12.5,2z M17.6,17.2c0,0.1-0.1,0.2-0.2,0.2H8c-0.1,0-0.2-0.1-0.2-0.2v-4.7c0-0.1,0.1-0.2,0.2-0.2h9.4c0.1,0,0.2,0.1,0.2,0.2V17.2z\"/>\n        <path className=\"share-icon__foreground\" d=\"M17.4,11.3h-1.2V9c0-1.9-1.6-3.5-3.5-3.5S9.2,7,9.2,9v2.3H8c-0.6,0-1.2,0.5-1.2,1.2v4.7c0,0.6,0.5,1.2,1.2,1.2h9.4c0.6,0,1.2-0.5,1.2-1.2v-4.7C18.6,11.9,18,11.3,17.4,11.3z M10.4,9c0-1.3,1.1-2.3,2.3-2.3c1.3,0,2.3,1.1,2.3,2.3v2.3h-4.7V9z M17.6,17.2c0,0.1-0.1,0.2-0.2,0.2H8c-0.1,0-0.2-0.1-0.2-0.2v-4.7c0-0.1,0.1-0.2,0.2-0.2h9.4c0.1,0,0.2,0.1,0.2,0.2V17.2z\"/>\n        <path className=\"share-icon__foreground\" d=\"M12.5,2C18.3,2,23,6.7,23,12.5C23,18.3,18.3,23,12.5,23S2,18.3,2,12.5C2,6.7,6.7,2,12.5,2 M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0L12.5,0z\"/>\n      </g>\n    );\n  }\n\n  renderOrg() {\n    return (\n      <g>\n        <path className=\"share-icon__background\" d=\"M5.2,13.2c-1.4,0-2.5,1.1-2.5,2.5v0.6C2.3,15.1,2,13.8,2,12.5C2,6.7,6.7,2,12.5,2S23,6.7,23,12.5c0,0.9-0.1,1.8-0.4,2.7c-0.2-1.1-1.2-2-2.4-2h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1.4-1.1-2.5-2.5-2.5c0-0.7-0.3-1.3-0.7-1.8c-0.5-0.5-1.1-0.7-1.8-0.7c0-1.4-1.1-2.5-2.5-2.5c-1.4,0-2.5,1.1-2.5,2.5C8.8,6.5,7.7,7.6,7.7,9C7,9,6.4,9.3,5.9,9.7s-0.7,1.1-0.7,1.8c0,0.7,0.2,1.2,0.6,1.7H5.2z\"/>\n        <path className=\"share-icon__foreground\" d=\"M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0z M12.5,2C18.3,2,23,6.7,23,12.5c0,0.9-0.1,1.8-0.4,2.6c-0.2-1.1-1.2-2-2.4-2h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1.4-1.1-2.5-2.5-2.5v0c0-1.4-1.1-2.5-2.5-2.5c0-1.4-1.1-2.5-2.5-2.5s-2.5,1.1-2.5,2.5C8.8,6.5,7.7,7.6,7.7,9v0c-1.4,0-2.5,1.1-2.5,2.5c0,0.6,0.2,1.2,0.6,1.7H5.2c-1.4,0-2.5,1.1-2.5,2.5v0.6C2.3,15.1,2,13.8,2,12.5C2,6.7,6.7,2,12.5,2z M15.9,13.2h-0.6h-0.6c0.4-0.4,0.6-1,0.6-1.7c0-1-0.6-1.9-1.5-2.3c0-0.1,0-0.1,0-0.2c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5v0.2c-0.9,0.4-1.5,1.3-1.5,2.3C15.2,12.1,15.5,12.7,15.9,13.2z M10.9,13.2h-0.6H9.6c0.4-0.4,0.6-1,0.6-1.7c0-1-0.6-1.9-1.5-2.3V9c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5c0,0.1,0,0.1,0,0.2c-0.9,0.4-1.5,1.3-1.5,2.3C10.2,12.1,10.5,12.7,10.9,13.2z M9.2,11.5c0,0.8-0.7,1.5-1.5,1.5s-1.5-0.7-1.5-1.5S6.9,10,7.7,10S9.2,10.7,9.2,11.5z M11.2,6.7V6.5c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5v0.2C13.3,7.1,12.7,8,12.7,9C12.7,8,12.1,7.1,11.2,6.7z M12.7,10c0.8,0,1.5,0.7,1.5,1.5S13.5,13,12.7,13s-1.5-0.7-1.5-1.5S11.9,10,12.7,10z M17.7,10c0.8,0,1.5,0.7,1.5,1.5S18.5,13,17.7,13s-1.5-0.7-1.5-1.5S16.9,10,17.7,10z M3.7,18.2v-2.6c0-0.8,0.7-1.5,1.5-1.5h3c-0.3,0.4-0.5,0.9-0.5,1.5v6.2C6.1,21,4.7,19.7,3.7,18.2z M8.7,22.3v-6.6c0-0.8,0.7-1.5,1.5-1.5h5c0.8,0,1.5,0.7,1.5,1.5v6.4C15.4,22.7,14,23,12.5,23C11.2,23,9.9,22.7,8.7,22.3z M17.7,21.6v-5.9c0-0.6-0.2-1.1-0.5-1.5h3c0.8,0,1.5,0.7,1.5,1.5v1.9C20.8,19.2,19.4,20.6,17.7,21.6z\"/>\n      </g>\n    );\n  }\n\n  renderNetwork() {\n    return (\n      <g>\n        <path className=\"share-icon__background\" d=\"M17.3,0.9c0.1,0.6,0.1,1.2,0.1,1.8c0,8.1-6.6,14.7-14.7,14.7c-0.6,0-1.2,0-1.8-0.1C2.8,21.8,7.3,25,12.5,25C19.4,25,25,19.4,25,12.5C25,7.3,21.8,2.8,17.3,0.9z\"/>\n        <path className=\"share-icon__foreground\" d=\"M24,7.7C22.1,3,17.6,0,12.5,0c-1.6,0-3.3,0.3-4.8,1C1.3,3.6-1.7,10.9,1,17.3C2.9,22,7.4,25,12.5,25c1.6,0,3.3-0.3,4.8-1C23.7,21.4,26.7,14.1,24,7.7z M6.3,16.7c1.3-0.2,2.9-0.5,4.5-1.1c0.7,1.5,1.5,2.9,2.3,4.1c-1.3,0.4-2.6,0.6-3.7,0.7C8.2,19.5,7.2,18.2,6.3,16.7z M2.4,15.6C2,14.2,1.9,12.7,2,11.3c0.3,0.2,0.7,0.3,1.3,0.3c0.3,0,0.6,0,0.9-0.1c0.2,1.3,0.5,2.7,1.1,4.1c0.1,0.3,0.2,0.5,0.3,0.8C3.9,16.5,2.8,16.2,2.4,15.6z M5.6,5.6c0,0,0.1,0,0.1,0c0.2,0,0.4,0,0.6,0c0.4,0,0.8-0.1,1.2-0.2c0.1,1.4,0.6,3,1.1,4.6c-1.3,0.5-2.6,0.8-3.7,1c-0.1,0-0.2,0-0.2,0C4.5,8.9,4.8,7,5.6,5.6z M17.3,5.5C16,4,14.4,2.8,12.8,2.3c0.1-0.1,0.1-0.2,0.1-0.3c2.1,0.1,4,0.8,5.7,1.9C18.6,4.2,18.3,4.7,17.3,5.5z M16.7,22.2c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0-0.2,0.1c0,0,0,0,0,0c-0.6,0-1.5-0.9-2.5-2.3c0.5-0.2,1-0.4,1.5-0.6c0.5-0.2,1-0.4,1.5-0.7C17.2,20.6,17.1,21.8,16.7,22.2z M15.2,19c-0.5,0.2-1.1,0.4-1.6,0.6c-0.7-1.1-1.5-2.5-2.3-4.1c0.7-0.2,1.4-0.5,2.1-0.8c0.7-0.3,1.4-0.6,2.1-0.9c0.6,1.7,1,3.2,1.3,4.5C16.3,18.5,15.7,18.8,15.2,19z M13.2,14.2c-0.7,0.3-1.4,0.6-2.1,0.8c-0.2-0.5-0.5-1.1-0.7-1.6c-0.5-1.1-0.9-2.2-1.2-3.2c0.7-0.2,1.4-0.5,2.1-0.8c0.7-0.3,1.4-0.6,2-0.9c0.5,1,1,2,1.4,3.1c0.2,0.6,0.5,1.1,0.7,1.7C14.7,13.6,14,13.9,13.2,14.2z M8.5,2.8c0.1,0,0.1,0,0.2,0c0.4,0,0.9,0.4,1.5,1C9.8,3.9,9.5,4.1,9.1,4.2C8.7,4.4,8.3,4.5,8,4.6C7.9,3.6,8.1,3,8.5,2.8z M9.4,2.5c0.4-0.1,0.7-0.1,1.1-0.1c0.5,0,0.9,0.1,1.4,0.2c-0.3,0.3-0.7,0.6-1.3,0.9C10.2,3,9.8,2.7,9.4,2.5z M9.3,4.7c0.4-0.2,0.8-0.4,1.2-0.6c0.8,0.9,1.7,2.3,2.5,4c-0.6,0.3-1.3,0.6-2,0.9c-0.7,0.3-1.4,0.5-2,0.8C8.5,8,8.1,6.4,8,5.1C8.4,5,8.8,4.9,9.3,4.7z M15.1,11.5c-0.4-1-0.9-2.1-1.4-3.1C15,7.7,16.1,7,17,6.4c0.1-0.1,0.2-0.1,0.2-0.2c0.8,1,1.5,2.2,2.1,3.5c0.1,0.3,0.2,0.6,0.4,0.9c-1,0.8-2.3,1.6-3.9,2.4C15.5,12.5,15.3,11.9,15.1,11.5z M16.8,6c-0.9,0.6-2,1.3-3.3,1.9c-0.8-1.6-1.7-3-2.5-4c0.7-0.4,1.2-0.8,1.6-1.2c1.6,0.5,3.1,1.6,4.5,3.1C16.9,5.9,16.8,5.9,16.8,6z M12.3,2.1C12.1,2.1,11.9,2,11.6,2c0.3,0,0.5,0,0.8,0C12.4,2,12.4,2.1,12.3,2.1z M5.3,5C5.2,5,5.2,5,5.1,5c0.2-0.2,0.4-0.3,0.5-0.5C5.5,4.7,5.4,4.8,5.3,5z M7.6,3.3C7.5,3.7,7.4,4.2,7.5,4.8C7,4.9,6.6,5,6.3,5.1c-0.2,0-0.3,0-0.4,0C6.3,4.3,6.9,3.7,7.6,3.3z M4.9,11.4c1.1-0.2,2.4-0.5,3.8-1c0.4,1.2,0.8,2.3,1.2,3.2c0.2,0.5,0.5,1.1,0.7,1.6c-1.6,0.5-3.2,0.9-4.5,1.1C6,16,5.8,15.7,5.7,15.4c-0.5-1.3-0.9-2.7-1-3.9C4.8,11.4,4.8,11.4,4.9,11.4z M13.4,20.2c0.8,1.1,1.5,2,2.2,2.4c-0.4,0.1-0.7,0.1-1.1,0.1c-1.5,0-3.1-0.6-4.6-1.7C11,20.8,12.2,20.6,13.4,20.2z M17.4,21.8c0.2-0.8,0.1-1.9-0.1-3.2c1.1-0.6,2.1-1.3,3-1.9C20,18.9,19,20.7,17.4,21.8z M17.2,18.1c-0.3-1.5-0.8-3.1-1.3-4.5c1.5-0.8,2.8-1.6,3.9-2.4c0.5,1.7,0.7,3.3,0.6,4.8C19.5,16.7,18.4,17.4,17.2,18.1z M20.2,10.8c1-0.8,1.7-1.6,2-2.4c0,0,0,0,0,0C22.8,9.7,23,11,23,12.3c-0.2,1-1,2.1-2.1,3.2C21,14,20.7,12.4,20.2,10.8z M21.8,7.6c0.2,0.6-0.4,1.6-1.8,2.7c-0.1-0.3-0.2-0.5-0.3-0.8c-0.6-1.3-1.3-2.6-2.1-3.6c0.8-0.6,1.3-1.2,1.4-1.7C20.2,5.1,21.1,6.3,21.8,7.6z M4.8,5.3C4.9,5.4,5,5.4,5.1,5.5c-0.3,0.6-0.6,1.3-0.7,2C4.1,8.6,4.1,9.8,4.1,11c-1.3,0.1-1.9,0-2-0.3C2.5,8.7,3.4,6.8,4.8,5.3z M2.8,16.5C2.8,16.5,2.8,16.5,2.8,16.5c0.5,0.2,1.1,0.3,1.9,0.3c0.3,0,0.7,0,1.1-0.1c0.8,1.5,1.7,2.7,2.8,3.8c-0.3,0-0.5,0-0.8,0c-1.3,0-2.3-0.3-3-0.8C4,18.9,3.3,17.8,2.8,16.5z M5.9,20.8C6.5,20.9,7.1,21,7.9,21c0.1,0,0.3,0,0.5,0c0.3,0,0.5,0,0.8-0.1c1.2,1,2.6,1.7,4,2c-0.2,0-0.4,0-0.6,0C10.1,23.1,7.8,22.2,5.9,20.8z M19.5,20.4c0.5-0.8,1-1.8,1.2-2.9c0.1-0.4,0.2-0.9,0.2-1.3c0.9-0.8,1.6-1.6,2.1-2.5C22.7,16.3,21.4,18.7,19.5,20.4z\"/>\n      </g>\n    );\n  }\n\n  renderPublic() {\n    return (\n      <g>\n        <path className=\"share-icon__background\" d=\"M7.5,11.4c0.1-2.5,2.1-4.5,4.6-4.7v-2c0-0.2,0.2-0.4,0.4-0.4c0.2,0,0.4,0.2,0.4,0.4v2c2.5,0.2,4.5,2.2,4.6,4.7h7.4C24.4,5,19,0,12.5,0C6,0,0.6,5,0.1,11.4H7.5z\"/>\n        <path className=\"share-icon__foreground\" d=\"M12.5,0C5.6,0,0,5.6,0,12.5S5.6,25,12.5,25C19.4,25,25,19.4,25,12.5S19.4,0,12.5,0z M10.5,22.8c-0.8-0.2-1.6-0.4-2.3-0.7v-7.3h2.3V22.8z M8.2,14l4.3-2.5l4.3,2.5H8.2z M8.3,11.4c0.1-2.2,1.9-3.9,4.2-3.9l0,0c0,0,0,0,0,0c2.2,0,4,1.7,4.2,3.9h-2.5l-1.4-0.8c-0.1-0.1-0.3-0.1-0.4,0l-1.4,0.8H8.3z M16.6,14.8v7.3c-0.7,0.3-1.4,0.5-2.2,0.7v-8H16.6z M22.8,14h-4.4L17,13.1h5.8V14z M12.5,2c5.4,0,9.9,4.2,10.4,9.4h-5.4c-0.1-2.5-2.1-4.5-4.6-4.7v-2c0-0.2-0.2-0.4-0.4-0.4c-0.2,0-0.4,0.2-0.4,0.4v2c-2.5,0.2-4.5,2.2-4.6,4.7H2.1C2.6,6.2,7.1,2,12.5,2z M8,13.1L6.5,14H2.2v-0.8H8z M2.3,14.8h5.2v6.9C4.8,20.3,2.9,17.8,2.3,14.8z M11.4,22.9v-8.1h2.2v8.1c-0.4,0-0.7,0.1-1.1,0.1C12.1,23,11.8,23,11.4,22.9z M17.5,21.7v-6.9h5.3C22.1,17.8,20.1,20.3,17.5,21.7z\"/>\n      </g>\n    );\n  }\n\n  render() {\n    const { type } = this.props;\n    return (\n      <svg\n        className=\"share-icon\"\n        width={`${this.props.size}px`}\n        height={`${this.props.size}px`}\n        viewBox=\"0 0 25 25\">\n        {type === 'private' ? this.renderPrivate() : null}\n        {type === 'my_organization' ? this.renderOrg() : null}\n        {type === 'network' ? this.renderNetwork() : null}\n        {type === 'public' ? this.renderPublic() : null}\n      </svg>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_icons.tsx","'use strict';\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n    childContextTypes: true,\n    contextTypes: true,\n    defaultProps: true,\n    displayName: true,\n    getDefaultProps: true,\n    getDerivedStateFromProps: true,\n    mixins: true,\n    propTypes: true,\n    type: true\n};\n\nvar KNOWN_STATICS = {\n    name: true,\n    length: true,\n    prototype: true,\n    caller: true,\n    callee: true,\n    arguments: true,\n    arity: true\n};\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = getPrototypeOf && getPrototypeOf(Object);\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n    if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components\n\n        if (objectPrototype) {\n            var inheritedComponent = getPrototypeOf(sourceComponent);\n            if (inheritedComponent && inheritedComponent !== objectPrototype) {\n                hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n            }\n        }\n\n        var keys = getOwnPropertyNames(sourceComponent);\n\n        if (getOwnPropertySymbols) {\n            keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n        }\n\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!REACT_STATICS[key] && !KNOWN_STATICS[key] && (!blacklist || !blacklist[key])) {\n                var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n                try { // Avoid failures from read-only properties\n                    defineProperty(targetComponent, key, descriptor);\n                } catch (e) {}\n            }\n        }\n\n        return targetComponent;\n    }\n\n    return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\n// module id = 189\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Coordinate;\n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nfunction Coordinate(column, row, zoom) {\n    this.column = column;\n    this.row = row;\n    this.zoom = zoom;\n}\n\nCoordinate.prototype = {\n\n    /**\n     * Create a clone of this coordinate that can be mutated without\n     * changing the original coordinate\n     *\n     * @returns {Coordinate} clone\n     * @private\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.clone();\n     * // since coord is cloned, modifying a property of c2 does\n     * // not modify it.\n     * c2.zoom = 2;\n     */\n    clone: function() {\n        return new Coordinate(this.column, this.row, this.zoom);\n    },\n\n    /**\n     * Zoom this coordinate to a given zoom level. This returns a new\n     * coordinate object, not mutating the old one.\n     *\n     * @param {number} zoom\n     * @returns {Coordinate} zoomed coordinate\n     * @private\n     * @example\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.zoomTo(1);\n     * c2 // equals new Coordinate(0, 0, 1);\n     */\n    zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); },\n\n    /**\n     * Subtract the column and row values of this coordinate from those\n     * of another coordinate. The other coordinat will be zoomed to the\n     * same level as `this` before the subtraction occurs\n     *\n     * @param {Coordinate} c other coordinate\n     * @returns {Coordinate} result\n     * @private\n     */\n    sub: function(c) { return this.clone()._sub(c); },\n\n    _zoomTo: function(zoom) {\n        var scale = Math.pow(2, zoom - this.zoom);\n        this.column *= scale;\n        this.row *= scale;\n        this.zoom = zoom;\n        return this;\n    },\n\n    _sub: function(c) {\n        c = c.zoomTo(this.zoom);\n        this.column -= c.column;\n        this.row -= c.row;\n        return this;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/coordinate.js\n// module id = 190\n// module chunks = 0 1","'use strict';\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n    return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t)\n    ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t),\n        interpolate(from[2], to[2], t),\n        interpolate(from[3], to[3], t)\n    ];\n};\n\ninterpolate.array = function(from, to, t) {\n    return from.map(function(d, i) {\n        return interpolate(d, to[i], t);\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/interpolate.js\n// module id = 191\n// module chunks = 0 1","// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"rebeccapurple\": [102,51,153,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/csscolorparser/csscolorparser.js\n// module id = 192\n// module chunks = 0 1","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.ShelfPack = factory());\n}(this, function () {\n\n/**\n * Create a new ShelfPack bin allocator.\n *\n * Uses the Shelf Best Height Fit algorithm from\n * http://clb.demon.fi/files/RectangleBinPack.pdf\n *\n * @class  ShelfPack\n * @param  {number}  [w=64]  Initial width of the sprite\n * @param  {number}  [h=64]  Initial width of the sprite\n * @param  {Object}  [options]\n * @param  {boolean} [options.autoResize=false]  If `true`, the sprite will automatically grow\n * @example\n * var sprite = new ShelfPack(64, 64, { autoResize: false });\n */\nfunction ShelfPack(w, h, options) {\n    options = options || {};\n    this.w = w || 64;\n    this.h = h || 64;\n    this.autoResize = !!options.autoResize;\n    this.shelves = [];\n    this.stats = {};\n    this.count = function(h) {\n        this.stats[h] = (this.stats[h] | 0) + 1;\n    };\n}\n\n/**\n * Batch pack multiple bins into the sprite.\n *\n * @param   {Array}   bins Array of requested bins - each object should have `width`, `height` (or `w`, `h`) properties\n * @param   {Object}  [options]\n * @param   {boolean} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` properties\n * @returns {Array}   Array of allocated bins - each bin is an object with `x`, `y`, `w`, `h` properties\n * @example\n * var bins = [\n *     { id: 'a', width: 12, height: 12 },\n *     { id: 'b', width: 12, height: 16 },\n *     { id: 'c', width: 12, height: 24 }\n * ];\n * var results = sprite.pack(bins, { inPlace: false });\n */\nShelfPack.prototype.pack = function(bins, options) {\n    bins = [].concat(bins);\n    options = options || {};\n\n    var results = [],\n        w, h, allocation;\n\n    for (var i = 0; i < bins.length; i++) {\n        w = bins[i].w || bins[i].width;\n        h = bins[i].h || bins[i].height;\n        if (w && h) {\n            allocation = this.packOne(w, h);\n            if (!allocation) {\n                continue;\n            }\n            if (options.inPlace) {\n                bins[i].x = allocation.x;\n                bins[i].y = allocation.y;\n            }\n            results.push(allocation);\n        }\n    }\n\n    // Shrink the width/height of the sprite to the bare minimum.\n    // Since shelf-pack doubles first width, then height when running out of shelf space\n    // this can result in fairly large unused space both in width and height if that happens\n    // towards the end of bin packing.\n    if (this.shelves.length > 0) {\n        var w2 = 0;\n        var h2 = 0;\n\n        for (var j = 0; j < this.shelves.length; j++) {\n            var shelf = this.shelves[j];\n            h2 += shelf.h;\n            w2 = Math.max(shelf.w - shelf.free, w2);\n        }\n\n        this.resize(w2, h2);\n    }\n\n    return results;\n};\n\n/**\n * Pack a single bin into the sprite.\n *\n * @param   {number}  w   Width of the bin to allocate\n * @param   {number}  h   Height of the bin to allocate\n * @returns {Object}  Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * var results = sprite.packOne(12, 16);\n */\nShelfPack.prototype.packOne = function(w, h) {\n    var y = 0,\n        best = { shelf: -1, waste: Infinity },\n        shelf, waste;\n\n    // find the best shelf\n    for (var i = 0; i < this.shelves.length; i++) {\n        shelf = this.shelves[i];\n        y += shelf.h;\n\n        // exactly the right height with width to spare, pack it..\n        if (h === shelf.h && w <= shelf.free) {\n            this.count(h);\n            return shelf.alloc(w, h);\n        }\n        // not enough height or width, skip it..\n        if (h > shelf.h || w > shelf.free) {\n            continue;\n        }\n        // maybe enough height or width, minimize waste..\n        if (h < shelf.h && w <= shelf.free) {\n            waste = shelf.h - h;\n            if (waste < best.waste) {\n                best.waste = waste;\n                best.shelf = i;\n            }\n        }\n    }\n\n    if (best.shelf !== -1) {\n        shelf = this.shelves[best.shelf];\n        this.count(h);\n        return shelf.alloc(w, h);\n    }\n\n    // add shelf..\n    if (h <= (this.h - y) && w <= this.w) {\n        shelf = new Shelf(y, this.w, h);\n        this.shelves.push(shelf);\n        this.count(h);\n        return shelf.alloc(w, h);\n    }\n\n    // no more space..\n    // If `autoResize` option is set, grow the sprite as follows:\n    //  * double whichever sprite dimension is smaller (`w1` or `h1`)\n    //  * if sprite dimensions are equal, grow width before height\n    //  * accomodate very large bin requests (big `w` or `h`)\n    if (this.autoResize) {\n        var h1, h2, w1, w2;\n\n        h1 = h2 = this.h;\n        w1 = w2 = this.w;\n\n        if (w1 <= h1 || w > w1) {   // grow width..\n            w2 = Math.max(w, w1) * 2;\n        }\n        if (h1 < w1 || h > h1) {    // grow height..\n            h2 = Math.max(h, h1) * 2;\n        }\n\n        this.resize(w2, h2);\n        return this.packOne(w, h);  // retry\n    }\n\n    return null;\n};\n\n/**\n * Clear the sprite.\n *\n * @example\n * sprite.clear();\n */\nShelfPack.prototype.clear = function() {\n    this.shelves = [];\n    this.stats = {};\n};\n\n/**\n * Resize the sprite.\n *\n * @param   {number}  w  Requested new sprite width\n * @param   {number}  h  Requested new sprite height\n * @returns {boolean} `true` if resize succeeded, `false` if failed\n * @example\n * sprite.resize(256, 256);\n */\nShelfPack.prototype.resize = function(w, h) {\n    this.w = w;\n    this.h = h;\n    for (var i = 0; i < this.shelves.length; i++) {\n        this.shelves[i].resize(w);\n    }\n    return true;\n};\n\n\n\n/**\n * Create a new Shelf.\n *\n * @private\n * @class  Shelf\n * @param  {number}  y   Top coordinate of the new shelf\n * @param  {number}  w   Width of the new shelf\n * @param  {number}  h   Height of the new shelf\n * @example\n * var shelf = new Shelf(64, 512, 24);\n */\nfunction Shelf(y, w, h) {\n    this.x = 0;\n    this.y = y;\n    this.w = this.free = w;\n    this.h = h;\n}\n\n/**\n * Allocate a single bin into the shelf.\n *\n * @private\n * @param   {number}  w   Width of the bin to allocate\n * @param   {number}  h   Height of the bin to allocate\n * @returns {Object}  Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * shelf.alloc(12, 16);\n */\nShelf.prototype.alloc = function(w, h) {\n    if (w > this.free || h > this.h) {\n        return null;\n    }\n    var x = this.x;\n    this.x += w;\n    this.free -= w;\n    return { x: x, y: this.y, w: w, h: h, width: w, height: h };\n};\n\n/**\n * Resize the shelf.\n *\n * @private\n * @param   {number}  w  Requested new width of the shelf\n * @returns {boolean} true if resize succeeded, false if failed\n * @example\n * shelf.resize(512);\n */\nShelf.prototype.resize = function(w) {\n    this.free += (w - this.w);\n    this.w = w;\n    return true;\n};\n\nreturn ShelfPack;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/shelf-pack/index.umd.js\n// module id = 193\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\nvar TilePyramid = require('./tile_pyramid');\nvar normalizeURL = require('../util/mapbox').normalizeSourceURL;\nvar TileCoord = require('./tile_coord');\n\nexports._loadTileJSON = function(options) {\n    var loaded = function(err, tileJSON) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        util.extend(this, util.pick(tileJSON,\n            ['tiles', 'minzoom', 'maxzoom', 'attribution']));\n\n        if (tileJSON.vector_layers) {\n            this.vectorLayers = tileJSON.vector_layers;\n            this.vectorLayerIds = this.vectorLayers.map(function(layer) { return layer.id; });\n        }\n\n        this._pyramid = new TilePyramid({\n            tileSize: this.tileSize,\n            minzoom: this.minzoom,\n            maxzoom: this.maxzoom,\n            roundZoom: this.roundZoom,\n            reparseOverscaled: this.reparseOverscaled,\n            load: this._loadTile.bind(this),\n            abort: this._abortTile.bind(this),\n            unload: this._unloadTile.bind(this),\n            add: this._addTile.bind(this),\n            remove: this._removeTile.bind(this),\n            redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined\n        });\n\n        this.fire('load');\n    }.bind(this);\n\n    if (options.url) {\n        ajax.getJSON(normalizeURL(options.url), loaded);\n    } else {\n        browser.frame(loaded.bind(this, null, options));\n    }\n};\n\nexports.redoPlacement = function() {\n    if (!this._pyramid) {\n        return;\n    }\n\n    var ids = this._pyramid.orderedIDs();\n    for (var i = 0; i < ids.length; i++) {\n        var tile = this._pyramid.getTile(ids[i]);\n        this._redoTilePlacement(tile);\n    }\n};\n\nexports._getTile = function(coord) {\n    return this._pyramid.getTile(coord.id);\n};\n\nexports._getVisibleCoordinates = function() {\n    if (!this._pyramid) return [];\n    else return this._pyramid.renderedIDs().map(TileCoord.fromID);\n};\n\nfunction sortTilesIn(a, b) {\n    var coordA = a.coord;\n    var coordB = b.coord;\n    return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles) {\n    var result = tiles[0] || {};\n    for (var i = 1; i < tiles.length; i++) {\n        var tile = tiles[i];\n        for (var layerID in tile) {\n            var tileFeatures = tile[layerID];\n            var resultFeatures = result[layerID];\n            if (resultFeatures === undefined) {\n                resultFeatures = result[layerID] = tileFeatures;\n            } else {\n                for (var f = 0; f < tileFeatures.length; f++) {\n                    resultFeatures.push(tileFeatures[f]);\n                }\n            }\n        }\n    }\n    return result;\n}\n\nexports._queryRenderedVectorFeatures = function(queryGeometry, params, zoom, bearing) {\n    if (!this._pyramid || !this.map)\n        return [];\n\n    var tilesIn = this._pyramid.tilesIn(queryGeometry);\n\n    tilesIn.sort(sortTilesIn);\n\n    var styleLayers = this.map.style._layers;\n\n    var renderedFeatureLayers = [];\n    for (var r = 0; r < tilesIn.length; r++) {\n        var tileIn = tilesIn[r];\n        if (!tileIn.tile.featureIndex) continue;\n\n        renderedFeatureLayers.push(tileIn.tile.featureIndex.query({\n            queryGeometry: tileIn.queryGeometry,\n            scale: tileIn.scale,\n            tileSize: tileIn.tile.tileSize,\n            bearing: bearing,\n            params: params\n        }, styleLayers));\n    }\n    return mergeRenderedFeatureLayers(renderedFeatureLayers);\n};\n\nexports._querySourceFeatures = function(params) {\n    if (!this._pyramid) {\n        return [];\n    }\n\n    var pyramid = this._pyramid;\n    var tiles = pyramid.renderedIDs().map(function(id) {\n        return pyramid.getTile(id);\n    });\n\n    var result = [];\n\n    var dataTiles = {};\n    for (var i = 0; i < tiles.length; i++) {\n        var tile = tiles[i];\n        var dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id;\n        if (!dataTiles[dataID]) {\n            dataTiles[dataID] = true;\n            tile.querySourceFeatures(result, params);\n        }\n    }\n\n    return result;\n};\n\n/*\n * Create a tiled data source instance given an options object\n *\n * @param {Object} options\n * @param {string} options.type Either `raster` or `vector`.\n * @param {string} options.url A tile source URL. This should either be `mapbox://{mapid}` or a full `http[s]` url that points to a TileJSON endpoint.\n * @param {Array} options.tiles An array of tile sources. If `url` is not specified, `tiles` can be used instead to specify tile sources, as in the TileJSON spec. Other TileJSON keys such as `minzoom` and `maxzoom` can be specified in a source object if `tiles` is used.\n * @param {string} options.id An optional `id` to assign to the source\n * @param {number} [options.tileSize=512] Optional tile size (width and height in pixels, assuming tiles are square). This option is only configurable for raster sources\n * @example\n * var sourceObj = new mapboxgl.Source.create({\n *    type: 'vector',\n *    url: 'mapbox://mapbox.mapbox-streets-v5'\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nexports.create = function(source) {\n    // This is not at file scope in order to avoid a circular require.\n    var sources = {\n        vector: require('./vector_tile_source'),\n        raster: require('./raster_tile_source'),\n        geojson: require('./geojson_source'),\n        video: require('./video_source'),\n        image: require('./image_source')\n    };\n\n    return exports.is(source) ? source : new sources[source.type](source);\n};\n\nexports.is = function(source) {\n    // This is not at file scope in order to avoid a circular require.\n    var sources = {\n        vector: require('./vector_tile_source'),\n        raster: require('./raster_tile_source'),\n        geojson: require('./geojson_source'),\n        video: require('./video_source'),\n        image: require('./image_source')\n    };\n\n    for (var type in sources) {\n        if (source instanceof sources[type]) {\n            return true;\n        }\n    }\n\n    return false;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/source.js\n// module id = 194\n// module chunks = 0 1","'use strict';\n\nvar Tile = require('./tile');\nvar TileCoord = require('./tile_coord');\nvar Point = require('point-geometry');\nvar Cache = require('../util/lru_cache');\nvar Coordinate = require('../geo/coordinate');\nvar util = require('../util/util');\nvar EXTENT = require('../data/bucket').EXTENT;\n\nmodule.exports = TilePyramid;\n\n/**\n * A tile pyramid is a specialized cache and datastructure\n * that contains tiles. It's used by sources to manage their\n * data.\n *\n * @param {Object} options\n * @param {number} options.tileSize\n * @param {number} options.minzoom\n * @param {number} options.maxzoom\n * @private\n */\nfunction TilePyramid(options) {\n    this.tileSize = options.tileSize;\n    this.minzoom = options.minzoom;\n    this.maxzoom = options.maxzoom;\n    this.roundZoom = options.roundZoom;\n    this.reparseOverscaled = options.reparseOverscaled;\n\n    this._load = options.load;\n    this._abort = options.abort;\n    this._unload = options.unload;\n    this._add = options.add;\n    this._remove = options.remove;\n    this._redoPlacement = options.redoPlacement;\n\n    this._tiles = {};\n    this._cache = new Cache(0, function(tile) { return this._unload(tile); }.bind(this));\n\n    this._filterRendered = this._filterRendered.bind(this);\n}\n\n\nTilePyramid.maxOverzooming = 10;\nTilePyramid.maxUnderzooming = 3;\n\nTilePyramid.prototype = {\n    /**\n     * Confirm that every tracked tile is loaded.\n     * @returns {boolean} whether all tiles are loaded.\n     * @private\n     */\n    loaded: function() {\n        for (var t in this._tiles) {\n            if (!this._tiles[t].loaded && !this._tiles[t].errored)\n                return false;\n        }\n        return true;\n    },\n\n    /**\n     * Return all tile ids ordered with z-order, and cast to numbers\n     * @returns {Array<number>} ids\n     * @private\n     */\n    orderedIDs: function() {\n        return Object.keys(this._tiles).map(Number).sort(compareKeyZoom);\n    },\n\n    renderedIDs: function() {\n        return this.orderedIDs().filter(this._filterRendered);\n    },\n\n    _filterRendered: function(id) {\n        return this._tiles[id].loaded && !this._coveredTiles[id];\n    },\n\n    reload: function() {\n        this._cache.reset();\n        for (var i in this._tiles) {\n            this._load(this._tiles[i]);\n        }\n    },\n\n    /**\n     * Get a specific tile by id\n     * @param {string|number} id tile id\n     * @returns {Object} tile\n     * @private\n     */\n    getTile: function(id) {\n        return this._tiles[id];\n    },\n\n    /**\n     * get the zoom level adjusted for the difference in map and source tilesizes\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    getZoom: function(transform) {\n        return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2;\n    },\n\n    /**\n     * Return a zoom level that will cover all tiles in a given transform\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    coveringZoomLevel: function(transform) {\n        return (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n    },\n\n    /**\n     * Given a transform, return all coordinates that could cover that\n     * transform for a covering zoom level.\n     * @param {Object} transform\n     * @returns {Array<Tile>} tiles\n     * @private\n     */\n    coveringTiles: function(transform) {\n        var z = this.coveringZoomLevel(transform);\n        var actualZ = z;\n\n        if (z < this.minzoom) return [];\n        if (z > this.maxzoom) z = this.maxzoom;\n\n        var tr = transform,\n            tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z),\n            centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5);\n\n        return TileCoord.cover(z, [\n            tr.pointCoordinate(new Point(0, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z),\n            tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z)\n        ], this.reparseOverscaled ? actualZ : z).sort(function(a, b) {\n            return centerPoint.dist(a) - centerPoint.dist(b);\n        });\n    },\n\n    /**\n     * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n     * adds found tiles to retain object; returns true if any child is found.\n     *\n     * @param {Coordinate} coord\n     * @param {number} maxCoveringZoom\n     * @param {boolean} retain\n     * @returns {boolean} whether the operation was complete\n     * @private\n     */\n    findLoadedChildren: function(coord, maxCoveringZoom, retain) {\n        var found = false;\n\n        for (var id in this._tiles) {\n            var tile = this._tiles[id];\n\n            // only consider loaded tiles on higher zoom levels (up to maxCoveringZoom)\n            if (retain[id] || !tile.loaded || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue;\n\n            // disregard tiles that are not descendants of the given tile coordinate\n            var z2 = Math.pow(2, Math.min(tile.coord.z, this.maxzoom) - Math.min(coord.z, this.maxzoom));\n            if (Math.floor(tile.coord.x / z2) !== coord.x ||\n                Math.floor(tile.coord.y / z2) !== coord.y)\n                continue;\n\n            // found loaded child\n            retain[id] = true;\n            found = true;\n\n            // loop through parents; retain the topmost loaded one if found\n            while (tile && tile.coord.z - 1 > coord.z) {\n                var parentId = tile.coord.parent(this.maxzoom).id;\n                tile = this._tiles[parentId];\n\n                if (tile && tile.loaded) {\n                    delete retain[id];\n                    retain[parentId] = true;\n                }\n            }\n        }\n        return found;\n    },\n\n    /**\n     * Find a loaded parent of the given tile (up to minCoveringZoom);\n     * adds the found tile to retain object and returns the tile if found\n     *\n     * @param {Coordinate} coord\n     * @param {number} minCoveringZoom\n     * @param {boolean} retain\n     * @returns {Tile} tile object\n     * @private\n     */\n    findLoadedParent: function(coord, minCoveringZoom, retain) {\n        for (var z = coord.z - 1; z >= minCoveringZoom; z--) {\n            coord = coord.parent(this.maxzoom);\n            var tile = this._tiles[coord.id];\n            if (tile && tile.loaded) {\n                retain[coord.id] = true;\n                return tile;\n            }\n            if (this._cache.has(coord.id)) {\n                this.addTile(coord);\n                retain[coord.id] = true;\n                return this._tiles[coord.id];\n            }\n        }\n    },\n\n    /**\n     * Resizes the tile cache based on the current viewport's size.\n     *\n     * Larger viewports use more tiles and need larger caches. Larger viewports\n     * are more likely to be found on devices with more memory and on pages where\n     * the map is more important.\n     *\n     * @private\n     */\n    updateCacheSize: function(transform) {\n        var widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1;\n        var heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1;\n        var approxTilesInView = widthInTiles * heightInTiles;\n        var commonZoomRange = 5;\n        this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange));\n    },\n\n    /**\n     * Removes tiles that are outside the viewport and adds new tiles that\n     * are inside the viewport.\n     * @private\n     */\n    update: function(used, transform, fadeDuration) {\n        var i;\n        var coord;\n        var tile;\n\n        this.updateCacheSize(transform);\n\n        // Determine the overzooming/underzooming amounts.\n        var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n        var minCoveringZoom = Math.max(zoom - TilePyramid.maxOverzooming, this.minzoom);\n        var maxCoveringZoom = Math.max(zoom + TilePyramid.maxUnderzooming,  this.minzoom);\n\n        // Retain is a list of tiles that we shouldn't delete, even if they are not\n        // the most ideal tile for the current viewport. This may include tiles like\n        // parent or child tiles that are *already* loaded.\n        var retain = {};\n        var now = new Date().getTime();\n\n        // Covered is a list of retained tiles who's areas are full covered by other,\n        // better, retained tiles. They are not drawn separately.\n        this._coveredTiles = {};\n\n        var required = used ? this.coveringTiles(transform) : [];\n        for (i = 0; i < required.length; i++) {\n            coord = required[i];\n            tile = this.addTile(coord);\n\n            retain[coord.id] = true;\n\n            if (tile.loaded)\n                continue;\n\n            // The tile we require is not yet loaded.\n            // Retain child or parent tiles that cover the same area.\n            if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                this.findLoadedParent(coord, minCoveringZoom, retain);\n            }\n        }\n\n        var parentsForFading = {};\n\n        var ids = Object.keys(retain);\n        for (var k = 0; k < ids.length; k++) {\n            var id = ids[k];\n            coord = TileCoord.fromID(id);\n            tile = this._tiles[id];\n            if (tile && tile.timeAdded > now - (fadeDuration || 0)) {\n                // This tile is still fading in. Find tiles to cross-fade with it.\n                if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                    retain[id] = true;\n                }\n                this.findLoadedParent(coord, minCoveringZoom, parentsForFading);\n            }\n        }\n\n        var fadedParent;\n        for (fadedParent in parentsForFading) {\n            if (!retain[fadedParent]) {\n                // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n                this._coveredTiles[fadedParent] = true;\n            }\n        }\n        for (fadedParent in parentsForFading) {\n            retain[fadedParent] = true;\n        }\n\n        // Remove the tiles we don't need anymore.\n        var remove = util.keysDifference(this._tiles, retain);\n        for (i = 0; i < remove.length; i++) {\n            this.removeTile(+remove[i]);\n        }\n\n        this.transform = transform;\n    },\n\n    /**\n     * Add a tile, given its coordinate, to the pyramid.\n     * @param {Coordinate} coord\n     * @returns {Coordinate} the coordinate.\n     * @private\n     */\n    addTile: function(coord) {\n        var tile = this._tiles[coord.id];\n        if (tile)\n            return tile;\n\n        var wrapped = coord.wrapped();\n        tile = this._tiles[wrapped.id];\n\n        if (!tile) {\n            tile = this._cache.get(wrapped.id);\n            if (tile && this._redoPlacement) {\n                this._redoPlacement(tile);\n            }\n        }\n\n        if (!tile) {\n            var zoom = coord.z;\n            var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1;\n            tile = new Tile(wrapped, this.tileSize * overscaling, this.maxzoom);\n            this._load(tile);\n        }\n\n        tile.uses++;\n        this._tiles[coord.id] = tile;\n        this._add(tile, coord);\n\n        return tile;\n    },\n\n    /**\n     * Remove a tile, given its id, from the pyramid\n     * @param {string|number} id tile id\n     * @returns {undefined} nothing\n     * @private\n     */\n    removeTile: function(id) {\n        var tile = this._tiles[id];\n        if (!tile)\n            return;\n\n        tile.uses--;\n        delete this._tiles[id];\n        this._remove(tile);\n\n        if (tile.uses > 0)\n            return;\n\n        if (tile.loaded) {\n            this._cache.add(tile.coord.wrapped().id, tile);\n        } else {\n            this._abort(tile);\n            this._unload(tile);\n        }\n    },\n\n    /**\n     * Remove all tiles from this pyramid\n     * @private\n     */\n    clearTiles: function() {\n        for (var id in this._tiles)\n            this.removeTile(id);\n        this._cache.reset();\n    },\n\n    /**\n     * Search through our current tiles and attempt to find the tiles that\n     * cover the given bounds.\n     * @param {Array<Coordinate>} queryGeometry coordinates of the corners of bounding rectangle\n     * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.\n     * @private\n     */\n    tilesIn: function(queryGeometry) {\n        var tileResults = {};\n        var ids = this.orderedIDs();\n\n        var minX = Infinity;\n        var minY = Infinity;\n        var maxX = -Infinity;\n        var maxY = -Infinity;\n        var z = queryGeometry[0].zoom;\n\n        for (var k = 0; k < queryGeometry.length; k++) {\n            var p = queryGeometry[k];\n            minX = Math.min(minX, p.column);\n            minY = Math.min(minY, p.row);\n            maxX = Math.max(maxX, p.column);\n            maxY = Math.max(maxY, p.row);\n        }\n\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this._tiles[ids[i]];\n            var coord = TileCoord.fromID(ids[i]);\n\n            var tileSpaceBounds = [\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)),\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z))\n            ];\n\n            if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT &&\n                tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) {\n\n                var tileSpaceQueryGeometry = [];\n                for (var j = 0; j < queryGeometry.length; j++) {\n                    tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j]));\n                }\n\n                var tileResult = tileResults[tile.coord.id];\n                if (tileResult === undefined) {\n                    tileResult = tileResults[tile.coord.id] = {\n                        tile: tile,\n                        coord: coord,\n                        queryGeometry: [],\n                        scale: Math.pow(2, this.transform.zoom - tile.coord.z)\n                    };\n                }\n\n                // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts\n                tileResult.queryGeometry.push(tileSpaceQueryGeometry);\n            }\n        }\n\n        var results = [];\n        for (var t in tileResults) {\n            results.push(tileResults[t]);\n        }\n        return results;\n    }\n};\n\n/**\n * Convert a coordinate to a point in a tile's coordinate space.\n * @param {Coordinate} tileCoord\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\nfunction coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) {\n    var zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom));\n    return {\n        x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT,\n        y: (zoomedCoord.row - tileCoord.y) * EXTENT\n    };\n\n}\n\nfunction compareKeyZoom(a, b) {\n    return (a % 32) - (b % 32);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile_pyramid.js\n// module id = 195\n// module chunks = 0 1","module.exports.VectorTile = require('./lib/vectortile.js');\nmodule.exports.VectorTileFeature = require('./lib/vectortilefeature.js');\nmodule.exports.VectorTileLayer = require('./lib/vectortilelayer.js');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vector-tile/index.js\n// module id = 196\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    gl.enable(gl.DEPTH_TEST);\n    painter.depthMask(true);\n\n    // Change depth function to prevent double drawing in areas where tiles overlap.\n    gl.depthFunc(gl.LESS);\n\n    var minTileZ = coords.length && coords[0].z;\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n        painter.setDepthSublayer(coord.z - minTileZ);\n        drawRasterTile(painter, source, layer, coord);\n    }\n\n    gl.depthFunc(gl.LEQUAL);\n}\n\ndrawRaster.RasterBoundsArray = new StructArrayType({\n    members: [\n        { name: 'a_pos', type: 'Int16', components: 2 },\n        { name: 'a_texture_pos', type: 'Int16', components: 2 }\n    ]\n});\n\nfunction drawRasterTile(painter, source, layer, coord) {\n\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n\n    var tile = source.getTile(coord);\n    var posMatrix = painter.transform.calculatePosMatrix(coord, source.maxzoom);\n\n    var program = painter.useProgram('raster');\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    // color parameters\n    gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']);\n    gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']);\n    gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n    gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n    gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n    var parentTile = tile.source && tile.source._pyramid.findLoadedParent(coord, 0, {}),\n        opacities = getOpacities(tile, parentTile, layer, painter.transform);\n\n    var parentScaleBy, parentTL;\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n    gl.activeTexture(gl.TEXTURE1);\n\n    if (parentTile) {\n        gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n        parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n        parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n        opacities[1] = 0;\n    }\n\n    // cross-fade parameters\n    gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]);\n    gl.uniform1f(program.u_scale_parent, parentScaleBy || 1);\n    gl.uniform1f(program.u_buffer_scale, 1);\n    gl.uniform1f(program.u_opacity0, opacities[0]);\n    gl.uniform1f(program.u_opacity1, opacities[1]);\n    gl.uniform1i(program.u_image0, 0);\n    gl.uniform1i(program.u_image1, 1);\n\n    var buffer = tile.boundsBuffer || painter.rasterBoundsBuffer;\n    var vao = tile.boundsVAO || painter.rasterBoundsVAO;\n    vao.bind(gl, program, buffer);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length);\n}\n\nfunction spinWeights(angle) {\n    angle *= Math.PI / 180;\n    var s = Math.sin(angle);\n    var c = Math.cos(angle);\n    return [\n        (2 * c + 1) / 3,\n        (-Math.sqrt(3) * s - c + 1) / 3,\n        (Math.sqrt(3) * s - c + 1) / 3\n    ];\n}\n\nfunction contrastFactor(contrast) {\n    return contrast > 0 ?\n        1 / (1 - contrast) :\n        1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n    return saturation > 0 ?\n        1 - 1 / (1.001 - saturation) :\n        -saturation;\n}\n\nfunction getOpacities(tile, parentTile, layer, transform) {\n    var opacity = [1, 0];\n    var fadeDuration = layer.paint['raster-fade-duration'];\n\n    if (tile.source && fadeDuration > 0) {\n        var now = new Date().getTime();\n\n        var sinceTile = (now - tile.timeAdded) / fadeDuration;\n        var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n        var idealZ = tile.source._pyramid.coveringZoomLevel(transform);\n        var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false;\n\n        if (!parentTile || parentFurther) {\n            // if no parent or parent is older\n            opacity[0] = util.clamp(sinceTile, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        } else {\n            // parent is younger, zooming out\n            opacity[0] = util.clamp(1 - sinceParent, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        }\n    }\n\n    var op = layer.paint['raster-opacity'];\n    opacity[0] *= op;\n    opacity[1] *= op;\n\n    return opacity;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_raster.js\n// module id = 197\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LngLatBounds;\n\nvar LngLat = require('./lng_lat');\n\n/**\n * Creates a bounding box from the given pair of points. If parameteres are omitted, a `null` bounding box is created.\n *\n * @class LngLatBounds\n * @classdesc A representation of rectangular box on the earth, defined by its southwest and northeast points in longitude and latitude.\n * @param {LngLat} sw southwest\n * @param {LngLat} ne northeast\n * @example\n * var sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * var ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * var llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nfunction LngLatBounds(sw, ne) {\n    if (!sw) {\n        return;\n    } else if (ne) {\n        this.extend(sw).extend(ne);\n    } else if (sw.length === 4) {\n        this.extend([sw[0], sw[1]]).extend([sw[2], sw[3]]);\n    } else {\n        this.extend(sw[0]).extend(sw[1]);\n    }\n}\n\nLngLatBounds.prototype = {\n\n    /**\n     * Extend the bounds to include a given LngLat or LngLatBounds.\n     *\n     * @param {LngLat|LngLatBounds} obj object to extend to\n     * @returns {LngLatBounds} `this`\n     */\n    extend: function(obj) {\n        var sw = this._sw,\n            ne = this._ne,\n            sw2, ne2;\n\n        if (obj instanceof LngLat) {\n            sw2 = obj;\n            ne2 = obj;\n\n        } else if (obj instanceof LngLatBounds) {\n            sw2 = obj._sw;\n            ne2 = obj._ne;\n\n            if (!sw2 || !ne2) return this;\n\n        } else {\n            return obj ? this.extend(LngLat.convert(obj) || LngLatBounds.convert(obj)) : this;\n        }\n\n        if (!sw && !ne) {\n            this._sw = new LngLat(sw2.lng, sw2.lat);\n            this._ne = new LngLat(ne2.lng, ne2.lat);\n\n        } else {\n            sw.lng = Math.min(sw2.lng, sw.lng);\n            sw.lat = Math.min(sw2.lat, sw.lat);\n            ne.lng = Math.max(ne2.lng, ne.lng);\n            ne.lat = Math.max(ne2.lat, ne.lat);\n        }\n\n        return this;\n    },\n\n    /**\n     * Get the point equidistant from this box's corners\n     * @returns {LngLat} centerpoint\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n     */\n    getCenter: function() {\n        return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n    },\n\n    /**\n     * Get southwest corner\n     * @returns {LngLat} southwest\n     */\n    getSouthWest: function() { return this._sw; },\n\n    /**\n     * Get northeast corner\n     * @returns {LngLat} northeast\n     */\n    getNorthEast: function() { return this._ne; },\n\n    /**\n     * Get northwest corner\n     * @returns {LngLat} northwest\n     */\n    getNorthWest: function() { return new LngLat(this.getWest(), this.getNorth()); },\n\n    /**\n     * Get southeast corner\n     * @returns {LngLat} southeast\n     */\n    getSouthEast: function() { return new LngLat(this.getEast(), this.getSouth()); },\n\n    /**\n     * Get west edge longitude\n     * @returns {number} west\n     */\n    getWest:  function() { return this._sw.lng; },\n\n    /**\n     * Get south edge latitude\n     * @returns {number} south\n     */\n    getSouth: function() { return this._sw.lat; },\n\n    /**\n     * Get east edge longitude\n     * @returns {number} east\n     */\n    getEast:  function() { return this._ne.lng; },\n\n    /**\n     * Get north edge latitude\n     * @returns {number} north\n     */\n    getNorth: function() { return this._ne.lat; },\n\n    /**\n     * Return a `LngLatBounds` as an array\n     *\n     * @returns {array} [lng, lat]\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n     */\n    toArray: function () {\n        return [this._sw.toArray(), this._ne.toArray()];\n    },\n\n    /**\n     * Return a `LngLatBounds` as a string\n     *\n     * @returns {string} \"LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))\"\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n     */\n    toString: function () {\n        return 'LngLatBounds(' + this._sw.toString() + ', ' + this._ne.toString() + ')';\n    }\n};\n\n/**\n * Convert an array to a `LngLatBounds` object, or return an existing\n * `LngLatBounds` object unchanged.\n *\n * Calls `LngLat#convert` internally to convert arrays as `LngLat` values.\n *\n * @param {LngLatBounds|Array<number>|Array<Array<number>>} input input to convert to a LngLatBounds\n * @returns {LngLatBounds} LngLatBounds object or original input\n * @example\n * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n * var llb = mapboxgl.LngLatBounds.convert(arr);\n * llb;   // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n */\nLngLatBounds.convert = function (input) {\n    if (!input || input instanceof LngLatBounds) return input;\n    return new LngLatBounds(input);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/lng_lat_bounds.js\n// module id = 198\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar Evented = require('../../util/evented');\nmodule.exports = Control;\n\n/**\n * A base class for map-related interface elements.\n *\n * @class Control\n */\nfunction Control() {}\n\nControl.prototype = {\n    /**\n     * Add this control to the map, returning the control itself\n     * for chaining. This will insert the control's DOM element into\n     * the map's DOM element if the control has a `position` specified.\n     *\n     * @param {Map} map\n     * @returns {Control} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        var container = this._container = this.onAdd(map);\n        if (this.options && this.options.position) {\n            var pos = this.options.position;\n            var corner = map._controlCorners[pos];\n            container.className += ' mapboxgl-ctrl';\n            if (pos.indexOf('bottom') !== -1) {\n                corner.insertBefore(container, corner.firstChild);\n            } else {\n                corner.appendChild(container);\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Remove this control from the map it has been added to.\n     *\n     * @returns {Control} `this`\n     */\n    remove: function() {\n        this._container.parentNode.removeChild(this._container);\n        if (this.onRemove) this.onRemove(this._map);\n        this._map = null;\n        return this;\n    }\n};\n\nutil.extend(Control.prototype, Evented);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/control.js\n// module id = 199\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.END_DRAG = exports.DROP = exports.HOVER = exports.PUBLISH_DRAG_SOURCE = exports.BEGIN_DRAG = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.beginDrag = beginDrag;\nexports.publishDragSource = publishDragSource;\nexports.hover = hover;\nexports.drop = drop;\nexports.endDrag = endDrag;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _isObject = require('lodash/isObject');\n\nvar _isObject2 = _interopRequireDefault(_isObject);\n\nvar _matchesType = require('../utils/matchesType');\n\nvar _matchesType2 = _interopRequireDefault(_matchesType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BEGIN_DRAG = exports.BEGIN_DRAG = 'dnd-core/BEGIN_DRAG';\nvar PUBLISH_DRAG_SOURCE = exports.PUBLISH_DRAG_SOURCE = 'dnd-core/PUBLISH_DRAG_SOURCE';\nvar HOVER = exports.HOVER = 'dnd-core/HOVER';\nvar DROP = exports.DROP = 'dnd-core/DROP';\nvar END_DRAG = exports.END_DRAG = 'dnd-core/END_DRAG';\n\nfunction beginDrag(sourceIds) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { publishSource: true, clientOffset: null };\n\tvar publishSource = options.publishSource,\n\t    clientOffset = options.clientOffset,\n\t    getSourceClientOffset = options.getSourceClientOffset;\n\n\t(0, _invariant2.default)((0, _isArray2.default)(sourceIds), 'Expected sourceIds to be an array.');\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(!monitor.isDragging(), 'Cannot call beginDrag while dragging.');\n\n\tfor (var i = 0; i < sourceIds.length; i++) {\n\t\t(0, _invariant2.default)(registry.getSource(sourceIds[i]), 'Expected sourceIds to be registered.');\n\t}\n\n\tvar sourceId = null;\n\tfor (var _i = sourceIds.length - 1; _i >= 0; _i--) {\n\t\tif (monitor.canDragSource(sourceIds[_i])) {\n\t\t\tsourceId = sourceIds[_i];\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (sourceId === null) {\n\t\treturn;\n\t}\n\n\tvar sourceClientOffset = null;\n\tif (clientOffset) {\n\t\t(0, _invariant2.default)(typeof getSourceClientOffset === 'function', 'When clientOffset is provided, getSourceClientOffset must be a function.');\n\t\tsourceClientOffset = getSourceClientOffset(sourceId);\n\t}\n\n\tvar source = registry.getSource(sourceId);\n\tvar item = source.beginDrag(monitor, sourceId);\n\t(0, _invariant2.default)((0, _isObject2.default)(item), 'Item must be an object.');\n\n\tregistry.pinSource(sourceId);\n\n\tvar itemType = registry.getSourceType(sourceId);\n\treturn {\n\t\ttype: BEGIN_DRAG,\n\t\titemType: itemType,\n\t\titem: item,\n\t\tsourceId: sourceId,\n\t\tclientOffset: clientOffset,\n\t\tsourceClientOffset: sourceClientOffset,\n\t\tisSourcePublic: publishSource\n\t};\n}\n\nfunction publishDragSource() {\n\tvar monitor = this.getMonitor();\n\tif (!monitor.isDragging()) {\n\t\treturn;\n\t}\n\n\treturn { type: PUBLISH_DRAG_SOURCE };\n}\n\nfunction hover(targetIdsArg) {\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t    _ref$clientOffset = _ref.clientOffset,\n\t    clientOffset = _ref$clientOffset === undefined ? null : _ref$clientOffset;\n\n\t(0, _invariant2.default)((0, _isArray2.default)(targetIdsArg), 'Expected targetIds to be an array.');\n\tvar targetIds = targetIdsArg.slice(0);\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call hover while not dragging.');\n\t(0, _invariant2.default)(!monitor.didDrop(), 'Cannot call hover after drop.');\n\n\t// First check invariants.\n\tfor (var i = 0; i < targetIds.length; i++) {\n\t\tvar targetId = targetIds[i];\n\t\t(0, _invariant2.default)(targetIds.lastIndexOf(targetId) === i, 'Expected targetIds to be unique in the passed array.');\n\n\t\tvar target = registry.getTarget(targetId);\n\t\t(0, _invariant2.default)(target, 'Expected targetIds to be registered.');\n\t}\n\n\tvar draggedItemType = monitor.getItemType();\n\n\t// Remove those targetIds that don't match the targetType.  This\n\t// fixes shallow isOver which would only be non-shallow because of\n\t// non-matching targets.\n\tfor (var _i2 = targetIds.length - 1; _i2 >= 0; _i2--) {\n\t\tvar _targetId = targetIds[_i2];\n\t\tvar targetType = registry.getTargetType(_targetId);\n\t\tif (!(0, _matchesType2.default)(targetType, draggedItemType)) {\n\t\t\ttargetIds.splice(_i2, 1);\n\t\t}\n\t}\n\n\t// Finally call hover on all matching targets.\n\tfor (var _i3 = 0; _i3 < targetIds.length; _i3++) {\n\t\tvar _targetId2 = targetIds[_i3];\n\t\tvar _target = registry.getTarget(_targetId2);\n\t\t_target.hover(monitor, _targetId2);\n\t}\n\n\treturn {\n\t\ttype: HOVER,\n\t\ttargetIds: targetIds,\n\t\tclientOffset: clientOffset\n\t};\n}\n\nfunction drop() {\n\tvar _this = this;\n\n\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call drop while not dragging.');\n\t(0, _invariant2.default)(!monitor.didDrop(), 'Cannot call drop twice during one drag operation.');\n\n\tvar targetIds = monitor.getTargetIds().filter(monitor.canDropOnTarget, monitor);\n\n\ttargetIds.reverse();\n\ttargetIds.forEach(function (targetId, index) {\n\t\tvar target = registry.getTarget(targetId);\n\n\t\tvar dropResult = target.drop(monitor, targetId);\n\t\t(0, _invariant2.default)(typeof dropResult === 'undefined' || (0, _isObject2.default)(dropResult), 'Drop result must either be an object or undefined.');\n\t\tif (typeof dropResult === 'undefined') {\n\t\t\tdropResult = index === 0 ? {} : monitor.getDropResult();\n\t\t}\n\n\t\t_this.store.dispatch({\n\t\t\ttype: DROP,\n\t\t\tdropResult: _extends({}, options, dropResult)\n\t\t});\n\t});\n}\n\nfunction endDrag() {\n\tvar monitor = this.getMonitor();\n\tvar registry = this.getRegistry();\n\t(0, _invariant2.default)(monitor.isDragging(), 'Cannot call endDrag while not dragging.');\n\n\tvar sourceId = monitor.getSourceId();\n\tvar source = registry.getSource(sourceId, true);\n\tsource.endDrag(monitor, sourceId);\n\n\tregistry.unpinSource();\n\n\treturn { type: END_DRAG };\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/actions/dragDrop.js\n// module id = 200\n// module chunks = 0 1","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_nativeCreate.js\n// module id = 201\n// module chunks = 0 1","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_getNative.js\n// module id = 202\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_root.js\n// module id = 203\n// module chunks = 0 1","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_assocIndexOf.js\n// module id = 204\n// module chunks = 0 1","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_getMapData.js\n// module id = 205\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.addSource = addSource;\nexports.addTarget = addTarget;\nexports.removeSource = removeSource;\nexports.removeTarget = removeTarget;\nvar ADD_SOURCE = exports.ADD_SOURCE = 'dnd-core/ADD_SOURCE';\nvar ADD_TARGET = exports.ADD_TARGET = 'dnd-core/ADD_TARGET';\nvar REMOVE_SOURCE = exports.REMOVE_SOURCE = 'dnd-core/REMOVE_SOURCE';\nvar REMOVE_TARGET = exports.REMOVE_TARGET = 'dnd-core/REMOVE_TARGET';\n\nfunction addSource(sourceId) {\n\treturn {\n\t\ttype: ADD_SOURCE,\n\t\tsourceId: sourceId\n\t};\n}\n\nfunction addTarget(targetId) {\n\treturn {\n\t\ttype: ADD_TARGET,\n\t\ttargetId: targetId\n\t};\n}\n\nfunction removeSource(sourceId) {\n\treturn {\n\t\ttype: REMOVE_SOURCE,\n\t\tsourceId: sourceId\n\t};\n}\n\nfunction removeTarget(targetId) {\n\treturn {\n\t\ttype: REMOVE_TARGET,\n\t\ttargetId: targetId\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/actions/registry.js\n// module id = 206\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = checkDecoratorArguments;\nfunction checkDecoratorArguments(functionName, signature) {\n\tif (process.env.NODE_ENV !== 'production') {\n\t\tfor (var i = 0; i < (arguments.length <= 2 ? 0 : arguments.length - 2); i += 1) {\n\t\t\tvar arg = arguments.length <= i + 2 ? undefined : arguments[i + 2];\n\t\t\tif (arg && arg.prototype && arg.prototype.render) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('You seem to be applying the arguments in the wrong order. ' + ('It should be ' + functionName + '(' + signature + ')(Component), not the other way around. ') + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#you-seem-to-be-applying-the-arguments-in-the-wrong-order');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/utils/checkDecoratorArguments.js\n// module id = 207\n// module chunks = 0 1","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_getNative.js\n// module id = 208\n// module chunks = 0 1","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isObject.js\n// module id = 209\n// module chunks = 0 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isObjectLike.js\n// module id = 210\n// module chunks = 0 1","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_nativeCreate.js\n// module id = 211\n// module chunks = 0 1","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_assocIndexOf.js\n// module id = 212\n// module chunks = 0 1","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_getMapData.js\n// module id = 213\n// module chunks = 0 1","import _ from 'lodash';\nimport React from 'react';\n\nimport { numberTypes } from './numberTypes';\nimport { formatValue } from './formatValue';\n\nexport interface IAmountProps {\n  value: number;\n  unit: any;\n  addSpace?: boolean;\n  noUnitSymbols?: boolean;\n  abbreviated?: boolean;\n}\n\nconst Amount: React.SFC<IAmountProps> =\n  ({ unit = numberTypes.none, abbreviated = false, value, noUnitSymbols, addSpace = false }) => {\n    \n    const space = addSpace ? ' ' : '';\n\n    if (!_.isNumber(value)) {\n      return <span>Null</span>;\n    }\n\n    if (noUnitSymbols) {\n      return <span>{formatValue(unit.get('symbol'), value)}</span>;\n    }\n\n    return <span>{unit.get('formatter')(formatValue(unit.get('symbol'), value, abbreviated), space)}</span>;\n  };\n\nexport default Amount;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/amount.tsx","'use strict';\n\nmodule.exports = Coordinate;\n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nfunction Coordinate(column, row, zoom) {\n    this.column = column;\n    this.row = row;\n    this.zoom = zoom;\n}\n\nCoordinate.prototype = {\n\n    /**\n     * Create a clone of this coordinate that can be mutated without\n     * changing the original coordinate\n     *\n     * @returns {Coordinate} clone\n     * @private\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.clone();\n     * // since coord is cloned, modifying a property of c2 does\n     * // not modify it.\n     * c2.zoom = 2;\n     */\n    clone: function() {\n        return new Coordinate(this.column, this.row, this.zoom);\n    },\n\n    /**\n     * Zoom this coordinate to a given zoom level. This returns a new\n     * coordinate object, not mutating the old one.\n     *\n     * @param {number} zoom\n     * @returns {Coordinate} zoomed coordinate\n     * @private\n     * @example\n     * var coord = new Coordinate(0, 0, 0);\n     * var c2 = coord.zoomTo(1);\n     * c2 // equals new Coordinate(0, 0, 1);\n     */\n    zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); },\n\n    /**\n     * Subtract the column and row values of this coordinate from those\n     * of another coordinate. The other coordinat will be zoomed to the\n     * same level as `this` before the subtraction occurs\n     *\n     * @param {Coordinate} c other coordinate\n     * @returns {Coordinate} result\n     * @private\n     */\n    sub: function(c) { return this.clone()._sub(c); },\n\n    _zoomTo: function(zoom) {\n        var scale = Math.pow(2, zoom - this.zoom);\n        this.column *= scale;\n        this.row *= scale;\n        this.zoom = zoom;\n        return this;\n    },\n\n    _sub: function(c) {\n        c = c.zoomTo(this.zoom);\n        this.column -= c.column;\n        this.row -= c.row;\n        return this;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/geo/coordinate.js\n// module id = 215\n// module chunks = 0 1","'use strict';\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n    return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t)\n    ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n    return [\n        interpolate(from[0], to[0], t),\n        interpolate(from[1], to[1], t),\n        interpolate(from[2], to[2], t),\n        interpolate(from[3], to[3], t)\n    ];\n};\n\ninterpolate.array = function(from, to, t) {\n    return from.map(function(d, i) {\n        return interpolate(d, to[i], t);\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/interpolate.js\n// module id = 216\n// module chunks = 0 1","'use strict';\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nmodule.exports = function unbundle(value) {\n    if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n        return value.valueOf();\n    } else {\n        return value;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/util/unbundle_jsonlint.js\n// module id = 217\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    gl.enable(gl.DEPTH_TEST);\n    painter.depthMask(true);\n\n    // Change depth function to prevent double drawing in areas where tiles overlap.\n    gl.depthFunc(gl.LESS);\n\n    var minTileZ = coords.length && coords[0].z;\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n        painter.setDepthSublayer(coord.z - minTileZ);\n        drawRasterTile(painter, source, layer, coord);\n    }\n\n    gl.depthFunc(gl.LEQUAL);\n}\n\ndrawRaster.RasterBoundsArray = new StructArrayType({\n    members: [\n        { name: 'a_pos', type: 'Int16', components: 2 },\n        { name: 'a_texture_pos', type: 'Int16', components: 2 }\n    ]\n});\n\nfunction drawRasterTile(painter, source, layer, coord) {\n\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n\n    var tile = source.getTile(coord);\n    var posMatrix = painter.transform.calculatePosMatrix(coord, source.maxzoom);\n\n    var program = painter.useProgram('raster');\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    // color parameters\n    gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']);\n    gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']);\n    gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n    gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n    gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n    var parentTile = tile.source && tile.source.findLoadedParent(coord, 0, {}),\n        opacities = getOpacities(tile, parentTile, layer, painter.transform);\n\n    var parentScaleBy, parentTL;\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n    gl.activeTexture(gl.TEXTURE1);\n\n    if (parentTile) {\n        gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n        parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n        parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n        opacities[1] = 0;\n    }\n\n    // cross-fade parameters\n    gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]);\n    gl.uniform1f(program.u_scale_parent, parentScaleBy || 1);\n    gl.uniform1f(program.u_buffer_scale, 1);\n    gl.uniform1f(program.u_opacity0, opacities[0]);\n    gl.uniform1f(program.u_opacity1, opacities[1]);\n    gl.uniform1i(program.u_image0, 0);\n    gl.uniform1i(program.u_image1, 1);\n\n    var buffer = tile.boundsBuffer || painter.rasterBoundsBuffer;\n    var vao = tile.boundsVAO || painter.rasterBoundsVAO;\n    vao.bind(gl, program, buffer);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length);\n}\n\nfunction spinWeights(angle) {\n    angle *= Math.PI / 180;\n    var s = Math.sin(angle);\n    var c = Math.cos(angle);\n    return [\n        (2 * c + 1) / 3,\n        (-Math.sqrt(3) * s - c + 1) / 3,\n        (Math.sqrt(3) * s - c + 1) / 3\n    ];\n}\n\nfunction contrastFactor(contrast) {\n    return contrast > 0 ?\n        1 / (1 - contrast) :\n        1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n    return saturation > 0 ?\n        1 - 1 / (1.001 - saturation) :\n        -saturation;\n}\n\nfunction getOpacities(tile, parentTile, layer, transform) {\n    var opacity = [1, 0];\n    var fadeDuration = layer.paint['raster-fade-duration'];\n\n    if (tile.source && fadeDuration > 0) {\n        var now = new Date().getTime();\n\n        var sinceTile = (now - tile.timeAdded) / fadeDuration;\n        var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n        var idealZ = transform.coveringZoomLevel(tile.source);\n        var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false;\n\n        if (!parentTile || parentFurther) {\n            // if no parent or parent is older\n            opacity[0] = util.clamp(sinceTile, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        } else {\n            // parent is younger, zooming out\n            opacity[0] = util.clamp(1 - sinceParent, 0, 1);\n            opacity[1] = 1 - opacity[0];\n        }\n    }\n\n    var op = layer.paint['raster-opacity'];\n    opacity[0] *= op;\n    opacity[1] *= op;\n\n    return opacity;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_raster.js\n// module id = 218\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LngLatBounds;\n\nvar LngLat = require('./lng_lat');\n\n/**\n * A `LngLatBounds` object represents a geographical bounding box,\n * defined by its southwest and northeast points in longitude and latitude.\n *\n * If no arguments are provided to the constructor, a `null` bounding box is created.\n *\n * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option\n * can also accept an `Array` of two [`LngLatLike`](#LngLatLike) constructs and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatBoundsLike`](#LngLatBoundsLike).\n *\n * @class LngLatBounds\n * @param {LngLatLike} sw The southwest corner of the bounding box.\n * @param {LngLatLike} ne The northeast corner of the bounding box.\n * @example\n * var sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * var ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * var llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nfunction LngLatBounds(sw, ne) {\n    if (!sw) {\n        return;\n    } else if (ne) {\n        this.setSouthWest(sw).setNorthEast(ne);\n    } else if (sw.length === 4) {\n        this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]);\n    } else {\n        this.setSouthWest(sw[0]).setNorthEast(sw[1]);\n    }\n}\n\nLngLatBounds.prototype = {\n\n    /**\n     * Set the northeast corner of the bounding box\n     *\n     * @param {LngLatLike} ne\n     * @returns {LngLatBounds} `this`\n     */\n    setNorthEast: function(ne) {\n        this._ne = LngLat.convert(ne);\n        return this;\n    },\n\n    /**\n     * Set the southwest corner of the bounding box\n     *\n     * @param {LngLatLike} sw\n     * @returns {LngLatBounds} `this`\n     */\n    setSouthWest: function(sw) {\n        this._sw = LngLat.convert(sw);\n        return this;\n    },\n\n    /**\n     * Extend the bounds to include a given LngLat or LngLatBounds.\n     *\n     * @param {LngLat|LngLatBounds} obj object to extend to\n     * @returns {LngLatBounds} `this`\n     */\n    extend: function(obj) {\n        var sw = this._sw,\n            ne = this._ne,\n            sw2, ne2;\n\n        if (obj instanceof LngLat) {\n            sw2 = obj;\n            ne2 = obj;\n\n        } else if (obj instanceof LngLatBounds) {\n            sw2 = obj._sw;\n            ne2 = obj._ne;\n\n            if (!sw2 || !ne2) return this;\n\n        } else {\n            return obj ? this.extend(LngLat.convert(obj) || LngLatBounds.convert(obj)) : this;\n        }\n\n        if (!sw && !ne) {\n            this._sw = new LngLat(sw2.lng, sw2.lat);\n            this._ne = new LngLat(ne2.lng, ne2.lat);\n\n        } else {\n            sw.lng = Math.min(sw2.lng, sw.lng);\n            sw.lat = Math.min(sw2.lat, sw.lat);\n            ne.lng = Math.max(ne2.lng, ne.lng);\n            ne.lat = Math.max(ne2.lat, ne.lat);\n        }\n\n        return this;\n    },\n\n    /**\n     * Returns the geographical coordinate equidistant from the bounding box's corners.\n     *\n     * @returns {LngLat} The bounding box's center.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n     */\n    getCenter: function() {\n        return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n    },\n\n    /**\n     * Returns the southwest corner of the bounding box.\n     *\n     * @returns {LngLat} The southwest corner of the bounding box.\n     */\n    getSouthWest: function() { return this._sw; },\n\n    /**\n    * Returns the northeast corner of the bounding box.\n    *\n    * @returns {LngLat} The northeast corner of the bounding box.\n     */\n    getNorthEast: function() { return this._ne; },\n\n    /**\n    * Returns the northwest corner of the bounding box.\n    *\n    * @returns {LngLat} The northwest corner of the bounding box.\n     */\n    getNorthWest: function() { return new LngLat(this.getWest(), this.getNorth()); },\n\n    /**\n    * Returns the southeast corner of the bounding box.\n    *\n    * @returns {LngLat} The southeast corner of the bounding box.\n     */\n    getSouthEast: function() { return new LngLat(this.getEast(), this.getSouth()); },\n\n    /**\n    * Returns the west edge of the bounding box.\n    *\n    * @returns {LngLat} The west edge of the bounding box.\n     */\n    getWest:  function() { return this._sw.lng; },\n\n    /**\n    * Returns the south edge of the bounding box.\n    *\n    * @returns {LngLat} The south edge of the bounding box.\n     */\n    getSouth: function() { return this._sw.lat; },\n\n    /**\n    * Returns the east edge of the bounding box.\n    *\n    * @returns {LngLat} The east edge of the bounding box.\n     */\n    getEast:  function() { return this._ne.lng; },\n\n    /**\n    * Returns the north edge of the bounding box.\n    *\n    * @returns {LngLat} The north edge of the bounding box.\n     */\n    getNorth: function() { return this._ne.lat; },\n\n    /**\n     * Returns the bounding box represented as an array.\n     *\n     * @returns {Array<Array<number>>} The bounding box represented as an array, consisting of the\n     *   southwest and northeast coordinates of the bounding represented as arrays of numbers.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n     */\n    toArray: function () {\n        return [this._sw.toArray(), this._ne.toArray()];\n    },\n\n    /**\n     * Return the bounding box represented as a string.\n     *\n     * @returns {string} The bounding box represents as a string of the format\n     *   `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.\n     * @example\n     * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n     * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n     */\n    toString: function () {\n        return 'LngLatBounds(' + this._sw.toString() + ', ' + this._ne.toString() + ')';\n    }\n};\n\n/**\n * Converts an array to a `LngLatBounds` object.\n *\n * If a `LngLatBounds` object is passed in, the function returns it unchanged.\n *\n * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.\n *\n * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.\n * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.\n * @example\n * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n * var llb = mapboxgl.LngLatBounds.convert(arr);\n * llb;   // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n */\nLngLatBounds.convert = function (input) {\n    if (!input || input instanceof LngLatBounds) return input;\n    return new LngLatBounds(input);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/geo/lng_lat_bounds.js\n// module id = 219\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport _s from 'underscore.string';\n\nimport * as og from '../og';\nimport strings from '../strings';\nimport ReportActions from '../actions/report_actions';\nimport SummaryReportStore from '../stores/summary_report_store';\n\nimport createReactClass from 'create-react-class';\n\nconst ShareList = createReactClass<any, any>({\n  propTypes: {\n    linkHelper: PropTypes.object.isRequired,\n    options: PropTypes.object,\n    showShareMenu: PropTypes.bool,\n    showDownloadItems: PropTypes.bool\n  },\n\n  handleTwitter() {\n    this.props.linkHelper.shareTwitter();\n  },\n\n  handleFacebook() {\n    this.props.linkHelper.shareFacebook();\n  },\n\n  handleGoogle() {\n    this.props.linkHelper.shareGoogle();\n  },\n\n  handleEmail() {\n    this.props.linkHelper.shareEmail();\n  },\n\n  handleCSVDownload() {\n    ReportActions.downloadCSV();\n    this.props.options.downloadModel.downloadCsv(this.downloadData());\n  },\n\n  showDownloads() {\n    ReportActions.showDownloadModal();\n  },\n\n  viewData() {\n    return {\n      hideImageDownload: !og.svgSupported()\n    };\n  },\n\n  tableHeader(lines, maxDepth) {\n    const state = SummaryReportStore.getState();\n    const dataSets = SummaryReportStore.getRenderedDataSets(true);\n    const header = [];\n    const fiscalYearStartMonth = this.props.options.entity.get('fiscal_year_start_month');\n\n    _.forEach(_.range(maxDepth + 1), function(depth) {\n      header.push('');\n    });\n\n    _.forEach(dataSets, _.bind(function(dataSet, index) {\n      const label = strings.dataSetLabel(\n        dataSet,\n        this.props.options.athenaState.get('product'),\n        state.get('currentYearPeriod'),\n        state.get('currentYearAmount'),\n        fiscalYearStartMonth,\n        {\n          proration: state.get('proration')\n        }\n      ).replace(/\\n/g, ' ');\n\n      header.push(\n        strings.nl2br(_s.escapeHTML(label))\n      );\n\n      const showVariance = !_.isUndefined(lines[0].amounts[index].variance);\n      if (showVariance) {\n        const fiscalYear = strings.fiscalYear(dataSet.year, fiscalYearStartMonth);\n        header.push(fiscalYear + ' Actual vs Budget Variance');\n        header.push(fiscalYear + ' Actual vs Budget % Variance');\n      }\n    }, this));\n\n    return header;\n  },\n\n  tableBody(lines, maxDepth) {\n    const rows = [];\n    let row;\n    const depthNames = {};\n\n    _.forEach(lines, (line) => {\n      row = [];\n      rows.push(row);\n      _.forEach(_.range(maxDepth + 1), (depth) => {\n        if (depth === line.depth) {\n          depthNames[depth] = strings.nodeName(line);\n        }\n        row.push({type: 'string', value: depth <= line.depth ? depthNames[depth] : ''});\n      });\n      _.forEach(line.amounts, (amount) => {\n        row.push({type: SummaryReportStore.getAmountType(), value: amount.value});\n        if (!_.isUndefined(amount.variance)) {\n          row.push({type: SummaryReportStore.getAmountType(), value: amount.variance});\n          row.push({type: 'percent', value: amount.percentVariance});\n        }\n      });\n    });\n    return rows;\n  },\n\n\n  tableFooter(totals, maxDepth) {\n    const budgetData = this.props.options.budgetData;\n    const accountType = budgetData.state.get('accountType');\n    const footer = [{type: 'string', value: strings.aggregateRowLabel(accountType, budgetData.visibleAccounts)}];\n\n    _.forEach(_.range(maxDepth), function() {\n      footer.push({type: 'string', value: ''});\n    });\n\n    _.forEach(totals, (total) => {\n      footer.push({type: SummaryReportStore.getAmountType(), value: accountType === 'types' ? total.delta : total.amount});\n      if (!_.isUndefined(total.variance)) {\n        footer.push({type: SummaryReportStore.getAmountType(), value: total.variance});\n        footer.push({type: 'percent', value: total.percentVariance});\n      }\n    });\n    return footer;\n  },\n\n  downloadData() {\n    const budgetData = this.props.options.budgetData;\n    const data = SummaryReportStore.getRenderedData(false, true);\n    const maxDepth = _.maxBy(data.lines as any[], 'depth').depth;\n    const breakdown = budgetData.state.get('breakdown');\n    const yAxisScale = SummaryReportStore.getState().get('yAxisScale');\n    const locale = SummaryReportStore.getState().get('locale');\n    const unitSymbol = SummaryReportStore.getReportAmountType().symbol;\n\n    let title = budgetData.titles(breakdown).primary.name;\n    title = yAxisScale ? title + ' - ' + yAxisScale.get('name') : title;\n\n    return {\n      title,\n      locale,\n      unitSymbol,\n      filterContext: JSON.stringify(budgetData.filterContext(breakdown)),\n      header: JSON.stringify(this.tableHeader(data.lines, maxDepth)),\n      data: JSON.stringify(this.tableBody(data.lines, maxDepth)),\n      footer: JSON.stringify(this.tableFooter(data.totals, maxDepth)),\n      exportDateString: strings.generateDownloadString(locale)\n    };\n  },\n\n  _renderShareItems() {\n    return [\n      <li key={1} className=\"ui-nav-list__item no-hover\"><h4>Share</h4></li>,\n      <li key={2}><button className=\"icon-facebook-1\" onClick={this.handleFacebook}>Facebook</button></li>,\n      <li key={4}><button className=\"icon-twitter-1\" onClick={this.handleTwitter}>Twitter</button></li>,\n      <li key={5}><button className=\"icon-email-1\" onClick={this.handleEmail}>Email</button></li>\n    ];\n  },\n\n  _renderDownloadItems() {\n    return [\n      <li key={1} className=\"ui-nav-list__item no-hover\"><h4>Download</h4></li>,\n      <li key={5}><button onClick={this.showDownloads}>Image (.png) </button></li>,\n      <li key={4}><button onClick={this.handleCSVDownload}>Spreadsheet (.csv)</button></li>\n    ];\n  },\n\n  render() {\n    return (\n      <ul className=\"ui-dropdown__list\">\n      {!this.props.showShareMenu && this._renderShareItems()}\n      {this.props.showDownloadItems && this._renderDownloadItems()}\n      </ul>\n    );\n  }\n});\n\nexport default ShareList;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_links.tsx","import _ from 'lodash';\n\nconst SharedLinkHelper = {\n  create(entity) {\n    const self: any = _.extend({}, this);\n    const location = this.getLocationProperties();\n\n    self.entity = entity;\n    self.hashtag = self.entity.get('name').split(' ').join('');\n    self.text = `Explore #${self.hashtag} finances on the @opengovinc platform #transparency`;\n    self.location = location.location;\n    self.locationString = location.locationString;\n    self.title = document.title;\n\n    return self;\n  },\n  getLocationProperties() {\n    return {\n      location: window.location.href,\n      locationString: window.location.toString()\n    };\n  },\n  updateUrl() {\n    const location = this.getLocationProperties();\n    this.location = location.location;\n    this.locationString = location.locationString;\n  },\n  popup(uri, name, features) {\n    window.open(uri, name, features);\n  },\n  shareTwitter() {\n    this.updateUrl();\n    this.popup('https://twitter.com/share?url=' +\n      encodeURIComponent(this.location) +\n      '&text=' + encodeURIComponent(this.text),\n    'sharer',\n    'toolbar=0,status=0,width=655,height=260');\n  },\n  shareFacebook() {\n    this.updateUrl();\n    this.popup(\n      'https://www.facebook.com/sharer.php?u=' +\n        encodeURIComponent(this.location) +\n       '&t=' + encodeURIComponent(this.title),\n      'sharer',\n      'toolbar=0,status=0,width=655,height=250');\n  },\n  shareGoogle() {\n    this.updateUrl();\n    this.popup(\n      'https://plus.google.com/share?url=' +\n        encodeURIComponent(this.location),\n      'sharer',\n      'menubar=no,resizable=yes,scrollbars=yes,toolbar=0,status=0,width=600,height=400');\n  },\n  shareEmail() {\n    this.updateUrl();\n    window.location.href =\n          'mailto:?subject=Check out this visualization from OpenGov ('\n            + this.entity.get('name') + ')&body=%0D%0A' + encodeURIComponent(this.location);\n  }\n};\n\nexport default SharedLinkHelper;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/shared_link_helper.ts","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = require('./utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _animateScroll = require('./animate-scroll');\n\nvar _animateScroll2 = _interopRequireDefault(_animateScroll);\n\nvar _scrollEvents = require('./scroll-events');\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar __mapped = {};\nvar __activeLink = void 0;\n\nexports.default = {\n\n  unmount: function unmount() {\n    __mapped = {};\n  },\n\n  register: function register(name, element) {\n    __mapped[name] = element;\n  },\n\n  unregister: function unregister(name) {\n    delete __mapped[name];\n  },\n\n  get: function get(name) {\n    return __mapped[name] || document.getElementById(name) || document.getElementsByName(name)[0] || document.getElementsByClassName(name)[0];\n  },\n\n  setActiveLink: function setActiveLink(link) {\n    return __activeLink = link;\n  },\n\n  getActiveLink: function getActiveLink() {\n    return __activeLink;\n  },\n\n  scrollTo: function scrollTo(to, props) {\n\n    var target = this.get(to);\n\n    if (!target) {\n      console.warn(\"target Element not found\");\n      return;\n    }\n\n    props = _extends({}, props, { absolute: false });\n\n    var containerId = props.containerId;\n    var container = props.container;\n\n    var containerElement = void 0;\n    if (containerId) {\n      containerElement = document.getElementById(containerId);\n    } else if (container && container.nodeType) {\n      containerElement = container;\n    } else {\n      containerElement = document;\n    }\n\n    if (_scrollEvents2.default.registered.begin) {\n      _scrollEvents2.default.registered.begin(to, target);\n    }\n\n    props.absolute = true;\n\n    var scrollOffset = _utils2.default.scrollOffset(containerElement, target) + (props.offset || 0);\n\n    /*\r\n     * if animate is not provided just scroll into the view\r\n     */\n    if (!props.smooth) {\n      if (containerElement === document) {\n        window.scrollTo(0, scrollOffset);\n      } else {\n        containerElement.scrollTop = scrollOffset;\n      }\n\n      if (_scrollEvents2.default.registered['end']) {\n        _scrollEvents2.default.registered['end'](to, target);\n      }\n\n      return;\n    }\n\n    /*\r\n     * Animate scrolling\r\n     */\n\n    _animateScroll2.default.animateTopScroll(scrollOffset, props, to, target);\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroller.js\n// module id = 222\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport cn from 'classnames';\n\nimport createReactClass from 'create-react-class';\n\nconst ExportModal = createReactClass<any, any>({\n  propTypes: {\n    title: PropTypes.string.isRequired,\n    cancelable: PropTypes.bool,\n    confirmable: PropTypes.bool,\n    confirmText: PropTypes.string,\n    cancelText: PropTypes.string,\n    onClose: PropTypes.func,\n    onConfirm: PropTypes.func,\n    rightButtonClass: PropTypes.string,\n    leftButtonClass: PropTypes.string\n  },\n\n  getDefaultProps: function() {\n    return {\n      confirmText: 'Confirm',\n      cancelText: 'Cancel'\n    };\n  },\n\n  render: function() {\n    const {onConfirm, onClose, confirmText, cancelText, confirmable, cancelable, children, title} = this.props;\n    const rightButtonClass = cn('ui-button', this.props.rightButtonClass);\n    const leftButtonClass = cn('ui-button', this.props.leftButtonClass);\n    return (\n      <div className=\"ui-modal__wrapper\">\n        <div className=\"ui-modal\">\n          <div className=\"ui-modal__header\">\n            <h3>{title}</h3>\n            <button className=\"ui-modal__close\" onClick={onClose} aria-label=\"Close modal\"></button>\n          </div>\n          <div className=\"ui-modal__content export_report\">\n            {children}\n          </div>\n            {(cancelable || confirmable) && <div className=\"ui-modal__footer\">\n              {cancelable && <button className={leftButtonClass} onClick={onClose}>{cancelText}</button>}\n              <div className=\"ui-modal__actions\">\n                {confirmable && <button className={rightButtonClass} onClick={onConfirm}>{confirmText}</button>}\n              </div>\n            </div>}\n        </div>\n        <div className=\"ui-modal__background\"></div>\n      </div>\n    );\n  }\n});\nexport default ExportModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/export_filter/public_user/export_modal.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar PATH = exports.PATH = {\n    VECTOR: 0,\n    BEZIER_CURVE: 1,\n    CIRCLE: 2\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/drawing/Path.js\n// module id = 224\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Color = require('./Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Util = require('./Util');\n\nvar _background = require('./parsing/background');\n\nvar _border = require('./parsing/border');\n\nvar _borderRadius = require('./parsing/borderRadius');\n\nvar _display = require('./parsing/display');\n\nvar _float = require('./parsing/float');\n\nvar _font = require('./parsing/font');\n\nvar _letterSpacing = require('./parsing/letterSpacing');\n\nvar _overflow = require('./parsing/overflow');\n\nvar _padding = require('./parsing/padding');\n\nvar _position = require('./parsing/position');\n\nvar _textDecoration = require('./parsing/textDecoration');\n\nvar _textShadow = require('./parsing/textShadow');\n\nvar _textTransform = require('./parsing/textTransform');\n\nvar _transform = require('./parsing/transform');\n\nvar _visibility = require('./parsing/visibility');\n\nvar _zIndex = require('./parsing/zIndex');\n\nvar _Bounds = require('./Bounds');\n\nvar _Input = require('./Input');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\n\nvar NodeContainer = function () {\n    function NodeContainer(node, parent, resourceLoader, index) {\n        var _this = this;\n\n        _classCallCheck(this, NodeContainer);\n\n        this.parent = parent;\n        this.index = index;\n        this.childNodes = [];\n        var defaultView = node.ownerDocument.defaultView;\n        var scrollX = defaultView.pageXOffset;\n        var scrollY = defaultView.pageYOffset;\n        var style = defaultView.getComputedStyle(node, null);\n        var display = (0, _display.parseDisplay)(style.display);\n\n        var IS_INPUT = node.type === 'radio' || node.type === 'checkbox';\n\n        var position = (0, _position.parsePosition)(style.position);\n\n        this.style = {\n            background: IS_INPUT ? _Input.INPUT_BACKGROUND : (0, _background.parseBackground)(style, resourceLoader),\n            border: IS_INPUT ? _Input.INPUT_BORDERS : (0, _border.parseBorder)(style),\n            borderRadius: (node instanceof defaultView.HTMLInputElement || node instanceof HTMLInputElement) && IS_INPUT ? (0, _Input.getInputBorderRadius)(node) : (0, _borderRadius.parseBorderRadius)(style),\n            color: IS_INPUT ? _Input.INPUT_COLOR : new _Color2.default(style.color),\n            display: display,\n            float: (0, _float.parseCSSFloat)(style.float),\n            font: (0, _font.parseFont)(style),\n            letterSpacing: (0, _letterSpacing.parseLetterSpacing)(style.letterSpacing),\n            opacity: parseFloat(style.opacity),\n            overflow: INPUT_TAGS.indexOf(node.tagName) === -1 ? (0, _overflow.parseOverflow)(style.overflow) : _overflow.OVERFLOW.HIDDEN,\n            padding: (0, _padding.parsePadding)(style),\n            position: position,\n            textDecoration: (0, _textDecoration.parseTextDecoration)(style),\n            textShadow: (0, _textShadow.parseTextShadow)(style.textShadow),\n            textTransform: (0, _textTransform.parseTextTransform)(style.textTransform),\n            transform: (0, _transform.parseTransform)(style),\n            visibility: (0, _visibility.parseVisibility)(style.visibility),\n            zIndex: (0, _zIndex.parseZIndex)(position !== _position.POSITION.STATIC ? style.zIndex : 'auto')\n        };\n\n        if (this.isTransformed()) {\n            // getBoundingClientRect provides values post-transform, we want them without the transformation\n            node.style.transform = 'matrix(1,0,0,1,0,0)';\n        }\n\n        // TODO move bound retrieval for all nodes to a later stage?\n        if (node.tagName === 'IMG') {\n            node.addEventListener('load', function () {\n                _this.bounds = (0, _Bounds.parseBounds)(node, scrollX, scrollY);\n                _this.curvedBounds = (0, _Bounds.parseBoundCurves)(_this.bounds, _this.style.border, _this.style.borderRadius);\n            });\n        }\n        this.image = getImage(node, resourceLoader);\n        this.bounds = IS_INPUT ? (0, _Input.reformatInputBounds)((0, _Bounds.parseBounds)(node, scrollX, scrollY)) : (0, _Bounds.parseBounds)(node, scrollX, scrollY);\n        this.curvedBounds = (0, _Bounds.parseBoundCurves)(this.bounds, this.style.border, this.style.borderRadius);\n\n        if (process.env.NODE_ENV !== 'production') {\n            this.name = '' + node.tagName.toLowerCase() + (node.id ? '#' + node.id : '') + node.className.toString().split(' ').map(function (s) {\n                return s.length ? '.' + s : '';\n            }).join('');\n        }\n    }\n\n    _createClass(NodeContainer, [{\n        key: 'getClipPaths',\n        value: function getClipPaths() {\n            var parentClips = this.parent ? this.parent.getClipPaths() : [];\n            var isClipped = this.style.overflow === _overflow.OVERFLOW.HIDDEN || this.style.overflow === _overflow.OVERFLOW.SCROLL;\n\n            return isClipped ? parentClips.concat([(0, _Bounds.calculatePaddingBoxPath)(this.curvedBounds)]) : parentClips;\n        }\n    }, {\n        key: 'isInFlow',\n        value: function isInFlow() {\n            return this.isRootElement() && !this.isFloating() && !this.isAbsolutelyPositioned();\n        }\n    }, {\n        key: 'isVisible',\n        value: function isVisible() {\n            return !(0, _Util.contains)(this.style.display, _display.DISPLAY.NONE) && this.style.opacity > 0 && this.style.visibility === _visibility.VISIBILITY.VISIBLE;\n        }\n    }, {\n        key: 'isAbsolutelyPositioned',\n        value: function isAbsolutelyPositioned() {\n            return this.style.position !== _position.POSITION.STATIC && this.style.position !== _position.POSITION.RELATIVE;\n        }\n    }, {\n        key: 'isPositioned',\n        value: function isPositioned() {\n            return this.style.position !== _position.POSITION.STATIC;\n        }\n    }, {\n        key: 'isFloating',\n        value: function isFloating() {\n            return this.style.float !== _float.FLOAT.NONE;\n        }\n    }, {\n        key: 'isRootElement',\n        value: function isRootElement() {\n            return this.parent === null;\n        }\n    }, {\n        key: 'isTransformed',\n        value: function isTransformed() {\n            return this.style.transform !== null;\n        }\n    }, {\n        key: 'isPositionedWithZIndex',\n        value: function isPositionedWithZIndex() {\n            return this.isPositioned() && !this.style.zIndex.auto;\n        }\n    }, {\n        key: 'isInlineLevel',\n        value: function isInlineLevel() {\n            return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_FLEX) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_GRID) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_LIST_ITEM) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE);\n        }\n    }, {\n        key: 'isInlineBlockOrInlineTable',\n        value: function isInlineBlockOrInlineTable() {\n            return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE);\n        }\n    }]);\n\n    return NodeContainer;\n}();\n\nexports.default = NodeContainer;\n\n\nvar getImage = function getImage(node, resourceLoader) {\n    if (node instanceof node.ownerDocument.defaultView.SVGSVGElement || node instanceof SVGSVGElement) {\n        var s = new XMLSerializer();\n        return resourceLoader.loadImage('data:image/svg+xml,' + encodeURIComponent(s.serializeToString(node)));\n    }\n    switch (node.tagName) {\n        case 'IMG':\n            // $FlowFixMe\n            var img = node;\n            return resourceLoader.loadImage(img.currentSrc || img.src);\n        case 'CANVAS':\n            // $FlowFixMe\n            var canvas = node;\n            return resourceLoader.loadCanvas(canvas);\n        case 'IFRAME':\n            var iframeKey = node.getAttribute('data-html2canvas-internal-iframe-key');\n            if (iframeKey) {\n                return iframeKey;\n            }\n            break;\n    }\n\n    return null;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/NodeContainer.js\n// module id = 225\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBackgroundImage = exports.parseBackground = exports.calculateBackgroundRepeatPath = exports.calculateBackgroundPosition = exports.calculateBackgroungPositioningArea = exports.calculateBackgroungPaintingArea = exports.calculateGradientBackgroundSize = exports.calculateBackgroundSize = exports.BACKGROUND_ORIGIN = exports.BACKGROUND_CLIP = exports.BACKGROUND_SIZE = exports.BACKGROUND_REPEAT = undefined;\n\nvar _Color = require('../Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = require('../Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Size = require('../drawing/Size');\n\nvar _Size2 = _interopRequireDefault(_Size);\n\nvar _Vector = require('../drawing/Vector');\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _Bounds = require('../Bounds');\n\nvar _padding = require('./padding');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar BACKGROUND_REPEAT = exports.BACKGROUND_REPEAT = {\n    REPEAT: 0,\n    NO_REPEAT: 1,\n    REPEAT_X: 2,\n    REPEAT_Y: 3\n};\n\nvar BACKGROUND_SIZE = exports.BACKGROUND_SIZE = {\n    AUTO: 0,\n    CONTAIN: 1,\n    COVER: 2,\n    LENGTH: 3\n};\n\nvar BACKGROUND_CLIP = exports.BACKGROUND_CLIP = {\n    BORDER_BOX: 0,\n    PADDING_BOX: 1,\n    CONTENT_BOX: 2\n};\n\nvar BACKGROUND_ORIGIN = exports.BACKGROUND_ORIGIN = BACKGROUND_CLIP;\n\nvar AUTO = 'auto';\n\nvar BackgroundSize = function BackgroundSize(size) {\n    _classCallCheck(this, BackgroundSize);\n\n    switch (size) {\n        case 'contain':\n            this.size = BACKGROUND_SIZE.CONTAIN;\n            break;\n        case 'cover':\n            this.size = BACKGROUND_SIZE.COVER;\n            break;\n        case 'auto':\n            this.size = BACKGROUND_SIZE.AUTO;\n            break;\n        default:\n            this.value = new _Length2.default(size);\n    }\n};\n\nvar calculateBackgroundSize = exports.calculateBackgroundSize = function calculateBackgroundSize(backgroundImage, image, bounds) {\n    var width = 0;\n    var height = 0;\n    var size = backgroundImage.size;\n    if (size[0].size === BACKGROUND_SIZE.CONTAIN || size[0].size === BACKGROUND_SIZE.COVER) {\n        var targetRatio = bounds.width / bounds.height;\n        var currentRatio = image.width / image.height;\n        return targetRatio < currentRatio !== (size[0].size === BACKGROUND_SIZE.COVER) ? new _Size2.default(bounds.width, bounds.width / currentRatio) : new _Size2.default(bounds.height * currentRatio, bounds.height);\n    }\n\n    if (size[0].value) {\n        width = size[0].value.getAbsoluteValue(bounds.width);\n    }\n\n    if (size[0].size === BACKGROUND_SIZE.AUTO && size[1].size === BACKGROUND_SIZE.AUTO) {\n        height = image.height;\n    } else if (size[1].size === BACKGROUND_SIZE.AUTO) {\n        height = width / image.width * image.height;\n    } else if (size[1].value) {\n        height = size[1].value.getAbsoluteValue(bounds.height);\n    }\n\n    if (size[0].size === BACKGROUND_SIZE.AUTO) {\n        width = height / image.height * image.width;\n    }\n\n    return new _Size2.default(width, height);\n};\n\nvar calculateGradientBackgroundSize = exports.calculateGradientBackgroundSize = function calculateGradientBackgroundSize(backgroundImage, bounds) {\n    var size = backgroundImage.size;\n    var width = size[0].value ? size[0].value.getAbsoluteValue(bounds.width) : bounds.width;\n    var height = size[1].value ? size[1].value.getAbsoluteValue(bounds.height) : size[0].value ? width : bounds.height;\n\n    return new _Size2.default(width, height);\n};\n\nvar AUTO_SIZE = new BackgroundSize(AUTO);\n\nvar calculateBackgroungPaintingArea = exports.calculateBackgroungPaintingArea = function calculateBackgroungPaintingArea(curves, clip) {\n    switch (clip) {\n        case BACKGROUND_CLIP.BORDER_BOX:\n            return (0, _Bounds.calculateBorderBoxPath)(curves);\n        case BACKGROUND_CLIP.PADDING_BOX:\n        default:\n            return (0, _Bounds.calculatePaddingBoxPath)(curves);\n    }\n};\n\nvar calculateBackgroungPositioningArea = exports.calculateBackgroungPositioningArea = function calculateBackgroungPositioningArea(backgroundOrigin, bounds, padding, border) {\n    var paddingBox = (0, _Bounds.calculatePaddingBox)(bounds, border);\n\n    switch (backgroundOrigin) {\n        case BACKGROUND_ORIGIN.BORDER_BOX:\n            return bounds;\n        case BACKGROUND_ORIGIN.CONTENT_BOX:\n            var paddingLeft = padding[_padding.PADDING_SIDES.LEFT].getAbsoluteValue(bounds.width);\n            var paddingRight = padding[_padding.PADDING_SIDES.RIGHT].getAbsoluteValue(bounds.width);\n            var paddingTop = padding[_padding.PADDING_SIDES.TOP].getAbsoluteValue(bounds.width);\n            var paddingBottom = padding[_padding.PADDING_SIDES.BOTTOM].getAbsoluteValue(bounds.width);\n            return new _Bounds.Bounds(paddingBox.left + paddingLeft, paddingBox.top + paddingTop, paddingBox.width - paddingLeft - paddingRight, paddingBox.height - paddingTop - paddingBottom);\n        case BACKGROUND_ORIGIN.PADDING_BOX:\n        default:\n            return paddingBox;\n    }\n};\n\nvar calculateBackgroundPosition = exports.calculateBackgroundPosition = function calculateBackgroundPosition(position, size, bounds) {\n    return new _Vector2.default(position[0].getAbsoluteValue(bounds.width - size.width), position[1].getAbsoluteValue(bounds.height - size.height));\n};\n\nvar calculateBackgroundRepeatPath = exports.calculateBackgroundRepeatPath = function calculateBackgroundRepeatPath(background, position, size, backgroundPositioningArea, bounds) {\n    var repeat = background.repeat;\n    switch (repeat) {\n        case BACKGROUND_REPEAT.REPEAT_X:\n            return [new _Vector2.default(Math.round(bounds.left), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(size.height + backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left), Math.round(size.height + backgroundPositioningArea.top + position.y))];\n        case BACKGROUND_REPEAT.REPEAT_Y:\n            return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.height + bounds.top))];\n        case BACKGROUND_REPEAT.NO_REPEAT:\n            return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y + size.height)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y + size.height))];\n        default:\n            return [new _Vector2.default(Math.round(bounds.left), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(bounds.left), Math.round(bounds.height + bounds.top))];\n    }\n};\n\nvar parseBackground = exports.parseBackground = function parseBackground(style, resourceLoader) {\n    return {\n        backgroundColor: new _Color2.default(style.backgroundColor),\n        backgroundImage: parseBackgroundImages(style, resourceLoader),\n        backgroundClip: parseBackgroundClip(style.backgroundClip),\n        backgroundOrigin: parseBackgroundOrigin(style.backgroundOrigin)\n    };\n};\n\nvar parseBackgroundClip = function parseBackgroundClip(backgroundClip) {\n    switch (backgroundClip) {\n        case 'padding-box':\n            return BACKGROUND_CLIP.PADDING_BOX;\n        case 'content-box':\n            return BACKGROUND_CLIP.CONTENT_BOX;\n    }\n    return BACKGROUND_CLIP.BORDER_BOX;\n};\n\nvar parseBackgroundOrigin = function parseBackgroundOrigin(backgroundOrigin) {\n    switch (backgroundOrigin) {\n        case 'padding-box':\n            return BACKGROUND_ORIGIN.PADDING_BOX;\n        case 'content-box':\n            return BACKGROUND_ORIGIN.CONTENT_BOX;\n    }\n    return BACKGROUND_ORIGIN.BORDER_BOX;\n};\n\nvar parseBackgroundRepeat = function parseBackgroundRepeat(backgroundRepeat) {\n    switch (backgroundRepeat.trim()) {\n        case 'no-repeat':\n            return BACKGROUND_REPEAT.NO_REPEAT;\n        case 'repeat-x':\n        case 'repeat no-repeat':\n            return BACKGROUND_REPEAT.REPEAT_X;\n        case 'repeat-y':\n        case 'no-repeat repeat':\n            return BACKGROUND_REPEAT.REPEAT_Y;\n        case 'repeat':\n            return BACKGROUND_REPEAT.REPEAT;\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n        console.error('Invalid background-repeat value \"' + backgroundRepeat + '\"');\n    }\n\n    return BACKGROUND_REPEAT.REPEAT;\n};\n\nvar parseBackgroundImages = function parseBackgroundImages(style, resourceLoader) {\n    var sources = parseBackgroundImage(style.backgroundImage).map(function (backgroundImage) {\n        if (backgroundImage.method === 'url') {\n            var key = resourceLoader.loadImage(backgroundImage.args[0]);\n            backgroundImage.args = key ? [key] : [];\n        }\n        return backgroundImage;\n    });\n    var positions = style.backgroundPosition.split(',');\n    var repeats = style.backgroundRepeat.split(',');\n    var sizes = style.backgroundSize.split(',');\n\n    return sources.map(function (source, index) {\n        var size = (sizes[index] || AUTO).trim().split(' ').map(parseBackgroundSize);\n        var position = (positions[index] || AUTO).trim().split(' ').map(parseBackgoundPosition);\n\n        return {\n            source: source,\n            repeat: parseBackgroundRepeat(typeof repeats[index] === 'string' ? repeats[index] : repeats[0]),\n            size: size.length < 2 ? [size[0], AUTO_SIZE] : [size[0], size[1]],\n            position: position.length < 2 ? [position[0], position[0]] : [position[0], position[1]]\n        };\n    });\n};\n\nvar parseBackgroundSize = function parseBackgroundSize(size) {\n    return size === 'auto' ? AUTO_SIZE : new BackgroundSize(size);\n};\n\nvar parseBackgoundPosition = function parseBackgoundPosition(position) {\n    switch (position) {\n        case 'bottom':\n        case 'right':\n            return new _Length2.default('100%');\n        case 'left':\n        case 'top':\n            return new _Length2.default('0%');\n        case 'auto':\n            return new _Length2.default('0');\n    }\n    return new _Length2.default(position);\n};\n\nvar parseBackgroundImage = exports.parseBackgroundImage = function parseBackgroundImage(image) {\n    var whitespace = /^\\s$/;\n    var results = [];\n\n    var args = [];\n    var method = '';\n    var quote = null;\n    var definition = '';\n    var mode = 0;\n    var numParen = 0;\n\n    var appendResult = function appendResult() {\n        var prefix = '';\n        if (method) {\n            if (definition.substr(0, 1) === '\"') {\n                definition = definition.substr(1, definition.length - 2);\n            }\n\n            if (definition) {\n                args.push(definition.trim());\n            }\n\n            var prefix_i = method.indexOf('-', 1) + 1;\n            if (method.substr(0, 1) === '-' && prefix_i > 0) {\n                prefix = method.substr(0, prefix_i).toLowerCase();\n                method = method.substr(prefix_i);\n            }\n            method = method.toLowerCase();\n            if (method !== 'none') {\n                results.push({\n                    prefix: prefix,\n                    method: method,\n                    args: args\n                });\n            }\n        }\n        args = [];\n        method = definition = '';\n    };\n\n    image.split('').forEach(function (c) {\n        if (mode === 0 && whitespace.test(c)) {\n            return;\n        }\n        switch (c) {\n            case '\"':\n                if (!quote) {\n                    quote = c;\n                } else if (quote === c) {\n                    quote = null;\n                }\n                break;\n            case '(':\n                if (quote) {\n                    break;\n                } else if (mode === 0) {\n                    mode = 1;\n                    return;\n                } else {\n                    numParen++;\n                }\n                break;\n            case ')':\n                if (quote) {\n                    break;\n                } else if (mode === 1) {\n                    if (numParen === 0) {\n                        mode = 0;\n                        appendResult();\n                        return;\n                    } else {\n                        numParen--;\n                    }\n                }\n                break;\n\n            case ',':\n                if (quote) {\n                    break;\n                } else if (mode === 0) {\n                    appendResult();\n                    return;\n                } else if (mode === 1) {\n                    if (numParen === 0 && !method.match(/^url$/i)) {\n                        args.push(definition.trim());\n                        definition = '';\n                        return;\n                    }\n                }\n                break;\n        }\n\n        if (mode === 0) {\n            method += c;\n        } else {\n            definition += c;\n        }\n    });\n\n    appendResult();\n    return results;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/background.js\n// module id = 226\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _Path = require('./Path');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Vector = function Vector(x, y) {\n    _classCallCheck(this, Vector);\n\n    this.type = _Path.PATH.VECTOR;\n    this.x = x;\n    this.y = y;\n    if (process.env.NODE_ENV !== 'production') {\n        if (isNaN(x)) {\n            console.error('Invalid x value given for Vector');\n        }\n        if (isNaN(y)) {\n            console.error('Invalid y value given for Vector');\n        }\n    }\n};\n\nexports.default = Vector;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/drawing/Vector.js\n// module id = 227\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _ForeignObjectRenderer = require('./renderer/ForeignObjectRenderer');\n\nvar testRangeBounds = function testRangeBounds(document) {\n    var TEST_HEIGHT = 123;\n\n    if (document.createRange) {\n        var range = document.createRange();\n        if (range.getBoundingClientRect) {\n            var testElement = document.createElement('boundtest');\n            testElement.style.height = TEST_HEIGHT + 'px';\n            testElement.style.display = 'block';\n            document.body.appendChild(testElement);\n\n            range.selectNode(testElement);\n            var rangeBounds = range.getBoundingClientRect();\n            var rangeHeight = Math.round(rangeBounds.height);\n            document.body.removeChild(testElement);\n            if (rangeHeight === TEST_HEIGHT) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n};\n\n// iOS 10.3 taints canvas with base64 images unless crossOrigin = 'anonymous'\nvar testBase64 = function testBase64(document, src) {\n    var img = new Image();\n    var canvas = document.createElement('canvas');\n    var ctx = canvas.getContext('2d');\n\n    return new Promise(function (resolve) {\n        // Single pixel base64 image renders fine on iOS 10.3???\n        img.src = src;\n\n        var onload = function onload() {\n            try {\n                ctx.drawImage(img, 0, 0);\n                canvas.toDataURL();\n            } catch (e) {\n                return resolve(false);\n            }\n\n            return resolve(true);\n        };\n\n        img.onload = onload;\n        img.onerror = function () {\n            return resolve(false);\n        };\n\n        if (img.complete === true) {\n            setTimeout(function () {\n                onload();\n            }, 500);\n        }\n    });\n};\n\nvar testCORS = function testCORS() {\n    return typeof new Image().crossOrigin !== 'undefined';\n};\n\nvar testResponseType = function testResponseType() {\n    return typeof new XMLHttpRequest().responseType === 'string';\n};\n\nvar testSVG = function testSVG(document) {\n    var img = new Image();\n    var canvas = document.createElement('canvas');\n    var ctx = canvas.getContext('2d');\n    img.src = 'data:image/svg+xml,<svg xmlns=\\'http://www.w3.org/2000/svg\\'></svg>';\n\n    try {\n        ctx.drawImage(img, 0, 0);\n        canvas.toDataURL();\n    } catch (e) {\n        return false;\n    }\n    return true;\n};\n\nvar isGreenPixel = function isGreenPixel(data) {\n    return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;\n};\n\nvar testForeignObject = function testForeignObject(document) {\n    var canvas = document.createElement('canvas');\n    var size = 100;\n    canvas.width = size;\n    canvas.height = size;\n    var ctx = canvas.getContext('2d');\n    ctx.fillStyle = 'rgb(0, 255, 0)';\n    ctx.fillRect(0, 0, size, size);\n\n    var img = new Image();\n    var greenImageSrc = canvas.toDataURL();\n    img.src = greenImageSrc;\n    var svg = (0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, img);\n    ctx.fillStyle = 'red';\n    ctx.fillRect(0, 0, size, size);\n\n    return (0, _ForeignObjectRenderer.loadSerializedSVG)(svg).then(function (img) {\n        ctx.drawImage(img, 0, 0);\n        var data = ctx.getImageData(0, 0, size, size).data;\n        ctx.fillStyle = 'red';\n        ctx.fillRect(0, 0, size, size);\n\n        var node = document.createElement('div');\n        node.style.backgroundImage = 'url(' + greenImageSrc + ')';\n        node.style.height = size + 'px';\n        // Firefox 55 does not render inline <img /> tags\n        return isGreenPixel(data) ? (0, _ForeignObjectRenderer.loadSerializedSVG)((0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, node)) : Promise.reject(false);\n    }).then(function (img) {\n        ctx.drawImage(img, 0, 0);\n        // Edge does not render background-images\n        return isGreenPixel(ctx.getImageData(0, 0, size, size).data);\n    }).catch(function (e) {\n        return false;\n    });\n};\n\nvar FEATURES = {\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_RANGE_BOUNDS() {\n        'use strict';\n\n        var value = testRangeBounds(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_SVG_DRAWING() {\n        'use strict';\n\n        var value = testSVG(document);\n        Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_BASE64_DRAWING() {\n        'use strict';\n\n        return function (src) {\n            var _value = testBase64(document, src);\n            Object.defineProperty(FEATURES, 'SUPPORT_BASE64_DRAWING', { value: function value() {\n                    return _value;\n                } });\n            return _value;\n        };\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_FOREIGNOBJECT_DRAWING() {\n        'use strict';\n\n        var value = typeof Array.from === 'function' && typeof window.fetch === 'function' ? testForeignObject(document) : Promise.resolve(false);\n        Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_CORS_IMAGES() {\n        'use strict';\n\n        var value = testCORS();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_RESPONSE_TYPE() {\n        'use strict';\n\n        var value = testResponseType();\n        Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });\n        return value;\n    },\n    // $FlowFixMe - get/set properties not yet supported\n    get SUPPORT_CORS_XHR() {\n        'use strict';\n\n        var value = 'withCredentials' in new XMLHttpRequest();\n        Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });\n        return value;\n    }\n};\n\nexports.default = FEATURES;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Feature.js\n// module id = 228\n// module chunks = 0 1","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js\n// module id = 229\n// module chunks = 0 1","exports.f = Object.getOwnPropertySymbols;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js\n// module id = 230\n// module chunks = 0 1","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js\n// module id = 231\n// module chunks = 0 1","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js\n// module id = 232\n// module chunks = 0 1","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js\n// module id = 233\n// module chunks = 0 1","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js\n// module id = 234\n// module chunks = 0 1","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n  return builtinExec.call(R, S);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js\n// module id = 235\n// module chunks = 0 1","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(\n      defined,\n      SYMBOL,\n      ''[KEY],\n      function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n        if (regexp.exec === regexpExec) {\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n            // The native String method already delegates to @@method (this\n            // polyfilled function), leasing to infinite recursion.\n            // We avoid it by directly calling the native @@method method.\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n          }\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n        }\n        return { done: false };\n      }\n    );\n    var strfn = fns[0];\n    var rxfn = fns[1];\n\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js\n// module id = 236\n// module chunks = 0 1","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js\n// module id = 237\n// module chunks = 0 1","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js\n// module id = 238\n// module chunks = 0 1","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n  'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n  if (Typed = global[TypedArrayConstructors[i++]]) {\n    hide(Typed.prototype, TYPED, true);\n    hide(Typed.prototype, VIEW, true);\n  } else CONSTR = false;\n}\n\nmodule.exports = {\n  ABV: ABV,\n  CONSTR: CONSTR,\n  TYPED: TYPED,\n  VIEW: VIEW\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js\n// module id = 239\n// module chunks = 0 1","'use strict';\n// Forced replacement prototype accessors methods\nmodule.exports = require('./_library') || !require('./_fails')(function () {\n  var K = Math.random();\n  // In FF throws only define methods\n  // eslint-disable-next-line no-undef, no-useless-call\n  __defineSetter__.call(null, K, function () { /* empty */ });\n  delete require('./_global')[K];\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js\n// module id = 240\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { of: function of() {\n    var length = arguments.length;\n    var A = new Array(length);\n    while (length--) A[length] = arguments[length];\n    return new this(A);\n  } });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js\n// module id = 241\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n    var mapFn = arguments[1];\n    var mapping, A, n, cb;\n    aFunction(this);\n    mapping = mapFn !== undefined;\n    if (mapping) aFunction(mapFn);\n    if (source == undefined) return new this();\n    A = [];\n    if (mapping) {\n      n = 0;\n      cb = ctx(mapFn, arguments[2], 2);\n      forOf(source, false, function (nextItem) {\n        A.push(cb(nextItem, n++));\n      });\n    } else {\n      forOf(source, false, A.push, A);\n    }\n    return new this(A);\n  } });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js\n// module id = 242\n// module chunks = 0 1","import _ from 'lodash';\nimport $ from 'jquery';\nimport { BaseStore, Dispatcher } from '@opengov/og_flux';\n\nimport SessionStore from './session_store';\n\nclass ControlPanelStore extends BaseStore {\n  constructor() {\n    super();\n\n    this._menuItems = [];\n    this._loadedApp = null;\n    this._selectedApp = null;\n    this._entitySwitcherOpen = false;\n    this._selectedEntity = null;\n    this._isOpenGov = false;\n    this._isDirty = false;\n    this._leaveModal = null;\n    this._entityLoading = false;\n\n    this._onEntityChange = null;\n\n    this.LEAVE_MODAL_DEFAULTS = {\n      TITLE: 'Are you sure you want to navigate away?',\n      MESSAGE: 'Naviagating away will lose all of your current progress. This will result in no saved progress.'\n    };\n\n    Dispatcher.register(payload => this._handleAction(payload.action));\n  }\n\n  getApps = () => {\n    const selectedApp = this.getSelectedAppId();\n    const session = SessionStore.getSession();\n    const entity = !this.isOpenGov() ? session && session.entity && session.entity.toJSON() : this.getSelectedEntity();\n    const isEntitySelected = !!entity;\n\n    const featurePermissions = entity && entity.feature_permissions;\n\n    // we check if ControlPanel is still loading to be sure we do not\n    // show any apps that are behind feature permissions before we\n    // are finished loading\n    const containsPermission = (menuItem) => !this.isLoading() && _.contains(featurePermissions, menuItem.requires_feature_permission);\n\n    const menuItems = this._menuItems.filter((mi) => {\n      // if the app is selected, show it...\n      if (mi.id === selectedApp) { return true; }\n\n      // if requires feature permission and entity...\n      if (mi.requires_feature_permission && mi.requires_entity) {\n        return containsPermission(mi) && isEntitySelected; // check both\n      }\n\n      // if requires feature permission...\n      if (mi.requires_feature_permission) {\n        return containsPermission(mi); // check if entity has the permission\n      }\n\n      // if requires entity...\n      if (mi.requires_entity) {\n        return isEntitySelected; // check if an entity is selected\n      }\n\n      // allow the menu item\n      return true;\n    });\n\n    return menuItems.map(mi => _.assign({}, mi, {entrypoint: this._computeMIEntrypoint(mi, entity && entity.id)}));\n  }\n\n  getAppEntrypoint = (app, entityId) => {\n    return this._computeMIEntrypoint(app, entityId);\n  }\n\n  _findAppById = (id) => {\n    return _.find(this._apps, {id});\n  }\n\n  getDefaultApp = () => {\n    if (this._selectedEntity) {\n      return this._findAppById('reports');\n    }\n\n    return this._findAppById('portal');\n  }\n\n  getLoadedApp = () => {\n    return _.find(this._menuItems, {id: this._loadedApp});\n  }\n\n  getSelectedAppId = () => {\n    return this._selectedApp;\n  }\n\n  getSelectedEntity = () => {\n    return this._selectedEntity || SessionStore.getEntity();\n  }\n\n  isOpenGov = () => {\n    return this._isOpenGov;\n  }\n\n  isEntitySwitcherOpen = () => {\n    return this._entitySwitcherOpen;\n  }\n\n  isEntitySelected = (id) => {\n    return this._selectedEntity && this._selectedEntity.id === id;\n  }\n\n  isLoading = () => {\n    return !SessionStore.getSession() || this._entityLoading;\n  }\n\n  isDirty = () => {\n    return this._isDirty;\n  }\n\n  getLeaveModal = () => {\n    return this._leaveModal;\n  }\n\n  /**\n   * Builds the url for the menu items.\n   * @param  {Object} ui       The menu item\n   * @param  {String} entityId An entity subdomain, which is always the entity for the session\n   * @return {String}          The menu item's URL\n   */\n  _computeMIEntrypoint(ui, entityId) {\n    // The entity in the URL should be selected with the following criteria:\n    // 1. If an entity subdomain is present in the URL (`_selectedEntity`)\n    // 2. If an entity is passed in (which is the current user's entity)\n    // 3. The entity should be 'opengov'\n    const entity =\n      this._selectedEntity && this._selectedEntity.abilities && this._selectedEntity.abilities.switch_to && this._selectedEntity.id\n        || entityId\n        || 'opengov';\n    return _.template(ui.location_template)({entity: entity});\n  }\n\n  _loadApp(id) {\n    this._loadedApp = id;\n  }\n\n  _selectApp(id) {\n    this._selectedApp = id;\n  }\n\n  _selectEntity(entity) {\n    if (this._onEntityChange) {\n      this._onEntityChange(entity);\n    }\n    this._selectedEntity = entity;\n    this._entityLoading = false;\n    this.emitChange();\n  }\n\n  _handleAction(action) {\n    switch (action.actionType) {\n      case 'CONTROL_PANEL_INITIALIZE':\n        this._loadApp(action.appId);\n        this._selectApp(action.selectedAppId);\n        this._onEntityChange = action.onEntityChange;\n        const leaveModal = action.leaveModal;\n        if (leaveModal) {\n          const isLeaveModalObject = typeof leaveModal === 'object';\n          this._leaveModal = {\n            title: isLeaveModalObject ? leaveModal.title : this.LEAVE_MODAL_DEFAULTS.TITLE,\n            message: isLeaveModalObject ? leaveModal.message : this.LEAVE_MODAL_DEFAULTS.MESSAGE\n          };\n        }\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_LOAD_APP':\n        this._loadApp(action.appId);\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_ENTITY_SWITCHER_OPEN':\n        this._entitySwitcherOpen = true;\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE':\n        this._entitySwitcherOpen = false;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_LOADING':\n        this._entityLoading = true;\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_MAKE_DIRTY':\n        this._isDirty = true;\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_MAKE_CLEAN':\n        this._isDirty = false;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_SELECTED':\n        $.getJSON('/api/v1/entities/' + action.entity.entity_id, (entity) => {\n          this._selectEntity(entity);\n        });\n        break;\n\n      case 'SESSION_SYNC':\n        const {session} = action;\n        this._menuItems = session.get('control_panel_menu_items');\n\n        if (!this._selectedEntity && !this._isOpenGov && session.entity) {\n          if (session.entity.isGlobal()) {\n            this._isOpenGov = true;\n          } else {\n            // For entity users when we sync their session,\n            // automatically select the entity they belong to.\n            this._selectedEntity = session.entity.toJSON();\n          }\n        }\n\n        this.emitChange();\n        break;\n\n      default:\n        // do nothing\n    }\n  }\n}\n\nexport default new ControlPanelStore();\nexport const __ControlPanelStore = ControlPanelStore;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/stores/control_panel_store.js","//     Underscore.js 1.10.2\n//     https://underscorejs.org\n//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n// Baseline setup\n// --------------\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = typeof self == 'object' && self.self === self && self ||\n          typeof global == 'object' && global.global === global && global ||\n          Function('return this')() ||\n          {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n    slice = ArrayProto.slice,\n    toString = ObjProto.toString,\n    hasOwnProperty = ObjProto.hasOwnProperty;\n\n// All **ECMAScript 5** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n    nativeKeys = Object.keys,\n    nativeCreate = Object.create;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = root.isNaN,\n    _isFinite = root.isFinite;\n\n// Naked function reference for surrogate-prototype-swapping.\nvar Ctor = function(){};\n\n// The Underscore object. All exported functions below are added to it in the\n// modules/index-all.js using the mixin function.\nexport default function _(obj) {\n  if (obj instanceof _) return obj;\n  if (!(this instanceof _)) return new _(obj);\n  this._wrapped = obj;\n}\n\n// Current version.\nexport var VERSION = _.VERSION = '1.10.2';\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n  if (context === void 0) return func;\n  switch (argCount == null ? 3 : argCount) {\n    case 1: return function(value) {\n      return func.call(context, value);\n    };\n    // The 2-argument case is omitted because we’re not using it.\n    case 3: return function(value, index, collection) {\n      return func.call(context, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(context, accumulator, value, index, collection);\n    };\n  }\n  return function() {\n    return func.apply(context, arguments);\n  };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n  if (value == null) return identity;\n  if (isFunction(value)) return optimizeCb(value, context, argCount);\n  if (isObject(value) && !isArray(value)) return matcher(value);\n  return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only argCount argument.\n_.iteratee = iteratee;\nexport function iteratee(value, context) {\n  return baseIteratee(value, context, Infinity);\n}\n\n// The function we actually call internally. It invokes _.iteratee if\n// overridden, otherwise baseIteratee.\nfunction cb(value, context, argCount) {\n  if (_.iteratee !== iteratee) return _.iteratee(value, context);\n  return baseIteratee(value, context, argCount);\n}\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport function restArguments(func, startIndex) {\n  startIndex = startIndex == null ? func.length - 1 : +startIndex;\n  return function() {\n    var length = Math.max(arguments.length - startIndex, 0),\n        rest = Array(length),\n        index = 0;\n    for (; index < length; index++) {\n      rest[index] = arguments[index + startIndex];\n    }\n    switch (startIndex) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, arguments[0], rest);\n      case 2: return func.call(this, arguments[0], arguments[1], rest);\n    }\n    var args = Array(startIndex + 1);\n    for (index = 0; index < startIndex; index++) {\n      args[index] = arguments[index];\n    }\n    args[startIndex] = rest;\n    return func.apply(this, args);\n  };\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n  if (!isObject(prototype)) return {};\n  if (nativeCreate) return nativeCreate(prototype);\n  Ctor.prototype = prototype;\n  var result = new Ctor;\n  Ctor.prototype = null;\n  return result;\n}\n\nfunction shallowProperty(key) {\n  return function(obj) {\n    return obj == null ? void 0 : obj[key];\n  };\n}\n\nfunction _has(obj, path) {\n  return obj != null && hasOwnProperty.call(obj, path);\n}\n\nfunction deepGet(obj, path) {\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    if (obj == null) return void 0;\n    obj = obj[path[i]];\n  }\n  return length ? obj : void 0;\n}\n\n// Helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nvar getLength = shallowProperty('length');\nfunction isArrayLike(collection) {\n  var length = getLength(collection);\n  return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n}\n\n// Collection Functions\n// --------------------\n\n// The cornerstone, an `each` implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport function each(obj, iteratee, context) {\n  iteratee = optimizeCb(iteratee, context);\n  var i, length;\n  if (isArrayLike(obj)) {\n    for (i = 0, length = obj.length; i < length; i++) {\n      iteratee(obj[i], i, obj);\n    }\n  } else {\n    var _keys = keys(obj);\n    for (i = 0, length = _keys.length; i < length; i++) {\n      iteratee(obj[_keys[i]], _keys[i], obj);\n    }\n  }\n  return obj;\n}\nexport { each as forEach };\n\n// Return the results of applying the iteratee to each element.\nexport function map(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length,\n      results = Array(length);\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    results[index] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\nexport { map as collect };\n\n// Create a reducing function iterating left or right.\nfunction createReduce(dir) {\n  // Wrap code that reassigns argument variables in a separate function than\n  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n  var reducer = function(obj, iteratee, memo, initial) {\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        index = dir > 0 ? 0 : length - 1;\n    if (!initial) {\n      memo = obj[_keys ? _keys[index] : index];\n      index += dir;\n    }\n    for (; index >= 0 && index < length; index += dir) {\n      var currentKey = _keys ? _keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  return function(obj, iteratee, memo, context) {\n    var initial = arguments.length >= 3;\n    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n  };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport var reduce = createReduce(1);\nexport { reduce as foldl, reduce as inject };\n\n// The right-associative version of reduce, also known as `foldr`.\nexport var reduceRight = createReduce(-1);\nexport { reduceRight as foldr };\n\n// Return the first value which passes a truth test.\nexport function find(obj, predicate, context) {\n  var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n  var key = keyFinder(obj, predicate, context);\n  if (key !== void 0 && key !== -1) return obj[key];\n}\nexport { find as detect };\n\n// Return all the elements that pass a truth test.\nexport function filter(obj, predicate, context) {\n  var results = [];\n  predicate = cb(predicate, context);\n  each(obj, function(value, index, list) {\n    if (predicate(value, index, list)) results.push(value);\n  });\n  return results;\n}\nexport { filter as select };\n\n// Return all the elements for which a truth test fails.\nexport function reject(obj, predicate, context) {\n  return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements match a truth test.\nexport function every(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (!predicate(obj[currentKey], currentKey, obj)) return false;\n  }\n  return true;\n}\nexport { every as all };\n\n// Determine if at least one element in the object matches a truth test.\nexport function some(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (predicate(obj[currentKey], currentKey, obj)) return true;\n  }\n  return false;\n}\nexport { some as any };\n\n// Determine if the array or object contains a given item (using `===`).\nexport function contains(obj, item, fromIndex, guard) {\n  if (!isArrayLike(obj)) obj = values(obj);\n  if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n  return indexOf(obj, item, fromIndex) >= 0;\n}\nexport { contains as includes, contains as include };\n\n// Invoke a method (with arguments) on every item in a collection.\nexport var invoke = restArguments(function(obj, path, args) {\n  var contextPath, func;\n  if (isFunction(path)) {\n    func = path;\n  } else if (isArray(path)) {\n    contextPath = path.slice(0, -1);\n    path = path[path.length - 1];\n  }\n  return map(obj, function(context) {\n    var method = func;\n    if (!method) {\n      if (contextPath && contextPath.length) {\n        context = deepGet(context, contextPath);\n      }\n      if (context == null) return void 0;\n      method = context[path];\n    }\n    return method == null ? method : method.apply(context, args);\n  });\n});\n\n// Convenience version of a common use case of `map`: fetching a property.\nexport function pluck(obj, key) {\n  return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `filter`: selecting only objects\n// containing specific `key:value` pairs.\nexport function where(obj, attrs) {\n  return filter(obj, matcher(attrs));\n}\n\n// Convenience version of a common use case of `find`: getting the first object\n// containing specific `key:value` pairs.\nexport function findWhere(obj, attrs) {\n  return find(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nexport function max(obj, iteratee, context) {\n  var result = -Infinity, lastComputed = -Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value > result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Return the minimum element (or element-based computation).\nexport function min(obj, iteratee, context) {\n  var result = Infinity, lastComputed = Infinity,\n      value, computed;\n  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value < result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed < lastComputed || computed === Infinity && result === Infinity) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Shuffle a collection.\nexport function shuffle(obj) {\n  return sample(obj, Infinity);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `map`.\nexport function sample(obj, n, guard) {\n  if (n == null || guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    return obj[random(obj.length - 1)];\n  }\n  var sample = isArrayLike(obj) ? clone(obj) : values(obj);\n  var length = getLength(sample);\n  n = Math.max(Math.min(n, length), 0);\n  var last = length - 1;\n  for (var index = 0; index < n; index++) {\n    var rand = random(index, last);\n    var temp = sample[index];\n    sample[index] = sample[rand];\n    sample[rand] = temp;\n  }\n  return sample.slice(0, n);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport function sortBy(obj, iteratee, context) {\n  var index = 0;\n  iteratee = cb(iteratee, context);\n  return pluck(map(obj, function(value, key, list) {\n    return {\n      value: value,\n      index: index++,\n      criteria: iteratee(value, key, list)\n    };\n  }).sort(function(left, right) {\n    var a = left.criteria;\n    var b = right.criteria;\n    if (a !== b) {\n      if (a > b || a === void 0) return 1;\n      if (a < b || b === void 0) return -1;\n    }\n    return left.index - right.index;\n  }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n  return function(obj, iteratee, context) {\n    var result = partition ? [[], []] : {};\n    iteratee = cb(iteratee, context);\n    each(obj, function(value, index) {\n      var key = iteratee(value, index, obj);\n      behavior(result, value, key);\n    });\n    return result;\n  };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport var groupBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `groupBy`, but for\n// when you know that your index values will be unique.\nexport var indexBy = group(function(result, value, key) {\n  result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport var countBy = group(function(result, value, key) {\n  if (_has(result, key)) result[key]++; else result[key] = 1;\n});\n\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n// Safely create a real, live array from anything iterable.\nexport function toArray(obj) {\n  if (!obj) return [];\n  if (isArray(obj)) return slice.call(obj);\n  if (isString(obj)) {\n    // Keep surrogate pair characters together\n    return obj.match(reStrSymbol);\n  }\n  if (isArrayLike(obj)) return map(obj, identity);\n  return values(obj);\n}\n\n// Return the number of elements in an object.\nexport function size(obj) {\n  if (obj == null) return 0;\n  return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Split a collection into two arrays: one whose elements all satisfy the given\n// predicate, and one whose elements all do not satisfy the predicate.\nexport var partition = group(function(result, value, pass) {\n  result[pass ? 0 : 1].push(value);\n}, true);\n\n// Array Functions\n// ---------------\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `map`.\nexport function first(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[0];\n  return initial(array, array.length - n);\n}\nexport { first as head, first as take };\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport function initial(array, n, guard) {\n  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport function last(array, n, guard) {\n  if (array == null || array.length < 1) return n == null ? void 0 : [];\n  if (n == null || guard) return array[array.length - 1];\n  return rest(array, Math.max(0, array.length - n));\n}\n\n// Returns everything but the first entry of the array. Especially useful on\n// the arguments object. Passing an **n** will return the rest N values in the\n// array.\nexport function rest(array, n, guard) {\n  return slice.call(array, n == null || guard ? 1 : n);\n}\nexport { rest as tail, rest as drop };\n\n// Trim out all falsy values from an array.\nexport function compact(array) {\n  return filter(array, Boolean);\n}\n\n// Internal implementation of a recursive `flatten` function.\nfunction _flatten(input, shallow, strict, output) {\n  output = output || [];\n  var idx = output.length;\n  for (var i = 0, length = getLength(input); i < length; i++) {\n    var value = input[i];\n    if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n      // Flatten current level of array or arguments object.\n      if (shallow) {\n        var j = 0, len = value.length;\n        while (j < len) output[idx++] = value[j++];\n      } else {\n        _flatten(value, shallow, strict, output);\n        idx = output.length;\n      }\n    } else if (!strict) {\n      output[idx++] = value;\n    }\n  }\n  return output;\n}\n\n// Flatten out an array, either recursively (by default), or just one level.\nexport function flatten(array, shallow) {\n  return _flatten(array, shallow, false);\n}\n\n// Return a version of the array that does not contain the specified value(s).\nexport var without = restArguments(function(array, otherArrays) {\n  return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport function uniq(array, isSorted, iteratee, context) {\n  if (!isBoolean(isSorted)) {\n    context = iteratee;\n    iteratee = isSorted;\n    isSorted = false;\n  }\n  if (iteratee != null) iteratee = cb(iteratee, context);\n  var result = [];\n  var seen = [];\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var value = array[i],\n        computed = iteratee ? iteratee(value, i, array) : value;\n    if (isSorted && !iteratee) {\n      if (!i || seen !== computed) result.push(value);\n      seen = computed;\n    } else if (iteratee) {\n      if (!contains(seen, computed)) {\n        seen.push(computed);\n        result.push(value);\n      }\n    } else if (!contains(result, value)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\nexport { uniq as unique };\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport var union = restArguments(function(arrays) {\n  return uniq(_flatten(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport function intersection(array) {\n  var result = [];\n  var argsLength = arguments.length;\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var item = array[i];\n    if (contains(result, item)) continue;\n    var j;\n    for (j = 1; j < argsLength; j++) {\n      if (!contains(arguments[j], item)) break;\n    }\n    if (j === argsLength) result.push(item);\n  }\n  return result;\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport var difference = restArguments(function(array, rest) {\n  rest = _flatten(rest, true, true);\n  return filter(array, function(value){\n    return !contains(rest, value);\n  });\n});\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport function unzip(array) {\n  var length = array && max(array, getLength).length || 0;\n  var result = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    result[index] = pluck(array, index);\n  }\n  return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport var zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of pairs.\nexport function object(list, values) {\n  var result = {};\n  for (var i = 0, length = getLength(list); i < length; i++) {\n    if (values) {\n      result[list[i]] = values[i];\n    } else {\n      result[list[i][0]] = list[i][1];\n    }\n  }\n  return result;\n}\n\n// Generator function to create the findIndex and findLastIndex functions.\nfunction createPredicateIndexFinder(dir) {\n  return function(array, predicate, context) {\n    predicate = cb(predicate, context);\n    var length = getLength(array);\n    var index = dir > 0 ? 0 : length - 1;\n    for (; index >= 0 && index < length; index += dir) {\n      if (predicate(array[index], index, array)) return index;\n    }\n    return -1;\n  };\n}\n\n// Returns the first index on an array-like that passes a predicate test.\nexport var findIndex = createPredicateIndexFinder(1);\nexport var findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport function sortedIndex(array, obj, iteratee, context) {\n  iteratee = cb(iteratee, context, 1);\n  var value = iteratee(obj);\n  var low = 0, high = getLength(array);\n  while (low < high) {\n    var mid = Math.floor((low + high) / 2);\n    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n  }\n  return low;\n}\n\n// Generator function to create the indexOf and lastIndexOf functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n  return function(array, item, idx) {\n    var i = 0, length = getLength(array);\n    if (typeof idx == 'number') {\n      if (dir > 0) {\n        i = idx >= 0 ? idx : Math.max(idx + length, i);\n      } else {\n        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n      }\n    } else if (sortedIndex && idx && length) {\n      idx = sortedIndex(array, item);\n      return array[idx] === item ? idx : -1;\n    }\n    if (item !== item) {\n      idx = predicateFind(slice.call(array, i, length), isNaN);\n      return idx >= 0 ? idx + i : -1;\n    }\n    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n      if (array[idx] === item) return idx;\n    }\n    return -1;\n  };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport var indexOf = createIndexFinder(1, findIndex, sortedIndex);\nexport var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport function range(start, stop, step) {\n  if (stop == null) {\n    stop = start || 0;\n    start = 0;\n  }\n  if (!step) {\n    step = stop < start ? -1 : 1;\n  }\n\n  var length = Math.max(Math.ceil((stop - start) / step), 0);\n  var range = Array(length);\n\n  for (var idx = 0; idx < length; idx++, start += step) {\n    range[idx] = start;\n  }\n\n  return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport function chunk(array, count) {\n  if (count == null || count < 1) return [];\n  var result = [];\n  var i = 0, length = array.length;\n  while (i < length) {\n    result.push(slice.call(array, i, i += count));\n  }\n  return result;\n}\n\n// Function (ahem) Functions\n// ------------------\n\n// Determines whether to execute a function as a constructor\n// or a normal function with the provided arguments.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n  var self = baseCreate(sourceFunc.prototype);\n  var result = sourceFunc.apply(self, args);\n  if (isObject(result)) return result;\n  return self;\n}\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n// available.\nexport var bind = restArguments(function(func, context, args) {\n  if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n  var bound = restArguments(function(callArgs) {\n    return executeBound(func, bound, context, this, args.concat(callArgs));\n  });\n  return bound;\n});\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. _ acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `partial.placeholder` for a custom placeholder argument.\nexport var partial = restArguments(function(func, boundArgs) {\n  var placeholder = partial.placeholder;\n  var bound = function() {\n    var position = 0, length = boundArgs.length;\n    var args = Array(length);\n    for (var i = 0; i < length; i++) {\n      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n    }\n    while (position < arguments.length) args.push(arguments[position++]);\n    return executeBound(func, bound, this, this, args);\n  };\n  return bound;\n});\n\npartial.placeholder = _;\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport var bindAll = restArguments(function(obj, _keys) {\n  _keys = _flatten(_keys, false, false);\n  var index = _keys.length;\n  if (index < 1) throw new Error('bindAll must be passed function names');\n  while (index--) {\n    var key = _keys[index];\n    obj[key] = bind(obj[key], obj);\n  }\n});\n\n// Memoize an expensive function by storing its results.\nexport function memoize(func, hasher) {\n  var memoize = function(key) {\n    var cache = memoize.cache;\n    var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n    if (!_has(cache, address)) cache[address] = func.apply(this, arguments);\n    return cache[address];\n  };\n  memoize.cache = {};\n  return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport var delay = restArguments(function(func, wait, args) {\n  return setTimeout(function() {\n    return func.apply(null, args);\n  }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport var defer = partial(delay, _, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport function throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function() {\n    var _now = now();\n    if (!previous && options.leading === false) previous = _now;\n    var remaining = wait - (_now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n      previous = _now;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n\n  throttled.cancel = function() {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\nexport function debounce(func, wait, immediate) {\n  var timeout, result;\n\n  var later = function(context, args) {\n    timeout = null;\n    if (args) result = func.apply(context, args);\n  };\n\n  var debounced = restArguments(function(args) {\n    if (timeout) clearTimeout(timeout);\n    if (immediate) {\n      var callNow = !timeout;\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(this, args);\n    } else {\n      timeout = delay(later, wait, this, args);\n    }\n\n    return result;\n  });\n\n  debounced.cancel = function() {\n    clearTimeout(timeout);\n    timeout = null;\n  };\n\n  return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport function wrap(func, wrapper) {\n  return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nexport function negate(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport function compose() {\n  var args = arguments;\n  var start = args.length - 1;\n  return function() {\n    var i = start;\n    var result = args[start].apply(this, arguments);\n    while (i--) result = args[i].call(this, result);\n    return result;\n  };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nexport function after(times, func) {\n  return function() {\n    if (--times < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\n// Returns a function that will only be executed up to (but not including) the Nth call.\nexport function before(times, func) {\n  var memo;\n  return function() {\n    if (--times > 0) {\n      memo = func.apply(this, arguments);\n    }\n    if (times <= 1) func = null;\n    return memo;\n  };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport var once = partial(before, 2);\n\n// Object Functions\n// ----------------\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\nfunction collectNonEnumProps(obj, _keys) {\n  var nonEnumIdx = nonEnumerableProps.length;\n  var constructor = obj.constructor;\n  var proto = isFunction(constructor) && constructor.prototype || ObjProto;\n\n  // Constructor is a special case.\n  var prop = 'constructor';\n  if (_has(obj, prop) && !contains(_keys, prop)) _keys.push(prop);\n\n  while (nonEnumIdx--) {\n    prop = nonEnumerableProps[nonEnumIdx];\n    if (prop in obj && obj[prop] !== proto[prop] && !contains(_keys, prop)) {\n      _keys.push(prop);\n    }\n  }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport function keys(obj) {\n  if (!isObject(obj)) return [];\n  if (nativeKeys) return nativeKeys(obj);\n  var _keys = [];\n  for (var key in obj) if (_has(obj, key)) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve all the property names of an object.\nexport function allKeys(obj) {\n  if (!isObject(obj)) return [];\n  var _keys = [];\n  for (var key in obj) _keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, _keys);\n  return _keys;\n}\n\n// Retrieve the values of an object's properties.\nexport function values(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var values = Array(length);\n  for (var i = 0; i < length; i++) {\n    values[i] = obj[_keys[i]];\n  }\n  return values;\n}\n\n// Returns the results of applying the iteratee to each element of the object.\n// In contrast to map it returns an object.\nexport function mapObject(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = keys(obj),\n      length = _keys.length,\n      results = {};\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys[index];\n    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of object.\nexport function pairs(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var pairs = Array(length);\n  for (var i = 0; i < length; i++) {\n    pairs[i] = [_keys[i], obj[_keys[i]]];\n  }\n  return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nexport function invert(obj) {\n  var result = {};\n  var _keys = keys(obj);\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    result[obj[_keys[i]]] = _keys[i];\n  }\n  return result;\n}\n\n// Return a sorted list of the function names available on the object.\nexport function functions(obj) {\n  var names = [];\n  for (var key in obj) {\n    if (isFunction(obj[key])) names.push(key);\n  }\n  return names.sort();\n}\nexport { functions as methods };\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n  return function(obj) {\n    var length = arguments.length;\n    if (defaults) obj = Object(obj);\n    if (length < 2 || obj == null) return obj;\n    for (var index = 1; index < length; index++) {\n      var source = arguments[index],\n          _keys = keysFunc(source),\n          l = _keys.length;\n      for (var i = 0; i < l; i++) {\n        var key = _keys[i];\n        if (!defaults || obj[key] === void 0) obj[key] = source[key];\n      }\n    }\n    return obj;\n  };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nexport var extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport var extendOwn = createAssigner(keys);\nexport { extendOwn as assign };\n\n// Returns the first key on an object that passes a predicate test.\nexport function findKey(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = keys(obj), key;\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    key = _keys[i];\n    if (predicate(obj[key], key, obj)) return key;\n  }\n}\n\n// Internal pick helper function to determine if `obj` has key `key`.\nfunction keyInObj(value, key, obj) {\n  return key in obj;\n}\n\n// Return a copy of the object only containing the whitelisted properties.\nexport var pick = restArguments(function(obj, _keys) {\n  var result = {}, iteratee = _keys[0];\n  if (obj == null) return result;\n  if (isFunction(iteratee)) {\n    if (_keys.length > 1) iteratee = optimizeCb(iteratee, _keys[1]);\n    _keys = allKeys(obj);\n  } else {\n    iteratee = keyInObj;\n    _keys = _flatten(_keys, false, false);\n    obj = Object(obj);\n  }\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    var key = _keys[i];\n    var value = obj[key];\n    if (iteratee(value, key, obj)) result[key] = value;\n  }\n  return result;\n});\n\n// Return a copy of the object without the blacklisted properties.\nexport var omit = restArguments(function(obj, _keys) {\n  var iteratee = _keys[0], context;\n  if (isFunction(iteratee)) {\n    iteratee = negate(iteratee);\n    if (_keys.length > 1) context = _keys[1];\n  } else {\n    _keys = map(_flatten(_keys, false, false), String);\n    iteratee = function(value, key) {\n      return !contains(_keys, key);\n    };\n  }\n  return pick(obj, iteratee, context);\n});\n\n// Fill in a given object with default properties.\nexport var defaults = createAssigner(allKeys, true);\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport function create(prototype, props) {\n  var result = baseCreate(prototype);\n  if (props) extendOwn(result, props);\n  return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nexport function clone(obj) {\n  if (!isObject(obj)) return obj;\n  return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes interceptor with the obj, and then returns obj.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport function tap(obj, interceptor) {\n  interceptor(obj);\n  return obj;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport function isMatch(object, attrs) {\n  var _keys = keys(attrs), length = _keys.length;\n  if (object == null) return !length;\n  var obj = Object(object);\n  for (var i = 0; i < length; i++) {\n    var key = _keys[i];\n    if (attrs[key] !== obj[key] || !(key in obj)) return false;\n  }\n  return true;\n}\n\n\n// Internal recursive comparison function for `isEqual`.\nfunction eq(a, b, aStack, bStack) {\n  // Identical objects are equal. `0 === -0`, but they aren't identical.\n  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n  if (a === b) return a !== 0 || 1 / a === 1 / b;\n  // `null` or `undefined` only equal to itself (strict comparison).\n  if (a == null || b == null) return false;\n  // `NaN`s are equivalent, but non-reflexive.\n  if (a !== a) return b !== b;\n  // Exhaust primitive checks\n  var type = typeof a;\n  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n  return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n  // Unwrap any wrapped objects.\n  if (a instanceof _) a = a._wrapped;\n  if (b instanceof _) b = b._wrapped;\n  // Compare `[[Class]]` names.\n  var className = toString.call(a);\n  if (className !== toString.call(b)) return false;\n  switch (className) {\n    // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n    case '[object RegExp]':\n    // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n    case '[object String]':\n      // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n      // equivalent to `new String(\"5\")`.\n      return '' + a === '' + b;\n    case '[object Number]':\n      // `NaN`s are equivalent, but non-reflexive.\n      // Object(NaN) is equivalent to NaN.\n      if (+a !== +a) return +b !== +b;\n      // An `egal` comparison is performed for other numeric values.\n      return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n    case '[object Date]':\n    case '[object Boolean]':\n      // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n      // millisecond representations. Note that invalid dates with millisecond representations\n      // of `NaN` are not equivalent.\n      return +a === +b;\n    case '[object Symbol]':\n      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n  }\n\n  var areArrays = className === '[object Array]';\n  if (!areArrays) {\n    if (typeof a != 'object' || typeof b != 'object') return false;\n\n    // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n    // from different frames are.\n    var aCtor = a.constructor, bCtor = b.constructor;\n    if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n                             isFunction(bCtor) && bCtor instanceof bCtor)\n                        && ('constructor' in a && 'constructor' in b)) {\n      return false;\n    }\n  }\n  // Assume equality for cyclic structures. The algorithm for detecting cyclic\n  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n  // Initializing stack of traversed objects.\n  // It's done here since we only need them for objects and arrays comparison.\n  aStack = aStack || [];\n  bStack = bStack || [];\n  var length = aStack.length;\n  while (length--) {\n    // Linear search. Performance is inversely proportional to the number of\n    // unique nested structures.\n    if (aStack[length] === a) return bStack[length] === b;\n  }\n\n  // Add the first object to the stack of traversed objects.\n  aStack.push(a);\n  bStack.push(b);\n\n  // Recursively compare objects and arrays.\n  if (areArrays) {\n    // Compare array lengths to determine if a deep comparison is necessary.\n    length = a.length;\n    if (length !== b.length) return false;\n    // Deep compare the contents, ignoring non-numeric properties.\n    while (length--) {\n      if (!eq(a[length], b[length], aStack, bStack)) return false;\n    }\n  } else {\n    // Deep compare objects.\n    var _keys = keys(a), key;\n    length = _keys.length;\n    // Ensure that both objects contain the same number of properties before comparing deep equality.\n    if (keys(b).length !== length) return false;\n    while (length--) {\n      // Deep compare each member\n      key = _keys[length];\n      if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n    }\n  }\n  // Remove the first object from the stack of traversed objects.\n  aStack.pop();\n  bStack.pop();\n  return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport function isEqual(a, b) {\n  return eq(a, b);\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport function isEmpty(obj) {\n  if (obj == null) return true;\n  if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;\n  return keys(obj).length === 0;\n}\n\n// Is a given value a DOM element?\nexport function isElement(obj) {\n  return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a toString-based type tester.\nfunction tagTester(name) {\n  return function(obj) {\n    return toString.call(obj) === '[object ' + name + ']';\n  };\n}\n\n// Is a given value an array?\n// Delegates to ECMA5's native Array.isArray\nexport var isArray = nativeIsArray || tagTester('Array');\n\n// Is a given variable an object?\nexport function isObject(obj) {\n  var type = typeof obj;\n  return type === 'function' || type === 'object' && !!obj;\n}\n\n// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.\nexport var isArguments = tagTester('Arguments');\nexport var isFunction = tagTester('Function');\nexport var isString = tagTester('String');\nexport var isNumber = tagTester('Number');\nexport var isDate = tagTester('Date');\nexport var isRegExp = tagTester('RegExp');\nexport var isError = tagTester('Error');\nexport var isSymbol = tagTester('Symbol');\nexport var isMap = tagTester('Map');\nexport var isWeakMap = tagTester('WeakMap');\nexport var isSet = tagTester('Set');\nexport var isWeakSet = tagTester('WeakSet');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n  if (!isArguments(arguments)) {\n    isArguments = function(obj) {\n      return _has(obj, 'callee');\n    };\n  }\n}());\n\n// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n  isFunction = function(obj) {\n    return typeof obj == 'function' || false;\n  };\n}\n\n// Is a given object a finite number?\nexport function isFinite(obj) {\n  return !isSymbol(obj) && _isFinite(obj) && !_isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nexport function isNaN(obj) {\n  return isNumber(obj) && _isNaN(obj);\n}\n\n// Is a given value a boolean?\nexport function isBoolean(obj) {\n  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value equal to null?\nexport function isNull(obj) {\n  return obj === null;\n}\n\n// Is a given variable undefined?\nexport function isUndefined(obj) {\n  return obj === void 0;\n}\n\n// Shortcut function for checking if an object has a given property directly\n// on itself (in other words, not on a prototype).\nexport function has(obj, path) {\n  if (!isArray(path)) {\n    return _has(obj, path);\n  }\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    var key = path[i];\n    if (obj == null || !hasOwnProperty.call(obj, key)) {\n      return false;\n    }\n    obj = obj[key];\n  }\n  return !!length;\n}\n\n// Utility Functions\n// -----------------\n\n// Keep the identity function around for default iteratees.\nexport function identity(value) {\n  return value;\n}\n\n// Predicate-generating functions. Often useful outside of Underscore.\nexport function constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nexport function noop(){}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indexes.\nexport function property(path) {\n  if (!isArray(path)) {\n    return shallowProperty(path);\n  }\n  return function(obj) {\n    return deepGet(obj, path);\n  };\n}\n\n// Generates a function for a given object that returns a given property.\nexport function propertyOf(obj) {\n  if (obj == null) {\n    return function(){};\n  }\n  return function(path) {\n    return !isArray(path) ? obj[path] : deepGet(obj, path);\n  };\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport function matcher(attrs) {\n  attrs = extendOwn({}, attrs);\n  return function(obj) {\n    return isMatch(obj, attrs);\n  };\n}\nexport { matcher as matches };\n\n// Run a function **n** times.\nexport function times(n, iteratee, context) {\n  var accum = Array(Math.max(0, n));\n  iteratee = optimizeCb(iteratee, context, 1);\n  for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n  return accum;\n}\n\n// Return a random integer between min and max (inclusive).\nexport function random(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nexport var now = Date.now || function() {\n  return new Date().getTime();\n};\n\n// List of HTML entities for escaping.\nvar escapeMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n};\nvar unescapeMap = invert(escapeMap);\n\n// Functions for escaping and unescaping strings to/from HTML interpolation.\nfunction createEscaper(map) {\n  var escaper = function(match) {\n    return map[match];\n  };\n  // Regexes for identifying a key that needs to be escaped.\n  var source = '(?:' + keys(map).join('|') + ')';\n  var testRegexp = RegExp(source);\n  var replaceRegexp = RegExp(source, 'g');\n  return function(string) {\n    string = string == null ? '' : '' + string;\n    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n  };\n}\nexport var escape = createEscaper(escapeMap);\nexport var unescape = createEscaper(unescapeMap);\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport function result(obj, path, fallback) {\n  if (!isArray(path)) path = [path];\n  var length = path.length;\n  if (!length) {\n    return isFunction(fallback) ? fallback.call(obj) : fallback;\n  }\n  for (var i = 0; i < length; i++) {\n    var prop = obj == null ? void 0 : obj[path[i]];\n    if (prop === void 0) {\n      prop = fallback;\n      i = length; // Ensure we don't continue iterating.\n    }\n    obj = isFunction(prop) ? prop.call(obj) : prop;\n  }\n  return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport function uniqueId(prefix) {\n  var id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nexport var templateSettings = _.templateSettings = {\n  evaluate: /<%([\\s\\S]+?)%>/g,\n  interpolate: /<%=([\\s\\S]+?)%>/g,\n  escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n  \"'\": \"'\",\n  '\\\\': '\\\\',\n  '\\r': 'r',\n  '\\n': 'n',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nvar escapeChar = function(match) {\n  return '\\\\' + escapes[match];\n};\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport function template(text, settings, oldSettings) {\n  if (!settings && oldSettings) settings = oldSettings;\n  settings = defaults({}, settings, _.templateSettings);\n\n  // Combine delimiters into one regular expression via alternation.\n  var matcher = RegExp([\n    (settings.escape || noMatch).source,\n    (settings.interpolate || noMatch).source,\n    (settings.evaluate || noMatch).source\n  ].join('|') + '|$', 'g');\n\n  // Compile the template source, escaping string literals appropriately.\n  var index = 0;\n  var source = \"__p+='\";\n  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n    index = offset + match.length;\n\n    if (escape) {\n      source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n    } else if (interpolate) {\n      source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n    } else if (evaluate) {\n      source += \"';\\n\" + evaluate + \"\\n__p+='\";\n    }\n\n    // Adobe VMs need the match returned to produce the correct offset.\n    return match;\n  });\n  source += \"';\\n\";\n\n  // If a variable is not specified, place data values in local scope.\n  if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n  source = \"var __t,__p='',__j=Array.prototype.join,\" +\n    \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n    source + 'return __p;\\n';\n\n  var render;\n  try {\n    render = new Function(settings.variable || 'obj', '_', source);\n  } catch (e) {\n    e.source = source;\n    throw e;\n  }\n\n  var template = function(data) {\n    return render.call(this, data, _);\n  };\n\n  // Provide the compiled source as a convenience for precompilation.\n  var argument = settings.variable || 'obj';\n  template.source = 'function(' + argument + '){\\n' + source + '}';\n\n  return template;\n}\n\n// Add a \"chain\" function. Start chaining a wrapped Underscore object.\nexport function chain(obj) {\n  var instance = _(obj);\n  instance._chain = true;\n  return instance;\n}\n\n// OOP\n// ---------------\n// If Underscore is called as a function, it returns a wrapped object that\n// can be used OO-style. This wrapper holds altered versions of all the\n// underscore functions. Wrapped objects may be chained.\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n  return instance._chain ? _(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nexport function mixin(obj) {\n  each(functions(obj), function(name) {\n    var func = _[name] = obj[name];\n    _.prototype[name] = function() {\n      var args = [this._wrapped];\n      push.apply(args, arguments);\n      return chainResult(this, func.apply(_, args));\n    };\n  });\n  return _;\n}\n\n// Add all mutator Array functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    var obj = this._wrapped;\n    method.apply(obj, arguments);\n    if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n    return chainResult(this, obj);\n  };\n});\n\n// Add all accessor Array functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n  var method = ArrayProto[name];\n  _.prototype[name] = function() {\n    return chainResult(this, method.apply(this._wrapped, arguments));\n  };\n});\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n  return this._wrapped;\n};\n\n// Provide unwrapping proxy for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n  return String(this._wrapped);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/underscore/modules/index.js\n// module id = 244\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n  Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/emptyObject.js\n// module id = 245\n// module chunks = 0 1","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n  return function () {\n    return arg;\n  };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n  return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n  return arg;\n};\n\nmodule.exports = emptyFunction;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/emptyFunction.js\n// module id = 246\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n * \n */\n\n/*eslint-disable no-self-compare */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  } else {\n    // Step 6.a: NaN == NaN\n    return x !== x && y !== y;\n  }\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nmodule.exports = shallowEqual;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/shallowEqual.js\n// module id = 247\n// module chunks = 0 1","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of https://github.com/facebook/react/tree/0.13-stable.\n * An additional grant of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule warning\n */\n\n\"use strict\";\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function warning() {};\n\nif (__DEV__) {\n  warning = function (condition, format) {\n    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n\n    if (format === undefined) {\n      throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n    }\n\n    if (format.length < 10 || /^[s\\W]*$/.test(format)) {\n      throw new Error('The warning format should be able to uniquely identify this ' + 'warning. Please, use a more descriptive format than: ' + format);\n    }\n\n    if (format.indexOf('Failed Composite propType: ') === 0) {\n      return; // Ignore CompositeComponent proptype check.\n    }\n\n    if (!condition) {\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      console.warn(message);\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch (x) {}\n    }\n  };\n}\n\nmodule.exports = warning;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/warning.js\n// module id = 248\n// module chunks = 0 1","'use strict';\n\nvar invariant = require('invariant');\nvar assign = require('object-assign');\nvar qs = require('qs');\n\nvar paramCompileMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\\[\\]\\\\+|{}^$]/g;\nvar paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g;\nvar paramInjectTrailingSlashMatcher = /\\/\\/\\?|\\/\\?\\/|\\/\\?(?![^\\/=]+=.*$)/g;\nvar queryMatcher = /\\?(.*)$/;\n\nvar _compiledPatterns = {};\n\nfunction compilePattern(pattern) {\n  if (!(pattern in _compiledPatterns)) {\n    var paramNames = [];\n    var source = pattern.replace(paramCompileMatcher, function (match, paramName) {\n      if (paramName) {\n        paramNames.push(paramName);\n        return '([^/?#]+)';\n      } else if (match === '*') {\n        paramNames.push('splat');\n        return '(.*?)';\n      } else {\n        return '\\\\' + match;\n      }\n    });\n\n    _compiledPatterns[pattern] = {\n      matcher: new RegExp('^' + source + '$', 'i'),\n      paramNames: paramNames\n    };\n  }\n\n  return _compiledPatterns[pattern];\n}\n\nvar PathUtils = {\n\n  /**\n   * Returns true if the given path is absolute.\n   */\n  isAbsolute: function isAbsolute(path) {\n    return path.charAt(0) === '/';\n  },\n\n  /**\n   * Joins two URL paths together.\n   */\n  join: function join(a, b) {\n    return a.replace(/\\/*$/, '/') + b;\n  },\n\n  /**\n   * Returns an array of the names of all parameters in the given pattern.\n   */\n  extractParamNames: function extractParamNames(pattern) {\n    return compilePattern(pattern).paramNames;\n  },\n\n  /**\n   * Extracts the portions of the given URL path that match the given pattern\n   * and returns an object of param name => value pairs. Returns null if the\n   * pattern does not match the given path.\n   */\n  extractParams: function extractParams(pattern, path) {\n    var _compilePattern = compilePattern(pattern);\n\n    var matcher = _compilePattern.matcher;\n    var paramNames = _compilePattern.paramNames;\n\n    var match = path.match(matcher);\n\n    if (!match) return null;\n\n    var params = {};\n\n    paramNames.forEach(function (paramName, index) {\n      params[paramName] = match[index + 1];\n    });\n\n    return params;\n  },\n\n  /**\n   * Returns a version of the given route path with params interpolated. Throws\n   * if there is a dynamic segment of the route path for which there is no param.\n   */\n  injectParams: function injectParams(pattern, params) {\n    params = params || {};\n\n    var splatIndex = 0;\n\n    return pattern.replace(paramInjectMatcher, function (match, paramName) {\n      paramName = paramName || 'splat';\n\n      // If param is optional don't check for existence\n      if (paramName.slice(-1) === '?') {\n        paramName = paramName.slice(0, -1);\n\n        if (params[paramName] == null) return '';\n      } else {\n        invariant(params[paramName] != null, 'Missing \"%s\" parameter for path \"%s\"', paramName, pattern);\n      }\n\n      var segment;\n      if (paramName === 'splat' && Array.isArray(params[paramName])) {\n        segment = params[paramName][splatIndex++];\n\n        invariant(segment != null, 'Missing splat # %s for path \"%s\"', splatIndex, pattern);\n      } else {\n        segment = params[paramName];\n      }\n\n      return segment;\n    }).replace(paramInjectTrailingSlashMatcher, '/');\n  },\n\n  /**\n   * Returns an object that is the result of parsing any query string contained\n   * in the given path, null if the path contains no query string.\n   */\n  extractQuery: function extractQuery(path) {\n    var match = path.match(queryMatcher);\n    return match && qs.parse(match[1]);\n  },\n\n  /**\n   * Returns a version of the given path without the query string.\n   */\n  withoutQuery: function withoutQuery(path) {\n    return path.replace(queryMatcher, '');\n  },\n\n  /**\n   * Returns a version of the given path with the parameters in the given\n   * query merged into the query string.\n   */\n  withQuery: function withQuery(path, query) {\n    var existingQuery = PathUtils.extractQuery(path);\n\n    if (existingQuery) query = query ? assign(existingQuery, query) : existingQuery;\n\n    var queryString = qs.stringify(query, { arrayFormat: 'brackets' });\n\n    if (queryString) return PathUtils.withoutQuery(path) + '?' + queryString;\n\n    return PathUtils.withoutQuery(path);\n  }\n\n};\n\nmodule.exports = PathUtils;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/PathUtils.js\n// module id = 249\n// module chunks = 0 1","'use strict';\n\nvar LocationActions = require('../actions/LocationActions');\nvar History = require('../History');\n\nvar _listeners = [];\nvar _isListening = false;\n\nfunction notifyChange(type) {\n  var change = {\n    path: HistoryLocation.getCurrentPath(),\n    type: type\n  };\n\n  _listeners.forEach(function (listener) {\n    listener.call(HistoryLocation, change);\n  });\n}\n\nfunction onPopState(event) {\n  if (event.state === undefined) return; // Ignore extraneous popstate events in WebKit.\n\n  notifyChange(LocationActions.POP);\n}\n\n/**\n * A Location that uses HTML5 history.\n */\nvar HistoryLocation = {\n\n  addChangeListener: function addChangeListener(listener) {\n    _listeners.push(listener);\n\n    if (!_isListening) {\n      if (window.addEventListener) {\n        window.addEventListener('popstate', onPopState, false);\n      } else {\n        window.attachEvent('onpopstate', onPopState);\n      }\n\n      _isListening = true;\n    }\n  },\n\n  removeChangeListener: function removeChangeListener(listener) {\n    _listeners = _listeners.filter(function (l) {\n      return l !== listener;\n    });\n\n    if (_listeners.length === 0) {\n      if (window.addEventListener) {\n        window.removeEventListener('popstate', onPopState, false);\n      } else {\n        window.removeEvent('onpopstate', onPopState);\n      }\n\n      _isListening = false;\n    }\n  },\n\n  push: function push(path) {\n    window.history.pushState({ path: path }, '', path);\n    History.length += 1;\n    notifyChange(LocationActions.PUSH);\n  },\n\n  replace: function replace(path) {\n    window.history.replaceState({ path: path }, '', path);\n    notifyChange(LocationActions.REPLACE);\n  },\n\n  pop: History.back,\n\n  getCurrentPath: function getCurrentPath() {\n    return decodeURI(window.location.pathname + window.location.search);\n  },\n\n  toString: function toString() {\n    return '<HistoryLocation>';\n  }\n\n};\n\nmodule.exports = HistoryLocation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/locations/HistoryLocation.js\n// module id = 250\n// module chunks = 0 1","import _ from 'lodash';\nimport $ from 'jquery';\n\nimport { Dispatcher } from '@opengov/og_flux';\n\nimport Entity from '../models/entity';\nimport Entities from '../models/entities';\nimport ControlPanelStore from '../stores/control_panel_store';\nimport EntityStore from '../stores/entity_store';\n\nexport default {\n  selected(entity) {\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_SELECTED',\n      entity: entity\n    });\n  },\n\n  selectedById(id, forceReload) {\n    if (ControlPanelStore.isEntitySelected(id) && !forceReload) {\n      return;\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE'\n    });\n\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_LOADING',\n      entityId: id\n    });\n\n    const entity = new Entity({id});\n    entity.fetch({\n      success: () => this.selected(entity.toJSON()),\n      error: (model, resp) => this._onEntityError(resp)\n    });\n  },\n\n  startLoading() {\n    Dispatcher.handleServerAction({\n      actionType: 'ENTITIES_LOADING'\n    });\n  },\n\n  loadAll() {\n    const entities = new Entities();\n    entities.fetch({\n      success: () => {\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITIES_LOADED',\n          entities: entities.toJSON()\n        });\n      },\n      error: (model, resp) => this._onEntitiesError(resp)\n    });\n  },\n\n  newEntity() {\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_NEW',\n      entity: new Entity()\n    });\n\n    this\n      ._fetchEntityTypes()\n      .then(() => {\n        return this._fetchCountries();\n      })\n      .then(() => {\n        return this._fetchStates();\n      })\n      .then(() => {\n        return this._fetchGroups();\n      });\n  },\n\n  submitEntityForm() {\n    const entity = EntityStore.getNewEntity();\n    if (!entity) {\n      return;\n    }\n\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_FORM_SUBMIT'\n    });\n\n    entity.save(null, {\n      success: () => {\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITY_CREATED',\n          entity: entity.toJSON()\n        });\n\n        this.loadAll();\n      },\n      error: (model, resp) => {\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITY_CREATE_ERROR',\n          response: resp\n        });\n      }\n    });\n\n    this.loadAll();\n  },\n\n  cancelEntityForm() {\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_FORM_CANCEL'\n    });\n  },\n\n  countrySelected(country) {\n    Dispatcher.handleViewAction({\n      actionType: 'ENTITY_COUNTRY_SELECTED',\n      country\n    });\n\n    this._fetchStates();\n  },\n\n  _fetchEntityTypes() {\n    if (!_.isEmpty(EntityStore.getEntityTypes())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(resolve => {\n      $.getJSON('/api/v1/entities/entity_types.json', data => {\n        const entityTypes = data.entity_types;\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITY_TYPES_LOADED',\n          entityTypes\n        });\n      });\n      resolve();\n    });\n  },\n\n  _fetchCountries() {\n    if (!_.isEmpty(EntityStore.getCountries())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(resolve => {\n      $.getJSON('/api/v1/entities/countries.json', data => {\n        const {countries} = data;\n\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITY_COUNTRIES_LOADED',\n          countries: countries\n        });\n        resolve();\n      });\n    });\n  },\n\n  _fetchStates() {\n    const country = EntityStore.getSelectedCountry();\n    if (!country || !_.isEmpty(EntityStore.getStates())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(resolve => {\n      $.getJSON('/api/v1/entities/states.json', {country}, data => {\n        const {states} = data;\n        Dispatcher.handleServerAction({\n          actionType: 'ENTITY_STATES_LOADED',\n          country: country,\n          states: states\n        });\n        resolve();\n      });\n    });\n  },\n\n  _fetchGroups() {\n    if (!_.isEmpty(EntityStore.getGroups())) {\n      return Promise.resolve();\n    }\n\n    return new Promise(resolve => {\n      $.getJSON('/api/v1/entities/partners', rawGroups => {\n        const formattedGroups = rawGroups.map(group => ({option: group.name, value: group.id}));\n        Dispatcher.handleViewAction({\n          actionType: 'ENTITY_GROUPS_LOADED',\n          groups: formattedGroups\n        });\n        resolve();\n      });\n    });\n  },\n\n  _onEntitiesError(resp) {\n    Dispatcher.handleServerAction({\n      actionType: 'ENTITIES_LOAD_ERROR',\n      response: resp\n    });\n  },\n\n  _onEntityError(resp) {\n    Dispatcher.handleServerAction({\n      actionType: 'ENTITY_LOAD_ERROR',\n      response: resp\n    });\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/actions/entity_actions.js","import React from 'react';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport ToggleMixin from './toggle_mixin';\n\nconst Dropdown = createReactClass({\n  mixins: [ToggleMixin],\n\n  propTypes: {\n    dropdownClass: PropTypes.string,\n    label: PropTypes.string,\n    title: PropTypes.node,\n    description: PropTypes.string,\n    position: PropTypes.oneOf(['align-left', 'align-right', 'align-top']),\n    disabled: PropTypes.bool,\n    onToggle: PropTypes.func\n  },\n\n  getDefaultProps: function () {\n    return {\n      targetClass: \"ui-dropdown__target\",\n      position: \"align-left\",\n      onToggle: _.noop\n    };\n  },\n\n  render: function () {\n    var dropdownClassMixin = classNames({\n      \"disabled\": this.props.disabled,\n      \"is-toggled\": this.state.open,\n      \"multiline\": this.props.description\n    });\n    var dropdownClass = `ui-dropdown ${this.props.dropdownClass} ${dropdownClassMixin}`;\n    var targetClass = `${this.props.targetClass} ${this.props.position}`;\n\n    return (\n      <div className={dropdownClass}\n        title={this.props.titleAttribute}\n        data-hint={this.props.hint}\n        data-hint-position={this.props.hintPosition}\n        onClick={this.handleToggleClick}\n      >\n        <button\n          className={`ui-dropdown__toggle ${this.props.toggleClass}`}\n          disabled={this.props.disabled}\n        >\n          {this.props.label ?\n            <small className=\"ui-dropdown__label\">{this.props.label}</small>\n          : null}\n          {this.props.description ?\n            <span>\n              <strong>{this.props.title}</strong>\n              <small>{this.props.description}</small>\n            </span>\n          : <span className=\"ui-dropdown__title\">{this.props.title}</span>}\n        </button>\n        <div className={targetClass}\n          style={{display: this.state.open ? 'block': 'none'}}\n          onClick={this.handleContentClick}>\n          {this.props.children}\n        </div>\n      </div>\n    );\n  },\n\n  onToggle: function (opening) {\n    this.props.onToggle(opening);\n  }\n});\n\nexport default Dropdown;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/dropdown.js","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@babel/runtime/helpers/interopRequireDefault.js\n// module id = 253\n// module chunks = 0 1","import Backbone from 'backbone';\nimport _ from 'lodash';\nimport * as Immutable from 'immutable';\n\nimport DataSets from './gl_data_sets';\n\nconst legacyReportIds = ['annual', 'ytd', 'balance'];\n\nconst Report = Backbone.Model.extend({\n  urlRoot: '/api/v1/reports',\n\n  defaultGraphType: 'stacked',\n\n  clone() {\n    const report = new this.constructor(this.attributes);\n    report.dataSets.reset(this.dataSets.models);\n    report.setAssocReport(this.associatedReport);\n    return report;\n  },\n\n  initialize() {\n    this.initDataSets();\n    this.authorized = false;\n  },\n\n  defaults() {\n    return {\n      properties: {},\n      locale: 'en_US'\n    };\n  },\n\n  graphType() {\n    const props = this.get('properties');\n\n    if (props && props.graph) {\n      return props.graph;\n    }\n    return this.defaultGraphType;\n  },\n\n  parse(resp) {\n    if (resp) {\n      if (resp.associated_reports) {\n        //Currently only supporting linking single reports; response includes array though\n        if (resp.associated_reports[0]) {\n          this.initAssocReport(resp.associated_reports[0].report);\n          delete resp.associated_reports;\n        }\n      }\n\n      if (resp.data_sets) {\n        this.initDataSets();\n        this.dataSets.set(\n          resp.data_sets.map((dataSet, index) => {\n            return {\n              id: dataSet.id,\n              order: index,\n              name: dataSet.name,\n              // this is seemingly by design that we want label to be dataSet.name\n              label: dataSet.name,\n              year: dataSet.year,\n              month: dataSet.month,\n              description: dataSet.description,\n              type: dataSet.data_set_type\n            };\n          })\n        );\n        delete resp.data_sets;\n      }\n      resp.technical_name = resp.report_type;\n    }\n    return resp;\n  },\n\n  parseError(resp) {\n    const json = resp.responseJSON;\n    if (!json) {\n      return {};\n    }\n\n    const errors = json.errors;\n    if (errors && errors.data_sets) {\n      errors.data_sets = this.dataSets.parseDataSetErrors(errors.data_sets);\n    }\n\n    return json;\n  },\n\n  toJSON() {\n    const attrs = _.clone(this.attributes);\n    attrs.data_sets = this.dataSets.map(function(dataSet, index) {\n      return {id: dataSet.id, name: dataSet.get('label'), order: index};\n    });\n\n    // Only serialize the associated report IDs back up to the server when\n    // we are linking a grid report inside a summary report.\n    // Grid reports may have multiple associated summary reports, so we do not want to\n    // wipe them out here (see REP-422)\n    if (this.get('report_type') !== 'grid') {\n      attrs.associated_report_ids = this.associatedReport ? [this.associatedReport.get('id')] : ['none'];\n    }\n\n    return attrs;\n  },\n\n  toImmutable() {\n    return Immutable.fromJS(this.attributes)\n      .set('data_sets', Immutable.fromJS(this.dataSets.toJSON()));\n  },\n\n  initAssocReport(report) {\n    this.associatedReport = new Report(report);\n\n    this.listenTo(this.associatedReport, 'all', function(event) {\n      this.trigger('associatedReport:' + event, _.tail(arguments));\n    });\n  },\n\n  setAssocReport(report, options) {\n\n    const opts = options ? _.clone(options) : {};\n\n    if (report instanceof Report) {\n      this.associatedReport = report;\n\n      if (!opts.silent) {\n        this.trigger('associatedReport:change');\n      }\n    } else {\n      if (!this.associatedReport) {\n        this.initAssocReport(report);\n      } else {\n        this.associatedReport.set(report, opts);\n      }\n    }\n  },\n\n  unsetAssocReport(options) {\n    const opts = options ? _.clone(options) : {};\n    this.associatedReport = null;\n    if (!opts.silent) {\n      this.trigger('associatedReport:change');\n    }\n  },\n\n  initDataSets() {\n    if (!this.dataSets) {\n      this.dataSets = new DataSets();\n\n      // Emit data set collection events.\n      this.listenTo(this.dataSets, 'all', function(event) {\n        this.trigger('dataSets:' + event, _.tail(arguments));\n      });\n    }\n\n  },\n\n  setDataSets(dataSets) {\n    _.each(dataSets, _.bind(function(dataSet, index) {\n      this.dataSets.at(index).set({\n        id: dataSet.id,\n        label: dataSet.label\n      });\n    }, this));\n  },\n\n  setDefaultState(state) {\n    // Merge default state changes into the current default state.\n    this.set('properties', _.assign({}, this.attributes.properties, state));\n  },\n\n  canEdit() {\n    return this.isNew() || !!_.result(this.get('abilities'), 'update');\n  },\n\n  canDelete() {\n    return !!_.result(this.get('abilities'), 'delete');\n  },\n\n  canRename() {\n    return !!_.result(this.get('abilities'), 'update_name');\n  },\n\n  isLegacy() {\n    return _.includes(legacyReportIds, this.id);\n  },\n\n  isDescriptionVisible() {\n    return this.attributes.properties.description_visible;\n  },\n\n  isAuthorized() {\n    return this.canEdit() || _.isEmpty(this.attributes.access_code) || this.authorized;\n  },\n\n  /*\n    Actions\n  */\n\n  // Open a panel to view and edit the settings for this report.\n  editSettings() {\n    this.trigger('action:editSettings', this);\n  },\n\n  // Load this report and enter into WYSIWYG mode to edit its default state.\n  editDefaultState() {\n    this.trigger('action:editDefaultState', this);\n  },\n\n  // Open the panel to select the data for this report.\n  selectData() {\n    this.trigger('action:selectData', this);\n  }\n});\n\nexport default Report;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/report.ts","export const initializeTracking = (session, entity) => {\n  if (session && session.id) {\n    // Segment Identity & Group Tracking\n\n    const email = session.email ? session.email : '';\n\n    let type = null;\n\n    if (entity.entity_type) {\n      if (typeof(entity.entity_type) === 'string') {\n        type = entity.entity_type;\n      } else if (entity.entity_type.name) {\n        type = entity.entity_type.name;\n      }\n    }\n    if ((window as any).analytics) {\n      (window as any).analytics.identify(session.id, {\n        user_id: session.id,\n        user_entity_id: entity.id,\n        user_roles: session.role ? [session.role.name] : [],\n        user_is_opengov_employee: (email.split('@').slice(-1).toString() === 'opengov.com'),\n        user_suite: 'rt',\n        user_department: session.department,\n        user_title: session.title,\n        user_entity_salesforce_id: entity.salesforce_id,\n        user_delphius_features: entity.feature_permissions,\n        email: email,\n        created_at: session.created_at,\n        internal_external: (email.split('@').slice(-1).toString() === 'opengov.com'), // To be deprecated\n        user_hash: session.user_intercom_hash, // To be deprecated\n        user_role: session.role ? session.role.name : null, // To be deprecated\n        entity_id: session.entity.entity_id // To be deprecated\n      });\n      (window as any).analytics.group(entity.salesforce_id, {\n        entity_bp_id: entity.id,\n        entity_rt_id: entity.id,\n        name: entity.name,\n        created_at: entity.created_at,\n        entity_salesforce_id: entity.salesforce_id,\n        entity_type: type,\n        entity_country: entity.country,\n        entity_state: entity.state\n      });\n    }\n  }\n};\n\nexport const trackPage = (pageName, pageTrackingProps?) => {\n  // Segment Identity & Group Tracking\n  const props = pageTrackingProps || {};\n  if ((window as any).analytics) {\n    (window as any).analytics.page(pageName, {\n      ...props\n    });\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/tracking.ts","/* @preserve\n * The MIT License (MIT)\n * \n * Copyright (c) 2013-2015 Petka Antonov\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n * \n */\n/**\n * bluebird build version 2.11.0\n * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers\n*/\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_==\"function\"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_==\"function\"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar SomePromiseArray = Promise._SomePromiseArray;\nfunction any(promises) {\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(1);\n    ret.setUnwrap();\n    ret.init();\n    return promise;\n}\n\nPromise.any = function (promises) {\n    return any(promises);\n};\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n};\n\n},{}],2:[function(_dereq_,module,exports){\n\"use strict\";\nvar firstLineError;\ntry {throw new Error(); } catch (e) {firstLineError = e;}\nvar schedule = _dereq_(\"./schedule.js\");\nvar Queue = _dereq_(\"./queue.js\");\nvar util = _dereq_(\"./util.js\");\n\nfunction Async() {\n    this._isTickUsed = false;\n    this._lateQueue = new Queue(16);\n    this._normalQueue = new Queue(16);\n    this._trampolineEnabled = true;\n    var self = this;\n    this.drainQueues = function () {\n        self._drainQueues();\n    };\n    this._schedule =\n        schedule.isStatic ? schedule(this.drainQueues) : schedule;\n}\n\nAsync.prototype.disableTrampolineIfNecessary = function() {\n    if (util.hasDevTools) {\n        this._trampolineEnabled = false;\n    }\n};\n\nAsync.prototype.enableTrampoline = function() {\n    if (!this._trampolineEnabled) {\n        this._trampolineEnabled = true;\n        this._schedule = function(fn) {\n            setTimeout(fn, 0);\n        };\n    }\n};\n\nAsync.prototype.haveItemsQueued = function () {\n    return this._normalQueue.length() > 0;\n};\n\nAsync.prototype.throwLater = function(fn, arg) {\n    if (arguments.length === 1) {\n        arg = fn;\n        fn = function () { throw arg; };\n    }\n    if (typeof setTimeout !== \"undefined\") {\n        setTimeout(function() {\n            fn(arg);\n        }, 0);\n    } else try {\n        this._schedule(function() {\n            fn(arg);\n        });\n    } catch (e) {\n        throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/m3OTXk\\u000a\");\n    }\n};\n\nfunction AsyncInvokeLater(fn, receiver, arg) {\n    this._lateQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncInvoke(fn, receiver, arg) {\n    this._normalQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncSettlePromises(promise) {\n    this._normalQueue._pushOne(promise);\n    this._queueTick();\n}\n\nif (!util.hasDevTools) {\n    Async.prototype.invokeLater = AsyncInvokeLater;\n    Async.prototype.invoke = AsyncInvoke;\n    Async.prototype.settlePromises = AsyncSettlePromises;\n} else {\n    if (schedule.isStatic) {\n        schedule = function(fn) { setTimeout(fn, 0); };\n    }\n    Async.prototype.invokeLater = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvokeLater.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                setTimeout(function() {\n                    fn.call(receiver, arg);\n                }, 100);\n            });\n        }\n    };\n\n    Async.prototype.invoke = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvoke.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                fn.call(receiver, arg);\n            });\n        }\n    };\n\n    Async.prototype.settlePromises = function(promise) {\n        if (this._trampolineEnabled) {\n            AsyncSettlePromises.call(this, promise);\n        } else {\n            this._schedule(function() {\n                promise._settlePromises();\n            });\n        }\n    };\n}\n\nAsync.prototype.invokeFirst = function (fn, receiver, arg) {\n    this._normalQueue.unshift(fn, receiver, arg);\n    this._queueTick();\n};\n\nAsync.prototype._drainQueue = function(queue) {\n    while (queue.length() > 0) {\n        var fn = queue.shift();\n        if (typeof fn !== \"function\") {\n            fn._settlePromises();\n            continue;\n        }\n        var receiver = queue.shift();\n        var arg = queue.shift();\n        fn.call(receiver, arg);\n    }\n};\n\nAsync.prototype._drainQueues = function () {\n    this._drainQueue(this._normalQueue);\n    this._reset();\n    this._drainQueue(this._lateQueue);\n};\n\nAsync.prototype._queueTick = function () {\n    if (!this._isTickUsed) {\n        this._isTickUsed = true;\n        this._schedule(this.drainQueues);\n    }\n};\n\nAsync.prototype._reset = function () {\n    this._isTickUsed = false;\n};\n\nmodule.exports = new Async();\nmodule.exports.firstLineError = firstLineError;\n\n},{\"./queue.js\":28,\"./schedule.js\":31,\"./util.js\":38}],3:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise) {\nvar rejectThis = function(_, e) {\n    this._reject(e);\n};\n\nvar targetRejected = function(e, context) {\n    context.promiseRejectionQueued = true;\n    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n};\n\nvar bindingResolved = function(thisArg, context) {\n    if (this._isPending()) {\n        this._resolveCallback(context.target);\n    }\n};\n\nvar bindingRejected = function(e, context) {\n    if (!context.promiseRejectionQueued) this._reject(e);\n};\n\nPromise.prototype.bind = function (thisArg) {\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n    ret._propagateFrom(this, 1);\n    var target = this._target();\n\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        var context = {\n            promiseRejectionQueued: false,\n            promise: ret,\n            target: target,\n            bindingPromise: maybePromise\n        };\n        target._then(INTERNAL, targetRejected, ret._progress, ret, context);\n        maybePromise._then(\n            bindingResolved, bindingRejected, ret._progress, ret, context);\n    } else {\n        ret._resolveCallback(target);\n    }\n    return ret;\n};\n\nPromise.prototype._setBoundTo = function (obj) {\n    if (obj !== undefined) {\n        this._bitField = this._bitField | 131072;\n        this._boundTo = obj;\n    } else {\n        this._bitField = this._bitField & (~131072);\n    }\n};\n\nPromise.prototype._isBound = function () {\n    return (this._bitField & 131072) === 131072;\n};\n\nPromise.bind = function (thisArg, value) {\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        maybePromise._then(function() {\n            ret._resolveCallback(value);\n        }, ret._reject, ret._progress, ret, null);\n    } else {\n        ret._resolveCallback(value);\n    }\n    return ret;\n};\n};\n\n},{}],4:[function(_dereq_,module,exports){\n\"use strict\";\nvar old;\nif (typeof Promise !== \"undefined\") old = Promise;\nfunction noConflict() {\n    try { if (Promise === bluebird) Promise = old; }\n    catch (e) {}\n    return bluebird;\n}\nvar bluebird = _dereq_(\"./promise.js\")();\nbluebird.noConflict = noConflict;\nmodule.exports = bluebird;\n\n},{\"./promise.js\":23}],5:[function(_dereq_,module,exports){\n\"use strict\";\nvar cr = Object.create;\nif (cr) {\n    var callerCache = cr(null);\n    var getterCache = cr(null);\n    callerCache[\" size\"] = getterCache[\" size\"] = 0;\n}\n\nmodule.exports = function(Promise) {\nvar util = _dereq_(\"./util.js\");\nvar canEvaluate = util.canEvaluate;\nvar isIdentifier = util.isIdentifier;\n\nvar getMethodCaller;\nvar getGetter;\nif (!true) {\nvar makeMethodCaller = function (methodName) {\n    return new Function(\"ensureMethod\", \"                                    \\n\\\n        return function(obj) {                                               \\n\\\n            'use strict'                                                     \\n\\\n            var len = this.length;                                           \\n\\\n            ensureMethod(obj, 'methodName');                                 \\n\\\n            switch(len) {                                                    \\n\\\n                case 1: return obj.methodName(this[0]);                      \\n\\\n                case 2: return obj.methodName(this[0], this[1]);             \\n\\\n                case 3: return obj.methodName(this[0], this[1], this[2]);    \\n\\\n                case 0: return obj.methodName();                             \\n\\\n                default:                                                     \\n\\\n                    return obj.methodName.apply(obj, this);                  \\n\\\n            }                                                                \\n\\\n        };                                                                   \\n\\\n        \".replace(/methodName/g, methodName))(ensureMethod);\n};\n\nvar makeGetter = function (propertyName) {\n    return new Function(\"obj\", \"                                             \\n\\\n        'use strict';                                                        \\n\\\n        return obj.propertyName;                                             \\n\\\n        \".replace(\"propertyName\", propertyName));\n};\n\nvar getCompiled = function(name, compiler, cache) {\n    var ret = cache[name];\n    if (typeof ret !== \"function\") {\n        if (!isIdentifier(name)) {\n            return null;\n        }\n        ret = compiler(name);\n        cache[name] = ret;\n        cache[\" size\"]++;\n        if (cache[\" size\"] > 512) {\n            var keys = Object.keys(cache);\n            for (var i = 0; i < 256; ++i) delete cache[keys[i]];\n            cache[\" size\"] = keys.length - 256;\n        }\n    }\n    return ret;\n};\n\ngetMethodCaller = function(name) {\n    return getCompiled(name, makeMethodCaller, callerCache);\n};\n\ngetGetter = function(name) {\n    return getCompiled(name, makeGetter, getterCache);\n};\n}\n\nfunction ensureMethod(obj, methodName) {\n    var fn;\n    if (obj != null) fn = obj[methodName];\n    if (typeof fn !== \"function\") {\n        var message = \"Object \" + util.classString(obj) + \" has no method '\" +\n            util.toString(methodName) + \"'\";\n        throw new Promise.TypeError(message);\n    }\n    return fn;\n}\n\nfunction caller(obj) {\n    var methodName = this.pop();\n    var fn = ensureMethod(obj, methodName);\n    return fn.apply(obj, this);\n}\nPromise.prototype.call = function (methodName) {\n    var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}\n    if (!true) {\n        if (canEvaluate) {\n            var maybeCaller = getMethodCaller(methodName);\n            if (maybeCaller !== null) {\n                return this._then(\n                    maybeCaller, undefined, undefined, args, undefined);\n            }\n        }\n    }\n    args.push(methodName);\n    return this._then(caller, undefined, undefined, args, undefined);\n};\n\nfunction namedGetter(obj) {\n    return obj[this];\n}\nfunction indexedGetter(obj) {\n    var index = +this;\n    if (index < 0) index = Math.max(0, index + obj.length);\n    return obj[index];\n}\nPromise.prototype.get = function (propertyName) {\n    var isIndex = (typeof propertyName === \"number\");\n    var getter;\n    if (!isIndex) {\n        if (canEvaluate) {\n            var maybeGetter = getGetter(propertyName);\n            getter = maybeGetter !== null ? maybeGetter : namedGetter;\n        } else {\n            getter = namedGetter;\n        }\n    } else {\n        getter = indexedGetter;\n    }\n    return this._then(getter, undefined, undefined, propertyName, undefined);\n};\n};\n\n},{\"./util.js\":38}],6:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar errors = _dereq_(\"./errors.js\");\nvar async = _dereq_(\"./async.js\");\nvar CancellationError = errors.CancellationError;\n\nPromise.prototype._cancel = function (reason) {\n    if (!this.isCancellable()) return this;\n    var parent;\n    var promiseToReject = this;\n    while ((parent = promiseToReject._cancellationParent) !== undefined &&\n        parent.isCancellable()) {\n        promiseToReject = parent;\n    }\n    this._unsetCancellable();\n    promiseToReject._target()._rejectCallback(reason, false, true);\n};\n\nPromise.prototype.cancel = function (reason) {\n    if (!this.isCancellable()) return this;\n    if (reason === undefined) reason = new CancellationError();\n    async.invokeLater(this._cancel, this, reason);\n    return this;\n};\n\nPromise.prototype.cancellable = function () {\n    if (this._cancellable()) return this;\n    async.enableTrampoline();\n    this._setCancellable();\n    this._cancellationParent = undefined;\n    return this;\n};\n\nPromise.prototype.uncancellable = function () {\n    var ret = this.then();\n    ret._unsetCancellable();\n    return ret;\n};\n\nPromise.prototype.fork = function (didFulfill, didReject, didProgress) {\n    var ret = this._then(didFulfill, didReject, didProgress,\n                         undefined, undefined);\n\n    ret._setCancellable();\n    ret._cancellationParent = undefined;\n    return ret;\n};\n};\n\n},{\"./async.js\":2,\"./errors.js\":13}],7:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function() {\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar bluebirdFramePattern =\n    /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](main|debug|zalgo|instrumented)/;\nvar stackFramePattern = null;\nvar formatStack = null;\nvar indentStackFrames = false;\nvar warn;\n\nfunction CapturedTrace(parent) {\n    this._parent = parent;\n    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n    captureStackTrace(this, CapturedTrace);\n    if (length > 32) this.uncycle();\n}\nutil.inherits(CapturedTrace, Error);\n\nCapturedTrace.prototype.uncycle = function() {\n    var length = this._length;\n    if (length < 2) return;\n    var nodes = [];\n    var stackToIndex = {};\n\n    for (var i = 0, node = this; node !== undefined; ++i) {\n        nodes.push(node);\n        node = node._parent;\n    }\n    length = this._length = i;\n    for (var i = length - 1; i >= 0; --i) {\n        var stack = nodes[i].stack;\n        if (stackToIndex[stack] === undefined) {\n            stackToIndex[stack] = i;\n        }\n    }\n    for (var i = 0; i < length; ++i) {\n        var currentStack = nodes[i].stack;\n        var index = stackToIndex[currentStack];\n        if (index !== undefined && index !== i) {\n            if (index > 0) {\n                nodes[index - 1]._parent = undefined;\n                nodes[index - 1]._length = 1;\n            }\n            nodes[i]._parent = undefined;\n            nodes[i]._length = 1;\n            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n            if (index < length - 1) {\n                cycleEdgeNode._parent = nodes[index + 1];\n                cycleEdgeNode._parent.uncycle();\n                cycleEdgeNode._length =\n                    cycleEdgeNode._parent._length + 1;\n            } else {\n                cycleEdgeNode._parent = undefined;\n                cycleEdgeNode._length = 1;\n            }\n            var currentChildLength = cycleEdgeNode._length + 1;\n            for (var j = i - 2; j >= 0; --j) {\n                nodes[j]._length = currentChildLength;\n                currentChildLength++;\n            }\n            return;\n        }\n    }\n};\n\nCapturedTrace.prototype.parent = function() {\n    return this._parent;\n};\n\nCapturedTrace.prototype.hasParent = function() {\n    return this._parent !== undefined;\n};\n\nCapturedTrace.prototype.attachExtraTrace = function(error) {\n    if (error.__stackCleaned__) return;\n    this.uncycle();\n    var parsed = CapturedTrace.parseStackAndMessage(error);\n    var message = parsed.message;\n    var stacks = [parsed.stack];\n\n    var trace = this;\n    while (trace !== undefined) {\n        stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n        trace = trace._parent;\n    }\n    removeCommonRoots(stacks);\n    removeDuplicateOrEmptyJumps(stacks);\n    util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n    util.notEnumerableProp(error, \"__stackCleaned__\", true);\n};\n\nfunction reconstructStack(message, stacks) {\n    for (var i = 0; i < stacks.length - 1; ++i) {\n        stacks[i].push(\"From previous event:\");\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    if (i < stacks.length) {\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    return message + \"\\n\" + stacks.join(\"\\n\");\n}\n\nfunction removeDuplicateOrEmptyJumps(stacks) {\n    for (var i = 0; i < stacks.length; ++i) {\n        if (stacks[i].length === 0 ||\n            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {\n            stacks.splice(i, 1);\n            i--;\n        }\n    }\n}\n\nfunction removeCommonRoots(stacks) {\n    var current = stacks[0];\n    for (var i = 1; i < stacks.length; ++i) {\n        var prev = stacks[i];\n        var currentLastIndex = current.length - 1;\n        var currentLastLine = current[currentLastIndex];\n        var commonRootMeetPoint = -1;\n\n        for (var j = prev.length - 1; j >= 0; --j) {\n            if (prev[j] === currentLastLine) {\n                commonRootMeetPoint = j;\n                break;\n            }\n        }\n\n        for (var j = commonRootMeetPoint; j >= 0; --j) {\n            var line = prev[j];\n            if (current[currentLastIndex] === line) {\n                current.pop();\n                currentLastIndex--;\n            } else {\n                break;\n            }\n        }\n        current = prev;\n    }\n}\n\nfunction cleanStack(stack) {\n    var ret = [];\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        var isTraceLine = stackFramePattern.test(line) ||\n            \"    (No stack trace)\" === line;\n        var isInternalFrame = isTraceLine && shouldIgnore(line);\n        if (isTraceLine && !isInternalFrame) {\n            if (indentStackFrames && line.charAt(0) !== \" \") {\n                line = \"    \" + line;\n            }\n            ret.push(line);\n        }\n    }\n    return ret;\n}\n\nfunction stackFramesAsArray(error) {\n    var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        if (\"    (No stack trace)\" === line || stackFramePattern.test(line)) {\n            break;\n        }\n    }\n    if (i > 0) {\n        stack = stack.slice(i);\n    }\n    return stack;\n}\n\nCapturedTrace.parseStackAndMessage = function(error) {\n    var stack = error.stack;\n    var message = error.toString();\n    stack = typeof stack === \"string\" && stack.length > 0\n                ? stackFramesAsArray(error) : [\"    (No stack trace)\"];\n    return {\n        message: message,\n        stack: cleanStack(stack)\n    };\n};\n\nCapturedTrace.formatAndLogError = function(error, title) {\n    if (typeof console !== \"undefined\") {\n        var message;\n        if (typeof error === \"object\" || typeof error === \"function\") {\n            var stack = error.stack;\n            message = title + formatStack(stack, error);\n        } else {\n            message = title + String(error);\n        }\n        if (typeof warn === \"function\") {\n            warn(message);\n        } else if (typeof console.log === \"function\" ||\n            typeof console.log === \"object\") {\n            console.log(message);\n        }\n    }\n};\n\nCapturedTrace.unhandledRejection = function (reason) {\n    CapturedTrace.formatAndLogError(reason, \"^--- With additional stack trace: \");\n};\n\nCapturedTrace.isSupported = function () {\n    return typeof captureStackTrace === \"function\";\n};\n\nCapturedTrace.fireRejectionEvent =\nfunction(name, localHandler, reason, promise) {\n    var localEventFired = false;\n    try {\n        if (typeof localHandler === \"function\") {\n            localEventFired = true;\n            if (name === \"rejectionHandled\") {\n                localHandler(promise);\n            } else {\n                localHandler(reason, promise);\n            }\n        }\n    } catch (e) {\n        async.throwLater(e);\n    }\n\n    var globalEventFired = false;\n    try {\n        globalEventFired = fireGlobalEvent(name, reason, promise);\n    } catch (e) {\n        globalEventFired = true;\n        async.throwLater(e);\n    }\n\n    var domEventFired = false;\n    if (fireDomEvent) {\n        try {\n            domEventFired = fireDomEvent(name.toLowerCase(), {\n                reason: reason,\n                promise: promise\n            });\n        } catch (e) {\n            domEventFired = true;\n            async.throwLater(e);\n        }\n    }\n\n    if (!globalEventFired && !localEventFired && !domEventFired &&\n        name === \"unhandledRejection\") {\n        CapturedTrace.formatAndLogError(reason, \"Unhandled rejection \");\n    }\n};\n\nfunction formatNonError(obj) {\n    var str;\n    if (typeof obj === \"function\") {\n        str = \"[function \" +\n            (obj.name || \"anonymous\") +\n            \"]\";\n    } else {\n        str = obj.toString();\n        var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n        if (ruselessToString.test(str)) {\n            try {\n                var newStr = JSON.stringify(obj);\n                str = newStr;\n            }\n            catch(e) {\n\n            }\n        }\n        if (str.length === 0) {\n            str = \"(empty array)\";\n        }\n    }\n    return (\"(<\" + snip(str) + \">, no stack trace)\");\n}\n\nfunction snip(str) {\n    var maxChars = 41;\n    if (str.length < maxChars) {\n        return str;\n    }\n    return str.substr(0, maxChars - 3) + \"...\";\n}\n\nvar shouldIgnore = function() { return false; };\nvar parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\nfunction parseLineInfo(line) {\n    var matches = line.match(parseLineInfoRegex);\n    if (matches) {\n        return {\n            fileName: matches[1],\n            line: parseInt(matches[2], 10)\n        };\n    }\n}\nCapturedTrace.setBounds = function(firstLineError, lastLineError) {\n    if (!CapturedTrace.isSupported()) return;\n    var firstStackLines = firstLineError.stack.split(\"\\n\");\n    var lastStackLines = lastLineError.stack.split(\"\\n\");\n    var firstIndex = -1;\n    var lastIndex = -1;\n    var firstFileName;\n    var lastFileName;\n    for (var i = 0; i < firstStackLines.length; ++i) {\n        var result = parseLineInfo(firstStackLines[i]);\n        if (result) {\n            firstFileName = result.fileName;\n            firstIndex = result.line;\n            break;\n        }\n    }\n    for (var i = 0; i < lastStackLines.length; ++i) {\n        var result = parseLineInfo(lastStackLines[i]);\n        if (result) {\n            lastFileName = result.fileName;\n            lastIndex = result.line;\n            break;\n        }\n    }\n    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||\n        firstFileName !== lastFileName || firstIndex >= lastIndex) {\n        return;\n    }\n\n    shouldIgnore = function(line) {\n        if (bluebirdFramePattern.test(line)) return true;\n        var info = parseLineInfo(line);\n        if (info) {\n            if (info.fileName === firstFileName &&\n                (firstIndex <= info.line && info.line <= lastIndex)) {\n                return true;\n            }\n        }\n        return false;\n    };\n};\n\nvar captureStackTrace = (function stackDetection() {\n    var v8stackFramePattern = /^\\s*at\\s*/;\n    var v8stackFormatter = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if (error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    if (typeof Error.stackTraceLimit === \"number\" &&\n        typeof Error.captureStackTrace === \"function\") {\n        Error.stackTraceLimit = Error.stackTraceLimit + 6;\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        var captureStackTrace = Error.captureStackTrace;\n\n        shouldIgnore = function(line) {\n            return bluebirdFramePattern.test(line);\n        };\n        return function(receiver, ignoreUntil) {\n            Error.stackTraceLimit = Error.stackTraceLimit + 6;\n            captureStackTrace(receiver, ignoreUntil);\n            Error.stackTraceLimit = Error.stackTraceLimit - 6;\n        };\n    }\n    var err = new Error();\n\n    if (typeof err.stack === \"string\" &&\n        err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n        stackFramePattern = /@/;\n        formatStack = v8stackFormatter;\n        indentStackFrames = true;\n        return function captureStackTrace(o) {\n            o.stack = new Error().stack;\n        };\n    }\n\n    var hasStackAfterThrow;\n    try { throw new Error(); }\n    catch(e) {\n        hasStackAfterThrow = (\"stack\" in e);\n    }\n    if (!(\"stack\" in err) && hasStackAfterThrow &&\n        typeof Error.stackTraceLimit === \"number\") {\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        return function captureStackTrace(o) {\n            Error.stackTraceLimit = Error.stackTraceLimit + 6;\n            try { throw new Error(); }\n            catch(e) { o.stack = e.stack; }\n            Error.stackTraceLimit = Error.stackTraceLimit - 6;\n        };\n    }\n\n    formatStack = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if ((typeof error === \"object\" ||\n            typeof error === \"function\") &&\n            error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    return null;\n\n})([]);\n\nvar fireDomEvent;\nvar fireGlobalEvent = (function() {\n    if (util.isNode) {\n        return function(name, reason, promise) {\n            if (name === \"rejectionHandled\") {\n                return process.emit(name, promise);\n            } else {\n                return process.emit(name, reason, promise);\n            }\n        };\n    } else {\n        var customEventWorks = false;\n        var anyEventWorks = true;\n        try {\n            var ev = new self.CustomEvent(\"test\");\n            customEventWorks = ev instanceof CustomEvent;\n        } catch (e) {}\n        if (!customEventWorks) {\n            try {\n                var event = document.createEvent(\"CustomEvent\");\n                event.initCustomEvent(\"testingtheevent\", false, true, {});\n                self.dispatchEvent(event);\n            } catch (e) {\n                anyEventWorks = false;\n            }\n        }\n        if (anyEventWorks) {\n            fireDomEvent = function(type, detail) {\n                var event;\n                if (customEventWorks) {\n                    event = new self.CustomEvent(type, {\n                        detail: detail,\n                        bubbles: false,\n                        cancelable: true\n                    });\n                } else if (self.dispatchEvent) {\n                    event = document.createEvent(\"CustomEvent\");\n                    event.initCustomEvent(type, false, true, detail);\n                }\n\n                return event ? !self.dispatchEvent(event) : false;\n            };\n        }\n\n        var toWindowMethodNameMap = {};\n        toWindowMethodNameMap[\"unhandledRejection\"] = (\"on\" +\n            \"unhandledRejection\").toLowerCase();\n        toWindowMethodNameMap[\"rejectionHandled\"] = (\"on\" +\n            \"rejectionHandled\").toLowerCase();\n\n        return function(name, reason, promise) {\n            var methodName = toWindowMethodNameMap[name];\n            var method = self[methodName];\n            if (!method) return false;\n            if (name === \"rejectionHandled\") {\n                method.call(self, promise);\n            } else {\n                method.call(self, reason, promise);\n            }\n            return true;\n        };\n    }\n})();\n\nif (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n    warn = function (message) {\n        console.warn(message);\n    };\n    if (util.isNode && process.stderr.isTTY) {\n        warn = function(message) {\n            process.stderr.write(\"\\u001b[31m\" + message + \"\\u001b[39m\\n\");\n        };\n    } else if (!util.isNode && typeof (new Error().stack) === \"string\") {\n        warn = function(message) {\n            console.warn(\"%c\" + message, \"color: red\");\n        };\n    }\n}\n\nreturn CapturedTrace;\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],8:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(NEXT_FILTER) {\nvar util = _dereq_(\"./util.js\");\nvar errors = _dereq_(\"./errors.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar keys = _dereq_(\"./es5.js\").keys;\nvar TypeError = errors.TypeError;\n\nfunction CatchFilter(instances, callback, promise) {\n    this._instances = instances;\n    this._callback = callback;\n    this._promise = promise;\n}\n\nfunction safePredicate(predicate, e) {\n    var safeObject = {};\n    var retfilter = tryCatch(predicate).call(safeObject, e);\n\n    if (retfilter === errorObj) return retfilter;\n\n    var safeKeys = keys(safeObject);\n    if (safeKeys.length) {\n        errorObj.e = new TypeError(\"Catch filter must inherit from Error or be a simple predicate function\\u000a\\u000a    See http://goo.gl/o84o68\\u000a\");\n        return errorObj;\n    }\n    return retfilter;\n}\n\nCatchFilter.prototype.doFilter = function (e) {\n    var cb = this._callback;\n    var promise = this._promise;\n    var boundTo = promise._boundValue();\n    for (var i = 0, len = this._instances.length; i < len; ++i) {\n        var item = this._instances[i];\n        var itemIsErrorType = item === Error ||\n            (item != null && item.prototype instanceof Error);\n\n        if (itemIsErrorType && e instanceof item) {\n            var ret = tryCatch(cb).call(boundTo, e);\n            if (ret === errorObj) {\n                NEXT_FILTER.e = ret.e;\n                return NEXT_FILTER;\n            }\n            return ret;\n        } else if (typeof item === \"function\" && !itemIsErrorType) {\n            var shouldHandle = safePredicate(item, e);\n            if (shouldHandle === errorObj) {\n                e = errorObj.e;\n                break;\n            } else if (shouldHandle) {\n                var ret = tryCatch(cb).call(boundTo, e);\n                if (ret === errorObj) {\n                    NEXT_FILTER.e = ret.e;\n                    return NEXT_FILTER;\n                }\n                return ret;\n            }\n        }\n    }\n    NEXT_FILTER.e = e;\n    return NEXT_FILTER;\n};\n\nreturn CatchFilter;\n};\n\n},{\"./errors.js\":13,\"./es5.js\":14,\"./util.js\":38}],9:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, CapturedTrace, isDebugging) {\nvar contextStack = [];\nfunction Context() {\n    this._trace = new CapturedTrace(peekContext());\n}\nContext.prototype._pushContext = function () {\n    if (!isDebugging()) return;\n    if (this._trace !== undefined) {\n        contextStack.push(this._trace);\n    }\n};\n\nContext.prototype._popContext = function () {\n    if (!isDebugging()) return;\n    if (this._trace !== undefined) {\n        contextStack.pop();\n    }\n};\n\nfunction createContext() {\n    if (isDebugging()) return new Context();\n}\n\nfunction peekContext() {\n    var lastIndex = contextStack.length - 1;\n    if (lastIndex >= 0) {\n        return contextStack[lastIndex];\n    }\n    return undefined;\n}\n\nPromise.prototype._peekContext = peekContext;\nPromise.prototype._pushContext = Context.prototype._pushContext;\nPromise.prototype._popContext = Context.prototype._popContext;\n\nreturn createContext;\n};\n\n},{}],10:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, CapturedTrace) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar Warning = _dereq_(\"./errors.js\").Warning;\nvar util = _dereq_(\"./util.js\");\nvar canAttachTrace = util.canAttachTrace;\nvar unhandledRejectionHandled;\nvar possiblyUnhandledRejection;\nvar debugging = false || (util.isNode &&\n                    (!!process.env[\"BLUEBIRD_DEBUG\"] ||\n                     process.env[\"NODE_ENV\"] === \"development\"));\n\nif (util.isNode && process.env[\"BLUEBIRD_DEBUG\"] == 0) debugging = false;\n\nif (debugging) {\n    async.disableTrampolineIfNecessary();\n}\n\nPromise.prototype._ignoreRejections = function() {\n    this._unsetRejectionIsUnhandled();\n    this._bitField = this._bitField | 16777216;\n};\n\nPromise.prototype._ensurePossibleRejectionHandled = function () {\n    if ((this._bitField & 16777216) !== 0) return;\n    this._setRejectionIsUnhandled();\n    async.invokeLater(this._notifyUnhandledRejection, this, undefined);\n};\n\nPromise.prototype._notifyUnhandledRejectionIsHandled = function () {\n    CapturedTrace.fireRejectionEvent(\"rejectionHandled\",\n                                  unhandledRejectionHandled, undefined, this);\n};\n\nPromise.prototype._notifyUnhandledRejection = function () {\n    if (this._isRejectionUnhandled()) {\n        var reason = this._getCarriedStackTrace() || this._settledValue;\n        this._setUnhandledRejectionIsNotified();\n        CapturedTrace.fireRejectionEvent(\"unhandledRejection\",\n                                      possiblyUnhandledRejection, reason, this);\n    }\n};\n\nPromise.prototype._setUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField | 524288;\n};\n\nPromise.prototype._unsetUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField & (~524288);\n};\n\nPromise.prototype._isUnhandledRejectionNotified = function () {\n    return (this._bitField & 524288) > 0;\n};\n\nPromise.prototype._setRejectionIsUnhandled = function () {\n    this._bitField = this._bitField | 2097152;\n};\n\nPromise.prototype._unsetRejectionIsUnhandled = function () {\n    this._bitField = this._bitField & (~2097152);\n    if (this._isUnhandledRejectionNotified()) {\n        this._unsetUnhandledRejectionIsNotified();\n        this._notifyUnhandledRejectionIsHandled();\n    }\n};\n\nPromise.prototype._isRejectionUnhandled = function () {\n    return (this._bitField & 2097152) > 0;\n};\n\nPromise.prototype._setCarriedStackTrace = function (capturedTrace) {\n    this._bitField = this._bitField | 1048576;\n    this._fulfillmentHandler0 = capturedTrace;\n};\n\nPromise.prototype._isCarryingStackTrace = function () {\n    return (this._bitField & 1048576) > 0;\n};\n\nPromise.prototype._getCarriedStackTrace = function () {\n    return this._isCarryingStackTrace()\n        ? this._fulfillmentHandler0\n        : undefined;\n};\n\nPromise.prototype._captureStackTrace = function () {\n    if (debugging) {\n        this._trace = new CapturedTrace(this._peekContext());\n    }\n    return this;\n};\n\nPromise.prototype._attachExtraTrace = function (error, ignoreSelf) {\n    if (debugging && canAttachTrace(error)) {\n        var trace = this._trace;\n        if (trace !== undefined) {\n            if (ignoreSelf) trace = trace._parent;\n        }\n        if (trace !== undefined) {\n            trace.attachExtraTrace(error);\n        } else if (!error.__stackCleaned__) {\n            var parsed = CapturedTrace.parseStackAndMessage(error);\n            util.notEnumerableProp(error, \"stack\",\n                parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n            util.notEnumerableProp(error, \"__stackCleaned__\", true);\n        }\n    }\n};\n\nPromise.prototype._warn = function(message) {\n    var warning = new Warning(message);\n    var ctx = this._peekContext();\n    if (ctx) {\n        ctx.attachExtraTrace(warning);\n    } else {\n        var parsed = CapturedTrace.parseStackAndMessage(warning);\n        warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n    }\n    CapturedTrace.formatAndLogError(warning, \"\");\n};\n\nPromise.onPossiblyUnhandledRejection = function (fn) {\n    var domain = getDomain();\n    possiblyUnhandledRejection =\n        typeof fn === \"function\" ? (domain === null ? fn : domain.bind(fn))\n                                 : undefined;\n};\n\nPromise.onUnhandledRejectionHandled = function (fn) {\n    var domain = getDomain();\n    unhandledRejectionHandled =\n        typeof fn === \"function\" ? (domain === null ? fn : domain.bind(fn))\n                                 : undefined;\n};\n\nPromise.longStackTraces = function () {\n    if (async.haveItemsQueued() &&\n        debugging === false\n   ) {\n        throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/DT1qyG\\u000a\");\n    }\n    debugging = CapturedTrace.isSupported();\n    if (debugging) {\n        async.disableTrampolineIfNecessary();\n    }\n};\n\nPromise.hasLongStackTraces = function () {\n    return debugging && CapturedTrace.isSupported();\n};\n\nif (!CapturedTrace.isSupported()) {\n    Promise.longStackTraces = function(){};\n    debugging = false;\n}\n\nreturn function() {\n    return debugging;\n};\n};\n\n},{\"./async.js\":2,\"./errors.js\":13,\"./util.js\":38}],11:[function(_dereq_,module,exports){\n\"use strict\";\nvar util = _dereq_(\"./util.js\");\nvar isPrimitive = util.isPrimitive;\n\nmodule.exports = function(Promise) {\nvar returner = function () {\n    return this;\n};\nvar thrower = function () {\n    throw this;\n};\nvar returnUndefined = function() {};\nvar throwUndefined = function() {\n    throw undefined;\n};\n\nvar wrapper = function (value, action) {\n    if (action === 1) {\n        return function () {\n            throw value;\n        };\n    } else if (action === 2) {\n        return function () {\n            return value;\n        };\n    }\n};\n\n\nPromise.prototype[\"return\"] =\nPromise.prototype.thenReturn = function (value) {\n    if (value === undefined) return this.then(returnUndefined);\n\n    if (isPrimitive(value)) {\n        return this._then(\n            wrapper(value, 2),\n            undefined,\n            undefined,\n            undefined,\n            undefined\n       );\n    } else if (value instanceof Promise) {\n        value._ignoreRejections();\n    }\n    return this._then(returner, undefined, undefined, value, undefined);\n};\n\nPromise.prototype[\"throw\"] =\nPromise.prototype.thenThrow = function (reason) {\n    if (reason === undefined) return this.then(throwUndefined);\n\n    if (isPrimitive(reason)) {\n        return this._then(\n            wrapper(reason, 1),\n            undefined,\n            undefined,\n            undefined,\n            undefined\n       );\n    }\n    return this._then(thrower, undefined, undefined, reason, undefined);\n};\n};\n\n},{\"./util.js\":38}],12:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseReduce = Promise.reduce;\n\nPromise.prototype.each = function (fn) {\n    return PromiseReduce(this, fn, null, INTERNAL);\n};\n\nPromise.each = function (promises, fn) {\n    return PromiseReduce(promises, fn, null, INTERNAL);\n};\n};\n\n},{}],13:[function(_dereq_,module,exports){\n\"use strict\";\nvar es5 = _dereq_(\"./es5.js\");\nvar Objectfreeze = es5.freeze;\nvar util = _dereq_(\"./util.js\");\nvar inherits = util.inherits;\nvar notEnumerableProp = util.notEnumerableProp;\n\nfunction subError(nameProperty, defaultMessage) {\n    function SubError(message) {\n        if (!(this instanceof SubError)) return new SubError(message);\n        notEnumerableProp(this, \"message\",\n            typeof message === \"string\" ? message : defaultMessage);\n        notEnumerableProp(this, \"name\", nameProperty);\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            Error.call(this);\n        }\n    }\n    inherits(SubError, Error);\n    return SubError;\n}\n\nvar _TypeError, _RangeError;\nvar Warning = subError(\"Warning\", \"warning\");\nvar CancellationError = subError(\"CancellationError\", \"cancellation error\");\nvar TimeoutError = subError(\"TimeoutError\", \"timeout error\");\nvar AggregateError = subError(\"AggregateError\", \"aggregate error\");\ntry {\n    _TypeError = TypeError;\n    _RangeError = RangeError;\n} catch(e) {\n    _TypeError = subError(\"TypeError\", \"type error\");\n    _RangeError = subError(\"RangeError\", \"range error\");\n}\n\nvar methods = (\"join pop push shift unshift slice filter forEach some \" +\n    \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\nfor (var i = 0; i < methods.length; ++i) {\n    if (typeof Array.prototype[methods[i]] === \"function\") {\n        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n    }\n}\n\nes5.defineProperty(AggregateError.prototype, \"length\", {\n    value: 0,\n    configurable: false,\n    writable: true,\n    enumerable: true\n});\nAggregateError.prototype[\"isOperational\"] = true;\nvar level = 0;\nAggregateError.prototype.toString = function() {\n    var indent = Array(level * 4 + 1).join(\" \");\n    var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n    level++;\n    indent = Array(level * 4 + 1).join(\" \");\n    for (var i = 0; i < this.length; ++i) {\n        var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n        var lines = str.split(\"\\n\");\n        for (var j = 0; j < lines.length; ++j) {\n            lines[j] = indent + lines[j];\n        }\n        str = lines.join(\"\\n\");\n        ret += str + \"\\n\";\n    }\n    level--;\n    return ret;\n};\n\nfunction OperationalError(message) {\n    if (!(this instanceof OperationalError))\n        return new OperationalError(message);\n    notEnumerableProp(this, \"name\", \"OperationalError\");\n    notEnumerableProp(this, \"message\", message);\n    this.cause = message;\n    this[\"isOperational\"] = true;\n\n    if (message instanceof Error) {\n        notEnumerableProp(this, \"message\", message.message);\n        notEnumerableProp(this, \"stack\", message.stack);\n    } else if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor);\n    }\n\n}\ninherits(OperationalError, Error);\n\nvar errorTypes = Error[\"__BluebirdErrorTypes__\"];\nif (!errorTypes) {\n    errorTypes = Objectfreeze({\n        CancellationError: CancellationError,\n        TimeoutError: TimeoutError,\n        OperationalError: OperationalError,\n        RejectionError: OperationalError,\n        AggregateError: AggregateError\n    });\n    notEnumerableProp(Error, \"__BluebirdErrorTypes__\", errorTypes);\n}\n\nmodule.exports = {\n    Error: Error,\n    TypeError: _TypeError,\n    RangeError: _RangeError,\n    CancellationError: errorTypes.CancellationError,\n    OperationalError: errorTypes.OperationalError,\n    TimeoutError: errorTypes.TimeoutError,\n    AggregateError: errorTypes.AggregateError,\n    Warning: Warning\n};\n\n},{\"./es5.js\":14,\"./util.js\":38}],14:[function(_dereq_,module,exports){\nvar isES5 = (function(){\n    \"use strict\";\n    return this === undefined;\n})();\n\nif (isES5) {\n    module.exports = {\n        freeze: Object.freeze,\n        defineProperty: Object.defineProperty,\n        getDescriptor: Object.getOwnPropertyDescriptor,\n        keys: Object.keys,\n        names: Object.getOwnPropertyNames,\n        getPrototypeOf: Object.getPrototypeOf,\n        isArray: Array.isArray,\n        isES5: isES5,\n        propertyIsWritable: function(obj, prop) {\n            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n            return !!(!descriptor || descriptor.writable || descriptor.set);\n        }\n    };\n} else {\n    var has = {}.hasOwnProperty;\n    var str = {}.toString;\n    var proto = {}.constructor.prototype;\n\n    var ObjectKeys = function (o) {\n        var ret = [];\n        for (var key in o) {\n            if (has.call(o, key)) {\n                ret.push(key);\n            }\n        }\n        return ret;\n    };\n\n    var ObjectGetDescriptor = function(o, key) {\n        return {value: o[key]};\n    };\n\n    var ObjectDefineProperty = function (o, key, desc) {\n        o[key] = desc.value;\n        return o;\n    };\n\n    var ObjectFreeze = function (obj) {\n        return obj;\n    };\n\n    var ObjectGetPrototypeOf = function (obj) {\n        try {\n            return Object(obj).constructor.prototype;\n        }\n        catch (e) {\n            return proto;\n        }\n    };\n\n    var ArrayIsArray = function (obj) {\n        try {\n            return str.call(obj) === \"[object Array]\";\n        }\n        catch(e) {\n            return false;\n        }\n    };\n\n    module.exports = {\n        isArray: ArrayIsArray,\n        keys: ObjectKeys,\n        names: ObjectKeys,\n        defineProperty: ObjectDefineProperty,\n        getDescriptor: ObjectGetDescriptor,\n        freeze: ObjectFreeze,\n        getPrototypeOf: ObjectGetPrototypeOf,\n        isES5: isES5,\n        propertyIsWritable: function() {\n            return true;\n        }\n    };\n}\n\n},{}],15:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseMap = Promise.map;\n\nPromise.prototype.filter = function (fn, options) {\n    return PromiseMap(this, fn, options, INTERNAL);\n};\n\nPromise.filter = function (promises, fn, options) {\n    return PromiseMap(promises, fn, options, INTERNAL);\n};\n};\n\n},{}],16:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {\nvar util = _dereq_(\"./util.js\");\nvar isPrimitive = util.isPrimitive;\nvar thrower = util.thrower;\n\nfunction returnThis() {\n    return this;\n}\nfunction throwThis() {\n    throw this;\n}\nfunction return$(r) {\n    return function() {\n        return r;\n    };\n}\nfunction throw$(r) {\n    return function() {\n        throw r;\n    };\n}\nfunction promisedFinally(ret, reasonOrValue, isFulfilled) {\n    var then;\n    if (isPrimitive(reasonOrValue)) {\n        then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);\n    } else {\n        then = isFulfilled ? returnThis : throwThis;\n    }\n    return ret._then(then, thrower, undefined, reasonOrValue, undefined);\n}\n\nfunction finallyHandler(reasonOrValue) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    var ret = promise._isBound()\n                    ? handler.call(promise._boundValue())\n                    : handler();\n\n    if (ret !== undefined) {\n        var maybePromise = tryConvertToPromise(ret, promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            return promisedFinally(maybePromise, reasonOrValue,\n                                    promise.isFulfilled());\n        }\n    }\n\n    if (promise.isRejected()) {\n        NEXT_FILTER.e = reasonOrValue;\n        return NEXT_FILTER;\n    } else {\n        return reasonOrValue;\n    }\n}\n\nfunction tapHandler(value) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    var ret = promise._isBound()\n                    ? handler.call(promise._boundValue(), value)\n                    : handler(value);\n\n    if (ret !== undefined) {\n        var maybePromise = tryConvertToPromise(ret, promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            return promisedFinally(maybePromise, value, true);\n        }\n    }\n    return value;\n}\n\nPromise.prototype._passThroughHandler = function (handler, isFinally) {\n    if (typeof handler !== \"function\") return this.then();\n\n    var promiseAndHandler = {\n        promise: this,\n        handler: handler\n    };\n\n    return this._then(\n            isFinally ? finallyHandler : tapHandler,\n            isFinally ? finallyHandler : undefined, undefined,\n            promiseAndHandler, undefined);\n};\n\nPromise.prototype.lastly =\nPromise.prototype[\"finally\"] = function (handler) {\n    return this._passThroughHandler(handler, true);\n};\n\nPromise.prototype.tap = function (handler) {\n    return this._passThroughHandler(handler, false);\n};\n};\n\n},{\"./util.js\":38}],17:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          apiRejection,\n                          INTERNAL,\n                          tryConvertToPromise) {\nvar errors = _dereq_(\"./errors.js\");\nvar TypeError = errors.TypeError;\nvar util = _dereq_(\"./util.js\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nvar yieldHandlers = [];\n\nfunction promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n    for (var i = 0; i < yieldHandlers.length; ++i) {\n        traceParent._pushContext();\n        var result = tryCatch(yieldHandlers[i])(value);\n        traceParent._popContext();\n        if (result === errorObj) {\n            traceParent._pushContext();\n            var ret = Promise.reject(errorObj.e);\n            traceParent._popContext();\n            return ret;\n        }\n        var maybePromise = tryConvertToPromise(result, traceParent);\n        if (maybePromise instanceof Promise) return maybePromise;\n    }\n    return null;\n}\n\nfunction PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n    var promise = this._promise = new Promise(INTERNAL);\n    promise._captureStackTrace();\n    this._stack = stack;\n    this._generatorFunction = generatorFunction;\n    this._receiver = receiver;\n    this._generator = undefined;\n    this._yieldHandlers = typeof yieldHandler === \"function\"\n        ? [yieldHandler].concat(yieldHandlers)\n        : yieldHandlers;\n}\n\nPromiseSpawn.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseSpawn.prototype._run = function () {\n    this._generator = this._generatorFunction.call(this._receiver);\n    this._receiver =\n        this._generatorFunction = undefined;\n    this._next(undefined);\n};\n\nPromiseSpawn.prototype._continue = function (result) {\n    if (result === errorObj) {\n        return this._promise._rejectCallback(result.e, false, true);\n    }\n\n    var value = result.value;\n    if (result.done === true) {\n        this._promise._resolveCallback(value);\n    } else {\n        var maybePromise = tryConvertToPromise(value, this._promise);\n        if (!(maybePromise instanceof Promise)) {\n            maybePromise =\n                promiseFromYieldHandler(maybePromise,\n                                        this._yieldHandlers,\n                                        this._promise);\n            if (maybePromise === null) {\n                this._throw(\n                    new TypeError(\n                        \"A value %s was yielded that could not be treated as a promise\\u000a\\u000a    See http://goo.gl/4Y4pDk\\u000a\\u000a\".replace(\"%s\", value) +\n                        \"From coroutine:\\u000a\" +\n                        this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")\n                    )\n                );\n                return;\n            }\n        }\n        maybePromise._then(\n            this._next,\n            this._throw,\n            undefined,\n            this,\n            null\n       );\n    }\n};\n\nPromiseSpawn.prototype._throw = function (reason) {\n    this._promise._attachExtraTrace(reason);\n    this._promise._pushContext();\n    var result = tryCatch(this._generator[\"throw\"])\n        .call(this._generator, reason);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._next = function (value) {\n    this._promise._pushContext();\n    var result = tryCatch(this._generator.next).call(this._generator, value);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromise.coroutine = function (generatorFunction, options) {\n    if (typeof generatorFunction !== \"function\") {\n        throw new TypeError(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/6Vqhm0\\u000a\");\n    }\n    var yieldHandler = Object(options).yieldHandler;\n    var PromiseSpawn$ = PromiseSpawn;\n    var stack = new Error().stack;\n    return function () {\n        var generator = generatorFunction.apply(this, arguments);\n        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,\n                                      stack);\n        spawn._generator = generator;\n        spawn._next(undefined);\n        return spawn.promise();\n    };\n};\n\nPromise.coroutine.addYieldHandler = function(fn) {\n    if (typeof fn !== \"function\") throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    yieldHandlers.push(fn);\n};\n\nPromise.spawn = function (generatorFunction) {\n    if (typeof generatorFunction !== \"function\") {\n        return apiRejection(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/6Vqhm0\\u000a\");\n    }\n    var spawn = new PromiseSpawn(generatorFunction, this);\n    var ret = spawn.promise();\n    spawn._run(Promise.spawn);\n    return ret;\n};\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],18:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar canEvaluate = util.canEvaluate;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar reject;\n\nif (!true) {\nif (canEvaluate) {\n    var thenCallback = function(i) {\n        return new Function(\"value\", \"holder\", \"                             \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = value;                                           \\n\\\n            holder.checkFulfillment(this);                                   \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var caller = function(count) {\n        var values = [];\n        for (var i = 1; i <= count; ++i) values.push(\"holder.p\" + i);\n        return new Function(\"holder\", \"                                      \\n\\\n            'use strict';                                                    \\n\\\n            var callback = holder.fn;                                        \\n\\\n            return callback(values);                                         \\n\\\n            \".replace(/values/g, values.join(\", \")));\n    };\n    var thenCallbacks = [];\n    var callers = [undefined];\n    for (var i = 1; i <= 5; ++i) {\n        thenCallbacks.push(thenCallback(i));\n        callers.push(caller(i));\n    }\n\n    var Holder = function(total, fn) {\n        this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;\n        this.fn = fn;\n        this.total = total;\n        this.now = 0;\n    };\n\n    Holder.prototype.callers = callers;\n    Holder.prototype.checkFulfillment = function(promise) {\n        var now = this.now;\n        now++;\n        var total = this.total;\n        if (now >= total) {\n            var handler = this.callers[total];\n            promise._pushContext();\n            var ret = tryCatch(handler)(this);\n            promise._popContext();\n            if (ret === errorObj) {\n                promise._rejectCallback(ret.e, false, true);\n            } else {\n                promise._resolveCallback(ret);\n            }\n        } else {\n            this.now = now;\n        }\n    };\n\n    var reject = function (reason) {\n        this._reject(reason);\n    };\n}\n}\n\nPromise.join = function () {\n    var last = arguments.length - 1;\n    var fn;\n    if (last > 0 && typeof arguments[last] === \"function\") {\n        fn = arguments[last];\n        if (!true) {\n            if (last < 6 && canEvaluate) {\n                var ret = new Promise(INTERNAL);\n                ret._captureStackTrace();\n                var holder = new Holder(last, fn);\n                var callbacks = thenCallbacks;\n                for (var i = 0; i < last; ++i) {\n                    var maybePromise = tryConvertToPromise(arguments[i], ret);\n                    if (maybePromise instanceof Promise) {\n                        maybePromise = maybePromise._target();\n                        if (maybePromise._isPending()) {\n                            maybePromise._then(callbacks[i], reject,\n                                               undefined, ret, holder);\n                        } else if (maybePromise._isFulfilled()) {\n                            callbacks[i].call(ret,\n                                              maybePromise._value(), holder);\n                        } else {\n                            ret._reject(maybePromise._reason());\n                        }\n                    } else {\n                        callbacks[i].call(ret, maybePromise, holder);\n                    }\n                }\n                return ret;\n            }\n        }\n    }\n    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}\n    if (fn) args.pop();\n    var ret = new PromiseArray(args).promise();\n    return fn !== undefined ? ret.spread(fn) : ret;\n};\n\n};\n\n},{\"./util.js\":38}],19:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar PENDING = {};\nvar EMPTY_ARRAY = [];\n\nfunction MappingPromiseArray(promises, fn, limit, _filter) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    var domain = getDomain();\n    this._callback = domain === null ? fn : domain.bind(fn);\n    this._preservedValues = _filter === INTERNAL\n        ? new Array(this.length())\n        : null;\n    this._limit = limit;\n    this._inFlight = 0;\n    this._queue = limit >= 1 ? [] : EMPTY_ARRAY;\n    async.invoke(init, this, undefined);\n}\nutil.inherits(MappingPromiseArray, PromiseArray);\nfunction init() {this._init$(undefined, -2);}\n\nMappingPromiseArray.prototype._init = function () {};\n\nMappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var limit = this._limit;\n    if (values[index] === PENDING) {\n        values[index] = value;\n        if (limit >= 1) {\n            this._inFlight--;\n            this._drainQueue();\n            if (this._isResolved()) return;\n        }\n    } else {\n        if (limit >= 1 && this._inFlight >= limit) {\n            values[index] = value;\n            this._queue.push(index);\n            return;\n        }\n        if (preservedValues !== null) preservedValues[index] = value;\n\n        var callback = this._callback;\n        var receiver = this._promise._boundValue();\n        this._promise._pushContext();\n        var ret = tryCatch(callback).call(receiver, value, index, length);\n        this._promise._popContext();\n        if (ret === errorObj) return this._reject(ret.e);\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (maybePromise._isPending()) {\n                if (limit >= 1) this._inFlight++;\n                values[index] = PENDING;\n                return maybePromise._proxyPromiseArray(this, index);\n            } else if (maybePromise._isFulfilled()) {\n                ret = maybePromise._value();\n            } else {\n                return this._reject(maybePromise._reason());\n            }\n        }\n        values[index] = ret;\n    }\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= length) {\n        if (preservedValues !== null) {\n            this._filter(values, preservedValues);\n        } else {\n            this._resolve(values);\n        }\n\n    }\n};\n\nMappingPromiseArray.prototype._drainQueue = function () {\n    var queue = this._queue;\n    var limit = this._limit;\n    var values = this._values;\n    while (queue.length > 0 && this._inFlight < limit) {\n        if (this._isResolved()) return;\n        var index = queue.pop();\n        this._promiseFulfilled(values[index], index);\n    }\n};\n\nMappingPromiseArray.prototype._filter = function (booleans, values) {\n    var len = values.length;\n    var ret = new Array(len);\n    var j = 0;\n    for (var i = 0; i < len; ++i) {\n        if (booleans[i]) ret[j++] = values[i];\n    }\n    ret.length = j;\n    this._resolve(ret);\n};\n\nMappingPromiseArray.prototype.preservedValues = function () {\n    return this._preservedValues;\n};\n\nfunction map(promises, fn, options, _filter) {\n    var limit = typeof options === \"object\" && options !== null\n        ? options.concurrency\n        : 0;\n    limit = typeof limit === \"number\" &&\n        isFinite(limit) && limit >= 1 ? limit : 0;\n    return new MappingPromiseArray(promises, fn, limit, _filter);\n}\n\nPromise.prototype.map = function (fn, options) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n\n    return map(this, fn, options, null).promise();\n};\n\nPromise.map = function (promises, fn, options, _filter) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    return map(promises, fn, options, _filter).promise();\n};\n\n\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],20:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\n\nPromise.method = function (fn) {\n    if (typeof fn !== \"function\") {\n        throw new Promise.TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    return function () {\n        var ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._pushContext();\n        var value = tryCatch(fn).apply(this, arguments);\n        ret._popContext();\n        ret._resolveFromSyncValue(value);\n        return ret;\n    };\n};\n\nPromise.attempt = Promise[\"try\"] = function (fn, args, ctx) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._pushContext();\n    var value = util.isArray(args)\n        ? tryCatch(fn).apply(ctx, args)\n        : tryCatch(fn).call(ctx, args);\n    ret._popContext();\n    ret._resolveFromSyncValue(value);\n    return ret;\n};\n\nPromise.prototype._resolveFromSyncValue = function (value) {\n    if (value === util.errorObj) {\n        this._rejectCallback(value.e, false, true);\n    } else {\n        this._resolveCallback(value, true);\n    }\n};\n};\n\n},{\"./util.js\":38}],21:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar util = _dereq_(\"./util.js\");\nvar async = _dereq_(\"./async.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction spreadAdapter(val, nodeback) {\n    var promise = this;\n    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n    var ret =\n        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nfunction successAdapter(val, nodeback) {\n    var promise = this;\n    var receiver = promise._boundValue();\n    var ret = val === undefined\n        ? tryCatch(nodeback).call(receiver, null)\n        : tryCatch(nodeback).call(receiver, null, val);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\nfunction errorAdapter(reason, nodeback) {\n    var promise = this;\n    if (!reason) {\n        var target = promise._target();\n        var newReason = target._getCarriedStackTrace();\n        newReason.cause = reason;\n        reason = newReason;\n    }\n    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nPromise.prototype.asCallback =\nPromise.prototype.nodeify = function (nodeback, options) {\n    if (typeof nodeback == \"function\") {\n        var adapter = successAdapter;\n        if (options !== undefined && Object(options).spread) {\n            adapter = spreadAdapter;\n        }\n        this._then(\n            adapter,\n            errorAdapter,\n            undefined,\n            this,\n            nodeback\n        );\n    }\n    return this;\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],22:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, PromiseArray) {\nvar util = _dereq_(\"./util.js\");\nvar async = _dereq_(\"./async.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nPromise.prototype.progressed = function (handler) {\n    return this._then(undefined, undefined, handler, undefined, undefined);\n};\n\nPromise.prototype._progress = function (progressValue) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._target()._progressUnchecked(progressValue);\n\n};\n\nPromise.prototype._progressHandlerAt = function (index) {\n    return index === 0\n        ? this._progressHandler0\n        : this[(index << 2) + index - 5 + 2];\n};\n\nPromise.prototype._doProgressWith = function (progression) {\n    var progressValue = progression.value;\n    var handler = progression.handler;\n    var promise = progression.promise;\n    var receiver = progression.receiver;\n\n    var ret = tryCatch(handler).call(receiver, progressValue);\n    if (ret === errorObj) {\n        if (ret.e != null &&\n            ret.e.name !== \"StopProgressPropagation\") {\n            var trace = util.canAttachTrace(ret.e)\n                ? ret.e : new Error(util.toString(ret.e));\n            promise._attachExtraTrace(trace);\n            promise._progress(ret.e);\n        }\n    } else if (ret instanceof Promise) {\n        ret._then(promise._progress, null, null, promise, undefined);\n    } else {\n        promise._progress(ret);\n    }\n};\n\n\nPromise.prototype._progressUnchecked = function (progressValue) {\n    var len = this._length();\n    var progress = this._progress;\n    for (var i = 0; i < len; i++) {\n        var handler = this._progressHandlerAt(i);\n        var promise = this._promiseAt(i);\n        if (!(promise instanceof Promise)) {\n            var receiver = this._receiverAt(i);\n            if (typeof handler === \"function\") {\n                handler.call(receiver, progressValue, promise);\n            } else if (receiver instanceof PromiseArray &&\n                       !receiver._isResolved()) {\n                receiver._promiseProgressed(progressValue, promise);\n            }\n            continue;\n        }\n\n        if (typeof handler === \"function\") {\n            async.invoke(this._doProgressWith, this, {\n                handler: handler,\n                promise: promise,\n                receiver: this._receiverAt(i),\n                value: progressValue\n            });\n        } else {\n            async.invoke(progress, promise, progressValue);\n        }\n    }\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],23:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function() {\nvar makeSelfResolutionError = function () {\n    return new TypeError(\"circular promise resolution chain\\u000a\\u000a    See http://goo.gl/LhFpo0\\u000a\");\n};\nvar reflect = function() {\n    return new Promise.PromiseInspection(this._target());\n};\nvar apiRejection = function(msg) {\n    return Promise.reject(new TypeError(msg));\n};\n\nvar util = _dereq_(\"./util.js\");\n\nvar getDomain;\nif (util.isNode) {\n    getDomain = function() {\n        var ret = process.domain;\n        if (ret === undefined) ret = null;\n        return ret;\n    };\n} else {\n    getDomain = function() {\n        return null;\n    };\n}\nutil.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\nvar UNDEFINED_BINDING = {};\nvar async = _dereq_(\"./async.js\");\nvar errors = _dereq_(\"./errors.js\");\nvar TypeError = Promise.TypeError = errors.TypeError;\nPromise.RangeError = errors.RangeError;\nPromise.CancellationError = errors.CancellationError;\nPromise.TimeoutError = errors.TimeoutError;\nPromise.OperationalError = errors.OperationalError;\nPromise.RejectionError = errors.OperationalError;\nPromise.AggregateError = errors.AggregateError;\nvar INTERNAL = function(){};\nvar APPLY = {};\nvar NEXT_FILTER = {e: null};\nvar tryConvertToPromise = _dereq_(\"./thenables.js\")(Promise, INTERNAL);\nvar PromiseArray =\n    _dereq_(\"./promise_array.js\")(Promise, INTERNAL,\n                                    tryConvertToPromise, apiRejection);\nvar CapturedTrace = _dereq_(\"./captured_trace.js\")();\nvar isDebugging = _dereq_(\"./debuggability.js\")(Promise, CapturedTrace);\n /*jshint unused:false*/\nvar createContext =\n    _dereq_(\"./context.js\")(Promise, CapturedTrace, isDebugging);\nvar CatchFilter = _dereq_(\"./catch_filter.js\")(NEXT_FILTER);\nvar PromiseResolver = _dereq_(\"./promise_resolver.js\");\nvar nodebackForPromise = PromiseResolver._nodebackForPromise;\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\n\nfunction Promise(resolver) {\n    if (typeof resolver !== \"function\") {\n        throw new TypeError(\"the promise constructor requires a resolver function\\u000a\\u000a    See http://goo.gl/EC22Yn\\u000a\");\n    }\n    if (this.constructor !== Promise) {\n        throw new TypeError(\"the promise constructor cannot be invoked directly\\u000a\\u000a    See http://goo.gl/KsIlge\\u000a\");\n    }\n    this._bitField = 0;\n    this._fulfillmentHandler0 = undefined;\n    this._rejectionHandler0 = undefined;\n    this._progressHandler0 = undefined;\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    this._settledValue = undefined;\n    if (resolver !== INTERNAL) this._resolveFromResolver(resolver);\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n    var len = arguments.length;\n    if (len > 1) {\n        var catchInstances = new Array(len - 1),\n            j = 0, i;\n        for (i = 0; i < len - 1; ++i) {\n            var item = arguments[i];\n            if (typeof item === \"function\") {\n                catchInstances[j++] = item;\n            } else {\n                return Promise.reject(\n                    new TypeError(\"Catch filter must inherit from Error or be a simple predicate function\\u000a\\u000a    See http://goo.gl/o84o68\\u000a\"));\n            }\n        }\n        catchInstances.length = j;\n        fn = arguments[i];\n        var catchFilter = new CatchFilter(catchInstances, fn, this);\n        return this._then(undefined, catchFilter.doFilter, undefined,\n            catchFilter, undefined);\n    }\n    return this._then(undefined, fn, undefined, undefined, undefined);\n};\n\nPromise.prototype.reflect = function () {\n    return this._then(reflect, reflect, undefined, this, undefined);\n};\n\nPromise.prototype.then = function (didFulfill, didReject, didProgress) {\n    if (isDebugging() && arguments.length > 0 &&\n        typeof didFulfill !== \"function\" &&\n        typeof didReject !== \"function\") {\n        var msg = \".then() only accepts functions but was passed: \" +\n                util.classString(didFulfill);\n        if (arguments.length > 1) {\n            msg += \", \" + util.classString(didReject);\n        }\n        this._warn(msg);\n    }\n    return this._then(didFulfill, didReject, didProgress,\n        undefined, undefined);\n};\n\nPromise.prototype.done = function (didFulfill, didReject, didProgress) {\n    var promise = this._then(didFulfill, didReject, didProgress,\n        undefined, undefined);\n    promise._setIsFinal();\n};\n\nPromise.prototype.spread = function (didFulfill, didReject) {\n    return this.all()._then(didFulfill, didReject, undefined, APPLY, undefined);\n};\n\nPromise.prototype.isCancellable = function () {\n    return !this.isResolved() &&\n        this._cancellable();\n};\n\nPromise.prototype.toJSON = function () {\n    var ret = {\n        isFulfilled: false,\n        isRejected: false,\n        fulfillmentValue: undefined,\n        rejectionReason: undefined\n    };\n    if (this.isFulfilled()) {\n        ret.fulfillmentValue = this.value();\n        ret.isFulfilled = true;\n    } else if (this.isRejected()) {\n        ret.rejectionReason = this.reason();\n        ret.isRejected = true;\n    }\n    return ret;\n};\n\nPromise.prototype.all = function () {\n    return new PromiseArray(this).promise();\n};\n\nPromise.prototype.error = function (fn) {\n    return this.caught(util.originatesFromRejection, fn);\n};\n\nPromise.getNewLibraryCopy = module.exports;\n\nPromise.is = function (val) {\n    return val instanceof Promise;\n};\n\nPromise.fromNode = function(fn) {\n    var ret = new Promise(INTERNAL);\n    var result = tryCatch(fn)(nodebackForPromise(ret));\n    if (result === errorObj) {\n        ret._rejectCallback(result.e, true, true);\n    }\n    return ret;\n};\n\nPromise.all = function (promises) {\n    return new PromiseArray(promises).promise();\n};\n\nPromise.defer = Promise.pending = function () {\n    var promise = new Promise(INTERNAL);\n    return new PromiseResolver(promise);\n};\n\nPromise.cast = function (obj) {\n    var ret = tryConvertToPromise(obj);\n    if (!(ret instanceof Promise)) {\n        var val = ret;\n        ret = new Promise(INTERNAL);\n        ret._fulfillUnchecked(val);\n    }\n    return ret;\n};\n\nPromise.resolve = Promise.fulfilled = Promise.cast;\n\nPromise.reject = Promise.rejected = function (reason) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._rejectCallback(reason, true);\n    return ret;\n};\n\nPromise.setScheduler = function(fn) {\n    if (typeof fn !== \"function\") throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    var prev = async._schedule;\n    async._schedule = fn;\n    return prev;\n};\n\nPromise.prototype._then = function (\n    didFulfill,\n    didReject,\n    didProgress,\n    receiver,\n    internalData\n) {\n    var haveInternalData = internalData !== undefined;\n    var ret = haveInternalData ? internalData : new Promise(INTERNAL);\n\n    if (!haveInternalData) {\n        ret._propagateFrom(this, 4 | 1);\n        ret._captureStackTrace();\n    }\n\n    var target = this._target();\n    if (target !== this) {\n        if (receiver === undefined) receiver = this._boundTo;\n        if (!haveInternalData) ret._setIsMigrated();\n    }\n\n    var callbackIndex = target._addCallbacks(didFulfill,\n                                             didReject,\n                                             didProgress,\n                                             ret,\n                                             receiver,\n                                             getDomain());\n\n    if (target._isResolved() && !target._isSettlePromisesQueued()) {\n        async.invoke(\n            target._settlePromiseAtPostResolution, target, callbackIndex);\n    }\n\n    return ret;\n};\n\nPromise.prototype._settlePromiseAtPostResolution = function (index) {\n    if (this._isRejectionUnhandled()) this._unsetRejectionIsUnhandled();\n    this._settlePromiseAt(index);\n};\n\nPromise.prototype._length = function () {\n    return this._bitField & 131071;\n};\n\nPromise.prototype._isFollowingOrFulfilledOrRejected = function () {\n    return (this._bitField & 939524096) > 0;\n};\n\nPromise.prototype._isFollowing = function () {\n    return (this._bitField & 536870912) === 536870912;\n};\n\nPromise.prototype._setLength = function (len) {\n    this._bitField = (this._bitField & -131072) |\n        (len & 131071);\n};\n\nPromise.prototype._setFulfilled = function () {\n    this._bitField = this._bitField | 268435456;\n};\n\nPromise.prototype._setRejected = function () {\n    this._bitField = this._bitField | 134217728;\n};\n\nPromise.prototype._setFollowing = function () {\n    this._bitField = this._bitField | 536870912;\n};\n\nPromise.prototype._setIsFinal = function () {\n    this._bitField = this._bitField | 33554432;\n};\n\nPromise.prototype._isFinal = function () {\n    return (this._bitField & 33554432) > 0;\n};\n\nPromise.prototype._cancellable = function () {\n    return (this._bitField & 67108864) > 0;\n};\n\nPromise.prototype._setCancellable = function () {\n    this._bitField = this._bitField | 67108864;\n};\n\nPromise.prototype._unsetCancellable = function () {\n    this._bitField = this._bitField & (~67108864);\n};\n\nPromise.prototype._setIsMigrated = function () {\n    this._bitField = this._bitField | 4194304;\n};\n\nPromise.prototype._unsetIsMigrated = function () {\n    this._bitField = this._bitField & (~4194304);\n};\n\nPromise.prototype._isMigrated = function () {\n    return (this._bitField & 4194304) > 0;\n};\n\nPromise.prototype._receiverAt = function (index) {\n    var ret = index === 0\n        ? this._receiver0\n        : this[\n            index * 5 - 5 + 4];\n    if (ret === UNDEFINED_BINDING) {\n        return undefined;\n    } else if (ret === undefined && this._isBound()) {\n        return this._boundValue();\n    }\n    return ret;\n};\n\nPromise.prototype._promiseAt = function (index) {\n    return index === 0\n        ? this._promise0\n        : this[index * 5 - 5 + 3];\n};\n\nPromise.prototype._fulfillmentHandlerAt = function (index) {\n    return index === 0\n        ? this._fulfillmentHandler0\n        : this[index * 5 - 5 + 0];\n};\n\nPromise.prototype._rejectionHandlerAt = function (index) {\n    return index === 0\n        ? this._rejectionHandler0\n        : this[index * 5 - 5 + 1];\n};\n\nPromise.prototype._boundValue = function() {\n    var ret = this._boundTo;\n    if (ret !== undefined) {\n        if (ret instanceof Promise) {\n            if (ret.isFulfilled()) {\n                return ret.value();\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return ret;\n};\n\nPromise.prototype._migrateCallbacks = function (follower, index) {\n    var fulfill = follower._fulfillmentHandlerAt(index);\n    var reject = follower._rejectionHandlerAt(index);\n    var progress = follower._progressHandlerAt(index);\n    var promise = follower._promiseAt(index);\n    var receiver = follower._receiverAt(index);\n    if (promise instanceof Promise) promise._setIsMigrated();\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, progress, promise, receiver, null);\n};\n\nPromise.prototype._addCallbacks = function (\n    fulfill,\n    reject,\n    progress,\n    promise,\n    receiver,\n    domain\n) {\n    var index = this._length();\n\n    if (index >= 131071 - 5) {\n        index = 0;\n        this._setLength(0);\n    }\n\n    if (index === 0) {\n        this._promise0 = promise;\n        if (receiver !== undefined) this._receiver0 = receiver;\n        if (typeof fulfill === \"function\" && !this._isCarryingStackTrace()) {\n            this._fulfillmentHandler0 =\n                domain === null ? fulfill : domain.bind(fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this._rejectionHandler0 =\n                domain === null ? reject : domain.bind(reject);\n        }\n        if (typeof progress === \"function\") {\n            this._progressHandler0 =\n                domain === null ? progress : domain.bind(progress);\n        }\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] = promise;\n        this[base + 4] = receiver;\n        if (typeof fulfill === \"function\") {\n            this[base + 0] =\n                domain === null ? fulfill : domain.bind(fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this[base + 1] =\n                domain === null ? reject : domain.bind(reject);\n        }\n        if (typeof progress === \"function\") {\n            this[base + 2] =\n                domain === null ? progress : domain.bind(progress);\n        }\n    }\n    this._setLength(index + 1);\n    return index;\n};\n\nPromise.prototype._setProxyHandlers = function (receiver, promiseSlotValue) {\n    var index = this._length();\n\n    if (index >= 131071 - 5) {\n        index = 0;\n        this._setLength(0);\n    }\n    if (index === 0) {\n        this._promise0 = promiseSlotValue;\n        this._receiver0 = receiver;\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] = promiseSlotValue;\n        this[base + 4] = receiver;\n    }\n    this._setLength(index + 1);\n};\n\nPromise.prototype._proxyPromiseArray = function (promiseArray, index) {\n    this._setProxyHandlers(promiseArray, index);\n};\n\nPromise.prototype._resolveCallback = function(value, shouldBind) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    if (value === this)\n        return this._rejectCallback(makeSelfResolutionError(), false, true);\n    var maybePromise = tryConvertToPromise(value, this);\n    if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n\n    var propagationFlags = 1 | (shouldBind ? 4 : 0);\n    this._propagateFrom(maybePromise, propagationFlags);\n    var promise = maybePromise._target();\n    if (promise._isPending()) {\n        var len = this._length();\n        for (var i = 0; i < len; ++i) {\n            promise._migrateCallbacks(this, i);\n        }\n        this._setFollowing();\n        this._setLength(0);\n        this._setFollowee(promise);\n    } else if (promise._isFulfilled()) {\n        this._fulfillUnchecked(promise._value());\n    } else {\n        this._rejectUnchecked(promise._reason(),\n            promise._getCarriedStackTrace());\n    }\n};\n\nPromise.prototype._rejectCallback =\nfunction(reason, synchronous, shouldNotMarkOriginatingFromRejection) {\n    if (!shouldNotMarkOriginatingFromRejection) {\n        util.markAsOriginatingFromRejection(reason);\n    }\n    var trace = util.ensureErrorObject(reason);\n    var hasStack = trace === reason;\n    this._attachExtraTrace(trace, synchronous ? hasStack : false);\n    this._reject(reason, hasStack ? undefined : trace);\n};\n\nPromise.prototype._resolveFromResolver = function (resolver) {\n    var promise = this;\n    this._captureStackTrace();\n    this._pushContext();\n    var synchronous = true;\n    var r = tryCatch(resolver)(function(value) {\n        if (promise === null) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }, function (reason) {\n        if (promise === null) return;\n        promise._rejectCallback(reason, synchronous);\n        promise = null;\n    });\n    synchronous = false;\n    this._popContext();\n\n    if (r !== undefined && r === errorObj && promise !== null) {\n        promise._rejectCallback(r.e, true, true);\n        promise = null;\n    }\n};\n\nPromise.prototype._settlePromiseFromHandler = function (\n    handler, receiver, value, promise\n) {\n    if (promise._isRejected()) return;\n    promise._pushContext();\n    var x;\n    if (receiver === APPLY && !this._isRejected()) {\n        x = tryCatch(handler).apply(this._boundValue(), value);\n    } else {\n        x = tryCatch(handler).call(receiver, value);\n    }\n    promise._popContext();\n\n    if (x === errorObj || x === promise || x === NEXT_FILTER) {\n        var err = x === promise ? makeSelfResolutionError() : x.e;\n        promise._rejectCallback(err, false, true);\n    } else {\n        promise._resolveCallback(x);\n    }\n};\n\nPromise.prototype._target = function() {\n    var ret = this;\n    while (ret._isFollowing()) ret = ret._followee();\n    return ret;\n};\n\nPromise.prototype._followee = function() {\n    return this._rejectionHandler0;\n};\n\nPromise.prototype._setFollowee = function(promise) {\n    this._rejectionHandler0 = promise;\n};\n\nPromise.prototype._cleanValues = function () {\n    if (this._cancellable()) {\n        this._cancellationParent = undefined;\n    }\n};\n\nPromise.prototype._propagateFrom = function (parent, flags) {\n    if ((flags & 1) > 0 && parent._cancellable()) {\n        this._setCancellable();\n        this._cancellationParent = parent;\n    }\n    if ((flags & 4) > 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n};\n\nPromise.prototype._fulfill = function (value) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._fulfillUnchecked(value);\n};\n\nPromise.prototype._reject = function (reason, carriedStackTrace) {\n    if (this._isFollowingOrFulfilledOrRejected()) return;\n    this._rejectUnchecked(reason, carriedStackTrace);\n};\n\nPromise.prototype._settlePromiseAt = function (index) {\n    var promise = this._promiseAt(index);\n    var isPromise = promise instanceof Promise;\n\n    if (isPromise && promise._isMigrated()) {\n        promise._unsetIsMigrated();\n        return async.invoke(this._settlePromiseAt, this, index);\n    }\n    var handler = this._isFulfilled()\n        ? this._fulfillmentHandlerAt(index)\n        : this._rejectionHandlerAt(index);\n\n    var carriedStackTrace =\n        this._isCarryingStackTrace() ? this._getCarriedStackTrace() : undefined;\n    var value = this._settledValue;\n    var receiver = this._receiverAt(index);\n    this._clearCallbackDataAtIndex(index);\n\n    if (typeof handler === \"function\") {\n        if (!isPromise) {\n            handler.call(receiver, value, promise);\n        } else {\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (receiver instanceof PromiseArray) {\n        if (!receiver._isResolved()) {\n            if (this._isFulfilled()) {\n                receiver._promiseFulfilled(value, promise);\n            }\n            else {\n                receiver._promiseRejected(value, promise);\n            }\n        }\n    } else if (isPromise) {\n        if (this._isFulfilled()) {\n            promise._fulfill(value);\n        } else {\n            promise._reject(value, carriedStackTrace);\n        }\n    }\n\n    if (index >= 4 && (index & 31) === 4)\n        async.invokeLater(this._setLength, this, 0);\n};\n\nPromise.prototype._clearCallbackDataAtIndex = function(index) {\n    if (index === 0) {\n        if (!this._isCarryingStackTrace()) {\n            this._fulfillmentHandler0 = undefined;\n        }\n        this._rejectionHandler0 =\n        this._progressHandler0 =\n        this._receiver0 =\n        this._promise0 = undefined;\n    } else {\n        var base = index * 5 - 5;\n        this[base + 3] =\n        this[base + 4] =\n        this[base + 0] =\n        this[base + 1] =\n        this[base + 2] = undefined;\n    }\n};\n\nPromise.prototype._isSettlePromisesQueued = function () {\n    return (this._bitField &\n            -1073741824) === -1073741824;\n};\n\nPromise.prototype._setSettlePromisesQueued = function () {\n    this._bitField = this._bitField | -1073741824;\n};\n\nPromise.prototype._unsetSettlePromisesQueued = function () {\n    this._bitField = this._bitField & (~-1073741824);\n};\n\nPromise.prototype._queueSettlePromises = function() {\n    async.settlePromises(this);\n    this._setSettlePromisesQueued();\n};\n\nPromise.prototype._fulfillUnchecked = function (value) {\n    if (value === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._rejectUnchecked(err, undefined);\n    }\n    this._setFulfilled();\n    this._settledValue = value;\n    this._cleanValues();\n\n    if (this._length() > 0) {\n        this._queueSettlePromises();\n    }\n};\n\nPromise.prototype._rejectUncheckedCheckError = function (reason) {\n    var trace = util.ensureErrorObject(reason);\n    this._rejectUnchecked(reason, trace === reason ? undefined : trace);\n};\n\nPromise.prototype._rejectUnchecked = function (reason, trace) {\n    if (reason === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._rejectUnchecked(err);\n    }\n    this._setRejected();\n    this._settledValue = reason;\n    this._cleanValues();\n\n    if (this._isFinal()) {\n        async.throwLater(function(e) {\n            if (\"stack\" in e) {\n                async.invokeFirst(\n                    CapturedTrace.unhandledRejection, undefined, e);\n            }\n            throw e;\n        }, trace === undefined ? reason : trace);\n        return;\n    }\n\n    if (trace !== undefined && trace !== reason) {\n        this._setCarriedStackTrace(trace);\n    }\n\n    if (this._length() > 0) {\n        this._queueSettlePromises();\n    } else {\n        this._ensurePossibleRejectionHandled();\n    }\n};\n\nPromise.prototype._settlePromises = function () {\n    this._unsetSettlePromisesQueued();\n    var len = this._length();\n    for (var i = 0; i < len; i++) {\n        this._settlePromiseAt(i);\n    }\n};\n\n\nutil.notEnumerableProp(Promise,\n                       \"_makeSelfResolutionError\",\n                       makeSelfResolutionError);\n\n_dereq_(\"./progress.js\")(Promise, PromiseArray);\n_dereq_(\"./method.js\")(Promise, INTERNAL, tryConvertToPromise, apiRejection);\n_dereq_(\"./bind.js\")(Promise, INTERNAL, tryConvertToPromise);\n_dereq_(\"./finally.js\")(Promise, NEXT_FILTER, tryConvertToPromise);\n_dereq_(\"./direct_resolve.js\")(Promise);\n_dereq_(\"./synchronous_inspection.js\")(Promise);\n_dereq_(\"./join.js\")(Promise, PromiseArray, tryConvertToPromise, INTERNAL);\nPromise.version = \"2.11.0\";\nPromise.Promise = Promise;\n_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);\n_dereq_('./cancel.js')(Promise);\n_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext);\n_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise);\n_dereq_('./nodeify.js')(Promise);\n_dereq_('./call_get.js')(Promise);\n_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\n_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\n_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);\n_dereq_('./settle.js')(Promise, PromiseArray);\n_dereq_('./some.js')(Promise, PromiseArray, apiRejection);\n_dereq_('./promisify.js')(Promise, INTERNAL);\n_dereq_('./any.js')(Promise);\n_dereq_('./each.js')(Promise, INTERNAL);\n_dereq_('./timers.js')(Promise, INTERNAL);\n_dereq_('./filter.js')(Promise, INTERNAL);\n                                                         \n    util.toFastProperties(Promise);                                          \n    util.toFastProperties(Promise.prototype);                                \n    function fillTypes(value) {                                              \n        var p = new Promise(INTERNAL);                                       \n        p._fulfillmentHandler0 = value;                                      \n        p._rejectionHandler0 = value;                                        \n        p._progressHandler0 = value;                                         \n        p._promise0 = value;                                                 \n        p._receiver0 = value;                                                \n        p._settledValue = value;                                             \n    }                                                                        \n    // Complete slack tracking, opt out of field-type tracking and           \n    // stabilize map                                                         \n    fillTypes({a: 1});                                                       \n    fillTypes({b: 2});                                                       \n    fillTypes({c: 3});                                                       \n    fillTypes(1);                                                            \n    fillTypes(function(){});                                                 \n    fillTypes(undefined);                                                    \n    fillTypes(false);                                                        \n    fillTypes(new Promise(INTERNAL));                                        \n    CapturedTrace.setBounds(async.firstLineError, util.lastLineError);       \n    return Promise;                                                          \n\n};\n\n},{\"./any.js\":1,\"./async.js\":2,\"./bind.js\":3,\"./call_get.js\":5,\"./cancel.js\":6,\"./captured_trace.js\":7,\"./catch_filter.js\":8,\"./context.js\":9,\"./debuggability.js\":10,\"./direct_resolve.js\":11,\"./each.js\":12,\"./errors.js\":13,\"./filter.js\":15,\"./finally.js\":16,\"./generators.js\":17,\"./join.js\":18,\"./map.js\":19,\"./method.js\":20,\"./nodeify.js\":21,\"./progress.js\":22,\"./promise_array.js\":24,\"./promise_resolver.js\":25,\"./promisify.js\":26,\"./props.js\":27,\"./race.js\":29,\"./reduce.js\":30,\"./settle.js\":32,\"./some.js\":33,\"./synchronous_inspection.js\":34,\"./thenables.js\":35,\"./timers.js\":36,\"./using.js\":37,\"./util.js\":38}],24:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise,\n    apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar isArray = util.isArray;\n\nfunction toResolutionValue(val) {\n    switch(val) {\n    case -2: return [];\n    case -3: return {};\n    }\n}\n\nfunction PromiseArray(values) {\n    var promise = this._promise = new Promise(INTERNAL);\n    var parent;\n    if (values instanceof Promise) {\n        parent = values;\n        promise._propagateFrom(parent, 1 | 4);\n    }\n    this._values = values;\n    this._length = 0;\n    this._totalResolved = 0;\n    this._init(undefined, -2);\n}\nPromiseArray.prototype.length = function () {\n    return this._length;\n};\n\nPromiseArray.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n    var values = tryConvertToPromise(this._values, this._promise);\n    if (values instanceof Promise) {\n        values = values._target();\n        this._values = values;\n        if (values._isFulfilled()) {\n            values = values._value();\n            if (!isArray(values)) {\n                var err = new Promise.TypeError(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\");\n                this.__hardReject__(err);\n                return;\n            }\n        } else if (values._isPending()) {\n            values._then(\n                init,\n                this._reject,\n                undefined,\n                this,\n                resolveValueIfEmpty\n           );\n            return;\n        } else {\n            this._reject(values._reason());\n            return;\n        }\n    } else if (!isArray(values)) {\n        this._promise._reject(apiRejection(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\")._reason());\n        return;\n    }\n\n    if (values.length === 0) {\n        if (resolveValueIfEmpty === -5) {\n            this._resolveEmptyArray();\n        }\n        else {\n            this._resolve(toResolutionValue(resolveValueIfEmpty));\n        }\n        return;\n    }\n    var len = this.getActualLength(values.length);\n    this._length = len;\n    this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n    var promise = this._promise;\n    for (var i = 0; i < len; ++i) {\n        var isResolved = this._isResolved();\n        var maybePromise = tryConvertToPromise(values[i], promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (isResolved) {\n                maybePromise._ignoreRejections();\n            } else if (maybePromise._isPending()) {\n                maybePromise._proxyPromiseArray(this, i);\n            } else if (maybePromise._isFulfilled()) {\n                this._promiseFulfilled(maybePromise._value(), i);\n            } else {\n                this._promiseRejected(maybePromise._reason(), i);\n            }\n        } else if (!isResolved) {\n            this._promiseFulfilled(maybePromise, i);\n        }\n    }\n};\n\nPromiseArray.prototype._isResolved = function () {\n    return this._values === null;\n};\n\nPromiseArray.prototype._resolve = function (value) {\n    this._values = null;\n    this._promise._fulfill(value);\n};\n\nPromiseArray.prototype.__hardReject__ =\nPromiseArray.prototype._reject = function (reason) {\n    this._values = null;\n    this._promise._rejectCallback(reason, false, true);\n};\n\nPromiseArray.prototype._promiseProgressed = function (progressValue, index) {\n    this._promise._progress({\n        index: index,\n        value: progressValue\n    });\n};\n\n\nPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n    }\n};\n\nPromiseArray.prototype._promiseRejected = function (reason, index) {\n    this._totalResolved++;\n    this._reject(reason);\n};\n\nPromiseArray.prototype.shouldCopyValues = function () {\n    return true;\n};\n\nPromiseArray.prototype.getActualLength = function (len) {\n    return len;\n};\n\nreturn PromiseArray;\n};\n\n},{\"./util.js\":38}],25:[function(_dereq_,module,exports){\n\"use strict\";\nvar util = _dereq_(\"./util.js\");\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar errors = _dereq_(\"./errors.js\");\nvar TimeoutError = errors.TimeoutError;\nvar OperationalError = errors.OperationalError;\nvar haveGetters = util.haveGetters;\nvar es5 = _dereq_(\"./es5.js\");\n\nfunction isUntypedError(obj) {\n    return obj instanceof Error &&\n        es5.getPrototypeOf(obj) === Error.prototype;\n}\n\nvar rErrorKey = /^(?:name|message|stack|cause)$/;\nfunction wrapAsOperationalError(obj) {\n    var ret;\n    if (isUntypedError(obj)) {\n        ret = new OperationalError(obj);\n        ret.name = obj.name;\n        ret.message = obj.message;\n        ret.stack = obj.stack;\n        var keys = es5.keys(obj);\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!rErrorKey.test(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    util.markAsOriginatingFromRejection(obj);\n    return obj;\n}\n\nfunction nodebackForPromise(promise) {\n    return function(err, value) {\n        if (promise === null) return;\n\n        if (err) {\n            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n            promise._attachExtraTrace(wrapped);\n            promise._reject(wrapped);\n        } else if (arguments.length > 2) {\n            var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}\n            promise._fulfill(args);\n        } else {\n            promise._fulfill(value);\n        }\n\n        promise = null;\n    };\n}\n\n\nvar PromiseResolver;\nif (!haveGetters) {\n    PromiseResolver = function (promise) {\n        this.promise = promise;\n        this.asCallback = nodebackForPromise(promise);\n        this.callback = this.asCallback;\n    };\n}\nelse {\n    PromiseResolver = function (promise) {\n        this.promise = promise;\n    };\n}\nif (haveGetters) {\n    var prop = {\n        get: function() {\n            return nodebackForPromise(this.promise);\n        }\n    };\n    es5.defineProperty(PromiseResolver.prototype, \"asCallback\", prop);\n    es5.defineProperty(PromiseResolver.prototype, \"callback\", prop);\n}\n\nPromiseResolver._nodebackForPromise = nodebackForPromise;\n\nPromiseResolver.prototype.toString = function () {\n    return \"[object PromiseResolver]\";\n};\n\nPromiseResolver.prototype.resolve =\nPromiseResolver.prototype.fulfill = function (value) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._resolveCallback(value);\n};\n\nPromiseResolver.prototype.reject = function (reason) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._rejectCallback(reason);\n};\n\nPromiseResolver.prototype.progress = function (value) {\n    if (!(this instanceof PromiseResolver)) {\n        throw new TypeError(\"Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\\u000a\\u000a    See http://goo.gl/sdkXL9\\u000a\");\n    }\n    this.promise._progress(value);\n};\n\nPromiseResolver.prototype.cancel = function (err) {\n    this.promise.cancel(err);\n};\n\nPromiseResolver.prototype.timeout = function () {\n    this.reject(new TimeoutError(\"timeout\"));\n};\n\nPromiseResolver.prototype.isResolved = function () {\n    return this.promise.isResolved();\n};\n\nPromiseResolver.prototype.toJSON = function () {\n    return this.promise.toJSON();\n};\n\nmodule.exports = PromiseResolver;\n\n},{\"./errors.js\":13,\"./es5.js\":14,\"./util.js\":38}],26:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar THIS = {};\nvar util = _dereq_(\"./util.js\");\nvar nodebackForPromise = _dereq_(\"./promise_resolver.js\")\n    ._nodebackForPromise;\nvar withAppended = util.withAppended;\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar canEvaluate = util.canEvaluate;\nvar TypeError = _dereq_(\"./errors\").TypeError;\nvar defaultSuffix = \"Async\";\nvar defaultPromisified = {__isPromisified__: true};\nvar noCopyProps = [\n    \"arity\",    \"length\",\n    \"name\",\n    \"arguments\",\n    \"caller\",\n    \"callee\",\n    \"prototype\",\n    \"__isPromisified__\"\n];\nvar noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\nvar defaultFilter = function(name) {\n    return util.isIdentifier(name) &&\n        name.charAt(0) !== \"_\" &&\n        name !== \"constructor\";\n};\n\nfunction propsFilter(key) {\n    return !noCopyPropsPattern.test(key);\n}\n\nfunction isPromisified(fn) {\n    try {\n        return fn.__isPromisified__ === true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n\nfunction hasPromisified(obj, key, suffix) {\n    var val = util.getDataPropertyOrDefault(obj, key + suffix,\n                                            defaultPromisified);\n    return val ? isPromisified(val) : false;\n}\nfunction checkValid(ret, suffix, suffixRegexp) {\n    for (var i = 0; i < ret.length; i += 2) {\n        var key = ret[i];\n        if (suffixRegexp.test(key)) {\n            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n            for (var j = 0; j < ret.length; j += 2) {\n                if (ret[j] === keyWithoutAsyncSuffix) {\n                    throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\u000a\\u000a    See http://goo.gl/iWrZbw\\u000a\"\n                        .replace(\"%s\", suffix));\n                }\n            }\n        }\n    }\n}\n\nfunction promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n    var keys = util.inheritedDataKeys(obj);\n    var ret = [];\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var value = obj[key];\n        var passesDefaultFilter = filter === defaultFilter\n            ? true : defaultFilter(key, value, obj);\n        if (typeof value === \"function\" &&\n            !isPromisified(value) &&\n            !hasPromisified(obj, key, suffix) &&\n            filter(key, value, obj, passesDefaultFilter)) {\n            ret.push(key, value);\n        }\n    }\n    checkValid(ret, suffix, suffixRegexp);\n    return ret;\n}\n\nvar escapeIdentRegex = function(str) {\n    return str.replace(/([$])/, \"\\\\$\");\n};\n\nvar makeNodePromisifiedEval;\nif (!true) {\nvar switchCaseArgumentOrder = function(likelyArgumentCount) {\n    var ret = [likelyArgumentCount];\n    var min = Math.max(0, likelyArgumentCount - 1 - 3);\n    for(var i = likelyArgumentCount - 1; i >= min; --i) {\n        ret.push(i);\n    }\n    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {\n        ret.push(i);\n    }\n    return ret;\n};\n\nvar argumentSequence = function(argumentCount) {\n    return util.filledRange(argumentCount, \"_arg\", \"\");\n};\n\nvar parameterDeclaration = function(parameterCount) {\n    return util.filledRange(\n        Math.max(parameterCount, 3), \"_arg\", \"\");\n};\n\nvar parameterCount = function(fn) {\n    if (typeof fn.length === \"number\") {\n        return Math.max(Math.min(fn.length, 1023 + 1), 0);\n    }\n    return 0;\n};\n\nmakeNodePromisifiedEval =\nfunction(callback, receiver, originalName, fn) {\n    var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n    var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n    var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n    function generateCallForArgumentCount(count) {\n        var args = argumentSequence(count).join(\", \");\n        var comma = count > 0 ? \", \" : \"\";\n        var ret;\n        if (shouldProxyThis) {\n            ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n        } else {\n            ret = receiver === undefined\n                ? \"ret = callback({{args}}, nodeback); break;\\n\"\n                : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n        }\n        return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n    }\n\n    function generateArgumentSwitchCase() {\n        var ret = \"\";\n        for (var i = 0; i < argumentOrder.length; ++i) {\n            ret += \"case \" + argumentOrder[i] +\":\" +\n                generateCallForArgumentCount(argumentOrder[i]);\n        }\n\n        ret += \"                                                             \\n\\\n        default:                                                             \\n\\\n            var args = new Array(len + 1);                                   \\n\\\n            var i = 0;                                                       \\n\\\n            for (var i = 0; i < len; ++i) {                                  \\n\\\n               args[i] = arguments[i];                                       \\n\\\n            }                                                                \\n\\\n            args[i] = nodeback;                                              \\n\\\n            [CodeForCall]                                                    \\n\\\n            break;                                                           \\n\\\n        \".replace(\"[CodeForCall]\", (shouldProxyThis\n                                ? \"ret = callback.apply(this, args);\\n\"\n                                : \"ret = callback.apply(receiver, args);\\n\"));\n        return ret;\n    }\n\n    var getFunctionCode = typeof callback === \"string\"\n                                ? (\"this != null ? this['\"+callback+\"'] : fn\")\n                                : \"fn\";\n\n    return new Function(\"Promise\",\n                        \"fn\",\n                        \"receiver\",\n                        \"withAppended\",\n                        \"maybeWrapAsError\",\n                        \"nodebackForPromise\",\n                        \"tryCatch\",\n                        \"errorObj\",\n                        \"notEnumerableProp\",\n                        \"INTERNAL\",\"'use strict';                            \\n\\\n        var ret = function (Parameters) {                                    \\n\\\n            'use strict';                                                    \\n\\\n            var len = arguments.length;                                      \\n\\\n            var promise = new Promise(INTERNAL);                             \\n\\\n            promise._captureStackTrace();                                    \\n\\\n            var nodeback = nodebackForPromise(promise);                      \\n\\\n            var ret;                                                         \\n\\\n            var callback = tryCatch([GetFunctionCode]);                      \\n\\\n            switch(len) {                                                    \\n\\\n                [CodeForSwitchCase]                                          \\n\\\n            }                                                                \\n\\\n            if (ret === errorObj) {                                          \\n\\\n                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n            }                                                                \\n\\\n            return promise;                                                  \\n\\\n        };                                                                   \\n\\\n        notEnumerableProp(ret, '__isPromisified__', true);                   \\n\\\n        return ret;                                                          \\n\\\n        \"\n        .replace(\"Parameters\", parameterDeclaration(newParameterCount))\n        .replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase())\n        .replace(\"[GetFunctionCode]\", getFunctionCode))(\n            Promise,\n            fn,\n            receiver,\n            withAppended,\n            maybeWrapAsError,\n            nodebackForPromise,\n            util.tryCatch,\n            util.errorObj,\n            util.notEnumerableProp,\n            INTERNAL\n        );\n};\n}\n\nfunction makeNodePromisifiedClosure(callback, receiver, _, fn) {\n    var defaultThis = (function() {return this;})();\n    var method = callback;\n    if (typeof method === \"string\") {\n        callback = fn;\n    }\n    function promisified() {\n        var _receiver = receiver;\n        if (receiver === THIS) _receiver = this;\n        var promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n        var cb = typeof method === \"string\" && this !== defaultThis\n            ? this[method] : callback;\n        var fn = nodebackForPromise(promise);\n        try {\n            cb.apply(_receiver, withAppended(arguments, fn));\n        } catch(e) {\n            promise._rejectCallback(maybeWrapAsError(e), true, true);\n        }\n        return promise;\n    }\n    util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n    return promisified;\n}\n\nvar makeNodePromisified = canEvaluate\n    ? makeNodePromisifiedEval\n    : makeNodePromisifiedClosure;\n\nfunction promisifyAll(obj, suffix, filter, promisifier) {\n    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n    var methods =\n        promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n    for (var i = 0, len = methods.length; i < len; i+= 2) {\n        var key = methods[i];\n        var fn = methods[i+1];\n        var promisifiedKey = key + suffix;\n        if (promisifier === makeNodePromisified) {\n            obj[promisifiedKey] =\n                makeNodePromisified(key, THIS, key, fn, suffix);\n        } else {\n            var promisified = promisifier(fn, function() {\n                return makeNodePromisified(key, THIS, key, fn, suffix);\n            });\n            util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n            obj[promisifiedKey] = promisified;\n        }\n    }\n    util.toFastProperties(obj);\n    return obj;\n}\n\nfunction promisify(callback, receiver) {\n    return makeNodePromisified(callback, receiver, undefined, callback);\n}\n\nPromise.promisify = function (fn, receiver) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    }\n    if (isPromisified(fn)) {\n        return fn;\n    }\n    var ret = promisify(fn, arguments.length < 2 ? THIS : receiver);\n    util.copyDescriptors(fn, ret, propsFilter);\n    return ret;\n};\n\nPromise.promisifyAll = function (target, options) {\n    if (typeof target !== \"function\" && typeof target !== \"object\") {\n        throw new TypeError(\"the target of promisifyAll must be an object or a function\\u000a\\u000a    See http://goo.gl/9ITlV0\\u000a\");\n    }\n    options = Object(options);\n    var suffix = options.suffix;\n    if (typeof suffix !== \"string\") suffix = defaultSuffix;\n    var filter = options.filter;\n    if (typeof filter !== \"function\") filter = defaultFilter;\n    var promisifier = options.promisifier;\n    if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n    if (!util.isIdentifier(suffix)) {\n        throw new RangeError(\"suffix must be a valid identifier\\u000a\\u000a    See http://goo.gl/8FZo5V\\u000a\");\n    }\n\n    var keys = util.inheritedDataKeys(target);\n    for (var i = 0; i < keys.length; ++i) {\n        var value = target[keys[i]];\n        if (keys[i] !== \"constructor\" &&\n            util.isClass(value)) {\n            promisifyAll(value.prototype, suffix, filter, promisifier);\n            promisifyAll(value, suffix, filter, promisifier);\n        }\n    }\n\n    return promisifyAll(target, suffix, filter, promisifier);\n};\n};\n\n\n},{\"./errors\":13,\"./promise_resolver.js\":25,\"./util.js\":38}],27:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, PromiseArray, tryConvertToPromise, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar isObject = util.isObject;\nvar es5 = _dereq_(\"./es5.js\");\n\nfunction PropertiesPromiseArray(obj) {\n    var keys = es5.keys(obj);\n    var len = keys.length;\n    var values = new Array(len * 2);\n    for (var i = 0; i < len; ++i) {\n        var key = keys[i];\n        values[i] = obj[key];\n        values[i + len] = key;\n    }\n    this.constructor$(values);\n}\nutil.inherits(PropertiesPromiseArray, PromiseArray);\n\nPropertiesPromiseArray.prototype._init = function () {\n    this._init$(undefined, -3) ;\n};\n\nPropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        var val = {};\n        var keyOffset = this.length();\n        for (var i = 0, len = this.length(); i < len; ++i) {\n            val[this._values[i + keyOffset]] = this._values[i];\n        }\n        this._resolve(val);\n    }\n};\n\nPropertiesPromiseArray.prototype._promiseProgressed = function (value, index) {\n    this._promise._progress({\n        key: this._values[index + this.length()],\n        value: value\n    });\n};\n\nPropertiesPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nPropertiesPromiseArray.prototype.getActualLength = function (len) {\n    return len >> 1;\n};\n\nfunction props(promises) {\n    var ret;\n    var castValue = tryConvertToPromise(promises);\n\n    if (!isObject(castValue)) {\n        return apiRejection(\"cannot await properties of a non-object\\u000a\\u000a    See http://goo.gl/OsFKC8\\u000a\");\n    } else if (castValue instanceof Promise) {\n        ret = castValue._then(\n            Promise.props, undefined, undefined, undefined, undefined);\n    } else {\n        ret = new PropertiesPromiseArray(castValue).promise();\n    }\n\n    if (castValue instanceof Promise) {\n        ret._propagateFrom(castValue, 4);\n    }\n    return ret;\n}\n\nPromise.prototype.props = function () {\n    return props(this);\n};\n\nPromise.props = function (promises) {\n    return props(promises);\n};\n};\n\n},{\"./es5.js\":14,\"./util.js\":38}],28:[function(_dereq_,module,exports){\n\"use strict\";\nfunction arrayMove(src, srcIndex, dst, dstIndex, len) {\n    for (var j = 0; j < len; ++j) {\n        dst[j + dstIndex] = src[j + srcIndex];\n        src[j + srcIndex] = void 0;\n    }\n}\n\nfunction Queue(capacity) {\n    this._capacity = capacity;\n    this._length = 0;\n    this._front = 0;\n}\n\nQueue.prototype._willBeOverCapacity = function (size) {\n    return this._capacity < size;\n};\n\nQueue.prototype._pushOne = function (arg) {\n    var length = this.length();\n    this._checkCapacity(length + 1);\n    var i = (this._front + length) & (this._capacity - 1);\n    this[i] = arg;\n    this._length = length + 1;\n};\n\nQueue.prototype._unshiftOne = function(value) {\n    var capacity = this._capacity;\n    this._checkCapacity(this.length() + 1);\n    var front = this._front;\n    var i = (((( front - 1 ) &\n                    ( capacity - 1) ) ^ capacity ) - capacity );\n    this[i] = value;\n    this._front = i;\n    this._length = this.length() + 1;\n};\n\nQueue.prototype.unshift = function(fn, receiver, arg) {\n    this._unshiftOne(arg);\n    this._unshiftOne(receiver);\n    this._unshiftOne(fn);\n};\n\nQueue.prototype.push = function (fn, receiver, arg) {\n    var length = this.length() + 3;\n    if (this._willBeOverCapacity(length)) {\n        this._pushOne(fn);\n        this._pushOne(receiver);\n        this._pushOne(arg);\n        return;\n    }\n    var j = this._front + length - 3;\n    this._checkCapacity(length);\n    var wrapMask = this._capacity - 1;\n    this[(j + 0) & wrapMask] = fn;\n    this[(j + 1) & wrapMask] = receiver;\n    this[(j + 2) & wrapMask] = arg;\n    this._length = length;\n};\n\nQueue.prototype.shift = function () {\n    var front = this._front,\n        ret = this[front];\n\n    this[front] = undefined;\n    this._front = (front + 1) & (this._capacity - 1);\n    this._length--;\n    return ret;\n};\n\nQueue.prototype.length = function () {\n    return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n    if (this._capacity < size) {\n        this._resizeTo(this._capacity << 1);\n    }\n};\n\nQueue.prototype._resizeTo = function (capacity) {\n    var oldCapacity = this._capacity;\n    this._capacity = capacity;\n    var front = this._front;\n    var length = this._length;\n    var moveItemsCount = (front + length) & (oldCapacity - 1);\n    arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n};\n\nmodule.exports = Queue;\n\n},{}],29:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar isArray = _dereq_(\"./util.js\").isArray;\n\nvar raceLater = function (promise) {\n    return promise.then(function(array) {\n        return race(array, promise);\n    });\n};\n\nfunction race(promises, parent) {\n    var maybePromise = tryConvertToPromise(promises);\n\n    if (maybePromise instanceof Promise) {\n        return raceLater(maybePromise);\n    } else if (!isArray(promises)) {\n        return apiRejection(\"expecting an array, a promise or a thenable\\u000a\\u000a    See http://goo.gl/s8MMhc\\u000a\");\n    }\n\n    var ret = new Promise(INTERNAL);\n    if (parent !== undefined) {\n        ret._propagateFrom(parent, 4 | 1);\n    }\n    var fulfill = ret._fulfill;\n    var reject = ret._reject;\n    for (var i = 0, len = promises.length; i < len; ++i) {\n        var val = promises[i];\n\n        if (val === undefined && !(i in promises)) {\n            continue;\n        }\n\n        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n    }\n    return ret;\n}\n\nPromise.race = function (promises) {\n    return race(promises, undefined);\n};\n\nPromise.prototype.race = function () {\n    return race(this, undefined);\n};\n\n};\n\n},{\"./util.js\":38}],30:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL) {\nvar getDomain = Promise._getDomain;\nvar async = _dereq_(\"./async.js\");\nvar util = _dereq_(\"./util.js\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nfunction ReductionPromiseArray(promises, fn, accum, _each) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    this._preservedValues = _each === INTERNAL ? [] : null;\n    this._zerothIsAccum = (accum === undefined);\n    this._gotAccum = false;\n    this._reducingIndex = (this._zerothIsAccum ? 1 : 0);\n    this._valuesPhase = undefined;\n    var maybePromise = tryConvertToPromise(accum, this._promise);\n    var rejected = false;\n    var isPromise = maybePromise instanceof Promise;\n    if (isPromise) {\n        maybePromise = maybePromise._target();\n        if (maybePromise._isPending()) {\n            maybePromise._proxyPromiseArray(this, -1);\n        } else if (maybePromise._isFulfilled()) {\n            accum = maybePromise._value();\n            this._gotAccum = true;\n        } else {\n            this._reject(maybePromise._reason());\n            rejected = true;\n        }\n    }\n    if (!(isPromise || this._zerothIsAccum)) this._gotAccum = true;\n    var domain = getDomain();\n    this._callback = domain === null ? fn : domain.bind(fn);\n    this._accum = accum;\n    if (!rejected) async.invoke(init, this, undefined);\n}\nfunction init() {\n    this._init$(undefined, -5);\n}\nutil.inherits(ReductionPromiseArray, PromiseArray);\n\nReductionPromiseArray.prototype._init = function () {};\n\nReductionPromiseArray.prototype._resolveEmptyArray = function () {\n    if (this._gotAccum || this._zerothIsAccum) {\n        this._resolve(this._preservedValues !== null\n                        ? [] : this._accum);\n    }\n};\n\nReductionPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    values[index] = value;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var isEach = preservedValues !== null;\n    var gotAccum = this._gotAccum;\n    var valuesPhase = this._valuesPhase;\n    var valuesPhaseIndex;\n    if (!valuesPhase) {\n        valuesPhase = this._valuesPhase = new Array(length);\n        for (valuesPhaseIndex=0; valuesPhaseIndex<length; ++valuesPhaseIndex) {\n            valuesPhase[valuesPhaseIndex] = 0;\n        }\n    }\n    valuesPhaseIndex = valuesPhase[index];\n\n    if (index === 0 && this._zerothIsAccum) {\n        this._accum = value;\n        this._gotAccum = gotAccum = true;\n        valuesPhase[index] = ((valuesPhaseIndex === 0)\n            ? 1 : 2);\n    } else if (index === -1) {\n        this._accum = value;\n        this._gotAccum = gotAccum = true;\n    } else {\n        if (valuesPhaseIndex === 0) {\n            valuesPhase[index] = 1;\n        } else {\n            valuesPhase[index] = 2;\n            this._accum = value;\n        }\n    }\n    if (!gotAccum) return;\n\n    var callback = this._callback;\n    var receiver = this._promise._boundValue();\n    var ret;\n\n    for (var i = this._reducingIndex; i < length; ++i) {\n        valuesPhaseIndex = valuesPhase[i];\n        if (valuesPhaseIndex === 2) {\n            this._reducingIndex = i + 1;\n            continue;\n        }\n        if (valuesPhaseIndex !== 1) return;\n        value = values[i];\n        this._promise._pushContext();\n        if (isEach) {\n            preservedValues.push(value);\n            ret = tryCatch(callback).call(receiver, value, i, length);\n        }\n        else {\n            ret = tryCatch(callback)\n                .call(receiver, this._accum, value, i, length);\n        }\n        this._promise._popContext();\n\n        if (ret === errorObj) return this._reject(ret.e);\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            if (maybePromise._isPending()) {\n                valuesPhase[i] = 4;\n                return maybePromise._proxyPromiseArray(this, i);\n            } else if (maybePromise._isFulfilled()) {\n                ret = maybePromise._value();\n            } else {\n                return this._reject(maybePromise._reason());\n            }\n        }\n\n        this._reducingIndex = i + 1;\n        this._accum = ret;\n    }\n\n    this._resolve(isEach ? preservedValues : this._accum);\n};\n\nfunction reduce(promises, fn, initialValue, _each) {\n    if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n    return array.promise();\n}\n\nPromise.prototype.reduce = function (fn, initialValue) {\n    return reduce(this, fn, initialValue, null);\n};\n\nPromise.reduce = function (promises, fn, initialValue, _each) {\n    return reduce(promises, fn, initialValue, _each);\n};\n};\n\n},{\"./async.js\":2,\"./util.js\":38}],31:[function(_dereq_,module,exports){\n\"use strict\";\nvar schedule;\nvar util = _dereq_(\"./util\");\nvar noAsyncScheduler = function() {\n    throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/m3OTXk\\u000a\");\n};\nif (util.isNode && typeof MutationObserver === \"undefined\") {\n    var GlobalSetImmediate = global.setImmediate;\n    var ProcessNextTick = process.nextTick;\n    schedule = util.isRecentNode\n                ? function(fn) { GlobalSetImmediate.call(global, fn); }\n                : function(fn) { ProcessNextTick.call(process, fn); };\n} else if ((typeof MutationObserver !== \"undefined\") &&\n          !(typeof window !== \"undefined\" &&\n            window.navigator &&\n            window.navigator.standalone)) {\n    schedule = function(fn) {\n        var div = document.createElement(\"div\");\n        var observer = new MutationObserver(fn);\n        observer.observe(div, {attributes: true});\n        return function() { div.classList.toggle(\"foo\"); };\n    };\n    schedule.isStatic = true;\n} else if (typeof setImmediate !== \"undefined\") {\n    schedule = function (fn) {\n        setImmediate(fn);\n    };\n} else if (typeof setTimeout !== \"undefined\") {\n    schedule = function (fn) {\n        setTimeout(fn, 0);\n    };\n} else {\n    schedule = noAsyncScheduler;\n}\nmodule.exports = schedule;\n\n},{\"./util\":38}],32:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\n    function(Promise, PromiseArray) {\nvar PromiseInspection = Promise.PromiseInspection;\nvar util = _dereq_(\"./util.js\");\n\nfunction SettledPromiseArray(values) {\n    this.constructor$(values);\n}\nutil.inherits(SettledPromiseArray, PromiseArray);\n\nSettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n    this._values[index] = inspection;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n    }\n};\n\nSettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 268435456;\n    ret._settledValue = value;\n    this._promiseResolved(index, ret);\n};\nSettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 134217728;\n    ret._settledValue = reason;\n    this._promiseResolved(index, ret);\n};\n\nPromise.settle = function (promises) {\n    return new SettledPromiseArray(promises).promise();\n};\n\nPromise.prototype.settle = function () {\n    return new SettledPromiseArray(this).promise();\n};\n};\n\n},{\"./util.js\":38}],33:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, apiRejection) {\nvar util = _dereq_(\"./util.js\");\nvar RangeError = _dereq_(\"./errors.js\").RangeError;\nvar AggregateError = _dereq_(\"./errors.js\").AggregateError;\nvar isArray = util.isArray;\n\n\nfunction SomePromiseArray(values) {\n    this.constructor$(values);\n    this._howMany = 0;\n    this._unwrap = false;\n    this._initialized = false;\n}\nutil.inherits(SomePromiseArray, PromiseArray);\n\nSomePromiseArray.prototype._init = function () {\n    if (!this._initialized) {\n        return;\n    }\n    if (this._howMany === 0) {\n        this._resolve([]);\n        return;\n    }\n    this._init$(undefined, -5);\n    var isArrayResolved = isArray(this._values);\n    if (!this._isResolved() &&\n        isArrayResolved &&\n        this._howMany > this._canPossiblyFulfill()) {\n        this._reject(this._getRangeError(this.length()));\n    }\n};\n\nSomePromiseArray.prototype.init = function () {\n    this._initialized = true;\n    this._init();\n};\n\nSomePromiseArray.prototype.setUnwrap = function () {\n    this._unwrap = true;\n};\n\nSomePromiseArray.prototype.howMany = function () {\n    return this._howMany;\n};\n\nSomePromiseArray.prototype.setHowMany = function (count) {\n    this._howMany = count;\n};\n\nSomePromiseArray.prototype._promiseFulfilled = function (value) {\n    this._addFulfilled(value);\n    if (this._fulfilled() === this.howMany()) {\n        this._values.length = this.howMany();\n        if (this.howMany() === 1 && this._unwrap) {\n            this._resolve(this._values[0]);\n        } else {\n            this._resolve(this._values);\n        }\n    }\n\n};\nSomePromiseArray.prototype._promiseRejected = function (reason) {\n    this._addRejected(reason);\n    if (this.howMany() > this._canPossiblyFulfill()) {\n        var e = new AggregateError();\n        for (var i = this.length(); i < this._values.length; ++i) {\n            e.push(this._values[i]);\n        }\n        this._reject(e);\n    }\n};\n\nSomePromiseArray.prototype._fulfilled = function () {\n    return this._totalResolved;\n};\n\nSomePromiseArray.prototype._rejected = function () {\n    return this._values.length - this.length();\n};\n\nSomePromiseArray.prototype._addRejected = function (reason) {\n    this._values.push(reason);\n};\n\nSomePromiseArray.prototype._addFulfilled = function (value) {\n    this._values[this._totalResolved++] = value;\n};\n\nSomePromiseArray.prototype._canPossiblyFulfill = function () {\n    return this.length() - this._rejected();\n};\n\nSomePromiseArray.prototype._getRangeError = function (count) {\n    var message = \"Input array must contain at least \" +\n            this._howMany + \" items but contains only \" + count + \" items\";\n    return new RangeError(message);\n};\n\nSomePromiseArray.prototype._resolveEmptyArray = function () {\n    this._reject(this._getRangeError(0));\n};\n\nfunction some(promises, howMany) {\n    if ((howMany | 0) !== howMany || howMany < 0) {\n        return apiRejection(\"expecting a positive integer\\u000a\\u000a    See http://goo.gl/1wAmHx\\u000a\");\n    }\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(howMany);\n    ret.init();\n    return promise;\n}\n\nPromise.some = function (promises, howMany) {\n    return some(promises, howMany);\n};\n\nPromise.prototype.some = function (howMany) {\n    return some(this, howMany);\n};\n\nPromise._SomePromiseArray = SomePromiseArray;\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],34:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction PromiseInspection(promise) {\n    if (promise !== undefined) {\n        promise = promise._target();\n        this._bitField = promise._bitField;\n        this._settledValue = promise._settledValue;\n    }\n    else {\n        this._bitField = 0;\n        this._settledValue = undefined;\n    }\n}\n\nPromiseInspection.prototype.value = function () {\n    if (!this.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/hc1DLj\\u000a\");\n    }\n    return this._settledValue;\n};\n\nPromiseInspection.prototype.error =\nPromiseInspection.prototype.reason = function () {\n    if (!this.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/hPuiwB\\u000a\");\n    }\n    return this._settledValue;\n};\n\nPromiseInspection.prototype.isFulfilled =\nPromise.prototype._isFulfilled = function () {\n    return (this._bitField & 268435456) > 0;\n};\n\nPromiseInspection.prototype.isRejected =\nPromise.prototype._isRejected = function () {\n    return (this._bitField & 134217728) > 0;\n};\n\nPromiseInspection.prototype.isPending =\nPromise.prototype._isPending = function () {\n    return (this._bitField & 402653184) === 0;\n};\n\nPromiseInspection.prototype.isResolved =\nPromise.prototype._isResolved = function () {\n    return (this._bitField & 402653184) > 0;\n};\n\nPromise.prototype.isPending = function() {\n    return this._target()._isPending();\n};\n\nPromise.prototype.isRejected = function() {\n    return this._target()._isRejected();\n};\n\nPromise.prototype.isFulfilled = function() {\n    return this._target()._isFulfilled();\n};\n\nPromise.prototype.isResolved = function() {\n    return this._target()._isResolved();\n};\n\nPromise.prototype._value = function() {\n    return this._settledValue;\n};\n\nPromise.prototype._reason = function() {\n    this._unsetRejectionIsUnhandled();\n    return this._settledValue;\n};\n\nPromise.prototype.value = function() {\n    var target = this._target();\n    if (!target.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/hc1DLj\\u000a\");\n    }\n    return target._settledValue;\n};\n\nPromise.prototype.reason = function() {\n    var target = this._target();\n    if (!target.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/hPuiwB\\u000a\");\n    }\n    target._unsetRejectionIsUnhandled();\n    return target._settledValue;\n};\n\n\nPromise.PromiseInspection = PromiseInspection;\n};\n\n},{}],35:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar errorObj = util.errorObj;\nvar isObject = util.isObject;\n\nfunction tryConvertToPromise(obj, context) {\n    if (isObject(obj)) {\n        if (obj instanceof Promise) {\n            return obj;\n        }\n        else if (isAnyBluebirdPromise(obj)) {\n            var ret = new Promise(INTERNAL);\n            obj._then(\n                ret._fulfillUnchecked,\n                ret._rejectUncheckedCheckError,\n                ret._progressUnchecked,\n                ret,\n                null\n            );\n            return ret;\n        }\n        var then = util.tryCatch(getThen)(obj);\n        if (then === errorObj) {\n            if (context) context._pushContext();\n            var ret = Promise.reject(then.e);\n            if (context) context._popContext();\n            return ret;\n        } else if (typeof then === \"function\") {\n            return doThenable(obj, then, context);\n        }\n    }\n    return obj;\n}\n\nfunction getThen(obj) {\n    return obj.then;\n}\n\nvar hasProp = {}.hasOwnProperty;\nfunction isAnyBluebirdPromise(obj) {\n    return hasProp.call(obj, \"_promise0\");\n}\n\nfunction doThenable(x, then, context) {\n    var promise = new Promise(INTERNAL);\n    var ret = promise;\n    if (context) context._pushContext();\n    promise._captureStackTrace();\n    if (context) context._popContext();\n    var synchronous = true;\n    var result = util.tryCatch(then).call(x,\n                                        resolveFromThenable,\n                                        rejectFromThenable,\n                                        progressFromThenable);\n    synchronous = false;\n    if (promise && result === errorObj) {\n        promise._rejectCallback(result.e, true, true);\n        promise = null;\n    }\n\n    function resolveFromThenable(value) {\n        if (!promise) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }\n\n    function rejectFromThenable(reason) {\n        if (!promise) return;\n        promise._rejectCallback(reason, synchronous, true);\n        promise = null;\n    }\n\n    function progressFromThenable(value) {\n        if (!promise) return;\n        if (typeof promise._progress === \"function\") {\n            promise._progress(value);\n        }\n    }\n    return ret;\n}\n\nreturn tryConvertToPromise;\n};\n\n},{\"./util.js\":38}],36:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = _dereq_(\"./util.js\");\nvar TimeoutError = Promise.TimeoutError;\n\nvar afterTimeout = function (promise, message) {\n    if (!promise.isPending()) return;\n    \n    var err;\n    if(!util.isPrimitive(message) && (message instanceof Error)) {\n        err = message;\n    } else {\n        if (typeof message !== \"string\") {\n            message = \"operation timed out\";\n        }\n        err = new TimeoutError(message);\n    }\n    util.markAsOriginatingFromRejection(err);\n    promise._attachExtraTrace(err);\n    promise._cancel(err);\n};\n\nvar afterValue = function(value) { return delay(+this).thenReturn(value); };\nvar delay = Promise.delay = function (value, ms) {\n    if (ms === undefined) {\n        ms = value;\n        value = undefined;\n        var ret = new Promise(INTERNAL);\n        setTimeout(function() { ret._fulfill(); }, ms);\n        return ret;\n    }\n    ms = +ms;\n    return Promise.resolve(value)._then(afterValue, null, null, ms, undefined);\n};\n\nPromise.prototype.delay = function (ms) {\n    return delay(this, ms);\n};\n\nfunction successClear(value) {\n    var handle = this;\n    if (handle instanceof Number) handle = +handle;\n    clearTimeout(handle);\n    return value;\n}\n\nfunction failureClear(reason) {\n    var handle = this;\n    if (handle instanceof Number) handle = +handle;\n    clearTimeout(handle);\n    throw reason;\n}\n\nPromise.prototype.timeout = function (ms, message) {\n    ms = +ms;\n    var ret = this.then().cancellable();\n    ret._cancellationParent = this;\n    var handle = setTimeout(function timeoutTimeout() {\n        afterTimeout(ret, message);\n    }, ms);\n    return ret._then(successClear, failureClear, undefined, handle, undefined);\n};\n\n};\n\n},{\"./util.js\":38}],37:[function(_dereq_,module,exports){\n\"use strict\";\nmodule.exports = function (Promise, apiRejection, tryConvertToPromise,\n    createContext) {\n    var TypeError = _dereq_(\"./errors.js\").TypeError;\n    var inherits = _dereq_(\"./util.js\").inherits;\n    var PromiseInspection = Promise.PromiseInspection;\n\n    function inspectionMapper(inspections) {\n        var len = inspections.length;\n        for (var i = 0; i < len; ++i) {\n            var inspection = inspections[i];\n            if (inspection.isRejected()) {\n                return Promise.reject(inspection.error());\n            }\n            inspections[i] = inspection._settledValue;\n        }\n        return inspections;\n    }\n\n    function thrower(e) {\n        setTimeout(function(){throw e;}, 0);\n    }\n\n    function castPreservingDisposable(thenable) {\n        var maybePromise = tryConvertToPromise(thenable);\n        if (maybePromise !== thenable &&\n            typeof thenable._isDisposable === \"function\" &&\n            typeof thenable._getDisposer === \"function\" &&\n            thenable._isDisposable()) {\n            maybePromise._setDisposable(thenable._getDisposer());\n        }\n        return maybePromise;\n    }\n    function dispose(resources, inspection) {\n        var i = 0;\n        var len = resources.length;\n        var ret = Promise.defer();\n        function iterator() {\n            if (i >= len) return ret.resolve();\n            var maybePromise = castPreservingDisposable(resources[i++]);\n            if (maybePromise instanceof Promise &&\n                maybePromise._isDisposable()) {\n                try {\n                    maybePromise = tryConvertToPromise(\n                        maybePromise._getDisposer().tryDispose(inspection),\n                        resources.promise);\n                } catch (e) {\n                    return thrower(e);\n                }\n                if (maybePromise instanceof Promise) {\n                    return maybePromise._then(iterator, thrower,\n                                              null, null, null);\n                }\n            }\n            iterator();\n        }\n        iterator();\n        return ret.promise;\n    }\n\n    function disposerSuccess(value) {\n        var inspection = new PromiseInspection();\n        inspection._settledValue = value;\n        inspection._bitField = 268435456;\n        return dispose(this, inspection).thenReturn(value);\n    }\n\n    function disposerFail(reason) {\n        var inspection = new PromiseInspection();\n        inspection._settledValue = reason;\n        inspection._bitField = 134217728;\n        return dispose(this, inspection).thenThrow(reason);\n    }\n\n    function Disposer(data, promise, context) {\n        this._data = data;\n        this._promise = promise;\n        this._context = context;\n    }\n\n    Disposer.prototype.data = function () {\n        return this._data;\n    };\n\n    Disposer.prototype.promise = function () {\n        return this._promise;\n    };\n\n    Disposer.prototype.resource = function () {\n        if (this.promise().isFulfilled()) {\n            return this.promise().value();\n        }\n        return null;\n    };\n\n    Disposer.prototype.tryDispose = function(inspection) {\n        var resource = this.resource();\n        var context = this._context;\n        if (context !== undefined) context._pushContext();\n        var ret = resource !== null\n            ? this.doDispose(resource, inspection) : null;\n        if (context !== undefined) context._popContext();\n        this._promise._unsetDisposable();\n        this._data = null;\n        return ret;\n    };\n\n    Disposer.isDisposer = function (d) {\n        return (d != null &&\n                typeof d.resource === \"function\" &&\n                typeof d.tryDispose === \"function\");\n    };\n\n    function FunctionDisposer(fn, promise, context) {\n        this.constructor$(fn, promise, context);\n    }\n    inherits(FunctionDisposer, Disposer);\n\n    FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n        var fn = this.data();\n        return fn.call(resource, resource, inspection);\n    };\n\n    function maybeUnwrapDisposer(value) {\n        if (Disposer.isDisposer(value)) {\n            this.resources[this.index]._setDisposable(value);\n            return value.promise();\n        }\n        return value;\n    }\n\n    Promise.using = function () {\n        var len = arguments.length;\n        if (len < 2) return apiRejection(\n                        \"you must pass at least 2 arguments to Promise.using\");\n        var fn = arguments[len - 1];\n        if (typeof fn !== \"function\") return apiRejection(\"fn must be a function\\u000a\\u000a    See http://goo.gl/916lJJ\\u000a\");\n\n        var input;\n        var spreadArgs = true;\n        if (len === 2 && Array.isArray(arguments[0])) {\n            input = arguments[0];\n            len = input.length;\n            spreadArgs = false;\n        } else {\n            input = arguments;\n            len--;\n        }\n        var resources = new Array(len);\n        for (var i = 0; i < len; ++i) {\n            var resource = input[i];\n            if (Disposer.isDisposer(resource)) {\n                var disposer = resource;\n                resource = resource.promise();\n                resource._setDisposable(disposer);\n            } else {\n                var maybePromise = tryConvertToPromise(resource);\n                if (maybePromise instanceof Promise) {\n                    resource =\n                        maybePromise._then(maybeUnwrapDisposer, null, null, {\n                            resources: resources,\n                            index: i\n                    }, undefined);\n                }\n            }\n            resources[i] = resource;\n        }\n\n        var promise = Promise.settle(resources)\n            .then(inspectionMapper)\n            .then(function(vals) {\n                promise._pushContext();\n                var ret;\n                try {\n                    ret = spreadArgs\n                        ? fn.apply(undefined, vals) : fn.call(undefined,  vals);\n                } finally {\n                    promise._popContext();\n                }\n                return ret;\n            })\n            ._then(\n                disposerSuccess, disposerFail, undefined, resources, undefined);\n        resources.promise = promise;\n        return promise;\n    };\n\n    Promise.prototype._setDisposable = function (disposer) {\n        this._bitField = this._bitField | 262144;\n        this._disposer = disposer;\n    };\n\n    Promise.prototype._isDisposable = function () {\n        return (this._bitField & 262144) > 0;\n    };\n\n    Promise.prototype._getDisposer = function () {\n        return this._disposer;\n    };\n\n    Promise.prototype._unsetDisposable = function () {\n        this._bitField = this._bitField & (~262144);\n        this._disposer = undefined;\n    };\n\n    Promise.prototype.disposer = function (fn) {\n        if (typeof fn === \"function\") {\n            return new FunctionDisposer(fn, this, createContext());\n        }\n        throw new TypeError();\n    };\n\n};\n\n},{\"./errors.js\":13,\"./util.js\":38}],38:[function(_dereq_,module,exports){\n\"use strict\";\nvar es5 = _dereq_(\"./es5.js\");\nvar canEvaluate = typeof navigator == \"undefined\";\nvar haveGetters = (function(){\n    try {\n        var o = {};\n        es5.defineProperty(o, \"f\", {\n            get: function () {\n                return 3;\n            }\n        });\n        return o.f === 3;\n    }\n    catch (e) {\n        return false;\n    }\n\n})();\n\nvar errorObj = {e: {}};\nvar tryCatchTarget;\nfunction tryCatcher() {\n    try {\n        var target = tryCatchTarget;\n        tryCatchTarget = null;\n        return target.apply(this, arguments);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n\nvar inherits = function(Child, Parent) {\n    var hasProp = {}.hasOwnProperty;\n\n    function T() {\n        this.constructor = Child;\n        this.constructor$ = Parent;\n        for (var propertyName in Parent.prototype) {\n            if (hasProp.call(Parent.prototype, propertyName) &&\n                propertyName.charAt(propertyName.length-1) !== \"$\"\n           ) {\n                this[propertyName + \"$\"] = Parent.prototype[propertyName];\n            }\n        }\n    }\n    T.prototype = Parent.prototype;\n    Child.prototype = new T();\n    return Child.prototype;\n};\n\n\nfunction isPrimitive(val) {\n    return val == null || val === true || val === false ||\n        typeof val === \"string\" || typeof val === \"number\";\n\n}\n\nfunction isObject(value) {\n    return !isPrimitive(value);\n}\n\nfunction maybeWrapAsError(maybeError) {\n    if (!isPrimitive(maybeError)) return maybeError;\n\n    return new Error(safeToString(maybeError));\n}\n\nfunction withAppended(target, appendee) {\n    var len = target.length;\n    var ret = new Array(len + 1);\n    var i;\n    for (i = 0; i < len; ++i) {\n        ret[i] = target[i];\n    }\n    ret[i] = appendee;\n    return ret;\n}\n\nfunction getDataPropertyOrDefault(obj, key, defaultValue) {\n    if (es5.isES5) {\n        var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n        if (desc != null) {\n            return desc.get == null && desc.set == null\n                    ? desc.value\n                    : defaultValue;\n        }\n    } else {\n        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n    }\n}\n\nfunction notEnumerableProp(obj, name, value) {\n    if (isPrimitive(obj)) return obj;\n    var descriptor = {\n        value: value,\n        configurable: true,\n        enumerable: false,\n        writable: true\n    };\n    es5.defineProperty(obj, name, descriptor);\n    return obj;\n}\n\nfunction thrower(r) {\n    throw r;\n}\n\nvar inheritedDataKeys = (function() {\n    var excludedPrototypes = [\n        Array.prototype,\n        Object.prototype,\n        Function.prototype\n    ];\n\n    var isExcludedProto = function(val) {\n        for (var i = 0; i < excludedPrototypes.length; ++i) {\n            if (excludedPrototypes[i] === val) {\n                return true;\n            }\n        }\n        return false;\n    };\n\n    if (es5.isES5) {\n        var getKeys = Object.getOwnPropertyNames;\n        return function(obj) {\n            var ret = [];\n            var visitedKeys = Object.create(null);\n            while (obj != null && !isExcludedProto(obj)) {\n                var keys;\n                try {\n                    keys = getKeys(obj);\n                } catch (e) {\n                    return ret;\n                }\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (visitedKeys[key]) continue;\n                    visitedKeys[key] = true;\n                    var desc = Object.getOwnPropertyDescriptor(obj, key);\n                    if (desc != null && desc.get == null && desc.set == null) {\n                        ret.push(key);\n                    }\n                }\n                obj = es5.getPrototypeOf(obj);\n            }\n            return ret;\n        };\n    } else {\n        var hasProp = {}.hasOwnProperty;\n        return function(obj) {\n            if (isExcludedProto(obj)) return [];\n            var ret = [];\n\n            /*jshint forin:false */\n            enumeration: for (var key in obj) {\n                if (hasProp.call(obj, key)) {\n                    ret.push(key);\n                } else {\n                    for (var i = 0; i < excludedPrototypes.length; ++i) {\n                        if (hasProp.call(excludedPrototypes[i], key)) {\n                            continue enumeration;\n                        }\n                    }\n                    ret.push(key);\n                }\n            }\n            return ret;\n        };\n    }\n\n})();\n\nvar thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\nfunction isClass(fn) {\n    try {\n        if (typeof fn === \"function\") {\n            var keys = es5.names(fn.prototype);\n\n            var hasMethods = es5.isES5 && keys.length > 1;\n            var hasMethodsOtherThanConstructor = keys.length > 0 &&\n                !(keys.length === 1 && keys[0] === \"constructor\");\n            var hasThisAssignmentAndStaticMethods =\n                thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n            if (hasMethods || hasMethodsOtherThanConstructor ||\n                hasThisAssignmentAndStaticMethods) {\n                return true;\n            }\n        }\n        return false;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction toFastProperties(obj) {\n    /*jshint -W027,-W055,-W031*/\n    function f() {}\n    f.prototype = obj;\n    var l = 8;\n    while (l--) new f();\n    return obj;\n    eval(obj);\n}\n\nvar rident = /^[a-z$_][a-z$_0-9]*$/i;\nfunction isIdentifier(str) {\n    return rident.test(str);\n}\n\nfunction filledRange(count, prefix, suffix) {\n    var ret = new Array(count);\n    for(var i = 0; i < count; ++i) {\n        ret[i] = prefix + i + suffix;\n    }\n    return ret;\n}\n\nfunction safeToString(obj) {\n    try {\n        return obj + \"\";\n    } catch (e) {\n        return \"[no string representation]\";\n    }\n}\n\nfunction markAsOriginatingFromRejection(e) {\n    try {\n        notEnumerableProp(e, \"isOperational\", true);\n    }\n    catch(ignore) {}\n}\n\nfunction originatesFromRejection(e) {\n    if (e == null) return false;\n    return ((e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError) ||\n        e[\"isOperational\"] === true);\n}\n\nfunction canAttachTrace(obj) {\n    return obj instanceof Error && es5.propertyIsWritable(obj, \"stack\");\n}\n\nvar ensureErrorObject = (function() {\n    if (!(\"stack\" in new Error())) {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            try {throw new Error(safeToString(value));}\n            catch(err) {return err;}\n        };\n    } else {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            return new Error(safeToString(value));\n        };\n    }\n})();\n\nfunction classString(obj) {\n    return {}.toString.call(obj);\n}\n\nfunction copyDescriptors(from, to, filter) {\n    var keys = es5.names(from);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        if (filter(key)) {\n            try {\n                es5.defineProperty(to, key, es5.getDescriptor(from, key));\n            } catch (ignore) {}\n        }\n    }\n}\n\nvar ret = {\n    isClass: isClass,\n    isIdentifier: isIdentifier,\n    inheritedDataKeys: inheritedDataKeys,\n    getDataPropertyOrDefault: getDataPropertyOrDefault,\n    thrower: thrower,\n    isArray: es5.isArray,\n    haveGetters: haveGetters,\n    notEnumerableProp: notEnumerableProp,\n    isPrimitive: isPrimitive,\n    isObject: isObject,\n    canEvaluate: canEvaluate,\n    errorObj: errorObj,\n    tryCatch: tryCatch,\n    inherits: inherits,\n    withAppended: withAppended,\n    maybeWrapAsError: maybeWrapAsError,\n    toFastProperties: toFastProperties,\n    filledRange: filledRange,\n    toString: safeToString,\n    canAttachTrace: canAttachTrace,\n    ensureErrorObject: ensureErrorObject,\n    originatesFromRejection: originatesFromRejection,\n    markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n    classString: classString,\n    copyDescriptors: copyDescriptors,\n    hasDevTools: typeof chrome !== \"undefined\" && chrome &&\n                 typeof chrome.loadTimes === \"function\",\n    isNode: typeof process !== \"undefined\" &&\n        classString(process).toLowerCase() === \"[object process]\"\n};\nret.isRecentNode = ret.isNode && (function() {\n    var version = process.versions.node.split(\".\").map(Number);\n    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);\n})();\n\nif (ret.isNode) ret.toFastProperties(process);\n\ntry {throw new Error(); } catch (e) {ret.lastLineError = e;}\nmodule.exports = ret;\n\n},{\"./es5.js\":14}]},{},[4])(4)\n});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/bluebird/js/browser/bluebird.js\n// module id = 256\n// module chunks = 0 1","import { ImmutableStore } from '@opengov/og_flux';\nimport * as Immutable from 'immutable';\n\nconst initialModalState = Immutable.fromJS({\n  showHowTo: false,\n  showTOS: false,\n  showWelcome: null,\n  showBudget101: false,\n  showReportWelcome: true,\n  showTemplateModal: false,\n  showDownloadModal: false,\n  feedback: {\n    showFeedback: false,\n    saving: false,\n    showError: false,\n    errorMessage: null\n  },\n  onboardingTour: {\n    showTour: false,\n    currentStep: 0\n  }\n});\n\nconst ModalStore = new ImmutableStore({\n  getInitialState() {\n    return initialModalState;\n  },\n\n  actions: {\n    SHOW_WELCOME() {\n      return initialModalState.mergeDeep({showWelcome: true});\n    },\n\n    HIDE_WELCOME() {\n      return initialModalState.mergeDeep({showWelcome: false});\n    },\n\n    SHOW_REPORT_WELCOME(state) {\n      return state.mergeDeep({showReportWelcome: true});\n    },\n\n    HIDE_REPORT_WELCOME(state) {\n      return state.mergeDeep({showReportWelcome: false});\n    },\n\n    SHOW_HOWTO() {\n      return initialModalState.mergeDeep({showHowTo: true});\n    },\n\n    HIDE_HOWTO(state) {\n      return state.set('showHowTo', false);\n    },\n\n    SHOW_BUDGET_101(state, action) {\n      if (action && action.persistState) {\n        return state.mergeDeep({showBudget101: true});\n      }\n      return initialModalState.mergeDeep({showBudget101: true});\n    },\n\n    HIDE_BUDGET_101(state) {\n      return state.set('showBudget101', false);\n    },\n\n    SHOW_TOS() {\n      return initialModalState.mergeDeep({showTOS: true});\n    },\n\n    HIDE_TOS(state) {\n      return state.set('showTOS', false);\n    },\n\n    SHOW_FEEDBACK_FORM() {\n      return initialModalState.mergeDeep({feedback: {showFeedback: true}});\n    },\n\n    HIDE_FEEDBACK_FORM(state) {\n      return state.mergeDeep({feedback: {showFeedback: false, showError: false}});\n    },\n\n    SHOW_FEEDBACK_ERROR(state, action) {\n      return state.mergeDeep({feedback: {showError: true, errorMessage: action.errorMessage}});\n    },\n\n    FEEDBACK_SAVING(state) {\n      return state.mergeDeep({feedback: {saving: true}});\n    },\n\n    FEEDBACK_SAVED() {\n      return initialModalState;\n    },\n\n    SHOW_DOWNLOAD() {\n      return initialModalState.mergeDeep({showDownloadModal: true});\n    },\n\n    HIDE_DOWNLOAD(state) {\n      return state.set('showDownloadModal', false);\n    },\n  }\n});\n\nexport default ModalStore;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/modal_store.ts","import $ from 'jquery';\nimport * as og from '../og';\n\nexport default og.View.extend({\n  template: 'modal-recoverable-error',\n\n  initialize(options) {\n    this.suppressRemoval = options.suppressRemoval;\n  },\n\n  open(message, subtext, buttons) {\n    this.isOpen = true;\n    this.message = message;\n    this.subtext = subtext;\n    this.buttons = buttons;\n    this.render();\n    const self = this;\n    setTimeout(function() {\n      self.$('.js-alert').addClass('active');\n    }, 1);\n  },\n\n  close() {\n    if (this.isOpen) {\n      this.isOpen = false;\n      this.trigger('close');\n      this.$('.js-alert').removeClass('active');\n      const self = this;\n      setTimeout(function() {\n        self.remove();\n      }, 100);\n    }\n  },\n\n  events: {\n    'click .ui-modal__wrapper': function(e) {\n      e.stopPropagation();\n    },\n    'click .js-close': function() {\n      this.close();\n    },\n    'click .js-button': function(e) {\n      this.trigger('button:click', $(e.currentTarget).data('index'));\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/views/recoverable_error.ts","require('./handlebars_helpers');\n\nexport default {\n  'athena/download_menu'            : require('../templates/download_menu.hbs'),\n  'athena/filter-section'           : require('../templates/filter-section.hbs'),\n  'athena/griddle/panel_aggregates' : require('../templates/griddle/panel_aggregates.hbs'),\n  'athena/griddle/panel_columns'    : require('../templates/griddle/panel_columns.hbs'),\n  'athena/griddle/panel_columns_sortable' : require('../templates/griddle/panel_columns_sortable.hbs'),\n  'athena/griddle/panel_filters'    : require('../templates/griddle/panel_filters.hbs'),\n  'athena/griddle/select_box'       : require('../templates/griddle/select_box.hbs'),\n  'athena/griddle_subpanels'        : require('../templates/griddle_subpanels.hbs'),\n  'athena/modal-budget101'          : require('../templates/modal-budget101.hbs'),\n  'athena/modal-faq'                : require('../templates/modal-faq.hbs'),\n  'athena/modal-feedback'           : require('../templates/modal-feedback.hbs'),\n  'athena/modal-download'           : require('../templates/modal-download.hbs'),\n  'athena/modal-password'           : require('../templates/modal-password.hbs'),\n  'athena/modal-recoverable-error'  : require('../templates/modal-recoverable-error.hbs'),\n  'athena/modal-tos'                : require('../templates/modal-tos.hbs'),\n  'athena/modal-unrecoverable-error': require('../templates/modal-unrecoverable-error.hbs'),\n  'athena/modal-welcome'            : require('../templates/modal-welcome.hbs'),\n  'athena/months'                   : require('../templates/months.hbs'),\n  'athena/querygrid/column'         : require('../templates/querygrid/column.hbs'),\n  'athena/querygrid/date'           : require('../templates/querygrid/date.hbs'),\n  'athena/querygrid/monetary'       : require('../templates/querygrid/monetary.hbs'),\n  'athena/querygrid/numeric'        : require('../templates/querygrid/numeric.hbs'),\n  'athena/querygrid/text'           : require('../templates/querygrid/text.hbs')\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/templates.ts","import _ from 'lodash';\nimport Backbone from 'backbone';\n\nclass QueryModel {\n  _updates: any;\n  _q: any;\n  _old_q: any;\n  // This is here because the type definitions for backbone define Backbone.Events as a class\n  // but it's really just an object so extending it with `class X extends Backbone.Events`\n  // fails because Backbone.Events has no constructor\n  trigger: (eventName: string, ...args: any[]) => any;\n  on: (eventName: string, callback?: Function, context?: any) => any;\n  off: (eventName?: string, callback?: Function, context?: any) => any;\n  bind: (eventName: string, callback: Function, context?: any) => any;\n  unbind: (eventName?: string, callback?: Function, context?: any) => any;\n  once: (events: string, callback: Function, context?: any) => any;\n  listenTo: (object: any, events: string, callback: Function) => any;\n  listenToOnce: (object: any, events: string, callback: Function) => any;\n  stopListening: (object?: any, events?: string, callback?: Function) => any;\n\n  constructor(q?) {\n    this._updates = 0;\n    this.setQuery(q, true);\n  }\n\n  /** Use this method when you want to update multiple parts of query triggering only single change event. Call `endUpdate` when you are done. */\n  beginUpdate() {\n    this._updates += 1;\n  }\n/** Call after you are done updating using `beginUpdate`. */\n  endUpdate(silent) {\n    this._updates -= 1;\n    this.triggerUpdate(silent);\n  }\n/** Check if the query was changed and fire events if it was. Mainly used for internal purposes. */\n  triggerUpdate(silent?, force?) {\n    const q = this.toJSON();\n    if (this._updates <= 0 && (!_.isEqual(q, this._old_q) || force)) {\n      this._old_q = q;\n      this.trigger('change');\n      if (!silent) {\n        this.trigger('load', q);\n      }\n    }\n  }\n/** Set query JSON */\n  setQuery(q?, silent?, force?) {\n    this._q = _.extend({\n      fields: [],\n      filter: {},\n      sort: []\n    }, q);\n    this.triggerUpdate(silent, force);\n  }\n/** Get query JSON */\n  getQuery() {\n    return _.cloneDeep(this._q);\n  }\n/** Get query JSON which is usable to serialize for remote API call */\n  toJSON() {\n    const q = _.cloneDeep(this._q) || {};\n    _.each(q.filter || {}, function(val, key) {\n    // remove operators with empty values\n      _.each(val, function(value, op) {\n        if (value === undefined || value === null || value === '') {\n          delete q.filter[key][op];\n        }\n      });\n    // remove fields with no operators\n      if (_.isEmpty(val)) {\n        delete q.filter[key];\n      }\n    });\n    _.each(['fields', 'filter', 'sort'], function(attr) {\n      if (_.isEmpty(q[attr])) {\n        delete q[attr];\n      }\n    });\n    return q;\n  }\n\n/** Sets the account_code filter object {long_tree_id:[[acc_code],[acc_code2],...], long_tree_id2:[[acc_code],[acc_code2],...]} */\n  setAccountCodeQuery(acobject) {\n    this._q.account_codes = acobject;\n    this.triggerUpdate();\n  }\n\n  getAccountCodeQuery() {\n    return this._q.account_codes;\n  }\n\n  setLinkageNodes(linkageNodes, maskNodesForLinkage) {\n    this._q.linkage_nodes = linkageNodes;\n    this._q.mask_nodes_for_linkage = maskNodesForLinkage;\n    this.triggerUpdate();\n  }\n\n/** Sets the field clause */\n  fields(fields) {\n    this._q.fields = fields;\n    this.triggerUpdate();\n  }\n/** Gets the field clause */\n  getFields() {\n    return this._q.fields;\n  }\n/** Sets the sort clause */\n  sort(fields) {\n    this._q.sort = [];\n    if (fields && fields.length) {\n      this._q.sort = fields;\n    }\n    this.triggerUpdate();\n  }\n/** Gets the sort clause */\n  getSort() {\n    return this._q.sort;\n  }\n\n/** Gets parts of the query corresponding to the given column */\n  getColumnQuery(col) {\n    const ret: { sort?, filter? } = {};\n    const sort = _.filter(this._q.sort || [], function(x) {\n      return col in x;\n    });\n    if (sort.length) {\n      ret.sort = sort[0][col];\n    }\n    ret.filter = ((this._q.filter || {})[col]) || {};\n    return ret;\n  }\n/** Sets given filter for column. If the value is `undefined`, then filter is removed. */\n  filterColumn(column, operator, value) {\n    const col = this._q.filter[column] = this._q.filter[column] || {};\n    if (value !== undefined) {\n      col[operator] = value;\n    } else {\n      delete col[operator];\n    }\n  }\n/** Set sorting by a column */\n  sortColumn(field, order) {\n  // For now force only a single column to be sorted to avoid out-of-index sorting\n    if (order) {\n      const obj = {};\n      obj[field] = order;\n      this.sort([obj]);\n    } else {\n      this.sort([]);\n    }\n    this.triggerUpdate();\n  }\n/** Clear all filters */\n  filterClear() {\n    this._q.filter = {};\n    this.triggerUpdate();\n  }\n}\n\n// mix-in Backbone Events\n_.extend(QueryModel.prototype, Backbone.Events);\n\nexport default QueryModel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/querymodel.ts","export const currentLimits = ['population_served', 'population', 'unemployment_rate', 'percent_in_labor_force', 'percent_individuals_poverty', 'median_income_household', 'mean_income_household', 'income_per_capita', 'burglaries', 'thefts', 'police_dept_civilians', 'police_officers', 'vehicle_thefts', 'assaults', 'robberies'];\nexport const scaleLimit = ['population_served', 'population', 'police_officers'];\nexport const compatibleReports = ['annual'];\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/metric_data_constants.ts","import cookies from 'cookies-js';\n\nconst cookieHelper = {\n  setVisitedCookie(name) {\n    cookies.set(name, true, {domain: this.parentDomain(), expires: 31556926});\n  },\n\n  unsetVisitedCookie(name) {\n    cookies.expire(name, {domain: this.parentDomain()});\n  },\n\n  parentDomain() {\n    //get domain without subdomain\n    return document.domain.replace(/^[^\\.]+\\./, '');\n  }\n};\n\nexport default cookieHelper;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/cookie_helper.ts","import _ from 'lodash';\nimport Backbone from 'backbone';\n\n/** @class RemoteModel */\nfunction RemoteModel(options) {\n  this.options = _.extend({}, this.options, options);\n  this.queryModel = options.queryModel;\n  this.data = {\n    length: 0\n  };\n}\n\n_.extend(RemoteModel.prototype, Backbone.Events,\n/** @lends RemoteModel# */\n  {\n    options: {\n      pageSize: 1000,\n      scrollOffset: 0,\n      lookaheadRatio: 0,\n      requestDelay: 50\n    },\n    requestHandle: null,\n    queryModel: null,\n    req: null, // ajax this.request\n  /**\n   * Array-like object containing loaded data.\n   * @member\n   */\n    data: null,\n    count: null,\n  // dataLength keeps an accurate number of current rows\n  // data.length is indication for grid and contains some empty rows for buffer\n    dataLength: 0,\n\n  /**\n   * Clear stored data.\n   * It is useful when query changes and results need to be reloaded.\n   */\n    clear() {\n      for (let key in this.data) {\n        delete this.data[key];\n      }\n      this.dataLength = 0;\n      this.data.length = 0;\n      this.count = null;\n    },\n  /**\n   * Ensure that the data for a given range is available.\n   * If not then request is made. It is usefull to hook this method when viewport of the grid changes.\n   */\n    ensureData(from, to) {\n      const range = this.computeRange(from, to);\n      if (!range) {\n        return;\n      }\n\n      if (this.req) {\n        for (let i = this.req.range.fromPage; i <= this.req.range.toPage; i++) {\n          this.data[i * this.options.pageSize] = undefined;\n        }\n        this.req.abort();\n        this.req = null;\n      }\n\n    // get query with specified pagination\n      const q = _.extend(this.queryModel.toJSON(), {\n        offset: range.fromPage * this.options.pageSize,\n        limit: (range.toPage - range.fromPage + 1) * this.options.pageSize\n      });\n\n      this.processQuery(q);\n\n      if (this.requestHandle !== null) {\n        clearTimeout(this.requestHandle);\n      }\n      this.requestHandle = setTimeout(_.bind(this.sendRequest, this, q, range), this.options.requestDelay);\n    },\n    processQuery(q) {\n    // if there is a virtual `text` operator, replace it with `eq`\n    // then in onSuccess handler we will decide if we're gonna keep it\n      if (q.filter) {\n        for (let column in q.filter) {\n          const obj = q.filter[column];\n          if ('text' in obj) {\n            obj.eq = obj.text;\n            delete obj.text;\n          }\n        }\n      }\n    },\n  /**\n   * Computes pages that need to be load for a given viewport range.\n   * @protected\n   */\n    computeRange(from, to, lookahead) {\n      if (from < 0) {\n        from = 0;\n      }\n\n      let fromPage = Math.floor(from / this.options.pageSize);\n      let toPage = Math.floor(to / this.options.pageSize);\n\n    // skip already loaded pages\n      while (this.data[fromPage * this.options.pageSize] !== undefined && fromPage < toPage) {\n        fromPage++;\n      }\n      while (this.data[toPage * this.options.pageSize] !== undefined && fromPage < toPage) {\n        toPage--;\n      }\n\n      if ((fromPage === toPage) && this.data[fromPage * this.options.pageSize] !== undefined && this.dataLength >= to) {\n        if (!lookahead && to % this.options.pageSize > this.options.pageSize * this.options.lookaheadRatio) {\n          return this.computeRange(from + this.options.pageSize, to + this.options.pageSize, true);\n        }\n        return null;\n      }\n\n      return {\n        from: from < 0 ? 0 : from,\n        to,\n        toPage,\n        fromPage\n      };\n    },\n  /**\n   * Send request for a given query using AJAX.\n   * @protected\n   */\n    sendRequest(q, range) {\n      for (let i = range.fromPage; i <= range.toPage; i++) {\n      // null indicates a 'this.requested but not available yet'\n        this.data[i * this.options.pageSize] = null;\n      }\n\n      this.trigger('loading', range);\n\n      this.req = this.options.endpoint(q, (err, response) => {\n        if (err) {\n          this.onError(range, q);\n        } else {\n          this.onSuccess(range, q, response.body);\n        }\n      });\n\n      this.req.range = range;\n    },\n  /**\n   * Handle successfull request.\n   * @protected\n   */\n    onSuccess(range, q, resp) {\n      const from = range.fromPage * this.options.pageSize;\n      const to = from + resp.transactions.length;\n\n      // detect if there is a virtual `text` operator in query\n      // if it is and result is not empty, we keep it as `eq`\n      // otherwise change it to `contains` and do another query\n      q = this.queryModel.toJSON();\n      if (q.filter) {\n        for (let column in q.filter) {\n          const obj = q.filter[column];\n          if ('text' in obj) {\n            if (resp.transactions.length === 0) {\n              obj.contains = obj.text;\n              delete obj.text;\n              this.queryModel.setQuery(q);\n              return;\n            } else {\n              obj.eq = obj.text;\n              delete obj.text;\n              this.queryModel.setQuery(q, true);\n            }\n          }\n        }\n      }\n\n      if (resp.transactions.length > 0) {\n      // Don't use 'resp.count;' since the user could scroll to a very\n      // distant row which will take a while to query for. Add a scroll buffer to this length\n        this.dataLength = Math.max(to, this.dataLength);\n      }\n      this.data.length = this.dataLength;\n\n      if (resp.transactions.length < this.options.pageSize) {\n      // we've reached the end and have final count\n        this.count = this.data.length;\n      } else {\n      // add some empty rows to the bottom so user have a buffer for smoother scrolling\n        this.data.length += this.options.scrollOffset;\n      }\n\n      for (let i = 0; i < resp.transactions.length; i++) {\n        this.data[from + i] = resp.transactions[i];\n        this.data[from + i].index = from + i;\n      }\n\n      this.req = null;\n      this.trigger('loaded', {\n        from,\n        to,\n        reqsize: this.options.pageSize,\n        count: this.count,\n        total_count_estimate: resp.total_count_estimate,\n        q,\n        data: resp.transactions\n      });\n    },\n  /**\n   * Handle request error\n   * @protected\n   */\n    onError(range, q, status) {\n      if (status !== 'abort') {\n        this.trigger('error', range);\n      }\n      this.req = null;\n    }\n\n  });\n\nexport default RemoteModel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/remotemodel.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport Backbone from 'backbone';\n\nimport utils from '../utils';\nimport GridReportActions from '../../actions/grid_report_actions';\n\n/** @class ContextMenu */\nfunction ContextMenu(options) {\n  this.options = _.extend({\n    container: $('body')\n  }, options);\n  _.bindAll(this, 'handleContextMenu', 'handleClick', 'hideMenu');\n}\n\n_.extend(ContextMenu.prototype, Backbone.Events,\n/** @lends ContextMenu# */\n  {\n    queryModel: null,\n    grid: null,\n    handler: null,\n    menu: null,\n    choices: {\n      text: [\n        {\n          label: 'Search for ',\n          operator: 'eq'\n        }\n      ],\n      date: [\n        {\n          label: 'At or Before ',\n          operator: 'le'\n        },\n        {\n          label: 'On ',\n          operator: 'eq'\n        },\n        {\n          label: 'At or After ',\n          operator: 'ge'\n        }\n      ],\n      default: [\n        {\n          label: 'At Most ',\n          operator: 'le'\n        },\n        {\n          label: 'Equal to ',\n          operator: 'eq'\n        },\n        {\n          label: 'At Least ',\n          operator: 'ge'\n        }\n      ],\n      blank: [\n        {\n          label: 'Search for Blank Cells',\n          operator: 'null',\n          value: true\n        },\n        {\n          label: 'Search for Non-Blanks',\n          operator: 'notnull',\n          value: true\n        }\n      ]\n    },\n  /** Initialize the plugin, called by slicgrid when registering */\n    init(grid) {\n      this.queryModel = this.options.queryModel;\n      this.grid = grid;\n      this.grid.on('click', this.handleContextMenu, this);\n    },\n  /** Destroy the plugin, called by slickgrid */\n    destroy() {\n      this.menu.remove();\n    },\n  /** handler when the menu is clicked\n      @protected */\n    handleClick(ev) {\n      const data = $(ev.currentTarget).data();\n      GridReportActions.filterColumn(data.column.id, data.operator, data.value);\n      this.trigger('action', 'filter-' + data.operator, data.column.id);\n      this.hideMenu();\n    },\n  /** handler when menu is invoked, renders and displays the menu\n      @protected */\n    handleContextMenu(e) {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n\n      if (this.grid.options.showDropdown) {\n        this.hideMenu();\n        this.menu = $('<div class=\"ui-dropdown__target griddle-context-menu ready\"></div>');\n\n        var menu = this.menu;\n        var cell = this.grid.getCellFromEvent(e);\n        var column = this.grid.getColumns()[cell.cell];\n        var cellValue = this.grid.getDataItem(cell.row)[column.id];\n        var choices = this.choices[column.type] || this.choices['default'];\n        var formatter = utils.getSimpleFormatter(column, this.grid.locale);\n\n        if (cellValue == null) {\n          choices = this.choices.blank;\n        }\n\n        _.each(choices, function(choice) {\n          const elementData: any = _.extend({\n            column\n          }, choice);\n\n          if (cellValue != null) {\n            elementData.label += formatter(cellValue);\n            elementData.value = cellValue;\n          }\n\n          $('<div class=\"dropdown__row js-select-option\"></div>')\n          .data(elementData)\n          .text(elementData.label)\n          .appendTo(menu);\n        });\n\n        this.grid.trigger('dropdownOpened', this);\n\n        this.menu\n        .appendTo(this.options.container)\n        .on('click', '.js-select-option', this.handleClick)\n        .position({\n          of: e,\n          my: 'left top-10',\n          at: 'center middle',\n          collision: 'flipfit',\n          using: this.options.positionCallback ? this.options.positionCallback : null\n        })\n        .css({'top': e.pageY})\n        .addClass('open');\n      }\n    },\n  /** Hide the menu and remove its element from DOM */\n    hideMenu() {\n      if (this.menu) {\n        this.menu.remove();\n        this.menu = null;\n      }\n    },\n    isInsideClicked(ev) {\n      return this.menu && $(ev.target).parents().addBack().is(this.menu);\n    }\n  });\n\nexport default ContextMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/contextmenu.ts","import Selector from './selector';\nimport $ from 'jquery';\n\nexport default Selector.extend({\n  close() {\n    Selector.prototype.close.call(this);\n\n    const dropdown = this.$('.dropdown');\n    dropdown.removeClass('open');\n    setTimeout(function() {\n      dropdown.removeClass('ready');\n    }, 140);\n    $(this).removeClass('active');\n  },\n\n  open() {\n    Selector.prototype.open.call(this);\n    this.selfClicked = true;\n\n    const dropdown = this.$('.dropdown');\n    dropdown.addClass('ready');\n    setTimeout(function() {\n      dropdown.addClass('open');\n    }, 1);\n    $(this).addClass('active');\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/views/sort_selector.ts","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar defaultOptions = {\n  wait: false,\n  withRef: false,\n  bindI18n: 'languageChanged loaded',\n  bindStore: 'added removed',\n  translateFuncName: 't',\n  nsMode: 'default',\n  usePureComponent: false\n};\n\nvar i18n = void 0;\n\nexport function setDefaults(options) {\n  defaultOptions = _extends({}, defaultOptions, options);\n}\n\nexport function getDefaults() {\n  return defaultOptions;\n}\n\nexport function setI18n(instance) {\n  i18n = instance;\n}\n\nexport function getI18n() {\n  return i18n;\n}\n\nexport var reactI18nextModule = {\n  type: '3rdParty',\n\n  init: function init(instance) {\n    setDefaults(instance.options.react);\n    setI18n(instance);\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/context.js\n// module id = 266\n// module chunks = 0 1","'use strict';\n\nif (typeof module !== 'undefined' && module.exports) {\n    module.exports = isSupported;\n} else if (window) {\n    window.mapboxgl = window.mapboxgl || {};\n    window.mapboxgl.supported = isSupported;\n}\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n    return !!(\n        isBrowser() &&\n        isArraySupported() &&\n        isFunctionSupported() &&\n        isObjectSupported() &&\n        isJSONSupported() &&\n        isWorkerSupported() &&\n        isUint8ClampedArraySupported() &&\n        isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)\n    );\n}\n\nfunction isBrowser() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isArraySupported() {\n    return (\n        Array.prototype &&\n        Array.prototype.every &&\n        Array.prototype.filter &&\n        Array.prototype.forEach &&\n        Array.prototype.indexOf &&\n        Array.prototype.lastIndexOf &&\n        Array.prototype.map &&\n        Array.prototype.some &&\n        Array.prototype.reduce &&\n        Array.prototype.reduceRight &&\n        Array.isArray\n    );\n}\n\nfunction isFunctionSupported() {\n    return Function.prototype && Function.prototype.bind;\n}\n\nfunction isObjectSupported() {\n    return (\n        Object.keys &&\n        Object.create &&\n        Object.getPrototypeOf &&\n        Object.getOwnPropertyNames &&\n        Object.isSealed &&\n        Object.isFrozen &&\n        Object.isExtensible &&\n        Object.getOwnPropertyDescriptor &&\n        Object.defineProperty &&\n        Object.defineProperties &&\n        Object.seal &&\n        Object.freeze &&\n        Object.preventExtensions\n    );\n}\n\nfunction isJSONSupported() {\n    return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n}\n\nfunction isWorkerSupported() {\n    return 'Worker' in window;\n}\n\n// IE11 only supports `Uint8ClampedArray` as of version\n// [KB2929437](https://support.microsoft.com/en-us/kb/2929437)\nfunction isUint8ClampedArraySupported() {\n    return 'Uint8ClampedArray' in window;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n    if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n        isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n    }\n\n    return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n    antialias: false,\n    alpha: true,\n    stencil: true,\n    depth: true\n};\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n\n    var canvas = document.createElement('canvas');\n\n    var attributes = Object.create(isSupported.webGLContextAttributes);\n    attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n    if (canvas.probablySupportsContext) {\n        return (\n            canvas.probablySupportsContext('webgl', attributes) ||\n            canvas.probablySupportsContext('experimental-webgl', attributes)\n        );\n\n    } else if (canvas.supportsContext) {\n        return (\n            canvas.supportsContext('webgl', attributes) ||\n            canvas.supportsContext('experimental-webgl', attributes)\n        );\n\n    } else {\n        return (\n            canvas.getContext('webgl', attributes) ||\n            canvas.getContext('experimental-webgl', attributes)\n        );\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-supported/index.js\n// module id = 267\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _function = require('./function');\n\nvar _function2 = _interopRequireDefault(_function);\n\nexports['default'] = {\n  shouldComponentUpdate: _function2['default']\n};\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-pure-render/mixin.js\n// module id = 268\n// module chunks = 0 1","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors ||\n  function getOwnPropertyDescriptors(obj) {\n    var keys = Object.keys(obj);\n    var descriptors = {};\n    for (var i = 0; i < keys.length; i++) {\n      descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n    }\n    return descriptors;\n  };\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  if (typeof process !== 'undefined' && process.noDeprecation === true) {\n    return fn;\n  }\n\n  // Allow for deprecating things in the process of starting up.\n  if (typeof process === 'undefined') {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined;\n\nexports.promisify = function promisify(original) {\n  if (typeof original !== 'function')\n    throw new TypeError('The \"original\" argument must be of type Function');\n\n  if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {\n    var fn = original[kCustomPromisifiedSymbol];\n    if (typeof fn !== 'function') {\n      throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');\n    }\n    Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n      value: fn, enumerable: false, writable: false, configurable: true\n    });\n    return fn;\n  }\n\n  function fn() {\n    var promiseResolve, promiseReject;\n    var promise = new Promise(function (resolve, reject) {\n      promiseResolve = resolve;\n      promiseReject = reject;\n    });\n\n    var args = [];\n    for (var i = 0; i < arguments.length; i++) {\n      args.push(arguments[i]);\n    }\n    args.push(function (err, value) {\n      if (err) {\n        promiseReject(err);\n      } else {\n        promiseResolve(value);\n      }\n    });\n\n    try {\n      original.apply(this, args);\n    } catch (err) {\n      promiseReject(err);\n    }\n\n    return promise;\n  }\n\n  Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n  if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n    value: fn, enumerable: false, writable: false, configurable: true\n  });\n  return Object.defineProperties(\n    fn,\n    getOwnPropertyDescriptors(original)\n  );\n}\n\nexports.promisify.custom = kCustomPromisifiedSymbol\n\nfunction callbackifyOnRejected(reason, cb) {\n  // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M).\n  // Because `null` is a special error value in callbacks which means \"no error\n  // occurred\", we error-wrap so the callback consumer can distinguish between\n  // \"the promise rejected with null\" or \"the promise fulfilled with undefined\".\n  if (!reason) {\n    var newReason = new Error('Promise was rejected with a falsy value');\n    newReason.reason = reason;\n    reason = newReason;\n  }\n  return cb(reason);\n}\n\nfunction callbackify(original) {\n  if (typeof original !== 'function') {\n    throw new TypeError('The \"original\" argument must be of type Function');\n  }\n\n  // We DO NOT return the promise as it gives the user a false sense that\n  // the promise is actually somehow related to the callback's execution\n  // and that the callback throwing will reject the promise.\n  function callbackified() {\n    var args = [];\n    for (var i = 0; i < arguments.length; i++) {\n      args.push(arguments[i]);\n    }\n\n    var maybeCb = args.pop();\n    if (typeof maybeCb !== 'function') {\n      throw new TypeError('The last argument must be of type Function');\n    }\n    var self = this;\n    var cb = function() {\n      return maybeCb.apply(self, arguments);\n    };\n    // In true node style we process the callback on `nextTick` with all the\n    // implications (stack, `uncaughtException`, `async_hooks`)\n    original.apply(this, args)\n      .then(function(ret) { process.nextTick(cb, null, ret) },\n            function(rej) { process.nextTick(callbackifyOnRejected, rej, cb) });\n  }\n\n  Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));\n  Object.defineProperties(callbackified,\n                          getOwnPropertyDescriptors(original));\n  return callbackified;\n}\nexports.callbackify = callbackify;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/node-libs-browser/node_modules/util/util.js\n// module id = 269\n// module chunks = 0 1","/**\n * @copyright 2015, Andrey Popp <8mayday@gmail.com>\n *\n * The decorator may be used on classes or methods\n * ```\n * @autobind\n * class FullBound {}\n *\n * class PartBound {\n *   @autobind\n *   method () {}\n * }\n * ```\n */\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\nexports['default'] = autobind;\n\nfunction autobind() {\n  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  if (args.length === 1) {\n    return boundClass.apply(undefined, args);\n  } else {\n    return boundMethod.apply(undefined, args);\n  }\n}\n\n/**\n * Use boundMethod to bind all methods on the target.prototype\n */\nfunction boundClass(target) {\n  // (Using reflect to get all keys including symbols)\n  var keys = undefined;\n  // Use Reflect if exists\n  if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') {\n    keys = Reflect.ownKeys(target.prototype);\n  } else {\n    keys = Object.getOwnPropertyNames(target.prototype);\n    // use symbols if support is provided\n    if (typeof Object.getOwnPropertySymbols === 'function') {\n      keys = keys.concat(Object.getOwnPropertySymbols(target.prototype));\n    }\n  }\n\n  keys.forEach(function (key) {\n    // Ignore special case target method\n    if (key === 'constructor') {\n      return;\n    }\n\n    var descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);\n\n    // Only methods need binding\n    if (typeof descriptor.value === 'function') {\n      Object.defineProperty(target.prototype, key, boundMethod(target, key, descriptor));\n    }\n  });\n  return target;\n}\n\n/**\n * Return a descriptor removing the value and returning a getter\n * The getter will return a .bind version of the function\n * and memoize the result against a symbol on the instance\n */\nfunction boundMethod(target, key, descriptor) {\n  var fn = descriptor.value;\n\n  if (typeof fn !== 'function') {\n    throw new Error('@autobind decorator can only be applied to methods not: ' + typeof fn);\n  }\n\n  // In IE11 calling Object.defineProperty has a side-effect of evaluating the\n  // getter for the property which is being replaced. This causes infinite\n  // recursion and an \"Out of stack space\" error.\n  var definingProperty = false;\n\n  return {\n    configurable: true,\n    get: function get() {\n      if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {\n        return fn;\n      }\n\n      var boundFn = fn.bind(this);\n      definingProperty = true;\n      Object.defineProperty(this, key, {\n        value: boundFn,\n        configurable: true,\n        writable: true\n      });\n      definingProperty = false;\n      return boundFn;\n    }\n  };\n}\nmodule.exports = exports['default'];\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/autobind-decorator/lib/index.js\n// module id = 270\n// module chunks = 0 1","!function() {\n  var d3 = {\n    version: \"3.5.17\"\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = this.document;\n  function d3_documentElement(node) {\n    return node && (node.ownerDocument || node.document || node).documentElement;\n  }\n  function d3_window(node) {\n    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n  }\n  if (d3_document) {\n    try {\n      d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n    } catch (e) {\n      d3_array = function(list) {\n        var i = list.length, array = new Array(i);\n        while (i--) array[i] = list[i];\n        return array;\n      };\n    }\n  }\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  if (d3_document) {\n    try {\n      d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n    } catch (error) {\n      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n      d3_element_prototype.setAttribute = function(name, value) {\n        d3_element_setAttribute.call(this, name, value + \"\");\n      };\n      d3_element_prototype.setAttributeNS = function(space, local, value) {\n        d3_element_setAttributeNS.call(this, space, local, value + \"\");\n      };\n      d3_style_prototype.setProperty = function(name, value, priority) {\n        d3_style_setProperty.call(this, name, value + \"\", priority);\n      };\n    }\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    if (j) return s / j;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n  };\n  d3.variance = function(array, f) {\n    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    } else {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n    if (j > 1) return s / (j - 1);\n  };\n  d3.deviation = function() {\n    var v = d3.variance.apply(this, arguments);\n    return v ? Math.sqrt(v) : v;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array, i0, i1) {\n    if ((m = arguments.length) < 3) {\n      i1 = array.length;\n      if (m < 2) i0 = 0;\n    }\n    var m = i1 - i0, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.transpose = function(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  };\n  function d3_transposeLength(d) {\n    return d.length;\n  }\n  d3.zip = function() {\n    return d3.transpose(arguments);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object, f) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) {\n      object.forEach(function(key, value) {\n        map.set(key, value);\n      });\n    } else if (Array.isArray(object)) {\n      var i = -1, n = object.length, o;\n      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n    } else {\n      for (var key in object) map.set(key, object[key]);\n    }\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  function d3_identity(d) {\n    return d;\n  }\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatches = function(n, s) {\n    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n    d3_selectMatches = function(n, s) {\n      return d3_selectMatcher.call(n, s);\n    };\n    return d3_selectMatches(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3.select(d3_document.documentElement);\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: d3_nsXhtml,\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) {\n        var node = this.node();\n        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n      }\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    function create() {\n      var document = this.ownerDocument, namespace = this.namespaceURI;\n      return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n    }\n    function createNS() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    }\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(d3_selectionRemove);\n  };\n  function d3_selectionRemove() {\n    var parent = this.parentNode;\n    if (parent) parent.removeChild(this);\n  }\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (node = group[i]) {\n            if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n              exitNodes[i] = node;\n            } else {\n              nodeByKeyValue.set(keyValue, node);\n            }\n            keyValues[i] = keyValue;\n          }\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3.select = function(node) {\n    var group;\n    if (typeof node === \"string\") {\n      group = [ d3_select(node, d3_document) ];\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = [ node ];\n      group.parentNode = d3_documentElement(node);\n    }\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group;\n    if (typeof nodes === \"string\") {\n      group = d3_array(d3_selectAll(nodes, d3_document));\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = d3_array(nodes);\n      group.parentNode = null;\n    }\n    return d3_selection([ group ]);\n  };\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  if (d3_document) {\n    d3_selection_onFilters.forEach(function(k) {\n      if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n    });\n  }\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect, d3_event_dragId = 0;\n  function d3_event_dragSuppress(node) {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect == null) {\n      d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n    }\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        var off = function() {\n          w.on(click, null);\n        };\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0) {\n        var window = d3_window(container);\n        if (window.scrollX || window.scrollY) {\n          svg = d3.select(\"body\").append(\"svg\").style({\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            margin: 0,\n            padding: 0,\n            border: \"none\"\n          }, \"important\");\n          var ctm = svg[0][0].getScreenCTM();\n          d3_mouse_bug44083 = !(ctm.f || ctm.e);\n          svg.remove();\n        }\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n    if (d2 < ε2) {\n      S = Math.log(w1 / w0) / ρ;\n      i = function(t) {\n        return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n      };\n    } else {\n      var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n      S = (r1 - r0) / ρ;\n      i = function(t) {\n        var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      };\n    }\n    i.duration = S * 1e3;\n    return i;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    if (!d3_behavior_zoomWheel) {\n      d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n      }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return d3.event.wheelDelta;\n      }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n        return -d3.event.detail;\n      }, \"MozMousePixelScroll\");\n    }\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"interrupt.zoom\", function() {\n            zoomended(dispatch);\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: null\n      };\n      scaleTo(+_);\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.duration = function(_) {\n      if (!arguments.length) return duration;\n      duration = +_;\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function zoomTo(that, p, l, k) {\n      that.__chart__ = {\n        x: view.x,\n        y: view.y,\n        k: view.k\n      };\n      scaleTo(Math.pow(2, k));\n      translateTo(center0 = p, l);\n      that = d3.select(that);\n      if (duration > 0) that = that.transition().duration(duration);\n      that.call(zoom.event);\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      if (!zooming++) dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      if (!--zooming) dispatch({\n        type: \"zoomend\"\n      }), center0 = null;\n    }\n    function mousedowned() {\n      var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0];\n            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n            d3_eventPreventDefault();\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        d3_selection_interrupt.call(that);\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n      translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) {\n      return rgb(color.r, color.g, color.b);\n    }\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function() {\n    d3_timer.apply(this, arguments);\n  };\n  function d3_timer(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n    return timer;\n  }\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now(), timer = d3_timer_queueHead;\n    while (timer) {\n      if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n      timer = timer.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.c) {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      } else {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value = +value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x + pointRadius, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = xm; else x2 = xm;\n        if (below) y1 = ym; else y2 = ym;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      root.find = function(point) {\n        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n    var minDistance2 = Infinity, closestPoint;\n    (function find(node, x1, y1, x2, y2) {\n      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n      if (point = node.point) {\n        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n        if (distance2 < minDistance2) {\n          var distance = Math.sqrt(minDistance2 = distance2);\n          x0 = x - distance, y0 = y - distance;\n          x3 = x + distance, y3 = y + distance;\n          closestPoint = point;\n        }\n      }\n      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n        if (node = children[i & 3]) switch (i & 3) {\n         case 0:\n          find(node, x1, y1, xm, ym);\n          break;\n\n         case 1:\n          find(node, xm, y1, x2, ym);\n          break;\n\n         case 2:\n          find(node, x1, ym, xm, y2);\n          break;\n\n         case 3:\n          find(node, xm, ym, x2, y2);\n          break;\n        }\n      }\n    })(root, x0, y0, x3, y3);\n    return closestPoint;\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransformPop(s) {\n    return s.length ? s.pop() + \",\" : \"\";\n  }\n  function d3_interpolateTranslate(ta, tb, s, q) {\n    if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n      var i = s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    }\n  }\n  function d3_interpolateRotate(ra, rb, s, q) {\n    if (ra !== rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n    }\n  }\n  function d3_interpolateSkew(wa, wb, s, q) {\n    if (wa !== wb) {\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n    }\n  }\n  function d3_interpolateScale(ka, kb, s, q) {\n    if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n      var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] !== 1 || kb[1] !== 1) {\n      s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n    }\n  }\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [];\n    a = d3.transform(a), b = d3.transform(b);\n    d3_interpolateTranslate(a.translate, b.translate, s, q);\n    d3_interpolateRotate(a.rotate, b.rotate, s, q);\n    d3_interpolateSkew(a.skew, b.skew, s, q);\n    d3_interpolateScale(a.scale, b.scale, s, q);\n    a = b = null;\n    return function(t) {\n      var i = -1, n = q.length, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: groupSums[di]\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        timer = null;\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) {\n          alpha = x;\n        } else {\n          timer.c = null, timer.t = NaN, timer = null;\n          event.end({\n            type: \"end\",\n            alpha: alpha = 0\n          });\n        }\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        timer = d3_timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, l = candidates.length, x;\n        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n    function pie(data) {\n      var n = data.length, values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      index.forEach(function(i) {\n        arcs[i] = {\n          data: data[i],\n          value: v = values[i],\n          startAngle: a,\n          endAngle: a += v * k + pa,\n          padAngle: p\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(_) {\n      if (!arguments.length) return value;\n      value = _;\n      return pie;\n    };\n    pie.sort = function(_) {\n      if (!arguments.length) return sort;\n      sort = _;\n      return pie;\n    };\n    pie.startAngle = function(_) {\n      if (!arguments.length) return startAngle;\n      startAngle = _;\n      return pie;\n    };\n    pie.endAngle = function(_) {\n      if (!arguments.length) return endAngle;\n      endAngle = _;\n      return pie;\n    };\n    pie.padAngle = function(_) {\n      if (!arguments.length) return padAngle;\n      padAngle = _;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = root.y = 0;\n      if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    return domain;\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(1, base * n / scale.ticks().length);\n      return function(d) {\n        var i = d / pow(Math.round(log(d)));\n        if (i * base < base - .5) i *= base;\n        return i <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n      0) : (stop - start) / (domain.length - 1 + padding);\n      range = steps(start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundPoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n      0) : (stop - start) / (domain.length - 1 + padding) | 0;\n      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangeRoundPoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  function d3_zero() {\n    return 0;\n  }\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n    function arc() {\n      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n        if (!cw) p1 *= -1;\n        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n      }\n      if (r1) {\n        x0 = r1 * Math.cos(a0 + p1);\n        y0 = r1 * Math.sin(a0 + p1);\n        x1 = r1 * Math.cos(a1 - p1);\n        y1 = r1 * Math.sin(a1 - p1);\n        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n          var h1 = (a0 + a1) / 2;\n          x0 = r1 * Math.cos(h1);\n          y0 = r1 * Math.sin(h1);\n          x1 = y1 = null;\n        }\n      } else {\n        x0 = y0 = 0;\n      }\n      if (r0) {\n        x2 = r0 * Math.cos(a1 - p0);\n        y2 = r0 * Math.sin(a1 - p0);\n        x3 = r0 * Math.cos(a0 + p0);\n        y3 = r0 * Math.sin(a0 + p0);\n        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n          var h0 = (a0 + a1) / 2;\n          x2 = r0 * Math.cos(h0);\n          y2 = r0 * Math.sin(h0);\n          x3 = y3 = null;\n        }\n      } else {\n        x2 = y2 = 0;\n      }\n      if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n        cr = r0 < r1 ^ cw ? 0 : 1;\n        var rc1 = rc, rc0 = rc;\n        if (da < π) {\n          var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n          rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n          rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n        }\n        if (x1 != null) {\n          var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n          if (rc === rc1) {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n          } else {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n          }\n        } else {\n          path.push(\"M\", x0, \",\", y0);\n        }\n        if (x3 != null) {\n          var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n          if (rc === rc0) {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          } else {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          }\n        } else {\n          path.push(\"L\", x2, \",\", y2);\n        }\n      } else {\n        path.push(\"M\", x0, \",\", y0);\n        if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n        path.push(\"L\", x2, \",\", y2);\n        if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n      }\n      path.push(\"Z\");\n      return path.join(\"\");\n    }\n    function circleSegment(r1, cw) {\n      return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.cornerRadius = function(v) {\n      if (!arguments.length) return cornerRadius;\n      cornerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.padRadius = function(v) {\n      if (!arguments.length) return padRadius;\n      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.padAngle = function(v) {\n      if (!arguments.length) return padAngle;\n      padAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcAuto = \"auto\";\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function d3_svg_arcSweep(x0, y0, x1, y1) {\n    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n  }\n  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return points.join(\"L\") + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] - halfπ;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  d3_selectionPrototype.transition = function(name) {\n    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_selectionPrototype.interrupt = function(name) {\n    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n  };\n  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n  function d3_selection_interruptNS(ns) {\n    return function() {\n      var lock, activeId, active;\n      if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        if (--lock.count) delete lock[activeId]; else delete this[ns];\n        lock.active += .5;\n        active.event && active.event.interrupt.call(this, this.__data__, active.index);\n      }\n    };\n  }\n  function d3_transition(groups, ns, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.namespace = ns;\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection, name) {\n    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node[ns][id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.namespace, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node[ns][id].tween.remove(name);\n    } : function(node) {\n      node[ns][id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id, ns = groups.namespace;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node[ns][id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    var ns = this.namespace;\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node[ns][id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node[ns][id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node[ns][id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      try {\n        d3_transitionInheritId = id;\n        d3_selection_each(this, function(node, i, j) {\n          d3_transitionInherit = node[ns][id];\n          type.call(node, node.__data__, i, j);\n        });\n      } finally {\n        d3_transitionInherit = inherit;\n        d3_transitionInheritId = inheritId;\n      }\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node[ns][id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = node[ns][id0];\n          d3_transitionNode(node, i, ns, id1, {\n            time: transition.time,\n            ease: transition.ease,\n            delay: transition.delay + transition.duration,\n            duration: transition.duration\n          });\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id1);\n  };\n  function d3_transitionNamespace(name) {\n    return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n  }\n  function d3_transitionNode(node, i, ns, id, inherit) {\n    var lock = node[ns] || (node[ns] = {\n      active: 0,\n      count: 0\n    }), transition = lock[id], time, timer, duration, ease, tweens;\n    function schedule(elapsed) {\n      var delay = transition.delay;\n      timer.t = delay + time;\n      if (delay <= elapsed) return start(elapsed - delay);\n      timer.c = start;\n    }\n    function start(elapsed) {\n      var activeId = lock.active, active = lock[activeId];\n      if (active) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        --lock.count;\n        delete lock[activeId];\n        active.event && active.event.interrupt.call(node, node.__data__, active.index);\n      }\n      for (var cancelId in lock) {\n        if (+cancelId < id) {\n          var cancel = lock[cancelId];\n          cancel.timer.c = null;\n          cancel.timer.t = NaN;\n          --lock.count;\n          delete lock[cancelId];\n        }\n      }\n      timer.c = tick;\n      d3_timer(function() {\n        if (timer.c && tick(elapsed || 1)) {\n          timer.c = null;\n          timer.t = NaN;\n        }\n        return 1;\n      }, 0, time);\n      lock.active = id;\n      transition.event && transition.event.start.call(node, node.__data__, i);\n      tweens = [];\n      transition.tween.forEach(function(key, value) {\n        if (value = value.call(node, node.__data__, i)) {\n          tweens.push(value);\n        }\n      });\n      ease = transition.ease;\n      duration = transition.duration;\n    }\n    function tick(elapsed) {\n      var t = elapsed / duration, e = ease(t), n = tweens.length;\n      while (n > 0) {\n        tweens[--n].call(node, e);\n      }\n      if (t >= 1) {\n        transition.event && transition.event.end.call(node, node.__data__, i);\n        if (--lock.count) delete lock[id]; else delete node[ns];\n        return 1;\n      }\n    }\n    if (!transition) {\n      time = inherit.time;\n      timer = d3_timer(schedule, 0, time);\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        timer: timer,\n        delay: inherit.delay,\n        duration: inherit.duration,\n        ease: inherit.ease,\n        index: i\n      };\n      inherit = null;\n      ++lock.count;\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = d3_array(arguments);\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/d3/d3.js\n// module id = 271\n// module chunks = 0 1","'use strict';\n\n// jshint -W079\nvar mapboxgl = module.exports = {};\n\nmapboxgl.version = require('../package.json').version;\n\nmapboxgl.Map = require('./ui/map');\nmapboxgl.Control = require('./ui/control/control');\nmapboxgl.Navigation = require('./ui/control/navigation');\nmapboxgl.Geolocate = require('./ui/control/geolocate');\nmapboxgl.Attribution = require('./ui/control/attribution');\nmapboxgl.Popup = require('./ui/popup');\n\nmapboxgl.GeoJSONSource = require('./source/geojson_source');\nmapboxgl.VideoSource = require('./source/video_source');\nmapboxgl.ImageSource = require('./source/image_source');\n\nmapboxgl.Style = require('./style/style');\n\nmapboxgl.LngLat = require('./geo/lng_lat');\nmapboxgl.LngLatBounds = require('./geo/lng_lat_bounds');\nmapboxgl.Point = require('point-geometry');\n\nmapboxgl.Evented = require('./util/evented');\nmapboxgl.util = require('./util/util');\n\nmapboxgl.supported = require('./util/browser').supported;\n\nvar ajax = require('./util/ajax');\nmapboxgl.util.getJSON = ajax.getJSON;\nmapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;\n\nvar config = require('./util/config');\nmapboxgl.config = config;\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n    get: function() { return config.ACCESS_TOKEN; },\n    set: function(token) { config.ACCESS_TOKEN = token; }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/mapbox-gl.js\n// module id = 272\n// module chunks = 0 1","'use strict';\n\nvar MapboxGLFunction = require('mapbox-gl-function');\n\nexports.interpolated = function(parameters) {\n    var inner = MapboxGLFunction.interpolated(parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports['piecewise-constant'] = function(parameters) {\n    var inner = MapboxGLFunction['piecewise-constant'](parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports.isFunctionDefinition = MapboxGLFunction.isFunctionDefinition;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_function.js\n// module id = 273\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateEnum(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var errors = [];\n\n    if (Array.isArray(valueSpec.values)) { // <=v7\n        if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value));\n        }\n    } else { // >=v8\n        if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n            errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', Object.keys(valueSpec.values).join(', '), value));\n        }\n    }\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_enum.js\n// module id = 274\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar validateEnum = require('./validate_enum');\nvar getType = require('../util/get_type');\nvar unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateFilter(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var type;\n\n    var errors = [];\n\n    if (getType(value) !== 'array') {\n        return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n    }\n\n    if (value.length < 1) {\n        return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n    }\n\n    errors = errors.concat(validateEnum({\n        key: key + '[0]',\n        value: value[0],\n        valueSpec: styleSpec.filter_operator,\n        style: options.style,\n        styleSpec: options.styleSpec\n    }));\n\n    switch (unbundle(value[0])) {\n        case '<':\n        case '<=':\n        case '>':\n        case '>=':\n            if (value.length >= 2 && value[1] == '$type') {\n                errors.push(new ValidationError(key, value, '\"$type\" cannot be use with operator \"%s\"', value[0]));\n            }\n        /* falls through */\n        case '==':\n        case '!=':\n            if (value.length != 3) {\n                errors.push(new ValidationError(key, value, 'filter array for operator \"%s\" must have 3 elements', value[0]));\n            }\n        /* falls through */\n        case 'in':\n        case '!in':\n            if (value.length >= 2) {\n                type = getType(value[1]);\n                if (type !== 'string') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n                } else if (value[1][0] === '@') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n                }\n            }\n            for (var i = 2; i < value.length; i++) {\n                type = getType(value[i]);\n                if (value[1] == '$type') {\n                    errors = errors.concat(validateEnum({\n                        key: key + '[' + i + ']',\n                        value: value[i],\n                        valueSpec: styleSpec.geometry_type,\n                        style: options.style,\n                        styleSpec: options.styleSpec\n                    }));\n                } else if (type === 'string' && value[i][0] === '@') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'filter value cannot be a constant'));\n                } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'string, number, or boolean expected, %s found', type));\n                }\n            }\n            break;\n\n        case 'any':\n        case 'all':\n        case 'none':\n            for (i = 1; i < value.length; i++) {\n                errors = errors.concat(validateFilter({\n                    key: key + '[' + i + ']',\n                    value: value[i],\n                    style: options.style,\n                    styleSpec: options.styleSpec\n                }));\n            }\n            break;\n\n        case 'has':\n        case '!has':\n            type = getType(value[1]);\n            if (value.length !== 2) {\n                errors.push(new ValidationError(key, value, 'filter array for \"%s\" operator must have 2 elements', value[0]));\n            } else if (type !== 'string') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n            } else if (value[1][0] === '@') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n            }\n            break;\n\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_filter.js\n// module id = 275\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Bucket = require('../data/bucket');\nvar FeatureIndex = require('../data/feature_index');\nvar vt = require('vector-tile');\nvar Protobuf = require('pbf');\nvar GeoJSONFeature = require('../util/vectortile_to_geojson');\nvar featureFilter = require('feature-filter');\nvar CollisionTile = require('../symbol/collision_tile');\nvar CollisionBoxArray = require('../symbol/collision_box');\nvar SymbolInstancesArray = require('../symbol/symbol_instances');\nvar SymbolQuadsArray = require('../symbol/symbol_quads');\n\nmodule.exports = Tile;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @param {Coordinate} coord\n * @param {number} size\n * @private\n */\nfunction Tile(coord, size, sourceMaxZoom) {\n    this.coord = coord;\n    this.uid = util.uniqueId();\n    this.loaded = false; // TODO rename loaded\n    this.isUnloaded = false;\n    this.uses = 0;\n    this.tileSize = size;\n    this.sourceMaxZoom = sourceMaxZoom;\n    this.buckets = {};\n}\n\nTile.prototype = {\n\n    /**\n     * Given a data object with a 'buffers' property, load it into\n     * this tile's elementGroups and buffers properties and set loaded\n     * to true. If the data is null, like in the case of an empty\n     * GeoJSON tile, no-op but still set loaded to true.\n     * @param {Object} data\n     * @returns {undefined}\n     * @private\n     */\n    loadVectorData: function(data, style) {\n        this.loaded = true;\n\n        // empty GeoJSON tile\n        if (!data) return;\n\n        this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray);\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.symbolInstancesArray = new SymbolInstancesArray(data.symbolInstancesArray);\n        this.symbolQuadsArray = new SymbolQuadsArray(data.symbolQuadsArray);\n        this.featureIndex = new FeatureIndex(data.featureIndex, data.rawTileData, this.collisionTile);\n        this.rawTileData = data.rawTileData;\n        this.buckets = unserializeBuckets(data.buckets, style);\n    },\n\n    /**\n     * given a data object and a GL painter, destroy and re-create\n     * all of its buffers.\n     * @param {Object} data\n     * @param {Object} painter\n     * @returns {undefined}\n     * @private\n     */\n    reloadSymbolData: function(data, painter, style) {\n        if (this.isUnloaded) return;\n\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.featureIndex.setCollisionTile(this.collisionTile);\n\n        // Destroy and delete existing symbol buckets\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            if (bucket.type === 'symbol') {\n                bucket.destroy(painter.gl);\n                delete this.buckets[id];\n            }\n        }\n\n        // Add new symbol buckets\n        util.extend(this.buckets, unserializeBuckets(data.buckets, style));\n    },\n\n    /**\n     * Make sure that this tile doesn't own any data within a given\n     * painter, so that it doesn't consume any memory or maintain\n     * any references to the painter.\n     * @param {Object} painter gl painter object\n     * @returns {undefined}\n     * @private\n     */\n    unloadVectorData: function(painter) {\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            bucket.destroy(painter.gl);\n        }\n\n        this.collisionBoxArray = null;\n        this.symbolQuadsArray = null;\n        this.symbolInstancesArray = null;\n        this.collisionTile = null;\n        this.featureIndex = null;\n        this.rawTileData = null;\n        this.buckets = null;\n        this.loaded = false;\n        this.isUnloaded = true;\n    },\n\n    redoPlacement: function(source) {\n        if (!this.loaded || this.redoingPlacement) {\n            this.redoWhenDone = true;\n            return;\n        }\n\n        this.redoingPlacement = true;\n\n        source.dispatcher.send('redo placement', {\n            uid: this.uid,\n            source: source.id,\n            angle: source.map.transform.angle,\n            pitch: source.map.transform.pitch,\n            showCollisionBoxes: source.map.showCollisionBoxes\n        }, done.bind(this), this.workerID);\n\n        function done(_, data) {\n            this.reloadSymbolData(data, source.map.painter, source.map.style);\n            source.fire('tile.load', {tile: this});\n\n            this.redoingPlacement = false;\n            if (this.redoWhenDone) {\n                this.redoPlacement(source);\n                this.redoWhenDone = false;\n            }\n        }\n    },\n\n    getBucket: function(layer) {\n        return this.buckets && this.buckets[layer.ref || layer.id];\n    },\n\n    querySourceFeatures: function(result, params) {\n        if (!this.rawTileData) return;\n\n        if (!this.vtLayers) {\n            this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        }\n\n        var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer];\n\n        if (!layer) return;\n\n        var filter = featureFilter(params.filter);\n        var coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y };\n\n        for (var i = 0; i < layer.length; i++) {\n            var feature = layer.feature(i);\n            if (filter(feature)) {\n                var geojsonFeature = new GeoJSONFeature(feature, this.coord.z, this.coord.x, this.coord.y);\n                geojsonFeature.tile = coord;\n                result.push(geojsonFeature);\n            }\n        }\n    }\n};\n\nfunction unserializeBuckets(input, style) {\n    // Guard against the case where the map's style has been set to null while\n    // this bucket has been parsing.\n    if (!style) return;\n\n    var output = {};\n    for (var i = 0; i < input.length; i++) {\n        var layer = style.getLayer(input[i].layerId);\n        if (!layer) continue;\n\n        var bucket = Bucket.create(util.extend({\n            layer: layer,\n            childLayers: input[i].childLayerIds\n                .map(style.getLayer.bind(style))\n                .filter(function(layer) { return layer; })\n        }, input[i]));\n        output[bucket.id] = bucket;\n    }\n    return output;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/tile.js\n// module id = 276\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar TilePyramid = require('./tile_pyramid');\nvar Source = require('./source');\nvar urlResolve = require('resolve-url');\nvar EXTENT = require('../data/bucket').EXTENT;\n\nmodule.exports = GeoJSONSource;\n\n/**\n * Create a GeoJSON data source instance given an options object\n * @class GeoJSONSource\n * @param {Object} [options]\n * @param {Object|string} options.data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n * @param {number} [options.maxzoom=18] Maximum zoom to preserve detail at.\n * @param {number} [options.buffer] Tile buffer on each side in pixels.\n * @param {number} [options.tolerance] Simplification tolerance (higher means simpler) in pixels.\n * @param {number} [options.cluster] If the data is a collection of point features, setting this to true clusters the points by radius into groups.\n * @param {number} [options.clusterRadius=50] Radius of each cluster when clustering points, in pixels.\n * @param {number} [options.clusterMaxZoom] Max zoom to cluster points on. Defaults to one zoom less than `maxzoom` (so that last zoom features are not clustered).\n\n * @example\n * var sourceObj = new mapboxgl.GeoJSONSource({\n *    data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [\n *                    -76.53063297271729,\n *                    39.18174077994108\n *                ]\n *            }\n *        }]\n *    }\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction GeoJSONSource(options) {\n    options = options || {};\n\n    this._data = options.data;\n\n    if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n\n    var scale = EXTENT / this.tileSize;\n\n    this.geojsonVtOptions = {\n        buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n        tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n        extent: EXTENT,\n        maxZoom: this.maxzoom\n    };\n\n    this.cluster = options.cluster || false;\n    this.superclusterOptions = {\n        maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom - 1) || (this.maxzoom - 1),\n        extent: EXTENT,\n        radius: (options.clusterRadius || 50) * scale,\n        log: false\n    };\n\n    this._pyramid = new TilePyramid({\n        tileSize: this.tileSize,\n        minzoom: this.minzoom,\n        maxzoom: this.maxzoom,\n        reparseOverscaled: true,\n        load: this._loadTile.bind(this),\n        abort: this._abortTile.bind(this),\n        unload: this._unloadTile.bind(this),\n        add: this._addTile.bind(this),\n        remove: this._removeTile.bind(this),\n        redoPlacement: this._redoTilePlacement.bind(this)\n    });\n}\n\nGeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */{\n    minzoom: 0,\n    maxzoom: 18,\n    tileSize: 512,\n    _dirty: true,\n    isTileClipped: true,\n\n    /**\n     * Update source geojson data and rerender map\n     *\n     * @param {Object|string} data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n     * @returns {GeoJSONSource} this\n     */\n    setData: function(data) {\n        this._data = data;\n        this._dirty = true;\n\n        this.fire('change');\n\n        if (this.map)\n            this.update(this.map.transform);\n\n        return this;\n    },\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._loaded && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._dirty) {\n            this._updateData();\n        }\n\n        if (this._loaded) {\n            this._pyramid.update(this.used, transform);\n        }\n    },\n\n    reload: function() {\n        if (this._loaded) {\n            this._pyramid.reload();\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'geojson',\n            data: this._data\n        };\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    queryRenderedFeatures: Source._queryRenderedVectorFeatures,\n    querySourceFeatures: Source._querySourceFeatures,\n\n    _updateData: function() {\n        this._dirty = false;\n        var options = {\n            tileSize: this.tileSize,\n            source: this.id,\n            geojsonVtOptions: this.geojsonVtOptions,\n            cluster: this.cluster,\n            superclusterOptions: this.superclusterOptions\n        };\n\n        var data = this._data;\n        if (typeof data === 'string') {\n            options.url = typeof window != 'undefined' ? urlResolve(window.location.href, data) : data;\n        } else {\n            options.data = JSON.stringify(data);\n        }\n        this.workerID = this.dispatcher.send('parse geojson', options, function(err) {\n            this._loaded = true;\n            if (err) {\n                this.fire('error', {error: err});\n            } else {\n                this._pyramid.reload();\n                this.fire('change');\n            }\n\n        }.bind(this));\n    },\n\n    _loadTile: function(tile) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            maxZoom: this.maxzoom,\n            tileSize: this.tileSize,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        tile.workerID = this.dispatcher.send('load geojson tile', params, function(err, data) {\n\n            tile.unloadVectorData(this.map.painter);\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                this.fire('tile.error', {tile: tile});\n                return;\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            this.fire('tile.load', {tile: tile});\n\n        }.bind(this), this.workerID);\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, function() {}, tile.workerID);\n    },\n\n    redoPlacement: Source.redoPlacement,\n\n    _redoTilePlacement: function(tile) {\n        tile.redoPlacement(this);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/geojson_source.js\n// module id = 277\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Tile = require('./tile');\nvar TileCoord = require('./tile_coord');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar RasterBoundsArray = require('../render/draw_raster').RasterBoundsArray;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('../render/vertex_array_object');\n\nmodule.exports = VideoSource;\n\n/**\n * Create a Video data source instance given an options object\n * @class VideoSource\n * @param {Object} options\n * @param {Array<string>} options.urls An array of URLs to video files\n * @param {Array} options.coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the video. Does not have to be a rectangle.\n * @example\n * var sourceObj = new mapboxgl.VideoSource({\n *    url: [\n *        'https://www.mapbox.com/videos/baltimore-smoke.mp4',\n *        'https://www.mapbox.com/videos/baltimore-smoke.webm'\n *    ],\n *    coordinates: [\n *        [-76.54335737228394, 39.18579907229748],\n *        [-76.52803659439087, 39.1838364847587],\n *        [-76.5295386314392, 39.17683392507606],\n *        [-76.54520273208618, 39.17876344106642]\n *    ]\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction VideoSource(options) {\n    this.urls = options.urls;\n    this.coordinates = options.coordinates;\n\n    ajax.getVideo(options.urls, function(err, video) {\n        // @TODO handle errors via event.\n        if (err) return;\n\n        this.video = video;\n        this.video.loop = true;\n\n        var loopID;\n\n        // start repainting when video starts playing\n        this.video.addEventListener('playing', function() {\n            loopID = this.map.style.animationLoop.set(Infinity);\n            this.map._rerender();\n        }.bind(this));\n\n        // stop repainting when video stops\n        this.video.addEventListener('pause', function() {\n            this.map.style.animationLoop.cancel(loopID);\n        }.bind(this));\n\n        this._loaded = true;\n\n        if (this.map) {\n            this.video.play();\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nVideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{\n    roundZoom: true,\n\n    /**\n     * Return the HTML video element.\n     *\n     * @returns {Object}\n     */\n    getVideo: function() {\n        return this.video;\n    },\n\n    onAdd: function(map) {\n        this.map = map;\n        if (this.video) {\n            this.video.play();\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Update video coordinates and rerender map\n     *\n     * @param {Array} coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the video. Does not have to be a rectangle.\n     * @returns {VideoSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n\n        var tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);\n        array.emplaceBack(tileCoords[1].x, tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile = new Tile(new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row));\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n\n        this.fire('change');\n\n        return this;\n    },\n\n    loaded: function() {\n        return this.video && this.video.readyState >= 2;\n    },\n\n    update: function() {\n        // noop\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    prepare: function() {\n        if (!this._loaded) return;\n        if (this.video.readyState < 2) return; // not enough data for current position\n\n        var gl = this.map.painter.gl;\n        if (!this.tile.texture) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        }\n\n        this._currentTime = this.video.currentTime;\n    },\n\n    getVisibleCoordinates: function() {\n        if (this.tile) return [this.tile.coord];\n        else return [];\n    },\n\n    getTile: function() {\n        return this.tile;\n    },\n\n    serialize: function() {\n        return {\n            type: 'video',\n            urls: this.urls,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/video_source.js\n// module id = 278\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Tile = require('./tile');\nvar TileCoord = require('./tile_coord');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar RasterBoundsArray = require('../render/draw_raster').RasterBoundsArray;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('../render/vertex_array_object');\n\nmodule.exports = ImageSource;\n\n/**\n * Create an Image source instance given an options object\n * @class ImageSource\n * @param {Object} options\n * @param {string} options.url A string URL of an image file\n * @param {Array} options.coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the image. Does not have to be a rectangle.\n * @example\n * var sourceObj = new mapboxgl.ImageSource({\n *    url: 'https://www.mapbox.com/images/foo.png',\n *    coordinates: [\n *        [-76.54335737228394, 39.18579907229748],\n *        [-76.52803659439087, 39.1838364847587],\n *        [-76.5295386314392, 39.17683392507606],\n *        [-76.54520273208618, 39.17876344106642]\n *    ]\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id');  // remove\n */\nfunction ImageSource(options) {\n    this.url = options.url;\n    this.coordinates = options.coordinates;\n\n    ajax.getImage(options.url, function(err, image) {\n        // @TODO handle errors via event.\n        if (err) return;\n\n        this.image = image;\n\n        this.image.addEventListener('load', function() {\n            this.map._rerender();\n        }.bind(this));\n\n        this._loaded = true;\n\n        if (this.map) {\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nImageSource.prototype = util.inherit(Evented, /** @lends ImageSource.prototype */ {\n    onAdd: function(map) {\n        this.map = map;\n        if (this.image) {\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Update image coordinates and rerender map\n     *\n     * @param {Array} coordinates Four geographical [lng, lat] coordinates in clockwise order defining the corners (starting with top left) of the image. Does not have to be a rectangle.\n     * @returns {ImageSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the image in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        var tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0);\n        array.emplaceBack(tileCoords[1].x, tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile = new Tile(new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row));\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n\n        this.fire('change');\n\n        return this;\n    },\n\n    loaded: function() {\n        return this.image && this.image.complete;\n    },\n\n    update: function() {\n        // noop\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    prepare: function() {\n        if (!this._loaded || !this.loaded()) return;\n\n        var painter = this.map.painter;\n        var gl = painter.gl;\n\n        if (!this.tile.texture) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        }\n    },\n\n    getVisibleCoordinates: function() {\n        if (this.tile) return [this.tile.coord];\n        else return [];\n    },\n\n    getTile: function() {\n        return this.tile;\n    },\n\n    serialize: function() {\n        return {\n            type: 'image',\n            urls: this.url,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/image_source.js\n// module id = 279\n// module chunks = 0 1","'use strict';\n\nvar LngLat = require('./lng_lat'),\n    Point = require('point-geometry'),\n    Coordinate = require('./coordinate'),\n    wrap = require('../util/util').wrap,\n    interp = require('../util/interpolate'),\n    TileCoord = require('../source/tile_coord'),\n    EXTENT = require('../data/bucket').EXTENT,\n    glmatrix = require('gl-matrix');\n\nvar vec4 = glmatrix.vec4,\n    mat4 = glmatrix.mat4,\n    mat2 = glmatrix.mat2;\n\nmodule.exports = Transform;\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n *\n * @param {number} minZoom\n * @param {number} maxZoom\n * @private\n */\nfunction Transform(minZoom, maxZoom) {\n    this.tileSize = 512; // constant\n\n    this._minZoom = minZoom || 0;\n    this._maxZoom = maxZoom || 22;\n\n    this.latRange = [-85.05113, 85.05113];\n\n    this.width = 0;\n    this.height = 0;\n    this._center = new LngLat(0, 0);\n    this.zoom = 0;\n    this.angle = 0;\n    this._altitude = 1.5;\n    this._pitch = 0;\n    this._unmodified = true;\n}\n\nTransform.prototype = {\n    get minZoom() { return this._minZoom; },\n    set minZoom(zoom) {\n        if (this._minZoom === zoom) return;\n        this._minZoom = zoom;\n        this.zoom = Math.max(this.zoom, zoom);\n    },\n\n    get maxZoom() { return this._maxZoom; },\n    set maxZoom(zoom) {\n        if (this._maxZoom === zoom) return;\n        this._maxZoom = zoom;\n        this.zoom = Math.min(this.zoom, zoom);\n    },\n\n    get worldSize() {\n        return this.tileSize * this.scale;\n    },\n\n    get centerPoint() {\n        return this.size._div(2);\n    },\n\n    get size() {\n        return new Point(this.width, this.height);\n    },\n\n    get bearing() {\n        return -this.angle / Math.PI * 180;\n    },\n    set bearing(bearing) {\n        var b = -wrap(bearing, -180, 180) * Math.PI / 180;\n        if (this.angle === b) return;\n        this._unmodified = false;\n        this.angle = b;\n        this._calcMatrices();\n\n        // 2x2 matrix for rotating points\n        this.rotationMatrix = mat2.create();\n        mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n    },\n\n    get pitch() {\n        return this._pitch / Math.PI * 180;\n    },\n    set pitch(pitch) {\n        var p = Math.min(60, pitch) / 180 * Math.PI;\n        if (this._pitch === p) return;\n        this._unmodified = false;\n        this._pitch = p;\n        this._calcMatrices();\n    },\n\n    get altitude() {\n        return this._altitude;\n    },\n    set altitude(altitude) {\n        var a = Math.max(0.75, altitude);\n        if (this._altitude === a) return;\n        this._unmodified = false;\n        this._altitude = a;\n        this._calcMatrices();\n    },\n\n    get zoom() { return this._zoom; },\n    set zoom(zoom) {\n        var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n        if (this._zoom === z) return;\n        this._unmodified = false;\n        this._zoom = z;\n        this.scale = this.zoomScale(z);\n        this.tileZoom = Math.floor(z);\n        this.zoomFraction = z - this.tileZoom;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get center() { return this._center; },\n    set center(center) {\n        if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n        this._unmodified = false;\n        this._center = center;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    resize: function(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.pixelsToGLUnits = [2 / width, -2 / height];\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get unmodified() { return this._unmodified; },\n\n    zoomScale: function(zoom) { return Math.pow(2, zoom); },\n    scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; },\n\n    project: function(lnglat, worldSize) {\n        return new Point(\n            this.lngX(lnglat.lng, worldSize),\n            this.latY(lnglat.lat, worldSize));\n    },\n\n    unproject: function(point, worldSize) {\n        return new LngLat(\n            this.xLng(point.x, worldSize),\n            this.yLat(point.y, worldSize));\n    },\n\n    get x() { return this.lngX(this.center.lng); },\n    get y() { return this.latY(this.center.lat); },\n\n    get point() { return new Point(this.x, this.y); },\n\n    /**\n     * latitude to absolute x coord\n     * @param {number} lon\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    lngX: function(lng, worldSize) {\n        return (180 + lng) * (worldSize || this.worldSize) / 360;\n    },\n    /**\n     * latitude to absolute y coord\n     * @param {number} lat\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    latY: function(lat, worldSize) {\n        var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n        return (180 - y) * (worldSize || this.worldSize) / 360;\n    },\n\n    xLng: function(x, worldSize) {\n        return x * 360 / (worldSize || this.worldSize) - 180;\n    },\n    yLat: function(y, worldSize) {\n        var y2 = 180 - y * 360 / (worldSize || this.worldSize);\n        return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n    },\n\n    panBy: function(offset) {\n        var point = this.centerPoint._add(offset);\n        this.center = this.pointLocation(point);\n    },\n\n    setLocationAtPoint: function(lnglat, point) {\n        var c = this.locationCoordinate(lnglat);\n        var coordAtPoint = this.pointCoordinate(point);\n        var coordCenter = this.pointCoordinate(this.centerPoint);\n        var translate = coordAtPoint._sub(c);\n        this._unmodified = false;\n        this.center = this.coordinateLocation(coordCenter._sub(translate));\n    },\n\n    /**\n     * Given a location, return the screen point that corresponds to it\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint: function(lnglat) {\n        return this.coordinatePoint(this.locationCoordinate(lnglat));\n    },\n\n    /**\n     * Given a point on screen, return its lnglat\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation: function(p) {\n        return this.coordinateLocation(this.pointCoordinate(p));\n    },\n\n    /**\n     * Given a geographical lnglat, return an unrounded\n     * coordinate that represents it at this transform's zoom level and\n     * worldsize.\n     * @param {LngLat} lnglat\n     * @returns {Coordinate}\n     * @private\n     */\n    locationCoordinate: function(lnglat) {\n        var k = this.zoomScale(this.tileZoom) / this.worldSize,\n            ll = LngLat.convert(lnglat);\n\n        return new Coordinate(\n            this.lngX(ll.lng) * k,\n            this.latY(ll.lat) * k,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a Coordinate, return its geographical position.\n     * @param {Coordinate} coord\n     * @returns {LngLat} lnglat\n     * @private\n     */\n    coordinateLocation: function(coord) {\n        var worldSize = this.zoomScale(coord.zoom);\n        return new LngLat(\n            this.xLng(coord.column, worldSize),\n            this.yLat(coord.row, worldSize));\n    },\n\n    pointCoordinate: function(p) {\n\n        var targetZ = 0;\n        // since we don't know the correct projected z value for the point,\n        // unproject two points to get a line and then find the point on that\n        // line with z=0\n\n        var coord0 = [p.x, p.y, 0, 1];\n        var coord1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse);\n        vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse);\n\n        var w0 = coord0[3];\n        var w1 = coord1[3];\n        var x0 = coord0[0] / w0;\n        var x1 = coord1[0] / w1;\n        var y0 = coord0[1] / w0;\n        var y1 = coord1[1] / w1;\n        var z0 = coord0[2] / w0;\n        var z1 = coord1[2] / w1;\n\n\n        var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n        var scale = this.worldSize / this.zoomScale(this.tileZoom);\n\n        return new Coordinate(\n            interp(x0, x1, t) / scale,\n            interp(y0, y1, t) / scale,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a coordinate, return the screen point that corresponds to it\n     * @param {Coordinate} coord\n     * @returns {Point} screen point\n     * @private\n     */\n    coordinatePoint: function(coord) {\n        var scale = this.worldSize / this.zoomScale(coord.zoom);\n        var p = [coord.column * scale, coord.row * scale, 0, 1];\n        vec4.transformMat4(p, p, this.pixelMatrix);\n        return new Point(p[0] / p[3], p[1] / p[3]);\n    },\n\n    /**\n     * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.\n     * @param {TileCoord|Coordinate} coord\n     * @param {Number} maxZoom maximum source zoom to account for overscaling\n     * @private\n     */\n    calculatePosMatrix: function(coord, maxZoom) {\n        if (maxZoom === undefined) maxZoom = Infinity;\n        if (coord instanceof TileCoord) coord = coord.toCoordinate(maxZoom);\n\n        // Initialize model-view matrix that converts from the tile coordinates to screen coordinates.\n\n        // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n        // so calculate the matrix the maxzoom tile would use.\n        var z = Math.min(coord.zoom, maxZoom);\n\n        var scale = this.worldSize / Math.pow(2, z);\n        var posMatrix = new Float64Array(16);\n\n        mat4.identity(posMatrix);\n        mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]);\n        mat4.scale(posMatrix, posMatrix, [ scale / EXTENT, scale / EXTENT, 1 ]);\n        mat4.multiply(posMatrix, this.projMatrix, posMatrix);\n\n        return new Float32Array(posMatrix);\n    },\n\n    _constrain: function() {\n        if (!this.center || !this.width || !this.height || this._constraining) return;\n\n        this._constraining = true;\n\n        var minY, maxY, minX, maxX, sy, sx, x2, y2,\n            size = this.size,\n            unmodified = this._unmodified;\n\n        if (this.latRange) {\n            minY = this.latY(this.latRange[1]);\n            maxY = this.latY(this.latRange[0]);\n            sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n        }\n\n        if (this.lngRange) {\n            minX = this.lngX(this.lngRange[0]);\n            maxX = this.lngX(this.lngRange[1]);\n            sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n        }\n\n        // how much the map should scale to fit the screen into given latitude/longitude ranges\n        var s = Math.max(sx || 0, sy || 0);\n\n        if (s) {\n            this.center = this.unproject(new Point(\n                sx ? (maxX + minX) / 2 : this.x,\n                sy ? (maxY + minY) / 2 : this.y));\n            this.zoom += this.scaleZoom(s);\n            this._unmodified = unmodified;\n            this._constraining = false;\n            return;\n        }\n\n        if (this.latRange) {\n            var y = this.y,\n                h2 = size.y / 2;\n\n            if (y - h2 < minY) y2 = minY + h2;\n            if (y + h2 > maxY) y2 = maxY - h2;\n        }\n\n        if (this.lngRange) {\n            var x = this.x,\n                w2 = size.x / 2;\n\n            if (x - w2 < minX) x2 = minX + w2;\n            if (x + w2 > maxX) x2 = maxX - w2;\n        }\n\n        // pan the map if the screen goes off the range\n        if (x2 !== undefined || y2 !== undefined) {\n            this.center = this.unproject(new Point(\n                x2 !== undefined ? x2 : this.x,\n                y2 !== undefined ? y2 : this.y));\n        }\n\n        this._unmodified = unmodified;\n        this._constraining = false;\n    },\n\n    _calcMatrices: function() {\n        if (!this.height) return;\n\n        // Find the distance from the center point to the center top in altitude units using law of sines.\n        var halfFov = Math.atan(0.5 / this.altitude);\n        var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov);\n\n        // Calculate z value of the farthest fragment that should be rendered.\n        var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude;\n\n        // matrix for conversion from location to GL coordinates (-1 .. 1)\n        var m = new Float64Array(16);\n        mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ);\n        mat4.translate(m, m, [0, 0, -this.altitude]);\n\n        // After the rotateX, z values are in pixel units. Convert them to\n        // altitude units. 1 altitude unit = the screen height.\n        mat4.scale(m, m, [1, -1, 1 / this.height]);\n\n        mat4.rotateX(m, m, this._pitch);\n        mat4.rotateZ(m, m, this.angle);\n        mat4.translate(m, m, [-this.x, -this.y, 0]);\n\n        this.projMatrix = m;\n\n        // matrix for conversion from location to screen coordinates\n        m = mat4.create();\n        mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n        mat4.translate(m, m, [1, -1, 0]);\n        this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix);\n\n        // inverse matrix for conversion from screen coordinaes to location\n        m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n        if (!m) throw new Error(\"failed to invert matrix\");\n        this.pixelMatrixInverse = m;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/geo/transform.js\n// module id = 280\n// module chunks = 0 1","var topLevel = typeof global !== 'undefined' ? global :\n    typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n    doccy = document;\n} else {\n    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n}\n\nmodule.exports = doccy;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/global/document.js\n// module id = 281\n// module chunks = 0 1","'use strict';\n\nfunction HeatmapTexture(gl, params) {\n  var _ref, _ref1;\n  this.gl = gl;\n  if (params == null) {\n    params = {};\n  }\n  this.channels = this.gl[((_ref = params.channels) != null ? _ref : 'rgba').toUpperCase()];\n  if (typeof params.type === 'number') {\n    this.type = params.type;\n  } else {\n    this.type = this.gl[((_ref1 = params.type) != null ? _ref1 : 'unsigned_byte').toUpperCase()];\n  }\n  switch (this.channels) {\n    case this.gl.RGBA:\n      this.chancount = 4;\n      break;\n    case this.gl.RGB:\n      this.chancount = 3;\n      break;\n    case this.gl.LUMINANCE_ALPHA:\n      this.chancount = 2;\n      break;\n    default:\n      this.chancount = 1;\n  }\n  this.target = this.gl.TEXTURE_2D;\n  this.handle = this.gl.createTexture();\n}\n\nHeatmapTexture.prototype.destroy = function() {\n  return this.gl.deleteTexture(this.handle);\n};\n\nHeatmapTexture.prototype.bind = function(unit) {\n  if (unit == null) {\n    unit = 0;\n  }\n  if (unit > 15) {\n    throw 'Texture unit too large: ' + unit;\n  }\n  this.gl.activeTexture(this.gl.TEXTURE0 + unit);\n  this.gl.bindTexture(this.target, this.handle);\n  return this;\n};\n\nHeatmapTexture.prototype.setSize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  this.gl.texImage2D(this.target, 0, this.channels, this.width, this.height, 0, this.channels, this.type, null);\n  return this;\n};\n\nHeatmapTexture.prototype.upload = function(data) {\n  this.width = data.width;\n  this.height = data.height;\n  this.gl.texImage2D(this.target, 0, this.channels, this.channels, this.type, data);\n  return this;\n};\n\nHeatmapTexture.prototype.linear = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);\n  return this;\n};\n\nHeatmapTexture.prototype.nearest = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.gl.NEAREST);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.gl.NEAREST);\n  return this;\n};\n\nHeatmapTexture.prototype.clampToEdge = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n  return this;\n};\n\nHeatmapTexture.prototype.repeat = function() {\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.gl.REPEAT);\n  this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.gl.REPEAT);\n  return this;\n};\n\nmodule.exports = HeatmapTexture;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/heatmap-texture.js\n// module id = 282\n// module chunks = 0 1","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isObject.js\n// module id = 283\n// module chunks = 0 1","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_SetCache.js\n// module id = 284\n// module chunks = 0 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_Symbol.js\n// module id = 285\n// module chunks = 0 1","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_arrayIncludes.js\n// module id = 286\n// module chunks = 0 1","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_arrayIncludesWith.js\n// module id = 287\n// module chunks = 0 1","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_arrayMap.js\n// module id = 288\n// module chunks = 0 1","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_cacheHas.js\n// module id = 289\n// module chunks = 0 1","var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseRest.js\n// module id = 290\n// module chunks = 0 1","var isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isArrayLikeObject.js\n// module id = 291\n// module chunks = 0 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isObjectLike.js\n// module id = 292\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = shallowEqual;\nfunction shallowEqual(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/utils/shallowEqual.js\n// module id = 293\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports['default'] = isDisposable;\n\nfunction isDisposable(obj) {\n  return Boolean(obj && typeof obj.dispose === 'function');\n}\n\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/disposables/modules/isDisposable.js\n// module id = 294\n// module chunks = 0 1","var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseRest.js\n// module id = 295\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseGetTag.js\n// module id = 296\n// module chunks = 0 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_Symbol.js\n// module id = 297\n// module chunks = 0 1","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/eq.js\n// module id = 298\n// module chunks = 0 1","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isArrayLike.js\n// module id = 299\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar FILE = exports.FILE = '__NATIVE_FILE__';\nvar URL = exports.URL = '__NATIVE_URL__';\nvar TEXT = exports.TEXT = '__NATIVE_TEXT__';\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/NativeTypes.js\n// module id = 300\n// module chunks = 0 1","var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__chain__ = !!chainAll;\n  this.__index__ = 0;\n  this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_LodashWrapper.js\n// module id = 301\n// module chunks = 0 1","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/isObject.js\n// module id = 302\n// module chunks = 0 1","/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n  // No operation performed.\n}\n\nmodule.exports = baseLodash;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseLodash.js\n// module id = 303\n// module chunks = 0 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_Symbol.js\n// module id = 304\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_root.js\n// module id = 305\n// module chunks = 0 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/isObjectLike.js\n// module id = 306\n// module chunks = 0 1","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/isArray.js\n// module id = 307\n// module chunks = 0 1","var baseCreate = require('./_baseCreate'),\n    baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__dir__ = 1;\n  this.__filtered__ = false;\n  this.__iteratees__ = [];\n  this.__takeCount__ = MAX_ARRAY_LENGTH;\n  this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_LazyWrapper.js\n// module id = 308\n// module chunks = 0 1","'use strict';\n\nvar MapboxGLFunction = require('mapbox-gl-function');\n\nexports.interpolated = function(parameters) {\n    var inner = MapboxGLFunction.interpolated(parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports['piecewise-constant'] = function(parameters) {\n    var inner = MapboxGLFunction['piecewise-constant'](parameters);\n    var outer = function(globalProperties, featureProperties) {\n        return inner(globalProperties && globalProperties.zoom, featureProperties || {});\n    };\n    outer.isFeatureConstant = inner.isFeatureConstant;\n    outer.isZoomConstant = inner.isZoomConstant;\n    return outer;\n};\n\nexports.isFunctionDefinition = MapboxGLFunction.isFunctionDefinition;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_function.js\n// module id = 309\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateEnum(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var errors = [];\n\n    if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n        errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value));\n    }\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_enum.js\n// module id = 310\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar validateEnum = require('./validate_enum');\nvar getType = require('../util/get_type');\nvar unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateFilter(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var type;\n\n    var errors = [];\n\n    if (getType(value) !== 'array') {\n        return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n    }\n\n    if (value.length < 1) {\n        return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n    }\n\n    errors = errors.concat(validateEnum({\n        key: key + '[0]',\n        value: value[0],\n        valueSpec: styleSpec.filter_operator,\n        style: options.style,\n        styleSpec: options.styleSpec\n    }));\n\n    switch (unbundle(value[0])) {\n        case '<':\n        case '<=':\n        case '>':\n        case '>=':\n            if (value.length >= 2 && value[1] == '$type') {\n                errors.push(new ValidationError(key, value, '\"$type\" cannot be use with operator \"%s\"', value[0]));\n            }\n        /* falls through */\n        case '==':\n        case '!=':\n            if (value.length != 3) {\n                errors.push(new ValidationError(key, value, 'filter array for operator \"%s\" must have 3 elements', value[0]));\n            }\n        /* falls through */\n        case 'in':\n        case '!in':\n            if (value.length >= 2) {\n                type = getType(value[1]);\n                if (type !== 'string') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n                } else if (value[1][0] === '@') {\n                    errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n                }\n            }\n            for (var i = 2; i < value.length; i++) {\n                type = getType(value[i]);\n                if (value[1] == '$type') {\n                    errors = errors.concat(validateEnum({\n                        key: key + '[' + i + ']',\n                        value: value[i],\n                        valueSpec: styleSpec.geometry_type,\n                        style: options.style,\n                        styleSpec: options.styleSpec\n                    }));\n                } else if (type === 'string' && value[i][0] === '@') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'filter value cannot be a constant'));\n                } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n                    errors.push(new ValidationError(key + '[' + i + ']', value[i], 'string, number, or boolean expected, %s found', type));\n                }\n            }\n            break;\n\n        case 'any':\n        case 'all':\n        case 'none':\n            for (i = 1; i < value.length; i++) {\n                errors = errors.concat(validateFilter({\n                    key: key + '[' + i + ']',\n                    value: value[i],\n                    style: options.style,\n                    styleSpec: options.styleSpec\n                }));\n            }\n            break;\n\n        case 'has':\n        case '!has':\n            type = getType(value[1]);\n            if (value.length !== 2) {\n                errors.push(new ValidationError(key, value, 'filter array for \"%s\" operator must have 2 elements', value[0]));\n            } else if (type !== 'string') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type));\n            } else if (value[1][0] === '@') {\n                errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant'));\n            }\n            break;\n\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_filter.js\n// module id = 311\n// module chunks = 0 1","import api from '@opengov/og_api';\nimport request from 'superagent';\nimport GridReportActions from './grid_report_actions';\nimport { Observable } from 'rx';\n\nexport const STATES = {\n  FAILED: 'failed',\n  FINISHED: 'finished',\n  QUEUED: 'enqueued'\n};\nconst STOP_STATES = [STATES.FAILED, STATES.FINISHED];\n\nconst POLL_INTERVAL = 2000;\n\nexport function exportCurrentFilter(transactionsDataSetId, reportId, filter, amountColumnState = {}) {\n  return Observable.fromPromise(\n    api.trapi\n      .post('export', transactionsDataSetId, {\n        report_id: reportId,\n        query_params: { filter },\n        amount_column_state: amountColumnState\n      })\n      .end()\n  );\n}\n\nfunction getAsyncJobs(jobId, interval) {\n  const asyncJobsURL =\n    window.location.origin\n      ? `${window.location.origin}/api/v2/async_jobs/${jobId}`\n      : `api/v2/async_jobs/${jobId}`;\n  const api = request.get(asyncJobsURL);\n  return Observable.interval(interval).flatMap(() => Observable.fromNodeCallback(api.end, api)());\n}\n\nexport function getJobPollSteam(observableStream) {\n  return observableStream\n    .filter(req => STOP_STATES.includes(req.body.state))\n    .take(1)\n    .map(req => req.body);\n}\n\nexport function exportCurrentFilterWithJobPoll(transactionsDataSetId, reportId, filter, amountColumnState = {}) {\n  GridReportActions.updateFilteredExportJob(STATES.QUEUED);\n  return exportCurrentFilter(transactionsDataSetId, reportId, filter, amountColumnState).flatMap((res: any) => {\n    return getJobPollSteam(getAsyncJobs(res.body.job_id, POLL_INTERVAL));\n  });\n}\n\nexport default {\n  exportCurrentFilter,\n  getJobPollSteam,\n  exportCurrentFilterWithJobPoll,\n  STATES\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/report_download_actions.ts","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _utils = require('./utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _scrollSpy = require('./scroll-spy');\n\nvar _scrollSpy2 = _interopRequireDefault(_scrollSpy);\n\nvar _scroller = require('./scroller');\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _scrollHash = require('./scroll-hash');\n\nvar _scrollHash2 = _interopRequireDefault(_scrollHash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar protoTypes = {\n  to: _propTypes2.default.string.isRequired,\n  containerId: _propTypes2.default.string,\n  container: _propTypes2.default.object,\n  activeClass: _propTypes2.default.string,\n  spy: _propTypes2.default.bool,\n  smooth: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string]),\n  offset: _propTypes2.default.number,\n  delay: _propTypes2.default.number,\n  isDynamic: _propTypes2.default.bool,\n  onClick: _propTypes2.default.func,\n  duration: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.func]),\n  absolute: _propTypes2.default.bool,\n  onSetActive: _propTypes2.default.func,\n  onSetInactive: _propTypes2.default.func,\n  ignoreCancelEvents: _propTypes2.default.bool,\n  hashSpy: _propTypes2.default.bool\n};\n\nexports.default = function (Component, customScroller) {\n\n  var scroller = customScroller || _scroller2.default;\n\n  var Link = function (_React$PureComponent) {\n    _inherits(Link, _React$PureComponent);\n\n    function Link(props) {\n      _classCallCheck(this, Link);\n\n      var _this = _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).call(this, props));\n\n      _initialiseProps.call(_this);\n\n      _this.state = {\n        active: false\n      };\n      return _this;\n    }\n\n    _createClass(Link, [{\n      key: 'getScrollSpyContainer',\n      value: function getScrollSpyContainer() {\n        var containerId = this.props.containerId;\n        var container = this.props.container;\n\n        if (containerId && !container) {\n          return document.getElementById(containerId);\n        }\n\n        if (container && container.nodeType) {\n          return container;\n        }\n\n        return document;\n      }\n    }, {\n      key: 'componentDidMount',\n      value: function componentDidMount() {\n        if (this.props.spy || this.props.hashSpy) {\n          var scrollSpyContainer = this.getScrollSpyContainer();\n\n          if (!_scrollSpy2.default.isMounted(scrollSpyContainer)) {\n            _scrollSpy2.default.mount(scrollSpyContainer);\n          }\n\n          if (this.props.hashSpy) {\n            if (!_scrollHash2.default.isMounted()) {\n              _scrollHash2.default.mount(scroller);\n            }\n            _scrollHash2.default.mapContainer(this.props.to, scrollSpyContainer);\n          }\n\n          _scrollSpy2.default.addSpyHandler(this.spyHandler, scrollSpyContainer);\n\n          this.setState({\n            container: scrollSpyContainer\n          });\n        }\n      }\n    }, {\n      key: 'componentWillUnmount',\n      value: function componentWillUnmount() {\n        _scrollSpy2.default.unmount(this.stateHandler, this.spyHandler);\n      }\n    }, {\n      key: 'render',\n      value: function render() {\n        var className = \"\";\n\n        if (this.state && this.state.active) {\n          className = ((this.props.className || \"\") + \" \" + (this.props.activeClass || \"active\")).trim();\n        } else {\n          className = this.props.className;\n        }\n\n        var props = _extends({}, this.props);\n\n        for (var prop in protoTypes) {\n          if (props.hasOwnProperty(prop)) {\n            delete props[prop];\n          }\n        }\n\n        props.className = className;\n        props.onClick = this.handleClick;\n\n        return _react2.default.createElement(Component, props);\n      }\n    }]);\n\n    return Link;\n  }(_react2.default.PureComponent);\n\n  var _initialiseProps = function _initialiseProps() {\n    var _this2 = this;\n\n    this.scrollTo = function (to, props) {\n      scroller.scrollTo(to, _extends({}, _this2.state, props));\n    };\n\n    this.handleClick = function (event) {\n\n      /*\r\n       * give the posibility to override onClick\r\n       */\n\n      if (_this2.props.onClick) {\n        _this2.props.onClick(event);\n      }\n\n      /*\r\n       * dont bubble the navigation\r\n       */\n\n      if (event.stopPropagation) event.stopPropagation();\n      if (event.preventDefault) event.preventDefault();\n\n      /*\r\n       * do the magic!\r\n       */\n      _this2.scrollTo(_this2.props.to, _this2.props);\n    };\n\n    this.spyHandler = function (y) {\n\n      var scrollSpyContainer = _this2.getScrollSpyContainer();\n\n      if (_scrollHash2.default.isMounted() && !_scrollHash2.default.isInitialized()) {\n        return;\n      }\n\n      var to = _this2.props.to;\n      var element = null;\n      var elemTopBound = 0;\n      var elemBottomBound = 0;\n      var containerTop = 0;\n\n      if (scrollSpyContainer.getBoundingClientRect) {\n        var containerCords = scrollSpyContainer.getBoundingClientRect();\n        containerTop = containerCords.top;\n      }\n\n      if (!element || _this2.props.isDynamic) {\n        element = scroller.get(to);\n        if (!element) {\n          return;\n        }\n\n        var cords = element.getBoundingClientRect();\n        elemTopBound = cords.top - containerTop + y;\n        elemBottomBound = elemTopBound + cords.height;\n      }\n\n      var offsetY = y - _this2.props.offset;\n      var isInside = offsetY >= Math.floor(elemTopBound) && offsetY < Math.floor(elemBottomBound);\n      var isOutside = offsetY < Math.floor(elemTopBound) || offsetY >= Math.floor(elemBottomBound);\n      var activeLink = scroller.getActiveLink();\n\n      if (isOutside) {\n        if (to === activeLink) {\n          scroller.setActiveLink(void 0);\n        }\n\n        if (_this2.props.hashSpy && _scrollHash2.default.getHash() === to) {\n          _scrollHash2.default.changeHash();\n        }\n\n        if (_this2.props.spy && _this2.state.active) {\n          _this2.setState({ active: false });\n          _this2.props.onSetInactive && _this2.props.onSetInactive(to, element);\n        }\n      }\n\n      if (isInside && (activeLink !== to || _this2.state.active === false)) {\n        scroller.setActiveLink(to);\n\n        _this2.props.hashSpy && _scrollHash2.default.changeHash(to);\n\n        if (_this2.props.spy) {\n          _this2.setState({ active: true });\n          _this2.props.onSetActive && _this2.props.onSetActive(to, element);\n        }\n      }\n    };\n  };\n\n  ;\n\n  Link.propTypes = protoTypes;\n\n  Link.defaultProps = { offset: 0 };\n\n  return Link;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroll-link.js\n// module id = 313\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _lodash = require('lodash.throttle');\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nvar _passiveEventListeners = require('./passive-event-listeners');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The eventHandler will execute at a rate of 15fps\nvar eventThrottler = function eventThrottler(eventHandler) {\n  return (0, _lodash2.default)(eventHandler, 66);\n};\n\nvar scrollSpy = {\n\n  spyCallbacks: [],\n  spySetState: [],\n  scrollSpyContainers: [],\n\n  mount: function mount(scrollSpyContainer) {\n    if (scrollSpyContainer) {\n      var eventHandler = eventThrottler(function (event) {\n        scrollSpy.scrollHandler(scrollSpyContainer);\n      });\n      scrollSpy.scrollSpyContainers.push(scrollSpyContainer);\n      (0, _passiveEventListeners.addPassiveEventListener)(scrollSpyContainer, 'scroll', eventHandler);\n    }\n  },\n  isMounted: function isMounted(scrollSpyContainer) {\n    return scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer) !== -1;\n  },\n  currentPositionY: function currentPositionY(scrollSpyContainer) {\n    if (scrollSpyContainer === document) {\n      var supportPageOffset = window.pageXOffset !== undefined;\n      var isCSS1Compat = (document.compatMode || \"\") === \"CSS1Compat\";\n      return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;\n    } else {\n      return scrollSpyContainer.scrollTop;\n    }\n  },\n  scrollHandler: function scrollHandler(scrollSpyContainer) {\n    var callbacks = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)].spyCallbacks || [];\n    callbacks.forEach(function (c) {\n      return c(scrollSpy.currentPositionY(scrollSpyContainer));\n    });\n  },\n  addStateHandler: function addStateHandler(handler) {\n    scrollSpy.spySetState.push(handler);\n  },\n  addSpyHandler: function addSpyHandler(handler, scrollSpyContainer) {\n    var container = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)];\n\n    if (!container.spyCallbacks) {\n      container.spyCallbacks = [];\n    }\n\n    container.spyCallbacks.push(handler);\n\n    handler(scrollSpy.currentPositionY(scrollSpyContainer));\n  },\n  updateStates: function updateStates() {\n    scrollSpy.spySetState.forEach(function (s) {\n      return s();\n    });\n  },\n  unmount: function unmount(stateHandler, spyHandler) {\n    scrollSpy.scrollSpyContainers.forEach(function (c) {\n      return c.spyCallbacks && c.spyCallbacks.length && c.spyCallbacks.splice(c.spyCallbacks.indexOf(spyHandler), 1);\n    });\n\n    if (scrollSpy.spySetState && scrollSpy.spySetState.length) {\n      scrollSpy.spySetState.splice(scrollSpy.spySetState.indexOf(stateHandler), 1);\n    }\n\n    document.removeEventListener('scroll', scrollSpy.scrollHandler);\n  },\n\n\n  update: function update() {\n    return scrollSpy.scrollSpyContainers.forEach(function (c) {\n      return scrollSpy.scrollHandler(c);\n    });\n  }\n};\n\nexports.default = scrollSpy;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroll-spy.js\n// module id = 314\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/*\r\n * Tell the browser that the event listener won't prevent a scroll.\r\n * Allowing the browser to continue scrolling without having to\r\n * to wait for the listener to return.\r\n */\nvar addPassiveEventListener = exports.addPassiveEventListener = function addPassiveEventListener(target, eventName, listener) {\n  var supportsPassiveOption = function () {\n    var supportsPassiveOption = false;\n    try {\n      var opts = Object.defineProperty({}, 'passive', {\n        get: function get() {\n          supportsPassiveOption = true;\n        }\n      });\n      window.addEventListener('test', null, opts);\n    } catch (e) {}\n    return supportsPassiveOption;\n  }();\n  target.addEventListener(eventName, listener, supportsPassiveOption ? { passive: true } : false);\n};\n\nvar removePassiveEventListener = exports.removePassiveEventListener = function removePassiveEventListener(target, eventName, listener) {\n  target.removeEventListener(eventName, listener);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/passive-event-listeners.js\n// module id = 315\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar Events = {\n\tregistered: {},\n\tscrollEvent: {\n\t\tregister: function register(evtName, callback) {\n\t\t\tEvents.registered[evtName] = callback;\n\t\t},\n\t\tremove: function remove(evtName) {\n\t\t\tEvents.registered[evtName] = null;\n\t\t}\n\t}\n};\n\nexports.default = Events;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroll-events.js\n// module id = 316\n// module chunks = 0 1","import _ from 'lodash';\nimport Backbone from 'backbone';\nimport analytics from '@opengov/og_analytics';\n\nimport ReportViewStore from './stores/report_view_store';\nimport ReportActions from './actions/report_actions';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport SummaryReportStore, { mapUrlParamsToState } from './stores/summary_report_store';\n\nimport _str from 'underscore.string';\n\nexport function parseParameters(paramsText?: string) {\n  paramsText = paramsText && _str.trim(paramsText);\n  if (_.isEmpty(paramsText)) {\n    return {};\n  }\n\n  return _.fromPairs(\n    _.map(paramsText.split('&'), function(pair) {\n      return _.map(pair.split('='), function(keyOrValue) {\n        return _str.trim(keyOrValue);\n      });\n    })\n  );\n}\n\nexport function stringifyParameters(parameters) {\n  // Transform the parameters into series of key=value pairs.\n  return _.transform(parameters, function(parts, value, key) {\n    !_.isUndefined(value) && parts.push(key + '=' + value);\n  }, []).join('&');\n}\n\nexport function trackPageview(params) {\n  if (params !== '') {\n    const url = window.location.pathname + '#' + params;\n    analytics.pushPageView(url);\n  }\n}\n\n/**\n* Athena from summary_report creates this router\n*/\nexport default Backbone.Router.extend({\n  initialize(options) {\n    /**\n    * this is athena_state in here\n    */\n    this.state = options.state;\n\n    /**\n    * This function updates the pushState in the browser\n    * It listens on the athena_state event 'renderData'\n    *\n    * this event is triggered from:\n    * athena_state events: change:legendSort change:graphType change:legendLimit\n    * summary_graph.componentWillReceiveProps if xAxisTitle is changed\n    * summary_report.updateDataSets\n    * summary_report.updateCoaMask\n    * budgetData.on('aggregation')\n    */\n    options.state.on('renderData', function updatePushState() {\n      const params = stringifyParameters(SummaryReportStore.hashState());\n\n      /**\n      * this event is captured in Athena (see summary_report) view\n      */\n      this.trigger('change:params', params);\n      this.storeRoute(params);\n    }, this);\n  },\n\n  trackPageview(params) {\n    if (params !== '') {\n      const url = window.location.pathname + '#' + params;\n      analytics.pushPageView(url);\n    }\n  },\n\n  storeRoute(params) {\n    const history = ReportViewStore.getHistory();\n\n    if (!history.length) {\n      // lets store initial state\n      const initialState = SummaryReportStore.hashState();\n      SummaryReportActions.setInitialState(initialState);\n    }\n\n    const lastHistoryParams = _.last(history) ? parseParameters(_.last(history)) : {};\n\n    if (!_.isEqual(parseParameters(params), lastHistoryParams )) {\n      trackPageview(params);\n\n      ReportActions.pushHistory(params);\n    }\n  },\n\n  backEnabled() {\n    return ReportViewStore.getHistory().length > 1;\n  },\n\n  resetEnabled() {\n    const initialState = SummaryReportStore.getState().get('initialState');\n\n    if (initialState) {\n      const currentState = SummaryReportStore.hashState();\n      return this.backEnabled() && !_.isEqual(currentState, initialState);\n    }\n\n    return this.backEnabled();\n  },\n\n  back() {\n    if (this.backEnabled()) {\n      ReportActions.popHistory();\n      const lastHistory = _.last(ReportViewStore.getHistory());\n      const params = parseParameters(lastHistory);\n      // NOTE: there is some race condition in here. Long story short: this this.state.changeState(params) should be before SummaryReportActions.goBack(params)!!!\n      const mappedParams = mapUrlParamsToState(SummaryReportStore.getState(), params);\n      const replaceState = mappedParams.merge(params);\n      // NOTE: we should pass a mutable object into changeState - this is how athena_state was written\n      this.state.changeState(replaceState.toJS());\n      SummaryReportActions.goBack(replaceState);\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/router.ts","import React from 'react';\nimport classnames from 'classnames';\n\nimport ReportActions from './actions/report_actions';\n\nimport ReportConfigButtons from './report_config_buttons';\nimport EntityLogo from './entity_logo';\nimport ReportList from './report_list';\nimport TogglePanel from './toggle_panel';\nimport StoryList from './story_list';\nimport { isEmbed } from './utils/embed_utils';\n\nconst SidebarTab = props => (\n  <div tabIndex={0} role=\"tab\" className={classnames('ui-nav-tabs__tab', {'is-selected': props.selected})} onClick={props.onClick}>{props.title}</div>\n);\n\nexport const ReportsSidebarContent = (props) => {\n  return ( !isEmbed() &&\n    <>\n      <ReportList reports={props.reports} activeReport={props.report} />\n      <TogglePanel\n        entity={props.entity}\n        session={props.session}\n        isGridReport={props.isGridReport}\n        isControlPanel={props.embedded}>\n        {props.children}\n      </TogglePanel>\n    </>\n  );\n};\n\nexport const ControlPanelSidebarContent = (props) => {\n  return ( !isEmbed() &&\n    <>\n      <div className=\"ui-main__sidebar__scroll\">\n        <TogglePanel\n          entity={props.entity}\n          session={props.session}\n          isGridReport={props.isGridReport}\n          isControlPanel={props.embedded}>\n          {props.children}\n        </TogglePanel>\n      </div>\n      <ReportConfigButtons\n        isNetwork={props.isNetwork}\n        isGridReport={props.isGridReport}\n        session={props.session}\n        report={props.report}\n        isEditingDefaultState={props.isEditingDefaultState}\n        disableEditDefaultState={!!props.reportError || props.initialized === false}\n        isControlPanel={props.embedded}\n        entity={props.entity} />\n    </>\n  );\n};\nexport const StoriesSidebarContent = (props) => (\n  <StoryList stories={props.stories} selectedStoryId={props.selectedStoryId} />\n);\n\nexport default class Sidebar extends React.Component<any, any> {\n  handleSelectReports = () => {\n    ReportActions.selectSidebar('reports');\n  }\n\n  handleSelectStories = () => {\n    ReportActions.selectSidebar('stories');\n  }\n\n  render() {\n    const initialized = this.props.isGridReport || this.props.initialized;\n\n    if (this.props.embedded) {\n      return <ControlPanelSidebarContent {...this.props} initialized={initialized} />;\n    }\n\n    const hasStories = this.props.stories && !this.props.stories.isEmpty();\n    return ( !isEmbed() &&\n      <>\n        <div className=\"ui-main__sidebar__scroll\">\n          <EntityLogo entity={this.props.entity} />\n          {hasStories && (\n            <div className=\"ui-nav-tabs minimal\" role=\"tablist\" style={{marginBottom: 14}}>\n              <SidebarTab\n                title=\"Reports\"\n                selected={this.props.activeSidebar === 'reports'}\n                onClick={this.handleSelectReports}\n              />\n              <SidebarTab\n                title=\"Stories\"\n                selected={this.props.activeSidebar === 'stories'}\n                onClick={this.handleSelectStories}\n              />\n            </div>\n          )}\n          {this.props.activeSidebar === 'reports' ?\n            <ReportsSidebarContent {...this.props} /> :\n            <StoriesSidebarContent stories={this.props.stories} selectedStoryId={this.props.selectedStoryId} />\n          }\n        </div>\n        {this.props.activeSidebar === 'reports' && (\n          <ReportConfigButtons\n            isNetwork={this.props.isNetwork}\n            isGridReport={this.props.isGridReport}\n            session={this.props.session}\n            report={this.props.report}\n            isEditingDefaultState={this.props.isEditingDefaultState}\n            disableEditDefaultState={!!this.props.reportError || initialized === false}\n            isControlPanel={this.props.embedded}\n            entity={this.props.entity}/>\n        )}\n      </>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/sidebar.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextDecoration = exports.TEXT_DECORATION_LINE = exports.TEXT_DECORATION = exports.TEXT_DECORATION_STYLE = undefined;\n\nvar _Color = require('../Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TEXT_DECORATION_STYLE = exports.TEXT_DECORATION_STYLE = {\n    SOLID: 0,\n    DOUBLE: 1,\n    DOTTED: 2,\n    DASHED: 3,\n    WAVY: 4\n};\n\nvar TEXT_DECORATION = exports.TEXT_DECORATION = {\n    NONE: null\n};\n\nvar TEXT_DECORATION_LINE = exports.TEXT_DECORATION_LINE = {\n    UNDERLINE: 1,\n    OVERLINE: 2,\n    LINE_THROUGH: 3,\n    BLINK: 4\n};\n\nvar parseLine = function parseLine(line) {\n    switch (line) {\n        case 'underline':\n            return TEXT_DECORATION_LINE.UNDERLINE;\n        case 'overline':\n            return TEXT_DECORATION_LINE.OVERLINE;\n        case 'line-through':\n            return TEXT_DECORATION_LINE.LINE_THROUGH;\n    }\n    return TEXT_DECORATION_LINE.BLINK;\n};\n\nvar parseTextDecorationLine = function parseTextDecorationLine(line) {\n    if (line === 'none') {\n        return null;\n    }\n\n    return line.split(' ').map(parseLine);\n};\n\nvar parseTextDecorationStyle = function parseTextDecorationStyle(style) {\n    switch (style) {\n        case 'double':\n            return TEXT_DECORATION_STYLE.DOUBLE;\n        case 'dotted':\n            return TEXT_DECORATION_STYLE.DOTTED;\n        case 'dashed':\n            return TEXT_DECORATION_STYLE.DASHED;\n        case 'wavy':\n            return TEXT_DECORATION_STYLE.WAVY;\n    }\n    return TEXT_DECORATION_STYLE.SOLID;\n};\n\nvar parseTextDecoration = exports.parseTextDecoration = function parseTextDecoration(style) {\n    var textDecorationLine = parseTextDecorationLine(style.textDecorationLine ? style.textDecorationLine : style.textDecoration);\n    if (textDecorationLine === null) {\n        return TEXT_DECORATION.NONE;\n    }\n\n    var textDecorationColor = style.textDecorationColor ? new _Color2.default(style.textDecorationColor) : null;\n    var textDecorationStyle = parseTextDecorationStyle(style.textDecorationStyle);\n\n    return {\n        textDecorationLine: textDecorationLine,\n        textDecorationColor: textDecorationColor,\n        textDecorationStyle: textDecorationStyle\n    };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/textDecoration.js\n// module id = 319\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBorder = exports.BORDER_SIDES = exports.BORDER_STYLE = undefined;\n\nvar _Color = require('../Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BORDER_STYLE = exports.BORDER_STYLE = {\n    NONE: 0,\n    SOLID: 1\n};\n\nvar BORDER_SIDES = exports.BORDER_SIDES = {\n    TOP: 0,\n    RIGHT: 1,\n    BOTTOM: 2,\n    LEFT: 3\n};\n\nvar SIDES = Object.keys(BORDER_SIDES).map(function (s) {\n    return s.toLowerCase();\n});\n\nvar parseBorderStyle = function parseBorderStyle(style) {\n    switch (style) {\n        case 'none':\n            return BORDER_STYLE.NONE;\n    }\n    return BORDER_STYLE.SOLID;\n};\n\nvar parseBorder = exports.parseBorder = function parseBorder(style) {\n    return SIDES.map(function (side) {\n        var borderColor = new _Color2.default(style.getPropertyValue('border-' + side + '-color'));\n        var borderStyle = parseBorderStyle(style.getPropertyValue('border-' + side + '-style'));\n        var borderWidth = parseFloat(style.getPropertyValue('border-' + side + '-width'));\n        return {\n            borderColor: borderColor,\n            borderStyle: borderStyle,\n            borderWidth: isNaN(borderWidth) ? 0 : borderWidth\n        };\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/border.js\n// module id = 320\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _textTransform = require('./parsing/textTransform');\n\nvar _TextBounds = require('./TextBounds');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TextContainer = function () {\n    function TextContainer(text, parent, bounds) {\n        _classCallCheck(this, TextContainer);\n\n        this.text = text;\n        this.parent = parent;\n        this.bounds = bounds;\n    }\n\n    _createClass(TextContainer, null, [{\n        key: 'fromTextNode',\n        value: function fromTextNode(node, parent) {\n            var text = transform(node.data, parent.style.textTransform);\n            return new TextContainer(text, parent, (0, _TextBounds.parseTextBounds)(text, parent, node));\n        }\n    }]);\n\n    return TextContainer;\n}();\n\nexports.default = TextContainer;\n\n\nvar CAPITALIZE = /(^|\\s|:|-|\\(|\\))([a-z])/g;\n\nvar transform = function transform(text, _transform) {\n    switch (_transform) {\n        case _textTransform.TEXT_TRANSFORM.LOWERCASE:\n            return text.toLowerCase();\n        case _textTransform.TEXT_TRANSFORM.CAPITALIZE:\n            return text.replace(CAPITALIZE, capitalize);\n        case _textTransform.TEXT_TRANSFORM.UPPERCASE:\n            return text.toUpperCase();\n        default:\n            return text;\n    }\n};\n\nfunction capitalize(m, p1, p2) {\n    if (m.length > 0) {\n        return p1 + p2.toUpperCase();\n    }\n\n    return m;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/TextContainer.js\n// module id = 321\n// module chunks = 0 1","import _ from 'lodash';\n\nimport machina from 'machina';\n\nimport LedgerDataSets from '../models/gl_data_sets';\n\nimport api from '@opengov/og_api';\n\nconst BaseReportFlow = machina(_).Fsm.extend({\n  initialize() {\n    this.ledgerDataSets = new LedgerDataSets();\n  },\n\n  getStateComponent() {\n    const state = this.states[this.state];\n    return state._component.apply(this, arguments);\n  },\n\n  loadLedgerDataSets() {\n    return this.ledgerDataSets.fetch({\n      data: {\n        entity_id: this.entity.get('entity_id'),\n        coa_id: this.report.get('coa_id'),\n        data_set_type: 'budget,actual',\n        limit: 1024\n      }\n    });\n  },\n\n  loadTransactionDataSets() {\n    return api.trapi.get('data_sets', this.entity.id);\n  }\n});\n\nexport default BaseReportFlow;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/base_report_flow.ts","import React from 'react';\n\nimport * as Ovid from '@opengov/ovid';\nconst Loader = Ovid.Loader;\n\nimport WizardStep from './wizard_step_mixin';\n\n\nimport createReactClass from 'create-react-class';\n\nconst Start = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderContent() {\n    return (\n      <Loader message=\"Report data\" />\n    );\n  },\n\n  renderFooter() {\n    return null;\n  },\n\n  isValid() {\n    return false;\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default Start;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/start.tsx","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js\n// module id = 324\n// module chunks = 0 1","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js\n// module id = 325\n// module chunks = 0 1","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js\n// module id = 326\n// module chunks = 0 1","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js\n// module id = 327\n// module chunks = 0 1","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_html.js\n// module id = 328\n// module chunks = 0 1","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js\n// module id = 329\n// module chunks = 0 1","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n  '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js\n// module id = 330\n// module chunks = 0 1","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js\n// module id = 331\n// module chunks = 0 1","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js\n// module id = 332\n// module chunks = 0 1","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n  // eslint-disable-next-line no-self-compare\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js\n// module id = 333\n// module chunks = 0 1","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n  // Old FF bug\n  || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n  // Tor Browser bug\n  || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js\n// module id = 334\n// module chunks = 0 1","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js\n// module id = 335\n// module chunks = 0 1","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js\n// module id = 336\n// module chunks = 0 1","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js\n// module id = 337\n// module chunks = 0 1","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js\n// module id = 338\n// module chunks = 0 1","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js\n// module id = 339\n// module chunks = 0 1","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js\n// module id = 340\n// module chunks = 0 1","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js\n// module id = 341\n// module chunks = 0 1","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js\n// module id = 342\n// module chunks = 0 1","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js\n// module id = 343\n// module chunks = 0 1","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js\n// module id = 344\n// module chunks = 0 1","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js\n// module id = 345\n// module chunks = 0 1","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js\n// module id = 346\n// module chunks = 0 1","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (require('./_cof')(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_task.js\n// module id = 347\n// module chunks = 0 1","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js\n// module id = 348\n// module chunks = 0 1","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js\n// module id = 349\n// module chunks = 0 1","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n  var buffer = new Array(nBytes);\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n  var i = 0;\n  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n  var e, m, c;\n  value = abs(value);\n  // eslint-disable-next-line no-self-compare\n  if (value != value || value === Infinity) {\n    // eslint-disable-next-line no-self-compare\n    m = value != value ? 1 : 0;\n    e = eMax;\n  } else {\n    e = floor(log(value) / LN2);\n    if (value * (c = pow(2, -e)) < 1) {\n      e--;\n      c *= 2;\n    }\n    if (e + eBias >= 1) {\n      value += rt / c;\n    } else {\n      value += rt * pow(2, 1 - eBias);\n    }\n    if (value * c >= 2) {\n      e++;\n      c /= 2;\n    }\n    if (e + eBias >= eMax) {\n      m = 0;\n      e = eMax;\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * pow(2, mLen);\n      e = e + eBias;\n    } else {\n      m = value * pow(2, eBias - 1) * pow(2, mLen);\n      e = 0;\n    }\n  }\n  for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n  e = e << mLen | m;\n  eLen += mLen;\n  for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n  buffer[--i] |= s * 128;\n  return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n  var eLen = nBytes * 8 - mLen - 1;\n  var eMax = (1 << eLen) - 1;\n  var eBias = eMax >> 1;\n  var nBits = eLen - 7;\n  var i = nBytes - 1;\n  var s = buffer[i--];\n  var e = s & 127;\n  var m;\n  s >>= 7;\n  for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n  m = e & (1 << -nBits) - 1;\n  e >>= -nBits;\n  nBits += mLen;\n  for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n  if (e === 0) {\n    e = 1 - eBias;\n  } else if (e === eMax) {\n    return m ? NaN : s ? -Infinity : Infinity;\n  } else {\n    m = m + pow(2, mLen);\n    e = e - eBias;\n  } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n  return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n  return [it & 0xff];\n}\nfunction packI16(it) {\n  return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n  return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n  return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n  return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n  dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = store.slice(start, start + bytes);\n  return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n  var numIndex = +index;\n  var intIndex = toIndex(numIndex);\n  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n  var store = view[$BUFFER]._b;\n  var start = intIndex + view[$OFFSET];\n  var pack = conversion(+value);\n  for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n  $ArrayBuffer = function ArrayBuffer(length) {\n    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n    var byteLength = toIndex(length);\n    this._b = arrayFill.call(new Array(byteLength), 0);\n    this[$LENGTH] = byteLength;\n  };\n\n  $DataView = function DataView(buffer, byteOffset, byteLength) {\n    anInstance(this, $DataView, DATA_VIEW);\n    anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n    var bufferLength = buffer[$LENGTH];\n    var offset = toInteger(byteOffset);\n    if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n    if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n    this[$BUFFER] = buffer;\n    this[$OFFSET] = offset;\n    this[$LENGTH] = byteLength;\n  };\n\n  if (DESCRIPTORS) {\n    addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n    addGetter($DataView, BUFFER, '_b');\n    addGetter($DataView, BYTE_LENGTH, '_l');\n    addGetter($DataView, BYTE_OFFSET, '_o');\n  }\n\n  redefineAll($DataView[PROTOTYPE], {\n    getInt8: function getInt8(byteOffset) {\n      return get(this, 1, byteOffset)[0] << 24 >> 24;\n    },\n    getUint8: function getUint8(byteOffset) {\n      return get(this, 1, byteOffset)[0];\n    },\n    getInt16: function getInt16(byteOffset /* , littleEndian */) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n    },\n    getUint16: function getUint16(byteOffset /* , littleEndian */) {\n      var bytes = get(this, 2, byteOffset, arguments[1]);\n      return bytes[1] << 8 | bytes[0];\n    },\n    getInt32: function getInt32(byteOffset /* , littleEndian */) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1]));\n    },\n    getUint32: function getUint32(byteOffset /* , littleEndian */) {\n      return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n    },\n    getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n      return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n    },\n    getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n      return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n    },\n    setInt8: function setInt8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      set(this, 1, byteOffset, packI8, value);\n    },\n    setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n      set(this, 2, byteOffset, packI16, value, arguments[2]);\n    },\n    setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packI32, value, arguments[2]);\n    },\n    setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n      set(this, 4, byteOffset, packF32, value, arguments[2]);\n    },\n    setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n      set(this, 8, byteOffset, packF64, value, arguments[2]);\n    }\n  });\n} else {\n  if (!fails(function () {\n    $ArrayBuffer(1);\n  }) || !fails(function () {\n    new $ArrayBuffer(-1); // eslint-disable-line no-new\n  }) || fails(function () {\n    new $ArrayBuffer(); // eslint-disable-line no-new\n    new $ArrayBuffer(1.5); // eslint-disable-line no-new\n    new $ArrayBuffer(NaN); // eslint-disable-line no-new\n    return $ArrayBuffer.name != ARRAY_BUFFER;\n  })) {\n    $ArrayBuffer = function ArrayBuffer(length) {\n      anInstance(this, $ArrayBuffer);\n      return new BaseBuffer(toIndex(length));\n    };\n    var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n    for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n      if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n    }\n    if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n  }\n  // iOS Safari 7.x bug\n  var view = new $DataView(new $ArrayBuffer(2));\n  var $setInt8 = $DataView[PROTOTYPE].setInt8;\n  view.setInt8(0, 2147483648);\n  view.setInt8(1, 2147483649);\n  if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n    setInt8: function setInt8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    },\n    setUint8: function setUint8(byteOffset, value) {\n      $setInt8.call(this, byteOffset, value << 24 >> 24);\n    }\n  }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js\n// module id = 350\n// module chunks = 0 1","import Backbone from 'backbone';\n\nexport default Backbone.Model.extend({\n  urlRoot: '/api/v1/entities',\n\n  defaults: {\n    color: {\n      index: 0\n    },\n    fiscal_year_start_date_formatted: 'July 01',\n    country: 'US',\n    entity_type: 'city'\n  },\n\n  toJSON() {\n    return this.omit('logo');\n  },\n\n  isGlobal() {\n    return this.id === 'controlpanel';\n  },\n\n  getRole() {\n    return this.id === 'controlpanel' ? 'admin' : 'user';\n  },\n\n  // Returns the name of the entity stripping off any prefixed text.\n  // Example: \"the city of Palo Alto\" becomes \"Palo Alto\".\n  getName() {\n    const name = this.get('name') || '';\n    return name.replace('the City of', '');\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/models/entity.js","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n\n  processors: {},\n\n  addPostProcessor: function addPostProcessor(module) {\n    this.processors[module.name] = module;\n  },\n  handle: function handle(processors, value, key, options, translator) {\n    var _this = this;\n\n    processors.forEach(function (processor) {\n      if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n    });\n\n    return value;\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/postProcessor.js\n// module id = 352\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.convertAPIOptions = convertAPIOptions;\nexports.convertJSONOptions = convertJSONOptions;\nexports.convertTOptions = convertTOptions;\nexports.appendBackwardsAPI = appendBackwardsAPI;\n\nvar _logger = require('../logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction convertInterpolation(options) {\n\n  options.interpolation = {\n    unescapeSuffix: 'HTML'\n  };\n\n  options.interpolation.prefix = options.interpolationPrefix || '__';\n  options.interpolation.suffix = options.interpolationSuffix || '__';\n  options.interpolation.escapeValue = options.escapeInterpolation || false;\n\n  options.interpolation.nestingPrefix = options.reusePrefix || '$t(';\n  options.interpolation.nestingSuffix = options.reuseSuffix || ')';\n\n  return options;\n}\n\nfunction convertAPIOptions(options) {\n  if (options.resStore) options.resources = options.resStore;\n\n  if (options.ns && options.ns.defaultNs) {\n    options.defaultNS = options.ns.defaultNs;\n    options.ns = options.ns.namespaces;\n  } else {\n    options.defaultNS = options.ns || 'translation';\n  }\n\n  if (options.fallbackToDefaultNS && options.defaultNS) options.fallbackNS = options.defaultNS;\n\n  options.saveMissing = options.sendMissing;\n  options.saveMissingTo = options.sendMissingTo || 'current';\n  options.returnNull = options.fallbackOnNull ? false : true;\n  options.returnEmptyString = options.fallbackOnEmpty ? false : true;\n  options.returnObjects = options.returnObjectTrees;\n  options.joinArrays = '\\n';\n\n  options.returnedObjectHandler = options.objectTreeKeyHandler;\n  options.parseMissingKeyHandler = options.parseMissingKey;\n  options.appendNamespaceToMissingKey = true;\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  if (options.shortcutFunction === 'sprintf') {\n    options.overloadTranslationOptionHandler = function (args) {\n      var values = [];\n\n      for (var i = 1; i < args.length; i++) {\n        values.push(args[i]);\n      }\n\n      return {\n        postProcess: 'sprintf',\n        sprintf: values\n      };\n    };\n  }\n\n  options.whitelist = options.lngWhitelist;\n  options.preload = options.preload;\n  if (options.load === 'current') options.load = 'currentOnly';\n  if (options.load === 'unspecific') options.load = 'languageOnly';\n\n  // backend\n  options.backend = options.backend || {};\n  options.backend.loadPath = options.resGetPath || 'locales/__lng__/__ns__.json';\n  options.backend.addPath = options.resPostPath || 'locales/add/__lng__/__ns__';\n  options.backend.allowMultiLoading = options.dynamicLoad;\n\n  // cache\n  options.cache = options.cache || {};\n  options.cache.prefix = 'res_';\n  options.cache.expirationTime = 7 * 24 * 60 * 60 * 1000;\n  options.cache.enabled = options.useLocalStorage ? true : false;\n\n  options = convertInterpolation(options);\n  if (options.defaultVariables) options.interpolation.defaultVariables = options.defaultVariables;\n\n  // TODO: deprecation\n  // if (options.getAsync === false) throw deprecation error\n\n  return options;\n}\n\nfunction convertJSONOptions(options) {\n  options = convertInterpolation(options);\n  options.joinArrays = '\\n';\n\n  return options;\n}\n\nfunction convertTOptions(options) {\n  if (options.interpolationPrefix || options.interpolationSuffix || options.escapeInterpolation) {\n    options = convertInterpolation(options);\n  }\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  options.returnObjects = options.returnObjectTrees;\n\n  return options;\n}\n\nfunction appendBackwardsAPI(i18n) {\n  i18n.lng = function () {\n    _logger2.default.deprecate('i18next.lng() can be replaced by i18next.language for detected language or i18next.languages for languages ordered by translation lookup.');\n    return i18n.services.languageUtils.toResolveHierarchy(i18n.language)[0];\n  };\n\n  i18n.preload = function (lngs, cb) {\n    _logger2.default.deprecate('i18next.preload() can be replaced with i18next.loadLanguages()');\n    i18n.loadLanguages(lngs, cb);\n  };\n\n  i18n.setLng = function (lng, options, callback) {\n    _logger2.default.deprecate('i18next.setLng() can be replaced with i18next.changeLanguage() or i18next.getFixedT() to get a translation function with fixed language or namespace.');\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.fixLng === true) {\n      if (callback) return callback(null, i18n.getFixedT(lng));\n    }\n\n    i18n.changeLanguage(lng, callback);\n  };\n\n  i18n.addPostProcessor = function (name, fc) {\n    _logger2.default.deprecate('i18next.addPostProcessor() can be replaced by i18next.use({ type: \\'postProcessor\\', name: \\'name\\', process: fc })');\n    i18n.use({\n      type: 'postProcessor',\n      name: name,\n      process: fc\n    });\n  };\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/compatibility/v1.js\n// module id = 353\n// module chunks = 0 1","'use strict';\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = require('../PropTypes');\nvar RouteHandler = require('./RouteHandler');\nvar Route = require('./Route');\n\n/**\n * A <DefaultRoute> component is a special kind of <Route> that\n * renders when its parent matches but none of its siblings do.\n * Only one such route may be used at any given level in the\n * route hierarchy.\n */\n\nvar DefaultRoute = (function (_Route) {\n  _inherits(DefaultRoute, _Route);\n\n  function DefaultRoute() {\n    _classCallCheck(this, DefaultRoute);\n\n    _get(Object.getPrototypeOf(DefaultRoute.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return DefaultRoute;\n})(Route);\n\nDefaultRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.falsy,\n  children: PropTypes.falsy,\n  handler: PropTypes.func.isRequired\n};\n\nDefaultRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = DefaultRoute;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/DefaultRoute.js\n// module id = 354\n// module chunks = 0 1","// Load modules\n\n\n// Declare internals\n\nvar internals = {};\n\n\nexports.arrayToObject = function (source) {\n\n    var obj = {};\n    for (var i = 0, il = source.length; i < il; ++i) {\n        if (typeof source[i] !== 'undefined') {\n\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\n\nexports.merge = function (target, source) {\n\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        }\n        else {\n            target[source] = true;\n        }\n\n        return target;\n    }\n\n    if (typeof target !== 'object') {\n        target = [target].concat(source);\n        return target;\n    }\n\n    if (Array.isArray(target) &&\n        !Array.isArray(source)) {\n\n        target = exports.arrayToObject(target);\n    }\n\n    var keys = Object.keys(source);\n    for (var k = 0, kl = keys.length; k < kl; ++k) {\n        var key = keys[k];\n        var value = source[key];\n\n        if (!target[key]) {\n            target[key] = value;\n        }\n        else {\n            target[key] = exports.merge(target[key], value);\n        }\n    }\n\n    return target;\n};\n\n\nexports.decode = function (str) {\n\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\n\nexports.compact = function (obj, refs) {\n\n    if (typeof obj !== 'object' ||\n        obj === null) {\n\n        return obj;\n    }\n\n    refs = refs || [];\n    var lookup = refs.indexOf(obj);\n    if (lookup !== -1) {\n        return refs[lookup];\n    }\n\n    refs.push(obj);\n\n    if (Array.isArray(obj)) {\n        var compacted = [];\n\n        for (var i = 0, il = obj.length; i < il; ++i) {\n            if (typeof obj[i] !== 'undefined') {\n                compacted.push(obj[i]);\n            }\n        }\n\n        return compacted;\n    }\n\n    var keys = Object.keys(obj);\n    for (i = 0, il = keys.length; i < il; ++i) {\n        var key = keys[i];\n        obj[key] = exports.compact(obj[key], refs);\n    }\n\n    return obj;\n};\n\n\nexports.isRegExp = function (obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\n\nexports.isBuffer = function (obj) {\n\n    if (obj === null ||\n        typeof obj === 'undefined') {\n\n        return false;\n    }\n\n    return !!(obj.constructor &&\n        obj.constructor.isBuffer &&\n        obj.constructor.isBuffer(obj));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/node_modules/qs/lib/utils.js\n// module id = 355\n// module chunks = 0 1","'use strict';\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = require('../PropTypes');\nvar RouteHandler = require('./RouteHandler');\nvar Route = require('./Route');\n\n/**\n * A <NotFoundRoute> is a special kind of <Route> that\n * renders when the beginning of its parent's path matches\n * but none of its siblings do, including any <DefaultRoute>.\n * Only one such route may be used at any given level in the\n * route hierarchy.\n */\n\nvar NotFoundRoute = (function (_Route) {\n  _inherits(NotFoundRoute, _Route);\n\n  function NotFoundRoute() {\n    _classCallCheck(this, NotFoundRoute);\n\n    _get(Object.getPrototypeOf(NotFoundRoute.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return NotFoundRoute;\n})(Route);\n\nNotFoundRoute.propTypes = {\n  name: PropTypes.string,\n  path: PropTypes.falsy,\n  children: PropTypes.falsy,\n  handler: PropTypes.func.isRequired\n};\n\nNotFoundRoute.defaultProps = {\n  handler: RouteHandler\n};\n\nmodule.exports = NotFoundRoute;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/NotFoundRoute.js\n// module id = 356\n// module chunks = 0 1","'use strict';\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar PropTypes = require('../PropTypes');\nvar Route = require('./Route');\n\n/**\n * A <Redirect> component is a special kind of <Route> that always\n * redirects to another route when it matches.\n */\n\nvar Redirect = (function (_Route) {\n  _inherits(Redirect, _Route);\n\n  function Redirect() {\n    _classCallCheck(this, Redirect);\n\n    _get(Object.getPrototypeOf(Redirect.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  return Redirect;\n})(Route);\n\nRedirect.propTypes = {\n  path: PropTypes.string,\n  from: PropTypes.string, // Alias for path.\n  to: PropTypes.string,\n  handler: PropTypes.falsy\n};\n\n// Redirects should not have a default handler\nRedirect.defaultProps = {};\n\nmodule.exports = Redirect;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/Redirect.js\n// module id = 357\n// module chunks = 0 1","'use strict';\n\nvar LocationActions = require('../actions/LocationActions');\nvar History = require('../History');\n\nvar _listeners = [];\nvar _isListening = false;\nvar _actionType;\n\nfunction notifyChange(type) {\n  if (type === LocationActions.PUSH) History.length += 1;\n\n  var change = {\n    path: HashLocation.getCurrentPath(),\n    type: type\n  };\n\n  _listeners.forEach(function (listener) {\n    listener.call(HashLocation, change);\n  });\n}\n\nfunction ensureSlash() {\n  var path = HashLocation.getCurrentPath();\n\n  if (path.charAt(0) === '/') return true;\n\n  HashLocation.replace('/' + path);\n\n  return false;\n}\n\nfunction onHashChange() {\n  if (ensureSlash()) {\n    // If we don't have an _actionType then all we know is the hash\n    // changed. It was probably caused by the user clicking the Back\n    // button, but may have also been the Forward button or manual\n    // manipulation. So just guess 'pop'.\n    var curActionType = _actionType;\n    _actionType = null;\n    notifyChange(curActionType || LocationActions.POP);\n  }\n}\n\n/**\n * A Location that uses `window.location.hash`.\n */\nvar HashLocation = {\n\n  addChangeListener: function addChangeListener(listener) {\n    _listeners.push(listener);\n\n    // Do this BEFORE listening for hashchange.\n    ensureSlash();\n\n    if (!_isListening) {\n      if (window.addEventListener) {\n        window.addEventListener('hashchange', onHashChange, false);\n      } else {\n        window.attachEvent('onhashchange', onHashChange);\n      }\n\n      _isListening = true;\n    }\n  },\n\n  removeChangeListener: function removeChangeListener(listener) {\n    _listeners = _listeners.filter(function (l) {\n      return l !== listener;\n    });\n\n    if (_listeners.length === 0) {\n      if (window.removeEventListener) {\n        window.removeEventListener('hashchange', onHashChange, false);\n      } else {\n        window.removeEvent('onhashchange', onHashChange);\n      }\n\n      _isListening = false;\n    }\n  },\n\n  push: function push(path) {\n    _actionType = LocationActions.PUSH;\n    window.location.hash = path;\n  },\n\n  replace: function replace(path) {\n    _actionType = LocationActions.REPLACE;\n    window.location.replace(window.location.pathname + window.location.search + '#' + path);\n  },\n\n  pop: function pop() {\n    _actionType = LocationActions.POP;\n    History.back();\n  },\n\n  getCurrentPath: function getCurrentPath() {\n    return decodeURI(\n    // We can't use window.location.hash here because it's not\n    // consistent across browsers - Firefox will pre-decode it!\n    window.location.href.split('#')[1] || '');\n  },\n\n  toString: function toString() {\n    return '<HashLocation>';\n  }\n\n};\n\nmodule.exports = HashLocation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/locations/HashLocation.js\n// module id = 358\n// module chunks = 0 1","'use strict';\n\nvar HistoryLocation = require('./HistoryLocation');\nvar History = require('../History');\n\n/**\n * A Location that uses full page refreshes. This is used as\n * the fallback for HistoryLocation in browsers that do not\n * support the HTML5 history API.\n */\nvar RefreshLocation = {\n\n  push: function push(path) {\n    window.location = path;\n  },\n\n  replace: function replace(path) {\n    window.location.replace(path);\n  },\n\n  pop: History.back,\n\n  getCurrentPath: HistoryLocation.getCurrentPath,\n\n  toString: function toString() {\n    return '<RefreshLocation>';\n  }\n\n};\n\nmodule.exports = RefreshLocation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/locations/RefreshLocation.js\n// module id = 359\n// module chunks = 0 1","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = require('invariant');\n\nfunction throwCannotModify() {\n  invariant(false, 'You cannot modify a static location');\n}\n\n/**\n * A location that only ever contains a single path. Useful in\n * stateless environments like servers where there is no path history,\n * only the path that was used in the request.\n */\n\nvar StaticLocation = (function () {\n  function StaticLocation(path) {\n    _classCallCheck(this, StaticLocation);\n\n    this.path = path;\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(StaticLocation, [{\n    key: 'getCurrentPath',\n    value: function getCurrentPath() {\n      return this.path;\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      return '<StaticLocation path=\"' + this.path + '\">';\n    }\n  }]);\n\n  return StaticLocation;\n})();\n\nStaticLocation.prototype.push = throwCannotModify;\nStaticLocation.prototype.replace = throwCannotModify;\nStaticLocation.prototype.pop = throwCannotModify;\n\nmodule.exports = StaticLocation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/locations/StaticLocation.js\n// module id = 360\n// module chunks = 0 1","'use strict';\n\nvar LocationActions = require('../actions/LocationActions');\n\n/**\n * A scroll behavior that attempts to imitate the default behavior\n * of modern browsers.\n */\nvar ImitateBrowserBehavior = {\n\n  updateScrollPosition: function updateScrollPosition(position, actionType) {\n    switch (actionType) {\n      case LocationActions.PUSH:\n      case LocationActions.REPLACE:\n        window.scrollTo(0, 0);\n        break;\n      case LocationActions.POP:\n        if (position) {\n          window.scrollTo(position.x, position.y);\n        } else {\n          window.scrollTo(0, 0);\n        }\n        break;\n    }\n  }\n\n};\n\nmodule.exports = ImitateBrowserBehavior;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/behaviors/ImitateBrowserBehavior.js\n// module id = 361\n// module chunks = 0 1","/* jshint -W084 */\n'use strict';\n\nvar React = require('react');\nvar assign = require('object-assign');\nvar warning = require('./warning');\nvar DefaultRoute = require('./components/DefaultRoute');\nvar NotFoundRoute = require('./components/NotFoundRoute');\nvar Redirect = require('./components/Redirect');\nvar Route = require('./Route');\n\nfunction checkPropTypes(componentName, propTypes, props) {\n  componentName = componentName || 'UnknownComponent';\n\n  for (var propName in propTypes) {\n    if (propTypes.hasOwnProperty(propName)) {\n      // var error = propTypes[propName](props, propName, componentName);\n      var error = false;\n\n      if (error instanceof Error) warning(false, error.message);\n    }\n  }\n}\n\nfunction createRouteOptions(props) {\n  var options = assign({}, props);\n  var handler = options.handler;\n\n  if (handler) {\n    options.onEnter = handler.willTransitionTo;\n    options.onLeave = handler.willTransitionFrom;\n  }\n\n  return options;\n}\n\nfunction createRouteFromReactElement(element) {\n  if (!React.isValidElement(element)) return;\n\n  var type = element.type;\n  var props = assign({}, type.defaultProps, element.props);\n\n  if (type.propTypes) checkPropTypes(type.displayName, type.propTypes, props);\n\n  if (type === DefaultRoute) return Route.createDefaultRoute(createRouteOptions(props));\n\n  if (type === NotFoundRoute) return Route.createNotFoundRoute(createRouteOptions(props));\n\n  if (type === Redirect) return Route.createRedirect(createRouteOptions(props));\n\n  return Route.createRoute(createRouteOptions(props), function () {\n    if (props.children) createRoutesFromReactChildren(props.children);\n  });\n}\n\n/**\n * Creates and returns an array of routes created from the given\n * ReactChildren, all of which should be one of <Route>, <DefaultRoute>,\n * <NotFoundRoute>, or <Redirect>, e.g.:\n *\n *   var { createRoutesFromReactChildren, Route, Redirect } = require('react-router');\n *\n *   var routes = createRoutesFromReactChildren(\n *     <Route path=\"/\" handler={App}>\n *       <Route name=\"user\" path=\"/user/:userId\" handler={User}>\n *         <Route name=\"task\" path=\"tasks/:taskId\" handler={Task}/>\n *         <Redirect from=\"todos/:taskId\" to=\"task\"/>\n *       </Route>\n *     </Route>\n *   );\n */\nfunction createRoutesFromReactChildren(children) {\n  var routes = [];\n\n  React.Children.forEach(children, function (child) {\n    if (child = createRouteFromReactElement(child)) routes.push(child);\n  });\n\n  return routes;\n}\n\nmodule.exports = createRoutesFromReactChildren;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/createRoutesFromReactChildren.js\n// module id = 362\n// module chunks = 0 1","/* jshint -W058 */\n'use strict';\n\nvar React = require('react');\nvar createReactClass = require('create-react-class');\nvar warning = require('./warning');\nvar invariant = require('invariant');\nvar canUseDOM = require('can-use-dom');\nvar LocationActions = require('./actions/LocationActions');\nvar ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior');\nvar HashLocation = require('./locations/HashLocation');\nvar HistoryLocation = require('./locations/HistoryLocation');\nvar RefreshLocation = require('./locations/RefreshLocation');\nvar StaticLocation = require('./locations/StaticLocation');\nvar ScrollHistory = require('./ScrollHistory');\nvar createRoutesFromReactChildren = require('./createRoutesFromReactChildren');\nvar isReactChildren = require('./isReactChildren');\nvar Transition = require('./Transition');\nvar PropTypes = require('./PropTypes');\nvar Redirect = require('./Redirect');\nvar History = require('./History');\nvar Cancellation = require('./Cancellation');\nvar Match = require('./Match');\nvar Route = require('./Route');\nvar supportsHistory = require('./supportsHistory');\nvar PathUtils = require('./PathUtils');\n\n/**\n * The default location for new routers.\n */\nvar DEFAULT_LOCATION = canUseDOM ? HashLocation : '/';\n\n/**\n * The default scroll behavior for new routers.\n */\nvar DEFAULT_SCROLL_BEHAVIOR = canUseDOM ? ImitateBrowserBehavior : null;\n\nfunction hasProperties(object, properties) {\n  for (var propertyName in properties) if (properties.hasOwnProperty(propertyName) && object[propertyName] !== properties[propertyName]) return false;\n\n  return true;\n}\n\nfunction hasMatch(routes, route, prevParams, nextParams, prevQuery, nextQuery) {\n  return routes.some(function (r) {\n    if (r !== route) return false;\n\n    var paramNames = route.paramNames;\n    var paramName;\n\n    // Ensure that all params the route cares about did not change.\n    for (var i = 0, len = paramNames.length; i < len; ++i) {\n      paramName = paramNames[i];\n\n      if (nextParams[paramName] !== prevParams[paramName]) return false;\n    }\n\n    // Ensure the query hasn't changed.\n    return hasProperties(prevQuery, nextQuery) && hasProperties(nextQuery, prevQuery);\n  });\n}\n\nfunction addRoutesToNamedRoutes(routes, namedRoutes) {\n  var route;\n  for (var i = 0, len = routes.length; i < len; ++i) {\n    route = routes[i];\n\n    if (route.name) {\n      invariant(namedRoutes[route.name] == null, 'You may not have more than one route named \"%s\"', route.name);\n\n      namedRoutes[route.name] = route;\n    }\n\n    if (route.childRoutes) addRoutesToNamedRoutes(route.childRoutes, namedRoutes);\n  }\n}\n\nfunction routeIsActive(activeRoutes, routeName) {\n  return activeRoutes.some(function (route) {\n    return route.name === routeName;\n  });\n}\n\nfunction paramsAreActive(activeParams, params) {\n  for (var property in params) if (String(activeParams[property]) !== String(params[property])) return false;\n\n  return true;\n}\n\nfunction queryIsActive(activeQuery, query) {\n  for (var property in query) if (String(activeQuery[property]) !== String(query[property])) return false;\n\n  return true;\n}\n\n/**\n * Creates and returns a new router using the given options. A router\n * is a ReactComponent class that knows how to react to changes in the\n * URL and keep the contents of the page in sync.\n *\n * Options may be any of the following:\n *\n * - routes           (required) The route config\n * - location         The location to use. Defaults to HashLocation when\n *                    the DOM is available, \"/\" otherwise\n * - scrollBehavior   The scroll behavior to use. Defaults to ImitateBrowserBehavior\n *                    when the DOM is available, null otherwise\n * - onError          A function that is used to handle errors\n * - onAbort          A function that is used to handle aborted transitions\n *\n * When rendering in a server-side environment, the location should simply\n * be the URL path that was used in the request, including the query string.\n */\nfunction createRouter(options) {\n  options = options || {};\n\n  if (isReactChildren(options)) options = { routes: options };\n\n  var mountedComponents = [];\n  var location = options.location || DEFAULT_LOCATION;\n  var scrollBehavior = options.scrollBehavior || DEFAULT_SCROLL_BEHAVIOR;\n  var state = {};\n  var nextState = {};\n  var pendingTransition = null;\n  var dispatchHandler = null;\n\n  if (typeof location === 'string') location = new StaticLocation(location);\n\n  if (location instanceof StaticLocation) {\n    warning(!canUseDOM || process.env.NODE_ENV === 'test', 'You should not use a static location in a DOM environment because ' + 'the router will not be kept in sync with the current URL');\n  } else {\n    invariant(canUseDOM || location.needsDOM === false, 'You cannot use %s without a DOM', location);\n  }\n\n  // Automatically fall back to full page refreshes in\n  // browsers that don't support the HTML history API.\n  if (location === HistoryLocation && !supportsHistory()) location = RefreshLocation;\n\n  var Router = createReactClass({\n\n    displayName: 'Router',\n\n    statics: {\n\n      isRunning: false,\n\n      cancelPendingTransition: function cancelPendingTransition() {\n        if (pendingTransition) {\n          pendingTransition.cancel();\n          pendingTransition = null;\n        }\n      },\n\n      clearAllRoutes: function clearAllRoutes() {\n        Router.cancelPendingTransition();\n        Router.namedRoutes = {};\n        Router.routes = [];\n      },\n\n      /**\n       * Adds routes to this router from the given children object (see ReactChildren).\n       */\n      addRoutes: function addRoutes(routes) {\n        if (isReactChildren(routes)) routes = createRoutesFromReactChildren(routes);\n\n        addRoutesToNamedRoutes(routes, Router.namedRoutes);\n\n        Router.routes.push.apply(Router.routes, routes);\n      },\n\n      /**\n       * Replaces routes of this router from the given children object (see ReactChildren).\n       */\n      replaceRoutes: function replaceRoutes(routes) {\n        Router.clearAllRoutes();\n        Router.addRoutes(routes);\n        Router.refresh();\n      },\n\n      /**\n       * Performs a match of the given path against this router and returns an object\n       * with the { routes, params, pathname, query } that match. Returns null if no\n       * match can be made.\n       */\n      match: function match(path) {\n        return Match.findMatch(Router.routes, path);\n      },\n\n      /**\n       * Returns an absolute URL path created from the given route\n       * name, URL parameters, and query.\n       */\n      makePath: function makePath(to, params, query) {\n        var path;\n        if (PathUtils.isAbsolute(to)) {\n          path = to;\n        } else {\n          var route = to instanceof Route ? to : Router.namedRoutes[to];\n\n          invariant(route instanceof Route, 'Cannot find a route named \"%s\"', to);\n\n          path = route.path;\n        }\n\n        return PathUtils.withQuery(PathUtils.injectParams(path, params), query);\n      },\n\n      /**\n       * Returns a string that may safely be used as the href of a link\n       * to the route with the given name, URL parameters, and query.\n       */\n      makeHref: function makeHref(to, params, query) {\n        var path = Router.makePath(to, params, query);\n        return location === HashLocation ? '#' + path : path;\n      },\n\n      /**\n       * Transitions to the URL specified in the arguments by pushing\n       * a new URL onto the history stack.\n       */\n      transitionTo: function transitionTo(to, params, query) {\n        var path = Router.makePath(to, params, query);\n\n        if (pendingTransition) {\n          // Replace so pending location does not stay in history.\n          location.replace(path);\n        } else {\n          location.push(path);\n        }\n      },\n\n      /**\n       * Transitions to the URL specified in the arguments by replacing\n       * the current URL in the history stack.\n       */\n      replaceWith: function replaceWith(to, params, query) {\n        location.replace(Router.makePath(to, params, query));\n      },\n\n      /**\n       * Transitions to the previous URL if one is available. Returns true if the\n       * router was able to go back, false otherwise.\n       *\n       * Note: The router only tracks history entries in your application, not the\n       * current browser session, so you can safely call this function without guarding\n       * against sending the user back to some other site. However, when using\n       * RefreshLocation (which is the fallback for HistoryLocation in browsers that\n       * don't support HTML5 history) this method will *always* send the client back\n       * because we cannot reliably track history length.\n       */\n      goBack: function goBack() {\n        if (History.length > 1 || location === RefreshLocation) {\n          location.pop();\n          return true;\n        }\n\n        warning(false, 'goBack() was ignored because there is no router history');\n\n        return false;\n      },\n\n      handleAbort: options.onAbort || function (abortReason) {\n        if (location instanceof StaticLocation) throw new Error('Unhandled aborted transition! Reason: ' + abortReason);\n\n        if (abortReason instanceof Cancellation) {\n          return;\n        } else if (abortReason instanceof Redirect) {\n          location.replace(Router.makePath(abortReason.to, abortReason.params, abortReason.query));\n        } else {\n          location.pop();\n        }\n      },\n\n      handleError: options.onError || function (error) {\n        // Throw so we don't silently swallow async errors.\n        throw error; // This error probably originated in a transition hook.\n      },\n\n      handleLocationChange: function handleLocationChange(change) {\n        Router.dispatch(change.path, change.type);\n      },\n\n      /**\n       * Performs a transition to the given path and calls callback(error, abortReason)\n       * when the transition is finished. If both arguments are null the router's state\n       * was updated. Otherwise the transition did not complete.\n       *\n       * In a transition, a router first determines which routes are involved by beginning\n       * with the current route, up the route tree to the first parent route that is shared\n       * with the destination route, and back down the tree to the destination route. The\n       * willTransitionFrom hook is invoked on all route handlers we're transitioning away\n       * from, in reverse nesting order. Likewise, the willTransitionTo hook is invoked on\n       * all route handlers we're transitioning to.\n       *\n       * Both willTransitionFrom and willTransitionTo hooks may either abort or redirect the\n       * transition. To resolve asynchronously, they may use the callback argument. If no\n       * hooks wait, the transition is fully synchronous.\n       */\n      dispatch: function dispatch(path, action) {\n        Router.cancelPendingTransition();\n\n        var prevPath = state.path;\n        var isRefreshing = action == null;\n\n        if (prevPath === path && !isRefreshing) return; // Nothing to do!\n\n        // Record the scroll position as early as possible to\n        // get it before browsers try update it automatically.\n        if (prevPath && action === LocationActions.PUSH) Router.recordScrollPosition(prevPath);\n\n        var match = Router.match(path);\n\n        warning(match != null, 'No route matches path \"%s\". Make sure you have <Route path=\"%s\"> somewhere in your routes', path, path);\n\n        if (match == null) match = {};\n\n        var prevRoutes = state.routes || [];\n        var prevParams = state.params || {};\n        var prevQuery = state.query || {};\n\n        var nextRoutes = match.routes || [];\n        var nextParams = match.params || {};\n        var nextQuery = match.query || {};\n\n        var fromRoutes, toRoutes;\n        if (prevRoutes.length) {\n          fromRoutes = prevRoutes.filter(function (route) {\n            return !hasMatch(nextRoutes, route, prevParams, nextParams, prevQuery, nextQuery);\n          });\n\n          toRoutes = nextRoutes.filter(function (route) {\n            return !hasMatch(prevRoutes, route, prevParams, nextParams, prevQuery, nextQuery);\n          });\n        } else {\n          fromRoutes = [];\n          toRoutes = nextRoutes;\n        }\n\n        var transition = new Transition(path, Router.replaceWith.bind(Router, path));\n        pendingTransition = transition;\n\n        var fromComponents = mountedComponents.slice(prevRoutes.length - fromRoutes.length);\n\n        Transition.from(transition, fromRoutes, fromComponents, function (error) {\n          if (error || transition.abortReason) return dispatchHandler.call(Router, error, transition); // No need to continue.\n\n          Transition.to(transition, toRoutes, nextParams, nextQuery, function (error) {\n            dispatchHandler.call(Router, error, transition, {\n              path: path,\n              action: action,\n              pathname: match.pathname,\n              routes: nextRoutes,\n              params: nextParams,\n              query: nextQuery\n            });\n          });\n        });\n      },\n\n      /**\n       * Starts this router and calls callback(router, state) when the route changes.\n       *\n       * If the router's location is static (i.e. a URL path in a server environment)\n       * the callback is called only once. Otherwise, the location should be one of the\n       * Router.*Location objects (e.g. Router.HashLocation or Router.HistoryLocation).\n       */\n      run: function run(callback) {\n        invariant(!Router.isRunning, 'Router is already running');\n\n        dispatchHandler = function (error, transition, newState) {\n          if (error) Router.handleError(error);\n\n          if (pendingTransition !== transition) return;\n\n          pendingTransition = null;\n\n          if (transition.abortReason) {\n            Router.handleAbort(transition.abortReason);\n          } else {\n            callback.call(Router, Router, nextState = newState);\n          }\n        };\n\n        if (!(location instanceof StaticLocation)) {\n          if (location.addChangeListener) location.addChangeListener(Router.handleLocationChange);\n\n          Router.isRunning = true;\n        }\n\n        // Bootstrap using the current path.\n        Router.refresh();\n      },\n\n      refresh: function refresh() {\n        Router.dispatch(location.getCurrentPath(), null);\n      },\n\n      stop: function stop() {\n        Router.cancelPendingTransition();\n\n        if (location.removeChangeListener) location.removeChangeListener(Router.handleLocationChange);\n\n        Router.isRunning = false;\n      },\n\n      getLocation: function getLocation() {\n        return location;\n      },\n\n      getScrollBehavior: function getScrollBehavior() {\n        return scrollBehavior;\n      },\n\n      getRouteAtDepth: function getRouteAtDepth(routeDepth) {\n        var routes = state.routes;\n        return routes && routes[routeDepth];\n      },\n\n      setRouteComponentAtDepth: function setRouteComponentAtDepth(routeDepth, component) {\n        mountedComponents[routeDepth] = component;\n      },\n\n      /**\n       * Returns the current URL path + query string.\n       */\n      getCurrentPath: function getCurrentPath() {\n        return state.path;\n      },\n\n      /**\n       * Returns the current URL path without the query string.\n       */\n      getCurrentPathname: function getCurrentPathname() {\n        return state.pathname;\n      },\n\n      /**\n       * Returns an object of the currently active URL parameters.\n       */\n      getCurrentParams: function getCurrentParams() {\n        return state.params;\n      },\n\n      /**\n       * Returns an object of the currently active query parameters.\n       */\n      getCurrentQuery: function getCurrentQuery() {\n        return state.query;\n      },\n\n      /**\n       * Returns an array of the currently active routes.\n       */\n      getCurrentRoutes: function getCurrentRoutes() {\n        return state.routes;\n      },\n\n      /**\n       * Returns true if the given route, params, and query are active.\n       */\n      isActive: function isActive(to, params, query) {\n        if (PathUtils.isAbsolute(to)) return to === state.path;\n\n        return routeIsActive(state.routes, to) && paramsAreActive(state.params, params) && (query == null || queryIsActive(state.query, query));\n      }\n\n    },\n\n    mixins: [ScrollHistory],\n\n    propTypes: {\n      children: PropTypes.falsy\n    },\n\n    childContextTypes: {\n      routeDepth: PropTypes.number.isRequired,\n      router: PropTypes.router.isRequired\n    },\n\n    getChildContext: function getChildContext() {\n      return {\n        routeDepth: 1,\n        router: Router\n      };\n    },\n\n    getInitialState: function getInitialState() {\n      return state = nextState;\n    },\n\n    componentWillReceiveProps: function componentWillReceiveProps() {\n      this.setState(state = nextState);\n    },\n\n    componentWillUnmount: function componentWillUnmount() {\n      Router.stop();\n    },\n\n    render: function render() {\n      var route = Router.getRouteAtDepth(0);\n      return route ? React.createElement(route.handler, this.props) : null;\n    }\n\n  });\n\n  Router.clearAllRoutes();\n\n  if (options.routes) Router.addRoutes(options.routes);\n\n  return Router;\n}\n\nmodule.exports = createRouter;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/createRouter.js\n// module id = 363\n// module chunks = 0 1","/**\n * Represents a cancellation caused by navigating away\n * before the previous transition has fully resolved.\n */\n\"use strict\";\n\nfunction Cancellation() {}\n\nmodule.exports = Cancellation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Cancellation.js\n// module id = 364\n// module chunks = 0 1","/**\n * Encapsulates a redirect to the given route.\n */\n\"use strict\";\n\nfunction Redirect(to, params, query) {\n  this.to = to;\n  this.params = params;\n  this.query = query;\n}\n\nmodule.exports = Redirect;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Redirect.js\n// module id = 365\n// module chunks = 0 1","\"use strict\";\n\n/**\n * A mixin that allows a component to listen for store change events.\n * Construct this mixin and pass it each store the component should listen to.\n * Whenever any of the stores emits a change event, this mixin will invoke\n * the \"storeDidUpdate()\" callback function that the compnent should have implemented.\n *\n * This mixin handles setting up the listeners when the component mounts\n * and also cleans up listeners when it unmounts. The storeDidUpdate() callback\n * will only be called when the component is mounted.\n *\n * Example:\n *\n * React.createClass({\n *   mixins: [StoreListener(SomeStore)],\n *\n *   storeDidUpdate: function () {\n *     this.setState(SomeStore.getState());\n *   }\n * });\n */\n\nfunction handleChange() {\n  /*jshint validthis:true */\n\n  // The component may have been unmounted by another\n  // listener that was dispatched prior to our handler.\n  // We must check that the component is mounted before\n  // calling the handler.\n  if (this.storeDidUpdate && this._isMounted) {\n    this.storeDidUpdate();\n  }\n}\n\nmodule.exports = function () {\n  for (var _len = arguments.length, stores = Array(_len), _key = 0; _key < _len; _key++) {\n    stores[_key] = arguments[_key];\n  }\n\n  var handler;\n\n  return {\n    _isMounted: false,\n\n    componentDidMount: function componentDidMount() {\n      this._isMounted = true;\n      handler = handleChange.bind(this);\n      stores.forEach(function (store) {\n        return store.addChangeListener(handler);\n      });\n    },\n\n    componentWillUnmount: function componentWillUnmount() {\n      this._isMounted = false;\n      stores.forEach(function (store) {\n        return store.removeChangeListener(handler);\n      });\n    }\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/mixins/store_listener.js\n// module id = 366\n// module chunks = 0 1","\"use strict\";\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar assign = require('object-assign');\n\nvar EventEmitter = require('events').EventEmitter;\n\nvar CHANGE_EVENT = 'change';\n\nvar BaseStore = function () {\n  function BaseStore() {\n    _classCallCheck(this, BaseStore);\n  }\n\n  _createClass(BaseStore, [{\n    key: 'addChangeListener',\n    value: function addChangeListener(listener) {\n      this.addListener(CHANGE_EVENT, listener);\n    }\n  }, {\n    key: 'removeChangeListener',\n    value: function removeChangeListener(listener) {\n      this.removeListener(CHANGE_EVENT, listener);\n    }\n  }, {\n    key: 'emitChange',\n    value: function emitChange() {\n      this.emit(CHANGE_EVENT);\n    }\n  }]);\n\n  return BaseStore;\n}();\n\nassign(BaseStore.prototype, EventEmitter.prototype);\n\nmodule.exports = BaseStore;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/stores/base_store.js\n// module id = 367\n// module chunks = 0 1","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function eventListener() {\n      if (errorListener !== undefined) {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n    var errorListener;\n\n    // Adding an error listener is not optional because\n    // if an error is thrown on an event emitter we cannot\n    // guarantee that the actual event we are waiting will\n    // be fired. The result could be a silent way to create\n    // memory or file descriptor leaks, which is something\n    // we should avoid.\n    if (name !== 'error') {\n      errorListener = function errorListener(err) {\n        emitter.removeListener(name, eventListener);\n        reject(err);\n      };\n\n      emitter.once('error', errorListener);\n    }\n\n    emitter.once(name, eventListener);\n  });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/node-libs-browser/node_modules/events/events.js\n// module id = 368\n// module chunks = 0 1","\"use strict\";\n\nvar assign = require('object-assign');\nvar Flux = require('flux');\n\n/**\n* The global application dispatcher which routes actions to stores.\n* Based on the Flux dispatcher with a few custom methods.\n*\n* This API is mostly used by action creators for dispatching actions.\n* It's also a good place to inspect actions flowing through the\n* application for debugging, logging, and analytic purposes.\n*/\nmodule.exports = assign(new Flux.Dispatcher(), {\n  /**\n  * Dispatch an action which was directly triggered due to an user interaction.\n  */\n  handleViewAction: function handleViewAction(action) {\n    this.dispatch({\n      source: 'VIEW_ACTION',\n      action: action\n    });\n  },\n\n  /**\n  * Dispatch an action which is triggered by a server response.\n  * For example an API request that completes may dispatch a \"success\" or \"error\" action.\n  */\n  handleServerAction: function handleServerAction(action) {\n    this.dispatch({\n      source: 'SERVER_ACTION',\n      action: action\n    });\n  }\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/dispatcher/index.js\n// module id = 369\n// module chunks = 0 1","import {Alert} from '@opengov/ovid';\nimport { BaseStore, Dispatcher } from '@opengov/og_flux';\nimport React from 'react';\n\nimport _ from 'lodash';\n\nclass EntityStore extends BaseStore {\n  constructor() {\n    super();\n\n    this._entities = [];\n    this._entitiesLoading = false;\n    this._entitiesLoadingFailed = false;\n    this._entityTypes = [];\n    this._countries = [];\n    this._states = {};\n    this._groups = [];\n    this._newEntity = null;\n    this._selectedCountry = null;\n\n    Dispatcher.register(payload => this._handleAction(payload.action));\n  }\n\n  getNewEntity = () => {\n    return this._newEntity;\n  }\n\n  getEntities = () => {\n    return this._entities;\n  }\n\n  getEntitiesLoading = () => {\n    return this._entitiesLoading;\n  }\n\n  getEntitiesLoadingFailed = () => {\n    return this._entitiesLoadingFailed;\n  }\n\n  getEntityTypes = () => {\n    return this._entityTypes;\n  }\n\n  getCountries = () => {\n    return this._countries;\n  }\n\n  getStates = () => {\n    return this._states[this._selectedCountry] || [];\n  }\n\n  getGroups = () => {\n    return this._groups;\n  }\n\n  getSelectedCountry = () => {\n    return this._selectedCountry;\n  }\n\n  _handleAction(action) {\n    switch (action.actionType) {\n      case 'ENTITIES_LOADING':\n        this._entitiesLoading = true;\n        this._entitiesLoadingFailed = false;\n        this.emitChange();\n        break;\n\n      case 'ENTITIES_LOADED':\n        const entities = action.entities;\n        this._entitiesLoading = false;\n        this._entities = entities.map((entity) => {\n          return _.extend(entity, {\n            _all: [entity.name, entity.state, entity.country, entity.subdomain, entity.display_name, entity.entity_type && entity.entity_type.name].join(' ')\n          });\n        });\n        this.emitChange();\n        break;\n\n      case 'ENTITIES_LOAD_ERROR':\n        this._entitiesLoadingFailed = true;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_COUNTRY_SELECTED':\n        this._selectedCountry = action.country;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_TYPES_LOADED':\n        this._entityTypes = action.entityTypes;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_COUNTRIES_LOADED':\n        this._countries = action.countries;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_STATES_LOADED':\n        this._states[action.country] = action.states;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_GROUPS_LOADED':\n        this._groups = action.groups;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_NEW':\n        this._newEntity = action.entity;\n        this._selectedCountry = this._newEntity.get('country');\n        this.emitChange();\n        break;\n\n      case 'ENTITY_FORM_SUBMIT':\n        this._newEntity.state = 'SAVING';\n        this.emitChange();\n        break;\n\n      case 'ENTITY_FORM_CANCEL':\n        this._newEntity = null;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_CREATED':\n        this._entities = this._entities.concat(action.entity);\n        this._newEntity = null;\n        this.emitChange();\n        break;\n\n      case 'ENTITY_CREATE_ERROR':\n        const resp = action.response || {};\n        const json = resp.responseJSON || {};\n        this._newEntity = {};\n\n        if (resp.status === 422 && json.errors) {\n          this._newEntity.serverValidationErrors = json.errors;\n        } else {\n          Alert.open({\n            title: 'Error creating entity.',\n            content: <p>{JSON.stringify(json, null, 2) || 'Please try again and if you continue having issues contact Engineering Support.'}</p>\n          });\n        }\n        this._newEntity.state = 'ERROR';\n        this.emitChange();\n        break;\n\n      case 'CONTROL_PANEL_ENTITY_SWITCHER_CLOSE':\n        if (this._newEntity) {\n          this._newEntity = null;\n          this.emitChange();\n        }\n        break;\n\n      default:\n        // do nothing\n    }\n  }\n}\n\nexport default new EntityStore();\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/stores/entity_store.js","/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/amd-options.js\n// module id = 371\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar af = moment.defineLocale('af', {\n    months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),\n    weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n    weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n    meridiemParse: /vm|nm/i,\n    isPM : function (input) {\n        return /^nm$/i.test(input);\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower ? 'vm' : 'VM';\n        } else {\n            return isLower ? 'nm' : 'NM';\n        }\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Vandag om] LT',\n        nextDay : '[Môre om] LT',\n        nextWeek : 'dddd [om] LT',\n        lastDay : '[Gister om] LT',\n        lastWeek : '[Laas] dddd [om] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'oor %s',\n        past : '%s gelede',\n        s : '\\'n paar sekondes',\n        ss : '%d sekondes',\n        m : '\\'n minuut',\n        mm : '%d minute',\n        h : '\\'n uur',\n        hh : '%d ure',\n        d : '\\'n dag',\n        dd : '%d dae',\n        M : '\\'n maand',\n        MM : '%d maande',\n        y : '\\'n jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter\n    },\n    week : {\n        dow : 1, // Maandag is die eerste dag van die week.\n        doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n    }\n});\n\nreturn af;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/af.js\n// module id = 372\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '١',\n    '2': '٢',\n    '3': '٣',\n    '4': '٤',\n    '5': '٥',\n    '6': '٦',\n    '7': '٧',\n    '8': '٨',\n    '9': '٩',\n    '0': '٠'\n}, numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n}, pluralForm = function (n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n}, plurals = {\n    s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n}, pluralize = function (u) {\n    return function (number, withoutSuffix, string, isFuture) {\n        var f = pluralForm(number),\n            str = plurals[u][pluralForm(number)];\n        if (f === 2) {\n            str = str[withoutSuffix ? 0 : 1];\n        }\n        return str.replace(/%d/i, number);\n    };\n}, months = [\n    'يناير',\n    'فبراير',\n    'مارس',\n    'أبريل',\n    'مايو',\n    'يونيو',\n    'يوليو',\n    'أغسطس',\n    'سبتمبر',\n    'أكتوبر',\n    'نوفمبر',\n    'ديسمبر'\n];\n\nvar ar = moment.defineLocale('ar', {\n    months : months,\n    monthsShort : months,\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/\\u200FM/\\u200FYYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم عند الساعة] LT',\n        nextDay: '[غدًا عند الساعة] LT',\n        nextWeek: 'dddd [عند الساعة] LT',\n        lastDay: '[أمس عند الساعة] LT',\n        lastWeek: 'dddd [عند الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'بعد %s',\n        past : 'منذ %s',\n        s : pluralize('s'),\n        ss : pluralize('s'),\n        m : pluralize('m'),\n        mm : pluralize('m'),\n        h : pluralize('h'),\n        hh : pluralize('h'),\n        d : pluralize('d'),\n        dd : pluralize('d'),\n        M : pluralize('M'),\n        MM : pluralize('M'),\n        y : pluralize('y'),\n        yy : pluralize('y')\n    },\n    preparse: function (string) {\n        return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ar;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar.js\n// module id = 373\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arDz = moment.defineLocale('ar-dz', {\n    months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 4  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arDz;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-dz.js\n// module id = 374\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arKw = moment.defineLocale('ar-kw', {\n    months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arKw;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-kw.js\n// module id = 375\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '1',\n    '2': '2',\n    '3': '3',\n    '4': '4',\n    '5': '5',\n    '6': '6',\n    '7': '7',\n    '8': '8',\n    '9': '9',\n    '0': '0'\n}, pluralForm = function (n) {\n    return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;\n}, plurals = {\n    s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],\n    m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],\n    h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],\n    d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],\n    M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],\n    y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']\n}, pluralize = function (u) {\n    return function (number, withoutSuffix, string, isFuture) {\n        var f = pluralForm(number),\n            str = plurals[u][pluralForm(number)];\n        if (f === 2) {\n            str = str[withoutSuffix ? 0 : 1];\n        }\n        return str.replace(/%d/i, number);\n    };\n}, months = [\n    'يناير',\n    'فبراير',\n    'مارس',\n    'أبريل',\n    'مايو',\n    'يونيو',\n    'يوليو',\n    'أغسطس',\n    'سبتمبر',\n    'أكتوبر',\n    'نوفمبر',\n    'ديسمبر'\n];\n\nvar arLy = moment.defineLocale('ar-ly', {\n    months : months,\n    monthsShort : months,\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/\\u200FM/\\u200FYYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم عند الساعة] LT',\n        nextDay: '[غدًا عند الساعة] LT',\n        nextWeek: 'dddd [عند الساعة] LT',\n        lastDay: '[أمس عند الساعة] LT',\n        lastWeek: 'dddd [عند الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'بعد %s',\n        past : 'منذ %s',\n        s : pluralize('s'),\n        ss : pluralize('s'),\n        m : pluralize('m'),\n        mm : pluralize('m'),\n        h : pluralize('h'),\n        hh : pluralize('h'),\n        d : pluralize('d'),\n        dd : pluralize('d'),\n        M : pluralize('M'),\n        MM : pluralize('M'),\n        y : pluralize('y'),\n        yy : pluralize('y')\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arLy;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-ly.js\n// module id = 376\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arMa = moment.defineLocale('ar-ma', {\n    months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),\n    weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arMa;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-ma.js\n// module id = 377\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '١',\n    '2': '٢',\n    '3': '٣',\n    '4': '٤',\n    '5': '٥',\n    '6': '٦',\n    '7': '٧',\n    '8': '٨',\n    '9': '٩',\n    '0': '٠'\n}, numberMap = {\n    '١': '1',\n    '٢': '2',\n    '٣': '3',\n    '٤': '4',\n    '٥': '5',\n    '٦': '6',\n    '٧': '7',\n    '٨': '8',\n    '٩': '9',\n    '٠': '0'\n};\n\nvar arSa = moment.defineLocale('ar-sa', {\n    months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ص|م/,\n    isPM : function (input) {\n        return 'م' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ص';\n        } else {\n            return 'م';\n        }\n    },\n    calendar : {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'في %s',\n        past : 'منذ %s',\n        s : 'ثوان',\n        ss : '%d ثانية',\n        m : 'دقيقة',\n        mm : '%d دقائق',\n        h : 'ساعة',\n        hh : '%d ساعات',\n        d : 'يوم',\n        dd : '%d أيام',\n        M : 'شهر',\n        MM : '%d أشهر',\n        y : 'سنة',\n        yy : '%d سنوات'\n    },\n    preparse: function (string) {\n        return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn arSa;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-sa.js\n// module id = 378\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar arTn = moment.defineLocale('ar-tn', {\n    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),\n    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[اليوم على الساعة] LT',\n        nextDay: '[غدا على الساعة] LT',\n        nextWeek: 'dddd [على الساعة] LT',\n        lastDay: '[أمس على الساعة] LT',\n        lastWeek: 'dddd [على الساعة] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'في %s',\n        past: 'منذ %s',\n        s: 'ثوان',\n        ss : '%d ثانية',\n        m: 'دقيقة',\n        mm: '%d دقائق',\n        h: 'ساعة',\n        hh: '%d ساعات',\n        d: 'يوم',\n        dd: '%d أيام',\n        M: 'شهر',\n        MM: '%d أشهر',\n        y: 'سنة',\n        yy: '%d سنوات'\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn arTn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ar-tn.js\n// module id = 379\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    1: '-inci',\n    5: '-inci',\n    8: '-inci',\n    70: '-inci',\n    80: '-inci',\n    2: '-nci',\n    7: '-nci',\n    20: '-nci',\n    50: '-nci',\n    3: '-üncü',\n    4: '-üncü',\n    100: '-üncü',\n    6: '-ncı',\n    9: '-uncu',\n    10: '-uncu',\n    30: '-uncu',\n    60: '-ıncı',\n    90: '-ıncı'\n};\n\nvar az = moment.defineLocale('az', {\n    months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),\n    monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),\n    weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),\n    weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),\n    weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[bugün saat] LT',\n        nextDay : '[sabah saat] LT',\n        nextWeek : '[gələn həftə] dddd [saat] LT',\n        lastDay : '[dünən] LT',\n        lastWeek : '[keçən həftə] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s sonra',\n        past : '%s əvvəl',\n        s : 'birneçə saniyyə',\n        ss : '%d saniyə',\n        m : 'bir dəqiqə',\n        mm : '%d dəqiqə',\n        h : 'bir saat',\n        hh : '%d saat',\n        d : 'bir gün',\n        dd : '%d gün',\n        M : 'bir ay',\n        MM : '%d ay',\n        y : 'bir il',\n        yy : '%d il'\n    },\n    meridiemParse: /gecə|səhər|gündüz|axşam/,\n    isPM : function (input) {\n        return /^(gündüz|axşam)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'gecə';\n        } else if (hour < 12) {\n            return 'səhər';\n        } else if (hour < 17) {\n            return 'gündüz';\n        } else {\n            return 'axşam';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,\n    ordinal : function (number) {\n        if (number === 0) {  // special case for zero\n            return number + '-ıncı';\n        }\n        var a = number % 10,\n            b = number % 100 - a,\n            c = number >= 100 ? 100 : null;\n        return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn az;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/az.js\n// module id = 380\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n        'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n        'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n        'dd': 'дзень_дні_дзён',\n        'MM': 'месяц_месяцы_месяцаў',\n        'yy': 'год_гады_гадоў'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'хвіліна' : 'хвіліну';\n    }\n    else if (key === 'h') {\n        return withoutSuffix ? 'гадзіна' : 'гадзіну';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\n\nvar be = moment.defineLocale('be', {\n    months : {\n        format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),\n        standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')\n    },\n    monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n    weekdays : {\n        format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),\n        standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),\n        isFormat: /\\[ ?[Вв] ?(?:мінулую|наступную)? ?\\] ?dddd/\n    },\n    weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY г.',\n        LLL : 'D MMMM YYYY г., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY г., HH:mm'\n    },\n    calendar : {\n        sameDay: '[Сёння ў] LT',\n        nextDay: '[Заўтра ў] LT',\n        lastDay: '[Учора ў] LT',\n        nextWeek: function () {\n            return '[У] dddd [ў] LT';\n        },\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 5:\n                case 6:\n                    return '[У мінулую] dddd [ў] LT';\n                case 1:\n                case 2:\n                case 4:\n                    return '[У мінулы] dddd [ў] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'праз %s',\n        past : '%s таму',\n        s : 'некалькі секунд',\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : relativeTimeWithPlural,\n        hh : relativeTimeWithPlural,\n        d : 'дзень',\n        dd : relativeTimeWithPlural,\n        M : 'месяц',\n        MM : relativeTimeWithPlural,\n        y : 'год',\n        yy : relativeTimeWithPlural\n    },\n    meridiemParse: /ночы|раніцы|дня|вечара/,\n    isPM : function (input) {\n        return /^(дня|вечара)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночы';\n        } else if (hour < 12) {\n            return 'раніцы';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечара';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n            case 'w':\n            case 'W':\n                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';\n            case 'D':\n                return number + '-га';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn be;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/be.js\n// module id = 381\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar bg = moment.defineLocale('bg', {\n    months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),\n    weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n    weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'D.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay : '[Днес в] LT',\n        nextDay : '[Утре в] LT',\n        nextWeek : 'dddd [в] LT',\n        lastDay : '[Вчера в] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 6:\n                    return '[В изминалата] dddd [в] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[В изминалия] dddd [в] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'след %s',\n        past : 'преди %s',\n        s : 'няколко секунди',\n        ss : '%d секунди',\n        m : 'минута',\n        mm : '%d минути',\n        h : 'час',\n        hh : '%d часа',\n        d : 'ден',\n        dd : '%d дни',\n        M : 'месец',\n        MM : '%d месеца',\n        y : 'година',\n        yy : '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal : function (number) {\n        var lastDigit = number % 10,\n            last2Digits = number % 100;\n        if (number === 0) {\n            return number + '-ев';\n        } else if (last2Digits === 0) {\n            return number + '-ен';\n        } else if (last2Digits > 10 && last2Digits < 20) {\n            return number + '-ти';\n        } else if (lastDigit === 1) {\n            return number + '-ви';\n        } else if (lastDigit === 2) {\n            return number + '-ри';\n        } else if (lastDigit === 7 || lastDigit === 8) {\n            return number + '-ми';\n        } else {\n            return number + '-ти';\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bg;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/bg.js\n// module id = 382\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar bm = moment.defineLocale('bm', {\n    months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'),\n    monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n    weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n    weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n    weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'MMMM [tile] D [san] YYYY',\n        LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n        LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm'\n    },\n    calendar : {\n        sameDay : '[Bi lɛrɛ] LT',\n        nextDay : '[Sini lɛrɛ] LT',\n        nextWeek : 'dddd [don lɛrɛ] LT',\n        lastDay : '[Kunu lɛrɛ] LT',\n        lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s kɔnɔ',\n        past : 'a bɛ %s bɔ',\n        s : 'sanga dama dama',\n        ss : 'sekondi %d',\n        m : 'miniti kelen',\n        mm : 'miniti %d',\n        h : 'lɛrɛ kelen',\n        hh : 'lɛrɛ %d',\n        d : 'tile kelen',\n        dd : 'tile %d',\n        M : 'kalo kelen',\n        MM : 'kalo %d',\n        y : 'san kelen',\n        yy : 'san %d'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn bm;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/bm.js\n// module id = 383\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '১',\n    '2': '২',\n    '3': '৩',\n    '4': '৪',\n    '5': '৫',\n    '6': '৬',\n    '7': '৭',\n    '8': '৮',\n    '9': '৯',\n    '0': '০'\n},\nnumberMap = {\n    '১': '1',\n    '২': '2',\n    '৩': '3',\n    '৪': '4',\n    '৫': '5',\n    '৬': '6',\n    '৭': '7',\n    '৮': '8',\n    '৯': '9',\n    '০': '0'\n};\n\nvar bn = moment.defineLocale('bn', {\n    months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),\n    monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),\n    weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),\n    weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n    weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm সময়',\n        LTS : 'A h:mm:ss সময়',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm সময়',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'\n    },\n    calendar : {\n        sameDay : '[আজ] LT',\n        nextDay : '[আগামীকাল] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[গতকাল] LT',\n        lastWeek : '[গত] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s পরে',\n        past : '%s আগে',\n        s : 'কয়েক সেকেন্ড',\n        ss : '%d সেকেন্ড',\n        m : 'এক মিনিট',\n        mm : '%d মিনিট',\n        h : 'এক ঘন্টা',\n        hh : '%d ঘন্টা',\n        d : 'এক দিন',\n        dd : '%d দিন',\n        M : 'এক মাস',\n        MM : '%d মাস',\n        y : 'এক বছর',\n        yy : '%d বছর'\n    },\n    preparse: function (string) {\n        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'রাত' && hour >= 4) ||\n                (meridiem === 'দুপুর' && hour < 5) ||\n                meridiem === 'বিকাল') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'রাত';\n        } else if (hour < 10) {\n            return 'সকাল';\n        } else if (hour < 17) {\n            return 'দুপুর';\n        } else if (hour < 20) {\n            return 'বিকাল';\n        } else {\n            return 'রাত';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/bn.js\n// module id = 384\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '༡',\n    '2': '༢',\n    '3': '༣',\n    '4': '༤',\n    '5': '༥',\n    '6': '༦',\n    '7': '༧',\n    '8': '༨',\n    '9': '༩',\n    '0': '༠'\n},\nnumberMap = {\n    '༡': '1',\n    '༢': '2',\n    '༣': '3',\n    '༤': '4',\n    '༥': '5',\n    '༦': '6',\n    '༧': '7',\n    '༨': '8',\n    '༩': '9',\n    '༠': '0'\n};\n\nvar bo = moment.defineLocale('bo', {\n    months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),\n    monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),\n    weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),\n    weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),\n    weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[དི་རིང] LT',\n        nextDay : '[སང་ཉིན] LT',\n        nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',\n        lastDay : '[ཁ་སང] LT',\n        lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ལ་',\n        past : '%s སྔན་ལ',\n        s : 'ལམ་སང',\n        ss : '%d སྐར་ཆ།',\n        m : 'སྐར་མ་གཅིག',\n        mm : '%d སྐར་མ',\n        h : 'ཆུ་ཚོད་གཅིག',\n        hh : '%d ཆུ་ཚོད',\n        d : 'ཉིན་གཅིག',\n        dd : '%d ཉིན་',\n        M : 'ཟླ་བ་གཅིག',\n        MM : '%d ཟླ་བ',\n        y : 'ལོ་གཅིག',\n        yy : '%d ལོ'\n    },\n    preparse: function (string) {\n        return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'མཚན་མོ' && hour >= 4) ||\n                (meridiem === 'ཉིན་གུང' && hour < 5) ||\n                meridiem === 'དགོང་དག') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'མཚན་མོ';\n        } else if (hour < 10) {\n            return 'ཞོགས་ཀས';\n        } else if (hour < 17) {\n            return 'ཉིན་གུང';\n        } else if (hour < 20) {\n            return 'དགོང་དག';\n        } else {\n            return 'མཚན་མོ';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/bo.js\n// module id = 385\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction relativeTimeWithMutation(number, withoutSuffix, key) {\n    var format = {\n        'mm': 'munutenn',\n        'MM': 'miz',\n        'dd': 'devezh'\n    };\n    return number + ' ' + mutation(format[key], number);\n}\nfunction specialMutationForYears(number) {\n    switch (lastNumber(number)) {\n        case 1:\n        case 3:\n        case 4:\n        case 5:\n        case 9:\n            return number + ' bloaz';\n        default:\n            return number + ' vloaz';\n    }\n}\nfunction lastNumber(number) {\n    if (number > 9) {\n        return lastNumber(number % 10);\n    }\n    return number;\n}\nfunction mutation(text, number) {\n    if (number === 2) {\n        return softMutation(text);\n    }\n    return text;\n}\nfunction softMutation(text) {\n    var mutationTable = {\n        'm': 'v',\n        'b': 'v',\n        'd': 'z'\n    };\n    if (mutationTable[text.charAt(0)] === undefined) {\n        return text;\n    }\n    return mutationTable[text.charAt(0)] + text.substring(1);\n}\n\nvar br = moment.defineLocale('br', {\n    months : 'Genver_C\\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),\n    monthsShort : 'Gen_C\\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n    weekdays : 'Sul_Lun_Meurzh_Merc\\'her_Yaou_Gwener_Sadorn'.split('_'),\n    weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n    weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h[e]mm A',\n        LTS : 'h[e]mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D [a viz] MMMM YYYY',\n        LLL : 'D [a viz] MMMM YYYY h[e]mm A',\n        LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'\n    },\n    calendar : {\n        sameDay : '[Hiziv da] LT',\n        nextDay : '[Warc\\'hoazh da] LT',\n        nextWeek : 'dddd [da] LT',\n        lastDay : '[Dec\\'h da] LT',\n        lastWeek : 'dddd [paset da] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'a-benn %s',\n        past : '%s \\'zo',\n        s : 'un nebeud segondennoù',\n        ss : '%d eilenn',\n        m : 'ur vunutenn',\n        mm : relativeTimeWithMutation,\n        h : 'un eur',\n        hh : '%d eur',\n        d : 'un devezh',\n        dd : relativeTimeWithMutation,\n        M : 'ur miz',\n        MM : relativeTimeWithMutation,\n        y : 'ur bloaz',\n        yy : specialMutationForYears\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n    ordinal : function (number) {\n        var output = (number === 1) ? 'añ' : 'vet';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn br;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/br.js\n// module id = 386\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            if (number === 1) {\n                result += 'sekunda';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sekunde';\n            } else {\n                result += 'sekundi';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n        case 'mm':\n            if (number === 1) {\n                result += 'minuta';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'minute';\n            } else {\n                result += 'minuta';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'jedan sat' : 'jednog sata';\n        case 'hh':\n            if (number === 1) {\n                result += 'sat';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sata';\n            } else {\n                result += 'sati';\n            }\n            return result;\n        case 'dd':\n            if (number === 1) {\n                result += 'dan';\n            } else {\n                result += 'dana';\n            }\n            return result;\n        case 'MM':\n            if (number === 1) {\n                result += 'mjesec';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'mjeseca';\n            } else {\n                result += 'mjeseci';\n            }\n            return result;\n        case 'yy':\n            if (number === 1) {\n                result += 'godina';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'godine';\n            } else {\n                result += 'godina';\n            }\n            return result;\n    }\n}\n\nvar bs = moment.defineLocale('bs', {\n    months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danas u] LT',\n        nextDay  : '[sutra u] LT',\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[jučer u] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                    return '[prošlu] dddd [u] LT';\n                case 6:\n                    return '[prošle] [subote] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prošli] dddd [u] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'par sekundi',\n        ss     : translate,\n        m      : translate,\n        mm     : translate,\n        h      : translate,\n        hh     : translate,\n        d      : 'dan',\n        dd     : translate,\n        M      : 'mjesec',\n        MM     : translate,\n        y      : 'godinu',\n        yy     : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn bs;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/bs.js\n// module id = 387\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ca = moment.defineLocale('ca', {\n    months : {\n        standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),\n        format: 'de gener_de febrer_de març_d\\'abril_de maig_de juny_de juliol_d\\'agost_de setembre_d\\'octubre_de novembre_de desembre'.split('_'),\n        isFormat: /D[oD]?(\\s)+MMMM/\n    },\n    monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),\n    weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n    weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM [de] YYYY',\n        ll : 'D MMM YYYY',\n        LLL : 'D MMMM [de] YYYY [a les] H:mm',\n        lll : 'D MMM YYYY, H:mm',\n        LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm',\n        llll : 'ddd D MMM YYYY, H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        nextDay : function () {\n            return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        lastDay : function () {\n            return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'd\\'aquí %s',\n        past : 'fa %s',\n        s : 'uns segons',\n        ss : '%d segons',\n        m : 'un minut',\n        mm : '%d minuts',\n        h : 'una hora',\n        hh : '%d hores',\n        d : 'un dia',\n        dd : '%d dies',\n        M : 'un mes',\n        MM : '%d mesos',\n        y : 'un any',\n        yy : '%d anys'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n    ordinal : function (number, period) {\n        var output = (number === 1) ? 'r' :\n            (number === 2) ? 'n' :\n            (number === 3) ? 'r' :\n            (number === 4) ? 't' : 'è';\n        if (period === 'w' || period === 'W') {\n            output = 'a';\n        }\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ca;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ca.js\n// module id = 388\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),\n    monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');\nfunction plural(n) {\n    return (n > 1) && (n < 5) && (~~(n / 10) !== 1);\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':  // a few seconds / in a few seconds / a few seconds ago\n            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';\n        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'sekundy' : 'sekund');\n            } else {\n                return result + 'sekundami';\n            }\n            break;\n        case 'm':  // a minute / in a minute / a minute ago\n            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');\n        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'minuty' : 'minut');\n            } else {\n                return result + 'minutami';\n            }\n            break;\n        case 'h':  // an hour / in an hour / an hour ago\n            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');\n        case 'hh': // 9 hours / in 9 hours / 9 hours ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'hodiny' : 'hodin');\n            } else {\n                return result + 'hodinami';\n            }\n            break;\n        case 'd':  // a day / in a day / a day ago\n            return (withoutSuffix || isFuture) ? 'den' : 'dnem';\n        case 'dd': // 9 days / in 9 days / 9 days ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'dny' : 'dní');\n            } else {\n                return result + 'dny';\n            }\n            break;\n        case 'M':  // a month / in a month / a month ago\n            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';\n        case 'MM': // 9 months / in 9 months / 9 months ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'měsíce' : 'měsíců');\n            } else {\n                return result + 'měsíci';\n            }\n            break;\n        case 'y':  // a year / in a year / a year ago\n            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';\n        case 'yy': // 9 years / in 9 years / 9 years ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'roky' : 'let');\n            } else {\n                return result + 'lety';\n            }\n            break;\n    }\n}\n\nvar cs = moment.defineLocale('cs', {\n    months : months,\n    monthsShort : monthsShort,\n    monthsParse : (function (months, monthsShort) {\n        var i, _monthsParse = [];\n        for (i = 0; i < 12; i++) {\n            // use custom parser to solve problem with July (červenec)\n            _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');\n        }\n        return _monthsParse;\n    }(months, monthsShort)),\n    shortMonthsParse : (function (monthsShort) {\n        var i, _shortMonthsParse = [];\n        for (i = 0; i < 12; i++) {\n            _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');\n        }\n        return _shortMonthsParse;\n    }(monthsShort)),\n    longMonthsParse : (function (months) {\n        var i, _longMonthsParse = [];\n        for (i = 0; i < 12; i++) {\n            _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');\n        }\n        return _longMonthsParse;\n    }(months)),\n    weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n    weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),\n    weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),\n    longDateFormat : {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd D. MMMM YYYY H:mm',\n        l : 'D. M. YYYY'\n    },\n    calendar : {\n        sameDay: '[dnes v] LT',\n        nextDay: '[zítra v] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v neděli v] LT';\n                case 1:\n                case 2:\n                    return '[v] dddd [v] LT';\n                case 3:\n                    return '[ve středu v] LT';\n                case 4:\n                    return '[ve čtvrtek v] LT';\n                case 5:\n                    return '[v pátek v] LT';\n                case 6:\n                    return '[v sobotu v] LT';\n            }\n        },\n        lastDay: '[včera v] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[minulou neděli v] LT';\n                case 1:\n                case 2:\n                    return '[minulé] dddd [v] LT';\n                case 3:\n                    return '[minulou středu v] LT';\n                case 4:\n                case 5:\n                    return '[minulý] dddd [v] LT';\n                case 6:\n                    return '[minulou sobotu v] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : 'před %s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn cs;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/cs.js\n// module id = 389\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar cv = moment.defineLocale('cv', {\n    months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),\n    monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),\n    weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),\n    weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),\n    weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',\n        LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',\n        LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'\n    },\n    calendar : {\n        sameDay: '[Паян] LT [сехетре]',\n        nextDay: '[Ыран] LT [сехетре]',\n        lastDay: '[Ӗнер] LT [сехетре]',\n        nextWeek: '[Ҫитес] dddd LT [сехетре]',\n        lastWeek: '[Иртнӗ] dddd LT [сехетре]',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : function (output) {\n            var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';\n            return output + affix;\n        },\n        past : '%s каялла',\n        s : 'пӗр-ик ҫеккунт',\n        ss : '%d ҫеккунт',\n        m : 'пӗр минут',\n        mm : '%d минут',\n        h : 'пӗр сехет',\n        hh : '%d сехет',\n        d : 'пӗр кун',\n        dd : '%d кун',\n        M : 'пӗр уйӑх',\n        MM : '%d уйӑх',\n        y : 'пӗр ҫул',\n        yy : '%d ҫул'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-мӗш/,\n    ordinal : '%d-мӗш',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn cv;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/cv.js\n// module id = 390\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar cy = moment.defineLocale('cy', {\n    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),\n    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),\n    weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),\n    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n    weekdaysParseExact : true,\n    // time formats are the same as en-gb\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[Heddiw am] LT',\n        nextDay: '[Yfory am] LT',\n        nextWeek: 'dddd [am] LT',\n        lastDay: '[Ddoe am] LT',\n        lastWeek: 'dddd [diwethaf am] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'mewn %s',\n        past: '%s yn ôl',\n        s: 'ychydig eiliadau',\n        ss: '%d eiliad',\n        m: 'munud',\n        mm: '%d munud',\n        h: 'awr',\n        hh: '%d awr',\n        d: 'diwrnod',\n        dd: '%d diwrnod',\n        M: 'mis',\n        MM: '%d mis',\n        y: 'blwyddyn',\n        yy: '%d flynedd'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n    ordinal: function (number) {\n        var b = number,\n            output = '',\n            lookup = [\n                '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed\n                'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed\n            ];\n        if (b > 20) {\n            if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n                output = 'fed'; // not 30ain, 70ain or 90ain\n            } else {\n                output = 'ain';\n            }\n        } else if (b > 0) {\n            output = lookup[b];\n        }\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn cy;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/cy.js\n// module id = 391\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar da = moment.defineLocale('da', {\n    months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),\n    weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay : '[i dag kl.] LT',\n        nextDay : '[i morgen kl.] LT',\n        nextWeek : 'på dddd [kl.] LT',\n        lastDay : '[i går kl.] LT',\n        lastWeek : '[i] dddd[s kl.] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s siden',\n        s : 'få sekunder',\n        ss : '%d sekunder',\n        m : 'et minut',\n        mm : '%d minutter',\n        h : 'en time',\n        hh : '%d timer',\n        d : 'en dag',\n        dd : '%d dage',\n        M : 'en måned',\n        MM : '%d måneder',\n        y : 'et år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn da;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/da.js\n// module id = 392\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar de = moment.defineLocale('de', {\n    months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn de;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/de.js\n// module id = 393\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar deAt = moment.defineLocale('de-at', {\n    months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn deAt;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/de-at.js\n// module id = 394\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eine Minute', 'einer Minute'],\n        'h': ['eine Stunde', 'einer Stunde'],\n        'd': ['ein Tag', 'einem Tag'],\n        'dd': [number + ' Tage', number + ' Tagen'],\n        'M': ['ein Monat', 'einem Monat'],\n        'MM': [number + ' Monate', number + ' Monaten'],\n        'y': ['ein Jahr', 'einem Jahr'],\n        'yy': [number + ' Jahre', number + ' Jahren']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar deCh = moment.defineLocale('de-ch', {\n    months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),\n    weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY HH:mm',\n        LLLL : 'dddd, D. MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[heute um] LT [Uhr]',\n        sameElse: 'L',\n        nextDay: '[morgen um] LT [Uhr]',\n        nextWeek: 'dddd [um] LT [Uhr]',\n        lastDay: '[gestern um] LT [Uhr]',\n        lastWeek: '[letzten] dddd [um] LT [Uhr]'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : 'vor %s',\n        s : 'ein paar Sekunden',\n        ss : '%d Sekunden',\n        m : processRelativeTime,\n        mm : '%d Minuten',\n        h : processRelativeTime,\n        hh : '%d Stunden',\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn deCh;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/de-ch.js\n// module id = 395\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'ޖެނުއަރީ',\n    'ފެބްރުއަރީ',\n    'މާރިޗު',\n    'އޭޕްރީލު',\n    'މޭ',\n    'ޖޫން',\n    'ޖުލައި',\n    'އޯގަސްޓު',\n    'ސެޕްޓެމްބަރު',\n    'އޮކްޓޯބަރު',\n    'ނޮވެމްބަރު',\n    'ޑިސެމްބަރު'\n], weekdays = [\n    'އާދިއްތަ',\n    'ހޯމަ',\n    'އަންގާރަ',\n    'ބުދަ',\n    'ބުރާސްފަތި',\n    'ހުކުރު',\n    'ހޮނިހިރު'\n];\n\nvar dv = moment.defineLocale('dv', {\n    months : months,\n    monthsShort : months,\n    weekdays : weekdays,\n    weekdaysShort : weekdays,\n    weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n    longDateFormat : {\n\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'D/M/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /މކ|މފ/,\n    isPM : function (input) {\n        return 'މފ' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'މކ';\n        } else {\n            return 'މފ';\n        }\n    },\n    calendar : {\n        sameDay : '[މިއަދު] LT',\n        nextDay : '[މާދަމާ] LT',\n        nextWeek : 'dddd LT',\n        lastDay : '[އިއްޔެ] LT',\n        lastWeek : '[ފާއިތުވި] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ތެރޭގައި %s',\n        past : 'ކުރިން %s',\n        s : 'ސިކުންތުކޮޅެއް',\n        ss : 'd% ސިކުންތު',\n        m : 'މިނިޓެއް',\n        mm : 'މިނިޓު %d',\n        h : 'ގަޑިއިރެއް',\n        hh : 'ގަޑިއިރު %d',\n        d : 'ދުވަހެއް',\n        dd : 'ދުވަސް %d',\n        M : 'މަހެއް',\n        MM : 'މަސް %d',\n        y : 'އަހަރެއް',\n        yy : 'އަހަރު %d'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 7,  // Sunday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn dv;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/dv.js\n// module id = 396\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\n\nvar el = moment.defineLocale('el', {\n    monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),\n    monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),\n    months : function (momentToFormat, format) {\n        if (!momentToFormat) {\n            return this._monthsNominativeEl;\n        } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'\n            return this._monthsGenitiveEl[momentToFormat.month()];\n        } else {\n            return this._monthsNominativeEl[momentToFormat.month()];\n        }\n    },\n    monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n    weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),\n    weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n    weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'μμ' : 'ΜΜ';\n        } else {\n            return isLower ? 'πμ' : 'ΠΜ';\n        }\n    },\n    isPM : function (input) {\n        return ((input + '').toLowerCase()[0] === 'μ');\n    },\n    meridiemParse : /[ΠΜ]\\.?Μ?\\.?/i,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendarEl : {\n        sameDay : '[Σήμερα {}] LT',\n        nextDay : '[Αύριο {}] LT',\n        nextWeek : 'dddd [{}] LT',\n        lastDay : '[Χθες {}] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 6:\n                    return '[το προηγούμενο] dddd [{}] LT';\n                default:\n                    return '[την προηγούμενη] dddd [{}] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    calendar : function (key, mom) {\n        var output = this._calendarEl[key],\n            hours = mom && mom.hours();\n        if (isFunction(output)) {\n            output = output.apply(mom);\n        }\n        return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));\n    },\n    relativeTime : {\n        future : 'σε %s',\n        past : '%s πριν',\n        s : 'λίγα δευτερόλεπτα',\n        ss : '%d δευτερόλεπτα',\n        m : 'ένα λεπτό',\n        mm : '%d λεπτά',\n        h : 'μία ώρα',\n        hh : '%d ώρες',\n        d : 'μία μέρα',\n        dd : '%d μέρες',\n        M : 'ένας μήνας',\n        MM : '%d μήνες',\n        y : 'ένας χρόνος',\n        yy : '%d χρόνια'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}η/,\n    ordinal: '%dη',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4st is the first week of the year.\n    }\n});\n\nreturn el;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/el.js\n// module id = 397\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enAu = moment.defineLocale('en-au', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enAu;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-au.js\n// module id = 398\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enCa = moment.defineLocale('en-ca', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'YYYY-MM-DD',\n        LL : 'MMMM D, YYYY',\n        LLL : 'MMMM D, YYYY h:mm A',\n        LLLL : 'dddd, MMMM D, YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\nreturn enCa;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-ca.js\n// module id = 399\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enGb = moment.defineLocale('en-gb', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enGb;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-gb.js\n// module id = 400\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enIe = moment.defineLocale('en-ie', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enIe;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-ie.js\n// module id = 401\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enIl = moment.defineLocale('en-il', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\nreturn enIl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-il.js\n// module id = 402\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar enNz = moment.defineLocale('en-nz', {\n    months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n    weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n    weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n    weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'in %s',\n        past : '%s ago',\n        s : 'a few seconds',\n        ss : '%d seconds',\n        m : 'a minute',\n        mm : '%d minutes',\n        h : 'an hour',\n        hh : '%d hours',\n        d : 'a day',\n        dd : '%d days',\n        M : 'a month',\n        MM : '%d months',\n        y : 'a year',\n        yy : '%d years'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn enNz;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/en-nz.js\n// module id = 403\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar eo = moment.defineLocale('eo', {\n    months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),\n    weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n    weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D[-a de] MMMM, YYYY',\n        LLL : 'D[-a de] MMMM, YYYY HH:mm',\n        LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm'\n    },\n    meridiemParse: /[ap]\\.t\\.m/i,\n    isPM: function (input) {\n        return input.charAt(0).toLowerCase() === 'p';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'p.t.m.' : 'P.T.M.';\n        } else {\n            return isLower ? 'a.t.m.' : 'A.T.M.';\n        }\n    },\n    calendar : {\n        sameDay : '[Hodiaŭ je] LT',\n        nextDay : '[Morgaŭ je] LT',\n        nextWeek : 'dddd [je] LT',\n        lastDay : '[Hieraŭ je] LT',\n        lastWeek : '[pasinta] dddd [je] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'post %s',\n        past : 'antaŭ %s',\n        s : 'sekundoj',\n        ss : '%d sekundoj',\n        m : 'minuto',\n        mm : '%d minutoj',\n        h : 'horo',\n        hh : '%d horoj',\n        d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo\n        dd : '%d tagoj',\n        M : 'monato',\n        MM : '%d monatoj',\n        y : 'jaro',\n        yy : '%d jaroj'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}a/,\n    ordinal : '%da',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn eo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/eo.js\n// module id = 404\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];\nvar monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\nvar es = moment.defineLocale('es', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsRegex : monthsRegex,\n    monthsShortRegex : monthsRegex,\n    monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex : /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY H:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn es;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/es.js\n// module id = 405\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];\nvar monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\nvar esDo = moment.defineLocale('es-do', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n    monthsShortStrictRegex: /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n    monthsParse: monthsParse,\n    longMonthsParse: monthsParse,\n    shortMonthsParse: monthsParse,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY h:mm A',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn esDo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/es-do.js\n// module id = 406\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\n    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\n\nvar esUs = moment.defineLocale('es-us', {\n    months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortDot;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShort[m.month()];\n        } else {\n            return monthsShortDot[m.month()];\n        }\n    },\n    monthsParseExact : true,\n    weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'MM/DD/YYYY',\n        LL : 'MMMM [de] D [de] YYYY',\n        LLL : 'MMMM [de] D [de] YYYY h:mm A',\n        LLLL : 'dddd, MMMM [de] D [de] YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastDay : function () {\n            return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        lastWeek : function () {\n            return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'en %s',\n        past : 'hace %s',\n        s : 'unos segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'una hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un año',\n        yy : '%d años'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn esUs;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/es-us.js\n// module id = 407\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n        'ss': [number + 'sekundi', number + 'sekundit'],\n        'm' : ['ühe minuti', 'üks minut'],\n        'mm': [number + ' minuti', number + ' minutit'],\n        'h' : ['ühe tunni', 'tund aega', 'üks tund'],\n        'hh': [number + ' tunni', number + ' tundi'],\n        'd' : ['ühe päeva', 'üks päev'],\n        'M' : ['kuu aja', 'kuu aega', 'üks kuu'],\n        'MM': [number + ' kuu', number + ' kuud'],\n        'y' : ['ühe aasta', 'aasta', 'üks aasta'],\n        'yy': [number + ' aasta', number + ' aastat']\n    };\n    if (withoutSuffix) {\n        return format[key][2] ? format[key][2] : format[key][1];\n    }\n    return isFuture ? format[key][0] : format[key][1];\n}\n\nvar et = moment.defineLocale('et', {\n    months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),\n    monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n    weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),\n    weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),\n    weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),\n    longDateFormat : {\n        LT   : 'H:mm',\n        LTS : 'H:mm:ss',\n        L    : 'DD.MM.YYYY',\n        LL   : 'D. MMMM YYYY',\n        LLL  : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[Täna,] LT',\n        nextDay  : '[Homme,] LT',\n        nextWeek : '[Järgmine] dddd LT',\n        lastDay  : '[Eile,] LT',\n        lastWeek : '[Eelmine] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s pärast',\n        past   : '%s tagasi',\n        s      : processRelativeTime,\n        ss     : processRelativeTime,\n        m      : processRelativeTime,\n        mm     : processRelativeTime,\n        h      : processRelativeTime,\n        hh     : processRelativeTime,\n        d      : processRelativeTime,\n        dd     : '%d päeva',\n        M      : processRelativeTime,\n        MM     : processRelativeTime,\n        y      : processRelativeTime,\n        yy     : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn et;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/et.js\n// module id = 408\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar eu = moment.defineLocale('eu', {\n    months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),\n    monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),\n    weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),\n    weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'YYYY[ko] MMMM[ren] D[a]',\n        LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n        LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n        l : 'YYYY-M-D',\n        ll : 'YYYY[ko] MMM D[a]',\n        lll : 'YYYY[ko] MMM D[a] HH:mm',\n        llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'\n    },\n    calendar : {\n        sameDay : '[gaur] LT[etan]',\n        nextDay : '[bihar] LT[etan]',\n        nextWeek : 'dddd LT[etan]',\n        lastDay : '[atzo] LT[etan]',\n        lastWeek : '[aurreko] dddd LT[etan]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s barru',\n        past : 'duela %s',\n        s : 'segundo batzuk',\n        ss : '%d segundo',\n        m : 'minutu bat',\n        mm : '%d minutu',\n        h : 'ordu bat',\n        hh : '%d ordu',\n        d : 'egun bat',\n        dd : '%d egun',\n        M : 'hilabete bat',\n        MM : '%d hilabete',\n        y : 'urte bat',\n        yy : '%d urte'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn eu;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/eu.js\n// module id = 409\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '۱',\n    '2': '۲',\n    '3': '۳',\n    '4': '۴',\n    '5': '۵',\n    '6': '۶',\n    '7': '۷',\n    '8': '۸',\n    '9': '۹',\n    '0': '۰'\n}, numberMap = {\n    '۱': '1',\n    '۲': '2',\n    '۳': '3',\n    '۴': '4',\n    '۵': '5',\n    '۶': '6',\n    '۷': '7',\n    '۸': '8',\n    '۹': '9',\n    '۰': '0'\n};\n\nvar fa = moment.defineLocale('fa', {\n    months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),\n    weekdays : 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split('_'),\n    weekdaysShort : 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split('_'),\n    weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /قبل از ظهر|بعد از ظهر/,\n    isPM: function (input) {\n        return /بعد از ظهر/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'قبل از ظهر';\n        } else {\n            return 'بعد از ظهر';\n        }\n    },\n    calendar : {\n        sameDay : '[امروز ساعت] LT',\n        nextDay : '[فردا ساعت] LT',\n        nextWeek : 'dddd [ساعت] LT',\n        lastDay : '[دیروز ساعت] LT',\n        lastWeek : 'dddd [پیش] [ساعت] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'در %s',\n        past : '%s پیش',\n        s : 'چند ثانیه',\n        ss : 'ثانیه d%',\n        m : 'یک دقیقه',\n        mm : '%d دقیقه',\n        h : 'یک ساعت',\n        hh : '%d ساعت',\n        d : 'یک روز',\n        dd : '%d روز',\n        M : 'یک ماه',\n        MM : '%d ماه',\n        y : 'یک سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/[۰-۹]/g, function (match) {\n            return numberMap[match];\n        }).replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        }).replace(/,/g, '،');\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}م/,\n    ordinal : '%dم',\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn fa;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fa.js\n// module id = 410\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),\n    numbersFuture = [\n        'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',\n        numbersPast[7], numbersPast[8], numbersPast[9]\n    ];\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = '';\n    switch (key) {\n        case 's':\n            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';\n        case 'ss':\n            return isFuture ? 'sekunnin' : 'sekuntia';\n        case 'm':\n            return isFuture ? 'minuutin' : 'minuutti';\n        case 'mm':\n            result = isFuture ? 'minuutin' : 'minuuttia';\n            break;\n        case 'h':\n            return isFuture ? 'tunnin' : 'tunti';\n        case 'hh':\n            result = isFuture ? 'tunnin' : 'tuntia';\n            break;\n        case 'd':\n            return isFuture ? 'päivän' : 'päivä';\n        case 'dd':\n            result = isFuture ? 'päivän' : 'päivää';\n            break;\n        case 'M':\n            return isFuture ? 'kuukauden' : 'kuukausi';\n        case 'MM':\n            result = isFuture ? 'kuukauden' : 'kuukautta';\n            break;\n        case 'y':\n            return isFuture ? 'vuoden' : 'vuosi';\n        case 'yy':\n            result = isFuture ? 'vuoden' : 'vuotta';\n            break;\n    }\n    result = verbalNumber(number, isFuture) + ' ' + result;\n    return result;\n}\nfunction verbalNumber(number, isFuture) {\n    return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;\n}\n\nvar fi = moment.defineLocale('fi', {\n    months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),\n    monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),\n    weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),\n    weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),\n    weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD.MM.YYYY',\n        LL : 'Do MMMM[ta] YYYY',\n        LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',\n        LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',\n        l : 'D.M.YYYY',\n        ll : 'Do MMM YYYY',\n        lll : 'Do MMM YYYY, [klo] HH.mm',\n        llll : 'ddd, Do MMM YYYY, [klo] HH.mm'\n    },\n    calendar : {\n        sameDay : '[tänään] [klo] LT',\n        nextDay : '[huomenna] [klo] LT',\n        nextWeek : 'dddd [klo] LT',\n        lastDay : '[eilen] [klo] LT',\n        lastWeek : '[viime] dddd[na] [klo] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s päästä',\n        past : '%s sitten',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fi;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fi.js\n// module id = 411\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fo = moment.defineLocale('fo', {\n    months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n    weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),\n    weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n    weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D. MMMM, YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Í dag kl.] LT',\n        nextDay : '[Í morgin kl.] LT',\n        nextWeek : 'dddd [kl.] LT',\n        lastDay : '[Í gjár kl.] LT',\n        lastWeek : '[síðstu] dddd [kl] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'um %s',\n        past : '%s síðani',\n        s : 'fá sekund',\n        ss : '%d sekundir',\n        m : 'ein minutt',\n        mm : '%d minuttir',\n        h : 'ein tími',\n        hh : '%d tímar',\n        d : 'ein dagur',\n        dd : '%d dagar',\n        M : 'ein mánaði',\n        MM : '%d mánaðir',\n        y : 'eitt ár',\n        yy : '%d ár'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fo.js\n// module id = 412\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fr = moment.defineLocale('fr', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // TODO: Return 'e' when day of month > 1. Move this case inside\n            // block for masculine words below.\n            // See https://github.com/moment/moment/issues/3375\n            case 'D':\n                return number + (number === 1 ? 'er' : '');\n\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fr.js\n// module id = 413\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar frCa = moment.defineLocale('fr-ca', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'D':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    }\n});\n\nreturn frCa;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fr-ca.js\n// module id = 414\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar frCh = moment.defineLocale('fr-ch', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'D':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn frCh;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fr-ch.js\n// module id = 415\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n\nvar fy = moment.defineLocale('fy', {\n    months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n    monthsParseExact : true,\n    weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),\n    weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),\n    weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[hjoed om] LT',\n        nextDay: '[moarn om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[juster om] LT',\n        lastWeek: '[ôfrûne] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'oer %s',\n        past : '%s lyn',\n        s : 'in pear sekonden',\n        ss : '%d sekonden',\n        m : 'ien minút',\n        mm : '%d minuten',\n        h : 'ien oere',\n        hh : '%d oeren',\n        d : 'ien dei',\n        dd : '%d dagen',\n        M : 'ien moanne',\n        MM : '%d moannen',\n        y : 'ien jier',\n        yy : '%d jierren'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fy;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/fy.js\n// module id = 416\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'\n];\n\nvar monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];\n\nvar weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];\n\nvar weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];\n\nvar weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n\nvar gd = moment.defineLocale('gd', {\n    months : months,\n    monthsShort : monthsShort,\n    monthsParseExact : true,\n    weekdays : weekdays,\n    weekdaysShort : weekdaysShort,\n    weekdaysMin : weekdaysMin,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[An-diugh aig] LT',\n        nextDay : '[A-màireach aig] LT',\n        nextWeek : 'dddd [aig] LT',\n        lastDay : '[An-dè aig] LT',\n        lastWeek : 'dddd [seo chaidh] [aig] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ann an %s',\n        past : 'bho chionn %s',\n        s : 'beagan diogan',\n        ss : '%d diogan',\n        m : 'mionaid',\n        mm : '%d mionaidean',\n        h : 'uair',\n        hh : '%d uairean',\n        d : 'latha',\n        dd : '%d latha',\n        M : 'mìos',\n        MM : '%d mìosan',\n        y : 'bliadhna',\n        yy : '%d bliadhna'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(d|na|mh)/,\n    ordinal : function (number) {\n        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn gd;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/gd.js\n// module id = 417\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar gl = moment.defineLocale('gl', {\n    months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),\n    monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),\n    weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),\n    weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY H:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'\n    },\n    calendar : {\n        sameDay : function () {\n            return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';\n        },\n        nextDay : function () {\n            return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';\n        },\n        nextWeek : function () {\n            return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';\n        },\n        lastDay : function () {\n            return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';\n        },\n        lastWeek : function () {\n            return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : function (str) {\n            if (str.indexOf('un') === 0) {\n                return 'n' + str;\n            }\n            return 'en ' + str;\n        },\n        past : 'hai %s',\n        s : 'uns segundos',\n        ss : '%d segundos',\n        m : 'un minuto',\n        mm : '%d minutos',\n        h : 'unha hora',\n        hh : '%d horas',\n        d : 'un día',\n        dd : '%d días',\n        M : 'un mes',\n        MM : '%d meses',\n        y : 'un ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn gl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/gl.js\n// module id = 418\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's': ['thodde secondanim', 'thodde second'],\n        'ss': [number + ' secondanim', number + ' second'],\n        'm': ['eka mintan', 'ek minute'],\n        'mm': [number + ' mintanim', number + ' mintam'],\n        'h': ['eka horan', 'ek hor'],\n        'hh': [number + ' horanim', number + ' hor'],\n        'd': ['eka disan', 'ek dis'],\n        'dd': [number + ' disanim', number + ' dis'],\n        'M': ['eka mhoinean', 'ek mhoino'],\n        'MM': [number + ' mhoineanim', number + ' mhoine'],\n        'y': ['eka vorsan', 'ek voros'],\n        'yy': [number + ' vorsanim', number + ' vorsam']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\n\nvar gomLatn = moment.defineLocale('gom-latn', {\n    months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'),\n    monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\\'var'.split('_'),\n    weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),\n    weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'A h:mm [vazta]',\n        LTS : 'A h:mm:ss [vazta]',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY A h:mm [vazta]',\n        LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]',\n        llll: 'ddd, D MMM YYYY, A h:mm [vazta]'\n    },\n    calendar : {\n        sameDay: '[Aiz] LT',\n        nextDay: '[Faleam] LT',\n        nextWeek: '[Ieta to] dddd[,] LT',\n        lastDay: '[Kal] LT',\n        lastWeek: '[Fatlo] dddd[,] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s',\n        past : '%s adim',\n        s : processRelativeTime,\n        ss : processRelativeTime,\n        m : processRelativeTime,\n        mm : processRelativeTime,\n        h : processRelativeTime,\n        hh : processRelativeTime,\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(er)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // the ordinal 'er' only applies to day of the month\n            case 'D':\n                return number + 'er';\n            default:\n            case 'M':\n            case 'Q':\n            case 'DDD':\n            case 'd':\n            case 'w':\n            case 'W':\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    },\n    meridiemParse: /rati|sokalli|donparam|sanje/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'rati') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'sokalli') {\n            return hour;\n        } else if (meridiem === 'donparam') {\n            return hour > 12 ? hour : hour + 12;\n        } else if (meridiem === 'sanje') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'rati';\n        } else if (hour < 12) {\n            return 'sokalli';\n        } else if (hour < 16) {\n            return 'donparam';\n        } else if (hour < 20) {\n            return 'sanje';\n        } else {\n            return 'rati';\n        }\n    }\n});\n\nreturn gomLatn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/gom-latn.js\n// module id = 419\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n        '1': '૧',\n        '2': '૨',\n        '3': '૩',\n        '4': '૪',\n        '5': '૫',\n        '6': '૬',\n        '7': '૭',\n        '8': '૮',\n        '9': '૯',\n        '0': '૦'\n    },\n    numberMap = {\n        '૧': '1',\n        '૨': '2',\n        '૩': '3',\n        '૪': '4',\n        '૫': '5',\n        '૬': '6',\n        '૭': '7',\n        '૮': '8',\n        '૯': '9',\n        '૦': '0'\n    };\n\nvar gu = moment.defineLocale('gu', {\n    months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'),\n    monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'),\n    weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),\n    weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),\n    longDateFormat: {\n        LT: 'A h:mm વાગ્યે',\n        LTS: 'A h:mm:ss વાગ્યે',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY, A h:mm વાગ્યે',\n        LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે'\n    },\n    calendar: {\n        sameDay: '[આજ] LT',\n        nextDay: '[કાલે] LT',\n        nextWeek: 'dddd, LT',\n        lastDay: '[ગઇકાલે] LT',\n        lastWeek: '[પાછલા] dddd, LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%s મા',\n        past: '%s પેહલા',\n        s: 'અમુક પળો',\n        ss: '%d સેકંડ',\n        m: 'એક મિનિટ',\n        mm: '%d મિનિટ',\n        h: 'એક કલાક',\n        hh: '%d કલાક',\n        d: 'એક દિવસ',\n        dd: '%d દિવસ',\n        M: 'એક મહિનો',\n        MM: '%d મહિનો',\n        y: 'એક વર્ષ',\n        yy: '%d વર્ષ'\n    },\n    preparse: function (string) {\n        return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Gujarati notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.\n    meridiemParse: /રાત|બપોર|સવાર|સાંજ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'રાત') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'સવાર') {\n            return hour;\n        } else if (meridiem === 'બપોર') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'સાંજ') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'રાત';\n        } else if (hour < 10) {\n            return 'સવાર';\n        } else if (hour < 17) {\n            return 'બપોર';\n        } else if (hour < 20) {\n            return 'સાંજ';\n        } else {\n            return 'રાત';\n        }\n    },\n    week: {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn gu;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/gu.js\n// module id = 420\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar he = moment.defineLocale('he', {\n    months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),\n    monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n    weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n    weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n    weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [ב]MMMM YYYY',\n        LLL : 'D [ב]MMMM YYYY HH:mm',\n        LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',\n        l : 'D/M/YYYY',\n        ll : 'D MMM YYYY',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[היום ב־]LT',\n        nextDay : '[מחר ב־]LT',\n        nextWeek : 'dddd [בשעה] LT',\n        lastDay : '[אתמול ב־]LT',\n        lastWeek : '[ביום] dddd [האחרון בשעה] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'בעוד %s',\n        past : 'לפני %s',\n        s : 'מספר שניות',\n        ss : '%d שניות',\n        m : 'דקה',\n        mm : '%d דקות',\n        h : 'שעה',\n        hh : function (number) {\n            if (number === 2) {\n                return 'שעתיים';\n            }\n            return number + ' שעות';\n        },\n        d : 'יום',\n        dd : function (number) {\n            if (number === 2) {\n                return 'יומיים';\n            }\n            return number + ' ימים';\n        },\n        M : 'חודש',\n        MM : function (number) {\n            if (number === 2) {\n                return 'חודשיים';\n            }\n            return number + ' חודשים';\n        },\n        y : 'שנה',\n        yy : function (number) {\n            if (number === 2) {\n                return 'שנתיים';\n            } else if (number % 10 === 0 && number !== 10) {\n                return number + ' שנה';\n            }\n            return number + ' שנים';\n        }\n    },\n    meridiemParse: /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n    isPM : function (input) {\n        return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 5) {\n            return 'לפנות בוקר';\n        } else if (hour < 10) {\n            return 'בבוקר';\n        } else if (hour < 12) {\n            return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n        } else if (hour < 18) {\n            return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n        } else {\n            return 'בערב';\n        }\n    }\n});\n\nreturn he;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/he.js\n// module id = 421\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nvar hi = moment.defineLocale('hi', {\n    months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),\n    monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm बजे',\n        LTS : 'A h:mm:ss बजे',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm बजे',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[कल] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[कल] LT',\n        lastWeek : '[पिछले] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s में',\n        past : '%s पहले',\n        s : 'कुछ ही क्षण',\n        ss : '%d सेकंड',\n        m : 'एक मिनट',\n        mm : '%d मिनट',\n        h : 'एक घंटा',\n        hh : '%d घंटे',\n        d : 'एक दिन',\n        dd : '%d दिन',\n        M : 'एक महीने',\n        MM : '%d महीने',\n        y : 'एक वर्ष',\n        yy : '%d वर्ष'\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n    meridiemParse: /रात|सुबह|दोपहर|शाम/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'रात') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'सुबह') {\n            return hour;\n        } else if (meridiem === 'दोपहर') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'शाम') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'रात';\n        } else if (hour < 10) {\n            return 'सुबह';\n        } else if (hour < 17) {\n            return 'दोपहर';\n        } else if (hour < 20) {\n            return 'शाम';\n        } else {\n            return 'रात';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hi;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/hi.js\n// module id = 422\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            if (number === 1) {\n                result += 'sekunda';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sekunde';\n            } else {\n                result += 'sekundi';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n        case 'mm':\n            if (number === 1) {\n                result += 'minuta';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'minute';\n            } else {\n                result += 'minuta';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'jedan sat' : 'jednog sata';\n        case 'hh':\n            if (number === 1) {\n                result += 'sat';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'sata';\n            } else {\n                result += 'sati';\n            }\n            return result;\n        case 'dd':\n            if (number === 1) {\n                result += 'dan';\n            } else {\n                result += 'dana';\n            }\n            return result;\n        case 'MM':\n            if (number === 1) {\n                result += 'mjesec';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'mjeseca';\n            } else {\n                result += 'mjeseci';\n            }\n            return result;\n        case 'yy':\n            if (number === 1) {\n                result += 'godina';\n            } else if (number === 2 || number === 3 || number === 4) {\n                result += 'godine';\n            } else {\n                result += 'godina';\n            }\n            return result;\n    }\n}\n\nvar hr = moment.defineLocale('hr', {\n    months : {\n        format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),\n        standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')\n    },\n    monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danas u] LT',\n        nextDay  : '[sutra u] LT',\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[jučer u] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                    return '[prošlu] dddd [u] LT';\n                case 6:\n                    return '[prošle] [subote] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prošli] dddd [u] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'par sekundi',\n        ss     : translate,\n        m      : translate,\n        mm     : translate,\n        h      : translate,\n        hh     : translate,\n        d      : 'dan',\n        dd     : translate,\n        M      : 'mjesec',\n        MM     : translate,\n        y      : 'godinu',\n        yy     : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/hr.js\n// module id = 423\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var num = number;\n    switch (key) {\n        case 's':\n            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';\n        case 'ss':\n            return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce';\n        case 'm':\n            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');\n        case 'mm':\n            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');\n        case 'h':\n            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');\n        case 'hh':\n            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');\n        case 'd':\n            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');\n        case 'dd':\n            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');\n        case 'M':\n            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n        case 'MM':\n            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');\n        case 'y':\n            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');\n        case 'yy':\n            return num + (isFuture || withoutSuffix ? ' év' : ' éve');\n    }\n    return '';\n}\nfunction week(isFuture) {\n    return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';\n}\n\nvar hu = moment.defineLocale('hu', {\n    months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),\n    monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),\n    weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),\n    weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),\n    weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'YYYY.MM.DD.',\n        LL : 'YYYY. MMMM D.',\n        LLL : 'YYYY. MMMM D. H:mm',\n        LLLL : 'YYYY. MMMM D., dddd H:mm'\n    },\n    meridiemParse: /de|du/i,\n    isPM: function (input) {\n        return input.charAt(1).toLowerCase() === 'u';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower === true ? 'de' : 'DE';\n        } else {\n            return isLower === true ? 'du' : 'DU';\n        }\n    },\n    calendar : {\n        sameDay : '[ma] LT[-kor]',\n        nextDay : '[holnap] LT[-kor]',\n        nextWeek : function () {\n            return week.call(this, true);\n        },\n        lastDay : '[tegnap] LT[-kor]',\n        lastWeek : function () {\n            return week.call(this, false);\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s múlva',\n        past : '%s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn hu;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/hu.js\n// module id = 424\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar hyAm = moment.defineLocale('hy-am', {\n    months : {\n        format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),\n        standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')\n    },\n    monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n    weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),\n    weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY թ.',\n        LLL : 'D MMMM YYYY թ., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY թ., HH:mm'\n    },\n    calendar : {\n        sameDay: '[այսօր] LT',\n        nextDay: '[վաղը] LT',\n        lastDay: '[երեկ] LT',\n        nextWeek: function () {\n            return 'dddd [օրը ժամը] LT';\n        },\n        lastWeek: function () {\n            return '[անցած] dddd [օրը ժամը] LT';\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s հետո',\n        past : '%s առաջ',\n        s : 'մի քանի վայրկյան',\n        ss : '%d վայրկյան',\n        m : 'րոպե',\n        mm : '%d րոպե',\n        h : 'ժամ',\n        hh : '%d ժամ',\n        d : 'օր',\n        dd : '%d օր',\n        M : 'ամիս',\n        MM : '%d ամիս',\n        y : 'տարի',\n        yy : '%d տարի'\n    },\n    meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n    isPM: function (input) {\n        return /^(ցերեկվա|երեկոյան)$/.test(input);\n    },\n    meridiem : function (hour) {\n        if (hour < 4) {\n            return 'գիշերվա';\n        } else if (hour < 12) {\n            return 'առավոտվա';\n        } else if (hour < 17) {\n            return 'ցերեկվա';\n        } else {\n            return 'երեկոյան';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'DDD':\n            case 'w':\n            case 'W':\n            case 'DDDo':\n                if (number === 1) {\n                    return number + '-ին';\n                }\n                return number + '-րդ';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn hyAm;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/hy-am.js\n// module id = 425\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar id = moment.defineLocale('id', {\n    months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),\n    weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),\n    weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|siang|sore|malam/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'siang') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'sore' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'siang';\n        } else if (hours < 19) {\n            return 'sore';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Besok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kemarin pukul] LT',\n        lastWeek : 'dddd [lalu pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lalu',\n        s : 'beberapa detik',\n        ss : '%d detik',\n        m : 'semenit',\n        mm : '%d menit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn id;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/id.js\n// module id = 426\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(n) {\n    if (n % 100 === 11) {\n        return true;\n    } else if (n % 10 === 1) {\n        return false;\n    }\n    return true;\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':\n            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';\n        case 'ss':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum');\n            }\n            return result + 'sekúnda';\n        case 'm':\n            return withoutSuffix ? 'mínúta' : 'mínútu';\n        case 'mm':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');\n            } else if (withoutSuffix) {\n                return result + 'mínúta';\n            }\n            return result + 'mínútu';\n        case 'hh':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');\n            }\n            return result + 'klukkustund';\n        case 'd':\n            if (withoutSuffix) {\n                return 'dagur';\n            }\n            return isFuture ? 'dag' : 'degi';\n        case 'dd':\n            if (plural(number)) {\n                if (withoutSuffix) {\n                    return result + 'dagar';\n                }\n                return result + (isFuture ? 'daga' : 'dögum');\n            } else if (withoutSuffix) {\n                return result + 'dagur';\n            }\n            return result + (isFuture ? 'dag' : 'degi');\n        case 'M':\n            if (withoutSuffix) {\n                return 'mánuður';\n            }\n            return isFuture ? 'mánuð' : 'mánuði';\n        case 'MM':\n            if (plural(number)) {\n                if (withoutSuffix) {\n                    return result + 'mánuðir';\n                }\n                return result + (isFuture ? 'mánuði' : 'mánuðum');\n            } else if (withoutSuffix) {\n                return result + 'mánuður';\n            }\n            return result + (isFuture ? 'mánuð' : 'mánuði');\n        case 'y':\n            return withoutSuffix || isFuture ? 'ár' : 'ári';\n        case 'yy':\n            if (plural(number)) {\n                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');\n            }\n            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');\n    }\n}\n\nvar is = moment.defineLocale('is', {\n    months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),\n    weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),\n    weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),\n    weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] H:mm',\n        LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'\n    },\n    calendar : {\n        sameDay : '[í dag kl.] LT',\n        nextDay : '[á morgun kl.] LT',\n        nextWeek : 'dddd [kl.] LT',\n        lastDay : '[í gær kl.] LT',\n        lastWeek : '[síðasta] dddd [kl.] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'eftir %s',\n        past : 'fyrir %s síðan',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : 'klukkustund',\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn is;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/is.js\n// module id = 427\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar it = moment.defineLocale('it', {\n    months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),\n    monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n    weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),\n    weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n    weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Oggi alle] LT',\n        nextDay: '[Domani alle] LT',\n        nextWeek: 'dddd [alle] LT',\n        lastDay: '[Ieri alle] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[la scorsa] dddd [alle] LT';\n                default:\n                    return '[lo scorso] dddd [alle] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : function (s) {\n            return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;\n        },\n        past : '%s fa',\n        s : 'alcuni secondi',\n        ss : '%d secondi',\n        m : 'un minuto',\n        mm : '%d minuti',\n        h : 'un\\'ora',\n        hh : '%d ore',\n        d : 'un giorno',\n        dd : '%d giorni',\n        M : 'un mese',\n        MM : '%d mesi',\n        y : 'un anno',\n        yy : '%d anni'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn it;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/it.js\n// module id = 428\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ja = moment.defineLocale('ja', {\n    months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n    weekdaysShort : '日_月_火_水_木_金_土'.split('_'),\n    weekdaysMin : '日_月_火_水_木_金_土'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日 HH:mm dddd',\n        l : 'YYYY/MM/DD',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日 HH:mm dddd'\n    },\n    meridiemParse: /午前|午後/i,\n    isPM : function (input) {\n        return input === '午後';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return '午前';\n        } else {\n            return '午後';\n        }\n    },\n    calendar : {\n        sameDay : '[今日] LT',\n        nextDay : '[明日] LT',\n        nextWeek : '[来週]dddd LT',\n        lastDay : '[昨日] LT',\n        lastWeek : '[前週]dddd LT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}日/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '日';\n            default:\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s後',\n        past : '%s前',\n        s : '数秒',\n        ss : '%d秒',\n        m : '1分',\n        mm : '%d分',\n        h : '1時間',\n        hh : '%d時間',\n        d : '1日',\n        dd : '%d日',\n        M : '1ヶ月',\n        MM : '%dヶ月',\n        y : '1年',\n        yy : '%d年'\n    }\n});\n\nreturn ja;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ja.js\n// module id = 429\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar jv = moment.defineLocale('jv', {\n    months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),\n    monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),\n    weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),\n    weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),\n    weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /enjing|siyang|sonten|ndalu/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'enjing') {\n            return hour;\n        } else if (meridiem === 'siyang') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'sonten' || meridiem === 'ndalu') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'enjing';\n        } else if (hours < 15) {\n            return 'siyang';\n        } else if (hours < 19) {\n            return 'sonten';\n        } else {\n            return 'ndalu';\n        }\n    },\n    calendar : {\n        sameDay : '[Dinten puniko pukul] LT',\n        nextDay : '[Mbenjang pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kala wingi pukul] LT',\n        lastWeek : 'dddd [kepengker pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'wonten ing %s',\n        past : '%s ingkang kepengker',\n        s : 'sawetawis detik',\n        ss : '%d detik',\n        m : 'setunggal menit',\n        mm : '%d menit',\n        h : 'setunggal jam',\n        hh : '%d jam',\n        d : 'sedinten',\n        dd : '%d dinten',\n        M : 'sewulan',\n        MM : '%d wulan',\n        y : 'setaun',\n        yy : '%d taun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn jv;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/jv.js\n// module id = 430\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ka = moment.defineLocale('ka', {\n    months : {\n        standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),\n        format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')\n    },\n    monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n    weekdays : {\n        standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),\n        format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),\n        isFormat: /(წინა|შემდეგ)/\n    },\n    weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n    weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[დღეს] LT[-ზე]',\n        nextDay : '[ხვალ] LT[-ზე]',\n        lastDay : '[გუშინ] LT[-ზე]',\n        nextWeek : '[შემდეგ] dddd LT[-ზე]',\n        lastWeek : '[წინა] dddd LT-ზე',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : function (s) {\n            return (/(წამი|წუთი|საათი|წელი)/).test(s) ?\n                s.replace(/ი$/, 'ში') :\n                s + 'ში';\n        },\n        past : function (s) {\n            if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {\n                return s.replace(/(ი|ე)$/, 'ის უკან');\n            }\n            if ((/წელი/).test(s)) {\n                return s.replace(/წელი$/, 'წლის უკან');\n            }\n        },\n        s : 'რამდენიმე წამი',\n        ss : '%d წამი',\n        m : 'წუთი',\n        mm : '%d წუთი',\n        h : 'საათი',\n        hh : '%d საათი',\n        d : 'დღე',\n        dd : '%d დღე',\n        M : 'თვე',\n        MM : '%d თვე',\n        y : 'წელი',\n        yy : '%d წელი'\n    },\n    dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n    ordinal : function (number) {\n        if (number === 0) {\n            return number;\n        }\n        if (number === 1) {\n            return number + '-ლი';\n        }\n        if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {\n            return 'მე-' + number;\n        }\n        return number + '-ე';\n    },\n    week : {\n        dow : 1,\n        doy : 7\n    }\n});\n\nreturn ka;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ka.js\n// module id = 431\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-ші',\n    1: '-ші',\n    2: '-ші',\n    3: '-ші',\n    4: '-ші',\n    5: '-ші',\n    6: '-шы',\n    7: '-ші',\n    8: '-ші',\n    9: '-шы',\n    10: '-шы',\n    20: '-шы',\n    30: '-шы',\n    40: '-шы',\n    50: '-ші',\n    60: '-шы',\n    70: '-ші',\n    80: '-ші',\n    90: '-шы',\n    100: '-ші'\n};\n\nvar kk = moment.defineLocale('kk', {\n    months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),\n    monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n    weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),\n    weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n    weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бүгін сағат] LT',\n        nextDay : '[Ертең сағат] LT',\n        nextWeek : 'dddd [сағат] LT',\n        lastDay : '[Кеше сағат] LT',\n        lastWeek : '[Өткен аптаның] dddd [сағат] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ішінде',\n        past : '%s бұрын',\n        s : 'бірнеше секунд',\n        ss : '%d секунд',\n        m : 'бір минут',\n        mm : '%d минут',\n        h : 'бір сағат',\n        hh : '%d сағат',\n        d : 'бір күн',\n        dd : '%d күн',\n        M : 'бір ай',\n        MM : '%d ай',\n        y : 'бір жыл',\n        yy : '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n    ordinal : function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn kk;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/kk.js\n// module id = 432\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar km = moment.defineLocale('km', {\n    months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),\n    weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',\n        nextDay: '[ស្អែក ម៉ោង] LT',\n        nextWeek: 'dddd [ម៉ោង] LT',\n        lastDay: '[ម្សិលមិញ ម៉ោង] LT',\n        lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%sទៀត',\n        past: '%sមុន',\n        s: 'ប៉ុន្មានវិនាទី',\n        ss: '%d វិនាទី',\n        m: 'មួយនាទី',\n        mm: '%d នាទី',\n        h: 'មួយម៉ោង',\n        hh: '%d ម៉ោង',\n        d: 'មួយថ្ងៃ',\n        dd: '%d ថ្ងៃ',\n        M: 'មួយខែ',\n        MM: '%d ខែ',\n        y: 'មួយឆ្នាំ',\n        yy: '%d ឆ្នាំ'\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn km;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/km.js\n// module id = 433\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '೧',\n    '2': '೨',\n    '3': '೩',\n    '4': '೪',\n    '5': '೫',\n    '6': '೬',\n    '7': '೭',\n    '8': '೮',\n    '9': '೯',\n    '0': '೦'\n},\nnumberMap = {\n    '೧': '1',\n    '೨': '2',\n    '೩': '3',\n    '೪': '4',\n    '೫': '5',\n    '೬': '6',\n    '೭': '7',\n    '೮': '8',\n    '೯': '9',\n    '೦': '0'\n};\n\nvar kn = moment.defineLocale('kn', {\n    months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'),\n    monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'),\n    weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),\n    weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[ಇಂದು] LT',\n        nextDay : '[ನಾಳೆ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ನಿನ್ನೆ] LT',\n        lastWeek : '[ಕೊನೆಯ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ನಂತರ',\n        past : '%s ಹಿಂದೆ',\n        s : 'ಕೆಲವು ಕ್ಷಣಗಳು',\n        ss : '%d ಸೆಕೆಂಡುಗಳು',\n        m : 'ಒಂದು ನಿಮಿಷ',\n        mm : '%d ನಿಮಿಷ',\n        h : 'ಒಂದು ಗಂಟೆ',\n        hh : '%d ಗಂಟೆ',\n        d : 'ಒಂದು ದಿನ',\n        dd : '%d ದಿನ',\n        M : 'ಒಂದು ತಿಂಗಳು',\n        MM : '%d ತಿಂಗಳು',\n        y : 'ಒಂದು ವರ್ಷ',\n        yy : '%d ವರ್ಷ'\n    },\n    preparse: function (string) {\n        return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ರಾತ್ರಿ') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {\n            return hour;\n        } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'ಸಂಜೆ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ರಾತ್ರಿ';\n        } else if (hour < 10) {\n            return 'ಬೆಳಿಗ್ಗೆ';\n        } else if (hour < 17) {\n            return 'ಮಧ್ಯಾಹ್ನ';\n        } else if (hour < 20) {\n            return 'ಸಂಜೆ';\n        } else {\n            return 'ರಾತ್ರಿ';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ನೇ)/,\n    ordinal : function (number) {\n        return number + 'ನೇ';\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn kn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/kn.js\n// module id = 434\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ko = moment.defineLocale('ko', {\n    months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n    weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n    weekdaysShort : '일_월_화_수_목_금_토'.split('_'),\n    weekdaysMin : '일_월_화_수_목_금_토'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'YYYY.MM.DD.',\n        LL : 'YYYY년 MMMM D일',\n        LLL : 'YYYY년 MMMM D일 A h:mm',\n        LLLL : 'YYYY년 MMMM D일 dddd A h:mm',\n        l : 'YYYY.MM.DD.',\n        ll : 'YYYY년 MMMM D일',\n        lll : 'YYYY년 MMMM D일 A h:mm',\n        llll : 'YYYY년 MMMM D일 dddd A h:mm'\n    },\n    calendar : {\n        sameDay : '오늘 LT',\n        nextDay : '내일 LT',\n        nextWeek : 'dddd LT',\n        lastDay : '어제 LT',\n        lastWeek : '지난주 dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s 후',\n        past : '%s 전',\n        s : '몇 초',\n        ss : '%d초',\n        m : '1분',\n        mm : '%d분',\n        h : '한 시간',\n        hh : '%d시간',\n        d : '하루',\n        dd : '%d일',\n        M : '한 달',\n        MM : '%d달',\n        y : '일 년',\n        yy : '%d년'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}(일|월|주)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '일';\n            case 'M':\n                return number + '월';\n            case 'w':\n            case 'W':\n                return number + '주';\n            default:\n                return number;\n        }\n    },\n    meridiemParse : /오전|오후/,\n    isPM : function (token) {\n        return token === '오후';\n    },\n    meridiem : function (hour, minute, isUpper) {\n        return hour < 12 ? '오전' : '오후';\n    }\n});\n\nreturn ko;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ko.js\n// module id = 435\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-чү',\n    1: '-чи',\n    2: '-чи',\n    3: '-чү',\n    4: '-чү',\n    5: '-чи',\n    6: '-чы',\n    7: '-чи',\n    8: '-чи',\n    9: '-чу',\n    10: '-чу',\n    20: '-чы',\n    30: '-чу',\n    40: '-чы',\n    50: '-чү',\n    60: '-чы',\n    70: '-чи',\n    80: '-чи',\n    90: '-чу',\n    100: '-чү'\n};\n\nvar ky = moment.defineLocale('ky', {\n    months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),\n    monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),\n    weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),\n    weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бүгүн саат] LT',\n        nextDay : '[Эртең саат] LT',\n        nextWeek : 'dddd [саат] LT',\n        lastDay : '[Кече саат] LT',\n        lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ичинде',\n        past : '%s мурун',\n        s : 'бирнече секунд',\n        ss : '%d секунд',\n        m : 'бир мүнөт',\n        mm : '%d мүнөт',\n        h : 'бир саат',\n        hh : '%d саат',\n        d : 'бир күн',\n        dd : '%d күн',\n        M : 'бир ай',\n        MM : '%d ай',\n        y : 'бир жыл',\n        yy : '%d жыл'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(чи|чы|чү|чу)/,\n    ordinal : function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ky;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ky.js\n// module id = 436\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        'm': ['eng Minutt', 'enger Minutt'],\n        'h': ['eng Stonn', 'enger Stonn'],\n        'd': ['een Dag', 'engem Dag'],\n        'M': ['ee Mount', 'engem Mount'],\n        'y': ['ee Joer', 'engem Joer']\n    };\n    return withoutSuffix ? format[key][0] : format[key][1];\n}\nfunction processFutureTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n    if (eifelerRegelAppliesToNumber(number)) {\n        return 'a ' + string;\n    }\n    return 'an ' + string;\n}\nfunction processPastTime(string) {\n    var number = string.substr(0, string.indexOf(' '));\n    if (eifelerRegelAppliesToNumber(number)) {\n        return 'viru ' + string;\n    }\n    return 'virun ' + string;\n}\n/**\n * Returns true if the word before the given number loses the '-n' ending.\n * e.g. 'an 10 Deeg' but 'a 5 Deeg'\n *\n * @param number {integer}\n * @returns {boolean}\n */\nfunction eifelerRegelAppliesToNumber(number) {\n    number = parseInt(number, 10);\n    if (isNaN(number)) {\n        return false;\n    }\n    if (number < 0) {\n        // Negative Number --> always true\n        return true;\n    } else if (number < 10) {\n        // Only 1 digit\n        if (4 <= number && number <= 7) {\n            return true;\n        }\n        return false;\n    } else if (number < 100) {\n        // 2 digits\n        var lastDigit = number % 10, firstDigit = number / 10;\n        if (lastDigit === 0) {\n            return eifelerRegelAppliesToNumber(firstDigit);\n        }\n        return eifelerRegelAppliesToNumber(lastDigit);\n    } else if (number < 10000) {\n        // 3 or 4 digits --> recursively check first digit\n        while (number >= 10) {\n            number = number / 10;\n        }\n        return eifelerRegelAppliesToNumber(number);\n    } else {\n        // Anything larger than 4 digits: recursively check first n-3 digits\n        number = number / 1000;\n        return eifelerRegelAppliesToNumber(number);\n    }\n}\n\nvar lb = moment.defineLocale('lb', {\n    months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),\n    monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),\n    monthsParseExact : true,\n    weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),\n    weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),\n    weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm [Auer]',\n        LTS: 'H:mm:ss [Auer]',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm [Auer]',\n        LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'\n    },\n    calendar: {\n        sameDay: '[Haut um] LT',\n        sameElse: 'L',\n        nextDay: '[Muer um] LT',\n        nextWeek: 'dddd [um] LT',\n        lastDay: '[Gëschter um] LT',\n        lastWeek: function () {\n            // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule\n            switch (this.day()) {\n                case 2:\n                case 4:\n                    return '[Leschten] dddd [um] LT';\n                default:\n                    return '[Leschte] dddd [um] LT';\n            }\n        }\n    },\n    relativeTime : {\n        future : processFutureTime,\n        past : processPastTime,\n        s : 'e puer Sekonnen',\n        ss : '%d Sekonnen',\n        m : processRelativeTime,\n        mm : '%d Minutten',\n        h : processRelativeTime,\n        hh : '%d Stonnen',\n        d : processRelativeTime,\n        dd : '%d Deeg',\n        M : processRelativeTime,\n        MM : '%d Méint',\n        y : processRelativeTime,\n        yy : '%d Joer'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal: '%d.',\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lb;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/lb.js\n// module id = 437\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar lo = moment.defineLocale('lo', {\n    months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),\n    weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n    weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'ວັນdddd D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n    isPM: function (input) {\n        return input === 'ຕອນແລງ';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ຕອນເຊົ້າ';\n        } else {\n            return 'ຕອນແລງ';\n        }\n    },\n    calendar : {\n        sameDay : '[ມື້ນີ້ເວລາ] LT',\n        nextDay : '[ມື້ອື່ນເວລາ] LT',\n        nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',\n        lastDay : '[ມື້ວານນີ້ເວລາ] LT',\n        lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ອີກ %s',\n        past : '%sຜ່ານມາ',\n        s : 'ບໍ່ເທົ່າໃດວິນາທີ',\n        ss : '%d ວິນາທີ' ,\n        m : '1 ນາທີ',\n        mm : '%d ນາທີ',\n        h : '1 ຊົ່ວໂມງ',\n        hh : '%d ຊົ່ວໂມງ',\n        d : '1 ມື້',\n        dd : '%d ມື້',\n        M : '1 ເດືອນ',\n        MM : '%d ເດືອນ',\n        y : '1 ປີ',\n        yy : '%d ປີ'\n    },\n    dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n    ordinal : function (number) {\n        return 'ທີ່' + number;\n    }\n});\n\nreturn lo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/lo.js\n// module id = 438\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar units = {\n    'ss' : 'sekundė_sekundžių_sekundes',\n    'm' : 'minutė_minutės_minutę',\n    'mm': 'minutės_minučių_minutes',\n    'h' : 'valanda_valandos_valandą',\n    'hh': 'valandos_valandų_valandas',\n    'd' : 'diena_dienos_dieną',\n    'dd': 'dienos_dienų_dienas',\n    'M' : 'mėnuo_mėnesio_mėnesį',\n    'MM': 'mėnesiai_mėnesių_mėnesius',\n    'y' : 'metai_metų_metus',\n    'yy': 'metai_metų_metus'\n};\nfunction translateSeconds(number, withoutSuffix, key, isFuture) {\n    if (withoutSuffix) {\n        return 'kelios sekundės';\n    } else {\n        return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n    }\n}\nfunction translateSingular(number, withoutSuffix, key, isFuture) {\n    return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);\n}\nfunction special(number) {\n    return number % 10 === 0 || (number > 10 && number < 20);\n}\nfunction forms(key) {\n    return units[key].split('_');\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    if (number === 1) {\n        return result + translateSingular(number, withoutSuffix, key[0], isFuture);\n    } else if (withoutSuffix) {\n        return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n    } else {\n        if (isFuture) {\n            return result + forms(key)[1];\n        } else {\n            return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n        }\n    }\n}\nvar lt = moment.defineLocale('lt', {\n    months : {\n        format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),\n        standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),\n        isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/\n    },\n    monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n    weekdays : {\n        format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),\n        standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),\n        isFormat: /dddd HH:mm/\n    },\n    weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n    weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'YYYY [m.] MMMM D [d.]',\n        LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n        LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n        l : 'YYYY-MM-DD',\n        ll : 'YYYY [m.] MMMM D [d.]',\n        lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n        llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'\n    },\n    calendar : {\n        sameDay : '[Šiandien] LT',\n        nextDay : '[Rytoj] LT',\n        nextWeek : 'dddd LT',\n        lastDay : '[Vakar] LT',\n        lastWeek : '[Praėjusį] dddd LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'po %s',\n        past : 'prieš %s',\n        s : translateSeconds,\n        ss : translate,\n        m : translateSingular,\n        mm : translate,\n        h : translateSingular,\n        hh : translate,\n        d : translateSingular,\n        dd : translate,\n        M : translateSingular,\n        MM : translate,\n        y : translateSingular,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n    ordinal : function (number) {\n        return number + '-oji';\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lt;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/lt.js\n// module id = 439\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar units = {\n    'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n    'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n    'h': 'stundas_stundām_stunda_stundas'.split('_'),\n    'hh': 'stundas_stundām_stunda_stundas'.split('_'),\n    'd': 'dienas_dienām_diena_dienas'.split('_'),\n    'dd': 'dienas_dienām_diena_dienas'.split('_'),\n    'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n    'y': 'gada_gadiem_gads_gadi'.split('_'),\n    'yy': 'gada_gadiem_gads_gadi'.split('_')\n};\n/**\n * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n */\nfunction format(forms, number, withoutSuffix) {\n    if (withoutSuffix) {\n        // E.g. \"21 minūte\", \"3 minūtes\".\n        return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n    } else {\n        // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n        // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n        return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n    }\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    return number + ' ' + format(units[key], number, withoutSuffix);\n}\nfunction relativeTimeWithSingular(number, withoutSuffix, key) {\n    return format(units[key], number, withoutSuffix);\n}\nfunction relativeSeconds(number, withoutSuffix) {\n    return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n}\n\nvar lv = moment.defineLocale('lv', {\n    months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),\n    weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY.',\n        LL : 'YYYY. [gada] D. MMMM',\n        LLL : 'YYYY. [gada] D. MMMM, HH:mm',\n        LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'\n    },\n    calendar : {\n        sameDay : '[Šodien pulksten] LT',\n        nextDay : '[Rīt pulksten] LT',\n        nextWeek : 'dddd [pulksten] LT',\n        lastDay : '[Vakar pulksten] LT',\n        lastWeek : '[Pagājušā] dddd [pulksten] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'pēc %s',\n        past : 'pirms %s',\n        s : relativeSeconds,\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithSingular,\n        mm : relativeTimeWithPlural,\n        h : relativeTimeWithSingular,\n        hh : relativeTimeWithPlural,\n        d : relativeTimeWithSingular,\n        dd : relativeTimeWithPlural,\n        M : relativeTimeWithSingular,\n        MM : relativeTimeWithPlural,\n        y : relativeTimeWithSingular,\n        yy : relativeTimeWithPlural\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn lv;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/lv.js\n// module id = 440\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['sekund', 'sekunda', 'sekundi'],\n        m: ['jedan minut', 'jednog minuta'],\n        mm: ['minut', 'minuta', 'minuta'],\n        h: ['jedan sat', 'jednog sata'],\n        hh: ['sat', 'sata', 'sati'],\n        dd: ['dan', 'dana', 'dana'],\n        MM: ['mjesec', 'mjeseca', 'mjeseci'],\n        yy: ['godina', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar me = moment.defineLocale('me', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact : true,\n    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[danas u] LT',\n        nextDay: '[sjutra u] LT',\n\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedjelju] [u] LT';\n                case 3:\n                    return '[u] [srijedu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[juče u] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[prošle] [nedjelje] [u] LT',\n                '[prošlog] [ponedjeljka] [u] LT',\n                '[prošlog] [utorka] [u] LT',\n                '[prošle] [srijede] [u] LT',\n                '[prošlog] [četvrtka] [u] LT',\n                '[prošlog] [petka] [u] LT',\n                '[prošle] [subote] [u] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'prije %s',\n        s      : 'nekoliko sekundi',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'dan',\n        dd     : translator.translate,\n        M      : 'mjesec',\n        MM     : translator.translate,\n        y      : 'godinu',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn me;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/me.js\n// module id = 441\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mi = moment.defineLocale('mi', {\n    months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),\n    monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),\n    monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n    monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n    weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n    weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY [i] HH:mm',\n        LLLL: 'dddd, D MMMM YYYY [i] HH:mm'\n    },\n    calendar: {\n        sameDay: '[i teie mahana, i] LT',\n        nextDay: '[apopo i] LT',\n        nextWeek: 'dddd [i] LT',\n        lastDay: '[inanahi i] LT',\n        lastWeek: 'dddd [whakamutunga i] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'i roto i %s',\n        past: '%s i mua',\n        s: 'te hēkona ruarua',\n        ss: '%d hēkona',\n        m: 'he meneti',\n        mm: '%d meneti',\n        h: 'te haora',\n        hh: '%d haora',\n        d: 'he ra',\n        dd: '%d ra',\n        M: 'he marama',\n        MM: '%d marama',\n        y: 'he tau',\n        yy: '%d tau'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn mi;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/mi.js\n// module id = 442\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mk = moment.defineLocale('mk', {\n    months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),\n    monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n    weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),\n    weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n    weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'D.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay : '[Денес во] LT',\n        nextDay : '[Утре во] LT',\n        nextWeek : '[Во] dddd [во] LT',\n        lastDay : '[Вчера во] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 6:\n                    return '[Изминатата] dddd [во] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[Изминатиот] dddd [во] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'после %s',\n        past : 'пред %s',\n        s : 'неколку секунди',\n        ss : '%d секунди',\n        m : 'минута',\n        mm : '%d минути',\n        h : 'час',\n        hh : '%d часа',\n        d : 'ден',\n        dd : '%d дена',\n        M : 'месец',\n        MM : '%d месеци',\n        y : 'година',\n        yy : '%d години'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n    ordinal : function (number) {\n        var lastDigit = number % 10,\n            last2Digits = number % 100;\n        if (number === 0) {\n            return number + '-ев';\n        } else if (last2Digits === 0) {\n            return number + '-ен';\n        } else if (last2Digits > 10 && last2Digits < 20) {\n            return number + '-ти';\n        } else if (lastDigit === 1) {\n            return number + '-ви';\n        } else if (lastDigit === 2) {\n            return number + '-ри';\n        } else if (lastDigit === 7 || lastDigit === 8) {\n            return number + '-ми';\n        } else {\n            return number + '-ти';\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn mk;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/mk.js\n// module id = 443\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ml = moment.defineLocale('ml', {\n    months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),\n    monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),\n    weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),\n    weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm -നു',\n        LTS : 'A h:mm:ss -നു',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm -നു',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'\n    },\n    calendar : {\n        sameDay : '[ഇന്ന്] LT',\n        nextDay : '[നാളെ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ഇന്നലെ] LT',\n        lastWeek : '[കഴിഞ്ഞ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s കഴിഞ്ഞ്',\n        past : '%s മുൻപ്',\n        s : 'അൽപ നിമിഷങ്ങൾ',\n        ss : '%d സെക്കൻഡ്',\n        m : 'ഒരു മിനിറ്റ്',\n        mm : '%d മിനിറ്റ്',\n        h : 'ഒരു മണിക്കൂർ',\n        hh : '%d മണിക്കൂർ',\n        d : 'ഒരു ദിവസം',\n        dd : '%d ദിവസം',\n        M : 'ഒരു മാസം',\n        MM : '%d മാസം',\n        y : 'ഒരു വർഷം',\n        yy : '%d വർഷം'\n    },\n    meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if ((meridiem === 'രാത്രി' && hour >= 4) ||\n                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||\n                meridiem === 'വൈകുന്നേരം') {\n            return hour + 12;\n        } else {\n            return hour;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'രാത്രി';\n        } else if (hour < 12) {\n            return 'രാവിലെ';\n        } else if (hour < 17) {\n            return 'ഉച്ച കഴിഞ്ഞ്';\n        } else if (hour < 20) {\n            return 'വൈകുന്നേരം';\n        } else {\n            return 'രാത്രി';\n        }\n    }\n});\n\nreturn ml;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ml.js\n// module id = 444\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nfunction relativeTimeMr(number, withoutSuffix, string, isFuture)\n{\n    var output = '';\n    if (withoutSuffix) {\n        switch (string) {\n            case 's': output = 'काही सेकंद'; break;\n            case 'ss': output = '%d सेकंद'; break;\n            case 'm': output = 'एक मिनिट'; break;\n            case 'mm': output = '%d मिनिटे'; break;\n            case 'h': output = 'एक तास'; break;\n            case 'hh': output = '%d तास'; break;\n            case 'd': output = 'एक दिवस'; break;\n            case 'dd': output = '%d दिवस'; break;\n            case 'M': output = 'एक महिना'; break;\n            case 'MM': output = '%d महिने'; break;\n            case 'y': output = 'एक वर्ष'; break;\n            case 'yy': output = '%d वर्षे'; break;\n        }\n    }\n    else {\n        switch (string) {\n            case 's': output = 'काही सेकंदां'; break;\n            case 'ss': output = '%d सेकंदां'; break;\n            case 'm': output = 'एका मिनिटा'; break;\n            case 'mm': output = '%d मिनिटां'; break;\n            case 'h': output = 'एका तासा'; break;\n            case 'hh': output = '%d तासां'; break;\n            case 'd': output = 'एका दिवसा'; break;\n            case 'dd': output = '%d दिवसां'; break;\n            case 'M': output = 'एका महिन्या'; break;\n            case 'MM': output = '%d महिन्यां'; break;\n            case 'y': output = 'एका वर्षा'; break;\n            case 'yy': output = '%d वर्षां'; break;\n        }\n    }\n    return output.replace(/%d/i, number);\n}\n\nvar mr = moment.defineLocale('mr', {\n    months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),\n    monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n    weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),\n    weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm वाजता',\n        LTS : 'A h:mm:ss वाजता',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm वाजता',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[उद्या] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[काल] LT',\n        lastWeek: '[मागील] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future: '%sमध्ये',\n        past: '%sपूर्वी',\n        s: relativeTimeMr,\n        ss: relativeTimeMr,\n        m: relativeTimeMr,\n        mm: relativeTimeMr,\n        h: relativeTimeMr,\n        hh: relativeTimeMr,\n        d: relativeTimeMr,\n        dd: relativeTimeMr,\n        M: relativeTimeMr,\n        MM: relativeTimeMr,\n        y: relativeTimeMr,\n        yy: relativeTimeMr\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'रात्री') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'सकाळी') {\n            return hour;\n        } else if (meridiem === 'दुपारी') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'सायंकाळी') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'रात्री';\n        } else if (hour < 10) {\n            return 'सकाळी';\n        } else if (hour < 17) {\n            return 'दुपारी';\n        } else if (hour < 20) {\n            return 'सायंकाळी';\n        } else {\n            return 'रात्री';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn mr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/mr.js\n// module id = 445\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ms = moment.defineLocale('ms', {\n    months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'tengahari') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'petang' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'tengahari';\n        } else if (hours < 19) {\n            return 'petang';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Esok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kelmarin pukul] LT',\n        lastWeek : 'dddd [lepas pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lepas',\n        s : 'beberapa saat',\n        ss : '%d saat',\n        m : 'seminit',\n        mm : '%d minit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ms;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ms.js\n// module id = 446\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar msMy = moment.defineLocale('ms-my', {\n    months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),\n    weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),\n    weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),\n    weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [pukul] HH.mm',\n        LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'\n    },\n    meridiemParse: /pagi|tengahari|petang|malam/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'pagi') {\n            return hour;\n        } else if (meridiem === 'tengahari') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'petang' || meridiem === 'malam') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'pagi';\n        } else if (hours < 15) {\n            return 'tengahari';\n        } else if (hours < 19) {\n            return 'petang';\n        } else {\n            return 'malam';\n        }\n    },\n    calendar : {\n        sameDay : '[Hari ini pukul] LT',\n        nextDay : '[Esok pukul] LT',\n        nextWeek : 'dddd [pukul] LT',\n        lastDay : '[Kelmarin pukul] LT',\n        lastWeek : 'dddd [lepas pukul] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dalam %s',\n        past : '%s yang lepas',\n        s : 'beberapa saat',\n        ss : '%d saat',\n        m : 'seminit',\n        mm : '%d minit',\n        h : 'sejam',\n        hh : '%d jam',\n        d : 'sehari',\n        dd : '%d hari',\n        M : 'sebulan',\n        MM : '%d bulan',\n        y : 'setahun',\n        yy : '%d tahun'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn msMy;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ms-my.js\n// module id = 447\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar mt = moment.defineLocale('mt', {\n    months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'),\n    monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),\n    weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'),\n    weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),\n    weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Illum fil-]LT',\n        nextDay : '[Għada fil-]LT',\n        nextWeek : 'dddd [fil-]LT',\n        lastDay : '[Il-bieraħ fil-]LT',\n        lastWeek : 'dddd [li għadda] [fil-]LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'f’ %s',\n        past : '%s ilu',\n        s : 'ftit sekondi',\n        ss : '%d sekondi',\n        m : 'minuta',\n        mm : '%d minuti',\n        h : 'siegħa',\n        hh : '%d siegħat',\n        d : 'ġurnata',\n        dd : '%d ġranet',\n        M : 'xahar',\n        MM : '%d xhur',\n        y : 'sena',\n        yy : '%d sni'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}º/,\n    ordinal: '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn mt;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/mt.js\n// module id = 448\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '၁',\n    '2': '၂',\n    '3': '၃',\n    '4': '၄',\n    '5': '၅',\n    '6': '၆',\n    '7': '၇',\n    '8': '၈',\n    '9': '၉',\n    '0': '၀'\n}, numberMap = {\n    '၁': '1',\n    '၂': '2',\n    '၃': '3',\n    '၄': '4',\n    '၅': '5',\n    '၆': '6',\n    '၇': '7',\n    '၈': '8',\n    '၉': '9',\n    '၀': '0'\n};\n\nvar my = moment.defineLocale('my', {\n    months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),\n    monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),\n    weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),\n    weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n    weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),\n\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'DD/MM/YYYY',\n        LL: 'D MMMM YYYY',\n        LLL: 'D MMMM YYYY HH:mm',\n        LLLL: 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar: {\n        sameDay: '[ယနေ.] LT [မှာ]',\n        nextDay: '[မနက်ဖြန်] LT [မှာ]',\n        nextWeek: 'dddd LT [မှာ]',\n        lastDay: '[မနေ.က] LT [မှာ]',\n        lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: 'လာမည့် %s မှာ',\n        past: 'လွန်ခဲ့သော %s က',\n        s: 'စက္ကန်.အနည်းငယ်',\n        ss : '%d စက္ကန့်',\n        m: 'တစ်မိနစ်',\n        mm: '%d မိနစ်',\n        h: 'တစ်နာရီ',\n        hh: '%d နာရီ',\n        d: 'တစ်ရက်',\n        dd: '%d ရက်',\n        M: 'တစ်လ',\n        MM: '%d လ',\n        y: 'တစ်နှစ်',\n        yy: '%d နှစ်'\n    },\n    preparse: function (string) {\n        return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    week: {\n        dow: 1, // Monday is the first day of the week.\n        doy: 4 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn my;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/my.js\n// module id = 449\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar nb = moment.defineLocale('nb', {\n    months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n    weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n    weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] HH:mm',\n        LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[i dag kl.] LT',\n        nextDay: '[i morgen kl.] LT',\n        nextWeek: 'dddd [kl.] LT',\n        lastDay: '[i går kl.] LT',\n        lastWeek: '[forrige] dddd [kl.] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s siden',\n        s : 'noen sekunder',\n        ss : '%d sekunder',\n        m : 'ett minutt',\n        mm : '%d minutter',\n        h : 'en time',\n        hh : '%d timer',\n        d : 'en dag',\n        dd : '%d dager',\n        M : 'en måned',\n        MM : '%d måneder',\n        y : 'ett år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nb;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/nb.js\n// module id = 450\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '१',\n    '2': '२',\n    '3': '३',\n    '4': '४',\n    '5': '५',\n    '6': '६',\n    '7': '७',\n    '8': '८',\n    '9': '९',\n    '0': '०'\n},\nnumberMap = {\n    '१': '1',\n    '२': '2',\n    '३': '3',\n    '४': '4',\n    '५': '5',\n    '६': '6',\n    '७': '7',\n    '८': '8',\n    '९': '9',\n    '०': '0'\n};\n\nvar ne = moment.defineLocale('ne', {\n    months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),\n    monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),\n    weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n    weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'Aको h:mm बजे',\n        LTS : 'Aको h:mm:ss बजे',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, Aको h:mm बजे',\n        LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'\n    },\n    preparse: function (string) {\n        return string.replace(/[१२३४५६७८९०]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'राति') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'बिहान') {\n            return hour;\n        } else if (meridiem === 'दिउँसो') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'साँझ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 3) {\n            return 'राति';\n        } else if (hour < 12) {\n            return 'बिहान';\n        } else if (hour < 16) {\n            return 'दिउँसो';\n        } else if (hour < 20) {\n            return 'साँझ';\n        } else {\n            return 'राति';\n        }\n    },\n    calendar : {\n        sameDay : '[आज] LT',\n        nextDay : '[भोलि] LT',\n        nextWeek : '[आउँदो] dddd[,] LT',\n        lastDay : '[हिजो] LT',\n        lastWeek : '[गएको] dddd[,] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%sमा',\n        past : '%s अगाडि',\n        s : 'केही क्षण',\n        ss : '%d सेकेण्ड',\n        m : 'एक मिनेट',\n        mm : '%d मिनेट',\n        h : 'एक घण्टा',\n        hh : '%d घण्टा',\n        d : 'एक दिन',\n        dd : '%d दिन',\n        M : 'एक महिना',\n        MM : '%d महिना',\n        y : 'एक बर्ष',\n        yy : '%d बर्ष'\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ne;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ne.js\n// module id = 451\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');\n\nvar monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];\nvar monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\nvar nl = moment.defineLocale('nl', {\n    months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD-MM-YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[vandaag om] LT',\n        nextDay: '[morgen om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[gisteren om] LT',\n        lastWeek: '[afgelopen] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'over %s',\n        past : '%s geleden',\n        s : 'een paar seconden',\n        ss : '%d seconden',\n        m : 'één minuut',\n        mm : '%d minuten',\n        h : 'één uur',\n        hh : '%d uur',\n        d : 'één dag',\n        dd : '%d dagen',\n        M : 'één maand',\n        MM : '%d maanden',\n        y : 'één jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/nl.js\n// module id = 452\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n    monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');\n\nvar monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];\nvar monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\nvar nlBe = moment.defineLocale('nl-be', {\n    months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),\n    monthsShort : function (m, format) {\n        if (!m) {\n            return monthsShortWithDots;\n        } else if (/-MMM-/.test(format)) {\n            return monthsShortWithoutDots[m.month()];\n        } else {\n            return monthsShortWithDots[m.month()];\n        }\n    },\n\n    monthsRegex: monthsRegex,\n    monthsShortRegex: monthsRegex,\n    monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,\n    monthsShortStrictRegex: /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n    weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),\n    weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[vandaag om] LT',\n        nextDay: '[morgen om] LT',\n        nextWeek: 'dddd [om] LT',\n        lastDay: '[gisteren om] LT',\n        lastWeek: '[afgelopen] dddd [om] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'over %s',\n        past : '%s geleden',\n        s : 'een paar seconden',\n        ss : '%d seconden',\n        m : 'één minuut',\n        mm : '%d minuten',\n        h : 'één uur',\n        hh : '%d uur',\n        d : 'één dag',\n        dd : '%d dagen',\n        M : 'één maand',\n        MM : '%d maanden',\n        y : 'één jaar',\n        yy : '%d jaar'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n    ordinal : function (number) {\n        return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nlBe;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/nl-be.js\n// module id = 453\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar nn = moment.defineLocale('nn', {\n    months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n    weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n    weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),\n    weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY [kl.] H:mm',\n        LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[I dag klokka] LT',\n        nextDay: '[I morgon klokka] LT',\n        nextWeek: 'dddd [klokka] LT',\n        lastDay: '[I går klokka] LT',\n        lastWeek: '[Føregåande] dddd [klokka] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : '%s sidan',\n        s : 'nokre sekund',\n        ss : '%d sekund',\n        m : 'eit minutt',\n        mm : '%d minutt',\n        h : 'ein time',\n        hh : '%d timar',\n        d : 'ein dag',\n        dd : '%d dagar',\n        M : 'ein månad',\n        MM : '%d månader',\n        y : 'eit år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn nn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/nn.js\n// module id = 454\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '੧',\n    '2': '੨',\n    '3': '੩',\n    '4': '੪',\n    '5': '੫',\n    '6': '੬',\n    '7': '੭',\n    '8': '੮',\n    '9': '੯',\n    '0': '੦'\n},\nnumberMap = {\n    '੧': '1',\n    '੨': '2',\n    '੩': '3',\n    '੪': '4',\n    '੫': '5',\n    '੬': '6',\n    '੭': '7',\n    '੮': '8',\n    '੯': '9',\n    '੦': '0'\n};\n\nvar paIn = moment.defineLocale('pa-in', {\n    // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.\n    months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),\n    weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),\n    weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm ਵਜੇ',\n        LTS : 'A h:mm:ss ਵਜੇ',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'\n    },\n    calendar : {\n        sameDay : '[ਅਜ] LT',\n        nextDay : '[ਕਲ] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[ਕਲ] LT',\n        lastWeek : '[ਪਿਛਲੇ] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s ਵਿੱਚ',\n        past : '%s ਪਿਛਲੇ',\n        s : 'ਕੁਝ ਸਕਿੰਟ',\n        ss : '%d ਸਕਿੰਟ',\n        m : 'ਇਕ ਮਿੰਟ',\n        mm : '%d ਮਿੰਟ',\n        h : 'ਇੱਕ ਘੰਟਾ',\n        hh : '%d ਘੰਟੇ',\n        d : 'ਇੱਕ ਦਿਨ',\n        dd : '%d ਦਿਨ',\n        M : 'ਇੱਕ ਮਹੀਨਾ',\n        MM : '%d ਮਹੀਨੇ',\n        y : 'ਇੱਕ ਸਾਲ',\n        yy : '%d ਸਾਲ'\n    },\n    preparse: function (string) {\n        return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n    meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ਰਾਤ') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ਸਵੇਰ') {\n            return hour;\n        } else if (meridiem === 'ਦੁਪਹਿਰ') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'ਸ਼ਾਮ') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ਰਾਤ';\n        } else if (hour < 10) {\n            return 'ਸਵੇਰ';\n        } else if (hour < 17) {\n            return 'ਦੁਪਹਿਰ';\n        } else if (hour < 20) {\n            return 'ਸ਼ਾਮ';\n        } else {\n            return 'ਰਾਤ';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn paIn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/pa-in.js\n// module id = 455\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),\n    monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');\nfunction plural(n) {\n    return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);\n}\nfunction translate(number, withoutSuffix, key) {\n    var result = number + ' ';\n    switch (key) {\n        case 'ss':\n            return result + (plural(number) ? 'sekundy' : 'sekund');\n        case 'm':\n            return withoutSuffix ? 'minuta' : 'minutę';\n        case 'mm':\n            return result + (plural(number) ? 'minuty' : 'minut');\n        case 'h':\n            return withoutSuffix  ? 'godzina'  : 'godzinę';\n        case 'hh':\n            return result + (plural(number) ? 'godziny' : 'godzin');\n        case 'MM':\n            return result + (plural(number) ? 'miesiące' : 'miesięcy');\n        case 'yy':\n            return result + (plural(number) ? 'lata' : 'lat');\n    }\n}\n\nvar pl = moment.defineLocale('pl', {\n    months : function (momentToFormat, format) {\n        if (!momentToFormat) {\n            return monthsNominative;\n        } else if (format === '') {\n            // Hack: if format empty we know this is used to generate\n            // RegExp by moment. Give then back both valid forms of months\n            // in RegExp ready format.\n            return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';\n        } else if (/D MMMM/.test(format)) {\n            return monthsSubjective[momentToFormat.month()];\n        } else {\n            return monthsNominative[momentToFormat.month()];\n        }\n    },\n    monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),\n    weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),\n    weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),\n    weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Dziś o] LT',\n        nextDay: '[Jutro o] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[W niedzielę o] LT';\n\n                case 2:\n                    return '[We wtorek o] LT';\n\n                case 3:\n                    return '[W środę o] LT';\n\n                case 6:\n                    return '[W sobotę o] LT';\n\n                default:\n                    return '[W] dddd [o] LT';\n            }\n        },\n        lastDay: '[Wczoraj o] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[W zeszłą niedzielę o] LT';\n                case 3:\n                    return '[W zeszłą środę o] LT';\n                case 6:\n                    return '[W zeszłą sobotę o] LT';\n                default:\n                    return '[W zeszły] dddd [o] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : '%s temu',\n        s : 'kilka sekund',\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : '1 dzień',\n        dd : '%d dni',\n        M : 'miesiąc',\n        MM : translate,\n        y : 'rok',\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn pl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/pl.js\n// module id = 456\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar pt = moment.defineLocale('pt', {\n    months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n    weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY HH:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hoje às] LT',\n        nextDay: '[Amanhã às] LT',\n        nextWeek: 'dddd [às] LT',\n        lastDay: '[Ontem às] LT',\n        lastWeek: function () {\n            return (this.day() === 0 || this.day() === 6) ?\n                '[Último] dddd [às] LT' : // Saturday + Sunday\n                '[Última] dddd [às] LT'; // Monday - Friday\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'em %s',\n        past : 'há %s',\n        s : 'segundos',\n        ss : '%d segundos',\n        m : 'um minuto',\n        mm : '%d minutos',\n        h : 'uma hora',\n        hh : '%d horas',\n        d : 'um dia',\n        dd : '%d dias',\n        M : 'um mês',\n        MM : '%d meses',\n        y : 'um ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal : '%dº',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn pt;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/pt.js\n// module id = 457\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ptBr = moment.defineLocale('pt-br', {\n    months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),\n    monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n    weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),\n    weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D [de] MMMM [de] YYYY',\n        LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',\n        LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hoje às] LT',\n        nextDay: '[Amanhã às] LT',\n        nextWeek: 'dddd [às] LT',\n        lastDay: '[Ontem às] LT',\n        lastWeek: function () {\n            return (this.day() === 0 || this.day() === 6) ?\n                '[Último] dddd [às] LT' : // Saturday + Sunday\n                '[Última] dddd [às] LT'; // Monday - Friday\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'em %s',\n        past : 'há %s',\n        s : 'poucos segundos',\n        ss : '%d segundos',\n        m : 'um minuto',\n        mm : '%d minutos',\n        h : 'uma hora',\n        hh : '%d horas',\n        d : 'um dia',\n        dd : '%d dias',\n        M : 'um mês',\n        MM : '%d meses',\n        y : 'um ano',\n        yy : '%d anos'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}º/,\n    ordinal : '%dº'\n});\n\nreturn ptBr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/pt-br.js\n// module id = 458\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n            'ss': 'secunde',\n            'mm': 'minute',\n            'hh': 'ore',\n            'dd': 'zile',\n            'MM': 'luni',\n            'yy': 'ani'\n        },\n        separator = ' ';\n    if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {\n        separator = ' de ';\n    }\n    return number + separator + format[key];\n}\n\nvar ro = moment.defineLocale('ro', {\n    months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),\n    monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n    weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n    weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY H:mm',\n        LLLL : 'dddd, D MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay: '[azi la] LT',\n        nextDay: '[mâine la] LT',\n        nextWeek: 'dddd [la] LT',\n        lastDay: '[ieri la] LT',\n        lastWeek: '[fosta] dddd [la] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'peste %s',\n        past : '%s în urmă',\n        s : 'câteva secunde',\n        ss : relativeTimeWithPlural,\n        m : 'un minut',\n        mm : relativeTimeWithPlural,\n        h : 'o oră',\n        hh : relativeTimeWithPlural,\n        d : 'o zi',\n        dd : relativeTimeWithPlural,\n        M : 'o lună',\n        MM : relativeTimeWithPlural,\n        y : 'un an',\n        yy : relativeTimeWithPlural\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ro;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ro.js\n// module id = 459\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n        'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',\n        'hh': 'час_часа_часов',\n        'dd': 'день_дня_дней',\n        'MM': 'месяц_месяца_месяцев',\n        'yy': 'год_года_лет'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'минута' : 'минуту';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\nvar monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];\n\n// http://new.gramota.ru/spravka/rules/139-prop : § 103\n// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637\n// CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753\nvar ru = moment.defineLocale('ru', {\n    months : {\n        format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),\n        standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')\n    },\n    monthsShort : {\n        // по CLDR именно \"июл.\" и \"июн.\", но какой смысл менять букву на точку ?\n        format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),\n        standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')\n    },\n    weekdays : {\n        standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),\n        format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),\n        isFormat: /\\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\\] ?dddd/\n    },\n    weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),\n    monthsParse : monthsParse,\n    longMonthsParse : monthsParse,\n    shortMonthsParse : monthsParse,\n\n    // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки\n    monthsRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n    // копия предыдущего\n    monthsShortRegex: /^(январ[ья]|янв\\.?|феврал[ья]|февр?\\.?|марта?|мар\\.?|апрел[ья]|апр\\.?|ма[йя]|июн[ья]|июн\\.?|июл[ья]|июл\\.?|августа?|авг\\.?|сентябр[ья]|сент?\\.?|октябр[ья]|окт\\.?|ноябр[ья]|нояб?\\.?|декабр[ья]|дек\\.?)/i,\n\n    // полные названия с падежами\n    monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,\n\n    // Выражение, которое соотвествует только сокращённым формам\n    monthsShortStrictRegex: /^(янв\\.|февр?\\.|мар[т.]|апр\\.|ма[яй]|июн[ья.]|июл[ья.]|авг\\.|сент?\\.|окт\\.|нояб?\\.|дек\\.)/i,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY г.',\n        LLL : 'D MMMM YYYY г., H:mm',\n        LLLL : 'dddd, D MMMM YYYY г., H:mm'\n    },\n    calendar : {\n        sameDay: '[Сегодня в] LT',\n        nextDay: '[Завтра в] LT',\n        lastDay: '[Вчера в] LT',\n        nextWeek: function (now) {\n            if (now.week() !== this.week()) {\n                switch (this.day()) {\n                    case 0:\n                        return '[В следующее] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[В следующий] dddd [в] LT';\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[В следующую] dddd [в] LT';\n                }\n            } else {\n                if (this.day() === 2) {\n                    return '[Во] dddd [в] LT';\n                } else {\n                    return '[В] dddd [в] LT';\n                }\n            }\n        },\n        lastWeek: function (now) {\n            if (now.week() !== this.week()) {\n                switch (this.day()) {\n                    case 0:\n                        return '[В прошлое] dddd [в] LT';\n                    case 1:\n                    case 2:\n                    case 4:\n                        return '[В прошлый] dddd [в] LT';\n                    case 3:\n                    case 5:\n                    case 6:\n                        return '[В прошлую] dddd [в] LT';\n                }\n            } else {\n                if (this.day() === 2) {\n                    return '[Во] dddd [в] LT';\n                } else {\n                    return '[В] dddd [в] LT';\n                }\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'через %s',\n        past : '%s назад',\n        s : 'несколько секунд',\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : 'час',\n        hh : relativeTimeWithPlural,\n        d : 'день',\n        dd : relativeTimeWithPlural,\n        M : 'месяц',\n        MM : relativeTimeWithPlural,\n        y : 'год',\n        yy : relativeTimeWithPlural\n    },\n    meridiemParse: /ночи|утра|дня|вечера/i,\n    isPM : function (input) {\n        return /^(дня|вечера)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночи';\n        } else if (hour < 12) {\n            return 'утра';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечера';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го|я)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n                return number + '-й';\n            case 'D':\n                return number + '-го';\n            case 'w':\n            case 'W':\n                return number + '-я';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ru;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ru.js\n// module id = 460\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'جنوري',\n    'فيبروري',\n    'مارچ',\n    'اپريل',\n    'مئي',\n    'جون',\n    'جولاءِ',\n    'آگسٽ',\n    'سيپٽمبر',\n    'آڪٽوبر',\n    'نومبر',\n    'ڊسمبر'\n];\nvar days = [\n    'آچر',\n    'سومر',\n    'اڱارو',\n    'اربع',\n    'خميس',\n    'جمع',\n    'ڇنڇر'\n];\n\nvar sd = moment.defineLocale('sd', {\n    months : months,\n    monthsShort : months,\n    weekdays : days,\n    weekdaysShort : days,\n    weekdaysMin : days,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM : function (input) {\n        return 'شام' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'صبح';\n        }\n        return 'شام';\n    },\n    calendar : {\n        sameDay : '[اڄ] LT',\n        nextDay : '[سڀاڻي] LT',\n        nextWeek : 'dddd [اڳين هفتي تي] LT',\n        lastDay : '[ڪالهه] LT',\n        lastWeek : '[گزريل هفتي] dddd [تي] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s پوء',\n        past : '%s اڳ',\n        s : 'چند سيڪنڊ',\n        ss : '%d سيڪنڊ',\n        m : 'هڪ منٽ',\n        mm : '%d منٽ',\n        h : 'هڪ ڪلاڪ',\n        hh : '%d ڪلاڪ',\n        d : 'هڪ ڏينهن',\n        dd : '%d ڏينهن',\n        M : 'هڪ مهينو',\n        MM : '%d مهينا',\n        y : 'هڪ سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sd;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sd.js\n// module id = 461\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar se = moment.defineLocale('se', {\n    months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),\n    monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n    weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),\n    weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n    weekdaysMin : 's_v_m_g_d_b_L'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'MMMM D. [b.] YYYY',\n        LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',\n        LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'\n    },\n    calendar : {\n        sameDay: '[otne ti] LT',\n        nextDay: '[ihttin ti] LT',\n        nextWeek: 'dddd [ti] LT',\n        lastDay: '[ikte ti] LT',\n        lastWeek: '[ovddit] dddd [ti] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s geažes',\n        past : 'maŋit %s',\n        s : 'moadde sekunddat',\n        ss: '%d sekunddat',\n        m : 'okta minuhta',\n        mm : '%d minuhtat',\n        h : 'okta diimmu',\n        hh : '%d diimmut',\n        d : 'okta beaivi',\n        dd : '%d beaivvit',\n        M : 'okta mánnu',\n        MM : '%d mánut',\n        y : 'okta jahki',\n        yy : '%d jagit'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn se;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/se.js\n// module id = 462\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\n/*jshint -W100*/\nvar si = moment.defineLocale('si', {\n    months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),\n    monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),\n    weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),\n    weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n    weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'a h:mm',\n        LTS : 'a h:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY MMMM D',\n        LLL : 'YYYY MMMM D, a h:mm',\n        LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'\n    },\n    calendar : {\n        sameDay : '[අද] LT[ට]',\n        nextDay : '[හෙට] LT[ට]',\n        nextWeek : 'dddd LT[ට]',\n        lastDay : '[ඊයේ] LT[ට]',\n        lastWeek : '[පසුගිය] dddd LT[ට]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%sකින්',\n        past : '%sකට පෙර',\n        s : 'තත්පර කිහිපය',\n        ss : 'තත්පර %d',\n        m : 'මිනිත්තුව',\n        mm : 'මිනිත්තු %d',\n        h : 'පැය',\n        hh : 'පැය %d',\n        d : 'දිනය',\n        dd : 'දින %d',\n        M : 'මාසය',\n        MM : 'මාස %d',\n        y : 'වසර',\n        yy : 'වසර %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n    ordinal : function (number) {\n        return number + ' වැනි';\n    },\n    meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n    isPM : function (input) {\n        return input === 'ප.ව.' || input === 'පස් වරු';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'ප.ව.' : 'පස් වරු';\n        } else {\n            return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n        }\n    }\n});\n\nreturn si;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/si.js\n// module id = 463\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),\n    monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\nfunction plural(n) {\n    return (n > 1) && (n < 5);\n}\nfunction translate(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':  // a few seconds / in a few seconds / a few seconds ago\n            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';\n        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'sekundy' : 'sekúnd');\n            } else {\n                return result + 'sekundami';\n            }\n            break;\n        case 'm':  // a minute / in a minute / a minute ago\n            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');\n        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'minúty' : 'minút');\n            } else {\n                return result + 'minútami';\n            }\n            break;\n        case 'h':  // an hour / in an hour / an hour ago\n            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');\n        case 'hh': // 9 hours / in 9 hours / 9 hours ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'hodiny' : 'hodín');\n            } else {\n                return result + 'hodinami';\n            }\n            break;\n        case 'd':  // a day / in a day / a day ago\n            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';\n        case 'dd': // 9 days / in 9 days / 9 days ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'dni' : 'dní');\n            } else {\n                return result + 'dňami';\n            }\n            break;\n        case 'M':  // a month / in a month / a month ago\n            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';\n        case 'MM': // 9 months / in 9 months / 9 months ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'mesiace' : 'mesiacov');\n            } else {\n                return result + 'mesiacmi';\n            }\n            break;\n        case 'y':  // a year / in a year / a year ago\n            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';\n        case 'yy': // 9 years / in 9 years / 9 years ago\n            if (withoutSuffix || isFuture) {\n                return result + (plural(number) ? 'roky' : 'rokov');\n            } else {\n                return result + 'rokmi';\n            }\n            break;\n    }\n}\n\nvar sk = moment.defineLocale('sk', {\n    months : months,\n    monthsShort : monthsShort,\n    weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n    weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),\n    weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),\n    longDateFormat : {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay: '[dnes o] LT',\n        nextDay: '[zajtra o] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v nedeľu o] LT';\n                case 1:\n                case 2:\n                    return '[v] dddd [o] LT';\n                case 3:\n                    return '[v stredu o] LT';\n                case 4:\n                    return '[vo štvrtok o] LT';\n                case 5:\n                    return '[v piatok o] LT';\n                case 6:\n                    return '[v sobotu o] LT';\n            }\n        },\n        lastDay: '[včera o] LT',\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[minulú nedeľu o] LT';\n                case 1:\n                case 2:\n                    return '[minulý] dddd [o] LT';\n                case 3:\n                    return '[minulú stredu o] LT';\n                case 4:\n                case 5:\n                    return '[minulý] dddd [o] LT';\n                case 6:\n                    return '[minulú sobotu o] LT';\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past : 'pred %s',\n        s : translate,\n        ss : translate,\n        m : translate,\n        mm : translate,\n        h : translate,\n        hh : translate,\n        d : translate,\n        dd : translate,\n        M : translate,\n        MM : translate,\n        y : translate,\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sk;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sk.js\n// module id = 464\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var result = number + ' ';\n    switch (key) {\n        case 's':\n            return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';\n        case 'ss':\n            if (number === 1) {\n                result += withoutSuffix ? 'sekundo' : 'sekundi';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n            } else {\n                result += withoutSuffix || isFuture ? 'sekund' : 'sekund';\n            }\n            return result;\n        case 'm':\n            return withoutSuffix ? 'ena minuta' : 'eno minuto';\n        case 'mm':\n            if (number === 1) {\n                result += withoutSuffix ? 'minuta' : 'minuto';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n            } else {\n                result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n            }\n            return result;\n        case 'h':\n            return withoutSuffix ? 'ena ura' : 'eno uro';\n        case 'hh':\n            if (number === 1) {\n                result += withoutSuffix ? 'ura' : 'uro';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'uri' : 'urama';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'ure' : 'urami';\n            } else {\n                result += withoutSuffix || isFuture ? 'ur' : 'urami';\n            }\n            return result;\n        case 'd':\n            return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n        case 'dd':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n            } else {\n                result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n            }\n            return result;\n        case 'M':\n            return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n        case 'MM':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n            } else {\n                result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n            }\n            return result;\n        case 'y':\n            return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n        case 'yy':\n            if (number === 1) {\n                result += withoutSuffix || isFuture ? 'leto' : 'letom';\n            } else if (number === 2) {\n                result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n            } else if (number < 5) {\n                result += withoutSuffix || isFuture ? 'leta' : 'leti';\n            } else {\n                result += withoutSuffix || isFuture ? 'let' : 'leti';\n            }\n            return result;\n    }\n}\n\nvar sl = moment.defineLocale('sl', {\n    months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n    weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n    weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM YYYY',\n        LLL : 'D. MMMM YYYY H:mm',\n        LLLL : 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar : {\n        sameDay  : '[danes ob] LT',\n        nextDay  : '[jutri ob] LT',\n\n        nextWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[v] [nedeljo] [ob] LT';\n                case 3:\n                    return '[v] [sredo] [ob] LT';\n                case 6:\n                    return '[v] [soboto] [ob] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[v] dddd [ob] LT';\n            }\n        },\n        lastDay  : '[včeraj ob] LT',\n        lastWeek : function () {\n            switch (this.day()) {\n                case 0:\n                    return '[prejšnjo] [nedeljo] [ob] LT';\n                case 3:\n                    return '[prejšnjo] [sredo] [ob] LT';\n                case 6:\n                    return '[prejšnjo] [soboto] [ob] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[prejšnji] dddd [ob] LT';\n            }\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'čez %s',\n        past   : 'pred %s',\n        s      : processRelativeTime,\n        ss     : processRelativeTime,\n        m      : processRelativeTime,\n        mm     : processRelativeTime,\n        h      : processRelativeTime,\n        hh     : processRelativeTime,\n        d      : processRelativeTime,\n        dd     : processRelativeTime,\n        M      : processRelativeTime,\n        MM     : processRelativeTime,\n        y      : processRelativeTime,\n        yy     : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sl.js\n// module id = 465\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sq = moment.defineLocale('sq', {\n    months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),\n    monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),\n    weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),\n    weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),\n    weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),\n    weekdaysParseExact : true,\n    meridiemParse: /PD|MD/,\n    isPM: function (input) {\n        return input.charAt(0) === 'M';\n    },\n    meridiem : function (hours, minutes, isLower) {\n        return hours < 12 ? 'PD' : 'MD';\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Sot në] LT',\n        nextDay : '[Nesër në] LT',\n        nextWeek : 'dddd [në] LT',\n        lastDay : '[Dje në] LT',\n        lastWeek : 'dddd [e kaluar në] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'në %s',\n        past : '%s më parë',\n        s : 'disa sekonda',\n        ss : '%d sekonda',\n        m : 'një minutë',\n        mm : '%d minuta',\n        h : 'një orë',\n        hh : '%d orë',\n        d : 'një ditë',\n        dd : '%d ditë',\n        M : 'një muaj',\n        MM : '%d muaj',\n        y : 'një vit',\n        yy : '%d vite'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sq;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sq.js\n// module id = 466\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['sekunda', 'sekunde', 'sekundi'],\n        m: ['jedan minut', 'jedne minute'],\n        mm: ['minut', 'minute', 'minuta'],\n        h: ['jedan sat', 'jednog sata'],\n        hh: ['sat', 'sata', 'sati'],\n        dd: ['dan', 'dana', 'dana'],\n        MM: ['mesec', 'meseca', 'meseci'],\n        yy: ['godina', 'godine', 'godina']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar sr = moment.defineLocale('sr', {\n    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),\n    monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),\n    weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[danas u] LT',\n        nextDay: '[sutra u] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[u] [nedelju] [u] LT';\n                case 3:\n                    return '[u] [sredu] [u] LT';\n                case 6:\n                    return '[u] [subotu] [u] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[u] dddd [u] LT';\n            }\n        },\n        lastDay  : '[juče u] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[prošle] [nedelje] [u] LT',\n                '[prošlog] [ponedeljka] [u] LT',\n                '[prošlog] [utorka] [u] LT',\n                '[prošle] [srede] [u] LT',\n                '[prošlog] [četvrtka] [u] LT',\n                '[prošlog] [petka] [u] LT',\n                '[prošle] [subote] [u] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'za %s',\n        past   : 'pre %s',\n        s      : 'nekoliko sekundi',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'dan',\n        dd     : translator.translate,\n        M      : 'mesec',\n        MM     : translator.translate,\n        y      : 'godinu',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sr.js\n// module id = 467\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar translator = {\n    words: { //Different grammatical cases\n        ss: ['секунда', 'секунде', 'секунди'],\n        m: ['један минут', 'једне минуте'],\n        mm: ['минут', 'минуте', 'минута'],\n        h: ['један сат', 'једног сата'],\n        hh: ['сат', 'сата', 'сати'],\n        dd: ['дан', 'дана', 'дана'],\n        MM: ['месец', 'месеца', 'месеци'],\n        yy: ['година', 'године', 'година']\n    },\n    correctGrammaticalCase: function (number, wordKey) {\n        return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);\n    },\n    translate: function (number, withoutSuffix, key) {\n        var wordKey = translator.words[key];\n        if (key.length === 1) {\n            return withoutSuffix ? wordKey[0] : wordKey[1];\n        } else {\n            return number + ' ' + translator.correctGrammaticalCase(number, wordKey);\n        }\n    }\n};\n\nvar srCyrl = moment.defineLocale('sr-cyrl', {\n    months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),\n    monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n    monthsParseExact: true,\n    weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n    weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n    weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat: {\n        LT: 'H:mm',\n        LTS : 'H:mm:ss',\n        L: 'DD.MM.YYYY',\n        LL: 'D. MMMM YYYY',\n        LLL: 'D. MMMM YYYY H:mm',\n        LLLL: 'dddd, D. MMMM YYYY H:mm'\n    },\n    calendar: {\n        sameDay: '[данас у] LT',\n        nextDay: '[сутра у] LT',\n        nextWeek: function () {\n            switch (this.day()) {\n                case 0:\n                    return '[у] [недељу] [у] LT';\n                case 3:\n                    return '[у] [среду] [у] LT';\n                case 6:\n                    return '[у] [суботу] [у] LT';\n                case 1:\n                case 2:\n                case 4:\n                case 5:\n                    return '[у] dddd [у] LT';\n            }\n        },\n        lastDay  : '[јуче у] LT',\n        lastWeek : function () {\n            var lastWeekDays = [\n                '[прошле] [недеље] [у] LT',\n                '[прошлог] [понедељка] [у] LT',\n                '[прошлог] [уторка] [у] LT',\n                '[прошле] [среде] [у] LT',\n                '[прошлог] [четвртка] [у] LT',\n                '[прошлог] [петка] [у] LT',\n                '[прошле] [суботе] [у] LT'\n            ];\n            return lastWeekDays[this.day()];\n        },\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'за %s',\n        past   : 'пре %s',\n        s      : 'неколико секунди',\n        ss     : translator.translate,\n        m      : translator.translate,\n        mm     : translator.translate,\n        h      : translator.translate,\n        hh     : translator.translate,\n        d      : 'дан',\n        dd     : translator.translate,\n        M      : 'месец',\n        MM     : translator.translate,\n        y      : 'годину',\n        yy     : translator.translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn srCyrl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sr-cyrl.js\n// module id = 468\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ss = moment.defineLocale('ss', {\n    months : \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split('_'),\n    monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n    weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),\n    weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n    weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Namuhla nga] LT',\n        nextDay : '[Kusasa nga] LT',\n        nextWeek : 'dddd [nga] LT',\n        lastDay : '[Itolo nga] LT',\n        lastWeek : 'dddd [leliphelile] [nga] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'nga %s',\n        past : 'wenteka nga %s',\n        s : 'emizuzwana lomcane',\n        ss : '%d mzuzwana',\n        m : 'umzuzu',\n        mm : '%d emizuzu',\n        h : 'lihora',\n        hh : '%d emahora',\n        d : 'lilanga',\n        dd : '%d emalanga',\n        M : 'inyanga',\n        MM : '%d tinyanga',\n        y : 'umnyaka',\n        yy : '%d iminyaka'\n    },\n    meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 11) {\n            return 'ekuseni';\n        } else if (hours < 15) {\n            return 'emini';\n        } else if (hours < 19) {\n            return 'entsambama';\n        } else {\n            return 'ebusuku';\n        }\n    },\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'ekuseni') {\n            return hour;\n        } else if (meridiem === 'emini') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n            if (hour === 0) {\n                return 0;\n            }\n            return hour + 12;\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : '%d',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ss;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ss.js\n// module id = 469\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sv = moment.defineLocale('sv', {\n    months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),\n    monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n    weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n    weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n    weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY-MM-DD',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY [kl.] HH:mm',\n        LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Idag] LT',\n        nextDay: '[Imorgon] LT',\n        lastDay: '[Igår] LT',\n        nextWeek: '[På] dddd LT',\n        lastWeek: '[I] dddd[s] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'om %s',\n        past : 'för %s sedan',\n        s : 'några sekunder',\n        ss : '%d sekunder',\n        m : 'en minut',\n        mm : '%d minuter',\n        h : 'en timme',\n        hh : '%d timmar',\n        d : 'en dag',\n        dd : '%d dagar',\n        M : 'en månad',\n        MM : '%d månader',\n        y : 'ett år',\n        yy : '%d år'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(e|a)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'e' :\n            (b === 1) ? 'a' :\n            (b === 2) ? 'a' :\n            (b === 3) ? 'e' : 'e';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn sv;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sv.js\n// module id = 470\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar sw = moment.defineLocale('sw', {\n    months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),\n    monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n    weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),\n    weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n    weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[leo saa] LT',\n        nextDay : '[kesho saa] LT',\n        nextWeek : '[wiki ijayo] dddd [saat] LT',\n        lastDay : '[jana] LT',\n        lastWeek : '[wiki iliyopita] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s baadaye',\n        past : 'tokea %s',\n        s : 'hivi punde',\n        ss : 'sekunde %d',\n        m : 'dakika moja',\n        mm : 'dakika %d',\n        h : 'saa limoja',\n        hh : 'masaa %d',\n        d : 'siku moja',\n        dd : 'masiku %d',\n        M : 'mwezi mmoja',\n        MM : 'miezi %d',\n        y : 'mwaka mmoja',\n        yy : 'miaka %d'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn sw;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/sw.js\n// module id = 471\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar symbolMap = {\n    '1': '௧',\n    '2': '௨',\n    '3': '௩',\n    '4': '௪',\n    '5': '௫',\n    '6': '௬',\n    '7': '௭',\n    '8': '௮',\n    '9': '௯',\n    '0': '௦'\n}, numberMap = {\n    '௧': '1',\n    '௨': '2',\n    '௩': '3',\n    '௪': '4',\n    '௫': '5',\n    '௬': '6',\n    '௭': '7',\n    '௮': '8',\n    '௯': '9',\n    '௦': '0'\n};\n\nvar ta = moment.defineLocale('ta', {\n    months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),\n    weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),\n    weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),\n    weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, HH:mm',\n        LLLL : 'dddd, D MMMM YYYY, HH:mm'\n    },\n    calendar : {\n        sameDay : '[இன்று] LT',\n        nextDay : '[நாளை] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[நேற்று] LT',\n        lastWeek : '[கடந்த வாரம்] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s இல்',\n        past : '%s முன்',\n        s : 'ஒரு சில விநாடிகள்',\n        ss : '%d விநாடிகள்',\n        m : 'ஒரு நிமிடம்',\n        mm : '%d நிமிடங்கள்',\n        h : 'ஒரு மணி நேரம்',\n        hh : '%d மணி நேரம்',\n        d : 'ஒரு நாள்',\n        dd : '%d நாட்கள்',\n        M : 'ஒரு மாதம்',\n        MM : '%d மாதங்கள்',\n        y : 'ஒரு வருடம்',\n        yy : '%d ஆண்டுகள்'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n    ordinal : function (number) {\n        return number + 'வது';\n    },\n    preparse: function (string) {\n        return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n            return numberMap[match];\n        });\n    },\n    postformat: function (string) {\n        return string.replace(/\\d/g, function (match) {\n            return symbolMap[match];\n        });\n    },\n    // refer http://ta.wikipedia.org/s/1er1\n    meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 2) {\n            return ' யாமம்';\n        } else if (hour < 6) {\n            return ' வைகறை';  // வைகறை\n        } else if (hour < 10) {\n            return ' காலை'; // காலை\n        } else if (hour < 14) {\n            return ' நண்பகல்'; // நண்பகல்\n        } else if (hour < 18) {\n            return ' எற்பாடு'; // எற்பாடு\n        } else if (hour < 22) {\n            return ' மாலை'; // மாலை\n        } else {\n            return ' யாமம்';\n        }\n    },\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'யாமம்') {\n            return hour < 2 ? hour : hour + 12;\n        } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n            return hour;\n        } else if (meridiem === 'நண்பகல்') {\n            return hour >= 10 ? hour : hour + 12;\n        } else {\n            return hour + 12;\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ta;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ta.js\n// module id = 472\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar te = moment.defineLocale('te', {\n    months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),\n    monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),\n    weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n    weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n    longDateFormat : {\n        LT : 'A h:mm',\n        LTS : 'A h:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY, A h:mm',\n        LLLL : 'dddd, D MMMM YYYY, A h:mm'\n    },\n    calendar : {\n        sameDay : '[నేడు] LT',\n        nextDay : '[రేపు] LT',\n        nextWeek : 'dddd, LT',\n        lastDay : '[నిన్న] LT',\n        lastWeek : '[గత] dddd, LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s లో',\n        past : '%s క్రితం',\n        s : 'కొన్ని క్షణాలు',\n        ss : '%d సెకన్లు',\n        m : 'ఒక నిమిషం',\n        mm : '%d నిమిషాలు',\n        h : 'ఒక గంట',\n        hh : '%d గంటలు',\n        d : 'ఒక రోజు',\n        dd : '%d రోజులు',\n        M : 'ఒక నెల',\n        MM : '%d నెలలు',\n        y : 'ఒక సంవత్సరం',\n        yy : '%d సంవత్సరాలు'\n    },\n    dayOfMonthOrdinalParse : /\\d{1,2}వ/,\n    ordinal : '%dవ',\n    meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'రాత్రి') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'ఉదయం') {\n            return hour;\n        } else if (meridiem === 'మధ్యాహ్నం') {\n            return hour >= 10 ? hour : hour + 12;\n        } else if (meridiem === 'సాయంత్రం') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'రాత్రి';\n        } else if (hour < 10) {\n            return 'ఉదయం';\n        } else if (hour < 17) {\n            return 'మధ్యాహ్నం';\n        } else if (hour < 20) {\n            return 'సాయంత్రం';\n        } else {\n            return 'రాత్రి';\n        }\n    },\n    week : {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn te;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/te.js\n// module id = 473\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tet = moment.defineLocale('tet', {\n    months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'),\n    monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n    weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n    weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n    weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Ohin iha] LT',\n        nextDay: '[Aban iha] LT',\n        nextWeek: 'dddd [iha] LT',\n        lastDay: '[Horiseik iha] LT',\n        lastWeek: 'dddd [semana kotuk] [iha] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'iha %s',\n        past : '%s liuba',\n        s : 'minutu balun',\n        ss : 'minutu %d',\n        m : 'minutu ida',\n        mm : 'minutu %d',\n        h : 'oras ida',\n        hh : 'oras %d',\n        d : 'loron ida',\n        dd : 'loron %d',\n        M : 'fulan ida',\n        MM : 'fulan %d',\n        y : 'tinan ida',\n        yy : 'tinan %d'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tet;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tet.js\n// module id = 474\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar suffixes = {\n    0: '-ум',\n    1: '-ум',\n    2: '-юм',\n    3: '-юм',\n    4: '-ум',\n    5: '-ум',\n    6: '-ум',\n    7: '-ум',\n    8: '-ум',\n    9: '-ум',\n    10: '-ум',\n    12: '-ум',\n    13: '-ум',\n    20: '-ум',\n    30: '-юм',\n    40: '-ум',\n    50: '-ум',\n    60: '-ум',\n    70: '-ум',\n    80: '-ум',\n    90: '-ум',\n    100: '-ум'\n};\n\nvar tg = moment.defineLocale('tg', {\n    months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),\n    monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'),\n    weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),\n    weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Имрӯз соати] LT',\n        nextDay : '[Пагоҳ соати] LT',\n        lastDay : '[Дирӯз соати] LT',\n        nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT',\n        lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'баъди %s',\n        past : '%s пеш',\n        s : 'якчанд сония',\n        m : 'як дақиқа',\n        mm : '%d дақиқа',\n        h : 'як соат',\n        hh : '%d соат',\n        d : 'як рӯз',\n        dd : '%d рӯз',\n        M : 'як моҳ',\n        MM : '%d моҳ',\n        y : 'як сол',\n        yy : '%d сол'\n    },\n    meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === 'шаб') {\n            return hour < 4 ? hour : hour + 12;\n        } else if (meridiem === 'субҳ') {\n            return hour;\n        } else if (meridiem === 'рӯз') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === 'бегоҳ') {\n            return hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'шаб';\n        } else if (hour < 11) {\n            return 'субҳ';\n        } else if (hour < 16) {\n            return 'рӯз';\n        } else if (hour < 19) {\n            return 'бегоҳ';\n        } else {\n            return 'шаб';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(ум|юм)/,\n    ordinal: function (number) {\n        var a = number % 10,\n            b = number >= 100 ? 100 : null;\n        return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1th is the first week of the year.\n    }\n});\n\nreturn tg;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tg.js\n// module id = 475\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar th = moment.defineLocale('th', {\n    months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),\n    monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),\n    monthsParseExact: true,\n    weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n    weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference\n    weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'H:mm',\n        LTS : 'H:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY เวลา H:mm',\n        LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'\n    },\n    meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n    isPM: function (input) {\n        return input === 'หลังเที่ยง';\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'ก่อนเที่ยง';\n        } else {\n            return 'หลังเที่ยง';\n        }\n    },\n    calendar : {\n        sameDay : '[วันนี้ เวลา] LT',\n        nextDay : '[พรุ่งนี้ เวลา] LT',\n        nextWeek : 'dddd[หน้า เวลา] LT',\n        lastDay : '[เมื่อวานนี้ เวลา] LT',\n        lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'อีก %s',\n        past : '%sที่แล้ว',\n        s : 'ไม่กี่วินาที',\n        ss : '%d วินาที',\n        m : '1 นาที',\n        mm : '%d นาที',\n        h : '1 ชั่วโมง',\n        hh : '%d ชั่วโมง',\n        d : '1 วัน',\n        dd : '%d วัน',\n        M : '1 เดือน',\n        MM : '%d เดือน',\n        y : '1 ปี',\n        yy : '%d ปี'\n    }\n});\n\nreturn th;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/th.js\n// module id = 476\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tlPh = moment.defineLocale('tl-ph', {\n    months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),\n    monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n    weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),\n    weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n    weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'MM/D/YYYY',\n        LL : 'MMMM D, YYYY',\n        LLL : 'MMMM D, YYYY HH:mm',\n        LLLL : 'dddd, MMMM DD, YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: 'LT [ngayong araw]',\n        nextDay: '[Bukas ng] LT',\n        nextWeek: 'LT [sa susunod na] dddd',\n        lastDay: 'LT [kahapon]',\n        lastWeek: 'LT [noong nakaraang] dddd',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'sa loob ng %s',\n        past : '%s ang nakalipas',\n        s : 'ilang segundo',\n        ss : '%d segundo',\n        m : 'isang minuto',\n        mm : '%d minuto',\n        h : 'isang oras',\n        hh : '%d oras',\n        d : 'isang araw',\n        dd : '%d araw',\n        M : 'isang buwan',\n        MM : '%d buwan',\n        y : 'isang taon',\n        yy : '%d taon'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : function (number) {\n        return number;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tlPh;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tl-ph.js\n// module id = 477\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\nfunction translateFuture(output) {\n    var time = output;\n    time = (output.indexOf('jaj') !== -1) ?\n    time.slice(0, -3) + 'leS' :\n    (output.indexOf('jar') !== -1) ?\n    time.slice(0, -3) + 'waQ' :\n    (output.indexOf('DIS') !== -1) ?\n    time.slice(0, -3) + 'nem' :\n    time + ' pIq';\n    return time;\n}\n\nfunction translatePast(output) {\n    var time = output;\n    time = (output.indexOf('jaj') !== -1) ?\n    time.slice(0, -3) + 'Hu’' :\n    (output.indexOf('jar') !== -1) ?\n    time.slice(0, -3) + 'wen' :\n    (output.indexOf('DIS') !== -1) ?\n    time.slice(0, -3) + 'ben' :\n    time + ' ret';\n    return time;\n}\n\nfunction translate(number, withoutSuffix, string, isFuture) {\n    var numberNoun = numberAsNoun(number);\n    switch (string) {\n        case 'ss':\n            return numberNoun + ' lup';\n        case 'mm':\n            return numberNoun + ' tup';\n        case 'hh':\n            return numberNoun + ' rep';\n        case 'dd':\n            return numberNoun + ' jaj';\n        case 'MM':\n            return numberNoun + ' jar';\n        case 'yy':\n            return numberNoun + ' DIS';\n    }\n}\n\nfunction numberAsNoun(number) {\n    var hundred = Math.floor((number % 1000) / 100),\n    ten = Math.floor((number % 100) / 10),\n    one = number % 10,\n    word = '';\n    if (hundred > 0) {\n        word += numbersNouns[hundred] + 'vatlh';\n    }\n    if (ten > 0) {\n        word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH';\n    }\n    if (one > 0) {\n        word += ((word !== '') ? ' ' : '') + numbersNouns[one];\n    }\n    return (word === '') ? 'pagh' : word;\n}\n\nvar tlh = moment.defineLocale('tlh', {\n    months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'),\n    monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[DaHjaj] LT',\n        nextDay: '[wa’leS] LT',\n        nextWeek: 'LLL',\n        lastDay: '[wa’Hu’] LT',\n        lastWeek: 'LLL',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : translateFuture,\n        past : translatePast,\n        s : 'puS lup',\n        ss : translate,\n        m : 'wa’ tup',\n        mm : translate,\n        h : 'wa’ rep',\n        hh : translate,\n        d : 'wa’ jaj',\n        dd : translate,\n        M : 'wa’ jar',\n        MM : translate,\n        y : 'wa’ DIS',\n        yy : translate\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn tlh;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tlh.js\n// module id = 478\n// module chunks = 0 1","\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\nvar suffixes = {\n    1: '\\'inci',\n    5: '\\'inci',\n    8: '\\'inci',\n    70: '\\'inci',\n    80: '\\'inci',\n    2: '\\'nci',\n    7: '\\'nci',\n    20: '\\'nci',\n    50: '\\'nci',\n    3: '\\'üncü',\n    4: '\\'üncü',\n    100: '\\'üncü',\n    6: '\\'ncı',\n    9: '\\'uncu',\n    10: '\\'uncu',\n    30: '\\'uncu',\n    60: '\\'ıncı',\n    90: '\\'ıncı'\n};\n\nvar tr = moment.defineLocale('tr', {\n    months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),\n    monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),\n    weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),\n    weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),\n    weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[bugün saat] LT',\n        nextDay : '[yarın saat] LT',\n        nextWeek : '[gelecek] dddd [saat] LT',\n        lastDay : '[dün] LT',\n        lastWeek : '[geçen] dddd [saat] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s sonra',\n        past : '%s önce',\n        s : 'birkaç saniye',\n        ss : '%d saniye',\n        m : 'bir dakika',\n        mm : '%d dakika',\n        h : 'bir saat',\n        hh : '%d saat',\n        d : 'bir gün',\n        dd : '%d gün',\n        M : 'bir ay',\n        MM : '%d ay',\n        y : 'bir yıl',\n        yy : '%d yıl'\n    },\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'Do':\n            case 'DD':\n                return number;\n            default:\n                if (number === 0) {  // special case for zero\n                    return number + '\\'ıncı';\n                }\n                var a = number % 10,\n                    b = number % 100 - a,\n                    c = number >= 100 ? 100 : null;\n                return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tr;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tr.js\n// module id = 479\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\n// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.\n// This is currently too difficult (maybe even impossible) to add.\nvar tzl = moment.defineLocale('tzl', {\n    months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'),\n    monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),\n    weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),\n    weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),\n    weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),\n    longDateFormat : {\n        LT : 'HH.mm',\n        LTS : 'HH.mm.ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D. MMMM [dallas] YYYY',\n        LLL : 'D. MMMM [dallas] YYYY HH.mm',\n        LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm'\n    },\n    meridiemParse: /d\\'o|d\\'a/i,\n    isPM : function (input) {\n        return 'd\\'o' === input.toLowerCase();\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'd\\'o' : 'D\\'O';\n        } else {\n            return isLower ? 'd\\'a' : 'D\\'A';\n        }\n    },\n    calendar : {\n        sameDay : '[oxhi à] LT',\n        nextDay : '[demà à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[ieiri à] LT',\n        lastWeek : '[sür el] dddd [lasteu à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'osprei %s',\n        past : 'ja%s',\n        s : processRelativeTime,\n        ss : processRelativeTime,\n        m : processRelativeTime,\n        mm : processRelativeTime,\n        h : processRelativeTime,\n        hh : processRelativeTime,\n        d : processRelativeTime,\n        dd : processRelativeTime,\n        M : processRelativeTime,\n        MM : processRelativeTime,\n        y : processRelativeTime,\n        yy : processRelativeTime\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n    ordinal : '%d.',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nfunction processRelativeTime(number, withoutSuffix, key, isFuture) {\n    var format = {\n        's': ['viensas secunds', '\\'iensas secunds'],\n        'ss': [number + ' secunds', '' + number + ' secunds'],\n        'm': ['\\'n míut', '\\'iens míut'],\n        'mm': [number + ' míuts', '' + number + ' míuts'],\n        'h': ['\\'n þora', '\\'iensa þora'],\n        'hh': [number + ' þoras', '' + number + ' þoras'],\n        'd': ['\\'n ziua', '\\'iensa ziua'],\n        'dd': [number + ' ziuas', '' + number + ' ziuas'],\n        'M': ['\\'n mes', '\\'iens mes'],\n        'MM': [number + ' mesen', '' + number + ' mesen'],\n        'y': ['\\'n ar', '\\'iens ar'],\n        'yy': [number + ' ars', '' + number + ' ars']\n    };\n    return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]);\n}\n\nreturn tzl;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tzl.js\n// module id = 480\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tzm = moment.defineLocale('tzm', {\n    months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),\n    weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',\n        nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',\n        nextWeek: 'dddd [ⴴ] LT',\n        lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',\n        lastWeek: 'dddd [ⴴ] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',\n        past : 'ⵢⴰⵏ %s',\n        s : 'ⵉⵎⵉⴽ',\n        ss : '%d ⵉⵎⵉⴽ',\n        m : 'ⵎⵉⵏⵓⴺ',\n        mm : '%d ⵎⵉⵏⵓⴺ',\n        h : 'ⵙⴰⵄⴰ',\n        hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',\n        d : 'ⴰⵙⵙ',\n        dd : '%d oⵙⵙⴰⵏ',\n        M : 'ⴰⵢoⵓⵔ',\n        MM : '%d ⵉⵢⵢⵉⵔⵏ',\n        y : 'ⴰⵙⴳⴰⵙ',\n        yy : '%d ⵉⵙⴳⴰⵙⵏ'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tzm;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tzm.js\n// module id = 481\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar tzmLatn = moment.defineLocale('tzm-latn', {\n    months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),\n    weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[asdkh g] LT',\n        nextDay: '[aska g] LT',\n        nextWeek: 'dddd [g] LT',\n        lastDay: '[assant g] LT',\n        lastWeek: 'dddd [g] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'dadkh s yan %s',\n        past : 'yan %s',\n        s : 'imik',\n        ss : '%d imik',\n        m : 'minuḍ',\n        mm : '%d minuḍ',\n        h : 'saɛa',\n        hh : '%d tassaɛin',\n        d : 'ass',\n        dd : '%d ossan',\n        M : 'ayowr',\n        MM : '%d iyyirn',\n        y : 'asgas',\n        yy : '%d isgasn'\n    },\n    week : {\n        dow : 6, // Saturday is the first day of the week.\n        doy : 12  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn tzmLatn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/tzm-latn.js\n// module id = 482\n// module chunks = 0 1","//! moment.js language configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar ugCn = moment.defineLocale('ug-cn', {\n    months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n        '_'\n    ),\n    monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n        '_'\n    ),\n    weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(\n        '_'\n    ),\n    weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'YYYY-MM-DD',\n        LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n        LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n        LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm'\n    },\n    meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (\n            meridiem === 'يېرىم كېچە' ||\n            meridiem === 'سەھەر' ||\n            meridiem === 'چۈشتىن بۇرۇن'\n        ) {\n            return hour;\n        } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n            return hour + 12;\n        } else {\n            return hour >= 11 ? hour : hour + 12;\n        }\n    },\n    meridiem: function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return 'يېرىم كېچە';\n        } else if (hm < 900) {\n            return 'سەھەر';\n        } else if (hm < 1130) {\n            return 'چۈشتىن بۇرۇن';\n        } else if (hm < 1230) {\n            return 'چۈش';\n        } else if (hm < 1800) {\n            return 'چۈشتىن كېيىن';\n        } else {\n            return 'كەچ';\n        }\n    },\n    calendar: {\n        sameDay: '[بۈگۈن سائەت] LT',\n        nextDay: '[ئەتە سائەت] LT',\n        nextWeek: '[كېلەركى] dddd [سائەت] LT',\n        lastDay: '[تۆنۈگۈن] LT',\n        lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n        sameElse: 'L'\n    },\n    relativeTime: {\n        future: '%s كېيىن',\n        past: '%s بۇرۇن',\n        s: 'نەچچە سېكونت',\n        ss: '%d سېكونت',\n        m: 'بىر مىنۇت',\n        mm: '%d مىنۇت',\n        h: 'بىر سائەت',\n        hh: '%d سائەت',\n        d: 'بىر كۈن',\n        dd: '%d كۈن',\n        M: 'بىر ئاي',\n        MM: '%d ئاي',\n        y: 'بىر يىل',\n        yy: '%d يىل'\n    },\n\n    dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '-كۈنى';\n            case 'w':\n            case 'W':\n                return number + '-ھەپتە';\n            default:\n                return number;\n        }\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week: {\n        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n        dow: 1, // Monday is the first day of the week.\n        doy: 7 // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn ugCn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ug-cn.js\n// module id = 483\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nfunction plural(word, num) {\n    var forms = word.split('_');\n    return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);\n}\nfunction relativeTimeWithPlural(number, withoutSuffix, key) {\n    var format = {\n        'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n        'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n        'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n        'dd': 'день_дні_днів',\n        'MM': 'місяць_місяці_місяців',\n        'yy': 'рік_роки_років'\n    };\n    if (key === 'm') {\n        return withoutSuffix ? 'хвилина' : 'хвилину';\n    }\n    else if (key === 'h') {\n        return withoutSuffix ? 'година' : 'годину';\n    }\n    else {\n        return number + ' ' + plural(format[key], +number);\n    }\n}\nfunction weekdaysCaseReplace(m, format) {\n    var weekdays = {\n        'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),\n        'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),\n        'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')\n    };\n\n    if (!m) {\n        return weekdays['nominative'];\n    }\n\n    var nounCase = (/(\\[[ВвУу]\\]) ?dddd/).test(format) ?\n        'accusative' :\n        ((/\\[?(?:минулої|наступної)? ?\\] ?dddd/).test(format) ?\n            'genitive' :\n            'nominative');\n    return weekdays[nounCase][m.day()];\n}\nfunction processHoursFunction(str) {\n    return function () {\n        return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n    };\n}\n\nvar uk = moment.defineLocale('uk', {\n    months : {\n        'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),\n        'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')\n    },\n    monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),\n    weekdays : weekdaysCaseReplace,\n    weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD.MM.YYYY',\n        LL : 'D MMMM YYYY р.',\n        LLL : 'D MMMM YYYY р., HH:mm',\n        LLLL : 'dddd, D MMMM YYYY р., HH:mm'\n    },\n    calendar : {\n        sameDay: processHoursFunction('[Сьогодні '),\n        nextDay: processHoursFunction('[Завтра '),\n        lastDay: processHoursFunction('[Вчора '),\n        nextWeek: processHoursFunction('[У] dddd ['),\n        lastWeek: function () {\n            switch (this.day()) {\n                case 0:\n                case 3:\n                case 5:\n                case 6:\n                    return processHoursFunction('[Минулої] dddd [').call(this);\n                case 1:\n                case 2:\n                case 4:\n                    return processHoursFunction('[Минулого] dddd [').call(this);\n            }\n        },\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : 'за %s',\n        past : '%s тому',\n        s : 'декілька секунд',\n        ss : relativeTimeWithPlural,\n        m : relativeTimeWithPlural,\n        mm : relativeTimeWithPlural,\n        h : 'годину',\n        hh : relativeTimeWithPlural,\n        d : 'день',\n        dd : relativeTimeWithPlural,\n        M : 'місяць',\n        MM : relativeTimeWithPlural,\n        y : 'рік',\n        yy : relativeTimeWithPlural\n    },\n    // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n    meridiemParse: /ночі|ранку|дня|вечора/,\n    isPM: function (input) {\n        return /^(дня|вечора)$/.test(input);\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 4) {\n            return 'ночі';\n        } else if (hour < 12) {\n            return 'ранку';\n        } else if (hour < 17) {\n            return 'дня';\n        } else {\n            return 'вечора';\n        }\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n    ordinal: function (number, period) {\n        switch (period) {\n            case 'M':\n            case 'd':\n            case 'DDD':\n            case 'w':\n            case 'W':\n                return number + '-й';\n            case 'D':\n                return number + '-го';\n            default:\n                return number;\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn uk;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/uk.js\n// module id = 484\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar months = [\n    'جنوری',\n    'فروری',\n    'مارچ',\n    'اپریل',\n    'مئی',\n    'جون',\n    'جولائی',\n    'اگست',\n    'ستمبر',\n    'اکتوبر',\n    'نومبر',\n    'دسمبر'\n];\nvar days = [\n    'اتوار',\n    'پیر',\n    'منگل',\n    'بدھ',\n    'جمعرات',\n    'جمعہ',\n    'ہفتہ'\n];\n\nvar ur = moment.defineLocale('ur', {\n    months : months,\n    monthsShort : months,\n    weekdays : days,\n    weekdaysShort : days,\n    weekdaysMin : days,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd، D MMMM YYYY HH:mm'\n    },\n    meridiemParse: /صبح|شام/,\n    isPM : function (input) {\n        return 'شام' === input;\n    },\n    meridiem : function (hour, minute, isLower) {\n        if (hour < 12) {\n            return 'صبح';\n        }\n        return 'شام';\n    },\n    calendar : {\n        sameDay : '[آج بوقت] LT',\n        nextDay : '[کل بوقت] LT',\n        nextWeek : 'dddd [بوقت] LT',\n        lastDay : '[گذشتہ روز بوقت] LT',\n        lastWeek : '[گذشتہ] dddd [بوقت] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : '%s بعد',\n        past : '%s قبل',\n        s : 'چند سیکنڈ',\n        ss : '%d سیکنڈ',\n        m : 'ایک منٹ',\n        mm : '%d منٹ',\n        h : 'ایک گھنٹہ',\n        hh : '%d گھنٹے',\n        d : 'ایک دن',\n        dd : '%d دن',\n        M : 'ایک ماہ',\n        MM : '%d ماہ',\n        y : 'ایک سال',\n        yy : '%d سال'\n    },\n    preparse: function (string) {\n        return string.replace(/،/g, ',');\n    },\n    postformat: function (string) {\n        return string.replace(/,/g, '،');\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn ur;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/ur.js\n// module id = 485\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar uz = moment.defineLocale('uz', {\n    months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),\n    monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n    weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n    weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n    weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar : {\n        sameDay : '[Бугун соат] LT [да]',\n        nextDay : '[Эртага] LT [да]',\n        nextWeek : 'dddd [куни соат] LT [да]',\n        lastDay : '[Кеча соат] LT [да]',\n        lastWeek : '[Утган] dddd [куни соат] LT [да]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'Якин %s ичида',\n        past : 'Бир неча %s олдин',\n        s : 'фурсат',\n        ss : '%d фурсат',\n        m : 'бир дакика',\n        mm : '%d дакика',\n        h : 'бир соат',\n        hh : '%d соат',\n        d : 'бир кун',\n        dd : '%d кун',\n        M : 'бир ой',\n        MM : '%d ой',\n        y : 'бир йил',\n        yy : '%d йил'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn uz;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/uz.js\n// module id = 486\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar uzLatn = moment.defineLocale('uz-latn', {\n    months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'),\n    monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),\n    weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'),\n    weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),\n    weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'D MMMM YYYY, dddd HH:mm'\n    },\n    calendar : {\n        sameDay : '[Bugun soat] LT [da]',\n        nextDay : '[Ertaga] LT [da]',\n        nextWeek : 'dddd [kuni soat] LT [da]',\n        lastDay : '[Kecha soat] LT [da]',\n        lastWeek : '[O\\'tgan] dddd [kuni soat] LT [da]',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'Yaqin %s ichida',\n        past : 'Bir necha %s oldin',\n        s : 'soniya',\n        ss : '%d soniya',\n        m : 'bir daqiqa',\n        mm : '%d daqiqa',\n        h : 'bir soat',\n        hh : '%d soat',\n        d : 'bir kun',\n        dd : '%d kun',\n        M : 'bir oy',\n        MM : '%d oy',\n        y : 'bir yil',\n        yy : '%d yil'\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 7  // The week that contains Jan 1st is the first week of the year.\n    }\n});\n\nreturn uzLatn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/uz-latn.js\n// module id = 487\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar vi = moment.defineLocale('vi', {\n    months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),\n    monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),\n    weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n    weekdaysParseExact : true,\n    meridiemParse: /sa|ch/i,\n    isPM : function (input) {\n        return /^ch$/i.test(input);\n    },\n    meridiem : function (hours, minutes, isLower) {\n        if (hours < 12) {\n            return isLower ? 'sa' : 'SA';\n        } else {\n            return isLower ? 'ch' : 'CH';\n        }\n    },\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM [năm] YYYY',\n        LLL : 'D MMMM [năm] YYYY HH:mm',\n        LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',\n        l : 'DD/M/YYYY',\n        ll : 'D MMM YYYY',\n        lll : 'D MMM YYYY HH:mm',\n        llll : 'ddd, D MMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay: '[Hôm nay lúc] LT',\n        nextDay: '[Ngày mai lúc] LT',\n        nextWeek: 'dddd [tuần tới lúc] LT',\n        lastDay: '[Hôm qua lúc] LT',\n        lastWeek: 'dddd [tuần rồi lúc] LT',\n        sameElse: 'L'\n    },\n    relativeTime : {\n        future : '%s tới',\n        past : '%s trước',\n        s : 'vài giây',\n        ss : '%d giây' ,\n        m : 'một phút',\n        mm : '%d phút',\n        h : 'một giờ',\n        hh : '%d giờ',\n        d : 'một ngày',\n        dd : '%d ngày',\n        M : 'một tháng',\n        MM : '%d tháng',\n        y : 'một năm',\n        yy : '%d năm'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}/,\n    ordinal : function (number) {\n        return number;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn vi;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/vi.js\n// module id = 488\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar xPseudo = moment.defineLocale('x-pseudo', {\n    months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),\n    monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),\n    weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n    weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd, D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[T~ódá~ý át] LT',\n        nextDay : '[T~ómó~rró~w át] LT',\n        nextWeek : 'dddd [át] LT',\n        lastDay : '[Ý~ést~érdá~ý át] LT',\n        lastWeek : '[L~ást] dddd [át] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'í~ñ %s',\n        past : '%s á~gó',\n        s : 'á ~féw ~sécó~ñds',\n        ss : '%d s~écóñ~ds',\n        m : 'á ~míñ~úté',\n        mm : '%d m~íñú~tés',\n        h : 'á~ñ hó~úr',\n        hh : '%d h~óúrs',\n        d : 'á ~dáý',\n        dd : '%d d~áýs',\n        M : 'á ~móñ~th',\n        MM : '%d m~óñt~hs',\n        y : 'á ~ýéár',\n        yy : '%d ý~éárs'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (~~(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn xPseudo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/x-pseudo.js\n// module id = 489\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar yo = moment.defineLocale('yo', {\n    months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'),\n    monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),\n    weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),\n    weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),\n    weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),\n    longDateFormat : {\n        LT : 'h:mm A',\n        LTS : 'h:mm:ss A',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY h:mm A',\n        LLLL : 'dddd, D MMMM YYYY h:mm A'\n    },\n    calendar : {\n        sameDay : '[Ònì ni] LT',\n        nextDay : '[Ọ̀la ni] LT',\n        nextWeek : 'dddd [Ọsẹ̀ tón\\'bọ] [ni] LT',\n        lastDay : '[Àna ni] LT',\n        lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'ní %s',\n        past : '%s kọjá',\n        s : 'ìsẹjú aayá die',\n        ss :'aayá %d',\n        m : 'ìsẹjú kan',\n        mm : 'ìsẹjú %d',\n        h : 'wákati kan',\n        hh : 'wákati %d',\n        d : 'ọjọ́ kan',\n        dd : 'ọjọ́ %d',\n        M : 'osù kan',\n        MM : 'osù %d',\n        y : 'ọdún kan',\n        yy : 'ọdún %d'\n    },\n    dayOfMonthOrdinalParse : /ọjọ́\\s\\d{1,2}/,\n    ordinal : 'ọjọ́ %d',\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4 // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn yo;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/yo.js\n// module id = 490\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhCn = moment.defineLocale('zh-cn', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日Ah点mm分',\n        LLLL : 'YYYY年M月D日ddddAh点mm分',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour: function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' ||\n                meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        } else {\n            // '中午'\n            return hour >= 11 ? hour : hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd':\n            case 'D':\n            case 'DDD':\n                return number + '日';\n            case 'M':\n                return number + '月';\n            case 'w':\n            case 'W':\n                return number + '周';\n            default:\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s内',\n        past : '%s前',\n        s : '几秒',\n        ss : '%d 秒',\n        m : '1 分钟',\n        mm : '%d 分钟',\n        h : '1 小时',\n        hh : '%d 小时',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 个月',\n        MM : '%d 个月',\n        y : '1 年',\n        yy : '%d 年'\n    },\n    week : {\n        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn zhCn;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/zh-cn.js\n// module id = 491\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhHk = moment.defineLocale('zh-hk', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日dddd HH:mm',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '中午') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd' :\n            case 'D' :\n            case 'DDD' :\n                return number + '日';\n            case 'M' :\n                return number + '月';\n            case 'w' :\n            case 'W' :\n                return number + '週';\n            default :\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s內',\n        past : '%s前',\n        s : '幾秒',\n        ss : '%d 秒',\n        m : '1 分鐘',\n        mm : '%d 分鐘',\n        h : '1 小時',\n        hh : '%d 小時',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 個月',\n        MM : '%d 個月',\n        y : '1 年',\n        yy : '%d 年'\n    }\n});\n\nreturn zhHk;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/zh-hk.js\n// module id = 492\n// module chunks = 0 1","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar zhTw = moment.defineLocale('zh-tw', {\n    months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),\n    monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n    weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n    weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n    weekdaysMin : '日_一_二_三_四_五_六'.split('_'),\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'YYYY/MM/DD',\n        LL : 'YYYY年M月D日',\n        LLL : 'YYYY年M月D日 HH:mm',\n        LLLL : 'YYYY年M月D日dddd HH:mm',\n        l : 'YYYY/M/D',\n        ll : 'YYYY年M月D日',\n        lll : 'YYYY年M月D日 HH:mm',\n        llll : 'YYYY年M月D日dddd HH:mm'\n    },\n    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n    meridiemHour : function (hour, meridiem) {\n        if (hour === 12) {\n            hour = 0;\n        }\n        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n            return hour;\n        } else if (meridiem === '中午') {\n            return hour >= 11 ? hour : hour + 12;\n        } else if (meridiem === '下午' || meridiem === '晚上') {\n            return hour + 12;\n        }\n    },\n    meridiem : function (hour, minute, isLower) {\n        var hm = hour * 100 + minute;\n        if (hm < 600) {\n            return '凌晨';\n        } else if (hm < 900) {\n            return '早上';\n        } else if (hm < 1130) {\n            return '上午';\n        } else if (hm < 1230) {\n            return '中午';\n        } else if (hm < 1800) {\n            return '下午';\n        } else {\n            return '晚上';\n        }\n    },\n    calendar : {\n        sameDay : '[今天]LT',\n        nextDay : '[明天]LT',\n        nextWeek : '[下]ddddLT',\n        lastDay : '[昨天]LT',\n        lastWeek : '[上]ddddLT',\n        sameElse : 'L'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            case 'd' :\n            case 'D' :\n            case 'DDD' :\n                return number + '日';\n            case 'M' :\n                return number + '月';\n            case 'w' :\n            case 'W' :\n                return number + '週';\n            default :\n                return number;\n        }\n    },\n    relativeTime : {\n        future : '%s內',\n        past : '%s前',\n        s : '幾秒',\n        ss : '%d 秒',\n        m : '1 分鐘',\n        mm : '%d 分鐘',\n        h : '1 小時',\n        hh : '%d 小時',\n        d : '1 天',\n        dd : '%d 天',\n        M : '1 個月',\n        MM : '%d 個月',\n        y : '1 年',\n        yy : '%d 年'\n    }\n});\n\nreturn zhTw;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale/zh-tw.js\n// module id = 493\n// module chunks = 0 1","import React from 'react';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst selectionModes = ['days', 'months', 'years'];\n\nconst Calendar = createReactClass({\n  propTypes: {\n    yearsPerPage: PropTypes.number,\n    date: PropTypes.any,\n    minYear: PropTypes.any,\n    maxYear: PropTypes.any,\n    minSelectionMode: PropTypes.oneOf(selectionModes),\n    onDateSelected: PropTypes.func\n  },\n\n  getDefaultProps: function() {\n    return {\n      yearsPerPage: 9,\n      minYear: '1/1/1000',\n      maxYear: '1/1/5000',\n      date: new Date(),\n      minSelectionMode: 'days'\n    };\n  },\n\n  getInitialState: function() {\n    var initMoment = moment(this.props.date).locale('en');\n    var initSelMode = this.props.minSelectionMode;\n\n    return {\n      selectionMode: initSelMode,\n      selectedMoment: initMoment,\n      visibleMoment: initMoment\n    };\n  },\n\n  componentDidMount: function() {\n    //Fire this onmount so parent components can initialize with a default value\n    if (this.props.onDateSelected) {\n      this.props.onDateSelected(this.state.selectedMoment, this.state.selectionMode);\n    }\n  },\n\n  componentWillReceiveProps: function(nextProps) {\n    if (\n      nextProps.minSelectionMode != this.state.selectionMode &&\n      _.contains(selectionModes, nextProps.minSelectionMode)\n    ) {\n      this.setState({ selectionMode: nextProps.minSelectionMode }, function() {\n        if (this.props.onDateSelected) {\n          this.props.onDateSelected(this.state.selectedMoment, nextProps.minSelectionMode);\n        }\n      });\n    }\n\n    if (!this.state.selectedMoment.isSame(nextProps.date)) {\n      this.setState({ selectedMoment: moment(nextProps.date) });\n    }\n  },\n\n  /**\n   * Given a moment date, generates an array of days (annotated with classes based on whether they are currently selected or\n   * from a previous/next month.  The resulting array gets passed to renderDays()\n   * @param {moment} date\n   * @returns {*}\n   */\n  getDays: function(date) {\n    var currentMoment = this.state.selectedMoment;\n    var firstDay = date.clone().startOf('month');\n    var firstDayOffset = firstDay.weekday();\n\n    return _.chain(_.range(42))\n      .map(i => {\n        var momentCursor = firstDay.clone().add('days', i - firstDayOffset);\n        var isBeforeMonth = i < firstDayOffset;\n        var isAfterMonth = i >= date.daysInMonth() + firstDayOffset;\n        return {\n          day: momentCursor,\n          classes: {\n            day: true,\n            'ui-datepicker__day': true,\n            old: isBeforeMonth,\n            active: currentMoment.isSame(momentCursor, 'day') && !isAfterMonth && !isBeforeMonth,\n            new: isAfterMonth\n          }\n        };\n      })\n      .value();\n  },\n\n  /**\n   * Given a moment date, generates an array of months to be passed to the renderMonths function\n   * @param {moment} date\n   * @returns {*}\n   */\n  getMonths: function(date) {\n    var currentMoment = this.state.selectedMoment;\n\n    return _.map(_.range(12), i => {\n      var momentCursor = moment([date.year(), i]);\n      return {\n        month: momentCursor,\n        classes: {\n          month: true,\n          'ui-datepicker__month': true,\n          active: currentMoment.isSame(momentCursor, 'month')\n        }\n      };\n    });\n  },\n\n  /**\n   * Given a moment date, generates an array of years to be passed to the renderYears function\n   * @param {moment} date\n   * @returns {*}\n   */\n  getYears: function(date) {\n    var currentMoment = this.state.selectedMoment;\n    var range = this.getYearRange(date);\n\n    var minYear = moment(this.props.minYear).year();\n    var maxYear = moment(this.props.maxYear).year();\n\n    return _.map(_.range(range.start, range.end), i => {\n      var momentCursor = moment([i]);\n      return {\n        year: momentCursor,\n        classes: {\n          year: true,\n          'ui-datepicker__year': true,\n          old: i < minYear || i > maxYear,\n          active: currentMoment.isSame(momentCursor, 'year')\n        }\n      };\n    });\n  },\n\n  /**\n   * Computes the start and ending years for generating a 'page' of years surrounding a given moment date's year\n   * @param {moment} date\n   * @returns {{start: number, end: number}}\n   */\n  getYearRange: function(date) {\n    var ypp = this.props.yearsPerPage;\n    var start = Math.floor(date.year() / ypp) * ypp;\n    var end = start + ypp;\n\n    return { start: start, end: end };\n  },\n\n  handleNext: function() {\n    this._navigateVisibleMomentForward(true);\n  },\n\n  handlePrev: function() {\n    this._navigateVisibleMomentForward(false);\n  },\n\n  handleNavigateDownMode: function(newday) {\n    this.setState({ visibleMoment: newday });\n    this._decrementSelectionMode(\n      function() {\n        if (this.props.onDateSelected) {\n          this.props.onDateSelected(newday, this.state.selectionMode);\n        }\n        this.setState({ selectedMoment: newday });\n      }.bind(this)\n    );\n  },\n\n  handleNavigateUpMode: function() {\n    this._incrementSelectionMode();\n  },\n\n  _navigateVisibleMomentForward: function(isforward) {\n    var direction = isforward ? 1 : -1;\n    var selMode = this.state.selectionMode;\n\n    var visibleMoment = this.state.visibleMoment.clone();\n\n    switch (selMode) {\n      case 'days':\n        this.setState({ visibleMoment: visibleMoment.add('months', direction) });\n        break;\n      case 'months':\n        this.setState({ visibleMoment: visibleMoment.add('years', direction) });\n        break;\n      case 'years':\n        this.setState({ visibleMoment: visibleMoment.add('years', this.props.yearsPerPage * direction) });\n        break;\n    }\n  },\n\n  _incrementSelectionMode: function() {\n    var modeUp = _.indexOf(selectionModes, this.state.selectionMode) + 1;\n    if (modeUp <= 2) {\n      this.setState({ selectionMode: selectionModes[modeUp] });\n    }\n  },\n\n  _decrementSelectionMode: function(handleMinModeReached) {\n    var minMode = _.indexOf(selectionModes, this.props.minSelectionMode);\n    var curMode = _.indexOf(selectionModes, this.state.selectionMode);\n    if (curMode - 1 >= 0 && curMode - 1 >= minMode) {\n      this.setState({ selectionMode: selectionModes[curMode - 1] });\n    }\n    if (curMode === minMode) {\n      handleMinModeReached();\n    }\n  },\n\n  /**\n   * Outputs calendar header text based on the current mode (day/month/year)\n   * @returns {string}\n   */\n  getHeaderText: function() {\n    var headerText = '';\n\n    switch (this.state.selectionMode) {\n      case 'days':\n        headerText = this.state.visibleMoment.format('MMMM YYYY');\n        break;\n      case 'months':\n        headerText = this.state.visibleMoment.format('YYYY');\n        break;\n      case 'years':\n        var range = this.getYearRange(this.state.visibleMoment);\n        headerText = range.start + '-' + (range.end - 1);\n        break;\n    }\n    return headerText;\n  },\n\n  renderDOWHeader: function() {\n    return (\n      <tr>\n        {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map(function(d) {\n          return <th key={d} className=\"ui-datepicker__dow\">{d}</th>;\n        })}\n      </tr>\n    );\n  },\n\n  renderYears: function(years) {\n    return _.map(years, year => {\n      return (\n        <span\n          key={year.year.toString()}\n          onClick={!year.classes.old ? this.handleNavigateDownMode.bind(null, year.year) : null}\n          className={classNames(year.classes)}\n        >\n          {year.year.format('YYYY')}\n        </span>\n      );\n    });\n  },\n\n  renderMonths: function(months) {\n    return _.map(months, month => {\n      return (\n        <span\n          key={month.month.toString()}\n          onClick={this.handleNavigateDownMode.bind(null, month.month)}\n          className={classNames(month.classes)}\n        >\n          {month.month.format('MMM')}\n        </span>\n      );\n    });\n  },\n\n  renderDays: function(days) {\n    return _.chain(days)\n      .map((d, i) => {\n        return { day: d, row: Math.ceil((i + 1) / 7) };\n      })\n      .groupBy('row')\n      .map((week, i) => {\n        return (\n          <tr key={`week-${i}`}>\n            {_.map(week, d => {\n              return (\n                <td key={d.day.day.date()} onClick={this.handleNavigateDownMode.bind(null, d.day.day)} className={classNames(d.day.classes)}>\n                  {d.day.day.date()}\n                </td>\n              );\n            })}\n          </tr>\n        );\n      })\n      .value();\n  },\n\n  render: function() {\n    return (\n      <div className=\"ui-datepicker\">\n        <table>\n          <thead>\n            <tr className=\"ui-datepicker__pagination\">\n              <th onClick={this.handlePrev} className=\"ui-datepicker__pagination__prev icon-left-1\" />\n              <th onClick={this.handleNavigateUpMode} className=\"ui-datepicker__switch\" colSpan=\"5\">\n                {this.getHeaderText()}\n              </th>\n              <th onClick={this.handleNext} className=\"ui-datepicker__pagination__next icon-right-1\" />\n            </tr>\n            {this.state.selectionMode === 'days' ? this.renderDOWHeader() : null}\n          </thead>\n          {this.state.selectionMode === 'days' ? (\n            <tbody>{this.renderDays(this.getDays(this.state.visibleMoment))}</tbody>\n          ) : null}\n          {this.state.selectionMode === 'months' ? (\n            <tbody>\n              <tr>\n                <td colSpan=\"7\">{this.renderMonths(this.getMonths(this.state.visibleMoment))}</td>\n              </tr>\n            </tbody>\n          ) : null}\n          {this.state.selectionMode === 'years' ? (\n            <tbody>\n              <tr>\n                <td colSpan=\"7\">{this.renderYears(this.getYears(this.state.visibleMoment))}</td>\n              </tr>\n            </tbody>\n          ) : null}\n        </table>\n      </div>\n    );\n  }\n});\n\nexport default Calendar;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/calendar.js","import _ from 'lodash';\n\nexport default {\n  getInitialState: function () {\n    return {\n      open: false\n    };\n  },\n\n  componentDidMount: function () {\n    document.addEventListener('click', this.handleDocumentClick);\n  },\n\n  componentWillUnmount: function () {\n    document.removeEventListener('click', this.handleDocumentClick);\n  },\n\n  handleToggleClick: function (e) {\n    if (this.props.disabled) {\n      return;\n    }\n\n    if (!this.ignoreToggle) {\n      this.toggle();\n    }\n    this.ignoreClick = true;\n    this.ignoreToggle = false;\n  },\n\n  handleContentClick: function (e) {\n    if (this.props.ignoreContentClicks) {\n      this.ignoreToggle = true;\n    }\n  },\n\n  handleDocumentClick: function () {\n    if (this.props.ignoreDocumentClicks) {\n      return;\n    }\n\n    var self = this;\n\n    // Allow the handleClick handler a chance to run first\n    // before checking if we should toggle the menu closed.\n    // It isn't defined what order the click handlers will run.\n    _.defer(function () {\n      if (!self.ignoreClick && self.state.open) {\n        self.toggle();\n      }\n      self.ignoreClick = !self.ignoreClick;\n    });\n  },\n\n  // When calling this from a click event listener be sure to\n  // pass true for ignoreClick otherwise the menu will never open.\n  toggle: function (ignoreClick) {\n    var opening = !this.state.open;\n    this.setState({open: opening});\n\n    var onToggle = this.onToggle;\n    if (onToggle) {\n      onToggle(opening);\n    }\n\n    this.ignoreClick = ignoreClick;\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/toggle_mixin.js","export default {\n  componentWillMount: function () {\n    this.timeouts = [];\n    this.intervals = [];\n  },\n\n  setInterval: function () {\n    this.intervals.push(setInterval.apply(null, arguments));\n  },\n\n  setTimeout: function (cb, delay) {\n    var self = this;\n\n    var timeout = setTimeout(function () {\n      cb();\n      self.removeTimeout(timeout);\n    }, delay);\n\n    this.timeouts.push(timeout);\n\n    return timeout;\n  },\n\n  clearTimeout: function (timeout) {\n    this.removeTimeout(timeout);\n    clearTimeout(timeout);\n  },\n\n  removeTimeout: function (timeout) {\n    var index = this.timeouts.indexOf(timeout);\n    if (index !== -1) {\n      this.timeouts.slice(index, 1);\n    }\n  },\n\n  componentWillUnmount: function () {\n    var i, len;\n\n    for (i = 0, len = this.intervals.length; i < len; ++i) {\n      clearInterval(this.intervals[i]);\n    }\n    for (i = 0, len = this.timeouts.length; i < len; ++i) {\n      clearTimeout(this.timeouts[i]);\n    }\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/timeout_mixin.js","'use strict';\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _chainFunction = require('chain-function');\n\nvar _chainFunction2 = _interopRequireDefault(_chainFunction);\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _ChildMapping = require('./utils/ChildMapping');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar propTypes = {\n  component: _propTypes2.default.any,\n  childFactory: _propTypes2.default.func,\n  children: _propTypes2.default.node\n};\n\nvar defaultProps = {\n  component: 'span',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n\nvar TransitionGroup = function (_React$Component) {\n  _inherits(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    _classCallCheck(this, TransitionGroup);\n\n    var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));\n\n    _this.performAppear = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillAppear) {\n        component.componentWillAppear(_this._handleDoneAppearing.bind(_this, key, component));\n      } else {\n        _this._handleDoneAppearing(key, component);\n      }\n    };\n\n    _this._handleDoneAppearing = function (key, component) {\n      if (component.componentDidAppear) {\n        component.componentDidAppear();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (!currentChildMapping || !currentChildMapping.hasOwnProperty(key)) {\n        // This was removed before it had fully appeared. Remove it.\n        _this.performLeave(key, component);\n      }\n    };\n\n    _this.performEnter = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillEnter) {\n        component.componentWillEnter(_this._handleDoneEntering.bind(_this, key, component));\n      } else {\n        _this._handleDoneEntering(key, component);\n      }\n    };\n\n    _this._handleDoneEntering = function (key, component) {\n      if (component.componentDidEnter) {\n        component.componentDidEnter();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (!currentChildMapping || !currentChildMapping.hasOwnProperty(key)) {\n        // This was removed before it had fully entered. Remove it.\n        _this.performLeave(key, component);\n      }\n    };\n\n    _this.performLeave = function (key, component) {\n      _this.currentlyTransitioningKeys[key] = true;\n\n      if (component.componentWillLeave) {\n        component.componentWillLeave(_this._handleDoneLeaving.bind(_this, key, component));\n      } else {\n        // Note that this is somewhat dangerous b/c it calls setState()\n        // again, effectively mutating the component before all the work\n        // is done.\n        _this._handleDoneLeaving(key, component);\n      }\n    };\n\n    _this._handleDoneLeaving = function (key, component) {\n      if (component.componentDidLeave) {\n        component.componentDidLeave();\n      }\n\n      delete _this.currentlyTransitioningKeys[key];\n\n      var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n\n      if (currentChildMapping && currentChildMapping.hasOwnProperty(key)) {\n        // This entered again before it fully left. Add it again.\n        _this.keysToEnter.push(key);\n      } else {\n        _this.setState(function (state) {\n          var newChildren = _extends({}, state.children);\n          delete newChildren[key];\n          return { children: newChildren };\n        });\n      }\n    };\n\n    _this.childRefs = Object.create(null);\n\n    _this.state = {\n      children: (0, _ChildMapping.getChildMapping)(props.children)\n    };\n    return _this;\n  }\n\n  TransitionGroup.prototype.componentWillMount = function componentWillMount() {\n    this.currentlyTransitioningKeys = {};\n    this.keysToEnter = [];\n    this.keysToLeave = [];\n  };\n\n  TransitionGroup.prototype.componentDidMount = function componentDidMount() {\n    var initialChildMapping = this.state.children;\n    for (var key in initialChildMapping) {\n      if (initialChildMapping[key]) {\n        this.performAppear(key, this.childRefs[key]);\n      }\n    }\n  };\n\n  TransitionGroup.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var nextChildMapping = (0, _ChildMapping.getChildMapping)(nextProps.children);\n    var prevChildMapping = this.state.children;\n\n    this.setState({\n      children: (0, _ChildMapping.mergeChildMappings)(prevChildMapping, nextChildMapping)\n    });\n\n    for (var key in nextChildMapping) {\n      var hasPrev = prevChildMapping && prevChildMapping.hasOwnProperty(key);\n      if (nextChildMapping[key] && !hasPrev && !this.currentlyTransitioningKeys[key]) {\n        this.keysToEnter.push(key);\n      }\n    }\n\n    for (var _key in prevChildMapping) {\n      var hasNext = nextChildMapping && nextChildMapping.hasOwnProperty(_key);\n      if (prevChildMapping[_key] && !hasNext && !this.currentlyTransitioningKeys[_key]) {\n        this.keysToLeave.push(_key);\n      }\n    }\n\n    // If we want to someday check for reordering, we could do it here.\n  };\n\n  TransitionGroup.prototype.componentDidUpdate = function componentDidUpdate() {\n    var _this2 = this;\n\n    var keysToEnter = this.keysToEnter;\n    this.keysToEnter = [];\n    keysToEnter.forEach(function (key) {\n      return _this2.performEnter(key, _this2.childRefs[key]);\n    });\n\n    var keysToLeave = this.keysToLeave;\n    this.keysToLeave = [];\n    keysToLeave.forEach(function (key) {\n      return _this2.performLeave(key, _this2.childRefs[key]);\n    });\n  };\n\n  TransitionGroup.prototype.render = function render() {\n    var _this3 = this;\n\n    // TODO: we could get rid of the need for the wrapper node\n    // by cloning a single child\n    var childrenToRender = [];\n\n    var _loop = function _loop(key) {\n      var child = _this3.state.children[key];\n      if (child) {\n        var isCallbackRef = typeof child.ref !== 'string';\n        var factoryChild = _this3.props.childFactory(child);\n        var ref = function ref(r) {\n          _this3.childRefs[key] = r;\n        };\n\n        process.env.NODE_ENV !== 'production' ? (0, _warning2.default)(isCallbackRef, 'string refs are not supported on children of TransitionGroup and will be ignored. ' + 'Please use a callback ref instead: https://facebook.github.io/react/docs/refs-and-the-dom.html#the-ref-callback-attribute') : void 0;\n\n        // Always chaining the refs leads to problems when the childFactory\n        // wraps the child. The child ref callback gets called twice with the\n        // wrapper and the child. So we only need to chain the ref if the\n        // factoryChild is not different from child.\n        if (factoryChild === child && isCallbackRef) {\n          ref = (0, _chainFunction2.default)(child.ref, ref);\n        }\n\n        // You may need to apply reactive updates to a child as it is leaving.\n        // The normal React way to do it won't work since the child will have\n        // already been removed. In case you need this behavior you can provide\n        // a childFactory function to wrap every child, even the ones that are\n        // leaving.\n        childrenToRender.push(_react2.default.cloneElement(factoryChild, {\n          key: key,\n          ref: ref\n        }));\n      }\n    };\n\n    for (var key in this.state.children) {\n      _loop(key);\n    }\n\n    // Do not forward TransitionGroup props to primitive DOM nodes\n    var props = _extends({}, this.props);\n    delete props.transitionLeave;\n    delete props.transitionName;\n    delete props.transitionAppear;\n    delete props.transitionEnter;\n    delete props.childFactory;\n    delete props.transitionLeaveTimeout;\n    delete props.transitionEnterTimeout;\n    delete props.transitionAppearTimeout;\n    delete props.component;\n\n    return _react2.default.createElement(this.props.component, props, childrenToRender);\n  };\n\n  return TransitionGroup;\n}(_react2.default.Component);\n\nTransitionGroup.displayName = 'TransitionGroup';\n\n\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nTransitionGroup.defaultProps = defaultProps;\n\nexports.default = TransitionGroup;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/TransitionGroup.js\n// module id = 497\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _default = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/util/inDOM.js\n// module id = 498\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.nameShape = undefined;\nexports.transitionTimeout = transitionTimeout;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction transitionTimeout(transitionType) {\n  var timeoutPropName = 'transition' + transitionType + 'Timeout';\n  var enabledPropName = 'transition' + transitionType;\n\n  return function (props) {\n    // If the transition is enabled\n    if (props[enabledPropName]) {\n      // If no timeout duration is provided\n      if (props[timeoutPropName] == null) {\n        return new Error(timeoutPropName + ' wasn\\'t supplied to CSSTransitionGroup: ' + 'this can cause unreliable animations and won\\'t be supported in ' + 'a future version of React. See ' + 'https://fb.me/react-animation-transition-group-timeout for more ' + 'information.');\n\n        // If the duration isn't a number\n      } else if (typeof props[timeoutPropName] !== 'number') {\n        return new Error(timeoutPropName + ' must be a number (in milliseconds)');\n      }\n    }\n\n    return null;\n  };\n}\n\nvar nameShape = exports.nameShape = _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  leave: _propTypes2.default.string,\n  active: _propTypes2.default.string\n}), _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  enterActive: _propTypes2.default.string,\n  leave: _propTypes2.default.string,\n  leaveActive: _propTypes2.default.string,\n  appear: _propTypes2.default.string,\n  appearActive: _propTypes2.default.string\n})]);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/utils/PropTypes.js\n// module id = 499\n// module chunks = 0 1","import Backbone from 'backbone';\nimport _ from 'lodash';\n\nimport DataSet from './gl_data_set';\n\nexport default Backbone.Collection.extend({\n  url: '/api/v1/data_sets',\n  model: DataSet,\n\n  parse(resp) {\n    return resp.data_sets;\n  },\n\n  parseDataSetErrors(errors) {\n    return errors.reduce(function(result, err, index) {\n      const dataSetId = Object.keys(err)[0];\n      result[dataSetId] = {errors: err[dataSetId], order: index};\n      return result;\n    }, {});\n  },\n\n  sortFields: ['year', 'month', ['data_set_type', -1], 'updated'],\n\n  comparator(a, b) {\n    if (a.has('order') && b.has('order')) {\n      return a.get('order') - b.get('order');\n    }\n\n    const fields = this.sortFields;\n\n    for (let i = 0; i < fields.length; i++) {\n      let field = fields[i];\n      let direction: any = 1;\n      if (_.isArray(field)) {\n        direction = field[1];\n        field = field[0];\n      }\n\n      // Handles undefined as a sort attribute\n      const aval = a.get(field) || 0;\n\n      const bval = b.get(field) || 0;\n\n      if (aval < bval) {\n        return -1 * direction;\n      } else if (aval > bval) {\n        return 1 * direction;\n      }\n    }\n\n    return 0;\n  },\n\n  getChartOfAccountsIds() {\n    return _.uniq(this.pluck('coa_id'));\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/gl_data_sets.ts","import Backbone from 'backbone';\n\nexport default Backbone.Model.extend({\n  urlRoot: '/api/v1/entities',\n\n  defaults: {\n    color: {\n      index: 0\n    },\n    fiscal_year_start_date_formatted: 'July 01',\n    country: 'US',\n    entity_type: 'city'\n  },\n\n  toJSON() {\n    return this.omit('logo');\n  },\n\n  isGlobal() {\n    return this.id === 'controlpanel';\n  },\n\n  getRole() {\n    return this.id === 'controlpanel' ? 'admin' : 'user';\n  },\n\n  // Returns the name of the entity stripping off any prefixed text.\n  // Example: \"the city of Palo Alto\" becomes \"Palo Alto\".\n  getName() {\n    const name = this.get('name') || '';\n    return name.replace('the City of', '');\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/entity.ts","import Backbone from 'backbone';\nimport _ from 'lodash';\n\nimport ChartOfAccount from './chart_of_account';\n\nexport default Backbone.Collection.extend({\n  url: '/api/v1/chart_of_accounts',\n  model: ChartOfAccount,\n\n  parse(resp) {\n    return resp.chart_of_accounts;\n  },\n\n  filterWithDataSets() {\n    return this.filter(function(coa) {\n      return !_.isEmpty(coa.get('ledger_data_set_ids'));\n    });\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/chart_of_accounts.ts","module.exports = require('./lib/uuid-node');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/simply-uuid/index.js\n// module id = 503\n// module chunks = 0 1","import _ from 'lodash';\nimport Backbone from 'backbone';\n\nconst BreakdownModel = Backbone.Model.extend({\n  isAccountType() {\n    return this.get('isAccountType');\n  },\n\n  getTree(index) {\n    const trees = this.get('trees');\n    return trees && trees[index];\n  },\n\n  findTree(predicate, context) {\n    const trees = this.get('trees');\n    return trees && _.find(trees, predicate, context || this);\n  },\n\n  toHash() {\n    const trees = this.get('trees') || [];\n    if (trees.length > 1) {\n      return 'types';\n    } else {\n      return (_.head(trees) as any).get('long_id');\n    }\n  }\n});\n\nconst BreakdownCollection = Backbone.Collection.extend({\n  model: BreakdownModel,\n  sort_key: 'display_order',\n\n  comparator: function (item) {\n    return item.get('trees')[0].get(this.sort_key);\n  },\n\n  filterByValidAggregations(aggregations, suppressHidden) {\n    return this.filter(function(breakdown) {\n      if (suppressHidden && !breakdown.get('visible')) {\n        return false;\n      }\n      return breakdown.isAccountType() || _.every(breakdown.get('trees'), function(tree: any) {\n        return tree.valid_aggregations && _.some(aggregations, function(aggregation: any) {\n          return tree.valid_aggregations[aggregation];\n        });\n      });\n    });\n  },\n\n  // Find a breakdown by tree ID which can be in short or long form.\n  mapTreeId(treeId) {\n    if (!treeId) {\n      return treeId;\n    }\n\n    // Search for a breakdown with a tree having a matching short or long ID.\n    const breakdown = this.find(function(breakdown) {\n      return breakdown.findTree(function(tree) {\n        return tree.id === treeId || tree.get('long_id') === treeId;\n      });\n    });\n\n    // If no breakdown is found default to aggregating by account type.\n    return breakdown && breakdown.get('visible') ? breakdown.id : 'types';\n  },\n\n  findDefault() {\n    const deptBreakdown = this.findWhere({name: 'Departments'});\n    if (deptBreakdown) {\n      // Use the departments breakdown by default if one exists.\n      return deptBreakdown;\n    } else if (this.length > 1) {\n      // The next best department like tree will be ordered second.\n      return this.at(1);\n    } else {\n      // If all else fails just pick the first breakdown tree.\n      return this.first();\n    }\n  },\n});\n\nexport default {\n  Model: BreakdownModel,\n  Collection: BreakdownCollection\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/breakdown.ts","import Backbone from 'backbone';\nimport RecoverableModal from './views/recoverable_error';\nimport Breakdown from './models/breakdown';\nimport _ from 'lodash';\nimport SavedViewsStore from './stores/saved_views_store';\nimport SavedViewActions from './actions/saved_view_actions';\nimport SummaryReportActions from './actions/summary_report_actions';\n\nimport ogColors from './og_colors';\n\nexport default Backbone.Model.extend({\n  legendLimit: 8,\n  legendLimitStep: 8,\n\n  defaults: {\n    vsGraphType: 'line',\n    graph: 'stacked',\n    sortOrder: 'desc',\n    legendLimit: 8,\n    showAnnotations: false,\n    projections: false,\n    projectionType: 'auto_year_avg',\n    selectedDataSetIndex: null\n  },\n\n  // Mapping of state aliases to their real names.\n  // Useful for changing the name of a state without breaking legacy hashes.\n  stateAliases: {\n    graph: 'graphType'\n  },\n\n  initialize(options) {\n    const report = this.report = options.report;\n    const settings = report.get('properties');\n\n    this.recoverableErrorModal = new RecoverableModal({suppressRemoval: true});\n    this.set('graphType', report.graphType());\n    this.defaults.graphType = settings.graph || this.defaults.graph;\n    this.defaults.sortOrder = settings.sort_order || this.defaults.sortOrder;\n    this.defaults.selectedDataSetIndex = settings.selected_data_set_index || this.defaults.selectedDataSetIndex;\n    this.defaults.projections = settings.projections || this.defaults.projections;\n    this.defaults.projectionType = settings.projection_type || this.defaults.projectionType;\n    this.breakdowns = new Breakdown.Collection();\n    this.selectedDataSetIndex = null;\n\n    const color = options.entity.color ? options.entity.color.color : null;\n    if (color) {\n      this.color = parseInt(color.slice(1), 16);\n    } else {\n      this.color = 0;\n    }\n\n    this.on(\n      'change:legendSort change:graphType change:legendLimit change:selectedDataSetIndex',\n      _.partial(this.triggerRenderData, false),\n      this);\n  },\n\n  triggerRenderData(skipGraph) {\n    if (!this.pausedRendering) {\n      this.trigger('renderData', skipGraph);\n    }\n  },\n\n  pauseRendering() {\n    this.pausedRendering = true;\n  },\n\n  resumeRendering() {\n    this.pausedRendering = false;\n  },\n\n  selectionChange() {\n    if (!this.pausedRendering) {\n      this.trigger('change');\n      this.recoverableErrorModal.close();\n    }\n  },\n\n  initBudgetData(budgetData) {\n    this.pauseRendering();\n    this.budgetData = budgetData;\n\n    let visibleAccounts;\n    const product = this.report.get('technical_name');\n    const properties = this.report.get('properties');\n\n    if (product === 'balance') {\n      visibleAccounts = ['assets', 'liabilities'];\n\n    } else if (properties.ledger_types) {\n      visibleAccounts = properties.ledger_types;\n\n    } else {\n      visibleAccounts = ['revenues', 'expenses'];\n    }\n    this.breakdowns.reset(this.budgetData.breakdowns.filterByValidAggregations(visibleAccounts, true));\n    this.budgetData.setVisibleAccounts(visibleAccounts);\n    this.initSelectionState();\n\n    this.resumeRendering();\n\n    budgetData.on('selectionChange', _.partial(this.selectionChange, false), this);\n\n    budgetData.on('aggregation', function(aggregations) {\n      if (!aggregations.checked_nodes) {\n        this.set('selection', aggregations.selection);\n      }\n      this.resetMore();\n      this.triggerRenderData(aggregations.skipGraph);\n\n      _.defer(() => {\n        this.trigger('doneRendering');\n      });\n    }, this);\n\n    /**\n    * NOTE: Please be aware this function suppresses logs for reporting-classic-app on production env\n    */\n    this.budgetData.on('aggregation:error', function(error) {\n      const self = this;\n      if (error.requestResponse && error.requestResponse.status >= 400 && error.requestResponse.status < 500) {\n        this.recoverableErrorModal.open('Sorry that data is no longer available.', '', ['Explore Other Data']);\n        this.recoverableErrorModal.once('button:click', function() {\n          /*jshint validthis:true */\n          self.changeState({selection: null});\n          SummaryReportActions.getAggregations();\n          this.close();\n        });\n\n      } else {\n        this.recoverableErrorModal.open('Unable to request data from server.', 'Please try again in a moment.', ['Retry']);\n        this.recoverableErrorModal.once('button:click', function() {\n          /*jshint validthis:true */\n          budgetData.triggerSelectionChange();\n          this.close();\n        });\n        Raven.captureException(error);\n      }\n\n      this.recoverableErrorModal.once('close', function() {\n        // Clear any button click listeners when closing modal.\n        this.off('button:click');\n      });\n\n      if ((window as any).gon.env && (window as any).gon.env === 'development' && console.error) {\n        console.error(error);\n      }\n    }, this);\n  },\n\n  getLeafAccountCodeTreeMap() {\n    const product = this.get('product');\n    return this.budgetData.selectedLeafCodesByTree(product);\n  },\n\n  initSelectionState() {\n    const budgetData = this.budgetData;\n\n    this.initSorts(budgetData);\n  },\n\n  initSorts() {\n    this.treeSorts = {};\n    _.each(this.budgetData.trees, _.bind(function(tree) {\n      this.treeSorts[tree.id] = 'alpha';\n    }, this));\n    this.set('legendSort', this.defaults.sortOrder);\n  },\n\n  getTreeSort(tree) {\n    return this.treeSorts[tree];\n  },\n\n  setTreeSort(tree, sortMethod) {\n    const oldSortMethod = this.treeSorts[tree];\n    if (oldSortMethod !== sortMethod) {\n      this.treeSorts[tree] = sortMethod;\n      this.budgetData.sortTree(tree, sortMethod);\n      this.trigger('change:treeSort');\n    }\n  },\n\n\n  legendExpanded() {\n    return this.get('legendLimit') > this.legendLimit;\n  },\n\n  limitRenderedData(lines) {\n    lines = this.legendSortMethods.desc(lines);\n    this.moreLine = null;\n\n    const limit = this.get('legendLimit');\n\n    if (lines.length < limit + 4) {\n      return lines;\n    }\n\n    const moreLines = [];\n\n    while (lines.length > limit) {\n      moreLines.push(lines.pop());\n    }\n\n    this.moreLine = {\n      id: '_moreLine',\n      name: 'More (' + moreLines.length + ' grouped)',\n      childless: true,\n      amounts: _.map(moreLines[0].amounts, function(dataSet: { type }) {\n        return {\n          value: 0,\n          type: dataSet.type\n        };\n      }),\n      color: ogColors.moreColor,\n      types: moreLines[0].types,\n      lines: moreLines\n    };\n\n    let total = 0;\n    _.each(moreLines, _.bind(function(line) {\n      _.each(line.amounts, _.bind(function(amount, i) {\n        this.moreLine.amounts[i].value += amount.value;\n        total += amount.value;\n      }, this));\n    }, this));\n    this.moreLine.average = total / moreLines[0].amounts.length;\n\n    return lines;\n  },\n\n  expandMore() {\n    const limit = this.get('legendLimit');\n    this.set('legendLimit', limit + this.legendLimitStep);\n  },\n\n  collapseMore() {\n    const limit = this.get('legendLimit');\n    this.set('legendLimit', limit - this.legendLimitStep);\n  },\n\n  resetMore() {\n    this.set('legendLimit', this.legendLimit);\n  },\n\n  colorAssigner: function(lines) {\n    _.each(lines, _.bind(function(line) {\n      var node = this.budgetData.nodes[line.id];\n      if (node) {\n        if (!line.color) {\n          node.color = line.assignNextColor(this.color);\n        }\n      }\n    }, this));\n  },\n\n  /**\n  * this is called from:\n  * 1) summary_graph.update\n  * 2) summary_report_store.getRenderedData\n  * 3)\n  */\n  renderedData(reportState, fiscalYearStartMonth, isTable, limit, expanded) {\n    const sortMethod = this.get('legendSort');\n    const data = this.budgetData.renderedData(reportState, fiscalYearStartMonth, isTable, expanded);\n\n    if (data.lines.length) {\n\n      if (limit) {\n        data.lines = this.limitRenderedData(data.lines);\n      }\n\n      // for versusViews, we always need fixed order for parent nodes, so skipping sort for those\n      // in case of balanceSheet, assets should always be displayed above liabilities\n      // in case of revenuesVersusExpenses, revenues should always be displayed above expeneses\n      if (!reportState.get('versusView')) {\n        data.lines = this.legendSortMethods[sortMethod](data.lines);\n      }\n\n      this.colorAssigner(data.lines);\n\n      _.each(data.sublines, _.bind(function(sublines, key, holder) {\n        holder[key] = this.legendSortMethods[sortMethod](sublines);\n        this.colorAssigner(sublines);\n      }, this));\n\n      if (limit && this.moreLine) {\n        data.lines.push(this.moreLine);\n      }\n\n      if (expanded) {\n        const recursiveExpander = function(sublines, depth, line?, index?, group?) {\n          line.depth = depth;\n          // Help store the expansion markers while we're iterating over the expansion groups\n          line.expanded = !_.isEmpty(sublines[line.id]);\n          line.fixed = !!data.fixed[line.id];\n          line.lastExpanded = depth > 0 && index + 1 === group.length;\n          // return our line plus the expanded lines below this one\n          return [line].concat(_.map(sublines[line.id] || [], (...args) => recursiveExpander(sublines, depth + 1, ...args)));\n        };\n        data.expandedLines = _.map(data.lines, (...args) => recursiveExpander(data.sublines, 0, ...args));\n        data.lines = _.flattenDeep(data.expandedLines);\n      }\n    }\n\n    return data;\n  },\n\n  // Change the currently displayed product and state of Athena.\n  // The call comes from summary_report.Athena.renderPackage\n  // Options expects an optional hash.\n  changeProduct(product, options) {\n    options = options || {};\n\n    // Dismiss any error modals since they no longer apply once we change state.\n    this.recoverableErrorModal.close();\n\n    if (this.budgetData) {\n      let visibleAccounts;\n      if (product.technical_name === 'balance') {\n        visibleAccounts = ['assets', 'liabilities'];\n\n      } else if (product.properties.ledger_types) {\n        visibleAccounts = product.properties.ledger_types;\n\n      } else {\n        visibleAccounts = ['revenues', 'expenses', 'fteCount'];\n      }\n      this.breakdowns.reset(this.budgetData.breakdowns.filterByValidAggregations(visibleAccounts, true));\n      this.budgetData.setVisibleAccounts(visibleAccounts);\n    }\n\n    this.set('product', product);\n    this.changeState(options.hash);\n  },\n\n  /**\n  * this is called from this.changeProduct\n  * when URL params are updated, we call this method from summary_report.js Athena.updateParams\n  */\n  changeState(state, defaults) {\n    this.pauseRendering();\n    defaults = defaults || this.defaultState(this.get('product'));\n\n    const aliases = this.stateAliases;\n\n    // Convert aliased states to their real names.\n    state = _.reduce(state, function(result, value, key) {\n      result[aliases[key] || key] = value;\n      return result;\n    }, {});\n\n    // Fill in any missing parameters with a default value.\n    _.defaults(state, defaults);\n\n    if (state.selection) {\n      this.loadSelection(state.selection);\n    } else {\n      this.budgetData.defaultSelectionState();\n    }\n\n    if (state.saved_view) {\n      const view = SavedViewsStore.findViewById(parseInt(state.saved_view));\n      if (view) {\n        _.defer(() => {\n          SavedViewActions.selectView(view);\n        });\n      }\n    }\n\n    // If month is empty then use the most recent month.\n    // For example saved views do not capture the selected month.\n    // So when you load a saved view, the month value will be empty.\n    if (_.isEmpty(state.month)) {\n      state.month = this.budgetData.mostRecentMonthWithActuals();\n    }\n\n    if (!state.year) {\n      state.year = this.budgetData.mostRecentYearWithMonthlyActuals();\n    }\n\n    // this is a nesty fix for projections boolean coming from the URL, which is reflected as a String\n    state.projections = (state.projections === true || state.projections === 'true');\n\n    this.set(\n      _.pick(\n        state,\n        'graphType',\n        'month',\n        'legendSort',\n        'saved_view',\n        'year',\n        'selectedDataSetIndex',\n        'projections',\n        'projectionType'\n      )\n    );\n\n    this.resumeRendering();\n\n    if (this.budgetData) {\n      this.budgetData.triggerSelectionChange();\n    }\n  },\n\n  resetState() {\n    return this.changeState({}, this.defaultState(this.get('product')));\n  },\n\n  defaultState() {\n    const defaults = this.report.get('properties');\n    const state: any = {};\n\n    state.selection = defaults.selection;\n    state.graphType = defaults.graph || this.defaults.graphType;\n    state.legendSort = defaults.sort_order || this.defaults.sortOrder;\n    state.selectedDataSetIndex = defaults.selected_data_set_index || this.defaults.selectedDataSetIndex;\n    state.projections = defaults.projections || this.defaults.projections;\n    state.projectionType = defaults.projectionType || this.defaults.projectionType;\n    state.saved_view = defaults.saved_view;\n\n    if (defaults.fiscal_year_range) {\n      state.fiscal_start = defaults.fiscal_year_range.start;\n      state.fiscal_end = defaults.fiscal_year_range.end;\n    }\n\n    return state;\n  },\n\n  // Load a selection of data using a stable lookup key.\n  // The next aggregations request will use this key so\n  // the transparency server can figure out the correct set\n  // of checked nodes to use for aggregating line data.\n  loadSelection(selection) {\n    this.pendingSelection = selection;\n    this.set('selection', selection);\n  },\n\n  legendSortMethods: {\n    asc(lines) {\n      return _.sortBy(lines, 'average');\n    },\n\n    desc(lines) {\n      return _.sortBy(lines, 'average').reverse();\n    },\n\n    alpha(lines) {\n      return _.sortBy(lines, 'name');\n    },\n\n    coa(lines) {\n      return _.sortBy(lines, 'order');\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/athena_state.ts","import Handlebars from 'handlebars/runtime';\nimport _ from 'lodash';\nimport _s from 'underscore.string';\n\nimport strings from './strings';\nimport { assetPath } from './asset_helpers';\nimport JST from './templates';\n\nHandlebars.registerHelper('let', function(options) {\n  for (let prop in options.hash) {\n    this[prop] = options.hash[prop];\n  }\n});\n\nHandlebars.registerHelper('unless_eq', function(a, b, options) {\n  if (a !== b) {\n    return options.fn(this);\n  }\n});\n\nHandlebars.registerHelper('eq', function(a, b, options) {\n  if (a === b) {\n    return options.fn(this);\n  }\n});\n\nHandlebars.registerHelper('asset_path', function(asset) {\n  return assetPath(asset);\n});\n\nHandlebars.registerHelper('get', function() {\n  let key;\n  let value = arguments[0];\n  let i = 1;\n  let len = arguments.length - 1;\n\n  for (; i < len; ++i) {\n    key = arguments[i];\n\n    if (key < 0 && _.isArray(value)) {\n      key = value.length + key;\n    }\n\n    value = value[key];\n  }\n\n  return value;\n});\n\nHandlebars.registerHelper('currency', function(object) {\n  return '$' + _s.numberFormat(object, 2);\n});\n\nHandlebars.registerHelper('currencyNoDollars', function(object) {\n  return strings.currencyNoDollar(object);\n});\n\nHandlebars.registerHelper('percentage', function(object) {\n  return strings.percentage(object);\n});\n\nHandlebars.registerHelper('template', function(name, data_id) {\n  const id = (arguments.length > 2) ? name + '__' + data_id : name;\n\n  const templateId = id ? ' id=\"template-' + id + '\"' : '';\n  const templateContent = /*template ? template(this) :*/ '';\n  const placeHolderDiv = '<div' + templateId + '>' + templateContent + '</div>';\n\n  return new Handlebars.SafeString(placeHolderDiv);\n});\n\nHandlebars.registerHelper('render', function(name) {\n  const template = JST['athena/' + name];\n  return new Handlebars.SafeString(template(this));\n});\n\n// Iterator that wraps each item in an object with the following fields\n//    isLast\n//    isOdd\n//    data\nHandlebars.registerHelper('metaDataEach', function(items, options) {\n  const buffer = [];\n  const wrap: { isLast?: boolean, isOdd?: boolean, data? } = {};\n\n  for (let i = 0, len = items.length; i < len; ++i) {\n    wrap.isLast = (i === len - 1);\n    wrap.isOdd = (i % 2) !== 0;\n    wrap.data = items[i];\n\n    buffer.push(options.fn(wrap));\n  }\n\n  return buffer.join('');\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/handlebars_helpers.ts","'use strict';\n\nexports.__esModule = true;\nexports.HandlebarsEnvironment = HandlebarsEnvironment;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('./utils');\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _helpers = require('./helpers');\n\nvar _decorators = require('./decorators');\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar VERSION = '4.1.2';\nexports.VERSION = VERSION;\nvar COMPILER_REVISION = 7;\n\nexports.COMPILER_REVISION = COMPILER_REVISION;\nvar REVISION_CHANGES = {\n  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n  2: '== 1.0.0-rc.3',\n  3: '== 1.0.0-rc.4',\n  4: '== 1.x.x',\n  5: '== 2.0.0-alpha.x',\n  6: '>= 2.0.0-beta.1',\n  7: '>= 4.0.0'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials, decorators) {\n  this.helpers = helpers || {};\n  this.partials = partials || {};\n  this.decorators = decorators || {};\n\n  _helpers.registerDefaultHelpers(this);\n  _decorators.registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n  constructor: HandlebarsEnvironment,\n\n  logger: _logger2['default'],\n  log: _logger2['default'].log,\n\n  registerHelper: function registerHelper(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple helpers');\n      }\n      _utils.extend(this.helpers, name);\n    } else {\n      this.helpers[name] = fn;\n    }\n  },\n  unregisterHelper: function unregisterHelper(name) {\n    delete this.helpers[name];\n  },\n\n  registerPartial: function registerPartial(name, partial) {\n    if (_utils.toString.call(name) === objectType) {\n      _utils.extend(this.partials, name);\n    } else {\n      if (typeof partial === 'undefined') {\n        throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n      }\n      this.partials[name] = partial;\n    }\n  },\n  unregisterPartial: function unregisterPartial(name) {\n    delete this.partials[name];\n  },\n\n  registerDecorator: function registerDecorator(name, fn) {\n    if (_utils.toString.call(name) === objectType) {\n      if (fn) {\n        throw new _exception2['default']('Arg not supported with multiple decorators');\n      }\n      _utils.extend(this.decorators, name);\n    } else {\n      this.decorators[name] = fn;\n    }\n  },\n  unregisterDecorator: function unregisterDecorator(name) {\n    delete this.decorators[name];\n  }\n};\n\nvar log = _logger2['default'].log;\n\nexports.log = log;\nexports.createFrame = _utils.createFrame;\nexports.logger = _logger2['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4xLjInO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/base.js\n// module id = 507\n// module chunks = 0 1","var conversions = require(\"./conversions\");\n\nvar exports = {};\nmodule.exports = exports;\n\nfor (var func in conversions) {\n  // export rgb2hslRaw\n  exports[func + \"Raw\"] =  (function(func) {\n    // accept array or plain args\n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      return conversions[func](arg);\n    }\n  })(func);\n\n  var pair = /(\\w+)2(\\w+)/.exec(func),\n      from = pair[1],\n      to = pair[2];\n\n  // export rgb2hsl and [\"rgb\"][\"hsl\"]\n  exports[from] = exports[from] || {};\n\n  exports[from][to] = exports[func] = (function(func) { \n    return function(arg) {\n      if (typeof arg == \"number\")\n        arg = Array.prototype.slice.call(arguments);\n      \n      var val = conversions[func](arg);\n      if (typeof val == \"string\" || val === undefined)\n        return val; // keyword\n\n      for (var i = 0; i < val.length; i++)\n        val[i] = Math.round(val[i]);\n      return val;\n    }\n  })(func);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/color/node_modules/color-convert/index.js\n// module id = 508\n// module chunks = 0 1","import { fromJS } from 'immutable';\nimport _ from 'lodash';\n\nimport { MapTypes, bubbleColorTransform } from '../map_constants';\n\nconst { minBubbleRadius, maxBubbleRadius } = MapTypes.Bubble.configuration;\n\nexport const FeatureLayerTypes = [\n  MapTypes.Bubble.name,\n  MapTypes.Point.name\n];\n\nfunction mapStateToCircleColor(state) {\n  const colorMap = state.getIn(['map', 'legendColorMap']);\n  const colorProperty = state.getIn(['visualization', 'breakdown']);\n  const transform = state.getIn(['visualization', 'currentMapType']) === MapTypes.Bubble.name && bubbleColorTransform;\n\n  const colorStops = _.reduce(colorMap[colorProperty], (arr, color, label) => {\n    const colorForPoint = transform ? transform(color) : color;\n\n    return arr.concat([[label, colorForPoint]]);\n  }, []);\n\n  return {\n    property: colorProperty,\n    type: 'categorical',\n    stops: colorStops\n  };\n}\n\nconst LayerMapperMap = {\n  [MapTypes.Bubble.name]: state => fromJS({\n    id: 'feature-layer',\n    source: 'feature-source',\n    type: MapTypes.Bubble.layerType,\n    paint: {\n      'circle-radius': {\n        property: state.getIn(['visualization', 'mapAmountColumn']),\n        type: 'exponential',\n        base: 1,\n        stops: [\n          [{ zoom: 0, value: state.getIn(['map', 'dataStats', 'minAmount']) }, minBubbleRadius],\n          [{ zoom: 0, value: state.getIn(['map', 'dataStats', 'maxAmount']) }, maxBubbleRadius]\n        ]\n      },\n      'circle-blur': -0.8,\n      'circle-opacity': 1,\n      'circle-color': mapStateToCircleColor(state)\n    }\n  }),\n  [MapTypes.Point.name]: state => fromJS({\n    id: 'feature-layer',\n    source: 'feature-source',\n    type: MapTypes.Point.layerType,\n    paint: {\n      // this makes circles larger as the user zooms from zoom 9 to zoom 20\n      'circle-radius': {\n        'base': 1.75,\n        'stops': [\n          [9, 3],\n          [20, 90]\n        ]\n      },\n      'circle-opacity': 0.8,\n      'circle-color': mapStateToCircleColor(state)\n    }\n  })\n};\n\nexport function getLayerForMapType(mapType, state) {\n  const layerMapper = LayerMapperMap[mapType];\n  if (!layerMapper) {\n    return state;\n  }\n\n  return layerMapper(state);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/utils/layer_utils.ts","(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"moment\"], function (a0) {\n      return (root['DateRange'] = factory(a0));\n    });\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"moment\"));\n  } else {\n    root['DateRange'] = factory(moment);\n  }\n}(this, function (moment) {\n\n//-----------------------------------------------------------------------------\n// Contstants\n//-----------------------------------------------------------------------------\n\n\n\nvar INTERVALS = {\n  year:   true,\n  month:  true,\n  week:   true,\n  day:    true,\n  hour:   true,\n  minute: true,\n  second: true\n};\n\n\n//-----------------------------------------------------------------------------\n// Date Ranges\n//-----------------------------------------------------------------------------\n\n/**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {(Moment|Date)} start Start of interval\n * @param {(Moment|Date)} end End of interval\n *//**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {!Array} range Array containing start and end dates.\n *//**\n * DateRange class to store ranges and query dates.\n *\n * @constructor\n * @param {!String} range String formatted as an IS0 8601 time interval\n */\nfunction DateRange(start, end) {\n  var parts;\n  var s = start;\n  var e = end;\n\n  if (arguments.length === 1 || end === undefined) {\n    if (typeof start === 'object' && start.length === 2) {\n      s = start[0];\n      e = start[1];\n    }\n    else if (typeof start === 'string') {\n      parts = start.split('/');\n      s = parts[0];\n      e = parts[1];\n    }\n  }\n\n  this.start = (s === null) ? moment(-8640000000000000) : moment(s);\n  this.end   = (e === null) ? moment(8640000000000000) : moment(e);\n}\n\n/**\n * Constructor for prototype.\n *\n * @type {DateRange}\n */\nDateRange.prototype.constructor = DateRange;\n\n/**\n * Deep clone range.\n *\n * @return {!DateRange}\n */\nDateRange.prototype.clone = function() {\n  return moment().range(this.start, this.end);\n};\n\n/**\n * Determine if the current interval contains a given moment/date/range.\n *\n * @param {(Moment|Date|DateRange)} other Date to check\n * @param {!boolean} exclusive True if the to value is exclusive\n *\n * @return {!boolean}\n */\nDateRange.prototype.contains = function(other, exclusive) {\n  var start = this.start;\n  var end   = this.end;\n\n  if (other instanceof DateRange) {\n    return start <= other.start && (end > other.end || (end.isSame(other.end) && !exclusive));\n  }\n  else {\n    return start <= other && (end > other || (end.isSame(other) && !exclusive));\n  }\n};\n\n/**\n * Determine if the current date range overlaps a given date range.\n *\n * @param {!DateRange} range Date range to check\n *\n * @return {!boolean}\n */\nDateRange.prototype.overlaps = function(range) {\n  return this.intersect(range) !== null;\n};\n\n/**\n * Determine the intersecting periods from one or more date ranges.\n *\n * @param {!DateRange} other A date range to intersect with this one\n *\n * @return {DateRange} Returns the intersecting date or `null` if the ranges do\n *                     not intersect\n */\nDateRange.prototype.intersect = function(other) {\n  var start = this.start;\n  var end   = this.end;\n\n  if ((start <= other.start) && (other.start < end) && (end < other.end)) {\n    return new DateRange(other.start, end);\n  }\n  else if ((other.start < start) && (start < other.end) && (other.end <= end)) {\n    return new DateRange(start, other.end);\n  }\n  else if ((other.start < start) && (start <= end) && (end < other.end)) {\n    return this;\n  }\n  else if ((start <= other.start) && (other.start <= other.end) && (other.end <= end)) {\n    return other;\n  }\n\n  return null;\n};\n\n/**\n * Merge date ranges if they intersect.\n *\n * @param {!DateRange} other A date range to add to this one\n *\n * @return {DateRange} Returns the new `DateRange` or `null` if they do not\n *                     overlap\n */\nDateRange.prototype.add = function(other) {\n  if (this.overlaps(other)) {\n    return new DateRange(moment.min(this.start, other.start), moment.max(this.end, other.end));\n  }\n\n  return null;\n};\n\n/**\n * Subtract one range from another.\n *\n * @param {!DateRange} other A date range to substract from this one\n *\n * @return {!Array<DateRange>}\n */\nDateRange.prototype.subtract = function(other) {\n  var start = this.start;\n  var end   = this.end;\n\n  if (this.intersect(other) === null) {\n    return [this];\n  }\n  else if ((other.start <= start) && (start < end) && (end <= other.end)) {\n    return [];\n  }\n  else if ((other.start <= start) && (start < other.end) && (other.end < end)) {\n    return [new DateRange(other.end, end)];\n  }\n  else if ((start < other.start) && (other.start < end) && (end <= other.end)) {\n    return [new DateRange(start, other.start)];\n  }\n  else if ((start < other.start) && (other.start < other.end) && (other.end < end)) {\n    return [new DateRange(start, other.start), new DateRange(other.end, end)];\n  }\n  else if ((start < other.start) && (other.start < end) && (other.end < end)) {\n    return [new DateRange(start, other.start), new DateRange(other.start, end)];\n  }\n};\n\n/**\n * Build a n array of dates.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n *                                    shorthand string (shorthands:\n *                                    http://momentjs.com/docs/#/manipulating/add/)\n * @param {!boolean} exclusive Indicate that the end of the range should not\n *                             be included in the iter.\n *\n * @return {!Array}\n */\nDateRange.prototype.toArray = function(by, exclusive) {\n  var acc = [];\n  this.by(by, function(unit) {\n    acc.push(unit);\n  }, exclusive);\n  return acc;\n};\n\n/**\n * Iterate over the date range by a given date range, executing a function\n * for each sub-range.\n *\n * @param {(!DateRange|String)} range Date range to be used for iteration or\n *                                    shorthand string (shorthands:\n *                                    http://momentjs.com/docs/#/manipulating/add/)\n * @param {!DateRange~by} hollaback Callback\n * @param {!boolean} exclusive Indicate that the end of the range should not\n *                             be included in the iter.\n *\n * @return {DateRange} `this`\n */\nDateRange.prototype.by = function(range, hollaback, exclusive) {\n  if (typeof range === 'string') {\n    _byString.call(this, range, hollaback, exclusive);\n  }\n  else {\n    _byRange.call(this, range, hollaback, exclusive);\n  }\n  return this;\n};\n\n\n/**\n * Callback executed for each sub-range.\n *\n * @callback DateRange~by\n *\n * @param {!Moment} current Current moment object for iteration\n */\n\n/**\n * @private\n */\nfunction _byString(interval, hollaback, exclusive) {\n  var current = moment(this.start);\n\n  while (this.contains(current, exclusive)) {\n    hollaback.call(this, current.clone());\n    current.add(1, interval);\n  }\n}\n\n/**\n * @private\n */\nfunction _byRange(interval, hollaback, exclusive) {\n  var div = this / interval;\n  var l = Math.floor(div);\n\n  if (l === Infinity) { return; }\n  if (l === div && exclusive) {\n    l--;\n  }\n\n  for (var i = 0; i <= l; i++) {\n    hollaback.call(this, moment(this.start.valueOf() + interval.valueOf() * i));\n  }\n}\n\n/**\n * Date range formatted as an [ISO8601 Time\n * Interval](http://en.wikipedia.org/wiki/ISO_8601#Time_intervals).\n *\n * @return {!String}\n */\nDateRange.prototype.toString = function() {\n  return this.start.format() + '/' + this.end.format();\n};\n\n/**\n * Date range in milliseconds. Allows basic coercion math of date ranges.\n *\n * @return {!number}\n */\nDateRange.prototype.valueOf = function() {\n  return this.end - this.start;\n};\n\n/**\n * Center date of the range.\n *\n * @return {!Moment}\n */\nDateRange.prototype.center = function() {\n  var center = this.start + this.diff() / 2;\n  return moment(center);\n};\n\n/**\n * Date range toDate\n *\n * @return {!Array<Date>}\n */\nDateRange.prototype.toDate = function() {\n  return [this.start.toDate(), this.end.toDate()];\n};\n\n/**\n * Determine if this date range is the same as another.\n *\n * @param {!DateRange} other Another date range to compare to\n *\n * @return {!boolean}\n */\nDateRange.prototype.isSame = function(other) {\n  return this.start.isSame(other.start) && this.end.isSame(other.end);\n};\n\n/**\n * The difference of the end vs start.\n *\n * @param {number} unit Unit of difference, if no unit is passed in\n *                      milliseconds are returned. E.g.: `\"days\"`, `\"months\"`,\n *                      etc...\n *\n * @return {!number}\n */\nDateRange.prototype.diff = function(unit) {\n  return this.end.diff(this.start, unit);\n};\n\n\n//-----------------------------------------------------------------------------\n// Moment Extensions\n//-----------------------------------------------------------------------------\n\n/**\n * Build a date range.\n *\n * @param {(Moment|Date)} start Start of range\n * @param {(Moment|Date)} end End of range\n *\n * @this {Moment}\n *\n * @return {!DateRange}\n */\nmoment.range = function(start, end) {\n  if (start in INTERVALS) {\n    return new DateRange(moment(this).startOf(start), moment(this).endOf(start));\n  }\n  else {\n    return new DateRange(start, end);\n  }\n};\n\n/**\n * Expose constructor\n *\n * @const\n */\nmoment.range.constructor = DateRange;\n\n/**\n * @deprecated\n */\nmoment.fn.range = moment.range;\n\n/**\n * Check if the current moment is within a given date range.\n *\n * @param {!DateRange} range Date range to check\n *\n * @this {Moment}\n *\n * @return {!boolean}\n */\nmoment.fn.within = function(range) {\n  return range.contains(this._d);\n};\n\n\n//-----------------------------------------------------------------------------\n// Export\n//-----------------------------------------------------------------------------\n\n\n\nreturn DateRange;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment-range/dist/moment-range.js\n// module id = 510\n// module chunks = 0 1","import Immutable from 'immutable';\nimport { ImmutableStore } from '@opengov/og_flux';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport * as InviteActions from '../actions/invite_actions';\nimport _ from 'lodash';\nimport { filterItems } from '../utils/search_utils';\n\nexport function isCurrentUserOwner(state) {\n  const sessionId = SessionStore.getSession().get('id');\n  const reportOwner = state.get('reportOwner');\n  return reportOwner.get('id') === sessionId;\n}\n\nconst InvitesStore = new ImmutableStore({\n  getInitialState() {\n    return Immutable.fromJS({\n      inviteeSearchQuery: '',\n      currentInvitedUsers: Immutable.List(),\n      currentUser: Immutable.Map(),\n      error: null,\n      invitableUsersById: Immutable.OrderedMap(),\n      invitedUsers: Immutable.OrderedSet(),\n      messageUsers: Immutable.OrderedSet(),\n      reportRoles: Immutable.OrderedMap(),\n      userReportRoles: Immutable.OrderedMap(),\n      pendingUser: null,\n      activePanel: 'message',\n      message: '',\n      isNotificationOpen: false,\n      userPreferences: null,\n      isLoadingUsers: true,\n      reportOwner: Immutable.Map()\n    });\n  },\n\n  actions: {\n    INVITABLE_USERS_LOADED(state, { users }) {\n      let usersById = users.reduce((map, user) => {\n        return map.set(user.id, Immutable.fromJS(user));\n      }, Immutable.OrderedMap());\n\n      let initialMessageUsers = [];\n\n      if (isCurrentUserOwner(state)) {\n        const reportOwner = state.get('reportOwner');\n        initialMessageUsers.push(reportOwner);\n        state = state.set('currentUser', reportOwner);\n      } else {\n        state = state.set('currentUser', Immutable.Map());\n      }\n\n      return state\n        .set('invitableUsersById', usersById)\n        .set('isLoadingUsers', false)\n        .set('messageUsers', Immutable.OrderedSet(initialMessageUsers));\n    },\n\n    INVITED_USERS_LOADED(state, { invites }) {\n      const userReportRoles = invites.reduce((map, invite) => {\n        return map.set(invite.id, Immutable.fromJS({ userId: invite.id, role: invite.role }));\n      }, Immutable.OrderedMap());\n\n      const userIds = userReportRoles.keySeq().toJSON();\n\n      return state\n        .set('userReportRoles', Immutable.OrderedMap(userReportRoles))\n        .set('invitedUsers', Immutable.OrderedSet(userIds))\n        .set('currentInvitedUsers', Immutable.List(Immutable.fromJS(invites)));\n    },\n\n    REPORT_ROLES_LOADED(state, { report_roles }) {\n      return state.set('reportRoles', Immutable.fromJS(report_roles));\n    },\n\n    REPORT_INVITE_ROLE_UPDATED(state, { invite }) {\n      return state\n        .updateIn(['userReportRoles', invite.id], item => item.set('role', invite.role));\n    },\n\n    REPORT_ADD_USER_ERROR(state, { errorType } ) {\n      return state\n        .set('pendingUser', null)\n        .set('error', errorType);\n    },\n\n    REPORT_UPDATE_ROLE_ERROR(state, {errorType} ) {\n      return state.set('error', errorType);\n    },\n\n    REPORT_INVITE_DISMISS_ERROR(state) {\n      return state.set('error', null);\n    },\n\n    UPDATE_INVITEE_SEARCH_QUERY(state, { query }) {\n      return state.set('inviteeSearchQuery', query);\n    },\n\n    SET_USER_PREFERENCES(state, { userPreferences }) {\n      return state.set('userPreferences', userPreferences);\n    },\n\n    ADD_USER_TO_MESSAGE_USERS(state, { user }) {\n      return state\n        .update('messageUsers', (users) => users.add(user))\n        .set('inviteeSearchQuery', '');\n    },\n\n    ADD_ALL_USERS_TO_MESSAGE_USERS(state) {\n      return state\n        .set('messageUsers',\n          state.get('currentInvitedUsers').toSeq().toOrderedSet()\n            .add(state.get('reportOwner'))\n        )\n        .set('inviteeSearchQuery', '');\n    },\n\n    REMOVE_USER_FROM_MESSAGE_USERS(state, { user }) {\n      return state.update('messageUsers', (users) => users.delete(user));\n    },\n\n    ADDING_USER_TO_INVITES(state, { user }) {\n      return state\n        .set('inviteeSearchQuery', '')\n        .set('pendingUser', user);\n    },\n\n    ADD_USER_TO_INVITES(state, { user }) {\n      const userId = user.get('id');\n      const role = user.get('role');\n\n      return state\n        .update('invitedUsers', (users) => users.add(userId))\n        .set('pendingUser', null)\n        .setIn(['userReportRoles', userId], Immutable.fromJS({ role }))\n        .set('inviteeSearchQuery', '')\n        .update('currentInvitedUsers', (users) => users.push(user));\n    },\n\n    REMOVE_USER_FROM_INVITES(state, { user }) {\n      return state\n        .update('invitedUsers', (users) => users.remove(user.get('id')))\n        .update('currentInvitedUsers', (users) => users.filter(eachUser => eachUser.get('id') !== user.get('id')));\n    },\n\n    REPORT_HEADER_SET_SHARE_PANEL(state, { panel }) {\n      return state.set('activePanel', panel);\n    },\n\n    REPORT_SHARE_UPDATE_MESSAGE(state, { message }) {\n      return state.set('message', message);\n    },\n\n    REPORT_SHARE_SHOW_SENDING(state) {\n      return state.set('isSendingMessage', true);\n    },\n\n    REPORT_SHARE_HIDE_SENDING(state) {\n      return state.set('isSendingMessage', false);\n    },\n\n    REPORT_SHARE_RESET(state) {\n      let messageUsers = [];\n\n      if (isCurrentUserOwner(state)) {\n        const reportOwner = state.get('reportOwner');\n        messageUsers.push(reportOwner);\n      }\n\n      return state\n        .set('isSendingMessage', false)\n        .set('messageUsers', Immutable.OrderedSet(messageUsers))\n        .set('message', '');\n    },\n\n    REPORT_SHARE_OPEN_NOTIFICATION(state) {\n      return state.set('isNotificationOpen', true);\n    },\n\n    REPORT_SHARE_CLOSE_NOTIFICATION(state) {\n      return state.set('isNotificationOpen', false);\n    },\n\n    SAVED_VIEW_CREATE_SUCCESS() {\n      return InviteActions.openNotification();\n    },\n\n    REPORT_LOADED(state, { report }) {\n      const reportOwner = report.get('owner');\n      reportOwner.full_name += ' (You)';\n      return state.set('reportOwner', Immutable.fromJS(reportOwner));\n    }\n  },\n\n  getSearchResults() {\n    const users = this.getState().get('invitableUsersById');\n    const query = this.getState().get('inviteeSearchQuery');\n\n    const userArray = _.map(users.toJS(), u => u);\n    const filteredUsers = filterItems(userArray, ['first_name', 'last_name', 'email'], query);\n\n    return Immutable.fromJS(filteredUsers).valueSeq();\n  },\n\n  getInviteError() {\n    return this.getState().get('error');\n  },\n\n  getReportRoles() {\n    return this.getState().get('reportRoles');\n  },\n\n  getPendingUser() {\n    return this.getState().get('pendingUser');\n  },\n\n  getInvitedUsers() {\n    const userIds = this.getState().get('invitedUsers');\n    const users = this.getState().get('invitableUsersById');\n    const userReportRoles = this.getState().get('userReportRoles');\n    if (users.isEmpty()) {\n      return Immutable.OrderedSet();\n    }\n\n    return userIds.map((id) => users.get(id) ? users.get(id).set('reportRole', userReportRoles.get(id).get('role')) : null ).filter(id => id !== null);\n  },\n\n  getCurrentInvitedUsers() {\n    return this.getState().get('currentInvitedUsers');\n  },\n\n  getCurrentUser() {\n    return this.getState().get('currentUser');\n  },\n\n  getIsLoadingUsers() {\n    return this.getState().get('isLoadingUsers');\n  },\n\n  getMessage() {\n    return this.getState().get('message');\n  },\n\n  getMessageUsers() {\n    return this.getState().get('messageUsers');\n  },\n\n  getIsSendingMessage() {\n    return this.getState().get('isSendingMessage');\n  },\n\n  getUserPreferences() {\n    return this.getState().get('userPreferences');\n  },\n\n  getIsNotificationOpen() {\n    return this.getState().get('isNotificationOpen');\n  }\n});\n\nexport default InvitesStore;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/invites_store.ts","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar vizColorValueOrder = exports.vizColorValueOrder = {\n  300: [300, 700, 400, 800, 200, 600, 100, 500, 900],\n  400: [400, 600, 300, 800, 100, 700, 200, 500, 900],\n  500: [500, 100, 800, 200, 700, 300, 600, 900, 400],\n  600: [600, 200, 800, 300, 700, 100, 400, 900, 500]\n};\n\nvar vizColorHueOrder = exports.vizColorHueOrder = [\"opengov\", \"periwinkle\", \"orange\", \"yellow\", \"violet\", \"purple\", \"teal\", \"jade\", \"royal\", \"indigo\", \"ruby\", \"port\", \"cerulean\", \"turquoise\", \"red\", \"terracotta\", \"sage\", \"pear\", \"magenta\", \"rose\"];\n\nvar vizColor_hoverOpacity = exports.vizColor_hoverOpacity = 0.25;\nvar vizColor_hoverfilter = exports.vizColor_hoverfilter = \"grayscale(80%)\";\n\nvar vizColors = exports.vizColors = {\n  pear: {\n    50: \"#EBFFEE\",\n    100: \"#D7FADD\",\n    200: \"#B9EBC2\",\n    300: \"#9AD9A4\",\n    400: \"#77C785\",\n    500: \"#53B062\",\n    600: \"#3C964B\",\n    700: \"#257D34\",\n    800: \"#1A5924\",\n    900: \"#083B11\",\n    1000: \"#012608\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"magenta\"\n  },\n  sage: {\n    50: \"#EDFAF2\",\n    100: \"#DDF0E4\",\n    200: \"#C3E3D0\",\n    300: \"#A3D1B5\",\n    400: \"#88C29F\",\n    500: \"#74B28D\",\n    600: \"#549970\",\n    700: \"#3E7D57\",\n    800: \"#2E5C40\",\n    900: \"#20402D\",\n    1000: \"#172E20\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"rose\"\n  },\n  jade: {\n    50: \"#EBFCF7\",\n    100: \"#CBF5E8\",\n    200: \"#ADE0D0\",\n    300: \"#7CCFB4\",\n    400: \"#56BA9A\",\n    500: \"#2FA882\",\n    600: \"#1E8F6B\",\n    700: \"#147556\",\n    800: \"#0C573F\",\n    900: \"#033827\",\n    1000: \"#002418\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"ruby\"\n  },\n  teal: {\n    50: \"#EBF7F6\",\n    100: \"#D3F0ED\",\n    200: \"#B8E0DC\",\n    300: \"#9BD1CC\",\n    400: \"#79C9C1\",\n    500: \"#57B5AC\",\n    600: \"#3D9990\",\n    700: \"#2E8077\",\n    800: \"#21665E\",\n    900: \"#13453F\",\n    1000: \"#0A2925\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"jade\"\n  },\n  turquoise: {\n    50: \"#EBFCFC\",\n    100: \"#CEF3F5\",\n    200: \"#AEE4E5\",\n    300: \"#8BD4D6\",\n    400: \"#6DBFC2\",\n    500: \"#45AAAD\",\n    600: \"#299094\",\n    700: \"#1D7578\",\n    800: \"#0F595C\",\n    900: \"#033B3D\",\n    1000: \"#002021\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"red\"\n  },\n  cerulean: {\n    50: \"#E8F5FA\",\n    100: \"#D0EAF5\",\n    200: \"#B1D7E5\",\n    300: \"#97CADE\",\n    400: \"#7CBED9\",\n    500: \"#5FABC9\",\n    600: \"#4692B0\",\n    700: \"#367791\",\n    800: \"#275D73\",\n    900: \"#164152\",\n    1000: \"#0B242E\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"terracotta\"\n  },\n  opengov: {\n    50: \"#F0F7FF\",\n    100: \"#D9EBFF\",\n    200: \"#B4D6FA\",\n    300: \"#91C0F2\",\n    400: \"#75AEEB\",\n    500: \"#5B98D9\",\n    600: \"#4781BF\",\n    700: \"#2E6299\",\n    800: \"#1D4673\",\n    900: \"#0F2D4D\",\n    1000: \"#001933\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"yellow\"\n  },\n  periwinkle: {\n    50: \"#EBF0F7\",\n    100: \"#D8E1F0\",\n    200: \"#BED0ED\",\n    300: \"#A1BBE5\",\n    400: \"#82A3D9\",\n    500: \"#6A92D4\",\n    600: \"#5079BA\",\n    700: \"#3D6099\",\n    800: \"#2E4873\",\n    900: \"#1D3254\",\n    1000: \"#0C1E3B\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"orange\"\n  },\n  royal: {\n    50: \"#EDF0FF\",\n    100: \"#E0E6FF\",\n    200: \"#BDC9FF\",\n    300: \"#9DADF5\",\n    400: \"#7D90E3\",\n    500: \"#6579CF\",\n    600: \"#4C5FB5\",\n    700: \"#324494\",\n    800: \"#1C2A6B\",\n    900: \"#0D1A52\",\n    1000: \"#040D36\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"port\"\n  },\n  indigo: {\n    50: \"#EDEEFA\",\n    100: \"#E1E2F5\",\n    200: \"#CCCEF0\",\n    300: \"#B1B4DE\",\n    400: \"#979ACC\",\n    500: \"#797CB8\",\n    600: \"#5C5F99\",\n    700: \"#484B85\",\n    800: \"#3A3C6B\",\n    900: \"#292B4C\",\n    1000: \"#10112E\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"ruby\"\n  },\n  violet: {\n    50: \"#EFEBFF\",\n    100: \"#E6DEFF\",\n    200: \"#D4C8FA\",\n    300: \"#C0B1F2\",\n    400: \"#A492E0\",\n    500: \"#8D7ACC\",\n    600: \"#6F5DA8\",\n    700: \"#54438A\",\n    800: \"#3E2E73\",\n    900: \"#241554\",\n    1000: \"#110538\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"jade\"\n  },\n  purple: {\n    50: \"#F5EBFA\",\n    100: \"#ECD7F5\",\n    200: \"#E5C7F2\",\n    300: \"#CDABDB\",\n    400: \"#B38FC2\",\n    500: \"#A07BB0\",\n    600: \"#885F99\",\n    700: \"#6B477A\",\n    800: \"#543461\",\n    900: \"#3B2445\",\n    1000: \"#231429\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"teal\"\n  },\n  magenta: {\n    50: \"#FFE5F4\",\n    100: \"#FFCCE9\",\n    200: \"#F2B6D8\",\n    300: \"#E096C0\",\n    400: \"#C476A2\",\n    500: \"#B55E8F\",\n    600: \"#9C4174\",\n    700: \"#802458\",\n    800: \"#630F3F\",\n    900: \"#47062B\",\n    1000: \"#2E001A\",\n    data: 600,\n    highlight: 50,\n    nextHue: \"periwinkle\"\n  },\n  rose: {\n    50: \"#FAEBEF\",\n    100: \"#FAD4DE\",\n    200: \"#EDBECA\",\n    300: \"#E09DAF\",\n    400: \"#CF7C92\",\n    500: \"#BD5E78\",\n    600: \"#9E465D\",\n    700: \"#7D3347\",\n    800: \"#632938\",\n    900: \"#4A1E2A\",\n    1000: \"#30141B\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"opengov\"\n  },\n  ruby: {\n    50: \"#FFE5E8\",\n    100: \"#FFD4D9\",\n    200: \"#FABBC2\",\n    300: \"#ED9AA2\",\n    400: \"#DE7882\",\n    500: \"#CC5E69\",\n    600: \"#B24954\",\n    700: \"#992F3A\",\n    800: \"#801B25\",\n    900: \"#660B14\",\n    1000: \"#4C0108\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"turquoise\"\n  },\n  port: {\n    50: \"#FFEBEB\",\n    100: \"#FFD5D4\",\n    200: \"#FABBB9\",\n    300: \"#EDA19F\",\n    400: \"#D98784\",\n    500: \"#C76E6B\",\n    600: \"#B85854\",\n    700: \"#994946\",\n    800: \"#783937\",\n    900: \"#5C2C2A\",\n    1000: \"#401E1D\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"cerulean\"\n  },\n  red: {\n    50: \"#FFECE8\",\n    100: \"#FFDAD1\",\n    200: \"#FABDAF\",\n    300: \"#F59D89\",\n    400: \"#E87E66\",\n    500: \"#E0694F\",\n    600: \"#D15336\",\n    700: \"#B23E24\",\n    800: \"#942A12\",\n    900: \"#6B1C0B\",\n    1000: \"#4C0E00\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"pear\"\n  },\n  terracotta: {\n    50: \"#FFEDE5\",\n    100: \"#FFDBCC\",\n    200: \"#FAC4AC\",\n    300: \"#F5A482\",\n    400: \"#ED8A5F\",\n    500: \"#E07446\",\n    600: \"#D16B3F\",\n    700: \"#B85830\",\n    800: \"#9C441F\",\n    900: \"#802F0D\",\n    1000: \"#662408\",\n    data: 300,\n    highlight: 50,\n    nextHue: \"sage\"\n  },\n  orange: {\n    50: \"#FFEEDB\",\n    100: \"#FFE0BD\",\n    200: \"#FFCF99\",\n    300: \"#FABD78\",\n    400: \"#F0AB5D\",\n    500: \"#E59539\",\n    600: \"#DB831F\",\n    700: \"#C77110\",\n    800: \"#B06209\",\n    900: \"#995303\",\n    1000: \"#703C00\",\n    data: 500,\n    highlight: 50,\n    nextHue: \"purple\"\n  },\n  yellow: {\n    50: \"#FFFAED\",\n    100: \"#FFF3D4\",\n    200: \"#FCE9B8\",\n    300: \"#F0DBA8\",\n    400: \"#E8CE8B\",\n    500: \"#E3C476\",\n    600: \"#D9B55B\",\n    700: \"#BF9E49\",\n    800: \"#B29240\",\n    900: \"#8F773B\",\n    1000: \"#756233\",\n    data: 400,\n    highlight: 50,\n    nextHue: \"violet\"\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/capital-style/dist/tokens.js\n// module id = 512\n// module chunks = 0 1","import _ from 'lodash';\n//Creates the footer class with isEditingDefaultState\nexport const spliceKeywords = (updateStateKeywords, deletedKeywords, keyword, reportId, action) => {\n  if (_.includes(deletedKeywords, keyword)) {\n    const index = deletedKeywords.indexOf(keyword);\n    deletedKeywords.splice(index, 1);\n    updateStateKeywords(deletedKeywords, reportId, action);\n  }\n};\n\nexport const concatKeywords = (updateStateKeywords, assignedKeywords, keyword, reportId, action) => {\n  if (!_.includes(assignedKeywords, keyword)) {\n    const updated = (assignedKeywords).concat([keyword]);\n    updateStateKeywords(updated, reportId, action);\n  }\n};\n\nexport const getUpdatedKeywords = (reportId, assignedKeywords, addedKeywordsReportState, deletedKeywordsReportState) => {\n  let updatedKeywords = assignedKeywords;\n  if (addedKeywordsReportState.reportId === reportId) {\n    updatedKeywords = _.uniq(addedKeywordsReportState.keywords);\n  }\n  if (deletedKeywordsReportState.reportId === reportId) {\n    updatedKeywords = _.difference(updatedKeywords, deletedKeywordsReportState.keywords);\n  }\n\n  return updatedKeywords;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_keywords/report_keywords_utils.tsx","export * from './src';\nexport * from 'ldclient-js';\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/launchdarkly/index.ts","function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var base64=createCommonjsModule(function(e,t){!function(){var e=t,n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";function r(e){this.message=e}r.prototype=new Error,r.prototype.name=\"InvalidCharacterError\",e.btoa||(e.btoa=function(e){for(var t,o,a=String(e),i=0,s=n,c=\"\";a.charAt(0|i)||(s=\"=\",i%1);c+=s.charAt(63&t>>8-i%1*8)){if((o=a.charCodeAt(i+=.75))>255)throw new r(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\");t=t<<8|o}return c}),e.atob||(e.atob=function(e){var t=String(e).replace(/[=]+$/,\"\");if(t.length%4==1)throw new r(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var o,a,i=0,s=0,c=\"\";a=t.charAt(s++);~a&&(o=i%4?64*o+a:a,i++%4)?c+=String.fromCharCode(255&o>>(-2*i&6)):0)a=n.indexOf(a);return c})}()}),_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};function btoa(e){return base64.btoa(unescape(encodeURIComponent(e)))}function base64URLEncode(e){return btoa(e).replace(/=/g,\"\").replace(/\\+/g,\"-\").replace(/\\//g,\"_\")}function clone(e){return JSON.parse(JSON.stringify(e))}function onNextTick(e){setTimeout(e,0)}function wrapPromiseCallback(e,t){var n=e.then(function(e){return t&&setTimeout(function(){t(null,e)},0),e},function(e){if(!t)return Promise.reject(e);setTimeout(function(){t(e,null)},0)});return t?void 0:n}function transformValuesToVersionedValues(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]={value:e[n],version:0});return t}function chunkUserEventsForUrl(e,t){for(var n=t.slice(0),r=[],o=e,a=void 0;n.length>0;){for(a=[];o>0;){var i=n.shift();if(!i)break;(o-=base64URLEncode(JSON.stringify(i)).length)<0&&a.length>0?n.unshift(i):a.push(i)}o=e,r.push(a)}return r}function getLDUserAgentString(){return\"JSClient/2.4.0\"}function addLDHeaders(e){e.setRequestHeader(\"X-LaunchDarkly-User-Agent\",getLDUserAgentString())}function extend(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce(function(e,t){return _extends({},e,t)},{})}var MAX_URL_LENGTH=2e3;function EventSender(e,t,n,r){var o=void 0,a=e+\"/events/bulk/\"+t,i=e+\"/a/\"+t+\".gif\",s={};function c(e,t){var n=new Image;t&&n.addEventListener(\"load\",t),n.src=e}function u(e,t,n){var o=r||c,s=function(r){if(t){var s=new XMLHttpRequest;s.open(\"POST\",a,!n),addLDHeaders(s),s.setRequestHeader(\"Content-Type\",\"application/json\"),s.setRequestHeader(\"X-LaunchDarkly-Event-Schema\",\"3\"),n||s.addEventListener(\"load\",function(){r(function(e){var t={status:e.status},n=e.getResponseHeader(\"Date\");if(n){var r=Date.parse(n);r&&(t.serverTime=r)}return t}(s))}),s.send(JSON.stringify(e))}else{var c=i+\"?d=\"+base64URLEncode(JSON.stringify(e));o(c,n?null:r)}};if(!n)return new Promise(function(e){s(e)});s()}return s.sendEvents=function(t,r){void 0===o&&(o=void 0===n?\"withCredentials\"in new XMLHttpRequest:n);var a=void 0!==r&&r,i=void 0;i=o?[t]:chunkUserEventsForUrl(MAX_URL_LENGTH-e.length,t);for(var s=[],c=0;c<i.length;c++)s.push(u(i[c],o,a));return r?Promise.resolve():Promise.all(s)},s}function EventSummarizer(){var e={},t=0,n=0,r={};return e.summarizeEvent=function(e){if(\"feature\"===e.kind){var o=e.key+\":\"+(null!==e.variation&&void 0!==e.variation?e.variation:\"\")+\":\"+(null!==e.version&&void 0!==e.version?e.version:\"\"),a=r[o];a?a.count=a.count+1:r[o]={count:1,key:e.key,variation:e.variation,version:e.version,value:e.value,default:e.default},(0===t||e.creationDate<t)&&(t=e.creationDate),e.creationDate>n&&(n=e.creationDate)}},e.getSummary=function(){var e={},o=!0;for(var a in r){var i=r[a],s=e[i.key];s||(s={default:i.default,counters:[]},e[i.key]=s);var c={value:i.value,count:i.count};void 0!==i.variation&&null!==i.variation&&(c.variation=i.variation),i.version?c.version=i.version:c.unknown=!0,s.counters.push(c),o=!1}return o?null:{startDate:t,endDate:n,features:e}},e.clearSummary=function(){t=0,n=0,r={}},e}var docLink=\" Please see https://docs.launchdarkly.com/docs/js-sdk-reference#section-initializing-the-client for instructions on SDK initialization.\",localStorageUnavailable=function(){return\"localStorage is unavailable\"},unknownCustomEventKey=function(e){return'Custom event \"'+e+'\" does not exist'},environmentNotFound=function(){return\"environment not found.\"+docLink},environmentNotSpecified=function(){return\"No environment specified.\"+docLink},errorFetchingFlags=function(e){return\"Error fetching flag settings: \"+(e.message||e)},userNotSpecified=function(){return\"No user specified.\"+docLink},invalidUser=function(){return\"Invalid user specified.\"+docLink},deprecated=function(e,t){return'[LaunchDarkly] \"'+e+'\" is deprecated, please use \"'+t+'\"'},httpErrorMessage=function(e,t,n){return\"Received error \"+e+(401===e?\" (invalid SDK key)\":\"\")+\" for \"+t+\" - \"+(errors.isHttpErrorRecoverable(e)?n:\"giving up permanently\")};function UserFilter(e){var t={},n=void 0!==e.allAttributesPrivate?e.allAttributesPrivate:e.all_attributes_private,r=(void 0!==e.privateAttributeNames?e.privateAttributeNames:e.private_attribute_names)||[],o={key:!0,custom:!0,anonymous:!0},a={key:!0,secondary:!0,ip:!0,country:!0,email:!0,firstName:!0,lastName:!0,avatar:!0,name:!0,anonymous:!0,custom:!0};return void 0!==e.all_attributes_private&&console&&console.warn&&console.warn(deprecated(\"all_attributes_private\",\"allAttributesPrivate\")),void 0!==e.private_attribute_names&&console&&console.warn&&console.warn(deprecated(\"private_attribute_names\",\"privateAttributeNames\")),t.filterUser=function(e){if(!e)return null;var t=e.privateAttributeNames||[],i=function(e,a){return Object.keys(e).reduce(function(i,s){var c=i;return a(s)&&(!function(e){return!o[e]&&(n||-1!==t.indexOf(e)||-1!==r.indexOf(e))}(s)?c[0][s]=e[s]:c[1][s]=!0),c},[{},{}])},s=i(e,function(e){return a[e]}),c=s[0],u=s[1];if(e.custom){var l=i(e.custom,function(){return!0});c.custom=l[0],u=extend({},u,l[1])}var v=Object.keys(u);return v.length&&(v.sort(),c.privateAttrs=v),c},t}function createCustomError(e){function t(e,t){Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.message=e,this.code=t}return t.prototype=new Error,t.prototype.name=e,t.prototype.constructor=t,t}var LDUnexpectedResponseError=createCustomError(\"LaunchDarklyUnexpectedResponseError\"),LDInvalidEnvironmentIdError=createCustomError(\"LaunchDarklyInvalidEnvironmentIdError\"),LDInvalidUserError=createCustomError(\"LaunchDarklyInvalidUserError\"),LDInvalidEventKeyError=createCustomError(\"LaunchDarklyInvalidEventKeyError\"),LDInvalidArgumentError=createCustomError(\"LaunchDarklyInvalidArgumentError\"),LDFlagFetchError=createCustomError(\"LaunchDarklyFlagFetchError\");function isHttpErrorRecoverable(e){return!(e>=400&&e<500)||(408===e||429===e)}function EventProcessor(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o={},a=(arguments.length>4&&void 0!==arguments[4]?arguments[4]:null)||EventSender(e,t),i=EventSummarizer(),s=UserFilter(n),c=!!n.inlineUsersInEvents,u=[],l=void 0,v=void 0,d=0,f=!1,p=void 0;function g(e){onNextTick(function(){r&&r.maybeReportError(new LDInvalidArgumentError(e))})}function m(){return 0===v||0===Math.floor(Math.random()*v)}return void 0!==n.samplingInterval&&(isNaN(n.samplingInterval)||n.samplingInterval<0)?(v=0,g(\"Invalid sampling interval configured. Sampling interval must be an integer >= 0.\")):v=n.samplingInterval||0,void 0!==n.flushInterval&&(isNan(n.flushInterval)||n.flushInterval<2e3)?(l=2e3,g(\"Invalid flush interval configured. Must be an integer >= 2000 (milliseconds).\")):l=n.flushInterval||2e3,o.enqueue=function(e){if(!f){var t,n=!1,r=!1;if(i.summarizeEvent(e),\"feature\"===e.kind?m()&&(n=!!e.trackEvents,r=!!(t=e).debugEventsUntilDate&&t.debugEventsUntilDate>d&&t.debugEventsUntilDate>(new Date).getTime()):n=m(),n&&u.push(function(e){var t=extend({},e);return c||\"identify\"===e.kind?t.user=s.filterUser(e.user):(t.userKey=e.user.key,delete t.user),\"feature\"===e.kind&&(delete t.trackEvents,delete t.debugEventsUntilDate),t}(e)),r){var o=extend({},e,{kind:\"debug\"});delete o.trackEvents,delete o.debugEventsUntilDate,delete o.variation,u.push(o)}}},o.flush=function(e){if(f)return Promise.resolve();var t=u,n=i.getSummary();return i.clearSummary(),n&&(n.kind=\"summary\",t.push(n)),0===t.length?Promise.resolve():(u=[],a.sendEvents(t,e).then(function(e){e&&(e.serverTime&&(d=e.serverTime),isHttpErrorRecoverable(e.status)||(f=!0),e.status>=400&&onNextTick(function(){r.maybeReportError(new LDUnexpectedResponseError(httpErrorMessage(e.status,\"event posting\",\"some events were dropped\")))}))}))},o.start=function(){p=setTimeout(function e(){o.flush(),p=setTimeout(e,l)},l)},o.stop=function(){clearTimeout(p)},o}function EventEmitter(){var e={},t={};return e.on=function(e,n,r){t[e]=t[e]||[],t[e]=t[e].concat({handler:n,context:r})},e.off=function(e,n,r){if(t[e])for(var o=0;o<t[e].length;o++)t[e][o].handler===n&&t[e][o].context===r&&(t[e]=t[e].slice(0,o).concat(t[e].slice(o+1)))},e.emit=function(e){if(t[e])for(var n=0;n<t[e].length;n++)t[e][n].handler.apply(t[e][n].context,Array.prototype.slice.call(arguments,1))},e.maybeReportError=function(e){e&&(t[\"error\"]?this.emit(\"error\",e):console.error(e.message))},e}var matchOperatorsRe=/[|\\\\{}()[\\]^$+*?.]/g,escapeStringRegexp=function(e){if(\"string\"!=typeof e)throw new TypeError(\"Expected a string\");return e.replace(matchOperatorsRe,\"\\\\$&\")};function doesUrlMatch(e,t,n,r){var o=t.replace(n,\"\").replace(r,\"\"),a=void 0,i=void 0;switch(e.kind){case\"exact\":i=t,a=new RegExp(\"^\"+escapeStringRegexp(e.url)+\"/?$\");break;case\"canonical\":i=o,a=new RegExp(\"^\"+escapeStringRegexp(e.url)+\"/?$\");break;case\"substring\":i=o,a=new RegExp(\".*\"+escapeStringRegexp(e.substring)+\".*$\");break;case\"regex\":i=o,a=new RegExp(e.pattern);break;default:return!1}return a.test(i)}function findGoalsForClick(e,t){for(var n=[],r=0;r<t.length;r++)for(var o=e.target,a=t[r],i=a.selector,s=document.querySelectorAll(i);o&&s.length>0;){for(var c=0;c<s.length;c++)o===s[c]&&n.push(a);o=o.parentNode}return n}function GoalTracker(e,t){for(var n={},r=null,o=[],a=0;a<e.length;a++)for(var i=e[a],s=i.urls||[],c=0;c<s.length;c++)if(doesUrlMatch(s[c],location.href,location.search,location.hash)){\"pageview\"===i.kind?t(\"pageview\",i):(o.push(i),t(\"click_pageview\",i));break}return o.length>0&&(r=function(e){for(var n=findGoalsForClick(e,o),r=0;r<n.length;r++)t(\"click\",n[r])},document.addEventListener(\"click\",r)),n.dispose=function(){document.removeEventListener(\"click\",r)},n}function Store(e,t,n){var r={};function o(){var r=\"\",o=n.getUser();return o&&(r=t||btoa(JSON.stringify(o))),\"ld:\"+e+\":\"+r}return r.loadFlags=function(){var e=o(),t=void 0,n=void 0;try{t=localStorage.getItem(e)}catch(e){return console.warn(localStorageUnavailable()),null}try{n=JSON.parse(t)}catch(e){return r.clearFlags(),null}if(n){var a=n.$schema;(void 0===a||a<1)&&(n=transformValuesToVersionedValues(n))}return n},r.saveFlags=function(e){var t=o(),n=extend({},e,{$schema:1});try{localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn(localStorageUnavailable())}},r.clearFlags=function(){var e=o();try{localStorage.removeItem(e)}catch(e){}},r}function Stream(e,t,n,r){var o={},a=e+\"/eval/\"+t+\"/\",i=null;return o.connect=function(o,s){if(\"undefined\"!=typeof EventSource){var c=void 0;for(var u in r?c=e+\"/ping/\"+t:(c=a+base64URLEncode(JSON.stringify(o)),null!==n&&void 0!==n&&(c=c+\"?h=\"+n)),i=new window.EventSource(c),s)s.hasOwnProperty(u)&&i.addEventListener(u,s[u])}},o.disconnect=function(){i&&i.close()},o.isConnected=function(){return i&&(i.readyState===EventSource.OPEN||i.readyState===EventSource.CONNECTING)},o}var json=\"application/json\";function fetchJSON(e,t,n){var r=new XMLHttpRequest;return r.addEventListener(\"load\",function(){200===r.status&&r.getResponseHeader(\"Content-type\")&&0===r.getResponseHeader(\"Content-Type\").lastIndexOf(json)?n(null,JSON.parse(r.responseText)):n(getResponseError(r))}),r.addEventListener(\"error\",function(){n(getResponseError(r))}),t?(r.open(\"REPORT\",e),r.setRequestHeader(\"Content-Type\",\"application/json\"),addLDHeaders(r),r.send(JSON.stringify(t))):(r.open(\"GET\",e),addLDHeaders(r),r.send()),r}function getResponseError(e){return 404===e.status?new LDInvalidEnvironmentIdError(environmentNotFound()):e.statusText}function Requestor(e,t,n){var r=void 0,o=void 0,a={fetchFlagSettings:function(a,i,s){var c=void 0,u=void 0,l=void 0,v=void 0;n?(u=[e,\"/sdk/evalx/\",t,\"/user\",i?\"?h=\"+i:\"\"].join(\"\"),l=a):(c=base64URLEncode(JSON.stringify(a)),u=[e,\"/sdk/evalx/\",t,\"/users/\",c,i?\"?h=\"+i:\"\"].join(\"\"));var d,f,p=(d=s,function(e,t){d(e,t),r=null,o=null});r?(r.abort(),f=o,v=function(){f&&f.apply(null,arguments),p.apply(null,arguments)}):v=p,o=v,r=fetchJSON(u,l,v)},fetchGoals:function(n){fetchJSON([e,\"/sdk/goals/\",t].join(\"\"),null,n)}};return a}function sanitizeUser(e){var t=clone(e);return t.key&&(t.key=t.key.toString()),t}function Identity(e,t){var n={},r=void 0;return n.setUser=function(e){r=sanitizeUser(e),t(clone(r))},n.getUser=function(){return r?clone(r):null},e&&n.setUser(e),n}var _typeof=\"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},readyEvent=\"ready\",changeEvent=\"change\",goalsEvent=\"goalsReady\",locationWatcherInterval=300;function initialize(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.baseUrl||\"https://app.launchdarkly.com\",o=n.eventsUrl||\"https://events.launchdarkly.com\",a=n.streamUrl||\"https://clientstream.launchdarkly.com\",i=n.hash,s=void 0===n.sendEvents||n.sendEvents,c=!!n.allowFrequentDuplicateEvents,u=!!n.sendEventsOnlyForVariation,l=e,v=EventEmitter(),d=Stream(a,l,i,n.useReport),f=n.eventProcessor||EventProcessor(o,l,n,v),p=Requestor(r,l,n.useReport),g={},m=\"object\"===_typeof(n.bootstrap)?transformValuesToVersionedValues(n.bootstrap):{},h=void 0,y=void 0,E=void 0,k=void 0,b=!0;function w(){return s&&!function(){var e=void 0;e=navigator&&void 0!==navigator.doNotTrack?navigator.doNotTrack:navigator&&void 0!==navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack;return\"1\"===e||\"yes\"===e}()}function S(e){e.user?(b=!1,w()&&f.enqueue(e)):b&&(console&&console.warn&&console.warn(\"Be sure to call `identify` in the LaunchDarkly client: http://docs.launchdarkly.com/docs/running-an-ab-test#include-the-client-side-snippet\"),b=!1)}var L=Identity(t,function(e){e&&S({kind:\"identify\",key:e.key,user:e,creationDate:(new Date).getTime()})}),U=Store(l,i,L);function D(e,t,n){var r=L.getUser(),o=new Date;if(!c){var a=JSON.stringify(t)+(r&&r.key?r.key:\"\")+e,i=g[a];if(i&&o-i<3e5)return;g[a]=o}var s={kind:\"feature\",key:e,user:r,value:t,default:n,creationDate:o.getTime()},u=m[e];u&&(s.version=u.flagVersion?u.flagVersion:u.version,s.variation=u.variation,s.trackEvents=u.trackEvents,s.debugEventsUntilDate=u.debugEventsUntilDate),S(s)}function R(e,t){var n={kind:e,key:t.key,data:null,url:window.location.href,user:L.getUser(),creationDate:(new Date).getTime()};return\"click\"===e&&(n.selector=t.selector),S(n)}function N(e,t,n){var r=void 0;return r=m&&m.hasOwnProperty(e)&&m[e]&&!m[e].deleted?null===m[e].value?t:m[e].value:t,n&&D(e,r,t),r}function x(){L.getUser()&&(d.disconnect(),d.connect(L.getUser(),{ping:function(){p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),F(t)})},put:function(e){F(JSON.parse(e.data))},patch:function(e){var t=JSON.parse(e.data),n=m[t.key];if(!n||!n.version||!t.version||n.version<t.version){var r={},o=extend({},t);delete o.key,m[t.key]=o,r[t.key]=n?{previous:n.value,current:t.value}:{current:t.value},T(r)}},delete:function(e){var t=JSON.parse(e.data);if(!m[t.key]||m[t.key].version<t.version){var n={};m[t.key]&&!m[t.key].deleted&&(n[t.key]={previous:m[t.key].value}),m[t.key]={version:t.version,deleted:!0},T(n)}}}))}function F(e){var t={};if(e){for(var n in m)m.hasOwnProperty(n)&&m[n]&&(e[n]&&e[n].value!==m[n].value?t[n]={previous:m[n].value,current:e[n].value}:e[n]&&!e[n].deleted||(t[n]={previous:m[n].value}));for(var r in e)e.hasOwnProperty(r)&&e[r]&&(!m[r]||m[r].deleted)&&(t[r]={current:e[r].value});m=e,T(t)}}function T(e){var t=Object.keys(e);y&&U.saveFlags(m),t.length>0&&(t.forEach(function(t){v.emit(changeEvent+\":\"+t,e[t].current,e[t].previous)}),v.emit(changeEvent,e),u||t.forEach(function(t){D(t,e[t].current)}))}function I(){h&&h.dispose(),E&&E.length&&(h=GoalTracker(E,R))}function O(){s&&f.start()}e||onNextTick(function(){v.maybeReportError(new LDInvalidEnvironmentIdError(environmentNotSpecified()))}),t?t.key||onNextTick(function(){v.maybeReportError(new LDInvalidUserError(invalidUser()))}):onNextTick(function(){v.maybeReportError(new LDInvalidUserError(userNotSpecified()))}),\"object\"===_typeof(n.bootstrap)?onNextTick(function(){v.emit(readyEvent)}):\"string\"==typeof n.bootstrap&&\"LOCALSTORAGE\"===n.bootstrap.toUpperCase()&&localStorage?(y=!0,null===(m=U.loadFlags())?(m={},p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),t?(m=t,U.saveFlags(m)):m={},v.emit(readyEvent)})):(onNextTick(function(){v.emit(readyEvent)}),p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),t&&U.saveFlags(t)}))):p.fetchFlagSettings(L.getUser(),i,function(e,t){e&&v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),m=t||{},v.emit(readyEvent)}),p.fetchGoals(function(e,t){e&&v.maybeReportError(new LDUnexpectedResponseError((e.message,e.message))),t&&t.length>0&&(h=GoalTracker(E=t,R),function(e,t){var n=location.href,r=void 0;function o(){(r=location.href)!==n&&(n=r,t())}!function e(t,n){t(),setTimeout(function(){e(t,n)},n)}(o,e),window.history&&history.pushState?window.addEventListener(\"popstate\",o):window.addEventListener(\"hashchange\",o)}(locationWatcherInterval,I)),v.emit(goalsEvent)}),\"complete\"!==document.readyState?window.addEventListener(\"load\",O):O(),window.addEventListener(\"beforeunload\",function(){s&&(f.stop(),f.flush(!0))}),window.addEventListener(\"message\",function(e){if(e.origin===r&&\"SYN\"===e.data.type){window.editorClientBaseUrl=r;var t=document.createElement(\"script\");t.type=\"text/javascript\",t.async=!0,t.src=r+e.data.editorClientUrl;var n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(t,n)}});var C=new Promise(function(e){var t=v.on(readyEvent,function(){v.off(readyEvent,t),e()})}),P=new Promise(function(e){var t=v.on(goalsEvent,function(){v.off(goalsEvent,t),e()})});return{waitUntilReady:function(){return C},waitUntilGoalsReady:function(){return P},identify:function(e,t,n){return y&&U.clearFlags(),wrapPromiseCallback(new Promise(function(n,r){if(e&&null!==e.key&&void 0!==e.key)L.setUser(e),p.fetchFlagSettings(L.getUser(),t,function(e,t){if(e)return v.maybeReportError(new LDFlagFetchError(errorFetchingFlags(e))),r(e);t&&F(t),n(t),k&&x()});else{var o=new LDInvalidUserError(e?invalidUser():userNotSpecified());v.maybeReportError(o),r(o)}}),n)},variation:function(e,t){return N(e,t,!0)},track:function(e,t){\"string\"==typeof e?(E&&!function(e){if(!E||0===E.length)return!1;for(var t=0;t<E.length;t++)if(\"custom\"===E[t].kind&&E[t].key===e)return!0;return!1}(e)&&console.warn(unknownCustomEventKey(e)),S({kind:\"custom\",key:e,data:t,user:L.getUser(),url:window.location.href,creationDate:(new Date).getTime()})):v.maybeReportError(new LDInvalidEventKeyError(unknownCustomEventKey(e)))},on:function(e,t,n){e.substr(0,changeEvent.length)===changeEvent?(k=!0,d.isConnected()||x(),v.on.apply(v,[e,t,n])):v.on.apply(v,Array.prototype.slice.call(arguments))},off:function(e){e===changeEvent&&(k=!0)&&(k=!1,d.disconnect()),v.off.apply(v,Array.prototype.slice.call(arguments))},flush:function(e){return wrapPromiseCallback(new Promise(function(e){return s?e(f.flush()):e()},e))},allFlags:function(){var e={};if(!m)return e;for(var t in m)m.hasOwnProperty(t)&&(e[t]=N(t,null,!u));return e}}}var version=\"2.4.0\";function deprecatedInitialize(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return console&&console.warn&&console.warn(deprecated(\"default export\",\"named LDClient export\")),initialize(e,t,n)}var index={initialize:deprecatedInitialize,version:version};export default index;export{initialize,version};\n//# sourceMappingURL=ldclient.es.js.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ldclient-js/dist/ldclient.es.js\n// module id = 515\n// module chunks = 0 1","/* global Slick */\n\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport Backbone from 'backbone';\nBackbone.$ = (window as any).jQuery = $;\nimport utils from './utils';\nimport {GriddleSettings} from '../config';\n\nrequire('jquery-ui/position');\nrequire('jquery-ui/sortable');\nrequire('@opengov/slickgrid/lib/jquery.event.drag-2.2');\nrequire('@opengov/slickgrid/slick.core');\nrequire('@opengov/slickgrid/slick.grid');\nrequire('@opengov/slickgrid/plugins/slick.autotooltips');\nrequire('@opengov/slickgrid/plugins/slick.cellselectionmodel');\nrequire('@opengov/slickgrid/plugins/slick.cellrangeselector');\nrequire('@opengov/slickgrid/plugins/slick.cellrangedecorator');\nrequire('@opengov/slickgrid/plugins/slick.cellexternalcopymanager');\n\nconst defaultGridOptions = {\n  enableColumnReorder: true,\n  // For now force only a single column to be sorted to avoid out-of-index sorting\n  multiColumnSort: false,\n  syncColumnCellResize: true,\n  enableAddRow: false,\n  editable: false,\n  enableCellNavigation: true,\n  asyncEditorLoading: false,\n  autoEdit: false,\n  // prevent flashing of white background while scrolling fast\n  forceSyncScrolling: true,\n  rowHeight: 42\n};\n\nconst defaultOptions = {\n  defaultMinWidth: 40,\n  cellPadding: 40,\n  characterWidth: 7,\n  autoWidth: false,\n  showDropdown: true,\n  sendVisibleFieldsOnly: false\n};\n\nfunction annotateSlickgridColumns(columns, locale) {\n  return _.map(columns, function(x: any) {\n    return _.extend({}, x, {\n      id: x.id || x.name,\n      field: x.field || x.name,\n      name: x.label || x.name,\n      sortable: true,\n      formatter: utils.getFormatter(x, locale),\n      cssClass: (x.type === 'monetary' || x.type === 'numeric') ? 'numericalData' : ''\n        //type is inherited (text, numeric, monetary)\n    });\n  });\n}\n\n/** @class Griddle\n    @extends SlickGrid */\nfunction griddle(options, locale) {\n  options.container = $(options.container);\n  options.gridOptions = _.extend({}, defaultGridOptions, options.gridOptions);\n\n  const grid = new Slick.Grid(options.container, options.loader.data, options.columns, options.gridOptions);\n  // slap it onto the slick.grid black box\n  grid.locale = locale;\n\n  _.extend(grid, Backbone.Events, GridPrototype);\n  grid.initialize(options, locale);\n\n  return grid;\n}\n\nvar GridPrototype =\n/** @lends Grid# */\n  {\n    initialize(options, locale) {\n      this.options = _.extend({}, defaultOptions, options);\n      this.loader = options.loader;\n      this.queryModel = options.queryModel;\n      this._slickEvents = {};\n      //store the required columns\n      this.requiredColumns = [];\n\n      this.setAllColumns(options.columns, locale);\n\n      _.bindAll(this, 'handleSort', 'handleDataLoaded', 'handleQueryChange', 'handleColumnsReordered', 'handleColumnsResized', 'handleBodyClicked');\n\n    // show tooltip for a cell when content is too wide\n      this.registerPlugin(new Slick.AutoTooltips({enableForHeaderCells: true}));\n\n    // Allow to select and copy cells\n    // Do not enable on touch devices as it prevents scrolling, detection condition taken from Modernizr\n    // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js\n      if (!(('ontouchstart' in window) || (window as any).DocumentTouch && document instanceof DocumentTouch)) {\n        this.setSelectionModel(new Slick.CellSelectionModel());\n        this.registerPlugin(new Slick.CellExternalCopyManager());\n      } else {\n      // set dummy selection model for touch devices so that slickgrid does not throw exceptions when a selection model is missing\n        this.setSelectionModel({\n          init() {},\n          destroy() {},\n          onSelectedRangesChanged: new Slick.Event(),\n          setSelectedRanges() {},\n          getSelectedRanges() { return []; }\n        });\n      }\n\n    // When user clicks on header to changes sorting then update query model\n      this.onSort.subscribe(this.handleSort);\n    // Track column order when user reorders them with dragging\n      this.onColumnsReordered.subscribe(this.handleColumnsReordered);\n    // handle when columns are resized to apply width adjustments\n      this.onColumnsResized.subscribe(this.handleColumnsResized);\n    // Re-render when data is loaded\n      this.loader.on('loaded', this.handleDataLoaded);\n    // Update columns when query changes\n      this.queryModel.on('change', this.handleQueryChange);\n\n      $('body').on('click', this.handleBodyClicked);\n\n      this.listenTo(this, 'selectedRowsChanged', this.handleSelectedRowsChanged, this);\n      this.listenTo(this, 'dropdownOpened', this.handleDropdownOpened, this);\n\n      this.setColumns(this.getVisibleColumns());\n    },\n    destroy() {\n      Slick.Grid.grid.prototype.destroy.call(this);\n      $('body').off('click', this.handleBodyClicked);\n      this.stopListening();\n    },\n    handleBodyClicked(ev) {\n    // deselect rows when outside of the grid is clicked\n      if (!$(ev.target).parents().addBack().is(this.getContainerNode())) {\n        this.deselectRows();\n      }\n    // hide dropdown if user clicks outside\n      if (this.currentDropdown && (!this.currentDropdown.isInsideClicked || !this.currentDropdown.isInsideClicked(ev))) {\n        this.trigger('dropdownOpened', null);\n      }\n    },\n    handleSelectedRowsChanged(ev, data) {\n      if (data.rows.length > 0) {\n      // user selected rows using drag, hide dropdowns\n        this.trigger('dropdownOpened', null);\n      }\n    },\n    handleDropdownOpened(view) {\n      if (this.currentDropdown && this.currentDropdown !== view) {\n        this.currentDropdown.hideMenu();\n      }\n      this.currentDropdown = view;\n    // deselect rows when dropdown is opened\n      if (view !== null) {\n        this.deselectRows();\n      }\n    },\n    handleViewportChanged() {\n      const vp = this.getViewport();\n      this.loader.ensureData(vp.top, vp.bottom);\n    },\n    handleSort(e, args) {\n      let cols = args.sortCols;\n      if (!cols) {\n      // grid is in single sort mode\n        cols = [args];\n      }\n      _.each(cols, _.bind(function(x) {\n        let id = x.sortCol.id;\n        let query = this.queryModel.getColumnQuery(id);\n        let order;\n\n        switch (query.sort) {\n        case 'asc':\n          order = 'desc';\n          break;\n        case 'desc':\n          order = '';\n          break;\n        default:\n          order = 'asc';\n        }\n\n        this.trigger('action', 'sort-' + order, id);\n        this.queryModel.sortColumn(id, order);\n      }, this));\n    },\n    handleDataLoaded() {\n    // when we get a first batch of data we compute column widths\n      const columns = this.getAllColumns();\n      const rowData = this.getData();\n      const firstRow = rowData && rowData[0];\n      if (this.options.autoWidth && columns && columns.length && !columns[0].autoWidth) {\n        this.computeColumnWidths(this.getData());\n        this.setColumns(this.getVisibleColumns());\n      }\n      const visibleColumns = this.getVisibleColumns();\n      const uploadColumnIndex = visibleColumns.findIndex(c => c.id === '__GDAPI_UPLOAD_ID');\n      if (firstRow && firstRow.__gdapi_upload_id && uploadColumnIndex > -1) {\n        const newColumns = visibleColumns;\n        newColumns[uploadColumnIndex] = {\n          ...visibleColumns[uploadColumnIndex],\n          field: visibleColumns[uploadColumnIndex].field.toLowerCase()\n        };\n        this.setColumns(newColumns);\n      }\n      const vp = this.getViewport();\n    // when we scroll more than there are available results, scroll back to display the results\n      if (vp.top >= this.getDataLength()) {\n        this.scrollRowIntoView(this.getDataLength() - 1, true);\n      // we scrolled too far away and have no data. lets clear and start from beginning\n        if (this.getDataLength() === 0) {\n          this.loader.clear();\n        }\n      }\n      this.invalidate();\n    },\n    handleQueryChange() {\n      if (this.options.sendVisibleFieldsOnly) {\n        this.queryModel.fields(\n          this.getVisibleColumns().map(column => column.id)\n        );\n      }\n\n      this.setSortColumns(_.map(this.queryModel.getSort(), function(x) {\n        for (let col in x) {\n          return {\n            columnId: col,\n            sortAsc: x[col] === 'asc'\n          };\n        }\n      }));\n      this.deselectRows();\n    },\n    handleColumnsReordered() {\n      // Because columns can be reordered, we have to update the `columns`\n      // to reflect the new order, however we can't just take `grid.getColumns()`,\n      // as it does not include columns currently hidden by the picker.\n      // We create a new `columns` structure by leaving currently-hidden\n      // columns in their original ordinal position and interleaving the results\n      // of the current column sort.\n      const current = this.getColumns().slice(0);\n\n      const columns = this.fixedColumns;\n      const ordered = new Array(columns.length);\n      for (let i = 0; i < ordered.length; i++) {\n        if (_.isUndefined(this.getColumnIndex(columns[i].id))) {\n        // If the column doesn't return a value from getColumnIndex,\n        // it is hidden. Leave it in this position.\n          ordered[i] = columns[i];\n        } else {\n        // Otherwise, grab the next visible column.\n          ordered[i] = current.shift();\n        }\n      }\n      this.fixedColumns = ordered;\n      this.adjustHeader();\n      this.trigger('action', 'columns-reordered');\n    },\n    handleColumnsResized() {\n      _.each(this.getColumns(), _.bind(function(column) {\n        if (column.width !== column.previousWidth) {\n        // column has been resized by user, override automatically detected value\n          column.autoWidth = column.width;\n        // update querygrid's copy too\n          const col: any = _.find(this.fixedColumns, {id: column.id});\n          col.autoWidth = col.width = column.width;\n        }\n      }, this));\n      this.adjustHeader();\n    },\n  /** Resize columns to fill the grid viewport\n    * and make sure the grid header extend over scrollbar. */\n    adjustHeader() {\n      const container = $(this.getContainerNode());\n      const viewport = container.find('.slick-viewport').get(0);\n      const scrollbarWidth = viewport.offsetWidth - viewport.clientWidth;\n      const lastColumn = container.find('.slick-header-column:last');\n      const columns = this.getColumns();\n\n      // set minimum with to a width of content\n      _.each(columns, function(column) {\n        column.minWidth = column.autoWidth;\n      });\n\n      // let SlickGrid autosize the columns\n      this.autosizeColumns();\n      // extend last column header over scrollbar\n      lastColumn.width(lastColumn.width() + scrollbarWidth);\n\n      // set minWidth to default so that user can shrink columns\n      _.each(columns, _.bind(function(column) {\n        column.minWidth = this.options.defaultMinWidth;\n      }, this));\n    },\n  /** Go through rows of data and compute column widths to fit the content */\n    computeColumnWidths(data) {\n    /* jshint -W041 */\n      _.each(this.getAllColumns(), _.bind(function(column) {\n        let len = 0;\n        let count = 0;\n        let width = this.options.defaultMinWidth;\n\n        if (column.type === 'date') {\n        // optimization - date has always length of 10 - MM/DD/YYYY\n          len = 10;\n          count = 1;\n        } else {\n        // get average number of characters in data\n          for (let i = 0; data[i] != null; i += 1) { // != is intentional\n            let value = data[i][column.id];\n            if (value == null) { // == is intentional\n              continue;\n            }\n            value = column.formatter(null, null, value);\n          // discard short outliers with this condition\n            if (value.length > 1) {\n              count += 1;\n              len += value.length;\n            }\n          }\n        }\n\n        if (count > 0) {\n        // compute average with of column with padding\n          width = Math.floor(len / count * this.options.characterWidth) + this.options.cellPadding;\n        }\n        width = Math.max(width, column.label.length * this.options.characterWidth + this.options.cellPadding);\n\n        column.minWidth = this.options.defaultMinWidth;\n        column.width = column.autoWidth = width;\n      }, this));\n    },\n    deselectRows() {\n      if (this.getSelectedRows().length > 0) {\n        this.setSelectedRows([]);\n      }\n    },\n    setAllColumns(columns, locale) {\n      columns = annotateSlickgridColumns(columns, locale);\n      const metaData = this.options.meta;\n      const requiredColumns = [];\n      const columnsByVisibility = _.groupBy(columns, function(column: any) {\n        //Set the isRequired field for checkbox\n        //if date column is computed, then exclude it from mandatory column\n        column.isRequired = column.id == metaData.date_column && column.computed ? false : ( column.id == metaData.amount_column || column.id == metaData.date_column );\n        if (column.isRequired && !_.includes(requiredColumns, column.id)) {\n          requiredColumns.push(column.id);\n        }\n      // Group invisible columns apart from the rest of the columns\n        if (_.includes(GriddleSettings.ignoredFields, column.id)) {\n          return 'invisible';\n        }\n        return column.visible ? 'visible' : 'hidden';\n      });\n      this.requiredColumns = requiredColumns;\n\n    // Fix the position of any columns visible by default\n      this.fixedColumns = !!columnsByVisibility.visible ? columnsByVisibility.visible : [];\n      this.auxColumns = columnsByVisibility.hidden;  // Would be more efficient as a set.. but we should be okay for now\n      this.invisibleColumns = columnsByVisibility.invisible;\n\n      this.setColumns(this.getVisibleColumns());\n      this.adjustHeader();\n      this.trigger('columnsVisibilityChanged');\n    },\n    getAllColumns() {\n      return _.union(this.fixedColumns, this.auxColumns);\n    },\n  /** Get only visible columns */\n    getVisibleColumns() {\n      return _.filter(this.fixedColumns, function(column: any) {\n        return column.visible;\n      });\n    },\n\n    //set visibility in the column data -> column.visible\n    setColumnVisibility(columnId) {\n      let column;\n      //disable toggle of the required column\n      if (_.includes(this.requiredColumns, columnId)) {\n        return;\n      }\n      column = _.find(this.fixedColumns, function(column) {\n        return columnId === column.id;\n      });\n\n      if (!column) {\n        column = _.remove(this.auxColumns, function(column: any) {\n          return columnId === column.id;\n        })[0];\n\n        this.fixedColumns.push(column);\n      }\n      column.visible = !column.visible;\n    },\n\n    //apply visibility in the grid\n    applyColumnVisibility() {\n      this.setColumns(this.getVisibleColumns());\n      this.adjustHeader();\n      this.trigger('columnsVisibilityChanged');\n    },\n\n    //toggle the individual columns\n    toggleColumnVisibility(columnId) {\n      this.setColumnVisibility(columnId);\n      this.applyColumnVisibility();\n    },\n\n    //toggle the columns using the selectAll\n    //argument can be array of columns or array of columnIds\n    toggleAllColumnVisibility(columns) {\n      const grid = this;\n      _.each(columns, function(column) {\n        const columnId = column.id || column;\n        grid.setColumnVisibility(columnId);\n      });\n      this.applyColumnVisibility();\n    },\n\n    reorderColumns(columnIds) {\n      const unordered = this.fixedColumns;\n      const ordered = new Array(unordered.length);\n\n      for (let i = 0, length = unordered.length; i < length; i++) {\n        ordered[columnIds.indexOf(unordered[i].id)] = unordered[i];\n      }\n\n      this.fixedColumns = ordered;\n      this.adjustHeader();\n      this.trigger('columnsReordered');\n    },\n\n  // wrap Slickgrid to Backbone events interface\n    on(name) {\n      const slickName = 'on' + utils.capitalize(name);\n      if (slickName in this && !(name in this._slickEvents)) {\n      // lazily bind slick events\n        const handler = _.bind(function() {\n          const args = [].slice.call(arguments);\n          args.unshift(name);\n          this.trigger.apply(this, args);\n        }, this);\n\n        this._slickEvents[name] = handler;\n        this[slickName].subscribe(handler);\n      }\n      (Backbone.Events as any).on.apply(this, arguments);\n    }\n  };\n\nexport default griddle;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/querygrid.ts","var jQuery = require('jquery');\n\n/*!\n * jQuery UI Widget 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\tslice = Array.prototype.slice,\n\t_cleanData = $.cleanData;\n$.cleanData = function( elems ) {\n\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\ttry {\n\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t// http://bugs.jquery.com/ticket/8235\n\t\t} catch( e ) {}\n\t}\n\t_cleanData( elems );\n};\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n};\n\n$.widget.extend = function( target ) {\n\tvar input = slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t// 1.9 BC for #7810\n\t\t\t// TODO remove dual storage\n\t\t\t.removeData( this.widgetName )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled ui-state-disabled\", !!value )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\t// accept selectors, DOM elements\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^(\\w+)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\n})( jQuery );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-ui/widget.js\n// module id = 517\n// module chunks = 0 1","import _ from 'lodash';\n\n//require('jquery.ui.position');\n\nimport $ from 'jquery';\nimport Backbone from 'backbone';\nimport moment from 'moment';\nimport utils from '../utils';\nimport JST from '../../templates';\nimport Datepicker from '../../griddle/bootstrap-datepicker';\n\n/** @class HeaderMenu */\nfunction HeaderMenu(options) {\n  this.options = _.merge({\n    template: 'column',\n    container: $('body'),\n    features: {\n      filter: true,\n      sort: true,\n      filterBlanks: false,\n      hideColumn: true\n    }\n  }, options);\n\n  _.bindAll(this, 'handleHeaderCellRendered', 'handleBeforeHeaderCellDestroy',\n    'handleMenuClick', 'updateFilterIndicators', 'updateColumnFilterIndicator',\n    'handleOkClick', 'handleClearClick', 'handleClearInputClick', 'updateQueryState', 'hideMenu');\n}\n\n_.extend(HeaderMenu.prototype, Backbone.Events,\n/** @lends HeaderMenu# */\n  {\n    options: null,\n    grid: null,\n    queryModel: null,\n    handler: null,\n    currentColumn: null,\n    $menu: null,\n    $activeHeaderColumn: null,\n\n    handleOkClick() {\n      this.hideMenu();\n    },\n    handleClearClick() {\n      const q = this.queryModel.getQuery();\n      const col = this.currentColumn.id;\n      q.sort = _.filter(q.sort, function(x) {\n        return !(col in x);\n      });\n      delete q.filter[col];\n      this.queryModel.setQuery(q);\n      this.render();\n    },\n    handleClearInputClick(ev) {\n      ev.stopPropagation();\n      $(ev.currentTarget).prev('input').val('');\n      this.updateQueryState();\n    },\n  /** Creates element for a given column to be inserted into header element */\n    buttonFactory(column) {\n      return $('<div></div>')\n      .addClass('slick-header__menubutton')\n      .data('column', column);\n    },\n\n  /** Initialize the plugin, called by slickgrid when registering */\n    init(grid) {\n      this.queryModel = this.options.queryModel;\n      this.grid = grid;\n\n      this.grid.on('headerCellRendered', this.handleHeaderCellRendered);\n      this.grid.on('beforeHeaderCellDestroy', this.handleBeforeHeaderCellDestroy);\n\n    // hide menu when dragging columns around\n      $(this.grid.getContainerNode()).find('.slick-header .ui-sortable').on('sortstart', this.hideMenu);\n\n      this.queryModel.on('change', this.handleQueryChanged, this);\n\n    // Force the grid to re-render the header now that the events are hooked up.\n      this.grid.setColumns(this.grid.getColumns(), true);\n\n      this.updateFilterIndicators();\n      this.queryModel.on('change', this.updateFilterIndicators);\n    },\n  /** Destroy the plugin, called by slickgrid */\n    destroy() {\n      this.queryModel.off('change', this.updateFilterIndicators);\n    },\n  /** Hook to attach events when header is rendered\n      @protected */\n    handleHeaderCellRendered(e, args) {\n      const self = this;\n      const $button = this.buttonFactory(args.column);\n      $button.appendTo(args.node);\n\n      $(args.node)\n      .on('contextmenu', function(ev) {\n        ev.preventDefault();\n        self.trigger('action', 'open-using-rightclick', args.column.id);\n        self.showMenu(ev, $(args.node).find('.slick-header__menubutton'));\n      })\n      .on('click', function(ev) {\n        if (!$(ev.target).is('.slick-resizable-handle')) {\n          self.trigger('action', 'open-using-icon', args.column.id);\n          self.showMenu(ev, $button);\n        }\n      });\n      this.updateColumnFilterIndicator(args.node);\n    },\n  /** Hook to detach events when header is destroyed\n      @protected */\n    handleBeforeHeaderCellDestroy(e, args) {\n      const column = args.column;\n      if (column.header && column.header.menu) {\n        $(args.node).find('.slick-header__menubutton').remove();\n      }\n    },\n    isInsideClicked(ev) {\n      return this.$menu && $(ev.target).parents().addBack().is(this.$menu);\n    },\n  /** Handle click on the menu. Runs associated actions.\n      @protected */\n    handleMenuClick(ev) {\n    // handle other menu actions\n      const action = $(ev.currentTarget).data('action');\n      if (action) {\n        this.trigger('action', action, this.currentColumn.id);\n\n        if (action === 'sort-asc' || action === 'sort-desc' || action === 'sort-clear') {\n          const sort = action === 'sort-asc' ? 'asc' : (action === 'sort-desc' ? 'desc' : '');\n          this.queryModel.beginUpdate();\n          this.updateQueryState();\n          this.queryModel.sortColumn(this.currentColumn.id, sort);\n          this.queryModel.endUpdate();\n        } else if (action === 'blank' || action === 'non-blank' || action === 'blank-clear') {\n          const blank = action === 'blank' ? true : (action === 'non-blank' ? false : undefined);\n          this.queryModel.beginUpdate();\n          this.updateQueryState();\n          this.queryModel.filterColumn(this.currentColumn.id, 'null', blank);\n          this.queryModel.endUpdate();\n        }\n\n        if (action === 'hide') {\n          if (this.currentColumn.visible) {\n            this.grid.toggleColumnVisibility(this.currentColumn.id);\n            this.hideMenu();\n          }\n        } else if (action === 'ok') {\n          this.handleOkClick();\n        } else if (action === 'clear') {\n          this.handleClearClick();\n        }\n      }\n    },\n    handleQueryChanged() {\n      if (this.$menu) {\n        _.defer(_.bind(this.render, this));\n      }\n    },\n\n  /** Handle values from inputs when menu is getting hidden.\n      @protected */\n    updateQueryState() {\n      const locale = this.options.locale;\n      const m = moment();\n      m.locale(locale);\n      const format = m.localeData().longDateFormat(utils.DATE_FORMAT as any);\n\n      // A text filter can be either `eq` or `contains`\n      const pastFilter = this.queryModel._q.filter;\n      let pastOperator;\n      if (pastFilter) {\n        const filter = pastFilter[this.currentColumn.id];\n        if (filter) {\n          if (filter.hasOwnProperty('eq')) {\n            pastOperator = 'eq'\n          }\n          if (filter.hasOwnProperty('contains')) {\n            pastOperator = 'contains'\n          }\n        }\n      }\n\n      let val;\n      let from_val;\n      let to_val;\n      this.queryModel.beginUpdate();\n\n      from_val = this.$menu.find('.filter-from').val();\n      from_val = from_val ? utils.parseValue(from_val, this.currentColumn.type, format) : undefined;\n      to_val = this.$menu.find('.filter-to').val();\n      to_val = to_val ? utils.parseValue(to_val, this.currentColumn.type, format) : undefined;\n\n      val = from_val === to_val ? from_val : undefined;\n      this.queryModel.filterColumn(this.currentColumn.id, 'eq', val);\n      val = from_val !== to_val ? from_val : undefined;\n      this.queryModel.filterColumn(this.currentColumn.id, 'ge', val);\n      val = from_val !== to_val ? to_val : undefined;\n      this.queryModel.filterColumn(this.currentColumn.id, 'le', val);\n      if (this.currentColumn.type === 'text') {\n        val = this.$menu.find('.filter-search').val() || undefined;\n        if (pastOperator === 'eq') {\n          this.queryModel.filterColumn(this.currentColumn.id, 'eq', val);\n        } else {\n          this.queryModel.filterColumn(this.currentColumn.id, 'contains', val);\n        }\n      }\n\n      this.queryModel.endUpdate();\n    },\n  /** Update indication whether there is a filter on all columns */\n    updateFilterIndicators() {\n      const self = this;\n      $(this.grid.getContainerNode()).find('.slick-header-column').each(function() {\n        self.updateColumnFilterIndicator(this);\n      });\n    },\n  /** Update indication whether there is a filter on a single column */\n    updateColumnFilterIndicator(el) {\n      const column = $(el).data('column');\n      const hasFilters = column && column.id !== undefined && !_.isEmpty(this.queryModel.getColumnQuery(column.id).filter);\n      $(el)[hasFilters ? 'addClass' : 'removeClass']('slick-header-column-has-filters');\n    },\n  /** Create the menu element */\n    createMenu() {\n      this.$menu = $(\"<div class='ui-dropdown__target ready'></div>\")\n      .hide()\n      .appendTo(this.options.container);\n\n      this.$menu.on('click', '.dropdown__row', this.handleMenuClick);\n      this.$menu.on('click', '.js-ok', this.handleOkClick);\n      this.$menu.on('click', '.js-clear', this.handleClearClick);\n\n      this.$menu.on('click', '.js-clear-input', this.handleClearInputClick);\n\n      this.$menu.column = this.currentColumn;\n\n      const self = this;\n      this.$menu.on('keydown', 'input', function(ev) {\n        if (ev.keyCode === 13) {\n          self.updateQueryState();\n        } else if (ev.keyCode === 27) {\n          self.hideMenu();\n        }\n      });\n    },\n  /** Render and show the menu */\n    showMenu(e, $menuButton) {\n    // stop propagation so that event does not bubble to sorting handler when just the filter icon is clicked\n      if (!e || !$(e.target).is('.slick-sort-indicator')) {\n        e.stopPropagation();\n      }\n      const column = $menuButton.data('column');\n      if (this.currentColumn === column) {\n        this.hideMenu();\n      } else {\n        this.hideMenu();\n        this.currentColumn = column;\n        this.queryBackup = this.queryModel.toJSON();\n      // Mark the header as active to keep the highlighting.\n        this.$activeHeaderColumn = $menuButton.closest('.slick-header-column');\n        this.$activeHeaderColumn.addClass('slick-header-column-active');\n\n        this.render();\n\n        this.$menu.find('input[type=text]').first().focus();\n      }\n    },\n    render() {\n      const locale = this.options.locale;\n      if (!this.currentColumn) {\n        return;\n      }\n      let self = this;\n      let isAlreadyOpened = true;\n      if (!this.$menu) {\n        this.createMenu();\n        isAlreadyOpened = false;\n      }\n\n      let vals = this.queryModel.getColumnQuery(this.currentColumn.id);\n      vals = _.extend({\n        showSortAsc: vals.sort !== 'asc',\n        showSortDesc: vals.sort !== 'desc',\n        sorting: !!vals.sort,\n        showBlankFilter: vals.filter['null'] === undefined || !vals.filter['null'],\n        showNonBlankFilter: vals.filter['null'] === undefined || vals.filter['null'],\n        blankFiltered: vals.filter['null'] !== undefined,\n        features: this.options.features\n      }, vals);\n      vals[this.currentColumn.type + 'Column'] = true;\n      const formatter = utils.getInputFormatter(this.currentColumn, locale);\n      if ((vals.filter.le !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n        vals.to = formatter(vals.filter.le === undefined ? vals.filter.eq : vals.filter.le);\n      }\n      if ((vals.filter.ge !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n        vals.from = formatter(vals.filter.ge === undefined ? vals.filter.eq : vals.filter.ge);\n      }\n      if ((vals.filter.text !== undefined || vals.filter.contains !== undefined || vals.filter.eq !== undefined) && this.currentColumn.formatter) {\n        vals.contains = formatter(vals.filter.text || vals.filter.contains || vals.filter.eq);\n      }\n\n      this.cleanupElements();\n\n      this.$menu.html(\n      JST['athena/querygrid/' + this.options.template](vals)\n    );\n\n      this.grid.trigger('dropdownOpened', this);\n\n      if (!isAlreadyOpened) {\n        this.$menu\n        .css({display: 'block', 'min-width': 200})\n        .position({\n          of: this.$activeHeaderColumn,\n          my: 'center top',\n          at: 'center bottom+5',\n          collision: 'flipfit'\n        })\n        .addClass('open');\n      // On open, focus to the first input box\n        this.$menu.find('.dropdown__row__input').first().focus();\n      }\n\n      if (this.currentColumn.type === 'date') {\n        const locale = this.options.locale;\n        const inputs = this.$menu.find('input[type=text]');\n        (Datepicker as any).create(inputs, {\n          viewMode: 'years',\n          changeMonth: true,\n          changeYear: true,\n          locale: locale\n        }).data('datepicker').hide();\n        inputs.on('changeDate', function(ev) {\n          const period = $(this).data('selectDatePeriod');\n          const viewPeriod = ev.viewMode.replace(/s$/, '');\n          if (period) {\n            self.$menu.find('.filter-from').val(moment(ev.date).startOf(viewPeriod).format(utils.DATE_FORMAT));\n            self.$menu.find('.filter-to').val(moment(ev.date).endOf(viewPeriod).format(utils.DATE_FORMAT));\n            if (period === viewPeriod) {\n              $(this)\n                .data('selectDatePeriod', null)\n                .data('datepicker').hide();\n            }\n          } else {\n            const method = $(this).is('.filter-from') ? 'startOf' : 'endOf';\n            const m = moment(new Date(ev.date))[method](viewPeriod);\n            m.locale(locale);\n            const value = m.format(utils.DATE_FORMAT);\n            $(this).data('datepicker').setValue(value);\n            $(this).val(value);\n            if (ev.viewMode === 'days') {\n              $(this).data('datepicker').hide();\n            }\n          }\n        }).each(function() {\n          _.extend($(this).data('datepicker'), {\n            place() {\n              this.picker.position({\n                my: 'center top',\n                at: 'center bottom',\n                of: (this.compoment || this.element).parent('.dropdown__row_input'),\n                collision: 'flipfit'\n              });\n            },\n            set() {}\n          });\n        });\n        this.$menu.find('.js-datepicker').on('click', function() {\n          $(this).prev().data('datepicker').show();\n        });\n      }\n    },\n    cleanupElements() {\n      if (this.currentColumn.type === 'date') {\n      // remove datepicker instances so they are not dangling in the DOM\n        this.$menu.find('input[type=text]').each(function() {\n          $(this).data('datepicker').picker.remove();\n        });\n      }\n    },\n  /** Hide menu and remove from DOM */\n    hideMenu() {\n      if (this.$menu) {\n        this.cleanupElements();\n        this.updateQueryState();\n        this.$menu.remove();\n        this.$menu = null;\n        this.currentColumn = null;\n        this.$activeHeaderColumn\n        .removeClass('slick-header-column-active');\n      }\n    }\n  });\n\nexport default HeaderMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/headermenu.ts","/* =========================================================\n * bootstrap-datepicker.js\n * http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Copyright 2012 Stefan Petre\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n // highly modified for i18n by CK\n\nimport $ from 'jquery';\nimport moment from 'moment';\nimport utils from '../querygrid/utils';\n\nconst Datepicker = function(element, options) {\n  this.element = $(element);\n  this.locale = options.locale;\n  this.picker = $((DPGlobal as any).template)\n    .appendTo('body')\n    .on({ click: $.proxy(this.click, this) });\n  this.isInput = this.element.is('input');\n  this.component = this.element.is('.date') ? this.element.find('.add-on') : false;\n\n  if (this.isInput) {\n    this.element.on({\n      keyup: $.proxy(this.update, this)\n    });\n  } else {\n    if (this.component) {\n      this.component.on('click', $.proxy(this.show, this));\n    } else {\n      this.element.on('click', $.proxy(this.show, this));\n    }\n  }\n\n  this.minViewMode = options.minViewMode || this.element.data('date-minviewmode') || 0;\n  if (typeof this.minViewMode === 'string') {\n    switch (this.minViewMode) {\n    case 'months':\n      this.minViewMode = 1;\n      break;\n    case 'years':\n      this.minViewMode = 2;\n      break;\n    default:\n      this.minViewMode = 0;\n      break;\n    }\n  }\n  this.viewMode = options.viewMode || this.element.data('date-viewmode') || 0;\n  if (typeof this.viewMode === 'string') {\n    switch (this.viewMode) {\n    case 'months':\n      this.viewMode = 1;\n      break;\n    case 'years':\n      this.viewMode = 2;\n      break;\n    default:\n      this.viewMode = 0;\n      break;\n    }\n  }\n  this.startViewMode = this.viewMode;\n  this.weekStart = options.weekStart || this.element.data('date-weekstart') || 0;\n  this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;\n  this.onRender = options.onRender;\n  this.fillDow();\n  this.fillMonths();\n  this.update();\n  this.showMode();\n};\n\nDatepicker.prototype = {\n  constructor: Datepicker,\n\n  show(e) {\n    this.picker.show();\n    this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();\n    this.place();\n    $(window).on('resize', $.proxy(this.place, this));\n    if (e ) {\n      e.stopPropagation();\n      e.preventDefault();\n    }\n    const that = this;\n    $(document).on('mousedown', function(ev) {\n      if ($(ev.target).closest('.datepicker').length == 0) {\n        that.hide();\n      }\n    });\n    this.element.trigger({\n      type: 'show',\n      date: this.date\n    });\n  },\n\n  hide() {\n    this.picker.hide();\n    $(window).off('resize', this.place);\n    this.viewMode = this.startViewMode;\n    this.showMode();\n    if (!this.isInput) {\n      $(document).off('mousedown', this.hide);\n    }\n    //this.set();\n    this.element.trigger({\n      type: 'hide',\n      date: this.date\n    });\n  },\n\n  set() {\n    const enM = moment(this.date, utils.DATE_FORMAT, 'en_US');\n    const localeFormated = enM.locale(this.locale).format(utils.DATE_FORMAT);\n\n    this.applyDateStringtoInput(localeFormated);\n  },\n\n  applyDateStringtoInput(dateString) {\n    if (!this.isInput) {\n      if (this.component) {\n        this.element.find('input').prop('value', dateString);\n      }\n      this.element.data('date', dateString);\n    } else {\n      this.element.prop('value', dateString);\n    }\n  },\n\n  setValue(newDate) {\n    const m = utils.localeDateStringToMoment(newDate, this.locale);\n    this.date = utils.momentToLocaleDate(m, 'en_US');\n    this.set();\n    this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n    this.fill();\n  },\n\n  place() {\n    const offset = this.component ? this.component.offset() : this.element.offset();\n    this.picker.css({\n      top: offset.top + this.height,\n      left: offset.left\n    });\n  },\n\n  update(newDate) {\n    if (typeof newDate === 'string') {\n      this.date = utils.localeDateStringToMoment(newDate, this.locale).toDate();\n    } else if (this.isInput && this.element.prop('value')) {\n      this.date = utils.localeDateStringToMoment(this.element.prop('value'), this.locale).toDate();\n    } else {\n      this.date = moment(this.element.data('date')).toDate();\n    }\n\n    this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n    this.fill();\n  },\n\n  fillDow() {\n    let dowCnt = this.weekStart;\n    let html = '<tr>';\n    while (dowCnt < this.weekStart + 7) {\n      html += '<th class=\"dow\">' + DPGlobal.dates.daysMin[(dowCnt++) % 7] + '</th>';\n    }\n    html += '</tr>';\n    this.picker.find('.datepicker-days thead').append(html);\n  },\n\n  fillMonths() {\n    let html = '';\n    let i = 0;\n    while (i < 12) {\n      html += '<span class=\"month\">' + DPGlobal.dates.monthsShort[i++] + '</span>';\n    }\n    this.picker.find('.datepicker-months td').append(html);\n  },\n\n  fill() {\n    let d = new Date(this.viewDate);\n    let year = d.getFullYear();\n    let month = d.getMonth();\n    let currentDate = this.date.valueOf();\n    this.picker.find('.datepicker-days th:eq(1)')\n          .text(DPGlobal.dates.months[month] + ' ' + year);\n    const prevMonth = new Date(year, month - 1, 28, 0, 0, 0, 0);\n    const day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());\n    prevMonth.setDate(day);\n    prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7) % 7);\n    let nextMonth: any = new Date(prevMonth);\n    nextMonth.setDate(nextMonth.getDate() + 42);\n    nextMonth = nextMonth.valueOf();\n    let html: any = [];\n    let clsName;\n    let prevY;\n    let prevM;\n    while (prevMonth.valueOf() < nextMonth) {\n      if (prevMonth.getDay() === this.weekStart) {\n        html.push('<tr>');\n      }\n      clsName = this.onRender(prevMonth);\n      prevY = prevMonth.getFullYear();\n      prevM = prevMonth.getMonth();\n      if ((prevM < month && prevY === year) || prevY < year) {\n        clsName += ' old';\n      } else if ((prevM > month && prevY === year) || prevY > year) {\n        clsName += ' new';\n      }\n      if (prevMonth.valueOf() === currentDate) {\n        clsName += ' active';\n      }\n      html.push('<td class=\"day ' + clsName + '\">' + prevMonth.getDate() + '</td>');\n      if (prevMonth.getDay() === this.weekEnd) {\n        html.push('</tr>');\n      }\n      prevMonth.setDate(prevMonth.getDate() + 1);\n    }\n    this.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n    const currentYear = this.date.getFullYear();\n\n    var months = this.picker.find('.datepicker-months')\n          .find('th:eq(1)')\n            .text(year)\n            .end()\n          .find('span').removeClass('active');\n    if (currentYear === year) {\n      months.eq(this.date.getMonth()).addClass('active');\n    }\n\n    html = '';\n    year = parseInt((year / 10) + '', 10) * 10;\n    const yearCont = this.picker.find('.datepicker-years')\n              .find('th:eq(1)')\n                .text(year + '-' + (year + 9))\n                .end()\n              .find('td');\n    year -= 1;\n    for (let i = -1; i < 11; i++) {\n      html += '<span class=\"year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + '\">' + year + '</span>';\n      year += 1;\n    }\n    yearCont.html(html);\n  },\n\n  click(e) {\n    e.stopPropagation();\n    e.preventDefault();\n    const target = $(e.target).closest('span, td, th');\n    if (target.length === 1) {\n      if (target.is('.js-close')) {\n        this.hide();\n        return;\n      }\n      switch (target[0].nodeName.toLowerCase()) {\n      case 'th':\n        switch (target[0].className) {\n        case 'switch':\n          this.showMode(1);\n          break;\n        case 'prev':\n        case 'next':\n          this.viewDate['set' + DPGlobal.modes[this.viewMode].navFnc].call(\n            this.viewDate,\n            this.viewDate['get' + DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +\n            DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1)\n          );\n          this.fill();\n          this.set();\n          break;\n        }\n        break;\n      case 'span':\n        if (target.is('.month')) {\n          let month = target.parent().find('span').index(target);\n          this.viewDate.setMonth(month);\n        } else {\n          let year = parseInt(target.text(), 10) || 0;\n          this.viewDate.setFullYear(year);\n        }\n        if (this.viewMode !== 0) {\n          this.date = new Date(this.viewDate);\n          this.element.trigger({\n            type: 'changeDate',\n            date: this.date,\n            viewMode: DPGlobal.modes[this.viewMode].clsName\n          });\n        }\n        this.showMode(-1);\n        this.fill();\n        this.set();\n        break;\n      case 'td':\n        if (target.is('.day') && !target.is('.disabled')) {\n          const day = parseInt(target.text(), 10) || 1;\n          let month = this.viewDate.getMonth();\n          if (target.is('.old')) {\n            month -= 1;\n          } else if (target.is('.new')) {\n            month += 1;\n          }\n          let year = this.viewDate.getFullYear();\n          this.date = new Date(year, month, day, 0, 0, 0, 0);\n          this.viewDate = new Date(year, month, Math.min(28, day), 0, 0, 0, 0);\n          this.fill();\n          this.set();\n          this.element.trigger({\n            type: 'changeDate',\n            date: this.date,\n            viewMode: DPGlobal.modes[this.viewMode].clsName\n          });\n        }\n        break;\n      }\n    }\n  },\n\n  mousedown(e) {\n    e.stopPropagation();\n    e.preventDefault();\n  },\n\n  showMode(dir) {\n    if (dir) {\n      this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));\n    }\n    this.picker.find('>div').hide().filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName).show();\n  }\n};\n\n(Datepicker as any).create = function( element, option, val ) {\n  return element.each(function() {\n    let $this = $(this);\n    let data = $this.data('datepicker');\n    let options = typeof option === 'object' && option;\n    if (!data) {\n      $this.data('datepicker', (data = new Datepicker(this, $.extend({}, (Datepicker as any).defaults, options))));\n    }\n    if (typeof option === 'string') data[option](val);\n  });\n};\n\n(Datepicker as any).defaults = {\n  onRender() {\n    return '';\n  }\n};\n\nvar DPGlobal = {\n  modes: [\n    {\n      clsName: 'days',\n      navFnc: 'Month',\n      navStep: 1\n    },\n    {\n      clsName: 'months',\n      navFnc: 'FullYear',\n      navStep: 1\n    },\n    {\n      clsName: 'years',\n      navFnc: 'FullYear',\n      navStep: 10\n    }],\n  dates:{\n    days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],\n    daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n    daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],\n    months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n    monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n  },\n  isLeapYear(year) {\n    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n  },\n  getDaysInMonth(year, month) {\n    return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n  },\n  headTemplate: '<thead>' +\n            '<tr>' +\n              '<th class=\"prev\">&lsaquo;</th>' +\n              '<th colspan=\"5\" class=\"switch\"></th>' +\n              '<th class=\"next\">&rsaquo;</th>' +\n            '</tr>' +\n          '</thead>',\n  contTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n  footTemplate: '<span class=\"datepicker__close-button js-close\">close</span>'\n};\n(DPGlobal as any).template = '<div class=\"datepicker dropdown-menu\">' +\n            '<div class=\"datepicker-days\">' +\n              '<table class=\" table-condensed\">' +\n                DPGlobal.headTemplate +\n                '<tbody></tbody>' +\n              '</table>' +\n              DPGlobal.footTemplate +\n            '</div>' +\n            '<div class=\"datepicker-months\">' +\n              '<table class=\"table-condensed\">' +\n                DPGlobal.headTemplate +\n                DPGlobal.contTemplate +\n              '</table>' +\n              DPGlobal.footTemplate +\n            '</div>' +\n            '<div class=\"datepicker-years\">' +\n              '<table class=\"table-condensed\">' +\n                DPGlobal.headTemplate +\n                DPGlobal.contTemplate +\n              '</table>' +\n              DPGlobal.footTemplate +\n            '</div>' +\n          '</div>';\n\nexport default Datepicker;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/bootstrap-datepicker.ts","import React from 'react';\nimport NetworkHeader from './network/header';\n\ninterface IHeaderProps {\n  isNetwork?: boolean;\n  headerOptions?: object;\n  embedded?: boolean;\n  entity?: any;\n  report?: any;\n  reports?: any;\n}\n\nexport default class Header extends React.Component<IHeaderProps, any> {\n  render() {\n    if (this.props.headerOptions && this.props.embedded) {\n      if (this.props.isNetwork) {\n        return (\n          <NetworkHeader {...this.props} {...this.props.headerOptions} />\n        );\n      }\n\n      return (\n        <header className=\"ui-main__header\">\n          <nav className=\"ui-breadcrumbs\">\n            <a className=\"ui-breadcrumbs__item icon-app-reports\" href={'#' + this.props.entity.id + '/reports'}>\n              Reports\n            </a>\n            <span className=\"ui-breadcrumbs__item\">\n              {this.props.report.get('name')}\n            </span>\n          </nav>\n        </header>\n      );\n    }\n\n    return null;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header.tsx","import React from 'react';\n\nimport _str from 'underscore.string';\nimport * as Ovid from '@opengov/ovid';\nimport ReportActions from './actions/report_actions';\n\nimport SocialNetworking from './social_networking';\nimport { isEmbed } from './utils/embed_utils';\n\nclass Footer extends React.Component<any, any> {\n  showFeedback = e => {\n    e.preventDefault();\n    ReportActions.showFeedback();\n  }\n\n  showTos = e => {\n    e.preventDefault();\n    ReportActions.showTOS();\n  }\n\n  render() {\n    const name = this.props.entity.get('name');\n    const entityNameCapitalized = _str.capitalize(name);\n    const entityHashtag = name.split(' ').join('');\n    const entityUrl = this.props.entity.get('homepage_url');\n    return ( !isEmbed() &&\n      <footer className=\"footer\">\n        <a className=\"footer__logo\">\n          <Ovid.OpenGovLogo height={24}/>\n        </a>\n        <nav className=\"footer__nav\">\n          <a className=\"footer__nav__item\" href=\"http://opengov.com\" target=\"_blank\">About OpenGov</a>\n          <button id=\"entity-feedback\" className=\"footer__nav__item\" onClick={this.showFeedback} data-modal=\"feedback\">Contact {name}</button>\n          <a className=\"footer__nav__item\" href={entityUrl}>{entityNameCapitalized + \"'s\"} homepage</a>\n          <button id=\"tos\" className=\"footer__nav__item\" onClick={this.showTos} data-modal=\"tos\">Terms of Service</button>\n        </nav>\n        <div className=\"footer__social\">\n          <SocialNetworking entityHashtag={entityHashtag} />\n        </div>\n      </footer>\n    );\n  }\n}\n\nexport default Footer;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/footer.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _s from 'underscore.string';\n\nimport Autolinker from 'autolinker';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportDescription = createReactClass<any, any>({\n  propTypes: {\n    report: PropTypes.object.isRequired\n  },\n\n  render() {\n    const report = this.props.report;\n    let description = report.get('description');\n\n    if (!report.getIn(['properties', 'description_visible']) || !description) {\n      return null;\n    }\n\n    description = Autolinker.link(\n      _s.escapeHTML(description));\n\n    return (\n      <div className=\"report-description\" ref=\"description\">\n        <small dangerouslySetInnerHTML={{__html: description}} />\n      </div>\n    );\n  }\n});\n\nexport default ReportDescription;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_description.tsx","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { getDefaults, getI18n } from './context';\n\nvar removedIsInitialSSR = false;\n\nvar I18n = function (_Component) {\n  _inherits(I18n, _Component);\n\n  function I18n(props, context) {\n    _classCallCheck(this, I18n);\n\n    var _this = _possibleConstructorReturn(this, (I18n.__proto__ || Object.getPrototypeOf(I18n)).call(this, props, context));\n\n    _this.i18n = props.i18n || context.i18n || getI18n();\n    _this.namespaces = props.ns || _this.i18n.options && _this.i18n.options.defaultNS;\n    if (typeof _this.namespaces === 'string') _this.namespaces = [_this.namespaces];\n\n    var i18nOptions = _this.i18n && _this.i18n.options && _this.i18n.options.react || {};\n    _this.options = _extends({}, getDefaults(), i18nOptions, props);\n\n    // nextjs SSR: getting data from next.js or other ssr stack\n    if (props.initialI18nStore) {\n      _this.i18n.services.resourceStore.data = props.initialI18nStore;\n      _this.options.wait = false; // we got all passed down already\n    }\n    if (props.initialLanguage) {\n      _this.i18n.changeLanguage(props.initialLanguage);\n    }\n\n    // provider SSR: data was set in provider and ssr flag was set\n    if (_this.i18n.options && _this.i18n.options.isInitialSSR) {\n      _this.options.wait = false;\n    }\n\n    var language = _this.i18n.languages && _this.i18n.languages[0];\n    var ready = !!language && _this.namespaces.every(function (ns) {\n      return _this.i18n.hasResourceBundle(language, ns);\n    });\n\n    _this.state = {\n      i18nLoadedAt: null,\n      ready: ready\n    };\n\n    _this.t = _this.getI18nTranslate();\n\n    _this.onI18nChanged = _this.onI18nChanged.bind(_this);\n    _this.getI18nTranslate = _this.getI18nTranslate.bind(_this);\n    return _this;\n  }\n\n  _createClass(I18n, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return {\n        t: this.t,\n        i18n: this.i18n\n      };\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var bind = function bind() {\n        if (_this2.options.bindI18n && _this2.i18n) _this2.i18n.on(_this2.options.bindI18n, _this2.onI18nChanged);\n        if (_this2.options.bindStore && _this2.i18n.store) _this2.i18n.store.on(_this2.options.bindStore, _this2.onI18nChanged);\n      };\n\n      this.mounted = true;\n      this.i18n.loadNamespaces(this.namespaces, function () {\n        var ready = function ready() {\n          if (_this2.mounted && !_this2.state.ready) _this2.setState({ ready: true });\n          if (_this2.options.wait && _this2.mounted) bind();\n        };\n\n        if (_this2.i18n.isInitialized) {\n          ready();\n        } else {\n          var initialized = function initialized() {\n            // due to emitter removing issue in i18next we need to delay remove\n            setTimeout(function () {\n              _this2.i18n.off('initialized', initialized);\n            }, 1000);\n            ready();\n          };\n\n          _this2.i18n.on('initialized', initialized);\n        }\n      });\n\n      if (!this.options.wait) bind();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      var _this3 = this;\n\n      this.mounted = false;\n      if (this.onI18nChanged) {\n        if (this.options.bindI18n) {\n          var p = this.options.bindI18n.split(' ');\n          p.forEach(function (f) {\n            return _this3.i18n.off(f, _this3.onI18nChanged);\n          });\n        }\n        if (this.options.bindStore) {\n          var _p = this.options.bindStore.split(' ');\n          _p.forEach(function (f) {\n            return _this3.i18n.store && _this3.i18n.store.off(f, _this3.onI18nChanged);\n          });\n        }\n      }\n    }\n  }, {\n    key: 'onI18nChanged',\n    value: function onI18nChanged() {\n      if (!this.mounted) return;\n\n      this.t = this.getI18nTranslate();\n      this.setState({ i18nLoadedAt: new Date() }); // rerender\n    }\n  }, {\n    key: 'getI18nTranslate',\n    value: function getI18nTranslate() {\n      return this.i18n.getFixedT(null, this.options.nsMode === 'fallback' ? this.namespaces : this.namespaces[0]);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var children = this.props.children;\n      var ready = this.state.ready;\n\n\n      if (!ready && this.options.wait) return null;\n\n      // remove ssr flag set by provider - first render was done from now on wait if set to wait\n      if (this.i18n.options && this.i18n.options.isInitialSSR && !removedIsInitialSSR) {\n        removedIsInitialSSR = true;\n        setTimeout(function () {\n          delete _this4.i18n.options.isInitialSSR;\n        }, 100);\n      }\n\n      return children(this.t, {\n        i18n: this.i18n,\n        t: this.t,\n        ready: ready\n      });\n    }\n  }]);\n\n  return I18n;\n}(Component);\n\nexport default I18n;\n\n\nI18n.contextTypes = {\n  i18n: PropTypes.object\n};\n\nI18n.childContextTypes = {\n  t: PropTypes.func.isRequired,\n  i18n: PropTypes.object\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/I18n.js\n// module id = 523\n// module chunks = 0 1","import React from 'react';\nimport moment from 'moment';\n\nexport interface IReportUpdatedInfoProps {\n  description: string\n  timeStamp: string\n}\n\nclass ReportUpdatedInfo extends React.Component<IReportUpdatedInfoProps, any> {\n  render() {\n    return (\n      <small>{this.props.description}\n        <strong>{moment(this.props.timeStamp).format('D MMM, YYYY')}</strong>\n      </small>\n    );\n  }\n}\n\nexport default ReportUpdatedInfo\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/report_updated_info.tsx","import React from 'react';\nimport cx from 'classnames';\nimport utils from '../querygrid/utils';\n\n/**\n * Renders the current row count for a grid report.\n */\nimport createReactClass from 'create-react-class';\n\nexport const ReportHeaderRowCount = createReactClass<any, any>({\n  render() {\n    let { className, count, estimate, limit } = this.props;\n    let adj = '';\n    let countText = '';\n\n    if (count == null && estimate != null) {\n      adj = '~';\n      count = estimate;\n    }\n\n    if (count != null) {\n      countText = adj + utils.formatNumberComma(count);\n    }\n\n    const noResults = (\n      <span>\n        <b className=\"number-display_emphasize\">No Results</b>\n      </span>\n    );\n\n    const reachedLimit = (\n      <span>\n        Showing <span className=\"number-display_emphasize\">{utils.formatNumberComma(limit)}</span> out of\n        {' '}<span className=\"number-display_emphasize\">{countText}</span> rows\n      </span>\n    );\n\n    const lessThanLimit = (\n      <span>\n        Showing <span className=\"number-display_emphasize\">{countText}</span> rows\n      </span>\n    );\n\n    if (count == null && !countText) {\n      return null;\n    }\n\n    return (\n      <span className={cx('page-title__report-title', className)} data-test=\"grid-report-row-count\">\n        {count === 0 ? noResults : count > limit ? reachedLimit : lessThanLimit}\n      </span>\n    );\n  }\n});\n\nReportHeaderRowCount.defaultProps = {\n  limit: 1000\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/report_header_row_count.tsx","import React from 'react';\n\nexport default class ErrorContainer extends React.Component<any, any> {\n  render() {\n    return (\n      <div className=\"ui-alert-box whoops\">\n        <span className=\"icon-exclamation-1\" />\n        {this.props.message}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/error.tsx","import React from 'react';\n\nexport default class PanelData extends React.Component<any, any> {\n\n  render() {\n    const { column } = this.props;\n    const toggleColumnVisibility = (e) => this.props.toggleColumnVisibility(column, false, e);\n    const isVisible = column.get('visible');\n    return (\n      <li className={`drop-item js-column-toggle ${isVisible ? 'active' : ''}`}>\n        <div className=\"visibility-panel-data drop-item__bar\" onClick={toggleColumnVisibility}>\n          <span className=\"drop-item__text has-no-hover\">\n              {column.get('label')}\n          </span>\n        </div>\n        <div className=\"drop-item__buttons\" onClick={toggleColumnVisibility}>\n          <button role=\"checkbox\" className={`drop-item__checkbox ${ isVisible ? 'checked' : '' }`}>\n            <i className=\"fonticon checkmark-icon\"></i>\n          </button>\n        </div>\n      </li>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/panel_data.tsx","import React from 'react';\n\nexport default class PanelHeader extends React.Component<any, any> {\n  render() {\n    return (\n      <div>\n        {this.props.panelType == 'Amount' ?\n          <div className=\"visibility-panel-header\">Select the <strong>amount</strong> columns from the dataset that can be shown as amount totals in the report.</div>\n          : <div className=\"visibility-panel-header\">Select the <strong>text</strong> columns from the dataset that can be used to breakdown or pivot the report.</div>\n        }\n        <div className=\"visibility-panel-button ui-button small no-color\" onClick={this.props.toggleAllColumnVisibility}>\n          <i className=\"fonticon icon-confirm-1\"></i>\n          All\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/panel_header.tsx","import classNames from 'classnames';\n\n//Creates the footer class with isEditingDefaultState\nexport const getFooterClass = (isEditingDefaultState) => {\n  return ( classNames(\n    'ui-panel__footer',\n    {\n      'editing_default_state': isEditingDefaultState\n    })\n  );\n};\n\n//Creates the visibility panel class with isEditingDefaultState\nexport const getVisibilityPanelClass = (isEditingDefaultState) => {\n  return ( classNames(\n    'visibility-panel',\n    'ui-container_scroll',\n    'ui-panel__content',\n    {\n      'editing_default_state': isEditingDefaultState\n    })\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/visibility_utils.tsx","//[dz] shim all of highcharts functionality and modules, ensuring we load highcharts once (avoiding hc error 16)\n//note: all specific extending of Highcharts functionality is done when instantiating library (see graph.js)\nimport Highcharts from 'highcharts/highcharts.src';\n\nimport treemapModule from 'highcharts/modules/treemap.src';\nimport exportModule from 'highcharts/modules/exporting.src';\nimport patternFill from './vendor/highcharts-pattern-fill';\n\ntreemapModule(Highcharts);\nexportModule(Highcharts);\npatternFill(Highcharts);\n\nexport default Highcharts;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/highcharts_og/highcharts-shim.ts","/*\n Highcharts JS v8.1.2 (2020-06-16)\n\n (c) 2009-2018 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(T,O){\"object\"===typeof module&&module.exports?(O[\"default\"]=O,module.exports=T.document?O(T):O):\"function\"===typeof define&&define.amd?define(\"highcharts/highcharts\",function(){return O(T)}):(T.Highcharts&&T.Highcharts.error(16,!0),T.Highcharts=O(T))})(\"undefined\"!==typeof window?window:this,function(T){function O(g,c,R,y){g.hasOwnProperty(c)||(g[c]=y.apply(null,R))}var q={};O(q,\"parts/Globals.js\",[],function(){var g=\"undefined\"!==typeof T?T:\"undefined\"!==typeof window?window:{},c=g.document,\nR=g.navigator&&g.navigator.userAgent||\"\",y=c&&c.createElementNS&&!!c.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect,q=/(edge|msie|trident)/i.test(R)&&!g.opera,H=-1!==R.indexOf(\"Firefox\"),D=-1!==R.indexOf(\"Chrome\"),J=H&&4>parseInt(R.split(\"Firefox/\")[1],10);return{product:\"Highcharts\",version:\"8.1.2\",deg2rad:2*Math.PI/360,doc:c,hasBidiBug:J,hasTouch:!!g.TouchEvent,isMS:q,isWebKit:-1!==R.indexOf(\"AppleWebKit\"),isFirefox:H,isChrome:D,isSafari:!D&&-1!==R.indexOf(\"Safari\"),isTouchDevice:/(Mobile|Android|Windows Phone)/.test(R),\nSVG_NS:\"http://www.w3.org/2000/svg\",chartCount:0,seriesTypes:{},symbolSizes:{},svg:y,win:g,marginNames:[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"],noop:function(){},charts:[],dateFormats:{}}});O(q,\"parts/Utilities.js\",[q[\"parts/Globals.js\"]],function(g){function c(b,h,e,z){var a=h?\"Highcharts error\":\"Highcharts warning\";32===b&&(b=a+\": Deprecated member\");var x=I(b),f=x?a+\" #\"+b+\": www.highcharts.com/errors/\"+b+\"/\":b.toString();a=function(){if(h)throw Error(f);G.console&&-1===c.messages.indexOf(f)&&\nconsole.log(f)};if(\"undefined\"!==typeof z){var d=\"\";x&&(f+=\"?\");W(z,function(b,h){d+=\"\\n - \"+h+\": \"+b;x&&(f+=encodeURI(h)+\"=\"+encodeURI(b))});f+=d}e?da(e,\"displayError\",{code:b,message:f,params:z},a):a();c.messages.push(f)}function R(){var b,h=arguments,e={},z=function(b,h){\"object\"!==typeof b&&(b={});W(h,function(e,a){!y(e,!0)||C(e)||r(e)?b[a]=h[a]:b[a]=z(b[a]||{},e)});return b};!0===h[0]&&(e=h[1],h=Array.prototype.slice.call(h,2));var a=h.length;for(b=0;b<a;b++)e=z(e,h[b]);return e}function y(b,\nh){return!!b&&\"object\"===typeof b&&(!h||!n(b))}function q(b,h,e){var a;K(h)?m(e)?b.setAttribute(h,e):b&&b.getAttribute&&((a=b.getAttribute(h))||\"class\"!==h||(a=b.getAttribute(h+\"Name\"))):W(h,function(h,e){b.setAttribute(e,h)});return a}function H(){for(var b=arguments,h=b.length,e=0;e<h;e++){var a=b[e];if(\"undefined\"!==typeof a&&null!==a)return a}}function D(b,h){if(!b)return h;var e=b.split(\".\").reverse();if(1===e.length)return h[b];for(b=e.pop();\"undefined\"!==typeof b&&\"undefined\"!==typeof h&&null!==\nh;)h=h[b],b=e.pop();return h}g.timers=[];var J=g.charts,t=g.doc,G=g.win;(c||(c={})).messages=[];g.error=c;var L=function(){function b(b,h,e){this.options=h;this.elem=b;this.prop=e}b.prototype.dSetter=function(){var b=this.paths,h=b&&b[0];b=b&&b[1];var e=[],a=this.now||0;if(1!==a&&h&&b)if(h.length===b.length&&1>a)for(var z=0;z<b.length;z++){for(var x=h[z],f=b[z],d=[],k=0;k<f.length;k++){var N=x[k],l=f[k];d[k]=\"number\"===typeof N&&\"number\"===typeof l&&(\"A\"!==f[0]||4!==k&&5!==k)?N+a*(l-N):l}e.push(d)}else e=\nb;else e=this.toD||[];this.elem.attr(\"d\",e,void 0,!0)};b.prototype.update=function(){var b=this.elem,h=this.prop,e=this.now,a=this.options.step;if(this[h+\"Setter\"])this[h+\"Setter\"]();else b.attr?b.element&&b.attr(h,e,null,!0):b.style[h]=e+this.unit;a&&a.call(b,e,this)};b.prototype.run=function(b,h,e){var a=this,z=a.options,x=function(b){return x.stopped?!1:a.step(b)},f=G.requestAnimationFrame||function(b){setTimeout(b,13)},d=function(){for(var b=0;b<g.timers.length;b++)g.timers[b]()||g.timers.splice(b--,\n1);g.timers.length&&f(d)};b!==h||this.elem[\"forceAnimate:\"+this.prop]?(this.startTime=+new Date,this.start=b,this.end=h,this.unit=e,this.now=this.start,this.pos=0,x.elem=this.elem,x.prop=this.prop,x()&&1===g.timers.push(x)&&f(d)):(delete z.curAnim[this.prop],z.complete&&0===Object.keys(z.curAnim).length&&z.complete.call(this.elem))};b.prototype.step=function(b){var h=+new Date,e=this.options,a=this.elem,z=e.complete,x=e.duration,f=e.curAnim;if(a.attr&&!a.element)b=!1;else if(b||h>=x+this.startTime){this.now=\nthis.end;this.pos=1;this.update();var d=f[this.prop]=!0;W(f,function(b){!0!==b&&(d=!1)});d&&z&&z.call(a);b=!1}else this.pos=e.easing((h-this.startTime)/x),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b};b.prototype.initPath=function(b,h,e){function a(b,h){for(;b.length<u;){var e=b[0],a=h[u-b.length];a&&\"M\"===e[0]&&(b[0]=\"C\"===a[0]?[\"C\",e[1],e[2],e[1],e[2],e[1],e[2]]:[\"L\",e[1],e[2]]);b.unshift(e);d&&b.push(b[b.length-1])}}function z(b,h){for(;b.length<u;)if(h=b[b.length/\nk-1].slice(),\"C\"===h[0]&&(h[1]=h[5],h[2]=h[6]),d){var e=b[b.length/k].slice();b.splice(b.length/2,0,h,e)}else b.push(h)}var x=b.startX,f=b.endX;h=h&&h.slice();e=e.slice();var d=b.isArea,k=d?2:1;if(!h)return[e,e];if(x&&f){for(b=0;b<x.length;b++)if(x[b]===f[0]){var N=b;break}else if(x[0]===f[f.length-x.length+b]){N=b;var l=!0;break}else if(x[x.length-1]===f[f.length-x.length+b]){N=x.length-b;break}\"undefined\"===typeof N&&(h=[])}if(h.length&&I(N)){var u=e.length+N*k;l?(a(h,e),z(e,h)):(a(e,h),z(h,e))}return[h,\ne]};b.prototype.fillSetter=function(){b.prototype.strokeSetter.apply(this,arguments)};b.prototype.strokeSetter=function(){this.elem.attr(this.prop,g.color(this.start).tweenTo(g.color(this.end),this.pos),null,!0)};return b}();g.Fx=L;g.merge=R;var v=g.pInt=function(b,h){return parseInt(b,h||10)},K=g.isString=function(b){return\"string\"===typeof b},n=g.isArray=function(b){b=Object.prototype.toString.call(b);return\"[object Array]\"===b||\"[object Array Iterator]\"===b};g.isObject=y;var r=g.isDOMElement=function(b){return y(b)&&\n\"number\"===typeof b.nodeType},C=g.isClass=function(b){var h=b&&b.constructor;return!(!y(b,!0)||r(b)||!h||!h.name||\"Object\"===h.name)},I=g.isNumber=function(b){return\"number\"===typeof b&&!isNaN(b)&&Infinity>b&&-Infinity<b},p=g.erase=function(b,h){for(var e=b.length;e--;)if(b[e]===h){b.splice(e,1);break}},m=g.defined=function(b){return\"undefined\"!==typeof b&&null!==b};g.attr=q;var d=g.splat=function(b){return n(b)?b:[b]},l=g.syncTimeout=function(b,h,e){if(0<h)return setTimeout(b,h,e);b.call(0,e);return-1},\nk=g.clearTimeout=function(b){m(b)&&clearTimeout(b)},f=g.extend=function(b,h){var e;b||(b={});for(e in h)b[e]=h[e];return b};g.pick=H;var a=g.css=function(b,h){g.isMS&&!g.svg&&h&&\"undefined\"!==typeof h.opacity&&(h.filter=\"alpha(opacity=\"+100*h.opacity+\")\");f(b.style,h)},A=g.createElement=function(b,h,e,z,x){b=t.createElement(b);h&&f(b,h);x&&a(b,{padding:\"0\",border:\"none\",margin:\"0\"});e&&a(b,e);z&&z.appendChild(b);return b},u=g.extendClass=function(b,h){var e=function(){};e.prototype=new b;f(e.prototype,\nh);return e},E=g.pad=function(b,h,e){return Array((h||2)+1-String(b).replace(\"-\",\"\").length).join(e||\"0\")+b},P=g.relativeLength=function(b,h,e){return/%$/.test(b)?h*parseFloat(b)/100+(e||0):parseFloat(b)},w=g.wrap=function(b,h,e){var a=b[h];b[h]=function(){var b=Array.prototype.slice.call(arguments),h=arguments,z=this;z.proceed=function(){a.apply(z,arguments.length?arguments:h)};b.unshift(a);b=e.apply(this,b);z.proceed=null;return b}},M=g.format=function(b,h,e){var a=\"{\",z=!1,x=[],f=/f$/,d=/\\.([0-9])/,\nk=g.defaultOptions.lang,N=e&&e.time||g.time;for(e=e&&e.numberFormatter||Y;b;){var l=b.indexOf(a);if(-1===l)break;var u=b.slice(0,l);if(z){u=u.split(\":\");a=D(u.shift()||\"\",h);if(u.length&&\"number\"===typeof a)if(u=u.join(\":\"),f.test(u)){var m=parseInt((u.match(d)||[\"\",\"-1\"])[1],10);null!==a&&(a=e(a,m,k.decimalPoint,-1<u.indexOf(\",\")?k.thousandsSep:\"\"))}else a=N.dateFormat(u,a);x.push(a)}else x.push(u);b=b.slice(l+1);a=(z=!z)?\"}\":\"{\"}x.push(b);return x.join(\"\")},F=g.getMagnitude=function(b){return Math.pow(10,\nMath.floor(Math.log(b)/Math.LN10))},Q=g.normalizeTickInterval=function(b,h,e,a,z){var x=b;e=H(e,1);var f=b/e;h||(h=z?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===a&&(1===e?h=h.filter(function(b){return 0===b%1}):.1>=e&&(h=[1/e])));for(a=0;a<h.length&&!(x=h[a],z&&x*e>=b||!z&&f<=(h[a]+(h[a+1]||h[a]))/2);a++);return x=N(x*e,-Math.round(Math.log(.001)/Math.LN10))},e=g.stableSort=function(b,h){var e=b.length,a,z;for(z=0;z<e;z++)b[z].safeI=z;b.sort(function(b,e){a=h(b,e);return 0===a?b.safeI-e.safeI:\na});for(z=0;z<e;z++)delete b[z].safeI},b=g.arrayMin=function(b){for(var h=b.length,e=b[0];h--;)b[h]<e&&(e=b[h]);return e},h=g.arrayMax=function(b){for(var h=b.length,e=b[0];h--;)b[h]>e&&(e=b[h]);return e},z=g.destroyObjectProperties=function(b,h){W(b,function(e,a){e&&e!==h&&e.destroy&&e.destroy();delete b[a]})},x=g.discardElement=function(b){var h=g.garbageBin;h||(h=A(\"div\"));b&&h.appendChild(b);h.innerHTML=\"\"},N=g.correctFloat=function(b,h){return parseFloat(b.toPrecision(h||14))},aa=g.setAnimation=\nfunction(b,h){h.renderer.globalAnimation=H(b,h.options.chart.animation,!0)},Z=g.animObject=function(b){return y(b)?R(b):{duration:b?500:0}},V=g.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5},Y=g.numberFormat=function(b,h,e,a){b=+b||0;h=+h;var z=g.defaultOptions.lang,x=(b.toString().split(\".\")[1]||\"\").split(\"e\")[0].length,f=b.toString().split(\"e\");if(-1===h)h=Math.min(x,20);else if(!I(h))h=2;else if(h&&f[1]&&0>f[1]){var d=h+ +f[1];0<=d?(f[0]=\n(+f[0]).toExponential(d).split(\"e\")[0],h=d):(f[0]=f[0].split(\".\")[0]||0,b=20>h?(f[0]*Math.pow(10,f[1])).toFixed(h):0,f[1]=0)}var k=(Math.abs(f[1]?f[0]:b)+Math.pow(10,-Math.max(h,x)-1)).toFixed(h);x=String(v(k));d=3<x.length?x.length%3:0;e=H(e,z.decimalPoint);a=H(a,z.thousandsSep);b=(0>b?\"-\":\"\")+(d?x.substr(0,d)+a:\"\");b+=x.substr(d).replace(/(\\d{3})(?=\\d)/g,\"$1\"+a);h&&(b+=e+k.slice(-h));f[1]&&0!==+b&&(b+=\"e\"+f[1]);return b};Math.easeInOutSine=function(b){return-.5*(Math.cos(Math.PI*b)-1)};var ba=g.getStyle=\nfunction(b,h,e){if(\"width\"===h)return h=Math.min(b.offsetWidth,b.scrollWidth),e=b.getBoundingClientRect&&b.getBoundingClientRect().width,e<h&&e>=h-1&&(h=Math.floor(e)),Math.max(0,h-g.getStyle(b,\"padding-left\")-g.getStyle(b,\"padding-right\"));if(\"height\"===h)return Math.max(0,Math.min(b.offsetHeight,b.scrollHeight)-g.getStyle(b,\"padding-top\")-g.getStyle(b,\"padding-bottom\"));G.getComputedStyle||c(27,!0);if(b=G.getComputedStyle(b,void 0))b=b.getPropertyValue(h),H(e,\"opacity\"!==h)&&(b=v(b));return b},\nU=g.inArray=function(b,h,e){c(32,!1,void 0,{\"Highcharts.inArray\":\"use Array.indexOf\"});return h.indexOf(b,e)},X=g.find=Array.prototype.find?function(b,h){return b.find(h)}:function(b,h){var e,a=b.length;for(e=0;e<a;e++)if(h(b[e],e))return b[e]};g.keys=function(b){c(32,!1,void 0,{\"Highcharts.keys\":\"use Object.keys\"});return Object.keys(b)};var ia=g.offset=function(b){var h=t.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0};return{top:b.top+(G.pageYOffset||h.scrollTop)-\n(h.clientTop||0),left:b.left+(G.pageXOffset||h.scrollLeft)-(h.clientLeft||0)}},S=g.stop=function(b,h){for(var e=g.timers.length;e--;)g.timers[e].elem!==b||h&&h!==g.timers[e].prop||(g.timers[e].stopped=!0)},W=g.objectEach=function(b,h,e){for(var a in b)Object.hasOwnProperty.call(b,a)&&h.call(e||b[a],b[a],a,b)};W({map:\"map\",each:\"forEach\",grep:\"filter\",reduce:\"reduce\",some:\"some\"},function(b,h){g[h]=function(e){var a;c(32,!1,void 0,(a={},a[\"Highcharts.\"+h]=\"use Array.\"+b,a));return Array.prototype[b].apply(e,\n[].slice.call(arguments,1))}});var ja=g.addEvent=function(b,h,e,a){void 0===a&&(a={});var z=b.addEventListener||g.addEventListenerPolyfill;var x=\"function\"===typeof b&&b.prototype?b.prototype.protoEvents=b.prototype.protoEvents||{}:b.hcEvents=b.hcEvents||{};g.Point&&b instanceof g.Point&&b.series&&b.series.chart&&(b.series.chart.runTrackerClick=!0);z&&z.call(b,h,e,!1);x[h]||(x[h]=[]);x[h].push({fn:e,order:\"number\"===typeof a.order?a.order:Infinity});x[h].sort(function(b,h){return b.order-h.order});\nreturn function(){ea(b,h,e)}},ea=g.removeEvent=function(b,h,e){function a(h,e){var a=b.removeEventListener||g.removeEventListenerPolyfill;a&&a.call(b,h,e,!1)}function z(e){var z;if(b.nodeName){if(h){var x={};x[h]=!0}else x=e;W(x,function(b,h){if(e[h])for(z=e[h].length;z--;)a(h,e[h][z].fn)})}}var x;[\"protoEvents\",\"hcEvents\"].forEach(function(f,d){var k=(d=d?b:b.prototype)&&d[f];k&&(h?(x=k[h]||[],e?(k[h]=x.filter(function(b){return e!==b.fn}),a(h,e)):(z(k),k[h]=[])):(z(k),d[f]={}))})},da=g.fireEvent=\nfunction(b,h,e,a){var z;e=e||{};if(t.createEvent&&(b.dispatchEvent||b.fireEvent)){var x=t.createEvent(\"Events\");x.initEvent(h,!0,!0);f(x,e);b.dispatchEvent?b.dispatchEvent(x):b.fireEvent(h,x)}else e.target||f(e,{preventDefault:function(){e.defaultPrevented=!0},target:b,type:h}),function(h,a){void 0===h&&(h=[]);void 0===a&&(a=[]);var x=0,f=0,d=h.length+a.length;for(z=0;z<d;z++)!1===(h[x]?a[f]?h[x].order<=a[f].order?h[x++]:a[f++]:h[x++]:a[f++]).fn.call(b,e)&&e.preventDefault()}(b.protoEvents&&b.protoEvents[h],\nb.hcEvents&&b.hcEvents[h]);a&&!e.defaultPrevented&&a.call(b,e)},ka=g.animate=function(b,h,e){var a,z=\"\",x,f;if(!y(e)){var d=arguments;e={duration:d[2],easing:d[3],complete:d[4]}}I(e.duration)||(e.duration=400);e.easing=\"function\"===typeof e.easing?e.easing:Math[e.easing]||Math.easeInOutSine;e.curAnim=R(h);W(h,function(d,k){S(b,k);f=new L(b,e,k);x=null;\"d\"===k&&n(h.d)?(f.paths=f.initPath(b,b.pathArray,h.d),f.toD=h.d,a=0,x=1):b.attr?a=b.attr(k):(a=parseFloat(ba(b,k))||0,\"opacity\"!==k&&(z=\"px\"));x||\n(x=d);x&&x.match&&x.match(\"px\")&&(x=x.replace(/px/g,\"\"));f.run(a,x,z)})},la=g.seriesType=function(b,h,e,a,x){var z=fa(),f=g.seriesTypes;z.plotOptions[b]=R(z.plotOptions[h],e);f[b]=u(f[h]||function(){},a);f[b].prototype.type=b;x&&(f[b].prototype.pointClass=u(g.Point,x));return f[b]},ca,ha=g.uniqueKey=function(){var b=Math.random().toString(36).substring(2,9)+\"-\",h=0;return function(){return\"highcharts-\"+(ca?\"\":b)+h++}}(),ma=g.useSerialIds=function(b){return ca=H(b,ca)},O=g.isFunction=function(b){return\"function\"===\ntypeof b},fa=g.getOptions=function(){return g.defaultOptions},na=g.setOptions=function(b){g.defaultOptions=R(!0,g.defaultOptions,b);(b.time||b.global)&&g.time.update(R(g.defaultOptions.global,g.defaultOptions.time,b.global,b.time));return g.defaultOptions};G.jQuery&&(G.jQuery.fn.highcharts=function(){var b=[].slice.call(arguments);if(this[0])return b[0]?(new (g[K(b[0])?b.shift():\"Chart\"])(this[0],b[0],b[1]),this):J[q(this[0],\"data-highcharts-chart\")]});return{Fx:g.Fx,addEvent:ja,animate:ka,animObject:Z,\narrayMax:h,arrayMin:b,attr:q,clamp:function(b,h,e){return b>h?b<e?b:e:h},clearTimeout:k,correctFloat:N,createElement:A,css:a,defined:m,destroyObjectProperties:z,discardElement:x,erase:p,error:c,extend:f,extendClass:u,find:X,fireEvent:da,format:M,getMagnitude:F,getNestedProperty:D,getOptions:fa,getStyle:ba,inArray:U,isArray:n,isClass:C,isDOMElement:r,isFunction:O,isNumber:I,isObject:y,isString:K,merge:R,normalizeTickInterval:Q,numberFormat:Y,objectEach:W,offset:ia,pad:E,pick:H,pInt:v,relativeLength:P,\nremoveEvent:ea,seriesType:la,setAnimation:aa,setOptions:na,splat:d,stableSort:e,stop:S,syncTimeout:l,timeUnits:V,uniqueKey:ha,useSerialIds:ma,wrap:w}});O(q,\"parts/Color.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var R=c.isNumber,y=c.merge,q=c.pInt;c=function(){function c(g){this.parsers=[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(c){return[q(c[1]),q(c[2]),q(c[3]),parseFloat(c[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\nparse:function(c){return[q(c[1]),q(c[2]),q(c[3]),1]}}];this.rgba=[];if(!(this instanceof c))return new c(g);this.init(g)}c.parse=function(g){return new c(g)};c.prototype.init=function(g){var J,t;if((this.input=g=c.names[g&&g.toLowerCase?g.toLowerCase():\"\"]||g)&&g.stops)this.stops=g.stops.map(function(v){return new c(v[1])});else{if(g&&g.charAt&&\"#\"===g.charAt()){var G=g.length;g=parseInt(g.substr(1),16);7===G?J=[(g&16711680)>>16,(g&65280)>>8,g&255,1]:4===G&&(J=[(g&3840)>>4|(g&3840)>>8,(g&240)>>4|\ng&240,(g&15)<<4|g&15,1])}if(!J)for(t=this.parsers.length;t--&&!J;){var L=this.parsers[t];(G=L.regex.exec(g))&&(J=L.parse(G))}}this.rgba=J||[]};c.prototype.get=function(c){var g=this.input,t=this.rgba;if(\"undefined\"!==typeof this.stops){var G=y(g);G.stops=[].concat(G.stops);this.stops.forEach(function(g,v){G.stops[v]=[G.stops[v][0],g.get(c)]})}else G=t&&R(t[0])?\"rgb\"===c||!c&&1===t[3]?\"rgb(\"+t[0]+\",\"+t[1]+\",\"+t[2]+\")\":\"a\"===c?t[3]:\"rgba(\"+t.join(\",\")+\")\":g;return G};c.prototype.brighten=function(c){var g,\nt=this.rgba;if(this.stops)this.stops.forEach(function(g){g.brighten(c)});else if(R(c)&&0!==c)for(g=0;3>g;g++)t[g]+=q(255*c),0>t[g]&&(t[g]=0),255<t[g]&&(t[g]=255);return this};c.prototype.setOpacity=function(c){this.rgba[3]=c;return this};c.prototype.tweenTo=function(c,g){var t=this.rgba,G=c.rgba;G.length&&t&&t.length?(c=1!==G[3]||1!==t[3],g=(c?\"rgba(\":\"rgb(\")+Math.round(G[0]+(t[0]-G[0])*(1-g))+\",\"+Math.round(G[1]+(t[1]-G[1])*(1-g))+\",\"+Math.round(G[2]+(t[2]-G[2])*(1-g))+(c?\",\"+(G[3]+(t[3]-G[3])*(1-\ng)):\"\")+\")\"):g=c.input||\"none\";return g};c.names={white:\"#ffffff\",black:\"#000000\"};return c}();g.Color=c;g.color=c.parse;return g.Color});O(q,\"parts/SVGElement.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){var y=c.deg2rad,B=c.doc,H=c.hasTouch,D=c.isFirefox,J=c.noop,t=c.svg,G=c.SVG_NS,L=c.win,v=q.animate,K=q.animObject,n=q.attr,r=q.createElement,C=q.css,I=q.defined,p=q.erase,m=q.extend,d=q.fireEvent,l=q.isArray,k=q.isFunction,f=q.isNumber,a=q.isString,A=q.merge,\nu=q.objectEach,E=q.pick,P=q.pInt,w=q.stop,M=q.uniqueKey;\"\";q=function(){function F(){this.height=this.element=void 0;this.opacity=1;this.renderer=void 0;this.SVG_NS=G;this.symbolCustomAttribs=\"x y width height r start end innerR anchorX anchorY rounded\".split(\" \");this.width=void 0}F.prototype._defaultGetter=function(a){a=E(this[a+\"Value\"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a};F.prototype._defaultSetter=function(a,e,b){b.setAttribute(e,\na)};F.prototype.add=function(a){var e=this.renderer,b=this.element;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;\"undefined\"!==typeof this.textStr&&\"text\"===this.element.nodeName&&e.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)var h=this.zIndexSetter();h||(a?a.element:e.box).appendChild(b);if(this.onAdd)this.onAdd();return this};F.prototype.addClass=function(a,e){var b=e?\"\":this.attr(\"class\")||\"\";a=(a||\"\").split(/ /g).reduce(function(h,e){-1===b.indexOf(e)&&h.push(e);return h},\nb?[b]:[]).join(\" \");a!==b&&this.attr(\"class\",a);return this};F.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};F.prototype.align=function(f,e,b){var h,z={};var x=this.renderer;var d=x.alignedObjects;var k,l;if(f){if(this.alignOptions=f,this.alignByTranslate=e,!b||a(b))this.alignTo=h=b||\"renderer\",p(d,this),d.push(this),b=void 0}else f=this.alignOptions,e=this.alignByTranslate,h=this.alignTo;b=E(b,x[h],x);h=f.align;x=f.verticalAlign;d=(b.x||0)+(f.x||\n0);var u=(b.y||0)+(f.y||0);\"right\"===h?k=1:\"center\"===h&&(k=2);k&&(d+=(b.width-(f.width||0))/k);z[e?\"translateX\":\"x\"]=Math.round(d);\"bottom\"===x?l=1:\"middle\"===x&&(l=2);l&&(u+=(b.height-(f.height||0))/l);z[e?\"translateY\":\"y\"]=Math.round(u);this[this.placed?\"animate\":\"attr\"](z);this.placed=!0;this.alignAttr=z;return this};F.prototype.alignSetter=function(a){var e={left:\"start\",center:\"middle\",right:\"end\"};e[a]&&(this.alignValue=a,this.element.setAttribute(\"text-anchor\",e[a]))};F.prototype.animate=\nfunction(a,e,b){var h=K(E(e,this.renderer.globalAnimation,!0));E(B.hidden,B.msHidden,B.webkitHidden,!1)&&(h.duration=0);0!==h.duration?(b&&(h.complete=b),v(this,a,h)):(this.attr(a,void 0,b),u(a,function(b,e){h.step&&h.step.call(this,b,{prop:e,pos:1})},this));return this};F.prototype.applyTextOutline=function(a){var e=this.element,b;-1!==a.indexOf(\"contrast\")&&(a=a.replace(/contrast/g,this.renderer.getContrast(e.style.fill)));a=a.split(\" \");var h=a[a.length-1];if((b=a[0])&&\"none\"!==b&&c.svg){this.fakeTS=\n!0;a=[].slice.call(e.getElementsByTagName(\"tspan\"));this.ySetter=this.xSetter;b=b.replace(/(^[\\d\\.]+)(.*?)$/g,function(b,h,e){return 2*h+e});this.removeTextOutline(a);var z=e.textContent?/^[\\u0591-\\u065F\\u066A-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC]/.test(e.textContent):!1;var x=e.firstChild;a.forEach(function(a,f){0===f&&(a.setAttribute(\"x\",e.getAttribute(\"x\")),f=e.getAttribute(\"y\"),a.setAttribute(\"y\",f||0),null===f&&e.setAttribute(\"y\",0));f=a.cloneNode(!0);n(z&&!D?a:f,{\"class\":\"highcharts-text-outline\",\nfill:h,stroke:h,\"stroke-width\":b,\"stroke-linejoin\":\"round\"});e.insertBefore(f,x)});z&&D&&a[0]&&(a=a[0].cloneNode(!0),a.textContent=\" \",e.insertBefore(a,x))}};F.prototype.attr=function(a,e,b,h){var z=this.element,x,f=this,d,k,l=this.symbolCustomAttribs;if(\"string\"===typeof a&&\"undefined\"!==typeof e){var m=a;a={};a[m]=e}\"string\"===typeof a?f=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,z):(u(a,function(b,e){d=!1;h||w(this,e);this.symbolName&&-1!==l.indexOf(e)&&(x||(this.symbolAttr(a),x=!0),d=\n!0);!this.rotation||\"x\"!==e&&\"y\"!==e||(this.doTransform=!0);d||(k=this[e+\"Setter\"]||this._defaultSetter,k.call(this,b,e,z),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(e)&&this.updateShadows(e,b,k))},this),this.afterSetters());b&&b.call(this);return f};F.prototype.clip=function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")};F.prototype.crisp=function(a,e){e=e||a.strokeWidth||0;var b=Math.round(e)%2/2;a.x=Math.floor(a.x||\nthis.x||0)+b;a.y=Math.floor(a.y||this.y||0)+b;a.width=Math.floor((a.width||this.width||0)-2*b);a.height=Math.floor((a.height||this.height||0)-2*b);I(a.strokeWidth)&&(a.strokeWidth=e);return a};F.prototype.complexColor=function(a,e,b){var h=this.renderer,z,x,f,k,m,p,w,C,Q,r,E=[],S;d(this.renderer,\"complexColor\",{args:arguments},function(){a.radialGradient?x=\"radialGradient\":a.linearGradient&&(x=\"linearGradient\");if(x){f=a[x];m=h.gradients;p=a.stops;Q=b.radialReference;l(f)&&(a[x]=f={x1:f[0],y1:f[1],\nx2:f[2],y2:f[3],gradientUnits:\"userSpaceOnUse\"});\"radialGradient\"===x&&Q&&!I(f.gradientUnits)&&(k=f,f=A(f,h.getRadialAttr(Q,k),{gradientUnits:\"userSpaceOnUse\"}));u(f,function(b,h){\"id\"!==h&&E.push(h,b)});u(p,function(b){E.push(b)});E=E.join(\",\");if(m[E])r=m[E].attr(\"id\");else{f.id=r=M();var d=m[E]=h.createElement(x).attr(f).add(h.defs);d.radAttr=k;d.stops=[];p.forEach(function(b){0===b[1].indexOf(\"rgba\")?(z=g.parse(b[1]),w=z.get(\"rgb\"),C=z.get(\"a\")):(w=b[1],C=1);b=h.createElement(\"stop\").attr({offset:b[0],\n\"stop-color\":w,\"stop-opacity\":C}).add(d);d.stops.push(b)})}S=\"url(\"+h.url+\"#\"+r+\")\";b.setAttribute(e,S);b.gradient=E;a.toString=function(){return S}}})};F.prototype.css=function(a){var e=this.styles,b={},h=this.element,z=\"\",x=!e,f=[\"textOutline\",\"textOverflow\",\"width\"];a&&a.color&&(a.fill=a.color);e&&u(a,function(h,a){e&&e[a]!==h&&(b[a]=h,x=!0)});if(x){e&&(a=m(e,b));if(a)if(null===a.width||\"auto\"===a.width)delete this.textWidth;else if(\"text\"===h.nodeName.toLowerCase()&&a.width)var d=this.textWidth=\nP(a.width);this.styles=a;d&&!t&&this.renderer.forExport&&delete a.width;if(h.namespaceURI===this.SVG_NS){var k=function(b,h){return\"-\"+h.toLowerCase()};u(a,function(b,h){-1===f.indexOf(h)&&(z+=h.replace(/([A-Z])/g,k)+\":\"+b+\";\")});z&&n(h,\"style\",z)}else C(h,a);this.added&&(\"text\"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline))}return this};F.prototype.dashstyleSetter=function(a){var e=this[\"stroke-width\"];\"inherit\"===e&&(e=1);if(a=a&&a.toLowerCase()){var b=\na.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(a=b.length;a--;)b[a]=\"\"+P(b[a])*E(e,NaN);a=b.join(\",\").replace(/NaN/g,\"none\");this.element.setAttribute(\"stroke-dasharray\",a)}};F.prototype.destroy=function(){var a=this,e=a.element||{},b=a.renderer,h=b.isSVG&&\"SPAN\"===e.nodeName&&a.parentGroup||void 0,z=e.ownerSVGElement;\ne.onclick=e.onmouseout=e.onmouseover=e.onmousemove=e.point=null;w(a);if(a.clipPath&&z){var x=a.clipPath;[].forEach.call(z.querySelectorAll(\"[clip-path],[CLIP-PATH]\"),function(b){-1<b.getAttribute(\"clip-path\").indexOf(x.element.id)&&b.removeAttribute(\"clip-path\")});a.clipPath=x.destroy()}if(a.stops){for(z=0;z<a.stops.length;z++)a.stops[z].destroy();a.stops.length=0;a.stops=void 0}a.safeRemoveChild(e);for(b.styledMode||a.destroyShadows();h&&h.div&&0===h.div.childNodes.length;)e=h.parentGroup,a.safeRemoveChild(h.div),\ndelete h.div,h=e;a.alignTo&&p(b.alignedObjects,a);u(a,function(b,h){a[h]&&a[h].parentGroup===a&&a[h].destroy&&a[h].destroy();delete a[h]})};F.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0};F.prototype.destroyTextPath=function(a,e){var b=a.getElementsByTagName(\"text\")[0];if(b){if(b.removeAttribute(\"dx\"),b.removeAttribute(\"dy\"),e.element.setAttribute(\"id\",\"\"),this.textPathWrapper&&b.getElementsByTagName(\"textPath\").length){for(a=\nthis.textPathWrapper.element.childNodes;a.length;)b.appendChild(a[0]);b.removeChild(this.textPathWrapper.element)}}else if(a.getAttribute(\"dx\")||a.getAttribute(\"dy\"))a.removeAttribute(\"dx\"),a.removeAttribute(\"dy\");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};F.prototype.dSetter=function(a,e,b){l(a)&&(\"string\"===typeof a[0]&&(a=this.renderer.pathToSegments(a)),this.pathArray=a,a=a.reduce(function(b,a,e){return a&&a.join?(e?b+\" \":\"\")+a.join(\" \"):(a||\"\").toString()},\"\"));\n/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");this[e]!==a&&(b.setAttribute(e,a),this[e]=a)};F.prototype.fadeOut=function(a){var e=this;e.animate({opacity:0},{duration:E(a,150),complete:function(){e.attr({y:-9999}).hide()}})};F.prototype.fillSetter=function(a,e,b){\"string\"===typeof a?b.setAttribute(e,a):a&&this.complexColor(a,e,b)};F.prototype.getBBox=function(a,e){var b,h=this.renderer,z=this.element,x=this.styles,f=this.textStr,d=h.cache,l=h.cacheKeys,u=z.namespaceURI===this.SVG_NS;e=E(e,this.rotation,0);\nvar A=h.styledMode?z&&F.prototype.getStyle.call(z,\"font-size\"):x&&x.fontSize;if(I(f)){var p=f.toString();-1===p.indexOf(\"<\")&&(p=p.replace(/[0-9]/g,\"0\"));p+=[\"\",e,A,this.textWidth,x&&x.textOverflow,x&&x.fontWeight].join()}p&&!a&&(b=d[p]);if(!b){if(u||h.forExport){try{var w=this.fakeTS&&function(b){[].forEach.call(z.querySelectorAll(\".highcharts-text-outline\"),function(h){h.style.display=b})};k(w)&&w(\"none\");b=z.getBBox?m({},z.getBBox()):{width:z.offsetWidth,height:z.offsetHeight};k(w)&&w(\"\")}catch(X){\"\"}if(!b||\n0>b.width)b={width:0,height:0}}else b=this.htmlGetBBox();h.isSVG&&(a=b.width,h=b.height,u&&(b.height=h={\"11px,17\":14,\"13px,20\":16}[x&&x.fontSize+\",\"+Math.round(h)]||h),e&&(x=e*y,b.width=Math.abs(h*Math.sin(x))+Math.abs(a*Math.cos(x)),b.height=Math.abs(h*Math.cos(x))+Math.abs(a*Math.sin(x))));if(p&&0<b.height){for(;250<l.length;)delete d[l.shift()];d[p]||l.push(p);d[p]=b}}return b};F.prototype.getStyle=function(a){return L.getComputedStyle(this.element||this,\"\").getPropertyValue(a)};F.prototype.hasClass=\nfunction(a){return-1!==(\"\"+this.attr(\"class\")).split(\" \").indexOf(a)};F.prototype.hide=function(a){a?this.attr({y:-9999}):this.attr({visibility:\"hidden\"});return this};F.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};F.prototype.init=function(a,e){this.element=\"span\"===e?r(e):B.createElementNS(this.SVG_NS,e);this.renderer=a;d(this,\"afterInit\")};F.prototype.invert=function(a){this.inverted=a;this.updateTransform();return this};F.prototype.on=function(a,e){var b,h,z=this.element,\nx;H&&\"click\"===a?(z.ontouchstart=function(a){b=a.touches[0].clientX;h=a.touches[0].clientY},z.ontouchend=function(a){b&&4<=Math.sqrt(Math.pow(b-a.changedTouches[0].clientX,2)+Math.pow(h-a.changedTouches[0].clientY,2))||e.call(z,a);x=!0;a.preventDefault()},z.onclick=function(b){x||e.call(z,b)}):z[\"on\"+a]=e;return this};F.prototype.opacitySetter=function(a,e,b){this[e]=a;b.setAttribute(e,a)};F.prototype.removeClass=function(f){return this.attr(\"class\",(\"\"+this.attr(\"class\")).replace(a(f)?new RegExp(\"(^| )\"+\nf+\"( |$)\"):f,\" \").replace(/ +/g,\" \").trim())};F.prototype.removeTextOutline=function(a){for(var e=a.length,b;e--;)b=a[e],\"highcharts-text-outline\"===b.getAttribute(\"class\")&&p(a,this.element.removeChild(b))};F.prototype.safeRemoveChild=function(a){var e=a.parentNode;e&&e.removeChild(a)};F.prototype.setRadialReference=function(a){var e=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=a;e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(a,e.radAttr));\nreturn this};F.prototype.setTextPath=function(a,e){var b=this.element,h={textAnchor:\"text-anchor\"},z=!1,x=this.textPathWrapper,d=!x;e=A(!0,{enabled:!0,attributes:{dy:-5,startOffset:\"50%\",textAnchor:\"middle\"}},e);var k=e.attributes;if(a&&e&&e.enabled){x&&null===x.element.parentNode?(d=!0,x=x.destroy()):x&&this.removeTextOutline.call(x.parentGroup,[].slice.call(b.getElementsByTagName(\"tspan\")));this.options&&this.options.padding&&(k.dx=-this.options.padding);x||(this.textPathWrapper=x=this.renderer.createElement(\"textPath\"),\nz=!0);var l=x.element;(e=a.element.getAttribute(\"id\"))||a.element.setAttribute(\"id\",e=M());if(d)for(a=b.getElementsByTagName(\"tspan\");a.length;)a[0].setAttribute(\"y\",0),f(k.dx)&&a[0].setAttribute(\"x\",-k.dx),l.appendChild(a[0]);z&&x&&x.add({element:this.text?this.text.element:b});l.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",this.renderer.url+\"#\"+e);I(k.dy)&&(l.parentNode.setAttribute(\"dy\",k.dy),delete k.dy);I(k.dx)&&(l.parentNode.setAttribute(\"dx\",k.dx),delete k.dx);u(k,function(b,a){l.setAttribute(h[a]||\na,b)});b.removeAttribute(\"transform\");this.removeTextOutline.call(x,[].slice.call(b.getElementsByTagName(\"tspan\")));this.text&&!this.renderer.styledMode&&this.attr({fill:\"none\",\"stroke-width\":0});this.applyTextOutline=this.updateTransform=J}else x&&(delete this.updateTransform,delete this.applyTextOutline,this.destroyTextPath(b,a),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};F.prototype.shadow=function(a,e,b){var h=\n[],z=this.element,x=!1,f=this.oldShadowOptions;var d={color:\"#000000\",offsetX:1,offsetY:1,opacity:.15,width:3};var k;!0===a?k=d:\"object\"===typeof a&&(k=m(d,a));k&&(k&&f&&u(k,function(b,h){b!==f[h]&&(x=!0)}),x&&this.destroyShadows(),this.oldShadowOptions=k);if(!k)this.destroyShadows();else if(!this.shadows){var l=k.opacity/k.width;var A=this.parentInverted?\"translate(-1,-1)\":\"translate(\"+k.offsetX+\", \"+k.offsetY+\")\";for(d=1;d<=k.width;d++){var p=z.cloneNode(!1);var w=2*k.width+1-2*d;n(p,{stroke:a.color||\n\"#000000\",\"stroke-opacity\":l*d,\"stroke-width\":w,transform:A,fill:\"none\"});p.setAttribute(\"class\",(p.getAttribute(\"class\")||\"\")+\" highcharts-shadow\");b&&(n(p,\"height\",Math.max(n(p,\"height\")-w,0)),p.cutHeight=w);e?e.element.appendChild(p):z.parentNode&&z.parentNode.insertBefore(p,z);h.push(p)}this.shadows=h}return this};F.prototype.show=function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})};F.prototype.strokeSetter=function(a,e,b){this[e]=a;this.stroke&&this[\"stroke-width\"]?(F.prototype.fillSetter.call(this,\nthis.stroke,\"stroke\",b),b.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0):\"stroke-width\"===e&&0===a&&this.hasStroke?(b.removeAttribute(\"stroke\"),this.hasStroke=!1):this.renderer.styledMode&&this[\"stroke-width\"]&&(b.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0)};F.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this[\"stroke-width\"]||0;var a=this.getStyle(\"stroke-width\"),e=0;if(a.indexOf(\"px\")===a.length-2)e=P(a);else if(\"\"!==a){var b=\nB.createElementNS(G,\"rect\");n(b,{width:a,\"stroke-width\":0});this.element.parentNode.appendChild(b);e=b.getBBox().width;b.parentNode.removeChild(b)}return e};F.prototype.symbolAttr=function(a){var e=this;\"x y r start end width height innerR anchorX anchorY clockwise\".split(\" \").forEach(function(b){e[b]=E(a[b],e[b])});e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})};F.prototype.textSetter=function(a){a!==this.textStr&&(delete this.textPxLength,this.textStr=a,this.added&&this.renderer.buildText(this))};\nF.prototype.titleSetter=function(a){var e=this.element.getElementsByTagName(\"title\")[0];e||(e=B.createElementNS(this.SVG_NS,\"title\"),this.element.appendChild(e));e.firstChild&&e.removeChild(e.firstChild);e.appendChild(B.createTextNode(String(E(a,\"\")).replace(/<[^>]*>/g,\"\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\")))};F.prototype.toFront=function(){var a=this.element;a.parentNode.appendChild(a);return this};F.prototype.translate=function(a,e){return this.attr({translateX:a,translateY:e})};F.prototype.updateShadows=\nfunction(a,e,b){var h=this.shadows;if(h)for(var z=h.length;z--;)b.call(h[z],\"height\"===a?Math.max(e-(h[z].cutHeight||0),0):\"d\"===a?this.d:e,a,h[z])};F.prototype.updateTransform=function(){var a=this.translateX||0,e=this.translateY||0,b=this.scaleX,h=this.scaleY,z=this.inverted,x=this.rotation,f=this.matrix,d=this.element;z&&(a+=this.width,e+=this.height);a=[\"translate(\"+a+\",\"+e+\")\"];I(f)&&a.push(\"matrix(\"+f.join(\",\")+\")\");z?a.push(\"rotate(90) scale(-1,1)\"):x&&a.push(\"rotate(\"+x+\" \"+E(this.rotationOriginX,\nd.getAttribute(\"x\"),0)+\" \"+E(this.rotationOriginY,d.getAttribute(\"y\")||0)+\")\");(I(b)||I(h))&&a.push(\"scale(\"+E(b,1)+\" \"+E(h,1)+\")\");a.length&&d.setAttribute(\"transform\",a.join(\" \"))};F.prototype.visibilitySetter=function(a,e,b){\"inherit\"===a?b.removeAttribute(e):this[e]!==a&&b.setAttribute(e,a);this[e]=a};F.prototype.xGetter=function(a){\"circle\"===this.element.nodeName&&(\"x\"===a?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)};F.prototype.zIndexSetter=function(a,e){var b=this.renderer,h=this.parentGroup,\nz=(h||b).element||b.box,x=this.element,f=!1;b=z===b.box;var d=this.added;var k;I(a)?(x.setAttribute(\"data-z-index\",a),a=+a,this[e]===a&&(d=!1)):I(this[e])&&x.removeAttribute(\"data-z-index\");this[e]=a;if(d){(a=this.zIndex)&&h&&(h.handleZ=!0);e=z.childNodes;for(k=e.length-1;0<=k&&!f;k--){h=e[k];d=h.getAttribute(\"data-z-index\");var l=!I(d);if(h!==x)if(0>a&&l&&!b&&!k)z.insertBefore(x,e[k]),f=!0;else if(P(d)<=a||l&&(!I(a)||0<=a))z.insertBefore(x,e[k+1]||null),f=!0}f||(z.insertBefore(x,e[b?3:0]||null),\nf=!0)}return f};return F}();q.prototype[\"stroke-widthSetter\"]=q.prototype.strokeSetter;q.prototype.yGetter=q.prototype.xGetter;q.prototype.matrixSetter=q.prototype.rotationOriginXSetter=q.prototype.rotationOriginYSetter=q.prototype.rotationSetter=q.prototype.scaleXSetter=q.prototype.scaleYSetter=q.prototype.translateXSetter=q.prototype.translateYSetter=q.prototype.verticalAlignSetter=function(a,f){this[f]=a;this.doTransform=!0};c.SVGElement=q;return c.SVGElement});O(q,\"parts/SVGLabel.js\",[q[\"parts/SVGElement.js\"],\nq[\"parts/Utilities.js\"]],function(g,c){var q=this&&this.__extends||function(){var c=function(g,L){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,g){c.__proto__=g}||function(c,g){for(var n in g)g.hasOwnProperty(n)&&(c[n]=g[n])};return c(g,L)};return function(g,L){function v(){this.constructor=g}c(g,L);g.prototype=null===L?Object.create(L):(v.prototype=L.prototype,new v)}}(),y=c.defined,B=c.extend,H=c.isNumber,D=c.merge,J=c.removeEvent;return function(c){function t(g,v,K,n,r,C,\nI,p,m,d){var l=c.call(this)||this;l.init(g,\"g\");l.textStr=v;l.x=K;l.y=n;l.anchorX=C;l.anchorY=I;l.baseline=m;l.className=d;\"button\"!==d&&l.addClass(\"highcharts-label\");d&&l.addClass(\"highcharts-\"+d);l.text=g.text(\"\",0,0,p).attr({zIndex:1});if(\"string\"===typeof r){var k=/^url\\((.*?)\\)$/.test(r);if(l.renderer.symbols[r]||k)l.symbolKey=r}l.bBox=t.emptyBBox;l.padding=3;l.paddingLeft=0;l.baselineOffset=0;l.needsBox=g.styledMode||k;l.deferredAttr={};l.alignFactor=0;return l}q(t,c);t.prototype.alignSetter=\nfunction(c){c={left:0,center:.5,right:1}[c];c!==this.alignFactor&&(this.alignFactor=c,this.bBox&&H(this.xSetting)&&this.attr({x:this.xSetting}))};t.prototype.anchorXSetter=function(c,g){this.anchorX=c;this.boxAttr(g,Math.round(c)-this.getCrispAdjust()-this.xSetting)};t.prototype.anchorYSetter=function(c,g){this.anchorY=c;this.boxAttr(g,c-this.ySetting)};t.prototype.boxAttr=function(c,g){this.box?this.box.attr(c,g):this.deferredAttr[c]=g};t.prototype.css=function(c){if(c){var v={};c=D(c);t.textProps.forEach(function(n){\"undefined\"!==\ntypeof c[n]&&(v[n]=c[n],delete c[n])});this.text.css(v);var L=\"fontSize\"in v||\"fontWeight\"in v;if(\"width\"in v||L)this.updateBoxSize(),L&&this.updateTextPadding()}return g.prototype.css.call(this,c)};t.prototype.destroy=function(){J(this.element,\"mouseenter\");J(this.element,\"mouseleave\");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());g.prototype.destroy.call(this)};t.prototype.fillSetter=function(c,g){c&&(this.needsBox=!0);this.fill=c;this.boxAttr(g,c)};t.prototype.getBBox=\nfunction(){var c=this.bBox,g=this.padding;return{width:c.width+2*g,height:c.height+2*g,x:c.x-g,y:c.y-g}};t.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this[\"stroke-width\"]?parseInt(this[\"stroke-width\"],10):0)%2/2};t.prototype.heightSetter=function(c){this.heightSetting=c};t.prototype.on=function(c,v){var t=this,n=t.text,r=n&&\"SPAN\"===n.element.tagName?n:void 0;if(r){var C=function(C){(\"mouseenter\"===c||\"mouseleave\"===c)&&C.relatedTarget instanceof\nElement&&(t.element.contains(C.relatedTarget)||r.element.contains(C.relatedTarget))||v.call(t.element,C)};r.on(c,C)}g.prototype.on.call(t,c,C||v);return t};t.prototype.onAdd=function(){var c=this.textStr;this.text.add(this);this.attr({text:y(c)?c:\"\",x:this.x,y:this.y});this.box&&y(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};t.prototype.paddingSetter=function(c){y(c)&&c!==this.padding&&(this.padding=c,this.updateTextPadding())};t.prototype.paddingLeftSetter=function(c){y(c)&&\nc!==this.paddingLeft&&(this.paddingLeft=c,this.updateTextPadding())};t.prototype.rSetter=function(c,g){this.boxAttr(g,c)};t.prototype.shadow=function(c){c&&!this.renderer.styledMode&&(this.updateBoxSize(),this.box&&this.box.shadow(c));return this};t.prototype.strokeSetter=function(c,g){this.stroke=c;this.boxAttr(g,c)};t.prototype[\"stroke-widthSetter\"]=function(c,g){c&&(this.needsBox=!0);this[\"stroke-width\"]=c;this.boxAttr(g,c)};t.prototype[\"text-alignSetter\"]=function(c){this.textAlign=c};t.prototype.textSetter=\nfunction(c){\"undefined\"!==typeof c&&this.text.attr({text:c});this.updateBoxSize();this.updateTextPadding()};t.prototype.updateBoxSize=function(){var c=this.text.element.style,g={},G=this.padding,n=this.paddingLeft,r=H(this.widthSetting)&&H(this.heightSetting)&&!this.textAlign||!y(this.text.textStr)?t.emptyBBox:this.text.getBBox();this.width=(this.widthSetting||r.width||0)+2*G+n;this.height=(this.heightSetting||r.height||0)+2*G;this.baselineOffset=G+Math.min(this.renderer.fontMetrics(c&&c.fontSize,\nthis.text).b,r.height||Infinity);this.needsBox&&(this.box||(c=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),c.addClass((\"button\"===this.className?\"\":\"highcharts-label-box\")+(this.className?\" highcharts-\"+this.className+\"-box\":\"\")),c.add(this),c=this.getCrispAdjust(),g.x=c,g.y=(this.baseline?-this.baselineOffset:0)+c),g.width=Math.round(this.width),g.height=Math.round(this.height),this.box.attr(B(g,this.deferredAttr)),this.deferredAttr={});this.bBox=r};t.prototype.updateTextPadding=\nfunction(){var c=this.text,g=this.baseline?0:this.baselineOffset,t=this.paddingLeft+this.padding;y(this.widthSetting)&&this.bBox&&(\"center\"===this.textAlign||\"right\"===this.textAlign)&&(t+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(t!==c.x||g!==c.y)c.attr(\"x\",t),c.hasBoxWidthChanged&&(this.bBox=c.getBBox(!0),this.updateBoxSize()),\"undefined\"!==typeof g&&c.attr(\"y\",g);c.x=t;c.y=g};t.prototype.widthSetter=function(c){this.widthSetting=H(c)?c:void 0};t.prototype.xSetter=\nfunction(c){this.x=c;this.alignFactor&&(c-=this.alignFactor*((this.widthSetting||this.bBox.width)+2*this.padding),this[\"forceAnimate:x\"]=!0);this.xSetting=Math.round(c);this.attr(\"translateX\",this.xSetting)};t.prototype.ySetter=function(c){this.ySetting=this.y=Math.round(c);this.attr(\"translateY\",this.ySetting)};t.emptyBBox={width:0,height:0,x:0,y:0};t.textProps=\"color cursor direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width\".split(\" \");\nreturn t}(g)});O(q,\"parts/SVGRenderer.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/SVGElement.js\"],q[\"parts/SVGLabel.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B){var H=B.addEvent,D=B.attr,J=B.createElement,t=B.css,G=B.defined,L=B.destroyObjectProperties,v=B.extend,K=B.isArray,n=B.isNumber,r=B.isObject,C=B.isString,I=B.merge,p=B.objectEach,m=B.pick,d=B.pInt,l=B.splat,k=B.uniqueKey,f=c.charts,a=c.deg2rad,A=c.doc,u=c.isFirefox,E=c.isMS,P=c.isWebKit;B=c.noop;var w=c.svg,M=c.SVG_NS,F=c.symbolSizes,\nQ=c.win,e=function(){function b(b,a,e,f,d,k,l){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(b,a,e,f,d,k,l)}b.prototype.init=function(b,a,e,f,d,k,l){var h=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"});l||h.css(this.getStyle(f));f=h.element;b.appendChild(f);D(b,\"dir\",\"ltr\");-1===b.innerHTML.indexOf(\"xmlns\")&&\nD(f,\"xmlns\",this.SVG_NS);this.isSVG=!0;this.box=f;this.boxWrapper=h;this.alignedObjects=[];this.url=(u||P)&&A.getElementsByTagName(\"base\").length?Q.location.href.split(\"#\")[0].replace(/<[^>]*>/g,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(A.createTextNode(\"Created with Highcharts 8.1.2\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=k;this.forExport=d;this.styledMode=l;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=\n0;this.setSize(a,e,!1);var x;u&&b.getBoundingClientRect&&(a=function(){t(b,{left:0,top:0});x=b.getBoundingClientRect();t(b,{left:Math.ceil(x.left)-x.left+\"px\",top:Math.ceil(x.top)-x.top+\"px\"})},a(),this.unSubPixelFix=H(Q,\"resize\",a))};b.prototype.definition=function(b){function h(b,e){var f;l(b).forEach(function(b){var x=a.createElement(b.tagName),z={};p(b,function(b,h){\"tagName\"!==h&&\"children\"!==h&&\"textContent\"!==h&&(z[h]=b)});x.attr(z);x.add(e||a.defs);b.textContent&&x.element.appendChild(A.createTextNode(b.textContent));\nh(b.children||[],x);f=x});return f}var a=this;return h(b)};b.prototype.getStyle=function(b){return this.style=v({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',fontSize:\"12px\"},b)};b.prototype.setStyle=function(b){this.boxWrapper.css(this.getStyle(b))};b.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};b.prototype.destroy=function(){var b=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();L(this.gradients||{});this.gradients=null;\nb&&(this.defs=b.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};b.prototype.createElement=function(b){var h=new this.Element;h.init(this,b);return h};b.prototype.getRadialAttr=function(b,a){return{cx:b[0]-b[2]/2+a.cx*b[2],cy:b[1]-b[2]/2+a.cy*b[2],r:a.r*b[2]}};b.prototype.truncate=function(b,a,e,f,d,k,l){var h=this,x=b.rotation,z,u=f?1:0,N=(e||f).length,m=N,p=[],w=function(b){a.firstChild&&a.removeChild(a.firstChild);b&&a.appendChild(A.createTextNode(b))},c=function(x,\nz){z=z||x;if(\"undefined\"===typeof p[z])if(a.getSubStringLength)try{p[z]=d+a.getSubStringLength(0,f?z+1:z)}catch(ha){\"\"}else h.getSpanWidth&&(w(l(e||f,x)),p[z]=d+h.getSpanWidth(b,a));return p[z]},C;b.rotation=0;var r=c(a.textContent.length);if(C=d+r>k){for(;u<=N;)m=Math.ceil((u+N)/2),f&&(z=l(f,m)),r=c(m,z&&z.length-1),u===N?u=N+1:r>k?N=m-1:u=m;0===N?w(\"\"):e&&N===e.length-1||w(z||l(e||f,m))}f&&f.splice(0,m);b.actualWidth=r;b.rotation=x;return C};b.prototype.buildText=function(b){var h=b.element,a=this,\ne=a.forExport,f=m(b.textStr,\"\").toString(),k=-1!==f.indexOf(\"<\"),l=h.childNodes,u,c=D(h,\"x\"),r=b.styles,E=b.textWidth,n=r&&r.lineHeight,S=r&&r.textOutline,g=r&&\"ellipsis\"===r.textOverflow,I=r&&\"nowrap\"===r.whiteSpace,F=r&&r.fontSize,P,v=l.length;r=E&&!b.added&&this.box;var G=function(b){var e;a.styledMode||(e=/(px|em)$/.test(b&&b.style.fontSize)?b.style.fontSize:F||a.style.fontSize||12);return n?d(n):a.fontMetrics(e,b.getAttribute(\"style\")?b:h).h},Q=function(b,h){p(a.escapes,function(a,e){h&&-1!==\nh.indexOf(a)||(b=b.toString().replace(new RegExp(a,\"g\"),e))});return b},q=function(b,h){var a=b.indexOf(\"<\");b=b.substring(a,b.indexOf(\">\")-a);a=b.indexOf(h+\"=\");if(-1!==a&&(a=a+h.length+1,h=b.charAt(a),'\"'===h||\"'\"===h))return b=b.substring(a+1),b.substring(0,b.indexOf(h))},K=/<br.*?>/g;var J=[f,g,I,n,S,F,E].join();if(J!==b.textCache){for(b.textCache=J;v--;)h.removeChild(l[v]);k||S||g||E||-1!==f.indexOf(\" \")&&(!I||K.test(f))?(r&&r.appendChild(h),k?(f=a.styledMode?f.replace(/<(b|strong)>/g,'<span class=\"highcharts-strong\">').replace(/<(i|em)>/g,\n'<span class=\"highcharts-emphasized\">'):f.replace(/<(b|strong)>/g,'<span style=\"font-weight:bold\">').replace(/<(i|em)>/g,'<span style=\"font-style:italic\">'),f=f.replace(/<a/g,\"<span\").replace(/<\\/(b|strong|i|em|a)>/g,\"</span>\").split(K)):f=[f],f=f.filter(function(b){return\"\"!==b}),f.forEach(function(f,x){var z=0,d=0;f=f.replace(/^\\s+|\\s+$/g,\"\").replace(/<span/g,\"|||<span\").replace(/<\\/span>/g,\"</span>|||\");var k=f.split(\"|||\");k.forEach(function(f){if(\"\"!==f||1===k.length){var l={},N=A.createElementNS(a.SVG_NS,\n\"tspan\"),m,p;(m=q(f,\"class\"))&&D(N,\"class\",m);if(m=q(f,\"style\"))m=m.replace(/(;| |^)color([ :])/,\"$1fill$2\"),D(N,\"style\",m);if((p=q(f,\"href\"))&&!e&&-1===p.split(\":\")[0].toLowerCase().indexOf(\"javascript\")){var C=A.createElementNS(a.SVG_NS,\"a\");D(C,\"href\",p);D(N,\"class\",\"highcharts-anchor\");C.appendChild(N);a.styledMode||t(N,{cursor:\"pointer\"})}f=Q(f.replace(/<[a-zA-Z\\/](.|\\n)*?>/g,\"\")||\" \");if(\" \"!==f){N.appendChild(A.createTextNode(f));z?l.dx=0:x&&null!==c&&(l.x=c);D(N,l);h.appendChild(C||N);!z&&\nP&&(!w&&e&&t(N,{display:\"block\"}),D(N,\"dy\",G(N)));if(E){var r=f.replace(/([^\\^])-/g,\"$1- \").split(\" \");l=!I&&(1<k.length||x||1<r.length);C=0;p=G(N);if(g)u=a.truncate(b,N,f,void 0,0,Math.max(0,E-parseInt(F||12,10)),function(b,h){return b.substring(0,h)+\"\\u2026\"});else if(l)for(;r.length;)r.length&&!I&&0<C&&(N=A.createElementNS(M,\"tspan\"),D(N,{dy:p,x:c}),m&&D(N,\"style\",m),N.appendChild(A.createTextNode(r.join(\" \").replace(/- /g,\"-\"))),h.appendChild(N)),a.truncate(b,N,null,r,0===C?d:0,E,function(b,h){return r.slice(0,\nh).join(\" \").replace(/- /g,\"-\")}),d=b.actualWidth,C++}z++}}});P=P||h.childNodes.length}),g&&u&&b.attr(\"title\",Q(b.textStr||\"\",[\"&lt;\",\"&gt;\"])),r&&r.removeChild(h),C(S)&&b.applyTextOutline&&b.applyTextOutline(S)):h.appendChild(A.createTextNode(Q(f)))}};b.prototype.getContrast=function(b){b=g.parse(b).rgba;b[0]*=1;b[1]*=1.2;b[2]*=.5;return 459<b[0]+b[1]+b[2]?\"#000000\":\"#FFFFFF\"};b.prototype.button=function(b,a,e,f,d,k,l,u,m,p){var h=this.label(b,a,e,m,void 0,void 0,p,void 0,\"button\"),x=0,z=this.styledMode;\nb=d&&d.style||{};d&&d.style&&delete d.style;h.attr(I({padding:8,r:2},d));if(!z){d=I({fill:\"#f7f7f7\",stroke:\"#cccccc\",\"stroke-width\":1,style:{color:\"#333333\",cursor:\"pointer\",fontWeight:\"normal\"}},{style:b},d);var N=d.style;delete d.style;k=I(d,{fill:\"#e6e6e6\"},k);var A=k.style;delete k.style;l=I(d,{fill:\"#e6ebf5\",style:{color:\"#000000\",fontWeight:\"bold\"}},l);var w=l.style;delete l.style;u=I(d,{style:{color:\"#cccccc\"}},u);var c=u.style;delete u.style}H(h.element,E?\"mouseover\":\"mouseenter\",function(){3!==\nx&&h.setState(1)});H(h.element,E?\"mouseout\":\"mouseleave\",function(){3!==x&&h.setState(x)});h.setState=function(b){1!==b&&(h.state=x=b);h.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][b||0]);z||h.attr([d,k,l,u][b||0]).css([N,A,w,c][b||0])};z||h.attr(d).css(v({cursor:\"default\"},N));return h.on(\"click\",function(b){3!==x&&f.call(h,b)})};b.prototype.crispLine=function(b,a,e){void 0===e&&(e=\"round\");var h=b[0],f=b[1];\nh[1]===f[1]&&(h[1]=f[1]=Math[e](h[1])-a%2/2);h[2]===f[2]&&(h[2]=f[2]=Math[e](h[2])+a%2/2);return b};b.prototype.path=function(b){var h=this.styledMode?{}:{fill:\"none\"};K(b)?h.d=b:r(b)&&v(h,b);return this.createElement(\"path\").attr(h)};b.prototype.circle=function(b,a,e){b=r(b)?b:\"undefined\"===typeof b?{}:{x:b,y:a,r:e};a=this.createElement(\"circle\");a.xSetter=a.ySetter=function(b,h,a){a.setAttribute(\"c\"+h,b)};return a.attr(b)};b.prototype.arc=function(b,a,e,f,d,k){r(b)?(f=b,a=f.y,e=f.r,b=f.x):f={innerR:f,\nstart:d,end:k};b=this.symbol(\"arc\",b,a,e,e,f);b.r=e;return b};b.prototype.rect=function(b,a,e,f,d,k){d=r(b)?b.r:d;var h=this.createElement(\"rect\");b=r(b)?b:\"undefined\"===typeof b?{}:{x:b,y:a,width:Math.max(e,0),height:Math.max(f,0)};this.styledMode||(\"undefined\"!==typeof k&&(b.strokeWidth=k,b=h.crisp(b)),b.fill=\"none\");d&&(b.r=d);h.rSetter=function(b,a,e){h.r=b;D(e,{rx:b,ry:b})};h.rGetter=function(){return h.r};return h.attr(b)};b.prototype.setSize=function(b,a,e){var h=this.alignedObjects,f=h.length;\nthis.width=b;this.height=a;for(this.boxWrapper.animate({width:b,height:a},{step:function(){this.attr({viewBox:\"0 0 \"+this.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:m(e,!0)?void 0:0});f--;)h[f].align()};b.prototype.g=function(b){var h=this.createElement(\"g\");return b?h.attr({\"class\":\"highcharts-\"+b}):h};b.prototype.image=function(b,a,e,f,d,k){var h={preserveAspectRatio:\"none\"},x=function(b,h){b.setAttributeNS?b.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",h):b.setAttribute(\"hc-svg-href\",\nh)},z=function(h){x(l.element,b);k.call(l,h)};1<arguments.length&&v(h,{x:a,y:e,width:f,height:d});var l=this.createElement(\"image\").attr(h);k?(x(l.element,\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"),h=new Q.Image,H(h,\"load\",z),h.src=b,h.complete&&z({})):x(l.element,b);return l};b.prototype.symbol=function(b,a,e,d,k,l){var h=this,x=/^url\\((.*?)\\)$/,z=x.test(b),u=!z&&(this.symbols[b]?b:\"circle\"),N=u&&this.symbols[u],p;if(N){\"number\"===typeof a&&(p=N.call(this.symbols,\nMath.round(a||0),Math.round(e||0),d||0,k||0,l));var w=this.path(p);h.styledMode||w.attr(\"fill\",\"none\");v(w,{symbolName:u,x:a,y:e,width:d,height:k});l&&v(w,l)}else if(z){var c=b.match(x)[1];w=this.image(c);w.imgwidth=m(F[c]&&F[c].width,l&&l.width);w.imgheight=m(F[c]&&F[c].height,l&&l.height);var C=function(){w.attr({width:w.width,height:w.height})};[\"width\",\"height\"].forEach(function(b){w[b+\"Setter\"]=function(b,h){var a={},e=this[\"img\"+h],f=\"width\"===h?\"translateX\":\"translateY\";this[h]=b;G(e)&&(l&&\n\"within\"===l.backgroundSize&&this.width&&this.height&&(e=Math.round(e*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(h,e),this.alignByTranslate||(a[f]=((this[h]||0)-e)/2,this.attr(a)))}});G(a)&&w.attr({x:a,y:e});w.isImg=!0;G(w.imgwidth)&&G(w.imgheight)?C():(w.attr({width:0,height:0}),J(\"img\",{onload:function(){var b=f[h.chartIndex];0===this.width&&(t(this,{position:\"absolute\",top:\"-999em\"}),A.body.appendChild(this));F[c]={width:this.width,height:this.height};\nw.imgwidth=this.width;w.imgheight=this.height;w.element&&C();this.parentNode&&this.parentNode.removeChild(this);h.imgCount--;if(!h.imgCount&&b&&!b.hasLoaded)b.onload()},src:c}),this.imgCount++)}return w};b.prototype.clipRect=function(b,a,e,f){var h=k()+\"-\",x=this.createElement(\"clipPath\").attr({id:h}).add(this.defs);b=this.rect(b,a,e,f,0).add(x);b.id=h;b.clipPath=x;b.count=0;return b};b.prototype.text=function(b,a,e,f){var h={};if(f&&(this.allowHTML||!this.forExport))return this.html(b,a,e);h.x=Math.round(a||\n0);e&&(h.y=Math.round(e));G(b)&&(h.text=b);b=this.createElement(\"text\").attr(h);f||(b.xSetter=function(b,h,a){var e=a.getElementsByTagName(\"tspan\"),f=a.getAttribute(h),x;for(x=0;x<e.length;x++){var d=e[x];d.getAttribute(h)===f&&d.setAttribute(h,b)}a.setAttribute(h,b)});return b};b.prototype.fontMetrics=function(b,a){b=!this.styledMode&&/px/.test(b)||!Q.getComputedStyle?b||a&&a.style&&a.style.fontSize||this.style&&this.style.fontSize:a&&q.prototype.getStyle.call(a,\"font-size\");b=/px/.test(b)?d(b):\n12;a=24>b?b+3:Math.round(1.2*b);return{h:a,b:Math.round(.8*a),f:b}};b.prototype.rotCorr=function(b,e,f){var h=b;e&&f&&(h=Math.max(h*Math.cos(e*a),4));return{x:-b/3*Math.sin(e*a),y:h}};b.prototype.pathToSegments=function(b){for(var h=[],a=[],e={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},f=0;f<b.length;f++)C(a[0])&&n(b[f])&&a.length===e[a[0].toUpperCase()]&&b.splice(f,0,a[0].replace(\"M\",\"L\").replace(\"m\",\"l\")),\"string\"===typeof b[f]&&(a.length&&h.push(a.slice(0)),a.length=0),a.push(b[f]);h.push(a.slice(0));\nreturn h};b.prototype.label=function(b,a,e,f,d,k,l,u,m){return new y(this,b,a,e,f,d,k,l,u,m)};return b}();e.prototype.Element=q;e.prototype.SVG_NS=M;e.prototype.draw=B;e.prototype.escapes={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"};e.prototype.symbols={circle:function(b,h,a,e){return this.arc(b+a/2,h+e/2,a/2,e/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},square:function(b,h,a,e){return[[\"M\",b,h],[\"L\",b+a,h],[\"L\",b+a,h+e],[\"L\",b,h+e],[\"Z\"]]},triangle:function(b,h,a,e){return[[\"M\",\nb+a/2,h],[\"L\",b+a,h+e],[\"L\",b,h+e],[\"Z\"]]},\"triangle-down\":function(b,h,a,e){return[[\"M\",b,h],[\"L\",b+a,h],[\"L\",b+a/2,h+e],[\"Z\"]]},diamond:function(b,h,a,e){return[[\"M\",b+a/2,h],[\"L\",b+a,h+e/2],[\"L\",b+a/2,h+e],[\"L\",b,h+e/2],[\"Z\"]]},arc:function(b,h,a,e,f){var d=[];if(f){var x=f.start||0,k=f.end||0,z=f.r||a;a=f.r||e||a;var l=.001>Math.abs(k-x-2*Math.PI);k-=.001;e=f.innerR;l=m(f.open,l);var u=Math.cos(x),p=Math.sin(x),N=Math.cos(k),A=Math.sin(k);x=m(f.longArc,.001>k-x-Math.PI?0:1);d.push([\"M\",b+z*u,\nh+a*p],[\"A\",z,a,0,x,m(f.clockwise,1),b+z*N,h+a*A]);G(e)&&d.push(l?[\"M\",b+e*N,h+e*A]:[\"L\",b+e*N,h+e*A],[\"A\",e,e,0,x,G(f.clockwise)?1-f.clockwise:0,b+e*u,h+e*p]);l||d.push([\"Z\"])}return d},callout:function(b,h,a,e,f){var d=Math.min(f&&f.r||0,a,e),k=d+6,x=f&&f.anchorX||0;f=f&&f.anchorY||0;var z=[[\"M\",b+d,h],[\"L\",b+a-d,h],[\"C\",b+a,h,b+a,h,b+a,h+d],[\"L\",b+a,h+e-d],[\"C\",b+a,h+e,b+a,h+e,b+a-d,h+e],[\"L\",b+d,h+e],[\"C\",b,h+e,b,h+e,b,h+e-d],[\"L\",b,h+d],[\"C\",b,h,b,h,b+d,h]];x&&x>a?f>h+k&&f<h+e-k?z.splice(3,1,\n[\"L\",b+a,f-6],[\"L\",b+a+6,f],[\"L\",b+a,f+6],[\"L\",b+a,h+e-d]):z.splice(3,1,[\"L\",b+a,e/2],[\"L\",x,f],[\"L\",b+a,e/2],[\"L\",b+a,h+e-d]):x&&0>x?f>h+k&&f<h+e-k?z.splice(7,1,[\"L\",b,f+6],[\"L\",b-6,f],[\"L\",b,f-6],[\"L\",b,h+d]):z.splice(7,1,[\"L\",b,e/2],[\"L\",x,f],[\"L\",b,e/2],[\"L\",b,h+d]):f&&f>e&&x>b+k&&x<b+a-k?z.splice(5,1,[\"L\",x+6,h+e],[\"L\",x,h+e+6],[\"L\",x-6,h+e],[\"L\",b+d,h+e]):f&&0>f&&x>b+k&&x<b+a-k&&z.splice(1,1,[\"L\",x-6,h],[\"L\",x,h-6],[\"L\",x+6,h],[\"L\",a-d,h]);return z}};c.SVGRenderer=e;c.Renderer=c.SVGRenderer;\nreturn c.Renderer});O(q,\"parts/Html.js\",[q[\"parts/Globals.js\"],q[\"parts/SVGElement.js\"],q[\"parts/SVGRenderer.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=y.attr,H=y.createElement,D=y.css,J=y.defined,t=y.extend,G=y.pick,L=y.pInt,v=g.isFirefox,K=g.isMS,n=g.isWebKit,r=g.win;t(c.prototype,{htmlCss:function(c){var r=\"SPAN\"===this.element.tagName&&c&&\"width\"in c,p=G(r&&c.width,void 0);if(r){delete c.width;this.textWidth=p;var m=!0}c&&\"ellipsis\"===c.textOverflow&&(c.whiteSpace=\"nowrap\",c.overflow=\n\"hidden\");this.styles=t(this.styles,c);D(this.element,c);m&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var c=this.element;return{x:c.offsetLeft,y:c.offsetTop,width:c.offsetWidth,height:c.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var c=this.renderer,r=this.element,p=this.translateX||0,m=this.translateY||0,d=this.x||0,l=this.y||0,k=this.textAlign||\"left\",f={left:0,center:.5,right:1}[k],a=this.styles,A=a&&a.whiteSpace;D(r,{marginLeft:p,marginTop:m});!c.styledMode&&\nthis.shadows&&this.shadows.forEach(function(a){D(a,{marginLeft:p+1,marginTop:m+1})});this.inverted&&[].forEach.call(r.childNodes,function(a){c.invertChild(a,r)});if(\"SPAN\"===r.tagName){a=this.rotation;var u=this.textWidth&&L(this.textWidth),E=[a,k,r.innerHTML,this.textWidth,this.textAlign].join(),n;(n=u!==this.oldTextWidth)&&!(n=u>this.oldTextWidth)&&((n=this.textPxLength)||(D(r,{width:\"\",whiteSpace:A||\"nowrap\"}),n=r.offsetWidth),n=n>u);n&&(/[ \\-]/.test(r.textContent||r.innerText)||\"ellipsis\"===r.style.textOverflow)?\n(D(r,{width:u+\"px\",display:\"block\",whiteSpace:A||\"normal\"}),this.oldTextWidth=u,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;E!==this.cTT&&(A=c.fontMetrics(r.style.fontSize,r).b,!J(a)||a===(this.oldRotation||0)&&k===this.oldAlign||this.setSpanRotation(a,f,A),this.getSpanCorrection(!J(a)&&this.textPxLength||r.offsetWidth,A,f,a,k));D(r,{left:d+(this.xCorr||0)+\"px\",top:l+(this.yCorr||0)+\"px\"});this.cTT=E;this.oldRotation=a;this.oldAlign=k}}else this.alignOnAdd=!0},setSpanRotation:function(c,\nr,p){var m={},d=this.renderer.getTransformKey();m[d]=m.transform=\"rotate(\"+c+\"deg)\";m[d+(v?\"Origin\":\"-origin\")]=m.transformOrigin=100*r+\"% \"+p+\"px\";D(this.element,m)},getSpanCorrection:function(c,r,p){this.xCorr=-c*p;this.yCorr=-r}});t(q.prototype,{getTransformKey:function(){return K&&!/Edge/.test(r.navigator.userAgent)?\"-ms-transform\":n?\"-webkit-transform\":v?\"MozTransform\":r.opera?\"-o-transform\":\"\"},html:function(r,n,p){var m=this.createElement(\"span\"),d=m.element,l=m.renderer,k=l.isSVG,f=function(a,\nf){[\"opacity\",\"visibility\"].forEach(function(d){a[d+\"Setter\"]=function(k,l,u){var m=a.div?a.div.style:f;c.prototype[d+\"Setter\"].call(this,k,l,u);m&&(m[l]=k)}});a.addedSetters=!0};m.textSetter=function(a){a!==d.innerHTML&&(delete this.bBox,delete this.oldTextWidth);this.textStr=a;d.innerHTML=G(a,\"\");m.doTransform=!0};k&&f(m,m.element.style);m.xSetter=m.ySetter=m.alignSetter=m.rotationSetter=function(a,f){\"align\"===f&&(f=\"textAlign\");m[f]=a;m.doTransform=!0};m.afterSetters=function(){this.doTransform&&\n(this.htmlUpdateTransform(),this.doTransform=!1)};m.attr({text:r,x:Math.round(n),y:Math.round(p)}).css({position:\"absolute\"});l.styledMode||m.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});d.style.whiteSpace=\"nowrap\";m.css=m.htmlCss;k&&(m.add=function(a){var k=l.box.parentNode,u=[];if(this.parentGroup=a){var p=a.div;if(!p){for(;a;)u.push(a),a=a.parentGroup;u.reverse().forEach(function(a){function d(f,e){a[e]=f;\"translateX\"===e?A.left=f+\"px\":A.top=f+\"px\";a.doTransform=!0}var l=\nB(a.element,\"class\");p=a.div=a.div||H(\"div\",l?{className:l}:void 0,{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},p||k);var A=p.style;t(a,{classSetter:function(a){return function(e){this.element.setAttribute(\"class\",e);a.className=e}}(p),on:function(){u[0].div&&m.on.apply({element:u[0].div},arguments);return a},translateXSetter:d,translateYSetter:d});a.addedSetters||f(a)})}}else p=k;p.appendChild(d);\nm.added=!0;m.alignOnAdd&&m.htmlUpdateTransform();return m});return m}})});O(q,\"parts/Tick.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.clamp,y=c.correctFloat,B=c.defined,H=c.destroyObjectProperties,D=c.extend,J=c.fireEvent,t=c.isNumber,G=c.merge,L=c.objectEach,v=c.pick,K=g.deg2rad;c=function(){function c(c,C,n,p,m){this.isNewLabel=this.isNew=!0;this.axis=c;this.pos=C;this.type=n||\"\";this.parameters=m||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=\nthis.parameters.options;J(this,\"init\");n||p||this.addLabel()}c.prototype.addLabel=function(){var c=this,C=c.axis,n=C.options,p=C.chart,m=C.categories,d=C.logarithmic,l=C.names,k=c.pos,f=v(c.options&&c.options.labels,n.labels),a=C.tickPositions,A=k===a[0],u=k===a[a.length-1];l=this.parameters.category||(m?v(m[k],l[k],k):k);var E=c.label;m=(!f.step||1===f.step)&&1===C.tickInterval;a=a.info;var g,w;if(C.dateTime&&a){var M=p.time.resolveDTLFormat(n.dateTimeLabelFormats[!n.grid&&a.higherRanks[k]||a.unitName]);\nvar F=M.main}c.isFirst=A;c.isLast=u;c.formatCtx={axis:C,chart:p,isFirst:A,isLast:u,dateTimeLabelFormat:F,tickPositionInfo:a,value:d?y(d.lin2log(l)):l,pos:k};n=C.labelFormatter.call(c.formatCtx,this.formatCtx);if(w=M&&M.list)c.shortenLabel=function(){for(g=0;g<w.length;g++)if(E.attr({text:C.labelFormatter.call(D(c.formatCtx,{dateTimeLabelFormat:w[g]}))}),E.getBBox().width<C.getSlotWidth(c)-2*v(f.padding,5))return;E.attr({text:\"\"})};m&&C._addedPlotLB&&C.isXAxis&&c.moveLabel(n,f);B(E)||c.movedLabel?\nE&&E.textStr!==n&&!m&&(!E.textWidth||f.style&&f.style.width||E.styles.width||E.css({width:null}),E.attr({text:n}),E.textPxLength=E.getBBox().width):(c.label=E=c.createLabel({x:0,y:0},n,f),c.rotation=0)};c.prototype.createLabel=function(c,C,n){var p=this.axis,m=p.chart;if(c=B(C)&&n.enabled?m.renderer.text(C,c.x,c.y,n.useHTML).add(p.labelGroup):null)m.styledMode||c.css(G(n.style)),c.textPxLength=c.getBBox().width;return c};c.prototype.destroy=function(){H(this,this.axis)};c.prototype.getPosition=function(c,\nC,n,p){var m=this.axis,d=m.chart,l=p&&d.oldChartHeight||d.chartHeight;c={x:c?y(m.translate(C+n,null,null,p)+m.transB):m.left+m.offset+(m.opposite?(p&&d.oldChartWidth||d.chartWidth)-m.right-m.left:0),y:c?l-m.bottom+m.offset-(m.opposite?m.height:0):y(l-m.translate(C+n,null,null,p)-m.transB)};c.y=q(c.y,-1E5,1E5);J(this,\"afterGetPosition\",{pos:c});return c};c.prototype.getLabelPosition=function(c,C,n,p,m,d,l,k){var f=this.axis,a=f.transA,A=f.isLinked&&f.linkedParent?f.linkedParent.reversed:f.reversed,\nu=f.staggerLines,r=f.tickRotCorr||{x:0,y:0},g=m.y,w=p||f.reserveSpaceDefault?0:-f.labelOffset*(\"center\"===f.labelAlign?.5:1),M={};B(g)||(g=0===f.side?n.rotation?-8:-n.getBBox().height:2===f.side?r.y+8:Math.cos(n.rotation*K)*(r.y-n.getBBox(!1,0).height/2));c=c+m.x+w+r.x-(d&&p?d*a*(A?-1:1):0);C=C+g-(d&&!p?d*a*(A?1:-1):0);u&&(n=l/(k||1)%u,f.opposite&&(n=u-n-1),C+=f.labelOffset/u*n);M.x=c;M.y=Math.round(C);J(this,\"afterGetLabelPosition\",{pos:M,tickmarkOffset:d,index:l});return M};c.prototype.getLabelSize=\nfunction(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0};c.prototype.getMarkPath=function(c,C,n,p,m,d){return d.crispLine([[\"M\",c,C],[\"L\",c+(m?0:-n),C+(m?n:0)]],p)};c.prototype.handleOverflow=function(c){var r=this.axis,n=r.options.labels,p=c.x,m=r.chart.chartWidth,d=r.chart.spacing,l=v(r.labelLeft,Math.min(r.pos,d[3]));d=v(r.labelRight,Math.max(r.isRadial?0:r.pos+r.len,m-d[1]));var k=this.label,f=this.rotation,a={left:0,center:.5,right:1}[r.labelAlign||k.attr(\"align\")],\nA=k.getBBox().width,u=r.getSlotWidth(this),E=u,g=1,w,M={};if(f||\"justify\"!==v(n.overflow,\"justify\"))0>f&&p-a*A<l?w=Math.round(p/Math.cos(f*K)-l):0<f&&p+a*A>d&&(w=Math.round((m-p)/Math.cos(f*K)));else if(m=p+(1-a)*A,p-a*A<l?E=c.x+E*(1-a)-l:m>d&&(E=d-c.x+E*a,g=-1),E=Math.min(u,E),E<u&&\"center\"===r.labelAlign&&(c.x+=g*(u-E-a*(u-Math.min(A,E)))),A>E||r.autoRotation&&(k.styles||{}).width)w=E;w&&(this.shortenLabel?this.shortenLabel():(M.width=Math.floor(w)+\"px\",(n.style||{}).textOverflow||(M.textOverflow=\n\"ellipsis\"),k.css(M)))};c.prototype.moveLabel=function(c,C){var r=this,p=r.label,m=!1,d=r.axis,l=d.reversed,k=d.chart.inverted;p&&p.textStr===c?(r.movedLabel=p,m=!0,delete r.label):L(d.ticks,function(a){m||a.isNew||a===r||!a.label||a.label.textStr!==c||(r.movedLabel=a.label,m=!0,a.labelPos=r.movedLabel.xy,delete a.label)});if(!m&&(r.labelPos||p)){var f=r.labelPos||p.xy;p=k?f.x:l?0:d.width+d.left;d=k?l?d.width+d.left:0:f.y;r.movedLabel=r.createLabel({x:p,y:d},c,C);r.movedLabel&&r.movedLabel.attr({opacity:0})}};\nc.prototype.render=function(c,C,n){var p=this.axis,m=p.horiz,d=this.pos,l=v(this.tickmarkOffset,p.tickmarkOffset);d=this.getPosition(m,d,l,C);l=d.x;var k=d.y;p=m&&l===p.pos+p.len||!m&&k===p.pos?-1:1;n=v(n,1);this.isActive=!0;this.renderGridLine(C,n,p);this.renderMark(d,n,p);this.renderLabel(d,C,n,c);this.isNew=!1;J(this,\"afterRender\")};c.prototype.renderGridLine=function(c,C,n){var p=this.axis,m=p.options,d=this.gridLine,l={},k=this.pos,f=this.type,a=v(this.tickmarkOffset,p.tickmarkOffset),A=p.chart.renderer,\nu=f?f+\"Grid\":\"grid\",r=m[u+\"LineWidth\"],g=m[u+\"LineColor\"];m=m[u+\"LineDashStyle\"];d||(p.chart.styledMode||(l.stroke=g,l[\"stroke-width\"]=r,m&&(l.dashstyle=m)),f||(l.zIndex=1),c&&(C=0),this.gridLine=d=A.path().attr(l).addClass(\"highcharts-\"+(f?f+\"-\":\"\")+\"grid-line\").add(p.gridGroup));if(d&&(n=p.getPlotLinePath({value:k+a,lineWidth:d.strokeWidth()*n,force:\"pass\",old:c})))d[c||this.isNew?\"attr\":\"animate\"]({d:n,opacity:C})};c.prototype.renderMark=function(c,n,g){var p=this.axis,m=p.options,d=p.chart.renderer,\nl=this.type,k=l?l+\"Tick\":\"tick\",f=p.tickSize(k),a=this.mark,A=!a,u=c.x;c=c.y;var r=v(m[k+\"Width\"],!l&&p.isXAxis?1:0);m=m[k+\"Color\"];f&&(p.opposite&&(f[0]=-f[0]),A&&(this.mark=a=d.path().addClass(\"highcharts-\"+(l?l+\"-\":\"\")+\"tick\").add(p.axisGroup),p.chart.styledMode||a.attr({stroke:m,\"stroke-width\":r})),a[A?\"attr\":\"animate\"]({d:this.getMarkPath(u,c,f[0],a.strokeWidth()*g,p.horiz,d),opacity:n}))};c.prototype.renderLabel=function(c,n,g,p){var m=this.axis,d=m.horiz,l=m.options,k=this.label,f=l.labels,\na=f.step;m=v(this.tickmarkOffset,m.tickmarkOffset);var A=!0,u=c.x;c=c.y;k&&t(u)&&(k.xy=c=this.getLabelPosition(u,c,k,d,f,m,p,a),this.isFirst&&!this.isLast&&!v(l.showFirstLabel,1)||this.isLast&&!this.isFirst&&!v(l.showLastLabel,1)?A=!1:!d||f.step||f.rotation||n||0===g||this.handleOverflow(c),a&&p%a&&(A=!1),A&&t(c.y)?(c.opacity=g,k[this.isNewLabel?\"attr\":\"animate\"](c),this.isNewLabel=!1):(k.attr(\"y\",-9999),this.isNewLabel=!0))};c.prototype.replaceMovedLabel=function(){var c=this.label,n=this.axis,g=\nn.reversed,p=this.axis.chart.inverted;if(c&&!this.isNew){var m=p?c.xy.x:g?n.left:n.width+n.left;g=p?g?n.width+n.top:n.top:c.xy.y;c.animate({x:m,y:g,opacity:0},void 0,c.destroy);delete this.label}n.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return c}();g.Tick=c;return g.Tick});O(q,\"parts/Time.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.defined,y=c.error,B=c.extend,H=c.isObject,D=c.merge,J=c.objectEach,t=c.pad,G=c.pick,L=c.splat,v=c.timeUnits,K=g.win;\nc=function(){function c(c){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=K.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(c)}c.prototype.get=function(c,n){if(this.variableTimezone||this.timezoneOffset){var r=n.getTime(),p=r-this.getTimezoneOffset(n);n.setTime(p);c=n[\"getUTC\"+c]();n.setTime(r);return c}return this.useUTC?n[\"getUTC\"+c]():n[\"get\"+c]()};c.prototype.set=function(c,n,g){if(this.variableTimezone||this.timezoneOffset){if(\"Milliseconds\"===c||\"Seconds\"===\nc||\"Minutes\"===c)return n[\"setUTC\"+c](g);var p=this.getTimezoneOffset(n);p=n.getTime()-p;n.setTime(p);n[\"setUTC\"+c](g);c=this.getTimezoneOffset(n);p=n.getTime()+c;return n.setTime(p)}return this.useUTC?n[\"setUTC\"+c](g):n[\"set\"+c](g)};c.prototype.update=function(c){var n=G(c&&c.useUTC,!0);this.options=c=D(!0,this.options||{},c);this.Date=c.Date||K.Date||Date;this.timezoneOffset=(this.useUTC=n)&&c.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();this.variableTimezone=!(n&&!c.getTimezoneOffset&&\n!c.timezone)};c.prototype.makeTime=function(c,n,t,p,m,d){if(this.useUTC){var l=this.Date.UTC.apply(0,arguments);var k=this.getTimezoneOffset(l);l+=k;var f=this.getTimezoneOffset(l);k!==f?l+=f-k:k-36E5!==this.getTimezoneOffset(l-36E5)||g.isSafari||(l-=36E5)}else l=(new this.Date(c,n,G(t,1),G(p,0),G(m,0),G(d,0))).getTime();return l};c.prototype.timezoneOffsetFunction=function(){var c=this,n=this.options,g=K.moment;if(!this.useUTC)return function(c){return 6E4*(new Date(c.toString())).getTimezoneOffset()};\nif(n.timezone){if(g)return function(c){return 6E4*-g.tz(c,n.timezone).utcOffset()};y(25)}return this.useUTC&&n.getTimezoneOffset?function(c){return 6E4*n.getTimezoneOffset(c.valueOf())}:function(){return 6E4*(c.timezoneOffset||0)}};c.prototype.dateFormat=function(c,n,v){var p;if(!q(n)||isNaN(n))return(null===(p=g.defaultOptions.lang)||void 0===p?void 0:p.invalidDate)||\"\";c=G(c,\"%Y-%m-%d %H:%M:%S\");var m=this;p=new this.Date(n);var d=this.get(\"Hours\",p),l=this.get(\"Day\",p),k=this.get(\"Date\",p),f=this.get(\"Month\",\np),a=this.get(\"FullYear\",p),A=g.defaultOptions.lang,u=null===A||void 0===A?void 0:A.weekdays,E=null===A||void 0===A?void 0:A.shortWeekdays;p=B({a:E?E[l]:u[l].substr(0,3),A:u[l],d:t(k),e:t(k,2,\" \"),w:l,b:A.shortMonths[f],B:A.months[f],m:t(f+1),o:f+1,y:a.toString().substr(2,2),Y:a,H:t(d),k:d,I:t(d%12||12),l:d%12||12,M:t(this.get(\"Minutes\",p)),p:12>d?\"AM\":\"PM\",P:12>d?\"am\":\"pm\",S:t(p.getSeconds()),L:t(Math.floor(n%1E3),3)},g.dateFormats);J(p,function(a,f){for(;-1!==c.indexOf(\"%\"+f);)c=c.replace(\"%\"+f,\n\"function\"===typeof a?a.call(m,n):a)});return v?c.substr(0,1).toUpperCase()+c.substr(1):c};c.prototype.resolveDTLFormat=function(c){return H(c,!0)?c:(c=L(c),{main:c[0],from:c[1],to:c[2]})};c.prototype.getTimeTicks=function(c,n,g,p){var m=this,d=[],l={};var k=new m.Date(n);var f=c.unitRange,a=c.count||1,A;p=G(p,1);if(q(n)){m.set(\"Milliseconds\",k,f>=v.second?0:a*Math.floor(m.get(\"Milliseconds\",k)/a));f>=v.second&&m.set(\"Seconds\",k,f>=v.minute?0:a*Math.floor(m.get(\"Seconds\",k)/a));f>=v.minute&&m.set(\"Minutes\",\nk,f>=v.hour?0:a*Math.floor(m.get(\"Minutes\",k)/a));f>=v.hour&&m.set(\"Hours\",k,f>=v.day?0:a*Math.floor(m.get(\"Hours\",k)/a));f>=v.day&&m.set(\"Date\",k,f>=v.month?1:Math.max(1,a*Math.floor(m.get(\"Date\",k)/a)));if(f>=v.month){m.set(\"Month\",k,f>=v.year?0:a*Math.floor(m.get(\"Month\",k)/a));var u=m.get(\"FullYear\",k)}f>=v.year&&m.set(\"FullYear\",k,u-u%a);f===v.week&&(u=m.get(\"Day\",k),m.set(\"Date\",k,m.get(\"Date\",k)-u+p+(u<p?-7:0)));u=m.get(\"FullYear\",k);p=m.get(\"Month\",k);var E=m.get(\"Date\",k),r=m.get(\"Hours\",\nk);n=k.getTime();m.variableTimezone&&(A=g-n>4*v.month||m.getTimezoneOffset(n)!==m.getTimezoneOffset(g));n=k.getTime();for(k=1;n<g;)d.push(n),n=f===v.year?m.makeTime(u+k*a,0):f===v.month?m.makeTime(u,p+k*a):!A||f!==v.day&&f!==v.week?A&&f===v.hour&&1<a?m.makeTime(u,p,E,r+k*a):n+f*a:m.makeTime(u,p,E+k*a*(f===v.day?1:7)),k++;d.push(n);f<=v.hour&&1E4>d.length&&d.forEach(function(a){0===a%18E5&&\"000000000\"===m.dateFormat(\"%H%M%S%L\",a)&&(l[a]=\"day\")})}d.info=B(c,{higherRanks:l,totalRange:f*a});return d};\nreturn c}();g.Time=c;return g.Time});O(q,\"parts/Options.js\",[q[\"parts/Globals.js\"],q[\"parts/Time.js\"],q[\"parts/Color.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){q=q.parse;y=y.merge;g.defaultOptions={colors:\"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1\".split(\" \"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),\nshortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),weekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:{styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},\nposition:{align:\"right\",x:-10,y:10}},width:null,height:null,borderColor:\"#335cad\",backgroundColor:\"#ffffff\",plotBorderColor:\"#cccccc\"},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},caption:{margin:15,text:\"\",align:\"left\",verticalAlign:\"bottom\"},plotOptions:{},labels:{style:{position:\"absolute\",color:\"#333333\"}},legend:{enabled:!0,align:\"center\",alignColumns:!0,layout:\"horizontal\",labelFormatter:function(){return this.name},borderColor:\"#999999\",\nborderRadius:0,navigation:{activeColor:\"#003399\",inactiveColor:\"#cccccc\"},itemStyle:{color:\"#333333\",cursor:\"pointer\",fontSize:\"12px\",fontWeight:\"bold\",textOverflow:\"ellipsis\"},itemHoverStyle:{color:\"#000000\"},itemHiddenStyle:{color:\"#cccccc\"},shadow:!1,itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"45%\"},style:{position:\"absolute\",\nbackgroundColor:\"#ffffff\",opacity:.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:g.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},footerFormat:\"\",padding:8,snap:g.isTouchDevice?25:10,headerFormat:'<span style=\"font-size: 10px\">{point.key}</span><br/>',pointFormat:'<span style=\"color:{point.color}\">\\u25cf</span> {series.name}: <b>{point.y}</b><br/>',\nbackgroundColor:q(\"#f7f7f7\").setOpacity(.85).get(),borderWidth:1,shadow:!0,style:{color:\"#333333\",cursor:\"default\",fontSize:\"12px\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,href:\"https://www.highcharts.com?credits\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#999999\",fontSize:\"9px\"},text:\"Highcharts.com\"}};\"\";g.time=new c(y(g.defaultOptions.global,g.defaultOptions.time));g.dateFormat=function(c,q,y){return g.time.dateFormat(c,q,y)};return{dateFormat:g.dateFormat,\ndefaultOptions:g.defaultOptions,time:g.time}});O(q,\"parts/Axis.js\",[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Tick.js\"],q[\"parts/Utilities.js\"],q[\"parts/Options.js\"]],function(g,c,q,y,B){var H=y.addEvent,D=y.animObject,J=y.arrayMax,t=y.arrayMin,G=y.clamp,L=y.correctFloat,v=y.defined,K=y.destroyObjectProperties,n=y.error,r=y.extend,C=y.fireEvent,I=y.format,p=y.getMagnitude,m=y.isArray,d=y.isFunction,l=y.isNumber,k=y.isString,f=y.merge,a=y.normalizeTickInterval,A=y.objectEach,u=y.pick,E=y.relativeLength,\nP=y.removeEvent,w=y.splat,M=y.syncTimeout,F=B.defaultOptions,Q=c.deg2rad;y=function(){function e(b,a){this.zoomEnabled=this.width=this.visible=this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=\nthis.options=this.oldMin=this.oldMax=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.coll=this.closestPointRange=this.chart=this.categories=this.bottom=this.alternateBands=void 0;this.init(b,a)}e.prototype.init=function(b,a){var h=a.isX,e=this;e.chart=b;e.horiz=b.inverted&&!e.isZAxis?!h:h;e.isXAxis=h;e.coll=\ne.coll||(h?\"xAxis\":\"yAxis\");C(this,\"init\",{userOptions:a});e.opposite=a.opposite;e.side=a.side||(e.horiz?e.opposite?0:2:e.opposite?1:3);e.setOptions(a);var f=this.options,k=f.type;e.labelFormatter=f.labels.formatter||e.defaultLabelFormatter;e.userOptions=a;e.minPixelPadding=0;e.reversed=f.reversed;e.visible=!1!==f.visible;e.zoomEnabled=!1!==f.zoomEnabled;e.hasNames=\"category\"===k||!0===f.categories;e.categories=f.categories||e.hasNames;e.names||(e.names=[],e.names.keys={});e.plotLinesAndBandsGroups=\n{};e.positiveValuesOnly=!(!e.logarithmic||f.allowNegativeLog);e.isLinked=v(f.linkedTo);e.ticks={};e.labelEdge=[];e.minorTicks={};e.plotLinesAndBands=[];e.alternateBands={};e.len=0;e.minRange=e.userMinRange=f.minRange||f.maxZoom;e.range=f.range;e.offset=f.offset||0;e.max=null;e.min=null;e.crosshair=u(f.crosshair,w(b.options.tooltip.crosshairs)[h?0:1],!1);a=e.options.events;-1===b.axes.indexOf(e)&&(h?b.axes.splice(b.xAxis.length,0,e):b.axes.push(e),b[e.coll].push(e));e.series=e.series||[];b.inverted&&\n!e.isZAxis&&h&&\"undefined\"===typeof e.reversed&&(e.reversed=!0);e.labelRotation=e.options.labels.rotation;A(a,function(b,a){d(b)&&H(e,a,b)});C(this,\"afterInit\")};e.prototype.setOptions=function(b){this.options=f(e.defaultOptions,\"yAxis\"===this.coll&&e.defaultYAxisOptions,[e.defaultTopAxisOptions,e.defaultRightAxisOptions,e.defaultBottomAxisOptions,e.defaultLeftAxisOptions][this.side],f(F[this.coll],b));C(this,\"afterSetOptions\",{userOptions:b})};e.prototype.defaultLabelFormatter=function(){var b=this.axis,\na=l(this.value)?this.value:NaN,e=b.chart.time,f=b.categories,d=this.dateTimeLabelFormat,k=F.lang,c=k.numericSymbols;k=k.numericSymbolMagnitude||1E3;var u=c&&c.length,m=b.options.labels.format;b=b.logarithmic?Math.abs(a):b.tickInterval;var p=this.chart,A=p.numberFormatter;if(m)var w=I(m,this,p);else if(f)w=\"\"+this.value;else if(d)w=e.dateFormat(d,a);else if(u&&1E3<=b)for(;u--&&\"undefined\"===typeof w;)e=Math.pow(k,u+1),b>=e&&0===10*a%e&&null!==c[u]&&0!==a&&(w=A(a/e,-1)+c[u]);\"undefined\"===typeof w&&\n(w=1E4<=Math.abs(a)?A(a,-1):A(a,-1,void 0,\"\"));return w};e.prototype.getSeriesExtremes=function(){var b=this,a=b.chart,e;C(this,\"getSeriesExtremes\",null,function(){b.hasVisibleSeries=!1;b.dataMin=b.dataMax=b.threshold=null;b.softThreshold=!b.isXAxis;b.stacking&&b.stacking.buildStacks();b.series.forEach(function(h){if(h.visible||!a.options.chart.ignoreHiddenSeries){var f=h.options,d=f.threshold;b.hasVisibleSeries=!0;b.positiveValuesOnly&&0>=d&&(d=null);if(b.isXAxis){if(f=h.xData,f.length){e=h.getXExtremes(f);\nvar k=e.min;var x=e.max;l(k)||k instanceof Date||(f=f.filter(l),e=h.getXExtremes(f),k=e.min,x=e.max);f.length&&(b.dataMin=Math.min(u(b.dataMin,k),k),b.dataMax=Math.max(u(b.dataMax,x),x))}}else if(h=h.applyExtremes(),l(h.dataMin)&&(k=h.dataMin,b.dataMin=Math.min(u(b.dataMin,k),k)),l(h.dataMax)&&(x=h.dataMax,b.dataMax=Math.max(u(b.dataMax,x),x)),v(d)&&(b.threshold=d),!f.softThreshold||b.positiveValuesOnly)b.softThreshold=!1}})});C(this,\"afterGetSeriesExtremes\")};e.prototype.translate=function(b,a,e,\nf,d,k){var h=this.linkedParent||this,x=1,z=0,c=f?h.oldTransA:h.transA;f=f?h.oldMin:h.min;var u=h.minPixelPadding;d=(h.isOrdinal||h.brokenAxis&&h.brokenAxis.hasBreaks||h.logarithmic&&d)&&h.lin2val;c||(c=h.transA);e&&(x*=-1,z=h.len);h.reversed&&(x*=-1,z-=x*(h.sector||h.len));a?(b=(b*x+z-u)/c+f,d&&(b=h.lin2val(b))):(d&&(b=h.val2lin(b)),b=l(f)?x*(b-f)*c+z+x*u+(l(k)?c*k:0):void 0);return b};e.prototype.toPixels=function(b,a){return this.translate(b,!1,!this.horiz,null,!0)+(a?0:this.pos)};e.prototype.toValue=\nfunction(b,a){return this.translate(b-(a?0:this.pos),!0,!this.horiz,null,!0)};e.prototype.getPlotLinePath=function(b){function a(b,a,h){if(\"pass\"!==w&&b<a||b>h)w?b=G(b,a,h):t=!0;return b}var e=this,f=e.chart,d=e.left,k=e.top,c=b.old,m=b.value,p=b.translatedValue,A=b.lineWidth,w=b.force,n,g,E,r,M=c&&f.oldChartHeight||f.chartHeight,F=c&&f.oldChartWidth||f.chartWidth,t,v=e.transB;b={value:m,lineWidth:A,old:c,force:w,acrossPanes:b.acrossPanes,translatedValue:p};C(this,\"getPlotLinePath\",b,function(b){p=\nu(p,e.translate(m,null,null,c));p=G(p,-1E5,1E5);n=E=Math.round(p+v);g=r=Math.round(M-p-v);l(p)?e.horiz?(g=k,r=M-e.bottom,n=E=a(n,d,d+e.width)):(n=d,E=F-e.right,g=r=a(g,k,k+e.height)):(t=!0,w=!1);b.path=t&&!w?null:f.renderer.crispLine([[\"M\",n,g],[\"L\",E,r]],A||1)});return b.path};e.prototype.getLinearTickPositions=function(b,a,e){var h=L(Math.floor(a/b)*b);e=L(Math.ceil(e/b)*b);var f=[],d;L(h+b)===h&&(d=20);if(this.single)return[a];for(a=h;a<=e;){f.push(a);a=L(a+b,d);if(a===k)break;var k=a}return f};\ne.prototype.getMinorTickInterval=function(){var b=this.options;return!0===b.minorTicks?u(b.minorTickInterval,\"auto\"):!1===b.minorTicks?null:b.minorTickInterval};e.prototype.getMinorTickPositions=function(){var b=this.options,a=this.tickPositions,e=this.minorTickInterval,f=[],d=this.pointRangePadding||0,k=this.min-d;d=this.max+d;var c=d-k;if(c&&c/e<this.len/3){var l=this.logarithmic;if(l)this.paddedTicks.forEach(function(b,a,h){a&&f.push.apply(f,l.getLogTickPositions(e,h[a-1],h[a],!0))});else if(this.dateTime&&\n\"auto\"===this.getMinorTickInterval())f=f.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(e),k,d,b.startOfWeek));else for(b=k+(a[0]-k)%e;b<=d&&b!==f[0];b+=e)f.push(b)}0!==f.length&&this.trimTicks(f);return f};e.prototype.adjustForMinRange=function(){var b=this.options,a=this.min,e=this.max,f=this.logarithmic,d,k,c,l,m;this.isXAxis&&\"undefined\"===typeof this.minRange&&!f&&(v(b.min)||v(b.max)?this.minRange=null:(this.series.forEach(function(b){l=b.xData;for(k=m=b.xIncrement?1:l.length-\n1;0<k;k--)if(c=l[k]-l[k-1],\"undefined\"===typeof d||c<d)d=c}),this.minRange=Math.min(5*d,this.dataMax-this.dataMin)));if(e-a<this.minRange){var p=this.dataMax-this.dataMin>=this.minRange;var A=this.minRange;var w=(A-e+a)/2;w=[a-w,u(b.min,a-w)];p&&(w[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);a=J(w);e=[a+A,u(b.max,a+A)];p&&(e[2]=f?f.log2lin(this.dataMax):this.dataMax);e=t(e);e-a<A&&(w[0]=e-A,w[1]=u(b.min,e-A),a=J(w))}this.min=a;this.max=e};e.prototype.getClosest=function(){var b;\nthis.categories?b=1:this.series.forEach(function(a){var h=a.closestPointRange,e=a.visible||!a.chart.options.chart.ignoreHiddenSeries;!a.noSharedTooltip&&v(h)&&e&&(b=v(b)?Math.min(b,h):h)});return b};e.prototype.nameToX=function(b){var a=m(this.categories),e=a?this.categories:this.names,f=b.options.x;b.series.requireSorting=!1;v(f)||(f=!1===this.options.uniqueNames?b.series.autoIncrement():a?e.indexOf(b.name):u(e.keys[b.name],-1));if(-1===f){if(!a)var d=e.length}else d=f;\"undefined\"!==typeof d&&(this.names[d]=\nb.name,this.names.keys[b.name]=d);return d};e.prototype.updateNames=function(){var b=this,a=this.names;0<a.length&&(Object.keys(a.keys).forEach(function(b){delete a.keys[b]}),a.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(a){a.xIncrement=null;if(!a.points||a.isDirtyData)b.max=Math.max(b.max,a.xData.length-1),a.processData(),a.generatePoints();a.data.forEach(function(h,e){if(h&&h.options&&\"undefined\"!==typeof h.name){var f=b.nameToX(h);\"undefined\"!==typeof f&&f!==h.x&&\n(h.x=f,a.xData[e]=f)}})}))};e.prototype.setAxisTranslation=function(b){var a=this,e=a.max-a.min,f=a.axisPointRange||0,d=0,c=0,l=a.linkedParent,m=!!a.categories,p=a.transA,A=a.isXAxis;if(A||m||f){var w=a.getClosest();l?(d=l.minPointOffset,c=l.pointRangePadding):a.series.forEach(function(b){var h=m?1:A?u(b.options.pointRange,w,0):a.axisPointRange||0,e=b.options.pointPlacement;f=Math.max(f,h);if(!a.single||m)b=b.is(\"xrange\")?!A:A,d=Math.max(d,b&&k(e)?0:h/2),c=Math.max(c,b&&\"on\"===e?0:h)});l=a.ordinal&&\na.ordinal.slope&&w?a.ordinal.slope/w:1;a.minPointOffset=d*=l;a.pointRangePadding=c*=l;a.pointRange=Math.min(f,a.single&&m?1:e);A&&(a.closestPointRange=w)}b&&(a.oldTransA=p);a.translationSlope=a.transA=p=a.staticScale||a.len/(e+c||1);a.transB=a.horiz?a.left:a.bottom;a.minPixelPadding=p*d;C(this,\"afterSetAxisTranslation\")};e.prototype.minFromRange=function(){return this.max-this.range};e.prototype.setTickInterval=function(b){var h=this,e=h.chart,f=h.logarithmic,d=h.options,k=h.isXAxis,c=h.isLinked,\nm=d.maxPadding,A=d.minPadding,w=d.tickInterval,g=d.tickPixelInterval,E=h.categories,r=l(h.threshold)?h.threshold:null,S=h.softThreshold;h.dateTime||E||c||this.getTickAmount();var M=u(h.userMin,d.min);var F=u(h.userMax,d.max);if(c){h.linkedParent=e[h.coll][d.linkedTo];var t=h.linkedParent.getExtremes();h.min=u(t.min,t.dataMin);h.max=u(t.max,t.dataMax);d.type!==h.linkedParent.options.type&&n(11,1,e)}else{if(!S&&v(r))if(h.dataMin>=r)t=r,A=0;else if(h.dataMax<=r){var P=r;m=0}h.min=u(M,t,h.dataMin);h.max=\nu(F,P,h.dataMax)}f&&(h.positiveValuesOnly&&!b&&0>=Math.min(h.min,u(h.dataMin,h.min))&&n(10,1,e),h.min=L(f.log2lin(h.min),16),h.max=L(f.log2lin(h.max),16));h.range&&v(h.max)&&(h.userMin=h.min=M=Math.max(h.dataMin,h.minFromRange()),h.userMax=F=h.max,h.range=null);C(h,\"foundExtremes\");h.beforePadding&&h.beforePadding();h.adjustForMinRange();!(E||h.axisPointRange||h.stacking&&h.stacking.usePercentage||c)&&v(h.min)&&v(h.max)&&(e=h.max-h.min)&&(!v(M)&&A&&(h.min-=e*A),!v(F)&&m&&(h.max+=e*m));l(h.userMin)||\n(l(d.softMin)&&d.softMin<h.min&&(h.min=M=d.softMin),l(d.floor)&&(h.min=Math.max(h.min,d.floor)));l(h.userMax)||(l(d.softMax)&&d.softMax>h.max&&(h.max=F=d.softMax),l(d.ceiling)&&(h.max=Math.min(h.max,d.ceiling)));S&&v(h.dataMin)&&(r=r||0,!v(M)&&h.min<r&&h.dataMin>=r?h.min=h.options.minRange?Math.min(r,h.max-h.minRange):r:!v(F)&&h.max>r&&h.dataMax<=r&&(h.max=h.options.minRange?Math.max(r,h.min+h.minRange):r));h.tickInterval=h.min===h.max||\"undefined\"===typeof h.min||\"undefined\"===typeof h.max?1:c&&\n!w&&g===h.linkedParent.options.tickPixelInterval?w=h.linkedParent.tickInterval:u(w,this.tickAmount?(h.max-h.min)/Math.max(this.tickAmount-1,1):void 0,E?1:(h.max-h.min)*g/Math.max(h.len,g));k&&!b&&h.series.forEach(function(b){b.processData(h.min!==h.oldMin||h.max!==h.oldMax)});h.setAxisTranslation(!0);C(this,\"initialAxisTranslation\");h.pointRange&&!w&&(h.tickInterval=Math.max(h.pointRange,h.tickInterval));b=u(d.minTickInterval,h.dateTime&&!h.series.some(function(b){return b.noSharedTooltip})?h.closestPointRange:\n0);!w&&h.tickInterval<b&&(h.tickInterval=b);h.dateTime||h.logarithmic||w||(h.tickInterval=a(h.tickInterval,void 0,p(h.tickInterval),u(d.allowDecimals,.5>h.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(h.tickInterval=h.unsquish());this.setTickPositions()};e.prototype.setTickPositions=function(){var b=this.options,a=b.tickPositions;var e=this.getMinorTickInterval();var f=b.tickPositioner,d=this.hasVerticalPanning(),k=\"colorAxis\"===this.coll,c=(k||!d)&&b.startOnTick;d=\n(k||!d)&&b.endOnTick;this.tickmarkOffset=this.categories&&\"between\"===b.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===e&&this.tickInterval?this.tickInterval/5:e;this.single=this.min===this.max&&v(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==b.allowDecimals);this.tickPositions=e=a&&a.slice();!e&&(this.ordinal&&this.ordinal.positions||!((this.max-this.min)/this.tickInterval>Math.max(2*this.len,200))?e=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,\nb.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max):(e=[this.min,this.max],n(19,!1,this.chart)),e.length>this.len&&(e=[e[0],e.pop()],e[0]===e[1]&&(e.length=1)),this.tickPositions=e,f&&(f=f.apply(this,[this.min,this.max])))&&(this.tickPositions=e=f);this.paddedTicks=e.slice(0);this.trimTicks(e,\nc,d);this.isLinked||(this.single&&2>e.length&&!this.categories&&!this.series.some(function(b){return b.is(\"heatmap\")&&\"between\"===b.options.pointPlacement})&&(this.min-=.5,this.max+=.5),a||f||this.adjustTickAmount());C(this,\"afterSetTickPositions\")};e.prototype.trimTicks=function(b,a,e){var h=b[0],f=b[b.length-1],d=!this.isOrdinal&&this.minPointOffset||0;C(this,\"trimTicks\");if(!this.isLinked){if(a&&-Infinity!==h)this.min=h;else for(;this.min-d>b[0];)b.shift();if(e)this.max=f;else for(;this.max+d<\nb[b.length-1];)b.pop();0===b.length&&v(h)&&!this.options.tickPositions&&b.push((f+h)/2)}};e.prototype.alignToOthers=function(){var b={},a,e=this.options;!1===this.chart.options.chart.alignTicks||!1===e.alignTicks||!1===e.startOnTick||!1===e.endOnTick||this.logarithmic||this.chart[this.coll].forEach(function(h){var e=h.options;e=[h.horiz?e.left:e.top,e.width,e.height,e.pane].join();h.series.length&&(b[e]?a=!0:b[e]=1)});return a};e.prototype.getTickAmount=function(){var b=this.options,a=b.tickAmount,\ne=b.tickPixelInterval;!v(b.tickInterval)&&!a&&this.len<e&&!this.isRadial&&!this.logarithmic&&b.startOnTick&&b.endOnTick&&(a=2);!a&&this.alignToOthers()&&(a=Math.ceil(this.len/e)+1);4>a&&(this.finalTickAmt=a,a=5);this.tickAmount=a};e.prototype.adjustTickAmount=function(){var b=this.options,a=this.tickInterval,e=this.tickPositions,f=this.tickAmount,d=this.finalTickAmt,k=e&&e.length,c=u(this.threshold,this.softThreshold?0:null),l;if(this.hasData()){if(k<f){for(l=this.min;e.length<f;)e.length%2||l===\nc?e.push(L(e[e.length-1]+a)):e.unshift(L(e[0]-a));this.transA*=(k-1)/(f-1);this.min=b.startOnTick?e[0]:Math.min(this.min,e[0]);this.max=b.endOnTick?e[e.length-1]:Math.max(this.max,e[e.length-1])}else k>f&&(this.tickInterval*=2,this.setTickPositions());if(v(d)){for(a=b=e.length;a--;)(3===d&&1===a%2||2>=d&&0<a&&a<b-1)&&e.splice(a,1);this.finalTickAmt=void 0}}};e.prototype.setScale=function(){var b,a=!1,e=!1;this.series.forEach(function(b){var h;a=a||b.isDirtyData||b.isDirty;e=e||(null===(h=b.xAxis)||\nvoid 0===h?void 0:h.isDirty)||!1});this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();(b=this.len!==this.oldAxisLength)||a||e||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||\nthis.max!==this.oldMax)):this.stacking&&this.stacking.cleanStacks();a&&this.panningState&&(this.panningState.isDirty=!0);C(this,\"afterSetScale\")};e.prototype.setExtremes=function(b,a,e,f,d){var h=this,k=h.chart;e=u(e,!0);h.series.forEach(function(b){delete b.kdTree});d=r(d,{min:b,max:a});C(h,\"setExtremes\",d,function(){h.userMin=b;h.userMax=a;h.eventArgs=d;e&&k.redraw(f)})};e.prototype.zoom=function(b,a){var e=this,h=this.dataMin,f=this.dataMax,d=this.options,k=Math.min(h,u(d.min,h)),c=Math.max(f,\nu(d.max,f));b={newMin:b,newMax:a};C(this,\"zoom\",b,function(b){var a=b.newMin,d=b.newMax;if(a!==e.min||d!==e.max)e.allowZoomOutside||(v(h)&&(a<k&&(a=k),a>c&&(a=c)),v(f)&&(d<k&&(d=k),d>c&&(d=c))),e.displayBtn=\"undefined\"!==typeof a||\"undefined\"!==typeof d,e.setExtremes(a,d,!1,void 0,{trigger:\"zoom\"});b.zoomed=!0});return b.zoomed};e.prototype.setAxisSize=function(){var b=this.chart,a=this.options,e=a.offsets||[0,0,0,0],f=this.horiz,d=this.width=Math.round(E(u(a.width,b.plotWidth-e[3]+e[1]),b.plotWidth)),\nk=this.height=Math.round(E(u(a.height,b.plotHeight-e[0]+e[2]),b.plotHeight)),c=this.top=Math.round(E(u(a.top,b.plotTop+e[0]),b.plotHeight,b.plotTop));a=this.left=Math.round(E(u(a.left,b.plotLeft+e[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-k-c;this.right=b.chartWidth-d-a;this.len=Math.max(f?d:k,0);this.pos=f?a:c};e.prototype.getExtremes=function(){var b=this.logarithmic;return{min:b?L(b.lin2log(this.min)):this.min,max:b?L(b.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,\nuserMin:this.userMin,userMax:this.userMax}};e.prototype.getThreshold=function(b){var a=this.logarithmic,e=a?a.lin2log(this.min):this.min;a=a?a.lin2log(this.max):this.max;null===b||-Infinity===b?b=e:Infinity===b?b=a:e>b?b=e:a<b&&(b=a);return this.translate(b,0,1,0,1)};e.prototype.autoLabelAlign=function(b){var a=(u(b,0)-90*this.side+720)%360;b={align:\"center\"};C(this,\"autoLabelAlign\",b,function(b){15<a&&165>a?b.align=\"right\":195<a&&345>a&&(b.align=\"left\")});return b.align};e.prototype.tickSize=function(b){var a=\nthis.options,e=a[\"tick\"===b?\"tickLength\":\"minorTickLength\"],f=u(a[\"tick\"===b?\"tickWidth\":\"minorTickWidth\"],\"tick\"===b&&this.isXAxis&&!this.categories?1:0);if(f&&e){\"inside\"===a[b+\"Position\"]&&(e=-e);var d=[e,f]}b={tickSize:d};C(this,\"afterTickSize\",b);return b.tickSize};e.prototype.labelMetrics=function(){var b=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[b]&&this.ticks[b].label)};e.prototype.unsquish=\nfunction(){var b=this.options.labels,a=this.horiz,e=this.tickInterval,f=e,d=this.len/(((this.categories?1:0)+this.max-this.min)/e),k,c=b.rotation,l=this.labelMetrics(),m,p=Number.MAX_VALUE,A,w=this.max-this.min,n=function(b){var a=b/(d||1);a=1<a?Math.ceil(a):1;a*e>w&&Infinity!==b&&Infinity!==d&&w&&(a=Math.ceil(w/e));return L(a*e)};a?(A=!b.staggerLines&&!b.step&&(v(c)?[c]:d<u(b.autoRotationLimit,80)&&b.autoRotation))&&A.forEach(function(b){if(b===c||b&&-90<=b&&90>=b){m=n(Math.abs(l.h/Math.sin(Q*b)));\nvar a=m+Math.abs(b/360);a<p&&(p=a,k=b,f=m)}}):b.step||(f=n(l.h));this.autoRotation=A;this.labelRotation=u(k,c);return f};e.prototype.getSlotWidth=function(b){var a,e=this.chart,f=this.horiz,d=this.options.labels,k=Math.max(this.tickPositions.length-(this.categories?0:1),1),c=e.margin[3];if(b&&l(b.slotWidth))return b.slotWidth;if(f&&d&&2>(d.step||0))return d.rotation?0:(this.staggerLines||1)*this.len/k;if(!f){b=null===(a=null===d||void 0===d?void 0:d.style)||void 0===a?void 0:a.width;if(void 0!==b)return parseInt(b,\n10);if(c)return c-e.spacing[3]}return.33*e.chartWidth};e.prototype.renderUnsquish=function(){var b=this.chart,a=b.renderer,e=this.tickPositions,f=this.ticks,d=this.options.labels,c=d&&d.style||{},l=this.horiz,u=this.getSlotWidth(),m=Math.max(1,Math.round(u-2*(d.padding||5))),p={},A=this.labelMetrics(),w=d.style&&d.style.textOverflow,n=0;k(d.rotation)||(p.rotation=d.rotation||0);e.forEach(function(b){b=f[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>n&&(n=b.label.textPxLength)});\nthis.maxLabelLength=n;if(this.autoRotation)n>m&&n>A.h?p.rotation=this.labelRotation:this.labelRotation=0;else if(u){var g=m;if(!w){var E=\"clip\";for(m=e.length;!l&&m--;){var r=e[m];if(r=f[r].label)r.styles&&\"ellipsis\"===r.styles.textOverflow?r.css({textOverflow:\"clip\"}):r.textPxLength>u&&r.css({width:u+\"px\"}),r.getBBox().height>this.len/e.length-(A.h-A.f)&&(r.specificTextOverflow=\"ellipsis\")}}}p.rotation&&(g=n>.5*b.chartHeight?.33*b.chartHeight:n,w||(E=\"ellipsis\"));if(this.labelAlign=d.align||this.autoLabelAlign(this.labelRotation))p.align=\nthis.labelAlign;e.forEach(function(b){var a=(b=f[b])&&b.label,e=c.width,h={};a&&(a.attr(p),b.shortenLabel?b.shortenLabel():g&&!e&&\"nowrap\"!==c.whiteSpace&&(g<a.textPxLength||\"SPAN\"===a.element.tagName)?(h.width=g+\"px\",w||(h.textOverflow=a.specificTextOverflow||E),a.css(h)):a.styles&&a.styles.width&&!h.width&&!e&&a.css({width:null}),delete a.specificTextOverflow,b.rotation=p.rotation)},this);this.tickRotCorr=a.rotCorr(A.b,this.labelRotation||0,0!==this.side)};e.prototype.hasData=function(){return this.series.some(function(b){return b.hasData()})||\nthis.options.showEmpty&&v(this.min)&&v(this.max)};e.prototype.addTitle=function(b){var a=this.chart.renderer,e=this.horiz,d=this.opposite,k=this.options.title,c,l=this.chart.styledMode;this.axisTitle||((c=k.textAlign)||(c=(e?{low:\"left\",middle:\"center\",high:\"right\"}:{low:d?\"right\":\"left\",middle:\"center\",high:d?\"left\":\"right\"})[k.align]),this.axisTitle=a.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:c}).addClass(\"highcharts-axis-title\"),l||this.axisTitle.css(f(k.style)),this.axisTitle.add(this.axisGroup),\nthis.axisTitle.isNew=!0);l||k.style.width||this.isRadial||this.axisTitle.css({width:this.len+\"px\"});this.axisTitle[b?\"show\":\"hide\"](b)};e.prototype.generateTick=function(b){var a=this.ticks;a[b]?a[b].addLabel():a[b]=new q(this,b)};e.prototype.getOffset=function(){var b=this,a=b.chart,e=a.renderer,f=b.options,d=b.tickPositions,k=b.ticks,c=b.horiz,l=b.side,m=a.inverted&&!b.isZAxis?[1,0,3,2][l]:l,p,w=0,n=0,g=f.title,E=f.labels,r=0,M=a.axisOffset;a=a.clipOffset;var F=[-1,1,1,-1][l],t=f.className,P=b.axisParent;\nvar I=b.hasData();b.showAxis=p=I||u(f.showEmpty,!0);b.staggerLines=b.horiz&&E.staggerLines;b.axisGroup||(b.gridGroup=e.g(\"grid\").attr({zIndex:f.gridZIndex||1}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\"-grid \"+(t||\"\")).add(P),b.axisGroup=e.g(\"axis\").attr({zIndex:f.zIndex||2}).addClass(\"highcharts-\"+this.coll.toLowerCase()+\" \"+(t||\"\")).add(P),b.labelGroup=e.g(\"axis-labels\").attr({zIndex:E.zIndex||7}).addClass(\"highcharts-\"+b.coll.toLowerCase()+\"-labels \"+(t||\"\")).add(P));I||b.isLinked?(d.forEach(function(a,\ne){b.generateTick(a,e)}),b.renderUnsquish(),b.reserveSpaceDefault=0===l||2===l||{1:\"left\",3:\"right\"}[l]===b.labelAlign,u(E.reserveSpace,\"center\"===b.labelAlign?!0:null,b.reserveSpaceDefault)&&d.forEach(function(b){r=Math.max(k[b].getLabelSize(),r)}),b.staggerLines&&(r*=b.staggerLines),b.labelOffset=r*(b.opposite?-1:1)):A(k,function(b,a){b.destroy();delete k[a]});if(g&&g.text&&!1!==g.enabled&&(b.addTitle(p),p&&!1!==g.reserveSpace)){b.titleOffset=w=b.axisTitle.getBBox()[c?\"height\":\"width\"];var q=g.offset;\nn=v(q)?0:u(g.margin,c?5:10)}b.renderLine();b.offset=F*u(f.offset,M[l]?M[l]+(f.margin||0):0);b.tickRotCorr=b.tickRotCorr||{x:0,y:0};e=0===l?-b.labelMetrics().h:2===l?b.tickRotCorr.y:0;n=Math.abs(r)+n;r&&(n=n-e+F*(c?u(E.y,b.tickRotCorr.y+8*F):E.x));b.axisTitleMargin=u(q,n);b.getMaxLabelDimensions&&(b.maxLabelDimensions=b.getMaxLabelDimensions(k,d));c=this.tickSize(\"tick\");M[l]=Math.max(M[l],b.axisTitleMargin+w+F*b.offset,n,d&&d.length&&c?c[0]+F*b.offset:0);f=f.offset?0:2*Math.floor(b.axisLine.strokeWidth()/\n2);a[m]=Math.max(a[m],f);C(this,\"afterGetOffset\")};e.prototype.getLinePath=function(b){var a=this.chart,e=this.opposite,f=this.offset,d=this.horiz,k=this.left+(e?this.width:0)+f;f=a.chartHeight-this.bottom-(e?this.height:0)+f;e&&(b*=-1);return a.renderer.crispLine([[\"M\",d?this.left:k,d?f:this.top],[\"L\",d?a.chartWidth-this.right:k,d?f:a.chartHeight-this.bottom]],b)};e.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup),\nthis.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,\"stroke-width\":this.options.lineWidth,zIndex:7}))};e.prototype.getTitlePosition=function(){var b=this.horiz,a=this.left,e=this.top,f=this.len,d=this.options.title,k=b?a:e,c=this.opposite,l=this.offset,u=d.x||0,m=d.y||0,p=this.axisTitle,A=this.chart.renderer.fontMetrics(d.style&&d.style.fontSize,p);p=Math.max(p.getBBox(null,0).height-A.h-1,0);f={low:k+(b?0:f),middle:k+f/2,high:k+(b?f:0)}[d.align];a=(b?e+this.height:a)+(b?1:-1)*\n(c?-1:1)*this.axisTitleMargin+[-p,p,A.f,-p][this.side];b={x:b?f+u:a+(c?this.width:0)+l+u,y:b?a+m-(c?this.height:0)+l:f+m};C(this,\"afterGetTitlePosition\",{titlePosition:b});return b};e.prototype.renderMinorTick=function(b){var a=this.chart.hasRendered&&l(this.oldMin),e=this.minorTicks;e[b]||(e[b]=new q(this,b,\"minor\"));a&&e[b].isNew&&e[b].render(null,!0);e[b].render(null,!1,1)};e.prototype.renderTick=function(b,a){var e=this.isLinked,h=this.ticks,f=this.chart.hasRendered&&l(this.oldMin);if(!e||b>=\nthis.min&&b<=this.max)h[b]||(h[b]=new q(this,b)),f&&h[b].isNew&&h[b].render(a,!0,-1),h[b].render(a)};e.prototype.render=function(){var b=this,a=b.chart,e=b.logarithmic,f=b.options,d=b.isLinked,k=b.tickPositions,u=b.axisTitle,m=b.ticks,p=b.minorTicks,w=b.alternateBands,n=f.stackLabels,g=f.alternateGridColor,E=b.tickmarkOffset,r=b.axisLine,F=b.showAxis,t=D(a.renderer.globalAnimation),v,P;b.labelEdge.length=0;b.overlap=!1;[m,p,w].forEach(function(b){A(b,function(b){b.isActive=!1})});if(b.hasData()||\nd)b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(a){b.renderMinorTick(a)}),k.length&&(k.forEach(function(a,e){b.renderTick(a,e)}),E&&(0===b.min||b.single)&&(m[-1]||(m[-1]=new q(b,-1,null,!0)),m[-1].render(-1))),g&&k.forEach(function(h,f){P=\"undefined\"!==typeof k[f+1]?k[f+1]+E:b.max-E;0===f%2&&h<b.max&&P<=b.max+(a.polar?-E:E)&&(w[h]||(w[h]=new c.PlotLineOrBand(b)),v=h+E,w[h].options={from:e?e.lin2log(v):v,to:e?e.lin2log(P):P,color:g,className:\"highcharts-alternate-grid\"},\nw[h].render(),w[h].isActive=!0)}),b._addedPlotLB||((f.plotLines||[]).concat(f.plotBands||[]).forEach(function(a){b.addPlotBandOrLine(a)}),b._addedPlotLB=!0);[m,p,w].forEach(function(b){var e,h=[],f=t.duration;A(b,function(b,a){b.isActive||(b.render(a,!1,0),b.isActive=!1,h.push(a))});M(function(){for(e=h.length;e--;)b[h[e]]&&!b[h[e]].isActive&&(b[h[e]].destroy(),delete b[h[e]])},b!==w&&a.hasRendered&&f?f:0)});r&&(r[r.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(r.strokeWidth())}),r.isPlaced=!0,r[F?\n\"show\":\"hide\"](F));u&&F&&(f=b.getTitlePosition(),l(f.y)?(u[u.isNew?\"attr\":\"animate\"](f),u.isNew=!1):(u.attr(\"y\",-9999),u.isNew=!0));n&&n.enabled&&b.stacking&&b.stacking.renderStackTotals();b.isDirty=!1;C(this,\"afterRender\")};e.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(b){b.render()}));this.series.forEach(function(b){b.isDirty=!0})};e.prototype.getKeepProps=function(){return this.keepProps||e.keepProps};e.prototype.destroy=function(b){var a=this,\ne=a.plotLinesAndBands,f;C(this,\"destroy\",{keepEvents:b});b||P(a);[a.ticks,a.minorTicks,a.alternateBands].forEach(function(b){K(b)});if(e)for(b=e.length;b--;)e[b].destroy();\"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar\".split(\" \").forEach(function(b){a[b]&&(a[b]=a[b].destroy())});for(f in a.plotLinesAndBandsGroups)a.plotLinesAndBandsGroups[f]=a.plotLinesAndBandsGroups[f].destroy();A(a,function(b,e){-1===a.getKeepProps().indexOf(e)&&delete a[e]})};e.prototype.drawCrosshair=function(b,\na){var e=this.crosshair,h=u(e.snap,!0),f,d=this.cross,k=this.chart;C(this,\"drawCrosshair\",{e:b,point:a});b||(b=this.cross&&this.cross.e);if(this.crosshair&&!1!==(v(a)||!h)){h?v(a)&&(f=u(\"colorAxis\"!==this.coll?a.crosshairPos:null,this.isXAxis?a.plotX:this.len-a.plotY)):f=b&&(this.horiz?b.chartX-this.pos:this.len-b.chartY+this.pos);if(v(f)){var c={value:a&&(this.isXAxis?a.x:u(a.stackY,a.y)),translatedValue:f};k.polar&&r(c,{isCrosshair:!0,chartX:b&&b.chartX,chartY:b&&b.chartY,point:a});c=this.getPlotLinePath(c)||\nnull}if(!v(c)){this.hideCrosshair();return}h=this.categories&&!this.isRadial;d||(this.cross=d=k.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+(h?\"category \":\"thin \")+e.className).attr({zIndex:u(e.zIndex,2)}).add(),k.styledMode||(d.attr({stroke:e.color||(h?g.parse(\"#ccd6eb\").setOpacity(.25).get():\"#cccccc\"),\"stroke-width\":u(e.width,1)}).css({\"pointer-events\":\"none\"}),e.dashStyle&&d.attr({dashstyle:e.dashStyle})));d.show().attr({d:c});h&&!e.width&&d.attr({\"stroke-width\":this.transA});\nthis.cross.e=b}else this.hideCrosshair();C(this,\"afterDrawCrosshair\",{e:b,point:a})};e.prototype.hideCrosshair=function(){this.cross&&this.cross.hide();C(this,\"afterHideCrosshair\")};e.prototype.hasVerticalPanning=function(){var b,a;return/y/.test((null===(a=null===(b=this.chart.options.chart)||void 0===b?void 0:b.panning)||void 0===a?void 0:a.type)||\"\")};e.defaultOptions={dateTimeLabelFormats:{millisecond:{main:\"%H:%M:%S.%L\",range:!1},second:{main:\"%H:%M:%S\",range:!1},minute:{main:\"%H:%M\",range:!1},\nhour:{main:\"%H:%M\",range:!1},day:{main:\"%e. %b\"},week:{main:\"%e. %b\"},month:{main:\"%b '%y\"},year:{main:\"%Y\"}},endOnTick:!1,labels:{enabled:!0,indentation:10,x:0,style:{color:\"#666666\",cursor:\"default\",fontSize:\"11px\"}},maxPadding:.01,minorTickLength:2,minorTickPosition:\"outside\",minPadding:.01,showEmpty:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:\"between\",tickPosition:\"outside\",title:{align:\"middle\",style:{color:\"#666666\"}},type:\"linear\",minorGridLineColor:\"#f2f2f2\",\nminorGridLineWidth:1,minorTickColor:\"#999999\",lineColor:\"#ccd6eb\",lineWidth:1,gridLineColor:\"#e6e6e6\",tickColor:\"#ccd6eb\"};e.defaultYAxisOptions={endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{allowOverlap:!1,enabled:!1,crop:!0,overflow:\"justify\",formatter:function(){var b=this.axis.chart.numberFormatter;return b(this.total,-1)},style:{color:\"#000000\",fontSize:\"11px\",fontWeight:\"bold\",textOutline:\"1px contrast\"}},\ngridLineWidth:1,lineWidth:0};e.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};e.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};e.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.keepProps=\"extKey hcEvents names series userMax userMin\".split(\" \");return e}();c.Axis=y;return c.Axis});O(q,\"parts/DateTimeAxis.js\",[q[\"parts/Axis.js\"],q[\"parts/Utilities.js\"]],\nfunction(g,c){var q=c.addEvent,y=c.getMagnitude,B=c.normalizeTickInterval,H=c.timeUnits,D=function(){function c(c){this.axis=c}c.prototype.normalizeTimeTickInterval=function(c,g){var t=g||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]];g=t[t.length-1];var v=H[g[0]],q=g[1],n;for(n=0;n<t.length&&!(g=t[n],v=H[g[0]],q=g[1],t[n+1]&&c<=(v*q[q.length-1]+H[t[n+\n1][0]])/2);n++);v===H.year&&c<5*v&&(q=[1,2,5]);c=B(c/v,q,\"year\"===g[0]?Math.max(y(c/v),1):1);return{unitRange:v,count:c,unitName:g[0]}};return c}();c=function(){function c(){}c.compose=function(c){c.keepProps.push(\"dateTime\");c.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};q(c,\"init\",function(c){\"datetime\"!==c.userOptions.type?this.dateTime=void 0:this.dateTime||(this.dateTime=new D(this))})};c.AdditionsClass=D;return c}();c.compose(g);return c});\nO(q,\"parts/LogarithmicAxis.js\",[q[\"parts/Axis.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.getMagnitude,B=c.normalizeTickInterval,H=c.pick,D=function(){function c(c){this.axis=c}c.prototype.getLogTickPositions=function(c,g,q,v){var t=this.axis,n=t.len,r=t.options,C=[];v||(this.minorAutoInterval=void 0);if(.5<=c)c=Math.round(c),C=t.getLinearTickPositions(c,g,q);else if(.08<=c){r=Math.floor(g);var I,p;for(n=.3<c?[1,2,4]:.15<c?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];r<q+1&&!p;r++){var m=\nn.length;for(I=0;I<m&&!p;I++){var d=this.log2lin(this.lin2log(r)*n[I]);d>g&&(!v||l<=q)&&\"undefined\"!==typeof l&&C.push(l);l>q&&(p=!0);var l=d}}}else g=this.lin2log(g),q=this.lin2log(q),c=v?t.getMinorTickInterval():r.tickInterval,c=H(\"auto\"===c?null:c,this.minorAutoInterval,r.tickPixelInterval/(v?5:1)*(q-g)/((v?n/t.tickPositions.length:n)||1)),c=B(c,void 0,y(c)),C=t.getLinearTickPositions(c,g,q).map(this.log2lin),v||(this.minorAutoInterval=c/5);v||(t.tickInterval=c);return C};c.prototype.lin2log=function(c){return Math.pow(10,\nc)};c.prototype.log2lin=function(c){return Math.log(c)/Math.LN10};return c}();c=function(){function c(){}c.compose=function(c){c.keepProps.push(\"logarithmic\");var g=c.prototype,t=D.prototype;g.log2lin=t.log2lin;g.lin2log=t.lin2log;q(c,\"init\",function(c){var g=this.logarithmic;\"logarithmic\"!==c.userOptions.type?this.logarithmic=void 0:(g||(g=this.logarithmic=new D(this)),this.log2lin!==g.log2lin&&(g.log2lin=this.log2lin.bind(this)),this.lin2log!==g.lin2log&&(g.lin2log=this.lin2log.bind(this)))});q(c,\n\"afterInit\",function(){var c=this.logarithmic;c&&(this.lin2val=function(g){return c.lin2log(g)},this.val2lin=function(g){return c.log2lin(g)})})};return c}();c.compose(g);return c});O(q,\"parts/PlotLineOrBand.js\",[q[\"parts/Axis.js\"],q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){var y=q.arrayMax,B=q.arrayMin,H=q.defined,D=q.destroyObjectProperties,J=q.erase,t=q.extend,G=q.merge,L=q.objectEach,v=q.pick,K=function(){function n(c,n){this.axis=c;n&&(this.options=n,this.id=n.id)}n.prototype.render=\nfunction(){c.fireEvent(this,\"render\");var n=this,g=n.axis,t=g.horiz,p=g.logarithmic,m=n.options,d=m.label,l=n.label,k=m.to,f=m.from,a=m.value,A=H(f)&&H(k),u=H(a),E=n.svgElem,P=!E,w=[],M=m.color,F=v(m.zIndex,0),q=m.events;w={\"class\":\"highcharts-plot-\"+(A?\"band \":\"line \")+(m.className||\"\")};var e={},b=g.chart.renderer,h=A?\"bands\":\"lines\";p&&(f=p.log2lin(f),k=p.log2lin(k),a=p.log2lin(a));g.chart.styledMode||(u?(w.stroke=M||\"#999999\",w[\"stroke-width\"]=v(m.width,1),m.dashStyle&&(w.dashstyle=m.dashStyle)):\nA&&(w.fill=M||\"#e6ebf5\",m.borderWidth&&(w.stroke=m.borderColor,w[\"stroke-width\"]=m.borderWidth)));e.zIndex=F;h+=\"-\"+F;(p=g.plotLinesAndBandsGroups[h])||(g.plotLinesAndBandsGroups[h]=p=b.g(\"plot-\"+h).attr(e).add());P&&(n.svgElem=E=b.path().attr(w).add(p));if(u)w=g.getPlotLinePath({value:a,lineWidth:E.strokeWidth(),acrossPanes:m.acrossPanes});else if(A)w=g.getPlotBandPath(f,k,m);else return;!n.eventsAdded&&q&&(L(q,function(b,a){E.on(a,function(b){q[a].apply(n,[b])})}),n.eventsAdded=!0);(P||!E.d)&&w&&\nw.length?E.attr({d:w}):E&&(w?(E.show(!0),E.animate({d:w})):E.d&&(E.hide(),l&&(n.label=l=l.destroy())));d&&(H(d.text)||H(d.formatter))&&w&&w.length&&0<g.width&&0<g.height&&!w.isFlat?(d=G({align:t&&A&&\"center\",x:t?!A&&4:10,verticalAlign:!t&&A&&\"middle\",y:t?A?16:10:A?6:-4,rotation:t&&!A&&90},d),this.renderLabel(d,w,A,F)):l&&l.hide();return n};n.prototype.renderLabel=function(c,n,g,p){var m=this.label,d=this.axis.chart.renderer;m||(m={align:c.textAlign||c.align,rotation:c.rotation,\"class\":\"highcharts-plot-\"+\n(g?\"band\":\"line\")+\"-label \"+(c.className||\"\")},m.zIndex=p,p=this.getLabelText(c),this.label=m=d.text(p,0,0,c.useHTML).attr(m).add(),this.axis.chart.styledMode||m.css(c.style));d=n.xBounds||[n[0][1],n[1][1],g?n[2][1]:n[0][1]];n=n.yBounds||[n[0][2],n[1][2],g?n[2][2]:n[0][2]];g=B(d);p=B(n);m.align(c,!1,{x:g,y:p,width:y(d)-g,height:y(n)-p});m.show(!0)};n.prototype.getLabelText=function(c){return H(c.formatter)?c.formatter.call(this):c.text};n.prototype.destroy=function(){J(this.axis.plotLinesAndBands,\nthis);delete this.axis;D(this)};return n}();t(g.prototype,{getPlotBandPath:function(c,g){var n=this.getPlotLinePath({value:g,force:!0,acrossPanes:this.options.acrossPanes}),r=this.getPlotLinePath({value:c,force:!0,acrossPanes:this.options.acrossPanes}),p=[],m=this.horiz,d=1;c=c<this.min&&g<this.min||c>this.max&&g>this.max;if(r&&n){if(c){var l=r.toString()===n.toString();d=0}for(c=0;c<r.length;c+=2){g=r[c];var k=r[c+1],f=n[c],a=n[c+1];\"M\"!==g[0]&&\"L\"!==g[0]||\"M\"!==k[0]&&\"L\"!==k[0]||\"M\"!==f[0]&&\"L\"!==\nf[0]||\"M\"!==a[0]&&\"L\"!==a[0]||(m&&f[1]===g[1]?(f[1]+=d,a[1]+=d):m||f[2]!==g[2]||(f[2]+=d,a[2]+=d),p.push([\"M\",g[1],g[2]],[\"L\",k[1],k[2]],[\"L\",a[1],a[2]],[\"L\",f[1],f[2]],[\"Z\"]));p.isFlat=l}}return p},addPlotBand:function(c){return this.addPlotBandOrLine(c,\"plotBands\")},addPlotLine:function(c){return this.addPlotBandOrLine(c,\"plotLines\")},addPlotBandOrLine:function(c,g){var n=(new K(this,c)).render(),r=this.userOptions;if(n){if(g){var p=r[g]||[];p.push(c);r[g]=p}this.plotLinesAndBands.push(n);this._addedPlotLB=\n!0}return n},removePlotBandOrLine:function(c){for(var n=this.plotLinesAndBands,g=this.options,t=this.userOptions,p=n.length;p--;)n[p].id===c&&n[p].destroy();[g.plotLines||[],t.plotLines||[],g.plotBands||[],t.plotBands||[]].forEach(function(m){for(p=m.length;p--;)(m[p]||{}).id===c&&J(m,m[p])})},removePlotBand:function(c){this.removePlotBandOrLine(c)},removePlotLine:function(c){this.removePlotBandOrLine(c)}});c.PlotLineOrBand=K;return c.PlotLineOrBand});O(q,\"parts/Tooltip.js\",[q[\"parts/Globals.js\"],\nq[\"parts/Utilities.js\"]],function(g,c){var q=g.doc,y=c.clamp,B=c.css,H=c.defined,D=c.discardElement,J=c.extend,t=c.fireEvent,G=c.format,L=c.isNumber,v=c.isString,K=c.merge,n=c.pick,r=c.splat,C=c.syncTimeout,I=c.timeUnits;\"\";var p=function(){function m(d,c){this.container=void 0;this.crosshairs=[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=d;this.init(d,c)}m.prototype.applyFilter=function(){var d=this.chart;d.renderer.definition({tagName:\"filter\",\nid:\"drop-shadow-\"+d.index,opacity:.5,children:[{tagName:\"feGaussianBlur\",\"in\":\"SourceAlpha\",stdDeviation:1},{tagName:\"feOffset\",dx:1,dy:1},{tagName:\"feComponentTransfer\",children:[{tagName:\"feFuncA\",type:\"linear\",slope:.3}]},{tagName:\"feMerge\",children:[{tagName:\"feMergeNode\"},{tagName:\"feMergeNode\",\"in\":\"SourceGraphic\"}]}]});d.renderer.definition({tagName:\"style\",textContent:\".highcharts-tooltip-\"+d.index+\"{filter:url(#drop-shadow-\"+d.index+\")}\"})};m.prototype.bodyFormatter=function(d){return d.map(function(d){var k=\nd.series.tooltipOptions;return(k[(d.point.formatPrefix||\"point\")+\"Formatter\"]||d.point.tooltipFormatter).call(d.point,k[(d.point.formatPrefix||\"point\")+\"Format\"]||\"\")})};m.prototype.cleanSplit=function(d){this.chart.series.forEach(function(c){var k=c&&c.tt;k&&(!k.isActive||d?c.tt=k.destroy():k.isActive=!1)})};m.prototype.defaultFormatter=function(d){var c=this.points||r(this);var k=[d.tooltipFooterHeaderFormatter(c[0])];k=k.concat(d.bodyFormatter(c));k.push(d.tooltipFooterHeaderFormatter(c[0],!0));\nreturn k};m.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),D(this.container));c.clearTimeout(this.hideTimer);c.clearTimeout(this.tooltipTimeout)};m.prototype.getAnchor=function(d,c){var k=this.chart,f=k.pointer,a=k.inverted,l=k.plotTop,u=k.plotLeft,m=0,p=0,w,n;d=r(d);this.followPointer&&c?(\"undefined\"===typeof c.chartX&&(c=f.normalize(c)),\nd=[c.chartX-u,c.chartY-l]):d[0].tooltipPos?d=d[0].tooltipPos:(d.forEach(function(f){w=f.series.yAxis;n=f.series.xAxis;m+=f.plotX+(!a&&n?n.left-u:0);p+=(f.plotLow?(f.plotLow+f.plotHigh)/2:f.plotY)+(!a&&w?w.top-l:0)}),m/=d.length,p/=d.length,d=[a?k.plotWidth-p:m,this.shared&&!a&&1<d.length&&c?c.chartY-l:a?k.plotHeight-m:p]);return d.map(Math.round)};m.prototype.getDateFormat=function(d,c,k,f){var a=this.chart.time,l=a.dateFormat(\"%m-%d %H:%M:%S.%L\",c),u={millisecond:15,second:12,minute:9,hour:6,day:3},\nm=\"millisecond\";for(p in I){if(d===I.week&&+a.dateFormat(\"%w\",c)===k&&\"00:00:00.000\"===l.substr(6)){var p=\"week\";break}if(I[p]>d){p=m;break}if(u[p]&&l.substr(u[p])!==\"01-01 00:00:00.000\".substr(u[p]))break;\"week\"!==p&&(m=p)}if(p)var w=a.resolveDTLFormat(f[p]).main;return w};m.prototype.getLabel=function(){var d,c,k=this,f=this.chart.renderer,a=this.chart.styledMode,m=this.options,u=\"tooltip\"+(H(m.className)?\" \"+m.className:\"\"),p=(null===(d=m.style)||void 0===d?void 0:d.pointerEvents)||(!this.followPointer&&\nm.stickOnContact?\"auto\":\"none\"),n;d=function(){k.inContact=!0};var w=function(){var a=k.chart.hoverSeries;k.inContact=!1;if(a&&a.onMouseOut)a.onMouseOut()};if(!this.label){this.outside&&(this.container=n=g.doc.createElement(\"div\"),n.className=\"highcharts-tooltip-container\",B(n,{position:\"absolute\",top:\"1px\",pointerEvents:p,zIndex:3}),g.doc.body.appendChild(n),this.renderer=f=new g.Renderer(n,0,0,null===(c=this.chart.options.chart)||void 0===c?void 0:c.style,void 0,void 0,f.styledMode));this.split?\nthis.label=f.g(u):(this.label=f.label(\"\",0,0,m.shape||\"callout\",null,null,m.useHTML,null,u).attr({padding:m.padding,r:m.borderRadius}),a||this.label.attr({fill:m.backgroundColor,\"stroke-width\":m.borderWidth}).css(m.style).css({pointerEvents:p}).shadow(m.shadow));a&&(this.applyFilter(),this.label.addClass(\"highcharts-tooltip-\"+this.chart.index));if(k.outside&&!k.split){var r=this.label,F=r.xSetter,t=r.ySetter;r.xSetter=function(a){F.call(r,k.distance);n.style.left=a+\"px\"};r.ySetter=function(a){t.call(r,\nk.distance);n.style.top=a+\"px\"}}this.label.on(\"mouseenter\",d).on(\"mouseleave\",w).attr({zIndex:8}).add()}return this.label};m.prototype.getPosition=function(d,c,k){var f=this.chart,a=this.distance,l={},m=f.inverted&&k.h||0,p,g=this.outside,w=g?q.documentElement.clientWidth-2*a:f.chartWidth,r=g?Math.max(q.body.scrollHeight,q.documentElement.scrollHeight,q.body.offsetHeight,q.documentElement.offsetHeight,q.documentElement.clientHeight):f.chartHeight,F=f.pointer.getChartPosition(),t=f.containerScaling,\ne=function(b){return t?b*t.scaleX:b},b=function(b){return t?b*t.scaleY:b},h=function(h){var l=\"x\"===h;return[h,l?w:r,l?d:c].concat(g?[l?e(d):b(c),l?F.left-a+e(k.plotX+f.plotLeft):F.top-a+b(k.plotY+f.plotTop),0,l?w:r]:[l?d:c,l?k.plotX+f.plotLeft:k.plotY+f.plotTop,l?f.plotLeft:f.plotTop,l?f.plotLeft+f.plotWidth:f.plotTop+f.plotHeight])},z=h(\"y\"),x=h(\"x\"),C=!this.followPointer&&n(k.ttBelow,!f.inverted===!!k.negative),v=function(h,f,d,c,k,u,p){var x=\"y\"===h?b(a):e(a),w=(d-c)/2,n=c<k-a,A=k+a+c<f,g=k-x-\nd+w;k=k+x-w;if(C&&A)l[h]=k;else if(!C&&n)l[h]=g;else if(n)l[h]=Math.min(p-c,0>g-m?g:g-m);else if(A)l[h]=Math.max(u,k+m+d>f?k:k+m);else return!1},I=function(b,e,h,f,d){var c;d<a||d>e-a?c=!1:l[b]=d<h/2?1:d>e-f/2?e-f-2:d-h/2;return c},V=function(b){var a=z;z=x;x=a;p=b},G=function(){!1!==v.apply(0,z)?!1!==I.apply(0,x)||p||(V(!0),G()):p?l.x=l.y=0:(V(!0),G())};(f.inverted||1<this.len)&&V();G();return l};m.prototype.getXDateFormat=function(d,c,k){c=c.dateTimeLabelFormats;var f=k&&k.closestPointRange;return(f?\nthis.getDateFormat(f,d.x,k.options.startOfWeek,c):c.day)||c.year};m.prototype.hide=function(d){var l=this;c.clearTimeout(this.hideTimer);d=n(d,this.options.hideDelay,500);this.isHidden||(this.hideTimer=C(function(){l.getLabel().fadeOut(d?void 0:d);l.isHidden=!0},d))};m.prototype.init=function(d,c){this.chart=d;this.options=c;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=c.split&&!d.inverted&&!d.polar;this.shared=c.shared||this.split;this.outside=n(c.outside,!(!d.scrollablePixelsX&&\n!d.scrollablePixelsY))};m.prototype.isStickyOnContact=function(){return!(this.followPointer||!this.options.stickOnContact||!this.inContact)};m.prototype.move=function(d,l,k,f){var a=this,m=a.now,u=!1!==a.options.animation&&!a.isHidden&&(1<Math.abs(d-m.x)||1<Math.abs(l-m.y)),p=a.followPointer||1<a.len;J(m,{x:u?(2*m.x+d)/3:d,y:u?(m.y+l)/2:l,anchorX:p?void 0:u?(2*m.anchorX+k)/3:k,anchorY:p?void 0:u?(m.anchorY+f)/2:f});a.getLabel().attr(m);a.drawTracker();u&&(c.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=\nsetTimeout(function(){a&&a.move(d,l,k,f)},32))};m.prototype.refresh=function(d,l){var k=this.chart,f=this.options,a=d,m={},u=[],p=f.formatter||this.defaultFormatter;m=this.shared;var g=k.styledMode;if(f.enabled){c.clearTimeout(this.hideTimer);this.followPointer=r(a)[0].series.tooltipOptions.followPointer;var w=this.getAnchor(a,l);l=w[0];var M=w[1];!m||a.series&&a.series.noSharedTooltip?m=a.getLabelConfig():(k.pointer.applyInactiveState(a),a.forEach(function(a){a.setState(\"hover\");u.push(a.getLabelConfig())}),\nm={x:a[0].category,y:a[0].y},m.points=u,a=a[0]);this.len=u.length;k=p.call(m,this);p=a.series;this.distance=n(p.tooltipOptions.distance,16);!1===k?this.hide():(this.split?this.renderSplit(k,r(d)):(d=this.getLabel(),f.style.width&&!g||d.css({width:this.chart.spacingBox.width+\"px\"}),d.attr({text:k&&k.join?k.join(\"\"):k}),d.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+n(a.colorIndex,p.colorIndex)),g||d.attr({stroke:f.borderColor||a.color||p.color||\"#666666\"}),this.updatePosition({plotX:l,\nplotY:M,negative:a.negative,ttBelow:a.ttBelow,h:w[2]||0})),this.isHidden&&this.label&&this.label.attr({opacity:1}).show(),this.isHidden=!1);t(this,\"refresh\")}};m.prototype.renderSplit=function(d,c){function k(b,a,e,h,f){void 0===f&&(f=!0);e?(a=V?0:D,b=y(b-h/2,q.left,q.right-h)):(a-=G,b=f?b-h-z:b+z,b=y(b,f?b:q.left,q.right));return{x:b,y:a}}var f=this,a=f.chart,l=f.chart,m=l.plotHeight,p=l.plotLeft,r=l.plotTop,w=l.pointer,M=l.renderer,F=l.scrollablePixelsY,t=void 0===F?0:F;F=l.scrollingContainer;F=\nvoid 0===F?{scrollLeft:0,scrollTop:0}:F;var e=F.scrollLeft,b=F.scrollTop,h=l.styledMode,z=f.distance,x=f.options,C=f.options.positioner,q={left:e,right:e+l.chartWidth,top:b,bottom:b+l.chartHeight},I=f.getLabel(),V=!(!a.xAxis[0]||!a.xAxis[0].opposite),G=r+b,K=0,D=m-t;v(d)&&(d=[!1,d]);d=d.slice(0,c.length+1).reduce(function(a,e,d){if(!1!==e&&\"\"!==e){d=c[d-1]||{isHeader:!0,plotX:c[0].plotX,plotY:m,series:{}};var l=d.isHeader,u=l?f:d.series,w=u.tt,g=d.isHeader;var A=d.series;var E=\"highcharts-color-\"+\nn(d.colorIndex,A.colorIndex,\"none\");w||(w={padding:x.padding,r:x.borderRadius},h||(w.fill=x.backgroundColor,w[\"stroke-width\"]=x.borderWidth),w=M.label(\"\",0,0,x[g?\"headerShape\":\"shape\"]||\"callout\",void 0,void 0,x.useHTML).addClass((g?\"highcharts-tooltip-header \":\"\")+\"highcharts-tooltip-box \"+E).attr(w).add(I));w.isActive=!0;w.attr({text:e});h||w.css(x.style).shadow(x.shadow).attr({stroke:x.borderColor||d.color||A.color||\"#333333\"});e=u.tt=w;g=e.getBBox();u=g.width+e.strokeWidth();l&&(K=g.height,D+=\nK,V&&(G-=K));A=d.plotX;A=void 0===A?0:A;E=d.plotY;E=void 0===E?0:E;var F=d.series;if(d.isHeader){A=p+A;var S=r+m/2}else w=F.xAxis,F=F.yAxis,A=w.pos+y(A,-z,w.len+z),F.pos+E>=b+r&&F.pos+E<=b+r+m-t&&(S=F.pos+E);A=y(A,q.left-z,q.right+z);\"number\"===typeof S?(g=g.height+1,E=C?C.call(f,u,g,d):k(A,S,l,u),a.push({align:C?0:void 0,anchorX:A,anchorY:S,boxWidth:u,point:d,rank:n(E.rank,l?1:0),size:g,target:E.y,tt:e,x:E.x})):e.isActive=!1}return a},[]);!C&&d.some(function(b){return b.x<q.left})&&(d=d.map(function(b){var a=\nk(b.anchorX,b.anchorY,b.point.isHeader,b.boxWidth,!1);return J(b,{target:a.y,x:a.x})}));f.cleanSplit();g.distribute(d,D);d.forEach(function(b){var a=b.pos;b.tt.attr({visibility:\"undefined\"===typeof a?\"hidden\":\"inherit\",x:b.x,y:a+G,anchorX:b.anchorX,anchorY:b.anchorY})});d=f.container;a=f.renderer;f.outside&&d&&a&&(l=I.getBBox(),a.setSize(l.width+l.x,l.height+l.y,!1),w=w.getChartPosition(),d.style.left=w.left+\"px\",d.style.top=w.top+\"px\")};m.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&\nthis.tracker.destroy();else{var d=this.chart,c=this.label,k=d.hoverPoint;if(c&&k){var f={x:0,y:0,width:0,height:0};k=this.getAnchor(k);var a=c.getBBox();k[0]+=d.plotLeft-c.translateX;k[1]+=d.plotTop-c.translateY;f.x=Math.min(0,k[0]);f.y=Math.min(0,k[1]);f.width=0>k[0]?Math.max(Math.abs(k[0]),a.width-k[0]):Math.max(Math.abs(k[0]),a.width);f.height=0>k[1]?Math.max(Math.abs(k[1]),a.height-Math.abs(k[1])):Math.max(Math.abs(k[1]),a.height);this.tracker?this.tracker.attr(f):(this.tracker=c.renderer.rect(f).addClass(\"highcharts-tracker\").add(c),\nd.styledMode||this.tracker.attr({fill:\"rgba(0,0,0,0)\"}))}}};m.prototype.styledModeFormat=function(d){return d.replace('style=\"font-size: 10px\"','class=\"highcharts-header\"').replace(/style=\"color:{(point|series)\\.color}\"/g,'class=\"highcharts-color-{$1.colorIndex}\"')};m.prototype.tooltipFooterHeaderFormatter=function(d,c){var k=c?\"footer\":\"header\",f=d.series,a=f.tooltipOptions,l=a.xDateFormat,m=f.xAxis,p=m&&\"datetime\"===m.options.type&&L(d.key),n=a[k+\"Format\"];c={isFooter:c,labelConfig:d};t(this,\"headerFormatter\",\nc,function(c){p&&!l&&(l=this.getXDateFormat(d,a,m));p&&l&&(d.point&&d.point.tooltipDateKeys||[\"key\"]).forEach(function(a){n=n.replace(\"{point.\"+a+\"}\",\"{point.\"+a+\":\"+l+\"}\")});f.chart.styledMode&&(n=this.styledModeFormat(n));c.text=G(n,{point:d,series:f},this.chart)});return c.text};m.prototype.update=function(d){this.destroy();K(!0,this.chart.options.tooltip.userOptions,d);this.init(this.chart,K(!0,this.options,d))};m.prototype.updatePosition=function(d){var c=this.chart,k=c.pointer,f=this.getLabel(),\na=d.plotX+c.plotLeft,m=d.plotY+c.plotTop;k=k.getChartPosition();d=(this.options.positioner||this.getPosition).call(this,f.width,f.height,d);if(this.outside){var p=(this.options.borderWidth||0)+2*this.distance;this.renderer.setSize(f.width+p,f.height+p,!1);if(c=c.containerScaling)B(this.container,{transform:\"scale(\"+c.scaleX+\", \"+c.scaleY+\")\"}),a*=c.scaleX,m*=c.scaleY;a+=k.left-d.x;m+=k.top-d.y}this.move(Math.round(d.x),Math.round(d.y||0),a,m)};return m}();g.Tooltip=p;return g.Tooltip});O(q,\"parts/Pointer.js\",\n[q[\"parts/Color.js\"],q[\"parts/Globals.js\"],q[\"parts/Tooltip.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=g.parse,H=c.charts,D=c.noop,J=y.addEvent,t=y.attr,G=y.css,L=y.defined,v=y.extend,K=y.find,n=y.fireEvent,r=y.isNumber,C=y.isObject,I=y.objectEach,p=y.offset,m=y.pick,d=y.splat;\"\";g=function(){function l(d,f){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.chart=d;this.hasDragged=!1;this.options=f;this.unbindContainerMouseLeave=function(){};this.init(d,f)}l.prototype.applyInactiveState=\nfunction(d){var f=[],a;(d||[]).forEach(function(d){a=d.series;f.push(a);a.linkedParent&&f.push(a.linkedParent);a.linkedSeries&&(f=f.concat(a.linkedSeries));a.navigatorSeries&&f.push(a.navigatorSeries)});this.chart.series.forEach(function(a){-1===f.indexOf(a)?a.setState(\"inactive\",!0):a.options.inactiveOtherPoints&&a.setAllPointsToState(\"inactive\")})};l.prototype.destroy=function(){var d=this;\"undefined\"!==typeof d.unDocMouseMove&&d.unDocMouseMove();this.unbindContainerMouseLeave();c.chartCount||(c.unbindDocumentMouseUp&&\n(c.unbindDocumentMouseUp=c.unbindDocumentMouseUp()),c.unbindDocumentTouchEnd&&(c.unbindDocumentTouchEnd=c.unbindDocumentTouchEnd()));clearInterval(d.tooltipTimeout);I(d,function(f,a){d[a]=void 0})};l.prototype.drag=function(d){var f=this.chart,a=f.options.chart,c=d.chartX,k=d.chartY,l=this.zoomHor,m=this.zoomVert,p=f.plotLeft,n=f.plotTop,g=f.plotWidth,r=f.plotHeight,e=this.selectionMarker,b=this.mouseDownX||0,h=this.mouseDownY||0,z=C(a.panning)?a.panning&&a.panning.enabled:a.panning,x=a.panKey&&d[a.panKey+\n\"Key\"];if(!e||!e.touch)if(c<p?c=p:c>p+g&&(c=p+g),k<n?k=n:k>n+r&&(k=n+r),this.hasDragged=Math.sqrt(Math.pow(b-c,2)+Math.pow(h-k,2)),10<this.hasDragged){var t=f.isInsidePlot(b-p,h-n);f.hasCartesianSeries&&(this.zoomX||this.zoomY)&&t&&!x&&!e&&(this.selectionMarker=e=f.renderer.rect(p,n,l?1:g,m?1:r,0).attr({\"class\":\"highcharts-selection-marker\",zIndex:7}).add(),f.styledMode||e.attr({fill:a.selectionMarkerFill||B(\"#335cad\").setOpacity(.25).get()}));e&&l&&(c-=b,e.attr({width:Math.abs(c),x:(0<c?0:c)+b}));\ne&&m&&(c=k-h,e.attr({height:Math.abs(c),y:(0<c?0:c)+h}));t&&!e&&z&&f.pan(d,a.panning)}};l.prototype.dragStart=function(d){var f=this.chart;f.mouseIsDown=d.type;f.cancelClick=!1;f.mouseDownX=this.mouseDownX=d.chartX;f.mouseDownY=this.mouseDownY=d.chartY};l.prototype.drop=function(d){var f=this,a=this.chart,c=this.hasPinched;if(this.selectionMarker){var k={originalEvent:d,xAxis:[],yAxis:[]},l=this.selectionMarker,m=l.attr?l.attr(\"x\"):l.x,p=l.attr?l.attr(\"y\"):l.y,g=l.attr?l.attr(\"width\"):l.width,F=l.attr?\nl.attr(\"height\"):l.height,t;if(this.hasDragged||c)a.axes.forEach(function(a){if(a.zoomEnabled&&L(a.min)&&(c||f[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[a.coll]])&&r(m)&&r(p)){var b=a.horiz,e=\"touchend\"===d.type?a.minPixelPadding:0,l=a.toValue((b?m:p)+e);b=a.toValue((b?m+g:p+F)-e);k[a.coll].push({axis:a,min:Math.min(l,b),max:Math.max(l,b)});t=!0}}),t&&n(a,\"selection\",k,function(e){a.zoom(v(e,c?{animation:!1}:null))});r(a.index)&&(this.selectionMarker=this.selectionMarker.destroy());c&&this.scaleGroups()}a&&r(a.index)&&\n(G(a.container,{cursor:a._cursor}),a.cancelClick=10<this.hasDragged,a.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};l.prototype.findNearestKDPoint=function(d,f,a){var c=this.chart,k=c.hoverPoint;c=c.tooltip;if(k&&c&&c.isStickyOnContact())return k;var l;d.forEach(function(d){var c=!(d.noSharedTooltip&&f)&&0>d.options.findNearestPointBy.indexOf(\"y\");d=d.searchPoint(a,c);if((c=C(d,!0))&&!(c=!C(l,!0))){c=l.distX-d.distX;var k=l.dist-d.dist,m=(d.series.group&&d.series.group.zIndex)-\n(l.series.group&&l.series.group.zIndex);c=0<(0!==c&&f?c:0!==k?k:0!==m?m:l.series.index>d.series.index?-1:1)}c&&(l=d)});return l};l.prototype.getChartCoordinatesFromPoint=function(d,f){var a=d.series,c=a.xAxis;a=a.yAxis;var k=m(d.clientX,d.plotX),l=d.shapeArgs;if(c&&a)return f?{chartX:c.len+c.pos-k,chartY:a.len+a.pos-d.plotY}:{chartX:k+c.pos,chartY:d.plotY+a.pos};if(l&&l.x&&l.y)return{chartX:l.x,chartY:l.y}};l.prototype.getChartPosition=function(){return this.chartPosition||(this.chartPosition=p(this.chart.container))};\nl.prototype.getCoordinates=function(d){var f={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(a){f[a.isXAxis?\"xAxis\":\"yAxis\"].push({axis:a,value:a.toValue(d[a.horiz?\"chartX\":\"chartY\"])})});return f};l.prototype.getHoverData=function(d,f,a,c,l,p){var k,u=[];c=!(!c||!d);var g=f&&!f.stickyTracking,A={chartX:p?p.chartX:void 0,chartY:p?p.chartY:void 0,shared:l};n(this,\"beforeGetHoverData\",A);g=g?[f]:a.filter(function(a){return A.filter?A.filter(a):a.visible&&!(!l&&a.directTouch)&&m(a.options.enableMouseTracking,\n!0)&&a.stickyTracking});f=(k=c||!p?d:this.findNearestKDPoint(g,l,p))&&k.series;k&&(l&&!f.noSharedTooltip?(g=a.filter(function(a){return A.filter?A.filter(a):a.visible&&!(!l&&a.directTouch)&&m(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),g.forEach(function(a){var e=K(a.points,function(b){return b.x===k.x&&!b.isNull});C(e)&&(a.chart.isBoosting&&(e=a.getPoint(e)),u.push(e))})):u.push(k));A={hoverPoint:k};n(this,\"afterGetHoverData\",A);return{hoverPoint:A.hoverPoint,hoverSeries:f,hoverPoints:u}};\nl.prototype.getPointFromEvent=function(d){d=d.target;for(var f;d&&!f;)f=d.point,d=d.parentNode;return f};l.prototype.onTrackerMouseOut=function(d){d=d.relatedTarget||d.toElement;var f=this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!f||!d||f.stickyTracking||this.inClass(d,\"highcharts-tooltip\")||this.inClass(d,\"highcharts-series-\"+f.index)&&this.inClass(d,\"highcharts-tracker\")))f.onMouseOut()};l.prototype.inClass=function(d,f){for(var a;d;){if(a=t(d,\"class\")){if(-1!==a.indexOf(f))return!0;if(-1!==\na.indexOf(\"highcharts-container\"))return!1}d=d.parentNode}};l.prototype.init=function(d,f){this.options=f;this.chart=d;this.runChartClick=f.chart.events&&!!f.chart.events.click;this.pinchDown=[];this.lastValidTouch={};q&&(d.tooltip=new q(d,f.tooltip),this.followTouchMove=m(f.tooltip.followTouchMove,!0));this.setDOMEvents()};l.prototype.normalize=function(d,f){var a=d.touches,c=a?a.length?a.item(0):m(a.changedTouches,d.changedTouches)[0]:d;f||(f=this.getChartPosition());a=c.pageX-f.left;f=c.pageY-\nf.top;if(c=this.chart.containerScaling)a/=c.scaleX,f/=c.scaleY;return v(d,{chartX:Math.round(a),chartY:Math.round(f)})};l.prototype.onContainerClick=function(d){var f=this.chart,a=f.hoverPoint;d=this.normalize(d);var c=f.plotLeft,k=f.plotTop;f.cancelClick||(a&&this.inClass(d.target,\"highcharts-tracker\")?(n(a.series,\"click\",v(d,{point:a})),f.hoverPoint&&a.firePointEvent(\"click\",d)):(v(d,this.getCoordinates(d)),f.isInsidePlot(d.chartX-c,d.chartY-k)&&n(f,\"click\",d)))};l.prototype.onContainerMouseDown=\nfunction(d){d=this.normalize(d);if(c.isFirefox&&0!==d.button)this.onContainerMouseMove(d);if(\"undefined\"===typeof d.button||1===((d.buttons||d.button)&1))this.zoomOption(d),this.dragStart(d)};l.prototype.onContainerMouseLeave=function(d){var f=H[m(c.hoverChartIndex,-1)],a=this.chart.tooltip;d=this.normalize(d);f&&(d.relatedTarget||d.toElement)&&(f.pointer.reset(),f.pointer.chartPosition=void 0);a&&!a.isHidden&&this.reset()};l.prototype.onContainerMouseMove=function(d){var f=this.chart;d=this.normalize(d);\nthis.setHoverChartIndex();d.preventDefault||(d.returnValue=!1);\"mousedown\"===f.mouseIsDown&&this.drag(d);f.openMenu||!this.inClass(d.target,\"highcharts-tracker\")&&!f.isInsidePlot(d.chartX-f.plotLeft,d.chartY-f.plotTop)||this.runPointActions(d)};l.prototype.onDocumentTouchEnd=function(d){H[c.hoverChartIndex]&&H[c.hoverChartIndex].pointer.drop(d)};l.prototype.onContainerTouchMove=function(d){this.touch(d)};l.prototype.onContainerTouchStart=function(d){this.zoomOption(d);this.touch(d,!0)};l.prototype.onDocumentMouseMove=\nfunction(d){var f=this.chart,a=this.chartPosition;d=this.normalize(d,a);var c=f.tooltip;!a||c&&c.isStickyOnContact()||f.isInsidePlot(d.chartX-f.plotLeft,d.chartY-f.plotTop)||this.inClass(d.target,\"highcharts-tracker\")||this.reset()};l.prototype.onDocumentMouseUp=function(d){var f=H[m(c.hoverChartIndex,-1)];f&&f.pointer.drop(d)};l.prototype.pinch=function(d){var f=this,a=f.chart,c=f.pinchDown,k=d.touches||[],l=k.length,p=f.lastValidTouch,n=f.hasZoom,g=f.selectionMarker,r={},t=1===l&&(f.inClass(d.target,\n\"highcharts-tracker\")&&a.runTrackerClick||f.runChartClick),e={};1<l&&(f.initiated=!0);n&&f.initiated&&!t&&d.preventDefault();[].map.call(k,function(b){return f.normalize(b)});\"touchstart\"===d.type?([].forEach.call(k,function(b,a){c[a]={chartX:b.chartX,chartY:b.chartY}}),p.x=[c[0].chartX,c[1]&&c[1].chartX],p.y=[c[0].chartY,c[1]&&c[1].chartY],a.axes.forEach(function(b){if(b.zoomEnabled){var e=a.bounds[b.horiz?\"h\":\"v\"],f=b.minPixelPadding,d=b.toPixels(Math.min(m(b.options.min,b.dataMin),b.dataMin)),\nc=b.toPixels(Math.max(m(b.options.max,b.dataMax),b.dataMax)),k=Math.max(d,c);e.min=Math.min(b.pos,Math.min(d,c)-f);e.max=Math.max(b.pos+b.len,k+f)}}),f.res=!0):f.followTouchMove&&1===l?this.runPointActions(f.normalize(d)):c.length&&(g||(f.selectionMarker=g=v({destroy:D,touch:!0},a.plotBox)),f.pinchTranslate(c,k,r,g,e,p),f.hasPinched=n,f.scaleGroups(r,e),f.res&&(f.res=!1,this.reset(!1,0)))};l.prototype.pinchTranslate=function(d,f,a,c,l,m){this.zoomHor&&this.pinchTranslateDirection(!0,d,f,a,c,l,m);\nthis.zoomVert&&this.pinchTranslateDirection(!1,d,f,a,c,l,m)};l.prototype.pinchTranslateDirection=function(d,f,a,c,l,m,p,n){var k=this.chart,u=d?\"x\":\"y\",g=d?\"X\":\"Y\",e=\"chart\"+g,b=d?\"width\":\"height\",h=k[\"plot\"+(d?\"Left\":\"Top\")],w,x,A=n||1,r=k.inverted,E=k.bounds[d?\"h\":\"v\"],t=1===f.length,C=f[0][e],v=a[0][e],q=!t&&f[1][e],I=!t&&a[1][e];a=function(){\"number\"===typeof I&&20<Math.abs(C-q)&&(A=n||Math.abs(v-I)/Math.abs(C-q));x=(h-v)/A+C;w=k[\"plot\"+(d?\"Width\":\"Height\")]/A};a();f=x;if(f<E.min){f=E.min;var P=\n!0}else f+w>E.max&&(f=E.max-w,P=!0);P?(v-=.8*(v-p[u][0]),\"number\"===typeof I&&(I-=.8*(I-p[u][1])),a()):p[u]=[v,I];r||(m[u]=x-h,m[b]=w);m=r?1/A:A;l[b]=w;l[u]=f;c[r?d?\"scaleY\":\"scaleX\":\"scale\"+g]=A;c[\"translate\"+g]=m*h+(v-m*C)};l.prototype.reset=function(c,f){var a=this.chart,k=a.hoverSeries,l=a.hoverPoint,m=a.hoverPoints,p=a.tooltip,n=p&&p.shared?m:l;c&&n&&d(n).forEach(function(a){a.series.isCartesian&&\"undefined\"===typeof a.plotX&&(c=!1)});if(c)p&&n&&d(n).length&&(p.refresh(n),p.shared&&m?m.forEach(function(a){a.setState(a.state,\n!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,a),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):l&&(l.setState(l.state,!0),a.axes.forEach(function(a){a.crosshair&&l.series[a.coll]===a&&a.drawCrosshair(null,l)})));else{if(l)l.onMouseOut();m&&m.forEach(function(a){a.setState()});if(k)k.onMouseOut();p&&p.hide(f);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());a.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=a.hoverPoints=\na.hoverPoint=null}};l.prototype.runPointActions=function(d,f){var a=this.chart,k=a.tooltip&&a.tooltip.options.enabled?a.tooltip:void 0,l=k?k.shared:!1,p=f||a.hoverPoint,n=p&&p.series||a.hoverSeries;n=this.getHoverData(p,n,a.series,(!d||\"touchmove\"!==d.type)&&(!!f||n&&n.directTouch&&this.isDirectTouch),l,d);p=n.hoverPoint;var g=n.hoverPoints;f=(n=n.hoverSeries)&&n.tooltipOptions.followPointer;l=l&&n&&!n.noSharedTooltip;if(p&&(p!==a.hoverPoint||k&&k.isHidden)){(a.hoverPoints||[]).forEach(function(a){-1===\ng.indexOf(a)&&a.setState()});if(a.hoverSeries!==n)n.onMouseOver();this.applyInactiveState(g);(g||[]).forEach(function(a){a.setState(\"hover\")});a.hoverPoint&&a.hoverPoint.firePointEvent(\"mouseOut\");if(!p.series)return;a.hoverPoints=g;a.hoverPoint=p;p.firePointEvent(\"mouseOver\");k&&k.refresh(l?g:p,d)}else f&&k&&!k.isHidden&&(p=k.getAnchor([{}],d),k.updatePosition({plotX:p[0],plotY:p[1]}));this.unDocMouseMove||(this.unDocMouseMove=J(a.container.ownerDocument,\"mousemove\",function(a){var f=H[c.hoverChartIndex];\nif(f)f.pointer.onDocumentMouseMove(a)}));a.axes.forEach(function(f){var c=m((f.crosshair||{}).snap,!0),k;c&&((k=a.hoverPoint)&&k.series[f.coll]===f||(k=K(g,function(a){return a.series[f.coll]===f})));k||!c?f.drawCrosshair(d,k):f.hideCrosshair()})};l.prototype.scaleGroups=function(d,f){var a=this.chart,c;a.series.forEach(function(k){c=d||k.getPlotBox();k.xAxis&&k.xAxis.zoomEnabled&&k.group&&(k.group.attr(c),k.markerGroup&&(k.markerGroup.attr(c),k.markerGroup.clip(f?a.clipRect:null)),k.dataLabelsGroup&&\nk.dataLabelsGroup.attr(c))});a.clipRect.attr(f||a.clipBox)};l.prototype.setDOMEvents=function(){var d=this.chart.container,f=d.ownerDocument;d.onmousedown=this.onContainerMouseDown.bind(this);d.onmousemove=this.onContainerMouseMove.bind(this);d.onclick=this.onContainerClick.bind(this);this.unbindContainerMouseLeave=J(d,\"mouseleave\",this.onContainerMouseLeave.bind(this));c.unbindDocumentMouseUp||(c.unbindDocumentMouseUp=J(f,\"mouseup\",this.onDocumentMouseUp.bind(this)));c.hasTouch&&(J(d,\"touchstart\",\nthis.onContainerTouchStart.bind(this)),J(d,\"touchmove\",this.onContainerTouchMove.bind(this)),c.unbindDocumentTouchEnd||(c.unbindDocumentTouchEnd=J(f,\"touchend\",this.onDocumentTouchEnd.bind(this))))};l.prototype.setHoverChartIndex=function(){var d=this.chart,f=c.charts[m(c.hoverChartIndex,-1)];if(f&&f!==d)f.pointer.onContainerMouseLeave({relatedTarget:!0});f&&f.mouseIsDown||(c.hoverChartIndex=d.index)};l.prototype.touch=function(d,f){var a=this.chart,c;this.setHoverChartIndex();if(1===d.touches.length)if(d=\nthis.normalize(d),(c=a.isInsidePlot(d.chartX-a.plotLeft,d.chartY-a.plotTop))&&!a.openMenu){f&&this.runPointActions(d);if(\"touchmove\"===d.type){f=this.pinchDown;var k=f[0]?4<=Math.sqrt(Math.pow(f[0].chartX-d.chartX,2)+Math.pow(f[0].chartY-d.chartY,2)):!1}m(k,!0)&&this.pinch(d)}else f&&this.reset();else 2===d.touches.length&&this.pinch(d)};l.prototype.zoomOption=function(d){var f=this.chart,a=f.options.chart,c=a.zoomType||\"\";f=f.inverted;/touch/.test(d.type)&&(c=m(a.pinchType,c));this.zoomX=d=/x/.test(c);\nthis.zoomY=c=/y/.test(c);this.zoomHor=d&&!f||c&&f;this.zoomVert=c&&!f||d&&f;this.hasZoom=d||c};return l}();return c.Pointer=g});O(q,\"parts/MSPointer.js\",[q[\"parts/Globals.js\"],q[\"parts/Pointer.js\"],q[\"parts/Utilities.js\"]],function(g,c,q){function y(){var c=[];c.item=function(c){return this[c]};v(n,function(n){c.push({pageX:n.pageX,pageY:n.pageY,target:n.target})});return c}function B(c,n,p,m){\"touch\"!==c.pointerType&&c.pointerType!==c.MSPOINTER_TYPE_TOUCH||!D[g.hoverChartIndex]||(m(c),m=D[g.hoverChartIndex].pointer,\nm[n]({type:p,target:c.currentTarget,preventDefault:t,touches:y()}))}var H=this&&this.__extends||function(){var c=function(n,p){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(c,d){c.__proto__=d}||function(c,d){for(var l in d)d.hasOwnProperty(l)&&(c[l]=d[l])};return c(n,p)};return function(n,p){function m(){this.constructor=n}c(n,p);n.prototype=null===p?Object.create(p):(m.prototype=p.prototype,new m)}}(),D=g.charts,J=g.doc,t=g.noop,G=q.addEvent,L=q.css,v=q.objectEach,K=q.removeEvent,\nn={},r=!!g.win.PointerEvent;return function(c){function g(){return null!==c&&c.apply(this,arguments)||this}H(g,c);g.prototype.batchMSEvents=function(c){c(this.chart.container,r?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);c(this.chart.container,r?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);c(J,r?\"pointerup\":\"MSPointerUp\",this.onDocumentPointerUp)};g.prototype.destroy=function(){this.batchMSEvents(K);c.prototype.destroy.call(this)};g.prototype.init=function(p,m){c.prototype.init.call(this,\np,m);this.hasZoom&&L(p.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})};g.prototype.onContainerPointerDown=function(c){B(c,\"onContainerTouchStart\",\"touchstart\",function(c){n[c.pointerId]={pageX:c.pageX,pageY:c.pageY,target:c.currentTarget}})};g.prototype.onContainerPointerMove=function(c){B(c,\"onContainerTouchMove\",\"touchmove\",function(c){n[c.pointerId]={pageX:c.pageX,pageY:c.pageY};n[c.pointerId].target||(n[c.pointerId].target=c.currentTarget)})};g.prototype.onDocumentPointerUp=function(c){B(c,\n\"onDocumentTouchEnd\",\"touchend\",function(c){delete n[c.pointerId]})};g.prototype.setDOMEvents=function(){c.prototype.setDOMEvents.call(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(G)};return g}(c)});O(q,\"parts/Legend.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.animObject,B=c.css,H=c.defined,D=c.discardElement,J=c.find,t=c.fireEvent,G=c.format,L=c.isNumber,v=c.merge,K=c.pick,n=c.relativeLength,r=c.setAnimation,C=c.stableSort,I=c.syncTimeout;\nc=c.wrap;var p=g.isFirefox,m=g.marginNames,d=g.win,l=function(){function d(d,a){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=this.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=this.itemHeight=this.initialItemY=0;this.options={};this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=void 0;this.widthOption=this.totalItemWidth=\nthis.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=d;this.init(d,a)}d.prototype.init=function(d,a){this.chart=d;this.setOptions(a);a.enabled&&(this.render(),q(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=q(this.chart,\"render\",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};d.prototype.setOptions=function(d){var a=K(d.padding,8);this.options=d;this.chart.styledMode||\n(this.itemStyle=d.itemStyle,this.itemHiddenStyle=v(this.itemStyle,d.itemHiddenStyle));this.itemMarginTop=d.itemMarginTop||0;this.itemMarginBottom=d.itemMarginBottom||0;this.padding=a;this.initialItemY=a-5;this.symbolWidth=K(d.symbolWidth,16);this.pages=[];this.proximate=\"proximate\"===d.layout&&!this.chart.inverted;this.baseline=void 0};d.prototype.update=function(d,a){var f=this.chart;this.setOptions(v(!0,this.options,d));this.destroy();f.isDirtyLegend=f.isDirtyBox=!0;K(a,!0)&&f.redraw();t(this,\"afterUpdate\")};\nd.prototype.colorizeItem=function(d,a){d.legendGroup[a?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\");if(!this.chart.styledMode){var f=this.options,c=d.legendItem,l=d.legendLine,k=d.legendSymbol,m=this.itemHiddenStyle.color;f=a?f.itemStyle.color:m;var p=a?d.color||m:m,n=d.options&&d.options.marker,g={fill:p};c&&c.css({fill:f,color:f});l&&l.attr({stroke:p});k&&(n&&k.isMarker&&(g=d.pointAttribs(),a||(g.stroke=g.fill=m)),k.attr(g))}t(this,\"afterColorizeItem\",{item:d,visible:a})};d.prototype.positionItems=\nfunction(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};d.prototype.positionItem=function(d){var a=this,f=this.options,c=f.symbolPadding,k=!f.rtl,l=d._legendItemPos;f=l[0];l=l[1];var m=d.checkbox,p=d.legendGroup;p&&p.element&&(c={translateX:k?f:this.legendWidth-f-2*c-4,translateY:l},k=function(){t(a,\"afterPositionItem\",{item:d})},H(p.translateY)?p.animate(c,{complete:k}):(p.attr(c),k()));m&&(m.x=f,m.y=l)};d.prototype.destroyItem=function(d){var a=\nd.checkbox;[\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"].forEach(function(a){d[a]&&(d[a]=d[a].destroy())});a&&D(d.checkbox)};d.prototype.destroy=function(){function d(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(a){[\"legendItem\",\"legendGroup\"].forEach(d,a)});\"clipRect up down pager nav box title group\".split(\" \").forEach(d,this);this.display=null};d.prototype.positionCheckboxes=function(){var d=this.group&&this.group.alignAttr,a=this.clipHeight||this.legendHeight,\nc=this.titleHeight;if(d){var l=d.translateY;this.allItems.forEach(function(f){var k=f.checkbox;if(k){var m=l+c+k.y+(this.scrollOffset||0)+3;B(k,{left:d.translateX+f.checkboxOffset+k.x-20+\"px\",top:m+\"px\",display:this.proximate||m>l-6&&m<l+a-6?\"\":\"none\"})}},this)}};d.prototype.renderTitle=function(){var d=this.options,a=this.padding,c=d.title,k=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,a-3,a-4,null,null,null,d.useHTML,null,\"legend-title\").attr({zIndex:1}),this.chart.styledMode||\nthis.title.css(c.style),this.title.add(this.group)),c.width||this.title.css({width:this.maxLegendWidth+\"px\"}),d=this.title.getBBox(),k=d.height,this.offsetWidth=d.width,this.contentGroup.attr({translateY:k}));this.titleHeight=k};d.prototype.setText=function(d){var a=this.options;d.legendItem.attr({text:a.labelFormat?G(a.labelFormat,d,this.chart):a.labelFormatter.call(d)})};d.prototype.renderItem=function(d){var a=this.chart,f=a.renderer,c=this.options,k=this.symbolWidth,l=c.symbolPadding,m=this.itemStyle,\np=this.itemHiddenStyle,n=\"horizontal\"===c.layout?K(c.itemDistance,20):0,g=!c.rtl,e=d.legendItem,b=!d.series,h=!b&&d.series.drawLegendSymbol?d.series:d,z=h.options;z=this.createCheckboxForItem&&z&&z.showCheckbox;n=k+l+n+(z?20:0);var x=c.useHTML,r=d.options.className;e||(d.legendGroup=f.g(\"legend-item\").addClass(\"highcharts-\"+h.type+\"-series highcharts-color-\"+d.colorIndex+(r?\" \"+r:\"\")+(b?\" highcharts-series-\"+d.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),d.legendItem=e=f.text(\"\",g?k+l:-l,this.baseline||\n0,x),a.styledMode||e.css(v(d.visible?m:p)),e.attr({align:g?\"left\":\"right\",zIndex:2}).add(d.legendGroup),this.baseline||(this.fontMetrics=f.fontMetrics(a.styledMode?12:m.fontSize,e),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,e.attr(\"y\",this.baseline)),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,h.drawLegendSymbol(this,d),this.setItemEvents&&this.setItemEvents(d,e,x));z&&!d.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(d);this.colorizeItem(d,d.visible);!a.styledMode&&\nm.width||e.css({width:(c.itemWidth||this.widthOption||a.spacingBox.width)-n+\"px\"});this.setText(d);a=e.getBBox();d.itemWidth=d.checkboxOffset=c.itemWidth||d.legendItemWidth||a.width+n;this.maxItemWidth=Math.max(this.maxItemWidth,d.itemWidth);this.totalItemWidth+=d.itemWidth;this.itemHeight=d.itemHeight=Math.round(d.legendItemHeight||a.height||this.symbolHeight)};d.prototype.layoutItem=function(d){var a=this.options,f=this.padding,c=\"horizontal\"===a.layout,k=d.itemHeight,l=this.itemMarginBottom,m=\nthis.itemMarginTop,p=c?K(a.itemDistance,20):0,n=this.maxLegendWidth;a=a.alignColumns&&this.totalItemWidth>n?this.maxItemWidth:d.itemWidth;c&&this.itemX-f+a>n&&(this.itemX=f,this.lastLineHeight&&(this.itemY+=m+this.lastLineHeight+l),this.lastLineHeight=0);this.lastItemY=m+this.itemY+l;this.lastLineHeight=Math.max(k,this.lastLineHeight);d._legendItemPos=[this.itemX,this.itemY];c?this.itemX+=a:(this.itemY+=m+k+l,this.lastLineHeight=k);this.offsetWidth=this.widthOption||Math.max((c?this.itemX-f-(d.checkbox?\n0:p):a)+f,this.offsetWidth)};d.prototype.getAllItems=function(){var d=[];this.chart.series.forEach(function(a){var f=a&&a.options;a&&K(f.showInLegend,H(f.linkedTo)?!1:void 0,!0)&&(d=d.concat(a.legendItems||(\"point\"===f.legendType?a.data:a)))});t(this,\"afterGetAllItems\",{allItems:d});return d};d.prototype.getAlignment=function(){var d=this.options;return this.proximate?d.align.charAt(0)+\"tv\":d.floating?\"\":d.align.charAt(0)+d.verticalAlign.charAt(0)+d.layout.charAt(0)};d.prototype.adjustMargins=function(d,\na){var c=this.chart,f=this.options,k=this.getAlignment();k&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(l,p){l.test(k)&&!H(d[p])&&(c[m[p]]=Math.max(c[m[p]],c.legend[(p+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][p]*f[p%2?\"x\":\"y\"]+K(f.margin,12)+a[p]+(c.titleOffset[p]||0)))})};d.prototype.proximatePositions=function(){var d=this.chart,a=[],c=\"left\"===this.options.align;this.allItems.forEach(function(f){var k=c;if(f.yAxis&&f.points){f.xAxis.options.reversed&&(k=\n!k);var l=J(k?f.points:f.points.slice(0).reverse(),function(a){return L(a.plotY)});k=this.itemMarginTop+f.legendItem.getBBox().height+this.itemMarginBottom;var m=f.yAxis.top-d.plotTop;f.visible?(l=l?l.plotY:f.yAxis.height,l+=m-.3*k):l=m+f.yAxis.height;a.push({target:l,size:k,item:f})}},this);g.distribute(a,d.plotHeight);a.forEach(function(a){a.item._legendItemPos[1]=d.plotTop-d.spacing[0]+a.pos})};d.prototype.render=function(){var d=this.chart,a=d.renderer,c=this.group,k=this.box,l=this.options,m=\nthis.padding;this.itemX=m;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=n(l.width,d.spacingBox.width-m);var p=d.spacingBox.width-2*m-l.x;-1<[\"rm\",\"lm\"].indexOf(this.getAlignment().substring(0,2))&&(p/=2);this.maxLegendWidth=this.widthOption||p;c||(this.group=c=a.g(\"legend\").attr({zIndex:7}).add(),this.contentGroup=a.g().attr({zIndex:1}).add(c),this.scrollGroup=a.g().add(this.contentGroup));this.renderTitle();var g=this.getAllItems();C(g,function(a,e){return(a.options&&\na.options.legendIndex||0)-(e.options&&e.options.legendIndex||0)});l.reversed&&g.reverse();this.allItems=g;this.display=p=!!g.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;g.forEach(this.renderItem,this);g.forEach(this.layoutItem,this);g=(this.widthOption||this.offsetWidth)+m;var r=this.lastItemY+this.lastLineHeight+this.titleHeight;r=this.handleOverflow(r);r+=m;k||(this.box=k=a.rect().addClass(\"highcharts-legend-box\").attr({r:l.borderRadius}).add(c),k.isNew=!0);\nd.styledMode||k.attr({stroke:l.borderColor,\"stroke-width\":l.borderWidth||0,fill:l.backgroundColor||\"none\"}).shadow(l.shadow);0<g&&0<r&&(k[k.isNew?\"attr\":\"animate\"](k.crisp.call({},{x:0,y:0,width:g,height:r},k.strokeWidth())),k.isNew=!1);k[p?\"show\":\"hide\"]();d.styledMode&&\"none\"===c.getStyle(\"display\")&&(g=r=0);this.legendWidth=g;this.legendHeight=r;p&&this.align();this.proximate||this.positionItems();t(this,\"afterRender\")};d.prototype.align=function(d){void 0===d&&(d=this.chart.spacingBox);var a=\nthis.chart,c=this.options,f=d.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<a.titleOffset[0]?f+=a.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<a.titleOffset[2]&&(f-=a.titleOffset[2]);f!==d.y&&(d=v(d,{y:f}));this.group.align(v(c,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?\"top\":c.verticalAlign}),!0,d)};d.prototype.handleOverflow=function(d){var a=this,c=this.chart,f=c.renderer,k=this.options,l=k.y,m=this.padding;l=c.spacingBox.height+(\"top\"===k.verticalAlign?\n-l:l)-m;var p=k.maxHeight,n,g=this.clipRect,e=k.navigation,b=K(e.animation,!0),h=e.arrowSize||12,z=this.nav,x=this.pages,r,t=this.allItems,v=function(b){\"number\"===typeof b?g.attr({height:b}):g&&(a.clipRect=g.destroy(),a.contentGroup.clip());a.contentGroup.div&&(a.contentGroup.div.style.clip=b?\"rect(\"+m+\"px,9999px,\"+(m+b)+\"px,0)\":\"auto\")},q=function(b){a[b]=f.circle(0,0,1.3*h).translate(h/2,h/2).add(z);c.styledMode||a[b].attr(\"fill\",\"rgba(0,0,0,0.0001)\");return a[b]};\"horizontal\"!==k.layout||\"middle\"===\nk.verticalAlign||k.floating||(l/=2);p&&(l=Math.min(l,p));x.length=0;d>l&&!1!==e.enabled?(this.clipHeight=n=Math.max(l-20-this.titleHeight-m,0),this.currentPage=K(this.currentPage,1),this.fullHeight=d,t.forEach(function(b,a){var e=b._legendItemPos[1],d=Math.round(b.legendItem.getBBox().height),h=x.length;if(!h||e-x[h-1]>n&&(r||e)!==x[h-1])x.push(r||e),h++;b.pageIx=h-1;r&&(t[a-1].pageIx=h-1);a===t.length-1&&e+d-x[h-1]>n&&e!==r&&(x.push(e),b.pageIx=h);e!==r&&(r=e)}),g||(g=a.clipRect=f.clipRect(0,m,9999,\n0),a.contentGroup.clip(g)),v(n),z||(this.nav=z=f.g().attr({zIndex:1}).add(this.group),this.up=f.symbol(\"triangle\",0,0,h,h).add(z),q(\"upTracker\").on(\"click\",function(){a.scroll(-1,b)}),this.pager=f.text(\"\",15,10).addClass(\"highcharts-legend-navigation\"),c.styledMode||this.pager.css(e.style),this.pager.add(z),this.down=f.symbol(\"triangle-down\",0,0,h,h).add(z),q(\"downTracker\").on(\"click\",function(){a.scroll(1,b)})),a.scroll(0),d=l):z&&(v(),this.nav=z.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=\n0);return d};d.prototype.scroll=function(d,a){var c=this,f=this.chart,k=this.pages,l=k.length,m=this.currentPage+d;d=this.clipHeight;var p=this.options.navigation,n=this.pager,g=this.padding;m>l&&(m=l);0<m&&(\"undefined\"!==typeof a&&r(a,f),this.nav.attr({translateX:g,translateY:d+this.padding+7+this.titleHeight,visibility:\"visible\"}),[this.up,this.upTracker].forEach(function(a){a.attr({\"class\":1===m?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})}),n.attr({text:m+\"/\"+l}),[this.down,\nthis.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,\"class\":m===l?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})},this),f.styledMode||(this.up.attr({fill:1===m?p.inactiveColor:p.activeColor}),this.upTracker.css({cursor:1===m?\"default\":\"pointer\"}),this.down.attr({fill:m===l?p.inactiveColor:p.activeColor}),this.downTracker.css({cursor:m===l?\"default\":\"pointer\"})),this.scrollOffset=-k[m-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),\nthis.currentPage=m,this.positionCheckboxes(),a=y(K(a,f.renderer.globalAnimation,!0)),I(function(){t(c,\"afterScroll\",{currentPage:m})},a.duration||0))};return d}();(/Trident\\/7\\.0/.test(d.navigator&&d.navigator.userAgent)||p)&&c(l.prototype,\"positionItem\",function(d,c){var a=this,f=function(){c._legendItemPos&&d.call(a,c)};f();a.bubbleLegend||setTimeout(f)});g.Legend=l;return g.Legend});O(q,\"parts/Chart.js\",[q[\"parts/Axis.js\"],q[\"parts/Globals.js\"],q[\"parts/Legend.js\"],q[\"parts/MSPointer.js\"],q[\"parts/Options.js\"],\nq[\"parts/Pointer.js\"],q[\"parts/Time.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H,D,J){var t=c.charts,G=c.doc,L=c.seriesTypes,v=c.win,K=B.defaultOptions,n=J.addEvent,r=J.animate,C=J.animObject,I=J.attr,p=J.createElement,m=J.css,d=J.defined,l=J.discardElement,k=J.erase,f=J.error,a=J.extend,A=J.find,u=J.fireEvent,E=J.getStyle,P=J.isArray,w=J.isFunction,M=J.isNumber,F=J.isObject,Q=J.isString,e=J.merge,b=J.numberFormat,h=J.objectEach,z=J.pick,x=J.pInt,N=J.relativeLength,aa=J.removeEvent,Z=J.setAnimation,\nV=J.splat,Y=J.syncTimeout,ba=J.uniqueKey,U=c.marginNames,X=function(){function B(b,a,e){this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.container=this.colorCounter=this.clipBox=this.chartWidth=\nthis.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.getArgs(b,a,e)}B.prototype.getArgs=function(b,a,e){Q(b)||b.nodeName?(this.renderTo=b,this.init(a,e)):this.init(b,a)};B.prototype.init=function(a,d){var f,l=a.series,k=a.plotOptions||{};u(this,\"init\",{args:arguments},function(){a.series=null;f=e(K,a);var m=f.chart||{};h(f.plotOptions,function(b,a){F(b)&&(b.tooltip=k[a]&&e(k[a].tooltip)||void 0)});f.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;f.series=\na.series=l;this.userOptions=a;var p=m.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=d;this.isResizing=0;this.options=f;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new D(a.time):c.time;this.numberFormatter=m.numberFormatter||b;this.styledMode=m.styledMode;this.hasCartesianSeries=m.showAxes;var g=this;g.index=t.length;t.push(g);c.chartCount++;p&&h(p,function(b,a){w(b)&&n(g,a,b)});g.xAxis=[];g.yAxis=[];g.pointCount=g.colorCounter=\ng.symbolCounter=0;u(g,\"afterInit\");g.firstRender()})};B.prototype.initSeries=function(b){var a=this.options.chart;a=b.type||a.type||a.defaultSeriesType;var e=L[a];e||f(17,!0,this,{missingModuleFor:a});a=new e;a.init(this,b);return a};B.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(b){b.points||b.data||!b.enabledDataSorting||b.setData(b.options.data,!1)})};B.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(b,a){return b.linkedSeries.length||\na.linkedSeries.length?a.linkedSeries.length-b.linkedSeries.length:0})};B.prototype.orderSeries=function(b){var a=this.series;for(b=b||0;b<a.length;b++)a[b]&&(a[b].index=b,a[b].name=a[b].getName())};B.prototype.isInsidePlot=function(b,a,e){var d=e?a:b;b=e?b:a;d={x:d,y:b,isInsidePlot:0<=d&&d<=this.plotWidth&&0<=b&&b<=this.plotHeight};u(this,\"afterIsInsidePlot\",d);return d.isInsidePlot};B.prototype.redraw=function(b){u(this,\"beforeRedraw\");var e=this,d=e.axes,h=e.series,c=e.pointer,f=e.legend,l=e.userOptions.legend,\nk=e.isDirtyLegend,m=e.hasCartesianSeries,p=e.isDirtyBox,g=e.renderer,n=g.isHidden(),x=[];e.setResponsive&&e.setResponsive(!1);Z(e.hasRendered?b:!1,e);n&&e.temporaryDisplay();e.layOutTitles();for(b=h.length;b--;){var z=h[b];if(z.options.stacking){var w=!0;if(z.isDirty){var r=!0;break}}}if(r)for(b=h.length;b--;)z=h[b],z.options.stacking&&(z.isDirty=!0);h.forEach(function(b){b.isDirty&&(\"point\"===b.options.legendType?(b.updateTotals&&b.updateTotals(),k=!0):l&&(l.labelFormatter||l.labelFormat)&&(k=!0));\nb.isDirtyData&&u(b,\"updatedData\")});k&&f&&f.options.enabled&&(f.render(),e.isDirtyLegend=!1);w&&e.getStacks();m&&d.forEach(function(b){e.isResizing&&M(b.min)||(b.updateNames(),b.setScale())});e.getMargins();m&&(d.forEach(function(b){b.isDirty&&(p=!0)}),d.forEach(function(b){var e=b.min+\",\"+b.max;b.extKey!==e&&(b.extKey=e,x.push(function(){u(b,\"afterSetExtremes\",a(b.eventArgs,b.getExtremes()));delete b.eventArgs}));(p||w)&&b.redraw()}));p&&e.drawChartBox();u(e,\"predraw\");h.forEach(function(b){(p||\nb.isDirty)&&b.visible&&b.redraw();b.isDirtyData=!1});c&&c.reset(!0);g.draw();u(e,\"redraw\");u(e,\"render\");n&&e.temporaryDisplay(!0);x.forEach(function(b){b.call()})};B.prototype.get=function(b){function a(a){return a.id===b||a.options&&a.options.id===b}var e=this.series,d;var h=A(this.axes,a)||A(this.series,a);for(d=0;!h&&d<e.length;d++)h=A(e[d].points||[],a);return h};B.prototype.getAxes=function(){var b=this,a=this.options,e=a.xAxis=V(a.xAxis||{});a=a.yAxis=V(a.yAxis||{});u(this,\"getAxes\");e.forEach(function(b,\na){b.index=a;b.isX=!0});a.forEach(function(b,a){b.index=a});e.concat(a).forEach(function(a){new g(b,a)});u(this,\"afterGetAxes\")};B.prototype.getSelectedPoints=function(){var b=[];this.series.forEach(function(a){b=b.concat(a.getPointsCollection().filter(function(b){return z(b.selectedStaging,b.selected)}))});return b};B.prototype.getSelectedSeries=function(){return this.series.filter(function(b){return b.selected})};B.prototype.setTitle=function(b,a,e){this.applyDescription(\"title\",b);this.applyDescription(\"subtitle\",\na);this.applyDescription(\"caption\",void 0);this.layOutTitles(e)};B.prototype.applyDescription=function(b,a){var d=this,h=\"title\"===b?{color:\"#333333\",fontSize:this.options.isStock?\"16px\":\"18px\"}:{color:\"#666666\"};h=this.options[b]=e(!this.styledMode&&{style:h},this.options[b],a);var c=this[b];c&&a&&(this[b]=c=c.destroy());h&&!c&&(c=this.renderer.text(h.text,0,0,h.useHTML).attr({align:h.align,\"class\":\"highcharts-\"+b,zIndex:h.zIndex||4}).add(),c.update=function(a){d[{title:\"setTitle\",subtitle:\"setSubtitle\",\ncaption:\"setCaption\"}[b]](a)},this.styledMode||c.css(h.style),this[b]=c)};B.prototype.layOutTitles=function(b){var e=[0,0,0],d=this.renderer,h=this.spacingBox;[\"title\",\"subtitle\",\"caption\"].forEach(function(b){var c=this[b],f=this.options[b],l=f.verticalAlign||\"top\";b=\"title\"===b?-3:\"top\"===l?e[0]+2:0;if(c){if(!this.styledMode)var k=f.style.fontSize;k=d.fontMetrics(k,c).b;c.css({width:(f.width||h.width+(f.widthAdjust||0))+\"px\"});var m=Math.round(c.getBBox(f.useHTML).height);c.align(a({y:\"bottom\"===\nl?k:b+k,height:m},f),!1,\"spacingBox\");f.floating||(\"top\"===l?e[0]=Math.ceil(e[0]+m):\"bottom\"===l&&(e[2]=Math.ceil(e[2]+m)))}},this);e[0]&&\"top\"===(this.options.title.verticalAlign||\"top\")&&(e[0]+=this.options.title.margin);e[2]&&\"bottom\"===this.options.caption.verticalAlign&&(e[2]+=this.options.caption.margin);var c=!this.titleOffset||this.titleOffset.join(\",\")!==e.join(\",\");this.titleOffset=e;u(this,\"afterLayOutTitles\");!this.isDirtyBox&&c&&(this.isDirtyBox=this.isDirtyLegend=c,this.hasRendered&&\nz(b,!0)&&this.isDirtyBox&&this.redraw())};B.prototype.getChartSize=function(){var b=this.options.chart,a=b.width;b=b.height;var e=this.renderTo;d(a)||(this.containerWidth=E(e,\"width\"));d(b)||(this.containerHeight=E(e,\"height\"));this.chartWidth=Math.max(0,a||this.containerWidth||600);this.chartHeight=Math.max(0,N(b,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};B.prototype.temporaryDisplay=function(b){var a=this.renderTo;if(b)for(;a&&a.style;)a.hcOrigStyle&&(m(a,a.hcOrigStyle),\ndelete a.hcOrigStyle),a.hcOrigDetached&&(G.body.removeChild(a),a.hcOrigDetached=!1),a=a.parentNode;else for(;a&&a.style;){G.body.contains(a)||a.parentNode||(a.hcOrigDetached=!0,G.body.appendChild(a));if(\"none\"===E(a,\"display\",!1)||a.hcOricDetached)a.hcOrigStyle={display:a.style.display,height:a.style.height,overflow:a.style.overflow},b={display:\"block\",overflow:\"hidden\"},a!==this.renderTo&&(b.height=0),m(a,b),a.offsetWidth||a.style.setProperty(\"display\",\"block\",\"important\");a=a.parentNode;if(a===\nG.body)break}};B.prototype.setClassName=function(b){this.container.className=\"highcharts-container \"+(b||\"\")};B.prototype.getContainer=function(){var b=this.options,e=b.chart;var d=this.renderTo;var h=ba(),l,k;d||(this.renderTo=d=e.renderTo);Q(d)&&(this.renderTo=d=G.getElementById(d));d||f(13,!0,this);var g=x(I(d,\"data-highcharts-chart\"));M(g)&&t[g]&&t[g].hasRendered&&t[g].destroy();I(d,\"data-highcharts-chart\",this.index);d.innerHTML=\"\";e.skipClone||d.offsetWidth||this.temporaryDisplay();this.getChartSize();\ng=this.chartWidth;var n=this.chartHeight;m(d,{overflow:\"hidden\"});this.styledMode||(l=a({position:\"relative\",overflow:\"hidden\",width:g+\"px\",height:n+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\",userSelect:\"none\"},e.style));this.container=d=p(\"div\",{id:h},l,d);this._cursor=d.style.cursor;this.renderer=new (c[e.renderer]||c.Renderer)(d,g,n,null,e.forExport,b.exporting&&b.exporting.allowHTML,this.styledMode);Z(void 0,this);this.setClassName(e.className);\nif(this.styledMode)for(k in b.defs)this.renderer.definition(b.defs[k]);else this.renderer.setStyle(e.style);this.renderer.chartIndex=this.index;u(this,\"afterGetContainer\")};B.prototype.getMargins=function(b){var a=this.spacing,e=this.margin,h=this.titleOffset;this.resetMargins();h[0]&&!d(e[0])&&(this.plotTop=Math.max(this.plotTop,h[0]+a[0]));h[2]&&!d(e[2])&&(this.marginBottom=Math.max(this.marginBottom,h[2]+a[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(e,a);u(this,\"getMargins\");\nb||this.getAxisMargins()};B.prototype.getAxisMargins=function(){var b=this,a=b.axisOffset=[0,0,0,0],e=b.colorAxis,h=b.margin,c=function(b){b.forEach(function(b){b.visible&&b.getOffset()})};b.hasCartesianSeries?c(b.axes):e&&e.length&&c(e);U.forEach(function(e,c){d(h[c])||(b[e]+=a[c])});b.setChartSize()};B.prototype.reflow=function(b){var a=this,e=a.options.chart,h=a.renderTo,c=d(e.width)&&d(e.height),f=e.width||E(h,\"width\");e=e.height||E(h,\"height\");h=b?b.target:v;if(!c&&!a.isPrinting&&f&&e&&(h===\nv||h===G)){if(f!==a.containerWidth||e!==a.containerHeight)J.clearTimeout(a.reflowTimeout),a.reflowTimeout=Y(function(){a.container&&a.setSize(void 0,void 0,!1)},b?100:0);a.containerWidth=f;a.containerHeight=e}};B.prototype.setReflow=function(b){var a=this;!1===b||this.unbindReflow?!1===b&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=n(v,\"resize\",function(b){a.options&&a.reflow(b)}),n(this,\"destroy\",this.unbindReflow))};B.prototype.setSize=function(b,a,e){var d=this,\nh=d.renderer;d.isResizing+=1;Z(e,d);e=h.globalAnimation;d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;\"undefined\"!==typeof b&&(d.options.chart.width=b);\"undefined\"!==typeof a&&(d.options.chart.height=a);d.getChartSize();d.styledMode||(e?r:m)(d.container,{width:d.chartWidth+\"px\",height:d.chartHeight+\"px\"},e);d.setChartSize(!0);h.setSize(d.chartWidth,d.chartHeight,e);d.axes.forEach(function(b){b.isDirty=!0;b.setScale()});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();\nd.redraw(e);d.oldChartHeight=null;u(d,\"resize\");Y(function(){d&&u(d,\"endResize\",null,function(){--d.isResizing})},C(e).duration||0)};B.prototype.setChartSize=function(b){var a=this.inverted,e=this.renderer,d=this.chartWidth,h=this.chartHeight,c=this.options.chart,f=this.spacing,l=this.clipOffset,k,m,p,g;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=p=Math.max(0,Math.round(d-k-this.marginRight));this.plotHeight=g=Math.max(0,Math.round(h-m-this.marginBottom));\nthis.plotSizeX=a?g:p;this.plotSizeY=a?p:g;this.plotBorderWidth=c.plotBorderWidth||0;this.spacingBox=e.spacingBox={x:f[3],y:f[0],width:d-f[3]-f[1],height:h-f[0]-f[2]};this.plotBox=e.plotBox={x:k,y:m,width:p,height:g};d=2*Math.floor(this.plotBorderWidth/2);a=Math.ceil(Math.max(d,l[3])/2);e=Math.ceil(Math.max(d,l[0])/2);this.clipBox={x:a,y:e,width:Math.floor(this.plotSizeX-Math.max(d,l[1])/2-a),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(d,l[2])/2-e))};b||this.axes.forEach(function(b){b.setAxisSize();\nb.setAxisTranslation()});u(this,\"afterSetChartSize\",{skipAxes:b})};B.prototype.resetMargins=function(){u(this,\"resetMargins\");var b=this,a=b.options.chart;[\"margin\",\"spacing\"].forEach(function(e){var d=a[e],h=F(d)?d:[d,d,d,d];[\"Top\",\"Right\",\"Bottom\",\"Left\"].forEach(function(d,c){b[e][c]=z(a[e+d],h[c])})});U.forEach(function(a,e){b[a]=z(b.margin[e],b.spacing[e])});b.axisOffset=[0,0,0,0];b.clipOffset=[0,0,0,0]};B.prototype.drawChartBox=function(){var b=this.options.chart,a=this.renderer,e=this.chartWidth,\nd=this.chartHeight,h=this.chartBackground,c=this.plotBackground,f=this.plotBorder,l=this.styledMode,k=this.plotBGImage,m=b.backgroundColor,p=b.plotBackgroundColor,g=b.plotBackgroundImage,n,x=this.plotLeft,z=this.plotTop,w=this.plotWidth,r=this.plotHeight,t=this.plotBox,A=this.clipRect,v=this.clipBox,q=\"animate\";h||(this.chartBackground=h=a.rect().addClass(\"highcharts-background\").add(),q=\"attr\");if(l)var C=n=h.strokeWidth();else{C=b.borderWidth||0;n=C+(b.shadow?8:0);m={fill:m||\"none\"};if(C||h[\"stroke-width\"])m.stroke=\nb.borderColor,m[\"stroke-width\"]=C;h.attr(m).shadow(b.shadow)}h[q]({x:n/2,y:n/2,width:e-n-C%2,height:d-n-C%2,r:b.borderRadius});q=\"animate\";c||(q=\"attr\",this.plotBackground=c=a.rect().addClass(\"highcharts-plot-background\").add());c[q](t);l||(c.attr({fill:p||\"none\"}).shadow(b.plotShadow),g&&(k?(g!==k.attr(\"href\")&&k.attr(\"href\",g),k.animate(t)):this.plotBGImage=a.image(g,x,z,w,r).add()));A?A.animate({width:v.width,height:v.height}):this.clipRect=a.clipRect(v);q=\"animate\";f||(q=\"attr\",this.plotBorder=\nf=a.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());l||f.attr({stroke:b.plotBorderColor,\"stroke-width\":b.plotBorderWidth||0,fill:\"none\"});f[q](f.crisp({x:x,y:z,width:w,height:r},-f.strokeWidth()));this.isDirtyBox=!1;u(this,\"afterDrawChartBox\")};B.prototype.propFromSeries=function(){var b=this,a=b.options.chart,e,d=b.options.series,h,c;[\"inverted\",\"angular\",\"polar\"].forEach(function(f){e=L[a.type||a.defaultSeriesType];c=a[f]||e&&e.prototype[f];for(h=d&&d.length;!c&&h--;)(e=L[d[h].type])&&\ne.prototype[f]&&(c=!0);b[f]=c})};B.prototype.linkSeries=function(){var b=this,a=b.series;a.forEach(function(b){b.linkedSeries.length=0});a.forEach(function(a){var e=a.options.linkedTo;Q(e)&&(e=\":previous\"===e?b.series[a.index-1]:b.get(e))&&e.linkedParent!==a&&(e.linkedSeries.push(a),a.linkedParent=e,e.enabledDataSorting&&a.setDataSortingOptions(),a.visible=z(a.options.visible,e.options.visible,a.visible))});u(this,\"afterLinkSeries\")};B.prototype.renderSeries=function(){this.series.forEach(function(b){b.translate();\nb.render()})};B.prototype.renderLabels=function(){var b=this,e=b.options.labels;e.items&&e.items.forEach(function(d){var h=a(e.style,d.style),c=x(h.left)+b.plotLeft,f=x(h.top)+b.plotTop+12;delete h.left;delete h.top;b.renderer.text(d.html,c,f).attr({zIndex:2}).css(h).add()})};B.prototype.render=function(){var b=this.axes,a=this.colorAxis,e=this.renderer,d=this.options,h=0,c=function(b){b.forEach(function(b){b.visible&&b.render()})};this.setTitle();this.legend=new q(this,d.legend);this.getStacks&&\nthis.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;b.some(function(b){if(b.horiz&&b.visible&&b.options.labels.enabled&&b.series.length)return h=21,!0});var f=this.plotHeight=Math.max(this.plotHeight-h,0);b.forEach(function(b){b.setScale()});this.getAxisMargins();var l=1.1<d/this.plotWidth;var k=1.05<f/this.plotHeight;if(l||k)b.forEach(function(b){(b.horiz&&l||!b.horiz&&k)&&b.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?c(b):a&&a.length&&\nc(a);this.seriesGroup||(this.seriesGroup=e.g(\"series-group\").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.updateContainerScaling();this.hasRendered=!0};B.prototype.addCredits=function(b){var a=this,d=e(!0,this.options.credits,b);d.enabled&&!this.credits&&(this.credits=this.renderer.text(d.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){d.href&&(v.location.href=d.href)}).attr({align:d.position.align,\nzIndex:8}),a.styledMode||this.credits.css(d.style),this.credits.add().align(d.position),this.credits.update=function(b){a.credits=a.credits.destroy();a.addCredits(b)})};B.prototype.updateContainerScaling=function(){var b=this.container;if(2<b.offsetWidth&&2<b.offsetHeight&&b.getBoundingClientRect){var a=b.getBoundingClientRect(),e=a.width/b.offsetWidth;b=a.height/b.offsetHeight;1!==e||1!==b?this.containerScaling={scaleX:e,scaleY:b}:delete this.containerScaling}};B.prototype.destroy=function(){var b=\nthis,a=b.axes,e=b.series,d=b.container,f,m=d&&d.parentNode;u(b,\"destroy\");b.renderer.forExport?k(t,b):t[b.index]=void 0;c.chartCount--;b.renderTo.removeAttribute(\"data-highcharts-chart\");aa(b);for(f=a.length;f--;)a[f]=a[f].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(f=e.length;f--;)e[f]=e[f].destroy();\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \").forEach(function(a){var e=\nb[a];e&&e.destroy&&(b[a]=e.destroy())});d&&(d.innerHTML=\"\",aa(d),m&&l(d));h(b,function(a,e){delete b[e]})};B.prototype.firstRender=function(){var b=this,a=b.options;if(!b.isReadyToRender||b.isReadyToRender()){b.getContainer();b.resetMargins();b.setChartSize();b.propFromSeries();b.getAxes();(P(a.series)?a.series:[]).forEach(function(a){b.initSeries(a)});b.linkSeries();b.setSeriesData();u(b,\"beforeRender\");H&&(b.pointer=c.hasTouch||!v.PointerEvent&&!v.MSPointerEvent?new H(b,a):new y(b,a));b.render();\nif(!b.renderer.imgCount&&!b.hasLoaded)b.onload();b.temporaryDisplay(!0)}};B.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(b){b&&\"undefined\"!==typeof this.index&&b.apply(this,[this])},this);u(this,\"load\");u(this,\"render\");d(this.index)&&this.setReflow(this.options.chart.reflow);this.hasLoaded=!0};return B}();X.prototype.callbacks=[];c.chart=function(b,a,e){return new X(b,a,e)};return c.Chart=X});O(q,\"parts/ScrollablePlotArea.js\",[q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],\nq[\"parts/Utilities.js\"]],function(g,c,q){var y=q.addEvent,B=q.createElement,H=q.pick,D=q.stop;\"\";y(g,\"afterSetChartSize\",function(g){var t=this.options.chart.scrollablePlotArea,q=t&&t.minWidth;t=t&&t.minHeight;if(!this.renderer.forExport){if(q){if(this.scrollablePixelsX=q=Math.max(0,q-this.chartWidth)){this.plotWidth+=q;this.inverted?(this.clipBox.height+=q,this.plotBox.height+=q):(this.clipBox.width+=q,this.plotBox.width+=q);var y={1:{name:\"right\",value:q}}}}else t&&(this.scrollablePixelsY=q=Math.max(0,\nt-this.chartHeight))&&(this.plotHeight+=q,this.inverted?(this.clipBox.width+=q,this.plotBox.width+=q):(this.clipBox.height+=q,this.plotBox.height+=q),y={2:{name:\"bottom\",value:q}});y&&!g.skipAxes&&this.axes.forEach(function(g){y[g.side]?g.getPlotLinePath=function(){var t=y[g.side].name,n=this[t];this[t]=n-y[g.side].value;var r=c.Axis.prototype.getPlotLinePath.apply(this,arguments);this[t]=n;return r}:(g.setAxisSize(),g.setAxisTranslation())})}});y(g,\"render\",function(){this.scrollablePixelsX||this.scrollablePixelsY?\n(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});g.prototype.setUpScrolling=function(){var c=this,g={WebkitOverflowScrolling:\"touch\",overflowX:\"hidden\",overflowY:\"hidden\"};this.scrollablePixelsX&&(g.overflowX=\"auto\");this.scrollablePixelsY&&(g.overflowY=\"auto\");this.scrollingContainer=B(\"div\",{className:\"highcharts-scrolling\"},g,this.renderTo);y(this.scrollingContainer,\"scroll\",function(){c.pointer&&delete c.pointer.chartPosition});this.innerContainer=\nB(\"div\",{className:\"highcharts-inner-container\"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};g.prototype.moveFixedElements=function(){var c=this.container,g=this.fixedRenderer,q=\".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-scrollbar .highcharts-subtitle .highcharts-title\".split(\" \"),\ny;this.scrollablePixelsX&&!this.inverted?y=\".highcharts-yaxis\":this.scrollablePixelsX&&this.inverted?y=\".highcharts-xaxis\":this.scrollablePixelsY&&!this.inverted?y=\".highcharts-xaxis\":this.scrollablePixelsY&&this.inverted&&(y=\".highcharts-yaxis\");q.push(y,y+\"-labels\");q.forEach(function(t){[].forEach.call(c.querySelectorAll(t),function(c){(c.namespaceURI===g.SVG_NS?g.box:g.box.parentNode).appendChild(c);c.style.pointerEvents=\"auto\"})})};g.prototype.applyFixed=function(){var g,t,q=!this.fixedDiv,L=\nthis.options.chart.scrollablePlotArea;q?(this.fixedDiv=B(\"div\",{className:\"highcharts-fixed\"},{position:\"absolute\",overflow:\"hidden\",pointerEvents:\"none\",zIndex:2},null,!0),this.renderTo.insertBefore(this.fixedDiv,this.renderTo.firstChild),this.renderTo.style.overflow=\"visible\",this.fixedRenderer=t=new c.Renderer(this.fixedDiv,this.chartWidth,this.chartHeight,null===(g=this.options.chart)||void 0===g?void 0:g.style),this.scrollableMask=t.path().attr({fill:this.options.chart.backgroundColor||\"#fff\",\n\"fill-opacity\":H(L.opacity,.85),zIndex:-1}).addClass(\"highcharts-scrollable-mask\").add(),this.moveFixedElements(),y(this,\"afterShowResetZoom\",this.moveFixedElements),y(this,\"afterLayOutTitles\",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);g=this.chartWidth+(this.scrollablePixelsX||0);t=this.chartHeight+(this.scrollablePixelsY||0);D(this.container);this.container.style.width=g+\"px\";this.container.style.height=t+\"px\";this.renderer.boxWrapper.attr({width:g,height:t,\nviewBox:[0,0,g,t].join(\" \")});this.chartBackground.attr({width:g,height:t});this.scrollingContainer.style.height=this.chartHeight+\"px\";q&&(L.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*L.scrollPositionX),L.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*L.scrollPositionY));t=this.axisOffset;q=this.plotTop-t[0]-1;L=this.plotLeft-t[3]-1;g=this.plotTop+this.plotHeight+t[2]+1;t=this.plotLeft+this.plotWidth+t[1]+1;var v=this.plotLeft+this.plotWidth-\n(this.scrollablePixelsX||0),K=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);q=this.scrollablePixelsX?[[\"M\",0,q],[\"L\",this.plotLeft-1,q],[\"L\",this.plotLeft-1,g],[\"L\",0,g],[\"Z\"],[\"M\",v,q],[\"L\",this.chartWidth,q],[\"L\",this.chartWidth,g],[\"L\",v,g],[\"Z\"]]:this.scrollablePixelsY?[[\"M\",L,0],[\"L\",L,this.plotTop-1],[\"L\",t,this.plotTop-1],[\"L\",t,0],[\"Z\"],[\"M\",L,K],[\"L\",L,this.chartHeight],[\"L\",t,this.chartHeight],[\"L\",t,K],[\"Z\"]]:[[\"M\",0,0]];\"adjustHeight\"!==this.redrawTrigger&&this.scrollableMask.attr({d:q})}});\nO(q,\"parts/StackingAxis.js\",[q[\"parts/Utilities.js\"]],function(g){var c=g.addEvent,q=g.destroyObjectProperties,y=g.fireEvent,B=g.objectEach,H=g.pick,D=function(){function c(c){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=c}c.prototype.buildStacks=function(){var c=this.axis,g=c.series,q=H(c.options.reversedStacks,!0),v=g.length,D;if(!c.isXAxis){this.usePercentage=!1;for(D=v;D--;){var n=g[q?D:v-D-1];n.setStackedPoints();n.setGroupedPoints()}for(D=0;D<v;D++)g[D].modifyStacks();y(c,\n\"afterBuildStacks\")}};c.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var c=this.stacks=this.oldStacks;B(c,function(c){B(c,function(c){c.cumulative=c.total})})}};c.prototype.resetStacks=function(){var c=this,g=c.stacks;c.axis.isXAxis||B(g,function(g){B(g,function(q,t){q.touched<c.stacksTouched?(q.destroy(),delete g[t]):(q.total=null,q.cumulative=null)})})};c.prototype.renderStackTotals=function(){var c=this.axis.chart,g=c.renderer,q=this.stacks,v=this.stackTotalGroup=this.stackTotalGroup||\ng.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add();v.translate(c.plotLeft,c.plotTop);B(q,function(c){B(c,function(c){c.render(v)})})};return c}();return function(){function g(){}g.compose=function(q){c(q,\"init\",g.onInit);c(q,\"destroy\",g.onDestroy)};g.onDestroy=function(){var c=this.stacking;if(c){var g=c.stacks;B(g,function(c,t){q(c);g[t]=null});c&&c.stackTotalGroup&&c.stackTotalGroup.destroy()}};g.onInit=function(){this.stacking||(this.stacking=new D(this))};return g}()});O(q,\"mixins/legend-symbol.js\",\n[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.merge,y=c.pick;g.LegendSymbolMixin={drawRectangle:function(c,g){var q=c.symbolHeight,B=c.options.squareSymbol;g.legendSymbol=this.chart.renderer.rect(B?(c.symbolWidth-q)/2:0,c.baseline-q+1,B?q:c.symbolWidth,q,y(c.options.symbolRadius,q/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(g.legendGroup)},drawLineMarker:function(c){var g=this.options,D=g.marker,B=c.symbolWidth,t=c.symbolHeight,G=t/2,L=this.chart.renderer,v=this.legendGroup;\nc=c.baseline-Math.round(.3*c.fontMetrics.b);var K={};this.chart.styledMode||(K={\"stroke-width\":g.lineWidth||0},g.dashStyle&&(K.dashstyle=g.dashStyle));this.legendLine=L.path([\"M\",0,c,\"L\",B,c]).addClass(\"highcharts-graph\").attr(K).add(v);D&&!1!==D.enabled&&B&&(g=Math.min(y(D.radius,G),G),0===this.symbol.indexOf(\"url\")&&(D=q(D,{width:t,height:t}),g=0),this.legendSymbol=D=L.symbol(this.symbol,B/2-g,c-g,2*g,2*g,D).addClass(\"highcharts-point\").add(v),D.isMarker=!0)}};return g.LegendSymbolMixin});O(q,\"parts/Point.js\",\n[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.animObject,y=c.defined,B=c.erase,H=c.extend,D=c.fireEvent,J=c.format,t=c.getNestedProperty,G=c.isArray,L=c.isNumber,v=c.isObject,K=c.syncTimeout,n=c.pick,r=c.removeEvent,C=c.uniqueKey;\"\";c=function(){function c(){this.colorIndex=this.category=void 0;this.formatPrefix=\"point\";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}c.prototype.animateBeforeDestroy=\nfunction(){var c=this,m={x:c.startXPos,opacity:0},d,l=c.getGraphicalProps();l.singular.forEach(function(l){d=\"dataLabel\"===l;c[l]=c[l].animate(d?{x:c[l].startXPos,y:c[l].startYPos,opacity:0}:m)});l.plural.forEach(function(d){c[d].forEach(function(d){d.element&&d.animate(H({x:c.startXPos},d.startYPos?{x:d.startXPos,y:d.startYPos}:{}))})})};c.prototype.applyOptions=function(p,m){var d=this.series,l=d.options.pointValKey||d.pointValKey;p=c.prototype.optionsToObject.call(this,p);H(this,p);this.options=\nthis.options?H(this.options,p):p;p.group&&delete this.group;p.dataLabels&&delete this.dataLabels;l&&(this.y=c.prototype.getNestedProperty.call(this,l));this.formatPrefix=(this.isNull=n(this.isValid&&!this.isValid(),null===this.x||!L(this.y)))?\"null\":\"point\";this.selected&&(this.state=\"select\");\"name\"in this&&\"undefined\"===typeof m&&d.xAxis&&d.xAxis.hasNames&&(this.x=d.xAxis.nameToX(this));\"undefined\"===typeof this.x&&d&&(this.x=\"undefined\"===typeof m?d.autoIncrement(this):m);return this};c.prototype.destroy=\nfunction(){function c(){if(m.graphic||m.dataLabel||m.dataLabels)r(m),m.destroyElements();for(a in m)m[a]=null}var m=this,d=m.series,l=d.chart;d=d.options.dataSorting;var k=l.hoverPoints,f=q(m.series.chart.renderer.globalAnimation),a;m.legendItem&&l.legend.destroyItem(m);k&&(m.setState(),B(k,m),k.length||(l.hoverPoints=null));if(m===l.hoverPoint)m.onMouseOut();d&&d.enabled?(this.animateBeforeDestroy(),K(c,f.duration)):c();l.pointCount--};c.prototype.destroyElements=function(c){var m=this;c=m.getGraphicalProps(c);\nc.singular.forEach(function(d){m[d]=m[d].destroy()});c.plural.forEach(function(d){m[d].forEach(function(d){d.element&&d.destroy()});delete m[d]})};c.prototype.firePointEvent=function(c,m,d){var l=this,k=this.series.options;(k.point.events[c]||l.options&&l.options.events&&l.options.events[c])&&l.importEvents();\"click\"===c&&k.allowPointSelect&&(d=function(d){l.select&&l.select(null,d.ctrlKey||d.metaKey||d.shiftKey)});D(l,c,m,d)};c.prototype.getClassName=function(){return\"highcharts-point\"+(this.selected?\n\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(\"undefined\"!==typeof this.colorIndex?\" highcharts-color-\"+this.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")};c.prototype.getGraphicalProps=function(c){var m=this,d=[],l,k={singular:[],plural:[]};c=c||{graphic:1,dataLabel:1};c.graphic&&d.push(\"graphic\",\"shadowGroup\");\nc.dataLabel&&d.push(\"dataLabel\",\"dataLabelUpper\",\"connector\");for(l=d.length;l--;){var f=d[l];m[f]&&k.singular.push(f)}[\"dataLabel\",\"connector\"].forEach(function(a){var d=a+\"s\";c[a]&&m[d]&&k.plural.push(d)});return k};c.prototype.getLabelConfig=function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};c.prototype.getNestedProperty=function(c){if(c)return 0===\nc.indexOf(\"custom.\")?t(c,this.options):this[c]};c.prototype.getZone=function(){var c=this.series,m=c.zones;c=c.zoneAxis||\"y\";var d=0,l;for(l=m[d];this[c]>=l.value;)l=m[++d];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=l&&l.color&&!this.options.color?l.color:this.nonZonedColor;return l};c.prototype.hasNewShapeType=function(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};c.prototype.init=function(c,m,d){this.series=c;this.applyOptions(m,\nd);this.id=y(this.id)?this.id:C();this.resolveColor();c.chart.pointCount++;D(this,\"afterInit\");return this};c.prototype.optionsToObject=function(g){var m={},d=this.series,l=d.options.keys,k=l||d.pointArrayMap||[\"y\"],f=k.length,a=0,p=0;if(L(g)||null===g)m[k[0]]=g;else if(G(g))for(!l&&g.length>f&&(d=typeof g[0],\"string\"===d?m.name=g[0]:\"number\"===d&&(m.x=g[0]),a++);p<f;)l&&\"undefined\"===typeof g[a]||(0<k[p].indexOf(\".\")?c.prototype.setNestedProperty(m,g[a],k[p]):m[k[p]]=g[a]),a++,p++;else\"object\"===\ntypeof g&&(m=g,g.dataLabels&&(d._hasPointLabels=!0),g.marker&&(d._hasPointMarkers=!0));return m};c.prototype.resolveColor=function(){var c=this.series;var m=c.chart.options.chart.colorCount;var d=c.chart.styledMode;delete this.nonZonedColor;d||this.options.color||(this.color=c.color);c.options.colorByPoint?(d||(m=c.options.colors||c.chart.options.colors,this.color=this.color||m[c.colorCounter],m=m.length),d=c.colorCounter,c.colorCounter++,c.colorCounter===m&&(c.colorCounter=0)):d=c.colorIndex;this.colorIndex=\nn(this.colorIndex,d)};c.prototype.setNestedProperty=function(c,m,d){d.split(\".\").reduce(function(d,c,f,a){d[c]=a.length-1===f?m:v(d[c],!0)?d[c]:{};return d[c]},c);return c};c.prototype.tooltipFormatter=function(c){var m=this.series,d=m.tooltipOptions,l=n(d.valueDecimals,\"\"),k=d.valuePrefix||\"\",f=d.valueSuffix||\"\";m.chart.styledMode&&(c=m.chart.tooltip.styledModeFormat(c));(m.pointArrayMap||[\"y\"]).forEach(function(a){a=\"{point.\"+a;if(k||f)c=c.replace(RegExp(a+\"}\",\"g\"),k+a+\"}\"+f);c=c.replace(RegExp(a+\n\"}\",\"g\"),a+\":,.\"+l+\"f}\")});return J(c,{point:this,series:this.series},m.chart)};return c}();return g.Point=c});O(q,\"parts/Series.js\",[q[\"parts/Globals.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/SVGElement.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H){var D=q.defaultOptions,J=H.addEvent,t=H.animObject,G=H.arrayMax,L=H.arrayMin,v=H.clamp,K=H.correctFloat,n=H.defined,r=H.erase,C=H.error,I=H.extend,p=H.find,m=H.fireEvent,d=H.getNestedProperty,l=H.isArray,\nk=H.isFunction,f=H.isNumber,a=H.isString,A=H.merge,u=H.objectEach,E=H.pick,P=H.removeEvent;q=H.seriesType;var w=H.splat,M=H.syncTimeout;\"\";var F=g.seriesTypes,Q=g.win;g.Series=q(\"line\",null,{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:\"#ffffff\",lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:\"#cccccc\",lineColor:\"#000000\",\nlineWidth:2}}},point:{events:{}},dataLabels:{align:\"center\",formatter:function(){var a=this.series.chart.numberFormatter;return\"number\"!==typeof this.y?\"\":a(this.y,-1)},padding:5,style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"contrast\",textOutline:\"1px contrast\"},verticalAlign:\"bottom\",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},\ninactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"},{axisTypes:[\"xAxis\",\"yAxis\"],coll:\"series\",colorCounter:0,cropShoulder:1,directTouch:!1,eventsToUnbind:[],isCartesian:!0,parallelArrays:[\"x\",\"y\"],pointClass:y,requireSorting:!0,sorted:!0,init:function(a,b){m(this,\"init\",{options:b});var e=this,d=a.series,c;this.eventOptions=this.eventOptions||{};e.chart=a;e.options=b=e.setOptions(b);e.linkedSeries=[];e.bindAxes();I(e,{name:b.name,state:\"\",visible:!1!==\nb.visible,selected:!0===b.selected});var f=b.events;u(f,function(b,a){k(b)&&e.eventOptions[a]!==b&&(k(e.eventOptions[a])&&P(e,a,e.eventOptions[a]),e.eventOptions[a]=b,J(e,a,b))});if(f&&f.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;e.getColor();e.getSymbol();e.parallelArrays.forEach(function(b){e[b+\"Data\"]||(e[b+\"Data\"]=[])});e.isCartesian&&(a.hasCartesianSeries=!0);d.length&&(c=d[d.length-1]);e._i=E(c&&c._i,-1)+1;e.opacity=e.options.opacity;a.orderSeries(this.insert(d));\nb.dataSorting&&b.dataSorting.enabled?e.setDataSortingOptions():e.points||e.data||e.setData(b.data,!1);m(this,\"afterInit\")},is:function(a){return F[a]&&this instanceof F[a]},insert:function(a){var b=this.options.index,e;if(f(b)){for(e=a.length;e--;)if(b>=E(a[e].options.index,a[e]._i)){a.splice(e+1,0,this);break}-1===e&&a.unshift(this);e+=1}else a.push(this);return E(e,a.length-1)},bindAxes:function(){var a=this,b=a.options,d=a.chart,c;m(this,\"bindAxes\",null,function(){(a.axisTypes||[]).forEach(function(e){d[e].forEach(function(d){c=\nd.options;if(b[e]===c.index||\"undefined\"!==typeof b[e]&&b[e]===c.id||\"undefined\"===typeof b[e]&&0===c.index)a.insert(d.series),a[e]=d,d.isDirty=!0});a[e]||a.optionalAxis===e||C(18,!0,d)})});m(this,\"afterBindAxes\")},updateParallelArrays:function(a,b){var e=a.series,d=arguments,c=f(b)?function(d){var c=\"y\"===d&&e.toYData?e.toYData(a):a[d];e[d+\"Data\"][b]=c}:function(a){Array.prototype[b].apply(e[a+\"Data\"],Array.prototype.slice.call(d,2))};e.parallelArrays.forEach(c)},hasData:function(){return this.visible&&\n\"undefined\"!==typeof this.dataMax&&\"undefined\"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length},autoIncrement:function(){var a=this.options,b=this.xIncrement,d,c=a.pointIntervalUnit,f=this.chart.time;b=E(b,a.pointStart,0);this.pointInterval=d=E(this.pointInterval,a.pointInterval,1);c&&(a=new f.Date(b),\"day\"===c?f.set(\"Date\",a,f.get(\"Date\",a)+d):\"month\"===c?f.set(\"Month\",a,f.get(\"Month\",a)+d):\"year\"===c&&f.set(\"FullYear\",a,f.get(\"FullYear\",a)+d),d=a.getTime()-b);this.xIncrement=\nb+d;return b},setDataSortingOptions:function(){var a=this.options;I(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});n(a.pointRange)||(a.pointRange=1)},setOptions:function(a){var b=this.chart,e=b.options,d=e.plotOptions,c=b.userOptions||{};a=A(a);b=b.styledMode;var f={plotOptions:d,userOptions:a};m(this,\"setOptions\",f);var l=f.plotOptions[this.type],k=c.plotOptions||{};this.userOptions=f.userOptions;c=A(l,d.series,c.plotOptions&&c.plotOptions[this.type],a);this.tooltipOptions=\nA(D.tooltip,D.plotOptions.series&&D.plotOptions.series.tooltip,D.plotOptions[this.type].tooltip,e.tooltip.userOptions,d.series&&d.series.tooltip,d[this.type].tooltip,a.tooltip);this.stickyTracking=E(a.stickyTracking,k[this.type]&&k[this.type].stickyTracking,k.series&&k.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:c.stickyTracking);null===l.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;e=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||\n(d={value:c[this.zoneAxis+\"Threshold\"]||c.threshold||0,className:\"highcharts-negative\"},b||(d.color=c.negativeColor,d.fillColor=c.negativeFillColor),e.push(d));e.length&&n(e[e.length-1].value)&&e.push(b?{}:{color:this.color,fillColor:this.fillColor});m(this,\"afterSetOptions\",{options:c});return c},getName:function(){return E(this.options.name,\"Series \"+(this.index+1))},getCyclic:function(a,b,d){var e=this.chart,c=this.userOptions,h=a+\"Index\",f=a+\"Counter\",l=d?d.length:E(e.options.chart[a+\"Count\"],\ne[a+\"Count\"]);if(!b){var k=E(c[h],c[\"_\"+h]);n(k)||(e.series.length||(e[f]=0),c[\"_\"+h]=k=e[f]%l,e[f]+=1);d&&(b=d[k])}\"undefined\"!==typeof k&&(this[h]=k);this[a]=b},getColor:function(){this.chart.styledMode?this.getCyclic(\"color\"):this.options.colorByPoint?this.options.color=null:this.getCyclic(\"color\",this.options.color||D.plotOptions[this.type].color,this.chart.options.colors)},getPointsCollection:function(){return(this.hasGroupedData?this.points:this.data)||[]},getSymbol:function(){this.getCyclic(\"symbol\",\nthis.options.marker.symbol,this.chart.options.symbols)},findPointIndex:function(a,b){var e=a.id,d=a.x,c=this.points,l,k=this.options.dataSorting;if(e)var m=this.chart.get(e);else if(this.linkedParent||this.enabledDataSorting){var g=k&&k.matchByName?\"name\":\"index\";m=p(c,function(b){return!b.touched&&b[g]===a[g]});if(!m)return}if(m){var n=m&&m.index;\"undefined\"!==typeof n&&(l=!0)}\"undefined\"===typeof n&&f(d)&&(n=this.xData.indexOf(d,b));-1!==n&&\"undefined\"!==typeof n&&this.cropped&&(n=n>=this.cropStart?\nn-this.cropStart:n);!l&&c[n]&&c[n].touched&&(n=void 0);return n},drawLegendSymbol:c.drawLineMarker,updateData:function(a,b){var e=this.options,d=e.dataSorting,c=this.points,l=[],k,m,g,p=this.requireSorting,u=a.length===c.length,w=!0;this.xIncrement=null;a.forEach(function(b,a){var h=n(b)&&this.pointClass.prototype.optionsToObject.call({series:this},b)||{};var m=h.x;if(h.id||f(m)){if(m=this.findPointIndex(h,g),-1===m||\"undefined\"===typeof m?l.push(b):c[m]&&b!==e.data[m]?(c[m].update(b,!1,null,!1),\nc[m].touched=!0,p&&(g=m+1)):c[m]&&(c[m].touched=!0),!u||a!==m||d&&d.enabled||this.hasDerivedData)k=!0}else l.push(b)},this);if(k)for(a=c.length;a--;)(m=c[a])&&!m.touched&&m.remove&&m.remove(!1,b);else!u||d&&d.enabled?w=!1:(a.forEach(function(b,a){c[a].update&&b!==c[a].y&&c[a].update(b,!1,null,!1)}),l.length=0);c.forEach(function(b){b&&(b.touched=!1)});if(!w)return!1;l.forEach(function(b){this.addPoint(b,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=\nG(this.xData),this.autoIncrement());return!0},setData:function(e,b,d,c){var h=this,k=h.points,m=k&&k.length||0,g,p=h.options,n=h.chart,u=p.dataSorting,w=null,z=h.xAxis;w=p.turboThreshold;var r=this.xData,q=this.yData,A=(g=h.pointArrayMap)&&g.length,t=p.keys,v=0,F=1,M;e=e||[];g=e.length;b=E(b,!0);u&&u.enabled&&(e=this.sortData(e));!1!==c&&g&&m&&!h.cropped&&!h.hasGroupedData&&h.visible&&!h.isSeriesBoosting&&(M=this.updateData(e,d));if(!M){h.xIncrement=null;h.colorCounter=0;this.parallelArrays.forEach(function(b){h[b+\n\"Data\"].length=0});if(w&&g>w)if(w=h.getFirstValidPoint(e),f(w))for(d=0;d<g;d++)r[d]=this.autoIncrement(),q[d]=e[d];else if(l(w))if(A)for(d=0;d<g;d++)c=e[d],r[d]=c[0],q[d]=c.slice(1,A+1);else for(t&&(v=t.indexOf(\"x\"),F=t.indexOf(\"y\"),v=0<=v?v:0,F=0<=F?F:1),d=0;d<g;d++)c=e[d],r[d]=c[v],q[d]=c[F];else C(12,!1,n);else for(d=0;d<g;d++)\"undefined\"!==typeof e[d]&&(c={series:h},h.pointClass.prototype.applyOptions.apply(c,[e[d]]),h.updateParallelArrays(c,d));q&&a(q[0])&&C(14,!0,n);h.data=[];h.options.data=\nh.userOptions.data=e;for(d=m;d--;)k[d]&&k[d].destroy&&k[d].destroy();z&&(z.minRange=z.userMinRange);h.isDirty=n.isDirtyBox=!0;h.isDirtyData=!!k;d=!1}\"point\"===p.legendType&&(this.processData(),this.generatePoints());b&&n.redraw(d)},sortData:function(a){var b=this,e=b.options.dataSorting.sortKey||\"y\",c=function(b,a){return n(a)&&b.pointClass.prototype.optionsToObject.call({series:b},a)||{}};a.forEach(function(e,d){a[d]=c(b,e);a[d].index=d},this);a.concat().sort(function(b,a){b=d(e,b);a=d(e,a);return a<\nb?-1:a>b?1:0}).forEach(function(b,a){b.x=a},this);b.linkedSeries&&b.linkedSeries.forEach(function(b){var e=b.options,d=e.data;e.dataSorting&&e.dataSorting.enabled||!d||(d.forEach(function(e,h){d[h]=c(b,e);a[h]&&(d[h].x=a[h].x,d[h].index=h)}),b.setData(d,!1))});return a},getProcessedData:function(a){var b=this.xData,e=this.yData,d=b.length;var c=0;var f=this.xAxis,l=this.options;var k=l.cropThreshold;var m=a||this.getExtremesFromAll||l.getExtremesFromAll,g=this.isCartesian;a=f&&f.val2lin;l=!(!f||!f.logarithmic);\nvar p=this.requireSorting;if(f){f=f.getExtremes();var n=f.min;var w=f.max}if(g&&this.sorted&&!m&&(!k||d>k||this.forceCrop))if(b[d-1]<n||b[0]>w)b=[],e=[];else if(this.yData&&(b[0]<n||b[d-1]>w)){c=this.cropData(this.xData,this.yData,n,w);b=c.xData;e=c.yData;c=c.start;var u=!0}for(k=b.length||1;--k;)if(d=l?a(b[k])-a(b[k-1]):b[k]-b[k-1],0<d&&(\"undefined\"===typeof r||d<r))var r=d;else 0>d&&p&&(C(15,!1,this.chart),p=!1);return{xData:b,yData:e,cropped:u,cropStart:c,closestPointRange:r}},processData:function(a){var b=\nthis.xAxis;if(this.isCartesian&&!this.isDirty&&!b.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange},cropData:function(a,b,d,c,f){var e=a.length,h=0,k=e,l;f=E(f,this.cropShoulder);for(l=0;l<e;l++)if(a[l]>=d){h=Math.max(0,l-f);break}for(d=l;d<e;d++)if(a[d]>c){k=d+f;break}return{xData:a.slice(h,k),yData:b.slice(h,k),\nstart:h,end:k}},generatePoints:function(){var a=this.options,b=a.data,d=this.data,c,f=this.processedXData,k=this.processedYData,l=this.pointClass,g=f.length,p=this.cropStart||0,n=this.hasGroupedData;a=a.keys;var u=[],r;d||n||(d=[],d.length=b.length,d=this.data=d);a&&n&&(this.options.keys=!1);for(r=0;r<g;r++){var q=p+r;if(n){var A=(new l).init(this,[f[r]].concat(w(k[r])));A.dataGroup=this.groupMap[r];A.dataGroup.options&&(A.options=A.dataGroup.options,I(A,A.dataGroup.options),delete A.dataLabels)}else(A=\nd[q])||\"undefined\"===typeof b[q]||(d[q]=A=(new l).init(this,b[q],f[r]));A&&(A.index=q,u[r]=A)}this.options.keys=a;if(d&&(g!==(c=d.length)||n))for(r=0;r<c;r++)r!==p||n||(r+=g),d[r]&&(d[r].destroyElements(),d[r].plotX=void 0);this.data=d;this.points=u;m(this,\"afterGeneratePoints\")},getXExtremes:function(a){return{min:L(a),max:G(a)}},getExtremes:function(a,b){var d=this.xAxis,e=this.yAxis,c=this.processedXData||this.xData,k=[],g=0,p=0;var n=0;var w=this.requireSorting?this.cropShoulder:0,u=e?e.positiveValuesOnly:\n!1,r;a=a||this.stackedYData||this.processedYData||[];e=a.length;d&&(n=d.getExtremes(),p=n.min,n=n.max);for(r=0;r<e;r++){var q=c[r];var A=a[r];var t=(f(A)||l(A))&&(A.length||0<A||!u);q=b||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!d||(c[r+w]||q)>=p&&(c[r-w]||q)<=n;if(t&&q)if(t=A.length)for(;t--;)f(A[t])&&(k[g++]=A[t]);else k[g++]=A}a={dataMin:L(k),dataMax:G(k)};m(this,\"afterGetExtremes\",{dataExtremes:a});return a},applyExtremes:function(){var a=this.getExtremes();this.dataMin=\na.dataMin;this.dataMax=a.dataMax;return a},getFirstValidPoint:function(a){for(var b=null,d=a.length,e=0;null===b&&e<d;)b=a[e],e++;return b},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,c=d.categories,k=this.enabledDataSorting,g=this.yAxis,p=this.points,w=p.length,u=!!this.modifyValue,r,q=this.pointPlacementToXValue(),A=!!q,t=a.threshold,C=a.startFromThreshold?t:0,F,M=this.zoneAxis||\"y\",y=Number.MAX_VALUE;for(r=0;r<\nw;r++){var I=p[r],D=I.x,B=I.y,G=I.low,P=b&&g.stacking&&g.stacking.stacks[(this.negStacks&&B<(C?0:t)?\"-\":\"\")+this.stackKey];g.positiveValuesOnly&&null!==B&&0>=B&&(I.isNull=!0);I.plotX=F=K(v(d.translate(D,0,0,0,1,q,\"flags\"===this.type),-1E5,1E5));if(b&&this.visible&&P&&P[D]){var H=this.getStackIndicator(H,D,this.index);if(!I.isNull){var Q=P[D];var J=Q.points[H.key]}}l(J)&&(G=J[0],B=J[1],G===C&&H.key===P[D].base&&(G=E(f(t)&&t,g.min)),g.positiveValuesOnly&&0>=G&&(G=null),I.total=I.stackTotal=Q.total,\nI.percentage=Q.total&&I.y/Q.total*100,I.stackY=B,this.irregularWidths||Q.setOffset(this.pointXOffset||0,this.barW||0));I.yBottom=n(G)?v(g.translate(G,0,1,0,1),-1E5,1E5):null;u&&(B=this.modifyValue(B,I));I.plotY=\"number\"===typeof B&&Infinity!==B?v(g.translate(B,0,1,0,1),-1E5,1E5):void 0;I.isInside=this.isPointInside(I);I.clientX=A?K(d.translate(D,0,0,0,1,q)):F;I.negative=I[M]<(a[M+\"Threshold\"]||t||0);I.category=c&&\"undefined\"!==typeof c[I.x]?c[I.x]:I.x;if(!I.isNull&&!1!==I.visible){\"undefined\"!==typeof L&&\n(y=Math.min(y,Math.abs(F-L)));var L=F}I.zone=this.zones.length&&I.getZone();!I.graphic&&this.group&&k&&(I.isNew=!0)}this.closestPointRangePx=y;m(this,\"afterTranslate\")},getValidPoints:function(a,b,d){var e=this.chart;return(a||this.points||[]).filter(function(a){return b&&!e.isInsidePlot(a.plotX,a.plotY,e.inverted)?!1:!1!==a.visible&&(d||!a.isNull)})},getClipBox:function(a,b){var d=this.options,e=this.chart,c=e.inverted,f=this.xAxis,k=f&&this.yAxis,l=e.options.chart.scrollablePlotArea||{};a&&!1===\nd.clip&&k?a=c?{y:-e.chartWidth+k.len+k.pos,height:e.chartWidth,width:e.chartHeight,x:-e.chartHeight+f.len+f.pos}:{y:-k.pos,height:e.chartHeight,width:e.chartWidth,x:-f.pos}:(a=this.clipBox||e.clipBox,b&&(a.width=e.plotSizeX,a.x=(e.scrollablePixelsX||0)*(l.scrollPositionX||0)));return b?{width:a.width,x:a.x}:a},setClip:function(a){var b=this.chart,d=this.options,e=b.renderer,c=b.inverted,f=this.clipBox,k=this.getClipBox(a),l=this.sharedClipKey||[\"_sharedClip\",a&&a.duration,a&&a.easing,k.height,d.xAxis,\nd.yAxis].join(),m=b[l],g=b[l+\"m\"];a&&(k.width=0,c&&(k.x=b.plotHeight+(!1!==d.clip?0:b.plotTop)));m?b.hasLoaded||m.attr(k):(a&&(b[l+\"m\"]=g=e.clipRect(c?b.plotSizeX+99:-99,c?-b.plotLeft:-b.plotTop,99,c?b.chartWidth:b.chartHeight)),b[l]=m=e.clipRect(k),m.count={length:0});a&&!m.count[this.index]&&(m.count[this.index]=!0,m.count.length+=1);if(!1!==d.clip||a)this.group.clip(a||f?m:b.clipRect),this.markerGroup.clip(g),this.sharedClipKey=l;a||(m.count[this.index]&&(delete m.count[this.index],--m.count.length),\n0===m.count.length&&l&&b[l]&&(f||(b[l]=b[l].destroy()),b[l+\"m\"]&&(b[l+\"m\"]=b[l+\"m\"].destroy())))},animate:function(a){var b=this.chart,d=t(this.options.animation);if(!b.hasRendered)if(a)this.setClip(d);else{var e=this.sharedClipKey;a=b[e];var c=this.getClipBox(d,!0);a&&a.animate(c,d);b[e+\"m\"]&&b[e+\"m\"].animate({width:c.width+99,x:c.x-(b.inverted?0:99)},d)}},afterAnimate:function(){this.setClip();m(this,\"afterAnimate\");this.finishedAnimating=!0},drawPoints:function(){var a=this.points,b=this.chart,\nd,c,f=this.options.marker,k=this[this.specialGroup]||this.markerGroup,l=this.xAxis,m=E(f.enabled,!l||l.isRadial?!0:null,this.closestPointRangePx>=f.enabledThreshold*f.radius);if(!1!==f.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++){var g=a[d];var p=(c=g.graphic)?\"animate\":\"attr\";var n=g.marker||{};var w=!!g.marker;if((m&&\"undefined\"===typeof n.enabled||n.enabled)&&!g.isNull&&!1!==g.visible){var u=E(n.symbol,this.symbol);var r=this.markerAttribs(g,g.selected&&\"select\");this.enabledDataSorting&&\n(g.startXPos=l.reversed?-r.width:l.width);var q=!1!==g.isInside;c?c[q?\"show\":\"hide\"](q).animate(r):q&&(0<r.width||g.hasImage)&&(g.graphic=c=b.renderer.symbol(u,r.x,r.y,r.width,r.height,w?n:f).add(k),this.enabledDataSorting&&b.hasRendered&&(c.attr({x:g.startXPos}),p=\"animate\"));c&&\"animate\"===p&&c[q?\"show\":\"hide\"](q).animate(r);if(c&&!b.styledMode)c[p](this.pointAttribs(g,g.selected&&\"select\"));c&&c.addClass(g.getClassName(),!0)}else c&&(g.graphic=c.destroy())}},markerAttribs:function(a,b){var d=this.options,\ne=d.marker,c=a.marker||{},f=c.symbol||e.symbol,k=E(c.radius,e.radius);b&&(e=e.states[b],b=c.states&&c.states[b],k=E(b&&b.radius,e&&e.radius,k+(e&&e.radiusPlus||0)));a.hasImage=f&&0===f.indexOf(\"url\");a.hasImage&&(k=0);a={x:d.crisp?Math.floor(a.plotX)-k:a.plotX-k,y:a.plotY-k};k&&(a.width=a.height=2*k);return a},pointAttribs:function(a,b){var d=this.options.marker,e=a&&a.options,c=e&&e.marker||{},f=this.color,k=e&&e.color,l=a&&a.color;e=E(c.lineWidth,d.lineWidth);var m=a&&a.zone&&a.zone.color;a=1;f=\nk||m||l||f;k=c.fillColor||d.fillColor||f;f=c.lineColor||d.lineColor||f;b=b||\"normal\";d=d.states[b];b=c.states&&c.states[b]||{};e=E(b.lineWidth,d.lineWidth,e+E(b.lineWidthPlus,d.lineWidthPlus,0));k=b.fillColor||d.fillColor||k;f=b.lineColor||d.lineColor||f;a=E(b.opacity,d.opacity,a);return{stroke:f,\"stroke-width\":e,fill:k,opacity:a}},destroy:function(a){var b=this,d=b.chart,e=/AppleWebKit\\/533/.test(Q.navigator.userAgent),c,f,k=b.data||[],l,g;m(b,\"destroy\");this.removeEvents(a);(b.axisTypes||[]).forEach(function(a){(g=\nb[a])&&g.series&&(r(g.series,b),g.isDirty=g.forceRedraw=!0)});b.legendItem&&b.chart.legend.destroyItem(b);for(f=k.length;f--;)(l=k[f])&&l.destroy&&l.destroy();b.points=null;H.clearTimeout(b.animationTimeout);u(b,function(b,a){b instanceof B&&!b.survive&&(c=e&&\"group\"===a?\"hide\":\"destroy\",b[c]())});d.hoverSeries===b&&(d.hoverSeries=null);r(d.series,b);d.orderSeries();u(b,function(d,e){a&&\"hcEvents\"===e||delete b[e]})},getGraphPath:function(a,b,d){var e=this,c=e.options,f=c.step,h,k=[],l=[],m;a=a||\ne.points;(h=a.reversed)&&a.reverse();(f={right:1,center:2}[f]||f&&3)&&h&&(f=4-f);a=this.getValidPoints(a,!1,!(c.connectNulls&&!b&&!d));a.forEach(function(h,g){var p=h.plotX,r=h.plotY,w=a[g-1];(h.leftCliff||w&&w.rightCliff)&&!d&&(m=!0);h.isNull&&!n(b)&&0<g?m=!c.connectNulls:h.isNull&&!b?m=!0:(0===g||m?g=[[\"M\",h.plotX,h.plotY]]:e.getPointSpline?g=[e.getPointSpline(a,h,g)]:f?(g=1===f?[[\"L\",w.plotX,r]]:2===f?[[\"L\",(w.plotX+p)/2,w.plotY],[\"L\",(w.plotX+p)/2,r]]:[[\"L\",p,w.plotY]],g.push([\"L\",p,r])):g=[[\"L\",\np,r]],l.push(h.x),f&&(l.push(h.x),2===f&&l.push(h.x)),k.push.apply(k,g),m=!1)});k.xMap=l;return e.graphPath=k},drawGraph:function(){var a=this,b=this.options,d=(this.gappedPath||this.getGraphPath).call(this),c=this.chart.styledMode,f=[[\"graph\",\"highcharts-graph\"]];c||f[0].push(b.lineColor||this.color||\"#cccccc\",b.dashStyle);f=a.getZonesGraphs(f);f.forEach(function(e,f){var h=e[0],k=a[h],l=k?\"animate\":\"attr\";k?(k.endX=a.preventGraphAnimation?null:d.xMap,k.animate({d:d})):d.length&&(a[h]=k=a.chart.renderer.path(d).addClass(e[1]).attr({zIndex:1}).add(a.group));\nk&&!c&&(h={stroke:e[2],\"stroke-width\":b.lineWidth,fill:a.fillGraph&&a.color||\"none\"},e[3]?h.dashstyle=e[3]:\"square\"!==b.linecap&&(h[\"stroke-linecap\"]=h[\"stroke-linejoin\"]=\"round\"),k[l](h).shadow(2>f&&b.shadow));k&&(k.startX=d.xMap,k.isArea=d.isArea)})},getZonesGraphs:function(a){this.zones.forEach(function(b,d){d=[\"zone-graph-\"+d,\"highcharts-graph highcharts-zone-graph-\"+d+\" \"+(b.className||\"\")];this.chart.styledMode||d.push(b.color||this.color,b.dashStyle||this.options.dashStyle);a.push(d)},this);\nreturn a},applyZones:function(){var a=this,b=this.chart,d=b.renderer,c=this.zones,f,k,l=this.clips||[],m,g=this.graph,p=this.area,n=Math.max(b.chartWidth,b.chartHeight),r=this[(this.zoneAxis||\"y\")+\"Axis\"],w=b.inverted,u,q,A,t=!1,C,F;if(c.length&&(g||p)&&r&&\"undefined\"!==typeof r.min){var M=r.reversed;var I=r.horiz;g&&!this.showLine&&g.hide();p&&p.hide();var y=r.getExtremes();c.forEach(function(e,c){f=M?I?b.plotWidth:0:I?0:r.toPixels(y.min)||0;f=v(E(k,f),0,n);k=v(Math.round(r.toPixels(E(e.value,y.max),\n!0)||0),0,n);t&&(f=k=r.toPixels(y.max));u=Math.abs(f-k);q=Math.min(f,k);A=Math.max(f,k);r.isXAxis?(m={x:w?A:q,y:0,width:u,height:n},I||(m.x=b.plotHeight-m.x)):(m={x:0,y:w?A:q,width:n,height:u},I&&(m.y=b.plotWidth-m.y));w&&d.isVML&&(m=r.isXAxis?{x:0,y:M?q:A,height:m.width,width:b.chartWidth}:{x:m.y-b.plotLeft-b.spacingBox.x,y:0,width:m.height,height:b.chartHeight});l[c]?l[c].animate(m):l[c]=d.clipRect(m);C=a[\"zone-area-\"+c];F=a[\"zone-graph-\"+c];g&&F&&F.clip(l[c]);p&&C&&C.clip(l[c]);t=e.value>y.max;\na.resetZones&&0===k&&(k=void 0)});this.clips=l}else a.visible&&(g&&g.show(!0),p&&p.show(!0))},invertGroups:function(a){function b(){[\"group\",\"markerGroup\"].forEach(function(b){d[b]&&(e.renderer.isVML&&d[b].attr({width:d.yAxis.len,height:d.xAxis.len}),d[b].width=d.yAxis.len,d[b].height=d.xAxis.len,d[b].invert(d.isRadialSeries?!1:a))})}var d=this,e=d.chart;d.xAxis&&(d.eventsToUnbind.push(J(e,\"resize\",b)),b(),d.invertGroups=b)},plotGroup:function(a,b,d,c,f){var e=this[a],h=!e;d={visibility:d,zIndex:c||\n.1};\"undefined\"===typeof this.opacity||this.chart.styledMode||(d.opacity=this.opacity);h&&(this[a]=e=this.chart.renderer.g().add(f));e.addClass(\"highcharts-\"+b+\" highcharts-series-\"+this.index+\" highcharts-\"+this.type+\"-series \"+(n(this.colorIndex)?\"highcharts-color-\"+this.colorIndex+\" \":\"\")+(this.options.className||\"\")+(e.hasClass(\"highcharts-tracker\")?\" highcharts-tracker\":\"\"),!0);e.attr(d)[h?\"attr\":\"animate\"](this.getPlotBox());return e},getPlotBox:function(){var a=this.chart,b=this.xAxis,d=this.yAxis;\na.inverted&&(b=d,d=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}},removeEvents:function(a){a?this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(b){b()}),this.eventsToUnbind.length=0):P(this)},render:function(){var a=this,b=a.chart,d=a.options,c=!a.finishedAnimating&&b.renderer.isSVG&&t(d.animation).duration,f=a.visible?\"inherit\":\"hidden\",k=d.zIndex,l=a.hasRendered,g=b.seriesGroup,p=b.inverted;m(this,\"render\");var n=a.plotGroup(\"group\",\n\"series\",f,k,g);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",f,k,g);c&&a.animate&&a.animate(!0);n.inverted=a.isCartesian||a.invertable?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);!1===d.clip||a.sharedClipKey||l||n.clip(b.clipRect);c&&a.animate&&a.animate();l||(a.animationTimeout=M(function(){a.afterAnimate()},\nc||0));a.isDirty=!1;a.hasRendered=!0;m(a,\"afterRender\")},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,d=this.group,c=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:E(c&&c.left,a.plotLeft),translateY:E(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdAxisArray:[\"clientX\",\"plotY\"],searchPoint:function(a,b){var d=this.xAxis,e=this.yAxis,c=this.chart.inverted;return this.searchKDTree({clientX:c?\nd.len-a.chartY+d.pos:a.chartX-d.pos,plotY:c?e.len-a.chartX+e.pos:a.chartY-e.pos},b,a)},buildKDTree:function(a){function b(a,e,c){var f;if(f=a&&a.length){var h=d.kdAxisArray[e%c];a.sort(function(a,b){return a[h]-b[h]});f=Math.floor(f/2);return{point:a[f],left:b(a.slice(0,f),e+1,c),right:b(a.slice(f+1),e+1,c)}}}this.buildingKdTree=!0;var d=this,e=-1<d.options.findNearestPointBy.indexOf(\"y\")?2:1;delete d.kdTree;M(function(){d.kdTree=b(d.getValidPoints(null,!d.directTouch),e,e);d.buildingKdTree=!1},d.options.kdNow||\na&&\"touchstart\"===a.type?0:1)},searchKDTree:function(a,b,d){function e(a,b,d,l){var m=b.point,g=c.kdAxisArray[d%l],p=m;var r=n(a[f])&&n(m[f])?Math.pow(a[f]-m[f],2):null;var w=n(a[h])&&n(m[h])?Math.pow(a[h]-m[h],2):null;w=(r||0)+(w||0);m.dist=n(w)?Math.sqrt(w):Number.MAX_VALUE;m.distX=n(r)?Math.sqrt(r):Number.MAX_VALUE;g=a[g]-m[g];w=0>g?\"left\":\"right\";r=0>g?\"right\":\"left\";b[w]&&(w=e(a,b[w],d+1,l),p=w[k]<p[k]?w:m);b[r]&&Math.sqrt(g*g)<p[k]&&(a=e(a,b[r],d+1,l),p=a[k]<p[k]?a:p);return p}var c=this,f=\nthis.kdAxisArray[0],h=this.kdAxisArray[1],k=b?\"distX\":\"dist\";b=-1<c.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(d);if(this.kdTree)return e(a,this.kdTree,b,b)},pointPlacementToXValue:function(){var a=this.options,b=a.pointRange,d=this.xAxis;a=a.pointPlacement;\"between\"===a&&(a=d.reversed?-.5:.5);return f(a)?a*E(b,d.pointRange):0},isPointInside:function(a){return\"undefined\"!==typeof a.plotY&&\"undefined\"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=this.yAxis.len&&\n0<=a.plotX&&a.plotX<=this.xAxis.len}});\"\"});O(q,\"parts/Stacking.js\",[q[\"parts/Axis.js\"],q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/StackingAxis.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B){var H=B.correctFloat,D=B.defined,J=B.destroyObjectProperties,t=B.format,G=B.isNumber,L=B.pick;\"\";var v=q.Series,K=function(){function c(c,g,n,p,m){var d=c.chart.inverted;this.axis=c;this.isNegative=n;this.options=g=g||{};this.x=p;this.total=null;this.points={};this.hasValidPoints=!1;this.stack=m;this.rightCliff=\nthis.leftCliff=0;this.alignOptions={align:g.align||(d?n?\"left\":\"right\":\"center\"),verticalAlign:g.verticalAlign||(d?\"middle\":n?\"bottom\":\"top\"),y:g.y,x:g.x};this.textAlign=g.textAlign||(d?n?\"right\":\"left\":\"center\")}c.prototype.destroy=function(){J(this,this.axis)};c.prototype.render=function(c){var g=this.axis.chart,n=this.options,p=n.format;p=p?t(p,this,g):n.formatter.call(this);this.label?this.label.attr({text:p,visibility:\"hidden\"}):(this.label=g.renderer.label(p,null,null,n.shape,null,null,n.useHTML,\n!1,\"stack-labels\"),p={r:n.borderRadius||0,text:p,rotation:n.rotation,padding:L(n.padding,5),visibility:\"hidden\"},g.styledMode||(p.fill=n.backgroundColor,p.stroke=n.borderColor,p[\"stroke-width\"]=n.borderWidth,this.label.css(n.style)),this.label.attr(p),this.label.added||this.label.add(c));this.label.labelrank=g.plotHeight};c.prototype.setOffset=function(c,g,n,p,m){var d=this.axis,l=d.chart;p=d.translate(d.stacking.usePercentage?100:p?p:this.total,0,0,0,1);n=d.translate(n?n:0);n=D(p)&&Math.abs(p-n);\nc=L(m,l.xAxis[0].translate(this.x))+c;d=D(p)&&this.getStackBox(l,this,c,p,g,n,d);g=this.label;n=this.isNegative;c=\"justify\"===L(this.options.overflow,\"justify\");var k=this.textAlign;g&&d&&(m=g.getBBox(),p=g.padding,k=\"left\"===k?l.inverted?-p:p:\"right\"===k?m.width:l.inverted&&\"center\"===k?m.width/2:l.inverted?n?m.width+p:-p:m.width/2,n=l.inverted?m.height/2:n?-p:m.height,this.alignOptions.x=L(this.options.x,0),this.alignOptions.y=L(this.options.y,0),d.x-=k,d.y-=n,g.align(this.alignOptions,null,d),\nl.isInsidePlot(g.alignAttr.x+k-this.alignOptions.x,g.alignAttr.y+n-this.alignOptions.y)?g.show():(g.alignAttr.y=-9999,c=!1),c&&v.prototype.justifyDataLabel.call(this.axis,g,this.alignOptions,g.alignAttr,m,d),g.attr({x:g.alignAttr.x,y:g.alignAttr.y}),L(!c&&this.options.crop,!0)&&((l=G(g.x)&&G(g.y)&&l.isInsidePlot(g.x-p+g.width,g.y)&&l.isInsidePlot(g.x+p,g.y))||g.hide()))};c.prototype.getStackBox=function(c,g,n,p,m,d,l){var k=g.axis.reversed,f=c.inverted,a=l.height+l.pos-(f?c.plotLeft:c.plotTop);g=\ng.isNegative&&!k||!g.isNegative&&k;return{x:f?g?p-l.right:p-d+l.pos-c.plotLeft:n+c.xAxis[0].transB-c.plotLeft,y:f?l.height-n-m:g?a-p-d:a-p,width:f?d:m,height:f?m:d}};return c}();c.prototype.getStacks=function(){var c=this,g=c.inverted;c.yAxis.forEach(function(c){c.stacking&&c.stacking.stacks&&c.hasVisibleSeries&&(c.stacking.oldStacks=c.stacking.stacks)});c.series.forEach(function(n){var r=n.xAxis&&n.xAxis.options||{};!n.options.stacking||!0!==n.visible&&!1!==c.options.chart.ignoreHiddenSeries||(n.stackKey=\n[n.type,L(n.options.stack,\"\"),g?r.top:r.left,g?r.height:r.width].join())})};y.compose(g);v.prototype.setGroupedPoints=function(){this.options.centerInCategory&&(this.is(\"column\")||this.is(\"columnrange\"))&&!this.options.stacking&&1<this.chart.series.length&&v.prototype.setStackedPoints.call(this,\"group\")};v.prototype.setStackedPoints=function(c){var g=c||this.options.stacking;if(g&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var n=this.processedXData,q=this.processedYData,\np=[],m=q.length,d=this.options,l=d.threshold,k=L(d.startFromThreshold&&l,0);d=d.stack;c=c?this.type+\",\"+g:this.stackKey;var f=\"-\"+c,a=this.negStacks,A=this.yAxis,u=A.stacking.stacks,t=A.stacking.oldStacks,v,w;A.stacking.stacksTouched+=1;for(w=0;w<m;w++){var M=n[w];var F=q[w];var y=this.getStackIndicator(y,M,this.index);var e=y.key;var b=(v=a&&F<(k?0:l))?f:c;u[b]||(u[b]={});u[b][M]||(t[b]&&t[b][M]?(u[b][M]=t[b][M],u[b][M].total=null):u[b][M]=new K(A,A.options.stackLabels,v,M,d));b=u[b][M];null!==F?\n(b.points[e]=b.points[this.index]=[L(b.cumulative,k)],D(b.cumulative)||(b.base=e),b.touched=A.stacking.stacksTouched,0<y.index&&!1===this.singleStacks&&(b.points[e][0]=b.points[this.index+\",\"+M+\",0\"][0])):b.points[e]=b.points[this.index]=null;\"percent\"===g?(v=v?c:f,a&&u[v]&&u[v][M]?(v=u[v][M],b.total=v.total=Math.max(v.total,b.total)+Math.abs(F)||0):b.total=H(b.total+(Math.abs(F)||0))):\"group\"===g?null!==F&&(b.total=(b.total||0)+1):b.total=H(b.total+(F||0));b.cumulative=\"group\"===g?(b.total||1)-1:\nL(b.cumulative,k)+(F||0);null!==F&&(b.points[e].push(b.cumulative),p[w]=b.cumulative,b.hasValidPoints=!0)}\"percent\"===g&&(A.stacking.usePercentage=!0);\"group\"!==g&&(this.stackedYData=p);A.stacking.oldStacks={}}};v.prototype.modifyStacks=function(){var c=this,g=c.stackKey,q=c.yAxis.stacking.stacks,t=c.processedXData,p,m=c.options.stacking;c[m+\"Stacker\"]&&[g,\"-\"+g].forEach(function(d){for(var l=t.length,k,f;l--;)if(k=t[l],p=c.getStackIndicator(p,k,c.index,d),f=(k=q[d]&&q[d][k])&&k.points[p.key])c[m+\n\"Stacker\"](f,k,l)})};v.prototype.percentStacker=function(c,g,q){g=g.total?100/g.total:0;c[0]=H(c[0]*g);c[1]=H(c[1]*g);this.stackedYData[q]=c[1]};v.prototype.getStackIndicator=function(c,g,q,t){!D(c)||c.x!==g||t&&c.key!==t?c={x:g,index:0,key:t}:c.index++;c.key=[q,g,c.index].join();return c};q.StackItem=K;return q.StackItem});O(q,\"parts/Dynamics.js\",[q[\"parts/Axis.js\"],q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/Time.js\"],q[\"parts/Utilities.js\"]],function(g,\nc,q,y,B,H,D){var J=y.time,t=D.addEvent,G=D.animate,L=D.createElement,v=D.css,K=D.defined,n=D.erase,r=D.error,C=D.extend,I=D.fireEvent,p=D.isArray,m=D.isNumber,d=D.isObject,l=D.isString,k=D.merge,f=D.objectEach,a=D.pick,A=D.relativeLength,u=D.setAnimation,E=D.splat;y=q.Series;var P=q.seriesTypes;q.cleanRecursively=function(a,c){var k={};f(a,function(f,e){if(d(a[e],!0)&&!a.nodeType&&c[e])f=q.cleanRecursively(a[e],c[e]),Object.keys(f).length&&(k[e]=f);else if(d(a[e])||a[e]!==c[e])k[e]=a[e]});return k};\nC(c.prototype,{addSeries:function(d,c,f){var k,e=this;d&&(c=a(c,!0),I(e,\"addSeries\",{options:d},function(){k=e.initSeries(d);e.isDirtyLegend=!0;e.linkSeries();k.enabledDataSorting&&k.setData(d.data,!1);I(e,\"afterAddSeries\",{series:k});c&&e.redraw(f)}));return k},addAxis:function(a,d,c,f){return this.createAxis(d?\"xAxis\":\"yAxis\",{axis:a,redraw:c,animation:f})},addColorAxis:function(a,d,c){return this.createAxis(\"colorAxis\",{axis:a,redraw:d,animation:c})},createAxis:function(d,c){var f=this.options,\nl=\"colorAxis\"===d,e=c.redraw,b=c.animation;c=k(c.axis,{index:this[d].length,isX:\"xAxis\"===d});var h=l?new q.ColorAxis(this,c):new g(this,c);f[d]=E(f[d]||{});f[d].push(c);l&&(this.isDirtyLegend=!0,this.axes.forEach(function(a){a.series=[]}),this.series.forEach(function(a){a.bindAxes();a.isDirtyData=!0}));a(e,!0)&&this.redraw(b);return h},showLoading:function(d){var c=this,f=c.options,k=c.loadingDiv,e=f.loading,b=function(){k&&v(k,{left:c.plotLeft+\"px\",top:c.plotTop+\"px\",width:c.plotWidth+\"px\",height:c.plotHeight+\n\"px\"})};k||(c.loadingDiv=k=L(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,c.container),c.loadingSpan=L(\"span\",{className:\"highcharts-loading-inner\"},null,k),t(c,\"redraw\",b));k.className=\"highcharts-loading\";c.loadingSpan.innerHTML=a(d,f.lang.loading,\"\");c.styledMode||(v(k,C(e.style,{zIndex:10})),v(c.loadingSpan,e.labelStyle),c.loadingShown||(v(k,{opacity:0,display:\"\"}),G(k,{opacity:e.style.opacity||.5},{duration:e.showDuration||0})));c.loadingShown=!0;b()},hideLoading:function(){var a=\nthis.options,d=this.loadingDiv;d&&(d.className=\"highcharts-loading highcharts-loading-hidden\",this.styledMode||G(d,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){v(d,{display:\"none\"})}}));this.loadingShown=!1},propsRequireDirtyBox:\"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),propsRequireReflow:\"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft\".split(\" \"),\npropsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip\".split(\" \"),collectionsWithUpdate:[\"xAxis\",\"yAxis\",\"zAxis\",\"series\"],update:function(d,c,g,p){var e=this,b={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\",caption:\"setCaption\"},h,n,u,r=d.isResponsiveOptions,w=[];I(e,\"update\",{options:d});r||e.setResponsive(!1,!0);d=q.cleanRecursively(d,e.options);k(!0,e.userOptions,d);if(h=d.chart){k(!0,e.options.chart,h);\"className\"in\nh&&e.setClassName(h.className);\"reflow\"in h&&e.setReflow(h.reflow);if(\"inverted\"in h||\"polar\"in h||\"type\"in h){e.propFromSeries();var t=!0}\"alignTicks\"in h&&(t=!0);f(h,function(a,b){-1!==e.propsRequireUpdateSeries.indexOf(\"chart.\"+b)&&(n=!0);-1!==e.propsRequireDirtyBox.indexOf(b)&&(e.isDirtyBox=!0);-1!==e.propsRequireReflow.indexOf(b)&&(r?e.isDirtyBox=!0:u=!0)});!e.styledMode&&\"style\"in h&&e.renderer.setStyle(h.style)}!e.styledMode&&d.colors&&(this.options.colors=d.colors);d.plotOptions&&k(!0,this.options.plotOptions,\nd.plotOptions);d.time&&this.time===J&&(this.time=new H(d.time));f(d,function(a,d){if(e[d]&&\"function\"===typeof e[d].update)e[d].update(a,!1);else if(\"function\"===typeof e[b[d]])e[b[d]](a);\"chart\"!==d&&-1!==e.propsRequireUpdateSeries.indexOf(d)&&(n=!0)});this.collectionsWithUpdate.forEach(function(b){if(d[b]){if(\"series\"===b){var c=[];e[b].forEach(function(b,d){b.options.isInternal||c.push(a(b.options.index,d))})}E(d[b]).forEach(function(a,d){var f=K(a.id),h;f&&(h=e.get(a.id));h||(h=e[b][c?c[d]:d])&&\nf&&K(h.options.id)&&(h=void 0);h&&h.coll===b&&(h.update(a,!1),g&&(h.touched=!0));!h&&g&&e.collectionsWithInit[b]&&(e.collectionsWithInit[b][0].apply(e,[a].concat(e.collectionsWithInit[b][1]||[]).concat([!1])).touched=!0)});g&&e[b].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:w.push(a)})}});w.forEach(function(a){a.remove&&a.remove(!1)});t&&e.axes.forEach(function(a){a.update({},!1)});n&&e.getSeriesOrderByLinks().forEach(function(a){a.chart&&a.update({},!1)},this);d.loading&&\nk(!0,e.options.loading,d.loading);t=h&&h.width;h=h&&h.height;l(h)&&(h=A(h,t||e.chartWidth));u||m(t)&&t!==e.chartWidth||m(h)&&h!==e.chartHeight?e.setSize(t,h,p):a(c,!0)&&e.redraw(p);I(e,\"afterUpdate\",{options:d,redraw:c,animation:p})},setSubtitle:function(a,d){this.applyDescription(\"subtitle\",a);this.layOutTitles(d)},setCaption:function(a,d){this.applyDescription(\"caption\",a);this.layOutTitles(d)}});c.prototype.collectionsWithInit={xAxis:[c.prototype.addAxis,[!0]],yAxis:[c.prototype.addAxis,[!1]],\nseries:[c.prototype.addSeries]};C(B.prototype,{update:function(c,f,k,l){function e(){b.applyOptions(c);var e=g&&b.hasDummyGraphic;e=null===b.y?!e:e;g&&e&&(b.graphic=g.destroy(),delete b.hasDummyGraphic);d(c,!0)&&(g&&g.element&&c&&c.marker&&\"undefined\"!==typeof c.marker.symbol&&(b.graphic=g.destroy()),c&&c.dataLabels&&b.dataLabel&&(b.dataLabel=b.dataLabel.destroy()),b.connector&&(b.connector=b.connector.destroy()));m=b.index;h.updateParallelArrays(b,m);n.data[m]=d(n.data[m],!0)||d(c,!0)?b.options:\na(c,n.data[m]);h.isDirty=h.isDirtyData=!0;!h.fixedBox&&h.hasCartesianSeries&&(p.isDirtyBox=!0);\"point\"===n.legendType&&(p.isDirtyLegend=!0);f&&p.redraw(k)}var b=this,h=b.series,g=b.graphic,m,p=h.chart,n=h.options;f=a(f,!0);!1===l?e():b.firePointEvent(\"update\",{options:c},e)},remove:function(a,d){this.series.removePoint(this.series.data.indexOf(this),a,d)}});C(y.prototype,{addPoint:function(d,c,f,k,e){var b=this.options,h=this.data,l=this.chart,g=this.xAxis;g=g&&g.hasNames&&g.names;var m=b.data,p=\nthis.xData,n;c=a(c,!0);var u={series:this};this.pointClass.prototype.applyOptions.apply(u,[d]);var r=u.x;var w=p.length;if(this.requireSorting&&r<p[w-1])for(n=!0;w&&p[w-1]>r;)w--;this.updateParallelArrays(u,\"splice\",w,0,0);this.updateParallelArrays(u,w);g&&u.name&&(g[r]=u.name);m.splice(w,0,d);n&&(this.data.splice(w,0,null),this.processData());\"point\"===b.legendType&&this.generatePoints();f&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(u,\"shift\"),m.shift()));!1!==e&&I(this,\n\"addPoint\",{point:u});this.isDirtyData=this.isDirty=!0;c&&l.redraw(k)},removePoint:function(d,c,f){var k=this,e=k.data,b=e[d],h=k.points,l=k.chart,g=function(){h&&h.length===e.length&&h.splice(d,1);e.splice(d,1);k.options.data.splice(d,1);k.updateParallelArrays(b||{series:k},\"splice\",d,1);b&&b.destroy();k.isDirty=!0;k.isDirtyData=!0;c&&l.redraw()};u(f,l);c=a(c,!0);b?b.firePointEvent(\"remove\",null,g):g()},remove:function(d,c,f,k){function e(){b.destroy(k);b.remove=null;h.isDirtyLegend=h.isDirtyBox=\n!0;h.linkSeries();a(d,!0)&&h.redraw(c)}var b=this,h=b.chart;!1!==f?I(b,\"remove\",null,e):e()},update:function(d,c){d=q.cleanRecursively(d,this.userOptions);I(this,\"update\",{options:d});var f=this,l=f.chart,e=f.userOptions,b=f.initialType||f.type,h=d.type||e.type||l.options.chart.type,g=!(this.hasDerivedData||d.dataGrouping||h&&h!==this.type||\"undefined\"!==typeof d.pointStart||d.pointInterval||d.pointIntervalUnit||d.keys),m=P[b].prototype,p,n=[\"eventOptions\",\"navigatorSeries\",\"baseSeries\"],u=f.finishedAnimating&&\n{animation:!1},w={};g&&(n.push(\"data\",\"isDirtyData\",\"points\",\"processedXData\",\"processedYData\",\"xIncrement\",\"cropped\",\"_hasPointMarkers\",\"_hasPointLabels\",\"mapMap\",\"mapData\",\"minY\",\"maxY\",\"minX\",\"maxX\"),!1!==d.visible&&n.push(\"area\",\"graph\"),f.parallelArrays.forEach(function(a){n.push(a+\"Data\")}),d.data&&(d.dataSorting&&C(f.options.dataSorting,d.dataSorting),this.setData(d.data,!1)));d=k(e,u,{index:\"undefined\"===typeof e.index?f.index:e.index,pointStart:a(e.pointStart,f.xData[0])},!g&&{data:f.options.data},\nd);g&&d.data&&(d.data=f.options.data);n=[\"group\",\"markerGroup\",\"dataLabelsGroup\",\"transformGroup\"].concat(n);n.forEach(function(a){n[a]=f[a];delete f[a]});f.remove(!1,null,!1,!0);for(p in m)f[p]=void 0;P[h||b]?C(f,P[h||b].prototype):r(17,!0,l,{missingModuleFor:h||b});n.forEach(function(a){f[a]=n[a]});f.init(l,d);if(g&&this.points){var A=f.options;!1===A.visible?(w.graphic=1,w.dataLabel=1):f._hasPointLabels||(d=A.marker,e=A.dataLabels,d&&(!1===d.enabled||\"symbol\"in d)&&(w.graphic=1),e&&!1===e.enabled&&\n(w.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(w).length&&a.destroyElements(w),!1===A.showInLegend&&a.legendItem&&l.legend.destroyItem(a))},this)}f.initialType=b;l.linkSeries();I(this,\"afterUpdate\");a(c,!0)&&l.redraw(g?void 0:!1)},setName:function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0}});C(g.prototype,{update:function(d,c){var l=this.chart,g=d&&d.events||{};d=k(this.userOptions,d);l.options[this.coll].indexOf&&\n(l.options[this.coll][l.options[this.coll].indexOf(this.userOptions)]=d);f(l.options[this.coll].events,function(a,b){\"undefined\"===typeof g[b]&&(g[b]=void 0)});this.destroy(!0);this.init(l,C(d,{events:g}));l.isDirtyBox=!0;a(c,!0)&&l.redraw()},remove:function(d){for(var c=this.chart,f=this.coll,k=this.series,e=k.length;e--;)k[e]&&k[e].remove(!1);n(c.axes,this);n(c[f],this);p(c.options[f])?c.options[f].splice(this.options.index,1):delete c.options[f];c[f].forEach(function(a,d){a.options.index=a.userOptions.index=\nd});this.destroy();c.isDirtyBox=!0;a(d,!0)&&c.redraw()},setTitle:function(a,d){this.update({title:a},d)},setCategories:function(a,d){this.update({categories:a},d)}})});O(q,\"parts/AreaSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Color.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=c.parse,H=y.objectEach,D=y.pick;c=y.seriesType;var J=g.Series;c(\"area\",\"line\",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(c){var g=[],q=[],t=this.xAxis,y=this.yAxis,\nn=y.stacking.stacks[this.stackKey],r={},C=this.index,I=y.series,p=I.length,m=D(y.options.reversedStacks,!0)?1:-1,d;c=c||this.points;if(this.options.stacking){for(d=0;d<c.length;d++)c[d].leftNull=c[d].rightNull=void 0,r[c[d].x]=c[d];H(n,function(d,c){null!==d.total&&q.push(c)});q.sort(function(d,c){return d-c});var l=I.map(function(d){return d.visible});q.forEach(function(c,f){var a=0,k,u;if(r[c]&&!r[c].isNull)g.push(r[c]),[-1,1].forEach(function(a){var g=1===a?\"rightNull\":\"leftNull\",w=0,A=n[q[f+a]];\nif(A)for(d=C;0<=d&&d<p;)k=A.points[d],k||(d===C?r[c][g]=!0:l[d]&&(u=n[c].points[d])&&(w-=u[1]-u[0])),d+=m;r[c][1===a?\"rightCliff\":\"leftCliff\"]=w});else{for(d=C;0<=d&&d<p;){if(k=n[c].points[d]){a=k[1];break}d+=m}a=y.translate(a,0,1,0,1);g.push({isNull:!0,plotX:t.translate(c,0,0,0,1),x:c,plotY:a,yBottom:a})}})}return g},getGraphPath:function(c){var g=J.prototype.getGraphPath,q=this.options,t=q.stacking,y=this.yAxis,n,r=[],C=[],I=this.index,p=y.stacking.stacks[this.stackKey],m=q.threshold,d=Math.round(y.getThreshold(q.threshold));\nq=D(q.connectNulls,\"percent\"===t);var l=function(a,k,l){var g=c[a];a=t&&p[g.x].points[I];var n=g[l+\"Null\"]||0;l=g[l+\"Cliff\"]||0;g=!0;if(l||n){var u=(n?a[0]:a[1])+l;var q=a[0]+l;g=!!n}else!t&&c[k]&&c[k].isNull&&(u=q=m);\"undefined\"!==typeof u&&(C.push({plotX:f,plotY:null===u?d:y.getThreshold(u),isNull:g,isCliff:!0}),r.push({plotX:f,plotY:null===q?d:y.getThreshold(q),doCurve:!1}))};c=c||this.points;t&&(c=this.getStackPoints(c));for(n=0;n<c.length;n++){t||(c[n].leftCliff=c[n].rightCliff=c[n].leftNull=\nc[n].rightNull=void 0);var k=c[n].isNull;var f=D(c[n].rectPlotX,c[n].plotX);var a=D(c[n].yBottom,d);if(!k||q)q||l(n,n-1,\"left\"),k&&!t&&q||(C.push(c[n]),r.push({x:n,plotX:f,plotY:a})),q||l(n,n+1,\"right\")}n=g.call(this,C,!0,!0);r.reversed=!0;k=g.call(this,r,!0,!0);(a=k[0])&&\"M\"===a[0]&&(k[0]=[\"L\",a[1],a[2]]);k=n.concat(k);g=g.call(this,C,!1,q);k.xMap=n.xMap;this.areaPath=k;return g},drawGraph:function(){this.areaPath=[];J.prototype.drawGraph.apply(this);var c=this,g=this.areaPath,q=this.options,v=[[\"area\",\n\"highcharts-area\",this.color,q.fillColor]];this.zones.forEach(function(g,n){v.push([\"zone-area-\"+n,\"highcharts-area highcharts-zone-area-\"+n+\" \"+g.className,g.color||c.color,g.fillColor||q.fillColor])});v.forEach(function(t){var n=t[0],r=c[n],v=r?\"animate\":\"attr\",y={};r?(r.endX=c.preventGraphAnimation?null:g.xMap,r.animate({d:g})):(y.zIndex=0,r=c[n]=c.chart.renderer.path(g).addClass(t[1]).add(c.group),r.isArea=!0);c.chart.styledMode||(y.fill=D(t[3],B(t[2]).setOpacity(D(q.fillOpacity,.75)).get()));\nr[v](y);r.startX=g.xMap;r.shiftUnit=q.step?2:1})},drawLegendSymbol:q.drawRectangle});\"\"});O(q,\"parts/SplineSeries.js\",[q[\"parts/Utilities.js\"]],function(g){var c=g.pick;g=g.seriesType;g(\"spline\",\"line\",{},{getPointSpline:function(g,q,B){var y=q.plotX||0,D=q.plotY||0,J=g[B-1];B=g[B+1];if(J&&!J.isNull&&!1!==J.doCurve&&!q.isCliff&&B&&!B.isNull&&!1!==B.doCurve&&!q.isCliff){g=J.plotY||0;var t=B.plotX||0;B=B.plotY||0;var G=0;var L=(1.5*y+(J.plotX||0))/2.5;var v=(1.5*D+g)/2.5;t=(1.5*y+t)/2.5;var K=(1.5*\nD+B)/2.5;t!==L&&(G=(K-v)*(t-y)/(t-L)+D-K);v+=G;K+=G;v>g&&v>D?(v=Math.max(g,D),K=2*D-v):v<g&&v<D&&(v=Math.min(g,D),K=2*D-v);K>B&&K>D?(K=Math.max(B,D),v=2*D-K):K<B&&K<D&&(K=Math.min(B,D),v=2*D-K);q.rightContX=t;q.rightContY=K}q=[\"C\",c(J.rightContX,J.plotX,0),c(J.rightContY,J.plotY,0),c(L,y,0),c(v,D,0),y,D];J.rightContX=J.rightContY=void 0;return q}});\"\"});O(q,\"parts/AreaSplineSeries.js\",[q[\"parts/Globals.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Options.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,\ny){y=y.seriesType;g=g.seriesTypes.area.prototype;y(\"areaspline\",\"spline\",q.defaultOptions.plotOptions.area,{getStackPoints:g.getStackPoints,getGraphPath:g.getGraphPath,drawGraph:g.drawGraph,drawLegendSymbol:c.drawRectangle});\"\"});O(q,\"parts/ColumnSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Color.js\"],q[\"mixins/legend-symbol.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){\"\";var B=c.parse,H=y.animObject,D=y.clamp,J=y.defined,t=y.extend,G=y.isNumber,L=y.merge,v=y.pick;c=y.seriesType;var K=g.Series;c(\"column\",\n\"line\",{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:\"#cccccc\",borderColor:\"#000000\"}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:\"#ffffff\"},{cropShoulder:0,directTouch:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){K.prototype.init.apply(this,\narguments);var c=this,g=c.chart;g.hasRendered&&g.series.forEach(function(g){g.type===c.type&&(g.isDirty=!0)})},getColumnMetrics:function(){var c=this,g=c.options,q=c.xAxis,t=c.yAxis,p=q.options.reversedStacks;p=q.reversed&&!p||!q.reversed&&p;var m,d={},l=0;!1===g.grouping?l=1:c.chart.series.forEach(function(a){var f=a.yAxis,k=a.options;if(a.type===c.type&&(a.visible||!c.chart.options.chart.ignoreHiddenSeries)&&t.len===f.len&&t.pos===f.pos){if(k.stacking&&\"group\"!==k.stacking){m=a.stackKey;\"undefined\"===\ntypeof d[m]&&(d[m]=l++);var g=d[m]}else!1!==k.grouping&&(g=l++);a.columnIndex=g}});var k=Math.min(Math.abs(q.transA)*(q.ordinal&&q.ordinal.slope||g.pointRange||q.closestPointRange||q.tickInterval||1),q.len),f=k*g.groupPadding,a=(k-2*f)/(l||1);g=Math.min(g.maxPointWidth||q.len,v(g.pointWidth,a*(1-2*g.pointPadding)));c.columnMetrics={width:g,offset:(a-g)/2+(f+((c.columnIndex||0)+(p?1:0))*a-k/2)*(p?-1:1),paddedWidth:a,columnCount:l};return c.columnMetrics},crispCol:function(c,g,q,t){var p=this.chart,\nm=this.borderWidth,d=-(m%2?.5:0);m=m%2?.5:1;p.inverted&&p.renderer.isVML&&(m+=1);this.options.crisp&&(q=Math.round(c+q)+d,c=Math.round(c)+d,q-=c);t=Math.round(g+t)+m;d=.5>=Math.abs(g)&&.5<t;g=Math.round(g)+m;t-=g;d&&t&&(--g,t+=1);return{x:c,y:g,width:q,height:t}},adjustForMissingColumns:function(c,q,t,v){var p=this,m=this.options.stacking;if(!t.isNull&&1<v.columnCount){var d=0,l=0;Highcharts.objectEach(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(c){if(\"number\"===typeof t.x&&(c=c[t.x.toString()])){var f=\nc.points[p.index],a=c.total;m?(f&&(d=l),c.hasValidPoints&&l++):g.isArray(f)&&(d=f[1],l=a||0)}});c=(t.plotX||0)+((l-1)*v.paddedWidth+q)/2-q-d*v.paddedWidth}return c},translate:function(){var c=this,g=c.chart,q=c.options,t=c.dense=2>c.closestPointRange*c.xAxis.transA;t=c.borderWidth=v(q.borderWidth,t?0:1);var p=c.xAxis,m=c.yAxis,d=q.threshold,l=c.translatedThreshold=m.getThreshold(d),k=v(q.minPointLength,5),f=c.getColumnMetrics(),a=f.width,A=c.barW=Math.max(a,1+2*t),u=c.pointXOffset=f.offset,E=c.dataMin,\ny=c.dataMax;g.inverted&&(l-=.5);q.pointPadding&&(A=Math.ceil(A));K.prototype.translate.apply(c);c.points.forEach(function(n){var r=v(n.yBottom,l),w=999+Math.abs(r),t=a,e=n.plotX||0;w=D(n.plotY,-w,m.len+w);var b=e+u,h=A,z=Math.min(w,r),x=Math.max(w,r)-z;if(k&&Math.abs(x)<k){x=k;var C=!m.reversed&&!n.negative||m.reversed&&n.negative;G(d)&&G(y)&&n.y===d&&y<=d&&(m.min||0)<d&&E!==y&&(C=!C);z=Math.abs(z-l)>k?r-k:l-(C?k:0)}J(n.options.pointWidth)&&(t=h=Math.ceil(n.options.pointWidth),b-=Math.round((t-a)/\n2));q.centerInCategory&&(b=c.adjustForMissingColumns(b,t,n,f));n.barX=b;n.pointWidth=t;n.tooltipPos=g.inverted?[m.len+m.pos-g.plotLeft-w,p.len+p.pos-g.plotTop-(e||0)-u-h/2,x]:[b+h/2,w+m.pos-g.plotTop,x];n.shapeType=c.pointClass.prototype.shapeType||\"rect\";n.shapeArgs=c.crispCol.apply(c,n.isNull?[b,l,h,0]:[b,z,h,x])})},getSymbol:g.noop,drawLegendSymbol:q.drawRectangle,drawGraph:function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")},pointAttribs:function(c,g){var n=this.options,\nq=this.pointAttrToOptions||{};var p=q.stroke||\"borderColor\";var m=q[\"stroke-width\"]||\"borderWidth\",d=c&&c.color||this.color,l=c&&c[p]||n[p]||this.color||d,k=c&&c[m]||n[m]||this[m]||0;q=c&&c.options.dashStyle||n.dashStyle;var f=v(c&&c.opacity,n.opacity,1);if(c&&this.zones.length){var a=c.getZone();d=c.options.color||a&&(a.color||c.nonZonedColor)||this.color;a&&(l=a.borderColor||l,q=a.dashStyle||q,k=a.borderWidth||k)}g&&c&&(c=L(n.states[g],c.options.states&&c.options.states[g]||{}),g=c.brightness,d=\nc.color||\"undefined\"!==typeof g&&B(d).brighten(c.brightness).get()||d,l=c[p]||l,k=c[m]||k,q=c.dashStyle||q,f=v(c.opacity,f));p={fill:d,stroke:l,\"stroke-width\":k,opacity:f};q&&(p.dashstyle=q);return p},drawPoints:function(){var c=this,g=this.chart,q=c.options,t=g.renderer,p=q.animationLimit||250,m;c.points.forEach(function(d){var l=d.graphic,k=!!l,f=l&&g.pointCount<p?\"animate\":\"attr\";if(G(d.plotY)&&null!==d.y){m=d.shapeArgs;l&&d.hasNewShapeType()&&(l=l.destroy());c.enabledDataSorting&&(d.startXPos=\nc.xAxis.reversed?-(m?m.width:0):c.xAxis.width);l||(d.graphic=l=t[d.shapeType](m).add(d.group||c.group))&&c.enabledDataSorting&&g.hasRendered&&g.pointCount<p&&(l.attr({x:d.startXPos}),k=!0,f=\"animate\");if(l&&k)l[f](L(m));if(q.borderRadius)l[f]({r:q.borderRadius});g.styledMode||l[f](c.pointAttribs(d,d.selected&&\"select\")).shadow(!1!==d.allowShadow&&q.shadow,null,q.stacking&&!q.borderRadius);l.addClass(d.getClassName(),!0)}else l&&(d.graphic=l.destroy())})},animate:function(c){var g=this,n=this.yAxis,\nq=g.options,p=this.chart.inverted,m={},d=p?\"translateX\":\"translateY\";if(c)m.scaleY=.001,c=D(n.toPixels(q.threshold),n.pos,n.pos+n.len),p?m.translateX=c-n.len:m.translateY=c,g.clipBox&&g.setClip(),g.group.attr(m);else{var l=g.group.attr(d);g.group.animate({scaleY:1},t(H(g.options.animation),{step:function(c,f){g.group&&(m[d]=l+f.pos*(n.pos-l),g.group.attr(m))}}))}},remove:function(){var c=this,g=c.chart;g.hasRendered&&g.series.forEach(function(g){g.type===c.type&&(g.isDirty=!0)});K.prototype.remove.apply(c,\narguments)}});\"\"});O(q,\"parts/BarSeries.js\",[q[\"parts/Utilities.js\"]],function(g){g=g.seriesType;g(\"bar\",\"column\",null,{inverted:!0});\"\"});O(q,\"parts/ScatterSeries.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent;c=c.seriesType;var y=g.Series;c(\"scatter\",\"line\",{lineWidth:0,findNearestPointBy:\"xy\",jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style=\"color:{point.color}\">\\u25cf</span> <span style=\"font-size: 10px\"> {series.name}</span><br/>',pointFormat:\"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>\"}},\n{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1,drawGraph:function(){this.options.lineWidth&&y.prototype.drawGraph.call(this)},applyJitter:function(){var c=this,g=this.options.jitter,q=this.points.length;g&&this.points.forEach(function(y,t){[\"x\",\"y\"].forEach(function(D,B){var v=\"plot\"+D.toUpperCase();if(g[D]&&!y.isNull){var G=c[D+\"Axis\"];var n=g[D]*G.transA;if(G&&!G.isLog){var r=Math.max(0,y[v]-n);G=Math.min(G.len,y[v]+\nn);B=1E4*Math.sin(t+B*q);y[v]=r+(G-r)*(B-Math.floor(B));\"x\"===D&&(y.clientX=y.plotX)}}})})}});q(y,\"afterTranslate\",function(){this.applyJitter&&this.applyJitter()});\"\"});O(q,\"mixins/centered-series.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.isNumber,y=c.pick,B=c.relativeLength,H=g.deg2rad;g.CenteredSeriesMixin={getCenter:function(){var c=this.options,q=this.chart,t=2*(c.slicedOffset||0),G=q.plotWidth-2*t,H=q.plotHeight-2*t,v=c.center,K=Math.min(G,H),n=c.size,r=c.innerSize||\n0;\"string\"===typeof n&&(n=parseFloat(n));\"string\"===typeof r&&(r=parseFloat(r));c=[y(v[0],\"50%\"),y(v[1],\"50%\"),y(n&&0>n?void 0:c.size,\"100%\"),y(r&&0>r?void 0:c.innerSize||0,\"0%\")];!q.angular||this instanceof g.Series||(c[3]=0);for(v=0;4>v;++v)n=c[v],q=2>v||2===v&&/%$/.test(n),c[v]=B(n,[G,H,K,c[2]][v])+(q?t:0);c[3]>c[2]&&(c[3]=c[2]);return c},getStartAndEndRadians:function(c,g){c=q(c)?c:0;g=q(g)&&g>c&&360>g-c?g:c+360;return{start:H*(c+-90),end:H*(g+-90)}}}});O(q,\"parts/PieSeries.js\",[q[\"parts/Globals.js\"],\nq[\"mixins/legend-symbol.js\"],q[\"parts/Point.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y){var B=y.addEvent,H=y.clamp,D=y.defined,J=y.fireEvent,t=y.isNumber,G=y.merge,L=y.pick,v=y.relativeLength,K=y.seriesType,n=y.setAnimation;y=g.CenteredSeriesMixin;var r=y.getStartAndEndRadians,C=g.noop,I=g.Series;K(\"pie\",\"line\",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:\"fixedOffset\",crookDistance:\"70%\",distance:30,enabled:!0,formatter:function(){return this.point.isNull?\nvoid 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:\"#ffffff\",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],axisTypes:[],pointAttribs:g.seriesTypes.column.prototype.pointAttribs,animate:function(c){var g=\nthis,d=g.points,l=g.startAngleRad;c||d.forEach(function(d){var c=d.graphic,a=d.shapeArgs;c&&a&&(c.attr({r:L(d.startR,g.center&&g.center[3]/2),start:l,end:l}),c.animate({r:a.r,start:a.start,end:a.end},g.options.animation))})},hasData:function(){return!!this.processedXData.length},updateTotals:function(){var c,g=0,d=this.points,l=d.length,k=this.options.ignoreHiddenPoint;for(c=0;c<l;c++){var f=d[c];g+=k&&!f.visible?0:f.isNull?0:f.y}this.total=g;for(c=0;c<l;c++)f=d[c],f.percentage=0<g&&(f.visible||!k)?\nf.y/g*100:0,f.total=g},generatePoints:function(){I.prototype.generatePoints.call(this);this.updateTotals()},getX:function(c,g,d){var l=this.center,k=this.radii?this.radii[d.index]:l[2]/2;c=Math.asin(H((c-l[1])/(k+d.labelDistance),-1,1));return l[0]+(g?-1:1)*Math.cos(c)*(k+d.labelDistance)+(0<d.labelDistance?(g?-1:1)*this.options.dataLabels.padding:0)},translate:function(c){this.generatePoints();var g=0,d=this.options,l=d.slicedOffset,k=l+(d.borderWidth||0),f=r(d.startAngle,d.endAngle),a=this.startAngleRad=\nf.start;f=(this.endAngleRad=f.end)-a;var p=this.points,n=d.dataLabels.distance;d=d.ignoreHiddenPoint;var q,t=p.length;c||(this.center=c=this.getCenter());for(q=0;q<t;q++){var w=p[q];var y=a+g*f;if(!d||w.visible)g+=w.percentage/100;var F=a+g*f;w.shapeType=\"arc\";w.shapeArgs={x:c[0],y:c[1],r:c[2]/2,innerR:c[3]/2,start:Math.round(1E3*y)/1E3,end:Math.round(1E3*F)/1E3};w.labelDistance=L(w.options.dataLabels&&w.options.dataLabels.distance,n);w.labelDistance=v(w.labelDistance,w.shapeArgs.r);this.maxLabelDistance=\nMath.max(this.maxLabelDistance||0,w.labelDistance);F=(F+y)/2;F>1.5*Math.PI?F-=2*Math.PI:F<-Math.PI/2&&(F+=2*Math.PI);w.slicedTranslation={translateX:Math.round(Math.cos(F)*l),translateY:Math.round(Math.sin(F)*l)};var C=Math.cos(F)*c[2]/2;var e=Math.sin(F)*c[2]/2;w.tooltipPos=[c[0]+.7*C,c[1]+.7*e];w.half=F<-Math.PI/2||F>Math.PI/2?1:0;w.angle=F;y=Math.min(k,w.labelDistance/5);w.labelPosition={natural:{x:c[0]+C+Math.cos(F)*w.labelDistance,y:c[1]+e+Math.sin(F)*w.labelDistance},\"final\":{},alignment:0>\nw.labelDistance?\"center\":w.half?\"right\":\"left\",connectorPosition:{breakAt:{x:c[0]+C+Math.cos(F)*y,y:c[1]+e+Math.sin(F)*y},touchingSliceAt:{x:c[0]+C,y:c[1]+e}}}}J(this,\"afterTranslate\")},drawEmpty:function(){var c=this.startAngleRad,g=this.endAngleRad,d=this.options;if(0===this.total){var l=this.center[0];var k=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(l,k,this.center[1]/2,0,c,g).addClass(\"highcharts-empty-series\").add(this.group));this.graph.attr({d:Highcharts.SVGRenderer.prototype.symbols.arc(l,\nk,this.center[2]/2,0,{start:c,end:g,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({\"stroke-width\":d.borderWidth,fill:d.fillColor||\"none\",stroke:d.color||\"#cccccc\"})}else this.graph&&(this.graph=this.graph.destroy())},redrawPoints:function(){var c=this,g=c.chart,d=g.renderer,l,k,f,a,n=c.options.shadow;this.drawEmpty();!n||c.shadowGroup||g.styledMode||(c.shadowGroup=d.g(\"shadow\").attr({zIndex:-1}).add(c.group));c.points.forEach(function(m){var p={};k=m.graphic;if(!m.isNull&&k){a=\nm.shapeArgs;l=m.getTranslate();if(!g.styledMode){var q=m.shadowGroup;n&&!q&&(q=m.shadowGroup=d.g(\"shadow\").add(c.shadowGroup));q&&q.attr(l);f=c.pointAttribs(m,m.selected&&\"select\")}m.delayedRendering?(k.setRadialReference(c.center).attr(a).attr(l),g.styledMode||k.attr(f).attr({\"stroke-linejoin\":\"round\"}).shadow(n,q),m.delayedRendering=!1):(k.setRadialReference(c.center),g.styledMode||G(!0,p,f),G(!0,p,a,l),k.animate(p));k.attr({visibility:m.visible?\"inherit\":\"hidden\"});k.addClass(m.getClassName())}else k&&\n(m.graphic=k.destroy())})},drawPoints:function(){var c=this.chart.renderer;this.points.forEach(function(g){g.graphic&&g.hasNewShapeType()&&(g.graphic=g.graphic.destroy());g.graphic||(g.graphic=c[g.shapeType](g.shapeArgs).add(g.series.group),g.delayedRendering=!0)})},searchPoint:C,sortByAngle:function(c,g){c.sort(function(c,l){return\"undefined\"!==typeof c.angle&&(l.angle-c.angle)*g})},drawLegendSymbol:c.drawRectangle,getCenter:y.getCenter,getSymbol:C,drawGraph:null},{init:function(){q.prototype.init.apply(this,\narguments);var c=this;c.name=L(c.name,\"Slice\");var g=function(d){c.slice(\"select\"===d.type)};B(c,\"select\",g);B(c,\"unselect\",g);return c},isValid:function(){return t(this.y)&&0<=this.y},setVisible:function(c,g){var d=this,l=d.series,k=l.chart,f=l.options.ignoreHiddenPoint;g=L(g,f);c!==d.visible&&(d.visible=d.options.visible=c=\"undefined\"===typeof c?!d.visible:c,l.options.data[l.data.indexOf(d)]=d.options,[\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"].forEach(function(a){if(d[a])d[a][c?\"show\":\"hide\"](!0)}),\nd.legendItem&&k.legend.colorizeItem(d,c),c||\"hover\"!==d.state||d.setState(\"\"),f&&(l.isDirty=!0),g&&k.redraw())},slice:function(c,g,d){var l=this.series;n(d,l.chart);L(g,!0);this.sliced=this.options.sliced=D(c)?c:!this.sliced;l.options.data[l.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(c){var g=\nthis.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(g.x,g.y,g.r+c,g.r+c,{innerR:g.r-1,start:g.start,end:g.end})},connectorShapes:{fixedOffset:function(c,g,d){var l=g.breakAt;g=g.touchingSliceAt;return[[\"M\",c.x,c.y],d.softConnector?[\"C\",c.x+(\"left\"===c.alignment?-5:5),c.y,2*l.x-g.x,2*l.y-g.y,l.x,l.y]:[\"L\",l.x,l.y],[\"L\",g.x,g.y]]},straight:function(c,g){g=g.touchingSliceAt;return[[\"M\",c.x,c.y],[\"L\",g.x,g.y]]},crookedLine:function(c,g,d){g=g.touchingSliceAt;var l=\nthis.series,k=l.center[0],f=l.chart.plotWidth,a=l.chart.plotLeft;l=c.alignment;var m=this.shapeArgs.r;d=v(d.crookDistance,1);f=\"left\"===l?k+m+(f+a-k-m)*(1-d):a+(k-m)*d;d=[\"L\",f,c.y];k=!0;if(\"left\"===l?f>c.x||f<g.x:f<c.x||f>g.x)k=!1;c=[[\"M\",c.x,c.y]];k&&c.push(d);c.push([\"L\",g.x,g.y]);return c}},getConnectorPath:function(){var c=this.labelPosition,g=this.series.options.dataLabels,d=g.connectorShape,l=this.connectorShapes;l[d]&&(d=l[d]);return d.call(this,{x:c.final.x,y:c.final.y,alignment:c.alignment},\nc.connectorPosition,g)}});\"\"});O(q,\"parts/DataLabels.js\",[q[\"parts/Globals.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=g.noop,y=g.seriesTypes,B=c.animObject,H=c.arrayMax,D=c.clamp,J=c.defined,t=c.extend,G=c.fireEvent,L=c.format,v=c.isArray,K=c.merge,n=c.objectEach,r=c.pick,C=c.relativeLength,I=c.splat,p=c.stableSort,m=g.Series;g.distribute=function(c,l,k){function d(a,c){return a.target-c.target}var a,m=!0,n=c,q=[];var t=0;var w=n.reducedLen||l;for(a=c.length;a--;)t+=c[a].size;if(t>w){p(c,function(a,\nc){return(c.rank||0)-(a.rank||0)});for(t=a=0;t<=w;)t+=c[a].size,a++;q=c.splice(a-1,c.length)}p(c,d);for(c=c.map(function(a){return{size:a.size,targets:[a.target],align:r(a.align,.5)}});m;){for(a=c.length;a--;)m=c[a],t=(Math.min.apply(0,m.targets)+Math.max.apply(0,m.targets))/2,m.pos=D(t-m.size*m.align,0,l-m.size);a=c.length;for(m=!1;a--;)0<a&&c[a-1].pos+c[a-1].size>c[a].pos&&(c[a-1].size+=c[a].size,c[a-1].targets=c[a-1].targets.concat(c[a].targets),c[a-1].align=.5,c[a-1].pos+c[a-1].size>l&&(c[a-1].pos=\nl-c[a-1].size),c.splice(a,1),m=!0)}n.push.apply(n,q);a=0;c.some(function(c){var d=0;if(c.targets.some(function(){n[a].pos=c.pos+d;if(\"undefined\"!==typeof k&&Math.abs(n[a].pos-n[a].target)>k)return n.slice(0,a+1).forEach(function(a){delete a.pos}),n.reducedLen=(n.reducedLen||l)-.1*l,n.reducedLen>.1*l&&g.distribute(n,l,k),!0;d+=n[a].size;a++}))return!0});p(n,d)};m.prototype.drawDataLabels=function(){function c(a,c){var b=c.filter;return b?(c=b.operator,a=a[b.property],b=b.value,\">\"===c&&a>b||\"<\"===\nc&&a<b||\">=\"===c&&a>=b||\"<=\"===c&&a<=b||\"==\"===c&&a==b||\"===\"===c&&a===b?!0:!1):!0}function g(a,c){var b=[],d;if(v(a)&&!v(c))b=a.map(function(a){return K(a,c)});else if(v(c)&&!v(a))b=c.map(function(b){return K(a,b)});else if(v(a)||v(c))for(d=Math.max(a.length,c.length);d--;)b[d]=K(a[d],c[d]);else b=K(a,c);return b}var k=this,f=k.chart,a=k.options,m=a.dataLabels,p=k.points,q,t=k.hasRendered||0,w=B(a.animation).duration,y=Math.min(w,200),F=!f.renderer.forExport&&r(m.defer,0<y),C=f.renderer;m=g(g(f.options.plotOptions&&\nf.options.plotOptions.series&&f.options.plotOptions.series.dataLabels,f.options.plotOptions&&f.options.plotOptions[k.type]&&f.options.plotOptions[k.type].dataLabels),m);G(this,\"drawDataLabels\");if(v(m)||m.enabled||k._hasPointLabels){var e=k.plotGroup(\"dataLabelsGroup\",\"data-labels\",F&&!t?\"hidden\":\"inherit\",m.zIndex||6);F&&(e.attr({opacity:+t}),t||setTimeout(function(){var b=k.dataLabelsGroup;b&&(k.visible&&e.show(!0),b[a.animation?\"animate\":\"attr\"]({opacity:1},{duration:y}))},w-y));p.forEach(function(b){q=\nI(g(m,b.dlOptions||b.options&&b.options.dataLabels));q.forEach(function(d,g){var h=d.enabled&&(!b.isNull||b.dataLabelOnNull)&&c(b,d),l=b.dataLabels?b.dataLabels[g]:b.dataLabel,m=b.connectors?b.connectors[g]:b.connector,p=r(d.distance,b.labelDistance),q=!l;if(h){var u=b.getLabelConfig();var w=r(d[b.formatPrefix+\"Format\"],d.format);u=J(w)?L(w,u,f):(d[b.formatPrefix+\"Formatter\"]||d.formatter).call(u,d);w=d.style;var t=d.rotation;f.styledMode||(w.color=r(d.color,w.color,k.color,\"#000000\"),\"contrast\"===\nw.color?(b.contrastColor=C.getContrast(b.color||k.color),w.color=!J(p)&&d.inside||0>p||a.stacking?b.contrastColor:\"#000000\"):delete b.contrastColor,a.cursor&&(w.cursor=a.cursor));var A={r:d.borderRadius||0,rotation:t,padding:d.padding,zIndex:1};f.styledMode||(A.fill=d.backgroundColor,A.stroke=d.borderColor,A[\"stroke-width\"]=d.borderWidth);n(A,function(a,b){\"undefined\"===typeof a&&delete A[b]})}!l||h&&J(u)?h&&J(u)&&(l?A.text=u:(b.dataLabels=b.dataLabels||[],l=b.dataLabels[g]=t?C.text(u,0,-9999,d.useHTML).addClass(\"highcharts-data-label\"):\nC.label(u,0,-9999,d.shape,null,null,d.useHTML,null,\"data-label\"),g||(b.dataLabel=l),l.addClass(\" highcharts-data-label-color-\"+b.colorIndex+\" \"+(d.className||\"\")+(d.useHTML?\" highcharts-tracker\":\"\"))),l.options=d,l.attr(A),f.styledMode||l.css(w).shadow(d.shadow),l.added||l.add(e),d.textPath&&!d.useHTML&&(l.setTextPath(b.getDataLabelPath&&b.getDataLabelPath(l)||b.graphic,d.textPath),b.dataLabelPath&&!d.textPath.enabled&&(b.dataLabelPath=b.dataLabelPath.destroy())),k.alignDataLabel(b,l,d,null,q)):(b.dataLabel=\nb.dataLabel&&b.dataLabel.destroy(),b.dataLabels&&(1===b.dataLabels.length?delete b.dataLabels:delete b.dataLabels[g]),g||delete b.dataLabel,m&&(b.connector=b.connector.destroy(),b.connectors&&(1===b.connectors.length?delete b.connectors:delete b.connectors[g])))})})}G(this,\"afterDrawDataLabels\")};m.prototype.alignDataLabel=function(c,g,k,f,a){var d=this,l=this.chart,m=this.isCartesian&&l.inverted,n=this.enabledDataSorting,p=r(c.dlBox&&c.dlBox.centerX,c.plotX,-9999),q=r(c.plotY,-9999),v=g.getBBox(),\ny=k.rotation,e=k.align,b=l.isInsidePlot(p,Math.round(q),m),h=\"justify\"===r(k.overflow,n?\"none\":\"justify\"),z=this.visible&&!1!==c.visible&&(c.series.forceDL||n&&!h||b||k.inside&&f&&l.isInsidePlot(p,m?f.x+1:f.y+f.height-1,m));var x=function(e){n&&d.xAxis&&!h&&d.setDataLabelStartPos(c,g,a,b,e)};if(z){var C=l.renderer.fontMetrics(l.styledMode?void 0:k.style.fontSize,g).b;f=t({x:m?this.yAxis.len-q:p,y:Math.round(m?this.xAxis.len-p:q),width:0,height:0},f);t(k,{width:v.width,height:v.height});y?(h=!1,p=\nl.renderer.rotCorr(C,y),p={x:f.x+(k.x||0)+f.width/2+p.x,y:f.y+(k.y||0)+{top:0,middle:.5,bottom:1}[k.verticalAlign]*f.height},x(p),g[a?\"attr\":\"animate\"](p).attr({align:e}),x=(y+720)%360,x=180<x&&360>x,\"left\"===e?p.y-=x?v.height:0:\"center\"===e?(p.x-=v.width/2,p.y-=v.height/2):\"right\"===e&&(p.x-=v.width,p.y-=x?0:v.height),g.placed=!0,g.alignAttr=p):(x(f),g.align(k,null,f),p=g.alignAttr);h&&0<=f.height?this.justifyDataLabel(g,k,p,v,f,a):r(k.crop,!0)&&(z=l.isInsidePlot(p.x,p.y)&&l.isInsidePlot(p.x+v.width,\np.y+v.height));if(k.shape&&!y)g[a?\"attr\":\"animate\"]({anchorX:m?l.plotWidth-c.plotY:c.plotX,anchorY:m?l.plotHeight-c.plotX:c.plotY})}a&&n&&(g.placed=!1);z||n&&!h||(g.hide(!0),g.placed=!1)};m.prototype.setDataLabelStartPos=function(c,g,k,f,a){var d=this.chart,l=d.inverted,m=this.xAxis,n=m.reversed,p=l?g.height/2:g.width/2;c=(c=c.pointWidth)?c/2:0;m=l?a.x:n?-p-c:m.width-p+c;a=l?n?this.yAxis.height-p+c:-p-c:a.y;g.startXPos=m;g.startYPos=a;f?\"hidden\"===g.visibility&&(g.show(),g.attr({opacity:0}).animate({opacity:1})):\ng.attr({opacity:1}).animate({opacity:0},void 0,g.hide);d.hasRendered&&(k&&g.attr({x:g.startXPos,y:g.startYPos}),g.placed=!0)};m.prototype.justifyDataLabel=function(c,g,k,f,a,m){var d=this.chart,l=g.align,n=g.verticalAlign,p=c.box?0:c.padding||0,q=g.x;q=void 0===q?0:q;var r=g.y;var t=void 0===r?0:r;r=k.x+p;if(0>r){\"right\"===l&&0<=q?(g.align=\"left\",g.inside=!0):q-=r;var e=!0}r=k.x+f.width-p;r>d.plotWidth&&(\"left\"===l&&0>=q?(g.align=\"right\",g.inside=!0):q+=d.plotWidth-r,e=!0);r=k.y+p;0>r&&(\"bottom\"===\nn&&0<=t?(g.verticalAlign=\"top\",g.inside=!0):t-=r,e=!0);r=k.y+f.height-p;r>d.plotHeight&&(\"top\"===n&&0>=t?(g.verticalAlign=\"bottom\",g.inside=!0):t+=d.plotHeight-r,e=!0);e&&(g.x=q,g.y=t,c.placed=!m,c.align(g,void 0,a));return e};y.pie&&(y.pie.prototype.dataLabelPositioners={radialDistributionY:function(c){return c.top+c.distributeBox.pos},radialDistributionX:function(c,g,k,f){return c.getX(k<g.top+2||k>g.bottom-2?f:k,g.half,g)},justify:function(c,g,k){return k[0]+(c.half?-1:1)*(g+c.labelDistance)},\nalignToPlotEdges:function(c,g,k,f){c=c.getBBox().width;return g?c+f:k-c-f},alignToConnectors:function(c,g,k,f){var a=0,d;c.forEach(function(c){d=c.dataLabel.getBBox().width;d>a&&(a=d)});return g?a+f:k-a-f}},y.pie.prototype.drawDataLabels=function(){var c=this,l=c.data,k,f=c.chart,a=c.options.dataLabels||{},n=a.connectorPadding,p,q=f.plotWidth,t=f.plotHeight,w=f.plotLeft,v=Math.round(f.chartWidth/3),y,C=c.center,e=C[2]/2,b=C[1],h,z,x,B,D=[[],[]],G,I,L,O,U=[0,0,0,0],R=c.dataLabelPositioners,T;c.visible&&\n(a.enabled||c._hasPointLabels)&&(l.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),m.prototype.drawDataLabels.apply(c),l.forEach(function(b){b.dataLabel&&(b.visible?(D[b.half].push(b),b.dataLabel._pos=null,!J(a.style.width)&&!J(b.options.dataLabels&&b.options.dataLabels.style&&b.options.dataLabels.style.width)&&b.dataLabel.getBBox().width>v&&(b.dataLabel.css({width:Math.round(.7*\nv)+\"px\"}),b.dataLabel.shortened=!0)):(b.dataLabel=b.dataLabel.destroy(),b.dataLabels&&1===b.dataLabels.length&&delete b.dataLabels))}),D.forEach(function(d,l){var m=d.length,p=[],u;if(m){c.sortByAngle(d,l-.5);if(0<c.maxLabelDistance){var v=Math.max(0,b-e-c.maxLabelDistance);var A=Math.min(b+e+c.maxLabelDistance,f.plotHeight);d.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,b-e-a.labelDistance),a.bottom=Math.min(b+e+a.labelDistance,f.plotHeight),u=a.dataLabel.getBBox().height||\n21,a.distributeBox={target:a.labelPosition.natural.y-a.top+u/2,size:u,rank:a.y},p.push(a.distributeBox))});v=A+u-v;g.distribute(p,v,v/5)}for(O=0;O<m;O++){k=d[O];x=k.labelPosition;h=k.dataLabel;L=!1===k.visible?\"hidden\":\"inherit\";I=v=x.natural.y;p&&J(k.distributeBox)&&(\"undefined\"===typeof k.distributeBox.pos?L=\"hidden\":(B=k.distributeBox.size,I=R.radialDistributionY(k)));delete k.positionIndex;if(a.justify)G=R.justify(k,e,C);else switch(a.alignTo){case \"connectors\":G=R.alignToConnectors(d,l,q,w);\nbreak;case \"plotEdges\":G=R.alignToPlotEdges(h,l,q,w);break;default:G=R.radialDistributionX(c,k,I,v)}h._attr={visibility:L,align:x.alignment};T=k.options.dataLabels||{};h._pos={x:G+r(T.x,a.x)+({left:n,right:-n}[x.alignment]||0),y:I+r(T.y,a.y)-10};x.final.x=G;x.final.y=I;r(a.crop,!0)&&(z=h.getBBox().width,v=null,G-z<n&&1===l?(v=Math.round(z-G+n),U[3]=Math.max(v,U[3])):G+z>q-n&&0===l&&(v=Math.round(G+z-q+n),U[1]=Math.max(v,U[1])),0>I-B/2?U[0]=Math.max(Math.round(-I+B/2),U[0]):I+B/2>t&&(U[2]=Math.max(Math.round(I+\nB/2-t),U[2])),h.sideOverflow=v)}}}),0===H(U)||this.verifyDataLabelOverflow(U))&&(this.placeDataLabels(),this.points.forEach(function(b){T=K(a,b.options.dataLabels);if(p=r(T.connectorWidth,1)){var d;y=b.connector;if((h=b.dataLabel)&&h._pos&&b.visible&&0<b.labelDistance){L=h._attr.visibility;if(d=!y)b.connector=y=f.renderer.path().addClass(\"highcharts-data-label-connector  highcharts-color-\"+b.colorIndex+(b.className?\" \"+b.className:\"\")).add(c.dataLabelsGroup),f.styledMode||y.attr({\"stroke-width\":p,\nstroke:T.connectorColor||b.color||\"#666666\"});y[d?\"attr\":\"animate\"]({d:b.getConnectorPath()});y.attr(\"visibility\",L)}else y&&(b.connector=y.destroy())}}))},y.pie.prototype.placeDataLabels=function(){this.points.forEach(function(c){var d=c.dataLabel,g;d&&c.visible&&((g=d._pos)?(d.sideOverflow&&(d._attr.width=Math.max(d.getBBox().width-d.sideOverflow,0),d.css({width:d._attr.width+\"px\",textOverflow:(this.options.dataLabels.style||{}).textOverflow||\"ellipsis\"}),d.shortened=!0),d.attr(d._attr),d[d.moved?\n\"animate\":\"attr\"](g),d.moved=!0):d&&d.attr({y:-9999}));delete c.distributeBox},this)},y.pie.prototype.alignDataLabel=q,y.pie.prototype.verifyDataLabelOverflow=function(c){var d=this.center,g=this.options,f=g.center,a=g.minSize||80,m=null!==g.size;if(!m){if(null!==f[0])var n=Math.max(d[2]-Math.max(c[1],c[3]),a);else n=Math.max(d[2]-c[1]-c[3],a),d[0]+=(c[3]-c[1])/2;null!==f[1]?n=D(n,a,d[2]-Math.max(c[0],c[2])):(n=D(n,a,d[2]-c[0]-c[2]),d[1]+=(c[0]-c[2])/2);n<d[2]?(d[2]=n,d[3]=Math.min(C(g.innerSize||\n0,n),n),this.translate(d),this.drawDataLabels&&this.drawDataLabels()):m=!0}return m});y.column&&(y.column.prototype.alignDataLabel=function(c,g,k,f,a){var d=this.chart.inverted,l=c.series,n=c.dlBox||c.shapeArgs,p=r(c.below,c.plotY>r(this.translatedThreshold,l.yAxis.len)),q=r(k.inside,!!this.options.stacking);n&&(f=K(n),0>f.y&&(f.height+=f.y,f.y=0),n=f.y+f.height-l.yAxis.len,0<n&&n<f.height&&(f.height-=n),d&&(f={x:l.yAxis.len-f.y-f.height,y:l.xAxis.len-f.x-f.width,width:f.height,height:f.width}),q||\n(d?(f.x+=p?0:f.width,f.width=0):(f.y+=p?f.height:0,f.height=0)));k.align=r(k.align,!d||q?\"center\":p?\"right\":\"left\");k.verticalAlign=r(k.verticalAlign,d||q?\"middle\":p?\"top\":\"bottom\");m.prototype.alignDataLabel.call(this,c,g,k,f,a);k.inside&&c.contrastColor&&g.css({color:c.contrastColor})})});O(q,\"modules/overlapping-datalabels.src.js\",[q[\"parts/Chart.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.addEvent,y=c.fireEvent,B=c.isArray,H=c.isNumber,D=c.objectEach,J=c.pick;q(g,\"render\",function(){var c=\n[];(this.labelCollectors||[]).forEach(function(g){c=c.concat(g())});(this.yAxis||[]).forEach(function(g){g.stacking&&g.options.stackLabels&&!g.options.stackLabels.allowOverlap&&D(g.stacking.stacks,function(g){D(g,function(g){c.push(g.label)})})});(this.series||[]).forEach(function(g){var q=g.options.dataLabels;g.visible&&(!1!==q.enabled||g._hasPointLabels)&&(g.nodes||g.points).forEach(function(g){g.visible&&(B(g.dataLabels)?g.dataLabels:g.dataLabel?[g.dataLabel]:[]).forEach(function(q){var n=q.options;\nq.labelrank=J(n.labelrank,g.labelrank,g.shapeArgs&&g.shapeArgs.height);n.allowOverlap||c.push(q)})})});this.hideOverlappingLabels(c)});g.prototype.hideOverlappingLabels=function(c){var g=this,q=c.length,t=g.renderer,B,n,r,C=!1;var D=function(c){var d,g=c.box?0:c.padding||0,f=d=0,a;if(c&&(!c.alignAttr||c.placed)){var m=c.alignAttr||{x:c.attr(\"x\"),y:c.attr(\"y\")};var n=c.parentGroup;c.width||(d=c.getBBox(),c.width=d.width,c.height=d.height,d=t.fontMetrics(null,c.element).h);var p=c.width-2*g;(a={left:\"0\",\ncenter:\"0.5\",right:\"1\"}[c.alignValue])?f=+a*p:H(c.x)&&Math.round(c.x)!==c.translateX&&(f=c.x-c.translateX);return{x:m.x+(n.translateX||0)+g-f,y:m.y+(n.translateY||0)+g-d,width:c.width-2*g,height:c.height-2*g}}};for(n=0;n<q;n++)if(B=c[n])B.oldOpacity=B.opacity,B.newOpacity=1,B.absoluteBox=D(B);c.sort(function(c,g){return(g.labelrank||0)-(c.labelrank||0)});for(n=0;n<q;n++){var p=(D=c[n])&&D.absoluteBox;for(B=n+1;B<q;++B){var m=(r=c[B])&&r.absoluteBox;!p||!m||D===r||0===D.newOpacity||0===r.newOpacity||\nm.x>p.x+p.width||m.x+m.width<p.x||m.y>p.y+p.height||m.y+m.height<p.y||((D.labelrank<r.labelrank?D:r).newOpacity=0)}}c.forEach(function(c){if(c){var d=c.newOpacity;c.oldOpacity!==d&&(c.alignAttr&&c.placed?(c[d?\"removeClass\":\"addClass\"](\"highcharts-data-label-hidden\"),C=!0,c.alignAttr.opacity=d,c[c.isOld?\"animate\":\"attr\"](c.alignAttr,null,function(){g.styledMode||c.css({pointerEvents:d?\"auto\":\"none\"});c.visibility=d?\"inherit\":\"hidden\";c.placed=!!d}),y(g,\"afterHideOverlappingLabel\")):c.attr({opacity:d}));\nc.isOld=!0}});C&&y(g,\"afterHideAllOverlappingLabels\")}});O(q,\"parts/Interaction.js\",[q[\"parts/Chart.js\"],q[\"parts/Globals.js\"],q[\"parts/Legend.js\"],q[\"parts/Options.js\"],q[\"parts/Point.js\"],q[\"parts/Utilities.js\"]],function(g,c,q,y,B,H){var D=y.defaultOptions,J=H.addEvent,t=H.createElement,G=H.css,L=H.defined,v=H.extend,K=H.fireEvent,n=H.isArray,r=H.isFunction,C=H.isNumber,I=H.isObject,p=H.merge,m=H.objectEach,d=H.pick,l=c.hasTouch;y=c.Series;H=c.seriesTypes;var k=c.svg;var f=c.TrackerMixin={drawTrackerPoint:function(){var a=\nthis,c=a.chart,d=c.pointer,f=function(a){var c=d.getPointFromEvent(a);\"undefined\"!==typeof c&&(d.isDirectTouch=!0,c.onMouseOver(a))},g;a.points.forEach(function(a){g=n(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);g.forEach(function(c){c.div?c.div.point=a:c.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(g){if(a[g]){a[g].addClass(\"highcharts-tracker\").on(\"mouseover\",f).on(\"mouseout\",function(a){d.onTrackerMouseOut(a)});if(l)a[g].on(\"touchstart\",\nf);!c.styledMode&&a.options.cursor&&a[g].css(G).css({cursor:a.options.cursor})}}),a._hasTracking=!0);K(this,\"afterDrawTracker\")},drawTrackerGraph:function(){var a=this,c=a.options,d=c.trackByArea,f=[].concat(d?a.areaPath:a.graphPath),g=a.chart,m=g.pointer,n=g.renderer,p=g.options.tooltip.snap,q=a.tracker,e=function(b){if(g.hoverSeries!==a)a.onMouseOver()},b=\"rgba(192,192,192,\"+(k?.0001:.002)+\")\";q?q.attr({d:f}):a.graph&&(a.tracker=n.path(f).attr({visibility:a.visible?\"visible\":\"hidden\",zIndex:2}).addClass(d?\n\"highcharts-tracker-area\":\"highcharts-tracker-line\").add(a.group),g.styledMode||a.tracker.attr({\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",stroke:b,fill:d?b:\"none\",\"stroke-width\":a.graph.strokeWidth()+(d?0:2*p)}),[a.tracker,a.markerGroup].forEach(function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",e).on(\"mouseout\",function(a){m.onTrackerMouseOut(a)});c.cursor&&!g.styledMode&&a.css({cursor:c.cursor});if(l)a.on(\"touchstart\",e)}));K(this,\"afterDrawTracker\")}};H.column&&(H.column.prototype.drawTracker=\nf.drawTrackerPoint);H.pie&&(H.pie.prototype.drawTracker=f.drawTrackerPoint);H.scatter&&(H.scatter.prototype.drawTracker=f.drawTrackerPoint);v(q.prototype,{setItemEvents:function(a,c,d){var f=this,g=f.chart.renderer.boxWrapper,k=a instanceof B,l=\"highcharts-legend-\"+(k?\"point\":\"series\")+\"-active\",m=f.chart.styledMode;(d?[c,a.legendSymbol]:[a.legendGroup]).forEach(function(d){if(d)d.on(\"mouseover\",function(){a.visible&&f.allItems.forEach(function(c){a!==c&&c.setState(\"inactive\",!k)});a.setState(\"hover\");\na.visible&&g.addClass(l);m||c.css(f.options.itemHoverStyle)}).on(\"mouseout\",function(){f.chart.styledMode||c.css(p(a.visible?f.itemStyle:f.itemHiddenStyle));f.allItems.forEach(function(c){a!==c&&c.setState(\"\",!k)});g.removeClass(l);a.setState()}).on(\"click\",function(c){var b=function(){a.setVisible&&a.setVisible();f.allItems.forEach(function(b){a!==b&&b.setState(a.visible?\"inactive\":\"\",!k)})};g.removeClass(l);c={browserEvent:c};a.firePointEvent?a.firePointEvent(\"legendItemClick\",c,b):K(a,\"legendItemClick\",\nc,b)})})},createCheckboxForItem:function(a){a.checkbox=t(\"input\",{type:\"checkbox\",className:\"highcharts-legend-checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);J(a.checkbox,\"click\",function(c){K(a.series||a,\"checkboxClick\",{checked:c.target.checked,item:a},function(){a.select()})})}});v(g.prototype,{showResetZoom:function(){function a(){c.zoomOut()}var c=this,d=D.lang,f=c.options.chart.resetZoomButton,g=f.theme,k=g.states,l=\"chart\"===f.relativeTo||\n\"spaceBox\"===f.relativeTo?null:\"plotBox\";K(this,\"beforeShowResetZoom\",null,function(){c.resetZoomButton=c.renderer.button(d.resetZoom,null,null,a,g,k&&k.hover).attr({align:f.position.align,title:d.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(f.position,!1,l)});K(this,\"afterShowResetZoom\")},zoomOut:function(){K(this,\"selection\",{resetSelection:!0},this.zoom)},zoom:function(a){var c=this,f,g=c.pointer,k=!1,l=c.inverted?g.mouseDownX:g.mouseDownY;!a||a.resetSelection?(c.axes.forEach(function(a){f=\na.zoom()}),g.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var d=a.axis,e=c.inverted?d.left:d.top,b=c.inverted?e+d.width:e+d.height,h=d.isXAxis,m=!1;if(!h&&l>=e&&l<=b||h||!L(l))m=!0;g[h?\"zoomX\":\"zoomY\"]&&m&&(f=d.zoom(a.min,a.max),d.displayBtn&&(k=!0))});var m=c.resetZoomButton;k&&!m?c.showResetZoom():!k&&I(m)&&(c.resetZoomButton=m.destroy());f&&c.redraw(d(c.options.chart.animation,a&&a.animation,100>c.pointCount))},pan:function(a,d){var f=this,g=f.hoverPoints,k=f.options.chart,l=f.options.mapNavigation&&\nf.options.mapNavigation.enabled,m;d=\"object\"===typeof d?d:{enabled:d,type:\"x\"};k&&k.panning&&(k.panning=d);var n=d.type;K(this,\"pan\",{originalEvent:a},function(){g&&g.forEach(function(a){a.setState()});var d=[1];\"xy\"===n?d=[1,0]:\"y\"===n&&(d=[0]);d.forEach(function(d){var b=f[d?\"xAxis\":\"yAxis\"][0],e=b.horiz,g=a[e?\"chartX\":\"chartY\"];e=e?\"mouseDownX\":\"mouseDownY\";var k=f[e],p=(b.pointRange||0)/2,q=b.reversed&&!f.inverted||!b.reversed&&f.inverted?-1:1,r=b.getExtremes(),u=b.toValue(k-g,!0)+p*q;q=b.toValue(k+\nb.len-g,!0)-p*q;var t=q<u;k=t?q:u;u=t?u:q;var w=b.hasVerticalPanning(),v=b.panningState;b.series.forEach(function(a){if(w&&!d&&(!v||v.isDirty)){var b=a.getProcessedData(!0);a=a.getExtremes(b.yData,!0);v||(v={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});C(a.dataMin)&&C(a.dataMax)&&(v.startMin=Math.min(a.dataMin,v.startMin),v.startMax=Math.max(a.dataMax,v.startMax))}});q=Math.min(c.pick(null===v||void 0===v?void 0:v.startMin,r.dataMin),p?r.min:b.toValue(b.toPixels(r.min)-b.minPixelPadding));\np=Math.max(c.pick(null===v||void 0===v?void 0:v.startMax,r.dataMax),p?r.max:b.toValue(b.toPixels(r.max)+b.minPixelPadding));b.panningState=v;b.isOrdinal||(t=q-k,0<t&&(u+=t,k=q),t=u-p,0<t&&(u=p,k-=t),b.series.length&&k!==r.min&&u!==r.max&&k>=q&&u<=p&&(b.setExtremes(k,u,!1,!1,{trigger:\"pan\"}),f.resetZoomButton||l||k===q||u===p||!n.match(\"y\")||(f.showResetZoom(),b.displayBtn=!1),m=!0),f[e]=g)});m&&f.redraw(!1);G(f.container,{cursor:\"move\"})})}});v(B.prototype,{select:function(a,c){var f=this,g=f.series,\nk=g.chart;this.selectedStaging=a=d(a,!f.selected);f.firePointEvent(a?\"select\":\"unselect\",{accumulate:c},function(){f.selected=f.options.selected=a;g.options.data[g.data.indexOf(f)]=f.options;f.setState(a&&\"select\");c||k.getSelectedPoints().forEach(function(a){var c=a.series;a.selected&&a!==f&&(a.selected=a.options.selected=!1,c.options.data[c.data.indexOf(a)]=a.options,a.setState(k.hoverPoints&&c.options.inactiveOtherPoints?\"inactive\":\"\"),a.firePointEvent(\"unselect\"))})});delete this.selectedStaging},\nonMouseOver:function(a){var c=this.series.chart,d=c.pointer;a=a?d.normalize(a):d.getChartCoordinatesFromPoint(this,c.inverted);d.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");this.series.options.inactiveOtherPoints||(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=this,c=p(a.series.options.point,a.options).events;a.events=c;m(c,function(c,d){r(c)&&\nJ(a,d,c)});this.hasImportedEvents=!0}},setState:function(a,c){var f=this.series,g=this.state,k=f.options.states[a||\"normal\"]||{},l=D.plotOptions[f.type].marker&&f.options.marker,m=l&&!1===l.enabled,n=l&&l.states&&l.states[a||\"normal\"]||{},p=!1===n.enabled,e=f.stateMarkerGraphic,b=this.marker||{},h=f.chart,q=f.halo,r,t=l&&f.markerAttribs;a=a||\"\";if(!(a===this.state&&!c||this.selected&&\"select\"!==a||!1===k.enabled||a&&(p||m&&!1===n.enabled)||a&&b.states&&b.states[a]&&!1===b.states[a].enabled)){this.state=\na;t&&(r=f.markerAttribs(this,a));if(this.graphic){g&&this.graphic.removeClass(\"highcharts-point-\"+g);a&&this.graphic.addClass(\"highcharts-point-\"+a);if(!h.styledMode){var y=f.pointAttribs(this,a);var A=d(h.options.chart.animation,k.animation);f.options.inactiveOtherPoints&&y.opacity&&((this.dataLabels||[]).forEach(function(a){a&&a.animate({opacity:y.opacity},A)}),this.connector&&this.connector.animate({opacity:y.opacity},A));this.graphic.animate(y,A)}r&&this.graphic.animate(r,d(h.options.chart.animation,\nn.animation,l.animation));e&&e.hide()}else{if(a&&n){g=b.symbol||f.symbol;e&&e.currentSymbol!==g&&(e=e.destroy());if(r)if(e)e[c?\"animate\":\"attr\"]({x:r.x,y:r.y});else g&&(f.stateMarkerGraphic=e=h.renderer.symbol(g,r.x,r.y,r.width,r.height).add(f.markerGroup),e.currentSymbol=g);!h.styledMode&&e&&e.attr(f.pointAttribs(this,a))}e&&(e[a&&this.isInside?\"show\":\"hide\"](),e.element.point=this)}a=k.halo;k=(e=this.graphic||e)&&e.visibility||\"inherit\";a&&a.size&&e&&\"hidden\"!==k&&!this.isCluster?(q||(f.halo=q=\nh.renderer.path().add(e.parentGroup)),q.show()[c?\"animate\":\"attr\"]({d:this.haloPath(a.size)}),q.attr({\"class\":\"highcharts-halo highcharts-color-\"+d(this.colorIndex,f.colorIndex)+(this.className?\" \"+this.className:\"\"),visibility:k,zIndex:-1}),q.point=this,h.styledMode||q.attr(v({fill:this.color||f.color,\"fill-opacity\":a.opacity},a.attributes))):q&&q.point&&q.point.haloPath&&q.animate({d:q.point.haloPath(0)},null,q.hide);K(this,\"afterSetState\")}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-\na,this.plotY-a,2*a,2*a)}});v(y.prototype,{onMouseOver:function(){var a=this.chart,c=a.hoverSeries;a.pointer.setHoverChartIndex();if(c&&c!==this)c.onMouseOut();this.options.events.mouseOver&&K(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,c=this.chart,d=c.tooltip,f=c.hoverPoint;c.hoverSeries=null;if(f)f.onMouseOut();this&&a.events.mouseOut&&K(this,\"mouseOut\");!d||this.stickyTracking||d.shared&&!this.noSharedTooltip||d.hide();c.series.forEach(function(a){a.setState(\"\",\n!0)})},setState:function(a,c){var f=this,g=f.options,k=f.graph,l=g.inactiveOtherPoints,m=g.states,n=g.lineWidth,p=g.opacity,e=d(m[a||\"normal\"]&&m[a||\"normal\"].animation,f.chart.options.chart.animation);g=0;a=a||\"\";if(f.state!==a&&([f.group,f.markerGroup,f.dataLabelsGroup].forEach(function(b){b&&(f.state&&b.removeClass(\"highcharts-series-\"+f.state),a&&b.addClass(\"highcharts-series-\"+a))}),f.state=a,!f.chart.styledMode)){if(m[a]&&!1===m[a].enabled)return;a&&(n=m[a].lineWidth||n+(m[a].lineWidthPlus||\n0),p=d(m[a].opacity,p));if(k&&!k.dashstyle)for(m={\"stroke-width\":n},k.animate(m,e);f[\"zone-graph-\"+g];)f[\"zone-graph-\"+g].attr(m),g+=1;l||[f.group,f.markerGroup,f.dataLabelsGroup,f.labelBySeries].forEach(function(a){a&&a.animate({opacity:p},e)})}c&&l&&f.points&&f.setAllPointsToState(a)},setAllPointsToState:function(a){this.points.forEach(function(c){c.setState&&c.setState(a)})},setVisible:function(a,c){var d=this,f=d.chart,g=d.legendItem,k=f.options.chart.ignoreHiddenSeries,l=d.visible;var m=(d.visible=\na=d.options.visible=d.userOptions.visible=\"undefined\"===typeof a?!l:a)?\"show\":\"hide\";[\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"].forEach(function(a){if(d[a])d[a][m]()});if(f.hoverSeries===d||(f.hoverPoint&&f.hoverPoint.series)===d)d.onMouseOut();g&&f.legend.colorizeItem(d,a);d.isDirty=!0;d.options.stacking&&f.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d.linkedSeries.forEach(function(c){c.setVisible(a,!1)});k&&(f.isDirtyBox=!0);K(d,m);!1!==c&&f.redraw()},\nshow:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=this.options.selected=\"undefined\"===typeof a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);K(this,a?\"select\":\"unselect\")},drawTracker:f.drawTrackerGraph})});O(q,\"parts/Responsive.js\",[q[\"parts/Chart.js\"],q[\"parts/Utilities.js\"]],function(g,c){var q=c.find,y=c.isArray,B=c.isObject,H=c.merge,D=c.objectEach,J=c.pick,t=c.splat,G=c.uniqueKey;g.prototype.setResponsive=function(c,g){var t=\nthis.options.responsive,n=[],r=this.currentResponsive;!g&&t&&t.rules&&t.rules.forEach(function(c){\"undefined\"===typeof c._id&&(c._id=G());this.matchResponsiveRule(c,n)},this);g=H.apply(0,n.map(function(c){return q(t.rules,function(g){return g._id===c}).chartOptions}));g.isResponsiveOptions=!0;n=n.toString()||void 0;n!==(r&&r.ruleIds)&&(r&&this.update(r.undoOptions,c,!0),n?(r=this.currentOptions(g),r.isResponsiveOptions=!0,this.currentResponsive={ruleIds:n,mergedOptions:g,undoOptions:r},this.update(g,\nc,!0)):this.currentResponsive=void 0)};g.prototype.matchResponsiveRule=function(c,g){var q=c.condition;(q.callback||function(){return this.chartWidth<=J(q.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=J(q.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=J(q.minWidth,0)&&this.chartHeight>=J(q.minHeight,0)}).call(this)&&g.push(c._id)};g.prototype.currentOptions=function(c){function g(c,n,v,p){var m;D(c,function(c,l){if(!p&&-1<q.collectionsWithUpdate.indexOf(l))for(c=t(c),v[l]=[],m=0;m<Math.max(c.length,\nn[l].length);m++)n[l][m]&&(void 0===c[m]?v[l][m]=n[l][m]:(v[l][m]={},g(c[m],n[l][m],v[l][m],p+1)));else B(c)?(v[l]=y(c)?[]:{},g(c,n[l]||{},v[l],p+1)):v[l]=\"undefined\"===typeof n[l]?null:n[l]})}var q=this,n={};g(c,this.options,n,0);return n}});O(q,\"masters/highcharts.src.js\",[q[\"parts/Globals.js\"]],function(g){return g});q[\"masters/highcharts.src.js\"]._modules=q;return q[\"masters/highcharts.src.js\"]});\n//# sourceMappingURL=highcharts.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/highcharts/highcharts.js\n// module id = 531\n// module chunks = 0 1","import React, { CSSProperties } from 'react';\nimport PropTypes from 'prop-types';\nimport $ from 'jquery';\n\nexport default class SummaryTooltip extends React.Component<any, any> {\n  static propTypes = {\n    top: PropTypes.number.isRequired,\n    left: PropTypes.number.isRequired,\n    color: PropTypes.string\n  };\n\n  render() {\n    const { left, top, color, children } = this.props;\n    const wrapperStyle = {\n      position: 'absolute',\n      left,\n      top\n    } as CSSProperties;\n    const contentStyle = {\n      borderColor: color\n    };\n\n    return (\n      <div ref=\"wrapper\" className=\"graph-tooltip__wrapper\" style={wrapperStyle}>\n        <div ref=\"tooltip\" className=\"graph-tooltip\" style={contentStyle}>\n          {children}\n        </div>\n      </div>\n    );\n  }\n\n  componentDidMount() {\n    this.adjustPosition();\n  }\n\n  componentDidUpdate() {\n    this.adjustPosition();\n  }\n\n  // Using ugly DOM manipulation instead of state to avoid potential infinite\n  // updates if the size calculation keeps changing up/down state on update\n  adjustPosition() {\n    const $wrapper = $(this.refs.wrapper);\n    const $tooltip = $(this.refs.tooltip);\n    const topDelta = $wrapper.height() - this.props.top;\n\n    const direction = topDelta >= 0 ? 'down' : 'up';\n    if (direction === 'down') {\n      $wrapper.addClass('down');\n      $wrapper.removeClass('up');\n      $tooltip.addClass('down');\n      $tooltip.removeClass('up');\n    } else {\n      $wrapper.addClass('up');\n      $wrapper.removeClass('down');\n      $tooltip.addClass('up');\n      $tooltip.removeClass('down');\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/summary_tooltip.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport PureRenderMixin from 'react-pure-render/mixin';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport _s from 'underscore.string';\nimport classNames from 'classnames';\n\nimport strings from './strings';\nimport DocumentMixin from './document_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst PieSlider = createReactClass<any, any>({\n  mixins: [DocumentMixin, PureRenderMixin] as any,\n\n  propTypes: {\n    items: PropTypes.array, //array of objects\n    initialSelection: PropTypes.string,\n    minTickWidth: PropTypes.number,\n    sliderWidth: PropTypes.number,\n    graphType: PropTypes.string,\n    onChange: PropTypes.func.isRequired\n  },\n\n  getInitialState() {\n    return {\n      sliderLocked: true\n    };\n  },\n\n  getDefaultProps() {\n    return {\n      minTickWidth: 70, //65,\n      sliderWidth: 600\n    };\n  },\n\n  componentDidMount() {\n    const { initialSelection, items } = this.props;\n\n    this.onDocument('mouseup', this.handleSliderBlur);\n    this.onDocument('mousemove', this.handleSliderChange);\n\n    //Note below does not get called as `this.props.items` is empty on the first pass\n    //gets called when switching from graph with year to one without year\n    if (items && items.length > 1) {\n      this.handleTickSelection(this.getData().items, initialSelection);\n    }\n  },\n\n  componentDidUpdate(prevProps) {\n    const { items, initialSelection } = this.props;\n\n    if (!items || items.length <= 1) {\n      return;\n    }\n    const itemsDidUpdate = !prevProps.items || prevProps.items.length !== items.length;\n    const selectionDidUpdate = prevProps.initialSelection !== initialSelection;\n\n    //initialSelection -> final selected item, if want item in middle of selection need to use this.state.selected\n    if (itemsDidUpdate || selectionDidUpdate) {\n      const index = initialSelection; //not using `this.state.selected.index` as on first load it's not defined yet\n      // we pass false as the last parameter because we do not want to call the onChange prop\n      this.handleTickSelection(this.getData().items, index);\n    }\n\n    this.setState({\n      maximumLabelHeight: this.computeMaximumLabelHeight()\n    });\n  },\n\n  render() {\n    if (!this.props.items || !this.props.items.length) {\n      return null;\n    }\n\n    const data = this.getData();\n    var items = data.items;\n    const tickStyle = {width: data.tickWidth, marginLeft: (data.itemWidth - data.tickWidth) / 2};\n\n    return (\n      items.length > 1 ?\n        <div className=\"pie-slider\" style={{width: this.props.sliderWidth}}>\n          <ul className=\"pie-slider__years js-slider-years\" ref=\"sliderTicks\">\n            {items.map((item, index) => {\n              //Ternary is essentail as undefined on initial load\n              const i = typeof(this.state.selected) === 'object' ? this.state.selected.index : this.state.selected;\n              const isSelected = i === item.index; //temporary measure, the use of i....\n              const labelClassName = classNames({\n                'pie-slider__year__text': true,\n                'is-selected': isSelected\n              });\n\n              return (\n                <li key={index} //what does index reference here?????\n                  className=\"pie-slider__year\"\n                  style={{width: data.itemWidth}}\n                  onClick={_.partial(this.handleTickSelection, items, item.index)}>\n                  <span style={tickStyle} className={labelClassName} dangerouslySetInnerHTML={{__html: item.html}}/>\n                    {item.isVisible ? //Only showing year tick marker if item.isVisible === true; meaning that there is enough space\n                    !isSelected ? <span className=\"pie-slider__year__marker\"/> : null\n                    : null}\n                </li>\n\n              );\n            })}\n          </ul>\n          <div style={{marginBottom: this.state.maximumLabelHeight}}>\n            <div className=\"pie-slider__bar js-slider-bar\" ref=\"sliderBar\">\n              <div\n                className=\"pie-slider__handle js-slider-handle\"\n                ref=\"sliderHandle\"\n                style={{left:this.state.sliderPosition}}\n                onMouseDown={this.handleSliderFocus}>\n                <span className=\"icon-lefthead-2\"/>\n                <span className=\"icon-righthead-2\"/>\n              </div>\n            </div>\n          </div>\n        </div>\n      : null\n    );\n  },\n\n  getData() {\n    const data: any = {};\n    const items = this.props.items;\n    const minTickWidth = this.props.minTickWidth;\n    const sliderWidth = this.props.sliderWidth - minTickWidth / 2;\n    const itemWidth = sliderWidth / items.length;\n    const tickWidth = itemWidth < minTickWidth ? minTickWidth : itemWidth;\n    const visibleTicks = Math.round(sliderWidth / tickWidth);\n    const tickInterval = Math.round(items.length / visibleTicks);\n\n    data.items = items.map((item, index) => {\n      return {\n        index: item.key,\n        value: item.value,\n        minPosition: index * itemWidth,\n        html: strings.nl2br(_s.escapeHTML(item.value)),\n        maxPosition: (index * itemWidth) + itemWidth,\n        isVisible: ((items.length - 1 - index) % tickInterval) === 0,\n        centerPosition: (index * itemWidth) + (itemWidth / 2)\n      };\n    });\n\n    data.itemWidth = itemWidth;\n    data.tickWidth = tickWidth;\n\n    return data;\n  },\n\n  getHandleCenter(pageX) {\n    const $bar = $(this.refs.sliderBar);\n    const sliderOffsetX = $bar.offset().left;\n    let position = pageX - sliderOffsetX;\n    position = position < 0 ? 0 : position;\n    position = position > this.props.sliderWidth ? this.props.sliderWidth : position;\n    return position;\n  },\n\n  getItemFromPosition(items, pageX) {\n    const handleCenter = this.getHandleCenter(pageX, this.props.sliderWidth);\n    return _.head(_.filter(items, (value: { minPosition, maxPosition }) => {\n      return handleCenter >= value.minPosition && handleCenter <= value.maxPosition;\n    }));\n  },\n\n  handleTickSelection(items: { index, centerPosition }[], index, position, shouldCallOnChange = false, shouldSaveState = true) { //should fix handle tick slection to make index a year value not an index\n    let selected = _.find(items, _.bind((item) => {\n      if (item.index === index) {\n        return item;\n      }\n    }, this));\n\n    // if we happen to have no selected item, just give us the last one\n    // and set index to a number and not Infinity\n    if (!selected) {\n      selected = _.last(items);\n      index = items.length - 1;\n    }\n\n    this.setState({\n      selected,\n      sliderPosition: position || selected.centerPosition\n    });\n\n    if (shouldCallOnChange) {\n      this.props.onChange(index, shouldSaveState);\n    }\n  },\n\n  handleSliderChange(event) {\n    if (!this.state.sliderLocked) {\n      event.preventDefault();\n      const position = this.getHandleCenter(event.pageX);\n      const item = this.getItemFromPosition(this.getData().items, event.pageX);\n      const selected = item ? item : this.state.selected; //this value is in realtime, if want to do realtime changing of bar data do check for this.state.selected\n\n      // we pass true and false here because we want to call the onChange prop but do not want to save grid state\n      this.handleTickSelection(this.getData().items, selected.index, position, true, false);\n    }\n  },\n\n  handleSliderBlur() {\n    if (!this.state.sliderLocked) {\n      this.setState({ sliderLocked: true });\n      const { selected } = this.state;\n      this.handleTickSelection(this.getData().items, selected.index, selected.centerPosition, true, true);\n    }\n  },\n\n  handleSliderFocus() {\n    this.setState({ sliderLocked: false });\n  },\n\n  computeMaximumLabelHeight() {\n    return $(this.refs.sliderTicks).outerHeight() + 14;\n  }\n\n});\n\nexport default PieSlider;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/summary_pie_slider.tsx","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shouldPureComponentUpdate;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _shallowEqual = require('./shallowEqual');\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nfunction shouldPureComponentUpdate(nextProps, nextState) {\n  return !(0, _shallowEqual2['default'])(this.props, nextProps) || !(0, _shallowEqual2['default'])(this.state, nextState);\n}\n\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-pure-render/function.js\n// module id = 534\n// module chunks = 0 1","import _ from 'lodash';\nimport chroma from 'chroma-js';\nimport { isProjectionType, isBudgetType, isActualType } from './dataset_utils';\n\nexport const ANIMATION_DURATION = 350;\n\nexport const REGULAR_OPACITY = 0.75;\nexport const MIDDLE_OPACITY = 0.55;\nexport const FAINT_OPACITY = 0.35;\nexport const HIGHLIGHT_OPACITY = 0.1;\nexport const SHADES_MULTIPLIER = 2;\n\n/**\n * Returns an animation configuration object for Highcharts.\n * @return {Object} Animation config\n */\nexport const getAnimationDuration = () => ({\n  animation: ANIMATION_DURATION\n});\n\n/**\n * Returns an RGB color based on a hex color and an opacity.\n * @param   {String} color       The hex value of the color\n * @param   {Number} fillOpacity The opacity with which the color should be set\n * @returns {String} An RGBA value to be consumed by Highcharts\n */\nexport function setColorOpacityForDataSetType(color, fillOpacity, dataSetType = null) {\n  return (isProjectionType(dataSetType) || isBudgetType(dataSetType) ) ? color : chroma(color).alpha(fillOpacity).css();\n}\n\n/**\n * Returns the fill opacity based on the dataset type and graph type.\n * @param  {String} dataSetType The dataset type\n * @param  {String} graphType   The current graphType\n * @return {Number} Opacity\n */\nexport function getFillOpacity(dataSetType, graphType?: string) {\n  if (isActualType(dataSetType)) {\n    return REGULAR_OPACITY;\n  }\n\n  return graphType === 'column' ? FAINT_OPACITY * 2 : FAINT_OPACITY;\n}\n\n/**\n * Returns a color for a dataset based on its original color and dataset type.\n * @param  {String} color       The hex value of the color\n * @param  {String} dataSetType The type of the dataset, e.g. budget, projection\n * @return {String} The value of the color\n */\nexport function getColorForDatasetType(color, dataSetType) {\n  if (isProjectionType(dataSetType) || isBudgetType(dataSetType)) {\n    return getPatternStringForColor(color, dataSetType);\n  }\n\n  return setColorOpacityForDataSetType(color, REGULAR_OPACITY);\n}\n\n/**\n * Returns the style of the dataset based on its type.\n * @param  {String} dataSetType The dataset type, e.g. budget, actual, etc.\n * @return {String} The dash style for the dataset\n */\nexport function getDashStyleForDatasetType(dataSetType) {\n  if (isBudgetType(dataSetType)) {\n    return 'shortdash';\n  } else if (isProjectionType(dataSetType)) {\n    return 'dash';\n  } else if (isActualType(dataSetType)) {\n    return '';\n  }\n}\n\n/**\n * Sets the point state of a series.\n * @param {Array<Object>} seriesList The array of series\n * @param {String}        state  Optional parameter with which the state of the series will be set to\n */\nexport function setPointStateForSeries(seriesList, state = null) {\n  _.each(seriesList, (serie) => {\n    _.each(serie.data, (point) => point.setState(state));\n  });\n}\n\n/**\n * Generates a pattern fill based on a hex color and an opacity.\n * The current SVG pattern is a striped line.\n * @param  {String}  color          The hex string\n * @param  {Number}  fillOpacity    The opacity of the fill behind the stroke\n * @param  {Boolean} isHighlighting If we are highlighting or not\n * @return {Object}  The patternfill object that the Highcharts pattern fill plugin will consume\n */\nexport function getPatternFillForColor(color, dataSetType, isHighlighting = null) {\n  let strokeWidth;\n\n  const strokeOpacity = REGULAR_OPACITY;\n  const fillOpacity = isHighlighting ? MIDDLE_OPACITY : FAINT_OPACITY;\n\n  const height = 10;\n  const width = 10;\n  const delta = 1;\n\n  if (isBudgetType(dataSetType)) {\n    strokeWidth = 4;\n  } else if (isProjectionType(dataSetType)) {\n    strokeWidth = 2;\n  }\n\n  return {\n    id: `${dataSetType}-${color}`,\n    path: {\n      d: `M 0 ${height} L ${width} 0 M ${-delta} ${delta} L ${delta} ${-delta} M ${width - delta} ${height + delta} L ${width + delta} ${height - delta}`,\n      stroke: setColorOpacityForDataSetType(color, strokeOpacity),\n      strokeWidth: strokeWidth,\n      fill: setColorOpacityForDataSetType(color, fillOpacity)\n    }\n  };\n}\n\n/**\n * Generates pattern fills for an array of colors.\n * @param  {Array<String>} colors      An array of colors represented as hex\n * @return {Array<Object>} An array of pattern fill objects that the Highcharts pattern fill plugin will consume\n */\nexport function getPatternFillForColors(colors, dataSetType) {\n  const allColors = _.map(colors, (color) => getPatternFillForColor(color, dataSetType));\n  const isHighlighting = true;\n  return allColors.concat(\n    _.map(colors, (color) => getPatternFillForColor(saturateAndDarken(color).hex(), dataSetType, isHighlighting))\n  );\n}\n\n/**\n * Generates the string needed to specify which Highcharts pattern should be accessed.\n * @param  {String} color The color represented as hex\n * @return {String} The pattern string\n */\nexport function getPatternStringForColor(color, dataSetType) {\n  return `url(#${dataSetType}-${color})`;\n}\n\n/**\n * Takes an array of data series and returns the selected series.\n * @param  {Array}  series   The array of series for the chart\n * @param  {Number} seriesId The id of the series to be selected\n * @return {Object} The selected series\n */\nexport function filterSelectedSeries(series: { options: { id: number } }[], seriesId: number) {\n  return _.filter(series, (s) => s.options.id === seriesId);\n}\n\n/**\n * Returns a match for hex color code.\n * @param  {string} color String to be matched for a hex color\n * @return {string}       The matched color\n */\nexport function matchColor(color) {\n  const colorMatch = color.match(/\\b[0-9A-F]{6}\\b/gi);\n  return colorMatch && colorMatch[0];\n}\n\n/**\n * Return a color that has been saturated and darkened.\n * @param  {string} color Any color string that chroma-js accepts\n * @return {object}       A chroma js color object\n */\nexport function saturateAndDarken(color) {\n  return chroma(color).saturate(0.5).darken(0.1);\n}\n\n/**\n * Brightens an SVG area by setting the fill value to a derived color.\n * @param  {Object} area          The SVG area\n * @param  {Number} alpha         The alpha with which to alter the area fill\n * @param  {String} originalColor The original color of the SVG\n * @param  {String} dataType      The data type we are working with\n */\nexport function brightenSVGArea(area, alpha, originalColor, dataType = null) {\n  const areaFill: { value: any } = _.get(area, 'element.attributes.fill');\n  if (areaFill) {\n    const areaFillColorMatch = matchColor(areaFill.value);\n\n    let color = saturateAndDarken(areaFillColorMatch || areaFill.value).css();\n    if (isProjectionType(dataType) || isBudgetType(dataType)) {\n      const matchedHex = saturateAndDarken(matchColor(originalColor)).hex();\n      color = getPatternStringForColor(matchedHex, dataType);\n    }\n\n    const isHighlighting = alpha > 0;\n    area.element.attributes.fill.value = isHighlighting ? color : originalColor;\n  }\n}\n\n/**\n * Brightens a Highchart series.\n * @param  {Array<Object>} seriesList The array of series in our chart\n * @param  {Number}        alpha  The alpha with which to alter the area fill\n * @param  {String}        state  Optional parameter with which the state of the series will be set to\n */\nexport function brightenSeries(seriesList, alpha, state = null, series_id = null) {\n  _.each(seriesList, (s) => {\n    const chartType = s.userOptions.type;\n    s.setState(state);\n\n    if (chartType === 'column') {\n      _.each(s.data, (d) => {\n        const columnColor = d.color;\n        brightenSVGArea(d.graphic, alpha, columnColor, d.dataType);\n      });\n    } else if (chartType === 'pie' || chartType === 'treemap' || chartType === 'bar') {\n      _(s.data)\n      .filter(d => d.series_id === series_id)\n      .each(d => {\n        brightenSVGArea(d.graphic, alpha, d.color, d.dataType);\n      })\n    } else {\n      // NOTE: we get the last data item dataType, because that's the actual data type for the serie's area\n      // regarding to our algorithm, we overlap the area data type with the previous serie.\n      // FIXME: ehh, probably needs to be fixed in report v2.\n      brightenSVGArea(s.area, alpha, s.color, s.data[s.data.length - 1].dataType);\n    }\n  });\n}\n\n/**\n * Sorts a Highchart series legend data.\n * @param  {Array<Object>} seriesData The array of series data in our chart, by default accepts array sorted in ascending order of total/amount\n * @param  {String}        sortBy  Sort order for array data\n */\nexport function sortLegendData(seriesData: any[], sortBy) {\n  if (sortBy == 'desc') {\n    seriesData = seriesData.reverse();\n  }\n\n  if (sortBy == 'alpha') {\n    seriesData = _.sortBy(seriesData, (series) => {\n      return series.name;\n    });\n  }\n\n  if (sortBy == 'alpha_rev') {\n    seriesData = _.sortBy(seriesData, (series) => {\n      return series.name;\n    }).reverse();\n  }\n\n  let show_more = _.remove(seriesData, (series) => {\n    return series.name == 'Show More';\n  });\n\n  seriesData.push(show_more);\n  seriesData = _.flattenDeep(seriesData);\n  return seriesData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/chart_utils.ts","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst MiniLoader: React.SFC<{ isError?: boolean, isLoading?: boolean }> = ({ isError, isLoading }) => {\n  return isError ?\n    (<div className=\"aggregate-viz__status negative\">\n      <div className=\"aggregate-viz__status__icon icon-exclamation-1\" />\n      <strong>Something is wrong</strong> visualization is out of sync\n    </div>)\n    : isLoading ? (<div className=\"aggregate-viz__status\">\n      <div className=\"aggregate-viz__status__spinner\" />\n      <strong>Loading</strong>\n    </div>)\n    : <noscript />/*TODO: update this to be null once we upgrade react*/;\n};\n\nMiniLoader.propTypes = {\n  isError: PropTypes.bool,\n  isLoading: PropTypes.bool\n};\n\nexport default MiniLoader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/mini_loader.tsx","// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Diposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an array using Array.observe.\n   * @param {Array} array An array to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n   */\n  Observable.ofArrayChanges = function(array) {\n    if (!Array.isArray(array)) { throw new TypeError('Array.observe only accepts arrays.'); }\n    if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n      \n      Array.observe(array, observerFn);\n\n      return function () {\n        Array.unobserve(array, observerFn);\n      };\n    });\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an object using Object.observe.\n   * @param {Object} obj An object to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n   */\n  Observable.ofObjectChanges = function(obj) {\n    if (obj == null) { throw new TypeError('object must not be null or undefined.'); }\n    if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') { throw new TypeError('Object.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n\n      Object.observe(obj, observerFn);\n\n      return function () {\n        Object.unobserve(obj, observerFn);\n      };\n    });\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/rx/dist/rx.all.js\n// module id = 537\n// module chunks = 0 1","/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\n\nmodule.exports = UnitBezier;\n\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n    this.cx = 3.0 * p1x;\n    this.bx = 3.0 * (p2x - p1x) - this.cx;\n    this.ax = 1.0 - this.cx - this.bx;\n\n    this.cy = 3.0 * p1y;\n    this.by = 3.0 * (p2y - p1y) - this.cy;\n    this.ay = 1.0 - this.cy - this.by;\n\n    this.p1x = p1x;\n    this.p1y = p2y;\n    this.p2x = p2x;\n    this.p2y = p2y;\n}\n\nUnitBezier.prototype.sampleCurveX = function(t) {\n    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n    return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\n\nUnitBezier.prototype.sampleCurveY = function(t) {\n    return ((this.ay * t + this.by) * t + this.cy) * t;\n};\n\nUnitBezier.prototype.sampleCurveDerivativeX = function(t) {\n    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\n\nUnitBezier.prototype.solveCurveX = function(x, epsilon) {\n    if (typeof epsilon === 'undefined') epsilon = 1e-6;\n\n    var t0, t1, t2, x2, i;\n\n    // First try a few iterations of Newton's method -- normally very fast.\n    for (t2 = x, i = 0; i < 8; i++) {\n\n        x2 = this.sampleCurveX(t2) - x;\n        if (Math.abs(x2) < epsilon) return t2;\n\n        var d2 = this.sampleCurveDerivativeX(t2);\n        if (Math.abs(d2) < 1e-6) break;\n\n        t2 = t2 - x2 / d2;\n    }\n\n    // Fall back to the bisection method for reliability.\n    t0 = 0.0;\n    t1 = 1.0;\n    t2 = x;\n\n    if (t2 < t0) return t0;\n    if (t2 > t1) return t1;\n\n    while (t0 < t1) {\n\n        x2 = this.sampleCurveX(t2);\n        if (Math.abs(x2 - x) < epsilon) return t2;\n\n        if (x > x2) {\n            t0 = t2;\n        } else {\n            t1 = t2;\n        }\n\n        t2 = (t1 - t0) * 0.5 + t0;\n    }\n\n    // Failure.\n    return t2;\n};\n\nUnitBezier.prototype.solve = function(x, epsilon) {\n    return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/unitbezier/index.js\n// module id = 538\n// module chunks = 0 1","'use strict';\n\nif (typeof module !== 'undefined' && module.exports) {\n    module.exports = isSupported;\n} else if (window) {\n    window.mapboxgl = window.mapboxgl || {};\n    window.mapboxgl.supported = isSupported;\n}\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n *   if the performance of Mapbox GL JS would be dramatically worse than\n *   expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n    return !!(\n        isBrowser() &&\n        isArraySupported() &&\n        isFunctionSupported() &&\n        isObjectSupported() &&\n        isJSONSupported() &&\n        isWorkerSupported() &&\n        isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)\n    );\n}\n\nfunction isBrowser() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isArraySupported() {\n    return (\n        Array.prototype &&\n        Array.prototype.every &&\n        Array.prototype.filter &&\n        Array.prototype.forEach &&\n        Array.prototype.indexOf &&\n        Array.prototype.lastIndexOf &&\n        Array.prototype.map &&\n        Array.prototype.some &&\n        Array.prototype.reduce &&\n        Array.prototype.reduceRight &&\n        Array.isArray\n    );\n}\n\nfunction isFunctionSupported() {\n    return Function.prototype && Function.prototype.bind;\n}\n\nfunction isObjectSupported() {\n    return (\n        Object.keys &&\n        Object.create &&\n        Object.getPrototypeOf &&\n        Object.getOwnPropertyNames &&\n        Object.isSealed &&\n        Object.isFrozen &&\n        Object.isExtensible &&\n        Object.getOwnPropertyDescriptor &&\n        Object.defineProperty &&\n        Object.defineProperties &&\n        Object.seal &&\n        Object.freeze &&\n        Object.preventExtensions\n    );\n}\n\nfunction isJSONSupported() {\n    return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n}\n\nfunction isWorkerSupported() {\n    return 'Worker' in window;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n    if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n        isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n    }\n\n    return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n    antialias: false,\n    alpha: true,\n    stencil: true,\n    depth: true\n};\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n\n    var canvas = document.createElement('canvas');\n\n    var attributes = Object.create(isSupported.webGLContextAttributes);\n    attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n    if (canvas.probablySupportsContext) {\n        return (\n            canvas.probablySupportsContext('webgl', attributes) ||\n            canvas.probablySupportsContext('experimental-webgl', attributes)\n        );\n\n    } else if (canvas.supportsContext) {\n        return (\n            canvas.supportsContext('webgl', attributes) ||\n            canvas.supportsContext('experimental-webgl', attributes)\n        );\n\n    } else {\n        return (\n            canvas.getContext('webgl', attributes) ||\n            canvas.getContext('experimental-webgl', attributes)\n        );\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-js-supported/index.js\n// module id = 539\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar StyleLayer = require('./style_layer');\nvar ImageSprite = require('./image_sprite');\nvar GlyphSource = require('../symbol/glyph_source');\nvar SpriteAtlas = require('../symbol/sprite_atlas');\nvar LineAtlas = require('../render/line_atlas');\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar normalizeURL = require('../util/mapbox').normalizeStyleURL;\nvar browser = require('../util/browser');\nvar Dispatcher = require('../util/dispatcher');\nvar AnimationLoop = require('./animation_loop');\nvar validateStyle = require('./validate_style');\nvar Source = require('../source/source');\nvar styleSpec = require('./style_spec');\nvar StyleFunction = require('./style_function');\n\nmodule.exports = Style;\n\nfunction Style(stylesheet, animationLoop, workerCount) {\n    this.animationLoop = animationLoop || new AnimationLoop();\n    this.dispatcher = new Dispatcher(workerCount || 1, this);\n    this.spriteAtlas = new SpriteAtlas(512, 512);\n    this.lineAtlas = new LineAtlas(256, 512);\n\n    this._layers = {};\n    this._order  = [];\n    this._groups = [];\n    this.sources = {};\n    this.zoomHistory = {};\n\n    util.bindAll([\n        '_forwardSourceEvent',\n        '_forwardTileEvent',\n        '_forwardLayerEvent',\n        '_redoPlacement'\n    ], this);\n\n    this._resetUpdates();\n\n    var loaded = function(err, stylesheet) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        if (validateStyle.emitErrors(this, validateStyle(stylesheet))) return;\n\n        this._loaded = true;\n        this.stylesheet = stylesheet;\n\n        this.updateClasses();\n\n        var sources = stylesheet.sources;\n        for (var id in sources) {\n            this.addSource(id, sources[id]);\n        }\n\n        if (stylesheet.sprite) {\n            this.sprite = new ImageSprite(stylesheet.sprite);\n            this.sprite.on('load', this.fire.bind(this, 'change'));\n        }\n\n        this.glyphSource = new GlyphSource(stylesheet.glyphs);\n        this._resolve();\n        this.fire('load');\n    }.bind(this);\n\n    if (typeof stylesheet === 'string') {\n        ajax.getJSON(normalizeURL(stylesheet), loaded);\n    } else {\n        browser.frame(loaded.bind(this, null, stylesheet));\n    }\n\n    this.on('source.load', function(event) {\n        var source = event.source;\n        if (source && source.vectorLayerIds) {\n            for (var layerId in this._layers) {\n                var layer = this._layers[layerId];\n                if (layer.source === source.id) {\n                    this._validateLayer(layer);\n                }\n            }\n        }\n    });\n}\n\nStyle.prototype = util.inherit(Evented, {\n    _loaded: false,\n\n    _validateLayer: function(layer) {\n        var source = this.sources[layer.source];\n\n        if (!layer.sourceLayer) return;\n        if (!source) return;\n        if (!source.vectorLayerIds) return;\n\n        if (source.vectorLayerIds.indexOf(layer.sourceLayer) === -1) {\n            this.fire('error', {\n                error: new Error(\n                    'Source layer \"' + layer.sourceLayer + '\" ' +\n                    'does not exist on source \"' + source.id + '\" ' +\n                    'as specified by style layer \"' + layer.id + '\"'\n                )\n            });\n        }\n    },\n\n    loaded: function() {\n        if (!this._loaded)\n            return false;\n\n        for (var id in this.sources)\n            if (!this.sources[id].loaded())\n                return false;\n\n        if (this.sprite && !this.sprite.loaded())\n            return false;\n\n        return true;\n    },\n\n    _resolve: function() {\n        var layer, layerJSON;\n\n        this._layers = {};\n        this._order  = this.stylesheet.layers.map(function(layer) {\n            return layer.id;\n        });\n\n        // resolve all layers WITHOUT a ref\n        for (var i = 0; i < this.stylesheet.layers.length; i++) {\n            layerJSON = this.stylesheet.layers[i];\n            if (layerJSON.ref) continue;\n            layer = StyleLayer.create(layerJSON);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        // resolve all layers WITH a ref\n        for (var j = 0; j < this.stylesheet.layers.length; j++) {\n            layerJSON = this.stylesheet.layers[j];\n            if (!layerJSON.ref) continue;\n            var refLayer = this.getLayer(layerJSON.ref);\n            layer = StyleLayer.create(layerJSON, refLayer);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        this._groupLayers();\n        this._updateWorkerLayers();\n    },\n\n    _groupLayers: function() {\n        var group;\n\n        this._groups = [];\n\n        // Split into groups of consecutive top-level layers with the same source.\n        for (var i = 0; i < this._order.length; ++i) {\n            var layer = this._layers[this._order[i]];\n\n            if (!group || layer.source !== group.source) {\n                group = [];\n                group.source = layer.source;\n                this._groups.push(group);\n            }\n\n            group.push(layer);\n        }\n    },\n\n    _updateWorkerLayers: function(ids) {\n        this.dispatcher.broadcast(ids ? 'update layers' : 'set layers', this._serializeLayers(ids));\n    },\n\n    _serializeLayers: function(ids) {\n        ids = ids || this._order;\n        var serialized = [];\n        var options = {includeRefProperties: true};\n        for (var i = 0; i < ids.length; i++) {\n            serialized.push(this._layers[ids[i]].serialize(options));\n        }\n        return serialized;\n    },\n\n    _applyClasses: function(classes, options) {\n        if (!this._loaded) return;\n\n        classes = classes || [];\n        options = options || {transition: true};\n        var transition = this.stylesheet.transition || {};\n\n        var layers = this._updates.allPaintProps ? this._layers : this._updates.paintProps;\n\n        for (var id in layers) {\n            var layer = this._layers[id];\n            var props = this._updates.paintProps[id];\n\n            if (this._updates.allPaintProps || props.all) {\n                layer.updatePaintTransitions(classes, options, transition, this.animationLoop);\n            } else {\n                for (var paintName in props) {\n                    this._layers[id].updatePaintTransition(paintName, classes, options, transition, this.animationLoop);\n                }\n            }\n        }\n    },\n\n    _recalculate: function(z) {\n        for (var sourceId in this.sources)\n            this.sources[sourceId].used = false;\n\n        this._updateZoomHistory(z);\n\n        this.rasterFadeDuration = 300;\n        for (var layerId in this._layers) {\n            var layer = this._layers[layerId];\n\n            layer.recalculate(z, this.zoomHistory);\n            if (!layer.isHidden(z) && layer.source) {\n                this.sources[layer.source].used = true;\n            }\n        }\n\n        var maxZoomTransitionDuration = 300;\n        if (Math.floor(this.z) !== Math.floor(z)) {\n            this.animationLoop.set(maxZoomTransitionDuration);\n        }\n\n        this.z = z;\n        this.fire('zoom');\n    },\n\n    _updateZoomHistory: function(z) {\n\n        var zh = this.zoomHistory;\n\n        if (zh.lastIntegerZoom === undefined) {\n            // first time\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = 0;\n            zh.lastZoom = z;\n        }\n\n        // check whether an integer zoom level as passed since the last frame\n        // and if yes, record it with the time. Used for transitioning patterns.\n        if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = Date.now();\n\n        } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z + 1);\n            zh.lastIntegerZoomTime = Date.now();\n        }\n\n        zh.lastZoom = z;\n    },\n\n    _checkLoaded: function () {\n        if (!this._loaded) {\n            throw new Error('Style is not done loading');\n        }\n    },\n\n    /**\n     * Apply queued style updates in a batch\n     * @private\n     */\n    update: function(classes, options) {\n        if (!this._updates.changed) return this;\n\n        if (this._updates.allLayers) {\n            this._groupLayers();\n            this._updateWorkerLayers();\n        } else {\n            var updatedIds = Object.keys(this._updates.layers);\n            if (updatedIds.length) {\n                this._updateWorkerLayers(updatedIds);\n            }\n        }\n\n        var updatedSourceIds = Object.keys(this._updates.sources);\n        var i;\n        for (i = 0; i < updatedSourceIds.length; i++) {\n            this._reloadSource(updatedSourceIds[i]);\n        }\n\n        for (i = 0; i < this._updates.events.length; i++) {\n            var args = this._updates.events[i];\n            this.fire(args[0], args[1]);\n        }\n\n        this._applyClasses(classes, options);\n\n        if (this._updates.changed) {\n            this.fire('change');\n        }\n\n        this._resetUpdates();\n\n        return this;\n    },\n\n    _resetUpdates: function() {\n        this._updates = {\n            events: [],\n            layers: {},\n            sources: {},\n            paintProps: {}\n        };\n    },\n\n    addSource: function(id, source) {\n        this._checkLoaded();\n        if (this.sources[id] !== undefined) {\n            throw new Error('There is already a source with this ID');\n        }\n        if (!Source.is(source) && this._handleErrors(validateStyle.source, 'sources.' + id, source)) return this;\n\n        source = Source.create(source);\n        this.sources[id] = source;\n        source.id = id;\n        source.style = this;\n        source.dispatcher = this.dispatcher;\n        source\n            .on('load', this._forwardSourceEvent)\n            .on('error', this._forwardSourceEvent)\n            .on('change', this._forwardSourceEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.load', this._forwardTileEvent)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.add', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Remove a source from this stylesheet, given its id.\n     * @param {string} id id of the source to remove\n     * @returns {Style} this style\n     * @throws {Error} if no source is found with the given ID\n     * @private\n     */\n    removeSource: function(id) {\n        this._checkLoaded();\n\n        if (this.sources[id] === undefined) {\n            throw new Error('There is no source with this ID');\n        }\n        var source = this.sources[id];\n        delete this.sources[id];\n        source\n            .off('load', this._forwardSourceEvent)\n            .off('error', this._forwardSourceEvent)\n            .off('change', this._forwardSourceEvent)\n            .off('tile.add', this._forwardTileEvent)\n            .off('tile.load', this._forwardTileEvent)\n            .off('tile.error', this._forwardTileEvent)\n            .off('tile.remove', this._forwardTileEvent)\n            .off('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.remove', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Get a source by id.\n     * @param {string} id id of the desired source\n     * @returns {Object} source\n     * @private\n     */\n    getSource: function(id) {\n        return this.sources[id];\n    },\n\n    /**\n     * Add a layer to the map style. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Style} `this`\n     * @private\n     */\n    addLayer: function(layer, before) {\n        this._checkLoaded();\n\n        if (!(layer instanceof StyleLayer)) {\n            // this layer is not in the style.layers array, so we pass an impossible array index\n            if (this._handleErrors(validateStyle.layer,\n                    'layers.' + layer.id, layer, false, {arrayIndex: -1})) return this;\n\n            var refLayer = layer.ref && this.getLayer(layer.ref);\n            layer = StyleLayer.create(layer, refLayer);\n        }\n        this._validateLayer(layer);\n\n        layer.on('error', this._forwardLayerEvent);\n\n        this._layers[layer.id] = layer;\n        this._order.splice(before ? this._order.indexOf(before) : Infinity, 0, layer.id);\n\n        this._updates.allLayers = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.events.push(['layer.add', {layer: layer}]);\n\n        return this.updateClasses(layer.id);\n    },\n\n    /**\n     * Remove a layer from this stylesheet, given its id.\n     * @param {string} id id of the layer to remove\n     * @returns {Style} this style\n     * @throws {Error} if no layer is found with the given ID\n     * @private\n     */\n    removeLayer: function(id) {\n        this._checkLoaded();\n\n        var layer = this._layers[id];\n        if (layer === undefined) {\n            throw new Error('There is no layer with this ID');\n        }\n        for (var i in this._layers) {\n            if (this._layers[i].ref === id) {\n                this.removeLayer(i);\n            }\n        }\n\n        layer.off('error', this._forwardLayerEvent);\n\n        delete this._layers[id];\n        this._order.splice(this._order.indexOf(id), 1);\n\n        this._updates.allLayers = true;\n        this._updates.events.push(['layer.remove', {layer: layer}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id - id of the desired layer\n     * @returns {?Object} a layer, if one with the given `id` exists\n     * @private\n     */\n    getLayer: function(id) {\n        return this._layers[id];\n    },\n\n    /**\n     * If a layer has a `ref` property that makes it derive some values\n     * from another layer, return that referent layer. Otherwise,\n     * returns the layer itself.\n     * @param {string} id the layer's id\n     * @returns {Layer} the referent layer or the layer itself\n     * @private\n     */\n    getReferentLayer: function(id) {\n        var layer = this.getLayer(id);\n        if (layer.ref) {\n            layer = this.getLayer(layer.ref);\n        }\n        return layer;\n    },\n\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return this;\n\n        if (minzoom != null) {\n            layer.minzoom = minzoom;\n        }\n        if (maxzoom != null) {\n            layer.maxzoom = maxzoom;\n        }\n        return this._updateLayer(layer);\n    },\n\n    setFilter: function(layerId, filter) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (this._handleErrors(validateStyle.filter, 'layers.' + layer.id + '.filter', filter)) return this;\n\n        if (util.deepEqual(layer.filter, filter)) return this;\n        layer.filter = util.clone(filter);\n\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layer's filter object\n     * @param {string} layer the layer to inspect\n     * @returns {*} the layer's filter, if any\n     * @private\n     */\n    getFilter: function(layer) {\n        return this.getReferentLayer(layer).filter;\n    },\n\n    setLayoutProperty: function(layerId, name, value) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (util.deepEqual(layer.getLayoutProperty(name), value)) return this;\n\n        layer.setLayoutProperty(name, value);\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layout property's value from a given layer\n     * @param {string} layer the layer to inspect\n     * @param {string} name the name of the layout property\n     * @returns {*} the property value\n     * @private\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.getReferentLayer(layer).getLayoutProperty(name);\n    },\n\n    setPaintProperty: function(layerId, name, value, klass) {\n        this._checkLoaded();\n\n        var layer = this.getLayer(layerId);\n\n        if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return this;\n\n        var wasFeatureConstant = layer.isPaintValueFeatureConstant(name);\n        layer.setPaintProperty(name, value, klass);\n\n        var isFeatureConstant = !(\n            value &&\n            StyleFunction.isFunctionDefinition(value) &&\n            value.property !== '$zoom' &&\n            value.property !== undefined\n        );\n\n        if (!isFeatureConstant || !wasFeatureConstant) {\n            this._updates.layers[layerId] = true;\n            if (layer.source) {\n                this._updates.sources[layer.source] = true;\n            }\n        }\n\n        return this.updateClasses(layerId, name);\n    },\n\n    getPaintProperty: function(layer, name, klass) {\n        return this.getLayer(layer).getPaintProperty(name, klass);\n    },\n\n    updateClasses: function (layerId, paintName) {\n        this._updates.changed = true;\n        if (!layerId) {\n            this._updates.allPaintProps = true;\n        } else {\n            var props = this._updates.paintProps;\n            if (!props[layerId]) props[layerId] = {};\n            props[layerId][paintName || 'all'] = true;\n        }\n        return this;\n    },\n\n    serialize: function() {\n        return util.filterObject({\n            version: this.stylesheet.version,\n            name: this.stylesheet.name,\n            metadata: this.stylesheet.metadata,\n            center: this.stylesheet.center,\n            zoom: this.stylesheet.zoom,\n            bearing: this.stylesheet.bearing,\n            pitch: this.stylesheet.pitch,\n            sprite: this.stylesheet.sprite,\n            glyphs: this.stylesheet.glyphs,\n            transition: this.stylesheet.transition,\n            sources: util.mapObject(this.sources, function(source) {\n                return source.serialize();\n            }),\n            layers: this._order.map(function(id) {\n                return this._layers[id].serialize();\n            }, this)\n        }, function(value) { return value !== undefined; });\n    },\n\n    _updateLayer: function (layer) {\n        this._updates.layers[layer.id] = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.changed = true;\n        return this;\n    },\n\n    _flattenRenderedFeatures: function(sourceResults) {\n        var features = [];\n        for (var l = this._order.length - 1; l >= 0; l--) {\n            var layerID = this._order[l];\n            for (var s = 0; s < sourceResults.length; s++) {\n                var layerFeatures = sourceResults[s][layerID];\n                if (layerFeatures) {\n                    for (var f = 0; f < layerFeatures.length; f++) {\n                        features.push(layerFeatures[f]);\n                    }\n                }\n            }\n        }\n        return features;\n    },\n\n    queryRenderedFeatures: function(queryGeometry, params, zoom, bearing) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true);\n        }\n\n        var sourceResults = [];\n        for (var id in this.sources) {\n            var source = this.sources[id];\n            if (source.queryRenderedFeatures) {\n                sourceResults.push(source.queryRenderedFeatures(queryGeometry, params, zoom, bearing));\n            }\n        }\n        return this._flattenRenderedFeatures(sourceResults);\n    },\n\n    querySourceFeatures: function(sourceID, params) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'querySourceFeatures.filter', params.filter, true);\n        }\n        var source = this.getSource(sourceID);\n        return source && source.querySourceFeatures ? source.querySourceFeatures(params) : [];\n    },\n\n    _handleErrors: function(validate, key, value, throws, props) {\n        var action = throws ? validateStyle.throwErrors : validateStyle.emitErrors;\n        var result = validate.call(validateStyle, util.extend({\n            key: key,\n            style: this.serialize(),\n            value: value,\n            styleSpec: styleSpec\n        }, props));\n        return action.call(validateStyle, this, result);\n    },\n\n    _remove: function() {\n        this.dispatcher.remove();\n    },\n\n    _reloadSource: function(id) {\n        this.sources[id].reload();\n    },\n\n    _updateSources: function(transform) {\n        for (var id in this.sources) {\n            this.sources[id].update(transform);\n        }\n    },\n\n    _redoPlacement: function() {\n        for (var id in this.sources) {\n            if (this.sources[id].redoPlacement) this.sources[id].redoPlacement();\n        }\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire('source.' + e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire('layer.' + e.type, util.extend({layer: {id: e.target.id}}, e));\n    },\n\n    // Callbacks from web workers\n\n    'get sprite json': function(params, callback) {\n        var sprite = this.sprite;\n        if (sprite.loaded()) {\n            callback(null, { sprite: sprite.data, retina: sprite.retina });\n        } else {\n            sprite.on('load', function() {\n                callback(null, { sprite: sprite.data, retina: sprite.retina });\n            });\n        }\n    },\n\n    'get icons': function(params, callback) {\n        var sprite = this.sprite;\n        var spriteAtlas = this.spriteAtlas;\n        if (sprite.loaded()) {\n            spriteAtlas.setSprite(sprite);\n            spriteAtlas.addIcons(params.icons, callback);\n        } else {\n            sprite.on('load', function() {\n                spriteAtlas.setSprite(sprite);\n                spriteAtlas.addIcons(params.icons, callback);\n            });\n        }\n    },\n\n    'get glyphs': function(params, callback) {\n        var stacks = params.stacks,\n            remaining = Object.keys(stacks).length,\n            allGlyphs = {};\n\n        for (var fontName in stacks) {\n            this.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done);\n        }\n\n        function done(err, glyphs, fontName) {\n            if (err) console.error(err);\n\n            allGlyphs[fontName] = glyphs;\n            remaining--;\n\n            if (remaining === 0)\n                callback(null, allGlyphs);\n        }\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style.js\n// module id = 540\n// module chunks = 0 1","'use strict';\n\nfunction createFunction(parameters, defaultType) {\n    var fun;\n\n    if (!isFunctionDefinition(parameters)) {\n        fun = function() { return parameters; };\n        fun.isFeatureConstant = true;\n        fun.isZoomConstant = true;\n\n    } else {\n        var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\n        var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n        var zoomDependent = zoomAndFeatureDependent || !featureDependent;\n        var type = parameters.type || defaultType || 'exponential';\n\n        var innerFun;\n        if (type === 'exponential') {\n            innerFun = evaluateExponentialFunction;\n        } else if (type === 'interval') {\n            innerFun = evaluateIntervalFunction;\n        } else if (type === 'categorical') {\n            innerFun = evaluateCategoricalFunction;\n        } else if (type === 'identity') {\n            innerFun = evaluateIdentityFunction;\n        } else {\n            throw new Error('Unknown function type \"' + type + '\"');\n        }\n\n        if (zoomAndFeatureDependent) {\n            var featureFunctions = {};\n            var featureFunctionStops = [];\n            for (var s = 0; s < parameters.stops.length; s++) {\n                var stop = parameters.stops[s];\n                if (featureFunctions[stop[0].zoom] === undefined) {\n                    featureFunctions[stop[0].zoom] = {\n                        zoom: stop[0].zoom,\n                        type: parameters.type,\n                        property: parameters.property,\n                        stops: []\n                    };\n                }\n                featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]);\n            }\n\n            for (var z in featureFunctions) {\n                featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z])]);\n            }\n            fun = function(zoom, feature) {\n                return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, zoom)(zoom, feature);\n            };\n            fun.isFeatureConstant = false;\n            fun.isZoomConstant = false;\n\n        } else if (zoomDependent) {\n            fun = function(zoom) {\n                return innerFun(parameters, zoom);\n            };\n            fun.isFeatureConstant = true;\n            fun.isZoomConstant = false;\n        } else {\n            fun = function(zoom, feature) {\n                return innerFun(parameters, feature[parameters.property]);\n            };\n            fun.isFeatureConstant = false;\n            fun.isZoomConstant = true;\n        }\n    }\n\n    return fun;\n}\n\nfunction evaluateCategoricalFunction(parameters, input) {\n    for (var i = 0; i < parameters.stops.length; i++) {\n        if (input === parameters.stops[i][0]) {\n            return parameters.stops[i][1];\n        }\n    }\n    return parameters.stops[0][1];\n}\n\nfunction evaluateIntervalFunction(parameters, input) {\n    for (var i = 0; i < parameters.stops.length; i++) {\n        if (input < parameters.stops[i][0]) break;\n    }\n    return parameters.stops[Math.max(i - 1, 0)][1];\n}\n\nfunction evaluateExponentialFunction(parameters, input) {\n    var base = parameters.base !== undefined ? parameters.base : 1;\n\n    var i = 0;\n    while (true) {\n        if (i >= parameters.stops.length) break;\n        else if (input <= parameters.stops[i][0]) break;\n        else i++;\n    }\n\n    if (i === 0) {\n        return parameters.stops[i][1];\n\n    } else if (i === parameters.stops.length) {\n        return parameters.stops[i - 1][1];\n\n    } else {\n        return interpolate(\n            input,\n            base,\n            parameters.stops[i - 1][0],\n            parameters.stops[i][0],\n            parameters.stops[i - 1][1],\n            parameters.stops[i][1]\n        );\n    }\n}\n\nfunction evaluateIdentityFunction(parameters, input) {\n    return input;\n}\n\n\nfunction interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    if (typeof outputLower === 'function') {\n        return function() {\n            var evaluatedLower = outputLower.apply(undefined, arguments);\n            var evaluatedUpper = outputUpper.apply(undefined, arguments);\n            return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper);\n        };\n    } else if (outputLower.length) {\n        return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper);\n    } else {\n        return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper);\n    }\n}\n\nfunction interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    var difference =  inputUpper - inputLower;\n    var progress = input - inputLower;\n\n    var ratio;\n    if (base === 1) {\n        ratio = progress / difference;\n    } else {\n        ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n    }\n\n    return (outputLower * (1 - ratio)) + (outputUpper * ratio);\n}\n\nfunction interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n    var output = [];\n    for (var i = 0; i < outputLower.length; i++) {\n        output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]);\n    }\n    return output;\n}\n\nfunction isFunctionDefinition(value) {\n    return typeof value === 'object' && (value.stops || value.type === 'identity');\n}\n\n\nmodule.exports.isFunctionDefinition = isFunctionDefinition;\n\nmodule.exports.interpolated = function(parameters) {\n    return createFunction(parameters, 'exponential');\n};\n\nmodule.exports['piecewise-constant'] = function(parameters) {\n    return createFunction(parameters, 'interval');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-function/index.js\n// module id = 541\n// module chunks = 0 1","'use strict';\n\nvar parseColorString = require('csscolorparser').parseCSSColor;\nvar util = require('../util/util');\nvar StyleFunction = require('./style_function');\n\nvar cache = {};\n\nmodule.exports = function parseColor(input) {\n\n    if (StyleFunction.isFunctionDefinition(input)) {\n\n        return util.extend({}, input, {\n            stops: input.stops.map(function(stop) {\n                return [stop[0], parseColor(stop[1])];\n            })\n        });\n\n    } else if (typeof input === 'string') {\n\n        if (!cache[input]) {\n            var rgba = parseColorString(input);\n            if (!rgba) { throw new Error('Invalid color ' + input); }\n\n            // GL expects all components to be in the range [0, 1] and to be\n            // multipled by the alpha value.\n            cache[input] = [\n                rgba[0] / 255 * rgba[3],\n                rgba[1] / 255 * rgba[3],\n                rgba[2] / 255 * rgba[3],\n                rgba[3]\n            ];\n        }\n\n        return cache[input];\n\n    } else {\n        throw new Error('Invalid color ' + input);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/parse_color.js\n// module id = 542\n// module chunks = 0 1","'use strict';\n\nmodule.exports = require('mapbox-gl-style-spec/reference/latest');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_spec.js\n// module id = 543\n// module chunks = 0 1","'use strict';\n\nmodule.exports = require('mapbox-gl-style-spec/lib/validate_style.min');\n\nmodule.exports.emitErrors = function throwErrors(emitter, errors) {\n    if (errors && errors.length) {\n        for (var i = 0; i < errors.length; i++) {\n            emitter.fire('error', { error: new Error(errors[i].message) });\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\nmodule.exports.throwErrors = function throwErrors(emitter, errors) {\n    if (errors) {\n        for (var i = 0; i < errors.length; i++) {\n            throw new Error(errors[i].message);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/validate_style.js\n// module id = 544\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\n\nmodule.exports = function validateConstants(options) {\n    var key = options.key;\n    var constants = options.value;\n    var styleSpec = options.styleSpec;\n\n    if (styleSpec.$version > 7) {\n        if (constants) {\n            return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n        } else {\n            return [];\n        }\n    } else {\n        var type = getType(constants);\n        if (type !== 'object') {\n            return [new ValidationError(key, constants, 'object expected, %s found', type)];\n        }\n\n        var errors = [];\n        for (var constantName in constants) {\n            if (constantName[0] !== '@') {\n                errors.push(new ValidationError(key + '.' + constantName, constants[constantName], 'constants must start with \"@\"'));\n            }\n        }\n        return errors;\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_constants.js\n// module id = 545\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function (output) {\n    for (var i = 1; i < arguments.length; i++) {\n        var input = arguments[i];\n        for (var k in input) {\n            output[k] = input[k];\n        }\n    }\n    return output;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/util/extend.js\n// module id = 546\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\nvar validateObject = require('./validate_object');\nvar validateArray = require('./validate_array');\nvar validateNumber = require('./validate_number');\nvar unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateFunction(options) {\n    var functionValueSpec = options.valueSpec;\n    var functionType = unbundle(options.value.type);\n    var stopKeyType;\n    var stopDomainValues = {};\n    var previousStopDomainValue;\n    var previousStopDomainZoom;\n\n    var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n    var isPropertyFunction = !isZoomFunction;\n    var isZoomAndPropertyFunction =\n        getType(options.value.stops) === 'array' &&\n        getType(options.value.stops[0]) === 'array' &&\n        getType(options.value.stops[0][0]) === 'object';\n\n    var errors = validateObject({\n        key: options.key,\n        value: options.value,\n        valueSpec: options.styleSpec.function,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: { stops: validateFunctionStops }\n    });\n\n    if (functionType !== 'identity' && !options.value.stops) {\n        errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n    }\n\n    if (functionType === 'exponential' && options.valueSpec['function'] === 'piecewise-constant') {\n        errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n    }\n\n    if (options.styleSpec.$version >= 8) {\n       if (isPropertyFunction && !options.valueSpec['property-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n       } else if (isZoomFunction && !options.valueSpec['zoom-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n       }\n    }\n\n    if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n        errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n    }\n\n    return errors;\n\n    function validateFunctionStops(options) {\n        if (functionType === 'identity') {\n            return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n        }\n\n        var errors = [];\n        var value = options.value;\n\n        errors = errors.concat(validateArray({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec,\n            arrayElementValidator: validateFunctionStop\n        }));\n\n        if (getType(value) === 'array' && value.length === 0) {\n            errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n        }\n\n        return errors;\n    }\n\n    function validateFunctionStop(options) {\n        var errors = [];\n        var value = options.value;\n        var key = options.key;\n\n        if (getType(value) !== 'array') {\n            return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n        }\n\n        if (value.length !== 2) {\n            return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)];\n        }\n\n        if (isZoomAndPropertyFunction) {\n            if (getType(value[0]) !== 'object') {\n                return [new ValidationError(key, value, 'object expected, %s found', getType(value[0]))];\n            }\n            if (value[0].zoom === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have zoom')];\n            }\n            if (value[0].value === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have value')];\n            }\n            if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {\n                return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n            }\n            if (unbundle(value[0].zoom) !== previousStopDomainZoom) {\n                previousStopDomainZoom = unbundle(value[0].zoom);\n                previousStopDomainValue = undefined;\n            }\n            errors = errors.concat(validateObject({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: { zoom: {} },\n                style: options.style,\n                styleSpec: options.styleSpec,\n                objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue }\n            }));\n        } else {\n            errors = errors.concat(validateStopDomainValue({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: {},\n                style: options.style,\n                styleSpec: options.styleSpec\n            }));\n        }\n\n        errors = errors.concat(validate({\n            key: key + '[1]',\n            value: value[1],\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        }));\n\n        if (getType(value[0]) === 'number') {\n            if (functionValueSpec.function === 'piecewise-constant' && value[0] % 1 !== 0) {\n                errors.push(new ValidationError(key + '[0]', value[0], 'zoom level for piecewise-constant functions must be an integer'));\n            }\n        }\n\n        return errors;\n    }\n\n    function validateStopDomainValue(options) {\n        var type = getType(options.value);\n        var value = unbundle(options.value);\n\n        if (!stopKeyType) {\n            stopKeyType = type;\n            if (!functionType && type === 'string') {\n                functionType = 'categorical';\n            }\n        } else if (type !== stopKeyType) {\n            return [new ValidationError(options.key, options.value, '%s stop domain type must match previous stop domain type %s', type, stopKeyType)];\n        }\n\n        if (type !== 'number' && type !== 'string') {\n            return [new ValidationError(options.key, options.value, 'property value must be a number or string')];\n        }\n\n        if (type !== 'number' && functionType !== 'categorical') {\n            return [new ValidationError(options.key, options.value, 'number expected, %s found', type)];\n        }\n\n        if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {\n            return [new ValidationError(options.key, options.value, 'integer expected, found %s', value)];\n        }\n\n        if (type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n            return [new ValidationError(options.key, options.value, 'stop domain values must appear in ascending order')];\n        } else {\n            previousStopDomainValue = value;\n        }\n\n        if (functionType === 'categorical' && value in stopDomainValues) {\n            return [new ValidationError(options.key, options.value, 'stop domain values must be unique')];\n        } else {\n            stopDomainValues[value] = true;\n        }\n\n        return [];\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_function.js\n// module id = 547\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateArray(options) {\n    var array = options.value;\n    var arraySpec = options.valueSpec;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var key = options.key;\n    var validateArrayElement = options.arrayElementValidator || validate;\n\n    if (getType(array) !== 'array') {\n        return [new ValidationError(key, array, 'array expected, %s found', getType(array))];\n    }\n\n    if (arraySpec.length && array.length !== arraySpec.length) {\n        return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)];\n    }\n\n    if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n        return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)];\n    }\n\n    var arrayElementSpec = {\n        \"type\": arraySpec.value\n    };\n\n    if (styleSpec.$version < 7) {\n        arrayElementSpec.function = arraySpec.function;\n    }\n\n    if (getType(arraySpec.value) === 'object') {\n        arrayElementSpec = arraySpec.value;\n    }\n\n    var errors = [];\n    for (var i = 0; i < array.length; i++) {\n        errors = errors.concat(validateArrayElement({\n            array: array,\n            arrayIndex: i,\n            value: array[i],\n            valueSpec: arrayElementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            key: key + '[' + i + ']'\n        }));\n    }\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_array.js\n// module id = 548\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateNumber(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var type = getType(value);\n\n    if (type !== 'number') {\n        return [new ValidationError(key, value, 'number expected, %s found', type)];\n    }\n\n    if ('minimum' in valueSpec && value < valueSpec.minimum) {\n        return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)];\n    }\n\n    if ('maximum' in valueSpec && value > valueSpec.maximum) {\n        return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_number.js\n// module id = 549\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\nvar validateObject = require('./validate_object');\nvar validateFilter = require('./validate_filter');\nvar validatePaintProperty = require('./validate_paint_property');\nvar validateLayoutProperty = require('./validate_layout_property');\nvar extend = require('../util/extend');\n\nmodule.exports = function validateLayer(options) {\n    var errors = [];\n\n    var layer = options.value;\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n\n    if (!layer.type && !layer.ref) {\n        errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n    }\n    var type = unbundle(layer.type);\n    var ref = unbundle(layer.ref);\n\n    if (layer.id) {\n        for (var i = 0; i < options.arrayIndex; i++) {\n            var otherLayer = style.layers[i];\n            if (unbundle(otherLayer.id) === unbundle(layer.id)) {\n                errors.push(new ValidationError(key, layer.id, 'duplicate layer id \"%s\", previously used at line %d', layer.id, otherLayer.id.__line__));\n            }\n        }\n    }\n\n    if ('ref' in layer) {\n        ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n            if (p in layer) {\n                errors.push(new ValidationError(key, layer[p], '\"%s\" is prohibited for ref layers', p));\n            }\n        });\n\n        var parent;\n\n        style.layers.forEach(function(layer) {\n            if (layer.id == ref) parent = layer;\n        });\n\n        if (!parent) {\n            errors.push(new ValidationError(key, layer.ref, 'ref layer \"%s\" not found', ref));\n        } else if (parent.ref) {\n            errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n        } else {\n            type = unbundle(parent.type);\n        }\n    } else if (type !== 'background') {\n        if (!layer.source) {\n            errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n        } else {\n            var source = style.sources && style.sources[layer.source];\n            if (!source) {\n                errors.push(new ValidationError(key, layer.source, 'source \"%s\" not found', layer.source));\n            } else if (source.type == 'vector' && type == 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a raster source', layer.id));\n            } else if (source.type == 'raster' && type != 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a vector source', layer.id));\n            } else if (source.type == 'vector' && !layer['source-layer']) {\n                errors.push(new ValidationError(key, layer, 'layer \"%s\" must specify a \"source-layer\"', layer.id));\n            }\n        }\n    }\n\n    errors = errors.concat(validateObject({\n        key: key,\n        value: layer,\n        valueSpec: styleSpec.layer,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            '*': function() {\n                return [];\n            },\n            filter: validateFilter,\n            layout: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validateLayoutProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            },\n            paint: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validatePaintProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            }\n        }\n    }));\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_layer.js\n// module id = 550\n// module chunks = 0 1","'use strict';\n\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validatePaintProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['paint_' + options.layerType];\n\n    if (!layerSpec) return [];\n\n    var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n\n    if (transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n        return validate({\n            key: key,\n            value: value,\n            valueSpec: styleSpec.transition,\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else if (options.valueSpec || layerSpec[propertyKey]) {\n        return validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_paint_property.js\n// module id = 551\n// module chunks = 0 1","'use strict';\n\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateLayoutProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['layout_' + options.layerType];\n\n    if (!layerSpec) return [];\n\n    if (options.valueSpec || layerSpec[propertyKey]) {\n        var errors = [];\n\n        if (options.layerType === 'symbol') {\n            if (propertyKey === 'icon-image' && style && !style.sprite) {\n                errors.push(new ValidationError(key, value, 'use of \"icon-image\" requires a style \"sprite\" property'));\n            } else if (propertyKey === 'text-field' && style && !style.glyphs) {\n                errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n            }\n        }\n\n        return errors.concat(validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        }));\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_layout_property.js\n// module id = 552\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\nvar validateObject = require('./validate_object');\nvar validateEnum = require('./validate_enum');\n\nmodule.exports = function validateSource(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (!value.type) {\n        return [new ValidationError(key, value, '\"type\" is required')];\n    }\n\n    var type = unbundle(value.type);\n    switch (type) {\n        case 'vector':\n        case 'raster':\n            var errors = [];\n            errors = errors.concat(validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_tile,\n                style: options.style,\n                styleSpec: styleSpec\n            }));\n            if ('url' in value) {\n                for (var prop in value) {\n                    if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n                        errors.push(new ValidationError(key + '.' + prop, value[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop));\n                    }\n                }\n            }\n            return errors;\n\n        case 'geojson':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_geojson,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'video':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_video,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'image':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_image,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        default:\n            return validateEnum({\n                key: key + '.type',\n                value: value.type,\n                valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image']},\n                style: style,\n                styleSpec: styleSpec\n            });\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_source.js\n// module id = 553\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\n\nmodule.exports = function validateLight(options) {\n    var light = options.value;\n    var styleSpec = options.styleSpec;\n    var lightSpec = styleSpec.light;\n    var style = options.style;\n\n    var errors = [];\n\n    var rootType = getType(light);\n    if (light === undefined) {\n        return errors;\n    } else if (rootType !== 'object') {\n        errors = errors.concat([new ValidationError('light', light, 'object expected, %s found', rootType)]);\n        return errors;\n    }\n\n    for (var key in light) {\n        var transitionMatch = key.match(/^(.*)-transition$/);\n\n        if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n            errors = errors.concat(validate({\n                key: key,\n                value: light[key],\n                valueSpec: styleSpec.transition,\n                style: style,\n                styleSpec: styleSpec\n            }));\n        } else if (lightSpec[key]) {\n            errors = errors.concat(validate({\n                key: key,\n                value: light[key],\n                valueSpec: lightSpec[key],\n                style: style,\n                styleSpec: styleSpec\n            }));\n        } else {\n            errors = errors.concat([new ValidationError(key, light[key], 'unknown property \"%s\"', key)]);\n        }\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_light.js\n// module id = 554\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateString(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'string expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_string.js\n// module id = 555\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n    API_URL: 'https://api.mapbox.com',\n    REQUIRE_ACCESS_TOKEN: true\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/config.js\n// module id = 556\n// module chunks = 0 1","// See the explanation for this file's existence in `webpack.config.js` in the root of the project\nmodule.exports = function(worker) {\n  __webpack_require__.p = gon.asset_path + '/javascripts/';\n  return worker();\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/execute_worker.js","// http://stackoverflow.com/questions/10343913/how-to-create-a-web-worker-from-a-string\r\n\r\nvar URL = window.URL || window.webkitURL;\r\nmodule.exports = function(content, url) {\r\n\ttry {\r\n\t\ttry {\r\n\t\t\tvar blob;\r\n\t\t\ttry { // BlobBuilder = Deprecated, but widely implemented\r\n\t\t\t\tvar BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\r\n\t\t\t\tblob = new BlobBuilder();\r\n\t\t\t\tblob.append(content);\r\n\t\t\t\tblob = blob.getBlob();\r\n\t\t\t} catch(e) { // The proposed API\r\n\t\t\t\tblob = new Blob([content]);\r\n\t\t\t}\r\n\t\t\treturn new Worker(URL.createObjectURL(blob));\r\n\t\t} catch(e) {\r\n\t\t\treturn new Worker('data:application/javascript,' + encodeURIComponent(content));\r\n\t\t}\r\n\t} catch(e) {\r\n\t\treturn new Worker(url);\r\n\t}\r\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/worker-loader/createInlineWorker.js\n// module id = 558\n// module chunks = 0 1","'use strict';\n\nmodule.exports = AnimationLoop;\n\nfunction AnimationLoop() {\n    this.n = 0;\n    this.times = [];\n}\n\n// Are all animations done?\nAnimationLoop.prototype.stopped = function() {\n    this.times = this.times.filter(function(t) {\n        return t.time >= (new Date()).getTime();\n    });\n    return !this.times.length;\n};\n\n// Add a new animation that will run t milliseconds\n// Returns an id that can be used to cancel it layer\nAnimationLoop.prototype.set = function(t) {\n    this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n    return this.n++;\n};\n\n// Cancel an animation\nAnimationLoop.prototype.cancel = function(n) {\n    this.times = this.times.filter(function(t) {\n        return t.id !== n;\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/animation_loop.js\n// module id = 559\n// module chunks = 0 1","'use strict';\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n    var p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n\n        // filter collinear points around the cuts\n        filterPoints(outerNode, outerNode.next);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/earcut/src/earcut.js\n// module id = 560\n// module chunks = 0 1","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.quickselect = factory());\n}(this, (function () { 'use strict';\n\nfunction quickselect(arr, k, left, right, compare) {\n    quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n    while (right > left) {\n        if (right - left > 600) {\n            var n = right - left + 1;\n            var m = k - left + 1;\n            var z = Math.log(n);\n            var s = 0.5 * Math.exp(2 * z / 3);\n            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            quickselectStep(arr, k, newLeft, newRight, compare);\n        }\n\n        var t = arr[k];\n        var i = left;\n        var j = right;\n\n        swap(arr, left, k);\n        if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n        while (i < j) {\n            swap(arr, i, j);\n            i++;\n            j--;\n            while (compare(arr[i], t) < 0) i++;\n            while (compare(arr[j], t) > 0) j--;\n        }\n\n        if (compare(arr[left], t) === 0) swap(arr, left, j);\n        else {\n            j++;\n            swap(arr, j, right);\n        }\n\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n}\n\nfunction swap(arr, i, j) {\n    var tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nreturn quickselect;\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/quickselect/quickselect.js\n// module id = 561\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = Anchor;\n\nfunction Anchor(x, y, angle, segment) {\n    this.x = x;\n    this.y = y;\n    this.angle = angle;\n\n    if (segment !== undefined) {\n        this.segment = segment;\n    }\n}\n\nAnchor.prototype = Object.create(Point.prototype);\n\nAnchor.prototype.clone = function() {\n    return new Anchor(this.x, this.y, this.angle, this.segment);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/anchor.js\n// module id = 562\n// module chunks = 0 1","'use strict';\n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties, text) {\n    return text.replace(/{([^{}]+)}/g, function(match, key) {\n        return key in properties ? properties[key] : '';\n    });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/token.js\n// module id = 563\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = {\n    getIconQuads: getIconQuads,\n    getGlyphQuads: getGlyphQuads,\n    SymbolQuad: SymbolQuad\n};\n\nvar minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} angle The angle of the label at it's center, not the angle of this quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, angle, minScale, maxScale) {\n    this.anchorPoint = anchorPoint;\n    this.tl = tl;\n    this.tr = tr;\n    this.bl = bl;\n    this.br = br;\n    this.tex = tex;\n    this.angle = angle;\n    this.minScale = minScale;\n    this.maxScale = maxScale;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layout, alongLine) {\n\n    var rect = shapedIcon.image.rect;\n\n    var border = 1;\n    var left = shapedIcon.left - border;\n    var right = left + rect.w / shapedIcon.image.pixelRatio;\n    var top = shapedIcon.top - border;\n    var bottom = top + rect.h / shapedIcon.image.pixelRatio;\n    var tl = new Point(left, top);\n    var tr = new Point(right, top);\n    var br = new Point(right, bottom);\n    var bl = new Point(left, bottom);\n\n    var angle = layout['icon-rotate'] * Math.PI / 180;\n    if (alongLine) {\n        var prev = line[anchor.segment];\n        if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) {\n            var next = line[anchor.segment + 1];\n            angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI;\n        } else {\n            angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n        }\n    }\n\n    if (angle) {\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle),\n            matrix = [cos, -sin, sin, cos];\n\n        tl = tl.matMult(matrix);\n        tr = tr.matMult(matrix);\n        bl = bl.matMult(matrix);\n        br = br.matMult(matrix);\n    }\n\n    return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layout, alongLine) {\n\n    var textRotate = layout['text-rotate'] * Math.PI / 180;\n    var keepUpright = layout['text-keep-upright'];\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n    var quads = [];\n\n    for (var k = 0; k < positionedGlyphs.length; k++) {\n        var positionedGlyph = positionedGlyphs[k];\n        var glyph = positionedGlyph.glyph;\n        var rect = glyph.rect;\n\n        if (!rect) continue;\n\n        var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n        var glyphInstances;\n        var labelMinScale = minScale;\n        if (alongLine) {\n            glyphInstances = [];\n            labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n            if (keepUpright) {\n                labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n            }\n\n        } else {\n            glyphInstances = [{\n                anchorPoint: new Point(anchor.x, anchor.y),\n                offset: 0,\n                angle: 0,\n                maxScale: Infinity,\n                minScale: minScale\n            }];\n        }\n\n        var x1 = positionedGlyph.x + glyph.left,\n            y1 = positionedGlyph.y - glyph.top,\n            x2 = x1 + rect.w,\n            y2 = y1 + rect.h,\n\n            otl = new Point(x1, y1),\n            otr = new Point(x2, y1),\n            obl = new Point(x1, y2),\n            obr = new Point(x2, y2);\n\n        for (var i = 0; i < glyphInstances.length; i++) {\n\n            var instance = glyphInstances[i],\n                tl = otl,\n                tr = otr,\n                bl = obl,\n                br = obr,\n                angle = instance.angle + textRotate;\n\n            if (angle) {\n                var sin = Math.sin(angle),\n                    cos = Math.cos(angle),\n                    matrix = [cos, -sin, sin, cos];\n\n                tl = tl.matMult(matrix);\n                tr = tr.matMult(matrix);\n                bl = bl.matMult(matrix);\n                br = br.matMult(matrix);\n            }\n\n            // Prevent label from extending past the end of the line\n            var glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n            var glyphAngle = (anchor.angle + textRotate + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, glyphAngle, glyphMinScale, instance.maxScale));\n\n        }\n    }\n\n    return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array<Object>} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array<Point>} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array<Object>} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n    var upsideDown = !forward;\n\n    if (offset < 0) forward = !forward;\n\n    if (forward) segment++;\n\n    var newAnchorPoint = new Point(anchor.x, anchor.y);\n    var end = line[segment];\n    var prevScale = Infinity;\n\n    offset = Math.abs(offset);\n\n    var placementScale = minScale;\n\n    while (true) {\n        var distance = newAnchorPoint.dist(end);\n        var scale = offset / distance;\n\n        // Get the angle of the line segment\n        var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n        if (!forward) angle += Math.PI;\n        if (upsideDown) angle += Math.PI;\n\n        glyphs.push({\n            anchorPoint: newAnchorPoint,\n            offset: upsideDown ? Math.PI : 0,\n            minScale: scale,\n            maxScale: prevScale,\n            angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n        });\n\n        if (scale <= placementScale) break;\n\n        newAnchorPoint = end;\n\n        // skip duplicate nodes\n        while (newAnchorPoint.equals(end)) {\n            segment += forward ? 1 : -1;\n            end = line[segment];\n            if (!end) {\n                return scale;\n            }\n        }\n\n        var unit = end.sub(newAnchorPoint)._unit();\n        newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n        prevScale = scale;\n    }\n\n    return placementScale;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/quads.js\n// module id = 564\n// module chunks = 0 1","'use strict';\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n    var cells = this.cells = [];\n\n    if (extent instanceof ArrayBuffer) {\n        this.arrayBuffer = extent;\n        var array = new Int32Array(this.arrayBuffer);\n        extent = array[0];\n        n = array[1];\n        padding = array[2];\n\n        this.d = n + 2 * padding;\n        for (var k = 0; k < this.d * this.d; k++) {\n            var start = array[NUM_PARAMS + k];\n            var end = array[NUM_PARAMS + k + 1];\n            cells.push(start === end ?\n                    null :\n                    array.subarray(start, end));\n        }\n        var keysOffset = array[NUM_PARAMS + cells.length];\n        var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n        this.keys = array.subarray(keysOffset, bboxesOffset);\n        this.bboxes = array.subarray(bboxesOffset);\n\n        this.insert = this._insertReadonly;\n\n    } else {\n        this.d = n + 2 * padding;\n        for (var i = 0; i < this.d * this.d; i++) {\n            cells.push([]);\n        }\n        this.keys = [];\n        this.bboxes = [];\n    }\n\n    this.n = n;\n    this.extent = extent;\n    this.padding = padding;\n    this.scale = n / extent;\n    this.uid = 0;\n\n    var p = (padding / n) * extent;\n    this.min = -p;\n    this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n    this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n    this.keys.push(key);\n    this.bboxes.push(x1);\n    this.bboxes.push(y1);\n    this.bboxes.push(x2);\n    this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n    throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n    this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2) {\n    var min = this.min;\n    var max = this.max;\n    if (x1 <= min && y1 <= min && max <= x2 && max <= y2) {\n        return this.keys.slice();\n\n    } else {\n        var result = [];\n        var seenUids = {};\n        this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids);\n        return result;\n    }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids) {\n    var cell = this.cells[cellIndex];\n    if (cell !== null) {\n        var keys = this.keys;\n        var bboxes = this.bboxes;\n        for (var u = 0; u < cell.length; u++) {\n            var uid = cell[u];\n            if (seenUids[uid] === undefined) {\n                var offset = uid * 4;\n                if ((x1 <= bboxes[offset + 2]) &&\n                    (y1 <= bboxes[offset + 3]) &&\n                    (x2 >= bboxes[offset + 0]) &&\n                    (y2 >= bboxes[offset + 1])) {\n                    seenUids[uid] = true;\n                    result.push(keys[uid]);\n                } else {\n                    seenUids[uid] = false;\n                }\n            }\n        }\n    }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2) {\n    var cx1 = this._convertToCellCoord(x1);\n    var cy1 = this._convertToCellCoord(y1);\n    var cx2 = this._convertToCellCoord(x2);\n    var cy2 = this._convertToCellCoord(y2);\n    for (var x = cx1; x <= cx2; x++) {\n        for (var y = cy1; y <= cy2; y++) {\n            var cellIndex = this.d * y + x;\n            if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2)) return;\n        }\n    }\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n    return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n    if (this.arrayBuffer) return this.arrayBuffer;\n\n    var cells = this.cells;\n\n    var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n    var totalCellLength = 0;\n    for (var i = 0; i < this.cells.length; i++) {\n        totalCellLength += this.cells[i].length;\n    }\n\n    var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n    array[0] = this.extent;\n    array[1] = this.n;\n    array[2] = this.padding;\n\n    var offset = metadataLength;\n    for (var k = 0; k < cells.length; k++) {\n        var cell = cells[k];\n        array[NUM_PARAMS + k] = offset;\n        array.set(cell, offset);\n        offset += cell.length;\n    }\n\n    array[NUM_PARAMS + cells.length] = offset;\n    array.set(this.keys, offset);\n    offset += this.keys.length;\n\n    array[NUM_PARAMS + cells.length + 1] = offset;\n    array.set(this.bboxes, offset);\n    offset += this.bboxes.length;\n\n    return array.buffer;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/grid-index/grid-index.js\n// module id = 565\n// module chunks = 0 1","'use strict';\n\nvar VectorTileFeature = require('./vectortilefeature.js');\n\nmodule.exports = VectorTileLayer;\n\nfunction VectorTileLayer(pbf, end) {\n    // Public\n    this.version = 1;\n    this.name = null;\n    this.extent = 4096;\n    this.length = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._keys = [];\n    this._values = [];\n    this._features = [];\n\n    pbf.readFields(readLayer, this, end);\n\n    this.length = this._features.length;\n}\n\nfunction readLayer(tag, layer, pbf) {\n    if (tag === 15) layer.version = pbf.readVarint();\n    else if (tag === 1) layer.name = pbf.readString();\n    else if (tag === 5) layer.extent = pbf.readVarint();\n    else if (tag === 2) layer._features.push(pbf.pos);\n    else if (tag === 3) layer._keys.push(pbf.readString());\n    else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\nfunction readValueMessage(pbf) {\n    var value = null,\n        end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var tag = pbf.readVarint() >> 3;\n\n        value = tag === 1 ? pbf.readString() :\n            tag === 2 ? pbf.readFloat() :\n            tag === 3 ? pbf.readDouble() :\n            tag === 4 ? pbf.readVarint64() :\n            tag === 5 ? pbf.readVarint() :\n            tag === 6 ? pbf.readSVarint() :\n            tag === 7 ? pbf.readBoolean() : null;\n    }\n\n    return value;\n}\n\n// return feature `i` from this layer as a `VectorTileFeature`\nVectorTileLayer.prototype.feature = function(i) {\n    if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n    this._pbf.pos = this._features[i];\n\n    var end = this._pbf.readVarint() + this._pbf.pos;\n    return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vector-tile/lib/vectortilelayer.js\n// module id = 566\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = VectorTileFeature;\n\nfunction VectorTileFeature(pbf, end, extent, keys, values) {\n    // Public\n    this.properties = {};\n    this.extent = extent;\n    this.type = 0;\n\n    // Private\n    this._pbf = pbf;\n    this._geometry = -1;\n    this._keys = keys;\n    this._values = values;\n\n    pbf.readFields(readFeature, this, end);\n}\n\nfunction readFeature(tag, feature, pbf) {\n    if (tag == 1) feature.id = pbf.readVarint();\n    else if (tag == 2) readTag(pbf, feature);\n    else if (tag == 3) feature.type = pbf.readVarint();\n    else if (tag == 4) feature._geometry = pbf.pos;\n}\n\nfunction readTag(pbf, feature) {\n    var end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        var key = feature._keys[pbf.readVarint()],\n            value = feature._values[pbf.readVarint()];\n        feature.properties[key] = value;\n    }\n}\n\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nVectorTileFeature.prototype.loadGeometry = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        lines = [],\n        line;\n\n    while (pbf.pos < end) {\n        if (!length) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n\n            if (cmd === 1) { // moveTo\n                if (line) lines.push(line);\n                line = [];\n            }\n\n            line.push(new Point(x, y));\n\n        } else if (cmd === 7) {\n\n            // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n            if (line) {\n                line.push(line[0].clone()); // closePolygon\n            }\n\n        } else {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    if (line) lines.push(line);\n\n    return lines;\n};\n\nVectorTileFeature.prototype.bbox = function() {\n    var pbf = this._pbf;\n    pbf.pos = this._geometry;\n\n    var end = pbf.readVarint() + pbf.pos,\n        cmd = 1,\n        length = 0,\n        x = 0,\n        y = 0,\n        x1 = Infinity,\n        x2 = -Infinity,\n        y1 = Infinity,\n        y2 = -Infinity;\n\n    while (pbf.pos < end) {\n        if (!length) {\n            var cmdLen = pbf.readVarint();\n            cmd = cmdLen & 0x7;\n            length = cmdLen >> 3;\n        }\n\n        length--;\n\n        if (cmd === 1 || cmd === 2) {\n            x += pbf.readSVarint();\n            y += pbf.readSVarint();\n            if (x < x1) x1 = x;\n            if (x > x2) x2 = x;\n            if (y < y1) y1 = y;\n            if (y > y2) y2 = y;\n\n        } else if (cmd !== 7) {\n            throw new Error('unknown command ' + cmd);\n        }\n    }\n\n    return [x1, y1, x2, y2];\n};\n\nVectorTileFeature.prototype.toGeoJSON = function(x, y, z) {\n    var size = this.extent * Math.pow(2, z),\n        x0 = this.extent * x,\n        y0 = this.extent * y,\n        coords = this.loadGeometry(),\n        type = VectorTileFeature.types[this.type],\n        i, j;\n\n    function project(line) {\n        for (var j = 0; j < line.length; j++) {\n            var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;\n            line[j] = [\n                (p.x + x0) * 360 / size - 180,\n                360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90\n            ];\n        }\n    }\n\n    switch (this.type) {\n    case 1:\n        var points = [];\n        for (i = 0; i < coords.length; i++) {\n            points[i] = coords[i][0];\n        }\n        coords = points;\n        project(coords);\n        break;\n\n    case 2:\n        for (i = 0; i < coords.length; i++) {\n            project(coords[i]);\n        }\n        break;\n\n    case 3:\n        coords = classifyRings(coords);\n        for (i = 0; i < coords.length; i++) {\n            for (j = 0; j < coords[i].length; j++) {\n                project(coords[i][j]);\n            }\n        }\n        break;\n    }\n\n    if (coords.length === 1) {\n        coords = coords[0];\n    } else {\n        type = 'Multi' + type;\n    }\n\n    var result = {\n        type: \"Feature\",\n        geometry: {\n            type: type,\n            coordinates: coords\n        },\n        properties: this.properties\n    };\n\n    if ('id' in this) {\n        result.id = this.id;\n    }\n\n    return result;\n};\n\n// classifies an array of rings into polygons with outer rings and holes\n\nfunction classifyRings(rings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = signedArea(rings[i]);\n        if (area === 0) continue;\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    return polygons;\n}\n\nfunction signedArea(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vector-tile/lib/vectortilefeature.js\n// module id = 567\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Feature;\n\nfunction Feature(vectorTileFeature, z, x, y) {\n    this._vectorTileFeature = vectorTileFeature;\n    vectorTileFeature._z = z;\n    vectorTileFeature._x = x;\n    vectorTileFeature._y = y;\n\n    this.properties = vectorTileFeature.properties;\n\n    if (vectorTileFeature._id) {\n        this.id = vectorTileFeature._id;\n    }\n}\n\nFeature.prototype = {\n    type: \"Feature\",\n\n    get geometry() {\n        if (this._geometry === undefined) {\n            this._geometry = this._vectorTileFeature.toGeoJSON(\n                this._vectorTileFeature._x,\n                this._vectorTileFeature._y,\n                this._vectorTileFeature._z).geometry;\n        }\n        return this._geometry;\n    },\n\n    set geometry(g) {\n        this._geometry = g;\n    },\n\n    toJSON: function() {\n        var json = {};\n        for (var i in this) {\n            if (i === '_geometry' || i === '_vectorTileFeature' || i === 'toJSON') continue;\n            json[i] = this[i];\n        }\n        return json;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/vectortile_to_geojson.js\n// module id = 568\n// module chunks = 0 1","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (factory((global.WhooTS = global.WhooTS || {})));\n}(this, function (exports) {\n\n/**\n * getURL\n *\n * @param    {String}  baseUrl  Base url of the WMS server\n * @param    {String}  layer    Layer name\n * @param    {Number}  x        Tile coordinate x\n * @param    {Number}  y        Tile coordinate y\n * @param    {Number}  z        Tile zoom\n * @param    {Object}  [options]\n * @param    {String}  [options.format='image/png']\n * @param    {String}  [options.service='WMS']\n * @param    {String}  [options.version='1.1.1']\n * @param    {String}  [options.request='GetMap']\n * @param    {String}  [options.srs='EPSG:3857']\n * @param    {Number}  [options.width='256']\n * @param    {Number}  [options.height='256']\n * @returns  {String}  url\n * @example\n * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';\n * var layer = 'Natural2015';\n * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);\n */\nfunction getURL(baseUrl, layer, x, y, z, options) {\n    options = options || {};\n\n    var url = baseUrl + '?' + [\n        'bbox='    + getTileBBox(x, y, z),\n        'format='  + (options.format || 'image/png'),\n        'service=' + (options.service || 'WMS'),\n        'version=' + (options.version || '1.1.1'),\n        'request=' + (options.request || 'GetMap'),\n        'srs='     + (options.srs || 'EPSG:3857'),\n        'width='   + (options.width || 256),\n        'height='  + (options.height || 256),\n        'layers='  + layer\n    ].join('&');\n\n    return url;\n}\n\n\n/**\n * getTileBBox\n *\n * @param    {Number}  x  Tile coordinate x\n * @param    {Number}  y  Tile coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {String}  String of the bounding box\n */\nfunction getTileBBox(x, y, z) {\n    // for Google/OSM tile scheme we need to alter the y\n    y = (Math.pow(2, z) - y - 1);\n\n    var min = getMercCoords(x * 256, y * 256, z),\n        max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);\n\n    return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];\n}\n\n\n/**\n * getMercCoords\n *\n * @param    {Number}  x  Pixel coordinate x\n * @param    {Number}  y  Pixel coordinate y\n * @param    {Number}  z  Tile zoom\n * @returns  {Array}   [x, y]\n */\nfunction getMercCoords(x, y, z) {\n    var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),\n        merc_x = (x * resolution - 2 * Math.PI  * 6378137 / 2.0),\n        merc_y = (y * resolution - 2 * Math.PI  * 6378137 / 2.0);\n\n    return [merc_x, merc_y];\n}\n\nexports.getURL = getURL;\nexports.getTileBBox = getTileBBox;\nexports.getMercCoords = getMercCoords;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/whoots-js/index.umd.js\n// module id = 569\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar Source = require('./source');\nvar normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nmodule.exports = VectorTileSource;\n\nfunction VectorTileSource(options) {\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    this._options = util.extend({ type: 'vector' }, options);\n\n    if (this.tileSize !== 512) {\n        throw new Error('vector tile sources must have a tileSize of 512');\n    }\n\n    Source._loadTileJSON.call(this, options);\n}\n\nVectorTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    scheme: 'xyz',\n    tileSize: 512,\n    reparseOverscaled: true,\n    _loaded: false,\n    isTileClipped: true,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._pyramid && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._pyramid) {\n            this._pyramid.update(this.used, transform);\n        }\n    },\n\n    reload: function() {\n        if (this._pyramid) {\n            this._pyramid.reload();\n        }\n    },\n\n    serialize: function() {\n        return util.extend({}, this._options);\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    queryRenderedFeatures: Source._queryRenderedVectorFeatures,\n    querySourceFeatures: Source._querySourceFeatures,\n\n    _loadTile: function(tile) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url),\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            tileSize: this.tileSize * overscaling,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        if (tile.workerID) {\n            params.rawTileData = tile.rawTileData;\n            this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID);\n        } else {\n            tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile));\n        }\n    },\n\n    _tileLoaded: function(tile, err, data) {\n        if (tile.aborted)\n            return;\n\n        if (err) {\n            tile.errored = true;\n            this.fire('tile.error', {tile: tile, error: err});\n            return;\n        }\n\n        tile.loadVectorData(data, this.map.style);\n\n        if (tile.redoWhenDone) {\n            tile.redoWhenDone = false;\n            tile.redoPlacement(this);\n        }\n\n        this.fire('tile.load', {tile: tile});\n        this.fire('tile.stats', data.bucketStats);\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n        this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    redoPlacement: Source.redoPlacement,\n\n    _redoTilePlacement: function(tile) {\n        tile.redoPlacement(this);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/vector_tile_source.js\n// module id = 570\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar Evented = require('../util/evented');\nvar Source = require('./source');\nvar normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nmodule.exports = RasterTileSource;\n\nfunction RasterTileSource(options) {\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n\n    Source._loadTileJSON.call(this, options);\n}\n\nRasterTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    roundZoom: true,\n    scheme: 'xyz',\n    tileSize: 512,\n    _loaded: false,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    loaded: function() {\n        return this._pyramid && this._pyramid.loaded();\n    },\n\n    update: function(transform) {\n        if (this._pyramid) {\n            this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration);\n        }\n    },\n\n    reload: function() {\n        // noop\n    },\n\n    serialize: function() {\n        return {\n            type: 'raster',\n            url: this.url,\n            tileSize: this.tileSize\n        };\n    },\n\n    getVisibleCoordinates: Source._getVisibleCoordinates,\n    getTile: Source._getTile,\n\n    _loadTile: function(tile) {\n        var url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize);\n\n        tile.request = ajax.getImage(url, done.bind(this));\n\n        function done(err, img) {\n            delete tile.request;\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                tile.errored = true;\n                this.fire('tile.error', {tile: tile, error: err});\n                return;\n            }\n\n            var gl = this.map.painter.gl;\n            tile.texture = this.map.painter.getTexture(img.width);\n            if (tile.texture) {\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n            } else {\n                tile.texture = gl.createTexture();\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n                tile.texture.size = img.width;\n            }\n            gl.generateMipmap(gl.TEXTURE_2D);\n\n            tile.timeAdded = new Date().getTime();\n            this.map.animationLoop.set(this.style.rasterFadeDuration);\n\n            tile.source = this;\n            tile.loaded = true;\n\n            this.fire('tile.load', {tile: tile});\n        }\n    },\n\n    _abortTile: function(tile) {\n        tile.aborted = true;\n\n        if (tile.request) {\n            tile.request.abort();\n            delete tile.request;\n        }\n    },\n\n    _addTile: function(tile) {\n        this.fire('tile.add', {tile: tile});\n    },\n\n    _removeTile: function(tile) {\n        this.fire('tile.remove', {tile: tile});\n    },\n\n    _unloadTile: function(tile) {\n        if (tile.texture) this.map.painter.saveTexture(tile.texture);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/raster_tile_source.js\n// module id = 571\n// module chunks = 0 1","// Copyright 2014 Simon Lydell\r\n// X11 (“MIT”) Licensed. (See LICENSE.)\r\n\r\nvoid (function(root, factory) {\r\n  if (typeof define === \"function\" && define.amd) {\r\n    define(factory)\r\n  } else if (typeof exports === \"object\") {\r\n    module.exports = factory()\r\n  } else {\r\n    root.resolveUrl = factory()\r\n  }\r\n}(this, function() {\r\n\r\n  function resolveUrl(/* ...urls */) {\r\n    var numUrls = arguments.length\r\n\r\n    if (numUrls === 0) {\r\n      throw new Error(\"resolveUrl requires at least one argument; got none.\")\r\n    }\r\n\r\n    var base = document.createElement(\"base\")\r\n    base.href = arguments[0]\r\n\r\n    if (numUrls === 1) {\r\n      return base.href\r\n    }\r\n\r\n    var head = document.getElementsByTagName(\"head\")[0]\r\n    head.insertBefore(base, head.firstChild)\r\n\r\n    var a = document.createElement(\"a\")\r\n    var resolved\r\n\r\n    for (var index = 1; index < numUrls; index++) {\r\n      a.href = arguments[index]\r\n      resolved = a.href\r\n      base.href = resolved\r\n    }\r\n\r\n    head.removeChild(base)\r\n\r\n    return resolved\r\n  }\r\n\r\n  return resolveUrl\r\n\r\n}));\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/resolve-url/resolve-url.js\n// module id = 572\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\nvar mat3 = {};\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\nmat3.fromMat4 = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\nmat3.fromValues = function(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\nmat3.set = function(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b01 = a22 * a11 - a12 * a21,\n        b11 = -a22 * a10 + a12 * a20,\n        b21 = a21 * a10 - a11 * a20,\n\n        // Calculate the determinant\n        det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    out[0] = (a11 * a22 - a12 * a21);\n    out[1] = (a02 * a21 - a01 * a22);\n    out[2] = (a01 * a12 - a02 * a11);\n    out[3] = (a12 * a20 - a10 * a22);\n    out[4] = (a00 * a22 - a02 * a20);\n    out[5] = (a02 * a10 - a00 * a12);\n    out[6] = (a10 * a21 - a11 * a20);\n    out[7] = (a01 * a20 - a00 * a21);\n    out[8] = (a00 * a11 - a01 * a10);\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b00 = b[0], b01 = b[1], b02 = b[2],\n        b10 = b[3], b11 = b[4], b12 = b[5],\n        b20 = b[6], b21 = b[7], b22 = b[8];\n\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n        x = v[0], y = v[1];\n\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n    var x = v[0], y = v[1];\n\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\nmat3.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\nmat3.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n\n    return out;\n};\n\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\nmat3.normalFromMat4 = function (out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n    return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n                    a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat3.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)))\n};\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n};\n\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\nmat3.sub = mat3.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nmat3.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n};\n\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\nmat3.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    return out;\n};\n\n/*\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && \n           a[3] === b[3] && a[4] === b[4] && a[5] === b[5] &&\n           a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = a[6], b7 = b[7], b8 = b[8];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)));\n};\n\n\nmodule.exports = mat3;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/mat3.js\n// module id = 573\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to ceil\n * @returns {vec3} out\n */\nvec3.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to floor\n * @returns {vec3} out\n */\nvec3.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to round\n * @returns {vec3} out\n */\nvec3.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n};\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nvec3.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nvec3.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    var len = x*x + y*y + z*z;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n        out[2] = a[2] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2],\n        bx = b[0], by = b[1], bz = b[2];\n\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n};\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.hermite = function (out, a, b, c, d, t) {\n  var factorTimes2 = t * t,\n      factor1 = factorTimes2 * (2 * t - 3) + 1,\n      factor2 = factorTimes2 * (t - 2) + t,\n      factor3 = factorTimes2 * (t - 1),\n      factor4 = factorTimes2 * (3 - 2 * t);\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.bezier = function (out, a, b, c, d, t) {\n  var inverseFactor = 1 - t,\n      inverseFactorTimesTwo = inverseFactor * inverseFactor,\n      factorTimes2 = t * t,\n      factor1 = inverseFactorTimesTwo * inverseFactor,\n      factor2 = 3 * t * inverseFactorTimesTwo,\n      factor3 = 3 * factorTimes2 * inverseFactor,\n      factor4 = factorTimes2 * t;\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\nvec3.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    var z = (glMatrix.RANDOM() * 2.0) - 1.0;\n    var zScale = Math.sqrt(1.0-z*z) * scale;\n\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2],\n        w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat3 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n    // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations\n\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    return out;\n};\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateX = function(out, a, b, c){\n   var p = [], r=[];\n\t  //Translate point to the origin\n\t  p[0] = a[0] - b[0];\n\t  p[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n\n\t  //perform rotation\n\t  r[0] = p[0];\n\t  r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c);\n\t  r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c);\n\n\t  //translate to correct position\n\t  out[0] = r[0] + b[0];\n\t  out[1] = r[1] + b[1];\n\t  out[2] = r[2] + b[2];\n\n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateY = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c);\n  \tr[1] = p[1];\n  \tr[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c);\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateZ = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c);\n  \tr[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c);\n  \tr[2] = p[2];\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n    var vec = vec3.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 3;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nvec3.angle = function(a, b) {\n   \n    var tempA = vec3.fromValues(a[0], a[1], a[2]);\n    var tempB = vec3.fromValues(b[0], b[1], b[2]);\n \n    vec3.normalize(tempA, tempA);\n    vec3.normalize(tempB, tempB);\n \n    var cosine = vec3.dot(tempA, tempB);\n\n    if(cosine > 1.0){\n        return 0;\n    } else {\n        return Math.acos(cosine);\n    }     \n};\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n    return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)));\n};\n\nmodule.exports = vec3;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/vec3.js\n// module id = 574\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to ceil\n * @returns {vec4} out\n */\nvec4.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to floor\n * @returns {vec4} out\n */\nvec4.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to round\n * @returns {vec4} out\n */\nvec4.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    out[3] = Math.round(a[3]);\n    return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nvec4.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\nvec4.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    var len = x*x + y*y + z*z + w*w;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        out[0] = x * len;\n        out[1] = y * len;\n        out[2] = z * len;\n        out[3] = w * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\nvec4.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    //TODO: This is a pretty awful way of doing this. Find something better.\n    out[0] = glMatrix.RANDOM();\n    out[1] = glMatrix.RANDOM();\n    out[2] = glMatrix.RANDOM();\n    out[3] = glMatrix.RANDOM();\n    vec4.normalize(out, out);\n    vec4.scale(out, out, scale);\n    return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n    var vec = vec4.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 4;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n    return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\nmodule.exports = vec4;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/vec4.js\n// module id = 575\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = function(uniforms) {\n    var pragmas = { define: {}, initialize: {} };\n\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        assert(uniform.name.slice(0, 2) === 'u_');\n\n        var type = '{precision} ' + (uniform.components === 1 ? 'float' : 'vec' + uniform.components);\n        pragmas.define[uniform.name.slice(2)] = 'uniform ' + type + ' ' + uniform.name + ';\\n';\n        pragmas.initialize[uniform.name.slice(2)] = type + ' ' + uniform.name.slice(2) + ' = ' + uniform.name + ';\\n';\n    }\n\n    return pragmas;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/create_uniform_pragmas.js\n// module id = 576\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Attribution;\n\n/**\n * Creates an attribution control\n * @class Attribution\n * @param {Object} [options]\n * @param {string} [options.position='bottom-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * var map = new mapboxgl.Map({attributionControl: false})\n *     .addControl(new mapboxgl.Attribution({position: 'top-left'}));\n */\nfunction Attribution(options) {\n    util.setOptions(this, options);\n}\n\nAttribution.createAttributionString = function(sources) {\n    var attributions = [];\n\n    for (var id in sources) {\n        var source = sources[id];\n        if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n            attributions.push(source.attribution);\n        }\n    }\n\n    // remove any entries that are substrings of another entry.\n    // first sort by length so that substrings come first\n    attributions.sort(function (a, b) { return a.length - b.length; });\n    attributions = attributions.filter(function (attrib, i) {\n        for (var j = i + 1; j < attributions.length; j++) {\n            if (attributions[j].indexOf(attrib) >= 0) { return false; }\n        }\n        return true;\n    });\n\n    return attributions.join(' | ');\n};\n\nAttribution.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-attrib',\n            container = this._container = DOM.create('div', className, map.getContainer());\n\n        this._update();\n        map.on('source.load', this._update.bind(this));\n        map.on('source.change', this._update.bind(this));\n        map.on('source.remove', this._update.bind(this));\n        map.on('moveend', this._updateEditLink.bind(this));\n\n        return container;\n    },\n\n    _update: function() {\n        if (this._map.style) {\n            this._container.innerHTML = Attribution.createAttributionString(this._map.style.sources);\n        }\n\n        this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0];\n        this._updateEditLink();\n    },\n\n    _updateEditLink: function() {\n        if (this._editLink) {\n            var center = this._map.getCenter();\n            this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' +\n                    center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1);\n        }\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/attribution.js\n// module id = 577\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _bowser = require('bowser');\n\nvar _bowser2 = _interopRequireDefault(_bowser);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PREFIX = _bowser2.default.webkit ? '-webkit-' : _bowser2.default.gecko ? '-moz-' : ''; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nexports.default = {\n  DEFAULTS: {},\n  MAPBOX_API_ACCESS_TOKEN: null,\n  CURSOR: {\n    GRABBING: PREFIX + 'grabbing',\n    GRAB: PREFIX + 'grab'\n  }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWcuanMiXSwibmFtZXMiOlsiUFJFRklYIiwiYnJvd3NlciIsIndlYmtpdCIsImdlY2tvIiwiREVGQVVMVFMiLCJNQVBCT1hfQVBJX0FDQ0VTU19UT0tFTiIsIkNVUlNPUiIsIkdSQUJCSU5HIiwiR1JBQiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBb0JBOzs7Ozs7QUFFQSxJQUFNQSxTQUNKQyxpQkFBUUMsTUFBUixHQUFpQixVQUFqQixHQUNBRCxpQkFBUUUsS0FBUixHQUFnQixPQUFoQixHQUNBLEVBSEYsQyxDQXRCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a0JBU2U7QUFDYkMsWUFBVSxFQURHO0FBRWJDLDJCQUF5QixJQUZaO0FBR2JDLFVBQVE7QUFDTkMsY0FBYVAsTUFBYixhQURNO0FBRU5RLFVBQVNSLE1BQVQ7QUFGTTtBQUhLLEMiLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnYm93c2VyJztcblxuY29uc3QgUFJFRklYID1cbiAgYnJvd3Nlci53ZWJraXQgPyAnLXdlYmtpdC0nIDpcbiAgYnJvd3Nlci5nZWNrbyA/ICctbW96LScgOlxuICAnJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBERUZBVUxUUzoge30sXG4gIE1BUEJPWF9BUElfQUNDRVNTX1RPS0VOOiBudWxsLFxuICBDVVJTT1I6IHtcbiAgICBHUkFCQklORzogYCR7UFJFRklYfWdyYWJiaW5nYCxcbiAgICBHUkFCOiBgJHtQUkVGSVh9Z3JhYmBcbiAgfVxufTtcbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/config.js\n// module id = 578\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = noop;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction noop() {}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub29wLmpzIl0sIm5hbWVzIjpbIm5vb3AiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQW9Cd0JBLEk7QUFwQnhCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlLFNBQVNBLElBQVQsR0FBZ0IsQ0FDOUIiLCJmaWxlIjoibm9vcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vb3AoKSB7XG59XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/noop.js\n// module id = 579\n// module chunks = 0 1","'use strict';\n\nfunction HeatmapShader(gl, _arg) {\n  var fragment, vertex;\n  this.gl = gl;\n  vertex = _arg.vertex, fragment = _arg.fragment;\n  this.program = this.gl.createProgram();\n  this.vs = this.gl.createShader(this.gl.VERTEX_SHADER);\n  this.fs = this.gl.createShader(this.gl.FRAGMENT_SHADER);\n  this.gl.attachShader(this.program, this.vs);\n  this.gl.attachShader(this.program, this.fs);\n  this.compileShader(this.vs, vertex);\n  this.compileShader(this.fs, fragment);\n  this.link();\n  this.value_cache = {};\n  this.uniform_cache = {};\n  this.attribCache = {};\n}\n\nHeatmapShader.prototype.attribLocation = function(name) {\n  var location;\n  location = this.attribCache[name];\n  if (location === void 0) {\n    location = this.attribCache[name] = this.gl.getAttribLocation(this.program, name);\n  }\n  return location;\n};\n\nHeatmapShader.prototype.compileShader = function(shader, source) {\n  this.gl.shaderSource(shader, source);\n  this.gl.compileShader(shader);\n  if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n    throw \"Shader Compile Error: \" + (this.gl.getShaderInfoLog(shader));\n  }\n};\n\nHeatmapShader.prototype.link = function() {\n  this.gl.linkProgram(this.program);\n  if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) {\n    throw \"Shader Link Error: \" + (this.gl.getProgramInfoLog(this.program));\n  }\n};\n\nHeatmapShader.prototype.use = function() {\n  this.gl.useProgram(this.program);\n  return this;\n};\n\nHeatmapShader.prototype.uniformLoc = function(name) {\n  var location;\n  location = this.uniform_cache[name];\n  if (location === void 0) {\n    location = this.uniform_cache[name] = this.gl.getUniformLocation(this.program, name);\n  }\n  return location;\n};\n\nHeatmapShader.prototype.int = function(name, value) {\n  var cached, loc;\n  cached = this.value_cache[name];\n  if (cached !== value) {\n    this.value_cache[name] = value;\n    loc = this.uniformLoc(name);\n    if (loc) {\n      this.gl.uniform1i(loc, value);\n    }\n  }\n  return this;\n};\n\nHeatmapShader.prototype.vec2 = function(name, a, b) {\n  var loc;\n  loc = this.uniformLoc(name);\n  if (loc) {\n    this.gl.uniform2f(loc, a, b);\n  }\n  return this;\n};\n\nHeatmapShader.prototype.float = function(name, value) {\n  var cached, loc;\n  cached = this.value_cache[name];\n  if (cached !== value) {\n    this.value_cache[name] = value;\n    loc = this.uniformLoc(name);\n    if (loc) {\n      this.gl.uniform1f(loc, value);\n    }\n  }\n  return this;\n};\n\nmodule.exports = HeatmapShader;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/heatmap-shader.js\n// module id = 580\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _DragDropContext = require('./DragDropContext');\n\nObject.defineProperty(exports, 'DragDropContext', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropContext).default;\n  }\n});\n\nvar _DragDropContextProvider = require('./DragDropContextProvider');\n\nObject.defineProperty(exports, 'DragDropContextProvider', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropContextProvider).default;\n  }\n});\n\nvar _DragLayer = require('./DragLayer');\n\nObject.defineProperty(exports, 'DragLayer', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragLayer).default;\n  }\n});\n\nvar _DragSource = require('./DragSource');\n\nObject.defineProperty(exports, 'DragSource', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragSource).default;\n  }\n});\n\nvar _DropTarget = require('./DropTarget');\n\nObject.defineProperty(exports, 'DropTarget', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DropTarget).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/index.js\n// module id = 581\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.unpackBackendForEs5Users = exports.createChildContext = exports.CHILD_CONTEXT_TYPES = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = DragDropContext;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _dndCore = require('dnd-core');\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _hoistNonReactStatics = require('hoist-non-react-statics');\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _checkDecoratorArguments = require('./utils/checkDecoratorArguments');\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CHILD_CONTEXT_TYPES = exports.CHILD_CONTEXT_TYPES = {\n\tdragDropManager: _propTypes2.default.object.isRequired\n};\n\nvar createChildContext = exports.createChildContext = function createChildContext(backend, context) {\n\treturn {\n\t\tdragDropManager: new _dndCore.DragDropManager(backend, context)\n\t};\n};\n\nvar unpackBackendForEs5Users = exports.unpackBackendForEs5Users = function unpackBackendForEs5Users(backendOrModule) {\n\t// Auto-detect ES6 default export for people still using ES5\n\tvar backend = backendOrModule;\n\tif ((typeof backend === 'undefined' ? 'undefined' : _typeof(backend)) === 'object' && typeof backend.default === 'function') {\n\t\tbackend = backend.default;\n\t}\n\t(0, _invariant2.default)(typeof backend === 'function', 'Expected the backend to be a function or an ES6 module exporting a default function. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html');\n\treturn backend;\n};\n\nfunction DragDropContext(backendOrModule) {\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragDropContext', 'backend'].concat(Array.prototype.slice.call(arguments))); // eslint-disable-line prefer-rest-params\n\n\tvar backend = unpackBackendForEs5Users(backendOrModule);\n\tvar childContext = createChildContext(backend);\n\n\treturn function decorateContext(DecoratedComponent) {\n\t\tvar _class, _temp;\n\n\t\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\t\tvar DragDropContextContainer = (_temp = _class = function (_Component) {\n\t\t\t_inherits(DragDropContextContainer, _Component);\n\n\t\t\tfunction DragDropContextContainer() {\n\t\t\t\t_classCallCheck(this, DragDropContextContainer);\n\n\t\t\t\treturn _possibleConstructorReturn(this, (DragDropContextContainer.__proto__ || Object.getPrototypeOf(DragDropContextContainer)).apply(this, arguments));\n\t\t\t}\n\n\t\t\t_createClass(DragDropContextContainer, [{\n\t\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\t\t(0, _invariant2.default)(this.child, 'In order to access an instance of the decorated component it can not be a stateless component.');\n\t\t\t\t\treturn this.child;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getManager',\n\t\t\t\tvalue: function getManager() {\n\t\t\t\t\treturn childContext.dragDropManager;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getChildContext',\n\t\t\t\tvalue: function getChildContext() {\n\t\t\t\t\treturn childContext;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'render',\n\t\t\t\tvalue: function render() {\n\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, {\n\t\t\t\t\t\tref: function ref(child) {\n\t\t\t\t\t\t\t_this2.child = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\treturn DragDropContextContainer;\n\t\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = 'DragDropContext(' + displayName + ')', _class.childContextTypes = CHILD_CONTEXT_TYPES, _temp);\n\n\n\t\treturn (0, _hoistNonReactStatics2.default)(DragDropContextContainer, DecoratedComponent);\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/DragDropContext.js\n// module id = 582\n// module chunks = 0 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_Symbol.js\n// module id = 583\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = dragOffset;\nexports.getSourceClientOffset = getSourceClientOffset;\nexports.getDifferenceFromInitialOffset = getDifferenceFromInitialOffset;\n\nvar _dragDrop = require('../actions/dragDrop');\n\nvar initialState = {\n\tinitialSourceClientOffset: null,\n\tinitialClientOffset: null,\n\tclientOffset: null\n};\n\nfunction areOffsetsEqual(offsetA, offsetB) {\n\tif (offsetA === offsetB) {\n\t\treturn true;\n\t}\n\treturn offsetA && offsetB && offsetA.x === offsetB.x && offsetA.y === offsetB.y;\n}\n\nfunction dragOffset() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\t\treturn {\n\t\t\t\tinitialSourceClientOffset: action.sourceClientOffset,\n\t\t\t\tinitialClientOffset: action.clientOffset,\n\t\t\t\tclientOffset: action.clientOffset\n\t\t\t};\n\t\tcase _dragDrop.HOVER:\n\t\t\tif (areOffsetsEqual(state.clientOffset, action.clientOffset)) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn _extends({}, state, {\n\t\t\t\tclientOffset: action.clientOffset\n\t\t\t});\n\t\tcase _dragDrop.END_DRAG:\n\t\tcase _dragDrop.DROP:\n\t\t\treturn initialState;\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\nfunction getSourceClientOffset(state) {\n\tvar clientOffset = state.clientOffset,\n\t    initialClientOffset = state.initialClientOffset,\n\t    initialSourceClientOffset = state.initialSourceClientOffset;\n\n\tif (!clientOffset || !initialClientOffset || !initialSourceClientOffset) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tx: clientOffset.x + initialSourceClientOffset.x - initialClientOffset.x,\n\t\ty: clientOffset.y + initialSourceClientOffset.y - initialClientOffset.y\n\t};\n}\n\nfunction getDifferenceFromInitialOffset(state) {\n\tvar clientOffset = state.clientOffset,\n\t    initialClientOffset = state.initialClientOffset;\n\n\tif (!clientOffset || !initialClientOffset) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tx: clientOffset.x - initialClientOffset.x,\n\t\ty: clientOffset.y - initialClientOffset.y\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/dragOffset.js\n// module id = 584\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = matchesType;\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction matchesType(targetType, draggedItemType) {\n\tif ((0, _isArray2.default)(targetType)) {\n\t\treturn targetType.some(function (t) {\n\t\t\treturn t === draggedItemType;\n\t\t});\n\t} else {\n\t\treturn targetType === draggedItemType;\n\t}\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/utils/matchesType.js\n// module id = 585\n// module chunks = 0 1","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseDifference.js\n// module id = 586\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isFunction.js\n// module id = 587\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseGetTag.js\n// module id = 588\n// module chunks = 0 1","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseUnary.js\n// module id = 589\n// module chunks = 0 1","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/identity.js\n// module id = 590\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = dirtyHandlerIds;\nexports.areDirty = areDirty;\n\nvar _xor = require('lodash/xor');\n\nvar _xor2 = _interopRequireDefault(_xor);\n\nvar _intersection = require('lodash/intersection');\n\nvar _intersection2 = _interopRequireDefault(_intersection);\n\nvar _dragDrop = require('../actions/dragDrop');\n\nvar _registry = require('../actions/registry');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NONE = [];\nvar ALL = [];\n\nfunction dirtyHandlerIds() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : NONE;\n\tvar action = arguments[1];\n\tvar dragOperation = arguments[2];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.HOVER:\n\t\t\tbreak;\n\t\tcase _registry.ADD_SOURCE:\n\t\tcase _registry.ADD_TARGET:\n\t\tcase _registry.REMOVE_TARGET:\n\t\tcase _registry.REMOVE_SOURCE:\n\t\t\treturn NONE;\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\tcase _dragDrop.PUBLISH_DRAG_SOURCE:\n\t\tcase _dragDrop.END_DRAG:\n\t\tcase _dragDrop.DROP:\n\t\tdefault:\n\t\t\treturn ALL;\n\t}\n\n\tvar targetIds = action.targetIds;\n\tvar prevTargetIds = dragOperation.targetIds;\n\n\tvar result = (0, _xor2.default)(targetIds, prevTargetIds);\n\n\tvar didChange = false;\n\tif (result.length === 0) {\n\t\tfor (var i = 0; i < targetIds.length; i++) {\n\t\t\tif (targetIds[i] !== prevTargetIds[i]) {\n\t\t\t\tdidChange = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdidChange = true;\n\t}\n\n\tif (!didChange) {\n\t\treturn NONE;\n\t}\n\n\tvar prevInnermostTargetId = prevTargetIds[prevTargetIds.length - 1];\n\tvar innermostTargetId = targetIds[targetIds.length - 1];\n\n\tif (prevInnermostTargetId !== innermostTargetId) {\n\t\tif (prevInnermostTargetId) {\n\t\t\tresult.push(prevInnermostTargetId);\n\t\t}\n\t\tif (innermostTargetId) {\n\t\t\tresult.push(innermostTargetId);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction areDirty(state, handlerIds) {\n\tif (state === NONE) {\n\t\treturn false;\n\t}\n\n\tif (state === ALL || typeof handlerIds === 'undefined') {\n\t\treturn true;\n\t}\n\n\treturn (0, _intersection2.default)(handlerIds, state).length > 0;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/dirtyHandlerIds.js\n// module id = 591\n// module chunks = 0 1","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/noop.js\n// module id = 592\n// module chunks = 0 1","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_setToArray.js\n// module id = 593\n// module chunks = 0 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_Symbol.js\n// module id = 594\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = shallowEqualScalar;\nfunction shallowEqualScalar(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tif ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {\n\t\treturn false;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i])) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB || (typeof valA === 'undefined' ? 'undefined' : _typeof(valA)) === 'object' || (typeof valB === 'undefined' ? 'undefined' : _typeof(valB)) === 'object') {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/utils/shallowEqualScalar.js\n// module id = 595\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = decorateHandler;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _disposables = require('disposables');\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _hoistNonReactStatics = require('hoist-non-react-statics');\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _shallowEqual = require('./utils/shallowEqual');\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _shallowEqualScalar = require('./utils/shallowEqualScalar');\n\nvar _shallowEqualScalar2 = _interopRequireDefault(_shallowEqualScalar);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar isClassComponent = function isClassComponent(Comp) {\n\treturn Boolean(Comp && Comp.prototype && typeof Comp.prototype.render === 'function');\n};\n\nfunction decorateHandler(_ref) {\n\tvar _class, _temp;\n\n\tvar DecoratedComponent = _ref.DecoratedComponent,\n\t    createHandler = _ref.createHandler,\n\t    createMonitor = _ref.createMonitor,\n\t    createConnector = _ref.createConnector,\n\t    registerHandler = _ref.registerHandler,\n\t    containerDisplayName = _ref.containerDisplayName,\n\t    getType = _ref.getType,\n\t    collect = _ref.collect,\n\t    options = _ref.options;\n\tvar _options$arePropsEqua = options.arePropsEqual,\n\t    arePropsEqual = _options$arePropsEqua === undefined ? _shallowEqualScalar2.default : _options$arePropsEqua;\n\n\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\tvar DragDropContainer = (_temp = _class = function (_Component) {\n\t\t_inherits(DragDropContainer, _Component);\n\n\t\t_createClass(DragDropContainer, [{\n\t\t\tkey: 'getHandlerId',\n\t\t\tvalue: function getHandlerId() {\n\t\t\t\treturn this.handlerId;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\treturn this.decoratedComponentInstance;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'shouldComponentUpdate',\n\t\t\tvalue: function shouldComponentUpdate(nextProps, nextState) {\n\t\t\t\treturn !arePropsEqual(nextProps, this.props) || !(0, _shallowEqual2.default)(nextState, this.state);\n\t\t\t}\n\t\t}]);\n\n\t\tfunction DragDropContainer(props, context) {\n\t\t\t_classCallCheck(this, DragDropContainer);\n\n\t\t\tvar _this = _possibleConstructorReturn(this, (DragDropContainer.__proto__ || Object.getPrototypeOf(DragDropContainer)).call(this, props, context));\n\n\t\t\t_this.handleChange = _this.handleChange.bind(_this);\n\t\t\t_this.handleChildRef = _this.handleChildRef.bind(_this);\n\n\t\t\t(0, _invariant2.default)(_typeof(_this.context.dragDropManager) === 'object', 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to wrap the top-level component of your app with DragDropContext. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);\n\n\t\t\t_this.manager = _this.context.dragDropManager;\n\t\t\t_this.handlerMonitor = createMonitor(_this.manager);\n\t\t\t_this.handlerConnector = createConnector(_this.manager.getBackend());\n\t\t\t_this.handler = createHandler(_this.handlerMonitor);\n\n\t\t\t_this.disposable = new _disposables.SerialDisposable();\n\t\t\t_this.receiveProps(props);\n\t\t\t_this.state = _this.getCurrentState();\n\t\t\t_this.dispose();\n\t\t\treturn _this;\n\t\t}\n\n\t\t_createClass(DragDropContainer, [{\n\t\t\tkey: 'componentDidMount',\n\t\t\tvalue: function componentDidMount() {\n\t\t\t\tthis.isCurrentlyMounted = true;\n\t\t\t\tthis.disposable = new _disposables.SerialDisposable();\n\t\t\t\tthis.currentType = null;\n\t\t\t\tthis.receiveProps(this.props);\n\t\t\t\tthis.handleChange();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillReceiveProps',\n\t\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\t\tif (!arePropsEqual(nextProps, this.props)) {\n\t\t\t\t\tthis.receiveProps(nextProps);\n\t\t\t\t\tthis.handleChange();\n\t\t\t\t}\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'componentWillUnmount',\n\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\tthis.dispose();\n\t\t\t\tthis.isCurrentlyMounted = false;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.handler.receiveProps(props);\n\t\t\t\tthis.receiveType(getType(props));\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveType',\n\t\t\tvalue: function receiveType(type) {\n\t\t\t\tif (type === this.currentType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.currentType = type;\n\n\t\t\t\tvar _registerHandler = registerHandler(type, this.handler, this.manager),\n\t\t\t\t    handlerId = _registerHandler.handlerId,\n\t\t\t\t    unregister = _registerHandler.unregister;\n\n\t\t\t\tthis.handlerId = handlerId;\n\t\t\t\tthis.handlerMonitor.receiveHandlerId(handlerId);\n\t\t\t\tthis.handlerConnector.receiveHandlerId(handlerId);\n\n\t\t\t\tvar globalMonitor = this.manager.getMonitor();\n\t\t\t\tvar unsubscribe = globalMonitor.subscribeToStateChange(this.handleChange, { handlerIds: [handlerId] });\n\n\t\t\t\tthis.disposable.setDisposable(new _disposables.CompositeDisposable(new _disposables.Disposable(unsubscribe), new _disposables.Disposable(unregister)));\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'handleChange',\n\t\t\tvalue: function handleChange() {\n\t\t\t\tif (!this.isCurrentlyMounted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar nextState = this.getCurrentState();\n\t\t\t\tif (!(0, _shallowEqual2.default)(nextState, this.state)) {\n\t\t\t\t\tthis.setState(nextState);\n\t\t\t\t}\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'dispose',\n\t\t\tvalue: function dispose() {\n\t\t\t\tthis.disposable.dispose();\n\t\t\t\tthis.handlerConnector.receiveHandlerId(null);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'handleChildRef',\n\t\t\tvalue: function handleChildRef(component) {\n\t\t\t\tthis.decoratedComponentInstance = component;\n\t\t\t\tthis.handler.receiveComponent(component);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'getCurrentState',\n\t\t\tvalue: function getCurrentState() {\n\t\t\t\tvar nextState = collect(this.handlerConnector.hooks, this.handlerMonitor);\n\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\t(0, _invariant2.default)((0, _isPlainObject2.default)(nextState), 'Expected `collect` specified as the second argument to ' + '%s for %s to return a plain object of props to inject. ' + 'Instead, received %s.', containerDisplayName, displayName, nextState);\n\t\t\t\t}\n\n\t\t\t\treturn nextState;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'render',\n\t\t\tvalue: function render() {\n\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, this.state, {\n\t\t\t\t\tref: isClassComponent(DecoratedComponent) ? this.handleChildRef : null\n\t\t\t\t}));\n\t\t\t}\n\t\t}]);\n\n\t\treturn DragDropContainer;\n\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = containerDisplayName + '(' + displayName + ')', _class.contextTypes = {\n\t\tdragDropManager: _propTypes2.default.object.isRequired\n\t}, _temp);\n\n\n\treturn (0, _hoistNonReactStatics2.default)(DragDropContainer, DecoratedComponent);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/decorateHandler.js\n// module id = 596\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = wrapConnectorHooks;\n\nvar _react = require('react');\n\nvar _cloneWithRef = require('./utils/cloneWithRef');\n\nvar _cloneWithRef2 = _interopRequireDefault(_cloneWithRef);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction throwIfCompositeComponentElement(element) {\n\t// Custom components can no longer be wrapped directly in React DnD 2.0\n\t// so that we don't need to depend on findDOMNode() from react-dom.\n\tif (typeof element.type === 'string') {\n\t\treturn;\n\t}\n\n\tvar displayName = element.type.displayName || element.type.name || 'the component';\n\n\tthrow new Error('Only native element nodes can now be passed to React DnD connectors.' + ('You can either wrap ' + displayName + ' into a <div>, or turn it into a ') + 'drag source or a drop target itself.');\n}\n\nfunction wrapHookToRecognizeElement(hook) {\n\treturn function () {\n\t\tvar elementOrNode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t// When passed a node, call the hook straight away.\n\t\tif (!(0, _react.isValidElement)(elementOrNode)) {\n\t\t\tvar node = elementOrNode;\n\t\t\thook(node, options);\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// If passed a ReactElement, clone it and attach this function as a ref.\n\t\t// This helps us achieve a neat API where user doesn't even know that refs\n\t\t// are being used under the hood.\n\t\tvar element = elementOrNode;\n\t\tthrowIfCompositeComponentElement(element);\n\n\t\t// When no options are passed, use the hook directly\n\t\tvar ref = options ? function (node) {\n\t\t\treturn hook(node, options);\n\t\t} : hook;\n\n\t\treturn (0, _cloneWithRef2.default)(element, ref);\n\t};\n}\n\nfunction wrapConnectorHooks(hooks) {\n\tvar wrappedHooks = {};\n\n\tObject.keys(hooks).forEach(function (key) {\n\t\tvar hook = hooks[key];\n\t\tvar wrappedHook = wrapHookToRecognizeElement(hook);\n\t\twrappedHooks[key] = function () {\n\t\t\treturn wrappedHook;\n\t\t};\n\t});\n\n\treturn wrappedHooks;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/wrapConnectorHooks.js\n// module id = 597\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = areOptionsEqual;\n\nvar _shallowEqual = require('./utils/shallowEqual');\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction areOptionsEqual(nextOptions, currentOptions) {\n\tif (currentOptions === nextOptions) {\n\t\treturn true;\n\t}\n\n\treturn currentOptions !== null && nextOptions !== null && (0, _shallowEqual2.default)(currentOptions, nextOptions);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/areOptionsEqual.js\n// module id = 598\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = isValidType;\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isValidType(type, allowArray) {\n\treturn typeof type === 'string' || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'symbol' || allowArray && (0, _isArray2.default)(type) && type.every(function (t) {\n\t\treturn isValidType(t, false);\n\t});\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/utils/isValidType.js\n// module id = 599\n// module chunks = 0 1","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/identity.js\n// module id = 600\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isFunction.js\n// module id = 601\n// module chunks = 0 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_freeGlobal.js\n// module id = 602\n// module chunks = 0 1","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isLength.js\n// module id = 603\n// module chunks = 0 1","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isIndex.js\n// module id = 604\n// module chunks = 0 1","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isArguments.js\n// module id = 605\n// module chunks = 0 1","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isArray.js\n// module id = 606\n// module chunks = 0 1","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseUnary.js\n// module id = 607\n// module chunks = 0 1","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_SetCache.js\n// module id = 608\n// module chunks = 0 1","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_MapCache.js\n// module id = 609\n// module chunks = 0 1","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayIncludes.js\n// module id = 610\n// module chunks = 0 1","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayIncludesWith.js\n// module id = 611\n// module chunks = 0 1","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_cacheHas.js\n// module id = 612\n// module chunks = 0 1","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_setToArray.js\n// module id = 613\n// module chunks = 0 1","var isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isArrayLikeObject.js\n// module id = 614\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSafari = exports.isFirefox = undefined;\n\nvar _memoize = require('lodash/memoize');\n\nvar _memoize2 = _interopRequireDefault(_memoize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isFirefox = exports.isFirefox = (0, _memoize2.default)(function () {\n  return (/firefox/i.test(navigator.userAgent)\n  );\n});\nvar isSafari = exports.isSafari = (0, _memoize2.default)(function () {\n  return Boolean(window.safari);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/BrowserDetector.js\n// module id = 615\n// module chunks = 0 1","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseCreate.js\n// module id = 616\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseGetTag.js\n// module id = 617\n// module chunks = 0 1","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_getNative.js\n// module id = 618\n// module chunks = 0 1","var metaMap = require('./_metaMap'),\n    noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n  return metaMap.get(func);\n};\n\nmodule.exports = getData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_getData.js\n// module id = 619\n// module chunks = 0 1","var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n  var result = (func.name + ''),\n      array = realNames[result],\n      length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n  while (length--) {\n    var data = array[length],\n        otherFunc = data.func;\n    if (otherFunc == null || otherFunc == func) {\n      return data.name;\n    }\n  }\n  return result;\n}\n\nmodule.exports = getFuncName;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_getFuncName.js\n// module id = 620\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport { numberTypes, localeToCurrency } from '../numberTypes';\nimport Amount from '../amount';\n\nconst amountTypes = ['numeric', 'monetary'];\nconst isAmountType = (columnType) => _.includes(amountTypes, columnType);\nconst getAmountTypeFor = (columnType, locale) => {\n  return columnType === 'monetary'\n      ? localeToCurrency(locale)\n      : numberTypes.none;\n};\n\nexport default class TooltipValue extends React.Component<any, any> {\n\n  static propTypes = {\n    locale: PropTypes.string.isRequired,\n    columnName: PropTypes.string.isRequired,\n    columnType: PropTypes.string.isRequired,\n    value: PropTypes.oneOfType([\n      PropTypes.string,\n      PropTypes.number\n    ]).isRequired\n  };\n\n  render() {\n    const { columnType, value, locale } = this.props;\n\n    if (isAmountType(columnType)) {\n      const amountType = getAmountTypeFor(columnType, locale);\n\n      return (\n        <Amount value={parseFloat(value)} unit={amountType} />\n      );\n    }\n\n    return (\n      <span>{value}</span>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/tooltip_value.tsx","import numeral from 'numeral';\nimport strings from './strings';\n\nexport const formatValue = (symbol, value, abbreviated?: boolean) => {\n  if (abbreviated && Math.abs(value) >= 10e3) {\n    return numeral(value).format('0,0.0[0]a').toUpperCase();\n  }\n\n  if (symbol === 'FTE') {\n    return strings.formatFTE(value);\n  }\n\n  return numeral(value).format('0,0');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/formatValue.ts","'use strict';\n\nvar browser = require('./util/browser');\n\n// jshint -W079\nvar mapboxgl = module.exports = {};\n\nmapboxgl.version = require('../package.json').version;\nmapboxgl.workerCount = Math.max(browser.hardwareConcurrency - 1, 1);\n\n\nmapboxgl.Map = require('./ui/map');\nmapboxgl.Control = require('./ui/control/control');\nmapboxgl.Navigation = require('./ui/control/navigation');\nmapboxgl.Geolocate = require('./ui/control/geolocate');\nmapboxgl.Attribution = require('./ui/control/attribution');\nmapboxgl.Scale = require('./ui/control/scale');\nmapboxgl.Popup = require('./ui/popup');\nmapboxgl.Marker = require('./ui/marker');\n\nmapboxgl.Style = require('./style/style');\n\nmapboxgl.LngLat = require('./geo/lng_lat');\nmapboxgl.LngLatBounds = require('./geo/lng_lat_bounds');\nmapboxgl.Point = require('point-geometry');\n\nmapboxgl.Evented = require('./util/evented');\nmapboxgl.util = require('./util/util');\n\nmapboxgl.supported = require('./util/browser').supported;\n\nvar ajax = require('./util/ajax');\nmapboxgl.util.getJSON = ajax.getJSON;\nmapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;\n\nvar config = require('./util/config');\nmapboxgl.config = config;\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n    get: function() { return config.ACCESS_TOKEN; },\n    set: function(token) { config.ACCESS_TOKEN = token; }\n});\n\n/**\n * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/).\n *\n * @var {string} accessToken\n * @example\n * mapboxgl.accessToken = myAccessToken;\n */\n\n/**\n * The version of Mapbox GL JS in use as specified in `package.json`,\n * `CHANGELOG.md`, and the GitHub release.\n *\n * @var {string} version\n */\n\n/**\n * Returns a Boolean indicating whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js).\n *\n * @function supported\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,\n *   the function will return `false` if the performance of Mapbox GL JS would\n *   be dramatically worse than expected (i.e. a software renderer would be used).\n * @return {boolean}\n * @example\n * mapboxgl.supported() // = true\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/mapbox-gl.js\n// module id = 623\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar StyleLayer = require('./style_layer');\nvar ImageSprite = require('./image_sprite');\nvar GlyphSource = require('../symbol/glyph_source');\nvar SpriteAtlas = require('../symbol/sprite_atlas');\nvar LineAtlas = require('../render/line_atlas');\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar normalizeURL = require('../util/mapbox').normalizeStyleURL;\nvar browser = require('../util/browser');\nvar Dispatcher = require('../util/dispatcher');\nvar AnimationLoop = require('./animation_loop');\nvar validateStyle = require('./validate_style');\nvar Source = require('../source/source');\nvar QueryFeatures = require('../source/query_features');\nvar SourceCache = require('../source/source_cache');\nvar styleSpec = require('./style_spec');\nvar StyleFunction = require('./style_function');\nvar getWorkerPool = require('../global_worker_pool');\n\nmodule.exports = Style;\n\nfunction Style(stylesheet, animationLoop) {\n    this.animationLoop = animationLoop || new AnimationLoop();\n    this.dispatcher = new Dispatcher(getWorkerPool(), this);\n    this.spriteAtlas = new SpriteAtlas(1024, 1024);\n    this.lineAtlas = new LineAtlas(256, 512);\n\n    this._layers = {};\n    this._order  = [];\n    this._groups = [];\n    this.sources = {};\n    this.zoomHistory = {};\n\n    util.bindAll([\n        '_forwardSourceEvent',\n        '_forwardTileEvent',\n        '_forwardLayerEvent',\n        '_redoPlacement'\n    ], this);\n\n    this._resetUpdates();\n\n    var stylesheetLoaded = function(err, stylesheet) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        if (validateStyle.emitErrors(this, validateStyle(stylesheet))) return;\n\n        this._loaded = true;\n        this.stylesheet = stylesheet;\n\n        this.updateClasses();\n\n        var sources = stylesheet.sources;\n        for (var id in sources) {\n            this.addSource(id, sources[id]);\n        }\n\n        if (stylesheet.sprite) {\n            this.sprite = new ImageSprite(stylesheet.sprite);\n            this.sprite.on('load', this.fire.bind(this, 'change'));\n        }\n\n        this.glyphSource = new GlyphSource(stylesheet.glyphs);\n        this._resolve();\n        this.fire('load');\n    }.bind(this);\n\n    if (typeof stylesheet === 'string') {\n        ajax.getJSON(normalizeURL(stylesheet), stylesheetLoaded);\n    } else {\n        browser.frame(stylesheetLoaded.bind(this, null, stylesheet));\n    }\n\n    this.on('source.load', function(event) {\n        var source = event.source;\n        if (source && source.vectorLayerIds) {\n            for (var layerId in this._layers) {\n                var layer = this._layers[layerId];\n                if (layer.source === source.id) {\n                    this._validateLayer(layer);\n                }\n            }\n        }\n    });\n}\n\nStyle.prototype = util.inherit(Evented, {\n    _loaded: false,\n\n    _validateLayer: function(layer) {\n        var source = this.sources[layer.source];\n\n        if (!layer.sourceLayer) return;\n        if (!source) return;\n        if (!source.vectorLayerIds) return;\n\n        if (source.vectorLayerIds.indexOf(layer.sourceLayer) === -1) {\n            this.fire('error', {\n                error: new Error(\n                    'Source layer \"' + layer.sourceLayer + '\" ' +\n                    'does not exist on source \"' + source.id + '\" ' +\n                    'as specified by style layer \"' + layer.id + '\"'\n                )\n            });\n        }\n    },\n\n    loaded: function() {\n        if (!this._loaded)\n            return false;\n\n        if (Object.keys(this._updates.sources).length)\n            return false;\n\n        for (var id in this.sources)\n            if (!this.sources[id].loaded())\n                return false;\n\n        if (this.sprite && !this.sprite.loaded())\n            return false;\n\n        return true;\n    },\n\n    _resolve: function() {\n        var layer, layerJSON;\n\n        this._layers = {};\n        this._order  = this.stylesheet.layers.map(function(layer) {\n            return layer.id;\n        });\n\n        // resolve all layers WITHOUT a ref\n        for (var i = 0; i < this.stylesheet.layers.length; i++) {\n            layerJSON = this.stylesheet.layers[i];\n            if (layerJSON.ref) continue;\n            layer = StyleLayer.create(layerJSON);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        // resolve all layers WITH a ref\n        for (var j = 0; j < this.stylesheet.layers.length; j++) {\n            layerJSON = this.stylesheet.layers[j];\n            if (!layerJSON.ref) continue;\n            var refLayer = this.getLayer(layerJSON.ref);\n            layer = StyleLayer.create(layerJSON, refLayer);\n            this._layers[layer.id] = layer;\n            layer.on('error', this._forwardLayerEvent);\n        }\n\n        this._groupLayers();\n        this._updateWorkerLayers();\n    },\n\n    _groupLayers: function() {\n        var group;\n\n        this._groups = [];\n\n        // Split into groups of consecutive top-level layers with the same source.\n        for (var i = 0; i < this._order.length; ++i) {\n            var layer = this._layers[this._order[i]];\n\n            if (!group || layer.source !== group.source) {\n                group = [];\n                group.source = layer.source;\n                this._groups.push(group);\n            }\n\n            group.push(layer);\n        }\n    },\n\n    _updateWorkerLayers: function(ids) {\n        this.dispatcher.broadcast(ids ? 'update layers' : 'set layers', this._serializeLayers(ids));\n    },\n\n    _serializeLayers: function(ids) {\n        ids = ids || this._order;\n        var serialized = [];\n        var options = {includeRefProperties: true};\n        for (var i = 0; i < ids.length; i++) {\n            serialized.push(this._layers[ids[i]].serialize(options));\n        }\n        return serialized;\n    },\n\n    _applyClasses: function(classes, options) {\n        if (!this._loaded) return;\n\n        classes = classes || [];\n        options = options || {transition: true};\n        var transition = this.stylesheet.transition || {};\n\n        var layers = this._updates.allPaintProps ? this._layers : this._updates.paintProps;\n\n        for (var id in layers) {\n            var layer = this._layers[id];\n            var props = this._updates.paintProps[id];\n\n            if (this._updates.allPaintProps || props.all) {\n                layer.updatePaintTransitions(classes, options, transition, this.animationLoop);\n            } else {\n                for (var paintName in props) {\n                    this._layers[id].updatePaintTransition(paintName, classes, options, transition, this.animationLoop);\n                }\n            }\n        }\n    },\n\n    _recalculate: function(z) {\n        for (var sourceId in this.sources)\n            this.sources[sourceId].used = false;\n\n        this._updateZoomHistory(z);\n\n        this.rasterFadeDuration = 300;\n        for (var layerId in this._layers) {\n            var layer = this._layers[layerId];\n\n            layer.recalculate(z, this.zoomHistory);\n            if (!layer.isHidden(z) && layer.source) {\n                this.sources[layer.source].used = true;\n            }\n        }\n\n        var maxZoomTransitionDuration = 300;\n        if (Math.floor(this.z) !== Math.floor(z)) {\n            this.animationLoop.set(maxZoomTransitionDuration);\n        }\n\n        this.z = z;\n        this.fire('zoom');\n    },\n\n    _updateZoomHistory: function(z) {\n\n        var zh = this.zoomHistory;\n\n        if (zh.lastIntegerZoom === undefined) {\n            // first time\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = 0;\n            zh.lastZoom = z;\n        }\n\n        // check whether an integer zoom level as passed since the last frame\n        // and if yes, record it with the time. Used for transitioning patterns.\n        if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z);\n            zh.lastIntegerZoomTime = Date.now();\n\n        } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n            zh.lastIntegerZoom = Math.floor(z + 1);\n            zh.lastIntegerZoomTime = Date.now();\n        }\n\n        zh.lastZoom = z;\n    },\n\n    _checkLoaded: function () {\n        if (!this._loaded) {\n            throw new Error('Style is not done loading');\n        }\n    },\n\n    /**\n     * Apply queued style updates in a batch\n     * @private\n     */\n    update: function(classes, options) {\n        if (!this._updates.changed) return this;\n\n        if (this._updates.allLayers) {\n            this._groupLayers();\n            this._updateWorkerLayers();\n        } else {\n            var updatedIds = Object.keys(this._updates.layers);\n            if (updatedIds.length) {\n                this._updateWorkerLayers(updatedIds);\n            }\n        }\n\n        var updatedSourceIds = Object.keys(this._updates.sources);\n        var i;\n        for (i = 0; i < updatedSourceIds.length; i++) {\n            this._reloadSource(updatedSourceIds[i]);\n        }\n\n        for (i = 0; i < this._updates.events.length; i++) {\n            var args = this._updates.events[i];\n            this.fire(args[0], args[1]);\n        }\n\n        this._applyClasses(classes, options);\n\n        if (this._updates.changed) {\n            this.fire('change');\n        }\n\n        this._resetUpdates();\n\n        return this;\n    },\n\n    _resetUpdates: function() {\n        this._updates = {\n            events: [],\n            layers: {},\n            sources: {},\n            paintProps: {}\n        };\n    },\n\n    addSource: function(id, source) {\n        this._checkLoaded();\n        if (this.sources[id] !== undefined) {\n            throw new Error('There is already a source with this ID');\n        }\n        if (!source.type) {\n            throw new Error('The type property must be defined, but the only the following properties were given: ' + Object.keys(source) + '.');\n        }\n        var builtIns = ['vector', 'raster', 'geojson', 'video', 'image'];\n        var shouldValidate = builtIns.indexOf(source.type) >= 0;\n        if (shouldValidate && this._handleErrors(validateStyle.source, 'sources.' + id, source)) return this;\n\n        source = new SourceCache(id, source, this.dispatcher);\n        this.sources[id] = source;\n        source.style = this;\n        source\n            .on('load', this._forwardSourceEvent)\n            .on('error', this._forwardSourceEvent)\n            .on('change', this._forwardSourceEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.load', this._forwardTileEvent)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.add', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Remove a source from this stylesheet, given its id.\n     * @param {string} id id of the source to remove\n     * @returns {Style} this style\n     * @throws {Error} if no source is found with the given ID\n     * @private\n     */\n    removeSource: function(id) {\n        this._checkLoaded();\n\n        if (this.sources[id] === undefined) {\n            throw new Error('There is no source with this ID');\n        }\n        var source = this.sources[id];\n        delete this.sources[id];\n        delete this._updates.sources[id];\n        source\n            .off('load', this._forwardSourceEvent)\n            .off('error', this._forwardSourceEvent)\n            .off('change', this._forwardSourceEvent)\n            .off('tile.add', this._forwardTileEvent)\n            .off('tile.load', this._forwardTileEvent)\n            .off('tile.error', this._forwardTileEvent)\n            .off('tile.remove', this._forwardTileEvent)\n            .off('tile.stats', this._forwardTileEvent);\n\n        this._updates.events.push(['source.remove', {source: source}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Get a source by id.\n     * @param {string} id id of the desired source\n     * @returns {Object} source\n     * @private\n     */\n    getSource: function(id) {\n        return this.sources[id] && this.sources[id].getSource();\n    },\n\n    /**\n     * Add a layer to the map style. The layer will be inserted before the layer with\n     * ID `before`, or appended if `before` is omitted.\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Style} `this`\n     * @private\n     */\n    addLayer: function(layer, before) {\n        this._checkLoaded();\n\n        if (!(layer instanceof StyleLayer)) {\n            // this layer is not in the style.layers array, so we pass an impossible array index\n            if (this._handleErrors(validateStyle.layer,\n                    'layers.' + layer.id, layer, false, {arrayIndex: -1})) return this;\n\n            var refLayer = layer.ref && this.getLayer(layer.ref);\n            layer = StyleLayer.create(layer, refLayer);\n        }\n        this._validateLayer(layer);\n\n        layer.on('error', this._forwardLayerEvent);\n\n        this._layers[layer.id] = layer;\n        this._order.splice(before ? this._order.indexOf(before) : Infinity, 0, layer.id);\n\n        this._updates.allLayers = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.events.push(['layer.add', {layer: layer}]);\n\n        return this.updateClasses(layer.id);\n    },\n\n    /**\n     * Remove a layer from this stylesheet, given its id.\n     * @param {string} id id of the layer to remove\n     * @returns {Style} this style\n     * @throws {Error} if no layer is found with the given ID\n     * @private\n     */\n    removeLayer: function(id) {\n        this._checkLoaded();\n\n        var layer = this._layers[id];\n        if (layer === undefined) {\n            throw new Error('There is no layer with this ID');\n        }\n        for (var i in this._layers) {\n            if (this._layers[i].ref === id) {\n                this.removeLayer(i);\n            }\n        }\n\n        layer.off('error', this._forwardLayerEvent);\n\n        delete this._layers[id];\n        delete this._updates.layers[id];\n        delete this._updates.paintProps[id];\n        this._order.splice(this._order.indexOf(id), 1);\n\n        this._updates.allLayers = true;\n        this._updates.events.push(['layer.remove', {layer: layer}]);\n        this._updates.changed = true;\n\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id - id of the desired layer\n     * @returns {?Object} a layer, if one with the given `id` exists\n     * @private\n     */\n    getLayer: function(id) {\n        return this._layers[id];\n    },\n\n    /**\n     * If a layer has a `ref` property that makes it derive some values\n     * from another layer, return that referent layer. Otherwise,\n     * returns the layer itself.\n     * @param {string} id the layer's id\n     * @returns {Layer} the referent layer or the layer itself\n     * @private\n     */\n    getReferentLayer: function(id) {\n        var layer = this.getLayer(id);\n        if (layer.ref) {\n            layer = this.getLayer(layer.ref);\n        }\n        return layer;\n    },\n\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return this;\n\n        if (minzoom != null) {\n            layer.minzoom = minzoom;\n        }\n        if (maxzoom != null) {\n            layer.maxzoom = maxzoom;\n        }\n        return this._updateLayer(layer);\n    },\n\n    setFilter: function(layerId, filter) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (filter !== null && this._handleErrors(validateStyle.filter, 'layers.' + layer.id + '.filter', filter)) return this;\n\n        if (util.deepEqual(layer.filter, filter)) return this;\n        layer.filter = util.clone(filter);\n\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layer's filter object\n     * @param {string} layer the layer to inspect\n     * @returns {*} the layer's filter, if any\n     * @private\n     */\n    getFilter: function(layer) {\n        return this.getReferentLayer(layer).filter;\n    },\n\n    setLayoutProperty: function(layerId, name, value) {\n        this._checkLoaded();\n\n        var layer = this.getReferentLayer(layerId);\n\n        if (util.deepEqual(layer.getLayoutProperty(name), value)) return this;\n\n        layer.setLayoutProperty(name, value);\n        return this._updateLayer(layer);\n    },\n\n    /**\n     * Get a layout property's value from a given layer\n     * @param {string} layer the layer to inspect\n     * @param {string} name the name of the layout property\n     * @returns {*} the property value\n     * @private\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.getReferentLayer(layer).getLayoutProperty(name);\n    },\n\n    setPaintProperty: function(layerId, name, value, klass) {\n        this._checkLoaded();\n\n        var layer = this.getLayer(layerId);\n\n        if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return this;\n\n        var wasFeatureConstant = layer.isPaintValueFeatureConstant(name);\n        layer.setPaintProperty(name, value, klass);\n\n        var isFeatureConstant = !(\n            value &&\n            StyleFunction.isFunctionDefinition(value) &&\n            value.property !== '$zoom' &&\n            value.property !== undefined\n        );\n\n        if (!isFeatureConstant || !wasFeatureConstant) {\n            this._updates.layers[layerId] = true;\n            if (layer.source) {\n                this._updates.sources[layer.source] = true;\n            }\n        }\n\n        return this.updateClasses(layerId, name);\n    },\n\n    getPaintProperty: function(layer, name, klass) {\n        return this.getLayer(layer).getPaintProperty(name, klass);\n    },\n\n    updateClasses: function (layerId, paintName) {\n        this._updates.changed = true;\n        if (!layerId) {\n            this._updates.allPaintProps = true;\n        } else {\n            var props = this._updates.paintProps;\n            if (!props[layerId]) props[layerId] = {};\n            props[layerId][paintName || 'all'] = true;\n        }\n        return this;\n    },\n\n    serialize: function() {\n        return util.filterObject({\n            version: this.stylesheet.version,\n            name: this.stylesheet.name,\n            metadata: this.stylesheet.metadata,\n            center: this.stylesheet.center,\n            zoom: this.stylesheet.zoom,\n            bearing: this.stylesheet.bearing,\n            pitch: this.stylesheet.pitch,\n            sprite: this.stylesheet.sprite,\n            glyphs: this.stylesheet.glyphs,\n            transition: this.stylesheet.transition,\n            sources: util.mapObject(this.sources, function(source) {\n                return source.serialize();\n            }),\n            layers: this._order.map(function(id) {\n                return this._layers[id].serialize();\n            }, this)\n        }, function(value) { return value !== undefined; });\n    },\n\n    _updateLayer: function (layer) {\n        this._updates.layers[layer.id] = true;\n        if (layer.source) {\n            this._updates.sources[layer.source] = true;\n        }\n        this._updates.changed = true;\n        return this;\n    },\n\n    _flattenRenderedFeatures: function(sourceResults) {\n        var features = [];\n        for (var l = this._order.length - 1; l >= 0; l--) {\n            var layerID = this._order[l];\n            for (var s = 0; s < sourceResults.length; s++) {\n                var layerFeatures = sourceResults[s][layerID];\n                if (layerFeatures) {\n                    for (var f = 0; f < layerFeatures.length; f++) {\n                        features.push(layerFeatures[f]);\n                    }\n                }\n            }\n        }\n        return features;\n    },\n\n    queryRenderedFeatures: function(queryGeometry, params, zoom, bearing) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, true);\n        }\n\n        var includedSources = {};\n        if (params && params.layers) {\n            for (var i = 0; i < params.layers.length; i++) {\n                var layerId = params.layers[i];\n                includedSources[this._layers[layerId].source] = true;\n            }\n        }\n\n        var sourceResults = [];\n        for (var id in this.sources) {\n            if (params.layers && !includedSources[id]) continue;\n            var source = this.sources[id];\n            var results = QueryFeatures.rendered(source, this._layers, queryGeometry, params, zoom, bearing);\n            sourceResults.push(results);\n        }\n        return this._flattenRenderedFeatures(sourceResults);\n    },\n\n    querySourceFeatures: function(sourceID, params) {\n        if (params && params.filter) {\n            this._handleErrors(validateStyle.filter, 'querySourceFeatures.filter', params.filter, true);\n        }\n        var source = this.sources[sourceID];\n        return source ? QueryFeatures.source(source, params) : [];\n    },\n\n    addSourceType: function (name, SourceType, callback) {\n        if (Source.getType(name)) {\n            return callback(new Error('A source type called \"' + name + '\" already exists.'));\n        }\n\n        Source.setType(name, SourceType);\n\n        if (!SourceType.workerSourceURL) {\n            return callback(null, null);\n        }\n\n        this.dispatcher.broadcast('load worker source', {\n            name: name,\n            url: SourceType.workerSourceURL\n        }, callback);\n    },\n\n    _handleErrors: function(validate, key, value, throws, props) {\n        var action = throws ? validateStyle.throwErrors : validateStyle.emitErrors;\n        var result = validate.call(validateStyle, util.extend({\n            key: key,\n            style: this.serialize(),\n            value: value,\n            styleSpec: styleSpec\n        }, props));\n        return action.call(validateStyle, this, result);\n    },\n\n    _remove: function() {\n        this.dispatcher.remove();\n    },\n\n    _reloadSource: function(id) {\n        this.sources[id].reload();\n    },\n\n    _updateSources: function(transform) {\n        for (var id in this.sources) {\n            this.sources[id].update(transform);\n        }\n    },\n\n    _redoPlacement: function() {\n        for (var id in this.sources) {\n            if (this.sources[id].redoPlacement) this.sources[id].redoPlacement();\n        }\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire('source.' + e.type, util.extend({source: e.target.getSource()}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({source: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire('layer.' + e.type, util.extend({layer: {id: e.target.id}}, e));\n    },\n\n    // Callbacks from web workers\n\n    'get sprite json': function(mapId, params, callback) {\n        var sprite = this.sprite;\n        if (sprite.loaded()) {\n            callback(null, { sprite: sprite.data, retina: sprite.retina });\n        } else {\n            sprite.on('load', function() {\n                callback(null, { sprite: sprite.data, retina: sprite.retina });\n            });\n        }\n    },\n\n    'get icons': function(mapId, params, callback) {\n        var sprite = this.sprite;\n        var spriteAtlas = this.spriteAtlas;\n        if (sprite.loaded()) {\n            spriteAtlas.setSprite(sprite);\n            spriteAtlas.addIcons(params.icons, callback);\n        } else {\n            sprite.on('load', function() {\n                spriteAtlas.setSprite(sprite);\n                spriteAtlas.addIcons(params.icons, callback);\n            });\n        }\n    },\n\n    'get glyphs': function(mapId, params, callback) {\n        var stacks = params.stacks,\n            remaining = Object.keys(stacks).length,\n            allGlyphs = {};\n\n        for (var fontName in stacks) {\n            this.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done);\n        }\n\n        function done(err, glyphs, fontName) {\n            if (err) console.error(err);\n\n            allGlyphs[fontName] = glyphs;\n            remaining--;\n\n            if (remaining === 0)\n                callback(null, allGlyphs);\n        }\n    }\n});\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style.js\n// module id = 624\n// module chunks = 0 1","'use strict';\n\nvar parseColorString = require('csscolorparser').parseCSSColor;\nvar util = require('../util/util');\nvar StyleFunction = require('./style_function');\n\nvar cache = {};\n\nmodule.exports = function parseColor(input) {\n\n    if (StyleFunction.isFunctionDefinition(input)) {\n\n        return util.extend({}, input, {\n            stops: input.stops.map(function(stop) {\n                return [stop[0], parseColor(stop[1])];\n            })\n        });\n\n    } else if (typeof input === 'string') {\n\n        if (!cache[input]) {\n            var rgba = parseColorString(input);\n            if (!rgba) { throw new Error('Invalid color ' + input); }\n\n            // GL expects all components to be in the range [0, 1] and to be\n            // multipled by the alpha value.\n            cache[input] = [\n                rgba[0] / 255 * rgba[3],\n                rgba[1] / 255 * rgba[3],\n                rgba[2] / 255 * rgba[3],\n                rgba[3]\n            ];\n        }\n\n        return cache[input];\n\n    } else {\n        throw new Error('Invalid color ' + input);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/parse_color.js\n// module id = 625\n// module chunks = 0 1","'use strict';\n\nmodule.exports = require('mapbox-gl-style-spec/reference/latest.min');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_spec.js\n// module id = 626\n// module chunks = 0 1","module.exports = require('./v8.min.json');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/reference/latest.min.js\n// module id = 627\n// module chunks = 0 1","'use strict';\n\nmodule.exports = require('mapbox-gl-style-spec/lib/validate_style.min');\n\nmodule.exports.emitErrors = function throwErrors(emitter, errors) {\n    if (errors && errors.length) {\n        for (var i = 0; i < errors.length; i++) {\n            emitter.fire('error', { error: new Error(errors[i].message) });\n        }\n        return true;\n    } else {\n        return false;\n    }\n};\n\nmodule.exports.throwErrors = function throwErrors(emitter, errors) {\n    if (errors) {\n        for (var i = 0; i < errors.length; i++) {\n            throw new Error(errors[i].message);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/validate_style.js\n// module id = 628\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\n\nmodule.exports = function validateConstants(options) {\n    var key = options.key;\n    var constants = options.value;\n    var styleSpec = options.styleSpec;\n\n    if (styleSpec.$version > 7) {\n        if (constants) {\n            return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n        } else {\n            return [];\n        }\n    } else {\n        var type = getType(constants);\n        if (type !== 'object') {\n            return [new ValidationError(key, constants, 'object expected, %s found', type)];\n        }\n\n        var errors = [];\n        for (var constantName in constants) {\n            if (constantName[0] !== '@') {\n                errors.push(new ValidationError(key + '.' + constantName, constants[constantName], 'constants must start with \"@\"'));\n            }\n        }\n        return errors;\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_constants.js\n// module id = 629\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function (output) {\n    for (var i = 1; i < arguments.length; i++) {\n        var input = arguments[i];\n        for (var k in input) {\n            output[k] = input[k];\n        }\n    }\n    return output;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/util/extend.js\n// module id = 630\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\nvar validateObject = require('./validate_object');\nvar validateArray = require('./validate_array');\nvar validateNumber = require('./validate_number');\n\nmodule.exports = function validateFunction(options) {\n    var functionValueSpec = options.valueSpec;\n    var stopKeyType;\n\n    var isPropertyFunction = options.value.property !== undefined || stopKeyType === 'object';\n    var isZoomFunction = options.value.property === undefined || stopKeyType === 'object';\n\n    var errors = validateObject({\n        key: options.key,\n        value: options.value,\n        valueSpec: options.styleSpec.function,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: { stops: validateFunctionStops }\n    });\n\n    if (options.styleSpec.$version >= 8) {\n       if (isPropertyFunction && !options.valueSpec['property-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n       } else if (isZoomFunction && !options.valueSpec['zoom-function']) {\n           errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n       }\n    }\n\n    return errors;\n\n    function validateFunctionStops(options) {\n        var errors = [];\n        var value = options.value;\n\n        errors = errors.concat(validateArray({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec,\n            arrayElementValidator: validateFunctionStop\n        }));\n\n        if (getType(value) === 'array' && value.length === 0) {\n            errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n        }\n\n        return errors;\n    }\n\n    function validateFunctionStop(options) {\n        var errors = [];\n        var value = options.value;\n        var key = options.key;\n\n        if (getType(value) !== 'array') {\n            return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n        }\n\n        if (value.length !== 2) {\n            return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)];\n        }\n\n        var type = getType(value[0]);\n        if (!stopKeyType) stopKeyType = type;\n        if (type !== stopKeyType) {\n            return [new ValidationError(key, value, '%s stop key type must match previous stop key type %s', type, stopKeyType)];\n        }\n\n        if (type === 'object') {\n            if (value[0].zoom === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have zoom')];\n            }\n            if (value[0].value === undefined) {\n                return [new ValidationError(key, value, 'object stop key must have value')];\n            }\n            errors = errors.concat(validateObject({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: { zoom: {} },\n                style: options.style,\n                styleSpec: options.styleSpec,\n                objectElementValidators: { zoom: validateNumber, value: validateValue }\n            }));\n        } else {\n            errors = errors.concat((isZoomFunction ? validateNumber : validateValue)({\n                key: key + '[0]',\n                value: value[0],\n                valueSpec: {},\n                style: options.style,\n                styleSpec: options.styleSpec\n            }));\n        }\n\n        errors = errors.concat(validate({\n            key: key + '[1]',\n            value: value[1],\n            valueSpec: functionValueSpec,\n            style: options.style,\n            styleSpec: options.styleSpec\n        }));\n\n        if (getType(value[0]) === 'number') {\n            if (functionValueSpec.function === 'piecewise-constant' && value[0] % 1 !== 0) {\n                errors.push(new ValidationError(key + '[0]', value[0], 'zoom level for piecewise-constant functions must be an integer'));\n            }\n\n            if (options.arrayIndex !== 0) {\n                if (value[0] < options.array[options.arrayIndex - 1][0]) {\n                    errors.push(new ValidationError(key + '[0]', value[0], 'array stops must appear in ascending order'));\n                }\n            }\n        }\n\n        return errors;\n    }\n\n    function validateValue(options) {\n        var errors = [];\n        var type = getType(options.value);\n        if (type !== 'number' && type !== 'string' && type !== 'array') {\n            errors.push(new ValidationError(options.key, options.value, 'property value must be a number, string or array'));\n        }\n        return errors;\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_function.js\n// module id = 631\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateArray(options) {\n    var array = options.value;\n    var arraySpec = options.valueSpec;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var key = options.key;\n    var validateArrayElement = options.arrayElementValidator || validate;\n\n    if (getType(array) !== 'array') {\n        return [new ValidationError(key, array, 'array expected, %s found', getType(array))];\n    }\n\n    if (arraySpec.length && array.length !== arraySpec.length) {\n        return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)];\n    }\n\n    if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n        return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)];\n    }\n\n    var arrayElementSpec = {\n        \"type\": arraySpec.value\n    };\n\n    if (styleSpec.$version < 7) {\n        arrayElementSpec.function = arraySpec.function;\n    }\n\n    if (getType(arraySpec.value) === 'object') {\n        arrayElementSpec = arraySpec.value;\n    }\n\n    var errors = [];\n    for (var i = 0; i < array.length; i++) {\n        errors = errors.concat(validateArrayElement({\n            array: array,\n            arrayIndex: i,\n            value: array[i],\n            valueSpec: arrayElementSpec,\n            style: style,\n            styleSpec: styleSpec,\n            key: key + '[' + i + ']'\n        }));\n    }\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_array.js\n// module id = 632\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateNumber(options) {\n    var key = options.key;\n    var value = options.value;\n    var valueSpec = options.valueSpec;\n    var type = getType(value);\n\n    if (type !== 'number') {\n        return [new ValidationError(key, value, 'number expected, %s found', type)];\n    }\n\n    if ('minimum' in valueSpec && value < valueSpec.minimum) {\n        return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)];\n    }\n\n    if ('maximum' in valueSpec && value > valueSpec.maximum) {\n        return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_number.js\n// module id = 633\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\nvar validateObject = require('./validate_object');\nvar validateFilter = require('./validate_filter');\nvar validatePaintProperty = require('./validate_paint_property');\nvar validateLayoutProperty = require('./validate_layout_property');\nvar extend = require('../util/extend');\n\nmodule.exports = function validateLayer(options) {\n    var errors = [];\n\n    var layer = options.value;\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n\n    if (!layer.type && !layer.ref) {\n        errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n    }\n    var type = unbundle(layer.type);\n    var ref = unbundle(layer.ref);\n\n    if (layer.id) {\n        for (var i = 0; i < options.arrayIndex; i++) {\n            var otherLayer = style.layers[i];\n            if (unbundle(otherLayer.id) === unbundle(layer.id)) {\n                errors.push(new ValidationError(key, layer.id, 'duplicate layer id \"%s\", previously used at line %d', layer.id, otherLayer.id.__line__));\n            }\n        }\n    }\n\n    if ('ref' in layer) {\n        ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n            if (p in layer) {\n                errors.push(new ValidationError(key, layer[p], '\"%s\" is prohibited for ref layers', p));\n            }\n        });\n\n        var parent;\n\n        style.layers.forEach(function(layer) {\n            if (layer.id == ref) parent = layer;\n        });\n\n        if (!parent) {\n            errors.push(new ValidationError(key, layer.ref, 'ref layer \"%s\" not found', ref));\n        } else if (parent.ref) {\n            errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n        } else {\n            type = unbundle(parent.type);\n        }\n    } else if (type !== 'background') {\n        if (!layer.source) {\n            errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n        } else {\n            var source = style.sources && style.sources[layer.source];\n            if (!source) {\n                errors.push(new ValidationError(key, layer.source, 'source \"%s\" not found', layer.source));\n            } else if (source.type == 'vector' && type == 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a raster source', layer.id));\n            } else if (source.type == 'raster' && type != 'raster') {\n                errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a vector source', layer.id));\n            } else if (source.type == 'vector' && !layer['source-layer']) {\n                errors.push(new ValidationError(key, layer, 'layer \"%s\" must specify a \"source-layer\"', layer.id));\n            }\n        }\n    }\n\n    errors = errors.concat(validateObject({\n        key: key,\n        value: layer,\n        valueSpec: styleSpec.layer,\n        style: options.style,\n        styleSpec: options.styleSpec,\n        objectElementValidators: {\n            filter: validateFilter,\n            layout: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validateLayoutProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            },\n            paint: function(options) {\n                return validateObject({\n                    layer: layer,\n                    key: options.key,\n                    value: options.value,\n                    style: options.style,\n                    styleSpec: options.styleSpec,\n                    objectElementValidators: {\n                        '*': function(options) {\n                            return validatePaintProperty(extend({layerType: type}, options));\n                        }\n                    }\n                });\n            }\n        }\n    }));\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_layer.js\n// module id = 634\n// module chunks = 0 1","'use strict';\n\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validatePaintProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['paint_' + options.layerType];\n\n    var transitionMatch = propertyKey.match(/^(.*)-transition$/);\n\n    if (transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n        return validate({\n            key: key,\n            value: value,\n            valueSpec: styleSpec.transition,\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else if (options.valueSpec || layerSpec[propertyKey]) {\n        return validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        });\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_paint_property.js\n// module id = 635\n// module chunks = 0 1","'use strict';\n\nvar validate = require('./validate');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateLayoutProperty(options) {\n    var key = options.key;\n    var style = options.style;\n    var styleSpec = options.styleSpec;\n    var value = options.value;\n    var propertyKey = options.objectKey;\n    var layerSpec = styleSpec['layout_' + options.layerType];\n\n    if (options.valueSpec || layerSpec[propertyKey]) {\n        var errors = [];\n\n        if (options.layerType === 'symbol') {\n            if (propertyKey === 'icon-image' && style && !style.sprite) {\n                errors.push(new ValidationError(key, value, 'use of \"icon-image\" requires a style \"sprite\" property'));\n            } else if (propertyKey === 'text-field' && style && !style.glyphs) {\n                errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n            }\n        }\n\n        return errors.concat(validate({\n            key: options.key,\n            value: value,\n            valueSpec: options.valueSpec || layerSpec[propertyKey],\n            style: style,\n            styleSpec: styleSpec\n        }));\n\n    } else {\n        return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_layout_property.js\n// module id = 636\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar unbundle = require('../util/unbundle_jsonlint');\nvar validateObject = require('./validate_object');\nvar validateEnum = require('./validate_enum');\n\nmodule.exports = function validateSource(options) {\n    var value = options.value;\n    var key = options.key;\n    var styleSpec = options.styleSpec;\n    var style = options.style;\n\n    if (!value.type) {\n        return [new ValidationError(key, value, '\"type\" is required')];\n    }\n\n    var type = unbundle(value.type);\n    switch (type) {\n        case 'vector':\n        case 'raster':\n            var errors = [];\n            errors = errors.concat(validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_tile,\n                style: options.style,\n                styleSpec: styleSpec\n            }));\n            if ('url' in value) {\n                for (var prop in value) {\n                    if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n                        errors.push(new ValidationError(key + '.' + prop, value[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop));\n                    }\n                }\n            }\n            return errors;\n\n        case 'geojson':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_geojson,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'video':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_video,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        case 'image':\n            return validateObject({\n                key: key,\n                value: value,\n                valueSpec: styleSpec.source_image,\n                style: style,\n                styleSpec: styleSpec\n            });\n\n        default:\n            return validateEnum({\n                key: key + '.type',\n                value: value.type,\n                valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image']},\n                style: style,\n                styleSpec: styleSpec\n            });\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_source.js\n// module id = 637\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateString(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'string expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_string.js\n// module id = 638\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n    API_URL: 'https://api.mapbox.com',\n    REQUIRE_ACCESS_TOKEN: true\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/config.js\n// module id = 639\n// module chunks = 0 1","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t    counter = 0,\n\t\t    length = string.length,\n\t\t    value,\n\t\t    extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t//  0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t    inputLength = input.length,\n\t\t    out,\n\t\t    i = 0,\n\t\t    n = initialN,\n\t\t    bias = initialBias,\n\t\t    basic,\n\t\t    j,\n\t\t    index,\n\t\t    oldi,\n\t\t    w,\n\t\t    k,\n\t\t    digit,\n\t\t    t,\n\t\t    /** Cached calculation results */\n\t\t    baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t    delta,\n\t\t    handledCPCount,\n\t\t    basicLength,\n\t\t    bias,\n\t\t    j,\n\t\t    m,\n\t\t    q,\n\t\t    k,\n\t\t    t,\n\t\t    currentValue,\n\t\t    output = [],\n\t\t    /** `inputLength` will hold the number of code points in `input`. */\n\t\t    inputLength,\n\t\t    /** Cached calculation results */\n\t\t    handledCPCountPlusOne,\n\t\t    baseMinusT,\n\t\t    qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/node-libs-browser/node_modules/punycode/punycode.js\n// module id = 640\n// module chunks = 0 1","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/index.js\n// module id = 641\n// module chunks = 0 1","'use strict';\n\nmodule.exports = AnimationLoop;\n\nfunction AnimationLoop() {\n    this.n = 0;\n    this.times = [];\n}\n\n// Are all animations done?\nAnimationLoop.prototype.stopped = function() {\n    this.times = this.times.filter(function(t) {\n        return t.time >= (new Date()).getTime();\n    });\n    return !this.times.length;\n};\n\n// Add a new animation that will run t milliseconds\n// Returns an id that can be used to cancel it layer\nAnimationLoop.prototype.set = function(t) {\n    this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n    return this.n++;\n};\n\n// Cancel an animation\nAnimationLoop.prototype.cancel = function(n) {\n    this.times = this.times.filter(function(t) {\n        return t.id !== n;\n    });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/animation_loop.js\n// module id = 642\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\n\nvar sourceTypes = {\n    'vector': require('../source/vector_tile_source'),\n    'raster': require('../source/raster_tile_source'),\n    'geojson': require('../source/geojson_source'),\n    'video': require('../source/video_source'),\n    'image': require('../source/image_source')\n};\n\n/*\n * Creates a tiled data source instance given an options object.\n *\n * @param {string} id\n * @param {Object} source A source definition object compliant with [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, with that type's requirements.\n * @param {string} options.type A source type like `raster`, `vector`, `video`, etc.\n * @param {Dispatcher} dispatcher\n * @returns {Source}\n */\nexports.create = function(id, source, dispatcher) {\n    source = new sourceTypes[source.type](id, source, dispatcher);\n\n    if (source.id !== id) {\n        throw new Error('Expected Source id to be ' + id + ' instead of ' + source.id);\n    }\n\n    util.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);\n    return source;\n};\n\nexports.getType = function (name) {\n    return sourceTypes[name];\n};\n\nexports.setType = function (name, type) {\n    sourceTypes[name] = type;\n};\n\n/**\n * The `Source` interface must be implemented by each source type, including \"core\" types (`vector`, `raster`, `video`, etc.) and all custom, third-party types.\n *\n * @class Source\n * @private\n *\n * @param {string} id The id for the source. Must not be used by any existing source.\n * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always required).\n * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}.\n * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers.\n *\n * @fires load to indicate source data has been loaded, so that it's okay to call `loadTile`\n * @fires change to indicate source data has changed, so that any current caches should be flushed\n * @property {string} id The id for the source.  Must match the id passed to the constructor.\n * @property {number} minzoom\n * @property {number} maxzoom\n * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot.\n * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom level, `false` if not.\n * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false` if they are floor-ed to the nearest integer.\n */\n\n/**\n * An optional URL to a script which, when run by a Worker, registers a {@link WorkerSource} implementation for this Source type by calling `self.registerWorkerSource(workerSource: WorkerSource)`.\n *\n * @member {URL|undefined} workerSourceURL\n * @memberof Source\n * @static\n */\n\n/**\n * @method\n * @name loadTile\n * @param {Tile} tile\n * @param {Funtion} callback Called when tile has been loaded\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name abortTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name unloadTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name serialize\n * @returns {Object} A plain (stringifiable) JS object representing the current state of the source. Creating a source using the returned object as the `options` should result in a Source that is equivalent to this one.\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name prepare\n * @memberof Source\n * @instance\n */\n\n\n\n/**\n * May be implemented by custom source types to provide code that can be run on\n * the WebWorkers. In addition to providing a custom\n * {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource`\n * implementation may also be targeted by the {@link Source} via\n * `dispatcher.send('source-type.methodname', params, callback)`.\n *\n * @see {@link Map#addSourceType}\n * @private\n *\n * @class WorkerSource\n * @param {Actor} actor\n * @param {object} styleLayers An accessor provided by the Worker to get the current style layers and layer families.\n * @param {Function} styleLayers.getLayers\n * @param {Function} styleLayers.getLayerFamilies\n */\n\n/**\n * Loads a tile from the given params and parse it into buckets ready to send\n * back to the main thread for rendering.  Should call the callback with:\n * `{ buckets, featureIndex, collisionTile, symbolInstancesArray, symbolQuadsArray, rawTileData}`.\n *\n * @method\n * @name loadTile\n * @param {object} params Parameters sent by the main-thread Source identifying the tile to load.\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Re-parses a tile that has already been loaded.  Yields the same data as\n * {@link WorkerSource#loadTile}.\n *\n * @method\n * @name reloadTile\n * @param {object} params\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Aborts loading a tile that is in progress.\n * @method\n * @name abortTile\n * @param {object} params\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Removes this tile from any local caches.\n * @method\n * @name removeTile\n * @memberof WorkerSource\n * @instance\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/source.js\n// module id = 643\n// module chunks = 0 1","'use strict';\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\nvar normalizeURL = require('../util/mapbox').normalizeSourceURL;\n\nmodule.exports = function(options, callback) {\n    var loaded = function(err, tileJSON) {\n        if (err) {\n            return callback(err);\n        }\n\n        var result = util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution']);\n\n        if (tileJSON.vector_layers) {\n            result.vectorLayers = tileJSON.vector_layers;\n            result.vectorLayerIds = result.vectorLayers.map(function(layer) { return layer.id; });\n        }\n\n        callback(null, result);\n    };\n\n    if (options.url) {\n        ajax.getJSON(normalizeURL(options.url), loaded);\n    } else {\n        browser.frame(loaded.bind(null, null, options));\n    }\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/load_tilejson.js\n// module id = 644\n// module chunks = 0 1","'use strict';\n\nvar quickselect = require('quickselect');\nvar calculateSignedArea = require('./util').calculateSignedArea;\n\n// classifies an array of rings into polygons with outer rings and holes\nmodule.exports = function classifyRings(rings, maxRings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        rings[i].area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrages with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (var j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n};\n\nfunction compareAreas(a, b) {\n    return b.area - a.area;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/classify_rings.js\n// module id = 645\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = Anchor;\n\nfunction Anchor(x, y, angle, segment) {\n    this.x = x;\n    this.y = y;\n    this.angle = angle;\n\n    if (segment !== undefined) {\n        this.segment = segment;\n    }\n}\n\nAnchor.prototype = Object.create(Point.prototype);\n\nAnchor.prototype.clone = function() {\n    return new Anchor(this.x, this.y, this.angle, this.segment);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/anchor.js\n// module id = 646\n// module chunks = 0 1","'use strict';\n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties, text) {\n    return text.replace(/{([^{}]+)}/g, function(match, key) {\n        return key in properties ? properties[key] : '';\n    });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/token.js\n// module id = 647\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = {\n    getIconQuads: getIconQuads,\n    getGlyphQuads: getGlyphQuads,\n    SymbolQuad: SymbolQuad\n};\n\nvar minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} anchorAngle The angle of the label at it's center, not the angle of this quad.\n * @param {number} glyphAngle The angle of the glyph to be positioned in the quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, anchorAngle, glyphAngle, minScale, maxScale) {\n    this.anchorPoint = anchorPoint;\n    this.tl = tl;\n    this.tr = tr;\n    this.bl = bl;\n    this.br = br;\n    this.tex = tex;\n    this.anchorAngle = anchorAngle;\n    this.glyphAngle = glyphAngle;\n    this.minScale = minScale;\n    this.maxScale = maxScale;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @param {Shaping} shapedText Shaping for corresponding text\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shapedText, globalProperties, featureProperties) {\n    var rect = shapedIcon.image.rect;\n    var layout = layer.layout;\n\n    var border = 1;\n    var left = shapedIcon.left - border;\n    var right = left + rect.w / shapedIcon.image.pixelRatio;\n    var top = shapedIcon.top - border;\n    var bottom = top + rect.h / shapedIcon.image.pixelRatio;\n    var tl, tr, br, bl;\n\n    // text-fit mode\n    if (layout['icon-text-fit'] !== 'none' && shapedText) {\n        var iconWidth = (right - left),\n            iconHeight = (bottom - top),\n            size = layout['text-size'] / 24,\n            textLeft = shapedText.left * size,\n            textRight = shapedText.right * size,\n            textTop = shapedText.top * size,\n            textBottom = shapedText.bottom * size,\n            textWidth = textRight - textLeft,\n            textHeight = textBottom - textTop,\n            padT = layout['icon-text-fit-padding'][0],\n            padR = layout['icon-text-fit-padding'][1],\n            padB = layout['icon-text-fit-padding'][2],\n            padL = layout['icon-text-fit-padding'][3],\n            offsetY = layout['icon-text-fit'] === 'width' ? (textHeight - iconHeight) * 0.5 : 0,\n            offsetX = layout['icon-text-fit'] === 'height' ? (textWidth - iconWidth) * 0.5 : 0,\n            width = layout['icon-text-fit'] === 'width' || layout['icon-text-fit'] === 'both' ? textWidth : iconWidth,\n            height = layout['icon-text-fit'] === 'height' || layout['icon-text-fit'] === 'both' ? textHeight : iconHeight;\n        tl = new Point(textLeft + offsetX - padL,         textTop + offsetY - padT);\n        tr = new Point(textLeft + offsetX + padR + width, textTop + offsetY - padT);\n        br = new Point(textLeft + offsetX + padR + width, textTop + offsetY + padB + height);\n        bl = new Point(textLeft + offsetX - padL,         textTop + offsetY + padB + height);\n    // Normal icon size mode\n    } else {\n        tl = new Point(left, top);\n        tr = new Point(right, top);\n        br = new Point(right, bottom);\n        bl = new Point(left, bottom);\n    }\n\n    var angle = layer.getLayoutValue('icon-rotate', globalProperties, featureProperties) * Math.PI / 180;\n    if (alongLine) {\n        var prev = line[anchor.segment];\n        if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) {\n            var next = line[anchor.segment + 1];\n            angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI;\n        } else {\n            angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n        }\n    }\n\n    if (angle) {\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle),\n            matrix = [cos, -sin, sin, cos];\n\n        tl = tl.matMult(matrix);\n        tr = tr.matMult(matrix);\n        bl = bl.matMult(matrix);\n        br = br.matMult(matrix);\n    }\n\n    return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array<Array<Point>>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array<SymbolQuad>}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine) {\n\n    var textRotate = layer.layout['text-rotate'] * Math.PI / 180;\n    var keepUpright = layer.layout['text-keep-upright'];\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n    var quads = [];\n\n    for (var k = 0; k < positionedGlyphs.length; k++) {\n        var positionedGlyph = positionedGlyphs[k];\n        var glyph = positionedGlyph.glyph;\n        var rect = glyph.rect;\n\n        if (!rect) continue;\n\n        var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n        var glyphInstances;\n        var labelMinScale = minScale;\n        if (alongLine) {\n            glyphInstances = [];\n            labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n            if (keepUpright) {\n                labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n            }\n\n        } else {\n            glyphInstances = [{\n                anchorPoint: new Point(anchor.x, anchor.y),\n                offset: 0,\n                angle: 0,\n                maxScale: Infinity,\n                minScale: minScale\n            }];\n        }\n\n        var x1 = positionedGlyph.x + glyph.left,\n            y1 = positionedGlyph.y - glyph.top,\n            x2 = x1 + rect.w,\n            y2 = y1 + rect.h,\n\n            otl = new Point(x1, y1),\n            otr = new Point(x2, y1),\n            obl = new Point(x1, y2),\n            obr = new Point(x2, y2);\n\n        for (var i = 0; i < glyphInstances.length; i++) {\n\n            var instance = glyphInstances[i],\n                tl = otl,\n                tr = otr,\n                bl = obl,\n                br = obr;\n\n            if (textRotate) {\n                var sin = Math.sin(textRotate),\n                    cos = Math.cos(textRotate),\n                    matrix = [cos, -sin, sin, cos];\n\n                tl = tl.matMult(matrix);\n                tr = tr.matMult(matrix);\n                bl = bl.matMult(matrix);\n                br = br.matMult(matrix);\n            }\n\n            // Prevent label from extending past the end of the line\n            var glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n            var anchorAngle = (anchor.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            var glyphAngle = (instance.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n            quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, anchorAngle, glyphAngle, glyphMinScale, instance.maxScale));\n        }\n    }\n\n    return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array<Object>} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array<Point>} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array<Object>} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n    var upsideDown = !forward;\n\n    if (offset < 0) forward = !forward;\n\n    if (forward) segment++;\n\n    var newAnchorPoint = new Point(anchor.x, anchor.y);\n    var end = line[segment];\n    var prevScale = Infinity;\n\n    offset = Math.abs(offset);\n\n    var placementScale = minScale;\n\n    while (true) {\n        var distance = newAnchorPoint.dist(end);\n        var scale = offset / distance;\n\n        // Get the angle of the line segment\n        var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n        if (!forward) angle += Math.PI;\n\n        glyphs.push({\n            anchorPoint: newAnchorPoint,\n            offset: upsideDown ? Math.PI : 0,\n            minScale: scale,\n            maxScale: prevScale,\n            angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n        });\n\n        if (scale <= placementScale) break;\n\n        newAnchorPoint = end;\n\n        // skip duplicate nodes\n        while (newAnchorPoint.equals(end)) {\n            segment += forward ? 1 : -1;\n            end = line[segment];\n            if (!end) {\n                return scale;\n            }\n        }\n\n        var unit = end.sub(newAnchorPoint)._unit();\n        newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n        prevScale = scale;\n    }\n\n    return placementScale;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/quads.js\n// module id = 648\n// module chunks = 0 1","'use strict';\n\nvar isCounterClockwise = require('./util').isCounterClockwise;\n\nmodule.exports = {\n    multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint,\n    multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon,\n    multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine,\n    distToSegmentSquared: distToSegmentSquared\n};\n\nfunction multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) {\n    for (var j = 0; j < multiPolygon.length; j++) {\n        var polygon = multiPolygon[j];\n        for (var i = 0; i < rings.length; i++) {\n            var ring = rings[i];\n            for (var k = 0; k < ring.length; k++) {\n                var point = ring[k];\n                if (polygonContainsPoint(polygon, point)) return true;\n                if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) {\n\n    if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) {\n        return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]);\n    }\n\n    for (var m = 0; m < multiPolygonB.length; m++) {\n        var ring = multiPolygonB[m];\n        for (var n = 0; n < ring.length; n++) {\n            if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true;\n        }\n    }\n\n    for (var j = 0; j < multiPolygonA.length; j++) {\n        var polygon = multiPolygonA[j];\n        for (var i = 0; i < polygon.length; i++) {\n            if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true;\n        }\n\n        for (var k = 0; k < multiPolygonB.length; k++) {\n            if (lineIntersectsLine(polygon, multiPolygonB[k])) return true;\n        }\n    }\n\n    return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) {\n    for (var i = 0; i < multiLine.length; i++) {\n        var line = multiLine[i];\n\n        for (var j = 0; j < multiPolygon.length; j++) {\n            var polygon = multiPolygon[j];\n\n            if (polygon.length >= 3) {\n                for (var k = 0; k < line.length; k++) {\n                    if (polygonContainsPoint(polygon, line[k])) return true;\n                }\n            }\n\n            if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA, lineB, radius) {\n\n    if (lineA.length > 1) {\n        if (lineIntersectsLine(lineA, lineB)) return true;\n\n        // Check whether any point in either line is within radius of the other line\n        for (var j = 0; j < lineB.length; j++) {\n            if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n        }\n    }\n\n    for (var k = 0; k < lineA.length; k++) {\n        if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n    }\n\n    return false;\n}\n\nfunction lineIntersectsLine(lineA, lineB) {\n    for (var i = 0; i < lineA.length - 1; i++) {\n        var a0 = lineA[i];\n        var a1 = lineA[i + 1];\n        for (var j = 0; j < lineB.length - 1; j++) {\n            var b0 = lineB[j];\n            var b1 = lineB[j + 1];\n            if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {\n    return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n        isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p, line, radius) {\n    var radiusSquared = radius * radius;\n\n    if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n    for (var i = 1; i < line.length; i++) {\n        // Find line segments that have a distance <= radius^2 to p\n        // In that case, we treat the line as \"containing point p\".\n        var v = line[i - 1], w = line[i];\n        if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n    }\n    return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n    var l2 = v.distSqr(w);\n    if (l2 === 0) return p.distSqr(v);\n    var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n    if (t < 0) return p.distSqr(v);\n    if (t > 1) return p.distSqr(w);\n    return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings, p) {\n    var c = false,\n        ring, p1, p2;\n\n    for (var k = 0; k < rings.length; k++) {\n        ring = rings[k];\n        for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            p1 = ring[i];\n            p2 = ring[j];\n            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n                c = !c;\n            }\n        }\n    }\n    return c;\n}\n\nfunction polygonContainsPoint(ring, p) {\n    var c = false;\n    for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        var p1 = ring[i];\n        var p2 = ring[j];\n        if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n            c = !c;\n        }\n    }\n    return c;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/intersection_tests.js\n// module id = 649\n// module chunks = 0 1","'use strict';\n\nvar Source = require('./source');\nvar Tile = require('./tile');\nvar Evented = require('../util/evented');\nvar TileCoord = require('./tile_coord');\nvar Cache = require('../util/lru_cache');\nvar Coordinate = require('../geo/coordinate');\nvar util = require('../util/util');\nvar EXTENT = require('../data/bucket').EXTENT;\n\nmodule.exports = SourceCache;\n\n/**\n * A tile pyramid is a specialized cache and datastructure\n * that contains tiles. It's used by sources to manage their\n * data.\n *\n * @param {Object} options\n * @private\n */\nfunction SourceCache(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n\n    var source = this._source = Source.create(id, options, dispatcher)\n    .on('load', function () {\n        if (this.map && this._source.onAdd) { this._source.onAdd(this.map); }\n\n        this._sourceLoaded = true;\n\n        this.tileSize = source.tileSize;\n        this.minzoom = source.minzoom;\n        this.maxzoom = source.maxzoom;\n        this.roundZoom = source.roundZoom;\n        this.reparseOverscaled = source.reparseOverscaled;\n        this.isTileClipped = source.isTileClipped;\n        this.attribution = source.attribution;\n\n        this.vectorLayerIds = source.vectorLayerIds;\n\n        this.fire('load');\n    }.bind(this))\n    .on('error', function (e) {\n        this._sourceErrored = true;\n        this.fire('error', e);\n    }.bind(this))\n    .on('change', function () {\n        this.reload();\n        if (this.transform) {\n            this.update(this.transform, this.map && this.map.style.rasterFadeDuration);\n        }\n        this.fire('change');\n    }.bind(this));\n\n    this._tiles = {};\n    this._cache = new Cache(0, this.unloadTile.bind(this));\n\n    this._isIdRenderable = this._isIdRenderable.bind(this);\n}\n\n\nSourceCache.maxOverzooming = 10;\nSourceCache.maxUnderzooming = 3;\n\nSourceCache.prototype = util.inherit(Evented, {\n    onAdd: function (map) {\n        this.map = map;\n        if (this._source && this._source.onAdd) {\n            this._source.onAdd(map);\n        }\n    },\n\n    /**\n     * Return true if no tile data is pending, tiles will not change unless\n     * an additional API call is received.\n     * @returns {boolean}\n     * @private\n     */\n    loaded: function() {\n        if (this._sourceErrored) { return true; }\n        if (!this._sourceLoaded) { return false; }\n        for (var t in this._tiles) {\n            var tile = this._tiles[t];\n            if (tile.state !== 'loaded' && tile.state !== 'errored')\n                return false;\n        }\n        return true;\n    },\n\n    /**\n     * @returns {Source} The underlying source object\n     * @private\n     */\n    getSource: function () {\n        return this._source;\n    },\n\n    loadTile: function (tile, callback) {\n        return this._source.loadTile(tile, callback);\n    },\n\n    unloadTile: function (tile) {\n        if (this._source.unloadTile)\n            return this._source.unloadTile(tile);\n    },\n\n    abortTile: function (tile) {\n        if (this._source.abortTile)\n            return this._source.abortTile(tile);\n    },\n\n    serialize: function () {\n        return this._source.serialize();\n    },\n\n    prepare: function () {\n        if (this._sourceLoaded && this._source.prepare)\n            return this._source.prepare();\n    },\n\n    /**\n     * Return all tile ids ordered with z-order, and cast to numbers\n     * @returns {Array<number>} ids\n     * @private\n     */\n    getIds: function() {\n        return Object.keys(this._tiles).map(Number).sort(compareKeyZoom);\n    },\n\n    getRenderableIds: function() {\n        return this.getIds().filter(this._isIdRenderable);\n    },\n\n    _isIdRenderable: function(id) {\n        return this._tiles[id].isRenderable() && !this._coveredTiles[id];\n    },\n\n    reload: function() {\n        this._cache.reset();\n        for (var i in this._tiles) {\n            var tile = this._tiles[i];\n\n            // The difference between \"loading\" tiles and \"reloading\" tiles is\n            // that \"reloading\" tiles are \"renderable\". Therefore, a \"loading\"\n            // tile cannot become a \"reloading\" tile without first becoming\n            // a \"loaded\" tile.\n            if (tile.state !== 'loading') {\n                tile.state = 'reloading';\n            }\n\n            this.loadTile(this._tiles[i], this._tileLoaded.bind(this, this._tiles[i]));\n        }\n    },\n\n    _tileLoaded: function (tile, err) {\n        if (err) {\n            tile.state = 'errored';\n            this.fire('tile.error', {tile: tile, error: err});\n            this._source.fire('tile.error', {tile: tile, error: err});\n            return;\n        }\n\n        tile.source = this;\n        tile.timeAdded = new Date().getTime();\n        this.fire('tile.load', {tile: tile});\n        this._source.fire('tile.load', {tile: tile});\n    },\n\n    /**\n     * Get a specific tile by TileCoordinate\n     * @param {TileCoordinate} coord\n     * @returns {Object} tile\n     * @private\n     */\n    getTile: function(coord) {\n        return this.getTileByID(coord.id);\n    },\n\n    /**\n     * Get a specific tile by id\n     * @param {number|string} id\n     * @returns {Object} tile\n     * @private\n     */\n    getTileByID: function(id) {\n        return this._tiles[id];\n    },\n\n    /**\n     * get the zoom level adjusted for the difference in map and source tilesizes\n     * @param {Object} transform\n     * @returns {number} zoom level\n     * @private\n     */\n    getZoom: function(transform) {\n        return transform.zoom + transform.scaleZoom(transform.tileSize / this.tileSize);\n    },\n\n    /**\n     * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n     * adds found tiles to retain object; returns true if any child is found.\n     *\n     * @param {Coordinate} coord\n     * @param {number} maxCoveringZoom\n     * @param {boolean} retain\n     * @returns {boolean} whether the operation was complete\n     * @private\n     */\n    findLoadedChildren: function(coord, maxCoveringZoom, retain) {\n        var found = false;\n\n        for (var id in this._tiles) {\n            var tile = this._tiles[id];\n\n            // only consider renderable tiles on higher zoom levels (up to maxCoveringZoom)\n            if (retain[id] || !tile.isRenderable() || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue;\n\n            // disregard tiles that are not descendants of the given tile coordinate\n            var z2 = Math.pow(2, Math.min(tile.coord.z, this.maxzoom) - Math.min(coord.z, this.maxzoom));\n            if (Math.floor(tile.coord.x / z2) !== coord.x ||\n                Math.floor(tile.coord.y / z2) !== coord.y)\n                continue;\n\n            // found loaded child\n            retain[id] = true;\n            found = true;\n\n            // loop through parents; retain the topmost loaded one if found\n            while (tile && tile.coord.z - 1 > coord.z) {\n                var parentId = tile.coord.parent(this.maxzoom).id;\n                tile = this._tiles[parentId];\n\n                if (tile && tile.isRenderable()) {\n                    delete retain[id];\n                    retain[parentId] = true;\n                }\n            }\n        }\n        return found;\n    },\n\n    /**\n     * Find a loaded parent of the given tile (up to minCoveringZoom);\n     * adds the found tile to retain object and returns the tile if found\n     *\n     * @param {Coordinate} coord\n     * @param {number} minCoveringZoom\n     * @param {boolean} retain\n     * @returns {Tile} tile object\n     * @private\n     */\n    findLoadedParent: function(coord, minCoveringZoom, retain) {\n        for (var z = coord.z - 1; z >= minCoveringZoom; z--) {\n            coord = coord.parent(this.maxzoom);\n            var tile = this._tiles[coord.id];\n            if (tile && tile.isRenderable()) {\n                retain[coord.id] = true;\n                return tile;\n            }\n            if (this._cache.has(coord.id)) {\n                this.addTile(coord);\n                retain[coord.id] = true;\n                return this._tiles[coord.id];\n            }\n        }\n    },\n\n    /**\n     * Resizes the tile cache based on the current viewport's size.\n     *\n     * Larger viewports use more tiles and need larger caches. Larger viewports\n     * are more likely to be found on devices with more memory and on pages where\n     * the map is more important.\n     *\n     * @private\n     */\n    updateCacheSize: function(transform) {\n        var widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1;\n        var heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1;\n        var approxTilesInView = widthInTiles * heightInTiles;\n        var commonZoomRange = 5;\n        this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange));\n    },\n\n    /**\n     * Removes tiles that are outside the viewport and adds new tiles that\n     * are inside the viewport.\n     * @private\n     */\n    update: function(transform, fadeDuration) {\n        if (!this._sourceLoaded) { return; }\n        var i;\n        var coord;\n        var tile;\n\n        this.updateCacheSize(transform);\n\n        // Determine the overzooming/underzooming amounts.\n        var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n        var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this.minzoom);\n        var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming,  this.minzoom);\n\n        // Retain is a list of tiles that we shouldn't delete, even if they are not\n        // the most ideal tile for the current viewport. This may include tiles like\n        // parent or child tiles that are *already* loaded.\n        var retain = {};\n        var now = new Date().getTime();\n\n        // Covered is a list of retained tiles who's areas are full covered by other,\n        // better, retained tiles. They are not drawn separately.\n        this._coveredTiles = {};\n\n        var required = this.used ? transform.coveringTiles(this._source) : [];\n        for (i = 0; i < required.length; i++) {\n            coord = required[i];\n            tile = this.addTile(coord);\n\n            retain[coord.id] = true;\n\n            if (tile.isRenderable())\n                continue;\n\n            // The tile we require is not yet loaded.\n            // Retain child or parent tiles that cover the same area.\n            if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                this.findLoadedParent(coord, minCoveringZoom, retain);\n            }\n        }\n\n        var parentsForFading = {};\n\n        var ids = Object.keys(retain);\n        for (var k = 0; k < ids.length; k++) {\n            var id = ids[k];\n            coord = TileCoord.fromID(id);\n            tile = this._tiles[id];\n            if (tile && tile.timeAdded > now - (fadeDuration || 0)) {\n                // This tile is still fading in. Find tiles to cross-fade with it.\n                if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n                    retain[id] = true;\n                }\n                this.findLoadedParent(coord, minCoveringZoom, parentsForFading);\n            }\n        }\n\n        var fadedParent;\n        for (fadedParent in parentsForFading) {\n            if (!retain[fadedParent]) {\n                // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n                this._coveredTiles[fadedParent] = true;\n            }\n        }\n        for (fadedParent in parentsForFading) {\n            retain[fadedParent] = true;\n        }\n\n        // Remove the tiles we don't need anymore.\n        var remove = util.keysDifference(this._tiles, retain);\n        for (i = 0; i < remove.length; i++) {\n            this.removeTile(+remove[i]);\n        }\n\n        this.transform = transform;\n    },\n\n    /**\n     * Add a tile, given its coordinate, to the pyramid.\n     * @param {Coordinate} coord\n     * @returns {Coordinate} the coordinate.\n     * @private\n     */\n    addTile: function(coord) {\n        var tile = this._tiles[coord.id];\n        if (tile)\n            return tile;\n\n        var wrapped = coord.wrapped();\n        tile = this._tiles[wrapped.id];\n\n        if (!tile) {\n            tile = this._cache.get(wrapped.id);\n            if (tile && this._redoPlacement) {\n                this._redoPlacement(tile);\n            }\n        }\n\n        if (!tile) {\n            var zoom = coord.z;\n            var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1;\n            tile = new Tile(wrapped, this.tileSize * overscaling, this.maxzoom);\n            this.loadTile(tile, this._tileLoaded.bind(this, tile));\n        }\n\n        tile.uses++;\n        this._tiles[coord.id] = tile;\n        this.fire('tile.add', {tile: tile});\n        this._source.fire('tile.add', {tile: tile});\n\n        return tile;\n    },\n\n    /**\n     * Remove a tile, given its id, from the pyramid\n     * @param {string|number} id tile id\n     * @returns {undefined} nothing\n     * @private\n     */\n    removeTile: function(id) {\n        var tile = this._tiles[id];\n        if (!tile)\n            return;\n\n        tile.uses--;\n        delete this._tiles[id];\n        this.fire('tile.remove', {tile: tile});\n        this._source.fire('tile.remove', {tile: tile});\n\n        if (tile.uses > 0)\n            return;\n\n        if (tile.isRenderable()) {\n            this._cache.add(tile.coord.wrapped().id, tile);\n        } else {\n            tile.aborted = true;\n            this.abortTile(tile);\n            this.unloadTile(tile);\n        }\n    },\n\n    /**\n     * Remove all tiles from this pyramid\n     * @private\n     */\n    clearTiles: function() {\n        for (var id in this._tiles)\n            this.removeTile(id);\n        this._cache.reset();\n    },\n\n    /**\n     * Search through our current tiles and attempt to find the tiles that\n     * cover the given bounds.\n     * @param {Array<Coordinate>} queryGeometry coordinates of the corners of bounding rectangle\n     * @returns {Array<Object>} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.\n     * @private\n     */\n    tilesIn: function(queryGeometry) {\n        var tileResults = {};\n        var ids = this.getIds();\n\n        var minX = Infinity;\n        var minY = Infinity;\n        var maxX = -Infinity;\n        var maxY = -Infinity;\n        var z = queryGeometry[0].zoom;\n\n        for (var k = 0; k < queryGeometry.length; k++) {\n            var p = queryGeometry[k];\n            minX = Math.min(minX, p.column);\n            minY = Math.min(minY, p.row);\n            maxX = Math.max(maxX, p.column);\n            maxY = Math.max(maxY, p.row);\n        }\n\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this._tiles[ids[i]];\n            var coord = TileCoord.fromID(ids[i]);\n\n            var tileSpaceBounds = [\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)),\n                coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z))\n            ];\n\n            if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT &&\n                tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) {\n\n                var tileSpaceQueryGeometry = [];\n                for (var j = 0; j < queryGeometry.length; j++) {\n                    tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j]));\n                }\n\n                var tileResult = tileResults[tile.coord.id];\n                if (tileResult === undefined) {\n                    tileResult = tileResults[tile.coord.id] = {\n                        tile: tile,\n                        coord: coord,\n                        queryGeometry: [],\n                        scale: Math.pow(2, this.transform.zoom - tile.coord.z)\n                    };\n                }\n\n                // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts\n                tileResult.queryGeometry.push(tileSpaceQueryGeometry);\n            }\n        }\n\n        var results = [];\n        for (var t in tileResults) {\n            results.push(tileResults[t]);\n        }\n        return results;\n    },\n\n    redoPlacement: function () {\n        var ids = this.getIds();\n        for (var i = 0; i < ids.length; i++) {\n            var tile = this.getTileByID(ids[i]);\n            tile.redoPlacement(this);\n        }\n    },\n\n    getVisibleCoordinates: function () {\n        return this.getRenderableIds().map(TileCoord.fromID);\n    }\n});\n\n/**\n * Convert a coordinate to a point in a tile's coordinate space.\n * @param {Coordinate} tileCoord\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\nfunction coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) {\n    var zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom));\n    return {\n        x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT,\n        y: (zoomedCoord.row - tileCoord.y) * EXTENT\n    };\n\n}\n\nfunction compareKeyZoom(a, b) {\n    return (a % 32) - (b % 32);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/source_cache.js\n// module id = 650\n// module chunks = 0 1","'use strict';\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n    var cells = this.cells = [];\n\n    if (extent instanceof ArrayBuffer) {\n        this.arrayBuffer = extent;\n        var array = new Int32Array(this.arrayBuffer);\n        extent = array[0];\n        n = array[1];\n        padding = array[2];\n\n        this.d = n + 2 * padding;\n        for (var k = 0; k < this.d * this.d; k++) {\n            var start = array[NUM_PARAMS + k];\n            var end = array[NUM_PARAMS + k + 1];\n            cells.push(start === end ?\n                    null :\n                    array.subarray(start, end));\n        }\n        var keysOffset = array[NUM_PARAMS + cells.length];\n        var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n        this.keys = array.subarray(keysOffset, bboxesOffset);\n        this.bboxes = array.subarray(bboxesOffset);\n\n        this.insert = this._insertReadonly;\n\n    } else {\n        this.d = n + 2 * padding;\n        for (var i = 0; i < this.d * this.d; i++) {\n            cells.push([]);\n        }\n        this.keys = [];\n        this.bboxes = [];\n    }\n\n    this.n = n;\n    this.extent = extent;\n    this.padding = padding;\n    this.scale = n / extent;\n    this.uid = 0;\n\n    var p = (padding / n) * extent;\n    this.min = -p;\n    this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n    this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n    this.keys.push(key);\n    this.bboxes.push(x1);\n    this.bboxes.push(y1);\n    this.bboxes.push(x2);\n    this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n    throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n    this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) {\n    var min = this.min;\n    var max = this.max;\n    if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {\n        // We use `Array#slice` because `this.keys` may be a `Int32Array` and\n        // some browsers (Safari and IE) do not support `TypedArray#slice`\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility\n        return Array.prototype.slice.call(this.keys);\n\n    } else {\n        var result = [];\n        var seenUids = {};\n        this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);\n        return result;\n    }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {\n    var cell = this.cells[cellIndex];\n    if (cell !== null) {\n        var keys = this.keys;\n        var bboxes = this.bboxes;\n        for (var u = 0; u < cell.length; u++) {\n            var uid = cell[u];\n            if (seenUids[uid] === undefined) {\n                var offset = uid * 4;\n                if (intersectionTest ?\n                    intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :\n                    ((x1 <= bboxes[offset + 2]) &&\n                    (y1 <= bboxes[offset + 3]) &&\n                    (x2 >= bboxes[offset + 0]) &&\n                    (y2 >= bboxes[offset + 1]))) {\n                    seenUids[uid] = true;\n                    result.push(keys[uid]);\n                } else {\n                    seenUids[uid] = false;\n                }\n            }\n        }\n    }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {\n    var cx1 = this._convertToCellCoord(x1);\n    var cy1 = this._convertToCellCoord(y1);\n    var cx2 = this._convertToCellCoord(x2);\n    var cy2 = this._convertToCellCoord(y2);\n    for (var x = cx1; x <= cx2; x++) {\n        for (var y = cy1; y <= cy2; y++) {\n            var cellIndex = this.d * y + x;\n            if (intersectionTest && !intersectionTest(\n                        this._convertFromCellCoord(x),\n                        this._convertFromCellCoord(y),\n                        this._convertFromCellCoord(x + 1),\n                        this._convertFromCellCoord(y + 1))) continue;\n            if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) return;\n        }\n    }\n};\n\nGridIndex.prototype._convertFromCellCoord = function(x) {\n    return (x - this.padding) / this.scale;\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n    return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n    if (this.arrayBuffer) return this.arrayBuffer;\n\n    var cells = this.cells;\n\n    var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n    var totalCellLength = 0;\n    for (var i = 0; i < this.cells.length; i++) {\n        totalCellLength += this.cells[i].length;\n    }\n\n    var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n    array[0] = this.extent;\n    array[1] = this.n;\n    array[2] = this.padding;\n\n    var offset = metadataLength;\n    for (var k = 0; k < cells.length; k++) {\n        var cell = cells[k];\n        array[NUM_PARAMS + k] = offset;\n        array.set(cell, offset);\n        offset += cell.length;\n    }\n\n    array[NUM_PARAMS + cells.length] = offset;\n    array.set(this.keys, offset);\n    offset += this.keys.length;\n\n    array[NUM_PARAMS + cells.length + 1] = offset;\n    array.set(this.bboxes, offset);\n    offset += this.bboxes.length;\n\n    return array.buffer;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/grid-index/grid-index.js\n// module id = 651\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Feature;\n\nfunction Feature(vectorTileFeature, z, x, y) {\n    this._vectorTileFeature = vectorTileFeature;\n    vectorTileFeature._z = z;\n    vectorTileFeature._x = x;\n    vectorTileFeature._y = y;\n\n    this.properties = vectorTileFeature.properties;\n\n    if (vectorTileFeature.id != null) {\n        this.id = vectorTileFeature.id;\n    }\n}\n\nFeature.prototype = {\n    type: \"Feature\",\n\n    get geometry() {\n        if (this._geometry === undefined) {\n            this._geometry = this._vectorTileFeature.toGeoJSON(\n                this._vectorTileFeature._x,\n                this._vectorTileFeature._y,\n                this._vectorTileFeature._z).geometry;\n        }\n        return this._geometry;\n    },\n\n    set geometry(g) {\n        this._geometry = g;\n    },\n\n    toJSON: function() {\n        var json = {};\n        for (var i in this) {\n            if (i === '_geometry' || i === '_vectorTileFeature' || i === 'toJSON') continue;\n            json[i] = this[i];\n        }\n        return json;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/vectortile_to_geojson.js\n// module id = 652\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = function(uniforms) {\n    var pragmas = { define: {}, initialize: {} };\n\n    for (var i = 0; i < uniforms.length; i++) {\n        var uniform = uniforms[i];\n        assert(uniform.name.slice(0, 2) === 'u_');\n\n        var type = '{precision} ' + (uniform.components === 1 ? 'float' : 'vec' + uniform.components);\n        pragmas.define[uniform.name.slice(2)] = 'uniform ' + type + ' ' + uniform.name + ';\\n';\n        pragmas.initialize[uniform.name.slice(2)] = type + ' ' + uniform.name.slice(2) + ' = ' + uniform.name + ';\\n';\n    }\n\n    return pragmas;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/create_uniform_pragmas.js\n// module id = 653\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Attribution;\n\n/**\n * An `Attribution` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/).\n * Extends [`Control`](#Control).\n *\n * @class Attribution\n * @param {Object} [options]\n * @param {string} [options.position='bottom-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * var map = new mapboxgl.Map({attributionControl: false})\n *     .addControl(new mapboxgl.Attribution({position: 'top-left'}));\n */\nfunction Attribution(options) {\n    util.setOptions(this, options);\n}\n\nAttribution.createAttributionString = function(sources) {\n    var attributions = [];\n\n    for (var id in sources) {\n        var source = sources[id];\n        if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n            attributions.push(source.attribution);\n        }\n    }\n\n    // remove any entries that are substrings of another entry.\n    // first sort by length so that substrings come first\n    attributions.sort(function (a, b) { return a.length - b.length; });\n    attributions = attributions.filter(function (attrib, i) {\n        for (var j = i + 1; j < attributions.length; j++) {\n            if (attributions[j].indexOf(attrib) >= 0) { return false; }\n        }\n        return true;\n    });\n\n    return attributions.join(' | ');\n};\n\nAttribution.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-attrib',\n            container = this._container = DOM.create('div', className, map.getContainer());\n\n        this._update();\n        map.on('source.load', this._update.bind(this));\n        map.on('source.change', this._update.bind(this));\n        map.on('source.remove', this._update.bind(this));\n        map.on('moveend', this._updateEditLink.bind(this));\n\n        return container;\n    },\n\n    _update: function() {\n        if (this._map.style) {\n            this._container.innerHTML = Attribution.createAttributionString(this._map.style.sources);\n        }\n\n        this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0];\n        this._updateEditLink();\n    },\n\n    _updateEditLink: function() {\n        if (this._editLink) {\n            var center = this._map.getCenter();\n            this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' +\n                    center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1);\n        }\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/control/attribution.js\n// module id = 654\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Popup;\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\n\n/**\n * A popup component.\n *\n * @class Popup\n * @param {Object} [options]\n * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the\n *   top right corner of the popup.\n * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the\n *   map is clicked.\n * @param {string} [options.anchor] - A string indicating the popup's location relative to\n *   the coordinate set via [Popup#setLngLat](#Popup#setLngLat).\n *   Options are `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,\n *   `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be\n *   dynamically set to ensure the popup falls within the map container with a preference\n *   for `'bottom'`.\n * @param {number|PointLike|{[position: string]: PointLike}} [options.offset] -\n *  A pixel offset applied to the popup's location specified as:\n *   - a single number specifying a distance from the popup's location\n *   - a [`PointLike`](#PointLike) specifying a constant offset\n *   - an object of [`PointLike`](#PointLike)s specifing an offset for each anchor position\n *  Negative offsets indicate left and up.\n * @example\n * var popup = new mapboxgl.Popup()\n *   .setLngLat(e.lngLat)\n *   .setHTML(\"<h1>Hello World!</h1>\")\n *   .addTo(map);\n */\nfunction Popup(options) {\n    util.setOptions(this, options);\n    util.bindAll([\n        '_update',\n        '_onClickClose'],\n        this);\n}\n\nPopup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{\n    options: {\n        closeButton: true,\n        closeOnClick: true\n    },\n\n    /**\n     * Adds the popup to a map.\n     *\n     * @param {Map} map The Mapbox GL JS map to add the popup to.\n     * @returns {Popup} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        this._map.on('move', this._update);\n        if (this.options.closeOnClick) {\n            this._map.on('click', this._onClickClose);\n        }\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the popup from the map it has been added to.\n     *\n     * @example\n     * var popup = new mapboxgl.Popup().addTo(map);\n     * popup.remove();\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map.off('click', this._onClickClose);\n            delete this._map;\n        }\n\n        /**\n         * Fired when the popup is closed manually or programatically.\n         *\n         * @event close\n         * @memberof Popup\n         * @instance\n         * @type {Object}\n         * @property {Popup} popup object that was closed\n         */\n        this.fire('close');\n\n        return this;\n    },\n\n    /**\n     * Returns the geographical location of the popup's anchor.\n     *\n     * @returns {LngLat} The geographical location of the popup's anchor.\n     */\n    getLngLat: function() {\n        return this._lngLat;\n    },\n\n    /**\n     * Sets the geographical location of the popup's anchor, and moves the popup to it.\n     *\n     * @param {LngLatLike} lnglat The geographical location to set as the popup's anchor.\n     * @returns {Popup} `this`\n     */\n    setLngLat: function(lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Sets the popup's content to a string of text.\n     *\n     * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,\n     * so it cannot insert raw HTML. Use this method for security against XSS\n     * if the popup content is user-provided.\n     *\n     * @param {string} text Textual content for the popup.\n     * @returns {Popup} `this`\n     * @example\n     * var popup = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setText('Hello, world!')\n     *   .addTo(map);\n     */\n    setText: function(text) {\n        return this.setDOMContent(document.createTextNode(text));\n    },\n\n    /**\n     * Sets the popup's content to the HTML provided as a string.\n     *\n     * @param {string} html A string representing HTML content for the popup.\n     * @returns {Popup} `this`\n     */\n    setHTML: function(html) {\n        var frag = document.createDocumentFragment();\n        var temp = document.createElement('body'), child;\n        temp.innerHTML = html;\n        while (true) {\n            child = temp.firstChild;\n            if (!child) break;\n            frag.appendChild(child);\n        }\n\n        return this.setDOMContent(frag);\n    },\n\n    /**\n     * Sets the popup's content to the element provided as a DOM node.\n     *\n     * @param {Node} htmlNode A DOM node to be used as content for the popup.\n     * @returns {Popup} `this`\n     * @example\n     * // create an element with the popup content\n     * var div = document.createElement('div');\n     * div.innerHTML = 'Hello, world!';\n     * var popup = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setDOMContent(div)\n     *   .addTo(map);\n     */\n    setDOMContent: function(htmlNode) {\n        this._createContent();\n        this._content.appendChild(htmlNode);\n        this._update();\n        return this;\n    },\n\n    _createContent: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        this._content = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n        if (this.options.closeButton) {\n            this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content);\n            this._closeButton.type = 'button';\n            this._closeButton.innerHTML = '&#215;';\n            this._closeButton.addEventListener('click', this._onClickClose);\n        }\n    },\n\n    _update: function() {\n        if (!this._map || !this._lngLat || !this._content) { return; }\n\n        if (!this._container) {\n            this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n            this._tip       = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n            this._container.appendChild(this._content);\n        }\n\n        var anchor = this.options.anchor;\n        var offset = normalizeOffset(this.options.offset);\n        var pos = this._map.project(this._lngLat).round();\n\n        if (!anchor) {\n            var width = this._container.offsetWidth,\n                height = this._container.offsetHeight;\n\n            if (pos.y + offset.bottom[1] - height < 0) {\n                anchor = ['top'];\n            } else if (pos.y + offset.top[1] + height > this._map.transform.height) {\n                anchor = ['bottom'];\n            } else {\n                anchor = [];\n            }\n\n            if (pos.x < width / 2) {\n                anchor.push('left');\n            } else if (pos.x > this._map.transform.width - width / 2) {\n                anchor.push('right');\n            }\n\n            if (anchor.length === 0) {\n                anchor = 'bottom';\n            } else {\n                anchor = anchor.join('-');\n            }\n        }\n\n        var offsetedPos = pos.add(offset[anchor]);\n\n        var anchorTranslate = {\n            'top': 'translate(-50%,0)',\n            'top-left': 'translate(0,0)',\n            'top-right': 'translate(-100%,0)',\n            'bottom': 'translate(-50%,-100%)',\n            'bottom-left': 'translate(0,-100%)',\n            'bottom-right': 'translate(-100%,-100%)',\n            'left': 'translate(0,-50%)',\n            'right': 'translate(-100%,-50%)'\n        };\n\n        var classList = this._container.classList;\n        for (var key in anchorTranslate) {\n            classList.remove('mapboxgl-popup-anchor-' + key);\n        }\n        classList.add('mapboxgl-popup-anchor-' + anchor);\n\n        DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + offsetedPos.x + 'px,' + offsetedPos.y + 'px)');\n    },\n\n    _onClickClose: function() {\n        this.remove();\n    }\n});\n\nfunction normalizeOffset(offset) {\n\n    if (!offset) {\n        return normalizeOffset(new Point(0, 0));\n\n    } else if (typeof offset === 'number') {\n        // input specifies a radius from which to calculate offsets at all positions\n        var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));\n        return {\n            'top': new Point(0, offset),\n            'top-left': new Point(cornerOffset, cornerOffset),\n            'top-right': new Point(-cornerOffset, cornerOffset),\n            'bottom': new Point(0, -offset),\n            'bottom-left': new Point(cornerOffset, -cornerOffset),\n            'bottom-right': new Point(-cornerOffset, -cornerOffset),\n            'left': new Point(offset, 0),\n            'right': new Point(-offset, 0)\n        };\n\n    } else if (isPointLike(offset)) {\n        // input specifies a single offset to be applied to all positions\n        var convertedOffset = Point.convert(offset);\n        return {\n            'top': convertedOffset,\n            'top-left': convertedOffset,\n            'top-right': convertedOffset,\n            'bottom': convertedOffset,\n            'bottom-left': convertedOffset,\n            'bottom-right': convertedOffset,\n            'left': convertedOffset,\n            'right': convertedOffset\n        };\n\n    } else {\n        // input specifies an offset per position\n        return {\n            'top': Point.convert(offset['top']),\n            'top-left': Point.convert(offset['top-left']),\n            'top-right': Point.convert(offset['top-right']),\n            'bottom': Point.convert(offset['bottom']),\n            'bottom-left': Point.convert(offset['bottom-left']),\n            'bottom-right': Point.convert(offset['bottom-right']),\n            'left': Point.convert(offset['left']),\n            'right': Point.convert(offset['right'])\n        };\n    }\n}\n\nfunction isPointLike(input) {\n    return input instanceof Point || Array.isArray(input);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/popup.js\n// module id = 655\n// module chunks = 0 1","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport { Navigation } from 'react-router';\nimport _ from 'lodash';\nimport { Dropdown } from '@opengov/ovid';\nimport { Connect } from '@opengov/og_flux';\nimport TetherComponent from 'react-tether';\n\nimport createReactClass from 'create-react-class';\nimport * as InviteActions from '../actions/invite_actions';\nimport InvitesStore from '../stores/invites_store';\nimport ReportViewStore from '../stores/report_view_store';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport ShareMessage from './share_message';\nimport ShareNotification from './share_notification';\nimport ChangeReportPermission from './change_report_permission';\nimport ShareOptionsContent from './share_options_content';\nimport ReportPermissionOptions from './report_permission_options';\n\nconst ReportPublicOption = {\n  name: 'Public',\n  id: 'public',\n  icon: 'icon-share-public',\n  description: 'This report is published to your OpenGov transparency site and can be seen by people outside your organization.',\n  readonly: true\n};\n\nfunction mapStateToProps() {\n  const state = InvitesStore.getState();\n  const report = ReportViewStore.getRenderedReport();\n  const session = SessionStore.getSession();\n\n  return {\n    invites: {\n      search: {\n        query: state.get('inviteeSearchQuery'),\n        results: InvitesStore.getSearchResults()\n      },\n      users: InvitesStore.getInvitedUsers(),\n      currentInvitedUsers: InvitesStore.getCurrentInvitedUsers(),\n      currentUser: InvitesStore.getCurrentUser(),\n      messageUsers: InvitesStore.getMessageUsers(),\n      owner: report.get('owner'),\n      reportRoles: InvitesStore.getReportRoles(),\n      pendingUser: InvitesStore.getPendingUser(),\n      error: InvitesStore.getInviteError(),\n      message: InvitesStore.getMessage(),\n      isSendingMessage: InvitesStore.getIsSendingMessage(),\n      isLoadingUsers: InvitesStore.getIsLoadingUsers()\n    },\n    sessionId: session ? session.get('id') : null,\n    activePanel: state.get('activePanel'),\n    updateMessage: InviteActions.updateMessage,\n    sendMessage: InviteActions.sendMessage,\n    cancel: InviteActions.resetShareMessagePanel,\n    isNotificationOpen: state.get('isNotificationOpen')\n  };\n}\n\nconst Transitionable = Component => createReactClass<any, any>({\n  mixins: [Navigation] as any,\n  render() {\n    return (\n      <Component transitionTo={this.transitionTo} {...this.props} />\n    );\n  }\n});\n\nconst TransitionableShareOptionsContent = Transitionable(ShareOptionsContent);\n\nclass ShareOptions extends Component<any, any> {\n  static propTypes = {\n    report: PropTypes.object\n  }\n\n  componentDidMount() {\n    InviteActions.loadEntityUsers();\n    InviteActions.loadReportRoles();\n  }\n\n  componentWillUnmount() {\n    if (InvitesStore.getIsNotificationOpen()) {\n      InviteActions.closeNotification();\n      InviteActions.resetShareMessagePanel();\n    }\n  }\n\n  closeDropdown() {\n    document.body.click();\n  }\n\n  onCancel = () => {\n    this.props.cancel();\n    this.closeDropdown();\n  }\n\n  onSend = () => {\n    InviteActions.showSending();\n\n    const userIds = this.props.invites.messageUsers.map(user => user.get('id'));\n    const message = this.props.invites.message;\n\n    this.props.sendMessage({userIds, message}, this.closeDropdown);\n  }\n\n  onNotificationNo = () => {\n    InviteActions.closeNotification();\n  }\n\n  onNotificationYes = () => {\n    (this.refs.shareToggle as any).toggle(true);\n  }\n\n  onNotificationNever = () => {\n    InviteActions.closeAndNeverShowNotification();\n  }\n\n  handleDropdownToggle = (isOpen) => {\n    if (isOpen) {\n      InviteActions.closeNotification();\n    }\n  }\n\n  onSavePermissionChange = () => {\n    (this as any).showOverview();\n  }\n\n  renderSharePanel(permission) {\n\n    switch (this.props.activePanel) {\n    case 'overview':\n      return (\n        <TransitionableShareOptionsContent\n          currentPermission={permission}\n          reportId={this.props.report.get('id')}\n          entity={this.props.report.get('entity')}\n          onBack={InviteActions.goToMessagePanel}\n          onEditPermission={InviteActions.goToPermissionPanel}\n          sessionId={this.props.sessionId}\n          isLoadingUsers={this.props.invites.isLoadingUsers}\n          error={this.props.invites.error}\n          invites={this.props.invites}\n        />\n      );\n    case 'permission':\n      return (\n        <ChangeReportPermission\n          initialPermission={permission}\n          onSave={InviteActions.goToOverviewPanel}\n          onCancel={InviteActions.goToOverviewPanel}\n        />\n      );\n    case 'message':\n    default:\n      return (\n        <ShareMessage\n          {...this.props.invites.search}\n          showOverview={InviteActions.goToOverviewPanel}\n          currentUser={this.props.invites.currentUser}\n          currentInvitedUsers={this.props.invites.currentInvitedUsers}\n          messageUsers={this.props.invites.messageUsers}\n          permission={permission}\n          message={this.props.invites.message}\n          isSendingMessage={this.props.invites.isSendingMessage}\n          isLoadingUsers={this.props.invites.isLoadingUsers}\n          send={this.onSend}\n          cancel={this.onCancel}\n          updateMessage={this.props.updateMessage}\n          addUser={InviteActions.addMessageUser}\n          removeUser={InviteActions.removeMessageUser}\n          reportId={this.props.report.get('id')}\n          reportOwner={this.props.report.get('owner')}\n          disableSearch={false}\n        />\n      );\n    }\n  }\n  onCancelPermissionChange = () => {\n    (this as any).showOverview();\n  }\n\n  render() {\n    if (!this.props.report) return null;\n\n    const reportVisibility = this.props.report.get('visibility');\n    const isVisibleOnTransparency = reportVisibility === 'public';\n\n    const permission = isVisibleOnTransparency\n      ? ReportPublicOption\n      : _.find(ReportPermissionOptions, { id: reportVisibility });\n\n    // Choose the icon for the dropdown button based on the visibliity of the report.\n    // For reports published on transparency show the nice looking \"globe\" icon. If it's private put a lock on it.\n    // If the entire organization can see it then we use the team icon.\n    const dropdownIcon = isVisibleOnTransparency ? 'icon-share-public' : permission.icon;\n\n    return (\n      <TetherComponent\n        attachment=\"top right\"\n        targetAttachment=\"bottom right\"\n        constraints={[{\n          to: 'scrollParent',\n          attachment: 'together'\n        }]}\n      >\n        <Dropdown title=\"Share\"\n                  ref=\"shareToggle\"\n                  position=\"align-right\"\n                  onToggle={this.handleDropdownToggle}\n                  dropdownClass=\"ui-nav-bar__item report-share-menu\"\n                  toggleClass={`share__toggle ui-button primary small ${dropdownIcon}`}\n                  targetClass=\"share__dropdown ui-dropdown__target\"\n                  ignoreContentClicks\n        >\n          <div className=\"share\">\n            <header className=\"ui-dropdown__header\">\n              <h4>Share Report</h4>\n            </header>\n            {this.renderSharePanel(permission)}\n          </div>\n        </Dropdown>\n          {\n            this.props.isNotificationOpen &&\n          <ShareNotification\n            onYes={this.onNotificationYes}\n            onNo={this.onNotificationNo}\n            onNever={this.onNotificationNever}\n          />\n        }\n      </TetherComponent>\n    );\n  }\n}\n\nexport default Connect(\n  mapStateToProps,\n  InvitesStore,\n  ReportViewStore\n)(ShareOptions);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_options.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = require('./utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _smooth = require('./smooth');\n\nvar _smooth2 = _interopRequireDefault(_smooth);\n\nvar _cancelEvents = require('./cancel-events');\n\nvar _cancelEvents2 = _interopRequireDefault(_cancelEvents);\n\nvar _scrollEvents = require('./scroll-events');\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\r\n * Gets the easing type from the smooth prop within options.\r\n */\nvar getAnimationType = function getAnimationType(options) {\n  return _smooth2.default[options.smooth] || _smooth2.default.defaultEasing;\n};\n/*\r\n * Function helper\r\n */\nvar functionWrapper = function functionWrapper(value) {\n  return typeof value === 'function' ? value : function () {\n    return value;\n  };\n};\n/*\r\n * Wraps window properties to allow server side rendering\r\n */\nvar currentWindowProperties = function currentWindowProperties() {\n  if (typeof window !== 'undefined') {\n    return window.requestAnimationFrame || window.webkitRequestAnimationFrame;\n  }\n};\n\n/*\r\n * Helper function to never extend 60fps on the webpage.\r\n */\nvar requestAnimationFrameHelper = function () {\n  return currentWindowProperties() || function (callback, element, delay) {\n    window.setTimeout(callback, delay || 1000 / 60, new Date().getTime());\n  };\n}();\n\nvar makeData = function makeData() {\n  return {\n    currentPositionY: 0,\n    startPositionY: 0,\n    targetPositionY: 0,\n    progress: 0,\n    duration: 0,\n    cancel: false,\n\n    target: null,\n    containerElement: null,\n    to: null,\n    start: null,\n    deltaTop: null,\n    percent: null,\n    delayTimeout: null\n  };\n};\n\nvar currentPositionY = function currentPositionY(options) {\n  var containerElement = options.data.containerElement;\n  if (containerElement && containerElement !== document && containerElement !== document.body) {\n    return containerElement.scrollTop;\n  } else {\n    var supportPageOffset = window.pageXOffset !== undefined;\n    var isCSS1Compat = (document.compatMode || \"\") === \"CSS1Compat\";\n    return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;\n  }\n};\n\nvar scrollContainerHeight = function scrollContainerHeight(options) {\n  var containerElement = options.data.containerElement;\n  if (containerElement && containerElement !== document && containerElement !== document.body) {\n    return Math.max(containerElement.scrollHeight, containerElement.offsetHeight, containerElement.clientHeight);\n  } else {\n    var body = document.body;\n    var html = document.documentElement;\n\n    return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n  }\n};\n\nvar animateScroll = function animateScroll(easing, options, timestamp) {\n  var data = options.data;\n\n  // Cancel on specific events\n  if (!options.ignoreCancelEvents && data.cancel) {\n    if (_scrollEvents2.default.registered['end']) {\n      _scrollEvents2.default.registered['end'](data.to, data.target, data.currentPositionY);\n    }\n    return;\n  };\n\n  data.deltaTop = Math.round(data.targetPositionY - data.startPositionY);\n\n  if (data.start === null) {\n    data.start = timestamp;\n  }\n\n  data.progress = timestamp - data.start;\n\n  data.percent = data.progress >= data.duration ? 1 : easing(data.progress / data.duration);\n\n  data.currentPositionY = data.startPositionY + Math.ceil(data.deltaTop * data.percent);\n\n  if (data.containerElement && data.containerElement !== document && data.containerElement !== document.body) {\n    data.containerElement.scrollTop = data.currentPositionY;\n  } else {\n    window.scrollTo(0, data.currentPositionY);\n  }\n\n  if (data.percent < 1) {\n    var easedAnimate = animateScroll.bind(null, easing, options);\n    requestAnimationFrameHelper.call(window, easedAnimate);\n    return;\n  }\n\n  if (_scrollEvents2.default.registered['end']) {\n    _scrollEvents2.default.registered['end'](data.to, data.target, data.currentPositionY);\n  }\n};\n\nvar setContainer = function setContainer(options) {\n  options.data.containerElement = !options ? null : options.containerId ? document.getElementById(options.containerId) : options.container && options.container.nodeType ? options.container : document;\n};\n\nvar animateTopScroll = function animateTopScroll(y, options, to, target) {\n  options.data = options.data || makeData();\n\n  window.clearTimeout(options.data.delayTimeout);\n\n  _cancelEvents2.default.subscribe(function () {\n    options.data.cancel = true;\n  });\n\n  setContainer(options);\n\n  options.data.start = null;\n  options.data.cancel = false;\n  options.data.startPositionY = currentPositionY(options);\n  options.data.targetPositionY = options.absolute ? y : y + options.data.startPositionY;\n\n  if (options.data.startPositionY === options.data.targetPositionY) {\n    if (_scrollEvents2.default.registered['end']) {\n      _scrollEvents2.default.registered['end'](options.data.to, options.data.target, options.data.currentPositionY);\n    }\n    return;\n  }\n\n  options.data.deltaTop = Math.round(options.data.targetPositionY - options.data.startPositionY);\n\n  options.data.duration = functionWrapper(options.duration)(options.data.deltaTop);\n  options.data.duration = isNaN(parseFloat(options.data.duration)) ? 1000 : parseFloat(options.data.duration);\n  options.data.to = to;\n  options.data.target = target;\n\n  var easing = getAnimationType(options);\n  var easedAnimate = animateScroll.bind(null, easing, options);\n\n  if (options && options.delay > 0) {\n    options.data.delayTimeout = window.setTimeout(function () {\n      requestAnimationFrameHelper.call(window, easedAnimate);\n    }, options.delay);\n    return;\n  }\n\n  requestAnimationFrameHelper.call(window, easedAnimate);\n};\n\nvar proceedOptions = function proceedOptions(options) {\n  options = _extends({}, options);\n  options.data = options.data || makeData();\n  options.absolute = true;\n  return options;\n};\n\nvar scrollToTop = function scrollToTop(options) {\n  animateTopScroll(0, proceedOptions(options));\n};\n\nvar scrollTo = function scrollTo(toY, options) {\n  animateTopScroll(toY, proceedOptions(options));\n};\n\nvar scrollToBottom = function scrollToBottom(options) {\n  options = proceedOptions(options);\n  setContainer(options);\n  animateTopScroll(scrollContainerHeight(options), options);\n};\n\nvar scrollMore = function scrollMore(toY, options) {\n  options = proceedOptions(options);\n  setContainer(options);\n  animateTopScroll(currentPositionY(options) + toY, options);\n};\n\nexports.default = {\n  animateTopScroll: animateTopScroll,\n  getAnimationType: getAnimationType,\n  scrollToTop: scrollToTop,\n  scrollToBottom: scrollToBottom,\n  scrollTo: scrollTo,\n  scrollMore: scrollMore\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/animate-scroll.js\n// module id = 657\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _passiveEventListeners = require('./passive-event-listeners');\n\nvar _utils = require('./utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar scrollHash = {\n  mountFlag: false,\n  initialized: false,\n  scroller: null,\n  containers: {},\n\n  mount: function mount(scroller) {\n    this.scroller = scroller;\n\n    this.handleHashChange = this.handleHashChange.bind(this);\n    window.addEventListener('hashchange', this.handleHashChange);\n\n    this.initStateFromHash();\n    this.mountFlag = true;\n  },\n  mapContainer: function mapContainer(to, container) {\n    this.containers[to] = container;\n  },\n  isMounted: function isMounted() {\n    return this.mountFlag;\n  },\n  isInitialized: function isInitialized() {\n    return this.initialized;\n  },\n  initStateFromHash: function initStateFromHash() {\n    var _this = this;\n\n    var hash = this.getHash();\n    if (hash) {\n      window.setTimeout(function () {\n        _this.scrollTo(hash, true);\n        _this.initialized = true;\n      }, 10);\n    } else {\n      this.initialized = true;\n    }\n  },\n  scrollTo: function scrollTo(to, isInit) {\n    var scroller = this.scroller;\n    var element = scroller.get(to);\n    if (element && (isInit || to !== scroller.getActiveLink())) {\n      var container = this.containers[to] || document;\n      scroller.scrollTo(to, { container: container });\n    }\n  },\n  getHash: function getHash() {\n    return _utils2.default.getHash();\n  },\n  changeHash: function changeHash(to) {\n    if (this.isInitialized()) {\n      _utils2.default.pushHash(to);\n    }\n  },\n  handleHashChange: function handleHashChange() {\n    this.scrollTo(this.getHash());\n  },\n  unmount: function unmount() {\n    this.scroller = null;\n    this.containers = null;\n    window.removeEventListener('hashchange', this.handleHashChange);\n  }\n};\n\nexports.default = scrollHash;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroll-hash.js\n// module id = 658\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _scroller = require('./scroller');\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nexports.default = function (Component) {\n  var Element = function (_React$Component) {\n    _inherits(Element, _React$Component);\n\n    function Element(props) {\n      _classCallCheck(this, Element);\n\n      var _this = _possibleConstructorReturn(this, (Element.__proto__ || Object.getPrototypeOf(Element)).call(this, props));\n\n      _this.childBindings = {\n        domNode: null\n      };\n      return _this;\n    }\n\n    _createClass(Element, [{\n      key: 'componentDidMount',\n      value: function componentDidMount() {\n        if (typeof window === 'undefined') {\n          return false;\n        }\n        this.registerElems(this.props.name);\n      }\n    }, {\n      key: 'componentWillReceiveProps',\n      value: function componentWillReceiveProps(nextProps) {\n        if (this.props.name !== nextProps.name) {\n          this.registerElems(nextProps.name);\n        }\n      }\n    }, {\n      key: 'componentWillUnmount',\n      value: function componentWillUnmount() {\n        if (typeof window === 'undefined') {\n          return false;\n        }\n        _scroller2.default.unregister(this.props.name);\n      }\n    }, {\n      key: 'registerElems',\n      value: function registerElems(name) {\n        _scroller2.default.register(name, this.childBindings.domNode);\n      }\n    }, {\n      key: 'render',\n      value: function render() {\n        return _react2.default.createElement(Component, _extends({}, this.props, { parentBindings: this.childBindings }));\n      }\n    }]);\n\n    return Element;\n  }(_react2.default.Component);\n\n  ;\n\n  Element.propTypes = {\n    name: _propTypes2.default.string,\n    id: _propTypes2.default.string\n  };\n\n  return Element;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/scroll-element.js\n// module id = 659\n// module chunks = 0 1","const ReportPermissionOptions = [\n  {\n    id: 'private',\n    name: 'Private',\n    icon: 'icon-share-private',\n    description: 'Visible to you and invited members from your organization.'\n  },\n  {\n    id: 'my_organization',\n    name: 'My organization',\n    icon: 'icon-share-my-org',\n    description: 'This report can be seen by anyone in your organization and can be added to your Transparency Portal.'\n  },\n  {\n    id: 'network',\n    name: 'Network',\n    icon: 'icon-app-network',\n    description: 'This report can be seen by anyone in your organization as well as other users in the OpenGov Network.'\n  }\n];\n\nexport default ReportPermissionOptions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/report_permission_options.ts","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmbed } from './utils/embed_utils';\n\nexport default class TransparencyLoginButton extends React.Component<any, any> {\n  static propTypes = {\n    entityId: PropTypes.string,\n    transparencyUrl: PropTypes.string\n  };\n\n  render() {\n    const { entityId, transparencyUrl } = this.props;\n    const embedStyle = isEmbed() ? { display: 'none' } : {};\n    const locationHost = getHostname(transparencyUrl, entityId);\n    const locationHash = window.location.hash.replace('#/', `${entityId}/`);\n    const protocol = window.location.protocol;\n\n    const redirectUrl = `${protocol}//${locationHost}/reports#/${locationHash}`;\n    const link = `//${locationHost}/auth/validate?redirect_url=${global.escape(redirectUrl)}`;\n\n    return (\n      <a style={embedStyle} className=\"ui-button login small ghost no-color\"\n        key=\"login\"\n        href={link}> Login\n      </a>\n    );\n  }\n}\n\nexport const getHostname = (href?, entityId?) => {\n  const linkedElement = document.createElement('a');\n  linkedElement.href = href ? href : 'http://controlpanel.opengov.com';\n  return linkedElement.hostname.replace(`${entityId}`, 'controlpanel');\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/TransparencyLoginButton.tsx","import React from 'react';\nimport ReportActions from '../actions/report_actions';\n\nexport interface IFeedbackModalProps {\n  entityDisplayName: string;\n  entityId: string;\n  reportId: string;\n  showError: boolean;\n  errorMessage: boolean;\n  feedbackSaving: boolean;\n}\n\nexport interface IFeedbackModalState {\n  name: string;\n  phone: string;\n  email: string;\n  message: string;\n}\n\nclass FeedbackModal extends React.Component<IFeedbackModalProps, IFeedbackModalState> {\n\n  state = {\n    name: '',\n    phone: '',\n    email: '',\n    message: ''\n  }\n\n  close = () => {\n    ReportActions.hideFeedback();\n  }\n\n  sendFeedback = (e) => {\n    e.preventDefault();\n    ReportActions.sendFeedback(\n      this.state.name,\n      this.state.phone,\n      this.state.email,\n      this.state.message,\n      this.props.reportId,\n      this.props.entityId\n    );\n  }\n\n  handleChange = (prop, value) => {\n    this.setState({ [prop]: value });\n  }\n\n  render() {\n    return (\n      <div className=\"ui-modal__wrapper open\" id=\"overlay-modal_feedback\">\n        <div className=\"ui-modal\">\n          <header className=\"ui-modal__header\">\n            <h3>Contact {this.props.entityDisplayName}</h3>\n            <span className=\"ui-modal__close\" data-modal=\"feedback\" onClick={this.close}></span>\n          </header>\n          <form id=\"feedback-form\">\n            <div className=\"ui-modal__content\">\n              {!!this.props.showError ? <div className=\"ui-alert-box\">{this.props.errorMessage}</div> : null }\n              <fieldset className=\"ui-form\">\n                <label>Name</label>\n                <input type=\"text\" className=\"overlay-form__input\" name=\"name\" ref=\"name\" disabled={!!this.props.feedbackSaving} value={this.state.name} onChange={e => this.handleChange('name', e.target.value)} />\n              </fieldset>\n              <fieldset className=\"ui-form\">\n                <label>Phone</label>\n                <input type=\"text\" className=\"overlay-form__input\" name=\"phone\" ref=\"phone\" disabled={!!this.props.feedbackSaving} value={this.state.phone} onChange={e => this.handleChange('phone', e.target.value)} />\n              </fieldset>\n              <fieldset className=\"ui-form\">\n                <label>Email</label>\n                <input type=\"email\" className=\"overlay-form__input\" name=\"email\" ref=\"email\" disabled={!!this.props.feedbackSaving} value={this.state.email} onChange={e => this.handleChange('email', e.target.value)} />\n              </fieldset>\n              <fieldset className=\"ui-form required\">\n                <label className=\"overlay-form__label\">Message</label>\n                <textarea id=\"message\" name=\"message\" ref=\"message\" disabled={!!this.props.feedbackSaving} value={this.state.message} onChange={e => this.handleChange('message', e.target.value)}></textarea>\n              </fieldset>\n            </div>\n            <footer className=\"ui-modal__footer\">\n              <div className=\"ui-modal__actions\">\n                <button className=\"ui-button primary\"\n                  data-modal=\"feedback\" onClick={this.sendFeedback}\n                  disabled={!!this.props.feedbackSaving}>Send</button>\n              </div>\n            </footer>\n          </form>\n        </div>\n        <div className=\"ui-modal__background\"></div>\n      </div>\n    );\n  }\n}\n\nexport default FeedbackModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/feedback.tsx","import React from 'react';\nimport _ from 'lodash';\n\nfunction iconType(extension) {\n  switch (extension) {\n  case '.pdf':\n    return 'pdf';\n  case '.doc':\n  case '.docx':\n    return 'doc';\n  case '.zip':\n    return 'zip';\n  case '.txt':\n    return 'txt';\n  case '.csv':\n    return 'csv';\n  case '.xls':\n  case '.xlsx':\n    return 'xls';\n  }\n}\n\nexport default class DocumentList extends React.Component<any, any> {\n  render() {\n    const documents: any[] = this.props.entity.get('documents');\n\n    if (_.isEmpty(documents)) {\n      return null;\n    }\n\n    const sortedDocuments = _.sortBy(documents, _.bind((d) => d.position, this)).map((d) => ({\n      name: d.name || d.file_name,\n      icon_type: iconType(d.file_extension),\n      tooltip_name: `${d.name} (${d.extension})`,\n      url: d.file_url\n    }));\n\n    return (\n      <div className=\"ui-mainpanel__section\">\n        <div className=\"ui-mainpanel__section-header\">\n          Documents\n        </div>\n        <nav className=\"ui-nav-list\">\n          {sortedDocuments.map((d) => (\n            <a key={d.name} href={`${d.url}`} className=\"ui-nav-list__item\" target=\"_blank\">\n              <div className=\"product-icon\">\n                <span className={`icon-${d.icon_type}-1`} />\n              </div>\n              <span className=\"ui-nav-list__item__text\" title={`${d.tooltip_name}`}>\n                {d.name}\n              </span>\n            </a>\n          ))}\n        </nav>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/document_list.tsx","import React from 'react';\nimport GridReportActions from '../actions/grid_report_actions';\n\nclass TermsOfService extends React.Component<any, any> {\n  handleClose(e) {\n    e.preventDefault();\n    GridReportActions.hideTOS();\n  }\n\n  render() {\n    return (<div className=\"ui-modal__wrapper open ready\" id=\"overlay-modal_tos\">\n      <div className=\"ui-modal wide\">\n        <header className=\"ui-modal__header\">\n          <h3>OpenGov Site Terms of Use</h3>\n          <span className=\"ui-modal__close\" onClick={this.handleClose}></span>\n        </header>\n        <div className=\"ui-modal__content\">\n          <article className=\"terms-of-service\">\n            <p><em>Last revised on: January 11, 2016</em></p>\n            <p>Welcome to this OpenGov website! This website (the \"<strong>Site</strong>\") is a copyrighted work belonging to OpenGov, Inc. (\"<strong>OpenGov</strong>\", \"<strong>us</strong>\", \"<strong>our</strong>\", and \"<strong>we</strong>\").  OpenGov makes available public domain data that it has aggregated and processed on behalf of governments on websites for public consumption (collectively, with all other services provided through the Site, the \"Services\"). Certain features of the Services or Site may be subject to additional guidelines, terms, or rules, which will be posted on the Service or Site in connection with such features.  All such additional terms, guidelines, and rules are incorporated by reference into this Agreement.</p>\n            <p>These Terms of Use (\"Agreement\") sets forth the legally binding terms for your use of the Site and Services. By accessing or using the Site or Services, you are accepting this Agreement and you represent and warrant that you have the right, authority, and capacity to enter into this Agreement. If you do not agree with all of the provisions of this Agreement, do not access and/or use the Site or Services. If you are using the Site or Services on behalf of a company, entity, or organization, you represent and warrant that you are an authorized representative of such company, entity, or organization with the authority to bind it to this Agreement.</p>\n            <h3>1. Site</h3>\n            <p><strong>1.1 License.</strong> Subject to the terms of this Agreement, OpenGov grants you a non-transferable, non-exclusive, license to use the Site and Services for your personal, noncommercial use.</p>\n            <p><strong>1.2 Certain Restrictions.</strong> The rights granted to you in this Agreement with regards to any content or information on the site that is not in the public domain are subject to the following restrictions: (a) you shall not license, sell, rent, lease, transfer, assign, distribute, host, or otherwise commercially exploit any portion of the Site or Services; (b) you shall not modify, make derivative works of, disassemble, reverse compile or reverse engineer any portion of the Site or Services; (c) you shall not access the Site or Services in order to build a similar or competitive service; and (d) except as expressly stated herein, no potion of the Site or Services may be copied, reproduced, distributed, republished, downloaded, displayed, posted or transmitted in any form or by any means.  Any future release, update, or other addition to functionality of the Site or Services shall be subject to the terms of this Agreement. All copyright and other proprietary notices on any Site or Services content must be retained on all copies thereof.</p>\n            <p><strong>1.3 Modification.</strong> OpenGov reserves the right, at any time, to modify, suspend, or discontinue the Site or Services or any part thereof with or without notice. You agree that OpenGov will not be liable to you or to any third party for any modification, suspension, or discontinuance of the Site or Services or any part thereof.</p>\n            <p><strong>1.4 Ownership.</strong> Excluding the public domain data made available on the site, you acknowledge that all the intellectual property rights, including copyrights, patents, trade marks, and trade secrets, in the Site and Services are owned by OpenGov or OpenGov's licensors. The provision of the Site and Services does not transfer to you or any third party any rights, title or interest in or to such intellectual property rights. OpenGov and its suppliers reserve all rights not granted in this Agreement.</p>\n            <h3>2. Acceptable Use Policy.</h3>\n            <p>You agree not to use the Site or Services to: (a) upload, transmit, or distribute any computer viruses, worms, or any software intended to damage or alter a computer system or data; (b) interfere with, disrupt, or create an undue burden on servers or networks connected to the Site or Services or violate the regulations, policies or procedures of such networks; (c) attempt to gain unauthorized access to the Site or Services, other computer systems or networks connected to or used together with the Site or Services; (d) harass or interfere with another user's use and enjoyment of the Site or Services; or (e) introduce software or automated agents or scripts to the Site or Services so as to generate automated searches, requests and queries, or to strip, scrape, or mine data from the Site or Services.</p>\n            <h3>3. Indemnity.</h3>\n            <p>You agree to indemnify and hold OpenGov (and its officers, employees, and agents) harmless, including costs and attorneys' fees, from any claim or demand made by any third party due to or arising out of (i) your use of the Site or Services, (ii) your violation of this Agreement; or (iii) your violation of applicable laws or regulations.  OpenGov reserves the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us and you agree to cooperate with our defense of these claims.  You agree not to settle any matter without the prior written consent of OpenGov.  OpenGov will use reasonable efforts to notify you of any such claim, action or proceeding upon becoming aware of it.</p>\n            <h3>4. Third Party Sites.</h3>\n            <p>The Site might contain links to third party websites and services for third parties (collectively, \"Third Party Sites\").  Such Third Party Sites are not under the control of OpenGov and OpenGov is not responsible for any Third Party Sites.  OpenGov provides these Third Party Sites only as a convenience and does not review, approve, monitor, endorse, warrant, or make any representations with respect to Third Party Sites.  You use all Third Party Sites at your own risk. When you link to a Third Party Site, the applicable third party's terms and policies apply, including the third party's privacy and data gathering practices.  You should make whatever investigation you feel necessary or appropriate before proceeding with any transaction in connection with such Third Party Sites.</p>\n            <h3>5. Disclaimers.</h3>\n            <p>THE SITE AND SERVICES ARE PROVIDED \"AS-IS\" AND \"AS AVAILABLE\" AND WE (AND OUR SUPPLIERS) EXPRESSLY DISCLAIM ANY WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OR CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, QUIET ENJOYMENT, ACCURACY, OR NON-INFRINGEMENT.  WE (AND OUR SUPPLIERS) MAKE NO WARRANTY THAT THE SITE OR SERVICES: (A) WILL MEET YOUR REQUIREMENTS; (B) WILL BE AVAILABLE ON AN UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE BASIS; OR (C) WILL BE ACCURATE, RELIABLE, FREE OF VIRUSES OR OTHER HARMFUL CODE,  COMPLETE, LEGAL, OR SAFE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.</p>\n            <h3>6. Limitation on Liability.</h3>\n            <p>IN NO EVENT SHALL WE (AND OUR SUPPLIERS) BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY LOST PROFIT OR ANY INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL OR PUNITIVE DAMAGES ARISING FROM OR RELATING TO THIS AGREEMENT OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR SERVICES, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ACCESS TO, AND USE OF, THE SITE AND SERVICES ARE AT YOUR OWN DISCRETION AND RISK, AND YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA RESULTING THEREFROM. NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED HEREIN, OUR (AND OUR SUPPLIERS') LIABILITY TO YOU FOR ANY DAMAGES ARISING FROM OR RELATED TO THIS AGREEMENT (FOR ANY CAUSE WHATSOEVER AND REGARDLESS OF THE FORM OF THE ACTION), WILL AT ALL TIMES BE LIMITED TO FIFTY US DOLLARS ($50). THE EXISTENCE OF MORE THAN ONE CLAIM WILL NOT ENLARGE THIS LIMIT. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OF CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU AND YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM JURISDICTION TO JURISDICTION.</p>\n            <h3>7. Term and Termination.</h3>\n            <p>Subject to this Section, this Agreement will remain in full force and effect while you use the Site or Services.  We may (a) suspend your rights to use the Site and/or Services or (b) terminate this Agreement, at any time for any reason at our sole discretion, including for any use of the Site or Services in violation of this Agreement.  Upon termination of this Agreement, your right to access and use the Site and Services will terminate immediately.  OpenGov will not have any liability whatsoever to you for any termination of this Agreement.  Even after this Agreement is terminated, the following provisions of this Agreement will remain in effect: Sections 2–8.</p>\n            <h3>8. General</h3>\n            <p><strong>8.1 Changes to Terms of Use.</strong> This Agreement is subject to occasional revision, and if we make any substantial changes, we may notify you by prominently posting notice of the changes on our Site.  Any changes to this agreement will be effective thirty (30) calendar days following our posting of notice of the changes on our Site. Continued use of our Site or Services following notice of such changes shall indicate your acknowledgement of such changes and agreement to be bound by the terms and conditions of such changes.</p>\n            <p><strong>8.2 Choice of Law.</strong> The Agreement is made under and shall be governed by and construed in accordance with the laws of the State of California, without giving effect to any principles that provide for the application of the law of another jurisdiction. Any action at law or in equity will be commenced in a federal or state court located in the County of Santa Clara, California and you and OpenGov consent to the venue and jurisdiction of such courts.</p>\n            <p><strong>8.3 Entire Agreement.</strong> This Agreement constitutes the entire agreement between you and us regarding the use of the Site and Services. Our failure to exercise or enforce any right or provision of this Agreement shall not operate as a waiver of such right or provision. The section titles in this Agreement are for convenience only and have no legal or contractual effect. The word including means including without limitation. If any provision of this Agreement is, for any reason, held to be invalid or unenforceable, the other provisions of this Agreement will be unimpaired and the invalid or unenforceable provision will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law.  Your relationship to OpenGov is that of an independent contractor, and neither party is an agent or partner of the other. This Agreement, and your rights and obligations herein, may not be assigned, subcontracted, delegated, or otherwise transferred by you without OpenGov's prior written consent, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void.  The terms of this Agreement shall be binding upon assignees.</p>\n            <p><strong>8.4 Copyright/Trademark Information.</strong> Copyright &copy; 2013, OpenGov, Inc. All rights reserved.  All trademarks, logos and service marks (\"<strong>Marks</strong>\") displayed on the Site are our property or the property of other third parties. You are not permitted to use these Marks without our prior written consent or the consent of such third party which may own the Marks.</p>\n            <p><strong>8.5 Contact Information:</strong></p>\n            <p>OpenGov, Inc.<br />\n            955 Charter Street<br />\n            Redwood City, CA 94063<br />\n            650-336-7167</p>\n          </article>\n        </div>\n\n        <footer className=\"ui-modal__footer\">\n          <div className=\"ui-modal__actions\">\n          <button className=\"ui-button primary\" onClick={this.handleClose}>\n            Done\n          </button>\n        </div>\n      </footer>\n    </div>\n    <div className=\"ui-modal__background\" onClick={this.handleClose}></div>\n  </div>);\n  }\n}\n\nexport default TermsOfService;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/terms-of-service.tsx","import React from 'react';\nimport GridReportActions from '../actions/grid_report_actions';\nimport {assetPath} from '../asset_helpers';\n\nimport createReactClass from 'create-react-class';\n\nconst Budget101 = createReactClass<any, any>({\n  handleClose(e) {\n    e.preventDefault();\n    GridReportActions.hideBudget101();\n  },\n\n  render() {\n    return (\n      <div className=\"ui-modal__wrapper open\" id=\"overlay-modal_budget101\">\n        <div className=\"ui-modal wide\">\n          <header className=\"ui-modal__header\">\n            <h3>Multi-Fund Accounting 101</h3>\n            <span className=\"ui-modal__close js-modal-close\" onClick={this.handleClose}></span>\n          </header>\n          <div className=\"ui-modal__content\">\n            <article className=\"budget101-content\">\n              <h3 className=\"budget101-content__subtitle\">\n                A Short Guide to Multi-fund Accounting\n              </h3>\n              <p className=\"budget101-content__graphic-desc\">\n                OpenGov helps governments describe how funds flow through their organization, including where revenues come from, how it is distributed across departments, and where it is ultimately spent.\n              </p>\n\n              <img\n                src={assetPath('images/budget101/1.png')}\n                className=\"budget101-content__graphic\"\n                alt=\"Diagram of a multi-fund accounting system\" />\n              <p className=\"budget101-content__graphic-desc\">\n                Many organizations manage their budget and finances by using a \"multi-fund\" accounting system in which revenue is disbursed to different funds. Those funds may be directed toward specific purposes, though some funds - often called general funds - can flow into multiple departments.\n              </p>\n\n              <img\n                src={assetPath('images/budget101/2.png')}\n                className=\"budget101-content__graphic\"\n                alt=\"Diagram showing how funds are passed down from departments to divisions\" />\n              <p className=\"budget101-content__graphic-desc\">\n                Many organizations are divided at their highest level into departments, which may then be divided into divisions.  Some organizations have multiple layers below the division level.  Some organizations track programs that may span multiple departments and divisions.\n              </p>\n\n              <img\n                src={assetPath('images/budget101/3.png')}\n                className=\"budget101-content__graphic\"\n                alt=\"Diagram describing how revenue is split into funds\" />\n              <p className=\"budget101-content__graphic-desc\">\n                In multi-fund environments, revenue streams can feed into multiple funds. Taxes, for example, may be allocated across a government to pay for a variety of services.  Other revenue sources, like parking tickets, may go directly to a specific department, division, or program.\n              </p>\n\n              <img\n                src={assetPath('images/budget101/4.png')}\n                className=\"budget101-content__graphic\"\n                alt=\"Diagram showing the relationship between departments and expense types\" />\n              <p className=\"budget101-content__graphic-desc\">\n                Departments often spend resources across many expense types.  These may range from buying office supplies and electricity to paying off debt.  Many departments share the same expense types, such as money spent on salaries and benefits for employees.\n              </p>\n            </article>\n          </div>\n          <footer className=\"ui-modal__footer\"> <div className=\"ui-modal__actions\">\n              <button className=\"ui-button primary js-modal-close\" onClick={this.handleClose}>\n                Done\n              </button>\n            </div>\n          </footer>\n        </div>\n        <div className=\"ui-modal__background\" onClick={this.handleClose}></div>\n      </div>\n    );\n  }\n});\n\nexport default Budget101;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/budget101.tsx","import _ from 'lodash';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport ReportActions from '../actions/report_actions';\nimport GridReportActions from '../actions/grid_report_actions';\n\nimport createReactClass from 'create-react-class';\n\nlet SummaryWelcome = createReactClass<any, any>({\n  propTypes: {\n    showBudget101: PropTypes.bool,\n    entity: PropTypes.object\n  },\n\n  showHowTo(isTallahasseeFl) {\n    if (isTallahasseeFl) {\n      ReportActions.hideWelcomeModal();\n      GridReportActions.showHowToModal();\n    } else {\n      ReportActions.showHowTo();\n    }\n  },\n\n  showBudget101(isTallahasseeFl, evt) {\n    evt.stopPropagation();\n    if (isTallahasseeFl) {\n      ReportActions.hideWelcomeModal();\n      ReportActions.showBudget101(true);\n    } else {\n      ReportActions.showBudget101();\n    }\n  },\n\n\n  render() {\n    const { entity } = this.props;\n    const entityDisplayName = entity.get('display_name');\n    const entityName = entity.get('name');\n    const isTallahasseeFl = entity && entity.get('subdomain') === 'tallahasseefl';\n\n    return (\n      <div className=\"ui-modal__wrapper modal_welcome open\" id=\"overlay-modal_welcome\">\n        <div className=\"ui-modal wide\">\n          <div className=\"ui-modal__content\">\n            <h1 className=\"welcome__title\">\n              Welcome to {`${entityDisplayName}'s`} Financial Reporting Platform\n            </h1>\n            <p>This site is designed to help you understand more about the operations and performance of {entityName}. Start exploring with these visualization and analytics tools to learn more.</p>\n          <p>\n              {this.props.entity.get('budget_101') ?\n              <small>\n                  You can read about <a id=\"welcome-budget-101\" onClick={_.partial(this.showBudget101, isTallahasseeFl)}>Multi-Fund Accounting</a> or view other topics in the Help menu.\n                </small>\n              :\n              <small>\n              You can read about other topics in the Help menu.\n            </small>\n              }\n            </p>\n          </div>\n          <footer className=\"ui-modal__footer\">\n            <button id=\"welcome-how-to\" className=\"ui-button\" onClick={_.partial(this.showHowTo, isTallahasseeFl)}>\n              How To Use This Report\n            </button>\n            <div className=\"ui-modal__actions ui-flex-1\">\n              <button className=\"ui-button primary\" onClick={ReportActions.hideWelcomeModal}>\n                View Report\n              </button>\n            </div>\n          </footer>\n        </div>\n\n        <div className=\"pointer-arrow_reports\" />\n        <div className=\"pointer-arrow_filter\" />\n        <div className=\"pointer-arrow_export\" />\n        <div className=\"pointer-arrow_legend\" />\n        <div className=\"ui-modal__background\"></div>\n      </div>\n    );\n  }\n});\n\nexport default SummaryWelcome;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/summary_welcome.tsx","import _ from 'lodash';\nimport $ from 'jquery';\nimport Highcharts from 'highcharts-og';\nimport numeral from 'numeral';\n\nimport strings from './strings';\nimport { formatValue } from './formatValue';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport SummaryReportStore from './stores/summary_report_store';\nimport measureText from './measure_text';\n\nimport {\n  REGULAR_OPACITY,\n  FAINT_OPACITY,\n  HIGHLIGHT_OPACITY,\n  getPatternFillForColors,\n  getAnimationDuration,\n  getColorForDatasetType,\n  getDashStyleForDatasetType,\n  getFillOpacity,\n  setPointStateForSeries,\n  setColorOpacityForDataSetType,\n  brightenSeries,\n  filterSelectedSeries,\n} from './utils/chart_utils';\n\nconst fontStyle = {\n  fontSize: '13px',\n  fontFamily: 'ProximaNova'\n};\n\nexport class Graph {\n  reportEvents: any;\n  budgetData: any;\n  athenaState: any;\n  container: any;\n  annotations: any;\n  handleTooltip: any;\n  textStyle: any;\n  currentGraph: string;\n  graph: any;\n  startYear: any;\n  yearOrder: any;\n  chart: any;\n  overlay: any;\n  metricData: any;\n  showAggregates: any;\n  data: any;\n  totals: any;\n  accountType: any;\n  graphType: any;\n  yearLabels: any;\n  points: any;\n  options: any;\n  lastGraph: any;\n  pieSeries: any;\n  highlightedSeries: any;\n\n  constructor(container, reportEvents, budgetData, athenaState, handleTooltip) {\n    this.reportEvents = reportEvents;\n    this.budgetData = budgetData;\n    this.athenaState = athenaState;\n    this.container = container;\n    this.annotations = {};\n    this.handleTooltip = handleTooltip;\n\n    this.textStyle = _.extend({color: axisTextColor}, fontStyle);\n\n    // Currently rendered graph type\n    this.currentGraph = 'stacked';\n\n    this.athenaState.on('change:selectedDataSetIndex', function(state, index) {\n      // Update pie chart series when switching between data sets.\n      // Important for pie chart to pie chart changes\n      if (this.chart && !_.isEmpty(this.pieSeries)) {\n        this.lastGraph = 'pie';\n        this.removeAllSeries();\n        this.chart.addSeries(this.pieSeries[index], false);\n      }\n    }, this);\n\n    Highcharts.setOptions({\n      lang: {\n        numericSymbols: ['k', 'M', 'B', 'T']\n      }\n    });\n\n    // Based on approach in http://stackoverflow.com/questions/11618075/highcharts-stop-chart-from-trapping-mouse-events-or-capture-mouse-click-on-the\n    Highcharts.wrap(Highcharts.Pointer.prototype, 'onContainerClick', function clickShim(original, e) {\n      let parent = this.chart.container.parentNode;\n\n      // Call the original event\n      original.apply(this, Array.prototype.slice.call(arguments, 1));\n\n      // Trigger the event on the container's parent (to bubble the event out of highcharts)\n      if (parent) {\n        $(parent).trigger('click', e);\n      }\n    });\n\n    Highcharts.wrap(Highcharts.Chart.prototype, 'render', function(proceed) {\n      if (this.options.plotOptions.column.stacking === false) {\n        this.series = _.sortBy(this.series, 'name');\n      }\n      return proceed.apply(this);\n    });\n\n    // Drop labels along the x-axis that don't fit\n    Highcharts.wrap(Highcharts.Axis.prototype, 'setTickPositions', function(proceed) {\n\n      proceed.apply(this, Array.prototype.slice.call(arguments, 1));\n\n      if (this.isXAxis) {\n\n        let labelWidthSum = 0;\n        const labelBuffer = 20;\n        const ticks = this.ticks;\n\n        Object.keys(ticks).forEach((tick) => {\n          if (ticks[tick].label) {\n            labelWidthSum += (ticks[tick].label.getBBox().width);\n          }\n        });\n\n        const averageWidth = (labelWidthSum / Object.keys(ticks).length) + labelBuffer;\n        const width = averageWidth || 60;\n        const oldPositions = this.tickPositions;\n        const numberOfTickLabels = Math.floor(this.width / width);\n        const tickInterval = Math.ceil(oldPositions.length / numberOfTickLabels);\n        const result = _.filter((_(oldPositions) as any).reverse().value(), _.bind((v, i) => i % tickInterval === 0, this));\n        this.tickPositions = _(result).reverse().value();\n      }\n    });\n\n    // Halo not positioned correctly when using grouped data\n    // https://github.com/highslide-software/highcharts.com/blob/fd4cd1caef6ae590774de15bcfb26034f2b36fb6/js/parts/Interaction.js#L588\n    Highcharts.wrap(Highcharts.Point.prototype, 'haloPath', function(proceed, size) {\n      const series = this.series;\n      const chart = series.chart;\n      const plotBox = series.getPlotBox();\n      const inverted = chart.inverted;\n      const plotX = this.barX ? this.barX + this.pointWidth / 2 : this.plotX;\n\n      return chart.renderer.symbols.circle(\n        plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : plotX) - size,\n        plotBox.translateY + (inverted ? series.xAxis.len - plotX : this.plotY) - size,\n        size * 2,\n        size * 2\n      );\n    });\n\n  }\n\n  year(yearId) {\n    if (!_.isUndefined(yearId)) {\n      if (this.currentGraph !== 'pie' || !this.graph || this.startYear) {\n        this.startYear = yearId;\n      } else {\n        let idx = _.indexOf(this.yearOrder, yearId);\n        if (idx === -1) {\n          idx = this.yearOrder.length - 1;\n        }\n        (this as any).positionPieSlider(idx);\n      }\n    } else {\n      if (!_.isUndefined(this.startYear)) {\n        return this.startYear;\n      } else if (this.graph && _.isNumber(this.chart.pos) && this.yearOrder) {\n        return this.yearOrder[this.chart.pos];\n      } else {\n        return null;\n      }\n    }\n  }\n\n  // Render the graph\n  update(\n    data,\n    totals,\n    graphType,\n    accountType,\n    xAxisTitle,\n    yearLabels,\n    showAggregates,\n    isSameData,\n    yAxisScale,\n    metricData,\n    overlay) {\n\n    let self = this;\n    let lastGraph = graphType;\n    let highchartsChartType = graphType;\n    let stacking: string | boolean = 'normal';\n    let yUnit = SummaryReportStore.getAmountUnit();\n    let startOnTick = true;\n    let minPadding = 0;\n    let maxPadding = 0;\n    let groupPadding = 0.08;\n    let pointPadding = 0;\n    let xAxisMargin;\n    let options;\n    this.overlay = overlay;\n    this.metricData = metricData;\n\n    self.showAggregates = showAggregates;\n\n    this.data = data;\n    this.totals = totals;\n    this.accountType = accountType;\n    this.graphType = graphType;\n    this.yearLabels = _.map(yearLabels, function(label: any) {\n      return label.replace(/\\n/g, '<br/>');\n    });\n\n    const labelHeights = _.map(this.yearLabels, (label) => measureText(fontStyle, label)[1]);\n    const tallestLabelHeight = _.max(labelHeights);\n\n    xAxisMargin = tallestLabelHeight;\n\n    if (!this.chart && !graphType) {\n      graphType = 'stacked';\n    }\n\n    if (!graphType) {\n      graphType = this.currentGraph;\n    }\n\n    if (this.points) {\n      delete this.points;\n    }\n\n    // we cannot display regular area charts for a single year, so we display as a full-width column\n    if (yearLabels.length === 1 && (graphType === 'stacked' || graphType === 'percentage')) {\n      groupPadding = 0;\n      pointPadding = 0;\n      if (graphType === 'percentage') {\n        stacking = 'percent';\n        yUnit = '%';\n      } else if (graphType === 'line') {\n        stacking = '';\n      }\n      graphType = 'bar';\n    }\n\n    //ISSUE(LELAND) -> in stacked bar chart -> excessive negatives forces down chart\n    //Afterlooking at JSFiddles -> issues is highcharts adds all columns up to find the total (not absolute)...NEED to change HC source\n    switch (graphType) {\n    case 'line':\n      stacking = '';\n      break;\n    case 'stacked':\n      highchartsChartType = 'area';\n      stacking = 'normal';\n      break;\n    case 'percentage':\n      highchartsChartType = 'area';\n      stacking = 'percent';\n      yUnit = '%';\n      break;\n    case 'bar':\n      highchartsChartType = 'column';\n      startOnTick = false;\n      minPadding = maxPadding = 1 / (2 * yearLabels.length);\n      break;\n    }\n\n    const grouping = this.graphType === 'bar' && accountType === 'types';\n\n    if (grouping) {\n      stacking = false;\n    }\n\n    options = {\n      graphType,\n      type: highchartsChartType,\n      stacking,\n      grouping,\n      groupPadding,\n      pointPadding,\n      xText: xAxisTitle,\n      xAxisMargin,\n      minPadding,\n      maxPadding,\n      startOnTick,\n      yAxisScale,\n      yUnit\n    };\n    this.options = options;\n\n    if (this.chart) {\n      this.chart.options.plotOptions.column.grouping = options.grouping;\n      this.chart.options.plotOptions.column.stacking = options.stacking;\n    }\n\n    this.removeAllOverlays(false);\n\n    if (this.chart && lastGraph === this.lastGraph) {\n      this.sameTypeDifferentData(options);\n    } else {\n      if (this.chart && lastGraph === 'pie') {\n        // we reset the selected dataset index every time we change the chart type.\n        if (!(this.chart.pos && this.chart.pos < this.yearLabels.length)) {\n          this.chart.pos = this.yearLabels.length - 1;\n          this.athenaState.set('selectedDataSetIndex', this.yearLabels.length - 1);\n        }\n      }\n    }\n    //Ensures that all axes and labels from previous graphs are cleared\n    //when new chart is constructed every time.\n    this.buildChart(options);\n\n    this.constructOverlay(this.overlay, this.metricData);\n\n    switch (graphType) {\n    case 'bar':\n      // ensures dashed border\n      setPointStateForSeries(this.chart.series);\n      break;\n    case 'stacked':\n    case 'percentage':\n      this.attachAreaEvents(this.chart.series);\n      break;\n    case 'line':\n      if (yearLabels.length === 1) {\n        this.addPlotLines();\n      }\n      break;\n    case 'pie':\n      break;\n    }\n\n    this.lastGraph = lastGraph;\n    this.currentGraph = graphType;\n    this.removeAnnotations();\n    this.addAnnotations();\n  }\n\n  getPointsFromSeries(id) {\n    const selectedSeries = filterSelectedSeries(this.chart.series, id);\n\n    return _.flatten(_.map(selectedSeries, (series: { options: { stack }, data }) => {\n      if (series.options.stack > 0 && this.graphType !== 'bar') {\n        return _.tail(series.data);\n      } else {\n        return series.data;\n      }\n    }));\n  }\n\n  constructNewSeries(type, stacking, index) {\n    let data = this.data;\n    let yearLabels = this.yearLabels;\n    let colors = this.colors();\n    let point_id = 0;\n    let newSeries = [];\n    let self = this;\n    let seriesData;\n    let color;\n    let generateLine;\n    let generatePie;\n    let name;\n    let series_id;\n    let childless;\n    let amt;\n    let seriesInLine;\n    let currentDataType;\n    let seriesDataType;\n    let prev;\n    let annotation;\n\n    const dataTypes = this.dataTypes();\n\n    let seriesAnimation = getAnimationDuration();\n\n    switch (type) {\n    // for line and area graphs we have to make separate series for actual data\n    // and budget data in order to display the dashed line\n    case 'line':\n    case 'area':\n      generateLine = function(d, _i, g) {\n        seriesData = [];\n        seriesInLine = 0;\n        seriesDataType = _.head(dataTypes);\n        name = strings.nodeName(d);\n        series_id = d.id;\n        childless = d.childless && _.size(g) === 1;\n        for (let i = 0; i < dataTypes.length; i++) {\n          if (d.amounts[i]) {\n            amt = d.amounts[i].value;\n            annotation = d.amounts[i].annotation;\n          }\n          currentDataType = dataTypes[i];\n\n          if (currentDataType === seriesDataType) {\n            seriesData.push({\n              x: i,\n              y: amt,\n              id: point_id++,\n              dataType: d.amounts[i].type,\n              series_id,\n              seriesName: name,\n              childless,\n              annotation\n            });\n          } else {\n            color = colors[d.id];\n            prev = _.last(seriesData);\n\n            newSeries.push({\n              name,\n              type,\n              stacking,\n              id: series_id,\n              color: getColorForDatasetType(color, seriesDataType),\n              fillColor: getColorForDatasetType(color, seriesDataType),\n              data: seriesData,\n              dashStyle: getDashStyleForDatasetType(seriesDataType),\n              fillOpacity: getFillOpacity(seriesDataType),\n              stack: seriesInLine,\n              animation: seriesAnimation,\n              pointPlacement: 'on',\n              showInLegend: seriesInLine === 0,\n              overlay: false\n            });\n\n            seriesInLine++;\n\n            seriesData = [prev];\n            seriesDataType = currentDataType;\n            seriesData.push({\n              x: i,\n              y: amt,\n              id: point_id++,\n              dataType: d.amounts[i].type,\n              series_id,\n              seriesName: name,\n              childless,\n              annotation\n            });\n          }\n        }\n        // Make sure to add the last series\n        color = colors[d.id];\n\n        newSeries.push({\n          name,\n          type,\n          stacking,\n          id: series_id,\n          color: getColorForDatasetType(color, seriesDataType),\n          fillColor: getColorForDatasetType(color, seriesDataType),\n          data: seriesData,\n          dashStyle: getDashStyleForDatasetType(seriesDataType),\n          fillOpacity: getFillOpacity(seriesDataType),\n          stack: seriesInLine,\n          animation: seriesAnimation,\n          pointPlacement: 'on',\n          showInLegend: seriesInLine === 0,\n          overlay: false\n        });\n      };\n\n      _.each(data, generateLine);\n      break;\n    case 'column':\n      data.forEach((dataSet, index, g) => {\n        const seriesName = strings.nodeName(dataSet);\n        const series = {\n          animation: seriesAnimation,\n          borderWidth: 0,\n          childless: dataSet.childless && _.size(g) === 1,\n          color: getColorForDatasetType(colors[dataSet.id], _.head(dataTypes)),\n          data: [],\n          id: dataSet.id,\n          name: seriesName,\n          showInLegend: true,\n          type: 'column',\n          overlay: false\n        };\n\n        dataSet.amounts.forEach((dataPoint, index) => {\n          series.data.push({\n            annotation: dataPoint.annotation,\n            color: getColorForDatasetType(colors[dataSet.id], dataPoint.type),\n            dashStyle: getDashStyleForDatasetType(dataPoint.type),\n            dataType: dataPoint.type,\n            id: index,\n            series_id: dataSet.id,\n            seriesName,\n            x: index,\n            y: dataPoint.value\n          });\n        });\n\n        newSeries.push(series);\n      });\n\n      break;\n    case 'pie':\n      self.pieSeries = [];\n      generatePie = function(d, _i, g) {\n        color = colors[d.id];\n        amt = d.amounts[i].value;\n        seriesDataType = d.amounts[i].type;\n        const annotation = d.amounts[i].annotation;\n        const isPositive = amt > 0;\n        if (!isPositive) {\n          amt = -1 * amt;\n          color = setColorOpacityForDataSetType(color, FAINT_OPACITY / 2, seriesDataType);\n        } else {\n          color = setColorOpacityForDataSetType(color, REGULAR_OPACITY, seriesDataType);\n        }\n\n        return {\n          name: strings.nodeName(d),\n          series_id: d.id,\n          childless: d.childless && _.size(g) === 1,\n          // NOTE: color here has already been assigned by the if statement above\n          // all we do here is make sure that we return either color or pattern for projection and budget\n          color: getColorForDatasetType(color, seriesDataType),\n          y: amt,\n          dataType: d.amounts[i].type,\n          annotation,\n          positive: isPositive\n        };\n      };\n      for (var i = 0; i < (_.head(data) as any).amounts.length; i++) {\n        seriesData = _.map(data, generatePie);\n        self.pieSeries.push({\n          name: yearLabels[i],\n          data: seriesData,\n          type,\n          animation: false,\n          borderWidth: 0,\n          overlay: false\n        });\n      }\n\n      var pieSeries: any = self.getPieSeries(index); //index becomes the key...\n      pieSeries.animation = seriesAnimation;\n      newSeries.push(pieSeries);\n      break;\n    }\n\n    return newSeries;\n  }\n\n  removeAllSeries() {\n    let chart = this.chart;\n    let yAxis;\n    if (chart) {\n      _.each(chart && chart.series, (series) => {\n        this.unhighlightSeries(series.options.id);\n      });\n      while (chart.series && chart.series.length > 0) {\n        (_.head(chart.series) as any).remove(false);\n      }\n\n      yAxis = _.head(chart && chart.yAxis);\n      _.each(chart && chart.plotLines, function(line) {\n        yAxis.removePlotLine(line);\n      });\n      chart.plotLines = [];\n    }\n  }\n\n  removeAllOverlays(redraw) {\n    if (this.chart && this.chart.series && this.chart.yAxis && this.metricData.size > 0) {\n      let somethingRemoved = false;\n      _.forEach(this.chart.series, (serie) => {\n        if (serie && serie.userOptions.overlay) {\n          serie.remove(false);\n          somethingRemoved = true;\n        }\n      });\n      _.forEach(this.chart.yAxis, (yAxis) => {\n        if (yAxis.userOptions.overlay) {\n          yAxis.remove(false);\n          somethingRemoved = true;\n        }\n      });\n      const shouldRedraw = _.isUndefined(redraw) ? true : redraw;\n      if (somethingRemoved && shouldRedraw) {\n        this.chart.redraw();\n      }\n    }\n  }\n\n  constructOverlay(overlay, metricData) {\n    this.overlay = overlay;\n    this.metricData = metricData;\n    const selectedOverlay = overlay.getIn(['selected', 0]);\n    const graphType = this.options.graphType;\n    const overlayCompatibleCharts = overlay.get('overlayCompatibleCharts');\n\n    if (_.isNull(selectedOverlay) || !overlayCompatibleCharts.includes(graphType)) {\n      return;\n    }\n\n    const selectedData = metricData.get(selectedOverlay);\n    if (!_.isUndefined(selectedData)) {\n      const fiscalYearRange = SummaryReportStore.getState().get('fiscalYearRange');\n      const years = selectedData.get('years');\n\n      const dataSets = _.filter(this.athenaState.get('report').attributes.data_sets, (ds: any) =>\n        ds.year >= fiscalYearRange.get(0) && ds.year <= fiscalYearRange.get(1));\n\n      const yearData = _.map(dataSets, (ds, i) => {\n        const year = parseInt(ds.year);\n        const currentItem = years.find((yr) => yr.get('year') === year);\n        const interpolate = currentItem.get('interpolate_display');\n        const fillColor = interpolate ? 'white' : 'black';\n        return {\n          x: i,\n          y: currentItem.get('value'),\n          year,\n          interpolate,\n          marker: {\n            fillColor,\n            lineWidth: 2,\n            lineColor: 'black'\n          },\n          seriesName: selectedData.get('metric_type'),\n          series_id: selectedData.get('metric_type'),\n          childless: true\n        };\n      });\n\n      let yearDataPartitioned = [];\n      let segment = [];\n      let previous = yearData[0].interpolate;\n      _.forEach(yearData, (year) => {\n        if (previous === year.interpolate) {\n          segment.push(year);\n        } else {\n          yearDataPartitioned.push(segment);\n          segment = [year];\n        }\n        previous = year.interpolate;\n      });\n      if (_.size(segment) > 0) {\n        yearDataPartitioned.push(segment); //pushing the last segment\n      }\n\n      const constructOverlaySeries = (data, dashStyle) => {\n        return {\n          data,\n          type:'line',\n          dashStyle,\n          name: 'overlay',\n          color: 'black',\n          stacking: '',\n          yAxis: 1, //Counting starts at 0,\n          overlay: true,\n          id: selectedData.get('metric_type')\n        };\n      };\n\n      let seriesPartitioned = [];\n      let seriesSegment = [];\n      _.forEach(yearDataPartitioned, (partition: any[]) => {\n        if (_.isUndefined(_.head(partition).interpolate) && _.size(partition) >= 2) {\n          seriesPartitioned.push(constructOverlaySeries(partition, 'none'));\n\n          seriesSegment.push(_.head(partition));\n          seriesPartitioned.push(constructOverlaySeries(seriesSegment, 'solid'));\n          seriesSegment = [_.last(partition)];\n        } else {\n          _.forEach(partition, (part) => {\n            seriesSegment.push(part);\n          });\n        }\n      });\n      if (_.size(seriesSegment) > 0) {\n        seriesPartitioned.push(constructOverlaySeries(seriesSegment, 'solid'));\n      }\n\n      const axisExtremes = this.calculateAxisExtremes('line', seriesPartitioned, '');\n      const overlayAxis = {\n        labels: {\n          style: { color: axisTextColor, ...fontStyle },\n          formatter: this.yAxisLabelFormatter(this.options)\n        },\n        title: {\n          text: selectedData.get('name') + ' (' + selectedData.get('units') + ')',\n          style: { color: axisTextColor, fontWeight: 'bold', ...fontStyle },\n          rotation: 270\n        },\n        opposite: true,\n        gridLineWidth: 0,\n        overlay: true,\n        min: axisExtremes.min,\n        max: axisExtremes.max\n      };\n\n      this.chart.addAxis(overlayAxis, false);\n\n      _.forEach(seriesPartitioned, (series) => {\n        this.chart.addSeries(series, false); //not redrawing when adding the series until the end to save performance\n      });\n      this.chart.redraw(getAnimationDuration());\n    }\n  }\n\n  buildChart(options) {\n    let graphType = options.graphType;\n    let type = options.type;\n    let stacking = options.stacking;\n    let chartOptions;\n    let graphPos;\n    let idx;\n    let hasZeroLine;\n    let axisExtremes;\n\n    chartOptions = this.chartOptions(options);\n\n    const selectedDataSetIndex = Number(this.athenaState.attributes.selectedDataSetIndex);\n\n    // chart.pos is clobbered by the slider/chart init process\n    // so we need a place holder\n    if (!_.isUndefined(this.startYear)) {\n      idx = _.indexOf(this.yearOrder, this.startYear);\n      graphPos = ~idx ? idx : this.yearOrder.length - 1;\n    } else if (selectedDataSetIndex < this.yearLabels.length && selectedDataSetIndex >= 0) {\n      // Important for navigation between charts of any kind to pie chart and\n      // Important for refreshes and for direct URLs to a specific pie chart\n      graphPos = selectedDataSetIndex;\n    } else {\n      graphPos = this.yearLabels.length - 1;\n    }\n    this.currentGraph = graphType;\n\n    chartOptions.series = this.constructNewSeries(type, stacking, graphPos);\n\n    hasZeroLine = false;\n\n    axisExtremes = this.calculateAxisExtremes(this.currentGraph, chartOptions.series, stacking);\n    chartOptions.yAxis.min = axisExtremes.min;\n    chartOptions.yAxis.max = axisExtremes.max;\n\n    if (axisExtremes.min < 0) {\n      chartOptions.yAxis.plotLines = [{\n        value: 0,\n        width: 2,\n        color: axisColor,\n        id: 'zero-plot-line'\n      }];\n      hasZeroLine = true;\n    }\n\n    if (this.chart) {\n      this.chart.destroy();\n    }\n\n    // @ts-ignore https://github.com/highcharts/highcharts/issues/12663\n    Highcharts.seriesTypes.pie.prototype.drawEmpty = function(){};\n\n    this.chart = new Highcharts.Chart(chartOptions, function() {\n      this.hasZeroLine = hasZeroLine;\n      this.plotLines = [];\n      this.pos = graphPos;\n      this.container.style.overflow = this.renderer.box.style.overflow = 'visible';\n    });\n\n    if (type === 'pie') {\n      this.getPieSeries(graphPos).animation = false;\n    }\n  }\n\n  chartOptions(options) {\n    let graphType = options.graphType;\n    let self = this;\n    let plotOptions;\n\n    plotOptions = {\n      area: {\n        lineWidth: 1\n      },\n      column: {\n        stacking: options.stacking,\n        grouping: options.grouping,\n        cursor: 'pointer',\n        groupPadding: options.groupPadding,\n        pointPadding: options.pointPadding\n      },\n      pie: {\n        dataLabels: {\n          formatter() { //Note an arrow function will change the scope of `this`\n            const reportAmountType = SummaryReportStore.getReportAmountType();\n            const str = reportAmountType.formatter(formatValue(reportAmountType.symbol, this.y));\n            const percentage = '(' + (this.y / this.total * 100).toFixed(1) + '%)';\n            return `<strong>${this.key}</strong> <br/> <span>${str} ${percentage}</span>`;\n          },\n          overflow: 'none',\n          useHTML: true,\n          style: fontStyle\n        },\n        startAngle: 135\n      },\n      series: {\n        marker: {\n          symbol: 'circle'\n        },\n        states: {\n          hover: {\n            // NOTE: we removed halo effect because the highchart's native halo was overlapping\n            // with our patterns.\n            enabled: false\n          },\n          inactive: {\n            opacity: 1\n          }\n        },\n        point: {\n          events: {\n            click() {\n              if (!this.options.childless) {\n                SummaryReportActions.drill(this.options.series_id);\n              }\n            },\n            mouseOver() {\n              const { series_id } = this.options;\n              const index = graphType === 'pie' ? self.chart.pos : this.x;\n              self.handleTooltip('highlightNodeAmount', series_id, index);\n\n              if (graphType !== 'pie') {\n                const selectedSeries = filterSelectedSeries(self.chart.series, series_id);\n                brightenSeries(selectedSeries, HIGHLIGHT_OPACITY, 'hover');\n              } else {\n                brightenSeries(self.chart.series, HIGHLIGHT_OPACITY, 'hover', series_id);\n              }\n\n              $('#legend_' + series_id).addClass('hover');\n            },\n            mouseOut() {\n              const { series_id } = this.options;\n              self.handleTooltip();\n\n              if (graphType !== 'pie') {\n                const selectedSeries = filterSelectedSeries(self.chart.series, series_id);\n                brightenSeries(selectedSeries, -HIGHLIGHT_OPACITY);\n              } else {\n                brightenSeries(self.chart.series, -HIGHLIGHT_OPACITY, null, series_id);\n              }\n              $('#legend_' + series_id).removeClass('hover');\n            }\n          }\n        }\n      }\n    };\n\n    let patternColors = getPatternFillForColors(this.colors(), 'projection');\n    patternColors = patternColors.concat(getPatternFillForColors(this.colors(), 'budget'));\n\n    return {\n      chart: {\n        spacingLeft: 0,\n        renderTo: this.container,\n        borderRadius: 0,\n        animation: getAnimationDuration(),\n        events: {\n          redraw() {\n            self.addAnnotations();\n          }\n        }\n      },\n      style: fontStyle,\n      credits: {\n        enabled: false\n      },\n      colors: _.map(this.colors(), (i) => i),\n      defs: {\n        // NOTE: this is where we initialize patterns\n        patterns: patternColors\n      },\n      plotOptions,\n      title: {\n        text: '',\n        useHTML: true\n      },\n      legend: {\n        enabled: false,\n        useHTML: true\n      },\n      exporting: {\n        enabled: false\n      },\n      xAxis: {\n        title: {\n          text: options.xText,\n          useHTML: true,\n          margin: options.xAxisMargin,\n          style: _.extend({ color: axisTextColor, fontWeight: 'bold' }, fontStyle)\n        },\n        labels: {\n          step: 1,\n          useHTML: true,\n          style: _.extend({\n            width: '100%',\n            color: axisTextColor,\n            textAlign: 'center'\n          }, fontStyle),\n          formatter: function() {\n            if (graphType !== 'bar') {\n              if (this.value == _.head(this.axis.categories)) {\n                return '<div style=\"text-align: left;float:left;margin-left:50px;\">' + this.value + '</div>';\n              } else if (this.value == _.last(this.axis.categories)) {\n                return '<div style=\"text-align: right;float:right;margin-right:50px;\">' + this.value + '</div>';\n              }\n            }\n            return this.value;\n          },\n        },\n        tickmarkPlacement: 'on',\n        categories: this.yearLabels,\n        minPadding: options.minPadding,\n        maxPadding: options.maxPadding,\n        startOnTick: options.startOnTick,\n        lineWidth: 2,\n        lineColor: axisColor,\n        tickWidth: 0\n      },\n      yAxis: [{\n        title: {\n          text: strings.yAxis({units: options.yUnit, yAxisScale: options.yAxisScale}),\n          useHTML: true,\n          offset: options.yAxisScale ? null : 65,\n          style: _.extend({color: axisTextColor, fontWeight: 'bold'}, fontStyle)\n        },\n        labels: {\n          style: _.extend({color: axisTextColor}, fontStyle),\n          useHTML: true,\n          formatter: this.yAxisLabelFormatter(options)\n        },\n        maxPadding: 0,\n        minPadding: 0,\n        endOnTick: false,\n        lineWidth: 0,\n        gridLineWidth: 0,\n        plotLines: []\n      }],\n      tooltip: {\n        enabled: false,\n        useHTML: true,\n        snap: 0\n      },\n      series: []\n    };\n  }\n\n  yAxisLabelFormatter(options) {\n    return function() {\n      if (options.yAxisScale) {\n        if (options.yAxisScale.type === 'monetary') {\n          return strings.yAxisLabel(this.value, options.yAxisScale);\n        }\n      }\n\n      return numeral(this.value).format('0.0a').toUpperCase();\n    };\n  }\n\n  sameTypeDifferentData(options) {\n    let chart = this.chart;\n    let newSeries;\n\n    this.removeAllSeries();\n    chart.xAxis[0].setCategories(this.yearLabels);\n    chart.xAxis[0].setTitle(options.xText);\n    chart.xAxis[0].setTitle({\n      text: options.xText,\n      margin: options.xAxisMargin,\n      style: this.textStyle\n    }, false);\n    chart.yAxis[0].setTitle({\n      text: strings.yAxis({units: options.yUnit, yAxisScale: options.yAxisScale})\n    });\n\n    chart.yAxis[0].update({\n      title: {\n        offset: options.yAxisScale ? null : 65,\n      },\n      labels: {\n        formatter: this.yAxisLabelFormatter(options)\n      }\n    });\n\n    newSeries = this.constructNewSeries(options.type, options.stacking, chart.pos);\n    _.each(newSeries, function(s) { chart.addSeries(s, false); });\n\n    this.setAxisExtremes(_.head(chart.yAxis), chart.series, options.stacking);\n\n    // rebuild patterns\n    let patternColors = getPatternFillForColors(this.colors(), 'projection');\n    patternColors = patternColors.concat(getPatternFillForColors(this.colors(), 'budget'));\n    const highChartRenderer = chart.renderer;\n    _.each(patternColors, pattern => highChartRenderer.addPattern(pattern.id, pattern));\n\n\n    chart.redraw();\n\n    if (options.graphType === 'pie') {\n      this.getPieSeries(chart.pos).animation = false;\n    }\n  }\n\n  animateTransition(options) {\n    let chart = this.chart;\n    let data = this.data;\n    let totals = this.totals;\n    let graphType = options.graphType;\n    let type = options.type;\n    let stacking = options.stacking;\n    let yUnit = options.yUnit;\n    let yAxisScale = options.yAxisScale;\n    let self = this;\n    let values = {};\n    let dataLine;\n    let row;\n    let id;\n    let prev;\n    let offset;\n    let index;\n    let divisor;\n    let yAxis;\n    let callback;\n\n    if (this.lastGraph === 'line') { // line --> stacked OR line --> percentage\n      id = (_.head(data) as any).id;\n\n      // calculate stacked offset of each point\n      row = _.map(_.head(data), () => 0);\n      prev = values[id] = row;\n      for (let i = 1; i < data.length; i++) {\n        dataLine = data[i];\n        id = dataLine.id;\n        if (values[id]) {\n          row = values[id];\n        } else {\n          row = [];\n          values[id] = row;\n        }\n        for (let j = 0; j < dataLine.amounts.length; j++) {\n          offset = data[i - 1].amounts[j].value;\n          if (offset) {\n            row[j] = prev[j] + offset;\n          }\n        }\n        prev = row;\n      }\n\n      // update each point to stacked total or percentage, for animation purposes\n      _.each(chart.series, function(s) {\n        _.each(s.data, function(point) {\n          id = point.options.series_id;\n          row = values[id];\n          index = point.x;\n          if (graphType === 'percentage') {\n            divisor = totals[index].absoluteAmount / 100;\n          } else {\n            divisor = 1;\n          }\n          if (totals && row) {\n            point.update((totals[index].amount - row[index]) / divisor, false);\n          }\n        });\n      });\n    } else if (graphType === 'line' || graphType === 'stacked') { // stacked --> line OR percentage --> line OR percentage --> stacked\n      _.each(chart.series, function(s) {\n        if (graphType === 'line') {\n          _.each(s.data, function(point) {\n            point.update(point.stackY, false);\n          });\n        } else {\n          _.each(s.data, function(point) {\n            point.update(point.percentage, false);\n          });\n        }\n        s.update({\n          type,\n          stacking\n        }, false);\n      });\n\n      chart.redraw();\n\n      _.each(chart.series, function(s) {\n        dataLine = _.find(data, function(d) { return d.id === s.options.id; });\n        _.each(s.data, function(point) {\n          if (dataLine) {\n            point.update(dataLine.amounts[point.x].value, false);\n          }\n        });\n      });\n    } else {  // stacked --> percentage\n      _.each(chart.series, function(s) {\n        _.each(s.data, function(point) {\n          point.update(100 * (point.y / totals[point.x].absoluteAmount), false);\n        });\n      });\n    }\n\n    this.currentGraph = graphType;\n    yAxis = _.head(chart.yAxis);\n    yAxis.setTitle({text: strings.yAxis({units: yUnit, yAxisScale})}, false);\n    this.setAxisExtremes(yAxis, chart.series, stacking);\n    chart.redraw();\n\n    if (this.lastGraph === 'line' || this.lastGraph === 'stacked') {\n      callback = function() { // changes graph type once animation is complete\n        _.each(chart.series, function(s) {\n          dataLine = _.find(data, function(d) { return d.id === s.options.id; });\n\n          _.each(s.data, function(point) {\n            if (dataLine) {\n              point.update(dataLine.amounts[point.x].value, false);\n            }\n          });\n\n          delete self.points;\n\n          s.update({\n            type,\n            stacking\n          }, false);\n        });\n\n        self.chart.redraw();\n        if (type === 'area') {\n          self.attachAreaEvents(chart.series);\n        }\n      };\n\n      _.each(chart.series, function(s) { s.isDirty = true; }); // ensure that redraw is actually fired\n\n      chart.redraw({\n        ...getAnimationDuration(),\n        complete: callback\n      });\n    }\n  }\n\n  setAxisExtremes(yAxis, series, stacking) {\n    const extremes = this.calculateAxisExtremes(this.currentGraph, series, stacking);\n    const min = extremes.min;\n    const max = extremes.max;\n\n    // we only want a plot line when the extreme is below zero for non-pie type charts\n    if (min < 0 && this.graphType !== 'pie') {\n      if (!this.chart.hasZeroLine) {\n        yAxis.addPlotLine({\n          value: 0,\n          width: 2,\n          color: axisColor,\n          id: 'zero-plot-line'\n        });\n        this.chart.hasZeroLine = true;\n      }\n    } else {\n      if (this.chart.hasZeroLine) {\n        yAxis.removePlotLine('zero-plot-line');\n        this.chart.hasZeroLine = false;\n      }\n    }\n    yAxis.setExtremes(min, max, false);\n  }\n\n  calculateAxisExtremes(currentGraph, series, stacking) {\n    const totals = this.totals; //array of total data associated with each x-axis item\n    let minVal = 0;\n    let maxVal = 0;\n    let data = [];\n\n    if (currentGraph !== 'stacked' && stacking !== 'normal') {\n      const updateMinMax = function(d) {\n        if (d.y < minVal) {\n          minVal = d.y;\n        }\n        if (d.y > maxVal) {\n          maxVal = d.y;\n        }\n      };\n      const updateBySeries = function(s) {\n        data = [];\n        if (s.data.length > 0) {\n          data = s.data;\n        } else if (s.options.data.length > 0) {\n          data = s.options.data;\n        }\n        _.each(data, updateMinMax);\n      };\n\n      if (stacking === 'normal') {\n        maxVal = (_.maxBy(totals, 'amount') as any).amount;\n      }\n      _.each(series, updateBySeries);\n    }\n\n    if (currentGraph === 'stacked' || stacking === 'normal') {\n      //Stacked graphs -> need to find max / mins of columns (rather than individual series)\n      maxVal = (_.maxBy(totals, 'pos_only') as any).pos_only;\n      minVal = (_.minBy(totals, 'neg_only') as any).neg_only;\n    }\n\n    if (stacking === 'percent') {\n      minVal = minVal < 0 ? -100 : 0;\n      maxVal = 100;\n    }\n\n    return {\n      min: minVal,\n      max: maxVal + 0.5 // if we don't increase the max slightly, point markers get cut off\n    };\n  }\n\n  addPlotLines() {\n    let colors = this.colors();\n    let chart = this.chart;\n    let yAxis: any = _.head(chart.yAxis);\n    let series = chart.series;\n    let self = this;\n    let point;\n    let id;\n    _.each(series, function(s) {\n      point = _.head(s.data);\n      id = s.options.id;\n      yAxis.addPlotLine({\n        value: point.y,\n        color: colors[id],\n        width: 2,\n        id,\n        childless: point.options.childless,\n        events: {\n          click() {\n            if (!this.options.childless) {\n              SummaryReportActions.drill(this.id);\n            }\n          },\n          mouseover() {\n            self.highlightSeries(this.id);\n            $('#legend_' + this.id).addClass('hover');\n          },\n          mouseout() {\n            self.unhighlightSeries(this.id);\n            $('#legend_' + this.id).removeClass('hover');\n          }\n        }\n      });\n      chart.plotLines.push(id);\n    });\n  }\n\n  size(width, height) {\n    if (this.chart) {\n      this.chart.setSize(width, height);//, false);\n    }\n  }\n\n  // Highcharts does not support events on filled areas\n  attachAreaEvents(series) {\n    _.each(series, (s) => {\n      if (!_.isUndefined(s.area)) {\n        s.area.element.onclick = () => {\n          const point: any = _.head(s.points);\n          if (!point.options.childless) {\n            SummaryReportActions.drill(s.options.id);\n          }\n        };\n        s.area.element.onmouseover = () => {\n          const id = s.options.id;\n          const selectedSeries = filterSelectedSeries(this.chart.series, id);\n          if (!(this.chart.hoverPoint && this.chart.hoverPoint.options.series_id === id)) {\n            this.chart.pointer.reset(false);\n            brightenSeries(selectedSeries, HIGHLIGHT_OPACITY, 'hover');\n            this.handleTooltip('highlightNode', id);\n          } else {\n            this.handleTooltip();\n          }\n          $('#legend_' + id).addClass('hover');\n        };\n        s.area.element.onmouseout = () => {\n          const id = s.options.id;\n          const selectedSeries = filterSelectedSeries(this.chart.series, id);\n          if (!(this.chart.hoverPoint && this.chart.hoverPoint.options.series_id === id)) {\n            brightenSeries(selectedSeries, -HIGHLIGHT_OPACITY);\n          }\n          this.handleTooltip();\n          $('#legend_' + id).removeClass('hover');\n        };\n      }\n    });\n  }\n\n  colors() {\n    const lines = SummaryReportStore.getRenderedData(true).lines;\n    const map = {};\n\n    // from pythia.Color\n    _.each(lines, function(line) {\n      let hex = line.color.toString(16);\n      for (let i = hex.length; i < 6; i++) {\n        hex = '0' + hex;\n      }\n      map[line.id] = '#' + hex;\n    });\n\n    return map;\n  }\n\n  highlightSeries(series_id) {\n    this.highlightedSeries = series_id;\n    if (this.currentGraph === 'pie') {\n      const slice = this.getSeriesSlice(series_id);\n      if (slice) {\n        slice.setState('hover');\n      }\n    } else {\n      const selectedSeries = filterSelectedSeries(this.chart.series, series_id);\n      brightenSeries(selectedSeries, HIGHLIGHT_OPACITY, 'hover');\n      setPointStateForSeries(selectedSeries, 'hover');\n    }\n  }\n\n  getSeriesSlice(seriesId): any {\n    if (_.isEmpty(this.chart.series)) {\n      return;\n    }\n\n    return _.find(_.head(this.chart.series as any[]).data, function(d) {\n      return d.options.series_id === seriesId;\n    });\n  }\n\n  unhighlightSeries(series_id) {\n    if (this.currentGraph === 'pie') {\n      const slice = this.getSeriesSlice(series_id);\n      if (slice) {\n        slice.setState();\n      }\n    } else {\n      const selectedSeries = filterSelectedSeries(this.chart.series, series_id);\n      brightenSeries(selectedSeries, -HIGHLIGHT_OPACITY);\n      setPointStateForSeries(selectedSeries);\n    }\n    this.highlightedSeries = null;\n  }\n\n  addAnnotations() {\n    this.removeAnnotations();\n\n    if (!SummaryReportStore.getState().get('isAnnotationsPanelOpen')) {\n      return;\n    }\n\n    _.each(this.chart.series, _.bind(this.annotateSeries, this));\n  }\n\n  annotateSeries(series) {\n    _.each(series.data, _.bind(this.annotatePoint, this));\n  }\n\n  annotatePoint(point) {\n    if (!point.annotation) {\n      return;\n    }\n\n    if (!this.points) {\n      const series = this.chart.series;\n      const pointsArray = [];\n      _.each(series, function(s) {\n        _.each(s.data, function(point) {\n          pointsArray[point.id] = point;\n        });\n      });\n      this.points = pointsArray;\n    }\n\n    const point_id = point.id;\n\n    const htmlAnnotation = $('<div class=\"graph__annotation\"><div class=\"graph__annotation__pulse\"></div></div>');\n    htmlAnnotation.css({position: 'absolute'});\n    $('#graph').append(htmlAnnotation);\n    const width = htmlAnnotation.width();\n    const height = htmlAnnotation.height();\n\n    if (!_.isUndefined(point.plotX)) {\n      htmlAnnotation.css({\n        position: 'absolute',\n        left: this.chart.plotLeft + point.plotX - width / 2,\n        top: this.chart.plotTop + point.plotY - height\n      });\n    } else {\n      htmlAnnotation.css({\n        position: 'absolute',\n        left: this.chart.plotLeft + point.dataLabel.translateX + point.dataLabel.width + width / 2,\n        top: this.chart.plotTop + point.dataLabel.translateY + height\n      });\n    }\n\n    _.each(point.annotation, function(annotation) {\n      htmlAnnotation.addClass('annotation-' + annotation.id);\n    });\n\n    const self = this;\n    htmlAnnotation.on('mouseover', function() {\n      _.each(point.annotation, function(annotation) {\n        $('.annotation').addClass('hide');\n        $('.annotation-' + annotation.id).addClass('hover');\n      });\n    });\n    htmlAnnotation.on('mouseout', function() {\n      _.each(point.annotation, function(annotation) {\n        $('.annotation').removeClass('hide');\n        $('.annotation-' + annotation.id).removeClass('hover');\n      });\n    });\n    htmlAnnotation.on('click', function() {\n      self.reportEvents.trigger('scrollToAnnotationNode', point.annotation[0].primaryNode.id);\n    });\n\n    const oldAnnotation = this.annotations[point_id];\n    if (oldAnnotation) {\n      oldAnnotation.remove();\n    }\n    this.annotations[point_id] = htmlAnnotation;\n  }\n\n  removeAnnotations() {\n    _.each(this.annotations, _.bind(function(annotation, id) {\n      annotation.remove();\n      delete this.annotations[id];\n    }, this));\n  }\n\n  removeAnnotation(point_id) {\n    if (this.annotations[point_id]) {\n      this.annotations[point_id].remove();\n      delete this.annotations[point_id];\n    }\n  }\n\n  dataTypes() {\n    return this.data && this.data[0] && this.data[0].types;\n  }\n\n  getPieSeries(index): any {\n    index = Math.min(this.pieSeries.length - 1, index); //removes indexes that do not exist anymore\n    return _.find(this.pieSeries, (item, i) => {\n      if (i === index) {\n        return item;\n      }\n    });\n  }\n}\n\nexport default Graph;\n\n\nexport const isValidGraphType = function(graphType) {\n  return _.includes(validGraphTypes, graphType);\n};\n\n\nvar axisColor = '#737373';\nvar axisTextColor = '#737373';\nexport const validGraphTypes = ['percentage', 'stacked', 'line', 'pie', 'bar'];\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/graph.ts","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Path = require('../drawing/Path');\n\nvar _textDecoration = require('../parsing/textDecoration');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar addColorStops = function addColorStops(gradient, canvasGradient) {\n    var maxStop = Math.max.apply(null, gradient.colorStops.map(function (colorStop) {\n        return colorStop.stop;\n    }));\n    var f = 1 / Math.max(1, maxStop);\n    gradient.colorStops.forEach(function (colorStop) {\n        canvasGradient.addColorStop(f * colorStop.stop, colorStop.color.toString());\n    });\n};\n\nvar CanvasRenderer = function () {\n    function CanvasRenderer(canvas) {\n        _classCallCheck(this, CanvasRenderer);\n\n        this.canvas = canvas ? canvas : document.createElement('canvas');\n    }\n\n    _createClass(CanvasRenderer, [{\n        key: 'render',\n        value: function render(options) {\n            this.ctx = this.canvas.getContext('2d');\n            this.options = options;\n            this.canvas.width = Math.floor(options.width * options.scale);\n            this.canvas.height = Math.floor(options.height * options.scale);\n            this.canvas.style.width = options.width + 'px';\n            this.canvas.style.height = options.height + 'px';\n\n            this.ctx.scale(this.options.scale, this.options.scale);\n            this.ctx.translate(-options.x, -options.y);\n            this.ctx.textBaseline = 'bottom';\n            options.logger.log('Canvas renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + this.options.scale);\n        }\n    }, {\n        key: 'clip',\n        value: function clip(clipPaths, callback) {\n            var _this = this;\n\n            if (clipPaths.length) {\n                this.ctx.save();\n                clipPaths.forEach(function (path) {\n                    _this.path(path);\n                    _this.ctx.clip();\n                });\n            }\n\n            callback();\n\n            if (clipPaths.length) {\n                this.ctx.restore();\n            }\n        }\n    }, {\n        key: 'drawImage',\n        value: function drawImage(image, source, destination) {\n            this.ctx.drawImage(image, source.left, source.top, source.width, source.height, destination.left, destination.top, destination.width, destination.height);\n        }\n    }, {\n        key: 'drawShape',\n        value: function drawShape(path, color) {\n            this.path(path);\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fill();\n        }\n    }, {\n        key: 'fill',\n        value: function fill(color) {\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fill();\n        }\n    }, {\n        key: 'getTarget',\n        value: function getTarget() {\n            return Promise.resolve(this.canvas);\n        }\n    }, {\n        key: 'path',\n        value: function path(_path) {\n            var _this2 = this;\n\n            this.ctx.beginPath();\n            if (Array.isArray(_path)) {\n                _path.forEach(function (point, index) {\n                    var start = point.type === _Path.PATH.VECTOR ? point : point.start;\n                    if (index === 0) {\n                        _this2.ctx.moveTo(start.x, start.y);\n                    } else {\n                        _this2.ctx.lineTo(start.x, start.y);\n                    }\n\n                    if (point.type === _Path.PATH.BEZIER_CURVE) {\n                        _this2.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);\n                    }\n                });\n            } else {\n                this.ctx.arc(_path.x + _path.radius, _path.y + _path.radius, _path.radius, 0, Math.PI * 2, true);\n            }\n\n            this.ctx.closePath();\n        }\n    }, {\n        key: 'rectangle',\n        value: function rectangle(x, y, width, height, color) {\n            this.ctx.fillStyle = color.toString();\n            this.ctx.fillRect(x, y, width, height);\n        }\n    }, {\n        key: 'renderLinearGradient',\n        value: function renderLinearGradient(bounds, gradient) {\n            var linearGradient = this.ctx.createLinearGradient(bounds.left + gradient.direction.x1, bounds.top + gradient.direction.y1, bounds.left + gradient.direction.x0, bounds.top + gradient.direction.y0);\n\n            addColorStops(gradient, linearGradient);\n            this.ctx.fillStyle = linearGradient;\n            this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height);\n        }\n    }, {\n        key: 'renderRadialGradient',\n        value: function renderRadialGradient(bounds, gradient) {\n            var _this3 = this;\n\n            var x = bounds.left + gradient.center.x;\n            var y = bounds.top + gradient.center.y;\n\n            var radialGradient = this.ctx.createRadialGradient(x, y, 0, x, y, gradient.radius.x);\n            if (!radialGradient) {\n                return;\n            }\n\n            addColorStops(gradient, radialGradient);\n            this.ctx.fillStyle = radialGradient;\n\n            if (gradient.radius.x !== gradient.radius.y) {\n                // transforms for elliptical radial gradient\n                var midX = bounds.left + 0.5 * bounds.width;\n                var midY = bounds.top + 0.5 * bounds.height;\n                var f = gradient.radius.y / gradient.radius.x;\n                var invF = 1 / f;\n\n                this.transform(midX, midY, [1, 0, 0, f, 0, 0], function () {\n                    return _this3.ctx.fillRect(bounds.left, invF * (bounds.top - midY) + midY, bounds.width, bounds.height * invF);\n                });\n            } else {\n                this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height);\n            }\n        }\n    }, {\n        key: 'renderRepeat',\n        value: function renderRepeat(path, image, imageSize, offsetX, offsetY) {\n            this.path(path);\n            this.ctx.fillStyle = this.ctx.createPattern(this.resizeImage(image, imageSize), 'repeat');\n            this.ctx.translate(offsetX, offsetY);\n            this.ctx.fill();\n            this.ctx.translate(-offsetX, -offsetY);\n        }\n    }, {\n        key: 'renderTextNode',\n        value: function renderTextNode(textBounds, color, font, textDecoration, textShadows) {\n            var _this4 = this;\n\n            this.ctx.font = [font.fontStyle, font.fontVariant, font.fontWeight, font.fontSize, font.fontFamily].join(' ');\n\n            textBounds.forEach(function (text) {\n                _this4.ctx.fillStyle = color.toString();\n                if (textShadows && text.text.trim().length) {\n                    textShadows.slice(0).reverse().forEach(function (textShadow) {\n                        _this4.ctx.shadowColor = textShadow.color.toString();\n                        _this4.ctx.shadowOffsetX = textShadow.offsetX * _this4.options.scale;\n                        _this4.ctx.shadowOffsetY = textShadow.offsetY * _this4.options.scale;\n                        _this4.ctx.shadowBlur = textShadow.blur;\n\n                        _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\n                    });\n                } else {\n                    _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);\n                }\n\n                if (textDecoration !== null) {\n                    var textDecorationColor = textDecoration.textDecorationColor || color;\n                    textDecoration.textDecorationLine.forEach(function (textDecorationLine) {\n                        switch (textDecorationLine) {\n                            case _textDecoration.TEXT_DECORATION_LINE.UNDERLINE:\n                                // Draws a line at the baseline of the font\n                                // TODO As some browsers display the line as more than 1px if the font-size is big,\n                                // need to take that into account both in position and size\n                                var _options$fontMetrics$ = _this4.options.fontMetrics.getMetrics(font),\n                                    baseline = _options$fontMetrics$.baseline;\n\n                                _this4.rectangle(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1, textDecorationColor);\n                                break;\n                            case _textDecoration.TEXT_DECORATION_LINE.OVERLINE:\n                                _this4.rectangle(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1, textDecorationColor);\n                                break;\n                            case _textDecoration.TEXT_DECORATION_LINE.LINE_THROUGH:\n                                // TODO try and find exact position for line-through\n                                var _options$fontMetrics$2 = _this4.options.fontMetrics.getMetrics(font),\n                                    middle = _options$fontMetrics$2.middle;\n\n                                _this4.rectangle(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1, textDecorationColor);\n                                break;\n                        }\n                    });\n                }\n            });\n        }\n    }, {\n        key: 'resizeImage',\n        value: function resizeImage(image, size) {\n            if (image.width === size.width && image.height === size.height) {\n                return image;\n            }\n\n            var canvas = this.canvas.ownerDocument.createElement('canvas');\n            canvas.width = size.width;\n            canvas.height = size.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height);\n            return canvas;\n        }\n    }, {\n        key: 'setOpacity',\n        value: function setOpacity(opacity) {\n            this.ctx.globalAlpha = opacity;\n        }\n    }, {\n        key: 'transform',\n        value: function transform(offsetX, offsetY, matrix, callback) {\n            this.ctx.save();\n            this.ctx.translate(offsetX, offsetY);\n            this.ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n            this.ctx.translate(-offsetX, -offsetY);\n\n            callback();\n\n            this.ctx.restore();\n        }\n    }]);\n\n    return CanvasRenderer;\n}();\n\nexports.default = CanvasRenderer;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/renderer/CanvasRenderer.js\n// module id = 668\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Logger = function () {\n    function Logger(enabled, id, start) {\n        _classCallCheck(this, Logger);\n\n        this.enabled = enabled;\n        this.start = start ? start : Date.now();\n        this.id = id;\n    }\n\n    _createClass(Logger, [{\n        key: 'child',\n        value: function child(id) {\n            return new Logger(this.enabled, id, this.start);\n        }\n\n        // eslint-disable-next-line flowtype/no-weak-types\n\n    }, {\n        key: 'log',\n        value: function log() {\n            if (this.enabled && window.console && window.console.log) {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                    args[_key] = arguments[_key];\n                }\n\n                Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0)));\n            }\n        }\n\n        // eslint-disable-next-line flowtype/no-weak-types\n\n    }, {\n        key: 'error',\n        value: function error() {\n            if (this.enabled && window.console && window.console.error) {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                Function.prototype.bind.call(window.console.error, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0)));\n            }\n        }\n    }]);\n\n    return Logger;\n}();\n\nexports.default = Logger;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Logger.js\n// module id = 669\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parsePadding = exports.PADDING_SIDES = undefined;\n\nvar _Length = require('../Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PADDING_SIDES = exports.PADDING_SIDES = {\n    TOP: 0,\n    RIGHT: 1,\n    BOTTOM: 2,\n    LEFT: 3\n};\n\nvar SIDES = ['top', 'right', 'bottom', 'left'];\n\nvar parsePadding = exports.parsePadding = function parsePadding(style) {\n    return SIDES.map(function (side) {\n        return new _Length2.default(style.getPropertyValue('padding-' + side));\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/padding.js\n// module id = 670\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar POSITION = exports.POSITION = {\n    STATIC: 0,\n    RELATIVE: 1,\n    ABSOLUTE: 2,\n    FIXED: 3,\n    STICKY: 4\n};\n\nvar parsePosition = exports.parsePosition = function parsePosition(position) {\n    switch (position) {\n        case 'relative':\n            return POSITION.RELATIVE;\n        case 'absolute':\n            return POSITION.ABSOLUTE;\n        case 'fixed':\n            return POSITION.FIXED;\n        case 'sticky':\n            return POSITION.STICKY;\n    }\n\n    return POSITION.STATIC;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/position.js\n// module id = 671\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar TEXT_TRANSFORM = exports.TEXT_TRANSFORM = {\n    NONE: 0,\n    LOWERCASE: 1,\n    UPPERCASE: 2,\n    CAPITALIZE: 3\n};\n\nvar parseTextTransform = exports.parseTextTransform = function parseTextTransform(textTransform) {\n    switch (textTransform) {\n        case 'uppercase':\n            return TEXT_TRANSFORM.UPPERCASE;\n        case 'lowercase':\n            return TEXT_TRANSFORM.LOWERCASE;\n        case 'capitalize':\n            return TEXT_TRANSFORM.CAPITALIZE;\n    }\n\n    return TEXT_TRANSFORM.NONE;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/textTransform.js\n// module id = 672\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.reformatInputBounds = exports.inlineSelectElement = exports.inlineTextAreaElement = exports.inlineInputElement = exports.getInputBorderRadius = exports.INPUT_BACKGROUND = exports.INPUT_BORDERS = exports.INPUT_COLOR = undefined;\n\nvar _TextContainer = require('./TextContainer');\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _background = require('./parsing/background');\n\nvar _border = require('./parsing/border');\n\nvar _Circle = require('./drawing/Circle');\n\nvar _Circle2 = _interopRequireDefault(_Circle);\n\nvar _Vector = require('./drawing/Vector');\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nvar _Color = require('./Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = require('./Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Bounds = require('./Bounds');\n\nvar _TextBounds = require('./TextBounds');\n\nvar _Util = require('./Util');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar INPUT_COLOR = exports.INPUT_COLOR = new _Color2.default([42, 42, 42]);\nvar INPUT_BORDER_COLOR = new _Color2.default([165, 165, 165]);\nvar INPUT_BACKGROUND_COLOR = new _Color2.default([222, 222, 222]);\nvar INPUT_BORDER = {\n    borderWidth: 1,\n    borderColor: INPUT_BORDER_COLOR,\n    borderStyle: _border.BORDER_STYLE.SOLID\n};\nvar INPUT_BORDERS = exports.INPUT_BORDERS = [INPUT_BORDER, INPUT_BORDER, INPUT_BORDER, INPUT_BORDER];\nvar INPUT_BACKGROUND = exports.INPUT_BACKGROUND = {\n    backgroundColor: INPUT_BACKGROUND_COLOR,\n    backgroundImage: [],\n    backgroundClip: _background.BACKGROUND_CLIP.PADDING_BOX,\n    backgroundOrigin: _background.BACKGROUND_ORIGIN.PADDING_BOX\n};\n\nvar RADIO_BORDER_RADIUS = new _Length2.default('50%');\nvar RADIO_BORDER_RADIUS_TUPLE = [RADIO_BORDER_RADIUS, RADIO_BORDER_RADIUS];\nvar INPUT_RADIO_BORDER_RADIUS = [RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE];\n\nvar CHECKBOX_BORDER_RADIUS = new _Length2.default('3px');\nvar CHECKBOX_BORDER_RADIUS_TUPLE = [CHECKBOX_BORDER_RADIUS, CHECKBOX_BORDER_RADIUS];\nvar INPUT_CHECKBOX_BORDER_RADIUS = [CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE];\n\nvar getInputBorderRadius = exports.getInputBorderRadius = function getInputBorderRadius(node) {\n    return node.type === 'radio' ? INPUT_RADIO_BORDER_RADIUS : INPUT_CHECKBOX_BORDER_RADIUS;\n};\n\nvar inlineInputElement = exports.inlineInputElement = function inlineInputElement(node, container) {\n    if (node.type === 'radio' || node.type === 'checkbox') {\n        if (node.checked) {\n            var size = Math.min(container.bounds.width, container.bounds.height);\n            container.childNodes.push(node.type === 'checkbox' ? [new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79), new _Vector2.default(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549), new _Vector2.default(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071), new _Vector2.default(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649), new _Vector2.default(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23), new _Vector2.default(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085), new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)] : new _Circle2.default(container.bounds.left + size / 4, container.bounds.top + size / 4, size / 4));\n        }\n    } else {\n        inlineFormElement(getInputValue(node), node, container, false);\n    }\n};\n\nvar inlineTextAreaElement = exports.inlineTextAreaElement = function inlineTextAreaElement(node, container) {\n    inlineFormElement(node.value, node, container, true);\n};\n\nvar inlineSelectElement = exports.inlineSelectElement = function inlineSelectElement(node, container) {\n    var option = node.options[node.selectedIndex || 0];\n    inlineFormElement(option ? option.text || '' : '', node, container, false);\n};\n\nvar reformatInputBounds = exports.reformatInputBounds = function reformatInputBounds(bounds) {\n    if (bounds.width > bounds.height) {\n        bounds.left += (bounds.width - bounds.height) / 2;\n        bounds.width = bounds.height;\n    } else if (bounds.width < bounds.height) {\n        bounds.top += (bounds.height - bounds.width) / 2;\n        bounds.height = bounds.width;\n    }\n    return bounds;\n};\n\nvar inlineFormElement = function inlineFormElement(value, node, container, allowLinebreak) {\n    var body = node.ownerDocument.body;\n    if (value.length > 0 && body) {\n        var wrapper = node.ownerDocument.createElement('html2canvaswrapper');\n        (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node, null), wrapper);\n        wrapper.style.position = 'fixed';\n        wrapper.style.left = container.bounds.left + 'px';\n        wrapper.style.top = container.bounds.top + 'px';\n        if (!allowLinebreak) {\n            wrapper.style.whiteSpace = 'nowrap';\n        }\n        var text = node.ownerDocument.createTextNode(value);\n        wrapper.appendChild(text);\n        body.appendChild(wrapper);\n        container.childNodes.push(_TextContainer2.default.fromTextNode(text, container));\n        body.removeChild(wrapper);\n    }\n};\n\nvar getInputValue = function getInputValue(node) {\n    var value = node.type === 'password' ? new Array(node.value.length + 1).join('\\u2022') : node.value;\n\n    return value.length === 0 ? node.placeholder || '' : value;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Input.js\n// module id = 673\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextBounds = exports.TextBounds = undefined;\n\nvar _punycode = require('punycode');\n\nvar _Bounds = require('./Bounds');\n\nvar _textDecoration = require('./parsing/textDecoration');\n\nvar _Feature = require('./Feature');\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar UNICODE = /[^\\u0000-\\u00ff]/;\n\nvar hasUnicodeCharacters = function hasUnicodeCharacters(text) {\n    return UNICODE.test(text);\n};\n\nvar encodeCodePoint = function encodeCodePoint(codePoint) {\n    return _punycode.ucs2.encode([codePoint]);\n};\n\nvar TextBounds = exports.TextBounds = function TextBounds(text, bounds) {\n    _classCallCheck(this, TextBounds);\n\n    this.text = text;\n    this.bounds = bounds;\n};\n\nvar parseTextBounds = exports.parseTextBounds = function parseTextBounds(value, parent, node) {\n    var codePoints = _punycode.ucs2.decode(value);\n    var letterRendering = parent.style.letterSpacing !== 0 || hasUnicodeCharacters(value);\n    var textList = letterRendering ? codePoints.map(encodeCodePoint) : splitWords(codePoints);\n    var length = textList.length;\n    var defaultView = node.parentNode ? node.parentNode.ownerDocument.defaultView : null;\n    var scrollX = defaultView ? defaultView.pageXOffset : 0;\n    var scrollY = defaultView ? defaultView.pageYOffset : 0;\n    var textBounds = [];\n    var offset = 0;\n    for (var i = 0; i < length; i++) {\n        var text = textList[i];\n        if (parent.style.textDecoration !== _textDecoration.TEXT_DECORATION.NONE || text.trim().length > 0) {\n            if (_Feature2.default.SUPPORT_RANGE_BOUNDS) {\n                textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length, scrollX, scrollY)));\n            } else {\n                var replacementNode = node.splitText(text.length);\n                textBounds.push(new TextBounds(text, getWrapperBounds(node, scrollX, scrollY)));\n                node = replacementNode;\n            }\n        } else if (!_Feature2.default.SUPPORT_RANGE_BOUNDS) {\n            node = node.splitText(text.length);\n        }\n        offset += text.length;\n    }\n    return textBounds;\n};\n\nvar getWrapperBounds = function getWrapperBounds(node, scrollX, scrollY) {\n    var wrapper = node.ownerDocument.createElement('html2canvaswrapper');\n    wrapper.appendChild(node.cloneNode(true));\n    var parentNode = node.parentNode;\n    if (parentNode) {\n        parentNode.replaceChild(wrapper, node);\n        var bounds = (0, _Bounds.parseBounds)(wrapper, scrollX, scrollY);\n        if (wrapper.firstChild) {\n            parentNode.replaceChild(wrapper.firstChild, wrapper);\n        }\n        return bounds;\n    }\n    return new _Bounds.Bounds(0, 0, 0, 0);\n};\n\nvar getRangeBounds = function getRangeBounds(node, offset, length, scrollX, scrollY) {\n    var range = node.ownerDocument.createRange();\n    range.setStart(node, offset);\n    range.setEnd(node, offset + length);\n    return _Bounds.Bounds.fromClientRect(range.getBoundingClientRect(), scrollX, scrollY);\n};\n\nvar splitWords = function splitWords(codePoints) {\n    var words = [];\n    var i = 0;\n    var onWordBoundary = false;\n    var word = void 0;\n    while (codePoints.length) {\n        if (isWordBoundary(codePoints[i]) === onWordBoundary) {\n            word = codePoints.splice(0, i);\n            if (word.length) {\n                words.push(_punycode.ucs2.encode(word));\n            }\n            onWordBoundary = !onWordBoundary;\n            i = 0;\n        } else {\n            i++;\n        }\n\n        if (i >= codePoints.length) {\n            word = codePoints.splice(0, i);\n            if (word.length) {\n                words.push(_punycode.ucs2.encode(word));\n            }\n        }\n    }\n    return words;\n};\n\nvar isWordBoundary = function isWordBoundary(characterCode) {\n    return [32, // <space>\n    13, // \\r\n    10, // \\n\n    9, // \\t\n    45 // -\n    ].indexOf(characterCode) !== -1;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/TextBounds.js\n// module id = 674\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ForeignObjectRenderer = function () {\n    function ForeignObjectRenderer(element) {\n        _classCallCheck(this, ForeignObjectRenderer);\n\n        this.element = element;\n    }\n\n    _createClass(ForeignObjectRenderer, [{\n        key: 'render',\n        value: function render(options) {\n            var _this = this;\n\n            this.options = options;\n            this.canvas = document.createElement('canvas');\n            this.ctx = this.canvas.getContext('2d');\n            this.canvas.width = Math.floor(options.width) * options.scale;\n            this.canvas.height = Math.floor(options.height) * options.scale;\n            this.canvas.style.width = options.width + 'px';\n            this.canvas.style.height = options.height + 'px';\n\n            options.logger.log('ForeignObject renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + options.scale);\n            var svg = createForeignObjectSVG(Math.max(options.windowWidth, options.width) * options.scale, Math.max(options.windowHeight, options.height) * options.scale, options.scrollX * options.scale, options.scrollY * options.scale, this.element);\n\n            return loadSerializedSVG(svg).then(function (img) {\n                if (options.backgroundColor) {\n                    _this.ctx.fillStyle = options.backgroundColor.toString();\n                    _this.ctx.fillRect(0, 0, options.width * options.scale, options.height * options.scale);\n                }\n\n                _this.ctx.drawImage(img, -options.x * options.scale, -options.y * options.scale);\n                return _this.canvas;\n            });\n        }\n    }]);\n\n    return ForeignObjectRenderer;\n}();\n\nexports.default = ForeignObjectRenderer;\nvar createForeignObjectSVG = exports.createForeignObjectSVG = function createForeignObjectSVG(width, height, x, y, node) {\n    var xmlns = 'http://www.w3.org/2000/svg';\n    var svg = document.createElementNS(xmlns, 'svg');\n    var foreignObject = document.createElementNS(xmlns, 'foreignObject');\n    svg.setAttributeNS(null, 'width', width);\n    svg.setAttributeNS(null, 'height', height);\n\n    foreignObject.setAttributeNS(null, 'width', '100%');\n    foreignObject.setAttributeNS(null, 'height', '100%');\n    foreignObject.setAttributeNS(null, 'x', x);\n    foreignObject.setAttributeNS(null, 'y', y);\n    foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');\n    svg.appendChild(foreignObject);\n\n    foreignObject.appendChild(node);\n\n    return svg;\n};\n\nvar loadSerializedSVG = exports.loadSerializedSVG = function loadSerializedSVG(svg) {\n    return new Promise(function (resolve, reject) {\n        var img = new Image();\n        img.onload = function () {\n            return resolve(img);\n        };\n        img.onerror = reject;\n\n        img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/renderer/ForeignObjectRenderer.js\n// module id = 675\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.FontMetrics = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Util = require('./Util');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SAMPLE_TEXT = 'Hidden Text';\n\nvar FontMetrics = exports.FontMetrics = function () {\n    function FontMetrics(document) {\n        _classCallCheck(this, FontMetrics);\n\n        this._data = {};\n        this._document = document;\n    }\n\n    _createClass(FontMetrics, [{\n        key: '_parseMetrics',\n        value: function _parseMetrics(font) {\n            var container = this._document.createElement('div');\n            var img = this._document.createElement('img');\n            var span = this._document.createElement('span');\n\n            var body = this._document.body;\n            if (!body) {\n                throw new Error(process.env.NODE_ENV !== 'production' ? 'No document found for font metrics' : '');\n            }\n\n            container.style.visibility = 'hidden';\n            container.style.fontFamily = font.fontFamily;\n            container.style.fontSize = font.fontSize;\n            container.style.margin = '0';\n            container.style.padding = '0';\n\n            body.appendChild(container);\n\n            img.src = _Util.SMALL_IMAGE;\n            img.width = 1;\n            img.height = 1;\n\n            img.style.margin = '0';\n            img.style.padding = '0';\n            img.style.verticalAlign = 'baseline';\n\n            span.style.fontFamily = font.fontFamily;\n            span.style.fontSize = font.fontSize;\n            span.style.margin = '0';\n            span.style.padding = '0';\n\n            span.appendChild(this._document.createTextNode(SAMPLE_TEXT));\n            container.appendChild(span);\n            container.appendChild(img);\n            var baseline = img.offsetTop - span.offsetTop + 2;\n\n            container.removeChild(span);\n            container.appendChild(this._document.createTextNode(SAMPLE_TEXT));\n\n            container.style.lineHeight = 'normal';\n            img.style.verticalAlign = 'super';\n\n            var middle = img.offsetTop - container.offsetTop + 2;\n\n            body.removeChild(container);\n\n            return { baseline: baseline, middle: middle };\n        }\n    }, {\n        key: 'getMetrics',\n        value: function getMetrics(font) {\n            var key = font.fontFamily + ' ' + font.fontSize;\n            if (this._data[key] === undefined) {\n                this._data[key] = this._parseMetrics(font);\n            }\n\n            return this._data[key];\n        }\n    }]);\n\n    return FontMetrics;\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Font.js\n// module id = 676\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.Proxy = undefined;\n\nvar _Feature = require('./Feature');\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Proxy = exports.Proxy = function Proxy(src, options) {\n    if (!options.proxy) {\n        return Promise.reject(process.env.NODE_ENV !== 'production' ? 'No proxy defined' : null);\n    }\n    var proxy = options.proxy;\n\n    return new Promise(function (resolve, reject) {\n        var responseType = _Feature2.default.SUPPORT_CORS_XHR && _Feature2.default.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';\n        var xhr = _Feature2.default.SUPPORT_CORS_XHR ? new XMLHttpRequest() : new XDomainRequest();\n        xhr.onload = function () {\n            if (xhr instanceof XMLHttpRequest) {\n                if (xhr.status === 200) {\n                    if (responseType === 'text') {\n                        resolve(xhr.response);\n                    } else {\n                        var reader = new FileReader();\n                        // $FlowFixMe\n                        reader.addEventListener('load', function () {\n                            return resolve(reader.result);\n                        }, false);\n                        // $FlowFixMe\n                        reader.addEventListener('error', function (e) {\n                            return reject(e);\n                        }, false);\n                        reader.readAsDataURL(xhr.response);\n                    }\n                } else {\n                    reject(process.env.NODE_ENV !== 'production' ? 'Failed to proxy resource ' + src.substring(0, 256) + ' with status code ' + xhr.status : '');\n                }\n            } else {\n                resolve(xhr.responseText);\n            }\n        };\n\n        xhr.onerror = reject;\n        xhr.open('GET', proxy + '?url=' + encodeURIComponent(src) + '&responseType=' + responseType);\n\n        if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {\n            xhr.responseType = responseType;\n        }\n\n        if (options.imageTimeout) {\n            var timeout = options.imageTimeout;\n            xhr.timeout = timeout;\n            xhr.ontimeout = function () {\n                return reject(process.env.NODE_ENV !== 'production' ? 'Timed out (' + timeout + 'ms) proxying ' + src.substring(0, 256) : '');\n            };\n        }\n\n        xhr.send();\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Proxy.js\n// module id = 677\n// module chunks = 0 1","import React, { CSSProperties } from 'react';\nimport PropTypes from 'prop-types';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport _s from 'underscore.string';\nimport classNames from 'classnames';\nimport pureRenderMixin from 'react-pure-render/mixin';\n\nimport * as og from '../og';\nimport ReportActions from '../actions/report_actions';\nimport SummaryReportActions from '../actions/summary_report_actions';\nimport SummaryReportStore from '../stores/summary_report_store';\nimport strings from '../strings';\nimport Amount from '../amount';\n\nimport { numberTypes } from '../numberTypes';\nimport SummaryTableHead from './summary_table_head';\nimport * as DataSetUtils from '../utils/dataset_utils';\n\nimport { getHighlightingClass } from '../utils/summary_table_utils';\n\nconst getVarianceClassNames = (highlighting, highlightingVariance, percentVariance, unit, accountType, formulas) => {\n  return classNames(\n    'variance_cell',\n    (unit.isCurrency ? 'currency' : 'number'),\n    ((highlighting && unit.isCurrency) ? getHighlightingClass(accountType, highlightingVariance, percentVariance, formulas) : null)\n  );\n};\n\nconst updateScrollState = _.throttle((_this, state) => {\n  // This function throttles and bounces a state update out of the\n  // current stack to address the inability to scroll the table in IE-\n\n  // In IE, the act of changing the position of something during\n  // a scroll will stop the scroll action so, when we synchronously\n  // modify the position of the table header on scroll we stop the\n  // scroll, making scrolling impossible in IE\n\n  // This function makes sure that it happens asynchronously and does\n  // not interrupt the scroll\n  setTimeout(() => {\n    _this.setState(state);\n  }, 1);\n}, 1000 / 60); // throttled to 60FPS\n\nclass SummaryTable extends React.Component<any, any> {\n  static propTypes = {\n    isBalanceSheetReport: PropTypes.bool,\n    athenaState: PropTypes.object.isRequired,\n    reportEvents: PropTypes.object.isRequired,\n    expandedNodes: PropTypes.object.isRequired,\n    accountType: PropTypes.string.isRequired,\n    yAxisScale: PropTypes.object,\n    overlay: PropTypes.object,\n    scale: PropTypes.object,\n    metricData: PropTypes.object,\n    stickyHeader: PropTypes.bool,\n    highlighting: PropTypes.bool,\n    highlightingVariance: PropTypes.number,\n    projections: PropTypes.bool,\n    projectionType: PropTypes.string\n  };\n\n  state = this.getViewData();\n\n  /**\n   * listens to renderData event from athenaState\n   * Please see router.js for who triggers this event\n   */\n  setViewState = () => this.setState(this.getViewData());\n\n  componentWillMount() {\n    this.props.athenaState.on('renderData', this.setViewState);\n  }\n\n  componentWillUnmount() {\n    this.props.athenaState.off('renderData', this.setViewState);\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (\n      this.props.projections !== nextProps.projections\n      || this.props.projectionType !== nextProps.projectionType\n    ) {\n      this.setState(this.getViewData());\n    }\n  }\n\n  getFixedCellStyle(customStyles?) {\n    return Object.assign({\n      borderRightWidth: this.state.scrollLeft ? '1px' : 0,\n      left: this.state.scrollLeft,\n      position: 'relative'\n    }, customStyles);\n  }\n\n  handleDrillDown(line) {\n    if (!line.childless) {\n      SummaryReportActions.drill(line.id);\n    }\n  }\n\n  handleAllExpansion = () => {\n    if (_.some(this.state.trueLines, 'expanded')) {\n      SummaryReportActions.summarySetExpandedNodes({});\n    } else {\n      SummaryReportActions.summarySetExpandedNodes(_.map(this.state.trueLines, 'id'));\n    }\n    this.props.athenaState.pendingSelection = null;\n  }\n\n  _renderLine(hideUnitSymbol, unit, [line, ...sublines]) {\n    let expanded = this.props.expandedNodes[line.id];\n\n    // Override the expanded state in the store for fixed, expanded lines.\n    // This is needed in Revenue & Expense view where we want the top depth node always expanded.\n    // Ex:\n    //    - Revenues  <----------- expanded & fixed\n    //        - Revenues              |\n    //        - Transfers In          |\n    //    - Expenses  <---------------|\n    //        - Expenses\n    //        - Transfers Out\n    if (line.fixed && line.expanded) {\n      expanded = 'expanded';\n    }\n\n    const lines = [\n      <SummaryTableRow\n        key={line.id}\n        accountType={this.props.accountType}\n        highlighting={this.props.highlighting}\n        highlightingVariance={this.props.highlightingVariance}\n        athenaState={this.props.athenaState}\n        reportEvents={this.props.reportEvents}\n        hideUnitSymbol={hideUnitSymbol}\n        addSpace={true}\n        unit={unit}\n        line={line}\n        yAxisScale={this.props.yAxisScale}\n        expanded={expanded}\n        scrollLeft={this.state.scrollLeft}\n      />\n    ];\n\n    if (expanded) {\n      return lines.concat(\n        _.map(sublines, line => this._renderLine(true, unit, line))\n      );\n\n    } else {\n      return lines;\n    }\n  }\n\n  renderBody() {\n    const reportUnit = SummaryReportStore.getReportAmountType();\n\n    return (\n      <tbody>\n        {_.flatten(_.map(this.state.expandedLines, _.bind((line: any, idx) => {\n          return this._renderLine(idx !== 0, reportUnit, line);\n        }, this)))}\n      </tbody>\n    );\n  }\n\n  renderFooter() {\n    const totals = this.state.totals;\n    const reportUnit = SummaryReportStore.getReportAmountType();\n    const overlayRow = this._generateMetricRow('Overlay', this.props.overlay);\n    const scaleRow = this._generateMetricRow('Scale By', this.props.scale);\n    const customFooterStyles = this.props.isBalanceSheetReport ? { borderTop: 0, paddingLeft: '24px' } : {};\n    return (\n      <tfoot>\n        <tr className=\"position-relative\" key=\"footer\">\n          {_.reduce(totals, _.bind((agg, total: any, key) => {\n            agg.push(<SummaryTableCell isBalanceSheetReport={this.props.isBalanceSheetReport} key={key + 'cell'} {...total} addSpace={true} hideUnitSymbol={false} unit={reportUnit} />);\n            if (total.showVariance) {\n              agg.push(<td\n                key={key + 'currency'}\n                className={getVarianceClassNames(\n                  this.props.highlighting,\n                  this.props.highlightingVariance,\n                  total.percentVariance,\n                  reportUnit,\n                  this.props.accountType,\n                  this.props.athenaState.budgetData.formulas\n                )}\n                style={this.props.isBalanceSheetReport ? { borderTop: 0} : {}}>\n                  {strings.currencyNoDollar(total.variance)}\n                </td>\n              );\n              agg.push(<td key={key + 'percent'} style={this.props.balanceSheetReport ? { borderTop: 0} : {}} className=\"number\">{strings.percentage(total.percentVariance)}</td>);\n            }\n            return agg;\n          }, this), [\n            <th\n              style={this.getFixedCellStyle(customFooterStyles)}\n              className=\"row-header\"\n              key=\"aggregateRowLabel\"\n            >\n              {this.state.aggregateRowLabel}\n            </th>\n          ])}\n        </tr>\n        {overlayRow}\n        {scaleRow}\n      </tfoot>\n    );\n  }\n\n  _generateMetricRow(name, items) {\n    const selectedItem = items.getIn(['selected', 0]);\n    const selectedData = this.props.metricData.getIn(['data', selectedItem]);\n\n    if (selectedItem) {\n      if (selectedData) {\n        const years = selectedData.get('years');\n\n        // Matching data to the correct year, as columns are not necessarily linear\n        const yearData = _.map(this.state.dataSets, (ds: any, i) => {\n          const year = parseInt(ds.yearNum);\n          const currentYear = years.find((yr) => yr.get('year') === year);\n          const total = this.state.totals[i] || null;\n          return {\n            year,\n            value: currentYear.get('value'),\n            interpolate_display: currentYear.get('interpolate_display'),\n            showVariance: total && total.showVariance || false\n          };\n        });\n\n        const firstCol = (\n          <th\n            className=\"row-header\"\n            style={this.getFixedCellStyle()}\n          >\n            {name}: {selectedData.get('name')}\n          </th>\n        );\n        const metricRow = (\n          <tr className=\"position-relative\">\n            {_.reduce(yearData, _.bind((agg, year) => {\n              const unit = _.isUndefined(year.interpolate_display) ? numberTypes.none : numberTypes.interpolated;\n              agg.push(<SummaryTableCell {...year} unit={unit} noUnitSymbols={true}/>);\n              if (year.showVariance) {\n                // Add in a spacer to skip over the variance columns when rendering the populations for each year.\n                agg.push(<td colSpan={2} />);\n              }\n              return agg;\n            }, this), [firstCol] )}\n          </tr>\n        );\n        return metricRow;\n      } else {\n        // If we have no metric data for populations fallback to the entity population setting.\n        const entity = this.props.athenaState.get('entity');\n        return (\n          <tr className=\"position-relative\">\n            <td />\n            {_.flatten(_.map(this.state.totals, (total: any) => (\n              [<SummaryTableCell value={entity.population} unit={numberTypes.none} noUnitSymbols />, total.showVariance ? <td colSpan={2} /> : null]\n            )))}\n          </tr>\n        );\n      }\n    }\n  }\n\n  getViewData() {\n    const athenaState = this.props.athenaState;\n    const budgetData = athenaState.budgetData;\n    const product = athenaState.get('product');\n    const renderedData = SummaryReportStore.getRenderedData(false, true);\n    const lines = renderedData.lines;\n    const expandedLines = renderedData.expandedLines;\n    const sublines = renderedData.sublines;\n    // report setting to enable or disable the application of prorated budgets\n    const proration = SummaryReportStore.getState().get('proration');\n\n    let dataSets = SummaryReportStore.getRenderedDataSets();\n    let totals = renderedData.totals;\n\n    dataSets = _.map(dataSets, _.bind((dataSet: any, index) => {\n      const defaultLabel = strings.summaryHeaderLabel(\n        dataSet,\n        product ? product.technical_name : '',\n        this.props.fiscalYearStartMonth);\n\n      // in case of projections, we must push defaultLabel, worded by strings module\n      const titleLabel = (DataSetUtils.isProjectionDataset(dataSet)) ? defaultLabel : dataSet.label || defaultLabel;\n\n      // if proration setting is enabled, and the report is YTD, and the data does not have month set\n      // and the current year is not cumulative, and the period is not in months, then prorate the budget amounts.\n      const prorated = proration // report setting\n        && (product && product.technical_name === 'ytd' && !dataSet.month)\n        && !(product.properties.current_year_amount === 'cumulative' && product.properties.current_year_period === 'months');\n\n      return {\n        prorated,\n        label: _s.escapeHTML(dataSet.label),\n        title: strings.nl2br(_s.escapeHTML(titleLabel)), // we extend the object with the title property for summary table header\n        type: dataSet.type,\n        description: dataSet.description,\n        year: strings.fiscalYear(dataSet.year, this.props.fiscalYearStartMonth),\n        yearNum: dataSet.year,\n        varianceBaseType: index ? dataSets[index - 1].type : null,\n      };\n    }, this));\n\n    // Account for variance columns in the table that have no totals\n    // and insert empty total columns so totals that follow are properly offset.\n    const accountType = this.props.accountType;\n    totals = _.map(totals, (total: any, index) => {\n      const showVariance = dataSets[index].showVariance = !_.isUndefined(total.variance);\n      return _.assign({}, {\n        value: accountType === 'types' ? total.delta : total.amount,\n        variance: total.variance,\n        percentVariance: total.percentVariance,\n        type: total.type,\n        showVariance\n      });\n    });\n\n    const trueLines = _.reject(lines, 'fixed');\n\n    // this calculates how many extra lines of text are in the header label\n    const extraLines = Math.max.apply(null, dataSets.map(dataSet => {\n      const lines = (dataSet.label || dataSet.title).split(/\\n/);\n      if (lines[lines.length - 1] === '') {\n        // the last line is empty, return two less than the number of lines\n        return lines.length - 2;\n      }\n\n      // return one less than the number of lines\n      return lines.length - 1;\n    }));\n    // the header height is 35px for the first line and 28px for each subsequent line of text\n    const headerHeight = 35 + 28 * extraLines;\n    return {\n      aggregateRowLabel: strings.aggregateRowLabel(accountType, budgetData.visibleAccounts, this.props.isBalanceSheetReport),\n      dataSets,\n      lines,\n      expandedLines,\n      trueLines,\n      trueLinesExpanded: _.some(trueLines, (line: any) => this.props.expandedNodes[line.id]),\n      sublines,\n      totals,\n      headerHeight,\n      scrollTop: 0,\n      scrollLeft: 0\n    };\n  }\n\n  handleOnScroll = (event) => {\n    updateScrollState(this, {\n      scrollTop: event.target.scrollTop,\n      scrollLeft: event.target.scrollLeft\n    });\n  }\n\n  render() {\n    const pendingExpandAll = _.some(this.props.expandedNodes, node => node === 'pendingAll');\n\n    return (\n      <div className=\"summary-table-container\">\n        <div\n          className=\"summary-table ui-table js-table-container layout_expansion\"\n          onScroll={this.handleOnScroll}>\n          <table className=\"table summary_table\" id=\"table\">\n            <SummaryTableHead\n              dataSets={this.state.dataSets}\n              handleAllExpansion={this.handleAllExpansion}\n              expandedLines={this.state.expandedLines}\n              expandedNodes={this.props.expandedNodes}\n              trueLines={this.state.trueLines}\n              lines={this.state.lines}\n              stickyHeader={true}\n              scrollTop={this.state.scrollTop || 0}\n              scrollLeft={this.state.scrollLeft || 0}\n              headerHeight={this.state.headerHeight}\n              pendingExpandAll={pendingExpandAll} />\n            {this.renderBody()}\n            {this.renderFooter()}\n          </table>\n        </div>\n      </div>\n      );\n  }\n}\n\nimport createReactClass from 'create-react-class';\n\nvar SummaryTableRow = createReactClass<any, any>({\n  mixins: [pureRenderMixin] as any,\n  _onExpandRow() {\n    const {line} = this.props;\n\n    if (!line.childless && !line.fixed) {\n      SummaryReportActions.summaryToggleNode(line.id);\n      this.props.athenaState.pendingSelection = null;\n      // Tell athena to skip rerendering the graph\n      this.props.athenaState.selectionChange(true);\n    }\n  },\n\n  _onAnnotationMouseOver(amount) {\n    _.each(this._getAnnotationClasses(amount), (cls) => {\n      $('.annotation').addClass('hide');\n      $('.' + cls).addClass('hover');\n    });\n  },\n\n  _onAnnotationMouseOut(amount) {\n    _.each(this._getAnnotationClasses(amount), (cls) => {\n      $('.annotation').removeClass('hide');\n      $('.' + cls).removeClass('hover');\n    });\n  },\n\n  _onAnnotationClick(amount) {\n    ReportActions.openAnnotationsPanel();\n    this.props.reportEvents.trigger('scrollToAnnotationNode', amount.annotation[0].primaryNode.id);\n\n    const annotationClasses = this._getAnnotationClasses(amount);\n\n    setTimeout(() => {\n      _.each(annotationClasses, (cls) => {\n        $('.' + cls).addClass('flash');\n      });\n      setTimeout(() => {\n        _.each(annotationClasses, (cls) => {\n          $('.' + cls).removeClass('flash');\n        });\n      }, 300);\n    }, 100);\n  },\n\n  _generateAnnotation(amount) {\n    if (amount.annotation) {\n      return (\n        <span\n          onClick={this._onAnnotationClick.bind(this, amount)}\n          onMouseOver={this._onAnnotationMouseOver.bind(this, amount)}\n          onMouseOut={this._onAnnotationMouseOut.bind(null, amount)}\n          className={'icon-annotation-1 table__cell__annotation js-annotation js-table-annotation ' + this._getAnnotationClasses(amount).join(' ') }>\n        </span>\n      );\n    }\n  },\n\n  _getAnnotationClasses(amount) {\n    const annotationIds = _.map(amount.annotation, 'id');\n    return annotationIds.map((id) => 'annotation-' + id);\n  },\n\n  getFixedCellStyle(customStyles) {\n    return Object.assign({\n      borderRightWidth: this.props.scrollLeft ? '1px' : 0,\n      left: this.props.scrollLeft,\n      position: 'relative'\n    }, customStyles);\n  },\n\n  render() {\n    const { line, hideUnitSymbol, addSpace, unit } = this.props;\n    const expandIconEnabled = !line.childless && !line.fixed && line.depth < 6;\n    const interactable = !line.childless && !line.fixed;\n\n    const rowClassName = classNames('position-relative', {\n      expanded: this.props.expanded === 'expanded',\n      loading: this.props.expanded === 'pending',\n      'expanded-end': line.lastExpanded\n    });\n\n    const thClasses = classNames(\n      'row-title',\n      'row-header',\n      `indented-${ line.depth }`,\n      { 'js-drill': interactable }\n    );\n\n    // Restrict colored elements to those that are visible in the graph\n    const lineStyle = line.fixedColor ? {color: og.colorIntTohtmlRGB(line.color)} : {};\n\n    const dropItemIcon = classNames({\n      'ui-drop-item__icon': !line.childless,\n      'ui-drop-item__placeholder': line.childless,\n      'is-disabled': !expandIconEnabled\n    });\n\n    const lineNameClassName = classNames({\n      'ui-table__cell__link': true,\n      childless: !interactable\n    });\n\n    return (\n      <tr className={rowClassName} key={line.id}>\n        <th\n          onClick={_.debounce(this._onExpandRow, 250)}\n          className={thClasses}\n          style={this.getFixedCellStyle(lineStyle)}\n          data-id={line.id}\n          key={`${line.id}-th`}\n        >\n          {interactable && (\n            <button className=\"ui-drop-item__button\">\n              <span className={dropItemIcon} />\n              <span className={lineNameClassName}>{strings.nodeName(line)}</span>\n            </button>\n          )}\n          {!interactable && (\n            <div>\n              <span className={dropItemIcon} />\n              <span className={lineNameClassName}>{strings.nodeName(line)}</span>\n            </div>\n          )}\n        </th>\n        {_.map(\n          line.amounts,\n          _.bind((amount: any, index) => {\n            const showVariance = !_.isUndefined(amount.variance);\n            return [\n              <SummaryTableCell\n                {...amount}\n                hideUnitSymbol={hideUnitSymbol}\n                addSpace={addSpace}\n                unit={unit}\n                key={`${line.id}-${index}`}\n              >\n                {this._generateAnnotation(amount)}\n              </SummaryTableCell>,\n              showVariance ? (\n                <React.Fragment>\n                <td\n                  className={getVarianceClassNames(\n                    this.props.highlighting,\n                    this.props.highlightingVariance,\n                    amount.percentVariance,\n                    unit,\n                    this.props.accountType,\n                    this.props.athenaState.budgetData.formulas\n                  )}\n                  key={`${line.id}-${index}`}\n                >\n                  {strings.currencyNoDollar(amount.variance)}\n                </td>\n                <td className=\"number\" key={`${line.id}-${index}`}>\n                  {strings.percentage(amount.percentVariance)}\n                </td>\n                </React.Fragment>\n              ) : null\n            ];\n          }, this)\n        )}\n      </tr>\n    );\n  }\n});\n\nvar SummaryTableCell = createReactClass<any, any>({\n\n  propTypes: {\n    isBalanceSheetReport: PropTypes.bool,\n    type: PropTypes.string.isRequired,\n    hideUnitSymbol: PropTypes.bool.isRequired,\n    addSpace: PropTypes.bool,\n    unit: PropTypes.shape({\n      formatter: PropTypes.func.isRequired,\n      isCurrency: PropTypes.bool.isRequired,\n      symbol: PropTypes.string.isRequired\n    }),\n  },\n\n  render() {\n    const { unit, type, children, hideUnitSymbol = true, addSpace = false, isBalanceSheetReport } = this.props;\n    const iconStyle = {\n      position: 'relative',\n      top: '1.5px'\n    } as CSSProperties;\n\n    return (\n      <td className={classNames({\n        currency: unit.isCurrency,\n        number: !unit.isCurrency,\n        uncertain: type === 'budget'\n      })}\n      style={isBalanceSheetReport ? { borderTop: 0} : {}}>\n        {children}\n        <Amount noUnitSymbols={hideUnitSymbol} addSpace={addSpace} {...this.props} />\n        {unit.label === 'Interpolated' ?\n          <button className=\"ui-table__cell__label icon-info-1\"\n            data-hint=\"Interpolated\"\n            data-hint-position=\"right\"\n            data-hint-align=\"right\"\n            style={iconStyle}/>\n          : null\n        }\n      </td>\n    );\n  }\n});\n\nexport default SummaryTable;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/tables_section/summary_table.tsx","/**\n * @license\n * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -o ./dist/lodash.js`\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\n  var undefined;\n\n  /** Used to pool arrays and objects used internally */\n  var arrayPool = [],\n      objectPool = [];\n\n  /** Used to generate unique IDs */\n  var idCounter = 0;\n\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\n  var keyPrefix = +new Date + '';\n\n  /** Used as the size when optimizations are enabled for large arrays */\n  var largeArraySize = 75;\n\n  /** Used as the max size of the `arrayPool` and `objectPool` */\n  var maxPoolSize = 40;\n\n  /** Used to detect and test whitespace */\n  var whitespace = (\n    // whitespace\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\n\n    // line terminators\n    '\\n\\r\\u2028\\u2029' +\n\n    // unicode category \"Zs\" space separators\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n  );\n\n  /** Used to match empty string literals in compiled template source */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /**\n   * Used to match ES6 template delimiters\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match regexp flags from their coerced string values */\n  var reFlags = /\\w*$/;\n\n  /** Used to detected named functions */\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\n\n  /** Used to match \"interpolate\" template delimiters */\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match leading whitespace and zeros to be removed */\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\n\n  /** Used to ensure capturing order of template delimiters */\n  var reNoMatch = /($^)/;\n\n  /** Used to detect functions containing a `this` reference */\n  var reThis = /\\bthis\\b/;\n\n  /** Used to match unescaped characters in compiled string literals */\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\n\n  /** Used to assign default `context` object properties */\n  var contextProps = [\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\n    'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify */\n  var templateCounter = 0;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n      arrayClass = '[object Array]',\n      boolClass = '[object Boolean]',\n      dateClass = '[object Date]',\n      funcClass = '[object Function]',\n      numberClass = '[object Number]',\n      objectClass = '[object Object]',\n      regexpClass = '[object RegExp]',\n      stringClass = '[object String]';\n\n  /** Used to identify object classifications that `_.clone` supports */\n  var cloneableClasses = {};\n  cloneableClasses[funcClass] = false;\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\n\n  /** Used as an internal `_.debounce` options object */\n  var debounceOptions = {\n    'leading': false,\n    'maxWait': 0,\n    'trailing': false\n  };\n\n  /** Used as the property descriptor for `__bindData__` */\n  var descriptor = {\n    'configurable': false,\n    'enumerable': false,\n    'value': null,\n    'writable': false\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\t': 't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Used as a reference to the global object */\n  var root = (objectTypes[typeof window] && window) || this;\n\n  /** Detect free variable `exports` */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module` */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports` */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\n  var freeGlobal = objectTypes[typeof global] && global;\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches\n   * or `fromIndex` constraints.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value or `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    var index = (fromIndex || 0) - 1,\n        length = array ? array.length : 0;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * An implementation of `_.contains` for cache objects that mimics the return\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\n   *\n   * @private\n   * @param {Object} cache The cache object to inspect.\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\n   */\n  function cacheIndexOf(cache, value) {\n    var type = typeof value;\n    cache = cache.cache;\n\n    if (type == 'boolean' || value == null) {\n      return cache[value] ? 0 : -1;\n    }\n    if (type != 'number' && type != 'string') {\n      type = 'object';\n    }\n    var key = type == 'number' ? value : keyPrefix + value;\n    cache = (cache = cache[type]) && cache[key];\n\n    return type == 'object'\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\n      : (cache ? 0 : -1);\n  }\n\n  /**\n   * Adds a given value to the corresponding cache object.\n   *\n   * @private\n   * @param {*} value The value to add to the cache.\n   */\n  function cachePush(value) {\n    var cache = this.cache,\n        type = typeof value;\n\n    if (type == 'boolean' || value == null) {\n      cache[value] = true;\n    } else {\n      if (type != 'number' && type != 'string') {\n        type = 'object';\n      }\n      var key = type == 'number' ? value : keyPrefix + value,\n          typeCache = cache[type] || (cache[type] = {});\n\n      if (type == 'object') {\n        (typeCache[key] || (typeCache[key] = [])).push(value);\n      } else {\n        typeCache[key] = true;\n      }\n    }\n  }\n\n  /**\n   * Used by `_.max` and `_.min` as the default callback when a given\n   * collection is a string value.\n   *\n   * @private\n   * @param {string} value The character to inspect.\n   * @returns {number} Returns the code unit of given character.\n   */\n  function charAtCallback(value) {\n    return value.charCodeAt(0);\n  }\n\n  /**\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\n   * them in ascending order.\n   *\n   * @private\n   * @param {Object} a The object to compare to `b`.\n   * @param {Object} b The object to compare to `a`.\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\n   */\n  function compareAscending(a, b) {\n    var ac = a.criteria,\n        bc = b.criteria,\n        index = -1,\n        length = ac.length;\n\n    while (++index < length) {\n      var value = ac[index],\n          other = bc[index];\n\n      if (value !== other) {\n        if (value > other || typeof value == 'undefined') {\n          return 1;\n        }\n        if (value < other || typeof other == 'undefined') {\n          return -1;\n        }\n      }\n    }\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n    // that causes it, under certain circumstances, to return the same value for\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\n    //\n    // This also ensures a stable sort in V8 and other engines.\n    // See http://code.google.com/p/v8/issues/detail?id=90\n    return a.index - b.index;\n  }\n\n  /**\n   * Creates a cache object to optimize linear searches of large arrays.\n   *\n   * @private\n   * @param {Array} [array=[]] The array to search.\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\n   */\n  function createCache(array) {\n    var index = -1,\n        length = array.length,\n        first = array[0],\n        mid = array[(length / 2) | 0],\n        last = array[length - 1];\n\n    if (first && typeof first == 'object' &&\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\n      return false;\n    }\n    var cache = getObject();\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\n\n    var result = getObject();\n    result.array = array;\n    result.cache = cache;\n    result.push = cachePush;\n\n    while (++index < length) {\n      result.push(array[index]);\n    }\n    return result;\n  }\n\n  /**\n   * Used by `template` to escape characters for inclusion in compiled\n   * string literals.\n   *\n   * @private\n   * @param {string} match The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(match) {\n    return '\\\\' + stringEscapes[match];\n  }\n\n  /**\n   * Gets an array from the array pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Array} The array from the pool.\n   */\n  function getArray() {\n    return arrayPool.pop() || [];\n  }\n\n  /**\n   * Gets an object from the object pool or creates a new one if the pool is empty.\n   *\n   * @private\n   * @returns {Object} The object from the pool.\n   */\n  function getObject() {\n    return objectPool.pop() || {\n      'array': null,\n      'cache': null,\n      'criteria': null,\n      'false': false,\n      'index': 0,\n      'null': false,\n      'number': null,\n      'object': null,\n      'push': null,\n      'string': null,\n      'true': false,\n      'undefined': false,\n      'value': null\n    };\n  }\n\n  /**\n   * Releases the given array back to the array pool.\n   *\n   * @private\n   * @param {Array} [array] The array to release.\n   */\n  function releaseArray(array) {\n    array.length = 0;\n    if (arrayPool.length < maxPoolSize) {\n      arrayPool.push(array);\n    }\n  }\n\n  /**\n   * Releases the given object back to the object pool.\n   *\n   * @private\n   * @param {Object} [object] The object to release.\n   */\n  function releaseObject(object) {\n    var cache = object.cache;\n    if (cache) {\n      releaseObject(cache);\n    }\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\n    if (objectPool.length < maxPoolSize) {\n      objectPool.push(object);\n    }\n  }\n\n  /**\n   * Slices the `collection` from the `start` index up to, but not including,\n   * the `end` index.\n   *\n   * Note: This function is used instead of `Array#slice` to support node lists\n   * in IE < 9 and to ensure dense arrays are returned.\n   *\n   * @private\n   * @param {Array|Object|string} collection The collection to slice.\n   * @param {number} start The start index.\n   * @param {number} end The end index.\n   * @returns {Array} Returns the new array.\n   */\n  function slice(array, start, end) {\n    start || (start = 0);\n    if (typeof end == 'undefined') {\n      end = array ? array.length : 0;\n    }\n    var index = -1,\n        length = end - start || 0,\n        result = Array(length < 0 ? 0 : length);\n\n    while (++index < length) {\n      result[index] = array[start + index];\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new `lodash` function using the given context object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utilities\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns the `lodash` function.\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See http://es5.github.io/#x11.1.5.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references */\n    var Array = context.Array,\n        Boolean = context.Boolean,\n        Date = context.Date,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /**\n     * Used for `Array` method references.\n     *\n     * Normally `Array.prototype` would suffice, however, using an array literal\n     * avoids issues in Narwhal.\n     */\n    var arrayRef = [];\n\n    /** Used for native method references */\n    var objectProto = Object.prototype;\n\n    /** Used to restore the original `_` reference in `noConflict` */\n    var oldDash = context._;\n\n    /** Used to resolve the internal [[Class]] of values */\n    var toString = objectProto.toString;\n\n    /** Used to detect if a method is native */\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    /** Native method shortcuts */\n    var ceil = Math.ceil,\n        clearTimeout = context.clearTimeout,\n        floor = Math.floor,\n        fnToString = Function.prototype.toString,\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\n        hasOwnProperty = objectProto.hasOwnProperty,\n        push = arrayRef.push,\n        setTimeout = context.setTimeout,\n        splice = arrayRef.splice,\n        unshift = arrayRef.unshift;\n\n    /** Used to set meta data on functions */\n    var defineProperty = (function() {\n      // IE 8 only accepts DOM elements\n      try {\n        var o = {},\n            func = isNative(func = Object.defineProperty) && func,\n            result = func(o, o, o) && func;\n      } catch(e) { }\n      return result;\n    }());\n\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\n        nativeIsFinite = context.isFinite,\n        nativeIsNaN = context.isNaN,\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used to lookup a built-in constructor by [[Class]] */\n    var ctorByClass = {};\n    ctorByClass[arrayClass] = Array;\n    ctorByClass[boolClass] = Boolean;\n    ctorByClass[dateClass] = Date;\n    ctorByClass[funcClass] = Function;\n    ctorByClass[objectClass] = Object;\n    ctorByClass[numberClass] = Number;\n    ctorByClass[regexpClass] = RegExp;\n    ctorByClass[stringClass] = String;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps the given value to enable intuitive\n     * method chaining.\n     *\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\n     * and `unshift`\n     *\n     * Chaining is supported in custom builds as long as the `value` method is\n     * implicitly or explicitly included in the build.\n     *\n     * The chainable wrapper functions are:\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\n     * and `zip`\n     *\n     * The non-chainable wrapper functions are:\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\n     * `template`, `unescape`, `uniqueId`, and `value`\n     *\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\n     * provided, otherwise they return unwrapped values.\n     *\n     * Explicit chaining can be enabled by using the `_.chain` method.\n     *\n     * @name _\n     * @constructor\n     * @category Chaining\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns a `lodash` instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(num) {\n     *   return num * num;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\n       ? value\n       : new lodashWrapper(value);\n    }\n\n    /**\n     * A fast path for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @param {boolean} chainAll A flag to enable chaining for all methods\n     * @returns {Object} Returns a `lodash` instance.\n     */\n    function lodashWrapper(value, chainAll) {\n      this.__chain__ = !!chainAll;\n      this.__wrapped__ = value;\n    }\n    // ensure `new lodashWrapper` is an instance of `lodash`\n    lodashWrapper.prototype = lodash.prototype;\n\n    /**\n     * An object used to flag environments features.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * Detect if functions can be decompiled by `Function#toString`\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\n\n    /**\n     * Detect if `Function#name` is supported (all but IE).\n     *\n     * @memberOf _.support\n     * @type boolean\n     */\n    support.funcNames = typeof Function.name == 'string';\n\n    /**\n     * By default, the template delimiters used by Lo-Dash are similar to those in\n     * embedded Ruby (ERB). Change the following template settings to use alternative\n     * delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': /<%-([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': /<%([\\s\\S]+?)%>/g,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The base implementation of `_.bind` that creates the bound function and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new bound function.\n     */\n    function baseBind(bindData) {\n      var func = bindData[0],\n          partialArgs = bindData[2],\n          thisArg = bindData[4];\n\n      function bound() {\n        // `Function#bind` spec\n        // http://es5.github.io/#x15.3.4.5\n        if (partialArgs) {\n          // avoid `arguments` object deoptimizations by using `slice` instead\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\n          // variable as a ternary expression\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        // mimic the constructor's `return` behavior\n        // http://es5.github.io/#x13.2.2\n        if (this instanceof bound) {\n          // ensure `new bound` is an instance of `func`\n          var thisBinding = baseCreate(func.prototype),\n              result = func.apply(thisBinding, args || arguments);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisArg, args || arguments);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.clone` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, callback, stackA, stackB) {\n      if (callback) {\n        var result = callback(value);\n        if (typeof result != 'undefined') {\n          return result;\n        }\n      }\n      // inspect [[Class]]\n      var isObj = isObject(value);\n      if (isObj) {\n        var className = toString.call(value);\n        if (!cloneableClasses[className]) {\n          return value;\n        }\n        var ctor = ctorByClass[className];\n        switch (className) {\n          case boolClass:\n          case dateClass:\n            return new ctor(+value);\n\n          case numberClass:\n          case stringClass:\n            return new ctor(value);\n\n          case regexpClass:\n            result = ctor(value.source, reFlags.exec(value));\n            result.lastIndex = value.lastIndex;\n            return result;\n        }\n      } else {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isDeep) {\n        // check for circular references and return corresponding clone\n        var initedStack = !stackA;\n        stackA || (stackA = getArray());\n        stackB || (stackB = getArray());\n\n        var length = stackA.length;\n        while (length--) {\n          if (stackA[length] == value) {\n            return stackB[length];\n          }\n        }\n        result = isArr ? ctor(value.length) : {};\n      }\n      else {\n        result = isArr ? slice(value) : assign({}, value);\n      }\n      // add array properties assigned by `RegExp#exec`\n      if (isArr) {\n        if (hasOwnProperty.call(value, 'index')) {\n          result.index = value.index;\n        }\n        if (hasOwnProperty.call(value, 'input')) {\n          result.input = value.input;\n        }\n      }\n      // exit for shallow clone\n      if (!isDeep) {\n        return result;\n      }\n      // add the source value to the stack of traversed objects\n      // and associate it with its clone\n      stackA.push(value);\n      stackB.push(result);\n\n      // recursively populate clone (susceptible to call stack limits)\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\n      });\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} prototype The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    function baseCreate(prototype, properties) {\n      return isObject(prototype) ? nativeCreate(prototype) : {};\n    }\n    // fallback for browsers without `Object.create`\n    if (!nativeCreate) {\n      baseCreate = (function() {\n        function Object() {}\n        return function(prototype) {\n          if (isObject(prototype)) {\n            Object.prototype = prototype;\n            var result = new Object;\n            Object.prototype = null;\n          }\n          return result || context.Object();\n        };\n      }());\n    }\n\n    /**\n     * The base implementation of `_.createCallback` without support for creating\n     * \"_.pluck\" or \"_.where\" style callbacks.\n     *\n     * @private\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     */\n    function baseCreateCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      // exit early for no `thisArg` or already bound by `Function#bind`\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\n        return func;\n      }\n      var bindData = func.__bindData__;\n      if (typeof bindData == 'undefined') {\n        if (support.funcNames) {\n          bindData = !func.name;\n        }\n        bindData = bindData || !support.funcDecomp;\n        if (!bindData) {\n          var source = fnToString.call(func);\n          if (!support.funcNames) {\n            bindData = !reFuncName.test(source);\n          }\n          if (!bindData) {\n            // checks if `func` references the `this` keyword and stores the result\n            bindData = reThis.test(source);\n            setBindData(func, bindData);\n          }\n        }\n      }\n      // exit early if there are no `this` references or `func` is bound\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 2: return function(a, b) {\n          return func.call(thisArg, a, b);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n      }\n      return bind(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `createWrapper` that creates the wrapper and\n     * sets its meta data.\n     *\n     * @private\n     * @param {Array} bindData The bind data array.\n     * @returns {Function} Returns the new function.\n     */\n    function baseCreateWrapper(bindData) {\n      var func = bindData[0],\n          bitmask = bindData[1],\n          partialArgs = bindData[2],\n          partialRightArgs = bindData[3],\n          thisArg = bindData[4],\n          arity = bindData[5];\n\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          key = func;\n\n      function bound() {\n        var thisBinding = isBind ? thisArg : this;\n        if (partialArgs) {\n          var args = slice(partialArgs);\n          push.apply(args, arguments);\n        }\n        if (partialRightArgs || isCurry) {\n          args || (args = slice(arguments));\n          if (partialRightArgs) {\n            push.apply(args, partialRightArgs);\n          }\n          if (isCurry && args.length < arity) {\n            bitmask |= 16 & ~32;\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\n          }\n        }\n        args || (args = arguments);\n        if (isBindKey) {\n          func = thisBinding[key];\n        }\n        if (this instanceof bound) {\n          thisBinding = baseCreate(func.prototype);\n          var result = func.apply(thisBinding, args);\n          return isObject(result) ? result : thisBinding;\n        }\n        return func.apply(thisBinding, args);\n      }\n      setBindData(bound, bindData);\n      return bound;\n    }\n\n    /**\n     * The base implementation of `_.difference` that accepts a single array\n     * of values to exclude.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {Array} [values] The array of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     */\n    function baseDifference(array, values) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\n          result = [];\n\n      if (isLarge) {\n        var cache = createCache(values);\n        if (cache) {\n          indexOf = cacheIndexOf;\n          values = cache;\n        } else {\n          isLarge = false;\n        }\n      }\n      while (++index < length) {\n        var value = array[index];\n        if (indexOf(values, value) < 0) {\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseObject(values);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` without support for callback\n     * shorthands or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\n     * @param {number} [fromIndex=0] The index to start from.\n     * @returns {Array} Returns a new flattened array.\n     */\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\n      var index = (fromIndex || 0) - 1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n\n        if (value && typeof value == 'object' && typeof value.length == 'number'\n            && (isArray(value) || isArguments(value))) {\n          // recursively flatten arrays (susceptible to call stack limits)\n          if (!isShallow) {\n            value = baseFlatten(value, isShallow, isStrict);\n          }\n          var valIndex = -1,\n              valLength = value.length,\n              resIndex = result.length;\n\n          result.length += valLength;\n          while (++valIndex < valLength) {\n            result[resIndex++] = value[valIndex];\n          }\n        } else if (!isStrict) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\n     * that allows partial \"_.where\" style comparisons.\n     *\n     * @private\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\n      if (callback) {\n        var result = callback(a, b);\n        if (typeof result != 'undefined') {\n          return !!result;\n        }\n      }\n      // exit early for identical values\n      if (a === b) {\n        // treat `+0` vs. `-0` as not equal\n        return a !== 0 || (1 / a == 1 / b);\n      }\n      var type = typeof a,\n          otherType = typeof b;\n\n      // exit early for unlike primitive values\n      if (a === a &&\n          !(a && objectTypes[type]) &&\n          !(b && objectTypes[otherType])) {\n        return false;\n      }\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\n      // http://es5.github.io/#x15.3.4.4\n      if (a == null || b == null) {\n        return a === b;\n      }\n      // compare [[Class]] names\n      var className = toString.call(a),\n          otherClass = toString.call(b);\n\n      if (className == argsClass) {\n        className = objectClass;\n      }\n      if (otherClass == argsClass) {\n        otherClass = objectClass;\n      }\n      if (className != otherClass) {\n        return false;\n      }\n      switch (className) {\n        case boolClass:\n        case dateClass:\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n          return +a == +b;\n\n        case numberClass:\n          // treat `NaN` vs. `NaN` as equal\n          return (a != +a)\n            ? b != +b\n            // but treat `+0` vs. `-0` as not equal\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n        case regexpClass:\n        case stringClass:\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n          // treat string primitives and their corresponding object instances as equal\n          return a == String(b);\n      }\n      var isArr = className == arrayClass;\n      if (!isArr) {\n        // unwrap any `lodash` wrapped values\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\n\n        if (aWrapped || bWrapped) {\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\n        }\n        // exit for functions and DOM nodes\n        if (className != objectClass) {\n          return false;\n        }\n        // in older versions of Opera, `arguments` objects have `Array` constructors\n        var ctorA = a.constructor,\n            ctorB = b.constructor;\n\n        // non `Object` object instances with different constructors are not equal\n        if (ctorA != ctorB &&\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n              ('constructor' in a && 'constructor' in b)\n            ) {\n          return false;\n        }\n      }\n      // assume cyclic structures are equal\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n      var initedStack = !stackA;\n      stackA || (stackA = getArray());\n      stackB || (stackB = getArray());\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == a) {\n          return stackB[length] == b;\n        }\n      }\n      var size = 0;\n      result = true;\n\n      // add `a` and `b` to the stack of traversed objects\n      stackA.push(a);\n      stackB.push(b);\n\n      // recursively compare objects and arrays (susceptible to call stack limits)\n      if (isArr) {\n        // compare lengths to determine if a deep comparison is necessary\n        length = a.length;\n        size = b.length;\n        result = size == length;\n\n        if (result || isWhere) {\n          // deep compare the contents, ignoring non-numeric properties\n          while (size--) {\n            var index = length,\n                value = b[size];\n\n            if (isWhere) {\n              while (index--) {\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\n                  break;\n                }\n              }\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\n              break;\n            }\n          }\n        }\n      }\n      else {\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n        // which, in this case, is more costly\n        forIn(b, function(value, key, b) {\n          if (hasOwnProperty.call(b, key)) {\n            // count the number of properties.\n            size++;\n            // deep compare each property value.\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\n          }\n        });\n\n        if (result && !isWhere) {\n          // ensure both objects have the same number of properties\n          forIn(a, function(value, key, a) {\n            if (hasOwnProperty.call(a, key)) {\n              // `size` will be `-1` if `a` has more properties than `b`\n              return (result = --size > -1);\n            }\n          });\n        }\n      }\n      stackA.pop();\n      stackB.pop();\n\n      if (initedStack) {\n        releaseArray(stackA);\n        releaseArray(stackB);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.merge` without argument juggling or support\n     * for `thisArg` binding.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     */\n    function baseMerge(object, source, callback, stackA, stackB) {\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\n        var found,\n            isArr,\n            result = source,\n            value = object[key];\n\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\n          // avoid merging previously merged cyclic sources\n          var stackLength = stackA.length;\n          while (stackLength--) {\n            if ((found = stackA[stackLength] == source)) {\n              value = stackB[stackLength];\n              break;\n            }\n          }\n          if (!found) {\n            var isShallow;\n            if (callback) {\n              result = callback(value, source);\n              if ((isShallow = typeof result != 'undefined')) {\n                value = result;\n              }\n            }\n            if (!isShallow) {\n              value = isArr\n                ? (isArray(value) ? value : [])\n                : (isPlainObject(value) ? value : {});\n            }\n            // add `source` and associated `value` to the stack of traversed objects\n            stackA.push(source);\n            stackB.push(value);\n\n            // recursively merge objects and arrays (susceptible to call stack limits)\n            if (!isShallow) {\n              baseMerge(value, source, callback, stackA, stackB);\n            }\n          }\n        }\n        else {\n          if (callback) {\n            result = callback(value, source);\n            if (typeof result == 'undefined') {\n              result = source;\n            }\n          }\n          if (typeof result != 'undefined') {\n            value = result;\n          }\n        }\n        object[key] = value;\n      });\n    }\n\n    /**\n     * The base implementation of `_.random` without argument juggling or support\n     * for returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns a random number.\n     */\n    function baseRandom(min, max) {\n      return min + floor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * or `thisArg` binding.\n     *\n     * @private\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function} [callback] The function called per iteration.\n     * @returns {Array} Returns a duplicate-value-free array.\n     */\n    function baseUniq(array, isSorted, callback) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array ? array.length : 0,\n          result = [];\n\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\n          seen = (callback || isLarge) ? getArray() : result;\n\n      if (isLarge) {\n        var cache = createCache(seen);\n        indexOf = cacheIndexOf;\n        seen = cache;\n      }\n      while (++index < length) {\n        var value = array[index],\n            computed = callback ? callback(value, index, array) : value;\n\n        if (isSorted\n              ? !index || seen[seen.length - 1] !== computed\n              : indexOf(seen, computed) < 0\n            ) {\n          if (callback || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      if (isLarge) {\n        releaseArray(seen.array);\n        releaseObject(seen);\n      } else if (callback) {\n        releaseArray(seen);\n      }\n      return result;\n    }\n\n    /**\n     * Creates a function that aggregates a collection, creating an object composed\n     * of keys generated from the results of running each element of the collection\n     * through a callback. The given `setter` function sets the keys and values\n     * of the composed object.\n     *\n     * @private\n     * @param {Function} setter The setter function.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter) {\n      return function(collection, callback, thisArg) {\n        var result = {};\n        callback = lodash.createCallback(callback, thisArg, 3);\n\n        var index = -1,\n            length = collection ? collection.length : 0;\n\n        if (typeof length == 'number') {\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, callback(value, index, collection), collection);\n          }\n        } else {\n          forOwn(collection, function(value, key, collection) {\n            setter(result, value, callback(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, either curries or invokes `func`\n     * with an optional `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of method flags to compose.\n     *  The bitmask may be composed of the following flags:\n     *  1 - `_.bind`\n     *  2 - `_.bindKey`\n     *  4 - `_.curry`\n     *  8 - `_.curry` (bound)\n     *  16 - `_.partial`\n     *  32 - `_.partialRight`\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\n     *  provided to the new function.\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\n     *  provided to the new function.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new function.\n     */\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\n      var isBind = bitmask & 1,\n          isBindKey = bitmask & 2,\n          isCurry = bitmask & 4,\n          isCurryBound = bitmask & 8,\n          isPartial = bitmask & 16,\n          isPartialRight = bitmask & 32;\n\n      if (!isBindKey && !isFunction(func)) {\n        throw new TypeError;\n      }\n      if (isPartial && !partialArgs.length) {\n        bitmask &= ~16;\n        isPartial = partialArgs = false;\n      }\n      if (isPartialRight && !partialRightArgs.length) {\n        bitmask &= ~32;\n        isPartialRight = partialRightArgs = false;\n      }\n      var bindData = func && func.__bindData__;\n      if (bindData && bindData !== true) {\n        // clone `bindData`\n        bindData = slice(bindData);\n        if (bindData[2]) {\n          bindData[2] = slice(bindData[2]);\n        }\n        if (bindData[3]) {\n          bindData[3] = slice(bindData[3]);\n        }\n        // set `thisBinding` is not previously bound\n        if (isBind && !(bindData[1] & 1)) {\n          bindData[4] = thisArg;\n        }\n        // set if previously bound but not currently (subsequent curried functions)\n        if (!isBind && bindData[1] & 1) {\n          bitmask |= 8;\n        }\n        // set curried arity if not yet set\n        if (isCurry && !(bindData[1] & 4)) {\n          bindData[5] = arity;\n        }\n        // append partial left arguments\n        if (isPartial) {\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\n        }\n        // append partial right arguments\n        if (isPartialRight) {\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\n        }\n        // merge flags\n        bindData[1] |= bitmask;\n        return createWrapper.apply(null, bindData);\n      }\n      // fast path for `_.bind`\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\n    }\n\n    /**\n     * Used by `escape` to convert characters to HTML entities.\n     *\n     * @private\n     * @param {string} match The matched character to escape.\n     * @returns {string} Returns the escaped character.\n     */\n    function escapeHtmlChar(match) {\n      return htmlEscapes[match];\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized, this method returns the custom method, otherwise it returns\n     * the `baseIndexOf` function.\n     *\n     * @private\n     * @returns {Function} Returns the \"indexOf\" function.\n     */\n    function getIndexOf() {\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\n     */\n    function isNative(value) {\n      return typeof value == 'function' && reNative.test(value);\n    }\n\n    /**\n     * Sets `this` binding data on a given function.\n     *\n     * @private\n     * @param {Function} func The function to set data on.\n     * @param {Array} value The data array to set.\n     */\n    var setBindData = !defineProperty ? noop : function(func, value) {\n      descriptor.value = value;\n      defineProperty(func, '__bindData__', descriptor);\n      descriptor.value = null;\n    };\n\n    /**\n     * A fallback implementation of `isPlainObject` which checks if a given value\n     * is an object created by the `Object` constructor, assuming objects created\n     * by the `Object` constructor have no inherited enumerable properties and that\n     * there are no `Object.prototype` extensions.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     */\n    function shimIsPlainObject(value) {\n      var ctor,\n          result;\n\n      // avoid non Object objects, `arguments` objects, and DOM elements\n      if (!(value && toString.call(value) == objectClass) ||\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\n        return false;\n      }\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      forIn(value, function(value, key) {\n        result = key;\n      });\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Used by `unescape` to convert HTML entities to characters.\n     *\n     * @private\n     * @param {string} match The matched character to unescape.\n     * @returns {string} Returns the unescaped character.\n     */\n    function unescapeHtmlChar(match) {\n      return htmlUnescapes[match];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `value` is an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\n     * @example\n     *\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == argsClass || false;\n    }\n\n    /**\n     * Checks if `value` is an array.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\n     * @example\n     *\n     * (function() { return _.isArray(arguments); })();\n     * // => false\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     */\n    var isArray = nativeIsArray || function(value) {\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\n        toString.call(value) == arrayClass || false;\n    };\n\n    /**\n     * A fallback implementation of `Object.keys` which produces an array of the\n     * given object's own enumerable property names.\n     *\n     * @private\n     * @type Function\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     */\n    var shimKeys = function(object) {\n      var index, iterable = object, result = [];\n      if (!iterable) return result;\n      if (!(objectTypes[typeof object])) return result;\n        for (index in iterable) {\n          if (hasOwnProperty.call(iterable, index)) {\n            result.push(index);\n          }\n        }\n      return result\n    };\n\n    /**\n     * Creates an array composed of the own enumerable property names of an object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names.\n     * @example\n     *\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\n     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      if (!isObject(object)) {\n        return [];\n      }\n      return nativeKeys(object);\n    };\n\n    /**\n     * Used to convert characters to HTML entities:\n     *\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\n     * don't require escaping in HTML and have no special meaning unless they're part\n     * of a tag or an unquoted attribute value.\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\n     */\n    var htmlEscapes = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#39;'\n    };\n\n    /** Used to convert HTML entities to characters */\n    var htmlUnescapes = invert(htmlEscapes);\n\n    /** Used to match HTML entities and HTML characters */\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources will overwrite property assignments of previous\n     * sources. If a callback is provided it will be executed to produce the\n     * assigned values. The callback is bound to `thisArg` and invoked with two\n     * arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @alias extend\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize assigning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\n     * // => { 'name': 'fred', 'employer': 'slate' }\n     *\n     * var defaults = _.partialRight(_.assign, function(a, b) {\n     *   return typeof a == 'undefined' ? b : a;\n     * });\n     *\n     * var object = { 'name': 'barney' };\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var assign = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n        callback = args[--argsLength];\n      }\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\n     * be cloned, otherwise they will be assigned by reference. If a callback\n     * is provided it will be executed to produce the cloned values. If the\n     * callback returns `undefined` cloning will be handled by the method instead.\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep=false] Specify a deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var shallow = _.clone(characters);\n     * shallow[0] === characters[0];\n     * // => true\n     *\n     * var deep = _.clone(characters, true);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * _.mixin({\n     *   'clone': _.partialRight(_.clone, function(value) {\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\n     *   })\n     * });\n     *\n     * var clone = _.clone(document.body);\n     * clone.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, callback, thisArg) {\n      // allows working with \"Collections\" methods without using their `index`\n      // and `collection` arguments for `isDeep` and `callback`\n      if (typeof isDeep != 'boolean' && isDeep != null) {\n        thisArg = callback;\n        callback = isDeep;\n        isDeep = false;\n      }\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates a deep clone of `value`. If a callback is provided it will be\n     * executed to produce the cloned values. If the callback returns `undefined`\n     * cloning will be handled by the method instead. The callback is bound to\n     * `thisArg` and invoked with one argument; (value).\n     *\n     * Note: This method is loosely based on the structured clone algorithm. Functions\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to deep clone.\n     * @param {Function} [callback] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * var deep = _.cloneDeep(characters);\n     * deep[0] === characters[0];\n     * // => false\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'node': element\n     * };\n     *\n     * var clone = _.cloneDeep(view, function(value) {\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\n     * });\n     *\n     * clone.node == view.node;\n     * // => false\n     */\n    function cloneDeep(value, callback, thisArg) {\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\n    }\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties ? assign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional defaults of the same property will be ignored.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\n     *  `key` and `object` arguments as sources.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var object = { 'name': 'barney' };\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\n     * // => { 'name': 'barney', 'employer': 'slate' }\n     */\n    var defaults = function(object, source, guard) {\n      var index, iterable = object, result = iterable;\n      if (!iterable) return result;\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = typeof guard == 'number' ? 2 : args.length;\n      while (++argsIndex < argsLength) {\n        iterable = args[argsIndex];\n        if (iterable && objectTypes[typeof iterable]) {\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\n        }\n        }\n      }\n      return result\n    };\n\n    /**\n     * This method is like `_.findIndex` except that it returns the key of the\n     * first element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': false },\n     *   'fred': {    'age': 40, 'blocked': true },\n     *   'pebbles': { 'age': 1,  'blocked': false }\n     * };\n     *\n     * _.findKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (property order is not guaranteed across environments)\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findKey(characters, { 'age': 1 });\n     * // => 'pebbles'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findKey(characters, 'blocked');\n     * // => 'fred'\n     */\n    function findKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwn(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [callback=identity] The function called per\n     *  iteration. If a property name or object is provided it will be used to\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\n     * @example\n     *\n     * var characters = {\n     *   'barney': {  'age': 36, 'blocked': true },\n     *   'fred': {    'age': 40, 'blocked': false },\n     *   'pebbles': { 'age': 1,  'blocked': true }\n     * };\n     *\n     * _.findLastKey(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastKey(characters, { 'age': 40 });\n     * // => 'fred'\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastKey(characters, 'blocked');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forOwnRight(object, function(value, key, object) {\n        if (callback(value, key, object)) {\n          result = key;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object,\n     * executing the callback for each property. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forIn(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\n     */\n    var forIn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        for (index in iterable) {\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forIn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * Shape.prototype.move = function(x, y) {\n     *   this.x += x;\n     *   this.y += y;\n     * };\n     *\n     * _.forInRight(new Shape, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\n     */\n    function forInRight(object, callback, thisArg) {\n      var pairs = [];\n\n      forIn(object, function(value, key) {\n        pairs.push(key, value);\n      });\n\n      var length = pairs.length;\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(pairs[length--], pairs[length], object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Iterates over own enumerable properties of an object, executing the callback\n     * for each property. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, key, object). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\n     */\n    var forOwn = function(collection, callback, thisArg) {\n      var index, iterable = collection, result = iterable;\n      if (!iterable) return result;\n      if (!objectTypes[typeof iterable]) return result;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n        var ownIndex = -1,\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\n            length = ownProps ? ownProps.length : 0;\n\n        while (++ownIndex < length) {\n          index = ownProps[ownIndex];\n          if (callback(iterable[index], index, collection) === false) return result;\n        }\n      return result\n    };\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over elements\n     * of a `collection` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\n     */\n    function forOwnRight(object, callback, thisArg) {\n      var props = keys(object),\n          length = props.length;\n\n      callback = baseCreateCallback(callback, thisArg, 3);\n      while (length--) {\n        var key = props[length];\n        if (callback(object[key], key, object) === false) {\n          break;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Creates a sorted array of property names of all enumerable properties,\n     * own and inherited, of `object` that have function values.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property names that have function values.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\n     */\n    function functions(object) {\n      var result = [];\n      forIn(object, function(value, key) {\n        if (isFunction(value)) {\n          result.push(key);\n        }\n      });\n      return result.sort();\n    }\n\n    /**\n     * Checks if the specified property name exists as a direct property of `object`,\n     * instead of an inherited property.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to check.\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\n     * @example\n     *\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\n     * // => true\n     */\n    function has(object, key) {\n      return object ? hasOwnProperty.call(object, key) : false;\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of the given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the created inverted object.\n     * @example\n     *\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\n     * // => { 'fred': 'first', 'barney': 'second' }\n     */\n    function invert(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        result[object[key]] = key;\n      }\n      return result;\n    }\n\n    /**\n     * Checks if `value` is a boolean value.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\n     * @example\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\n    }\n\n    /**\n     * Checks if `value` is a date.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     */\n    function isDate(value) {\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     */\n    function isElement(value) {\n      return value && value.nodeType === 1 || false;\n    }\n\n    /**\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\n     * length of `0` and objects with no own enumerable properties are considered\n     * \"empty\".\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({});\n     * // => true\n     *\n     * _.isEmpty('');\n     * // => true\n     */\n    function isEmpty(value) {\n      var result = true;\n      if (!value) {\n        return result;\n      }\n      var className = toString.call(value),\n          length = value.length;\n\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\n        return !length;\n      }\n      forOwn(value, function() {\n        return (result = false);\n      });\n      return result;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent to each other. If a callback is provided it will be executed\n     * to compare values. If the callback returns `undefined` comparisons will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (a, b).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} a The value to compare.\n     * @param {*} b The other value to compare.\n     * @param {Function} [callback] The function to customize comparing values.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var copy = { 'name': 'fred' };\n     *\n     * object == copy;\n     * // => false\n     *\n     * _.isEqual(object, copy);\n     * // => true\n     *\n     * var words = ['hello', 'goodbye'];\n     * var otherWords = ['hi', 'goodbye'];\n     *\n     * _.isEqual(words, otherWords, function(a, b) {\n     *   var reGreet = /^(?:hello|hi)$/i,\n     *       aGreet = _.isString(a) && reGreet.test(a),\n     *       bGreet = _.isString(b) && reGreet.test(b);\n     *\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\n     * });\n     * // => true\n     */\n    function isEqual(a, b, callback, thisArg) {\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\n    }\n\n    /**\n     * Checks if `value` is, or can be coerced to, a finite number.\n     *\n     * Note: This is not the same as native `isFinite` which will return true for\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\n     * @example\n     *\n     * _.isFinite(-101);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => true\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite('');\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\n    }\n\n    /**\n     * Checks if `value` is a function.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     */\n    function isFunction(value) {\n      return typeof value == 'function';\n    }\n\n    /**\n     * Checks if `value` is the language type of Object.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(1);\n     * // => false\n     */\n    function isObject(value) {\n      // check if the value is the ECMAScript language type of Object\n      // http://es5.github.io/#x8\n      // and avoid a V8 bug\n      // http://code.google.com/p/v8/issues/detail?id=2291\n      return !!(value && objectTypes[typeof value]);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * Note: This is not the same as native `isNaN` which will return `true` for\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // `NaN` as a primitive is the only value that is not equal to itself\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(undefined);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is a number.\n     *\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4 * 5);\n     * // => true\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\n    }\n\n    /**\n     * Checks if `value` is an object created by the `Object` constructor.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * _.isPlainObject(new Shape);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     */\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n      if (!(value && toString.call(value) == objectClass)) {\n        return false;\n      }\n      var valueOf = value.valueOf,\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n      return objProto\n        ? (value == objProto || getPrototypeOf(value) == objProto)\n        : shimIsPlainObject(value);\n    };\n\n    /**\n     * Checks if `value` is a regular expression.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\n     * @example\n     *\n     * _.isRegExp(/fred/);\n     * // => true\n     */\n    function isRegExp(value) {\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\n    }\n\n    /**\n     * Checks if `value` is a string.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('fred');\n     * // => true\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     */\n    function isUndefined(value) {\n      return typeof value == 'undefined';\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     *\n     * var characters = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.mapValues(characters, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 }\n     */\n    function mapValues(object, callback, thisArg) {\n      var result = {};\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      forOwn(object, function(value, key, object) {\n        result[key] = callback(value, key, object);\n      });\n      return result;\n    }\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * will overwrite property assignments of previous sources. If a callback is\n     * provided it will be executed to produce the merged values of the destination\n     * and source properties. If the callback returns `undefined` merging will\n     * be handled by the method instead. The callback is bound to `thisArg` and\n     * invoked with two arguments; (objectValue, sourceValue).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The destination object.\n     * @param {...Object} [source] The source objects.\n     * @param {Function} [callback] The function to customize merging properties.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the destination object.\n     * @example\n     *\n     * var names = {\n     *   'characters': [\n     *     { 'name': 'barney' },\n     *     { 'name': 'fred' }\n     *   ]\n     * };\n     *\n     * var ages = {\n     *   'characters': [\n     *     { 'age': 36 },\n     *     { 'age': 40 }\n     *   ]\n     * };\n     *\n     * _.merge(names, ages);\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\n     *\n     * var food = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var otherFood = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(food, otherFood, function(a, b) {\n     *   return _.isArray(a) ? a.concat(b) : undefined;\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\n     */\n    function merge(object) {\n      var args = arguments,\n          length = 2;\n\n      if (!isObject(object)) {\n        return object;\n      }\n      // allows working with `_.reduce` and `_.reduceRight` without using\n      // their `index` and `collection` arguments\n      if (typeof args[2] != 'number') {\n        length = args.length;\n      }\n      if (length > 3 && typeof args[length - 2] == 'function') {\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\n        callback = args[--length];\n      }\n      var sources = slice(arguments, 1, length),\n          index = -1,\n          stackA = getArray(),\n          stackB = getArray();\n\n      while (++index < length) {\n        baseMerge(object, sources[index], callback, stackA, stackB);\n      }\n      releaseArray(stackA);\n      releaseArray(stackB);\n      return object;\n    }\n\n    /**\n     * Creates a shallow clone of `object` excluding the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` omitting the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\n     *  function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object without the omitted properties.\n     * @example\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\n     * // => { 'name': 'fred' }\n     *\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\n     *   return typeof value == 'number';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function omit(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var props = [];\n        forIn(object, function(value, key) {\n          props.push(key);\n        });\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n          var key = props[index];\n          result[key] = object[key];\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (!callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates a two dimensional array of an object's key-value pairs,\n     * i.e. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\n     */\n    function pairs(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a shallow clone of `object` composed of the specified properties.\n     * Property names may be specified as individual arguments or as arrays of\n     * property names. If a callback is provided it will be executed for each\n     * property of `object` picking the properties the callback returns truey\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The source object.\n     * @param {Function|...string|string[]} [callback] The function called per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns an object composed of the picked properties.\n     * @example\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\n     * // => { 'name': 'fred' }\n     *\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\n     *   return key.charAt(0) != '_';\n     * });\n     * // => { 'name': 'fred' }\n     */\n    function pick(object, callback, thisArg) {\n      var result = {};\n      if (typeof callback != 'function') {\n        var index = -1,\n            props = baseFlatten(arguments, true, false, 1),\n            length = isObject(object) ? props.length : 0;\n\n        while (++index < length) {\n          var key = props[index];\n          if (key in object) {\n            result[key] = object[key];\n          }\n        }\n      } else {\n        callback = lodash.createCallback(callback, thisArg, 3);\n        forIn(object, function(value, key, object) {\n          if (callback(value, key, object)) {\n            result[key] = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * An alternative to `_.reduce` this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable properties through a callback, with each callback execution\n     * potentially mutating the `accumulator` object. The callback is bound to\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\n     * Callbacks may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Array|Object} object The object to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\n     *   num *= num;\n     *   if (num % 2) {\n     *     return result.push(num) < 3;\n     *   }\n     * });\n     * // => [1, 9, 25]\n     *\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     * });\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function transform(object, callback, accumulator, thisArg) {\n      var isArr = isArray(object);\n      if (accumulator == null) {\n        if (isArr) {\n          accumulator = [];\n        } else {\n          var ctor = object && object.constructor,\n              proto = ctor && ctor.prototype;\n\n          accumulator = baseCreate(proto);\n        }\n      }\n      if (callback) {\n        callback = lodash.createCallback(callback, thisArg, 4);\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\n          return callback(accumulator, value, index, object);\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * Creates an array composed of the own enumerable property values of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Objects\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns an array of property values.\n     * @example\n     *\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\n     */\n    function values(object) {\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements from the specified indexes, or keys, of the\n     * `collection`. Indexes may be specified as individual arguments or as arrays\n     * of indexes.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\n     *   to retrieve, specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns a new array of elements corresponding to the\n     *  provided indexes.\n     * @example\n     *\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\n     * // => ['a', 'c', 'e']\n     *\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\n     * // => ['fred', 'pebbles']\n     */\n    function at(collection) {\n      var args = arguments,\n          index = -1,\n          props = baseFlatten(args, true, false, 1),\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\n          result = Array(length);\n\n      while(++index < length) {\n        result[index] = collection[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * Checks if a given value is present in a collection using strict equality\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\n     * offset from the end of the collection.\n     *\n     * @static\n     * @memberOf _\n     * @alias include\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {*} target The value to check for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\n     * @example\n     *\n     * _.contains([1, 2, 3], 1);\n     * // => true\n     *\n     * _.contains([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.contains('pebbles', 'eb');\n     * // => true\n     */\n    function contains(collection, target, fromIndex) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = collection ? collection.length : 0,\n          result = false;\n\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\n      if (isArray(collection)) {\n        result = indexOf(collection, target, fromIndex) > -1;\n      } else if (typeof length == 'number') {\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\n      } else {\n        forOwn(collection, function(value) {\n          if (++index >= fromIndex) {\n            return !(result = value === target);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through the callback. The corresponding value\n     * of each key is the number of times the key was returned by the callback.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\n    });\n\n    /**\n     * Checks if the given callback returns truey value for **all** elements of\n     * a collection. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes']);\n     * // => false\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.every(characters, 'age');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.every(characters, { 'age': 36 });\n     * // => false\n     */\n    function every(collection, callback, thisArg) {\n      var result = true;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (!(result = !!callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return (result = !!callback(value, index, collection));\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning an array of all elements\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that passed the callback check.\n     * @example\n     *\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [2, 4, 6]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.filter(characters, 'blocked');\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.filter(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     */\n    function filter(collection, callback, thisArg) {\n      var result = [];\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result.push(value);\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, returning the first element that\n     * the callback returns truey for. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect, findWhere\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.find(characters, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\n     *\n     * // using \"_.where\" callback shorthand\n     * _.find(characters, { 'age': 1 });\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.find(characters, 'blocked');\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\n     */\n    function find(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          var value = collection[index];\n          if (callback(value, index, collection)) {\n            return value;\n          }\n        }\n      } else {\n        var result;\n        forOwn(collection, function(value, index, collection) {\n          if (callback(value, index, collection)) {\n            result = value;\n            return false;\n          }\n        });\n        return result;\n      }\n    }\n\n    /**\n     * This method is like `_.find` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the found element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(num) {\n     *   return num % 2 == 1;\n     * });\n     * // => 3\n     */\n    function findLast(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      forEachRight(collection, function(value, index, collection) {\n        if (callback(value, index, collection)) {\n          result = value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Iterates over elements of a collection, executing the callback for each\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection). Callbacks may exit iteration early by\n     * explicitly returning `false`.\n     *\n     * Note: As with other \"Collections\" methods, objects with a `length` property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\n     * // => logs each number and returns '1,2,3'\n     *\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\n     */\n    function forEach(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if (callback(collection[index], index, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, callback);\n      }\n      return collection;\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\n     * // => logs each number from right to left and returns '3,2,1'\n     */\n    function forEachRight(collection, callback, thisArg) {\n      var length = collection ? collection.length : 0;\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        while (length--) {\n          if (callback(collection[length], length, collection) === false) {\n            break;\n          }\n        }\n      } else {\n        var props = keys(collection);\n        length = props.length;\n        forOwn(collection, function(value, key, collection) {\n          key = props ? props[--length] : --length;\n          return callback(collection[key], key, collection);\n        });\n      }\n      return collection;\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of a collection through the callback. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of the collection through the given callback. The corresponding\n     * value of each key is the last element responsible for generating the key.\n     * The callback is bound to `thisArg` and invoked with three arguments;\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keys = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keys, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method named by `methodName` on each element in the `collection`\n     * returning an array of the results of each invoked method. Additional arguments\n     * will be provided to each invoked method. If `methodName` is a function it\n     * will be invoked for, and `this` bound to, each element in the `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|string} methodName The name of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [arg] Arguments to invoke the method with.\n     * @returns {Array} Returns a new array of the results of each invoked method.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    function invoke(collection, methodName) {\n      var args = slice(arguments, 2),\n          index = -1,\n          isFunc = typeof methodName == 'function',\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an array of values by running each element in the collection\n     * through the callback. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\n     * @example\n     *\n     * _.map([1, 2, 3], function(num) { return num * 3; });\n     * // => [3, 6, 9]\n     *\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, callback, thisArg) {\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      if (typeof length == 'number') {\n        var result = Array(length);\n        while (++index < length) {\n          result[index] = callback(collection[index], index, collection);\n        }\n      } else {\n        result = [];\n        forOwn(collection, function(value, key, collection) {\n          result[++index] = callback(value, key, collection);\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the maximum value of a collection. If the collection is empty or\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'fred', 'age': 40 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.max(characters, 'age');\n     * // => { 'name': 'fred', 'age': 40 };\n     */\n    function max(collection, callback, thisArg) {\n      var computed = -Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value > result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current > computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the minimum value of a collection. If the collection is empty or\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\n     * for each value in the collection to generate the criterion by which the value\n     * is ranked. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(characters, function(chr) { return chr.age; });\n     * // => { 'name': 'barney', 'age': 36 };\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.min(characters, 'age');\n     * // => { 'name': 'barney', 'age': 36 };\n     */\n    function min(collection, callback, thisArg) {\n      var computed = Infinity,\n          result = computed;\n\n      // allows working with functions like `_.map` without using\n      // their `index` argument as a callback\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\n        callback = null;\n      }\n      if (callback == null && isArray(collection)) {\n        var index = -1,\n            length = collection.length;\n\n        while (++index < length) {\n          var value = collection[index];\n          if (value < result) {\n            result = value;\n          }\n        }\n      } else {\n        callback = (callback == null && isString(collection))\n          ? charAtCallback\n          : lodash.createCallback(callback, thisArg, 3);\n\n        forEach(collection, function(value, index, collection) {\n          var current = callback(value, index, collection);\n          if (current < computed) {\n            computed = current;\n            result = value;\n          }\n        });\n      }\n      return result;\n    }\n\n    /**\n     * Retrieves the value of a specified property from all elements in the collection.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {string} property The name of the property to pluck.\n     * @returns {Array} Returns a new array of property values.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(characters, 'name');\n     * // => ['barney', 'fred']\n     */\n    var pluck = map;\n\n    /**\n     * Reduces a collection to a value which is the accumulated result of running\n     * each element in the collection through the callback, where each successive\n     * callback execution consumes the return value of the previous execution. If\n     * `accumulator` is not provided the first element of the collection will be\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\n     *   return sum + num;\n     * });\n     * // => 6\n     *\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\n     *   result[key] = num * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\n     */\n    function reduce(collection, callback, accumulator, thisArg) {\n      if (!collection) return accumulator;\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n\n      var index = -1,\n          length = collection.length;\n\n      if (typeof length == 'number') {\n        if (noaccum) {\n          accumulator = collection[++index];\n        }\n        while (++index < length) {\n          accumulator = callback(accumulator, collection[index], index, collection);\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          accumulator = noaccum\n            ? (noaccum = false, value)\n            : callback(accumulator, value, index, collection)\n        });\n      }\n      return accumulator;\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [callback=identity] The function called per iteration.\n     * @param {*} [accumulator] Initial value of the accumulator.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var list = [[0, 1], [2, 3], [4, 5]];\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, callback, accumulator, thisArg) {\n      var noaccum = arguments.length < 3;\n      callback = lodash.createCallback(callback, thisArg, 4);\n      forEachRight(collection, function(value, index, collection) {\n        accumulator = noaccum\n          ? (noaccum = false, value)\n          : callback(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The opposite of `_.filter` this method returns the elements of a\n     * collection that the callback does **not** return truey for.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of elements that failed the callback check.\n     * @example\n     *\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\n     * // => [1, 3, 5]\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.reject(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.reject(characters, { 'age': 36 });\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\n     */\n    function reject(collection, callback, thisArg) {\n      callback = lodash.createCallback(callback, thisArg, 3);\n      return filter(collection, function(value, index, collection) {\n        return !callback(value, index, collection);\n      });\n    }\n\n    /**\n     * Retrieves a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Allows working with functions like `_.map`\n     *  without using their `index` arguments as `n`.\n     * @returns {Array} Returns the random sample(s) of `collection`.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (collection && typeof collection.length != 'number') {\n        collection = values(collection);\n      }\n      if (n == null || guard) {\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\n      }\n      var result = shuffle(collection);\n      result.length = nativeMin(nativeMax(0, n), result.length);\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns a new shuffled collection.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\n     * // => [4, 1, 6, 3, 5, 2]\n     */\n    function shuffle(collection) {\n      var index = -1,\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      forEach(collection, function(value) {\n        var rand = baseRandom(0, ++index);\n        result[index] = result[rand];\n        result[rand] = value;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the size of the `collection` by returning `collection.length` for arrays\n     * and array-like objects or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\n     * @example\n     *\n     * _.size([1, 2]);\n     * // => 2\n     *\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\n     * // => 3\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      var length = collection ? collection.length : 0;\n      return typeof length == 'number' ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if the callback returns a truey value for **any** element of a\n     * collection. The function returns as soon as it finds a passing value and\n     * does not iterate over the entire collection. The callback is bound to\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {boolean} Returns `true` if any element passed the callback check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.some(characters, 'blocked');\n     * // => true\n     *\n     * // using \"_.where\" callback shorthand\n     * _.some(characters, { 'age': 1 });\n     * // => false\n     */\n    function some(collection, callback, thisArg) {\n      var result;\n      callback = lodash.createCallback(callback, thisArg, 3);\n\n      var index = -1,\n          length = collection ? collection.length : 0;\n\n      if (typeof length == 'number') {\n        while (++index < length) {\n          if ((result = callback(collection[index], index, collection))) {\n            break;\n          }\n        }\n      } else {\n        forOwn(collection, function(value, index, collection) {\n          return !(result = callback(value, index, collection));\n        });\n      }\n      return !!result;\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through the callback. This method\n     * performs a stable sort, that is, it will preserve the original sort order\n     * of equal elements. The callback is bound to `thisArg` and invoked with\n     * three arguments; (value, index|key, collection).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an array of property names is provided for `callback` the collection\n     * will be sorted by each property value.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of sorted elements.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\n     * // => [3, 1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'barney',  'age': 26 },\n     *   { 'name': 'fred',    'age': 30 }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.map(_.sortBy(characters, 'age'), _.values);\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\n     *\n     * // sorting by multiple properties\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\n     */\n    function sortBy(collection, callback, thisArg) {\n      var index = -1,\n          isArr = isArray(callback),\n          length = collection ? collection.length : 0,\n          result = Array(typeof length == 'number' ? length : 0);\n\n      if (!isArr) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      forEach(collection, function(value, key, collection) {\n        var object = result[++index] = getObject();\n        if (isArr) {\n          object.criteria = map(callback, function(key) { return value[key]; });\n        } else {\n          (object.criteria = getArray())[0] = callback(value, key, collection);\n        }\n        object.index = index;\n        object.value = value;\n      });\n\n      length = result.length;\n      result.sort(compareAscending);\n      while (length--) {\n        var object = result[length];\n        result[length] = object.value;\n        if (!isArr) {\n          releaseArray(object.criteria);\n        }\n        releaseObject(object);\n      }\n      return result;\n    }\n\n    /**\n     * Converts the `collection` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to convert.\n     * @returns {Array} Returns the new converted array.\n     * @example\n     *\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\n     * // => [2, 3, 4]\n     */\n    function toArray(collection) {\n      if (collection && typeof collection.length == 'number') {\n        return slice(collection);\n      }\n      return values(collection);\n    }\n\n    /**\n     * Performs a deep comparison of each element in a `collection` to the given\n     * `properties` object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * @static\n     * @memberOf _\n     * @type Function\n     * @category Collections\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Object} props The object of property values to filter by.\n     * @returns {Array} Returns a new array of elements that have the given properties.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.where(characters, { 'age': 36 });\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\n     *\n     * _.where(characters, { 'pets': ['dino'] });\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\n     */\n    var where = filter;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array excluding all values of the provided arrays using strict\n     * equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\n     * // => [1, 3, 4]\n     */\n    function difference(array) {\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element that passes the callback check, instead of the element itself.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\n     * ];\n     *\n     * _.findIndex(characters, function(chr) {\n     *   return chr.age < 20;\n     * });\n     * // => 2\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findIndex(characters, 'blocked');\n     * // => 1\n     */\n    function findIndex(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0;\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        if (callback(array[index], index, array)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of a `collection` from right to left.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\n     * ];\n     *\n     * _.findLastIndex(characters, function(chr) {\n     *   return chr.age > 30;\n     * });\n     * // => 1\n     *\n     * // using \"_.where\" callback shorthand\n     * _.findLastIndex(characters, { 'age': 36 });\n     * // => 0\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.findLastIndex(characters, 'blocked');\n     * // => 2\n     */\n    function findLastIndex(array, callback, thisArg) {\n      var length = array ? array.length : 0;\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (length--) {\n        if (callback(array[length], length, array)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Gets the first element or first `n` elements of an array. If a callback\n     * is provided elements at the beginning of the array are returned as long\n     * as the callback returns truey. The callback is bound to `thisArg` and\n     * invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head, take\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the first element(s) of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.first([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.first(characters, 'blocked');\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function first(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = -1;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[0] : undefined;\n        }\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\n    }\n\n    /**\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\n     * is truey, the array will only be flattened a single level. If a callback\n     * is provided each element of the array is passed through the callback before\n     * flattening. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2], [3, [[4]]]]);\n     * // => [1, 2, 3, 4];\n     *\n     * _.flatten([1, [2], [3, [[4]]]], true);\n     * // => [1, 2, 3, [[4]]];\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.flatten(characters, 'pets');\n     * // => ['hoppy', 'baby puss', 'dino']\n     */\n    function flatten(array, isShallow, callback, thisArg) {\n      // juggle arguments\n      if (typeof isShallow != 'boolean' && isShallow != null) {\n        thisArg = callback;\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\n        isShallow = false;\n      }\n      if (callback != null) {\n        array = map(array, callback, thisArg);\n      }\n      return baseFlatten(array, isShallow);\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found using\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\n     * providing `true` for `fromIndex` will run a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 1\n     *\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 4\n     *\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      if (typeof fromIndex == 'number') {\n        var length = array ? array.length : 0;\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\n      } else if (fromIndex) {\n        var index = sortedIndex(array, value);\n        return array[index] === value ? index : -1;\n      }\n      return baseIndexOf(array, value, fromIndex);\n    }\n\n    /**\n     * Gets all but the last element or last `n` elements of an array. If a\n     * callback is provided elements at the end of the array are excluded from\n     * the result as long as the callback returns truey. The callback is bound\n     * to `thisArg` and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.initial([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.initial([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [1]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.initial(characters, 'blocked');\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\n     *\n     * // using \"_.where\" callback shorthand\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\n     * // => ['barney', 'fred']\n     */\n    function initial(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : callback || n;\n      }\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\n    }\n\n    /**\n     * Creates an array of unique values present in all provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of shared values.\n     * @example\n     *\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2]\n     */\n    function intersection() {\n      var args = [],\n          argsIndex = -1,\n          argsLength = arguments.length,\n          caches = getArray(),\n          indexOf = getIndexOf(),\n          trustIndexOf = indexOf === baseIndexOf,\n          seen = getArray();\n\n      while (++argsIndex < argsLength) {\n        var value = arguments[argsIndex];\n        if (isArray(value) || isArguments(value)) {\n          args.push(value);\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\n            createCache(argsIndex ? args[argsIndex] : seen));\n        }\n      }\n      var array = args[0],\n          index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      outer:\n      while (++index < length) {\n        var cache = caches[0];\n        value = array[index];\n\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\n          argsIndex = argsLength;\n          (cache || seen).push(value);\n          while (--argsIndex) {\n            cache = caches[argsIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n      }\n      while (argsLength--) {\n        cache = caches[argsLength];\n        if (cache) {\n          releaseObject(cache);\n        }\n      }\n      releaseArray(caches);\n      releaseArray(seen);\n      return result;\n    }\n\n    /**\n     * Gets the last element or last `n` elements of an array. If a callback is\n     * provided elements at the end of the array are returned as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback] The function called\n     *  per element or the number of elements to return. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {*} Returns the last element(s) of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     *\n     * _.last([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.last([1, 2, 3], function(num) {\n     *   return num > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.last(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.last(characters, { 'employer': 'na' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function last(array, callback, thisArg) {\n      var n = 0,\n          length = array ? array.length : 0;\n\n      if (typeof callback != 'number' && callback != null) {\n        var index = length;\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (index-- && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = callback;\n        if (n == null || thisArg) {\n          return array ? array[length - 1] : undefined;\n        }\n      }\n      return slice(array, nativeMax(0, length - n));\n    }\n\n    /**\n     * Gets the index at which the last occurrence of `value` is found using strict\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\n     * as the offset from the end of the collection.\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value or `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\n     * // => 4\n     *\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var index = array ? array.length : 0;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from the given array using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {...*} [value] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull(array) {\n      var args = arguments,\n          argsIndex = 0,\n          argsLength = args.length,\n          length = array ? array.length : 0;\n\n      while (++argsIndex < argsLength) {\n        var index = -1,\n            value = args[argsIndex];\n        while (++index < length) {\n          if (array[index] === value) {\n            splice.call(array, index--, 1);\n            length--;\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to but not including `end`. If `start` is less than `stop` a\n     * zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns a new range array.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      start = +start || 0;\n      step = typeof step == 'number' ? step : (+step || 1);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      }\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\n      var index = -1,\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Removes all elements from an array that the callback returns truey for\n     * and returns an array of removed elements. The callback is bound to `thisArg`\n     * and invoked with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4, 5, 6];\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\n     *\n     * console.log(array);\n     * // => [1, 3, 5]\n     *\n     * console.log(evens);\n     * // => [2, 4, 6]\n     */\n    function remove(array, callback, thisArg) {\n      var index = -1,\n          length = array ? array.length : 0,\n          result = [];\n\n      callback = lodash.createCallback(callback, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (callback(value, index, array)) {\n          result.push(value);\n          splice.call(array, index--, 1);\n          length--;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.initial` this method gets all but the first element or\n     * first `n` elements of an array. If a callback function is provided elements\n     * at the beginning of the array are excluded from the result as long as the\n     * callback returns truey. The callback is bound to `thisArg` and invoked\n     * with three arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias drop, tail\n     * @category Arrays\n     * @param {Array} array The array to query.\n     * @param {Function|Object|number|string} [callback=1] The function called\n     *  per element or the number of elements to exclude. If a property name or\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\n     *  style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.rest([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.rest([1, 2, 3], function(num) {\n     *   return num < 3;\n     * });\n     * // => [3]\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\n     * ];\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\n     * // => ['fred', 'pebbles']\n     *\n     * // using \"_.where\" callback shorthand\n     * _.rest(characters, { 'employer': 'slate' });\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\n     */\n    function rest(array, callback, thisArg) {\n      if (typeof callback != 'number' && callback != null) {\n        var n = 0,\n            index = -1,\n            length = array ? array.length : 0;\n\n        callback = lodash.createCallback(callback, thisArg, 3);\n        while (++index < length && callback(array[index], index, array)) {\n          n++;\n        }\n      } else {\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\n      }\n      return slice(array, n);\n    }\n\n    /**\n     * Uses a binary search to determine the smallest index at which a value\n     * should be inserted into a given sorted array in order to maintain the sort\n     * order of the array. If a callback is provided it will be executed for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * callback is bound to `thisArg` and invoked with one argument; (value).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([20, 30, 50], 40);\n     * // => 2\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 2\n     *\n     * var dict = {\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\n     * };\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return dict.wordToNumber[word];\n     * });\n     * // => 2\n     *\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\n     *   return this.wordToNumber[word];\n     * }, dict);\n     * // => 2\n     */\n    function sortedIndex(array, value, callback, thisArg) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      // explicitly reference `identity` for better inlining in Firefox\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\n      value = callback(value);\n\n      while (low < high) {\n        var mid = (low + high) >>> 1;\n        (callback(array[mid]) < value)\n          ? low = mid + 1\n          : high = mid;\n      }\n      return low;\n    }\n\n    /**\n     * Creates an array of unique values, in order, of the provided arrays using\n     * strict equality for comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of combined values.\n     * @example\n     *\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\n     * // => [1, 2, 3, 5, 4]\n     */\n    function union() {\n      return baseUniq(baseFlatten(arguments, true, true));\n    }\n\n    /**\n     * Creates a duplicate-value-free version of an array using strict equality\n     * for comparisons, i.e. `===`. If the array is sorted, providing\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\n     * each element of `array` is passed through the callback before uniqueness\n     * is computed. The callback is bound to `thisArg` and invoked with three\n     * arguments; (value, index, array).\n     *\n     * If a property name is provided for `callback` the created \"_.pluck\" style\n     * callback will return the property value of the given element.\n     *\n     * If an object is provided for `callback` the created \"_.where\" style callback\n     * will return `true` for elements that have the properties of the given object,\n     * else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Arrays\n     * @param {Array} array The array to process.\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\n     * @param {Function|Object|string} [callback=identity] The function called\n     *  per iteration. If a property name or object is provided it will be used\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns a duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([1, 2, 1, 3, 1]);\n     * // => [1, 2, 3]\n     *\n     * _.uniq([1, 1, 2, 2, 3], true);\n     * // => [1, 2, 3]\n     *\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\n     * // => ['A', 'b', 'C']\n     *\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\n     * // => [1, 2.5, 3]\n     *\n     * // using \"_.pluck\" callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, callback, thisArg) {\n      // juggle arguments\n      if (typeof isSorted != 'boolean' && isSorted != null) {\n        thisArg = callback;\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\n        isSorted = false;\n      }\n      if (callback != null) {\n        callback = lodash.createCallback(callback, thisArg, 3);\n      }\n      return baseUniq(array, isSorted, callback);\n    }\n\n    /**\n     * Creates an array excluding all provided values using strict equality for\n     * comparisons, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {Array} array The array to filter.\n     * @param {...*} [value] The values to exclude.\n     * @returns {Array} Returns a new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\n     * // => [2, 3, 4]\n     */\n    function without(array) {\n      return baseDifference(array, slice(arguments, 1));\n    }\n\n    /**\n     * Creates an array that is the symmetric difference of the provided arrays.\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\n     *\n     * @static\n     * @memberOf _\n     * @category Arrays\n     * @param {...Array} [array] The arrays to inspect.\n     * @returns {Array} Returns an array of values.\n     * @example\n     *\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\n     * // => [3, 5, 4]\n     *\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\n     * // => [1, 4, 5]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArray(array) || isArguments(array)) {\n          var result = result\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\n            : array;\n        }\n      }\n      return result || [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second\n     * elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @alias unzip\n     * @category Arrays\n     * @param {...Array} [array] Arrays to process.\n     * @returns {Array} Returns a new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    function zip() {\n      var array = arguments.length > 1 ? arguments : arguments[0],\n          index = -1,\n          length = array ? max(pluck(array, 'length')) : 0,\n          result = Array(length < 0 ? 0 : length);\n\n      while (++index < length) {\n        result[index] = pluck(array, index);\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed from arrays of `keys` and `values`. Provide\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\n     * or two arrays, one of `keys` and one of corresponding `values`.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Arrays\n     * @param {Array} keys The array of keys.\n     * @param {Array} [values=[]] The array of values.\n     * @returns {Object} Returns an object composed of the given keys and\n     *  corresponding values.\n     * @example\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(keys, values) {\n      var index = -1,\n          length = keys ? keys.length : 0,\n          result = {};\n\n      if (!values && length && !isArray(keys[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = keys[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that executes `func`, with  the `this` binding and\n     * arguments of the created function, only after being called `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {number} n The number of times the function must be called before\n     *  `func` is executed.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('Done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'Done saving!', after all saves have completed\n     */\n    function after(n, func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with the `this`\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\n     * provided to the bound function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var func = function(greeting) {\n     *   return greeting + ' ' + this.name;\n     * };\n     *\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\n     * func();\n     * // => 'hi fred'\n     */\n    function bind(func, thisArg) {\n      return arguments.length > 2\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\n        : createWrapper(func, 1, null, null, thisArg);\n    }\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all the function properties\n     * of `object` will be bound.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...string} [methodName] The object method names to\n     *  bind, specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() { console.log('clicked ' + this.label); }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs', when the button is clicked\n     */\n    function bindAll(object) {\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\n          index = -1,\n          length = funcs.length;\n\n      while (++index < length) {\n        var key = funcs[index];\n        object[key] = createWrapper(object[key], 1, null, null, object);\n      }\n      return object;\n    }\n\n    /**\n     * Creates a function that, when called, invokes the method at `object[key]`\n     * and prepends any additional `bindKey` arguments to those provided to the bound\n     * function. This method differs from `_.bind` by allowing bound functions to\n     * reference methods that will be redefined or don't yet exist.\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'name': 'fred',\n     *   'greet': function(greeting) {\n     *     return greeting + ' ' + this.name;\n     *   }\n     * };\n     *\n     * var func = _.bindKey(object, 'greet', 'hi');\n     * func();\n     * // => 'hi fred'\n     *\n     * object.greet = function(greeting) {\n     *   return greeting + 'ya ' + this.name + '!';\n     * };\n     *\n     * func();\n     * // => 'hiya fred!'\n     */\n    function bindKey(object, key) {\n      return arguments.length > 2\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\n        : createWrapper(key, 3, null, null, object);\n    }\n\n    /**\n     * Creates a function that is the composition of the provided functions,\n     * where each function consumes the return value of the function that follows.\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\n     * Each function is executed with the `this` binding of the composed function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {...Function} [func] Functions to compose.\n     * @returns {Function} Returns the new composed function.\n     * @example\n     *\n     * var realNameMap = {\n     *   'pebbles': 'penelope'\n     * };\n     *\n     * var format = function(name) {\n     *   name = realNameMap[name.toLowerCase()] || name;\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\n     * };\n     *\n     * var greet = function(formatted) {\n     *   return 'Hiya ' + formatted + '!';\n     * };\n     *\n     * var welcome = _.compose(greet, format);\n     * welcome('pebbles');\n     * // => 'Hiya Penelope!'\n     */\n    function compose() {\n      var funcs = arguments,\n          length = funcs.length;\n\n      while (length--) {\n        if (!isFunction(funcs[length])) {\n          throw new TypeError;\n        }\n      }\n      return function() {\n        var args = arguments,\n            length = funcs.length;\n\n        while (length--) {\n          args = [funcs[length].apply(this, args)];\n        }\n        return args[0];\n      };\n    }\n\n    /**\n     * Creates a function which accepts one or more arguments of `func` that when\n     * invoked either executes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\n     * if `func.length` is not sufficient.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var curried = _.curry(function(a, b, c) {\n     *   console.log(a + b + c);\n     * });\n     *\n     * curried(1)(2)(3);\n     * // => 6\n     *\n     * curried(1, 2)(3);\n     * // => 6\n     *\n     * curried(1, 2, 3);\n     * // => 6\n     */\n    function curry(func, arity) {\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\n      return createWrapper(func, 4, null, null, null, arity);\n    }\n\n    /**\n     * Creates a function that will delay the execution of `func` until after\n     * `wait` milliseconds have elapsed since the last time it was invoked.\n     * Provide an options object to indicate that `func` should be invoked on\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\n     * to the debounced function will return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to debounce.\n     * @param {number} wait The number of milliseconds to delay.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // avoid costly calculations while the window size is in flux\n     * var lazyLayout = _.debounce(calculateLayout, 150);\n     * jQuery(window).on('resize', lazyLayout);\n     *\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * });\n     *\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\n     * var source = new EventSource('/stream');\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }, false);\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      wait = nativeMax(0, wait) || 0;\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = options.leading;\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      var delayed = function() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0) {\n          if (maxTimeoutId) {\n            clearTimeout(maxTimeoutId);\n          }\n          var isCalled = trailingCall;\n          maxTimeoutId = timeoutId = trailingCall = undefined;\n          if (isCalled) {\n            lastCalled = now();\n            result = func.apply(thisArg, args);\n            if (!timeoutId && !maxTimeoutId) {\n              args = thisArg = null;\n            }\n          }\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      };\n\n      var maxDelayed = function() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (trailing || (maxWait !== wait)) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = null;\n          }\n        }\n      };\n\n      return function() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = null;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Defers executing the `func` function until the current call stack has cleared.\n     * Additional arguments will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to defer.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) { console.log(text); }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    function defer(func) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 1);\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\n    }\n\n    /**\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\n     * will be provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay execution.\n     * @param {...*} [arg] Arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    function delay(func, wait) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var args = slice(arguments, 2);\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided it will be used to determine the cache key for storing the result\n     * based on the arguments provided to the memoized function. By default, the\n     * first argument provided to the memoized function is used as the cache key.\n     * The `func` is executed with the `this` binding of the memoized function.\n     * The result cache is exposed as the `cache` property on the memoized function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] A function used to resolve the cache key.\n     * @returns {Function} Returns the new memoizing function.\n     * @example\n     *\n     * var fibonacci = _.memoize(function(n) {\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\n     * });\n     *\n     * fibonacci(9)\n     * // => 34\n     *\n     * var data = {\n     *   'fred': { 'name': 'fred', 'age': 40 },\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // modifying the result cache\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\n     * get('pebbles');\n     * // => { 'name': 'pebbles', 'age': 1 }\n     *\n     * get.cache.pebbles.name = 'penelope';\n     * get('pebbles');\n     * // => { 'name': 'penelope', 'age': 1 }\n     */\n    function memoize(func, resolver) {\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      var memoized = function() {\n        var cache = memoized.cache,\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\n\n        return hasOwnProperty.call(cache, key)\n          ? cache[key]\n          : (cache[key] = func.apply(this, arguments));\n      }\n      memoized.cache = {};\n      return memoized;\n    }\n\n    /**\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\n     * the function will return the value of the first call. The `func` is executed\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` executes `createApplication` once\n     */\n    function once(func) {\n      var ran,\n          result;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      return function() {\n        if (ran) {\n          return result;\n        }\n        ran = true;\n        result = func.apply(this, arguments);\n\n        // clear the `func` variable so the function may be garbage collected\n        func = null;\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that, when called, invokes `func` with any additional\n     * `partial` arguments prepended to those provided to the new function. This\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\n     * var hi = _.partial(greet, 'hi');\n     * hi('fred');\n     * // => 'hi fred'\n     */\n    function partial(func) {\n      return createWrapper(func, 16, slice(arguments, 1));\n    }\n\n    /**\n     * This method is like `_.partial` except that `partial` arguments are\n     * appended to those provided to the new function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [arg] Arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\n     *\n     * var options = {\n     *   'variable': 'data',\n     *   'imports': { 'jq': $ }\n     * };\n     *\n     * defaultsDeep(options, _.templateSettings);\n     *\n     * options.variable\n     * // => 'data'\n     *\n     * options.imports\n     * // => { '_': _, 'jq': $ }\n     */\n    function partialRight(func) {\n      return createWrapper(func, 32, null, slice(arguments, 1));\n    }\n\n    /**\n     * Creates a function that, when executed, will only call the `func` function\n     * at most once per every `wait` milliseconds. Provide an options object to\n     * indicate that `func` should be invoked on the leading and/or trailing edge\n     * of the `wait` timeout. Subsequent calls to the throttled function will\n     * return the result of the last `func` call.\n     *\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {Function} func The function to throttle.\n     * @param {number} wait The number of milliseconds to throttle executions to.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // avoid excessively updating the position while scrolling\n     * var throttled = _.throttle(updatePosition, 100);\n     * jQuery(window).on('scroll', throttled);\n     *\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (!isFunction(func)) {\n        throw new TypeError;\n      }\n      if (options === false) {\n        leading = false;\n      } else if (isObject(options)) {\n        leading = 'leading' in options ? options.leading : leading;\n        trailing = 'trailing' in options ? options.trailing : trailing;\n      }\n      debounceOptions.leading = leading;\n      debounceOptions.maxWait = wait;\n      debounceOptions.trailing = trailing;\n\n      return debounce(func, wait, debounceOptions);\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Additional arguments provided to the function are appended\n     * to those provided to the wrapper function. The wrapper is executed with\n     * the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Functions\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('Fred, Wilma, & Pebbles');\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return createWrapper(wrapper, 16, [value]);\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * var getter = _.constant(object);\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\n     * name the created callback will return the property value for a given element.\n     * If `func` is an object the created callback will return `true` for elements\n     * that contain the equivalent object properties, otherwise it will return `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} [func=identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of the created callback.\n     * @param {number} [argCount] The number of arguments the callback accepts.\n     * @returns {Function} Returns a callback function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\n     *   return !match ? func(callback, thisArg) : function(object) {\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(characters, 'age__gt38');\n     * // => [{ 'name': 'fred', 'age': 40 }]\n     */\n    function createCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (func == null || type == 'function') {\n        return baseCreateCallback(func, thisArg, argCount);\n      }\n      // handle \"_.pluck\" style callback shorthands\n      if (type != 'object') {\n        return property(func);\n      }\n      var props = keys(func),\n          key = props[0],\n          a = func[key];\n\n      // handle \"_.where\" style callback shorthands\n      if (props.length == 1 && a === a && !isObject(a)) {\n        // fast path the common case of providing an object with a single\n        // property containing a primitive value\n        return function(object) {\n          var b = object[key];\n          return a === b && (a !== 0 || (1 / a == 1 / b));\n        };\n      }\n      return function(object) {\n        var length = props.length,\n            result = false;\n\n        while (length--) {\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\n            break;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\n     * corresponding HTML entities.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('Fred, Wilma, & Pebbles');\n     * // => 'Fred, Wilma, &amp; Pebbles'\n     */\n    function escape(string) {\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Adds function properties of a source object to the destination object.\n     * If `object` is a function methods will be added to its prototype as well.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Function|Object} [object=lodash] object The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\n     * @example\n     *\n     * function capitalize(string) {\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\n     * }\n     *\n     * _.mixin({ 'capitalize': capitalize });\n     * _.capitalize('fred');\n     * // => 'Fred'\n     *\n     * _('fred').capitalize().value();\n     * // => 'Fred'\n     *\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\n     * _('fred').capitalize();\n     * // => 'Fred'\n     */\n    function mixin(object, source, options) {\n      var chain = true,\n          methodNames = source && functions(source);\n\n      if (!source || (!options && !methodNames.length)) {\n        if (options == null) {\n          options = source;\n        }\n        ctor = lodashWrapper;\n        source = object;\n        object = lodash;\n        methodNames = functions(source);\n      }\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      var ctor = object,\n          isFunc = isFunction(ctor);\n\n      forEach(methodNames, function(methodName) {\n        var func = object[methodName] = source[methodName];\n        if (isFunc) {\n          ctor.prototype[methodName] = function() {\n            var chainAll = this.__chain__,\n                value = this.__wrapped__,\n                args = [value];\n\n            push.apply(args, arguments);\n            var result = func.apply(object, args);\n            if (chain || chainAll) {\n              if (value === result && isObject(result)) {\n                return this;\n              }\n              result = new ctor(result);\n              result.__chain__ = chainAll;\n            }\n            return result;\n          };\n        }\n      });\n    }\n\n    /**\n     * Reverts the '_' variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      context._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var object = { 'name': 'fred' };\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // no operation performed\n    }\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @example\n     *\n     * var stamp = _.now();\n     * _.defer(function() { console.log(_.now() - stamp); });\n     * // => logs the number of milliseconds it took for the deferred function to be called\n     */\n    var now = isNative(now = Date.now) && now || function() {\n      return new Date().getTime();\n    };\n\n    /**\n     * Converts the given value into an integer of the specified radix.\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\n     * implementations. See http://es5.github.io/#E.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} value The value to parse.\n     * @param {number} [radix] The radix used to interpret the value to parse.\n     * @returns {number} Returns the new integer value.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     */\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\n    };\n\n    /**\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} key The name of the property to retrieve.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'fred',   'age': 40 },\n     *   { 'name': 'barney', 'age': 36 }\n     * ];\n     *\n     * var getName = _.property('name');\n     *\n     * _.map(characters, getName);\n     * // => ['barney', 'fred']\n     *\n     * _.sortBy(characters, getName);\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\n     */\n    function property(key) {\n      return function(object) {\n        return object[key];\n      };\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number will be\n     * returned. If `floating` is truey or either `min` or `max` are floats a\n     * floating-point number will be returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\n     * @returns {number} Returns a random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (typeof min == 'boolean' && noMax) {\n          floating = min;\n          min = 1;\n        }\n        else if (!noMax && typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /**\n     * Resolves the value of property `key` on `object`. If `key` is a function\n     * it will be invoked with the `this` binding of `object` and its result returned,\n     * else the property value is returned. If `object` is falsey then `undefined`\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {Object} object The object to inspect.\n     * @param {string} key The name of the property to resolve.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = {\n     *   'cheese': 'crumpets',\n     *   'stuff': function() {\n     *     return 'nonsense';\n     *   }\n     * };\n     *\n     * _.result(object, 'cheese');\n     * // => 'crumpets'\n     *\n     * _.result(object, 'stuff');\n     * // => 'nonsense'\n     */\n    function result(object, key) {\n      if (object) {\n        var value = object[key];\n        return isFunction(value) ? object[key]() : value;\n      }\n    }\n\n    /**\n     * A micro-templating method that handles arbitrary delimiters, preserves\n     * whitespace, and correctly escapes quotes within interpolated code.\n     *\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n     *\n     * For more information on precompiling templates see:\n     * https://lodash.com/custom-builds\n     *\n     * For more information on Chrome extension sandboxes see:\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} text The template text.\n     * @param {Object} data The data object used to populate the text.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as local variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [variable] The data object variable name.\n     * @returns {Function|string} Returns a compiled function when no `data` object\n     *  is given, else it returns the interpolated text.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= name %>');\n     * compiled({ 'name': 'fred' });\n     * // => 'hello fred'\n     *\n     * // using the \"escape\" delimiter to escape HTML in data property values\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to generate HTML\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\n     * // => 'hello pebbles'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using a custom template delimiters\n     * _.templateSettings = {\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\n     * };\n     *\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using the `imports` option to import jQuery\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     *   var __t, __p = '', __e = _.escape;\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\n     *   return __p;\n     * }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(text, data, options) {\n      // based on John Resig's `tmpl` implementation\n      // http://ejohn.org/blog/javascript-micro-templating/\n      // and Laura Doktorova's doT.js\n      // https://github.com/olado/doT\n      var settings = lodash.templateSettings;\n      text = String(text || '');\n\n      // avoid missing dependencies when `iteratorTemplate` is not defined\n      options = defaults({}, options, settings);\n\n      var imports = defaults({}, options.imports, settings.imports),\n          importsKeys = keys(imports),\n          importsValues = values(imports);\n\n      var isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // compile the regexp to match each delimiter\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // escape characters that cannot be included in string literals\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // replace delimiters with snippets\n        if (escapeValue) {\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // the JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // if `variable` is not specified, wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain\n      var variable = options.variable,\n          hasVariable = variable;\n\n      if (!hasVariable) {\n        variable = 'obj';\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\n      }\n      // cleanup code by stripping empty strings\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // frame code as the function body\n      source = 'function(' + variable + ') {\\n' +\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\n        \"var __t, __p = '', __e = _.escape\" +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      // Use a sourceURL for easier debugging.\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\n\n      try {\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\n      } catch(e) {\n        e.source = source;\n        throw e;\n      }\n      if (data) {\n        return result(data);\n      }\n      // provide the compiled function's source by its `toString` method, in\n      // supported environments, or the `source` property as a convenience for\n      // inlining compiled templates during the build process\n      result.source = source;\n      return result;\n    }\n\n    /**\n     * Executes the callback `n` times, returning an array of the results\n     * of each callback execution. The callback is bound to `thisArg` and invoked\n     * with one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {number} n The number of times to execute the callback.\n     * @param {Function} callback The function called per iteration.\n     * @param {*} [thisArg] The `this` binding of `callback`.\n     * @returns {Array} Returns an array of the results of each `callback` execution.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) { mage.castSpell(n); });\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\n     *\n     * _.times(3, function(n) { this.cast(n); }, mage);\n     * // => also calls `mage.castSpell(n)` three times\n     */\n    function times(n, callback, thisArg) {\n      n = (n = +n) > -1 ? n : 0;\n      var index = -1,\n          result = Array(n);\n\n      callback = baseCreateCallback(callback, thisArg, 1);\n      while (++index < n) {\n        result[index] = callback(index);\n      }\n      return result;\n    }\n\n    /**\n     * The inverse of `_.escape` this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\n     * corresponding characters.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} string The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('Fred, Barney &amp; Pebbles');\n     * // => 'Fred, Barney & Pebbles'\n     */\n    function unescape(string) {\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utilities\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return String(prefix == null ? '' : prefix) + id;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps the given value with explicit\n     * method chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney',  'age': 36 },\n     *   { 'name': 'fred',    'age': 40 },\n     *   { 'name': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(characters)\n     *     .sortBy('age')\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\n     *     .first()\n     *     .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      value = new lodashWrapper(value);\n      value.__chain__ = true;\n      return value;\n    }\n\n    /**\n     * Invokes `interceptor` with the `value` as the first argument and then\n     * returns `value`. The purpose of this method is to \"tap into\" a method\n     * chain in order to perform operations on intermediate results within\n     * the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chaining\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3, 4])\n     *  .tap(function(array) { array.pop(); })\n     *  .reverse()\n     *  .value();\n     * // => [3, 2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chaining\n     * @returns {*} Returns the wrapper object.\n     * @example\n     *\n     * var characters = [\n     *   { 'name': 'barney', 'age': 36 },\n     *   { 'name': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(characters).first();\n     * // => { 'name': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(characters).chain()\n     *   .first()\n     *   .pick('age')\n     *   .value();\n     * // => { 'age': 36 }\n     */\n    function wrapperChain() {\n      this.__chain__ = true;\n      return this;\n    }\n\n    /**\n     * Produces the `toString` result of the wrapped value.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chaining\n     * @returns {string} Returns the string result.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return String(this.__wrapped__);\n    }\n\n    /**\n     * Extracts the wrapped value.\n     *\n     * @name valueOf\n     * @memberOf _\n     * @alias value\n     * @category Chaining\n     * @returns {*} Returns the wrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).valueOf();\n     * // => [1, 2, 3]\n     */\n    function wrapperValueOf() {\n      return this.__wrapped__;\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return wrapped values when chaining\n    lodash.after = after;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.chain = chain;\n    lodash.compact = compact;\n    lodash.compose = compose;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.createCallback = createCallback;\n    lodash.curry = curry;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.map = map;\n    lodash.mapValues = mapValues;\n    lodash.max = max;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.min = min;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.pull = pull;\n    lodash.range = range;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.shuffle = shuffle;\n    lodash.sortBy = sortBy;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.values = values;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n\n    // add aliases\n    lodash.collect = map;\n    lodash.drop = rest;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n    lodash.unzip = zip;\n\n    // add functions to `lodash.prototype`\n    mixin(lodash);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions that return unwrapped values when chaining\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.contains = contains;\n    lodash.escape = escape;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.indexOf = indexOf;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isNaN = isNaN;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isUndefined = isUndefined;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.mixin = mixin;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.result = result;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.template = template;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n\n    // add aliases\n    lodash.all = every;\n    lodash.any = some;\n    lodash.detect = find;\n    lodash.findWhere = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.include = contains;\n    lodash.inject = reduce;\n\n    mixin(function() {\n      var source = {}\n      forOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }(), false);\n\n    /*--------------------------------------------------------------------------*/\n\n    // add functions capable of returning wrapped and unwrapped values when chaining\n    lodash.first = first;\n    lodash.last = last;\n    lodash.sample = sample;\n\n    // add aliases\n    lodash.take = first;\n    lodash.head = first;\n\n    forOwn(lodash, function(func, methodName) {\n      var callbackable = methodName !== 'sample';\n      if (!lodash.prototype[methodName]) {\n        lodash.prototype[methodName]= function(n, guard) {\n          var chainAll = this.__chain__,\n              result = func(this.__wrapped__, n, guard);\n\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\n            ? result\n            : new lodashWrapper(result, chainAll);\n        };\n      }\n    });\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = '2.4.2';\n\n    // add \"Chaining\" functions to the wrapper\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.value = wrapperValueOf;\n    lodash.prototype.valueOf = wrapperValueOf;\n\n    // add `Array` functions that return unwrapped values\n    forEach(['join', 'pop', 'shift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        var chainAll = this.__chain__,\n            result = func.apply(this.__wrapped__, arguments);\n\n        return chainAll\n          ? new lodashWrapper(result, chainAll)\n          : result;\n      };\n    });\n\n    // add `Array` functions that return the existing wrapped value\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        func.apply(this.__wrapped__, arguments);\n        return this;\n      };\n    });\n\n    // add `Array` functions that return new wrapped values\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\n      var func = arrayRef[methodName];\n      lodash.prototype[methodName] = function() {\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\n      };\n    });\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Lo-Dash\n  var _ = runInContext();\n\n  // some AMD build optimizers like r.js check for condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\n    // case Lo-Dash is loaded with a RequireJS shim config.\n    // See http://requirejs.org/docs/api.html#config-shim\n    root._ = _;\n\n    // define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module\n    define(function() {\n      return _;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // in Narwhal or Rhino -require\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // in a browser or Rhino\n    root._ = _;\n  }\n}.call(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/machina/node_modules/lodash/dist/lodash.js\n// module id = 679\n// module chunks = 0 1","import * as Immutable from 'immutable';\nimport _s from 'underscore.string';\n\nimport { ImmutableStore } from '@opengov/og_flux';\n\nimport ReportViewStore from './report_view_store';\n\nfunction defaultState() {\n  return Immutable.fromJS({\n    isOpen: false,\n    activeCategory: null,\n\n    updatedReport: ReportViewStore.getRenderedReport(),\n\n    saving: false,\n    errors: { },\n    deleteStatus: null\n  });\n}\n\nfunction swapDataSets(dataSets, from, to) {\n  return dataSets\n    .remove(to)\n    .splice(from, 0, dataSets.get(to))\n    .map((dataSet, i) => dataSet.set('order', i));\n}\n\nexport default new ImmutableStore({\n  getInitialState() {\n    return defaultState();\n  },\n\n  actions: {\n    REPORT_LOADED: () => defaultState(),\n\n    // REPORT_UPDATED: (state, {changes}) => state.mergeIn(['report'], changes),\n    REPORT_DELETED: state => state.set('isOpen', false),\n\n    REPORT_OPEN_SETTINGS_PANEL: () =>\n      defaultState().set('isOpen', true),\n\n    REPORT_OPEN_EDIT_DATA: state => state.set('isOpen', false),\n    REPORT_OPEN_EDIT_LINKAGE: state => state.set('isOpen', false),\n\n    REPORT_SETTINGS_SELECT_CATEGORY: (state, {category}) =>\n      state.set('activeCategory', Immutable.Map(category)),\n\n    REPORT_SETTINGS_GO_BACK: state => state\n      .set('isOpen', true)  // We may need to re-open the settings panel if we are backing out of report data wizard.\n      .set('activeCategory', null),\n\n    REPORT_SETTINGS_CANCEL: state => state.set('isOpen', false),\n\n    REPORT_SETTINGS_SAVE: state => state.set('saving', true),\n    REPORT_SETTINGS_SAVE_SUCCESS: state => state.set('errors', Immutable.Map()),\n    REPORT_SETTINGS_SAVE_ERROR: (state, {errors}) => state.set('errors', Immutable.fromJS(errors)),\n    REPORT_SETTINGS_SAVE_DONE: state => state.set('saving', false),\n\n    REPORT_SETTINGS_CHANGE_ATTRIBUTE: (state, {fieldPath, newValue}) =>\n      state.setIn(['updatedReport'].concat(fieldPath), newValue),\n\n    REPORT_SETTINGS_DELETE_REPORT: state => state.set('deleteStatus', 'confirm'),\n    REPORT_SETTINGS_DELETE_REPORT_CONFIRMED: state => state.set('deleteStatus', 'pending'),\n    REPORT_SETTINGS_DELETE_REPORT_CANCELED: state => state.set('deleteStatus', null),\n    REPORT_SETTINGS_DELETE_REPORT_SUCCESS: state => state.set('deleteStatus', 'completed'),\n    REPORT_SETTINGS_DELETE_REPORT_ERROR: state => state.set('deleteStatus', 'failed'),\n    REPORT_SETTINGS_DELETE_REPORT_FINISHED: state => state.set('deleteStatus', null).set('isOpen', false),\n\n    REPORT_SETTINGS_CHANGE_DATA_SET_ORDER: (state, {from, to}) => {\n      return state.updateIn(['updatedReport', 'data_sets'], dataSets => {\n        return swapDataSets(dataSets, from, to);\n      });\n    },\n\n    REPORT_SETTINGS_RENAME_DATA_SET: (state, {dataSetIndex, name}) =>\n      state.setIn(['updatedReport', 'data_sets', dataSetIndex, 'name'], name),\n\n    REPORT_SETTINGS_CHANGE_XAXIS_LABEL: (state, {label}) =>\n      state.setIn(['updatedReport', 'properties', 'fiscal_year_text'], label || null)\n  },\n\n  isDirty() {\n    return !this.getState().get('updatedReport').equals(ReportViewStore.getRenderedReport());\n  },\n\n  isTitleTooLong() {\n    const name = this.getState().getIn(['updatedReport', 'name']);\n    return _s.clean(name).length > 20;\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/settings_panel_store.ts","import React from 'react';\n\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\nconst Table = Ovid.Table;\nconst CollectionSearch = Ovid.CollectionSearch;\n\nimport WizardStep from './wizard_step_mixin';\nimport checkDataSetSubSet from './check_dataset_subset';\n\nimport createReactClass from 'create-react-class';\n\nconst ChooseDataSets = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      coaDataSets: [],\n      loading: true,\n      sortBy: 'year'\n    };\n  },\n\n  renderHeader() {\n    return <h4>Choose data to include in this report</h4>;\n  },\n\n  sortFields: {\n    monthText: 'month'\n  },\n\n  renderContent() {\n    let sortField = this.sortFields[this.state.sortBy] || this.state.sortBy;\n    if (sortField === 'date_updated') {\n      sortField = dataSet => Date.parse(dataSet.updated);\n    }\n\n    const coaDataSets = _.sortBy(this.state.filteredDataSets, sortField);\n    if (!this.state.sortAsc) {\n      coaDataSets.reverse();\n    }\n    const dataSetErrors = this.props.errors && this.props.errors.data_sets;\n    //In case of search, check if all the coaDataSets are included in the rports dataset\n    const isAllChecked = checkDataSetSubSet(this.state.filteredDataSets, this.state.selectedDataSets);\n\n    const columns = [\n      new Ovid.CheckboxColumn({\n        key: 'select',\n        onCheckAll: this.handleSelectAll,\n        checkedRows: this.state.selectedDataSets.toJSON(),\n        isAllChecked\n      }),\n      {key: 'year', name: 'Year', sortable: true},\n      {key: 'monthText', name: 'Month', sortable: true},\n      {key: 'data_set_type', name: 'Type', sortable: true},\n      {key: 'date_updated', name: 'Date Updated', sortable: true},\n      {key: 'date_created', name: 'Date Created', sortable: true},\n      {key: 'name', name: 'Name', sortable: true},\n      {key: 'description', name: 'Description', sortable: true},\n      {key: 'file_name', name: 'File name', sortable: true}\n    ];\n\n    return (\n      <div>\n        {this.props.errors && this.props.errors.data_sets ? (\n          <div className=\"ui-alert-box whoops\"><span className=\"icon-exclamation-1\" /> Some of the data sets could not be added to the report.</div>\n        ) : null}\n        <div className=\"ui-card\">\n          <div className=\"ui-card__content\">\n            <CollectionSearch\n              collection={this.state.coaDataSets}\n              fields={['year', 'monthText', 'data_set_type', 'name', 'date_uploaded', 'description']}\n              onChange={this.handleSearchChange}\n              placeholder={'Search data sets'} />\n          </div>\n          <div className=\"data-table__scroll-container\">\n            <Table\n              columns={columns}\n              rows={coaDataSets}\n              rowErrors={dataSetErrors}\n              onSort={this.handleSort}\n              onRowClick={this.handleRowClick}\n              sortBy={this.state.sortBy}\n              sortAsc={this.state.sortAsc} />\n          </div>\n        </div>\n      </div>\n    );\n  },\n\n  componentDidMount: function() {\n    this.props.report.dataSets.on('all', this.handleChange, this);\n\n    // TODO: After DATA-1675, remove this pre-filtering. The line should\n    // revert to var rawDataSets = this.props.dataSets;\n    var rawDataSets = this.props.dataSets.filter(function(dataSet) {\n      return (dataSet.data_set_type === 'budget' || dataSet.data_set_type === 'actual');\n    });\n    this.setState({\n      coaDataSets: rawDataSets,\n      filteredDataSets: rawDataSets,\n      loading: false,\n      selectedDataSets: this.props.report.dataSets\n    });\n  },\n\n  componentWillReceiveProps(nextProps) {\n    // If we are receiving validation errors for data sets,\n    // remove them from the selected data set collection.\n    // For example if the data set no longer exists, the user should\n    // just be able to hit \"next\" to continue on with the selected data sets.\n    const dataSetErrors = nextProps.errors && nextProps.errors.data_sets;\n    if (dataSetErrors) {\n      nextProps.report.dataSets.remove(Object.keys(dataSetErrors));\n    }\n  },\n\n  isValid() {\n    return !this.props.report.dataSets.isEmpty();\n  },\n\n  handleRowClick(dataSet) {\n    const dataSets = this.state.selectedDataSets;\n\n    if (!dataSets.get(dataSet)) {\n      dataSets.add(dataSet);\n    } else {\n      dataSets.remove(dataSet);\n    }\n    this.setState({ selectedDataSets: dataSets });\n    this.props.report.dataSets = dataSets;\n  },\n\n  handleSelectAll(isChecked) {\n    const dataSets = this.state.selectedDataSets;\n    const coaDataSets = this.state.filteredDataSets;\n    if (isChecked) {\n      dataSets.add(this.state.filteredDataSets);\n    } else {\n      if (dataSets.length === coaDataSets.length) {\n        //Reset dataset to uncheck all\n        dataSets.reset();\n      } else {\n        //uncheck the data sets in the filtered view and remove it from the reports\n        _.forEach(coaDataSets, (coaDataSet) => {\n          dataSets.remove(coaDataSet);\n        });\n      }\n    }\n    this.setState({ selectedDataSets: dataSets });\n    this.props.report.dataSets = dataSets;\n  },\n\n  handleSort(sortBy, ascending) {\n    this.setState({sortBy, sortAsc: ascending});\n  },\n\n  handleSearchChange(items) {\n    this.setState({filteredDataSets: items});\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default ChooseDataSets;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/gl_data_sets.tsx","import React from 'react';\n\nimport _ from 'lodash';\n\n\nimport * as Ovid from '@opengov/ovid';\nconst Table = Ovid.Table;\nconst CollectionSearch = Ovid.CollectionSearch;\n\nimport api from '@opengov/og_api';\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst ChooseDataSets = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      coaDataSets: [],\n      loading: true,\n      sortBy: 'year'\n    };\n  },\n\n  renderHeader() {\n    return <h4>Choose transactions data to include in the report</h4>;\n  },\n\n  renderContent() {\n    const selectedSet = this.getSelected();\n    const txDataSets = _.sortBy(this.state.filteredDataSets, this.state.sortBy);\n    if (this.state.sortAsc) {\n      txDataSets.reverse();\n    }\n\n    const columns = [\n      new Ovid.RadioColumn({\n        key: 'select',\n        selectedRow: selectedSet\n      }),\n      {key: 'title', name: 'Title'},\n      {key: 'id', name: 'ID'},\n      {key: 'chart_id', name: 'Chart ID'}\n    ];\n\n    return (\n      <div>\n        {this.props.errors && this.props.errors.coa ? (\n          <div className=\"ui-alert-box whoops\">\n            <p><i className=\"icon-exclamation-1\" /> Chart of Accounts linked to transactions data set not found.</p>\n          </div>\n        ) : null}\n\n        <div className=\"ui-card ui-container_scroll\">\n          <div className=\"ui-card__content\">\n            <CollectionSearch\n            collection={this.state.coaDataSets}\n            fields={['title']}\n            onChange={this.handleSearchChange}\n            placeholder={'Search datasets'} />\n          </div>\n\n          {_.isEmpty(txDataSets) ? (\n            <p className=\"ui-null\">\n              <strong>No data for that query</strong>\n            </p>)\n          : <Table\n              columns={columns}\n              rows={txDataSets}\n              onSort={this.handleSort}\n              onRowClick={this.handleSelect}\n              sortBy={this.state.sortBy}\n              sortAsc={this.state.sortAsc} />}\n        </div>\n      </div>\n    );\n  },\n\n  componentDidMount() {\n    this.props.report.dataSets.on('all', this.handleChange, this);\n\n    api.trapi.get('data_sets', this.props.entity.get('id'))\n      .end()\n      .then((result) => {\n        const rawDataSets = result.body.data_sets;\n        this.setState({\n          coaDataSets: rawDataSets,\n          filteredDataSets: rawDataSets,\n          loading: false,\n          error: false\n        });\n      }).catch(() => {\n        this.setState({\n          coaDataSets: null,\n          filteredDataSets: null,\n          loading: false,\n          error: true\n        });\n      });\n  },\n\n\n  handleSort(sortBy, ascending) {\n    this.setState({sortBy, sortAsc: ascending});\n  },\n\n  handleSearchChange(items) {\n    this.setState({filteredDataSets: items});\n  },\n\n  getSelected() {\n    return this.props.report.get('transaction_id');\n  },\n\n  isValid() {\n    return this.props.report.has('transaction_id');\n  },\n\n  handleSelect(transaction) {\n    this.props.report.set({\n      transaction_id: transaction.id,\n      coa_id: transaction.chart_id,\n      properties: {} // reset the state when switching datasets so we don't trigger invalid query\n    });\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\n\nexport default ChooseDataSets;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/tx_data_sets.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\nimport SettingsPanelHeaderText from './settings_panel_header_text';\n\nconst getProperty = function(report, propertyName) {\n  return report && report.get(propertyName) || null;\n};\n\nexport default class SettingsPanelHeader extends React.Component<any, any> {\n  static propTypes = {\n    report: PropTypes.object\n  }\n\n  _renderHeader = () => {\n    const { report, oneVisibleCategory } = this.props;\n\n    if (oneVisibleCategory) {\n      return (\n        <h3><span className=\"icon-settings-1\" /> {oneVisibleCategory.props.title}</h3>\n      );\n    }\n\n    return (\n      <SettingsPanelHeaderText\n        additionalHeadingText={getProperty(report, 'name')}\n        additionalHeadingDescription={getProperty(report, 'report_type_name')} />\n    );\n  }\n\n  render() {\n    return (\n      <header className=\"ui-panel__header\">\n        {this._renderHeader()}\n        <button className=\"ui-panel__close\" onClick={SettingsPanelActions.cancel} />\n      </header>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/settings_panel_header.tsx","import { Dispatcher } from '@opengov/og_flux';\nimport { OgApi } from '@opengov/og_api';\n\nconst api = new OgApi(`${gon.ogOperateHost}/api/stories/v1`);\nconst PORTAL_STORIES_LIMIT = 1000;\n\nexport function fetchStories(entityId) {\n  api.get(`public/portal-stories?entity_id=${entityId}&per_page=${PORTAL_STORIES_LIMIT}`).end()\n    .then(res => {\n      Dispatcher.handleViewAction({\n        actionType: 'STORIES_LOADED',\n        stories: res.body.data\n      });\n    });\n}\n\nexport function selectStoryToView(storyId) {\n  Dispatcher.handleViewAction({\n    actionType: 'STORIES_VIEW_STORY',\n    storyId\n  });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/stories_actions.ts","import Immutable from 'immutable';\n\nimport { ImmutableStore } from '@opengov/og_flux';\n\nconst StoriesStore = new ImmutableStore({\n  getInitialState() {\n    return Immutable.fromJS({\n      stories: Immutable.List(),\n      selectedStoryId: null\n    });\n  },\n\n  selectedStoryPublicURL() {\n    const state = this.getState();\n    const stories = state.get('stories');\n    const selectedStoryId = state.get('selectedStoryId');\n\n    if (stories.isEmpty() || !selectedStoryId) {\n      return null;\n    }\n\n    const story = stories.find(s => s.get('_id') === selectedStoryId);\n    return story && story.get('public_url');\n  },\n\n  actions: {\n    STORIES_LOADED(state, action) {\n      const stories = Immutable.fromJS(action.stories.map(s => { return { ...s.story, order: s.order } }));\n      return state.set('stories', stories);\n    },\n\n    STORIES_VIEW_STORY(state, action) {\n      return state.set('selectedStoryId', action.storyId);\n    }\n  }\n});\n\nexport default StoriesStore;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/stories_store.ts","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js\n// module id = 686\n// module chunks = 0 1","exports.f = require('./_wks');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js\n// module id = 687\n// module chunks = 0 1","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js\n// module id = 688\n// module chunks = 0 1","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js\n// module id = 689\n// module chunks = 0 1","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js\n// module id = 690\n// module chunks = 0 1","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js\n// module id = 691\n// module chunks = 0 1","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js\n// module id = 692\n// module chunks = 0 1","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n  if (!(len in factories)) {\n    for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n    // eslint-disable-next-line no-new-func\n    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n  var fn = aFunction(this);\n  var partArgs = arraySlice.call(arguments, 1);\n  var bound = function (/* args... */) {\n    var args = partArgs.concat(arraySlice.call(arguments));\n    return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n  };\n  if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n  return bound;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js\n// module id = 693\n// module chunks = 0 1","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js\n// module id = 694\n// module chunks = 0 1","var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n  var string = $trim(String(str), 3);\n  return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js\n// module id = 695\n// module chunks = 0 1","var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n  var string = $trim(String(str), 3);\n  var result = $parseFloat(string);\n  return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js\n// module id = 696\n// module chunks = 0 1","var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n  if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n  return +it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js\n// module id = 697\n// module chunks = 0 1","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js\n// module id = 698\n// module chunks = 0 1","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js\n// module id = 699\n// module chunks = 0 1","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n  var $abs = Math.abs(x);\n  var $sign = sign(x);\n  var a, result;\n  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n  a = (1 + EPSILON32 / EPSILON) * $abs;\n  result = a - (a - $abs);\n  // eslint-disable-next-line no-self-compare\n  if (result > MAX32 || result != result) return $sign * Infinity;\n  return $sign * result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js\n// module id = 700\n// module chunks = 0 1","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js\n// module id = 701\n// module chunks = 0 1","var aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar toLength = require('./_to-length');\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n  aFunction(callbackfn);\n  var O = toObject(that);\n  var self = IObject(O);\n  var length = toLength(O.length);\n  var index = isRight ? length - 1 : 0;\n  var i = isRight ? -1 : 1;\n  if (aLen < 2) for (;;) {\n    if (index in self) {\n      memo = self[index];\n      index += i;\n      break;\n    }\n    index += i;\n    if (isRight ? index < 0 : length <= index) {\n      throw TypeError('Reduce of empty array with no initial value');\n    }\n  }\n  for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n    memo = callbackfn(memo, self[index], index, O);\n  }\n  return memo;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js\n// module id = 702\n// module chunks = 0 1","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js\n// module id = 703\n// module chunks = 0 1","module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js\n// module id = 704\n// module chunks = 0 1","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js\n// module id = 705\n// module chunks = 0 1","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: require('./_flags')\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js\n// module id = 706\n// module chunks = 0 1","module.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js\n// module id = 707\n// module chunks = 0 1","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js\n// module id = 708\n// module chunks = 0 1","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js\n// module id = 709\n// module chunks = 0 1","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js\n// module id = 710\n// module chunks = 0 1","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js\n// module id = 711\n// module chunks = 0 1","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js\n// module id = 712\n// module chunks = 0 1","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js\n// module id = 713\n// module chunks = 0 1","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n  if (it === undefined) return 0;\n  var number = toInteger(it);\n  var length = toLength(number);\n  if (number !== length) throw RangeError('Wrong length!');\n  return length;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js\n// module id = 714\n// module chunks = 0 1","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js\n// module id = 715\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar isArray = require('./_is-array');\nvar isObject = require('./_is-object');\nvar toLength = require('./_to-length');\nvar ctx = require('./_ctx');\nvar IS_CONCAT_SPREADABLE = require('./_wks')('isConcatSpreadable');\n\nfunction flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n  var targetIndex = start;\n  var sourceIndex = 0;\n  var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;\n  var element, spreadable;\n\n  while (sourceIndex < sourceLen) {\n    if (sourceIndex in source) {\n      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n      spreadable = false;\n      if (isObject(element)) {\n        spreadable = element[IS_CONCAT_SPREADABLE];\n        spreadable = spreadable !== undefined ? !!spreadable : isArray(element);\n      }\n\n      if (spreadable && depth > 0) {\n        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n      } else {\n        if (targetIndex >= 0x1fffffffffffff) throw TypeError();\n        target[targetIndex] = element;\n      }\n\n      targetIndex++;\n    }\n    sourceIndex++;\n  }\n  return targetIndex;\n}\n\nmodule.exports = flattenIntoArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js\n// module id = 716\n// module chunks = 0 1","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js\n// module id = 717\n// module chunks = 0 1","var DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) {\n      key = keys[i++];\n      if (!DESCRIPTORS || isEnum.call(O, key)) {\n        result.push(isEntries ? [key, O[key]] : O[key]);\n      }\n    }\n    return result;\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js\n// module id = 718\n// module chunks = 0 1","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = require('./_classof');\nvar from = require('./_array-from-iterable');\nmodule.exports = function (NAME) {\n  return function toJSON() {\n    if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n    return from(this);\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js\n// module id = 719\n// module chunks = 0 1","var forOf = require('./_for-of');\n\nmodule.exports = function (iter, ITERATOR) {\n  var result = [];\n  forOf(iter, false, result.push, result, ITERATOR);\n  return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js\n// module id = 720\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {\n  if (\n    arguments.length === 0\n      // eslint-disable-next-line no-self-compare\n      || x != x\n      // eslint-disable-next-line no-self-compare\n      || inLow != inLow\n      // eslint-disable-next-line no-self-compare\n      || inHigh != inHigh\n      // eslint-disable-next-line no-self-compare\n      || outLow != outLow\n      // eslint-disable-next-line no-self-compare\n      || outHigh != outHigh\n  ) return NaN;\n  if (x === Infinity || x === -Infinity) return x;\n  return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js\n// module id = 721\n// module chunks = 0 1","export { default } from './index-default.js';\nexport * from './index.js';\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/underscore/modules/index-all.js\n// module id = 725\n// module chunks = 0 1","import * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API\n_._ = _;\n// Export the Underscore API.\nexport default _;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/underscore/modules/index-default.js\n// module id = 726\n// module chunks = 0 1","module.exports = require('./dist/commonjs/index.js').default;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/index.js\n// module id = 727\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _i18next = require('./i18next');\n\nvar _i18next2 = _interopRequireDefault(_i18next);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _i18next2.default;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/index.js\n// module id = 728\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _ResourceStore = require('./ResourceStore');\n\nvar _ResourceStore2 = _interopRequireDefault(_ResourceStore);\n\nvar _Translator = require('./Translator');\n\nvar _Translator2 = _interopRequireDefault(_Translator);\n\nvar _LanguageUtils = require('./LanguageUtils');\n\nvar _LanguageUtils2 = _interopRequireDefault(_LanguageUtils);\n\nvar _PluralResolver = require('./PluralResolver');\n\nvar _PluralResolver2 = _interopRequireDefault(_PluralResolver);\n\nvar _Interpolator = require('./Interpolator');\n\nvar _Interpolator2 = _interopRequireDefault(_Interpolator);\n\nvar _BackendConnector = require('./BackendConnector');\n\nvar _BackendConnector2 = _interopRequireDefault(_BackendConnector);\n\nvar _CacheConnector = require('./CacheConnector');\n\nvar _CacheConnector2 = _interopRequireDefault(_CacheConnector);\n\nvar _defaults2 = require('./defaults');\n\nvar _postProcessor = require('./postProcessor');\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = require('./compatibility/v1');\n\nvar compat = _interopRequireWildcard(_v);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar I18n = function (_EventEmitter) {\n  _inherits(I18n, _EventEmitter);\n\n  function I18n() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    _classCallCheck(this, I18n);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.options = (0, _defaults2.transformOptions)(options);\n    _this.services = {};\n    _this.logger = _logger2.default;\n    _this.modules = {};\n\n    if (callback && !_this.isInitialized) _this.init(options, callback);\n    return _this;\n  }\n\n  I18n.prototype.init = function init(options, callback) {\n    var _this2 = this;\n\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.compatibilityAPI === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertAPIOptions(options)), {});\n    } else if (options.compatibilityJSON === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertJSONOptions(options)), {});\n    } else {\n      this.options = _extends({}, (0, _defaults2.get)(), this.options, (0, _defaults2.transformOptions)(options));\n    }\n    if (!callback) callback = function callback() {};\n\n    function createClassOnDemand(ClassOrObject) {\n      if (!ClassOrObject) return;\n      if (typeof ClassOrObject === 'function') return new ClassOrObject();\n      return ClassOrObject;\n    }\n\n    // init services\n    if (!this.options.isClone) {\n      if (this.modules.logger) {\n        _logger2.default.init(createClassOnDemand(this.modules.logger), this.options);\n      } else {\n        _logger2.default.init(null, this.options);\n      }\n\n      var lu = new _LanguageUtils2.default(this.options);\n      this.store = new _ResourceStore2.default(this.options.resources, this.options);\n\n      var s = this.services;\n      s.logger = _logger2.default;\n      s.resourceStore = this.store;\n      s.resourceStore.on('added removed', function (lng, ns) {\n        s.cacheConnector.save();\n      });\n      s.languageUtils = lu;\n      s.pluralResolver = new _PluralResolver2.default(lu, { prepend: this.options.pluralSeparator, compatibilityJSON: this.options.compatibilityJSON });\n      s.interpolator = new _Interpolator2.default(this.options);\n\n      s.backendConnector = new _BackendConnector2.default(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.backendConnector.on('*', function (event) {\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      s.backendConnector.on('loaded', function (loaded) {\n        s.cacheConnector.save();\n      });\n\n      s.cacheConnector = new _CacheConnector2.default(createClassOnDemand(this.modules.cache), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.cacheConnector.on('*', function (event) {\n        for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n          args[_key2 - 1] = arguments[_key2];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      if (this.modules.languageDetector) {\n        s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n        s.languageDetector.init(s, this.options.detection, this.options);\n      }\n\n      this.translator = new _Translator2.default(this.services, this.options);\n      // pipe events from translator\n      this.translator.on('*', function (event) {\n        for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n          args[_key3 - 1] = arguments[_key3];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n    }\n\n    // append api\n    var storeApi = ['getResource', 'addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle', 'hasResourceBundle', 'getResourceBundle'];\n    storeApi.forEach(function (fcName) {\n      _this2[fcName] = function () {\n        return this.store[fcName].apply(this.store, arguments);\n      };\n    });\n\n    // TODO: COMPATIBILITY remove this\n    if (this.options.compatibilityAPI === 'v1') compat.appendBackwardsAPI(this);\n\n    setTimeout(function () {\n      _this2.changeLanguage(_this2.options.lng, function (err, t) {\n        _this2.emit('initialized', _this2.options);\n        _this2.logger.log('initialized', _this2.options);\n\n        callback(err, t);\n      });\n    }, 10);\n\n    return this;\n  };\n\n  I18n.prototype.loadResources = function loadResources(callback) {\n    var _this3 = this;\n\n    if (!callback) callback = function callback() {};\n\n    if (!this.options.resources) {\n      var _ret = function () {\n        if (_this3.language && _this3.language.toLowerCase() === 'cimode') return {\n            v: callback()\n          }; // avoid loading resources for cimode\n\n        var toLoad = [];\n\n        var append = function append(lng) {\n          var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n          lngs.forEach(function (l) {\n            if (toLoad.indexOf(l) < 0) toLoad.push(l);\n          });\n        };\n\n        append(_this3.language);\n\n        if (_this3.options.preload) {\n          _this3.options.preload.forEach(function (l) {\n            append(l);\n          });\n        }\n\n        _this3.services.cacheConnector.load(toLoad, _this3.options.ns, function () {\n          _this3.services.backendConnector.load(toLoad, _this3.options.ns, callback);\n        });\n      }();\n\n      if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n    } else {\n      callback(null);\n    }\n  };\n\n  I18n.prototype.use = function use(module) {\n    if (module.type === 'backend') {\n      this.modules.backend = module;\n    }\n\n    if (module.type === 'cache') {\n      this.modules.cache = module;\n    }\n\n    if (module.type === 'logger' || module.log && module.warn && module.warn) {\n      this.modules.logger = module;\n    }\n\n    if (module.type === 'languageDetector') {\n      this.modules.languageDetector = module;\n    }\n\n    if (module.type === 'postProcessor') {\n      _postProcessor2.default.addPostProcessor(module);\n    }\n\n    return this;\n  };\n\n  I18n.prototype.changeLanguage = function changeLanguage(lng, callback) {\n    var _this4 = this;\n\n    var done = function done(err) {\n      if (lng) {\n        _this4.emit('languageChanged', lng);\n        _this4.logger.log('languageChanged', lng);\n      }\n\n      if (callback) callback(err, function () {\n        for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n          args[_key4] = arguments[_key4];\n        }\n\n        return _this4.t.apply(_this4, args);\n      });\n    };\n\n    if (!lng && this.services.languageDetector) lng = this.services.languageDetector.detect();\n\n    if (lng) {\n      this.language = lng;\n      this.languages = this.services.languageUtils.toResolveHierarchy(lng);\n\n      this.translator.changeLanguage(lng);\n\n      if (this.services.languageDetector) this.services.languageDetector.cacheUserLanguage(lng);\n    }\n\n    this.loadResources(function (err) {\n      done(err);\n    });\n  };\n\n  I18n.prototype.getFixedT = function getFixedT(lng, ns) {\n    var _this5 = this;\n\n    var fixedT = function fixedT(key, options) {\n      options = options || {};\n      options.lng = options.lng || fixedT.lng;\n      options.ns = options.ns || fixedT.ns;\n      return _this5.t(key, options);\n    };\n    fixedT.lng = lng;\n    fixedT.ns = ns;\n    return fixedT;\n  };\n\n  I18n.prototype.t = function t() {\n    return this.translator && this.translator.translate.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.exists = function exists() {\n    return this.translator && this.translator.exists.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.setDefaultNamespace = function setDefaultNamespace(ns) {\n    this.options.defaultNS = ns;\n  };\n\n  I18n.prototype.loadNamespaces = function loadNamespaces(ns, callback) {\n    var _this6 = this;\n\n    if (!this.options.ns) return callback && callback();\n    if (typeof ns === 'string') ns = [ns];\n\n    ns.forEach(function (n) {\n      if (_this6.options.ns.indexOf(n) < 0) _this6.options.ns.push(n);\n    });\n\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.loadLanguages = function loadLanguages(lngs, callback) {\n    if (typeof lngs === 'string') lngs = [lngs];\n    var preloaded = this.options.preload || [];\n\n    var newLngs = lngs.filter(function (lng) {\n      return preloaded.indexOf(lng) < 0;\n    });\n    // Exit early if all given languages are already preloaded\n    if (!newLngs.length) return callback();\n\n    this.options.preload = preloaded.concat(newLngs);\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.dir = function dir(lng) {\n    if (!lng) lng = this.language;\n\n    var ltrLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam'];\n\n    return ltrLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) ? 'ltr' : 'rtl';\n  };\n\n  I18n.prototype.createInstance = function createInstance() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    return new I18n(options, callback);\n  };\n\n  I18n.prototype.cloneInstance = function cloneInstance() {\n    var _this7 = this;\n\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    var clone = new I18n(_extends({}, options, this.options, { isClone: true }), callback);\n    var membersToCopy = ['store', 'translator', 'services', 'language'];\n    membersToCopy.forEach(function (m) {\n      clone[m] = _this7[m];\n    });\n\n    return clone;\n  };\n\n  return I18n;\n}(_EventEmitter3.default);\n\nexports.default = new I18n();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/i18next.js\n// module id = 729\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar ResourceStore = function (_EventEmitter) {\n  _inherits(ResourceStore, _EventEmitter);\n\n  function ResourceStore() {\n    var data = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { ns: ['translation'], defaultNS: 'translation' } : arguments[1];\n\n    _classCallCheck(this, ResourceStore);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.data = data;\n    _this.options = options;\n    return _this;\n  }\n\n  ResourceStore.prototype.addNamespaces = function addNamespaces(ns) {\n    if (this.options.ns.indexOf(ns) < 0) {\n      this.options.ns.push(ns);\n    }\n  };\n\n  ResourceStore.prototype.removeNamespaces = function removeNamespaces(ns) {\n    var index = this.options.ns.indexOf(ns);\n    if (index > -1) {\n      this.options.ns.splice(index, 1);\n    }\n  };\n\n  ResourceStore.prototype.getResource = function getResource(lng, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    var keySeparator = options.keySeparator || this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key && typeof key !== 'string') path = path.concat(key);\n    if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n    }\n\n    return utils.getPath(this.data, path);\n  };\n\n  ResourceStore.prototype.addResource = function addResource(lng, ns, key, value) {\n    var options = arguments.length <= 4 || arguments[4] === undefined ? { silent: false } : arguments[4];\n\n    var keySeparator = this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      value = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    utils.setPath(this.data, path, value);\n\n    if (!options.silent) this.emit('added', lng, ns, key, value);\n  };\n\n  ResourceStore.prototype.addResources = function addResources(lng, ns, resources) {\n    for (var m in resources) {\n      if (typeof resources[m] === 'string') this.addResource(lng, ns, m, resources[m], { silent: true });\n    }\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.addResourceBundle = function addResourceBundle(lng, ns, resources, deep, overwrite) {\n    var path = [lng, ns];\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      deep = resources;\n      resources = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    var pack = utils.getPath(this.data, path) || {};\n\n    if (deep) {\n      utils.deepExtend(pack, resources, overwrite);\n    } else {\n      pack = _extends({}, pack, resources);\n    }\n\n    utils.setPath(this.data, path, pack);\n\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.removeResourceBundle = function removeResourceBundle(lng, ns) {\n    if (this.hasResourceBundle(lng, ns)) {\n      delete this.data[lng][ns];\n    }\n    this.removeNamespaces(ns);\n\n    this.emit('removed', lng, ns);\n  };\n\n  ResourceStore.prototype.hasResourceBundle = function hasResourceBundle(lng, ns) {\n    return this.getResource(lng, ns) !== undefined;\n  };\n\n  ResourceStore.prototype.getResourceBundle = function getResourceBundle(lng, ns) {\n    if (!ns) ns = this.options.defaultNS;\n\n    // TODO: COMPATIBILITY remove extend in v2.1.0\n    if (this.options.compatibilityAPI === 'v1') return _extends({}, this.getResource(lng, ns));\n\n    return this.getResource(lng, ns);\n  };\n\n  ResourceStore.prototype.toJSON = function toJSON() {\n    return this.data;\n  };\n\n  return ResourceStore;\n}(_EventEmitter3.default);\n\nexports.default = ResourceStore;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/ResourceStore.js\n// module id = 730\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _postProcessor = require('./postProcessor');\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = require('./compatibility/v1');\n\nvar compat = _interopRequireWildcard(_v);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Translator = function (_EventEmitter) {\n  _inherits(Translator, _EventEmitter);\n\n  function Translator(services) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Translator);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    utils.copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector'], services, _this);\n\n    _this.options = options;\n    _this.logger = _logger2.default.create('translator');\n    return _this;\n  }\n\n  Translator.prototype.changeLanguage = function changeLanguage(lng) {\n    if (lng) this.language = lng;\n  };\n\n  Translator.prototype.exists = function exists(key) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { interpolation: {} } : arguments[1];\n\n    if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    return this.resolve(key, options) !== undefined;\n  };\n\n  Translator.prototype.extractFromKey = function extractFromKey(key, options) {\n    var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n    if (nsSeparator === undefined) nsSeparator = ':';\n\n    var namespaces = options.ns || this.options.defaultNS;\n    if (nsSeparator && key.indexOf(nsSeparator) > -1) {\n      var parts = key.split(nsSeparator);\n      namespaces = parts[0];\n      key = parts[1];\n    }\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    return {\n      key: key,\n      namespaces: namespaces\n    };\n  };\n\n  Translator.prototype.translate = function translate(keys) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {\n      options = this.options.overloadTranslationOptionHandler(arguments);\n    } else if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    // non valid keys handling\n    if (keys === undefined || keys === null || keys === '') return '';\n    if (typeof keys === 'number') keys = String(keys);\n    if (typeof keys === 'string') keys = [keys];\n\n    // return key on CIMode\n    var lng = options.lng || this.language;\n    if (lng && lng.toLowerCase() === 'cimode') return keys[keys.length - 1];\n\n    // separators\n    var keySeparator = options.keySeparator || this.options.keySeparator || '.';\n\n    // get namespace(s)\n\n    var _extractFromKey = this.extractFromKey(keys[keys.length - 1], options);\n\n    var key = _extractFromKey.key;\n    var namespaces = _extractFromKey.namespaces;\n\n    var namespace = namespaces[namespaces.length - 1];\n\n    // resolve from store\n    var res = this.resolve(keys, options);\n\n    var resType = Object.prototype.toString.apply(res);\n    var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n    var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n\n    // object\n    if (res && typeof res !== 'string' && noObject.indexOf(resType) < 0 && !(joinArrays && resType === '[object Array]')) {\n      if (!options.returnObjects && !this.options.returnObjects) {\n        this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n        return this.options.returnedObjectHandler ? this.options.returnedObjectHandler(key, res, options) : 'key \\'' + key + ' (' + this.language + ')\\' returned an object instead of string.';\n      }\n\n      var copy = resType === '[object Array]' ? [] : {}; // apply child translation on a copy\n\n      for (var m in res) {\n        copy[m] = this.translate('' + key + keySeparator + m, _extends({ joinArrays: false, ns: namespaces }, options));\n      }\n      res = copy;\n    }\n    // array special treatment\n    else if (joinArrays && resType === '[object Array]') {\n        res = res.join(joinArrays);\n        if (res) res = this.extendTranslation(res, key, options);\n      }\n      // string, empty or null\n      else {\n          var usedDefault = false,\n              usedKey = false;\n\n          // fallback value\n          if (!this.isValidLookup(res) && options.defaultValue) {\n            usedDefault = true;\n            res = options.defaultValue;\n          }\n          if (!this.isValidLookup(res)) {\n            usedKey = true;\n            res = key;\n          }\n\n          // save missing\n          if (usedKey || usedDefault) {\n            this.logger.log('missingKey', lng, namespace, key, res);\n\n            if (this.options.saveMissing) {\n              var lngs = [];\n              if (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng && this.options.fallbackLng[0]) {\n                for (var i = 0; i < this.options.fallbackLng.length; i++) {\n                  lngs.push(this.options.fallbackLng[i]);\n                }\n              } else if (this.options.saveMissingTo === 'all') {\n                lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n              } else {\n                //(this.options.saveMissingTo === 'current' || (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng[0] === false) ) {\n                lngs.push(options.lng || this.language);\n              }\n\n              if (this.options.missingKeyHandler) {\n                this.options.missingKeyHandler(lngs, namespace, key, res);\n              } else if (this.backendConnector && this.backendConnector.saveMissing) {\n                this.backendConnector.saveMissing(lngs, namespace, key, res);\n              }\n\n              this.emit('missingKey', lngs, namespace, key, res);\n            }\n          }\n\n          // extend\n          res = this.extendTranslation(res, key, options);\n\n          // append namespace if still key\n          if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = namespace + ':' + key;\n\n          // parseMissingKeyHandler\n          if (usedKey && this.options.parseMissingKeyHandler) res = this.options.parseMissingKeyHandler(res);\n        }\n\n    // return\n    return res;\n  };\n\n  Translator.prototype.extendTranslation = function extendTranslation(res, key, options) {\n    var _this2 = this;\n\n    if (options.interpolation) this.interpolator.init(options);\n\n    // interpolate\n    var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n    if (this.options.interpolation.defaultVariables) data = _extends({}, this.options.interpolation.defaultVariables, data);\n    res = this.interpolator.interpolate(res, data);\n\n    // nesting\n    res = this.interpolator.nest(res, function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this2.translate.apply(_this2, args);\n    }, options);\n\n    if (options.interpolation) this.interpolator.reset();\n\n    // post process\n    var postProcess = options.postProcess || this.options.postProcess;\n    var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n    if (res !== undefined && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n      res = _postProcessor2.default.handle(postProcessorNames, res, key, options, this);\n    }\n\n    return res;\n  };\n\n  Translator.prototype.resolve = function resolve(keys) {\n    var _this3 = this;\n\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var found = void 0;\n\n    if (typeof keys === 'string') keys = [keys];\n\n    // forEach possible key\n    keys.forEach(function (k) {\n      if (_this3.isValidLookup(found)) return;\n\n      var _extractFromKey2 = _this3.extractFromKey(k, options);\n\n      var key = _extractFromKey2.key;\n      var namespaces = _extractFromKey2.namespaces;\n\n      if (_this3.options.fallbackNS) namespaces = namespaces.concat(_this3.options.fallbackNS);\n\n      var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n      var needsContextHandling = options.context !== undefined && typeof options.context === 'string' && options.context !== '';\n\n      var codes = options.lngs ? options.lngs : _this3.languageUtils.toResolveHierarchy(options.lng || _this3.language);\n\n      namespaces.forEach(function (ns) {\n        if (_this3.isValidLookup(found)) return;\n\n        codes.forEach(function (code) {\n          if (_this3.isValidLookup(found)) return;\n\n          var finalKey = key;\n          var finalKeys = [finalKey];\n\n          var pluralSuffix = void 0;\n          if (needsPluralHandling) pluralSuffix = _this3.pluralResolver.getSuffix(code, options.count);\n\n          // fallback for plural if context not found\n          if (needsPluralHandling && needsContextHandling) finalKeys.push(finalKey + pluralSuffix);\n\n          // get key for context if needed\n          if (needsContextHandling) finalKeys.push(finalKey += '' + _this3.options.contextSeparator + options.context);\n\n          // get key for plural if needed\n          if (needsPluralHandling) finalKeys.push(finalKey += pluralSuffix);\n\n          // iterate over finalKeys starting with most specific pluralkey (-> contextkey only) -> singularkey only\n          var possibleKey = void 0;\n          while (possibleKey = finalKeys.pop()) {\n            if (_this3.isValidLookup(found)) continue;\n            found = _this3.getResource(code, ns, possibleKey, options);\n          }\n        });\n      });\n    });\n\n    return found;\n  };\n\n  Translator.prototype.isValidLookup = function isValidLookup(res) {\n    return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n  };\n\n  Translator.prototype.getResource = function getResource(code, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    return this.resourceStore.getResource(code, ns, key, options);\n  };\n\n  return Translator;\n}(_EventEmitter3.default);\n\nexports.default = Translator;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/Translator.js\n// module id = 731\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction capitalize(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n  function LanguageUtil(options) {\n    _classCallCheck(this, LanguageUtil);\n\n    this.options = options;\n\n    this.whitelist = this.options.whitelist || false;\n    this.logger = _logger2.default.create('languageUtils');\n  }\n\n  LanguageUtil.prototype.getLanguagePartFromCode = function getLanguagePartFromCode(code) {\n    if (code.indexOf('-') < 0) return code;\n\n    var specialCases = ['NB-NO', 'NN-NO', 'nb-NO', 'nn-NO', 'nb-no', 'nn-no'];\n    var p = code.split('-');\n    return this.formatLanguageCode(specialCases.indexOf(code) > -1 ? p[1].toLowerCase() : p[0]);\n  };\n\n  LanguageUtil.prototype.formatLanguageCode = function formatLanguageCode(code) {\n    // http://www.iana.org/assignments/language-tags/language-tags.xhtml\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n      var p = code.split('-');\n\n      if (this.options.lowerCaseLng) {\n        p = p.map(function (part) {\n          return part.toLowerCase();\n        });\n      } else if (p.length === 2) {\n        p[0] = p[0].toLowerCase();\n        p[1] = p[1].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n      } else if (p.length === 3) {\n        p[0] = p[0].toLowerCase();\n\n        // if lenght 2 guess it's a country\n        if (p[1].length === 2) p[1] = p[1].toUpperCase();\n        if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n        if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n      }\n\n      return p.join('-');\n    } else {\n      return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n    }\n  };\n\n  LanguageUtil.prototype.isWhitelisted = function isWhitelisted(code) {\n    if (this.options.load === 'languageOnly') code = this.getLanguagePartFromCode(code);\n    return !this.whitelist || !this.whitelist.length || this.whitelist.indexOf(code) > -1 ? true : false;\n  };\n\n  LanguageUtil.prototype.toResolveHierarchy = function toResolveHierarchy(code, fallbackCode) {\n    var _this = this;\n\n    fallbackCode = fallbackCode || this.options.fallbackLng || [];\n    if (typeof fallbackCode === 'string') fallbackCode = [fallbackCode];\n\n    var codes = [];\n    var addCode = function addCode(code) {\n      if (_this.isWhitelisted(code)) {\n        codes.push(code);\n      } else {\n        _this.logger.warn('rejecting non-whitelisted language code: ' + code);\n      }\n    };\n\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n      if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n    } else if (typeof code === 'string') {\n      addCode(this.formatLanguageCode(code));\n    }\n\n    fallbackCode.forEach(function (fc) {\n      if (codes.indexOf(fc) < 0) addCode(_this.formatLanguageCode(fc));\n    });\n\n    return codes;\n  };\n\n  return LanguageUtil;\n}();\n\n;\n\nexports.default = LanguageUtil;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/LanguageUtils.js\n// module id = 732\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// definition http://translate.sourceforge.net/wiki/l10n/pluralforms\n/* eslint-disable */\nvar sets = [{ lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'tg', 'ti', 'tr', 'uz', 'wa'], nr: [1, 2], fc: 1 }, { lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'es_ar', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'he', 'hi', 'hu', 'hy', 'ia', 'it', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt', 'pt_br', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], nr: [1, 2], fc: 2 }, { lngs: ['ay', 'bo', 'cgg', 'fa', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], nr: [1], fc: 3 }, { lngs: ['be', 'bs', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 }, { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 }, { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 }, { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 }, { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 }, { lngs: ['fr'], nr: [1, 2], fc: 9 }, { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 }, { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 }, { lngs: ['is'], nr: [1, 2], fc: 12 }, { lngs: ['jv'], nr: [0, 1], fc: 13 }, { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 }, { lngs: ['lt'], nr: [1, 2, 10], fc: 15 }, { lngs: ['lv'], nr: [1, 2, 0], fc: 16 }, { lngs: ['mk'], nr: [1, 2], fc: 17 }, { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 }, { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 }, { lngs: ['or'], nr: [2, 1], fc: 2 }, { lngs: ['ro'], nr: [1, 2, 20], fc: 20 }, { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 }];\n\nvar _rulesPluralsTypes = {\n  1: function _(n) {\n    return Number(n > 1);\n  },\n  2: function _(n) {\n    return Number(n != 1);\n  },\n  3: function _(n) {\n    return 0;\n  },\n  4: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  5: function _(n) {\n    return Number(n === 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n  },\n  6: function _(n) {\n    return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n  },\n  7: function _(n) {\n    return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  8: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n  },\n  9: function _(n) {\n    return Number(n >= 2);\n  },\n  10: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n  },\n  11: function _(n) {\n    return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n  },\n  12: function _(n) {\n    return Number(n % 10 != 1 || n % 100 == 11);\n  },\n  13: function _(n) {\n    return Number(n !== 0);\n  },\n  14: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n  },\n  15: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  16: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n  },\n  17: function _(n) {\n    return Number(n == 1 || n % 10 == 1 ? 0 : 1);\n  },\n  18: function _(n) {\n    return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n  },\n  19: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n  },\n  20: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n  },\n  21: function _(n) {\n    return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n  }\n};\n/* eslint-enable */\n\nfunction createRules() {\n  var l,\n      rules = {};\n  sets.forEach(function (set) {\n    set.lngs.forEach(function (l) {\n      return rules[l] = {\n        numbers: set.nr,\n        plurals: _rulesPluralsTypes[set.fc]\n      };\n    });\n  });\n  return rules;\n}\n\nvar PluralResolver = function () {\n  function PluralResolver(languageUtils) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, PluralResolver);\n\n    this.languageUtils = languageUtils;\n    this.options = options;\n\n    this.logger = _logger2.default.create('pluralResolver');\n\n    this.rules = createRules();\n  }\n\n  PluralResolver.prototype.addRule = function addRule(lng, obj) {\n    this.rules[lng] = obj;\n  };\n\n  PluralResolver.prototype.getRule = function getRule(code) {\n    return this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n  };\n\n  PluralResolver.prototype.needsPlural = function needsPlural(code) {\n    var rule = this.getRule(code);\n\n    return rule && rule.numbers.length <= 1 ? false : true;\n  };\n\n  PluralResolver.prototype.getSuffix = function getSuffix(code, count) {\n    var rule = this.getRule(code);\n\n    if (rule) {\n      if (rule.numbers.length === 1) return ''; // only singular\n\n      var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n      var suffix = rule.numbers[idx];\n\n      // special treatment for lngs only having singular and plural\n      if (rule.numbers.length === 2 && rule.numbers[0] === 1) {\n        if (suffix === 2) {\n          suffix = 'plural';\n        } else if (suffix === 1) {\n          suffix = '';\n        }\n      }\n\n      // COMPATIBILITY JSON\n      if (this.options.compatibilityJSON === 'v1') {\n        if (suffix === 1) return '';\n        if (typeof suffix === 'number') return '_plural_' + suffix.toString();\n      }\n\n      return this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString();\n    } else {\n      this.logger.warn('no plural rule found for: ' + code);\n      return '';\n    }\n  };\n\n  return PluralResolver;\n}();\n\n;\n\nexports.default = PluralResolver;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/PluralResolver.js\n// module id = 733\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Interpolator = function () {\n  function Interpolator() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    _classCallCheck(this, Interpolator);\n\n    this.logger = _logger2.default.create('interpolator');\n\n    this.init(options, true);\n  }\n\n  Interpolator.prototype.init = function init() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var reset = arguments[1];\n\n    if (reset) this.options = options;\n    if (!options.interpolation) options.interpolation = { escapeValue: true };\n\n    var iOpts = options.interpolation;\n\n    this.escapeValue = iOpts.escapeValue;\n\n    this.prefix = iOpts.prefix ? utils.regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n    this.suffix = iOpts.suffix ? utils.regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n\n    this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n    this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n\n    this.nestingPrefix = iOpts.nestingPrefix ? utils.regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || utils.regexEscape('$t(');\n    this.nestingSuffix = iOpts.nestingSuffix ? utils.regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || utils.regexEscape(')');\n\n    // the regexp\n    var regexpStr = this.prefix + '(.+?)' + this.suffix;\n    this.regexp = new RegExp(regexpStr, 'g');\n\n    var regexpUnescapeStr = this.prefix + this.unescapePrefix + '(.+?)' + this.unescapeSuffix + this.suffix;\n    this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n\n    var nestingRegexpStr = this.nestingPrefix + '(.+?)' + this.nestingSuffix;\n    this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n  };\n\n  Interpolator.prototype.reset = function reset() {\n    if (this.options) this.init(this.options);\n  };\n\n  Interpolator.prototype.interpolate = function interpolate(str, data) {\n    var match = void 0,\n        value = void 0;\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    // unescape if has unescapePrefix/Suffix\n    while (match = this.regexpUnescape.exec(str)) {\n      var _value = utils.getPath(data, match[1].trim());\n      str = str.replace(match[0], _value);\n    }\n\n    // regular escape on demand\n    while (match = this.regexp.exec(str)) {\n      value = utils.getPath(data, match[1].trim());\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  Interpolator.prototype.nest = function nest(str, fc) {\n    var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n    var match = void 0,\n        value = void 0;\n\n    var clonedOptions = JSON.parse(JSON.stringify(options));\n    clonedOptions.applyPostProcessor = false; // avoid post processing on nested lookup\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    // if value is something like \"myKey\": \"lorem $(anotherKey, { \"count\": {{aValueInOptions}} })\"\n    function handleHasOptions(key) {\n      if (key.indexOf(',') < 0) return key;\n\n      var p = key.split(',');\n      key = p.shift();\n      var optionsString = p.join(',');\n      optionsString = this.interpolate(optionsString, clonedOptions);\n\n      try {\n        clonedOptions = JSON.parse(optionsString);\n      } catch (e) {\n        this.logger.error('failed parsing options string in nesting for key ' + key, e);\n      }\n\n      return key;\n    }\n\n    // regular escape on demand\n    while (match = this.nestingRegexp.exec(str)) {\n      value = fc(handleHasOptions.call(this, match[1].trim()), clonedOptions);\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  return Interpolator;\n}();\n\nexports.default = Interpolator;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/Interpolator.js\n// module id = 734\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nfunction remove(arr, what) {\n  var found = arr.indexOf(what);\n\n  while (found !== -1) {\n    arr.splice(found, 1);\n    found = arr.indexOf(what);\n  }\n}\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(backend, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.backend = backend;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('backendConnector');\n\n    _this.state = {};\n    _this.queue = [];\n\n    _this.backend && _this.backend.init && _this.backend.init(services, options.backend, options);\n    return _this;\n  }\n\n  Connector.prototype.queueLoad = function queueLoad(languages, namespaces, callback) {\n    var _this2 = this;\n\n    // find what needs to be loaded\n    var toLoad = [],\n        pending = [],\n        toLoadLanguages = [],\n        toLoadNamespaces = [];\n\n    languages.forEach(function (lng) {\n      var hasAllNamespaces = true;\n\n      namespaces.forEach(function (ns) {\n        var name = lng + '|' + ns;\n\n        if (_this2.store.hasResourceBundle(lng, ns)) {\n          _this2.state[name] = 2; // loaded\n        } else if (_this2.state[name] < 0) {\n            // nothing to do for err\n          } else if (_this2.state[name] === 1) {\n              if (pending.indexOf(name) < 0) pending.push(name);\n            } else {\n              _this2.state[name] = 1; // pending\n\n              hasAllNamespaces = false;\n\n              if (pending.indexOf(name) < 0) pending.push(name);\n              if (toLoad.indexOf(name) < 0) toLoad.push(name);\n              if (toLoadNamespaces.indexOf(ns) < 0) toLoadNamespaces.push(ns);\n            }\n      });\n\n      if (!hasAllNamespaces) toLoadLanguages.push(lng);\n    });\n\n    if (toLoad.length || pending.length) {\n      this.queue.push({\n        pending: pending,\n        loaded: {},\n        errors: [],\n        callback: callback\n      });\n    }\n\n    return {\n      toLoad: toLoad,\n      pending: pending,\n      toLoadLanguages: toLoadLanguages,\n      toLoadNamespaces: toLoadNamespaces\n    };\n  };\n\n  Connector.prototype.loaded = function loaded(name, err, data) {\n    var _this3 = this;\n\n    var _name$split = name.split('|');\n\n    var _name$split2 = _slicedToArray(_name$split, 2);\n\n    var lng = _name$split2[0];\n    var ns = _name$split2[1];\n\n\n    if (err) this.emit('failedLoading', lng, ns, err);\n\n    if (data) {\n      this.store.addResourceBundle(lng, ns, data);\n    }\n\n    // set loaded\n    this.state[name] = err ? -1 : 2;\n    // callback if ready\n    this.queue.forEach(function (q) {\n      utils.pushPath(q.loaded, [lng], ns);\n      remove(q.pending, name);\n\n      if (err) q.errors.push(err);\n\n      if (q.pending.length === 0 && !q.done) {\n        q.errors.length ? q.callback(q.errors) : q.callback();\n        _this3.emit('loaded', q.loaded);\n        q.done = true;\n      }\n    });\n\n    // remove done load requests\n    this.queue = this.queue.filter(function (q) {\n      return !q.done;\n    });\n  };\n\n  Connector.prototype.read = function read(lng, ns, fcName, tried, wait, callback) {\n    var _this4 = this;\n\n    if (!tried) tried = 0;\n    if (!wait) wait = 250;\n\n    if (!lng.length) return callback(null, {}); // noting to load\n\n    this.backend[fcName](lng, ns, function (err, data) {\n      if (err && data /* = retryFlag */ && tried < 5) {\n        setTimeout(function () {\n          _this4.read.call(_this4, lng, ns, fcName, ++tried, wait * 2, callback);\n        }, wait);\n        return;\n      }\n      callback(err, data);\n    });\n  };\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this5 = this;\n\n    if (!this.backend) {\n      this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n      return callback && callback();\n    }\n    var options = _extends({}, this.backend.options, this.options.backend);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    var toLoad = this.queueLoad(languages, namespaces, callback);\n    if (!toLoad.toLoad.length) {\n      if (!toLoad.pending.length) callback(); // nothing to load and no pendings...callback now\n      return; // pendings will trigger callback\n    }\n\n    // load with multi-load\n    if (options.allowMultiLoading && this.backend.readMulti) {\n      this.read(toLoad.toLoadLanguages, toLoad.toLoadNamespaces, 'readMulti', null, null, function (err, data) {\n        if (err) _this5.logger.warn('loading namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading failed', err);\n        if (!err && data) _this5.logger.log('loaded namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading', data);\n\n        toLoad.toLoad.forEach(function (name) {\n          var _name$split3 = name.split('|');\n\n          var _name$split4 = _slicedToArray(_name$split3, 2);\n\n          var l = _name$split4[0];\n          var n = _name$split4[1];\n\n\n          var bundle = utils.getPath(data, [l, n]);\n          if (bundle) {\n            _this5.loaded(name, err, bundle);\n          } else {\n            var _err = 'loading namespace ' + n + ' for language ' + l + ' via multiloading failed';\n            _this5.loaded(name, _err);\n            _this5.logger.error(_err);\n          }\n        });\n      });\n    }\n\n    // load one by one\n    else {\n        (function () {\n          var read = function read(name) {\n            var _this6 = this;\n\n            var _name$split5 = name.split('|');\n\n            var _name$split6 = _slicedToArray(_name$split5, 2);\n\n            var lng = _name$split6[0];\n            var ns = _name$split6[1];\n\n\n            this.read(lng, ns, 'read', null, null, function (err, data) {\n              if (err) _this6.logger.warn('loading namespace ' + ns + ' for language ' + lng + ' failed', err);\n              if (!err && data) _this6.logger.log('loaded namespace ' + ns + ' for language ' + lng, data);\n\n              _this6.loaded(name, err, data);\n            });\n          };\n\n          ;\n\n          toLoad.toLoad.forEach(function (name) {\n            read.call(_this5, name);\n          });\n        })();\n      }\n  };\n\n  Connector.prototype.saveMissing = function saveMissing(languages, namespace, key, fallbackValue) {\n    if (this.backend && this.backend.create) this.backend.create(languages, namespace, key, fallbackValue);\n\n    // write to store to avoid resending\n    this.store.addResource(languages[0], namespace, key, fallbackValue);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/BackendConnector.js\n// module id = 735\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(cache, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.cache = cache;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('cacheConnector');\n\n    _this.cache && _this.cache.init && _this.cache.init(services, options.cache, options);\n    return _this;\n  }\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this2 = this;\n\n    if (!this.cache) return callback && callback();\n    var options = _extends({}, this.cache.options, this.options.cache);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    if (options.enabled) {\n      this.cache.load(languages, function (err, data) {\n        if (err) _this2.logger.error('loading languages ' + languages.join(', ') + ' from cache failed', err);\n        if (data) {\n          for (var l in data) {\n            for (var n in data[l]) {\n              if (n === 'i18nStamp') continue;\n              var bundle = data[l][n];\n              if (bundle) _this2.store.addResourceBundle(l, n, bundle);\n            }\n          }\n        }\n        if (callback) callback();\n      });\n    } else {\n      if (callback) callback();\n    }\n  };\n\n  Connector.prototype.save = function save() {\n    if (this.cache && this.options.cache && this.options.cache.enabled) this.cache.save(this.store.data);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/CacheConnector.js\n// module id = 736\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.get = get;\nexports.transformOptions = transformOptions;\nfunction get() {\n  return {\n    debug: false,\n\n    ns: ['translation'],\n    defaultNS: ['translation'],\n    fallbackLng: ['dev'],\n    fallbackNS: false, // string or array of namespaces\n\n    whitelist: false, // array with whitelisted languages\n    load: 'all', // | currentOnly | languageOnly\n    preload: false, // array with preload languages\n\n    keySeparator: '.',\n    nsSeparator: ':',\n    pluralSeparator: '_',\n    contextSeparator: '_',\n\n    saveMissing: false, // enable to send missing values\n    saveMissingTo: 'fallback', // 'current' || 'all'\n    missingKeyHandler: false, // function(lng, ns, key, fallbackValue) -> override if prefer on handling\n\n    postProcess: false, // string or array of postProcessor names\n    returnNull: true, // allows null value as valid translation\n    returnEmptyString: true, // allows empty string value as valid translation\n    returnObjects: false,\n    joinArrays: false, // or string to join array\n    returnedObjectHandler: function returnedObjectHandler() {}, // function(key, value, options) triggered if key returns object but returnObjects is set to false\n    parseMissingKeyHandler: false, // function(key) parsed a key that was not found in t() before returning\n    appendNamespaceToMissingKey: false,\n    overloadTranslationOptionHandler: function overloadTranslationOptionHandler(args) {\n      return { defaultValue: args[1] };\n    },\n\n    interpolation: {\n      escapeValue: true,\n      prefix: '{{',\n      suffix: '}}',\n      // prefixEscaped: '{{',\n      // suffixEscaped: '}}',\n      // unescapeSuffix: '',\n      unescapePrefix: '-',\n\n      nestingPrefix: '$t(',\n      nestingSuffix: ')',\n      // nestingPrefixEscaped: '$t(',\n      // nestingSuffixEscaped: ')',\n      defaultVariables: undefined // object that can have values to interpolate on - extends passed in interpolation data\n    }\n  };\n}\n\nfunction transformOptions(options) {\n  // create namespace object if namespace is passed in as string\n  if (typeof options.ns === 'string') options.ns = [options.ns];\n  if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n  if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n  // extend whitelist with cimode\n  if (options.whitelist && options.whitelist.indexOf('cimode') < 0) options.whitelist.push('cimode');\n\n  return options;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/i18next/dist/commonjs/defaults.js\n// module id = 737\n// module chunks = 0 1","module.exports = {\"components\":{\"FilterPanel\":{\"searchPlaceholder\":\"Filtrar\"}},\"strings\":{\"placeholders\":{\"search_in_table\":\"Buscar en la tabla\"},\"accountTypeBreakdowns\":{\"revenues\":\"Tipo de ingresos\",\"expenses\":\"Tipo de gasto\",\"assets\":\"Tipo de activo\",\"liabilities\":\"La responsabilidad y la equidad Tipo\",\"revAndExp\":\"Los ingresos y gastos Tipo\",\"assetAndLiability\":\"Activos, Responsabilidad & Equidad\",\"fteCount\":\"FTE Tipo Conde\"},\"accountTypeCategories\":{\"revenues\":\"Ingresos\",\"expenses\":\"Gastos\",\"assets\":\"Activos\",\"liabilities\":\"Responsabilidad & Equidad\",\"revAndExp\":\"Ingresos & Gastos\",\"assetAndLiability\":\"Activos, Responsabilidad & Equidad\"},\"tableTotalFooters\":{\"variance\":\"Varianza\",\"revLessExp\":\"Los ingresos menos gastos\",\"total\":\"Total\",\"balanceSheet\":\"Calculated Change in Fund Balance / Net Assets\"},\"versusViews\":{\"balanceSheet\":\"Hoja de balance\",\"revenuesVersusExpenses\":\"Los ingresos frente a los gastos\"},\"graph\":{\"types\":{\"table\":\"Ver Tabla\",\"line\":\"Gráfico de líneas\",\"stacked\":\"Gráfico apilado\",\"horizontal_stacked\":\"Gráfico apilado Horizonal\",\"percentage\":\"Gráfico porcentaje\",\"pie\":\"Gráfico de torta\",\"bar\":\"Gráfico de barras\",\"treemap\":\"Treemap\",\"map\":\"Mapa\"}},\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"]}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./locales/es/report.json\n// module id = 738\n// module chunks = 0 1","module.exports = {\"components\":{\"FilterPanel\":{\"searchPlaceholder\":\"Filter\"}},\"strings\":{\"placeholders\":{\"search_in_table\":\"Search in table\"},\"accountTypeBreakdowns\":{\"revenues\":\"Revenue Type\",\"expenses\":\"Expense Type\",\"assets\":\"Asset Type\",\"liabilities\":\"Liability & Equity Type\",\"revAndExp\":\"Revenue & Expense Type\",\"assetAndLiability\":\"Assets, Liabilities & Equities\",\"fteCount\":\"FTE Count Type\"},\"accountTypeCategories\":{\"revenues\":\"Revenues\",\"expenses\":\"Expenses\",\"assets\":\"Assets\",\"liabilities\":\"Liabilities & Equities\",\"revAndExp\":\"Revenues & Expenses\",\"assetAndLiability\":\"Assets, Liabilities & Equities\"},\"tableTotalFooters\":{\"variance\":\"Variance\",\"revLessExp\":\"Revenues Less Expenses\",\"total\":\"Total\",\"balanceSheet\":\"Calculated Change in Fund Balance / Net Assets\"},\"versusViews\":{\"balanceSheet\":\"Balance Sheet\",\"revenuesVersusExpenses\":\"Revenues vs Expenses\"},\"graph\":{\"types\":{\"table\":\"Table View\",\"line\":\"Line Graph\",\"stacked\":\"Stacked Graph\",\"horizontal_stacked\":\"Horizontal Stacked Chart\",\"percentage\":\"Percentage Graph\",\"pie\":\"Pie Graph\",\"bar\":\"Bar Graph\",\"treemap\":\"Treemap\",\"map\":\"Map\"}},\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./locales/en/report.json\n// module id = 739\n// module chunks = 0 1","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Router, {Route, DefaultRoute, Redirect} from 'react-router';\nimport _ from 'lodash';\n\nimport EntityActions from '@opengov/controlpanel/lib/actions/entity_actions';\n\nimport ReportApp from './report_app';\nimport ReportIndex from './report_index';\nimport ReportView from './report_view';\nimport StoryView from './story_view';\n\nimport Entity from './models/entity';\nimport Reports from './models/reports';\n\nimport { I18nextProvider } from 'react-i18next'; // as we build ourself via webpack\nimport i18n from './i18n';\n\nimport { getSortedReports } from './utils/report_utils';\n\nexport const internalRoutes = (\n  <Route path=\"/:entity?\" handler={ReportApp} ignoreScrollBehavior>\n    <DefaultRoute name=\"report-index\" handler={ReportIndex} />\n\n    {/* Legacy report routes. */}\n    <Redirect path=\"reports\" to=\"report-index\" />\n    <Redirect path=\"reports/:report\" to=\"report\" />\n    <Redirect path=\"reports/:report/:reportParams?\" to=\"reportWithParams\" />\n\n    <Route name=\"new\" handler={ReportView} />\n\n    <Route name=\"report\" path=\":report\" handler={ReportView} />\n    <Route name=\"reportWithParams\" path=\":report/:reportParams?\" handler={ReportView} />\n  </Route>\n);\n\nexport const externalRoutes = (\n  <Route ignoreScrollBehavior>\n    <DefaultRoute handler={ReportView} />\n    <Route path=\"/stories/:storyId\" handler={StoryView} />\n    <Route path=\"/:reportId\" handler={ReportView} />\n    <Route path=\"/:reportId/:reportParams?\" handler={ReportView} />\n  </Route>\n);\n\nexport function createRouter(routes) {\n  return Router.create({\n    routes: routes,\n    onError(err) {\n      console.log(err);\n    }\n  });\n}\n\nexport function createRunCallback(router, targetElement, getPropsFromState) {\n  return (Root, state) => {\n    const propsForRoot = getPropsFromState(state, router);\n    ReactDOM.render(<I18nextProvider i18n={ i18n }><Root {...propsForRoot} /></I18nextProvider>, targetElement);\n  };\n}\n\n/**\n* this function is called for control_panel.js\n*/\nexport function getControlPanelPropsFromState(state) {\n  if (state.params.entity) {\n    EntityActions.selectedById(state.params.entity);\n  }\n\n  return {\n    routes: state.params.routes,\n    translation: false,\n    reportParams: state.params.reportParams\n  };\n}\n\n/**\n* this function is only called for standalone.js\n*/\nexport function createStandalonePropExtractor() {\n  const entity = new Entity(gon.entity);\n  const reports = new Reports({reports: getSortedReports(gon.reports)}, {parse: true});\n  const firstReport = reports.getFirst();\n\n  return (state, router) => {\n\n    const report = reports.findById(state.params.reportId) || firstReport;\n\n    function handleRouteChange(reportId, reportParams) {\n      const route = `/${reportId}/${reportParams || ''}`;\n      if (_.isEmpty(router.getCurrentParams().splat)) {\n        router.replaceWith(route);\n      } else {\n        router.transitionTo(route);\n      }\n    }\n\n    return {\n      entity: entity,\n      translation: true,\n      report: report,\n      reports: reports,\n      reportParams: state.params.reportParams,\n      onRouteChange: handleRouteChange\n    };\n  };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/routes.tsx","/** @license React v16.3.2\n * react.production.min.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var m=require(\"object-assign\"),n=require(\"fbjs/lib/invariant\"),p=require(\"fbjs/lib/emptyObject\"),q=require(\"fbjs/lib/emptyFunction\"),r=\"function\"===typeof Symbol&&Symbol[\"for\"],t=r?Symbol[\"for\"](\"react.element\"):60103,u=r?Symbol[\"for\"](\"react.portal\"):60106,v=r?Symbol[\"for\"](\"react.fragment\"):60107,w=r?Symbol[\"for\"](\"react.strict_mode\"):60108,x=r?Symbol[\"for\"](\"react.provider\"):60109,y=r?Symbol[\"for\"](\"react.context\"):60110,z=r?Symbol[\"for\"](\"react.async_mode\"):60111,A=r?Symbol[\"for\"](\"react.forward_ref\"):\n60112,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=arguments.length-1,e=\"http://reactjs.org/docs/error-decoder.html?invariant\\x3d\"+a,c=0;c<b;c++)e+=\"\\x26args[]\\x3d\"+encodeURIComponent(arguments[c+1]);n(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",e)}var D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};\nfunction E(a,b,e){this.props=a;this.context=b;this.refs=p;this.updater=e||D}E.prototype.isReactComponent={};E.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?C(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=p;this.updater=e||D}var H=G.prototype=new F;\nH.constructor=G;m(H,E.prototype);H.isPureReactComponent=!0;var I={current:null},J=Object.prototype.hasOwnProperty,K={key:!0,ref:!0,__self:!0,__source:!0};\nfunction L(a,b,e){var c=void 0,d={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)J.call(b,c)&&!K.hasOwnProperty(c)&&(d[c]=b[c]);var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){for(var k=Array(f),l=0;l<f;l++)k[l]=arguments[l+2];d.children=k}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===d[c]&&(d[c]=f[c]);return{$$typeof:t,type:a,key:g,ref:h,props:d,_owner:I.current}}\nfunction M(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===t}function escape(a){var b={\"\\x3d\":\"\\x3d0\",\":\":\"\\x3d2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var N=/\\/+/g,O=[];function P(a,b,e,c){if(O.length){var d=O.pop();d.result=a;d.keyPrefix=b;d.func=e;d.context=c;d.count=0;return d}return{result:a,keyPrefix:b,func:e,context:c,count:0}}function Q(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>O.length&&O.push(a)}\nfunction R(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case t:case u:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+S(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){d=a[h];var f=b+S(d,h);g+=R(d,f,e,c)}else if(null===a||\"undefined\"===typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),\nh=0;!(d=a.next()).done;)d=d.value,f=b+S(d,h++),g+=R(d,f,e,c);else\"object\"===d&&(e=\"\"+a,C(\"31\",\"[object Object]\"===e?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":e,\"\"));return g}function S(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function T(a,b){a.func.call(a.context,b,a.count++)}\nfunction U(a,b,e){var c=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?V(a,c,e,q.thatReturnsArgument):null!=a&&(M(a)&&(b=d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(N,\"$\\x26/\")+\"/\")+e,a={$$typeof:t,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}),c.push(a))}function V(a,b,e,c,d){var g=\"\";null!=e&&(g=(\"\"+e).replace(N,\"$\\x26/\")+\"/\");b=P(b,g,c,d);null==a||R(a,\"\",U,b);Q(b)}\nvar W={Children:{map:function(a,b,e){if(null==a)return a;var c=[];V(a,c,null,b,e);return c},forEach:function(a,b,e){if(null==a)return a;b=P(null,null,b,e);null==a||R(a,\"\",T,b);Q(b)},count:function(a){return null==a?0:R(a,\"\",q.thatReturnsNull,null)},toArray:function(a){var b=[];V(a,b,null,q.thatReturnsArgument);return b},only:function(a){M(a)?void 0:C(\"143\");return a}},createRef:function(){return{current:null}},Component:E,PureComponent:G,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:y,\n_calculateChangedBits:b,_defaultValue:a,_currentValue:a,_changedBits:0,Provider:null,Consumer:null};a.Provider={$$typeof:x,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:A,render:a}},Fragment:v,StrictMode:w,unstable_AsyncMode:z,createElement:L,cloneElement:function(a,b,e){null===a||void 0===a?C(\"267\",a):void 0;var c=void 0,d=m({},a.props),g=a.key,h=a.ref,f=a._owner;if(null!=b){void 0!==b.ref&&(h=b.ref,f=I.current);void 0!==b.key&&(g=\"\"+b.key);var k=void 0;a.type&&a.type.defaultProps&&\n(k=a.type.defaultProps);for(c in b)J.call(b,c)&&!K.hasOwnProperty(c)&&(d[c]=void 0===b[c]&&void 0!==k?k[c]:b[c])}c=arguments.length-2;if(1===c)d.children=e;else if(1<c){k=Array(c);for(var l=0;l<c;l++)k[l]=arguments[l+2];d.children=k}return{$$typeof:t,type:a.type,key:g,ref:h,props:d,_owner:f}},createFactory:function(a){var b=L.bind(null,a);b.type=a;return b},isValidElement:M,version:\"16.3.2\",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:I,assign:m}},X=Object.freeze({default:W}),\nY=X&&W||X;module.exports=Y[\"default\"]?Y[\"default\"]:Y;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/cjs/react.production.min.js\n// module id = 741\n// module chunks = 0 1","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/node_modules/object-assign/index.js\n// module id = 742\n// module chunks = 0 1","/** @license React v16.3.2\n * react-dom.production.min.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var ba=require(\"fbjs/lib/invariant\"),ea=require(\"react\"),m=require(\"fbjs/lib/ExecutionEnvironment\"),A=require(\"object-assign\"),C=require(\"fbjs/lib/emptyFunction\"),fa=require(\"fbjs/lib/getActiveElement\"),ha=require(\"fbjs/lib/shallowEqual\"),ja=require(\"fbjs/lib/containsNode\"),ka=require(\"fbjs/lib/emptyObject\");\nfunction D(a){for(var b=arguments.length-1,c=\"http://reactjs.org/docs/error-decoder.html?invariant\\x3d\"+a,d=0;d<b;d++)c+=\"\\x26args[]\\x3d\"+encodeURIComponent(arguments[d+1]);ba(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",c)}ea?void 0:D(\"227\");\nfunction ma(a,b,c,d,e,f,h,g,k){this._hasCaughtError=!1;this._caughtError=null;var v=Array.prototype.slice.call(arguments,3);try{b.apply(c,v)}catch(l){this._caughtError=l,this._hasCaughtError=!0}}\nvar E={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,invokeGuardedCallback:function(a,b,c,d,e,f,h,g,k){ma.apply(E,arguments)},invokeGuardedCallbackAndCatchFirstError:function(a,b,c,d,e,f,h,g,k){E.invokeGuardedCallback.apply(this,arguments);if(E.hasCaughtError()){var v=E.clearCaughtError();E._hasRethrowError||(E._hasRethrowError=!0,E._rethrowError=v)}},rethrowCaughtError:function(){return na.apply(E,arguments)},hasCaughtError:function(){return E._hasCaughtError},clearCaughtError:function(){if(E._hasCaughtError){var a=\nE._caughtError;E._caughtError=null;E._hasCaughtError=!1;return a}D(\"198\")}};function na(){if(E._hasRethrowError){var a=E._rethrowError;E._rethrowError=null;E._hasRethrowError=!1;throw a;}}var oa=null,pa={};\nfunction qa(){if(oa)for(var a in pa){var b=pa[a],c=oa.indexOf(a);-1<c?void 0:D(\"96\",a);if(!ra[c]){b.extractEvents?void 0:D(\"97\",a);ra[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],h=b,g=d;sa.hasOwnProperty(g)?D(\"99\",g):void 0;sa[g]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ta(k[e],h,g);e=!0}else f.registrationName?(ta(f.registrationName,h,g),e=!0):e=!1;e?void 0:D(\"98\",d,a)}}}}\nfunction ta(a,b,c){ua[a]?D(\"100\",a):void 0;ua[a]=b;va[a]=b.eventTypes[c].dependencies}var ra=[],sa={},ua={},va={};function wa(a){oa?D(\"101\"):void 0;oa=Array.prototype.slice.call(a);qa()}function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];pa.hasOwnProperty(c)&&pa[c]===d||(pa[c]?D(\"102\",c):void 0,pa[c]=d,b=!0)}b&&qa()}\nvar Ca=Object.freeze({plugins:ra,eventNameDispatchConfigs:sa,registrationNameModules:ua,registrationNameDependencies:va,possibleRegistrationNames:null,injectEventPluginOrder:wa,injectEventPluginsByName:xa}),Da=null,Ea=null,Fa=null;function Ga(a,b,c,d){b=a.type||\"unknown-event\";a.currentTarget=Fa(d);E.invokeGuardedCallbackAndCatchFirstError(b,c,void 0,a);a.currentTarget=null}\nfunction Ha(a,b){null==b?D(\"30\"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Ia(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Ja=null;\nfunction Ka(a,b){if(a){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;e<c.length&&!a.isPropagationStopped();e++)Ga(a,b,c[e],d[e]);else c&&Ga(a,b,c,d);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function La(a){return Ka(a,!0)}function Ma(a){return Ka(a,!1)}var Na={injectEventPluginOrder:wa,injectEventPluginsByName:xa};\nfunction Oa(a,b){var c=a.stateNode;if(!c)return null;var d=Da(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;c&&\"function\"!==typeof c?D(\"231\",b,typeof c):void 0;\nreturn c}function Pa(a,b){null!==a&&(Ja=Ha(Ja,a));a=Ja;Ja=null;a&&(b?Ia(a,La):Ia(a,Ma),Ja?D(\"95\"):void 0,E.rethrowCaughtError())}function Qa(a,b,c,d){for(var e=null,f=0;f<ra.length;f++){var h=ra[f];h&&(h=h.extractEvents(a,b,c,d))&&(e=Ha(e,h))}Pa(e,!1)}var Ra=Object.freeze({injection:Na,getListener:Oa,runEventsInBatch:Pa,runExtractedEventsInBatch:Qa}),Sa=Math.random().toString(36).slice(2),F=\"__reactInternalInstance$\"+Sa,Ta=\"__reactEventHandlers$\"+Sa;\nfunction Ua(a){if(a[F])return a[F];for(;!a[F];)if(a.parentNode)a=a.parentNode;else return null;a=a[F];return 5===a.tag||6===a.tag?a:null}function Va(a){if(5===a.tag||6===a.tag)return a.stateNode;D(\"33\")}function Xa(a){return a[Ta]||null}var bb=Object.freeze({precacheFiberNode:function(a,b){b[F]=a},getClosestInstanceFromNode:Ua,getInstanceFromNode:function(a){a=a[F];return!a||5!==a.tag&&6!==a.tag?null:a},getNodeFromInstance:Va,getFiberCurrentPropsFromNode:Xa,updateFiberProps:function(a,b){a[Ta]=b}});\nfunction L(a){do a=a[\"return\"];while(a&&5!==a.tag);return a?a:null}function cb(a,b,c){for(var d=[];a;)d.push(a),a=L(a);for(a=d.length;0<a--;)b(d[a],\"captured\",c);for(a=0;a<d.length;a++)b(d[a],\"bubbled\",c)}function db(a,b,c){if(b=Oa(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=Ha(c._dispatchListeners,b),c._dispatchInstances=Ha(c._dispatchInstances,a)}function eb(a){a&&a.dispatchConfig.phasedRegistrationNames&&cb(a._targetInst,db,a)}\nfunction fb(a){if(a&&a.dispatchConfig.phasedRegistrationNames){var b=a._targetInst;b=b?L(b):null;cb(b,db,a)}}function gb(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Oa(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=Ha(c._dispatchListeners,b),c._dispatchInstances=Ha(c._dispatchInstances,a))}function hb(a){a&&a.dispatchConfig.registrationName&&gb(a._targetInst,null,a)}function ib(a){Ia(a,eb)}\nfunction jb(a,b,c,d){if(c&&d)a:{var e=c;for(var f=d,h=0,g=e;g;g=L(g))h++;g=0;for(var k=f;k;k=L(k))g++;for(;0<h-g;)e=L(e),h--;for(;0<g-h;)f=L(f),g--;for(;h--;){if(e===f||e===f.alternate)break a;e=L(e);f=L(f)}e=null}else e=null;f=e;for(e=[];c&&c!==f;){h=c.alternate;if(null!==h&&h===f)break;e.push(c);c=L(c)}for(c=[];d&&d!==f;){h=d.alternate;if(null!==h&&h===f)break;c.push(d);d=L(d)}for(d=0;d<e.length;d++)gb(e[d],\"bubbled\",a);for(a=c.length;0<a--;)gb(c[a],\"captured\",b)}\nvar kb=Object.freeze({accumulateTwoPhaseDispatches:ib,accumulateTwoPhaseDispatchesSkipTarget:function(a){Ia(a,fb)},accumulateEnterLeaveDispatches:jb,accumulateDirectDispatches:function(a){Ia(a,hb)}}),lb=null;function mb(){!lb&&m.canUseDOM&&(lb=\"textContent\"in document.documentElement?\"textContent\":\"innerText\");return lb}var M={_root:null,_startText:null,_fallbackText:null};\nfunction nb(){if(M._fallbackText)return M._fallbackText;var a,b=M._startText,c=b.length,d,e=ob(),f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var h=c-a;for(d=1;d<=h&&b[c-d]===e[f-d];d++);M._fallbackText=e.slice(a,1<d?1-d:void 0);return M._fallbackText}function ob(){return\"value\"in M._root?M._root.value:M._root[mb()]}\nvar pb=\"dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances\".split(\" \"),qb={type:null,target:null,currentTarget:C.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nfunction N(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?C.thatReturnsTrue:C.thatReturnsFalse;this.isPropagationStopped=C.thatReturnsFalse;return this}\nA(N.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=C.thatReturnsTrue)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=C.thatReturnsTrue)},persist:function(){this.isPersistent=C.thatReturnsTrue},isPersistent:C.thatReturnsFalse,\ndestructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;for(a=0;a<pb.length;a++)this[pb[a]]=null}});N.Interface=qb;N.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;A(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=A({},d.Interface,a);c.extend=d.extend;rb(c);return c};rb(N);\nfunction sb(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function tb(a){a instanceof this?void 0:D(\"223\");a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function rb(a){a.eventPool=[];a.getPooled=sb;a.release=tb}var ub=N.extend({data:null}),vb=N.extend({data:null}),wb=[9,13,27,32],xb=m.canUseDOM&&\"CompositionEvent\"in window,yb=null;m.canUseDOM&&\"documentMode\"in document&&(yb=document.documentMode);\nvar zb=m.canUseDOM&&\"TextEvent\"in window&&!yb,Ab=m.canUseDOM&&(!xb||yb&&8<yb&&11>=yb),Bb=String.fromCharCode(32),Kb={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")}},Lb=!1;\nfunction Mb(a,b){switch(a){case \"topKeyUp\":return-1!==wb.indexOf(b.keyCode);case \"topKeyDown\":return 229!==b.keyCode;case \"topKeyPress\":case \"topMouseDown\":case \"topBlur\":return!0;default:return!1}}function Nb(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Ob=!1;function Pb(a,b){switch(a){case \"topCompositionEnd\":return Nb(b);case \"topKeyPress\":if(32!==b.which)return null;Lb=!0;return Bb;case \"topTextInput\":return a=b.data,a===Bb&&Lb?null:a;default:return null}}\nfunction Qb(a,b){if(Ob)return\"topCompositionEnd\"===a||!xb&&Mb(a,b)?(a=nb(),M._root=null,M._startText=null,M._fallbackText=null,Ob=!1,a):null;switch(a){case \"topPaste\":return null;case \"topKeyPress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"topCompositionEnd\":return Ab?null:b.data;default:return null}}\nvar Rb={eventTypes:Kb,extractEvents:function(a,b,c,d){var e=void 0;var f=void 0;if(xb)b:{switch(a){case \"topCompositionStart\":e=Kb.compositionStart;break b;case \"topCompositionEnd\":e=Kb.compositionEnd;break b;case \"topCompositionUpdate\":e=Kb.compositionUpdate;break b}e=void 0}else Ob?Mb(a,c)&&(e=Kb.compositionEnd):\"topKeyDown\"===a&&229===c.keyCode&&(e=Kb.compositionStart);e?(Ab&&(Ob||e!==Kb.compositionStart?e===Kb.compositionEnd&&Ob&&(f=nb()):(M._root=d,M._startText=ob(),Ob=!0)),e=ub.getPooled(e,\nb,c,d),f?e.data=f:(f=Nb(c),null!==f&&(e.data=f)),ib(e),f=e):f=null;(a=zb?Pb(a,c):Qb(a,c))?(b=vb.getPooled(Kb.beforeInput,b,c,d),b.data=a,ib(b)):b=null;return null===f?b:null===b?f:[f,b]}},Sb=null,Tb={injectFiberControlledHostComponent:function(a){Sb=a}},Ub=null,Vb=null;function Wb(a){if(a=Ea(a)){Sb&&\"function\"===typeof Sb.restoreControlledState?void 0:D(\"194\");var b=Da(a.stateNode);Sb.restoreControlledState(a.stateNode,a.type,b)}}function Xb(a){Ub?Vb?Vb.push(a):Vb=[a]:Ub=a}\nfunction Yb(){return null!==Ub||null!==Vb}function Zb(){if(Ub){var a=Ub,b=Vb;Vb=Ub=null;Wb(a);if(b)for(a=0;a<b.length;a++)Wb(b[a])}}var $b=Object.freeze({injection:Tb,enqueueStateRestore:Xb,needsStateRestore:Yb,restoreStateIfNeeded:Zb});function ac(a,b){return a(b)}function bc(a,b,c){return a(b,c)}function cc(){}var dc=!1;function ec(a,b){if(dc)return a(b);dc=!0;try{return ac(a,b)}finally{dc=!1,Yb()&&(cc(),Zb())}}\nvar fc={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function gc(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!fc[a.type]:\"textarea\"===b?!0:!1}function hc(a){a=a.target||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}\nfunction ic(a,b){if(!m.canUseDOM||b&&!(\"addEventListener\"in document))return!1;a=\"on\"+a;b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}function jc(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction kc(a){var b=jc(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"function\"===typeof c.get&&\"function\"===typeof c.set)return Object.defineProperty(a,b,{configurable:!0,get:function(){return c.get.call(this)},set:function(a){d=\"\"+a;c.set.call(this,a)}}),Object.defineProperty(a,b,{enumerable:c.enumerable}),{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}\nfunction lc(a){a._valueTracker||(a._valueTracker=kc(a))}function mc(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=jc(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}\nvar nc=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,O=\"function\"===typeof Symbol&&Symbol[\"for\"],oc=O?Symbol[\"for\"](\"react.element\"):60103,pc=O?Symbol[\"for\"](\"react.call\"):60104,qc=O?Symbol[\"for\"](\"react.return\"):60105,rc=O?Symbol[\"for\"](\"react.portal\"):60106,sc=O?Symbol[\"for\"](\"react.fragment\"):60107,tc=O?Symbol[\"for\"](\"react.strict_mode\"):60108,uc=O?Symbol[\"for\"](\"react.provider\"):60109,vc=O?Symbol[\"for\"](\"react.context\"):60110,wc=O?Symbol[\"for\"](\"react.async_mode\"):60111,\nxc=O?Symbol[\"for\"](\"react.forward_ref\"):60112,yc=\"function\"===typeof Symbol&&Symbol.iterator;function zc(a){if(null===a||\"undefined\"===typeof a)return null;a=yc&&a[yc]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Ac(a){a=a.type;if(\"function\"===typeof a)return a.displayName||a.name;if(\"string\"===typeof a)return a;switch(a){case sc:return\"ReactFragment\";case rc:return\"ReactPortal\";case pc:return\"ReactCall\";case qc:return\"ReactReturn\"}if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case xc:return a=a.render.displayName||a.render.name||\"\",\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\"}return null}\nfunction Bc(a){var b=\"\";do{a:switch(a.tag){case 0:case 1:case 2:case 5:var c=a._debugOwner,d=a._debugSource;var e=Ac(a);var f=null;c&&(f=Ac(c));c=d;e=\"\\n    in \"+(e||\"Unknown\")+(c?\" (at \"+c.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+c.lineNumber+\")\":f?\" (created by \"+f+\")\":\"\");break a;default:e=\"\"}b+=e;a=a[\"return\"]}while(a);return b}\nvar Cc=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,Dc={},Ec={};function Fc(a){if(Ec.hasOwnProperty(a))return!0;if(Dc.hasOwnProperty(a))return!1;if(Cc.test(a))return Ec[a]=!0;Dc[a]=!0;return!1}\nfunction Gc(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}function Hc(a,b,c,d){if(null===b||\"undefined\"===typeof b||Gc(a,b,c,d))return!0;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}\nfunction U(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var V={};\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){V[a]=new U(a,0,!1,a,null)});\n[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];V[b]=new U(b,1,!1,a[1],null)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){V[a]=new U(a,2,!1,a.toLowerCase(),null)});[\"autoReverse\",\"externalResourcesRequired\",\"preserveAlpha\"].forEach(function(a){V[a]=new U(a,2,!1,a,null)});\n\"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){V[a]=new U(a,3,!1,a.toLowerCase(),null)});[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){V[a]=new U(a,3,!0,a.toLowerCase(),null)});[\"capture\",\"download\"].forEach(function(a){V[a]=new U(a,4,!1,a.toLowerCase(),null)});\n[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){V[a]=new U(a,6,!1,a.toLowerCase(),null)});[\"rowSpan\",\"start\"].forEach(function(a){V[a]=new U(a,5,!1,a.toLowerCase(),null)});var Sc=/[\\-:]([a-z])/g;function Tc(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(Sc,\nTc);V[b]=new U(b,1,!1,a,null)});\"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(Sc,Tc);V[b]=new U(b,1,!1,a,\"http://www.w3.org/1999/xlink\")});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(Sc,Tc);V[b]=new U(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\")});V.tabIndex=new U(\"tabIndex\",1,!1,\"tabindex\",null);\nfunction Uc(a,b,c,d){var e=V.hasOwnProperty(b)?V[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(Hc(b,c,e,d)&&(c=null),d||null===e?Fc(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction Vc(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Wc(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Xc(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Yc(a,b){b=b.checked;null!=b&&Uc(a,\"checked\",b,!1)}\nfunction Zc(a,b){Yc(a,b);var c=Xc(b.value);if(null!=c)if(\"number\"===b.type){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);b.hasOwnProperty(\"value\")?$c(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&$c(a,b.type,Xc(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction ad(a,b){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\"))\"\"===a.value&&(a.value=\"\"+a._wrapperState.initialValue),a.defaultValue=\"\"+a._wrapperState.initialValue;b=a.name;\"\"!==b&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!a.defaultChecked;\"\"!==b&&(a.name=b)}function $c(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}\nfunction Xc(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}var bd={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange\".split(\" \")}};function cd(a,b,c){a=N.getPooled(bd.change,a,b,c);a.type=\"change\";Xb(c);ib(a);return a}var dd=null,ed=null;function fd(a){Pa(a,!1)}\nfunction gd(a){var b=Va(a);if(mc(b))return a}function hd(a,b){if(\"topChange\"===a)return b}var id=!1;m.canUseDOM&&(id=ic(\"input\")&&(!document.documentMode||9<document.documentMode));function jd(){dd&&(dd.detachEvent(\"onpropertychange\",kd),ed=dd=null)}function kd(a){\"value\"===a.propertyName&&gd(ed)&&(a=cd(ed,a,hc(a)),ec(fd,a))}function ld(a,b,c){\"topFocus\"===a?(jd(),dd=b,ed=c,dd.attachEvent(\"onpropertychange\",kd)):\"topBlur\"===a&&jd()}\nfunction md(a){if(\"topSelectionChange\"===a||\"topKeyUp\"===a||\"topKeyDown\"===a)return gd(ed)}function nd(a,b){if(\"topClick\"===a)return gd(b)}function od(a,b){if(\"topInput\"===a||\"topChange\"===a)return gd(b)}\nvar pd={eventTypes:bd,_isInputEventSupported:id,extractEvents:function(a,b,c,d){var e=b?Va(b):window,f=void 0,h=void 0,g=e.nodeName&&e.nodeName.toLowerCase();\"select\"===g||\"input\"===g&&\"file\"===e.type?f=hd:gc(e)?id?f=od:(f=md,h=ld):(g=e.nodeName)&&\"input\"===g.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(f=nd);if(f&&(f=f(a,b)))return cd(f,c,d);h&&h(a,e,b);\"topBlur\"===a&&null!=b&&(a=b._wrapperState||e._wrapperState)&&a.controlled&&\"number\"===e.type&&$c(e,\"number\",e.value)}},qd=N.extend({view:null,\ndetail:null}),rd={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function sd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=rd[a])?!!b[a]:!1}function td(){return sd}\nvar ud=qd.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:td,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)}}),vd={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"topMouseOut\",\"topMouseOver\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"topMouseOut\",\"topMouseOver\"]}},wd={eventTypes:vd,extractEvents:function(a,\nb,c,d){if(\"topMouseOver\"===a&&(c.relatedTarget||c.fromElement)||\"topMouseOut\"!==a&&\"topMouseOver\"!==a)return null;var e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;\"topMouseOut\"===a?(a=b,b=(b=c.relatedTarget||c.toElement)?Ua(b):null):a=null;if(a===b)return null;var f=null==a?e:Va(a);e=null==b?e:Va(b);var h=ud.getPooled(vd.mouseLeave,a,c,d);h.type=\"mouseleave\";h.target=f;h.relatedTarget=e;c=ud.getPooled(vd.mouseEnter,b,c,d);c.type=\"mouseenter\";c.target=e;c.relatedTarget=\nf;jb(h,c,a,b);return[h,c]}};function xd(a){var b=a;if(a.alternate)for(;b[\"return\"];)b=b[\"return\"];else{if(0!==(b.effectTag&2))return 1;for(;b[\"return\"];)if(b=b[\"return\"],0!==(b.effectTag&2))return 1}return 3===b.tag?2:3}function yd(a){return(a=a._reactInternalFiber)?2===xd(a):!1}function zd(a){2!==xd(a)?D(\"188\"):void 0}\nfunction Ad(a){var b=a.alternate;if(!b)return b=xd(a),3===b?D(\"188\"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c[\"return\"],f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var h=e.child;h;){if(h===c)return zd(e),a;if(h===d)return zd(e),b;h=h.sibling}D(\"188\")}if(c[\"return\"]!==d[\"return\"])c=e,d=f;else{h=!1;for(var g=e.child;g;){if(g===c){h=!0;c=e;d=f;break}if(g===d){h=!0;d=e;c=f;break}g=g.sibling}if(!h){for(g=f.child;g;){if(g===c){h=!0;c=f;d=e;break}if(g===d){h=!0;d=f;c=e;break}g=g.sibling}h?\nvoid 0:D(\"189\")}}c.alternate!==d?D(\"190\"):void 0}3!==c.tag?D(\"188\"):void 0;return c.stateNode.current===c?a:b}function Bd(a){a=Ad(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null}\nfunction Cd(a){a=Ad(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child&&4!==b.tag)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null}var Dd=N.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Ed=N.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Fd=qd.extend({relatedTarget:null});\nfunction Gd(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar Hd={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Id={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Jd=qd.extend({key:function(a){if(a.key){var b=Hd[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=Gd(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Id[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:td,charCode:function(a){return\"keypress\"===\na.type?Gd(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?Gd(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Kd=ud.extend({dataTransfer:null}),Ld=qd.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:td}),Md=N.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),Nd=ud.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),Od={},Pd={};function Qd(a,b){var c=a[0].toUpperCase()+a.slice(1),d=\"on\"+c;c=\"top\"+c;b={phasedRegistrationNames:{bubbled:d,captured:d+\"Capture\"},dependencies:[c],isInteractive:b};Od[a]=b;Pd[c]=b}\n\"blur cancel click close contextMenu copy cut doubleClick dragEnd dragStart drop focus input invalid keyDown keyPress keyUp mouseDown mouseUp paste pause play rateChange reset seeked submit touchCancel touchEnd touchStart volumeChange\".split(\" \").forEach(function(a){Qd(a,!0)});\n\"abort animationEnd animationIteration animationStart canPlay canPlayThrough drag dragEnter dragExit dragLeave dragOver durationChange emptied encrypted ended error load loadedData loadedMetadata loadStart mouseMove mouseOut mouseOver playing progress scroll seeking stalled suspend timeUpdate toggle touchMove transitionEnd waiting wheel\".split(\" \").forEach(function(a){Qd(a,!1)});\nvar Rd={eventTypes:Od,isInteractiveTopLevelEventType:function(a){a=Pd[a];return void 0!==a&&!0===a.isInteractive},extractEvents:function(a,b,c,d){var e=Pd[a];if(!e)return null;switch(a){case \"topKeyPress\":if(0===Gd(c))return null;case \"topKeyDown\":case \"topKeyUp\":a=Jd;break;case \"topBlur\":case \"topFocus\":a=Fd;break;case \"topClick\":if(2===c.button)return null;case \"topDoubleClick\":case \"topMouseDown\":case \"topMouseMove\":case \"topMouseUp\":case \"topMouseOut\":case \"topMouseOver\":case \"topContextMenu\":a=\nud;break;case \"topDrag\":case \"topDragEnd\":case \"topDragEnter\":case \"topDragExit\":case \"topDragLeave\":case \"topDragOver\":case \"topDragStart\":case \"topDrop\":a=Kd;break;case \"topTouchCancel\":case \"topTouchEnd\":case \"topTouchMove\":case \"topTouchStart\":a=Ld;break;case \"topAnimationEnd\":case \"topAnimationIteration\":case \"topAnimationStart\":a=Dd;break;case \"topTransitionEnd\":a=Md;break;case \"topScroll\":a=qd;break;case \"topWheel\":a=Nd;break;case \"topCopy\":case \"topCut\":case \"topPaste\":a=Ed;break;default:a=\nN}b=a.getPooled(e,b,c,d);ib(b);return b}},Sd=Rd.isInteractiveTopLevelEventType,Td=[];function Ud(a){var b=a.targetInst;do{if(!b){a.ancestors.push(b);break}var c;for(c=b;c[\"return\"];)c=c[\"return\"];c=3!==c.tag?null:c.stateNode.containerInfo;if(!c)break;a.ancestors.push(b);b=Ua(c)}while(b);for(c=0;c<a.ancestors.length;c++)b=a.ancestors[c],Qa(a.topLevelType,b,a.nativeEvent,hc(a.nativeEvent))}var Vd=!0;function Wd(a){Vd=!!a}\nfunction W(a,b,c){if(!c)return null;a=(Sd(a)?Xd:Yd).bind(null,a);c.addEventListener(b,a,!1)}function Zd(a,b,c){if(!c)return null;a=(Sd(a)?Xd:Yd).bind(null,a);c.addEventListener(b,a,!0)}function Xd(a,b){bc(Yd,a,b)}\nfunction Yd(a,b){if(Vd){var c=hc(b);c=Ua(c);null!==c&&\"number\"===typeof c.tag&&2!==xd(c)&&(c=null);if(Td.length){var d=Td.pop();d.topLevelType=a;d.nativeEvent=b;d.targetInst=c;a=d}else a={topLevelType:a,nativeEvent:b,targetInst:c,ancestors:[]};try{ec(Ud,a)}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,10>Td.length&&Td.push(a)}}}\nvar $d=Object.freeze({get _enabled(){return Vd},setEnabled:Wd,isEnabled:function(){return Vd},trapBubbledEvent:W,trapCapturedEvent:Zd,dispatchEvent:Yd});function ae(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;c[\"ms\"+a]=\"MS\"+b;c[\"O\"+a]=\"o\"+b.toLowerCase();return c}\nvar be={animationend:ae(\"Animation\",\"AnimationEnd\"),animationiteration:ae(\"Animation\",\"AnimationIteration\"),animationstart:ae(\"Animation\",\"AnimationStart\"),transitionend:ae(\"Transition\",\"TransitionEnd\")},ce={},de={};m.canUseDOM&&(de=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete be.animationend.animation,delete be.animationiteration.animation,delete be.animationstart.animation),\"TransitionEvent\"in window||delete be.transitionend.transition);\nfunction ee(a){if(ce[a])return ce[a];if(!be[a])return a;var b=be[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in de)return ce[a]=b[c];return a}\nvar fe={topAnimationEnd:ee(\"animationend\"),topAnimationIteration:ee(\"animationiteration\"),topAnimationStart:ee(\"animationstart\"),topBlur:\"blur\",topCancel:\"cancel\",topChange:\"change\",topClick:\"click\",topClose:\"close\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",\ntopDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topLoad:\"load\",topLoadStart:\"loadstart\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topScroll:\"scroll\",topSelectionChange:\"selectionchange\",topTextInput:\"textInput\",topToggle:\"toggle\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",\ntopTouchStart:\"touchstart\",topTransitionEnd:ee(\"transitionend\"),topWheel:\"wheel\"},ge={topAbort:\"abort\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topSeeked:\"seeked\",topSeeking:\"seeking\",\ntopStalled:\"stalled\",topSuspend:\"suspend\",topTimeUpdate:\"timeupdate\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\"},he={},ie=0,je=\"_reactListenersID\"+(\"\"+Math.random()).slice(2);function ke(a){Object.prototype.hasOwnProperty.call(a,je)||(a[je]=ie++,he[a[je]]={});return he[a[je]]}function le(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction me(a,b){var c=le(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=le(c)}}function ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&\"text\"===a.type||\"textarea\"===b||\"true\"===a.contentEditable)}\nvar oe=m.canUseDOM&&\"documentMode\"in document&&11>=document.documentMode,pe={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange\".split(\" \")}},qe=null,re=null,se=null,te=!1;\nfunction ue(a,b){if(te||null==qe||qe!==fa())return null;var c=qe;\"selectionStart\"in c&&ne(c)?c={start:c.selectionStart,end:c.selectionEnd}:window.getSelection?(c=window.getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}):c=void 0;return se&&ha(se,c)?null:(se=c,a=N.getPooled(pe.select,re,a,b),a.type=\"select\",a.target=qe,ib(a),a)}\nvar ve={eventTypes:pe,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=ke(e);f=va.onSelect;for(var h=0;h<f.length;h++){var g=f[h];if(!e.hasOwnProperty(g)||!e[g]){e=!1;break a}}e=!0}f=!e}if(f)return null;e=b?Va(b):window;switch(a){case \"topFocus\":if(gc(e)||\"true\"===e.contentEditable)qe=e,re=b,se=null;break;case \"topBlur\":se=re=qe=null;break;case \"topMouseDown\":te=!0;break;case \"topContextMenu\":case \"topMouseUp\":return te=!1,ue(c,d);case \"topSelectionChange\":if(oe)break;\ncase \"topKeyDown\":case \"topKeyUp\":return ue(c,d)}return null}};Na.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));Da=bb.getFiberCurrentPropsFromNode;Ea=bb.getInstanceFromNode;Fa=bb.getNodeFromInstance;Na.injectEventPluginsByName({SimpleEventPlugin:Rd,EnterLeaveEventPlugin:wd,ChangeEventPlugin:pd,SelectEventPlugin:ve,BeforeInputEventPlugin:Rb});\nfunction xe(a,b,c,d){this.tag=a;this.key=c;this.stateNode=this.type=null;this.sibling=this.child=this[\"return\"]=null;this.index=0;this.ref=null;this.pendingProps=b;this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.expirationTime=0;this.alternate=null}\nfunction ze(a,b,c){var d=a.alternate;null===d?(d=new xe(a.tag,b,a.key,a.mode),d.type=a.type,d.stateNode=a.stateNode,d.alternate=a,a.alternate=d):(d.pendingProps=b,d.effectTag=0,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null);d.expirationTime=c;d.child=a.child;d.memoizedProps=a.memoizedProps;d.memoizedState=a.memoizedState;d.updateQueue=a.updateQueue;d.sibling=a.sibling;d.index=a.index;d.ref=a.ref;return d}\nfunction Ae(a,b,c){var d=a.type,e=a.key;a=a.props;var f=void 0;if(\"function\"===typeof d)f=d.prototype&&d.prototype.isReactComponent?2:0;else if(\"string\"===typeof d)f=5;else switch(d){case sc:return Be(a.children,b,c,e);case wc:f=11;b|=3;break;case tc:f=11;b|=2;break;case pc:f=7;break;case qc:f=9;break;default:if(\"object\"===typeof d&&null!==d)switch(d.$$typeof){case uc:f=13;break;case vc:f=12;break;case xc:f=14;break;default:if(\"number\"===typeof d.tag)return b=d,b.pendingProps=a,b.expirationTime=c,\nb;D(\"130\",null==d?d:typeof d,\"\")}else D(\"130\",null==d?d:typeof d,\"\")}b=new xe(f,a,e,b);b.type=d;b.expirationTime=c;return b}function Be(a,b,c,d){a=new xe(10,a,d,b);a.expirationTime=c;return a}function Ce(a,b,c){a=new xe(6,a,null,b);a.expirationTime=c;return a}function De(a,b,c){b=new xe(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}var Ee=null,Fe=null;\nfunction Ge(a){return function(b){try{return a(b)}catch(c){}}}function He(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Ee=Ge(function(a){return b.onCommitFiberRoot(c,a)});Fe=Ge(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}function Ie(a){\"function\"===typeof Ee&&Ee(a)}function Je(a){\"function\"===typeof Fe&&Fe(a)}new Set;\nfunction Ke(a){return{baseState:a,expirationTime:0,first:null,last:null,callbackList:null,hasForceUpdate:!1,isInitialized:!1,capturedValues:null}}function Le(a,b){null===a.last?a.first=a.last=b:(a.last.next=b,a.last=b);if(0===a.expirationTime||a.expirationTime>b.expirationTime)a.expirationTime=b.expirationTime}var Me=void 0,Ne=void 0;\nfunction Oe(a){Me=Ne=null;var b=a.alternate,c=a.updateQueue;null===c&&(c=a.updateQueue=Ke(null));null!==b?(a=b.updateQueue,null===a&&(a=b.updateQueue=Ke(null))):a=null;Me=c;Ne=a!==c?a:null}function Pe(a,b){Oe(a);a=Me;var c=Ne;null===c?Le(a,b):null===a.last||null===c.last?(Le(a,b),Le(c,b)):(Le(a,b),c.last=b)}function Qe(a,b,c,d){a=a.partialState;return\"function\"===typeof a?a.call(b,c,d):a}\nfunction Re(a,b,c,d,e,f){null!==a&&a.updateQueue===c&&(c=b.updateQueue={baseState:c.baseState,expirationTime:c.expirationTime,first:c.first,last:c.last,isInitialized:c.isInitialized,capturedValues:c.capturedValues,callbackList:null,hasForceUpdate:!1});c.expirationTime=0;c.isInitialized?a=c.baseState:(a=c.baseState=b.memoizedState,c.isInitialized=!0);for(var h=!0,g=c.first,k=!1;null!==g;){var v=g.expirationTime;if(v>f){var l=c.expirationTime;if(0===l||l>v)c.expirationTime=v;k||(k=!0,c.baseState=a)}else{k||\n(c.first=g.next,null===c.first&&(c.last=null));if(g.isReplace)a=Qe(g,d,a,e),h=!0;else if(v=Qe(g,d,a,e))a=h?A({},a,v):A(a,v),h=!1;g.isForced&&(c.hasForceUpdate=!0);null!==g.callback&&(v=c.callbackList,null===v&&(v=c.callbackList=[]),v.push(g));null!==g.capturedValue&&(v=c.capturedValues,null===v?c.capturedValues=[g.capturedValue]:v.push(g.capturedValue))}g=g.next}null!==c.callbackList?b.effectTag|=32:null!==c.first||c.hasForceUpdate||null!==c.capturedValues||(b.updateQueue=null);k||(c.baseState=a);\nreturn a}function Se(a,b){var c=a.callbackList;if(null!==c)for(a.callbackList=null,a=0;a<c.length;a++){var d=c[a],e=d.callback;d.callback=null;\"function\"!==typeof e?D(\"191\",e):void 0;e.call(b)}}\nfunction Te(a,b,c,d,e){function f(a,b,c,d,e,f){if(null===b||null!==a.updateQueue&&a.updateQueue.hasForceUpdate)return!0;var n=a.stateNode;a=a.type;return\"function\"===typeof n.shouldComponentUpdate?n.shouldComponentUpdate(c,e,f):a.prototype&&a.prototype.isPureReactComponent?!ha(b,c)||!ha(d,e):!0}function h(a,b){b.updater=r;a.stateNode=b;b._reactInternalFiber=a}function g(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&\nb.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&r.enqueueReplaceState(b,b.state,null)}function k(a,b,c,d){a=a.type;if(\"function\"===typeof a.getDerivedStateFromProps)return a.getDerivedStateFromProps.call(null,c,d)}var v=a.cacheContext,l=a.getMaskedContext,p=a.getUnmaskedContext,z=a.isContextConsumer,B=a.hasContextChanged,r={isMounted:yd,enqueueSetState:function(a,d,e){a=a._reactInternalFiber;e=void 0===e?null:e;var f=c(a);Pe(a,{expirationTime:f,partialState:d,callback:e,isReplace:!1,isForced:!1,\ncapturedValue:null,next:null});b(a,f)},enqueueReplaceState:function(a,d,e){a=a._reactInternalFiber;e=void 0===e?null:e;var f=c(a);Pe(a,{expirationTime:f,partialState:d,callback:e,isReplace:!0,isForced:!1,capturedValue:null,next:null});b(a,f)},enqueueForceUpdate:function(a,d){a=a._reactInternalFiber;d=void 0===d?null:d;var e=c(a);Pe(a,{expirationTime:e,partialState:null,callback:d,isReplace:!1,isForced:!0,capturedValue:null,next:null});b(a,e)}};return{adoptClassInstance:h,callGetDerivedStateFromProps:k,\nconstructClassInstance:function(a,b){var c=a.type,d=p(a),e=z(a),f=e?l(a,d):ka;c=new c(b,f);var n=null!==c.state&&void 0!==c.state?c.state:null;h(a,c);a.memoizedState=n;b=k(a,c,b,n);null!==b&&void 0!==b&&(a.memoizedState=A({},a.memoizedState,b));e&&v(a,d,f);return c},mountClassInstance:function(a,b){var c=a.type,d=a.alternate,e=a.stateNode,f=a.pendingProps,n=p(a);e.props=f;e.state=a.memoizedState;e.refs=ka;e.context=l(a,n);\"function\"===typeof c.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\n\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(c=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),c!==e.state&&r.enqueueReplaceState(e,e.state,null),c=a.updateQueue,null!==c&&(e.state=Re(d,a,c,e,f,b)));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)},resumeMountClassInstance:function(a,b){var c=a.type,n=a.stateNode;n.props=a.memoizedProps;n.state=\na.memoizedState;var h=a.memoizedProps,r=a.pendingProps,z=n.context,q=p(a);q=l(a,q);(c=\"function\"===typeof c.getDerivedStateFromProps||\"function\"===typeof n.getSnapshotBeforeUpdate)||\"function\"!==typeof n.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof n.componentWillReceiveProps||(h!==r||z!==q)&&g(a,n,r,q);z=a.memoizedState;b=null!==a.updateQueue?Re(null,a,a.updateQueue,n,r,b):z;var u=void 0;h!==r&&(u=k(a,n,r,b));if(null!==u&&void 0!==u){b=null===b||void 0===b?u:A({},b,u);var t=a.updateQueue;\nnull!==t&&(t.baseState=A({},t.baseState,u))}if(!(h!==r||z!==b||B()||null!==a.updateQueue&&a.updateQueue.hasForceUpdate))return\"function\"===typeof n.componentDidMount&&(a.effectTag|=4),!1;(h=f(a,h,r,z,b,q))?(c||\"function\"!==typeof n.UNSAFE_componentWillMount&&\"function\"!==typeof n.componentWillMount||(\"function\"===typeof n.componentWillMount&&n.componentWillMount(),\"function\"===typeof n.UNSAFE_componentWillMount&&n.UNSAFE_componentWillMount()),\"function\"===typeof n.componentDidMount&&(a.effectTag|=\n4)):(\"function\"===typeof n.componentDidMount&&(a.effectTag|=4),d(a,r),e(a,b));n.props=r;n.state=b;n.context=q;return h},updateClassInstance:function(a,b,c){var n=b.type,x=b.stateNode;x.props=b.memoizedProps;x.state=b.memoizedState;var h=b.memoizedProps,r=b.pendingProps,q=x.context,u=p(b);u=l(b,u);(n=\"function\"===typeof n.getDerivedStateFromProps||\"function\"===typeof x.getSnapshotBeforeUpdate)||\"function\"!==typeof x.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof x.componentWillReceiveProps||\n(h!==r||q!==u)&&g(b,x,r,u);q=b.memoizedState;c=null!==b.updateQueue?Re(a,b,b.updateQueue,x,r,c):q;var t=void 0;h!==r&&(t=k(b,x,r,c));if(null!==t&&void 0!==t){c=null===c||void 0===c?t:A({},c,t);var y=b.updateQueue;null!==y&&(y.baseState=A({},y.baseState,t))}if(!(h!==r||q!==c||B()||null!==b.updateQueue&&b.updateQueue.hasForceUpdate))return\"function\"!==typeof x.componentDidUpdate||h===a.memoizedProps&&q===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof x.getSnapshotBeforeUpdate||h===a.memoizedProps&&\nq===a.memoizedState||(b.effectTag|=2048),!1;(t=f(b,h,r,q,c,u))?(n||\"function\"!==typeof x.UNSAFE_componentWillUpdate&&\"function\"!==typeof x.componentWillUpdate||(\"function\"===typeof x.componentWillUpdate&&x.componentWillUpdate(r,c,u),\"function\"===typeof x.UNSAFE_componentWillUpdate&&x.UNSAFE_componentWillUpdate(r,c,u)),\"function\"===typeof x.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof x.getSnapshotBeforeUpdate&&(b.effectTag|=2048)):(\"function\"!==typeof x.componentDidUpdate||h===a.memoizedProps&&\nq===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof x.getSnapshotBeforeUpdate||h===a.memoizedProps&&q===a.memoizedState||(b.effectTag|=2048),d(b,r),e(b,c));x.props=r;x.state=c;x.context=u;return t}}}var Ue=Array.isArray;\nfunction Ve(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(2!==c.tag?D(\"110\"):void 0,d=c.stateNode);d?void 0:D(\"147\",a);var e=\"\"+a;if(null!==b&&null!==b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs===ka?d.refs={}:d.refs;null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}\"string\"!==typeof a?D(\"148\"):void 0;c._owner?void 0:D(\"254\",a)}return a}\nfunction We(a,b){\"textarea\"!==a.type&&D(\"31\",\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\")}\nfunction Xe(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=ze(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function h(b){a&&null===b.alternate&&(b.effectTag=2);return b}function g(a,b,c,d){if(null===b||6!==b.tag)return b=Ce(c,a.mode,d),b[\"return\"]=a,b;b=e(b,c,d);b[\"return\"]=a;return b}function k(a,b,c,d){if(null!==b&&b.type===c.type)return d=e(b,c.props,d),d.ref=Ve(a,b,c),d[\"return\"]=a,d;d=Ae(c,a.mode,d);d.ref=Ve(a,b,c);d[\"return\"]=a;return d}function v(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=\nDe(c,a.mode,d),b[\"return\"]=a,b;b=e(b,c.children||[],d);b[\"return\"]=a;return b}function l(a,b,c,d,f){if(null===b||10!==b.tag)return b=Be(c,a.mode,d,f),b[\"return\"]=a,b;b=e(b,c,d);b[\"return\"]=a;return b}function p(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Ce(\"\"+b,a.mode,c),b[\"return\"]=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case oc:return c=Ae(b,a.mode,c),c.ref=Ve(a,null,b),c[\"return\"]=a,c;case rc:return b=De(b,a.mode,c),b[\"return\"]=a,b}if(Ue(b)||zc(b))return b=Be(b,\na.mode,c,null),b[\"return\"]=a,b;We(a,b)}return null}function z(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:g(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case oc:return c.key===e?c.type===sc?l(a,b,c.props.children,d,e):k(a,b,c,d):null;case rc:return c.key===e?v(a,b,c,d):null}if(Ue(c)||zc(c))return null!==e?null:l(a,b,c,d,null);We(a,c)}return null}function B(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=a.get(c)||\nnull,g(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case oc:return a=a.get(null===d.key?c:d.key)||null,d.type===sc?l(b,a,d.props.children,e,d.key):k(b,a,d,e);case rc:return a=a.get(null===d.key?c:d.key)||null,v(b,a,d,e)}if(Ue(d)||zc(d))return a=a.get(c)||null,l(b,a,d,e,null);We(b,d)}return null}function r(e,l,g,h){for(var r=null,k=null,q=l,u=l=0,t=null;null!==q&&u<g.length;u++){q.index>u?(t=q,q=null):t=q.sibling;var n=z(e,q,g[u],h);if(null===n){null===q&&(q=t);break}a&&q&&null===\nn.alternate&&b(e,q);l=f(n,l,u);null===k?r=n:k.sibling=n;k=n;q=t}if(u===g.length)return c(e,q),r;if(null===q){for(;u<g.length;u++)if(q=p(e,g[u],h))l=f(q,l,u),null===k?r=q:k.sibling=q,k=q;return r}for(q=d(e,q);u<g.length;u++)if(t=B(q,e,u,g[u],h)){if(a&&null!==t.alternate)q[\"delete\"](null===t.key?u:t.key);l=f(t,l,u);null===k?r=t:k.sibling=t;k=t}a&&q.forEach(function(a){return b(e,a)});return r}function Q(e,l,g,h){var r=zc(g);\"function\"!==typeof r?D(\"150\"):void 0;g=r.call(g);null==g?D(\"151\"):void 0;for(var k=\nr=null,q=l,u=l=0,t=null,n=g.next();null!==q&&!n.done;u++,n=g.next()){q.index>u?(t=q,q=null):t=q.sibling;var H=z(e,q,n.value,h);if(null===H){q||(q=t);break}a&&q&&null===H.alternate&&b(e,q);l=f(H,l,u);null===k?r=H:k.sibling=H;k=H;q=t}if(n.done)return c(e,q),r;if(null===q){for(;!n.done;u++,n=g.next())n=p(e,n.value,h),null!==n&&(l=f(n,l,u),null===k?r=n:k.sibling=n,k=n);return r}for(q=d(e,q);!n.done;u++,n=g.next())if(n=B(q,e,u,n.value,h),null!==n){if(a&&null!==n.alternate)q[\"delete\"](null===n.key?u:n.key);\nl=f(n,l,u);null===k?r=n:k.sibling=n;k=n}a&&q.forEach(function(a){return b(e,a)});return r}return function(a,d,f,l){\"object\"===typeof f&&null!==f&&f.type===sc&&null===f.key&&(f=f.props.children);var g=\"object\"===typeof f&&null!==f;if(g)switch(f.$$typeof){case oc:a:{var k=f.key;for(g=d;null!==g;){if(g.key===k)if(10===g.tag?f.type===sc:g.type===f.type){c(a,g.sibling);d=e(g,f.type===sc?f.props.children:f.props,l);d.ref=Ve(a,g,f);d[\"return\"]=a;a=d;break a}else{c(a,g);break}else b(a,g);g=g.sibling}f.type===\nsc?(d=Be(f.props.children,a.mode,l,f.key),d[\"return\"]=a,a=d):(l=Ae(f,a.mode,l),l.ref=Ve(a,d,f),l[\"return\"]=a,a=l)}return h(a);case rc:a:{for(g=f.key;null!==d;){if(d.key===g)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],l);d[\"return\"]=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=De(f,a.mode,l);d[\"return\"]=a;a=d}return h(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&\n6===d.tag?(c(a,d.sibling),d=e(d,f,l),d[\"return\"]=a,a=d):(c(a,d),d=Ce(f,a.mode,l),d[\"return\"]=a,a=d),h(a);if(Ue(f))return r(a,d,f,l);if(zc(f))return Q(a,d,f,l);g&&We(a,f);if(\"undefined\"===typeof f)switch(a.tag){case 2:case 1:l=a.type,D(\"152\",l.displayName||l.name||\"Component\")}return c(a,d)}}var Ye=Xe(!0),Ze=Xe(!1);\nfunction $e(a,b,c,d,e,f,h){function g(a,b,c){k(a,b,c,b.expirationTime)}function k(a,b,c,d){b.child=null===a?Ze(b,null,c,d):Ye(b,a.child,c,d)}function v(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function l(a,b,c,d,e,f){v(a,b);if(!c&&!e)return d&&y(b,!1),r(a,b);c=b.stateNode;nc.current=b;var l=e?null:c.render();b.effectTag|=1;e&&(k(a,b,null,f),b.child=null);k(a,b,l,f);b.memoizedState=c.state;b.memoizedProps=c.props;d&&y(b,!0);return b.child}function p(a){var b=a.stateNode;\nb.pendingContext?t(a,b.pendingContext,b.pendingContext!==b.context):b.context&&t(a,b.context,!1);Y(a,b.containerInfo)}function z(a,b,c,d){var e=a.child;for(null!==e&&(e[\"return\"]=a);null!==e;){switch(e.tag){case 12:var f=e.stateNode|0;if(e.type===b&&0!==(f&c)){for(f=e;null!==f;){var l=f.alternate;if(0===f.expirationTime||f.expirationTime>d)f.expirationTime=d,null!==l&&(0===l.expirationTime||l.expirationTime>d)&&(l.expirationTime=d);else if(null!==l&&(0===l.expirationTime||l.expirationTime>d))l.expirationTime=\nd;else break;f=f[\"return\"]}f=null}else f=e.child;break;case 13:f=e.type===a.type?null:e.child;break;default:f=e.child}if(null!==f)f[\"return\"]=e;else for(f=e;null!==f;){if(f===a){f=null;break}e=f.sibling;if(null!==e){f=e;break}f=f[\"return\"]}e=f}}function B(a,b,c){var d=b.type._context,e=b.pendingProps,f=b.memoizedProps;if(!q()&&f===e)return b.stateNode=0,G(b),r(a,b);var l=e.value;b.memoizedProps=e;if(null===f)l=1073741823;else if(f.value===e.value){if(f.children===e.children)return b.stateNode=0,G(b),\nr(a,b);l=0}else{var h=f.value;if(h===l&&(0!==h||1/h===1/l)||h!==h&&l!==l){if(f.children===e.children)return b.stateNode=0,G(b),r(a,b);l=0}else if(l=\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,l):1073741823,l|=0,0===l){if(f.children===e.children)return b.stateNode=0,G(b),r(a,b)}else z(b,d,l,c)}b.stateNode=l;G(b);g(a,b,e.children);return b.child}function r(a,b){null!==a&&b.child!==a.child?D(\"153\"):void 0;if(null!==b.child){a=b.child;var c=ze(a,a.pendingProps,a.expirationTime);\nb.child=c;for(c[\"return\"]=b;null!==a.sibling;)a=a.sibling,c=c.sibling=ze(a,a.pendingProps,a.expirationTime),c[\"return\"]=b;c.sibling=null}return b.child}var Q=a.shouldSetTextContent,n=a.shouldDeprioritizeSubtree,x=b.pushHostContext,Y=b.pushHostContainer,G=d.pushProvider,R=c.getMaskedContext,S=c.getUnmaskedContext,q=c.hasContextChanged,u=c.pushContextProvider,t=c.pushTopLevelContextObject,y=c.invalidateContextProvider,H=e.enterHydrationState,Wa=e.resetHydrationState,Cb=e.tryToClaimNextHydratableInstance;\na=Te(c,f,h,function(a,b){a.memoizedProps=b},function(a,b){a.memoizedState=b});var Jc=a.adoptClassInstance,Kc=a.callGetDerivedStateFromProps,Lc=a.constructClassInstance,Db=a.mountClassInstance,Mc=a.resumeMountClassInstance,Eb=a.updateClassInstance;return{beginWork:function(a,b,c){if(0===b.expirationTime||b.expirationTime>c){switch(b.tag){case 3:p(b);break;case 2:u(b);break;case 4:Y(b,b.stateNode.containerInfo);break;case 13:G(b)}return null}switch(b.tag){case 0:null!==a?D(\"155\"):void 0;var d=b.type,\ne=b.pendingProps,f=S(b);f=R(b,f);d=d(e,f);b.effectTag|=1;\"object\"===typeof d&&null!==d&&\"function\"===typeof d.render&&void 0===d.$$typeof?(f=b.type,b.tag=2,b.memoizedState=null!==d.state&&void 0!==d.state?d.state:null,\"function\"===typeof f.getDerivedStateFromProps&&(e=Kc(b,d,e,b.memoizedState),null!==e&&void 0!==e&&(b.memoizedState=A({},b.memoizedState,e))),e=u(b),Jc(b,d),Db(b,c),a=l(a,b,!0,e,!1,c)):(b.tag=1,g(a,b,d),b.memoizedProps=e,a=b.child);return a;case 1:return e=b.type,c=b.pendingProps,q()||\nb.memoizedProps!==c?(d=S(b),d=R(b,d),e=e(c,d),b.effectTag|=1,g(a,b,e),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 2:e=u(b);null===a?null===b.stateNode?(Lc(b,b.pendingProps),Db(b,c),d=!0):d=Mc(b,c):d=Eb(a,b,c);f=!1;var h=b.updateQueue;null!==h&&null!==h.capturedValues&&(f=d=!0);return l(a,b,d,e,f,c);case 3:a:if(p(b),d=b.updateQueue,null!==d){f=b.memoizedState;e=Re(a,b,d,null,null,c);b.memoizedState=e;d=b.updateQueue;if(null!==d&&null!==d.capturedValues)d=null;else if(f===e){Wa();a=r(a,b);break a}else d=\ne.element;f=b.stateNode;(null===a||null===a.child)&&f.hydrate&&H(b)?(b.effectTag|=2,b.child=Ze(b,null,d,c)):(Wa(),g(a,b,d));b.memoizedState=e;a=b.child}else Wa(),a=r(a,b);return a;case 5:a:{x(b);null===a&&Cb(b);e=b.type;h=b.memoizedProps;d=b.pendingProps;f=null!==a?a.memoizedProps:null;if(!q()&&h===d){if(h=b.mode&1&&n(e,d))b.expirationTime=1073741823;if(!h||1073741823!==c){a=r(a,b);break a}}h=d.children;Q(e,d)?h=null:f&&Q(e,f)&&(b.effectTag|=16);v(a,b);1073741823!==c&&b.mode&1&&n(e,d)?(b.expirationTime=\n1073741823,b.memoizedProps=d,a=null):(g(a,b,h),b.memoizedProps=d,a=b.child)}return a;case 6:return null===a&&Cb(b),b.memoizedProps=b.pendingProps,null;case 8:b.tag=7;case 7:return e=b.pendingProps,q()||b.memoizedProps!==e||(e=b.memoizedProps),d=e.children,b.stateNode=null===a?Ze(b,b.stateNode,d,c):Ye(b,a.stateNode,d,c),b.memoizedProps=e,b.stateNode;case 9:return null;case 4:return Y(b,b.stateNode.containerInfo),e=b.pendingProps,q()||b.memoizedProps!==e?(null===a?b.child=Ye(b,null,e,c):g(a,b,e),b.memoizedProps=\ne,a=b.child):a=r(a,b),a;case 14:return c=b.type.render,c=c(b.pendingProps,b.ref),g(a,b,c),b.memoizedProps=c,b.child;case 10:return c=b.pendingProps,q()||b.memoizedProps!==c?(g(a,b,c),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 11:return c=b.pendingProps.children,q()||null!==c&&b.memoizedProps!==c?(g(a,b,c),b.memoizedProps=c,a=b.child):a=r(a,b),a;case 13:return B(a,b,c);case 12:a:{d=b.type;f=b.pendingProps;h=b.memoizedProps;e=d._currentValue;var t=d._changedBits;if(q()||0!==t||h!==f){b.memoizedProps=\nf;var k=f.unstable_observedBits;if(void 0===k||null===k)k=1073741823;b.stateNode=k;if(0!==(t&k))z(b,d,t,c);else if(h===f){a=r(a,b);break a}c=f.children;c=c(e);g(a,b,c);a=b.child}else a=r(a,b)}return a;default:D(\"156\")}}}}\nfunction af(a,b,c,d,e){function f(a){a.effectTag|=4}var h=a.createInstance,g=a.createTextInstance,k=a.appendInitialChild,v=a.finalizeInitialChildren,l=a.prepareUpdate,p=a.persistence,z=b.getRootHostContainer,B=b.popHostContext,r=b.getHostContext,Q=b.popHostContainer,n=c.popContextProvider,x=c.popTopLevelContextObject,Y=d.popProvider,G=e.prepareToHydrateHostInstance,R=e.prepareToHydrateHostTextInstance,S=e.popHydrationState,q=void 0,u=void 0,t=void 0;a.mutation?(q=function(){},u=function(a,b,c){(b.updateQueue=\nc)&&f(b)},t=function(a,b,c,d){c!==d&&f(b)}):p?D(\"235\"):D(\"236\");return{completeWork:function(a,b,c){var d=b.pendingProps;switch(b.tag){case 1:return null;case 2:return n(b),a=b.stateNode,d=b.updateQueue,null!==d&&null!==d.capturedValues&&(b.effectTag&=-65,\"function\"===typeof a.componentDidCatch?b.effectTag|=256:d.capturedValues=null),null;case 3:Q(b);x(b);d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)S(b),b.effectTag&=-3;q(b);a=b.updateQueue;\nnull!==a&&null!==a.capturedValues&&(b.effectTag|=256);return null;case 5:B(b);c=z();var e=b.type;if(null!==a&&null!=b.stateNode){var p=a.memoizedProps,H=b.stateNode,y=r();H=l(H,e,p,d,c,y);u(a,b,H,e,p,d,c,y);a.ref!==b.ref&&(b.effectTag|=128)}else{if(!d)return null===b.stateNode?D(\"166\"):void 0,null;a=r();if(S(b))G(b,c,a)&&f(b);else{p=h(e,d,c,a,b);a:for(y=b.child;null!==y;){if(5===y.tag||6===y.tag)k(p,y.stateNode);else if(4!==y.tag&&null!==y.child){y.child[\"return\"]=y;y=y.child;continue}if(y===b)break;\nfor(;null===y.sibling;){if(null===y[\"return\"]||y[\"return\"]===b)break a;y=y[\"return\"]}y.sibling[\"return\"]=y[\"return\"];y=y.sibling}v(p,e,d,c,a)&&f(b);b.stateNode=p}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)t(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d)return null===b.stateNode?D(\"166\"):void 0,null;a=z();c=r();S(b)?R(b)&&f(b):b.stateNode=g(d,a,c,b)}return null;case 7:(d=b.memoizedProps)?void 0:D(\"165\");b.tag=8;e=[];a:for((p=b.stateNode)&&(p[\"return\"]=b);null!==\np;){if(5===p.tag||6===p.tag||4===p.tag)D(\"247\");else if(9===p.tag)e.push(p.pendingProps.value);else if(null!==p.child){p.child[\"return\"]=p;p=p.child;continue}for(;null===p.sibling;){if(null===p[\"return\"]||p[\"return\"]===b)break a;p=p[\"return\"]}p.sibling[\"return\"]=p[\"return\"];p=p.sibling}p=d.handler;d=p(d.props,e);b.child=Ye(b,null!==a?a.child:null,d,c);return b.child;case 8:return b.tag=7,null;case 9:return null;case 14:return null;case 10:return null;case 11:return null;case 4:return Q(b),q(b),null;\ncase 13:return Y(b),null;case 12:return null;case 0:D(\"167\");default:D(\"156\")}}}}\nfunction bf(a,b,c,d,e){var f=a.popHostContainer,h=a.popHostContext,g=b.popContextProvider,k=b.popTopLevelContextObject,v=c.popProvider;return{throwException:function(a,b,c){b.effectTag|=512;b.firstEffect=b.lastEffect=null;b={value:c,source:b,stack:Bc(b)};do{switch(a.tag){case 3:Oe(a);a.updateQueue.capturedValues=[b];a.effectTag|=1024;return;case 2:if(c=a.stateNode,0===(a.effectTag&64)&&null!==c&&\"function\"===typeof c.componentDidCatch&&!e(c)){Oe(a);c=a.updateQueue;var d=c.capturedValues;null===d?\nc.capturedValues=[b]:d.push(b);a.effectTag|=1024;return}}a=a[\"return\"]}while(null!==a)},unwindWork:function(a){switch(a.tag){case 2:g(a);var b=a.effectTag;return b&1024?(a.effectTag=b&-1025|64,a):null;case 3:return f(a),k(a),b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 5:return h(a),null;case 4:return f(a),null;case 13:return v(a),null;default:return null}},unwindInterruptedWork:function(a){switch(a.tag){case 2:g(a);break;case 3:f(a);k(a);break;case 5:h(a);break;case 4:f(a);break;case 13:v(a)}}}}\nfunction cf(a,b){var c=b.source;null===b.stack&&Bc(c);null!==c&&Ac(c);b=b.value;null!==a&&2===a.tag&&Ac(a);try{b&&b.suppressReactErrorLogging||console.error(b)}catch(d){d&&d.suppressReactErrorLogging||console.error(d)}}\nfunction df(a,b,c,d,e){function f(a){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(t){b(a,t)}else c.current=null}function h(a){\"function\"===typeof Je&&Je(a);switch(a.tag){case 2:f(a);var c=a.stateNode;if(\"function\"===typeof c.componentWillUnmount)try{c.props=a.memoizedProps,c.state=a.memoizedState,c.componentWillUnmount()}catch(t){b(a,t)}break;case 5:f(a);break;case 7:g(a.stateNode);break;case 4:p&&v(a)}}function g(a){for(var b=a;;)if(h(b),null===b.child||p&&4===b.tag){if(b===\na)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}else b.child[\"return\"]=b,b=b.child}function k(a){return 5===a.tag||3===a.tag||4===a.tag}function v(a){for(var b=a,c=!1,d=void 0,e=void 0;;){if(!c){c=b[\"return\"];a:for(;;){null===c?D(\"160\"):void 0;switch(c.tag){case 5:d=c.stateNode;e=!1;break a;case 3:d=c.stateNode.containerInfo;e=!0;break a;case 4:d=c.stateNode.containerInfo;e=!0;break a}c=c[\"return\"]}c=!0}if(5===\nb.tag||6===b.tag)g(b),e?S(d,b.stateNode):R(d,b.stateNode);else if(4===b.tag?d=b.stateNode.containerInfo:h(b),null!==b.child){b.child[\"return\"]=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"];4===b.tag&&(c=!1)}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}var l=a.getPublicInstance,p=a.mutation;a=a.persistence;p||(a?D(\"235\"):D(\"236\"));var z=p.commitMount,B=p.commitUpdate,r=p.resetTextContent,Q=p.commitTextUpdate,n=p.appendChild,\nx=p.appendChildToContainer,Y=p.insertBefore,G=p.insertInContainerBefore,R=p.removeChild,S=p.removeChildFromContainer;return{commitBeforeMutationLifeCycles:function(a,b){switch(b.tag){case 2:if(b.effectTag&2048&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;a.props=b.memoizedProps;a.state=b.memoizedState;b=a.getSnapshotBeforeUpdate(c,d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:break;default:D(\"163\")}},commitResetTextContent:function(a){r(a.stateNode)},\ncommitPlacement:function(a){a:{for(var b=a[\"return\"];null!==b;){if(k(b)){var c=b;break a}b=b[\"return\"]}D(\"160\");c=void 0}var d=b=void 0;switch(c.tag){case 5:b=c.stateNode;d=!1;break;case 3:b=c.stateNode.containerInfo;d=!0;break;case 4:b=c.stateNode.containerInfo;d=!0;break;default:D(\"161\")}c.effectTag&16&&(r(b),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c[\"return\"]||k(c[\"return\"])){c=null;break a}c=c[\"return\"]}c.sibling[\"return\"]=c[\"return\"];for(c=c.sibling;5!==c.tag&&6!==\nc.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;else c.child[\"return\"]=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){if(5===e.tag||6===e.tag)c?d?G(b,e.stateNode,c):Y(b,e.stateNode,c):d?x(b,e.stateNode):n(b,e.stateNode);else if(4!==e.tag&&null!==e.child){e.child[\"return\"]=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e[\"return\"]||e[\"return\"]===a)return;e=e[\"return\"]}e.sibling[\"return\"]=e[\"return\"];e=e.sibling}},commitDeletion:function(a){v(a);\na[\"return\"]=null;a.child=null;a.alternate&&(a.alternate.child=null,a.alternate[\"return\"]=null)},commitWork:function(a,b){switch(b.tag){case 2:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps;a=null!==a?a.memoizedProps:d;var e=b.type,f=b.updateQueue;b.updateQueue=null;null!==f&&B(c,f,e,a,d,b)}break;case 6:null===b.stateNode?D(\"162\"):void 0;c=b.memoizedProps;Q(b.stateNode,null!==a?a.memoizedProps:c,c);break;case 3:break;default:D(\"163\")}},commitLifeCycles:function(a,b,c){switch(c.tag){case 2:a=\nc.stateNode;if(c.effectTag&4)if(null===b)a.props=c.memoizedProps,a.state=c.memoizedState,a.componentDidMount();else{var d=b.memoizedProps;b=b.memoizedState;a.props=c.memoizedProps;a.state=c.memoizedState;a.componentDidUpdate(d,b,a.__reactInternalSnapshotBeforeUpdate)}c=c.updateQueue;null!==c&&Se(c,a);break;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=l(c.child.stateNode);break;case 2:a=c.child.stateNode}Se(b,a)}break;case 5:a=c.stateNode;null===b&&c.effectTag&\n4&&z(a,c.type,c.memoizedProps,c);break;case 6:break;case 4:break;default:D(\"163\")}},commitErrorLogging:function(a,b){switch(a.tag){case 2:var c=a.type;b=a.stateNode;var d=a.updateQueue;null===d||null===d.capturedValues?D(\"264\"):void 0;var f=d.capturedValues;d.capturedValues=null;\"function\"!==typeof c.getDerivedStateFromCatch&&e(b);b.props=a.memoizedProps;b.state=a.memoizedState;for(c=0;c<f.length;c++){d=f[c];var l=d.value,g=d.stack;cf(a,d);b.componentDidCatch(l,{componentStack:null!==g?g:\"\"})}break;\ncase 3:c=a.updateQueue;null===c||null===c.capturedValues?D(\"264\"):void 0;f=c.capturedValues;c.capturedValues=null;for(c=0;c<f.length;c++)d=f[c],cf(a,d),b(d.value);break;default:D(\"265\")}},commitAttachRef:function(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=l(c);break;default:a=c}\"function\"===typeof b?b(a):b.current=a}},commitDetachRef:function(a){a=a.ref;null!==a&&(\"function\"===typeof a?a(null):a.current=null)}}}var ef={};\nfunction ff(a,b){function c(a){a===ef?D(\"174\"):void 0;return a}var d=a.getChildHostContext,e=a.getRootHostContext;a=b.createCursor;var f=b.push,h=b.pop,g=a(ef),k=a(ef),v=a(ef);return{getHostContext:function(){return c(g.current)},getRootHostContainer:function(){return c(v.current)},popHostContainer:function(a){h(g,a);h(k,a);h(v,a)},popHostContext:function(a){k.current===a&&(h(g,a),h(k,a))},pushHostContainer:function(a,b){f(v,b,a);f(k,a,a);f(g,ef,a);b=e(b);h(g,a);f(g,b,a)},pushHostContext:function(a){var b=\nc(v.current),e=c(g.current);b=d(e,a.type,b);e!==b&&(f(k,a,a),f(g,b,a))}}}\nfunction gf(a){function b(a,b){var c=new xe(5,null,null,0);c.type=\"DELETED\";c.stateNode=b;c[\"return\"]=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function c(a,b){switch(a.tag){case 5:return b=f(b,a.type,a.pendingProps),null!==b?(a.stateNode=b,!0):!1;case 6:return b=h(b,a.pendingProps),null!==b?(a.stateNode=b,!0):!1;default:return!1}}function d(a){for(a=a[\"return\"];null!==a&&5!==a.tag&&3!==a.tag;)a=a[\"return\"];p=a}var e=a.shouldSetTextContent;\na=a.hydration;if(!a)return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){D(\"175\")},prepareToHydrateHostTextInstance:function(){D(\"176\")},popHydrationState:function(){return!1}};var f=a.canHydrateInstance,h=a.canHydrateTextInstance,g=a.getNextHydratableSibling,k=a.getFirstHydratableChild,v=a.hydrateInstance,l=a.hydrateTextInstance,p=null,z=null,B=!1;return{enterHydrationState:function(a){z=\nk(a.stateNode.containerInfo);p=a;return B=!0},resetHydrationState:function(){z=p=null;B=!1},tryToClaimNextHydratableInstance:function(a){if(B){var d=z;if(d){if(!c(a,d)){d=g(d);if(!d||!c(a,d)){a.effectTag|=2;B=!1;p=a;return}b(p,z)}p=a;z=k(d)}else a.effectTag|=2,B=!1,p=a}},prepareToHydrateHostInstance:function(a,b,c){b=v(a.stateNode,a.type,a.memoizedProps,b,c,a);a.updateQueue=b;return null!==b?!0:!1},prepareToHydrateHostTextInstance:function(a){return l(a.stateNode,a.memoizedProps,a)},popHydrationState:function(a){if(a!==\np)return!1;if(!B)return d(a),B=!0,!1;var c=a.type;if(5!==a.tag||\"head\"!==c&&\"body\"!==c&&!e(c,a.memoizedProps))for(c=z;c;)b(a,c),c=g(c);d(a);z=p?g(a.stateNode):null;return!0}}}\nfunction hf(a){function b(a,b,c){a=a.stateNode;a.__reactInternalMemoizedUnmaskedChildContext=b;a.__reactInternalMemoizedMaskedChildContext=c}function c(a){return 2===a.tag&&null!=a.type.childContextTypes}function d(a,b){var c=a.stateNode,d=a.type.childContextTypes;if(\"function\"!==typeof c.getChildContext)return b;c=c.getChildContext();for(var e in c)e in d?void 0:D(\"108\",Ac(a)||\"Unknown\",e);return A({},b,c)}var e=a.createCursor,f=a.push,h=a.pop,g=e(ka),k=e(!1),v=ka;return{getUnmaskedContext:function(a){return c(a)?\nv:g.current},cacheContext:b,getMaskedContext:function(a,c){var d=a.type.contextTypes;if(!d)return ka;var e=a.stateNode;if(e&&e.__reactInternalMemoizedUnmaskedChildContext===c)return e.__reactInternalMemoizedMaskedChildContext;var f={},g;for(g in d)f[g]=c[g];e&&b(a,c,f);return f},hasContextChanged:function(){return k.current},isContextConsumer:function(a){return 2===a.tag&&null!=a.type.contextTypes},isContextProvider:c,popContextProvider:function(a){c(a)&&(h(k,a),h(g,a))},popTopLevelContextObject:function(a){h(k,\na);h(g,a)},pushTopLevelContextObject:function(a,b,c){null!=g.cursor?D(\"168\"):void 0;f(g,b,a);f(k,c,a)},processChildContext:d,pushContextProvider:function(a){if(!c(a))return!1;var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||ka;v=g.current;f(g,b,a);f(k,k.current,a);return!0},invalidateContextProvider:function(a,b){var c=a.stateNode;c?void 0:D(\"169\");if(b){var e=d(a,v);c.__reactInternalMemoizedMergedChildContext=e;h(k,a);h(g,a);f(g,e,a)}else h(k,a);f(k,b,a)},findCurrentUnmaskedContext:function(a){for(2!==\nxd(a)||2!==a.tag?D(\"170\"):void 0;3!==a.tag;){if(c(a))return a.stateNode.__reactInternalMemoizedMergedChildContext;(a=a[\"return\"])?void 0:D(\"171\")}return a.stateNode.context}}}\nfunction jf(a){var b=a.createCursor,c=a.push,d=a.pop,e=b(null),f=b(null),h=b(0);return{pushProvider:function(a){var b=a.type._context;c(h,b._changedBits,a);c(f,b._currentValue,a);c(e,a,a);b._currentValue=a.pendingProps.value;b._changedBits=a.stateNode},popProvider:function(a){var b=h.current,c=f.current;d(e,a);d(f,a);d(h,a);a=a.type._context;a._currentValue=c;a._changedBits=b}}}\nfunction kf(){var a=[],b=-1;return{createCursor:function(a){return{current:a}},isEmpty:function(){return-1===b},pop:function(c){0>b||(c.current=a[b],a[b]=null,b--)},push:function(c,d){b++;a[b]=c.current;c.current=d},checkThatStackIsEmpty:function(){},resetStackAfterFatalErrorInDev:function(){}}}\nfunction lf(a){function b(){if(null!==I)for(var a=I[\"return\"];null!==a;)Lc(a),a=a[\"return\"];Ya=null;Z=0;I=null;Nc=!1}function c(a){return null!==ya&&ya.has(a)}function d(a){for(;;){var b=a.alternate,c=a[\"return\"],d=a.sibling;if(0===(a.effectTag&512)){b=Cb(b,a,Z);var e=a;if(1073741823===Z||1073741823!==e.expirationTime){b:switch(e.tag){case 3:case 2:var f=e.updateQueue;f=null===f?0:f.expirationTime;break b;default:f=0}for(var g=e.child;null!==g;)0!==g.expirationTime&&(0===f||f>g.expirationTime)&&(f=\ng.expirationTime),g=g.sibling;e.expirationTime=f}if(null!==b)return b;null!==c&&0===(c.effectTag&512)&&(null===c.firstEffect&&(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1<a.effectTag&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a));if(null!==d)return d;if(null!==c)a=c;else{Nc=!0;break}}else{a=Kc(a);if(null!==a)return a.effectTag&=2559,a;null!==c&&(c.firstEffect=c.lastEffect=\nnull,c.effectTag|=512);if(null!==d)return d;if(null!==c)a=c;else break}}return null}function e(a){var b=Wa(a.alternate,a,Z);null===b&&(b=d(a));nc.current=null;return b}function f(a,c,f){ca?D(\"243\"):void 0;ca=!0;if(c!==Z||a!==Ya||null===I)b(),Ya=a,Z=c,I=ze(Ya.current,null,Z),a.pendingCommitExpirationTime=0;var g=!1;do{try{if(f)for(;null!==I&&!S();)I=e(I);else for(;null!==I;)I=e(I)}catch(Oc){if(null===I){g=!0;q(Oc);break}f=I;var h=f[\"return\"];if(null===h){g=!0;q(Oc);break}Jc(h,f,Oc);I=d(f)}break}while(1);\nca=!1;if(g||null!==I)return null;if(Nc)return a.pendingCommitExpirationTime=c,a.current.alternate;D(\"262\")}function h(a,b,c,d){a={value:c,source:a,stack:Bc(a)};Pe(b,{expirationTime:d,partialState:null,callback:null,isReplace:!1,isForced:!1,capturedValue:a,next:null});v(b,d)}function g(a,b){a:{ca&&!Za?D(\"263\"):void 0;for(var d=a[\"return\"];null!==d;){switch(d.tag){case 2:var e=d.stateNode;if(\"function\"===typeof d.type.getDerivedStateFromCatch||\"function\"===typeof e.componentDidCatch&&!c(e)){h(a,d,b,\n1);a=void 0;break a}break;case 3:h(a,d,b,1);a=void 0;break a}d=d[\"return\"]}3===a.tag&&h(a,a,b,1);a=void 0}return a}function k(a){a=0!==ia?ia:ca?Za?1:Z:a.mode&1?za?10*(((l()+15)/10|0)+1):25*(((l()+500)/25|0)+1):1;za&&(0===da||a>da)&&(da=a);return a}function v(a,c){a:{for(;null!==a;){if(0===a.expirationTime||a.expirationTime>c)a.expirationTime=c;null!==a.alternate&&(0===a.alternate.expirationTime||a.alternate.expirationTime>c)&&(a.alternate.expirationTime=c);if(null===a[\"return\"])if(3===a.tag){var d=\na.stateNode;!ca&&0!==Z&&c<Z&&b();ca&&!Za&&Ya===d||B(d,c);Fb>xg&&D(\"185\")}else{c=void 0;break a}a=a[\"return\"]}c=void 0}return c}function l(){ye=Ic()-Pc;return yg=(ye/10|0)+2}function p(a,b,c,d,e){var f=ia;ia=1;try{return a(b,c,d,e)}finally{ia=f}}function z(a){if(0!==Gb){if(a>Gb)return;mg(Qc)}var b=Ic()-Pc;Gb=a;Qc=lg(Q,{timeout:10*(a-2)-b})}function B(a,b){if(null===a.nextScheduledRoot)a.remainingExpirationTime=b,null===K?(la=K=a,a.nextScheduledRoot=a):(K=K.nextScheduledRoot=a,K.nextScheduledRoot=la);\nelse{var c=a.remainingExpirationTime;if(0===c||b<c)a.remainingExpirationTime=b}T||(J?Hb&&(aa=a,P=1,G(a,1,!1)):1===b?n():z(b))}function r(){var a=0,b=null;if(null!==K)for(var c=K,d=la;null!==d;){var e=d.remainingExpirationTime;if(0===e){null===c||null===K?D(\"244\"):void 0;if(d===d.nextScheduledRoot){la=K=d.nextScheduledRoot=null;break}else if(d===la)la=e=d.nextScheduledRoot,K.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===K){K=c;K.nextScheduledRoot=la;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=\nd.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{if(0===a||e<a)a=e,b=d;if(d===K)break;c=d;d=d.nextScheduledRoot}}c=aa;null!==c&&c===b&&1===a?Fb++:Fb=0;aa=b;P=a}function Q(a){x(0,!0,a)}function n(){x(1,!1,null)}function x(a,b,c){$a=c;r();if(b)for(;null!==aa&&0!==P&&(0===a||a>=P)&&(!Ib||l()>=P);)G(aa,P,!Ib),r();else for(;null!==aa&&0!==P&&(0===a||a>=P);)G(aa,P,!1),r();null!==$a&&(Gb=0,Qc=-1);0!==P&&z(P);$a=null;Ib=!1;Y()}function Y(){Fb=0;if(null!==Aa){var a=Aa;Aa=null;for(var b=\n0;b<a.length;b++){var c=a[b];try{c._onComplete()}catch(wg){Ba||(Ba=!0,Jb=wg)}}}if(Ba)throw a=Jb,Jb=null,Ba=!1,a;}function G(a,b,c){T?D(\"245\"):void 0;T=!0;c?(c=a.finishedWork,null!==c?R(a,c,b):(a.finishedWork=null,c=f(a,b,!0),null!==c&&(S()?a.finishedWork=c:R(a,c,b)))):(c=a.finishedWork,null!==c?R(a,c,b):(a.finishedWork=null,c=f(a,b,!1),null!==c&&R(a,c,b)));T=!1}function R(a,b,c){var d=a.firstBatch;if(null!==d&&d._expirationTime<=c&&(null===Aa?Aa=[d]:Aa.push(d),d._defer)){a.finishedWork=b;a.remainingExpirationTime=\n0;return}a.finishedWork=null;Za=ca=!0;c=b.stateNode;c.current===b?D(\"177\"):void 0;d=c.pendingCommitExpirationTime;0===d?D(\"261\"):void 0;c.pendingCommitExpirationTime=0;var e=l();nc.current=null;if(1<b.effectTag)if(null!==b.lastEffect){b.lastEffect.nextEffect=b;var f=b.firstEffect}else f=b;else f=b.firstEffect;zg(c.containerInfo);for(w=f;null!==w;){var h=!1,k=void 0;try{for(;null!==w;)w.effectTag&2048&&Db(w.alternate,w),w=w.nextEffect}catch(ab){h=!0,k=ab}h&&(null===w?D(\"178\"):void 0,g(w,k),null!==\nw&&(w=w.nextEffect))}for(w=f;null!==w;){h=!1;k=void 0;try{for(;null!==w;){var p=w.effectTag;p&16&&Mc(w);if(p&128){var n=w.alternate;null!==n&&kg(n)}switch(p&14){case 2:Eb(w);w.effectTag&=-3;break;case 6:Eb(w);w.effectTag&=-3;we(w.alternate,w);break;case 4:we(w.alternate,w);break;case 8:gg(w)}w=w.nextEffect}}catch(ab){h=!0,k=ab}h&&(null===w?D(\"178\"):void 0,g(w,k),null!==w&&(w=w.nextEffect))}Ag(c.containerInfo);c.current=b;for(w=f;null!==w;){p=!1;n=void 0;try{for(f=c,h=e,k=d;null!==w;){var r=w.effectTag;\nr&36&&hg(f,w.alternate,w,h,k);r&256&&ig(w,q);r&128&&jg(w);var t=w.nextEffect;w.nextEffect=null;w=t}}catch(ab){p=!0,n=ab}p&&(null===w?D(\"178\"):void 0,g(w,n),null!==w&&(w=w.nextEffect))}ca=Za=!1;\"function\"===typeof Ie&&Ie(b.stateNode);b=c.current.expirationTime;0===b&&(ya=null);a.remainingExpirationTime=b}function S(){return null===$a||$a.timeRemaining()>Bg?!1:Ib=!0}function q(a){null===aa?D(\"246\"):void 0;aa.remainingExpirationTime=0;Ba||(Ba=!0,Jb=a)}var u=kf(),t=ff(a,u),y=hf(u);u=jf(u);var H=gf(a),\nWa=$e(a,t,y,u,H,v,k).beginWork,Cb=af(a,t,y,u,H).completeWork;t=bf(t,y,u,v,c);var Jc=t.throwException,Kc=t.unwindWork,Lc=t.unwindInterruptedWork;t=df(a,g,v,k,function(a){null===ya?ya=new Set([a]):ya.add(a)},l);var Db=t.commitBeforeMutationLifeCycles,Mc=t.commitResetTextContent,Eb=t.commitPlacement,gg=t.commitDeletion,we=t.commitWork,hg=t.commitLifeCycles,ig=t.commitErrorLogging,jg=t.commitAttachRef,kg=t.commitDetachRef,Ic=a.now,lg=a.scheduleDeferredCallback,mg=a.cancelDeferredCallback,zg=a.prepareForCommit,\nAg=a.resetAfterCommit,Pc=Ic(),yg=2,ye=Pc,Rc=0,ia=0,ca=!1,I=null,Ya=null,Z=0,w=null,Za=!1,Nc=!1,ya=null,la=null,K=null,Gb=0,Qc=-1,T=!1,aa=null,P=0,da=0,Ib=!1,Ba=!1,Jb=null,$a=null,J=!1,Hb=!1,za=!1,Aa=null,xg=1E3,Fb=0,Bg=1;return{recalculateCurrentTime:l,computeExpirationForFiber:k,scheduleWork:v,requestWork:B,flushRoot:function(a,b){T?D(\"253\"):void 0;aa=a;P=b;G(a,b,!1);n();Y()},batchedUpdates:function(a,b){var c=J;J=!0;try{return a(b)}finally{(J=c)||T||n()}},unbatchedUpdates:function(a,b){if(J&&!Hb){Hb=\n!0;try{return a(b)}finally{Hb=!1}}return a(b)},flushSync:function(a,b){T?D(\"187\"):void 0;var c=J;J=!0;try{return p(a,b)}finally{J=c,n()}},flushControlled:function(a){var b=J;J=!0;try{p(a)}finally{(J=b)||T||x(1,!1,null)}},deferredUpdates:function(a){var b=ia;ia=25*(((l()+500)/25|0)+1);try{return a()}finally{ia=b}},syncUpdates:p,interactiveUpdates:function(a,b,c){if(za)return a(b,c);J||T||0===da||(x(da,!1,null),da=0);var d=za,e=J;J=za=!0;try{return a(b,c)}finally{za=d,(J=e)||T||n()}},flushInteractiveUpdates:function(){T||\n0===da||(x(da,!1,null),da=0)},computeUniqueAsyncExpiration:function(){var a=25*(((l()+500)/25|0)+1);a<=Rc&&(a=Rc+1);return Rc=a},legacyContext:y}}\nfunction mf(a){function b(a,b,c,d,e,h){d=b.current;if(c){c=c._reactInternalFiber;var l=g(c);c=k(c)?v(c,l):l}else c=ka;null===b.context?b.context=c:b.pendingContext=c;b=h;Pe(d,{expirationTime:e,partialState:{element:a},callback:void 0===b?null:b,isReplace:!1,isForced:!1,capturedValue:null,next:null});f(d,e);return e}var c=a.getPublicInstance;a=lf(a);var d=a.recalculateCurrentTime,e=a.computeExpirationForFiber,f=a.scheduleWork,h=a.legacyContext,g=h.findCurrentUnmaskedContext,k=h.isContextProvider,v=\nh.processChildContext;return{createContainer:function(a,b,c){b=new xe(3,null,null,b?3:0);a={current:b,containerInfo:a,pendingChildren:null,pendingCommitExpirationTime:0,finishedWork:null,context:null,pendingContext:null,hydrate:c,remainingExpirationTime:0,firstBatch:null,nextScheduledRoot:null};return b.stateNode=a},updateContainer:function(a,c,f,h){var g=c.current,k=d();g=e(g);return b(a,c,f,k,g,h)},updateContainerAtExpirationTime:function(a,c,e,f,g){var h=d();return b(a,c,e,h,f,g)},flushRoot:a.flushRoot,\nrequestWork:a.requestWork,computeUniqueAsyncExpiration:a.computeUniqueAsyncExpiration,batchedUpdates:a.batchedUpdates,unbatchedUpdates:a.unbatchedUpdates,deferredUpdates:a.deferredUpdates,syncUpdates:a.syncUpdates,interactiveUpdates:a.interactiveUpdates,flushInteractiveUpdates:a.flushInteractiveUpdates,flushControlled:a.flushControlled,flushSync:a.flushSync,getPublicRootInstance:function(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return c(a.child.stateNode);default:return a.child.stateNode}},\nfindHostInstance:function(a){var b=a._reactInternalFiber;void 0===b&&(\"function\"===typeof a.render?D(\"188\"):D(\"268\",Object.keys(a)));a=Bd(b);return null===a?null:a.stateNode},findHostInstanceWithNoPortals:function(a){a=Cd(a);return null===a?null:a.stateNode},injectIntoDevTools:function(a){var b=a.findFiberByHostInstance;return He(A({},a,{findHostInstanceByFiber:function(a){a=Bd(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null}}))}}}\nvar nf=Object.freeze({default:mf}),of=nf&&mf||nf,pf=of[\"default\"]?of[\"default\"]:of;function qf(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:rc,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}var rf=\"object\"===typeof performance&&\"function\"===typeof performance.now,sf=void 0;sf=rf?function(){return performance.now()}:function(){return Date.now()};var tf=void 0,uf=void 0;\nif(m.canUseDOM)if(\"function\"!==typeof requestIdleCallback||\"function\"!==typeof cancelIdleCallback){var vf=null,wf=!1,xf=-1,yf=!1,zf=0,Af=33,Bf=33,Cf=void 0;Cf=rf?{didTimeout:!1,timeRemaining:function(){var a=zf-performance.now();return 0<a?a:0}}:{didTimeout:!1,timeRemaining:function(){var a=zf-Date.now();return 0<a?a:0}};var Df=\"__reactIdleCallback$\"+Math.random().toString(36).slice(2);window.addEventListener(\"message\",function(a){if(a.source===window&&a.data===Df){wf=!1;a=sf();if(0>=zf-a)if(-1!==\nxf&&xf<=a)Cf.didTimeout=!0;else{yf||(yf=!0,requestAnimationFrame(Ef));return}else Cf.didTimeout=!1;xf=-1;a=vf;vf=null;null!==a&&a(Cf)}},!1);var Ef=function(a){yf=!1;var b=a-zf+Bf;b<Bf&&Af<Bf?(8>b&&(b=8),Bf=b<Af?Af:b):Af=b;zf=a+Bf;wf||(wf=!0,window.postMessage(Df,\"*\"))};tf=function(a,b){vf=a;null!=b&&\"number\"===typeof b.timeout&&(xf=sf()+b.timeout);yf||(yf=!0,requestAnimationFrame(Ef));return 0};uf=function(){vf=null;wf=!1;xf=-1}}else tf=window.requestIdleCallback,uf=window.cancelIdleCallback;else tf=\nfunction(a){return setTimeout(function(){a({timeRemaining:function(){return Infinity},didTimeout:!1})})},uf=function(a){clearTimeout(a)};function Ff(a){var b=\"\";ea.Children.forEach(a,function(a){null==a||\"string\"!==typeof a&&\"number\"!==typeof a||(b+=a)});return b}function Gf(a,b){a=A({children:void 0},b);if(b=Ff(b.children))a.children=b;return a}\nfunction Hf(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+c;b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction If(a,b){var c=b.value;a._wrapperState={initialValue:null!=c?c:b.defaultValue,wasMultiple:!!b.multiple}}function Jf(a,b){null!=b.dangerouslySetInnerHTML?D(\"91\"):void 0;return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Kf(a,b){var c=b.value;null==c&&(c=b.defaultValue,b=b.children,null!=b&&(null!=c?D(\"92\"):void 0,Array.isArray(b)&&(1>=b.length?void 0:D(\"93\"),b=b[0]),c=\"\"+b),null==c&&(c=\"\"));a._wrapperState={initialValue:\"\"+c}}\nfunction Lf(a,b){var c=b.value;null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=b.defaultValue)}function Mf(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var Nf={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Of(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Pf(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Of(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Qf=void 0,Rf=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Nf.svg||\"innerHTML\"in a)a.innerHTML=b;else{Qf=Qf||document.createElement(\"div\");Qf.innerHTML=\"\\x3csvg\\x3e\"+b+\"\\x3c/svg\\x3e\";for(b=Qf.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Sf(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar Tf={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,\nstopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Uf=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Tf).forEach(function(a){Uf.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Tf[b]=Tf[a]})});\nfunction Vf(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\");var e=c;var f=b[c];e=null==f||\"boolean\"===typeof f||\"\"===f?\"\":d||\"number\"!==typeof f||0===f||Tf.hasOwnProperty(e)&&Tf[e]?(\"\"+f).trim():f+\"px\";\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Wf=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Xf(a,b,c){b&&(Wf[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?D(\"137\",a,c()):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?D(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:D(\"61\")),null!=b.style&&\"object\"!==typeof b.style?D(\"62\",c()):void 0)}\nfunction Yf(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var Zf=C.thatReturns(\"\");\nfunction $f(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=ke(a);b=va[b];for(var d=0;d<b.length;d++){var e=b[d];c.hasOwnProperty(e)&&c[e]||(\"topScroll\"===e?Zd(\"topScroll\",\"scroll\",a):\"topFocus\"===e||\"topBlur\"===e?(Zd(\"topFocus\",\"focus\",a),Zd(\"topBlur\",\"blur\",a),c.topBlur=!0,c.topFocus=!0):\"topCancel\"===e?(ic(\"cancel\",!0)&&Zd(\"topCancel\",\"cancel\",a),c.topCancel=!0):\"topClose\"===e?(ic(\"close\",!0)&&Zd(\"topClose\",\"close\",a),c.topClose=!0):fe.hasOwnProperty(e)&&W(e,fe[e],a),c[e]=!0)}}\nfunction ag(a,b,c,d){c=9===c.nodeType?c:c.ownerDocument;d===Nf.html&&(d=Of(a));d===Nf.html?\"script\"===a?(a=c.createElement(\"div\"),a.innerHTML=\"\\x3cscript\\x3e\\x3c/script\\x3e\",a=a.removeChild(a.firstChild)):a=\"string\"===typeof b.is?c.createElement(a,{is:b.is}):c.createElement(a):a=c.createElementNS(d,a);return a}function bg(a,b){return(9===b.nodeType?b:b.ownerDocument).createTextNode(a)}\nfunction cg(a,b,c,d){var e=Yf(b,c);switch(b){case \"iframe\":case \"object\":W(\"topLoad\",\"load\",a);var f=c;break;case \"video\":case \"audio\":for(f in ge)ge.hasOwnProperty(f)&&W(f,ge[f],a);f=c;break;case \"source\":W(\"topError\",\"error\",a);f=c;break;case \"img\":case \"image\":case \"link\":W(\"topError\",\"error\",a);W(\"topLoad\",\"load\",a);f=c;break;case \"form\":W(\"topReset\",\"reset\",a);W(\"topSubmit\",\"submit\",a);f=c;break;case \"details\":W(\"topToggle\",\"toggle\",a);f=c;break;case \"input\":Wc(a,c);f=Vc(a,c);W(\"topInvalid\",\n\"invalid\",a);$f(d,\"onChange\");break;case \"option\":f=Gf(a,c);break;case \"select\":If(a,c);f=A({},c,{value:void 0});W(\"topInvalid\",\"invalid\",a);$f(d,\"onChange\");break;case \"textarea\":Kf(a,c);f=Jf(a,c);W(\"topInvalid\",\"invalid\",a);$f(d,\"onChange\");break;default:f=c}Xf(b,f,Zf);var h=f,g;for(g in h)if(h.hasOwnProperty(g)){var k=h[g];\"style\"===g?Vf(a,k,Zf):\"dangerouslySetInnerHTML\"===g?(k=k?k.__html:void 0,null!=k&&Rf(a,k)):\"children\"===g?\"string\"===typeof k?(\"textarea\"!==b||\"\"!==k)&&Sf(a,k):\"number\"===typeof k&&\nSf(a,\"\"+k):\"suppressContentEditableWarning\"!==g&&\"suppressHydrationWarning\"!==g&&\"autoFocus\"!==g&&(ua.hasOwnProperty(g)?null!=k&&$f(d,g):null!=k&&Uc(a,g,k,e))}switch(b){case \"input\":lc(a);ad(a,c);break;case \"textarea\":lc(a);Mf(a,c);break;case \"option\":null!=c.value&&a.setAttribute(\"value\",c.value);break;case \"select\":a.multiple=!!c.multiple;b=c.value;null!=b?Hf(a,!!c.multiple,b,!1):null!=c.defaultValue&&Hf(a,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof f.onClick&&(a.onclick=C)}}\nfunction dg(a,b,c,d,e){var f=null;switch(b){case \"input\":c=Vc(a,c);d=Vc(a,d);f=[];break;case \"option\":c=Gf(a,c);d=Gf(a,d);f=[];break;case \"select\":c=A({},c,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":c=Jf(a,c);d=Jf(a,d);f=[];break;default:\"function\"!==typeof c.onClick&&\"function\"===typeof d.onClick&&(a.onclick=C)}Xf(b,d,Zf);b=a=void 0;var h=null;for(a in c)if(!d.hasOwnProperty(a)&&c.hasOwnProperty(a)&&null!=c[a])if(\"style\"===a){var g=c[a];for(b in g)g.hasOwnProperty(b)&&(h||\n(h={}),h[b]=\"\")}else\"dangerouslySetInnerHTML\"!==a&&\"children\"!==a&&\"suppressContentEditableWarning\"!==a&&\"suppressHydrationWarning\"!==a&&\"autoFocus\"!==a&&(ua.hasOwnProperty(a)?f||(f=[]):(f=f||[]).push(a,null));for(a in d){var k=d[a];g=null!=c?c[a]:void 0;if(d.hasOwnProperty(a)&&k!==g&&(null!=k||null!=g))if(\"style\"===a)if(g){for(b in g)!g.hasOwnProperty(b)||k&&k.hasOwnProperty(b)||(h||(h={}),h[b]=\"\");for(b in k)k.hasOwnProperty(b)&&g[b]!==k[b]&&(h||(h={}),h[b]=k[b])}else h||(f||(f=[]),f.push(a,h)),\nh=k;else\"dangerouslySetInnerHTML\"===a?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(f=f||[]).push(a,\"\"+k)):\"children\"===a?g===k||\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(a,\"\"+k):\"suppressContentEditableWarning\"!==a&&\"suppressHydrationWarning\"!==a&&(ua.hasOwnProperty(a)?(null!=k&&$f(e,a),f||g===k||(f=[])):(f=f||[]).push(a,k))}h&&(f=f||[]).push(\"style\",h);return f}\nfunction eg(a,b,c,d,e){\"input\"===c&&\"radio\"===e.type&&null!=e.name&&Yc(a,e);Yf(c,d);d=Yf(c,e);for(var f=0;f<b.length;f+=2){var h=b[f],g=b[f+1];\"style\"===h?Vf(a,g,Zf):\"dangerouslySetInnerHTML\"===h?Rf(a,g):\"children\"===h?Sf(a,g):Uc(a,h,g,d)}switch(c){case \"input\":Zc(a,e);break;case \"textarea\":Lf(a,e);break;case \"select\":a._wrapperState.initialValue=void 0,b=a._wrapperState.wasMultiple,a._wrapperState.wasMultiple=!!e.multiple,c=e.value,null!=c?Hf(a,!!e.multiple,c,!1):b!==!!e.multiple&&(null!=e.defaultValue?\nHf(a,!!e.multiple,e.defaultValue,!0):Hf(a,!!e.multiple,e.multiple?[]:\"\",!1))}}\nfunction fg(a,b,c,d,e){switch(b){case \"iframe\":case \"object\":W(\"topLoad\",\"load\",a);break;case \"video\":case \"audio\":for(var f in ge)ge.hasOwnProperty(f)&&W(f,ge[f],a);break;case \"source\":W(\"topError\",\"error\",a);break;case \"img\":case \"image\":case \"link\":W(\"topError\",\"error\",a);W(\"topLoad\",\"load\",a);break;case \"form\":W(\"topReset\",\"reset\",a);W(\"topSubmit\",\"submit\",a);break;case \"details\":W(\"topToggle\",\"toggle\",a);break;case \"input\":Wc(a,c);W(\"topInvalid\",\"invalid\",a);$f(e,\"onChange\");break;case \"select\":If(a,\nc);W(\"topInvalid\",\"invalid\",a);$f(e,\"onChange\");break;case \"textarea\":Kf(a,c),W(\"topInvalid\",\"invalid\",a),$f(e,\"onChange\")}Xf(b,c,Zf);d=null;for(var h in c)c.hasOwnProperty(h)&&(f=c[h],\"children\"===h?\"string\"===typeof f?a.textContent!==f&&(d=[\"children\",f]):\"number\"===typeof f&&a.textContent!==\"\"+f&&(d=[\"children\",\"\"+f]):ua.hasOwnProperty(h)&&null!=f&&$f(e,h));switch(b){case \"input\":lc(a);ad(a,c);break;case \"textarea\":lc(a);Mf(a,c);break;case \"select\":case \"option\":break;default:\"function\"===typeof c.onClick&&\n(a.onclick=C)}return d}function ng(a,b){return a.nodeValue!==b}\nvar og=Object.freeze({createElement:ag,createTextNode:bg,setInitialProperties:cg,diffProperties:dg,updateProperties:eg,diffHydratedProperties:fg,diffHydratedText:ng,warnForUnmatchedText:function(){},warnForDeletedHydratableElement:function(){},warnForDeletedHydratableText:function(){},warnForInsertedHydratedElement:function(){},warnForInsertedHydratedText:function(){},restoreControlledState:function(a,b,c){switch(b){case \"input\":Zc(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=\nc.parentNode;c=c.querySelectorAll(\"input[name\\x3d\"+JSON.stringify(\"\"+b)+'][type\\x3d\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Xa(d);e?void 0:D(\"90\");mc(d);Zc(d,e)}}}break;case \"textarea\":Lf(a,c);break;case \"select\":b=c.value,null!=b&&Hf(a,!!c.multiple,b,!1)}}});Tb.injectFiberControlledHostComponent(og);var pg=null,qg=null;\nfunction rg(a){this._expirationTime=X.computeUniqueAsyncExpiration();this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}rg.prototype.render=function(a){this._defer?void 0:D(\"250\");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new sg;X.updateContainerAtExpirationTime(a,b,null,c,d._onCommit);return d};\nrg.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nrg.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:D(\"251\");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?D(\"251\"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;X.flushRoot(a,c);b=this._next;this._next=null;b=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=\nnull,this._defer=!1};rg.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function sg(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}sg.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nsg.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];\"function\"!==typeof c?D(\"191\",c):void 0;c()}}};function tg(a,b,c){this._internalRoot=X.createContainer(a,b,c)}tg.prototype.render=function(a,b){var c=this._internalRoot,d=new sg;b=void 0===b?null:b;null!==b&&d.then(b);X.updateContainer(a,c,null,d._onCommit);return d};\ntg.prototype.unmount=function(a){var b=this._internalRoot,c=new sg;a=void 0===a?null:a;null!==a&&c.then(a);X.updateContainer(null,b,null,c._onCommit);return c};tg.prototype.legacy_renderSubtreeIntoContainer=function(a,b,c){var d=this._internalRoot,e=new sg;c=void 0===c?null:c;null!==c&&e.then(c);X.updateContainer(b,d,a,e._onCommit);return e};\ntg.prototype.createBatch=function(){var a=new rg(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime<=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function ug(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}\nfunction vg(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nvar X=pf({getRootHostContext:function(a){var b=a.nodeType;switch(b){case 9:case 11:a=(a=a.documentElement)?a.namespaceURI:Pf(null,\"\");break;default:b=8===b?a.parentNode:a,a=b.namespaceURI||null,b=b.tagName,a=Pf(a,b)}return a},getChildHostContext:function(a,b){return Pf(a,b)},getPublicInstance:function(a){return a},prepareForCommit:function(){pg=Vd;var a=fa();if(ne(a)){if(\"selectionStart\"in a)var b={start:a.selectionStart,end:a.selectionEnd};else a:{var c=window.getSelection&&window.getSelection();\nif(c&&0!==c.rangeCount){b=c.anchorNode;var d=c.anchorOffset,e=c.focusNode;c=c.focusOffset;try{b.nodeType,e.nodeType}catch(B){b=null;break a}var f=0,h=-1,g=-1,k=0,v=0,l=a,p=null;b:for(;;){for(var z;;){l!==b||0!==d&&3!==l.nodeType||(h=f+d);l!==e||0!==c&&3!==l.nodeType||(g=f+c);3===l.nodeType&&(f+=l.nodeValue.length);if(null===(z=l.firstChild))break;p=l;l=z}for(;;){if(l===a)break b;p===b&&++k===d&&(h=f);p===e&&++v===c&&(g=f);if(null!==(z=l.nextSibling))break;l=p;p=l.parentNode}l=z}b=-1===h||-1===g?null:\n{start:h,end:g}}else b=null}b=b||{start:0,end:0}}else b=null;qg={focusedElem:a,selectionRange:b};Wd(!1)},resetAfterCommit:function(){var a=qg,b=fa(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&ja(document.documentElement,c)){if(ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(window.getSelection){b=window.getSelection();var e=c[mb()].length;a=Math.min(d.start,e);d=void 0===d.end?a:Math.min(d.end,e);!b.extend&&a>\nd&&(e=d,d=a,a=e);e=me(c,a);var f=me(c,d);if(e&&f&&(1!==b.rangeCount||b.anchorNode!==e.node||b.anchorOffset!==e.offset||b.focusNode!==f.node||b.focusOffset!==f.offset)){var h=document.createRange();h.setStart(e.node,e.offset);b.removeAllRanges();a>d?(b.addRange(h),b.extend(f.node,f.offset)):(h.setEnd(f.node,f.offset),b.addRange(h))}}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,\na.element.scrollTop=a.top}qg=null;Wd(pg);pg=null},createInstance:function(a,b,c,d,e){a=ag(a,b,c,d);a[F]=e;a[Ta]=b;return a},appendInitialChild:function(a,b){a.appendChild(b)},finalizeInitialChildren:function(a,b,c,d){cg(a,b,c,d);return vg(b,c)},prepareUpdate:function(a,b,c,d,e){return dg(a,b,c,d,e)},shouldSetTextContent:function(a,b){return\"textarea\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&\"string\"===\ntypeof b.dangerouslySetInnerHTML.__html},shouldDeprioritizeSubtree:function(a,b){return!!b.hidden},createTextInstance:function(a,b,c,d){a=bg(a,b);a[F]=d;return a},now:sf,mutation:{commitMount:function(a,b,c){vg(b,c)&&a.focus()},commitUpdate:function(a,b,c,d,e){a[Ta]=e;eg(a,b,c,d,e)},resetTextContent:function(a){Sf(a,\"\")},commitTextUpdate:function(a,b,c){a.nodeValue=c},appendChild:function(a,b){a.appendChild(b)},appendChildToContainer:function(a,b){8===a.nodeType?a.parentNode.insertBefore(b,a):a.appendChild(b)},\ninsertBefore:function(a,b,c){a.insertBefore(b,c)},insertInContainerBefore:function(a,b,c){8===a.nodeType?a.parentNode.insertBefore(b,c):a.insertBefore(b,c)},removeChild:function(a,b){a.removeChild(b)},removeChildFromContainer:function(a,b){8===a.nodeType?a.parentNode.removeChild(b):a.removeChild(b)}},hydration:{canHydrateInstance:function(a,b){return 1!==a.nodeType||b.toLowerCase()!==a.nodeName.toLowerCase()?null:a},canHydrateTextInstance:function(a,b){return\"\"===b||3!==a.nodeType?null:a},getNextHydratableSibling:function(a){for(a=\na.nextSibling;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a},getFirstHydratableChild:function(a){for(a=a.firstChild;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a},hydrateInstance:function(a,b,c,d,e,f){a[F]=f;a[Ta]=c;return fg(a,b,c,e,d)},hydrateTextInstance:function(a,b,c){a[F]=c;return ng(a,b)},didNotMatchHydratedContainerTextInstance:function(){},didNotMatchHydratedTextInstance:function(){},didNotHydrateContainerInstance:function(){},didNotHydrateInstance:function(){},\ndidNotFindHydratableContainerInstance:function(){},didNotFindHydratableContainerTextInstance:function(){},didNotFindHydratableInstance:function(){},didNotFindHydratableTextInstance:function(){}},scheduleDeferredCallback:tf,cancelDeferredCallback:uf}),Cg=X;ac=Cg.batchedUpdates;bc=Cg.interactiveUpdates;cc=Cg.flushInteractiveUpdates;\nfunction Dg(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new tg(a,!1,b)}\nfunction Eg(a,b,c,d,e){ug(c)?void 0:D(\"200\");var f=c._reactRootContainer;if(f){if(\"function\"===typeof e){var h=e;e=function(){var a=X.getPublicRootInstance(f._internalRoot);h.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Dg(c,d);if(\"function\"===typeof e){var g=e;e=function(){var a=X.getPublicRootInstance(f._internalRoot);g.call(a)}}X.unbatchedUpdates(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return X.getPublicRootInstance(f._internalRoot)}\nfunction Fg(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;ug(b)?void 0:D(\"200\");return qf(a,b,null,c)}\nvar Gg={createPortal:Fg,findDOMNode:function(a){return null==a?null:1===a.nodeType?a:X.findHostInstance(a)},hydrate:function(a,b,c){return Eg(null,a,b,!0,c)},render:function(a,b,c){return Eg(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){null==a||void 0===a._reactInternalFiber?D(\"38\"):void 0;return Eg(a,b,c,!1,d)},unmountComponentAtNode:function(a){ug(a)?void 0:D(\"40\");return a._reactRootContainer?(X.unbatchedUpdates(function(){Eg(null,null,a,!1,function(){a._reactRootContainer=\nnull})}),!0):!1},unstable_createPortal:function(){return Fg.apply(void 0,arguments)},unstable_batchedUpdates:X.batchedUpdates,unstable_deferredUpdates:X.deferredUpdates,flushSync:X.flushSync,unstable_flushControlled:X.flushControlled,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{EventPluginHub:Ra,EventPluginRegistry:Ca,EventPropagators:kb,ReactControlledComponent:$b,ReactDOMComponentTree:bb,ReactDOMEventListener:$d},unstable_createRoot:function(a,b){return new tg(a,!0,null!=b&&!0===b.hydrate)}};\nX.injectIntoDevTools({findFiberByHostInstance:Ua,bundleType:0,version:\"16.3.2\",rendererPackageName:\"react-dom\"});var Hg=Object.freeze({default:Gg}),Ig=Hg&&Gg||Hg;module.exports=Ig[\"default\"]?Ig[\"default\"]:Ig;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/cjs/react-dom.production.min.js\n// module id = 743\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n  canUseDOM: canUseDOM,\n\n  canUseWorkers: typeof Worker !== 'undefined',\n\n  canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n  canUseViewport: canUseDOM && !!window.screen,\n\n  isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/ExecutionEnvironment.js\n// module id = 744\n// module chunks = 0 1","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/node_modules/object-assign/index.js\n// module id = 745\n// module chunks = 0 1","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/* eslint-disable fb-www/typeof-undefined */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not\n * yet defined.\n *\n * @param {?DOMDocument} doc Defaults to current document.\n * @return {?DOMElement}\n */\nfunction getActiveElement(doc) /*?DOMElement*/{\n  doc = doc || (typeof document !== 'undefined' ? document : undefined);\n  if (typeof doc === 'undefined') {\n    return null;\n  }\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\n\nmodule.exports = getActiveElement;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/getActiveElement.js\n// module id = 746\n// module chunks = 0 1","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nvar isTextNode = require('./isTextNode');\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n */\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nmodule.exports = containsNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/containsNode.js\n// module id = 747\n// module chunks = 0 1","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar isNode = require('./isNode');\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n  return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/isTextNode.js\n// module id = 748\n// module chunks = 0 1","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\nfunction isNode(object) {\n  var doc = object ? object.ownerDocument || object : document;\n  var defaultView = doc.defaultView || window;\n  return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/isNode.js\n// module id = 749\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/prop-types/factoryWithThrowingShims.js\n// module id = 750\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/prop-types/lib/ReactPropTypesSecret.js\n// module id = 751\n// module chunks = 0 1","module.exports = require('./lib/');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/node_modules/qs/index.js\n// module id = 752\n// module chunks = 0 1","// Load modules\n\nvar Stringify = require('./stringify');\nvar Parse = require('./parse');\n\n\n// Declare internals\n\nvar internals = {};\n\n\nmodule.exports = {\n    stringify: Stringify,\n    parse: Parse\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/node_modules/qs/lib/index.js\n// module id = 753\n// module chunks = 0 1","// Load modules\n\nvar Utils = require('./utils');\n\n\n// Declare internals\n\nvar internals = {\n    delimiter: '&',\n    arrayPrefixGenerators: {\n        brackets: function (prefix, key) {\n            return prefix + '[]';\n        },\n        indices: function (prefix, key) {\n            return prefix + '[' + key + ']';\n        },\n        repeat: function (prefix, key) {\n            return prefix;\n        }\n    }\n};\n\n\ninternals.stringify = function (obj, prefix, generateArrayPrefix) {\n\n    if (Utils.isBuffer(obj)) {\n        obj = obj.toString();\n    }\n    else if (obj instanceof Date) {\n        obj = obj.toISOString();\n    }\n    else if (obj === null) {\n        obj = '';\n    }\n\n    if (typeof obj === 'string' ||\n        typeof obj === 'number' ||\n        typeof obj === 'boolean') {\n\n        return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys = Object.keys(obj);\n    for (var i = 0, il = objKeys.length; i < il; ++i) {\n        var key = objKeys[i];\n        if (Array.isArray(obj)) {\n            values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix));\n        }\n        else {\n            values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix));\n        }\n    }\n\n    return values;\n};\n\n\nmodule.exports = function (obj, options) {\n\n    options = options || {};\n    var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;\n\n    var keys = [];\n\n    if (typeof obj !== 'object' ||\n        obj === null) {\n\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in internals.arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    }\n    else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    }\n    else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];\n\n    var objKeys = Object.keys(obj);\n    for (var i = 0, il = objKeys.length; i < il; ++i) {\n        var key = objKeys[i];\n        keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix));\n    }\n\n    return keys.join(delimiter);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/node_modules/qs/lib/stringify.js\n// module id = 754\n// module chunks = 0 1","// Load modules\n\nvar Utils = require('./utils');\n\n\n// Declare internals\n\nvar internals = {\n    delimiter: '&',\n    depth: 5,\n    arrayLimit: 20,\n    parameterLimit: 1000\n};\n\n\ninternals.parseValues = function (str, options) {\n\n    var obj = {};\n    var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);\n\n    for (var i = 0, il = parts.length; i < il; ++i) {\n        var part = parts[i];\n        var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;\n\n        if (pos === -1) {\n            obj[Utils.decode(part)] = '';\n        }\n        else {\n            var key = Utils.decode(part.slice(0, pos));\n            var val = Utils.decode(part.slice(pos + 1));\n\n            if (Object.prototype.hasOwnProperty(key)) {\n                continue;\n            }\n\n            if (!obj.hasOwnProperty(key)) {\n                obj[key] = val;\n            }\n            else {\n                obj[key] = [].concat(obj[key]).concat(val);\n            }\n        }\n    }\n\n    return obj;\n};\n\n\ninternals.parseObject = function (chain, val, options) {\n\n    if (!chain.length) {\n        return val;\n    }\n\n    var root = chain.shift();\n\n    var obj = {};\n    if (root === '[]') {\n        obj = [];\n        obj = obj.concat(internals.parseObject(chain, val, options));\n    }\n    else {\n        var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;\n        var index = parseInt(cleanRoot, 10);\n        var indexString = '' + index;\n        if (!isNaN(index) &&\n            root !== cleanRoot &&\n            indexString === cleanRoot &&\n            index >= 0 &&\n            index <= options.arrayLimit) {\n\n            obj = [];\n            obj[index] = internals.parseObject(chain, val, options);\n        }\n        else {\n            obj[cleanRoot] = internals.parseObject(chain, val, options);\n        }\n    }\n\n    return obj;\n};\n\n\ninternals.parseKeys = function (key, val, options) {\n\n    if (!key) {\n        return;\n    }\n\n    // The regex chunks\n\n    var parent = /^([^\\[\\]]*)/;\n    var child = /(\\[[^\\[\\]]*\\])/g;\n\n    // Get the parent\n\n    var segment = parent.exec(key);\n\n    // Don't allow them to overwrite object prototype properties\n\n    if (Object.prototype.hasOwnProperty(segment[1])) {\n        return;\n    }\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (segment[1]) {\n        keys.push(segment[1]);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n\n        ++i;\n        if (!Object.prototype.hasOwnProperty(segment[1].replace(/\\[|\\]/g, ''))) {\n            keys.push(segment[1]);\n        }\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return internals.parseObject(keys, val, options);\n};\n\n\nmodule.exports = function (str, options) {\n\n    if (str === '' ||\n        str === null ||\n        typeof str === 'undefined') {\n\n        return {};\n    }\n\n    options = options || {};\n    options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;\n\n    var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;\n    var obj = {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0, il = keys.length; i < il; ++i) {\n        var key = keys[i];\n        var newObj = internals.parseKeys(key, tempObj[key], options);\n        obj = Utils.merge(obj, newObj);\n    }\n\n    return Utils.compact(obj);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/node_modules/qs/lib/parse.js\n// module id = 755\n// module chunks = 0 1","/**\n * This component is necessary to get around a context warning\n * present in React 0.13.0. It sovles this by providing a separation\n * between the \"owner\" and \"parent\" contexts.\n */\n\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require('react');\n\nvar ContextWrapper = (function (_React$Component) {\n  _inherits(ContextWrapper, _React$Component);\n\n  function ContextWrapper() {\n    _classCallCheck(this, ContextWrapper);\n\n    _get(Object.getPrototypeOf(ContextWrapper.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  _createClass(ContextWrapper, [{\n    key: 'render',\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n\n  return ContextWrapper;\n})(React.Component);\n\nmodule.exports = ContextWrapper;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/ContextWrapper.js\n// module id = 756\n// module chunks = 0 1","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require('react');\nvar assign = require('object-assign');\nvar PropTypes = require('../PropTypes');\n\nfunction isLeftClickEvent(event) {\n  return event.button === 0;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\n/**\n * <Link> components are used to create an <a> element that links to a route.\n * When that route is active, the link gets an \"active\" class name (or the\n * value of its `activeClassName` prop).\n *\n * For example, assuming you have the following route:\n *\n *   <Route name=\"showPost\" path=\"/posts/:postID\" handler={Post}/>\n *\n * You could use the following component to link to that route:\n *\n *   <Link to=\"showPost\" params={{ postID: \"123\" }} />\n *\n * In addition to params, links may pass along query string parameters\n * using the `query` prop.\n *\n *   <Link to=\"showPost\" params={{ postID: \"123\" }} query={{ show:true }}/>\n */\n\nvar Link = (function (_React$Component) {\n  _inherits(Link, _React$Component);\n\n  function Link() {\n    _classCallCheck(this, Link);\n\n    _get(Object.getPrototypeOf(Link.prototype), 'constructor', this).apply(this, arguments);\n  }\n\n  // TODO: Include these in the above class definition\n  // once we can use ES7 property initializers.\n  // https://github.com/babel/babel/issues/619\n\n  _createClass(Link, [{\n    key: 'handleClick',\n    value: function handleClick(event) {\n      var allowTransition = true;\n      var clickResult;\n\n      if (this.props.onClick) clickResult = this.props.onClick(event);\n\n      if (isModifiedEvent(event) || !isLeftClickEvent(event)) return;\n\n      if (clickResult === false || event.defaultPrevented === true) allowTransition = false;\n\n      event.preventDefault();\n\n      if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query);\n    }\n\n    /**\n     * Returns the value of the \"href\" attribute to use on the DOM element.\n     */\n  }, {\n    key: 'getHref',\n    value: function getHref() {\n      return this.context.router.makeHref(this.props.to, this.props.params, this.props.query);\n    }\n\n    /**\n     * Returns the value of the \"class\" attribute to use on the DOM element, which contains\n     * the value of the activeClassName property when this <Link> is active.\n     */\n  }, {\n    key: 'getClassName',\n    value: function getClassName() {\n      var className = this.props.className;\n\n      if (this.getActiveState()) className += ' ' + this.props.activeClassName;\n\n      return className;\n    }\n  }, {\n    key: 'getActiveState',\n    value: function getActiveState() {\n      return this.context.router.isActive(this.props.to, this.props.params, this.props.query);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var props = assign({}, this.props, {\n        href: this.getHref(),\n        className: this.getClassName(),\n        onClick: this.handleClick.bind(this)\n      });\n\n      if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle;\n\n      delete props.to;\n      delete props.params;\n      delete props.query;\n      delete props.activeClassName;\n      delete props.activeStyle;\n\n      return React.DOM.a(props, this.props.children);\n    }\n  }]);\n\n  return Link;\n})(React.Component);\n\nLink.contextTypes = {\n  router: PropTypes.router.isRequired\n};\n\nLink.propTypes = {\n  activeClassName: PropTypes.string.isRequired,\n  to: PropTypes.oneOfType([PropTypes.string, PropTypes.route]).isRequired,\n  params: PropTypes.object,\n  query: PropTypes.object,\n  activeStyle: PropTypes.object,\n  onClick: PropTypes.func\n};\n\nLink.defaultProps = {\n  activeClassName: 'active',\n  className: ''\n};\n\nmodule.exports = Link;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/components/Link.js\n// module id = 757\n// module chunks = 0 1","'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = require('invariant');\nvar LocationActions = require('../actions/LocationActions');\nvar History = require('../History');\n\n/**\n * A location that is convenient for testing and does not require a DOM.\n */\n\nvar TestLocation = (function () {\n  function TestLocation(history) {\n    _classCallCheck(this, TestLocation);\n\n    this.history = history || [];\n    this.listeners = [];\n    this.needsDOM = false;\n    this._updateHistoryLength();\n  }\n\n  _createClass(TestLocation, [{\n    key: '_updateHistoryLength',\n    value: function _updateHistoryLength() {\n      History.length = this.history.length;\n    }\n  }, {\n    key: '_notifyChange',\n    value: function _notifyChange(type) {\n      var change = {\n        path: this.getCurrentPath(),\n        type: type\n      };\n\n      for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change);\n    }\n  }, {\n    key: 'addChangeListener',\n    value: function addChangeListener(listener) {\n      this.listeners.push(listener);\n    }\n  }, {\n    key: 'removeChangeListener',\n    value: function removeChangeListener(listener) {\n      this.listeners = this.listeners.filter(function (l) {\n        return l !== listener;\n      });\n    }\n  }, {\n    key: 'push',\n    value: function push(path) {\n      this.history.push(path);\n      this._updateHistoryLength();\n      this._notifyChange(LocationActions.PUSH);\n    }\n  }, {\n    key: 'replace',\n    value: function replace(path) {\n      invariant(this.history.length, 'You cannot replace the current path with no history');\n\n      this.history[this.history.length - 1] = path;\n\n      this._notifyChange(LocationActions.REPLACE);\n    }\n  }, {\n    key: 'pop',\n    value: function pop() {\n      this.history.pop();\n      this._updateHistoryLength();\n      this._notifyChange(LocationActions.POP);\n    }\n  }, {\n    key: 'getCurrentPath',\n    value: function getCurrentPath() {\n      return this.history[this.history.length - 1];\n    }\n  }, {\n    key: 'toString',\n    value: function toString() {\n      return '<TestLocation>';\n    }\n  }]);\n\n  return TestLocation;\n})();\n\nmodule.exports = TestLocation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/locations/TestLocation.js\n// module id = 758\n// module chunks = 0 1","/**\n * A scroll behavior that always scrolls to the top of the page\n * after a transition.\n */\n\"use strict\";\n\nvar ScrollToTopBehavior = {\n\n  updateScrollPosition: function updateScrollPosition() {\n    window.scrollTo(0, 0);\n  }\n\n};\n\nmodule.exports = ScrollToTopBehavior;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/behaviors/ScrollToTopBehavior.js\n// module id = 759\n// module chunks = 0 1","'use strict';\n\nvar PropTypes = require('./PropTypes');\n\n/**\n * A mixin for components that modify the URL.\n *\n * Example:\n *\n *   var MyLink = React.createClass({\n *     mixins: [ Router.Navigation ],\n *     handleClick(event) {\n *       event.preventDefault();\n *       this.transitionTo('aRoute', { the: 'params' }, { the: 'query' });\n *     },\n *     render() {\n *       return (\n *         <a onClick={this.handleClick}>Click me!</a>\n *       );\n *     }\n *   });\n */\nvar Navigation = {\n\n  contextTypes: {\n    router: PropTypes.router.isRequired\n  },\n\n  /**\n   * Returns an absolute URL path created from the given route\n   * name, URL parameters, and query values.\n   */\n  makePath: function makePath(to, params, query) {\n    return this.context.router.makePath(to, params, query);\n  },\n\n  /**\n   * Returns a string that may safely be used as the href of a\n   * link to the route with the given name.\n   */\n  makeHref: function makeHref(to, params, query) {\n    return this.context.router.makeHref(to, params, query);\n  },\n\n  /**\n   * Transitions to the URL specified in the arguments by pushing\n   * a new URL onto the history stack.\n   */\n  transitionTo: function transitionTo(to, params, query) {\n    this.context.router.transitionTo(to, params, query);\n  },\n\n  /**\n   * Transitions to the URL specified in the arguments by replacing\n   * the current URL in the history stack.\n   */\n  replaceWith: function replaceWith(to, params, query) {\n    this.context.router.replaceWith(to, params, query);\n  },\n\n  /**\n   * Transitions to the previous URL.\n   */\n  goBack: function goBack() {\n    return this.context.router.goBack();\n  }\n\n};\n\nmodule.exports = Navigation;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Navigation.js\n// module id = 760\n// module chunks = 0 1","'use strict';\n\nvar PropTypes = require('./PropTypes');\n\n/**\n * A mixin for components that need to know the path, routes, URL\n * params and query that are currently active.\n *\n * Example:\n *\n *   var AboutLink = React.createClass({\n *     mixins: [ Router.State ],\n *     render() {\n *       var className = this.props.className;\n *\n *       if (this.isActive('about'))\n *         className += ' is-active';\n *\n *       return React.DOM.a({ className: className }, this.props.children);\n *     }\n *   });\n */\nvar State = {\n\n  contextTypes: {\n    router: PropTypes.router.isRequired\n  },\n\n  /**\n   * Returns the current URL path.\n   */\n  getPath: function getPath() {\n    return this.context.router.getCurrentPath();\n  },\n\n  /**\n   * Returns the current URL path without the query string.\n   */\n  getPathname: function getPathname() {\n    return this.context.router.getCurrentPathname();\n  },\n\n  /**\n   * Returns an object of the URL params that are currently active.\n   */\n  getParams: function getParams() {\n    return this.context.router.getCurrentParams();\n  },\n\n  /**\n   * Returns an object of the query params that are currently active.\n   */\n  getQuery: function getQuery() {\n    return this.context.router.getCurrentQuery();\n  },\n\n  /**\n   * Returns an array of the routes that are currently active.\n   */\n  getRoutes: function getRoutes() {\n    return this.context.router.getCurrentRoutes();\n  },\n\n  /**\n   * A helper method to determine if a given route, params, and query\n   * are active.\n   */\n  isActive: function isActive(to, params, query) {\n    return this.context.router.isActive(to, params, query);\n  }\n\n};\n\nmodule.exports = State;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/State.js\n// module id = 761\n// module chunks = 0 1","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _assign = require('object-assign');\n\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar _invariant = require('fbjs/lib/invariant');\n\nif (process.env.NODE_ENV !== 'production') {\n  var warning = require('fbjs/lib/warning');\n}\n\nvar MIXINS_KEY = 'mixins';\n\n// Helper function to allow the creation of anonymous functions which do not\n// have .name set to the name of the variable being assigned to.\nfunction identity(fn) {\n  return fn;\n}\n\nvar ReactPropTypeLocationNames;\nif (process.env.NODE_ENV !== 'production') {\n  ReactPropTypeLocationNames = {\n    prop: 'prop',\n    context: 'context',\n    childContext: 'child context'\n  };\n} else {\n  ReactPropTypeLocationNames = {};\n}\n\nfunction factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {\n  /**\n   * Policies that describe methods in `ReactClassInterface`.\n   */\n\n  var injectedMixins = [];\n\n  /**\n   * Composite components are higher-level components that compose other composite\n   * or host components.\n   *\n   * To create a new type of `ReactClass`, pass a specification of\n   * your new class to `React.createClass`. The only requirement of your class\n   * specification is that you implement a `render` method.\n   *\n   *   var MyComponent = React.createClass({\n   *     render: function() {\n   *       return <div>Hello World</div>;\n   *     }\n   *   });\n   *\n   * The class specification supports a specific protocol of methods that have\n   * special meaning (e.g. `render`). See `ReactClassInterface` for\n   * more the comprehensive protocol. Any other properties and methods in the\n   * class specification will be available on the prototype.\n   *\n   * @interface ReactClassInterface\n   * @internal\n   */\n  var ReactClassInterface = {\n    /**\n     * An array of Mixin objects to include when defining your component.\n     *\n     * @type {array}\n     * @optional\n     */\n    mixins: 'DEFINE_MANY',\n\n    /**\n     * An object containing properties and methods that should be defined on\n     * the component's constructor instead of its prototype (static methods).\n     *\n     * @type {object}\n     * @optional\n     */\n    statics: 'DEFINE_MANY',\n\n    /**\n     * Definition of prop types for this component.\n     *\n     * @type {object}\n     * @optional\n     */\n    propTypes: 'DEFINE_MANY',\n\n    /**\n     * Definition of context types for this component.\n     *\n     * @type {object}\n     * @optional\n     */\n    contextTypes: 'DEFINE_MANY',\n\n    /**\n     * Definition of context types this component sets for its children.\n     *\n     * @type {object}\n     * @optional\n     */\n    childContextTypes: 'DEFINE_MANY',\n\n    // ==== Definition methods ====\n\n    /**\n     * Invoked when the component is mounted. Values in the mapping will be set on\n     * `this.props` if that prop is not specified (i.e. using an `in` check).\n     *\n     * This method is invoked before `getInitialState` and therefore cannot rely\n     * on `this.state` or use `this.setState`.\n     *\n     * @return {object}\n     * @optional\n     */\n    getDefaultProps: 'DEFINE_MANY_MERGED',\n\n    /**\n     * Invoked once before the component is mounted. The return value will be used\n     * as the initial value of `this.state`.\n     *\n     *   getInitialState: function() {\n     *     return {\n     *       isOn: false,\n     *       fooBaz: new BazFoo()\n     *     }\n     *   }\n     *\n     * @return {object}\n     * @optional\n     */\n    getInitialState: 'DEFINE_MANY_MERGED',\n\n    /**\n     * @return {object}\n     * @optional\n     */\n    getChildContext: 'DEFINE_MANY_MERGED',\n\n    /**\n     * Uses props from `this.props` and state from `this.state` to render the\n     * structure of the component.\n     *\n     * No guarantees are made about when or how often this method is invoked, so\n     * it must not have side effects.\n     *\n     *   render: function() {\n     *     var name = this.props.name;\n     *     return <div>Hello, {name}!</div>;\n     *   }\n     *\n     * @return {ReactComponent}\n     * @required\n     */\n    render: 'DEFINE_ONCE',\n\n    // ==== Delegate methods ====\n\n    /**\n     * Invoked when the component is initially created and about to be mounted.\n     * This may have side effects, but any external subscriptions or data created\n     * by this method must be cleaned up in `componentWillUnmount`.\n     *\n     * @optional\n     */\n    componentWillMount: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component has been mounted and has a DOM representation.\n     * However, there is no guarantee that the DOM node is in the document.\n     *\n     * Use this as an opportunity to operate on the DOM when the component has\n     * been mounted (initialized and rendered) for the first time.\n     *\n     * @param {DOMElement} rootNode DOM element representing the component.\n     * @optional\n     */\n    componentDidMount: 'DEFINE_MANY',\n\n    /**\n     * Invoked before the component receives new props.\n     *\n     * Use this as an opportunity to react to a prop transition by updating the\n     * state using `this.setState`. Current props are accessed via `this.props`.\n     *\n     *   componentWillReceiveProps: function(nextProps, nextContext) {\n     *     this.setState({\n     *       likesIncreasing: nextProps.likeCount > this.props.likeCount\n     *     });\n     *   }\n     *\n     * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n     * transition may cause a state change, but the opposite is not true. If you\n     * need it, you are probably looking for `componentWillUpdate`.\n     *\n     * @param {object} nextProps\n     * @optional\n     */\n    componentWillReceiveProps: 'DEFINE_MANY',\n\n    /**\n     * Invoked while deciding if the component should be updated as a result of\n     * receiving new props, state and/or context.\n     *\n     * Use this as an opportunity to `return false` when you're certain that the\n     * transition to the new props/state/context will not require a component\n     * update.\n     *\n     *   shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n     *     return !equal(nextProps, this.props) ||\n     *       !equal(nextState, this.state) ||\n     *       !equal(nextContext, this.context);\n     *   }\n     *\n     * @param {object} nextProps\n     * @param {?object} nextState\n     * @param {?object} nextContext\n     * @return {boolean} True if the component should update.\n     * @optional\n     */\n    shouldComponentUpdate: 'DEFINE_ONCE',\n\n    /**\n     * Invoked when the component is about to update due to a transition from\n     * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n     * and `nextContext`.\n     *\n     * Use this as an opportunity to perform preparation before an update occurs.\n     *\n     * NOTE: You **cannot** use `this.setState()` in this method.\n     *\n     * @param {object} nextProps\n     * @param {?object} nextState\n     * @param {?object} nextContext\n     * @param {ReactReconcileTransaction} transaction\n     * @optional\n     */\n    componentWillUpdate: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component's DOM representation has been updated.\n     *\n     * Use this as an opportunity to operate on the DOM when the component has\n     * been updated.\n     *\n     * @param {object} prevProps\n     * @param {?object} prevState\n     * @param {?object} prevContext\n     * @param {DOMElement} rootNode DOM element representing the component.\n     * @optional\n     */\n    componentDidUpdate: 'DEFINE_MANY',\n\n    /**\n     * Invoked when the component is about to be removed from its parent and have\n     * its DOM representation destroyed.\n     *\n     * Use this as an opportunity to deallocate any external resources.\n     *\n     * NOTE: There is no `componentDidUnmount` since your component will have been\n     * destroyed by that point.\n     *\n     * @optional\n     */\n    componentWillUnmount: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillMount`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillMount: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillReceiveProps`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',\n\n    /**\n     * Replacement for (deprecated) `componentWillUpdate`.\n     *\n     * @optional\n     */\n    UNSAFE_componentWillUpdate: 'DEFINE_MANY',\n\n    // ==== Advanced methods ====\n\n    /**\n     * Updates the component's currently mounted DOM representation.\n     *\n     * By default, this implements React's rendering and reconciliation algorithm.\n     * Sophisticated clients may wish to override this.\n     *\n     * @param {ReactReconcileTransaction} transaction\n     * @internal\n     * @overridable\n     */\n    updateComponent: 'OVERRIDE_BASE'\n  };\n\n  /**\n   * Similar to ReactClassInterface but for static methods.\n   */\n  var ReactClassStaticInterface = {\n    /**\n     * This method is invoked after a component is instantiated and when it\n     * receives new props. Return an object to update state in response to\n     * prop changes. Return null to indicate no change to state.\n     *\n     * If an object is returned, its keys will be merged into the existing state.\n     *\n     * @return {object || null}\n     * @optional\n     */\n    getDerivedStateFromProps: 'DEFINE_MANY_MERGED'\n  };\n\n  /**\n   * Mapping from class specification keys to special processing functions.\n   *\n   * Although these are declared like instance properties in the specification\n   * when defining classes using `React.createClass`, they are actually static\n   * and are accessible on the constructor instead of the prototype. Despite\n   * being static, they must be defined outside of the \"statics\" key under\n   * which all other static methods are defined.\n   */\n  var RESERVED_SPEC_KEYS = {\n    displayName: function(Constructor, displayName) {\n      Constructor.displayName = displayName;\n    },\n    mixins: function(Constructor, mixins) {\n      if (mixins) {\n        for (var i = 0; i < mixins.length; i++) {\n          mixSpecIntoComponent(Constructor, mixins[i]);\n        }\n      }\n    },\n    childContextTypes: function(Constructor, childContextTypes) {\n      if (process.env.NODE_ENV !== 'production') {\n        validateTypeDef(Constructor, childContextTypes, 'childContext');\n      }\n      Constructor.childContextTypes = _assign(\n        {},\n        Constructor.childContextTypes,\n        childContextTypes\n      );\n    },\n    contextTypes: function(Constructor, contextTypes) {\n      if (process.env.NODE_ENV !== 'production') {\n        validateTypeDef(Constructor, contextTypes, 'context');\n      }\n      Constructor.contextTypes = _assign(\n        {},\n        Constructor.contextTypes,\n        contextTypes\n      );\n    },\n    /**\n     * Special case getDefaultProps which should move into statics but requires\n     * automatic merging.\n     */\n    getDefaultProps: function(Constructor, getDefaultProps) {\n      if (Constructor.getDefaultProps) {\n        Constructor.getDefaultProps = createMergedResultFunction(\n          Constructor.getDefaultProps,\n          getDefaultProps\n        );\n      } else {\n        Constructor.getDefaultProps = getDefaultProps;\n      }\n    },\n    propTypes: function(Constructor, propTypes) {\n      if (process.env.NODE_ENV !== 'production') {\n        validateTypeDef(Constructor, propTypes, 'prop');\n      }\n      Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);\n    },\n    statics: function(Constructor, statics) {\n      mixStaticSpecIntoComponent(Constructor, statics);\n    },\n    autobind: function() {}\n  };\n\n  function validateTypeDef(Constructor, typeDef, location) {\n    for (var propName in typeDef) {\n      if (typeDef.hasOwnProperty(propName)) {\n        // use a warning instead of an _invariant so components\n        // don't show up in prod but only in __DEV__\n        if (process.env.NODE_ENV !== 'production') {\n          warning(\n            typeof typeDef[propName] === 'function',\n            '%s: %s type `%s` is invalid; it must be a function, usually from ' +\n              'React.PropTypes.',\n            Constructor.displayName || 'ReactClass',\n            ReactPropTypeLocationNames[location],\n            propName\n          );\n        }\n      }\n    }\n  }\n\n  function validateMethodOverride(isAlreadyDefined, name) {\n    var specPolicy = ReactClassInterface.hasOwnProperty(name)\n      ? ReactClassInterface[name]\n      : null;\n\n    // Disallow overriding of base class methods unless explicitly allowed.\n    if (ReactClassMixin.hasOwnProperty(name)) {\n      _invariant(\n        specPolicy === 'OVERRIDE_BASE',\n        'ReactClassInterface: You are attempting to override ' +\n          '`%s` from your class specification. Ensure that your method names ' +\n          'do not overlap with React methods.',\n        name\n      );\n    }\n\n    // Disallow defining methods more than once unless explicitly allowed.\n    if (isAlreadyDefined) {\n      _invariant(\n        specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',\n        'ReactClassInterface: You are attempting to define ' +\n          '`%s` on your component more than once. This conflict may be due ' +\n          'to a mixin.',\n        name\n      );\n    }\n  }\n\n  /**\n   * Mixin helper which handles policy validation and reserved\n   * specification keys when building React classes.\n   */\n  function mixSpecIntoComponent(Constructor, spec) {\n    if (!spec) {\n      if (process.env.NODE_ENV !== 'production') {\n        var typeofSpec = typeof spec;\n        var isMixinValid = typeofSpec === 'object' && spec !== null;\n\n        if (process.env.NODE_ENV !== 'production') {\n          warning(\n            isMixinValid,\n            \"%s: You're attempting to include a mixin that is either null \" +\n              'or not an object. Check the mixins included by the component, ' +\n              'as well as any mixins they include themselves. ' +\n              'Expected object but got %s.',\n            Constructor.displayName || 'ReactClass',\n            spec === null ? null : typeofSpec\n          );\n        }\n      }\n\n      return;\n    }\n\n    _invariant(\n      typeof spec !== 'function',\n      \"ReactClass: You're attempting to \" +\n        'use a component class or function as a mixin. Instead, just use a ' +\n        'regular object.'\n    );\n    _invariant(\n      !isValidElement(spec),\n      \"ReactClass: You're attempting to \" +\n        'use a component as a mixin. Instead, just use a regular object.'\n    );\n\n    var proto = Constructor.prototype;\n    var autoBindPairs = proto.__reactAutoBindPairs;\n\n    // By handling mixins before any other properties, we ensure the same\n    // chaining order is applied to methods with DEFINE_MANY policy, whether\n    // mixins are listed before or after these methods in the spec.\n    if (spec.hasOwnProperty(MIXINS_KEY)) {\n      RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n    }\n\n    for (var name in spec) {\n      if (!spec.hasOwnProperty(name)) {\n        continue;\n      }\n\n      if (name === MIXINS_KEY) {\n        // We have already handled mixins in a special case above.\n        continue;\n      }\n\n      var property = spec[name];\n      var isAlreadyDefined = proto.hasOwnProperty(name);\n      validateMethodOverride(isAlreadyDefined, name);\n\n      if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n        RESERVED_SPEC_KEYS[name](Constructor, property);\n      } else {\n        // Setup methods on prototype:\n        // The following member methods should not be automatically bound:\n        // 1. Expected ReactClass methods (in the \"interface\").\n        // 2. Overridden methods (that were mixed in).\n        var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n        var isFunction = typeof property === 'function';\n        var shouldAutoBind =\n          isFunction &&\n          !isReactClassMethod &&\n          !isAlreadyDefined &&\n          spec.autobind !== false;\n\n        if (shouldAutoBind) {\n          autoBindPairs.push(name, property);\n          proto[name] = property;\n        } else {\n          if (isAlreadyDefined) {\n            var specPolicy = ReactClassInterface[name];\n\n            // These cases should already be caught by validateMethodOverride.\n            _invariant(\n              isReactClassMethod &&\n                (specPolicy === 'DEFINE_MANY_MERGED' ||\n                  specPolicy === 'DEFINE_MANY'),\n              'ReactClass: Unexpected spec policy %s for key %s ' +\n                'when mixing in component specs.',\n              specPolicy,\n              name\n            );\n\n            // For methods which are defined more than once, call the existing\n            // methods before calling the new property, merging if appropriate.\n            if (specPolicy === 'DEFINE_MANY_MERGED') {\n              proto[name] = createMergedResultFunction(proto[name], property);\n            } else if (specPolicy === 'DEFINE_MANY') {\n              proto[name] = createChainedFunction(proto[name], property);\n            }\n          } else {\n            proto[name] = property;\n            if (process.env.NODE_ENV !== 'production') {\n              // Add verbose displayName to the function, which helps when looking\n              // at profiling tools.\n              if (typeof property === 'function' && spec.displayName) {\n                proto[name].displayName = spec.displayName + '_' + name;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  function mixStaticSpecIntoComponent(Constructor, statics) {\n    if (!statics) {\n      return;\n    }\n\n    for (var name in statics) {\n      var property = statics[name];\n      if (!statics.hasOwnProperty(name)) {\n        continue;\n      }\n\n      var isReserved = name in RESERVED_SPEC_KEYS;\n      _invariant(\n        !isReserved,\n        'ReactClass: You are attempting to define a reserved ' +\n          'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' +\n          'as an instance property instead; it will still be accessible on the ' +\n          'constructor.',\n        name\n      );\n\n      var isAlreadyDefined = name in Constructor;\n      if (isAlreadyDefined) {\n        var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)\n          ? ReactClassStaticInterface[name]\n          : null;\n\n        _invariant(\n          specPolicy === 'DEFINE_MANY_MERGED',\n          'ReactClass: You are attempting to define ' +\n            '`%s` on your component more than once. This conflict may be ' +\n            'due to a mixin.',\n          name\n        );\n\n        Constructor[name] = createMergedResultFunction(Constructor[name], property);\n\n        return;\n      }\n\n      Constructor[name] = property;\n    }\n  }\n\n  /**\n   * Merge two objects, but throw if both contain the same key.\n   *\n   * @param {object} one The first object, which is mutated.\n   * @param {object} two The second object\n   * @return {object} one after it has been mutated to contain everything in two.\n   */\n  function mergeIntoWithNoDuplicateKeys(one, two) {\n    _invariant(\n      one && two && typeof one === 'object' && typeof two === 'object',\n      'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'\n    );\n\n    for (var key in two) {\n      if (two.hasOwnProperty(key)) {\n        _invariant(\n          one[key] === undefined,\n          'mergeIntoWithNoDuplicateKeys(): ' +\n            'Tried to merge two objects with the same key: `%s`. This conflict ' +\n            'may be due to a mixin; in particular, this may be caused by two ' +\n            'getInitialState() or getDefaultProps() methods returning objects ' +\n            'with clashing keys.',\n          key\n        );\n        one[key] = two[key];\n      }\n    }\n    return one;\n  }\n\n  /**\n   * Creates a function that invokes two functions and merges their return values.\n   *\n   * @param {function} one Function to invoke first.\n   * @param {function} two Function to invoke second.\n   * @return {function} Function that invokes the two argument functions.\n   * @private\n   */\n  function createMergedResultFunction(one, two) {\n    return function mergedResult() {\n      var a = one.apply(this, arguments);\n      var b = two.apply(this, arguments);\n      if (a == null) {\n        return b;\n      } else if (b == null) {\n        return a;\n      }\n      var c = {};\n      mergeIntoWithNoDuplicateKeys(c, a);\n      mergeIntoWithNoDuplicateKeys(c, b);\n      return c;\n    };\n  }\n\n  /**\n   * Creates a function that invokes two functions and ignores their return vales.\n   *\n   * @param {function} one Function to invoke first.\n   * @param {function} two Function to invoke second.\n   * @return {function} Function that invokes the two argument functions.\n   * @private\n   */\n  function createChainedFunction(one, two) {\n    return function chainedFunction() {\n      one.apply(this, arguments);\n      two.apply(this, arguments);\n    };\n  }\n\n  /**\n   * Binds a method to the component.\n   *\n   * @param {object} component Component whose method is going to be bound.\n   * @param {function} method Method to be bound.\n   * @return {function} The bound method.\n   */\n  function bindAutoBindMethod(component, method) {\n    var boundMethod = method.bind(component);\n    if (process.env.NODE_ENV !== 'production') {\n      boundMethod.__reactBoundContext = component;\n      boundMethod.__reactBoundMethod = method;\n      boundMethod.__reactBoundArguments = null;\n      var componentName = component.constructor.displayName;\n      var _bind = boundMethod.bind;\n      boundMethod.bind = function(newThis) {\n        for (\n          var _len = arguments.length,\n            args = Array(_len > 1 ? _len - 1 : 0),\n            _key = 1;\n          _key < _len;\n          _key++\n        ) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        // User is trying to bind() an autobound method; we effectively will\n        // ignore the value of \"this\" that the user is trying to use, so\n        // let's warn.\n        if (newThis !== component && newThis !== null) {\n          if (process.env.NODE_ENV !== 'production') {\n            warning(\n              false,\n              'bind(): React component methods may only be bound to the ' +\n                'component instance. See %s',\n              componentName\n            );\n          }\n        } else if (!args.length) {\n          if (process.env.NODE_ENV !== 'production') {\n            warning(\n              false,\n              'bind(): You are binding a component method to the component. ' +\n                'React does this for you automatically in a high-performance ' +\n                'way, so you can safely remove this call. See %s',\n              componentName\n            );\n          }\n          return boundMethod;\n        }\n        var reboundMethod = _bind.apply(boundMethod, arguments);\n        reboundMethod.__reactBoundContext = component;\n        reboundMethod.__reactBoundMethod = method;\n        reboundMethod.__reactBoundArguments = args;\n        return reboundMethod;\n      };\n    }\n    return boundMethod;\n  }\n\n  /**\n   * Binds all auto-bound methods in a component.\n   *\n   * @param {object} component Component whose method is going to be bound.\n   */\n  function bindAutoBindMethods(component) {\n    var pairs = component.__reactAutoBindPairs;\n    for (var i = 0; i < pairs.length; i += 2) {\n      var autoBindKey = pairs[i];\n      var method = pairs[i + 1];\n      component[autoBindKey] = bindAutoBindMethod(component, method);\n    }\n  }\n\n  var IsMountedPreMixin = {\n    componentDidMount: function() {\n      this.__isMounted = true;\n    }\n  };\n\n  var IsMountedPostMixin = {\n    componentWillUnmount: function() {\n      this.__isMounted = false;\n    }\n  };\n\n  /**\n   * Add more to the ReactClass base class. These are all legacy features and\n   * therefore not already part of the modern ReactComponent.\n   */\n  var ReactClassMixin = {\n    /**\n     * TODO: This will be deprecated because state should always keep a consistent\n     * type signature and the only use case for this, is to avoid that.\n     */\n    replaceState: function(newState, callback) {\n      this.updater.enqueueReplaceState(this, newState, callback);\n    },\n\n    /**\n     * Checks whether or not this composite component is mounted.\n     * @return {boolean} True if mounted, false otherwise.\n     * @protected\n     * @final\n     */\n    isMounted: function() {\n      if (process.env.NODE_ENV !== 'production') {\n        warning(\n          this.__didWarnIsMounted,\n          '%s: isMounted is deprecated. Instead, make sure to clean up ' +\n            'subscriptions and pending requests in componentWillUnmount to ' +\n            'prevent memory leaks.',\n          (this.constructor && this.constructor.displayName) ||\n            this.name ||\n            'Component'\n        );\n        this.__didWarnIsMounted = true;\n      }\n      return !!this.__isMounted;\n    }\n  };\n\n  var ReactClassComponent = function() {};\n  _assign(\n    ReactClassComponent.prototype,\n    ReactComponent.prototype,\n    ReactClassMixin\n  );\n\n  /**\n   * Creates a composite component class given a class specification.\n   * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass\n   *\n   * @param {object} spec Class specification (which must define `render`).\n   * @return {function} Component constructor function.\n   * @public\n   */\n  function createClass(spec) {\n    // To keep our warnings more understandable, we'll use a little hack here to\n    // ensure that Constructor.name !== 'Constructor'. This makes sure we don't\n    // unnecessarily identify a class without displayName as 'Constructor'.\n    var Constructor = identity(function(props, context, updater) {\n      // This constructor gets overridden by mocks. The argument is used\n      // by mocks to assert on what gets mounted.\n\n      if (process.env.NODE_ENV !== 'production') {\n        warning(\n          this instanceof Constructor,\n          'Something is calling a React component directly. Use a factory or ' +\n            'JSX instead. See: https://fb.me/react-legacyfactory'\n        );\n      }\n\n      // Wire up auto-binding\n      if (this.__reactAutoBindPairs.length) {\n        bindAutoBindMethods(this);\n      }\n\n      this.props = props;\n      this.context = context;\n      this.refs = emptyObject;\n      this.updater = updater || ReactNoopUpdateQueue;\n\n      this.state = null;\n\n      // ReactClasses doesn't have constructors. Instead, they use the\n      // getInitialState and componentWillMount methods for initialization.\n\n      var initialState = this.getInitialState ? this.getInitialState() : null;\n      if (process.env.NODE_ENV !== 'production') {\n        // We allow auto-mocks to proceed as if they're returning null.\n        if (\n          initialState === undefined &&\n          this.getInitialState._isMockFunction\n        ) {\n          // This is probably bad practice. Consider warning here and\n          // deprecating this convenience.\n          initialState = null;\n        }\n      }\n      _invariant(\n        typeof initialState === 'object' && !Array.isArray(initialState),\n        '%s.getInitialState(): must return an object or null',\n        Constructor.displayName || 'ReactCompositeComponent'\n      );\n\n      this.state = initialState;\n    });\n    Constructor.prototype = new ReactClassComponent();\n    Constructor.prototype.constructor = Constructor;\n    Constructor.prototype.__reactAutoBindPairs = [];\n\n    injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n    mixSpecIntoComponent(Constructor, IsMountedPreMixin);\n    mixSpecIntoComponent(Constructor, spec);\n    mixSpecIntoComponent(Constructor, IsMountedPostMixin);\n\n    // Initialize the defaultProps property after all mixins have been merged.\n    if (Constructor.getDefaultProps) {\n      Constructor.defaultProps = Constructor.getDefaultProps();\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      // This is a tag to indicate that the use of these method names is ok,\n      // since it's used with createClass. If it's not, then it's likely a\n      // mistake so we'll warn you to use the static property, property\n      // initializer or constructor respectively.\n      if (Constructor.getDefaultProps) {\n        Constructor.getDefaultProps.isReactClassApproved = {};\n      }\n      if (Constructor.prototype.getInitialState) {\n        Constructor.prototype.getInitialState.isReactClassApproved = {};\n      }\n    }\n\n    _invariant(\n      Constructor.prototype.render,\n      'createClass(...): Class specification must implement a `render` method.'\n    );\n\n    if (process.env.NODE_ENV !== 'production') {\n      warning(\n        !Constructor.prototype.componentShouldUpdate,\n        '%s has a method called ' +\n          'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +\n          'The name is phrased as a question because the function is ' +\n          'expected to return a value.',\n        spec.displayName || 'A component'\n      );\n      warning(\n        !Constructor.prototype.componentWillRecieveProps,\n        '%s has a method called ' +\n          'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',\n        spec.displayName || 'A component'\n      );\n      warning(\n        !Constructor.prototype.UNSAFE_componentWillRecieveProps,\n        '%s has a method called UNSAFE_componentWillRecieveProps(). ' +\n          'Did you mean UNSAFE_componentWillReceiveProps()?',\n        spec.displayName || 'A component'\n      );\n    }\n\n    // Reduce time spent doing lookups by setting these on the prototype.\n    for (var methodName in ReactClassInterface) {\n      if (!Constructor.prototype[methodName]) {\n        Constructor.prototype[methodName] = null;\n      }\n    }\n\n    return Constructor;\n  }\n\n  return createClass;\n}\n\nmodule.exports = factory;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/create-react-class/factory.js\n// module id = 762\n// module chunks = 0 1","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/create-react-class/node_modules/object-assign/index.js\n// module id = 763\n// module chunks = 0 1","'use strict';\n\nvar invariant = require('invariant');\nvar canUseDOM = require('can-use-dom');\nvar getWindowScrollPosition = require('./getWindowScrollPosition');\n\nfunction shouldUpdateScroll(state, prevState) {\n  if (!prevState) return true;\n\n  // Don't update scroll position when only the query has changed.\n  if (state.pathname === prevState.pathname) return false;\n\n  var routes = state.routes;\n  var prevRoutes = prevState.routes;\n\n  var sharedAncestorRoutes = routes.filter(function (route) {\n    return prevRoutes.indexOf(route) !== -1;\n  });\n\n  return !sharedAncestorRoutes.some(function (route) {\n    return route.ignoreScrollBehavior;\n  });\n}\n\n/**\n * Provides the router with the ability to manage window scroll position\n * according to its scroll behavior.\n */\nvar ScrollHistory = {\n\n  statics: {\n\n    /**\n     * Records curent scroll position as the last known position for the given URL path.\n     */\n    recordScrollPosition: function recordScrollPosition(path) {\n      if (!this.scrollHistory) this.scrollHistory = {};\n\n      this.scrollHistory[path] = getWindowScrollPosition();\n    },\n\n    /**\n     * Returns the last known scroll position for the given URL path.\n     */\n    getScrollPosition: function getScrollPosition(path) {\n      if (!this.scrollHistory) this.scrollHistory = {};\n\n      return this.scrollHistory[path] || null;\n    }\n\n  },\n\n  componentWillMount: function componentWillMount() {\n    invariant(this.constructor.getScrollBehavior() == null || canUseDOM, 'Cannot use scroll behavior without a DOM');\n  },\n\n  componentDidMount: function componentDidMount() {\n    this._updateScroll();\n  },\n\n  componentDidUpdate: function componentDidUpdate(prevProps, prevState) {\n    this._updateScroll(prevState);\n  },\n\n  _updateScroll: function _updateScroll(prevState) {\n    if (!shouldUpdateScroll(this.state, prevState)) return;\n\n    var scrollBehavior = this.constructor.getScrollBehavior();\n\n    if (scrollBehavior) scrollBehavior.updateScrollPosition(this.constructor.getScrollPosition(this.state.path), this.state.action);\n  }\n\n};\n\nmodule.exports = ScrollHistory;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/ScrollHistory.js\n// module id = 764\n// module chunks = 0 1","'use strict';\n\nvar invariant = require('invariant');\nvar canUseDOM = require('can-use-dom');\n\n/**\n * Returns the current scroll position of the window as { x, y }.\n */\nfunction getWindowScrollPosition() {\n  invariant(canUseDOM, 'Cannot get current scroll position without a DOM');\n\n  return {\n    x: window.pageXOffset || document.documentElement.scrollLeft,\n    y: window.pageYOffset || document.documentElement.scrollTop\n  };\n}\n\nmodule.exports = getWindowScrollPosition;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/getWindowScrollPosition.js\n// module id = 765\n// module chunks = 0 1","'use strict';\n\nvar React = require('react');\n\nfunction isValidChild(object) {\n  return object == null || React.isValidElement(object);\n}\n\nfunction isReactChildren(object) {\n  return isValidChild(object) || Array.isArray(object) && object.every(isValidChild);\n}\n\nmodule.exports = isReactChildren;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/isReactChildren.js\n// module id = 766\n// module chunks = 0 1","/* jshint -W058 */\n\n'use strict';\n\nvar Cancellation = require('./Cancellation');\nvar Redirect = require('./Redirect');\n\n/**\n * Encapsulates a transition to a given path.\n *\n * The willTransitionTo and willTransitionFrom handlers receive\n * an instance of this class as their first argument.\n */\nfunction Transition(path, retry) {\n  this.path = path;\n  this.abortReason = null;\n  // TODO: Change this to router.retryTransition(transition)\n  this.retry = retry.bind(this);\n}\n\nTransition.prototype.abort = function (reason) {\n  if (this.abortReason == null) this.abortReason = reason || 'ABORT';\n};\n\nTransition.prototype.redirect = function (to, params, query) {\n  this.abort(new Redirect(to, params, query));\n};\n\nTransition.prototype.cancel = function () {\n  this.abort(new Cancellation());\n};\n\nTransition.from = function (transition, routes, components, callback) {\n  routes.reduce(function (callback, route, index) {\n    return function (error) {\n      if (error || transition.abortReason) {\n        callback(error);\n      } else if (route.onLeave) {\n        try {\n          route.onLeave(transition, components[index], callback);\n\n          // If there is no callback in the argument list, call it automatically.\n          if (route.onLeave.length < 3) callback();\n        } catch (e) {\n          callback(e);\n        }\n      } else {\n        callback();\n      }\n    };\n  }, callback)();\n};\n\nTransition.to = function (transition, routes, params, query, callback) {\n  routes.reduceRight(function (callback, route) {\n    return function (error) {\n      if (error || transition.abortReason) {\n        callback(error);\n      } else if (route.onEnter) {\n        try {\n          route.onEnter(transition, params, query, callback);\n\n          // If there is no callback in the argument list, call it automatically.\n          if (route.onEnter.length < 4) callback();\n        } catch (e) {\n          callback(e);\n        }\n      } else {\n        callback();\n      }\n    };\n  }, callback)();\n};\n\nmodule.exports = Transition;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Transition.js\n// module id = 767\n// module chunks = 0 1","/* jshint -W084 */\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar PathUtils = require('./PathUtils');\n\nfunction deepSearch(route, pathname, query) {\n  // Check the subtree first to find the most deeply-nested match.\n  var childRoutes = route.childRoutes;\n  if (childRoutes) {\n    var match, childRoute;\n    for (var i = 0, len = childRoutes.length; i < len; ++i) {\n      childRoute = childRoutes[i];\n\n      if (childRoute.isDefault || childRoute.isNotFound) continue; // Check these in order later.\n\n      if (match = deepSearch(childRoute, pathname, query)) {\n        // A route in the subtree matched! Add this route and we're done.\n        match.routes.unshift(route);\n        return match;\n      }\n    }\n  }\n\n  // No child routes matched; try the default route.\n  var defaultRoute = route.defaultRoute;\n  if (defaultRoute && (params = PathUtils.extractParams(defaultRoute.path, pathname))) return new Match(pathname, params, query, [route, defaultRoute]);\n\n  // Does the \"not found\" route match?\n  var notFoundRoute = route.notFoundRoute;\n  if (notFoundRoute && (params = PathUtils.extractParams(notFoundRoute.path, pathname))) return new Match(pathname, params, query, [route, notFoundRoute]);\n\n  // Last attempt: check this route.\n  var params = PathUtils.extractParams(route.path, pathname);\n  if (params) return new Match(pathname, params, query, [route]);\n\n  return null;\n}\n\nvar Match = (function () {\n  _createClass(Match, null, [{\n    key: 'findMatch',\n\n    /**\n     * Attempts to match depth-first a route in the given route's\n     * subtree against the given path and returns the match if it\n     * succeeds, null if no match can be made.\n     */\n    value: function findMatch(routes, path) {\n      var pathname = PathUtils.withoutQuery(path);\n      var query = PathUtils.extractQuery(path);\n      var match = null;\n\n      for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query);\n\n      return match;\n    }\n  }]);\n\n  function Match(pathname, params, query, routes) {\n    _classCallCheck(this, Match);\n\n    this.pathname = pathname;\n    this.params = params;\n    this.query = query;\n    this.routes = routes;\n  }\n\n  return Match;\n})();\n\nmodule.exports = Match;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/Match.js\n// module id = 768\n// module chunks = 0 1","'use strict';\n\nfunction supportsHistory() {\n  /*! taken from modernizr\n   * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n   * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n   * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586\n   */\n  var ua = navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) {\n    return false;\n  }\n  return window.history && 'pushState' in window.history;\n}\n\nmodule.exports = supportsHistory;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/supportsHistory.js\n// module id = 769\n// module chunks = 0 1","'use strict';\n\nvar createRouter = require('./createRouter');\n\n/**\n * A high-level convenience method that creates, configures, and\n * runs a router in one shot. The method signature is:\n *\n *   Router.run(routes[, location ], callback);\n *\n * Using `window.location.hash` to manage the URL, you could do:\n *\n *   Router.run(routes, function (Handler) {\n *     React.render(<Handler/>, document.body);\n *   });\n * \n * Using HTML5 history and a custom \"cursor\" prop:\n * \n *   Router.run(routes, Router.HistoryLocation, function (Handler) {\n *     React.render(<Handler cursor={cursor}/>, document.body);\n *   });\n *\n * Returns the newly created router.\n *\n * Note: If you need to specify further options for your router such\n * as error/abort handling or custom scroll behavior, use Router.create\n * instead.\n *\n *   var router = Router.create(options);\n *   router.run(function (Handler) {\n *     // ...\n *   });\n */\nfunction runRouter(routes, location, callback) {\n  if (typeof location === 'function') {\n    callback = location;\n    location = null;\n  }\n\n  var router = createRouter({\n    routes: routes,\n    location: location\n  });\n\n  router.run(callback);\n\n  return router;\n}\n\nmodule.exports = runRouter;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-router/build/lib/runRouter.js\n// module id = 770\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = function (mapStateToProps) {\n  for (var _len = arguments.length, stores = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    stores[_key - 1] = arguments[_key];\n  }\n\n  function computeStateProps(props) {\n    return _extends({}, props, mapStateToProps());\n  }\n\n  return function (WrappedComponent) {\n    var Connect = (0, _createReactClass2.default)({\n      displayName: 'Connect',\n\n      mixins: [_store_listener2.default.apply(undefined, stores)],\n\n      getInitialState: function getInitialState() {\n        return { props: computeStateProps(this.props) };\n      },\n      storeDidUpdate: function storeDidUpdate() {\n        this.setState({\n          props: computeStateProps(this.props)\n        });\n      },\n      render: function render() {\n        return _react2.default.createElement(WrappedComponent, this.state.props);\n      }\n    });\n    return Connect;\n  };\n};\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _createReactClass = require('create-react-class');\n\nvar _createReactClass2 = _interopRequireDefault(_createReactClass);\n\nvar _store_listener = require('./mixins/store_listener');\n\nvar _store_listener2 = _interopRequireDefault(_store_listener);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/connect.js\n// module id = 771\n// module chunks = 0 1","\"use strict\";\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Immutable = require('immutable');\nvar assign = require('object-assign');\n\nvar BaseStore = require('./base_store');\nvar Dispatcher = require('../dispatcher');\n\nvar ImmutableStore = function (_BaseStore) {\n  _inherits(ImmutableStore, _BaseStore);\n\n  function ImmutableStore(config) {\n    _classCallCheck(this, ImmutableStore);\n\n    var _this = _possibleConstructorReturn(this, (ImmutableStore.__proto__ || Object.getPrototypeOf(ImmutableStore)).call(this));\n\n    assign(_this, config);\n\n    _this._handlers = Immutable.Map();\n    _this._state = _this._toImmutable(_this.getInitialState());\n\n    Dispatcher.register(function (payload) {\n      var nextState = _this._handle(_this._state, payload.action);\n      if (nextState && nextState !== _this._state) {\n        _this._state = nextState;\n        _this.emitChange();\n      }\n    });\n\n    _this._bindActions();\n\n    _this.initialize();\n    return _this;\n  }\n\n  _createClass(ImmutableStore, [{\n    key: 'getInitialState',\n    value: function getInitialState() {\n      return Immutable.Map();\n    }\n\n    /**\n     * Stores may override this to perform setup operations such as\n     * adding action handlers or initialize the state.\n     */\n\n  }, {\n    key: 'initialize',\n    value: function initialize() {}\n  }, {\n    key: 'getState',\n    value: function getState() {\n      return this._state;\n    }\n  }, {\n    key: '_handle',\n    value: function _handle(currentState, action) {\n      var nextState = currentState;\n      var handler = this._handlers.get(action.actionType);\n      if (typeof handler === 'function') {\n        nextState = this._toImmutable(handler.call(this, currentState, action));\n      }\n      return nextState;\n    }\n\n    /**\n     * Binds an action type to a handler function.\n     * Whenever this type of action is dispatched the handler\n     * funciton will be called passing it the current state and action payload.\n     */\n\n  }, {\n    key: 'on',\n    value: function on(actionType, handler) {\n      this._handlers = this._handlers.set(actionType, handler);\n    }\n  }, {\n    key: '_bindActions',\n    value: function _bindActions() {\n      var actions = this.actions;\n\n\n      if (!actions) {\n        return;\n      }\n\n      for (var key in actions) {\n        var handler = actions[key];\n        if (!handler) {\n          continue;\n        }\n        this.on(key, handler);\n      }\n    }\n  }, {\n    key: '_toImmutable',\n    value: function _toImmutable(state) {\n      return Immutable.Iterable.isIterable(state) ? state : Immutable.fromJS(state);\n    }\n  }]);\n\n  return ImmutableStore;\n}(BaseStore);\n\nmodule.exports = ImmutableStore;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_flux/build/stores/immutable_store.js\n// module id = 772\n// module chunks = 0 1","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/flux/index.js\n// module id = 773\n// module chunks = 0 1","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * \n * @preventMunge\n */\n\n'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = require('fbjs/lib/invariant');\n\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n *   1) Callbacks are not subscribed to particular events. Every payload is\n *      dispatched to every registered callback.\n *   2) Callbacks can be deferred in whole or part until other callbacks have\n *      been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n *   var flightDispatcher = new Dispatcher();\n *\n *   // Keeps track of which country is selected\n *   var CountryStore = {country: null};\n *\n *   // Keeps track of which city is selected\n *   var CityStore = {city: null};\n *\n *   // Keeps track of the base flight price of the selected city\n *   var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'city-update',\n *     selectedCity: 'paris'\n *   });\n *\n * This payload is digested by `CityStore`:\n *\n *   flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'city-update') {\n *       CityStore.city = payload.selectedCity;\n *     }\n *   });\n *\n * When the user selects a country, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'country-update',\n *     selectedCountry: 'australia'\n *   });\n *\n * This payload is digested by both stores:\n *\n *   CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       CountryStore.country = payload.selectedCountry;\n *     }\n *   });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n *   CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       // `CountryStore.country` may not be updated.\n *       flightDispatcher.waitFor([CountryStore.dispatchToken]);\n *       // `CountryStore.country` is now guaranteed to be updated.\n *\n *       // Select the default city for the new country\n *       CityStore.city = getDefaultCityForCountry(CountryStore.country);\n *     }\n *   });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n *   FlightPriceStore.dispatchToken =\n *     flightDispatcher.register(function(payload) {\n *       switch (payload.actionType) {\n *         case 'country-update':\n *         case 'city-update':\n *           flightDispatcher.waitFor([CityStore.dispatchToken]);\n *           FlightPriceStore.price =\n *             getFlightPriceStore(CountryStore.country, CityStore.city);\n *           break;\n *     }\n *   });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\nvar Dispatcher = (function () {\n  function Dispatcher() {\n    _classCallCheck(this, Dispatcher);\n\n    this._callbacks = {};\n    this._isDispatching = false;\n    this._isHandled = {};\n    this._isPending = {};\n    this._lastID = 1;\n  }\n\n  /**\n   * Registers a callback to be invoked with every dispatched payload. Returns\n   * a token that can be used with `waitFor()`.\n   */\n\n  Dispatcher.prototype.register = function register(callback) {\n    var id = _prefix + this._lastID++;\n    this._callbacks[id] = callback;\n    return id;\n  };\n\n  /**\n   * Removes a callback based on its token.\n   */\n\n  Dispatcher.prototype.unregister = function unregister(id) {\n    !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined;\n    delete this._callbacks[id];\n  };\n\n  /**\n   * Waits for the callbacks specified to be invoked before continuing execution\n   * of the current callback. This method should only be used by a callback in\n   * response to a dispatched payload.\n   */\n\n  Dispatcher.prototype.waitFor = function waitFor(ids) {\n    !this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Must be invoked while dispatching.') : invariant(false) : undefined;\n    for (var ii = 0; ii < ids.length; ii++) {\n      var id = ids[ii];\n      if (this._isPending[id]) {\n        !this._isHandled[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id) : invariant(false) : undefined;\n        continue;\n      }\n      !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined;\n      this._invokeCallback(id);\n    }\n  };\n\n  /**\n   * Dispatches a payload to all registered callbacks.\n   */\n\n  Dispatcher.prototype.dispatch = function dispatch(payload) {\n    !!this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : undefined;\n    this._startDispatching(payload);\n    try {\n      for (var id in this._callbacks) {\n        if (this._isPending[id]) {\n          continue;\n        }\n        this._invokeCallback(id);\n      }\n    } finally {\n      this._stopDispatching();\n    }\n  };\n\n  /**\n   * Is this Dispatcher currently dispatching.\n   */\n\n  Dispatcher.prototype.isDispatching = function isDispatching() {\n    return this._isDispatching;\n  };\n\n  /**\n   * Call the callback stored with the given id. Also do some internal\n   * bookkeeping.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._invokeCallback = function _invokeCallback(id) {\n    this._isPending[id] = true;\n    this._callbacks[id](this._pendingPayload);\n    this._isHandled[id] = true;\n  };\n\n  /**\n   * Set up bookkeeping needed when dispatching.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._startDispatching = function _startDispatching(payload) {\n    for (var id in this._callbacks) {\n      this._isPending[id] = false;\n      this._isHandled[id] = false;\n    }\n    this._pendingPayload = payload;\n    this._isDispatching = true;\n  };\n\n  /**\n   * Clear bookkeeping used for dispatching.\n   *\n   * @internal\n   */\n\n  Dispatcher.prototype._stopDispatching = function _stopDispatching() {\n    delete this._pendingPayload;\n    this._isDispatching = false;\n  };\n\n  return Dispatcher;\n})();\n\nmodule.exports = Dispatcher;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/flux/lib/Dispatcher.js\n// module id = 774\n// module chunks = 0 1","import Backbone from 'backbone';\nimport Entity from './entity';\n\nexport default Backbone.Collection.extend({\n  url: '/api/v1/entities?limit=10000&managed_entities=true&fields=id,name,entity_id,state,country,subdomain,display_name',\n  model: Entity,\n\n  parse(response) {\n    return response.entities;\n  },\n\n  initialize() {\n    this.selected = new Entity();\n    this.nullEntity = new Entity();\n    this.nullEntity.set({\n      id: 'opengov',\n      name: 'OpenGov',\n      logo: '/assets/@opengov/ovid/dist/images/default-logo@2x.png',\n      entity_id: '*',\n      color: {\n        index: 0\n      },\n      isGlobal: true\n    });\n    this.nullEntity.fetched = true;\n\n    this.on('reset', () => {\n      this.select(this.selected.get('id'));\n    });\n  },\n\n  select(id) {\n    if (id === 'opengov') {\n      return this.nullEntity;\n    }\n\n    return this.get(id) || new Entity({id: id});\n  },\n\n  getDraft() {\n    const draft = this.draftEntity || new Entity();\n    this.draftEntity = draft;\n    return draft;\n  },\n\n  discardDraft() {\n    this.draftEntity = null;\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/controlpanel/lib/models/entities.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport _d from 'lodash-deep';\n\nconst Form = createReactClass({\n  propTypes: {\n    initialValues: PropTypes.object,\n    errors: PropTypes.object,\n    onSubmit: PropTypes.func,\n    onChange: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      initialValues: {},\n      onChange: _.noop,\n      onSubmit: _.noop,\n      errors: {}\n    };\n  },\n\n  getInitialState() {\n    return {};\n  },\n\n  render() {\n    const { errors, formClass, onSubmit, children } = this.props;\n\n    return (\n      <form className={formClass} onSubmit={onSubmit}>\n        {React.Children.map(children, (field) => {\n          if (!field) {\n            return;\n          }\n\n          const { name } = field.props;\n          if (name) {\n            field = React.cloneElement(field, {\n              value: this.currentFieldValue(name),\n              onChange: this.handleChange.bind(this, name),\n              errors: errors[name]\n            });\n          }\n\n          return field;\n        }, this)}\n      </form>\n    );\n  },\n\n  currentFieldValue(fieldName) {\n    let value = _d.deepGet(this.state, fieldName);\n    if (value == null) {\n      value = _d.deepGet(this.props.initialValues, fieldName);\n    }\n    return value;\n  },\n\n  handleChange(fieldName, newValue) {\n    const newState = _.clone(this.state);\n    _d.deepSet(newState, fieldName, newValue);\n    this.setState(newState);\n    this.props.onChange(fieldName, newValue);\n  },\n\n  values() {\n    return _.clone(this.state);\n  },\n\n  reset() {\n    this.replaceState({});\n  }\n});\n\nexport default Form;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/form.js","/**\r\n * Lodash mixins for (deep) object accessing / manipulation.\r\n * @author Mark Lagendijk <mark@lagendijk.info>\r\n * @license MIT\r\n */\r\n(function(root, factory){\r\n    if(typeof define === 'function' && define.amd){\r\n        // AMD. Register as an anonymous module.\r\n        define(['lodash'], factory);\r\n    }\r\n    else if(typeof exports === 'object'){\r\n        // Node. Does not work with strict CommonJS, but\r\n        // only CommonJS-like environments that support module.exports,\r\n        // like Node.\r\n        module.exports = factory(require('lodash').runInContext());\r\n    }\r\n    else{\r\n        // Browser globals (root is window)\r\n        root._.mixin(factory(root._));\r\n    }\r\n}(this, function(_, undefined){\r\n    'use strict';\r\n\r\n    var mixins = /** @lends _ */ {\r\n        /**\r\n         * Executes a deep check for the existence of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepIn: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            for(var i = 0; i < properties.length; i++){\r\n                var property = properties[i];\r\n                if(_.has(collection, property) ||\r\n                    _.isObject(collection) && property in collection){\r\n                    collection = collection[property];\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        },\r\n        /**\r\n         * Executes a deep check for the existence of a own property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepHas: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            for(var i = 0; i < properties.length; i++){\r\n                var property = properties[i];\r\n                if(_.has(collection, property)){\r\n                    collection = collection[property];\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        },\r\n        /**\r\n         * Retrieves the own value of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*} - The value, or undefined if it doesn't exists.\r\n         */\r\n        deepOwn: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.deepHas(collection, properties)){\r\n                return _.reduce(properties, function(object, property){\r\n                    return object[property];\r\n                }, collection);\r\n            }\r\n        },\r\n        /**\r\n         * Retrieves the value of a property in an object tree.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*} - The value, or undefined if it doesn't exists.\r\n         */\r\n        deepGet: function(collection, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.deepIn(collection, properties)){\r\n                return _.reduce(properties, function(object, property){\r\n                    return object[property];\r\n                }, collection);\r\n            }\r\n        },\r\n        /**\r\n         * Sets a value of a property in an object tree. Any missing objects/arrays will be created.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @param {*} value - The value to set.\r\n         * @returns {Object} The object.\r\n         */\r\n        deepSet: function(collection, propertyPath, value){\r\n            var properties = getProperties(propertyPath);\r\n            var currentObject = collection;\r\n            _.forEach(properties, function(property, index){\r\n                if(index + 1 === properties.length){\r\n                    currentObject[property] = value;\r\n                }\r\n                else if(!_.isObject(currentObject[property])){\r\n                    currentObject[property] = isArrayKey(properties[index + 1]) ? [] : {};\r\n                }\r\n                currentObject = currentObject[property];\r\n            });\r\n\r\n            return collection;\r\n        },\r\n        /**\r\n         * Checks if the value at the propertyPath resolves to undefined, and sets it to defaultValue if this is the\r\n         * case.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {*} defaultValue - The default value.\r\n         * @returns {*} Either the existing, unchanged value, or the new (default) value.\r\n         */\r\n        deepDefault: function(collection, propertyPath, defaultValue){\r\n            var value = _.deepGet(collection, propertyPath);\r\n            if(_.isUndefined(value)){\r\n                _.deepSet(collection, propertyPath, defaultValue);\r\n                return defaultValue;\r\n            }\r\n            else{\r\n                return value;\r\n            }\r\n        },\r\n        /**\r\n         * Calls a function located at the specified property path, if it exists.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {Object} [thisArg] - The 'this' argument the function should be executed with.\r\n         * @param {...*} [arg] - One of the arguments the function should be executed with. Can occur 0..n times.\r\n         * @returns {*} The result of executing the function, or undefined if it doesn't exist.\r\n         */\r\n        deepCall: function(collection, propertyPath, thisArg, arg){\r\n            var args = Array.prototype.slice.call(arguments, 3);\r\n            return _.deepApply(collection, propertyPath, thisArg, args);\r\n        },\r\n        /**\r\n         * Applies a function located at the specified property path, if it exists.\r\n         * @param {Object|Array} collection - The collection of object trees.\r\n         * @param {string|Array} propertyPath - The propertyPath of the function.\r\n         * @param {Object} [thisArg] - The 'this' argument the function should be executed with.\r\n         * @param {Array} [args] - An array of the arguments the function should be executed with.\r\n         * @returns {*} The result of executing the function, or undefined if it doesn't exist.\r\n         */\r\n        deepApply: function(collection, propertyPath, thisArg, args){\r\n            var func = _.deepGet(collection, propertyPath);\r\n            if(_.isFunction(func)){\r\n                return func.apply(thisArg, args);\r\n            }\r\n        },\r\n        /**\r\n         * Escapes a property name for usage in a string based property path.\r\n         * @param {string} propertyName - The name / key of the property.\r\n         * @returns {string}\r\n         */\r\n        deepEscapePropertyName: function(propertyName){\r\n            return propertyName\r\n                .replace(/\\\\/g, '\\\\\\\\')\r\n                .replace(/(\\.|\\[|\\])/g, '\\\\$1');\r\n        },\r\n        /**\r\n         * Maps all values in an object tree and returns a new object with the same structure as the original.\r\n         * @param {Object} object - The object to map.\r\n         * @param {Function} callback - The function to be called per iteration on any non-object value in the tree.\r\n         *   Callback is invoked with 2 arguments: (value, propertyPath)\r\n         *   propertyPath is the path of the current property, in array format.\r\n         * @returns {Object}\r\n         */\r\n        deepMapValues: function(object, callback, propertyPath){\r\n            var properties = getProperties(propertyPath);\r\n            if(_.isArray(object)){\r\n                return _.map(object, deepMapValuesIteratee);\r\n            }\r\n            else if(_.isObject(object) && !_.isDate(object) && !_.isRegExp(object)){\r\n                return _.extend({}, object, _.mapValues(object, deepMapValuesIteratee));\r\n            }\r\n            else{\r\n                return callback(object, properties);\r\n            }\r\n\r\n            function deepMapValuesIteratee(value, key){\r\n                return _.deepMapValues(value, callback, _.flatten([properties, key]));\r\n            }\r\n        },\r\n        /**\r\n         * @function\r\n         * Executes a deep pluck on an collection of object trees.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepPluck: createDeepPluckStyleCallback(_.map),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findIndex _.findIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepFindIndex: createDeepPluckStyleCallback(_.findIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findLastIndex _.findLastIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepFindLastIndex: createDeepPluckStyleCallback(_.findLastIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#first _.first} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepFirst: createDeepPluckStyleCallback(_.first),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#flatten _.flatten} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepFlatten: createDeepPluckStyleCallback(_.flatten),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#initial _.initial} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepInitial: createDeepPluckStyleCallback(_.initial),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#last _.last} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepLast: createDeepPluckStyleCallback(_.last),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#lastIndexOf _.lastIndexOf} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepLastIndexOf: createDeepPluckStyleCallback(_.lastIndexOf),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#remove _.remove} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepRemove: createDeepPluckStyleCallback(_.remove),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#rest _.rest} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepRest: createDeepPluckStyleCallback(_.rest),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#sortedIndex _.sortedIndex} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {int}\r\n         */\r\n        deepSortedIndex: createDeepPluckStyleCallback(_.sortedIndex),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#uniq _.uniq} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepUniq: createDeepPluckStyleCallback(_.uniq),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#countBy _.countBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepCountBy: createDeepPluckStyleCallback(_.countBy),\r\n        /**\r\n         * @function\r\n         * Executes{@link https://lodash.com/docs#every _.every} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepEvery: createDeepPluckStyleCallback(_.every),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#filter _.filter} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepFilter: createDeepPluckStyleCallback(_.filter),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#find _.find} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepFind: createDeepPluckStyleCallback(_.find),\r\n        /**\r\n         * @function\r\n         * Executes{@link https://lodash.com/docs#groupBy _.groupBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepGroupBy: createDeepPluckStyleCallback(_.groupBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#indexBy _.indexBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Object}\r\n         */\r\n        deepIndexBy: createDeepPluckStyleCallback(_.indexBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#max _.max} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepMax: createDeepPluckStyleCallback(_.max),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#min _.min} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {*}\r\n         */\r\n        deepMin: createDeepPluckStyleCallback(_.min),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#reject _.reject} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepReject: createDeepPluckStyleCallback(_.reject),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#some _.some} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {boolean}\r\n         */\r\n        deepSome: createDeepPluckStyleCallback(_.some),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#sortBy _.sortBy} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {Array}\r\n         */\r\n        deepSortBy: createDeepPluckStyleCallback(_.sortBy),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findKey _.findKey} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {string|undefined}\r\n         */\r\n        deepFindKey: createDeepPluckStyleCallback(_.findKey),\r\n        /**\r\n         * @function\r\n         * Executes {@link https://lodash.com/docs#findLastKey _.findLastKey} with a \"_.deepPluck\" style callback.\r\n         * @param {Object|Array} collection - The root object/array of the tree.\r\n         * @param {string|Array} propertyPath - The propertyPath.\r\n         * @returns {string|undefined}\r\n         */\r\n        deepFindLastKey: createDeepPluckStyleCallback(_.findLastKey)\r\n    };\r\n\r\n    // Support pre 1.2.0 function names\r\n    mixins.deepSetValue = mixins.deepSet;\r\n    mixins.deepGetValue = mixins.deepGet;\r\n    mixins.deepGetOwnValue = mixins.deepOwn;\r\n\r\n    _.mixin(mixins);\r\n\r\n    /**\r\n     * Returns the property path as array.\r\n     * @param {string|Array} propertyPath\r\n     * @returns {Array}\r\n     */\r\n    function getProperties(propertyPath){\r\n        if(_.isArray(propertyPath)){\r\n            return propertyPath;\r\n        }\r\n\r\n        if(!_.isString(propertyPath)){\r\n            return [];\r\n        }\r\n\r\n        return parseStringPropertyPath(propertyPath);\r\n    }\r\n\r\n    /**\r\n     * Parses a string based propertyPath\r\n     * @param {string} propertyPath\r\n     * @returns {Array}\r\n     */\r\n    function parseStringPropertyPath(propertyPath){\r\n        var character = '';\r\n        var parsedPropertyPath = [];\r\n        var parsedPropertyPathPart = '';\r\n        var escapeNextCharacter = false;\r\n        var isSpecialCharacter = false;\r\n        var insideBrackets = false;\r\n\r\n        // Walk through the path and find backslashes that escape periods or other backslashes, and split on unescaped\r\n        // periods and brackets.\r\n        for(var i = 0; i < propertyPath.length; i++){\r\n            character = propertyPath[i];\r\n            isSpecialCharacter = (character === '\\\\' || character === '[' || character === ']' || character === '.');\r\n\r\n            if(isSpecialCharacter && !escapeNextCharacter){\r\n                if(insideBrackets && character !== ']'){\r\n                    throw new SyntaxError('unexpected \"' + character + '\" within brackets at character ' + i + ' in property path ' + propertyPath);\r\n                }\r\n\r\n                switch(character){\r\n                case '\\\\':\r\n                    escapeNextCharacter = true;\r\n                    break;\r\n                case ']':\r\n                    insideBrackets = false;\r\n                    break;\r\n                case '[':\r\n                    insideBrackets = true;\r\n                    /* falls through */\r\n                case '.':\r\n                    parsedPropertyPath.push(parsedPropertyPathPart);\r\n                    parsedPropertyPathPart = '';\r\n                    break;\r\n                }\r\n            }\r\n            else{\r\n                parsedPropertyPathPart += character;\r\n                escapeNextCharacter = false;\r\n            }\r\n        }\r\n\r\n        if(parsedPropertyPath[0] === ''){\r\n            //allow '[0]', or '.0'\r\n            parsedPropertyPath.splice(0, 1);\r\n        }\r\n\r\n        // capture the final part\r\n        parsedPropertyPath.push(parsedPropertyPathPart);\r\n        return parsedPropertyPath;\r\n    }\r\n\r\n    /**\r\n     * Creates a function which executes the originalFunction with a \"_.deepPluck\" style callback.\r\n     * @param {Function} originalFunction - The orignal (Lodash) function.\r\n     * @returns {Function}\r\n     */\r\n    function createDeepPluckStyleCallback(originalFunction){\r\n        return function(collection, propertyPath){\r\n            return originalFunction(collection, function(item){\r\n                return _.deepGet(item, propertyPath);\r\n            });\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Checks whether key is a valid array key\r\n     * @param key\r\n     * @returns {boolean}\r\n     */\r\n    function isArrayKey(key){\r\n        var array = [];\r\n        array[key] = null;\r\n        return array.length > 0;\r\n    }\r\n\r\n    return mixins;\r\n}));\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/lodash-deep/lodash-deep.js\n// module id = 777\n// module chunks = 0 1","\"use strict\";\n\nimport React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Field from './field';\n\nconst InputField = createReactClass({\n  mixins: [Field],\n\n  propTypes: {\n    disabled: PropTypes.bool,\n    type: PropTypes.string,\n    placeholder: PropTypes.string\n  },\n\n  getDefaultProps() {\n    return {\n      disabled: false,\n      type: 'text',\n      placeholder: ''\n    };\n  },\n\n  render() {\n    return this.renderFieldSet(\n      <input\n        disabled={this.props.disabled}\n        value={this.props.value}\n        onChange={(e) => this.props.onChange(e.target.value)}\n        type={this.props.type}\n        placeholder={this.props.placeholder} />\n    );\n  }\n});\n\nexport default InputField;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/input_field.js","import React from 'react';\nimport PropTypes from 'prop-types';\nimport createReactClass from 'create-react-class';\nimport classnames from 'classnames';\nimport Field from './field';\n\nconst Toggle = createReactClass({\n  mixins: [Field],\n\n  propTypes: {\n    toggleLabel: PropTypes.object,\n    toggleLabelIcon: PropTypes.object,\n    disabled: PropTypes.bool,\n    handleToggle: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      toggleLabel: { true: 'Enabled', false: 'Disabled' },\n      toggleLabelIcon: {},\n      disabled: false,\n      handleToggle: () => {}\n    };\n  },\n\n  render() {\n    const { value, disabled, toggleLabelIcon, toggleLabel, onChange } = this.props;\n\n    const toggleClasses = classnames({\n      'ui-toggle': true,\n      'is-true': value,\n      disabled: disabled\n    });\n\n    return this.renderFieldSet(\n      <fieldset className=\"ui-toggle__wrapper\">\n        <button\n          type=\"button\"\n          role=\"checkbox\"\n          className={toggleClasses}\n          onClick={() => onChange(!value)}\n          onKeyPress={() => onChange(!value)}\n          aria-checked={value}\n          disabled={disabled}\n        >\n          <div className=\"ui-toggle__handle\">\n            <div className=\"ui-toggle__knob\"></div>\n            <div className=\"ui-toggle__track\"></div>\n          </div>\n          <div className=\"ui-toggle__label\">\n            <span className={toggleLabelIcon[value ? 'true' : 'false']} />\n            {toggleLabel[value ? 'true' : 'false']}\n          </div>\n        </button>\n      </fieldset>\n    );\n  }\n});\n\nexport default Toggle;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/toggle.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Field from './field';\n\nconst TextAreaField = createReactClass({\n  mixins: [Field],\n\n  propTypes: {\n    placeholder: PropTypes.string\n  },\n\n  getDefaultProps() {\n    return {\n      type: 'text',\n      placeholder: ''\n    };\n  },\n\n  render() {\n    const { value, placeholder, onChange } = this.props;\n    return this.renderFieldSet(\n      <textarea value={value} placeholder={placeholder} onChange={e => onChange(e.target.value)} />\n    );\n  }\n});\n\nexport default TextAreaField;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/textarea.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Field from './field';\n\nconst SelectField = createReactClass({\n  mixins: [Field],\n\n  propTypes: {\n    items: PropTypes.arrayOf(\n      PropTypes.shape({\n        option: PropTypes.any.isRequired,\n        value: PropTypes.any,\n        disabled: PropTypes.bool\n      })\n    ),\n    disabled: PropTypes.bool\n  },\n\n  getDefaultProps() {\n    return { items: [] };\n  },\n\n  render() {\n    const { name, value, onChange, disabled, items } = this.props;\n    return this.renderFieldSet(\n      <select value={value} onChange={(e) => onChange(e.target.value)} disabled={disabled}>\n        {items.map((item) => (\n          <option key={item.value} value={item.value} disabled={item.disabled}>\n            {item.option}\n          </option>\n        ))}\n      </select>\n    );\n  }\n});\n\nexport default SelectField;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/forms/select_field.js","import React from 'react';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport Calendar from './calendar';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Dropdown from './dropdown';\n\nconst selectionModes = { days: 'MMM Do YYYY', months: 'MMM YYYY', years: 'YYYY' };\n\nconst DatePicker = createReactClass({\n  propTypes: {\n    date: PropTypes.any,\n    minYear: PropTypes.any,\n    maxYear: PropTypes.any,\n    minSelectionMode: PropTypes.oneOf(Object.keys(selectionModes)),\n    onDateSelected: PropTypes.func,\n    formatDisplayDate: PropTypes.func\n  },\n\n  getInitialState: function() {\n    return { selectedText: '' };\n  },\n\n  componentWillReceiveProps: function(nextProps) {\n    if (nextProps.date) {\n      this.setSelectedText(moment(nextProps.date), this.props.minSelectionMode);\n    }\n  },\n\n  handleDateChanged: function(date, mode) {\n    this.setSelectedText(date, mode);\n    if (this.props.onDateSelected) {\n      this.props.onDateSelected(date, mode);\n    }\n  },\n\n  setSelectedText: function(date, mode) {\n    //If a formatDisplayDate function isn't provided, use a default formatting (based on mode day/month/year)\n    if (!this.props.formatDisplayDate) {\n      this.setState({ selectedText: date.format(selectionModes[mode]) });\n    } else {\n      this.setState({ selectedText: this.props.formatDisplayDate(date) });\n    }\n  },\n\n  render: function() {\n    return (\n      <Dropdown\n        dropdownClass=\"ui-dropdown\"\n        toggleClass=\"ui-dropdown__toggle ui-button icon-calendar-1\"\n        targetClass=\"ui-dropdown__target ui-datepicker__wrapper\"\n        title={this.state.selectedText}\n        disabled={false}\n        ignoreContentClicks={true}\n      >\n        <Calendar\n          minYear={this.props.minYear}\n          maxYear={this.props.maxYear}\n          date={this.props.date}\n          minSelectionMode={this.props.minSelectionMode}\n          onDateSelected={this.handleDateChanged}\n        />\n      </Dropdown>\n    );\n  }\n});\n\nexport default DatePicker;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/date_picker.js","var map = {\n\t\"./af\": 372,\n\t\"./af.js\": 372,\n\t\"./ar\": 373,\n\t\"./ar-dz\": 374,\n\t\"./ar-dz.js\": 374,\n\t\"./ar-kw\": 375,\n\t\"./ar-kw.js\": 375,\n\t\"./ar-ly\": 376,\n\t\"./ar-ly.js\": 376,\n\t\"./ar-ma\": 377,\n\t\"./ar-ma.js\": 377,\n\t\"./ar-sa\": 378,\n\t\"./ar-sa.js\": 378,\n\t\"./ar-tn\": 379,\n\t\"./ar-tn.js\": 379,\n\t\"./ar.js\": 373,\n\t\"./az\": 380,\n\t\"./az.js\": 380,\n\t\"./be\": 381,\n\t\"./be.js\": 381,\n\t\"./bg\": 382,\n\t\"./bg.js\": 382,\n\t\"./bm\": 383,\n\t\"./bm.js\": 383,\n\t\"./bn\": 384,\n\t\"./bn.js\": 384,\n\t\"./bo\": 385,\n\t\"./bo.js\": 385,\n\t\"./br\": 386,\n\t\"./br.js\": 386,\n\t\"./bs\": 387,\n\t\"./bs.js\": 387,\n\t\"./ca\": 388,\n\t\"./ca.js\": 388,\n\t\"./cs\": 389,\n\t\"./cs.js\": 389,\n\t\"./cv\": 390,\n\t\"./cv.js\": 390,\n\t\"./cy\": 391,\n\t\"./cy.js\": 391,\n\t\"./da\": 392,\n\t\"./da.js\": 392,\n\t\"./de\": 393,\n\t\"./de-at\": 394,\n\t\"./de-at.js\": 394,\n\t\"./de-ch\": 395,\n\t\"./de-ch.js\": 395,\n\t\"./de.js\": 393,\n\t\"./dv\": 396,\n\t\"./dv.js\": 396,\n\t\"./el\": 397,\n\t\"./el.js\": 397,\n\t\"./en-au\": 398,\n\t\"./en-au.js\": 398,\n\t\"./en-ca\": 399,\n\t\"./en-ca.js\": 399,\n\t\"./en-gb\": 400,\n\t\"./en-gb.js\": 400,\n\t\"./en-ie\": 401,\n\t\"./en-ie.js\": 401,\n\t\"./en-il\": 402,\n\t\"./en-il.js\": 402,\n\t\"./en-nz\": 403,\n\t\"./en-nz.js\": 403,\n\t\"./eo\": 404,\n\t\"./eo.js\": 404,\n\t\"./es\": 405,\n\t\"./es-do\": 406,\n\t\"./es-do.js\": 406,\n\t\"./es-us\": 407,\n\t\"./es-us.js\": 407,\n\t\"./es.js\": 405,\n\t\"./et\": 408,\n\t\"./et.js\": 408,\n\t\"./eu\": 409,\n\t\"./eu.js\": 409,\n\t\"./fa\": 410,\n\t\"./fa.js\": 410,\n\t\"./fi\": 411,\n\t\"./fi.js\": 411,\n\t\"./fo\": 412,\n\t\"./fo.js\": 412,\n\t\"./fr\": 413,\n\t\"./fr-ca\": 414,\n\t\"./fr-ca.js\": 414,\n\t\"./fr-ch\": 415,\n\t\"./fr-ch.js\": 415,\n\t\"./fr.js\": 413,\n\t\"./fy\": 416,\n\t\"./fy.js\": 416,\n\t\"./gd\": 417,\n\t\"./gd.js\": 417,\n\t\"./gl\": 418,\n\t\"./gl.js\": 418,\n\t\"./gom-latn\": 419,\n\t\"./gom-latn.js\": 419,\n\t\"./gu\": 420,\n\t\"./gu.js\": 420,\n\t\"./he\": 421,\n\t\"./he.js\": 421,\n\t\"./hi\": 422,\n\t\"./hi.js\": 422,\n\t\"./hr\": 423,\n\t\"./hr.js\": 423,\n\t\"./hu\": 424,\n\t\"./hu.js\": 424,\n\t\"./hy-am\": 425,\n\t\"./hy-am.js\": 425,\n\t\"./id\": 426,\n\t\"./id.js\": 426,\n\t\"./is\": 427,\n\t\"./is.js\": 427,\n\t\"./it\": 428,\n\t\"./it.js\": 428,\n\t\"./ja\": 429,\n\t\"./ja.js\": 429,\n\t\"./jv\": 430,\n\t\"./jv.js\": 430,\n\t\"./ka\": 431,\n\t\"./ka.js\": 431,\n\t\"./kk\": 432,\n\t\"./kk.js\": 432,\n\t\"./km\": 433,\n\t\"./km.js\": 433,\n\t\"./kn\": 434,\n\t\"./kn.js\": 434,\n\t\"./ko\": 435,\n\t\"./ko.js\": 435,\n\t\"./ky\": 436,\n\t\"./ky.js\": 436,\n\t\"./lb\": 437,\n\t\"./lb.js\": 437,\n\t\"./lo\": 438,\n\t\"./lo.js\": 438,\n\t\"./lt\": 439,\n\t\"./lt.js\": 439,\n\t\"./lv\": 440,\n\t\"./lv.js\": 440,\n\t\"./me\": 441,\n\t\"./me.js\": 441,\n\t\"./mi\": 442,\n\t\"./mi.js\": 442,\n\t\"./mk\": 443,\n\t\"./mk.js\": 443,\n\t\"./ml\": 444,\n\t\"./ml.js\": 444,\n\t\"./mr\": 445,\n\t\"./mr.js\": 445,\n\t\"./ms\": 446,\n\t\"./ms-my\": 447,\n\t\"./ms-my.js\": 447,\n\t\"./ms.js\": 446,\n\t\"./mt\": 448,\n\t\"./mt.js\": 448,\n\t\"./my\": 449,\n\t\"./my.js\": 449,\n\t\"./nb\": 450,\n\t\"./nb.js\": 450,\n\t\"./ne\": 451,\n\t\"./ne.js\": 451,\n\t\"./nl\": 452,\n\t\"./nl-be\": 453,\n\t\"./nl-be.js\": 453,\n\t\"./nl.js\": 452,\n\t\"./nn\": 454,\n\t\"./nn.js\": 454,\n\t\"./pa-in\": 455,\n\t\"./pa-in.js\": 455,\n\t\"./pl\": 456,\n\t\"./pl.js\": 456,\n\t\"./pt\": 457,\n\t\"./pt-br\": 458,\n\t\"./pt-br.js\": 458,\n\t\"./pt.js\": 457,\n\t\"./ro\": 459,\n\t\"./ro.js\": 459,\n\t\"./ru\": 460,\n\t\"./ru.js\": 460,\n\t\"./sd\": 461,\n\t\"./sd.js\": 461,\n\t\"./se\": 462,\n\t\"./se.js\": 462,\n\t\"./si\": 463,\n\t\"./si.js\": 463,\n\t\"./sk\": 464,\n\t\"./sk.js\": 464,\n\t\"./sl\": 465,\n\t\"./sl.js\": 465,\n\t\"./sq\": 466,\n\t\"./sq.js\": 466,\n\t\"./sr\": 467,\n\t\"./sr-cyrl\": 468,\n\t\"./sr-cyrl.js\": 468,\n\t\"./sr.js\": 467,\n\t\"./ss\": 469,\n\t\"./ss.js\": 469,\n\t\"./sv\": 470,\n\t\"./sv.js\": 470,\n\t\"./sw\": 471,\n\t\"./sw.js\": 471,\n\t\"./ta\": 472,\n\t\"./ta.js\": 472,\n\t\"./te\": 473,\n\t\"./te.js\": 473,\n\t\"./tet\": 474,\n\t\"./tet.js\": 474,\n\t\"./tg\": 475,\n\t\"./tg.js\": 475,\n\t\"./th\": 476,\n\t\"./th.js\": 476,\n\t\"./tl-ph\": 477,\n\t\"./tl-ph.js\": 477,\n\t\"./tlh\": 478,\n\t\"./tlh.js\": 478,\n\t\"./tr\": 479,\n\t\"./tr.js\": 479,\n\t\"./tzl\": 480,\n\t\"./tzl.js\": 480,\n\t\"./tzm\": 481,\n\t\"./tzm-latn\": 482,\n\t\"./tzm-latn.js\": 482,\n\t\"./tzm.js\": 481,\n\t\"./ug-cn\": 483,\n\t\"./ug-cn.js\": 483,\n\t\"./uk\": 484,\n\t\"./uk.js\": 484,\n\t\"./ur\": 485,\n\t\"./ur.js\": 485,\n\t\"./uz\": 486,\n\t\"./uz-latn\": 487,\n\t\"./uz-latn.js\": 487,\n\t\"./uz.js\": 486,\n\t\"./vi\": 488,\n\t\"./vi.js\": 488,\n\t\"./x-pseudo\": 489,\n\t\"./x-pseudo.js\": 489,\n\t\"./yo\": 490,\n\t\"./yo.js\": 490,\n\t\"./zh-cn\": 491,\n\t\"./zh-cn.js\": 491,\n\t\"./zh-hk\": 492,\n\t\"./zh-hk.js\": 492,\n\t\"./zh-tw\": 493,\n\t\"./zh-tw.js\": 493\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 783;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale ^\\.\\/.*$\n// module id = 783\n// module chunks = 0 1","import React from 'react';\nimport PureRenderMixin from 'react-addons-pure-render-mixin';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nimport jQuery from 'jquery';\nimport _ from 'lodash';\n\nimport eventUtils from '../event_utils';\n\nimport SliderHandle from './slider_handle';\nimport SliderRange from './slider_range';\n\nconst Slider = createReactClass({\n  mixins: [PureRenderMixin],\n\n  propTypes: {\n    min: PropTypes.number,\n    max: PropTypes.number,\n    value: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),\n    step: PropTypes.number,\n    handleClasses: PropTypes.object,\n\n    // Override component measurements here (ex: range width, label width)\n    // This is mainly used for testing, but may be useful elsewhere.\n    rangeWidth: PropTypes.number,\n    labelWidth: PropTypes.number,\n\n    // Called when the user has selected a new value or range.\n    onChange: PropTypes.func,\n\n    // Called when the user interacts with the slider handles.\n    // Provides notifications when a \"slide\" starts, moves, and ends.\n    onSliderStart: PropTypes.func,\n    onSliderMove: PropTypes.func,\n    onSliderEnd: PropTypes.func,\n\n    // Called when the user clicks a slider handle label.\n    onSliderClick: PropTypes.func\n  },\n\n  getDefaultProps: function() {\n    return {\n      min: 0,\n      max: 100,\n      value: 0,\n      step: 1\n    };\n  },\n\n  getInitialState: function() {\n    return {\n      handles: [{ position: 0 }],\n      focusedHandle: null\n    };\n  },\n\n  componentDidMount: function() {\n    this.$document = jQuery(document);\n\n    this.rangeWidth = this.props.rangeWidth || this.el.offsetWidth;\n    this.handleWidth = this['handle_0'].offsetWidth;\n    this.labelWidth = this.props.labelWidth || this['handle_label_0'].offsetWidth;\n    this.grabX = this.handleWidth / 2;\n\n    this.setState({\n      handles: this.getValues().map(value => {\n        return { position: this.getPositionFromValue(value) };\n      })\n    });\n  },\n\n  componentDidUpdate: function(prevProps) {\n    this.rangeWidth = this.props.rangeWidth || this.el.offsetWidth;\n    this.handleWidth = this['handle_0'].offsetWidth;\n    this.labelWidth = this.props.labelWidth || this['handle_label_0'].offsetWidth;\n    this.grabX = this.handleWidth / 2;\n\n    if (this.props.value !== prevProps.value) {\n      this.setState({\n        handles: this.getValues().map(value => {\n          return { position: this.getPositionFromValue(value) };\n        })\n      });\n    }\n  },\n\n  render: function() {\n    var values = this.getValues();\n\n    var handles = this.state.handles.map((handle, index) => {\n      var value = values[index];\n\n      var zindex;\n      if (value === this.props.min) {\n        zindex = index === 0 ? 10 : 100;\n      } else {\n        zindex = index === 0 ? 100 : 10;\n      }\n\n      var label = this.getValueFromPosition(handle.position);\n\n      return (\n        <SliderHandle\n          key={index}\n          sliderRef={el => this['handle_' + index] = el}\n          labelRef={el => this['handle_label_' + index] = el}\n          position={handle.position}\n          zindex={zindex}\n          handleClasses={_.result(this.props.handleClasses, index)}\n          onDown={_.partial(this.handleDown, index)}\n        >\n          {label}\n        </SliderHandle>\n      );\n    });\n\n    var sliderClasses = classNames({\n      'ui-slider': true,\n      'is-overlapping': this.state.overlapping\n    });\n\n    return (\n      <div className={sliderClasses} ref={el => this.el = el}>\n        {handles}\n\n        {this.state.handles.length === 2 ? (\n          <SliderRange start={this.state.handles[0].position} end={this.state.handles[1].position} />\n        ) : null}\n      </div>\n    );\n  },\n\n  handleDown: function(index) {\n    this.$document.on('mousemove', this.handleMove);\n    this.$document.one('mouseup', this.handleUp);\n\n    this.setState({\n      focusedHandle: index\n    });\n  },\n\n  handleUp: function(e) {\n    var focusedHandle = this.state.focusedHandle;\n\n    this.$document.off('mousemove', this.handleMove);\n\n    if (this.state.sliding) {\n      this.notifySliderEnd(focusedHandle);\n\n      var value = this.getValueFromPosition(this.state.handles[focusedHandle].position);\n      this.updateValueAtIndex(focusedHandle, value);\n\n      this.setHandlePosition(focusedHandle, this.getPositionFromValue(value));\n\n      this.setState({\n        focusedHandle: null,\n        sliding: false\n      });\n    } else {\n      this.notifySliderClick(focusedHandle, this.getHandlePosition(focusedHandle));\n    }\n  },\n\n  handleMove: function(e) {\n    e.preventDefault();\n\n    var focusedHandle = this.state.focusedHandle;\n\n    if (!this.state.sliding) {\n      this.setState({\n        sliding: true\n      });\n\n      this.notifySliderStart(focusedHandle);\n    }\n\n    var newPosition = this.limitHandlePosition(this.getRelativePosition(e) - this.grabX, focusedHandle);\n\n    this.setHandlePosition(focusedHandle, newPosition);\n\n    this.notifySliderMove(focusedHandle, newPosition);\n  },\n\n  limitHandlePosition: function(pos, index) {\n    var min = index === 0 ? 0 : this.getHandlePosition(0);\n    var max = index === 0 ? this.getHandlePosition(1) : this.rangeWidth;\n\n    if (pos < min) {\n      return min;\n    }\n    if (pos > max) {\n      return max;\n    }\n\n    return pos;\n  },\n\n  normalizeValue: function(value) {\n    return _.isArray(value) ? value : [value];\n  },\n\n  getValues: function() {\n    return this.normalizeValue(this.props.value);\n  },\n\n  getMinValue: function() {\n    return _.first(this.getValues());\n  },\n\n  getMaxValue: function() {\n    return _.last(this.getValues());\n  },\n\n  setHandlePosition: function(index, position) {\n    var handles = this.state.handles.slice(0);\n    handles[index].position = position;\n    this.setState({\n      handles: handles,\n      overlapping: this.willHandleOverlap(index, position)\n    });\n  },\n\n  updateValueAtIndex: function(index, newValue) {\n    if (_.isArray(this.props.value)) {\n      var valueCopy = this.props.value.slice(0);\n      valueCopy[index] = newValue;\n      this.notifyChange(valueCopy);\n    } else {\n      this.notifyChange(newValue);\n    }\n  },\n\n  getHandlePosition: function(index) {\n    return this.getPositionFromValue(index === 0 ? this.getMinValue() : this.getMaxValue());\n  },\n\n  getRelativePosition: function(e) {\n    var rangeX = this.el.getBoundingClientRect().left;\n    return eventUtils.getXPosition(e) - rangeX;\n  },\n\n  getValueFromPosition: function(pos) {\n    var percentage, value;\n    percentage = pos / (this.rangeWidth || 1);\n    value =\n      this.props.step * Math.round(percentage * (this.props.max - this.props.min) / this.props.step) + this.props.min;\n    return Number(value.toFixed(2));\n  },\n\n  getPositionFromValue: function(value) {\n    var percentage, pos;\n    percentage = (value - this.props.min) / (this.props.max - this.props.min);\n    pos = percentage * this.rangeWidth;\n    return pos;\n  },\n\n  willHandleOverlap: function(index, position) {\n    var otherHandle = this.state.handles[index === 0 ? 1 : 0];\n    var distance = Math.abs(otherHandle.position - position);\n    return distance < this.labelWidth;\n  },\n\n  notifySliderStart: function(index) {\n    if (this.props.onSliderStart) {\n      this.props.onSliderStart(index);\n    }\n  },\n\n  notifySliderMove: function(index, position) {\n    if (this.props.onSliderMove) {\n      this.props.onSliderMove(index, position, this.getValueFromPosition(position));\n    }\n  },\n\n  notifySliderEnd: function(index) {\n    if (this.props.onSliderEnd) {\n      this.props.onSliderEnd(index);\n    }\n  },\n\n  notifyChange: function(newValue) {\n    if (this.props.onChange) {\n      this.props.onChange(newValue);\n    }\n  },\n\n  notifySliderClick: function(index, position) {\n    if (this.props.onSliderClick) {\n      this.props.onSliderClick(index, position);\n    }\n  }\n});\n\nexport default Slider;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/slider/index.js","/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar shallowEqual = require('fbjs/lib/shallowEqual');\n\nmodule.exports = {\n  shouldComponentUpdate: function(nextProps, nextState) {\n    return (\n      !shallowEqual(this.props, nextProps) ||\n      !shallowEqual(this.state, nextState)\n    );\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-addons-pure-render-mixin/index.js\n// module id = 785\n// module chunks = 0 1","function getXPosition(e) {\n  return (\n    e.pageX ||\n    (e.originalEvent && (\n      e.originalEvent.clientX ||\n      (e.originalEvent.touches && e.originalEvent.touches[0] && e.originalEvent.touches[0].clientX) ||\n      e.originalEvent.clientX\n    )) ||\n    (e.currentPoint && e.currentPoint.x) ||\n    0\n  );\n};\n\nexport default {\n  getXPosition\n};\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/event_utils.js","import React from 'react';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nimport _ from 'lodash';\n\nconst SliderHandle = createReactClass({\n  propTypes: {\n    position: PropTypes.number.isRequired,\n    onDown: PropTypes.func,\n    onClick: PropTypes.func,\n    sliderRef: PropTypes.func,\n    labelRef: PropTypes.func\n  },\n\n  handleMouseDown(e) {\n    if (e.button === 0 && this.props.onDown) {\n      this.props.onDown();\n    }\n  },\n\n  render() {\n    var style = {\n      left: this.props.position + 'px',\n      zIndex: this.props.zindex\n    };\n\n    var classes = _.extend({\n      'ui-slider__handle': true\n\n    }, this.props.handleClasses);\n\n    return (\n      <div ref={this.props.sliderRef} className={classNames(classes)} style={style} onMouseDown={this.handleMouseDown}>\n        <div ref={this.props.labelRef} className=\"ui-slider__handle__label\">{this.props.children}</div>\n      </div>\n    );\n  }\n});\n\nexport default SliderHandle;\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/slider/slider_handle.js","import React from 'react';\nimport createReactClass from 'create-react-class';\n\nconst SliderRange = createReactClass({\n  render() {\n    var styles = {\n      left: this.props.start,\n      width: this.props.end - this.props.start\n    };\n\n    return (\n      <div className=\"ui-slider__range\" style={styles} />\n    );\n  }\n});\n\nexport default SliderRange;\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/slider/slider_range.js","import React, { Component, findDOMNode } from 'react';\nimport PropTypes from 'prop-types';\nimport $ from 'jquery';\n\nimport SearchDropdown from './search_dropdown';\n\nexport default class Search extends Component {\n  static propTypes = {\n    initialValue: PropTypes.string,\n    results: SearchDropdown.propTypes.results,\n    onInputChange: PropTypes.func,\n    onSelectResult: PropTypes.func\n  }\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      index: 0,\n      value: props.initialValue\n    };\n  }\n\n  onInputChange = (e) => {\n    const value = e.target.value;\n    this.setState({value});\n    this.notifyInputChange(value);\n  }\n\n  onKeyDown = (e) => {\n    switch (e.key) {\n      case 'ArrowDown':\n        this.highlightNextItem();\n        break;\n\n      case 'ArrowUp':\n        this.highlightPrevItem();\n        break;\n\n      case 'Enter':\n        this.selectHighlightedItem();\n        break;\n\n      default:\n        return;\n    }\n\n    e.preventDefault();\n  }\n\n  onBlur = () => {\n    // Hack to delay the blur a bit to allow any click events on the\n    // search result items to be dispatched. Blur events fire before any click events.\n    setTimeout(() => {\n      this.setState({index: 0, value: ''});\n      this.notifyInputChange('');\n    }, 150);\n  }\n\n  onHoverResult = (index) => {\n    this.setState({index});\n  }\n\n  onClickResult = () => {\n    this.selectHighlightedItem();\n  }\n\n  highlightPrevItem() {\n    this.setState((prevState) => {\n      const { index } = prevState;\n      return {index: index !== 0 ? index - 1 : 0};\n    }, () => this.scrollToResult(this.state.index));\n  }\n\n  highlightNextItem() {\n    this.setState((prevState, currentProps) => {\n      const { index } = prevState;\n      const { results } = currentProps;\n      const items = results && results.items;\n      return {index: items && index !== items.length - 1 ? index + 1 : index};\n    }, () => this.scrollToResult(this.state.index));\n  }\n\n  selectHighlightedItem() {\n    const { onSelectResult } = this.props;\n    if (onSelectResult) {\n      onSelectResult(this.state.index);\n    }\n    this.setState({value: ''});\n  }\n\n  scrollToResult(index) {\n    const containerNode = $(findDOMNode(this._resultsContainer));\n    const containerHeight = containerNode.height();\n    const itemNode = $(containerNode.children().get(index));\n    const itemHeight = itemNode.height();\n\n    let scrollTop = containerNode.scrollTop();\n\n    // The item top position value is not correct, so we just compute this ourselves.\n    const itemTop = (index * itemHeight) - scrollTop;\n    const itemBottom = itemTop + itemHeight;\n\n    if (itemTop < 0) {\n      scrollTop += itemTop;\n\n    } else if (itemBottom > containerHeight) {\n      scrollTop += itemBottom - containerHeight;\n\n    } else {\n      return;\n    }\n\n    containerNode.stop(true).animate({scrollTop});\n  }\n\n  notifyInputChange(newValue) {\n    const { onInputChange } = this.props;\n    if (onInputChange) {\n      onInputChange(newValue);\n    }\n  }\n\n  focusInput() {\n    this.refs.input.focus();\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (!nextProps.results || nextProps.results.length === 0) {\n      this.setState({ index: 0 });\n    } else if (nextProps.results.length <= this.state.index) {\n      this.setState({ index: nextProps.results.length - 1 });\n    }\n  }\n\n  render() {\n    const { initialValue, placeholder, results } = this.props;\n    const { value } = this.state;\n    return (\n      <div className=\"ui-search\">\n        <span className=\"icon-search-1\" />\n        <input\n          ref=\"input\"\n          type=\"search\"\n          placeholder={placeholder}\n          value={value}\n          onChange={this.onInputChange}\n          onKeyDown={this.onKeyDown}\n          onBlur={this.onBlur}\n        />\n        <SearchDropdown\n          results={results}\n          activeIndex={this.state.index}\n          onHoverResult={this.onHoverResult}\n          onClickResult={this.onClickResult}\n          resultsRef={(ref) => this._resultsContainer = ref}\n        />\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/search/search.js","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport SearchResults from './search_results';\n\nexport default class SearchDropdown extends Component {\n  static propTypes = {\n    results: PropTypes.shape({\n      heading: PropTypes.string,\n      items: SearchResults.propTypes.items\n    }),\n    onHoverResult: PropTypes.func,\n    onClickResult: PropTypes.func\n  }\n\n  render() {\n    if (!this.props.results) {\n      return null;\n    }\n\n    const { activeIndex, onHoverResult, onClickResult, resultsRef } = this.props;\n    const {heading, items} = this.props.results;\n\n    return (\n      <div className=\"ui-search__dropdown\">\n        <header className=\"ui-search__header\">\n          <small>{heading}</small>\n        </header>\n        <SearchResults\n          items={items}\n          activeIndex={activeIndex}\n          resultsRef={resultsRef}\n          onHoverResult={onHoverResult}\n          onClickResult={onClickResult}\n        />\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/search/search_dropdown.js","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nimport SearchResultItem from './search_result_item';\n\nexport default class SearchResults extends Component {\n  static propTypes = {\n    items: PropTypes.arrayOf(SearchResultItem.propTypes.item),\n    onHoverResult: PropTypes.func,\n    onClickResult: PropTypes.func\n  }\n\n  render() {\n    const { items, activeIndex, onHoverResult, onClickResult, resultsRef } = this.props;\n    if (!items) {\n      return null;\n    }\n    return (\n      <ul className=\"ui-search__results\" ref={resultsRef}>\n        {items.map((item, i) =>\n          <SearchResultItem\n            key={i}\n            item={item}\n            isActive={i === activeIndex}\n            onHover={() => onHoverResult(i)}\n            onClick={onClickResult}\n          />\n        )}\n      </ul>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/search/search_results.js","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class SearchResultItem extends Component {\n  static propTypes = {\n    item: PropTypes.shape({\n      title: PropTypes.string.isRequired,\n      type: PropTypes.string\n    }),\n    isActive: PropTypes.bool,\n    onHover: PropTypes.func,\n    onClick: PropTypes.func\n  }\n\n  render() {\n    const { item, isActive, onHover, onClick } = this.props;\n    return (\n      <li onMouseEnter={onHover} onClick={onClick}>\n        <a className={`ui-search__results__item ${isActive ? 'is-active' : ''}`}>\n          <span className=\"ui-search__results__title\">{item.title}</span>\n          {item.type ? <small className=\"ui-search__results__type\">{item.type}</small> : null}\n        </a>\n      </li>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/javascripts/jsx/search/search_result_item.js","import React from 'react';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport createReactClass from 'create-react-class';\n\nconst ToggleSwitch = createReactClass({\n  propTypes: {\n    state: PropTypes.oneOf(['on', 'off']),\n    size: PropTypes.oneOf(['small']),\n    children: PropTypes.node,\n    onToggle: PropTypes.func,\n    disabled: PropTypes.bool\n  },\n\n  render() {\n    const toggleClasses = classNames({\n      'ui-toggle': true,\n      'is-true': this.props.state === 'on',\n      'small': this.props.size === 'small',\n      'disabled': this.props.disabled\n    });\n\n    var checked = this.props.state === 'on' ? true : false;\n\n    return (\n      <fieldset className=\"ui-toggle__wrapper\">\n        <button\n          type=\"button\"\n          role=\"checkbox\"\n          className={toggleClasses}\n          onClick={this.props.disabled ? null : this.props.onToggle}\n          onKeyPress={this.props.disabled ? null : this.props.onToggle}\n          aria-checked={checked}\n          disabled={this.props.disabled}\n        >\n          <div className=\"ui-toggle__handle\">\n            <div className=\"ui-toggle__knob\"></div>\n            <div className=\"ui-toggle__track\"></div>\n          </div>\n          <div className=\"ui-toggle__label\">{this.props.children}</div>\n        </button>\n      </fieldset>\n    );\n  }\n});\n\nexport default ToggleSwitch;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/toggle_switch.js","import React from 'react';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst CheckButton = createReactClass({\n  propTypes: {\n    state: PropTypes.oneOf(['unchecked', 'checked', 'intermediate']),\n    onToggle: PropTypes.func\n  },\n\n  render() {\n    var checkButtonClasses = classNames({\n      'ui-form__checkbox': true,\n      'is-checked': this.props.state === 'checked',\n      'is-intermediate': this.props.state === 'intermediate'\n    });\n\n    return (\n      <div className=\"ui-form\">\n        <label className=\"ui-form__checkbox-label\" onClick={this.props.onToggle}>\n          <div className={checkButtonClasses} />\n          {this.props.children}\n        </label>\n      </div>\n    );\n  }\n});\n\nexport default CheckButton;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/check_button.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Dropdown from './dropdown';\n\n/**\n * Usage:\n *  <DropdownList defaultTitle=\"Select a pill Neo...\" onChange={() => { }}>\n *    <DropdownListItem value=\"blue\" title=\"Blue\" description=\"the story ends...\" />\n *    <DropdownListItem value=\"red\" title=\"Red\" description=\"you stay in Wonderland...\" />\n *  </DropdownList>\n */\nexport const DropdownList = createReactClass({\n  propTypes: {\n    toggleClass: PropTypes.string,\n    defaultTitle: PropTypes.string,\n    defaultDescription: PropTypes.string,\n    value: PropTypes.any,\n    onChange: PropTypes.func,\n    disabled: PropTypes.bool,\n    position: PropTypes.oneOf(['align-left', 'align-right', 'align-top'])\n  },\n\n  getDefaultProps() {\n    return {\n      defaultTitle: '---'\n    };\n  },\n\n  render() {\n    var selectedItem = {\n      title: this.props.defaultTitle,\n      description: this.props.defaultDescription\n    };\n\n    var items = React.Children.map(this.props.children, item => {\n      var selected = item.props.value === this.props.value;\n      if (selected) {\n        selectedItem.title = item.props.title;\n        selectedItem.description = item.props.description;\n      }\n      return React.cloneElement(item, {key: item.key, selected, onClick: this.props.onChange});\n    });\n\n    return (\n      <Dropdown\n        toggleClass={this.props.toggleClass}\n        title={selectedItem.title}\n        description={selectedItem.description}\n        disabled={this.props.disabled}\n        label={this.props.label}\n        position={this.props.position}>\n        <div className=\"ui-container_scroll\">\n          <ul className=\"ui-dropdown__list\">\n            {items}\n          </ul>\n        </div>\n      </Dropdown>\n    );\n  }\n});\n\nexport const DropdownListItem = createReactClass({\n  propTypes: {\n    value: PropTypes.any,\n    title: PropTypes.node,\n    description: PropTypes.node\n  },\n\n  _onClick(e) {\n    e.preventDefault();\n    if (this.props.onClick) {\n      this.props.onClick(this.props.value);\n    }\n  },\n\n  render() {\n    return (\n      <li onClick={this._onClick}>\n        <button className={this.props.selected ? 'is-selected' : ''}>\n          {this.props.description ?\n            <span>\n              <strong>{this.props.title}</strong>\n              <small>{this.props.description}</small>\n            </span>\n          : this.props.title}\n        </button>\n      </li>\n    );\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/dropdown_list.js","import React from 'react';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nimport _ from 'lodash';\n\nimport Overlays from './overlays';\n\nconst Alert = createReactClass({\n  propTypes: {\n    title: PropTypes.string.isRequired,\n    cancelable: PropTypes.bool,\n    confirmText: PropTypes.string,\n    confirmButtonModifiers: PropTypes.object,\n    onConfirm: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      cancelable: false,\n      confirmText: 'Okay',\n      confirmButtonModifiers: { primary: true },\n      onConfirm: () => {}\n    };\n  },\n\n  render() {\n    const confirmButtonClasses = classNames(_.assign({ 'ui-button': true }, this.props.confirmButtonModifiers));\n\n    return (\n      <div className=\"ui-modal__wrapper\">\n        <div className={'ui-modal ' + this.props.size}>\n          <header className=\"ui-modal__header\">\n            <h3>{this.props.title}</h3>\n            <span className=\"ui-modal__close\" onClick={_.partial(this.handleConfirm, false)} />\n          </header>\n          <div className=\"ui-modal__content\">{this.props.children}</div>\n          <footer className=\"ui-modal__footer\">\n            <div className=\"ui-modal__actions\">\n              {this.props.cancelable ? <a onClick={_.partial(this.handleConfirm, false)}>Cancel</a> : null}\n              <button className={confirmButtonClasses} onClick={_.partial(this.handleConfirm, true)}>\n                {this.props.confirmText}\n              </button>\n            </div>\n          </footer>\n        </div>\n        <div className=\"ui-modal__background\" />\n      </div>\n    );\n  },\n\n  handleConfirm(confirmed) {\n    const { onConfirm } = this.props;\n    if (onConfirm) {\n      onConfirm(confirmed);\n    }\n    Alert.close();\n  },\n\n  statics: {\n    open(options) {\n      const modal = <Alert title={options.title}>{options.content}</Alert>;\n      Overlays.show('alert', modal);\n    },\n\n    confirm(title, message, cb) {\n      Overlays.show(\n        'alert',\n        <Alert title={title} cancelable onConfirm={cb}>\n          {message}\n        </Alert>\n      );\n    },\n\n    promptMultiline(title, cb) {\n      Overlays.show('alert', <MultiLinePrompt title={title} onConfirm={cb} />);\n    },\n\n    danger(title, message, action, cb) {\n      const alert = (\n        <Alert title={title} confirmText={action} confirmButtonModifiers={{ negative: true }} cancelable onConfirm={cb}>\n          {message}\n        </Alert>\n      );\n      Overlays.show('alert', alert);\n    },\n\n    unexpectedError() {\n      Overlays.show(\n        'alert',\n        <Alert title=\"Unexpected error\">\n          <span>An unexpected error occurred. Please try again. If the problem persists contact us at </span>\n          <a href=\"mailto:support@opengov.com\">support@opengov.com</a>\n        </Alert>\n      );\n    },\n\n    close() {\n      Overlays.hide('alert');\n    }\n  }\n});\n\nconst MultiLinePrompt = createReactClass({\n  propTypes: {\n    title: PropTypes.string.isRequired,\n    onConfirm: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      onConfirm: () => {}\n    };\n  },\n\n  setTextareaRef(textarea) {\n    this.textarea = textarea;\n  },\n\n  render() {\n    return (\n      <Alert title={this.props.title} cancelable onConfirm={this.handleConfirm}>\n        <fieldset className=\"ui-form\">\n          <textarea ref={this.setTextareaRef} />\n        </fieldset>\n      </Alert>\n    );\n  },\n\n  handleConfirm(success) {\n    if (success) {\n      this.props.onConfirm(this.textarea.value);\n    }\n  },\n\n  componentDidMount() {\n    this.textarea.focus();\n  }\n});\n\nexport default Alert;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/alert_modal.js","import React from 'react';\nimport classNames from 'classnames';\nimport _ from 'lodash';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Overlays from './overlays';\n\nconst Flash = createReactClass({\n  propTypes: {\n    flashIcon: PropTypes.string,\n    title: PropTypes.string.isRequired,\n    message: PropTypes.string,\n    modifiers: PropTypes.object,\n    button: PropTypes.string\n  },\n\n  render: function() {\n    var flashClasses = classNames(_.assign({ 'ui-flash': true }, this.props.modifiers));\n\n    return (\n      <div className={flashClasses}>\n        <span className=\"ui-flash__close\" onClick={this.closeFlash} />\n        {this.props.flashIcon ? <span className={classNames('ui-flash__icon', this.props.flashIcon)} /> : null}\n        <div className=\"ui-flash__body\">\n          <h4>{this.props.title}</h4>\n          {this.props.message ? <p>{this.props.message}</p> : null}\n          {this.props.button ? (\n            <button className=\"ui-button small\" onClick={this.closeFlash}>\n              {this.props.button}\n            </button>\n          ) : null}\n        </div>\n      </div>\n    );\n  },\n\n  statics: {\n    show: function(options) {\n      Overlays.show(\n        'flash',\n        <Flash\n          modifiers={options.modifiers}\n          title={options.title}\n          flashIcon={options.flashIcon}\n          message={options.message}\n          button={options.button}\n        />\n      );\n\n      if (!options.noTimeout) {\n        setTimeout(function() {\n          Overlays.hide('flash');\n        }, options.timeout || 5000);\n      }\n    },\n\n    ftw: function(options) {\n      Flash.show(_.assign({ modifiers: { ftw: true } }, options));\n    }\n  },\n\n  closeFlash: function() {\n    Overlays.hide('flash');\n  }\n});\n\nexport default Flash;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/flash.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport Overlays from './overlays';\n\nconst Overlay = createReactClass({\n  propTypes: {\n    id: PropTypes.string.isRequired\n  },\n\n  componentDidMount() {\n    Overlays.show(this.props.id, this.props.children);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.id !== nextProps.id) {\n      Overlays.hide(this.props.id);\n    }\n    Overlays.show(nextProps.id, nextProps.children);\n  },\n\n  componentWillUnmount() {\n    Overlays.hide(this.props.id);\n  },\n\n  render() {\n    return null;\n  }\n});\n\nexport default Overlay;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/overlay.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst GlobalAlert = createReactClass({\n  propTypes: {\n    message: PropTypes.string.isRequired,\n    action: PropTypes.string.isRequired,\n    type: PropTypes.string.isRequired,\n    onAction: PropTypes.func,\n    onCancel: PropTypes.func\n  },\n\n  renderBackButton() {\n    return (\n      <button className=\"ui-alert__back-button\" onClick={this.props.onClick}>\n        <span className=\"icon-lefthead-2\" />Back\n      </button>\n    );\n  },\n\n  render() {\n    var alertClass = 'ui-alert ' + this.props.type;\n\n    return (\n      <div className={alertClass}>\n        {this.props.onBack ? this.renderBackButton() : null}\n        <p className=\"ui-alert__message\">\n          <strong>{this.props.message}</strong> {this.props.subMessage}\n        </p>\n        <div className=\"ui-alert__actions\">\n          <a href=\"#\" onClick={this.handleCancel}>\n            Cancel\n          </a>\n          <button className=\"ui-button small\" onClick={this.props.onAction}>\n            {this.props.action}\n          </button>\n        </div>\n      </div>\n    );\n  },\n\n  handleCancel: function(e) {\n    e.preventDefault();\n    this.props.onCancel && this.props.onCancel();\n  }\n});\n\nexport default GlobalAlert;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/global_alert.js","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst Loader = createReactClass({\n  propTypes: {\n    message: PropTypes.string\n  },\n\n  render() {\n    return (\n      <div className=\"ui-loader\">\n        <div className=\"ui-loading\" />\n        <div className=\"ui-loader__message\">\n          <small>Loading</small>\n          <strong>{this.props.message}</strong>\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default Loader;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/loader.js","import React from 'react';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst ProgressBar = createReactClass({\n  propTypes: {\n    percent: PropTypes.number,\n    isProcessing: PropTypes.bool\n  },\n\n  render() {\n    const progressClass = classNames({\n      'ui-progress': true,\n      'is-processing': this.props.isProcessing\n    });\n\n    return (\n      <div className={progressClass}>\n        <div className=\"ui-progress__fill\" style={{width: this.props.percent + \"%\"}} />\n      </div>\n    );\n  }\n});\n\nexport default ProgressBar;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/progress_bar.js","import React from 'react';\nimport classnames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nimport _ from 'lodash';\n\nvar Table = createReactClass({\n  propTypes: {\n    columns: PropTypes.arrayOf(PropTypes.object).isRequired,\n    rows: PropTypes.arrayOf(PropTypes.object).isRequired,\n    rowErrors: PropTypes.object,\n    sortBy: PropTypes.string,\n    sortAsc: PropTypes.bool,\n    onSort: PropTypes.func,\n    onRowClick: PropTypes.func,\n    layout: PropTypes.oneOf(['scale', 'data'])\n  },\n\n  handleColumnClick: function(column) {\n    if (column.sortable && this.props.onSort) {\n      this.props.onSort(column.key, this.props.sortBy == column.key && !this.props.sortAsc);\n    }\n  },\n\n  handleRowClick: function(row, e) {\n    if (this.props.onRowClick) {\n      this.props.onRowClick(row);\n    }\n  },\n\n  render() {\n    var self = this;\n    var columns = this.props.columns;\n    var sortBy = this.props.sortBy;\n    var rowErrors = this.props.rowErrors;\n    var tableClasses = classnames({\n      'layout_scale-cells': this.props.layout === 'scale',\n      layout_data: this.props.layout === 'data',\n      'ui-table': true\n    });\n\n    var headers = columns.map(function(column) {\n      return (\n        <th\n          key={'col_' + column.key}\n          data-columnkey={column.key}\n          className={column.sortable ? null : 'no-sort'}\n          onClick={self.handleColumnClick.bind(self, column)}\n        >\n          {column.name}\n          {sortBy == column.key ? <i className={self.props.sortAsc ? 'icon-uphead-1' : 'icon-downhead-1'} /> : null}\n        </th>\n      );\n    });\n\n    var rows = this.props.rows.map(function(row, index) {\n      var rowError = _.result(rowErrors, row.id);\n      var rowTitle = rowError ? _.first(rowError.errors) : null;\n\n      var cells = columns.map(function(column) {\n        var key = 'cell_' + row.id + '_' + column.key;\n        var value = row[column.key] || '';\n\n        if (column.formatter) {\n          value = column.formatter(row, value, rowError);\n        }\n\n        return <td key={key}>{value}</td>;\n      });\n\n      var rowClasses = classnames({\n        'data-row': true,\n        whoops: !!rowError\n      });\n\n      return (\n        <tr\n          key={row.id}\n          data-rowid={row.id}\n          className={rowClasses}\n          onClick={this.handleRowClick.bind(this, row)}\n          title={rowTitle}\n        >\n          {cells}\n        </tr>\n      );\n    }, this);\n\n    return (\n      <div className={tableClasses}>\n        <table>\n          <thead><tr>{headers}</tr></thead>\n          <tbody>{rows}</tbody>\n        </table>\n      </div>\n    );\n  },\n});\n\nexport default Table;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/table.js","import React from 'react';\nimport _ from 'lodash';\nimport createReactClass from 'create-react-class';\n\nvar CheckboxCell = createReactClass({\n  render: function () {\n    return (\n      <span className=\"ui-form\">\n        <input type={this.props.type} checked={this.props.checked} onChange={this.props.onChange} />\n      </span>\n    );\n  }\n});\n\nfunction CheckboxColumn(opts) {\n  this.key = opts.key;\n  this.type = 'checkbox';\n  this.name = <CheckboxCell type={this.type} checked={opts.isAllChecked} onChange={this.handleCheckAll.bind(this)} />;\n  this.checkedRows = opts.checkedRows || [];\n  this.onCheck = opts.onCheck || _.noop;\n  this.onCheckAll = opts.onCheckAll;\n}\n\nCheckboxColumn.prototype.formatter = function (row, value, rowError) {\n  var isChecked = !!_.find(this.checkedRows, {id: row.id});\n  var handleChange = this.handleCheck.bind(this, row);\n\n  if (rowError) {\n    return <span className=\"icon-exclamation-1\" />;\n  }\n\n  return (\n    <CheckboxCell type={this.type} checked={isChecked} onChange={handleChange} />\n  );\n};\n\nCheckboxColumn.prototype.handleCheck = function (row, e) {\n  this.onCheck(row, e.target.checked);\n};\n\nCheckboxColumn.prototype.handleCheckAll = function (e) {\n  this.onCheckAll(e.target.checked);\n};\n\n\nfunction RadioColumn(opts) {\n  this.key = opts.key;\n  this.selectedRow = opts.selectedRow;\n  this.onSelect = opts.onSelect || _.noop;\n}\n\nRadioColumn.prototype.formatter = function (row) {\n  var type = \"radio\";\n  var isSelected = this.selectedRow && this.selectedRow === row.id;\n  var handleChange = this.handleSelect.bind(this, row);\n  return (\n    <CheckboxCell type={type} checked={isSelected} onChange={handleChange} />\n  );\n};\n\nRadioColumn.prototype.handleSelect = function (row, e) {\n  if (e.target.checked) {\n    this.onSelect(row);\n  }\n};\n\n\nexport { CheckboxColumn, RadioColumn };\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/table_columns.js","import React from 'react';\nimport _ from 'lodash';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst CollectionSearch = createReactClass({\n  propTypes: {\n    collection: PropTypes.arrayOf(PropTypes.object).isRequired,\n    fields: PropTypes.arrayOf(PropTypes.string),\n    placeholder: PropTypes.string,\n    onChange: PropTypes.func.isRequired\n  },\n\n  render() {\n    return (\n      <div className=\"ui-search\">\n        <span className=\"icon-search-1\" />\n        <input type=\"search\" placeholder={this.props.placeholder} onChange={this.handleChange} />\n      </div>\n    );\n  },\n\n  handleChange(e) {\n    const text = e.target.value;\n    const regex = new RegExp(text, 'i');\n    const { collection, fields, onChange } = this.props;\n    const items = collection.filter(item => {\n      return _.any(fields, field => {\n        return regex.test(item[field]);\n      });\n    });\n    onChange(items);\n  }\n});\n\nexport default CollectionSearch;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/collection_search.js","import React from 'react';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport classNames from 'classnames';\nimport createReactClass from 'create-react-class';\n\nconst MainPanel = createReactClass({\n  mixins: [require('./timeout_mixin')],\n\n  render() {\n    return (\n      <aside\n        className={classNames({\n          'ui-main__sidebar js-scroll-position': true,\n          'unhidden-on-hover': this.state.unhideOnHover\n        })}\n      >\n        <div className=\"ui-mainpanel\">{this.props.children}</div>\n      </aside>\n    );\n  },\n\n  getInitialState() {\n    return {\n      isVisible: true,\n      unhideOnHover: false\n    };\n  },\n\n  componentWillUnmount() {\n    $('body').removeClass('mainpanel-hidden');\n  },\n\n  toggleVisibility() {\n    const isVisible = !this.state.isVisible;\n\n    if (isVisible) {\n      $('body').removeClass('mainpanel-hidden');\n      this.setTimeout(() => {\n        this.setState({ unhideOnHover: false });\n      }, 1000);\n    } else {\n      $('body').addClass('mainpanel-hidden');\n      this.setTimeout(() => {\n        this.setState({ unhideOnHover: true });\n      }, 1000);\n    }\n\n    this.setState({ isVisible: isVisible });\n\n    // Delay the resize event to allow the CSS translation to complete.\n    this.setTimeout(() => {\n      $(window).trigger('resize');\n    }, 250);\n  }\n});\n\nexport default MainPanel;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/main_panel.js","import React from 'react';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\n/**\n * <Tabs> provides a tabbed container.  It can only be passed <Tab> components as direct children.\n *\n *\n * @example\n *\n *  <Tabs.Container>\n *    <Tabs.Tab title=\"First Tab\">\n *      <div> First drawer content </div>\n *    </Tabs.Tab>\n *    <Tabs.Tab title=\"Second Tab\">\n *      <div> Second drawer content </div>\n *    </Tabs.Tab>\n *  </Tabs.Container>\n *\n *\n **/\n\nexport const Container = createReactClass({\n  propTypes: {\n    selectedTabIndex: PropTypes.number,\n    selectedTabHandler: PropTypes.func,\n    actionButtonLabel: PropTypes.string,\n    actionButtonIcon: PropTypes.string,\n    actionButtonHandler: PropTypes.func,\n    minimal: PropTypes.bool\n  },\n\n  getInitialState() {\n    return {\n      selectedTabIndex: this.props.selectedTabIndex || 0\n    };\n  },\n\n  componentDidMount() {\n    //Attach DOM event handlers\n    $(document).on('keyup', this.handleKeyUp);\n    $(window).on('resize', this.handleWindowResize);\n\n    this.handleWindowResize();\n  },\n\n  componentWillUnmount() {\n    //Cleanup DOM event handlers\n    $(document).off('keyup', this.handleKeyUp);\n    $(window).off('resize', this.handleWindowResize);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    //Handle the condition when the visible tab is unmounted\n    //by switching to the first one\n    if (!nextProps.children[this.state.selectedTabIndex]) {\n      this.setState({ selectedTabIndex: this.state.selectedTabIndex });\n    }\n\n    if (nextProps.selectedTabIndex && this.state.selectedTabIndex != nextProps.selectedTabIndex) {\n      this.setState({ selectedTabIndex: nextProps.selectedTabIndex });\n    }\n  },\n\n  handleTab(i) {\n    this.setState({ selectedTabIndex: i });\n\n    // Pass selectedTabIndex back to the parent component\n    if (this.props.selectedTabHandler) {\n      this.props.selectedTabHandler(i);\n    }\n  },\n\n  handleWindowResize() {\n    const width = $(this.tabContainer).width();\n    this.setState({ width: width });\n  },\n\n  render() {\n    var drawerHeight = $(window).height() - this.state.top;\n    var actionButtonClass = 'ui-button small ghost pull-right ' + this.props.actionButtonIcon;\n\n    return (\n      <div className=\"ui-tabs\">\n        <header className=\"ui-tabs__header\">\n          <div role=\"tablist\" ref={el => (this.tabContainer = el)} className={classnames('ui-nav-tabs', { 'minimal': this.props.minimal })}>\n            {_.map(\n              this.props.children,\n              function(t, i) {\n                return t ? (\n                  <button\n                    role=\"tab\"\n                    key={i}\n                    onClick={this.handleTab.bind(null, i)}\n                    aria-selected={this.state.selectedTabIndex == i ? true : false}\n                    className={this.state.selectedTabIndex == i ? 'ui-nav-tabs__tab is-selected' : 'ui-nav-tabs__tab'}\n                  >\n                    {t.props.title}\n                    <span className=\"ui-badge\">{t.props.tabCount}</span>\n                  </button>\n                ) : null;\n              },\n              this\n            )}\n\n            {this.props.actionButtonLabel ? (\n              <a onClick={this.props.actionButtonHandler} className={actionButtonClass}>\n                {this.props.actionButtonLabel}\n              </a>\n            ) : null}\n          </div>\n          <div className=\"ui-nav-tabs-shadow-container\"><div className=\"ui-nav-tabs-shadow\"></div></div>\n        </header>\n        {_.map(\n          this.props.children,\n          function(t, i) {\n            return t ? (\n              <div\n                key={i}\n                className={t.props.tabPanelClasses}\n                style={{ display: this.state.selectedTabIndex === i ? 'block' : 'none' }}\n              >\n                {React.Children.map(\n                  t.props.children,\n                  function(c) {\n                    var props = { isvisible: this.state.selectedTabIndex === i ? 'true' : 'false' };\n\n                    if (c.key) {\n                      props.key = c.key;\n                    }\n\n                    return React.cloneElement(c, props);\n                  },\n                  this\n                )}\n              </div>\n            ) : null;\n          },\n          this\n        )}\n      </div>\n    );\n  }\n});\n\n/**\n *  Acts as a container to hold content within a tab, and to also\n *  provide the tab with a title (and optionally css classes to be applied to the container for a single tab panel.\n *  These should be the only types of component children of the  <TabbedDrawer> component\n */\n\nexport const Tab = createReactClass({\n  propTypes: {\n    title: PropTypes.string.isRequired,\n    tabPanelClasses: PropTypes.string,\n    tabCount: PropTypes.string\n  },\n\n  render() {\n    return this.props.children;\n  }\n});\n\nexport default {\n  Tab,\n  Container\n};\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/tabs.js","import React from 'react';\nimport cx from 'classnames';\nimport PropTypes from 'prop-types';\n\nimport createReactClass from 'create-react-class';\n\nconst Avatar = createReactClass({\n  propTypes: {\n    size: PropTypes.oneOf(['small', 'medium', 'large']),\n    firstName: PropTypes.string,\n    lastName: PropTypes.string,\n    url: PropTypes.string\n  },\n\n  getDefaultProps() {\n    return {\n      size: 'medium',\n      firstName: '',\n      lastName: '',\n      url: ''\n    };\n  },\n\n  // Renders the correct Avatar content by priority\n  //  1)Image\n  //  2)Initials\n  //  3)Anonymous\n\n  render() {\n    const { firstName, lastName, size, url } = this.props;\n    const avatarClassName = cx('ui-avatar', size);\n    const userImage = url ? { backgroundImage: `url(\"${url}\")` } : null;\n    const firstInitial = firstName ? firstName[0].toUpperCase() : '';\n    const lastInitial = lastName ? lastName[0].toUpperCase() : '';\n\n    if (url || firstInitial || lastInitial) {\n      return (\n        <div className={avatarClassName}>\n          <div className=\"ui-avatar__image\" ref={() => 'avatarImage'} style={userImage} />\n          <span className=\"ui-avatar__initials\">{firstInitial + lastInitial}</span>\n        </div>\n      );\n    }\n\n    return (\n      <div className={avatarClassName}>\n        <span className=\"ui-avatar__anonymous-icon icon-user-1\" />\n      </div>\n    );\n  }\n});\n\nexport default Avatar;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/avatar.js","import React from 'react';\nimport classnames from 'classnames';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\n// Use `children` to pass in the share icon\n\nconst ReportCard = createReactClass({\n  propTypes: {\n    title: PropTypes.string,\n    link: PropTypes.string,\n    type: PropTypes.oneOf(['line', 'stacked', 'percentage', 'pie', 'bar', 'grid']),\n    description: PropTypes.string,\n    descriptionLabel: PropTypes.string\n  },\n\n  render: function () {\n    var permission = this.props.permission || {};\n    var reportCardClassName = 'ui-report-card__thumbnail ' + this.props.type;\n    var permissionDescription = classnames({\n      \"This report is private\": permission.name === 'Private',\n      \"Shared with my organization\": permission.name === 'My organization',\n      \"Published to your OpenGov transparency site\": permission.name === 'Public'\n    });\n\n    return (\n      <a className=\"ui-report-card\" href={this.props.link}>\n        <div className={reportCardClassName}/>\n        <div className=\"ui-report-card__details\">\n          <div className=\"ui-row\">\n            <div className={this.props.children ? \"ui-col-5of6\" : \"ui-col-6of6\"}>\n              <div className=\"ui-report-card__title\">\n                <h4>{this.props.title}</h4>\n              </div>\n              <small>\n                {this.props.descriptionLabel ? this.props.descriptionLabel : null}\n                <strong> {this.props.description}</strong>\n              </small>\n            </div>\n            {this.props.children ?\n              <div className=\"ui-col-1of6\">\n                {this.props.children}\n              </div>\n            : null}\n          </div>\n        </div>\n      </a>\n    );\n  }\n});\n\nexport default ReportCard;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/report_card.js","import React from 'react';\nimport converter from 'number-to-words';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst FilterLink = createReactClass({\n  PropTypes: {\n    itemKey: PropTypes.string.isRequired,\n    value: PropTypes.string.isRequired,\n    handleFilter: PropTypes.func.isRequired\n  },\n\n  handleFilter(e) {\n    e.preventDefault();\n\n    this.props.handleFilter(this.props.itemKey, this.props.value);\n  },\n\n  render() {\n    return <a href=\"#\" className=\"check-mock__filter\" onClick={this.handleFilter}>{this.props.value}</a>;\n  }\n});\n\nconst CheckMock = createReactClass({\n  PropTypes: {\n    entity: PropTypes.string,\n    issuer: PropTypes.string,\n    checkDate: PropTypes.string,\n    checkNumber: PropTypes.string,\n    recipient: PropTypes.string,\n    dollarAmount: PropTypes.oneOfType([\n      PropTypes.string,\n      PropTypes.number\n    ]),\n    centsAmount: PropTypes.number,\n    memo: PropTypes.string,\n    disclaimer: PropTypes.string\n  },\n\n  getDefaultProps: function() {\n    return {\n      disclaimer: \"This check image represents a payment made with public funds.\"\n    };\n  },\n\n  handleFilter: function(key, value) {\n    this.props.handleFilter({value, key});\n  },\n\n  render: function() {\n    var dollarsNoFormat = typeof this.props.dollarAmount === \"string\" ?\n      parseInt(this.props.dollarAmount.replace(/,/g, \"\"), 10) :\n      this.props.dollarAmount;\n\n    var centsNoFormat = typeof this.props.centsAmount === \"string\" ?\n      parseInt(this.props.centsAmount, 10) :\n      this.props.centsAmount;\n\n    return (\n      <div className=\"check-mock\">\n        <div className=\"check-mock__container\">\n          <header className=\"check-mock__header\">\n            <dl>\n              <dt>{this.props.entity}</dt>\n              <dd>\n                <FilterLink itemKey=\"department\" value={this.props.issuer} handleFilter={this.handleFilter}/>\n              </dd>\n            </dl>\n            <div className=\"pull-right\">\n              {this.props.checkDate ?\n                <dl>\n                  <dt>Check date</dt>\n                  <dd>{this.props.checkDate}</dd>\n                </dl>\n              : null}\n              {this.props.checkNumber ?\n                <dl>\n                  <dt>Check Number</dt>\n                  <dd>\n                    <FilterLink itemKey=\"check_no\" value={this.props.checkNumber} handleFilter={this.handleFilter} />\n                  </dd>\n                </dl>\n              : null}\n            </div>\n          </header>\n          <div className=\"check-mock__body\">\n            <div className=\"ui-row\">\n              <dl className=\"ui-col-6of6\">\n                <dt>Pay to the order of</dt>\n                <dd className=\"check-mock__underline\">\n                  <FilterLink itemKey=\"paid_to\" value={this.props.recipient ? this.props.recipient : 'Unknown recipient'} handleFilter={this.handleFilter} />\n                </dd>\n              </dl>\n            </div>\n            <div className=\"ui-row\">\n              <strong className=\"check-mock__amount-words check-mock__underline\">\n                {this.props.dollarAmount ?\n                  <span>{converter.toWords(dollarsNoFormat)} dollars </span>\n                : null}\n                {this.props.centsAmount !== 0 ?\n                  <span>and {converter.toWords(centsNoFormat)} cents</span>\n                : <span>even</span>}\n              </strong>\n              <strong className=\"check-mock__amount-numbers check-mock__box\">\n                {this.props.dollarAmount || this.props.centsAmount ?\n                  <span>\n                    ${this.props.dollarAmount}.\n                    {this.props.centsAmount !== 0 ? this.props.centsAmount : '00'}\n                  </span>\n                : null}\n              </strong>\n            </div>\n          </div>\n          <footer className=\"check-mock__footer ui-row\">\n            <dl className=\"ui-col-3of6\">\n              <dt>Memo</dt>\n              <dd className=\"check-mock__underline\">\n                <FilterLink itemKey=\"expense_type\" value={this.props.memo} handleFilter={this.handleFilter} />\n              </dd>\n            </dl>\n            <div className=\"check-mock__disclaimer ui-col-3of6\">\n              <p>{this.props.disclaimer}</p>\n            </div>\n          </footer>\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default CheckMock;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/check_mock.js","!function(){\"use strict\";function e(e){return!(\"number\"!=typeof e||e!==e||e===1/0||e===-(1/0))}function t(e){return h.test(e)||s.test(e)?e+\"th\":u.test(e)?e.replace(u,\"ieth\"):a.test(e)?e.replace(a,n):e}function n(e,t){return d[t]}function o(t){var n=parseInt(t,10);if(!e(n))throw new TypeError(\"Not a finite number: \"+t+\" (\"+typeof t+\")\");var o=String(n),r=n%100,i=r>=11&&13>=r,f=o.charAt(o.length-1);return o+(i?\"th\":\"1\"===f?\"st\":\"2\"===f?\"nd\":\"3\"===f?\"rd\":\"th\")}function r(n,o){var r,f=parseInt(n,10);if(!e(f))throw new TypeError(\"Not a finite number: \"+n+\" (\"+typeof n+\")\");return r=i(f),o?t(r):r}function i(e){var t,n,o=arguments[1];return 0===e?o?o.join(\" \").replace(/,$/,\"\"):\"zero\":(o||(o=[]),0>e&&(o.push(\"minus\"),e=Math.abs(e)),20>e?(t=0,n=x[e]):p>e?(t=e%v,n=M[Math.floor(e/v)],t&&(n+=\"-\"+x[t],t=0)):y>e?(t=e%p,n=i(Math.floor(e/p))+\" hundred\"):c>e?(t=e%y,n=i(Math.floor(e/y))+\" thousand,\"):b>e?(t=e%c,n=i(Math.floor(e/c))+\" million,\"):g>e?(t=e%b,n=i(Math.floor(e/b))+\" billion,\"):m>e?(t=e%g,n=i(Math.floor(e/g))+\" trillion,\"):w>=e&&(t=e%m,n=i(Math.floor(e/m))+\" quadrillion,\"),o.push(n),i(t,o))}function f(e){var n=r(e);return t(n)}var l=\"object\"==typeof self&&self.self===self&&self||\"object\"==typeof global&&global.global===global&&global||this,h=/(hundred|thousand|(m|b|tr|quadr)illion)$/,s=/teen$/,u=/y$/,a=/(zero|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)$/,d={zero:\"zeroth\",one:\"first\",two:\"second\",three:\"third\",four:\"fourth\",five:\"fifth\",six:\"sixth\",seven:\"seventh\",eight:\"eighth\",nine:\"ninth\",ten:\"tenth\",eleven:\"eleventh\",twelve:\"twelfth\"},v=10,p=100,y=1e3,c=1e6,b=1e9,g=1e12,m=1e15,w=9007199254740992,x=[\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"ten\",\"eleven\",\"twelve\",\"thirteen\",\"fourteen\",\"fifteen\",\"sixteen\",\"seventeen\",\"eighteen\",\"nineteen\"],M=[\"zero\",\"ten\",\"twenty\",\"thirty\",\"forty\",\"fifty\",\"sixty\",\"seventy\",\"eighty\",\"ninety\"],z={toOrdinal:o,toWords:r,toWordsOrdinal:f};\"undefined\"!=typeof exports?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=z),exports.numberToWords=z):l.numberToWords=z}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/number-to-words/numberToWords.min.js\n// module id = 810\n// module chunks = 0 1","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\nconst OpenGovLogo = createReactClass({\n  propTypes: {\n    width: PropTypes.number,\n    height: PropTypes.number,\n    color: PropTypes.string\n  },\n\n  getDefaultProps() {\n    return {\n      width: 100,\n      height: 100,\n      color: '#3192c7'\n    };\n  },\n\n  render() {\n    const logoHeight = this.props.height ? this.props.height + 'px' : null;\n    const logoWidth = this.props.width ? this.props.width + 'px' : null;\n\n    return (\n      <svg\n        version=\"1.1\"\n        viewBox=\"0 0 456 100\"\n        className=\"ui-opengov-logo\"\n        height={logoHeight}\n        width={logoWidth}\n        fill={this.props.color}\n      >\n        {this.renderGraphic(this.props.color)}\n      </svg>\n    );\n  },\n\n  renderGraphic() {\n    return (\n      <g>\n        <path d=\"M50,0C22.4,0,0,22.4,0,50c0,27.6,22.4,50,50,50c27.6,0,50-22.4,50-50C100,22.4,77.6,0,50,0z M50,88.1C29,88.1,11.9,71,11.9,50S29,11.9,50,11.9C71,11.9,88.1,29,88.1,50S71,88.1,50,88.1z\" />\n        <path d=\"M71.7,37.1c-0.3-0.6-0.9-0.9-1.6-0.9H29.9c-0.8,0-1.5,0.5-1.7,1.3c-0.2,0.8,0.1,1.6,0.8,2l19.3,11.8v21.5c0,0.8,0.6,1.5,1.3,1.7c0.2,0,0.3,0.1,0.5,0.1c0.6,0,1.2-0.3,1.6-0.9l20.1-34.9C72,38.3,72,37.6,71.7,37.1z\" />\n        <path d=\"M163,64c0,4.9-1.8,9.1-5.3,12.5c-3.6,3.4-7.8,5.2-12.8,5.2h-2.5c-5,0-9.3-1.8-12.9-5.2c-3.6-3.4-5.3-7.7-5.3-12.5V33.7c0-4.9,1.8-9,5.3-12.4c3.6-3.4,7.9-5.1,12.9-5.1h2.5c5,0,9.2,1.7,12.8,5.1c3.6,3.4,5.3,7.6,5.3,12.4V64z M149.4,35.7c0-4.1-2.7-7.2-5.7-7.2c-3,0-5.8,3.1-5.8,7.2v26.8c0,4.1,2.9,7,5.8,7c3.1,0,5.7-2.9,5.7-7V35.7z\" />\n        <path d=\"M212,38.1c0,4.9-1.8,9-5.3,12.4c-3.4,3.4-7.7,5.1-12.8,5.1h-5.6c-0.7,0-1,0.3-1,1v21c0,1.7-1.5,3.1-3.3,3.1h-6.9c-1.8,0-3.1-1.4-3.1-3.1V20.1c0-2,1-3,3.1-3H194c5,0,9.3,1.8,12.8,5.2c3.5,3.4,5.3,7.6,5.3,12.4V38.1z M198.5,33.9c0-2.8-2.5-5-5.4-5h-4.4c-0.8,0-1.2,0.3-1.2,0.9v13.5c0,0.6,0.4,1,1.2,1h4.4c3,0,5.4-2.3,5.4-5.1V33.9z\" />\n        <path d=\"M256.1,77.6c0,1.7-1.6,3.3-3.4,3.3h-26.9c-1.8,0-3.4-1.6-3.4-3.3V20.3c0-1.8,1.4-3.3,3.4-3.3h26.1c1.8,0,3.4,1.4,3.4,3.3v5.4c0,1.7-1.6,3.3-3.4,3.3h-15.1c-0.8,0-1.2,0.3-1.2,1v10.5c0,0.6,0.4,1,1.2,1h11.4c1.8,0,3.4,1.4,3.4,3.3v5.3c0,1.7-1.6,3.3-3.4,3.3h-11.4c-0.8,0-1.2,0.4-1.2,1.1v13c0,0.7,0.4,1.1,1.2,1.1h15.9c1.8,0,3.4,1.6,3.4,3.3V77.6z\" />\n        <path d=\"M306.7,77.7c0,1.7-1.4,3.1-3.3,3.1h-6.2c-1.4,0-2.6-0.9-3.3-2.6l-14.3-30.8v30.3c0,1.7-1.5,3.1-3.3,3.1h-6.5c-1.8,0-3.1-1.4-3.1-3.1V20.3c0-1.8,1.3-3.2,3.1-3.2h6.5c1.7,0,2.9,1,3.7,2.8l13.8,29.7V20.3c0-1.8,1.6-3.3,3.4-3.3h6.2c1.8,0,3.3,1.4,3.3,3.3V77.7z\" />\n        <path d=\"M356.4,77.6c0,1.7-1.4,3.3-3.3,3.3h-1.2c-1.5,0-2.8-1.3-3.7-3.8c0,0.1,0,0.2-0.1,0.2c-2.3,2.9-5.7,4.5-10,4.5h-1.4c-5.7,0-10.2-1.8-13.7-5.4c-3.4-3.6-5.2-8-5.2-13.2V34.5c0-5,1.8-9.3,5.5-12.9c3.7-3.6,8.2-5.4,13.4-5.4h0.7c5.2,0,9.6,1.8,13.2,5.4c3.7,3.6,5.5,7.9,5.5,12.9v2.6c0,1.8-1.5,3.3-3.3,3.3h-6.1c-1.8,0-3.4-1.8-3.4-3.3v-0.9c0-4.2-2.9-7.6-6-7.6c-3.2,0-6,3.4-6,7.6v25.7c0,4.5,2.2,7.4,6,7.4c4,0,6-2.5,6-7.4v-2.6c0-0.7-0.4-1-1.1-1h-3.3c-1.7,0-3.4-1.5-3.4-3.4v-4.1c0-1.7,1.5-3.3,3.4-3.3h14.3c1.9,0,3.3,1.8,3.3,3.3V77.6z\" />\n        <path d=\"M406.3,64c0,4.9-1.8,9.1-5.3,12.5c-3.6,3.4-7.8,5.2-12.8,5.2h-2.5c-5,0-9.3-1.8-12.9-5.2c-3.6-3.4-5.3-7.7-5.3-12.5V33.7c0-4.9,1.8-9,5.3-12.4c3.6-3.4,7.9-5.1,12.9-5.1h2.5c5,0,9.2,1.7,12.8,5.1c3.6,3.4,5.3,7.6,5.3,12.4V64z M392.6,35.7c0-4.1-2.7-7.2-5.7-7.2c-2.9,0-5.8,3.1-5.8,7.2v26.8c0,4.1,2.9,7,5.8,7c3.1,0,5.7-2.9,5.7-7V35.7z\" />\n        <path d=\"M443.6,77.9c-0.4,2-1.5,3-3.3,3h-9.5c-1.7,0-2.8-1-3.2-3l-12.4-57.1c-0.1-0.2-0.1-0.6-0.1-0.8c0-2,1-3,2.8-3h6.6c1.8,0,2.9,0.9,3.3,2.6l7.8,38.2l7.7-38.2c0.4-1.7,1.5-2.6,3.3-2.6h6.6c1.8,0,2.7,0.9,2.7,2.6c0,0.3-0.1,0.7-0.2,1.1L443.6,77.9z\" />\n      </g>\n    );\n  }\n});\n\nexport default OpenGovLogo;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/opengov_logo.js","import React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport $ from 'jquery';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\n\n// Onboarding tooltips example\n// var waypoints = [\n//   {title: 'Title', description: 'Description', node: '#foo'},\n//   {title: 'Title', description: 'Description', node: '.bar:first-child .bat'},\n//   {title: 'Title', description: 'Description', left: 10, top: 10},\n//   {title: 'Title', description: 'Description', right: 30, top: 0, position: 'bottom', align: 'right'}\n// ];\n\nconst Waypoint = createReactClass({\n  propTypes: {\n    title: PropTypes.string,\n    description: PropTypes.string,\n    node: PropTypes.string,\n    xPos: PropTypes.number,\n    yPos: PropTypes.number,\n    position: PropTypes.oneOf(['bottom']),\n    align: PropTypes.oneOf(['right'])\n  },\n\n  componentWillMount: function() {\n    $('body').css('overflow', 'hidden');\n  },\n\n  componentWillUnmount: function() {\n    $('body').css('overflow', 'auto');\n  },\n\n  render: function() {\n    var waypointClassName = classNames({\n      'ui-onboarding__waypoint': true,\n      'is-selected': this.props.selected,\n      position_bottom: this.props.data.position === 'bottom',\n      align_right: this.props.data.align === 'right'\n    });\n\n    var target = $(this.props.data.node);\n    var targetPosition = target.offset();\n    var targetTop = targetPosition ? targetPosition.top + target.height() / 2 : this.props.data.top;\n    var targetLeft = targetPosition ? targetPosition.left + target.width() / 2 : this.props.data.left;\n    var waypointStyles = {\n      top: targetTop,\n      left: targetLeft,\n      right: this.props.data.right\n    };\n\n    var buttonLabel = this.props.isLast ? 'Got it!' : 'Next Tip';\n\n    return (\n      <div className={waypointClassName} style={waypointStyles}>\n        <div className=\"ui-onboarding__bubble\" onClick={this.props.bubbleClick} />\n        <CSSTransitionGroup transitionName=\"onboarding-waypoint\">\n          {this.props.selected ? (\n            <div className=\"ui-onboarding__tooltip\">\n              <h4 ref=\"title\">{this.props.data.title}</h4>\n              <p>{this.props.data.description}</p>\n              <footer className=\"ui-onboarding__footer\">\n                {!this.props.isLast ? (\n                  <a className=\"ui-onboarding__skip\" onClick={this.props.cancelClick}>\n                    Skip these tips\n                  </a>\n                ) : null}\n                <a className=\"ui-onboarding__next ui-button small\" onClick={this.props.nextClick}>\n                  {buttonLabel}\n                </a>\n              </footer>\n            </div>\n          ) : null}\n        </CSSTransitionGroup>\n      </div>\n    );\n  }\n});\n\nconst Onboarding = createReactClass({\n  propTypes: {\n    waypoints: PropTypes.array,\n    onCancel: PropTypes.func,\n    currentWaypoint: PropTypes.number.isRequired,\n    setCurrentWaypoint: PropTypes.func.isRequired\n  },\n\n  bubbleClick: function(i) {\n    this.props.setCurrentWaypoint(i);\n  },\n\n  nextClick: function() {\n    this.props.setCurrentWaypoint(this.props.currentWaypoint + 1);\n  },\n\n  cancelClick: function() {\n    this.props.onCancel();\n  },\n\n  render: function() {\n    return (\n      <CSSTransitionGroup transitionName=\"onboarding\">\n        {this.props.currentWaypoint < this.props.waypoints.length ? (\n          <div className=\"ui-onboarding__container\">\n            {this.props.waypoints.map(\n              function(waypoint, i) {\n                var selected = i === this.props.currentWaypoint ? true : false;\n                var isLast = this.props.currentWaypoint === this.props.waypoints.length - 1 ? true : false;\n                return (\n                  <Waypoint\n                    key={i}\n                    ref={'waypoint_' + i}\n                    selected={selected}\n                    data={waypoint}\n                    bubbleClick={this.bubbleClick.bind(null, i)}\n                    nextClick={this.nextClick}\n                    cancelClick={this.cancelClick}\n                    isLast={isLast}\n                  />\n                );\n              }.bind(this)\n            )}\n          </div>\n        ) : null}\n      </CSSTransitionGroup>\n    );\n  }\n});\n\nexport default Onboarding;\n\n\n\n// WEBPACK FOOTER //\n// ../../../../src/javascripts/jsx/onboarding.js","'use strict';\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _TransitionGroup = require('./TransitionGroup');\n\nvar _TransitionGroup2 = _interopRequireDefault(_TransitionGroup);\n\nvar _CSSTransitionGroupChild = require('./CSSTransitionGroupChild');\n\nvar _CSSTransitionGroupChild2 = _interopRequireDefault(_CSSTransitionGroupChild);\n\nvar _PropTypes = require('./utils/PropTypes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar propTypes = {\n  transitionName: _PropTypes.nameShape.isRequired,\n\n  transitionAppear: _propTypes2.default.bool,\n  transitionEnter: _propTypes2.default.bool,\n  transitionLeave: _propTypes2.default.bool,\n  transitionAppearTimeout: (0, _PropTypes.transitionTimeout)('Appear'),\n  transitionEnterTimeout: (0, _PropTypes.transitionTimeout)('Enter'),\n  transitionLeaveTimeout: (0, _PropTypes.transitionTimeout)('Leave')\n};\n\nvar defaultProps = {\n  transitionAppear: false,\n  transitionEnter: true,\n  transitionLeave: true\n};\n\nvar CSSTransitionGroup = function (_React$Component) {\n  _inherits(CSSTransitionGroup, _React$Component);\n\n  function CSSTransitionGroup() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, CSSTransitionGroup);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this._wrapChild = function (child) {\n      return _react2.default.createElement(_CSSTransitionGroupChild2.default, {\n        name: _this.props.transitionName,\n        appear: _this.props.transitionAppear,\n        enter: _this.props.transitionEnter,\n        leave: _this.props.transitionLeave,\n        appearTimeout: _this.props.transitionAppearTimeout,\n        enterTimeout: _this.props.transitionEnterTimeout,\n        leaveTimeout: _this.props.transitionLeaveTimeout\n      }, child);\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  // We need to provide this childFactory so that\n  // ReactCSSTransitionGroupChild can receive updates to name, enter, and\n  // leave while it is leaving.\n\n\n  CSSTransitionGroup.prototype.render = function render() {\n    return _react2.default.createElement(_TransitionGroup2.default, _extends({}, this.props, { childFactory: this._wrapChild }));\n  };\n\n  return CSSTransitionGroup;\n}(_react2.default.Component);\n\nCSSTransitionGroup.displayName = 'CSSTransitionGroup';\n\n\nCSSTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\nCSSTransitionGroup.defaultProps = defaultProps;\n\nexports.default = CSSTransitionGroup;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/CSSTransitionGroup.js\n// module id = 813\n// module chunks = 0 1","\nmodule.exports = function chain(){\n  var len = arguments.length\n  var args = [];\n\n  for (var i = 0; i < len; i++)\n    args[i] = arguments[i]\n\n  args = args.filter(function(fn){ return fn != null })\n\n  if (args.length === 0) return undefined\n  if (args.length === 1) return args[0]\n\n  return args.reduce(function(current, next){\n    return function chainedFunction() {\n      current.apply(this, arguments);\n      next.apply(this, arguments);\n    };\n  })\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/chain-function/index.js\n// module id = 814\n// module chunks = 0 1","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n  warning = function(condition, format, args) {\n    var len = arguments.length;\n    args = new Array(len > 2 ? len - 2 : 0);\n    for (var key = 2; key < len; key++) {\n      args[key - 2] = arguments[key];\n    }\n    if (format === undefined) {\n      throw new Error(\n        '`warning(condition, format, ...args)` requires a warning ' +\n        'message argument'\n      );\n    }\n\n    if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n      throw new Error(\n        'The warning format should be able to uniquely identify this ' +\n        'warning. Please, use a more descriptive format than: ' + format\n      );\n    }\n\n    if (!condition) {\n      var argIndex = 0;\n      var message = 'Warning: ' +\n        format.replace(/%s/g, function() {\n          return args[argIndex++];\n        });\n      if (typeof console !== 'undefined') {\n        console.error(message);\n      }\n      try {\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch(x) {}\n    }\n  };\n}\n\nmodule.exports = warning;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/warning/browser.js\n// module id = 815\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\n\nvar _react = require('react');\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children) {\n  if (!children) {\n    return children;\n  }\n  var result = {};\n  _react.Children.map(children, function (child) {\n    return child;\n  }).forEach(function (child) {\n    result[child.key] = child;\n  });\n  return result;\n}\n\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\nfunction mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    if (next.hasOwnProperty(key)) {\n      return next[key];\n    }\n\n    return prev[key];\n  }\n\n  // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n  var nextKeysPending = {};\n\n  var pendingKeys = [];\n  for (var prevKey in prev) {\n    if (next.hasOwnProperty(prevKey)) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i = void 0;\n  var childMapping = {};\n  for (var nextKey in next) {\n    if (nextKeysPending.hasOwnProperty(nextKey)) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n    childMapping[nextKey] = getValueForKey(nextKey);\n  }\n\n  // Finally, add the keys which didn't appear before any key in `next`\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/utils/ChildMapping.js\n// module id = 816\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _addClass = require('dom-helpers/class/addClass');\n\nvar _addClass2 = _interopRequireDefault(_addClass);\n\nvar _removeClass = require('dom-helpers/class/removeClass');\n\nvar _removeClass2 = _interopRequireDefault(_removeClass);\n\nvar _requestAnimationFrame = require('dom-helpers/util/requestAnimationFrame');\n\nvar _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);\n\nvar _properties = require('dom-helpers/transition/properties');\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = require('react-dom');\n\nvar _PropTypes = require('./utils/PropTypes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar events = [];\nif (_properties.transitionEnd) events.push(_properties.transitionEnd);\nif (_properties.animationEnd) events.push(_properties.animationEnd);\n\nfunction addEndListener(node, listener) {\n  if (events.length) {\n    events.forEach(function (e) {\n      return node.addEventListener(e, listener, false);\n    });\n  } else {\n    setTimeout(listener, 0);\n  }\n\n  return function () {\n    if (!events.length) return;\n    events.forEach(function (e) {\n      return node.removeEventListener(e, listener, false);\n    });\n  };\n}\n\nvar propTypes = {\n  children: _propTypes2.default.node,\n  name: _PropTypes.nameShape.isRequired,\n\n  // Once we require timeouts to be specified, we can remove the\n  // boolean flags (appear etc.) and just accept a number\n  // or a bool for the timeout flags (appearTimeout etc.)\n  appear: _propTypes2.default.bool,\n  enter: _propTypes2.default.bool,\n  leave: _propTypes2.default.bool,\n  appearTimeout: _propTypes2.default.number,\n  enterTimeout: _propTypes2.default.number,\n  leaveTimeout: _propTypes2.default.number\n};\n\nvar CSSTransitionGroupChild = function (_React$Component) {\n  _inherits(CSSTransitionGroupChild, _React$Component);\n\n  function CSSTransitionGroupChild() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, CSSTransitionGroupChild);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.componentWillAppear = function (done) {\n      if (_this.props.appear) {\n        _this.transition('appear', done, _this.props.appearTimeout);\n      } else {\n        done();\n      }\n    }, _this.componentWillEnter = function (done) {\n      if (_this.props.enter) {\n        _this.transition('enter', done, _this.props.enterTimeout);\n      } else {\n        done();\n      }\n    }, _this.componentWillLeave = function (done) {\n      if (_this.props.leave) {\n        _this.transition('leave', done, _this.props.leaveTimeout);\n      } else {\n        done();\n      }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  CSSTransitionGroupChild.prototype.componentWillMount = function componentWillMount() {\n    this.classNameAndNodeQueue = [];\n    this.transitionTimeouts = [];\n  };\n\n  CSSTransitionGroupChild.prototype.componentWillUnmount = function componentWillUnmount() {\n    this.unmounted = true;\n\n    if (this.timeout) {\n      clearTimeout(this.timeout);\n    }\n    this.transitionTimeouts.forEach(function (timeout) {\n      clearTimeout(timeout);\n    });\n\n    this.classNameAndNodeQueue.length = 0;\n  };\n\n  CSSTransitionGroupChild.prototype.transition = function transition(animationType, finishCallback, timeout) {\n    var node = (0, _reactDom.findDOMNode)(this);\n\n    if (!node) {\n      if (finishCallback) {\n        finishCallback();\n      }\n      return;\n    }\n\n    var className = this.props.name[animationType] || this.props.name + '-' + animationType;\n    var activeClassName = this.props.name[animationType + 'Active'] || className + '-active';\n    var timer = null;\n    var removeListeners = void 0;\n\n    (0, _addClass2.default)(node, className);\n\n    // Need to do this to actually trigger a transition.\n    this.queueClassAndNode(activeClassName, node);\n\n    // Clean-up the animation after the specified delay\n    var finish = function finish(e) {\n      if (e && e.target !== node) {\n        return;\n      }\n\n      clearTimeout(timer);\n      if (removeListeners) removeListeners();\n\n      (0, _removeClass2.default)(node, className);\n      (0, _removeClass2.default)(node, activeClassName);\n\n      if (removeListeners) removeListeners();\n\n      // Usually this optional callback is used for informing an owner of\n      // a leave animation and telling it to remove the child.\n      if (finishCallback) {\n        finishCallback();\n      }\n    };\n\n    if (timeout) {\n      timer = setTimeout(finish, timeout);\n      this.transitionTimeouts.push(timer);\n    } else if (_properties.transitionEnd) {\n      removeListeners = addEndListener(node, finish);\n    }\n  };\n\n  CSSTransitionGroupChild.prototype.queueClassAndNode = function queueClassAndNode(className, node) {\n    var _this2 = this;\n\n    this.classNameAndNodeQueue.push({\n      className: className,\n      node: node\n    });\n\n    if (!this.rafHandle) {\n      this.rafHandle = (0, _requestAnimationFrame2.default)(function () {\n        return _this2.flushClassNameAndNodeQueue();\n      });\n    }\n  };\n\n  CSSTransitionGroupChild.prototype.flushClassNameAndNodeQueue = function flushClassNameAndNodeQueue() {\n    if (!this.unmounted) {\n      this.classNameAndNodeQueue.forEach(function (obj) {\n        // This is for to force a repaint,\n        // which is necessary in order to transition styles when adding a class name.\n        /* eslint-disable no-unused-expressions */\n        obj.node.scrollTop;\n        /* eslint-enable no-unused-expressions */\n        (0, _addClass2.default)(obj.node, obj.className);\n      });\n    }\n    this.classNameAndNodeQueue.length = 0;\n    this.rafHandle = null;\n  };\n\n  CSSTransitionGroupChild.prototype.render = function render() {\n    var props = _extends({}, this.props);\n    delete props.name;\n    delete props.appear;\n    delete props.enter;\n    delete props.leave;\n    delete props.appearTimeout;\n    delete props.enterTimeout;\n    delete props.leaveTimeout;\n    delete props.children;\n    return _react2.default.cloneElement(_react2.default.Children.only(this.props.children), props);\n  };\n\n  return CSSTransitionGroupChild;\n}(_react2.default.Component);\n\nCSSTransitionGroupChild.displayName = 'CSSTransitionGroupChild';\n\n\nCSSTransitionGroupChild.propTypes = process.env.NODE_ENV !== \"production\" ? propTypes : {};\n\nexports.default = CSSTransitionGroupChild;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-transition-group/CSSTransitionGroupChild.js\n// module id = 817\n// module chunks = 0 1","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = addClass;\n\nvar _hasClass = _interopRequireDefault(require(\"./hasClass\"));\n\nfunction addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!(0, _hasClass.default)(element, className)) if (typeof element.className === 'string') element.className = element.className + ' ' + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + ' ' + className);\n}\n\nmodule.exports = exports[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/class/addClass.js\n// module id = 818\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\nexports.default = hasClass;\n\nfunction hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);else return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\nmodule.exports = exports[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/class/hasClass.js\n// module id = 819\n// module chunks = 0 1","'use strict';\n\nfunction replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp('(^|\\\\s)' + classToRemove + '(?:\\\\s|$)', 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nmodule.exports = function removeClass(element, className) {\n  if (element.classList) element.classList.remove(className);else if (typeof element.className === 'string') element.className = replaceClassName(element.className, className);else element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/class/removeClass.js\n// module id = 820\n// module chunks = 0 1","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _inDOM = _interopRequireDefault(require(\"./inDOM\"));\n\nvar vendors = ['', 'webkit', 'moz', 'o', 'ms'];\nvar cancel = 'clearTimeout';\nvar raf = fallback;\nvar compatRaf;\n\nvar getKey = function getKey(vendor, k) {\n  return vendor + (!vendor ? k : k[0].toUpperCase() + k.substr(1)) + 'AnimationFrame';\n};\n\nif (_inDOM.default) {\n  vendors.some(function (vendor) {\n    var rafKey = getKey(vendor, 'request');\n\n    if (rafKey in window) {\n      cancel = getKey(vendor, 'cancel');\n      return raf = function raf(cb) {\n        return window[rafKey](cb);\n      };\n    }\n  });\n}\n/* https://github.com/component/raf */\n\n\nvar prev = new Date().getTime();\n\nfunction fallback(fn) {\n  var curr = new Date().getTime(),\n      ms = Math.max(0, 16 - (curr - prev)),\n      req = setTimeout(fn, ms);\n  prev = curr;\n  return req;\n}\n\ncompatRaf = function compatRaf(cb) {\n  return raf(cb);\n};\n\ncompatRaf.cancel = function (id) {\n  window[cancel] && typeof window[cancel] === 'function' && window[cancel](id);\n};\n\nvar _default = compatRaf;\nexports.default = _default;\nmodule.exports = exports[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/util/requestAnimationFrame.js\n// module id = 821\n// module chunks = 0 1","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = exports.animationEnd = exports.animationDelay = exports.animationTiming = exports.animationDuration = exports.animationName = exports.transitionEnd = exports.transitionDuration = exports.transitionDelay = exports.transitionTiming = exports.transitionProperty = exports.transform = void 0;\n\nvar _inDOM = _interopRequireDefault(require(\"../util/inDOM\"));\n\nvar transform = 'transform';\nexports.transform = transform;\nvar prefix, transitionEnd, animationEnd;\nexports.animationEnd = animationEnd;\nexports.transitionEnd = transitionEnd;\nvar transitionProperty, transitionDuration, transitionTiming, transitionDelay;\nexports.transitionDelay = transitionDelay;\nexports.transitionTiming = transitionTiming;\nexports.transitionDuration = transitionDuration;\nexports.transitionProperty = transitionProperty;\nvar animationName, animationDuration, animationTiming, animationDelay;\nexports.animationDelay = animationDelay;\nexports.animationTiming = animationTiming;\nexports.animationDuration = animationDuration;\nexports.animationName = animationName;\n\nif (_inDOM.default) {\n  var _getTransitionPropert = getTransitionProperties();\n\n  prefix = _getTransitionPropert.prefix;\n  exports.transitionEnd = transitionEnd = _getTransitionPropert.transitionEnd;\n  exports.animationEnd = animationEnd = _getTransitionPropert.animationEnd;\n  exports.transform = transform = prefix + \"-\" + transform;\n  exports.transitionProperty = transitionProperty = prefix + \"-transition-property\";\n  exports.transitionDuration = transitionDuration = prefix + \"-transition-duration\";\n  exports.transitionDelay = transitionDelay = prefix + \"-transition-delay\";\n  exports.transitionTiming = transitionTiming = prefix + \"-transition-timing-function\";\n  exports.animationName = animationName = prefix + \"-animation-name\";\n  exports.animationDuration = animationDuration = prefix + \"-animation-duration\";\n  exports.animationTiming = animationTiming = prefix + \"-animation-delay\";\n  exports.animationDelay = animationDelay = prefix + \"-animation-timing-function\";\n}\n\nvar _default = {\n  transform: transform,\n  end: transitionEnd,\n  property: transitionProperty,\n  timing: transitionTiming,\n  delay: transitionDelay,\n  duration: transitionDuration\n};\nexports.default = _default;\n\nfunction getTransitionProperties() {\n  var style = document.createElement('div').style;\n  var vendorMap = {\n    O: function O(e) {\n      return \"o\" + e.toLowerCase();\n    },\n    Moz: function Moz(e) {\n      return e.toLowerCase();\n    },\n    Webkit: function Webkit(e) {\n      return \"webkit\" + e;\n    },\n    ms: function ms(e) {\n      return \"MS\" + e;\n    }\n  };\n  var vendors = Object.keys(vendorMap);\n  var transitionEnd, animationEnd;\n  var prefix = '';\n\n  for (var i = 0; i < vendors.length; i++) {\n    var vendor = vendors[i];\n\n    if (vendor + \"TransitionProperty\" in style) {\n      prefix = \"-\" + vendor.toLowerCase();\n      transitionEnd = vendorMap[vendor]('TransitionEnd');\n      animationEnd = vendorMap[vendor]('AnimationEnd');\n      break;\n    }\n  }\n\n  if (!transitionEnd && 'transitionProperty' in style) transitionEnd = 'transitionend';\n  if (!animationEnd && 'animationName' in style) animationEnd = 'animationend';\n  style = null;\n  return {\n    animationEnd: animationEnd,\n    transitionEnd: transitionEnd,\n    prefix: prefix\n  };\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dom-helpers/transition/properties.js\n// module id = 822\n// module chunks = 0 1","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport {RouteHandler, Navigation, State} from 'react-router';\n\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\nimport { StoreListener } from '@opengov/og_flux';\n\nimport ControlPanelStore from '@opengov/controlpanel/lib/stores/control_panel_store';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\n\nimport Reports from './models/reports';\nimport Entity from './models/entity';\nimport { initializeTracking } from './tracking';\n\nconst ReportApp = createReactClass<any, any>({\n  mixins: [\n    StoreListener(ControlPanelStore, SessionStore),\n    Navigation, State,\n  ] as any,\n\n  getInitialState() {\n    return {\n      settingsPanelOpen: false,\n      reports: new Reports(),\n      ...this.getStateFromStore()\n    };\n  },\n\n  getStateFromStore() {\n    const entity = ControlPanelStore.getSelectedEntity();\n\n    if (gon.session && entity) {\n      initializeTracking(gon.session, entity);\n    }\n\n    return {\n      entity: entity && new Entity(entity),\n      session: SessionStore.getSession(),\n      loading: ControlPanelStore.isLoading()\n    };\n  },\n\n  storeDidUpdate() {\n    const nextState = this.getStateFromStore();\n\n    const currentEntity = this.state.entity;\n    const nextEntity = nextState.entity;\n\n    const shouldLoadReports = !gon.isNetwork\n      && nextEntity && (!currentEntity || currentEntity.id !== nextEntity.id)\n      && !this.isActive('report-index'); // if we are loading the reports index, that component will load the reports\n\n    if (shouldLoadReports) {\n      this.loadReports(nextEntity);\n    }\n\n    this.setState(nextState);\n  },\n\n  handleMakeDefaultReport(reportId) {\n    const self = this;\n    reportId = reportId || this.state.report.id;\n    var report = this.state.reports.get(reportId);\n    Ovid.Alert.confirm(\n      'Change the default report',\n      _.template('Make \"${name}\" the default report?', {name: report.get('name')} as any),\n      function(confirmed) {\n        if (confirmed) {\n          self.makeDefaultReport(reportId);\n        }\n      }\n    );\n  },\n\n  handleOpenSettingsPanel() {\n    this.setState({settingsPanelOpen: true});\n  },\n\n  handleCloseSettingsPanel() {\n    this.setState({settingsPanelOpen: false});\n  },\n\n  makeDefaultReport(reportId) {\n    this.state.entity.save({default_report_id: reportId}, {\n      success() {\n        Ovid.Flash.ftw({\n          title: 'Success!',\n          message: 'This report is now the default report'\n        });\n      },\n      error(model, resp) {\n        const json = resp.responseJSON;\n        const msg = json.message || 'There was an error updating the default report.';\n        Ovid.Alert.open({\n          title: 'Error Updating Default Report',\n          content: <p>{msg}</p>\n        });\n\n        // Revert the default report ID change if the request fails.\n        model.set('default_report_id', model.previous('default_report_id'));\n      }\n    });\n  },\n\n  loadReports(entity) {\n    this.state.reports.fetch({\n      data: {entity_id: entity.get('entity_id'), embed:'associated_reports'},\n      success: this.handleReportsLoaded\n    });\n  },\n\n  loadLegacyReport() {\n    // Attempt to find a report with a type that matches the legeacy report ID.\n    const report = this.state.reports.findWhere({report_type: this.props.report.id});\n    if (report) {\n      this.loadReport(report);\n      this.setReportRoute(report);\n    } else {\n      // If no report is found with that type fallback to loading the default.\n      this.loadDefaultReport();\n    }\n  },\n\n  handleReportsLoaded(reports) {\n    if (!this._isMounted) {\n      return;\n    }\n\n    this.setState({reports});\n\n    if (this.props.report) {\n      // Handle loading reports with legeacy IDs (ex: annual, balance, ytd).\n      if (this.props.report.isLegacy()) {\n        this.loadLegacyReport();\n      }\n    }\n  },\n\n  handleRouteChange(report, reportParams) {\n    const entity = this.state.entity.id;\n\n    if (report === 'new') {\n      this.transitionTo('report-index', {entity});\n    } else {\n      let params = {report, reportParams, entity};\n      if (this.isActive('report')) {\n        // When navigating to a report from the index page,\n        // we want to replace the initial route with the params\n        // version. This way you can click back once to return to the index page.\n        this.replaceWith('reportWithParams', params);\n      } else {\n        // All other route updates due to param changes should push a new history item.\n        // User should be able to click the native back button to return to the previous state.\n        this.transitionTo('reportWithParams', params);\n      }\n    }\n  },\n\n  render() {\n    if (this.state.loading) {\n      return (\n        <div className=\"ui-loading\" />\n      );\n    }\n\n    if (!this.state.entity) {\n      return (\n        <div className=\"report-index\">\n          <header className=\"ui-main__header\">\n            <nav className=\"ui-breadcrumbs\">\n              <span className=\"ui-breadcrumbs__item\">\n                <span className=\"icon-px-reports-20\" />\n                Reports\n              </span>\n            </nav>\n          </header>\n          <p className=\"ui-null\">\n            <strong>No entity selected.</strong>\n            Please select an entity above to get started.\n          </p>\n        </div>\n      );\n    }\n\n    return (\n      <RouteHandler\n        report={this.props.report}\n        reportParams={this.props.reportParams}\n        reports={this.state.reports}\n        session={this.state.session}\n        entity={this.state.entity}\n        isControlPanel\n\n        onCloseSettingsPanel={this.handleCloseSettingsPanel}\n        onOpenSettingsPanel={this.handleOpenSettingsPanel}\n        settingsPanelOpen={this.state.settingsPanelOpen}\n        onMakeDefaultReport={this.handleMakeDefaultReport}\n        onRouteChange={this.handleRouteChange}\n      />\n    );\n  }\n});\n\nexport default ReportApp;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_app.tsx","import Backbone from 'backbone';\nimport _ from 'lodash';\nimport moment from 'moment';\n\nexport default Backbone.Model.extend({\n  parse(resp) {\n    return _.extend(resp, {\n      type: resp.data_set_type,\n      monthText: resp.month ? moment(resp.month, 'M').format('MMMM') : '',\n      date_updated: moment(resp.updated).format('MMM D YYYY hh:mm A'),\n      date_created: moment(resp.created).format('MMM D YYYY hh:mm A')\n    });\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/gl_data_set.ts","import React from 'react';\nimport _ from 'lodash';\nimport cx from 'classnames';\nimport Coas from './models/chart_of_accounts';\nimport async from 'async';\nimport $ from 'jquery';\nimport cookies from 'cookies-js';\nimport ReportPreferencesActions from './actions/report_preferences_actions';\nimport {assetPath} from './asset_helpers';\n\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport transitionDefaults from './utils/css_transition_defaults';\nimport update from 'immutability-helper';\nimport { StoreListener } from '@opengov/og_flux';\nimport TreeView from 'react-treeview';\nimport EventObserver from './utils/event_observer_mixin';\n\nimport Reports from './models/reports';\n\nimport LockedReportCreationModal from './locked_report_creation_modal';\nimport CreateNewReportButton from './create_new_report_button';\nimport LinkToCivicDashboardsButton from './link_to_civicdashboards_button';\nimport ModalStore from './stores/modal_store';\nimport ReportPreferencesStore from './stores/report_preferences_store';\nimport ReportWelcome from './modals/report_welcome_modal';\nimport TemplateFixture from './fixtures/template_fixtures';\nimport ReportIndexNav from './report_index_nav';\n\nimport ReportIndexHeader from './report_index_header/header';\nimport ReportIndexSearch from './report_index_header/search';\nimport ReportIndexFilter from './report_index_header/filter';\nimport ReportIndexSort from './report_index_header/sort';\nimport ReportIndexList from './report_index_header/list';\nimport ReportIndexShow from './report_index_header/show';\nimport ReportIndexItem from './report_index_item';\nimport ToggleEditSaveKeywords from './report_keywords/toggle_edit_keyword';\nimport { getUpdatedKeywords } from './report_keywords/report_keywords_utils';\n\nconst cookieExpires = new Date(new Date().setFullYear(new Date().getFullYear() + 1));\n\nconst confirmationMessage = 'It looks like you have been editing something. If you leave before saving, your changes will be lost.';\n\nimport createReactClass from 'create-react-class';\nimport { ldInitialize, ILaunchDarklyParams } from '@opengov/launchdarkly';\nimport { trackPage } from './tracking';\n\nconst ReportNavActions = createReactClass<any, any>({\n  render() {\n    const {civicDashboardsEnabled, coas, canCreateReport, newReportHref, toggleLockedReportCreation} = this.props;\n    return (\n      <div className=\"report-nav-actions\">\n        {civicDashboardsEnabled && <LinkToCivicDashboardsButton/>}\n        {coas}\n        <CreateNewReportButton\n          canCreateReport={canCreateReport}\n          onClick={toggleLockedReportCreation}\n          newReportHref={newReportHref}\n        />\n      </div>\n    );\n  }\n});\n\nconst ReportIndex = createReactClass<any, any>({\n  mixins: [EventObserver, StoreListener(ModalStore, ReportPreferencesStore)] as any,\n\n  render() {\n    if (!this.state.loaded) {\n      return (\n        <div className=\"report-index\">\n          <div className=\"ui-loading\"></div>\n        </div>\n      );\n    }\n\n    const userRole = this.props.session.attributes.role.name;\n    const dashboardsEnabled = _.some(this.props.entity.attributes.feature_permissions, fp => fp == 'dashboards');\n    const civicDashboardsEnabled = _.some(this.props.entity.attributes.feature_permissions, fp => fp == 'civicdashboards');\n\n    const newReportHref = '#/' + this.props.entity.id + '/reports/new';\n\n    const canCreateReport = this.props.session.can('create', 'report');\n\n    const coas = this.coas.length > 1 ?\n        (\n          <select className=\"coa-switcher\" onChange={this.handleCoaChange} value={this.state.coa.id}>\n            {this.coas.map((coa) => {\n              return <option key={coa.id} value={coa.id}>{coa.get('name')}{coa.get('is_default') ? ' (default)' : ''}</option>;\n            })}\n          </select>\n        ) : null;\n    const chartId = this.state.coa ? this.state.coa.id : null;\n    const reports = this.state.filteredReports.filter(report => report.get('coa_id') === chartId || report.get('coa_id') === null);\n\n    const templatesLabel = <span className=\"node\" onClick={this.handleShowTemplates}>Report Templates</span>;\n    const reportIndexClassnames = cx({ 'reports-index': true, 'dashboards-enabled': dashboardsEnabled });\n    const sortedReports = _.orderBy(reports, [(report: any) => report.get('name').toLowerCase(), (report: any) => report.get('name')], [this.state.sortBy, this.state.sortBy]);\n    const reportViewType = this.state.reportViewType;\n\n    return (\n      <div className={reportIndexClassnames}>\n        <ReportIndexNav\n          dashboardsEnabled={dashboardsEnabled}\n          entityId={this.props.entity.id}\n          newReportingEnabled={this.state.newReportingEnabled}>\n            <div className=\"performance-header__container\">\n              <h1 className=\"header-text\">Reports</h1>\n              <ReportNavActions\n                coas={coas}\n                civicDashboardsEnabled={civicDashboardsEnabled}\n                canCreateReport={canCreateReport}\n                toggleLockedReportCreation={this.toggleLockedReportCreation}\n                newReportHref={newReportHref}/>\n            </div>\n            <ReportIndexHeader>\n              <ReportIndexSearch\n                searchInput={this.state.searchInput}\n                onHandleUserInput={this.handleUserInput} />\n              <ReportIndexSort\n                handleSorting={this.setSortOrder}\n                sortOrder={this.state.sortBy} />\n              <ReportIndexFilter\n                keywords ={this.state.keywords}\n                checkedKeywords = {this.state.checkedKeywords}\n                userRole={userRole}\n                onHandleManageKeywords= {this.handleManageKeywords}\n                onHandleChangeKeywords={this.handleChangeKeywords}/>\n              <ReportIndexShow\n                visibility={this.state.visibility}\n                onHandleChangeVisibility={this.handleChangeVisibility} />\n              <ReportIndexList\n                reportViewType={reportViewType}\n                changeReportViewType={this.changeReportViewType} />\n            </ReportIndexHeader>\n        </ReportIndexNav>\n        <div className=\"reports-list\">\n          <ReportIndexListColumnHeaders\n            reports={reports}\n            reportViewType={reportViewType}\n            toggleEditKeywordsMode={this.toggleEditKeywordsMode}\n            isEditKeywordsMode={this.state.isEditKeywordsMode}\n            userRole={userRole} />\n          {reports.length > 0 ?\n            this.renderReports(sortedReports, canCreateReport)\n            : <div className=\"no-reports-found\">No reports found</div>\n          }\n          {canCreateReport && !this.state.loadingHideTemplates &&\n            <TreeView\n              key={\"entity_report_templates\"}\n              nodeLabel={templatesLabel}\n              collapsed={this.state.showTemplates}\n              onClick={this.handleShowTemplates}\n              >\n              <div className=\"tree-template_title\">\n                Report Templates are <b>examples</b> of the most popular reports being created\n                by other governments on OpenGov. You can view examples of the report and download\n                the template for step-by-step instructions to create the report for your organization.\n              </div>\n              {this.renderReportTemplates(TemplateFixture)}\n            </TreeView>\n          }\n        </div>\n        <CSSTransitionGroup transitionName=\"ui-overlays\" {...transitionDefaults}>\n          {this.state.lockedReportCreationModal ?\n            <LockedReportCreationModal closeModal={this.toggleLockedReportCreation}/>\n          : null}\n          {this.state.showReportWelcome ?\n            <ReportWelcome\n              entityName={this.props.entity.get('name')}\n              entityDisplayName={this.props.entity.get('display_name')}\n              userRole={userRole} /> : null\n          }\n        </CSSTransitionGroup>\n      </div>\n    );\n  },\n\n  buildCookieName(type) {\n    return 'report_index_filter_' + type + '_u' + this.props.session.attributes.id + '_e' + this.props.entity.attributes.entity_id;\n  },\n\n  changeReportViewType(reportViewType) {\n    this.setState({\n      reportViewType\n    });\n\n    cookies.set(this.buildCookieName('view'), reportViewType, { expires: cookieExpires });\n  },\n\n  formatSearchInput(searchInput) {\n    return searchInput.toLowerCase().replace(/[^a-zA-Z0-9]/ig, '');\n  },\n\n  handleUserInput(searchInput) {\n    const filteredReports = this.performFiltering(searchInput, this.state.visibility, this.state.checkedKeywords);\n\n    this.setState(update(this.state, {\n      filteredReports: {$set: filteredReports },\n      searchInput: { $set: searchInput }\n    }));\n  },\n\n  handleChangeVisibility(visibility) {\n    const filteredReports = this.performFiltering(this.state.searchInput, visibility, this.state.checkedKeywords);\n    this.setState(update(this.state, {\n      filteredReports: {$set: filteredReports },\n      visibility: { $set: visibility }\n    }));\n\n    cookies.set(this.buildCookieName('visibility'), visibility, { expires: cookieExpires });\n  },\n\n  performFiltering(searchInput, visibility, keywords) {\n    let filteredReports = this.state.reports;\n\n    // First, search by search filter\n    filteredReports = filteredReports.filter(report => _.includes(this.formatSearchInput(report.get('name')), this.formatSearchInput(searchInput)) || _.includes(this.formatSearchInput((report.get('owner').first_name + ' ' + report.get('owner').last_name)), this.formatSearchInput(searchInput)) || _.includes(this.formatSearchInput(report.get('visibility')), this.formatSearchInput(searchInput)));\n\n    // Next, filter by visibility\n    if (visibility == 'my_reports') {\n      filteredReports = filteredReports.filter(report => report.get('owner').id == this.props.session.attributes.id);\n    }\n\n    if (visibility == 'shared') {\n      filteredReports = filteredReports.filter(report => report.get('visibility') == 'private' && report.get('owner').id != this.props.session.attributes.id);\n    }\n\n    // Next, filter by keywords\n    if (keywords && keywords.length > 0) {\n      filteredReports = filteredReports.filter(report => {\n        const length = _.intersection(report.get('keywords'), keywords).length;\n        return length > 0 ? true : false;\n      }\n      );\n    }\n    return filteredReports;\n  },\n\n  positionMainPanel() {\n    let initialTop;\n    const $window = $(window);\n\n    this.scrollCallback = () => {\n      const $node = $('.ui-main__sidebar');\n      if (!initialTop) {\n        initialTop = parseInt($node.css('top'), 10);\n      }\n      if ($node) {\n        const windowTop = $window.scrollTop();\n        const mainPanelTop = Math.max(initialTop - windowTop, 0);\n        $node.css('top', mainPanelTop);\n      }\n    };\n\n    $(document).on('scroll', this.scrollCallback);\n  },\n\n  handleCoaChange(e) {\n    this.setState({\n      coa: this.coas.get(e.target.value)\n    });\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.entity.id !== nextProps.entity.id) {\n      this.fetchReports(nextProps.entity);\n      this.updateDocumentTitle(nextProps.entity);\n    }\n  },\n\n  getUniqueKeywords(reports) {\n    let keys = [];\n    reports.map((report) =>{\n      keys = report.get('keywords') ? keys.concat(report.get('keywords')) : keys;\n    });\n    return _.uniq(keys);\n  },\n\n  toggleEditKeywordsMode() {\n    if (this.state.isEditKeywordsMode) {\n      this.saveKeywordsOnDone();\n    }\n    this.setState({isEditKeywordsMode: !this.state.isEditKeywordsMode});\n  },\n\n  saveKeywordsOnDone() {\n    const reportId = this.getActiveReportId();\n    if (reportId !== 0 ) {\n      const unSavedKeywords = this.isUnsavedKeywords();\n      if (unSavedKeywords) {\n        this.saveKeywordsAction();\n        this.updateReport(reportId, 'saveOnDone');\n        this.postSaveKeywords();\n      }\n    }\n  },\n\n  getActiveReportId() {\n    let reportId = 0;\n    if (!_.isEmpty(this.state.addedKeywordsReport.keywords)) {\n      reportId = this.state.addedKeywordsReport.reportId;\n    }\n    if (!_.isEmpty(this.state.deletedKeywordsReport.keywords)) {\n      reportId = this.state.deletedKeywordsReport.reportId;\n    }\n    return reportId;\n  },\n\n  handleManageKeywords() {\n    this.setState({isEditKeywordsMode: true});\n    this.changeReportViewType('list');\n  },\n\n  updateStateKeywords(keywords, id, action) {\n    if (action == 'add') {\n      this.setState({addedKeywordsReport: {reportId: id, keywords: keywords}});\n    } else if (action == 'remove') {\n      this.setState({deletedKeywordsReport: {reportId: id, keywords: keywords}});\n    }\n  },\n\n  saveKeywords(reportId) {\n    const unSavedKeywords = this.isUnsavedKeywords();\n    if (unSavedKeywords) {\n      this.saveKeywordsAction();\n      this.updateReport(reportId);\n      this.postSaveKeywords();\n    }\n  },\n\n  isUnsavedKeywords() {\n    const addKeywords = this.state.addedKeywordsReport.keywords;\n    const deleteKeywords = this.state.deletedKeywordsReport.keywords;\n    let unSavedKeywords = false;\n\n    if (!_.isEmpty(addKeywords) || !_.isEmpty(deleteKeywords)) {\n      unSavedKeywords = true;\n    }\n    return unSavedKeywords;\n  },\n\n  saveKeywordsAction() {\n    const addKeywords = this.state.addedKeywordsReport.keywords;\n    const deleteKeywords = this.state.deletedKeywordsReport.keywords;\n    ReportPreferencesActions.updateKeywords(this.state.addedKeywordsReport.reportId, addKeywords);\n    ReportPreferencesActions.deleteKeywords(this.state.deletedKeywordsReport.reportId, deleteKeywords);\n  },\n\n  postSaveKeywords() {\n    this.updateKeywords();\n    this.setState({addedKeywordsReport: {reportId: 0, keywords: []}});\n    this.setState({deletedKeywordsReport: {reportId: 0, keywords: []}});\n  },\n\n  setUpdatedReportKeywords(reportId, keywords) {\n    this.setState({updatedReportKeywords: {reportId: reportId, keywords: keywords}});\n  },\n\n  updateReport(reportId, action = 'saveKeywords') {\n    let updatedKeywords;\n    this.state.reports.models.map((report) => {\n      if (report.id == reportId) {\n        if (action == 'saveOnDone') {\n          const assignedKeywords = report.attributes.keywords;\n          updatedKeywords = getUpdatedKeywords(reportId, assignedKeywords, this.state.addedKeywordsReport, this.state.deletedKeywordsReport);\n        }\n        report.attributes.keywords = action == 'saveOnDone' ? updatedKeywords : this.state.updatedReportKeywords.keywords;\n      }\n    });\n  },\n\n  handleChangeKeywords(checkedKeywords) {\n    const filteredReports = this.performFiltering(this.state.searchInput, this.state.visibility, checkedKeywords);\n\n    this.setState(update(this.state, {\n      filteredReports: {$set: filteredReports },\n      checkedKeywords: { $set: checkedKeywords }\n    }));\n\n    cookies.set(this.buildCookieName('checked_keywords'), checkedKeywords, { expires: cookieExpires });\n  },\n\n  renderReports(reports, canCreateReport) {\n    const reportViewType = this.state.reportViewType;\n    const wrapperClass = (reports.length > 0 && reportViewType == 'list') ? 'ui-row report-list-box' : 'ui-row';\n    const isEditKeywordsMode = this.state.isEditKeywordsMode;\n    const addedKeywordsReport = this.state.addedKeywordsReport;\n    const deletedKeywordsReport = this.state.deletedKeywordsReport;\n    const isNotFiltering = this.state.searchInput == '' && this.state.visibility == 'all' && _.isEmpty(this.state.checkedKeywords);\n    const shouldShowWelcome = reports.length < 3 && reportViewType === 'grid' && isNotFiltering;\n\n    return (\n      <div className={wrapperClass}>\n        {shouldShowWelcome && <ReportTemplateWelcomeItem canCreateReport={canCreateReport} />}\n        {reports.map((report) =>\n          <ReportIndexItem\n            {...this.props}\n            key={report.id}\n            report={report}\n            entity={this.props.entity}\n            isDefault={report.position === 0}\n            reportViewType={reportViewType}\n            onMouseLeave={this.handleMouseLeave}\n            onMakeDefaultReport={this.props.onMakeDefaultReport}\n            onMouseEnter={_.partial(this.handleMouseEnter, report)}\n            isEditKeywordsMode={isEditKeywordsMode}\n            addedKeywordsReport={addedKeywordsReport}\n            deletedKeywordsReport={deletedKeywordsReport}\n            updateStateKeywords={this.updateStateKeywords}\n            saveKeywords={this.saveKeywords}\n            keywords={this.state.keywords}\n            setUpdatedReportKeywords={this.setUpdatedReportKeywords} />\n        )}\n      </div>\n    );\n  },\n\n  renderReportTemplates(templates) {\n    return (\n      <div className=\"ui-row\">\n        {templates.map((template) =>\n          <ReportTemplateItem\n            key={template.id}\n            template={template}/>\n        )}\n      </div>\n    );\n  },\n\n  handleShowTemplates() {\n    const userId = this.props.session && this.props.session.id;\n    ReportPreferencesActions.hideTemplates(userId, !this.state.showTemplates);\n  },\n\n  getTemplatePreferences() {\n    const userId = this.props.session && this.props.session.id;\n    ReportPreferencesActions.getTemplatePreferences(userId);\n  },\n\n  getInitialState() {\n    const checkedKeywordsCookies = cookies.get(this.buildCookieName('checked_keywords'));\n    return {\n      hoveredReport: null,\n      loaded: false,\n      lockedReportCreationModal: false,\n      showReportWelcome: ModalStore.getState().get('showReportWelcome') && !cookies.get('reports_visited'),\n      showTemplates: null,\n      loadingHideTemplates: ReportPreferencesStore.getState().get('loadingHideTemplates'),\n      sortBy : cookies.get(this.buildCookieName('sort')) || 'asc',\n      reportViewType: cookies.get(this.buildCookieName('view')) || 'grid',\n      filteredReports: [],\n      searchInput: '',\n      visibility: cookies.get(this.buildCookieName('visibility')) || 'all',\n      keywords: [],\n      checkedKeywords: checkedKeywordsCookies ? checkedKeywordsCookies.split(',') : [],\n      isEditKeywordsMode: false,\n      addedKeywordsReport: {reportId: 0, keywords: []}, //contains the data for added keywords\n      deletedKeywordsReport: {reportId: 0, keywords: []}, //contains the data for deleted keywords\n      updatedReportKeywords: {reportId: 0, keywords: []},\n      confirmUnsavedChanges: false\n    };\n  },\n\n  storeDidUpdate() {\n    this.setState(update(this.state, {\n      showReportWelcome: {\n        $set: ModalStore.getState().get('showReportWelcome') && !cookies.get('reports_visited')\n      },\n      showTemplates: {\n        $set: ReportPreferencesStore.getState().get('hideTemplates')\n      },\n      loadingHideTemplates: {\n        $set: ReportPreferencesStore.getState().get('loadingHideTemplates')\n      }\n    }));\n  },\n\n  setSortOrder(value) {\n    this.setState({sortBy: value});\n    cookies.set(this.buildCookieName('sort'), value, { expires: cookieExpires });\n  },\n\n  componentDidMount() {\n    this.fetchReports(this.props.entity);\n    this.positionMainPanel();\n    this.updateDocumentTitle(this.props.entity);\n    this.getTemplatePreferences();\n    window.addEventListener('beforeunload', this.beforeUnload);\n    trackPage('Reporting Classic: Report Index');\n\n    // not interested in realtime changes at this time\n    const ldChangeHandler = () => {};\n\n    const ldIt = ldInitialize(true, gon.launchDarklyKey, ldChangeHandler);\n\n    if (!this.props.session || !this.props.session.toJSON) {\n      return;\n    }\n\n    const ldParams: ILaunchDarklyParams = {\n      session: { ...this.props.session.toJSON(), ...{ entity: this.props.entity.toJSON() } },\n      currentEntityId: this.props.entity.get('subdomain'), // this is the requested Entity\n    };\n\n    ldIt(ldParams).then((client) => {\n      const newReportingEnabled = client.variation('feature-new-reporting', false);\n      this.setState(update(this.state, { newReportingEnabled: { $set: newReportingEnabled } }));\n    });\n  },\n\n  componentWillUnmount() {\n    $(document).off('scroll', this.scrollCallback);\n    window.removeEventListener('beforeunload', this.beforeUnload);\n  },\n\n  statics: {\n    willTransitionFrom(transition, component) {\n      if (component.state.isEditKeywordsMode) {\n        if (!component.confirmUnsavedChanges()) {\n          transition.abort();\n        } else {\n          component.setState({confirmUnsavedChanges: true});\n        }\n      }\n    }\n  },\n\n  beforeUnload(e) {\n    if (this.state.isEditKeywordsMode) {\n      (e || window.event).returnValue = confirmationMessage; //Gecko + IE\n      return confirmationMessage; //Gecko + Webkit, Safari, Chrome etc.\n    }\n  },\n\n  confirmUnsavedChanges() {\n    if (!this.state.confirmUnsavedChanges) {\n      return confirm(confirmationMessage);\n    } else {\n      return true;\n    }\n  },\n\n  updateDocumentTitle(entity) {\n    document.title = entity.getName() + ' / Reports';\n  },\n\n  updateKeywords() {\n    const uniqueKeywords = this.getUniqueKeywords(this.state.reports);\n    const checkedKeywords = _.intersection(uniqueKeywords, this.state.checkedKeywords);\n    const filteredReports = this.performFiltering(this.state.searchInput, this.state.visibility, checkedKeywords);\n    this.setState({keywords: uniqueKeywords,\n                   checkedKeywords,\n                   filteredReports\n                 });\n  },\n\n  fetchReports(entity) {\n    this.setState({loaded: false});\n    this.state.reports = new Reports();\n    this.coas = new Coas();\n\n    async.parallel([\n      (cb) => {\n        this.state.reports.fetch({\n          data: {\n            entity_id: entity.get('entity_id'),\n            embed: 'is_geo_enabled',\n            fields: [\n              //'abilities',\n              'access_code',\n              'coa_id',\n              'coa_mask_id',\n              'created',\n              //'data_sets',\n              'description',\n              'entity',\n              'entity_id',\n              //'extra_files',\n              'hidden',\n              'id',\n              'is_default',\n              'is_geo_enabled',\n              'is_private',\n              'name',\n              'owner',\n              'position',\n              'properties',\n              'report_type',\n              'report_type_name',\n              'updated',\n              'data_updated_at',\n              //'user_abilities',\n              'visibility',\n              'keywords'\n            ].join(',')\n          },\n          success: () => {\n            this.updateKeywords();\n            cb();\n          }\n        });\n      },\n      (cb) => {\n        this.coas.fetch({\n          data: {entity_id: entity.get('entity_id')},\n          success: () => {\n            cb();\n          }\n        });\n      }\n    ], (error) => {\n      if (!error && this._isMounted) {\n        this.setState({\n          loaded: true,\n          coa: this.coas.findWhere({is_default: true}) || this.coas.first()\n        });\n      }\n    });\n  },\n\n  handleMouseLeave() {\n    this.setState({hoveredReport: null});\n  },\n\n  handleMouseEnter(report) {\n    this.setState({hoveredReport: report});\n  },\n\n  toggleLockedReportCreation() {\n    this.setState({lockedReportCreationModal: !this.state.lockedReportCreationModal});\n  }\n});\n\nvar ReportIndexListColumnHeaders = createReactClass<any, any>({\n  render() {\n    if (this.props.reports.length > 0 && this.props.reportViewType == 'list') {\n      return (\n        <div className=\"ui-col-12of12 list-view-header\">\n          <div className=\"ui-col-3of12\">REPORT NAME</div>\n          <div className=\"ui-col-3of12 keywords\">KEYWORDS\n            <ToggleEditSaveKeywords\n              toggleEditKeywordsMode={this.props.toggleEditKeywordsMode}\n              isEditKeywordsMode={this.props.isEditKeywordsMode}\n              userRole={this.props.userRole} />\n          </div>\n          <div className=\"ui-col-2of12\">LAST UPDATED</div>\n          <div className=\"ui-col-2of12\">REPORT OWNER</div>\n          <div className=\"ui-col-2of12\">VISIBILITY</div>\n        </div>\n      );\n    }\n    return null;\n  }\n});\n\nvar ReportTemplateItem = createReactClass<any, any>({\n\n  render() {\n    const template = this.props.template;\n\n    return (\n      <div className=\"ui-col-3of12\">\n        <div className=\"ui-report-card template-card\">\n          <img src={assetPath(template.imageUrl)}/>\n          <div className=\"ui-report-card__details\">\n            <div className=\"ui-row\">\n              <button className=\"ui-button tiny small no-hover\">Template</button>\n              <h5 className=\"template-title\">{template.title}</h5>\n              <div className=\"template-description\">{template.description}</div>\n              <div className=\"ui-report-card__title\">\n                <a className=\"ui-button primary small left\"\n                  target=\"_blank\" href={template.exampleUrl}>View Example</a>\n                <a className=\"ui-button small right\" href={template.downloadUrl}>\n                  <span className=\"icon-download-1\"></span>Template\n                </a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n});\n\nvar ReportTemplateWelcomeItem = createReactClass<any, any>({\n  render() {\n    const canCreateReport = this.props.canCreateReport;\n\n    return (\n      <div className=\"ui-col-3of12\">\n        <div className=\"ui-report-card welcome-card\">\n          <div className=\"title\">\n            Welcome to Reports!\n          </div>\n          {canCreateReport ?\n            <div className=\"paragraph\">\n              This is where the reports you create are stored. Explore these example report templates to see\n              what you can create with OpenGov, then download the template to make your own.\n              When you’re ready to add a report, click on <strong>Create Report</strong> in the upper\n              right hand corner.\n            </div> :\n            <div className=\"paragraph\">\n              This is where your organization's reports are stored.\n              Click on a Report to explore information and create personalized Saved Views.\n            </div>\n          }\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default ReportIndex;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index.tsx","import Backbone from 'backbone';\nimport _ from 'lodash';\nimport moment from 'moment';\n\nexport default Backbone.Model.extend({\n  parse(resp) {\n    return _.extend(resp, {\n      date_created: moment(resp.created).format('MMM D YYYY hh:mm A'),\n      date_updated: moment(resp.updated).format('MMM D YYYY hh:mm A')\n    });\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/chart_of_account.ts","/*!\n * async\n * https://github.com/caolan/async\n *\n * Copyright 2010-2014 Caolan McMahon\n * Released under the MIT license\n */\n/*jshint onevar: false, indent:4 */\n/*global setImmediate: false, setTimeout: false, console: false */\n(function () {\n\n    var async = {};\n\n    // global on the server, window in the browser\n    var root, previous_async;\n\n    root = this;\n    if (root != null) {\n      previous_async = root.async;\n    }\n\n    async.noConflict = function () {\n        root.async = previous_async;\n        return async;\n    };\n\n    function only_once(fn) {\n        var called = false;\n        return function() {\n            if (called) throw new Error(\"Callback was already called.\");\n            called = true;\n            fn.apply(root, arguments);\n        }\n    }\n\n    //// cross-browser compatiblity functions ////\n\n    var _toString = Object.prototype.toString;\n\n    var _isArray = Array.isArray || function (obj) {\n        return _toString.call(obj) === '[object Array]';\n    };\n\n    var _each = function (arr, iterator) {\n        for (var i = 0; i < arr.length; i += 1) {\n            iterator(arr[i], i, arr);\n        }\n    };\n\n    var _map = function (arr, iterator) {\n        if (arr.map) {\n            return arr.map(iterator);\n        }\n        var results = [];\n        _each(arr, function (x, i, a) {\n            results.push(iterator(x, i, a));\n        });\n        return results;\n    };\n\n    var _reduce = function (arr, iterator, memo) {\n        if (arr.reduce) {\n            return arr.reduce(iterator, memo);\n        }\n        _each(arr, function (x, i, a) {\n            memo = iterator(memo, x, i, a);\n        });\n        return memo;\n    };\n\n    var _keys = function (obj) {\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                keys.push(k);\n            }\n        }\n        return keys;\n    };\n\n    //// exported async module functions ////\n\n    //// nextTick implementation with browser-compatible fallback ////\n    if (typeof process === 'undefined' || !(process.nextTick)) {\n        if (typeof setImmediate === 'function') {\n            async.nextTick = function (fn) {\n                // not a direct alias for IE10 compatibility\n                setImmediate(fn);\n            };\n            async.setImmediate = async.nextTick;\n        }\n        else {\n            async.nextTick = function (fn) {\n                setTimeout(fn, 0);\n            };\n            async.setImmediate = async.nextTick;\n        }\n    }\n    else {\n        async.nextTick = process.nextTick;\n        if (typeof setImmediate !== 'undefined') {\n            async.setImmediate = function (fn) {\n              // not a direct alias for IE10 compatibility\n              setImmediate(fn);\n            };\n        }\n        else {\n            async.setImmediate = async.nextTick;\n        }\n    }\n\n    async.each = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        _each(arr, function (x) {\n            iterator(x, only_once(done) );\n        });\n        function done(err) {\n          if (err) {\n              callback(err);\n              callback = function () {};\n          }\n          else {\n              completed += 1;\n              if (completed >= arr.length) {\n                  callback();\n              }\n          }\n        }\n    };\n    async.forEach = async.each;\n\n    async.eachSeries = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        var iterate = function () {\n            iterator(arr[completed], function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed >= arr.length) {\n                        callback();\n                    }\n                    else {\n                        iterate();\n                    }\n                }\n            });\n        };\n        iterate();\n    };\n    async.forEachSeries = async.eachSeries;\n\n    async.eachLimit = function (arr, limit, iterator, callback) {\n        var fn = _eachLimit(limit);\n        fn.apply(null, [arr, iterator, callback]);\n    };\n    async.forEachLimit = async.eachLimit;\n\n    var _eachLimit = function (limit) {\n\n        return function (arr, iterator, callback) {\n            callback = callback || function () {};\n            if (!arr.length || limit <= 0) {\n                return callback();\n            }\n            var completed = 0;\n            var started = 0;\n            var running = 0;\n\n            (function replenish () {\n                if (completed >= arr.length) {\n                    return callback();\n                }\n\n                while (running < limit && started < arr.length) {\n                    started += 1;\n                    running += 1;\n                    iterator(arr[started - 1], function (err) {\n                        if (err) {\n                            callback(err);\n                            callback = function () {};\n                        }\n                        else {\n                            completed += 1;\n                            running -= 1;\n                            if (completed >= arr.length) {\n                                callback();\n                            }\n                            else {\n                                replenish();\n                            }\n                        }\n                    });\n                }\n            })();\n        };\n    };\n\n\n    var doParallel = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.each].concat(args));\n        };\n    };\n    var doParallelLimit = function(limit, fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [_eachLimit(limit)].concat(args));\n        };\n    };\n    var doSeries = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.eachSeries].concat(args));\n        };\n    };\n\n\n    var _asyncMap = function (eachfn, arr, iterator, callback) {\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        if (!callback) {\n            eachfn(arr, function (x, callback) {\n                iterator(x.value, function (err) {\n                    callback(err);\n                });\n            });\n        } else {\n            var results = [];\n            eachfn(arr, function (x, callback) {\n                iterator(x.value, function (err, v) {\n                    results[x.index] = v;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n    async.map = doParallel(_asyncMap);\n    async.mapSeries = doSeries(_asyncMap);\n    async.mapLimit = function (arr, limit, iterator, callback) {\n        return _mapLimit(limit)(arr, iterator, callback);\n    };\n\n    var _mapLimit = function(limit) {\n        return doParallelLimit(limit, _asyncMap);\n    };\n\n    // reduce only has a series version, as doing reduce in parallel won't\n    // work in many situations.\n    async.reduce = function (arr, memo, iterator, callback) {\n        async.eachSeries(arr, function (x, callback) {\n            iterator(memo, x, function (err, v) {\n                memo = v;\n                callback(err);\n            });\n        }, function (err) {\n            callback(err, memo);\n        });\n    };\n    // inject alias\n    async.inject = async.reduce;\n    // foldl alias\n    async.foldl = async.reduce;\n\n    async.reduceRight = function (arr, memo, iterator, callback) {\n        var reversed = _map(arr, function (x) {\n            return x;\n        }).reverse();\n        async.reduce(reversed, memo, iterator, callback);\n    };\n    // foldr alias\n    async.foldr = async.reduceRight;\n\n    var _filter = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.filter = doParallel(_filter);\n    async.filterSeries = doSeries(_filter);\n    // select alias\n    async.select = async.filter;\n    async.selectSeries = async.filterSeries;\n\n    var _reject = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (!v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.reject = doParallel(_reject);\n    async.rejectSeries = doSeries(_reject);\n\n    var _detect = function (eachfn, arr, iterator, main_callback) {\n        eachfn(arr, function (x, callback) {\n            iterator(x, function (result) {\n                if (result) {\n                    main_callback(x);\n                    main_callback = function () {};\n                }\n                else {\n                    callback();\n                }\n            });\n        }, function (err) {\n            main_callback();\n        });\n    };\n    async.detect = doParallel(_detect);\n    async.detectSeries = doSeries(_detect);\n\n    async.some = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (v) {\n                    main_callback(true);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(false);\n        });\n    };\n    // any alias\n    async.any = async.some;\n\n    async.every = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (!v) {\n                    main_callback(false);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(true);\n        });\n    };\n    // all alias\n    async.all = async.every;\n\n    async.sortBy = function (arr, iterator, callback) {\n        async.map(arr, function (x, callback) {\n            iterator(x, function (err, criteria) {\n                if (err) {\n                    callback(err);\n                }\n                else {\n                    callback(null, {value: x, criteria: criteria});\n                }\n            });\n        }, function (err, results) {\n            if (err) {\n                return callback(err);\n            }\n            else {\n                var fn = function (left, right) {\n                    var a = left.criteria, b = right.criteria;\n                    return a < b ? -1 : a > b ? 1 : 0;\n                };\n                callback(null, _map(results.sort(fn), function (x) {\n                    return x.value;\n                }));\n            }\n        });\n    };\n\n    async.auto = function (tasks, callback) {\n        callback = callback || function () {};\n        var keys = _keys(tasks);\n        var remainingTasks = keys.length\n        if (!remainingTasks) {\n            return callback();\n        }\n\n        var results = {};\n\n        var listeners = [];\n        var addListener = function (fn) {\n            listeners.unshift(fn);\n        };\n        var removeListener = function (fn) {\n            for (var i = 0; i < listeners.length; i += 1) {\n                if (listeners[i] === fn) {\n                    listeners.splice(i, 1);\n                    return;\n                }\n            }\n        };\n        var taskComplete = function () {\n            remainingTasks--\n            _each(listeners.slice(0), function (fn) {\n                fn();\n            });\n        };\n\n        addListener(function () {\n            if (!remainingTasks) {\n                var theCallback = callback;\n                // prevent final callback from calling itself if it errors\n                callback = function () {};\n\n                theCallback(null, results);\n            }\n        });\n\n        _each(keys, function (k) {\n            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];\n            var taskCallback = function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (args.length <= 1) {\n                    args = args[0];\n                }\n                if (err) {\n                    var safeResults = {};\n                    _each(_keys(results), function(rkey) {\n                        safeResults[rkey] = results[rkey];\n                    });\n                    safeResults[k] = args;\n                    callback(err, safeResults);\n                    // stop subsequent errors hitting callback multiple times\n                    callback = function () {};\n                }\n                else {\n                    results[k] = args;\n                    async.setImmediate(taskComplete);\n                }\n            };\n            var requires = task.slice(0, Math.abs(task.length - 1)) || [];\n            var ready = function () {\n                return _reduce(requires, function (a, x) {\n                    return (a && results.hasOwnProperty(x));\n                }, true) && !results.hasOwnProperty(k);\n            };\n            if (ready()) {\n                task[task.length - 1](taskCallback, results);\n            }\n            else {\n                var listener = function () {\n                    if (ready()) {\n                        removeListener(listener);\n                        task[task.length - 1](taskCallback, results);\n                    }\n                };\n                addListener(listener);\n            }\n        });\n    };\n\n    async.retry = function(times, task, callback) {\n        var DEFAULT_TIMES = 5;\n        var attempts = [];\n        // Use defaults if times not passed\n        if (typeof times === 'function') {\n            callback = task;\n            task = times;\n            times = DEFAULT_TIMES;\n        }\n        // Make sure times is a number\n        times = parseInt(times, 10) || DEFAULT_TIMES;\n        var wrappedTask = function(wrappedCallback, wrappedResults) {\n            var retryAttempt = function(task, finalAttempt) {\n                return function(seriesCallback) {\n                    task(function(err, result){\n                        seriesCallback(!err || finalAttempt, {err: err, result: result});\n                    }, wrappedResults);\n                };\n            };\n            while (times) {\n                attempts.push(retryAttempt(task, !(times-=1)));\n            }\n            async.series(attempts, function(done, data){\n                data = data[data.length - 1];\n                (wrappedCallback || callback)(data.err, data.result);\n            });\n        }\n        // If a callback is passed, run this as a controll flow\n        return callback ? wrappedTask() : wrappedTask\n    };\n\n    async.waterfall = function (tasks, callback) {\n        callback = callback || function () {};\n        if (!_isArray(tasks)) {\n          var err = new Error('First argument to waterfall must be an array of functions');\n          return callback(err);\n        }\n        if (!tasks.length) {\n            return callback();\n        }\n        var wrapIterator = function (iterator) {\n            return function (err) {\n                if (err) {\n                    callback.apply(null, arguments);\n                    callback = function () {};\n                }\n                else {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    var next = iterator.next();\n                    if (next) {\n                        args.push(wrapIterator(next));\n                    }\n                    else {\n                        args.push(callback);\n                    }\n                    async.setImmediate(function () {\n                        iterator.apply(null, args);\n                    });\n                }\n            };\n        };\n        wrapIterator(async.iterator(tasks))();\n    };\n\n    var _parallel = function(eachfn, tasks, callback) {\n        callback = callback || function () {};\n        if (_isArray(tasks)) {\n            eachfn.map(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            eachfn.each(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.parallel = function (tasks, callback) {\n        _parallel({ map: async.map, each: async.each }, tasks, callback);\n    };\n\n    async.parallelLimit = function(tasks, limit, callback) {\n        _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);\n    };\n\n    async.series = function (tasks, callback) {\n        callback = callback || function () {};\n        if (_isArray(tasks)) {\n            async.mapSeries(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            async.eachSeries(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.iterator = function (tasks) {\n        var makeCallback = function (index) {\n            var fn = function () {\n                if (tasks.length) {\n                    tasks[index].apply(null, arguments);\n                }\n                return fn.next();\n            };\n            fn.next = function () {\n                return (index < tasks.length - 1) ? makeCallback(index + 1): null;\n            };\n            return fn;\n        };\n        return makeCallback(0);\n    };\n\n    async.apply = function (fn) {\n        var args = Array.prototype.slice.call(arguments, 1);\n        return function () {\n            return fn.apply(\n                null, args.concat(Array.prototype.slice.call(arguments))\n            );\n        };\n    };\n\n    var _concat = function (eachfn, arr, fn, callback) {\n        var r = [];\n        eachfn(arr, function (x, cb) {\n            fn(x, function (err, y) {\n                r = r.concat(y || []);\n                cb(err);\n            });\n        }, function (err) {\n            callback(err, r);\n        });\n    };\n    async.concat = doParallel(_concat);\n    async.concatSeries = doSeries(_concat);\n\n    async.whilst = function (test, iterator, callback) {\n        if (test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.whilst(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doWhilst = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            var args = Array.prototype.slice.call(arguments, 1);\n            if (test.apply(null, args)) {\n                async.doWhilst(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.until = function (test, iterator, callback) {\n        if (!test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.until(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doUntil = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            var args = Array.prototype.slice.call(arguments, 1);\n            if (!test.apply(null, args)) {\n                async.doUntil(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.queue = function (worker, concurrency) {\n        if (concurrency === undefined) {\n            concurrency = 1;\n        }\n        function _insert(q, data, pos, callback) {\n          if (!q.started){\n            q.started = true;\n          }\n          if (!_isArray(data)) {\n              data = [data];\n          }\n          if(data.length == 0) {\n             // call drain immediately if there are no tasks\n             return async.setImmediate(function() {\n                 if (q.drain) {\n                     q.drain();\n                 }\n             });\n          }\n          _each(data, function(task) {\n              var item = {\n                  data: task,\n                  callback: typeof callback === 'function' ? callback : null\n              };\n\n              if (pos) {\n                q.tasks.unshift(item);\n              } else {\n                q.tasks.push(item);\n              }\n\n              if (q.saturated && q.tasks.length === q.concurrency) {\n                  q.saturated();\n              }\n              async.setImmediate(q.process);\n          });\n        }\n\n        var workers = 0;\n        var q = {\n            tasks: [],\n            concurrency: concurrency,\n            saturated: null,\n            empty: null,\n            drain: null,\n            started: false,\n            paused: false,\n            push: function (data, callback) {\n              _insert(q, data, false, callback);\n            },\n            kill: function () {\n              q.drain = null;\n              q.tasks = [];\n            },\n            unshift: function (data, callback) {\n              _insert(q, data, true, callback);\n            },\n            process: function () {\n                if (!q.paused && workers < q.concurrency && q.tasks.length) {\n                    var task = q.tasks.shift();\n                    if (q.empty && q.tasks.length === 0) {\n                        q.empty();\n                    }\n                    workers += 1;\n                    var next = function () {\n                        workers -= 1;\n                        if (task.callback) {\n                            task.callback.apply(task, arguments);\n                        }\n                        if (q.drain && q.tasks.length + workers === 0) {\n                            q.drain();\n                        }\n                        q.process();\n                    };\n                    var cb = only_once(next);\n                    worker(task.data, cb);\n                }\n            },\n            length: function () {\n                return q.tasks.length;\n            },\n            running: function () {\n                return workers;\n            },\n            idle: function() {\n                return q.tasks.length + workers === 0;\n            },\n            pause: function () {\n                if (q.paused === true) { return; }\n                q.paused = true;\n            },\n            resume: function () {\n                if (q.paused === false) { return; }\n                q.paused = false;\n                // Need to call q.process once per concurrent\n                // worker to preserve full concurrency after pause\n                for (var w = 1; w <= q.concurrency; w++) {\n                    async.setImmediate(q.process);\n                }\n            }\n        };\n        return q;\n    };\n\n    async.priorityQueue = function (worker, concurrency) {\n\n        function _compareTasks(a, b){\n          return a.priority - b.priority;\n        };\n\n        function _binarySearch(sequence, item, compare) {\n          var beg = -1,\n              end = sequence.length - 1;\n          while (beg < end) {\n            var mid = beg + ((end - beg + 1) >>> 1);\n            if (compare(item, sequence[mid]) >= 0) {\n              beg = mid;\n            } else {\n              end = mid - 1;\n            }\n          }\n          return beg;\n        }\n\n        function _insert(q, data, priority, callback) {\n          if (!q.started){\n            q.started = true;\n          }\n          if (!_isArray(data)) {\n              data = [data];\n          }\n          if(data.length == 0) {\n             // call drain immediately if there are no tasks\n             return async.setImmediate(function() {\n                 if (q.drain) {\n                     q.drain();\n                 }\n             });\n          }\n          _each(data, function(task) {\n              var item = {\n                  data: task,\n                  priority: priority,\n                  callback: typeof callback === 'function' ? callback : null\n              };\n\n              q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);\n\n              if (q.saturated && q.tasks.length === q.concurrency) {\n                  q.saturated();\n              }\n              async.setImmediate(q.process);\n          });\n        }\n\n        // Start with a normal queue\n        var q = async.queue(worker, concurrency);\n\n        // Override push to accept second parameter representing priority\n        q.push = function (data, priority, callback) {\n          _insert(q, data, priority, callback);\n        };\n\n        // Remove unshift function\n        delete q.unshift;\n\n        return q;\n    };\n\n    async.cargo = function (worker, payload) {\n        var working     = false,\n            tasks       = [];\n\n        var cargo = {\n            tasks: tasks,\n            payload: payload,\n            saturated: null,\n            empty: null,\n            drain: null,\n            drained: true,\n            push: function (data, callback) {\n                if (!_isArray(data)) {\n                    data = [data];\n                }\n                _each(data, function(task) {\n                    tasks.push({\n                        data: task,\n                        callback: typeof callback === 'function' ? callback : null\n                    });\n                    cargo.drained = false;\n                    if (cargo.saturated && tasks.length === payload) {\n                        cargo.saturated();\n                    }\n                });\n                async.setImmediate(cargo.process);\n            },\n            process: function process() {\n                if (working) return;\n                if (tasks.length === 0) {\n                    if(cargo.drain && !cargo.drained) cargo.drain();\n                    cargo.drained = true;\n                    return;\n                }\n\n                var ts = typeof payload === 'number'\n                            ? tasks.splice(0, payload)\n                            : tasks.splice(0, tasks.length);\n\n                var ds = _map(ts, function (task) {\n                    return task.data;\n                });\n\n                if(cargo.empty) cargo.empty();\n                working = true;\n                worker(ds, function () {\n                    working = false;\n\n                    var args = arguments;\n                    _each(ts, function (data) {\n                        if (data.callback) {\n                            data.callback.apply(null, args);\n                        }\n                    });\n\n                    process();\n                });\n            },\n            length: function () {\n                return tasks.length;\n            },\n            running: function () {\n                return working;\n            }\n        };\n        return cargo;\n    };\n\n    var _console_fn = function (name) {\n        return function (fn) {\n            var args = Array.prototype.slice.call(arguments, 1);\n            fn.apply(null, args.concat([function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (typeof console !== 'undefined') {\n                    if (err) {\n                        if (console.error) {\n                            console.error(err);\n                        }\n                    }\n                    else if (console[name]) {\n                        _each(args, function (x) {\n                            console[name](x);\n                        });\n                    }\n                }\n            }]));\n        };\n    };\n    async.log = _console_fn('log');\n    async.dir = _console_fn('dir');\n    /*async.info = _console_fn('info');\n    async.warn = _console_fn('warn');\n    async.error = _console_fn('error');*/\n\n    async.memoize = function (fn, hasher) {\n        var memo = {};\n        var queues = {};\n        hasher = hasher || function (x) {\n            return x;\n        };\n        var memoized = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            var key = hasher.apply(null, args);\n            if (key in memo) {\n                async.nextTick(function () {\n                    callback.apply(null, memo[key]);\n                });\n            }\n            else if (key in queues) {\n                queues[key].push(callback);\n            }\n            else {\n                queues[key] = [callback];\n                fn.apply(null, args.concat([function () {\n                    memo[key] = arguments;\n                    var q = queues[key];\n                    delete queues[key];\n                    for (var i = 0, l = q.length; i < l; i++) {\n                      q[i].apply(null, arguments);\n                    }\n                }]));\n            }\n        };\n        memoized.memo = memo;\n        memoized.unmemoized = fn;\n        return memoized;\n    };\n\n    async.unmemoize = function (fn) {\n      return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n      };\n    };\n\n    async.times = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.map(counter, iterator, callback);\n    };\n\n    async.timesSeries = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.mapSeries(counter, iterator, callback);\n    };\n\n    async.seq = function (/* functions... */) {\n        var fns = arguments;\n        return function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            async.reduce(fns, args, function (newargs, fn, cb) {\n                fn.apply(that, newargs.concat([function () {\n                    var err = arguments[0];\n                    var nextargs = Array.prototype.slice.call(arguments, 1);\n                    cb(err, nextargs);\n                }]))\n            },\n            function (err, results) {\n                callback.apply(that, [err].concat(results));\n            });\n        };\n    };\n\n    async.compose = function (/* functions... */) {\n      return async.seq.apply(null, Array.prototype.reverse.call(arguments));\n    };\n\n    var _applyEach = function (eachfn, fns /*args...*/) {\n        var go = function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            return eachfn(fns, function (fn, cb) {\n                fn.apply(that, args.concat([cb]));\n            },\n            callback);\n        };\n        if (arguments.length > 2) {\n            var args = Array.prototype.slice.call(arguments, 2);\n            return go.apply(this, args);\n        }\n        else {\n            return go;\n        }\n    };\n    async.applyEach = doParallel(_applyEach);\n    async.applyEachSeries = doSeries(_applyEach);\n\n    async.forever = function (fn, callback) {\n        function next(err) {\n            if (err) {\n                if (callback) {\n                    return callback(err);\n                }\n                throw err;\n            }\n            fn(next);\n        }\n        next();\n    };\n\n    // Node.js\n    if (typeof module !== 'undefined' && module.exports) {\n        module.exports = async;\n    }\n    // AMD / RequireJS\n    else if (typeof define !== 'undefined' && define.amd) {\n        define([], function () {\n            return async;\n        });\n    }\n    // included directly via <script> tag\n    else {\n        root.async = async;\n    }\n\n}());\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/async/lib/async.js\n// module id = 827\n// module chunks = 0 1","(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/setimmediate/setImmediate.js\n// module id = 828\n// module chunks = 0 1","import { Dispatcher } from '@opengov/og_flux';\nimport api from '@opengov/og_api';\nimport request from 'superagent';\n\nconst ReportPreferencesActions = {\n\n  hideTemplates(userId, value) {\n    Dispatcher.handleViewAction({\n      actionType: 'HIDE_TEMPLATES',\n      value\n    });\n\n    const reports_preferences = {\n      collapsed_preview_templates: value\n    };\n    userId && api\n      .put(`users/${userId}/application_preferences`, {\n        reports_preferences\n      }).end();\n  },\n\n  getTemplatePreferences(userId) {\n    if (userId) {\n      api\n        .get(`users/${userId}/application_preferences`).end()\n        .then((response) => {\n          Dispatcher.handleViewAction({\n            actionType: 'HIDE_TEMPLATES',\n            value: response.body.reports_preferences && response.body.reports_preferences.collapsed_preview_templates\n          });\n        })\n        .catch(() => {\n          Dispatcher.handleViewAction({\n            actionType: 'HIDE_TEMPLATES',\n            value: false\n          });\n        });\n    } else {\n      Dispatcher.handleViewAction({\n        actionType: 'HIDE_TEMPLATES',\n        value: false\n      });\n    }\n  },\n\n  updateKeywords(reportId, keywords) {\n    request.post(`api/v3/reports/${reportId}/keywords`, {\n      keywords\n    }).end();\n  },\n\n  deleteKeywords(reportId, keywords) {\n    const deleteKeywords = keywords.map((keyword) => {\n      return 'keywords[]=' + encodeURIComponent(keyword);\n    });\n    const deleteKeywordParams = deleteKeywords.join('&');\n\n    request.del(`api/v3/reports/${reportId}/keywords/destroy_multiple?${deleteKeywordParams}`).end();\n  }\n\n};\n\nexport default ReportPreferencesActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/report_preferences_actions.ts","var request = require('superagent');\nvar Promise = require('bluebird');\nvar uuid = require('simply-uuid');\nvar _ = require('lodash');\n\nclass OgApi {\n  constructor(url) {\n    if (!url) {\n      throw new Error('OgApi requires a url');\n    }\n\n    this._apiUrl = url;\n    this._middleware = [];\n  }\n\n  get(...args) {\n    return this._request('get', args);\n  }\n\n  post(...args) {\n    return this._request('post', args);\n  }\n\n  put(...args) {\n    return this._request('put', args);\n  }\n\n  del(...args) {\n    return this._request('del', args);\n  }\n\n  use(middleware) {\n    this._middleware.push(middleware);\n    return this;\n  }\n\n  _request(method, args) {\n    var lastIndex = args.length;\n    var data;\n    var callback;\n\n    function lastArgument() {\n      return lastIndex ? args[lastIndex - 1] : null;\n    }\n\n    function popArgument() {\n      var arg = lastArgument();\n      if (lastIndex) {\n        lastIndex -= 1;\n      }\n      return arg;\n    }\n\n    if (_.isFunction(lastArgument())) {\n      callback = popArgument();\n    }\n\n    if (_.isObject(lastArgument())) {\n      data = popArgument();\n    }\n\n    var url = this._apiUrl;\n\n    if (lastIndex) {\n      url += '/' + args.slice(0, lastIndex).join('/');\n    }\n\n    var req = request[method](url)\n      .set('Accept', 'application/json')\n      .set('X-REQUEST-ID', uuid.generate());\n\n    req.use((context) => {\n      this._middleware.forEach((middleware) => {\n        if (_.isFunction(middleware)) {\n          middleware(context);\n        }\n      });\n    });\n\n    if (data) {\n      switch (method) {\n      case 'get':\n      case 'del':\n        req.query(data);\n        break;\n      case 'post':\n      case 'put':\n        req.send(data);\n        break;\n      default:\n        throw new Error('OgApi: Unsupported HTTP request method: ' + method);\n      }\n    }\n\n    /**\n     * returns a promise that is rejected on socket errors and responses\n     * that have a 4xx or 5xx status code\n     *\n     * @param cb\n     */\n    var createPromise = (cb) => {\n      return new Promise((resolve, reject) => {\n        cb((requestError, requestResponse) => {\n          if (requestError) {\n            reject({requestError, requestResponse});\n          } else {\n            resolve(requestResponse);\n          }\n        });\n      });\n    };\n\n\n    if (callback) {\n      return req.end(callback);\n    }\n\n    var end = req.end.bind(req);\n    req.end = (cb) => {\n      return cb ? end(cb) : createPromise(end);\n    };\n    return req;\n  }\n}\n\nmodule.exports = OgApi;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/og_api/lib/og_api.js","\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/superagent/node_modules/component-emitter/index.js\n// module id = 831\n// module chunks = 0 1","\n/**\n * Reduce `arr` with `fn`.\n *\n * @param {Array} arr\n * @param {Function} fn\n * @param {Mixed} initial\n *\n * TODO: combatible error handling?\n */\n\nmodule.exports = function(arr, fn, initial){  \n  var idx = 0;\n  var len = arr.length;\n  var curr = arguments.length == 3\n    ? initial\n    : arr[idx++];\n\n  while (idx < len) {\n    curr = fn.call(null, curr, arr[idx], ++idx, arr);\n  }\n  \n  return curr;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/reduce-component/index.js\n// module id = 832\n// module chunks = 0 1","'use strict';\n\nexports = module.exports;\n\n/**\n * Generates a UUID\n * @returns {string}\n */\nexports.generate = function () {\n  var lut = [];\n  for(var i = 0; i < 256; i++) {\n    lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n  }\n\n  var d0 = Math.random() * 0xffffffff | 0;\n  var d1 = Math.random() * 0xffffffff | 0;\n  var d2 = Math.random() * 0xffffffff | 0;\n  var d3 = Math.random() * 0xffffffff | 0;\n\n  return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +\n    lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +\n    lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n    lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/simply-uuid/lib/uuid-node.js\n// module id = 833\n// module chunks = 0 1","/**\n * Hijacks request.prototype.end to enabled request retries.\n * intervalFunction will default to exponential back-off.\n *\n * usage:\n * middleware(maxAttempts, intervalFunction, retryCondition)\n * middleware(maxAttempts, intervalFunction)\n * middleware(maxAttempts);\n * middleware()\n *\n * @param [maxAttempts=3]\n * @param [intervalFunction]\n * @param [retryCondition]\n * @returns {Function}\n */\nvar middleware = function(maxAttempts, intervalFunction, retryCondition) {\n  maxAttempts = maxAttempts || 3;\n\n  return (context) => {\n    var interval;\n    var request = {};\n    var attempts = 0;\n\n    /**\n     * exponentially increases the interval between retries\n     *\n     * @param currentAttempts\n     * @returns {number}\n     */\n    var exponential = function(currentAttempts) {\n      return Math.pow(2, currentAttempts) * 1000;\n    };\n\n    var nextInterval = intervalFunction || exponential;\n\n    /**\n     * Makes another request using the original request function\n     *\n     * @private\n     */\n    var tick = function() {\n\n      if (doRetry()) {\n\n        attempts += 1;\n        request.context.url = request.url;\n\n        request.end((error, response) => {\n          request.response = response;\n          request.error = error;\n\n          if ((response && response.ok) || !doRetry()) {\n            complete();\n          }\n\n        });\n\n      } else {\n        complete();\n      }\n\n    };\n\n    /**\n     * Prevents future attempts and invokes the callback\n     * from the original request\n     *\n     * @private\n     */\n    var complete = function() {\n\n      request.callback.call(\n        request.context,\n        request.error,\n        request.response\n      );\n\n      clearTimeout(interval);\n\n    };\n\n    /**\n     * Determines if a retry should be done, attempts to use the retryCondition\n     * supplied on initialization.\n     *\n     * @private\n     * @returns {boolean}\n     */\n    var doRetry = function() {\n\n      var attemptsRemaining = attempts < maxAttempts;\n\n      if (retryCondition) {\n        return attemptsRemaining && retryCondition(request);\n      }\n\n      var isSocketError = !request.response;\n      var isPost = request.context.method === 'POST';\n      var isServerError = request.response && request.response.serverError;\n      var isClientError = request.response && request.response.status === 429;\n\n      return attemptsRemaining && !isPost && (isSocketError || isServerError || isClientError);\n\n    };\n\n    var end = context.end.bind(context);\n    var url = context.url;\n\n    context.end = function(callback) {\n\n      end((error, response) => {\n\n        request = {\n          url: url,\n          end: end,\n          error: error,\n          context: context,\n          callback: callback,\n          response: response\n        };\n\n        if (response && response.ok) {\n          return complete();\n        }\n\n        var initTick = () => {\n          interval = setTimeout(initTick, nextInterval(attempts));\n          tick();\n        };\n\n        initTick();\n\n      });\n\n      return context;\n\n    };\n  };\n};\n\nmodule.exports = middleware;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/og_api/lib/retry_middleware.js","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar TreeView = (function (_React$PureComponent) {\n  _inherits(TreeView, _React$PureComponent);\n\n  function TreeView(props) {\n    _classCallCheck(this, TreeView);\n\n    _get(Object.getPrototypeOf(TreeView.prototype), 'constructor', this).call(this, props);\n\n    this.state = {\n      collapsed: props.defaultCollapsed\n    };\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  _createClass(TreeView, [{\n    key: 'handleClick',\n    value: function handleClick() {\n      this.setState({ collapsed: !this.state.collapsed });\n      if (this.props.onClick) {\n        var _props;\n\n        (_props = this.props).onClick.apply(_props, arguments);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props;\n      var _props2$collapsed = _props2.collapsed;\n      var collapsed = _props2$collapsed === undefined ? this.state.collapsed : _props2$collapsed;\n      var _props2$className = _props2.className;\n      var className = _props2$className === undefined ? '' : _props2$className;\n      var _props2$itemClassName = _props2.itemClassName;\n      var itemClassName = _props2$itemClassName === undefined ? '' : _props2$itemClassName;\n      var _props2$treeViewClassName = _props2.treeViewClassName;\n      var treeViewClassName = _props2$treeViewClassName === undefined ? '' : _props2$treeViewClassName;\n      var _props2$childrenClassName = _props2.childrenClassName;\n      var childrenClassName = _props2$childrenClassName === undefined ? '' : _props2$childrenClassName;\n      var nodeLabel = _props2.nodeLabel;\n      var children = _props2.children;\n      var defaultCollapsed = _props2.defaultCollapsed;\n\n      var rest = _objectWithoutProperties(_props2, ['collapsed', 'className', 'itemClassName', 'treeViewClassName', 'childrenClassName', 'nodeLabel', 'children', 'defaultCollapsed']);\n\n      var arrowClassName = 'tree-view_arrow';\n      var containerClassName = 'tree-view_children';\n      if (collapsed) {\n        arrowClassName += ' tree-view_arrow-collapsed';\n        containerClassName += ' tree-view_children-collapsed';\n      }\n\n      var arrow = _react2['default'].createElement('div', _extends({}, rest, {\n        className: className + ' ' + arrowClassName,\n        onClick: this.handleClick\n      }));\n\n      return _react2['default'].createElement(\n        'div',\n        { className: 'tree-view ' + treeViewClassName },\n        _react2['default'].createElement(\n          'div',\n          { className: 'tree-view_item ' + itemClassName },\n          arrow,\n          nodeLabel\n        ),\n        _react2['default'].createElement(\n          'div',\n          { className: containerClassName + ' ' + childrenClassName },\n          collapsed ? null : children\n        )\n      );\n    }\n  }]);\n\n  return TreeView;\n})(_react2['default'].PureComponent);\n\nexports['default'] = TreeView;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-treeview/lib/react-treeview.js\n// module id = 835\n// module chunks = 0 1","import React from 'react';\nimport _ from 'lodash';\n\nimport createReactClass from 'create-react-class';\n\nconst IconBlock = createReactClass<any, any>({\n  render() {\n    return (\n      <span>\n        <span className=\"locked-feature__graphic icon-graphtype-line-1\"/>\n        <span className=\"locked-feature__graphic icon-px-balance-1\"/>\n        <span className=\"locked-feature__graphic icon-graphtype-stacked-bar\"/>\n        <span className=\"locked-feature__graphic icon-graphtype-pie\"/>\n        <span className=\"locked-feature__graphic icon-graphtype-stacked\"/>\n        <span className=\"locked-feature__graphic icon-table-1\"/>\n      </span>\n    );\n  }\n});\n\nconst LockedReportCreationModal = createReactClass<any, any>({\n  getInitialState() {\n    return {\n      interest: false\n    };\n  },\n\n  handleInterest() {\n    this.setState({interest: true});\n  },\n\n  render() {\n    return (\n      <div className=\"ui-modal__wrapper\">\n        <div className=\"ui-modal locked-feature__modal\">\n          <div className=\"locked-feature__graphics__wrapper\">\n            <h2>Create a New Report</h2>\n            <div className=\"locked-feature__graphics\">\n              {_.times(20, function(i) {\n                return (\n                  <IconBlock key={i}/>\n                );\n              })}\n            </div>\n          </div>\n          {!this.state.interest ?\n            <div className=\"ui-modal__content\">\n              <p>\n                This feature enables you to create new reports with your financial data. For example, the City of Sausalito recently used this feature to create their Treasurer’s Report.&nbsp;\n                <strong>\n                  <a href=\"https://controlpanel.opengov.com/network/reports#/sausalitoca/1209/breakdown=types&amp;accountType=assets&amp;graph=pie&amp;selection=05C54EA43974269FEC39797745B31713&amp;legendSort=desc&amp;saved_view=null&amp;selectedDataSetIndex=11&amp;fiscal_start=earliest&amp;fiscal_end=latest\" target=\"_blank\">\n                    View the Sausalito Treasurer’s Report\n                  </a>\n                </strong>\n              </p>\n              <p>You can use this feature to create any financial report, including your long-term financial plan, balance sheets, and many others. Ready to create a new report?</p>\n            </div>\n          : <div className=\"ui-modal__content\">\n              <h3>Great, thanks for your interest!</h3>\n              <p>Please contact your internal OpenGov administrator to receive access.</p>\n            </div>}\n          <footer className=\"ui-modal__footer\">\n            {!this.state.interest ?\n              <div className=\"ui-modal__actions\">\n                <button\n                  className=\"ui-button\"\n                  onClick={this.props.closeModal}>\n                  No, thanks\n                </button>\n                <button\n                  id=\"click_locked_report\"\n                  className=\"ui-button primary\"\n                  onClick={this.handleInterest}>\n                  Yes, tell me more!\n                </button>\n              </div>\n            : <div className=\"ui-modal__actions\">\n                <button\n                  className=\"ui-button primary\"\n                  onClick={this.props.closeModal}>\n                  Okay\n                </button>\n              </div>}\n          </footer>\n        </div>\n        <div className=\"ui-modal__background\"/>\n      </div>\n    );\n  }\n});\n\nexport default LockedReportCreationModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/locked_report_creation_modal.tsx","import React from 'react';\n\nconst creatReportButtonText = 'Create New Report';\n\nconst CreateNewReportButton: React.SFC<any> = ({\n  canCreateReport,\n  onClick,\n  newReportHref\n}) => {\n  return canCreateReport ?\n    <a href={newReportHref} className=\"ui-button primary\">{creatReportButtonText}</a>\n  : <a className=\"ui-button icon-lock-1\" onClick={onClick}>&nbsp;{creatReportButtonText}</a>\n};\n\nexport default CreateNewReportButton;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/create_new_report_button.tsx","import React, { CSSProperties } from 'react';\n\n// Redirect to auth url to trigger login.\nconst authCallbackURI = 'https://opengov.civicdashboards.com/auth/opengov/callback';\n\nconst styles = {\n  buttonStyle: {\n    position: 'relative',\n    marginRight: 10,\n    border: 'none',\n    boxShadow: 'none',\n    background: 'none',\n  } as CSSProperties,\n  svgStyle: {\n    marginBottom: '-0.1678em',\n    marginLeft: 2,\n  } as CSSProperties,\n  svgPathStyle: {\n    fill: 'currentColor',\n    opacity: 0.42\n  } as CSSProperties,\n};\n\nconst LinkToCivicDashboardsButton = () => (\n  <a href={`${authCallbackURI}`} className=\"ui-button default civic-dashboards-link\"\n    style={styles.buttonStyle}\n    target=\"blank\"\n    id=\"civicdashboards-link\"\n  >\n    Performance Dashboards\n    <svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlnsXlink=\"http://www.w3.org/1999/xlink\" xmlSpace=\"preserve\"\n      viewBox=\"0 0 100 125\" x=\"0px\" y=\"0px\"\n      height=\"15px\" width=\"15px\"\n      style={styles.svgStyle}>\n      <g>\n        <path style={styles.svgPathStyle}\n        d=\"M90.5,15H61.8c-2.3,0-4.2,1.9-4.2,4.2s1.9,4.2,4.2,4.2h19.1L40,64.2c-1.6,1.6-1.6,4.3,0,5.9c0.8,0.8,1.9,1.2,2.9,1.2s2.1-0.4,2.9-1.2l40.4-40.4v18.2c0,2.3,1.9,4.2,4.2,4.2s4.2-1.9,4.2-4.2V19.2C94.6,16.9,92.8,15,90.5,15z\"/>\n        <path style={styles.svgPathStyle} d=\"M76.1,57c-2.3,0-4.2,1.9-4.2,4.2V94c0,1.5-1.3,2.8-2.8,2.8H16c-1.5,0-2.8-1.3-2.8-2.8V40.9c0-1.5,1.3-2.8,2.8-2.8h33c2.3,0,4.2-1.9,4.2-4.2c0-2.3-1.9-4.2-4.2-4.2H16c-6.1,0-11.1,5-11.1,11.1V94c0,6.1,5,11.1,11.1,11.1h53.1c6.1,0,11.1-5,11.1-11.1V61.1C80.2,58.8,78.4,57,76.1,57z\"/>\n      </g>\n    </svg>\n  </a>\n);\n\nexport default LinkToCivicDashboardsButton;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/link_to_civicdashboards_button.tsx","import { ImmutableStore } from '@opengov/og_flux';\nimport Immutable, { fromJS } from 'immutable';\n\nconst initialPreferencesState = Immutable.fromJS({\n  hideTemplates: null,\n  loadingHideTemplates: true\n});\n\nconst ReportPreferencesStore = new ImmutableStore({\n  getInitialState() {\n    return initialPreferencesState;\n  },\n\n  actions: {\n    HIDE_TEMPLATES(state, action) {\n      return state.mergeDeep(fromJS({\n        hideTemplates: action.value,\n        loadingHideTemplates: false\n      }));\n    }\n  }\n});\n\nexport default ReportPreferencesStore;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/report_preferences_store.ts","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReportActions from '../actions/report_actions';\nimport CookieHelper from '../cookie_helper';\nimport {assetPath} from '../asset_helpers';\n\nimport createReactClass from 'create-react-class';\n\nlet ReportWelcome = createReactClass<any, any>({\n  propTypes: {\n    entityName: PropTypes.string,\n    entityDisplayName: PropTypes.string,\n    userRole: PropTypes.string\n  },\n\n  _hideModal() {\n    CookieHelper.setVisitedCookie('reports_visited');\n    ReportActions.hideReportWelcomeModal();\n  },\n\n  _includesAdmin(userRole) {\n    return userRole.indexOf('admin') > -1;\n  },\n\n  render() {\n\n    const entityAdminContent = (\n      <div>\n        <div className=\"ui-row\">\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/share.svg')} className=\"welcome_row_image\"/>\n            Consolidate accounting and performance data\n          </div>\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/multi-report.svg')} className=\"welcome_row_image\"/>\n            Create and share interactive reports\n          </div>\n        </div>\n        <div className=\"ui-row\">\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/visualize.svg')} className=\"welcome_row_image\"/>\n            Explore data and gain meaningful insights\n          </div>\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/report.svg')} className=\"welcome_row_image\"/>\n            Compare yourself to other governments\n          </div>\n        </div>\n      </div>\n    );\n\n    const entityUserContent = (\n      <div>\n        <div className=\"ui-row\">\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/multi-report.svg')} className=\"welcome_row_image\"/>\n            Review your current operating results\n          </div>\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/report.svg')} className=\"welcome_row_image\"/>\n            Compare yourself to other governments\n          </div>\n        </div>\n        <div className=\"ui-row\">\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/table.svg')} className=\"welcome_row_image\"/>\n            Research historical budgets and actuals\n          </div>\n          <div className=\"ui-col-3of6\">\n            <img src={assetPath('images/modal/checks.svg')} className=\"welcome_row_image\"/>\n            Explore vendor and check details\n          </div>\n        </div>\n      </div>\n    );\n\n    return (\n      <div className=\"ui-modal__wrapper modal_report_welcome open\" id=\"overlay-modal_welcome\">\n        <div className=\"ui-modal wide\">\n          <div className=\"ui-modal__content\">\n            <div className=\"welcome_report_sidebar\">\n              <img src={assetPath('images/modal/og-logo-01.svg')} className=\"welcome_sidebar_logo\"/>\n            </div>\n            <div className=\"welcome_report_content\">\n              <p className=\"welcome_report_city_title\">{this.props.entityDisplayName.toUpperCase()}</p>\n              <p className=\"welcome_report_title\">\n                <b>Welcome to OpenGov,</b> {`${this.props.entityDisplayName}'s`} platform for analyzing, sharing, and comparing\n                financial and performance data.\n              </p>\n              {this._includesAdmin(this.props.userRole) ? entityAdminContent : entityUserContent}\n              <div className=\"welcome_report_action\">\n                <button className=\"ui-button primary\" onClick={this._hideModal}>\n                  Get Started<i className=\"icon-righthead-3\"></i>\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div className=\"ui-modal__background\" onClick={this._hideModal}></div>\n      </div>\n    );\n  }\n});\n\nexport default ReportWelcome;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/report_welcome_modal.tsx","\"use strict\";\n\nmodule.exports = {\n  initialize: function initialize() {\n    /* jshint ignore:start */\n    (function (i, s, o, g, r, a, m) {\n      i['GoogleAnalyticsObject'] = r;\n      i[r] = i[r] || function () {\n        (i[r].q = i[r].q || []).push(arguments);\n      }, i[r].l = 1 * new Date();\n      a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n      a.async = 1;\n      a.src = g;\n      m.parentNode.insertBefore(a, m);\n    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\n    /* jshint ignore:end */\n  },\n\n  ga: function ga() {\n    window.ga.apply(window, arguments);\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/lib/ga.js\n// module id = 841\n// module chunks = 0 1","\"use strict\";\n\nexports.initialize = function (projectId) {\n  /* jshint ignore:start */\n  window.heap = window.heap || [], heap.load = function (e, t) {\n    window.heap.appid = e, window.heap.config = t = t || {};var r = t.forceSSL || \"https:\" === document.location.protocol,\n        a = document.createElement(\"script\");a.type = \"text/javascript\", a.async = !0, a.src = (r ? \"https:\" : \"http:\") + \"//cdn.heapanalytics.com/js/heap-\" + e + \".js\";var n = document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(a, n);for (var o = function o(e) {\n      return function () {\n        heap.push([e].concat(Array.prototype.slice.call(arguments, 0)));\n      };\n    }, p = [\"addEventProperties\", \"addUserProperties\", \"clearEventProperties\", \"identify\", \"removeEventProperty\", \"setEventProperties\", \"track\", \"unsetEventProperty\"], c = 0; c < p.length; c++) {\n      heap[p[c]] = o(p[c]);\n    }\n  };\n\n  heap.load(projectId);\n  /* jshint ignore:end */\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/lib/heap.js\n// module id = 842\n// module chunks = 0 1","\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar isObjectTypeTag = function isObjectTypeTag(value, tag) {\n  return (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' || false) && Object.prototype.toString.call(value) == tag;\n};\n\nmodule.exports = {\n\n  isNull: function isNull(value) {\n    return value === null;\n  },\n\n  isArray: function isArray(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === '[object Array]';\n  },\n\n  isNumber: function isNumber(value) {\n    return typeof value == 'number' || isObjectTypeTag(value, '[object Number]') || false;\n  },\n\n  isString: function isString(value) {\n    return typeof value == 'string' || isObjectTypeTag(value, '[object String]') || false;\n  },\n\n  isObject: function isObject(value) {\n    return typeof value == 'function' || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object' || false;\n  },\n\n  isBoolean: function isBoolean(value) {\n    return value === true || value === false || isObjectTypeTag(value, '[object Boolean]') || false;\n  },\n\n  isUndefined: function isUndefined(value) {\n    return typeof value == 'undefined';\n  }\n\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/lib/type.js\n// module id = 843\n// module chunks = 0 1","/*! Raven.js 1.3.0 (768fdca) | github.com/getsentry/raven-js */\n\n/*\n * Includes TraceKit\n * https://github.com/getsentry/TraceKit\n *\n * Copyright 2015 Matt Robenolt and other contributors\n * Released under the BSD license\n * https://github.com/getsentry/raven-js/blob/master/LICENSE\n *\n */\n;(function(window, undefined){\n'use strict';\n\n/*\n TraceKit - Cross brower stack traces - github.com/occ/TraceKit\n MIT license\n*/\n\nvar TraceKit = {\n    remoteFetching: false,\n    collectWindowErrors: true,\n    // 3 lines before, the offending line, 3 lines after\n    linesOfContext: 7,\n    debug: false\n};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n\nfunction getLocationHref() {\n    if (typeof document === 'undefined')\n        return '';\n\n    return document.location.href;\n};\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *              on top frame; column number is not guaranteed\n *   - Opera:   full stack trace with line and column numbers\n *   - Chrome:  full stack trace with line and column numbers\n *   - Safari:  line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *   - IE:      line and column number for the top frame only; some frames\n *              may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Remove all crash handlers.\n     */\n    function unsubscribeAll() {\n        uninstallGlobalHandler();\n        handlers = [];\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {Object.<string, *>} stack\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (hasKey(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error\n     * occurred.\n     * @param {?(number|string)} colNo The column number at which the error\n     * occurred.\n     * @param {?Error} ex The actual Error object.\n     */\n    function traceKitWindowOnError(message, url, lineNo, colNo, ex) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n            processLastException();\n        } else if (ex) {\n            // New chrome and blink send along a real error object\n            // Let's just report that like a normal error.\n            // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n            stack = TraceKit.computeStackTrace(ex);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n                'url': url,\n                'line': lineNo,\n                'column': colNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n                'message': message,\n                'url': getLocationHref(),\n                'stack': [location]\n            };\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    function installGlobalHandler ()\n    {\n        if (_onErrorHandlerInstalled) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    function uninstallGlobalHandler ()\n    {\n        if (!_onErrorHandlerInstalled) {\n            return;\n        }\n        window.onerror = _oldOnerrorHandler;\n        _onErrorHandlerInstalled = false;\n        _oldOnerrorHandler = undefined;\n    }\n\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @param {?boolean} rethrow If false, do not re-throw the exception.\n     * Only used for window.onerror to not cause an infinite loop of\n     * rethrowing.\n     */\n    function report(ex, rethrow) {\n        var args = _slice.call(arguments, 1);\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = args;\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        if (rethrow !== false) {\n            throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n        }\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    report.uninstall = unsubscribeAll;\n    return report;\n}());\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n *   s.name              - exception name\n *   s.message           - exception message\n *   s.stack[i].url      - JavaScript or HTML file URL\n *   s.stack[i].func     - function name, or empty for anonymous functions (if guessing did not work)\n *   s.stack[i].args     - arguments passed to the function, if known\n *   s.stack[i].line     - line number, if known\n *   s.stack[i].column   - column number, if known\n *   s.stack[i].context  - an array of source code lines; the middle element corresponds to the correct line#\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     */\n    function getSource(url) {\n        if (!isString(url)) return [];\n        if (!hasKey(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            var source = '';\n            var domain = '';\n            try { domain = document.domain; } catch (e) {}\n            if (url.indexOf(domain) !== -1) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     */\n    function findSourceByFunctionBody(func) {\n        if (typeof document === 'undefined')\n            return;\n\n        var urls = [window.location.href],\n            scripts = document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (isUndefined(ex.stack) || !ex.stack) return;\n\n        var chrome = /^\\s*at (.*?) ?\\(?((?:(?:file|https?|chrome-extension):.*?)|<anonymous>):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?@((?:file|https?|chrome).*?):(\\d+)(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|http|https):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : '',\n                    'line': +parts[4],\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else if ((parts = chrome.exec(lines[i]))) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = winjs.exec(lines[i]))) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10 uses this property.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (isUndefined(ex.stacktrace) || !ex.stacktrace) return;\n\n        var testRE = / line (\\d+), column (\\d+) in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\) in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var i = 0, j = lines.length; i < j; i += 2) {\n            if ((parts = testRE.exec(lines[i]))) {\n                var element = {\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : [],\n                    'url': parts[6]\n                };\n\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[i + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack information.\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = document.getElementsByTagName('script'),\n            inlineScriptBlocks = [],\n            parts,\n            i,\n            len,\n            source;\n\n        for (i in scripts) {\n            if (hasKey(scripts, i) && !scripts[i].src) {\n                inlineScriptBlocks.push(scripts[i]);\n            }\n        }\n\n        for (i = 2, len = lines.length; i < len; i += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[i]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'line': +parts[1]\n                };\n            } else if ((parts = lineRE2.exec(lines[i]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4]\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[i]))) {\n                var url = window.location.href.replace(/#.*$/, ''),\n                    line = parts[1];\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i + 1]));\n                source = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'line': source ? source.line : line,\n                    'func': ''\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[i + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[i + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'name': ex.name,\n            'message': lines[0],\n            'url': getLocationHref(),\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {Object.<string, *>} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {?Object.<string, *>} Stack trace information.\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref(),\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (TraceKit.debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'name': ex.name,\n            'message': ex.message,\n            'url': getLocationHref()\n        };\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n\n    return computeStackTrace;\n}());\n\n'use strict';\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nvar _Raven = window.Raven,\n    hasJSON = !!(typeof JSON === 'object' && JSON.stringify),\n    // Raven can run in contexts where there's no document (react-native)\n    hasDocument = typeof document !== 'undefined',\n    lastCapturedException,\n    lastEventId,\n    globalServer,\n    globalKey,\n    globalProject,\n    globalContext = {},\n    globalOptions = {\n        logger: 'javascript',\n        ignoreErrors: [],\n        ignoreUrls: [],\n        whitelistUrls: [],\n        includePaths: [],\n        crossOrigin: 'anonymous',\n        collectWindowErrors: true,\n        maxMessageLength: 100\n    },\n    isRavenInstalled = false,\n    objectPrototype = Object.prototype,\n    // capture references to window.console *and* all its methods first\n    // before the console plugin has a chance to monkey patch\n    originalConsole = window.console || {},\n    originalConsoleMethods = {},\n    plugins = [],\n    startTime = now();\n\nfor (var method in originalConsole) {\n  originalConsoleMethods[method] = originalConsole[method];\n}\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\nvar Raven = {\n    VERSION: '1.3.0',\n\n    debug: false,\n\n    /*\n     * Allow multiple versions of Raven to be installed.\n     * Strip Raven from the global context and returns the instance.\n     *\n     * @return {Raven}\n     */\n    noConflict: function() {\n        window.Raven = _Raven;\n        return Raven;\n    },\n\n    /*\n     * Configure Raven with a DSN and extra options\n     *\n     * @param {string} dsn The public Sentry DSN\n     * @param {object} options Optional set of of global options [optional]\n     * @return {Raven}\n     */\n    config: function(dsn, options) {\n        if (globalServer) {\n            logDebug('error', 'Error: Raven has already been configured');\n            return Raven;\n        }\n        if (!dsn) return Raven;\n\n        var uri = parseDSN(dsn),\n            lastSlash = uri.path.lastIndexOf('/'),\n            path = uri.path.substr(1, lastSlash);\n\n        // merge in options\n        if (options) {\n            each(options, function(key, value){\n                // tags and extra are special and need to be put into context\n                if (key == 'tags' || key == 'extra') {\n                    globalContext[key] = value;\n                } else {\n                    globalOptions[key] = value;\n                }\n            });\n        }\n\n        // \"Script error.\" is hard coded into browsers for errors that it can't read.\n        // this is the result of a script being pulled in from an external domain and CORS.\n        globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n        globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n        // join regexp rules into one big rule\n        globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n        globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp(globalOptions.ignoreUrls) : false;\n        globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp(globalOptions.whitelistUrls) : false;\n        globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n\n        globalKey = uri.user;\n        globalProject = uri.path.substr(lastSlash + 1);\n\n        // assemble the endpoint from the uri pieces\n        globalServer = '//' + uri.host +\n                      (uri.port ? ':' + uri.port : '') +\n                      '/' + path + 'api/' + globalProject + '/store/';\n\n        if (uri.protocol) {\n            globalServer = uri.protocol + ':' + globalServer;\n        }\n\n        if (globalOptions.fetchContext) {\n            TraceKit.remoteFetching = true;\n        }\n\n        if (globalOptions.linesOfContext) {\n            TraceKit.linesOfContext = globalOptions.linesOfContext;\n        }\n\n        TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n        // return for chaining\n        return Raven;\n    },\n\n    /*\n     * Installs a global window.onerror error handler\n     * to capture and report uncaught exceptions.\n     * At this point, install() is required to be called due\n     * to the way TraceKit is set up.\n     *\n     * @return {Raven}\n     */\n    install: function() {\n        if (isSetup() && !isRavenInstalled) {\n            TraceKit.report.subscribe(handleStackInfo);\n\n            // Install all of the plugins\n            each(plugins, function(_, plugin) {\n                plugin();\n            });\n\n            isRavenInstalled = true;\n        }\n\n        return Raven;\n    },\n\n    /*\n     * Wrap code within a context so Raven can capture errors\n     * reliably across domains that is executed immediately.\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The callback to be immediately executed within the context\n     * @param {array} args An array of arguments to be called with the callback [optional]\n     */\n    context: function(options, func, args) {\n        if (isFunction(options)) {\n            args = func || [];\n            func = options;\n            options = undefined;\n        }\n\n        return Raven.wrap(options, func).apply(this, args);\n    },\n\n    /*\n     * Wrap code within a context and returns back a new function to be executed\n     *\n     * @param {object} options A specific set of options for this context [optional]\n     * @param {function} func The function to be wrapped in a new context\n     * @return {function} The newly wrapped functions with a context\n     */\n    wrap: function(options, func) {\n        // 1 argument has been passed, and it's not a function\n        // so just return it\n        if (isUndefined(func) && !isFunction(options)) {\n            return options;\n        }\n\n        // options is optional\n        if (isFunction(options)) {\n            func = options;\n            options = undefined;\n        }\n\n        // At this point, we've passed along 2 arguments, and the second one\n        // is not a function either, so we'll just return the second argument.\n        if (!isFunction(func)) {\n            return func;\n        }\n\n        // We don't wanna wrap it twice!\n        if (func.__raven__) {\n            return func;\n        }\n\n        function wrapped() {\n            var args = [], i = arguments.length,\n                deep = !options || options && options.deep !== false;\n            // Recursively wrap all of a function's arguments that are\n            // functions themselves.\n\n            while(i--) args[i] = deep ? Raven.wrap(options, arguments[i]) : arguments[i];\n\n            try {\n                /*jshint -W040*/\n                return func.apply(this, args);\n            } catch(e) {\n                Raven.captureException(e, options);\n                throw e;\n            }\n        }\n\n        // copy over properties of the old function\n        for (var property in func) {\n            if (hasKey(func, property)) {\n                wrapped[property] = func[property];\n            }\n        }\n        wrapped.prototype = func.prototype;\n\n        // Signal that this function has been wrapped already\n        // for both debugging and to prevent it to being wrapped twice\n        wrapped.__raven__ = true;\n        wrapped.__inner__ = func;\n\n        return wrapped;\n    },\n\n    /*\n     * Uninstalls the global error handler.\n     *\n     * @return {Raven}\n     */\n    uninstall: function() {\n        TraceKit.report.uninstall();\n        isRavenInstalled = false;\n\n        return Raven;\n    },\n\n    /*\n     * Manually capture an exception and send it over to Sentry\n     *\n     * @param {error} ex An exception to be logged\n     * @param {object} options A specific set of options for this error [optional]\n     * @return {Raven}\n     */\n    captureException: function(ex, options) {\n        // If not an Error is passed through, recall as a message instead\n        if (!isError(ex)) return Raven.captureMessage(ex, options);\n\n        // Store the raw exception object for potential debugging and introspection\n        lastCapturedException = ex;\n\n        // TraceKit.report will re-raise any exception passed to it,\n        // which means you have to wrap it in try/catch. Instead, we\n        // can wrap it here and only re-raise if TraceKit.report\n        // raises an exception different from the one we asked to\n        // report on.\n        try {\n            var stack = TraceKit.computeStackTrace(ex);\n            handleStackInfo(stack, options);\n        } catch(ex1) {\n            if(ex !== ex1) {\n                throw ex1;\n            }\n        }\n\n        return Raven;\n    },\n\n    /*\n     * Manually send a message to Sentry\n     *\n     * @param {string} msg A plain message to be captured in Sentry\n     * @param {object} options A specific set of options for this message [optional]\n     * @return {Raven}\n     */\n    captureMessage: function(msg, options) {\n        // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n        // early call; we'll error on the side of logging anything called before configuration since it's\n        // probably something you should see:\n        if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(msg)) {\n            return;\n        }\n\n        // Fire away!\n        send(\n            objectMerge({\n                message: msg + ''  // Make sure it's actually a string\n            }, options)\n        );\n\n        return Raven;\n    },\n\n    addPlugin: function(plugin) {\n        plugins.push(plugin);\n        if (isRavenInstalled) plugin();\n        return Raven;\n    },\n\n    /*\n     * Set/clear a user to be sent along with the payload.\n     *\n     * @param {object} user An object representing user data [optional]\n     * @return {Raven}\n     */\n    setUserContext: function(user) {\n        // Intentionally do not merge here since that's an unexpected behavior.\n        globalContext.user = user;\n\n        return Raven;\n    },\n\n    /*\n     * Merge extra attributes to be sent along with the payload.\n     *\n     * @param {object} extra An object representing extra data [optional]\n     * @return {Raven}\n     */\n    setExtraContext: function(extra) {\n        mergeContext('extra', extra);\n\n        return Raven;\n    },\n\n    /*\n     * Merge tags to be sent along with the payload.\n     *\n     * @param {object} tags An object representing tags [optional]\n     * @return {Raven}\n     */\n    setTagsContext: function(tags) {\n        mergeContext('tags', tags);\n\n        return Raven;\n    },\n\n    /*\n     * Clear all of the context.\n     *\n     * @return {Raven}\n     */\n    clearContext: function() {\n        globalContext = {};\n\n        return Raven;\n    },\n\n    /*\n     * Get a copy of the current context. This cannot be mutated.\n     *\n     * @return {object} copy of context\n     */\n    getContext: function() {\n        // lol javascript\n        return JSON.parse(JSON.stringify(globalContext));\n    },\n\n    /*\n     * Set release version of application\n     *\n     * @param {string} release Typically something like a git SHA to identify version\n     * @return {Raven}\n     */\n    setRelease: function(release) {\n        globalOptions.release = release;\n\n        return Raven;\n    },\n\n    /*\n     * Set the dataCallback option\n     *\n     * @param {function} callback The callback to run which allows the\n     *                            data blob to be mutated before sending\n     * @return {Raven}\n     */\n    setDataCallback: function(callback) {\n        globalOptions.dataCallback = callback;\n\n        return Raven;\n    },\n\n    /*\n     * Set the shouldSendCallback option\n     *\n     * @param {function} callback The callback to run which allows\n     *                            introspecting the blob before sending\n     * @return {Raven}\n     */\n    setShouldSendCallback: function(callback) {\n        globalOptions.shouldSendCallback = callback;\n\n        return Raven;\n    },\n\n    /**\n     * Override the default HTTP transport mechanism that transmits data\n     * to the Sentry server.\n     *\n     * @param {function} transport Function invoked instead of the default\n     *                             `makeRequest` handler.\n     *\n     * @return {Raven}\n     */\n    setTransport: function(transport) {\n        globalOptions.transport = transport;\n\n        return Raven;\n    },\n\n    /*\n     * Get the latest raw exception that was captured by Raven.\n     *\n     * @return {error}\n     */\n    lastException: function() {\n        return lastCapturedException;\n    },\n\n    /*\n     * Get the last event id\n     *\n     * @return {string}\n     */\n    lastEventId: function() {\n        return lastEventId;\n    },\n\n    /*\n     * Determine if Raven is setup and ready to go.\n     *\n     * @return {boolean}\n     */\n    isSetup: function() {\n        return isSetup();\n    }\n};\n\n// Deprecations\nRaven.setUser = Raven.setUserContext;\nRaven.setReleaseContext = Raven.setRelease;\n\nfunction triggerEvent(eventType, options) {\n    // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n    var evt, key;\n\n    if (!hasDocument)\n        return;\n\n    options = options || {};\n\n    eventType = 'raven' + eventType.substr(0,1).toUpperCase() + eventType.substr(1);\n\n    if (document.createEvent) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(eventType, true, true);\n    } else {\n        evt = document.createEventObject();\n        evt.eventType = eventType;\n    }\n\n    for (key in options) if (hasKey(options, key)) {\n        evt[key] = options[key];\n    }\n\n    if (document.createEvent) {\n        // IE9 if standards\n        document.dispatchEvent(evt);\n    } else {\n        // IE8 regardless of Quirks or Standards\n        // IE9 if quirks\n        try {\n            document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n        } catch(e) {}\n    }\n}\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n    dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction RavenConfigError(message) {\n    this.name = 'RavenConfigError';\n    this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\n/**** Private functions ****/\nfunction parseDSN(str) {\n    var m = dsnPattern.exec(str),\n        dsn = {},\n        i = 7;\n\n    try {\n        while (i--) dsn[dsnKeys[i]] = m[i] || '';\n    } catch(e) {\n        throw new RavenConfigError('Invalid DSN: ' + str);\n    }\n\n    if (dsn.pass)\n        throw new RavenConfigError('Do not specify your private key in the DSN!');\n\n    return dsn;\n}\n\nfunction isUndefined(what) {\n    return what === void 0;\n}\n\nfunction isFunction(what) {\n    return typeof what === 'function';\n}\n\nfunction isString(what) {\n    return objectPrototype.toString.call(what) === '[object String]';\n}\n\nfunction isObject(what) {\n    return typeof what === 'object' && what !== null;\n}\n\nfunction isEmptyObject(what) {\n    for (var k in what) return false;\n    return true;\n}\n\n// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560\n// with some tiny modifications\nfunction isError(what) {\n    return isObject(what) &&\n        objectPrototype.toString.call(what) === '[object Error]' ||\n        what instanceof Error;\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n    return objectPrototype.hasOwnProperty.call(object, key);\n}\n\nfunction each(obj, callback) {\n    var i, j;\n\n    if (isUndefined(obj.length)) {\n        for (i in obj) {\n            if (hasKey(obj, i)) {\n                callback.call(null, i, obj[i]);\n            }\n        }\n    } else {\n        j = obj.length;\n        if (j) {\n            for (i = 0; i < j; i++) {\n                callback.call(null, i, obj[i]);\n            }\n        }\n    }\n}\n\nfunction handleStackInfo(stackInfo, options) {\n    var frames = [];\n\n    if (stackInfo.stack && stackInfo.stack.length) {\n        each(stackInfo.stack, function(i, stack) {\n            var frame = normalizeFrame(stack);\n            if (frame) {\n                frames.push(frame);\n            }\n        });\n    }\n\n    triggerEvent('handle', {\n        stackInfo: stackInfo,\n        options: options\n    });\n\n    processException(\n        stackInfo.name,\n        stackInfo.message,\n        stackInfo.url,\n        stackInfo.lineno,\n        frames,\n        options\n    );\n}\n\nfunction normalizeFrame(frame) {\n    if (!frame.url) return;\n\n    // normalize the frames data\n    var normalized = {\n        filename:   frame.url,\n        lineno:     frame.line,\n        colno:      frame.column,\n        'function': frame.func || '?'\n    }, context = extractContextFromFrame(frame), i;\n\n    if (context) {\n        var keys = ['pre_context', 'context_line', 'post_context'];\n        i = 3;\n        while (i--) normalized[keys[i]] = context[i];\n    }\n\n    normalized.in_app = !( // determine if an exception came from outside of our app\n        // first we check the global includePaths list.\n        (!!globalOptions.includePaths.test && !globalOptions.includePaths.test(normalized.filename)) ||\n        // Now we check for fun, if the function name is Raven or TraceKit\n        /(Raven|TraceKit)\\./.test(normalized['function']) ||\n        // finally, we do a last ditch effort and check for raven.min.js\n        /raven\\.(min\\.)?js$/.test(normalized.filename)\n    );\n\n    return normalized;\n}\n\nfunction extractContextFromFrame(frame) {\n    // immediately check if we should even attempt to parse a context\n    if (!frame.context || !globalOptions.fetchContext) return;\n\n    var context = frame.context,\n        pivot = ~~(context.length / 2),\n        i = context.length, isMinified = false;\n\n    while (i--) {\n        // We're making a guess to see if the source is minified or not.\n        // To do that, we make the assumption if *any* of the lines passed\n        // in are greater than 300 characters long, we bail.\n        // Sentry will see that there isn't a context\n        if (context[i].length > 300) {\n            isMinified = true;\n            break;\n        }\n    }\n\n    if (isMinified) {\n        // The source is minified and we don't know which column. Fuck it.\n        if (isUndefined(frame.column)) return;\n\n        // If the source is minified and has a frame column\n        // we take a chunk of the offending line to hopefully shed some light\n        return [\n            [],  // no pre_context\n            context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column\n            []   // no post_context\n        ];\n    }\n\n    return [\n        context.slice(0, pivot),    // pre_context\n        context[pivot],             // context_line\n        context.slice(pivot + 1)    // post_context\n    ];\n}\n\nfunction processException(type, message, fileurl, lineno, frames, options) {\n    var stacktrace, i, fullMessage;\n\n    if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(message)) return;\n\n    message += '';\n    fullMessage = type + ': ' + message;\n\n    if (frames && frames.length) {\n        fileurl = frames[0].filename || fileurl;\n        // Sentry expects frames oldest to newest\n        // and JS sends them as newest to oldest\n        frames.reverse();\n        stacktrace = {frames: frames};\n    } else if (fileurl) {\n        stacktrace = {\n            frames: [{\n                filename: fileurl,\n                lineno: lineno,\n                in_app: true\n            }]\n        };\n    }\n\n    if (!!globalOptions.ignoreUrls.test && globalOptions.ignoreUrls.test(fileurl)) return;\n    if (!!globalOptions.whitelistUrls.test && !globalOptions.whitelistUrls.test(fileurl)) return;\n\n    // Fire away!\n    send(\n        objectMerge({\n            // sentry.interfaces.Exception\n            exception: {\n                values: [{\n                    type: type,\n                    value: message,\n                    stacktrace: stacktrace\n                }]\n            },\n            culprit: fileurl,\n            message: fullMessage\n        }, options)\n    );\n}\n\nfunction objectMerge(obj1, obj2) {\n    if (!obj2) {\n        return obj1;\n    }\n    each(obj2, function(key, value){\n        obj1[key] = value;\n    });\n    return obj1;\n}\n\nfunction truncate(str, max) {\n    return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\nfunction trimPacket(data) {\n    // For now, we only want to truncate the two different messages\n    // but this could/should be expanded to just trim everything\n    var max = globalOptions.maxMessageLength;\n    data.message = truncate(data.message, max);\n    if (data.exception) {\n        var exception = data.exception.values[0];\n        exception.value = truncate(exception.value, max);\n    }\n\n    return data;\n}\n\nfunction now() {\n    return +new Date();\n}\n\nfunction getHttpData() {\n    if (!hasDocument || !document.location || !document.location.href) {\n        return;\n    }\n\n    var httpData = {\n        headers: {\n            'User-Agent': navigator.userAgent\n        }\n    };\n\n    httpData.url = document.location.href;\n\n    if (document.referrer) {\n        httpData.headers.Referer = document.referrer;\n    }\n\n    return httpData;\n}\n\nfunction send(data) {\n    var baseData = {\n        project: globalProject,\n        logger: globalOptions.logger,\n        platform: 'javascript'\n    }, httpData = getHttpData();\n\n    if (httpData) {\n        baseData.request = httpData;\n    }\n\n    data = objectMerge(baseData, data);\n\n    // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n    data.tags = objectMerge(objectMerge({}, globalContext.tags), data.tags);\n    data.extra = objectMerge(objectMerge({}, globalContext.extra), data.extra);\n\n    // Send along our own collected metadata with extra\n    data.extra['session:duration'] = now() - startTime;\n\n    // If there are no tags/extra, strip the key from the payload alltogther.\n    if (isEmptyObject(data.tags)) delete data.tags;\n\n    if (globalContext.user) {\n        // sentry.interfaces.User\n        data.user = globalContext.user;\n    }\n\n    // Include the release if it's defined in globalOptions\n    if (globalOptions.release) data.release = globalOptions.release;\n    // Include server_name if it's defined in globalOptions\n    if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n    if (isFunction(globalOptions.dataCallback)) {\n        data = globalOptions.dataCallback(data) || data;\n    }\n\n    // Why??????????\n    if (!data || isEmptyObject(data)) {\n        return;\n    }\n\n    // Check if the request should be filtered or not\n    if (isFunction(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) {\n        return;\n    }\n\n    // Send along an event_id if not explicitly passed.\n    // This event_id can be used to reference the error within Sentry itself.\n    // Set lastEventId after we know the error should actually be sent\n    lastEventId = data.event_id || (data.event_id = uuid4());\n\n    // Try and clean up the packet before sending by truncating long values\n    data = trimPacket(data);\n\n    logDebug('debug', 'Raven about to send:', data);\n\n    if (!isSetup()) return;\n\n    (globalOptions.transport || makeRequest)({\n        url: globalServer,\n        auth: {\n            sentry_version: '7',\n            sentry_client: 'raven-js/' + Raven.VERSION,\n            sentry_key: globalKey\n        },\n        data: data,\n        options: globalOptions,\n        onSuccess: function success() {\n            triggerEvent('success', {\n                data: data,\n                src: globalServer\n            });\n        },\n        onError: function failure() {\n            triggerEvent('failure', {\n                data: data,\n                src: globalServer\n            });\n        }\n    });\n}\n\nfunction makeRequest(opts) {\n    // Tack on sentry_data to auth options, which get urlencoded\n    opts.auth.sentry_data = JSON.stringify(opts.data);\n\n    var img = newImage(),\n        src = opts.url + '?' + urlencode(opts.auth),\n        crossOrigin = opts.options.crossOrigin;\n\n    if (crossOrigin || crossOrigin === '') {\n        img.crossOrigin = crossOrigin;\n    }\n    img.onload = opts.onSuccess;\n    img.onerror = img.onabort = opts.onError;\n    img.src = src;\n}\n\n// Note: this is shitty, but I can't figure out how to get\n// sinon to stub document.createElement without breaking everything\n// so this wrapper is just so I can stub it for tests.\nfunction newImage() {\n    return document.createElement('img');\n}\n\nvar ravenNotConfiguredError;\n\nfunction isSetup() {\n    if (!hasJSON) return false;  // needs JSON support\n    if (!globalServer) {\n        if (!ravenNotConfiguredError)\n          logDebug('error', 'Error: Raven has not been configured.');\n        ravenNotConfiguredError = true;\n        return false;\n    }\n    return true;\n}\n\nfunction joinRegExp(patterns) {\n    // Combine an array of regular expressions and strings into one large regexp\n    // Be mad.\n    var sources = [],\n        i = 0, len = patterns.length,\n        pattern;\n\n    for (; i < len; i++) {\n        pattern = patterns[i];\n        if (isString(pattern)) {\n            // If it's a string, we need to escape it\n            // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n            sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\"));\n        } else if (pattern && pattern.source) {\n            // If it's a regexp already, we want to extract the source\n            sources.push(pattern.source);\n        }\n        // Intentionally skip other cases\n    }\n    return new RegExp(sources.join('|'), 'i');\n}\n\nfunction uuid4() {\n    var crypto = window.crypto || window.msCrypto;\n\n    if (!isUndefined(crypto) && crypto.getRandomValues) {\n        // Use window.crypto API if available\n        var arr = new Uint16Array(8);\n        crypto.getRandomValues(arr);\n\n        // set 4 in byte 7\n        arr[3] = arr[3] & 0xFFF | 0x4000;\n        // set 2 most significant bits of byte 9 to '10'\n        arr[4] = arr[4] & 0x3FFF | 0x8000;\n\n        var pad = function(num) {\n            var v = num.toString(16);\n            while (v.length < 4) {\n                v = '0' + v;\n            }\n            return v;\n        };\n\n        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) +\n        pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n    } else {\n        // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n        return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n            var r = Math.random()*16|0,\n                v = c == 'x' ? r : (r&0x3|0x8);\n            return v.toString(16);\n        });\n    }\n}\n\nfunction logDebug(level) {\n    if (originalConsoleMethods[level] && Raven.debug) {\n        // _slice is coming from vendor/TraceKit/tracekit.js\n        // so it's accessible globally\n        originalConsoleMethods[level].apply(originalConsole, _slice.call(arguments, 1));\n    }\n}\n\nfunction afterLoad() {\n    // Attempt to initialize Raven on load\n    var RavenConfig = window.RavenConfig;\n    if (RavenConfig) {\n        Raven.config(RavenConfig.dsn, RavenConfig.config).install();\n    }\n}\n\nfunction urlencode(o) {\n    var pairs = [];\n    each(o, function(key, value) {\n        pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n    });\n    return pairs.join('&');\n}\n\nfunction mergeContext(key, context) {\n    if (isUndefined(context)) {\n        delete globalContext[key];\n    } else {\n        globalContext[key] = objectMerge(globalContext[key] || {}, context);\n    }\n}\n\nafterLoad();\n\n// This is being exposed no matter what because there are too many weird\n// usecases for how people use Raven. If this is really a problem, I'm sorry.\nwindow.Raven = Raven;\n\n// Expose Raven to the world\nif (typeof define === 'function' && define.amd) {\n    // AMD\n    define('raven', [], function() {\n      return Raven;\n    });\n} else if (typeof module === 'object') {\n    // browserify\n    module.exports = Raven;\n} else if (typeof exports === 'object') {\n    // CommonJS\n    exports = Raven;\n}\n\n})(typeof window !== 'undefined' ? window : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raven-js/dist/raven.js\n// module id = 844\n// module chunks = 0 1","\"use strict\";\n\nvar location = module.exports = {\n  hostname: window.location.hostname,\n  pathname: window.location.pathname,\n  hash: window.location.hash\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/lib/location.js\n// module id = 845\n// module chunks = 0 1","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/og_analytics/node_modules/object-assign/index.js\n// module id = 846\n// module chunks = 0 1","import { Dispatcher } from '@opengov/og_flux';\nimport ogApi from '@opengov/og_api';\n\nconst MaskActions = {\n  getMasks(coaId) {\n    Dispatcher.handleServerAction({\n      actionType: 'MASK_GET_MASKS',\n      coa: coaId\n    });\n\n    ogApi\n      .get('coa_masks', {\n        coa: coaId,\n        limit: 250 // certain customers have more than 32 masks\n      })\n      .end()\n      .then(response => {\n        MaskActions.getMasksComplete(response.body.coa_masks);\n      });\n\n  },\n\n  getMasksComplete(masks) {\n    Dispatcher.handleServerAction({\n      actionType: 'MASK_GET_MASKS_COMPLETE',\n      masks\n    });\n  }\n};\n\nexport default MaskActions;\n\n\n// WEBPACK FOOTER //\n// ./javascripts/actions/mask_actions.ts","import _ from 'lodash';\nimport _s from 'underscore.string';\nimport Backbone from 'backbone';\nimport { Map } from 'immutable';\n\nimport RenderLine from './models/render_line';\nimport BudgetNode from './models/budget_node';\nimport Breakdown from './models/breakdown';\nimport Formulas from './formulas';\nimport {isProjectionType, isActualType, getSortingIndex, fixProjectedDataSets } from './utils/dataset_utils';\n\nexport enum LineTotalType {\n  Budget = 'budget',\n  Actual = 'actual'\n}\n\nexport interface ILineTotal {\n  type: LineTotalType;\n  variance?: number;\n  percentVariance?: number;\n  delta: number;\n  amount: number;\n}\n\nexport default Backbone.Model.extend({\n  revenueLineColor: 0x6fbea4,\n  expenseLineColor: 0xeb8e7e,\n  defaultNodeSortBy: 'name',\n\n  initialize(options) {\n    this.entity = options.entity;\n    this.fiscalYearStartMonth = this.entity.fiscal_year_start_month;\n    this.report = options.report;\n    this.onError = options.onError;\n    this.pkg = options.pkg;\n    this.nodes = [];\n    this.buildTrees(this.pkg);\n    this.buildDataSets(this.pkg);\n    this.currentColor = -1;\n    this.annotatedNodes = {};\n    this.mask = options.mask;\n    this.formulas = new Formulas(this.entity.report_preferences);\n\n    this.store = options.store;\n    this.store.addChangeListener(this.syncStoreState.bind(this));\n\n    this.syncStoreState();\n  },\n\n  syncStoreState() {\n    this.state = this.store.getState();\n  },\n\n  toggleSelect(id) {\n    const node = this.nodes[id];\n\n    node.setSelectionState(!node.selected);\n  },\n\n  exclusiveSelect(id) {\n    const node = this.nodes[id];\n    const ancestors = node.ancestorNodes();\n    if (node.ungrouped) {\n      return;\n    }\n    this.uncheckSiblings(node);\n    _.each(ancestors, _.bind(this.uncheckSiblings, this));\n    node.setSelectionState(true);\n  },\n\n  treeSelect(id, state) {\n    const tree = this.trees[id];\n    if (_.isUndefined(state)) {\n      state = !tree.selected;\n    }\n    tree.setSelectionState(state);\n  },\n\n  selectNodes(nodeIds) {\n    _.each(nodeIds, _.bind(function(id) {\n      const node = this.nodes[id] || this.trees[id];\n      if (node) {\n        node.select();\n      }\n    }, this));\n  },\n\n  sortTree(treeId, method) {\n    const tree = this.trees[treeId];\n    switch (method) {\n    case 'alpha':\n      this.sortByName(tree);\n      break;\n    case 'coa':\n      this.sortByCoa(tree);\n      break;\n    default:\n      return;\n    }\n    this.trigger('sort', treeId);\n  },\n\n  sortByName(node) {\n    node.children = _.sortBy(node.children, 'name');\n    _.each(node.children, _.bind(this.sortByName, this));\n  },\n\n  sortByCoa(node) {\n    node.children = _.sortBy(node.children, 'order');\n    _.each(node.children, _.bind(this.sortByCoa, this));\n  },\n\n  hasNoAggregations() {\n    return !this.aggregations ||\n      (_.size(this.aggregations.amounts.expenses) === 0 &&\n      _.size(this.aggregations.amounts.revenues) === 0);\n  },\n\n  defaultSelectionState() {\n    const excludeNodes = ['Transfers In', 'Transfers Out'];\n\n    _.each(this.trees, function(tree) {\n      if (tree.isAccountTypeTree || tree.id === 'types') {\n        _.each(tree.children, function(node) {\n          if (!_.includes(excludeNodes, node.name)) {\n            node.select();\n          }\n        });\n      } else {\n        tree.select();\n      }\n    });\n  },\n\n  nodesGroupedByDepth(breakdown, test) {\n    const tree = this.trees[breakdown];\n    const depths = {};\n    if (test(tree)) {\n      depths[0] = [this.trees[breakdown]];\n    }\n    _.each(this.nodes, _.bind(function(node) {\n      if (node.tree_id === breakdown) {\n        if (test(node)) {\n          const depth = node.depth;\n          const depthStore = depths[depth] = depths[depth] || [];\n          depthStore.push(node);\n        }\n      }\n    }, this));\n    return depths;\n  },\n\n  eachDescendant(node, iter) {\n    const eachDescendant = function(node, i, c) {\n      iter(node, i, c);\n      _.each(node.children, _.bind(eachDescendant, this));\n    };\n    _.each(node.children, _.bind(eachDescendant, this));\n  },\n\n  eachAggregationNode(iter) {\n    const self = this;\n    if (this.aggregations && this.aggregations.amounts) {\n      _.each(this.aggregations.amounts, function(account) {\n        _.each(account, function(amounts, id) {\n          iter(self.nodes[id]);\n        });\n      });\n    }\n  },\n\n  getBreakdownTree(breakdown) {\n    return this.trees[breakdown === 'types' ? this.state.get('accountType') : breakdown];\n  },\n\n  primaryTitle(breakdownId) {\n    let primary: any = {breakdownId};\n    let accountType = this.state.get('accountType');\n    let breakdown = this.breakdowns.get(breakdownId);\n    let tree;\n    let titleNode;\n\n    if (breakdown) {\n      if (breakdown.isAccountType()) {\n        if (accountType === 'types') {\n          primary.name = breakdown.get('name');\n        } else {\n          tree = this.trees[accountType];\n        }\n      } else {\n        tree = breakdown.getTree(0);\n      }\n    }\n\n    if (tree) {\n      titleNode = tree.titleNode();\n\n      // If the title node is the breakdown tree use the name from\n      // the breakdown so the naming is consistent with what is shown\n      // in the breakdown dropdown and filter menu titles.\n      if (titleNode === tree) {\n        primary.name = breakdown.get('name');\n      } else {\n        primary.name = titleNode.name;\n      }\n\n      primary.partiallySelected = titleNode.partiallySelected;\n    }\n\n    return primary;\n  },\n\n  secondaryTitle(breakdownId) {\n    const self = this;\n    const secondary = [];\n    const showAllAccounts = this.state.get('accountType') === 'types';\n    const breakdownByAccount = breakdownId === 'types';\n\n    _.each(this.treeList, function(tree) {\n      // Don't display tree in secondary titles if...\n      //  - The tree is hidden from view.\n      //  - Tree is an account tree and we are breaking down by account types.\n      //  - The tree is included in the current breakdown (unless showing by account type).\n      if (!tree.visible ||\n          (tree.isAccountTypeTree && breakdownByAccount) ||\n          (!showAllAccounts && tree.breakdownId === breakdownId)) {\n        return;\n      }\n\n      const node = tree.titleNode();\n\n      if (node.name && (node.parent || node.partiallySelected)) {\n        if (!node.aggregationGroup ||\n            self.state.get('accountType') === 'types' ||\n            node.aggregationGroup === self.state.get('accountType')) {\n\n          secondary.push({node, breakdownId: tree.breakdownId});\n        }\n      }\n    });\n\n    return secondary;\n  },\n\n  // List the names of top level checked nodes for each tree\n  filterContext(breakdownId) {\n    const accountType = this.state.get('accountType');\n    const results = [];\n\n    _.each(this.treeList, _.bind(function(tree) {\n\n      if (!tree.visible) {\n        return;\n      }\n\n      if (tree.isAccountTypeTree) {\n        if (accountType !== 'types') {\n          if (tree.id !== accountType) {\n            return;\n          }\n        }\n      }\n      // The legend and title already describe the current breakdown\n      if (tree.breakdownId === breakdownId) {\n        return;\n      }\n\n      // It's not interesting to list a tree if it is fully checked.\n      if (tree.selected) {\n        return;\n      }\n\n      results.push({\n        name: tree.name,\n        nodes: _.map(tree.selectRootMostCheckedNodes(), 'name')\n      });\n    }, this));\n\n    return results;\n  },\n\n\n  titles(breakdownId) {\n    return {\n      primary: this.primaryTitle(breakdownId),\n      secondary: this.secondaryTitle(breakdownId)\n    };\n  },\n\n  triggerSelectionChange() {\n    this.trigger('selectionChange', this);\n  },\n\n  uncheckSiblings(node) {\n    const siblings = node.siblingNodes();\n\n    for (let i = 0, len = siblings.length; i < len; ++i) {\n      siblings[i].deselect();\n    }\n  },\n\n  deselectAll() {\n    _.each(this.trees, _.bind(function(tree) {\n      tree.setSelectionState(false);\n    }, this));\n  },\n\n\n  selectedLeavesByTree(leafReducer, product) {\n    const trees = this.pkg.trees;\n    const currentAccountType = this.state.get('accountType');\n\n    // If leafReducer is supplied, it will be passed a leaf node preceded by that leaf's tree accumulator\n    return _.reduce(this.nodeList, function(lookup, node: any) {\n      let accum;\n      // Ensure we're only collecting selected leaf nodes\n      if (node.children.length > 0 || !node.selected) {return lookup; }\n\n      if (trees.hasOwnProperty(node.tree_id) && trees[node.tree_id].isAccountTypeTree) {\n        if (currentAccountType === 'revenues' && node.tree_id !== 'revenues') {return lookup;}\n        if (currentAccountType === 'expenses' && node.tree_id !== 'expenses') {return lookup;}\n\n        if (product.report_type !== 'balance') {\n          if (currentAccountType === 'types' && (node.tree_id !== 'expenses' && node.tree_id !== 'revenues')) { return lookup; }\n        }\n      }\n\n      // Filter out account type nodes that aren't relevant in the current context\n      accum = lookup[trees[node.tree_id].long_id.toLowerCase()];\n      if (!accum) {\n        accum = lookup[trees[node.tree_id].long_id.toLowerCase()] = [];\n      }\n      if (leafReducer) {\n        leafReducer(accum, node);\n      } else {\n        accum.push(node);\n      }\n\n      return lookup;\n    }, {});\n  },\n\n  selectedLeafCodesByTree(product) {\n\n    return this.selectedLeavesByTree(function(accum, leaf) {\n      _.each(leaf.accountCodeChains, function(chain) {\n        accum.push(chain);\n      });\n    }, product);\n  },\n\n\n  minimalSelectedNodeList(includedLedgerTypes) {\n    function collectSelectedNodes(nodes, selectedNodes) {\n      _.each(nodes, function(node) {\n        if (node.selected) {\n          selectedNodes.push(node);\n        } else if (node.partiallySelected) {\n          collectSelectedNodes(node.children, selectedNodes);\n        }\n      });\n    }\n\n    var selectedNodes = [];\n    var trees;\n\n    trees = _.filter(this.trees, (tree: any) => {\n      // Do not include the account types tree.\n      if (tree.id === 'types') {\n        return false;\n      }\n\n      if (tree.isAccountTypeTree) {\n        return !includedLedgerTypes || _.includes(includedLedgerTypes, tree.id);\n      }\n\n      return true;\n    });\n\n    collectSelectedNodes(trees, selectedNodes);\n\n    return selectedNodes;\n  },\n\n  annualDataSets() {\n    return _.filter(this.dataSets, function(dataSet: any) {\n      return !dataSet.month;\n    });\n  },\n\n  /**\n  * chainProjectedDataSets(dataSets, fiscalYearStartMonth, projectionType) chains projected datasets of a specified projection type\n  * based on the fiscal year start month\n  * starts month -->  6       7       8      ...     12      1     2     3     4     5\n  *                   2015 <- 2015 <- 2015   ... <-  2015 <- 2015 ...\n  *                   2016 <- 2016 <- 2016   ... <-  2016 <- 2016 ...\n  */\n  chainProjectedDataSets(dataSets, fiscalYearStartMonth, projectionType) {\n    let projectedDataSetsByYear = _\n      .chain(dataSets)\n      .filter(ds => (isProjectionType(ds.type) && ds.month && ds.label === projectionType))\n      .groupBy('month')\n      .value();\n\n    let previousDataSetIdByYearAndMonth = {};\n    let previousMonthIndex = null;\n    eachFiscalMonth(fiscalYearStartMonth, (monthIndex) => {\n      if (!previousDataSetIdByYearAndMonth[monthIndex]) previousDataSetIdByYearAndMonth[monthIndex] = {};\n      _.each(projectedDataSetsByYear[monthIndex], (ds) => {\n        previousDataSetIdByYearAndMonth[monthIndex][ds.year] = ds.id;\n        if (previousMonthIndex && previousDataSetIdByYearAndMonth[previousMonthIndex][ds.year]) {\n          ds.prevProjectedDataSetId = previousDataSetIdByYearAndMonth[previousMonthIndex][ds.year];\n        }\n      });\n      previousMonthIndex = monthIndex;\n    });\n  },\n\n  /**\n  * chainProjectedDataSetsToActuals(dataSets, fiscalYearStartMonth, projectionType)\n  * chains projection datasets to the last actual in the current fiscal year\n  */\n  chainProjectedDataSetsToActuals(dataSets, fiscalYearStartMonth, projectionType) {\n    let sortedDataSetsByYear = _\n      .chain(dataSets)\n      .sortBy((ds) => getSortingIndex(ds.type))\n      .filter(ds => (ds.month && (!isProjectionType(ds.type) || (isProjectionType(ds.type) && ds.label === projectionType))))\n      .groupBy('month')\n      .value();\n\n    let actualsByYear = {};\n    let overlappingProjectionsByYear = {};\n    eachFiscalMonth(fiscalYearStartMonth, (monthIndex) => {\n      _.each(sortedDataSetsByYear[monthIndex], (ds) => {\n        if (!actualsByYear[ds.year]) {\n          actualsByYear[ds.year] = [];\n        }\n        if (!overlappingProjectionsByYear[ds.year]) {\n          overlappingProjectionsByYear[ds.year] = [];\n        }\n        if (isActualType(ds.type)) {\n          actualsByYear[ds.year].push(ds);\n        }\n        if (isProjectionType(ds.type)) {\n          if (actualsByYear[ds.year].length && ds.month === actualsByYear[ds.year][actualsByYear[ds.year].length - 1].month) {\n            overlappingProjectionsByYear[ds.year].push(ds);\n          }\n        }\n      });\n    });\n\n    eachFiscalMonth(fiscalYearStartMonth, (monthIndex) => {\n      _.each(sortedDataSetsByYear[monthIndex], (ds) => {\n        if (isProjectionType(ds.type)) {\n          if (actualsByYear[ds.year].length) {\n            ds.lastActualDataSetId = actualsByYear[ds.year][actualsByYear[ds.year].length - 1].id;\n          }\n          if (overlappingProjectionsByYear[ds.year].length) {\n            ds.lastOverlappingProjectionDataSetId = overlappingProjectionsByYear[ds.year][overlappingProjectionsByYear[ds.year].length - 1].id;\n          }\n        }\n      });\n    });\n  },\n\n  /**\n  * renderedDataSets(eportState, fiscalYearStartMonth) massage and filter the data based on the reportState\n  * filter out dataSets that we don't need\n  * massage projections data if present byt projection type, and by the report state\n  * link projected dataSets to each other based on the fiscalYearStartMonth\n  * this function is called from:\n  * 1) SummaryReportStore.getRenderedDataSets\n  * 2) this.renderedData\n  * 3) this.filterActiveAnnotations\n  */\n  renderedDataSets(reportState, fiscalYearStartMonth) {\n    const fiscalYearRange = {\n      start: reportState.getIn(['fiscalYearRange', 0]),\n      end: reportState.getIn(['fiscalYearRange', 1])\n    };\n    const month = Number(reportState.get('month'));\n    const reportType = reportState.get('reportType');\n    const year = Number(reportState.get('year'));\n    const currentYearPeriod = reportState.get('currentYearPeriod');\n    const athenaState = reportState.get('athenaState');\n    const isProjectionsEnabled = athenaState && athenaState.get('projections');\n    const projectionType = athenaState && athenaState.get('projectionType');\n\n    /**\n    * fix dataSets with projections.\n    * NOTE: it's a temp patch here. Once projections on the backend are done, we will remove it\n    */\n    let dataSets = fixProjectedDataSets(this.dataSets);\n    // we massage projections data and chain projected dataSets\n    this.chainProjectedDataSets(this.dataSets, fiscalYearStartMonth, projectionType);\n\n    this.chainProjectedDataSetsToActuals(this.dataSets, fiscalYearStartMonth, projectionType);\n\n    let filteredDataSets = _.filter(dataSets, (dataSet: any) => {\n      // filter out projections if user didn't enable them\n      if (isProjectionType(dataSet.type) && !isProjectionsEnabled) {\n        return false;\n      // filter projections by the selected projection type\n      } else if (isProjectionType(dataSet.type) && dataSet.label !== projectionType) {\n        return false;\n      }\n\n      if (reportType === 'ytd') {\n        // Year over year option\n        if (currentYearPeriod === 'years') {\n          // filter out datasets with the month present but not the month selected\n          if (dataSet.month && dataSet.month != month) {\n            return false;\n          }\n\n          // filter out datasets where the month is not present but the month and year is present in other datasets of this type\n          if (!dataSet.month) {\n            if (this.monthlyDataSetExists(dataSet.type, dataSet.year, month)) {\n              return false;\n            }\n            // filter out projections for year over year period where month is not present\n            if (isProjectionType(dataSet.type)) {\n              return false;\n            }\n          }\n        }\n\n        // Month over month period\n        if (currentYearPeriod === 'months') {\n          // Only include data sets for the currently selected period.\n          if (dataSet.year !== year) {\n            return false;\n          }\n\n          // Only include annual budgets. Do not include annual actuals.\n          if (dataSet.type !== 'budget' && !dataSet.month) {\n            return false;\n          }\n        }\n      }\n\n      if (reportType === 'balance' && (dataSet.month || dataSet.type === 'budget')) {\n        return false;\n      }\n\n      if (!(currentYearPeriod === 'months' && reportType === 'ytd')) {\n        if (dataSet.year < fiscalYearRange.start || dataSet.year > fiscalYearRange.end) {\n          return false;\n        }\n      }\n      return true;\n    });\n    let returnDataSets = filteredDataSets;\n    if (reportType === 'ytd') {\n      let orderedDataSets = [];\n      if (currentYearPeriod === 'months') {\n        // Group datasets by their month. Any annuals will be thrown into their own group.\n        const dataSetsByMonth = _.groupBy(filteredDataSets, dataSet => dataSet.month || 'annual');\n\n        // what actual months are present\n        let existingActualMonths = [];\n        eachFiscalMonth(fiscalYearStartMonth, (monthIndex) => {\n          _.each(dataSetsByMonth[monthIndex], _.bind((ds) => {\n            if (ds.type === 'actual') {\n              existingActualMonths.push(ds.month);\n            }\n          }, this));\n        });\n\n        eachFiscalMonth(fiscalYearStartMonth, (monthIndex) => {\n          _.each(dataSetsByMonth[monthIndex], _.bind(function(ds) {\n            // we push only these projections that do not cross with actuals\n            if (!isProjectionType(ds.type) || (isProjectionType(ds.type) && !~existingActualMonths.indexOf(ds.month))) {\n              orderedDataSets.push(ds);\n            }\n          }, this));\n        });\n\n        _.each(dataSetsByMonth['annual'], function(ds) {\n          orderedDataSets.push(ds);\n        });\n      } else if (currentYearPeriod === 'years') {\n        // filter out projected months if actual months are present\n        let lastActualYearPresent = 0;\n        orderedDataSets = _.filter(filteredDataSets, (ds) => {\n          if (isActualType(ds.type)) {\n            // update the last present actual year so that we can eliminate the projection dataset for the same year\n            lastActualYearPresent = ds.year;\n          }\n          return (!isProjectionType(ds.type) || (isProjectionType(ds.type) && ds.year !== lastActualYearPresent));\n        });\n      }\n\n      //replace unordered datasets\n      returnDataSets = orderedDataSets;\n    }\n    return returnDataSets;\n  },\n\n\n  monthToPeriod(month) {\n    return (12 + month - this.entity.fiscal_year_start_month) % 12 + 1;\n  },\n\n  hasAggregations() {\n    if (!this.aggregations || _.isEmpty(this.aggregations.amounts)) {\n      return false;\n    }\n    const accountType = this.state.get('accountType');\n\n    if (accountType !== 'types') {\n      const accountTypeAggregations = this.aggregations.amounts[accountType];\n\n      if (_.isEmpty(accountTypeAggregations)) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n  /**\n  * The alignCategories optional argument will first move lines into sublines that aren't\n  * at the top (numerically lowest) depth. This is useful for expansion displays where we\n  * don't want all elements are the same depth/scope.\n  * this is called from:\n  * 1) athena_state.renderedData\n  * 2)\n  */\n  renderedData(reportState, fiscalYearStartMonth, isTable, alignCategories) {\n    if (!this.hasAggregations()) {\n      return {lines: [], sublines: {}, fixed: {}, totals: []};\n    }\n\n    const month = reportState.get('month');\n    const reportType = reportState.get('reportType');\n    const currentYearPeriod = reportState.get('currentYearPeriod');\n    const currentYearAmount = reportState.get('currentYearAmount');\n\n    var lines = [];\n    var sublines = {};\n    var fixed = {};\n    var totals = [];\n    const accountType = reportState.get('accountType');\n    const versusView = reportState.get('versusView');\n    const dataSets = this.renderedDataSets(reportState, fiscalYearStartMonth);\n    let amounts = _.clone(this.aggregations.amounts[accountType]);\n    const subamounts = _.clone(this.aggregations.subamounts) || {};\n    let colors = {};\n    let ytdMultiplier;\n    let deltaMultipliers;\n    let nodes;\n    let titleNodes;\n    let titleNodeIds;\n    let forcedDepth;\n\n    if (month && reportType === 'ytd') {\n      if (currentYearAmount === 'monthly') {\n        ytdMultiplier = 1 / 12;\n      } else if (currentYearPeriod === 'months') {\n        ytdMultiplier = 1;\n      } else if (currentYearAmount === 'cumulative' && currentYearPeriod === 'years') {\n        ytdMultiplier = this.monthToPeriod(month) / 12;\n      }\n    }\n\n    if (versusView) {\n      nodes = versusView.get('trees').map((tree) => this.trees[tree]).toArray();\n      forcedDepth = 1;\n\n      titleNodes = _.map(nodes, function(node: any) {\n        const title = node.titleNode();\n        return title.name ? title : node.children[0];\n      });\n      titleNodeIds = _.map(titleNodes, 'id');\n      colors = _.zipObject(titleNodeIds, _.map(nodes, 'color'));\n      deltaMultipliers = _.zipObject(titleNodeIds, _.map(nodes, 'deltaMultiplier'));\n\n      // Create a 'id' => [amounts] mapping immitating a normal select response\n      // We have to do a lot of manipulation to remap the tapi responses into the forms that tables\n      // and graphs expect while respecting our virtual nodes for versus view.\n      if (alignCategories) {\n        amounts = this.adjustVirtualAggregateNodeAmounts(this.aggregations.amounts, nodes, titleNodes, deltaMultipliers);\n      } else {\n        amounts = this.reaggregateBreakdownAmounts(this.aggregations.amounts, _.map(nodes, 'id'), titleNodeIds);\n      }\n    }\n\n    if (alignCategories) {\n      this.applyTitleColor(amounts, nodes, titleNodes, colors);\n      this.alignAmountsByDepth(amounts, subamounts, fixed, forcedDepth);\n    }\n\n    // If amounts for both revenues and expenses are present and expenses comes first\n    // we adjust the object fields so that revenues always displays before expenses in the summary table\n    const amountKeys = amounts && Object.keys(amounts);\n\n    if (\n      versusView &&\n      alignCategories &&\n      amountKeys && amountKeys.length === 2 &&\n      this.nodes[amountKeys[0]].tree_id &&\n      this.nodes[amountKeys[0]].tree_id === 'expenses' &&\n      this.nodes[amountKeys[1]].tree_id &&\n      this.nodes[amountKeys[1]].tree_id === 'revenues'\n    ) {\n      amounts = {\n        [amountKeys[1]]: amounts[amountKeys[1]],\n        [amountKeys[0]]: amounts[amountKeys[0]]\n      };\n    }\n\n    this.buildLines(reportState, lines, totals, amounts, dataSets, ytdMultiplier, colors, deltaMultipliers);\n\n    _.each(subamounts, _.bind(function(parentAmounts, parentId) {\n      // Fake totals and assign line results into sublines by parent id\n      this.buildLines(reportState, sublines[parentId] = [], [], parentAmounts, dataSets, ytdMultiplier, colors);\n    }, this));\n\n    return { lines, sublines, fixed, totals };\n  },\n\n  applyTitleColor(amounts, nodes, titleNodes, colors) {\n    const self = this;\n    const selectedCheck = function(node) { return node.selected || node.partiallySelected; };\n\n    if (!nodes) {\n      nodes = _.map(_.keys(amounts), function(nodeId) {\n        return self.nodes[nodeId];\n      });\n    }\n    if (!titleNodes) {\n      titleNodes = nodes;\n    }\n\n    _.each(titleNodes, function(node) {\n      // Make sure we mark the node as colored\n      colors[node.id] = colors[node.id] || node.color;\n      while (node.parent && _.filter(node.parent.children, selectedCheck).length <= 1) {\n        colors[node.parent.id] = colors[node.id] || node.color;\n        node = node.parent;\n      }\n    });\n  },\n\n  // This function adjusts aggregates for virtual nodes to align properly and apply parent\n  // coloring and delta modifications.\n  adjustVirtualAggregateNodeAmounts(breakDownAmounts, nodes, titleNodes, deltaMultipliers) {\n    const amounts = {};\n    _.each(nodes, _.bind(function(node, index) {\n      const title = titleNodes[index];\n      let breakdown = breakDownAmounts[node.aggregationGroup || node.id];\n\n      _.each(node.children, (child) => {\n        deltaMultipliers[child.id] = node.deltaMultiplier;\n      });\n      deltaMultipliers[node.id] = node.deltaMultiplier;\n\n      // TAPI doesn't know about our virtual root nodes for account type trees, so we have to\n      // aggregate the child nodes when they are all present and below our virtual node's children.\n      if (title.depth > 0 && _.every(title.children, function(child: any) { return child.disabled || _.has(breakdown, child.id); })) {\n        breakdown = this.reaggregateBreakdownAmounts(breakDownAmounts, [node.id], [title.id]);\n      }\n      _.assign(amounts, breakdown);\n    }, this));\n    return amounts;\n  },\n\n  // Moves aggregates from breakdown/node ids to remapped node ids.\n  reaggregateBreakdownAmounts(amounts, originalIds, remapIds) {\n    return (_.zipObject as any)(remapIds, _.map(originalIds, _.bind(function(nodeId: any) {\n      return _.reduce(amounts[nodeId], _.bind(function(result, dsValues) {\n        _.each(dsValues, function(value, ds) {\n          result[ds] = (result[ds] || 0) + value;\n        });\n        return result;\n      }, this), {});\n    }, this)), this);\n  },\n\n  // Move amounts that are at the top (numerically lowest) depth into subamounts\n  alignAmountsByDepth(amounts, subamounts, fixed, forcedDepth) {\n    let node;\n    let parent;\n    let nodes = this.nodes;\n\n    const minDepth = forcedDepth || (_.chain(amounts).keys().map(function(nodeId) {\n      return nodes[nodeId].depth;\n    }) as any).min().value();\n\n    const assignAmounts = function(currentAmounts, node, allowAccumulate, value, dataSetId) {\n      currentAmounts[node.id] = currentAmounts[node.id] || {};\n      const currentAmount = currentAmounts[node.id][dataSetId] || 0;\n      let depth = minDepth;\n\n      // If node is a parent, excluding virtual nodes (expenses/revenues), adjust depth so amounts get properly calculated\n      if (node.parent_id && (node.partialChildCount > 0 || node.selectedChildCount > 0)) {\n        depth += node.depth;\n      }\n\n      // If we are at the depth containing the \"virtual\" table rows which do not\n      // get their values from TAPI, we append the amount from the child rows. Otherwise\n      // we just assign the value into the amounts object.\n      if (node.depth <= depth) {\n        if (allowAccumulate) {\n          currentAmounts[node.id][dataSetId] = currentAmount + value;\n        } else {\n          currentAmounts[node.id][dataSetId] = currentAmount || value;\n        }\n      } else {\n        currentAmounts[node.id][dataSetId] = value;\n      }\n    };\n\n    _.each(_.keys(amounts), _.bind(function(nodeId) {\n      node = nodes[nodeId];\n      const leafAmounts = amounts[node.id];\n      while (node.depth !== minDepth) {\n        parent = node.parent;\n        if (!parent || !parent.id) { break; }\n\n        // This accumulates \"leaf\" amounts into the amounts we'll see in the table.\n        // We use fixed here to inform us if the child was \"fixed\" already by this process. Since the leaf\n        // amounts are returned by the base TAPI v1 response, the subamounts are always less than or equal to the depth\n        // of the nodes from the base TAPI response. In the case of Revenues vs. Expenses views though, they can overlap on\n        // the same category.\n        //\n        // \"fixed\" is not set on the initial subamounts present in the TAPI v1 response, thus we should not double-accumulate them\n        // when they happen to overlap.\n        fixed[parent.id] = true;\n        subamounts[parent.id] = subamounts[parent.id] || {};\n        _.each(leafAmounts, _.bind(_.partial(assignAmounts, subamounts[parent.id], node, fixed[node.id]) as any, this));\n        _.each(leafAmounts, _.bind(_.partial(assignAmounts, amounts, parent, true) as any, this));\n        delete amounts[node.id];\n        node = parent;\n      }\n    }, this));\n  },\n\n  // Generates the RenderLine object and assigns all attributes required for rendering\n  buildLines(\n    reportState,\n    lines,\n    totals,\n    amounts,\n    dataSets,\n    ytdMultiplier,\n    colors,\n    deltaMultipliers) {\n    const accountType = reportState.get('accountType');\n    let varianceFormula;\n    const includeDelta = !_.isUndefined(deltaMultipliers);\n    const proration = reportState.get('proration');\n    const athenaState = reportState.get('athenaState');\n    const projections = athenaState && athenaState.get('projections');\n\n    if (accountType !== 'types') {\n      varianceFormula = (amounts) => this.formulas.budgetVsActualVariance({accountType, amounts});\n    }\n\n    _.each(dataSets, function(dataSet, index) {\n      totals[index] = {amount: 0, type: dataSet.type, absoluteAmount: 0, delta: 0, pos_only: 0, neg_only: 0};\n      //pos_only + neg_only is summation of values that are only +/- respectively in each x axis item\n    });\n\n    _.each(amounts, _.bind(function(nodeAmounts, nodeId) {\n      const node = this.nodes[nodeId];\n\n      if (!node) {\n        return;\n      }\n\n      const renderLine = new RenderLine(node);\n      const aggregateAmounts = _.isArray(nodeAmounts) ? nodeAmounts : [nodeAmounts];\n\n      if (accountType === 'types') {\n        varianceFormula = (amounts) => this.formulas.budgetVsActualVariance({accountType: node.aggregationGroup, amounts});\n      }\n\n      renderLine.aggregateData(\n        aggregateAmounts,\n        reportState.get('currentYearAmount'),\n        reportState.get('currentYearPeriod'),\n        dataSets,\n        ytdMultiplier,\n        this.annotatedNodes[nodeId],\n        varianceFormula,\n        reportState.get('amountUnit'),\n        proration,\n        projections\n      );\n\n      const itemSelected = reportState.getIn(['scale', 'selected', 0]);\n      const dataSelected = reportState.getIn(['metricData', 'data', itemSelected]);\n      const scalesByYear = dataSelected && dataSelected.get('years').reduce((r, v) => {\n        return r.set(v.get('year'), v.get('value'));\n      }, Map());\n\n      if (reportState.get('yAxisScale')) {\n        let total = 0;\n        _.forEach(renderLine.amounts, (renderLineAmount) => {\n          // If the metrics API did not have population data for each year fallback to\n          // using the Delphius entity population setting for computing the scaled values.\n          const scaleValue = (scalesByYear && scalesByYear.get(renderLineAmount.year)) || this.entity.population;\n\n          let value = renderLineAmount.value / scaleValue;\n          value = !_.isFinite(value) ? 0 : Math.floor((value) * 100) / 100; //Making Infinity -> 0 (this happens when divide by 0)\n          renderLineAmount.value = value;\n          total += value;\n\n          if (renderLineAmount.variance) {\n            let varianceValue = renderLineAmount.variance / scaleValue;\n            renderLineAmount.variance = Math.floor(varianceValue * 100) / 100;\n          }\n        });\n        renderLine.total = total;\n      }\n\n      // Allow color fixing\n      if (_.has(colors, nodeId)) {\n        renderLine.fixedColor = true;\n        renderLine.color = colors[nodeId];\n      }\n\n      lines.push(renderLine);\n      _.each(renderLine.amounts, _.bind(function(amount, index) {\n        totals[index].amount += amount.value;\n        amount.value > 0 ? totals[index].pos_only += amount.value : totals[index].neg_only += amount.value;\n        totals[index].absoluteAmount += Math.abs(amount.value);\n        if (!_.isUndefined(amount.variance)) {\n          totals[index].variance = 0;\n        }\n        if (includeDelta) {\n          totals[index].delta += deltaMultipliers[nodeId] * amount.value;\n        }\n      }, this));\n    }, this));\n\n    this.computeVarianceTotals(totals, accountType, includeDelta);\n  },\n\n  computeVarianceTotals(totals: ILineTotal[], accountType, includeDelta) {\n    // Compute the Budget vs Actual variances for the totals.\n    // For Revenue vs Expense view we use the revenue variance formula to compute the total row variance.\n    const totalVarianceAccountType = accountType === 'types' ? 'revenues' : accountType;\n\n    totals.forEach((total, index) => {\n      const isBudget = total.type === 'budget';\n\n      if (index && !_.isUndefined(total.variance)) {\n        // below is the ideal solution, but it relies on Lodash 4, and we're running Lodash 3.\n        // what we have now assumes a steady budget/actual/budget/actual cadence.\n        // when we update Lodash, uncomment the below line (and remove the one below it).\n        //const previousTotal = (_ as any).findLast(totals, t => t.type !== total.type, index - 1);\n        const previousTotal = totals[index - 1];\n\n        const currentTotalAmount = includeDelta ? total.delta : total.amount;\n\n        if(previousTotal) {\n          const previousTotalAmount = includeDelta ? previousTotal.delta : previousTotal.amount;\n          var variance = this.formulas.budgetVsActualVariance({\n            accountType: totalVarianceAccountType,\n            amounts: {\n              budget: isBudget ? currentTotalAmount : previousTotalAmount,\n              actual: isBudget ? previousTotalAmount : currentTotalAmount\n            }\n          });\n          total.variance = variance.value;\n          total.percentVariance = variance.percent;\n        }\n      }\n    });\n  },\n\n  buildDataSets() {\n    const typeYearMonths = this.typeYearMonths = {};\n    const pkg = this.pkg;\n    const actualMonths = {};\n    const years = {};\n\n    this.report.dataSets.forEach(function(dataSet, order) {\n      const pkgDataSet = pkg.data_sets[dataSet.id];\n\n      if (pkgDataSet) {\n        years[pkgDataSet.year] = 1;\n\n        pkgDataSet.order = order;\n        pkgDataSet.name = dataSet.get('name');\n        pkgDataSet.label = dataSet.get('label');\n      }\n    });\n\n    // TODO remove/update when sorting made configurable per report\n    this.dataSets = this.multiFieldSort(_.values(pkg.data_sets),\n        ['order', 'year', 'month', ['type', -1], 'created']);\n\n    _.forEach(this.dataSets, _.bind(function(dataSet) {\n      if (dataSet.month) {\n        const type = typeYearMonths[dataSet.type] = typeYearMonths[dataSet.type] || {};\n        const year = type[dataSet.year] = type[dataSet.year] || {};\n        year[dataSet.month] = dataSet.id;\n        actualMonths[dataSet.month] = true;\n      }\n    }, this));\n    this.months = this.sortMonthsByFiscalYear(_.keys(actualMonths));\n    this.years = _.sortBy(_.map(_.keys(years), (i) => parseInt(i))).reverse();\n\n\n    _.forEach(this.dataSets, (dataSet) => {\n      if (dataSet.month) {\n\n        eachPreviousFiscalMonth(this.fiscalYearStartMonth, dataSet.month, (i) => {\n          const type = dataSet.type;\n          if (typeYearMonths[type]) {\n            if (typeYearMonths[type][dataSet.year]) {\n              if (typeYearMonths[type][dataSet.year][i]) {\n                dataSet.previousDataSetId = typeYearMonths[type][dataSet.year][i];\n                return false;\n              }\n            }\n          }\n        });\n      }\n    });\n  },\n\n  multiFieldSort(objArr, fields) {\n    objArr.sort(function(a, b) {\n      for (let i = 0; i < fields.length; i++) {\n        let field = fields[i];\n        let direction: any = 1;\n        if (_.isArray(field)) {\n          direction = field[1];\n          field = field[0];\n        }\n\n        // Handles undefined as a sort attribute\n        const aval = a[field] || 0;\n\n        const bval = b[field] || 0;\n\n        if (aval < bval) {\n          return -1 * direction;\n        } else if (aval > bval) {\n          return 1 * direction;\n        }\n      }\n      return 0;\n    });\n    return objArr;\n  },\n\n  hasMonthlyData() {\n    return this.months.length;\n  },\n\n  mostRecentMonthWithActuals() {\n    if (_.isEmpty(this.typeYearMonths.actual)) {\n      return;\n    }\n\n    let year = this.mostRecentYearWithMonthlyActuals();\n    let months = _.keys(this.typeYearMonths.actual[year]);\n\n    months = this.sortMonthsByFiscalYear(months);\n    return _.last(months);\n  },\n\n  mostRecentYearWithMonthlyActuals() {\n    return _.max(_.keys(this.typeYearMonths.actual));\n  },\n\n  sortMonthsByFiscalYear(months) {\n    const self = this;\n    return _.sortBy(months, function(month) { return self.monthToPeriod(month); });\n  },\n\n  monthlyDataSetExists(type, year, month) {\n    // typeYearMonths contains the map of dataSets types => years => months => [dataSet.id]\n    const years = this.typeYearMonths[type];\n    if (!years) {\n      return false;\n    }\n    const months = years[year];\n    if (!months) {\n      return false;\n    }\n    return !!(months[month]);\n  },\n\n  buildTrees(pkg) {\n    let self = this;\n    let sorted = _.sortBy(pkg.trees, 'order');\n    let breakdowns = [];\n    let accountTypeTree;\n    let treeDeltaMultipliers = { assets: 1, revenues: 1, liabilities: -1, expenses: -1 };\n\n    let treeColors = { assets: this.revenueLineColor, revenues: this.revenueLineColor,\n        liabilities: this.expenseLineColor, expenses: this.expenseLineColor };\n\n    this.trees = {};\n    this.treeList = [];\n    this.accountTrees = [];\n\n    _.each(sorted, function(tree: any) {\n      if (tree.isAccountTypeTree) {\n        accountTypeTree = self.trees[tree.id] = new BudgetNode(tree);\n        if (accountTypeTree.id === 'liabilities') {\n          // Override name to include equities.\n          accountTypeTree.set('name', 'Liabilities & Equities');\n        }\n        accountTypeTree.deltaMultiplier = treeDeltaMultipliers[tree.id];\n        accountTypeTree.color = treeColors[tree.id];\n        self.treeList.push(accountTypeTree);\n        self.accountTrees.push(accountTypeTree);\n      } else {\n        tree.breakdownId = tree.id;\n        const budgetTree = new BudgetNode(tree);\n        self.trees[tree.id] = budgetTree;\n        self.treeList.push(budgetTree);\n\n        breakdowns.push({\n          id: tree.id,\n          name: tree.name,\n          trees: [budgetTree],\n          visible: tree.visible\n        });\n      }\n    });\n\n    this.trees.types = new BudgetNode({id: 'types', name: ''});\n    this.accountTrees.push(this.trees.types);\n\n    let visible = accountTypeTree ? accountTypeTree.visible : false;\n\n    const accountTypeBreakdown = this.accountTypeBreakdown = {\n      id: 'types',\n      name: 'Types',\n      isAccountType: true,\n      trees: this.accountTrees,\n      visible: visible\n    };\n    breakdowns.push(accountTypeBreakdown);\n\n    this.breakdowns = new Breakdown.Collection(breakdowns);\n\n    this.buildNodes(pkg);\n  },\n\n  buildNodes(pkg) {\n    this.nodes = pkg.nodes;\n    this.nodeList = [];\n    this.nodeByCode = {};\n    this.buildRootNodes(pkg);\n    _.each(this.trees, _.bind(function(tree) {\n      this.nodes[tree.id] = tree;\n    }, this));\n  },\n\n  nodeValidWithAccountType(node, accountType) {\n    // All nodes are valid in 'types' mode.\n    if (accountType === 'types') {\n      return true;\n    }\n\n    // Nodes without an aggregation group are always valid\n    if (!node.aggregationGroup) {\n      return true;\n    }\n\n    // Node is valid if the aggregation group matches the accountType\n    if (node.aggregationGroup === accountType) {\n      return true;\n    }\n\n    return false;\n  },\n\n  findTreeByName(name) {\n    name = _s.trim(name).toLowerCase();\n    return _.find(this.trees, function(tree: any) {\n      return _s.trim(tree.name).toLowerCase() === name;\n    });\n  },\n\n  // Delete breakdowns and trees from the lists and objects that keep track of them\n  removeBreakdown(id) {\n    const self = this;\n    this.breakdowns.remove(id);\n    this.treeList = _.filter(this.treeList, function(tree: any) {\n      if (tree.breakdownId === id) {\n        delete self.trees[tree.id];\n        return false;\n      }\n      return true;\n    });\n  },\n\n  updateEnabledState(enabledNodes) {\n    _.each(this.nodes, function(node) {\n      node.disabled = true;\n    });\n\n    _.each(enabledNodes, _.bind(function(t, id) {\n      let node = this.nodes[id];\n\n      if (node) {\n        node.disabled = false;\n\n        while (node.parent && node.parent.disabled) {\n          node.parent.disabled = false;\n          node = node.parent;\n        }\n      }\n    }, this));\n    this.trigger('disableNodes');\n  },\n\n  activeAnnotations() {\n    return this.get('activeAnnotations') || [];\n  },\n\n  filterActiveAnnotations(reportState, breakdown) {\n    const self = this;\n    this.annotatedNodes = {};\n    const annotations = reportState.get('annotations');\n    const athenaState = reportState.get('athenaState');\n    const entity = athenaState && athenaState.get('entity');\n\n    let dataSets = this.renderedDataSets(reportState, entity && entity.fiscal_year_start_month);\n    const accountType = this.state.get('accountType');\n\n    let activeAnnotations = _.filter(annotations, function(annotation: any) {\n      let subTree = false;\n      const codes = annotation.annotations_account_codes;\n      let codeIdentifier;\n      const nodes = [];\n\n      let active = _.every(codes, _.bind(function(code: any, index) {\n        if (!subTree) {\n          codeIdentifier = code.tree_id;\n        }\n\n        codeIdentifier += '_' + code.account_code;\n\n        if (index < codes.length - 1) {\n          if (codes[index + 1].tree_id === code.tree_id) {\n            subTree = true;\n            return true;\n          }\n        }\n\n        const node = self.nodeByCode[codeIdentifier];\n        if (!node) {\n\n          return false;\n        }\n\n        if (accountType !== 'types' && node.aggregationGroup && node.aggregationGroup !== accountType) {\n\n          return false;\n        }\n\n        codeIdentifier = '';\n        subTree = false;\n        nodes.push(node);\n        return node.selected && !node.disabled;\n      }, this));\n\n      const query: any = {\n        year: annotation.year,\n        type: annotation.data_set_type,\n      };\n      if (annotation.month) {\n        query.month = annotation.month;\n      }\n      const dataSet: any = _.find(dataSets, query);\n      if (_.isUndefined(dataSet)) {\n        active = false;\n      }\n\n      annotation.nodes = nodes;\n      annotation.dataSet = dataSet;\n\n      if (active) {\n        let primaryNode;\n        const secondaryNodes = [];\n\n        _.each(nodes, function(node) {\n          if (node.tree_id === breakdown) {\n            primaryNode = node;\n          } else if (breakdown === 'types' && node.aggregationGroup) {\n            primaryNode = node;\n          } else {\n            secondaryNodes.push(node);\n          }\n          while (node) {\n            let dataSets = self.annotatedNodes[node.id];\n            if (!dataSets) {\n              dataSets = self.annotatedNodes[node.id] = {};\n            }\n            let dataSetAnnotations = dataSets[dataSet.id];\n            if (!dataSetAnnotations) {\n              dataSetAnnotations = dataSets[dataSet.id] = [];\n            }\n            dataSetAnnotations.push(annotation);\n            node = node.parent;\n          }\n        });\n\n        annotation.primaryNode = primaryNode ? primaryNode : secondaryNodes.shift();\n        annotation.secondaryNodes = secondaryNodes;\n      }\n\n      return active;\n    });\n\n    activeAnnotations = _.sortBy(activeAnnotations, function(annotation) {\n      return annotation.primaryNode && annotation.primaryNode.id;\n    });\n\n    this.set('activeAnnotations', activeAnnotations);\n\n    return activeAnnotations;\n  },\n\n  error(msg) {\n    this.onError(new Error(msg), msg);\n  },\n\n  buildRootNodes(pkg) {\n    const sorted = _.sortBy(pkg.nodes, this.defaultNodeSortBy);\n    _.each(sorted, _.bind(function(node: any) {\n      if (!node.parent_id) {\n        const tree = this.trees[node.aggregationGroup || node.tree_id];\n        if (tree) {\n          this.buildNode(node, tree);\n        }\n      }\n    }, this));\n  },\n\n  buildNode(attributes, parentNode, codesLineage) {\n    const node = parentNode.createChild(attributes);\n    const hasCodes = !_.isEmpty(attributes.account_codes);\n\n    this.nodeList.push(node);\n    this.nodes[node.id] = node;\n\n    // Push our account codes in lineage\n    if (hasCodes) {\n      codesLineage = codesLineage ? _.clone(codesLineage) : [];\n      codesLineage.push(attributes.account_codes);\n\n      node.accountCodeChains = [];\n\n      _.each(this.permuteArrays(codesLineage), _.bind(function(codeChain) {\n        const tree_id = this.trees[node.tree_id].long_id;\n        this.nodeByCode[tree_id + '_' + codeChain.join('_')] = node;\n        //this.nodeByCode[node.tree_id + '_' + codeChain.join('_')] = node;\n        node.accountCodeChains.push(codeChain);\n      }, this));\n    }\n\n    _.each(attributes.children, _.bind(function(childId) {\n      this.buildNode(this.nodes[childId], node, codesLineage);\n    }, this));\n\n    node.children = _.sortBy(node.children, this.defaultNodeSortBy);\n\n    return node;\n  },\n\n  permuteArrays(arrays) {\n    return _.reduce(arrays, function(accum, array: any[]) {\n      const perm = [];\n      for (let i = 0; i < accum.length; i++) {\n        for (let j = 0; j < array.length; j++) {\n          perm.push(accum[i].concat(array[j]));\n        }\n      }\n      return perm;\n    }, [[]]);\n  },\n\n  setVisibleAccounts(accounts) {\n    let trees = this.trees;\n\n    // For each visible account mark its tree as being visible to the user.\n    _.each(trees, function(tree) {\n      // Hide any trees for accounts which we want hidden.\n      // For example if we are in an Annual report we don't want the Balance Sheet\n      // account type trees to show up.\n      if (tree.isAccountTypeTree) {\n        tree.visible = _.includes(accounts, tree.id);\n      }\n    });\n\n    this.visibleAccounts = _.values(_.pickBy(trees, (tree, key) => _.includes(accounts, key)));\n    this.invisibleAccounts = _.filter(_.values(_.omit(trees, accounts)), 'isAccountTypeTree');\n  },\n\n  // Get the current fiscal year range of data sets that should be rendered.\n  // Returns an empty object if no fiscal year range is currently set.\n  getFiscalYearRange() {\n    const period = this.get('timePeriod');\n    if (_.isEmpty(period)) {\n      return {};\n    }\n    return {start: period[0], end: period[1]};\n  }\n});\n\nfunction eachFiscalMonth(fiscalYearStartMonth, cb) {\n  for (let i = 0; i < 12; ++i) {\n    const monthIndex = (i + fiscalYearStartMonth - 1) % 12 + 1;\n\n    if (cb(monthIndex) === false) {\n      break;\n    }\n  }\n}\n\nfunction eachPreviousFiscalMonth(fiscalYearStartMonth, initialMonth, cb) {\n  let i = (12 + initialMonth - fiscalYearStartMonth) % 12;\n\n  while (i > 0) {\n    i -= 1;\n\n    const monthIndex = (i + fiscalYearStartMonth - 1) % 12 + 1;\n\n    if (cb(monthIndex) === false) {\n      break;\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/budget_data.ts","// A RenderLine representing a row in the table or a line on the graph. For a\n// given node it has aggregations, averages, and variances for each data-set\n// where appropriate. Used by tables, graphs, and exports\n\nimport _ from 'lodash';\nimport Backbone from 'backbone';\n\nimport ogColors from '../og_colors';\n\nimport { isProjectionDataset, isActualType, isProjectionType, isBudgetType } from '../utils/dataset_utils';\n\nexport default Backbone.Model.extend({\n  initialize(node) {\n    this.id = node.id;\n    this.category = node.depth;\n    this.name = node.name;\n    this.order = node.order;\n    this.color = node.color;\n    this.accountCodeChains = node.accountCodeChains;\n    this.childless = node.disabled || _.isEmpty(node.children);\n    this.ungrouped = node.ungrouped;\n    this.htmlColor = ogColors.intToHtmlColor(node.color || 0);\n  },\n\n  /**\n  * reset(dataSets, annotations) reset amounts, total, and types every time we recalculate aggregations.\n  * See aggregateData function\n  */\n  reset(dataSets, annotations) {\n    this.amounts = [];\n    this.total = 0;\n    this.types = []; // TODO remove the need for this types;\n\n    _.each(dataSets, (dataSet, index) => {\n      var amount: any = this.amounts[index] = { value: 0, type: dataSet.type, year: dataSet.year };\n      if (annotations && annotations[dataSet.id]) {\n        amount.annotation = annotations[dataSet.id];\n      }\n      if (dataSet.month) {\n        amount.month = dataSet.month;\n      }\n      this.types[index] = dataSets[index].type;\n    });\n  },\n\n  /**\n  * Options are:\n  * nodeAggregations\n  * currentYearAmount\n  * currentYearPeriod\n  * dataSets\n  * ytdMultiplier\n  * varianceFormula\n  * amountUnit\n  * proration\n  * projections\n  * NOTE: dataSets are already pre-sorted here\n  */\n  aggregateNodeData(options: any = {}) {\n    var lastActualDataSetId = null;\n    _.each(options.dataSets, (dataSet, index: any) => {\n      let value = this.normalizeValue(options.nodeAggregations[dataSet.id]);\n      let amount = this.amounts[index];\n\n      if (options.ytdMultiplier) {\n        const prorate = options.proration || amount.type === 'actual';\n        if (!dataSet.month && prorate) {\n          value = value * options.ytdMultiplier;\n        }\n\n        // Incremental only\n        if (options.currentYearAmount === 'monthly' && dataSet.month) {\n          const previousDataSetId = isProjectionDataset(dataSet) ? dataSet.prevProjectedDataSetId : dataSet.previousDataSetId;\n          if (previousDataSetId) {\n            const previousValue = options.nodeAggregations[previousDataSetId];\n\n            if (previousValue) {\n              value -= this.normalizeValue(previousValue);\n            }\n          }\n        }\n\n        if (options.currentYearAmount === 'cumulative' && options.currentYearPeriod === 'months') {\n          // Account projections based on the last actual amount\n          if (dataSet.type === 'actual' && dataSet.month) {\n            lastActualDataSetId = dataSet.id;\n          }\n          /**\n          * We switching from actual to projection dataSet.\n          * We need this calculation only if we have actuals\n          */\n          if (lastActualDataSetId && isProjectionDataset(dataSet)) {\n            const previousProjectedValue = options.nodeAggregations[dataSet.prevProjectedDataSetId];\n            if (previousProjectedValue) {\n              value -= this.normalizeValue(previousProjectedValue);\n            }\n\n            if (index) {\n              const previousAmount = this.amounts[index - 1];\n              value += previousAmount.value || 0;\n            }\n          }\n        }\n\n        if (options.currentYearAmount === 'cumulative' && options.currentYearPeriod === 'years') {\n          if (isProjectionType(dataSet.type) && dataSet.lastActualDataSetId) {\n            //trace back to find the value\n            if (dataSet.lastOverlappingProjectionDataSetId) {\n              value -= this.normalizeValue(options.nodeAggregations[dataSet.lastOverlappingProjectionDataSetId]);\n            }\n            value += this.normalizeValue(options.nodeAggregations[dataSet.lastActualDataSetId]);\n          }\n        }\n\n\n        // Calculate variance and percent variance\n        if (index) {\n           /**\n          * It is tempting to simplify/reduce following previousAmount logic\n          * along with removing findLastActualOrProjectedForThisYear piece to\n          *\n          * var previousAmount =  this.amounts[index - 1];\n          *\n          * However there's is a specific behavior for variances asked by product,\n          * where variances for multiple budgets should be\n          * computed and displayed based on earlier actual/projection column.\n          * See below report (assuming it will be around, scroll to the rightmost end):\n          * https://controlpanel.opengov.com/reports#/fortlauderdalefl/219/accountType=expenses&breakdown=911d1fb6-ca12-49e4-b8a4-d1a9e819e775&currentYearAmount=cumulative&currentYearPeriod=months&graph=bar&legendSort=desc&month=6&proration=true&saved_view=null&selection=803A263349A59870602D0DF5AD2E1391&fiscal_start=earliest&fiscal_end=latest\n          */\n          var previousAmount = isBudgetType(amount.type) ? this.findLastActualOrProjectedForThisYear(options.dataSets, dataSet.year, index) : this.amounts[index - 1];\n          var showVariance = this.shouldComputeVariance(amount, previousAmount);\n          if (showVariance) {\n            var budget = isBudgetType(amount.type) ? value : previousAmount.value;\n            var actual = isBudgetType(amount.type) ? previousAmount.value : value;\n            var variance = options.varianceFormula({ budget: budget, actual: actual });\n            amount.variance = variance.value;\n            amount.percentVariance = variance.percent;\n            amount.compareTo = previousAmount.type;\n          }\n        }\n      }\n\n      amount.value += value;\n      this.total += value;\n    });\n  },\n\n  /**\n   * find the last actual or projected for the provided year through amounts chain\n   */\n  findLastActualOrProjectedForThisYear(dataSets, year, currentIndex) {\n    let index = currentIndex - 1;\n\n    while (index >= 0) {\n      const previous = this.amounts[index];\n      if ((isActualType(previous.type) || isProjectionType(previous.type)) && dataSets[index].year === year) {\n        return previous;\n      }\n      index -= 1;\n    }\n  },\n\n  /* Decide if variance columns should be calculated */\n  shouldComputeVariance(amount, previousAmount) {\n    /**\n    * Current defined variance display logic:\n    * if annual budget, compute variance if actual/projection follows budget for same year,\n    * if monthly budget, compute variance if actual/projection follows budget for same month/year,\n    * order of budget & actual/projection should not matter.\n    */\n    return previousAmount\n      && _.intersection([previousAmount.type, amount.type], ['actual', 'projection']).length > 0\n      && _.intersection([previousAmount.type, amount.type], ['budget']).length > 0\n      && (!amount.month || !previousAmount.month || amount.month == previousAmount.month)\n      && amount.year == previousAmount.year;\n  },\n\n  normalizeValue(value) {\n    return value / 100 || 0;\n  },\n\n  /**\n  * aggregateData(...args) goes through each aggregation, calculates amount, and updates a commulative total\n  * for all aggregations\n  * it is called from budget_date.buildLines function for every line\n  */\n  aggregateData(\n    aggregations,\n    currentYearAmount,\n    currentYearPeriod,\n    dataSets,\n    ytdMultiplier,\n    annotations,\n    varianceFormula,\n    amountUnit,\n    proration,\n    projections) {\n\n    this.reset(dataSets, annotations);\n\n    _.each(aggregations, (nodeAggregations) => this.aggregateNodeData({\n      nodeAggregations: nodeAggregations,\n      currentYearAmount: currentYearAmount,\n      currentYearPeriod: currentYearPeriod,\n      dataSets: dataSets,\n      ytdMultiplier: ytdMultiplier,\n      varianceFormula: varianceFormula,\n      amountUnit: amountUnit,\n      proration: proration,\n      projections: projections\n    }));\n\n    this.average = this.total / this.amounts.length;\n  },\n\n  /**\n  * assignNextColor(baseColor) find the color for the next aggregation\n  */\n  assignNextColor(baseColor) {\n    const colorCount = this.constructor.colors.length;\n    this.constructor.currentColor++;\n    const color = this.constructor.colors[this.constructor.currentColor % colorCount];\n    this.color = this.alphaBlend(color, baseColor, 0.08);\n    this.htmlColor = ogColors.intToHtmlColor(this.color);\n\n    return this.color;\n  },\n\n  alphaBlend(old, blend, alpha) {\n    let t = 1 - alpha;\n    let r = ((old & 0xFF0000) >> 16) * t;\n    let g = ((old & 0x00FF00) >> 8 ) * t;\n    let b = ((old & 0x0000FF) ) * t;\n\n    r = Math.floor(r + ((blend & 0xFF0000) >> 16) * alpha);\n    g = Math.floor(g + ((blend & 0x00FF00) >> 8 ) * alpha);\n    b = Math.floor(b + ((blend & 0x0000FF) ) * alpha);\n\n    return (r << 16) + (g << 8) + b;\n  }\n}, { colors: ogColors.colors, currentColor: -1 });\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/render_line.ts","import _ from 'lodash';\nimport Backbone from 'backbone';\n\nconst BudgetNode = Backbone.Model.extend({\n  initialize(attributes, parent) {\n    _.assign(this, attributes);\n    this.children = [];\n    this.selectedChildCount = 0;\n    this.partialChildCount = 0;\n    this.partiallySelected = false;\n    this.selected = false;\n\n    if (parent) {\n      this.setParent(parent);\n    } else {\n      this.isTree = true;\n      this.tree_id = this.id;\n      this.depth = 0;\n    }\n  },\n\n  setParent(parent) {\n    this.parent = parent;\n    this.depth = parent.depth + 1;\n    this.tree_id = parent.tree_id;\n  },\n\n  hasSelectedDescendants() {\n    return this.selected || this.partiallySelected;\n  },\n\n  selectRootMostCheckedNodes(results) {\n    results = results || [];\n\n    for (let i = 0, len = this.children.length; i < len; ++i) {\n      const child = this.children[i];\n\n      if (child.selected) {\n        results.push(child);\n      } else {\n        child.selectRootMostCheckedNodes(results);\n      }\n    }\n\n    return results;\n  },\n\n  titleNode() {\n    if (this.selected) {\n      if (this.children.length === 1) {\n        return this.children[0].titleNode();\n      }\n      return this;\n    }\n\n    if (this.partiallySelected) {\n      const childCount = this.selectedChildCount + this.partialChildCount;\n      if (childCount > 1) {\n        return this;\n      }\n\n      if (childCount === 1) {\n        return this.findActiveChild().titleNode();\n      }\n    }\n\n    return {};\n  },\n\n  findActiveChild() {\n    for (let i = 0, len = this.children.length; i < len; ++i) {\n      const child = this.children[i];\n      if (child.selected || child.partiallySelected) {\n        return child;\n      }\n    }\n  },\n\n  createChild(attributes) {\n    const node = new BudgetNode(attributes, this);\n    this.children.push(node);\n    return node;\n  },\n\n  ancestorNodes() {\n    const ancestors = [];\n    let node = this;\n    while (node.parent) {\n      ancestors.push(node.parent);\n      node = node.parent;\n    }\n    return ancestors;\n  },\n\n  leaves() {\n    return this.collectLeaves([]);\n  },\n\n  collectLeaves(accum) {\n    if (!_.isEmpty(this.children)) {\n      for (let i = 0; i < this.children.length; i++) {\n        this.children[i].collectLeaves(accum);\n      }\n    } else {\n      accum.push(this);\n    }\n    return accum;\n  },\n\n  siblingNodes() {\n    return this.parent ? this.parent.children : [];\n  },\n\n  deselect() {\n    this.setSelectionState(false);\n  },\n\n  select() {\n    this.setSelectionState(true);\n  },\n\n  // fromParent indicates whether this selection was made implicitly by its\n  // parent\n  setSelectionState(selected, fromParent) {\n    this.setChildSelectionStates(selected);\n    if (!fromParent) {\n      this.setParentSelectionStates();\n    }\n  },\n\n  setChildSelectionStates(selected) {\n    this.setImplicitSelectionState(selected, false);\n\n    const children = this.children;\n    // DO NOT USE underscore/lodash here\n    // This is a tight recursive inner loop\n    for (let i = 0, len = children.length; i < len; ++i) {\n      children[i].setSelectionState(selected, true);\n    }\n  },\n\n  setParentSelectionStates() {\n    let node = this.parent;\n    while (node) {\n      const selectedChildCount = node.selectedChildCount;\n      if (selectedChildCount === node.children.length) {\n        node.setImplicitSelectionState(true, false);\n      } else if (selectedChildCount || node.partialChildCount) {\n        node.setImplicitSelectionState(false, true);\n      } else {\n        node.setImplicitSelectionState(false, false);\n      }\n      node = node.parent;\n    }\n  },\n\n  setImplicitSelectionState(selected, partiallySelected) {\n    if (this.selected !== selected) {\n      this.selected = selected;\n      if (this.parent) {\n        if (selected) {\n          this.parent.selectedChildCount++;\n        } else {\n          this.parent.selectedChildCount--;\n        }\n      }\n    }\n\n    if (this.partiallySelected !== partiallySelected) {\n      this.partiallySelected = partiallySelected;\n      if (this.parent) {\n        if (partiallySelected) {\n          this.parent.partialChildCount++;\n        } else {\n          this.parent.partialChildCount--;\n        }\n      }\n    }\n  }\n});\n\nexport default BudgetNode;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/budget_node.ts","export default class Formulas {\n  _preferences: any;\n\n  constructor(preferences = {}) {\n    this._preferences = preferences;\n  }\n\n  /*\n  * For Revenues: return true if revenue's actuals are under budget, otherwise return false\n  * For Expenses: return true if expenses's actuals are over budget, otherwise return false\n  * the main foc us here on preferences' formula\n  */\n  isVarianceOverOrUnderBudget(accountType, variance) {\n    const formula = this._preferences[`${ accountType }_variance_formula`];\n\n    switch (accountType) {\n    case 'revenues':\n      return (formula === 'budget_minus_actual') ? (variance > 0) : (variance < 0);\n    case 'expenses':\n      return (formula === 'budget_minus_actual') ? (variance < 0) : (variance > 0);\n    }\n    return false;\n  }\n\n  budgetVsActualVariance({accountType, amounts: {budget, actual}}) {\n    const formula = this._preferences[`${ accountType }_variance_formula`];\n    let value;\n    let percent;\n\n    if (formula === 'budget_minus_actual') {\n      value = budget - actual;\n    } else {\n      value = actual - budget;\n    }\n\n    percent = (value / Math.abs(budget) || 0) * 100;\n\n    return {value, percent};\n  }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/formulas.ts","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _handlebarsBase = require('./handlebars/base');\n\nvar base = _interopRequireWildcard(_handlebarsBase);\n\n// Each of these augment the Handlebars object. No need to setup here.\n// (This is done to easily share code between commonjs and browse envs)\n\nvar _handlebarsSafeString = require('./handlebars/safe-string');\n\nvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\nvar _handlebarsException = require('./handlebars/exception');\n\nvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\nvar _handlebarsUtils = require('./handlebars/utils');\n\nvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\nvar _handlebarsRuntime = require('./handlebars/runtime');\n\nvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\nvar _handlebarsNoConflict = require('./handlebars/no-conflict');\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\n// For compatibility and usage outside of module systems, make the Handlebars object a namespace\nfunction create() {\n  var hb = new base.HandlebarsEnvironment();\n\n  Utils.extend(hb, base);\n  hb.SafeString = _handlebarsSafeString2['default'];\n  hb.Exception = _handlebarsException2['default'];\n  hb.Utils = Utils;\n  hb.escapeExpression = Utils.escapeExpression;\n\n  hb.VM = runtime;\n  hb.template = function (spec) {\n    return runtime.template(spec, hb);\n  };\n\n  return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst['default'] = inst;\n\nexports['default'] = inst;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars.runtime.js\n// module id = 852\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultHelpers = registerDefaultHelpers;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _helpersBlockHelperMissing = require('./helpers/block-helper-missing');\n\nvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\nvar _helpersEach = require('./helpers/each');\n\nvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\nvar _helpersHelperMissing = require('./helpers/helper-missing');\n\nvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\nvar _helpersIf = require('./helpers/if');\n\nvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\nvar _helpersLog = require('./helpers/log');\n\nvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\nvar _helpersLookup = require('./helpers/lookup');\n\nvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\nvar _helpersWith = require('./helpers/with');\n\nvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\nfunction registerDefaultHelpers(instance) {\n  _helpersBlockHelperMissing2['default'](instance);\n  _helpersEach2['default'](instance);\n  _helpersHelperMissing2['default'](instance);\n  _helpersIf2['default'](instance);\n  _helpersLog2['default'](instance);\n  _helpersLookup2['default'](instance);\n  _helpersWith2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers.js\n// module id = 853\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n  instance.registerHelper('blockHelperMissing', function (context, options) {\n    var inverse = options.inverse,\n        fn = options.fn;\n\n    if (context === true) {\n      return fn(this);\n    } else if (context === false || context == null) {\n      return inverse(this);\n    } else if (_utils.isArray(context)) {\n      if (context.length > 0) {\n        if (options.ids) {\n          options.ids = [options.name];\n        }\n\n        return instance.helpers.each(context, options);\n      } else {\n        return inverse(this);\n      }\n    } else {\n      if (options.data && options.ids) {\n        var data = _utils.createFrame(options.data);\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n        options = { data: data };\n      }\n\n      return fn(context, options);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js\n// module id = 854\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('../utils');\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('each', function (context, options) {\n    if (!options) {\n      throw new _exception2['default']('Must pass iterator to #each');\n    }\n\n    var fn = options.fn,\n        inverse = options.inverse,\n        i = 0,\n        ret = '',\n        data = undefined,\n        contextPath = undefined;\n\n    if (options.data && options.ids) {\n      contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n    }\n\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    if (options.data) {\n      data = _utils.createFrame(options.data);\n    }\n\n    function execIteration(field, index, last) {\n      if (data) {\n        data.key = field;\n        data.index = index;\n        data.first = index === 0;\n        data.last = !!last;\n\n        if (contextPath) {\n          data.contextPath = contextPath + field;\n        }\n      }\n\n      ret = ret + fn(context[field], {\n        data: data,\n        blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n      });\n    }\n\n    if (context && typeof context === 'object') {\n      if (_utils.isArray(context)) {\n        for (var j = context.length; i < j; i++) {\n          if (i in context) {\n            execIteration(i, i, i === context.length - 1);\n          }\n        }\n      } else {\n        var priorKey = undefined;\n\n        for (var key in context) {\n          if (context.hasOwnProperty(key)) {\n            // We're running the iterations one step out of sync so we can detect\n            // the last iteration without have to scan the object twice and create\n            // an itermediate keys array.\n            if (priorKey !== undefined) {\n              execIteration(priorKey, i - 1);\n            }\n            priorKey = key;\n            i++;\n          }\n        }\n        if (priorKey !== undefined) {\n          execIteration(priorKey, i - 1, true);\n        }\n      }\n    }\n\n    if (i === 0) {\n      ret = inverse(this);\n    }\n\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js\n// module id = 855\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n  instance.registerHelper('helperMissing', function () /* [args, ]options */{\n    if (arguments.length === 1) {\n      // A missing field in a {{foo}} construct.\n      return undefined;\n    } else {\n      // Someone is actually trying to call something, blow up.\n      throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js\n// module id = 856\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n  instance.registerHelper('if', function (conditional, options) {\n    if (_utils.isFunction(conditional)) {\n      conditional = conditional.call(this);\n    }\n\n    // Default behavior is to render the positive path if the value is truthy and not empty.\n    // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n    // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n    if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n      return options.inverse(this);\n    } else {\n      return options.fn(this);\n    }\n  });\n\n  instance.registerHelper('unless', function (conditional, options) {\n    return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js\n// module id = 857\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('log', function () /* message, options */{\n    var args = [undefined],\n        options = arguments[arguments.length - 1];\n    for (var i = 0; i < arguments.length - 1; i++) {\n      args.push(arguments[i]);\n    }\n\n    var level = 1;\n    if (options.hash.level != null) {\n      level = options.hash.level;\n    } else if (options.data && options.data.level != null) {\n      level = options.data.level;\n    }\n    args[0] = level;\n\n    instance.log.apply(instance, args);\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js\n// module id = 858\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n  instance.registerHelper('lookup', function (obj, field) {\n    if (!obj) {\n      return obj;\n    }\n    if (field === 'constructor' && !obj.propertyIsEnumerable(field)) {\n      return undefined;\n    }\n    return obj[field];\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFFBQUksQ0FBQyxHQUFHLEVBQUU7QUFDUixhQUFPLEdBQUcsQ0FBQztLQUNaO0FBQ0QsUUFBSSxLQUFLLEtBQUssYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQy9ELGFBQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0QsV0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDbkIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9va3VwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uKG9iaiwgZmllbGQpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKGZpZWxkID09PSAnY29uc3RydWN0b3InICYmICFvYmoucHJvcGVydHlJc0VudW1lcmFibGUoZmllbGQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js\n// module id = 859\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n  instance.registerHelper('with', function (context, options) {\n    if (_utils.isFunction(context)) {\n      context = context.call(this);\n    }\n\n    var fn = options.fn;\n\n    if (!_utils.isEmpty(context)) {\n      var data = options.data;\n      if (options.data && options.ids) {\n        data = _utils.createFrame(options.data);\n        data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n      }\n\n      return fn(context, {\n        data: data,\n        blockParams: _utils.blockParams([context], [data && data.contextPath])\n      });\n    } else {\n      return options.inverse(this);\n    }\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js\n// module id = 860\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultDecorators = registerDefaultDecorators;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _decoratorsInline = require('./decorators/inline');\n\nvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\nfunction registerDefaultDecorators(instance) {\n  _decoratorsInline2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/decorators.js\n// module id = 861\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n  instance.registerDecorator('inline', function (fn, props, container, options) {\n    var ret = fn;\n    if (!props.partials) {\n      props.partials = {};\n      ret = function (context, options) {\n        // Create a new partials stack frame prior to exec.\n        var original = container.partials;\n        container.partials = _utils.extend({}, original, props.partials);\n        var ret = fn(context, options);\n        container.partials = original;\n        return ret;\n      };\n    }\n\n    props.partials[options.args[0]] = options.fn;\n\n    return ret;\n  });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js\n// module id = 862\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('./utils');\n\nvar logger = {\n  methodMap: ['debug', 'info', 'warn', 'error'],\n  level: 'info',\n\n  // Maps a given level value to the `methodMap` indexes above.\n  lookupLevel: function lookupLevel(level) {\n    if (typeof level === 'string') {\n      var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n      if (levelMap >= 0) {\n        level = levelMap;\n      } else {\n        level = parseInt(level, 10);\n      }\n    }\n\n    return level;\n  },\n\n  // Can be overridden in the host environment\n  log: function log(level) {\n    level = logger.lookupLevel(level);\n\n    if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n      var method = logger.methodMap[level];\n      if (!console[method]) {\n        // eslint-disable-line no-console\n        method = 'log';\n      }\n\n      for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        message[_key - 1] = arguments[_key];\n      }\n\n      console[method].apply(console, message); // eslint-disable-line no-console\n    }\n  }\n};\n\nexports['default'] = logger;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGVbbWV0aG9kXSguLi5tZXNzYWdlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXI7XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/logger.js\n// module id = 863\n// module chunks = 0 1","// Build out our basic SafeString type\n'use strict';\n\nexports.__esModule = true;\nfunction SafeString(string) {\n  this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n  return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/safe-string.js\n// module id = 864\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _utils = require('./utils');\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _base = require('./base');\n\nfunction checkRevision(compilerInfo) {\n  var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n      currentRevision = _base.COMPILER_REVISION;\n\n  if (compilerRevision !== currentRevision) {\n    if (compilerRevision < currentRevision) {\n      var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n          compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n      throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n    } else {\n      // Use the embedded version info since the runtime doesn't know about this revision yet\n      throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n    }\n  }\n}\n\nfunction template(templateSpec, env) {\n  /* istanbul ignore next */\n  if (!env) {\n    throw new _exception2['default']('No environment passed to template');\n  }\n  if (!templateSpec || !templateSpec.main) {\n    throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n  }\n\n  templateSpec.main.decorator = templateSpec.main_d;\n\n  // Note: Using env.VM references rather than local var references throughout this section to allow\n  // for external users to override these as psuedo-supported APIs.\n  env.VM.checkRevision(templateSpec.compiler);\n\n  function invokePartialWrapper(partial, context, options) {\n    if (options.hash) {\n      context = Utils.extend({}, context, options.hash);\n      if (options.ids) {\n        options.ids[0] = true;\n      }\n    }\n\n    partial = env.VM.resolvePartial.call(this, partial, context, options);\n    var result = env.VM.invokePartial.call(this, partial, context, options);\n\n    if (result == null && env.compile) {\n      options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n      result = options.partials[options.name](context, options);\n    }\n    if (result != null) {\n      if (options.indent) {\n        var lines = result.split('\\n');\n        for (var i = 0, l = lines.length; i < l; i++) {\n          if (!lines[i] && i + 1 === l) {\n            break;\n          }\n\n          lines[i] = options.indent + lines[i];\n        }\n        result = lines.join('\\n');\n      }\n      return result;\n    } else {\n      throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n    }\n  }\n\n  // Just add water\n  var container = {\n    strict: function strict(obj, name) {\n      if (!(name in obj)) {\n        throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n      }\n      return obj[name];\n    },\n    lookup: function lookup(depths, name) {\n      var len = depths.length;\n      for (var i = 0; i < len; i++) {\n        if (depths[i] && depths[i][name] != null) {\n          return depths[i][name];\n        }\n      }\n    },\n    lambda: function lambda(current, context) {\n      return typeof current === 'function' ? current.call(context) : current;\n    },\n\n    escapeExpression: Utils.escapeExpression,\n    invokePartial: invokePartialWrapper,\n\n    fn: function fn(i) {\n      var ret = templateSpec[i];\n      ret.decorator = templateSpec[i + '_d'];\n      return ret;\n    },\n\n    programs: [],\n    program: function program(i, data, declaredBlockParams, blockParams, depths) {\n      var programWrapper = this.programs[i],\n          fn = this.fn(i);\n      if (data || depths || blockParams || declaredBlockParams) {\n        programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n      } else if (!programWrapper) {\n        programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n      }\n      return programWrapper;\n    },\n\n    data: function data(value, depth) {\n      while (value && depth--) {\n        value = value._parent;\n      }\n      return value;\n    },\n    merge: function merge(param, common) {\n      var obj = param || common;\n\n      if (param && common && param !== common) {\n        obj = Utils.extend({}, common, param);\n      }\n\n      return obj;\n    },\n    // An empty object to use as replacement for null-contexts\n    nullContext: Object.seal({}),\n\n    noop: env.VM.noop,\n    compilerInfo: templateSpec.compiler\n  };\n\n  function ret(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var data = options.data;\n\n    ret._setup(options);\n    if (!options.partial && templateSpec.useData) {\n      data = initData(context, data);\n    }\n    var depths = undefined,\n        blockParams = templateSpec.useBlockParams ? [] : undefined;\n    if (templateSpec.useDepths) {\n      if (options.depths) {\n        depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n      } else {\n        depths = [context];\n      }\n    }\n\n    function main(context /*, options*/) {\n      return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n    }\n    main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n    return main(context, options);\n  }\n  ret.isTop = true;\n\n  ret._setup = function (options) {\n    if (!options.partial) {\n      container.helpers = container.merge(options.helpers, env.helpers);\n\n      if (templateSpec.usePartial) {\n        container.partials = container.merge(options.partials, env.partials);\n      }\n      if (templateSpec.usePartial || templateSpec.useDecorators) {\n        container.decorators = container.merge(options.decorators, env.decorators);\n      }\n    } else {\n      container.helpers = options.helpers;\n      container.partials = options.partials;\n      container.decorators = options.decorators;\n    }\n  };\n\n  ret._child = function (i, data, blockParams, depths) {\n    if (templateSpec.useBlockParams && !blockParams) {\n      throw new _exception2['default']('must pass block params');\n    }\n    if (templateSpec.useDepths && !depths) {\n      throw new _exception2['default']('must pass parent depths');\n    }\n\n    return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n  };\n  return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n  function prog(context) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var currentDepths = depths;\n    if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n      currentDepths = [context].concat(depths);\n    }\n\n    return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n  }\n\n  prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n  prog.program = i;\n  prog.depth = depths ? depths.length : 0;\n  prog.blockParams = declaredBlockParams || 0;\n  return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n  if (!partial) {\n    if (options.name === '@partial-block') {\n      partial = options.data['partial-block'];\n    } else {\n      partial = options.partials[options.name];\n    }\n  } else if (!partial.call && !options.name) {\n    // This is a dynamic partial that returned a string\n    options.name = partial;\n    partial = options.partials[partial];\n  }\n  return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n  // Use the current closure context to save the partial-block if this partial\n  var currentPartialBlock = options.data && options.data['partial-block'];\n  options.partial = true;\n  if (options.ids) {\n    options.data.contextPath = options.ids[0] || options.data.contextPath;\n  }\n\n  var partialBlock = undefined;\n  if (options.fn && options.fn !== noop) {\n    (function () {\n      options.data = _base.createFrame(options.data);\n      // Wrapper function to get access to currentPartialBlock from the closure\n      var fn = options.fn;\n      partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {\n        var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n        // Restore the partial-block from the closure for the execution of the block\n        // i.e. the part inside the block of the partial call.\n        options.data = _base.createFrame(options.data);\n        options.data['partial-block'] = currentPartialBlock;\n        return fn(context, options);\n      };\n      if (fn.partials) {\n        options.partials = Utils.extend({}, options.partials, fn.partials);\n      }\n    })();\n  }\n\n  if (partial === undefined && partialBlock) {\n    partial = partialBlock;\n  }\n\n  if (partial === undefined) {\n    throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n  } else if (partial instanceof Function) {\n    return partial(context, options);\n  }\n}\n\nfunction noop() {\n  return '';\n}\n\nfunction initData(context, data) {\n  if (!data || !('root' in data)) {\n    data = data ? _base.createFrame(data) : {};\n    data.root = context;\n  }\n  return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n  if (fn.decorator) {\n    var props = {};\n    prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n    Utils.extend(prog, props);\n  }\n  return prog;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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QUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUYsU0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7R0FDM0I7QUFDRCxTQUFPLElBQUksQ0FBQztDQUNiIiwiZmlsZSI6InJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHsgQ09NUElMRVJfUkVWSVNJT04sIFJFVklTSU9OX0NIQU5HRVMsIGNyZWF0ZUZyYW1lIH0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIGNvbnN0IGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXRcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ05vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZScpO1xuICB9XG4gIGlmICghdGVtcGxhdGVTcGVjIHx8ICF0ZW1wbGF0ZVNwZWMubWFpbikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICBsZXQgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgbGV0IGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uKG9iaiwgbmFtZSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbihkZXB0aHMsIG5hbWUpIHtcbiAgICAgIGNvbnN0IGxlbiA9IGRlcHRocy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBsYW1iZGE6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IHJldCA9IHRlbXBsYXRlU3BlY1tpXTtcbiAgICAgIHJldC5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWNbaSArICdfZCddO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICAgIGxldCBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sXG4gICAgICAgICAgZm4gPSB0aGlzLmZuKGkpO1xuICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7XG4gICAgfSxcblxuICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIGxldCBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLmV4dGVuZCh7fSwgY29tbW9uLCBwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICAvLyBBbiBlbXB0eSBvYmplY3QgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBudWxsLWNvbnRleHRzXG4gICAgbnVsbENvbnRleHQ6IE9iamVjdC5zZWFsKHt9KSxcblxuICAgIG5vb3A6IGVudi5WTS5ub29wLFxuICAgIGNvbXBpbGVySW5mbzogdGVtcGxhdGVTcGVjLmNvbXBpbGVyXG4gIH07XG5cbiAgZnVuY3Rpb24gcmV0KGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICBsZXQgZGVwdGhzLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBpZiAob3B0aW9ucy5kZXB0aHMpIHtcbiAgICAgICAgZGVwdGhzID0gY29udGV4dCAhPSBvcHRpb25zLmRlcHRoc1swXSA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogb3B0aW9ucy5kZXB0aHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aHMgPSBbY29udGV4dF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFpbihjb250ZXh0LyosIG9wdGlvbnMqLykge1xuICAgICAgcmV0dXJuICcnICsgdGVtcGxhdGVTcGVjLm1haW4oY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICB9XG4gICAgbWFpbiA9IGV4ZWN1dGVEZWNvcmF0b3JzKHRlbXBsYXRlU3BlYy5tYWluLCBtYWluLCBjb250YWluZXIsIG9wdGlvbnMuZGVwdGhzIHx8IFtdLCBkYXRhLCBibG9ja1BhcmFtcyk7XG4gICAgcmV0dXJuIG1haW4oY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsIHx8IHRlbXBsYXRlU3BlYy51c2VEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuZGVjb3JhdG9ycywgZW52LmRlY29yYXRvcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICB9XG4gIH07XG5cbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIHRlbXBsYXRlU3BlY1tpXSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREZXB0aHMgPSBkZXB0aHM7XG4gICAgaWYgKGRlcHRocyAmJiBjb250ZXh0ICE9IGRlcHRoc1swXSAmJiAhKGNvbnRleHQgPT09IGNvbnRhaW5lci5udWxsQ29udGV4dCAmJiBkZXB0aHNbMF0gPT09IG51bGwpKSB7XG4gICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmbihjb250YWluZXIsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsXG4gICAgICAgIG9wdGlvbnMuZGF0YSB8fCBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSxcbiAgICAgICAgY3VycmVudERlcHRocyk7XG4gIH1cblxuICBwcm9nID0gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcyk7XG5cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIC8vIFVzZSB0aGUgY3VycmVudCBjbG9zdXJlIGNvbnRleHQgdG8gc2F2ZSB0aGUgcGFydGlhbC1ibG9jayBpZiB0aGlzIHBhcnRpYWxcbiAgY29uc3QgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgbGV0IHBhcnRpYWxCbG9jaztcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG4gICAgcGFydGlhbEJsb2NrID0gb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBmdW5jdGlvbiBwYXJ0aWFsQmxvY2tXcmFwcGVyKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJ0aWFsLWJsb2NrIGZyb20gdGhlIGNsb3N1cmUgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IGN1cnJlbnRQYXJ0aWFsQmxvY2s7XG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAoZm4ucGFydGlhbHMpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykge1xuICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7IHJldHVybiAnJzsgfVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7XG4gIGlmIChmbi5kZWNvcmF0b3IpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iXX0=\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/runtime.js\n// module id = 865\n// module chunks = 0 1","/* global window */\n'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (Handlebars) {\n  /* istanbul ignore next */\n  var root = typeof global !== 'undefined' ? global : window,\n      $Handlebars = root.Handlebars;\n  /* istanbul ignore next */\n  Handlebars.noConflict = function () {\n    if (root.Handlebars === Handlebars) {\n      root.Handlebars = $Handlebars;\n    }\n    return Handlebars;\n  };\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js\n// module id = 866\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"        <li><a id=\\\"image-download\\\">Image (.png)</a></li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-nav-bar__item ui-dropdown\\\">\\n  <a class=\\\"ui-nav-bar__item__toggle\\\" id=\\\"wd-download-menu\\\">Download</a>\\n  <div id=\\\"dropdown-download\\\" class=\\\"ui-dropdown__target align-right\\\">\\n    <header class=\\\"ui-dropdown__header\\\">\\n      <h4>This Graph</h4>\\n    </header>\\n    <ul class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.hideImageDownload : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"      <li><a id=\\\"table-download\\\">Table (.png)</a></li>\\n      <li><a id=\\\"csv-download\\\">Spreadsheet (.csv)</a></li>\\n    </ul>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/download_menu.hbs\n// module id = 867\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"filter-toggle ui-button small js-show-filter\\n        \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.active : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n        \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isAccountType : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"\\n        id=\\\"filter-button_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n        data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n        <span class=\\\"filter-toggle__text js-filter-button-name\\n          \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isAccountType : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"\\n          id=\\\"filter-button-name_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n          data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n          \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n        </span>\\n        <div class=\\\"filter-toggle__actions\\\">\\n          <span class=\\\"filter-annotation\\\" id=\\\"filter-annotation_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"></span>\\n          <span class=\\\"ui-panel-toggle__close\\\"></span>\\n          <span class=\\\"ui-panel-toggle__open\\\"></span>\\n        </div>\\n      </div>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \" active_breakdown\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"js-accountTypeButton\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"js-accountType\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-mainpanel__section\\\"\\n  id=\\\"section-filter\\\">\\n  <div class=\\\"ui-mainpanel__section-header\\\">\\n    Filtered By\\n    <div class=\\\"ui-mainpanel__section-expand-all js-show-filter-all\\\" id=\\\"wd-filter-button-all\\\">\\n      All\\n      <span class=\\\"icon-righthead-2\\\"></span>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"ui-button-stack\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/filter-section.hbs\n// module id = 868\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"    <button class=\\\"ui-button small ui-button_block primary js-recalculate\\\">\\n      <span class=\\\"ui-loading_button\\\"></span>\\n      <span class=\\\"content\\\">Calculate</span>\\n    </button>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"    <button class=\\\"ui-button small ui-button_block primary disabled js-recalculate\\\">\\n      <span class=\\\"ui-loading_button\\\"></span>\\n      <span class=\\\"content\\\">Recalculate</span>\\n    </button>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.rows : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"    <button class=\\\"aggregate-item js-select-group\\\"\\n      data-column=\\\"\"\n    + alias4(((helper = (helper = helpers.column_name || (depth0 != null ? depth0.column_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"column_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      data-group=\\\"\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      data-resolution=\\\"\"\n    + alias4(((helper = (helper = helpers.resolution || (depth0 != null ? depth0.resolution : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"resolution\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n      <div class=\\\"aggregate-item__label\\\" title=\\\"\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\"\n    + alias4(((helper = (helper = helpers.group_name || (depth0 != null ? depth0.group_name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"group_name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"aggregate-item__stat\\\" title=\\\"\"\n    + alias4(((helper = (helper = helpers.stat || (depth0 != null ? depth0.stat : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"stat\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\"\n    + alias4(((helper = (helper = helpers.stat || (depth0 != null ? depth0.stat : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"stat\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n    </button>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.initialLoad : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.program(11, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"9\":function(container,depth0,helpers,partials,data) {\n    return \"    <div class=\\\"no-aggregates\\\"></div>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \"    <div class=\\\"no-aggregates\\\">No aggregates are available for the current filter selection.</div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__group\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__sort\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box__stat\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.initialLoad : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.rows : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(8, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle/panel_aggregates.hbs\n// module id = 869\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <li class=\\\"drop-item js-column-toggle\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-column=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__text has-no-hover\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.program(8, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \" active\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \" (required)\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n\";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    return \"checked\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + container.escapeExpression((helpers.template || (depth0 && depth0.template) || helpers.helperMissing).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n</div>\\n\\n<ul class=\\\"drop-item__wrapper\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.columns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle/panel_columns.hbs\n// module id = 870\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <li class=\\\"drop-item js-column-toggle active  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-column=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__handle icon-drag-n-drop-1\\\"></span>\\n      <span class=\\\"drop-item__text has-no-hover\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isRequired : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.program(6, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox checked\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \" (required)\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"          \"\n    + container.escapeExpression(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"  <li class=\\\"drop-item js-column-toggle\\\" data-column=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n    <div class=\\\"drop-item__bar\\\">\\n      <span class=\\\"drop-item__text has-no-hover\\\">\"\n    + alias4(((helper = (helper = helpers.label || (depth0 != null ? depth0.label : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"label\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</span>\\n    </div>\\n    <div class=\\\"drop-item__buttons\\\">\\n      <button role=\\\"checkbox\\\" class=\\\"drop-item__checkbox\\\">\\n        <i class=\\\"fonticon checkmark-icon\\\"></i>\\n      </button>\\n    </div>\\n  </li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  \"\n    + container.escapeExpression((helpers.template || (depth0 && depth0.template) || helpers.helperMissing).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n</div>\\n<ul class=\\\"drop-item__wrapper sortable-items\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.fixedColumns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n<hr>\\n<ul class=\\\"drop-item__wrapper\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.auxColumns : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</ul>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle/panel_columns_sortable.hbs\n// module id = 871\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"disabled\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item js-filter\\\" data-index=\"\n    + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"index\",\"hash\":{},\"data\":data}) : helper)))\n    + \">\\n    <div class=\\\"filter-item__label\\\">\\n      <button class=\\\"filter-item__field js-field\\\">\"\n    + alias4(((helper = (helper = helpers.friendlyName || (depth0 != null ? depth0.friendlyName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"friendlyName\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</button>\\n      <span class=\\\"filter-item__is\\\">is</span>\\n      <button class=\\\"filter-item__operator js-operator\\\">\"\n    + alias4(((helper = (helper = helpers.operatorLabel || (depth0 != null ? depth0.operatorLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"operatorLabel\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</button>\\n    </div>\\n    <div>\\n      <input class=\\\"filter-item__input js-value\\\"\\n        type=\\\"text\\\"\\n        value=\\\"\"\n    + alias4(((helper = (helper = helpers.valueLabel || (depth0 != null ? depth0.valueLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"valueLabel\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n        placeholder=\\\"Filter\\\">\\n      <button aria-label=\\\"Remove filter\\\" class=\\\"filter-item__remove icon-remove-2 js-remove\\\"></button>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"subpanel__options\\\">\\n  <button class=\\\"ui-button small ui-button_block js-clear \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n    Clear\\n  </button>\\n</div>\\n\\n<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item\\\">\\n    <div class=\\\"filter-item__label\\\">Search Across All Data</div>\\n    <input class=\\\"filter-item__input js-search-input\\\"\\n      type=\\\"text\\\"\\n      value=\\\"\"\n    + alias3(((helper = (helper = helpers.searchAll || (depth0 != null ? depth0.searchAll : depth0)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"searchAll\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"\\n      placeholder=\\\"Search in table\\\">\\n  </div>\\n</div>\\n\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.filters : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n<div class=\\\"subpanel__content__row\\\">\\n  <div class=\\\"filter-item\\\">\\n\t \"\n    + alias3((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"select_box\",{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n  </div>\\n</div>\\n<div class=\\\"subpanel__content__row\\\">\\n  <button class=\\\"ui-button primary small ui-button_block js-apply \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.applyDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clearDisabled : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n    Apply\\n  </button>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle/panel_filters.hbs\n// module id = 872\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"style=\\\"width: 74%;float: left;\\\"\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"        <button\\n          class=\\\"ui-dropdown__item \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.visible : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" js-select-option\\\"\\n          data-val=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n          \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n        </button>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"is-visible\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"  <button class=\\\"subpanel_selectall ui-button small no-color\\\" style=\\\"width: 24%;float: right;\\\">\\n    <i class=\\\"fonticon icon-confirm-1\\\"></i>\\n    All\\n  </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"ui-dropdown select-box js-select\\\" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.enableAll : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n  <button class=\\\"ui-dropdown__toggle js-select-selected\\\">\\n    \"\n    + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.selected : depth0)) != null ? stack1.name : stack1), depth0))\n    + \"\\n  </button>\\n  <div class=\\\"ui-dropdown__target\\\">\\n    <ul class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </ul>\\n  </div>\\n</div>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.enableAll : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle/select_box.hbs\n// module id = 873\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"    <div id=\\\"subpanel_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\" class=\\\"subpanel ui-panel js-subpanel\\\">\\n      <header class=\\\"ui-panel__header\\\">\\n        <h3>\"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</h3>\\n        <button class=\\\"ui-panel__close js-close-panel\\\" data-id=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"></button>\\n      </header>\\n\\n      <div class=\\\"ui-panel__content\\\">\\n        <div class=\\\"subpanel__content\\\">\\n          \"\n    + alias4((helpers.template || (depth0 && depth0.template) || alias2).call(alias1,\"subpanel\",(depth0 != null ? depth0.id : depth0),{\"name\":\"template\",\"hash\":{},\"data\":data}))\n    + \"\\n        </div>\\n      </div>\\n    </div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"subpanels griddle-subpanels js-subpanels\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/griddle_subpanels.hbs\n// module id = 874\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_budget101\\\">\\n  <div class=\\\"ui-modal wide\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n      <h3>Multi-Fund Accounting 101</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"budget101\\\"></span>\\n    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n      <article class=\\\"budget101-content\\\">\\n        <h3 class=\\\"budget101-content__subtitle\\\">\\n          A Short Guide to Multi-fund Accounting\\n        </h3>\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          OpenGov helps governments describe how funds flow through their organization, including where revenues come from, how it is distributed across departments, and where it is ultimately spent.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/1.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram of a multi-fund accounting system\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Many organizations manage their budget and finances by using a \\\"multi-fund\\\" accounting system in which revenue is disbursed to different funds. Those funds may be directed toward specific purposes, though some funds - often called general funds - can flow into multiple departments.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/2.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram showing how funds are passed down from departments to divisions\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Many organizations are divided at their highest level into departments, which may then be divided into divisions.  Some organizations have multiple layers below the division level.  Some organizations track programs that may span multiple departments and divisions.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/3.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram describing how revenue is split into funds\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          In multi-fund environments, revenue streams can feed into multiple funds. Taxes, for example, may be allocated across a government to pay for a variety of services.  Other revenue sources, like parking tickets, may go directly to a specific department, division, or program.\\n        </p>\\n\\n        <img\\n          src=\\\"\"\n    + alias3((helpers.asset_path || (depth0 && depth0.asset_path) || alias2).call(alias1,\"images/budget101/4.png\",{\"name\":\"asset_path\",\"hash\":{},\"data\":data}))\n    + \"\\\"\\n          class=\\\"budget101-content__graphic\\\"\\n          alt=\\\"Diagram showing the relationship between departments and expense types\\\" />\\n        <p class=\\\"budget101-content__graphic-desc\\\">\\n          Departments often spend resources across many expense types.  These may range from buying office supplies and electricity to paying off debt.  Many departments share the same expense types, such as money spent on salaries and benefits for employees.\\n        </p>\\n      </article>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"budget101\\\">\\n          Done\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-budget101.hbs\n// module id = 875\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_faq\\\">\\n  <div class=\\\"ui-modal\\\">\\n    <header class=\\\"overlay-modal__header\\\">\\n      <h3>Frequently Asked Questions</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"faq\\\"></span>\\n    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n      <article class=\\\"faq\\\">\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n\\n        <p><strong>What does it mean that OpenGov is \\\"Software as a Service (SaaS)?\\\"</strong></p>\\n        <p>You do not buy or license any software, but rather subscribe to the service on a yearly basis. OpenGov runs the software and is responsible for keeping the platform up 24 x 7. OpenGov operates outside your firewall and we do not touch your accounting systems. The data you email to us is stored securely on top-of-the-line, industry-standard Amazon S3 servers to ensure that your data will always be secure and available.</p>\\n      </article>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__footer\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"faq\\\">\\n          Done\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n  <div class=\\\"ui-modal__wrapper\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-faq.hbs\n// module id = 876\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper\\\" id=\\\"overlay-modal_feedback\\\">\\n  <div class=\\\"ui-modal\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n      <h3>Contact \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.display_name : stack1), depth0))\n    + \"</h3>\\n      <span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"feedback\\\"></span>\\n    </header>\\n    <form id=\\\"feedback-form\\\">\\n      <div class=\\\"ui-modal__content\\\">\\n        <div class=\\\"ui-alert-box feedback-form__error-message\\\">Please input a message</div>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_name\\\">Name</label>\\n          <input type=\\\"text\\\" class=\\\"overlay-form__input\\\" name=\\\"name\\\" id=\\\"feedback-form_name\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_phone\\\">Phone</label>\\n          <input type=\\\"text\\\" class=\\\"overlay-form__input\\\" name=\\\"phone\\\" id=\\\"feedback-form_form\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form\\\">\\n          <label for=\\\"feedback-form_email\\\">Email</label>\\n          <input type=\\\"email\\\" class=\\\"overlay-form__input\\\" name=\\\"email\\\" id=\\\"feedback-form_email\\\">\\n        </fieldset>\\n        <fieldset class=\\\"ui-form required\\\">\\n          <label class=\\\"overlay-form__label\\\" for=\\\"feedback-form_message\\\">Message</label>\\n          <textarea id=\\\"message\\\" name=\\\"message\\\" id=\\\"feedback-form_message\\\"></textarea>\\n        </fieldset>\\n        <input name=\\\"entity_id\\\" type=\\\"hidden\\\" value=\\\"\"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.entity_id : stack1), depth0))\n    + \"\\\">\\n      </div>\\n      <footer class=\\\"ui-modal__footer\\\">\\n        <div class=\\\"ui-modal__actions\\\">\\n          <input class=\\\"ui-button primary js-submit\\\"\\n            name=\\\"commit\\\"\\n            type=\\\"button\\\"\\n            value=\\\"Send\\\"\\n            data-modal=\\\"feedback\\\">\\n        </div>\\n      </footer>\\n    </form>\\n  </div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-feedback.hbs\n// module id = 877\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div className=\\\"ui-modal__wrapper open\\\" id=\\\"overlay-modal_download\\\">\\n<div className=\\\"ui-modal wide\\\">\\n\t<header className=\\\"ui-modal__header\\\">\\n\t\t<h3>Download</h3>\\n\t\t<span className=\\\"ui-modal__close\\\" onClick={ReportActions.hideDownloadModal}></span>\\n\t</header>\\n\t<div className=\\\"ui-modal__content\\\">\\n\t\t<div className=\\\"download_wrapper\\\">\\n\t\t</div>\\n\t</div>\\n\t<footer className=\\\"ui-modal__footer\\\">\\n\t\t<div className=\\\"ui-modal__actions\\\">\\n\t\t\t<button className=\\\"ui-button \\\" onClick={ReportActions.hideDownloadModal}>\\n\t\t\t\tCancel\\n\t\t\t</button>\\n\t\t</div>\\n\t</footer>\\n</div>\\n<div className=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-download.hbs\n// module id = 878\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"alert__overlay\\\" id=\\\"overlay-modal_password\\\">\\n  <div class=\\\"alert_full\\\">\\n    <div class=\\\"alert__close-btn\\\">\\n      <a href=\\\"/\\\" class=\\\"fonticon icon-remove-3\\\"></a>\\n    </div>\\n    <div class=\\\"alert__inner\\\" id=\\\"password-form\\\">\\n      <div class=\\\"alert__inner__text\\\">Limited Access: Password Required</div>\\n      <div class=\\\"alert__inner__subtext\\\" id=\\\"password-form__error-message\\\" style=\\\"display: none\\\">Password does not match</div>\\n      <div class=\\\"alert__inner__password-wrapper\\\">\\n        <label class=\\\"alert__inner__password-label\\\" for=\\\"password-form__input\\\">Password:</label>\\n        <input class=\\\"alert__inner__password-input\\\" id=\\\"password-form__input\\\" type=\\\"password\\\" name=\\\"password\\\" placeholder=\\\"•••••••\\\" autofocus=\\\"autofocus\\\">\\n        <div class=\\\"alert__inner__password-submit\\\" id=\\\"password-form__submit\\\" type=\\\"submit\\\" value=\\\"Submit\\\">\\n          Submit\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-password.hbs\n// module id = 879\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <h3>\"\n    + container.escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</h3>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"        <h3>Something went wrong</h3>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    return \"        <span class=\\\"ui-modal__close js-close\\\"></span>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <p>\"\n    + container.escapeExpression(((helper = (helper = helpers.subtext || (depth0 != null ? depth0.subtext : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"subtext\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</p>\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"        <p>\"\n    + container.escapeExpression(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</p>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.buttons : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(12, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"12\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=container.escapeExpression;\n\n  return \"            <button class=\\\"ui-button primary js-button\\\" data-index=\\\"\"\n    + alias1(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"index\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n              \"\n    + alias1(container.lambda(depth0, depth0))\n    + \"\\n            </button>\\n\";\n},\"14\":function(container,depth0,helpers,partials,data) {\n    return \"          <button class=\\\"ui-button primary js-close\\\">\\n            Okay\\n          </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"<div class=\\\"ui-modal__wrapper open\\\">\\n  <div class=\\\"ui-modal js-alert\\\">\\n    <header class=\\\"ui-modal__header\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.subtext : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.suppressRemoval : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </header>\\n    <div class=\\\"ui-modal__content\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.subtext : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.program(9, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.buttons : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.program(14, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"      </div>\\n    </footer>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-recoverable-error.hbs\n// module id = 880\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<div class=\\\"ui-modal__wrapper open ready\\\" id=\\\"overlay-modal_tos\\\">\\n\t<div class=\\\"ui-modal wide\\\">\\n\t\t<header class=\\\"ui-modal__header\\\">\\n\t\t\t<h3>OpenGov Site Terms of Use</h3>\\n\t\t\t<span class=\\\"ui-modal__close js-modal-close\\\" data-modal=\\\"tos\\\"></span>\\n\t\t</header>\\n\t\t<div class=\\\"ui-modal__content\\\">\\n\t\t\t<article class=\\\"terms-of-service\\\">\\n\t\t\t\t<p><em>Last revised on: January 11, 2016</em></p>\\n\t\t\t\t<p>Welcome to this OpenGov website! This website (the \\\"<strong>Site</strong>\\\") is a copyrighted work belonging to OpenGov, Inc. (\\\"<strong>OpenGov</strong>\\\", \\\"<strong>us</strong>\\\", \\\"<strong>our</strong>\\\", and \\\"<strong>we</strong>\\\").  OpenGov makes available public domain data that it has aggregated and processed on behalf of governments on websites for public consumption (collectively, with all other services provided through the Site, the \\\"Services\\\"). Certain features of the Services or Site may be subject to additional guidelines, terms, or rules, which will be posted on the Service or Site in connection with such features.  All such additional terms, guidelines, and rules are incorporated by reference into this Agreement.</p>\\n\t\t\t\t<p>These Terms of Use (\\\"Agreement\\\") sets forth the legally binding terms for your use of the Site and Services. By accessing or using the Site or Services, you are accepting this Agreement and you represent and warrant that you have the right, authority, and capacity to enter into this Agreement. If you do not agree with all of the provisions of this Agreement, do not access and/or use the Site or Services. If you are using the Site or Services on behalf of a company, entity, or organization, you represent and warrant that you are an authorized representative of such company, entity, or organization with the authority to bind it to this Agreement.</p>\\n\t\t\t\t<h3>1. Site</h3>\\n\t\t\t\t<p><strong>1.1 License.</strong> Subject to the terms of this Agreement, OpenGov grants you a non-transferable, non-exclusive, license to use the Site and Services for your personal, noncommercial use.</p>\\n\t\t\t\t<p><strong>1.2 Certain Restrictions.</strong> The rights granted to you in this Agreement with regards to any content or information on the site that is not in the public domain are subject to the following restrictions: (a) you shall not license, sell, rent, lease, transfer, assign, distribute, host, or otherwise commercially exploit any portion of the Site or Services; (b) you shall not modify, make derivative works of, disassemble, reverse compile or reverse engineer any portion of the Site or Services; (c) you shall not access the Site or Services in order to build a similar or competitive service; and (d) except as expressly stated herein, no potion of the Site or Services may be copied, reproduced, distributed, republished, downloaded, displayed, posted or transmitted in any form or by any means.  Any future release, update, or other addition to functionality of the Site or Services shall be subject to the terms of this Agreement. All copyright and other proprietary notices on any Site or Services content must be retained on all copies thereof.</p>\\n\t\t\t\t<p><strong>1.3 Modification.</strong> OpenGov reserves the right, at any time, to modify, suspend, or discontinue the Site or Services or any part thereof with or without notice. You agree that OpenGov will not be liable to you or to any third party for any modification, suspension, or discontinuance of the Site or Services or any part thereof.</p>\\n\t\t\t\t<p><strong>1.4 Ownership.</strong> Excluding the public domain data made available on the site, you acknowledge that all the intellectual property rights, including copyrights, patents, trade marks, and trade secrets, in the Site and Services are owned by OpenGov or OpenGov's licensors. The provision of the Site and Services does not transfer to you or any third party any rights, title or interest in or to such intellectual property rights. OpenGov and its suppliers reserve all rights not granted in this Agreement.</p>\\n\t\t\t\t<h3>2. Acceptable Use Policy.</h3>\\n\t\t\t\t<p>You agree not to use the Site or Services to: (a) upload, transmit, or distribute any computer viruses, worms, or any software intended to damage or alter a computer system or data; (b) interfere with, disrupt, or create an undue burden on servers or networks connected to the Site or Services or violate the regulations, policies or procedures of such networks; (c) attempt to gain unauthorized access to the Site or Services, other computer systems or networks connected to or used together with the Site or Services; (d) harass or interfere with another user's use and enjoyment of the Site or Services; or (e) introduce software or automated agents or scripts to the Site or Services so as to generate automated searches, requests and queries, or to strip, scrape, or mine data from the Site or Services.</p>\\n\t\t\t\t<h3>3. Indemnity.</h3>\\n\t\t\t\t<p>You agree to indemnify and hold OpenGov (and its officers, employees, and agents) harmless, including costs and attorneys' fees, from any claim or demand made by any third party due to or arising out of (i) your use of the Site or Services, (ii) your violation of this Agreement; or (iii) your violation of applicable laws or regulations.  OpenGov reserves the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us and you agree to cooperate with our defense of these claims.  You agree not to settle any matter without the prior written consent of OpenGov.  OpenGov will use reasonable efforts to notify you of any such claim, action or proceeding upon becoming aware of it.</p>\\n\t\t\t\t<h3>4. Third Party Sites.</h3>\\n\t\t\t\t<p>The Site might contain links to third party websites and services for third parties (collectively, \\\"Third Party Sites\\\").  Such Third Party Sites are not under the control of OpenGov and OpenGov is not responsible for any Third Party Sites.  OpenGov provides these Third Party Sites only as a convenience and does not review, approve, monitor, endorse, warrant, or make any representations with respect to Third Party Sites.  You use all Third Party Sites at your own risk. When you link to a Third Party Site, the applicable third party's terms and policies apply, including the third party's privacy and data gathering practices.  You should make whatever investigation you feel necessary or appropriate before proceeding with any transaction in connection with such Third Party Sites.</p>\\n\t\t\t\t<h3>5. Disclaimers.</h3>\\n\t\t\t\t<p>THE SITE AND SERVICES ARE PROVIDED \\\"AS-IS\\\" AND \\\"AS AVAILABLE\\\" AND WE (AND OUR SUPPLIERS) EXPRESSLY DISCLAIM ANY WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OR CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, QUIET ENJOYMENT, ACCURACY, OR NON-INFRINGEMENT.  WE (AND OUR SUPPLIERS) MAKE NO WARRANTY THAT THE SITE OR SERVICES: (A) WILL MEET YOUR REQUIREMENTS; (B) WILL BE AVAILABLE ON AN UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE BASIS; OR (C) WILL BE ACCURATE, RELIABLE, FREE OF VIRUSES OR OTHER HARMFUL CODE,  COMPLETE, LEGAL, OR SAFE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.</p>\\n\t\t\t\t<h3>6. Limitation on Liability.</h3>\\n\t\t\t\t<p>IN NO EVENT SHALL WE (AND OUR SUPPLIERS) BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY LOST PROFIT OR ANY INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL OR PUNITIVE DAMAGES ARISING FROM OR RELATING TO THIS AGREEMENT OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR SERVICES, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ACCESS TO, AND USE OF, THE SITE AND SERVICES ARE AT YOUR OWN DISCRETION AND RISK, AND YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA RESULTING THEREFROM. NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED HEREIN, OUR (AND OUR SUPPLIERS') LIABILITY TO YOU FOR ANY DAMAGES ARISING FROM OR RELATED TO THIS AGREEMENT (FOR ANY CAUSE WHATSOEVER AND REGARDLESS OF THE FORM OF THE ACTION), WILL AT ALL TIMES BE LIMITED TO FIFTY US DOLLARS ($50). THE EXISTENCE OF MORE THAN ONE CLAIM WILL NOT ENLARGE THIS LIMIT. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OF CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU AND YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM JURISDICTION TO JURISDICTION.</p>\\n\t\t\t\t<h3>7. Term and Termination.</h3>\\n\t\t\t\t<p>Subject to this Section, this Agreement will remain in full force and effect while you use the Site or Services.  We may (a) suspend your rights to use the Site and/or Services or (b) terminate this Agreement, at any time for any reason at our sole discretion, including for any use of the Site or Services in violation of this Agreement.  Upon termination of this Agreement, your right to access and use the Site and Services will terminate immediately.  OpenGov will not have any liability whatsoever to you for any termination of this Agreement.  Even after this Agreement is terminated, the following provisions of this Agreement will remain in effect: Sections 2–8.</p>\\n\t\t\t\t<h3>8. General</h3>\\n\t\t\t\t<p><strong>8.1 Changes to Terms of Use.</strong> This Agreement is subject to occasional revision, and if we make any substantial changes, we may notify you by prominently posting notice of the changes on our Site.  Any changes to this agreement will be effective thirty (30) calendar days following our posting of notice of the changes on our Site. Continued use of our Site or Services following notice of such changes shall indicate your acknowledgement of such changes and agreement to be bound by the terms and conditions of such changes.</p>\\n\t\t\t\t<p><strong>8.2 Choice of Law.</strong> The Agreement is made under and shall be governed by and construed in accordance with the laws of the State of California, without giving effect to any principles that provide for the application of the law of another jurisdiction. Any action at law or in equity will be commenced in a federal or state court located in the County of Santa Clara, California and you and OpenGov consent to the venue and jurisdiction of such courts.</p>\\n\t\t\t\t<p><strong>8.3 Entire Agreement.</strong> This Agreement constitutes the entire agreement between you and us regarding the use of the Site and Services. Our failure to exercise or enforce any right or provision of this Agreement shall not operate as a waiver of such right or provision. The section titles in this Agreement are for convenience only and have no legal or contractual effect. The word including means including without limitation. If any provision of this Agreement is, for any reason, held to be invalid or unenforceable, the other provisions of this Agreement will be unimpaired and the invalid or unenforceable provision will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law.  Your relationship to OpenGov is that of an independent contractor, and neither party is an agent or partner of the other. This Agreement, and your rights and obligations herein, may not be assigned, subcontracted, delegated, or otherwise transferred by you without OpenGov's prior written consent, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void.  The terms of this Agreement shall be binding upon assignees.</p>\\n\t\t\t\t<p><strong>8.4 Copyright/Trademark Information.</strong> Copyright &copy; 2013, OpenGov, Inc. All rights reserved.  All trademarks, logos and service marks (\\\"<strong>Marks</strong>\\\") displayed on the Site are our property or the property of other third parties. You are not permitted to use these Marks without our prior written consent or the consent of such third party which may own the Marks.</p>\\n\t\t\t\t<p><strong>8.5 Contact Information:</strong></p>\\n\t\t\t\t<p>OpenGov, Inc.<br />\\n\t\t\t\t955 Charter Street<br />\\n\t\t\t\tRedwood City, CA 94063<br />\\n\t\t\t\t650-336-7167</p>\\n\t\t\t</article>\\n\t\t</div>\\n\\n\t\t<footer class=\\\"ui-modal__footer\\\">\\n      <div class=\\\"ui-modal__actions\\\">\\n  \t\t\t<button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"tos\\\">\\n          Done\\n        </button>\\n      </div>\\n\t\t</footer>\\n\t</div>\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-tos.hbs\n// module id = 881\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"alert__overlay ready open\\\">\\n  <div class=\\\"alert_full active\\\">\\n    <div class=\\\"alert__inner\\\">\\n      <div class=\\\"alert__inner__text\\\">\"\n    + alias4(((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"message\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"alert__inner__subtext\\\">\"\n    + alias4(((helper = (helper = helpers.subtext || (depth0 != null ? depth0.subtext : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"subtext\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n      <div class=\\\"alert__inner__buttons-wrapper\\\">\\n        <div class=\\\"alert__inner__button js-reset\\\">\\n          <i class=\\\"fonticon icon-rotateright-1\\\"></i>\\n          Reset\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-unrecoverable-error.hbs\n// module id = 882\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"      <button id=\\\"welcome-budget-101\\\" class=\\\"ui-button\\\">\\n        Budget 101\\n      </button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n  return \"<div class=\\\"ui-modal__wrapper modal_welcome\\\" id=\\\"overlay-modal_welcome\\\">\\n  <div class=\\\"ui-modal wide\\\">\\n    <div class=\\\"ui-modal__content\\\">\\n      <h1 class=\\\"welcome__title\\\">\\n        Welcome to \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.display_name : stack1), depth0))\n    + \"'s Financial Reporting Platform\\n      </h1>\\n      <p>This site is designed to help you understand how \"\n    + alias2(alias1(((stack1 = (depth0 != null ? depth0.entity : depth0)) != null ? stack1.name : stack1), depth0))\n    + \" spends and receives money. Start exploring and learn about your government.</p>\\n      <p><small>You can also find these getting started topics in the Help menu.</small></p>\\n    </div>\\n    <footer class=\\\"ui-modal__footer\\\">\\n      <button id=\\\"welcome-how-to\\\" class=\\\"ui-button\\\">\\n        How To\\n      </button>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showBudget101 : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      <div class=\\\"ui-modal__actions\\\">\\n        <button class=\\\"ui-button primary js-modal-close\\\" data-modal=\\\"welcome\\\">\\n          Get Started\\n        </button>\\n      </div>\\n    </footer>\\n  </div>\\n\\n  <div class=\\\"pointer-arrow_reports\\\"></div>\\n  <div class=\\\"pointer-arrow_filter\\\"></div>\\n  <div class=\\\"pointer-arrow_export\\\"></div>\\n  <div class=\\\"pointer-arrow_legend\\\"></div>\\n\\n  <div class=\\\"ui-modal__background\\\"></div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/modal-welcome.hbs\n// module id = 883\n// module chunks = 0 1","var Handlebars = require(\"../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"              <li>\\n                <a class=\\\"dropdown-select__row js-select-option js-item_\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\" data-val=\\\"\"\n    + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"id\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n                  \"\n    + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\n                </a>\\n              </li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"ui-mainpanel__section\\\">\\n  <div class=\\\"ui-mainpanel__section-header\\\">Fiscal year through</div>\\n\\n  <div class=\\\"ui-dropdown\\\">\\n    <div class=\\\"ui-dropdown__toggle js-select\\\">\\n      <span class=\\\"js-select-selected\\\">\"\n    + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.selected : depth0)) != null ? stack1.name : stack1), depth0))\n    + \"</span>\\n      <div class=\\\"ui-dropdown__target\\\">\\n          <ul class=\\\"ui-dropdown__list\\\">\\n        <div class=\\\"ui-container_scroll\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.items : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"        </div>\\n          </ul>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/months.hbs\n// module id = 884\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.dateColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.numericColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.monetaryColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.textColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.percentColumn : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </div>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"dropdown__row_input icon-greater-equal-1\\\">\\n        <input class=\\\"filter-from dropdown__row__input\\\"\\n          type=\\\"text\\\"\\n          placeholder=\\\"From\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n          <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"dropdown__row_input icon-less-equal-1\\\">\\n        <input class=\\\"filter-to dropdown__row__input\\\"\\n          type=\\\"text\\\"\\n          placeholder=\\\"To\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n          <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"      <div class=\\\"dropdown__row_input icon-greater-equal-1\\\">\\n        <input class=\\\"filter-from dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"From\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"dropdown__row_input icon-less-equal-1\\\">\\n        <input class=\\\"filter-to dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"To\\\"\\n          value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"      <div class=\\\"dropdown__row_input icon-search-1\\\">\\n        <input class=\\\"filter-search dropdown__row__input\\\"\\n          type=\\\"search\\\"\\n          placeholder=\\\"Search\\\"\\n          value=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.contains || (depth0 != null ? depth0.contains : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"contains\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n        <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n          <i class=\\\"fonticon icon-remove-2\\\"></i>\\n        </div>\\n      </div>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-uphead-3\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortAsc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Sort Ascending</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Clear Sorting</span>\\n    </div>\\n\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-downhead-3\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(15, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showSortDesc : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Sort Descending</span>\\n    </div>\\n  </div>\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    return \" is-enabled\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-asc\\\"\";\n},\"13\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-clear\\\"\";\n},\"15\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"sort-desc\\\"\";\n},\"17\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-hideblank-1\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(18, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showNonBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(20, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Hide Blank</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Show All</span>\\n    </div>\\n\\n    <div\\n      class=\\\"dropdown__row\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" icon-viewblank-1\\\"\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(22, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      \"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.showBlankFilter : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(20, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \">\\n      <span class=\\\"dropdown__row__text\\\">Show Only Blank</span>\\n      <span class=\\\"dropdown__row__text_disable\\\">Show All</span>\\n    </div>\\n  </div>\\n\";\n},\"18\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"non-blank\\\"\";\n},\"20\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"blank-clear\\\"\";\n},\"22\":function(container,depth0,helpers,partials,data) {\n    return \"data-action=\\\"blank\\\"\";\n},\"24\":function(container,depth0,helpers,partials,data) {\n    return \"  <div class=\\\"ui-dropdown__list\\\">\\n    <div class=\\\"dropdown__row icon-hide-1\\\" data-action=\\\"hide\\\">\\n      <span class=\\\"dropdown__row__text\\\">Hide Column</span>\\n    </div>\\n  </div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n  return \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.filter : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.sort : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.filterBlanks : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(17, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.features : depth0)) != null ? stack1.hideColumn : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(24, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n<footer class=\\\"ui-dropdown__footer\\\">\\n  <button class=\\\"ui-button js-clear\\\">Clear</button>\\n  <button class=\\\"ui-button primary js-ok\\\">Okay</button>\\n</footer>\\n\\n<div class=\\\"clear\\\"></div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/querygrid/column.hbs\n// module id = 885\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n        <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"dropdown__row__input__calendar-btn js-datepicker\\\">\\n        <i class=\\\"fonticon icon-calendar-1\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/querygrid/date.hbs\n// module id = 886\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/querygrid/monetary.hbs\n// module id = 887\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-greater-equal-1\\\"></i>\\n    <input class=\\\"filter-from dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"From\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.from || (depth0 != null ? depth0.from : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"from\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\\n<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-less-equal-1\\\"></i>\\n    <input class=\\\"filter-to dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"To\\\" value=\\\"\"\n    + alias4(((helper = (helper = helpers.to || (depth0 != null ? depth0.to : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"to\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/querygrid/numeric.hbs\n// module id = 888\n// module chunks = 0 1","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"<div class=\\\"dropdown__row_input\\\">\\n    <i class=\\\"dropdown__row__left-icon icon-search-1\\\"></i>\\n    <input class=\\\"filter-search dropdown__row__input\\\" type=\\\"text\\\" placeholder=\\\"Search\\\" value=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.contains || (depth0 != null ? depth0.contains : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"contains\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\"/>\\n    <div class=\\\"js-clear-input dropdown__row__input__clear-btn\\\">\\n        <i class=\\\"fonticon icon-remove-2\\\"></i>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./templates/querygrid/text.hbs\n// module id = 889\n// module chunks = 0 1","\"use strict\";\n\n/**\r\n * filesize\r\n *\r\n * @copyright 2018 Jason Mulligan <jason.mulligan@avoidwork.com>\r\n * @license BSD-3-Clause\r\n * @version 3.6.1\r\n */\n(function (global) {\n\tvar b = /^(b|B)$/,\n\t    symbol = {\n\t\tiec: {\n\t\t\tbits: [\"b\", \"Kib\", \"Mib\", \"Gib\", \"Tib\", \"Pib\", \"Eib\", \"Zib\", \"Yib\"],\n\t\t\tbytes: [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"]\n\t\t},\n\t\tjedec: {\n\t\t\tbits: [\"b\", \"Kb\", \"Mb\", \"Gb\", \"Tb\", \"Pb\", \"Eb\", \"Zb\", \"Yb\"],\n\t\t\tbytes: [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\t\t}\n\t},\n\t    fullform = {\n\t\tiec: [\"\", \"kibi\", \"mebi\", \"gibi\", \"tebi\", \"pebi\", \"exbi\", \"zebi\", \"yobi\"],\n\t\tjedec: [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\", \"exa\", \"zetta\", \"yotta\"]\n\t};\n\n\t/**\r\n  * filesize\r\n  *\r\n  * @method filesize\r\n  * @param  {Mixed}   arg        String, Int or Float to transform\r\n  * @param  {Object}  descriptor [Optional] Flags\r\n  * @return {String}             Readable file size String\r\n  */\n\tfunction filesize(arg) {\n\t\tvar descriptor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar result = [],\n\t\t    val = 0,\n\t\t    e = void 0,\n\t\t    base = void 0,\n\t\t    bits = void 0,\n\t\t    ceil = void 0,\n\t\t    full = void 0,\n\t\t    fullforms = void 0,\n\t\t    neg = void 0,\n\t\t    num = void 0,\n\t\t    output = void 0,\n\t\t    round = void 0,\n\t\t    unix = void 0,\n\t\t    separator = void 0,\n\t\t    spacer = void 0,\n\t\t    standard = void 0,\n\t\t    symbols = void 0;\n\n\t\tif (isNaN(arg)) {\n\t\t\tthrow new Error(\"Invalid arguments\");\n\t\t}\n\n\t\tbits = descriptor.bits === true;\n\t\tunix = descriptor.unix === true;\n\t\tbase = descriptor.base || 2;\n\t\tround = descriptor.round !== void 0 ? descriptor.round : unix ? 1 : 2;\n\t\tseparator = descriptor.separator !== void 0 ? descriptor.separator || \"\" : \"\";\n\t\tspacer = descriptor.spacer !== void 0 ? descriptor.spacer : unix ? \"\" : \" \";\n\t\tsymbols = descriptor.symbols || descriptor.suffixes || {};\n\t\tstandard = base === 2 ? descriptor.standard || \"jedec\" : \"jedec\";\n\t\toutput = descriptor.output || \"string\";\n\t\tfull = descriptor.fullform === true;\n\t\tfullforms = descriptor.fullforms instanceof Array ? descriptor.fullforms : [];\n\t\te = descriptor.exponent !== void 0 ? descriptor.exponent : -1;\n\t\tnum = Number(arg);\n\t\tneg = num < 0;\n\t\tceil = base > 2 ? 1000 : 1024;\n\n\t\t// Flipping a negative number to determine the size\n\t\tif (neg) {\n\t\t\tnum = -num;\n\t\t}\n\n\t\t// Determining the exponent\n\t\tif (e === -1 || isNaN(e)) {\n\t\t\te = Math.floor(Math.log(num) / Math.log(ceil));\n\n\t\t\tif (e < 0) {\n\t\t\t\te = 0;\n\t\t\t}\n\t\t}\n\n\t\t// Exceeding supported length, time to reduce & multiply\n\t\tif (e > 8) {\n\t\t\te = 8;\n\t\t}\n\n\t\t// Zero is now a special case because bytes divide by 1\n\t\tif (num === 0) {\n\t\t\tresult[0] = 0;\n\t\t\tresult[1] = unix ? \"\" : symbol[standard][bits ? \"bits\" : \"bytes\"][e];\n\t\t} else {\n\t\t\tval = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e));\n\n\t\t\tif (bits) {\n\t\t\t\tval = val * 8;\n\n\t\t\t\tif (val >= ceil && e < 8) {\n\t\t\t\t\tval = val / ceil;\n\t\t\t\t\te++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult[0] = Number(val.toFixed(e > 0 ? round : 0));\n\t\t\tresult[1] = base === 10 && e === 1 ? bits ? \"kb\" : \"kB\" : symbol[standard][bits ? \"bits\" : \"bytes\"][e];\n\n\t\t\tif (unix) {\n\t\t\t\tresult[1] = standard === \"jedec\" ? result[1].charAt(0) : e > 0 ? result[1].replace(/B$/, \"\") : result[1];\n\n\t\t\t\tif (b.test(result[1])) {\n\t\t\t\t\tresult[0] = Math.floor(result[0]);\n\t\t\t\t\tresult[1] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Decorating a 'diff'\n\t\tif (neg) {\n\t\t\tresult[0] = -result[0];\n\t\t}\n\n\t\t// Applying custom symbol\n\t\tresult[1] = symbols[result[1]] || result[1];\n\n\t\t// Returning Array, Object, or String (default)\n\t\tif (output === \"array\") {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (output === \"exponent\") {\n\t\t\treturn e;\n\t\t}\n\n\t\tif (output === \"object\") {\n\t\t\treturn { value: result[0], suffix: result[1], symbol: result[1] };\n\t\t}\n\n\t\tif (full) {\n\t\t\tresult[1] = fullforms[e] ? fullforms[e] : fullform[standard][e] + (bits ? \"bit\" : \"byte\") + (result[0] === 1 ? \"\" : \"s\");\n\t\t}\n\n\t\tif (separator.length > 0) {\n\t\t\tresult[0] = result[0].toString().replace(\".\", separator);\n\t\t}\n\n\t\treturn result.join(spacer);\n\t}\n\n\t// Partial application for functional programming\n\tfilesize.partial = function (opt) {\n\t\treturn function (arg) {\n\t\t\treturn filesize(arg, opt);\n\t\t};\n\t};\n\n\t// CommonJS, AMD, script tag\n\tif (typeof exports !== \"undefined\") {\n\t\tmodule.exports = filesize;\n\t} else if (typeof define === \"function\" && define.amd) {\n\t\tdefine(function () {\n\t\t\treturn filesize;\n\t\t});\n\t} else {\n\t\tglobal.filesize = filesize;\n\t}\n})(typeof window !== \"undefined\" ? window : global);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/filesize/lib/filesize.js\n// module id = 890\n// module chunks = 0 1","export const setMomentDate = (moment, date) => {\n  return moment.set('date', date);\n}\n\nexport const setMomentFormat = (moment, format) => {\n  return moment.format(format);\n}\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stores/date_utils.ts","/* MIT license */\nvar convert = require(\"color-convert\"),\n    string = require(\"color-string\");\n\nmodule.exports = function(cssString) {\n   return new Color(cssString);\n};\n\nvar Color = function(cssString) {\n   this.values = {\n      rgb: [0, 0, 0],\n      hsl: [0, 0, 0],\n      hsv: [0, 0, 0],\n      cmyk: [0, 0, 0, 0],\n      alpha: 1\n   }\n\n   // parse Color() argument\n   if (typeof cssString == \"string\") {\n      var vals = string.getRgba(cssString);\n      if (vals) {\n         this.setValues(\"rgb\", vals);\n      }\n      else if(vals = string.getHsla(cssString)) {\n         this.setValues(\"hsl\", vals);\n      }\n   }\n   else if (typeof cssString == \"object\") {\n      var vals = cssString;\n      if(vals[\"r\"] !== undefined || vals[\"red\"] !== undefined) {\n         this.setValues(\"rgb\", vals)\n      }\n      else if(vals[\"l\"] !== undefined || vals[\"lightness\"] !== undefined) {\n         this.setValues(\"hsl\", vals)\n      }\n      else if(vals[\"v\"] !== undefined || vals[\"value\"] !== undefined) {\n         this.setValues(\"hsv\", vals)\n      }\n      else if(vals[\"c\"] !== undefined || vals[\"cyan\"] !== undefined) {\n         this.setValues(\"cmyk\", vals)\n      }\n   }\n}\n\nColor.prototype = {\n   rgb: function (vals) {\n      return this.setSpace(\"rgb\", arguments);\n   },\n   hsl: function(vals) {\n      return this.setSpace(\"hsl\", arguments);\n   },\n   hsv: function(vals) {\n      return this.setSpace(\"hsv\", arguments);\n   },\n   cmyk: function(vals) {\n      return this.setSpace(\"cmyk\", arguments);\n   },\n\n   rgbArray: function() {\n      return this.values.rgb;\n   },\n   hslArray: function() {\n      return this.values.hsl;\n   },\n   hsvArray: function() {\n      return this.values.hsv;\n   },\n   cmykArray: function() {\n      return this.values.cmyk;\n   },\n   rgbaArray: function() {\n      var rgb = this.values.rgb;\n      return rgb.concat([this.values.alpha]);\n   },\n   hslaArray: function() {\n      var hsl = this.values.hsl;\n      return hsl.concat([this.values.alpha]);\n   },\n\n   alpha: function(val) {\n      if (val === undefined) {\n         return this.values.alpha;\n      }\n      this.setValues(\"alpha\", val);\n      return this;\n   },\n\n   red: function(val) {\n      return this.setChannel(\"rgb\", 0, val);\n   },\n   green: function(val) {\n      return this.setChannel(\"rgb\", 1, val);\n   },\n   blue: function(val) {\n      return this.setChannel(\"rgb\", 2, val);\n   },\n   hue: function(val) {\n      return this.setChannel(\"hsl\", 0, val);\n   },\n   saturation: function(val) {\n      return this.setChannel(\"hsl\", 1, val);\n   },\n   lightness: function(val) {\n      return this.setChannel(\"hsl\", 2, val);\n   },\n   saturationv: function(val) {\n      return this.setChannel(\"hsv\", 1, val);\n   },\n   value: function(val) {\n      return this.setChannel(\"hsv\", 2, val);\n   },\n   cyan: function(val) {\n      return this.setChannel(\"cmyk\", 0, val);\n   },\n   magenta: function(val) {\n      return this.setChannel(\"cmyk\", 1, val);\n   },\n   yellow: function(val) {\n      return this.setChannel(\"cmyk\", 2, val);\n   },\n   black: function(val) {\n      return this.setChannel(\"cmyk\", 3, val);\n   },\n\n   hexString: function() {\n      return string.hexString(this.values.rgb);\n   },\n   rgbString: function() {\n      return string.rgbString(this.values.rgb, this.values.alpha);\n   },\n   rgbaString: function() {\n      return string.rgbaString(this.values.rgb, this.values.alpha);\n   },\n   percentString: function() {\n      return string.percentString(this.values.rgb, this.values.alpha);\n   },\n   hslString: function() {\n      return string.hslString(this.values.hsl, this.values.alpha);\n   },\n   hslaString: function() {\n      return string.hslaString(this.values.hsl, this.values.alpha);\n   },\n   keyword: function() {\n      return string.keyword(this.values.rgb, this.values.alpha);\n   },\n\n   luminosity: function() {\n      // http://www.w3.org/TR/WCAG20/#relativeluminancedef\n      var rgb = this.values.rgb;\n      var lum = [];\n      for (var i = 0; i < rgb.length; i++) {\n         var chan = rgb[i] / 255;\n         lum[i] = (chan <= 0.03928) ? chan / 12.92\n                  : Math.pow(((chan + 0.055) / 1.055), 2.4)\n      }\n      return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n   },\n\n   contrast: function(color2) {\n      // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n      var lum1 = this.luminosity();\n      var lum2 = color2.luminosity();\n      if (lum1 > lum2) {\n         return (lum1 + 0.05) / (lum2 + 0.05)\n      };\n      return (lum2 + 0.05) / (lum1 + 0.05);\n   },\n\n   dark: function() {\n      // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n      var rgb = this.values.rgb,\n          yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n   \treturn yiq < 128;\n   },\n\n   light: function() {\n      return !this.dark();\n   },\n\n   negate: function() {\n      var rgb = []\n      for (var i = 0; i < 3; i++) {\n         rgb[i] = 255 - this.values.rgb[i];\n      }\n      this.setValues(\"rgb\", rgb);\n      return this;\n   },\n\n   lighten: function(ratio) {\n      this.values.hsl[2] += this.values.hsl[2] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   darken: function(ratio) {\n      this.values.hsl[2] -= this.values.hsl[2] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   saturate: function(ratio) {\n      this.values.hsl[1] += this.values.hsl[1] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   desaturate: function(ratio) {\n      this.values.hsl[1] -= this.values.hsl[1] * ratio;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   greyscale: function() {\n      var rgb = this.values.rgb;\n      // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n      var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n      this.setValues(\"rgb\", [val, val, val]);\n      return this;\n   },\n\n   clearer: function(ratio) {\n      this.setValues(\"alpha\", this.values.alpha - (this.values.alpha * ratio));\n      return this;\n   },\n\n   opaquer: function(ratio) {\n      this.setValues(\"alpha\", this.values.alpha + (this.values.alpha * ratio));\n      return this;\n   },\n\n   rotate: function(degrees) {\n      var hue = this.values.hsl[0];\n      hue = (hue + degrees) % 360;\n      hue = hue < 0 ? 360 + hue : hue;\n      this.values.hsl[0] = hue;\n      this.setValues(\"hsl\", this.values.hsl);\n      return this;\n   },\n\n   mix: function(color2, weight) {\n      weight = 1 - (weight == null ? 0.5 : weight);\n\n      // algorithm from Sass's mix(). Ratio of first color in mix is\n      // determined by the alphas of both colors and the weight\n      var t1 = weight * 2 - 1,\n          d = this.alpha() - color2.alpha();\n\n      var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2;\n      var weight2 = 1 - weight1;\n\n      var rgb = this.rgbArray();\n      var rgb2 = color2.rgbArray();\n\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2;\n      }\n      this.setValues(\"rgb\", rgb);\n\n      var alpha = this.alpha() * weight + color2.alpha() * (1 - weight);\n      this.setValues(\"alpha\", alpha);\n\n      return this;\n   },\n\n   toJSON: function() {\n     return this.rgb();\n   },\n\n   clone: function() {\n     return new Color(this.rgb());\n   },\n}\n\n\nColor.prototype.getValues = function(space) {\n   var vals = {};\n   for (var i = 0; i < space.length; i++) {\n      vals[space[i]] = this.values[space][i];\n   }\n   if (this.values.alpha != 1) {\n      vals[\"a\"] = this.values.alpha;\n   }\n   // {r: 255, g: 255, b: 255, a: 0.4}\n   return vals;\n}\n\nColor.prototype.setValues = function(space, vals) {\n   var spaces = {\n      \"rgb\": [\"red\", \"green\", \"blue\"],\n      \"hsl\": [\"hue\", \"saturation\", \"lightness\"],\n      \"hsv\": [\"hue\", \"saturation\", \"value\"],\n      \"cmyk\": [\"cyan\", \"magenta\", \"yellow\", \"black\"]\n   };\n\n   var maxes = {\n      \"rgb\": [255, 255, 255],\n      \"hsl\": [360, 100, 100],\n      \"hsv\": [360, 100, 100],\n      \"cmyk\": [100, 100, 100, 100],\n   };\n\n   var alpha = 1;\n   if (space == \"alpha\") {\n      alpha = vals;\n   }\n   else if (vals.length) {\n      // [10, 10, 10]\n      this.values[space] = vals.slice(0, space.length);\n      alpha = vals[space.length];\n   }\n   else if (vals[space[0]] !== undefined) {\n      // {r: 10, g: 10, b: 10}\n      for (var i = 0; i < space.length; i++) {\n        this.values[space][i] = vals[space[i]];\n      }\n      alpha = vals.a;\n   }\n   else if (vals[spaces[space][0]] !== undefined) {\n      // {red: 10, green: 10, blue: 10}\n      var chans = spaces[space];\n      for (var i = 0; i < space.length; i++) {\n        this.values[space][i] = vals[chans[i]];\n      }\n      alpha = vals.alpha;\n   }\n   this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha) ));\n   if (space == \"alpha\") {\n      return;\n   }\n\n   // convert to all the other color spaces\n   for (var sname in spaces) {\n      if (sname != space) {\n         this.values[sname] = convert[space][sname](this.values[space])\n      }\n\n      // cap values\n      for (var i = 0; i < sname.length; i++) {\n         var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i]));\n         this.values[sname][i] = Math.round(capped);\n      }\n   }\n   return true;\n}\n\nColor.prototype.setSpace = function(space, args) {\n   var vals = args[0];\n   if (vals === undefined) {\n      // color.rgb()\n      return this.getValues(space);\n   }\n   // color.rgb(10, 10, 10)\n   if (typeof vals == \"number\") {\n      vals = Array.prototype.slice.call(args);\n   }\n   this.setValues(space, vals);\n   return this;\n}\n\nColor.prototype.setChannel = function(space, index, val) {\n   if (val === undefined) {\n      // color.red()\n      return this.values[space][index];\n   }\n   // color.red(100)\n   this.values[space][index] = val;\n   this.setValues(space, this.values[space]);\n   return this;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/color/color.js\n// module id = 892\n// module chunks = 0 1","/* MIT license */\n\nmodule.exports = {\n  rgb2hsl: rgb2hsl,\n  rgb2hsv: rgb2hsv,\n  rgb2cmyk: rgb2cmyk,\n  rgb2keyword: rgb2keyword,\n  rgb2xyz: rgb2xyz,\n  rgb2lab: rgb2lab,\n\n  hsl2rgb: hsl2rgb,\n  hsl2hsv: hsl2hsv,\n  hsl2cmyk: hsl2cmyk,\n  hsl2keyword: hsl2keyword,\n\n  hsv2rgb: hsv2rgb,\n  hsv2hsl: hsv2hsl,\n  hsv2cmyk: hsv2cmyk,\n  hsv2keyword: hsv2keyword,\n\n  cmyk2rgb: cmyk2rgb,\n  cmyk2hsl: cmyk2hsl,\n  cmyk2hsv: cmyk2hsv,\n  cmyk2keyword: cmyk2keyword,\n  \n  keyword2rgb: keyword2rgb,\n  keyword2hsl: keyword2hsl,\n  keyword2hsv: keyword2hsv,\n  keyword2cmyk: keyword2cmyk,\n  \n  xyz2rgb: xyz2rgb,\n}\n\n\nfunction rgb2hsl(rgb) {\n  var r = rgb[0]/255,\n      g = rgb[1]/255,\n      b = rgb[2]/255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, l;\n\n  if (max == min)\n    h = 0;\n  else if (r == max) \n    h = (g - b) / delta; \n  else if (g == max)\n    h = 2 + (b - r) / delta; \n  else if (b == max)\n    h = 4 + (r - g)/ delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0)\n    h += 360;\n\n  l = (min + max) / 2;\n\n  if (max == min)\n    s = 0;\n  else if (l <= 0.5)\n    s = delta / (max + min);\n  else\n    s = delta / (2 - max - min);\n\n  return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n  var r = rgb[0],\n      g = rgb[1],\n      b = rgb[2],\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      delta = max - min,\n      h, s, v;\n\n  if (max == 0)\n    s = 0;\n  else\n    s = (delta/max * 1000)/10;\n\n  if (max == min)\n    h = 0;\n  else if (r == max) \n    h = (g - b) / delta; \n  else if (g == max)\n    h = 2 + (b - r) / delta; \n  else if (b == max)\n    h = 4 + (r - g) / delta;\n\n  h = Math.min(h * 60, 360);\n\n  if (h < 0) \n    h += 360;\n\n  v = ((max / 255) * 1000) / 10;\n\n  return [h, s, v];\n}\n\nfunction rgb2cmyk(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255,\n      c, m, y, k;\n      \n  k = Math.min(1 - r, 1 - g, 1 - b);\n  c = (1 - r - k) / (1 - k);\n  m = (1 - g - k) / (1 - k);\n  y = (1 - b - k) / (1 - k);\n  return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n  return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n  var r = rgb[0] / 255,\n      g = rgb[1] / 255,\n      b = rgb[2] / 255;\n\n  // assume sRGB\n  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n  \n  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n  return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n  var xyz = rgb2xyz(rgb),\n        x = xyz[0],\n        y = xyz[1],\n        z = xyz[2],\n        l, a, b;\n\n  x /= 95.047;\n  y /= 100;\n  z /= 108.883;\n\n  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n  l = (116 * y) - 16;\n  a = 500 * (x - y);\n  b = 200 * (y - z);\n  \n  return [l, a, b];\n}\n\n\nfunction hsl2rgb(hsl) {\n  var h = hsl[0] / 360,\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      t1, t2, t3, rgb, val;\n\n  if (s == 0) {\n    val = l * 255;\n    return [val, val, val];\n  }\n\n  if (l < 0.5)\n    t2 = l * (1 + s);\n  else\n    t2 = l + s - l * s;\n  t1 = 2 * l - t2;\n\n  rgb = [0, 0, 0];\n  for (var i = 0; i < 3; i++) {\n    t3 = h + 1 / 3 * - (i - 1);\n    t3 < 0 && t3++;\n    t3 > 1 && t3--;\n\n    if (6 * t3 < 1)\n      val = t1 + (t2 - t1) * 6 * t3;\n    else if (2 * t3 < 1)\n      val = t2;\n    else if (3 * t3 < 2)\n      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n    else\n      val = t1;\n\n    rgb[i] = val * 255;\n  }\n  \n  return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n  var h = hsl[0],\n      s = hsl[1] / 100,\n      l = hsl[2] / 100,\n      sv, v;\n  l *= 2;\n  s *= (l <= 1) ? l : 2 - l;\n  v = (l + s) / 2;\n  sv = (2 * s) / (l + s);\n  return [h, s * 100, v * 100];\n}\n\nfunction hsl2cmyk(args) {\n  return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n  return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n  var h = hsv[0] / 60,\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      hi = Math.floor(h) % 6;\n\n  var f = h - Math.floor(h),\n      p = 255 * v * (1 - s),\n      q = 255 * v * (1 - (s * f)),\n      t = 255 * v * (1 - (s * (1 - f))),\n      v = 255 * v;\n\n  switch(hi) {\n    case 0:\n      return [v, t, p];\n    case 1:\n      return [q, v, p];\n    case 2:\n      return [p, v, t];\n    case 3:\n      return [p, q, v];\n    case 4:\n      return [t, p, v];\n    case 5:\n      return [v, p, q];\n  }\n}\n\nfunction hsv2hsl(hsv) {\n  var h = hsv[0],\n      s = hsv[1] / 100,\n      v = hsv[2] / 100,\n      sl, l;\n\n  l = (2 - s) * v;  \n  sl = s * v;\n  sl /= (l <= 1) ? l : 2 - l;\n  l /= 2;\n  return [h, sl * 100, l * 100];\n}\n\nfunction hsv2cmyk(args) {\n  return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n  return rgb2keyword(hsv2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n  var c = cmyk[0] / 100,\n      m = cmyk[1] / 100,\n      y = cmyk[2] / 100,\n      k = cmyk[3] / 100,\n      r, g, b;\n\n  r = 1 - Math.min(1, c * (1 - k) + k);\n  g = 1 - Math.min(1, m * (1 - k) + k);\n  b = 1 - Math.min(1, y * (1 - k) + k);\n  return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n  return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n  return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n  return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n  var x = xyz[0] / 100,\n      y = xyz[1] / 100,\n      z = xyz[2] / 100,\n      r, g, b;\n\n  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n  // assume sRGB\n  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n    : r = (r * 12.92);\n\n  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n    : g = (g * 12.92);\n        \n  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n    : b = (b * 12.92);\n\n  r = (r < 0) ? 0 : r;\n  g = (g < 0) ? 0 : g;\n  b = (b < 0) ? 0 : b;\n\n  return [r * 255, g * 255, b * 255];\n}\n\n\nfunction keyword2rgb(keyword) {\n  return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n  return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n  return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n  return rgb2cmyk(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n  aliceblue:  [240,248,255],\n  antiquewhite: [250,235,215],\n  aqua: [0,255,255],\n  aquamarine: [127,255,212],\n  azure:  [240,255,255],\n  beige:  [245,245,220],\n  bisque: [255,228,196],\n  black:  [0,0,0],\n  blanchedalmond: [255,235,205],\n  blue: [0,0,255],\n  blueviolet: [138,43,226],\n  brown:  [165,42,42],\n  burlywood:  [222,184,135],\n  cadetblue:  [95,158,160],\n  chartreuse: [127,255,0],\n  chocolate:  [210,105,30],\n  coral:  [255,127,80],\n  cornflowerblue: [100,149,237],\n  cornsilk: [255,248,220],\n  crimson:  [220,20,60],\n  cyan: [0,255,255],\n  darkblue: [0,0,139],\n  darkcyan: [0,139,139],\n  darkgoldenrod:  [184,134,11],\n  darkgray: [169,169,169],\n  darkgreen:  [0,100,0],\n  darkgrey: [169,169,169],\n  darkkhaki:  [189,183,107],\n  darkmagenta:  [139,0,139],\n  darkolivegreen: [85,107,47],\n  darkorange: [255,140,0],\n  darkorchid: [153,50,204],\n  darkred:  [139,0,0],\n  darksalmon: [233,150,122],\n  darkseagreen: [143,188,143],\n  darkslateblue:  [72,61,139],\n  darkslategray:  [47,79,79],\n  darkslategrey:  [47,79,79],\n  darkturquoise:  [0,206,209],\n  darkviolet: [148,0,211],\n  deeppink: [255,20,147],\n  deepskyblue:  [0,191,255],\n  dimgray:  [105,105,105],\n  dimgrey:  [105,105,105],\n  dodgerblue: [30,144,255],\n  firebrick:  [178,34,34],\n  floralwhite:  [255,250,240],\n  forestgreen:  [34,139,34],\n  fuchsia:  [255,0,255],\n  gainsboro:  [220,220,220],\n  ghostwhite: [248,248,255],\n  gold: [255,215,0],\n  goldenrod:  [218,165,32],\n  gray: [128,128,128],\n  green:  [0,128,0],\n  greenyellow:  [173,255,47],\n  grey: [128,128,128],\n  honeydew: [240,255,240],\n  hotpink:  [255,105,180],\n  indianred:  [205,92,92],\n  indigo: [75,0,130],\n  ivory:  [255,255,240],\n  khaki:  [240,230,140],\n  lavender: [230,230,250],\n  lavenderblush:  [255,240,245],\n  lawngreen:  [124,252,0],\n  lemonchiffon: [255,250,205],\n  lightblue:  [173,216,230],\n  lightcoral: [240,128,128],\n  lightcyan:  [224,255,255],\n  lightgoldenrodyellow: [250,250,210],\n  lightgray:  [211,211,211],\n  lightgreen: [144,238,144],\n  lightgrey:  [211,211,211],\n  lightpink:  [255,182,193],\n  lightsalmon:  [255,160,122],\n  lightseagreen:  [32,178,170],\n  lightskyblue: [135,206,250],\n  lightslategray: [119,136,153],\n  lightslategrey: [119,136,153],\n  lightsteelblue: [176,196,222],\n  lightyellow:  [255,255,224],\n  lime: [0,255,0],\n  limegreen:  [50,205,50],\n  linen:  [250,240,230],\n  magenta:  [255,0,255],\n  maroon: [128,0,0],\n  mediumaquamarine: [102,205,170],\n  mediumblue: [0,0,205],\n  mediumorchid: [186,85,211],\n  mediumpurple: [147,112,219],\n  mediumseagreen: [60,179,113],\n  mediumslateblue:  [123,104,238],\n  mediumspringgreen:  [0,250,154],\n  mediumturquoise:  [72,209,204],\n  mediumvioletred:  [199,21,133],\n  midnightblue: [25,25,112],\n  mintcream:  [245,255,250],\n  mistyrose:  [255,228,225],\n  moccasin: [255,228,181],\n  navajowhite:  [255,222,173],\n  navy: [0,0,128],\n  oldlace:  [253,245,230],\n  olive:  [128,128,0],\n  olivedrab:  [107,142,35],\n  orange: [255,165,0],\n  orangered:  [255,69,0],\n  orchid: [218,112,214],\n  palegoldenrod:  [238,232,170],\n  palegreen:  [152,251,152],\n  paleturquoise:  [175,238,238],\n  palevioletred:  [219,112,147],\n  papayawhip: [255,239,213],\n  peachpuff:  [255,218,185],\n  peru: [205,133,63],\n  pink: [255,192,203],\n  plum: [221,160,221],\n  powderblue: [176,224,230],\n  purple: [128,0,128],\n  red:  [255,0,0],\n  rosybrown:  [188,143,143],\n  royalblue:  [65,105,225],\n  saddlebrown:  [139,69,19],\n  salmon: [250,128,114],\n  sandybrown: [244,164,96],\n  seagreen: [46,139,87],\n  seashell: [255,245,238],\n  sienna: [160,82,45],\n  silver: [192,192,192],\n  skyblue:  [135,206,235],\n  slateblue:  [106,90,205],\n  slategray:  [112,128,144],\n  slategrey:  [112,128,144],\n  snow: [255,250,250],\n  springgreen:  [0,255,127],\n  steelblue:  [70,130,180],\n  tan:  [210,180,140],\n  teal: [0,128,128],\n  thistle:  [216,191,216],\n  tomato: [255,99,71],\n  turquoise:  [64,224,208],\n  violet: [238,130,238],\n  wheat:  [245,222,179],\n  white:  [255,255,255],\n  whitesmoke: [245,245,245],\n  yellow: [255,255,0],\n  yellowgreen:  [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/color/node_modules/color-convert/conversions.js\n// module id = 893\n// module chunks = 0 1","/* MIT license */\nvar convert = require(\"color-convert\");\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3})$/,\n       hex =  /^#([a-fA-F0-9]{6})$/,\n       rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)$/,\n       per = /^rgba?\\(\\s*([\\d\\.]+)\\%\\s*,\\s*([\\d\\.]+)\\%\\s*,\\s*([\\d\\.]+)\\%\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)$/,\n       keyword = /(\\D+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr);\n   if (match) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n   }\n   else if (match = string.match(hex)) {\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = convert.keyword2rgb(match[1]);\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb.push(a);\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*(\\d+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*(?:,\\s*([\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(parseFloat(match[4]) || 1, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getRgb(string) {\n   return getRgba(string).slice(0, 3);\n}\n\nfunction getHsl(string) {\n   return getHsla(string).slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgb) {\n   return \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1])\n              + hexDouble(rgb[2]);\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\nfunction keyword(rgb) {\n   return convert.rgb2keyword(rgb.slice(0, 3));\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/color/node_modules/color-string/color-string.js\n// module id = 894\n// module chunks = 0 1","import _ from 'lodash';\nimport moment from 'moment';\nimport 'moment-range';\nimport numeral from 'numeral';\n\nimport { findColumnByName } from '../utils/schema_utils';\nimport { getAmountColumn } from '../utils/transactions_utils';\nimport { getGridState } from '../stores/grid_report_store';\nimport {\n  generateDateRangePairs,\n  dateToMoment,\n  fiscalYearForDatasetDateRange\n} from '../utils/time_utils';\n\nconst MINIMUM_PARALLELISM = 4;\nconst POSTGRES_LIMIT = 2048;\n\nfunction buildVisualAggregatesQueryPlan(state, queryPlannerOptions: { allowParallel?: boolean, isSummaryTableQuery?: boolean } = {}) {\n  const schema = state.get('schema');\n  if (schema.get('amountColumn') == null) {  // TODO(josh): better way to check if schema is not loaded?\n    return null;\n  }\n\n  const fiscalYearStartMonth = schema.get('fiscalYearStartMonth');\n  const visualization = state.get('visualization');\n  const amountColumn = getAmountColumn(visualization, schema);\n  const dateColumnName = schema.get('dateColumn');\n  const allowParallel = queryPlannerOptions && queryPlannerOptions.allowParallel;\n  const isSummaryTableQuery = queryPlannerOptions && queryPlannerOptions.isSummaryTableQuery;\n\n  const sort = 'desc';\n  const sumField = `${amountColumn}_sum`;\n  const limit = isSummaryTableQuery && allowParallel ? POSTGRES_LIMIT : visualization.get('limit');\n\n  const breakdownByField = visualization.get('breakdown');\n  const sorting = [{[sumField]: sort}];\n  //desc, sort by 'asc' for things that are negative -> such as min; server side make abs would be better(leland)\n\n  const gridState = getGridState(state);\n  const isBarGraph = visualization.get('graphType') === 'bar';\n  const isLineGraph = visualization.get('graphType') === 'line';\n\n  const hasMultipleTicks = isLineGraph || isBarGraph;\n\n  let filter = gridState.getIn(['query', 'filter']);\n  filter = filter && filter.toJS && filter.toJS() || {}; // in case we have no filter\n  const { ge, le, min_value, max_value } = getDateLimitsFromFilterState(filter, schema, dateColumnName);\n  const { start, end, dateRange, dateRangeLength, hasDateBoundsAdjusted } = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value);\n\n  const alternatePartitioningColumnName = findAlternateDateColumnForPartitioning(schema, filter);\n  let baseQuery = {\n    group: breakdownByField,\n    filter,\n    sort: sorting,\n    fields: [amountColumn],\n    limit,\n    group_by_year_month: null\n  };\n\n  const plan = {\n    queries: [],\n    strategy: null,\n    reducer: createSumAcrossGroupsReducer(breakdownByField, amountColumn, sorting, limit),\n    mapper: null,\n    planOptions: queryPlannerOptions,\n    branches: {\n      calendarAligned: false,\n      partitionColumnName: false,\n      allowParallel,\n      dateRangeLength,\n      hasMultipleTicks,\n      hasDateBoundsAdjusted,\n      isExactlyOneYear: false,\n      isFiscalYearAligned: false,\n      hasLeapDay: false\n    },\n    isSummaryTableQuery\n  };\n\n  let group_by = 'group_by_fiscal_year';\n  const group_by_body = {\n    column: dateColumnName,\n    fiscal_year_start_month: fiscalYearStartMonth\n  };\n\n  // Toggle monthly view automatically if date range of dataset is less than 366 days\n  if (dateRangeLength <= 366) {\n    const isExactlyOneYear = dateRangeExactlyOneYear(dateRange);\n    const isFiscalYearAligned = (parseInt(start.format('M')) === fiscalYearStartMonth);\n    const hasLeapDay = dateRangeContainsLeapYear(dateRange);\n    const hasMultipleFiscalYears = (isExactlyOneYear && (!isFiscalYearAligned && !hasDateBoundsAdjusted));\n    plan.branches.isExactlyOneYear = isExactlyOneYear;\n    plan.branches.isFiscalYearAligned = isFiscalYearAligned;\n    plan.branches.hasLeapDay = hasLeapDay;\n\n    // if we have exactly one year and starting month is aligned with fiscal year\n    // start month / the date bounds have been adjusted\n    if (isExactlyOneYear && (isFiscalYearAligned || hasDateBoundsAdjusted)) {\n      group_by_body['fiscal_year'] = start.year();\n\n      if (hasMultipleTicks) {\n        // if we have a bar / line graph\n        group_by = 'group_by_month';\n      } else {\n        group_by = 'group_by_fiscal_year';\n\n        // if we have a non bar graph with yearly data, we don't want to filter out\n        // the rest of the years within visual aggregates because it would remove those xAxis ticks\n        filter[dateColumnName] = dateRangeFilter([min_value, max_value]);\n\n        const nMonths = moment.range(min_value, max_value).toArray('months').length;\n        if (nMonths === 1 && alternatePartitioningColumnName) {\n          plan.branches.partitionColumnName = alternatePartitioningColumnName;\n        }\n      }\n    }\n\n    // if we have exactly one year, and starting month is not aligned with fiscal\n    // year or start month & the date bounds have been not been adjusted,\n    // in that case, it actually belongs to multiple fiscal years and shouldn't have monthly view\n    // (And) if date range of dataset is less than 365 days or date range has a leap day,\n    // monthly view should be rendered\n    if (!hasMultipleFiscalYears && (dateRangeLength < 365 || hasLeapDay)) {\n\n      if (hasMultipleTicks) {\n        // if we have a bar / line graph\n        const monthPairList = generateMonthPairList(start, end);\n        group_by_body['year_month_pairs'] = monthPairList;\n        baseQuery = {\n          ...baseQuery,\n          group_by_year_month: group_by_body\n        };\n\n        if (allowParallel) {\n          // NOTE: alternatePartitioningColumnName will not choose a column that already has a complex filter on it.\n          if (monthPairList.length === 1 && alternatePartitioningColumnName) {\n            plan.branches.partitionColumnName = alternatePartitioningColumnName;\n            plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, alternatePartitioningColumnName);\n            plan.mapper = createPartitionCompletenessMapper();\n            plan.strategy = 'parallel_via_alternate_date_column_filter';\n          } else {\n            // Parallelize via group_by_year_month pairs\n            plan.queries = parallelMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n            plan.strategy = 'parallel_via_month_group_pairs';\n          }\n        } else {\n          plan.queries = [visAggQueryObject(baseQuery)];\n          plan.strategy = 'single_query';\n        }\n\n        return plan;\n      } else {\n        // if we have non bar graph\n        if (dateRangeLength < 365) {\n          // if the date range of dataset is less than 365 days\n          group_by = 'group_by_fiscal_year';\n          group_by_body['fiscal_year'] = start.year();\n\n          // if we have a non bar graph with yearly data, we don't want to filter out\n          // the rest of the years within visual aggregates because it would remove those xAxis ticks\n          if (!filter[dateColumnName]) { // only apply a filter if there isn't one\n            filter[dateColumnName] = dateRangeFilter([min_value, max_value]);\n          }\n        } else {\n          group_by = 'group_by_month';\n          group_by_body['fiscal_year'] = fiscalYearForDatasetDateRange(start, end, fiscalYearStartMonth);\n\n          // if we have a non bar graph with monthly data, we don't want to filter out\n          // the rest of the month within visual aggregates because it would remove those xAxis ticks\n          filter[dateColumnName] = {\n            ge: `${start.year()}-01-01`,\n            le: `${start.year()}-12-31`\n          };\n        }\n      }\n    }\n  }\n  baseQuery[group_by] = group_by_body;\n  if (allowParallel) {\n    if (group_by === 'group_by_month') {\n      plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n      plan.strategy = 'parallel_via_month_filters';\n    } else if (group_by === 'group_by_fiscal_year' && plan.branches.partitionColumnName) {\n      plan.queries = partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, plan.branches.partitionColumnName);\n      plan.mapper = createPartitionCompletenessMapper();\n      plan.strategy = 'parallel_via_alternate_date_column_filter';\n    } else {\n      plan.queries = parallelYearQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName);\n      plan.strategy = 'parallel_via_year_filters';\n    }\n  } else {\n    plan.queries = [visAggQueryObject(baseQuery)];\n    plan.strategy = 'single_query';\n  }\n  return plan;\n}\n\nfunction parallelYearQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName) {\n  const { filter } = baseQuery;\n  const { ge, le, min_value, max_value } = getDateLimitsFromFilterState(filter, schema, dateColumnName);\n  const { start, end } = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value);\n  const yearPairs = generateDateRangePairs(start, end, schema.get('fiscalYearStartMonth'));\n\n  return parallelDateRangeFilterQueries(baseQuery, yearPairs, dateColumnName);\n}\n\nfunction parallelMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, dateColumnName) {\n  const { filter, group_by_year_month: group_by_body } = baseQuery;\n  const { ge, le, min_value, max_value } = getDateLimitsFromFilterState(filter, schema, dateColumnName);\n  const { start, end } = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value);\n  const monthPairList = generateMonthPairList(start, end);\n\n  return _.map(monthPairList, pair =>\n    visAggQueryObject({\n      ...baseQuery,\n      group_by_year_month: {\n        ...group_by_body,\n        year_month_pairs: [pair]\n      }\n    })\n  );\n}\n\nfunction partitionByMonthQueriesOnDateColumn(baseQuery, schema, hasMultipleTicks, partitioningDateColumnName) {\n  const { filter } = baseQuery;\n  const { ge, le, min_value, max_value } = getDateLimitsFromFilterState(filter, schema, partitioningDateColumnName);\n  const { start, end } = getDateBounds(hasMultipleTicks, ge, le, min_value, max_value);\n  const monthRanges = generateDateRangePairs(start, end, schema.get('fiscalYearStartMonth'), 'months');\n\n  // Parallelize via filters\n  return parallelDateRangeFilterQueries(baseQuery, monthRanges, partitioningDateColumnName);\n}\n\nfunction parallelDateRangeFilterQueries(baseQuery, ranges, dateColumnName) {\n  const { filter } = baseQuery;\n\n  const queries = _.map(ranges, range => {\n    // If there was user-applied filter on dateColumn,\n    // then we need to merge that instead of overriding to not loose prevous filter selection\n    const appendedDateColumnFilter = filter[dateColumnName] ? _.assign({}, filter[dateColumnName], dateRangeFilter(range)) : dateRangeFilter(range);\n    return visAggQueryObject({\n      ...baseQuery,\n      filter: {\n        ...filter,\n        [dateColumnName]: appendedDateColumnFilter\n      }\n    });\n  });\n\n  // If there was no user or automatic filter applied to the date column, then we need one more query for IS NULL\n  if (!filter[dateColumnName]) {\n    queries.push(visAggQueryObject({\n      ...baseQuery,\n      filter: {\n        ...filter,\n        [dateColumnName]: { 'null': true }\n      }\n    }));\n  }\n\n  return queries;\n}\n\n//\n// Mappers\n//\n\nfunction createPartitionCompletenessMapper() {\n  return (partialTransactions) => {\n    const anyMissed = _.some(partialTransactions, (periodGroup: any) => {\n      return periodGroup.total_count_estimate > periodGroup.transactions.length;\n    });\n    if (anyMissed) { throw new Error('Groups missed. Running long query'); }\n    return partialTransactions;\n  };\n}\n\n//\n// Reducers\n//\n\n// NOTE: This does not support stddev or variance\nfunction createSumAcrossGroupsReducer(breakdownByField, amountColumn, sorting, limit) {\n  const sumField = `${amountColumn}_sum`;\n  const avgField = `${amountColumn}_avg`;\n  const minField = `${amountColumn}_min`;\n  const maxField = `${amountColumn}_max`;\n  const countField = 'count';\n  const totalField = 'total';\n\n  return (transactions: any) => {\n    // Combine same years by summing groups\n    const transactionsCleaned = _.flatten(_.filter(transactions, (result: any) => result.transactions.length !== 0));\n    const transactionsGrouped = _.groupBy(transactionsCleaned, g => `${g.fiscal_year}_${g.year}_${g.month}_${g.start_day}_${g.end_day}`);\n    return _.map(transactionsGrouped, (resultGroup) => {\n      const retGroup = {\n        ...resultGroup[0],\n        total_count_estimate: 0,\n        remaining: 0,\n        transactions: null\n      };\n      const groups = {};\n\n      // Sum Groups together\n      _.forEach(resultGroup, (result: any) => {\n        _.forEach(result.transactions, (group: any) => {\n          const groupName = group[breakdownByField];\n\n          if (!groups[groupName]) {\n            groups[groupName] = group;\n            return;\n          }\n          const accum = groups[groupName];\n\n          _.forEach(group, (v, k) => {\n            if (k === countField || k === totalField || k === sumField) {\n              accum[k] = parseFloat(accum[k]) + parseFloat(v); // TODO: Might want to use integers here instead of floats.\n            } else if (k === minField) {\n              accum[k] = Math.min(accum[k], v);\n            } else if (k === maxField) {\n              accum[k] = Math.max(accum[k], v);\n            }\n          });\n        });\n\n        retGroup.total_count_estimate += result.total_count_estimate;\n        retGroup.remaining += result.remaining;\n      });\n\n      // Finalize amounts\n      _.forEach(groups, (group: any) => {\n        group[sumField] = _.round(group[sumField], 2); // TODO: i18n l10n Localization might want to customize this!\n        group[totalField] = numeral(group[sumField]).format('0.0000');\n        group[avgField] = group[sumField] / group.count;\n        // TODO: http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Parallel_algorithm\n      });\n\n      // Sort amounts using the specified sorting array\n      const sortedGroups = sortGroups(_.values(groups), sorting);\n\n      // Limit groups using limit parameter, put rest into \"Remaining\"\n      const aggregated = sortedGroups.slice(0, limit);\n      retGroup.transactions = aggregated;\n      retGroup.remaining += _.sumBy(sortedGroups.slice(limit), sumField);\n      retGroup.remaining = _.round(retGroup.remaining, 2); // TODO: i18n l10n Localization might want to customize this!\n\n      return retGroup;\n    });\n  };\n}\n\nfunction sortGroups(groups, sorting) {\n  const iteratees = _.flatten(_.map(sorting, _.keys));\n  const orders: any = _.flatten(_.map(sorting, _.values));\n  return _.orderBy(groups, iteratees, orders);\n}\n\nfunction visAggQueryObject(input) {\n  return {\n    remaining: true,\n    count: true,\n    total: true,\n\n    ...input\n  };\n}\n\nfunction findAlternateDateColumnForPartitioning(schema, filter) {\n  const defaultDateColumn = schema.get('dateColumn');\n  const column = schema.get('columns').find((c) => {\n    if (c.get('name') === defaultDateColumn) { return; }\n    if (c.get('type') !== 'date') { return; }\n\n    // We can deal with \"ge\" and \"le\", but other filters aren't so easy.\n    const trickyFilters = _.omit(filter[c.get('name')], ['ge', 'le']);\n    if (!_.isEmpty(trickyFilters)) { return; }\n\n    return dateToMoment(c.get('max_value')).diff(dateToMoment(c.get('min_value')), 'months') >= MINIMUM_PARALLELISM;\n  });\n  return column && column.get('name');\n}\n\n//\n// Additional DateColumn Utils\n//\n\nfunction getDateLimitsFromFilterState(filter, schema, dateColumnName) {\n  const dateColumn = findColumnByName(schema, dateColumnName);\n  const dateColumnFilter = filter && filter[dateColumnName];\n\n  const min_value = dateToMoment(dateColumn.get('min_value'));\n  const max_value = dateToMoment(dateColumn.get('max_value'));\n\n  const ge = dateColumnFilter && dateColumnFilter.hasOwnProperty('ge') ? dateToMoment(dateColumnFilter.ge) : min_value;\n  const le = dateColumnFilter && dateColumnFilter.hasOwnProperty('le') ? dateToMoment(dateColumnFilter.le) : max_value;\n\n  return { ge, le, min_value, max_value };\n}\n\nfunction dateRangeFilter(rangeOfMoments) {\n  return {\n    ge: rangeOfMoments[0].format('YYYY-MM-DD'),\n    le: rangeOfMoments[1].format('YYYY-MM-DD')\n  };\n}\n\nfunction getDateBounds(hasMultipleTicks, ge, le, min_value, max_value) {\n  const schemaDateRange = moment.range(min_value, max_value);\n  const schemaDateRangeLength = schemaDateRange.toArray('days').length;\n\n  let start = ge.isAfter(min_value) ? ge : min_value; //To prevent going outside of date range\n  let end = le.isBefore(max_value) ? le : max_value;\n\n  let dateRange = moment.range(start, end);\n  let dateRangeLength = dateRange.toArray('days').length;\n\n  let hasDateBoundsAdjusted = false;\n\n  //The date range filter is adjusted above to prevent going outside of date range\n  //For non bar graphs, if the schema date range is greater than a year and\n  //the date range filter is less than a year, the year slider doesn't show\n  //As a workaround, we reset the date range to one year\n  if (!hasMultipleTicks && (schemaDateRangeLength > 366 && dateRangeLength < 365)) {\n    start = ge; // reset start to ge\n    end = moment(ge - 1).add(1, 'y'); // add 1 year but remove the extra day\n\n    dateRange = moment.range(start, end);\n    dateRangeLength = dateRange.toArray('days').length;\n\n    hasDateBoundsAdjusted = true;\n  }\n\n  return { start, end, dateRange, dateRangeLength, hasDateBoundsAdjusted };\n}\n\nfunction generateMonthPair(date, isStart = false, isEnd = false) {\n  const monthPair = {\n    year: date.year(),\n    month: date.month() + 1, // `+ 1` because months are zero indexed but our API isn't\n    start_day: null,\n    end_day: null\n  };\n\n  if (isStart || isEnd) {\n    const day = parseInt(date.format('D'));\n    if (isStart) monthPair.start_day = day;\n    if (isEnd) monthPair.end_day = day;\n  }\n\n  return monthPair;\n}\n\nfunction generateMonthPairList(start, end) {\n  const generated = generateDateRangePairs(start, end, 1, 'months');\n  const size = generated.length;\n  const monthPairList: { end_day?, year, month }[] = generated.map(range => generateMonthPair(range[0]));\n\n  // Start\n  monthPairList[0] = generateMonthPair(start, true);\n\n  // End\n  if (size === 1) {\n    monthPairList[0].end_day = parseInt(end.format('D')); // `parseInt` because our API doesn't want days as strings\n  } else {\n    monthPairList[size - 1] = generateMonthPair(end, false, true);\n  }\n\n  return monthPairList;\n}\n\n// Really checks for leap day, not only leap year.\nfunction dateRangeContainsLeapYear(dateRange) {\n  let startYear = dateRange.start.year();\n  let endYear = dateRange.end.year();\n  let containsLeapYear = false;\n\n  while (startYear <= endYear) {\n    containsLeapYear = moment(startYear, 'YYYY').isLeapYear() && dateRange.contains(moment([startYear, 1, 29])) ? true : containsLeapYear;\n    startYear++;\n  }\n\n  return containsLeapYear;\n}\n\n// 365 days or 366 if includes Feb 29th\nfunction dateRangeExactlyOneYear(dateRange) {\n  const yearLength = dateRangeContainsLeapYear(dateRange) ? 366 : 365;\n  return (yearLength == dateRange.toArray('days').length);\n}\n\nexport {\n  //\n  // Exports\n  //\n  buildVisualAggregatesQueryPlan,\n\n  //\n  // Exports used for Testing Only!\n  //\n  parallelYearQueriesOnDateColumn, // TODO: needs tests\n  parallelMonthQueriesOnDateColumn, // TODO: needs tests\n  partitionByMonthQueriesOnDateColumn, // TODO: needs tests\n  parallelDateRangeFilterQueries, // TODO: needs tests\n\n  createSumAcrossGroupsReducer,\n  sortGroups,\n  findAlternateDateColumnForPartitioning,\n  visAggQueryObject, // TODO: needs tests\n  getDateLimitsFromFilterState,\n  getDateBounds,\n  generateMonthPair,\n  generateMonthPairList, // TODO: needs tests\n  dateRangeContainsLeapYear,\n  dateRangeExactlyOneYear, // TODO: needs tests\n  dateRangeFilter // TODO: needs tests\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/query_planners/visual_aggregate_planner.ts","import moment from 'moment';\nimport 'moment-range';\n\nexport function generateDateRangePairs(startMoment, endMoment, fiscalYearStartMonth = 1, granularity = 'years') {\n  let currentMoment = startMoment;\n  let start;\n  let end;\n  const pairs = [];\n  const fiscalYearOffset = fiscalYearStartMonth - 1;\n\n  while (currentMoment.isSame(endMoment) || currentMoment.isBefore(endMoment)) {\n    start = currentMoment.clone().startOf(granularity);\n    if (granularity === 'years' && fiscalYearStartMonth > 1) {\n      start.add(fiscalYearOffset, 'months');\n\n      // Initial value needs to start in previous fiscal year\n      if (currentMoment === startMoment) { start.subtract(1, 'years'); }\n    }\n    end = start.clone().add(1, granularity).subtract(1, 'days');\n\n    // Squeeze to absolute bounds\n    if (start.isBefore(startMoment)) { start = startMoment; }\n    if (end.isAfter(endMoment)) { end = endMoment; }\n\n    // Only add if we generated a valid range\n    if (start.isBefore(end) || start.isSame(end)) {\n      pairs.push([start, end]);\n    }\n    currentMoment = end.clone().add(1, 'day');\n  }\n\n  return pairs;\n}\n\nexport function dateToMoment(string) {\n  return moment(string, 'YYYY-MM-DD');\n}\n\n// NOTE: This function is only for use with a range of *at most* 365 days (leap year)\n// NOTE: This function assumes that the range of start & end were generated from a dataset implying:\n//          dataset year == 2017 & entity startMonth = 7 => a range of 07/2017 -> 06/2018\nexport function fiscalYearForDatasetDateRange(startMoment, endMoment, startMomentMonth) {\n  if (startMoment.isAfter(endMoment)) {\n    throw new Error('startMoment cannot be after endMoment');\n  }\n\n  const yearLength = moment(startMoment, 'YYYY').isLeapYear() ? 366 : 365;\n  // moment.js months are zero-indexed\n  if (moment.range(startMoment, endMoment).toArray('days').length <= yearLength && ((endMoment.month() + 1) % 12) < startMomentMonth - 1) {\n    return startMoment.year() - 1;\n  }\n\n  return startMoment.year();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/time_utils.ts","export default function(uuid) {\n  let result = uuid;\n  if (result && result.length === 32) {\n    result = result.toLowerCase();\n    [20, 16, 12, 8].forEach(function(value) {\n      result = result.slice(0, value) + '-' + result.slice(value);\n    });\n  }\n  return result;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/uuid_converter.ts","import request from 'superagent';\n\nconst googleTranslateAPI = (words) => {\n  return new Promise((resolve, reject) => {\n    request\n      .post('/translate')\n      .set('Accept', 'application/json')\n      .set('Content-Type', 'application/json')\n      .send({ words: words})\n      .end((err, res) => {\n        if (err || !res.ok) {\n          reject(err);\n        } else {\n          resolve(res.body);\n        }\n      });\n  });\n};\n\nexport default googleTranslateAPI;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/google_translate.ts","import Fuse from 'fuse.js';\nimport _ from 'lodash';\n\nexport function trimAndFilterText(text) {\n  return text.replace(/[^0-9a-zA-Z]+/g, ' ').trim();\n}\n\nexport function filterItems(items, keys, query) {\n  if (!items.length || query === '') {\n    return items;\n  }\n\n  // coerce fields to string to make searchable\n  let searchableItems = items.map(item => (\n      _.reduce(item, (acc, value, key) => ({\n        ...acc,\n        [key]: keys.includes(key) ? String(value) : value\n      }), {})\n    ), {});\n\n  const fuse = new Fuse(searchableItems, {\n    keys,\n    threshold: 0.8\n  });\n\n  return fuse.search(trimAndFilterText(query));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/search_utils.ts","/**\n * @license\n * Fuse - Lightweight fuzzy-search\n *\n * Copyright (c) 2012-2016 Kirollos Risk <kirollos@gmail.com>.\n * All Rights Reserved. Apache Software License 2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n;(function (global) {\n  'use strict'\n\n  function log () {\n    console.log.apply(console, arguments)\n  }\n\n  var MULTI_CHAR_REGEX = / +/g\n\n  var defaultOptions = {\n    // The name of the identifier property. If specified, the returned result will be a list\n    // of the items' dentifiers, otherwise it will be a list of the items.\n    id: null,\n\n    // Indicates whether comparisons should be case sensitive.\n\n    caseSensitive: false,\n\n    // An array of values that should be included from the searcher's output. When this array\n    // contains elements, each result in the list will be of the form `{ item: ..., include1: ..., include2: ... }`.\n    // Values you can include are `score`, `matchedLocations`\n    include: [],\n\n    // Whether to sort the result list, by score\n    shouldSort: true,\n\n    // The search function to use\n    // Note that the default search function ([[Function]]) must conform to the following API:\n    //\n    //  @param pattern The pattern string to search\n    //  @param options The search option\n    //  [[Function]].constructor = function(pattern, options)\n    //\n    //  @param text: the string to search in for the pattern\n    //  @return Object in the form of:\n    //    - isMatch: boolean\n    //    - score: Int\n    //  [[Function]].prototype.search = function(text)\n    searchFn: BitapSearcher,\n\n    // Default sort function\n    sortFn: function (a, b) {\n      return a.score - b.score\n    },\n\n    // The get function to use when fetching an object's properties.\n    // The default will search nested paths *ie foo.bar.baz*\n    getFn: deepValue,\n\n    // List of properties that will be searched. This also supports nested properties.\n    keys: [],\n\n    // Will print to the console. Useful for debugging.\n    verbose: false,\n\n    // When true, the search algorithm will search individual words **and** the full string,\n    // computing the final score as a function of both. Note that when `tokenize` is `true`,\n    // the `threshold`, `distance`, and `location` are inconsequential for individual tokens.\n    tokenize: false\n  }\n\n  function Fuse (list, options) {\n    var i\n    var len\n    var key\n    var keys\n\n    this.list = list\n    this.options = options = options || {}\n\n    // Add boolean type options\n    for (i = 0, keys = ['sort', 'shouldSort', 'verbose', 'tokenize'], len = keys.length; i < len; i++) {\n      key = keys[i]\n      this.options[key] = key in options ? options[key] : defaultOptions[key]\n    }\n    // Add all other options\n    for (i = 0, keys = ['searchFn', 'sortFn', 'keys', 'getFn', 'include'], len = keys.length; i < len; i++) {\n      key = keys[i]\n      this.options[key] = options[key] || defaultOptions[key]\n    }\n  }\n\n  Fuse.VERSION = '2.2.0'\n\n  /**\n   * Sets a new list for Fuse to match against.\n   * @param {Array} list\n   * @return {Array} The newly set list\n   * @public\n   */\n  Fuse.prototype.set = function (list) {\n    this.list = list\n    return list\n  }\n\n  Fuse.prototype.search = function (pattern) {\n    if (this.options.verbose) log('\\nSearch term:', pattern, '\\n')\n\n    this.pattern = pattern\n    this.results = []\n    this.resultMap = {}\n    this._keyMap = null\n\n    this._prepareSearchers()\n    this._startSearch()\n    this._computeScore()\n    this._sort()\n\n    var output = this._format()\n    return output\n  }\n\n  Fuse.prototype._prepareSearchers = function () {\n    var options = this.options\n    var pattern = this.pattern\n    var searchFn = options.searchFn\n    var tokens = pattern.split(MULTI_CHAR_REGEX)\n    var i = 0\n    var len = tokens.length\n\n    if (this.options.tokenize) {\n      this.tokenSearchers = []\n      for (; i < len; i++) {\n        this.tokenSearchers.push(new searchFn(tokens[i], options))\n      }\n    }\n    this.fullSeacher = new searchFn(pattern, options)\n  }\n\n  Fuse.prototype._startSearch = function () {\n    var options = this.options\n    var getFn = options.getFn\n    var list = this.list\n    var listLen = list.length\n    var keys = this.options.keys\n    var keysLen = keys.length\n    var key\n    var weight\n    var item = null\n    var i\n    var j\n\n    // Check the first item in the list, if it's a string, then we assume\n    // that every item in the list is also a string, and thus it's a flattened array.\n    if (typeof list[0] === 'string') {\n      // Iterate over every item\n      for (i = 0; i < listLen; i++) {\n        this._analyze('', list[i], i, i)\n      }\n    } else {\n      this._keyMap = {}\n      // Otherwise, the first item is an Object (hopefully), and thus the searching\n      // is done on the values of the keys of each item.\n      // Iterate over every item\n      for (i = 0; i < listLen; i++) {\n        item = list[i]\n        // Iterate over every key\n        for (j = 0; j < keysLen; j++) {\n          key = keys[j]\n          if (typeof key !== 'string') {\n            weight = (1 - key.weight) || 1\n            this._keyMap[key.name] = {\n              weight: weight\n            }\n            if (key.weight <= 0 || key.weight > 1) {\n              throw new Error('Key weight has to be > 0 and <= 1')\n            }\n            key = key.name\n          } else {\n            this._keyMap[key] = {\n              weight: 1\n            }\n          }\n          this._analyze(key, getFn(item, key, []), item, i)\n        }\n      }\n    }\n  }\n\n  Fuse.prototype._analyze = function (key, text, entity, index) {\n    var options = this.options\n    var words\n    var scores\n    var exists = false\n    var tokenSearchers\n    var tokenSearchersLen\n    var existingResult\n    var averageScore\n    var finalScore\n    var scoresLen\n    var mainSearchResult\n    var tokenSearcher\n    var termScores\n    var word\n    var tokenSearchResult\n    var i\n    var j\n\n    // Check if the text can be searched\n    if (text === undefined || text === null) {\n      return\n    }\n\n    scores = []\n\n    if (typeof text === 'string') {\n      words = text.split(MULTI_CHAR_REGEX)\n\n      if (options.verbose) log('---------\\nKey:', key)\n      if (options.verbose) log('Record:', words)\n\n      if (this.options.tokenize) {\n        tokenSearchers = this.tokenSearchers\n        tokenSearchersLen = tokenSearchers.length\n\n        for (i = 0; i < this.tokenSearchers.length; i++) {\n          tokenSearcher = this.tokenSearchers[i]\n          termScores = []\n          for (j = 0; j < words.length; j++) {\n            word = words[j]\n            tokenSearchResult = tokenSearcher.search(word)\n            if (tokenSearchResult.isMatch) {\n              exists = true\n              termScores.push(tokenSearchResult.score)\n              scores.push(tokenSearchResult.score)\n            } else {\n              termScores.push(1)\n              scores.push(1)\n            }\n          }\n          if (options.verbose) log('Token scores:', termScores)\n        }\n\n        averageScore = scores[0]\n        scoresLen = scores.length\n        for (i = 1; i < scoresLen; i++) {\n          averageScore += scores[i]\n        }\n        averageScore = averageScore / scoresLen\n\n        if (options.verbose) log('Token score average:', averageScore)\n      }\n\n      // Get the result\n      mainSearchResult = this.fullSeacher.search(text)\n      if (options.verbose) log('Full text score:', mainSearchResult.score)\n\n      finalScore = mainSearchResult.score\n      if (averageScore !== undefined) {\n        finalScore = (finalScore + averageScore) / 2\n      }\n\n      if (options.verbose) log('Score average:', finalScore)\n\n      // If a match is found, add the item to <rawResults>, including its score\n      if (exists || mainSearchResult.isMatch) {\n        // Check if the item already exists in our results\n        existingResult = this.resultMap[index]\n\n        if (existingResult) {\n          // Use the lowest score\n          // existingResult.score, bitapResult.score\n          existingResult.output.push({\n            key: key,\n            score: finalScore,\n            matchedIndices: mainSearchResult.matchedIndices\n          })\n        } else {\n          // Add it to the raw result list\n          this.resultMap[index] = {\n            item: entity,\n            output: [{\n              key: key,\n              score: finalScore,\n              matchedIndices: mainSearchResult.matchedIndices\n            }]\n          }\n\n          this.results.push(this.resultMap[index])\n        }\n      }\n    } else if (isArray(text)) {\n      for (i = 0; i < text.length; i++) {\n        this._analyze(key, text[i], entity, index)\n      }\n    }\n  }\n\n  Fuse.prototype._computeScore = function () {\n    var i\n    var j\n    var keyMap = this._keyMap\n    var totalScore\n    var output\n    var scoreLen\n    var score\n    var weight\n    var results = this.results\n    var bestScore\n    var nScore\n\n    if (this.options.verbose) log('\\n\\nComputing score:\\n')\n\n    for (i = 0; i < results.length; i++) {\n      totalScore = 0\n      output = results[i].output\n      scoreLen = output.length\n\n      bestScore = 1\n\n      for (j = 0; j < scoreLen; j++) {\n        score = output[j].score\n        weight = keyMap ? keyMap[output[j].key].weight : 1\n\n        nScore = score * weight\n\n        if (weight !== 1) {\n          bestScore = Math.min(bestScore, nScore)\n        } else {\n          totalScore += nScore\n          output[j].nScore = nScore\n        }\n      }\n\n      if (bestScore === 1) {\n        results[i].score = totalScore / scoreLen\n      } else {\n        results[i].score = bestScore\n      }\n\n      if (this.options.verbose) log(results[i])\n    }\n  }\n\n  Fuse.prototype._sort = function () {\n    var options = this.options\n    if (options.shouldSort) {\n      if (options.verbose) log('\\n\\nSorting....')\n      this.results.sort(options.sortFn)\n    }\n  }\n\n  Fuse.prototype._format = function () {\n    var options = this.options\n    var getFn = options.getFn\n    var finalOutput = []\n    var item\n    var i\n    var len\n    var results = this.results\n    var replaceValue\n    var getItemAtIndex\n    var include = options.include\n\n    if (options.verbose) log('\\n\\nOutput:\\n\\n', results)\n\n    // Helper function, here for speed-up, which replaces the item with its value,\n    // if the options specifies it,\n    replaceValue = options.id ? function (index) {\n      results[index].item = getFn(results[index].item, options.id, [])[0]\n    } : function () {}\n\n    getItemAtIndex = function (index) {\n      var record = results[index]\n      var data\n      var includeVal\n      var j\n      var output\n      var _item\n      var _result\n\n      // If `include` has values, put the item in the result\n      if (include.length > 0) {\n        data = {\n          item: record.item\n        }\n        if (include.indexOf('matches') !== -1) {\n          output = record.output\n          data.matches = []\n          for (j = 0; j < output.length; j++) {\n            _item = output[j]\n            _result = {\n              indices: _item.matchedIndices\n            }\n            if (_item.key) {\n              _result.key = _item.key\n            }\n            data.matches.push(_result)\n          }\n        }\n\n        if (include.indexOf('score') !== -1) {\n          data.score = results[index].score\n        }\n\n      } else {\n        data = record.item\n      }\n\n      return data\n    }\n\n    // From the results, push into a new array only the item identifier (if specified)\n    // of the entire item.  This is because we don't want to return the <results>,\n    // since it contains other metadata\n    for (i = 0, len = results.length; i < len; i++) {\n      replaceValue(i)\n      item = getItemAtIndex(i)\n      finalOutput.push(item)\n    }\n\n    return finalOutput\n  }\n\n  // Helpers\n\n  function deepValue (obj, path, list) {\n    var firstSegment\n    var remaining\n    var dotIndex\n    var value\n    var i\n    var len\n\n    if (!path) {\n      // If there's no path left, we've gotten to the object we care about.\n      list.push(obj)\n    } else {\n      dotIndex = path.indexOf('.')\n\n      if (dotIndex !== -1) {\n        firstSegment = path.slice(0, dotIndex)\n        remaining = path.slice(dotIndex + 1)\n      } else {\n        firstSegment = path\n      }\n\n      value = obj[firstSegment]\n      if (value !== null && value !== undefined) {\n        if (!remaining && (typeof value === 'string' || typeof value === 'number')) {\n          list.push(value)\n        } else if (isArray(value)) {\n          // Search each item in the array.\n          for (i = 0, len = value.length; i < len; i++) {\n            deepValue(value[i], remaining, list)\n          }\n        } else if (remaining) {\n          // An object. Recurse further.\n          deepValue(value, remaining, list)\n        }\n      }\n    }\n\n    return list\n  }\n\n  function isArray (obj) {\n    return Object.prototype.toString.call(obj) === '[object Array]'\n  }\n\n  /**\n   * Adapted from \"Diff, Match and Patch\", by Google\n   *\n   *   http://code.google.com/p/google-diff-match-patch/\n   *\n   * Modified by: Kirollos Risk <kirollos@gmail.com>\n   * -----------------------------------------------\n   * Details: the algorithm and structure was modified to allow the creation of\n   * <Searcher> instances with a <search> method which does the actual\n   * bitap search. The <pattern> (the string that is searched for) is only defined\n   * once per instance and thus it eliminates redundant re-creation when searching\n   * over a list of strings.\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\")\n   * you may not use this file except in compliance with the License.\n   */\n  function BitapSearcher (pattern, options) {\n    options = options || {}\n    this.options = options\n    this.options.location = options.location || BitapSearcher.defaultOptions.location\n    this.options.distance = 'distance' in options ? options.distance : BitapSearcher.defaultOptions.distance\n    this.options.threshold = 'threshold' in options ? options.threshold : BitapSearcher.defaultOptions.threshold\n    this.options.maxPatternLength = options.maxPatternLength || BitapSearcher.defaultOptions.maxPatternLength\n\n    this.pattern = options.caseSensitive ? pattern : pattern.toLowerCase()\n    this.patternLen = pattern.length\n\n    if (this.patternLen <= this.options.maxPatternLength) {\n      this.matchmask = 1 << (this.patternLen - 1)\n      this.patternAlphabet = this._calculatePatternAlphabet()\n    }\n  }\n\n  BitapSearcher.defaultOptions = {\n    // Approximately where in the text is the pattern expected to be found?\n    location: 0,\n\n    // Determines how close the match must be to the fuzzy location (specified above).\n    // An exact letter match which is 'distance' characters away from the fuzzy location\n    // would score as a complete mismatch. A distance of '0' requires the match be at\n    // the exact location specified, a threshold of '1000' would require a perfect match\n    // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n    distance: 100,\n\n    // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n    // (of both letters and location), a threshold of '1.0' would match anything.\n    threshold: 0.6,\n\n    // Machine word size\n    maxPatternLength: 32\n  }\n\n  /**\n   * Initialize the alphabet for the Bitap algorithm.\n   * @return {Object} Hash of character locations.\n   * @private\n   */\n  BitapSearcher.prototype._calculatePatternAlphabet = function () {\n    var mask = {},\n      i = 0\n\n    for (i = 0; i < this.patternLen; i++) {\n      mask[this.pattern.charAt(i)] = 0\n    }\n\n    for (i = 0; i < this.patternLen; i++) {\n      mask[this.pattern.charAt(i)] |= 1 << (this.pattern.length - i - 1)\n    }\n\n    return mask\n  }\n\n  /**\n   * Compute and return the score for a match with `e` errors and `x` location.\n   * @param {number} errors Number of errors in match.\n   * @param {number} location Location of match.\n   * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n   * @private\n   */\n  BitapSearcher.prototype._bitapScore = function (errors, location) {\n    var accuracy = errors / this.patternLen,\n      proximity = Math.abs(this.options.location - location)\n\n    if (!this.options.distance) {\n      // Dodge divide by zero error.\n      return proximity ? 1.0 : accuracy\n    }\n    return accuracy + (proximity / this.options.distance)\n  }\n\n  /**\n   * Compute and return the result of the search\n   * @param {String} text The text to search in\n   * @return {Object} Literal containing:\n   *                          {Boolean} isMatch Whether the text is a match or not\n   *                          {Decimal} score Overall score for the match\n   * @public\n   */\n  BitapSearcher.prototype.search = function (text) {\n    var options = this.options\n    var i\n    var j\n    var textLen\n    var location\n    var threshold\n    var bestLoc\n    var binMin\n    var binMid\n    var binMax\n    var start, finish\n    var bitArr\n    var lastBitArr\n    var charMatch\n    var score\n    var locations\n    var matches\n    var isMatched\n    var matchMask\n    var matchedIndices\n    var matchesLen\n    var match\n\n    text = options.caseSensitive ? text : text.toLowerCase()\n\n    if (this.pattern === text) {\n      // Exact match\n      return {\n        isMatch: true,\n        score: 0,\n        matchedIndices: [[0, text.length - 1]]\n      }\n    }\n\n    // When pattern length is greater than the machine word length, just do a a regex comparison\n    if (this.patternLen > options.maxPatternLength) {\n      matches = text.match(new RegExp(this.pattern.replace(MULTI_CHAR_REGEX, '|')))\n      isMatched = !!matches\n\n      if (isMatched) {\n        matchedIndices = []\n        for (i = 0, matchesLen = matches.length; i < matchesLen; i++) {\n          match = matches[i]\n          matchedIndices.push([text.indexOf(match), match.length - 1])\n        }\n      }\n\n      return {\n        isMatch: isMatched,\n        // TODO: revisit this score\n        score: isMatched ? 0.5 : 1,\n        matchedIndices: matchedIndices\n      }\n    }\n\n    location = options.location\n    // Set starting location at beginning text and initialize the alphabet.\n    textLen = text.length\n    // Highest score beyond which we give up.\n    threshold = options.threshold\n    // Is there a nearby exact match? (speedup)\n    bestLoc = text.indexOf(this.pattern, location)\n\n    // a mask of the matches\n    matchMask = []\n    for (i = 0; i < textLen; i++) {\n      matchMask[i] = 0\n    }\n\n    if (bestLoc != -1) {\n      threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n      // What about in the other direction? (speed up)\n      bestLoc = text.lastIndexOf(this.pattern, location + this.patternLen)\n\n      if (bestLoc != -1) {\n        threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n      }\n    }\n\n    bestLoc = -1\n    score = 1\n    locations = []\n    binMax = this.patternLen + textLen\n\n    for (i = 0; i < this.patternLen; i++) {\n      // Scan for the best match; each iteration allows for one more error.\n      // Run a binary search to determine how far from the match location we can stray\n      // at this error level.\n      binMin = 0\n      binMid = binMax\n      while (binMin < binMid) {\n        if (this._bitapScore(i, location + binMid) <= threshold) {\n          binMin = binMid\n        } else {\n          binMax = binMid\n        }\n        binMid = Math.floor((binMax - binMin) / 2 + binMin)\n      }\n\n      // Use the result from this iteration as the maximum for the next.\n      binMax = binMid\n      start = Math.max(1, location - binMid + 1)\n      finish = Math.min(location + binMid, textLen) + this.patternLen\n\n      // Initialize the bit array\n      bitArr = Array(finish + 2)\n\n      bitArr[finish + 1] = (1 << i) - 1\n\n      for (j = finish; j >= start; j--) {\n        charMatch = this.patternAlphabet[text.charAt(j - 1)]\n\n        if (charMatch) {\n          matchMask[j - 1] = 1\n        }\n\n        if (i === 0) {\n          // First pass: exact match.\n          bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch\n        } else {\n          // Subsequent passes: fuzzy match.\n          bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch | (((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1) | lastBitArr[j + 1]\n        }\n        if (bitArr[j] & this.matchmask) {\n          score = this._bitapScore(i, j - 1)\n\n          // This match will almost certainly be better than any existing match.\n          // But check anyway.\n          if (score <= threshold) {\n            // Indeed it is\n            threshold = score\n            bestLoc = j - 1\n            locations.push(bestLoc)\n\n            if (bestLoc > location) {\n              // When passing loc, don't exceed our current distance from loc.\n              start = Math.max(1, 2 * location - bestLoc)\n            } else {\n              // Already passed loc, downhill from here on in.\n              break\n            }\n          }\n        }\n      }\n\n      // No hope for a (better) match at greater error levels.\n      if (this._bitapScore(i + 1, location) > threshold) {\n        break\n      }\n      lastBitArr = bitArr\n    }\n\n    matchedIndices = this._getMatchedIndices(matchMask)\n\n    // Count exact matches (those with a score of 0) to be \"almost\" exact\n    return {\n      isMatch: bestLoc >= 0,\n      score: score === 0 ? 0.001 : score,\n      matchedIndices: matchedIndices\n    }\n  }\n\n  BitapSearcher.prototype._getMatchedIndices = function (matchMask) {\n    var matchedIndices = []\n    var start = -1\n    var end = -1\n    var i = 0\n    var match\n    var len = len = matchMask.length\n    for (; i < len; i++) {\n      match = matchMask[i]\n      if (match && start === -1) {\n        start = i\n      } else if (!match && start !== -1) {\n        end = i - 1\n        matchedIndices.push([start, end])\n        start = -1\n      }\n    }\n    if (matchMask[i - 1]) {\n      matchedIndices.push([start, i - 1])\n    }\n    return matchedIndices\n  }\n\n  // Export to Common JS Loader\n  if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = Fuse\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(function () {\n      return Fuse\n    })\n  } else {\n    // Browser globals (root is window)\n    global.Fuse = Fuse\n  }\n\n})(this)\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fuse.js/src/fuse.js\n// module id = 900\n// module chunks = 0 1","\nconst TemplateFixture = [\n  {\n    id: 0,\n    title: 'Checkbook Report',\n    description: 'Gain insights into transaction-level detail like vendors, invoices, and amounts.',\n    imageUrl: 'images/templates/Report-Templates-Checkbook.svg',\n    exampleUrl: 'https://huberheightsoh.opengov.com/data/#/1320/query=E2B9A625618381261420DD62CCBABCBB&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/203007066/Checkbook_Template__1_.xlsx'\n  },\n  {\n    id: 1,\n    title: 'Water Consumption Report',\n    description: 'Analyze your government’s water consumption and production to identify trends.',\n    imageUrl: 'images/templates/Report-Templates-Valuations.svg',\n    exampleUrl: 'https://northglennco.opengov.com/data/#/2860/query=8DF0FF7DDB50AF7FB91DC46F53650C34&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/203039373/Water_Production_Consumption_Template.xlsx'\n  },\n  {\n    id: 2,\n    title: 'Police Runs Report',\n    description: 'Explore the volume and types of police runs in your municipality.',\n    imageUrl: 'images/templates/Report-Templates-Police.svg',\n    exampleUrl: 'https://edgewoodky.opengov.com/data/#/4942/query=69677085DCBD478C39EEF4FA5EF4BFCC&embed=n',\n    downloadUrl: 'https://opengov.zendesk.com/hc/en-us/article_attachments/202876126/Police_Run_Data_Template.xlsx'\n  }\n];\n\nexport default TemplateFixture;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/fixtures/template_fixtures.ts","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Tab } from './capital_tabs';\nimport { Badge } from './capital_badge';\n\nexport default class ReportIndexNav extends Component<any, any> {\n  static propTypes = {\n    dashboardsEnabled: PropTypes.bool.isRequired,\n    entityId: PropTypes.string.isRequired,\n    newReportingEnabled: PropTypes.bool\n  };\n\n  onTabChange = (index) => {\n    if (!this.props.newReportingEnabled && index === 1) {\n      return window.location.href = `${gon.ogOperateHost}/dashboards/${this.props.entityId}`;\n    }\n\n    if (index === 1) {\n      window.location.href = `${gon.ogOperateHost}/reporting/${this.props.entityId}`;\n    } else if (index === 2) {\n      window.location.href = `${gon.ogOperateHost}/dashboards/${this.props.entityId}`;\n    }\n  }\n\n  render() {\n    const { children, dashboardsEnabled, newReportingEnabled} = this.props;\n    return (\n      <header className=\"performance-header\">\n        <Tab.Group activeTabIndex={0} onTabIndexChanged={this.onTabChange}>\n          <Tab.Option dataTest=\"legacy-report-tab\">Reports{newReportingEnabled && <Badge text=\"Classic\" variant=\"neutral\"/>}</Tab.Option>\n          {newReportingEnabled && <Tab.Option dataTest=\"new-report-tab\">Reports<Badge text=\"Next Gen\" variant=\"strong\"/></Tab.Option>}\n          {dashboardsEnabled && <Tab.Option dataTest=\"dashboard-tab\">Dashboards</Tab.Option>}\n        </Tab.Group>\n        {children}\n      </header>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_nav.tsx","import { TabGroup as Group } from './Tab.Group';\nimport { TabOption as Option } from './Tab.Option';\n\nexport const Tab = {\n  Group,\n  Option\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/capital_tabs/index.ts","import React from 'react';\n\nexport interface ITabGroupProps {\n  activeTabIndex?: number;\n  dataTest?: string;\n  onTabIndexChanged?(tabIndexClicked): void;\n}\n\nexport class TabGroup extends React.Component<ITabGroupProps, any> {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      activeTabIndex: props.activeTabIndex\n    };\n  }\n\n  public render() {\n    return (\n      <div>\n        <nav role=\"tablist\" data-test={this.props.dataTest} className=\"Tab_GroupContainer\">\n          {React.Children.map(this.props.children, (child, index) =>\n            child\n              ? React.cloneElement(child as any, {\n                  activeTabIndex: this.state.activeTabIndex,\n                  key: index,\n                  index,\n                  numTabsInGroup: React.Children.count(this.props.children),\n                  onTabClicked: tabIndexClicked => this.onTabClicked(tabIndexClicked)\n                })\n              : null\n          )}\n          <div className=\"Tab_NavShadowContainer\">\n            <div className=\"Tab_NavShadow\" />\n          </div>\n        </nav>\n      </div>\n    );\n  }\n\n  private onTabClicked = tabIndexClicked => {\n    this.setState({ activeTabIndex: tabIndexClicked });\n    if (this.props.onTabIndexChanged) {\n      this.props.onTabIndexChanged(tabIndexClicked);\n    }\n  };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/capital_tabs/Tab.Group/Tab.Group.tsx","import classnames from 'classnames';\n\nimport React from 'react';\n\nexport interface ITabOptionProps {\n  label?: string;\n  activeTabIndex?: number;\n  numTabsInGroup?: number;\n  index?: number;\n  dataTest?: string;\n  onTabClicked?(tabIndexClicked): void;\n}\n\nexport const TabOption: React.SFC<ITabOptionProps> = props => {\n  const isFirstTab = props.index === 0;\n  const isActiveTab = props.activeTabIndex === props.index;\n  const isLeftOfActiveTab = props.index === props.activeTabIndex - 1;\n  const isRightOfActiveTab = props.index === props.activeTabIndex + 1;\n  const isInactiveTab = !isActiveTab && !isLeftOfActiveTab && !isRightOfActiveTab;\n\n  const classes = classnames({\n    ['Tab_activeTab']: isActiveTab,\n    ['Tab_inactiveTab']: isInactiveTab,\n    ['Tab_firstInactiveTab']: isFirstTab && !isActiveTab,\n    ['Tab_leftOfActive']: isLeftOfActiveTab,\n    ['Tab_rightOfActive']: isRightOfActiveTab\n  });\n\n  return (\n    <div role=\"presentation\">\n      <button\n        role=\"tab\"\n        type=\"button\"\n        tabIndex={0}\n        title={props.label}\n        data-test={props.dataTest}\n        className={classes}\n        onClick={() => props.onTabClicked(props.index)}\n      >\n        {props.children}\n      </button>\n    </div>\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/capital_tabs/Tab.Option/Tab.Option.tsx","import classnames from 'classnames';\nimport React from 'react';\n\nimport { vizColors } from '@opengov/capital-style';\n\nexport interface ISelectBadgeProps {\n  text: string;\n  variant?: 'neutral' | 'warning' | 'bright' | 'strong' | 'positive' | 'negative';\n  dataTest?: string;\n}\n\nexport const Badge: React.SFC<ISelectBadgeProps> = props => {\n  // using an inline style to apply color tokens that are not exposed in CSS.\n  let inlineStyle = {};\n  if (props.variant === 'positive') {\n    inlineStyle = { backgroundColor: vizColors.jade[700] };\n  } else if (props.variant === 'negative') {\n    inlineStyle = { backgroundColor: vizColors.red[700] };\n  } else if (props.variant === 'warning') {\n    inlineStyle = { backgroundColor: vizColors.orange[200] };\n  }\n\n  const variant = {\n    ['Badge_neutral']: props.variant === 'neutral',\n    ['Badge_warning']: props.variant === 'warning',\n    ['Badge_bright']: props.variant === 'bright',\n    ['Badge_strong']: props.variant === 'strong',\n    ['Badge_positive']: props.variant === 'positive',\n    ['Badge_negative']: props.variant === 'negative'\n  };\n\n  return (\n    <span className={classnames('Badge', variant)} style={inlineStyle} data-test={props.dataTest}>\n      {props.text}\n    </span>\n  );\n};\n\nBadge.defaultProps = {\n  text: '',\n  variant: 'neutral'\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/capital_badge/Badge.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _colorUtils = require('./color-utils');\n\nObject.keys(_colorUtils).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _colorUtils[key];\n    }\n  });\n});\n\nvar _tokens = require('./tokens');\n\nObject.keys(_tokens).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _tokens[key];\n    }\n  });\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/capital-style/dist/index.js\n// module id = 910\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getMonochromeVizColors = getMonochromeVizColors;\nexports.getVizColors = getVizColors;\n\nvar _tokens = require(\"./tokens\");\n\nfunction getMonochromeVizColors(datapoints, startingHue) {\n  // datapoints: number of colors needed\n  // startingColor: if it should start at a certain color (monochrome only)\n\n  var colors = [];\n\n  // Set starting hue\n  if (startingHue == \"\") {\n    var currentHue = _tokens.vizColorValueOrder[0];\n  } else {\n    var currentHue = startingHue;\n  }\n\n  // Set counter variables\n  var hues = Math.ceil(datapoints / 9);\n  var currentData = 0;\n  var valueArray = [];\n  var startValue = _tokens.vizColors[currentHue].data;\n\n  // Loop through hues\n  for (var i = 0; i < hues; i++) {\n    // Append values of this hue to array and sort array\n    for (var y = 0; currentData < datapoints && y < 9; y++) {\n      currentData++;\n      valueArray.push(_tokens.vizColorValueOrder[startValue][y]);\n    }\n    valueArray = valueArray.sort();\n\n    // Append hex codes to colors array\n    var z = currentData - valueArray.length;\n    for (var x = 0; x < valueArray.length; x++) {\n      colors[z] = _tokens.vizColors[currentHue][valueArray[x]];\n      z++;\n    }\n\n    // Reset for next hue\n    valueArray = [];\n    currentHue = _tokens.vizColors[currentHue].nextHue;\n    startValue = _tokens.vizColors[currentHue].data;\n  }\n\n  return colors;\n}\n\nfunction getVizColors(datapoints) {\n  // datapoints: number of colors needed\n\n  var colors = [];\n  var orderRepeat = 0;\n  var currentHue = 0;\n\n  for (var i = 0; i < datapoints; i++) {\n    if ((i + 1) % 20 === 0) {\n      orderRepeat++;\n      currentHue = 0;\n    }\n    if (orderRepeat >= 9) {\n      orderRepeat = 0;\n    }\n    var hue = _tokens.vizColorHueOrder[currentHue];\n    var value = _tokens.vizColorValueOrder[_tokens.vizColors[hue].data][orderRepeat];\n    var baseColor = _tokens.vizColors[hue][value];\n    var hoverColor = _tokens.vizColors[hue][value + 100];\n    var highlightColor = _tokens.vizColors[hue][_tokens.vizColors[hue].highlight];\n    colors.push({ base: baseColor, hover: hoverColor, line: baseColor, highlight: highlightColor });\n    currentHue++;\n  }\n\n  return colors;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/capital-style/dist/color-utils.js\n// module id = 911\n// module chunks = 0 1","import React from 'react';\n\nexport default class ReportIndexHeader extends React.Component<any, any> {\n  render() {\n    return (\n      <div className=\"home-pageheader\">\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/header.tsx","import React, { Component } from 'react';\n\nexport default class ReportIndexSearch extends Component<any, any> {\n\n  componentDidMount() {\n    this.props.onHandleUserInput(this.props.searchInput);\n  }\n\n  handleChange = (e) => {\n    this.props.onHandleUserInput(e.target.value);\n  }\n\n  render() {\n    return (\n      <div className=\"header-item report-search\">\n        <fieldset className=\"ui-form option\">\n        <label>SEARCH:</label>\n        <div className=\"ui-search\">\n          <input\n            type=\"search\"\n            placeholder=\"Search for reports\"\n            value={this.props.searchInput}\n            onChange={this.handleChange}/>\n          <span className=\"icon-search-1\"></span>\n        </div>\n        </fieldset>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/search.tsx","import React from 'react';\nimport FilterOptions from './filter_options';\n\nexport default class ReportIndexFilter extends React.Component<any, any> {\n  state = {\n    display: false\n  };\n\n  toggleDropdown = () => {\n    this.setState({ display: !this.state.display });\n  }\n\n  getCheckedKeywordCount = () => {\n    return this.props.checkedKeywords.length > 0 ? this.props.checkedKeywords.length : 'None';\n  }\n\n  render() {\n    return (\n    <div className=\"header-item report-filter\">\n      <fieldset className=\"ui-form option\">\n        <label>FILTER BY KEYWORD:</label>\n        <div className=\"ui-dropdown\">\n           <a className=\"ui-dropdown__toggle ui-button\" onClick={() => this.toggleDropdown()}><small className=\"ui-dropdown__label\" ></small><span>{this.getCheckedKeywordCount()} selected</span></a>\n             {this.state.display ? <FilterOptions { ...this.props} toggleDropdown={this.toggleDropdown} /> : null }\n        </div>\n      </fieldset>\n    </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/filter.tsx","import React from 'react';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport { findDOMNode } from 'react-dom';\n\nexport default class FilterOption extends React.Component<any, any> {\n  private targetDropdown: HTMLDivElement;\n  state = {\n    mappedKeywords: [],\n    searchQuery: ''\n  };\n\n  handleOptionCancel = () => {\n    this.props.toggleDropdown();\n  }\n\n  handleDocumentClick = (e) => {\n    const inContainer = $.contains(findDOMNode(this.targetDropdown) as Element, e.target);\n    if (!inContainer) {\n      this.handleOptionCancel();\n    }\n  }\n\n  componentWillMount() {\n    this._subscribeDOMEvents();\n    const mappedKeywords = this.generateKeywordsMap(this.props.keywords, this.props.checkedKeywords);\n    this.setState({mappedKeywords : mappedKeywords});\n  }\n\n  componentWillUnmount() {\n    this._unsubscribeDOMEvents();\n  }\n\n  _unsubscribeDOMEvents = () => {\n    $(document).off('click', this.handleDocumentClick);\n  }\n\n  _subscribeDOMEvents = () => {\n    $(document).on('click', this.handleDocumentClick);\n  }\n\n  generateKeywordsMap = (keywords, selected) => {\n    return _.map(keywords, (keyword) => {\n      return _.includes(selected, keyword) ? {'title': keyword, 'checked' : true} : {'title': keyword, 'checked' : false};\n    });\n  }\n\n  handleChange = (e) => {\n    this.setState({searchQuery:e.target.value });\n  }\n\n  toggleKeywords = (keyword) => {\n    const mappedKeywords = _.map(this.state.mappedKeywords, (obj) => {\n      return obj.title === keyword ? { 'title': keyword, 'checked': !obj.checked } : obj;\n    });\n    this.setState({mappedKeywords : mappedKeywords});\n    const checkedKeywordsMap = _.filter(mappedKeywords, (obj) => { return obj.checked; });\n    const checkedKeywords = _.map(checkedKeywordsMap, _.bind((keyword) => { return keyword.title; }, this));\n    this.props.onHandleChangeKeywords(checkedKeywords);\n  }\n\n  render() {\n    const dropDownStyle = { display: 'inline-block' };\n    const query = this.state.searchQuery;\n    const filteredKeywords = _.filter(this.state.mappedKeywords, (obj) => { return _.includes(obj.title.toLowerCase(), query.toLowerCase()); });\n    const options = _.map(filteredKeywords, (keyword) => {\n      return (\n      <label key={keyword.title} className=\"ui-form__checkbox-label\" onClick={() => this.toggleKeywords(keyword.title)} >\n         <span className=\"keyword_name\" title={keyword.title} >{keyword.title}</span>\n         <div className={'ui-form__checkbox ' + (keyword.checked ? 'is-checked' : '')} ></div>\n      </label>);\n    });\n    return (\n      <div ref={(targetDropdown) => {this.targetDropdown = targetDropdown;}} className=\"ui-dropdown__target filter-options__target\" style= {dropDownStyle}>\n         <div className=\"ui-dropdown__list\">\n            <div className=\"dropdown__row_input icon-search-1\">\n               <input className=\"filter-search dropdown__row__input\" type=\"search\" placeholder=\"Search\" onChange={this.handleChange} />\n            </div>\n            {(this.props.userRole == 'opengov_admin' || this.props.userRole == 'entity_admin') ?\n                <label className=\"manage-keys\" onClick={()=>this.props.onHandleManageKeywords()}> Manage Keywords</label>\n            : null}\n\n            <div className=\"ui-form reports__keywords_list \">\n              {options.length > 0 ?\n                 options\n              : <div className=\"no-keywords-found\">\n                  {(this.props.keywords.length > 0 || this.state.searchQuery.length > 0 ) ? 'No matching keywords'\n                  : 'No keywords found'}\n               </div> }\n            </div>\n         </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/filter_options.tsx","import React from 'react';\nimport * as Ovid from '@opengov/ovid';\n\nexport default class ReportIndexSort extends React.Component<any, any> {\n  componentDidMount() {\n    this.props.handleSorting(this.props.sortOrder);\n  }\n\n  handleChange = (value) => {\n    this.props.handleSorting(value);\n  }\n\n  render() {\n    return (\n      <div className=\"header-item report-sort\">\n         <fieldset className=\"ui-form option\" >\n           <label>SORT:</label>\n           <Ovid.DropdownList toggleClass=\"ui-button\" value={this.props.sortOrder} onChange={this.handleChange} >\n             <Ovid.DropdownListItem key=\"1\" value=\"asc\" title=\"A-Z\" />\n             <Ovid.DropdownListItem key=\"2\" value=\"desc\" title=\"Z-A\" />\n           </Ovid.DropdownList>\n         </fieldset >\n       </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/sort.tsx","import React from 'react';\n\nexport default class ReportIndexList extends React.Component<any, any> {\n  render() {\n    const { reportViewType, changeReportViewType } = this.props;\n    return (\n      <div className=\"header-item report-list\">\n        <fieldset className=\"ui-form option\">\n          <label>SHOW HOW:</label>\n          <div className=\"ui-button-group\">\n            <a className={'ui-button icon-view-grid-1 ' + (reportViewType == 'grid' ? 'is-selected' : '')} onClick={() => changeReportViewType('grid')}></a>\n            <a className={'ui-button icon-view-list-1 ' + (reportViewType == 'list' ? 'is-selected' : '')} onClick={() => changeReportViewType('list')}></a>\n          </div>\n        </fieldset>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/list.tsx","import React from 'react';\n\nexport default class ReportIndexShow extends React.Component<any, any> {\n\n  handleClick = (value) => {\n    this.props.onHandleChangeVisibility(value);\n  }\n\n  render() {\n    return (\n    <div className=\"header-item report-show\">\n      <fieldset className=\"ui-form option\">\n      <label>SHOW:</label>\n      <div className=\"ui-button-group\">\n        <a className={'ui-button ' + (this.props.visibility == 'all' ? 'is-selected' : '')} onClick={() => this.handleClick('all')}>All</a>\n        <a className={'ui-button ' + (this.props.visibility == 'my_reports' ? 'is-selected' : '')} onClick={() => this.handleClick('my_reports')}>My Reports</a>\n        <a className={'ui-button ' + (this.props.visibility == 'shared' ? 'is-selected' : '')} onClick={() => this.handleClick('shared')}>Shared With Me</a>\n      </div>\n      </fieldset>\n    </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_header/show.tsx","import React from 'react';\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\nimport moment from 'moment';\nimport ShareIcon from './share/share_icons';\nimport ReportListView from './report_list_view';\n\nconst permissionDescriptions = {\n  private: 'This report is private',\n  my_organization: 'Shared with my organization',\n  network: 'Shared with other users in the OpenGov Network',\n  public: 'Published to your OpenGov transparency site'\n};\n\nconst ReportIndexItem = (props) => {\n  const { report, isEditKeywordsMode, updateStateKeywords, saveKeywords, addedKeywordsReport, deletedKeywordsReport, keywords, setUpdatedReportKeywords } = props;\n  const reportViewType = props.reportViewType || 'grid';\n  const visibility = report.get('visibility');\n  let reportType;\n  if (report.get('report_type') === 'grid') {\n    reportType = report.get('is_geo_enabled') ? 'map' : 'grid';\n  } else {\n    reportType = report.graphType();\n  }\n  const permissionDescription = permissionDescriptions[visibility];\n  const reportKeywords = report.get('keywords') || [];\n\n  if (reportViewType == 'list') {\n    return (\n      <ReportListView\n        entityId={props.entity.id}\n        report={report}\n        visibility={visibility}\n        isEditKeywordsMode={isEditKeywordsMode}\n        updateStateKeywords={updateStateKeywords}\n        saveKeywords={saveKeywords}\n        addedKeywordsReport={addedKeywordsReport}\n        deletedKeywordsReport={deletedKeywordsReport}\n        keywords={keywords}\n        setUpdatedReportKeywords={setUpdatedReportKeywords} />\n    );\n  } else {\n    return (\n      <div className=\"ui-col-3of12\">\n        <Ovid.ReportCard\n          title={report.get('name')}\n          link={'#/' + props.entity.id + '/' + report.id}\n          type={reportType}\n          isDefault={props.isDefault}\n          description={moment(report.get('data_updated_at')).format('LL')}\n          descriptionLabel=\"Updated\">\n            { !_.isEmpty(reportKeywords) ?\n              <div className=\"icon-tag-1 card-tag-icon\">\n                <span className=\"tooltip-text\">\n                  <b>Keywords:</b>\n                  <br/>\n                  {reportKeywords.join(', ')}\n                </span>\n              </div> : null\n            }\n            <div className=\"card-share-icon\"\n              data-hint={permissionDescription}\n              data-hint-position=\"bottom\"\n              data-hint-align=\"right\">\n              <ShareIcon type={visibility} />\n            </div>\n\n        </Ovid.ReportCard>\n      </div>\n    );\n  }\n\n};\n\nexport default ReportIndexItem;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_index_item.tsx","import React from 'react';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport EditKeywordsPanel from './report_keywords/edit_keywords_panel';\n\nexport default class ReportListView extends React.Component<any, any> {\n  buildKeywords() {\n    let items = [];\n    _.each(this.props.keywords, (keyword) => {\n      items.push({title: keyword});\n    });\n\n    return items;\n  }\n\n  render() {\n    if (!this.props.report) {\n      return <noscript />;\n    }\n\n    const { report, entityId, visibility, isEditKeywordsMode, updateStateKeywords, saveKeywords, addedKeywordsReport, deletedKeywordsReport, setUpdatedReportKeywords } = this.props;\n    const reportName = report.get('name');\n    const reportKeywords = report.get('keywords') || [];\n\n    return (\n      <div className=\"ui-col-12of12 report-list-row\">\n        <div className=\"ui-col-3of12 row-cell\">\n          <a href={'#/' + entityId + '/' + report.id} className=\"report-name text-ellipse\" title={reportName}>\n            {reportName}\n          </a>\n        </div>\n        <div className=\"ui-col-3of12 row-cell keywords\">\n          {isEditKeywordsMode ?\n            <EditKeywordsPanel\n              reportId={report.id}\n              updateStateKeywords={updateStateKeywords}\n              saveKeywords={saveKeywords}\n              addedKeywordsReport={addedKeywordsReport}\n              deletedKeywordsReport={deletedKeywordsReport}\n              assignedKeywords={reportKeywords}\n              keywords={this.buildKeywords()}\n              setUpdatedReportKeywords={setUpdatedReportKeywords} />\n            : <div className=\"text-ellipse\" title={reportKeywords.join(', ')}> {reportKeywords.join(', ')} </div>}\n        </div>\n        <div className=\"ui-col-2of12 row-cell\">\n          {moment(report.get('data_updated_at')).format('D MMM, YYYY')}\n        </div>\n        <div className=\"ui-col-2of12 row-cell\">\n          {report.get('owner').full_name}\n        </div>\n        <div className=\"ui-col-2of12 row-cell\">\n          {(visibility == 'my_organization') ? 'My Organization' : _.startCase(visibility)}\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_list_view.tsx","import React from 'react';\nimport KeywordSearch from './keywords_search';\nimport _ from 'lodash';\nimport { spliceKeywords, concatKeywords, getUpdatedKeywords } from './report_keywords_utils';\n\nexport default class EditKeywordsPanel extends React.Component<any, any> {\n  addedKeywords = (keyword) => {\n    const reportId = this.props.reportId;\n    const addedKeywordsState = this.props.addedKeywordsReport.keywords;\n    const deletedKeywords = this.props.deletedKeywordsReport.keywords;\n    const assignedKeywords = _.isEmpty(addedKeywordsState) ? this.props.assignedKeywords : addedKeywordsState;\n\n    //if earlier keyword was deleted, remove from sate and then add to state\n    spliceKeywords(this.props.updateStateKeywords, deletedKeywords, keyword, reportId, 'remove');\n    concatKeywords(this.props.updateStateKeywords, assignedKeywords, keyword, reportId, 'add');\n  }\n\n  removedKeywords = (keyword) => {\n    const reportId = this.props.reportId;\n    const addedKeywordsState = this.props.addedKeywordsReport.keywords;\n    let assignedKeywords = _.isEmpty(addedKeywordsState) ? this.props.assignedKeywords : addedKeywordsState;\n    let deletedKeywords = this.props.deletedKeywordsReport.keywords;\n\n    if (reportId !== this.props.deletedKeywordsReport.reportId) {\n      deletedKeywords = [];\n    }\n    if (reportId !== this.props.addedKeywordsReport.reportId) {\n      assignedKeywords = this.props.assignedKeywords;\n    }\n\n    //first remove this keyword from added list and then add to deleted list\n    spliceKeywords(this.props.updateStateKeywords, assignedKeywords, keyword, reportId, 'add');\n    concatKeywords(this.props.updateStateKeywords, deletedKeywords, keyword, reportId, 'remove');\n  }\n\n  setUpdatedReportKeywords = (reportId, keywords) => {\n    this.props.setUpdatedReportKeywords(reportId, keywords);\n  }\n\n  saveKeywords = () => {\n    const {assignedKeywords, addedKeywordsReport, deletedKeywordsReport, reportId } = this.props;\n    const updatedKeywords = getUpdatedKeywords(reportId, assignedKeywords, addedKeywordsReport, deletedKeywordsReport);\n    this.setUpdatedReportKeywords(reportId, updatedKeywords);\n    this.props.saveKeywords(this.props.reportId);\n  }\n\n  render() {\n    const {keywords, assignedKeywords, addedKeywordsReport, deletedKeywordsReport, reportId } = this.props;\n    const updatedKeywords = _.isEmpty(this.props.addedKeywordsReport) ?\n      this.props.assignedKeywords :\n      getUpdatedKeywords(reportId, assignedKeywords, addedKeywordsReport, deletedKeywordsReport);\n\n    return (\n      <KeywordSearch\n        assignedKeywords={updatedKeywords}\n        keywords={keywords}\n        addKeywords={this.addedKeywords}\n        removeKeywords={this.removedKeywords}\n        saveKeywords={this.saveKeywords}\n        reportId={reportId}\n      />\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_keywords/edit_keywords_panel.tsx","import React, { CSSProperties } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport _ from 'lodash';\nimport { Search } from '@opengov/ovid';\nimport classNames from 'classnames';\nimport $ from 'jquery';\n\nclass KeywordLabels extends React.Component<any, any> {\n  render() {\n    const {keyword, removeKeywords} = this.props;\n    const keywordClasses = classNames('ui-button', 'small');\n    const keywordPillStyle = {\n      borderColor: '#ccc',\n      color: '#3192c7',\n      backgroundColor: '#f5f9fb',\n      backgroundImage: 'none',\n      fontWeight: 500,\n      height: '30px !important',\n      padding: '1px 0 0 4px',\n      width: 'auto',\n      whiteSpace: 'nowrap'\n    } as CSSProperties;\n\n    return (\n      <span id=\"keyword_labels\" title={keyword} style={keywordPillStyle} className={keywordClasses} >\n          {keyword}\n          <span style={keywordPillStyle} className=\"icon-remove-4\" onClick={() => removeKeywords(keyword)} />\n      </span>\n    );\n  }\n}\n\nexport default class KeywordSearch extends React.Component<any, any> {\n  private labelBoxRef: HTMLDivElement;\n  private searchRef: any;\n  state = {\n    keywords: [],\n    keywordExist: false\n  };\n\n  onInputChange = _.debounce((value?) => {\n    let { keywords } = this.props;\n    let keywordExist;\n\n    if (_.isEmpty(_.trim(value))) {\n      keywords = [];\n    } else {\n      keywords = _.filter(keywords, (item: any) => {\n        return _.startsWith((item.title).toLowerCase(), value.toLowerCase());\n      });\n\n      keywordExist = _.find(keywords, (item) => {\n        return (item.title).toLowerCase() == value.toLowerCase() ? true : false;\n      });\n\n      if (keywordExist) {\n        keywordExist = true;\n        keywords.push({title: '\"' + value + '\" already exists'});\n      } else {\n        keywordExist = false;\n        keywords.push({title: 'Add \"' + value + '\" keyword'});\n      }\n    }\n\n    this.setState({\n      keywords,\n      keywordExist\n    });\n  }, 150);\n\n  handleSearchClick = () => {\n    this.searchRef.focusInput();\n  }\n\n  handleBackSpace = (e) => {\n    if (_.isEmpty(e.target.value)) {\n      const { assignedKeywords, removeKeywords } = this.props;\n      if (e.keyCode === 8 || e.keyCode === 46) {\n        removeKeywords(assignedKeywords.pop());\n      }\n    }\n  }\n\n  saveKeywords = () => {\n    this.props.saveKeywords();\n  }\n\n  onSelectResult = (index) => {\n    const { keywords } = this.state;\n    const title = keywords[index] && keywords[index].title;\n\n    if (title) {\n      let keyword = (_.startsWith(title, 'Add \"') && _.endsWith(title, '\" keyword'))\n        ? title.replace(/.*Add \\\"(.*)\\\" keyword.*/, '$1')\n        : title;\n      keyword = _.trim(keyword.replace(/\\s+/g, ' '));\n\n      this.handleSearchClick();\n\n      if (title != '\"' + this.searchRef.state.value + '\" already exists' && keyword != '') {\n        this.props.addKeywords(keyword);\n      }\n\n      setTimeout(() => {\n        this.labelBoxRef.scrollTop = this.labelBoxRef.scrollHeight;\n        this.onInputChange();\n        this.handleSearchClick();\n      }, 150);\n    }\n  }\n\n  renderKeywords = () => {\n    const { assignedKeywords, removeKeywords } = this.props;\n\n    return (assignedKeywords.map(keyword => <KeywordLabels\n      key={keyword}\n      keyword={keyword}\n      removeKeywords={removeKeywords}\n      />, this)\n    );\n  }\n\n  getResults = () => {\n    if (!_.isEmpty(this.state.keywords)) {\n      return ({\n        items: this.state.keywords\n      });\n    } else {\n      return null;\n    }\n  }\n\n  handleOnBlur = () => {\n    setTimeout(() => {\n      if (!$($(findDOMNode(this.searchRef))[0].childNodes[1]).is(':focus')) {\n        this.props.saveKeywords();\n      }\n    }, 50);\n  }\n\n  componentDidUpdate() {\n    const { keywordExist } = this.state;\n    const searchItems = $('.ui-search__results li .ui-search__results__item');\n    const searchLastItem = $('.ui-search__results li:last-child .ui-search__results__item');\n\n    searchItems.css({ color: '#444' });\n\n    if (keywordExist) {\n      searchLastItem.css({\n        color: 'grey',\n        cursor: 'auto',\n        fontStyle: 'italic'\n      });\n    } else {\n      searchLastItem.css({\n        color: '#3192c7',\n        cursor: 'pointer',\n        fontStyle: 'unset'\n      });\n    }\n\n    searchLastItem.hover(\n      () => {\n        if (keywordExist) {\n          searchLastItem.css({ backgroundColor: 'white' });\n        } else {\n          searchLastItem.css({ backgroundColor: '#d5e9f5' });\n        }\n      },\n      () => {\n        searchLastItem.css({ backgroundColor: 'white' });\n      }\n    );\n  }\n\n  render() {\n    const LabelBoxStyle = {\n      maxHeight: '100px',\n      paddingTop: '2px'\n    };\n    const keywordsSearchBox = {\n      margin: '-2px',\n      border: 'none',\n      boxShadow: 'none'\n    };\n\n    return (\n      <div className=\"ui-search ui-search-div label-box\" onBlur={this.handleOnBlur}>\n        <div className=\"pill-container\" ref={ (ref) => this.labelBoxRef = ref } style={LabelBoxStyle} onClick={this.handleSearchClick}>\n          <div id=\"keywords-pill-container\" className=\"keywords-pill-container\" >\n            {this.renderKeywords()}\n          </div>\n        </div>\n        <div style={keywordsSearchBox} className=\"ui-search ui-search-div keywords-pill-container\" onKeyDown={this.handleBackSpace}>\n          <Search\n            ref={ (ref) => this.searchRef = ref }\n            results={this.getResults()}\n            onInputChange={this.onInputChange}\n            onSelectResult={this.onSelectResult}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_keywords/keywords_search.tsx","import React from 'react';\n\nexport default class ToggleEditSaveKeywords extends React.Component<any, any> {\n  render() {\n    if (this.props.userRole == 'opengov_admin' || this.props.userRole == 'entity_admin') {\n      return (\n        <span className=\"edit-mode\">\n          {!this.props.isEditKeywordsMode ?\n            <a onClick={this.props.toggleEditKeywordsMode}>EDIT</a>\n          : <a onClick={this.props.toggleEditKeywordsMode}>DONE</a>\n          }\n        </span>\n      );\n    }\n\n    return null;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_keywords/toggle_edit_keyword.tsx","import { initialize, LDClient, LDFlagChangeset, LDFlagValue, LDUser } from 'ldclient-js';\n\nexport interface ILaunchDarklySessionParams {\n  uuid: string;\n  full_name: string;\n  first_name: string;\n  last_name: string;\n  email: string;\n  entity: {\n    id: string;\n  };\n  role: {\n    name: string;\n  };\n}\n\nexport type ILaunchDarklyParams = { session: ILaunchDarklySessionParams; currentEntityId: string };\n\nlet client: LDClient = null;\n\nexport const sessionToLDUser = (params: ILaunchDarklyParams): LDUser => {\n  const { session, currentEntityId } = params;\n\n  return {\n    key: `${currentEntityId}:${session.uuid}`,\n    name: session.full_name,\n    firstName: session.first_name,\n    lastName: session.last_name,\n    email: session.email,\n    custom: {\n      userEntityId: session.entity.id,\n      selectedEntityId: currentEntityId,\n      role: session.role.name\n    }\n  };\n};\n\nexport const ldInitialize = (\n  isLdAvailable: boolean,\n  ldEnvKey: string,\n  changeHandler: (current?: LDFlagValue | LDFlagChangeset, previous?: LDFlagValue) => void\n) => async (session: ILaunchDarklyParams): Promise<LDClient> => {\n  if (!isLdAvailable) {\n    if (process.env.NODE_ENV === 'development') {\n      console.log('feature flag provider unavailable'); //tslint:disable-line:no-console\n    }\n\n    return Promise.reject(null);\n  }\n\n  if (client) {\n    return client.waitUntilReady().then(() => client);\n  }\n\n  client = initialize(ldEnvKey, sessionToLDUser(session));\n  client.on('change', changeHandler);\n\n  return client.waitUntilReady().then(() => client);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@opengov/launchdarkly/src/index.ts","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport $ from 'jquery';\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport transitionDefaults from './utils/css_transition_defaults';\nimport classNames from 'classnames';\nimport * as Immutable from 'immutable';\nimport * as Ovid from '@opengov/ovid';\nimport _ from 'lodash';\nimport { StoreListener } from '@opengov/og_flux';\nimport analytics from '@opengov/og_analytics';\nimport api from '@opengov/og_api';\n\nimport Report from './models/report';\nimport { GridReport } from './grid_report';\nimport SummaryReport from './summary_report';\nimport ReportPanel from './report_panel';\nimport PasswordModal from './modals/password';\nimport ReportActions from './actions/report_actions';\nimport EditorFooter from './editor_footer';\nimport ReportViewStore from './stores/report_view_store';\nimport handleJqueryAjaxError from './handle_jquery_ajax_error';\nimport SettingsPanel from './settings_panel';\nimport * as LegacyRouter from './router';\nimport EventObserver from './utils/event_observer_mixin';\nimport GridReportActions from './actions/grid_report_actions';\nimport * as InviteActions from './actions/invite_actions';\nimport * as StoryActions from './actions/stories_actions';\n\nimport SummaryReportStore from './stores/summary_report_store';\nimport GridReportStore from './stores/grid_report_store';\nimport StoriesStore from './stores/stories_store';\n\n// Loading in trapi_middleware to route between TrAPI v1 and v2\nimport TrapiMiddleware from './trapi_middleware';\n\nimport createReactClass from 'create-react-class';\nimport { ldInitialize, ILaunchDarklyParams } from '@opengov/launchdarkly';\nimport { trackPage } from './tracking';\n\nexport function handleReportPropertiesUpdate(loaded, report, renderedReport) {\n  if (!loaded || !report || !renderedReport) {\n    return;\n  }\n\n  const renderedProperties = renderedReport.get('properties').toJS();\n  const backboneReportProperties = report.get('properties');\n\n  if (!_.isEqual(renderedProperties, backboneReportProperties)) {\n    report.set('properties', renderedProperties);\n  }\n}\n\nconst ReportView = createReactClass<any, any>({\n\n  mixins: [\n    EventObserver,\n    StoreListener(\n      ReportViewStore,\n      StoriesStore\n    )\n  ],\n\n  getStateFromStore() {\n    return {\n      isGridReport: ReportViewStore.isGridReport(),\n      isEditingDefaultState: ReportViewStore.isEditingDefaultState(),\n      editingReport: ReportViewStore.isEditingData(),\n      wizardFlow: ReportViewStore.getWizardFlow(),\n      renderedReport: ReportViewStore.getRenderedReport(),\n      auditModeEnabled: ReportViewStore.getAuditModeEnabled(),\n      hasValidData: ReportViewStore.getHasValidData(),\n      activeSidebar: ReportViewStore.getActiveSidebar(),\n      stories: StoriesStore.getState().get('stories')\n    };\n  },\n\n  storeDidUpdate() {\n    this.setState(this.getStateFromStore());\n  },\n\n  render() {\n    const { loaded, creating, reportEntity, report } = this.state;\n    const { isControlPanel, entity, entities, reports, session, onMakeDefaultReport } = this.props;\n    const isNetwork = gon.isNetwork;\n    let ReportComponent: any = 'div';\n\n    const reportClassName = classNames({\n      report_container: true,\n      'js-report-container': true,\n      'is-editing': this.state.isEditingDefaultState\n    });\n\n    if (this.state.loaded && !report.isNew()) {\n      ReportComponent = this.state.isGridReport ? GridReport : SummaryReport;\n    }\n\n    const configAlertMessage = this.state.isGridReport ?\n      'Save column order and visibility, column sort order, initial filtering, and more'\n    :\n      'Select and save a default chart type, time range, filters, and more';\n\n    return (\n      <div className={reportClassName}>\n        {!loaded && creating ?\n          <div className=\"ui-loader\">\n            <div className=\"ui-loading\"></div>\n            <div className=\"ui-loader__message\">\n              <strong>Creating report</strong>\n            </div>\n          </div>\n        : null}\n        <CSSTransitionGroup\n          transitionName=\"editor-footer\"\n          {...transitionDefaults}>\n          {this.state.isEditingDefaultState ?\n            <EditorFooter\n              subMessage={configAlertMessage}\n              onSave={this.handleSaveDefaultState}\n              onCancel={ReportActions.cancelEditDefaultStateMode} />\n          : null}\n        </CSSTransitionGroup>\n\n        {isControlPanel ?\n          <ReportPanel\n            entities={entities}\n            entity={entity}\n            editReport={report}\n            selectedReport={this.state.report}\n            reports={reports}\n            session={session}\n            flowKey={this.state.wizardFlow}\n            onWizardComplete={() => _.defer(this.handleReportWizardComplete)}\n            onMakeDefaultReport={onMakeDefaultReport}\n            isOpen={this.state.editingReport}\n            onClose={this.handleCloseReportPanel} />\n        : null}\n\n        <SettingsPanel\n          session={session}\n          isControlPanel={isControlPanel}\n          isNetwork={isNetwork}\n          entity={entity}\n          scalePerCapitaEnabled={this.state.scalePerCapitaEnabled}\n        />\n\n        <div key={entity.id + '.' + report.id + '.' + this.state.auditModeEnabled}>\n          {this.state.loaded && !report.isNew() &&\n            <ReportComponent\n              key={entity.id + '.' + report.id + '.' + this.state.auditModeEnabled + 'blah'}\n              ref=\"report\"\n              router={this.props.router}\n              reportParams={this.props.reportParams}\n              editingDefaultState={this.state.isEditingDefaultState}\n              onMakeDefaultReport={this.props.onMakeDefaultReport}\n              onStateChange={this.handleStateChange}\n              onDataSetChange={this.handleDataSetChange}\n              onCoaMaskChange={this.handleCoaMaskChange}\n              onOpenSettingsPanel={this.props.onOpenSettingsPanel}\n              onParamsChange={this.setReportParams}\n              onLoaded={this.handleReportLoaded}\n              entity={reportEntity}\n              session={session}\n              report={report}\n              isGridReport={this.state.isGridReport}\n              isControlPanel={this.props.isControlPanel}\n              reportState={this.state.reportState}\n              renderedReport={this.state.renderedReport}\n              reports={reports}\n              auditModeEnabled={this.state.auditModeEnabled}\n              hasValidData={this.state.hasValidData}\n              embedded={this.props.isControlPanel}\n              isNetwork={isNetwork}\n              isReloaded={this.state.reloaded}\n              activeSidebar={this.state.activeSidebar}\n              stories={this.state.stories}\n              scalePerCapitaEnabled={this.state.scalePerCapitaEnabled}\n            />}\n\n          {loaded && report.isNew() && reports && reports.isEmpty() ?\n            <p className=\"ui-null align-center\">\n              <strong>{entity.get('name')} doesn&#39;t have reports yet.</strong>\n              {session.can('create', 'report') ?\n                <a href={'#' + entity.id + '/reports/new'}>Why not create the first report?</a>\n              : null}\n            </p>\n          : null}\n\n        </div>\n        {this.state.showPasswordModal &&\n          <PasswordModal\n            accessCode={report.get('access_code')}\n            onSubmit={this.authorizeReport}\n            onClose={() => this.setState({ showPasswordModal: false })} />}\n      </div>\n    );\n  },\n\n  getInitialState() {\n    let report;\n    if (this.props.report) {\n      report = this.props.report;\n    } else if (this.props.params.report) {\n      report = new Report({id: this.props.params.report });\n    } else {\n      report = new Report();\n    }\n    return _.assign({\n      showPasswordModal: false,\n      isEditingDefaultState: false,\n      isReportInitialized: false,\n      reportState: {},\n      report,\n      reportEntity: this.props.entity,\n    }, this.getStateFromStore());\n  },\n\n  componentDidMount() {\n    this._isMounted = true;\n\n    if (this.props.report) {\n      this.loadReport(this.props.report);\n    } else if (this.state.report) {\n      this.loadReport(this.state.report);\n    }\n    const reportTypeLabel = this.state.isGridReport ? 'Grid Report' : 'GL Report';\n    const reportApplicationLabel = this.props.isControlPanel ? 'Reporting Classic' : 'Transparency Classic';\n    trackPage(\n      `${reportApplicationLabel}: ${reportTypeLabel}`\n    );\n    this.listenToProp('entity');\n    this.listenToProp('report', 'dataSets:add dataSets:remove');\n\n    this.scrollPosition();\n\n    TrapiMiddleware.setEntity(this.props.entity);\n\n    if (_.includes(this.props.entity.get('feature_permissions'), 'stories')) {\n      StoryActions.fetchStories(this.props.entity.get('entity_id'));\n    }\n\n    // not interested in realtime changes at this time\n    const ldChangeHandler = () => {};\n\n    const ldIt = ldInitialize(true, gon.launchDarklyKey, ldChangeHandler);\n\n    if (!this.props.session || !this.props.session.toJSON) {\n      return;\n    }\n\n    const ldParams: ILaunchDarklyParams = {\n      session: { ...this.props.session.toJSON(), ...{ entity: this.props.entity.toJSON() } },\n      currentEntityId: this.props.entity.get('subdomain'), // this is the requested Entity\n    };\n\n    ldIt(ldParams).then((client) => {\n      const scalePerCapitaEnabled = client.variation('product-classic-reporting-feature-scale-per-capita', false);\n      this.setState({ scalePerCapitaEnabled });\n    });\n  },\n\n  componentWillUnmount() {\n    this._isMounted = false;\n    this.props.reports.off();\n    $(document).off('scroll', this.scrollCallback);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (nextProps.entity.id !== this.props.entity.id) {\n      this.setState({loaded: false, report: new Report(), reloaded: false});\n    }\n    if (nextProps.report) {\n      if (this.props.report !== nextProps.report) {\n        this.loadReport(nextProps.report);\n      } else if (_.result(_.last(nextProps.routes), 'name') === 'new') {\n        this.setState({ report: new Report() });\n      }\n    } else if (nextProps.params.report) {\n      if (this.props.params.report !== nextProps.params.report) {\n        const report = new Report({id: nextProps.params.report });\n        this.loadReport(report);\n      } else if (_.result(_.last(nextProps.routes), 'name') === 'new') {\n        this.setState({ report: new Report() });\n      }\n    }\n  },\n\n  componentDidUpdate() {\n    const { loaded, report, renderedReport } = this.state;\n\n    handleReportPropertiesUpdate(loaded, report, renderedReport);\n  },\n\n  loadReport(report) {\n    const self = this;\n\n    analytics.setReportId(report.id);\n\n    if (report.isNew()) {\n      report.set('entity_id', this.props.entity.get('entity_id'));\n      this.setState({\n        report,\n        loaded: false,\n        creating: false,\n        reloaded: false\n      });\n\n      // Display the currently rendered report in the document's title.\n      document.title = this.props.entity.getName() + ' > New Report';\n\n      _.defer(ReportActions.newReport);\n\n      return;\n    }\n\n    // Do not try to load reports with a legacy ID (ex: annual).\n    // Once the list of available reports has loaded, we will find a\n    // report with a type that matches the legeacy ID (see loadLegacyReport()).\n    if (report.isLegacy()) {\n      return;\n    }\n\n    this.setState({report, loaded: false, reloaded: false});\n\n    // TODO: Ideally this component should be given a pre-loaded report always.\n    report.fetch({\n      data: {\n        embed: this.props.isControlPanel ? 'associated_reports,invites' : 'associated_reports'\n      },\n      success() {\n        if (self._isMounted && self.state.report.id === report.id) {\n          const entityId = report.get('entity_id');\n\n          if (self.props.entity.get('entity_id') === entityId) {\n            // If the report already exists in the collection merge\n            // the updates we just fetched including the data sets.\n            // Exclude adding reports from other entities to this collection.\n            const dataSets = report.dataSets;\n            const collectionReport = self.props.reports.add(report, {merge: true});\n            collectionReport.dataSets = dataSets;\n          }\n        }\n        if (self.props.isControlPanel || report.isAuthorized()) {\n          self.presentReport(report);\n        } else {\n          self.setState({ showPasswordModal: true });\n        }\n      },\n      error(model, resp) {\n        handleJqueryAjaxError('Failed to load report', resp);\n      }\n    });\n  },\n\n  statics: {\n    /**\n    * if you transition into URL path which matches this route, this transition hook will fire\n    * before the route continues. Think middleware.\n    */\n    willTransitionTo(transition, params, query, callback) {\n      ReportActions.updateUrlParams(LegacyRouter.parseParameters(params.reportParams));\n      callback();\n    }\n  },\n\n  authorizeReport() {\n    this.state.report.authorized = true;\n    this.presentReport(this.state.report);\n  },\n\n  reportEntity(report) {\n    const entityId = report.get('entity_id');\n    const entities = this.props.entities;\n    return entities ? entities.find(function(entity) {\n      return entity.get('entity_id') === entityId;\n    }) : this.props.entity;\n  },\n\n  presentReport(report) {\n    const reportEntity = this.reportEntity(report);\n\n    ReportActions.loadedReport(report, reportEntity);\n\n    this.setState({\n      loaded: true,\n      reloaded: false,\n      reportEntity,\n      showPasswordModal: false\n    });\n\n    // Show that the user is creating a report in the document title.\n    document.title = reportEntity.getName() + ' / ' + report.get('name');\n  },\n\n  loadDefaultReport() {\n    const reports = this.props.reports;\n    if (reports.isEmpty()) {\n      this.setState({\n        loaded: true,\n        reloaded: false\n      });\n      this.props.router.director.setRoute(this.props.entity.id + '/reports');\n      this.props.onRouteChange('');\n      return;\n    }\n\n    const defaultReport = reports.get(this.props.entity.get('default_report_id')) || reports.getFirst();\n\n    if (defaultReport) {\n      this.loadReport(defaultReport);\n    }\n\n    this.setReportRoute(defaultReport);\n  },\n\n  handleCloseReportPanel() {\n    if (this.state.report.isNew()) {\n      this.setReportRoute(this.state.report);\n    }\n\n    if (this.state.editingReport) {\n      ReportActions.closeEditData();\n    }\n  },\n\n  handleStateChange(state) {\n    ReportActions.updateState(state);\n    this.setState({ reportState: state });\n  },\n\n  handleDataSetChange(dataSets) {\n    this.setState({dataSets});\n  },\n\n  handleCoaMaskChange() {\n    const report = this.state.report;\n\n    // Toggle the loaded state to force Athena to reload the report.\n    this.setState({\n      loaded: false,\n      reloaded: false,\n      report: new Report()\n    }, () => {\n      this.loadReport(report);\n    });\n  },\n\n  handleSaveDefaultState() {\n    const report = this.state.renderedReport;\n\n    /**\n    * NOTE: why we are doing this? Because initially we never had a good propagation of summary report (GL) state into\n    * report state store. Grid report (which we are not touching here) handles it differently and perhaps better. However,\n    * summary report has athena state which is decoupled from the summary report state. We have to assemple the entire report\n    * state by using these two (summary report and athena) states. Weird huh? It's the reality. So, instead of relying on\n    * reportState for GL reports, we do the assembly by calling summary report store function (delegation).\n    */\n    let currentReportState;\n    if (ReportViewStore.isGridReport()) {\n      currentReportState = this.state.reportState;\n    } else {\n      currentReportState = SummaryReportStore.generateSummaryReportState();\n    }\n\n    const properties = _.assign(report.get('properties').toJS(), currentReportState);\n\n    api.put('reports', report.get('id'), { properties }).end()\n      .then(() => {\n        Ovid.Flash.ftw({\n          title: 'Looking good!',\n          message: \"This report's default state has been updated\"\n        });\n        this.state.report.set('properties', properties);\n        ReportActions.defaultStateUpdated(Immutable.fromJS(properties));\n      })\n      .catch((e) => {\n        Ovid.Alert.unexpectedError();\n        throw e;\n      });\n  },\n\n  handleReportWizardComplete() {\n    ReportActions.closeEditData();\n\n    const report = this.state.report;\n    const reportEntity = this.reportEntity(report);\n    const isEditingDataSets = this.state.wizardFlow === 'EditDatasets';\n\n    // Toggle the loaded state to force Athena to reload the report.\n    this.setState({\n      creating: true,\n      loaded: false,\n      reloaded: false,\n      report: new Report()\n    }, () => {\n      ReportActions.loadedReport(report, reportEntity).then(() => {\n        Ovid.Flash.ftw({\n          title: 'Success!',\n          message: 'New report successfully created!'\n        });\n\n        // We call this explicity because adding a dataset should open the\n        // share notification, but there is no unique event fired for it.\n        // TODO: GRA-454\n        if (isEditingDataSets) {\n          InviteActions.openNotification();\n        }\n\n        if (report.get('report_type') == 'grid') {\n          GridReportActions.setLastCreatedReport(report);\n          if (isEditingDataSets) {\n            // Instruct grid report to reload properties which are cleared\n            // by the dataset wizard after it completes.\n            GridReportActions.reloadProperties(report.get('properties'));\n          }\n          this.setReportRoute(report);\n        }\n\n        this.setState({\n          creating: false,\n          loaded: true,\n          reloaded: true,\n          report\n        });\n\n        this.props.reports.add(report);\n      });\n    });\n  },\n\n  handleReportLoaded(isTriggeredFromSummaryReport) {\n    this.setState({\n      isReportInitialized: true\n    });\n    // Once the report has loaded we need to re-compute the scroll position of the\n    // main panel since the scroll top of the footer will have changed.\n    if (isTriggeredFromSummaryReport) {\n      this.scrollCallback();\n    }\n\n    if (SummaryReportStore.getState().get('rebuilding') ||\n      GridReportStore.getState().get('rebuilding') ) {\n      Ovid.Flash.ftw({\n        title: 'Processing data',\n        message: 'A new version of this report is being created. Check back in a few minutes to see the latest changes.',\n        button: 'Got it',\n        noTimeout: true\n      });\n    }\n  },\n\n  setReportRoute(report) {\n    if (!report) {\n      this.props.onRouteChange('');\n    } else if (report.isNew()) {\n      this.props.onRouteChange('new');\n    } else if (report.id) {\n      this.props.onRouteChange(report.id);\n    }\n  },\n\n  setReportParams(params) {\n    this.props.onRouteChange(this.state.report.id, params);\n  },\n\n  scrollPosition() {\n    const $window = $(window);\n\n    if (this.props.isControlPanel) {\n      let initialTop;\n\n      // In the control panel we re-position the main panel\n      // to align with the bottom of the header. As the user scrolls\n      // down the page and the header scrolls up and out of view,\n      // the main panel's top will be moved up to take up the space\n      // where the header was previously positioned.\n      this.scrollCallback = () => {\n        if (!this.refs.report) {\n          return;\n        }\n\n        const $report = $(ReactDOM.findDOMNode(this.refs.report));\n        $report.find('.js-scroll-position').each(function() {\n          if (!initialTop) {\n            initialTop = parseInt($(this).css('top'), 10);\n          }\n\n          const windowTop = $window.scrollTop();\n          const mainPanelTop = Math.max(initialTop - windowTop, 0);\n\n          $(this).css('top', mainPanelTop);\n        });\n      };\n\n    } else {\n      // In standalone mode we have no header, but we do have a footer.\n      // So as the user scrolls down and the footer begins to come into\n      // view, we fix position the main panel so it does not overlap with\n      // the footer.\n      this.scrollCallback = () => {\n        if (!this.refs.report || !this.refs.footer) {\n          return;\n        }\n\n        const $report = $(ReactDOM.findDOMNode(this.refs.report));\n        const $panel = $report.find('.ui-main__sidebar');\n        const $footer = $(ReactDOM.findDOMNode(this.refs.footer));\n        const viewportHeight = document.documentElement.clientHeight;\n        const footerTop = $footer.offset().top;\n        const triggerPoint = footerTop - viewportHeight;\n        const windowTop = $window.scrollTop();\n\n        if (windowTop > triggerPoint && triggerPoint >= 0) {\n          $panel.css({top: triggerPoint, position: 'absolute', height: '100%'});\n        } else {\n          $panel.css({top: 0, position: 'fixed'});\n        }\n      };\n    }\n\n    $(window).on('scroll', this.scrollCallback);\n  }\n});\n\nexport default ReportView;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_view.tsx","import React, { CSSProperties } from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport update from 'immutability-helper';\nimport * as Immutable from 'immutable';\nimport classNames from 'classnames';\nimport {MainPanel, Onboarding} from '@opengov/ovid';\nimport analytics from '@opengov/og_analytics';\nimport { StoreListener } from '@opengov/og_flux';\nimport * as Ovid from '@opengov/ovid';\nimport _ from 'lodash';\nimport Athena from './griddle';\nimport Header from './header';\nimport Footer from './footer';\nimport ReportHeader from './griddle/report_header';\nimport AmountsTypeMenu from './griddle/amounts_type_menu';\nimport AmountMenu from './griddle/amount_menu';\nimport AggregateVisualization from './griddle/aggregate_visualization';\nimport VisualizationButton from './griddle/visualization_button';\nimport GridReportStore, { isMapEnabled } from './stores/grid_report_store';\nimport ReportViewStore from './stores/report_view_store';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport { STATES } from './actions/report_download_actions';\nimport { getGridState } from './stores/grid_report_store';\nimport { findColumnByName } from './utils/schema_utils';\nimport { convertToCumulativeAmounts, AmountsTypes, getAmountColumn, isMultipleAmountColumnsEnabled } from './utils/transactions_utils';\nimport ModalStore from './stores/modal_store';\nimport GridHeaderActions from './grid_header_actions';\nimport GridReportActions from './actions/grid_report_actions';\nimport ReportActions from './actions/report_actions';\nimport FeedbackModal from './modals/feedback';\nimport { isKPITargetsEnabled, isTargetValid } from './utils/target_utils';\nimport TargetToggle from './targets/target_toggle';\nimport TargetPanel from './targets/target_panel';\nimport TargetStatus from './targets/target_status';\nimport DocumentList from './document_list';\nimport CheckPanel from './check_panel';\nimport HowToModal from './modal_gridhowto';\nimport * as Router from './router';\nimport TermsOfServiceModal from './modals/terms-of-service';\n\nimport Banner from './banner';\nimport Budget101 from './griddle/budget101';\nimport GridWelcomeModal from './griddle/welcome_modal';\nimport SummaryWelcomeModal from './modals/summary_welcome';\n\nimport cookies from 'cookies-js';\nimport CookieHelper from './cookie_helper';\n\nimport Config from './config';\n\nimport strings from './strings';\nimport { formatUnits } from './utils/transactions_utils';\nimport GridBreakDownDropdown from './grid_break_down_dropdown';\nimport GridReportTotal from './grid_report_total';\nimport EmailOrExportFilter from './email_export_filter';\nimport SummaryTable from './griddle/summary_table';\nimport Sidebar from './sidebar';\nimport { isEmbed, hideTable, hideViz, getEmbedType } from './utils/embed_utils';\n\nimport FilterButtons from './filter-buttons';\n\nconst onboardingWaypoints = [\n  {\n    title: 'Get back',\n    description: 'At any point you can go back to your previous filter state or reset the grid to the default report state.',\n    node: '.page-navigation .ui-button:first-child',\n    position: 'bottom'\n  }, {\n    title: 'Search bar',\n    description: 'Search for any text across the report.',\n    node: '.icon-search-1',\n    position: 'bottom'\n  }\n];\n\nexport const GridReport = createReactClass<any, any>({\n  mixins: [\n    StoreListener(GridReportStore, ModalStore, SessionStore, ReportViewStore)\n  ] as any,\n\n  getInitialState() {\n    const entity = this.props.entity.toJSON();\n    const report = this.props.report;\n    const state = GridReportStore.getState();\n\n    const griddle = this._griddle = new Athena({\n      entity,\n      report,\n      embedded: this.props.embedded,\n      transaction_id: report.get('transaction_id'),\n      onStateChange: this.handleStateChange,\n      queryModel: state.get('queryModel'),\n      amountColumn: state.getIn(['visualization', 'amountColumn'])\n    });\n\n    this.transactionQueryToggle(0);\n\n    const logHeaderAction = this.createActionHandler('Header');\n    return {\n      currentWaypoint: 0,\n      gridReport: state,\n      map: {\n        data: []\n      },\n      embed: getEmbedType(),\n      currentCheckData: null,\n      relatedTransactions: GridReportStore.getState().get('relatedTransactions'),\n      showHowToModal: GridReportStore.getState().get('showHowTo'),\n      showTOS: GridReportStore.getState().get('showTOS'),\n      showExportFilter: state.get('showExportFilter'),\n      showTargetPanel: state.get('showTargetPanel'),\n      showAmountColumnPanel: state.get('showAmountColumnPanel'),\n      showBreakdownsSettingsPanel: state.get('showBreakdownsSettingsPanel'),\n      onboardingTour: GridReportStore.getState().get('onboardingTour'),\n      welcomeModal: !this.props.embedded && this.showWelcome(),\n      headerOptions: {\n        embedded: this.props.embedded,\n        downloads: {\n          fiscalYears:  [],\n          fullDataSet:  null,\n          isLoading: false\n        },\n        griddleState: griddle.griddleState.toJSON(),\n        queryModel: griddle.queryModel,\n        report: this.props.report,\n        entity: this.props.entity,\n        onAction: (action) => {\n          if (action === 'reset-filters') {\n            GridReportActions.reset();\n          }\n\n          logHeaderAction(action);\n        }\n      },\n      selectedTabIndex: 0\n    };\n  },\n\n  showWelcome() {\n    return !isEmbed() && !this.props.embedded && !cookies.get('grid_visited');\n  },\n\n  entityHasWelcomeDisabled() {\n    return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1\n  },\n\n  storeDidUpdate() {\n    let params;\n    if (!GridReportStore.isLoading()) {\n      params = Router.stringifyParameters(GridReportStore.getUrlState());\n\n      // Avoid sending duplicate events since this can get called multiple times on a single user action.\n      if (params !== this.lastPageviewParams) {\n        // update browsing history\n        Router.trackPageview(params);\n        this.lastPageviewParams = params;\n      }\n\n      this.props.onParamsChange(params);\n    }\n    // Forgive me for my hacky and sinful JavaScript ways...\n    // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n    const isTallahasseeFl = this.props.entity && this.props.entity.get('subdomain') === 'tallahasseefl';\n    let welcomeModal = GridReportStore.getState().get('showWelcome') === null ? this.state.welcomeModal : GridReportStore.getState().get('showWelcome');\n    const summaryWelcomeModal = ModalStore.getState().get('showWelcome') === null ? this.state.welcomeModal : ModalStore.getState().get('showWelcome');\n    welcomeModal = isTallahasseeFl ? summaryWelcomeModal : welcomeModal;\n    this.setState(update(this.state, {\n      grid: {$set: getGridState(GridReportStore.getState()) },\n      gridReport: { $set: GridReportStore.getState() },\n      map: { $set: GridReportStore.getMap() },\n      isMapEnabled: {\n        $set: isMapEnabled(GridReportStore.getState())\n      },\n      gridReportSchema: { $set: GridReportStore.getSchema() },\n      headerOptions: {\n        downloads: {\n          $set: GridReportStore.getDownloads() || { }\n        },\n        canGoBack: {\n          $set: GridReportStore.canGoBack()\n        },\n        canReset: {\n          $set: GridReportStore.canReset()\n        }\n      },\n      currentCheckData: {\n        $set: GridReportStore.getState().get('currentCheckData')\n      },\n      visualization: {\n        $set: GridReportStore.getState().get('visualization')\n      },\n      showHowToModal: {\n        $set: GridReportStore.getState().get('showHowTo')\n      },\n      showTOS: {\n        $set: GridReportStore.getState().get('showTOS')\n      },\n      showExportFilter: {\n        $set: GridReportStore.getState().get('showExportFilter')\n      },\n      showTargetPanel: {\n        $set: GridReportStore.getState().get('showTargetPanel')\n      },\n      showAmountColumnPanel: {\n        $set: GridReportStore.getState().get('showAmountColumnPanel')\n      },\n      showBreakdownsSettingsPanel: {\n        $set: GridReportStore.getState().get('showBreakdownsSettingsPanel')\n      },\n      session: {\n        $set: SessionStore.getSession()\n      },\n      reportCurrentFilter: {\n        $set: GridReportStore.getSavedState().getIn(['query', 'filter'])\n      },\n      report: {\n        $set: ReportViewStore.getRenderedReport()\n      },\n      showBudget101: {\n        $set: GridReportStore.getState().get('showBudget101')\n      },\n      welcomeModal: {\n        $set: welcomeModal\n      },\n      showFeedback: {\n        $set: ModalStore.getState().get('feedback').get('showFeedback')\n      },\n      feedbackSaving: {\n        $set: ModalStore.getState().get('feedback').get('saving')\n      },\n      feedbackError: {\n        $set: ModalStore.getState().get('feedback').get('showError')\n      },\n      feedbackErrorMessage: {\n        $set: ModalStore.getState().get('feedback').get('errorMessage')\n      },\n      onboardingTour: {\n        $set: GridReportStore.getState().get('onboardingTour')\n      },\n      alert: {\n        $set: GridReportStore.getState().get('alert')\n      },\n      relatedTransactions: {\n        $set: GridReportStore.getState().get('relatedTransactions') && GridReportStore.getState().get('relatedTransactions').toJS()\n      },\n      loading: {$set: GridReportStore.isLoading()},\n      error: {$set: GridReportStore.hasError()}\n    }), () => {\n      // If we are editing the report's default state and we perform actions\n      // such as toggling visualizations on/off or changing the breakdown, we must\n      // manually trigger this method since these actions don't cause \"change\" events from griddle.\n      // We do this inside the setState callback since this method depends on having the latest component state.\n      // Need to execute this in a defer since an action may be dispatching here.\n      _.defer(() => this.handleDefaultStateChange());\n    });\n  },\n\n  componentDidMount() {\n    this._griddle.run();\n    this._griddle.griddleState.on('change', this.onGriddleStateChange);\n    if (this.state.welcomeModal) {\n      CookieHelper.setVisitedCookie('grid_visited');\n    }\n\n    // Load the grid state if there's a state ID in the URL\n    // Otherwise we will just load the configured default state for this report.\n    // If `isReloaded` is true ignore any state ID in the URL since the report is being\n    // reloaded after the dataset has been changed. Any previous state IDs will no longer be valid.\n    const params = !this.props.isReloaded ? Router.parseParameters(this.props.reportParams) : {};\n\n    if (!GridReportActions.loadGridState(params, true)) {\n      this._griddle.once('gridInitialized', this.handleStateChange);\n    }\n  },\n\n  componentWillUnmount() {\n    this._griddle.griddleState.off();\n    this._griddle.loader.off();\n    this._griddle.queryModel.off();\n  },\n\n  componentWillReceiveProps(nextProps : { reportParams: any }) {\n    if (nextProps.reportParams && this.props.reportParams !== nextProps.reportParams) {\n      GridReportActions.loadGridState(Router.parseParameters(nextProps.reportParams));\n    }\n  },\n\n  componentDidUpdate(prevProps, prevState : any) {\n    if (prevState.grid !== this.state.grid &&\n      (!prevState.grid ||\n      JSON.stringify(prevState.grid.get('query')) !== JSON.stringify(this.state.grid.get('query')) ||\n      JSON.stringify(prevState.grid.get('columns')) !== JSON.stringify(this.state.grid.get('columns')) ||\n      JSON.stringify(prevState.grid.get('amountColumn')) !== JSON.stringify(this.state.grid.get('amountColumn')) ||\n      JSON.stringify(prevState.grid.get('graphType')) !== JSON.stringify(this.state.grid.get('graphType')))) {\n      this._griddle.setReportState(this.state.grid.toJS(), true, true);\n    }\n\n    this._griddle.resize();\n  },\n\n  handleDefaultStateChange() {\n    //load the check panel if we have a quasi_id but the check panel is not visible\n    const currentCheckData = this.state.currentCheckData;\n    if (currentCheckData.get('quasiId') && !currentCheckData.get('loading') && !currentCheckData.get('data')) {\n      GridReportActions.showCheckImagePanel(currentCheckData.get('quasiId'),\n        this.state.headerOptions.queryModel._q,\n        this.state.headerOptions.report.get('transaction_id'),\n        false);\n\n      this._griddle.scrollToInitialRowPosition(currentCheckData.get('rowTop'));\n    }\n    if (this.props.editingDefaultState) {\n      this.props.onStateChange({\n        grid_state_id: this.state.gridReport.get('savedStateId')\n      });\n    }\n  },\n\n  handleStateChange() {\n    this.handleDefaultStateChange();\n\n    const currentGriddleState = Immutable.fromJS(this._griddle.getReportState());\n    const savedState = GridReportStore.getSavedState().merge(currentGriddleState);\n    GridReportActions.saveGridState(savedState, true);\n  },\n\n  onGriddleStateChange() {\n    if (!this.isFirstRenderComplete) {\n      this.isFirstRenderComplete = true;\n      this.props.onLoaded(false/*isTriggeredFromSummaryReport*/);\n    }\n    this.setState(update(this.state, {\n      headerOptions: {\n        griddleState: {\n          $set: this._griddle.griddleState.toJSON()\n        }\n      }\n    }));\n  },\n\n  createActionHandler(name) {\n    return function(action, column) {\n      analytics.pushEvent('Checkbook/' + name, action, column);\n    };\n  },\n\n  closeWelcomeModal() {\n    GridReportActions.hideWelcomeModal();\n  },\n\n  setCurrentWaypoint(index) {\n    if (index >= onboardingWaypoints.length) {\n      this.endTour();\n      return;\n    }\n\n    GridReportActions.gotoTourStep(index);\n  },\n\n  endTour() {\n    GridReportActions.endTour();\n  },\n\n  startWelcomeTour() {\n    GridReportActions.startWelcomeTour();\n  },\n\n  renderAlert() {\n    switch (this.state.alert) {\n    case 'gridStateNotFound':\n      return <GridStateNotFoundAlert />;\n    case 'gridStateUnexpectedError':\n      return <GridStateUnexpectedErrorAlert />;\n    case 'checkLoadError':\n      return <CheckLoadError />;\n    }\n  },\n\n  calculateCurrentTotal(visualization, amountColumn) {\n    const isCumulative = visualization.get('amountsType') === AmountsTypes.Cumulative;\n    const renderedAggregates = isCumulative ? convertToCumulativeAmounts(visualization.get('aggregates'), visualization.get('breakdown'), amountColumn) : visualization.get('aggregates');\n    const current = renderedAggregates.last();\n\n    if (current) {\n      return _.sumBy(current.get('transactions').toJS(), o => o[[amountColumn] as any] );\n    }\n\n    return null;\n  },\n\n  generateTotalComponent(schema) {\n    const total_text_visible = this.props.renderedReport.getIn(['properties', 'total_text_visible']);\n    if (!total_text_visible) {\n      return null;\n    }\n    const dateColumn = findColumnByName(schema, schema.get('dateColumn'));\n    const visualization = this.state.visualization;\n    const amountColumn = getAmountColumn(visualization, schema);\n    const griddleStateAmount = this._griddle.griddleState.get('amount');\n    const calculatedTotal = formatUnits(schema, amountColumn, griddleStateAmount);\n    const totalString = strings.generateTotalLabel(visualization, dateColumn);\n\n    return (\n      <GridReportTotal totalString={totalString} calculatedTotal={calculatedTotal} />\n    );\n  },\n\n  handleCloseDownloadPanel() {\n    GridReportActions.hideExportFilter();\n    GridReportActions.updateFilteredExportJob(STATES.QUEUED);\n  },\n\n  transactionQueryToggle(selectedTabIndex) {\n    const gridTabIndex = this.props.renderedReport.getIn(['properties', 'summary_table_visible']) ? 1 : 0;\n\n    if (selectedTabIndex === gridTabIndex) {\n      this._griddle.griddleState.set({ 'isLazy':  false });\n      this._griddle.queryModel.trigger('load');\n    } else {\n      this._griddle.griddleState.set({ 'isLazy':  true });\n    }\n  },\n\n  selectedTabHandler(selectedTabIndex) {\n    this.transactionQueryToggle(selectedTabIndex);\n    this.setState(update(this.state, {\n      selectedTabIndex: {\n        $set: selectedTabIndex\n      }\n    }));\n  },\n\n  columnOnClick(column, operator, value) {\n    GridReportActions.filterColumn(column, operator, value);\n    this.selectedTabHandler(1);\n  },\n\n  render() {\n    const bannerHeight = !!this.refs.banner ? (ReactDOM.findDOMNode(this.refs.banner) as any).scrollHeight : null;\n    const visualization = this.state.visualization;\n\n    // Forgive me for my hacky and sinful JavaScript ways...\n    // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n    const isTallahasseeFl = this.props.entity && this.props.entity.get('subdomain') === 'tallahasseefl';\n    const WelcomeModalComponent = isTallahasseeFl ? SummaryWelcomeModal : GridWelcomeModal;\n\n    const amountColumn = getAmountColumn(visualization, this.state.gridReport.get('schema'));\n    const sumField = `${amountColumn}_sum`;\n\n    const currentTotal = visualization && this.calculateCurrentTotal(visualization, sumField);\n\n    const canShowSummaryTable = this.props.renderedReport.getIn(['properties', 'summary_table_visible']);\n    const breakdown = visualization && visualization.get('breakdown');\n    const isCumulative = visualization && visualization.get('amountsType') === AmountsTypes.Cumulative;\n    const tableAggregates = visualization && visualization.get('tableAggregates');\n    const renderedTableAggregates = isCumulative ?\n      convertToCumulativeAmounts(tableAggregates, breakdown, sumField) : tableAggregates;\n    const selectedTabIndex = canShowSummaryTable ? this.state.selectedTabIndex : 1;\n    const tabName = canShowSummaryTable ? 'Details' : 'Records';\n    const isSummaryLoading = visualization && visualization.get('isSummaryLoading');\n    const embedMainContentStyle = isEmbed() ? { paddingLeft: '0px' } : {};\n    const embedMainPanelStyle = isEmbed() ? { visibility: 'hidden' } as CSSProperties: {};\n    const embedTableStyle = hideTable() ? { display: 'none' } as CSSProperties: {};\n    const embedVizStyle = hideViz() ? { display: 'none' } as CSSProperties: {};\n    let feedbackModal = this.state.showFeedback ?\n      <FeedbackModal\n        entityDisplayName={this.props.entity.get('display_name')}\n        showError={this.state.feedbackError}\n        errorMessage={this.state.feedbackErrorMessage}\n        feedbackSaving={this.state.feedbackSaving}\n        reportId={this.props.report.id}\n        entityId={this.props.entity.get('entity_id')}/> :\n      null;\n\n    return (\n      <div className=\"report__container report_grid\">\n\n      {Config.CheckSettings.checkbookDomain === CookieHelper.parentDomain() ?\n        <Banner ref=\"banner\">\n          <div className=\"banner__content ohio-banner\">\n            <a href=\"http://ohiotreasurer.gov/\" className=\"ohio-banner__logo\"/>\n            <a href=\"http://local.ohiocheckbook.com/\" className=\"ohio-banner__ohiocheckbook-logo\">\n              <strong>OhioCheckbook.com</strong>\n            </a>\n          </div>\n        </Banner> : null}\n          <div style={embedMainPanelStyle}>\n            <MainPanel ref=\"sidebar\">\n              <Sidebar\n                entity={this.props.entity}\n                report={this.props.report}\n                session={this.props.session}\n                reports={this.props.reports}\n                embedded={this.props.embedded}\n                stories={this.props.stories}\n                activeSidebar={this.props.activeSidebar}\n                isGridReport={this.props.isGridReport}\n                isNetwork={this.props.isNetwork}\n                reportError={this.state.reportError}\n                isEditingDefaultState={this.props.editingDefaultState}\n                isControlPanel={this.props.isControlPanel}\n              >\n                {isMultipleAmountColumnsEnabled(this.props.entity) && visualization && <AmountMenu amountColumn={amountColumn} showAmountColumnPanel={this.state.showAmountColumnPanel} visualization={visualization} isControlPanel={this.props.embedded}/> }\n                {!!visualization && <GridBreakDownDropdown visualization={visualization} showBreakdownsSettingsPanel={this.state.showBreakdownsSettingsPanel} isControlPanel={this.props.embedded}/>}\n                <FilterButtons\n                  activeFilterIds={GridReportStore.getState().getIn(['filterState', 'activeFilterIds'])}\n                  items={this._griddle.menuItems}\n                  toggleAll={() => this._griddle.view('filterMenu').toggleAll()}\n                  addFilter={id => this._griddle.view('filterMenu').open(id)}\n                  removeFilter={id => this._griddle.view('filterMenu').closePanel(id)}\n                />\n                <div id=\"template-mainpanel\" key=\"templateMainPanel\"/>\n                <AmountsTypeMenu\n                  value={visualization && visualization.get('amountsType')}\n                  onChange={GridReportActions.setAmountsType} />\n                {isKPITargetsEnabled(this.props.entity) && visualization && <TargetToggle isControlPanel={this.props.isControlPanel} isPanelOpen={this.state.showTargetPanel} graphType={visualization.get('graphType')} isVisShown={visualization.get('isVisible')} target={visualization.get('target')} />}\n                {!!visualization && this.generateTotalComponent(this.state.gridReport.get('schema'))}\n                {isKPITargetsEnabled(this.props.entity) && visualization && isTargetValid(visualization.get('target')) && <TargetStatus target={visualization.get('target')} current={currentTotal} />}\n                <DocumentList entity={this.props.entity} />\n              </Sidebar>\n            </MainPanel>\n          </div>\n        <div id=\"template-subpanels\"></div>\n        {this.state.showTargetPanel && visualization && <TargetPanel target={visualization.get('target')} />}\n        <Header\n          entity={this.props.entity}\n          isNetwork={this.props.isNetwork}\n          headerOptions={this.state.headerOptions}\n          report={this.props.renderedReport}\n          reports={this.props.reports}\n          embedded={this.props.embedded} />\n\n        <main style={embedMainContentStyle} className=\"ui-main__content\">\n          {this.renderAlert()}\n          <GridHeaderActions {...this.state.headerOptions} embedded={this.props.embedded} showShareMenu={this.props.renderedReport.getIn(['abilities', 'update'])}\n            report={this.props.renderedReport} {...this.state}/>\n\n          <ReportHeader {...this.state.headerOptions} renderedReport={this.props.renderedReport} schema={this._griddle.schema} columns={this.state.gridReport.get('schema').get('columns')} filterMenu={this._griddle.view('filterMenu')} isControlPanel={this.props.isControlPanel} breakdown={breakdown}/>\n          <div id='visualization_wrapper' style={embedVizStyle}>\n            <VisualizationButton isVisible={this.state.gridReport.getIn(['visualization', 'isVisible'])} />\n            {!!(visualization && visualization.get('isVisible')) &&\n              <AggregateVisualization\n                locale={this.state.gridReport.get('locale')}\n                savedStateId={this.state.gridReport.get('savedStateId')}\n                filter={this.state.grid.getIn(['query', 'filter'])}\n                visualization={visualization}\n                map={this.state.map}\n                schema={this.state.gridReportSchema}\n                isMapEnabled={this.state.isMapEnabled}\n                bannerHeight={bannerHeight}\n                entity={this.props.entity} /> }\n          </div>\n          <div id='table_wrapper' style={embedTableStyle}>\n            <section className=\"report__section js-griddle-container\">\n              <h3 className=\"table-header\">Data</h3>\n                <Ovid.Tabs.Container minimal={true} selectedTabIndex={selectedTabIndex} selectedTabHandler={this.selectedTabHandler}>\n                  {canShowSummaryTable ?\n                    <Ovid.Tabs.Tab\n                      title=\"Summary\"\n                      tabPanelClasses=\"table-tab-panel\">\n                      <div className=\"summary-grid\">\n                        <div id=\"loading-gif\" className=\"loading-gif-centered\"></div>\n                          {renderedTableAggregates && renderedTableAggregates.size > 0 && <SummaryTable visualization={visualization} schema={this.state.gridReport.get('schema')} columnOnClick={this.columnOnClick} aggregatesData={renderedTableAggregates} /> }\n                      </div>\n                    </Ovid.Tabs.Tab>\n                  : null }\n                  <Ovid.Tabs.Tab\n                    title={tabName}\n                    tabPanelClasses=\"table-tab-panel\">\n                    <QueryGrid />\n                  </Ovid.Tabs.Tab>\n                </Ovid.Tabs.Container>\n              <div id=\"template-modal-recoverable-error\" />\n              <QueryGridLoader loading={this.state.loading} summaryLoading={isSummaryLoading} error={this.state.error ? 'Oops, Something Went Wrong' : null} canGoBack={this.state.headerOptions.canGoBack} selectedTabIndex={selectedTabIndex} />\n            </section>\n          </div>\n          {!this.props.isControlPanel && !this.props.embedded ?\n              <Footer ref=\"footer\" entity={this.props.entity}/>\n          : null}\n          {feedbackModal}\n          {this.state.onboardingTour.get('showTour') ?\n            <Onboarding\n              onCancel={GridReportActions.endTour}\n              currentWaypoint={this.state.onboardingTour.get('currentStep')}\n              setCurrentWaypoint={this.setCurrentWaypoint}\n              waypoints={onboardingWaypoints}/>\n          : null}\n\n          {this.state.welcomeModal && !this.entityHasWelcomeDisabled() ?\n            <WelcomeModalComponent\n              entity={this.props.entity}\n              closeWelcomeModal={this.closeWelcomeModal}\n              startTour={this.startWelcomeTour}/>\n          : null}\n          {this.state.showHowToModal ? <HowToModal /> : null }\n          {this.state.showBudget101 ? <Budget101 /> : null }\n          {this.state.showTOS ? <TermsOfServiceModal /> : null }\n          {this.state.showExportFilter ? <EmailOrExportFilter state={this.state} griddleState={this._griddle.griddleState} handleCloseDownloadPanel={this.handleCloseDownloadPanel}/> : null }\n          <CheckPanel checkData={this.state.currentCheckData && this.state.currentCheckData.toJS()}\n            entity={this.props.entity}\n            feedbackModal={feedbackModal}\n            openFeedbackModal={() => ReportActions.showFeedback()}\n            relatedTransactions={this.state.relatedTransactions}\n            locale={this.state.gridReport.get('locale')}\n          />\n        </main>\n      </div>\n    );\n  }\n});\n\nvar CheckLoadError = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"report-state-alert ui-alert-box notice\">\n        <span className=\"icon-exclamation-1\" />\n        <strong>Check Load Error</strong> There was an error loading the selected check.\n        <a className=\"ui-alert-box__close\" onClick={GridReportActions.dismissAlert} />\n      </div>\n    );\n  }\n});\n\nvar GridStateNotFoundAlert = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"report-state-alert ui-alert-box notice\">\n        <span className=\"icon-exclamation-1\" />\n        <strong>View not found</strong> The link you visited may be incorrect.\n        <a className=\"ui-alert-box__close\" onClick={GridReportActions.dismissAlert} />\n      </div>\n    );\n  }\n});\n\nvar GridStateUnexpectedErrorAlert = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"report-state-alert ui-alert-box whoops\">\n        <span className=\"icon-exclamation-1\" />\n        <strong>Unexpected error</strong> There was an issue loading the view you requested. Please try again shortly.\n        <a className=\"ui-alert-box__close\" onClick={GridReportActions.dismissAlert} />\n      </div>\n    );\n  }\n});\n\nvar QueryGridLoader = createReactClass<any, any>({\n  propTypes: {\n    loading: PropTypes.bool,\n    summaryLoading: PropTypes.bool,\n    error: PropTypes.string,\n    canGoBack: PropTypes.bool,\n    selectedTabIndex: PropTypes.number\n  },\n\n  render() {\n    const loading = this.props.selectedTabIndex == 1 ? this.props.loading : this.props.summaryLoading;\n    const styles = {\n      display: loading || this.props.error ? 'block' : 'none'\n    };\n\n    return (\n      <div className={`querygrid-loader ajax-loader ${ this.props.error ? 'error-state' : '' }`} style={styles}>\n        <div className=\"querygrid-loader__icon_loading\" />\n        <div className=\"querygrid-loader__icon_error icon-exclamation-4\" />\n        <div className=\"querygrid-loader__text_loading\">Loading...</div>\n        <div className=\"querygrid-loader__text_error\">{this.props.error}</div>\n        <div className={'querygrid-loader__button ' + classNames({disabled: GridReportStore.getState().get('history').isEmpty()})}\n          onClick={GridReportActions.goBack}>Back</div>\n        { this.props.error ? <div className= {'querygrid-loader__button ' + classNames({disabled: !this.props.canGoBack })}\n          onClick={GridReportActions.reset}>Reset</div> : null }\n      </div>\n    );\n  }\n});\n\nconst QueryGrid = () => {\n  return (\n    <div className=\"querygrid\">\n      <div id=\"loading-gif\" className=\"loading-gif-centered\"></div>\n    </div>\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/grid_report.tsx","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from './og';\nimport Backbone from 'backbone';\nimport analytics from '@opengov/og_analytics';\nimport AthenaState from './athena_state';\nimport AthenaFilterMenu from './views/filter_menu';\nimport RecoverableError from './views/recoverable_error';\nimport GridReportActions from './actions/grid_report_actions';\nimport GridReportStore, { isQueryOptimizationEnabled } from './stores/grid_report_store';\nimport QueryGrid from './querygrid/querygrid';\nimport RemoteModel from './querygrid/remotemodel';\nimport CheckContextMenu from './querygrid/plugins/checkbook_contextmenu';\nimport ContextMenu from './querygrid/plugins/contextmenu';\nimport FacetPanel from './querygrid/plugins/facetpanel';\nimport HeaderMenu from './querygrid/plugins/headermenu';\nimport FiltersPanel from './querygrid/plugins/filterspanel';\nimport ColumnsPanel from './querygrid/plugins/columnspanel';\nimport { localeToCurrency } from './numberTypes';\nimport { fromJS } from 'immutable';\n\nexport const visibleColumnIds = (columns, isCheckImageVisible?) => {\n  let result = columns\n    .filter(c => c.visible)\n    .map(c => c.id);\n\n  return isCheckImageVisible ? result.concat(['quasi_id']) : result;\n};\n\nconst Athena = og.View.extend({\n  el: 'body',\n  units: '',\n\n  initialize(options) {\n    this.options = options;\n    this.queryModel = options.queryModel;\n    this.entity = options.entity;\n    this.state = new AthenaState({\n      report: options.report,\n      entity: this.entity\n    });\n    this.griddleState = new Backbone.Model();\n    this.menuItems = [{\n      name: 'Filters',\n      id: 'filters'\n    }, {\n      name: 'Columns',\n      id: 'columns'\n    }, {\n      name: 'Aggregates',\n      id: 'groups'\n    }];\n\n    // options for QueryGrid\n    this.gridOptions = {\n      container: '.querygrid',\n      gridOptions: {\n        enableAddRow: true\n      }, // slickgrid options can be overriden\n      schema: [], // loaded asyncly via TransactionsAPI\n      meta: {},\n      queryModel: options.queryModel,\n      loader: null,\n      columns: [],\n      characterWidth: 7,\n      cellPadding: 40,\n      autoWidth: true\n    };\n\n    if (options.initialRow) {\n      this.gridOptions.initialRow = options.initialRow;\n    }\n\n    this.errorModal = new RecoverableError({\n      suppressRemoval: true\n    });\n\n    this.schemaLoaded = false; // To prevent race conditions\n    this.amountColumn = null;\n    this._previousAmountColumn = null;\n    this.graphType = null;\n    this._previousGraphType = null;\n    this.viewCheckDetails = null;\n    this.on('changed:amountColumn', this.updateGriddle);\n    this.on('changed:graphType', this.updateGriddle);\n  },\n\n  run() {\n    this.listenTo(this.queryModel, 'change', this.notifyStateChange);\n\n    this.loader = this.gridOptions.loader = new RemoteModel({\n      endpoint: _.bind(this.fetchDataHandler, this),\n      queryModel: this.queryModel\n    });\n\n    const filterMenu = new AthenaFilterMenu();\n    _.extend(filterMenu, {\n      template: 'griddle_subpanels',\n      placeholder: 'subpanels',\n      items: this.menuItems\n    });\n    this.view('filterMenu', filterMenu);\n\n    this.render();\n\n    // Bind to window resize even w/o grid loading\n    const resize = _.bind(this.resize, this);\n    resize();\n    this.handleResize = _.debounce(resize, 200);\n    $(window).resize(this.handleResize);\n\n    if (this.options.initialRow && this.options.initialRow > 0) {\n      this.scrollToInitialRowPosition(this.options.initialRow);\n    }\n\n    this.load();\n  },\n\n  load() {\n    const self = this;\n\n    // load data via ajax and call init\n    og.api.trapi.get('schema', this.options.transaction_id, function(err, requestResponse) {\n      err = err || requestResponse.error;\n\n      if (err) {\n        self.showErrorModal(err);\n        return;\n      }\n\n      const response = requestResponse.body;\n\n      if (!_.find(response.schema as any[], schema => schema.name === response.meta.date_column)) {\n        self.showErrorModal({\n          title: 'Error parsing dataset',\n          message: 'The date column could not be found in your dataset. Please re-upload your data and make sure to select the correct date option when mapping your dataset.'\n        });\n        return;\n      }\n\n      GridReportActions.transactionDownloadsLoaded(response.downloads);\n      GridReportActions.setInSyncStatus(response.meta);\n\n      const reportAmountType: any = localeToCurrency(self.state.get('report').get('locale'));\n\n      // append currency sign into label for monetary columns\n      _.each(response.schema, (column) => {\n        if (column.type === 'monetary') {\n          column.label += ` (${reportAmountType.symbol})`;\n          column.units = reportAmountType.label;\n        }\n        column.id = column.id || column.name;\n      });\n      self.schema = response.schema;\n      self.meta = response.meta;\n      self.gridOptions.columns = self.getColumnProperties(response.schema, self.options.report.get('properties').columns);\n      self.gridOptions.meta = response.meta;\n\n      GridReportActions.setSchema(response.meta, response.schema, self.entity.fiscal_year_start_month);\n\n      self.initGrid();\n\n      const amountColumn = self.amountColumn || self.gridOptions.meta.amount_column;\n\n      og.api.trapi.post('total', self.options.transaction_id, { fields: [amountColumn] }, function(err, response) {\n        if (response) {\n          const responseTotal = response.body || {};\n          self.griddleState.set({\n            count: responseTotal.count,\n            amount: responseTotal.total\n          });\n          self.schemaLoaded = true; // schema loaded... we can call loadTotal()\n          // refresh so that header does not display estimate instead of total\n          self.loadTotal();\n        }\n      });\n    });\n  },\n\n  getColumnProperties(schema, columnSettings = []) {\n    const schemaColumns = _.keyBy(schema, 'id');\n    const columns = [];\n\n    // get columns in the order that was set in report settings\n    _.each(columnSettings, function(c) {\n      if (c.id in schemaColumns) {\n        columns.push(_.extend({}, schemaColumns[c.id], c));\n        delete schemaColumns[c.id];\n      }\n    });\n\n    // add the rest of the columns from schema\n    _.each(schema, function(c) {\n      if (c.id in schemaColumns) {\n        columns.push(_.extend({}, schemaColumns[c.id]));\n      }\n    });\n\n    return columns;\n  },\n\n  loadTotal() {\n    let refetchTransactions = false;\n    const gridReportState = GridReportStore.getState();\n    const timePeriodQuery = gridReportState.get('timePeriodQuery');\n    const chartTypePie = gridReportState.getIn(['visualization', 'graphType']) === 'pie';\n    // if the schema hasn't finished loading... don't proceed...\n    if (!this.schemaLoaded) {\n      return;\n    }\n\n    let query = this.queryModel.toJSON();\n\n    // Query is empty when switching charts, so if it's a pie chart and there's a timePeriodQuery set by\n    // the <SummaryPieSlider/> #componentDidUpdate 😬 then set the query to whatever it selected.\n    if (timePeriodQuery && chartTypePie &&  _.isEmpty(query)) {\n      query = GridReportStore.getState().get('timePeriodQuery');\n      refetchTransactions = true;\n    }\n\n    this.loader.processQuery(query);\n    const filter = query.filter;\n\n    // TODO: If the graph types are of the same type, depending on filters and\n    //       amount column we might not require to fetch totals from the API again\n    //       For example: bar / line graphs and pie / treemap / horizontal_stacked graphs\n    //       should show the same totals depending on filters and amount column\n\n    // only load when the filter changed or the amount column has changed or the graph type has changed\n    // (do not load when only sorting changed etc.)\n    if (_.isEqual(filter, this._previousFilter) && _.isEqual(this.amountColumn, this._previousAmountColumn) && _.isEqual(this.graphType, this._previousGraphType)) {\n      return;\n    }\n\n    this.griddleState.set({\n      count: null,\n      amount: null,\n      estimate: null\n    });\n\n    // abort previous request so that we don't end up with value that does not match selection\n    if (this._totalRequest) {\n      this._totalRequest.abort();\n    }\n\n    const amountColumn = this.amountColumn || this.gridOptions.meta.amount_column;\n\n    this._totalRequest = og.api.trapi.post('total', this.options.transaction_id, { filter, fields: [amountColumn] }, (err, resp) => {\n      this._totalRequest = null;\n      if (!err) {\n        const data = resp.body;\n        this.griddleState.set({\n          count: data.count,\n          amount: data.total\n        });\n\n        if (refetchTransactions) {\n          this.loader.clear();\n          this.loader.ensureData(0, 1);\n          this.grid.onViewportChanged.notify();\n\n          const savedState = GridReportStore.getSavedState().mergeDeep({ query: fromJS(timePeriodQuery) });\n          GridReportActions.saveGridState(savedState, false);\n        }\n      }\n    });\n\n    this._previousFilter = filter;\n    this._previousAmountColumn = this.amountColumn;\n    this._previousGraphType = this.graphType;\n  },\n\n  initGrid() {\n    const locale = this.state.report.get('locale');\n    const grid = this.grid = new (QueryGrid as any)(this.gridOptions, locale);\n    const filterMenu = this.view('filterMenu');\n\n    // header menu plugin for filtering and querying\n    const headerMenuPlugin = new HeaderMenu({\n      queryModel: this.queryModel,\n      locale\n    });\n    grid.registerPlugin(headerMenuPlugin);\n\n    // plugin for right-click menu actions\n\n    this.viewCheckDetails = this.options.report.get('properties') && this.options.report.get('properties').check_image_visible;\n    this.contextMenuPlugin = this.createContextMenu(this.viewCheckDetails);\n    grid.registerPlugin(this.contextMenuPlugin);\n\n    const filtersPanel = new FiltersPanel({\n      queryModel: this.queryModel,\n      filterMenu\n    });\n    filterMenu.view('subpanel', 'filters', filtersPanel);\n    grid.registerPlugin(filtersPanel);\n\n    // update query when filterspanel is being closed\n    filterMenu.on('toggle', function(id, isOpened) {\n      if (id === 'filters' && !isOpened) {\n        filtersPanel.setFilters();\n      }\n    });\n\n    const columnsPanel = new ColumnsPanel();\n    columnsPanel.viewData({id: 'columns'});\n    filterMenu.view('subpanel', 'columns', columnsPanel);\n    grid.registerPlugin(columnsPanel);\n    columnsPanel.render();\n\n    // Facet panel in a sidebar\n    this.facetPanel = new FacetPanel({\n      endpoint: _.bind(function(query, callback) {\n\n        return og.api.trapi.post('query', this.options.transaction_id, query, (error, response) => {\n          if (error) {\n            Raven.captureException(error);\n          }\n          callback(error, response);\n        });\n      }, this),\n      state: {\n        group: this.gridOptions.meta.amount_column,\n        value: this.gridOptions.meta.amount_column\n      },\n      grid,\n      columns: this.gridOptions.columns\n    });\n\n    filterMenu.view('subpanel', 'groups', this.facetPanel);\n    grid.registerPlugin(this.facetPanel);\n\n    // hookup logging to google analytics\n    const widgets = {\n      ColumnsPanel: columnsPanel,\n      ContextMenu: this.contextMenuPlugin,\n      AggregatesPanel: this.facetPanel,\n      FiltersPanel: filtersPanel,\n      ColumnMenu: headerMenuPlugin,\n      Grid: grid\n    };\n    _.each(widgets, function(widget, name) {\n      widget.on('action', function(action, column) {\n        analytics.pushEvent('Checkbook/' + name, action, column);\n      });\n    });\n\n    this.listenTo(grid, 'viewportChanged', this.onViewportChanged, this);\n    this.listenTo(grid, 'columnsReordered columnsVisibilityChanged', this.notifyStateChange);\n    this.listenTo(this.options.report, 'change', function() {\n      const isCheckVisible = this.options.report.get('properties') && this.options.report.get('properties').check_image_visible;\n\n      if (this.viewCheckDetails != isCheckVisible) {\n        this.viewCheckDetails = isCheckVisible;\n        this.updateContextMenu(isCheckVisible);\n      }\n\n    }, this);\n\n    this.listenTo(this.loader, 'loading', GridReportActions.loadingGridData);\n    this.listenTo(this.loader, 'error', GridReportActions.errorLoadingGridData);\n    this.listenTo(this.loader, 'loaded', this.onDataLoaded, this);\n\n    this.listenTo(this.queryModel, 'load', function() {\n      this.loader.clear();\n      this.loader.ensureData(0, 1);\n      this.grid.onViewportChanged.notify();\n      this.loadTotal();\n    }, this);\n\n    // If we tried setting the report state earlier before the grid\n    // was loaded, go ahead and set that state now.\n    if (this._pendingReportState) {\n      this.setReportState(...this._pendingReportState, locale);\n      this._pendingReportState = null;\n    }\n\n    // load the first page\n    this.loader.ensureData(0, 1);\n\n    this.trigger('gridInitialized');\n  },\n\n  destroy() {\n    $(window).off('resize', this.handleResize);\n\n    // plugins are destroyed automatically by grid\n    this.grid.destroy();\n\n    // remove listeners\n    this.queryModel.off();\n    this.loader.off();\n\n    // clean up the backbone view\n    this.remove();\n  },\n\n  resize() {\n    const griddleContainer = $('.js-griddle-container');\n    const top = griddleContainer.offset().top;\n    var w = $(window);\n    var container = $(this.gridOptions.container);\n    var summaryGridContainer = $('.summary-grid');\n    var calculatedHeight = (w.height() - top) - 71; // subtract 71px for the tab height\n    var minHeight = 340; // The minimum height required to show 7 rows in the grid\n\n    calculatedHeight = calculatedHeight < minHeight ? minHeight : calculatedHeight;\n\n    const visibleColumnsCount = this.getVisibleColumnsCount();\n\n    // Height will need to reduce by 42px when the banner appears\n    container.css({\n      height: calculatedHeight + 'px',\n      width:  griddleContainer.width() + 'px',\n      display: visibleColumnsCount > 0 ? 'block' : 'none'\n    });\n    summaryGridContainer.css({\n      height: calculatedHeight + 'px',\n      width:  griddleContainer.width() + 'px',\n      display: visibleColumnsCount > 0 ? 'block' : 'none'\n    });\n\n    if (this.grid) {\n      this.grid.resizeCanvas();\n      this.onViewportChanged();\n\n      this.grid.adjustHeader();\n    }\n  },\n\n  getReportState() {\n    return {\n      columns: _.map(this.grid.getAllColumns(), function(c) {\n        return _.pick(c, 'id', 'visible');\n      }),\n      query: this.queryModel.toJSON()\n    };\n  },\n\n  setReportState(state, silent, force) {\n    if (!this.grid) {\n      this._pendingReportState = [state, silent, force];\n      return;\n    }\n\n    // We only want to trigger one state change event.\n    // So pause any notifications until we have updated both the\n    // column and filter state of the grid before firing them.\n    this._updatingState = true;\n    const locale = this.state.report.get('locale');\n    this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), state.columns), locale);\n    this.queryModel.setQuery(_.cloneDeep(state.query), false, force);\n    this.setAmountColumn(state.amountColumn);\n    this.setGraphType(state.graphType);\n    this._updatingState = false;\n\n    // If we triggered any grid state changes, fire off the notifications now.\n    if (!silent && this._didChangeState) {\n      this.notifyStateChange();\n      this._didChangeState = false;\n    }\n  },\n\n  onDataLoaded(args) {\n    let count = args.count;\n\n    if (count === null && _.isUndefined(args.q.filter)) {\n      // there are no filters -> use total\n      count = this.griddleState.get('count');\n    }\n    this.griddleState.set('estimate', args.total_count_estimate);\n\n    this.onViewportChanged();\n\n    this.grid.adjustHeader();\n    GridReportActions.loadedGridData();\n    if (count === 0 && !this.griddleState.get('isLazy')) {\n      this.errorModal.open('No data matched your filters', 'Try broadening your search by removing or simplifying filters.');\n    } else {\n      this.errorModal.close();\n    }\n  },\n\n  onViewportChanged() {\n    const vp = this.grid.getViewport();\n    this.griddleState.set({\n      top: vp.top,\n      bottom: vp.bottom\n    });\n  },\n\n  resetFilters() {\n    const queryModel = this.queryModel;\n    queryModel.beginUpdate();\n    queryModel.filterClear();\n    queryModel.sort([]);\n    queryModel.endUpdate();\n  },\n\n  scrollToInitialRowPosition(row) {\n    const scrollRow = function() {\n      this.grid.scrollRowIntoView(row + 1);\n    };\n\n    const loadRows = function() {\n      this.loader.ensureData(row, row + 20);\n      this.listenToOnce(this.loader, 'loaded', scrollRow, this);\n    };\n\n    // load the data for the initial scroll position and then scroll there\n    // if the current pagesize is bigger than the row we need to ensure data.\n    // if the row is smaller than the current index, the grid will load data upon scrolling to that position\n    this.listenToOnce(this.loader, 'loaded', this.grid.loader.options.pageSize > row ? scrollRow : loadRows, this);\n  },\n\n  getState() {\n    return {\n      query: this.queryModel.toJSON()\n    };\n  },\n\n  showErrorModal(err) {\n    $('#loading-gif').hide();\n    if (err && err.status === 404) {\n      this.errorModal.open('No grid data', 'There is no data available for ' + this.entity.name + '.');\n    } else {\n      this.errorModal.open(\n        _.get(err, 'title') || 'Error communicating with server',\n        _.get(err, 'message') || 'Please try accessing this data again in a few minutes.'\n      );\n    }\n  },\n\n  notifyStateChange() {\n    if (this._updatingState) {\n      this._didChangeState = true;\n\n    } else if (this.options.onStateChange) {\n\n      this.options.onStateChange(this.getReportState());\n    }\n  },\n\n  getVisibleColumnsCount() {\n    return this.grid && this.grid.fixedColumns ? this.grid.fixedColumns.length : 0;\n  },\n\n  setAmountColumn(amountColumn) {\n    this.amountColumn = amountColumn;\n    this.trigger('changed:amountColumn');\n  },\n\n  setGraphType(graphType) {\n    this.graphType = graphType;\n    this.trigger('changed:graphType');\n  },\n\n  updateGriddle() {\n    // Update the aggregates panel\n    this.facetPanel.state.value = this.amountColumn || this.gridOptions.meta.amount_column;\n    this.facetPanel.render();\n    this.facetPanel.onQueryChange();\n\n    // Recalculate the total\n    this.loadTotal();\n  },\n\n  updateContextMenu(isCheckVisible) {\n    // Update the Context Menu\n    this.contextMenuPlugin = this.createContextMenu(isCheckVisible);\n    this.grid.registerPlugin(this.contextMenuPlugin);\n  },\n\n  createContextMenu(isCheckImageVisible) {\n    let contextMenuPlugin;\n    if (isCheckImageVisible) {\n      contextMenuPlugin = new CheckContextMenu({\n        queryModel: this.queryModel\n      });\n    } else {\n      contextMenuPlugin = new ContextMenu({\n        queryModel: this.queryModel\n      });\n    }\n    return contextMenuPlugin;\n  },\n\n  fetchDataHandler(query, callback) {\n    const gridReportState = GridReportStore.getState();\n    const timePeriodQuery = gridReportState.get('timePeriodQuery');\n    const chartTypePie = gridReportState.getIn(['visualization', 'graphType']) === 'pie';\n    if (timePeriodQuery && chartTypePie &&  query && _.isEmpty(query.filter)) {\n      query.filter = GridReportStore.getState().get('timePeriodQuery').filter;\n    }\n\n    // Do not query transactions when lazy loading\n    if (this.griddleState.get('isLazy')) {\n      return this.emptyTransactionsQuery(callback);\n    }\n\n    GridReportActions.loadingGridData();\n\n    // optimization or not if there are no .fields then the query is going to fail\n    if (isQueryOptimizationEnabled() || !query.fields || query.fields.length === 0) {\n      query.fields = visibleColumnIds(this.grid.getAllColumns(), this.viewCheckDetails);\n    }\n\n    return og.api.trapi.post('query', this.options.transaction_id, query, (error, response) => {\n      if (error) {\n        Raven.captureException(error);\n      }\n      callback(error, response);\n    });\n  },\n\n  emptyTransactionsQuery(callback) {\n    const response = { body: { transactions: [] } };\n    callback(null, response);\n    return ($.ajax as any)();\n  }\n});\n\nexport default Athena;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from '../og';\nimport GridReportActions from '../actions/grid_report_actions';\n\nexport default og.View.extend({\n  initialize() {\n    this.openPanelCount = 0;\n    this.registerCloseItem(this.isSelfClick);\n  },\n\n  //Direct clicks on the container won't register as self clicks, since the container\n  //is larger than the contained panels\n  isSelfClick(e) {\n    return !$(e.target).hasClass('subpanels');\n  },\n\n  toggle(id, state) {\n    console.log('toggle')\n    if (_.isUndefined(state)) {\n      state = !this.isOpen;\n    }\n\n    if (state) {\n      const item = _.find(this.items, {id});\n      this.open(item);\n    } else {\n      this.closePanel(id);\n    }\n  },\n\n  toggleAll() {\n    const openPanels = this.$('.js-subpanel.open');\n    if (openPanels.length === _.reject(this.items, 'disabled').length) {\n      this.closeAll();\n    } else {\n      this.openAll();\n    }\n  },\n\n  openAll() {\n    _.each(this.items, _.bind(function(item) {\n      this.open(item);\n    }, this));\n  },\n\n  closeAll() {\n    _.each(this.items, _.bind(function(item) {\n      this.closePanel(item.id);\n    }, this));\n  },\n\n  open(item) {\n    let id;\n\n    // The item parameter can be either an object or ID string.\n    if (_.isString(item)) {\n      item = _.find(this.items, {id: item as any});\n    }\n\n    id = item.id;\n\n    const $panel = this.find('subpanel', id);\n\n    if (item.disabled || $panel.hasClass('open')) {\n      return;\n    }\n\n    this.isOpen = this.openPanelCount >= 0;\n    this.selfClicked = true;\n\n    $panel.addClass('ready');\n    $('.js-subpanels').addClass('is-expanded');\n    setTimeout(function() {\n      $panel.addClass('open');\n    }, 1);\n\n    this.openPanelCount++;\n\n    GridReportActions.addActiveFilter(id);\n  },\n\n  close() {\n    this.closeAll();\n  },\n\n  closePanel(id) {\n    this.openPanelCount = Math.max(this.openPanelCount - 1, 0);\n\n    this.isOpen = this.openPanelCount > 0;\n    this.selfClicked = true;\n    const $panel = this.find('subpanel', id);\n    $panel.removeClass('open');\n    if (this.openPanelCount === 0) {\n      $('.js-subpanels').removeClass('is-expanded');\n    }\n    setTimeout(function() {\n      $panel.removeClass('ready');\n    }, 150);\n    GridReportActions.removeActiveFilter(id);\n  },\n\n  events: {\n    'click .js-close-panel': function(evt) {\n      const id = $(evt.currentTarget).data('id');\n      this.closePanel(id);\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/views/filter_menu.ts","var jQuery = require('jquery');\n\n/*!\n * jQuery UI Position 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n(function( $, undefined ) {\n\n$.ui = $.ui || {};\n\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\tround = Math.round,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[0];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[0];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[0].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn (cachedScrollbarWidth = w1 - w2);\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: isWindow ? withinElement.width() : withinElement.outerWidth(),\n\t\t\theight: isWindow ? withinElement.height() : withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[0].preventDefault ) {\n\t\t// force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\t// clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t});\n\n\t// normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each(function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\t// if the browser doesn't support fractions, then round for consistent results\n\t\tif ( !$.support.offsetFractions ) {\n\t\t\tposition.left = round( position.left );\n\t\t\tposition.top = round( position.top );\n\t\t}\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem : elem\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif ( options.using ) {\n\t\t\t// adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t});\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\t\t\t\t// element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\t\t\t\t// element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t// element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\t\t\t// too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\t\t\t\t// element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\t\t\t\t// element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t// element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\t\t\t// too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\t\t\t// adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\n\t\t\t\tif ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n// fraction support test\n(function () {\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\n\t\tdiv = document.createElement( \"div\" );\n\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\n\ttestElementStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\tbackground: \"none\"\n\t};\n\tif ( body ) {\n\t\t$.extend( testElementStyle, {\n\t\t\tposition: \"absolute\",\n\t\t\tleft: \"-1000px\",\n\t\t\ttop: \"-1000px\"\n\t\t});\n\t}\n\tfor ( i in testElementStyle ) {\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\n\t}\n\ttestElement.appendChild( div );\n\ttestElementParent = body || document.documentElement;\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\n\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\n\n\toffsetLeft = $( div ).offset().left;\n\t$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;\n\n\ttestElement.innerHTML = \"\";\n\ttestElementParent.removeChild( testElement );\n})();\n\n}( jQuery ) );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-ui/position.js\n// module id = 929\n// module chunks = 0 1","var jQuery = require('jquery');\nrequire('./core');\nrequire('./mouse');\nrequire('./widget');\n\n/*!\n * jQuery UI Sortable 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/sortable/\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.mouse.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nfunction isOverAxis( x, reference, size ) {\n\treturn ( x > reference ) && ( x < ( reference + size ) );\n}\n\nfunction isFloating(item) {\n\treturn (/left|right/).test(item.css(\"float\")) || (/inline|table-cell/).test(item.css(\"display\"));\n}\n\n$.widget(\"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.10.4\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\t_create: function() {\n\n\t\tvar o = this.options;\n\t\tthis.containerCache = {};\n\t\tthis.element.addClass(\"ui-sortable\");\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine if the items are being displayed horizontally\n\t\tthis.floating = this.items.length ? o.axis === \"x\" || isFloating(this.items[0].item) : false;\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.removeClass(\"ui-sortable ui-sortable-disabled\");\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function(key, value){\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.options[ key ] = value;\n\n\t\t\tthis.widget().toggleClass( \"ui-sortable-disabled\", !!value );\n\t\t} else {\n\t\t\t// Don't call widget base _setOption for disable as it adds ui-state-disabled class\n\t\t\t$.Widget.prototype._setOption.apply(this, arguments);\n\t\t}\n\t},\n\n\t_mouseCapture: function(event, overrideHandle) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif (this.reverting) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif(this.options.disabled || this.options.type === \"static\") {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems(event);\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$(event.target).parents().each(function() {\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\n\t\t\t\tcurrentItem = $(this);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\n\t\t\tcurrentItem = $(event.target);\n\t\t}\n\n\t\tif(!currentItem) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.options.handle && !overrideHandle) {\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\n\t\t\t\tif(this === event.target) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(!validHandle) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function(event, overrideHandle, noActivation) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper(event);\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend(this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\n\t\t});\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css(\"position\", \"absolute\");\n\t\tthis.cssPosition = this.helper.css(\"position\");\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition(event);\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\n\n\t\t//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif(o.containment) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif(o.opacity) { // opacity option\n\t\t\tif (this.helper.css(\"opacity\")) {\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\n\t\t\t}\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\n\t\t}\n\n\t\tif(o.zIndex) { // zIndex option\n\t\t\tif (this.helper.css(\"zIndex\")) {\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\n\t\t\t}\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"start\", event, this._uiHash());\n\n\t\t//Recache the helper size\n\t\tif(!this._preserveHelperProportions) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\n\t\tthis._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function(event) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition(event);\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\tif (!this.lastPositionAbs) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif(this.options.scroll) {\n\t\t\tif(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== \"HTML\") {\n\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\n\t\t\t\t} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t\tif(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\n\t\t\t\t} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\n\n\t\t//Set the helper position\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\n\t\t}\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[i];\n\t\t\titemElement = item.item[0];\n\t\t\tintersection = this._intersectsWithPointer(item);\n\t\t\tif (!intersection) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter beetween the outer and inner container.\n\t\t\tif (item.instance !== this.currentContainer) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif (itemElement !== this.currentItem[0] &&\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\n\t\t\t\t\tthis._rearrange(event, item);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers(event);\n\n\t\t//Interconnect with droppables\n\t\tif($.ui.ddmanager) {\n\t\t\t$.ui.ddmanager.drag(this, event);\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger(\"sort\", event, this._uiHash());\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function(event, noPropagation) {\n\n\t\tif(!event) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\n\t\t\t$.ui.ddmanager.drop(this, event);\n\t\t}\n\n\t\tif(this.options.revert) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\n\t\t\t\tthat._clear(event);\n\t\t\t});\n\t\t} else {\n\t\t\tthis._clear(event, noPropagation);\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif(this.dragging) {\n\n\t\t\tthis._mouseUp({ target: null });\n\n\t\t\tif(this.options.helper === \"original\") {\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (this.placeholder) {\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\t\tif(this.placeholder[0].parentNode) {\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\t\t\t}\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend(this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t});\n\n\t\t\tif(this.domPosition.prev) {\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\n\t\t\t} else {\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$(items).each(function() {\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (/(.+)[\\-=_](.+)/));\n\t\t\tif (res) {\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\n\t\t\t}\n\t\t});\n\n\t\tif(!str.length && o.key) {\n\t\t\tstr.push(o.key + \"=\");\n\t\t}\n\n\t\treturn str.join(\"&\");\n\n\t},\n\n\ttoArray: function(o) {\n\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function(item) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn (l < x1 + (this.helperProportions.width / 2) && // Right Half\n\t\t\t\tx2 - (this.helperProportions.width / 2) < r && // Left Half\n\t\t\t\tt < y1 + (this.helperProportions.height / 2) && // Bottom Half\n\t\t\t\ty2 - (this.helperProportions.height / 2) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function(item) {\n\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (!isOverElement) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.floating ?\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\n\n\t},\n\n\t_intersectsWithSides: function(item) {\n\n\t\tvar isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),\n\t\t\tisOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif (this.floating && horizontalDirection) {\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\n\t\t} else {\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\n\t},\n\n\trefresh: function(event) {\n\t\tthis._refreshItems(event);\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function(connected) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && connected) {\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor (i = queries.length - 1; i >= 0; i--){\n\t\t\tqueries[i][0].each( addItems );\n\t\t}\n\n\t\treturn $(items);\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\n\n\t\tthis.items = $.grep(this.items, function (item) {\n\t\t\tfor (var j=0; j < list.length; j++) {\n\t\t\t\tif(list[j] === item.item[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t},\n\n\t_refreshItems: function(event) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [this];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\n\t\t\t\tcur = $(connectWith[i]);\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\n\t\t\t\t\t\tthis.containers.push(inst);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\n\t\t\ttargetData = queries[i][1];\n\t\t\t_queries = queries[i][0];\n\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\n\t\t\t\titem = $(_queries[j]);\n\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); // Data for target checking (mouse manager)\n\n\t\t\t\titems.push({\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function(fast) {\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change\n\t\tif(this.offsetParent && this.helper) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\n\t\t\titem = this.items[i];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\n\n\t\t\tif (!fast) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\n\t\t\tthis.options.custom.refreshContainers.call(this);\n\t\t} else {\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\t\tp = this.containers[i].element.offset();\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\n\t\t\t\tthis.containers[i].containerCache.width\t= this.containers[i].element.outerWidth();\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function(that) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[0] )\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\n\n\t\t\t\t\tif ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat.currentItem.children().each(function() {\n\t\t\t\t\t\t\t$( \"<td>&#160;</td>\", that.document[0] )\n\t\t\t\t\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t\t\t\t\t.appendTo( element );\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function(container, p) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after(that.placeholder);\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update(that, that.placeholder);\n\n\t},\n\n\t_contactContainers: function(event) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// get innermost container that intersects with item\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\n\n\t\t\t// never consider a container that's located within the item itself\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\n\n\t\t\t\t// if we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[i];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// if no intersecting containers found, return\n\t\tif(!innermostContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// move the item into the container if it's not there already\n\t\tif(this.containers.length === 1) {\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t//When entering a new container, we will find the item with the least distance and append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || isFloating(this.currentItem);\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\tbase = this.positionAbs[posProperty] + this.offset.click[posProperty];\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t\tcur += this.items[j][sizeProperty];\n\t\t\t\t}\n\n\t\t\t\tif(Math.abs(cur - base) < dist) {\n\t\t\t\t\tdist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\n\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\n\t\t}\n\n\n\t},\n\n\t_createHelper: function(event) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif(!helper.parents(\"body\").length) {\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\n\t\t}\n\n\t\tif(helper[0] === this.currentItem[0]) {\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\n\t\t}\n\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\n\t\t\thelper.width(this.currentItem.width());\n\t\t}\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\n\t\t\thelper.height(this.currentItem.height());\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function(obj) {\n\t\tif (typeof obj === \"string\") {\n\t\t\tobj = obj.split(\" \");\n\t\t}\n\t\tif ($.isArray(obj)) {\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\n\t\t}\n\t\tif (\"left\" in obj) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif (\"right\" in obj) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif (\"top\" in obj) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif (\"bottom\" in obj) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\n\t\t//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this information\n\t\t// with an ugly IE fix\n\t\tif( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif(this.cssPosition === \"relative\") {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif(o.containment === \"parent\") {\n\t\t\to.containment = this.helper[0].parentNode;\n\t\t}\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$(o.containment === \"document\" ? document : window).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t($(o.containment === \"document\" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif(!(/^(document|window|parent)$/).test(o.containment)) {\n\t\t\tce = $(o.containment)[0];\n\t\t\tco = $(o.containment).offset();\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function(d, pos) {\n\n\t\tif(!pos) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\n\t\t\tscrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function(event) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif(this.containment) {\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(o.grid) {\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\n\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\n\t\t\t),\n\t\t\tleft: (\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function(event, i, a, hardRefresh) {\n\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay(function() {\n\t\t\tif(counter === this.counter) {\n\t\t\t\tthis.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove\n\t\t\t}\n\t\t});\n\n\t},\n\n\t_clear: function(event, noPropagation) {\n\n\t\tthis.reverting = false;\n\t\t// We delay all events that have to be triggered to after the point where the placeholder has been removed and\n\t\t// everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\n\t\t\tthis.placeholder.before(this.currentItem);\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif(this.helper[0] === this.currentItem[0]) {\n\t\t\tfor(i in this._storedCSS) {\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\n\t\t\t\t\tthis._storedCSS[i] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif(this.fromOutside && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\n\t\t}\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif (this !== this.currentContainer) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); };  }).call(this, this.currentContainer));\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this));  }; }).call(this, this.currentContainer));\n\t\t\t}\n\t\t}\n\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\n\t\t\tif (!noPropagation) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif(this.containers[i].containerCache.over) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[i].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif(this._storedOpacity) {\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\n\t\t}\n\t\tif(this._storedZIndex) {\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tif(this.cancelHelperRemoval) {\n\t\t\tif(!noPropagation) {\n\t\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t\t} //Trigger all delayed events\n\t\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t\t}\n\n\t\t\tthis.fromOutside = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tif(!noPropagation) {\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\n\n\t\tif(this.helper[0] !== this.currentItem[0]) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\n\t\tif(!noPropagation) {\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\n\t\t\t\tdelayedTriggers[i].call(this, event);\n\t\t\t} //Trigger all delayed events\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn true;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function(_inst) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $([]),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n});\n\n})(jQuery);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-ui/sortable.js\n// module id = 930\n// module chunks = 0 1","var jQuery = require('jquery');\n\n/*!\n * jQuery UI Core 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\truniqueId = /^ui-id-\\d+$/;\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"1.10.4\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tNUMPAD_ADD: 107,\n\t\tNUMPAD_DECIMAL: 110,\n\t\tNUMPAD_DIVIDE: 111,\n\t\tNUMPAD_ENTER: 108,\n\t\tNUMPAD_MULTIPLY: 106,\n\t\tNUMPAD_SUBTRACT: 109,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.ui.ie && (/(static|relative)/).test(this.css(\"position\"))) || (/absolute/).test(this.css(\"position\"))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(relative|absolute|fixed)/).test($.css(this,\"position\")) && (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn (/fixed/).test(this.css(\"position\")) || !scrollParent.length ? $(document) : scrollParent;\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t},\n\n\tuniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.id ) {\n\t\t\t\tthis.id = \"ui-id-\" + (++uuid);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( runiqueId.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /input|select|textarea|button|object/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n\n\n\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.support.selectstart = \"onselectstart\" in document.createElement( \"div\" );\n$.fn.extend({\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t}\n});\n\n$.extend( $.ui, {\n\t// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n\tplugin: {\n\t\tadd: function( module, option, set ) {\n\t\t\tvar i,\n\t\t\t\tproto = $.ui[ module ].prototype;\n\t\t\tfor ( i in set ) {\n\t\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t\t}\n\t\t},\n\t\tcall: function( instance, name, args ) {\n\t\t\tvar i,\n\t\t\t\tset = instance.plugins[ name ];\n\t\t\tif ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// only used by resizable\n\thasScroll: function( el, a ) {\n\n\t\t//If overflow is hidden, the element might have extra content, but the user wants to hide it\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t}\n});\n\n})( jQuery );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-ui/core.js\n// module id = 931\n// module chunks = 0 1","var jQuery = require('jquery');\nrequire('./widget');\n\n/*!\n * jQuery UI Mouse 1.10.4\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/mouse/\n *\n * Depends:\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar mouseHandled = false;\n$( document ).mouseup( function() {\n\tmouseHandled = false;\n});\n\n$.widget(\"ui.mouse\", {\n\tversion: \"1.10.4\",\n\toptions: {\n\t\tcancel: \"input,textarea,button,select,option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.bind(\"mousedown.\"+this.widgetName, function(event) {\n\t\t\t\treturn that._mouseDown(event);\n\t\t\t})\n\t\t\t.bind(\"click.\"+this.widgetName, function(event) {\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.unbind(\".\"+this.widgetName);\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\t$(document)\n\t\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\t\t}\n\t},\n\n\t_mouseDown: function(event) {\n\t\t// don't let more than one widget handle mouseStart\n\t\tif( mouseHandled ) { return; }\n\n\t\t// we may have missed mouseup (out of window)\n\t\t(this._mouseStarted && this._mouseUp(event));\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = (event.which === 1),\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif (!this.mouseDelayMet) {\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay);\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\n\t\t\tif (!this._mouseStarted) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\n\t\t}\n\n\t\t// these delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function(event) {\n\t\t\treturn that._mouseMove(event);\n\t\t};\n\t\tthis._mouseUpDelegate = function(event) {\n\t\t\treturn that._mouseUp(event);\n\t\t};\n\t\t$(document)\n\t\t\t.bind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.bind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function(event) {\n\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\n\t\t\treturn this._mouseUp(event);\n\t\t}\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseDrag(event);\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function(event) {\n\t\t$(document)\n\t\t\t.unbind(\"mousemove.\"+this.widgetName, this._mouseMoveDelegate)\n\t\t\t.unbind(\"mouseup.\"+this.widgetName, this._mouseUpDelegate);\n\n\t\tif (this._mouseStarted) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif (event.target === this._mouseDownEvent.target) {\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\n\t\t\t}\n\n\t\t\tthis._mouseStop(event);\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseDistanceMet: function(event) {\n\t\treturn (Math.max(\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function(/* event */) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function(/* event */) {},\n\t_mouseDrag: function(/* event */) {},\n\t_mouseStop: function(/* event */) {},\n\t_mouseCapture: function(/* event */) { return true; }\n});\n\n})(jQuery);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/jquery-ui/mouse.js\n// module id = 932\n// module chunks = 0 1","/*! \n * jquery.event.drag - v 2.2\n * Copyright (c) 2010 Three Dub Media - http://threedubmedia.com\n * Open Source MIT License - http://threedubmedia.com/code/license\n */\n// Created: 2008-06-04 \n// Updated: 2012-05-21\n// REQUIRES: jquery 1.7.x\n\n;(function( $ ){\n\n// add the jquery instance method\n$.fn.drag = function( str, arg, opts ){\n\t// figure out the event type\n\tvar type = typeof str == \"string\" ? str : \"\",\n\t// figure out the event handler...\n\tfn = $.isFunction( str ) ? str : $.isFunction( arg ) ? arg : null;\n\t// fix the event type\n\tif ( type.indexOf(\"drag\") !== 0 ) \n\t\ttype = \"drag\"+ type;\n\t// were options passed\n\topts = ( str == fn ? arg : opts ) || {};\n\t// trigger or bind event handler\n\treturn fn ? this.bind( type, opts, fn ) : this.trigger( type );\n};\n\n// local refs (increase compression)\nvar $event = $.event, \n$special = $event.special,\n// configure the drag special event \ndrag = $special.drag = {\n\t\n\t// these are the default settings\n\tdefaults: {\n\t\twhich: 1, // mouse button pressed to start drag sequence\n\t\tdistance: 0, // distance dragged before dragstart\n\t\tnot: ':input', // selector to suppress dragging on target elements\n\t\thandle: null, // selector to match handle target elements\n\t\trelative: false, // true to use \"position\", false to use \"offset\"\n\t\tdrop: true, // false to suppress drop events, true or selector to allow\n\t\tclick: false // false to suppress click events after dragend (no proxy)\n\t},\n\t\n\t// the key name for stored drag data\n\tdatakey: \"dragdata\",\n\t\n\t// prevent bubbling for better performance\n\tnoBubble: true,\n\t\n\t// count bound related events\n\tadd: function( obj ){ \n\t\t// read the interaction data\n\t\tvar data = $.data( this, drag.datakey ),\n\t\t// read any passed options \n\t\topts = obj.data || {};\n\t\t// count another realted event\n\t\tdata.related += 1;\n\t\t// extend data options bound with this event\n\t\t// don't iterate \"opts\" in case it is a node \n\t\t$.each( drag.defaults, function( key, def ){\n\t\t\tif ( opts[ key ] !== undefined )\n\t\t\t\tdata[ key ] = opts[ key ];\n\t\t});\n\t},\n\t\n\t// forget unbound related events\n\tremove: function(){\n\t\t$.data( this, drag.datakey ).related -= 1;\n\t},\n\t\n\t// configure interaction, capture settings\n\tsetup: function(){\n\t\t// check for related events\n\t\tif ( $.data( this, drag.datakey ) ) \n\t\t\treturn;\n\t\t// initialize the drag data with copied defaults\n\t\tvar data = $.extend({ related:0 }, drag.defaults );\n\t\t// store the interaction data\n\t\t$.data( this, drag.datakey, data );\n\t\t// bind the mousedown event, which starts drag interactions\n\t\t$event.add( this, \"touchstart mousedown\", drag.init, data );\n\t\t// prevent image dragging in IE...\n\t\tif ( this.attachEvent ) \n\t\t\tthis.attachEvent(\"ondragstart\", drag.dontstart ); \n\t},\n\t\n\t// destroy configured interaction\n\tteardown: function(){\n\t\tvar data = $.data( this, drag.datakey ) || {};\n\t\t// check for related events\n\t\tif ( data.related ) \n\t\t\treturn;\n\t\t// remove the stored data\n\t\t$.removeData( this, drag.datakey );\n\t\t// remove the mousedown event\n\t\t$event.remove( this, \"touchstart mousedown\", drag.init );\n\t\t// enable text selection\n\t\tdrag.textselect( true ); \n\t\t// un-prevent image dragging in IE...\n\t\tif ( this.detachEvent ) \n\t\t\tthis.detachEvent(\"ondragstart\", drag.dontstart ); \n\t},\n\t\t\n\t// initialize the interaction\n\tinit: function( event ){ \n\t\t// sorry, only one touch at a time\n\t\tif ( drag.touched ) \n\t\t\treturn;\n\t\t// the drag/drop interaction data\n\t\tvar dd = event.data, results;\n\t\t// check the which directive\n\t\tif ( event.which != 0 && dd.which > 0 && event.which != dd.which ) \n\t\t\treturn; \n\t\t// check for suppressed selector\n\t\tif ( $( event.target ).is( dd.not ) ) \n\t\t\treturn;\n\t\t// check for handle selector\n\t\tif ( dd.handle && !$( event.target ).closest( dd.handle, event.currentTarget ).length ) \n\t\t\treturn;\n\n\t\tdrag.touched = event.type == 'touchstart' ? this : null;\n\t\tdd.propagates = 1;\n\t\tdd.mousedown = this;\n\t\tdd.interactions = [ drag.interaction( this, dd ) ];\n\t\tdd.target = event.target;\n\t\tdd.pageX = event.pageX;\n\t\tdd.pageY = event.pageY;\n\t\tdd.dragging = null;\n\t\t// handle draginit event... \n\t\tresults = drag.hijack( event, \"draginit\", dd );\n\t\t// early cancel\n\t\tif ( !dd.propagates )\n\t\t\treturn;\n\t\t// flatten the result set\n\t\tresults = drag.flatten( results );\n\t\t// insert new interaction elements\n\t\tif ( results && results.length ){\n\t\t\tdd.interactions = [];\n\t\t\t$.each( results, function(){\n\t\t\t\tdd.interactions.push( drag.interaction( this, dd ) );\n\t\t\t});\n\t\t}\n\t\t// remember how many interactions are propagating\n\t\tdd.propagates = dd.interactions.length;\n\t\t// locate and init the drop targets\n\t\tif ( dd.drop !== false && $special.drop ) \n\t\t\t$special.drop.handler( event, dd );\n\t\t// disable text selection\n\t\tdrag.textselect( false ); \n\t\t// bind additional events...\n\t\tif ( drag.touched )\n\t\t\t$event.add( drag.touched, \"touchmove touchend\", drag.handler, dd );\n\t\telse \n\t\t\t$event.add( document, \"mousemove mouseup\", drag.handler, dd );\n\t\t// helps prevent text selection or scrolling\n\t\tif ( !drag.touched || dd.live )\n\t\t\treturn false;\n\t},\t\n\t\n\t// returns an interaction object\n\tinteraction: function( elem, dd ){\n\t\tvar offset = $( elem )[ dd.relative ? \"position\" : \"offset\" ]() || { top:0, left:0 };\n\t\treturn {\n\t\t\tdrag: elem, \n\t\t\tcallback: new drag.callback(), \n\t\t\tdroppable: [],\n\t\t\toffset: offset\n\t\t};\n\t},\n\t\n\t// handle drag-releatd DOM events\n\thandler: function( event ){ \n\t\t// read the data before hijacking anything\n\t\tvar dd = event.data;\t\n\t\t// handle various events\n\t\tswitch ( event.type ){\n\t\t\t// mousemove, check distance, start dragging\n\t\t\tcase !dd.dragging && 'touchmove': \n\t\t\t\tevent.preventDefault();\n\t\t\tcase !dd.dragging && 'mousemove':\n\t\t\t\t//  drag tolerance, x≤ + y≤ = distance≤\n\t\t\t\tif ( Math.pow(  event.pageX-dd.pageX, 2 ) + Math.pow(  event.pageY-dd.pageY, 2 ) < Math.pow( dd.distance, 2 ) ) \n\t\t\t\t\tbreak; // distance tolerance not reached\n\t\t\t\tevent.target = dd.target; // force target from \"mousedown\" event (fix distance issue)\n\t\t\t\tdrag.hijack( event, \"dragstart\", dd ); // trigger \"dragstart\"\n\t\t\t\tif ( dd.propagates ) // \"dragstart\" not rejected\n\t\t\t\t\tdd.dragging = true; // activate interaction\n\t\t\t// mousemove, dragging\n\t\t\tcase 'touchmove':\n\t\t\t\tevent.preventDefault();\n\t\t\tcase 'mousemove':\n\t\t\t\tif ( dd.dragging ){\n\t\t\t\t\t// trigger \"drag\"\t\t\n\t\t\t\t\tdrag.hijack( event, \"drag\", dd );\n\t\t\t\t\tif ( dd.propagates ){\n\t\t\t\t\t\t// manage drop events\n\t\t\t\t\t\tif ( dd.drop !== false && $special.drop )\n\t\t\t\t\t\t\t$special.drop.handler( event, dd ); // \"dropstart\", \"dropend\"\t\t\t\t\t\t\t\n\t\t\t\t\t\tbreak; // \"drag\" not rejected, stop\t\t\n\t\t\t\t\t}\n\t\t\t\t\tevent.type = \"mouseup\"; // helps \"drop\" handler behave\n\t\t\t\t}\n\t\t\t// mouseup, stop dragging\n\t\t\tcase 'touchend': \n\t\t\tcase 'mouseup': \n\t\t\tdefault:\n\t\t\t\tif ( drag.touched )\n\t\t\t\t\t$event.remove( drag.touched, \"touchmove touchend\", drag.handler ); // remove touch events\n\t\t\t\telse \n\t\t\t\t\t$event.remove( document, \"mousemove mouseup\", drag.handler ); // remove page events\t\n\t\t\t\tif ( dd.dragging ){\n\t\t\t\t\tif ( dd.drop !== false && $special.drop )\n\t\t\t\t\t\t$special.drop.handler( event, dd ); // \"drop\"\n\t\t\t\t\tdrag.hijack( event, \"dragend\", dd ); // trigger \"dragend\"\t\n\t\t\t\t}\n\t\t\t\tdrag.textselect( true ); // enable text selection\n\t\t\t\t// if suppressing click events...\n\t\t\t\tif ( dd.click === false && dd.dragging )\n\t\t\t\t\t$.data( dd.mousedown, \"suppress.click\", new Date().getTime() + 5 );\n\t\t\t\tdd.dragging = drag.touched = false; // deactivate element\t\n\t\t\t\tbreak;\n\t\t}\n\t},\n\t\t\n\t// re-use event object for custom events\n\thijack: function( event, type, dd, x, elem ){\n\t\t// not configured\n\t\tif ( !dd ) \n\t\t\treturn;\n\t\t// remember the original event and type\n\t\tvar orig = { event:event.originalEvent, type:event.type },\n\t\t// is the event drag related or drog related?\n\t\tmode = type.indexOf(\"drop\") ? \"drag\" : \"drop\",\n\t\t// iteration vars\n\t\tresult, i = x || 0, ia, $elems, callback,\n\t\tlen = !isNaN( x ) ? x : dd.interactions.length;\n\t\t// modify the event type\n\t\tevent.type = type;\n\t\t// remove the original event\n\t\tevent.originalEvent = null;\n\t\t// initialize the results\n\t\tdd.results = [];\n\t\t// handle each interacted element\n\t\tdo if ( ia = dd.interactions[ i ] ){\n\t\t\t// validate the interaction\n\t\t\tif ( type !== \"dragend\" && ia.cancelled )\n\t\t\t\tcontinue;\n\t\t\t// set the dragdrop properties on the event object\n\t\t\tcallback = drag.properties( event, dd, ia );\n\t\t\t// prepare for more results\n\t\t\tia.results = [];\n\t\t\t// handle each element\n\t\t\t$( elem || ia[ mode ] || dd.droppable ).each(function( p, subject ){\n\t\t\t\t// identify drag or drop targets individually\n\t\t\t\tcallback.target = subject;\n\t\t\t\t// force propagtion of the custom event\n\t\t\t\tevent.isPropagationStopped = function(){ return false; };\n\t\t\t\t// handle the event\t\n\t\t\t\tresult = subject ? $event.dispatch.call( subject, event, callback ) : null;\n\t\t\t\t// stop the drag interaction for this element\n\t\t\t\tif ( result === false ){\n\t\t\t\t\tif ( mode == \"drag\" ){\n\t\t\t\t\t\tia.cancelled = true;\n\t\t\t\t\t\tdd.propagates -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif ( type == \"drop\" ){\n\t\t\t\t\t\tia[ mode ][p] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// assign any dropinit elements\n\t\t\t\telse if ( type == \"dropinit\" )\n\t\t\t\t\tia.droppable.push( drag.element( result ) || subject );\n\t\t\t\t// accept a returned proxy element \n\t\t\t\tif ( type == \"dragstart\" )\n\t\t\t\t\tia.proxy = $( drag.element( result ) || ia.drag )[0];\n\t\t\t\t// remember this result\t\n\t\t\t\tia.results.push( result );\n\t\t\t\t// forget the event result, for recycling\n\t\t\t\tdelete event.result;\n\t\t\t\t// break on cancelled handler\n\t\t\t\tif ( type !== \"dropinit\" )\n\t\t\t\t\treturn result;\n\t\t\t});\t\n\t\t\t// flatten the results\t\n\t\t\tdd.results[ i ] = drag.flatten( ia.results );\t\n\t\t\t// accept a set of valid drop targets\n\t\t\tif ( type == \"dropinit\" )\n\t\t\t\tia.droppable = drag.flatten( ia.droppable );\n\t\t\t// locate drop targets\n\t\t\tif ( type == \"dragstart\" && !ia.cancelled )\n\t\t\t\tcallback.update(); \n\t\t}\n\t\twhile ( ++i < len )\n\t\t// restore the original event & type\n\t\tevent.type = orig.type;\n\t\tevent.originalEvent = orig.event;\n\t\t// return all handler results\n\t\treturn drag.flatten( dd.results );\n\t},\n\t\t\n\t// extend the callback object with drag/drop properties...\n\tproperties: function( event, dd, ia ){\t\t\n\t\tvar obj = ia.callback;\n\t\t// elements\n\t\tobj.drag = ia.drag;\n\t\tobj.proxy = ia.proxy || ia.drag;\n\t\t// starting mouse position\n\t\tobj.startX = dd.pageX;\n\t\tobj.startY = dd.pageY;\n\t\t// current distance dragged\n\t\tobj.deltaX = event.pageX - dd.pageX;\n\t\tobj.deltaY = event.pageY - dd.pageY;\n\t\t// original element position\n\t\tobj.originalX = ia.offset.left;\n\t\tobj.originalY = ia.offset.top;\n\t\t// adjusted element position\n\t\tobj.offsetX = obj.originalX + obj.deltaX; \n\t\tobj.offsetY = obj.originalY + obj.deltaY;\n\t\t// assign the drop targets information\n\t\tobj.drop = drag.flatten( ( ia.drop || [] ).slice() );\n\t\tobj.available = drag.flatten( ( ia.droppable || [] ).slice() );\n\t\treturn obj;\t\n\t},\n\t\n\t// determine is the argument is an element or jquery instance\n\telement: function( arg ){\n\t\tif ( arg && ( arg.jquery || arg.nodeType == 1 ) )\n\t\t\treturn arg;\n\t},\n\t\n\t// flatten nested jquery objects and arrays into a single dimension array\n\tflatten: function( arr ){\n\t\treturn $.map( arr, function( member ){\n\t\t\treturn member && member.jquery ? $.makeArray( member ) : \n\t\t\t\tmember && member.length ? drag.flatten( member ) : member;\n\t\t});\n\t},\n\t\n\t// toggles text selection attributes ON (true) or OFF (false)\n\ttextselect: function( bool ){ \n\t\t$( document )[ bool ? \"unbind\" : \"bind\" ](\"selectstart\", drag.dontstart )\n\t\t\t.css(\"MozUserSelect\", bool ? \"\" : \"none\" );\n\t\t// .attr(\"unselectable\", bool ? \"off\" : \"on\" )\n\t\tdocument.unselectable = bool ? \"off\" : \"on\"; \n\t},\n\t\n\t// suppress \"selectstart\" and \"ondragstart\" events\n\tdontstart: function(){ \n\t\treturn false; \n\t},\n\t\n\t// a callback instance contructor\n\tcallback: function(){}\n\t\n};\n\n// callback methods\ndrag.callback.prototype = {\n\tupdate: function(){\n\t\tif ( $special.drop && this.available.length )\n\t\t\t$.each( this.available, function( i ){\n\t\t\t\t$special.drop.locate( this, i );\n\t\t\t});\n\t}\n};\n\n// patch $.event.$dispatch to allow suppressing clicks\nvar $dispatch = $event.dispatch;\n$event.dispatch = function( event ){\n\tif ( $.data( this, \"suppress.\"+ event.type ) - new Date().getTime() > 0 ){\n\t\t$.removeData( this, \"suppress.\"+ event.type );\n\t\treturn;\n\t}\n\treturn $dispatch.apply( this, arguments );\n};\n\n// event fix hooks for touch events...\nvar touchHooks = \n$event.fixHooks.touchstart = \n$event.fixHooks.touchmove = \n$event.fixHooks.touchend =\n$event.fixHooks.touchcancel = {\n\tprops: \"clientX clientY pageX pageY screenX screenY\".split( \" \" ),\n\tfilter: function( event, orig ) {\n\t\tif ( orig ){\n\t\t\tvar touched = ( orig.touches && orig.touches[0] )\n\t\t\t\t|| ( orig.changedTouches && orig.changedTouches[0] )\n\t\t\t\t|| null; \n\t\t\t// iOS webkit: touchstart, touchmove, touchend\n\t\t\tif ( touched ) \n\t\t\t\t$.each( touchHooks.props, function( i, prop ){\n\t\t\t\t\tevent[ prop ] = touched[ prop ];\n\t\t\t\t});\n\t\t}\n\t\treturn event;\n\t}\n};\n\n// share the same special event configuration with related events...\n$special.draginit = $special.dragstart = $special.dragend = drag;\n\n})( jQuery );\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/lib/jquery.event.drag-2.2.js\n// module id = 933\n// module chunks = 0 1","/***\n * Contains core SlickGrid classes.\n * @module Core\n * @namespace Slick\n */\n\n(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"Event\": Event,\n      \"EventData\": EventData,\n      \"EventHandler\": EventHandler,\n      \"Range\": Range,\n      \"NonDataRow\": NonDataItem,\n      \"Group\": Group,\n      \"GroupTotals\": GroupTotals,\n      \"EditorLock\": EditorLock,\n\n      /***\n       * A global singleton editor lock.\n       * @class GlobalEditorLock\n       * @static\n       * @constructor\n       */\n      \"GlobalEditorLock\": new EditorLock()\n    }\n  });\n\n  /***\n   * An event object for passing data to event handlers and letting them control propagation.\n   * <p>This is pretty much identical to how W3C and jQuery implement events.</p>\n   * @class EventData\n   * @constructor\n   */\n  function EventData() {\n    var isPropagationStopped = false;\n    var isImmediatePropagationStopped = false;\n\n    /***\n     * Stops event from propagating up the DOM tree.\n     * @method stopPropagation\n     */\n    this.stopPropagation = function () {\n      isPropagationStopped = true;\n    };\n\n    /***\n     * Returns whether stopPropagation was called on this event object.\n     * @method isPropagationStopped\n     * @return {Boolean}\n     */\n    this.isPropagationStopped = function () {\n      return isPropagationStopped;\n    };\n\n    /***\n     * Prevents the rest of the handlers from being executed.\n     * @method stopImmediatePropagation\n     */\n    this.stopImmediatePropagation = function () {\n      isImmediatePropagationStopped = true;\n    };\n\n    /***\n     * Returns whether stopImmediatePropagation was called on this event object.\\\n     * @method isImmediatePropagationStopped\n     * @return {Boolean}\n     */\n    this.isImmediatePropagationStopped = function () {\n      return isImmediatePropagationStopped;\n    }\n  }\n\n  /***\n   * A simple publisher-subscriber implementation.\n   * @class Event\n   * @constructor\n   */\n  function Event() {\n    var handlers = [];\n\n    /***\n     * Adds an event handler to be called when the event is fired.\n     * <p>Event handler will receive two arguments - an <code>EventData</code> and the <code>data</code>\n     * object the event was fired with.<p>\n     * @method subscribe\n     * @param fn {Function} Event handler.\n     */\n    this.subscribe = function (fn) {\n      handlers.push(fn);\n    };\n\n    /***\n     * Removes an event handler added with <code>subscribe(fn)</code>.\n     * @method unsubscribe\n     * @param fn {Function} Event handler to be removed.\n     */\n    this.unsubscribe = function (fn) {\n      for (var i = handlers.length - 1; i >= 0; i--) {\n        if (handlers[i] === fn) {\n          handlers.splice(i, 1);\n        }\n      }\n    };\n\n    /***\n     * Fires an event notifying all subscribers.\n     * @method notify\n     * @param args {Object} Additional data object to be passed to all handlers.\n     * @param e {EventData}\n     *      Optional.\n     *      An <code>EventData</code> object to be passed to all handlers.\n     *      For DOM events, an existing W3C/jQuery event object can be passed in.\n     * @param scope {Object}\n     *      Optional.\n     *      The scope (\"this\") within which the handler will be executed.\n     *      If not specified, the scope will be set to the <code>Event</code> instance.\n     */\n    this.notify = function (args, e, scope) {\n      e = e || new EventData();\n      scope = scope || this;\n\n      var returnValue;\n      for (var i = 0; i < handlers.length && !(e.isPropagationStopped() || e.isImmediatePropagationStopped()); i++) {\n        returnValue = handlers[i].call(scope, e, args);\n      }\n\n      return returnValue;\n    };\n  }\n\n  function EventHandler() {\n    var handlers = [];\n\n    this.subscribe = function (event, handler) {\n      handlers.push({\n        event: event,\n        handler: handler\n      });\n      event.subscribe(handler);\n\n      return this;  // allow chaining\n    };\n\n    this.unsubscribe = function (event, handler) {\n      var i = handlers.length;\n      while (i--) {\n        if (handlers[i].event === event &&\n            handlers[i].handler === handler) {\n          handlers.splice(i, 1);\n          event.unsubscribe(handler);\n          return;\n        }\n      }\n\n      return this;  // allow chaining\n    };\n\n    this.unsubscribeAll = function () {\n      var i = handlers.length;\n      while (i--) {\n        handlers[i].event.unsubscribe(handlers[i].handler);\n      }\n      handlers = [];\n\n      return this;  // allow chaining\n    }\n  }\n\n  /***\n   * A structure containing a range of cells.\n   * @class Range\n   * @constructor\n   * @param fromRow {Integer} Starting row.\n   * @param fromCell {Integer} Starting cell.\n   * @param toRow {Integer} Optional. Ending row. Defaults to <code>fromRow</code>.\n   * @param toCell {Integer} Optional. Ending cell. Defaults to <code>fromCell</code>.\n   */\n  function Range(fromRow, fromCell, toRow, toCell) {\n    if (toRow === undefined && toCell === undefined) {\n      toRow = fromRow;\n      toCell = fromCell;\n    }\n\n    /***\n     * @property fromRow\n     * @type {Integer}\n     */\n    this.fromRow = Math.min(fromRow, toRow);\n\n    /***\n     * @property fromCell\n     * @type {Integer}\n     */\n    this.fromCell = Math.min(fromCell, toCell);\n\n    /***\n     * @property toRow\n     * @type {Integer}\n     */\n    this.toRow = Math.max(fromRow, toRow);\n\n    /***\n     * @property toCell\n     * @type {Integer}\n     */\n    this.toCell = Math.max(fromCell, toCell);\n\n    /***\n     * Returns whether a range represents a single row.\n     * @method isSingleRow\n     * @return {Boolean}\n     */\n    this.isSingleRow = function () {\n      return this.fromRow == this.toRow;\n    };\n\n    /***\n     * Returns whether a range represents a single cell.\n     * @method isSingleCell\n     * @return {Boolean}\n     */\n    this.isSingleCell = function () {\n      return this.fromRow == this.toRow && this.fromCell == this.toCell;\n    };\n\n    /***\n     * Returns whether a range contains a given cell.\n     * @method contains\n     * @param row {Integer}\n     * @param cell {Integer}\n     * @return {Boolean}\n     */\n    this.contains = function (row, cell) {\n      return row >= this.fromRow && row <= this.toRow &&\n          cell >= this.fromCell && cell <= this.toCell;\n    };\n\n    /***\n     * Returns a readable representation of a range.\n     * @method toString\n     * @return {String}\n     */\n    this.toString = function () {\n      if (this.isSingleCell()) {\n        return \"(\" + this.fromRow + \":\" + this.fromCell + \")\";\n      }\n      else {\n        return \"(\" + this.fromRow + \":\" + this.fromCell + \" - \" + this.toRow + \":\" + this.toCell + \")\";\n      }\n    }\n  }\n\n\n  /***\n   * A base class that all special / non-data rows (like Group and GroupTotals) derive from.\n   * @class NonDataItem\n   * @constructor\n   */\n  function NonDataItem() {\n    this.__nonDataRow = true;\n  }\n\n\n  /***\n   * Information about a group of rows.\n   * @class Group\n   * @extends Slick.NonDataItem\n   * @constructor\n   */\n  function Group() {\n    this.__group = true;\n\n    /**\n     * Grouping level, starting with 0.\n     * @property level\n     * @type {Number}\n     */\n    this.level = 0;\n\n    /***\n     * Number of rows in the group.\n     * @property count\n     * @type {Integer}\n     */\n    this.count = 0;\n\n    /***\n     * Grouping value.\n     * @property value\n     * @type {Object}\n     */\n    this.value = null;\n\n    /***\n     * Formatted display value of the group.\n     * @property title\n     * @type {String}\n     */\n    this.title = null;\n\n    /***\n     * Whether a group is collapsed.\n     * @property collapsed\n     * @type {Boolean}\n     */\n    this.collapsed = false;\n\n    /***\n     * GroupTotals, if any.\n     * @property totals\n     * @type {GroupTotals}\n     */\n    this.totals = null;\n\n    /**\n     * Rows that are part of the group.\n     * @property rows\n     * @type {Array}\n     */\n    this.rows = [];\n\n    /**\n     * Sub-groups that are part of the group.\n     * @property groups\n     * @type {Array}\n     */\n    this.groups = null;\n\n    /**\n     * A unique key used to identify the group.  This key can be used in calls to DataView\n     * collapseGroup() or expandGroup().\n     * @property groupingKey\n     * @type {Object}\n     */\n    this.groupingKey = null;\n  }\n\n  Group.prototype = new NonDataItem();\n\n  /***\n   * Compares two Group instances.\n   * @method equals\n   * @return {Boolean}\n   * @param group {Group} Group instance to compare to.\n   */\n  Group.prototype.equals = function (group) {\n    return this.value === group.value &&\n        this.count === group.count &&\n        this.collapsed === group.collapsed &&\n        this.title === group.title;\n  };\n\n  /***\n   * Information about group totals.\n   * An instance of GroupTotals will be created for each totals row and passed to the aggregators\n   * so that they can store arbitrary data in it.  That data can later be accessed by group totals\n   * formatters during the display.\n   * @class GroupTotals\n   * @extends Slick.NonDataItem\n   * @constructor\n   */\n  function GroupTotals() {\n    this.__groupTotals = true;\n\n    /***\n     * Parent Group.\n     * @param group\n     * @type {Group}\n     */\n    this.group = null;\n\n    /***\n     * Whether the totals have been fully initialized / calculated.\n     * Will be set to false for lazy-calculated group totals.\n     * @param initialized\n     * @type {Boolean}\n     */\n    this.initialized = false;\n  }\n\n  GroupTotals.prototype = new NonDataItem();\n\n  /***\n   * A locking helper to track the active edit controller and ensure that only a single controller\n   * can be active at a time.  This prevents a whole class of state and validation synchronization\n   * issues.  An edit controller (such as SlickGrid) can query if an active edit is in progress\n   * and attempt a commit or cancel before proceeding.\n   * @class EditorLock\n   * @constructor\n   */\n  function EditorLock() {\n    var activeEditController = null;\n\n    /***\n     * Returns true if a specified edit controller is active (has the edit lock).\n     * If the parameter is not specified, returns true if any edit controller is active.\n     * @method isActive\n     * @param editController {EditController}\n     * @return {Boolean}\n     */\n    this.isActive = function (editController) {\n      return (editController ? activeEditController === editController : activeEditController !== null);\n    };\n\n    /***\n     * Sets the specified edit controller as the active edit controller (acquire edit lock).\n     * If another edit controller is already active, and exception will be thrown.\n     * @method activate\n     * @param editController {EditController} edit controller acquiring the lock\n     */\n    this.activate = function (editController) {\n      if (editController === activeEditController) { // already activated?\n        return;\n      }\n      if (activeEditController !== null) {\n        throw \"SlickGrid.EditorLock.activate: an editController is still active, can't activate another editController\";\n      }\n      if (!editController.commitCurrentEdit) {\n        throw \"SlickGrid.EditorLock.activate: editController must implement .commitCurrentEdit()\";\n      }\n      if (!editController.cancelCurrentEdit) {\n        throw \"SlickGrid.EditorLock.activate: editController must implement .cancelCurrentEdit()\";\n      }\n      activeEditController = editController;\n    };\n\n    /***\n     * Unsets the specified edit controller as the active edit controller (release edit lock).\n     * If the specified edit controller is not the active one, an exception will be thrown.\n     * @method deactivate\n     * @param editController {EditController} edit controller releasing the lock\n     */\n    this.deactivate = function (editController) {\n      if (activeEditController !== editController) {\n        throw \"SlickGrid.EditorLock.deactivate: specified editController is not the currently active one\";\n      }\n      activeEditController = null;\n    };\n\n    /***\n     * Attempts to commit the current edit by calling \"commitCurrentEdit\" method on the active edit\n     * controller and returns whether the commit attempt was successful (commit may fail due to validation\n     * errors, etc.).  Edit controller's \"commitCurrentEdit\" must return true if the commit has succeeded\n     * and false otherwise.  If no edit controller is active, returns true.\n     * @method commitCurrentEdit\n     * @return {Boolean}\n     */\n    this.commitCurrentEdit = function () {\n      return (activeEditController ? activeEditController.commitCurrentEdit() : true);\n    };\n\n    /***\n     * Attempts to cancel the current edit by calling \"cancelCurrentEdit\" method on the active edit\n     * controller and returns whether the edit was successfully cancelled.  If no edit controller is\n     * active, returns true.\n     * @method cancelCurrentEdit\n     * @return {Boolean}\n     */\n    this.cancelCurrentEdit = function cancelCurrentEdit() {\n      return (activeEditController ? activeEditController.cancelCurrentEdit() : true);\n    };\n  }\n})(jQuery);\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/slick.core.js\n// module id = 934\n// module chunks = 0 1","/**\r\n * @license\r\n * (c) 2009-2013 Michael Leibman\r\n * michael{dot}leibman{at}gmail{dot}com\r\n * http://github.com/mleibman/slickgrid\r\n *\r\n * Distributed under MIT license.\r\n * All rights reserved.\r\n *\r\n * SlickGrid v2.2\r\n *\r\n * NOTES:\r\n *     Cell/row DOM manipulations are done directly bypassing jQuery's DOM manipulation methods.\r\n *     This increases the speed dramatically, but can only be done safely because there are no event handlers\r\n *     or data associated with any cell/row DOM nodes.  Cell editors must make sure they implement .destroy()\r\n *     and do proper cleanup.\r\n */\r\n\r\n// make sure required JavaScript modules are loaded\r\nif (typeof jQuery === \"undefined\") {\r\n  throw \"SlickGrid requires jquery module to be loaded\";\r\n}\r\nif (!jQuery.fn.drag) {\r\n  throw \"SlickGrid requires jquery.event.drag module to be loaded\";\r\n}\r\nif (typeof Slick === \"undefined\") {\r\n  throw \"slick.core.js not loaded\";\r\n}\r\n\r\n\r\n(function ($) {\r\n  // Slick.Grid\r\n  $.extend(true, window, {\r\n    Slick: {\r\n      Grid: SlickGrid\r\n    }\r\n  });\r\n\r\n  // shared across all grids on the page\r\n  var scrollbarDimensions;\r\n  var maxSupportedCssHeight;  // browser's breaking point\r\n\r\n  //////////////////////////////////////////////////////////////////////////////////////////////\r\n  // SlickGrid class implementation (available as Slick.Grid)\r\n\r\n  /**\r\n   * Creates a new instance of the grid.\r\n   * @class SlickGrid\r\n   * @constructor\r\n   * @param {Node}              container   Container node to create the grid in.\r\n   * @param {Array,Object}      data        An array of objects for databinding.\r\n   * @param {Array}             columns     An array of column definitions.\r\n   * @param {Object}            options     Grid options.\r\n   **/\r\n  function SlickGrid(container, data, columns, options) {\r\n    // settings\r\n    var defaults = {\r\n      explicitInitialization: false,\r\n      rowHeight: 25,\r\n      defaultColumnWidth: 80,\r\n      enableAddRow: false,\r\n      leaveSpaceForNewRows: false,\r\n      editable: false,\r\n      autoEdit: true,\r\n      enableCellNavigation: true,\r\n      enableColumnReorder: true,\r\n      asyncEditorLoading: false,\r\n      asyncEditorLoadDelay: 100,\r\n      forceFitColumns: false,\r\n      enableAsyncPostRender: false,\r\n      asyncPostRenderDelay: 50,\r\n      autoHeight: false,\r\n      editorLock: Slick.GlobalEditorLock,\r\n      showHeaderRow: false,\r\n      headerRowHeight: 25,\r\n      showTopPanel: false,\r\n      topPanelHeight: 25,\r\n      formatterFactory: null,\r\n      editorFactory: null,\r\n      cellFlashingCssClass: \"flashing\",\r\n      selectedCellCssClass: \"selected\",\r\n      multiSelect: true,\r\n      enableTextSelectionOnCells: false,\r\n      dataItemColumnValueExtractor: null,\r\n      fullWidthRows: false,\r\n      multiColumnSort: false,\r\n      defaultFormatter: defaultFormatter,\r\n      forceSyncScrolling: false,\r\n      addNewRowCssClass: \"new-row\"\r\n    };\r\n\r\n    var columnDefaults = {\r\n      name: \"\",\r\n      resizable: true,\r\n      sortable: false,\r\n      minWidth: 30,\r\n      rerenderOnResize: false,\r\n      headerCssClass: null,\r\n      defaultSortAsc: true,\r\n      focusable: true,\r\n      selectable: true\r\n    };\r\n\r\n    // scroller\r\n    var th;   // virtual height\r\n    var h;    // real scrollable height\r\n    var ph;   // page height\r\n    var n;    // number of pages\r\n    var cj;   // \"jumpiness\" coefficient\r\n\r\n    var page = 0;       // current page\r\n    var offset = 0;     // current page offset\r\n    var vScrollDir = 1;\r\n\r\n    // private\r\n    var initialized = false;\r\n    var $container;\r\n    var uid = \"slickgrid_\" + Math.round(1000000 * Math.random());\r\n    var self = this;\r\n    var $focusSink, $focusSink2;\r\n    var $headerScroller;\r\n    var $headers;\r\n    var $headerRow, $headerRowScroller, $headerRowSpacer;\r\n    var $topPanelScroller;\r\n    var $topPanel;\r\n    var $viewport;\r\n    var $canvas;\r\n    var $style;\r\n    var $boundAncestors;\r\n    var stylesheet, columnCssRulesL, columnCssRulesR;\r\n    var viewportH, viewportW;\r\n    var canvasWidth;\r\n    var viewportHasHScroll, viewportHasVScroll;\r\n    var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding\r\n        cellWidthDiff = 0, cellHeightDiff = 0;\r\n    var absoluteColumnMinWidth;\r\n\r\n    var tabbingDirection = 1;\r\n    var activePosX;\r\n    var activeRow, activeCell;\r\n    var activeCellNode = null;\r\n    var currentEditor = null;\r\n    var serializedEditorValue;\r\n    var editController;\r\n\r\n    var rowsCache = {};\r\n    var renderedRows = 0;\r\n    var numVisibleRows;\r\n    var prevScrollTop = 0;\r\n    var scrollTop = 0;\r\n    var lastRenderedScrollTop = 0;\r\n    var lastRenderedScrollLeft = 0;\r\n    var prevScrollLeft = 0;\r\n    var scrollLeft = 0;\r\n\r\n    var selectionModel;\r\n    var selectedRows = [];\r\n\r\n    var plugins = [];\r\n    var cellCssClasses = {};\r\n\r\n    var columnsById = {};\r\n    var sortColumns = [];\r\n    var columnPosLeft = [];\r\n    var columnPosRight = [];\r\n\r\n\r\n    // async call handles\r\n    var h_editorLoader = null;\r\n    var h_render = null;\r\n    var h_postrender = null;\r\n    var postProcessedRows = {};\r\n    var postProcessToRow = null;\r\n    var postProcessFromRow = null;\r\n\r\n    // perf counters\r\n    var counter_rows_rendered = 0;\r\n    var counter_rows_removed = 0;\r\n\r\n    // These two variables work around a bug with inertial scrolling in Webkit/Blink on Mac.\r\n    // See http://crbug.com/312427.\r\n    var rowNodeFromLastMouseWheelEvent;  // this node must not be deleted while inertial scrolling\r\n    var zombieRowNodeFromLastMouseWheelEvent;  // node that was hidden instead of getting deleted\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Initialization\r\n\r\n    function init() {\r\n      $container = $(container);\r\n      if ($container.length < 1) {\r\n        throw new Error(\"SlickGrid requires a valid container, \" + container + \" does not exist in the DOM.\");\r\n      }\r\n\r\n      // calculate these only once and share between grid instances\r\n      maxSupportedCssHeight = maxSupportedCssHeight || getMaxSupportedCssHeight();\r\n      scrollbarDimensions = scrollbarDimensions || measureScrollbar();\r\n\r\n      options = $.extend({}, defaults, options);\r\n      validateAndEnforceOptions();\r\n      columnDefaults.width = options.defaultColumnWidth;\r\n\r\n      columnsById = {};\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);\r\n        columnsById[m.id] = i;\r\n        if (m.minWidth && m.width < m.minWidth) {\r\n          m.width = m.minWidth;\r\n        }\r\n        if (m.maxWidth && m.width > m.maxWidth) {\r\n          m.width = m.maxWidth;\r\n        }\r\n      }\r\n\r\n      // validate loaded JavaScript modules against requested options\r\n      if (options.enableColumnReorder && !$.fn.sortable) {\r\n        throw new Error(\"SlickGrid's 'enableColumnReorder = true' option requires jquery-ui.sortable module to be loaded\");\r\n      }\r\n\r\n      editController = {\r\n        \"commitCurrentEdit\": commitCurrentEdit,\r\n        \"cancelCurrentEdit\": cancelCurrentEdit\r\n      };\r\n\r\n      $container\r\n          .empty()\r\n          .css(\"overflow\", \"hidden\")\r\n          .css(\"outline\", 0)\r\n          .addClass(uid)\r\n          .addClass(\"ui-widget\");\r\n\r\n      // set up a positioning container if needed\r\n      if (!/relative|absolute|fixed/.test($container.css(\"position\"))) {\r\n        $container.css(\"position\", \"relative\");\r\n      }\r\n\r\n      $focusSink = $(\"<div tabIndex='0' hideFocus style='position:fixed;width:0;height:0;top:0;left:0;outline:0;'></div>\").appendTo($container);\r\n\r\n      $headerScroller = $(\"<div class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $headers = $(\"<div class='slick-header-columns' style='left:-1000px' />\").appendTo($headerScroller);\r\n      $headers.width(getHeadersWidth());\r\n\r\n      $headerRowScroller = $(\"<div class='slick-headerrow ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $headerRow = $(\"<div class='slick-headerrow-columns' />\").appendTo($headerRowScroller);\r\n      $headerRowSpacer = $(\"<div style='display:block;height:1px;position:absolute;top:0;left:0;'></div>\")\r\n          .css(\"width\", getCanvasWidth() + scrollbarDimensions.width + \"px\")\r\n          .appendTo($headerRowScroller);\r\n\r\n      $topPanelScroller = $(\"<div class='slick-top-panel-scroller ui-state-default' style='overflow:hidden;position:relative;' />\").appendTo($container);\r\n      $topPanel = $(\"<div class='slick-top-panel' style='width:10000px' />\").appendTo($topPanelScroller);\r\n\r\n      if (!options.showTopPanel) {\r\n        $topPanelScroller.hide();\r\n      }\r\n\r\n      if (!options.showHeaderRow) {\r\n        $headerRowScroller.hide();\r\n      }\r\n\r\n      $viewport = $(\"<div class='slick-viewport' style='width:100%;overflow:auto;outline:0;position:relative;;'>\").appendTo($container);\r\n      $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n\r\n      $canvas = $(\"<div class='grid-canvas' />\").appendTo($viewport);\r\n\r\n      $focusSink2 = $focusSink.clone().appendTo($container);\r\n\r\n      if (!options.explicitInitialization) {\r\n        finishInitialization();\r\n      }\r\n    }\r\n\r\n    function finishInitialization() {\r\n      if (!initialized) {\r\n        initialized = true;\r\n\r\n        viewportW = parseFloat($.css($container[0], \"width\", true));\r\n\r\n        // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)\r\n        // calculate the diff so we can set consistent sizes\r\n        measureCellPaddingAndBorder();\r\n\r\n        // for usability reasons, all text selection in SlickGrid is disabled\r\n        // with the exception of input and textarea elements (selection must\r\n        // be enabled there so that editors work as expected); note that\r\n        // selection in grid cells (grid body) is already unavailable in\r\n        // all browsers except IE\r\n        disableSelection($headers); // disable all text selection in header (including input and textarea)\r\n\r\n        if (!options.enableTextSelectionOnCells) {\r\n          // disable text selection in grid cells except in input and textarea elements\r\n          // (this is IE-specific, because selectstart event will only fire in IE)\r\n          $viewport.bind(\"selectstart.ui\", function (event) {\r\n            return $(event.target).is(\"input,textarea\");\r\n          });\r\n        }\r\n\r\n        updateColumnCaches();\r\n        createColumnHeaders();\r\n        setupColumnSort();\r\n        createCssRules();\r\n        resizeCanvas();\r\n        bindAncestorScrollEvents();\r\n\r\n        $container\r\n            .bind(\"resize.slickgrid\", resizeCanvas);\r\n        $viewport\r\n            //.bind(\"click\", handleClick)\r\n            .bind(\"scroll\", handleScroll);\r\n        $headerScroller\r\n            .bind(\"contextmenu\", handleHeaderContextMenu)\r\n            .bind(\"click\", handleHeaderClick)\r\n            .delegate(\".slick-header-column\", \"mouseenter\", handleHeaderMouseEnter)\r\n            .delegate(\".slick-header-column\", \"mouseleave\", handleHeaderMouseLeave);\r\n        $headerRowScroller\r\n            .bind(\"scroll\", handleHeaderRowScroll);\r\n        $focusSink.add($focusSink2)\r\n            .bind(\"keydown\", handleKeyDown);\r\n        $canvas\r\n            .bind(\"keydown\", handleKeyDown)\r\n            .bind(\"click\", handleClick)\r\n            .bind(\"dblclick\", handleDblClick)\r\n            .bind(\"contextmenu\", handleContextMenu)\r\n            .bind(\"draginit\", handleDragInit)\r\n            .bind(\"dragstart\", {distance: 3}, handleDragStart)\r\n            .bind(\"drag\", handleDrag)\r\n            .bind(\"dragend\", handleDragEnd)\r\n            .delegate(\".slick-cell\", \"mouseenter\", handleMouseEnter)\r\n            .delegate(\".slick-cell\", \"mouseleave\", handleMouseLeave);\r\n\r\n        // Work around http://crbug.com/312427.\r\n        if (navigator.userAgent.toLowerCase().match(/webkit/) &&\r\n            navigator.userAgent.toLowerCase().match(/macintosh/)) {\r\n          $canvas.bind(\"mousewheel\", handleMouseWheel);\r\n        }\r\n      }\r\n    }\r\n\r\n    function registerPlugin(plugin) {\r\n      plugins.unshift(plugin);\r\n      plugin.init(self);\r\n    }\r\n\r\n    function unregisterPlugin(plugin) {\r\n      for (var i = plugins.length; i >= 0; i--) {\r\n        if (plugins[i] === plugin) {\r\n          if (plugins[i].destroy) {\r\n            plugins[i].destroy();\r\n          }\r\n          plugins.splice(i, 1);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    function setSelectionModel(model) {\r\n      if (selectionModel) {\r\n        selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);\r\n        if (selectionModel.destroy) {\r\n          selectionModel.destroy();\r\n        }\r\n      }\r\n\r\n      selectionModel = model;\r\n      if (selectionModel) {\r\n        selectionModel.init(self);\r\n        selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);\r\n      }\r\n    }\r\n\r\n    function getSelectionModel() {\r\n      return selectionModel;\r\n    }\r\n\r\n    function getCanvasNode() {\r\n      return $canvas[0];\r\n    }\r\n\r\n    function measureScrollbar() {\r\n      var $c = $(\"<div style='position:absolute; top:-10000px; left:-10000px; width:100px; height:100px; overflow:scroll;'></div>\").appendTo(\"body\");\r\n      var dim = {\r\n        width: $c.width() - $c[0].clientWidth,\r\n        height: $c.height() - $c[0].clientHeight\r\n      };\r\n      $c.remove();\r\n      return dim;\r\n    }\r\n\r\n    function getHeadersWidth() {\r\n      var headersWidth = 0;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        var width = columns[i].width;\r\n        headersWidth += width;\r\n      }\r\n      headersWidth += scrollbarDimensions.width;\r\n      return Math.max(headersWidth, viewportW) + 1000;\r\n    }\r\n\r\n    function getCanvasWidth() {\r\n      var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n      var rowWidth = 0;\r\n      var i = columns.length;\r\n      while (i--) {\r\n        rowWidth += columns[i].width;\r\n      }\r\n      return options.fullWidthRows ? Math.max(rowWidth, availableWidth) : rowWidth;\r\n    }\r\n\r\n    function updateCanvasWidth(forceColumnWidthsUpdate) {\r\n      var oldCanvasWidth = canvasWidth;\r\n      canvasWidth = getCanvasWidth();\r\n\r\n      if (canvasWidth != oldCanvasWidth) {\r\n        $canvas.width(canvasWidth);\r\n        $headerRow.width(canvasWidth);\r\n        $headers.width(getHeadersWidth());\r\n        viewportHasHScroll = (canvasWidth > viewportW - scrollbarDimensions.width);\r\n      }\r\n\r\n      $headerRowSpacer.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));\r\n\r\n      if (canvasWidth != oldCanvasWidth || forceColumnWidthsUpdate) {\r\n        applyColumnWidths();\r\n      }\r\n    }\r\n\r\n    function disableSelection($target) {\r\n      if ($target && $target.jquery) {\r\n        $target\r\n            .attr(\"unselectable\", \"on\")\r\n            .css(\"MozUserSelect\", \"none\")\r\n            .bind(\"selectstart.ui\", function () {\r\n              return false;\r\n            }); // from jquery:ui.core.js 1.7.2\r\n      }\r\n    }\r\n\r\n    function getMaxSupportedCssHeight() {\r\n      var supportedHeight = 1000000;\r\n      // FF reports the height back but still renders blank after ~6M px\r\n      var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\r\n      var div = $(\"<div style='display:none' />\").appendTo(document.body);\r\n\r\n      while (true) {\r\n        var test = supportedHeight * 2;\r\n        div.css(\"height\", test);\r\n        if (test > testUpTo || div.height() !== test) {\r\n          break;\r\n        } else {\r\n          supportedHeight = test;\r\n        }\r\n      }\r\n\r\n      div.remove();\r\n      return supportedHeight;\r\n    }\r\n\r\n    // TODO:  this is static.  need to handle page mutation.\r\n    function bindAncestorScrollEvents() {\r\n      var elem = $canvas[0];\r\n      while ((elem = elem.parentNode) != document.body && elem != null) {\r\n        // bind to scroll containers only\r\n        if (elem == $viewport[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {\r\n          var $elem = $(elem);\r\n          if (!$boundAncestors) {\r\n            $boundAncestors = $elem;\r\n          } else {\r\n            $boundAncestors = $boundAncestors.add($elem);\r\n          }\r\n          $elem.bind(\"scroll.\" + uid, handleActiveCellPositionChange);\r\n        }\r\n      }\r\n    }\r\n\r\n    function unbindAncestorScrollEvents() {\r\n      if (!$boundAncestors) {\r\n        return;\r\n      }\r\n      $boundAncestors.unbind(\"scroll.\" + uid);\r\n      $boundAncestors = null;\r\n    }\r\n\r\n    function updateColumnHeader(columnId, title, toolTip) {\r\n      if (!initialized) { return; }\r\n      var idx = getColumnIndex(columnId);\r\n      if (idx == null) {\r\n        return;\r\n      }\r\n\r\n      var columnDef = columns[idx];\r\n      var $header = $headers.children().eq(idx);\r\n      if ($header) {\r\n        if (title !== undefined) {\r\n          columns[idx].name = title;\r\n        }\r\n        if (toolTip !== undefined) {\r\n          columns[idx].toolTip = toolTip;\r\n        }\r\n\r\n        trigger(self.onBeforeHeaderCellDestroy, {\r\n          \"node\": $header[0],\r\n          \"column\": columnDef\r\n        });\r\n\r\n        $header\r\n            .attr(\"title\", toolTip || \"\")\r\n            .children().eq(0).html(title);\r\n\r\n        trigger(self.onHeaderCellRendered, {\r\n          \"node\": $header[0],\r\n          \"column\": columnDef\r\n        });\r\n      }\r\n    }\r\n\r\n    function getHeaderRow() {\r\n      return $headerRow[0];\r\n    }\r\n\r\n    function getHeaderRowColumn(columnId) {\r\n      var idx = getColumnIndex(columnId);\r\n      var $header = $headerRow.children().eq(idx);\r\n      return $header && $header[0];\r\n    }\r\n\r\n    function createColumnHeaders() {\r\n      function onMouseEnter() {\r\n        $(this).addClass(\"ui-state-hover\");\r\n      }\r\n\r\n      function onMouseLeave() {\r\n        $(this).removeClass(\"ui-state-hover\");\r\n      }\r\n\r\n      $headers.find(\".slick-header-column\")\r\n        .each(function() {\r\n          var columnDef = $(this).data(\"column\");\r\n          if (columnDef) {\r\n            trigger(self.onBeforeHeaderCellDestroy, {\r\n              \"node\": this,\r\n              \"column\": columnDef\r\n            });\r\n          }\r\n        });\r\n      $headers.empty();\r\n      $headers.width(getHeadersWidth());\r\n\r\n      $headerRow.find(\".slick-headerrow-column\")\r\n        .each(function() {\r\n          var columnDef = $(this).data(\"column\");\r\n          if (columnDef) {\r\n            trigger(self.onBeforeHeaderRowCellDestroy, {\r\n              \"node\": this,\r\n              \"column\": columnDef\r\n            });\r\n          }\r\n        });\r\n      $headerRow.empty();\r\n\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i];\r\n\r\n        var header = $(\"<div class='ui-state-default slick-header-column' />\")\r\n            .html(\"<span class='slick-column-name'>\" + m.name + \"</span>\")\r\n            .width(m.width - headerColumnWidthDiff)\r\n            .attr(\"id\", \"\" + uid + m.id)\r\n            .attr(\"title\", m.toolTip || \"\")\r\n            .data(\"column\", m)\r\n            .addClass(m.headerCssClass || \"\")\r\n            .appendTo($headers);\r\n\r\n        if (options.enableColumnReorder || m.sortable) {\r\n          header\r\n            .on('mouseenter', onMouseEnter)\r\n            .on('mouseleave', onMouseLeave);\r\n        }\r\n\r\n        if (m.sortable) {\r\n          header.addClass(\"slick-header-sortable\");\r\n          header.append(\"<span class='slick-sort-indicator' />\");\r\n        }\r\n\r\n        trigger(self.onHeaderCellRendered, {\r\n          \"node\": header[0],\r\n          \"column\": m\r\n        });\r\n\r\n        if (options.showHeaderRow) {\r\n          var headerRowCell = $(\"<div class='ui-state-default slick-headerrow-column l\" + i + \" r\" + i + \"'></div>\")\r\n              .data(\"column\", m)\r\n              .appendTo($headerRow);\r\n\r\n          trigger(self.onHeaderRowCellRendered, {\r\n            \"node\": headerRowCell[0],\r\n            \"column\": m\r\n          });\r\n        }\r\n      }\r\n\r\n      setSortColumns(sortColumns);\r\n      setupColumnResize();\r\n      if (options.enableColumnReorder) {\r\n        setupColumnReorder();\r\n      }\r\n    }\r\n\r\n    function setupColumnSort() {\r\n      $headers.click(function (e) {\r\n        // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)\r\n        e.metaKey = e.metaKey || e.ctrlKey;\r\n\r\n        if ($(e.target).hasClass(\"slick-resizable-handle\")) {\r\n          return;\r\n        }\r\n\r\n        var $col = $(e.target).closest(\".slick-header-column\");\r\n        if (!$col.length) {\r\n          return;\r\n        }\r\n\r\n        var column = $col.data(\"column\");\r\n        if (column.sortable) {\r\n          if (!getEditorLock().commitCurrentEdit()) {\r\n            return;\r\n          }\r\n\r\n          var sortOpts = null;\r\n          var i = 0;\r\n          for (; i < sortColumns.length; i++) {\r\n            if (sortColumns[i].columnId == column.id) {\r\n              sortOpts = sortColumns[i];\r\n              sortOpts.sortAsc = !sortOpts.sortAsc;\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (e.metaKey && options.multiColumnSort) {\r\n            if (sortOpts) {\r\n              sortColumns.splice(i, 1);\r\n            }\r\n          }\r\n          else {\r\n            if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {\r\n              sortColumns = [];\r\n            }\r\n\r\n            if (!sortOpts) {\r\n              sortOpts = { columnId: column.id, sortAsc: column.defaultSortAsc };\r\n              sortColumns.push(sortOpts);\r\n            } else if (sortColumns.length == 0) {\r\n              sortColumns.push(sortOpts);\r\n            }\r\n          }\r\n\r\n          setSortColumns(sortColumns);\r\n\r\n          if (!options.multiColumnSort) {\r\n            trigger(self.onSort, {\r\n              multiColumnSort: false,\r\n              sortCol: column,\r\n              sortAsc: sortOpts.sortAsc}, e);\r\n          } else {\r\n            trigger(self.onSort, {\r\n              multiColumnSort: true,\r\n              sortCols: $.map(sortColumns, function(col) {\r\n                return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };\r\n              })}, e);\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    function setupColumnReorder() {\r\n      $headers.filter(\":ui-sortable\").sortable(\"destroy\");\r\n      $headers.sortable({\r\n        containment: \"parent\",\r\n        distance: 3,\r\n        axis: \"x\",\r\n        cursor: \"default\",\r\n        tolerance: \"intersection\",\r\n        helper: \"clone\",\r\n        placeholder: \"slick-sortable-placeholder ui-state-default slick-header-column\",\r\n        start: function (e, ui) {\r\n          ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);\r\n          $(ui.helper).addClass(\"slick-header-column-active\");\r\n        },\r\n        beforeStop: function (e, ui) {\r\n          $(ui.helper).removeClass(\"slick-header-column-active\");\r\n        },\r\n        stop: function (e) {\r\n          if (!getEditorLock().commitCurrentEdit()) {\r\n            $(this).sortable(\"cancel\");\r\n            return;\r\n          }\r\n\r\n          var reorderedIds = $headers.sortable(\"toArray\");\r\n          var reorderedColumns = [];\r\n          for (var i = 0; i < reorderedIds.length; i++) {\r\n            reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, \"\"))]);\r\n          }\r\n          setColumns(reorderedColumns);\r\n\r\n          trigger(self.onColumnsReordered, {});\r\n          e.stopPropagation();\r\n          setupColumnResize();\r\n        }\r\n      });\r\n    }\r\n\r\n    function setupColumnResize() {\r\n      var $col, j, c, pageX, columnElements, minPageX, maxPageX, firstResizable, lastResizable;\r\n      columnElements = $headers.children();\r\n      columnElements.find(\".slick-resizable-handle\").remove();\r\n      columnElements.each(function (i, e) {\r\n        if (columns[i].resizable) {\r\n          if (firstResizable === undefined) {\r\n            firstResizable = i;\r\n          }\r\n          lastResizable = i;\r\n        }\r\n      });\r\n      if (firstResizable === undefined) {\r\n        return;\r\n      }\r\n      columnElements.each(function (i, e) {\r\n        if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {\r\n          return;\r\n        }\r\n        $col = $(e);\r\n        $(\"<div class='slick-resizable-handle' />\")\r\n            .appendTo(e)\r\n            .bind(\"dragstart\", function (e, dd) {\r\n              if (!getEditorLock().commitCurrentEdit()) {\r\n                return false;\r\n              }\r\n              pageX = e.pageX;\r\n              $(this).parent().addClass(\"slick-header-column-active\");\r\n              var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;\r\n              // lock each column's width option to current width\r\n              columnElements.each(function (i, e) {\r\n                columns[i].previousWidth = $(e).outerWidth();\r\n              });\r\n              if (options.forceFitColumns) {\r\n                shrinkLeewayOnRight = 0;\r\n                stretchLeewayOnRight = 0;\r\n                // colums on right affect maxPageX/minPageX\r\n                for (j = i + 1; j < columnElements.length; j++) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    if (stretchLeewayOnRight !== null) {\r\n                      if (c.maxWidth) {\r\n                        stretchLeewayOnRight += c.maxWidth - c.previousWidth;\r\n                      } else {\r\n                        stretchLeewayOnRight = null;\r\n                      }\r\n                    }\r\n                    shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                  }\r\n                }\r\n              }\r\n              var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;\r\n              for (j = 0; j <= i; j++) {\r\n                // columns on left only affect minPageX\r\n                c = columns[j];\r\n                if (c.resizable) {\r\n                  if (stretchLeewayOnLeft !== null) {\r\n                    if (c.maxWidth) {\r\n                      stretchLeewayOnLeft += c.maxWidth - c.previousWidth;\r\n                    } else {\r\n                      stretchLeewayOnLeft = null;\r\n                    }\r\n                  }\r\n                  shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                }\r\n              }\r\n              if (shrinkLeewayOnRight === null) {\r\n                shrinkLeewayOnRight = 100000;\r\n              }\r\n              if (shrinkLeewayOnLeft === null) {\r\n                shrinkLeewayOnLeft = 100000;\r\n              }\r\n              if (stretchLeewayOnRight === null) {\r\n                stretchLeewayOnRight = 100000;\r\n              }\r\n              if (stretchLeewayOnLeft === null) {\r\n                stretchLeewayOnLeft = 100000;\r\n              }\r\n              maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);\r\n              minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);\r\n            })\r\n            .bind(\"drag\", function (e, dd) {\r\n              var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;\r\n              if (d < 0) { // shrink column\r\n                x = d;\r\n                for (j = i; j >= 0; j--) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                    if (x && c.previousWidth + x < actualMinWidth) {\r\n                      x += c.previousWidth - actualMinWidth;\r\n                      c.width = actualMinWidth;\r\n                    } else {\r\n                      c.width = c.previousWidth + x;\r\n                      x = 0;\r\n                    }\r\n                  }\r\n                }\r\n\r\n                if (options.forceFitColumns) {\r\n                  x = -d;\r\n                  for (j = i + 1; j < columnElements.length; j++) {\r\n                    c = columns[j];\r\n                    if (c.resizable) {\r\n                      if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n                        x -= c.maxWidth - c.previousWidth;\r\n                        c.width = c.maxWidth;\r\n                      } else {\r\n                        c.width = c.previousWidth + x;\r\n                        x = 0;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              } else { // stretch column\r\n                x = d;\r\n                for (j = i; j >= 0; j--) {\r\n                  c = columns[j];\r\n                  if (c.resizable) {\r\n                    if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {\r\n                      x -= c.maxWidth - c.previousWidth;\r\n                      c.width = c.maxWidth;\r\n                    } else {\r\n                      c.width = c.previousWidth + x;\r\n                      x = 0;\r\n                    }\r\n                  }\r\n                }\r\n\r\n                if (options.forceFitColumns) {\r\n                  x = -d;\r\n                  for (j = i + 1; j < columnElements.length; j++) {\r\n                    c = columns[j];\r\n                    if (c.resizable) {\r\n                      actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);\r\n                      if (x && c.previousWidth + x < actualMinWidth) {\r\n                        x += c.previousWidth - actualMinWidth;\r\n                        c.width = actualMinWidth;\r\n                      } else {\r\n                        c.width = c.previousWidth + x;\r\n                        x = 0;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              applyColumnHeaderWidths();\r\n              if (options.syncColumnCellResize) {\r\n                applyColumnWidths();\r\n              }\r\n            })\r\n            .bind(\"dragend\", function (e, dd) {\r\n              var newWidth;\r\n              $(this).parent().removeClass(\"slick-header-column-active\");\r\n              for (j = 0; j < columnElements.length; j++) {\r\n                c = columns[j];\r\n                newWidth = $(columnElements[j]).outerWidth();\r\n\r\n                if (c.previousWidth !== newWidth && c.rerenderOnResize) {\r\n                  invalidateAllRows();\r\n                }\r\n              }\r\n              updateCanvasWidth(true);\r\n              render();\r\n              trigger(self.onColumnsResized, {});\r\n            });\r\n      });\r\n    }\r\n\r\n    function getVBoxDelta($el) {\r\n      var p = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n      var delta = 0;\r\n      $.each(p, function (n, val) {\r\n        delta += parseFloat($el.css(val)) || 0;\r\n      });\r\n      return delta;\r\n    }\r\n\r\n    function measureCellPaddingAndBorder() {\r\n      var el;\r\n      var h = [\"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\"];\r\n      var v = [\"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\"];\r\n\r\n      el = $(\"<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>\").appendTo($headers);\r\n      headerColumnWidthDiff = headerColumnHeightDiff = 0;\r\n      if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n        $.each(h, function (n, val) {\r\n          headerColumnWidthDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n        $.each(v, function (n, val) {\r\n          headerColumnHeightDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n      }\r\n      el.remove();\r\n\r\n      var r = $(\"<div class='slick-row' />\").appendTo($canvas);\r\n      el = $(\"<div class='slick-cell' id='' style='visibility:hidden'>-</div>\").appendTo(r);\r\n      cellWidthDiff = cellHeightDiff = 0;\r\n      if (el.css(\"box-sizing\") != \"border-box\" && el.css(\"-moz-box-sizing\") != \"border-box\" && el.css(\"-webkit-box-sizing\") != \"border-box\") {\r\n        $.each(h, function (n, val) {\r\n          cellWidthDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n        $.each(v, function (n, val) {\r\n          cellHeightDiff += parseFloat(el.css(val)) || 0;\r\n        });\r\n      }\r\n      r.remove();\r\n\r\n      absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);\r\n    }\r\n\r\n    function createCssRules() {\r\n      $style = $(\"<style type='text/css' rel='stylesheet' />\").appendTo($(\"head\"));\r\n      var rowHeight = (options.rowHeight - cellHeightDiff);\r\n      var rules = [\r\n        \".\" + uid + \" .slick-header-column { left: 1000px; }\",\r\n        \".\" + uid + \" .slick-top-panel { height:\" + options.topPanelHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-headerrow-columns { height:\" + options.headerRowHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-cell { height:\" + rowHeight + \"px; }\",\r\n        \".\" + uid + \" .slick-row { height:\" + options.rowHeight + \"px; }\"\r\n      ];\r\n\r\n      for (var i = 0; i < columns.length; i++) {\r\n        rules.push(\".\" + uid + \" .l\" + i + \" { }\");\r\n        rules.push(\".\" + uid + \" .r\" + i + \" { }\");\r\n      }\r\n\r\n      if ($style[0].styleSheet) { // IE\r\n        $style[0].styleSheet.cssText = rules.join(\" \");\r\n      } else {\r\n        $style[0].appendChild(document.createTextNode(rules.join(\" \")));\r\n      }\r\n    }\r\n\r\n    function getColumnCssRules(idx) {\r\n      if (!stylesheet) {\r\n        var sheets = document.styleSheets;\r\n        for (var i = 0; i < sheets.length; i++) {\r\n          if ((sheets[i].ownerNode || sheets[i].owningElement) == $style[0]) {\r\n            stylesheet = sheets[i];\r\n            break;\r\n          }\r\n        }\r\n\r\n        // Workaround a bug in chrome where document.styleSheets may not contain all sheets.\r\n        if (!stylesheet) {\r\n          stylesheet = $style[0] && ($style[0].sheet || $style[0].styleSheet);\r\n        }\r\n\r\n        if (!stylesheet) {\r\n          throw new Error(\"Cannot find stylesheet.\");\r\n        }\r\n\r\n        // find and cache column CSS rules\r\n        columnCssRulesL = [];\r\n        columnCssRulesR = [];\r\n        var cssRules = (stylesheet.cssRules || stylesheet.rules);\r\n        var matches, columnIdx;\r\n        for (var i = 0; i < cssRules.length; i++) {\r\n          var selector = cssRules[i].selectorText;\r\n          if (matches = /\\.l\\d+/.exec(selector)) {\r\n            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n            columnCssRulesL[columnIdx] = cssRules[i];\r\n          } else if (matches = /\\.r\\d+/.exec(selector)) {\r\n            columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);\r\n            columnCssRulesR[columnIdx] = cssRules[i];\r\n          }\r\n        }\r\n      }\r\n\r\n      return {\r\n        \"left\": columnCssRulesL[idx],\r\n        \"right\": columnCssRulesR[idx]\r\n      };\r\n    }\r\n\r\n    function removeCssRules() {\r\n      $style.remove();\r\n      stylesheet = null;\r\n    }\r\n\r\n    function destroy() {\r\n      getEditorLock().cancelCurrentEdit();\r\n\r\n      trigger(self.onBeforeDestroy, {});\r\n\r\n      var i = plugins.length;\r\n      while(i--) {\r\n        unregisterPlugin(plugins[i]);\r\n      }\r\n\r\n      if (options.enableColumnReorder) {\r\n          $headers.filter(\":ui-sortable\").sortable(\"destroy\");\r\n      }\r\n\r\n      unbindAncestorScrollEvents();\r\n      $container.unbind(\".slickgrid\");\r\n      removeCssRules();\r\n\r\n      $canvas.unbind(\"draginit dragstart dragend drag\");\r\n      $container.empty().removeClass(uid);\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // General\r\n\r\n    function trigger(evt, args, e) {\r\n      e = e || new Slick.EventData();\r\n      args = args || {};\r\n      args.grid = self;\r\n      return evt.notify(args, e, self);\r\n    }\r\n\r\n    function getEditorLock() {\r\n      return options.editorLock;\r\n    }\r\n\r\n    function getEditController() {\r\n      return editController;\r\n    }\r\n\r\n    function getColumnIndex(id) {\r\n      return columnsById[id];\r\n    }\r\n\r\n    function autosizeColumns() {\r\n      var i, c,\r\n          widths = [],\r\n          shrinkLeeway = 0,\r\n          total = 0,\r\n          prevTotal,\r\n          availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;\r\n\r\n      for (i = 0; i < columns.length; i++) {\r\n        c = columns[i];\r\n        widths.push(c.width);\r\n        total += c.width;\r\n        if (c.resizable) {\r\n          shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);\r\n        }\r\n      }\r\n\r\n      // shrink\r\n      prevTotal = total;\r\n      while (total > availWidth && shrinkLeeway) {\r\n        var shrinkProportion = (total - availWidth) / shrinkLeeway;\r\n        for (i = 0; i < columns.length && total > availWidth; i++) {\r\n          c = columns[i];\r\n          var width = widths[i];\r\n          if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {\r\n            continue;\r\n          }\r\n          var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);\r\n          var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;\r\n          shrinkSize = Math.min(shrinkSize, width - absMinWidth);\r\n          total -= shrinkSize;\r\n          shrinkLeeway -= shrinkSize;\r\n          widths[i] -= shrinkSize;\r\n        }\r\n        if (prevTotal <= total) {  // avoid infinite loop\r\n          break;\r\n        }\r\n        prevTotal = total;\r\n      }\r\n\r\n      // grow\r\n      prevTotal = total;\r\n      while (total < availWidth) {\r\n        var growProportion = availWidth / total;\r\n        for (i = 0; i < columns.length && total < availWidth; i++) {\r\n          c = columns[i];\r\n          var currentWidth = widths[i];\r\n          var growSize;\r\n\r\n          if (!c.resizable || c.maxWidth <= currentWidth) {\r\n            growSize = 0;\r\n          } else {\r\n            growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;\r\n          }\r\n          total += growSize;\r\n          widths[i] += growSize;\r\n        }\r\n        if (prevTotal >= total) {  // avoid infinite loop\r\n          break;\r\n        }\r\n        prevTotal = total;\r\n      }\r\n\r\n      var reRender = false;\r\n      for (i = 0; i < columns.length; i++) {\r\n        if (columns[i]) {\r\n          if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {\r\n            reRender = true;\r\n          }\r\n          columns[i].width = widths[i];\r\n        }\r\n      }\r\n\r\n      applyColumnHeaderWidths();\r\n      updateCanvasWidth(true);\r\n      if (reRender) {\r\n        invalidateAllRows();\r\n        render();\r\n      }\r\n    }\r\n\r\n    function applyColumnHeaderWidths() {\r\n      if (!initialized) { return; }\r\n      var h;\r\n      for (var i = 0, headers = $headers.children(), ii = headers.length; i < ii; i++) {\r\n        h = $(headers[i]);\r\n        if (h && columns[i] && h.width() !== columns[i].width - headerColumnWidthDiff) {\r\n          h.width(columns[i].width - headerColumnWidthDiff);\r\n        }\r\n      }\r\n\r\n      updateColumnCaches();\r\n    }\r\n\r\n    function applyColumnWidths() {\r\n      var x = 0, w, rule;\r\n      for (var i = 0; i < columns.length; i++) {\r\n        w = columns[i].width;\r\n\r\n        rule = getColumnCssRules(i);\r\n        rule.left.style.left = x + \"px\";\r\n        rule.right.style.right = (canvasWidth - x - w) + \"px\";\r\n\r\n        x += columns[i].width;\r\n      }\r\n    }\r\n\r\n    function setSortColumn(columnId, ascending) {\r\n      setSortColumns([{ columnId: columnId, sortAsc: ascending}]);\r\n    }\r\n\r\n    function setSortColumns(cols) {\r\n      sortColumns = cols;\r\n\r\n      var headerColumnEls = $headers.children();\r\n      headerColumnEls\r\n          .removeClass(\"slick-header-column-sorted\")\r\n          .find(\".slick-sort-indicator\")\r\n              .removeClass(\"slick-sort-indicator-asc slick-sort-indicator-desc\");\r\n\r\n      $.each(sortColumns, function(i, col) {\r\n        if (col.sortAsc == null) {\r\n          col.sortAsc = true;\r\n        }\r\n        var columnIndex = getColumnIndex(col.columnId);\r\n        if (columnIndex != null) {\r\n          headerColumnEls.eq(columnIndex)\r\n              .addClass(\"slick-header-column-sorted\")\r\n              .find(\".slick-sort-indicator\")\r\n                  .addClass(col.sortAsc ? \"slick-sort-indicator-asc\" : \"slick-sort-indicator-desc\");\r\n        }\r\n      });\r\n    }\r\n\r\n    function getSortColumns() {\r\n      return sortColumns;\r\n    }\r\n\r\n    function handleSelectedRangesChanged(e, ranges) {\r\n      selectedRows = [];\r\n      var hash = {};\r\n      for (var i = 0; i < ranges.length; i++) {\r\n        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\r\n          if (!hash[j]) {  // prevent duplicates\r\n            selectedRows.push(j);\r\n            hash[j] = {};\r\n          }\r\n          for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {\r\n            if (canCellBeSelected(j, k)) {\r\n              hash[j][columns[k].id] = options.selectedCellCssClass;\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      setCellCssStyles(options.selectedCellCssClass, hash);\r\n\r\n      trigger(self.onSelectedRowsChanged, {rows: getSelectedRows()}, e);\r\n    }\r\n\r\n    function getColumns() {\r\n      return columns;\r\n    }\r\n\r\n    function updateColumnCaches() {\r\n      // Pre-calculate cell boundaries.\r\n      columnPosLeft = [];\r\n      columnPosRight = [];\r\n      var x = 0;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        columnPosLeft[i] = x;\r\n        columnPosRight[i] = x + columns[i].width;\r\n        x += columns[i].width;\r\n      }\r\n    }\r\n\r\n    function setColumns(columnDefinitions) {\r\n      columns = columnDefinitions;\r\n\r\n      columnsById = {};\r\n      for (var i = 0; i < columns.length; i++) {\r\n        var m = columns[i] = $.extend({}, columnDefaults, columns[i]);\r\n        columnsById[m.id] = i;\r\n        if (m.minWidth && m.width < m.minWidth) {\r\n          m.width = m.minWidth;\r\n        }\r\n        if (m.maxWidth && m.width > m.maxWidth) {\r\n          m.width = m.maxWidth;\r\n        }\r\n      }\r\n\r\n      updateColumnCaches();\r\n\r\n      if (initialized) {\r\n        invalidateAllRows();\r\n        createColumnHeaders();\r\n        removeCssRules();\r\n        createCssRules();\r\n        resizeCanvas();\r\n        applyColumnWidths();\r\n        handleScroll();\r\n      }\r\n    }\r\n\r\n    function getOptions() {\r\n      return options;\r\n    }\r\n\r\n    function setOptions(args) {\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return;\r\n      }\r\n\r\n      makeActiveCellNormal();\r\n\r\n      if (options.enableAddRow !== args.enableAddRow) {\r\n        invalidateRow(getDataLength());\r\n      }\r\n\r\n      options = $.extend(options, args);\r\n      validateAndEnforceOptions();\r\n\r\n      $viewport.css(\"overflow-y\", options.autoHeight ? \"hidden\" : \"auto\");\r\n      render();\r\n    }\r\n\r\n    function validateAndEnforceOptions() {\r\n      if (options.autoHeight) {\r\n        options.leaveSpaceForNewRows = false;\r\n      }\r\n    }\r\n\r\n    function setData(newData, scrollToTop) {\r\n      data = newData;\r\n      invalidateAllRows();\r\n      updateRowCount();\r\n      if (scrollToTop) {\r\n        scrollTo(0);\r\n      }\r\n    }\r\n\r\n    function getData() {\r\n      return data;\r\n    }\r\n\r\n    function getDataLength() {\r\n      if (data.getLength) {\r\n        return data.getLength();\r\n      } else {\r\n        return data.length;\r\n      }\r\n    }\r\n\r\n    function getDataLengthIncludingAddNew() {\r\n      return getDataLength() + (options.enableAddRow ? 1 : 0);\r\n    }\r\n\r\n    function getDataItem(i) {\r\n      if (data.getItem) {\r\n        return data.getItem(i);\r\n      } else {\r\n        return data[i];\r\n      }\r\n    }\r\n\r\n    function getTopPanel() {\r\n      return $topPanel[0];\r\n    }\r\n\r\n    function setTopPanelVisibility(visible) {\r\n      if (options.showTopPanel != visible) {\r\n        options.showTopPanel = visible;\r\n        if (visible) {\r\n          $topPanelScroller.slideDown(\"fast\", resizeCanvas);\r\n        } else {\r\n          $topPanelScroller.slideUp(\"fast\", resizeCanvas);\r\n        }\r\n      }\r\n    }\r\n\r\n    function setHeaderRowVisibility(visible) {\r\n      if (options.showHeaderRow != visible) {\r\n        options.showHeaderRow = visible;\r\n        if (visible) {\r\n          $headerRowScroller.slideDown(\"fast\", resizeCanvas);\r\n        } else {\r\n          $headerRowScroller.slideUp(\"fast\", resizeCanvas);\r\n        }\r\n      }\r\n    }\r\n\r\n    function getContainerNode() {\r\n      return $container.get(0);\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Rendering / Scrolling\r\n\r\n    function getRowTop(row) {\r\n      return options.rowHeight * row - offset;\r\n    }\r\n\r\n    function getRowFromPosition(y) {\r\n      return Math.floor((y + offset) / options.rowHeight);\r\n    }\r\n\r\n    function scrollTo(y) {\r\n      y = Math.max(y, 0);\r\n      y = Math.min(y, th - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0));\r\n\r\n      var oldOffset = offset;\r\n\r\n      page = Math.min(n - 1, Math.floor(y / ph));\r\n      offset = Math.round(page * cj);\r\n      var newScrollTop = y - offset;\r\n\r\n      if (offset != oldOffset) {\r\n        var range = getVisibleRange(newScrollTop);\r\n        cleanupRows(range);\r\n        updateRowPositions();\r\n      }\r\n\r\n      if (prevScrollTop != newScrollTop) {\r\n        vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;\r\n        $viewport[0].scrollTop = (lastRenderedScrollTop = scrollTop = prevScrollTop = newScrollTop);\r\n\r\n        trigger(self.onViewportChanged, {});\r\n      }\r\n    }\r\n\r\n    function defaultFormatter(row, cell, value, columnDef, dataContext) {\r\n      if (value == null) {\r\n        return \"\";\r\n      } else {\r\n        return (value + \"\").replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\");\r\n      }\r\n    }\r\n\r\n    function getFormatter(row, column) {\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n      // look up by id, then index\r\n      var columnOverrides = rowMetadata &&\r\n          rowMetadata.columns &&\r\n          (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);\r\n\r\n      return (columnOverrides && columnOverrides.formatter) ||\r\n          (rowMetadata && rowMetadata.formatter) ||\r\n          column.formatter ||\r\n          (options.formatterFactory && options.formatterFactory.getFormatter(column)) ||\r\n          options.defaultFormatter;\r\n    }\r\n\r\n    function getEditor(row, cell) {\r\n      var column = columns[cell];\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      var columnMetadata = rowMetadata && rowMetadata.columns;\r\n\r\n      if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {\r\n        return columnMetadata[column.id].editor;\r\n      }\r\n      if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {\r\n        return columnMetadata[cell].editor;\r\n      }\r\n\r\n      return column.editor || (options.editorFactory && options.editorFactory.getEditor(column));\r\n    }\r\n\r\n    function getDataItemValueForColumn(item, columnDef) {\r\n      if (options.dataItemColumnValueExtractor) {\r\n        return options.dataItemColumnValueExtractor(item, columnDef);\r\n      }\r\n      return item[columnDef.field];\r\n    }\r\n\r\n    function appendRowHtml(stringArray, row, range, dataLength) {\r\n      var d = getDataItem(row);\r\n      var dataLoading = row < dataLength && !d;\r\n      var rowCss = \"slick-row\" +\r\n          (dataLoading ? \" loading\" : \"\") +\r\n          (row === activeRow ? \" active\" : \"\") +\r\n          (row % 2 == 1 ? \" odd\" : \" even\");\r\n\r\n      if (!d) {\r\n        rowCss += \" \" + options.addNewRowCssClass;\r\n      }\r\n\r\n      var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n\r\n      if (metadata && metadata.cssClasses) {\r\n        rowCss += \" \" + metadata.cssClasses;\r\n      }\r\n\r\n      stringArray.push(\"<div class='ui-widget-content \" + rowCss + \"' style='top:\" + getRowTop(row) + \"px'>\");\r\n\r\n      var colspan, m;\r\n      for (var i = 0, ii = columns.length; i < ii; i++) {\r\n        m = columns[i];\r\n        colspan = 1;\r\n        if (metadata && metadata.columns) {\r\n          var columnData = metadata.columns[m.id] || metadata.columns[i];\r\n          colspan = (columnData && columnData.colspan) || 1;\r\n          if (colspan === \"*\") {\r\n            colspan = ii - i;\r\n          }\r\n        }\r\n\r\n        // Do not render cells outside of the viewport.\r\n        if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n          if (columnPosLeft[i] > range.rightPx) {\r\n            // All columns to the right are outside the range.\r\n            break;\r\n          }\r\n\r\n          appendCellHtml(stringArray, row, i, colspan, d);\r\n        }\r\n\r\n        if (colspan > 1) {\r\n          i += (colspan - 1);\r\n        }\r\n      }\r\n\r\n      stringArray.push(\"</div>\");\r\n    }\r\n\r\n    function appendCellHtml(stringArray, row, cell, colspan, item) {\r\n      var m = columns[cell];\r\n      var cellCss = \"slick-cell l\" + cell + \" r\" + Math.min(columns.length - 1, cell + colspan - 1) +\r\n          (m.cssClass ? \" \" + m.cssClass : \"\");\r\n      if (row === activeRow && cell === activeCell) {\r\n        cellCss += (\" active\");\r\n      }\r\n\r\n      // TODO:  merge them together in the setter\r\n      for (var key in cellCssClasses) {\r\n        if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {\r\n          cellCss += (\" \" + cellCssClasses[key][row][m.id]);\r\n        }\r\n      }\r\n\r\n      stringArray.push(\"<div class='\" + cellCss + \"'>\");\r\n\r\n      // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)\r\n      if (item) {\r\n        var value = getDataItemValueForColumn(item, m);\r\n        stringArray.push(getFormatter(row, m)(row, cell, value, m, item));\r\n      }\r\n\r\n      stringArray.push(\"</div>\");\r\n\r\n      rowsCache[row].cellRenderQueue.push(cell);\r\n      rowsCache[row].cellColSpans[cell] = colspan;\r\n    }\r\n\r\n\r\n    function cleanupRows(rangeToKeep) {\r\n      for (var i in rowsCache) {\r\n        if (((i = parseInt(i, 10)) !== activeRow) && (i < rangeToKeep.top || i > rangeToKeep.bottom)) {\r\n          removeRowFromCache(i);\r\n        }\r\n      }\r\n    }\r\n\r\n    function invalidate() {\r\n      updateRowCount();\r\n      invalidateAllRows();\r\n      render();\r\n    }\r\n\r\n    function invalidateAllRows() {\r\n      if (currentEditor) {\r\n        makeActiveCellNormal();\r\n      }\r\n      for (var row in rowsCache) {\r\n        removeRowFromCache(row);\r\n      }\r\n    }\r\n\r\n    function removeRowFromCache(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (!cacheEntry) {\r\n        return;\r\n      }\r\n\r\n      if (rowNodeFromLastMouseWheelEvent == cacheEntry.rowNode) {\r\n        cacheEntry.rowNode.style.display = 'none';\r\n        zombieRowNodeFromLastMouseWheelEvent = rowNodeFromLastMouseWheelEvent;\r\n      } else {\r\n        $canvas[0].removeChild(cacheEntry.rowNode);\r\n      }\r\n\r\n      delete rowsCache[row];\r\n      delete postProcessedRows[row];\r\n      renderedRows--;\r\n      counter_rows_removed++;\r\n    }\r\n\r\n    function invalidateRows(rows) {\r\n      var i, rl;\r\n      if (!rows || !rows.length) {\r\n        return;\r\n      }\r\n      vScrollDir = 0;\r\n      for (i = 0, rl = rows.length; i < rl; i++) {\r\n        if (currentEditor && activeRow === rows[i]) {\r\n          makeActiveCellNormal();\r\n        }\r\n        if (rowsCache[rows[i]]) {\r\n          removeRowFromCache(rows[i]);\r\n        }\r\n      }\r\n    }\r\n\r\n    function invalidateRow(row) {\r\n      invalidateRows([row]);\r\n    }\r\n\r\n    function updateCell(row, cell) {\r\n      var cellNode = getCellNode(row, cell);\r\n      if (!cellNode) {\r\n        return;\r\n      }\r\n\r\n      var m = columns[cell], d = getDataItem(row);\r\n      if (currentEditor && activeRow === row && activeCell === cell) {\r\n        currentEditor.loadValue(d);\r\n      } else {\r\n        cellNode.innerHTML = d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d) : \"\";\r\n        invalidatePostProcessingResults(row);\r\n      }\r\n    }\r\n\r\n    function updateRow(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (!cacheEntry) {\r\n        return;\r\n      }\r\n\r\n      ensureCellNodesInRowsCache(row);\r\n\r\n      var d = getDataItem(row);\r\n\r\n      for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {\r\n        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {\r\n          continue;\r\n        }\r\n\r\n        columnIdx = columnIdx | 0;\r\n        var m = columns[columnIdx],\r\n            node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n\r\n        if (row === activeRow && columnIdx === activeCell && currentEditor) {\r\n          currentEditor.loadValue(d);\r\n        } else if (d) {\r\n          node.innerHTML = getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d);\r\n        } else {\r\n          node.innerHTML = \"\";\r\n        }\r\n      }\r\n\r\n      invalidatePostProcessingResults(row);\r\n    }\r\n\r\n    function getViewportHeight() {\r\n      return parseFloat($.css($container[0], \"height\", true)) -\r\n          parseFloat($.css($container[0], \"paddingTop\", true)) -\r\n          parseFloat($.css($container[0], \"paddingBottom\", true)) -\r\n          parseFloat($.css($headerScroller[0], \"height\")) - getVBoxDelta($headerScroller) -\r\n          (options.showTopPanel ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0) -\r\n          (options.showHeaderRow ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0);\r\n    }\r\n\r\n    function resizeCanvas() {\r\n      if (!initialized) { return; }\r\n      if (options.autoHeight) {\r\n        viewportH = options.rowHeight * getDataLengthIncludingAddNew();\r\n      } else {\r\n        viewportH = getViewportHeight();\r\n      }\r\n\r\n      numVisibleRows = Math.ceil(viewportH / options.rowHeight);\r\n      viewportW = parseFloat($.css($container[0], \"width\", true));\r\n      if (!options.autoHeight) {\r\n        $viewport.height(viewportH);\r\n      }\r\n\r\n      if (options.forceFitColumns) {\r\n        autosizeColumns();\r\n      }\r\n\r\n      updateRowCount();\r\n      handleScroll();\r\n      // Since the width has changed, force the render() to reevaluate virtually rendered cells.\r\n      lastRenderedScrollLeft = -1;\r\n      render();\r\n    }\r\n\r\n    function updateRowCount() {\r\n      if (!initialized) { return; }\r\n\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      var numberOfRows = dataLengthIncludingAddNew +\r\n          (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);\r\n\r\n      var oldViewportHasVScroll = viewportHasVScroll;\r\n      // with autoHeight, we do not need to accommodate the vertical scroll bar\r\n      viewportHasVScroll = !options.autoHeight && (numberOfRows * options.rowHeight > viewportH);\r\n\r\n      makeActiveCellNormal();\r\n\r\n      // remove the rows that are now outside of the data range\r\n      // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows\r\n      var l = dataLengthIncludingAddNew - 1;\r\n      for (var i in rowsCache) {\r\n        if (i >= l) {\r\n          removeRowFromCache(i);\r\n        }\r\n      }\r\n\r\n      if (activeCellNode && activeRow > l) {\r\n        resetActiveCell();\r\n      }\r\n\r\n      var oldH = h;\r\n      th = Math.max(options.rowHeight * numberOfRows, viewportH - scrollbarDimensions.height);\r\n      if (th < maxSupportedCssHeight) {\r\n        // just one page\r\n        h = ph = th;\r\n        n = 1;\r\n        cj = 0;\r\n      } else {\r\n        // break into pages\r\n        h = maxSupportedCssHeight;\r\n        ph = h / 100;\r\n        n = Math.floor(th / ph);\r\n        cj = (th - h) / (n - 1);\r\n      }\r\n\r\n      if (h !== oldH) {\r\n        $canvas.css(\"height\", h);\r\n        scrollTop = $viewport[0].scrollTop;\r\n      }\r\n\r\n      var oldScrollTopInRange = (scrollTop + offset <= th - viewportH);\r\n\r\n      if (th == 0 || scrollTop == 0) {\r\n        page = offset = 0;\r\n      } else if (oldScrollTopInRange) {\r\n        // maintain virtual position\r\n        scrollTo(scrollTop + offset);\r\n      } else {\r\n        // scroll to bottom\r\n        scrollTo(th - viewportH);\r\n      }\r\n\r\n      if (h != oldH && options.autoHeight) {\r\n        resizeCanvas();\r\n      }\r\n\r\n      if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {\r\n        autosizeColumns();\r\n      }\r\n      updateCanvasWidth(false);\r\n    }\r\n\r\n    function getVisibleRange(viewportTop, viewportLeft) {\r\n      if (viewportTop == null) {\r\n        viewportTop = scrollTop;\r\n      }\r\n      if (viewportLeft == null) {\r\n        viewportLeft = scrollLeft;\r\n      }\r\n\r\n      return {\r\n        top: getRowFromPosition(viewportTop),\r\n        bottom: getRowFromPosition(viewportTop + viewportH) + 1,\r\n        leftPx: viewportLeft,\r\n        rightPx: viewportLeft + viewportW\r\n      };\r\n    }\r\n\r\n    function getRenderedRange(viewportTop, viewportLeft) {\r\n      var range = getVisibleRange(viewportTop, viewportLeft);\r\n      var buffer = Math.round(viewportH / options.rowHeight);\r\n      var minBuffer = 3;\r\n\r\n      if (vScrollDir == -1) {\r\n        range.top -= buffer;\r\n        range.bottom += minBuffer;\r\n      } else if (vScrollDir == 1) {\r\n        range.top -= minBuffer;\r\n        range.bottom += buffer;\r\n      } else {\r\n        range.top -= minBuffer;\r\n        range.bottom += minBuffer;\r\n      }\r\n\r\n      range.top = Math.max(0, range.top);\r\n      range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);\r\n\r\n      range.leftPx -= viewportW;\r\n      range.rightPx += viewportW;\r\n\r\n      range.leftPx = Math.max(0, range.leftPx);\r\n      range.rightPx = Math.min(canvasWidth, range.rightPx);\r\n\r\n      return range;\r\n    }\r\n\r\n    function ensureCellNodesInRowsCache(row) {\r\n      var cacheEntry = rowsCache[row];\r\n      if (cacheEntry) {\r\n        if (cacheEntry.cellRenderQueue.length) {\r\n          var lastChild = cacheEntry.rowNode.lastChild;\r\n          while (cacheEntry.cellRenderQueue.length) {\r\n            var columnIdx = cacheEntry.cellRenderQueue.pop();\r\n            cacheEntry.cellNodesByColumnIdx[columnIdx] = lastChild;\r\n            lastChild = lastChild.previousSibling;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function cleanUpCells(range, row) {\r\n      var totalCellsRemoved = 0;\r\n      var cacheEntry = rowsCache[row];\r\n\r\n      // Remove cells outside the range.\r\n      var cellsToRemove = [];\r\n      for (var i in cacheEntry.cellNodesByColumnIdx) {\r\n        // I really hate it when people mess with Array.prototype.\r\n        if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(i)) {\r\n          continue;\r\n        }\r\n\r\n        // This is a string, so it needs to be cast back to a number.\r\n        i = i | 0;\r\n\r\n        var colspan = cacheEntry.cellColSpans[i];\r\n        if (columnPosLeft[i] > range.rightPx ||\r\n          columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {\r\n          if (!(row == activeRow && i == activeCell)) {\r\n            cellsToRemove.push(i);\r\n          }\r\n        }\r\n      }\r\n\r\n      var cellToRemove;\r\n      while ((cellToRemove = cellsToRemove.pop()) != null) {\r\n        cacheEntry.rowNode.removeChild(cacheEntry.cellNodesByColumnIdx[cellToRemove]);\r\n        delete cacheEntry.cellColSpans[cellToRemove];\r\n        delete cacheEntry.cellNodesByColumnIdx[cellToRemove];\r\n        if (postProcessedRows[row]) {\r\n          delete postProcessedRows[row][cellToRemove];\r\n        }\r\n        totalCellsRemoved++;\r\n      }\r\n    }\r\n\r\n    function cleanUpAndRenderCells(range) {\r\n      var cacheEntry;\r\n      var stringArray = [];\r\n      var processedRows = [];\r\n      var cellsAdded;\r\n      var totalCellsAdded = 0;\r\n      var colspan;\r\n\r\n      for (var row = range.top, btm = range.bottom; row <= btm; row++) {\r\n        cacheEntry = rowsCache[row];\r\n        if (!cacheEntry) {\r\n          continue;\r\n        }\r\n\r\n        // cellRenderQueue populated in renderRows() needs to be cleared first\r\n        ensureCellNodesInRowsCache(row);\r\n\r\n        cleanUpCells(range, row);\r\n\r\n        // Render missing cells.\r\n        cellsAdded = 0;\r\n\r\n        var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n        metadata = metadata && metadata.columns;\r\n\r\n        var d = getDataItem(row);\r\n\r\n        // TODO:  shorten this loop (index? heuristics? binary search?)\r\n        for (var i = 0, ii = columns.length; i < ii; i++) {\r\n          // Cells to the right are outside the range.\r\n          if (columnPosLeft[i] > range.rightPx) {\r\n            break;\r\n          }\r\n\r\n          // Already rendered.\r\n          if ((colspan = cacheEntry.cellColSpans[i]) != null) {\r\n            i += (colspan > 1 ? colspan - 1 : 0);\r\n            continue;\r\n          }\r\n\r\n          colspan = 1;\r\n          if (metadata) {\r\n            var columnData = metadata[columns[i].id] || metadata[i];\r\n            colspan = (columnData && columnData.colspan) || 1;\r\n            if (colspan === \"*\") {\r\n              colspan = ii - i;\r\n            }\r\n          }\r\n\r\n          if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {\r\n            appendCellHtml(stringArray, row, i, colspan, d);\r\n            cellsAdded++;\r\n          }\r\n\r\n          i += (colspan > 1 ? colspan - 1 : 0);\r\n        }\r\n\r\n        if (cellsAdded) {\r\n          totalCellsAdded += cellsAdded;\r\n          processedRows.push(row);\r\n        }\r\n      }\r\n\r\n      if (!stringArray.length) {\r\n        return;\r\n      }\r\n\r\n      var x = document.createElement(\"div\");\r\n      x.innerHTML = stringArray.join(\"\");\r\n\r\n      var processedRow;\r\n      var node;\r\n      while ((processedRow = processedRows.pop()) != null) {\r\n        cacheEntry = rowsCache[processedRow];\r\n        var columnIdx;\r\n        while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {\r\n          node = x.lastChild;\r\n          cacheEntry.rowNode.appendChild(node);\r\n          cacheEntry.cellNodesByColumnIdx[columnIdx] = node;\r\n        }\r\n      }\r\n    }\r\n\r\n    function renderRows(range) {\r\n      var parentNode = $canvas[0],\r\n          stringArray = [],\r\n          rows = [],\r\n          needToReselectCell = false,\r\n          dataLength = getDataLength();\r\n\r\n      for (var i = range.top, ii = range.bottom; i <= ii; i++) {\r\n        if (rowsCache[i]) {\r\n          continue;\r\n        }\r\n        renderedRows++;\r\n        rows.push(i);\r\n\r\n        // Create an entry right away so that appendRowHtml() can\r\n        // start populatating it.\r\n        rowsCache[i] = {\r\n          \"rowNode\": null,\r\n\r\n          // ColSpans of rendered cells (by column idx).\r\n          // Can also be used for checking whether a cell has been rendered.\r\n          \"cellColSpans\": [],\r\n\r\n          // Cell nodes (by column idx).  Lazy-populated by ensureCellNodesInRowsCache().\r\n          \"cellNodesByColumnIdx\": [],\r\n\r\n          // Column indices of cell nodes that have been rendered, but not yet indexed in\r\n          // cellNodesByColumnIdx.  These are in the same order as cell nodes added at the\r\n          // end of the row.\r\n          \"cellRenderQueue\": []\r\n        };\r\n\r\n        appendRowHtml(stringArray, i, range, dataLength);\r\n        if (activeCellNode && activeRow === i) {\r\n          needToReselectCell = true;\r\n        }\r\n        counter_rows_rendered++;\r\n      }\r\n\r\n      if (!rows.length) { return; }\r\n\r\n      var x = document.createElement(\"div\");\r\n      x.innerHTML = stringArray.join(\"\");\r\n\r\n      for (var i = 0, ii = rows.length; i < ii; i++) {\r\n        rowsCache[rows[i]].rowNode = parentNode.appendChild(x.firstChild);\r\n      }\r\n\r\n      if (needToReselectCell) {\r\n        activeCellNode = getCellNode(activeRow, activeCell);\r\n      }\r\n    }\r\n\r\n    function startPostProcessing() {\r\n      if (!options.enableAsyncPostRender) {\r\n        return;\r\n      }\r\n      clearTimeout(h_postrender);\r\n      h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n    }\r\n\r\n    function invalidatePostProcessingResults(row) {\r\n      delete postProcessedRows[row];\r\n      postProcessFromRow = Math.min(postProcessFromRow, row);\r\n      postProcessToRow = Math.max(postProcessToRow, row);\r\n      startPostProcessing();\r\n    }\r\n\r\n    function updateRowPositions() {\r\n      for (var row in rowsCache) {\r\n        rowsCache[row].rowNode.style.top = getRowTop(row) + \"px\";\r\n      }\r\n    }\r\n\r\n    function render() {\r\n      if (!initialized) { return; }\r\n      var visible = getVisibleRange();\r\n      var rendered = getRenderedRange();\r\n\r\n      // remove rows no longer in the viewport\r\n      cleanupRows(rendered);\r\n\r\n      // add new rows & missing cells in existing rows\r\n      if (lastRenderedScrollLeft != scrollLeft) {\r\n        cleanUpAndRenderCells(rendered);\r\n      }\r\n\r\n      // render missing rows\r\n      renderRows(rendered);\r\n\r\n      postProcessFromRow = visible.top;\r\n      postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);\r\n      startPostProcessing();\r\n\r\n      lastRenderedScrollTop = scrollTop;\r\n      lastRenderedScrollLeft = scrollLeft;\r\n      h_render = null;\r\n    }\r\n\r\n    function handleHeaderRowScroll() {\r\n      var scrollLeft = $headerRowScroller[0].scrollLeft;\r\n      if (scrollLeft != $viewport[0].scrollLeft) {\r\n        $viewport[0].scrollLeft = scrollLeft;\r\n      }\r\n    }\r\n\r\n    function handleScroll() {\r\n      scrollTop = $viewport[0].scrollTop;\r\n      scrollLeft = $viewport[0].scrollLeft;\r\n      var vScrollDist = Math.abs(scrollTop - prevScrollTop);\r\n      var hScrollDist = Math.abs(scrollLeft - prevScrollLeft);\r\n\r\n      if (hScrollDist) {\r\n        prevScrollLeft = scrollLeft;\r\n        $headerScroller[0].scrollLeft = scrollLeft;\r\n        $topPanelScroller[0].scrollLeft = scrollLeft;\r\n        $headerRowScroller[0].scrollLeft = scrollLeft;\r\n      }\r\n\r\n      if (vScrollDist) {\r\n        vScrollDir = prevScrollTop < scrollTop ? 1 : -1;\r\n        prevScrollTop = scrollTop;\r\n\r\n        // switch virtual pages if needed\r\n        if (vScrollDist < viewportH) {\r\n          scrollTo(scrollTop + offset);\r\n        } else {\r\n          var oldOffset = offset;\r\n          if (h == viewportH) {\r\n            page = 0;\r\n          } else {\r\n            page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));\r\n          }\r\n          offset = Math.round(page * cj);\r\n          if (oldOffset != offset) {\r\n            invalidateAllRows();\r\n          }\r\n        }\r\n      }\r\n\r\n      if (hScrollDist || vScrollDist) {\r\n        if (h_render) {\r\n          clearTimeout(h_render);\r\n        }\r\n\r\n        if (Math.abs(lastRenderedScrollTop - scrollTop) > 20 ||\r\n            Math.abs(lastRenderedScrollLeft - scrollLeft) > 20) {\r\n          if (options.forceSyncScrolling || (\r\n              Math.abs(lastRenderedScrollTop - scrollTop) < viewportH &&\r\n              Math.abs(lastRenderedScrollLeft - scrollLeft) < viewportW)) {\r\n            render();\r\n          } else {\r\n            h_render = setTimeout(render, 50);\r\n          }\r\n\r\n          trigger(self.onViewportChanged, {});\r\n        }\r\n      }\r\n\r\n      trigger(self.onScroll, {scrollLeft: scrollLeft, scrollTop: scrollTop});\r\n    }\r\n\r\n    function asyncPostProcessRows() {\r\n      var dataLength = getDataLength();\r\n      while (postProcessFromRow <= postProcessToRow) {\r\n        var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;\r\n        var cacheEntry = rowsCache[row];\r\n        if (!cacheEntry || row >= dataLength) {\r\n          continue;\r\n        }\r\n\r\n        if (!postProcessedRows[row]) {\r\n          postProcessedRows[row] = {};\r\n        }\r\n\r\n        ensureCellNodesInRowsCache(row);\r\n        for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {\r\n          if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {\r\n            continue;\r\n          }\r\n\r\n          columnIdx = columnIdx | 0;\r\n\r\n          var m = columns[columnIdx];\r\n          if (m.asyncPostRender && !postProcessedRows[row][columnIdx]) {\r\n            var node = cacheEntry.cellNodesByColumnIdx[columnIdx];\r\n            if (node) {\r\n              m.asyncPostRender(node, row, getDataItem(row), m);\r\n            }\r\n            postProcessedRows[row][columnIdx] = true;\r\n          }\r\n        }\r\n\r\n        h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);\r\n        return;\r\n      }\r\n    }\r\n\r\n    function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {\r\n      var node, columnId, addedRowHash, removedRowHash;\r\n      for (var row in rowsCache) {\r\n        removedRowHash = removedHash && removedHash[row];\r\n        addedRowHash = addedHash && addedHash[row];\r\n\r\n        if (removedRowHash) {\r\n          for (columnId in removedRowHash) {\r\n            if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n              node = getCellNode(row, getColumnIndex(columnId));\r\n              if (node) {\r\n                $(node).removeClass(removedRowHash[columnId]);\r\n              }\r\n            }\r\n          }\r\n        }\r\n\r\n        if (addedRowHash) {\r\n          for (columnId in addedRowHash) {\r\n            if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {\r\n              node = getCellNode(row, getColumnIndex(columnId));\r\n              if (node) {\r\n                $(node).addClass(addedRowHash[columnId]);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function addCellCssStyles(key, hash) {\r\n      if (cellCssClasses[key]) {\r\n        throw \"addCellCssStyles: cell CSS hash with key '\" + key + \"' already exists.\";\r\n      }\r\n\r\n      cellCssClasses[key] = hash;\r\n      updateCellCssStylesOnRenderedRows(hash, null);\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash });\r\n    }\r\n\r\n    function removeCellCssStyles(key) {\r\n      if (!cellCssClasses[key]) {\r\n        return;\r\n      }\r\n\r\n      updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);\r\n      delete cellCssClasses[key];\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": null });\r\n    }\r\n\r\n    function setCellCssStyles(key, hash) {\r\n      var prevHash = cellCssClasses[key];\r\n\r\n      cellCssClasses[key] = hash;\r\n      updateCellCssStylesOnRenderedRows(hash, prevHash);\r\n\r\n      trigger(self.onCellCssStylesChanged, { \"key\": key, \"hash\": hash });\r\n    }\r\n\r\n    function getCellCssStyles(key) {\r\n      return cellCssClasses[key];\r\n    }\r\n\r\n    function flashCell(row, cell, speed) {\r\n      speed = speed || 100;\r\n      if (rowsCache[row]) {\r\n        var $cell = $(getCellNode(row, cell));\r\n\r\n        function toggleCellClass(times) {\r\n          if (!times) {\r\n            return;\r\n          }\r\n          setTimeout(function () {\r\n                $cell.queue(function () {\r\n                  $cell.toggleClass(options.cellFlashingCssClass).dequeue();\r\n                  toggleCellClass(times - 1);\r\n                });\r\n              },\r\n              speed);\r\n        }\r\n\r\n        toggleCellClass(4);\r\n      }\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Interactivity\r\n\r\n    function handleMouseWheel(e) {\r\n      var rowNode = $(e.target).closest(\".slick-row\")[0];\r\n      if (rowNode != rowNodeFromLastMouseWheelEvent) {\r\n        if (zombieRowNodeFromLastMouseWheelEvent && zombieRowNodeFromLastMouseWheelEvent != rowNode) {\r\n          $canvas[0].removeChild(zombieRowNodeFromLastMouseWheelEvent);\r\n          zombieRowNodeFromLastMouseWheelEvent = null;\r\n        }\r\n        rowNodeFromLastMouseWheelEvent = rowNode;\r\n      }\r\n    }\r\n\r\n    function handleDragInit(e, dd) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || !cellExists(cell.row, cell.cell)) {\r\n        return false;\r\n      }\r\n\r\n      var retval = trigger(self.onDragInit, dd, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return retval;\r\n      }\r\n\r\n      // if nobody claims to be handling drag'n'drop by stopping immediate propagation,\r\n      // cancel out of it\r\n      return false;\r\n    }\r\n\r\n    function handleDragStart(e, dd) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || !cellExists(cell.row, cell.cell)) {\r\n        return false;\r\n      }\r\n\r\n      var retval = trigger(self.onDragStart, dd, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return retval;\r\n      }\r\n\r\n      return false;\r\n    }\r\n\r\n    function handleDrag(e, dd) {\r\n      return trigger(self.onDrag, dd, e);\r\n    }\r\n\r\n    function handleDragEnd(e, dd) {\r\n      trigger(self.onDragEnd, dd, e);\r\n    }\r\n\r\n    function handleKeyDown(e) {\r\n      trigger(self.onKeyDown, {row: activeRow, cell: activeCell}, e);\r\n      var handled = e.isImmediatePropagationStopped();\r\n\r\n      if (!handled) {\r\n        if (!e.shiftKey && !e.altKey && !e.ctrlKey) {\r\n          if (e.which == 27) {\r\n            if (!getEditorLock().isActive()) {\r\n              return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)\r\n            }\r\n            cancelEditAndSetFocus();\r\n          } else if (e.which == 34) {\r\n            navigatePageDown();\r\n            handled = true;\r\n          } else if (e.which == 33) {\r\n            navigatePageUp();\r\n            handled = true;\r\n          } else if (e.which == 37) {\r\n            handled = navigateLeft();\r\n          } else if (e.which == 39) {\r\n            handled = navigateRight();\r\n          } else if (e.which == 38) {\r\n            handled = navigateUp();\r\n          } else if (e.which == 40) {\r\n            handled = navigateDown();\r\n          } else if (e.which == 9) {\r\n            handled = navigateNext();\r\n          } else if (e.which == 13) {\r\n            if (options.editable) {\r\n              if (currentEditor) {\r\n                // adding new row\r\n                if (activeRow === getDataLength()) {\r\n                  navigateDown();\r\n                } else {\r\n                  commitEditAndSetFocus();\r\n                }\r\n              } else {\r\n                if (getEditorLock().commitCurrentEdit()) {\r\n                  makeActiveCellEditable();\r\n                }\r\n              }\r\n            }\r\n            handled = true;\r\n          }\r\n        } else if (e.which == 9 && e.shiftKey && !e.ctrlKey && !e.altKey) {\r\n          handled = navigatePrev();\r\n        }\r\n      }\r\n\r\n      if (handled) {\r\n        // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it\r\n        e.stopPropagation();\r\n        e.preventDefault();\r\n        try {\r\n          e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)\r\n        }\r\n        // ignore exceptions - setting the original event's keycode throws access denied exception for \"Ctrl\"\r\n        // (hitting control key only, nothing else), \"Shift\" (maybe others)\r\n        catch (error) {\r\n        }\r\n      }\r\n    }\r\n\r\n    function handleClick(e) {\r\n      if (!currentEditor) {\r\n        // if this click resulted in some cell child node getting focus,\r\n        // don't steal it back - keyboard events will still bubble up\r\n        // IE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.\r\n        if (e.target != document.activeElement || $(e.target).hasClass(\"slick-cell\")) {\r\n          setFocus();\r\n        }\r\n      }\r\n\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onClick, {row: cell.row, cell: cell.cell}, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return;\r\n      }\r\n\r\n      if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {\r\n        if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {\r\n          scrollRowIntoView(cell.row, false);\r\n          setActiveCellInternal(getCellNode(cell.row, cell.cell));\r\n        }\r\n      }\r\n    }\r\n\r\n    function handleContextMenu(e) {\r\n      var $cell = $(e.target).closest(\".slick-cell\", $canvas);\r\n      if ($cell.length === 0) {\r\n        return;\r\n      }\r\n\r\n      // are we editing this cell?\r\n      if (activeCellNode === $cell[0] && currentEditor !== null) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onContextMenu, {}, e);\r\n    }\r\n\r\n    function handleDblClick(e) {\r\n      var cell = getCellFromEvent(e);\r\n      if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onDblClick, {row: cell.row, cell: cell.cell}, e);\r\n      if (e.isImmediatePropagationStopped()) {\r\n        return;\r\n      }\r\n\r\n      if (options.editable) {\r\n        gotoCell(cell.row, cell.cell, true);\r\n      }\r\n    }\r\n\r\n    function handleHeaderMouseEnter(e) {\r\n      trigger(self.onHeaderMouseEnter, {\r\n        \"column\": $(this).data(\"column\")\r\n      }, e);\r\n    }\r\n\r\n    function handleHeaderMouseLeave(e) {\r\n      trigger(self.onHeaderMouseLeave, {\r\n        \"column\": $(this).data(\"column\")\r\n      }, e);\r\n    }\r\n\r\n    function handleHeaderContextMenu(e) {\r\n      var $header = $(e.target).closest(\".slick-header-column\", \".slick-header-columns\");\r\n      var column = $header && $header.data(\"column\");\r\n      trigger(self.onHeaderContextMenu, {column: column}, e);\r\n    }\r\n\r\n    function handleHeaderClick(e) {\r\n      var $header = $(e.target).closest(\".slick-header-column\", \".slick-header-columns\");\r\n      var column = $header && $header.data(\"column\");\r\n      if (column) {\r\n        trigger(self.onHeaderClick, {column: column}, e);\r\n      }\r\n    }\r\n\r\n    function handleMouseEnter(e) {\r\n      trigger(self.onMouseEnter, {}, e);\r\n    }\r\n\r\n    function handleMouseLeave(e) {\r\n      trigger(self.onMouseLeave, {}, e);\r\n    }\r\n\r\n    function cellExists(row, cell) {\r\n      return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);\r\n    }\r\n\r\n    function getCellFromPoint(x, y) {\r\n      var row = getRowFromPosition(y);\r\n      var cell = 0;\r\n\r\n      var w = 0;\r\n      for (var i = 0; i < columns.length && w < x; i++) {\r\n        w += columns[i].width;\r\n        cell++;\r\n      }\r\n\r\n      if (cell < 0) {\r\n        cell = 0;\r\n      }\r\n\r\n      return {row: row, cell: cell - 1};\r\n    }\r\n\r\n    function getCellFromNode(cellNode) {\r\n      // read column number from .l<columnNumber> CSS class\r\n      var cls = /l\\d+/.exec(cellNode.className);\r\n      if (!cls) {\r\n        throw \"getCellFromNode: cannot get cell - \" + cellNode.className;\r\n      }\r\n      return parseInt(cls[0].substr(1, cls[0].length - 1), 10);\r\n    }\r\n\r\n    function getRowFromNode(rowNode) {\r\n      for (var row in rowsCache) {\r\n        if (rowsCache[row].rowNode === rowNode) {\r\n          return row | 0;\r\n        }\r\n      }\r\n\r\n      return null;\r\n    }\r\n\r\n    function getCellFromEvent(e) {\r\n      var $cell = $(e.target).closest(\".slick-cell\", $canvas);\r\n      if (!$cell.length) {\r\n        return null;\r\n      }\r\n\r\n      var row = getRowFromNode($cell[0].parentNode);\r\n      var cell = getCellFromNode($cell[0]);\r\n\r\n      if (row == null || cell == null) {\r\n        return null;\r\n      } else {\r\n        return {\r\n          \"row\": row,\r\n          \"cell\": cell\r\n        };\r\n      }\r\n    }\r\n\r\n    function getCellNodeBox(row, cell) {\r\n      if (!cellExists(row, cell)) {\r\n        return null;\r\n      }\r\n\r\n      var y1 = getRowTop(row);\r\n      var y2 = y1 + options.rowHeight - 1;\r\n      var x1 = 0;\r\n      for (var i = 0; i < cell; i++) {\r\n        x1 += columns[i].width;\r\n      }\r\n      var x2 = x1 + columns[cell].width;\r\n\r\n      return {\r\n        top: y1,\r\n        left: x1,\r\n        bottom: y2,\r\n        right: x2\r\n      };\r\n    }\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Cell switching\r\n\r\n    function resetActiveCell() {\r\n      setActiveCellInternal(null, false);\r\n    }\r\n\r\n    function setFocus() {\r\n      if (tabbingDirection == -1) {\r\n        $focusSink[0].focus();\r\n      } else {\r\n        $focusSink2[0].focus();\r\n      }\r\n    }\r\n\r\n    function scrollCellIntoView(row, cell, doPaging) {\r\n      scrollRowIntoView(row, doPaging);\r\n\r\n      var colspan = getColspan(row, cell);\r\n      var left = columnPosLeft[cell],\r\n        right = columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)],\r\n        scrollRight = scrollLeft + viewportW;\r\n\r\n      if (left < scrollLeft) {\r\n        $viewport.scrollLeft(left);\r\n        handleScroll();\r\n        render();\r\n      } else if (right > scrollRight) {\r\n        $viewport.scrollLeft(Math.min(left, right - $viewport[0].clientWidth));\r\n        handleScroll();\r\n        render();\r\n      }\r\n    }\r\n\r\n    function setActiveCellInternal(newCell, opt_editMode) {\r\n      if (activeCellNode !== null) {\r\n        makeActiveCellNormal();\r\n        $(activeCellNode).removeClass(\"active\");\r\n        if (rowsCache[activeRow]) {\r\n          $(rowsCache[activeRow].rowNode).removeClass(\"active\");\r\n        }\r\n      }\r\n\r\n      var activeCellChanged = (activeCellNode !== newCell);\r\n      activeCellNode = newCell;\r\n\r\n      if (activeCellNode != null) {\r\n        activeRow = getRowFromNode(activeCellNode.parentNode);\r\n        activeCell = activePosX = getCellFromNode(activeCellNode);\r\n\r\n        if (opt_editMode == null) {\r\n          opt_editMode = (activeRow == getDataLength()) || options.autoEdit;\r\n        }\r\n\r\n        $(activeCellNode).addClass(\"active\");\r\n        $(rowsCache[activeRow].rowNode).addClass(\"active\");\r\n\r\n        if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {\r\n          clearTimeout(h_editorLoader);\r\n\r\n          if (options.asyncEditorLoading) {\r\n            h_editorLoader = setTimeout(function () {\r\n              makeActiveCellEditable();\r\n            }, options.asyncEditorLoadDelay);\r\n          } else {\r\n            makeActiveCellEditable();\r\n          }\r\n        }\r\n      } else {\r\n        activeRow = activeCell = null;\r\n      }\r\n\r\n      if (activeCellChanged) {\r\n        trigger(self.onActiveCellChanged, getActiveCell());\r\n      }\r\n    }\r\n\r\n    function clearTextSelection() {\r\n      if (document.selection && document.selection.empty) {\r\n        try {\r\n          //IE fails here if selected element is not in dom\r\n          document.selection.empty();\r\n        } catch (e) { }\r\n      } else if (window.getSelection) {\r\n        var sel = window.getSelection();\r\n        if (sel && sel.removeAllRanges) {\r\n          sel.removeAllRanges();\r\n        }\r\n      }\r\n    }\r\n\r\n    function isCellPotentiallyEditable(row, cell) {\r\n      var dataLength = getDataLength();\r\n      // is the data for this row loaded?\r\n      if (row < dataLength && !getDataItem(row)) {\r\n        return false;\r\n      }\r\n\r\n      // are we in the Add New row?  can we create new from this cell?\r\n      if (columns[cell].cannotTriggerInsert && row >= dataLength) {\r\n        return false;\r\n      }\r\n\r\n      // does this cell have an editor?\r\n      if (!getEditor(row, cell)) {\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    }\r\n\r\n    function makeActiveCellNormal() {\r\n      if (!currentEditor) {\r\n        return;\r\n      }\r\n      trigger(self.onBeforeCellEditorDestroy, {editor: currentEditor});\r\n      currentEditor.destroy();\r\n      currentEditor = null;\r\n\r\n      if (activeCellNode) {\r\n        var d = getDataItem(activeRow);\r\n        $(activeCellNode).removeClass(\"editable invalid\");\r\n        if (d) {\r\n          var column = columns[activeCell];\r\n          var formatter = getFormatter(activeRow, column);\r\n          activeCellNode.innerHTML = formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d);\r\n          invalidatePostProcessingResults(activeRow);\r\n        }\r\n      }\r\n\r\n      // if there previously was text selected on a page (such as selected text in the edit cell just removed),\r\n      // IE can't set focus to anything else correctly\r\n      if (navigator.userAgent.toLowerCase().match(/msie/)) {\r\n        clearTextSelection();\r\n      }\r\n\r\n      getEditorLock().deactivate(editController);\r\n    }\r\n\r\n    function makeActiveCellEditable(editor) {\r\n      if (!activeCellNode) {\r\n        return;\r\n      }\r\n      if (!options.editable) {\r\n        throw \"Grid : makeActiveCellEditable : should never get called when options.editable is false\";\r\n      }\r\n\r\n      // cancel pending async call if there is one\r\n      clearTimeout(h_editorLoader);\r\n\r\n      if (!isCellPotentiallyEditable(activeRow, activeCell)) {\r\n        return;\r\n      }\r\n\r\n      var columnDef = columns[activeCell];\r\n      var item = getDataItem(activeRow);\r\n\r\n      if (trigger(self.onBeforeEditCell, {row: activeRow, cell: activeCell, item: item, column: columnDef}) === false) {\r\n        setFocus();\r\n        return;\r\n      }\r\n\r\n      getEditorLock().activate(editController);\r\n      $(activeCellNode).addClass(\"editable\");\r\n\r\n      // don't clear the cell if a custom editor is passed through\r\n      if (!editor) {\r\n        activeCellNode.innerHTML = \"\";\r\n      }\r\n\r\n      currentEditor = new (editor || getEditor(activeRow, activeCell))({\r\n        grid: self,\r\n        gridPosition: absBox($container[0]),\r\n        position: absBox(activeCellNode),\r\n        container: activeCellNode,\r\n        column: columnDef,\r\n        item: item || {},\r\n        commitChanges: commitEditAndSetFocus,\r\n        cancelChanges: cancelEditAndSetFocus\r\n      });\r\n\r\n      if (item) {\r\n        currentEditor.loadValue(item);\r\n      }\r\n\r\n      serializedEditorValue = currentEditor.serializeValue();\r\n\r\n      if (currentEditor.position) {\r\n        handleActiveCellPositionChange();\r\n      }\r\n    }\r\n\r\n    function commitEditAndSetFocus() {\r\n      // if the commit fails, it would do so due to a validation error\r\n      // if so, do not steal the focus from the editor\r\n      if (getEditorLock().commitCurrentEdit()) {\r\n        setFocus();\r\n        if (options.autoEdit) {\r\n          navigateDown();\r\n        }\r\n      }\r\n    }\r\n\r\n    function cancelEditAndSetFocus() {\r\n      if (getEditorLock().cancelCurrentEdit()) {\r\n        setFocus();\r\n      }\r\n    }\r\n\r\n    function absBox(elem) {\r\n      var box = {\r\n        top: elem.offsetTop,\r\n        left: elem.offsetLeft,\r\n        bottom: 0,\r\n        right: 0,\r\n        width: $(elem).outerWidth(),\r\n        height: $(elem).outerHeight(),\r\n        visible: true};\r\n      box.bottom = box.top + box.height;\r\n      box.right = box.left + box.width;\r\n\r\n      // walk up the tree\r\n      var offsetParent = elem.offsetParent;\r\n      while ((elem = elem.parentNode) != document.body) {\r\n        if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css(\"overflowY\") != \"visible\") {\r\n          box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;\r\n        }\r\n\r\n        if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css(\"overflowX\") != \"visible\") {\r\n          box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;\r\n        }\r\n\r\n        box.left -= elem.scrollLeft;\r\n        box.top -= elem.scrollTop;\r\n\r\n        if (elem === offsetParent) {\r\n          box.left += elem.offsetLeft;\r\n          box.top += elem.offsetTop;\r\n          offsetParent = elem.offsetParent;\r\n        }\r\n\r\n        box.bottom = box.top + box.height;\r\n        box.right = box.left + box.width;\r\n      }\r\n\r\n      return box;\r\n    }\r\n\r\n    function getActiveCellPosition() {\r\n      return absBox(activeCellNode);\r\n    }\r\n\r\n    function getGridPosition() {\r\n      return absBox($container[0])\r\n    }\r\n\r\n    function handleActiveCellPositionChange() {\r\n      if (!activeCellNode) {\r\n        return;\r\n      }\r\n\r\n      trigger(self.onActiveCellPositionChanged, {});\r\n\r\n      if (currentEditor) {\r\n        var cellBox = getActiveCellPosition();\r\n        if (currentEditor.show && currentEditor.hide) {\r\n          if (!cellBox.visible) {\r\n            currentEditor.hide();\r\n          } else {\r\n            currentEditor.show();\r\n          }\r\n        }\r\n\r\n        if (currentEditor.position) {\r\n          currentEditor.position(cellBox);\r\n        }\r\n      }\r\n    }\r\n\r\n    function getCellEditor() {\r\n      return currentEditor;\r\n    }\r\n\r\n    function getActiveCell() {\r\n      if (!activeCellNode) {\r\n        return null;\r\n      } else {\r\n        return {row: activeRow, cell: activeCell};\r\n      }\r\n    }\r\n\r\n    function getActiveCellNode() {\r\n      return activeCellNode;\r\n    }\r\n\r\n    function scrollRowIntoView(row, doPaging) {\r\n      var rowAtTop = row * options.rowHeight;\r\n      var rowAtBottom = (row + 1) * options.rowHeight - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0);\r\n\r\n      // need to page down?\r\n      if ((row + 1) * options.rowHeight > scrollTop + viewportH + offset) {\r\n        scrollTo(doPaging ? rowAtTop : rowAtBottom);\r\n        render();\r\n      }\r\n      // or page up?\r\n      else if (row * options.rowHeight < scrollTop + offset) {\r\n        scrollTo(doPaging ? rowAtBottom : rowAtTop);\r\n        render();\r\n      }\r\n    }\r\n\r\n    function scrollRowToTop(row) {\r\n      scrollTo(row * options.rowHeight);\r\n      render();\r\n    }\r\n\r\n    function scrollPage(dir) {\r\n      var deltaRows = dir * numVisibleRows;\r\n      scrollTo((getRowFromPosition(scrollTop) + deltaRows) * options.rowHeight);\r\n      render();\r\n\r\n      if (options.enableCellNavigation && activeRow != null) {\r\n        var row = activeRow + deltaRows;\r\n        var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n        if (row >= dataLengthIncludingAddNew) {\r\n          row = dataLengthIncludingAddNew - 1;\r\n        }\r\n        if (row < 0) {\r\n          row = 0;\r\n        }\r\n\r\n        var cell = 0, prevCell = null;\r\n        var prevActivePosX = activePosX;\r\n        while (cell <= activePosX) {\r\n          if (canCellBeActive(row, cell)) {\r\n            prevCell = cell;\r\n          }\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (prevCell !== null) {\r\n          setActiveCellInternal(getCellNode(row, prevCell));\r\n          activePosX = prevActivePosX;\r\n        } else {\r\n          resetActiveCell();\r\n        }\r\n      }\r\n    }\r\n\r\n    function navigatePageDown() {\r\n      scrollPage(1);\r\n    }\r\n\r\n    function navigatePageUp() {\r\n      scrollPage(-1);\r\n    }\r\n\r\n    function getColspan(row, cell) {\r\n      var metadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (!metadata || !metadata.columns) {\r\n        return 1;\r\n      }\r\n\r\n      var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];\r\n      var colspan = (columnData && columnData.colspan);\r\n      if (colspan === \"*\") {\r\n        colspan = columns.length - cell;\r\n      } else {\r\n        colspan = colspan || 1;\r\n      }\r\n\r\n      return colspan;\r\n    }\r\n\r\n    function findFirstFocusableCell(row) {\r\n      var cell = 0;\r\n      while (cell < columns.length) {\r\n        if (canCellBeActive(row, cell)) {\r\n          return cell;\r\n        }\r\n        cell += getColspan(row, cell);\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function findLastFocusableCell(row) {\r\n      var cell = 0;\r\n      var lastFocusableCell = null;\r\n      while (cell < columns.length) {\r\n        if (canCellBeActive(row, cell)) {\r\n          lastFocusableCell = cell;\r\n        }\r\n        cell += getColspan(row, cell);\r\n      }\r\n      return lastFocusableCell;\r\n    }\r\n\r\n    function gotoRight(row, cell, posX) {\r\n      if (cell >= columns.length) {\r\n        return null;\r\n      }\r\n\r\n      do {\r\n        cell += getColspan(row, cell);\r\n      }\r\n      while (cell < columns.length && !canCellBeActive(row, cell));\r\n\r\n      if (cell < columns.length) {\r\n        return {\r\n          \"row\": row,\r\n          \"cell\": cell,\r\n          \"posX\": cell\r\n        };\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function gotoLeft(row, cell, posX) {\r\n      if (cell <= 0) {\r\n        return null;\r\n      }\r\n\r\n      var firstFocusableCell = findFirstFocusableCell(row);\r\n      if (firstFocusableCell === null || firstFocusableCell >= cell) {\r\n        return null;\r\n      }\r\n\r\n      var prev = {\r\n        \"row\": row,\r\n        \"cell\": firstFocusableCell,\r\n        \"posX\": firstFocusableCell\r\n      };\r\n      var pos;\r\n      while (true) {\r\n        pos = gotoRight(prev.row, prev.cell, prev.posX);\r\n        if (!pos) {\r\n          return null;\r\n        }\r\n        if (pos.cell >= cell) {\r\n          return prev;\r\n        }\r\n        prev = pos;\r\n      }\r\n    }\r\n\r\n    function gotoDown(row, cell, posX) {\r\n      var prevCell;\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      while (true) {\r\n        if (++row >= dataLengthIncludingAddNew) {\r\n          return null;\r\n        }\r\n\r\n        prevCell = cell = 0;\r\n        while (cell <= posX) {\r\n          prevCell = cell;\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (canCellBeActive(row, prevCell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": prevCell,\r\n            \"posX\": posX\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    function gotoUp(row, cell, posX) {\r\n      var prevCell;\r\n      while (true) {\r\n        if (--row < 0) {\r\n          return null;\r\n        }\r\n\r\n        prevCell = cell = 0;\r\n        while (cell <= posX) {\r\n          prevCell = cell;\r\n          cell += getColspan(row, cell);\r\n        }\r\n\r\n        if (canCellBeActive(row, prevCell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": prevCell,\r\n            \"posX\": posX\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    function gotoNext(row, cell, posX) {\r\n      if (row == null && cell == null) {\r\n        row = cell = posX = 0;\r\n        if (canCellBeActive(row, cell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": cell,\r\n            \"posX\": cell\r\n          };\r\n        }\r\n      }\r\n\r\n      var pos = gotoRight(row, cell, posX);\r\n      if (pos) {\r\n        return pos;\r\n      }\r\n\r\n      var firstFocusableCell = null;\r\n      var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();\r\n      while (++row < dataLengthIncludingAddNew) {\r\n        firstFocusableCell = findFirstFocusableCell(row);\r\n        if (firstFocusableCell !== null) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": firstFocusableCell,\r\n            \"posX\": firstFocusableCell\r\n          };\r\n        }\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function gotoPrev(row, cell, posX) {\r\n      if (row == null && cell == null) {\r\n        row = getDataLengthIncludingAddNew() - 1;\r\n        cell = posX = columns.length - 1;\r\n        if (canCellBeActive(row, cell)) {\r\n          return {\r\n            \"row\": row,\r\n            \"cell\": cell,\r\n            \"posX\": cell\r\n          };\r\n        }\r\n      }\r\n\r\n      var pos;\r\n      var lastSelectableCell;\r\n      while (!pos) {\r\n        pos = gotoLeft(row, cell, posX);\r\n        if (pos) {\r\n          break;\r\n        }\r\n        if (--row < 0) {\r\n          return null;\r\n        }\r\n\r\n        cell = 0;\r\n        lastSelectableCell = findLastFocusableCell(row);\r\n        if (lastSelectableCell !== null) {\r\n          pos = {\r\n            \"row\": row,\r\n            \"cell\": lastSelectableCell,\r\n            \"posX\": lastSelectableCell\r\n          };\r\n        }\r\n      }\r\n      return pos;\r\n    }\r\n\r\n    function navigateRight() {\r\n      return navigate(\"right\");\r\n    }\r\n\r\n    function navigateLeft() {\r\n      return navigate(\"left\");\r\n    }\r\n\r\n    function navigateDown() {\r\n      return navigate(\"down\");\r\n    }\r\n\r\n    function navigateUp() {\r\n      return navigate(\"up\");\r\n    }\r\n\r\n    function navigateNext() {\r\n      return navigate(\"next\");\r\n    }\r\n\r\n    function navigatePrev() {\r\n      return navigate(\"prev\");\r\n    }\r\n\r\n    /**\r\n     * @param {string} dir Navigation direction.\r\n     * @return {boolean} Whether navigation resulted in a change of active cell.\r\n     */\r\n    function navigate(dir) {\r\n      if (!options.enableCellNavigation) {\r\n        return false;\r\n      }\r\n\r\n      if (!activeCellNode && dir != \"prev\" && dir != \"next\") {\r\n        return false;\r\n      }\r\n\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return true;\r\n      }\r\n      setFocus();\r\n\r\n      var tabbingDirections = {\r\n        \"up\": -1,\r\n        \"down\": 1,\r\n        \"left\": -1,\r\n        \"right\": 1,\r\n        \"prev\": -1,\r\n        \"next\": 1\r\n      };\r\n      tabbingDirection = tabbingDirections[dir];\r\n\r\n      var stepFunctions = {\r\n        \"up\": gotoUp,\r\n        \"down\": gotoDown,\r\n        \"left\": gotoLeft,\r\n        \"right\": gotoRight,\r\n        \"prev\": gotoPrev,\r\n        \"next\": gotoNext\r\n      };\r\n      var stepFn = stepFunctions[dir];\r\n      var pos = stepFn(activeRow, activeCell, activePosX);\r\n      if (pos) {\r\n        var isAddNewRow = (pos.row == getDataLength());\r\n        scrollCellIntoView(pos.row, pos.cell, !isAddNewRow);\r\n        setActiveCellInternal(getCellNode(pos.row, pos.cell));\r\n        activePosX = pos.posX;\r\n        return true;\r\n      } else {\r\n        setActiveCellInternal(getCellNode(activeRow, activeCell));\r\n        return false;\r\n      }\r\n    }\r\n\r\n    function getCellNode(row, cell) {\r\n      if (rowsCache[row]) {\r\n        ensureCellNodesInRowsCache(row);\r\n        return rowsCache[row].cellNodesByColumnIdx[cell];\r\n      }\r\n      return null;\r\n    }\r\n\r\n    function setActiveCell(row, cell) {\r\n      if (!initialized) { return; }\r\n      if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n        return;\r\n      }\r\n\r\n      if (!options.enableCellNavigation) {\r\n        return;\r\n      }\r\n\r\n      scrollCellIntoView(row, cell, false);\r\n      setActiveCellInternal(getCellNode(row, cell), false);\r\n    }\r\n\r\n    function canCellBeActive(row, cell) {\r\n      if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||\r\n          row < 0 || cell >= columns.length || cell < 0) {\r\n        return false;\r\n      }\r\n\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (rowMetadata && typeof rowMetadata.focusable === \"boolean\") {\r\n        return rowMetadata.focusable;\r\n      }\r\n\r\n      var columnMetadata = rowMetadata && rowMetadata.columns;\r\n      if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable === \"boolean\") {\r\n        return columnMetadata[columns[cell].id].focusable;\r\n      }\r\n      if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable === \"boolean\") {\r\n        return columnMetadata[cell].focusable;\r\n      }\r\n\r\n      return columns[cell].focusable;\r\n    }\r\n\r\n    function canCellBeSelected(row, cell) {\r\n      if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {\r\n        return false;\r\n      }\r\n\r\n      var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);\r\n      if (rowMetadata && typeof rowMetadata.selectable === \"boolean\") {\r\n        return rowMetadata.selectable;\r\n      }\r\n\r\n      var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);\r\n      if (columnMetadata && typeof columnMetadata.selectable === \"boolean\") {\r\n        return columnMetadata.selectable;\r\n      }\r\n\r\n      return columns[cell].selectable;\r\n    }\r\n\r\n    function gotoCell(row, cell, forceEdit) {\r\n      if (!initialized) { return; }\r\n      if (!canCellBeActive(row, cell)) {\r\n        return;\r\n      }\r\n\r\n      if (!getEditorLock().commitCurrentEdit()) {\r\n        return;\r\n      }\r\n\r\n      scrollCellIntoView(row, cell, false);\r\n\r\n      var newCell = getCellNode(row, cell);\r\n\r\n      // if selecting the 'add new' row, start editing right away\r\n      setActiveCellInternal(newCell, forceEdit || (row === getDataLength()) || options.autoEdit);\r\n\r\n      // if no editor was created, set the focus back on the grid\r\n      if (!currentEditor) {\r\n        setFocus();\r\n      }\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // IEditor implementation for the editor lock\r\n\r\n    function commitCurrentEdit() {\r\n      var item = getDataItem(activeRow);\r\n      var column = columns[activeCell];\r\n\r\n      if (currentEditor) {\r\n        if (currentEditor.isValueChanged()) {\r\n          var validationResults = currentEditor.validate();\r\n\r\n          if (validationResults.valid) {\r\n            if (activeRow < getDataLength()) {\r\n              var editCommand = {\r\n                row: activeRow,\r\n                cell: activeCell,\r\n                editor: currentEditor,\r\n                serializedValue: currentEditor.serializeValue(),\r\n                prevSerializedValue: serializedEditorValue,\r\n                execute: function () {\r\n                  this.editor.applyValue(item, this.serializedValue);\r\n                  updateRow(this.row);\r\n                  trigger(self.onCellChange, {\r\n                    row: activeRow,\r\n                    cell: activeCell,\r\n                    item: item\r\n                  });\r\n                },\r\n                undo: function () {\r\n                  this.editor.applyValue(item, this.prevSerializedValue);\r\n                  updateRow(this.row);\r\n                  trigger(self.onCellChange, {\r\n                    row: activeRow,\r\n                    cell: activeCell,\r\n                    item: item\r\n                  });\r\n                }\r\n              };\r\n\r\n              if (options.editCommandHandler) {\r\n                makeActiveCellNormal();\r\n                options.editCommandHandler(item, column, editCommand);\r\n              } else {\r\n                editCommand.execute();\r\n                makeActiveCellNormal();\r\n              }\r\n\r\n            } else {\r\n              var newItem = {};\r\n              currentEditor.applyValue(newItem, currentEditor.serializeValue());\r\n              makeActiveCellNormal();\r\n              trigger(self.onAddNewRow, {item: newItem, column: column});\r\n            }\r\n\r\n            // check whether the lock has been re-acquired by event handlers\r\n            return !getEditorLock().isActive();\r\n          } else {\r\n            // Re-add the CSS class to trigger transitions, if any.\r\n            $(activeCellNode).removeClass(\"invalid\");\r\n            $(activeCellNode).width();  // force layout\r\n            $(activeCellNode).addClass(\"invalid\");\r\n\r\n            trigger(self.onValidationError, {\r\n              editor: currentEditor,\r\n              cellNode: activeCellNode,\r\n              validationResults: validationResults,\r\n              row: activeRow,\r\n              cell: activeCell,\r\n              column: column\r\n            });\r\n\r\n            currentEditor.focus();\r\n            return false;\r\n          }\r\n        }\r\n\r\n        makeActiveCellNormal();\r\n      }\r\n      return true;\r\n    }\r\n\r\n    function cancelCurrentEdit() {\r\n      makeActiveCellNormal();\r\n      return true;\r\n    }\r\n\r\n    function rowsToRanges(rows) {\r\n      var ranges = [];\r\n      var lastCell = columns.length - 1;\r\n      for (var i = 0; i < rows.length; i++) {\r\n        ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));\r\n      }\r\n      return ranges;\r\n    }\r\n\r\n    function getSelectedRows() {\r\n      if (!selectionModel) {\r\n        throw \"Selection model is not set\";\r\n      }\r\n      return selectedRows;\r\n    }\r\n\r\n    function setSelectedRows(rows) {\r\n      if (!selectionModel) {\r\n        throw \"Selection model is not set\";\r\n      }\r\n      selectionModel.setSelectedRanges(rowsToRanges(rows));\r\n    }\r\n\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Debug\r\n\r\n    this.debug = function () {\r\n      var s = \"\";\r\n\r\n      s += (\"\\n\" + \"counter_rows_rendered:  \" + counter_rows_rendered);\r\n      s += (\"\\n\" + \"counter_rows_removed:  \" + counter_rows_removed);\r\n      s += (\"\\n\" + \"renderedRows:  \" + renderedRows);\r\n      s += (\"\\n\" + \"numVisibleRows:  \" + numVisibleRows);\r\n      s += (\"\\n\" + \"maxSupportedCssHeight:  \" + maxSupportedCssHeight);\r\n      s += (\"\\n\" + \"n(umber of pages):  \" + n);\r\n      s += (\"\\n\" + \"(current) page:  \" + page);\r\n      s += (\"\\n\" + \"page height (ph):  \" + ph);\r\n      s += (\"\\n\" + \"vScrollDir:  \" + vScrollDir);\r\n\r\n      alert(s);\r\n    };\r\n\r\n    // a debug helper to be able to access private members\r\n    this.eval = function (expr) {\r\n      return eval(expr);\r\n    };\r\n\r\n    //////////////////////////////////////////////////////////////////////////////////////////////\r\n    // Public API\r\n\r\n    $.extend(this, {\r\n      \"slickGridVersion\": \"2.1\",\r\n\r\n      // Events\r\n      \"onScroll\": new Slick.Event(),\r\n      \"onSort\": new Slick.Event(),\r\n      \"onHeaderMouseEnter\": new Slick.Event(),\r\n      \"onHeaderMouseLeave\": new Slick.Event(),\r\n      \"onHeaderContextMenu\": new Slick.Event(),\r\n      \"onHeaderClick\": new Slick.Event(),\r\n      \"onHeaderCellRendered\": new Slick.Event(),\r\n      \"onBeforeHeaderCellDestroy\": new Slick.Event(),\r\n      \"onHeaderRowCellRendered\": new Slick.Event(),\r\n      \"onBeforeHeaderRowCellDestroy\": new Slick.Event(),\r\n      \"onMouseEnter\": new Slick.Event(),\r\n      \"onMouseLeave\": new Slick.Event(),\r\n      \"onClick\": new Slick.Event(),\r\n      \"onDblClick\": new Slick.Event(),\r\n      \"onContextMenu\": new Slick.Event(),\r\n      \"onKeyDown\": new Slick.Event(),\r\n      \"onAddNewRow\": new Slick.Event(),\r\n      \"onValidationError\": new Slick.Event(),\r\n      \"onViewportChanged\": new Slick.Event(),\r\n      \"onColumnsReordered\": new Slick.Event(),\r\n      \"onColumnsResized\": new Slick.Event(),\r\n      \"onCellChange\": new Slick.Event(),\r\n      \"onBeforeEditCell\": new Slick.Event(),\r\n      \"onBeforeCellEditorDestroy\": new Slick.Event(),\r\n      \"onBeforeDestroy\": new Slick.Event(),\r\n      \"onActiveCellChanged\": new Slick.Event(),\r\n      \"onActiveCellPositionChanged\": new Slick.Event(),\r\n      \"onDragInit\": new Slick.Event(),\r\n      \"onDragStart\": new Slick.Event(),\r\n      \"onDrag\": new Slick.Event(),\r\n      \"onDragEnd\": new Slick.Event(),\r\n      \"onSelectedRowsChanged\": new Slick.Event(),\r\n      \"onCellCssStylesChanged\": new Slick.Event(),\r\n\r\n      // Methods\r\n      \"registerPlugin\": registerPlugin,\r\n      \"unregisterPlugin\": unregisterPlugin,\r\n      \"getColumns\": getColumns,\r\n      \"setColumns\": setColumns,\r\n      \"getColumnIndex\": getColumnIndex,\r\n      \"updateColumnHeader\": updateColumnHeader,\r\n      \"setSortColumn\": setSortColumn,\r\n      \"setSortColumns\": setSortColumns,\r\n      \"getSortColumns\": getSortColumns,\r\n      \"autosizeColumns\": autosizeColumns,\r\n      \"getOptions\": getOptions,\r\n      \"setOptions\": setOptions,\r\n      \"getData\": getData,\r\n      \"getDataLength\": getDataLength,\r\n      \"getDataItem\": getDataItem,\r\n      \"setData\": setData,\r\n      \"getSelectionModel\": getSelectionModel,\r\n      \"setSelectionModel\": setSelectionModel,\r\n      \"getSelectedRows\": getSelectedRows,\r\n      \"setSelectedRows\": setSelectedRows,\r\n      \"getContainerNode\": getContainerNode,\r\n\r\n      \"render\": render,\r\n      \"invalidate\": invalidate,\r\n      \"invalidateRow\": invalidateRow,\r\n      \"invalidateRows\": invalidateRows,\r\n      \"invalidateAllRows\": invalidateAllRows,\r\n      \"updateCell\": updateCell,\r\n      \"updateRow\": updateRow,\r\n      \"getViewport\": getVisibleRange,\r\n      \"getRenderedRange\": getRenderedRange,\r\n      \"resizeCanvas\": resizeCanvas,\r\n      \"updateRowCount\": updateRowCount,\r\n      \"scrollRowIntoView\": scrollRowIntoView,\r\n      \"scrollRowToTop\": scrollRowToTop,\r\n      \"scrollCellIntoView\": scrollCellIntoView,\r\n      \"getCanvasNode\": getCanvasNode,\r\n      \"focus\": setFocus,\r\n\r\n      \"getCellFromPoint\": getCellFromPoint,\r\n      \"getCellFromEvent\": getCellFromEvent,\r\n      \"getActiveCell\": getActiveCell,\r\n      \"setActiveCell\": setActiveCell,\r\n      \"getActiveCellNode\": getActiveCellNode,\r\n      \"getActiveCellPosition\": getActiveCellPosition,\r\n      \"resetActiveCell\": resetActiveCell,\r\n      \"editActiveCell\": makeActiveCellEditable,\r\n      \"getCellEditor\": getCellEditor,\r\n      \"getCellNode\": getCellNode,\r\n      \"getCellNodeBox\": getCellNodeBox,\r\n      \"canCellBeSelected\": canCellBeSelected,\r\n      \"canCellBeActive\": canCellBeActive,\r\n      \"navigatePrev\": navigatePrev,\r\n      \"navigateNext\": navigateNext,\r\n      \"navigateUp\": navigateUp,\r\n      \"navigateDown\": navigateDown,\r\n      \"navigateLeft\": navigateLeft,\r\n      \"navigateRight\": navigateRight,\r\n      \"navigatePageUp\": navigatePageUp,\r\n      \"navigatePageDown\": navigatePageDown,\r\n      \"gotoCell\": gotoCell,\r\n      \"getTopPanel\": getTopPanel,\r\n      \"setTopPanelVisibility\": setTopPanelVisibility,\r\n      \"setHeaderRowVisibility\": setHeaderRowVisibility,\r\n      \"getHeaderRow\": getHeaderRow,\r\n      \"getHeaderRowColumn\": getHeaderRowColumn,\r\n      \"getGridPosition\": getGridPosition,\r\n      \"flashCell\": flashCell,\r\n      \"addCellCssStyles\": addCellCssStyles,\r\n      \"setCellCssStyles\": setCellCssStyles,\r\n      \"removeCellCssStyles\": removeCellCssStyles,\r\n      \"getCellCssStyles\": getCellCssStyles,\r\n\r\n      \"init\": finishInitialization,\r\n      \"destroy\": destroy,\r\n\r\n      // IEditor implementation\r\n      \"getEditorLock\": getEditorLock,\r\n      \"getEditController\": getEditController\r\n    });\r\n\r\n    init();\r\n  }\r\n}(jQuery));\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/slick.grid.js\n// module id = 935\n// module chunks = 0 1","(function ($) {\n  // Register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"AutoTooltips\": AutoTooltips\n    }\n  });\n\n  /**\n   * AutoTooltips plugin to show/hide tooltips when columns are too narrow to fit content.\n   * @constructor\n   * @param {boolean} [options.enableForCells=true]        - Enable tooltip for grid cells\n   * @param {boolean} [options.enableForHeaderCells=false] - Enable tooltip for header cells\n   * @param {number}  [options.maxToolTipLength=null]      - The maximum length for a tooltip\n   */\n  function AutoTooltips(options) {\n    var _grid;\n    var _self = this;\n    var _defaults = {\n      enableForCells: true,\n      enableForHeaderCells: false,\n      maxToolTipLength: null\n    };\n    \n    /**\n     * Initialize plugin.\n     */\n    function init(grid) {\n      options = $.extend(true, {}, _defaults, options);\n      _grid = grid;\n      if (options.enableForCells) _grid.onMouseEnter.subscribe(handleMouseEnter);\n      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.subscribe(handleHeaderMouseEnter);\n    }\n    \n    /**\n     * Destroy plugin.\n     */\n    function destroy() {\n      if (options.enableForCells) _grid.onMouseEnter.unsubscribe(handleMouseEnter);\n      if (options.enableForHeaderCells) _grid.onHeaderMouseEnter.unsubscribe(handleHeaderMouseEnter);\n    }\n    \n    /**\n     * Handle mouse entering grid cell to add/remove tooltip.\n     * @param {jQuery.Event} e - The event\n     */\n    function handleMouseEnter(e) {\n      var cell = _grid.getCellFromEvent(e);\n      if (cell) {\n        var $node = $(_grid.getCellNode(cell.row, cell.cell));\n        var text;\n        if ($node.innerWidth() < $node[0].scrollWidth) {\n          text = $.trim($node.text());\n          if (options.maxToolTipLength && text.length > options.maxToolTipLength) {\n            text = text.substr(0, options.maxToolTipLength - 3) + \"...\";\n          }\n        } else {\n          text = \"\";\n        }\n        $node.attr(\"title\", text);\n      }\n    }\n    \n    /**\n     * Handle mouse entering header cell to add/remove tooltip.\n     * @param {jQuery.Event} e     - The event\n     * @param {object} args.column - The column definition\n     */\n    function handleHeaderMouseEnter(e, args) {\n      var column = args.column,\n          $node = $(e.target).closest(\".slick-header-column\");\n      if (column && !column.toolTip) {\n        $node.attr(\"title\", ($node.innerWidth() < $node[0].scrollWidth) ? column.name : \"\");\n      }\n    }\n    \n    // Public API\n    $.extend(this, {\n      \"init\": init,\n      \"destroy\": destroy\n    });\n  }\n})(jQuery);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/plugins/slick.autotooltips.js\n// module id = 936\n// module chunks = 0 1","(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellSelectionModel\": CellSelectionModel\n    }\n  });\n\n\n  function CellSelectionModel(options) {\n    var _grid;\n    var _canvas;\n    var _ranges = [];\n    var _self = this;\n    var _selector = new Slick.CellRangeSelector({\n      \"selectionCss\": {\n        \"border\": \"2px solid black\"\n      }\n    });\n    var _options;\n    var _defaults = {\n      selectActiveCell: true\n    };\n\n\n    function init(grid) {\n      _options = $.extend(true, {}, _defaults, options);\n      _grid = grid;\n      _canvas = _grid.getCanvasNode();\n      _grid.onActiveCellChanged.subscribe(handleActiveCellChange);\n      _grid.onKeyDown.subscribe(handleKeyDown);\n      grid.registerPlugin(_selector);\n      _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);\n      _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);\n    }\n\n    function destroy() {\n      _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);\n      _grid.onKeyDown.unsubscribe(handleKeyDown);\n      _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);\n      _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);\n      _grid.unregisterPlugin(_selector);\n    }\n\n    function removeInvalidRanges(ranges) {\n      var result = [];\n\n      for (var i = 0; i < ranges.length; i++) {\n        var r = ranges[i];\n        if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {\n          result.push(r);\n        }\n      }\n\n      return result;\n    }\n\n    function setSelectedRanges(ranges) {\n      _ranges = removeInvalidRanges(ranges);\n      _self.onSelectedRangesChanged.notify(_ranges);\n    }\n\n    function getSelectedRanges() {\n      return _ranges;\n    }\n\n    function handleBeforeCellRangeSelected(e, args) {\n      if (_grid.getEditorLock().isActive()) {\n        e.stopPropagation();\n        return false;\n      }\n    }\n\n    function handleCellRangeSelected(e, args) {\n      setSelectedRanges([args.range]);\n    }\n\n    function handleActiveCellChange(e, args) {\n      if (_options.selectActiveCell && args.row != null && args.cell != null) {\n        setSelectedRanges([new Slick.Range(args.row, args.cell)]);\n      }\n    }\n    \n    function handleKeyDown(e) {\n      /***\n       * Кey codes\n       * 37 left\n       * 38 up\n       * 39 right\n       * 40 down                     \n       */                                         \n      var ranges, last;\n      var active = _grid.getActiveCell(); \n\n      if ( active && e.shiftKey && !e.ctrlKey && !e.altKey && \n          (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {\n      \n        ranges = getSelectedRanges();\n        if (!ranges.length)\n         ranges.push(new Slick.Range(active.row, active.cell));\n         \n        // keyboard can work with last range only          \n        last = ranges.pop();\n        \n        // can't handle selection out of active cell\n        if (!last.contains(active.row, active.cell))\n          last = new Slick.Range(active.row, active.cell);\n        \n        var dRow = last.toRow - last.fromRow,\n            dCell = last.toCell - last.fromCell,\n            // walking direction\n            dirRow = active.row == last.fromRow ? 1 : -1,\n            dirCell = active.cell == last.fromCell ? 1 : -1;\n                 \n        if (e.which == 37) {\n          dCell -= dirCell; \n        } else if (e.which == 39) {\n          dCell += dirCell ; \n        } else if (e.which == 38) {\n          dRow -= dirRow; \n        } else if (e.which == 40) {\n          dRow += dirRow; \n        }\n        \n        // define new selection range \n        var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);\n        if (removeInvalidRanges([new_last]).length) {\n          ranges.push(new_last);\n          var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;\n          var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;\n         _grid.scrollRowIntoView(viewRow);\n         _grid.scrollCellIntoView(viewRow, viewCell);\n        }\n        else \n          ranges.push(last);\n\n        setSelectedRanges(ranges);  \n       \n        e.preventDefault();\n        e.stopPropagation();        \n      }           \n    }\n\n    $.extend(this, {\n      \"getSelectedRanges\": getSelectedRanges,\n      \"setSelectedRanges\": setSelectedRanges,\n\n      \"init\": init,\n      \"destroy\": destroy,\n\n      \"onSelectedRangesChanged\": new Slick.Event()\n    });\n  }\n})(jQuery);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/plugins/slick.cellselectionmodel.js\n// module id = 937\n// module chunks = 0 1","(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellRangeSelector\": CellRangeSelector\n    }\n  });\n\n\n  function CellRangeSelector(options) {\n    var _grid;\n    var _canvas;\n    var _dragging;\n    var _decorator;\n    var _self = this;\n    var _handler = new Slick.EventHandler();\n    var _defaults = {\n      selectionCss: {\n        \"border\": \"2px dashed blue\"\n      }\n    };\n\n\n    function init(grid) {\n      options = $.extend(true, {}, _defaults, options);\n      _decorator = new Slick.CellRangeDecorator(grid, options);\n      _grid = grid;\n      _canvas = _grid.getCanvasNode();\n      _handler\n        .subscribe(_grid.onDragInit, handleDragInit)\n        .subscribe(_grid.onDragStart, handleDragStart)\n        .subscribe(_grid.onDrag, handleDrag)\n        .subscribe(_grid.onDragEnd, handleDragEnd);\n    }\n\n    function destroy() {\n      _handler.unsubscribeAll();\n    }\n\n    function handleDragInit(e, dd) {\n      // prevent the grid from cancelling drag'n'drop by default\n      e.stopImmediatePropagation();\n    }\n\n    function handleDragStart(e, dd) {\n      var cell = _grid.getCellFromEvent(e);\n      if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {\n        if (_grid.canCellBeSelected(cell.row, cell.cell)) {\n          _dragging = true;\n          e.stopImmediatePropagation();\n        }\n      }\n      if (!_dragging) {\n        return;\n      }\n\n      _grid.focus();\n\n      var start = _grid.getCellFromPoint(\n          dd.startX - $(_canvas).offset().left,\n          dd.startY - $(_canvas).offset().top);\n\n      dd.range = {start: start, end: {}};\n\n      return _decorator.show(new Slick.Range(start.row, start.cell));\n    }\n\n    function handleDrag(e, dd) {\n      if (!_dragging) {\n        return;\n      }\n      e.stopImmediatePropagation();\n\n      var end = _grid.getCellFromPoint(\n          e.pageX - $(_canvas).offset().left,\n          e.pageY - $(_canvas).offset().top);\n\n      if (!_grid.canCellBeSelected(end.row, end.cell)) {\n        return;\n      }\n\n      dd.range.end = end;\n      _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));\n    }\n\n    function handleDragEnd(e, dd) {\n      if (!_dragging) {\n        return;\n      }\n\n      _dragging = false;\n      e.stopImmediatePropagation();\n\n      _decorator.hide();\n      _self.onCellRangeSelected.notify({\n        range: new Slick.Range(\n            dd.range.start.row,\n            dd.range.start.cell,\n            dd.range.end.row,\n            dd.range.end.cell\n        )\n      });\n    }\n\n    $.extend(this, {\n      \"init\": init,\n      \"destroy\": destroy,\n\n      \"onBeforeCellRangeSelected\": new Slick.Event(),\n      \"onCellRangeSelected\": new Slick.Event()\n    });\n  }\n})(jQuery);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/plugins/slick.cellrangeselector.js\n// module id = 938\n// module chunks = 0 1","(function ($) {\n  // register namespace\n  $.extend(true, window, {\n    \"Slick\": {\n      \"CellRangeDecorator\": CellRangeDecorator\n    }\n  });\n\n  /***\n   * Displays an overlay on top of a given cell range.\n   *\n   * TODO:\n   * Currently, it blocks mouse events to DOM nodes behind it.\n   * Use FF and WebKit-specific \"pointer-events\" CSS style, or some kind of event forwarding.\n   * Could also construct the borders separately using 4 individual DIVs.\n   *\n   * @param {Grid} grid\n   * @param {Object} options\n   */\n  function CellRangeDecorator(grid, options) {\n    var _elem;\n    var _defaults = {\n      selectionCssClass: 'slick-range-decorator',\n      selectionCss: {\n        \"zIndex\": \"9999\",\n        \"border\": \"2px dashed red\"\n      }\n    };\n\n    options = $.extend(true, {}, _defaults, options);\n\n\n    function show(range) {\n      if (!_elem) {\n        _elem = $(\"<div></div>\", {css: options.selectionCss})\n            .addClass(options.selectionCssClass)\n            .css(\"position\", \"absolute\")\n            .appendTo(grid.getCanvasNode());\n      }\n\n      var from = grid.getCellNodeBox(range.fromRow, range.fromCell);\n      var to = grid.getCellNodeBox(range.toRow, range.toCell);\n\n      _elem.css({\n        top: from.top - 1,\n        left: from.left - 1,\n        height: to.bottom - from.top - 2,\n        width: to.right - from.left - 2\n      });\n\n      return _elem;\n    }\n\n    function hide() {\n      if (_elem) {\n        _elem.remove();\n        _elem = null;\n      }\n    }\n\n    $.extend(this, {\n      \"show\": show,\n      \"hide\": hide\n    });\n  }\n})(jQuery);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/plugins/slick.cellrangedecorator.js\n// module id = 939\n// module chunks = 0 1","(function ($) {\n    // register namespace\n    $.extend(true, window, {\n      \"Slick\": {\n        \"CellExternalCopyManager\": CellExternalCopyManager\n      }\n    });\n  \n  \n    function CellExternalCopyManager(options) {\n      /*\n        This manager enables users to copy/paste data from/to an external Spreadsheet application\n        such as MS-Excel® or OpenOffice-Spreadsheet.\n        \n        Since it is not possible to access directly the clipboard in javascript, the plugin uses\n        a trick to do it's job. After detecting the keystroke, we dynamically create a textarea\n        where the browser copies/pastes the serialized data. \n        \n        options:\n          copiedCellStyle : sets the css className used for copied cells. default : \"copied\"\n          copiedCellStyleLayerKey : sets the layer key for setting css values of copied cells. default : \"copy-manager\"\n          dataItemColumnValueExtractor : option to specify a custom column value extractor function\n          dataItemColumnValueSetter : option to specify a custom column value setter function\n          clipboardCommandHandler : option to specify a custom handler for paste actions\n          includeHeaderWhenCopying : set to true and the plugin will take the name property from each column (which is usually what appears in your header) and put that as the first row of the text that's copied to the clipboard\n          bodyElement: option to specify a custom DOM element which to will be added the hidden textbox. It's useful if the grid is inside a modal dialog.\n          onCopyInit: optional handler to run when copy action initializes\n          onCopySuccess: optional handler to run when copy action is complete\n          newRowCreator: function to add rows to table if paste overflows bottom of table, if this function is not provided new rows will be ignored.\n          readOnlyMode: suppresses paste\n      */\n      var _grid;\n      var _self = this;\n      var _copiedRanges;\n      var _options = options || {};\n      var _copiedCellStyleLayerKey = _options.copiedCellStyleLayerKey || \"copy-manager\";\n      var _copiedCellStyle = _options.copiedCellStyle || \"copied\";\n      var _clearCopyTI = 0;\n      var _bodyElement = _options.bodyElement || document.body;\n      var _onCopyInit = _options.onCopyInit || null;\n      var _onCopySuccess = _options.onCopySuccess || null;\n      \n      var keyCodes = {\n        'C': 67,\n        'V': 86,\n        'ESC': 27,\n        'INSERT': 45\n      };\n  \n      function init(grid) {\n        _grid = grid;\n        _grid.onKeyDown.subscribe(handleKeyDown);\n        \n        // we need a cell selection model\n        var cellSelectionModel = grid.getSelectionModel();\n        if (!cellSelectionModel){\n          throw new Error(\"Selection model is mandatory for this plugin. Please set a selection model on the grid before adding this plugin: grid.setSelectionModel(new Slick.CellSelectionModel())\");\n        }\n        // we give focus on the grid when a selection is done on it.\n        // without this, if the user selects a range of cell without giving focus on a particular cell, the grid doesn't get the focus and key stroke handles (ctrl+c) don't work\n        cellSelectionModel.onSelectedRangesChanged.subscribe(function(e, args){\n          _grid.focus();\n        });\n      }\n  \n      function destroy() {\n        _grid.onKeyDown.unsubscribe(handleKeyDown);\n      }\n      \n      function getDataItemValueForColumn(item, columnDef) {\n        if (_options.dataItemColumnValueExtractor) {\n          var dataItemColumnValueExtractorValue = _options.dataItemColumnValueExtractor(item, columnDef);\n  \n          if (dataItemColumnValueExtractorValue)\n            return dataItemColumnValueExtractorValue;\n        }\n  \n        var retVal = '';\n  \n        // if a custom getter is not defined, we call serializeValue of the editor to serialize\n        if (columnDef.editor){\n          var editorArgs = {\n            'container':$(\"<p>\"),  // a dummy container\n            'column':columnDef,\n            'position':{'top':0, 'left':0},  // a dummy position required by some editors\n            'grid':_grid\n          };\n          var editor = new columnDef.editor(editorArgs);\n          editor.loadValue(item);\n          retVal = editor.serializeValue();\n          editor.destroy();\n        } else {\n          retVal = item[columnDef.field];\n        }\n  \n        return retVal;\n      }\n      \n      function setDataItemValueForColumn(item, columnDef, value) {\n        if (_options.dataItemColumnValueSetter) {\n          return _options.dataItemColumnValueSetter(item, columnDef, value);\n        }\n  \n        // if a custom setter is not defined, we call applyValue of the editor to unserialize\n        if (columnDef.editor){\n          var editorArgs = {\n            'container':$(\"body\"),  // a dummy container\n            'column':columnDef,\n            'position':{'top':0, 'left':0},  // a dummy position required by some editors\n            'grid':_grid\n          };\n          var editor = new columnDef.editor(editorArgs);\n          editor.loadValue(item);\n          editor.applyValue(item, value);\n          editor.destroy();\n        } else {\n          item[columnDef.field] = value;\n        }\n      }\n      \n      \n      function _createTextBox(innerText){\n        var ta = document.createElement('textarea');\n        ta.style.position = 'absolute';\n        ta.style.left = '-1000px';\n        ta.style.top = document.body.scrollTop + 'px';\n        ta.value = innerText;\n        _bodyElement.appendChild(ta);\n        ta.select();\n        \n        return ta;\n      }\n      \n      function _decodeTabularData(_grid, ta){\n        var columns = _grid.getColumns();\n        var clipText = ta.value;\n        var clipRows = clipText.split(/[\\n\\f\\r]/);\n        // trim trailing CR if present\n        if (clipRows[clipRows.length - 1]==\"\") { clipRows.pop(); }\n        \n        var clippedRange = [];\n        var j = 0;\n        \n        _bodyElement.removeChild(ta);\n        for (var i=0; i<clipRows.length; i++) {\n          if (clipRows[i]!=\"\")\n            clippedRange[j++] = clipRows[i].split(\"\\t\");\n            else\n            clippedRange[i] = [\"\"];\n        }\n        var selectedCell = _grid.getActiveCell();\n        var ranges = _grid.getSelectionModel().getSelectedRanges();\n        var selectedRange = ranges && ranges.length ? ranges[0] : null;   // pick only one selection\n        var activeRow = null;\n        var activeCell = null;\n        \n        if (selectedRange){\n          activeRow = selectedRange.fromRow;\n          activeCell = selectedRange.fromCell;\n        } else if (selectedCell){\n          activeRow = selectedCell.row;\n          activeCell = selectedCell.cell;\n        } else {\n          // we don't know where to paste\n          return;\n        }\n        \n        var oneCellToMultiple = false;\n        var destH = clippedRange.length;\n        var destW = clippedRange.length ? clippedRange[0].length : 0;\n        if (clippedRange.length == 1 && clippedRange[0].length == 1 && selectedRange){\n          oneCellToMultiple = true;\n          destH = selectedRange.toRow - selectedRange.fromRow +1;\n          destW = selectedRange.toCell - selectedRange.fromCell +1;\n        }\n        var availableRows = _grid.getData().length - activeRow;\n        var addRows = 0;\n  \n        // ignore new rows if we don't have a \"newRowCreator\"\n        if(availableRows < destH && _options.newRowCreator)\n        {\n          var d = _grid.getData();\n          for(addRows = 1; addRows <= destH - availableRows; addRows++)\n            d.push({});\n          _grid.setData(d);\n          _grid.render();\n        }\n  \n        var overflowsBottomOfGrid = activeRow + destH > _grid.getDataLength();\n  \n        if (_options.newRowCreator && overflowsBottomOfGrid) {\n  \n          var newRowsNeeded = activeRow + destH - _grid.getDataLength();\n  \n          _options.newRowCreator(newRowsNeeded);\n  \n        }\n  \n        var clipCommand = {\n  \n          isClipboardCommand: true,\n          clippedRange: clippedRange,\n          oldValues: [],\n          cellExternalCopyManager: _self,\n          _options: _options,\n          setDataItemValueForColumn: setDataItemValueForColumn,\n          markCopySelection: markCopySelection,\n          oneCellToMultiple: oneCellToMultiple,\n          activeRow: activeRow,\n          activeCell: activeCell,\n          destH: destH,\n          destW: destW,\n          maxDestY: _grid.getDataLength(),\n          maxDestX: _grid.getColumns().length,\n          h: 0,\n          w: 0,\n            \n          execute: function() {\n            this.h=0;\n            for (var y = 0; y < this.destH; y++){\n              this.oldValues[y] = [];\n              this.w=0;\n              this.h++;\n              for (var x = 0; x < this.destW; x++){\n                this.w++;\n                var desty = activeRow + y;\n                var destx = activeCell + x;\n                \n                if (desty < this.maxDestY && destx < this.maxDestX ) {\n                  var nd = _grid.getCellNode(desty, destx);\n                  var dt = _grid.getDataItem(desty);\n                  this.oldValues[y][x] = dt[columns[destx]['field']];\n                  if (oneCellToMultiple)\n                    this.setDataItemValueForColumn(dt, columns[destx], clippedRange[0][0]);\n                  else\n                    this.setDataItemValueForColumn(dt, columns[destx], clippedRange[y] ? clippedRange[y][x] : '');\n                  _grid.updateCell(desty, destx);\n                  _grid.onCellChange.notify({\n                      row: desty,\n                      cell: destx,\n                      item: dt,\n                      grid: _grid\n                  });\n  \n                }\n              }\n            }\n            \n            var bRange = {\n              'fromCell': activeCell,\n              'fromRow': activeRow,\n              'toCell': activeCell+this.w-1,\n              'toRow': activeRow+this.h-1\n            }\n  \n            this.markCopySelection([bRange]);\n            _grid.getSelectionModel().setSelectedRanges([bRange]);\n            this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});\n          },\n  \n          undo: function() {\n            for (var y = 0; y < this.destH; y++){\n              for (var x = 0; x < this.destW; x++){\n                var desty = activeRow + y;\n                var destx = activeCell + x;\n                \n                if (desty < this.maxDestY && destx < this.maxDestX ) {\n                  var nd = _grid.getCellNode(desty, destx);\n                  var dt = _grid.getDataItem(desty);\n                  if (oneCellToMultiple)\n                    this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[0][0]);\n                  else\n                    this.setDataItemValueForColumn(dt, columns[destx], this.oldValues[y][x]);\n                  _grid.updateCell(desty, destx);\n                  _grid.onCellChange.notify({\n                      row: desty,\n                      cell: destx,\n                      item: dt,\n                      grid: _grid\n                  });\n                }\n              }\n            }\n            \n            var bRange = {\n              'fromCell': activeCell,\n              'fromRow': activeRow,\n              'toCell': activeCell+this.w-1,\n              'toRow': activeRow+this.h-1\n            }\n  \n            this.markCopySelection([bRange]);\n            _grid.getSelectionModel().setSelectedRanges([bRange]);\n            this.cellExternalCopyManager.onPasteCells.notify({ranges: [bRange]});\n            \n            if(addRows > 1){            \n              var d = _grid.getData();\n              for(; addRows > 1; addRows--)\n                d.splice(d.length - 1, 1);\n              _grid.setData(d);\n              _grid.render();\n            }\n          }\n        };\n  \n        if(_options.clipboardCommandHandler) {\n          _options.clipboardCommandHandler(clipCommand);\n        }\n        else {\n          clipCommand.execute();\n        }\n      }\n      \n      \n      function handleKeyDown(e, args) {\n        var ranges;\n        if (!_grid.getEditorLock().isActive() || _grid.getOptions().autoEdit) {\n          if (e.which == keyCodes.ESC) {\n            if (_copiedRanges) {\n              e.preventDefault();\n              clearCopySelection();\n              _self.onCopyCancelled.notify({ranges: _copiedRanges});\n              _copiedRanges = null;\n            }\n          }\n  \n          if ((e.which === keyCodes.C || e.which === keyCodes.INSERT) && (e.ctrlKey || e.metaKey) && !e.shiftKey) {    // CTRL+C or CTRL+INS\n            if (_onCopyInit) {\n              _onCopyInit.call();\n            }\n            ranges = _grid.getSelectionModel().getSelectedRanges();\n            if (ranges.length != 0) {\n              _copiedRanges = ranges;\n              markCopySelection(ranges);\n              _self.onCopyCells.notify({ranges: ranges});\n              \n              var columns = _grid.getColumns();\n              var clipText = \"\";\n  \n              for (var rg = 0; rg < ranges.length; rg++){\n                  var range = ranges[rg];\n                  var clipTextRows = [];\n                  for (var i=range.fromRow; i< range.toRow+1 ; i++){\n                      var clipTextCells = [];\n                      var dt = _grid.getDataItem(i);\n                      \n                      if (clipTextRows == \"\" && _options.includeHeaderWhenCopying) {\n                          var clipTextHeaders = [];\n                          for (var j = range.fromCell; j < range.toCell + 1 ; j++) {\n                              if (columns[j].name.length > 0)\n                                  clipTextHeaders.push(columns[j].name);\n                          }\n                          clipTextRows.push(clipTextHeaders.join(\"\\t\"));\n                      }\n  \n                      for (var j=range.fromCell; j< range.toCell+1 ; j++){\n                          clipTextCells.push(getDataItemValueForColumn(dt, columns[j]));\n                      }\n                      clipTextRows.push(clipTextCells.join(\"\\t\"));\n                  }\n                  clipText += clipTextRows.join(\"\\r\\n\") + \"\\r\\n\";\n              }\n              \n              if(window.clipboardData) {\n                  window.clipboardData.setData(\"Text\", clipText);\n                  return true;\n              }\n              else {\n                  var focusEl = document.activeElement;\n  \n                  var ta = _createTextBox(clipText);\n  \n                  ta.focus();\n                  \n                  setTimeout(function(){\n                       _bodyElement.removeChild(ta);\n                      // restore focus\n                      if (focusEl)\n                          focusEl.focus();\n                      else\n                          console.log(\"Not element to restore focus to after copy?\");\n  \n                  }, 100);\n  \n                  if (_onCopySuccess) {\n                      var rowCount = 0;\n                      // If it's cell selection, use the toRow/fromRow fields\n                      if (ranges.length === 1) {\n                          rowCount = (ranges[0].toRow + 1) - ranges[0].fromRow;\n                      }\n                      else {\n                          rowCount = ranges.length;\n                      }\n                      _onCopySuccess.call(this, rowCount);\n                  }\n  \n                  return false;\n              }\n            }\n          }\n  \n          if (!_options.readOnlyMode && (\n           (e.which === keyCodes.V && (e.ctrlKey || e.metaKey) && !e.shiftKey)\n            || (e.which === keyCodes.INSERT && e.shiftKey && !e.ctrlKey)\n           )) {    // CTRL+V or Shift+INS\n              var ta = _createTextBox('');\n              \n              setTimeout(function(){\n                  _decodeTabularData(_grid, ta);\n              }, 100);\n              \n              return false;\n          }\n        }\n      }\n  \n      function markCopySelection(ranges) {\n        clearCopySelection();\n        \n        var columns = _grid.getColumns();\n        var hash = {};\n        for (var i = 0; i < ranges.length; i++) {\n          for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {\n            hash[j] = {};\n            for (var k = ranges[i].fromCell; k <= ranges[i].toCell && k<columns.length; k++) {\n              hash[j][columns[k].id] = _copiedCellStyle;\n            }\n          }\n        }\n        _grid.setCellCssStyles(_copiedCellStyleLayerKey, hash);\n        clearTimeout(_clearCopyTI);\n        _clearCopyTI = setTimeout(function(){\n          _self.clearCopySelection();\n        }, 2000);\n      }\n  \n      function clearCopySelection() {\n        _grid.removeCellCssStyles(_copiedCellStyleLayerKey);\n      }\n  \n      $.extend(this, {\n        \"init\": init,\n        \"destroy\": destroy,\n        \"clearCopySelection\": clearCopySelection,\n        \"handleKeyDown\":handleKeyDown,\n        \n        \"onCopyCells\": new Slick.Event(),\n        \"onCopyCancelled\": new Slick.Event(),\n        \"onPasteCells\": new Slick.Event()\n      });\n    }\n  })(jQuery);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@opengov/slickgrid/plugins/slick.cellexternalcopymanager.js\n// module id = 940\n// module chunks = 0 1","import _ from 'lodash';\nimport $ from 'jquery';\nimport utils from '../utils';\nimport ContextMenu from './contextmenu';\nimport GridReportActions from '../../actions/grid_report_actions';\nimport config from '../../config';\nimport GridReportStore from '../../stores/grid_report_store';\n\nfunction CheckbookContextMenu(options) {\n  ContextMenu.call(this, options);\n}\n\n_.extend(CheckbookContextMenu.prototype, ContextMenu.prototype, {\n  hasRequiredFields(data) {\n    if (!data) { return false; }\n\n    const requiredFields = config.CheckSettings.requiredFields;\n\n    //this will loop through all until it finds a false value\n    return requiredFields.every(function(field) {\n      return data.hasOwnProperty(field) && data[field];\n    });\n  },\n  handleClick(ev) {\n    const data = $(ev.currentTarget).data();\n    if (data.type === 'check') {\n      //call an action creator with the check data\n      GridReportActions.showCheckImagePanel(data.value.quasiId, this.queryModel._q, this.grid.options.meta.id, true, data.value.row);\n      this.hideMenu();\n      return;\n    }\n\n    ContextMenu.prototype.handleClick.call(this, ev);\n  },\n\n  handleContextMenu(e) {\n    const cell = this.grid.getCellFromEvent(e);\n    const columns = this.grid.getColumns();\n    const column = columns[cell.cell];\n    const row = this.grid.getDataItem(cell.row);\n\n    const quasiId = row.quasi_id;\n\n    const amountColumn = GridReportStore.getState().getIn(['schema', 'amountColumn']);\n    const rowAmount = (row[amountColumn] && utils.parseMonetary(row[amountColumn]));\n\n    ContextMenu.prototype.handleContextMenu.call(this, e);\n    if (quasiId && (typeof(rowAmount) === 'number' && rowAmount >= 0)) {\n      const elementData: any = _.extend(\n        {\n          column\n        },\n        {\n          label: 'View Check Details',\n          operator: 'null',\n          type: 'check'\n        });\n\n      elementData.value = {quasiId, row: cell.row};\n\n      $('<div class=\"dropdown__row check-image__toggle js-select-option\"></div>')\n        .data(elementData)\n        .text(elementData.label)\n        .appendTo(this.menu);\n    }\n  }\n});\n\nexport default CheckbookContextMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/checkbook_contextmenu.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from '../../og';\nimport QueryModel from '../querymodel';\nimport RemoteModel from '../remotemodel';\nimport utils from '../utils';\nimport SortSelector from '../../views/sort_selector';\n\n// also known as the Aggregates panel\n\n/** @class FacetPanel */\nconst FacetPanel = og.View.extend(\n/** @lends FacetPanel# */\n  {\n    template: 'griddle/panel_aggregates',\n    placeholder: 'subpanel',\n    events: {\n      'click .js-select-group': 'onGroupClick',\n      'click .js-recalculate': 'onRecalculate'\n    },\n\n    stats: [\n    {id: 'count', name: 'Show Count'},\n    {id: 'sum', name: 'Show Total'},\n    {id: 'avg', name: 'Show Avg'},\n    {id: 'min', name: 'Show Min'},\n    {id: 'max', name: 'Show Max'}\n    ],\n    sorts: [\n    {id: 'name-asc', name: 'Sort A-Z'},\n    {id: 'name-desc', name: 'Sort Z-A'},\n    {id: 'value-asc', name: 'Sort 0-9'},\n    {id: 'value-desc', name: 'Sort 9-0'}\n    ],\n\n    initialize(options) {\n      this.options = options;\n      this.state = _.extend({\n        group: 'Amount',\n        stat: 'count',\n        value: 'Amount',\n        sort: 'value-desc',\n        initialLoad: true,\n        scrollPosition: 0\n      }, options.state || {});\n\n      this.queryModel = new QueryModel();\n      this.loader = new RemoteModel({\n        endpoint: options.endpoint,\n        queryModel: this.queryModel\n      });\n\n      _.bindAll(this, 'onDataLoaded', 'onGroupChange', 'onSelectChange', 'onGroupClick');\n    },\n\n  /** Initialize the plugin, called by slickgrid when registering */\n    init(grid) {\n      this.grid = grid;\n\n      this.previousStat = 'count';\n\n      this.listenTo(this.loader, 'loaded', this.onDataLoaded, this);\n      this.listenTo(this.loader, 'loading', this.onDataLoading, this);\n\n      this.listenTo(this.grid, 'group', this.onGroupChange, this);\n      this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n\n      this.listenTo(this.grid.loader.queryModel, 'change', this.onQueryChange, this);\n\n      this.queryModel.setQuery(this.getQuery(), true);\n      this.onDataLoaded({q: this.getQuery(), initial: true});\n      this.render();\n    },\n  /** Render */\n    render() {\n      const groups = _.sortBy(_.map(this.options.grid.getAllColumns(), function(col: any, idx) {\n        return { id: idx, field: col.id, name: col.label, visible: col.visible };\n      }), 'name');\n\n      this.view('group', 'group', new SortSelector({\n        template: 'griddle/select_box',\n        placeholder: 'select_box',\n        selected: _.find(groups, {field: this.state.group}).id,\n        items: groups\n      })).on('change', function(id) {\n        this.state.group = this.view('group__group').collection.get(id).get('field');\n        this.onQueryChange();\n        this.trigger('action', 'change-group', id);\n      }, this);\n\n      this.view('stat', 'stat', new SortSelector({\n        template: 'griddle/select_box',\n        placeholder: 'select_box',\n        className: 'select-box_half-right',\n        selected: this.state.stat,\n        items: this.stats\n      })).on('change', function(id) {\n        this.state.stat = id;\n        this.onQueryChange();\n        this.trigger('action', 'change-stat', id);\n      }, this);\n\n      this.view('sort', 'sort', new SortSelector({\n        template: 'griddle/select_box',\n        placeholder: 'select_box',\n        className: 'select-box_half-left',\n        selected: this.state.sort,\n        items: this.sorts\n      })).on('change', function(id) {\n        this.state.sort = id;\n        this.onQueryChange();\n        this.trigger('action', 'change-sort', id);\n      }, this);\n\n      og.View.prototype.render.call(this);\n    },\n  /** @protected */\n    onDataLoaded(args) {\n      const state = this.state;\n      const grouping = {\n        column_name: args.q.group,\n        count: utils.formatNumberComma(args.count),\n        initialLoad: state.initialLoad,\n        rows: []\n      };\n      const fullColumn: any = _.find(this.options.columns, {name: args.q.group}) || {};\n\n    // Copy group by column information\n      for (let i = 0; i < this.loader.dataLength; i += 1) {\n        const row: any = this.loader.data[i];\n\n        const statRow = {\n          group_name: row[args.q.group] || row[_.head(args.q.fields as any[])] || '<- Blank ->',\n          column_name: args.q.group,\n          resolution: row.resolution,\n          stat: null\n        };\n\n        if (state.stat === 'count') {\n          statRow.stat = row.count;\n        } else {\n          statRow.stat = utils.formatFloatNumberComma(row[state.value + '_' + state.stat]);\n        }\n        if (fullColumn.type === 'percent') {\n          statRow.group_name = utils.formatPercent(statRow.group_name);\n        }\n        grouping.rows.push(statRow);\n      }\n      if (this.loader.dataLength !== this.loader.data.length) {\n        grouping.rows.push({ group_name : '...' });\n      }\n\n      this._viewData = grouping;\n      this.render();\n      this.$el.parent().scrollTop(this.state.scrollPosition);\n      this.state.scrollPosition = 0;\n    },\n    onDataLoading() {\n      this.$el.find('.js-recalculate').addClass('loading');\n    },\n  /** Handle when groupin is changed\n      @protected */\n    onGroupChange(column) {\n      this.state.group = column;\n      this.queryModel.setQuery(this.getQuery());\n      this.loader.clear();\n      this.loader.ensureData(0, 1);\n    // TODO tie this object into a Backbone element of Athena\n      (window as any).athena.filterMenu.open('groups', true);\n    },\n  /** @protected */\n    onSelectChange() {\n      this.queryModel.setQuery(this.getQuery());\n      this.loader.clear();\n      this.state.initialLoad = false;\n      this.loader.ensureData(0, 1);\n    },\n    onRecalculate(ev) {\n    // do not change when button is disabled\n      if ($(ev.target).is('.disabled')) {\n        return;\n      }\n      this.$el.find('.js-recalculate').addClass('disabled');\n      this.onSelectChange();\n      this.trigger('action', 'recalculate');\n\n    //  set previous stat on recalculate\n      this.previousStat = this.state.stat;\n    },\n    onQueryChange() {\n      //  Check if query is changed or the stat dropdown is changed\n      const diff = !_.isEqual(this.queryModel.toJSON(), this.getQuery()) || !_.isEqual(this.previousStat, this.state.stat);\n      this.$el.find('.js-select-group').toggleClass('aggregate-item_outdated', diff);\n      if (!this.state.initialLoad) {\n        this.$el.find('.js-recalculate').toggleClass('disabled', !diff);\n      }\n    },\n  /** @protected */\n    onGroupClick(e) {\n      const locale = this.grid.locale;\n      let data = $(e.currentTarget).data();\n      let fullColumn = _.find(this.options.columns, function(c: any) { return c.name === data.column; }) || {};\n      let eqVal;\n      let leVal;\n      let geVal;\n      switch (fullColumn.type) {\n      case 'text':\n        eqVal = data.group.toString();\n        break;\n      case 'date':\n        const formatter = utils.getInputFormatter(fullColumn, locale);\n        if (data.resolution === 'YYYY-MM-DD') {\n          eqVal = formatter(data.group.toString(), data.resolution);\n        } else {\n          geVal = formatter(data.group.toString(), data.resolution);\n          const dateSplit = data.group.toString().split('-');\n          dateSplit[dateSplit.length - 1] = (parseInt(dateSplit[dateSplit.length - 1], 10) + 1).toString();\n          leVal = formatter(dateSplit.join('-'), data.resolution);\n        }\n        break;\n      case 'monetary':\n      case 'numeric':\n        var resolution = (data.resolution === null || data.resolution === '') ? null : parseInt(data.resolution, 10);\n        var sign = resolution < 0 ? -1 : 1;\n        if (resolution === null) {\n          eqVal = parseFloat(data.group);\n        } else if (resolution === 0) {\n          eqVal = 0;\n        } else if (resolution === 1 || resolution === -1) {\n          leVal = sign < 0 ? 0 : 1;\n          geVal = sign < 0 ? -1 : 0;\n        } else {\n          leVal = sign * Math.pow(10, Math.abs(resolution) + (sign < 0 ? -2 : -1));\n          geVal = sign * Math.pow(10, Math.abs(resolution) + (sign < 0 ? -1 : -2));\n        }\n        break;\n      default:\n      // load more results\n        this.state.scrollPosition = this.$el.parent().scrollTop();\n        this.loader.ensureData(this.loader.dataLength, this.loader.dataLength + 1);\n        return;\n      }\n      this.grid.loader.queryModel.beginUpdate();\n      this.grid.loader.queryModel.filterColumn(data.column, 'contains', undefined);\n      this.grid.loader.queryModel.filterColumn(data.column, 'eq', eqVal);\n      this.grid.loader.queryModel.filterColumn(data.column, 'le', leVal);\n      this.grid.loader.queryModel.filterColumn(data.column, 'ge', geVal);\n      this.grid.loader.queryModel.endUpdate();\n      this.trigger('action', 'select-group');\n    },\n  /** Get query based on state */\n    getQuery() {\n      const q: any = _.extend(this.grid.loader.queryModel.toJSON(), {\n        fields: [this.state.value],\n        group: this.state.group,\n        sort: [{}]\n      });\n      const sorts = this.state.sort.split('-');\n      let sort_name = this.state.value + '_' + this.state.stat;\n      if (sorts[0] === 'name') {\n        sort_name = this.state.group;\n      } else if (this.state.stat === 'count') {\n        sort_name = 'count';\n      }\n\n      q.sort[0][sort_name] = sorts[1];\n      return q;\n    }\n  });\n\nexport default FacetPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/facetpanel.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from '../og';\nimport Backbone from 'backbone';\n\nexport default og.View.extend({\n  noEscape: false,\n\n  initialize(options) {\n    this.enabled = options.enabled || true;\n    this.enableAll = options.enableAll || false;\n    this.collection = this.collection || new Backbone.Collection(options.items);\n\n    if (options.noEscape) {\n      this.noEscape = this.options.noEscape;\n    }\n\n    if (options.selected || options.selected === 0) {\n      this.setValue(options.selected);\n    }\n\n    this.registerCloseItem();\n\n    this.listenTo(this.collection, 'reset', this.onItemsChange);\n  },\n\n  setItems(items) {\n    this.collection.reset(items);\n  },\n\n  onItemsChange() {\n    this.render();\n  },\n\n  close() {\n    this.isOpen = false;\n    this.$('.js-select').removeClass('active');\n  },\n\n  open() {\n    this.isOpen = true;\n    this.$('.js-select').addClass('active');\n  },\n\n  updateItem(id, attributes) {\n    this.collection.get(id).set(attributes);\n    this.onItemsChange();\n  },\n\n  setValue(id) {\n    const prevSelected = this.selected;\n    const newlySelected = this.collection.get(id);\n\n    if (newlySelected && newlySelected !== prevSelected) {\n      if (prevSelected) {\n        prevSelected.set('active', false);\n      }\n      newlySelected.set('active', true);\n      this.selected = newlySelected;\n      this.renderSelected();\n    }\n  },\n\n  renderSelected() {\n    const selected = this.selected;\n    const name = selected ? selected.get('name') : '';\n    const el = this.$('.js-select-selected');\n\n    this.noEscape ? el.html(name) : el.text(name);\n    this.$('.js-select-option').removeClass('active');\n    if (selected) {\n      this.$('.js-item_' + selected.id).addClass('active');\n    }\n  },\n\n  setTextSize(size) {\n    this.$('.js-select').toggleClass('has-small-text', size === 'small');\n  },\n\n  viewData() {\n    return _.assign({}, this, {items: this.collection.toJSON()});\n  },\n\n  render() {\n    og.View.prototype.render.call(this);\n    this.renderSelected();\n  },\n\n  events: {\n    'click .js-select': function(evt) {\n      if (!this.enabled) {\n        return;\n      }\n      this.selfClicked = true;\n      if ($(evt.currentTarget).hasClass('active')) {\n        this.close();\n      } else {\n        this.open();\n      }\n    },\n\n    'click .js-select-option': function(evt) {\n      const id = $(evt.currentTarget).data('val');\n      this.setValue(id);\n      this.trigger('change', id);\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/views/selector.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from '../../og';\nimport moment from 'moment';\nimport utils from '../utils';\nimport QueryModel from '../querymodel';\nimport SortSelector from '../../views/sort_selector';\nimport Datepicker from '../../griddle/bootstrap-datepicker';\n\nimport GridReportStore from '../../stores/grid_report_store';\n\nconst FiltersPanel = og.View.extend(\n  {\n    template: 'griddle/panel_filters',\n    placeholder: 'subpanel',\n    events: {\n      'click .js-remove': 'onFilterRemove',\n      'click .js-clear': 'onFilterClear',\n      'click .js-field': 'onFilterField',\n      'click .js-operator': 'onFilterOperator',\n      'keyup .js-value': 'onFilterInput',\n      'keyup .js-search-input': 'allKeyup',\n      'click .js-search-clear': 'onSearchClear',\n      'click .js-apply': 'setFilters'\n    },\n\n    queryModel: null,\n    grid: null,\n    labels: {\n      eq: 'equal to',\n      ne: 'not',\n      gt: 'greater than',\n      ge: 'at least',\n      lt: 'less than',\n      le: 'at most',\n      null: 'blank',\n      notnull: 'not blank',\n      contains: 'contains',\n      fy: 'fiscal year',\n      xyz: 'within last # of days',\n    },\n\n    columnFilters: {\n      default: ['eq', 'ne', 'ge', 'le', 'null', 'notnull'],\n      date: ['eq', 'ne', 'ge', 'le', 'null', 'notnull', 'xyz'], //add a special field for `date`, 'fy' field can be here\n      text: ['contains', 'eq', 'ne', 'null', 'notnull']\n    },\n\n    initialize(options) {\n      this.options = options || {};\n      _.bindAll(this, 'update', 'onFilterAdd', 'onFilterRemove', 'onFilterClear', 'onFilterField',\n      'onFilterOperator', 'onMenuSelect', 'setFilters', 'onFilterInput', 'removeFilter');\n      this._viewData = {};\n    },\n\n  /** Initialize the plugin, called by slicgrid when registering */\n    init(grid) {\n      this.queryModel = this.options.queryModel;\n      this.grid = grid;\n\n      this.listenTo(this.queryModel, 'change', this.update, this);\n      this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n\n    // we have extra querymodel to keep track of the internal filter state\n      this.stateQueryModel = new QueryModel();\n\n      this.update();\n    },\n\n  /** Destroy the plugin, called by slickgrid */\n    destroy() {\n      this.remove();\n    },\n\n    buildFilters() {\n      const locale = this.grid.locale;\n      const filters = [];\n      const qmFilters = this.queryModel._q.filter;\n\n      _.each(qmFilters, _.bind(function(filter, field) {\n        _.each(filter, _.bind(function(value, operator) {\n          if (field === 'all') {\n            return;\n          }\n          const column = this.getColumnById(field);\n\n          if (!column) {\n            return;\n          }\n\n          const f = {\n            field,\n            friendlyName: column.name,\n            operator,\n            value,\n            valueLabel: utils.getInputFormatter(column, locale)(value),\n            operatorLabel: this.labels[operator]\n          };\n          filters.push(f);\n        }, this));\n      }, this));\n\n      this._viewData.filters = filters;\n      this._viewData.searchAll = this.queryModel.getColumnQuery('all').filter.contains || '';\n\n      return filters;\n    },\n\n    updateFilterCount() {\n      const count = _.size(this.filters) + (this.queryModel.getColumnQuery('all').filter.contains ? 1 : 0);\n      $('#filter-annotation_filters').text(count || '');\n    },\n\n    update() {\n    // detect if a datepicker is shown and do not rerender if it is\n      let datepickerVisible = false;\n      this.$el.find('input').each(function() {\n        if ($(this).data('datepicker') && $(this).data('datepicker').picker.is(':visible')) {\n          datepickerVisible = true;\n        }\n      });\n      if (datepickerVisible) {\n        return;\n      }\n\n    // remove datepicker instances so they are not dangling in the DOM\n      this.$el.find('input').each(function() {\n        if ($(this).data('datepicker')) {\n          $(this).data('datepicker').picker.remove();\n        }\n      });\n\n      this.filters = this.buildFilters();\n      this.updateFilterCount();\n\n      this.render();\n    },\n\n    render() {\n      const sortedColumns = _.sortBy(_.map(this.grid.getAllColumns(), function(col: any, idx) {\n        return { id: idx, field: col.id, name: col.label, visible: col.visible };\n      }), 'name');\n      this.view('add_filter', new SortSelector({\n        className: 'select-box-wrapper_inline select-box-wrapper_center',\n        template: 'griddle/select_box',\n        placeholder: 'select_box',\n        items: sortedColumns\n      })).on('change', this.onFilterAdd, this);\n      this.updateDirtyness();\n      og.View.prototype.render.call(this);\n\n      this.$('.js-select-selected').text('Add New Filter');\n\n      _.each(this.filters, _.bind(function(filter, idx) {\n        this.updateItem(idx);\n      }, this));\n    },\n\n    allKeyup(ev) {\n      const inputValue = utils.strip($(ev.target).val());\n\n      this._viewData.searchAll = inputValue;\n\n      if (ev.which === 13) {\n        this.lastFocus = null;\n        this.setFilters();\n      } else {\n        this.setButtonsState();\n      }\n    },\n\n    onSearchClear() {\n      this.$('.js-search-input').val('');\n      this._viewData.searchAll = '';\n      this.setButtonsState();\n    },\n\n    getColumnById(id) {\n      return _.filter(this.grid.getAllColumns(), function(col: any) {\n        return col.id === id;\n      })[0];\n    },\n\n    getColumnChoices(id) {\n      const column = this.getColumnById(id);\n      return this.columnFilters[column.type] || this.columnFilters['default'];\n    },\n\n    setButtonsState() {\n      this.updateDirtyness();\n      $('.js-apply').toggleClass('disabled', this._viewData.applyDisabled);\n      $('.js-clear').toggleClass('disabled', this._viewData.clearDisabled);\n    },\n\n    updateDirtyness() {\n      this.setFilters(this.stateQueryModel);\n      this._viewData.applyDisabled = _.isEqual(this.queryModel.toJSON().filter, this.stateQueryModel.toJSON().filter);\n      this._viewData.clearDisabled = this.filters.length === 0 && !this._viewData.searchAll;\n    },\n\n    onFilterInput(ev) {\n      const locale = this.grid.locale;\n      const idx = this.getIndex(ev.target);\n      const filter = this.filters[idx];\n      const column = this.getColumnById(filter.field) || { type : 'text' };\n\n      if (filter.operator === 'fy' || filter.operator === 'xyz') {\n        filter.valueLabel = filter.value = $(ev.target).val();\n      } else {\n        filter.value = utils.parseValue(utils.strip($(ev.target).val()), column.type);\n        filter.valueLabel = utils.getInputFormatter(column, locale)(filter.value);\n      }\n\n      this.lastFocus = filter;\n\n      if (ev.which === 13) {\n        this.lastFocus = null;\n        this.setFilters();\n      } else {\n        this.setButtonsState();\n      }\n    },\n\n    onFilterAdd(idx) {\n      const name = this.view('add_filter').collection.get(idx).get('field');\n      const friendlyName = this.view('add_filter').collection.get(idx).get('name');\n      const operator = this.getColumnChoices(name)[0];\n\n      const val = {\n        field: name,\n        friendlyName,\n        operator,\n        value: '',\n        operatorLabel: this.labels[operator]\n      };\n\n      this.lastFocus = val;\n      this.filters.push(val);\n      this.render();\n      this.trigger('action', 'filter-add', name);\n    },\n\n    onFilterRemove(ev) {\n      const idx = this.getIndex(ev.target);\n      this.removeFilter(idx, false);\n    },\n\n    removeFilter(idx, callSetFilter) {\n      const filter = this.filters[idx];\n      if (filter.allField) {\n        filter.value = '';\n        filter.valueLabel = '';\n      } else {\n        this.filters.splice(idx, 1);\n      }\n      this.lastFocus = null;\n      this.render();\n      this.trigger('action', 'filter-remove', filter.field);\n      if (callSetFilter) {\n        this.setFilters();\n      }\n    },\n\n    onFilterClear() {\n      this.lastFocus = null;\n      this.queryModel.filterClear();\n      this.filters = this.buildFilters();\n      this.render();\n      this.trigger('action', 'clear-all');\n    },\n\n    onFilterField(ev) {\n      this.currentSelection = {\n        idx: this.getIndex(ev.target),\n        target: 'field'\n      };\n      const choices = _.sortBy(_.map(this.grid.getAllColumns(), function(col: any) {\n        return {\n          value: col.id,\n          label: col.label,\n          visible: col.visible\n        };\n      }), 'label');\n      this.createMenu(choices, ev.target);\n      this.lastFocus = this.filters[this.currentSelection.idx];\n    },\n\n    onFilterOperator(ev) {\n      this.currentSelection = {\n        idx: this.getIndex(ev.target),\n        target: 'operator'\n      };\n      let self = this;\n      let choices = this.getColumnChoices(this.filters[this.currentSelection.idx].field);\n\n      choices = _.map(choices, function(x: any) {\n        return {\n          value: x,\n          label: self.labels[x]\n        };\n      });\n      this.createMenu(choices, ev.target);\n      this.lastFocus = this.filters[this.currentSelection.idx];\n    },\n\n    onMenuSelect(ev) {\n      const sel = this.currentSelection;\n      const filter = this.filters[sel.idx];\n      const oldColumn = this.getColumnById(filter.field);\n\n      filter[sel.target] = $(ev.target).data('value');\n      const column = this.getColumnById(filter.field);\n\n      if (column.type !== oldColumn.type) {\n      // unset value of different types\n        filter.valueLabel = filter.value = '';\n      }\n\n      const choices = this.getColumnChoices(filter.field);\n      // make sure given field supports selected operator, otherwise set default one\n      if (_.indexOf(choices, filter.operator) === -1) {\n        filter.operator = choices[0];\n      }\n      filter.operatorLabel = this.labels[filter.operator];\n\n      filter.friendlyName = column.label; //Updating the friendlyName; Move this to where does filter.field gets updated.\n      this.hideMenu();\n      this.render();\n    },\n\n    getIndex(el) {\n      return $(el).closest('.js-filter').data('index');\n    },\n\n    setFilters(customQueryModel) {\n      const qm = customQueryModel instanceof QueryModel ? customQueryModel : this.queryModel;\n      qm.beginUpdate();\n      qm.filterClear();\n      _.each(this.filters, _.bind(function(f) {\n        if (f.operator === 'null' || f.operator === 'notnull') {\n          f.value = true;\n        } else if (f.value === true || f.value === false) {\n        // This prevents a `true` or `false` from displaying in the search field when not filtering against blanks\n          f.valueLabel = f.value = null;\n        }\n\n        if (f.operator === 'xyz' && f.value) {\n          const end = moment().subtract(f.value, 'days').format('YYYY-MM-DD');\n          const today = moment().format('YYYY-MM-DD');\n          qm.filterColumn(f.field, 'ge', end);\n          qm.filterColumn(f.field, 'le', today);\n        } else if (f.operator === 'fy' && f.value) {\n          const fiscalYearStartMonth = GridReportStore.getState().getIn(['schema', 'fiscalYearStartMonth']);\n          const start = fiscalYearStartMonth === 1 ? moment(f.value, 'YYYY') : moment().set({year: f.value - 1, month:fiscalYearStartMonth - 1});\n          const end = moment(start).add(12, 'months').subtract(1, 'day');\n\n          // Believe that it is not possible to have 2 updates at once...\n          qm.filterColumn(f.field, 'le', end.format('YYYY-MM-DD'));\n          qm.filterColumn(f.field, 'ge', start.format('YYYY-MM-DD'));\n        } else {\n          qm.filterColumn(f.field, f.operator, f.value);\n        }\n      }, this));\n      qm.filterColumn('all', 'contains', this._viewData.searchAll);\n      qm.endUpdate();\n    },\n\n    createMenu(choices, el) {\n      const self = this;\n\n      this.hideMenu();\n      this.menu = $('<div class=\"ui-dropdown__target ready\"></div>');\n\n      _.each(choices, function(choice) {\n        $('<button class=\"dropdown__row js-select-option\"></button>').data('value', choice.value).text(choice.label).appendTo(self.menu).toggleClass('is-visible', choice.visible);\n      });\n\n    // Setup handler to close menu when clicking anywhrere in the window\n    // setTimeout hack is used to prevent firing with current event\n      _.defer(function() {\n        $('body').one('click', function(ev) {\n          if ($(ev.target).is('.js-field') || $(ev.target).is('.js-operator')) {\n            return;\n          }\n          self.hideMenu();\n        });\n      });\n\n      this.menu\n      .appendTo(this.$(el))\n      .on('click', '.js-select-option', this.onMenuSelect)\n      .addClass('open');\n    },\n\n    updateItem(idx) {\n      let self = this;\n      let el = this.$el.find('.js-filter').eq(idx);\n      let filter = this.filters[idx];\n      let columnType;\n      let isNull;\n      let input;\n\n      columnType = this.getColumnById(filter.field).type;\n      isNull = filter.operator === 'null' || filter.operator === 'notnull';\n      input = el.find('.js-value');\n\n      if (this.lastFocus && this.lastFocus.field === filter.field && this.lastFocus.operator === filter.operator) {\n        this.setFocus(input);\n      }\n\n      input[isNull ? 'hide' : 'show']();\n\n      // Show or hide the 'is' qualifier\n      el.find('.filter-item__is')[filter.operator === 'contains' ? 'hide' : 'show']();\n      if (filter.operator === 'xyz') {\n        this.$('.filter-item__input.js-value')[0].placeholder = 'Number of Days';\n        return;\n      }\n\n      if (filter.operator === 'fy') return;\n\n      if (columnType === 'date') {\n        const locale = this.grid.locale;\n        (Datepicker as any).create(input, {\n          viewMode: 'years',\n          locale: locale\n        }).data('datepicker').hide();\n        input\n        .on('changeDate', function(ev) {\n          const viewPeriod = ev.viewMode.replace(/s$/, '');\n          const m = moment(new Date(ev.date)).startOf(viewPeriod);\n          m.locale(locale);\n          const value = m.format(utils.DATE_FORMAT);\n\n          $(this).data('datepicker').setValue(value);\n          $(this).val(value);\n\n          if (ev.viewMode === 'days') {\n            $(this).data('datepicker').hide();\n          }\n          const idx = self.getIndex(ev.target);\n          const filter = self.filters[idx];\n\n          // The current backend is expecting en_US formatted Dates\n          const enDate = m.locale('en_US');\n\n          filter.value = enDate.format('YYYY-MM-DD');\n          filter.valueLabel = value;\n          self.setButtonsState();\n        });\n\n        if (!isNull) {\n          input.after($('<span class=\"datepicker-handle icon-calendar-1\"></span>').on('click', function() {\n            $(this).prev().data('datepicker').show();\n          }));\n        }\n      }\n    },\n\n    hideMenu() {\n      if (this.menu) {\n        this.menu.remove();\n        this.menu = null;\n      }\n    },\n\n    setFocus(input) {\n      _.defer(function() {\n      // trick with setting empty value is to make the cursor appear at the end of the input\n        const value = input.val();\n        input.focus().val('').val(value);\n      });\n    }\n  });\n\nexport default FiltersPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/filterspanel.ts","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as og from '../../og';\nimport utils from '../utils';\nimport SortSelector from '../../views/sort_selector';\nimport dragula from 'dragula';\n/** @class ColumnsPanel */\nconst ColumnsPanel = og.View.extend(\n/** @lends ColumnsPanel# */\n  {\n    template: 'griddle/panel_columns',\n    placeholder: 'subpanel',\n    events: {\n      'click .js-column-toggle': 'handleClick',\n      'click .subpanel_selectall': 'handleClickAll'\n    },\n\n  /** Initialize the plugin, called by slicgrid when registering */\n    init(grid) {\n      this.grid = grid;\n\n      this.sorts = [\n        {id: 'name-asc', name: 'Sort A-Z', comp: utils.stringComparator},\n        {id: 'name-desc', name: 'Sort Z-A', comp: utils.stringComparatorReverse},\n        // this doesn't have a comparator because the report is already in the right order\n        {id: 'report-order', name: 'Sort by order of the report'}\n      ];\n\n      this.sortId = this.sorts[0].id;\n\n      const sortSelector = this.view('column_sort', new SortSelector({\n        template: 'griddle/select_box',\n        placeholder: 'select_box',\n        selected: this.sortId,\n        items: this.sorts,\n        enableAll: true\n      }));\n\n      this.listenTo(sortSelector, 'change', this.applySort, this);\n\n      this.listenTo(this.grid, 'columnsVisibilityChanged', this.render, this);\n\n      this.render();\n    },\n\n    render() {\n      og.View.prototype.render.call(this);\n      this.afterRender();\n    },\n\n  /** Destroy the plugin, called by slickgrid */\n    destroy() {\n      this.remove();\n    },\n\n    applySort(sortId) {\n      this.sortId = sortId || this.sortId;\n      this.sortable = sortId === 'report-order';\n      this.template = this.sortable ? 'griddle/panel_columns_sortable' : 'griddle/panel_columns';\n      this.render();\n      this.trigger('action', 'change-sorting');\n    },\n\n    viewData(data) {\n      if (data) {\n        this._viewData = data;\n        return;\n      }\n\n      if (this._viewData) {\n        const sort: any = _.find(this.sorts, {'id': this.sortId});\n        const cols: any = _.map(this.grid.getAllColumns(), (c) => {\n          return _.pick(c, 'id', 'label', 'visible', 'isRequired');\n        });\n        // only sort if there is a comparator, some sorts don't\n        if (sort.comp) {\n          cols.sort(sort.comp);\n        }\n        this._viewData.columns = cols;\n        this._viewData.fixedColumns = cols.filter(col => col.visible);\n        this._viewData.auxColumns = cols.filter(col => !col.visible);\n        this._viewData.sortable = this.sortable;\n\n        return this._viewData;\n      }\n\n      return this;\n    },\n\n    afterRender() {\n    // make the columns sortable, if they should be\n      if (this.sortable) {\n        const columns = dragula({\n          containers: [this.el.querySelector('.sortable-items')],\n          direction: 'vertical'\n        });\n        columns.on('drag', el => $(el).addClass('drop-item__dragged'));\n        columns.on('drop', el => {\n          $(el).removeClass('drop-item__dragged');\n          const order = $(el).parent().children().map((index, element) => element.attributes['data-column'].value);\n          this.grid.reorderColumns(order.toArray());\n        });\n      }\n    },\n\n  /**\n   * @param {Event} ev\n   * @protected\n   */\n    handleClick(ev) {\n      const el = $(ev.currentTarget);\n      const columnId = el.data('column');\n      this.grid.toggleColumnVisibility(columnId);\n      this.trigger('action', 'click-column', columnId);\n    },\n\n    handleClickAll() {\n      const grid = this.grid;\n      //deselect-all if all are selected. Select-all if all are de-selected.\n      //this.grid.auxColumns and this.grid.fixedColumns is undefined if nothing is selected\n      if (this.grid.auxColumns === undefined || this.grid.fixedColumns === undefined) {\n        grid.toggleAllColumnVisibility(this.grid.getAllColumns());\n        return;\n      }\n      //select the de-selected column if anyone selected\n      //this.grid.auxColumns is not undefined if anyone is selected\n      const columnIds = [];\n      if (this.grid.auxColumns) {\n        _.each(this.grid.auxColumns, function(column) {\n          columnIds.push(column.id);\n        });\n        grid.toggleAllColumnVisibility(columnIds);\n      }\n    }\n  });\n\nexport default ColumnsPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/querygrid/plugins/columnspanel.ts","'use strict';\n\nvar emitter = require('contra/emitter');\nvar crossvent = require('crossvent');\nvar classes = require('./classes');\nvar doc = document;\nvar documentElement = doc.documentElement;\n\nfunction dragula (initialContainers, options) {\n  var len = arguments.length;\n  if (len === 1 && Array.isArray(initialContainers) === false) {\n    options = initialContainers;\n    initialContainers = [];\n  }\n  var _mirror; // mirror image\n  var _source; // source container\n  var _item; // item being dragged\n  var _offsetX; // reference x\n  var _offsetY; // reference y\n  var _moveX; // reference move x\n  var _moveY; // reference move y\n  var _initialSibling; // reference sibling when grabbed\n  var _currentSibling; // reference sibling now\n  var _copy; // item used for copying\n  var _renderTimer; // timer for setTimeout renderMirrorImage\n  var _lastDropTarget = null; // last container item was over\n  var _grabbed; // holds mousedown context until first mousemove\n\n  var o = options || {};\n  if (o.moves === void 0) { o.moves = always; }\n  if (o.accepts === void 0) { o.accepts = always; }\n  if (o.invalid === void 0) { o.invalid = invalidTarget; }\n  if (o.containers === void 0) { o.containers = initialContainers || []; }\n  if (o.isContainer === void 0) { o.isContainer = never; }\n  if (o.copy === void 0) { o.copy = false; }\n  if (o.copySortSource === void 0) { o.copySortSource = false; }\n  if (o.revertOnSpill === void 0) { o.revertOnSpill = false; }\n  if (o.removeOnSpill === void 0) { o.removeOnSpill = false; }\n  if (o.direction === void 0) { o.direction = 'vertical'; }\n  if (o.ignoreInputTextSelection === void 0) { o.ignoreInputTextSelection = true; }\n  if (o.mirrorContainer === void 0) { o.mirrorContainer = doc.body; }\n\n  var drake = emitter({\n    containers: o.containers,\n    start: manualStart,\n    end: end,\n    cancel: cancel,\n    remove: remove,\n    destroy: destroy,\n    canMove: canMove,\n    dragging: false\n  });\n\n  if (o.removeOnSpill === true) {\n    drake.on('over', spillOver).on('out', spillOut);\n  }\n\n  events();\n\n  return drake;\n\n  function isContainer (el) {\n    return drake.containers.indexOf(el) !== -1 || o.isContainer(el);\n  }\n\n  function events (remove) {\n    var op = remove ? 'remove' : 'add';\n    touchy(documentElement, op, 'mousedown', grab);\n    touchy(documentElement, op, 'mouseup', release);\n  }\n\n  function eventualMovements (remove) {\n    var op = remove ? 'remove' : 'add';\n    touchy(documentElement, op, 'mousemove', startBecauseMouseMoved);\n  }\n\n  function movements (remove) {\n    var op = remove ? 'remove' : 'add';\n    crossvent[op](documentElement, 'selectstart', preventGrabbed); // IE8\n    crossvent[op](documentElement, 'click', preventGrabbed);\n  }\n\n  function destroy () {\n    events(true);\n    release({});\n  }\n\n  function preventGrabbed (e) {\n    if (_grabbed) {\n      e.preventDefault();\n    }\n  }\n\n  function grab (e) {\n    _moveX = e.clientX;\n    _moveY = e.clientY;\n\n    var ignore = whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey;\n    if (ignore) {\n      return; // we only care about honest-to-god left clicks and touch events\n    }\n    var item = e.target;\n    var context = canStart(item);\n    if (!context) {\n      return;\n    }\n    _grabbed = context;\n    eventualMovements();\n    if (e.type === 'mousedown') {\n      if (isInput(item)) { // see also: https://github.com/bevacqua/dragula/issues/208\n        item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176\n      } else {\n        e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155\n      }\n    }\n  }\n\n  function startBecauseMouseMoved (e) {\n    if (!_grabbed) {\n      return;\n    }\n    if (whichMouseButton(e) === 0) {\n      release({});\n      return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope\n    }\n    // truthy check fixes #239, equality fixes #207\n    if (e.clientX !== void 0 && e.clientX === _moveX && e.clientY !== void 0 && e.clientY === _moveY) {\n      return;\n    }\n    if (o.ignoreInputTextSelection) {\n      var clientX = getCoord('clientX', e);\n      var clientY = getCoord('clientY', e);\n      var elementBehindCursor = doc.elementFromPoint(clientX, clientY);\n      if (isInput(elementBehindCursor)) {\n        return;\n      }\n    }\n\n    var grabbed = _grabbed; // call to end() unsets _grabbed\n    eventualMovements(true);\n    movements();\n    end();\n    start(grabbed);\n\n    var offset = getOffset(_item);\n    _offsetX = getCoord('pageX', e) - offset.left;\n    _offsetY = getCoord('pageY', e) - offset.top;\n\n    classes.add(_copy || _item, 'gu-transit');\n    renderMirrorImage();\n    drag(e);\n  }\n\n  function canStart (item) {\n    if (drake.dragging && _mirror) {\n      return;\n    }\n    if (isContainer(item)) {\n      return; // don't drag container itself\n    }\n    var handle = item;\n    while (getParent(item) && isContainer(getParent(item)) === false) {\n      if (o.invalid(item, handle)) {\n        return;\n      }\n      item = getParent(item); // drag target should be a top element\n      if (!item) {\n        return;\n      }\n    }\n    var source = getParent(item);\n    if (!source) {\n      return;\n    }\n    if (o.invalid(item, handle)) {\n      return;\n    }\n\n    var movable = o.moves(item, source, handle, nextEl(item));\n    if (!movable) {\n      return;\n    }\n\n    return {\n      item: item,\n      source: source\n    };\n  }\n\n  function canMove (item) {\n    return !!canStart(item);\n  }\n\n  function manualStart (item) {\n    var context = canStart(item);\n    if (context) {\n      start(context);\n    }\n  }\n\n  function start (context) {\n    if (isCopy(context.item, context.source)) {\n      _copy = context.item.cloneNode(true);\n      drake.emit('cloned', _copy, context.item, 'copy');\n    }\n\n    _source = context.source;\n    _item = context.item;\n    _initialSibling = _currentSibling = nextEl(context.item);\n\n    drake.dragging = true;\n    drake.emit('drag', _item, _source);\n  }\n\n  function invalidTarget () {\n    return false;\n  }\n\n  function end () {\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    drop(item, getParent(item));\n  }\n\n  function ungrab () {\n    _grabbed = false;\n    eventualMovements(true);\n    movements(true);\n  }\n\n  function release (e) {\n    ungrab();\n\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    var clientX = getCoord('clientX', e);\n    var clientY = getCoord('clientY', e);\n    var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY);\n    var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY);\n    if (dropTarget && ((_copy && o.copySortSource) || (!_copy || dropTarget !== _source))) {\n      drop(item, dropTarget);\n    } else if (o.removeOnSpill) {\n      remove();\n    } else {\n      cancel();\n    }\n  }\n\n  function drop (item, target) {\n    var parent = getParent(item);\n    if (_copy && o.copySortSource && target === _source) {\n      parent.removeChild(_item);\n    }\n    if (isInitialPlacement(target)) {\n      drake.emit('cancel', item, _source, _source);\n    } else {\n      drake.emit('drop', item, target, _source, _currentSibling);\n    }\n    cleanup();\n  }\n\n  function remove () {\n    if (!drake.dragging) {\n      return;\n    }\n    var item = _copy || _item;\n    var parent = getParent(item);\n    if (parent) {\n      parent.removeChild(item);\n    }\n    drake.emit(_copy ? 'cancel' : 'remove', item, parent, _source);\n    cleanup();\n  }\n\n  function cancel (revert) {\n    if (!drake.dragging) {\n      return;\n    }\n    var reverts = arguments.length > 0 ? revert : o.revertOnSpill;\n    var item = _copy || _item;\n    var parent = getParent(item);\n    var initial = isInitialPlacement(parent);\n    if (initial === false && reverts) {\n      if (_copy) {\n        if (parent) {\n          parent.removeChild(_copy);\n        }\n      } else {\n        _source.insertBefore(item, _initialSibling);\n      }\n    }\n    if (initial || reverts) {\n      drake.emit('cancel', item, _source, _source);\n    } else {\n      drake.emit('drop', item, parent, _source, _currentSibling);\n    }\n    cleanup();\n  }\n\n  function cleanup () {\n    var item = _copy || _item;\n    ungrab();\n    removeMirrorImage();\n    if (item) {\n      classes.rm(item, 'gu-transit');\n    }\n    if (_renderTimer) {\n      clearTimeout(_renderTimer);\n    }\n    drake.dragging = false;\n    if (_lastDropTarget) {\n      drake.emit('out', item, _lastDropTarget, _source);\n    }\n    drake.emit('dragend', item);\n    _source = _item = _copy = _initialSibling = _currentSibling = _renderTimer = _lastDropTarget = null;\n  }\n\n  function isInitialPlacement (target, s) {\n    var sibling;\n    if (s !== void 0) {\n      sibling = s;\n    } else if (_mirror) {\n      sibling = _currentSibling;\n    } else {\n      sibling = nextEl(_copy || _item);\n    }\n    return target === _source && sibling === _initialSibling;\n  }\n\n  function findDropTarget (elementBehindCursor, clientX, clientY) {\n    var target = elementBehindCursor;\n    while (target && !accepted()) {\n      target = getParent(target);\n    }\n    return target;\n\n    function accepted () {\n      var droppable = isContainer(target);\n      if (droppable === false) {\n        return false;\n      }\n\n      var immediate = getImmediateChild(target, elementBehindCursor);\n      var reference = getReference(target, immediate, clientX, clientY);\n      var initial = isInitialPlacement(target, reference);\n      if (initial) {\n        return true; // should always be able to drop it right back where it was\n      }\n      return o.accepts(_item, target, _source, reference);\n    }\n  }\n\n  function drag (e) {\n    if (!_mirror) {\n      return;\n    }\n    e.preventDefault();\n\n    var clientX = getCoord('clientX', e);\n    var clientY = getCoord('clientY', e);\n    var x = clientX - _offsetX;\n    var y = clientY - _offsetY;\n\n    _mirror.style.left = x + 'px';\n    _mirror.style.top = y + 'px';\n\n    var item = _copy || _item;\n    var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY);\n    var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY);\n    var changed = dropTarget !== null && dropTarget !== _lastDropTarget;\n    if (changed || dropTarget === null) {\n      out();\n      _lastDropTarget = dropTarget;\n      over();\n    }\n    var parent = getParent(item);\n    if (dropTarget === _source && _copy && !o.copySortSource) {\n      if (parent) {\n        parent.removeChild(item);\n      }\n      return;\n    }\n    var reference;\n    var immediate = getImmediateChild(dropTarget, elementBehindCursor);\n    if (immediate !== null) {\n      reference = getReference(dropTarget, immediate, clientX, clientY);\n    } else if (o.revertOnSpill === true && !_copy) {\n      reference = _initialSibling;\n      dropTarget = _source;\n    } else {\n      if (_copy && parent) {\n        parent.removeChild(item);\n      }\n      return;\n    }\n    if (\n      (reference === null && changed) ||\n      reference !== item &&\n      reference !== nextEl(item)\n    ) {\n      _currentSibling = reference;\n      dropTarget.insertBefore(item, reference);\n      drake.emit('shadow', item, dropTarget, _source);\n    }\n    function moved (type) { drake.emit(type, item, _lastDropTarget, _source); }\n    function over () { if (changed) { moved('over'); } }\n    function out () { if (_lastDropTarget) { moved('out'); } }\n  }\n\n  function spillOver (el) {\n    classes.rm(el, 'gu-hide');\n  }\n\n  function spillOut (el) {\n    if (drake.dragging) { classes.add(el, 'gu-hide'); }\n  }\n\n  function renderMirrorImage () {\n    if (_mirror) {\n      return;\n    }\n    var rect = _item.getBoundingClientRect();\n    _mirror = _item.cloneNode(true);\n    _mirror.style.width = getRectWidth(rect) + 'px';\n    _mirror.style.height = getRectHeight(rect) + 'px';\n    classes.rm(_mirror, 'gu-transit');\n    classes.add(_mirror, 'gu-mirror');\n    o.mirrorContainer.appendChild(_mirror);\n    touchy(documentElement, 'add', 'mousemove', drag);\n    classes.add(o.mirrorContainer, 'gu-unselectable');\n    drake.emit('cloned', _mirror, _item, 'mirror');\n  }\n\n  function removeMirrorImage () {\n    if (_mirror) {\n      classes.rm(o.mirrorContainer, 'gu-unselectable');\n      touchy(documentElement, 'remove', 'mousemove', drag);\n      getParent(_mirror).removeChild(_mirror);\n      _mirror = null;\n    }\n  }\n\n  function getImmediateChild (dropTarget, target) {\n    var immediate = target;\n    while (immediate !== dropTarget && getParent(immediate) !== dropTarget) {\n      immediate = getParent(immediate);\n    }\n    if (immediate === documentElement) {\n      return null;\n    }\n    return immediate;\n  }\n\n  function getReference (dropTarget, target, x, y) {\n    var horizontal = o.direction === 'horizontal';\n    var reference = target !== dropTarget ? inside() : outside();\n    return reference;\n\n    function outside () { // slower, but able to figure out any position\n      var len = dropTarget.children.length;\n      var i;\n      var el;\n      var rect;\n      for (i = 0; i < len; i++) {\n        el = dropTarget.children[i];\n        rect = el.getBoundingClientRect();\n        if (horizontal && (rect.left + rect.width / 2) > x) { return el; }\n        if (!horizontal && (rect.top + rect.height / 2) > y) { return el; }\n      }\n      return null;\n    }\n\n    function inside () { // faster, but only available if dropped inside a child element\n      var rect = target.getBoundingClientRect();\n      if (horizontal) {\n        return resolve(x > rect.left + getRectWidth(rect) / 2);\n      }\n      return resolve(y > rect.top + getRectHeight(rect) / 2);\n    }\n\n    function resolve (after) {\n      return after ? nextEl(target) : target;\n    }\n  }\n\n  function isCopy (item, container) {\n    return typeof o.copy === 'boolean' ? o.copy : o.copy(item, container);\n  }\n}\n\nfunction touchy (el, op, type, fn) {\n  var touch = {\n    mouseup: 'touchend',\n    mousedown: 'touchstart',\n    mousemove: 'touchmove'\n  };\n  var pointers = {\n    mouseup: 'pointerup',\n    mousedown: 'pointerdown',\n    mousemove: 'pointermove'\n  };\n  var microsoft = {\n    mouseup: 'MSPointerUp',\n    mousedown: 'MSPointerDown',\n    mousemove: 'MSPointerMove'\n  };\n  if (global.navigator.pointerEnabled) {\n    crossvent[op](el, pointers[type], fn);\n  } else if (global.navigator.msPointerEnabled) {\n    crossvent[op](el, microsoft[type], fn);\n  } else {\n    crossvent[op](el, touch[type], fn);\n    crossvent[op](el, type, fn);\n  }\n}\n\nfunction whichMouseButton (e) {\n  if (e.touches !== void 0) { return e.touches.length; }\n  if (e.which !== void 0 && e.which !== 0) { return e.which; } // see https://github.com/bevacqua/dragula/issues/261\n  if (e.buttons !== void 0) { return e.buttons; }\n  var button = e.button;\n  if (button !== void 0) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575\n    return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0);\n  }\n}\n\nfunction getOffset (el) {\n  var rect = el.getBoundingClientRect();\n  return {\n    left: rect.left + getScroll('scrollLeft', 'pageXOffset'),\n    top: rect.top + getScroll('scrollTop', 'pageYOffset')\n  };\n}\n\nfunction getScroll (scrollProp, offsetProp) {\n  if (typeof global[offsetProp] !== 'undefined') {\n    return global[offsetProp];\n  }\n  if (documentElement.clientHeight) {\n    return documentElement[scrollProp];\n  }\n  return doc.body[scrollProp];\n}\n\nfunction getElementBehindPoint (point, x, y) {\n  var p = point || {};\n  var state = p.className;\n  var el;\n  p.className += ' gu-hide';\n  el = doc.elementFromPoint(x, y);\n  p.className = state;\n  return el;\n}\n\nfunction never () { return false; }\nfunction always () { return true; }\nfunction getRectWidth (rect) { return rect.width || (rect.right - rect.left); }\nfunction getRectHeight (rect) { return rect.height || (rect.bottom - rect.top); }\nfunction getParent (el) { return el.parentNode === doc ? null : el.parentNode; }\nfunction isInput (el) { return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el); }\nfunction isEditable (el) {\n  if (!el) { return false; } // no parents were editable\n  if (el.contentEditable === 'false') { return false; } // stop the lookup\n  if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain\n  return isEditable(getParent(el)); // contentEditable is set to 'inherit'\n}\n\nfunction nextEl (el) {\n  return el.nextElementSibling || manually();\n  function manually () {\n    var sibling = el;\n    do {\n      sibling = sibling.nextSibling;\n    } while (sibling && sibling.nodeType !== 1);\n    return sibling;\n  }\n}\n\nfunction getEventHost (e) {\n  // on touchend event, we have to use `e.changedTouches`\n  // see http://stackoverflow.com/questions/7192563/touchend-event-properties\n  // see https://github.com/bevacqua/dragula/issues/34\n  if (e.targetTouches && e.targetTouches.length) {\n    return e.targetTouches[0];\n  }\n  if (e.changedTouches && e.changedTouches.length) {\n    return e.changedTouches[0];\n  }\n  return e;\n}\n\nfunction getCoord (coord, e) {\n  var host = getEventHost(e);\n  var missMap = {\n    pageX: 'clientX', // IE8\n    pageY: 'clientY' // IE8\n  };\n  if (coord in missMap && !(coord in host) && missMap[coord] in host) {\n    coord = missMap[coord];\n  }\n  return host[coord];\n}\n\nmodule.exports = dragula;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dragula/dragula.js\n// module id = 946\n// module chunks = 0 1","'use strict';\n\nvar atoa = require('atoa');\nvar debounce = require('./debounce');\n\nmodule.exports = function emitter (thing, options) {\n  var opts = options || {};\n  var evt = {};\n  if (thing === undefined) { thing = {}; }\n  thing.on = function (type, fn) {\n    if (!evt[type]) {\n      evt[type] = [fn];\n    } else {\n      evt[type].push(fn);\n    }\n    return thing;\n  };\n  thing.once = function (type, fn) {\n    fn._once = true; // thing.off(fn) still works!\n    thing.on(type, fn);\n    return thing;\n  };\n  thing.off = function (type, fn) {\n    var c = arguments.length;\n    if (c === 1) {\n      delete evt[type];\n    } else if (c === 0) {\n      evt = {};\n    } else {\n      var et = evt[type];\n      if (!et) { return thing; }\n      et.splice(et.indexOf(fn), 1);\n    }\n    return thing;\n  };\n  thing.emit = function () {\n    var args = atoa(arguments);\n    return thing.emitterSnapshot(args.shift()).apply(this, args);\n  };\n  thing.emitterSnapshot = function (type) {\n    var et = (evt[type] || []).slice(0);\n    return function () {\n      var args = atoa(arguments);\n      var ctx = this || thing;\n      if (type === 'error' && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; }\n      et.forEach(function emitter (listen) {\n        if (opts.async) { debounce(listen, args, ctx); } else { listen.apply(ctx, args); }\n        if (listen._once) { thing.off(type, listen); }\n      });\n      return thing;\n    };\n  };\n  return thing;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/contra/emitter.js\n// module id = 947\n// module chunks = 0 1","module.exports = function atoa (a, n) { return Array.prototype.slice.call(a, n); }\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/atoa/atoa.js\n// module id = 948\n// module chunks = 0 1","'use strict';\n\nvar ticky = require('ticky');\n\nmodule.exports = function debounce (fn, args, ctx) {\n  if (!fn) { return; }\n  ticky(function run () {\n    fn.apply(ctx || null, args || []);\n  });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/contra/debounce.js\n// module id = 949\n// module chunks = 0 1","var si = typeof setImmediate === 'function', tick;\nif (si) {\n  tick = function (fn) { setImmediate(fn); };\n} else {\n  tick = function (fn) { setTimeout(fn, 0); };\n}\n\nmodule.exports = tick;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ticky/ticky-browser.js\n// module id = 950\n// module chunks = 0 1","'use strict';\n\nvar customEvent = require('custom-event');\nvar eventmap = require('./eventmap');\nvar doc = global.document;\nvar addEvent = addEventEasy;\nvar removeEvent = removeEventEasy;\nvar hardCache = [];\n\nif (!global.addEventListener) {\n  addEvent = addEventHard;\n  removeEvent = removeEventHard;\n}\n\nmodule.exports = {\n  add: addEvent,\n  remove: removeEvent,\n  fabricate: fabricateEvent\n};\n\nfunction addEventEasy (el, type, fn, capturing) {\n  return el.addEventListener(type, fn, capturing);\n}\n\nfunction addEventHard (el, type, fn) {\n  return el.attachEvent('on' + type, wrap(el, type, fn));\n}\n\nfunction removeEventEasy (el, type, fn, capturing) {\n  return el.removeEventListener(type, fn, capturing);\n}\n\nfunction removeEventHard (el, type, fn) {\n  var listener = unwrap(el, type, fn);\n  if (listener) {\n    return el.detachEvent('on' + type, listener);\n  }\n}\n\nfunction fabricateEvent (el, type, model) {\n  var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent();\n  if (el.dispatchEvent) {\n    el.dispatchEvent(e);\n  } else {\n    el.fireEvent('on' + type, e);\n  }\n  function makeClassicEvent () {\n    var e;\n    if (doc.createEvent) {\n      e = doc.createEvent('Event');\n      e.initEvent(type, true, true);\n    } else if (doc.createEventObject) {\n      e = doc.createEventObject();\n    }\n    return e;\n  }\n  function makeCustomEvent () {\n    return new customEvent(type, { detail: model });\n  }\n}\n\nfunction wrapperFactory (el, type, fn) {\n  return function wrapper (originalEvent) {\n    var e = originalEvent || global.event;\n    e.target = e.target || e.srcElement;\n    e.preventDefault = e.preventDefault || function preventDefault () { e.returnValue = false; };\n    e.stopPropagation = e.stopPropagation || function stopPropagation () { e.cancelBubble = true; };\n    e.which = e.which || e.keyCode;\n    fn.call(el, e);\n  };\n}\n\nfunction wrap (el, type, fn) {\n  var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn);\n  hardCache.push({\n    wrapper: wrapper,\n    element: el,\n    type: type,\n    fn: fn\n  });\n  return wrapper;\n}\n\nfunction unwrap (el, type, fn) {\n  var i = find(el, type, fn);\n  if (i) {\n    var wrapper = hardCache[i].wrapper;\n    hardCache.splice(i, 1); // free up a tad of memory\n    return wrapper;\n  }\n}\n\nfunction find (el, type, fn) {\n  var i, item;\n  for (i = 0; i < hardCache.length; i++) {\n    item = hardCache[i];\n    if (item.element === el && item.type === type && item.fn === fn) {\n      return i;\n    }\n  }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/crossvent/src/crossvent.js\n// module id = 951\n// module chunks = 0 1","\nvar NativeCustomEvent = global.CustomEvent;\n\nfunction useNative () {\n  try {\n    var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });\n    return  'cat' === p.type && 'bar' === p.detail.foo;\n  } catch (e) {\n  }\n  return false;\n}\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n *\n * @public\n */\n\nmodule.exports = useNative() ? NativeCustomEvent :\n\n// IE >= 9\n'function' === typeof document.createEvent ? function CustomEvent (type, params) {\n  var e = document.createEvent('CustomEvent');\n  if (params) {\n    e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n  } else {\n    e.initCustomEvent(type, false, false, void 0);\n  }\n  return e;\n} :\n\n// IE <= 8\nfunction CustomEvent (type, params) {\n  var e = document.createEventObject();\n  e.type = type;\n  if (params) {\n    e.bubbles = Boolean(params.bubbles);\n    e.cancelable = Boolean(params.cancelable);\n    e.detail = params.detail;\n  } else {\n    e.bubbles = false;\n    e.cancelable = false;\n    e.detail = void 0;\n  }\n  return e;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/custom-event/index.js\n// module id = 952\n// module chunks = 0 1","'use strict';\n\nvar eventmap = [];\nvar eventname = '';\nvar ron = /^on/;\n\nfor (eventname in global) {\n  if (ron.test(eventname)) {\n    eventmap.push(eventname.slice(2));\n  }\n}\n\nmodule.exports = eventmap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/crossvent/src/eventmap.js\n// module id = 953\n// module chunks = 0 1","'use strict';\n\nvar cache = {};\nvar start = '(?:^|\\\\s)';\nvar end = '(?:\\\\s|$)';\n\nfunction lookupClass (className) {\n  var cached = cache[className];\n  if (cached) {\n    cached.lastIndex = 0;\n  } else {\n    cache[className] = cached = new RegExp(start + className + end, 'g');\n  }\n  return cached;\n}\n\nfunction addClass (el, className) {\n  var current = el.className;\n  if (!current.length) {\n    el.className = className;\n  } else if (!lookupClass(className).test(current)) {\n    el.className += ' ' + className;\n  }\n}\n\nfunction rmClass (el, className) {\n  el.className = el.className.replace(lookupClass(className), ' ').trim();\n}\n\nmodule.exports = {\n  add: addClass,\n  rm: rmClass\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dragula/classes.js\n// module id = 954\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport _s from 'underscore.string';\n\nimport createReactClass from 'create-react-class';\n\nconst NetworkHeader = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object,\n    report: PropTypes.object,\n    reports: PropTypes.object\n  },\n\n  getInitialState() {\n    return {\n      dropdownOpen: false\n    };\n  },\n\n  onDropdownClick() {\n    this.setState({dropdownOpen: !this.state.dropdownOpen});\n  },\n\n  render() {\n    const entityId = this.props.entity ? this.props.entity.attributes.subdomain : '';\n    const networkHomeUrl = `/network#/${gon.entity.id}`;\n    const networkEntityUrl = `${networkHomeUrl}/entities/${entityId}`;\n\n    return (\n      <header className=\"ui-main__header\">\n        <nav className=\"ui-breadcrumbs\">\n          <a className=\"ui-breadcrumbs__item icon-app-network\" href={networkHomeUrl}>\n            Network\n          </a>\n          <a className=\"ui-breadcrumbs__item\" href={networkEntityUrl}>\n            {_s.capitalize(this.props.entity.attributes.display_name)}\n          </a>\n          <span className=\"ui-breadcrumbs__item ui-breadcrumbs__dropdown-toggle\" onClick={this.onDropdownClick}>\n            {this.props.report.get('name')}\n            {this.state.dropdownOpen ?\n              <div className=\"ui-dropdown__target\" style={{display: 'block'}}>\n                <ul className=\"ui-dropdown__list\">\n                  {this.props.reports.sortBy('name').map(function(report) {\n                    if (!report.get('hidden')) {\n                      const reportPath = `/network/reports#/${entityId}/${report.get('id')}`;\n                      const itemCss = {\n                        'ui-dropdown__item': true,\n                        active: report.get('id') === this.props.report.get('id')\n                      };\n\n                      return (\n                        <li key={report.get('id')}>\n                          <a className={classNames(itemCss)} href={reportPath}>{report.get('name')}</a>\n                        </li>\n                      );\n                    }\n                  }, this)}\n                </ul>\n              </div>\n            : null}\n          </span>\n        </nav>\n      </header>\n    );\n  }\n});\n\nexport default NetworkHeader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/network/header.tsx","import React from 'react';\n\nimport createReactClass from 'create-react-class';\n\nconst SocialNetworking = createReactClass<any, any>({\n  render() {\n    return (\n      <span>\n        <Facebook />\n        <Twitter entityHashtag={this.props.entityHashtag} />\n      </span>\n    );\n  }\n});\n\nvar Twitter = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"footer__social__wrapper\" style={{position: 'relative', top: 1}}>\n        <a href=\"https://twitter.com/share\"\n          className=\"twitter-share-button\"\n          data-text={'Check out this #OpenData ' + this.props.entityHashtag + ' visualization from OpenGov.com'}>Tweet</a>\n      </div>\n    );\n  },\n\n  componentDidMount() {\n    !(function(d, s, id) {\n      let js;\n      let fjs = d.getElementsByTagName(s)[0];\n      let p = /^http:/.test(d.location.toString()) ? 'http' : 'https';\n      if (!d.getElementById(id)) {\n        js = d.createElement(s);\n        js.id = id;\n        js.src = p + '://platform.twitter.com/widgets.js';\n        fjs.parentNode.insertBefore(js, fjs);\n      }\n    }(document, 'script', 'twitter-wjs'));\n  }\n});\n\nvar Facebook = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"footer__social__wrapper\">\n        <div id=\"fb-root\"/>\n        <div className=\"fb-like\" data-href=\"https://www.facebook.com/opengovinc?ref=br_tf\" data-layout=\"button_count\" data-action=\"like\" data-show-faces=\"false\" data-share=\"false\"/>\n      </div>\n    );\n  },\n\n  componentDidMount() {\n    /* jshint ignore:start */\n    (function(d, s, id) {\n      let js;\n      let fjs = d.getElementsByTagName(s)[0];\n      if (d.getElementById(id)) return;\n      js = d.createElement(s);\n      js.id = id;\n      js.src = '//connect.facebook.net/en_US/all.js#xfbml=1&appId=441421729313993';\n      fjs.parentNode.insertBefore(js, fjs);\n    }(document, 'script', 'facebook-jssdk'));\n    /* jshint ignore:end */\n  }\n});\n\nexport default SocialNetworking;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/social_networking.tsx","import React from 'react';\nimport utils from '../querygrid/utils';\nimport ReportDescription from '../report_description';\nimport GridReportActions from '../actions/grid_report_actions';\nimport AutoComplete from './autocomplete';\nimport SubReportHeader from './sub_report_header';\nimport ReportUpdatedInfo from './report_updated_info';\nimport { ReportHeaderRowCount } from './report_header_row_count';\nimport { isEmbed } from '../utils/embed_utils';\n\nimport createReactClass from 'create-react-class';\nconst ReportHeader = createReactClass<any, any>({\n  getInitialState() {\n    return {\n      searchValue: this.props.queryModel.getColumnQuery('all').filter.contains || ''\n    };\n  },\n\n  render() {\n    const { report, griddleState, schema, queryModel, renderedReport, isControlPanel } = this.props;\n\n    const searchValue = this.props.queryModel.getColumnQuery('all').filter.contains || this.state.searchValue;\n    const embedHeaderStyle = isEmbed() ? { left: 0 } : {};\n    return (\n      <header className=\"report__header\" style={embedHeaderStyle}>\n        <div className=\"report__header__container\">\n          {(!isControlPanel && !isEmbed()) && <h1>{report.attributes.name}</h1>}\n          <ReportDescription report={renderedReport} />\n          <div className=\"report__header_updated_on\">\n            <ReportUpdatedInfo description={'Updated On '} timeStamp={report.get('data_updated_at')} />\n          </div>\n          {this.isPredictiveSearchActive() ? (\n            <AutoComplete\n              dataSetId={report.get('transaction_id')}\n              columns={['paid_to', 'agency', 'fund', 'expense_type', 'program', 'department']}\n              schema={schema}\n              queryModel={queryModel}\n              ref={input => {\n                this.gridSearchInput = input;\n              }}\n            />\n          ) : (\n            <div className=\"search__bar\">\n              <div className=\"search__wrapper\">\n                <div className=\"ui-search small\">\n                  <span className=\"icon-search-1\" />\n                  <input\n                    type=\"search\"\n                    value={searchValue || ''}\n                    placeholder=\"Search in table\"\n                    onKeyDown={this.handleSearchKeyDown}\n                    onChange={this.handleSearchChange}\n                  />\n                </div>\n                <button className={'ui-button small'} onClick={this.handleSearchBtnClick}>\n                  Search\n                </button>\n              </div>\n            </div>\n          )}\n          {griddleState ? (\n            <ReportHeaderRowCount\n              className={`grid-report-row-count ${isControlPanel ? 'pull-right' : ''}`}\n              count={griddleState.count}\n              estimate={griddleState.estimate}\n            />\n          ) : null}\n        </div>\n        <SubReportHeader {...this.props} onClear={this.clearSearch} />\n      </header>\n    );\n  },\n\n  searchAll(value) {\n    GridReportActions.filterColumn('all', 'contains', value || undefined);\n    this.props.onAction('search-all');\n  },\n\n  handleSearchKeyDown(ev) {\n    const text = utils.strip(ev.target.value);\n    if (ev.which === 13) {\n      if (text !== '') {\n        this.searchAll(text);\n      }\n    }\n  },\n\n  handleSearchChange(ev) {\n    this.setState({\n      searchValue: ev.target.value\n    });\n\n    if (ev.target.value === '') {\n      this.searchAll('');\n    }\n  },\n\n  handleSearchBtnClick() {\n    const text = utils.strip(this.state.searchValue);\n    this.searchAll(text);\n  },\n\n  clearSearch() {\n    this.setState({\n      searchValue: ''\n    });\n    this.searchAll('');\n  },\n\n  componentWillReceiveProps(nextProps) {\n    //update the state's searchValue if the querymodel filter is changed in other components\n    //like filterspanel, etc\n    const nextColumnQuery = nextProps.queryModel.getColumnQuery('all').filter;\n    if (!nextColumnQuery.contains || nextColumnQuery.contains !== this.state.searchValue) {\n      this.setState({\n        searchValue: nextProps.queryModel.getColumnQuery('all').contains || ''\n      });\n    }\n  },\n\n  isPredictiveSearchActive() {\n    const { report, entity } = this.props;\n    const properties = report.get('properties') || {};\n    const reportProperties = (properties.toJS && properties.toJS()) || properties;\n    const entityFeatures = entity.get('feature_permissions');\n    const checkImageVisible = reportProperties.check_image_visible;\n    const hasOhioTosFlag = entityFeatures && entityFeatures.find(fp => fp === 'ohio_tos');\n    return checkImageVisible && hasOhioTosFlag;\n  }\n});\n\nexport default ReportHeader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/report_header.tsx","/*!\r\n * Autolinker.js\r\n * 0.11.2\r\n *\r\n * Copyright(c) 2014 Gregory Jacobs <greg@greg-jacobs.com>\r\n * MIT Licensed. http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * https://github.com/gregjacobs/Autolinker.js\r\n */\r\n/*global define, module */\r\n/*jshint undef:true, smarttabs:true */\r\n// Set up Autolinker appropriately for the environment.\r\n( function( root, factory ) {\r\n\tif( typeof define === 'function' && define.amd ) {\r\n\t\tdefine( factory );             // Define as AMD module if an AMD loader is present (ex: RequireJS).\r\n\t} else if( typeof exports !== 'undefined' ) {\r\n\t\tmodule.exports = factory();    // Define as CommonJS module for Node.js, if available.\r\n\t} else {\r\n\t\troot.Autolinker = factory();   // Finally, define as a browser global if no module loader.\r\n\t}\r\n}( this, function() {\r\n\t\r\n\t/**\r\n\t * @class Autolinker\r\n\t * @extends Object\r\n\t * \r\n\t * Utility class used to process a given string of text, and wrap the URLs, email addresses, and Twitter handles in \r\n\t * the appropriate anchor (&lt;a&gt;) tags to turn them into links.\r\n\t * \r\n\t * Any of the configuration options may be provided in an Object (map) provided to the Autolinker constructor, which\r\n\t * will configure how the {@link #link link()} method will process the links.\r\n\t * \r\n\t * For example:\r\n\t * \r\n\t *     var autolinker = new Autolinker( {\r\n\t *         newWindow : false,\r\n\t *         truncate  : 30\r\n\t *     } );\r\n\t *     \r\n\t *     var html = autolinker.link( \"Joe went to www.yahoo.com\" );\r\n\t *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\r\n\t * \r\n\t * \r\n\t * The {@link #static-link static link()} method may also be used to inline options into a single call, which may\r\n\t * be more convenient for one-off uses. For example:\r\n\t * \r\n\t *     var html = Autolinker.link( \"Joe went to www.yahoo.com\", {\r\n\t *         newWindow : false,\r\n\t *         truncate  : 30\r\n\t *     } );\r\n\t *     // produces: 'Joe went to <a href=\"http://www.yahoo.com\">yahoo.com</a>'\r\n\t * \r\n\t * @constructor\r\n\t * @param {Object} [config] The configuration options for the Autolinker instance, specified in an Object (map).\r\n\t */\r\n\tvar Autolinker = function( cfg ) {\r\n\t\tcfg = cfg || {};\r\n\t\t\r\n\t\t// Assign the properties of `cfg` onto the Autolinker instance\r\n\t\tfor( var prop in cfg )\r\n\t\t\tif( cfg.hasOwnProperty( prop ) ) this[ prop ] = cfg[ prop ];\r\n\t};\r\n\t\r\n\t\r\n\tAutolinker.prototype = {\r\n\t\tconstructor : Autolinker,  // fix constructor property\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} newWindow\r\n\t\t * \r\n\t\t * `true` if the links should open in a new window, `false` otherwise.\r\n\t\t */\r\n\t\tnewWindow : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} stripPrefix\r\n\t\t * \r\n\t\t * `true` if 'http://' or 'https://' and/or the 'www.' should be stripped from the beginning of links, `false` otherwise.\r\n\t\t */\r\n\t\tstripPrefix : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Number} truncate\r\n\t\t * \r\n\t\t * A number for how many characters long URLs/emails/twitter handles should be truncated to inside the text of \r\n\t\t * a link. If the URL/email/twitter is over this number of characters, it will be truncated to this length by \r\n\t\t * adding a two period ellipsis ('..') into the middle of the string.\r\n\t\t * \r\n\t\t * For example: A url like 'http://www.yahoo.com/some/long/path/to/a/file' truncated to 25 characters might look\r\n\t\t * something like this: 'http://www...th/to/a/file'\r\n\t\t */\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} twitter\r\n\t\t * \r\n\t\t * `true` if Twitter handles (\"@example\") should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\ttwitter : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} email\r\n\t\t * \r\n\t\t * `true` if email addresses should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\temail : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {Boolean} urls\r\n\t\t * \r\n\t\t * `true` if miscellaneous URLs should be automatically linked, `false` if they should not be.\r\n\t\t */\r\n\t\turls : true,\r\n\t\t\r\n\t\t/**\r\n\t\t * @cfg {String} className\r\n\t\t * \r\n\t\t * A CSS class name to add to the generated links. This class will be added to all links, as well as this class\r\n\t\t * plus url/email/twitter suffixes for styling url/email/twitter links differently.\r\n\t\t * \r\n\t\t * For example, if this config is provided as \"myLink\", then:\r\n\t\t * \r\n\t\t * 1) URL links will have the CSS classes: \"myLink myLink-url\"\r\n\t\t * 2) Email links will have the CSS classes: \"myLink myLink-email\", and\r\n\t\t * 3) Twitter links will have the CSS classes: \"myLink myLink-twitter\"\r\n\t\t */\r\n\t\tclassName : \"\",\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} matcherRegex\r\n\t\t * \r\n\t\t * The regular expression that matches URLs, email addresses, and Twitter handles.\r\n\t\t * \r\n\t\t * This regular expression has the following capturing groups:\r\n\t\t * \r\n\t\t * 1. Group that is used to determine if there is a Twitter handle match (i.e. @someTwitterUser). Simply check for its \r\n\t\t *    existence to determine if there is a Twitter handle match. The next couple of capturing groups give information \r\n\t\t *    about the Twitter handle match.\r\n\t\t * 2. The whitespace character before the @sign in a Twitter handle. This is needed because there are no lookbehinds in\r\n\t\t *    JS regular expressions, and can be used to reconstruct the original string in a replace().\r\n\t\t * 3. The Twitter handle itself in a Twitter match. If the match is '@someTwitterUser', the handle is 'someTwitterUser'.\r\n\t\t * 4. Group that matches an email address. Used to determine if the match is an email address, as well as holding the full \r\n\t\t *    address. Ex: 'me@my.com'\r\n\t\t * 5. Group that matches a URL in the input text. Ex: 'http://google.com', 'www.google.com', or just 'google.com'.\r\n\t\t *    This also includes a path, url parameters, or hash anchors. Ex: google.com/path/to/file?q1=1&q2=2#myAnchor\r\n\t\t * 6. A protocol-relative ('//') match for the case of a 'www.' prefixed URL. Will be an empty string if it is not a \r\n\t\t *    protocol-relative match. We need to know the character before the '//' in order to determine if it is a valid match\r\n\t\t *    or the // was in a string we don't want to auto-link.\r\n\t\t * 7. A protocol-relative ('//') match for the case of a known TLD prefixed URL. Will be an empty string if it is not a \r\n\t\t *    protocol-relative match. See #6 for more info. \r\n\t\t */\r\n\t\tmatcherRegex : (function() {\r\n\t\t\tvar twitterRegex = /(^|[^\\w])@(\\w{1,15})/,              // For matching a twitter handle. Ex: @gregory_jacobs\r\n\t\t\t    \r\n\t\t\t    emailRegex = /(?:[\\-;:&=\\+\\$,\\w\\.]+@)/,             // something@ for email addresses (a.k.a. local-part)\r\n\t\t\t    \r\n\t\t\t    protocolRegex = /(?:[A-Za-z]{3,9}:(?:\\/\\/)?)/,      // match protocol, allow in format http:// or mailto:\r\n\t\t\t    wwwRegex = /(?:www\\.)/,                             // starting with 'www.'\r\n\t\t\t    domainNameRegex = /[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/,  // anything looking at all like a domain, non-unicode domains, not ending in a period\r\n\t\t\t    tldRegex = /\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/,   // match our known top level domains (TLDs)\r\n\t\t\t    \r\n\t\t\t    // Allow optional path, query string, and hash anchor, not ending in the following characters: \"!:,.;\"\r\n\t\t\t    // http://blog.codinghorror.com/the-problem-with-urls/\r\n\t\t\t    urlSuffixRegex = /(?:[\\-A-Za-z0-9+&@#\\/%?=~_()|!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|])?/;  // note: optional part of the full regex\r\n\t\t\t\r\n\t\t\treturn new RegExp( [\r\n\t\t\t\t'(',  // *** Capturing group $1, which can be used to check for a twitter handle match. Use group $3 for the actual twitter handle though. $2 may be used to reconstruct the original string in a replace() \r\n\t\t\t\t\t// *** Capturing group $2, which matches the whitespace character before the '@' sign (needed because of no lookbehinds), and \r\n\t\t\t\t\t// *** Capturing group $3, which matches the actual twitter handle\r\n\t\t\t\t\ttwitterRegex.source,\r\n\t\t\t\t')',\r\n\t\t\t\t\r\n\t\t\t\t'|',\r\n\t\t\t\t\r\n\t\t\t\t'(',  // *** Capturing group $4, which is used to determine an email match\r\n\t\t\t\t\temailRegex.source,\r\n\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\ttldRegex.source,\r\n\t\t\t\t')',\r\n\t\t\t\t\r\n\t\t\t\t'|',\r\n\t\t\t\t\r\n\t\t\t\t'(',  // *** Capturing group $5, which is used to match a URL\r\n\t\t\t\t\t'(?:', // parens to cover match for protocol (optional), and domain\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for a protocol-prefixed url (ex: http://google.com)\r\n\t\t\t\t\t\t\tprotocolRegex.source,\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'|',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for a 'www.' prefixed url (ex: www.google.com)\r\n\t\t\t\t\t\t\t'(.?//)?',  // *** Capturing group $6 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n\t\t\t\t\t\t\twwwRegex.source,\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'|',\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t'(?:',  // non-capturing paren for known a TLD url (ex: google.com)\r\n\t\t\t\t\t\t\t'(.?//)?',  // *** Capturing group $7 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\r\n\t\t\t\t\t\t\tdomainNameRegex.source,\r\n\t\t\t\t\t\t\ttldRegex.source,\r\n\t\t\t\t\t\t')',\r\n\t\t\t\t\t')',\r\n\t\t\t\t\t\r\n\t\t\t\t\turlSuffixRegex.source,  // match for path, query string, and/or hash anchor\r\n\t\t\t\t')'\r\n\t\t\t].join( \"\" ), 'gi' );\r\n\t\t} )(),\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} protocolRelativeRegex\r\n\t\t * \r\n\t\t * The regular expression used to find protocol-relative URLs. A protocol-relative URL is, for example, \"//yahoo.com\"\r\n\t\t * \r\n\t\t * This regular expression needs to match the character before the '//', in order to determine if we should actually\r\n\t\t * autolink a protocol-relative URL. For instance, we want to autolink something like \"//google.com\", but we\r\n\t\t * don't want to autolink something like \"abc//google.com\"\r\n\t\t */\r\n\t\tprotocolRelativeRegex : /(.)?\\/\\//,\r\n\t\t\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} htmlRegex\r\n\t\t * \r\n\t\t * The regular expression used to pull out HTML tags from a string. Handles namespaced HTML tags and\r\n\t\t * attribute names, as specified by http://www.w3.org/TR/html-markup/syntax.html.\r\n\t\t * \r\n\t\t * Capturing groups:\r\n\t\t * \r\n\t\t * 1. If it is an end tag, this group will have the '/'.\r\n\t\t * 2. The tag name.\r\n\t\t */\r\n\t\thtmlRegex : (function() {\r\n\t\t\tvar tagNameRegex = /[0-9a-zA-Z:]+/,\r\n\t\t\t    attrNameRegex = /[^\\s\\0\"'>\\/=\\x01-\\x1F\\x7F]+/,   // the unicode range accounts for excluding control chars, and the delete char\r\n\t\t\t    attrValueRegex = /(?:\".*?\"|'.*?'|[^'\"=<>`\\s]+)/, // double quoted, single quoted, or unquoted attribute values\r\n\t\t\t    nameEqualsValueRegex = attrNameRegex.source + '(?:\\\\s*=\\\\s*' + attrValueRegex.source + ')?';  // optional '=[value]'\r\n\t\t\t\r\n\t\t\treturn new RegExp( [\r\n\t\t\t\t'<(?:!|(/))?',  // Beginning of a tag. Either '<' for a start tag, '</' for an end tag, or <! for the <!DOCTYPE ...> tag. The slash or an empty string is Capturing Group 1.\r\n\t\t\t\t\r\n\t\t\t\t\t// The tag name (Capturing Group 2)\r\n\t\t\t\t\t'(' + tagNameRegex.source + ')',\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Zero or more attributes following the tag name\r\n\t\t\t\t\t'(?:',\r\n\t\t\t\t\t\t'\\\\s+',  // one or more whitespace chars before an attribute\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Either:\r\n\t\t\t\t\t\t// A. tag=\"value\", or \r\n\t\t\t\t\t\t// B. \"value\" alone (for <!DOCTYPE> tag. Ex: <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">) \r\n\t\t\t\t\t\t'(?:', nameEqualsValueRegex, '|', attrValueRegex.source + ')',\r\n\t\t\t\t\t')*',\r\n\t\t\t\t\t\r\n\t\t\t\t\t'\\\\s*/?',  // any trailing spaces and optional '/' before the closing '>'\r\n\t\t\t\t'>'\r\n\t\t\t].join( \"\" ), 'g' );\r\n\t\t} )(),\r\n\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * @property {RegExp} urlPrefixRegex\r\n\t\t * \r\n\t\t * A regular expression used to remove the 'http://' or 'https://' and/or the 'www.' from URLs.\r\n\t\t */\r\n\t\turlPrefixRegex: /^(https?:\\/\\/)?(www\\.)?/i,\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n\t\t * Does not link URLs found within HTML tags.\r\n\t\t * \r\n\t\t * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n\t\t * will be `You should go to &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\r\n\t\t * \r\n\t\t * @method link\r\n\t\t * @param {String} textOrHtml The HTML or text to link URLs, email addresses, and Twitter handles within.\r\n\t\t * @return {String} The HTML, with URLs/emails/twitter handles automatically linked.\r\n\t\t */\r\n\t\tlink : function( textOrHtml ) {\r\n\t\t\treturn this.processHtml( textOrHtml );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Processes the given HTML to auto-link URLs/emails/Twitter handles.\r\n\t\t * \r\n\t\t * Finds the text around any HTML elements in the input `html`, which will be the text that is processed.\r\n\t\t * Any original HTML elements will be left as-is, as well as the text that is already wrapped in anchor tags.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @method processHtml\r\n\t\t * @param {String} html The input text or HTML to process in order to auto-link.\r\n\t\t * @return {String}\r\n\t\t */\r\n\t\tprocessHtml : function( html ) {\r\n\t\t\t// Loop over the HTML string, ignoring HTML tags, and processing the text that lies between them,\r\n\t\t\t// wrapping the URLs in anchor tags\r\n\t\t\tvar htmlRegex = this.htmlRegex,\r\n\t\t\t    currentResult,\r\n\t\t\t    inBetweenTagsText,\r\n\t\t\t    lastIndex = 0,\r\n\t\t\t    anchorTagStackCount = 0,\r\n\t\t\t    resultHtml = [];\r\n\t\t\t\r\n\t\t\twhile( ( currentResult = htmlRegex.exec( html ) ) !== null ) {\r\n\t\t\t\tvar tagText = currentResult[ 0 ],\r\n\t\t\t\t    tagName = currentResult[ 2 ],\r\n\t\t\t\t    isClosingTag = !!currentResult[ 1 ];\r\n\t\t\t\t\r\n\t\t\t\tinBetweenTagsText = html.substring( lastIndex, currentResult.index );\r\n\t\t\t\tlastIndex = currentResult.index + tagText.length;\r\n\t\t\t\t\r\n\t\t\t\t// Process around anchor tags, and any inner text / html they may have\r\n\t\t\t\tif( tagName === 'a' ) {\r\n\t\t\t\t\tif( !isClosingTag ) {  // it's the start <a> tag\r\n\t\t\t\t\t\tanchorTagStackCount++;\r\n\t\t\t\t\t\tresultHtml.push( this.processTextNode( inBetweenTagsText ) );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t} else {   // it's the end </a> tag\r\n\t\t\t\t\t\tanchorTagStackCount = Math.max( anchorTagStackCount - 1, 0 );  // attempt to handle extraneous </a> tags by making sure the stack count never goes below 0\r\n\t\t\t\t\t\tif( anchorTagStackCount === 0 ) {\r\n\t\t\t\t\t\t\tresultHtml.push( inBetweenTagsText );  // We hit the matching </a> tag, simply add all of the text from the start <a> tag to the end </a> tag without linking it\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t} else if( anchorTagStackCount === 0 ) {   // not within an anchor tag, link the \"in between\" text\r\n\t\t\t\t\tresultHtml.push( this.processTextNode( inBetweenTagsText ) );\r\n\t\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// if we have a tag that is in between anchor tags (ex: <a href=\"...\"><b>google.com</b></a>),\r\n\t\t\t\t\t// just append the inner text\r\n\t\t\t\t\tresultHtml.push( inBetweenTagsText );  \r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tresultHtml.push( tagText );  // now add the text of the tag itself verbatim\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Process any remaining text after the last HTML element. Will process all of the text if there were no HTML elements.\r\n\t\t\tif( lastIndex < html.length ) {\r\n\t\t\t\tvar processedTextNode = this.processTextNode( html.substring( lastIndex ) );\r\n\t\t\t\tresultHtml.push( processedTextNode );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn resultHtml.join( \"\" );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Process the text that lies inbetween HTML tags. This method does the actual wrapping of URLs with\r\n\t\t * anchor tags.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The text to auto-link.\r\n\t\t * @return {String} The text with anchor tags auto-filled.\r\n\t\t */\r\n\t\tprocessTextNode : function( text ) {\r\n\t\t\tvar me = this,  // for closures\r\n\t\t\t    matcherRegex = this.matcherRegex,\r\n\t\t\t    enableTwitter = this.twitter,\r\n\t\t\t    enableEmailAddresses = this.email,\r\n\t\t\t    enableUrls = this.urls;\r\n\t\t\t\r\n\t\t\treturn text.replace( matcherRegex, function( matchStr, $1, $2, $3, $4, $5, $6, $7 ) {\r\n\t\t\t\tvar twitterMatch = $1,\r\n\t\t\t\t    twitterHandlePrefixWhitespaceChar = $2,  // The whitespace char before the @ sign in a Twitter handle match. This is needed because of no lookbehinds in JS regexes\r\n\t\t\t\t    twitterHandle = $3,   // The actual twitterUser (i.e the word after the @ sign in a Twitter handle match)\r\n\t\t\t\t    emailAddress = $4,    // For both determining if it is an email address, and stores the actual email address\r\n\t\t\t\t    urlMatch = $5,        // The matched URL string\r\n\t\t\t\t    protocolRelativeMatch = $6 || $7,  // The '//' for a protocol-relative match, with the character that comes before the '//'\r\n\t\t\t\t    \r\n\t\t\t\t    prefixStr = \"\",       // A string to use to prefix the anchor tag that is created. This is needed for the Twitter handle match\r\n\t\t\t\t    suffixStr = \"\";       // A string to suffix the anchor tag that is created. This is used if there is a trailing parenthesis that should not be auto-linked.\r\n\t\t\t\t\r\n\t\t\t\t// Early exits with no replacements for:\r\n\t\t\t\t// 1) Disabled link types\r\n\t\t\t\t// 2) URL matches which do not have at least have one period ('.') in the domain name (effectively skipping over \r\n\t\t\t\t//    matches like \"abc:def\")\r\n\t\t\t\t// 3) A protocol-relative url match (a URL beginning with '//') whose previous character is a word character \r\n\t\t\t\t//    (effectively skipping over strings like \"abc//google.com\")\r\n\t\t\t\tif( \r\n\t\t\t\t    ( twitterMatch && !enableTwitter ) || ( emailAddress && !enableEmailAddresses ) || ( urlMatch && !enableUrls ) ||\r\n\t\t\t\t    ( urlMatch && urlMatch.indexOf( '.' ) === -1 ) ||  // At least one period ('.') must exist in the URL match for us to consider it an actual URL\r\n\t\t\t\t    ( urlMatch && /^[A-Za-z]{3,9}:/.test( urlMatch ) && !/:.*?[A-Za-z]/.test( urlMatch ) ) ||  // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\r\n\t\t\t\t    ( protocolRelativeMatch && /^[\\w]\\/\\//.test( protocolRelativeMatch ) )  // a protocol-relative match which has a word character in front of it (so we can skip something like \"abc//google.com\")\r\n\t\t\t\t) {\r\n\t\t\t\t\treturn matchStr;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t// Handle a closing parenthesis at the end of the match, and exclude it if there is not a matching open parenthesis\r\n\t\t\t\t// in the match. This handles cases like the string \"wikipedia.com/something_(disambiguation)\" (which should be auto-\r\n\t\t\t\t// linked, and when it is enclosed in parenthesis itself, such as: \"(wikipedia.com/something_(disambiguation))\" (in\r\n\t\t\t\t// which the outer parens should *not* be auto-linked.\r\n\t\t\t\tvar lastChar = matchStr.charAt( matchStr.length - 1 );\r\n\t\t\t\tif( lastChar === ')' ) {\r\n\t\t\t\t\tvar openParensMatch = matchStr.match( /\\(/g ),\r\n\t\t\t\t\t    closeParensMatch = matchStr.match( /\\)/g ),\r\n\t\t\t\t\t    numOpenParens = ( openParensMatch && openParensMatch.length ) || 0,\r\n\t\t\t\t\t    numCloseParens = ( closeParensMatch && closeParensMatch.length ) || 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif( numOpenParens < numCloseParens ) {\r\n\t\t\t\t\t\tmatchStr = matchStr.substr( 0, matchStr.length - 1 );  // remove the trailing \")\"\r\n\t\t\t\t\t\tsuffixStr = \")\";  // this will be added after the <a> tag\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tvar anchorHref = matchStr,  // initialize both of these\r\n\t\t\t\t    anchorText = matchStr,  // values as the full match\r\n\t\t\t\t    linkType;\r\n\r\n\t\t\t\t// Process the urls that are found. We need to change URLs like \"www.yahoo.com\" to \"http://www.yahoo.com\" (or the browser\r\n\t\t\t\t// will try to direct the user to \"http://current-domain.com/www.yahoo.com\"), and we need to prefix 'mailto:' to email addresses.\r\n\t\t\t\tif( twitterMatch ) {\r\n\t\t\t\t\tlinkType = 'twitter';\r\n\t\t\t\t\tprefixStr = twitterHandlePrefixWhitespaceChar;\r\n\t\t\t\t\tanchorHref = 'https://twitter.com/' + twitterHandle;\r\n\t\t\t\t\tanchorText = '@' + twitterHandle;\r\n\t\t\t\t\t\r\n\t\t\t\t} else if( emailAddress ) {\r\n\t\t\t\t\tlinkType = 'email';\r\n\t\t\t\t\tanchorHref = 'mailto:' + emailAddress;\r\n\t\t\t\t\tanchorText = emailAddress;\r\n\t\t\t\t\t\r\n\t\t\t\t} else {  // url match\r\n\t\t\t\t\tlinkType = 'url';\r\n\t\t\t\t\t\r\n\t\t\t\t\tif( protocolRelativeMatch ) {\r\n\t\t\t\t\t\t// Strip off any protocol-relative '//' from the anchor text (leaving the previous non-word character \r\n\t\t\t\t\t\t// intact, if there is one)\r\n\t\t\t\t\t\tvar protocolRelRegex = new RegExp( \"^\" + me.protocolRelativeRegex.source ),  // for this one, we want to only match at the beginning of the string\r\n\t\t\t\t\t\t    charBeforeMatch = protocolRelativeMatch.match( protocolRelRegex )[ 1 ] || \"\";\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tprefixStr = charBeforeMatch + prefixStr;  // re-add the character before the '//' to what will be placed before the <a> tag\r\n\t\t\t\t\t\tanchorHref = anchorHref.replace( protocolRelRegex, \"//\" );  // remove the char before the match for the href\r\n\t\t\t\t\t\tanchorText = anchorText.replace( protocolRelRegex, \"\" );    // remove both the char before the match and the '//' for the anchor text\r\n\r\n\t\t\t\t\t} else if( !/^[A-Za-z]{3,9}:/i.test( anchorHref ) ) {\r\n\t\t\t\t\t\t// url string doesn't begin with a protocol, assume http://\r\n\t\t\t\t\t\tanchorHref = 'http://' + anchorHref;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// wrap the match in an anchor tag\r\n\t\t\t\tvar anchorTag = me.createAnchorTag( linkType, anchorHref, anchorText );\r\n\t\t\t\treturn prefixStr + anchorTag + suffixStr;\r\n\t\t\t} );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Generates the actual anchor (&lt;a&gt;) tag to use in place of a source url/email/twitter link.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @param {String} anchorHref The href for the anchor tag.\r\n\t\t * @param {String} anchorText The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The full HTML for the anchor tag.\r\n\t\t */\r\n\t\tcreateAnchorTag : function( linkType, anchorHref, anchorText ) {\r\n\t\t\tvar attributesStr = this.createAnchorAttrsStr( linkType, anchorHref );\r\n\t\t\tanchorText = this.processAnchorText( anchorText );\r\n\t\t\t\r\n\t\t\treturn '<a ' + attributesStr + '>' + anchorText + '</a>';\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Creates the string which will be the HTML attributes for the anchor (&lt;a&gt;) tag being generated.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @param {String} href The href for the anchor tag.\r\n\t\t * @return {String} The anchor tag's attribute. Ex: `href=\"http://google.com\" class=\"myLink myLink-url\" target=\"_blank\"` \r\n\t\t */\r\n\t\tcreateAnchorAttrsStr : function( linkType, anchorHref ) {\r\n\t\t\tvar attrs = [ 'href=\"' + anchorHref + '\"' ];  // we'll always have the `href` attribute\r\n\t\t\t\r\n\t\t\tvar cssClass = this.createCssClass( linkType );\r\n\t\t\tif( cssClass ) {\r\n\t\t\t\tattrs.push( 'class=\"' + cssClass + '\"' );\r\n\t\t\t}\r\n\t\t\tif( this.newWindow ) {\r\n\t\t\t\tattrs.push( 'target=\"_blank\"' );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn attrs.join( \" \" );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Creates the CSS class that will be used for a given anchor tag, based on the `linkType` and the {@link #className}\r\n\t\t * config.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {\"url\"/\"email\"/\"twitter\"} linkType The type of link that an anchor tag is being generated for.\r\n\t\t * @return {String} The CSS class string for the link. Example return: \"myLink myLink-url\". If no {@link #className}\r\n\t\t *   was configured, returns an empty string.\r\n\t\t */\r\n\t\tcreateCssClass : function( linkType ) {\r\n\t\t\tvar className = this.className;\r\n\t\t\t\r\n\t\t\tif( !className ) \r\n\t\t\t\treturn \"\";\r\n\t\t\telse\r\n\t\t\t\treturn className + \" \" + className + \"-\" + linkType;  // ex: \"myLink myLink-url\", \"myLink myLink-email\", or \"myLink myLink-twitter\"\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Processes the `anchorText` by stripping the URL prefix (if {@link #stripPrefix} is `true`), removing\r\n\t\t * any trailing slash, and truncating the text according to the {@link #truncate} config.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} anchorText The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The processed `anchorText`.\r\n\t\t */\r\n\t\tprocessAnchorText : function( anchorText ) {\r\n\t\t\tif( this.stripPrefix ) {\r\n\t\t\t\tanchorText = this.stripUrlPrefix( anchorText );\r\n\t\t\t}\r\n\t\t\tanchorText = this.removeTrailingSlash( anchorText );  // remove trailing slash, if there is one\r\n\t\t\tanchorText = this.doTruncate( anchorText );\r\n\t\t\t\r\n\t\t\treturn anchorText;\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Strips the URL prefix (such as \"http://\" or \"https://\") from the given text.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The text of the anchor that is being generated, for which to strip off the\r\n\t\t *   url prefix (such as stripping off \"http://\")\r\n\t\t * @return {String} The `anchorText`, with the prefix stripped.\r\n\t\t */\r\n\t\tstripUrlPrefix : function( text ) {\r\n\t\t\treturn text.replace( this.urlPrefixRegex, '' );\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Removes any trailing slash from the given `anchorText`, in prepration for the text to be displayed.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\r\n\t\t *   slash ('/') that may exist.\r\n\t\t * @return {String} The `anchorText`, with the trailing slash removed.\r\n\t\t */\r\n\t\tremoveTrailingSlash : function( anchorText ) {\r\n\t\t\tif( anchorText.charAt( anchorText.length - 1 ) === '/' ) {\r\n\t\t\t\tanchorText = anchorText.slice( 0, -1 );\r\n\t\t\t}\r\n\t\t\treturn anchorText;\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t/**\r\n\t\t * Performs the truncation of the `anchorText`, if the `anchorText` is longer than the {@link #truncate} option.\r\n\t\t * Truncates the text to 2 characters fewer than the {@link #truncate} option, and adds \"..\" to the end.\r\n\t\t * \r\n\t\t * @private\r\n\t\t * @param {String} text The anchor tag's text (i.e. what will be displayed).\r\n\t\t * @return {String} The truncated anchor text.\r\n\t\t */\r\n\t\tdoTruncate : function( anchorText ) {\r\n\t\t\tvar truncateLen = this.truncate;\r\n\t\t\t\r\n\t\t\t// Truncate the anchor text if it is longer than the provided 'truncate' option\r\n\t\t\tif( truncateLen && anchorText.length > truncateLen ) {\r\n\t\t\t\tanchorText = anchorText.substring( 0, truncateLen - 2 ) + '..';\r\n\t\t\t}\r\n\t\t\treturn anchorText;\r\n\t\t}\r\n\t\r\n\t};\r\n\t\r\n\t\r\n\t/**\r\n\t * Automatically links URLs, email addresses, and Twitter handles found in the given chunk of HTML. \r\n\t * Does not link URLs found within HTML tags.\r\n\t * \r\n\t * For instance, if given the text: `You should go to http://www.yahoo.com`, then the result\r\n\t * will be `You should go to &lt;a href=\"http://www.yahoo.com\"&gt;http://www.yahoo.com&lt;/a&gt;`\r\n\t * \r\n\t * Example:\r\n\t * \r\n\t *     var linkedText = Autolinker.link( \"Go to google.com\", { newWindow: false } );\r\n\t *     // Produces: \"Go to <a href=\"http://google.com\">google.com</a>\"\r\n\t * \r\n\t * @static\r\n\t * @method link\r\n\t * @param {String} html The HTML text to link URLs within.\r\n\t * @param {Object} [options] Any of the configuration options for the Autolinker class, specified in an Object (map).\r\n\t *   See the class description for an example call.\r\n\t * @return {String} The HTML text, with URLs automatically linked\r\n\t */\r\n\tAutolinker.link = function( text, options ) {\r\n\t\tvar autolinker = new Autolinker( options );\r\n\t\treturn autolinker.link( text );\r\n\t};\r\n\r\n\t\r\n\treturn Autolinker;\r\n\t\r\n} ) );\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/autolinker/dist/Autolinker.js\n// module id = 958\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport _ from 'lodash';\nimport OGAPI from '@opengov/og_api';\nimport GridReportActions from '../actions/grid_report_actions';\nimport utils from '../querygrid/utils';\n\nimport classNames from 'classnames';\n\nconst DEBOUNCE_INTERVAL = 150;\n\nimport { translate } from 'react-i18next';\n\nimport createReactClass from 'create-react-class';\n\nexport const AutoComplete = createReactClass<any, any>({\n  propTypes: {\n    columns: PropTypes.array, //Array of column names to be autocompleted\n    dataSetId: PropTypes.string, //ID of the dataset to autocomplete on\n    queryModel: PropTypes.object, //queryModel instance driving the query interactions\n    schema: PropTypes.array //The column schema associated with the dataset\n  },\n\n  getInitialState() {\n    return {\n      isOpen: false, //Flag to indicate if the dropdown is open\n      isLoading: false, //Indicates whether a request is pending\n      hasError: false, //Indicates if there's a network error\n      search: '', //The text within the input\n      focusedFilter: null, //The currently keyboard focused filter object: {column, value}\n      allSearchApplied: false, //Determines whether an 'all' search was applied by the autocomplete,\n      lastAppliedAction: null, //The last action applied ('all' or 'filter')\n      validColumnMap: null, //A map of the columns available for autocomplete (derived from schema prop data)\n      filters: [] //The fetched distinct filters for a given `search`\n    };\n  },\n  componentWillMount() {\n    //Debounce the fetch method to prevent spamming the server on every keystroke\n    this._debouncedFetchDistinctFilter = _.debounce(this._fetchDistinctFilters, DEBOUNCE_INTERVAL);\n    this.props.queryModel.on('change', this.handleQueryChange);\n  },\n\n  componentWillUnmount() {\n    this.props.queryModel.off('change', this.handleQueryChange);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    //Cache the computed map of valid columns in state when the schema array becomes available\n    if (nextProps.schema && !this.state.validColumnMap) {\n      let validColumnMap = _(nextProps.schema)\n        .filter(c => c.type === 'text' && _.includes(this.props.columns, c.name))\n        .keyBy('name')\n        .value();\n\n      this.setState({\n        validColumnMap\n      });\n    }\n  },\n\n  componentDidUpdate() {\n    if (this._focusedFilterReveal) {\n      if (this.refs.focused && this.refs.menu) {\n        let focusedDOM: any = ReactDOM.findDOMNode(this.refs.focused);\n        let menuDOM: any = ReactDOM.findDOMNode(this.refs.menu);\n        let focusedRect = focusedDOM.getBoundingClientRect();\n        let menuRect = menuDOM.getBoundingClientRect();\n\n        if (focusedRect.bottom > menuRect.bottom || focusedRect.top < menuRect.top) {\n          menuDOM.scrollTop = focusedDOM.offsetTop + focusedDOM.clientHeight - menuDOM.offsetHeight;\n        }\n      }\n\n      this._focusedFilterReveal = false;\n    }\n  },\n\n  isFocusedFilterInFilters() {\n    let { filters, focusedFilter } = this.state;\n    return _.includes(filters, focusedFilter);\n  },\n\n  handleQueryChange() {\n    let q = this.props.queryModel.toJSON();\n    let allFilter = q.filter && q.filter.all && q.filter.all.contains;\n    let inputColumnFilterId = this.state.focusedFilter && this.state.focusedFilter.column;\n    let inputColumnFilter = inputColumnFilterId && this.state.focusedFilter.value;\n    let columnFilter = q.filter && q.filter[inputColumnFilterId] && q.filter[inputColumnFilterId].eq;\n\n    // We need to update the text field when we have no search and an all filter appears, when an\n    // all filter we're display changes, or when a column filter we're displaying changes.\n    // TODO tie this model closer to the QueryModel and avoid this logic\n    if ((!this.state.search && allFilter) || (this.state.allSearchApplied && this.state.search !== allFilter)) {\n      this.handleAllSearch(allFilter, true);\n    } else if (inputColumnFilterId && inputColumnFilter !== columnFilter) {\n      this.handleApplyFilter({ column: inputColumnFilterId, value: columnFilter }, true);\n    }\n  },\n\n  handleClearInput() {\n    let stateUpdate = {\n      search: '',\n      isOpen: false,\n      allSearchApplied: null\n    };\n    let { lastAppliedAction, focusedFilter, allSearchApplied } = this.state;\n\n    if (focusedFilter && lastAppliedAction === 'filter') {\n      this.props.queryModel.filterColumn(this.state.focusedFilter.column, 'eq', undefined);\n      this.props.queryModel.triggerUpdate();\n    }\n    if (allSearchApplied && lastAppliedAction === 'all') {\n      this.props.queryModel.filterColumn('all', 'contains', undefined);\n      this.props.queryModel.triggerUpdate();\n      stateUpdate.allSearchApplied = false;\n    }\n\n    this.setState(stateUpdate);\n  },\n\n  handleInputChange(e) {\n    let val = e.target.value;\n    let isOpen = val.length > 2;\n    let isEmpty = val.length === 0;\n\n    this.setState({\n      isOpen,\n      search: val,\n      isLoading: isOpen\n    });\n\n    if (isEmpty) {\n      this.handleClearInput();\n    }\n\n    if (isOpen) {\n      this._debouncedFetchDistinctFilter();\n    }\n  },\n\n  handleEnter() {\n    let { focusedFilter, isOpen, search } = this.state;\n\n    if (isOpen && focusedFilter && this.isFocusedFilterInFilters()) {\n      this.handleApplyFilter(focusedFilter);\n    } else {\n      this.handleAllSearch(search);\n    }\n  },\n\n  handleAllSearch(search, skipFilterChange) {\n    let searchVal = search && utils.strip(search);\n    this.setState(\n      {\n        lastAppliedAction: 'all',\n        isOpen: false,\n        isLoading: false,\n        search,\n        allSearchApplied: true\n      },\n      () => {\n        if (!skipFilterChange) {\n          GridReportActions.filterColumn('all', 'contains', searchVal);\n        }\n      }\n    );\n  },\n\n  handleApplyFilter(f, skipFilterChange) {\n    let searchVal = f.value && utils.strip(f.value);\n    this.setState(\n      {\n        lastAppliedAction: 'filter',\n        isOpen: false,\n        isLoading: false,\n        focusedFilter: f,\n        search: f.value,\n        allSearchApplied: false\n      },\n      () => {\n        if (!skipFilterChange) {\n          GridReportActions.filterColumn(f.column, 'eq', searchVal);\n        }\n      }\n    );\n  },\n\n  handleMouseEnter(f) {\n    this.setState({\n      focusedFilter: f\n    });\n  },\n\n  handleKeyDown(event) {\n    switch (event.keyCode) {\n      case 9: // tab\n        if (event.shiftKey || !this.state.isOpen || !this.state.focusedFilter) {\n          return;\n        }\n        this.handleEnter();\n        break;\n\n      case 13: // enter\n        this.handleEnter();\n        break;\n\n      case 27: // escape\n        this.handleClearInput();\n        break;\n\n      case 38: // up\n        this.focusPreviousFilter();\n        break;\n\n      case 40: // down\n        this.focusNextFilter();\n        break;\n\n      default:\n        return;\n    }\n\n    event.preventDefault();\n  },\n\n  focusNextFilter() {\n    this._focusAdjacentFilter('next');\n  },\n\n  focusPreviousFilter() {\n    this._focusAdjacentFilter('previous');\n  },\n\n  _focusAdjacentFilter(dir) {\n    this._focusedFilterReveal = true;\n\n    let { filters, focusedFilter } = this.state;\n\n    let focusedFilterIndex = _.findIndex(filters, filter => _.isEqual(filter, focusedFilter));\n    focusedFilter = filters[0];\n\n    if (dir === 'next' && focusedFilterIndex > -1 && focusedFilterIndex < filters.length - 1) {\n      focusedFilter = filters[focusedFilterIndex + 1];\n    } else if (dir === 'previous') {\n      if (focusedFilterIndex > 0) {\n        focusedFilter = filters[focusedFilterIndex - 1];\n      } else {\n        focusedFilter = filters[filters.length - 1];\n      }\n    }\n\n    this.setState({\n      focusedFilter\n    });\n  },\n\n  _fetchDistinctFilters() {\n    let { validColumnMap, search } = this.state;\n    let { dataSetId } = this.props;\n    let query = this._buildDistinctQuery(_.keys(validColumnMap), search, 15);\n\n    //Use pendingRequests array to queue up any 'lagging' in-flight requests\n    //and abort them to prevent overwriting the current filter dropdown with old results\n    this.pendingRequests = this.pendingRequests || [];\n\n    if (this.pendingRequests.length > 0) {\n      this.pendingRequests.forEach(req => req.abort());\n    }\n\n    let request = OGAPI.trapi.post('distinct', dataSetId, query);\n    this.pendingRequests.push(request);\n\n    request\n      .end()\n      .then(res => {\n        this.setState({\n          filters: this._flattenResponse(res.body),\n          isLoading: false,\n          hasError: false\n        });\n\n        this.pendingRequests = [];\n      })\n      .catch(() => {\n        this.setState({\n          filters: [],\n          isLoading: false,\n          hasError: true\n        });\n      });\n  },\n\n  _flattenResponse(groupedFilters) {\n    let filterArr = _(groupedFilters).map((vals, col) => {\n      return _.map(vals, v => {\n        return {\n          column: col,\n          value: v\n        };\n      });\n    });\n\n    return filterArr.flatten().value();\n  },\n\n  _buildDistinctQuery(columns, contains, limit) {\n    return {\n      distinct: {\n        columns,\n        contains\n      },\n      limit\n    };\n  },\n\n  render() {\n    let { search = '', filters, focusedFilter, hasError, isLoading, isOpen, validColumnMap } = this.state;\n\n    const { t } = this.props;\n\n    let clearButton = classNames({\n      'ui-search__spinner': isLoading,\n      'is-active': search && !isLoading,\n      'icon-remove-2': search && !isLoading\n    });\n    return (\n      <div className=\"search__bar\">\n        <div className=\"search__wrapper\">\n          <div className=\"ui-search small\">\n            <span className=\"icon-search-1\" />\n            <input\n              type=\"text\"\n              tabIndex={1}\n              placeholder={t('strings.placeholders.search_in_table')}\n              value={search}\n              onKeyDown={this.handleKeyDown}\n              onChange={this.handleInputChange}\n            />\n            <span className={clearButton} onClick={this.handleClearInput} />\n          </div>\n          <button className={'ui-button small'} onClick={this.handleEnter}>\n            Search\n          </button>\n          {isOpen ? (\n            <SearchDropdown query={search} hasResults={filters.length > 0} hasError={hasError}>\n              {filters.length > 0 ? (\n                <SearchDropdownList ref=\"menu\">\n                  {filters.map(f => {\n                    return (\n                      <SearchDropdownListItem\n                        key={f.column + f.value}\n                        ref={_.isEqual(f, focusedFilter) ? 'focused' : null}\n                        isActive={_.isEqual(f, focusedFilter)}\n                        category={validColumnMap[f.column].label}\n                        value={f.value}\n                        onApplyFilter={this.handleApplyFilter.bind(null, f, false)}\n                        onMouseEnter={this.handleMouseEnter.bind(null, f)}\n                      />\n                    );\n                  })}\n                </SearchDropdownList>\n              ) : null}\n              <a className=\"ui-search__footer\" onClick={this.handleAllSearch.bind(null, this.state.search, false)}>\n                Search entire table\n              </a>\n            </SearchDropdown>\n          ) : null}\n        </div>\n      </div>\n    );\n  }\n});\n\nvar SearchDropdown = createReactClass<any, any>({\n  propTypes: {\n    query: PropTypes.string,\n    hasResults: PropTypes.bool\n  },\n\n  render() {\n    return (\n      <div className=\"ui-search__dropdown\">\n        <header className=\"ui-search__header\">\n          {this.props.hasError ? (\n            <small>Predictive search is currently unavailable</small>\n          ) : this.props.hasResults ? (\n            <small>Search results for \"{this.props.query}\"</small>\n          ) : null}\n        </header>\n\n        {this.props.children}\n      </div>\n    );\n  }\n});\n\nvar SearchDropdownList = createReactClass<any, any>({\n  render() {\n    return <ul className=\"ui-search__results\">{this.props.children}</ul>;\n  }\n});\n\nvar SearchDropdownListItem = createReactClass<any, any>({\n  propTypes: {\n    result: PropTypes.string,\n    category: PropTypes.string\n  },\n\n  render() {\n    const itemStyle = classNames({\n      'ui-search__results__item': true,\n      'is-active': this.props.isActive\n    });\n\n    return (\n      <li>\n        <a className={itemStyle} onClick={this.props.onApplyFilter} onMouseEnter={this.props.onMouseEnter}>\n          <span className=\"ui-search__results__title\">{this.props.value}</span>\n          {this.props.category ? <small className=\"ui-search__results__type\">{this.props.category}</small> : null}\n        </a>\n      </li>\n    );\n  }\n});\n\nexport default translate('report', { wait: true })(AutoComplete);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/autocomplete.tsx","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport hoistStatics from 'hoist-non-react-statics';\nimport shallowEqual from './shallowEqual';\nimport { getDefaults, setDefaults, getI18n, setI18n } from './context';\nimport I18n from './I18n';\n\nfunction getDisplayName(component) {\n  return component.displayName || component.name || 'Component';\n}\n\nexport default function translate(namespaceArg) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n  return function Wrapper(WrappedComponent) {\n    var Translate = function (_Component) {\n      _inherits(Translate, _Component);\n\n      function Translate(props, context) {\n        _classCallCheck(this, Translate);\n\n        var _this = _possibleConstructorReturn(this, (Translate.__proto__ || Object.getPrototypeOf(Translate)).call(this, props, context));\n\n        _this.i18n = props.i18n || options.i18n || context.i18n || getI18n();\n        _this.namespaces = typeof namespaceArg === 'function' ? namespaceArg(props) : namespaceArg || _this.i18n.options && _this.i18n.options.defaultNS;\n        if (typeof _this.namespaces === 'string') _this.namespaces = [_this.namespaces];\n\n        var i18nOptions = _this.i18n && _this.i18n.options && _this.i18n.options.react || {};\n        _this.options = _extends({}, getDefaults(), i18nOptions, options);\n\n        _this.getWrappedInstance = _this.getWrappedInstance.bind(_this);\n        return _this;\n      }\n\n      _createClass(Translate, [{\n        key: 'shouldComponentUpdate',\n        value: function shouldComponentUpdate(nextProps) {\n          if (!this.options.usePureComponent) {\n            return true;\n          }\n\n          return !shallowEqual(this.props, nextProps);\n        }\n      }, {\n        key: 'getWrappedInstance',\n        value: function getWrappedInstance() {\n          if (!this.options.withRef) {\n            // eslint-disable-next-line no-console\n            console.error('To access the wrapped instance, you need to specify ' + '{ withRef: true } as the second argument of the translate() call.');\n          }\n\n          /* eslint react/no-string-refs: 1 */\n          return this.wrappedInstance;\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          var _this2 = this;\n\n          var extraProps = {};\n\n          if (this.options.withRef) {\n            extraProps.ref = function (c) {\n              _this2.wrappedInstance = c;\n            };\n          }\n\n          return React.createElement(I18n, _extends({ ns: this.namespaces }, this.options, this.props, { i18n: this.i18n }), function (t, _ref) {\n            var ready = _ref.ready,\n                context = _objectWithoutProperties(_ref, ['ready']);\n\n            return React.createElement(WrappedComponent, _extends({\n              tReady: ready\n            }, _this2.props, extraProps, context));\n          });\n        }\n      }]);\n\n      return Translate;\n    }(Component);\n\n    Translate.WrappedComponent = WrappedComponent;\n\n    Translate.contextTypes = {\n      i18n: PropTypes.object\n    };\n\n    Translate.displayName = 'Translate(' + getDisplayName(WrappedComponent) + ')';\n\n    Translate.namespaces = namespaceArg;\n\n    return hoistStatics(Translate, WrappedComponent);\n  };\n}\n\ntranslate.setDefaults = setDefaults;\n\ntranslate.setI18n = setI18n;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/translate.js\n// module id = 960\n// module chunks = 0 1","var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @providesModule shallowEqual\n * @typechecks\n * \n */\n\n/* eslint-disable no-self-compare */\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nexport default function shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/shallowEqual.js\n// module id = 961\n// module chunks = 0 1","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nvar Interpolate = function (_Component) {\n  _inherits(Interpolate, _Component);\n\n  function Interpolate(props, context) {\n    _classCallCheck(this, Interpolate);\n\n    var _this = _possibleConstructorReturn(this, (Interpolate.__proto__ || Object.getPrototypeOf(Interpolate)).call(this, props, context));\n\n    _this.i18n = props.i18n || context.i18n;\n    _this.t = props.t || context.t;\n    return _this;\n  }\n\n  _createClass(Interpolate, [{\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var parent = this.props.parent || 'span';\n      var REGEXP = this.props.regexp || this.i18n.services.interpolator.regexp;\n      var _props = this.props,\n          className = _props.className,\n          style = _props.style;\n\n      // Set to true if you want to use raw HTML in translation values\n      // See https://github.com/i18next/react-i18next/issues/189\n\n      var useDangerouslySetInnerHTML = this.props.useDangerouslySetInnerHTML || false;\n      var dangerouslySetInnerHTMLPartElement = this.props.dangerouslySetInnerHTMLPartElement || 'span';\n\n      var tOpts = _extends({}, this.props.options, { interpolation: { prefix: '#$?', suffix: '?$#' } });\n      var format = this.t(this.props.i18nKey, tOpts);\n\n      if (!format || typeof format !== 'string') return React.createElement('noscript', null);\n\n      var children = [];\n\n      var handleFormat = function handleFormat(key, props) {\n        if (key.indexOf(_this2.i18n.options.interpolation.formatSeparator) < 0) {\n          if (props[key] === undefined) _this2.i18n.services.logger.warn('interpolator: missed to pass in variable ' + key + ' for interpolating ' + format);\n          return props[key];\n        }\n\n        var p = key.split(_this2.i18n.options.interpolation.formatSeparator);\n        var k = p.shift().trim();\n        var f = p.join(_this2.i18n.options.interpolation.formatSeparator).trim();\n\n        if (props[k] === undefined) _this2.i18n.services.logger.warn('interpolator: missed to pass in variable ' + k + ' for interpolating ' + format);\n        return _this2.i18n.options.interpolation.format(props[k], f, _this2.i18n.language);\n      };\n\n      format.split(REGEXP).reduce(function (memo, match, index) {\n        var child = void 0;\n\n        if (index % 2 === 0) {\n          if (match.length === 0) return memo;\n          if (useDangerouslySetInnerHTML) {\n            child = React.createElement(dangerouslySetInnerHTMLPartElement, { dangerouslySetInnerHTML: { __html: match } });\n          } else {\n            child = match;\n          }\n        } else {\n          child = handleFormat(match, _this2.props);\n        }\n\n        memo.push(child);\n        return memo;\n      }, children);\n\n      var additionalProps = {};\n      if (this.i18n.options.react && this.i18n.options.react.exposeNamespace) {\n        var ns = typeof this.t.ns === 'string' ? this.t.ns : this.t.ns[0];\n        if (this.props.i18nKey && this.i18n.options.nsSeparator && this.props.i18nKey.indexOf(this.i18n.options.nsSeparator) > -1) {\n          var parts = this.props.i18nKey.split(this.i18n.options.nsSeparator);\n          ns = parts[0];\n        }\n        if (this.t.ns) additionalProps['data-i18next-options'] = JSON.stringify({ ns: ns });\n      }\n\n      if (className) additionalProps.className = className;\n      if (style) additionalProps.style = style;\n\n      return React.createElement.apply(this, [parent, additionalProps].concat(children));\n    }\n  }]);\n\n  return Interpolate;\n}(Component);\n\nInterpolate.propTypes = {\n  className: PropTypes.string\n};\n\nInterpolate.defaultProps = {\n  className: ''\n};\n\nInterpolate.contextTypes = {\n  i18n: PropTypes.object.isRequired,\n  t: PropTypes.func.isRequired\n};\n\nexport default Interpolate;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/Interpolate.js\n// module id = 962\n// module chunks = 0 1","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport HTML from 'html-parse-stringify2';\n\nfunction hasChildren(node) {\n  return node && (node.children || node.props && node.props.children);\n}\n\nfunction getChildren(node) {\n  return node && node.children ? node.children : node.props && node.props.children;\n}\n\nfunction nodesToString(mem, children, index) {\n  if (!children) return '';\n  if (Object.prototype.toString.call(children) !== '[object Array]') children = [children];\n\n  children.forEach(function (child, i) {\n    // const isElement = React.isValidElement(child);\n    // const elementKey = `${index !== 0 ? index + '-' : ''}${i}:${typeof child.type === 'function' ? child.type.name : child.type || 'var'}`;\n    var elementKey = '' + i;\n\n    if (typeof child === 'string') {\n      mem = '' + mem + child;\n    } else if (hasChildren(child)) {\n      mem = mem + '<' + elementKey + '>' + nodesToString('', getChildren(child), i + 1) + '</' + elementKey + '>';\n    } else if (React.isValidElement(child)) {\n      mem = mem + '<' + elementKey + '></' + elementKey + '>';\n    } else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') {\n      var clone = _extends({}, child);\n      var format = clone.format;\n      delete clone.format;\n\n      var keys = Object.keys(clone);\n      if (format && keys.length === 1) {\n        mem = mem + '<' + elementKey + '>{{' + keys[0] + ', ' + format + '}}</' + elementKey + '>';\n      } else if (keys.length === 1) {\n        mem = mem + '<' + elementKey + '>{{' + keys[0] + '}}</' + elementKey + '>';\n      } else if (console && console.warn) {\n        // not a valid interpolation object (can only contain one value plus format)\n        console.warn('react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.', child);\n      }\n    } else if (console && console.warn) {\n      console.warn('react-i18next: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.', child);\n    }\n  });\n\n  return mem;\n}\n\nfunction renderNodes(children, targetString, i18n) {\n  if (targetString === \"\") return [];\n  if (!children) return [targetString];\n\n  // parse ast from string with additional wrapper tag\n  // -> avoids issues in parser removing prepending text nodes\n  var ast = HTML.parse('<0>' + targetString + '</0>');\n\n  function mapAST(reactNodes, astNodes) {\n    if (Object.prototype.toString.call(reactNodes) !== '[object Array]') reactNodes = [reactNodes];\n    if (Object.prototype.toString.call(astNodes) !== '[object Array]') astNodes = [astNodes];\n\n    return astNodes.reduce(function (mem, node, i) {\n      if (node.type === 'tag') {\n        var child = reactNodes[parseInt(node.name, 10)] || {};\n        var isElement = React.isValidElement(child);\n\n        if (typeof child === 'string') {\n          mem.push(child);\n        } else if (hasChildren(child)) {\n          var inner = mapAST(getChildren(child), node.children);\n          if (child.dummy) child.children = inner; // needed on preact!\n          mem.push(React.cloneElement(child, _extends({}, child.props, { key: i }), inner));\n        } else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object' && !isElement) {\n          var interpolated = i18n.services.interpolator.interpolate(node.children[0].content, child, i18n.language);\n          mem.push(interpolated);\n        } else {\n          mem.push(child);\n        }\n      } else if (node.type === 'text') {\n        mem.push(node.content);\n      }\n      return mem;\n    }, []);\n  }\n\n  // call mapAST with having react nodes nested into additional node like\n  // we did for the string ast from translation\n  // return the children of that extra node to get expected result\n  var result = mapAST([{ dummy: true, children: children }], ast);\n  return getChildren(result[0]);\n}\n\nvar Trans = function (_React$Component) {\n  _inherits(Trans, _React$Component);\n\n  function Trans() {\n    _classCallCheck(this, Trans);\n\n    return _possibleConstructorReturn(this, (Trans.__proto__ || Object.getPrototypeOf(Trans)).apply(this, arguments));\n  }\n\n  _createClass(Trans, [{\n    key: 'render',\n    value: function render() {\n      var contextAndProps = _extends({ i18n: this.context.i18n, t: this.context.t }, this.props);\n\n      var children = contextAndProps.children,\n          count = contextAndProps.count,\n          parent = contextAndProps.parent,\n          i18nKey = contextAndProps.i18nKey,\n          tOptions = contextAndProps.tOptions,\n          namespace = contextAndProps.ns,\n          i18n = contextAndProps.i18n,\n          tFromContextAndProps = contextAndProps.t,\n          additionalProps = _objectWithoutProperties(contextAndProps, ['children', 'count', 'parent', 'i18nKey', 'tOptions', 'ns', 'i18n', 't']);\n\n      var t = tFromContextAndProps || i18n.t.bind(i18n);\n\n      var reactI18nextOptions = i18n.options && i18n.options.react || {};\n      var useAsParent = parent !== undefined ? parent : reactI18nextOptions.defaultTransParent;\n\n      var defaultValue = nodesToString('', children, 0);\n      var hashTransKey = reactI18nextOptions.hashTransKey;\n      var key = i18nKey || (hashTransKey ? hashTransKey(defaultValue) : defaultValue);\n      var translation = key ? t(key, _extends({}, tOptions, { interpolation: { prefix: '#$?', suffix: '?$#' }, defaultValue: defaultValue, count: count, ns: namespace })) : defaultValue;\n\n      if (reactI18nextOptions.exposeNamespace) {\n        var ns = typeof t.ns === 'string' ? t.ns : t.ns[0];\n        if (i18nKey && i18n.options && i18n.options.nsSeparator && i18nKey.indexOf(i18n.options.nsSeparator) > -1) {\n          var parts = i18nKey.split(i18n.options.nsSeparator);\n          ns = parts[0];\n        }\n        if (t.ns) additionalProps['data-i18next-options'] = JSON.stringify({ ns: ns });\n      }\n\n      if (!useAsParent) return renderNodes(children, translation, i18n);\n\n      return React.createElement(useAsParent, additionalProps, renderNodes(children, translation, i18n));\n    }\n  }]);\n\n  return Trans;\n}(React.Component);\n\nexport default Trans;\n\n\nTrans.propTypes = {\n  count: PropTypes.number,\n  parent: PropTypes.node,\n  i18nKey: PropTypes.string,\n  i18n: PropTypes.object,\n  t: PropTypes.func\n};\n\n// Trans.defaultProps = {\n//   parent: 'div'\n// };\n\nTrans.contextTypes = {\n  i18n: PropTypes.object.isRequired,\n  t: PropTypes.func\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/Trans.js\n// module id = 963\n// module chunks = 0 1","module.exports = {\n    parse: require('./lib/parse'),\n    stringify: require('./lib/stringify')\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-parse-stringify2/index.js\n// module id = 964\n// module chunks = 0 1","/*jshint -W030 */\nvar tagRE = /(?:<!--[\\S\\s]*?-->|<(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\">])+>)/g;\nvar parseTag = require('./parse-tag');\n// re-used obj for quick lookups of components\nvar empty = Object.create ? Object.create(null) : {};\n// common logic for pushing a child node onto a list\nfunction pushTextNode(list, html, level, start, ignoreWhitespace) {\n    // calculate correct end of the content slice in case there's\n    // no tag after the text node.\n    var end = html.indexOf('<', start);\n    var content = html.slice(start, end === -1 ? undefined : end);\n    // if a node is nothing but whitespace, collapse it as the spec states:\n    // https://www.w3.org/TR/html4/struct/text.html#h-9.1\n    if (/^\\s*$/.test(content)) {\n        content = ' ';\n    }\n    // don't add whitespace-only text nodes if they would be trailing text nodes\n    // or if they would be leading whitespace-only text nodes:\n    //  * end > -1 indicates this is not a trailing text node\n    //  * leading node is when level is -1 and list has length 0\n    if ((!ignoreWhitespace && end > -1 && level + list.length >= 0) || content !== ' ') {\n        list.push({\n            type: 'text',\n            content: content\n        });\n    }\n}\n\nmodule.exports = function parse(html, options) {\n    options || (options = {});\n    options.components || (options.components = empty);\n    var result = [];\n    var current;\n    var level = -1;\n    var arr = [];\n    var byTag = {};\n    var inComponent = false;\n\n    html.replace(tagRE, function (tag, index) {\n        if (inComponent) {\n            if (tag !== ('</' + current.name + '>')) {\n                return;\n            } else {\n                inComponent = false;\n            }\n        }\n\n        var isOpen = tag.charAt(1) !== '/';\n        var isComment = tag.indexOf('<!--') === 0;\n        var start = index + tag.length;\n        var nextChar = html.charAt(start);\n        var parent;\n\n        if (isOpen && !isComment) {\n            level++;\n\n            current = parseTag(tag);\n            if (current.type === 'tag' && options.components[current.name]) {\n                current.type = 'component';\n                inComponent = true;\n            }\n\n            if (!current.voidElement && !inComponent && nextChar && nextChar !== '<') {\n                pushTextNode(current.children, html, level, start, options.ignoreWhitespace);\n            }\n\n            byTag[current.tagName] = current;\n\n            // if we're at root, push new base node\n            if (level === 0) {\n                result.push(current);\n            }\n\n            parent = arr[level - 1];\n\n            if (parent) {\n                parent.children.push(current);\n            }\n\n            arr[level] = current;\n        }\n\n        if (isComment || !isOpen || current.voidElement) {\n            if (!isComment) {\n                level--;\n            }\n            if (!inComponent && nextChar !== '<' && nextChar) {\n                // trailing text node\n                // if we're at the root, push a base text node. otherwise add as\n                // a child to the current node.\n                parent = level === -1 ? result : arr[level].children;\n                pushTextNode(parent, html, level, start, options.ignoreWhitespace);\n            }\n        }\n    });\n\n    // If the \"html\" passed isn't actually html, add it as a text node.\n    if (!result.length && html.length) {\n        pushTextNode(result, html, 0, 0, options.ignoreWhitespace);\n    }\n\n    return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-parse-stringify2/lib/parse.js\n// module id = 965\n// module chunks = 0 1","var attrRE = /([\\w-]+)|=|(['\"])([.\\s\\S]*?)\\2/g;\nvar voidElements = require('void-elements');\n\nmodule.exports = function (tag) {\n    var i = 0;\n    var key;\n    var expectingValueAfterEquals = true;\n    var res = {\n        type: 'tag',\n        name: '',\n        voidElement: false,\n        attrs: {},\n        children: []\n    };\n\n    tag.replace(attrRE, function (match) {\n        if (match === '=') {\n            expectingValueAfterEquals = true;\n            i++;\n            return;\n        }\n\n        if (!expectingValueAfterEquals) {\n            if (key) {\n                res.attrs[key] = key; // boolean attribute\n            }\n            key=match;\n        } else {\n            if (i === 0) {\n                if (voidElements[match] || tag.charAt(tag.length - 2) === '/') {\n                    res.voidElement = true;\n                }\n                res.name = match;\n            } else {\n                res.attrs[key] = match.replace(/^['\"]|['\"]$/g, '');\n                key=undefined;\n            }\n        }\n        i++;\n        expectingValueAfterEquals = false;\n    });\n\n    return res;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-parse-stringify2/lib/parse-tag.js\n// module id = 966\n// module chunks = 0 1","/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n  \"area\": true,\n  \"base\": true,\n  \"br\": true,\n  \"col\": true,\n  \"embed\": true,\n  \"hr\": true,\n  \"img\": true,\n  \"input\": true,\n  \"keygen\": true,\n  \"link\": true,\n  \"menuitem\": true,\n  \"meta\": true,\n  \"param\": true,\n  \"source\": true,\n  \"track\": true,\n  \"wbr\": true\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/void-elements/index.js\n// module id = 967\n// module chunks = 0 1","function attrString(attrs) {\n    var buff = [];\n    for (var key in attrs) {\n        buff.push(key + '=\"' + attrs[key] + '\"');\n    }\n    if (!buff.length) {\n        return '';\n    }\n    return ' ' + buff.join(' ');\n}\n\nfunction stringify(buff, doc) {\n    switch (doc.type) {\n    case 'text':\n        return buff + doc.content;\n    case 'tag':\n        buff += '<' + doc.name + (doc.attrs ? attrString(doc.attrs) : '') + (doc.voidElement ? '/>' : '>');\n        if (doc.voidElement) {\n            return buff;\n        }\n        return buff + doc.children.reduce(stringify, '') + '</' + doc.name + '>';\n    }\n}\n\nmodule.exports = function (doc) {\n    return doc.reduce(function (token, rootEl) {\n        return token + stringify('', rootEl);\n    }, '');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-parse-stringify2/lib/stringify.js\n// module id = 968\n// module chunks = 0 1","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport { Component, Children } from 'react';\nimport PropTypes from 'prop-types';\n\nvar I18nextProvider = function (_Component) {\n  _inherits(I18nextProvider, _Component);\n\n  function I18nextProvider(props, context) {\n    _classCallCheck(this, I18nextProvider);\n\n    var _this = _possibleConstructorReturn(this, (I18nextProvider.__proto__ || Object.getPrototypeOf(I18nextProvider)).call(this, props, context));\n\n    _this.i18n = props.i18n;\n    if (props.initialI18nStore) {\n      _this.i18n.services.resourceStore.data = props.initialI18nStore;\n      _this.i18n.options.isInitialSSR = true; // if set will be deleted on first render in translate hoc\n    }\n    if (props.initialLanguage) {\n      _this.i18n.changeLanguage(props.initialLanguage);\n    }\n    return _this;\n  }\n\n  _createClass(I18nextProvider, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return { i18n: this.i18n };\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.props.i18n !== nextProps.i18n) {\n        throw new Error('[react-i18next][I18nextProvider]does not support changing the i18n object.');\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var children = this.props.children;\n\n      return Children.only(children);\n    }\n  }]);\n\n  return I18nextProvider;\n}(Component);\n\nI18nextProvider.propTypes = {\n  i18n: PropTypes.object.isRequired,\n  children: PropTypes.element.isRequired\n};\n\nI18nextProvider.childContextTypes = {\n  i18n: PropTypes.object.isRequired\n};\n\nexport default I18nextProvider;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/I18nextProvider.js\n// module id = 969\n// module chunks = 0 1","var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// shim object entries\nif (!Object.entries) Object.entries = function (obj) {\n  var ownProps = Object.keys(obj),\n      i = ownProps.length,\n      resArray = new Array(i); // preallocate the Array\n  while (i--) {\n    resArray[i] = [ownProps[i], obj[ownProps[i]]];\n  }return resArray;\n};\n\n// Borrowed from https://github.com/Rezonans/redux-async-connect/blob/master/modules/ReduxAsyncConnect.js#L16\nfunction eachComponents(components, iterator) {\n  for (var i = 0, l = components.length; i < l; i++) {\n    // eslint-disable-line id-length\n    if (_typeof(components[i]) === 'object') {\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = Object.entries(components[i])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var _step$value = _slicedToArray(_step.value, 2),\n              key = _step$value[0],\n              value = _step$value[1];\n\n          iterator(value, i, key);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    } else {\n      iterator(components[i], i);\n    }\n  }\n}\n\nfunction filterAndFlattenComponents(components) {\n  var flattened = [];\n  eachComponents(components, function (Component) {\n    if (Component && Component.namespaces) {\n\n      Component.namespaces.forEach(function (namespace) {\n        if (flattened.indexOf(namespace) === -1) {\n          flattened.push(namespace);\n        }\n      });\n    }\n  });\n  return flattened;\n}\n\nexport default function loadNamespaces(_ref) {\n  var components = _ref.components,\n      i18n = _ref.i18n;\n\n  var allNamespaces = filterAndFlattenComponents(components);\n\n  return new Promise(function (resolve) {\n    i18n.loadNamespaces(allNamespaces, resolve);\n  });\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-i18next/dist/es/loadNamespaces.js\n// module id = 970\n// module chunks = 0 1","import React from 'react';\nimport classNames from 'classnames';\nimport GridReportActions from '../actions/grid_report_actions';\nimport FilterPill from './filter_pill';\nimport { getFormattedFilters } from '../utils/filters_utils';\n\n//sub-panel for filter bubbles\nconst SubReportHeader = (props) => {\n  const locale = props.report && props.report.attributes && props.report.attributes.locale;\n  let filters = [];\n  if (props.queryModel._q.filter) {\n    filters = getFormattedFilters(props.queryModel._q.filter, props.columns, locale);\n  }\n\n  const handleReset = () => {\n    props.onAction('reset-filters');\n  };\n\n  const handleClickBack = () => {\n    GridReportActions.goBack();\n  };\n\n  let breakdownLabel;\n\n  if(props.schema) {\n    for (const value of props.schema.values()) {\n      if(value.name === props.breakdown) { breakdownLabel = value.label};\n    }\n  } else {\n    breakdownLabel = \"\";\n  }\n\n  return (\n    <div id=\"report-drilldown-title\" className=\"report__header__subpanel\">\n      <div className=\"report-drilldown-controls\">\n        <div className=\"page-navigation tile\">\n          <button className={'ui-button icon-left-1 small ' + classNames({disabled: !props.canGoBack})}\n            onClick={handleClickBack}\n            disabled={!props.canGoBack}>\n            Back\n          </button>\n          <button className={'ui-button icon-rotateleft-1 small ' + classNames({disabled: !props.canReset})}\n            onClick={handleReset}\n            disabled={!props.canReset}>\n            Reset\n          </button>\n        </div>\n      </div>\n      <h2 className=\"grid_subtitle\"><small>Broken down by</small>{breakdownLabel}</h2>\n      {filters.map((filterObj) => {\n        let filterObjKey = filterObj.field + '_' + filterObj.operatorLabel;\n        return ( <FilterPill filter={filterObj} filterMenu={props.filterMenu} key={filterObjKey} filterPanel={props.filterMenu && props.filterMenu.view('subpanel__filters')} clearSearch={props.onClear} /> );\n      })}\n    </div>\n  );\n};\n\nexport default SubReportHeader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/sub_report_header.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport createReactClass from 'create-react-class';\n\nconst FilterPill = createReactClass<any, any>({\n  render() {\n    const {\n      filter,\n      filterMenu,\n      filterPanel\n    } = this.props;\n\n    let dataHint;\n    let pillTextBody;\n\n    // On hover of filter bubble show a tooltip with the name of the column,\n    // the type of filter applied, and the full text of the filter.\n    if (filter.operatorLabel == 'blank' || filter.operatorLabel == 'not blank') {\n      pillTextBody = filter.operatorLabel.toUpperCase();\n      dataHint = filter.friendlyName + ' ' + filter.operatorDescription;\n    } else if (filter.valueLabel != '') {\n      pillTextBody = filter.valueLabel;\n      if (filter.operator == 'all') {\n        dataHint = filter.friendlyName + ' ' + filter.valueLabel + ' ' + filter.operatorDescription;\n      } else {\n        dataHint = filter.friendlyName + ' ' + filter.operatorDescription + ' ' + filter.valueLabel;\n      }\n    }\n    let pillFilterType = filter.operatorDisplay;\n\n    return (\n      <div className=\"tile\">\n        <span className=\"page-title__filter-tag grid-report-filter\"\n          data-hint={dataHint}\n          data-hint-position={'bottom'}>\n            <div className=\"pill-closable small\">\n              <button onClick={this.handleClick.bind(this, filterMenu)} className=\"ui-button pill_value pill-text-ellipse\">\n                  <span className=\"filter-type\"> {pillFilterType} </span>\n                  <span className=\"filter-text\">{pillTextBody}</span>\n              </button>\n              <button aria-label=\"Remove filter\" className=\"ui-button pill_close icon-remove-4\" onClick={this.handleFilterRemove.bind(this, filterPanel, filter.field, filter.value, filter.operator)} />\n            </div>\n        </span>\n      </div>\n    );\n  },\n\n  handleClick(filterMenu) {\n    filterMenu.toggle('filters', true);\n  },\n\n  handleFilterRemove(filterPanel, field, value, operator) {\n    if (operator == 'all') {\n      this.props.clearSearch();\n    } else {\n      const index = _.findIndex(filterPanel.filters, {'field': field, 'value': value });\n      filterPanel.removeFilter(index, true);\n    }\n\n  }\n});\n\nexport default FilterPill;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/filter_pill.tsx","import utils from '../querygrid/utils';\nimport _ from 'lodash';\n/**\n * Returns the column object based on the fieldId passed\n *\n * @param {string} id - The id of the filter field\n * @param {Immutable.List} gridColumns - A collection of columns from the grid\n * @returns {<Object>}\n */\n\nexport const getColumnById = (id, columns) => {\n  return columns.filter((column) => column.get('id') == id).toJS()[0];\n};\n\n/**\n* Returns the formatted array of filters\n*\n* @param {Immutable.List} queryModelFilter - A collection of the filters from the grid query model\n* @param {Immutable.List} gridColumns - A collection of columns from the grid\n* @returns {array<Object>}\n*/\nexport const getFormattedFilters = (queryModelFilter, columns, locale?) => {\n  const labels = {\n    eq: ['equal to', '=', 'is equal to'],\n    ne: ['not', '≠', 'is not equal to'],\n    gt: ['greater than', '>', 'is greater than'],\n    ge: ['at least', '≥', 'is greater than or equal to'],\n    lt: ['less than', '<', 'is less than'],\n    le: ['at most', '≤', 'is less than or equal to'],\n    null: ['blank', '', 'is blank'],\n    notnull: ['not blank', '', 'is not blank'],\n    contains: ['contains', '{ }', 'contains'],\n    all: ['contains', '{ }', 'across all columns'],\n    fy: ['fiscal year', 'FY', ''],\n    xyz: ['within last # of days', '', '']\n  };\n\n  let filterArray = [];\n  _.each(queryModelFilter, function(filter, field) {\n    _.each(filter, function(value, operator) {\n      let column;\n      if (field === 'all') {\n        column = {label : 'Contains'};\n        operator = field;\n      } else {\n        column = getColumnById(field, columns);\n      }\n\n      if (!column) {\n        return;\n      }\n\n      // fix for OLY-395 :Filter bubble is getting created without filter\n      // if filter is not of type blank and not blank and still the value is empty, do not render the filter\n      if (operator != 'null' && operator != 'notnull' && !value) {\n        return;\n      }\n\n      const f = {\n        field,\n        friendlyName: column.label,\n        operator,\n        value,\n        valueLabel: utils.getInputFormatter(column, locale)(value),\n        operatorLabel: labels[operator][0],\n        operatorDisplay: labels[operator][1],\n        operatorDescription: labels[operator][2]\n      };\n      filterArray.push(f);\n    });\n  });\n\n  return filterArray;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/filters_utils.ts","import React from 'react';\nimport _ from 'lodash';\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\n\nimport { IAmountType, AmountsTypes } from '../utils/transactions_utils';\n\ninterface IAmountsTypeMenuProps {\n  value: IAmountType;\n  onChange(value): void;\n}\n\nconst AmountsTypeMenu: React.SFC<IAmountsTypeMenuProps> = ({ value, onChange }) => (\n  <div className=\"ui-mainpanel__section\">\n    <div className=\"ui-mainpanel__section-header\">\n      Amounts\n    </div>\n    <div className=\"ui-mainpanel__section\">\n      <DropdownList value={value} onChange={onChange}>\n        {_.map(AmountsTypes, (value, key) => (\n          <DropdownListItem key={key} title={key} value={value} />\n        ))}\n      </DropdownList>\n    </div>\n  </div>\n);\n\nexport default AmountsTypeMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/amounts_type_menu.tsx","import React from 'react';\n\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\nimport GridReportActions from '../actions/grid_report_actions';\nimport { filterAmountColumns } from '../utils/transactions_utils';\nimport AmountColumnsPanelToggle from '../visibility_settings/amount_column_settings/amount_columns_settings_toggle';\nimport AmountColumnsPanel from '../visibility_settings/amount_column_settings/amount_columns_settings_panel';\n\nexport default function AmountMenu(props) {\n  const { amountColumn, visualization, showAmountColumnPanel, isControlPanel } = props;\n  const amountColumnOptions = filterAmountColumns(visualization);\n  const amountColumns = !showAmountColumnPanel ? amountColumnOptions : visualization.get('amountColumns');\n\n  return (\n    <div className=\"ui-mainpanel__section amount_menu\">\n    <div className=\"ui-mainpanel__section-header\">\n      Show{isControlPanel && <AmountColumnsPanelToggle /> }\n    </div>\n    {showAmountColumnPanel && <AmountColumnsPanel columns={visualization.get('amountColumns')} panelType=\"Amount\" visualization={visualization} currentAmountColumn={amountColumn}/> }\n    <DropdownList\n      value={amountColumn}\n      onChange={GridReportActions.setAmountColumn}>\n      {amountColumns.map((column, i) => {\n        return (\n          <DropdownListItem\n            key={i}\n            value={column.get('id')}\n            title={column.get('label')} />\n        );\n      }).toArray()}\n    </DropdownList>\n    </div>\n  );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/amount_menu.tsx","import React from 'react';\nimport GridReportActions from '../../actions/grid_report_actions';\n\nexport default function AmountColumnsPanelToggle() {\n  return (\n    <div className=\"visibility-settings-icon icon-settings-1 amount_column_toggle\" onClick={GridReportActions.toggleColumnsSettingsPanel} >\n    </div>\n  );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/amount_column_settings/amount_columns_settings_toggle.tsx","import React from 'react';\nimport { findDOMNode } from 'react-dom';\nimport GridReportActions from '../../actions/grid_report_actions';\nimport _ from 'lodash';\nimport ErrorContainer from '../error';\nimport PanelData from '../panel_data';\nimport PanelHeader from '../panel_header';\nimport { filterAmountColumns, getVisibleAmountColumns } from '../../utils/transactions_utils';\nimport ReportViewStore from '../../stores/report_view_store';\nimport { getFooterClass, getVisibilityPanelClass } from '../visibility_utils';\nimport $ from 'jquery';\n\nexport default class AmountColumnsPanelContainer extends React.Component<any, any> {\n\n  settingsColumns: any[];\n  columnsSettingsPanel: any;\n\n  componentWillMount() {\n    this._subscribeDOMEvents();\n    //settingsColumns holds the list of ids of changed columns.\n    //This is tracked to handle reset of columns in cancel\n    this.settingsColumns = [];\n  }\n\n  componentWillUnmount() {\n    this._unsubscribeDOMEvents();\n  }\n\n  _subscribeDOMEvents = () => {\n    $(document).on('click', this.handleDocumentClickAmountColumns);\n  }\n\n  _unsubscribeDOMEvents = () => {\n    this.resetColumns();\n    $(document).off('click', this.handleDocumentClickAmountColumns);\n  }\n\n  handleDocumentClickAmountColumns = (e) => {\n    const inContainer = $.contains(findDOMNode(this.columnsSettingsPanel) as Element, e.target);\n    const inAmountColumnSettingToggle = e.target.className.indexOf('amount_column_toggle');\n    //check if the click is not in the panel container and the gear toggle icon\n    if (!inContainer && inAmountColumnSettingToggle == -1) {\n      this.handleColumnsSettingsCancel();\n    }\n  }\n\n  //Returns false if all columns are hidden\n  isVisibilityValid = () => {\n    const visibleColumns = getVisibleAmountColumns(this.props.columns);\n    return visibleColumns.length > 0 ? true : false;\n  }\n\n  handleColumnsSettingsSave = () => {\n    this.setCurrentAmountColumn();\n    this.settingsColumns = [];\n    GridReportActions.toggleColumnsSettingsPanel();\n  }\n\n  resetColumns = () => {\n    if (this.settingsColumns.length > 0) {\n      GridReportActions.resetColumns(this.settingsColumns, 'amount');\n    }\n  }\n\n  handleColumnsSettingsCancel = () => {\n    this.resetColumns();\n    this.settingsColumns = [];\n    GridReportActions.toggleColumnsSettingsPanel();\n  }\n\n  //Returns true if all the columns are checked\n  //the columns that will undergo a change in its visibility\n  isAllColumnsVisible = () => {\n    const visibleColumns = getVisibleAmountColumns(this.props.columns);\n    const isAllColumnChecked = visibleColumns.length === this.props.columns.size;\n    const hiddenColumns = isAllColumnChecked ? this.props.columns : this.props.columns.filter((amountColumn) => !_.includes(visibleColumns, amountColumn.get('id')));\n    return { isAllColumnChecked, hiddenColumns};\n  }\n\n  toggleAllColumnVisibility = () => {\n    const { isAllColumnChecked, hiddenColumns} = this.isAllColumnsVisible();\n    //Update the settingsColumns used for reseting\n    const hiddenColumnsIds = _.map(hiddenColumns.toJS(), 'id');\n    _.each(hiddenColumnsIds, (hiddenColumn) => {\n      const index = this.settingsColumns.indexOf(hiddenColumn);\n      _.includes(this.settingsColumns, hiddenColumn) ? this.settingsColumns.splice(index, 1) : this.settingsColumns.push(hiddenColumn);\n    });\n    //if any one unchecked -> isVisibilityValid = true then check all.\n    const visibility = this.isVisibilityValid() ? !isAllColumnChecked : false;\n    GridReportActions.hideColumn(hiddenColumns, visibility, 'amount', true);\n  }\n\n  toggleColumnVisibility = (column, visibility) => {\n    _.defer(() => {\n      GridReportActions.hideColumn(column, visibility, 'amount', false);\n      const index = this.settingsColumns.indexOf(column.get('id'));\n      _.includes(this.settingsColumns, column.get('id')) ? this.settingsColumns.splice(index, 1) : this.settingsColumns.push(column.get('id'));\n    });\n  }\n\n  //set breakdown in the visualization\n  setCurrentAmountColumn = () => {\n    const { currentAmountColumn, visualization } = this.props;\n    const amountColumnOptions = filterAmountColumns(visualization);\n    const availableColumns = _.map(amountColumnOptions.toJS(), 'id');\n    if (availableColumns && availableColumns.length > 0 && !_.includes(availableColumns, currentAmountColumn)) {\n      // If the currently selected column is not present in the availableColumns\n      // we set the amount column as the first element\n      GridReportActions.setAmountColumn(_.head(availableColumns));\n    }\n  }\n\n  render() {\n    const { columns, panelType } = this.props;\n    const isEditingDefaultState = ReportViewStore.isEditingDefaultState();\n    const footerClass = getFooterClass(isEditingDefaultState);\n    const visibilityPanelClass = getVisibilityPanelClass(isEditingDefaultState);\n\n    return (\n      <div ref={(columnsSettingsPanel) => { this.columnsSettingsPanel = columnsSettingsPanel; }} className=\"subpanels js-subpanels is-expanded\">\n        <div className=\"subpanel ui-panel js-subpanel ready open\">\n          <header className=\"ui-panel__header\">\n            <h3>{panelType} Columns</h3>\n            <span className=\"ui-panel__close\" onClick={this.handleColumnsSettingsCancel} />\n          </header>\n          <footer className={footerClass}>\n            <div className=\"ui-panel__actions\">\n              <button className=\"ui-button ghost no-color visibility-panel-cancel\" onClick={this.handleColumnsSettingsCancel}>Cancel</button>\n              <button className={`ui-button primary ${!this.isVisibilityValid() ? 'disabled' : ''}`} onClick={this.handleColumnsSettingsSave}>Save</button>\n            </div>\n          </footer>\n          <div className={visibilityPanelClass}>\n            <div className=\"visibility-panel-sub-header subpanel__options\">\n              {!this.isVisibilityValid() ?\n                <ErrorContainer message={'You must select at least one amount column'} />\n              : null}\n              <PanelHeader panelType={panelType} toggleAllColumnVisibility={this.toggleAllColumnVisibility} />\n            </div>\n            <ul className=\"visibility-panel-container drop-item1__wrapper sortable-items\">\n              {columns.map((column) => {\n                return (\n                  <PanelData key={column} column={column} toggleColumnVisibility={this.toggleColumnVisibility}/>\n                );\n              })}\n            </ul>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/amount_column_settings/amount_columns_settings_panel.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport className from 'classnames';\nimport checkMapboxGLSupport from 'mapbox-gl-supported';\n\nimport GridReportActions from '../actions/grid_report_actions';\n\nimport AggregateVisualizationCharts from './aggregate_visualization_charts';\nimport MapAmountMenu from './map_amount_menu';\nimport MapTypeMenu from './map/map_type_menu';\nimport GraphType from './grid_graph_type';\nimport { MapTypes } from '../maps/map_constants';\nimport MapUnsupportedMessage from './map/map_unsupported_message';\nimport MiniLoader from '../mini_loader';\nconst aggregateVizHeight = 350;\nconst mapHeight = 450;\n\nimport _ from 'lodash';\n\nexport default class AggregateVisualization extends React.PureComponent<any, any> {\n\n  static propTypes = {\n    isMapboxGlSupported: PropTypes.bool,\n  };\n\n  static defaultProps = {\n    isMapboxGlSupported: checkMapboxGLSupport()\n  };\n\n  renderMap(currentBreakdown, showLegend, filter, visualization) {\n    const { isMapboxGlSupported, map, locale } = this.props;\n    if (!isMapboxGlSupported) {\n      return (\n        <MapUnsupportedMessage height={aggregateVizHeight} />\n      );\n    }\n    if (!map.getIn(['dataStats', 'isInvalid']) && map.get('extractors')) {\n      const mapLegendPage = visualization.get('mapLegendPage');\n      const breakdown = visualization.get('breakdown');\n      const colorMap = map.get('legendColorMap') && map.get('legendColorMap')[breakdown];\n      const currentMapType = visualization.get('currentMapType');\n      const GLGridMap = require('./map/gl_grid_map').default;\n\n      return (\n        <GLGridMap\n          height={mapHeight}\n          data={map.get('data')}\n          layer={map.get('layer')}\n          stats={map.get('dataStats')}\n          mapType={currentMapType}\n          breakdown={currentBreakdown}\n          legendPage={mapLegendPage}\n          showLegend={showLegend}\n          colorMap={colorMap}\n          filter={filter}\n          locale={locale}\n          visualization={visualization}\n          mapExtractors={map.get('extractors')} />\n      );\n    }\n  }\n\n  renderTooltipEditStatus() {\n    return (\n      <div className=\"grid_report__tooltip_edit_notice\">\n        <h6>TOOLTIP EDIT MODE</h6>\n        <span>You're editing your tooltip styling. Pick the information you'd like to appear in your tooltip and then click save.</span>\n      </div>\n    );\n  }\n\n  onMapTypeChange(mapType) {\n    GridReportActions.setMapType(mapType);\n    GridReportActions.resetAndLoadMap();\n  }\n\n  renderStandardHeader() {\n    const { visualization } = this.props;\n\n    const isLoading = visualization.get('isLoading')\n      || visualization.get('mapLoading')\n      || visualization.get('mapDataLoading');\n\n    const isError = visualization.get('isError');\n    const graphType = visualization.get('graphType');\n    const availableGraphTypes = visualization.get('availableGraphTypes');\n\n    const isMap = graphType === 'map';\n\n    const showLegend = visualization.get('showLegend');\n    const currentMapType = visualization.get('currentMapType');\n    const isTypeWithLegend = (isMap && currentMapType !== MapTypes.Heatmap.name)\n      && !(graphType === 'treemap' || graphType === 'horizontal_stacked' || graphType === 'pie');\n\n    const isHeatmap = currentMapType === MapTypes.Heatmap.name;\n    const isDensityMap = isHeatmap && visualization.get('heatmapType') === MapTypes.Heatmap.types.density;\n    const isAmountMap = isHeatmap && visualization.get('heatmapType') === MapTypes.Heatmap.types.amount;\n\n    const isTypeWithAmount = isMap && (\n      isAmountMap || currentMapType == MapTypes.Bubble.name\n    );\n\n    const mapAmountColumn = visualization.get('mapAmountColumn');\n    const mapAmountColumnOptions = visualization.get('mapAmountColumnOptions');\n    const shouldShowMapAmountMenu = isTypeWithAmount && mapAmountColumnOptions && mapAmountColumn;\n\n    const availableMapTypes = visualization.get('availableMapTypes');\n\n    return (\n      <header className=\"aggregate-viz__header ui-flex\">\n        {isMap &&\n          <MapTypeMenu\n            currentMapType={currentMapType}\n            mapTypes={availableMapTypes}\n            onSelect={this.onMapTypeChange} />\n        }\n        {isHeatmap &&\n          <div className=\"aggregate-viz__heatmap_picker ui-button-group\">\n            <a\n              className={className('ui-button small', { 'is-selected': isDensityMap })}\n              onClick={() => GridReportActions.setHeatmapType(MapTypes.Heatmap.types.density)}>\n              Density\n            </a>\n            <a\n              className={className('ui-button small', { 'is-selected': isAmountMap })}\n              onClick={() => GridReportActions.setHeatmapType(MapTypes.Heatmap.types.amount)}>\n              Amount\n            </a>\n          </div>\n        }\n        {shouldShowMapAmountMenu &&\n          <MapAmountMenu\n            amountChoices={mapAmountColumnOptions}\n            currentAmount={mapAmountColumn}\n            onSelect={GridReportActions.setMapAmountColumn} />\n        }\n        <div className=\"ui-flex-1 ui-flex ui-justify-content-end\">\n          <MiniLoader isError={isError} isLoading={isLoading} />\n          {/*Might want to move this to the store instead in the future*/}\n          { isTypeWithLegend && (\n            <button className=\"ui-button ghost aggregate-viz__legend-toggle\" onClick={GridReportActions.toggleLegend}>\n              <span className=\"icon-view-list-1\" /> {showLegend ? 'Hide Legend' : 'Show Legend'}\n            </button>\n          )}\n\n          <span className=\"aggregate-viz__graphtype\">\n            <GraphType\n              graphTypes={availableGraphTypes.toJS()}\n              graphType={graphType}\n              isMapEnabled={this.props.isMapEnabled}/>\n          </span>\n        </div>\n      </header>\n    );\n  }\n\n  render() {\n    const { visualization, savedStateId, schema, filter } = this.props;\n\n    const graphType = visualization.get('graphType');\n    const showLegend = visualization.get('showLegend');\n    const currentBreakdown = visualization.get('breakdown');\n\n    const editingTooltip = visualization.getIn(['mapTooltip', 'editing']);\n    const availableGraphTypes = visualization.get('availableGraphTypes').toJS();\n    if (_.indexOf(availableGraphTypes, graphType) === -1) {\n      return null;\n    }\n\n    return (\n      <section className=\"aggregate-viz\">\n        {graphType === 'map' && editingTooltip ? this.renderTooltipEditStatus() : this.renderStandardHeader()}\n\n        {graphType === 'map' ?\n          this.renderMap(currentBreakdown, showLegend, filter, visualization)\n        : <AggregateVisualizationCharts\n          visualization={visualization}\n          savedStateId={savedStateId}\n          aggregateVizHeight={aggregateVizHeight}\n          schema={schema}\n          bannerHeight={0} />}\n\n      </section>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/aggregate_visualization.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Highcharts from 'highcharts-og';\n\nimport Immutable from 'immutable';\nimport _ from 'lodash';\n\nimport $ from 'jquery';\n\nimport SummaryTooltip from '../summary_tooltip';\nimport ogColors from '../og_colors';\nimport GridReportActions from '../actions/grid_report_actions';\nimport strings from '../strings';\nimport SummaryPieSlider from '../summary_pie_slider';\nimport { isTargetGraph, isBetweenTarget, isTargetValid } from '../utils/target_utils';\nimport { getAmountColumn } from '../utils/transactions_utils';\nimport Legend from './grid_legend';\nimport { isEmbed } from '../utils/embed_utils';\n\nimport {\n  REGULAR_OPACITY,\n  HIGHLIGHT_OPACITY,\n  setColorOpacityForDataSetType,\n  brightenSeries,\n  filterSelectedSeries,\n  sortLegendData\n} from '../utils/chart_utils';\n\nimport { convertToCumulativeAmounts, AmountsTypes, formatUnits } from '../utils/transactions_utils';\n\nlet firstPass = 0;\nlet type = '';\nlet prevType = '';\nlet previousLength = 0;\nconst noSeriesName = '- Blank -';\n\nexport default class AggregateVisualizationCharts extends React.PureComponent<any, any> {\n\n  legendLines: any;\n  y: any;\n  chart: any;\n  colorIndex: number;\n  colorCache: any;\n  clearTooltips: any;\n  sortedSeries: any;\n\n  static propTypes = {\n    visualization: PropTypes.object.isRequired,\n    savedStateId: PropTypes.string,\n    schema: PropTypes.object.isRequired,\n    aggregateVizHeight: PropTypes.number.isRequired,\n    bannerHeight: PropTypes.number.isRequired\n  };\n\n  render() {\n    const visualization = this.props.visualization;\n    const graphType = visualization.get('graphType');\n    const tooltip = visualization.get('tooltip');\n    const legendSortBy = visualization.get('legendSortBy');\n    const embedStyle = isEmbed() ? { width: '100%' } : {};\n    let graphWrapperClass = graphType == 'bar' || graphType == 'line' ? 'report__graph-wrapper' : '';\n\n    return (\n      <div style={embedStyle}>\n        <div className={graphWrapperClass}>\n          <div ref=\"highcharts\" key=\"highcharts\" className=\"aggregate-viz__graph\">\n            {tooltip.get('isVisible') ?\n              <SummaryTooltip left={tooltip.get('left')} top={tooltip.get('top')} color={'ffffff'} key={1}>\n                <div className=\"graph-tooltip__name\">\n                  <strong>{tooltip.get('name')}</strong>\n                </div>\n                <div>{tooltip.get('value')}</div>\n                <div>{`(${tooltip.get('percentage')}%)`}</div>\n              </SummaryTooltip>\n            : null}\n          </div>\n          {graphType !== 'bar' && graphType !== 'line' ? //try mounting the component then hide, rather than mount later????\n            <SummaryPieSlider\n              ref=\"slider\"\n              items={\n                visualization.get('xAxis').map((axis) => {\n                  return {key:axis.index && axis.index.toString(), value: axis && axis.value};\n                }).toArray()\n              }\n              initialSelection={visualization.get('index') && visualization.get('index').toString()}\n              graphType={graphType}\n              //When this is created...the onChange is called....on the componentDidMount\n              onChange={GridReportActions.setVisualizationYear} />\n          : null }\n\n          {graphType == 'bar' || graphType == 'line' ?\n            <Legend\n              lines={this.legendLines}\n              legendSortBy={legendSortBy}\n              onSortChange={this.handleLegendSortChange} />\n          : null }\n        </div>\n      </div>\n    );\n  }\n\n  //check to see if the text will fit on the graph, is there a way to grab item rect dimensions? or is generate after dataLabels are defined\n  willFit(graphType, highchartsThis) {\n    const that = highchartsThis;\n    const styleBold = (text) => `<span class=\"pie-data-labels-name\">${text}</span><br/>`;\n    const style = (text) => `<span style=\"font-size:15px\">${text}</span>`;\n    const w = ($('.highcharts-background')[0].attributes as any).width.value;\n    const name = strings.truncateLabel(that.point.name);\n    var percentage = that.percentage;\n    const percentageStr = percentage ? `${percentage.toFixed(2)}%` : '';\n    const value = that.point.isNeg && (graphType === 'treemap' || graphType === 'pie') ? -that.y : that.y;\n    const amountColumn = getAmountColumn(this.props.visualization, this.props.schema);\n    const valueStr = formatUnits(this.props.schema, amountColumn, value);\n    const defaultStyle = styleBold(name) + '<span class=\"pie-data-labels-amount\">' + valueStr + '<span class=\"pie-data-labels-percent\">' + percentageStr + '</span>';\n    var str = '';\n    var fullText = false; //all info is on dataLabel\n\n    switch (graphType) {\n    case 'treemap':\n      if (percentageStr.length < percentage * w / 100) {\n        str = defaultStyle;\n        fullText = true;\n      } else if (valueStr.length < percentage * w / 140) {\n        str = `<br/>${style(valueStr)}`;\n      }\n      break;\n    case 'pie':\n      str = defaultStyle;\n      fullText = false;\n      break;\n    case 'horizontal_stacked':\n      percentage = this.calculatePercentage(that.y, that.point.yearTotal);\n      if (percentage / 100 * w / 10 > name.length * 1.1 && percentage / 100 * w / 10 > valueStr.length * 0.8) {\n        str = defaultStyle;\n        fullText = true;\n      } else if (percentage / 100 * w / 10 > valueStr.length * 1.2) {\n        str = styleBold('_') + style(valueStr);\n      }\n    case 'bar':\n      const columnTotal = _.reduce(that.series.data, (sum, item: { value }) => {\n        return sum + Math.abs(item.value);\n      }, 0);\n      percentage = this.calculatePercentage(this.y, columnTotal);\n      break;\n    }\n    fullText = name === that.point.name ? fullText : false; //Checking to see if label has been truncated by strings.truncateLabel\n    return {str, fullText};\n  }\n\n  componentDidUpdate(prevProps) {\n    const { visualization: previousVisualization } = prevProps;\n    const { visualization } = this.props;\n\n    const didAmountsTypeChange = previousVisualization.get('amountsType') !== visualization.get('amountsType');\n    const didLegendSortByChange = previousVisualization.get('legendSortBy') !== visualization.get('legendSortBy');\n    const didTargetChange = !Immutable.is(previousVisualization.get('target'), visualization.get('target'));\n\n    if (!Immutable.is(previousVisualization.get('aggregates'), visualization.get('aggregates'))\n      || didAmountsTypeChange\n      || didTargetChange\n      || didLegendSortByChange) {\n      while (this.chart.series.length) {\n        firstPass = 0;\n        this.chart.series[0].remove(false);\n      }\n    }\n\n    if (previousVisualization.get('showLegend') !== visualization.get('showLegend')\n      || previousVisualization.get('graphType') !== visualization.get('graphType')\n      || didLegendSortByChange) {\n      firstPass = 0;\n      this.initializeChart();\n    }\n\n    if (previousVisualization.get('showLegend') !== visualization.get('showLegend')\n      || previousVisualization.get('graphType') !== visualization.get('graphType')\n      // indeces are only meaningful for non-bar charts,\n      // so make sure we don't have a bar chart before checking if the indeces were different\n      || previousVisualization.get('graphType') !== 'bar' && (previousVisualization.get('index') !== visualization.get('index'))\n      || !Immutable.is(previousVisualization.get('aggregates'), visualization.get('aggregates'))\n      || didAmountsTypeChange\n      || didTargetChange\n      || didLegendSortByChange) {\n\n      this.updateChartSeries();\n    }\n\n    if (prevProps.bannerHeight !== this.props.bannerHeight && typeof this.props.bannerHeight === 'number') {\n      this.chart.setSize(null, this.props.this.props.aggregateVizHeight - this.props.bannerHeight);\n    }\n  }\n\n  componentDidMount() {\n    //why does this get called on the back button? Going back is changing state, rather than just updating...\n    //Gets called whenever moving from table to chart, as component is mounting\n    this.colorIndex = 0;\n    this.colorCache = {};\n    this.legendLines = [];\n\n    this.initializeChart();\n    this.updateChartSeries();\n  }\n\n  componentWillUnmount() {\n    this.chart.destroy();\n  }\n\n  initializeChart() {\n    Highcharts.setOptions({\n      lang: {\n        numericSymbols: ['k', 'M', 'B', 'T']\n      }\n    });\n\n    prevType = type;\n    let height = this.props.aggregateVizHeight;\n    let legendReversed = true;\n    const tooltipEnabled = true;\n    let showLegend = this.props.visualization.get('showLegend');\n    const graphType = this.props.visualization.get('graphType');\n    let labelsEnabled = true;\n    let lineColor = '#909090';\n    let lineWidth = 0;\n    switch (graphType) {\n    case 'treemap':\n      type = 'treemap';\n      showLegend = false;\n      break;\n    case 'pie':\n      type = 'pie';\n      legendReversed = false;\n      showLegend = false;\n      height = 370; // need to increase pie chart size to display all labels when loading\n      break;\n    case 'horizontal_stacked':\n      type = 'bar';\n      labelsEnabled = false;\n      lineColor = '#f7f7f7';\n      lineWidth = 10; //to hide\n      showLegend = false;\n      break;\n    case 'bar':\n      type = 'column'; //if change to bar, then will be sideways orientated\n      legendReversed = false;\n      showLegend = false;\n      break;\n    case 'line':\n      type = 'line';\n      legendReversed = false;\n      showLegend = false;\n      break;\n    default:\n      break;\n    }\n\n    //for dynamic re-scaling\n    if (prevType !== type) {\n      firstPass = 0;\n    }\n\n    const self = this;\n\n    this.chart = new Highcharts.Chart({\n      chart: {\n        type,\n        height,\n        marginRight: 60,\n        backgroundColor: '#ffffff',\n        spacingLeft: 0,\n        borderRadius: 0,\n        renderTo: this.refs.highcharts as HTMLDivElement,\n        animation: {\n          duration: 750 //animation duration\n        },\n        events: {\n          redraw: () => {\n            const xAxis = this.chart.xAxis[0];\n            _.each(xAxis.ticks, _.bind((tick) => {\n              if (tick.label) {\n                const $element = jQuery(tick.label.element);\n                $element.unbind('click');\n\n                $element.click(() => {\n                  GridReportActions.filterByFiscalYear(tick.pos);\n                });\n              }\n            }, this));\n          }\n        }\n      },\n      tooltip: {\n        enabled: tooltipEnabled,\n        useHTML: true,\n        formatter() {\n          // The types for point don't include plotX, ployY, and tooltipPos so casting as any\n          const point = this.point as any;\n          let x = point.plotX;\n          let y = point.plotY;\n          const name = this.key;\n          let value = this.y;\n          value = point.negative === true ? -value : value;\n          const amountColumn = getAmountColumn(self.props.visualization, self.props.schema);\n          value = formatUnits(self.props.schema, amountColumn, value);\n          let percentage = this.percentage;\n          let showToolTip = !self.willFit(graphType, this).fullText; //note this is dependent on whether there is a datalabel or not\n\n          switch (type) {\n          case 'treemap':\n            x = point.plotX;\n            y = point.plotY;\n            showToolTip = true;\n            break;\n          case 'column':\n            x = point.plotX + this.series.chart.plotLeft;\n            y = point.plotY + 2 * this.series.chart.plotTop;\n            percentage = self.calculatePercentage(this.y, point.yearTotal);\n            break;\n          case 'pie':\n            x = point.tooltipPos[0];\n            y = point.tooltipPos[1] + 2 * this.series.chart.plotTop;\n            break;\n          case 'bar':\n            x = point.tooltipPos[0] + this.series.chart.plotLeft; //how to get this centered???\n            y = point.tooltipPos[1];\n            percentage = self.calculatePercentage(this.y, point.yearTotal);\n            break;\n          case 'line':\n            x = point.plotX + this.series.chart.plotLeft;\n            y = point.plotY + this.series.chart.plotTop;\n            percentage = self.calculatePercentage(this.y, point.yearTotal);\n            break;\n          }\n\n          if (self.clearTooltips) {\n            clearTimeout(self.clearTooltips);\n          }\n\n          if (showToolTip) {\n            GridReportActions.showVisualizationTooltip(x, y, name, value, percentage.toFixed(2));\n          }\n          if (!showToolTip) {\n            GridReportActions.hideVisualizationTooltip();\n          }\n          self.clearTooltips = null; //Note self refers to something else here than below....\n          return false;//by returning null drilldown is broken...\n        }\n      },\n      legend: {\n        reversed: legendReversed,\n        useHTML: true,\n        enabled: showLegend,\n        layout: 'vertical',\n        align: 'right',\n        verticalAlign: 'top',\n        itemMarginBottom: 5,\n        itemStyle: {\n          fontWeight: 'normal',\n          fontFamily: 'Benton Sans'\n        }\n      },\n      xAxis: { //how to toggle this off for Treemap?\n        showEmpty: false,\n        tickColor: 'transparent',\n        lineWidth,\n        minorGridLineWidth: 0,\n        lineColor,\n        labels: {\n          enabled: labelsEnabled,\n          useHTML: true,\n          style: {\n            color: '#737373',\n            fontWeight: 'bold',\n            fontFamily: 'Benton Sans',\n            cursor: 'pointer'\n          }\n        },\n        minorTickLength: 0,\n        tickLength: 0\n      },\n      yAxis: {\n        lineWidth: 0,\n        showEmpty: false,\n        lineColor: 'transparent',\n        title: {\n          text: null,\n          useHTML: true,\n        },\n        labels: {\n          enabled: labelsEnabled,\n          useHTML: true,\n          style: {\n            color: '#909090',\n            fontFamily: 'Benton Sans'\n          }\n        },\n        plotLines: [{\n          value: 0,\n          width: 2,\n          color: ogColors.axisHtmlColor,\n          id: 'zero-plot-line'\n        }],\n        plotBands: [],\n        gridLineWidth: 0\n      },\n      plotOptions: {\n        series: {\n          marker: {\n            symbol: 'circle'\n          },\n          states: {\n            hover: {\n              // NOTE: we removed halo effect because the highchart's native halo was overlapping\n              // with our patterns.\n              enabled: false\n            },\n            inactive: {\n              opacity: 1\n            }\n          },\n          point: {\n            events: {\n              mouseOver() {\n                if (self.clearTooltips) {\n                  clearTimeout(self.clearTooltips);\n                }\n                self.clearTooltips = null;\n\n                // Highcharts.PointOptionsObject does not include series_id for some reason\n                const { series_id } = this.options as any;\n\n                if (graphType !== 'bar') {\n                  brightenSeries(self.chart.series, HIGHLIGHT_OPACITY, 'hover', series_id);\n                } else {\n                  const selectedSeries = filterSelectedSeries(self.chart.series, series_id);\n                  brightenSeries(selectedSeries, HIGHLIGHT_OPACITY, 'hover');\n                }\n              },\n\n              mouseOut() {\n                // Clear tooltip hackery is to allow this function to be\n                // invoked synchronously by highcarts in the middle of a\n                // dispatch\n                self.clearTooltips = setTimeout(function() {\n                  GridReportActions.hideVisualizationTooltip();\n                  self.clearTooltips = null;\n                });\n\n                // Highcharts.PointOptionsObject does not include series_id for some reason\n                const { series_id } = this.options as any;\n\n                if (graphType !== 'bar') {\n                  brightenSeries(self.chart.series, -HIGHLIGHT_OPACITY, 'hover', series_id);\n                } else {\n                  const selectedSeries = filterSelectedSeries(self.chart.series, series_id);\n                  brightenSeries(selectedSeries, -HIGHLIGHT_OPACITY, 'hover');\n                }\n              }\n            }\n          }\n        },\n        column: {\n          stacking: 'normal',\n          borderWidth: 0\n        },\n        pie: {\n          borderWidth: 0,\n          dataLabels:{\n            //how to center align??\n            formatter() {\n              return self.willFit(graphType, this).str;\n            },\n            useHTML: true,\n            softConnector: false,\n            distance: 35, // labels are outside the pie\n            padding: 1,\n            y: -15,\n            style: {//styling of the dataLabels\n              color: 'rgba(0, 0, 0, 0.6)',\n              fontFamily: 'Benton Sans',\n              textAlign: 'center'\n            }\n          },\n          showInLegend: true,\n        },\n        bar: {\n          borderWidth: 0,\n          pointWidth: 150,\n          dataLabels:{\n            formatter() {\n              return self.willFit(graphType, this).str;\n            },\n            //rotation: -30, //this breaks other styling\n            align: 'left',\n            padding: 0,\n            enabled: true,\n            useHTML: true,\n            inside: true,\n            y: -150 / 2 - 25,\n\n            style: {//styling of the dataLabels\n              color: '#444444', //'#737373',\n              fontWeight: '',\n              fontFamily: 'Benton Sans'\n            }\n          },\n        },\n        treemap:{\n          dataLabels:{ //auto truncate the labels so that they are contained within the boxes????\n            formatter() {\n              return self.willFit(graphType, this).str;\n            },\n            align: 'left',\n            verticalAlign: 'top',\n            crop: false,\n            useHTML: true,\n            style: { //styling of the dataLabels\n              color: 'rgba(0, 0, 0, 0.6)',\n              fontWeight: '',\n              fontFamily: 'Benton Sans'\n            },\n            padding: 7\n          },\n          showInLegend: true\n        }\n      },\n      title: {\n        text: '',\n        useHTML: true,\n      },\n      credits: {\n        enabled: false\n      },\n      exporting: {\n        buttons: {\n          contextButton: {\n            enabled: false\n          }\n        },\n      }\n    });\n  }\n\n  updateChartSeries() { //populates chart with data\n    const visualization = this.props.visualization;\n    const target_index = parseInt(visualization.get('index'));\n    const chart = this.chart;\n    const breakdown = visualization.get('breakdown');\n    const seriesMap = {};\n    const self = this;\n\n    const amountColumn = getAmountColumn(visualization, this.props.schema);\n    const sumField = `${amountColumn}_sum`;\n    const categories = visualization.get('xAxis').map((d) => d.value).toJS();\n\n    const isCumulative = visualization.get('amountsType') === AmountsTypes.Cumulative;\n    const rawAggregates = visualization.get('aggregates');\n    const renderedAggregates = isCumulative ?\n      convertToCumulativeAmounts(rawAggregates, breakdown, sumField) : rawAggregates;\n\n    let series;\n    const toVisualize = [];\n    let type;\n    let scopingToYear = true;\n    const graphType = visualization.get('graphType');\n    const target = visualization.get('target');\n    switch (graphType) {\n    case 'treemap':\n      type = 'treemap';\n      break;\n    case 'pie':\n      type = 'pie';\n      break;\n    case 'horizontal_stacked':\n      type = 'bar';\n      break;\n    case 'bar':\n      type = 'column';\n      scopingToYear = false;\n      break;\n    case 'line':\n      type = 'line';\n      scopingToYear = false;\n      break;\n    default: //is this necessary?\n      break;\n    }\n\n    //because redrawing bar/horizontal-stacked -> setData issues\n    if (type === 'bar') {\n      while (chart.series.length) {\n        chart.series[0].remove(false);\n      }\n    }\n\n    // remove any plotlines that may be present from the line graph\n    let yAxis: any = _.head(chart.yAxis);\n    _.each(chart.plotLines, function(line) {\n      yAxis.removePlotLine(line);\n    });\n    chart.plotLines = [];\n\n    // remove any plotbands that may be present\n    _.each(chart.plotBands, function(band) {\n      yAxis.removePlotBand(band);\n    });\n    chart.plotBands = [];\n    // Clear previous extremes set by targets\n    yAxis.setExtremes(null, null);\n\n    let index = 0;\n\n    renderedAggregates.forEach((yearData, i) => {\n      if (!scopingToYear || i === target_index) {\n        yearData.get('transactions').forEach((v) => {\n          let seriesName = v.get(breakdown);\n          const sum = v.get(sumField);\n          let isRemaining = v.get('isRemaining');\n          let color;\n\n          if (isRemaining) {\n            color = ogColors.moreHtmlColor;\n          } else {\n            color = this.colorCache[seriesName] || ogColors.getHtmlColor(this.colorIndex++);\n          }\n\n          this.colorCache[seriesName] = color;\n          const fillColor = setColorOpacityForDataSetType(color, REGULAR_OPACITY);\n\n          seriesName = seriesName || noSeriesName;\n          series = seriesMap[seriesName] = seriesMap[seriesName] || {\n            cursor: 'pointer',\n            id: seriesName,\n            total: 0,\n            //applies for treemap only\n            layoutAlgorithm: 'squarified', // squarified, sliceAndDice, stripes, strip // in order of best looking\n            name: seriesName,\n            // we want the y-axis to be individual points not sums for a line chart\n            stacking: type !== 'line',\n            type,\n            data: [],\n            color: fillColor,\n            events: {\n              legendItemClick: onSeriesClick,\n            },\n            isRemaining,\n            point: {\n              events: {\n                click: onSeriesClick\n              }\n            },\n          };\n\n          function onSeriesClick(clickedSeriesName) {\n            GridReportActions.hideVisualizationTooltip();\n            self.clearTooltips = null;\n\n            seriesName = this.name || clickedSeriesName;\n\n            if (type === 'pie' || type === 'treemap') {\n              isRemaining = seriesName === 'Show More' ? true : false;\n            }\n\n            if (isRemaining) {\n              GridReportActions.filterRemainingAggregates();\n            } else if (seriesName === noSeriesName) {\n              GridReportActions.filterColumn(breakdown, null, true);\n            } else {\n              GridReportActions.filterColumn(breakdown, 'eq', seriesName);\n            }\n            return false;\n          }\n\n          series.total += Math.abs(sum);\n\n          if (type === 'pie' || type === 'treemap') {\n            toVisualize.push({\n              x: i,\n              index,\n              series_id: seriesName,\n              isRemaining,\n              name: seriesName,\n              color: fillColor,\n              value: Math.abs(sum),\n              y: Math.abs(sum),\n              isNeg: sum < 0 ? true : false\n            });\n            series.data = toVisualize;\n          }\n          if (type === 'bar' || type === 'column' || type === 'line') {\n            series.data.push({\n              x: i,\n              index,\n              series_id: seriesName,\n              isRemaining,\n              name: seriesName,\n              color: fillColor,\n              value: sum,\n              y: sum\n            });\n\n\n          }\n        });\n        if (yearData.count()) {\n          ++index;\n        }\n      }\n    });\n\n    if (type === 'bar' || type === 'column' || type === 'line') {\n      //To calculate the yearly totals\n      const years = [];\n      _.each(seriesMap, (seriesData: any) => {\n        _.each(seriesData.data, (item) => {\n          years.push({\n            year: item.x,\n            value: item.value\n          });\n        });\n      });\n      const yearTotal = {}; //organizing + adding by year\n      _.each(years, _.bind((item) => {\n        if (item.year in yearTotal) {\n          yearTotal[item.year] += Math.abs(item.value);\n        } else {\n          yearTotal[item.year] = Math.abs(item.value);\n        }\n      }, this));\n      //Done calucating totals for each year\n\n      let sortedSeries = _.sortBy(seriesMap, _.bind((series: any) => {\n        _.each(series.data, (item) => {\n          const year = item.x;\n          item.yearTotal = yearTotal[year];\n        });\n        if (series.isRemaining) {\n          return Infinity;\n        }\n        return series.total;\n      }, this));\n\n      this.sortedSeries = sortedSeries = sortLegendData(sortedSeries, visualization.get('legendSortBy'));\n\n      if (type === 'column' || type === 'line' || firstPass < 1) {\n        _.each(sortedSeries, (seriesData) => {\n          chart.addSeries(seriesData, false);\n        });\n      }\n\n      if (chart.xAxis && chart.xAxis[0]) {\n        chart.xAxis[0].setCategories(categories, true);\n        chart.redraw();\n      }\n\n      // Add plotlines if there is only one label in x-axis\n      if (type == 'line' && categories.length == 1) {\n        let self = this;\n        let yAxis: any = _.head(chart.yAxis);\n        let series = Array.from(sortedSeries).reverse();\n        let point;\n        let id;\n        let events;\n        let sum = 0;\n\n        _.each(series, function(s) {\n          id = s.id;\n          point = _.head(s.data);\n          events = s.point.events;\n          sum = sum + point.y;\n          yAxis.addPlotLine({\n            value: sum,\n            color: setColorOpacityForDataSetType(self.colorCache[s.name], REGULAR_OPACITY),\n            width: 2,\n            id,\n            events: {\n              click: function(e) {\n                events.click(e, s.name);\n              }\n            }\n          });\n          chart.plotLines.push(id);\n        });\n      }\n\n      // Target Line/Band\n      if (isTargetGraph(graphType) && isTargetValid(target)) {\n        let yAxis: any = _.head(chart.yAxis);\n        let targetType = target.get('type');\n        let targetValue = target.get('value');\n\n        // Scale graph to ensure target lines will fit in.\n        let extremes = yAxis.getExtremes();\n        let chartMax;\n\n        if (extremes.dataMax) {\n          chartMax = Math.max(extremes.dataMax, isBetweenTarget(targetType) ? targetValue.get('to') : targetValue);\n          yAxis.setExtremes(null, chartMax);\n        }\n\n        if (isBetweenTarget(targetType)) {\n          yAxis.addPlotBand({\n            from: targetValue.get('from'),\n            to: targetValue.get('to'),\n            color: 'rgba(204, 204, 204, .3)',\n            id: 'target',\n            label: {\n              style: {\n                fontFamily: 'Benton Sans',\n                color: '#ccc'\n              },\n              text: 'TARGET',\n              align: 'right',\n              x: 54,\n              y: 4\n            }\n          });\n          chart.plotBands.push('target');\n        } else {\n          // Add target line\n          yAxis.addPlotLine({\n            value: target.get('value'),\n            color: '#ccc',\n            width: 2,\n            id: 'target',\n            label: {\n              style: {\n                fontFamily: 'Benton Sans',\n                color: '#ccc'\n              },\n              text: 'TARGET',\n              align: 'right',\n              x: 54,\n              y: 4\n            }\n          });\n          chart.plotLines.push('target');\n        }\n      }\n    }\n\n    if (type === 'pie') {\n      //sorting by name so that when scrolling through years, item stay in same position\n      if (series && series.data) {\n        series.data = _.sortBy(series.data, (item: any) => {\n          if (item.isRemaining) {\n            return Infinity;\n          }\n          return item.name;\n        });\n        if (chart.series.length !== 0) {\n          //Conditionally trigger this....\n          if (series.data.length !== previousLength ) {\n            chart.series[0].remove(false);\n            chart.addSeries(series, false);\n            chart.redraw();\n            previousLength = series.data.length;\n          } else {\n            chart.series[0].setData(series.data);\n          }\n        // if we instantiate the chart and have series, add them\n        } else {\n          chart.addSeries(series, false);\n          chart.redraw();\n        }\n      }\n    }\n    if (type === 'treemap') {\n      while (chart.series.length > 0) {\n        chart.series[0].remove(false);\n      }\n      chart.addSeries(series, false);\n      chart.redraw();\n    }\n\n    this.updateVisualization(this.sortedSeries);\n  }\n\n  calculatePercentage(pointPlotY, pointYearTotal) {\n    return Math.abs(pointPlotY / pointYearTotal * 100);\n  }\n\n  handleLegendSortChange(sortId) {\n    GridReportActions.setLegendSortBy(sortId);\n  }\n\n  updateVisualization(newSeries) {\n    if (!_.isEqual(this.legendLines, newSeries)) {\n      this.legendLines = newSeries;\n      this.forceUpdate();\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/aggregate_visualization_charts.tsx","/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * (c) 2009-2018 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function (root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = root.document ?\n            factory(root) :\n            factory;\n    } else if (typeof define === 'function' && define.amd) {\n        define('highcharts/highcharts', function () {\n            return factory(root);\n        });\n    } else {\n        if (root.Highcharts) {\n            root.Highcharts.error(16, true);\n        }\n        root.Highcharts = factory(root);\n    }\n}(typeof window !== 'undefined' ? window : this, function (win) {\n    var _modules = {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'parts/Globals.js', [], function () {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /* globals Image, window */\n        /**\n         * Reference to the global SVGElement class as a workaround for a name conflict\n         * in the Highcharts namespace.\n         *\n         * @global\n         * @typedef {global.SVGElement} GlobalSVGElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n         */\n        // glob is a temporary fix to allow our es-modules to work.\n        var glob = ( // @todo UMD variable named `window`, and glob named `win`\n            typeof win !== 'undefined' ?\n                win :\n                typeof window !== 'undefined' ?\n                    window :\n                    {}), doc = glob.document, SVG_NS = 'http://www.w3.org/2000/svg', userAgent = (glob.navigator && glob.navigator.userAgent) || '', svg = (doc &&\n                doc.createElementNS &&\n                !!doc.createElementNS(SVG_NS, 'svg').createSVGRect), isMS = /(edge|msie|trident)/i.test(userAgent) && !glob.opera, isFirefox = userAgent.indexOf('Firefox') !== -1, isChrome = userAgent.indexOf('Chrome') !== -1, hasBidiBug = (isFirefox &&\n                parseInt(userAgent.split('Firefox/')[1], 10) < 4 // issue #38\n            );\n        var H = {\n                product: 'Highcharts',\n                version: '8.1.2',\n                deg2rad: Math.PI * 2 / 360,\n                doc: doc,\n                hasBidiBug: hasBidiBug,\n                hasTouch: !!glob.TouchEvent,\n                isMS: isMS,\n                isWebKit: userAgent.indexOf('AppleWebKit') !== -1,\n                isFirefox: isFirefox,\n                isChrome: isChrome,\n                isSafari: !isChrome && userAgent.indexOf('Safari') !== -1,\n                isTouchDevice: /(Mobile|Android|Windows Phone)/.test(userAgent),\n                SVG_NS: SVG_NS,\n                chartCount: 0,\n                seriesTypes: {},\n                symbolSizes: {},\n                svg: svg,\n                win: glob,\n                marginNames: ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n                noop: function () { },\n                /**\n                 * An array containing the current chart objects in the page. A chart's\n                 * position in the array is preserved throughout the page's lifetime. When\n                 * a chart is destroyed, the array item becomes `undefined`.\n                 *\n                 * @name Highcharts.charts\n                 * @type {Array<Highcharts.Chart|undefined>}\n                 */\n                charts: [],\n                /**\n                 * A hook for defining additional date format specifiers. New\n                 * specifiers are defined as key-value pairs by using the\n                 * specifier as key, and a function which takes the timestamp as\n                 * value. This function returns the formatted portion of the\n                 * date.\n                 *\n                 * @sample highcharts/global/dateformats/\n                 *         Adding support for week number\n                 *\n                 * @name Highcharts.dateFormats\n                 * @type {Highcharts.Dictionary<Highcharts.TimeFormatCallbackFunction>}\n                 */\n                dateFormats: {}\n            };\n\n        return H;\n    });\n    _registerModule(_modules, 'parts/Utilities.js', [_modules['parts/Globals.js']], function (H) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * An animation configuration. Animation configurations can also be defined as\n         * booleans, where `false` turns off animation and `true` defaults to a duration\n         * of 500ms.\n         *\n         * @interface Highcharts.AnimationOptionsObject\n         */ /**\n        * A callback function to exectute when the animation finishes.\n        * @name Highcharts.AnimationOptionsObject#complete\n        * @type {Function|undefined}\n        */ /**\n        * The animation duration in milliseconds.\n        * @name Highcharts.AnimationOptionsObject#duration\n        * @type {number|undefined}\n        */ /**\n        * The name of an easing function as defined on the `Math` object.\n        * @name Highcharts.AnimationOptionsObject#easing\n        * @type {string|Function|undefined}\n        */ /**\n        * A callback function to execute on each step of each attribute or CSS property\n        * that's being animated. The first argument contains information about the\n        * animation and progress.\n        * @name Highcharts.AnimationOptionsObject#step\n        * @type {Function|undefined}\n        */\n        /**\n         * Creates a frame for the animated SVG element.\n         *\n         * @callback Highcharts.AnimationStepCallbackFunction\n         *\n         * @param {Highcharts.SVGElement} this\n         *        The SVG element to animate.\n         *\n         * @return {void}\n         */\n        /**\n         * Interface description for a class.\n         *\n         * @interface Highcharts.Class<T>\n         * @extends Function\n         */ /**\n        * Class costructor.\n        * @function Highcharts.Class<T>#new\n        * @param {...Array<*>} args\n        *        Constructor arguments.\n        * @return {T}\n        *         Class instance.\n        */\n        /**\n         * A style object with camel case property names to define visual appearance of\n         * a SVG element or HTML element. The properties can be whatever styles are\n         * supported on the given SVG or HTML element.\n         *\n         * @example\n         * {\n         *    fontFamily: 'monospace',\n         *    fontSize: '1.2em'\n         * }\n         *\n         * @interface Highcharts.CSSObject\n         */ /**\n        * @name Highcharts.CSSObject#[key:string]\n        * @type {boolean|number|string|undefined}\n        */ /**\n        * Background style for the element.\n        * @name Highcharts.CSSObject#background\n        * @type {string|undefined}\n        */ /**\n        * Background color of the element.\n        * @name Highcharts.CSSObject#backgroundColor\n        * @type {Highcharts.ColorString|undefined}\n        */ /**\n        * Border style for the element.\n        * @name Highcharts.CSSObject#border\n        * @type {string|undefined}\n        */ /**\n        * Radius of the element border.\n        * @name Highcharts.CSSObject#borderRadius\n        * @type {number|undefined}\n        */ /**\n        * Color used in the element. The 'contrast' option is a Highcharts custom\n        * property that results in black or white, depending on the background of the\n        * element.\n        * @name Highcharts.CSSObject#color\n        * @type {'contrast'|Highcharts.ColorString|undefined}\n        */ /**\n        * Style of the mouse cursor when resting over the element.\n        * @name Highcharts.CSSObject#cursor\n        * @type {Highcharts.CursorValue|undefined}\n        */ /**\n        * Font family of the element text. Multiple values have to be in decreasing\n        * preference order and separated by comma.\n        * @name Highcharts.CSSObject#fontFamily\n        * @type {string|undefined}\n        */ /**\n        * Font size of the element text.\n        * @name Highcharts.CSSObject#fontSize\n        * @type {string|undefined}\n        */ /**\n        * Font weight of the element text.\n        * @name Highcharts.CSSObject#fontWeight\n        * @type {string|undefined}\n        */ /**\n        * Height of the element.\n        * @name Highcharts.CSSObject#height\n        * @type {number|undefined}\n        */ /**\n        * Width of the element border.\n        * @name Highcharts.CSSObject#lineWidth\n        * @type {number|undefined}\n        */ /**\n        * Opacity of the element.\n        * @name Highcharts.CSSObject#opacity\n        * @type {number|undefined}\n        */ /**\n        * Space around the element content.\n        * @name Highcharts.CSSObject#padding\n        * @type {string|undefined}\n        */ /**\n        * Behaviour of the element when the mouse cursor rests over it.\n        * @name Highcharts.CSSObject#pointerEvents\n        * @type {string|undefined}\n        */ /**\n        * Positioning of the element.\n        * @name Highcharts.CSSObject#position\n        * @type {string|undefined}\n        */ /**\n        * Alignment of the element text.\n        * @name Highcharts.CSSObject#textAlign\n        * @type {string|undefined}\n        */ /**\n        * Additional decoration of the element text.\n        * @name Highcharts.CSSObject#textDecoration\n        * @type {string|undefined}\n        */ /**\n        * Outline style of the element text.\n        * @name Highcharts.CSSObject#textOutline\n        * @type {string|undefined}\n        */ /**\n        * Line break style of the element text. Highcharts SVG elements support\n        * `ellipsis` when a `width` is set.\n        * @name Highcharts.CSSObject#textOverflow\n        * @type {string|undefined}\n        */ /**\n        * Top spacing of the element relative to the parent element.\n        * @name Highcharts.CSSObject#top\n        * @type {string|undefined}\n        */ /**\n        * Animated transition of selected element properties.\n        * @name Highcharts.CSSObject#transition\n        * @type {string|undefined}\n        */ /**\n        * Line break style of the element text.\n        * @name Highcharts.CSSObject#whiteSpace\n        * @type {string|undefined}\n        */ /**\n        * Width of the element.\n        * @name Highcharts.CSSObject#width\n        * @type {number|undefined}\n        */\n        /**\n         * All possible cursor styles.\n         *\n         * @typedef {'alias'|'all-scroll'|'auto'|'cell'|'col-resize'|'context-menu'|'copy'|'crosshair'|'default'|'e-resize'|'ew-resize'|'grab'|'grabbing'|'help'|'move'|'n-resize'|'ne-resize'|'nesw-resize'|'no-drop'|'none'|'not-allowed'|'ns-resize'|'nw-resize'|'nwse-resize'|'pointer'|'progress'|'row-resize'|'s-resize'|'se-resize'|'sw-resize'|'text'|'vertical-text'|'w-resize'|'wait'|'zoom-in'|'zoom-out'} Highcharts.CursorValue\n         */\n        /**\n         * All possible dash styles.\n         *\n         * @typedef {'Dash'|'DashDot'|'Dot'|'LongDash'|'LongDashDot'|'LongDashDotDot'|'ShortDash'|'ShortDashDot'|'ShortDashDotDot'|'ShortDot'|'Solid'} Highcharts.DashStyleValue\n         */\n        /**\n         * Generic dictionary in TypeScript notation.\n         * Use the native `Record<string, any>` instead.\n         *\n         * @deprecated\n         * @interface Highcharts.Dictionary<T>\n         */ /**\n        * @name Highcharts.Dictionary<T>#[key:string]\n        * @type {T}\n        */\n        /**\n         * The function callback to execute when the event is fired. The `this` context\n         * contains the instance, that fired the event.\n         *\n         * @callback Highcharts.EventCallbackFunction<T>\n         *\n         * @param {T} this\n         *\n         * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n         *        Event arguments.\n         *\n         * @return {boolean|void}\n         */\n        /**\n         * The event options for adding function callback.\n         *\n         * @interface Highcharts.EventOptionsObject\n         */ /**\n        * The order the event handler should be called. This opens for having one\n        * handler be called before another, independent of in which order they were\n        * added.\n        * @name Highcharts.EventOptionsObject#order\n        * @type {number}\n        */\n        /**\n         * Formats data as a string. Usually the data is accessible throught the `this`\n         * keyword.\n         *\n         * @callback Highcharts.FormatterCallbackFunction<T>\n         *\n         * @param {T} this\n         *        Context to format\n         *\n         * @return {string}\n         *         Formatted text\n         */\n        /**\n         * An object of key-value pairs for HTML attributes.\n         *\n         * @typedef {Highcharts.Dictionary<boolean|number|string|Function>} Highcharts.HTMLAttributes\n         */\n        /**\n         * An HTML DOM element. The type is a reference to the regular HTMLElement in\n         * the global scope.\n         *\n         * @typedef {global.HTMLElement} Highcharts.HTMLDOMElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement\n         */\n        /**\n         * The iterator callback.\n         *\n         * @callback Highcharts.ObjectEachCallbackFunction<T>\n         *\n         * @param {T} this\n         *        The context.\n         *\n         * @param {*} value\n         *        The property value.\n         *\n         * @param {string} key\n         *        The property key.\n         *\n         * @param {*} obj\n         *        The object that objectEach is being applied to.\n         */\n        /**\n         * An object containing `left` and `top` properties for the position in the\n         * page.\n         *\n         * @interface Highcharts.OffsetObject\n         */ /**\n        * Left distance to the page border.\n        * @name Highcharts.OffsetObject#left\n        * @type {number}\n        */ /**\n        * Top distance to the page border.\n        * @name Highcharts.OffsetObject#top\n        * @type {number}\n        */\n        /**\n         * Describes a range.\n         *\n         * @interface Highcharts.RangeObject\n         */ /**\n        * Maximum number of the range.\n        * @name Highcharts.RangeObject#max\n        * @type {number}\n        */ /**\n        * Minimum number of the range.\n        * @name Highcharts.RangeObject#min\n        * @type {number}\n        */\n        /**\n         * If a number is given, it defines the pixel length. If a percentage string is\n         * given, like for example `'50%'`, the setting defines a length relative to a\n         * base size, for example the size of a container.\n         *\n         * @typedef {number|string} Highcharts.RelativeSize\n         */\n        /**\n         * Proceed function to call original (wrapped) function.\n         *\n         * @callback Highcharts.WrapProceedFunction\n         *\n         * @param {*} [arg1]\n         *        Optional argument. Without any arguments defaults to first argument of\n         *        the wrapping function.\n         *\n         * @param {*} [arg2]\n         *        Optional argument. Without any arguments defaults to second argument\n         *        of the wrapping function.\n         *\n         * @param {*} [arg3]\n         *        Optional argument. Without any arguments defaults to third argument of\n         *        the wrapping function.\n         *\n         * @return {*}\n         *         Return value of the original function.\n         */\n        /**\n         * The Highcharts object is the placeholder for all other members, and various\n         * utility functions. The most important member of the namespace would be the\n         * chart constructor.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', { ... });\n         *\n         * @namespace Highcharts\n         */\n        H.timers = [];\n        var charts = H.charts,\n            doc = H.doc,\n            win = H.win;\n        /**\n         * Provide error messages for debugging, with links to online explanation. This\n         * function can be overridden to provide custom error handling.\n         *\n         * @sample highcharts/chart/highcharts-error/\n         *         Custom error handler\n         *\n         * @function Highcharts.error\n         *\n         * @param {number|string} code\n         *        The error code. See\n         *        [errors.xml](https://github.com/highcharts/highcharts/blob/master/errors/errors.xml)\n         *        for available codes. If it is a string, the error message is printed\n         *        directly in the console.\n         *\n         * @param {boolean} [stop=false]\n         *        Whether to throw an error or just log a warning in the console.\n         *\n         * @param {Highcharts.Chart} [chart]\n         *        Reference to the chart that causes the error. Used in 'debugger'\n         *        module to display errors directly on the chart.\n         *        Important note: This argument is undefined for errors that lack\n         *        access to the Chart instance.\n         *\n         * @param {Highcharts.Dictionary<string>} [params]\n         *        Additional parameters for the generated message.\n         *\n         * @return {void}\n         */\n        function error(code, stop, chart, params) {\n            var severity = stop ? 'Highcharts error' : 'Highcharts warning';\n            if (code === 32) {\n                code = severity + \": Deprecated member\";\n            }\n            var isCode = isNumber(code),\n                message = isCode ?\n                    severity + \" #\" + code + \": www.highcharts.com/errors/\" + code + \"/\" :\n                    code.toString(),\n                defaultHandler = function () {\n                    if (stop) {\n                        throw new Error(message);\n                }\n                // else ...\n                if (win.console &&\n                    error.messages.indexOf(message) === -1 // prevent console flooting\n                ) {\n                    console.log(message); // eslint-disable-line no-console\n                }\n            };\n            if (typeof params !== 'undefined') {\n                var additionalMessages_1 = '';\n                if (isCode) {\n                    message += '?';\n                }\n                objectEach(params, function (value, key) {\n                    additionalMessages_1 += \"\\n - \" + key + \": \" + value;\n                    if (isCode) {\n                        message += encodeURI(key) + '=' + encodeURI(value);\n                    }\n                });\n                message += additionalMessages_1;\n            }\n            if (chart) {\n                fireEvent(chart, 'displayError', { code: code, message: message, params: params }, defaultHandler);\n            }\n            else {\n                defaultHandler();\n            }\n            error.messages.push(message);\n        }\n        (function (error) {\n            error.messages = [];\n        })(error || (error = {}));\n        H.error = error;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * An animator object used internally. One instance applies to one property\n         * (attribute or style prop) on one element. Animation is always initiated\n         * through {@link SVGElement#animate}.\n         *\n         * @example\n         * var rect = renderer.rect(0, 0, 10, 10).add();\n         * rect.animate({ width: 100 });\n         *\n         * @private\n         * @class\n         * @name Highcharts.Fx\n         */\n        var Fx = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                /**\n                 *\n                 * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} elem\n                 *        The element to animate.\n                 *\n                 * @param {Highcharts.AnimationOptionsObject} options\n                 *        Animation options.\n                 *\n                 * @param {string} prop\n                 *        The single attribute or CSS property to animate.\n                 */\n                function Fx(elem, options, prop) {\n                    this.options = options;\n                this.elem = elem;\n                this.prop = prop;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set the current step of a path definition on SVGElement.\n             *\n             * @function Highcharts.Fx#dSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.dSetter = function () {\n                var paths = this.paths,\n                    start = paths && paths[0],\n                    end = paths && paths[1],\n                    path = [],\n                    now = this.now || 0;\n                // Land on the final path without adjustment points appended in the ends\n                if (now === 1 || !start || !end) {\n                    path = this.toD || [];\n                }\n                else if (start.length === end.length && now < 1) {\n                    for (var i = 0; i < end.length; i++) {\n                        // Tween between the start segment and the end segment. Start\n                        // with a copy of the end segment and tween the appropriate\n                        // numerics\n                        var startSeg = start[i];\n                        var endSeg = end[i];\n                        var tweenSeg = [];\n                        for (var j = 0; j < endSeg.length; j++) {\n                            var startItem = startSeg[j];\n                            var endItem = endSeg[j];\n                            // Tween numbers\n                            if (typeof startItem === 'number' &&\n                                typeof endItem === 'number' &&\n                                // Arc boolean flags\n                                !(endSeg[0] === 'A' && (j === 4 || j === 5))) {\n                                tweenSeg[j] = startItem + now * (endItem - startItem);\n                                // Strings, take directly from the end segment\n                            }\n                            else {\n                                tweenSeg[j] = endItem;\n                            }\n                        }\n                        path.push(tweenSeg);\n                    }\n                    // If animation is finished or length not matching, land on right value\n                }\n                else {\n                    path = end;\n                }\n                this.elem.attr('d', path, void 0, true);\n            };\n            /**\n             * Update the element with the current animation step.\n             *\n             * @function Highcharts.Fx#update\n             *\n             * @return {void}\n             */\n            Fx.prototype.update = function () {\n                var elem = this.elem,\n                    prop = this.prop, // if destroyed, it is null\n                    now = this.now,\n                    step = this.options.step;\n                // Animation setter defined from outside\n                if (this[prop + 'Setter']) {\n                    this[prop + 'Setter']();\n                    // Other animations on SVGElement\n                }\n                else if (elem.attr) {\n                    if (elem.element) {\n                        elem.attr(prop, now, null, true);\n                    }\n                    // HTML styles, raw HTML content like container size\n                }\n                else {\n                    elem.style[prop] = now + this.unit;\n                }\n                if (step) {\n                    step.call(elem, now, this);\n                }\n            };\n            /**\n             * Run an animation.\n             *\n             * @function Highcharts.Fx#run\n             *\n             * @param {number} from\n             *        The current value, value to start from.\n             *\n             * @param {number} to\n             *        The end value, value to land on.\n             *\n             * @param {string} unit\n             *        The property unit, for example `px`.\n             *\n             * @return {void}\n             */\n            Fx.prototype.run = function (from, to, unit) {\n                var self = this,\n                    options = self.options,\n                    timer = function (gotoEnd) {\n                        return timer.stopped ? false : self.step(gotoEnd);\n                }, requestAnimationFrame = win.requestAnimationFrame ||\n                    function (step) {\n                        setTimeout(step, 13);\n                    }, step = function () {\n                    for (var i = 0; i < H.timers.length; i++) {\n                        if (!H.timers[i]()) {\n                            H.timers.splice(i--, 1);\n                        }\n                    }\n                    if (H.timers.length) {\n                        requestAnimationFrame(step);\n                    }\n                };\n                if (from === to && !this.elem['forceAnimate:' + this.prop]) {\n                    delete options.curAnim[this.prop];\n                    if (options.complete && Object.keys(options.curAnim).length === 0) {\n                        options.complete.call(this.elem);\n                    }\n                }\n                else { // #7166\n                    this.startTime = +new Date();\n                    this.start = from;\n                    this.end = to;\n                    this.unit = unit;\n                    this.now = this.start;\n                    this.pos = 0;\n                    timer.elem = this.elem;\n                    timer.prop = this.prop;\n                    if (timer() && H.timers.push(timer) === 1) {\n                        requestAnimationFrame(step);\n                    }\n                }\n            };\n            /**\n             * Run a single step in the animation.\n             *\n             * @function Highcharts.Fx#step\n             *\n             * @param {boolean} [gotoEnd]\n             *        Whether to go to the endpoint of the animation after abort.\n             *\n             * @return {boolean}\n             *         Returns `true` if animation continues.\n             */\n            Fx.prototype.step = function (gotoEnd) {\n                var t = +new Date(),\n                    ret,\n                    done,\n                    options = this.options,\n                    elem = this.elem,\n                    complete = options.complete,\n                    duration = options.duration,\n                    curAnim = options.curAnim;\n                if (elem.attr && !elem.element) { // #2616, element is destroyed\n                    ret = false;\n                }\n                else if (gotoEnd || t >= duration + this.startTime) {\n                    this.now = this.end;\n                    this.pos = 1;\n                    this.update();\n                    curAnim[this.prop] = true;\n                    done = true;\n                    objectEach(curAnim, function (val) {\n                        if (val !== true) {\n                            done = false;\n                        }\n                    });\n                    if (done && complete) {\n                        complete.call(elem);\n                    }\n                    ret = false;\n                }\n                else {\n                    this.pos = options.easing((t - this.startTime) / duration);\n                    this.now = this.start + ((this.end - this.start) * this.pos);\n                    this.update();\n                    ret = true;\n                }\n                return ret;\n            };\n            /**\n             * Prepare start and end values so that the path can be animated one to one.\n             *\n             * @function Highcharts.Fx#initPath\n             *\n             * @param {Highcharts.SVGElement} elem\n             *        The SVGElement item.\n             *\n             * @param {Highcharts.SVGPathArray|undefined} fromD\n             *        Starting path definition.\n             *\n             * @param {Highcharts.SVGPathArray} toD\n             *        Ending path definition.\n             *\n             * @return {Array<Highcharts.SVGPathArray,Highcharts.SVGPathArray>}\n             *         An array containing start and end paths in array form so that\n             *         they can be animated in parallel.\n             */\n            Fx.prototype.initPath = function (elem, fromD, toD) {\n                var shift,\n                    startX = elem.startX,\n                    endX = elem.endX,\n                    fullLength,\n                    i,\n                    start = fromD && fromD.slice(), // copy\n                    end = toD.slice(), // copy\n                    isArea = elem.isArea,\n                    positionFactor = isArea ? 2 : 1,\n                    reverse;\n                if (!start) {\n                    return [end, end];\n                }\n                /**\n                 * If shifting points, prepend a dummy point to the end path.\n                 * @private\n                 * @param {Highcharts.SVGPathArray} arr - array\n                 * @param {Highcharts.SVGPathArray} other - array\n                 * @return {void}\n                 */\n                function prepend(arr, other) {\n                    while (arr.length < fullLength) {\n                        // Move to, line to or curve to?\n                        var moveSegment = arr[0],\n                            otherSegment = other[fullLength - arr.length];\n                        if (otherSegment && moveSegment[0] === 'M') {\n                            if (otherSegment[0] === 'C') {\n                                arr[0] = [\n                                    'C',\n                                    moveSegment[1],\n                                    moveSegment[2],\n                                    moveSegment[1],\n                                    moveSegment[2],\n                                    moveSegment[1],\n                                    moveSegment[2]\n                                ];\n                            }\n                            else {\n                                arr[0] = ['L', moveSegment[1], moveSegment[2]];\n                            }\n                        }\n                        // Prepend a copy of the first point\n                        arr.unshift(moveSegment);\n                        // For areas, the bottom path goes back again to the left, so we\n                        // need to append a copy of the last point.\n                        if (isArea) {\n                            arr.push(arr[arr.length - 1]);\n                        }\n                    }\n                }\n                /**\n                 * Copy and append last point until the length matches the end length.\n                 * @private\n                 * @param {Highcharts.SVGPathArray} arr - array\n                 * @param {Highcharts.SVGPathArray} other - array\n                 * @return {void}\n                 */\n                function append(arr, other) {\n                    while (arr.length < fullLength) {\n                        // Pull out the slice that is going to be appended or inserted.\n                        // In a line graph, the positionFactor is 1, and the last point\n                        // is sliced out. In an area graph, the positionFactor is 2,\n                        // causing the middle two points to be sliced out, since an area\n                        // path starts at left, follows the upper path then turns and\n                        // follows the bottom back.\n                        var segmentToAdd = arr[arr.length / positionFactor - 1].slice();\n                        // Disable the first control point of curve segments\n                        if (segmentToAdd[0] === 'C') {\n                            segmentToAdd[1] = segmentToAdd[5];\n                            segmentToAdd[2] = segmentToAdd[6];\n                        }\n                        if (!isArea) {\n                            arr.push(segmentToAdd);\n                        }\n                        else {\n                            var lowerSegmentToAdd = arr[arr.length / positionFactor].slice();\n                            arr.splice(arr.length / 2, 0, segmentToAdd, lowerSegmentToAdd);\n                        }\n                    }\n                }\n                // For sideways animation, find out how much we need to shift to get the\n                // start path Xs to match the end path Xs.\n                if (startX && endX) {\n                    for (i = 0; i < startX.length; i++) {\n                        // Moving left, new points coming in on right\n                        if (startX[i] === endX[0]) {\n                            shift = i;\n                            break;\n                            // Moving right\n                        }\n                        else if (startX[0] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = i;\n                            reverse = true;\n                            break;\n                            // Fixed from the right side, \"scaling\" left\n                        }\n                        else if (startX[startX.length - 1] ===\n                            endX[endX.length - startX.length + i]) {\n                            shift = startX.length - i;\n                            break;\n                        }\n                    }\n                    if (typeof shift === 'undefined') {\n                        start = [];\n                    }\n                }\n                if (start.length && isNumber(shift)) {\n                    // The common target length for the start and end array, where both\n                    // arrays are padded in opposite ends\n                    fullLength = end.length + shift * positionFactor;\n                    if (!reverse) {\n                        prepend(end, start);\n                        append(start, end);\n                    }\n                    else {\n                        prepend(start, end);\n                        append(end, start);\n                    }\n                }\n                return [start, end];\n            };\n            /**\n             * Handle animation of the color attributes directly.\n             *\n             * @function Highcharts.Fx#fillSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.fillSetter = function () {\n                Fx.prototype.strokeSetter.apply(this, arguments);\n            };\n            /**\n             * Handle animation of the color attributes directly.\n             *\n             * @function Highcharts.Fx#strokeSetter\n             *\n             * @return {void}\n             */\n            Fx.prototype.strokeSetter = function () {\n                this.elem.attr(this.prop, H.color(this.start).tweenTo(H.color(this.end), this.pos), null, true);\n            };\n            return Fx;\n        }());\n        H.Fx = Fx;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Utility function to deep merge two or more objects and return a third object.\n         * If the first argument is true, the contents of the second object is copied\n         * into the first object. The merge function can also be used with a single\n         * object argument to create a deep copy of an object.\n         *\n         * @function Highcharts.merge<T>\n         *\n         * @param {boolean} extend\n         *        Whether to extend the left-side object (a) or return a whole new\n         *        object.\n         *\n         * @param {T|undefined} a\n         *        The first object to extend. When only this is given, the function\n         *        returns a deep copy.\n         *\n         * @param {...Array<object|undefined>} [n]\n         *        An object to merge into the previous one.\n         *\n         * @return {T}\n         *         The merged object. If the first argument is true, the return is the\n         *         same as the second argument.\n         */ /**\n        * Utility function to deep merge two or more objects and return a third object.\n        * The merge function can also be used with a single object argument to create a\n        * deep copy of an object.\n        *\n        * @function Highcharts.merge<T>\n        *\n        * @param {T|undefined} a\n        *        The first object to extend. When only this is given, the function\n        *        returns a deep copy.\n        *\n        * @param {...Array<object|undefined>} [n]\n        *        An object to merge into the previous one.\n        *\n        * @return {T}\n        *         The merged object. If the first argument is true, the return is the\n        *         same as the second argument.\n        */\n        function merge() {\n            /* eslint-enable valid-jsdoc */\n            var i,\n                args = arguments,\n                len,\n                ret = {},\n                doCopy = function (copy,\n                original) {\n                    // An object is replacing a primitive\n                    if (typeof copy !== 'object') {\n                        copy = {};\n                }\n                objectEach(original, function (value, key) {\n                    // Copy the contents of objects, but not arrays or DOM nodes\n                    if (isObject(value, true) &&\n                        !isClass(value) &&\n                        !isDOMElement(value)) {\n                        copy[key] = doCopy(copy[key] || {}, value);\n                        // Primitives and arrays are copied over directly\n                    }\n                    else {\n                        copy[key] = original[key];\n                    }\n                });\n                return copy;\n            };\n            // If first argument is true, copy into the existing object. Used in\n            // setOptions.\n            if (args[0] === true) {\n                ret = args[1];\n                args = Array.prototype.slice.call(args, 2);\n            }\n            // For each argument, extend the return\n            len = args.length;\n            for (i = 0; i < len; i++) {\n                ret = doCopy(ret, args[i]);\n            }\n            return ret;\n        }\n        H.merge = merge;\n        /**\n         * Constrain a value to within a lower and upper threshold.\n         *\n         * @private\n         * @param {number} value The initial value\n         * @param {number} min The lower threshold\n         * @param {number} max The upper threshold\n         * @return {number} Returns a number value within min and max.\n         */\n        function clamp(value, min, max) {\n            return value > min ? value < max ? value : max : min;\n        }\n        /**\n         * Shortcut for parseInt\n         *\n         * @private\n         * @function Highcharts.pInt\n         *\n         * @param {*} s\n         *        any\n         *\n         * @param {number} [mag]\n         *        Magnitude\n         *\n         * @return {number}\n         *         number\n         */\n        var pInt = H.pInt = function pInt(s,\n            mag) {\n                return parseInt(s,\n            mag || 10);\n        };\n        /**\n         * Utility function to check for string type.\n         *\n         * @function Highcharts.isString\n         *\n         * @param {*} s\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a string.\n         */\n        var isString = H.isString = function isString(s) {\n                return typeof s === 'string';\n        };\n        /**\n         * Utility function to check if an item is an array.\n         *\n         * @function Highcharts.isArray\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is an array.\n         */\n        var isArray = H.isArray = function isArray(obj) {\n                var str = Object.prototype.toString.call(obj);\n            return str === '[object Array]' || str === '[object Array Iterator]';\n        };\n        /**\n         * Utility function to check if an item is of type object.\n         *\n         * @function Highcharts.isObject\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @param {boolean} [strict=false]\n         *        Also checks that the object is not an array.\n         *\n         * @return {boolean}\n         *         True if the argument is an object.\n         */\n        function isObject(obj, strict) {\n            return (!!obj &&\n                typeof obj === 'object' &&\n                (!strict || !isArray(obj))); // eslint-disable-line @typescript-eslint/no-explicit-any\n        }\n        H.isObject = isObject;\n        /**\n         * Utility function to check if an Object is a HTML Element.\n         *\n         * @function Highcharts.isDOMElement\n         *\n         * @param {*} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a HTML Element.\n         */\n        var isDOMElement = H.isDOMElement = function isDOMElement(obj) {\n                return isObject(obj) && typeof obj.nodeType === 'number';\n        };\n        /**\n         * Utility function to check if an Object is a class.\n         *\n         * @function Highcharts.isClass\n         *\n         * @param {object|undefined} obj\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the argument is a class.\n         */\n        var isClass = H.isClass = function isClass(obj) {\n                var c = obj && obj.constructor;\n            return !!(isObject(obj, true) &&\n                !isDOMElement(obj) &&\n                (c && c.name && c.name !== 'Object'));\n        };\n        /**\n         * Utility function to check if an item is a number and it is finite (not NaN,\n         * Infinity or -Infinity).\n         *\n         * @function Highcharts.isNumber\n         *\n         * @param {*} n\n         *        The item to check.\n         *\n         * @return {boolean}\n         *         True if the item is a finite number\n         */\n        var isNumber = H.isNumber = function isNumber(n) {\n                return typeof n === 'number' && !isNaN(n) && n < Infinity && n > -Infinity;\n        };\n        /**\n         * Remove the last occurence of an item from an array.\n         *\n         * @function Highcharts.erase\n         *\n         * @param {Array<*>} arr\n         *        The array.\n         *\n         * @param {*} item\n         *        The item to remove.\n         *\n         * @return {void}\n         */\n        var erase = H.erase = function erase(arr,\n            item) {\n                var i = arr.length;\n            while (i--) {\n                if (arr[i] === item) {\n                    arr.splice(i, 1);\n                    break;\n                }\n            }\n        };\n        /**\n         * Check if an object is null or undefined.\n         *\n         * @function Highcharts.defined\n         *\n         * @param {*} obj\n         *        The object to check.\n         *\n         * @return {boolean}\n         *         False if the object is null or undefined, otherwise true.\n         */\n        var defined = H.defined = function defined(obj) {\n                return typeof obj !== 'undefined' && obj !== null;\n        };\n        /**\n         * Set or get an attribute or an object of attributes. To use as a setter, pass\n         * a key and a value, or let the second argument be a collection of keys and\n         * values. To use as a getter, pass only a string as the second argument.\n         *\n         * @function Highcharts.attr\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} elem\n         *        The DOM element to receive the attribute(s).\n         *\n         * @param {string|Highcharts.HTMLAttributes|Highcharts.SVGAttributes} [prop]\n         *        The property or an object of key-value pairs.\n         *\n         * @param {number|string} [value]\n         *        The value if a single property is set.\n         *\n         * @return {string|null|undefined}\n         *         When used as a getter, return the value.\n         */\n        function attr(elem, prop, value) {\n            var ret;\n            // if the prop is a string\n            if (isString(prop)) {\n                // set the value\n                if (defined(value)) {\n                    elem.setAttribute(prop, value);\n                    // get the value\n                }\n                else if (elem && elem.getAttribute) {\n                    ret = elem.getAttribute(prop);\n                    // IE7 and below cannot get class through getAttribute (#7850)\n                    if (!ret && prop === 'class') {\n                        ret = elem.getAttribute(prop + 'Name');\n                    }\n                }\n                // else if prop is defined, it is a hash of key/value pairs\n            }\n            else {\n                objectEach(prop, function (val, key) {\n                    elem.setAttribute(key, val);\n                });\n            }\n            return ret;\n        }\n        H.attr = attr;\n        /**\n         * Check if an element is an array, and if not, make it into an array.\n         *\n         * @function Highcharts.splat\n         *\n         * @param {*} obj\n         *        The object to splat.\n         *\n         * @return {Array}\n         *         The produced or original array.\n         */\n        var splat = H.splat = function splat(obj) {\n                return isArray(obj) ? obj : [obj];\n        };\n        /**\n         * Set a timeout if the delay is given, otherwise perform the function\n         * synchronously.\n         *\n         * @function Highcharts.syncTimeout\n         *\n         * @param {Function} fn\n         *        The function callback.\n         *\n         * @param {number} delay\n         *        Delay in milliseconds.\n         *\n         * @param {*} [context]\n         *        An optional context to send to the function callback.\n         *\n         * @return {number}\n         *         An identifier for the timeout that can later be cleared with\n         *         Highcharts.clearTimeout. Returns -1 if there is no timeout.\n         */\n        var syncTimeout = H.syncTimeout = function syncTimeout(fn,\n            delay,\n            context) {\n                if (delay > 0) {\n                    return setTimeout(fn,\n            delay,\n            context);\n            }\n            fn.call(0, context);\n            return -1;\n        };\n        /**\n         * Internal clear timeout. The function checks that the `id` was not removed\n         * (e.g. by `chart.destroy()`). For the details see\n         * [issue #7901](https://github.com/highcharts/highcharts/issues/7901).\n         *\n         * @function Highcharts.clearTimeout\n         *\n         * @param {number} id\n         *        Id of a timeout.\n         *\n         * @return {void}\n         */\n        var internalClearTimeout = H.clearTimeout = function (id) {\n                if (defined(id)) {\n                    clearTimeout(id);\n            }\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Utility function to extend an object with the members of another.\n         *\n         * @function Highcharts.extend<T>\n         *\n         * @param {T|undefined} a\n         *        The object to be extended.\n         *\n         * @param {object} b\n         *        The object to add to the first one.\n         *\n         * @return {T}\n         *         Object a, the original object.\n         */\n        var extend = H.extend = function extend(a,\n            b) {\n                /* eslint-enable valid-jsdoc */\n                var n;\n            if (!a) {\n                a = {};\n            }\n            for (n in b) { // eslint-disable-line guard-for-in\n                a[n] = b[n];\n            }\n            return a;\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Return the first value that is not null or undefined.\n         *\n         * @function Highcharts.pick<T>\n         *\n         * @param {...Array<T|null|undefined>} items\n         *        Variable number of arguments to inspect.\n         *\n         * @return {T}\n         *         The value of the first argument that is not null or undefined.\n         */\n        function pick() {\n            var args = arguments;\n            var length = args.length;\n            for (var i = 0; i < length; i++) {\n                var arg = args[i];\n                if (typeof arg !== 'undefined' && arg !== null) {\n                    return arg;\n                }\n            }\n        }\n        H.pick = pick;\n        /**\n         * Set CSS on a given element.\n         *\n         * @function Highcharts.css\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} el\n         *        An HTML DOM element.\n         *\n         * @param {Highcharts.CSSObject} styles\n         *        Style object with camel case property names.\n         *\n         * @return {void}\n         */\n        var css = H.css = function css(el,\n            styles) {\n                if (H.isMS && !H.svg) { // #2686\n                    if (styles && typeof styles.opacity !== 'undefined') {\n                        styles.filter =\n                            'alpha(opacity=' + (styles.opacity * 100) + ')';\n                }\n            }\n            extend(el.style, styles);\n        };\n        /**\n         * Utility function to create an HTML element with attributes and styles.\n         *\n         * @function Highcharts.createElement\n         *\n         * @param {string} tag\n         *        The HTML tag.\n         *\n         * @param {Highcharts.HTMLAttributes} [attribs]\n         *        Attributes as an object of key-value pairs.\n         *\n         * @param {Highcharts.CSSObject} [styles]\n         *        Styles as an object of key-value pairs.\n         *\n         * @param {Highcharts.HTMLDOMElement} [parent]\n         *        The parent HTML object.\n         *\n         * @param {boolean} [nopad=false]\n         *        If true, remove all padding, border and margin.\n         *\n         * @return {Highcharts.HTMLDOMElement}\n         *         The created DOM element.\n         */\n        var createElement = H.createElement = function createElement(tag,\n            attribs,\n            styles,\n            parent,\n            nopad) {\n                var el = doc.createElement(tag);\n            if (attribs) {\n                extend(el, attribs);\n            }\n            if (nopad) {\n                css(el, { padding: '0', border: 'none', margin: '0' });\n            }\n            if (styles) {\n                css(el, styles);\n            }\n            if (parent) {\n                parent.appendChild(el);\n            }\n            return el;\n        };\n        // eslint-disable-next-line valid-jsdoc\n        /**\n         * Extend a prototyped class by new members.\n         *\n         * @function Highcharts.extendClass<T>\n         *\n         * @param {Highcharts.Class<T>} parent\n         *        The parent prototype to inherit.\n         *\n         * @param {Highcharts.Dictionary<*>} members\n         *        A collection of prototype members to add or override compared to the\n         *        parent prototype.\n         *\n         * @return {Highcharts.Class<T>}\n         *         A new prototype.\n         */\n        var extendClass = H.extendClass = function extendClass(parent,\n            members) {\n                var obj = (function () { });\n            obj.prototype = new parent(); // eslint-disable-line new-cap\n            extend(obj.prototype, members);\n            return obj;\n        };\n        /**\n         * Left-pad a string to a given length by adding a character repetetively.\n         *\n         * @function Highcharts.pad\n         *\n         * @param {number} number\n         *        The input string or number.\n         *\n         * @param {number} [length]\n         *        The desired string length.\n         *\n         * @param {string} [padder=0]\n         *        The character to pad with.\n         *\n         * @return {string}\n         *         The padded string.\n         */\n        var pad = H.pad = function pad(number, length, padder) {\n                return new Array((length || 2) +\n                    1 -\n                    String(number)\n                        .replace('-', '')\n                        .length).join(padder || '0') + number;\n        };\n        /**\n         * Return a length based on either the integer value, or a percentage of a base.\n         *\n         * @function Highcharts.relativeLength\n         *\n         * @param {Highcharts.RelativeSize} value\n         *        A percentage string or a number.\n         *\n         * @param {number} base\n         *        The full length that represents 100%.\n         *\n         * @param {number} [offset=0]\n         *        A pixel offset to apply for percentage values. Used internally in\n         *        axis positioning.\n         *\n         * @return {number}\n         *         The computed length.\n         */\n        var relativeLength = H.relativeLength = function relativeLength(value,\n            base,\n            offset) {\n                return (/%$/).test(value) ?\n                    (base * parseFloat(value) / 100) + (offset || 0) :\n                    parseFloat(value);\n        };\n        /**\n         * Wrap a method with extended functionality, preserving the original function.\n         *\n         * @function Highcharts.wrap\n         *\n         * @param {*} obj\n         *        The context object that the method belongs to. In real cases, this is\n         *        often a prototype.\n         *\n         * @param {string} method\n         *        The name of the method to extend.\n         *\n         * @param {Highcharts.WrapProceedFunction} func\n         *        A wrapper function callback. This function is called with the same\n         *        arguments as the original function, except that the original function\n         *        is unshifted and passed as the first argument.\n         */\n        var wrap = H.wrap = function wrap(obj,\n            method,\n            func) {\n                var proceed = obj[method];\n            obj[method] = function () {\n                var args = Array.prototype.slice.call(arguments),\n                    outerArgs = arguments,\n                    ctx = this,\n                    ret;\n                ctx.proceed = function () {\n                    proceed.apply(ctx, arguments.length ? arguments : outerArgs);\n                };\n                args.unshift(proceed);\n                ret = func.apply(this, args);\n                ctx.proceed = null;\n                return ret;\n            };\n        };\n        /**\n         * Format a string according to a subset of the rules of Python's String.format\n         * method.\n         *\n         * @example\n         * var s = Highcharts.format(\n         *     'The {color} fox was {len:.2f} feet long',\n         *     { color: 'red', len: Math.PI }\n         * );\n         * // => The red fox was 3.14 feet long\n         *\n         * @function Highcharts.format\n         *\n         * @param {string} str\n         *        The string to format.\n         *\n         * @param {Record<string, *>} ctx\n         *        The context, a collection of key-value pairs where each key is\n         *        replaced by its value.\n         *\n         * @param {Highcharts.Chart} [chart]\n         *        A `Chart` instance used to get numberFormatter and time.\n         *\n         * @return {string}\n         *         The formatted string.\n         */\n        var format = H.format = function (str,\n            ctx,\n            chart) {\n                var splitter = '{',\n            isInside = false,\n            segment,\n            valueAndFormat,\n            ret = [],\n            val,\n            index;\n            var floatRegex = /f$/;\n            var decRegex = /\\.([0-9])/;\n            var lang = H.defaultOptions.lang;\n            var time = chart && chart.time || H.time;\n            var numberFormatter = chart && chart.numberFormatter || numberFormat;\n            while (str) {\n                index = str.indexOf(splitter);\n                if (index === -1) {\n                    break;\n                }\n                segment = str.slice(0, index);\n                if (isInside) { // we're on the closing bracket looking back\n                    valueAndFormat = segment.split(':');\n                    val = getNestedProperty(valueAndFormat.shift() || '', ctx);\n                    // Format the replacement\n                    if (valueAndFormat.length && typeof val === 'number') {\n                        segment = valueAndFormat.join(':');\n                        if (floatRegex.test(segment)) { // float\n                            var decimals = parseInt((segment.match(decRegex) || ['', '-1'])[1], 10);\n                            if (val !== null) {\n                                val = numberFormatter(val, decimals, lang.decimalPoint, segment.indexOf(',') > -1 ? lang.thousandsSep : '');\n                            }\n                        }\n                        else {\n                            val = time.dateFormat(segment, val);\n                        }\n                    }\n                    // Push the result and advance the cursor\n                    ret.push(val);\n                }\n                else {\n                    ret.push(segment);\n                }\n                str = str.slice(index + 1); // the rest\n                isInside = !isInside; // toggle\n                splitter = isInside ? '}' : '{'; // now look for next matching bracket\n            }\n            ret.push(str);\n            return ret.join('');\n        };\n        /**\n         * Get the magnitude of a number.\n         *\n         * @function Highcharts.getMagnitude\n         *\n         * @param {number} num\n         *        The number.\n         *\n         * @return {number}\n         *         The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2 etc.\n         */\n        var getMagnitude = H.getMagnitude = function (num) {\n                return Math.pow(10,\n            Math.floor(Math.log(num) / Math.LN10));\n        };\n        /**\n         * Take an interval and normalize it to multiples of round numbers.\n         *\n         * @deprecated\n         * @function Highcharts.normalizeTickInterval\n         *\n         * @param {number} interval\n         *        The raw, un-rounded interval.\n         *\n         * @param {Array<*>} [multiples]\n         *        Allowed multiples.\n         *\n         * @param {number} [magnitude]\n         *        The magnitude of the number.\n         *\n         * @param {boolean} [allowDecimals]\n         *        Whether to allow decimals.\n         *\n         * @param {boolean} [hasTickAmount]\n         *        If it has tickAmount, avoid landing on tick intervals lower than\n         *        original.\n         *\n         * @return {number}\n         *         The normalized interval.\n         *\n         * @todo\n         * Move this function to the Axis prototype. It is here only for historical\n         * reasons.\n         */\n        var normalizeTickInterval = H.normalizeTickInterval = function (interval,\n            multiples,\n            magnitude,\n            allowDecimals,\n            hasTickAmount) {\n                var normalized,\n            i,\n            retInterval = interval;\n            // round to a tenfold of 1, 2, 2.5 or 5\n            magnitude = pick(magnitude, 1);\n            normalized = interval / magnitude;\n            // multiples for a linear scale\n            if (!multiples) {\n                multiples = hasTickAmount ?\n                    // Finer grained ticks when the tick amount is hard set, including\n                    // when alignTicks is true on multiple axes (#4580).\n                    [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n                    // Else, let ticks fall on rounder numbers\n                    [1, 2, 2.5, 5, 10];\n                // the allowDecimals option\n                if (allowDecimals === false) {\n                    if (magnitude === 1) {\n                        multiples = multiples.filter(function (num) {\n                            return num % 1 === 0;\n                        });\n                    }\n                    else if (magnitude <= 0.1) {\n                        multiples = [1 / magnitude];\n                    }\n                }\n            }\n            // normalize the interval to the nearest multiple\n            for (i = 0; i < multiples.length; i++) {\n                retInterval = multiples[i];\n                // only allow tick amounts smaller than natural\n                if ((hasTickAmount &&\n                    retInterval * magnitude >= interval) ||\n                    (!hasTickAmount &&\n                        (normalized <=\n                            (multiples[i] +\n                                (multiples[i + 1] || multiples[i])) / 2))) {\n                    break;\n                }\n            }\n            // Multiply back to the correct magnitude. Correct floats to appropriate\n            // precision (#6085).\n            retInterval = correctFloat(retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10));\n            return retInterval;\n        };\n        /**\n         * Sort an object array and keep the order of equal items. The ECMAScript\n         * standard does not specify the behaviour when items are equal.\n         *\n         * @function Highcharts.stableSort\n         *\n         * @param {Array<*>} arr\n         *        The array to sort.\n         *\n         * @param {Function} sortFunction\n         *        The function to sort it with, like with regular Array.prototype.sort.\n         *\n         * @return {void}\n         */\n        var stableSort = H.stableSort = function stableSort(arr,\n            sortFunction) {\n                // @todo It seems like Chrome since v70 sorts in a stable way internally,\n                // plus all other browsers do it, so over time we may be able to remove this\n                // function\n                var length = arr.length,\n            sortValue,\n            i;\n            // Add index to each item\n            for (i = 0; i < length; i++) {\n                arr[i].safeI = i; // stable sort index\n            }\n            arr.sort(function (a, b) {\n                sortValue = sortFunction(a, b);\n                return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n            });\n            // Remove index from items\n            for (i = 0; i < length; i++) {\n                delete arr[i].safeI; // stable sort index\n            }\n        };\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.min` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function Highcharts.arrayMin\n         *\n         * @param {Array<*>} data\n         *        An array of numbers.\n         *\n         * @return {number}\n         *         The lowest number.\n         */\n        var arrayMin = H.arrayMin = function arrayMin(data) {\n                var i = data.length,\n            min = data[0];\n            while (i--) {\n                if (data[i] < min) {\n                    min = data[i];\n                }\n            }\n            return min;\n        };\n        /**\n         * Non-recursive method to find the lowest member of an array. `Math.max` raises\n         * a maximum call stack size exceeded error in Chrome when trying to apply more\n         * than 150.000 points. This method is slightly slower, but safe.\n         *\n         * @function Highcharts.arrayMax\n         *\n         * @param {Array<*>} data\n         *        An array of numbers.\n         *\n         * @return {number}\n         *         The highest number.\n         */\n        var arrayMax = H.arrayMax = function arrayMax(data) {\n                var i = data.length,\n            max = data[0];\n            while (i--) {\n                if (data[i] > max) {\n                    max = data[i];\n                }\n            }\n            return max;\n        };\n        /**\n         * Utility method that destroys any SVGElement instances that are properties on\n         * the given object. It loops all properties and invokes destroy if there is a\n         * destroy method. The property is then delete.\n         *\n         * @function Highcharts.destroyObjectProperties\n         *\n         * @param {*} obj\n         *        The object to destroy properties on.\n         *\n         * @param {*} [except]\n         *        Exception, do not destroy this property, only delete it.\n         *\n         * @return {void}\n         */\n        var destroyObjectProperties = H.destroyObjectProperties =\n                function destroyObjectProperties(obj,\n            except) {\n                    objectEach(obj,\n            function (val,\n            n) {\n                        // If the object is non-null and destroy is defined\n                        if (val && val !== except && val.destroy) {\n                            // Invoke the destroy\n                            val.destroy();\n                    }\n                    // Delete the property from the object.\n                    delete obj[n];\n                });\n            };\n        /**\n         * Discard a HTML element by moving it to the bin and delete.\n         *\n         * @function Highcharts.discardElement\n         *\n         * @param {Highcharts.HTMLDOMElement} element\n         *        The HTML node to discard.\n         *\n         * @return {void}\n         */\n        var discardElement = H.discardElement = function discardElement(element) {\n                var garbageBin = H.garbageBin;\n            // create a garbage bin element, not part of the DOM\n            if (!garbageBin) {\n                garbageBin = createElement('div');\n            }\n            // move the node and empty bin\n            if (element) {\n                garbageBin.appendChild(element);\n            }\n            garbageBin.innerHTML = '';\n        };\n        /**\n         * Fix JS round off float errors.\n         *\n         * @function Highcharts.correctFloat\n         *\n         * @param {number} num\n         *        A float number to fix.\n         *\n         * @param {number} [prec=14]\n         *        The precision.\n         *\n         * @return {number}\n         *         The corrected float number.\n         */\n        var correctFloat = H.correctFloat = function correctFloat(num,\n            prec) {\n                return parseFloat(num.toPrecision(prec || 14));\n        };\n        /**\n         * Set the global animation to either a given value, or fall back to the given\n         * chart's animation option.\n         *\n         * @function Highcharts.setAnimation\n         *\n         * @param {boolean|Highcharts.AnimationOptionsObject|undefined} animation\n         *        The animation object.\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart instance.\n         *\n         * @return {void}\n         *\n         * @todo\n         * This function always relates to a chart, and sets a property on the renderer,\n         * so it should be moved to the SVGRenderer.\n         */\n        var setAnimation = H.setAnimation = function setAnimation(animation,\n            chart) {\n                chart.renderer.globalAnimation = pick(animation,\n            chart.options.chart.animation,\n            true);\n        };\n        /**\n         * Get the animation in object form, where a disabled animation is always\n         * returned as `{ duration: 0 }`.\n         *\n         * @function Highcharts.animObject\n         *\n         * @param {boolean|Highcharts.AnimationOptionsObject} [animation=0]\n         *        An animation setting. Can be an object with duration, complete and\n         *        easing properties, or a boolean to enable or disable.\n         *\n         * @return {Highcharts.AnimationOptionsObject}\n         *         An object with at least a duration property.\n         */\n        var animObject = H.animObject = function animObject(animation) {\n                return isObject(animation) ?\n                    merge(animation) :\n                    { duration: animation ? 500 : 0 };\n        };\n        /**\n         * The time unit lookup\n         *\n         * @ignore\n         */\n        var timeUnits = H.timeUnits = {\n                millisecond: 1,\n                second: 1000,\n                minute: 60000,\n                hour: 3600000,\n                day: 24 * 3600000,\n                week: 7 * 24 * 3600000,\n                month: 28 * 24 * 3600000,\n                year: 364 * 24 * 3600000\n            };\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @sample highcharts/members/highcharts-numberformat/\n         *         Custom number format\n         *\n         * @function Highcharts.numberFormat\n         *\n         * @param {number} number\n         *        The input number to format.\n         *\n         * @param {number} decimals\n         *        The amount of decimals. A value of -1 preserves the amount in the\n         *        input number.\n         *\n         * @param {string} [decimalPoint]\n         *        The decimal point, defaults to the one given in the lang options, or\n         *        a dot.\n         *\n         * @param {string} [thousandsSep]\n         *        The thousands separator, defaults to the one given in the lang\n         *        options, or a space character.\n         *\n         * @return {string}\n         *         The formatted number.\n         */\n        var numberFormat = H.numberFormat = function numberFormat(number,\n            decimals,\n            decimalPoint,\n            thousandsSep) {\n                number = +number || 0;\n            decimals = +decimals;\n            var lang = H.defaultOptions.lang, origDec = (number.toString().split('.')[1] || '').split('e')[0].length, strinteger, thousands, ret, roundedNumber, exponent = number.toString().split('e'), fractionDigits;\n            if (decimals === -1) {\n                // Preserve decimals. Not huge numbers (#3793).\n                decimals = Math.min(origDec, 20);\n            }\n            else if (!isNumber(decimals)) {\n                decimals = 2;\n            }\n            else if (decimals && exponent[1] && exponent[1] < 0) {\n                // Expose decimals from exponential notation (#7042)\n                fractionDigits = decimals + +exponent[1];\n                if (fractionDigits >= 0) {\n                    // remove too small part of the number while keeping the notation\n                    exponent[0] = (+exponent[0]).toExponential(fractionDigits)\n                        .split('e')[0];\n                    decimals = fractionDigits;\n                }\n                else {\n                    // fractionDigits < 0\n                    exponent[0] = exponent[0].split('.')[0] || 0;\n                    if (decimals < 20) {\n                        // use number instead of exponential notation (#7405)\n                        number = (exponent[0] * Math.pow(10, exponent[1]))\n                            .toFixed(decimals);\n                    }\n                    else {\n                        // or zero\n                        number = 0;\n                    }\n                    exponent[1] = 0;\n                }\n            }\n            // Add another decimal to avoid rounding errors of float numbers. (#4573)\n            // Then use toFixed to handle rounding.\n            roundedNumber = (Math.abs(exponent[1] ? exponent[0] : number) +\n                Math.pow(10, -Math.max(decimals, origDec) - 1)).toFixed(decimals);\n            // A string containing the positive integer component of the number\n            strinteger = String(pInt(roundedNumber));\n            // Leftover after grouping into thousands. Can be 0, 1 or 2.\n            thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n            // Language\n            decimalPoint = pick(decimalPoint, lang.decimalPoint);\n            thousandsSep = pick(thousandsSep, lang.thousandsSep);\n            // Start building the return\n            ret = number < 0 ? '-' : '';\n            // Add the leftover after grouping into thousands. For example, in the\n            // number 42 000 000, this line adds 42.\n            ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n            // Add the remaining thousands groups, joined by the thousands separator\n            ret += strinteger\n                .substr(thousands)\n                .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n            // Add the decimal point and the decimal component\n            if (decimals) {\n                // Get the decimal component\n                ret += decimalPoint + roundedNumber.slice(-decimals);\n            }\n            if (exponent[1] && +ret !== 0) {\n                ret += 'e' + exponent[1];\n            }\n            return ret;\n        };\n        /**\n         * Easing definition\n         *\n         * @private\n         * @function Math.easeInOutSine\n         *\n         * @param {number} pos\n         *        Current position, ranging from 0 to 1.\n         *\n         * @return {number}\n         *         Ease result\n         */\n        Math.easeInOutSine = function (pos) {\n            return -0.5 * (Math.cos(Math.PI * pos) - 1);\n        };\n        /**\n         * Returns the value of a property path on a given object.\n         *\n         * @private\n         * @function getNestedProperty\n         *\n         * @param {string} path\n         * Path to the property, for example `custom.myValue`.\n         *\n         * @param {unknown} obj\n         * Instance containing the property on the specific path.\n         *\n         * @return {unknown}\n         * The unknown property value.\n         */\n        function getNestedProperty(path, obj) {\n            if (!path) {\n                return obj;\n            }\n            var pathElements = path.split('.').reverse();\n            var subProperty = obj;\n            if (pathElements.length === 1) {\n                return subProperty[path];\n            }\n            var pathElement = pathElements.pop();\n            while (typeof pathElement !== 'undefined' &&\n                typeof subProperty !== 'undefined' &&\n                subProperty !== null) {\n                subProperty = subProperty[pathElement];\n                pathElement = pathElements.pop();\n            }\n            return subProperty;\n        }\n        /**\n         * Get the computed CSS value for given element and property, only for numerical\n         * properties. For width and height, the dimension of the inner box (excluding\n         * padding) is returned. Used for fitting the chart within the container.\n         *\n         * @function Highcharts.getStyle\n         *\n         * @param {Highcharts.HTMLDOMElement} el\n         *        An HTML element.\n         *\n         * @param {string} prop\n         *        The property name.\n         *\n         * @param {boolean} [toInt=true]\n         *        Parse to integer.\n         *\n         * @return {number|string}\n         *         The numeric value.\n         */\n        var getStyle = H.getStyle = function (el,\n            prop,\n            toInt) {\n                var style;\n            // For width and height, return the actual inner pixel size (#4913)\n            if (prop === 'width') {\n                var offsetWidth = Math.min(el.offsetWidth,\n                    el.scrollWidth);\n                // In flex boxes, we need to use getBoundingClientRect and floor it,\n                // because scrollWidth doesn't support subpixel precision (#6427) ...\n                var boundingClientRectWidth = el.getBoundingClientRect &&\n                        el.getBoundingClientRect().width;\n                // ...unless if the containing div or its parents are transform-scaled\n                // down, in which case the boundingClientRect can't be used as it is\n                // also scaled down (#9871, #10498).\n                if (boundingClientRectWidth < offsetWidth &&\n                    boundingClientRectWidth >= offsetWidth - 1) {\n                    offsetWidth = Math.floor(boundingClientRectWidth);\n                }\n                return Math.max(0, // #8377\n                (offsetWidth -\n                    H.getStyle(el, 'padding-left') -\n                    H.getStyle(el, 'padding-right')));\n            }\n            if (prop === 'height') {\n                return Math.max(0, // #8377\n                Math.min(el.offsetHeight, el.scrollHeight) -\n                    H.getStyle(el, 'padding-top') -\n                    H.getStyle(el, 'padding-bottom'));\n            }\n            if (!win.getComputedStyle) {\n                // SVG not supported, forgot to load oldie.js?\n                error(27, true);\n            }\n            // Otherwise, get the computed style\n            style = win.getComputedStyle(el, undefined); // eslint-disable-line no-undefined\n            if (style) {\n                style = style.getPropertyValue(prop);\n                if (pick(toInt, prop !== 'opacity')) {\n                    style = pInt(style);\n                }\n            }\n            return style;\n        };\n        /**\n         * Search for an item in an array.\n         *\n         * @function Highcharts.inArray\n         *\n         * @deprecated\n         *\n         * @param {*} item\n         *        The item to search for.\n         *\n         * @param {Array<*>} arr\n         *        The array or node collection to search in.\n         *\n         * @param {number} [fromIndex=0]\n         *        The index to start searching from.\n         *\n         * @return {number}\n         *         The index within the array, or -1 if not found.\n         */\n        var inArray = H.inArray = function (item,\n            arr,\n            fromIndex) {\n                error(32,\n            false,\n            void 0, { 'Highcharts.inArray': 'use Array.indexOf' });\n            return arr.indexOf(item, fromIndex);\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Return the value of the first element in the array that satisfies the\n         * provided testing function.\n         *\n         * @function Highcharts.find<T>\n         *\n         * @param {Array<T>} arr\n         *        The array to test.\n         *\n         * @param {Function} callback\n         *        The callback function. The function receives the item as the first\n         *        argument. Return `true` if this item satisfies the condition.\n         *\n         * @return {T|undefined}\n         *         The value of the element.\n         */\n        var find = H.find = Array.prototype.find ?\n                /* eslint-enable valid-jsdoc */\n                function (arr,\n            callback) {\n                    return arr.find(callback);\n            } :\n            // Legacy implementation. PhantomJS, IE <= 11 etc. #7223.\n            function (arr, callback) {\n                var i,\n                    length = arr.length;\n                for (i = 0; i < length; i++) {\n                    if (callback(arr[i], i)) { // eslint-disable-line callback-return\n                        return arr[i];\n                    }\n                }\n            };\n        /**\n         * Returns an array of a given object's own properties.\n         *\n         * @function Highcharts.keys\n         * @deprecated\n         *\n         * @param {*} obj\n         *        The object of which the properties are to be returned.\n         *\n         * @return {Array<string>}\n         *         An array of strings that represents all the properties.\n         */\n        H.keys = function (obj) {\n            error(32, false, void 0, { 'Highcharts.keys': 'use Object.keys' });\n            return Object.keys(obj);\n        };\n        /**\n         * Get the element's offset position, corrected for `overflow: auto`.\n         *\n         * @function Highcharts.offset\n         *\n         * @param {global.Element} el\n         *        The DOM element.\n         *\n         * @return {Highcharts.OffsetObject}\n         *         An object containing `left` and `top` properties for the position in\n         *         the page.\n         */\n        var offset = H.offset = function offset(el) {\n                var docElem = doc.documentElement,\n            box = (el.parentElement || el.parentNode) ?\n                    el.getBoundingClientRect() :\n                    { top: 0,\n            left: 0 };\n            return {\n                top: box.top + (win.pageYOffset || docElem.scrollTop) -\n                    (docElem.clientTop || 0),\n                left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n                    (docElem.clientLeft || 0)\n            };\n        };\n        /**\n         * Stop running animation.\n         *\n         * @function Highcharts.stop\n         *\n         * @param {Highcharts.SVGElement} el\n         *        The SVGElement to stop animation on.\n         *\n         * @param {string} [prop]\n         *        The property to stop animating. If given, the stop method will stop a\n         *        single property from animating, while others continue.\n         *\n         * @return {void}\n         *\n         * @todo\n         * A possible extension to this would be to stop a single property, when\n         * we want to continue animating others. Then assign the prop to the timer\n         * in the Fx.run method, and check for the prop here. This would be an\n         * improvement in all cases where we stop the animation from .attr. Instead of\n         * stopping everything, we can just stop the actual attributes we're setting.\n         */\n        var stop = H.stop = function (el,\n            prop) {\n                var i = H.timers.length;\n            // Remove timers related to this element (#4519)\n            while (i--) {\n                if (H.timers[i].elem === el && (!prop || prop === H.timers[i].prop)) {\n                    H.timers[i].stopped = true; // #4667\n                }\n            }\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Iterate over object key pairs in an object.\n         *\n         * @function Highcharts.objectEach<T>\n         *\n         * @param {*} obj\n         *        The object to iterate over.\n         *\n         * @param {Highcharts.ObjectEachCallbackFunction<T>} fn\n         *        The iterator callback. It passes three arguments:\n         *        * value - The property value.\n         *        * key - The property key.\n         *        * obj - The object that objectEach is being applied to.\n         *\n         * @param {T} [ctx]\n         *        The context.\n         *\n         * @return {void}\n         */\n        var objectEach = H.objectEach = function objectEach(obj,\n            fn,\n            ctx) {\n                /* eslint-enable valid-jsdoc */\n                for (var key in obj) {\n                    if (Object.hasOwnProperty.call(obj,\n            key)) {\n                        fn.call(ctx || obj[key],\n            obj[key],\n            key,\n            obj);\n                }\n            }\n        };\n        /**\n         * Iterate over an array.\n         *\n         * @deprecated\n         * @function Highcharts.each\n         *\n         * @param {Array<*>} arr\n         *        The array to iterate over.\n         *\n         * @param {Function} fn\n         *        The iterator callback. It passes three arguments:\n         *        - `item`: The array item.\n         *        - `index`: The item's index in the array.\n         *        - `arr`: The array that each is being applied to.\n         *\n         * @param {*} [ctx]\n         *        The context.\n         *\n         * @return {void}\n         */\n        /**\n         * Filter an array by a callback.\n         *\n         * @deprecated\n         * @function Highcharts.grep\n         *\n         * @param {Array<*>} arr\n         *        The array to filter.\n         *\n         * @param {Function} callback\n         *        The callback function. The function receives the item as the first\n         *        argument. Return `true` if the item is to be preserved.\n         *\n         * @return {Array<*>}\n         *         A new, filtered array.\n         */\n        /**\n         * Map an array by a callback.\n         *\n         * @deprecated\n         * @function Highcharts.map\n         *\n         * @param {Array<*>} arr\n         *        The array to map.\n         *\n         * @param {Function} fn\n         *        The callback function. Return the new value for the new array.\n         *\n         * @return {Array<*>}\n         *         A new array item with modified items.\n         */\n        /**\n         * Reduce an array to a single value.\n         *\n         * @deprecated\n         * @function Highcharts.reduce\n         *\n         * @param {Array<*>} arr\n         *        The array to reduce.\n         *\n         * @param {Function} fn\n         *        The callback function. Return the reduced value. Receives 4\n         *        arguments: Accumulated/reduced value, current value, current array\n         *        index, and the array.\n         *\n         * @param {*} initialValue\n         *        The initial value of the accumulator.\n         *\n         * @return {*}\n         *         The reduced value.\n         */\n        /**\n         * Test whether at least one element in the array passes the test implemented by\n         * the provided function.\n         *\n         * @deprecated\n         * @function Highcharts.some\n         *\n         * @param {Array<*>} arr\n         *        The array to test\n         *\n         * @param {Function} fn\n         *        The function to run on each item. Return truty to pass the test.\n         *        Receives arguments `currentValue`, `index` and `array`.\n         *\n         * @param {*} ctx\n         *        The context.\n         *\n         * @return {boolean}\n         */\n        objectEach({\n            map: 'map',\n            each: 'forEach',\n            grep: 'filter',\n            reduce: 'reduce',\n            some: 'some'\n        }, function (val, key) {\n            H[key] = function (arr) {\n                var _a;\n                error(32, false, void 0, (_a = {}, _a[\"Highcharts.\" + key] = \"use Array.\" + val, _a));\n                return Array.prototype[val].apply(arr, [].slice.call(arguments, 1));\n            };\n        });\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Add an event listener.\n         *\n         * @function Highcharts.addEvent<T>\n         *\n         * @param {Highcharts.Class<T>|T} el\n         *        The element or object to add a listener to. It can be a\n         *        {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n         *\n         * @param {string} type\n         *        The event type.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>|Function} fn\n         *        The function callback to execute when the event is fired.\n         *\n         * @param {Highcharts.EventOptionsObject} [options]\n         *        Options for adding the event.\n         *\n         * @return {Function}\n         *         A callback function to remove the added event.\n         */\n        var addEvent = H.addEvent = function (el,\n            type,\n            fn,\n            options) {\n                if (options === void 0) { options = {}; }\n                /* eslint-enable valid-jsdoc */\n                var events,\n            addEventListener = (el.addEventListener || H.addEventListenerPolyfill);\n            // If we're setting events directly on the constructor, use a separate\n            // collection, `protoEvents` to distinguish it from the item events in\n            // `hcEvents`.\n            if (typeof el === 'function' && el.prototype) {\n                events = el.prototype.protoEvents = el.prototype.protoEvents || {};\n            }\n            else {\n                events = el.hcEvents = el.hcEvents || {};\n            }\n            // Allow click events added to points, otherwise they will be prevented by\n            // the TouchPointer.pinch function after a pinch zoom operation (#7091).\n            if (H.Point &&\n                el instanceof H.Point &&\n                el.series &&\n                el.series.chart) {\n                el.series.chart.runTrackerClick = true;\n            }\n            // Handle DOM events\n            if (addEventListener) {\n                addEventListener.call(el, type, fn, false);\n            }\n            if (!events[type]) {\n                events[type] = [];\n            }\n            var eventObject = {\n                    fn: fn,\n                    order: typeof options.order === 'number' ? options.order : Infinity\n                };\n            events[type].push(eventObject);\n            // Order the calls\n            events[type].sort(function (a, b) {\n                return a.order - b.order;\n            });\n            // Return a function that can be called to remove this event.\n            return function () {\n                removeEvent(el, type, fn);\n            };\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Remove an event that was added with {@link Highcharts#addEvent}.\n         *\n         * @function Highcharts.removeEvent<T>\n         *\n         * @param {Highcharts.Class<T>|T} el\n         *        The element to remove events on.\n         *\n         * @param {string} [type]\n         *        The type of events to remove. If undefined, all events are removed\n         *        from the element.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>} [fn]\n         *        The specific callback to remove. If undefined, all events that match\n         *        the element and optionally the type are removed.\n         *\n         * @return {void}\n         */\n        var removeEvent = H.removeEvent = function removeEvent(el,\n            type,\n            fn) {\n                /* eslint-enable valid-jsdoc */\n                var events;\n            /**\n             * @private\n             * @param {string} type - event type\n             * @param {Highcharts.EventCallbackFunction<T>} fn - callback\n             * @return {void}\n             */\n            function removeOneEvent(type, fn) {\n                var removeEventListener = (el.removeEventListener || H.removeEventListenerPolyfill);\n                if (removeEventListener) {\n                    removeEventListener.call(el, type, fn, false);\n                }\n            }\n            /**\n             * @private\n             * @param {any} eventCollection - collection\n             * @return {void}\n             */\n            function removeAllEvents(eventCollection) {\n                var types,\n                    len;\n                if (!el.nodeName) {\n                    return; // break on non-DOM events\n                }\n                if (type) {\n                    types = {};\n                    types[type] = true;\n                }\n                else {\n                    types = eventCollection;\n                }\n                objectEach(types, function (_val, n) {\n                    if (eventCollection[n]) {\n                        len = eventCollection[n].length;\n                        while (len--) {\n                            removeOneEvent(n, eventCollection[n][len].fn);\n                        }\n                    }\n                });\n            }\n            ['protoEvents', 'hcEvents'].forEach(function (coll, i) {\n                var eventElem = i ? el : el.prototype;\n                var eventCollection = eventElem && eventElem[coll];\n                if (eventCollection) {\n                    if (type) {\n                        events = (eventCollection[type] || []);\n                        if (fn) {\n                            eventCollection[type] = events.filter(function (obj) {\n                                return fn !== obj.fn;\n                            });\n                            removeOneEvent(type, fn);\n                        }\n                        else {\n                            removeAllEvents(eventCollection);\n                            eventCollection[type] = [];\n                        }\n                    }\n                    else {\n                        removeAllEvents(eventCollection);\n                        eventElem[coll] = {};\n                    }\n                }\n            });\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Fire an event that was registered with {@link Highcharts#addEvent}.\n         *\n         * @function Highcharts.fireEvent<T>\n         *\n         * @param {T} el\n         *        The object to fire the event on. It can be a {@link HTMLDOMElement},\n         *        an {@link SVGElement} or any other object.\n         *\n         * @param {string} type\n         *        The type of event.\n         *\n         * @param {Highcharts.Dictionary<*>|Event} [eventArguments]\n         *        Custom event arguments that are passed on as an argument to the event\n         *        handler.\n         *\n         * @param {Highcharts.EventCallbackFunction<T>|Function} [defaultFunction]\n         *        The default function to execute if the other listeners haven't\n         *        returned false.\n         *\n         * @return {void}\n         */\n        var fireEvent = H.fireEvent = function (el,\n            type,\n            eventArguments,\n            defaultFunction) {\n                /* eslint-enable valid-jsdoc */\n                var e,\n            i;\n            eventArguments = eventArguments || {};\n            if (doc.createEvent &&\n                (el.dispatchEvent || el.fireEvent)) {\n                e = doc.createEvent('Events');\n                e.initEvent(type, true, true);\n                extend(e, eventArguments);\n                if (el.dispatchEvent) {\n                    el.dispatchEvent(e);\n                }\n                else {\n                    el.fireEvent(type, e);\n                }\n            }\n            else {\n                if (!eventArguments.target) {\n                    // We're running a custom event\n                    extend(eventArguments, {\n                        // Attach a simple preventDefault function to skip\n                        // default handler if called. The built-in\n                        // defaultPrevented property is not overwritable (#5112)\n                        preventDefault: function () {\n                            eventArguments.defaultPrevented = true;\n                        },\n                        // Setting target to native events fails with clicking\n                        // the zoom-out button in Chrome.\n                        target: el,\n                        // If the type is not set, we're running a custom event\n                        // (#2297). If it is set, we're running a browser event,\n                        // and setting it will cause en error in IE8 (#2465).\n                        type: type\n                    });\n                }\n                var fireInOrder = function (protoEvents,\n                    hcEvents) {\n                        if (protoEvents === void 0) { protoEvents = []; }\n                        if (hcEvents === void 0) { hcEvents = []; }\n                        var iA = 0;\n                    var iB = 0;\n                    var length = protoEvents.length + hcEvents.length;\n                    for (i = 0; i < length; i++) {\n                        var obj = (!protoEvents[iA] ?\n                                hcEvents[iB++] :\n                                !hcEvents[iB] ?\n                                    protoEvents[iA++] :\n                                    protoEvents[iA].order <= hcEvents[iB].order ?\n                                        protoEvents[iA++] :\n                                        hcEvents[iB++]);\n                        // If the event handler return false, prevent the default\n                        // handler from executing\n                        if (obj.fn.call(el, eventArguments) === false) {\n                            eventArguments.preventDefault();\n                        }\n                    }\n                };\n                fireInOrder(el.protoEvents && el.protoEvents[type], el.hcEvents && el.hcEvents[type]);\n            }\n            // Run the default if not prevented\n            if (defaultFunction && !eventArguments.defaultPrevented) {\n                defaultFunction.call(el, eventArguments);\n            }\n        };\n        /**\n         * The global animate method, which uses Fx to create individual animators.\n         *\n         * @function Highcharts.animate\n         *\n         * @param {Highcharts.HTMLDOMElement|Highcharts.SVGElement} el\n         *        The element to animate.\n         *\n         * @param {Highcharts.CSSObject|Highcharts.SVGAttributes} params\n         *        An object containing key-value pairs of the properties to animate.\n         *        Supports numeric as pixel-based CSS properties for HTML objects and\n         *        attributes for SVGElements.\n         *\n         * @param {Highcharts.AnimationOptionsObject} [opt]\n         *        Animation options.\n         *\n         * @return {void}\n         */\n        var animate = H.animate = function (el,\n            params,\n            opt) {\n                var start,\n            unit = '',\n            end,\n            fx,\n            args;\n            if (!isObject(opt)) { // Number or undefined/null\n                args = arguments;\n                opt = {\n                    duration: args[2],\n                    easing: args[3],\n                    complete: args[4]\n                };\n            }\n            if (!isNumber(opt.duration)) {\n                opt.duration = 400;\n            }\n            opt.easing = typeof opt.easing === 'function' ?\n                opt.easing :\n                (Math[opt.easing] || Math.easeInOutSine);\n            opt.curAnim = merge(params);\n            objectEach(params, function (val, prop) {\n                // Stop current running animation of this property\n                stop(el, prop);\n                fx = new Fx(el, opt, prop);\n                end = null;\n                if (prop === 'd' && isArray(params.d)) {\n                    fx.paths = fx.initPath(el, el.pathArray, params.d);\n                    fx.toD = params.d;\n                    start = 0;\n                    end = 1;\n                }\n                else if (el.attr) {\n                    start = el.attr(prop);\n                }\n                else {\n                    start = parseFloat(getStyle(el, prop)) || 0;\n                    if (prop !== 'opacity') {\n                        unit = 'px';\n                    }\n                }\n                if (!end) {\n                    end = val;\n                }\n                if (end && end.match && end.match('px')) {\n                    end = end.replace(/px/g, ''); // #4351\n                }\n                fx.run(start, end, unit);\n            });\n        };\n        /**\n         * Factory to create new series prototypes.\n         *\n         * @function Highcharts.seriesType\n         *\n         * @param {string} type\n         *        The series type name.\n         *\n         * @param {string} parent\n         *        The parent series type name. Use `line` to inherit from the basic\n         *        {@link Series} object.\n         *\n         * @param {Highcharts.SeriesOptionsType|Highcharts.Dictionary<*>} options\n         *        The additional default options that are merged with the parent's\n         *        options.\n         *\n         * @param {Highcharts.Dictionary<*>} [props]\n         *        The properties (functions and primitives) to set on the new\n         *        prototype.\n         *\n         * @param {Highcharts.Dictionary<*>} [pointProps]\n         *        Members for a series-specific extension of the {@link Point}\n         *        prototype if needed.\n         *\n         * @return {Highcharts.Series}\n         *         The newly created prototype as extended from {@link Series} or its\n         *         derivatives.\n         */\n        // docs: add to API + extending Highcharts\n        var seriesType = H.seriesType = function (type,\n            parent,\n            options,\n            props,\n            pointProps) {\n                var defaultOptions = getOptions(),\n            seriesTypes = H.seriesTypes;\n            // Merge the options\n            defaultOptions.plotOptions[type] = merge(defaultOptions.plotOptions[parent], options);\n            // Create the class\n            seriesTypes[type] = extendClass(seriesTypes[parent] || function () { }, props);\n            seriesTypes[type].prototype.type = type;\n            // Create the point class if needed\n            if (pointProps) {\n                seriesTypes[type].prototype.pointClass =\n                    extendClass(H.Point, pointProps);\n            }\n            return seriesTypes[type];\n        };\n        var serialMode;\n        /**\n         * Get a unique key for using in internal element id's and pointers. The key is\n         * composed of a random hash specific to this Highcharts instance, and a\n         * counter.\n         *\n         * @example\n         * var id = uniqueKey(); // => 'highcharts-x45f6hp-0'\n         *\n         * @function Highcharts.uniqueKey\n         *\n         * @return {string}\n         * A unique key.\n         */\n        var uniqueKey = H.uniqueKey = (function () {\n                var hash = Math.random().toString(36).substring(2, 9) + '-';\n            var id = 0;\n            return function () {\n                return 'highcharts-' + (serialMode ? '' : hash) + id++;\n            };\n        }());\n        /**\n         * Activates a serial mode for element IDs provided by\n         * {@link Highcharts.uniqueKey}. This mode can be used in automated tests, where\n         * a simple comparison of two rendered SVG graphics is needed.\n         *\n         * **Note:** This is only for testing purposes and will break functionality in\n         * webpages with multiple charts.\n         *\n         * @example\n         * if (\n         *   process &&\n         *   process.env.NODE_ENV === 'development'\n         * ) {\n         *   Highcharts.useSerialIds(true);\n         * }\n         *\n         * @function Highcharts.useSerialIds\n         *\n         * @param {boolean} [mode]\n         * Changes the state of serial mode.\n         *\n         * @return {boolean|undefined}\n         * State of the serial mode.\n         */\n        var useSerialIds = H.useSerialIds = function (mode) {\n                return (serialMode = pick(mode,\n            serialMode));\n        };\n        var isFunction = H.isFunction = function (obj) {\n                return typeof obj === 'function';\n        };\n        /**\n         * Get the updated default options. Until 3.0.7, merely exposing defaultOptions\n         * for outside modules wasn't enough because the setOptions method created a new\n         * object.\n         *\n         * @function Highcharts.getOptions\n         *\n         * @return {Highcharts.Options}\n         */\n        var getOptions = H.getOptions = function () {\n                return H.defaultOptions;\n        };\n        /**\n         * Merge the default options with custom options and return the new options\n         * structure. Commonly used for defining reusable templates.\n         *\n         * @sample highcharts/global/useutc-false Setting a global option\n         * @sample highcharts/members/setoptions Applying a global theme\n         *\n         * @function Highcharts.setOptions\n         *\n         * @param {Highcharts.Options} options\n         *        The new custom chart options.\n         *\n         * @return {Highcharts.Options}\n         *         Updated options.\n         */\n        var setOptions = H.setOptions = function (options) {\n                // Copy in the default options\n                H.defaultOptions = merge(true,\n            H.defaultOptions,\n            options);\n            // Update the time object\n            if (options.time || options.global) {\n                H.time.update(merge(H.defaultOptions.global, H.defaultOptions.time, options.global, options.time));\n            }\n            return H.defaultOptions;\n        };\n        // Register Highcharts as a plugin in jQuery\n        if (win.jQuery) {\n            /**\n             * Highcharts-extended JQuery.\n             *\n             * @external JQuery\n             */\n            /**\n             * Helper function to return the chart of the current JQuery selector\n             * element.\n             *\n             * @function external:JQuery#highcharts\n             *\n             * @return {Highcharts.Chart}\n             *         The chart that is linked to the JQuery selector element.\n             */ /**\n            * Factory function to create a chart in the current JQuery selector\n            * element.\n            *\n            * @function external:JQuery#highcharts\n            *\n            * @param {'Chart'|'Map'|'StockChart'|string} [className]\n            *        Name of the factory class in the Highcharts namespace.\n            *\n            * @param {Highcharts.Options} [options]\n            *        The chart options structure.\n            *\n            * @param {Highcharts.ChartCallbackFunction} [callback]\n            *        Function to run when the chart has loaded and and all external\n            *        images are loaded. Defining a\n            *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n            *        handler is equivalent.\n            *\n            * @return {JQuery}\n            *         The current JQuery selector.\n            */\n            win.jQuery.fn.highcharts = function () {\n                var args = [].slice.call(arguments);\n                if (this[0]) { // this[0] is the renderTo div\n                    // Create the chart\n                    if (args[0]) {\n                        new H[ // eslint-disable-line computed-property-spacing, no-new\n                        // Constructor defaults to Chart\n                        isString(args[0]) ? args.shift() : 'Chart'](this[0], args[0], args[1]);\n                        return this;\n                    }\n                    // When called without parameters or with the return argument,\n                    // return an existing chart\n                    return charts[attr(this[0], 'data-highcharts-chart')];\n                }\n            };\n        }\n        // TODO use named exports when supported.\n        var utilitiesModule = {\n                Fx: H.Fx,\n                addEvent: addEvent,\n                animate: animate,\n                animObject: animObject,\n                arrayMax: arrayMax,\n                arrayMin: arrayMin,\n                attr: attr,\n                clamp: clamp,\n                clearTimeout: internalClearTimeout,\n                correctFloat: correctFloat,\n                createElement: createElement,\n                css: css,\n                defined: defined,\n                destroyObjectProperties: destroyObjectProperties,\n                discardElement: discardElement,\n                erase: erase,\n                error: error,\n                extend: extend,\n                extendClass: extendClass,\n                find: find,\n                fireEvent: fireEvent,\n                format: format,\n                getMagnitude: getMagnitude,\n                getNestedProperty: getNestedProperty,\n                getOptions: getOptions,\n                getStyle: getStyle,\n                inArray: inArray,\n                isArray: isArray,\n                isClass: isClass,\n                isDOMElement: isDOMElement,\n                isFunction: isFunction,\n                isNumber: isNumber,\n                isObject: isObject,\n                isString: isString,\n                merge: merge,\n                normalizeTickInterval: normalizeTickInterval,\n                numberFormat: numberFormat,\n                objectEach: objectEach,\n                offset: offset,\n                pad: pad,\n                pick: pick,\n                pInt: pInt,\n                relativeLength: relativeLength,\n                removeEvent: removeEvent,\n                seriesType: seriesType,\n                setAnimation: setAnimation,\n                setOptions: setOptions,\n                splat: splat,\n                stableSort: stableSort,\n                stop: stop,\n                syncTimeout: syncTimeout,\n                timeUnits: timeUnits,\n                uniqueKey: uniqueKey,\n                useSerialIds: useSerialIds,\n                wrap: wrap\n            };\n\n        return utilitiesModule;\n    });\n    _registerModule(_modules, 'parts/Color.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * A valid color to be parsed and handled by Highcharts. Highcharts internally\n         * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n         * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n         * browsers and displayed correctly, but Highcharts is not able to process them\n         * and apply concepts like opacity and brightening.\n         *\n         * @typedef {string} Highcharts.ColorString\n         */\n        /**\n         * A valid color type than can be parsed and handled by Highcharts. It can be a\n         * color string, a gradient object, or a pattern object.\n         *\n         * @typedef {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} Highcharts.ColorType\n         */\n        /**\n         * Gradient options instead of a solid color.\n         *\n         * @example\n         * // Linear gradient used as a color option\n         * color: {\n         *     linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n         *     stops: [\n         *         [0, '#003399'], // start\n         *         [0.5, '#ffffff'], // middle\n         *         [1, '#3366AA'] // end\n         *     ]\n         * }\n         *\n         * @interface Highcharts.GradientColorObject\n         */ /**\n        * Holds an object that defines the start position and the end position relative\n        * to the shape.\n        * @name Highcharts.GradientColorObject#linearGradient\n        * @type {Highcharts.LinearGradientColorObject|undefined}\n        */ /**\n        * Holds an object that defines the center position and the radius.\n        * @name Highcharts.GradientColorObject#radialGradient\n        * @type {Highcharts.RadialGradientColorObject|undefined}\n        */ /**\n        * The first item in each tuple is the position in the gradient, where 0 is the\n        * start of the gradient and 1 is the end of the gradient. Multiple stops can be\n        * applied. The second item is the color for each stop. This color can also be\n        * given in the rgba format.\n        * @name Highcharts.GradientColorObject#stops\n        * @type {Array<Highcharts.GradientColorStopObject>}\n        */\n        /**\n         * Color stop tuple.\n         *\n         * @see Highcharts.GradientColorObject\n         *\n         * @interface Highcharts.GradientColorStopObject\n         */ /**\n        * @name Highcharts.GradientColorStopObject#0\n        * @type {number}\n        */ /**\n        * @name Highcharts.GradientColorStopObject#1\n        * @type {Highcharts.ColorString}\n        */ /**\n        * @name Highcharts.GradoentColorStopObject#color\n        * @type {Highcharts.Color|undefined}\n        */\n        /**\n         * Defines the start position and the end position for a gradient relative\n         * to the shape. Start position (x1, y1) and end position (x2, y2) are relative\n         * to the shape, where 0 means top/left and 1 is bottom/right.\n         *\n         * @interface Highcharts.LinearGradientColorObject\n         */ /**\n        * Start horizontal position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#x1\n        * @type {number}\n        */ /**\n        * End horizontal position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#x2\n        * @type {number}\n        */ /**\n        * Start vertical position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#y1\n        * @type {number}\n        */ /**\n        * End vertical position of the gradient. Float ranges 0-1.\n        * @name Highcharts.LinearGradientColorObject#y2\n        * @type {number}\n        */\n        /**\n         * Defines the center position and the radius for a gradient.\n         *\n         * @interface Highcharts.RadialGradientColorObject\n         */ /**\n        * Center horizontal position relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#cx\n        * @type {number}\n        */ /**\n        * Center vertical position relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#cy\n        * @type {number}\n        */ /**\n        * Radius relative to the shape. Float ranges 0-1.\n        * @name Highcharts.RadialGradientColorObject#r\n        * @type {number}\n        */\n        var isNumber = U.isNumber,\n            merge = U.merge,\n            pInt = U.pInt;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handle color operations. Some object methods are chainable.\n         *\n         * @class\n         * @name Highcharts.Color\n         *\n         * @param {Highcharts.ColorType} input\n         * The input color in either rbga or hex format\n         */\n        var Color = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Color(input) {\n                    // Collection of parsers. This can be extended from the outside by pushing\n                    // parsers to Highcharts.Color.prototype.parsers.\n                    this.parsers = [{\n                            // RGBA color\n                            // eslint-disable-next-line max-len\n                            regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n                            parse: function (result) {\n                                return [\n                                    pInt(result[1]),\n                                    pInt(result[2]),\n                                    pInt(result[3]),\n                                    parseFloat(result[4], 10)\n                                ];\n                        }\n                    }, {\n                        // RGB color\n                        regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n                        parse: function (result) {\n                            return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n                        }\n                    }];\n                this.rgba = [];\n                // Backwards compatibility, allow instanciation without new (#13053)\n                if (!(this instanceof Color)) {\n                    return new Color(input);\n                }\n                this.init(input);\n            }\n            /* *\n             *\n             *  Static Functions\n             *\n             * */\n            /**\n             * Creates a color instance out of a color string or object.\n             *\n             * @function Highcharts.Color.parse\n             *\n             * @param {Highcharts.ColorType} input\n             * The input color in either rbga or hex format.\n             *\n             * @return {Highcharts.Color}\n             * Color instance.\n             */\n            Color.parse = function (input) {\n                return new Color(input);\n            };\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Parse the input color to rgba array\n             *\n             * @private\n             * @function Highcharts.Color#init\n             *\n             * @param {Highcharts.ColorType} input\n             *        The input color in either rbga or hex format\n             *\n             * @return {void}\n             */\n            Color.prototype.init = function (input) {\n                var result,\n                    rgba,\n                    i,\n                    parser,\n                    len;\n                this.input = input = Color.names[input && input.toLowerCase ?\n                    input.toLowerCase() :\n                    ''] || input;\n                // Gradients\n                if (input && input.stops) {\n                    this.stops = input.stops.map(function (stop) {\n                        return new Color(stop[1]);\n                    });\n                    // Solid colors\n                }\n                else {\n                    // Bitmasking as input[0] is not working for legacy IE.\n                    if (input &&\n                        input.charAt &&\n                        input.charAt() === '#') {\n                        len = input.length;\n                        input = parseInt(input.substr(1), 16);\n                        // Handle long-form, e.g. #AABBCC\n                        if (len === 7) {\n                            rgba = [\n                                (input & 0xFF0000) >> 16,\n                                (input & 0xFF00) >> 8,\n                                (input & 0xFF),\n                                1\n                            ];\n                            // Handle short-form, e.g. #ABC\n                            // In short form, the value is assumed to be the same\n                            // for both nibbles for each component. e.g. #ABC = #AABBCC\n                        }\n                        else if (len === 4) {\n                            rgba = [\n                                (((input & 0xF00) >> 4) |\n                                    (input & 0xF00) >> 8),\n                                (((input & 0xF0) >> 4) |\n                                    (input & 0xF0)),\n                                ((input & 0xF) << 4) | (input & 0xF),\n                                1\n                            ];\n                        }\n                    }\n                    // Otherwise, check regex parsers\n                    if (!rgba) {\n                        i = this.parsers.length;\n                        while (i-- && !rgba) {\n                            parser = this.parsers[i];\n                            result = parser.regex.exec(input);\n                            if (result) {\n                                rgba = parser.parse(result);\n                            }\n                        }\n                    }\n                }\n                this.rgba = rgba || [];\n            };\n            /**\n             * Return the color or gradient stops in the specified format\n             *\n             * @function Highcharts.Color#get\n             *\n             * @param {string} [format]\n             *        Possible values are 'a', 'rgb', 'rgba' (default).\n             *\n             * @return {Highcharts.ColorType}\n             *         This color as a string or gradient stops.\n             */\n            Color.prototype.get = function (format) {\n                var input = this.input,\n                    rgba = this.rgba,\n                    ret;\n                if (typeof this.stops !== 'undefined') {\n                    ret = merge(input);\n                    ret.stops = [].concat(ret.stops);\n                    this.stops.forEach(function (stop, i) {\n                        ret.stops[i] = [\n                            ret.stops[i][0],\n                            stop.get(format)\n                        ];\n                    });\n                    // it's NaN if gradient colors on a column chart\n                }\n                else if (rgba && isNumber(rgba[0])) {\n                    if (format === 'rgb' || (!format && rgba[3] === 1)) {\n                        ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n                    }\n                    else if (format === 'a') {\n                        ret = rgba[3];\n                    }\n                    else {\n                        ret = 'rgba(' + rgba.join(',') + ')';\n                    }\n                }\n                else {\n                    ret = input;\n                }\n                return ret;\n            };\n            /**\n             * Brighten the color instance.\n             *\n             * @function Highcharts.Color#brighten\n             *\n             * @param {number} alpha\n             *        The alpha value.\n             *\n             * @return {Highcharts.Color}\n             *         This color with modifications.\n             */\n            Color.prototype.brighten = function (alpha) {\n                var i,\n                    rgba = this.rgba;\n                if (this.stops) {\n                    this.stops.forEach(function (stop) {\n                        stop.brighten(alpha);\n                    });\n                }\n                else if (isNumber(alpha) && alpha !== 0) {\n                    for (i = 0; i < 3; i++) {\n                        rgba[i] += pInt(alpha * 255);\n                        if (rgba[i] < 0) {\n                            rgba[i] = 0;\n                        }\n                        if (rgba[i] > 255) {\n                            rgba[i] = 255;\n                        }\n                    }\n                }\n                return this;\n            };\n            /**\n             * Set the color's opacity to a given alpha value.\n             *\n             * @function Highcharts.Color#setOpacity\n             *\n             * @param {number} alpha\n             *        Opacity between 0 and 1.\n             *\n             * @return {Highcharts.Color}\n             *         Color with modifications.\n             */\n            Color.prototype.setOpacity = function (alpha) {\n                this.rgba[3] = alpha;\n                return this;\n            };\n            /**\n             * Return an intermediate color between two colors.\n             *\n             * @function Highcharts.Color#tweenTo\n             *\n             * @param {Highcharts.Color} to\n             *        The color object to tween to.\n             *\n             * @param {number} pos\n             *        The intermediate position, where 0 is the from color (current\n             *        color item), and 1 is the `to` color.\n             *\n             * @return {Highcharts.ColorString}\n             *         The intermediate color in rgba notation.\n             */\n            Color.prototype.tweenTo = function (to, pos) {\n                // Check for has alpha, because rgba colors perform worse due to lack of\n                // support in WebKit.\n                var fromRgba = this.rgba,\n                    toRgba = to.rgba,\n                    hasAlpha,\n                    ret;\n                // Unsupported color, return to-color (#3920, #7034)\n                if (!toRgba.length || !fromRgba || !fromRgba.length) {\n                    ret = to.input || 'none';\n                    // Interpolate\n                }\n                else {\n                    hasAlpha = (toRgba[3] !== 1 || fromRgba[3] !== 1);\n                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +\n                        Math.round(toRgba[0] + (fromRgba[0] - toRgba[0]) * (1 - pos)) +\n                        ',' +\n                        Math.round(toRgba[1] + (fromRgba[1] - toRgba[1]) * (1 - pos)) +\n                        ',' +\n                        Math.round(toRgba[2] + (fromRgba[2] - toRgba[2]) * (1 - pos)) +\n                        (hasAlpha ?\n                            (',' +\n                                (toRgba[3] + (fromRgba[3] - toRgba[3]) * (1 - pos))) :\n                            '') +\n                        ')';\n                }\n                return ret;\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            // Collection of named colors. Can be extended from the outside by adding\n            // colors to Highcharts.Color.names.\n            Color.names = {\n                white: '#ffffff',\n                black: '#000000'\n            };\n            return Color;\n        }());\n        H.Color = Color;\n        /**\n         * Creates a color instance out of a color string.\n         *\n         * @function Highcharts.color\n         *\n         * @param {Highcharts.ColorType} input\n         *        The input color in either rbga or hex format\n         *\n         * @return {Highcharts.Color}\n         *         Color instance\n         */\n        H.color = Color.parse;\n\n        return H.Color;\n    });\n    _registerModule(_modules, 'parts/SVGElement.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Color, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var deg2rad = H.deg2rad,\n            doc = H.doc,\n            hasTouch = H.hasTouch,\n            isFirefox = H.isFirefox,\n            noop = H.noop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            win = H.win;\n        var animate = U.animate,\n            animObject = U.animObject,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            inArray = U.inArray,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            stop = U.stop,\n            uniqueKey = U.uniqueKey;\n        /**\n         * The horizontal alignment of an element.\n         *\n         * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n         */\n        /**\n         * Options to align the element relative to the chart or another box.\n         *\n         * @interface Highcharts.AlignObject\n         */ /**\n        * Horizontal alignment. Can be one of `left`, `center` and `right`.\n        *\n        * @name Highcharts.AlignObject#align\n        * @type {Highcharts.AlignValue|undefined}\n        *\n        * @default left\n        */ /**\n        * Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n        *\n        * @name Highcharts.AlignObject#verticalAlign\n        * @type {Highcharts.VerticalAlignValue|undefined}\n        *\n        * @default top\n        */ /**\n        * Horizontal pixel offset from alignment.\n        *\n        * @name Highcharts.AlignObject#x\n        * @type {number|undefined}\n        *\n        * @default 0\n        */ /**\n        * Vertical pixel offset from alignment.\n        *\n        * @name Highcharts.AlignObject#y\n        * @type {number|undefined}\n        *\n        * @default 0\n        */ /**\n        * Use the `transform` attribute with translateX and translateY custom\n        * attributes to align this elements rather than `x` and `y` attributes.\n        *\n        * @name Highcharts.AlignObject#alignByTranslate\n        * @type {boolean|undefined}\n        *\n        * @default false\n        */\n        /**\n         * Bounding box of an element.\n         *\n         * @interface Highcharts.BBoxObject\n         * @extends Highcharts.PositionObject\n         */ /**\n        * Height of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#height\n        * @type {number}\n        */ /**\n        * Width of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#width\n        * @type {number}\n        */ /**\n        * Horizontal position of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#x\n        * @type {number}\n        */ /**\n        * Vertical position of the bounding box.\n        *\n        * @name Highcharts.BBoxObject#y\n        * @type {number}\n        */\n        /**\n         * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n         * elements for the most parts correspond to SVG, but some are specific to\n         * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n         * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n         * attributes containing a hyphen are _not_ camel-cased, they should be\n         * quoted to preserve the hyphen.\n         *\n         * @example\n         * {\n         *     'stroke': '#ff0000', // basic\n         *     'stroke-width': 2, // hyphenated\n         *     'rotation': 45 // custom\n         *     'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n         * }\n         *\n         * @interface Highcharts.SVGAttributes\n         */ /**\n        * @name Highcharts.SVGAttributes#[key:string]\n        * @type {*}\n        */ /**\n        * @name Highcharts.SVGAttributes#d\n        * @type {string|Highcharts.SVGPathArray|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#fill\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#inverted\n        * @type {boolean|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#matrix\n        * @type {Array<number>|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotation\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotationOriginX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#rotationOriginY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#scaleX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#scaleY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#stroke\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#style\n        * @type {string|Highcharts.CSSObject|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#translateX\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#translateY\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.SVGAttributes#zIndex\n        * @type {number|undefined}\n        */\n        /**\n         * An SVG DOM element. The type is a reference to the regular SVGElement in the\n         * global scope.\n         *\n         * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n         *\n         * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n         */\n        /**\n         * The vertical alignment of an element.\n         *\n         * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n         */\n        ''; // detach doclets above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n         * rendering layer of Highcharts. Combined with the\n         * {@link Highcharts.SVGRenderer}\n         * object, these prototypes allow freeform annotation in the charts or even in\n         * HTML pages without instanciating a chart. The SVGElement can also wrap HTML\n         * labels, when `text` or `label` elements are created with the `useHTML`\n         * parameter.\n         *\n         * The SVGElement instances are created through factory functions on the\n         * {@link Highcharts.SVGRenderer}\n         * object, like\n         * {@link Highcharts.SVGRenderer#rect|rect},\n         * {@link Highcharts.SVGRenderer#path|path},\n         * {@link Highcharts.SVGRenderer#text|text},\n         * {@link Highcharts.SVGRenderer#label|label},\n         * {@link Highcharts.SVGRenderer#g|g}\n         * and more.\n         *\n         * @class\n         * @name Highcharts.SVGElement\n         */\n        var SVGElement = /** @class */ (function () {\n                function SVGElement() {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.element = void 0;\n                this.height = void 0;\n                this.opacity = 1; // Default base for animation\n                this.renderer = void 0;\n                this.SVG_NS = SVG_NS;\n                // Custom attributes used for symbols, these should be filtered out when\n                // setting SVGElement attributes (#9375).\n                this.symbolCustomAttribs = [\n                    'x',\n                    'y',\n                    'width',\n                    'height',\n                    'r',\n                    'start',\n                    'end',\n                    'innerR',\n                    'anchorX',\n                    'anchorY',\n                    'rounded'\n                ];\n                this.width = void 0;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Get the current value of an attribute or pseudo attribute,\n             * used mainly for animation. Called internally from\n             * the {@link Highcharts.SVGRenderer#attr} function.\n             *\n             * @private\n             * @function Highcharts.SVGElement#_defaultGetter\n             *\n             * @param {string} key\n             *        Property key.\n             *\n             * @return {number|string}\n             *         Property value.\n             */\n            SVGElement.prototype._defaultGetter = function (key) {\n                var ret = pick(this[key + 'Value'], // align getter\n                    this[key],\n                    this.element ? this.element.getAttribute(key) : null, 0);\n                if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n                    ret = parseFloat(ret);\n                }\n                return ret;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#_defaultSetter\n             *\n             * @param {string} value\n             *\n             * @param {string} key\n             *\n             * @param {Highcharts.SVGDOMElement} element\n             *\n             * @return {void}\n             */\n            SVGElement.prototype._defaultSetter = function (value, key, element) {\n                element.setAttribute(key, value);\n            };\n            /**\n             * Add the element to the DOM. All elements must be added this way.\n             *\n             * @sample highcharts/members/renderer-g\n             *         Elements added to a group\n             *\n             * @function Highcharts.SVGElement#add\n             *\n             * @param {Highcharts.SVGElement} [parent]\n             *        The parent item to add it to. If undefined, the element is added\n             *        to the {@link Highcharts.SVGRenderer.box}.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.add = function (parent) {\n                var renderer = this.renderer,\n                    element = this.element,\n                    inserted;\n                if (parent) {\n                    this.parentGroup = parent;\n                }\n                // Mark as inverted\n                this.parentInverted = parent && parent.inverted;\n                // Build formatted text\n                if (typeof this.textStr !== 'undefined' &&\n                    this.element.nodeName === 'text' // Not for SVGLabel instances\n                ) {\n                    renderer.buildText(this);\n                }\n                // Mark as added\n                this.added = true;\n                // If we're adding to renderer root, or other elements in the group\n                // have a z index, we need to handle it\n                if (!parent || parent.handleZ || this.zIndex) {\n                    inserted = this.zIndexSetter();\n                }\n                // If zIndex is not handled, append at the end\n                if (!inserted) {\n                    (parent ?\n                        parent.element :\n                        renderer.box).appendChild(element);\n                }\n                // fire an event for internal hooks\n                if (this.onAdd) {\n                    this.onAdd();\n                }\n                return this;\n            };\n            /**\n             * Add a class name to an element.\n             *\n             * @function Highcharts.SVGElement#addClass\n             *\n             * @param {string} className\n             * The new class name to add.\n             *\n             * @param {boolean} [replace=false]\n             * When true, the existing class name(s) will be overwritten with the new\n             * one. When false, the new one is added.\n             *\n             * @return {Highcharts.SVGElement}\n             * Return the SVG element for chainability.\n             */\n            SVGElement.prototype.addClass = function (className, replace) {\n                var currentClassName = replace ? '' : (this.attr('class') || '');\n                // Trim the string and remove duplicates\n                className = (className || '')\n                    .split(/ /g)\n                    .reduce(function (newClassName, name) {\n                    if (currentClassName.indexOf(name) === -1) {\n                        newClassName.push(name);\n                    }\n                    return newClassName;\n                }, (currentClassName ?\n                    [currentClassName] :\n                    []))\n                    .join(' ');\n                if (className !== currentClassName) {\n                    this.attr('class', className);\n                }\n                return this;\n            };\n            /**\n             * This method is executed in the end of `attr()`, after setting all\n             * attributes in the hash. In can be used to efficiently consolidate\n             * multiple attributes in one SVG property -- e.g., translate, rotate and\n             * scale are merged in one \"transform\" attribute in the SVG node.\n             *\n             * @private\n             * @function Highcharts.SVGElement#afterSetters\n             */\n            SVGElement.prototype.afterSetters = function () {\n                // Update transform. Do this outside the loop to prevent redundant\n                // updating for batch setting of attributes.\n                if (this.doTransform) {\n                    this.updateTransform();\n                    this.doTransform = false;\n                }\n            };\n            /**\n             * Align the element relative to the chart or another box.\n             *\n             * @function Highcharts.SVGElement#align\n             *\n             * @param {Highcharts.AlignObject} [alignOptions]\n             *        The alignment options. The function can be called without this\n             *        parameter in order to re-align an element after the box has been\n             *        updated.\n             *\n             * @param {boolean} [alignByTranslate]\n             *        Align element by translation.\n             *\n             * @param {string|Highcharts.BBoxObject} [box]\n             *        The box to align to, needs a width and height. When the box is a\n             *        string, it refers to an object in the Renderer. For example, when\n             *        box is `spacingBox`, it refers to `Renderer.spacingBox` which\n             *        holds `width`, `height`, `x` and `y` properties.\n             *\n             * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.align = function (alignOptions, alignByTranslate, box) {\n                var align,\n                    vAlign,\n                    x,\n                    y,\n                    attribs = {},\n                    alignTo,\n                    renderer = this.renderer,\n                    alignedObjects = renderer.alignedObjects,\n                    alignFactor,\n                    vAlignFactor;\n                // First call on instanciate\n                if (alignOptions) {\n                    this.alignOptions = alignOptions;\n                    this.alignByTranslate = alignByTranslate;\n                    if (!box || isString(box)) {\n                        this.alignTo = alignTo = box || 'renderer';\n                        // prevent duplicates, like legendGroup after resize\n                        erase(alignedObjects, this);\n                        alignedObjects.push(this);\n                        box = void 0; // reassign it below\n                    }\n                    // When called on resize, no arguments are supplied\n                }\n                else {\n                    alignOptions = this.alignOptions;\n                    alignByTranslate = this.alignByTranslate;\n                    alignTo = this.alignTo;\n                }\n                box = pick(box, renderer[alignTo], renderer);\n                // Assign variables\n                align = alignOptions.align;\n                vAlign = alignOptions.verticalAlign;\n                // default: left align\n                x = (box.x || 0) + (alignOptions.x || 0);\n                // default: top align\n                y = (box.y || 0) + (alignOptions.y || 0);\n                // Align\n                if (align === 'right') {\n                    alignFactor = 1;\n                }\n                else if (align === 'center') {\n                    alignFactor = 2;\n                }\n                if (alignFactor) {\n                    x += (box.width - (alignOptions.width || 0)) /\n                        alignFactor;\n                }\n                attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n                // Vertical align\n                if (vAlign === 'bottom') {\n                    vAlignFactor = 1;\n                }\n                else if (vAlign === 'middle') {\n                    vAlignFactor = 2;\n                }\n                if (vAlignFactor) {\n                    y += (box.height - (alignOptions.height || 0)) /\n                        vAlignFactor;\n                }\n                attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n                // Animate only if already placed\n                this[this.placed ? 'animate' : 'attr'](attribs);\n                this.placed = true;\n                this.alignAttr = attribs;\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#alignSetter\n             * @param {\"left\"|\"center\"|\"right\"} value\n             */\n            SVGElement.prototype.alignSetter = function (value) {\n                var convert = {\n                        left: 'start',\n                        center: 'middle',\n                        right: 'end'\n                    };\n                if (convert[value]) {\n                    this.alignValue = value;\n                    this.element.setAttribute('text-anchor', convert[value]);\n                }\n            };\n            /**\n             * Animate to given attributes or CSS properties.\n             *\n             * @sample highcharts/members/element-on/\n             *         Setting some attributes by animation\n             *\n             * @function Highcharts.SVGElement#animate\n             *\n             * @param {Highcharts.SVGAttributes} params\n             *        SVG attributes or CSS to animate.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [options]\n             *        Animation options.\n             *\n             * @param {Function} [complete]\n             *        Function to perform at the end of animation.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.animate = function (params, options, complete) {\n                var animOptions = animObject(pick(options,\n                    this.renderer.globalAnimation,\n                    true));\n                // When the page is hidden save resources in the background by not\n                // running animation at all (#9749).\n                if (pick(doc.hidden, doc.msHidden, doc.webkitHidden, false)) {\n                    animOptions.duration = 0;\n                }\n                if (animOptions.duration !== 0) {\n                    // allows using a callback with the global animation without\n                    // overwriting it\n                    if (complete) {\n                        animOptions.complete = complete;\n                    }\n                    animate(this, params, animOptions);\n                }\n                else {\n                    this.attr(params, void 0, complete);\n                    // Call the end step synchronously\n                    objectEach(params, function (val, prop) {\n                        if (animOptions.step) {\n                            animOptions.step.call(this, val, { prop: prop, pos: 1 });\n                        }\n                    }, this);\n                }\n                return this;\n            };\n            /**\n             * Apply a text outline through a custom CSS property, by copying the text\n             * element and apply stroke to the copy. Used internally. Contrast checks at\n             * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n             *\n             * @example\n             * // Specific color\n             * text.css({\n             *    textOutline: '1px black'\n             * });\n             * // Automatic contrast\n             * text.css({\n             *    color: '#000000', // black text\n             *    textOutline: '1px contrast' // => white outline\n             * });\n             *\n             * @private\n             * @function Highcharts.SVGElement#applyTextOutline\n             *\n             * @param {string} textOutline\n             *        A custom CSS `text-outline` setting, defined by `width color`.\n             */\n            SVGElement.prototype.applyTextOutline = function (textOutline) {\n                var elem = this.element,\n                    tspans,\n                    hasContrast = textOutline.indexOf('contrast') !== -1,\n                    styles = {},\n                    color,\n                    strokeWidth,\n                    firstRealChild;\n                // When the text shadow is set to contrast, use dark stroke for light\n                // text and vice versa.\n                if (hasContrast) {\n                    styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n                }\n                // Extract the stroke width and color\n                textOutline = textOutline.split(' ');\n                color = textOutline[textOutline.length - 1];\n                strokeWidth = textOutline[0];\n                if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n                    this.fakeTS = true; // Fake text shadow\n                    tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n                    // In order to get the right y position of the clone,\n                    // copy over the y setter\n                    this.ySetter = this.xSetter;\n                    // Since the stroke is applied on center of the actual outline, we\n                    // need to double it to get the correct stroke-width outside the\n                    // glyphs.\n                    strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n                        return (2 * digit) + unit;\n                    });\n                    // Remove shadows from previous runs.\n                    this.removeTextOutline(tspans);\n                    // Check if the element contains RTL characters.\n                    // Comparing against Hebrew and Arabic characters,\n                    // excluding Arabic digits. Source:\n                    // https://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt\n                    var isRTL_1 = elem.textContent ?\n                            /^[\\u0591-\\u065F\\u066A-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC]/\n                                .test(elem.textContent) : false;\n                    // For each of the tspans, create a stroked copy behind it.\n                    firstRealChild = elem.firstChild;\n                    tspans.forEach(function (tspan, y) {\n                        var clone;\n                        // Let the first line start at the correct X position\n                        if (y === 0) {\n                            tspan.setAttribute('x', elem.getAttribute('x'));\n                            y = elem.getAttribute('y');\n                            tspan.setAttribute('y', y || 0);\n                            if (y === null) {\n                                elem.setAttribute('y', 0);\n                            }\n                        }\n                        // Create the clone and apply outline properties.\n                        // For RTL elements apply outline properties for orginal element\n                        // to prevent outline from overlapping the text.\n                        // For RTL in Firefox keep the orginal order (#10162).\n                        clone = tspan.cloneNode(true);\n                        attr((isRTL_1 && !isFirefox) ? tspan : clone, {\n                            'class': 'highcharts-text-outline',\n                            fill: color,\n                            stroke: color,\n                            'stroke-width': strokeWidth,\n                            'stroke-linejoin': 'round'\n                        });\n                        elem.insertBefore(clone, firstRealChild);\n                    });\n                    // Create a whitespace between tspan and clone,\n                    // to fix the display of Arabic characters in Firefox.\n                    if (isRTL_1 && isFirefox && tspans[0]) {\n                        var whitespace = tspans[0].cloneNode(true);\n                        whitespace.textContent = ' ';\n                        elem.insertBefore(whitespace, firstRealChild);\n                    }\n                }\n            };\n            /**\n             * @function Highcharts.SVGElement#attr\n             * @param {string} key\n             * @return {number|string}\n             */ /**\n            * Apply native and custom attributes to the SVG elements.\n            *\n            * In order to set the rotation center for rotation, set x and y to 0 and\n            * use `translateX` and `translateY` attributes to position the element\n            * instead.\n            *\n            * Attributes frequently used in Highcharts are `fill`, `stroke`,\n            * `stroke-width`.\n            *\n            * @sample highcharts/members/renderer-rect/\n            *         Setting some attributes\n            *\n            * @example\n            * // Set multiple attributes\n            * element.attr({\n            *     stroke: 'red',\n            *     fill: 'blue',\n            *     x: 10,\n            *     y: 10\n            * });\n            *\n            * // Set a single attribute\n            * element.attr('stroke', 'red');\n            *\n            * // Get an attribute\n            * element.attr('stroke'); // => 'red'\n            *\n            * @function Highcharts.SVGElement#attr\n            *\n            * @param {string|Highcharts.SVGAttributes} [hash]\n            *        The native and custom SVG attributes.\n            *\n            * @param {number|string|Highcharts.SVGPathArray} [val]\n            *        If the type of the first argument is `string`, the second can be a\n            *        value, which will serve as a single attribute setter. If the first\n            *        argument is a string and the second is undefined, the function\n            *        serves as a getter and the current value of the property is\n            *        returned.\n            *\n            * @param {Function} [complete]\n            *        A callback function to execute after setting the attributes. This\n            *        makes the function compliant and interchangeable with the\n            *        {@link SVGElement#animate} function.\n            *\n            * @param {boolean} [continueAnimation=true]\n            *        Used internally when `.attr` is called as part of an animation\n            *        step. Otherwise, calling `.attr` for an attribute will stop\n            *        animation for that attribute.\n            *\n            * @return {Highcharts.SVGElement}\n            *         If used as a setter, it returns the current\n            *         {@link Highcharts.SVGElement} so the calls can be chained. If\n            *         used as a getter, the current value of the attribute is returned.\n            */\n            SVGElement.prototype.attr = function (hash, val, complete, continueAnimation) {\n                var key,\n                    element = this.element,\n                    hasSetSymbolSize,\n                    ret = this,\n                    skipAttr,\n                    setter,\n                    symbolCustomAttribs = this.symbolCustomAttribs;\n                // single key-value pair\n                if (typeof hash === 'string' && typeof val !== 'undefined') {\n                    key = hash;\n                    hash = {};\n                    hash[key] = val;\n                }\n                // used as a getter: first argument is a string, second is undefined\n                if (typeof hash === 'string') {\n                    ret = (this[hash + 'Getter'] ||\n                        this._defaultGetter).call(this, hash, element);\n                    // setter\n                }\n                else {\n                    objectEach(hash, function eachAttribute(val, key) {\n                        skipAttr = false;\n                        // Unless .attr is from the animator update, stop current\n                        // running animation of this property\n                        if (!continueAnimation) {\n                            stop(this, key);\n                        }\n                        // Special handling of symbol attributes\n                        if (this.symbolName &&\n                            symbolCustomAttribs.indexOf(key) !== -1) {\n                            if (!hasSetSymbolSize) {\n                                this.symbolAttr(hash);\n                                hasSetSymbolSize = true;\n                            }\n                            skipAttr = true;\n                        }\n                        if (this.rotation && (key === 'x' || key === 'y')) {\n                            this.doTransform = true;\n                        }\n                        if (!skipAttr) {\n                            setter = (this[key + 'Setter'] ||\n                                this._defaultSetter);\n                            setter.call(this, val, key, element);\n                            // Let the shadow follow the main element\n                            if (!this.styledMode &&\n                                this.shadows &&\n                                /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n                                this.updateShadows(key, val, setter);\n                            }\n                        }\n                    }, this);\n                    this.afterSetters();\n                }\n                // In accordance with animate, run a complete callback\n                if (complete) {\n                    complete.call(this);\n                }\n                return ret;\n            };\n            /**\n             * Apply a clipping rectangle to this element.\n             *\n             * @function Highcharts.SVGElement#clip\n             *\n             * @param {Highcharts.ClipRectElement} [clipRect]\n             *        The clipping rectangle. If skipped, the current clip is removed.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVG element to allow chaining.\n             */\n            SVGElement.prototype.clip = function (clipRect) {\n                return this.attr('clip-path', clipRect ?\n                    'url(' + this.renderer.url + '#' + clipRect.id + ')' :\n                    'none');\n            };\n            /**\n             * Calculate the coordinates needed for drawing a rectangle crisply and\n             * return the calculated attributes.\n             *\n             * @function Highcharts.SVGElement#crisp\n             *\n             * @param {Highcharts.RectangleObject} rect\n             * Rectangle to crisp.\n             *\n             * @param {number} [strokeWidth]\n             * The stroke width to consider when computing crisp positioning. It can\n             * also be set directly on the rect parameter.\n             *\n             * @return {Highcharts.RectangleObject}\n             * The modified rectangle arguments.\n             */\n            SVGElement.prototype.crisp = function (rect, strokeWidth) {\n                var wrapper = this,\n                    normalizer;\n                strokeWidth = strokeWidth || rect.strokeWidth || 0;\n                // Math.round because strokeWidth can sometimes have roundoff errors\n                normalizer = Math.round(strokeWidth) % 2 / 2;\n                // normalize for crisp edges\n                rect.x = Math.floor(rect.x || wrapper.x || 0) + normalizer;\n                rect.y = Math.floor(rect.y || wrapper.y || 0) + normalizer;\n                rect.width = Math.floor((rect.width || wrapper.width || 0) - 2 * normalizer);\n                rect.height = Math.floor((rect.height || wrapper.height || 0) - 2 * normalizer);\n                if (defined(rect.strokeWidth)) {\n                    rect.strokeWidth = strokeWidth;\n                }\n                return rect;\n            };\n            /**\n             * Build and apply an SVG gradient out of a common JavaScript configuration\n             * object. This function is called from the attribute setters. An event\n             * hook is added for supporting other complex color types.\n             *\n             * @private\n             * @function Highcharts.SVGElement#complexColor\n             *\n             * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n             * The gradient or pattern options structure.\n             *\n             * @param {string} prop\n             * The property to apply, can either be `fill` or `stroke`.\n             *\n             * @param {Highcharts.SVGDOMElement} elem\n             * SVG element to apply the gradient on.\n             */\n            SVGElement.prototype.complexColor = function (colorOptions, prop, elem) {\n                var renderer = this.renderer,\n                    colorObject,\n                    gradName,\n                    gradAttr,\n                    radAttr,\n                    gradients,\n                    stops,\n                    stopColor,\n                    stopOpacity,\n                    radialReference,\n                    id,\n                    key = [],\n                    value;\n                fireEvent(this.renderer, 'complexColor', {\n                    args: arguments\n                }, function () {\n                    // Apply linear or radial gradients\n                    if (colorOptions.radialGradient) {\n                        gradName = 'radialGradient';\n                    }\n                    else if (colorOptions.linearGradient) {\n                        gradName = 'linearGradient';\n                    }\n                    if (gradName) {\n                        gradAttr = colorOptions[gradName];\n                        gradients = renderer.gradients;\n                        stops = colorOptions.stops;\n                        radialReference = elem.radialReference;\n                        // Keep < 2.2 kompatibility\n                        if (isArray(gradAttr)) {\n                            colorOptions[gradName] = gradAttr = {\n                                x1: gradAttr[0],\n                                y1: gradAttr[1],\n                                x2: gradAttr[2],\n                                y2: gradAttr[3],\n                                gradientUnits: 'userSpaceOnUse'\n                            };\n                        }\n                        // Correct the radial gradient for the radial reference system\n                        if (gradName === 'radialGradient' &&\n                            radialReference &&\n                            !defined(gradAttr.gradientUnits)) {\n                            // Save the radial attributes for updating\n                            radAttr = gradAttr;\n                            gradAttr = merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n                        }\n                        // Build the unique key to detect whether we need to create a\n                        // new element (#1282)\n                        objectEach(gradAttr, function (val, n) {\n                            if (n !== 'id') {\n                                key.push(n, val);\n                            }\n                        });\n                        objectEach(stops, function (val) {\n                            key.push(val);\n                        });\n                        key = key.join(',');\n                        // Check if a gradient object with the same config object is\n                        // created within this renderer\n                        if (gradients[key]) {\n                            id = gradients[key].attr('id');\n                        }\n                        else {\n                            // Set the id and create the element\n                            gradAttr.id = id = uniqueKey();\n                            var gradientObject_1 = gradients[key] =\n                                    renderer.createElement(gradName)\n                                        .attr(gradAttr)\n                                        .add(renderer.defs);\n                            gradientObject_1.radAttr = radAttr;\n                            // The gradient needs to keep a list of stops to be able to\n                            // destroy them\n                            gradientObject_1.stops = [];\n                            stops.forEach(function (stop) {\n                                var stopObject;\n                                if (stop[1].indexOf('rgba') === 0) {\n                                    colorObject = Color.parse(stop[1]);\n                                    stopColor = colorObject.get('rgb');\n                                    stopOpacity = colorObject.get('a');\n                                }\n                                else {\n                                    stopColor = stop[1];\n                                    stopOpacity = 1;\n                                }\n                                stopObject = renderer.createElement('stop').attr({\n                                    offset: stop[0],\n                                    'stop-color': stopColor,\n                                    'stop-opacity': stopOpacity\n                                }).add(gradientObject_1);\n                                // Add the stop element to the gradient\n                                gradientObject_1.stops.push(stopObject);\n                            });\n                        }\n                        // Set the reference to the gradient object\n                        value = 'url(' + renderer.url + '#' + id + ')';\n                        elem.setAttribute(prop, value);\n                        elem.gradient = key;\n                        // Allow the color to be concatenated into tooltips formatters\n                        // etc. (#2995)\n                        colorOptions.toString = function () {\n                            return value;\n                        };\n                    }\n                });\n            };\n            /**\n             * Set styles for the element. In addition to CSS styles supported by\n             * native SVG and HTML elements, there are also some custom made for\n             * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n             * elements.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Styled text\n             *\n             * @function Highcharts.SVGElement#css\n             *\n             * @param {Highcharts.CSSObject} styles\n             *        The new CSS styles.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Return the SVG element for chaining.\n             */\n            SVGElement.prototype.css = function (styles) {\n                var oldStyles = this.styles, newStyles = {}, elem = this.element, textWidth, serializedCss = '', hyphenate, hasNew = !oldStyles, \n                    // These CSS properties are interpreted internally by the SVG\n                    // renderer, but are not supported by SVG and should not be added to\n                    // the DOM. In styled mode, no CSS should find its way to the DOM\n                    // whatsoever (#6173, #6474).\n                    svgPseudoProps = ['textOutline', 'textOverflow', 'width'];\n                // convert legacy\n                if (styles && styles.color) {\n                    styles.fill = styles.color;\n                }\n                // Filter out existing styles to increase performance (#2640)\n                if (oldStyles) {\n                    objectEach(styles, function (style, n) {\n                        if (oldStyles && oldStyles[n] !== style) {\n                            newStyles[n] = style;\n                            hasNew = true;\n                        }\n                    });\n                }\n                if (hasNew) {\n                    // Merge the new styles with the old ones\n                    if (oldStyles) {\n                        styles = extend(oldStyles, newStyles);\n                    }\n                    // Get the text width from style\n                    if (styles) {\n                        // Previously set, unset it (#8234)\n                        if (styles.width === null || styles.width === 'auto') {\n                            delete this.textWidth;\n                            // Apply new\n                        }\n                        else if (elem.nodeName.toLowerCase() === 'text' &&\n                            styles.width) {\n                            textWidth = this.textWidth = pInt(styles.width);\n                        }\n                    }\n                    // store object\n                    this.styles = styles;\n                    if (textWidth && (!svg && this.renderer.forExport)) {\n                        delete styles.width;\n                    }\n                    // Serialize and set style attribute\n                    if (elem.namespaceURI === this.SVG_NS) { // #7633\n                        hyphenate = function (a, b) {\n                            return '-' + b.toLowerCase();\n                        };\n                        objectEach(styles, function (style, n) {\n                            if (svgPseudoProps.indexOf(n) === -1) {\n                                serializedCss +=\n                                    n.replace(/([A-Z])/g, hyphenate) + ':' +\n                                        style + ';';\n                            }\n                        });\n                        if (serializedCss) {\n                            attr(elem, 'style', serializedCss); // #1881\n                        }\n                    }\n                    else {\n                        css(elem, styles);\n                    }\n                    if (this.added) {\n                        // Rebuild text after added. Cache mechanisms in the buildText\n                        // will prevent building if there are no significant changes.\n                        if (this.element.nodeName === 'text') {\n                            this.renderer.buildText(this);\n                        }\n                        // Apply text outline after added\n                        if (styles && styles.textOutline) {\n                            this.applyTextOutline(styles.textOutline);\n                        }\n                    }\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#dashstyleSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.dashstyleSetter = function (value) {\n                var i,\n                    strokeWidth = this['stroke-width'];\n                // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n                // strokeWidth function, we should be able to use that instead.\n                if (strokeWidth === 'inherit') {\n                    strokeWidth = 1;\n                }\n                value = value && value.toLowerCase();\n                if (value) {\n                    var v = value\n                            .replace('shortdashdotdot', '3,1,1,1,1,1,')\n                            .replace('shortdashdot', '3,1,1,1')\n                            .replace('shortdot', '1,1,')\n                            .replace('shortdash', '3,1,')\n                            .replace('longdash', '8,3,')\n                            .replace(/dot/g, '1,3,')\n                            .replace('dash', '4,3,')\n                            .replace(/,$/, '')\n                            .split(','); // ending comma\n                        i = v.length;\n                    while (i--) {\n                        v[i] = '' + (pInt(v[i]) * pick(strokeWidth, NaN));\n                    }\n                    value = v.join(',').replace(/NaN/g, 'none'); // #3226\n                    this.element.setAttribute('stroke-dasharray', value);\n                }\n            };\n            /**\n             * Destroy the element and element wrapper and clear up the DOM and event\n             * hooks.\n             *\n             * @function Highcharts.SVGElement#destroy\n             */\n            SVGElement.prototype.destroy = function () {\n                var wrapper = this,\n                    element = wrapper.element || {},\n                    renderer = wrapper.renderer,\n                    parentToClean = (renderer.isSVG &&\n                        element.nodeName === 'SPAN' &&\n                        wrapper.parentGroup ||\n                        void 0),\n                    grandParent,\n                    ownerSVGElement = element.ownerSVGElement,\n                    i;\n                // remove events\n                element.onclick = element.onmouseout = element.onmouseover =\n                    element.onmousemove = element.point = null;\n                stop(wrapper); // stop running animations\n                if (wrapper.clipPath && ownerSVGElement) {\n                    var clipPath_1 = wrapper.clipPath;\n                    // Look for existing references to this clipPath and remove them\n                    // before destroying the element (#6196).\n                    // The upper case version is for Edge\n                    [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n                        var clipPathAttr = el.getAttribute('clip-path');\n                        if (clipPathAttr.indexOf(clipPath_1.element.id) > -1) {\n                            el.removeAttribute('clip-path');\n                        }\n                    });\n                    wrapper.clipPath = clipPath_1.destroy();\n                }\n                // Destroy stops in case this is a gradient object @todo old code?\n                if (wrapper.stops) {\n                    for (i = 0; i < wrapper.stops.length; i++) {\n                        wrapper.stops[i].destroy();\n                    }\n                    wrapper.stops.length = 0;\n                    wrapper.stops = void 0;\n                }\n                // remove element\n                wrapper.safeRemoveChild(element);\n                if (!renderer.styledMode) {\n                    wrapper.destroyShadows();\n                }\n                // In case of useHTML, clean up empty containers emulating SVG groups\n                // (#1960, #2393, #2697).\n                while (parentToClean &&\n                    parentToClean.div &&\n                    parentToClean.div.childNodes.length === 0) {\n                    grandParent = parentToClean.parentGroup;\n                    wrapper.safeRemoveChild(parentToClean.div);\n                    delete parentToClean.div;\n                    parentToClean = grandParent;\n                }\n                // remove from alignObjects\n                if (wrapper.alignTo) {\n                    erase(renderer.alignedObjects, wrapper);\n                }\n                objectEach(wrapper, function (val, key) {\n                    // Destroy child elements of a group\n                    if (wrapper[key] &&\n                        wrapper[key].parentGroup === wrapper &&\n                        wrapper[key].destroy) {\n                        wrapper[key].destroy();\n                    }\n                    // Delete all properties\n                    delete wrapper[key];\n                });\n                return;\n            };\n            /**\n             * Destroy shadows on the element.\n             *\n             * @private\n             * @function Highcharts.SVGElement#destroyShadows\n             *\n             * @return {void}\n             */\n            SVGElement.prototype.destroyShadows = function () {\n                (this.shadows || []).forEach(function (shadow) {\n                    this.safeRemoveChild(shadow);\n                }, this);\n                this.shadows = void 0;\n            };\n            /**\n             * @private\n             */\n            SVGElement.prototype.destroyTextPath = function (elem, path) {\n                var textElement = elem.getElementsByTagName('text')[0];\n                var tspans;\n                if (textElement) {\n                    // Remove textPath attributes\n                    textElement.removeAttribute('dx');\n                    textElement.removeAttribute('dy');\n                    // Remove ID's:\n                    path.element.setAttribute('id', '');\n                    // Check if textElement includes textPath,\n                    if (this.textPathWrapper &&\n                        textElement.getElementsByTagName('textPath').length) {\n                        // Move nodes to <text>\n                        tspans = this.textPathWrapper.element.childNodes;\n                        // Now move all <tspan>'s to the <textPath> node\n                        while (tspans.length) {\n                            textElement.appendChild(tspans[0]);\n                        }\n                        // Remove <textPath> from the DOM\n                        textElement.removeChild(this.textPathWrapper.element);\n                    }\n                }\n                else if (elem.getAttribute('dx') || elem.getAttribute('dy')) {\n                    // Remove textPath attributes from elem\n                    // to get correct text-outline position\n                    elem.removeAttribute('dx');\n                    elem.removeAttribute('dy');\n                }\n                if (this.textPathWrapper) {\n                    // Set textPathWrapper to undefined and destroy it\n                    this.textPathWrapper = this.textPathWrapper.destroy();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#dSettter\n             * @param {number|string|Highcharts.SVGPathArray} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.dSetter = function (value, key, element) {\n                if (isArray(value)) {\n                    // Backwards compatibility, convert one-dimensional array into an\n                    // array of segments\n                    if (typeof value[0] === 'string') {\n                        value = this.renderer.pathToSegments(value);\n                    }\n                    this.pathArray = value;\n                    value = value.reduce(function (acc, seg, i) {\n                        if (!seg || !seg.join) {\n                            return (seg || '').toString();\n                        }\n                        return (i ? acc + ' ' : '') + seg.join(' ');\n                    }, '');\n                }\n                if (/(NaN| {2}|^$)/.test(value)) {\n                    value = 'M 0 0';\n                }\n                // Check for cache before resetting. Resetting causes disturbance in the\n                // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n                // possible performance gain.\n                if (this[key] !== value) {\n                    element.setAttribute(key, value);\n                    this[key] = value;\n                }\n            };\n            /**\n             * Fade out an element by animating its opacity down to 0, and hide it on\n             * complete. Used internally for the tooltip.\n             *\n             * @function Highcharts.SVGElement#fadeOut\n             *\n             * @param {number} [duration=150]\n             * The fade duration in milliseconds.\n             */\n            SVGElement.prototype.fadeOut = function (duration) {\n                var elemWrapper = this;\n                elemWrapper.animate({\n                    opacity: 0\n                }, {\n                    duration: pick(duration, 150),\n                    complete: function () {\n                        // #3088, assuming we're only using this for tooltips\n                        elemWrapper.attr({ y: -9999 }).hide();\n                    }\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#fillSetter\n             * @param {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.fillSetter = function (value, key, element) {\n                if (typeof value === 'string') {\n                    element.setAttribute(key, value);\n                }\n                else if (value) {\n                    this.complexColor(value, key, element);\n                }\n            };\n            /**\n             * Get the bounding box (width, height, x and y) for the element. Generally\n             * used to get rendered text size. Since this is called a lot in charts,\n             * the results are cached based on text properties, in order to save DOM\n             * traffic. The returned bounding box includes the rotation, so for example\n             * a single text line of rotation 90 will report a greater height, and a\n             * width corresponding to the line-height.\n             *\n             * @sample highcharts/members/renderer-on-chart/\n             *         Draw a rectangle based on a text's bounding box\n             *\n             * @function Highcharts.SVGElement#getBBox\n             *\n             * @param {boolean} [reload]\n             *        Skip the cache and get the updated DOM bouding box.\n             *\n             * @param {number} [rot]\n             *        Override the element's rotation. This is internally used on axis\n             *        labels with a value of 0 to find out what the bounding box would\n             *        be have been if it were not rotated.\n             *\n             * @return {Highcharts.BBoxObject}\n             *         The bounding box with `x`, `y`, `width` and `height` properties.\n             */\n            SVGElement.prototype.getBBox = function (reload, rot) {\n                var wrapper = this,\n                    bBox, // = wrapper.bBox,\n                    renderer = wrapper.renderer,\n                    width,\n                    height,\n                    element = wrapper.element,\n                    styles = wrapper.styles,\n                    fontSize,\n                    textStr = wrapper.textStr,\n                    toggleTextShadowShim,\n                    cache = renderer.cache,\n                    cacheKeys = renderer.cacheKeys,\n                    isSVG = element.namespaceURI === wrapper.SVG_NS,\n                    cacheKey;\n                var rotation = pick(rot,\n                    wrapper.rotation, 0);\n                fontSize = renderer.styledMode ? (element &&\n                    SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles && styles.fontSize);\n                // Avoid undefined and null (#7316)\n                if (defined(textStr)) {\n                    cacheKey = textStr.toString();\n                    // Since numbers are monospaced, and numerical labels appear a lot\n                    // in a chart, we assume that a label of n characters has the same\n                    // bounding box as others of the same length. Unless there is inner\n                    // HTML in the label. In that case, leave the numbers as is (#5899).\n                    if (cacheKey.indexOf('<') === -1) {\n                        cacheKey = cacheKey.replace(/[0-9]/g, '0');\n                    }\n                    // Properties that affect bounding box\n                    cacheKey += [\n                        '',\n                        rotation,\n                        fontSize,\n                        wrapper.textWidth,\n                        styles && styles.textOverflow,\n                        styles && styles.fontWeight // #12163\n                    ].join(',');\n                }\n                if (cacheKey && !reload) {\n                    bBox = cache[cacheKey];\n                }\n                // No cache found\n                if (!bBox) {\n                    // SVG elements\n                    if (isSVG || renderer.forExport) {\n                        try { // Fails in Firefox if the container has display: none.\n                            // When the text shadow shim is used, we need to hide the\n                            // fake shadows to get the correct bounding box (#3872)\n                            toggleTextShadowShim = this.fakeTS && function (display) {\n                                [].forEach.call(element.querySelectorAll('.highcharts-text-outline'), function (tspan) {\n                                    tspan.style.display = display;\n                                });\n                            };\n                            // Workaround for #3842, Firefox reporting wrong bounding\n                            // box for shadows\n                            if (isFunction(toggleTextShadowShim)) {\n                                toggleTextShadowShim('none');\n                            }\n                            bBox = element.getBBox ?\n                                // SVG: use extend because IE9 is not allowed to change\n                                // width and height in case of rotation (below)\n                                extend({}, element.getBBox()) : {\n                                // Legacy IE in export mode\n                                width: element.offsetWidth,\n                                height: element.offsetHeight\n                            };\n                            // #3842\n                            if (isFunction(toggleTextShadowShim)) {\n                                toggleTextShadowShim('');\n                            }\n                        }\n                        catch (e) {\n                            '';\n                        }\n                        // If the bBox is not set, the try-catch block above failed. The\n                        // other condition is for Opera that returns a width of\n                        // -Infinity on hidden elements.\n                        if (!bBox || bBox.width < 0) {\n                            bBox = { width: 0, height: 0 };\n                        }\n                        // VML Renderer or useHTML within SVG\n                    }\n                    else {\n                        bBox = wrapper.htmlGetBBox();\n                    }\n                    // True SVG elements as well as HTML elements in modern browsers\n                    // using the .useHTML option need to compensated for rotation\n                    if (renderer.isSVG) {\n                        width = bBox.width;\n                        height = bBox.height;\n                        // Workaround for wrong bounding box in IE, Edge and Chrome on\n                        // Windows. With Highcharts' default font, IE and Edge report\n                        // a box height of 16.899 and Chrome rounds it to 17. If this\n                        // stands uncorrected, it results in more padding added below\n                        // the text than above when adding a label border or background.\n                        // Also vertical positioning is affected.\n                        // https://jsfiddle.net/highcharts/em37nvuj/\n                        // (#1101, #1505, #1669, #2568, #6213).\n                        if (isSVG) {\n                            bBox.height = height = ({\n                                '11px,17': 14,\n                                '13px,20': 16\n                            }[styles &&\n                                styles.fontSize + ',' + Math.round(height)] ||\n                                height);\n                        }\n                        // Adjust for rotated text\n                        if (rotation) {\n                            var rad = rotation * deg2rad;\n                            bBox.width = Math.abs(height * Math.sin(rad)) +\n                                Math.abs(width * Math.cos(rad));\n                            bBox.height = Math.abs(height * Math.cos(rad)) +\n                                Math.abs(width * Math.sin(rad));\n                        }\n                    }\n                    // Cache it. When loading a chart in a hidden iframe in Firefox and\n                    // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n                    if (cacheKey && bBox.height > 0) {\n                        // Rotate (#4681)\n                        while (cacheKeys.length > 250) {\n                            delete cache[cacheKeys.shift()];\n                        }\n                        if (!cache[cacheKey]) {\n                            cacheKeys.push(cacheKey);\n                        }\n                        cache[cacheKey] = bBox;\n                    }\n                }\n                return bBox;\n            };\n            /**\n             * Get the computed style. Only in styled mode.\n             *\n             * @example\n             * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n             *\n             * @function Highcharts.SVGElement#getStyle\n             *\n             * @param {string} prop\n             *        The property name to check for.\n             *\n             * @return {string}\n             *         The current computed value.\n             */\n            SVGElement.prototype.getStyle = function (prop) {\n                return win\n                    .getComputedStyle(this.element || this, '')\n                    .getPropertyValue(prop);\n            };\n            /**\n             * Check if an element has the given class name.\n             *\n             * @function Highcharts.SVGElement#hasClass\n             *\n             * @param {string} className\n             * The class name to check for.\n             *\n             * @return {boolean}\n             * Whether the class name is found.\n             */\n            SVGElement.prototype.hasClass = function (className) {\n                return ('' + this.attr('class'))\n                    .split(' ')\n                    .indexOf(className) !== -1;\n            };\n            /**\n             * Hide the element, similar to setting the `visibility` attribute to\n             * `hidden`.\n             *\n             * @function Highcharts.SVGElement#hide\n             *\n             * @param {boolean} [hideByTranslation=false]\n             *        The flag to determine if element should be hidden by moving out\n             *        of the viewport. Used for example for dataLabels.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.hide = function (hideByTranslation) {\n                if (hideByTranslation) {\n                    this.attr({ y: -9999 });\n                }\n                else {\n                    this.attr({ visibility: 'hidden' });\n                }\n                return this;\n            };\n            /**\n             * @private\n             */\n            SVGElement.prototype.htmlGetBBox = function () {\n                return { height: 0, width: 0, x: 0, y: 0 };\n            };\n            /**\n             * Initialize the SVG element. This function only exists to make the\n             * initialization process overridable. It should not be called directly.\n             *\n             * @function Highcharts.SVGElement#init\n             *\n             * @param {Highcharts.SVGRenderer} renderer\n             * The SVGRenderer instance to initialize to.\n             *\n             * @param {string} nodeName\n             * The SVG node name.\n             */\n            SVGElement.prototype.init = function (renderer, nodeName) {\n                /**\n                 * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n                 * node, but may also represent more nodes.\n                 *\n                 * @name Highcharts.SVGElement#element\n                 * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n                 */\n                this.element = nodeName === 'span' ?\n                    createElement(nodeName) :\n                    doc.createElementNS(this.SVG_NS, nodeName);\n                /**\n                 * The renderer that the SVGElement belongs to.\n                 *\n                 * @name Highcharts.SVGElement#renderer\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                this.renderer = renderer;\n                fireEvent(this, 'afterInit');\n            };\n            /**\n             * Invert a group, rotate and flip. This is used internally on inverted\n             * charts, where the points and graphs are drawn as if not inverted, then\n             * the series group elements are inverted.\n             *\n             * @function Highcharts.SVGElement#invert\n             *\n             * @param {boolean} inverted\n             *        Whether to invert or not. An inverted shape can be un-inverted by\n             *        setting it to false.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Return the SVGElement for chaining.\n             */\n            SVGElement.prototype.invert = function (inverted) {\n                var wrapper = this;\n                wrapper.inverted = inverted;\n                wrapper.updateTransform();\n                return wrapper;\n            };\n            /**\n             * Add an event listener. This is a simple setter that replaces all other\n             * events of the same type, opposed to the {@link Highcharts#addEvent}\n             * function.\n             *\n             * @sample highcharts/members/element-on/\n             *         A clickable rectangle\n             *\n             * @function Highcharts.SVGElement#on\n             *\n             * @param {string} eventType\n             * The event type. If the type is `click`, Highcharts will internally\n             * translate it to a `touchstart` event on touch devices, to prevent the\n             * browser from waiting for a click event from firing.\n             *\n             * @param {Function} handler\n             * The handler callback.\n             *\n             * @return {Highcharts.SVGElement}\n             * The SVGElement for chaining.\n             */\n            SVGElement.prototype.on = function (eventType, handler) {\n                var svgElement = this,\n                    element = svgElement.element,\n                    touchStartPos,\n                    touchEventFired;\n                // touch\n                if (hasTouch && eventType === 'click') {\n                    element.ontouchstart = function (e) {\n                        // save touch position for later calculation\n                        touchStartPos = {\n                            clientX: e.touches[0].clientX,\n                            clientY: e.touches[0].clientY\n                        };\n                    };\n                    // Instead of ontouchstart, event handlers should be called\n                    // on touchend - similar to how current mouseup events are called\n                    element.ontouchend = function (e) {\n                        // hasMoved is a boolean variable containing logic if page\n                        // was scrolled, so if touch position changed more than\n                        // ~4px (value borrowed from general touch handler)\n                        var hasMoved = touchStartPos.clientX ? Math.sqrt(Math.pow(touchStartPos.clientX - e.changedTouches[0].clientX, 2) +\n                                Math.pow(touchStartPos.clientY - e.changedTouches[0].clientY, 2)) >= 4 : false;\n                        if (!hasMoved) { // only call handlers if page was not scrolled\n                            handler.call(element, e);\n                        }\n                        touchEventFired = true;\n                        // prevent other events from being fired. #9682\n                        e.preventDefault();\n                    };\n                    element.onclick = function (e) {\n                        // Do not call onclick handler if touch event was fired already.\n                        if (!touchEventFired) {\n                            handler.call(element, e);\n                        }\n                    };\n                }\n                else {\n                    // simplest possible event model for internal use\n                    element['on' + eventType] = handler;\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#opacitySetter\n             * @param {string} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.opacitySetter = function (value, key, element) {\n                this[key] = value;\n                element.setAttribute(key, value);\n            };\n            /**\n             * Remove a class name from the element.\n             *\n             * @function Highcharts.SVGElement#removeClass\n             *\n             * @param {string|RegExp} className\n             *        The class name to remove.\n             *\n             * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n             */\n            SVGElement.prototype.removeClass = function (className) {\n                return this.attr('class', ('' + this.attr('class'))\n                    .replace(isString(className) ?\n                    new RegExp(\"(^| )\" + className + \"( |$)\") : // #12064, #13590\n                    className, ' ')\n                    .replace(/ +/g, ' ')\n                    .trim());\n            };\n            /**\n             * @private\n             * @param {Array<Highcharts.SVGDOMElement>} tspans\n             * Text spans.\n             */\n            SVGElement.prototype.removeTextOutline = function (tspans) {\n                // Iterate from the end to\n                // support removing items inside the cycle (#6472).\n                var i = tspans.length,\n                    tspan;\n                while (i--) {\n                    tspan = tspans[i];\n                    if (tspan.getAttribute('class') === 'highcharts-text-outline') {\n                        // Remove then erase\n                        erase(tspans, this.element.removeChild(tspan));\n                    }\n                }\n            };\n            /**\n             * Removes an element from the DOM.\n             *\n             * @private\n             * @function Highcharts.SVGElement#safeRemoveChild\n             *\n             * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n             * The DOM node to remove.\n             */\n            SVGElement.prototype.safeRemoveChild = function (element) {\n                var parentNode = element.parentNode;\n                if (parentNode) {\n                    parentNode.removeChild(element);\n                }\n            };\n            /**\n             * Set the coordinates needed to draw a consistent radial gradient across\n             * a shape regardless of positioning inside the chart. Used on pie slices\n             * to make all the slices have the same radial reference point.\n             *\n             * @function Highcharts.SVGElement#setRadialReference\n             *\n             * @param {Array<number>} coordinates\n             * The center reference. The format is `[centerX, centerY, diameter]` in\n             * pixels.\n             *\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.setRadialReference = function (coordinates) {\n                var existingGradient = (this.element.gradient &&\n                        this.renderer.gradients[this.element.gradient]);\n                this.element.radialReference = coordinates;\n                // On redrawing objects with an existing gradient, the gradient needs\n                // to be repositioned (#3801)\n                if (existingGradient && existingGradient.radAttr) {\n                    existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n                }\n                return this;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#setTextPath\n             * @param {Highcharts.SVGElement} path\n             * Path to follow.\n             * @param {Highcharts.DataLabelsTextPathOptionsObject} textPathOptions\n             * Options.\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.setTextPath = function (path, textPathOptions) {\n                var elem = this.element,\n                    attribsMap = {\n                        textAnchor: 'text-anchor'\n                    },\n                    attrs,\n                    adder = false,\n                    textPathElement,\n                    textPathId,\n                    textPathWrapper = this.textPathWrapper,\n                    tspans,\n                    firstTime = !textPathWrapper;\n                // Defaults\n                textPathOptions = merge(true, {\n                    enabled: true,\n                    attributes: {\n                        dy: -5,\n                        startOffset: '50%',\n                        textAnchor: 'middle'\n                    }\n                }, textPathOptions);\n                attrs = textPathOptions.attributes;\n                if (path && textPathOptions && textPathOptions.enabled) {\n                    // In case of fixed width for a text, string is rebuilt\n                    // (e.g. ellipsis is applied), so we need to rebuild textPath too\n                    if (textPathWrapper &&\n                        textPathWrapper.element.parentNode === null) {\n                        // When buildText functionality was triggered again\n                        // and deletes textPathWrapper parentNode\n                        firstTime = true;\n                        textPathWrapper = textPathWrapper.destroy();\n                    }\n                    else if (textPathWrapper) {\n                        // Case after drillup when spans were added into\n                        // the DOM outside the textPathWrapper parentGroup\n                        this.removeTextOutline.call(textPathWrapper.parentGroup, [].slice.call(elem.getElementsByTagName('tspan')));\n                    }\n                    // label() has padding, text() doesn't\n                    if (this.options && this.options.padding) {\n                        attrs.dx = -this.options.padding;\n                    }\n                    if (!textPathWrapper) {\n                        // Create <textPath>, defer the DOM adder\n                        this.textPathWrapper = textPathWrapper =\n                            this.renderer.createElement('textPath');\n                        adder = true;\n                    }\n                    textPathElement = textPathWrapper.element;\n                    // Set ID for the path\n                    textPathId = path.element.getAttribute('id');\n                    if (!textPathId) {\n                        path.element.setAttribute('id', textPathId = uniqueKey());\n                    }\n                    // Change DOM structure, by placing <textPath> tag in <text>\n                    if (firstTime) {\n                        tspans = elem.getElementsByTagName('tspan');\n                        // Now move all <tspan>'s to the <textPath> node\n                        while (tspans.length) {\n                            // Remove \"y\" from tspans, as Firefox translates them\n                            tspans[0].setAttribute('y', 0);\n                            // Remove \"x\" from tspans\n                            if (isNumber(attrs.dx)) {\n                                tspans[0].setAttribute('x', -attrs.dx);\n                            }\n                            textPathElement.appendChild(tspans[0]);\n                        }\n                    }\n                    // Add <textPath> to the DOM\n                    if (adder &&\n                        textPathWrapper) {\n                        textPathWrapper.add({\n                            // label() is placed in a group, text() is standalone\n                            element: this.text ? this.text.element : elem\n                        });\n                    }\n                    // Set basic options:\n                    // Use `setAttributeNS` because Safari needs this..\n                    textPathElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', this.renderer.url + '#' + textPathId);\n                    // Presentation attributes:\n                    // dx/dy options must by set on <text> (parent),\n                    // the rest should be set on <textPath>\n                    if (defined(attrs.dy)) {\n                        textPathElement.parentNode\n                            .setAttribute('dy', attrs.dy);\n                        delete attrs.dy;\n                    }\n                    if (defined(attrs.dx)) {\n                        textPathElement.parentNode\n                            .setAttribute('dx', attrs.dx);\n                        delete attrs.dx;\n                    }\n                    // Additional attributes\n                    objectEach(attrs, function (val, key) {\n                        textPathElement.setAttribute(attribsMap[key] || key, val);\n                    });\n                    // Remove translation, text that follows path does not need that\n                    elem.removeAttribute('transform');\n                    // Remove shadows and text outlines\n                    this.removeTextOutline.call(textPathWrapper, [].slice.call(elem.getElementsByTagName('tspan')));\n                    // Remove background and border for label(), see #10545\n                    // Alternatively, we can disable setting background rects in\n                    // series.drawDataLabels()\n                    if (this.text && !this.renderer.styledMode) {\n                        this.attr({\n                            fill: 'none',\n                            'stroke-width': 0\n                        });\n                    }\n                    // Disable some functions\n                    this.updateTransform = noop;\n                    this.applyTextOutline = noop;\n                }\n                else if (textPathWrapper) {\n                    // Reset to prototype\n                    delete this.updateTransform;\n                    delete this.applyTextOutline;\n                    // Restore DOM structure:\n                    this.destroyTextPath(elem, path);\n                    // Bring attributes back\n                    this.updateTransform();\n                    // Set textOutline back for text()\n                    if (this.options && this.options.rotation) {\n                        this.applyTextOutline(this.options.style.textOutline);\n                    }\n                }\n                return this;\n            };\n            /**\n             * Add a shadow to the element. Must be called after the element is added to\n             * the DOM. In styled mode, this method is not used, instead use `defs` and\n             * filters.\n             *\n             * @example\n             * renderer.rect(10, 100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .shadow(true);\n             *\n             * @function Highcharts.SVGElement#shadow\n             *\n             * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions]\n             *        The shadow options. If `true`, the default options are applied. If\n             *        `false`, the current shadow will be removed.\n             *\n             * @param {Highcharts.SVGElement} [group]\n             *        The SVG group element where the shadows will be applied. The\n             *        default is to add it to the same parent as the current element.\n             *        Internally, this is ised for pie slices, where all the shadows are\n             *        added to an element behind all the slices.\n             *\n             * @param {boolean} [cutOff]\n             *        Used internally for column shadows.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.shadow = function (shadowOptions, group, cutOff) {\n                var shadows = [],\n                    i,\n                    shadow,\n                    element = this.element,\n                    strokeWidth,\n                    shadowElementOpacity,\n                    update = false,\n                    oldShadowOptions = this.oldShadowOptions, \n                    // compensate for inverted plot area\n                    transform;\n                var defaultShadowOptions = {\n                        color: '#000000',\n                        offsetX: 1,\n                        offsetY: 1,\n                        opacity: 0.15,\n                        width: 3\n                    };\n                var options;\n                if (shadowOptions === true) {\n                    options = defaultShadowOptions;\n                }\n                else if (typeof shadowOptions === 'object') {\n                    options = extend(defaultShadowOptions, shadowOptions);\n                }\n                // Update shadow when options change (#12091).\n                if (options) {\n                    // Go over each key to look for change\n                    if (options && oldShadowOptions) {\n                        objectEach(options, function (value, key) {\n                            if (value !== oldShadowOptions[key]) {\n                                update = true;\n                            }\n                        });\n                    }\n                    if (update) {\n                        this.destroyShadows();\n                    }\n                    this.oldShadowOptions = options;\n                }\n                if (!options) {\n                    this.destroyShadows();\n                }\n                else if (!this.shadows) {\n                    shadowElementOpacity = options.opacity / options.width;\n                    transform = this.parentInverted ?\n                        'translate(-1,-1)' :\n                        \"translate(\" + options.offsetX + \", \" + options.offsetY + \")\";\n                    for (i = 1; i <= options.width; i++) {\n                        shadow = element.cloneNode(false);\n                        strokeWidth = (options.width * 2) + 1 - (2 * i);\n                        attr(shadow, {\n                            stroke: (shadowOptions.color ||\n                                '#000000'),\n                            'stroke-opacity': shadowElementOpacity * i,\n                            'stroke-width': strokeWidth,\n                            transform: transform,\n                            fill: 'none'\n                        });\n                        shadow.setAttribute('class', (shadow.getAttribute('class') || '') + ' highcharts-shadow');\n                        if (cutOff) {\n                            attr(shadow, 'height', Math.max(attr(shadow, 'height') - strokeWidth, 0));\n                            shadow.cutHeight = strokeWidth;\n                        }\n                        if (group) {\n                            group.element.appendChild(shadow);\n                        }\n                        else if (element.parentNode) {\n                            element.parentNode.insertBefore(shadow, element);\n                        }\n                        shadows.push(shadow);\n                    }\n                    this.shadows = shadows;\n                }\n                return this;\n            };\n            /**\n             * Show the element after it has been hidden.\n             *\n             * @function Highcharts.SVGElement#show\n             *\n             * @param {boolean} [inherit=false]\n             *        Set the visibility attribute to `inherit` rather than `visible`.\n             *        The difference is that an element with `visibility=\"visible\"`\n             *        will be visible even if the parent is hidden.\n             *\n             * @return {Highcharts.SVGElement}\n             *         Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.show = function (inherit) {\n                return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n            };\n            /**\n             * WebKit and Batik have problems with a stroke-width of zero, so in this\n             * case we remove the stroke attribute altogether. #1270, #1369, #3065,\n             * #3072.\n             *\n             * @private\n             * @function Highcharts.SVGElement#strokeSetter\n             * @param {number|string} value\n             * @param {string} key\n             * @param {Highcharts.SVGDOMElement} element\n             */\n            SVGElement.prototype.strokeSetter = function (value, key, element) {\n                this[key] = value;\n                // Only apply the stroke attribute if the stroke width is defined and\n                // larger than 0\n                if (this.stroke && this['stroke-width']) {\n                    // Use prototype as instance may be overridden\n                    SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element);\n                    element.setAttribute('stroke-width', this['stroke-width']);\n                    this.hasStroke = true;\n                }\n                else if (key === 'stroke-width' && value === 0 && this.hasStroke) {\n                    element.removeAttribute('stroke');\n                    this.hasStroke = false;\n                }\n                else if (this.renderer.styledMode && this['stroke-width']) {\n                    element.setAttribute('stroke-width', this['stroke-width']);\n                    this.hasStroke = true;\n                }\n            };\n            /**\n             * Get the computed stroke width in pixel values. This is used extensively\n             * when drawing shapes to ensure the shapes are rendered crisp and\n             * positioned correctly relative to each other. Using\n             * `shape-rendering: crispEdges` leaves us less control over positioning,\n             * for example when we want to stack columns next to each other, or position\n             * things pixel-perfectly within the plot box.\n             *\n             * The common pattern when placing a shape is:\n             * - Create the SVGElement and add it to the DOM. In styled mode, it will\n             *   now receive a stroke width from the style sheet. In classic mode we\n             *   will add the `stroke-width` attribute.\n             * - Read the computed `elem.strokeWidth()`.\n             * - Place it based on the stroke width.\n             *\n             * @function Highcharts.SVGElement#strokeWidth\n             *\n             * @return {number}\n             * The stroke width in pixels. Even if the given stroke widtch (in CSS or by\n             * attributes) is based on `em` or other units, the pixel size is returned.\n             */\n            SVGElement.prototype.strokeWidth = function () {\n                // In non-styled mode, read the stroke width as set by .attr\n                if (!this.renderer.styledMode) {\n                    return this['stroke-width'] || 0;\n                }\n                // In styled mode, read computed stroke width\n                var val = this.getStyle('stroke-width'),\n                    ret = 0,\n                    dummy;\n                // Read pixel values directly\n                if (val.indexOf('px') === val.length - 2) {\n                    ret = pInt(val);\n                    // Other values like em, pt etc need to be measured\n                }\n                else if (val !== '') {\n                    dummy = doc.createElementNS(SVG_NS, 'rect');\n                    attr(dummy, {\n                        width: val,\n                        'stroke-width': 0\n                    });\n                    this.element.parentNode.appendChild(dummy);\n                    ret = dummy.getBBox().width;\n                    dummy.parentNode.removeChild(dummy);\n                }\n                return ret;\n            };\n            /**\n             * If one of the symbol size affecting parameters are changed,\n             * check all the others only once for each call to an element's\n             * .attr() method\n             *\n             * @private\n             * @function Highcharts.SVGElement#symbolAttr\n             *\n             * @param {Highcharts.SVGAttributes} hash\n             * The attributes to set.\n             */\n            SVGElement.prototype.symbolAttr = function (hash) {\n                var wrapper = this;\n                [\n                    'x',\n                    'y',\n                    'r',\n                    'start',\n                    'end',\n                    'width',\n                    'height',\n                    'innerR',\n                    'anchorX',\n                    'anchorY',\n                    'clockwise'\n                ].forEach(function (key) {\n                    wrapper[key] = pick(hash[key], wrapper[key]);\n                });\n                wrapper.attr({\n                    d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#textSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.textSetter = function (value) {\n                if (value !== this.textStr) {\n                    // Delete size caches when the text changes\n                    // delete this.bBox; // old code in series-label\n                    delete this.textPxLength;\n                    this.textStr = value;\n                    if (this.added) {\n                        this.renderer.buildText(this);\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#titleSetter\n             * @param {string} value\n             */\n            SVGElement.prototype.titleSetter = function (value) {\n                var titleNode = this.element.getElementsByTagName('title')[0];\n                if (!titleNode) {\n                    titleNode = doc.createElementNS(this.SVG_NS, 'title');\n                    this.element.appendChild(titleNode);\n                }\n                // Remove text content if it exists\n                if (titleNode.firstChild) {\n                    titleNode.removeChild(titleNode.firstChild);\n                }\n                titleNode.appendChild(doc.createTextNode(\n                // #3276, #3895\n                String(pick(value, ''))\n                    .replace(/<[^>]*>/g, '')\n                    .replace(/&lt;/g, '<')\n                    .replace(/&gt;/g, '>')));\n            };\n            /**\n             * Bring the element to the front. Alternatively, a new zIndex can be set.\n             *\n             * @sample highcharts/members/element-tofront/\n             *         Click an element to bring it to front\n             *\n             * @function Highcharts.SVGElement#toFront\n             *\n             * @return {Highcharts.SVGElement}\n             * Returns the SVGElement for chaining.\n             */\n            SVGElement.prototype.toFront = function () {\n                var element = this.element;\n                element.parentNode.appendChild(element);\n                return this;\n            };\n            /**\n             * Move an object and its children by x and y values.\n             *\n             * @function Highcharts.SVGElement#translate\n             *\n             * @param {number} x\n             *        The x value.\n             *\n             * @param {number} y\n             *        The y value.\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            SVGElement.prototype.translate = function (x, y) {\n                return this.attr({\n                    translateX: x,\n                    translateY: y\n                });\n            };\n            /**\n             * Update the shadow elements with new attributes.\n             *\n             * @private\n             * @function Highcharts.SVGElement#updateShadows\n             *\n             * @param {string} key\n             * The attribute name.\n             *\n             * @param {number} value\n             * The value of the attribute.\n             *\n             * @param {Function} setter\n             * The setter function, inherited from the parent wrapper.\n             */\n            SVGElement.prototype.updateShadows = function (key, value, setter) {\n                var shadows = this.shadows;\n                if (shadows) {\n                    var i = shadows.length;\n                    while (i--) {\n                        setter.call(shadows[i], key === 'height' ?\n                            Math.max(value - (shadows[i].cutHeight || 0), 0) :\n                            key === 'd' ? this.d : value, key, shadows[i]);\n                    }\n                }\n            };\n            /**\n             * Update the transform attribute based on internal properties. Deals with\n             * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n             * attributes and updates the SVG `transform` attribute.\n             *\n             * @private\n             * @function Highcharts.SVGElement#updateTransform\n             */\n            SVGElement.prototype.updateTransform = function () {\n                var wrapper = this,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    scaleX = wrapper.scaleX,\n                    scaleY = wrapper.scaleY,\n                    inverted = wrapper.inverted,\n                    rotation = wrapper.rotation,\n                    matrix = wrapper.matrix,\n                    element = wrapper.element,\n                    transform;\n                // Flipping affects translate as adjustment for flipping around the\n                // group's axis\n                if (inverted) {\n                    translateX += wrapper.width;\n                    translateY += wrapper.height;\n                }\n                // Apply translate. Nearly all transformed elements have translation,\n                // so instead of checking for translate = 0, do it always (#1767,\n                // #1846).\n                transform = ['translate(' + translateX + ',' + translateY + ')'];\n                // apply matrix\n                if (defined(matrix)) {\n                    transform.push('matrix(' + matrix.join(',') + ')');\n                }\n                // apply rotation\n                if (inverted) {\n                    transform.push('rotate(90) scale(-1,1)');\n                }\n                else if (rotation) { // text rotation\n                    transform.push('rotate(' + rotation + ' ' +\n                        pick(this.rotationOriginX, element.getAttribute('x'), 0) +\n                        ' ' +\n                        pick(this.rotationOriginY, element.getAttribute('y') || 0) + ')');\n                }\n                // apply scale\n                if (defined(scaleX) || defined(scaleY)) {\n                    transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n                }\n                if (transform.length) {\n                    element.setAttribute('transform', transform.join(' '));\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#visibilitySetter\n             *\n             * @param {string} value\n             *\n             * @param {string} key\n             *\n             * @param {Highcharts.SVGDOMElement} element\n             *\n             * @return {void}\n             */\n            SVGElement.prototype.visibilitySetter = function (value, key, element) {\n                // IE9-11 doesn't handle visibilty:inherit well, so we remove the\n                // attribute instead (#2881, #3909)\n                if (value === 'inherit') {\n                    element.removeAttribute(key);\n                }\n                else if (this[key] !== value) { // #6747\n                    element.setAttribute(key, value);\n                }\n                this[key] = value;\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#xGetter\n             *\n             * @param {string} key\n             *\n             * @return {number|string|null}\n             */\n            SVGElement.prototype.xGetter = function (key) {\n                if (this.element.nodeName === 'circle') {\n                    if (key === 'x') {\n                        key = 'cx';\n                    }\n                    else if (key === 'y') {\n                        key = 'cy';\n                    }\n                }\n                return this._defaultGetter(key);\n            };\n            /**\n             * @private\n             * @function Highcharts.SVGElement#zIndexSetter\n             * @param {number} [value]\n             * @param {string} [key]\n             * @return {boolean}\n             */\n            SVGElement.prototype.zIndexSetter = function (value, key) {\n                var renderer = this.renderer,\n                    parentGroup = this.parentGroup,\n                    parentWrapper = parentGroup || renderer,\n                    parentNode = parentWrapper.element || renderer.box,\n                    childNodes,\n                    otherElement,\n                    otherZIndex,\n                    element = this.element,\n                    inserted = false,\n                    undefinedOtherZIndex,\n                    svgParent = parentNode === renderer.box,\n                    run = this.added,\n                    i;\n                if (defined(value)) {\n                    // So we can read it for other elements in the group\n                    element.setAttribute('data-z-index', value);\n                    value = +value;\n                    if (this[key] === value) {\n                        // Only update when needed (#3865)\n                        run = false;\n                    }\n                }\n                else if (defined(this[key])) {\n                    element.removeAttribute('data-z-index');\n                }\n                this[key] = value;\n                // Insert according to this and other elements' zIndex. Before .add() is\n                // called, nothing is done. Then on add, or by later calls to\n                // zIndexSetter, the node is placed on the right place in the DOM.\n                if (run) {\n                    value = this.zIndex;\n                    if (value && parentGroup) {\n                        parentGroup.handleZ = true;\n                    }\n                    childNodes = parentNode.childNodes;\n                    for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n                        otherElement = childNodes[i];\n                        otherZIndex = otherElement.getAttribute('data-z-index');\n                        undefinedOtherZIndex = !defined(otherZIndex);\n                        if (otherElement !== element) {\n                            if (\n                            // Negative zIndex versus no zIndex:\n                            // On all levels except the highest. If the parent is\n                            // <svg>, then we don't want to put items before <desc>\n                            // or <defs>\n                            value < 0 &&\n                                undefinedOtherZIndex &&\n                                !svgParent &&\n                                !i) {\n                                parentNode.insertBefore(element, childNodes[i]);\n                                inserted = true;\n                            }\n                            else if (\n                            // Insert after the first element with a lower zIndex\n                            pInt(otherZIndex) <= value ||\n                                // If negative zIndex, add this before first undefined\n                                // zIndex element\n                                (undefinedOtherZIndex &&\n                                    (!defined(value) || value >= 0))) {\n                                parentNode.insertBefore(element, childNodes[i + 1] || null // null for oldIE export\n                                );\n                                inserted = true;\n                            }\n                        }\n                    }\n                    if (!inserted) {\n                        parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0] || null // null for oldIE\n                        );\n                        inserted = true;\n                    }\n                }\n                return inserted;\n            };\n            return SVGElement;\n        }());\n        // Some shared setters and getters\n        SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter;\n        SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n        SVGElement.prototype.matrixSetter =\n            SVGElement.prototype.rotationOriginXSetter =\n                SVGElement.prototype.rotationOriginYSetter =\n                    SVGElement.prototype.rotationSetter =\n                        SVGElement.prototype.scaleXSetter =\n                            SVGElement.prototype.scaleYSetter =\n                                SVGElement.prototype.translateXSetter =\n                                    SVGElement.prototype.translateYSetter =\n                                        SVGElement.prototype.verticalAlignSetter = function (value, key) {\n                                            this[key] = value;\n                                            this.doTransform = true;\n                                        };\n        H.SVGElement = SVGElement;\n\n        return H.SVGElement;\n    });\n    _registerModule(_modules, 'parts/SVGLabel.js', [_modules['parts/SVGElement.js'], _modules['parts/Utilities.js']], function (SVGElement, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var __extends = (this && this.__extends) || (function () {\n                var extendStatics = function (d,\n            b) {\n                    extendStatics = Object.setPrototypeOf ||\n                        ({ __proto__: [] } instanceof Array && function (d,\n            b) { d.__proto__ = b; }) ||\n                        function (d,\n            b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n                return extendStatics(d, b);\n            };\n            return function (d, b) {\n                extendStatics(d, b);\n                function __() { this.constructor = d; }\n                d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n            };\n        })();\n        var defined = U.defined,\n            extend = U.extend,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            removeEvent = U.removeEvent;\n        /**\n         * SVG label to render text.\n         * @private\n         * @class\n         * @name Highcharts.SVGLabel\n         * @augments Highcharts.SVGElement\n         */\n        var SVGLabel = /** @class */ (function (_super) {\n                __extends(SVGLabel, _super);\n            /* *\n             *\n             *  Constructors\n             *\n             * */\n            function SVGLabel(renderer, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n                var _this = _super.call(this) || this;\n                _this.init(renderer, 'g');\n                _this.textStr = str;\n                _this.x = x;\n                _this.y = y;\n                _this.anchorX = anchorX;\n                _this.anchorY = anchorY;\n                _this.baseline = baseline;\n                _this.className = className;\n                if (className !== 'button') {\n                    _this.addClass('highcharts-label');\n                }\n                if (className) {\n                    _this.addClass('highcharts-' + className);\n                }\n                _this.text = renderer.text('', 0, 0, useHTML)\n                    .attr({\n                    zIndex: 1\n                });\n                // Validate the shape argument\n                var hasBGImage;\n                if (typeof shape === 'string') {\n                    hasBGImage = /^url\\((.*?)\\)$/.test(shape);\n                    if (_this.renderer.symbols[shape] || hasBGImage) {\n                        _this.symbolKey = shape;\n                    }\n                }\n                _this.bBox = SVGLabel.emptyBBox;\n                _this.padding = 3;\n                _this.paddingLeft = 0;\n                _this.baselineOffset = 0;\n                _this.needsBox = renderer.styledMode || hasBGImage;\n                _this.deferredAttr = {};\n                _this.alignFactor = 0;\n                return _this;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            SVGLabel.prototype.alignSetter = function (value) {\n                var alignFactor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[value];\n                if (alignFactor !== this.alignFactor) {\n                    this.alignFactor = alignFactor;\n                    // Bounding box exists, means we're dynamically changing\n                    if (this.bBox && isNumber(this.xSetting)) {\n                        this.attr({ x: this.xSetting }); // #5134\n                    }\n                }\n            };\n            SVGLabel.prototype.anchorXSetter = function (value, key) {\n                this.anchorX = value;\n                this.boxAttr(key, Math.round(value) - this.getCrispAdjust() - this.xSetting);\n            };\n            SVGLabel.prototype.anchorYSetter = function (value, key) {\n                this.anchorY = value;\n                this.boxAttr(key, value - this.ySetting);\n            };\n            /*\n             * Set a box attribute, or defer it if the box is not yet created\n             */\n            SVGLabel.prototype.boxAttr = function (key, value) {\n                if (this.box) {\n                    this.box.attr(key, value);\n                }\n                else {\n                    this.deferredAttr[key] = value;\n                }\n            };\n            /*\n             * Pick up some properties and apply them to the text instead of the\n             * wrapper.\n             */\n            SVGLabel.prototype.css = function (styles) {\n                if (styles) {\n                    var textStyles = {},\n                        isWidth,\n                        isFontStyle;\n                    // Create a copy to avoid altering the original object\n                    // (#537)\n                    styles = merge(styles);\n                    SVGLabel.textProps.forEach(function (prop) {\n                        if (typeof styles[prop] !== 'undefined') {\n                            textStyles[prop] = styles[prop];\n                            delete styles[prop];\n                        }\n                    });\n                    this.text.css(textStyles);\n                    isWidth = 'width' in textStyles;\n                    isFontStyle = 'fontSize' in textStyles ||\n                        'fontWeight' in textStyles;\n                    // Update existing text, box (#9400, #12163)\n                    if (isWidth || isFontStyle) {\n                        this.updateBoxSize();\n                        // Keep updated (#9400, #12163)\n                        if (isFontStyle) {\n                            this.updateTextPadding();\n                        }\n                    }\n                }\n                return SVGElement.prototype.css.call(this, styles);\n            };\n            /*\n             * Destroy and release memory.\n             */\n            SVGLabel.prototype.destroy = function () {\n                // Added by button implementation\n                removeEvent(this.element, 'mouseenter');\n                removeEvent(this.element, 'mouseleave');\n                if (this.text) {\n                    this.text.destroy();\n                }\n                if (this.box) {\n                    this.box = this.box.destroy();\n                }\n                // Call base implementation to destroy the rest\n                SVGElement.prototype.destroy.call(this);\n                return void 0;\n            };\n            SVGLabel.prototype.fillSetter = function (value, key) {\n                if (value) {\n                    this.needsBox = true;\n                }\n                // for animation getter (#6776)\n                this.fill = value;\n                this.boxAttr(key, value);\n            };\n            /*\n             * Return the bounding box of the box, not the group.\n             */\n            SVGLabel.prototype.getBBox = function () {\n                var bBox = this.bBox;\n                var padding = this.padding;\n                return {\n                    width: bBox.width + 2 * padding,\n                    height: bBox.height + 2 * padding,\n                    x: bBox.x - padding,\n                    y: bBox.y - padding\n                };\n            };\n            SVGLabel.prototype.getCrispAdjust = function () {\n                return this.renderer.styledMode && this.box ?\n                    this.box.strokeWidth() % 2 / 2 :\n                    (this['stroke-width'] ? parseInt(this['stroke-width'], 10) : 0) % 2 / 2;\n            };\n            SVGLabel.prototype.heightSetter = function (value) {\n                this.heightSetting = value;\n            };\n            // Event handling. In case of useHTML, we need to make sure that events\n            // are captured on the span as well, and that mouseenter/mouseleave\n            // between the SVG group and the HTML span are not treated as real\n            // enter/leave events. #13310.\n            SVGLabel.prototype.on = function (eventType, handler) {\n                var label = this;\n                var text = label.text;\n                var span = text && text.element.tagName === 'SPAN' ? text : void 0;\n                var selectiveHandler;\n                if (span) {\n                    selectiveHandler = function (e) {\n                        if ((eventType === 'mouseenter' ||\n                            eventType === 'mouseleave') &&\n                            e.relatedTarget instanceof Element &&\n                            (label.element.contains(e.relatedTarget) ||\n                                span.element.contains(e.relatedTarget))) {\n                            return;\n                        }\n                        handler.call(label.element, e);\n                    };\n                    span.on(eventType, selectiveHandler);\n                }\n                SVGElement.prototype.on.call(label, eventType, selectiveHandler || handler);\n                return label;\n            };\n            /*\n             * After the text element is added, get the desired size of the border\n             * box and add it before the text in the DOM.\n             */\n            SVGLabel.prototype.onAdd = function () {\n                var str = this.textStr;\n                this.text.add(this);\n                this.attr({\n                    // Alignment is available now  (#3295, 0 not rendered if given\n                    // as a value)\n                    text: (defined(str) ? str : ''),\n                    x: this.x,\n                    y: this.y\n                });\n                if (this.box && defined(this.anchorX)) {\n                    this.attr({\n                        anchorX: this.anchorX,\n                        anchorY: this.anchorY\n                    });\n                }\n            };\n            SVGLabel.prototype.paddingSetter = function (value) {\n                if (defined(value) && value !== this.padding) {\n                    this.padding = value;\n                    this.updateTextPadding();\n                }\n            };\n            SVGLabel.prototype.paddingLeftSetter = function (value) {\n                if (defined(value) && value !== this.paddingLeft) {\n                    this.paddingLeft = value;\n                    this.updateTextPadding();\n                }\n            };\n            SVGLabel.prototype.rSetter = function (value, key) {\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype.shadow = function (b) {\n                if (b && !this.renderer.styledMode) {\n                    this.updateBoxSize();\n                    if (this.box) {\n                        this.box.shadow(b);\n                    }\n                }\n                return this;\n            };\n            SVGLabel.prototype.strokeSetter = function (value, key) {\n                // for animation getter (#6776)\n                this.stroke = value;\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype['stroke-widthSetter'] = function (value, key) {\n                if (value) {\n                    this.needsBox = true;\n                }\n                this['stroke-width'] = value;\n                this.boxAttr(key, value);\n            };\n            SVGLabel.prototype['text-alignSetter'] = function (value) {\n                this.textAlign = value;\n            };\n            SVGLabel.prototype.textSetter = function (text) {\n                if (typeof text !== 'undefined') {\n                    // Must use .attr to ensure transforms are done (#10009)\n                    this.text.attr({ text: text });\n                }\n                this.updateBoxSize();\n                this.updateTextPadding();\n            };\n            /*\n             * This function runs after the label is added to the DOM (when the bounding\n             * box is available), and after the text of the label is updated to detect\n             * the new bounding box and reflect it in the border box.\n             */\n            SVGLabel.prototype.updateBoxSize = function () {\n                var style = this.text.element.style,\n                    crispAdjust,\n                    attribs = {};\n                var padding = this.padding;\n                var paddingLeft = this.paddingLeft;\n                // #12165 error when width is null (auto)\n                // #12163 when fontweight: bold, recalculate bBox withot cache\n                // #3295 && 3514 box failure when string equals 0\n                var bBox = ((!isNumber(this.widthSetting) || !isNumber(this.heightSetting) || this.textAlign) &&\n                        defined(this.text.textStr)) ?\n                        this.text.getBBox() : SVGLabel.emptyBBox;\n                this.width = ((this.widthSetting || bBox.width || 0) +\n                    2 * padding +\n                    paddingLeft);\n                this.height = (this.heightSetting || bBox.height || 0) + 2 * padding;\n                // Update the label-scoped y offset. Math.min because of inline\n                // style (#9400)\n                this.baselineOffset = padding + Math.min(this.renderer.fontMetrics(style && style.fontSize, this.text).b, \n                // When the height is 0, there is no bBox, so go with the font\n                // metrics. Highmaps CSS demos.\n                bBox.height || Infinity);\n                if (this.needsBox) {\n                    // Create the border box if it is not already present\n                    if (!this.box) {\n                        // Symbol definition exists (#5324)\n                        var box = this.box = this.symbolKey ?\n                                this.renderer.symbol(this.symbolKey) :\n                                this.renderer.rect();\n                        box.addClass(// Don't use label className for buttons\n                        (this.className === 'button' ? '' : 'highcharts-label-box') +\n                            (this.className ? ' highcharts-' + this.className + '-box' : ''));\n                        box.add(this);\n                        crispAdjust = this.getCrispAdjust();\n                        attribs.x = crispAdjust;\n                        attribs.y = (this.baseline ? -this.baselineOffset : 0) + crispAdjust;\n                    }\n                    // Apply the box attributes\n                    attribs.width = Math.round(this.width);\n                    attribs.height = Math.round(this.height);\n                    this.box.attr(extend(attribs, this.deferredAttr));\n                    this.deferredAttr = {};\n                }\n                this.bBox = bBox;\n            };\n            /*\n             * This function runs after setting text or padding, but only if padding\n             * is changed.\n             */\n            SVGLabel.prototype.updateTextPadding = function () {\n                var text = this.text;\n                // Determine y based on the baseline\n                var textY = this.baseline ? 0 : this.baselineOffset;\n                var textX = this.paddingLeft + this.padding;\n                // compensate for alignment\n                if (defined(this.widthSetting) &&\n                    this.bBox &&\n                    (this.textAlign === 'center' || this.textAlign === 'right')) {\n                    textX += { center: 0.5, right: 1 }[this.textAlign] *\n                        (this.widthSetting - this.bBox.width);\n                }\n                // update if anything changed\n                if (textX !== text.x || textY !== text.y) {\n                    text.attr('x', textX);\n                    // #8159 - prevent misplaced data labels in treemap\n                    // (useHTML: true)\n                    if (text.hasBoxWidthChanged) {\n                        this.bBox = text.getBBox(true);\n                        this.updateBoxSize();\n                    }\n                    if (typeof textY !== 'undefined') {\n                        text.attr('y', textY);\n                    }\n                }\n                // record current values\n                text.x = textX;\n                text.y = textY;\n            };\n            SVGLabel.prototype.widthSetter = function (value) {\n                // width:auto => null\n                this.widthSetting = isNumber(value) ? value : void 0;\n            };\n            SVGLabel.prototype.xSetter = function (value) {\n                this.x = value; // for animation getter\n                if (this.alignFactor) {\n                    value -= this.alignFactor * ((this.widthSetting || this.bBox.width) +\n                        2 * this.padding);\n                    // Force animation even when setting to the same value (#7898)\n                    this['forceAnimate:x'] = true;\n                }\n                this.xSetting = Math.round(value);\n                this.attr('translateX', this.xSetting);\n            };\n            SVGLabel.prototype.ySetter = function (value) {\n                this.ySetting = this.y = Math.round(value);\n                this.attr('translateY', this.ySetting);\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            SVGLabel.emptyBBox = { width: 0, height: 0, x: 0, y: 0 };\n            /* *\n             *\n             *  Properties\n             *\n             * */\n            /**\n             * For labels, these CSS properties are applied to the `text` node directly.\n             *\n             * @private\n             * @name Highcharts.SVGLabel#textProps\n             * @type {Array<string>}\n             */\n            SVGLabel.textProps = [\n                'color', 'cursor', 'direction', 'fontFamily', 'fontSize', 'fontStyle',\n                'fontWeight', 'lineHeight', 'textAlign', 'textDecoration',\n                'textOutline', 'textOverflow', 'width'\n            ];\n            return SVGLabel;\n        }(SVGElement));\n\n        return SVGLabel;\n    });\n    _registerModule(_modules, 'parts/SVGRenderer.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/SVGElement.js'], _modules['parts/SVGLabel.js'], _modules['parts/Utilities.js']], function (Color, H, SVGElement, SVGLabel, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            erase = U.erase,\n            extend = U.extend,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            removeEvent = U.removeEvent,\n            splat = U.splat,\n            stop = U.stop,\n            uniqueKey = U.uniqueKey;\n        /**\n         * A clipping rectangle that can be applied to one or more {@link SVGElement}\n         * instances. It is instanciated with the {@link SVGRenderer#clipRect} function\n         * and applied with the {@link SVGElement#clip} function.\n         *\n         * @example\n         * var circle = renderer.circle(100, 100, 100)\n         *     .attr({ fill: 'red' })\n         *     .add();\n         * var clipRect = renderer.clipRect(100, 100, 100, 100);\n         *\n         * // Leave only the lower right quarter visible\n         * circle.clip(clipRect);\n         *\n         * @typedef {Highcharts.SVGElement} Highcharts.ClipRectElement\n         */\n        /**\n         * The font metrics.\n         *\n         * @interface Highcharts.FontMetricsObject\n         */ /**\n        * The baseline relative to the top of the box.\n        *\n        * @name Highcharts.FontMetricsObject#b\n        * @type {number}\n        */ /**\n        * The font size.\n        *\n        * @name Highcharts.FontMetricsObject#f\n        * @type {number}\n        */ /**\n        * The line height.\n        *\n        * @name Highcharts.FontMetricsObject#h\n        * @type {number}\n        */\n        /**\n         * An object containing `x` and `y` properties for the position of an element.\n         *\n         * @interface Highcharts.PositionObject\n         */ /**\n        * X position of the element.\n        * @name Highcharts.PositionObject#x\n        * @type {number}\n        */ /**\n        * Y position of the element.\n        * @name Highcharts.PositionObject#y\n        * @type {number}\n        */\n        /**\n         * A rectangle.\n         *\n         * @interface Highcharts.RectangleObject\n         */ /**\n        * Height of the rectangle.\n        * @name Highcharts.RectangleObject#height\n        * @type {number}\n        */ /**\n        * Width of the rectangle.\n        * @name Highcharts.RectangleObject#width\n        * @type {number}\n        */ /**\n        * Horizontal position of the rectangle.\n        * @name Highcharts.RectangleObject#x\n        * @type {number}\n        */ /**\n        * Vertical position of the rectangle.\n        * @name Highcharts.RectangleObject#y\n        * @type {number}\n        */\n        /**\n         * The shadow options.\n         *\n         * @interface Highcharts.ShadowOptionsObject\n         */ /**\n        * The shadow color.\n        * @name    Highcharts.ShadowOptionsObject#color\n        * @type    {Highcharts.ColorString|undefined}\n        * @default #000000\n        */ /**\n        * The horizontal offset from the element.\n        *\n        * @name    Highcharts.ShadowOptionsObject#offsetX\n        * @type    {number|undefined}\n        * @default 1\n        */ /**\n        * The vertical offset from the element.\n        * @name    Highcharts.ShadowOptionsObject#offsetY\n        * @type    {number|undefined}\n        * @default 1\n        */ /**\n        * The shadow opacity.\n        *\n        * @name    Highcharts.ShadowOptionsObject#opacity\n        * @type    {number|undefined}\n        * @default 0.15\n        */ /**\n        * The shadow width or distance from the element.\n        * @name    Highcharts.ShadowOptionsObject#width\n        * @type    {number|undefined}\n        * @default 3\n        */\n        /**\n         * @interface Highcharts.SizeObject\n         */ /**\n        * @name Highcharts.SizeObject#height\n        * @type {number}\n        */ /**\n        * @name Highcharts.SizeObject#width\n        * @type {number}\n        */\n        /**\n         * Serialized form of an SVG definition, including children. Some key\n         * property names are reserved: tagName, textContent, and children.\n         *\n         * @interface Highcharts.SVGDefinitionObject\n         */ /**\n        * @name Highcharts.SVGDefinitionObject#[key:string]\n        * @type {boolean|number|string|Array<Highcharts.SVGDefinitionObject>|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#children\n        * @type {Array<Highcharts.SVGDefinitionObject>|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#tagName\n        * @type {string|undefined}\n        */ /**\n        * @name Highcharts.SVGDefinitionObject#textContent\n        * @type {string|undefined}\n        */\n        /**\n         * Array of path commands, that will go into the `d` attribute of an SVG\n         * element.\n         *\n         * @typedef {Array<Array<Highcharts.SVGPathCommand,number?,number?,number?,number?,number?,number?,number?>>} Highcharts.SVGPathArray\n         */\n        /**\n         * Possible path commands in an SVG path array. Valid values are `A`, `C`, `H`,\n         * `L`, `M`, `Q`, `S`, `T`, `V`, `Z`.\n         *\n         * @typedef {string} Highcharts.SVGPathCommand\n         * @validvalue [\"a\",\"c\",\"h\",\"l\",\"m\",\"q\",\"s\",\"t\",\"v\",\"z\",\"A\",\"C\",\"H\",\"L\",\"M\",\"Q\",\"S\",\"T\",\"V\",\"Z\"]\n         */\n        /**\n         * An extendable collection of functions for defining symbol paths. Symbols are\n         * used internally for point markers, button and label borders and backgrounds,\n         * or custom shapes. Extendable by adding to {@link SVGRenderer#symbols}.\n         *\n         * @interface Highcharts.SymbolDictionary\n         */ /**\n        * @name Highcharts.SymbolDictionary#[key:string]\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#arc\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#callout\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#circle\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#diamond\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#square\n        * @type {Function|undefined}\n        */ /**\n        * @name Highcharts.SymbolDictionary#triangle\n        * @type {Function|undefined}\n        */\n        /**\n         * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`, `triangle`,\n         * and `triangle-down`. Symbols are used internally for point markers, button\n         * and label borders and backgrounds, or custom shapes. Extendable by adding to\n         * {@link SVGRenderer#symbols}.\n         *\n         * @typedef {\"arc\"|\"callout\"|\"circle\"|\"diamond\"|\"square\"|\"triangle\"|\"triangle-down\"} Highcharts.SymbolKeyValue\n         */\n        /**\n         * Additional options, depending on the actual symbol drawn.\n         *\n         * @interface Highcharts.SymbolOptionsObject\n         */ /**\n        * The anchor X position for the `callout` symbol. This is where the chevron\n        * points to.\n        *\n        * @name Highcharts.SymbolOptionsObject#anchorX\n        * @type {number|undefined}\n        */ /**\n        * The anchor Y position for the `callout` symbol. This is where the chevron\n        * points to.\n        *\n        * @name Highcharts.SymbolOptionsObject#anchorY\n        * @type {number|undefined}\n        */ /**\n        * The end angle of an `arc` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#end\n        * @type {number|undefined}\n        */ /**\n        * Whether to draw `arc` symbol open or closed.\n        *\n        * @name Highcharts.SymbolOptionsObject#open\n        * @type {boolean|undefined}\n        */ /**\n        * The radius of an `arc` symbol, or the border radius for the `callout` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#r\n        * @type {number|undefined}\n        */ /**\n        * The start angle of an `arc` symbol.\n        *\n        * @name Highcharts.SymbolOptionsObject#start\n        * @type {number|undefined}\n        */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        var charts = H.charts,\n            deg2rad = H.deg2rad,\n            doc = H.doc,\n            isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            noop = H.noop,\n            svg = H.svg,\n            SVG_NS = H.SVG_NS,\n            symbolSizes = H.symbolSizes,\n            win = H.win;\n        /**\n         * Allows direct access to the Highcharts rendering layer in order to draw\n         * primitive shapes like circles, rectangles, paths or text directly on a chart,\n         * or independent from any chart. The SVGRenderer represents a wrapper object\n         * for SVG in modern browsers. Through the VMLRenderer, part of the `oldie.js`\n         * module, it also brings vector graphics to IE <= 8.\n         *\n         * An existing chart's renderer can be accessed through {@link Chart.renderer}.\n         * The renderer can also be used completely decoupled from a chart.\n         *\n         * @sample highcharts/members/renderer-on-chart\n         *         Annotating a chart programmatically.\n         * @sample highcharts/members/renderer-basic\n         *         Independent SVG drawing.\n         *\n         * @example\n         * // Use directly without a chart object.\n         * var renderer = new Highcharts.Renderer(parentNode, 600, 400);\n         *\n         * @class\n         * @name Highcharts.SVGRenderer\n         *\n         * @param {Highcharts.HTMLDOMElement} container\n         *        Where to put the SVG in the web page.\n         *\n         * @param {number} width\n         *        The width of the SVG.\n         *\n         * @param {number} height\n         *        The height of the SVG.\n         *\n         * @param {Highcharts.CSSObject} [style]\n         *        The box style, if not in styleMode\n         *\n         * @param {boolean} [forExport=false]\n         *        Whether the rendered content is intended for export.\n         *\n         * @param {boolean} [allowHTML=true]\n         *        Whether the renderer is allowed to include HTML text, which will be\n         *        projected on top of the SVG.\n         *\n         * @param {boolean} [styledMode=false]\n         *        Whether the renderer belongs to a chart that is in styled mode.\n         *        If it does, it will avoid setting presentational attributes in\n         *        some cases, but not when set explicitly through `.attr` and `.css`\n         *        etc.\n         */\n        var SVGRenderer = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function SVGRenderer(container, width, height, style, forExport, allowHTML, styledMode) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.alignedObjects = void 0;\n                /**\n                 * The root `svg` node of the renderer.\n                 *\n                 * @name Highcharts.SVGRenderer#box\n                 * @type {Highcharts.SVGDOMElement}\n                 */\n                this.box = void 0;\n                /**\n                 * The wrapper for the root `svg` node of the renderer.\n                 *\n                 * @name Highcharts.SVGRenderer#boxWrapper\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.boxWrapper = void 0;\n                this.cache = void 0;\n                this.cacheKeys = void 0;\n                this.chartIndex = void 0;\n                /**\n                 * A pointer to the `defs` node of the root SVG.\n                 *\n                 * @name Highcharts.SVGRenderer#defs\n                 * @type {Highcharts.SVGElement}\n                 */\n                this.defs = void 0;\n                this.globalAnimation = void 0;\n                this.gradients = void 0;\n                this.height = void 0;\n                this.imgCount = void 0;\n                this.isSVG = void 0;\n                this.style = void 0;\n                /**\n                 * Page url used for internal references.\n                 *\n                 * @private\n                 * @name Highcharts.SVGRenderer#url\n                 * @type {string}\n                 */\n                this.url = void 0;\n                this.width = void 0;\n                this.init(container, width, height, style, forExport, allowHTML, styledMode);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Initialize the SVGRenderer. Overridable initializer function that takes\n             * the same parameters as the constructor.\n             *\n             * @function Highcharts.SVGRenderer#init\n             *\n             * @param {Highcharts.HTMLDOMElement} container\n             * Where to put the SVG in the web page.\n             *\n             * @param {number} width\n             * The width of the SVG.\n             *\n             * @param {number} height\n             * The height of the SVG.\n             *\n             * @param {Highcharts.CSSObject} [style]\n             * The box style, if not in styleMode\n             *\n             * @param {boolean} [forExport=false]\n             * Whether the rendered content is intended for export.\n             *\n             * @param {boolean} [allowHTML=true]\n             * Whether the renderer is allowed to include HTML text, which will be\n             * projected on top of the SVG.\n             *\n             * @param {boolean} [styledMode=false]\n             * Whether the renderer belongs to a chart that is in styled mode. If it\n             * does, it will avoid setting presentational attributes in some cases, but\n             * not when set explicitly through `.attr` and `.css` etc.\n             */\n            SVGRenderer.prototype.init = function (container, width, height, style, forExport, allowHTML, styledMode) {\n                var renderer = this,\n                    boxWrapper,\n                    element,\n                    desc;\n                boxWrapper = renderer.createElement('svg')\n                    .attr({\n                    version: '1.1',\n                    'class': 'highcharts-root'\n                });\n                if (!styledMode) {\n                    boxWrapper.css(this.getStyle(style));\n                }\n                element = boxWrapper.element;\n                container.appendChild(element);\n                // Always use ltr on the container, otherwise text-anchor will be\n                // flipped and text appear outside labels, buttons, tooltip etc (#3482)\n                attr(container, 'dir', 'ltr');\n                // For browsers other than IE, add the namespace attribute (#1978)\n                if (container.innerHTML.indexOf('xmlns') === -1) {\n                    attr(element, 'xmlns', this.SVG_NS);\n                }\n                // object properties\n                renderer.isSVG = true;\n                this.box = element;\n                this.boxWrapper = boxWrapper;\n                renderer.alignedObjects = [];\n                // #24, #672, #1070\n                this.url = ((isFirefox || isWebKit) &&\n                    doc.getElementsByTagName('base').length) ?\n                    win.location.href\n                        .split('#')[0] // remove the hash\n                        .replace(/<[^>]*>/g, '') // wing cut HTML\n                        // escape parantheses and quotes\n                        .replace(/([\\('\\)])/g, '\\\\$1')\n                        // replace spaces (needed for Safari only)\n                        .replace(/ /g, '%20') :\n                    '';\n                // Add description\n                desc = this.createElement('desc').add();\n                desc.element.appendChild(doc.createTextNode('Created with Highcharts 8.1.2'));\n                renderer.defs = this.createElement('defs').add();\n                renderer.allowHTML = allowHTML;\n                renderer.forExport = forExport;\n                renderer.styledMode = styledMode;\n                renderer.gradients = {}; // Object where gradient SvgElements are stored\n                renderer.cache = {}; // Cache for numerical bounding boxes\n                renderer.cacheKeys = [];\n                renderer.imgCount = 0;\n                renderer.setSize(width, height, false);\n                // Issue 110 workaround:\n                // In Firefox, if a div is positioned by percentage, its pixel position\n                // may land between pixels. The container itself doesn't display this,\n                // but an SVG element inside this container will be drawn at subpixel\n                // precision. In order to draw sharp lines, this must be compensated\n                // for. This doesn't seem to work inside iframes though (like in\n                // jsFiddle).\n                var subPixelFix,\n                    rect;\n                if (isFirefox && container.getBoundingClientRect) {\n                    subPixelFix = function () {\n                        css(container, { left: 0, top: 0 });\n                        rect = container.getBoundingClientRect();\n                        css(container, {\n                            left: (Math.ceil(rect.left) - rect.left) + 'px',\n                            top: (Math.ceil(rect.top) - rect.top) + 'px'\n                        });\n                    };\n                    // run the fix now\n                    subPixelFix();\n                    // run it on resize\n                    renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n                }\n            };\n            /**\n             * General method for adding a definition to the SVG `defs` tag. Can be used\n             * for gradients, fills, filters etc. Styled mode only. A hook for adding\n             * general definitions to the SVG's defs tag. Definitions can be referenced\n             * from the CSS by its `id`. Read more in\n             * [gradients, shadows and patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns).\n             * Styled mode only.\n             *\n             * @function Highcharts.SVGRenderer#definition\n             *\n             * @param {Highcharts.SVGDefinitionObject} def\n             * A serialized form of an SVG definition, including children.\n             *\n             * @return {Highcharts.SVGElement}\n             * The inserted node.\n             */\n            SVGRenderer.prototype.definition = function (def) {\n                var ren = this;\n                /**\n                 * @private\n                 * @param {Highcharts.SVGDefinitionObject} config - SVG definition\n                 * @param {Highcharts.SVGElement} [parent] - parent node\n                 */\n                function recurse(config, parent) {\n                    var ret;\n                    splat(config).forEach(function (item) {\n                        var node = ren.createElement(item.tagName),\n                            attr = {};\n                        // Set attributes\n                        objectEach(item, function (val, key) {\n                            if (key !== 'tagName' &&\n                                key !== 'children' &&\n                                key !== 'textContent') {\n                                attr[key] = val;\n                            }\n                        });\n                        node.attr(attr);\n                        // Add to the tree\n                        node.add(parent || ren.defs);\n                        // Add text content\n                        if (item.textContent) {\n                            node.element.appendChild(doc.createTextNode(item.textContent));\n                        }\n                        // Recurse\n                        recurse(item.children || [], node);\n                        ret = node;\n                    });\n                    // Return last node added (on top level it's the only one)\n                    return ret;\n                }\n                return recurse(def);\n            };\n            /**\n             * Get the global style setting for the renderer.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#getStyle\n             *\n             * @param {Highcharts.CSSObject} style\n             * Style settings.\n             *\n             * @return {Highcharts.CSSObject}\n             * The style settings mixed with defaults.\n             */\n            SVGRenderer.prototype.getStyle = function (style) {\n                this.style = extend({\n                    fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", ' +\n                        'Arial, Helvetica, sans-serif',\n                    fontSize: '12px'\n                }, style);\n                return this.style;\n            };\n            /**\n             * Apply the global style on the renderer, mixed with the default styles.\n             *\n             * @function Highcharts.SVGRenderer#setStyle\n             *\n             * @param {Highcharts.CSSObject} style\n             * CSS to apply.\n             */\n            SVGRenderer.prototype.setStyle = function (style) {\n                this.boxWrapper.css(this.getStyle(style));\n            };\n            /**\n             * Detect whether the renderer is hidden. This happens when one of the\n             * parent elements has `display: none`. Used internally to detect when we\n             * needto render preliminarily in another div to get the text bounding boxes\n             * right.\n             *\n             * @function Highcharts.SVGRenderer#isHidden\n             *\n             * @return {boolean}\n             * True if it is hidden.\n             */\n            SVGRenderer.prototype.isHidden = function () {\n                return !this.boxWrapper.getBBox().width;\n            };\n            /**\n             * Destroys the renderer and its allocated members.\n             *\n             * @function Highcharts.SVGRenderer#destroy\n             *\n             * @return {null}\n             */\n            SVGRenderer.prototype.destroy = function () {\n                var renderer = this,\n                    rendererDefs = renderer.defs;\n                renderer.box = null;\n                renderer.boxWrapper = renderer.boxWrapper.destroy();\n                // Call destroy on all gradient elements\n                destroyObjectProperties(renderer.gradients || {});\n                renderer.gradients = null;\n                // Defs are null in VMLRenderer\n                // Otherwise, destroy them here.\n                if (rendererDefs) {\n                    renderer.defs = rendererDefs.destroy();\n                }\n                // Remove sub pixel fix handler (#982)\n                if (renderer.unSubPixelFix) {\n                    renderer.unSubPixelFix();\n                }\n                renderer.alignedObjects = null;\n                return null;\n            };\n            /**\n             * Create a wrapper for an SVG element. Serves as a factory for\n             * {@link SVGElement}, but this function is itself mostly called from\n             * primitive factories like {@link SVGRenderer#path}, {@link\n             * SVGRenderer#rect} or {@link SVGRenderer#text}.\n             *\n             * @function Highcharts.SVGRenderer#createElement\n             *\n             * @param {string} nodeName\n             * The node name, for example `rect`, `g` etc.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated SVGElement.\n             */\n            SVGRenderer.prototype.createElement = function (nodeName) {\n                var wrapper = new this.Element();\n                wrapper.init(this, nodeName);\n                return wrapper;\n            };\n            /**\n             * Get converted radial gradient attributes according to the radial\n             * reference. Used internally from the {@link SVGElement#colorGradient}\n             * function.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#getRadialAttr\n             */\n            SVGRenderer.prototype.getRadialAttr = function (radialReference, gradAttr) {\n                return {\n                    cx: (radialReference[0] - radialReference[2] / 2) +\n                        gradAttr.cx * radialReference[2],\n                    cy: (radialReference[1] - radialReference[2] / 2) +\n                        gradAttr.cy * radialReference[2],\n                    r: gradAttr.r * radialReference[2]\n                };\n            };\n            /**\n             * Truncate the text node contents to a given length. Used when the css\n             * width is set. If the `textOverflow` is `ellipsis`, the text is truncated\n             * character by character to the given length. If not, the text is\n             * word-wrapped line by line.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#truncate\n             *\n             * @return {boolean}\n             * True if tspan is too long.\n             */\n            SVGRenderer.prototype.truncate = function (wrapper, tspan, text, words, startAt, width, getString) {\n                var renderer = this,\n                    rotation = wrapper.rotation,\n                    str, \n                    // Word wrap can not be truncated to shorter than one word, ellipsis\n                    // text can be completely blank.\n                    minIndex = words ? 1 : 0,\n                    maxIndex = (text || words).length,\n                    currentIndex = maxIndex, \n                    // Cache the lengths to avoid checking the same twice\n                    lengths = [],\n                    updateTSpan = function (s) {\n                        if (tspan.firstChild) {\n                            tspan.removeChild(tspan.firstChild);\n                    }\n                    if (s) {\n                        tspan.appendChild(doc.createTextNode(s));\n                    }\n                }, getSubStringLength = function (charEnd, concatenatedEnd) {\n                    // charEnd is useed when finding the character-by-character\n                    // break for ellipsis, concatenatedEnd is used for word-by-word\n                    // break for word wrapping.\n                    var end = concatenatedEnd || charEnd;\n                    if (typeof lengths[end] === 'undefined') {\n                        // Modern browsers\n                        if (tspan.getSubStringLength) {\n                            // Fails with DOM exception on unit-tests/legend/members\n                            // of unknown reason. Desired width is 0, text content\n                            // is \"5\" and end is 1.\n                            try {\n                                lengths[end] = startAt +\n                                    tspan.getSubStringLength(0, words ? end + 1 : end);\n                            }\n                            catch (e) {\n                                '';\n                            }\n                            // Legacy\n                        }\n                        else if (renderer.getSpanWidth) { // #9058 jsdom\n                            updateTSpan(getString(text || words, charEnd));\n                            lengths[end] = startAt +\n                                renderer.getSpanWidth(wrapper, tspan);\n                        }\n                    }\n                    return lengths[end];\n                }, actualWidth, truncated;\n                wrapper.rotation = 0; // discard rotation when computing box\n                actualWidth = getSubStringLength(tspan.textContent.length);\n                truncated = startAt + actualWidth > width;\n                if (truncated) {\n                    // Do a binary search for the index where to truncate the text\n                    while (minIndex <= maxIndex) {\n                        currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n                        // When checking words for word-wrap, we need to build the\n                        // string and measure the subStringLength at the concatenated\n                        // word length.\n                        if (words) {\n                            str = getString(words, currentIndex);\n                        }\n                        actualWidth = getSubStringLength(currentIndex, str && str.length - 1);\n                        if (minIndex === maxIndex) {\n                            // Complete\n                            minIndex = maxIndex + 1;\n                        }\n                        else if (actualWidth > width) {\n                            // Too large. Set max index to current.\n                            maxIndex = currentIndex - 1;\n                        }\n                        else {\n                            // Within width. Set min index to current.\n                            minIndex = currentIndex;\n                        }\n                    }\n                    // If max index was 0 it means the shortest possible text was also\n                    // too large. For ellipsis that means only the ellipsis, while for\n                    // word wrap it means the whole first word.\n                    if (maxIndex === 0) {\n                        // Remove ellipsis\n                        updateTSpan('');\n                        // If the new text length is one less than the original, we don't\n                        // need the ellipsis\n                    }\n                    else if (!(text && maxIndex === text.length - 1)) {\n                        updateTSpan(str || getString(text || words, currentIndex));\n                    }\n                }\n                // When doing line wrapping, prepare for the next line by removing the\n                // items from this line.\n                if (words) {\n                    words.splice(0, currentIndex);\n                }\n                wrapper.actualWidth = actualWidth;\n                wrapper.rotation = rotation; // Apply rotation again.\n                return truncated;\n            };\n            /**\n             * Parse a simple HTML string into SVG tspans. Called internally when text\n             * is set on an SVGElement. The function supports a subset of HTML tags, CSS\n             * text features like `width`, `text-overflow`, `white-space`, and also\n             * attributes like `href` and `style`.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#buildText\n             *\n             * @param {Highcharts.SVGElement} wrapper\n             * The parent SVGElement.\n             */\n            SVGRenderer.prototype.buildText = function (wrapper) {\n                var textNode = wrapper.element, renderer = this, forExport = renderer.forExport, textStr = pick(wrapper.textStr, '').toString(), hasMarkup = textStr.indexOf('<') !== -1, lines, childNodes = textNode.childNodes, truncated, parentX = attr(textNode, 'x'), textStyles = wrapper.styles, width = wrapper.textWidth, textLineHeight = textStyles && textStyles.lineHeight, textOutline = textStyles && textStyles.textOutline, ellipsis = textStyles && textStyles.textOverflow === 'ellipsis', noWrap = textStyles && textStyles.whiteSpace === 'nowrap', fontSize = textStyles && textStyles.fontSize, textCache, isSubsequentLine, i = childNodes.length, tempParent = width && !wrapper.added && this.box, getLineHeight = function (tspan) {\n                        var fontSizeStyle;\n                    if (!renderer.styledMode) {\n                        fontSizeStyle =\n                            /(px|em)$/.test(tspan && tspan.style.fontSize) ?\n                                tspan.style.fontSize :\n                                (fontSize || renderer.style.fontSize || 12);\n                    }\n                    return textLineHeight ?\n                        pInt(textLineHeight) :\n                        renderer.fontMetrics(fontSizeStyle, \n                        // Get the computed size from parent if not explicit\n                        (tspan.getAttribute('style') ? tspan : textNode)).h;\n                }, unescapeEntities = function (inputStr, except) {\n                    objectEach(renderer.escapes, function (value, key) {\n                        if (!except || except.indexOf(value) === -1) {\n                            inputStr = inputStr.toString().replace(new RegExp(value, 'g'), key);\n                        }\n                    });\n                    return inputStr;\n                }, parseAttribute = function (s, attr) {\n                    var start,\n                        delimiter;\n                    start = s.indexOf('<');\n                    s = s.substring(start, s.indexOf('>') - start);\n                    start = s.indexOf(attr + '=');\n                    if (start !== -1) {\n                        start = start + attr.length + 1;\n                        delimiter = s.charAt(start);\n                        if (delimiter === '\"' || delimiter === \"'\") { // eslint-disable-line quotes\n                            s = s.substring(start + 1);\n                            return s.substring(0, s.indexOf(delimiter));\n                        }\n                    }\n                };\n                var regexMatchBreaks = /<br.*?>/g;\n                // The buildText code is quite heavy, so if we're not changing something\n                // that affects the text, skip it (#6113).\n                textCache = [\n                    textStr,\n                    ellipsis,\n                    noWrap,\n                    textLineHeight,\n                    textOutline,\n                    fontSize,\n                    width\n                ].join(',');\n                if (textCache === wrapper.textCache) {\n                    return;\n                }\n                wrapper.textCache = textCache;\n                // Remove old text\n                while (i--) {\n                    textNode.removeChild(childNodes[i]);\n                }\n                // Skip tspans, add text directly to text node. The forceTSpan is a hook\n                // used in text outline hack.\n                if (!hasMarkup &&\n                    !textOutline &&\n                    !ellipsis &&\n                    !width &&\n                    (textStr.indexOf(' ') === -1 ||\n                        (noWrap && !regexMatchBreaks.test(textStr)))) {\n                    textNode.appendChild(doc.createTextNode(unescapeEntities(textStr)));\n                    // Complex strings, add more logic\n                }\n                else {\n                    if (tempParent) {\n                        // attach it to the DOM to read offset width\n                        tempParent.appendChild(textNode);\n                    }\n                    if (hasMarkup) {\n                        lines = renderer.styledMode ? (textStr\n                            .replace(/<(b|strong)>/g, '<span class=\"highcharts-strong\">')\n                            .replace(/<(i|em)>/g, '<span class=\"highcharts-emphasized\">')) : (textStr\n                            .replace(/<(b|strong)>/g, '<span style=\"font-weight:bold\">')\n                            .replace(/<(i|em)>/g, '<span style=\"font-style:italic\">'));\n                        lines = lines\n                            .replace(/<a/g, '<span')\n                            .replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\n                            .split(regexMatchBreaks);\n                    }\n                    else {\n                        lines = [textStr];\n                    }\n                    // Trim empty lines (#5261)\n                    lines = lines.filter(function (line) {\n                        return line !== '';\n                    });\n                    // build the lines\n                    lines.forEach(function (line, lineNo) {\n                        var spans,\n                            spanNo = 0,\n                            lineLength = 0;\n                        line = line\n                            // Trim to prevent useless/costly process on the spaces\n                            // (#5258)\n                            .replace(/^\\s+|\\s+$/g, '')\n                            .replace(/<span/g, '|||<span')\n                            .replace(/<\\/span>/g, '</span>|||');\n                        spans = line.split('|||');\n                        spans.forEach(function buildTextSpans(span) {\n                            if (span !== '' || spans.length === 1) {\n                                var attributes = {},\n                                    tspan = doc.createElementNS(renderer.SVG_NS, 'tspan'),\n                                    a,\n                                    classAttribute,\n                                    styleAttribute, // #390\n                                    hrefAttribute;\n                                classAttribute = parseAttribute(span, 'class');\n                                if (classAttribute) {\n                                    attr(tspan, 'class', classAttribute);\n                                }\n                                styleAttribute = parseAttribute(span, 'style');\n                                if (styleAttribute) {\n                                    styleAttribute = styleAttribute.replace(/(;| |^)color([ :])/, '$1fill$2');\n                                    attr(tspan, 'style', styleAttribute);\n                                }\n                                // For anchors, wrap the tspan in an <a> tag and apply\n                                // the href attribute as is (#13559). Not for export\n                                // (#1529)\n                                hrefAttribute = parseAttribute(span, 'href');\n                                if (hrefAttribute && !forExport) {\n                                    if (\n                                    // Stop JavaScript links, vulnerable to XSS\n                                    hrefAttribute.split(':')[0].toLowerCase()\n                                        .indexOf('javascript') === -1) {\n                                        a = doc.createElementNS(renderer.SVG_NS, 'a');\n                                        attr(a, 'href', hrefAttribute);\n                                        attr(tspan, 'class', 'highcharts-anchor');\n                                        a.appendChild(tspan);\n                                        if (!renderer.styledMode) {\n                                            css(tspan, { cursor: 'pointer' });\n                                        }\n                                    }\n                                }\n                                // Strip away unsupported HTML tags (#7126)\n                                span = unescapeEntities(span.replace(/<[a-zA-Z\\/](.|\\n)*?>/g, '') || ' ');\n                                // Nested tags aren't supported, and cause crash in\n                                // Safari (#1596)\n                                if (span !== ' ') {\n                                    // add the text node\n                                    tspan.appendChild(doc.createTextNode(span));\n                                    // First span in a line, align it to the left\n                                    if (!spanNo) {\n                                        if (lineNo && parentX !== null) {\n                                            attributes.x = parentX;\n                                        }\n                                    }\n                                    else {\n                                        attributes.dx = 0; // #16\n                                    }\n                                    // add attributes\n                                    attr(tspan, attributes);\n                                    // Append it\n                                    textNode.appendChild(a || tspan);\n                                    // first span on subsequent line, add the line\n                                    // height\n                                    if (!spanNo && isSubsequentLine) {\n                                        // allow getting the right offset height in\n                                        // exporting in IE\n                                        if (!svg && forExport) {\n                                            css(tspan, { display: 'block' });\n                                        }\n                                        // Set the line height based on the font size of\n                                        // either the text element or the tspan element\n                                        attr(tspan, 'dy', getLineHeight(tspan));\n                                    }\n                                    // Check width and apply soft breaks or ellipsis\n                                    if (width) {\n                                        var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n                                            hasWhiteSpace = !noWrap && (spans.length > 1 ||\n                                                lineNo ||\n                                                words.length > 1),\n                                            wrapLineNo = 0,\n                                            dy = getLineHeight(tspan);\n                                        if (ellipsis) {\n                                            truncated = renderer.truncate(wrapper, tspan, span, void 0, 0, \n                                            // Target width\n                                            Math.max(0, \n                                            // Substract the font face to make\n                                            // room for the ellipsis itself\n                                            width - parseInt(fontSize || 12, 10)), \n                                            // Build the text to test for\n                                            function (text, currentIndex) {\n                                                return text.substring(0, currentIndex) + '\\u2026';\n                                            });\n                                        }\n                                        else if (hasWhiteSpace) {\n                                            while (words.length) {\n                                                // For subsequent lines, create tspans\n                                                // with the same style attributes as the\n                                                // parent text node.\n                                                if (words.length &&\n                                                    !noWrap &&\n                                                    wrapLineNo > 0) {\n                                                    tspan = doc.createElementNS(SVG_NS, 'tspan');\n                                                    attr(tspan, {\n                                                        dy: dy,\n                                                        x: parentX\n                                                    });\n                                                    if (styleAttribute) { // #390\n                                                        attr(tspan, 'style', styleAttribute);\n                                                    }\n                                                    // Start by appending the full\n                                                    // remaining text\n                                                    tspan.appendChild(doc.createTextNode(words.join(' ')\n                                                        .replace(/- /g, '-')));\n                                                    textNode.appendChild(tspan);\n                                                }\n                                                // For each line, truncate the remaining\n                                                // words into the line length.\n                                                renderer.truncate(wrapper, tspan, null, words, wrapLineNo === 0 ? lineLength : 0, width, \n                                                // Build the text to test for\n                                                function (text, currentIndex) {\n                                                    return words\n                                                        .slice(0, currentIndex)\n                                                        .join(' ')\n                                                        .replace(/- /g, '-');\n                                                });\n                                                lineLength = wrapper.actualWidth;\n                                                wrapLineNo++;\n                                            }\n                                        }\n                                    }\n                                    spanNo++;\n                                }\n                            }\n                        });\n                        // To avoid beginning lines that doesn't add to the textNode\n                        // (#6144)\n                        isSubsequentLine = (isSubsequentLine ||\n                            textNode.childNodes.length);\n                    });\n                    if (ellipsis && truncated) {\n                        wrapper.attr('title', unescapeEntities(wrapper.textStr || '', ['&lt;', '&gt;']) // #7179\n                        );\n                    }\n                    if (tempParent) {\n                        tempParent.removeChild(textNode);\n                    }\n                    // Apply the text outline\n                    if (isString(textOutline) && wrapper.applyTextOutline) {\n                        wrapper.applyTextOutline(textOutline);\n                    }\n                }\n            };\n            /**\n             * Returns white for dark colors and black for bright colors.\n             *\n             * @function Highcharts.SVGRenderer#getContrast\n             *\n             * @param {Highcharts.ColorString} rgba\n             * The color to get the contrast for.\n             *\n             * @return {Highcharts.ColorString}\n             * The contrast color, either `#000000` or `#FFFFFF`.\n             */\n            SVGRenderer.prototype.getContrast = function (rgba) {\n                rgba = Color.parse(rgba).rgba;\n                // The threshold may be discussed. Here's a proposal for adding\n                // different weight to the color channels (#6216)\n                rgba[0] *= 1; // red\n                rgba[1] *= 1.2; // green\n                rgba[2] *= 0.5; // blue\n                return rgba[0] + rgba[1] + rgba[2] >\n                    1.8 * 255 ?\n                    '#000000' :\n                    '#FFFFFF';\n            };\n            /**\n             * Create a button with preset states.\n             *\n             * @function Highcharts.SVGRenderer#button\n             *\n             * @param {string} text\n             * The text or HTML to draw.\n             *\n             * @param {number} x\n             * The x position of the button's left side.\n             *\n             * @param {number} y\n             * The y position of the button's top side.\n             *\n             * @param {Highcharts.EventCallbackFunction<Highcharts.SVGElement>} callback\n             * The function to execute on button click or touch.\n             *\n             * @param {Highcharts.SVGAttributes} [normalState]\n             * SVG attributes for the normal state.\n             *\n             * @param {Highcharts.SVGAttributes} [hoverState]\n             * SVG attributes for the hover state.\n             *\n             * @param {Highcharts.SVGAttributes} [pressedState]\n             * SVG attributes for the pressed state.\n             *\n             * @param {Highcharts.SVGAttributes} [disabledState]\n             * SVG attributes for the disabled state.\n             *\n             * @param {Highcharts.SymbolKeyValue} [shape=rect]\n             * The shape type.\n             *\n             * @param {boolean} [useHTML=false]\n             * Wether to use HTML to render the label.\n             *\n             * @return {Highcharts.SVGElement}\n             * The button element.\n             */\n            SVGRenderer.prototype.button = function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape, useHTML) {\n                var label = this.label(text,\n                    x,\n                    y,\n                    shape,\n                    void 0,\n                    void 0,\n                    useHTML,\n                    void 0, 'button'),\n                    curState = 0,\n                    styledMode = this.styledMode,\n                    userNormalStyle = normalState && normalState.style || {};\n                // Remove stylable attributes\n                if (normalState && normalState.style) {\n                    delete normalState.style;\n                }\n                // Default, non-stylable attributes\n                label.attr(merge({ padding: 8, r: 2 }, normalState));\n                if (!styledMode) {\n                    // Presentational\n                    var normalStyle,\n                        hoverStyle,\n                        pressedStyle,\n                        disabledStyle;\n                    // Normal state - prepare the attributes\n                    normalState = merge({\n                        fill: '#f7f7f7',\n                        stroke: '#cccccc',\n                        'stroke-width': 1,\n                        style: {\n                            color: '#333333',\n                            cursor: 'pointer',\n                            fontWeight: 'normal'\n                        }\n                    }, {\n                        style: userNormalStyle\n                    }, normalState);\n                    normalStyle = normalState.style;\n                    delete normalState.style;\n                    // Hover state\n                    hoverState = merge(normalState, {\n                        fill: '#e6e6e6'\n                    }, hoverState);\n                    hoverStyle = hoverState.style;\n                    delete hoverState.style;\n                    // Pressed state\n                    pressedState = merge(normalState, {\n                        fill: '#e6ebf5',\n                        style: {\n                            color: '#000000',\n                            fontWeight: 'bold'\n                        }\n                    }, pressedState);\n                    pressedStyle = pressedState.style;\n                    delete pressedState.style;\n                    // Disabled state\n                    disabledState = merge(normalState, {\n                        style: {\n                            color: '#cccccc'\n                        }\n                    }, disabledState);\n                    disabledStyle = disabledState.style;\n                    delete disabledState.style;\n                }\n                // Add the events. IE9 and IE10 need mouseover and mouseout to funciton\n                // (#667).\n                addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function () {\n                    if (curState !== 3) {\n                        label.setState(1);\n                    }\n                });\n                addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function () {\n                    if (curState !== 3) {\n                        label.setState(curState);\n                    }\n                });\n                label.setState = function (state) {\n                    // Hover state is temporary, don't record it\n                    if (state !== 1) {\n                        label.state = curState = state;\n                    }\n                    // Update visuals\n                    label\n                        .removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n                        .addClass('highcharts-button-' +\n                        ['normal', 'hover', 'pressed', 'disabled'][state || 0]);\n                    if (!styledMode) {\n                        label\n                            .attr([\n                            normalState,\n                            hoverState,\n                            pressedState,\n                            disabledState\n                        ][state || 0])\n                            .css([\n                            normalStyle,\n                            hoverStyle,\n                            pressedStyle,\n                            disabledStyle\n                        ][state || 0]);\n                    }\n                };\n                // Presentational attributes\n                if (!styledMode) {\n                    label\n                        .attr(normalState)\n                        .css(extend({ cursor: 'default' }, normalStyle));\n                }\n                return label\n                    .on('click', function (e) {\n                    if (curState !== 3) {\n                        callback.call(label, e);\n                    }\n                });\n            };\n            /**\n             * Make a straight line crisper by not spilling out to neighbour pixels.\n             *\n             * @function Highcharts.SVGRenderer#crispLine\n             *\n             * @param {Highcharts.SVGPathArray} points\n             *        The original points on the format `[['M', 0, 0], ['L', 100, 0]]`.\n             *\n             * @param {number} width\n             *        The width of the line.\n             *\n             * @param {string} roundingFunction\n             *        The rounding function name on the `Math` object, can be one of\n             *        `round`, `floor` or `ceil`.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The original points array, but modified to render crisply.\n             */\n            SVGRenderer.prototype.crispLine = function (points, width, roundingFunction) {\n                if (roundingFunction === void 0) { roundingFunction = 'round'; }\n                var start = points[0];\n                var end = points[1];\n                // Normalize to a crisp line\n                if (start[1] === end[1]) {\n                    // Substract due to #1129. Now bottom and left axis gridlines behave\n                    // the same.\n                    start[1] = end[1] =\n                        Math[roundingFunction](start[1]) - (width % 2 / 2);\n                }\n                if (start[2] === end[2]) {\n                    start[2] = end[2] =\n                        Math[roundingFunction](start[2]) + (width % 2 / 2);\n                }\n                return points;\n            };\n            /**\n             * Draw a path, wraps the SVG `path` element.\n             *\n             * @sample highcharts/members/renderer-path-on-chart/\n             *         Draw a path in a chart\n             * @sample highcharts/members/renderer-path/\n             *         Draw a path independent from a chart\n             *\n             * @example\n             * var path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n             *     .attr({ stroke: '#ff00ff' })\n             *     .add();\n             *\n             * @function Highcharts.SVGRenderer#path\n             *\n             * @param {Highcharts.SVGPathArray} [path]\n             * An SVG path definition in array form.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             *\n             */ /**\n            * Draw a path, wraps the SVG `path` element.\n            *\n            * @function Highcharts.SVGRenderer#path\n            *\n            * @param {Highcharts.SVGAttributes} [attribs]\n            * The initial attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.path = function (path) {\n                var attribs = (this.styledMode ? {} : {\n                        fill: 'none'\n                    });\n                if (isArray(path)) {\n                    attribs.d = path;\n                }\n                else if (isObject(path)) { // attributes\n                    extend(attribs, path);\n                }\n                return this.createElement('path').attr(attribs);\n            };\n            /**\n             * Draw a circle, wraps the SVG `circle` element.\n             *\n             * @sample highcharts/members/renderer-circle/\n             *         Drawing a circle\n             *\n             * @function Highcharts.SVGRenderer#circle\n             *\n             * @param {number} [x]\n             * The center x position.\n             *\n             * @param {number} [y]\n             * The center y position.\n             *\n             * @param {number} [r]\n             * The radius.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw a circle, wraps the SVG `circle` element.\n            *\n            * @function Highcharts.SVGRenderer#circle\n            *\n            * @param {Highcharts.SVGAttributes} [attribs]\n            * The initial attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.circle = function (x, y, r) {\n                var attribs = (isObject(x) ?\n                        x :\n                        typeof x === 'undefined' ? {} : { x: x, y: y, r: r }), wrapper = this.createElement('circle');\n                // Setting x or y translates to cx and cy\n                wrapper.xSetter = wrapper.ySetter = function (value, key, element) {\n                    element.setAttribute('c' + key, value);\n                };\n                return wrapper.attr(attribs);\n            };\n            /**\n             * Draw and return an arc.\n             *\n             * @sample highcharts/members/renderer-arc/\n             *         Drawing an arc\n             *\n             * @function Highcharts.SVGRenderer#arc\n             *\n             * @param {number} [x=0]\n             * Center X position.\n             *\n             * @param {number} [y=0]\n             * Center Y position.\n             *\n             * @param {number} [r=0]\n             * The outer radius' of the arc.\n             *\n             * @param {number} [innerR=0]\n             * Inner radius like used in donut charts.\n             *\n             * @param {number} [start=0]\n             * The starting angle of the arc in radians, where 0 is to the right and\n             * `-Math.PI/2` is up.\n             *\n             * @param {number} [end=0]\n             * The ending angle of the arc in radians, where 0 is to the right and\n             * `-Math.PI/2` is up.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw and return an arc. Overloaded function that takes arguments object.\n            *\n            * @function Highcharts.SVGRenderer#arc\n            *\n            * @param {Highcharts.SVGAttributes} attribs\n            * Initial SVG attributes.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.arc = function (x, y, r, innerR, start, end) {\n                var arc,\n                    options;\n                if (isObject(x)) {\n                    options = x;\n                    y = options.y;\n                    r = options.r;\n                    innerR = options.innerR;\n                    start = options.start;\n                    end = options.end;\n                    x = options.x;\n                }\n                else {\n                    options = {\n                        innerR: innerR,\n                        start: start,\n                        end: end\n                    };\n                }\n                // Arcs are defined as symbols for the ability to set\n                // attributes in attr and animate\n                arc = this.symbol('arc', x, y, r, r, options);\n                arc.r = r; // #959\n                return arc;\n            };\n            /**\n             * Draw and return a rectangle.\n             *\n             * @function Highcharts.SVGRenderer#rect\n             *\n             * @param {number} [x]\n             * Left position.\n             *\n             * @param {number} [y]\n             * Top position.\n             *\n             * @param {number} [width]\n             * Width of the rectangle.\n             *\n             * @param {number} [height]\n             * Height of the rectangle.\n             *\n             * @param {number} [r]\n             * Border corner radius.\n             *\n             * @param {number} [strokeWidth]\n             * A stroke width can be supplied to allow crisp drawing.\n             *\n             * @return {Highcharts.SVGElement}\n             * The generated wrapper element.\n             */ /**\n            * Draw and return a rectangle.\n            *\n            * @sample highcharts/members/renderer-rect-on-chart/\n            *         Draw a rectangle in a chart\n            * @sample highcharts/members/renderer-rect/\n            *         Draw a rectangle independent from a chart\n            *\n            * @function Highcharts.SVGRenderer#rect\n            *\n            * @param {Highcharts.SVGAttributes} [attributes]\n            * General SVG attributes for the rectangle.\n            *\n            * @return {Highcharts.SVGElement}\n            * The generated wrapper element.\n            */\n            SVGRenderer.prototype.rect = function (x, y, width, height, r, strokeWidth) {\n                r = isObject(x) ? x.r : r;\n                var wrapper = this.createElement('rect'),\n                    attribs = isObject(x) ?\n                        x :\n                        typeof x === 'undefined' ?\n                            {} :\n                            {\n                                x: x,\n                                y: y,\n                                width: Math.max(width, 0),\n                                height: Math.max(height, 0)\n                            };\n                if (!this.styledMode) {\n                    if (typeof strokeWidth !== 'undefined') {\n                        attribs.strokeWidth = strokeWidth;\n                        attribs = wrapper.crisp(attribs);\n                    }\n                    attribs.fill = 'none';\n                }\n                if (r) {\n                    attribs.r = r;\n                }\n                wrapper.rSetter = function (value, key, element) {\n                    wrapper.r = value;\n                    attr(element, {\n                        rx: value,\n                        ry: value\n                    });\n                };\n                wrapper.rGetter = function () {\n                    return wrapper.r;\n                };\n                return wrapper.attr(attribs);\n            };\n            /**\n             * Resize the {@link SVGRenderer#box} and re-align all aligned child\n             * elements.\n             *\n             * @sample highcharts/members/renderer-g/\n             *         Show and hide grouped objects\n             *\n             * @function Highcharts.SVGRenderer#setSize\n             *\n             * @param {number} width\n             * The new pixel width.\n             *\n             * @param {number} height\n             * The new pixel height.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animate=true]\n             * Whether and how to animate.\n             */\n            SVGRenderer.prototype.setSize = function (width, height, animate) {\n                var renderer = this,\n                    alignedObjects = renderer.alignedObjects,\n                    i = alignedObjects.length;\n                renderer.width = width;\n                renderer.height = height;\n                renderer.boxWrapper.animate({\n                    width: width,\n                    height: height\n                }, {\n                    step: function () {\n                        this.attr({\n                            viewBox: '0 0 ' + this.attr('width') + ' ' +\n                                this.attr('height')\n                        });\n                    },\n                    duration: pick(animate, true) ? void 0 : 0\n                });\n                while (i--) {\n                    alignedObjects[i].align();\n                }\n            };\n            /**\n             * Create and return an svg group element. Child\n             * {@link Highcharts.SVGElement} objects are added to the group by using the\n             * group as the first parameter in {@link Highcharts.SVGElement#add|add()}.\n             *\n             * @function Highcharts.SVGRenderer#g\n             *\n             * @param {string} [name]\n             *        The group will be given a class name of `highcharts-{name}`. This\n             *        can be used for styling and scripting.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             */\n            SVGRenderer.prototype.g = function (name) {\n                var elem = this.createElement('g');\n                return name ?\n                    elem.attr({ 'class': 'highcharts-' + name }) :\n                    elem;\n            };\n            /**\n             * Display an image.\n             *\n             * @sample highcharts/members/renderer-image-on-chart/\n             *         Add an image in a chart\n             * @sample highcharts/members/renderer-image/\n             *         Add an image independent of a chart\n             *\n             * @function Highcharts.SVGRenderer#image\n             *\n             * @param {string} src\n             *        The image source.\n             *\n             * @param {number} [x]\n             *        The X position.\n             *\n             * @param {number} [y]\n             *        The Y position.\n             *\n             * @param {number} [width]\n             *        The image width. If omitted, it defaults to the image file width.\n             *\n             * @param {number} [height]\n             *        The image height. If omitted it defaults to the image file\n             *        height.\n             *\n             * @param {Function} [onload]\n             *        Event handler for image load.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated wrapper element.\n             */\n            SVGRenderer.prototype.image = function (src, x, y, width, height, onload) {\n                var attribs = { preserveAspectRatio: 'none' }, elemWrapper, dummy, setSVGImageSource = function (el, src) {\n                        // Set the href in the xlink namespace\n                        if (el.setAttributeNS) {\n                            el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', src);\n                    }\n                    else {\n                        // could be exporting in IE\n                        // using href throws \"not supported\" in ie7 and under,\n                        // requries regex shim to fix later\n                        el.setAttribute('hc-svg-href', src);\n                    }\n                }, onDummyLoad = function (e) {\n                    setSVGImageSource(elemWrapper.element, src);\n                    onload.call(elemWrapper, e);\n                };\n                // optional properties\n                if (arguments.length > 1) {\n                    extend(attribs, {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                }\n                elemWrapper = this.createElement('image').attr(attribs);\n                // Add load event if supplied\n                if (onload) {\n                    // We have to use a dummy HTML image since IE support for SVG image\n                    // load events is very buggy. First set a transparent src, wait for\n                    // dummy to load, and then add the real src to the SVG image.\n                    setSVGImageSource(elemWrapper.element, 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' /* eslint-disable-line */);\n                    dummy = new win.Image();\n                    addEvent(dummy, 'load', onDummyLoad);\n                    dummy.src = src;\n                    if (dummy.complete) {\n                        onDummyLoad({});\n                    }\n                }\n                else {\n                    setSVGImageSource(elemWrapper.element, src);\n                }\n                return elemWrapper;\n            };\n            /**\n             * Draw a symbol out of pre-defined shape paths from\n             * {@link SVGRenderer#symbols}.\n             * It is used in Highcharts for point makers, which cake a `symbol` option,\n             * and label and button backgrounds like in the tooltip and stock flags.\n             *\n             * @function Highcharts.SVGRenderer#symbol\n             *\n             * @param {string} symbol\n             * The symbol name.\n             *\n             * @param {number} [x]\n             * The X coordinate for the top left position.\n             *\n             * @param {number} [y]\n             * The Y coordinate for the top left position.\n             *\n             * @param {number} [width]\n             * The pixel width.\n             *\n             * @param {number} [height]\n             * The pixel height.\n             *\n             * @param {Highcharts.SymbolOptionsObject} [options]\n             * Additional options, depending on the actual symbol drawn.\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            SVGRenderer.prototype.symbol = function (symbol, x, y, width, height, options) {\n                var ren = this,\n                    obj,\n                    imageRegex = /^url\\((.*?)\\)$/,\n                    isImage = imageRegex.test(symbol),\n                    sym = (!isImage && (this.symbols[symbol] ? symbol : 'circle')), \n                    // get the symbol definition function\n                    symbolFn = (sym && this.symbols[sym]),\n                    path,\n                    imageSrc,\n                    centerImage;\n                if (symbolFn) {\n                    // Check if there's a path defined for this symbol\n                    if (typeof x === 'number') {\n                        path = symbolFn.call(this.symbols, Math.round(x || 0), Math.round(y || 0), width || 0, height || 0, options);\n                    }\n                    obj = this.path(path);\n                    if (!ren.styledMode) {\n                        obj.attr('fill', 'none');\n                    }\n                    // expando properties for use in animate and attr\n                    extend(obj, {\n                        symbolName: sym,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    });\n                    if (options) {\n                        extend(obj, options);\n                    }\n                    // Image symbols\n                }\n                else if (isImage) {\n                    imageSrc = symbol.match(imageRegex)[1];\n                    // Create the image synchronously, add attribs async\n                    obj = this.image(imageSrc);\n                    // The image width is not always the same as the symbol width. The\n                    // image may be centered within the symbol, as is the case when\n                    // image shapes are used as label backgrounds, for example in flags.\n                    obj.imgwidth = pick(symbolSizes[imageSrc] && symbolSizes[imageSrc].width, options && options.width);\n                    obj.imgheight = pick(symbolSizes[imageSrc] && symbolSizes[imageSrc].height, options && options.height);\n                    /**\n                     * Set the size and position\n                     */\n                    centerImage = function () {\n                        obj.attr({\n                            width: obj.width,\n                            height: obj.height\n                        });\n                    };\n                    /**\n                     * Width and height setters that take both the image's physical size\n                     * and the label size into consideration, and translates the image\n                     * to center within the label.\n                     */\n                    ['width', 'height'].forEach(function (key) {\n                        obj[key + 'Setter'] = function (value, key) {\n                            var attribs = {}, imgSize = this['img' + key], trans = key === 'width' ? 'translateX' : 'translateY';\n                            this[key] = value;\n                            if (defined(imgSize)) {\n                                // Scale and center the image within its container.\n                                // The name `backgroundSize` is taken from the CSS spec,\n                                // but the value `within` is made up. Other possible\n                                // values in the spec, `cover` and `contain`, can be\n                                // implemented if needed.\n                                if (options &&\n                                    options.backgroundSize === 'within' &&\n                                    this.width &&\n                                    this.height) {\n                                    imgSize = Math.round(imgSize * Math.min(this.width / this.imgwidth, this.height / this.imgheight));\n                                }\n                                if (this.element) {\n                                    this.element.setAttribute(key, imgSize);\n                                }\n                                if (!this.alignByTranslate) {\n                                    attribs[trans] = ((this[key] || 0) - imgSize) / 2;\n                                    this.attr(attribs);\n                                }\n                            }\n                        };\n                    });\n                    if (defined(x)) {\n                        obj.attr({\n                            x: x,\n                            y: y\n                        });\n                    }\n                    obj.isImg = true;\n                    if (defined(obj.imgwidth) && defined(obj.imgheight)) {\n                        centerImage();\n                    }\n                    else {\n                        // Initialize image to be 0 size so export will still function\n                        // if there's no cached sizes.\n                        obj.attr({ width: 0, height: 0 });\n                        // Create a dummy JavaScript image to get the width and height.\n                        createElement('img', {\n                            onload: function () {\n                                var chart = charts[ren.chartIndex];\n                                // Special case for SVGs on IE11, the width is not\n                                // accessible until the image is part of the DOM\n                                // (#2854).\n                                if (this.width === 0) {\n                                    css(this, {\n                                        position: 'absolute',\n                                        top: '-999em'\n                                    });\n                                    doc.body.appendChild(this);\n                                }\n                                // Center the image\n                                symbolSizes[imageSrc] = {\n                                    width: this.width,\n                                    height: this.height\n                                };\n                                obj.imgwidth = this.width;\n                                obj.imgheight = this.height;\n                                if (obj.element) {\n                                    centerImage();\n                                }\n                                // Clean up after #2854 workaround.\n                                if (this.parentNode) {\n                                    this.parentNode.removeChild(this);\n                                }\n                                // Fire the load event when all external images are\n                                // loaded\n                                ren.imgCount--;\n                                if (!ren.imgCount && chart && !chart.hasLoaded) {\n                                    chart.onload();\n                                }\n                            },\n                            src: imageSrc\n                        });\n                        this.imgCount++;\n                    }\n                }\n                return obj;\n            };\n            /**\n             * Define a clipping rectangle. The clipping rectangle is later applied\n             * to {@link SVGElement} objects through the {@link SVGElement#clip}\n             * function.\n             *\n             * @example\n             * var circle = renderer.circle(100, 100, 100)\n             *     .attr({ fill: 'red' })\n             *     .add();\n             * var clipRect = renderer.clipRect(100, 100, 100, 100);\n             *\n             * // Leave only the lower right quarter visible\n             * circle.clip(clipRect);\n             *\n             * @function Highcharts.SVGRenderer#clipRect\n             *\n             * @param {number} [x]\n             *\n             * @param {number} [y]\n             *\n             * @param {number} [width]\n             *\n             * @param {number} [height]\n             *\n             * @return {Highcharts.ClipRectElement}\n             *         A clipping rectangle.\n             */\n            SVGRenderer.prototype.clipRect = function (x, y, width, height) {\n                var wrapper, \n                    // Add a hyphen at the end to avoid confusion in testing indexes\n                    // -1 and -10, -11 etc (#6550)\n                    id = uniqueKey() + '-', clipPath = this.createElement('clipPath').attr({\n                        id: id\n                    }).add(this.defs);\n                wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n                wrapper.id = id;\n                wrapper.clipPath = clipPath;\n                wrapper.count = 0;\n                return wrapper;\n            };\n            /**\n             * Draw text. The text can contain a subset of HTML, like spans and anchors\n             * and some basic text styling of these. For more advanced features like\n             * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n             * To update the text after render, run `text.attr({ text: 'New text' })`.\n             *\n             * @sample highcharts/members/renderer-text-on-chart/\n             *         Annotate the chart freely\n             * @sample highcharts/members/renderer-on-chart/\n             *         Annotate with a border and in response to the data\n             * @sample highcharts/members/renderer-text/\n             *         Formatted text\n             *\n             * @function Highcharts.SVGRenderer#text\n             *\n             * @param {string} [str]\n             * The text of (subset) HTML to draw.\n             *\n             * @param {number} [x]\n             * The x position of the text's lower left corner.\n             *\n             * @param {number} [y]\n             * The y position of the text's lower left corner.\n             *\n             * @param {boolean} [useHTML=false]\n             * Use HTML to render the text.\n             *\n             * @return {Highcharts.SVGElement}\n             * The text object.\n             */\n            SVGRenderer.prototype.text = function (str, x, y, useHTML) {\n                // declare variables\n                var renderer = this,\n                    wrapper,\n                    attribs = {};\n                if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n                    return renderer.html(str, x, y);\n                }\n                attribs.x = Math.round(x || 0); // X always needed for line-wrap logic\n                if (y) {\n                    attribs.y = Math.round(y);\n                }\n                if (defined(str)) {\n                    attribs.text = str;\n                }\n                wrapper = renderer.createElement('text')\n                    .attr(attribs);\n                if (!useHTML) {\n                    wrapper.xSetter = function (value, key, element) {\n                        var tspans = element.getElementsByTagName('tspan'),\n                            tspan,\n                            parentVal = element.getAttribute(key),\n                            i;\n                        for (i = 0; i < tspans.length; i++) {\n                            tspan = tspans[i];\n                            // If the x values are equal, the tspan represents a\n                            // linebreak\n                            if (tspan.getAttribute(key) === parentVal) {\n                                tspan.setAttribute(key, value);\n                            }\n                        }\n                        element.setAttribute(key, value);\n                    };\n                }\n                return wrapper;\n            };\n            /**\n             * Utility to return the baseline offset and total line height from the font\n             * size.\n             *\n             * @function Highcharts.SVGRenderer#fontMetrics\n             *\n             * @param {number|string} [fontSize]\n             *        The current font size to inspect. If not given, the font size\n             *        will be found from the DOM element.\n             *\n             * @param {Highcharts.SVGElement|Highcharts.SVGDOMElement} [elem]\n             *        The element to inspect for a current font size.\n             *\n             * @return {Highcharts.FontMetricsObject}\n             *         The font metrics.\n             */\n            SVGRenderer.prototype.fontMetrics = function (fontSize, elem) {\n                var lineHeight,\n                    baseline;\n                if ((this.styledMode || !/px/.test(fontSize)) &&\n                    win.getComputedStyle // old IE doesn't support it\n                ) {\n                    fontSize = elem && SVGElement.prototype.getStyle.call(elem, 'font-size');\n                }\n                else {\n                    fontSize = fontSize ||\n                        // When the elem is a DOM element (#5932)\n                        (elem && elem.style && elem.style.fontSize) ||\n                        // Fall back on the renderer style default\n                        (this.style && this.style.fontSize);\n                }\n                // Handle different units\n                if (/px/.test(fontSize)) {\n                    fontSize = pInt(fontSize);\n                }\n                else {\n                    fontSize = 12;\n                }\n                // Empirical values found by comparing font size and bounding box\n                // height. Applies to the default font family.\n                // https://jsfiddle.net/highcharts/7xvn7/\n                lineHeight = fontSize < 24 ? fontSize + 3 : Math.round(fontSize * 1.2);\n                baseline = Math.round(lineHeight * 0.8);\n                return {\n                    h: lineHeight,\n                    b: baseline,\n                    f: fontSize\n                };\n            };\n            /**\n             * Correct X and Y positioning of a label for rotation (#1764).\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#rotCorr\n             *\n             * @param {number} baseline\n             *\n             * @param {number} rotation\n             *\n             * @param {boolean} [alterY]\n             *\n             * @param {Highcharts.PositionObject}\n             */\n            SVGRenderer.prototype.rotCorr = function (baseline, rotation, alterY) {\n                var y = baseline;\n                if (rotation && alterY) {\n                    y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n                }\n                return {\n                    x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n                    y: y\n                };\n            };\n            /**\n             * Compatibility function to convert the legacy one-dimensional path array\n             * into an array of segments.\n             *\n             * It is used in maps to parse the `path` option, and in SVGRenderer.dSetter\n             * to support legacy paths from demos.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#pathToSegments\n             */\n            SVGRenderer.prototype.pathToSegments = function (path) {\n                var ret = [];\n                var segment = [];\n                var commandLength = {\n                        A: 8,\n                        C: 7,\n                        H: 2,\n                        L: 3,\n                        M: 3,\n                        Q: 5,\n                        S: 5,\n                        T: 3,\n                        V: 2\n                    };\n                // Short, non-typesafe parsing of the one-dimensional array. It splits\n                // the path on any string. This is not type checked against the tuple\n                // types, but is shorter, and doesn't require specific checks for any\n                // command type in SVG.\n                for (var i = 0; i < path.length; i++) {\n                    // Command skipped, repeat previous or insert L/l for M/m\n                    if (isString(segment[0]) &&\n                        isNumber(path[i]) &&\n                        segment.length === commandLength[(segment[0].toUpperCase())]) {\n                        path.splice(i, 0, segment[0].replace('M', 'L').replace('m', 'l'));\n                    }\n                    // Split on string\n                    if (typeof path[i] === 'string') {\n                        if (segment.length) {\n                            ret.push(segment.slice(0));\n                        }\n                        segment.length = 0;\n                    }\n                    segment.push(path[i]);\n                }\n                ret.push(segment.slice(0));\n                return ret;\n                /*\n                // Fully type-safe version where each tuple type is checked. The\n                // downside is filesize and a lack of flexibility for unsupported\n                // commands\n                const ret: SVGPath = [],\n                    commands = {\n                        A: 7,\n                        C: 6,\n                        H: 1,\n                        L: 2,\n                        M: 2,\n                        Q: 4,\n                        S: 4,\n                        T: 2,\n                        V: 1,\n                        Z: 0\n                    };\n\n                let i = 0,\n                    lastI = 0,\n                    lastCommand;\n\n                while (i < path.length) {\n                    const item = path[i];\n\n                    let command;\n\n                    if (typeof item === 'string') {\n                        command = item;\n                        i += 1;\n                    } else {\n                        command = lastCommand || 'M';\n                    }\n\n                    // Upper case\n                    const commandUC = command.toUpperCase();\n\n                    if (commandUC in commands) {\n\n                        // No numeric parameters\n                        if (command === 'Z' || command === 'z') {\n                            ret.push([command]);\n\n                        // One numeric parameter\n                        } else {\n                            const val0 = path[i];\n                            if (typeof val0 === 'number') {\n\n                                // Horizontal line to\n                                if (command === 'H' || command === 'h') {\n                                    ret.push([command, val0]);\n                                    i += 1;\n\n                                // Vertical line to\n                                } else if (command === 'V' || command === 'v') {\n                                    ret.push([command, val0]);\n                                    i += 1;\n\n                                // Two numeric parameters\n                                } else {\n                                    const val1 = path[i + 1];\n                                    if (typeof val1 === 'number') {\n                                        // lineTo\n                                        if (command === 'L' || command === 'l') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // moveTo\n                                        } else if (command === 'M' || command === 'm') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // Smooth quadratic bezier\n                                        } else if (command === 'T' || command === 't') {\n                                            ret.push([command, val0, val1]);\n                                            i += 2;\n\n                                        // Four numeric parameters\n                                        } else {\n                                            const val2 = path[i + 2],\n                                                val3 = path[i + 3];\n                                            if (\n                                                typeof val2 === 'number' &&\n                                                typeof val3 === 'number'\n                                            ) {\n                                                // Quadratic bezier to\n                                                if (\n                                                    command === 'Q' ||\n                                                    command === 'q'\n                                                ) {\n                                                    ret.push([\n                                                        command,\n                                                        val0,\n                                                        val1,\n                                                        val2,\n                                                        val3\n                                                    ]);\n                                                    i += 4;\n\n                                                // Smooth cubic bezier to\n                                                } else if (\n                                                    command === 'S' ||\n                                                    command === 's'\n                                                ) {\n                                                    ret.push([\n                                                        command,\n                                                        val0,\n                                                        val1,\n                                                        val2,\n                                                        val3\n                                                    ]);\n                                                    i += 4;\n\n                                                // Six numeric parameters\n                                                } else {\n                                                    const val4 = path[i + 4],\n                                                        val5 = path[i + 5];\n\n                                                    if (\n                                                        typeof val4 === 'number' &&\n                                                        typeof val5 === 'number'\n                                                    ) {\n                                                        // Curve to\n                                                        if (\n                                                            command === 'C' ||\n                                                            command === 'c'\n                                                        ) {\n                                                            ret.push([\n                                                                command,\n                                                                val0,\n                                                                val1,\n                                                                val2,\n                                                                val3,\n                                                                val4,\n                                                                val5\n                                                            ]);\n                                                            i += 6;\n\n                                                        // Seven numeric parameters\n                                                        } else {\n                                                            const val6 = path[i + 6];\n\n                                                            // Arc to\n                                                            if (\n                                                                typeof val6 ===\n                                                                'number' &&\n                                                                (\n                                                                    command === 'A' ||\n                                                                    command === 'a'\n                                                                )\n                                                            ) {\n                                                                ret.push([\n                                                                    command,\n                                                                    val0,\n                                                                    val1,\n                                                                    val2,\n                                                                    val3,\n                                                                    val4,\n                                                                    val5,\n                                                                    val6\n                                                                ]);\n                                                                i += 7;\n\n                                                            }\n\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n\n                                }\n                            }\n                        }\n                    }\n\n                    // An unmarked command following a moveTo is a lineTo\n                    lastCommand = command === 'M' ? 'L' : command;\n\n                    if (i === lastI) {\n                        break;\n                    }\n                    lastI = i;\n                }\n                return ret;\n                */\n            };\n            /**\n             * Draw a label, which is an extended text element with support for border\n             * and background. Highcharts creates a `g` element with a text and a `path`\n             * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n             * background are set through `stroke`, `stroke-width` and `fill` attributes\n             * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n             * text after render, run `label.attr({ text: 'New text' })`.\n             *\n             * @sample highcharts/members/renderer-label-on-chart/\n             *         A label on the chart\n             *\n             * @function Highcharts.SVGRenderer#label\n             *\n             * @param {string} str\n             *        The initial text string or (subset) HTML to render.\n             *\n             * @param {number} x\n             *        The x position of the label's left side.\n             *\n             * @param {number} [y]\n             *        The y position of the label's top side or baseline, depending on\n             *        the `baseline` parameter.\n             *\n             * @param {string} [shape='rect']\n             *        The shape of the label's border/background, if any. Defaults to\n             *        `rect`. Other possible values are `callout` or other shapes\n             *        defined in {@link Highcharts.SVGRenderer#symbols}.\n             *\n             * @param {number} [anchorX]\n             *        In case the `shape` has a pointer, like a flag, this is the\n             *        coordinates it should be pinned to.\n             *\n             * @param {number} [anchorY]\n             *        In case the `shape` has a pointer, like a flag, this is the\n             *        coordinates it should be pinned to.\n             *\n             * @param {boolean} [useHTML=false]\n             *        Wether to use HTML to render the label.\n             *\n             * @param {boolean} [baseline=false]\n             *        Whether to position the label relative to the text baseline,\n             *        like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n             *        upper border of the rectangle.\n             *\n             * @param {string} [className]\n             *        Class name for the group.\n             *\n             * @return {Highcharts.SVGElement}\n             *         The generated label.\n             */\n            SVGRenderer.prototype.label = function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n                return new SVGLabel(this, str, x, y, shape, anchorX, anchorY, useHTML, baseline, className);\n            };\n            return SVGRenderer;\n        }());\n        /**\n         * A pointer to the renderer's associated Element class. The VMLRenderer\n         * will have a pointer to VMLElement here.\n         *\n         * @name Highcharts.SVGRenderer#Element\n         * @type {Highcharts.SVGElement}\n         */\n        SVGRenderer.prototype.Element = SVGElement;\n        /**\n         * @private\n         */\n        SVGRenderer.prototype.SVG_NS = SVG_NS;\n        /**\n         * Dummy function for plugins, called every time the renderer is updated.\n         * Prior to Highcharts 5, this was used for the canvg renderer.\n         *\n         * @deprecated\n         * @function Highcharts.SVGRenderer#draw\n         */\n        SVGRenderer.prototype.draw = noop;\n        /**\n         * A collection of characters mapped to HTML entities. When `useHTML` on an\n         * element is true, these entities will be rendered correctly by HTML. In\n         * the SVG pseudo-HTML, they need to be unescaped back to simple characters,\n         * so for example `&lt;` will render as `<`.\n         *\n         * @example\n         * // Add support for unescaping quotes\n         * Highcharts.SVGRenderer.prototype.escapes['\"'] = '&quot;';\n         *\n         * @name Highcharts.SVGRenderer#escapes\n         * @type {Highcharts.Dictionary<string>}\n         */\n        SVGRenderer.prototype.escapes = {\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            \"'\": '&#39;',\n            '\"': '&quot;'\n        };\n        /**\n         * An extendable collection of functions for defining symbol paths.\n         *\n         * @name Highcharts.SVGRenderer#symbols\n         * @type {Highcharts.SymbolDictionary}\n         */\n        SVGRenderer.prototype.symbols = {\n            circle: function (x, y, w, h) {\n                // Return a full arc\n                return this.arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n                    start: Math.PI * 0.5,\n                    end: Math.PI * 2.5,\n                    open: false\n                });\n            },\n            square: function (x, y, w, h) {\n                return [\n                    ['M', x, y],\n                    ['L', x + w, y],\n                    ['L', x + w, y + h],\n                    ['L', x, y + h],\n                    ['Z']\n                ];\n            },\n            triangle: function (x, y, w, h) {\n                return [\n                    ['M', x + w / 2, y],\n                    ['L', x + w, y + h],\n                    ['L', x, y + h],\n                    ['Z']\n                ];\n            },\n            'triangle-down': function (x, y, w, h) {\n                return [\n                    ['M', x, y],\n                    ['L', x + w, y],\n                    ['L', x + w / 2, y + h],\n                    ['Z']\n                ];\n            },\n            diamond: function (x, y, w, h) {\n                return [\n                    ['M', x + w / 2, y],\n                    ['L', x + w, y + h / 2],\n                    ['L', x + w / 2, y + h],\n                    ['L', x, y + h / 2],\n                    ['Z']\n                ];\n            },\n            arc: function (x, y, w, h, options) {\n                var arc = [];\n                if (options) {\n                    var start = options.start || 0,\n                        end = options.end || 0,\n                        rx = options.r || w,\n                        ry = options.r || h || w,\n                        proximity = 0.001,\n                        fullCircle = Math.abs(end - start - 2 * Math.PI) <\n                            proximity, \n                        // Substract a small number to prevent cos and sin of start and\n                        // end from becoming equal on 360 arcs (related: #1561)\n                        end = end - proximity,\n                        innerRadius = options.innerR,\n                        open = pick(options.open,\n                        fullCircle),\n                        cosStart = Math.cos(start),\n                        sinStart = Math.sin(start),\n                        cosEnd = Math.cos(end),\n                        sinEnd = Math.sin(end), \n                        // Proximity takes care of rounding errors around PI (#6971)\n                        longArc = pick(options.longArc,\n                        end - start - Math.PI < proximity ? 0 : 1);\n                    arc.push([\n                        'M',\n                        x + rx * cosStart,\n                        y + ry * sinStart\n                    ], [\n                        'A',\n                        rx,\n                        ry,\n                        0,\n                        longArc,\n                        pick(options.clockwise, 1),\n                        x + rx * cosEnd,\n                        y + ry * sinEnd\n                    ]);\n                    if (defined(innerRadius)) {\n                        arc.push(open ?\n                            [\n                                'M',\n                                x + innerRadius * cosEnd,\n                                y + innerRadius * sinEnd\n                            ] : [\n                            'L',\n                            x + innerRadius * cosEnd,\n                            y + innerRadius * sinEnd\n                        ], [\n                            'A',\n                            innerRadius,\n                            innerRadius,\n                            0,\n                            longArc,\n                            // Clockwise - opposite to the outer arc clockwise\n                            defined(options.clockwise) ? 1 - options.clockwise : 0,\n                            x + innerRadius * cosStart,\n                            y + innerRadius * sinStart\n                        ]);\n                    }\n                    if (!open) {\n                        arc.push(['Z']);\n                    }\n                }\n                return arc;\n            },\n            /**\n             * Callout shape used for default tooltips, also used for rounded\n             * rectangles in VML\n             */\n            callout: function (x, y, w, h, options) {\n                var arrowLength = 6,\n                    halfDistance = 6,\n                    r = Math.min((options && options.r) || 0,\n                    w,\n                    h),\n                    safeDistance = r + halfDistance,\n                    anchorX = options && options.anchorX || 0,\n                    anchorY = options && options.anchorY || 0,\n                    path;\n                path = [\n                    ['M', x + r, y],\n                    ['L', x + w - r, y],\n                    ['C', x + w, y, x + w, y, x + w, y + r],\n                    ['L', x + w, y + h - r],\n                    ['C', x + w, y + h, x + w, y + h, x + w - r, y + h],\n                    ['L', x + r, y + h],\n                    ['C', x, y + h, x, y + h, x, y + h - r],\n                    ['L', x, y + r],\n                    ['C', x, y, x, y, x + r, y] // top-left corner\n                ];\n                // Anchor on right side\n                if (anchorX && anchorX > w) {\n                    // Chevron\n                    if (anchorY > y + safeDistance &&\n                        anchorY < y + h - safeDistance) {\n                        path.splice(3, 1, ['L', x + w, anchorY - halfDistance], ['L', x + w + arrowLength, anchorY], ['L', x + w, anchorY + halfDistance], ['L', x + w, y + h - r]);\n                        // Simple connector\n                    }\n                    else {\n                        path.splice(3, 1, ['L', x + w, h / 2], ['L', anchorX, anchorY], ['L', x + w, h / 2], ['L', x + w, y + h - r]);\n                    }\n                    // Anchor on left side\n                }\n                else if (anchorX && anchorX < 0) {\n                    // Chevron\n                    if (anchorY > y + safeDistance &&\n                        anchorY < y + h - safeDistance) {\n                        path.splice(7, 1, ['L', x, anchorY + halfDistance], ['L', x - arrowLength, anchorY], ['L', x, anchorY - halfDistance], ['L', x, y + r]);\n                        // Simple connector\n                    }\n                    else {\n                        path.splice(7, 1, ['L', x, h / 2], ['L', anchorX, anchorY], ['L', x, h / 2], ['L', x, y + r]);\n                    }\n                }\n                else if ( // replace bottom\n                anchorY &&\n                    anchorY > h &&\n                    anchorX > x + safeDistance &&\n                    anchorX < x + w - safeDistance) {\n                    path.splice(5, 1, ['L', anchorX + halfDistance, y + h], ['L', anchorX, y + h + arrowLength], ['L', anchorX - halfDistance, y + h], ['L', x + r, y + h]);\n                }\n                else if ( // replace top\n                anchorY &&\n                    anchorY < 0 &&\n                    anchorX > x + safeDistance &&\n                    anchorX < x + w - safeDistance) {\n                    path.splice(1, 1, ['L', anchorX - halfDistance, y], ['L', anchorX, y - arrowLength], ['L', anchorX + halfDistance, y], ['L', w - r, y]);\n                }\n                return path;\n            }\n        };\n        H.SVGRenderer = SVGRenderer;\n        H.Renderer = H.SVGRenderer;\n\n        return H.Renderer;\n    });\n    _registerModule(_modules, 'parts/Html.js', [_modules['parts/Globals.js'], _modules['parts/SVGElement.js'], _modules['parts/SVGRenderer.js'], _modules['parts/Utilities.js']], function (H, SVGElement, SVGRenderer, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            pick = U.pick,\n            pInt = U.pInt;\n        var isFirefox = H.isFirefox,\n            isMS = H.isMS,\n            isWebKit = H.isWebKit,\n            win = H.win;\n        /* eslint-disable valid-jsdoc */\n        // Extend SvgElement for useHTML option.\n        extend(SVGElement.prototype, /** @lends SVGElement.prototype */ {\n            /**\n             * Apply CSS to HTML elements. This is used in text within SVG rendering and\n             * by the VML renderer\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlCss\n             *\n             * @param {Highcharts.CSSObject} styles\n             *\n             * @return {Highcharts.SVGElement}\n             */\n            htmlCss: function (styles) {\n                var wrapper = this,\n                    element = wrapper.element, \n                    // When setting or unsetting the width style, we need to update\n                    // transform (#8809)\n                    isSettingWidth = (element.tagName === 'SPAN' &&\n                        styles &&\n                        'width' in styles),\n                    textWidth = pick(isSettingWidth && styles.width,\n                    void 0),\n                    doTransform;\n                if (isSettingWidth) {\n                    delete styles.width;\n                    wrapper.textWidth = textWidth;\n                    doTransform = true;\n                }\n                if (styles && styles.textOverflow === 'ellipsis') {\n                    styles.whiteSpace = 'nowrap';\n                    styles.overflow = 'hidden';\n                }\n                wrapper.styles = extend(wrapper.styles, styles);\n                css(wrapper.element, styles);\n                // Now that all styles are applied, to the transform\n                if (doTransform) {\n                    wrapper.htmlUpdateTransform();\n                }\n                return wrapper;\n            },\n            /**\n             * VML and useHTML method for calculating the bounding box based on offsets.\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlGetBBox\n             *\n             * @param {boolean} refresh\n             *        Whether to force a fresh value from the DOM or to use the cached\n             *        value.\n             *\n             * @return {Highcharts.BBoxObject}\n             *         A hash containing values for x, y, width and height.\n             */\n            htmlGetBBox: function () {\n                var wrapper = this,\n                    element = wrapper.element;\n                return {\n                    x: element.offsetLeft,\n                    y: element.offsetTop,\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                };\n            },\n            /**\n             * VML override private method to update elements based on internal\n             * properties based on SVG transform.\n             *\n             * @private\n             * @function Highcharts.SVGElement#htmlUpdateTransform\n             * @return {void}\n             */\n            htmlUpdateTransform: function () {\n                // aligning non added elements is expensive\n                if (!this.added) {\n                    this.alignOnAdd = true;\n                    return;\n                }\n                var wrapper = this,\n                    renderer = wrapper.renderer,\n                    elem = wrapper.element,\n                    translateX = wrapper.translateX || 0,\n                    translateY = wrapper.translateY || 0,\n                    x = wrapper.x || 0,\n                    y = wrapper.y || 0,\n                    align = wrapper.textAlign || 'left',\n                    alignCorrection = {\n                        left: 0,\n                    center: 0.5,\n                    right: 1\n                    }[align],\n                    styles = wrapper.styles,\n                    whiteSpace = styles && styles.whiteSpace;\n                /**\n                 * @private\n                 * @return {number}\n                 */\n                function getTextPxLength() {\n                    // Reset multiline/ellipsis in order to read width (#4928,\n                    // #5417)\n                    css(elem, {\n                        width: '',\n                        whiteSpace: whiteSpace || 'nowrap'\n                    });\n                    return elem.offsetWidth;\n                }\n                // apply translate\n                css(elem, {\n                    marginLeft: translateX,\n                    marginTop: translateY\n                });\n                if (!renderer.styledMode && wrapper.shadows) { // used in labels/tooltip\n                    wrapper.shadows.forEach(function (shadow) {\n                        css(shadow, {\n                            marginLeft: translateX + 1,\n                            marginTop: translateY + 1\n                        });\n                    });\n                }\n                // apply inversion\n                if (wrapper.inverted) { // wrapper is a group\n                    [].forEach.call(elem.childNodes, function (child) {\n                        renderer.invertChild(child, elem);\n                    });\n                }\n                if (elem.tagName === 'SPAN') {\n                    var rotation = wrapper.rotation, baseline, textWidth = wrapper.textWidth && pInt(wrapper.textWidth), currentTextTransform = [\n                            rotation,\n                            align,\n                            elem.innerHTML,\n                            wrapper.textWidth,\n                            wrapper.textAlign\n                        ].join(',');\n                    // Update textWidth. Use the memoized textPxLength if possible, to\n                    // avoid the getTextPxLength function using elem.offsetWidth.\n                    // Calling offsetWidth affects rendering time as it forces layout\n                    // (#7656).\n                    if (textWidth !== wrapper.oldTextWidth &&\n                        ((textWidth > wrapper.oldTextWidth) ||\n                            (wrapper.textPxLength || getTextPxLength()) > textWidth) && (\n                    // Only set the width if the text is able to word-wrap, or\n                    // text-overflow is ellipsis (#9537)\n                    /[ \\-]/.test(elem.textContent || elem.innerText) ||\n                        elem.style.textOverflow === 'ellipsis')) { // #983, #1254\n                        css(elem, {\n                            width: textWidth + 'px',\n                            display: 'block',\n                            whiteSpace: whiteSpace || 'normal' // #3331\n                        });\n                        wrapper.oldTextWidth = textWidth;\n                        wrapper.hasBoxWidthChanged = true; // #8159\n                    }\n                    else {\n                        wrapper.hasBoxWidthChanged = false; // #8159\n                    }\n                    // Do the calculations and DOM access only if properties changed\n                    if (currentTextTransform !== wrapper.cTT) {\n                        baseline = renderer.fontMetrics(elem.style.fontSize, elem).b;\n                        // Renderer specific handling of span rotation, but only if we\n                        // have something to update.\n                        if (defined(rotation) &&\n                            ((rotation !== (wrapper.oldRotation || 0)) ||\n                                (align !== wrapper.oldAlign))) {\n                            wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n                        }\n                        wrapper.getSpanCorrection(\n                        // Avoid elem.offsetWidth if we can, it affects rendering\n                        // time heavily (#7656)\n                        ((!defined(rotation) && wrapper.textPxLength) || // #7920\n                            elem.offsetWidth), baseline, alignCorrection, rotation, align);\n                    }\n                    // apply position with correction\n                    css(elem, {\n                        left: (x + (wrapper.xCorr || 0)) + 'px',\n                        top: (y + (wrapper.yCorr || 0)) + 'px'\n                    });\n                    // record current text transform\n                    wrapper.cTT = currentTextTransform;\n                    wrapper.oldRotation = rotation;\n                    wrapper.oldAlign = align;\n                }\n            },\n            /**\n             * Set the rotation of an individual HTML span.\n             *\n             * @private\n             * @function Highcharts.SVGElement#setSpanRotation\n             * @param {number} rotation\n             * @param {number} alignCorrection\n             * @param {number} baseline\n             * @return {void}\n             */\n            setSpanRotation: function (rotation, alignCorrection, baseline) {\n                var rotationStyle = {},\n                    cssTransformKey = this.renderer.getTransformKey();\n                rotationStyle[cssTransformKey] = rotationStyle.transform =\n                    'rotate(' + rotation + 'deg)';\n                rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] =\n                    rotationStyle.transformOrigin =\n                        (alignCorrection * 100) + '% ' + baseline + 'px';\n                css(this.element, rotationStyle);\n            },\n            /**\n             * Get the correction in X and Y positioning as the element is rotated.\n             *\n             * @private\n             * @function Highcharts.SVGElement#getSpanCorrection\n             * @param {number} width\n             * @param {number} baseline\n             * @param {number} alignCorrection\n             * @return {void}\n             */\n            getSpanCorrection: function (width, baseline, alignCorrection) {\n                this.xCorr = -width * alignCorrection;\n                this.yCorr = -baseline;\n            }\n        });\n        // Extend SvgRenderer for useHTML option.\n        extend(SVGRenderer.prototype, /** @lends SVGRenderer.prototype */ {\n            /**\n             * @private\n             * @function Highcharts.SVGRenderer#getTransformKey\n             *\n             * @return {string}\n             */\n            getTransformKey: function () {\n                return isMS && !/Edge/.test(win.navigator.userAgent) ?\n                    '-ms-transform' :\n                    isWebKit ?\n                        '-webkit-transform' :\n                        isFirefox ?\n                            'MozTransform' :\n                            win.opera ?\n                                '-o-transform' :\n                                '';\n            },\n            /**\n             * Create HTML text node. This is used by the VML renderer as well as the\n             * SVG renderer through the useHTML option.\n             *\n             * @private\n             * @function Highcharts.SVGRenderer#html\n             *\n             * @param {string} str\n             *        The text of (subset) HTML to draw.\n             *\n             * @param {number} x\n             *        The x position of the text's lower left corner.\n             *\n             * @param {number} y\n             *        The y position of the text's lower left corner.\n             *\n             * @return {Highcharts.HTMLDOMElement}\n             */\n            html: function (str, x, y) {\n                var wrapper = this.createElement('span'), element = wrapper.element, renderer = wrapper.renderer, isSVG = renderer.isSVG, addSetters = function (gWrapper, style) {\n                        // These properties are set as attributes on the SVG group, and\n                        // as identical CSS properties on the div. (#3542)\n                        ['opacity', 'visibility'].forEach(function (prop) {\n                            gWrapper[prop + 'Setter'] = function (value, key, elem) {\n                                var styleObject = gWrapper.div ?\n                                    gWrapper.div.style :\n                                    style;\n                            SVGElement.prototype[prop + 'Setter']\n                                .call(this, value, key, elem);\n                            if (styleObject) {\n                                styleObject[key] = value;\n                            }\n                        };\n                    });\n                    gWrapper.addedSetters = true;\n                };\n                // Text setter\n                wrapper.textSetter = function (value) {\n                    if (value !== element.innerHTML) {\n                        delete this.bBox;\n                        delete this.oldTextWidth;\n                    }\n                    this.textStr = value;\n                    element.innerHTML = pick(value, '');\n                    wrapper.doTransform = true;\n                };\n                // Add setters for the element itself (#4938)\n                if (isSVG) { // #4938, only for HTML within SVG\n                    addSetters(wrapper, wrapper.element.style);\n                }\n                // Various setters which rely on update transform\n                wrapper.xSetter =\n                    wrapper.ySetter =\n                        wrapper.alignSetter =\n                            wrapper.rotationSetter =\n                                function (value, key) {\n                                    if (key === 'align') {\n                                        // Do not overwrite the SVGElement.align method. Same as VML.\n                                        key = 'textAlign';\n                                    }\n                                    wrapper[key] = value;\n                                    wrapper.doTransform = true;\n                                };\n                // Runs at the end of .attr()\n                wrapper.afterSetters = function () {\n                    // Update transform. Do this outside the loop to prevent redundant\n                    // updating for batch setting of attributes.\n                    if (this.doTransform) {\n                        this.htmlUpdateTransform();\n                        this.doTransform = false;\n                    }\n                };\n                // Set the default attributes\n                wrapper\n                    .attr({\n                    text: str,\n                    x: Math.round(x),\n                    y: Math.round(y)\n                })\n                    .css({\n                    position: 'absolute'\n                });\n                if (!renderer.styledMode) {\n                    wrapper.css({\n                        fontFamily: this.style.fontFamily,\n                        fontSize: this.style.fontSize\n                    });\n                }\n                // Keep the whiteSpace style outside the wrapper.styles collection\n                element.style.whiteSpace = 'nowrap';\n                // Use the HTML specific .css method\n                wrapper.css = wrapper.htmlCss;\n                // This is specific for HTML within SVG\n                if (isSVG) {\n                    wrapper.add = function (svgGroupWrapper) {\n                        var htmlGroup,\n                            container = renderer.box.parentNode,\n                            parentGroup,\n                            parents = [];\n                        this.parentGroup = svgGroupWrapper;\n                        // Create a mock group to hold the HTML elements\n                        if (svgGroupWrapper) {\n                            htmlGroup = svgGroupWrapper.div;\n                            if (!htmlGroup) {\n                                // Read the parent chain into an array and read from top\n                                // down\n                                parentGroup = svgGroupWrapper;\n                                while (parentGroup) {\n                                    parents.push(parentGroup);\n                                    // Move up to the next parent group\n                                    parentGroup = parentGroup.parentGroup;\n                                }\n                                // Ensure dynamically updating position when any parent\n                                // is translated\n                                parents.reverse().forEach(function (parentGroup) {\n                                    var htmlGroupStyle,\n                                        cls = attr(parentGroup.element, 'class');\n                                    /**\n                                     * Common translate setter for X and Y on the HTML\n                                     * group. Reverted the fix for #6957 du to\n                                     * positioning problems and offline export (#7254,\n                                     * #7280, #7529)\n                                     * @private\n                                     * @param {*} value\n                                     * @param {string} key\n                                     * @return {void}\n                                     */\n                                    function translateSetter(value, key) {\n                                        parentGroup[key] = value;\n                                        if (key === 'translateX') {\n                                            htmlGroupStyle.left = value + 'px';\n                                        }\n                                        else {\n                                            htmlGroupStyle.top = value + 'px';\n                                        }\n                                        parentGroup.doTransform = true;\n                                    }\n                                    // Create a HTML div and append it to the parent div\n                                    // to emulate the SVG group structure\n                                    htmlGroup =\n                                        parentGroup.div =\n                                            parentGroup.div || createElement('div', cls ? { className: cls } : void 0, {\n                                                position: 'absolute',\n                                                left: (parentGroup.translateX || 0) + 'px',\n                                                top: (parentGroup.translateY || 0) + 'px',\n                                                display: parentGroup.display,\n                                                opacity: parentGroup.opacity,\n                                                pointerEvents: (parentGroup.styles &&\n                                                    parentGroup.styles.pointerEvents) // #5595\n                                                // the top group is appended to container\n                                            }, htmlGroup || container);\n                                    // Shortcut\n                                    htmlGroupStyle = htmlGroup.style;\n                                    // Set listeners to update the HTML div's position\n                                    // whenever the SVG group position is changed.\n                                    extend(parentGroup, {\n                                        // (#7287) Pass htmlGroup to use\n                                        // the related group\n                                        classSetter: (function (htmlGroup) {\n                                            return function (value) {\n                                                this.element.setAttribute('class', value);\n                                                htmlGroup.className = value;\n                                            };\n                                        }(htmlGroup)),\n                                        on: function () {\n                                            if (parents[0].div) { // #6418\n                                                wrapper.on.apply({ element: parents[0].div }, arguments);\n                                            }\n                                            return parentGroup;\n                                        },\n                                        translateXSetter: translateSetter,\n                                        translateYSetter: translateSetter\n                                    });\n                                    if (!parentGroup.addedSetters) {\n                                        addSetters(parentGroup);\n                                    }\n                                });\n                            }\n                        }\n                        else {\n                            htmlGroup = container;\n                        }\n                        htmlGroup.appendChild(element);\n                        // Shared with VML:\n                        wrapper.added = true;\n                        if (wrapper.alignOnAdd) {\n                            wrapper.htmlUpdateTransform();\n                        }\n                        return wrapper;\n                    };\n                }\n                return wrapper;\n            }\n        });\n\n    });\n    _registerModule(_modules, 'parts/Tick.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Optional parameters for the tick.\n         * @private\n         * @interface Highcharts.TickParametersObject\n         */ /**\n        * Set category for the tick.\n        * @name Highcharts.TickParametersObject#category\n        * @type {string|undefined}\n        */ /**\n        * @name Highcharts.TickParametersObject#options\n        * @type {Highcharts.Dictionary<any>|undefined}\n        */ /**\n        * Set tickmarkOffset for the tick.\n        * @name Highcharts.TickParametersObject#tickmarkOffset\n        * @type {number|undefined}\n        */\n        var clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        var deg2rad = H.deg2rad;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Tick class.\n         *\n         * @class\n         * @name Highcharts.Tick\n         *\n         * @param {Highcharts.Axis} axis\n         * The axis of the tick.\n         *\n         * @param {number} pos\n         * The position of the tick on the axis in terms of axis values.\n         *\n         * @param {string} [type]\n         * The type of tick, either 'minor' or an empty string\n         *\n         * @param {boolean} [noLabel=false]\n         * Whether to disable the label or not. Defaults to false.\n         *\n         * @param {object} [parameters]\n         * Optional parameters for the tick.\n         */\n        var Tick = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Tick(axis, pos, type, noLabel, parameters) {\n                    this.isNew = true;\n                this.isNewLabel = true;\n                /**\n                 * The related axis of the tick.\n                 * @name Highcharts.Tick#axis\n                 * @type {Highcharts.Axis}\n                 */\n                this.axis = axis;\n                /**\n                 * The logical position of the tick on the axis in terms of axis values.\n                 * @name Highcharts.Tick#pos\n                 * @type {number}\n                 */\n                this.pos = pos;\n                /**\n                 * The tick type, which can be `\"minor\"`, or an empty string.\n                 * @name Highcharts.Tick#type\n                 * @type {string}\n                 */\n                this.type = type || '';\n                this.parameters = parameters || {};\n                /**\n                 * The mark offset of the tick on the axis. Usually `undefined`, numeric\n                 * for grid axes.\n                 * @name Highcharts.Tick#tickmarkOffset\n                 * @type {number|undefined}\n                 */\n                this.tickmarkOffset = this.parameters.tickmarkOffset;\n                this.options = this.parameters.options;\n                fireEvent(this, 'init');\n                if (!type && !noLabel) {\n                    this.addLabel();\n                }\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Write the tick label.\n             *\n             * @private\n             * @function Highcharts.Tick#addLabel\n             * @return {void}\n             */\n            Tick.prototype.addLabel = function () {\n                var tick = this,\n                    axis = tick.axis,\n                    options = axis.options,\n                    chart = axis.chart,\n                    categories = axis.categories,\n                    log = axis.logarithmic,\n                    names = axis.names,\n                    pos = tick.pos,\n                    labelOptions = pick(tick.options && tick.options.labels,\n                    options.labels),\n                    str,\n                    tickPositions = axis.tickPositions,\n                    isFirst = pos === tickPositions[0],\n                    isLast = pos === tickPositions[tickPositions.length - 1],\n                    value = this.parameters.category || (categories ?\n                        pick(categories[pos],\n                    names[pos],\n                    pos) :\n                        pos),\n                    label = tick.label,\n                    animateLabels = (!labelOptions.step || labelOptions.step === 1) &&\n                        axis.tickInterval === 1,\n                    tickPositionInfo = tickPositions.info,\n                    dateTimeLabelFormat,\n                    dateTimeLabelFormats,\n                    i,\n                    list;\n                // Set the datetime label format. If a higher rank is set for this\n                // position, use that. If not, use the general format.\n                if (axis.dateTime && tickPositionInfo) {\n                    dateTimeLabelFormats = chart.time.resolveDTLFormat(options.dateTimeLabelFormats[(!options.grid &&\n                        tickPositionInfo.higherRanks[pos]) ||\n                        tickPositionInfo.unitName]);\n                    dateTimeLabelFormat = dateTimeLabelFormats.main;\n                }\n                // set properties for access in render method\n                /**\n                 * True if the tick is the first one on the axis.\n                 * @name Highcharts.Tick#isFirst\n                 * @readonly\n                 * @type {boolean|undefined}\n                 */\n                tick.isFirst = isFirst;\n                /**\n                 * True if the tick is the last one on the axis.\n                 * @name Highcharts.Tick#isLast\n                 * @readonly\n                 * @type {boolean|undefined}\n                 */\n                tick.isLast = isLast;\n                // Get the string\n                tick.formatCtx = {\n                    axis: axis,\n                    chart: chart,\n                    isFirst: isFirst,\n                    isLast: isLast,\n                    dateTimeLabelFormat: dateTimeLabelFormat,\n                    tickPositionInfo: tickPositionInfo,\n                    value: log ? correctFloat(log.lin2log(value)) : value,\n                    pos: pos\n                };\n                str = axis.labelFormatter.call(tick.formatCtx, this.formatCtx);\n                // Set up conditional formatting based on the format list if existing.\n                list = dateTimeLabelFormats && dateTimeLabelFormats.list;\n                if (list) {\n                    tick.shortenLabel = function () {\n                        for (i = 0; i < list.length; i++) {\n                            label.attr({\n                                text: axis.labelFormatter.call(extend(tick.formatCtx, { dateTimeLabelFormat: list[i] }))\n                            });\n                            if (label.getBBox().width <\n                                axis.getSlotWidth(tick) - 2 *\n                                    pick(labelOptions.padding, 5)) {\n                                return;\n                            }\n                        }\n                        label.attr({\n                            text: ''\n                        });\n                    };\n                }\n                // Call only after first render\n                if (animateLabels && axis._addedPlotLB && axis.isXAxis) {\n                    tick.moveLabel(str, labelOptions);\n                }\n                // First call\n                if (!defined(label) && !tick.movedLabel) {\n                    /**\n                     * The rendered text label of the tick.\n                     * @name Highcharts.Tick#label\n                     * @type {Highcharts.SVGElement|undefined}\n                     */\n                    tick.label = label = tick.createLabel({ x: 0, y: 0 }, str, labelOptions);\n                    // Base value to detect change for new calls to getBBox\n                    tick.rotation = 0;\n                    // update\n                }\n                else if (label && label.textStr !== str && !animateLabels) {\n                    // When resetting text, also reset the width if dynamically set\n                    // (#8809)\n                    if (label.textWidth &&\n                        !(labelOptions.style && labelOptions.style.width) &&\n                        !label.styles.width) {\n                        label.css({ width: null });\n                    }\n                    label.attr({ text: str });\n                    label.textPxLength = label.getBBox().width;\n                }\n            };\n            /**\n             * Render and return the label of the tick.\n             *\n             * @private\n             * @function Highcharts.Tick#createLabel\n             * @param {Highcharts.PositionObject} xy\n             * @param {string} str\n             * @param {Highcharts.XAxisLabelsOptions} labelOptions\n             * @return {Highcharts.SVGElement|undefined}\n             */\n            Tick.prototype.createLabel = function (xy, str, labelOptions) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    label = defined(str) && labelOptions.enabled ?\n                        chart.renderer\n                            .text(str,\n                    xy.x,\n                    xy.y,\n                    labelOptions.useHTML)\n                            .add(axis.labelGroup) :\n                        null;\n                // Un-rotated length\n                if (label) {\n                    // Without position absolute, IE export sometimes is wrong\n                    if (!chart.styledMode) {\n                        label.css(merge(labelOptions.style));\n                    }\n                    label.textPxLength = label.getBBox().width;\n                }\n                return label;\n            };\n            /**\n             * Destructor for the tick prototype\n             *\n             * @private\n             * @function Highcharts.Tick#destroy\n             * @return {void}\n             */\n            Tick.prototype.destroy = function () {\n                destroyObjectProperties(this, this.axis);\n            };\n            /**\n             * Gets the x and y positions for ticks in terms of pixels.\n             *\n             * @private\n             * @function Highcharts.Tick#getPosition\n             *\n             * @param {boolean} horiz\n             * Whether the tick is on an horizontal axis or not.\n             *\n             * @param {number} tickPos\n             * Position of the tick.\n             *\n             * @param {number} tickmarkOffset\n             * Tickmark offset for all ticks.\n             *\n             * @param {boolean} [old]\n             * Whether the axis has changed or not.\n             *\n             * @return {Highcharts.PositionObject}\n             * The tick position.\n             *\n             * @fires Highcharts.Tick#event:afterGetPosition\n             */\n            Tick.prototype.getPosition = function (horiz, tickPos, tickmarkOffset, old) {\n                var axis = this.axis,\n                    chart = axis.chart,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    pos;\n                pos = {\n                    x: horiz ?\n                        correctFloat(axis.translate(tickPos + tickmarkOffset, null, null, old) +\n                            axis.transB) :\n                        (axis.left +\n                            axis.offset +\n                            (axis.opposite ?\n                                (((old && chart.oldChartWidth) ||\n                                    chart.chartWidth) -\n                                    axis.right -\n                                    axis.left) :\n                                0)),\n                    y: horiz ?\n                        (cHeight -\n                            axis.bottom +\n                            axis.offset -\n                            (axis.opposite ? axis.height : 0)) :\n                        correctFloat(cHeight -\n                            axis.translate(tickPos + tickmarkOffset, null, null, old) -\n                            axis.transB)\n                };\n                // Chrome workaround for #10516\n                pos.y = clamp(pos.y, -1e5, 1e5);\n                fireEvent(this, 'afterGetPosition', { pos: pos });\n                return pos;\n            };\n            /**\n             * Get the x, y position of the tick label\n             *\n             * @private\n             * @return {Highcharts.PositionObject}\n             */\n            Tick.prototype.getLabelPosition = function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n                var axis = this.axis,\n                    transA = axis.transA,\n                    reversed = ( // #7911\n                    axis.isLinked && axis.linkedParent ?\n                        axis.linkedParent.reversed :\n                        axis.reversed),\n                    staggerLines = axis.staggerLines,\n                    rotCorr = axis.tickRotCorr || { x: 0,\n                    y: 0 },\n                    yOffset = labelOptions.y, \n                    // Adjust for label alignment if we use reserveSpace: true (#5286)\n                    labelOffsetCorrection = (!horiz && !axis.reserveSpaceDefault ?\n                        -axis.labelOffset * (axis.labelAlign === 'center' ? 0.5 : 1) :\n                        0),\n                    line,\n                    pos = {};\n                if (!defined(yOffset)) {\n                    if (axis.side === 0) {\n                        yOffset = label.rotation ? -8 : -label.getBBox().height;\n                    }\n                    else if (axis.side === 2) {\n                        yOffset = rotCorr.y + 8;\n                    }\n                    else {\n                        // #3140, #3140\n                        yOffset = Math.cos(label.rotation * deg2rad) *\n                            (rotCorr.y - label.getBBox(false, 0).height / 2);\n                    }\n                }\n                x = x +\n                    labelOptions.x +\n                    labelOffsetCorrection +\n                    rotCorr.x -\n                    (tickmarkOffset && horiz ?\n                        tickmarkOffset * transA * (reversed ? -1 : 1) :\n                        0);\n                y = y + yOffset - (tickmarkOffset && !horiz ?\n                    tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n                // Correct for staggered labels\n                if (staggerLines) {\n                    line = (index / (step || 1) % staggerLines);\n                    if (axis.opposite) {\n                        line = staggerLines - line - 1;\n                    }\n                    y += line * (axis.labelOffset / staggerLines);\n                }\n                pos.x = x;\n                pos.y = Math.round(y);\n                fireEvent(this, 'afterGetLabelPosition', { pos: pos, tickmarkOffset: tickmarkOffset, index: index });\n                return pos;\n            };\n            /**\n             * Get the offset height or width of the label\n             *\n             * @private\n             * @function Highcharts.Tick#getLabelSize\n             * @return {number}\n             */\n            Tick.prototype.getLabelSize = function () {\n                return this.label ?\n                    this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n                    0;\n            };\n            /**\n             * Extendible method to return the path of the marker\n             *\n             * @private\n             *\n             */\n            Tick.prototype.getMarkPath = function (x, y, tickLength, tickWidth, horiz, renderer) {\n                return renderer.crispLine([[\n                        'M',\n                        x,\n                        y\n                    ], [\n                        'L',\n                        x + (horiz ? 0 : -tickLength),\n                        y + (horiz ? tickLength : 0)\n                    ]], tickWidth);\n            };\n            /**\n             * Handle the label overflow by adjusting the labels to the left and right\n             * edge, or hide them if they collide into the neighbour label.\n             *\n             * @private\n             * @function Highcharts.Tick#handleOverflow\n             * @param {Highcharts.PositionObject} xy\n             * @return {void}\n             */\n            Tick.prototype.handleOverflow = function (xy) {\n                var tick = this,\n                    axis = this.axis,\n                    labelOptions = axis.options.labels,\n                    pxPos = xy.x,\n                    chartWidth = axis.chart.chartWidth,\n                    spacing = axis.chart.spacing,\n                    leftBound = pick(axis.labelLeft,\n                    Math.min(axis.pos,\n                    spacing[3])),\n                    rightBound = pick(axis.labelRight,\n                    Math.max(!axis.isRadial ? axis.pos + axis.len : 0,\n                    chartWidth - spacing[1])),\n                    label = this.label,\n                    rotation = this.rotation,\n                    factor = {\n                        left: 0,\n                        center: 0.5,\n                        right: 1\n                    }[axis.labelAlign || label.attr('align')],\n                    labelWidth = label.getBBox().width,\n                    slotWidth = axis.getSlotWidth(tick),\n                    modifiedSlotWidth = slotWidth,\n                    xCorrection = factor,\n                    goRight = 1,\n                    leftPos,\n                    rightPos,\n                    textWidth,\n                    css = {};\n                // Check if the label overshoots the chart spacing box. If it does, move\n                // it. If it now overshoots the slotWidth, add ellipsis.\n                if (!rotation &&\n                    pick(labelOptions.overflow, 'justify') === 'justify') {\n                    leftPos = pxPos - factor * labelWidth;\n                    rightPos = pxPos + (1 - factor) * labelWidth;\n                    if (leftPos < leftBound) {\n                        modifiedSlotWidth =\n                            xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n                    }\n                    else if (rightPos > rightBound) {\n                        modifiedSlotWidth =\n                            rightBound - xy.x + modifiedSlotWidth * factor;\n                        goRight = -1;\n                    }\n                    modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n                    if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n                        xy.x += (goRight *\n                            (slotWidth -\n                                modifiedSlotWidth -\n                                xCorrection * (slotWidth - Math.min(labelWidth, modifiedSlotWidth))));\n                    }\n                    // If the label width exceeds the available space, set a text width\n                    // to be picked up below. Also, if a width has been set before, we\n                    // need to set a new one because the reported labelWidth will be\n                    // limited by the box (#3938).\n                    if (labelWidth > modifiedSlotWidth ||\n                        (axis.autoRotation && (label.styles || {}).width)) {\n                        textWidth = modifiedSlotWidth;\n                    }\n                    // Add ellipsis to prevent rotated labels to be clipped against the edge\n                    // of the chart\n                }\n                else if (rotation < 0 &&\n                    pxPos - factor * labelWidth < leftBound) {\n                    textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n                }\n                else if (rotation > 0 &&\n                    pxPos + factor * labelWidth > rightBound) {\n                    textWidth = Math.round((chartWidth - pxPos) /\n                        Math.cos(rotation * deg2rad));\n                }\n                if (textWidth) {\n                    if (tick.shortenLabel) {\n                        tick.shortenLabel();\n                    }\n                    else {\n                        css.width = Math.floor(textWidth) + 'px';\n                        if (!(labelOptions.style || {}).textOverflow) {\n                            css.textOverflow = 'ellipsis';\n                        }\n                        label.css(css);\n                    }\n                }\n            };\n            /**\n             * Try to replace the label if the same one already exists.\n             *\n             * @private\n             * @function Highcharts.Tick#moveLabel\n             * @param {string} str\n             * @param {Highcharts.XAxisLabelsOptions} labelOptions\n             *\n             * @return {void}\n             */\n            Tick.prototype.moveLabel = function (str, labelOptions) {\n                var tick = this,\n                    label = tick.label,\n                    moved = false,\n                    xAxis = tick.axis,\n                    chart = xAxis.chart,\n                    labelPos,\n                    reversed = xAxis.reversed,\n                    inverted = chart.inverted,\n                    xPos,\n                    yPos;\n                if (label && label.textStr === str) {\n                    tick.movedLabel = label;\n                    moved = true;\n                    delete tick.label;\n                }\n                else { // Find a label with the same string\n                    objectEach(xAxis.ticks, function (currentTick) {\n                        if (!moved &&\n                            !currentTick.isNew &&\n                            currentTick !== tick &&\n                            currentTick.label &&\n                            currentTick.label.textStr === str) {\n                            tick.movedLabel = currentTick.label;\n                            moved = true;\n                            currentTick.labelPos = tick.movedLabel.xy;\n                            delete currentTick.label;\n                        }\n                    });\n                }\n                // Create new label if the actual one is moved\n                if (!moved && (tick.labelPos || label)) {\n                    labelPos = tick.labelPos || label.xy;\n                    xPos = inverted ?\n                        labelPos.x : (reversed ? 0 : xAxis.width + xAxis.left);\n                    yPos = inverted ?\n                        (reversed ? (xAxis.width + xAxis.left) : 0) : labelPos.y;\n                    tick.movedLabel = tick.createLabel({ x: xPos, y: yPos }, str, labelOptions);\n                    if (tick.movedLabel) {\n                        tick.movedLabel.attr({ opacity: 0 });\n                    }\n                }\n            };\n            /**\n             * Put everything in place\n             *\n             * @private\n             * @param {number} index\n             * @param {boolean} [old]\n             *        Use old coordinates to prepare an animation into new position\n             * @param {number} [opacity]\n             * @return {voids}\n             */\n            Tick.prototype.render = function (index, old, opacity) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    pos = tick.pos,\n                    tickmarkOffset = pick(tick.tickmarkOffset,\n                    axis.tickmarkOffset),\n                    xy = tick.getPosition(horiz,\n                    pos,\n                    tickmarkOffset,\n                    old),\n                    x = xy.x,\n                    y = xy.y,\n                    reverseCrisp = ((horiz && x === axis.pos + axis.len) ||\n                        (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n                    opacity = pick(opacity, 1);\n                this.isActive = true;\n                // Create the grid line\n                this.renderGridLine(old, opacity, reverseCrisp);\n                // create the tick mark\n                this.renderMark(xy, opacity, reverseCrisp);\n                // the label is created on init - now move it into place\n                this.renderLabel(xy, old, opacity, index);\n                tick.isNew = false;\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Renders the gridLine.\n             *\n             * @private\n             * @param {boolean} old  Whether or not the tick is old\n             * @param {number} opacity  The opacity of the grid line\n             * @param {number} reverseCrisp  Modifier for avoiding overlapping 1 or -1\n             * @return {void}\n             */\n            Tick.prototype.renderGridLine = function (old, opacity, reverseCrisp) {\n                var tick = this, axis = tick.axis, options = axis.options, gridLine = tick.gridLine, gridLinePath, attribs = {}, pos = tick.pos, type = tick.type, tickmarkOffset = pick(tick.tickmarkOffset, axis.tickmarkOffset), renderer = axis.chart.renderer, gridPrefix = type ? type + 'Grid' : 'grid', gridLineWidth = options[gridPrefix + 'LineWidth'], gridLineColor = options[gridPrefix + 'LineColor'], dashStyle = options[gridPrefix + 'LineDashStyle'];\n                if (!gridLine) {\n                    if (!axis.chart.styledMode) {\n                        attribs.stroke = gridLineColor;\n                        attribs['stroke-width'] = gridLineWidth;\n                        if (dashStyle) {\n                            attribs.dashstyle = dashStyle;\n                        }\n                    }\n                    if (!type) {\n                        attribs.zIndex = 1;\n                    }\n                    if (old) {\n                        opacity = 0;\n                    }\n                    /**\n                     * The rendered grid line of the tick.\n                     * @name Highcharts.Tick#gridLine\n                     * @type {Highcharts.SVGElement|undefined}\n                     */\n                    tick.gridLine = gridLine = renderer.path()\n                        .attr(attribs)\n                        .addClass('highcharts-' + (type ? type + '-' : '') + 'grid-line')\n                        .add(axis.gridGroup);\n                }\n                if (gridLine) {\n                    gridLinePath = axis.getPlotLinePath({\n                        value: pos + tickmarkOffset,\n                        lineWidth: gridLine.strokeWidth() * reverseCrisp,\n                        force: 'pass',\n                        old: old\n                    });\n                    // If the parameter 'old' is set, the current call will be followed\n                    // by another call, therefore do not do any animations this time\n                    if (gridLinePath) {\n                        gridLine[old || tick.isNew ? 'attr' : 'animate']({\n                            d: gridLinePath,\n                            opacity: opacity\n                        });\n                    }\n                }\n            };\n            /**\n             * Renders the tick mark.\n             *\n             * @private\n             * @param {Highcharts.PositionObject} xy  The position vector of the mark\n             * @param {number} opacity  The opacity of the mark\n             * @param {number} reverseCrisp  Modifier for avoiding overlapping 1 or -1\n             * @return {void}\n             */\n            Tick.prototype.renderMark = function (xy, opacity, reverseCrisp) {\n                var tick = this, axis = tick.axis, options = axis.options, renderer = axis.chart.renderer, type = tick.type, tickPrefix = type ? type + 'Tick' : 'tick', tickSize = axis.tickSize(tickPrefix), mark = tick.mark, isNewMark = !mark, x = xy.x, y = xy.y, tickWidth = pick(options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1\n                    tickColor = options[tickPrefix + 'Color'];\n                if (tickSize) {\n                    // negate the length\n                    if (axis.opposite) {\n                        tickSize[0] = -tickSize[0];\n                    }\n                    // First time, create it\n                    if (isNewMark) {\n                        /**\n                         * The rendered mark of the tick.\n                         * @name Highcharts.Tick#mark\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        tick.mark = mark = renderer.path()\n                            .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n                            .add(axis.axisGroup);\n                        if (!axis.chart.styledMode) {\n                            mark.attr({\n                                stroke: tickColor,\n                                'stroke-width': tickWidth\n                            });\n                        }\n                    }\n                    mark[isNewMark ? 'attr' : 'animate']({\n                        d: tick.getMarkPath(x, y, tickSize[0], mark.strokeWidth() * reverseCrisp, axis.horiz, renderer),\n                        opacity: opacity\n                    });\n                }\n            };\n            /**\n             * Renders the tick label.\n             * Note: The label should already be created in init(), so it should only\n             * have to be moved into place.\n             *\n             * @private\n             * @param {Highcharts.PositionObject} xy  The position vector of the label\n             * @param {boolean} old  Whether or not the tick is old\n             * @param {number} opacity  The opacity of the label\n             * @param {number} index  The index of the tick\n             * @return {void}\n             */\n            Tick.prototype.renderLabel = function (xy, old, opacity, index) {\n                var tick = this,\n                    axis = tick.axis,\n                    horiz = axis.horiz,\n                    options = axis.options,\n                    label = tick.label,\n                    labelOptions = options.labels,\n                    step = labelOptions.step,\n                    tickmarkOffset = pick(tick.tickmarkOffset,\n                    axis.tickmarkOffset),\n                    show = true,\n                    x = xy.x,\n                    y = xy.y;\n                if (label && isNumber(x)) {\n                    label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n                    // Apply show first and show last. If the tick is both first and\n                    // last, it is a single centered tick, in which case we show the\n                    // label anyway (#2100).\n                    if ((tick.isFirst &&\n                        !tick.isLast &&\n                        !pick(options.showFirstLabel, 1)) ||\n                        (tick.isLast &&\n                            !tick.isFirst &&\n                            !pick(options.showLastLabel, 1))) {\n                        show = false;\n                        // Handle label overflow and show or hide accordingly\n                    }\n                    else if (horiz &&\n                        !labelOptions.step &&\n                        !labelOptions.rotation &&\n                        !old &&\n                        opacity !== 0) {\n                        tick.handleOverflow(xy);\n                    }\n                    // apply step\n                    if (step && index % step) {\n                        // show those indices dividable by step\n                        show = false;\n                    }\n                    // Set the new position, and show or hide\n                    if (show && isNumber(xy.y)) {\n                        xy.opacity = opacity;\n                        label[tick.isNewLabel ? 'attr' : 'animate'](xy);\n                        tick.isNewLabel = false;\n                    }\n                    else {\n                        label.attr('y', -9999); // #1338\n                        tick.isNewLabel = true;\n                    }\n                }\n            };\n            /**\n             * Replace labels with the moved ones to perform animation. Additionally\n             * destroy unused labels.\n             *\n             * @private\n             * @function Highcharts.Tick#replaceMovedLabel\n             * @return {void}\n             */\n            Tick.prototype.replaceMovedLabel = function () {\n                var tick = this,\n                    label = tick.label,\n                    axis = tick.axis,\n                    reversed = axis.reversed,\n                    chart = tick.axis.chart,\n                    inverted = chart.inverted,\n                    x,\n                    y;\n                // Animate and destroy\n                if (label && !tick.isNew) {\n                    x = inverted ? label.xy.x : (reversed ? axis.left : axis.width + axis.left);\n                    y = inverted ?\n                        (reversed ? axis.width + axis.top : axis.top) :\n                        label.xy.y;\n                    label.animate({ x: x, y: y, opacity: 0 }, void 0, label.destroy);\n                    delete tick.label;\n                }\n                axis.isDirty = true;\n                tick.label = tick.movedLabel;\n                delete tick.movedLabel;\n            };\n            return Tick;\n        }());\n        H.Tick = Tick;\n\n        return H.Tick;\n    });\n    _registerModule(_modules, 'parts/Time.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Highcharts, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Normalized interval.\n         *\n         * @interface Highcharts.TimeNormalizedObject\n         */ /**\n        * The count.\n        *\n        * @name Highcharts.TimeNormalizedObject#count\n        * @type {number}\n        */ /**\n        * The interval in axis values (ms).\n        *\n        * @name Highcharts.TimeNormalizedObject#unitRange\n        * @type {number}\n        */\n        /**\n         * Function of an additional date format specifier.\n         *\n         * @callback Highcharts.TimeFormatCallbackFunction\n         *\n         * @param {number} timestamp\n         *        The time to format.\n         *\n         * @return {string}\n         *         The formatted portion of the date.\n         */\n        /**\n         * Additonal time tick information.\n         *\n         * @interface Highcharts.TimeTicksInfoObject\n         * @extends Highcharts.TimeNormalizedObject\n         */ /**\n        * @name Highcharts.TimeTicksInfoObject#higherRanks\n        * @type {Array<string>}\n        */ /**\n        * @name Highcharts.TimeTicksInfoObject#totalRange\n        * @type {number}\n        */\n        /**\n         * Time ticks.\n         *\n         * @interface Highcharts.AxisTickPositionsArray\n         * @extends global.Array<number>\n         */ /**\n        * @name Highcharts.AxisTickPositionsArray#info\n        * @type {Highcharts.TimeTicksInfoObject|undefined}\n        */\n        /**\n         * A callback to return the time zone offset for a given datetime. It\n         * takes the timestamp in terms of milliseconds since January 1 1970,\n         * and returns the timezone offset in minutes. This provides a hook\n         * for drawing time based charts in specific time zones using their\n         * local DST crossover dates, with the help of external libraries.\n         *\n         * @callback Highcharts.TimezoneOffsetCallbackFunction\n         *\n         * @param {number} timestamp\n         * Timestamp in terms of milliseconds since January 1 1970.\n         *\n         * @return {number}\n         * Timezone offset in minutes.\n         */\n        var defined = U.defined,\n            error = U.error,\n            extend = U.extend,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pad = U.pad,\n            pick = U.pick,\n            splat = U.splat,\n            timeUnits = U.timeUnits;\n        var H = Highcharts,\n            win = H.win;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Time class. Time settings are applied in general for each page using\n         * `Highcharts.setOptions`, or individually for each Chart item through the\n         * [time](https://api.highcharts.com/highcharts/time) options set.\n         *\n         * The Time object is available from {@link Highcharts.Chart#time},\n         * which refers to  `Highcharts.time` if no individual time settings are\n         * applied.\n         *\n         * @example\n         * // Apply time settings globally\n         * Highcharts.setOptions({\n         *     time: {\n         *         timezone: 'Europe/London'\n         *     }\n         * });\n         *\n         * // Apply time settings by instance\n         * var chart = Highcharts.chart('container', {\n         *     time: {\n         *         timezone: 'America/New_York'\n         *     },\n         *     series: [{\n         *         data: [1, 4, 3, 5]\n         *     }]\n         * });\n         *\n         * // Use the Time object\n         * console.log(\n         *        'Current time in New York',\n         *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n         * );\n         *\n         * @since 6.0.5\n         *\n         * @class\n         * @name Highcharts.Time\n         *\n         * @param {Highcharts.TimeOptions} options\n         * Time options as defined in [chart.options.time](/highcharts/time).\n         */\n        var Time = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Time(options) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.options = {};\n                this.useUTC = false;\n                this.variableTimezone = false;\n                this.Date = win.Date;\n                /**\n                 * Get the time zone offset based on the current timezone information as\n                 * set in the global options.\n                 *\n                 * @function Highcharts.Time#getTimezoneOffset\n                 *\n                 * @param {number} timestamp\n                 *        The JavaScript timestamp to inspect.\n                 *\n                 * @return {number}\n                 *         The timezone offset in minutes compared to UTC.\n                 */\n                this.getTimezoneOffset = this.timezoneOffsetFunction();\n                this.update(options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Time units used in `Time.get` and `Time.set`\n             *\n             * @typedef {\"Date\"|\"Day\"|\"FullYear\"|\"Hours\"|\"Milliseconds\"|\"Minutes\"|\"Month\"|\"Seconds\"} Highcharts.TimeUnitValue\n             */\n            /**\n             * Get the value of a date object in given units, and subject to the Time\n             * object's current timezone settings. This function corresponds directly to\n             * JavaScripts `Date.getXXX / Date.getUTCXXX`, so instead of calling\n             * `date.getHours()` or `date.getUTCHours()` we will call\n             * `time.get('Hours')`.\n             *\n             * @function Highcharts.Time#get\n             *\n             * @param {Highcharts.TimeUnitValue} unit\n             * @param {Date} date\n             *\n             * @return {number}\n             *        The given time unit\n             */\n            Time.prototype.get = function (unit, date) {\n                if (this.variableTimezone || this.timezoneOffset) {\n                    var realMs = date.getTime();\n                    var ms = realMs - this.getTimezoneOffset(date);\n                    date.setTime(ms); // Temporary adjust to timezone\n                    var ret = date['getUTC' + unit]();\n                    date.setTime(realMs); // Reset\n                    return ret;\n                }\n                // UTC time with no timezone handling\n                if (this.useUTC) {\n                    return date['getUTC' + unit]();\n                }\n                // Else, local time\n                return date['get' + unit]();\n            };\n            /**\n             * Set the value of a date object in given units, and subject to the Time\n             * object's current timezone settings. This function corresponds directly to\n             * JavaScripts `Date.setXXX / Date.setUTCXXX`, so instead of calling\n             * `date.setHours(0)` or `date.setUTCHours(0)` we will call\n             * `time.set('Hours', 0)`.\n             *\n             * @function Highcharts.Time#set\n             *\n             * @param {Highcharts.TimeUnitValue} unit\n             * @param {Date} date\n             * @param {number} value\n             *\n             * @return {number}\n             *        The epoch milliseconds of the updated date\n             */\n            Time.prototype.set = function (unit, date, value) {\n                // UTC time with timezone handling\n                if (this.variableTimezone || this.timezoneOffset) {\n                    // For lower order time units, just set it directly using UTC\n                    // time\n                    if (unit === 'Milliseconds' ||\n                        unit === 'Seconds' ||\n                        unit === 'Minutes') {\n                        return date['setUTC' + unit](value);\n                    }\n                    // Higher order time units need to take the time zone into\n                    // account\n                    // Adjust by timezone\n                    var offset = this.getTimezoneOffset(date);\n                    var ms = date.getTime() - offset;\n                    date.setTime(ms);\n                    date['setUTC' + unit](value);\n                    var newOffset = this.getTimezoneOffset(date);\n                    ms = date.getTime() + newOffset;\n                    return date.setTime(ms);\n                }\n                // UTC time with no timezone handling\n                if (this.useUTC) {\n                    return date['setUTC' + unit](value);\n                }\n                // Else, local time\n                return date['set' + unit](value);\n            };\n            /**\n             * Update the Time object with current options. It is called internally on\n             * initializing Highcharts, after running `Highcharts.setOptions` and on\n             * `Chart.update`.\n             *\n             * @private\n             * @function Highcharts.Time#update\n             *\n             * @param {Highcharts.TimeOptions} options\n             *\n             * @return {void}\n             */\n            Time.prototype.update = function (options) {\n                var useUTC = pick(options && options.useUTC,\n                    true),\n                    time = this;\n                this.options = options = merge(true, this.options || {}, options);\n                // Allow using a different Date class\n                this.Date = options.Date || win.Date || Date;\n                this.useUTC = useUTC;\n                this.timezoneOffset = (useUTC && options.timezoneOffset);\n                this.getTimezoneOffset = this.timezoneOffsetFunction();\n                /*\n                 * The time object has options allowing for variable time zones, meaning\n                 * the axis ticks or series data needs to consider this.\n                 */\n                this.variableTimezone = !!(!useUTC ||\n                    options.getTimezoneOffset ||\n                    options.timezone);\n            };\n            /**\n             * Make a time and returns milliseconds. Interprets the inputs as UTC time,\n             * local time or a specific timezone time depending on the current time\n             * settings.\n             *\n             * @function Highcharts.Time#makeTime\n             *\n             * @param {number} year\n             *        The year\n             *\n             * @param {number} month\n             *        The month. Zero-based, so January is 0.\n             *\n             * @param {number} [date=1]\n             *        The day of the month\n             *\n             * @param {number} [hours=0]\n             *        The hour of the day, 0-23.\n             *\n             * @param {number} [minutes=0]\n             *        The minutes\n             *\n             * @param {number} [seconds=0]\n             *        The seconds\n             *\n             * @return {number}\n             *         The time in milliseconds since January 1st 1970.\n             */\n            Time.prototype.makeTime = function (year, month, date, hours, minutes, seconds) {\n                var d,\n                    offset,\n                    newOffset;\n                if (this.useUTC) {\n                    d = this.Date.UTC.apply(0, arguments);\n                    offset = this.getTimezoneOffset(d);\n                    d += offset;\n                    newOffset = this.getTimezoneOffset(d);\n                    if (offset !== newOffset) {\n                        d += newOffset - offset;\n                        // A special case for transitioning from summer time to winter time.\n                        // When the clock is set back, the same time is repeated twice, i.e.\n                        // 02:30 am is repeated since the clock is set back from 3 am to\n                        // 2 am. We need to make the same time as local Date does.\n                    }\n                    else if (offset - 36e5 === this.getTimezoneOffset(d - 36e5) &&\n                        !H.isSafari) {\n                        d -= 36e5;\n                    }\n                }\n                else {\n                    d = new this.Date(year, month, pick(date, 1), pick(hours, 0), pick(minutes, 0), pick(seconds, 0)).getTime();\n                }\n                return d;\n            };\n            /**\n             * Sets the getTimezoneOffset function. If the `timezone` option is set, a\n             * default getTimezoneOffset function with that timezone is returned. If\n             * a `getTimezoneOffset` option is defined, it is returned. If neither are\n             * specified, the function using the `timezoneOffset` option or 0 offset is\n             * returned.\n             *\n             * @private\n             * @function Highcharts.Time#timezoneOffsetFunction\n             *\n             * @return {Function}\n             *         A getTimezoneOffset function\n             */\n            Time.prototype.timezoneOffsetFunction = function () {\n                var time = this,\n                    options = this.options,\n                    moment = win.moment;\n                if (!this.useUTC) {\n                    return function (timestamp) {\n                        return new Date(timestamp.toString()).getTimezoneOffset() * 60000;\n                    };\n                }\n                if (options.timezone) {\n                    if (!moment) {\n                        // getTimezoneOffset-function stays undefined because it depends\n                        // on Moment.js\n                        error(25);\n                    }\n                    else {\n                        return function (timestamp) {\n                            return -moment.tz(timestamp, options.timezone).utcOffset() * 60000;\n                        };\n                    }\n                }\n                // If not timezone is set, look for the getTimezoneOffset callback\n                if (this.useUTC && options.getTimezoneOffset) {\n                    return function (timestamp) {\n                        return options.getTimezoneOffset(timestamp.valueOf()) * 60000;\n                    };\n                }\n                // Last, use the `timezoneOffset` option if set\n                return function () {\n                    return (time.timezoneOffset || 0) * 60000;\n                };\n            };\n            /**\n             * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970)\n             * into a human readable date string. The available format keys are listed\n             * below. Additional formats can be given in the\n             * {@link Highcharts.dateFormats} hook.\n             *\n             * Supported format keys:\n             * - `%a`: Short weekday, like 'Mon'\n             * - `%A`: Long weekday, like 'Monday'\n             * - `%d`: Two digit day of the month, 01 to 31\n             * - `%e`: Day of the month, 1 through 31\n             * - `%w`: Day of the week, 0 through 6\n             * - `%b`: Short month, like 'Jan'\n             * - `%B`: Long month, like 'January'\n             * - `%m`: Two digit month number, 01 through 12\n             * - `%y`: Two digits year, like 09 for 2009\n             * - `%Y`: Four digits year, like 2009\n             * - `%H`: Two digits hours in 24h format, 00 through 23\n             * - `%k`: Hours in 24h format, 0 through 23\n             * - `%I`: Two digits hours in 12h format, 00 through 11\n             * - `%l`: Hours in 12h format, 1 through 12\n             * - `%M`: Two digits minutes, 00 through 59\n             * - `%p`: Upper case AM or PM\n             * - `%P`: Lower case AM or PM\n             * - `%S`: Two digits seconds, 00 through 59\n             * - `%L`: Milliseconds (naming from Ruby)\n             *\n             * @example\n             * const time = new Highcharts.Time();\n             * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));\n             * console.log(s); // => 2020-01-01 00:00:00\n             *\n             * @function Highcharts.Time#dateFormat\n             *\n             * @param {string} format\n             *        The desired format where various time representations are\n             *        prefixed with %.\n             *\n             * @param {number} timestamp\n             *        The JavaScript timestamp.\n             *\n             * @param {boolean} [capitalize=false]\n             *        Upper case first letter in the return.\n             *\n             * @return {string}\n             *         The formatted date.\n             */\n            Time.prototype.dateFormat = function (format, timestamp, capitalize) {\n                var _a;\n                if (!defined(timestamp) || isNaN(timestamp)) {\n                    return ((_a = H.defaultOptions.lang) === null || _a === void 0 ? void 0 : _a.invalidDate) || '';\n                }\n                format = pick(format, '%Y-%m-%d %H:%M:%S');\n                var time = this, date = new this.Date(timestamp), \n                    // get the basic time values\n                    hours = this.get('Hours', date), day = this.get('Day', date), dayOfMonth = this.get('Date', date), month = this.get('Month', date), fullYear = this.get('FullYear', date), lang = H.defaultOptions.lang, langWeekdays = lang === null || lang === void 0 ? void 0 : lang.weekdays, shortWeekdays = lang === null || lang === void 0 ? void 0 : lang.shortWeekdays, \n                    // List all format keys. Custom formats can be added from the\n                    // outside.\n                    replacements = extend({\n                        // Day\n                        // Short weekday, like 'Mon'\n                        a: shortWeekdays ?\n                            shortWeekdays[day] :\n                            langWeekdays[day].substr(0, 3),\n                        // Long weekday, like 'Monday'\n                        A: langWeekdays[day],\n                        // Two digit day of the month, 01 to 31\n                        d: pad(dayOfMonth),\n                        // Day of the month, 1 through 31\n                        e: pad(dayOfMonth, 2, ' '),\n                        // Day of the week, 0 through 6\n                        w: day,\n                        // Week (none implemented)\n                        // 'W': weekNumber(),\n                        // Month\n                        // Short month, like 'Jan'\n                        b: lang.shortMonths[month],\n                        // Long month, like 'January'\n                        B: lang.months[month],\n                        // Two digit month number, 01 through 12\n                        m: pad(month + 1),\n                        // Month number, 1 through 12 (#8150)\n                        o: month + 1,\n                        // Year\n                        // Two digits year, like 09 for 2009\n                        y: fullYear.toString().substr(2, 2),\n                        // Four digits year, like 2009\n                        Y: fullYear,\n                        // Time\n                        // Two digits hours in 24h format, 00 through 23\n                        H: pad(hours),\n                        // Hours in 24h format, 0 through 23\n                        k: hours,\n                        // Two digits hours in 12h format, 00 through 11\n                        I: pad((hours % 12) || 12),\n                        // Hours in 12h format, 1 through 12\n                        l: (hours % 12) || 12,\n                        // Two digits minutes, 00 through 59\n                        M: pad(this.get('Minutes', date)),\n                        // Upper case AM or PM\n                        p: hours < 12 ? 'AM' : 'PM',\n                        // Lower case AM or PM\n                        P: hours < 12 ? 'am' : 'pm',\n                        // Two digits seconds, 00 through  59\n                        S: pad(date.getSeconds()),\n                        // Milliseconds (naming from Ruby)\n                        L: pad(Math.floor(timestamp % 1000), 3)\n                    }, H.dateFormats);\n                // Do the replaces\n                objectEach(replacements, function (val, key) {\n                    // Regex would do it in one line, but this is faster\n                    while (format.indexOf('%' + key) !== -1) {\n                        format = format.replace('%' + key, typeof val === 'function' ? val.call(time, timestamp) : val);\n                    }\n                });\n                // Optionally capitalize the string and return\n                return capitalize ?\n                    (format.substr(0, 1).toUpperCase() +\n                        format.substr(1)) :\n                    format;\n            };\n            /**\n             * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into\n             * an object.\n             * @private\n             * @param {string|Array<T>|Highcharts.Dictionary<T>} f - General format description\n             * @return {Highcharts.Dictionary<T>} - The object definition\n             */\n            Time.prototype.resolveDTLFormat = function (f) {\n                if (!isObject(f, true)) { // check for string or array\n                    f = splat(f);\n                    return {\n                        main: f[0],\n                        from: f[1],\n                        to: f[2]\n                    };\n                }\n                return f;\n            };\n            /**\n             * Return an array with time positions distributed on round time values\n             * right and right after min and max. Used in datetime axes as well as for\n             * grouping data on a datetime axis.\n             *\n             * @function Highcharts.Time#getTimeTicks\n             *\n             * @param {Highcharts.TimeNormalizedObject} normalizedInterval\n             *        The interval in axis values (ms) and the count\n             *\n             * @param {number} [min]\n             *        The minimum in axis values\n             *\n             * @param {number} [max]\n             *        The maximum in axis values\n             *\n             * @param {number} [startOfWeek=1]\n             *\n             * @return {Highcharts.AxisTickPositionsArray}\n             */\n            Time.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {\n                var time = this,\n                    Date = time.Date,\n                    tickPositions = [],\n                    i,\n                    higherRanks = {},\n                    minYear, // used in months and years as a basis for Date.UTC()\n                    // When crossing DST, use the max. Resolves #6278.\n                    minDate = new Date(min),\n                    interval = normalizedInterval.unitRange,\n                    count = normalizedInterval.count || 1,\n                    variableDayLength,\n                    minDay;\n                startOfWeek = pick(startOfWeek, 1);\n                if (defined(min)) { // #1300\n                    time.set('Milliseconds', minDate, interval >= timeUnits.second ?\n                        0 : // #3935\n                        count * Math.floor(time.get('Milliseconds', minDate) / count)); // #3652, #3654\n                    if (interval >= timeUnits.second) { // second\n                        time.set('Seconds', minDate, interval >= timeUnits.minute ?\n                            0 : // #3935\n                            count * Math.floor(time.get('Seconds', minDate) / count));\n                    }\n                    if (interval >= timeUnits.minute) { // minute\n                        time.set('Minutes', minDate, interval >= timeUnits.hour ?\n                            0 :\n                            count * Math.floor(time.get('Minutes', minDate) / count));\n                    }\n                    if (interval >= timeUnits.hour) { // hour\n                        time.set('Hours', minDate, interval >= timeUnits.day ?\n                            0 :\n                            count * Math.floor(time.get('Hours', minDate) / count));\n                    }\n                    if (interval >= timeUnits.day) { // day\n                        time.set('Date', minDate, interval >= timeUnits.month ?\n                            1 :\n                            Math.max(1, count * Math.floor(time.get('Date', minDate) / count)));\n                    }\n                    if (interval >= timeUnits.month) { // month\n                        time.set('Month', minDate, interval >= timeUnits.year ? 0 :\n                            count * Math.floor(time.get('Month', minDate) / count));\n                        minYear = time.get('FullYear', minDate);\n                    }\n                    if (interval >= timeUnits.year) { // year\n                        minYear -= minYear % count;\n                        time.set('FullYear', minDate, minYear);\n                    }\n                    // week is a special case that runs outside the hierarchy\n                    if (interval === timeUnits.week) {\n                        // get start of current week, independent of count\n                        minDay = time.get('Day', minDate);\n                        time.set('Date', minDate, (time.get('Date', minDate) -\n                            minDay + startOfWeek +\n                            // We don't want to skip days that are before\n                            // startOfWeek (#7051)\n                            (minDay < startOfWeek ? -7 : 0)));\n                    }\n                    // Get basics for variable time spans\n                    minYear = time.get('FullYear', minDate);\n                    var minMonth = time.get('Month', minDate), minDateDate = time.get('Date', minDate), minHours = time.get('Hours', minDate);\n                    // Redefine min to the floored/rounded minimum time (#7432)\n                    min = minDate.getTime();\n                    // Handle local timezone offset\n                    if (time.variableTimezone) {\n                        // Detect whether we need to take the DST crossover into\n                        // consideration. If we're crossing over DST, the day length may\n                        // be 23h or 25h and we need to compute the exact clock time for\n                        // each tick instead of just adding hours. This comes at a cost,\n                        // so first we find out if it is needed (#4951).\n                        variableDayLength = (\n                        // Long range, assume we're crossing over.\n                        max - min > 4 * timeUnits.month ||\n                            // Short range, check if min and max are in different time\n                            // zones.\n                            time.getTimezoneOffset(min) !==\n                                time.getTimezoneOffset(max));\n                    }\n                    // Iterate and add tick positions at appropriate values\n                    var t = minDate.getTime();\n                    i = 1;\n                    while (t < max) {\n                        tickPositions.push(t);\n                        // if the interval is years, use Date.UTC to increase years\n                        if (interval === timeUnits.year) {\n                            t = time.makeTime(minYear + i * count, 0);\n                            // if the interval is months, use Date.UTC to increase months\n                        }\n                        else if (interval === timeUnits.month) {\n                            t = time.makeTime(minYear, minMonth + i * count);\n                            // if we're using global time, the interval is not fixed as it\n                            // jumps one hour at the DST crossover\n                        }\n                        else if (variableDayLength &&\n                            (interval === timeUnits.day || interval === timeUnits.week)) {\n                            t = time.makeTime(minYear, minMonth, minDateDate +\n                                i * count * (interval === timeUnits.day ? 1 : 7));\n                        }\n                        else if (variableDayLength &&\n                            interval === timeUnits.hour &&\n                            count > 1) {\n                            // make sure higher ranks are preserved across DST (#6797,\n                            // #7621)\n                            t = time.makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n                            // else, the interval is fixed and we use simple addition\n                        }\n                        else {\n                            t += interval * count;\n                        }\n                        i++;\n                    }\n                    // push the last time\n                    tickPositions.push(t);\n                    // Handle higher ranks. Mark new days if the time is on midnight\n                    // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold\n                    // to prevent looping over dense data grouping (#6156).\n                    if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n                        tickPositions.forEach(function (t) {\n                            if (\n                            // Speed optimization, no need to run dateFormat unless\n                            // we're on a full or half hour\n                            t % 1800000 === 0 &&\n                                // Check for local or global midnight\n                                time.dateFormat('%H%M%S%L', t) === '000000000') {\n                                higherRanks[t] = 'day';\n                            }\n                        });\n                    }\n                }\n                // record information on the chosen unit - for dynamic label formatter\n                tickPositions.info = extend(normalizedInterval, {\n                    higherRanks: higherRanks,\n                    totalRange: interval * count\n                });\n                return tickPositions;\n            };\n            return Time;\n        }());\n        H.Time = Time;\n\n        return H.Time;\n    });\n    _registerModule(_modules, 'parts/Options.js', [_modules['parts/Globals.js'], _modules['parts/Time.js'], _modules['parts/Color.js'], _modules['parts/Utilities.js']], function (H, Time, Color, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * @typedef {\"plotBox\"|\"spacingBox\"} Highcharts.ButtonRelativeToValue\n         */\n        /**\n         * Gets fired when a series is added to the chart after load time, using the\n         * `addSeries` method. Returning `false` prevents the series from being added.\n         *\n         * @callback Highcharts.ChartAddSeriesCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {Highcharts.ChartAddSeriesEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Contains common event information. Through the `options` property you can\n         * access the series options that were passed to the `addSeries` method.\n         *\n         * @interface Highcharts.ChartAddSeriesEventObject\n         */ /**\n        * The series options that were passed to the `addSeries` method.\n        * @name Highcharts.ChartAddSeriesEventObject#options\n        * @type {Highcharts.SeriesOptionsType}\n        */ /**\n        * Prevents the default behaviour of the event.\n        * @name Highcharts.ChartAddSeriesEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * The event target.\n        * @name Highcharts.ChartAddSeriesEventObject#target\n        * @type {Highcharts.Chart}\n        */ /**\n        * The event type.\n        * @name Highcharts.ChartAddSeriesEventObject#type\n        * @type {\"addSeries\"}\n        */\n        /**\n         * Gets fired when clicking on the plot background.\n         *\n         * @callback Highcharts.ChartClickCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {Highcharts.PointerEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Contains an axes of the clicked spot.\n         *\n         * @interface Highcharts.ChartClickEventAxisObject\n         */ /**\n        * Axis at the clicked spot.\n        * @name Highcharts.ChartClickEventAxisObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Axis value at the clicked spot.\n        * @name Highcharts.ChartClickEventAxisObject#value\n        * @type {number}\n        */\n        /**\n         * Contains information about the clicked spot on the chart. Remember the unit\n         * of a datetime axis is milliseconds since 1970-01-01 00:00:00.\n         *\n         * @interface Highcharts.ChartClickEventObject\n         * @extends Highcharts.PointerEventObject\n         */ /**\n        * Information about the x-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#xAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>}\n        */ /**\n        * Information about the y-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#yAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>}\n        */ /**\n        * Information about the z-axis on the clicked spot.\n        * @name Highcharts.ChartClickEventObject#zAxis\n        * @type {Array<Highcharts.ChartClickEventAxisObject>|undefined}\n        */\n        /**\n         * Gets fired when the chart is finished loading.\n         *\n         * @callback Highcharts.ChartLoadCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Fires when the chart is redrawn, either after a call to `chart.redraw()` or\n         * after an axis, series or point is modified with the `redraw` option set to\n         * `true`.\n         *\n         * @callback Highcharts.ChartRedrawCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired after initial load of the chart (directly after the `load` event),\n         * and after each redraw (directly after the `redraw` event).\n         *\n         * @callback Highcharts.ChartRenderCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired when an area of the chart has been selected. The default action\n         * for the selection event is to zoom the chart to the selected area. It can be\n         * prevented by calling `event.preventDefault()` or return false.\n         *\n         * @callback Highcharts.ChartSelectionCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        The chart on which the event occured.\n         *\n         * @param {global.ChartSelectionContextObject} event\n         *        Event informations\n         *\n         * @return {boolean|undefined}\n         *         Return false to prevent the default action, usually zoom.\n         */\n        /**\n         * The primary axes are `xAxis[0]` and `yAxis[0]`. Remember the unit of a\n         * datetime axis is milliseconds since 1970-01-01 00:00:00.\n         *\n         * @interface Highcharts.ChartSelectionContextObject\n         * @extends global.Event\n         */ /**\n        * Arrays containing the axes of each dimension and each axis' min and max\n        * values.\n        * @name Highcharts.ChartSelectionContextObject#xAxis\n        * @type {Array<Highcharts.ChartSelectionAxisContextObject>}\n        */ /**\n        * Arrays containing the axes of each dimension and each axis' min and max\n        * values.\n        * @name Highcharts.ChartSelectionContextObject#yAxis\n        * @type {Array<Highcharts.ChartSelectionAxisContextObject>}\n        */\n        /**\n         * Axis context of the selection.\n         *\n         * @interface Highcharts.ChartSelectionAxisContextObject\n         */ /**\n        * The selected Axis.\n        * @name Highcharts.ChartSelectionAxisContextObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * The maximum axis value, either automatic or set manually.\n        * @name Highcharts.ChartSelectionAxisContextObject#max\n        * @type {number}\n        */ /**\n        * The minimum axis value, either automatic or set manually.\n        * @name Highcharts.ChartSelectionAxisContextObject#min\n        * @type {number}\n        */\n        var color = Color.parse;\n        var merge = U.merge;\n        var isTouchDevice = H.isTouchDevice,\n            svg = H.svg;\n        /* ************************************************************************** *\n         * Handle the options                                                         *\n         * ************************************************************************** */\n        /**\n         * Global default settings.\n         *\n         * @name Highcharts.defaultOptions\n         * @type {Highcharts.Options}\n         */ /**\n        * @optionparent\n        */\n        H.defaultOptions = {\n            /**\n             * An array containing the default colors for the chart's series. When\n             * all colors are used, new colors are pulled from the start again.\n             *\n             * Default colors can also be set on a series or series.type basis,\n             * see [column.colors](#plotOptions.column.colors),\n             * [pie.colors](#plotOptions.pie.colors).\n             *\n             * In styled mode, the colors option doesn't exist. Instead, colors\n             * are defined in CSS and applied either through series or point class\n             * names, or through the [chart.colorCount](#chart.colorCount) option.\n             *\n             *\n             * ### Legacy\n             *\n             * In Highcharts 3.x, the default colors were:\n             * ```js\n             * colors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce',\n             *         '#492970', '#f28f43', '#77a1e5', '#c42525', '#a6c96a']\n             * ```\n             *\n             * In Highcharts 2.x, the default colors were:\n             * ```js\n             * colors: ['#4572A7', '#AA4643', '#89A54E', '#80699B', '#3D96AE',\n             *         '#DB843D', '#92A8CD', '#A47D7C', '#B5CA92']\n             * ```\n             *\n             * @sample {highcharts} highcharts/chart/colors/\n             *         Assign a global color theme\n             *\n             * @type    {Array<Highcharts.ColorString>}\n             * @default [\"#7cb5ec\", \"#434348\", \"#90ed7d\", \"#f7a35c\", \"#8085e9\",\n             *          \"#f15c80\", \"#e4d354\", \"#2b908f\", \"#f45b5b\", \"#91e8e1\"]\n             */\n            colors: '#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1'.split(' '),\n            /**\n             * Styled mode only. Configuration object for adding SVG definitions for\n             * reusable elements. See [gradients, shadows and\n             * patterns](https://www.highcharts.com/docs/chart-design-and-style/gradients-shadows-and-patterns)\n             * for more information and code examples.\n             *\n             * @type      {*}\n             * @since     5.0.0\n             * @apioption defs\n             */\n            /**\n             * @ignore-option\n             */\n            symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n            /**\n             * The language object is global and it can't be set on each chart\n             * initialization. Instead, use `Highcharts.setOptions` to set it before any\n             * chart is initialized.\n             *\n             * ```js\n             * Highcharts.setOptions({\n             *     lang: {\n             *         months: [\n             *             'Janvier', 'Février', 'Mars', 'Avril',\n             *             'Mai', 'Juin', 'Juillet', 'Août',\n             *             'Septembre', 'Octobre', 'Novembre', 'Décembre'\n             *         ],\n             *         weekdays: [\n             *             'Dimanche', 'Lundi', 'Mardi', 'Mercredi',\n             *             'Jeudi', 'Vendredi', 'Samedi'\n             *         ]\n             *     }\n             * });\n             * ```\n             */\n            lang: {\n                /**\n                 * The loading text that appears when the chart is set into the loading\n                 * state following a call to `chart.showLoading`.\n                 */\n                loading: 'Loading...',\n                /**\n                 * An array containing the months names. Corresponds to the `%B` format\n                 * in `Highcharts.dateFormat()`.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n                 *          \"July\", \"August\", \"September\", \"October\", \"November\",\n                 *          \"December\"]\n                 */\n                months: [\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\n                    'August', 'September', 'October', 'November', 'December'\n                ],\n                /**\n                 * An array containing the months names in abbreviated form. Corresponds\n                 * to the `%b` format in `Highcharts.dateFormat()`.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n                 *          \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n                 */\n                shortMonths: [\n                    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n                    'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n                ],\n                /**\n                 * An array containing the weekday names.\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\",\n                 *          \"Friday\", \"Saturday\"]\n                 */\n                weekdays: [\n                    'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n                    'Thursday', 'Friday', 'Saturday'\n                ],\n                /**\n                 * Short week days, starting Sunday. If not specified, Highcharts uses\n                 * the first three letters of the `lang.weekdays` option.\n                 *\n                 * @sample highcharts/lang/shortweekdays/\n                 *         Finnish two-letter abbreviations\n                 *\n                 * @type      {Array<string>}\n                 * @since     4.2.4\n                 * @apioption lang.shortWeekdays\n                 */\n                /**\n                 * What to show in a date field for invalid dates. Defaults to an empty\n                 * string.\n                 *\n                 * @type      {string}\n                 * @since     4.1.8\n                 * @product   highcharts highstock\n                 * @apioption lang.invalidDate\n                 */\n                /**\n                 * The title appearing on hovering the zoom in button. The text itself\n                 * defaults to \"+\" and can be changed in the button options.\n                 *\n                 * @type      {string}\n                 * @default   Zoom in\n                 * @product   highmaps\n                 * @apioption lang.zoomIn\n                 */\n                /**\n                 * The title appearing on hovering the zoom out button. The text itself\n                 * defaults to \"-\" and can be changed in the button options.\n                 *\n                 * @type      {string}\n                 * @default   Zoom out\n                 * @product   highmaps\n                 * @apioption lang.zoomOut\n                 */\n                /**\n                 * The default decimal point used in the `Highcharts.numberFormat`\n                 * method unless otherwise specified in the function arguments.\n                 *\n                 * @since 1.2.2\n                 */\n                decimalPoint: '.',\n                /**\n                 * [Metric prefixes](https://en.wikipedia.org/wiki/Metric_prefix) used\n                 * to shorten high numbers in axis labels. Replacing any of the\n                 * positions with `null` causes the full number to be written. Setting\n                 * `numericSymbols` to `null` disables shortening altogether.\n                 *\n                 * @sample {highcharts} highcharts/lang/numericsymbols/\n                 *         Replacing the symbols with text\n                 * @sample {highstock} highcharts/lang/numericsymbols/\n                 *         Replacing the symbols with text\n                 *\n                 * @type    {Array<string>}\n                 * @default [\"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n                 * @since   2.3.0\n                 */\n                numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'],\n                /**\n                 * The magnitude of [numericSymbols](#lang.numericSymbol) replacements.\n                 * Use 10000 for Japanese, Korean and various Chinese locales, which\n                 * use symbols for 10^4, 10^8 and 10^12.\n                 *\n                 * @sample highcharts/lang/numericsymbolmagnitude/\n                 *         10000 magnitude for Japanese\n                 *\n                 * @type      {number}\n                 * @default   1000\n                 * @since     5.0.3\n                 * @apioption lang.numericSymbolMagnitude\n                 */\n                /**\n                 * The text for the label appearing when a chart is zoomed.\n                 *\n                 * @since 1.2.4\n                 */\n                resetZoom: 'Reset zoom',\n                /**\n                 * The tooltip title for the label appearing when a chart is zoomed.\n                 *\n                 * @since 1.2.4\n                 */\n                resetZoomTitle: 'Reset zoom level 1:1',\n                /**\n                 * The default thousands separator used in the `Highcharts.numberFormat`\n                 * method unless otherwise specified in the function arguments. Defaults\n                 * to a single space character, which is recommended in\n                 * [ISO 31-0](https://en.wikipedia.org/wiki/ISO_31-0#Numbers) and works\n                 * across Anglo-American and continental European languages.\n                 *\n                 * @default \\u0020\n                 * @since   1.2.2\n                 */\n                thousandsSep: ' '\n            },\n            /**\n             * Global options that don't apply to each chart. These options, like\n             * the `lang` options, must be set using the `Highcharts.setOptions`\n             * method.\n             *\n             * ```js\n             * Highcharts.setOptions({\n             *     global: {\n             *         useUTC: false\n             *     }\n             * });\n             * ```\n             */\n            /**\n             * _Canvg rendering for Android 2.x is removed as of Highcharts 5.0\\.\n             * Use the [libURL](#exporting.libURL) option to configure exporting._\n             *\n             * The URL to the additional file to lazy load for Android 2.x devices.\n             * These devices don't support SVG, so we download a helper file that\n             * contains [canvg](https://github.com/canvg/canvg), its dependency\n             * rbcolor, and our own CanVG Renderer class. To avoid hotlinking to\n             * our site, you can install canvas-tools.js on your own server and\n             * change this option accordingly.\n             *\n             * @deprecated\n             *\n             * @type      {string}\n             * @default   https://code.highcharts.com/{version}/modules/canvas-tools.js\n             * @product   highcharts highmaps\n             * @apioption global.canvasToolsURL\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.useUTC](#time.useUTC) that supports individual time settings\n             * per chart.\n             *\n             * @deprecated\n             *\n             * @type      {boolean}\n             * @apioption global.useUTC\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.Date](#time.Date) that supports individual time settings\n             * per chart.\n             *\n             * @deprecated\n             *\n             * @type      {Function}\n             * @product   highcharts highstock\n             * @apioption global.Date\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.getTimezoneOffset](#time.getTimezoneOffset) that supports\n             * individual time settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {Function}\n             * @product   highcharts highstock\n             * @apioption global.getTimezoneOffset\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.timezone](#time.timezone) that supports individual time\n             * settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {string}\n             * @product   highcharts highstock\n             * @apioption global.timezone\n             */\n            /**\n             * This option is deprecated since v6.0.5. Instead, use\n             * [time.timezoneOffset](#time.timezoneOffset) that supports individual\n             * time settings per chart.\n             *\n             * @deprecated\n             *\n             * @type      {number}\n             * @product   highcharts highstock\n             * @apioption global.timezoneOffset\n             */\n            global: {},\n            /**\n             * Time options that can apply globally or to individual charts. These\n             * settings affect how `datetime` axes are laid out, how tooltips are\n             * formatted, how series\n             * [pointIntervalUnit](#plotOptions.series.pointIntervalUnit) works and how\n             * the Highstock range selector handles time.\n             *\n             * The common use case is that all charts in the same Highcharts object\n             * share the same time settings, in which case the global settings are set\n             * using `setOptions`.\n             *\n             * ```js\n             * // Apply time settings globally\n             * Highcharts.setOptions({\n             *     time: {\n             *         timezone: 'Europe/London'\n             *     }\n             * });\n             * // Apply time settings by instance\n             * var chart = Highcharts.chart('container', {\n             *     time: {\n             *         timezone: 'America/New_York'\n             *     },\n             *     series: [{\n             *         data: [1, 4, 3, 5]\n             *     }]\n             * });\n             *\n             * // Use the Time object\n             * console.log(\n             *        'Current time in New York',\n             *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())\n             * );\n             * ```\n             *\n             * Since v6.0.5, the time options were moved from the `global` obect to the\n             * `time` object, and time options can be set on each individual chart.\n             *\n             * @sample {highcharts|highstock}\n             *         highcharts/time/timezone/\n             *         Set the timezone globally\n             * @sample {highcharts}\n             *         highcharts/time/individual/\n             *         Set the timezone per chart instance\n             * @sample {highstock}\n             *         stock/time/individual/\n             *         Set the timezone per chart instance\n             *\n             * @since     6.0.5\n             * @optionparent time\n             */\n            time: {\n                /**\n                 * A custom `Date` class for advanced date handling. For example,\n                 * [JDate](https://github.com/tahajahangir/jdate) can be hooked in to\n                 * handle Jalali dates.\n                 *\n                 * @type      {*}\n                 * @since     4.0.4\n                 * @product   highcharts highstock gantt\n                 */\n                Date: void 0,\n                /**\n                 * A callback to return the time zone offset for a given datetime. It\n                 * takes the timestamp in terms of milliseconds since January 1 1970,\n                 * and returns the timezone offset in minutes. This provides a hook\n                 * for drawing time based charts in specific time zones using their\n                 * local DST crossover dates, with the help of external libraries.\n                 *\n                 * @see [global.timezoneOffset](#global.timezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/gettimezoneoffset/\n                 *         Use moment.js to draw Oslo time regardless of browser locale\n                 *\n                 * @type      {Highcharts.TimezoneOffsetCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 */\n                getTimezoneOffset: void 0,\n                /**\n                 * Requires [moment.js](https://momentjs.com/). If the timezone option\n                 * is specified, it creates a default\n                 * [getTimezoneOffset](#time.getTimezoneOffset) function that looks\n                 * up the specified timezone in moment.js. If moment.js is not included,\n                 * this throws a Highcharts error in the console, but does not crash the\n                 * chart.\n                 *\n                 * @see [getTimezoneOffset](#time.getTimezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/timezone/\n                 *         Europe/Oslo\n                 *\n                 * @type      {string}\n                 * @since     5.0.7\n                 * @product   highcharts highstock gantt\n                 */\n                timezone: void 0,\n                /**\n                 * The timezone offset in minutes. Positive values are west, negative\n                 * values are east of UTC, as in the ECMAScript\n                 * [getTimezoneOffset](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)\n                 * method. Use this to display UTC based data in a predefined time zone.\n                 *\n                 * @see [time.getTimezoneOffset](#time.getTimezoneOffset)\n                 *\n                 * @sample {highcharts|highstock} highcharts/time/timezoneoffset/\n                 *         Timezone offset\n                 *\n                 * @since     3.0.8\n                 * @product   highcharts highstock gantt\n                 */\n                timezoneOffset: 0,\n                /**\n                 * Whether to use UTC time for axis scaling, tickmark placement and\n                 * time display in `Highcharts.dateFormat`. Advantages of using UTC\n                 * is that the time displays equally regardless of the user agent's\n                 * time zone settings. Local time can be used when the data is loaded\n                 * in real time or when correct Daylight Saving Time transitions are\n                 * required.\n                 *\n                 * @sample {highcharts} highcharts/time/useutc-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/time/useutc-false/\n                 *         False\n                 */\n                useUTC: true\n            },\n            /**\n             * General options for the chart.\n             */\n            chart: {\n                /**\n                 * Default `mapData` for all series. If set to a string, it functions\n                 * as an index into the `Highcharts.maps` array. Otherwise it is\n                 * interpreted as map data.\n                 *\n                 * @see [mapData](#series.map.mapData)\n                 *\n                 * @sample    maps/demo/geojson\n                 *            Loading geoJSON data\n                 * @sample    maps/chart/topojson\n                 *            Loading topoJSON converted to geoJSON\n                 *\n                 * @type      {string|Array<*>|Highcharts.GeoJSON}\n                 * @since     5.0.0\n                 * @product   highmaps\n                 * @apioption chart.map\n                 */\n                /**\n                 * Set lat/lon transformation definitions for the chart. If not defined,\n                 * these are extracted from the map data.\n                 *\n                 * @type      {*}\n                 * @since     5.0.0\n                 * @product   highmaps\n                 * @apioption chart.mapTransforms\n                 */\n                /**\n                 * When using multiple axis, the ticks of two or more opposite axes\n                 * will automatically be aligned by adding ticks to the axis or axes\n                 * with the least ticks, as if `tickAmount` were specified.\n                 *\n                 * This can be prevented by setting `alignTicks` to false. If the grid\n                 * lines look messy, it's a good idea to hide them for the secondary\n                 * axis by setting `gridLineWidth` to 0.\n                 *\n                 * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n                 * then the `alignTicks ` will be disabled for the Axis.\n                 *\n                 * Disabled for logarithmic axes.\n                 *\n                 * @sample {highcharts} highcharts/chart/alignticks-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/alignticks-false/\n                 *         False\n                 * @sample {highstock} stock/chart/alignticks-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/alignticks-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption chart.alignTicks\n                 */\n                /**\n                 * Set the overall animation for all chart updating. Animation can be\n                 * disabled throughout the chart by setting it to false here. It can\n                 * be overridden for each individual API method as a function parameter.\n                 * The only animation not affected by this option is the initial series\n                 * animation, see [plotOptions.series.animation](\n                 * #plotOptions.series.animation).\n                 *\n                 * The animation can either be set as a boolean or a configuration\n                 * object. If `true`, it will use the 'swing' jQuery easing and a\n                 * duration of 500 ms. If used as a configuration object, the following\n                 * properties are supported:\n                 *\n                 * - **duration**: The duration of the animation in milliseconds.\n                 *\n                 * - **easing**: A string reference to an easing function set on the\n                 *   `Math` object. See\n                 *   [the easing demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-animation-easing/).\n                 *\n                 * When zooming on a series with less than 100 points, the chart redraw\n                 * will be done with animation, but in case of more data points, it is\n                 * necessary to set this option to ensure animation on zoom.\n                 *\n                 * @sample {highcharts} highcharts/chart/animation-none/\n                 *         Updating with no animation\n                 * @sample {highcharts} highcharts/chart/animation-duration/\n                 *         With a longer duration\n                 * @sample {highcharts} highcharts/chart/animation-easing/\n                 *         With a jQuery UI easing\n                 * @sample {highmaps} maps/chart/animation-none/\n                 *         Updating with no animation\n                 * @sample {highmaps} maps/chart/animation-duration/\n                 *         With a longer duration\n                 *\n                 * @type      {boolean|Highcharts.AnimationOptionsObject}\n                 * @default   undefined\n                 * @apioption chart.animation\n                 */\n                /**\n                 * A CSS class name to apply to the charts container `div`, allowing\n                 * unique CSS styling for each chart.\n                 *\n                 * @type      {string}\n                 * @apioption chart.className\n                 */\n                /**\n                 * Event listeners for the chart.\n                 *\n                 * @apioption chart.events\n                 */\n                /**\n                 * Fires when a series is added to the chart after load time, using the\n                 * `addSeries` method. One parameter, `event`, is passed to the\n                 * function, containing common event information. Through\n                 * `event.options` you can access the series options that were passed to\n                 * the `addSeries` method. Returning false prevents the series from\n                 * being added.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-addseries/\n                 *         Alert on add series\n                 * @sample {highstock} stock/chart/events-addseries/\n                 *         Alert on add series\n                 *\n                 * @type      {Highcharts.ChartAddSeriesCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.addSeries\n                 */\n                /**\n                 * Fires when clicking on the plot background. One parameter, `event`,\n                 * is passed to the function, containing common event information.\n                 *\n                 * Information on the clicked spot can be found through `event.xAxis`\n                 * and `event.yAxis`, which are arrays containing the axes of each\n                 * dimension and each axis' value at the clicked spot. The primary axes\n                 * are `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n                 * datetime axis is milliseconds since 1970-01-01 00:00:00.\n                 *\n                 * ```js\n                 * click: function(e) {\n                 *     console.log(\n                 *         Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),\n                 *         e.yAxis[0].value\n                 *     )\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/chart/events-click/\n                 *         Alert coordinates on click\n                 * @sample {highcharts} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 * @sample {highstock} stock/chart/events-click/\n                 *         Alert coordinates on click\n                 * @sample {highstock} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 * @sample {highmaps} maps/chart/events-click/\n                 *         Record coordinates on click\n                 * @sample {highmaps} highcharts/chart/events-container/\n                 *         Alternatively, attach event to container\n                 *\n                 * @type      {Highcharts.ChartClickCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.click\n                 */\n                /**\n                 * Fires when the chart is finished loading. Since v4.2.2, it also waits\n                 * for images to be loaded, for example from point markers. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * There is also a second parameter to the chart constructor where a\n                 * callback function can be passed to be executed on chart.load.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-load/\n                 *         Alert on chart load\n                 * @sample {highstock} stock/chart/events-load/\n                 *         Alert on chart load\n                 * @sample {highmaps} maps/chart/events-load/\n                 *         Add series on chart load\n                 *\n                 * @type      {Highcharts.ChartLoadCallbackFunction}\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.load\n                 */\n                /**\n                 * Fires when the chart is redrawn, either after a call to\n                 * `chart.redraw()` or after an axis, series or point is modified with\n                 * the `redraw` option set to `true`. One parameter, `event`, is passed\n                 * to the function, containing common event information.\n                 *\n                 * @sample {highcharts} highcharts/chart/events-redraw/\n                 *         Alert on chart redraw\n                 * @sample {highstock} stock/chart/events-redraw/\n                 *         Alert on chart redraw when adding a series or moving the\n                 *         zoomed range\n                 * @sample {highmaps} maps/chart/events-redraw/\n                 *         Set subtitle on chart redraw\n                 *\n                 * @type      {Highcharts.ChartRedrawCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.redraw\n                 */\n                /**\n                 * Fires after initial load of the chart (directly after the `load`\n                 * event), and after each redraw (directly after the `redraw` event).\n                 *\n                 * @type      {Highcharts.ChartRenderCallbackFunction}\n                 * @since     5.0.7\n                 * @context   Highcharts.Chart\n                 * @apioption chart.events.render\n                 */\n                /**\n                 * Fires when an area of the chart has been selected. Selection is\n                 * enabled by setting the chart's zoomType. One parameter, `event`, is\n                 * passed to the function, containing common event information. The\n                 * default action for the selection event is to zoom the chart to the\n                 * selected area. It can be prevented by calling\n                 * `event.preventDefault()` or return false.\n                 *\n                 * Information on the selected area can be found through `event.xAxis`\n                 * and `event.yAxis`, which are arrays containing the axes of each\n                 * dimension and each axis' min and max values. The primary axes are\n                 * `event.xAxis[0]` and `event.yAxis[0]`. Remember the unit of a\n                 * datetime axis is milliseconds since 1970-01-01 00:00:00.\n                 *\n                 * ```js\n                 * selection: function(event) {\n                 *     // log the min and max of the primary, datetime x-axis\n                 *     console.log(\n                 *         Highcharts.dateFormat(\n                 *             '%Y-%m-%d %H:%M:%S',\n                 *             event.xAxis[0].min\n                 *         ),\n                 *         Highcharts.dateFormat(\n                 *             '%Y-%m-%d %H:%M:%S',\n                 *             event.xAxis[0].max\n                 *         )\n                 *     );\n                 *     // log the min and max of the y axis\n                 *     console.log(event.yAxis[0].min, event.yAxis[0].max);\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/chart/events-selection/\n                 *         Report on selection and reset\n                 * @sample {highcharts} highcharts/chart/events-selection-points/\n                 *         Select a range of points through a drag selection\n                 * @sample {highstock} stock/chart/events-selection/\n                 *         Report on selection and reset\n                 * @sample {highstock} highcharts/chart/events-selection-points/\n                 *         Select a range of points through a drag selection\n                 *         (Highcharts)\n                 *\n                 * @type      {Highcharts.ChartSelectionCallbackFunction}\n                 * @apioption chart.events.selection\n                 */\n                /**\n                 * The margin between the outer edge of the chart and the plot area.\n                 * The numbers in the array designate top, right, bottom and left\n                 * respectively. Use the options `marginTop`, `marginRight`,\n                 * `marginBottom` and `marginLeft` for shorthand setting of one option.\n                 *\n                 * By default there is no margin. The actual space is dynamically\n                 * calculated from the offset of axis labels, axis title, title,\n                 * subtitle and legend in addition to the `spacingTop`, `spacingRight`,\n                 * `spacingBottom` and `spacingLeft` options.\n                 *\n                 * @sample {highcharts} highcharts/chart/margins-zero/\n                 *         Zero margins\n                 * @sample {highstock} stock/chart/margin-zero/\n                 *         Zero margins\n                 *\n                 * @type      {number|Array<number>}\n                 * @apioption chart.margin\n                 */\n                /**\n                 * The margin between the bottom outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingBottom`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginbottom/\n                 *         100px bottom margin\n                 * @sample {highstock} stock/chart/marginbottom/\n                 *         100px bottom margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginBottom\n                 */\n                /**\n                 * The margin between the left outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingLeft`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginleft/\n                 *         150px left margin\n                 * @sample {highstock} stock/chart/marginleft/\n                 *         150px left margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginLeft\n                 */\n                /**\n                 * The margin between the right outer edge of the chart and the plot\n                 * area. Use this to set a fixed pixel value for the margin as opposed\n                 * to the default dynamic margin. See also `spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/chart/marginright/\n                 *         100px right margin\n                 * @sample {highstock} stock/chart/marginright/\n                 *         100px right margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginRight\n                 */\n                /**\n                 * The margin between the top outer edge of the chart and the plot area.\n                 * Use this to set a fixed pixel value for the margin as opposed to\n                 * the default dynamic margin. See also `spacingTop`.\n                 *\n                 * @sample {highcharts} highcharts/chart/margintop/ 100px top margin\n                 * @sample {highstock} stock/chart/margintop/\n                 *         100px top margin\n                 * @sample {highmaps} maps/chart/margin/\n                 *         100px margins\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption chart.marginTop\n                 */\n                /**\n                 * Callback function to override the default function that formats all\n                 * the numbers in the chart. Returns a string with the formatted number.\n                 *\n                 * @sample highcharts/members/highcharts-numberformat\n                 *      Arabic digits in Highcharts\n                 * @type {Highcharts.NumberFormatterCallbackFunction}\n                 * @since 8.0.0\n                 * @apioption chart.numberFormatter\n                 */\n                /**\n                 * Allows setting a key to switch between zooming and panning. Can be\n                 * one of `alt`, `ctrl`, `meta` (the command key on Mac and Windows\n                 * key on Windows) or `shift`. The keys are mapped directly to the key\n                 * properties of the click event argument (`event.altKey`,\n                 * `event.ctrlKey`, `event.metaKey` and `event.shiftKey`).\n                 *\n                 * @type       {string}\n                 * @since      4.0.3\n                 * @product    highcharts gantt\n                 * @validvalue [\"alt\", \"ctrl\", \"meta\", \"shift\"]\n                 * @apioption  chart.panKey\n                 */\n                /**\n                 * Allow panning in a chart. Best used with [panKey](#chart.panKey)\n                 * to combine zooming and panning.\n                 *\n                 * On touch devices, when the [tooltip.followTouchMove](\n                 * #tooltip.followTouchMove) option is `true` (default), panning\n                 * requires two fingers. To allow panning with one finger, set\n                 * `followTouchMove` to `false`.\n                 *\n                 * @sample  {highcharts} highcharts/chart/pankey/ Zooming and panning\n                 * @sample  {highstock} stock/chart/panning/ Zooming and xy panning\n                 *\n                 * @product highcharts highstock gantt\n                 * @apioption chart.panning\n                 */\n                /**\n                 * Enable or disable chart panning.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} true\n                 * @apioption chart.panning.enabled\n                 */\n                /**\n                 * Decides in what dimensions the user can pan the chart. Can be\n                 * one of `x`, `y`, or `xy`.\n                 *\n                 * @sample {highcharts} highcharts/chart/panning-type\n                 *         Zooming and xy panning\n                 *\n                 * @type    {string}\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @default x\n                 * @apioption chart.panning.type\n                 */\n                /**\n                 * Equivalent to [zoomType](#chart.zoomType), but for multitouch\n                 * gestures only. By default, the `pinchType` is the same as the\n                 * `zoomType` setting. However, pinching can be enabled separately in\n                 * some cases, for example in stock charts where a mouse drag pans the\n                 * chart, while pinching is enabled. When [tooltip.followTouchMove](\n                 * #tooltip.followTouchMove) is true, pinchType only applies to\n                 * two-finger touches.\n                 *\n                 * @type       {string}\n                 * @default    {highcharts} undefined\n                 * @default    {highstock} x\n                 * @since      3.0\n                 * @product    highcharts highstock gantt\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @apioption  chart.pinchType\n                 */\n                /**\n                 * Whether to apply styled mode. When in styled mode, no presentational\n                 * attributes or CSS are applied to the chart SVG. Instead, CSS rules\n                 * are required to style the chart. The default style sheet is\n                 * available from `https://code.highcharts.com/css/highcharts.css`.\n                 *\n                 * @type       {boolean}\n                 * @default    false\n                 * @since      7.0\n                 * @apioption  chart.styledMode\n                 */\n                styledMode: false,\n                /**\n                 * The corner radius of the outer chart border.\n                 *\n                 * @sample {highcharts} highcharts/chart/borderradius/\n                 *         20px radius\n                 * @sample {highstock} stock/chart/border/\n                 *         10px radius\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 */\n                borderRadius: 0,\n                /**\n                 * In styled mode, this sets how many colors the class names\n                 * should rotate between. With ten colors, series (or points) are\n                 * given class names like `highcharts-color-0`, `highcharts-color-0`\n                 * [...] `highcharts-color-9`. The equivalent in non-styled mode\n                 * is to set colors using the [colors](#colors) setting.\n                 *\n                 * @since      5.0.0\n                 */\n                colorCount: 10,\n                /**\n                 * Alias of `type`.\n                 *\n                 * @sample {highcharts} highcharts/chart/defaultseriestype/\n                 *         Bar\n                 *\n                 * @deprecated\n                 *\n                 * @product highcharts\n                 */\n                defaultSeriesType: 'line',\n                /**\n                 * If true, the axes will scale to the remaining visible series once\n                 * one series is hidden. If false, hiding and showing a series will\n                 * not affect the axes or the other series. For stacks, once one series\n                 * within the stack is hidden, the rest of the stack will close in\n                 * around it even if the axis is not affected.\n                 *\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-false/\n                 *         False\n                 * @sample {highcharts} highcharts/chart/ignorehiddenseries-true-stacked/\n                 *         True with stack\n                 * @sample {highstock} stock/chart/ignorehiddenseries-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/ignorehiddenseries-false/\n                 *         False\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                ignoreHiddenSeries: true,\n                /**\n                 * Whether to invert the axes so that the x axis is vertical and y axis\n                 * is horizontal. When `true`, the x axis is [reversed](#xAxis.reversed)\n                 * by default.\n                 *\n                 * @productdesc {highcharts}\n                 * If a bar series is present in the chart, it will be inverted\n                 * automatically. Inverting the chart doesn't have an effect if there\n                 * are no cartesian series in the chart, or if the chart is\n                 * [polar](#chart.polar).\n                 *\n                 * @sample {highcharts} highcharts/chart/inverted/\n                 *         Inverted line\n                 * @sample {highstock} stock/navigator/inverted/\n                 *         Inverted stock chart\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @product   highcharts highstock gantt\n                 * @apioption chart.inverted\n                 */\n                /**\n                 * The distance between the outer edge of the chart and the content,\n                 * like title or legend, or axis title and labels if present. The\n                 * numbers in the array designate top, right, bottom and left\n                 * respectively. Use the options spacingTop, spacingRight, spacingBottom\n                 * and spacingLeft options for shorthand setting of one option.\n                 *\n                 * @type    {Array<number>}\n                 * @see     [chart.margin](#chart.margin)\n                 * @default [10, 10, 15, 10]\n                 * @since   3.0.6\n                 */\n                spacing: [10, 10, 15, 10],\n                /**\n                 * The button that appears after a selection zoom, allowing the user\n                 * to reset zoom.\n                 */\n                resetZoomButton: {\n                    /**\n                     * What frame the button placement should be related to. Can be\n                     * either `plotBox` or `spacingBox`.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-relativeto/\n                     *         Relative to the chart\n                     * @sample {highstock} highcharts/chart/resetzoombutton-relativeto/\n                     *         Relative to the chart\n                     *\n                     * @type       {Highcharts.ButtonRelativeToValue}\n                     * @default    plot\n                     * @since      2.2\n                     * @apioption  chart.resetZoomButton.relativeTo\n                     */\n                    /**\n                     * A collection of attributes for the button. The object takes SVG\n                     * attributes like `fill`, `stroke`, `stroke-width` or `r`, the\n                     * border radius. The theme also supports `style`, a collection of\n                     * CSS properties for the text. Equivalent attributes for the hover\n                     * state are given in `theme.states.hover`.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-theme/\n                     *         Theming the button\n                     * @sample {highstock} highcharts/chart/resetzoombutton-theme/\n                     *         Theming the button\n                     *\n                     * @type {Highcharts.SVGAttributes}\n                     * @since 2.2\n                     */\n                    theme: {\n                        /** @internal */\n                        zIndex: 6\n                    },\n                    /**\n                     * The position of the button.\n                     *\n                     * @sample {highcharts} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     * @sample {highstock} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     * @sample {highmaps} highcharts/chart/resetzoombutton-position/\n                     *         Above the plot area\n                     *\n                     * @type  {Highcharts.AlignObject}\n                     * @since 2.2\n                     */\n                    position: {\n                        /**\n                         * The horizontal alignment of the button.\n                         */\n                        align: 'right',\n                        /**\n                         * The horizontal offset of the button.\n                         */\n                        x: -10,\n                        /**\n                         * The vertical alignment of the button.\n                         *\n                         * @type       {Highcharts.VerticalAlignValue}\n                         * @default    top\n                         * @apioption  chart.resetZoomButton.position.verticalAlign\n                         */\n                        /**\n                         * The vertical offset of the button.\n                         */\n                        y: 10\n                    }\n                },\n                /**\n                 * The pixel width of the plot area border.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotborderwidth/\n                 *         1px border\n                 * @sample {highstock} stock/chart/plotborder/\n                 *         2px border\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption chart.plotBorderWidth\n                 */\n                /**\n                 * Whether to apply a drop shadow to the plot area. Requires that\n                 * plotBackgroundColor be set. The shadow can be an object configuration\n                 * containing `color`, `offsetX`, `offsetY`, `opacity` and `width`.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotshadow/\n                 *         Plot shadow\n                 * @sample {highstock} stock/chart/plotshadow/\n                 *         Plot shadow\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type      {boolean|Highcharts.CSSObject}\n                 * @default   false\n                 * @apioption chart.plotShadow\n                 */\n                /**\n                 * When true, cartesian charts like line, spline, area and column are\n                 * transformed into the polar coordinate system. This produces _polar\n                 * charts_, also known as _radar charts_.\n                 *\n                 * @sample {highcharts} highcharts/demo/polar/\n                 *         Polar chart\n                 * @sample {highcharts} highcharts/demo/polar-wind-rose/\n                 *         Wind rose, stacked polar column chart\n                 * @sample {highcharts} highcharts/demo/polar-spider/\n                 *         Spider web chart\n                 * @sample {highcharts} highcharts/parallel-coordinates/polar/\n                 *         Star plot, multivariate data in a polar chart\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.3.0\n                 * @product   highcharts\n                 * @requires  highcharts-more\n                 * @apioption chart.polar\n                 */\n                /**\n                 * Whether to reflow the chart to fit the width of the container div\n                 * on resizing the window.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/chart/reflow-false/\n                 *         False\n                 * @sample {highstock} stock/chart/reflow-true/\n                 *         True by default\n                 * @sample {highstock} stock/chart/reflow-false/\n                 *         False\n                 * @sample {highmaps} maps/chart/reflow-true/\n                 *         True by default\n                 * @sample {highmaps} maps/chart/reflow-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.1\n                 * @apioption chart.reflow\n                 */\n                /**\n                 * The HTML element where the chart will be rendered. If it is a string,\n                 * the element by that id is used. The HTML element can also be passed\n                 * by direct reference, or as the first argument of the chart\n                 * constructor, in which case the option is not needed.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         String\n                 * @sample {highcharts} highcharts/chart/renderto-object/\n                 *         Object reference\n                 * @sample {highcharts} highcharts/chart/renderto-jquery/\n                 *         Object reference through jQuery\n                 * @sample {highstock} stock/chart/renderto-string/\n                 *         String\n                 * @sample {highstock} stock/chart/renderto-object/\n                 *         Object reference\n                 * @sample {highstock} stock/chart/renderto-jquery/\n                 *         Object reference through jQuery\n                 *\n                 * @type      {string|Highcharts.HTMLDOMElement}\n                 * @apioption chart.renderTo\n                 */\n                /**\n                 * The background color of the marker square when selecting (zooming\n                 * in on) an area of the chart.\n                 *\n                 * @see In styled mode, the selection marker fill is set with the\n                 *      `.highcharts-selection-marker` class.\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @default   rgba(51,92,173,0.25)\n                 * @since     2.1.7\n                 * @apioption chart.selectionMarkerFill\n                 */\n                /**\n                 * Whether to apply a drop shadow to the outer chart area. Requires\n                 * that backgroundColor be set. The shadow can be an object\n                 * configuration containing `color`, `offsetX`, `offsetY`, `opacity` and\n                 * `width`.\n                 *\n                 * @sample {highcharts} highcharts/chart/shadow/\n                 *         Shadow\n                 * @sample {highstock} stock/chart/shadow/\n                 *         Shadow\n                 * @sample {highmaps} maps/chart/border/\n                 *         Chart border and shadow\n                 *\n                 * @type      {boolean|Highcharts.CSSObject}\n                 * @default   false\n                 * @apioption chart.shadow\n                 */\n                /**\n                 * Whether to show the axes initially. This only applies to empty charts\n                 * where series are added dynamically, as axes are automatically added\n                 * to cartesian series.\n                 *\n                 * @sample {highcharts} highcharts/chart/showaxes-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/chart/showaxes-true/\n                 *         True\n                 *\n                 * @type      {boolean}\n                 * @since     1.2.5\n                 * @product   highcharts gantt\n                 * @apioption chart.showAxes\n                 */\n                /**\n                 * The space between the bottom edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingbottom/\n                 *         Spacing bottom set to 100\n                 * @sample {highstock} stock/chart/spacingbottom/\n                 *         Spacing bottom set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   15\n                 * @since     2.1\n                 * @apioption chart.spacingBottom\n                 */\n                /**\n                 * The space between the left edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingleft/\n                 *         Spacing left set to 100\n                 * @sample {highstock} stock/chart/spacingleft/\n                 *         Spacing left set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingLeft\n                 */\n                /**\n                 * The space between the right edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingright-100/\n                 *         Spacing set to 100\n                 * @sample {highcharts} highcharts/chart/spacingright-legend/\n                 *         Legend in right position with default spacing\n                 * @sample {highstock} stock/chart/spacingright/\n                 *         Spacing set to 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingRight\n                 */\n                /**\n                 * The space between the top edge of the chart and the content (plot\n                 * area, axis title and labels, title, subtitle or legend in top\n                 * position).\n                 *\n                 * @sample {highcharts} highcharts/chart/spacingtop-100/\n                 *         A top spacing of 100\n                 * @sample {highcharts} highcharts/chart/spacingtop-10/\n                 *         Floating chart title makes the plot area align to the default\n                 *         spacingTop of 10.\n                 * @sample {highstock} stock/chart/spacingtop/\n                 *         A top spacing of 100\n                 * @sample {highmaps} maps/chart/spacing/\n                 *         Spacing 100 all around\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     2.1\n                 * @apioption chart.spacingTop\n                 */\n                /**\n                 * Additional CSS styles to apply inline to the container `div`. Note\n                 * that since the default font styles are applied in the renderer, it\n                 * is ignorant of the individual chart options and must be set globally.\n                 *\n                 * @see    In styled mode, general chart styles can be set with the\n                 *         `.highcharts-root` class.\n                 * @sample {highcharts} highcharts/chart/style-serif-font/\n                 *         Using a serif type font\n                 * @sample {highcharts} highcharts/css/em/\n                 *         Styled mode with relative font sizes\n                 * @sample {highstock} stock/chart/style/\n                 *         Using a serif type font\n                 * @sample {highmaps} maps/chart/style-serif-font/\n                 *         Using a serif type font\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"fontFamily\": \"\\\"Lucida Grande\\\", \\\"Lucida Sans Unicode\\\", Verdana, Arial, Helvetica, sans-serif\",\"fontSize\":\"12px\"}\n                 * @apioption chart.style\n                 */\n                /**\n                 * The default series type for the chart. Can be any of the chart types\n                 * listed under [plotOptions](#plotOptions) and [series](#series) or can\n                 * be a series provided by an additional module.\n                 *\n                 * In TypeScript this option has no effect in sense of typing and\n                 * instead the `type` option must always be set in the series.\n                 *\n                 * @sample {highcharts} highcharts/chart/type-bar/\n                 *         Bar\n                 * @sample {highstock} stock/chart/type/\n                 *         Areaspline\n                 * @sample {highmaps} maps/chart/type-mapline/\n                 *         Mapline\n                 *\n                 * @type       {string}\n                 * @default    {highcharts} line\n                 * @default    {highstock} line\n                 * @default    {highmaps} map\n                 * @since      2.1.0\n                 * @apioption  chart.type\n                 */\n                /**\n                 * Decides in what dimensions the user can zoom by dragging the mouse.\n                 * Can be one of `x`, `y` or `xy`.\n                 *\n                 * @see [panKey](#chart.panKey)\n                 *\n                 * @sample {highcharts} highcharts/chart/zoomtype-none/\n                 *         None by default\n                 * @sample {highcharts} highcharts/chart/zoomtype-x/\n                 *         X\n                 * @sample {highcharts} highcharts/chart/zoomtype-y/\n                 *         Y\n                 * @sample {highcharts} highcharts/chart/zoomtype-xy/\n                 *         Xy\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         None by default\n                 * @sample {highstock} stock/chart/zoomtype-x/\n                 *         X\n                 * @sample {highstock} stock/chart/zoomtype-y/\n                 *         Y\n                 * @sample {highstock} stock/chart/zoomtype-xy/\n                 *         Xy\n                 *\n                 * @type       {string}\n                 * @product    highcharts highstock gantt\n                 * @validvalue [\"x\", \"y\", \"xy\"]\n                 * @apioption  chart.zoomType\n                 */\n                /**\n                 * An explicit width for the chart. By default (when `null`) the width\n                 * is calculated from the offset width of the containing element.\n                 *\n                 * @sample {highcharts} highcharts/chart/width/\n                 *         800px wide\n                 * @sample {highstock} stock/chart/width/\n                 *         800px wide\n                 * @sample {highmaps} maps/chart/size/\n                 *         Chart with explicit size\n                 *\n                 * @type {null|number|string}\n                 */\n                width: null,\n                /**\n                 * An explicit height for the chart. If a _number_, the height is\n                 * given in pixels. If given a _percentage string_ (for example\n                 * `'56%'`), the height is given as the percentage of the actual chart\n                 * width. This allows for preserving the aspect ratio across responsive\n                 * sizes.\n                 *\n                 * By default (when `null`) the height is calculated from the offset\n                 * height of the containing element, or 400 pixels if the containing\n                 * element's height is 0.\n                 *\n                 * @sample {highcharts} highcharts/chart/height/\n                 *         500px height\n                 * @sample {highstock} stock/chart/height/\n                 *         300px height\n                 * @sample {highmaps} maps/chart/size/\n                 *         Chart with explicit size\n                 * @sample highcharts/chart/height-percent/\n                 *         Highcharts with percentage height\n                 *\n                 * @type {null|number|string}\n                 */\n                height: null,\n                /**\n                 * The color of the outer chart border.\n                 *\n                 * @see In styled mode, the stroke is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/bordercolor/\n                 *         Brown border\n                 * @sample {highstock} stock/chart/border/\n                 *         Brown border\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                borderColor: '#335cad',\n                /**\n                 * The pixel width of the outer chart border.\n                 *\n                 * @see In styled mode, the stroke is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/borderwidth/\n                 *         5px border\n                 * @sample {highstock} stock/chart/border/\n                 *         2px border\n                 * @sample {highmaps} maps/chart/border/\n                 *         Border options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption chart.borderWidth\n                 */\n                /**\n                 * The background color or gradient for the outer chart area.\n                 *\n                 * @see In styled mode, the background is set with the\n                 *      `.highcharts-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highcharts} highcharts/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highstock} stock/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highstock} stock/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highmaps} maps/chart/backgroundcolor-color/\n                 *         Color\n                 * @sample {highmaps} maps/chart/backgroundcolor-gradient/\n                 *         Gradient\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                backgroundColor: '#ffffff',\n                /**\n                 * The background color or gradient for the plot area.\n                 *\n                 * @see In styled mode, the plot background is set with the\n                 *      `.highcharts-plot-background` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highcharts} highcharts/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highstock} stock/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highstock} stock/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-color/\n                 *         Color\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Gradient\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption chart.plotBackgroundColor\n                 */\n                /**\n                 * The URL for an image to use as the plot background. To set an image\n                 * as the background for the entire chart, set a CSS background image\n                 * to the container element. Note that for the image to be applied to\n                 * exported charts, its URL needs to be accessible by the export server.\n                 *\n                 * @see In styled mode, a plot background image can be set with the\n                 *      `.highcharts-plot-background` class and a [custom pattern](\n                 *      https://www.highcharts.com/docs/chart-design-and-style/\n                 *      gradients-shadows-and-patterns).\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbackgroundimage/\n                 *         Skies\n                 * @sample {highstock} stock/chart/plotbackgroundimage/\n                 *         Skies\n                 *\n                 * @type      {string}\n                 * @apioption chart.plotBackgroundImage\n                 */\n                /**\n                 * The color of the inner chart or plot area border.\n                 *\n                 * @see In styled mode, a plot border stroke can be set with the\n                 *      `.highcharts-plot-border` class.\n                 *\n                 * @sample {highcharts} highcharts/chart/plotbordercolor/\n                 *         Blue border\n                 * @sample {highstock} stock/chart/plotborder/\n                 *         Blue border\n                 * @sample {highmaps} maps/chart/plotborder/\n                 *         Plot border options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                plotBorderColor: '#cccccc'\n            },\n            /**\n             * The chart's main title.\n             *\n             * @sample {highmaps} maps/title/title/\n             *         Title options demonstrated\n             */\n            title: {\n                /**\n                 * When the title is floating, the plot area will not move to make space\n                 * for it.\n                 *\n                 * @sample {highcharts} highcharts/chart/zoomtype-none/\n                 *         False by default\n                 * @sample {highcharts} highcharts/title/floating/\n                 *         True - title on top of the plot area\n                 * @sample {highstock} stock/chart/title-floating/\n                 *         True - title on top of the plot area\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption title.floating\n                 */\n                /**\n                 * CSS styles for the title. Use this for font styling, but use `align`,\n                 * `x` and `y` for text alignment.\n                 *\n                 * In styled mode, the title style is given in the `.highcharts-title`\n                 * class.\n                 *\n                 * @sample {highcharts} highcharts/title/style/\n                 *         Custom color and weight\n                 * @sample {highstock} stock/chart/title-style/\n                 *         Custom color and weight\n                 * @sample highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {highcharts|highmaps} { \"color\": \"#333333\", \"fontSize\": \"18px\" }\n                 * @default   {highstock} { \"color\": \"#333333\", \"fontSize\": \"16px\" }\n                 * @apioption title.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption title.useHTML\n                 */\n                /**\n                 * The vertical alignment of the title. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When a value is given, the title behaves\n                 * as if [floating](#title.floating) were `true`.\n                 *\n                 * @sample {highcharts} highcharts/title/verticalalign/\n                 *         Chart title in bottom right corner\n                 * @sample {highstock} stock/chart/title-verticalalign/\n                 *         Chart title in bottom right corner\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1\n                 * @apioption title.verticalAlign\n                 */\n                /**\n                 * The x position of the title relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/title/align/\n                 *         Aligned to the plot area (x = 70px = margin left - spacing\n                 *         left)\n                 * @sample {highstock} stock/chart/title-align/\n                 *         Aligned to the plot area (x = 50px = margin left - spacing\n                 *         left)\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption title.x\n                 */\n                /**\n                 * The y position of the title relative to the alignment within\n                 * [chart.spacingTop](#chart.spacingTop) and [chart.spacingBottom](\n                 * #chart.spacingBottom). By default it depends on the font size.\n                 *\n                 * @sample {highcharts} highcharts/title/y/\n                 *         Title inside the plot area\n                 * @sample {highstock} stock/chart/title-verticalalign/\n                 *         Chart title in bottom right corner\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption title.y\n                 */\n                /**\n                 * The title of the chart. To disable the title, set the `text` to\n                 * `undefined`.\n                 *\n                 * @sample {highcharts} highcharts/title/text/\n                 *         Custom title\n                 * @sample {highstock} stock/chart/title-text/\n                 *         Custom title\n                 *\n                 * @default {highcharts|highmaps} Chart title\n                 * @default {highstock} undefined\n                 */\n                text: 'Chart title',\n                /**\n                 * The horizontal alignment of the title. Can be one of \"left\", \"center\"\n                 * and \"right\".\n                 *\n                 * @sample {highcharts} highcharts/title/align/\n                 *         Aligned to the plot area (x = 70px = margin left - spacing\n                 *         left)\n                 * @sample {highstock} stock/chart/title-align/\n                 *         Aligned to the plot area (x = 50px = margin left - spacing\n                 *         left)\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * The margin between the title and the plot area, or if a subtitle\n                 * is present, the margin between the subtitle and the plot area.\n                 *\n                 * @sample {highcharts} highcharts/title/margin-50/\n                 *         A chart title margin of 50\n                 * @sample {highcharts} highcharts/title/margin-subtitle/\n                 *         The same margin applied with a subtitle\n                 * @sample {highstock} stock/chart/title-margin/\n                 *         A chart title margin of 50\n                 *\n                 * @since 2.1\n                 */\n                margin: 15,\n                /**\n                 * Adjustment made to the title width, normally to reserve space for\n                 * the exporting burger menu.\n                 *\n                 * @sample highcharts/title/widthadjust/\n                 *         Wider menu, greater padding\n                 *\n                 * @since 4.2.5\n                 */\n                widthAdjust: -44\n            },\n            /**\n             * The chart's subtitle. This can be used both to display a subtitle below\n             * the main title, and to display random text anywhere in the chart. The\n             * subtitle can be updated after chart initialization through the\n             * `Chart.setTitle` method.\n             *\n             * @sample {highmaps} maps/title/subtitle/\n             *         Subtitle options demonstrated\n             */\n            subtitle: {\n                /**\n                 * When the subtitle is floating, the plot area will not move to make\n                 * space for it.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/floating/\n                 *         Floating title and subtitle\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote floating at bottom right of plot area\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption subtitle.floating\n                 */\n                /**\n                 * CSS styles for the title.\n                 *\n                 * In styled mode, the subtitle style is given in the\n                 * `.highcharts-subtitle` class.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/style/\n                 *         Custom color and weight\n                 * @sample {highcharts} highcharts/css/titles/\n                 *         Styled mode\n                 * @sample {highstock} stock/chart/subtitle-style\n                 *         Custom color and weight\n                 * @sample {highstock} highcharts/css/titles/\n                 *         Styled mode\n                 * @sample {highmaps} highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"#666666\"}\n                 * @apioption subtitle.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption subtitle.useHTML\n                 */\n                /**\n                 * The vertical alignment of the title. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When middle, the subtitle behaves as\n                 * floating.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/verticalalign/\n                 *         Footnote at the bottom right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1\n                 * @apioption subtitle.verticalAlign\n                 */\n                /**\n                 * The x position of the subtitle relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/align/\n                 *         Footnote at right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption subtitle.x\n                 */\n                /**\n                 * The y position of the subtitle relative to the alignment within\n                 * `chart.spacingTop` and `chart.spacingBottom`. By default the subtitle\n                 * is laid out below the title unless the title is floating.\n                 *\n                 * @sample {highcharts} highcharts/subtitle/verticalalign/\n                 *         Footnote at the bottom right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at the bottom right of plot area\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption subtitle.y\n                 */\n                /**\n                 * The subtitle of the chart.\n                 *\n                 * @sample {highcharts|highstock} highcharts/subtitle/text/\n                 *         Custom subtitle\n                 * @sample {highcharts|highstock} highcharts/subtitle/text-formatted/\n                 *         Formatted and linked text.\n                 */\n                text: '',\n                /**\n                 * The horizontal alignment of the subtitle. Can be one of \"left\",\n                 *  \"center\" and \"right\".\n                 *\n                 * @sample {highcharts} highcharts/subtitle/align/\n                 *         Footnote at right of plot area\n                 * @sample {highstock} stock/chart/subtitle-footnote\n                 *         Footnote at bottom right of plot area\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * Adjustment made to the subtitle width, normally to reserve space\n                 * for the exporting burger menu.\n                 *\n                 * @see [title.widthAdjust](#title.widthAdjust)\n                 *\n                 * @sample highcharts/title/widthadjust/\n                 *         Wider menu, greater padding\n                 *\n                 * @since 4.2.5\n                 */\n                widthAdjust: -44\n            },\n            /**\n             * The chart's caption, which will render below the chart and will be part\n             * of exported charts. The caption can be updated after chart initialization\n             * through the `Chart.update` or `Chart.caption.update` methods.\n             *\n             * @sample highcharts/caption/text/\n             *         A chart with a caption\n             * @since  7.2.0\n             */\n            caption: {\n                /**\n                 * When the caption is floating, the plot area will not move to make\n                 * space for it.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption caption.floating\n                 */\n                /**\n                 * The margin between the caption and the plot area.\n                 */\n                margin: 15,\n                /**\n                 * CSS styles for the caption.\n                 *\n                 * In styled mode, the caption style is given in the\n                 * `.highcharts-caption` class.\n                 *\n                 * @sample {highcharts} highcharts/css/titles/\n                 *         Styled mode\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"#666666\"}\n                 * @apioption caption.style\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the text.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption caption.useHTML\n                 */\n                /**\n                 * The x position of the caption relative to the alignment within\n                 * `chart.spacingLeft` and `chart.spacingRight`.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption caption.x\n                 */\n                /**\n                 * The y position of the caption relative to the alignment within\n                 * `chart.spacingTop` and `chart.spacingBottom`.\n                 *\n                 * @type      {number}\n                 * @apioption caption.y\n                 */\n                /**\n                 * The caption text of the chart.\n                 *\n                 * @sample {highcharts} highcharts/caption/text/\n                 *         Custom caption\n                 */\n                text: '',\n                /**\n                 * The horizontal alignment of the caption. Can be one of \"left\",\n                 *  \"center\" and \"right\".\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 */\n                align: 'left',\n                /**\n                 * The vertical alignment of the caption. Can be one of `\"top\"`,\n                 * `\"middle\"` and `\"bottom\"`. When middle, the caption behaves as\n                 * floating.\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 */\n                verticalAlign: 'bottom'\n            },\n            /**\n             * The plotOptions is a wrapper object for config objects for each series\n             * type. The config objects for each series can also be overridden for\n             * each series item as given in the series array.\n             *\n             * Configuration options for the series are given in three levels. Options\n             * for all series in a chart are given in the [plotOptions.series](\n             * #plotOptions.series) object. Then options for all series of a specific\n             * type are given in the plotOptions of that type, for example\n             * `plotOptions.line`. Next, options for one single series are given in\n             * [the series array](#series).\n             */\n            plotOptions: {},\n            /**\n             * HTML labels that can be positioned anywhere in the chart area.\n             *\n             * This option is deprecated since v7.1.2. Instead, use\n             * [annotations](#annotations) that support labels.\n             *\n             * @deprecated\n             * @product   highcharts highstock\n             */\n            labels: {\n                /**\n                 * An HTML label that can be positioned anywhere in the chart area.\n                 *\n                 * @deprecated\n                 * @type      {Array<*>}\n                 * @apioption labels.items\n                 */\n                /**\n                 * Inner HTML or text for the label.\n                 *\n                 * @deprecated\n                 * @type      {string}\n                 * @apioption labels.items.html\n                 */\n                /**\n                 * CSS styles for each label. To position the label, use left and top\n                 * like this:\n                 * ```js\n                 * style: {\n                 *     left: '100px',\n                 *     top: '100px'\n                 * }\n                 * ```\n                 *\n                 * @deprecated\n                 * @type      {Highcharts.CSSObject}\n                 * @apioption labels.items.style\n                 */\n                /**\n                 * Shared CSS styles for all labels.\n                 *\n                 * @deprecated\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#333333\", \"position\": \"absolute\"}\n                 */\n                style: {\n                    /**\n                     * @ignore-option\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore-option\n                     */\n                    color: '#333333'\n                }\n            },\n            /**\n             * The legend is a box containing a symbol and name for each series\n             * item or point item in the chart. Each series (or points in case\n             * of pie charts) is represented by a symbol and its name in the legend.\n             *\n             * It is possible to override the symbol creator function and create\n             * [custom legend symbols](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/studies/legend-custom-symbol/).\n             *\n             * @productdesc {highmaps}\n             * A Highmaps legend by default contains one legend item per series, but if\n             * a `colorAxis` is defined, the axis will be displayed in the legend.\n             * Either as a gradient, or as multiple legend items for `dataClasses`.\n             */\n            legend: {\n                /**\n                 * The background color of the legend.\n                 *\n                 * @see In styled mode, the legend background fill can be applied with\n                 *      the `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/backgroundcolor/\n                 *         Yellowish background\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption legend.backgroundColor\n                 */\n                /**\n                 * The width of the drawn border around the legend.\n                 *\n                 * @see In styled mode, the legend border stroke width can be applied\n                 *      with the `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/borderwidth/\n                 *         2px border width\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption legend.borderWidth\n                 */\n                /**\n                 * Enable or disable the legend. There is also a series-specific option,\n                 * [showInLegend](#plotOptions.series.showInLegend), that can hide the\n                 * series from the legend. In some series types this is `false` by\n                 * default, so it must set to `true` in order to show the legend for the\n                 * series.\n                 *\n                 * @sample {highcharts} highcharts/legend/enabled-false/ Legend disabled\n                 * @sample {highstock} stock/legend/align/ Various legend options\n                 * @sample {highmaps} maps/legend/enabled-false/ Legend disabled\n                 *\n                 * @default {highstock} false\n                 * @default {highmaps} true\n                 * @default {gantt} false\n                 */\n                enabled: true,\n                /**\n                 * The horizontal alignment of the legend box within the chart area.\n                 * Valid values are `left`, `center` and `right`.\n                 *\n                 * In the case that the legend is aligned in a corner position, the\n                 * `layout` option will determine whether to place it above/below\n                 * or on the side of the plot area.\n                 *\n                 * @sample {highcharts} highcharts/legend/align/\n                 *         Legend at the right of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'center',\n                /**\n                 * If the [layout](legend.layout) is `horizontal` and the legend items\n                 * span over two lines or more, whether to align the items into vertical\n                 * columns. Setting this to `false` makes room for more items, but will\n                 * look more messy.\n                 *\n                 * @since 6.1.0\n                 */\n                alignColumns: true,\n                /**\n                 * When the legend is floating, the plot area ignores it and is allowed\n                 * to be placed below it.\n                 *\n                 * @sample {highcharts} highcharts/legend/floating-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/legend/floating-true/\n                 *         True\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Floating legend\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @apioption legend.floating\n                 */\n                /**\n                 * The layout of the legend items. Can be one of `horizontal` or\n                 * `vertical` or `proximate`. When `proximate`, the legend items will be\n                 * placed as close as possible to the graphs they're representing,\n                 * except in inverted charts or when the legend position doesn't allow\n                 * it.\n                 *\n                 * @sample {highcharts} highcharts/legend/layout-horizontal/\n                 *         Horizontal by default\n                 * @sample {highcharts} highcharts/legend/layout-vertical/\n                 *         Vertical\n                 * @sample highcharts/legend/layout-proximate\n                 *         Labels proximate to the data\n                 * @sample {highstock} stock/legend/layout-horizontal/\n                 *         Horizontal by default\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Vertical with data classes\n                 * @sample {highmaps} maps/legend/layout-vertical/\n                 *         Vertical with color axis gradient\n                 *\n                 * @validvalue [\"horizontal\", \"vertical\", \"proximate\"]\n                 */\n                layout: 'horizontal',\n                /**\n                 * In a legend with horizontal layout, the itemDistance defines the\n                 * pixel distance between each item.\n                 *\n                 * @sample {highcharts} highcharts/legend/layout-horizontal/\n                 *         50px item distance\n                 * @sample {highstock} highcharts/legend/layout-horizontal/\n                 *         50px item distance\n                 *\n                 * @type      {number}\n                 * @default   {highcharts} 20\n                 * @default   {highstock} 20\n                 * @default   {highmaps} 8\n                 * @since     3.0.3\n                 * @apioption legend.itemDistance\n                 */\n                /**\n                 * The pixel bottom margin for each legend item.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.0\n                 * @apioption legend.itemMarginBottom\n                 */\n                /**\n                 * The pixel top margin for each legend item.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.0\n                 * @apioption legend.itemMarginTop\n                 */\n                /**\n                 * The width for each legend item. By default the items are laid out\n                 * successively. In a [horizontal layout](legend.layout), if the items\n                 * are laid out across two rows or more, they will be vertically aligned\n                 * depending on the [legend.alignColumns](legend.alignColumns) option.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemwidth-default/\n                 *         Undefined by default\n                 * @sample {highcharts} highcharts/legend/itemwidth-80/\n                 *         80 for aligned legend items\n                 *\n                 * @type      {number}\n                 * @since     2.0\n                 * @apioption legend.itemWidth\n                 */\n                /**\n                 * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                 * for each legend label. Available variables relates to properties on\n                 * the series, or the point in case of pies.\n                 *\n                 * @type      {string}\n                 * @default   {name}\n                 * @since     1.3\n                 * @apioption legend.labelFormat\n                 */\n                /* eslint-disable valid-jsdoc */\n                /**\n                 * Callback function to format each of the series' labels. The `this`\n                 * keyword refers to the series object, or the point object in case of\n                 * pie charts. By default the series or point name is printed.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps the context can also be a data class in case of a\n                 * `colorAxis`.\n                 *\n                 * @sample {highcharts} highcharts/legend/labelformatter/\n                 *         Add text\n                 * @sample {highmaps} maps/legend/labelformatter/\n                 *         Data classes with label formatter\n                 *\n                 * @type {Highcharts.FormatterCallbackFunction<Point|Series>}\n                 */\n                labelFormatter: function () {\n                    /** eslint-enable valid-jsdoc */\n                    return this.name;\n                },\n                /**\n                 * Line height for the legend items. Deprecated as of 2.1\\. Instead,\n                 * the line height for each item can be set using\n                 * `itemStyle.lineHeight`, and the padding between items using\n                 * `itemMarginTop` and `itemMarginBottom`.\n                 *\n                 * @sample {highcharts} highcharts/legend/lineheight/\n                 *         Setting padding\n                 *\n                 * @deprecated\n                 *\n                 * @type      {number}\n                 * @default   16\n                 * @since     2.0\n                 * @product   highcharts gantt\n                 * @apioption legend.lineHeight\n                 */\n                /**\n                 * If the plot area sized is calculated automatically and the legend is\n                 * not floating, the legend margin is the space between the legend and\n                 * the axis labels or plot area.\n                 *\n                 * @sample {highcharts} highcharts/legend/margin-default/\n                 *         12 pixels by default\n                 * @sample {highcharts} highcharts/legend/margin-30/\n                 *         30 pixels\n                 *\n                 * @type      {number}\n                 * @default   12\n                 * @since     2.1\n                 * @apioption legend.margin\n                 */\n                /**\n                 * Maximum pixel height for the legend. When the maximum height is\n                 * extended, navigation will show.\n                 *\n                 * @type      {number}\n                 * @since     2.3.0\n                 * @apioption legend.maxHeight\n                 */\n                /**\n                 * The color of the drawn border around the legend.\n                 *\n                 * @see In styled mode, the legend border stroke can be applied with the\n                 *      `.highcharts-legend-box` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/bordercolor/\n                 *         Brown border\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                borderColor: '#999999',\n                /**\n                 * The border corner radius of the legend.\n                 *\n                 * @sample {highcharts} highcharts/legend/borderradius-default/\n                 *         Square by default\n                 * @sample {highcharts} highcharts/legend/borderradius-round/\n                 *         5px rounded\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 */\n                borderRadius: 0,\n                /**\n                 * Options for the paging or navigation appearing when the legend is\n                 * overflown. Navigation works well on screen, but not in static\n                 * exported images. One way of working around that is to\n                 * [increase the chart height in\n                 * export](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/legend/navigation-enabled-false/).\n                 */\n                navigation: {\n                    /**\n                     * How to animate the pages when navigating up or down. A value of\n                     * `true` applies the default navigation given in the\n                     * `chart.animation` option. Additional options can be given as an\n                     * object containing values for easing and duration.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {boolean|Highcharts.AnimationOptionsObject}\n                     * @default   true\n                     * @since     2.2.4\n                     * @apioption legend.navigation.animation\n                     */\n                    /**\n                     * The pixel size of the up and down arrows in the legend paging\n                     * navigation.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {number}\n                     * @default   12\n                     * @since     2.2.4\n                     * @apioption legend.navigation.arrowSize\n                     */\n                    /**\n                     * Whether to enable the legend navigation. In most cases, disabling\n                     * the navigation results in an unwanted overflow.\n                     *\n                     * See also the [adapt chart to legend](\n                     * https://www.highcharts.com/products/plugin-registry/single/8/Adapt-Chart-To-Legend)\n                     * plugin for a solution to extend the chart height to make room for\n                     * the legend, optionally in exported charts only.\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     4.2.4\n                     * @apioption legend.navigation.enabled\n                     */\n                    /**\n                     * Text styles for the legend page navigation.\n                     *\n                     * @see In styled mode, the navigation items are styled with the\n                     *      `.highcharts-legend-navigation` class.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type      {Highcharts.CSSObject}\n                     * @since     2.2.4\n                     * @apioption legend.navigation.style\n                     */\n                    /**\n                     * The color for the active up or down arrow in the legend page\n                     * navigation.\n                     *\n                     * @see In styled mode, the active arrow be styled with the\n                     *      `.highcharts-legend-nav-active` class.\n                     *\n                     * @sample  {highcharts} highcharts/legend/navigation/\n                     *          Legend page navigation demonstrated\n                     * @sample  {highstock} highcharts/legend/navigation/\n                     *          Legend page navigation demonstrated\n                     *\n                     * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @since 2.2.4\n                     */\n                    activeColor: '#003399',\n                    /**\n                     * The color of the inactive up or down arrow in the legend page\n                     * navigation. .\n                     *\n                     * @see In styled mode, the inactive arrow be styled with the\n                     *      `.highcharts-legend-nav-inactive` class.\n                     *\n                     * @sample {highcharts} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     * @sample {highstock} highcharts/legend/navigation/\n                     *         Legend page navigation demonstrated\n                     *\n                     * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @since 2.2.4\n                     */\n                    inactiveColor: '#cccccc'\n                },\n                /**\n                 * The inner padding of the legend box.\n                 *\n                 * @sample {highcharts|highstock} highcharts/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 *\n                 * @type      {number}\n                 * @default   8\n                 * @since     2.2.0\n                 * @apioption legend.padding\n                 */\n                /**\n                 * Whether to reverse the order of the legend items compared to the\n                 * order of the series or points as defined in the configuration object.\n                 *\n                 * @see [yAxis.reversedStacks](#yAxis.reversedStacks),\n                 *      [series.legendIndex](#series.legendIndex)\n                 *\n                 * @sample {highcharts} highcharts/legend/reversed/\n                 *         Stacked bar with reversed legend\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     1.2.5\n                 * @apioption legend.reversed\n                 */\n                /**\n                 * Whether to show the symbol on the right side of the text rather than\n                 * the left side. This is common in Arabic and Hebraic.\n                 *\n                 * @sample {highcharts} highcharts/legend/rtl/\n                 *         Symbol to the right\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.2\n                 * @apioption legend.rtl\n                 */\n                /**\n                 * CSS styles for the legend area. In the 1.x versions the position\n                 * of the legend area was determined by CSS. In 2.x, the position is\n                 * determined by properties like `align`, `verticalAlign`, `x` and `y`,\n                 * but the styles are still parsed for backwards compatibility.\n                 *\n                 * @deprecated\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @product   highcharts highstock\n                 * @apioption legend.style\n                 */\n                /**\n                 * CSS styles for each legend item. Only a subset of CSS is supported,\n                 * notably those options related to text. The default `textOverflow`\n                 * property makes long texts truncate. Set it to `undefined` to wrap\n                 * text instead. A `width` property can be added to control the text\n                 * width.\n                 *\n                 * @see In styled mode, the legend items can be styled with the\n                 *      `.highcharts-legend-item` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemstyle/\n                 *         Bold black text\n                 * @sample {highmaps} maps/legend/itemstyle/\n                 *         Item text styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#333333\", \"cursor\": \"pointer\", \"fontSize\": \"12px\", \"fontWeight\": \"bold\", \"textOverflow\": \"ellipsis\"}\n                 */\n                itemStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#333333',\n                    /**\n                     * @ignore\n                     */\n                    cursor: 'pointer',\n                    /**\n                     * @ignore\n                     */\n                    fontSize: '12px',\n                    /**\n                     * @ignore\n                     */\n                    fontWeight: 'bold',\n                    /**\n                     * @ignore\n                     */\n                    textOverflow: 'ellipsis'\n                },\n                /**\n                 * CSS styles for each legend item in hover mode. Only a subset of\n                 * CSS is supported, notably those options related to text. Properties\n                 * are inherited from `style` unless overridden here.\n                 *\n                 * @see In styled mode, the hovered legend items can be styled with\n                 *      the `.highcharts-legend-item:hover` pesudo-class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemhoverstyle/\n                 *         Red on hover\n                 * @sample {highmaps} maps/legend/itemstyle/\n                 *         Item text styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#000000\"}\n                 */\n                itemHoverStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#000000'\n                },\n                /**\n                 * CSS styles for each legend item when the corresponding series or\n                 * point is hidden. Only a subset of CSS is supported, notably those\n                 * options related to text. Properties are inherited from `style`\n                 * unless overridden here.\n                 *\n                 * @see In styled mode, the hidden legend items can be styled with\n                 *      the `.highcharts-legend-item-hidden` class.\n                 *\n                 * @sample {highcharts} highcharts/legend/itemhiddenstyle/\n                 *         Darker gray color\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"color\": \"#cccccc\"}\n                 */\n                itemHiddenStyle: {\n                    /**\n                     * @ignore\n                     */\n                    color: '#cccccc'\n                },\n                /**\n                 * Whether to apply a drop shadow to the legend. A `backgroundColor`\n                 * also needs to be applied for this to take effect. The shadow can be\n                 * an object configuration containing `color`, `offsetX`, `offsetY`,\n                 * `opacity` and `width`.\n                 *\n                 * @sample {highcharts} highcharts/legend/shadow/\n                 *         White background and drop shadow\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/border-background/\n                 *         Border and background options\n                 *\n                 * @type {boolean|Highcharts.CSSObject}\n                 */\n                shadow: false,\n                /**\n                 * Default styling for the checkbox next to a legend item when\n                 * `showCheckbox` is true.\n                 *\n                 * @type {Highcharts.CSSObject}\n                 * @default {\"width\": \"13px\", \"height\": \"13px\", \"position\":\"absolute\"}\n                 */\n                itemCheckboxStyle: {\n                    /**\n                     * @ignore\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore\n                     */\n                    width: '13px',\n                    /**\n                     * @ignore\n                     */\n                    height: '13px'\n                },\n                // itemWidth: undefined,\n                /**\n                 * When this is true, the legend symbol width will be the same as\n                 * the symbol height, which in turn defaults to the font size of the\n                 * legend items.\n                 *\n                 * @since 5.0.0\n                 */\n                squareSymbol: true,\n                /**\n                 * The pixel height of the symbol for series types that use a rectangle\n                 * in the legend. Defaults to the font size of legend items.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, when the symbol is the gradient of a vertical color\n                 * axis, the height defaults to 200.\n                 *\n                 * @sample {highmaps} maps/legend/layout-vertical-sized/\n                 *         Sized vertical gradient\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         No distance between data classes\n                 *\n                 * @type      {number}\n                 * @since     3.0.8\n                 * @apioption legend.symbolHeight\n                 */\n                /**\n                 * The border radius of the symbol for series types that use a rectangle\n                 * in the legend. Defaults to half the `symbolHeight`.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 * @sample {highstock} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 * @sample {highmaps} highcharts/legend/symbolradius/\n                 *         Round symbols\n                 *\n                 * @type      {number}\n                 * @since     3.0.8\n                 * @apioption legend.symbolRadius\n                 */\n                /**\n                 * The pixel width of the legend item symbol. When the `squareSymbol`\n                 * option is set, this defaults to the `symbolHeight`, otherwise 16.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, when the symbol is the gradient of a horizontal color\n                 * axis, the width defaults to 200.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolwidth/\n                 *         Greater symbol width and padding\n                 * @sample {highmaps} maps/legend/padding-itemmargin/\n                 *         Padding and item margins demonstrated\n                 * @sample {highmaps} maps/legend/layout-vertical-sized/\n                 *         Sized vertical gradient\n                 *\n                 * @type      {number}\n                 * @apioption legend.symbolWidth\n                 */\n                /**\n                 * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the legend item texts.\n                 *\n                 * Prior to 4.1.7, when using HTML, [legend.navigation](\n                 * #legend.navigation) was disabled.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption legend.useHTML\n                 */\n                /**\n                 * The width of the legend box. If a number is set, it translates to\n                 * pixels. Since v7.0.2 it allows setting a percent string of the full\n                 * chart width, for example `40%`.\n                 *\n                 * Defaults to the full chart width from legends below or above the\n                 * chart, half the chart width for legends to the left and right.\n                 *\n                 * @sample {highcharts} highcharts/legend/width/\n                 *         Aligned to the plot area\n                 * @sample {highcharts} highcharts/legend/width-percent/\n                 *         A percent of the chart width\n                 *\n                 * @type      {number|string}\n                 * @since     2.0\n                 * @apioption legend.width\n                 */\n                /**\n                 * The pixel padding between the legend item symbol and the legend\n                 * item text.\n                 *\n                 * @sample {highcharts} highcharts/legend/symbolpadding/\n                 *         Greater symbol width and padding\n                 */\n                symbolPadding: 5,\n                /**\n                 * The vertical alignment of the legend box. Can be one of `top`,\n                 * `middle` or `bottom`. Vertical position can be further determined\n                 * by the `y` option.\n                 *\n                 * In the case that the legend is aligned in a corner position, the\n                 * `layout` option will determine whether to place it above/below\n                 * or on the side of the plot area.\n                 *\n                 * When the [layout](#legend.layout) option is `proximate`, the\n                 * `verticalAlign` option doesn't apply.\n                 *\n                 * @sample {highcharts} highcharts/legend/verticalalign/\n                 *         Legend 100px from the top of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @type  {Highcharts.VerticalAlignValue}\n                 * @since 2.0\n                 */\n                verticalAlign: 'bottom',\n                // width: undefined,\n                /**\n                 * The x offset of the legend relative to its horizontal alignment\n                 * `align` within chart.spacingLeft and chart.spacingRight. Negative\n                 * x moves it to the left, positive x moves it to the right.\n                 *\n                 * @sample {highcharts} highcharts/legend/width/\n                 *         Aligned to the plot area\n                 *\n                 * @since 2.0\n                 */\n                x: 0,\n                /**\n                 * The vertical offset of the legend relative to it's vertical alignment\n                 * `verticalAlign` within chart.spacingTop and chart.spacingBottom.\n                 *  Negative y moves it up, positive y moves it down.\n                 *\n                 * @sample {highcharts} highcharts/legend/verticalalign/\n                 *         Legend 100px from the top of the chart\n                 * @sample {highstock} stock/legend/align/\n                 *         Various legend options\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend alignment\n                 *\n                 * @since 2.0\n                 */\n                y: 0,\n                /**\n                 * A title to be added on top of the legend.\n                 *\n                 * @sample {highcharts} highcharts/legend/title/\n                 *         Legend title\n                 * @sample {highmaps} maps/legend/alignment/\n                 *         Legend with title\n                 *\n                 * @since 3.0\n                 */\n                title: {\n                    /**\n                     * A text or HTML string for the title.\n                     *\n                     * @type      {string}\n                     * @since     3.0\n                     * @apioption legend.title.text\n                     */\n                    /**\n                     * Generic CSS styles for the legend title.\n                     *\n                     * @see In styled mode, the legend title is styled with the\n                     *      `.highcharts-legend-title` class.\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     * @default {\"fontWeight\": \"bold\"}\n                     * @since   3.0\n                     */\n                    style: {\n                        /**\n                         * @ignore\n                         */\n                        fontWeight: 'bold'\n                    }\n                }\n            },\n            /**\n             * The loading options control the appearance of the loading screen\n             * that covers the plot area on chart operations. This screen only\n             * appears after an explicit call to `chart.showLoading()`. It is a\n             * utility for developers to communicate to the end user that something\n             * is going on, for example while retrieving new data via an XHR connection.\n             * The \"Loading...\" text itself is not part of this configuration\n             * object, but part of the `lang` object.\n             */\n            loading: {\n                /**\n                 * The duration in milliseconds of the fade out effect.\n                 *\n                 * @sample highcharts/loading/hideduration/\n                 *         Fade in and out over a second\n                 *\n                 * @type      {number}\n                 * @default   100\n                 * @since     1.2.0\n                 * @apioption loading.hideDuration\n                 */\n                /**\n                 * The duration in milliseconds of the fade in effect.\n                 *\n                 * @sample highcharts/loading/hideduration/\n                 *         Fade in and out over a second\n                 *\n                 * @type      {number}\n                 * @default   100\n                 * @since     1.2.0\n                 * @apioption loading.showDuration\n                 */\n                /**\n                 * CSS styles for the loading label `span`.\n                 *\n                 * @see In styled mode, the loading label is styled with the\n                 *      `.highcharts-loading-inner` class.\n                 *\n                 * @sample {highcharts|highmaps} highcharts/loading/labelstyle/\n                 *         Vertically centered\n                 * @sample {highstock} stock/loading/general/\n                 *         Label styles\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"fontWeight\": \"bold\", \"position\": \"relative\", \"top\": \"45%\"}\n                 * @since   1.2.0\n                 */\n                labelStyle: {\n                    /**\n                     * @ignore\n                     */\n                    fontWeight: 'bold',\n                    /**\n                     * @ignore\n                     */\n                    position: 'relative',\n                    /**\n                     * @ignore\n                     */\n                    top: '45%'\n                },\n                /**\n                 * CSS styles for the loading screen that covers the plot area.\n                 *\n                 * In styled mode, the loading label is styled with the\n                 * `.highcharts-loading` class.\n                 *\n                 * @sample  {highcharts|highmaps} highcharts/loading/style/\n                 *          Gray plot area, white text\n                 * @sample  {highstock} stock/loading/general/\n                 *          Gray plot area, white text\n                 *\n                 * @type    {Highcharts.CSSObject}\n                 * @default {\"position\": \"absolute\", \"backgroundColor\": \"#ffffff\", \"opacity\": 0.5, \"textAlign\": \"center\"}\n                 * @since   1.2.0\n                 */\n                style: {\n                    /**\n                     * @ignore\n                     */\n                    position: 'absolute',\n                    /**\n                     * @ignore\n                     */\n                    backgroundColor: '#ffffff',\n                    /**\n                     * @ignore\n                     */\n                    opacity: 0.5,\n                    /**\n                     * @ignore\n                     */\n                    textAlign: 'center'\n                }\n            },\n            /**\n             * Options for the tooltip that appears when the user hovers over a\n             * series or point.\n             *\n             * @declare Highcharts.TooltipOptions\n             */\n            tooltip: {\n                /**\n                 * The color of the tooltip border. When `undefined`, the border takes\n                 * the color of the corresponding series or point.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         Follow series by default\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-black/\n                 *         Black border\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Styled tooltip\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption tooltip.borderColor\n                 */\n                /**\n                 * A CSS class name to apply to the tooltip's container div,\n                 * allowing unique CSS styling for each chart.\n                 *\n                 * @type      {string}\n                 * @apioption tooltip.className\n                 */\n                /**\n                 * Since 4.1, the crosshair definitions are moved to the Axis object\n                 * in order for a better separation from the tooltip. See\n                 * [xAxis.crosshair](#xAxis.crosshair).\n                 *\n                 * @sample {highcharts} highcharts/tooltip/crosshairs-x/\n                 *         Enable a crosshair for the x value\n                 *\n                 * @deprecated\n                 *\n                 * @type      {*}\n                 * @default   true\n                 * @apioption tooltip.crosshairs\n                 */\n                /**\n                 * Distance from point to tooltip in pixels.\n                 *\n                 * @type      {number}\n                 * @default   16\n                 * @apioption tooltip.distance\n                 */\n                /**\n                 * Whether the tooltip should follow the mouse as it moves across\n                 * columns, pie slices and other point types with an extent.\n                 * By default it behaves this way for pie, polygon, map, sankey\n                 * and wordcloud series by override in the `plotOptions`\n                 * for those series types.\n                 *\n                 * For touch moves to behave the same way, [followTouchMove](\n                 * #tooltip.followTouchMove) must be `true` also.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} false\n                 * @default   {highmaps} true\n                 * @since     3.0\n                 * @apioption tooltip.followPointer\n                 */\n                /**\n                 * Whether the tooltip should update as the finger moves on a touch\n                 * device. If this is `true` and [chart.panning](#chart.panning) is\n                 * set,`followTouchMove` will take over one-finger touches, so the user\n                 * needs to use two fingers for zooming and panning.\n                 *\n                 * Note the difference to [followPointer](#tooltip.followPointer) that\n                 * only defines the _position_ of the tooltip. If `followPointer` is\n                 * false in for example a column series, the tooltip will show above or\n                 * below the column, but as `followTouchMove` is true, the tooltip will\n                 * jump from column to column as the user swipes across the plot area.\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} true\n                 * @default   {highstock} true\n                 * @default   {highmaps} false\n                 * @since     3.0.1\n                 * @apioption tooltip.followTouchMove\n                 */\n                /**\n                 * Callback function to format the text of the tooltip from scratch. In\n                 * case of single or [shared](#tooltip.shared) tooltips, a string should\n                 * be returned. In case of [split](#tooltip.split) tooltips, it should\n                 * return an array where the first item is the header, and subsequent\n                 * items are mapped to the points. Return `false` to disable tooltip for\n                 * a specific point on series.\n                 *\n                 * A subset of HTML is supported. Unless `useHTML` is true, the HTML of\n                 * the tooltip is parsed and converted to SVG, therefore this isn't a\n                 * complete HTML renderer. The following HTML tags are supported: `b`,\n                 * `br`, `em`, `i`, `span`, `strong`. Spans can be styled with a `style`\n                 * attribute, but only text-related CSS, that is shared with SVG, is\n                 * handled.\n                 *\n                 * The available data in the formatter differ a bit depending on whether\n                 * the tooltip is shared or split, or belongs to a single point. In a\n                 * shared/split tooltip, all properties except `x`, which is common for\n                 * all points, are kept in an array, `this.points`.\n                 *\n                 * Available data are:\n                 *\n                 * - **this.percentage (not shared) /**\n                 *   **this.points[i].percentage (shared)**:\n                 *   Stacked series and pies only. The point's percentage of the total.\n                 *\n                 * - **this.point (not shared) / this.points[i].point (shared)**:\n                 *   The point object. The point name, if defined, is available through\n                 *   `this.point.name`.\n                 *\n                 * - **this.points**:\n                 *   In a shared tooltip, this is an array containing all other\n                 *   properties for each point.\n                 *\n                 * - **this.series (not shared) / this.points[i].series (shared)**:\n                 *   The series object. The series name is available through\n                 *   `this.series.name`.\n                 *\n                 * - **this.total (not shared) / this.points[i].total (shared)**:\n                 *   Stacked series only. The total value at this point's x value.\n                 *\n                 * - **this.x**:\n                 *   The x value. This property is the same regardless of the tooltip\n                 *   being shared or not.\n                 *\n                 * - **this.y (not shared) / this.points[i].y (shared)**:\n                 *   The y value.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/formatter-simple/\n                 *         Simple string formatting\n                 * @sample {highcharts} highcharts/tooltip/formatter-shared/\n                 *         Formatting with shared tooltip\n                 * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n                 *         Formatting with split tooltip\n                 * @sample highcharts/tooltip/formatter-conditional-default/\n                 *         Extending default formatter\n                 * @sample {highstock} stock/tooltip/formatter/\n                 *         Formatting with shared tooltip\n                 * @sample {highmaps} maps/tooltip/formatter/\n                 *         String formatting\n                 *\n                 * @type      {Highcharts.TooltipFormatterCallbackFunction}\n                 * @apioption tooltip.formatter\n                 */\n                /**\n                 * Callback function to format the text of the tooltip for\n                 * visible null points.\n                 * Works analogously to [formatter](#tooltip.formatter).\n                 *\n                 * @sample highcharts/plotoptions/series-nullformat\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {Highcharts.TooltipFormatterCallbackFunction}\n                 * @apioption tooltip.nullFormatter\n                 */\n                /**\n                 * The number of milliseconds to wait until the tooltip is hidden when\n                 * mouse out from a point or chart.\n                 *\n                 * @type      {number}\n                 * @default   500\n                 * @since     3.0\n                 * @apioption tooltip.hideDelay\n                 */\n                /**\n                 * Whether to allow the tooltip to render outside the chart's SVG\n                 * element box. By default (`false`), the tooltip is rendered within the\n                 * chart's SVG element, which results in the tooltip being aligned\n                 * inside the chart area. For small charts, this may result in clipping\n                 * or overlapping. When `true`, a separate SVG element is created and\n                 * overlaid on the page, allowing the tooltip to be aligned inside the\n                 * page itself.\n                 *\n                 * Defaults to `true` if `chart.scrollablePlotArea` is activated,\n                 * otherwise `false`.\n                 *\n                 * @sample highcharts/tooltip/outside\n                 *         Small charts with tooltips outside\n                 *\n                 * @type      {boolean|undefined}\n                 * @default   undefined\n                 * @since     6.1.1\n                 * @apioption tooltip.outside\n                 */\n                /**\n                 * A callback function for formatting the HTML output for a single point\n                 * in the tooltip. Like the `pointFormat` string, but with more\n                 * flexibility.\n                 *\n                 * @type      {Highcharts.FormatterCallbackFunction<Highcharts.Point>}\n                 * @since     4.1.0\n                 * @context   Highcharts.Point\n                 * @apioption tooltip.pointFormatter\n                 */\n                /**\n                 * A callback function to place the tooltip in a default position. The\n                 * callback receives three parameters: `labelWidth`, `labelHeight` and\n                 * `point`, where point contains values for `plotX` and `plotY` telling\n                 * where the reference point is in the plot area. Add `chart.plotLeft`\n                 * and `chart.plotTop` to get the full coordinates.\n                 *\n                 * Since v7, when [tooltip.split](#tooltip.split) option is enabled,\n                 * positioner is called for each of the boxes separately, including\n                 * xAxis header. xAxis header is not a point, instead `point` argument\n                 * contains info:\n                 * `{ plotX: Number, plotY: Number, isHeader: Boolean }`\n                 *\n                 *\n                 * The return should be an object containing x and y values, for example\n                 * `{ x: 100, y: 100 }`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/positioner/\n                 *         A fixed tooltip position\n                 * @sample {highstock} stock/tooltip/positioner/\n                 *         A fixed tooltip position on top of the chart\n                 * @sample {highmaps} maps/tooltip/positioner/\n                 *         A fixed tooltip position\n                 * @sample {highstock} stock/tooltip/split-positioner/\n                 *         Split tooltip with fixed positions\n                 * @sample {highstock} stock/tooltip/positioner-scrollable-plotarea/\n                 *         Scrollable plot area combined with tooltip positioner\n                 *\n                 * @type      {Highcharts.TooltipPositionerCallbackFunction}\n                 * @since     2.2.4\n                 * @apioption tooltip.positioner\n                 */\n                /**\n                 * The name of a symbol to use for the border around the tooltip. Can\n                 * be one of: `\"callout\"`, `\"circle\"`, or `\"square\"`. When\n                 * [tooltip.split](#tooltip.split)\n                 * option is enabled, shape is applied to all boxes except header, which\n                 * is controlled by\n                 * [tooltip.headerShape](#tooltip.headerShape).\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n                 * [series.marker.symbol](plotOptions.line.marker.symbol).\n                 *\n                 * @type      {Highcharts.TooltipShapeValue}\n                 * @default   callout\n                 * @since     4.0\n                 * @apioption tooltip.shape\n                 */\n                /**\n                 * The name of a symbol to use for the border around the tooltip\n                 * header. Applies only when [tooltip.split](#tooltip.split) is\n                 * enabled.\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols` the same way as for\n                 * [series.marker.symbol](plotOptions.line.marker.symbol).\n                 *\n                 * @see [tooltip.shape](#tooltip.shape)\n                 *\n                 * @sample {highstock} stock/tooltip/split-positioner/\n                 *         Different shapes for header and split boxes\n                 *\n                 * @type       {Highcharts.TooltipShapeValue}\n                 * @default    callout\n                 * @validvalue [\"callout\", \"square\"]\n                 * @since      7.0\n                 * @apioption  tooltip.headerShape\n                 */\n                /**\n                 * When the tooltip is shared, the entire plot area will capture mouse\n                 * movement or touch events. Tooltip texts for series types with ordered\n                 * data (not pie, scatter, flags etc) will be shown in a single bubble.\n                 * This is recommended for single series charts and for tablet/mobile\n                 * optimized charts.\n                 *\n                 * See also [tooltip.split](#tooltip.split), that is better suited for\n                 * charts with many series, especially line-type series. The\n                 * `tooltip.split` option takes precedence over `tooltip.shared`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/shared-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/tooltip/shared-true/\n                 *         True\n                 * @sample {highcharts} highcharts/tooltip/shared-x-crosshair/\n                 *         True with x axis crosshair\n                 * @sample {highcharts} highcharts/tooltip/shared-true-mixed-types/\n                 *         True with mixed series types\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @product   highcharts highstock\n                 * @apioption tooltip.shared\n                 */\n                /**\n                 * Split the tooltip into one label per series, with the header close\n                 * to the axis. This is recommended over [shared](#tooltip.shared)\n                 * tooltips for charts with multiple line series, generally making them\n                 * easier to read. This option takes precedence over `tooltip.shared`.\n                 *\n                 * @productdesc {highstock} In Highstock, tooltips are split by default\n                 * since v6.0.0. Stock charts typically contain multi-dimension points\n                 * and multiple panes, making split tooltips the preferred layout over\n                 * the previous `shared` tooltip.\n                 *\n                 * @sample highcharts/tooltip/split/\n                 *         Split tooltip\n                 * @sample {highcharts|highstock} highcharts/tooltip/formatter-split/\n                 *         Split tooltip and custom formatter callback\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} true\n                 * @since     5.0.0\n                 * @product   highcharts highstock\n                 * @apioption tooltip.split\n                 */\n                /**\n                 * Prevents the tooltip from switching or closing, when touched or\n                 * pointed.\n                 *\n                 * @sample highcharts/tooltip/stickoncontact/\n                 *         Tooltip sticks on pointer contact\n                 *\n                 * @type      {boolean}\n                 * @since     8.0.1\n                 * @apioption tooltip.stickOnContact\n                 */\n                /**\n                 * Use HTML to render the contents of the tooltip instead of SVG. Using\n                 * HTML allows advanced formatting like tables and images in the\n                 * tooltip. It is also recommended for rtl languages as it works around\n                 * rtl bugs in early Firefox.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/footerformat/\n                 *         A table for value alignment\n                 * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/\n                 *         Full HTML tooltip\n                 * @sample {highmaps} maps/tooltip/usehtml/\n                 *         Pure HTML tooltip\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.2\n                 * @apioption tooltip.useHTML\n                 */\n                /**\n                 * How many decimals to show in each series' y value. This is\n                 * overridable in each series' tooltip options object. The default is to\n                 * preserve all decimals.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {number}\n                 * @since     2.2\n                 * @apioption tooltip.valueDecimals\n                 */\n                /**\n                 * A string to prepend to each series' y value. Overridable in each\n                 * series' tooltip options object.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {string}\n                 * @since     2.2\n                 * @apioption tooltip.valuePrefix\n                 */\n                /**\n                 * A string to append to each series' y value. Overridable in each\n                 * series' tooltip options object.\n                 *\n                 * @sample {highcharts|highstock} highcharts/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 * @sample {highmaps} maps/tooltip/valuedecimals/\n                 *         Set decimals, prefix and suffix for the value\n                 *\n                 * @type      {string}\n                 * @since     2.2\n                 * @apioption tooltip.valueSuffix\n                 */\n                /**\n                 * The format for the date in the tooltip header if the X axis is a\n                 * datetime axis. The default is a best guess based on the smallest\n                 * distance between points in the chart.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/xdateformat/\n                 *         A different format\n                 *\n                 * @type      {string}\n                 * @product   highcharts highstock gantt\n                 * @apioption tooltip.xDateFormat\n                 */\n                /**\n                 * How many decimals to show for the `point.change` value when the\n                 * `series.compare` option is set. This is overridable in each series'\n                 * tooltip options object. The default is to preserve all decimals.\n                 *\n                 * @type      {number}\n                 * @since     1.0.1\n                 * @product   highstock\n                 * @apioption tooltip.changeDecimals\n                 */\n                /**\n                 * Enable or disable the tooltip.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/enabled/\n                 *         Disabled\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Disable tooltip and show values on chart instead\n                 */\n                enabled: true,\n                /**\n                 * Enable or disable animation of the tooltip.\n                 *\n                 * @type       {boolean}\n                 * @default    true\n                 * @since      2.3.0\n                 */\n                animation: svg,\n                /**\n                 * The radius of the rounded border corners.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         5px by default\n                 * @sample {highcharts} highcharts/tooltip/borderradius-0/\n                 *         Square borders\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 */\n                borderRadius: 3,\n                /**\n                 * For series on a datetime axes, the date format in the tooltip's\n                 * header will by default be guessed based on the closest data points.\n                 * This member gives the default string representations used for\n                 * each unit. For an overview of the replacement codes, see\n                 * [dateFormat](/class-reference/Highcharts#dateFormat).\n                 *\n                 * @see [xAxis.dateTimeLabelFormats](#xAxis.dateTimeLabelFormats)\n                 *\n                 * @type    {Highcharts.Dictionary<string>}\n                 * @product highcharts highstock gantt\n                 */\n                dateTimeLabelFormats: {\n                    /** @internal */\n                    millisecond: '%A, %b %e, %H:%M:%S.%L',\n                    /** @internal */\n                    second: '%A, %b %e, %H:%M:%S',\n                    /** @internal */\n                    minute: '%A, %b %e, %H:%M',\n                    /** @internal */\n                    hour: '%A, %b %e, %H:%M',\n                    /** @internal */\n                    day: '%A, %b %e, %Y',\n                    /** @internal */\n                    week: 'Week from %A, %b %e, %Y',\n                    /** @internal */\n                    month: '%B %Y',\n                    /** @internal */\n                    year: '%Y'\n                },\n                /**\n                 * A string to append to the tooltip format.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/footerformat/\n                 *         A table for value alignment\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @since 2.2\n                 */\n                footerFormat: '',\n                /**\n                 * Padding inside the tooltip, in pixels.\n                 *\n                 * @since      5.0.0\n                 */\n                padding: 8,\n                /**\n                 * Proximity snap for graphs or single points. It defaults to 10 for\n                 * mouse-powered devices and 25 for touch devices.\n                 *\n                 * Note that in most cases the whole plot area captures the mouse\n                 * movement, and in these cases `tooltip.snap` doesn't make sense. This\n                 * applies when [stickyTracking](#plotOptions.series.stickyTracking)\n                 * is `true` (default) and when the tooltip is [shared](#tooltip.shared)\n                 * or [split](#tooltip.split).\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         10 px by default\n                 * @sample {highcharts} highcharts/tooltip/snap-50/\n                 *         50 px on graph\n                 *\n                 * @type    {number}\n                 * @default 10/25\n                 * @since   1.2.0\n                 * @product highcharts highstock\n                 */\n                snap: isTouchDevice ? 25 : 10,\n                /**\n                 * The HTML of the tooltip header line. Variables are enclosed by\n                 * curly brackets. Available variables are `point.key`, `series.name`,\n                 * `series.color` and other members from the `point` and `series`\n                 * objects. The `point.key` variable contains the category name, x\n                 * value or datetime string depending on the type of axis. For datetime\n                 * axes, the `point.key` date format can be set using\n                 * `tooltip.xDateFormat`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/footerformat/\n                 *         An HTML table in the tooltip\n                 * @sample {highstock} highcharts/tooltip/footerformat/\n                 *         An HTML table in the tooltip\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @type       {string}\n                 * @apioption  tooltip.headerFormat\n                 */\n                headerFormat: '<span style=\"font-size: 10px\">{point.key}</span><br/>',\n                /**\n                 * The HTML of the null point's line in the tooltip. Works analogously\n                 * to [pointFormat](#tooltip.pointFormat).\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-nullformat\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {string}\n                 * @apioption tooltip.nullFormat\n                 */\n                /**\n                 * The HTML of the point's line in the tooltip. Variables are enclosed\n                 * by curly brackets. Available variables are point.x, point.y, series.\n                 * name and series.color and other properties on the same form.\n                 * Furthermore, `point.y` can be extended by the `tooltip.valuePrefix`\n                 * and `tooltip.valueSuffix` variables. This can also be overridden for\n                 * each series, which makes it a good hook for displaying units.\n                 *\n                 * In styled mode, the dot is colored by a class name rather\n                 * than the point color.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/pointformat/\n                 *         A different point format with value suffix\n                 * @sample {highmaps} maps/tooltip/format/\n                 *         Format demo\n                 *\n                 * @type       {string}\n                 * @since      2.2\n                 * @apioption  tooltip.pointFormat\n                 */\n                pointFormat: '<span style=\"color:{point.color}\">\\u25CF</span> {series.name}: <b>{point.y}</b><br/>',\n                /**\n                 * The background color or gradient for the tooltip.\n                 *\n                 * In styled mode, the stroke width is set in the\n                 * `.highcharts-tooltip-box` class.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/backgroundcolor-solid/\n                 *         Yellowish background\n                 * @sample {highcharts} highcharts/tooltip/backgroundcolor-gradient/\n                 *         Gradient\n                 * @sample {highcharts} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Custom tooltip\n                 * @sample {highstock} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 * @sample {highmaps} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                backgroundColor: color('#f7f7f7')\n                    .setOpacity(0.85).get(),\n                /**\n                 * The pixel width of the tooltip border.\n                 *\n                 * In styled mode, the stroke width is set in the\n                 * `.highcharts-tooltip-box` class.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         2px by default\n                 * @sample {highcharts} highcharts/tooltip/borderwidth/\n                 *         No border (shadow only)\n                 * @sample {highcharts} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highstock} stock/tooltip/general/\n                 *         Custom tooltip\n                 * @sample {highstock} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 * @sample {highmaps} maps/tooltip/background-border/\n                 *         Background and border demo\n                 * @sample {highmaps} highcharts/css/tooltip-border-background/\n                 *         Tooltip in styled mode\n                 */\n                borderWidth: 1,\n                /**\n                 * Whether to apply a drop shadow to the tooltip.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/bordercolor-default/\n                 *         True by default\n                 * @sample {highcharts} highcharts/tooltip/shadow/\n                 *         False\n                 * @sample {highmaps} maps/tooltip/positioner/\n                 *         Fixed tooltip position, border and shadow disabled\n                 *\n                 * @type {boolean|Highcharts.ShadowOptionsObject}\n                 */\n                shadow: true,\n                /**\n                 * CSS styles for the tooltip. The tooltip can also be styled through\n                 * the CSS class `.highcharts-tooltip`.\n                 *\n                 * Note that the default `pointerEvents` style makes the tooltip ignore\n                 * mouse events, so in order to use clickable tooltips, this value must\n                 * be set to `auto`.\n                 *\n                 * @sample {highcharts} highcharts/tooltip/style/\n                 *         Greater padding, bold text\n                 *\n                 * @type {Highcharts.CSSObject}\n                 */\n                style: {\n                    /** @internal */\n                    color: '#333333',\n                    /** @internal */\n                    cursor: 'default',\n                    /** @internal */\n                    fontSize: '12px',\n                    /** @internal */\n                    whiteSpace: 'nowrap'\n                }\n            },\n            /**\n             * Highchart by default puts a credits label in the lower right corner\n             * of the chart. This can be changed using these options.\n             */\n            credits: {\n                /**\n                 * Credits for map source to be concatenated with conventional credit\n                 * text. By default this is a format string that collects copyright\n                 * information from the map if available.\n                 *\n                 * @see [mapTextFull](#credits.mapTextFull)\n                 * @see [text](#credits.text)\n                 *\n                 * @type      {string}\n                 * @default   \\u00a9 <a href=\"{geojson.copyrightUrl}\">{geojson.copyrightShort}</a>\n                 * @since     4.2.2\n                 * @product   highmaps\n                 * @apioption credits.mapText\n                 */\n                /**\n                 * Detailed credits for map source to be displayed on hover of credits\n                 * text. By default this is a format string that collects copyright\n                 * information from the map if available.\n                 *\n                 * @see [mapText](#credits.mapText)\n                 * @see [text](#credits.text)\n                 *\n                 * @type      {string}\n                 * @default   {geojson.copyright}\n                 * @since     4.2.2\n                 * @product   highmaps\n                 * @apioption credits.mapTextFull\n                 */\n                /**\n                 * Whether to show the credits text.\n                 *\n                 * @sample {highcharts} highcharts/credits/enabled-false/\n                 *         Credits disabled\n                 * @sample {highstock} stock/credits/enabled/\n                 *         Credits disabled\n                 * @sample {highmaps} maps/credits/enabled-false/\n                 *         Credits disabled\n                 */\n                enabled: true,\n                /**\n                 * The URL for the credits label.\n                 *\n                 * @sample {highcharts} highcharts/credits/href/\n                 *         Custom URL and text\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Custom URL and text\n                 */\n                href: 'https://www.highcharts.com?credits',\n                /**\n                 * Position configuration for the credits label.\n                 *\n                 * @sample {highcharts} highcharts/credits/position-left/\n                 *         Left aligned\n                 * @sample {highcharts} highcharts/credits/position-left/\n                 *         Left aligned\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Left aligned\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Left aligned\n                 *\n                 * @type    {Highcharts.AlignObject}\n                 * @since   2.1\n                 */\n                position: {\n                    /** @internal */\n                    align: 'right',\n                    /** @internal */\n                    x: -10,\n                    /** @internal */\n                    verticalAlign: 'bottom',\n                    /** @internal */\n                    y: -5\n                },\n                /**\n                 * CSS styles for the credits label.\n                 *\n                 * @see In styled mode, credits styles can be set with the\n                 *      `.highcharts-credits` class.\n                 *\n                 * @type {Highcharts.CSSObject}\n                 */\n                style: {\n                    /** @internal */\n                    cursor: 'pointer',\n                    /** @internal */\n                    color: '#999999',\n                    /** @internal */\n                    fontSize: '9px'\n                },\n                /**\n                 * The text for the credits label.\n                 *\n                 * @productdesc {highmaps}\n                 * If a map is loaded as GeoJSON, the text defaults to\n                 * `Highcharts @ {map-credits}`. Otherwise, it defaults to\n                 * `Highcharts.com`.\n                 *\n                 * @sample {highcharts} highcharts/credits/href/\n                 *         Custom URL and text\n                 * @sample {highmaps} maps/credits/customized/\n                 *         Custom URL and text\n                 */\n                text: 'Highcharts.com'\n            }\n        };\n        /* eslint-disable spaced-comment */\n\n        '';\n        /**\n         * Global `Time` object with default options. Since v6.0.5, time settings can be\n         * applied individually for each chart. If no individual settings apply, this\n         * `Time` object is shared by all instances.\n         *\n         * @name Highcharts.time\n         * @type {Highcharts.Time}\n         */\n        H.time = new Time(merge(H.defaultOptions.global, H.defaultOptions.time));\n        /**\n         * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n         * human readable date string. The format is a subset of the formats for PHP's\n         * [strftime](https://www.php.net/manual/en/function.strftime.php) function.\n         * Additional formats can be given in the {@link Highcharts.dateFormats} hook.\n         *\n         * Since v6.0.5, all internal dates are formatted through the\n         * {@link Highcharts.Chart#time} instance to respect chart-level time settings.\n         * The `Highcharts.dateFormat` function only reflects global time settings set\n         * with `setOptions`.\n         *\n         * Supported format keys:\n         * - `%a`: Short weekday, like 'Mon'\n         * - `%A`: Long weekday, like 'Monday'\n         * - `%d`: Two digit day of the month, 01 to 31\n         * - `%e`: Day of the month, 1 through 31\n         * - `%w`: Day of the week, 0 through 6\n         * - `%b`: Short month, like 'Jan'\n         * - `%B`: Long month, like 'January'\n         * - `%m`: Two digit month number, 01 through 12\n         * - `%y`: Two digits year, like 09 for 2009\n         * - `%Y`: Four digits year, like 2009\n         * - `%H`: Two digits hours in 24h format, 00 through 23\n         * - `%k`: Hours in 24h format, 0 through 23\n         * - `%I`: Two digits hours in 12h format, 00 through 11\n         * - `%l`: Hours in 12h format, 1 through 12\n         * - `%M`: Two digits minutes, 00 through 59\n         * - `%p`: Upper case AM or PM\n         * - `%P`: Lower case AM or PM\n         * - `%S`: Two digits seconds, 00 through 59\n         * - `%L`: Milliseconds (naming from Ruby)\n         *\n         * @function Highcharts.dateFormat\n         *\n         * @param {string} format\n         *        The desired format where various time representations are prefixed\n         *        with `%`.\n         *\n         * @param {number} timestamp\n         *        The JavaScript timestamp.\n         *\n         * @param {boolean} [capitalize=false]\n         *        Upper case first letter in the return.\n         *\n         * @return {string}\n         *         The formatted date.\n         */\n        H.dateFormat = function (format, timestamp, capitalize) {\n            return H.time.dateFormat(format, timestamp, capitalize);\n        };\n        var optionsModule = {\n                dateFormat: H.dateFormat,\n                defaultOptions: H.defaultOptions,\n                time: H.time\n            };\n\n        return optionsModule;\n    });\n    _registerModule(_modules, 'parts/Axis.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Tick.js'], _modules['parts/Utilities.js'], _modules['parts/Options.js']], function (Color, H, Tick, U, O) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            getMagnitude = U.getMagnitude,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            normalizeTickInterval = U.normalizeTickInterval,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            removeEvent = U.removeEvent,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout;\n        /**\n         * Options for the path on the Axis to be calculated.\n         * @interface Highcharts.AxisPlotLinePathOptionsObject\n         */ /**\n        * Axis value.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#value\n        * @type {number|undefined}\n        */ /**\n        * Line width used for calculation crisp line coordinates. Defaults to 1.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#lineWidth\n        * @type {number|undefined}\n        */ /**\n        * If `false`, the function will return null when it falls outside the axis\n        * bounds. If `true`, the function will return a path aligned to the plot area\n        * sides if it falls outside. If `pass`, it will return a path outside.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#force\n        * @type {string|boolean|undefined}\n        */ /**\n        * Used in Highstock. When `true`, plot paths (crosshair, plotLines, gridLines)\n        * will be rendered on all axes when defined on the first axis.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#acrossPanes\n        * @type {boolean|undefined}\n        */ /**\n        * Use old coordinates (for resizing and rescaling).\n        * If not set, defaults to `false`.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#old\n        * @type {boolean|undefined}\n        */ /**\n        * If given, return the plot line path of a pixel position on the axis.\n        * @name Highcharts.AxisPlotLinePathOptionsObject#translatedValue\n        * @type {number|undefined}\n        */ /**\n        * Used in Polar axes. Reverse the positions for concatenation of polygonal\n        * plot bands\n        * @name Highcharts.AxisPlotLinePathOptionsObject#reverse\n        * @type {boolean|undefined}\n        */\n        /**\n         * Options for crosshairs on axes.\n         *\n         * @product highstock\n         *\n         * @typedef {Highcharts.XAxisCrosshairOptions|Highcharts.YAxisCrosshairOptions} Highcharts.AxisCrosshairOptions\n         */\n        /**\n         * @typedef {\"navigator\"|\"pan\"|\"rangeSelectorButton\"|\"rangeSelectorInput\"|\"scrollbar\"|\"traverseUpButton\"|\"zoom\"} Highcharts.AxisExtremesTriggerValue\n         */\n        /**\n         * @callback Highcharts.AxisEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         */\n        /**\n         * @callback Highcharts.AxisLabelsFormatterCallbackFunction\n         *\n         * @param {Highcharts.AxisLabelsFormatterContextObject<number>} this\n         *\n         * @param {Highcharts.AxisLabelsFormatterContextObject<string>} that\n         *\n         * @return {string}\n         */\n        /**\n         * @interface Highcharts.AxisLabelsFormatterContextObject<T>\n         */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#chart\n        * @type {Highcharts.Chart}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#isFirst\n        * @type {boolean}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#isLast\n        * @type {boolean}\n        */ /**\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#pos\n        * @type {number}\n        */ /**\n        * This can be either a numeric value or a category string.\n        * @name Highcharts.AxisLabelsFormatterContextObject<T>#value\n        * @type {T}\n        */\n        /**\n         * Options for axes.\n         *\n         * @typedef {Highcharts.XAxisOptions|Highcharts.YAxisOptions|Highcharts.ZAxisOptions} Highcharts.AxisOptions\n         */\n        /**\n         * @callback Highcharts.AxisPointBreakEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @param {Highcharts.AxisPointBreakEventObject} evt\n         */\n        /**\n         * @interface Highcharts.AxisPointBreakEventObject\n         */ /**\n        * @name Highcharts.AxisPointBreakEventObject#brk\n        * @type {Highcharts.Dictionary<number>}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#target\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * @name Highcharts.AxisPointBreakEventObject#type\n        * @type {\"pointBreak\"|\"pointInBreak\"}\n        */\n        /**\n         * @callback Highcharts.AxisSetExtremesEventCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @param {Highcharts.AxisSetExtremesEventObject} evt\n         */\n        /**\n         * @interface Highcharts.AxisSetExtremesEventObject\n         * @extends Highcharts.ExtremesObject\n         */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#target\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#trigger\n        * @type {Highcharts.AxisExtremesTriggerValue|string}\n        */ /**\n        * @name Highcharts.AxisSetExtremesEventObject#type\n        * @type {\"setExtremes\"}\n        */\n        /**\n         * @callback Highcharts.AxisTickPositionerCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *\n         * @return {Highcharts.AxisTickPositionsArray}\n         */\n        /**\n         * @interface Highcharts.AxisTickPositionsArray\n         * @augments Array<number>\n         */\n        /**\n         * @typedef {\"high\"|\"low\"|\"middle\"} Highcharts.AxisTitleAlignValue\n         */\n        /**\n         * @typedef {Highcharts.XAxisTitleOptions|Highcharts.YAxisTitleOptions|Highcharts.ZAxisTitleOptions} Highcharts.AxisTitleOptions\n         */\n        /**\n         * @typedef {\"linear\"|\"logarithmic\"|\"datetime\"|\"category\"|\"treegrid\"} Highcharts.AxisTypeValue\n         */\n        /**\n         * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n         * function.\n         *\n         * @interface Highcharts.ExtremesObject\n         */ /**\n        * The maximum value of the axis' associated series.\n        * @name Highcharts.ExtremesObject#dataMax\n        * @type {number}\n        */ /**\n        * The minimum value of the axis' associated series.\n        * @name Highcharts.ExtremesObject#dataMin\n        * @type {number}\n        */ /**\n        * The maximum axis value, either automatic or set manually. If the `max` option\n        * is not set, `maxPadding` is 0 and `endOnTick` is false, this value will be\n        * the same as `dataMax`.\n        * @name Highcharts.ExtremesObject#max\n        * @type {number}\n        */ /**\n        * The minimum axis value, either automatic or set manually. If the `min` option\n        * is not set, `minPadding` is 0 and `startOnTick` is false, this value will be\n        * the same as `dataMin`.\n        * @name Highcharts.ExtremesObject#min\n        * @type {number}\n        */ /**\n        * The user defined maximum, either from the `max` option or from a zoom or\n        * `setExtremes` action.\n        * @name Highcharts.ExtremesObject#userMax\n        * @type {number}\n        */ /**\n        * The user defined minimum, either from the `min` option or from a zoom or\n        * `setExtremes` action.\n        * @name Highcharts.ExtremesObject#userMin\n        * @type {number}\n        */\n        /**\n         * Formatter function for the text of a crosshair label.\n         *\n         * @callback Highcharts.XAxisCrosshairLabelFormatterCallbackFunction\n         *\n         * @param {Highcharts.Axis} this\n         *        Axis context\n         *\n         * @param {number} value\n         *        Y value of the data point\n         *\n         * @return {string}\n         */\n        var defaultOptions = O.defaultOptions;\n        var deg2rad = H.deg2rad;\n        /**\n         * Create a new axis object. Called internally when instanciating a new chart or\n         * adding axes by {@link Highcharts.Chart#addAxis}.\n         *\n         * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n         * series cartesian chart, there is one X axis and one Y axis.\n         *\n         * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n         * an array of Axis objects. If there is only one axis, it can be referenced\n         * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n         * pattern goes for Y axes.\n         *\n         * If you need to get the axes from a series object, use the `series.xAxis` and\n         * `series.yAxis` properties. These are not arrays, as one series can only be\n         * associated to one X and one Y axis.\n         *\n         * A third way to reference the axis programmatically is by `id`. Add an `id` in\n         * the axis configuration options, and get the axis by\n         * {@link Highcharts.Chart#get}.\n         *\n         * Configuration options for the axes are given in options.xAxis and\n         * options.yAxis.\n         *\n         * @class\n         * @name Highcharts.Axis\n         *\n         * @param {Highcharts.Chart} chart\n         * The Chart instance to apply the axis on.\n         *\n         * @param {Highcharts.AxisOptions} userOptions\n         * Axis options.\n         */\n        var Axis = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Axis(chart, userOptions) {\n                    this.alternateBands = void 0;\n                this.bottom = void 0;\n                this.categories = void 0;\n                this.chart = void 0;\n                this.closestPointRange = void 0;\n                this.coll = void 0;\n                this.hasNames = void 0;\n                this.hasVisibleSeries = void 0;\n                this.height = void 0;\n                this.isLinked = void 0;\n                this.labelEdge = void 0; // @todo\n                this.labelFormatter = void 0;\n                this.left = void 0;\n                this.len = void 0;\n                this.max = void 0;\n                this.maxLabelLength = void 0;\n                this.min = void 0;\n                this.minorTickInterval = void 0;\n                this.minorTicks = void 0;\n                this.minPixelPadding = void 0;\n                this.names = void 0;\n                this.offset = void 0;\n                this.oldMax = void 0;\n                this.oldMin = void 0;\n                this.options = void 0;\n                this.overlap = void 0;\n                this.paddedTicks = void 0;\n                this.plotLinesAndBands = void 0;\n                this.plotLinesAndBandsGroups = void 0;\n                this.pointRange = void 0;\n                this.pointRangePadding = void 0;\n                this.pos = void 0;\n                this.positiveValuesOnly = void 0;\n                this.right = void 0;\n                this.series = void 0;\n                this.side = void 0;\n                this.tickAmount = void 0;\n                this.tickInterval = void 0;\n                this.tickmarkOffset = void 0;\n                this.tickPositions = void 0;\n                this.tickRotCorr = void 0;\n                this.ticks = void 0;\n                this.top = void 0;\n                this.transA = void 0;\n                this.transB = void 0;\n                this.translationSlope = void 0;\n                this.userOptions = void 0;\n                this.visible = void 0;\n                this.width = void 0;\n                this.zoomEnabled = void 0;\n                this.init(chart, userOptions);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Overrideable function to initialize the axis.\n             *\n             * @see {@link Axis}\n             *\n             * @function Highcharts.Axis#init\n             *\n             * @param {Highcharts.Chart} chart\n             * The Chart instance to apply the axis on.\n             *\n             * @param {Highcharts.AxisOptions} userOptions\n             * Axis options.\n             *\n             * @fires Highcharts.Axis#event:afterInit\n             * @fires Highcharts.Axis#event:init\n             */\n            Axis.prototype.init = function (chart, userOptions) {\n                var isXAxis = userOptions.isX,\n                    axis = this;\n                /**\n                 * The Chart that the axis belongs to.\n                 *\n                 * @name Highcharts.Axis#chart\n                 * @type {Highcharts.Chart}\n                 */\n                axis.chart = chart;\n                /**\n                 * Whether the axis is horizontal.\n                 *\n                 * @name Highcharts.Axis#horiz\n                 * @type {boolean|undefined}\n                 */\n                axis.horiz = chart.inverted && !axis.isZAxis ? !isXAxis : isXAxis;\n                /**\n                 * Whether the axis is the x-axis.\n                 *\n                 * @name Highcharts.Axis#isXAxis\n                 * @type {boolean|undefined}\n                 */\n                axis.isXAxis = isXAxis;\n                /**\n                 * The collection where the axis belongs, for example `xAxis`, `yAxis`\n                 * or `colorAxis`. Corresponds to properties on Chart, for example\n                 * {@link Chart.xAxis}.\n                 *\n                 * @name Highcharts.Axis#coll\n                 * @type {string}\n                 */\n                axis.coll = axis.coll || (isXAxis ? 'xAxis' : 'yAxis');\n                fireEvent(this, 'init', { userOptions: userOptions });\n                axis.opposite = userOptions.opposite; // needed in setOptions\n                /**\n                 * The side on which the axis is rendered. 0 is top, 1 is right, 2\n                 * is bottom and 3 is left.\n                 *\n                 * @name Highcharts.Axis#side\n                 * @type {number}\n                 */\n                axis.side = userOptions.side || (axis.horiz ?\n                    (axis.opposite ? 0 : 2) : // top : bottom\n                    (axis.opposite ? 1 : 3)); // right : left\n                /**\n                 * Current options for the axis after merge of defaults and user's\n                 * options.\n                 *\n                 * @name Highcharts.Axis#options\n                 * @type {Highcharts.AxisOptions}\n                 */\n                axis.setOptions(userOptions);\n                var options = this.options,\n                    type = options.type;\n                axis.labelFormatter = (options.labels.formatter ||\n                    // can be overwritten by dynamic format\n                    axis.defaultLabelFormatter);\n                /**\n                 * User's options for this axis without defaults.\n                 *\n                 * @name Highcharts.Axis#userOptions\n                 * @type {Highcharts.AxisOptions}\n                 */\n                axis.userOptions = userOptions;\n                axis.minPixelPadding = 0;\n                /**\n                 * Whether the axis is reversed. Based on the `axis.reversed`,\n                 * option, but inverted charts have reversed xAxis by default.\n                 *\n                 * @name Highcharts.Axis#reversed\n                 * @type {boolean}\n                 */\n                axis.reversed = options.reversed;\n                axis.visible = options.visible !== false;\n                axis.zoomEnabled = options.zoomEnabled !== false;\n                // Initial categories\n                axis.hasNames =\n                    type === 'category' || options.categories === true;\n                /**\n                 * If categories are present for the axis, names are used instead of\n                 * numbers for that axis.\n                 *\n                 * Since Highcharts 3.0, categories can also be extracted by giving each\n                 * point a name and setting axis type to `category`. However, if you\n                 * have multiple series, best practice remains defining the `categories`\n                 * array.\n                 *\n                 * @see [xAxis.categories](/highcharts/xAxis.categories)\n                 *\n                 * @name Highcharts.Axis#categories\n                 * @type {Array<string>}\n                 * @readonly\n                 */\n                axis.categories = options.categories || axis.hasNames;\n                if (!axis.names) { // Preserve on update (#3830)\n                    axis.names = [];\n                    axis.names.keys = {};\n                }\n                // Placeholder for plotlines and plotbands groups\n                axis.plotLinesAndBandsGroups = {};\n                // Shorthand types\n                axis.positiveValuesOnly = !!(axis.logarithmic && !options.allowNegativeLog);\n                // Flag, if axis is linked to another axis\n                axis.isLinked = defined(options.linkedTo);\n                /**\n                 * List of major ticks mapped by postition on axis.\n                 *\n                 * @see {@link Highcharts.Tick}\n                 *\n                 * @name Highcharts.Axis#ticks\n                 * @type {Highcharts.Dictionary<Highcharts.Tick>}\n                 */\n                axis.ticks = {};\n                axis.labelEdge = [];\n                /**\n                 * List of minor ticks mapped by position on the axis.\n                 *\n                 * @see {@link Highcharts.Tick}\n                 *\n                 * @name Highcharts.Axis#minorTicks\n                 * @type {Highcharts.Dictionary<Highcharts.Tick>}\n                 */\n                axis.minorTicks = {};\n                // List of plotLines/Bands\n                axis.plotLinesAndBands = [];\n                // Alternate bands\n                axis.alternateBands = {};\n                // Axis metrics\n                axis.len = 0;\n                axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n                axis.range = options.range;\n                axis.offset = options.offset || 0;\n                /**\n                 * The maximum value of the axis. In a logarithmic axis, this is the\n                 * logarithm of the real value, and the real value can be obtained from\n                 * {@link Axis#getExtremes}.\n                 *\n                 * @name Highcharts.Axis#max\n                 * @type {number|null}\n                 */\n                axis.max = null;\n                /**\n                 * The minimum value of the axis. In a logarithmic axis, this is the\n                 * logarithm of the real value, and the real value can be obtained from\n                 * {@link Axis#getExtremes}.\n                 *\n                 * @name Highcharts.Axis#min\n                 * @type {number|null}\n                 */\n                axis.min = null;\n                /**\n                 * The processed crosshair options.\n                 *\n                 * @name Highcharts.Axis#crosshair\n                 * @type {boolean|Highcharts.AxisCrosshairOptions}\n                 */\n                axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);\n                var events = axis.options.events;\n                // Register. Don't add it again on Axis.update().\n                if (chart.axes.indexOf(axis) === -1) { //\n                    if (isXAxis) { // #2713\n                        chart.axes.splice(chart.xAxis.length, 0, axis);\n                    }\n                    else {\n                        chart.axes.push(axis);\n                    }\n                    chart[axis.coll].push(axis);\n                }\n                /**\n                 * All series associated to the axis.\n                 *\n                 * @name Highcharts.Axis#series\n                 * @type {Array<Highcharts.Series>}\n                 */\n                axis.series = axis.series || []; // populated by Series\n                // Reversed axis\n                if (chart.inverted &&\n                    !axis.isZAxis &&\n                    isXAxis &&\n                    typeof axis.reversed === 'undefined') {\n                    axis.reversed = true;\n                }\n                axis.labelRotation = axis.options.labels.rotation;\n                // register event listeners\n                objectEach(events, function (event, eventType) {\n                    if (isFunction(event)) {\n                        addEvent(axis, eventType, event);\n                    }\n                });\n                fireEvent(this, 'afterInit');\n            };\n            /**\n             * Merge and set options.\n             *\n             * @private\n             * @function Highcharts.Axis#setOptions\n             *\n             * @param {Highcharts.AxisOptions} userOptions\n             * Axis options.\n             *\n             * @fires Highcharts.Axis#event:afterSetOptions\n             */\n            Axis.prototype.setOptions = function (userOptions) {\n                this.options = merge(Axis.defaultOptions, (this.coll === 'yAxis') && Axis.defaultYAxisOptions, [\n                    Axis.defaultTopAxisOptions,\n                    Axis.defaultRightAxisOptions,\n                    Axis.defaultBottomAxisOptions,\n                    Axis.defaultLeftAxisOptions\n                ][this.side], merge(\n                // if set in setOptions (#1053):\n                defaultOptions[this.coll], userOptions));\n                fireEvent(this, 'afterSetOptions', { userOptions: userOptions });\n            };\n            /**\n             * The default label formatter. The context is a special config object for\n             * the label. In apps, use the\n             * [labels.formatter](https://api.highcharts.com/highcharts/xAxis.labels.formatter)\n             * instead, except when a modification is needed.\n             *\n             * @function Highcharts.Axis#defaultLabelFormatter\n             *\n             * @param {Highcharts.AxisLabelsFormatterContextObject<number>|Highcharts.AxisLabelsFormatterContextObject<string>} this\n             * Formatter context of axis label.\n             *\n             * @return {string}\n             * The formatted label content.\n             */\n            Axis.prototype.defaultLabelFormatter = function () {\n                var axis = this.axis,\n                    value = isNumber(this.value) ? this.value : NaN,\n                    time = axis.chart.time,\n                    categories = axis.categories,\n                    dateTimeLabelFormat = this.dateTimeLabelFormat,\n                    lang = defaultOptions.lang,\n                    numericSymbols = lang.numericSymbols,\n                    numSymMagnitude = lang.numericSymbolMagnitude || 1000,\n                    i = numericSymbols && numericSymbols.length,\n                    multi,\n                    ret,\n                    formatOption = axis.options.labels.format, \n                    // make sure the same symbol is added for all labels on a linear\n                    // axis\n                    numericSymbolDetector = axis.logarithmic ?\n                        Math.abs(value) :\n                        axis.tickInterval;\n                var chart = this.chart;\n                var numberFormatter = chart.numberFormatter;\n                if (formatOption) {\n                    ret = format(formatOption, this, chart);\n                }\n                else if (categories) {\n                    ret = \"\" + this.value;\n                }\n                else if (dateTimeLabelFormat) { // datetime axis\n                    ret = time.dateFormat(dateTimeLabelFormat, value);\n                }\n                else if (i && numericSymbolDetector >= 1000) {\n                    // Decide whether we should add a numeric symbol like k (thousands)\n                    // or M (millions). If we are to enable this in tooltip or other\n                    // places as well, we can move this logic to the numberFormatter and\n                    // enable it by a parameter.\n                    while (i-- && typeof ret === 'undefined') {\n                        multi = Math.pow(numSymMagnitude, i + 1);\n                        if (\n                        // Only accept a numeric symbol when the distance is more\n                        // than a full unit. So for example if the symbol is k, we\n                        // don't accept numbers like 0.5k.\n                        numericSymbolDetector >= multi &&\n                            // Accept one decimal before the symbol. Accepts 0.5k but\n                            // not 0.25k. How does this work with the previous?\n                            (value * 10) % multi === 0 &&\n                            numericSymbols[i] !== null &&\n                            value !== 0) { // #5480\n                            ret = numberFormatter(value / multi, -1) + numericSymbols[i];\n                        }\n                    }\n                }\n                if (typeof ret === 'undefined') {\n                    if (Math.abs(value) >= 10000) { // add thousands separators\n                        ret = numberFormatter(value, -1);\n                    }\n                    else { // small numbers\n                        ret = numberFormatter(value, -1, void 0, ''); // #2466\n                    }\n                }\n                return ret;\n            };\n            /**\n             * Get the minimum and maximum for the series of each axis. The function\n             * analyzes the axis series and updates `this.dataMin` and `this.dataMax`.\n             *\n             * @private\n             * @function Highcharts.Axis#getSeriesExtremes\n             *\n             * @fires Highcharts.Axis#event:afterGetSeriesExtremes\n             * @fires Highcharts.Axis#event:getSeriesExtremes\n             */\n            Axis.prototype.getSeriesExtremes = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    xExtremes;\n                fireEvent(this, 'getSeriesExtremes', null, function () {\n                    axis.hasVisibleSeries = false;\n                    // Reset properties in case we're redrawing (#3353)\n                    axis.dataMin = axis.dataMax = axis.threshold = null;\n                    axis.softThreshold = !axis.isXAxis;\n                    if (axis.stacking) {\n                        axis.stacking.buildStacks();\n                    }\n                    // loop through this axis' series\n                    axis.series.forEach(function (series) {\n                        if (series.visible ||\n                            !chart.options.chart.ignoreHiddenSeries) {\n                            var seriesOptions = series.options,\n                                xData,\n                                threshold = seriesOptions.threshold,\n                                seriesDataMin,\n                                seriesDataMax;\n                            axis.hasVisibleSeries = true;\n                            // Validate threshold in logarithmic axes\n                            if (axis.positiveValuesOnly && threshold <= 0) {\n                                threshold = null;\n                            }\n                            // Get dataMin and dataMax for X axes\n                            if (axis.isXAxis) {\n                                xData = series.xData;\n                                if (xData.length) {\n                                    xExtremes = series.getXExtremes(xData);\n                                    // If xData contains values which is not numbers,\n                                    // then filter them out. To prevent performance hit,\n                                    // we only do this after we have already found\n                                    // seriesDataMin because in most cases all data is\n                                    // valid. #5234.\n                                    seriesDataMin = xExtremes.min;\n                                    seriesDataMax = xExtremes.max;\n                                    if (!isNumber(seriesDataMin) &&\n                                        // #5010:\n                                        !(seriesDataMin instanceof Date)) {\n                                        xData = xData.filter(isNumber);\n                                        xExtremes = series.getXExtremes(xData);\n                                        // Do it again with valid data\n                                        seriesDataMin = xExtremes.min;\n                                        seriesDataMax = xExtremes.max;\n                                    }\n                                    if (xData.length) {\n                                        axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                                        axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                                    }\n                                }\n                                // Get dataMin and dataMax for Y axes, as well as handle\n                                // stacking and processed data\n                            }\n                            else {\n                                // Get this particular series extremes\n                                var dataExtremes = series.applyExtremes();\n                                // Get the dataMin and dataMax so far. If percentage is\n                                // used, the min and max are always 0 and 100. If\n                                // seriesDataMin and seriesDataMax is null, then series\n                                // doesn't have active y data, we continue with nulls\n                                if (isNumber(dataExtremes.dataMin)) {\n                                    seriesDataMin = dataExtremes.dataMin;\n                                    axis.dataMin = Math.min(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n                                }\n                                if (isNumber(dataExtremes.dataMax)) {\n                                    seriesDataMax = dataExtremes.dataMax;\n                                    axis.dataMax = Math.max(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n                                }\n                                // Adjust to threshold\n                                if (defined(threshold)) {\n                                    axis.threshold = threshold;\n                                }\n                                // If any series has a hard threshold, it takes\n                                // precedence\n                                if (!seriesOptions.softThreshold ||\n                                    axis.positiveValuesOnly) {\n                                    axis.softThreshold = false;\n                                }\n                            }\n                        }\n                    });\n                });\n                fireEvent(this, 'afterGetSeriesExtremes');\n            };\n            /**\n             * Translate from axis value to pixel position on the chart, or back. Use\n             * the `toPixels` and `toValue` functions in applications.\n             *\n             * @private\n             * @function Highcharts.Axis#translate\n             *\n             * @param {number} val\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [backwards]\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [cvsCoord]\n             * TO-DO: parameter description\n             *\n             * @param {boolean|null} [old]\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [handleLog]\n             * TO-DO: parameter description\n             *\n             * @param {number} [pointPlacement]\n             * TO-DO: parameter description\n             *\n             * @return {number|undefined}\n             */\n            Axis.prototype.translate = function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n                var axis = this.linkedParent || this, // #1417\n                    sign = 1,\n                    cvsOffset = 0,\n                    localA = old ? axis.oldTransA : axis.transA,\n                    localMin = old ? axis.oldMin : axis.min,\n                    returnValue = 0,\n                    minPixelPadding = axis.minPixelPadding,\n                    doPostTranslate = (axis.isOrdinal ||\n                        axis.brokenAxis && axis.brokenAxis.hasBreaks ||\n                        (axis.logarithmic && handleLog)) && axis.lin2val;\n                if (!localA) {\n                    localA = axis.transA;\n                }\n                // In vertical axes, the canvas coordinates start from 0 at the top like\n                // in SVG.\n                if (cvsCoord) {\n                    sign *= -1; // canvas coordinates inverts the value\n                    cvsOffset = axis.len;\n                }\n                // Handle reversed axis\n                if (axis.reversed) {\n                    sign *= -1;\n                    cvsOffset -= sign * (axis.sector || axis.len);\n                }\n                // From pixels to value\n                if (backwards) { // reverse translation\n                    val = val * sign + cvsOffset;\n                    val -= minPixelPadding;\n                    // from chart pixel to value:\n                    returnValue = val / localA + localMin;\n                    if (doPostTranslate) { // log and ordinal axes\n                        returnValue = axis.lin2val(returnValue);\n                    }\n                    // From value to pixels\n                }\n                else {\n                    if (doPostTranslate) { // log and ordinal axes\n                        val = axis.val2lin(val);\n                    }\n                    returnValue = isNumber(localMin) ?\n                        (sign * (val - localMin) * localA +\n                            cvsOffset +\n                            (sign * minPixelPadding) +\n                            (isNumber(pointPlacement) ?\n                                localA * pointPlacement :\n                                0)) :\n                        void 0;\n                }\n                return returnValue;\n            };\n            /**\n             * Translate a value in terms of axis units into pixels within the chart.\n             *\n             * @function Highcharts.Axis#toPixels\n             *\n             * @param {number} value\n             * A value in terms of axis units.\n             *\n             * @param {boolean} paneCoordinates\n             * Whether to return the pixel coordinate relative to the chart or just the\n             * axis/pane itself.\n             *\n             * @return {number}\n             * Pixel position of the value on the chart or axis.\n             */\n            Axis.prototype.toPixels = function (value, paneCoordinates) {\n                return this.translate(value, false, !this.horiz, null, true) +\n                    (paneCoordinates ? 0 : this.pos);\n            };\n            /**\n             * Translate a pixel position along the axis to a value in terms of axis\n             * units.\n             *\n             * @function Highcharts.Axis#toValue\n             *\n             * @param {number} pixel\n             * The pixel value coordinate.\n             *\n             * @param {boolean} [paneCoordinates=false]\n             * Whether the input pixel is relative to the chart or just the axis/pane\n             * itself.\n             *\n             * @return {number}\n             * The axis value.\n             */\n            Axis.prototype.toValue = function (pixel, paneCoordinates) {\n                return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);\n            };\n            /**\n             * Create the path for a plot line that goes from the given value on\n             * this axis, across the plot to the opposite side. Also used internally for\n             * grid lines and crosshairs.\n             *\n             * @function Highcharts.Axis#getPlotLinePath\n             *\n             * @param {Highcharts.AxisPlotLinePathOptionsObject} options\n             * Options for the path.\n             *\n             * @return {Highcharts.SVGPathArray|null}\n             * The SVG path definition for the plot line.\n             */\n            Axis.prototype.getPlotLinePath = function (options) {\n                var axis = this,\n                    chart = axis.chart,\n                    axisLeft = axis.left,\n                    axisTop = axis.top,\n                    old = options.old,\n                    value = options.value,\n                    translatedValue = options.translatedValue,\n                    lineWidth = options.lineWidth,\n                    force = options.force,\n                    x1,\n                    y1,\n                    x2,\n                    y2,\n                    cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n                    cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n                    skip,\n                    transB = axis.transB,\n                    evt;\n                // eslint-disable-next-line valid-jsdoc\n                /**\n                 * Check if x is between a and b. If not, either move to a/b\n                 * or skip, depending on the force parameter.\n                 * @private\n                 */\n                function between(x, a, b) {\n                    if (force !== 'pass' && x < a || x > b) {\n                        if (force) {\n                            x = clamp(x, a, b);\n                        }\n                        else {\n                            skip = true;\n                        }\n                    }\n                    return x;\n                }\n                evt = {\n                    value: value,\n                    lineWidth: lineWidth,\n                    old: old,\n                    force: force,\n                    acrossPanes: options.acrossPanes,\n                    translatedValue: translatedValue\n                };\n                fireEvent(this, 'getPlotLinePath', evt, function (e) {\n                    translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n                    // Keep the translated value within sane bounds, and avoid Infinity\n                    // to fail the isNumber test (#7709).\n                    translatedValue = clamp(translatedValue, -1e5, 1e5);\n                    x1 = x2 = Math.round(translatedValue + transB);\n                    y1 = y2 = Math.round(cHeight - translatedValue - transB);\n                    if (!isNumber(translatedValue)) { // no min or max\n                        skip = true;\n                        force = false; // #7175, don't force it when path is invalid\n                    }\n                    else if (axis.horiz) {\n                        y1 = axisTop;\n                        y2 = cHeight - axis.bottom;\n                        x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n                    }\n                    else {\n                        x1 = axisLeft;\n                        x2 = cWidth - axis.right;\n                        y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n                    }\n                    e.path = skip && !force ?\n                        null :\n                        chart.renderer.crispLine([['M', x1, y1], ['L', x2, y2]], lineWidth || 1);\n                });\n                return evt.path;\n            };\n            /**\n             * Internal function to et the tick positions of a linear axis to round\n             * values like whole tens or every five.\n             *\n             * @function Highcharts.Axis#getLinearTickPositions\n             *\n             * @param {number} tickInterval\n             * The normalized tick interval.\n             *\n             * @param {number} min\n             * Axis minimum.\n             *\n             * @param {number} max\n             * Axis maximum.\n             *\n             * @return {Array<number>}\n             * An array of axis values where ticks should be placed.\n             */\n            Axis.prototype.getLinearTickPositions = function (tickInterval, min, max) {\n                var pos,\n                    lastPos,\n                    roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval),\n                    roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),\n                    tickPositions = [],\n                    precision;\n                // When the precision is higher than what we filter out in\n                // correctFloat, skip it (#6183).\n                if (correctFloat(roundedMin + tickInterval) === roundedMin) {\n                    precision = 20;\n                }\n                // For single points, add a tick regardless of the relative position\n                // (#2662, #6274)\n                if (this.single) {\n                    return [min];\n                }\n                // Populate the intermediate values\n                pos = roundedMin;\n                while (pos <= roundedMax) {\n                    // Place the tick on the rounded value\n                    tickPositions.push(pos);\n                    // Always add the raw tickInterval, not the corrected one.\n                    pos = correctFloat(pos + tickInterval, precision);\n                    // If the interval is not big enough in the current min - max range\n                    // to actually increase the loop variable, we need to break out to\n                    // prevent endless loop. Issue #619\n                    if (pos === lastPos) {\n                        break;\n                    }\n                    // Record the last value\n                    lastPos = pos;\n                }\n                return tickPositions;\n            };\n            /**\n             * Resolve the new minorTicks/minorTickInterval options into the legacy\n             * loosely typed minorTickInterval option.\n             *\n             * @function Highcharts.Axis#getMinorTickInterval\n             *\n             * @return {number|\"auto\"|null}\n             */\n            Axis.prototype.getMinorTickInterval = function () {\n                var options = this.options;\n                if (options.minorTicks === true) {\n                    return pick(options.minorTickInterval, 'auto');\n                }\n                if (options.minorTicks === false) {\n                    return null;\n                }\n                return options.minorTickInterval;\n            };\n            /**\n             * Internal function to return the minor tick positions. For logarithmic\n             * axes, the same logic as for major ticks is reused.\n             *\n             * @function Highcharts.Axis#getMinorTickPositions\n             *\n             * @return {Array<number>}\n             * An array of axis values where ticks should be placed.\n             */\n            Axis.prototype.getMinorTickPositions = function () {\n                var axis = this,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    minorTickInterval = axis.minorTickInterval,\n                    minorTickPositions = [],\n                    pos,\n                    pointRangePadding = axis.pointRangePadding || 0,\n                    min = axis.min - pointRangePadding, // #1498\n                    max = axis.max + pointRangePadding, // #1498\n                    range = max - min;\n                // If minor ticks get too dense, they are hard to read, and may cause\n                // long running script. So we don't draw them.\n                if (range && range / minorTickInterval < axis.len / 3) { // #3875\n                    var logarithmic_1 = axis.logarithmic;\n                    if (logarithmic_1) {\n                        // For each interval in the major ticks, compute the minor ticks\n                        // separately.\n                        this.paddedTicks.forEach(function (_pos, i, paddedTicks) {\n                            if (i) {\n                                minorTickPositions.push.apply(minorTickPositions, logarithmic_1.getLogTickPositions(minorTickInterval, paddedTicks[i - 1], paddedTicks[i], true));\n                            }\n                        });\n                    }\n                    else if (axis.dateTime &&\n                        this.getMinorTickInterval() === 'auto') { // #1314\n                        minorTickPositions = minorTickPositions.concat(axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(minorTickInterval), min, max, options.startOfWeek));\n                    }\n                    else {\n                        for (pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval) {\n                            // Very, very, tight grid lines (#5771)\n                            if (pos === minorTickPositions[0]) {\n                                break;\n                            }\n                            minorTickPositions.push(pos);\n                        }\n                    }\n                }\n                if (minorTickPositions.length !== 0) {\n                    axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n                }\n                return minorTickPositions;\n            };\n            /**\n             * Adjust the min and max for the minimum range. Keep in mind that the\n             * series data is not yet processed, so we don't have information on data\n             * cropping and grouping, or updated `axis.pointRange` or\n             * `series.pointRange`. The data can't be processed until we have finally\n             * established min and max.\n             *\n             * @private\n             * @function Highcharts.Axis#adjustForMinRange\n             */\n            Axis.prototype.adjustForMinRange = function () {\n                var axis = this,\n                    options = axis.options,\n                    min = axis.min,\n                    max = axis.max,\n                    log = axis.logarithmic,\n                    zoomOffset,\n                    spaceAvailable,\n                    closestDataRange,\n                    i,\n                    distance,\n                    xData,\n                    loopLength,\n                    minArgs,\n                    maxArgs,\n                    minRange;\n                // Set the automatic minimum range based on the closest point distance\n                if (axis.isXAxis &&\n                    typeof axis.minRange === 'undefined' &&\n                    !log) {\n                    if (defined(options.min) || defined(options.max)) {\n                        axis.minRange = null; // don't do this again\n                    }\n                    else {\n                        // Find the closest distance between raw data points, as opposed\n                        // to closestPointRange that applies to processed points\n                        // (cropped and grouped)\n                        axis.series.forEach(function (series) {\n                            xData = series.xData;\n                            loopLength = series.xIncrement ? 1 : xData.length - 1;\n                            for (i = loopLength; i > 0; i--) {\n                                distance = xData[i] - xData[i - 1];\n                                if (typeof closestDataRange === 'undefined' ||\n                                    distance < closestDataRange) {\n                                    closestDataRange = distance;\n                                }\n                            }\n                        });\n                        axis.minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n                    }\n                }\n                // if minRange is exceeded, adjust\n                if (max - min < axis.minRange) {\n                    spaceAvailable =\n                        axis.dataMax - axis.dataMin >=\n                            axis.minRange;\n                    minRange = axis.minRange;\n                    zoomOffset = (minRange - max + min) / 2;\n                    // if min and max options have been set, don't go beyond it\n                    minArgs = [\n                        min - zoomOffset,\n                        pick(options.min, min - zoomOffset)\n                    ];\n                    // If space is available, stay within the data range\n                    if (spaceAvailable) {\n                        minArgs[2] = axis.logarithmic ?\n                            axis.logarithmic.log2lin(axis.dataMin) :\n                            axis.dataMin;\n                    }\n                    min = arrayMax(minArgs);\n                    maxArgs = [\n                        min + minRange,\n                        pick(options.max, min + minRange)\n                    ];\n                    // If space is availabe, stay within the data range\n                    if (spaceAvailable) {\n                        maxArgs[2] = log ?\n                            log.log2lin(axis.dataMax) :\n                            axis.dataMax;\n                    }\n                    max = arrayMin(maxArgs);\n                    // now if the max is adjusted, adjust the min back\n                    if (max - min < minRange) {\n                        minArgs[0] = max - minRange;\n                        minArgs[1] = pick(options.min, max - minRange);\n                        min = arrayMax(minArgs);\n                    }\n                }\n                // Record modified extremes\n                axis.min = min;\n                axis.max = max;\n            };\n            // eslint-disable-next-line valid-jsdoc\n            /**\n             * Find the closestPointRange across all series.\n             *\n             * @private\n             * @function Highcharts.Axis#getClosest\n             */\n            Axis.prototype.getClosest = function () {\n                var ret;\n                if (this.categories) {\n                    ret = 1;\n                }\n                else {\n                    this.series.forEach(function (series) {\n                        var seriesClosest = series.closestPointRange,\n                            visible = series.visible ||\n                                !series.chart.options.chart.ignoreHiddenSeries;\n                        if (!series.noSharedTooltip &&\n                            defined(seriesClosest) &&\n                            visible) {\n                            ret = defined(ret) ?\n                                Math.min(ret, seriesClosest) :\n                                seriesClosest;\n                        }\n                    });\n                }\n                return ret;\n            };\n            /**\n             * When a point name is given and no x, search for the name in the existing\n             * categories, or if categories aren't provided, search names or create a\n             * new category (#2522).\n             * @private\n             * @function Highcharts.Axis#nameToX\n             *\n             * @param {Highcharts.Point} point\n             * The point to inspect.\n             *\n             * @return {number}\n             * The X value that the point is given.\n             */\n            Axis.prototype.nameToX = function (point) {\n                var explicitCategories = isArray(this.categories),\n                    names = explicitCategories ? this.categories : this.names,\n                    nameX = point.options.x,\n                    x;\n                point.series.requireSorting = false;\n                if (!defined(nameX)) {\n                    nameX = this.options.uniqueNames === false ?\n                        point.series.autoIncrement() :\n                        (explicitCategories ?\n                            names.indexOf(point.name) :\n                            pick(names.keys[point.name], -1));\n                }\n                if (nameX === -1) { // Not found in currenct categories\n                    if (!explicitCategories) {\n                        x = names.length;\n                    }\n                }\n                else {\n                    x = nameX;\n                }\n                // Write the last point's name to the names array\n                if (typeof x !== 'undefined') {\n                    this.names[x] = point.name;\n                    // Backwards mapping is much faster than array searching (#7725)\n                    this.names.keys[point.name] = x;\n                }\n                return x;\n            };\n            /**\n             * When changes have been done to series data, update the axis.names.\n             *\n             * @private\n             * @function Highcharts.Axis#updateNames\n             */\n            Axis.prototype.updateNames = function () {\n                var axis = this,\n                    names = this.names,\n                    i = names.length;\n                if (i > 0) {\n                    Object.keys(names.keys).forEach(function (key) {\n                        delete (names.keys)[key];\n                    });\n                    names.length = 0;\n                    this.minRange = this.userMinRange; // Reset\n                    (this.series || []).forEach(function (series) {\n                        // Reset incrementer (#5928)\n                        series.xIncrement = null;\n                        // When adding a series, points are not yet generated\n                        if (!series.points || series.isDirtyData) {\n                            // When we're updating the series with data that is longer\n                            // than it was, and cropThreshold is passed, we need to make\n                            // sure that the axis.max is increased _before_ running the\n                            // premature processData. Otherwise this early iteration of\n                            // processData will crop the points to axis.max, and the\n                            // names array will be too short (#5857).\n                            axis.max = Math.max(axis.max, series.xData.length - 1);\n                            series.processData();\n                            series.generatePoints();\n                        }\n                        series.data.forEach(function (point, i) {\n                            var x;\n                            if (point &&\n                                point.options &&\n                                typeof point.name !== 'undefined' // #9562\n                            ) {\n                                x = axis.nameToX(point);\n                                if (typeof x !== 'undefined' && x !== point.x) {\n                                    point.x = x;\n                                    series.xData[i] = x;\n                                }\n                            }\n                        });\n                    });\n                }\n            };\n            /**\n             * Update translation information.\n             *\n             * @private\n             * @function Highcharts.Axis#setAxisTranslation\n             *\n             * @param {boolean} [saveOld]\n             * TO-DO: parameter description\n             *\n             * @fires Highcharts.Axis#event:afterSetAxisTranslation\n             */\n            Axis.prototype.setAxisTranslation = function (saveOld) {\n                var axis = this,\n                    range = axis.max - axis.min,\n                    pointRange = axis.axisPointRange || 0,\n                    closestPointRange,\n                    minPointOffset = 0,\n                    pointRangePadding = 0,\n                    linkedParent = axis.linkedParent,\n                    ordinalCorrection,\n                    hasCategories = !!axis.categories,\n                    transA = axis.transA,\n                    isXAxis = axis.isXAxis;\n                // Adjust translation for padding. Y axis with categories need to go\n                // through the same (#1784).\n                if (isXAxis || hasCategories || pointRange) {\n                    // Get the closest points\n                    closestPointRange = axis.getClosest();\n                    if (linkedParent) {\n                        minPointOffset = linkedParent.minPointOffset;\n                        pointRangePadding = linkedParent.pointRangePadding;\n                    }\n                    else {\n                        axis.series.forEach(function (series) {\n                            var seriesPointRange = hasCategories ?\n                                    1 :\n                                    (isXAxis ?\n                                        pick(series.options.pointRange,\n                                closestPointRange, 0) :\n                                        (axis.axisPointRange || 0)), // #2806\n                                pointPlacement = series.options.pointPlacement;\n                            pointRange = Math.max(pointRange, seriesPointRange);\n                            if (!axis.single || hasCategories) {\n                                // TODO: series should internally set x- and y-\n                                // pointPlacement to simplify this logic.\n                                var isPointPlacementAxis = series.is('xrange') ? !isXAxis : isXAxis;\n                                // minPointOffset is the value padding to the left of\n                                // the axis in order to make room for points with a\n                                // pointRange, typically columns. When the\n                                // pointPlacement option is 'between' or 'on', this\n                                // padding does not apply.\n                                minPointOffset = Math.max(minPointOffset, isPointPlacementAxis && isString(pointPlacement) ?\n                                    0 :\n                                    seriesPointRange / 2);\n                                // Determine the total padding needed to the length of\n                                // the axis to make room for the pointRange. If the\n                                // series' pointPlacement is 'on', no padding is added.\n                                pointRangePadding = Math.max(pointRangePadding, isPointPlacementAxis && pointPlacement === 'on' ?\n                                    0 :\n                                    seriesPointRange);\n                            }\n                        });\n                    }\n                    // Record minPointOffset and pointRangePadding\n                    ordinalCorrection = axis.ordinal && axis.ordinal.slope && closestPointRange ?\n                        axis.ordinal.slope / closestPointRange :\n                        1; // #988, #1853\n                    axis.minPointOffset = minPointOffset =\n                        minPointOffset * ordinalCorrection;\n                    axis.pointRangePadding =\n                        pointRangePadding = pointRangePadding * ordinalCorrection;\n                    // pointRange means the width reserved for each point, like in a\n                    // column chart\n                    axis.pointRange = Math.min(pointRange, axis.single && hasCategories ? 1 : range);\n                    // closestPointRange means the closest distance between points. In\n                    // columns it is mostly equal to pointRange, but in lines pointRange\n                    // is 0 while closestPointRange is some other value\n                    if (isXAxis) {\n                        axis.closestPointRange = closestPointRange;\n                    }\n                }\n                // Secondary values\n                if (saveOld) {\n                    axis.oldTransA = transA;\n                }\n                axis.translationSlope = axis.transA = transA =\n                    axis.staticScale ||\n                        axis.len / ((range + pointRangePadding) || 1);\n                // Translation addend\n                axis.transB = axis.horiz ? axis.left : axis.bottom;\n                axis.minPixelPadding = transA * minPointOffset;\n                fireEvent(this, 'afterSetAxisTranslation');\n            };\n            /**\n             * @private\n             * @function Highcharts.Axis#minFromRange\n             *\n             * @return {number}\n             */\n            Axis.prototype.minFromRange = function () {\n                var axis = this;\n                return axis.max - axis.range;\n            };\n            /**\n             * Set the tick positions to round values and optionally extend the extremes\n             * to the nearest tick.\n             *\n             * @private\n             * @function Highcharts.Axis#setTickInterval\n             *\n             * @param {boolean} secondPass\n             * TO-DO: parameter description\n             *\n             * @fires Highcharts.Axis#event:foundExtremes\n             */\n            Axis.prototype.setTickInterval = function (secondPass) {\n                var axis = this,\n                    chart = axis.chart,\n                    log = axis.logarithmic,\n                    options = axis.options,\n                    isXAxis = axis.isXAxis,\n                    isLinked = axis.isLinked,\n                    maxPadding = options.maxPadding,\n                    minPadding = options.minPadding,\n                    length,\n                    linkedParentExtremes,\n                    tickIntervalOption = options.tickInterval,\n                    minTickInterval,\n                    tickPixelIntervalOption = options.tickPixelInterval,\n                    categories = axis.categories,\n                    threshold = isNumber(axis.threshold) ? axis.threshold : null,\n                    softThreshold = axis.softThreshold,\n                    thresholdMin,\n                    thresholdMax,\n                    hardMin,\n                    hardMax;\n                if (!axis.dateTime && !categories && !isLinked) {\n                    this.getTickAmount();\n                }\n                // Min or max set either by zooming/setExtremes or initial options\n                hardMin = pick(axis.userMin, options.min);\n                hardMax = pick(axis.userMax, options.max);\n                // Linked axis gets the extremes from the parent axis\n                if (isLinked) {\n                    axis.linkedParent = chart[axis.coll][options.linkedTo];\n                    linkedParentExtremes = axis.linkedParent.getExtremes();\n                    axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n                    axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n                    if (options.type !== axis.linkedParent.options.type) {\n                        // Can't link axes of different type\n                        error(11, 1, chart);\n                    }\n                    // Initial min and max from the extreme data values\n                }\n                else {\n                    // Adjust to hard threshold\n                    if (!softThreshold && defined(threshold)) {\n                        if (axis.dataMin >= threshold) {\n                            thresholdMin = threshold;\n                            minPadding = 0;\n                        }\n                        else if (axis.dataMax <= threshold) {\n                            thresholdMax = threshold;\n                            maxPadding = 0;\n                        }\n                    }\n                    axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n                    axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n                }\n                if (log) {\n                    if (axis.positiveValuesOnly &&\n                        !secondPass &&\n                        Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978\n                        // Can't plot negative values on log axis\n                        error(10, 1, chart);\n                    }\n                    // The correctFloat cures #934, float errors on full tens. But it\n                    // was too aggressive for #4360 because of conversion back to lin,\n                    // therefore use precision 15.\n                    axis.min = correctFloat(log.log2lin(axis.min), 16);\n                    axis.max = correctFloat(log.log2lin(axis.max), 16);\n                }\n                // handle zoomed range\n                if (axis.range && defined(axis.max)) {\n                    // #618, #6773:\n                    axis.userMin = axis.min = hardMin =\n                        Math.max(axis.dataMin, axis.minFromRange());\n                    axis.userMax = hardMax = axis.max;\n                    axis.range = null; // don't use it when running setExtremes\n                }\n                // Hook for Highstock Scroller. Consider combining with beforePadding.\n                fireEvent(axis, 'foundExtremes');\n                // Hook for adjusting this.min and this.max. Used by bubble series.\n                if (axis.beforePadding) {\n                    axis.beforePadding();\n                }\n                // adjust min and max for the minimum range\n                axis.adjustForMinRange();\n                // Pad the values to get clear of the chart's edges. To avoid\n                // tickInterval taking the padding into account, we do this after\n                // computing tick interval (#1337).\n                if (!categories &&\n                    !axis.axisPointRange &&\n                    !(axis.stacking && axis.stacking.usePercentage) &&\n                    !isLinked &&\n                    defined(axis.min) &&\n                    defined(axis.max)) {\n                    length = axis.max - axis.min;\n                    if (length) {\n                        if (!defined(hardMin) && minPadding) {\n                            axis.min -= length * minPadding;\n                        }\n                        if (!defined(hardMax) && maxPadding) {\n                            axis.max += length * maxPadding;\n                        }\n                    }\n                }\n                // Handle options for floor, ceiling, softMin and softMax (#6359)\n                if (!isNumber(axis.userMin)) {\n                    if (isNumber(options.softMin) && options.softMin < axis.min) {\n                        axis.min = hardMin = options.softMin; // #6894\n                    }\n                    if (isNumber(options.floor)) {\n                        axis.min = Math.max(axis.min, options.floor);\n                    }\n                }\n                if (!isNumber(axis.userMax)) {\n                    if (isNumber(options.softMax) && options.softMax > axis.max) {\n                        axis.max = hardMax = options.softMax; // #6894\n                    }\n                    if (isNumber(options.ceiling)) {\n                        axis.max = Math.min(axis.max, options.ceiling);\n                    }\n                }\n                // When the threshold is soft, adjust the extreme value only if the data\n                // extreme and the padded extreme land on either side of the threshold.\n                // For example, a series of [0, 1, 2, 3] would make the yAxis add a tick\n                // for -1 because of the default minPadding and startOnTick options.\n                // This is prevented by the softThreshold option.\n                if (softThreshold && defined(axis.dataMin)) {\n                    threshold = threshold || 0;\n                    if (!defined(hardMin) &&\n                        axis.min < threshold &&\n                        axis.dataMin >= threshold) {\n                        axis.min = axis.options.minRange ?\n                            Math.min(threshold, axis.max -\n                                axis.minRange) :\n                            threshold;\n                    }\n                    else if (!defined(hardMax) &&\n                        axis.max > threshold &&\n                        axis.dataMax <= threshold) {\n                        axis.max = axis.options.minRange ?\n                            Math.max(threshold, axis.min +\n                                axis.minRange) :\n                            threshold;\n                    }\n                }\n                // get tickInterval\n                if (axis.min === axis.max ||\n                    typeof axis.min === 'undefined' ||\n                    typeof axis.max === 'undefined') {\n                    axis.tickInterval = 1;\n                }\n                else if (isLinked &&\n                    !tickIntervalOption &&\n                    tickPixelIntervalOption ===\n                        axis.linkedParent.options.tickPixelInterval) {\n                    axis.tickInterval = tickIntervalOption =\n                        axis.linkedParent.tickInterval;\n                }\n                else {\n                    axis.tickInterval = pick(tickIntervalOption, this.tickAmount ?\n                        ((axis.max - axis.min) /\n                            Math.max(this.tickAmount - 1, 1)) :\n                        void 0, \n                    // For categoried axis, 1 is default, for linear axis use\n                    // tickPix\n                    categories ?\n                        1 :\n                        // don't let it be more than the data range\n                        (axis.max - axis.min) *\n                            tickPixelIntervalOption /\n                            Math.max(axis.len, tickPixelIntervalOption));\n                }\n                // Now we're finished detecting min and max, crop and group series data.\n                // This is in turn needed in order to find tick positions in ordinal\n                // axes.\n                if (isXAxis && !secondPass) {\n                    axis.series.forEach(function (series) {\n                        series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n                    });\n                }\n                // set the translation factor used in translate function\n                axis.setAxisTranslation(true);\n                // hook for ordinal axes and radial axes\n                fireEvent(this, 'initialAxisTranslation');\n                // In column-like charts, don't cramp in more ticks than there are\n                // points (#1943, #4184)\n                if (axis.pointRange && !tickIntervalOption) {\n                    axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n                }\n                // Before normalizing the tick interval, handle minimum tick interval.\n                // This applies only if tickInterval is not defined.\n                minTickInterval = pick(options.minTickInterval, \n                // In datetime axes, don't go below the data interval, except when\n                // there are scatter-like series involved (#13369).\n                axis.dateTime &&\n                    !axis.series.some(function (s) { return s.noSharedTooltip; }) ?\n                    axis.closestPointRange : 0);\n                if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n                    axis.tickInterval = minTickInterval;\n                }\n                // for linear axes, get magnitude and normalize the interval\n                if (!axis.dateTime && !axis.logarithmic && !tickIntervalOption) {\n                    axis.tickInterval = normalizeTickInterval(axis.tickInterval, void 0, getMagnitude(axis.tickInterval), pick(options.allowDecimals, \n                    // If the tick interval is greather than 0.5, avoid\n                    // decimals, as linear axes are often used to render\n                    // discrete values. #3363. If a tick amount is set, allow\n                    // decimals by default, as it increases the chances for a\n                    // good fit.\n                    axis.tickInterval < 0.5 || this.tickAmount !== void 0), !!this.tickAmount);\n                }\n                // Prevent ticks from getting so close that we can't draw the labels\n                if (!this.tickAmount) {\n                    axis.tickInterval = axis.unsquish();\n                }\n                this.setTickPositions();\n            };\n            /**\n             * Now we have computed the normalized tickInterval, get the tick positions\n             *\n             * @function Highcharts.Axis#setTickPositions\n             *\n             * @fires Highcharts.Axis#event:afterSetTickPositions\n             */\n            Axis.prototype.setTickPositions = function () {\n                var axis = this,\n                    options = this.options,\n                    tickPositions,\n                    tickPositionsOption = options.tickPositions,\n                    minorTickIntervalOption = this.getMinorTickInterval(),\n                    tickPositioner = options.tickPositioner,\n                    hasVerticalPanning = this.hasVerticalPanning(),\n                    isColorAxis = this.coll === 'colorAxis',\n                    startOnTick = (isColorAxis || !hasVerticalPanning) && options.startOnTick,\n                    endOnTick = (isColorAxis || !hasVerticalPanning) && options.endOnTick;\n                // Set the tickmarkOffset\n                this.tickmarkOffset = (this.categories &&\n                    options.tickmarkPlacement === 'between' &&\n                    this.tickInterval === 1) ? 0.5 : 0; // #3202\n                // get minorTickInterval\n                this.minorTickInterval =\n                    minorTickIntervalOption === 'auto' &&\n                        this.tickInterval ?\n                        this.tickInterval / 5 :\n                        minorTickIntervalOption;\n                // When there is only one point, or all points have the same value on\n                // this axis, then min and max are equal and tickPositions.length is 0\n                // or 1. In this case, add some padding in order to center the point,\n                // but leave it with one tick. #1337.\n                this.single =\n                    this.min === this.max &&\n                        defined(this.min) &&\n                        !this.tickAmount &&\n                        (\n                        // Data is on integer (#6563)\n                        parseInt(this.min, 10) === this.min ||\n                            // Between integers and decimals are not allowed (#6274)\n                            options.allowDecimals !== false);\n                /**\n                 * Contains the current positions that are laid out on the axis. The\n                 * positions are numbers in terms of axis values. In a category axis\n                 * they are integers, in a datetime axis they are also integers, but\n                 * designating milliseconds.\n                 *\n                 * This property is read only - for modifying the tick positions, use\n                 * the `tickPositioner` callback or [axis.tickPositions(\n                 * https://api.highcharts.com/highcharts/xAxis.tickPositions) option\n                 * instead.\n                 *\n                 * @name Highcharts.Axis#tickPositions\n                 * @type {Highcharts.AxisTickPositionsArray|undefined}\n                 */\n                this.tickPositions =\n                    // Find the tick positions. Work on a copy (#1565)\n                    tickPositions =\n                        (tickPositionsOption && tickPositionsOption.slice());\n                if (!tickPositions) {\n                    // Too many ticks (#6405). Create a friendly warning and provide two\n                    // ticks so at least we can show the data series.\n                    if ((!axis.ordinal || !axis.ordinal.positions) &&\n                        ((this.max - this.min) /\n                            this.tickInterval >\n                            Math.max(2 * this.len, 200))) {\n                        tickPositions = [this.min, this.max];\n                        error(19, false, this.chart);\n                    }\n                    else if (axis.dateTime) {\n                        tickPositions = axis.getTimeTicks(axis.dateTime.normalizeTimeTickInterval(this.tickInterval, options.units), this.min, this.max, options.startOfWeek, axis.ordinal && axis.ordinal.positions, this.closestPointRange, true);\n                    }\n                    else if (axis.logarithmic) {\n                        tickPositions = axis.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max);\n                    }\n                    else {\n                        tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);\n                    }\n                    // Too dense ticks, keep only the first and last (#4477)\n                    if (tickPositions.length > this.len) {\n                        tickPositions = [tickPositions[0], tickPositions.pop()];\n                        // Reduce doubled value (#7339)\n                        if (tickPositions[0] === tickPositions[1]) {\n                            tickPositions.length = 1;\n                        }\n                    }\n                    this.tickPositions = tickPositions;\n                    // Run the tick positioner callback, that allows modifying auto tick\n                    // positions.\n                    if (tickPositioner) {\n                        tickPositioner = tickPositioner.apply(axis, [this.min, this.max]);\n                        if (tickPositioner) {\n                            this.tickPositions = tickPositions = tickPositioner;\n                        }\n                    }\n                }\n                // Reset min/max or remove extremes based on start/end on tick\n                this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n                this.trimTicks(tickPositions, startOnTick, endOnTick);\n                if (!this.isLinked) {\n                    // Substract half a unit (#2619, #2846, #2515, #3390),\n                    // but not in case of multiple ticks (#6897)\n                    if (this.single &&\n                        tickPositions.length < 2 &&\n                        !this.categories &&\n                        !this.series.some(function (s) {\n                            return (s.is('heatmap') && s.options.pointPlacement === 'between');\n                        })) {\n                        this.min -= 0.5;\n                        this.max += 0.5;\n                    }\n                    if (!tickPositionsOption && !tickPositioner) {\n                        this.adjustTickAmount();\n                    }\n                }\n                fireEvent(this, 'afterSetTickPositions');\n            };\n            /**\n             * Handle startOnTick and endOnTick by either adapting to padding min/max or\n             * rounded min/max. Also handle single data points.\n             *\n             * @private\n             * @function Highcharts.Axis#trimTicks\n             *\n             * @param {Array<number>} tickPositions\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [startOnTick]\n             * TO-DO: parameter description\n             *\n             * @param {boolean} [endOnTick]\n             * TO-DO: parameter description\n             */\n            Axis.prototype.trimTicks = function (tickPositions, startOnTick, endOnTick) {\n                var roundedMin = tickPositions[0],\n                    roundedMax = tickPositions[tickPositions.length - 1],\n                    minPointOffset = (!this.isOrdinal && this.minPointOffset) || 0; // (#12716)\n                    fireEvent(this, 'trimTicks');\n                if (!this.isLinked) {\n                    if (startOnTick && roundedMin !== -Infinity) { // #6502\n                        this.min = roundedMin;\n                    }\n                    else {\n                        while (this.min - minPointOffset > tickPositions[0]) {\n                            tickPositions.shift();\n                        }\n                    }\n                    if (endOnTick) {\n                        this.max = roundedMax;\n                    }\n                    else {\n                        while (this.max + minPointOffset <\n                            tickPositions[tickPositions.length - 1]) {\n                            tickPositions.pop();\n                        }\n                    }\n                    // If no tick are left, set one tick in the middle (#3195)\n                    if (tickPositions.length === 0 &&\n                        defined(roundedMin) &&\n                        !this.options.tickPositions) {\n                        tickPositions.push((roundedMax + roundedMin) / 2);\n                    }\n                }\n            };\n            /**\n             * Check if there are multiple axes in the same pane.\n             *\n             * @private\n             * @function Highcharts.Axis#alignToOthers\n             *\n             * @return {boolean|undefined}\n             * True if there are other axes.\n             */\n            Axis.prototype.alignToOthers = function () {\n                var axis = this,\n                    others = // Whether there is another axis to pair with this one\n                     {},\n                    hasOther,\n                    options = axis.options;\n                if (\n                // Only if alignTicks is true\n                this.chart.options.chart.alignTicks !== false &&\n                    options.alignTicks !== false &&\n                    // Disabled when startOnTick or endOnTick are false (#7604)\n                    options.startOnTick !== false &&\n                    options.endOnTick !== false &&\n                    // Don't try to align ticks on a log axis, they are not evenly\n                    // spaced (#6021)\n                    !axis.logarithmic) {\n                    this.chart[this.coll].forEach(function (axis) {\n                        var otherOptions = axis.options, horiz = axis.horiz, key = [\n                                horiz ? otherOptions.left : otherOptions.top,\n                                otherOptions.width,\n                                otherOptions.height,\n                                otherOptions.pane\n                            ].join(',');\n                        if (axis.series.length) { // #4442\n                            if (others[key]) {\n                                hasOther = true; // #4201\n                            }\n                            else {\n                                others[key] = 1;\n                            }\n                        }\n                    });\n                }\n                return hasOther;\n            };\n            /**\n             * Find the max ticks of either the x and y axis collection, and record it\n             * in `this.tickAmount`.\n             *\n             * @private\n             * @function Highcharts.Axis#getTickAmount\n             */\n            Axis.prototype.getTickAmount = function () {\n                var axis = this,\n                    options = this.options,\n                    tickAmount = options.tickAmount,\n                    tickPixelInterval = options.tickPixelInterval;\n                if (!defined(options.tickInterval) &&\n                    !tickAmount && this.len < tickPixelInterval &&\n                    !this.isRadial &&\n                    !axis.logarithmic &&\n                    options.startOnTick &&\n                    options.endOnTick) {\n                    tickAmount = 2;\n                }\n                if (!tickAmount && this.alignToOthers()) {\n                    // Add 1 because 4 tick intervals require 5 ticks (including first\n                    // and last)\n                    tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n                }\n                // For tick amounts of 2 and 3, compute five ticks and remove the\n                // intermediate ones. This prevents the axis from adding ticks that are\n                // too far away from the data extremes.\n                if (tickAmount < 4) {\n                    this.finalTickAmt = tickAmount;\n                    tickAmount = 5;\n                }\n                this.tickAmount = tickAmount;\n            };\n            /**\n             * When using multiple axes, adjust the number of ticks to match the highest\n             * number of ticks in that group.\n             *\n             * @private\n             * @function Highcharts.Axis#adjustTickAmount\n             */\n            Axis.prototype.adjustTickAmount = function () {\n                var axis = this,\n                    axisOptions = axis.options,\n                    tickInterval = axis.tickInterval,\n                    tickPositions = axis.tickPositions,\n                    tickAmount = axis.tickAmount,\n                    finalTickAmt = axis.finalTickAmt,\n                    currentTickAmount = tickPositions && tickPositions.length,\n                    threshold = pick(axis.threshold,\n                    axis.softThreshold ? 0 : null),\n                    min,\n                    len,\n                    i;\n                if (axis.hasData()) {\n                    if (currentTickAmount < tickAmount) {\n                        min = axis.min;\n                        while (tickPositions.length < tickAmount) {\n                            // Extend evenly for both sides unless we're on the\n                            // threshold (#3965)\n                            if (tickPositions.length % 2 ||\n                                min === threshold) {\n                                // to the end\n                                tickPositions.push(correctFloat(tickPositions[tickPositions.length - 1] +\n                                    tickInterval));\n                            }\n                            else {\n                                // to the start\n                                tickPositions.unshift(correctFloat(tickPositions[0] - tickInterval));\n                            }\n                        }\n                        axis.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n                        // Do not crop when ticks are not extremes (#9841)\n                        axis.min = axisOptions.startOnTick ?\n                            tickPositions[0] :\n                            Math.min(axis.min, tickPositions[0]);\n                        axis.max = axisOptions.endOnTick ?\n                            tickPositions[tickPositions.length - 1] :\n                            Math.max(axis.max, tickPositions[tickPositions.length - 1]);\n                        // We have too many ticks, run second pass to try to reduce ticks\n                    }\n                    else if (currentTickAmount > tickAmount) {\n                        axis.tickInterval *= 2;\n                        axis.setTickPositions();\n                    }\n                    // The finalTickAmt property is set in getTickAmount\n                    if (defined(finalTickAmt)) {\n                        i = len = tickPositions.length;\n                        while (i--) {\n                            if (\n                            // Remove every other tick\n                            (finalTickAmt === 3 && i % 2 === 1) ||\n                                // Remove all but first and last\n                                (finalTickAmt <= 2 && i > 0 && i < len - 1)) {\n                                tickPositions.splice(i, 1);\n                            }\n                        }\n                        axis.finalTickAmt = void 0;\n                    }\n                }\n            };\n            /**\n             * Set the scale based on data min and max, user set min and max or options.\n             *\n             * @private\n             * @function Highcharts.Axis#setScale\n             *\n             * @fires Highcharts.Axis#event:afterSetScale\n             */\n            Axis.prototype.setScale = function () {\n                var axis = this,\n                    isDirtyAxisLength,\n                    isDirtyData = false,\n                    isXAxisDirty = false;\n                axis.series.forEach(function (series) {\n                    var _a;\n                    isDirtyData = isDirtyData || series.isDirtyData || series.isDirty;\n                    // When x axis is dirty, we need new data extremes for y as\n                    // well:\n                    isXAxisDirty = isXAxisDirty || ((_a = series.xAxis) === null || _a === void 0 ? void 0 : _a.isDirty) || false;\n                });\n                axis.oldMin = axis.min;\n                axis.oldMax = axis.max;\n                axis.oldAxisLength = axis.len;\n                // set the new axisLength\n                axis.setAxisSize();\n                isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n                // do we really need to go through all this?\n                if (isDirtyAxisLength ||\n                    isDirtyData ||\n                    isXAxisDirty ||\n                    axis.isLinked ||\n                    axis.forceRedraw ||\n                    axis.userMin !== axis.oldUserMin ||\n                    axis.userMax !== axis.oldUserMax ||\n                    axis.alignToOthers()) {\n                    if (axis.stacking) {\n                        axis.stacking.resetStacks();\n                    }\n                    axis.forceRedraw = false;\n                    // get data extremes if needed\n                    axis.getSeriesExtremes();\n                    // get fixed positions based on tickInterval\n                    axis.setTickInterval();\n                    // record old values to decide whether a rescale is necessary later\n                    // on (#540)\n                    axis.oldUserMin = axis.userMin;\n                    axis.oldUserMax = axis.userMax;\n                    // Mark as dirty if it is not already set to dirty and extremes have\n                    // changed. #595.\n                    if (!axis.isDirty) {\n                        axis.isDirty =\n                            isDirtyAxisLength ||\n                                axis.min !== axis.oldMin ||\n                                axis.max !== axis.oldMax;\n                    }\n                }\n                else if (axis.stacking) {\n                    axis.stacking.cleanStacks();\n                }\n                // Recalculate panning state object, when the data\n                // has changed. It is required when vertical panning is enabled.\n                if (isDirtyData && axis.panningState) {\n                    axis.panningState.isDirty = true;\n                }\n                fireEvent(this, 'afterSetScale');\n            };\n            /**\n             * Set the minimum and maximum of the axes after render time. If the\n             * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n             * values are rounded off to the nearest tick. To prevent this, these\n             * options can be set to false before calling setExtremes. Also, setExtremes\n             * will not allow a range lower than the `minRange` option, which by default\n             * is the range of five points.\n             *\n             * @sample highcharts/members/axis-setextremes/\n             *         Set extremes from a button\n             * @sample highcharts/members/axis-setextremes-datetime/\n             *         Set extremes on a datetime axis\n             * @sample highcharts/members/axis-setextremes-off-ticks/\n             *         Set extremes off ticks\n             * @sample stock/members/axis-setextremes/\n             *         Set extremes in Highstock\n             * @sample maps/members/axis-setextremes/\n             *         Set extremes in Highmaps\n             *\n             * @function Highcharts.Axis#setExtremes\n             *\n             * @param {number} [newMin]\n             *        The new minimum value.\n             *\n             * @param {number} [newMax]\n             *        The new maximum value.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call to\n             *        {@link Highcharts.Chart#redraw}\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Enable or modify animations.\n             *\n             * @param {*} [eventArguments]\n             *        Arguments to be accessed in event handler.\n             *\n             * @fires Highcharts.Axis#event:setExtremes\n             */\n            Axis.prototype.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {\n                var axis = this,\n                    chart = axis.chart;\n                redraw = pick(redraw, true); // defaults to true\n                axis.series.forEach(function (serie) {\n                    delete serie.kdTree;\n                });\n                // Extend the arguments with min and max\n                eventArguments = extend(eventArguments, {\n                    min: newMin,\n                    max: newMax\n                });\n                // Fire the event\n                fireEvent(axis, 'setExtremes', eventArguments, function () {\n                    axis.userMin = newMin;\n                    axis.userMax = newMax;\n                    axis.eventArgs = eventArguments;\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                });\n            };\n            /**\n             * Overridable method for zooming chart. Pulled out in a separate method to\n             * allow overriding in stock charts.\n             * @private\n             * @function Highcharts.Axis#zoom\n             *\n             * @param {number} newMin\n             * TO-DO: parameter description\n             *\n             * @param {number} newMax\n             * TO-DO: parameter description\n             *\n             * @return {boolean}\n             */\n            Axis.prototype.zoom = function (newMin, newMax) {\n                var axis = this,\n                    dataMin = this.dataMin,\n                    dataMax = this.dataMax,\n                    options = this.options,\n                    min = Math.min(dataMin,\n                    pick(options.min,\n                    dataMin)),\n                    max = Math.max(dataMax,\n                    pick(options.max,\n                    dataMax)),\n                    evt = {\n                        newMin: newMin,\n                        newMax: newMax\n                    };\n                fireEvent(this, 'zoom', evt, function (e) {\n                    // Use e.newMin and e.newMax - event handlers may have altered them\n                    var newMin = e.newMin,\n                        newMax = e.newMax;\n                    if (newMin !== axis.min || newMax !== axis.max) { // #5790\n                        // Prevent pinch zooming out of range. Check for defined is for\n                        // #1946. #1734.\n                        if (!axis.allowZoomOutside) {\n                            // #6014, sometimes newMax will be smaller than min (or\n                            // newMin will be larger than max).\n                            if (defined(dataMin)) {\n                                if (newMin < min) {\n                                    newMin = min;\n                                }\n                                if (newMin > max) {\n                                    newMin = max;\n                                }\n                            }\n                            if (defined(dataMax)) {\n                                if (newMax < min) {\n                                    newMax = min;\n                                }\n                                if (newMax > max) {\n                                    newMax = max;\n                                }\n                            }\n                        }\n                        // In full view, displaying the reset zoom button is not\n                        // required\n                        axis.displayBtn = (typeof newMin !== 'undefined' ||\n                            typeof newMax !== 'undefined');\n                        // Do it\n                        axis.setExtremes(newMin, newMax, false, void 0, { trigger: 'zoom' });\n                    }\n                    e.zoomed = true;\n                });\n                return evt.zoomed;\n            };\n            /**\n             * Update the axis metrics.\n             *\n             * @private\n             * @function Highcharts.Axis#setAxisSize\n             */\n            Axis.prototype.setAxisSize = function () {\n                var chart = this.chart,\n                    options = this.options, \n                    // [top, right, bottom, left]\n                    offsets = options.offsets || [0, 0, 0, 0],\n                    horiz = this.horiz, \n                    // Check for percentage based input values. Rounding fixes problems\n                    // with column overflow and plot line filtering (#4898, #4899)\n                    width = this.width = Math.round(relativeLength(pick(options.width,\n                    chart.plotWidth - offsets[3] + offsets[1]),\n                    chart.plotWidth)),\n                    height = this.height = Math.round(relativeLength(pick(options.height,\n                    chart.plotHeight - offsets[0] + offsets[2]),\n                    chart.plotHeight)),\n                    top = this.top = Math.round(relativeLength(pick(options.top,\n                    chart.plotTop + offsets[0]),\n                    chart.plotHeight,\n                    chart.plotTop)),\n                    left = this.left = Math.round(relativeLength(pick(options.left,\n                    chart.plotLeft + offsets[3]),\n                    chart.plotWidth,\n                    chart.plotLeft));\n                // Expose basic values to use in Series object and navigator\n                this.bottom = chart.chartHeight - height - top;\n                this.right = chart.chartWidth - width - left;\n                // Direction agnostic properties\n                this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n                this.pos = horiz ? left : top; // distance from SVG origin\n            };\n            /**\n             * Get the current extremes for the axis.\n             *\n             * @sample highcharts/members/axis-getextremes/\n             *         Report extremes by click on a button\n             * @sample maps/members/axis-getextremes/\n             *         Get extremes in Highmaps\n             *\n             * @function Highcharts.Axis#getExtremes\n             *\n             * @return {Highcharts.ExtremesObject}\n             * An object containing extremes information.\n             */\n            Axis.prototype.getExtremes = function () {\n                var axis = this;\n                var log = axis.logarithmic;\n                return {\n                    min: log ?\n                        correctFloat(log.lin2log(axis.min)) :\n                        axis.min,\n                    max: log ?\n                        correctFloat(log.lin2log(axis.max)) :\n                        axis.max,\n                    dataMin: axis.dataMin,\n                    dataMax: axis.dataMax,\n                    userMin: axis.userMin,\n                    userMax: axis.userMax\n                };\n            };\n            /**\n             * Get the zero plane either based on zero or on the min or max value.\n             * Used in bar and area plots.\n             *\n             * @function Highcharts.Axis#getThreshold\n             *\n             * @param {number} threshold\n             * The threshold in axis values.\n             *\n             * @return {number|undefined}\n             * The translated threshold position in terms of pixels, and corrected to\n             * stay within the axis bounds.\n             */\n            Axis.prototype.getThreshold = function (threshold) {\n                var axis = this,\n                    log = axis.logarithmic,\n                    realMin = log ? log.lin2log(axis.min) : axis.min,\n                    realMax = log ? log.lin2log(axis.max) : axis.max;\n                if (threshold === null || threshold === -Infinity) {\n                    threshold = realMin;\n                }\n                else if (threshold === Infinity) {\n                    threshold = realMax;\n                }\n                else if (realMin > threshold) {\n                    threshold = realMin;\n                }\n                else if (realMax < threshold) {\n                    threshold = realMax;\n                }\n                return axis.translate(threshold, 0, 1, 0, 1);\n            };\n            /**\n             * Compute auto alignment for the axis label based on which side the axis is\n             * on and the given rotation for the label.\n             *\n             * @private\n             * @function Highcharts.Axis#autoLabelAlign\n             *\n             * @param {number} rotation\n             * The rotation in degrees as set by either the `rotation` or `autoRotation`\n             * options.\n             *\n             * @return {Highcharts.AlignValue}\n             * Can be `\"center\"`, `\"left\"` or `\"right\"`.\n             */\n            Axis.prototype.autoLabelAlign = function (rotation) {\n                var angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360,\n                    evt = { align: 'center' };\n                fireEvent(this, 'autoLabelAlign', evt, function (e) {\n                    if (angle > 15 && angle < 165) {\n                        e.align = 'right';\n                    }\n                    else if (angle > 195 && angle < 345) {\n                        e.align = 'left';\n                    }\n                });\n                return evt.align;\n            };\n            /**\n             * Get the tick length and width for the axis based on axis options.\n             * @private\n             * @function Highcharts.Axis#tickSize\n             *\n             * @param {string} [prefix]\n             * 'tick' or 'minorTick'\n             *\n             * @return {Array<number,number>|undefined}\n             * An array of tickLength and tickWidth\n             */\n            Axis.prototype.tickSize = function (prefix) {\n                var options = this.options, tickLength = options[prefix === 'tick' ? 'tickLength' : 'minorTickLength'], tickWidth = pick(options[prefix === 'tick' ? 'tickWidth' : 'minorTickWidth'], \n                    // Default to 1 on linear and datetime X axes\n                    prefix === 'tick' && this.isXAxis && !this.categories ? 1 : 0), e, tickSize;\n                if (tickWidth && tickLength) {\n                    // Negate the length\n                    if (options[prefix + 'Position'] === 'inside') {\n                        tickLength = -tickLength;\n                    }\n                    tickSize = [tickLength, tickWidth];\n                }\n                e = { tickSize: tickSize };\n                fireEvent(this, 'afterTickSize', e);\n                return e.tickSize;\n            };\n            /**\n             * Return the size of the labels.\n             *\n             * @private\n             * @function Highcharts.Axis#labelMetrics\n             *\n             * @return {Highcharts.FontMetricsObject}\n             */\n            Axis.prototype.labelMetrics = function () {\n                var index = this.tickPositions && this.tickPositions[0] || 0;\n                return this.chart.renderer.fontMetrics(this.options.labels.style &&\n                    this.options.labels.style.fontSize, this.ticks[index] && this.ticks[index].label);\n            };\n            /**\n             * Prevent the ticks from getting so close we can't draw the labels. On a\n             * horizontal axis, this is handled by rotating the labels, removing ticks\n             * and adding ellipsis. On a vertical axis remove ticks and add ellipsis.\n             *\n             * @private\n             * @function Highcharts.Axis#unsquish\n             *\n             * @return {number}\n             */\n            Axis.prototype.unsquish = function () {\n                var labelOptions = this.options.labels,\n                    horiz = this.horiz,\n                    tickInterval = this.tickInterval,\n                    newTickInterval = tickInterval,\n                    slotSize = this.len / (((this.categories ? 1 : 0) +\n                        this.max -\n                        this.min) /\n                        tickInterval),\n                    rotation,\n                    rotationOption = labelOptions.rotation,\n                    labelMetrics = this.labelMetrics(),\n                    step,\n                    bestScore = Number.MAX_VALUE,\n                    autoRotation,\n                    range = this.max - this.min, \n                    // Return the multiple of tickInterval that is needed to avoid\n                    // collision\n                    getStep = function (spaceNeeded) {\n                        var step = spaceNeeded / (slotSize || 1);\n                    step = step > 1 ? Math.ceil(step) : 1;\n                    // Guard for very small or negative angles (#9835)\n                    if (step * tickInterval > range &&\n                        spaceNeeded !== Infinity &&\n                        slotSize !== Infinity &&\n                        range) {\n                        step = Math.ceil(range / tickInterval);\n                    }\n                    return correctFloat(step * tickInterval);\n                };\n                if (horiz) {\n                    autoRotation = !labelOptions.staggerLines &&\n                        !labelOptions.step &&\n                        ( // #3971\n                        defined(rotationOption) ?\n                            [rotationOption] :\n                            slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation);\n                    if (autoRotation) {\n                        // Loop over the given autoRotation options, and determine\n                        // which gives the best score. The best score is that with\n                        // the lowest number of steps and a rotation closest\n                        // to horizontal.\n                        autoRotation.forEach(function (rot) {\n                            var score;\n                            if (rot === rotationOption ||\n                                (rot && rot >= -90 && rot <= 90)) { // #3891\n                                step = getStep(Math.abs(labelMetrics.h / Math.sin(deg2rad * rot)));\n                                score = step + Math.abs(rot / 360);\n                                if (score < bestScore) {\n                                    bestScore = score;\n                                    rotation = rot;\n                                    newTickInterval = step;\n                                }\n                            }\n                        });\n                    }\n                }\n                else if (!labelOptions.step) { // #4411\n                    newTickInterval = getStep(labelMetrics.h);\n                }\n                this.autoRotation = autoRotation;\n                this.labelRotation = pick(rotation, rotationOption);\n                return newTickInterval;\n            };\n            /**\n             * Get the general slot width for labels/categories on this axis. This may\n             * change between the pre-render (from Axis.getOffset) and the final tick\n             * rendering and placement.\n             *\n             * @private\n             * @function Highcharts.Axis#getSlotWidth\n             *\n             * @param {Highcharts.Tick} [tick] Optionally, calculate the slot width\n             * basing on tick label. It is used in highcharts-3d module, where the slots\n             * has different widths depending on perspective angles.\n             *\n             * @return {number}\n             * The pixel width allocated to each axis label.\n             */\n            Axis.prototype.getSlotWidth = function (tick) {\n                var _a;\n                // #5086, #1580, #1931\n                var chart = this.chart,\n                    horiz = this.horiz,\n                    labelOptions = this.options.labels,\n                    slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n                    marginLeft = chart.margin[3];\n                // Used by grid axis\n                if (tick && isNumber(tick.slotWidth)) { // #13221, can be 0\n                    return tick.slotWidth;\n                }\n                if (horiz &&\n                    labelOptions &&\n                    (labelOptions.step || 0) < 2) {\n                    if (labelOptions.rotation) { // #4415\n                        return 0;\n                    }\n                    return ((this.staggerLines || 1) * this.len) / slotCount;\n                }\n                if (!horiz) {\n                    // #7028\n                    var cssWidth = (_a = labelOptions === null || labelOptions === void 0 ? void 0 : labelOptions.style) === null || _a === void 0 ? void 0 : _a.width;\n                    if (cssWidth !== void 0) {\n                        return parseInt(cssWidth, 10);\n                    }\n                    if (marginLeft) {\n                        return marginLeft - chart.spacing[3];\n                    }\n                }\n                // Last resort, a fraction of the available size\n                return chart.chartWidth * 0.33;\n            };\n            /**\n             * Render the axis labels and determine whether ellipsis or rotation need to\n             * be applied.\n             *\n             * @private\n             * @function Highcharts.Axis#renderUnsquish\n             */\n            Axis.prototype.renderUnsquish = function () {\n                var chart = this.chart,\n                    renderer = chart.renderer,\n                    tickPositions = this.tickPositions,\n                    ticks = this.ticks,\n                    labelOptions = this.options.labels,\n                    labelStyleOptions = (labelOptions && labelOptions.style || {}),\n                    horiz = this.horiz,\n                    slotWidth = this.getSlotWidth(),\n                    innerWidth = Math.max(1,\n                    Math.round(slotWidth - 2 * (labelOptions.padding || 5))),\n                    attr = {},\n                    labelMetrics = this.labelMetrics(),\n                    textOverflowOption = (labelOptions.style &&\n                        labelOptions.style.textOverflow),\n                    commonWidth,\n                    commonTextOverflow,\n                    maxLabelLength = 0,\n                    label,\n                    i,\n                    pos;\n                // Set rotation option unless it is \"auto\", like in gauges\n                if (!isString(labelOptions.rotation)) {\n                    // #4443:\n                    attr.rotation = labelOptions.rotation || 0;\n                }\n                // Get the longest label length\n                tickPositions.forEach(function (tick) {\n                    tick = ticks[tick];\n                    // Replace label - sorting animation\n                    if (tick.movedLabel) {\n                        tick.replaceMovedLabel();\n                    }\n                    if (tick &&\n                        tick.label &&\n                        tick.label.textPxLength > maxLabelLength) {\n                        maxLabelLength = tick.label.textPxLength;\n                    }\n                });\n                this.maxLabelLength = maxLabelLength;\n                // Handle auto rotation on horizontal axis\n                if (this.autoRotation) {\n                    // Apply rotation only if the label is too wide for the slot, and\n                    // the label is wider than its height.\n                    if (maxLabelLength > innerWidth &&\n                        maxLabelLength > labelMetrics.h) {\n                        attr.rotation = this.labelRotation;\n                    }\n                    else {\n                        this.labelRotation = 0;\n                    }\n                    // Handle word-wrap or ellipsis on vertical axis\n                }\n                else if (slotWidth) {\n                    // For word-wrap or ellipsis\n                    commonWidth = innerWidth;\n                    if (!textOverflowOption) {\n                        commonTextOverflow = 'clip';\n                        // On vertical axis, only allow word wrap if there is room\n                        // for more lines.\n                        i = tickPositions.length;\n                        while (!horiz && i--) {\n                            pos = tickPositions[i];\n                            label = ticks[pos].label;\n                            if (label) {\n                                // Reset ellipsis in order to get the correct\n                                // bounding box (#4070)\n                                if (label.styles &&\n                                    label.styles.textOverflow === 'ellipsis') {\n                                    label.css({ textOverflow: 'clip' });\n                                    // Set the correct width in order to read\n                                    // the bounding box height (#4678, #5034)\n                                }\n                                else if (label.textPxLength > slotWidth) {\n                                    label.css({ width: slotWidth + 'px' });\n                                }\n                                if (label.getBBox().height > (this.len / tickPositions.length -\n                                    (labelMetrics.h - labelMetrics.f))) {\n                                    label.specificTextOverflow = 'ellipsis';\n                                }\n                            }\n                        }\n                    }\n                }\n                // Add ellipsis if the label length is significantly longer than ideal\n                if (attr.rotation) {\n                    commonWidth = (maxLabelLength > chart.chartHeight * 0.5 ?\n                        chart.chartHeight * 0.33 :\n                        maxLabelLength);\n                    if (!textOverflowOption) {\n                        commonTextOverflow = 'ellipsis';\n                    }\n                }\n                // Set the explicit or automatic label alignment\n                this.labelAlign = labelOptions.align ||\n                    this.autoLabelAlign(this.labelRotation);\n                if (this.labelAlign) {\n                    attr.align = this.labelAlign;\n                }\n                // Apply general and specific CSS\n                tickPositions.forEach(function (pos) {\n                    var tick = ticks[pos],\n                        label = tick && tick.label,\n                        widthOption = labelStyleOptions.width,\n                        css = {};\n                    if (label) {\n                        // This needs to go before the CSS in old IE (#4502)\n                        label.attr(attr);\n                        if (tick.shortenLabel) {\n                            tick.shortenLabel();\n                        }\n                        else if (commonWidth &&\n                            !widthOption &&\n                            // Setting width in this case messes with the bounding box\n                            // (#7975)\n                            labelStyleOptions.whiteSpace !== 'nowrap' &&\n                            (\n                            // Speed optimizing, #7656\n                            commonWidth < label.textPxLength ||\n                                // Resetting CSS, #4928\n                                label.element.tagName === 'SPAN')) {\n                            css.width = commonWidth + 'px';\n                            if (!textOverflowOption) {\n                                css.textOverflow = (label.specificTextOverflow ||\n                                    commonTextOverflow);\n                            }\n                            label.css(css);\n                            // Reset previously shortened label (#8210)\n                        }\n                        else if (label.styles &&\n                            label.styles.width &&\n                            !css.width &&\n                            !widthOption) {\n                            label.css({ width: null });\n                        }\n                        delete label.specificTextOverflow;\n                        tick.rotation = attr.rotation;\n                    }\n                }, this);\n                // Note: Why is this not part of getLabelPosition?\n                this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n            };\n            /**\n             * Return true if the axis has associated data.\n             *\n             * @function Highcharts.Axis#hasData\n             *\n             * @return {boolean}\n             * True if the axis has associated visible series and those series have\n             * either valid data points or explicit `min` and `max` settings.\n             */\n            Axis.prototype.hasData = function () {\n                return this.series.some(function (s) {\n                    return s.hasData();\n                }) ||\n                    (this.options.showEmpty &&\n                        defined(this.min) &&\n                        defined(this.max));\n            };\n            /**\n             * Adds the title defined in axis.options.title.\n             *\n             * @function Highcharts.Axis#addTitle\n             *\n             * @param {boolean} [display]\n             * Whether or not to display the title.\n             */\n            Axis.prototype.addTitle = function (display) {\n                var axis = this,\n                    renderer = axis.chart.renderer,\n                    horiz = axis.horiz,\n                    opposite = axis.opposite,\n                    options = axis.options,\n                    axisTitleOptions = options.title,\n                    textAlign,\n                    styledMode = axis.chart.styledMode;\n                if (!axis.axisTitle) {\n                    textAlign = axisTitleOptions.textAlign;\n                    if (!textAlign) {\n                        textAlign = (horiz ? {\n                            low: 'left',\n                            middle: 'center',\n                            high: 'right'\n                        } : {\n                            low: opposite ? 'right' : 'left',\n                            middle: 'center',\n                            high: opposite ? 'left' : 'right'\n                        })[axisTitleOptions.align];\n                    }\n                    axis.axisTitle = renderer\n                        .text(axisTitleOptions.text, 0, 0, axisTitleOptions.useHTML)\n                        .attr({\n                        zIndex: 7,\n                        rotation: axisTitleOptions.rotation || 0,\n                        align: textAlign\n                    })\n                        .addClass('highcharts-axis-title');\n                    // #7814, don't mutate style option\n                    if (!styledMode) {\n                        axis.axisTitle.css(merge(axisTitleOptions.style));\n                    }\n                    axis.axisTitle.add(axis.axisGroup);\n                    axis.axisTitle.isNew = true;\n                }\n                // Max width defaults to the length of the axis\n                if (!styledMode &&\n                    !axisTitleOptions.style.width &&\n                    !axis.isRadial) {\n                    axis.axisTitle.css({\n                        width: axis.len + 'px'\n                    });\n                }\n                // hide or show the title depending on whether showEmpty is set\n                axis.axisTitle[display ? 'show' : 'hide'](display);\n            };\n            /**\n             * Generates a tick for initial positioning.\n             *\n             * @private\n             * @function Highcharts.Axis#generateTick\n             *\n             * @param {number} pos\n             * The tick position in axis values.\n             *\n             * @param {number} [i]\n             * The index of the tick in {@link Axis.tickPositions}.\n             */\n            Axis.prototype.generateTick = function (pos) {\n                var axis = this;\n                var ticks = axis.ticks;\n                if (!ticks[pos]) {\n                    ticks[pos] = new Tick(axis, pos);\n                }\n                else {\n                    ticks[pos].addLabel(); // update labels depending on tick interval\n                }\n            };\n            /**\n             * Render the tick labels to a preliminary position to get their sizes\n             *\n             * @private\n             * @function Highcharts.Axis#getOffset\n             *\n             * @fires Highcharts.Axis#event:afterGetOffset\n             */\n            Axis.prototype.getOffset = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    tickPositions = axis.tickPositions,\n                    ticks = axis.ticks,\n                    horiz = axis.horiz,\n                    side = axis.side,\n                    invertedSide = chart.inverted &&\n                        !axis.isZAxis ? [1, 0, 3, 2][side] : side,\n                    hasData,\n                    showAxis,\n                    titleOffset = 0,\n                    titleOffsetOption,\n                    titleMargin = 0,\n                    axisTitleOptions = options.title,\n                    labelOptions = options.labels,\n                    labelOffset = 0, // reset\n                    labelOffsetPadded,\n                    axisOffset = chart.axisOffset,\n                    clipOffset = chart.clipOffset,\n                    clip,\n                    directionFactor = [-1, 1, 1, -1][side],\n                    className = options.className,\n                    axisParent = axis.axisParent, // Used in color axis\n                    lineHeightCorrection;\n                // For reuse in Axis.render\n                hasData = axis.hasData();\n                axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n                // Set/reset staggerLines\n                axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n                // Create the axisGroup and gridGroup elements on first iteration\n                if (!axis.axisGroup) {\n                    axis.gridGroup = renderer.g('grid')\n                        .attr({ zIndex: options.gridZIndex || 1 })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + '-grid ' +\n                        (className || ''))\n                        .add(axisParent);\n                    axis.axisGroup = renderer.g('axis')\n                        .attr({ zIndex: options.zIndex || 2 })\n                        .addClass('highcharts-' + this.coll.toLowerCase() + ' ' +\n                        (className || ''))\n                        .add(axisParent);\n                    axis.labelGroup = renderer.g('axis-labels')\n                        .attr({ zIndex: labelOptions.zIndex || 7 })\n                        .addClass('highcharts-' + axis.coll.toLowerCase() + '-labels ' +\n                        (className || ''))\n                        .add(axisParent);\n                }\n                if (hasData || axis.isLinked) {\n                    // Generate ticks\n                    tickPositions.forEach(function (pos, i) {\n                        // i is not used here, but may be used in overrides\n                        axis.generateTick(pos, i);\n                    });\n                    axis.renderUnsquish();\n                    // Left side must be align: right and right side must\n                    // have align: left for labels\n                    axis.reserveSpaceDefault = (side === 0 ||\n                        side === 2 ||\n                        { 1: 'left', 3: 'right' }[side] === axis.labelAlign);\n                    if (pick(labelOptions.reserveSpace, axis.labelAlign === 'center' ? true : null, axis.reserveSpaceDefault)) {\n                        tickPositions.forEach(function (pos) {\n                            // get the highest offset\n                            labelOffset = Math.max(ticks[pos].getLabelSize(), labelOffset);\n                        });\n                    }\n                    if (axis.staggerLines) {\n                        labelOffset *= axis.staggerLines;\n                    }\n                    axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n                }\n                else { // doesn't have data\n                    objectEach(ticks, function (tick, n) {\n                        tick.destroy();\n                        delete ticks[n];\n                    });\n                }\n                if (axisTitleOptions &&\n                    axisTitleOptions.text &&\n                    axisTitleOptions.enabled !== false) {\n                    axis.addTitle(showAxis);\n                    if (showAxis && axisTitleOptions.reserveSpace !== false) {\n                        axis.titleOffset = titleOffset =\n                            axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n                        titleOffsetOption = axisTitleOptions.offset;\n                        titleMargin = defined(titleOffsetOption) ?\n                            0 :\n                            pick(axisTitleOptions.margin, horiz ? 5 : 10);\n                    }\n                }\n                // Render the axis line\n                axis.renderLine();\n                // handle automatic or user set offset\n                axis.offset = directionFactor * pick(options.offset, axisOffset[side] ? axisOffset[side] + (options.margin || 0) : 0);\n                axis.tickRotCorr = axis.tickRotCorr || { x: 0, y: 0 }; // polar\n                if (side === 0) {\n                    lineHeightCorrection = -axis.labelMetrics().h;\n                }\n                else if (side === 2) {\n                    lineHeightCorrection = axis.tickRotCorr.y;\n                }\n                else {\n                    lineHeightCorrection = 0;\n                }\n                // Find the padded label offset\n                labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n                if (labelOffset) {\n                    labelOffsetPadded -= lineHeightCorrection;\n                    labelOffsetPadded += directionFactor * (horiz ?\n                        pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) :\n                        labelOptions.x);\n                }\n                axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n                if (axis.getMaxLabelDimensions) {\n                    axis.maxLabelDimensions = axis.getMaxLabelDimensions(ticks, tickPositions);\n                }\n                // Due to GridAxis.tickSize, tickSize should be calculated after ticks\n                // has rendered.\n                var tickSize = this.tickSize('tick');\n                axisOffset[side] = Math.max(axisOffset[side], axis.axisTitleMargin + titleOffset +\n                    directionFactor * axis.offset, labelOffsetPadded, // #3027\n                tickPositions && tickPositions.length && tickSize ?\n                    tickSize[0] + directionFactor * axis.offset :\n                    0 // #4866\n                );\n                // Decide the clipping needed to keep the graph inside\n                // the plot area and axis lines\n                clip = options.offset ?\n                    0 :\n                    // #4308, #4371:\n                    Math.floor(axis.axisLine.strokeWidth() / 2) * 2;\n                clipOffset[invertedSide] =\n                    Math.max(clipOffset[invertedSide], clip);\n                fireEvent(this, 'afterGetOffset');\n            };\n            /**\n             * Internal function to get the path for the axis line. Extended for polar\n             * charts.\n             *\n             * @function Highcharts.Axis#getLinePath\n             *\n             * @param {number} lineWidth\n             * The line width in pixels.\n             *\n             * @return {Highcharts.SVGPathArray}\n             * The SVG path definition in array form.\n             */\n            Axis.prototype.getLinePath = function (lineWidth) {\n                var chart = this.chart,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    horiz = this.horiz,\n                    lineLeft = this.left + (opposite ? this.width : 0) + offset,\n                    lineTop = chart.chartHeight - this.bottom -\n                        (opposite ? this.height : 0) + offset;\n                if (opposite) {\n                    lineWidth *= -1; // crispify the other way - #1480, #1687\n                }\n                return chart.renderer\n                    .crispLine([\n                    [\n                        'M',\n                        horiz ?\n                            this.left :\n                            lineLeft,\n                        horiz ?\n                            lineTop :\n                            this.top\n                    ],\n                    [\n                        'L',\n                        horiz ?\n                            chart.chartWidth - this.right :\n                            lineLeft,\n                        horiz ?\n                            lineTop :\n                            chart.chartHeight - this.bottom\n                    ]\n                ], lineWidth);\n            };\n            /**\n             * Render the axis line. Called internally when rendering and redrawing the\n             * axis.\n             *\n             * @function Highcharts.Axis#renderLine\n             */\n            Axis.prototype.renderLine = function () {\n                if (!this.axisLine) {\n                    this.axisLine = this.chart.renderer.path()\n                        .addClass('highcharts-axis-line')\n                        .add(this.axisGroup);\n                    if (!this.chart.styledMode) {\n                        this.axisLine.attr({\n                            stroke: this.options.lineColor,\n                            'stroke-width': this.options.lineWidth,\n                            zIndex: 7\n                        });\n                    }\n                }\n            };\n            /**\n             * Position the axis title.\n             *\n             * @private\n             * @function Highcharts.Axis#getTitlePosition\n             *\n             * @return {Highcharts.PositionObject}\n             * X and Y positions for the title.\n             */\n            Axis.prototype.getTitlePosition = function () {\n                // compute anchor points for each of the title align options\n                var horiz = this.horiz,\n                    axisLeft = this.left,\n                    axisTop = this.top,\n                    axisLength = this.len,\n                    axisTitleOptions = this.options.title,\n                    margin = horiz ? axisLeft : axisTop,\n                    opposite = this.opposite,\n                    offset = this.offset,\n                    xOption = axisTitleOptions.x || 0,\n                    yOption = axisTitleOptions.y || 0,\n                    axisTitle = this.axisTitle,\n                    fontMetrics = this.chart.renderer.fontMetrics(axisTitleOptions.style &&\n                        axisTitleOptions.style.fontSize,\n                    axisTitle), \n                    // The part of a multiline text that is below the baseline of the\n                    // first line. Subtract 1 to preserve pixel-perfectness from the\n                    // old behaviour (v5.0.12), where only one line was allowed.\n                    textHeightOvershoot = Math.max(axisTitle.getBBox(null, 0).height - fontMetrics.h - 1, 0), \n                    // the position in the length direction of the axis\n                    alongAxis = {\n                        low: margin + (horiz ? 0 : axisLength),\n                        middle: margin + axisLength / 2,\n                        high: margin + (horiz ? axisLength : 0)\n                    }[axisTitleOptions.align], \n                    // the position in the perpendicular direction of the axis\n                    offAxis = (horiz ? axisTop + this.height : axisLeft) +\n                        (horiz ? 1 : -1) * // horizontal axis reverses the margin\n                            (opposite ? -1 : 1) * // so does opposite axes\n                            this.axisTitleMargin +\n                        [\n                            -textHeightOvershoot,\n                            textHeightOvershoot,\n                            fontMetrics.f,\n                            -textHeightOvershoot // left\n                        ][this.side],\n                    titlePosition = {\n                        x: horiz ?\n                            alongAxis + xOption :\n                            offAxis + (opposite ? this.width : 0) + offset + xOption,\n                        y: horiz ?\n                            offAxis + yOption - (opposite ? this.height : 0) + offset :\n                            alongAxis + yOption\n                    };\n                fireEvent(this, 'afterGetTitlePosition', { titlePosition: titlePosition });\n                return titlePosition;\n            };\n            /**\n             * Render a minor tick into the given position. If a minor tick already\n             * exists in this position, move it.\n             *\n             * @function Highcharts.Axis#renderMinorTick\n             *\n             * @param {number} pos\n             * The position in axis values.\n             */\n            Axis.prototype.renderMinorTick = function (pos) {\n                var axis = this;\n                var slideInTicks = axis.chart.hasRendered && isNumber(axis.oldMin);\n                var minorTicks = axis.minorTicks;\n                if (!minorTicks[pos]) {\n                    minorTicks[pos] = new Tick(axis, pos, 'minor');\n                }\n                // Render new ticks in old position\n                if (slideInTicks && minorTicks[pos].isNew) {\n                    minorTicks[pos].render(null, true);\n                }\n                minorTicks[pos].render(null, false, 1);\n            };\n            /**\n             * Render a major tick into the given position. If a tick already exists\n             * in this position, move it.\n             *\n             * @function Highcharts.Axis#renderTick\n             *\n             * @param {number} pos\n             * The position in axis values.\n             *\n             * @param {number} i\n             * The tick index.\n             */\n            Axis.prototype.renderTick = function (pos, i) {\n                var axis = this;\n                var isLinked = axis.isLinked;\n                var ticks = axis.ticks;\n                var slideInTicks = axis.chart.hasRendered && isNumber(axis.oldMin);\n                // Linked axes need an extra check to find out if\n                if (!isLinked ||\n                    (pos >= axis.min && pos <= axis.max)) {\n                    if (!ticks[pos]) {\n                        ticks[pos] = new Tick(axis, pos);\n                    }\n                    // NOTE this seems like overkill. Could be handled in tick.render by\n                    // setting old position in attr, then set new position in animate.\n                    // render new ticks in old position\n                    if (slideInTicks && ticks[pos].isNew) {\n                        // Start with negative opacity so that it is visible from\n                        // halfway into the animation\n                        ticks[pos].render(i, true, -1);\n                    }\n                    ticks[pos].render(i);\n                }\n            };\n            /**\n             * Render the axis.\n             *\n             * @private\n             * @function Highcharts.Axis#render\n             *\n             * @fires Highcharts.Axis#event:afterRender\n             */\n            Axis.prototype.render = function () {\n                var axis = this,\n                    chart = axis.chart,\n                    log = axis.logarithmic,\n                    renderer = chart.renderer,\n                    options = axis.options,\n                    isLinked = axis.isLinked,\n                    tickPositions = axis.tickPositions,\n                    axisTitle = axis.axisTitle,\n                    ticks = axis.ticks,\n                    minorTicks = axis.minorTicks,\n                    alternateBands = axis.alternateBands,\n                    stackLabelOptions = options.stackLabels,\n                    alternateGridColor = options.alternateGridColor,\n                    tickmarkOffset = axis.tickmarkOffset,\n                    axisLine = axis.axisLine,\n                    showAxis = axis.showAxis,\n                    animation = animObject(renderer.globalAnimation),\n                    from,\n                    to;\n                // Reset\n                axis.labelEdge.length = 0;\n                axis.overlap = false;\n                // Mark all elements inActive before we go over and mark the active ones\n                [ticks, minorTicks, alternateBands].forEach(function (coll) {\n                    objectEach(coll, function (tick) {\n                        tick.isActive = false;\n                    });\n                });\n                // If the series has data draw the ticks. Else only the line and title\n                if (axis.hasData() || isLinked) {\n                    // minor ticks\n                    if (axis.minorTickInterval && !axis.categories) {\n                        axis.getMinorTickPositions().forEach(function (pos) {\n                            axis.renderMinorTick(pos);\n                        });\n                    }\n                    // Major ticks. Pull out the first item and render it last so that\n                    // we can get the position of the neighbour label. #808.\n                    if (tickPositions.length) { // #1300\n                        tickPositions.forEach(function (pos, i) {\n                            axis.renderTick(pos, i);\n                        });\n                        // In a categorized axis, the tick marks are displayed\n                        // between labels. So we need to add a tick mark and\n                        // grid line at the left edge of the X axis.\n                        if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n                            if (!ticks[-1]) {\n                                ticks[-1] = new Tick(axis, -1, null, true);\n                            }\n                            ticks[-1].render(-1);\n                        }\n                    }\n                    // alternate grid color\n                    if (alternateGridColor) {\n                        tickPositions.forEach(function (pos, i) {\n                            to = typeof tickPositions[i + 1] !== 'undefined' ?\n                                tickPositions[i + 1] + tickmarkOffset :\n                                axis.max - tickmarkOffset;\n                            if (i % 2 === 0 &&\n                                pos < axis.max &&\n                                to <= axis.max + (chart.polar ?\n                                    -tickmarkOffset :\n                                    tickmarkOffset)) { // #2248, #4660\n                                if (!alternateBands[pos]) {\n                                    // Should be imported from PlotLineOrBand.js, but\n                                    // the dependency cycle with axis is a problem\n                                    alternateBands[pos] = new H.PlotLineOrBand(axis);\n                                }\n                                from = pos + tickmarkOffset; // #949\n                                alternateBands[pos].options = {\n                                    from: log ? log.lin2log(from) : from,\n                                    to: log ? log.lin2log(to) : to,\n                                    color: alternateGridColor,\n                                    className: 'highcharts-alternate-grid'\n                                };\n                                alternateBands[pos].render();\n                                alternateBands[pos].isActive = true;\n                            }\n                        });\n                    }\n                    // custom plot lines and bands\n                    if (!axis._addedPlotLB) { // only first time\n                        (options.plotLines || [])\n                            .concat(options.plotBands || [])\n                            .forEach(function (plotLineOptions) {\n                            axis.addPlotBandOrLine(plotLineOptions);\n                        });\n                        axis._addedPlotLB = true;\n                    }\n                } // end if hasData\n                // Remove inactive ticks\n                [ticks, minorTicks, alternateBands].forEach(function (coll) {\n                    var i,\n                        forDestruction = [],\n                        delay = animation.duration,\n                        destroyInactiveItems = function () {\n                            i = forDestruction.length;\n                        while (i--) {\n                            // When resizing rapidly, the same items\n                            // may be destroyed in different timeouts,\n                            // or the may be reactivated\n                            if (coll[forDestruction[i]] &&\n                                !coll[forDestruction[i]].isActive) {\n                                coll[forDestruction[i]].destroy();\n                                delete coll[forDestruction[i]];\n                            }\n                        }\n                    };\n                    objectEach(coll, function (tick, pos) {\n                        if (!tick.isActive) {\n                            // Render to zero opacity\n                            tick.render(pos, false, 0);\n                            tick.isActive = false;\n                            forDestruction.push(pos);\n                        }\n                    });\n                    // When the objects are finished fading out, destroy them\n                    syncTimeout(destroyInactiveItems, coll === alternateBands ||\n                        !chart.hasRendered ||\n                        !delay ?\n                        0 :\n                        delay);\n                });\n                // Set the axis line path\n                if (axisLine) {\n                    axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n                        d: this.getLinePath(axisLine.strokeWidth())\n                    });\n                    axisLine.isPlaced = true;\n                    // Show or hide the line depending on options.showEmpty\n                    axisLine[showAxis ? 'show' : 'hide'](showAxis);\n                }\n                if (axisTitle && showAxis) {\n                    var titleXy = axis.getTitlePosition();\n                    if (isNumber(titleXy.y)) {\n                        axisTitle[axisTitle.isNew ? 'attr' : 'animate'](titleXy);\n                        axisTitle.isNew = false;\n                    }\n                    else {\n                        axisTitle.attr('y', -9999);\n                        axisTitle.isNew = true;\n                    }\n                }\n                // Stacked totals:\n                if (stackLabelOptions && stackLabelOptions.enabled && axis.stacking) {\n                    axis.stacking.renderStackTotals();\n                }\n                // End stacked totals\n                axis.isDirty = false;\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Redraw the axis to reflect changes in the data or axis extremes. Called\n             * internally from Highcharts.Chart#redraw.\n             *\n             * @private\n             * @function Highcharts.Axis#redraw\n             */\n            Axis.prototype.redraw = function () {\n                if (this.visible) {\n                    // render the axis\n                    this.render();\n                    // move plot lines and bands\n                    this.plotLinesAndBands.forEach(function (plotLine) {\n                        plotLine.render();\n                    });\n                }\n                // mark associated series as dirty and ready for redraw\n                this.series.forEach(function (series) {\n                    series.isDirty = true;\n                });\n            };\n            /**\n             * Returns an array of axis properties, that should be untouched during\n             * reinitialization.\n             *\n             * @private\n             * @function Highcharts.Axis#getKeepProps\n             *\n             * @return {Array<string>}\n             */\n            Axis.prototype.getKeepProps = function () {\n                return (this.keepProps || Axis.keepProps);\n            };\n            /**\n             * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n             * to fully remove the axis.\n             *\n             * @private\n             * @function Highcharts.Axis#destroy\n             *\n             * @param {boolean} [keepEvents]\n             * Whether to preserve events, used internally in Axis.update.\n             */\n            Axis.prototype.destroy = function (keepEvents) {\n                var axis = this,\n                    plotLinesAndBands = axis.plotLinesAndBands,\n                    plotGroup,\n                    i;\n                fireEvent(this, 'destroy', { keepEvents: keepEvents });\n                // Remove the events\n                if (!keepEvents) {\n                    removeEvent(axis);\n                }\n                // Destroy collections\n                [axis.ticks, axis.minorTicks, axis.alternateBands].forEach(function (coll) {\n                    destroyObjectProperties(coll);\n                });\n                if (plotLinesAndBands) {\n                    i = plotLinesAndBands.length;\n                    while (i--) { // #1975\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                // Destroy elements\n                ['axisLine', 'axisTitle', 'axisGroup',\n                    'gridGroup', 'labelGroup', 'cross', 'scrollbar'].forEach(function (prop) {\n                    if (axis[prop]) {\n                        axis[prop] = axis[prop].destroy();\n                    }\n                });\n                // Destroy each generated group for plotlines and plotbands\n                for (plotGroup in axis.plotLinesAndBandsGroups) { // eslint-disable-line guard-for-in\n                    axis.plotLinesAndBandsGroups[plotGroup] =\n                        axis.plotLinesAndBandsGroups[plotGroup].destroy();\n                }\n                // Delete all properties and fall back to the prototype.\n                objectEach(axis, function (val, key) {\n                    if (axis.getKeepProps().indexOf(key) === -1) {\n                        delete axis[key];\n                    }\n                });\n            };\n            /**\n             * Internal function to draw a crosshair.\n             *\n             * @function Highcharts.Axis#drawCrosshair\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             * The event arguments from the modified pointer event, extended with\n             * `chartX` and `chartY`\n             *\n             * @param {Highcharts.Point} [point]\n             * The Point object if the crosshair snaps to points.\n             *\n             * @fires Highcharts.Axis#event:afterDrawCrosshair\n             * @fires Highcharts.Axis#event:drawCrosshair\n             */\n            Axis.prototype.drawCrosshair = function (e, point) {\n                var path,\n                    options = this.crosshair,\n                    snap = pick(options.snap,\n                    true),\n                    pos,\n                    categorized,\n                    graphic = this.cross,\n                    crossOptions,\n                    chart = this.chart;\n                fireEvent(this, 'drawCrosshair', { e: e, point: point });\n                // Use last available event when updating non-snapped crosshairs without\n                // mouse interaction (#5287)\n                if (!e) {\n                    e = this.cross && this.cross.e;\n                }\n                if (\n                // Disabled in options\n                !this.crosshair ||\n                    // Snap\n                    ((defined(point) || !snap) === false)) {\n                    this.hideCrosshair();\n                }\n                else {\n                    // Get the path\n                    if (!snap) {\n                        pos = e &&\n                            (this.horiz ?\n                                e.chartX - this.pos :\n                                this.len - e.chartY + this.pos);\n                    }\n                    else if (defined(point)) {\n                        // #3834\n                        pos = pick(this.coll !== 'colorAxis' ?\n                            point.crosshairPos : // 3D axis extension\n                            null, this.isXAxis ?\n                            point.plotX :\n                            this.len - point.plotY);\n                    }\n                    if (defined(pos)) {\n                        crossOptions = {\n                            // value, only used on radial\n                            value: point && (this.isXAxis ?\n                                point.x :\n                                pick(point.stackY, point.y)),\n                            translatedValue: pos\n                        };\n                        if (chart.polar) {\n                            // Additional information required for crosshairs in\n                            // polar chart\n                            extend(crossOptions, {\n                                isCrosshair: true,\n                                chartX: e && e.chartX,\n                                chartY: e && e.chartY,\n                                point: point\n                            });\n                        }\n                        path = this.getPlotLinePath(crossOptions) ||\n                            null; // #3189\n                    }\n                    if (!defined(path)) {\n                        this.hideCrosshair();\n                        return;\n                    }\n                    categorized = this.categories && !this.isRadial;\n                    // Draw the cross\n                    if (!graphic) {\n                        this.cross = graphic = chart.renderer\n                            .path()\n                            .addClass('highcharts-crosshair highcharts-crosshair-' +\n                            (categorized ? 'category ' : 'thin ') +\n                            options.className)\n                            .attr({\n                            zIndex: pick(options.zIndex, 2)\n                        })\n                            .add();\n                        // Presentational attributes\n                        if (!chart.styledMode) {\n                            graphic.attr({\n                                stroke: options.color ||\n                                    (categorized ?\n                                        Color\n                                            .parse('#ccd6eb')\n                                            .setOpacity(0.25)\n                                            .get() :\n                                        '#cccccc'),\n                                'stroke-width': pick(options.width, 1)\n                            }).css({\n                                'pointer-events': 'none'\n                            });\n                            if (options.dashStyle) {\n                                graphic.attr({\n                                    dashstyle: options.dashStyle\n                                });\n                            }\n                        }\n                    }\n                    graphic.show().attr({\n                        d: path\n                    });\n                    if (categorized && !options.width) {\n                        graphic.attr({\n                            'stroke-width': this.transA\n                        });\n                    }\n                    this.cross.e = e;\n                }\n                fireEvent(this, 'afterDrawCrosshair', { e: e, point: point });\n            };\n            /**\n             * Hide the crosshair if visible.\n             *\n             * @function Highcharts.Axis#hideCrosshair\n             */\n            Axis.prototype.hideCrosshair = function () {\n                if (this.cross) {\n                    this.cross.hide();\n                }\n                fireEvent(this, 'afterHideCrosshair');\n            };\n            /**\n            * Check whether the chart has vertical panning ('y' or 'xy' type).\n            *\n            * @private\n            * @function Highcharts.Axis#hasVerticalPanning\n            * @return {boolean}\n            *\n            */\n            Axis.prototype.hasVerticalPanning = function () {\n                var _a,\n                    _b;\n                return /y/.test(((_b = (_a = this.chart.options.chart) === null || _a === void 0 ? void 0 : _a.panning) === null || _b === void 0 ? void 0 : _b.type) || '');\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            /**\n             * The X axis or category axis. Normally this is the horizontal axis,\n             * though if the chart is inverted this is the vertical axis. In case of\n             * multiple axes, the xAxis node is an array of configuration objects.\n             *\n             * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @productdesc {highmaps}\n             * In Highmaps, the axis is hidden, but it is used behind the scenes to\n             * control features like zooming and panning. Zooming is in effect the same\n             * as setting the extremes of one of the exes.\n             *\n             * @type         {*|Array<*>}\n             * @optionparent xAxis\n             *\n             * @private\n             */\n            Axis.defaultOptions = {\n                /**\n                 * When using multiple axis, the ticks of two or more opposite axes\n                 * will automatically be aligned by adding ticks to the axis or axes\n                 * with the least ticks, as if `tickAmount` were specified.\n                 *\n                 * This can be prevented by setting `alignTicks` to false. If the grid\n                 * lines look messy, it's a good idea to hide them for the secondary\n                 * axis by setting `gridLineWidth` to 0.\n                 *\n                 * If `startOnTick` or `endOnTick` in an Axis options are set to false,\n                 * then the `alignTicks ` will be disabled for the Axis.\n                 *\n                 * Disabled for logarithmic axes.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.alignTicks\n                 */\n                /**\n                 * Whether to allow decimals in this axis' ticks. When counting\n                 * integers, like persons or hits on a web page, decimals should\n                 * be avoided in the labels.\n                 *\n                 * @see [minTickInterval](#xAxis.minTickInterval)\n                 *\n                 * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-true/\n                 *         True by default\n                 * @sample {highcharts|highstock} highcharts/yaxis/allowdecimals-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.0\n                 * @apioption xAxis.allowDecimals\n                 */\n                /**\n                 * When using an alternate grid color, a band is painted across the\n                 * plot area between every other grid line.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/alternategridcolor/\n                 *         Alternate grid color on the Y axis\n                 * @sample {highstock} stock/xaxis/alternategridcolor/\n                 *         Alternate grid color on the Y axis\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @apioption xAxis.alternateGridColor\n                 */\n                /**\n                 * An array defining breaks in the axis, the sections defined will be\n                 * left out and all the points shifted closer to each other.\n                 *\n                 * @productdesc {highcharts}\n                 * Requires that the broken-axis.js module is loaded.\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-simple/\n                 *         Simple break\n                 * @sample {highcharts|highstock} highcharts/axisbreak/break-visualized/\n                 *         Advanced with callback\n                 * @sample {highstock} stock/demo/intraday-breaks/\n                 *         Break on nights and weekends\n                 *\n                 * @type      {Array<*>}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks\n                 */\n                /**\n                 * A number indicating how much space should be left between the start\n                 * and the end of the break. The break size is given in axis units,\n                 * so for instance on a `datetime` axis, a break size of 3600000 would\n                 * indicate the equivalent of an hour.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.breakSize\n                 */\n                /**\n                 * The point where the break starts.\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.from\n                 */\n                /**\n                 * Defines an interval after which the break appears again. By default\n                 * the breaks do not repeat.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.repeat\n                 */\n                /**\n                 * The point where the break ends.\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.breaks.to\n                 */\n                /**\n                 * If categories are present for the xAxis, names are used instead of\n                 * numbers for that axis.\n                 *\n                 * Since Highcharts 3.0, categories can also\n                 * be extracted by giving each point a [name](#series.data) and setting\n                 * axis [type](#xAxis.type) to `category`. However, if you have multiple\n                 * series, best practice remains defining the `categories` array.\n                 *\n                 * Example: `categories: ['Apples', 'Bananas', 'Oranges']`\n                 *\n                 * @sample {highcharts} highcharts/demo/line-labels/\n                 *         With\n                 * @sample {highcharts} highcharts/xaxis/categories/\n                 *         Without\n                 *\n                 * @type      {Array<string>}\n                 * @product   highcharts gantt\n                 * @apioption xAxis.categories\n                 */\n                /**\n                 * The highest allowed value for automatically computed axis extremes.\n                 *\n                 * @see [floor](#xAxis.floor)\n                 *\n                 * @sample {highcharts|highstock} highcharts/yaxis/floor-ceiling/\n                 *         Floor and ceiling\n                 *\n                 * @type       {number}\n                 * @since      4.0\n                 * @product    highcharts highstock gantt\n                 * @apioption  xAxis.ceiling\n                 */\n                /**\n                 * A class name that opens for styling the axis by CSS, especially in\n                 * Highcharts styled mode. The class name is applied to group elements\n                 * for the grid, axis elements and labels.\n                 *\n                 * @sample {highcharts|highstock|highmaps} highcharts/css/axis/\n                 *         Multiple axes with separate styling\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption xAxis.className\n                 */\n                /**\n                 * Configure a crosshair that follows either the mouse pointer or the\n                 * hovered point.\n                 *\n                 * In styled mode, the crosshairs are styled in the\n                 * `.highcharts-crosshair`, `.highcharts-crosshair-thin` or\n                 * `.highcharts-xaxis-category` classes.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, by default, the crosshair is enabled on the X axis and\n                 * disabled on the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/crosshair-both/\n                 *         Crosshair on both axes\n                 * @sample {highstock} stock/xaxis/crosshairs-xy/\n                 *         Crosshair on both axes\n                 * @sample {highmaps} highcharts/xaxis/crosshair-both/\n                 *         Crosshair on both axes\n                 *\n                 * @declare   Highcharts.AxisCrosshairOptions\n                 * @type      {boolean|*}\n                 * @default   false\n                 * @since     4.1\n                 * @apioption xAxis.crosshair\n                 */\n                /**\n                 * A class name for the crosshair, especially as a hook for styling.\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption xAxis.crosshair.className\n                 */\n                /**\n                 * The color of the crosshair. Defaults to `#cccccc` for numeric and\n                 * datetime axes, and `rgba(204,214,235,0.25)` for category axes, where\n                 * the crosshair by default highlights the whole category.\n                 *\n                 * @sample {highcharts|highstock|highmaps} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #cccccc\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.color\n                 */\n                /**\n                 * The dash style for the crosshair. See\n                 * [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n                 * for possible values.\n                 *\n                 * @sample {highcharts|highmaps} highcharts/xaxis/crosshair-dotted/\n                 *         Dotted crosshair\n                 * @sample {highstock} stock/xaxis/crosshair-dashed/\n                 *         Dashed X axis crosshair\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.dashStyle\n                 */\n                /**\n                 * A label on the axis next to the crosshair.\n                 *\n                 * In styled mode, the label is styled with the\n                 * `.highcharts-crosshair-label` class.\n                 *\n                 * @sample {highstock} stock/xaxis/crosshair-label/\n                 *         Crosshair labels\n                 * @sample {highstock} highcharts/css/crosshair-label/\n                 *         Style mode\n                 *\n                 * @declare   Highcharts.AxisCrosshairLabelOptions\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label\n                 */\n                /**\n                 * Alignment of the label compared to the axis. Defaults to `\"left\"` for\n                 * right-side axes, `\"right\"` for left-side axes and `\"center\"` for\n                 * horizontal axes.\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.align\n                 */\n                /**\n                 * The background color for the label. Defaults to the related series\n                 * color, or `#666666` if that is not available.\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.backgroundColor\n                 */\n                /**\n                 * The border color for the crosshair label\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderColor\n                 */\n                /**\n                 * The border corner radius of the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   3\n                 * @since     2.1.10\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderRadius\n                 */\n                /**\n                 * The border width for the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.borderWidth\n                 */\n                /**\n                 * Flag to enable crosshair's label.\n                 *\n                 * @sample {highstock} stock/xaxis/crosshairs-xy/\n                 *         Enabled label for yAxis' crosshair\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.enabled\n                 */\n                /**\n                 * A format string for the crosshair label. Defaults to `{value}` for\n                 * numeric axes and `{value:%b %d, %Y}` for datetime axes.\n                 *\n                 * @type      {string}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.format\n                 */\n                /**\n                 * Formatter function for the label text.\n                 *\n                 * @type      {Highcharts.XAxisCrosshairLabelFormatterCallbackFunction}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.formatter\n                 */\n                /**\n                 * Padding inside the crosshair label.\n                 *\n                 * @type      {number}\n                 * @default   8\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.padding\n                 */\n                /**\n                 * The shape to use for the label box.\n                 *\n                 * @type      {string}\n                 * @default   callout\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.shape\n                 */\n                /**\n                 * Text styles for the crosshair label.\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @default   {\"color\": \"white\", \"fontWeight\": \"normal\", \"fontSize\": \"11px\", \"textAlign\": \"center\"}\n                 * @since     2.1\n                 * @product   highstock\n                 * @apioption xAxis.crosshair.label.style\n                 */\n                /**\n                 * Whether the crosshair should snap to the point or follow the pointer\n                 * independent of points.\n                 *\n                 * @sample {highcharts|highstock} highcharts/xaxis/crosshair-snap-false/\n                 *         True by default\n                 * @sample {highmaps} maps/demo/latlon-advanced/\n                 *         Snap is false\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.snap\n                 */\n                /**\n                 * The pixel width of the crosshair. Defaults to 1 for numeric or\n                 * datetime axes, and for one category width for category axes.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 * @sample {highstock} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 * @sample {highmaps} highcharts/xaxis/crosshair-customized/\n                 *         Customized crosshairs\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.width\n                 */\n                /**\n                 * The Z index of the crosshair. Higher Z indices allow drawing the\n                 * crosshair on top of the series or behind the grid lines.\n                 *\n                 * @type      {number}\n                 * @default   2\n                 * @since     4.1\n                 * @apioption xAxis.crosshair.zIndex\n                 */\n                /**\n                 * Whether to zoom axis. If `chart.zoomType` is set, the option allows\n                 * to disable zooming on an individual axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/zoomenabled/\n                 *         Zoom enabled is false\n                 *\n                 *\n                 * @type      {boolean}\n                 * @default   enabled\n                 * @apioption xAxis.zoomEnabled\n                 */\n                /**\n                 * For a datetime axis, the scale will automatically adjust to the\n                 * appropriate unit. This member gives the default string\n                 * representations used for each unit. For intermediate values,\n                 * different units may be used, for example the `day` unit can be used\n                 * on midnight and `hour` unit be used for intermediate values on the\n                 * same axis. For an overview of the replacement codes, see\n                 * [dateFormat](/class-reference/Highcharts#dateFormat).\n                 *\n                 * Defaults to:\n                 * ```js\n                 * {\n                 *     millisecond: '%H:%M:%S.%L',\n                 *     second: '%H:%M:%S',\n                 *     minute: '%H:%M',\n                 *     hour: '%H:%M',\n                 *     day: '%e. %b',\n                 *     week: '%e. %b',\n                 *     month: '%b \\'%y',\n                 *     year: '%Y'\n                 * }\n                 * ```\n                 *\n                 * @sample {highcharts} highcharts/xaxis/datetimelabelformats/\n                 *         Different day format on X axis\n                 * @sample {highstock} stock/xaxis/datetimelabelformats/\n                 *         More information in x axis labels\n                 *\n                 * @declare Highcharts.AxisDateTimeLabelFormatsOptions\n                 * @product highcharts highstock gantt\n                 */\n                dateTimeLabelFormats: {\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    millisecond: {\n                        main: '%H:%M:%S.%L',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    second: {\n                        main: '%H:%M:%S',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    minute: {\n                        main: '%H:%M',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    hour: {\n                        main: '%H:%M',\n                        range: false\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    day: {\n                        main: '%e. %b'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    week: {\n                        main: '%e. %b'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    month: {\n                        main: '%b \\'%y'\n                    },\n                    /**\n                     * @declare Highcharts.AxisDateTimeLabelFormatsOptionsObject\n                     * @type {string|*}\n                     */\n                    year: {\n                        main: '%Y'\n                    }\n                },\n                /**\n                 * Whether to force the axis to end on a tick. Use this option with\n                 * the `maxPadding` option to control the axis end.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, `endOnTick` is always `false` when the navigator\n                 * is enabled, to prevent jumpy scrolling.\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/yaxis/endontick/\n                 *         False\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False\n                 *\n                 * @since 1.2.0\n                 */\n                endOnTick: false,\n                /**\n                 * Event handlers for the axis.\n                 *\n                 * @type      {*}\n                 * @apioption xAxis.events\n                 */\n                /**\n                 * An event fired after the breaks have rendered.\n                 *\n                 * @see [breaks](#xAxis.breaks)\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-event/\n                 *         AfterBreak Event\n                 *\n                 * @type      {Highcharts.AxisEventCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts gantt\n                 * @apioption xAxis.events.afterBreaks\n                 */\n                /**\n                 * As opposed to the `setExtremes` event, this event fires after the\n                 * final min and max values are computed and corrected for `minRange`.\n                 *\n                 * Fires when the minimum and maximum is set for the axis, either by\n                 * calling the `.setExtremes()` method or by selecting an area in the\n                 * chart. One parameter, `event`, is passed to the function, containing\n                 * common event information.\n                 *\n                 * The new user set minimum and maximum values can be found by\n                 * `event.min` and `event.max`. These reflect the axis minimum and\n                 * maximum in axis values. The actual data extremes are found in\n                 * `event.dataMin` and `event.dataMax`.\n                 *\n                 * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n                 * @since     2.3\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.afterSetExtremes\n                 */\n                /**\n                 * An event fired when a break from this axis occurs on a point.\n                 *\n                 * @see [breaks](#xAxis.breaks)\n                 *\n                 * @sample {highcharts} highcharts/axisbreak/break-visualized/\n                 *         Visualization of a Break\n                 *\n                 * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n                 * @since     4.1.0\n                 * @product   highcharts gantt\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.pointBreak\n                 */\n                /**\n                 * An event fired when a point falls inside a break from this axis.\n                 *\n                 * @type      {Highcharts.AxisPointBreakEventCallbackFunction}\n                 * @product   highcharts highstock gantt\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.pointInBreak\n                 */\n                /**\n                 * Fires when the minimum and maximum is set for the axis, either by\n                 * calling the `.setExtremes()` method or by selecting an area in the\n                 * chart. One parameter, `event`, is passed to the function,\n                 * containing common event information.\n                 *\n                 * The new user set minimum and maximum values can be found by\n                 * `event.min` and `event.max`. These reflect the axis minimum and\n                 * maximum in data values. When an axis is zoomed all the way out from\n                 * the \"Reset zoom\" button, `event.min` and `event.max` are null, and\n                 * the new extremes are set based on `this.dataMin` and `this.dataMax`.\n                 *\n                 * @sample {highstock} stock/xaxis/events-setextremes/\n                 *         Log new extremes on x axis\n                 *\n                 * @type      {Highcharts.AxisSetExtremesEventCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Axis\n                 * @apioption xAxis.events.setExtremes\n                 */\n                /**\n                 * The lowest allowed value for automatically computed axis extremes.\n                 *\n                 * @see [ceiling](#yAxis.ceiling)\n                 *\n                 * @sample {highcharts} highcharts/yaxis/floor-ceiling/\n                 *         Floor and ceiling\n                 * @sample {highstock} stock/demo/lazy-loading/\n                 *         Prevent negative stock price on Y axis\n                 *\n                 * @type      {number}\n                 * @since     4.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.floor\n                 */\n                /**\n                 * The dash or dot style of the grid lines. For possible values, see\n                 * [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinedashstyle/\n                 *         Long dashes\n                 * @sample {highstock} stock/xaxis/gridlinedashstyle/\n                 *         Long dashes\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     1.2\n                 * @apioption xAxis.gridLineDashStyle\n                 */\n                /**\n                 * The Z index of the grid lines.\n                 *\n                 * @sample {highcharts|highstock} highcharts/xaxis/gridzindex/\n                 *         A Z index of 4 renders the grid above the graph\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.gridZIndex\n                 */\n                /**\n                 * An id for the axis. This can be used after render time to get\n                 * a pointer to the axis object through `chart.get()`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/id/\n                 *         Get the object\n                 * @sample {highstock} stock/xaxis/id/\n                 *         Get the object\n                 *\n                 * @type      {string}\n                 * @since     1.2.0\n                 * @apioption xAxis.id\n                 */\n                /**\n                 * The axis labels show the number or category for each tick.\n                 *\n                 * Since v8.0.0: Labels are animated in categorized x-axis with\n                 * updating data if `tickInterval` and `step` is set to 1.\n                 *\n                 * @productdesc {highmaps}\n                 * X and Y axis labels are by default disabled in Highmaps, but the\n                 * functionality is inherited from Highcharts and used on `colorAxis`,\n                 * and can be enabled on X and Y axes too.\n                 */\n                labels: {\n                    /**\n                     * What part of the string the given position is anchored to.\n                     * If `left`, the left side of the string is at the axis position.\n                     * Can be one of `\"left\"`, `\"center\"` or `\"right\"`. Defaults to\n                     * an intelligent guess based on which side of the chart the axis\n                     * is on and the rotation of the label.\n                     *\n                     * @see [reserveSpace](#xAxis.labels.reserveSpace)\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-align-left/\n                     *         Left\n                     * @sample {highcharts} highcharts/xaxis/labels-align-right/\n                     *         Right\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n                     *         Left-aligned labels on a vertical category axis\n                     *\n                     * @type       {Highcharts.AlignValue}\n                     * @apioption  xAxis.labels.align\n                     */\n                    /**\n                     * For horizontal axes, the allowed degrees of label rotation\n                     * to prevent overlapping labels. If there is enough space,\n                     * labels are not rotated. As the chart gets narrower, it\n                     * will start rotating the labels -45 degrees, then remove\n                     * every second label and try again with rotations 0 and -45 etc.\n                     * Set it to `false` to disable rotation, which will\n                     * cause the labels to word-wrap if possible.\n                     *\n                     * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-default/\n                     *         Default auto rotation of 0 or -45\n                     * @sample {highcharts|highstock} highcharts/xaxis/labels-autorotation-0-90/\n                     *         Custom graded auto rotation\n                     *\n                     * @type      {Array<number>|false}\n                     * @default   [-45]\n                     * @since     4.1.0\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.labels.autoRotation\n                     */\n                    /**\n                     * When each category width is more than this many pixels, we don't\n                     * apply auto rotation. Instead, we lay out the axis label with word\n                     * wrap. A lower limit makes sense when the label contains multiple\n                     * short words that don't extend the available horizontal space for\n                     * each label.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-autorotationlimit/\n                     *         Lower limit\n                     *\n                     * @type      {number}\n                     * @default   80\n                     * @since     4.1.5\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.autoRotationLimit\n                     */\n                    /**\n                     * Polar charts only. The label's pixel distance from the perimeter\n                     * of the plot area.\n                     *\n                     * @type      {number}\n                     * @default   15\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.distance\n                     */\n                    /**\n                     * Enable or disable the axis labels.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-enabled/\n                     *         X axis labels disabled\n                     * @sample {highstock} stock/xaxis/labels-enabled/\n                     *         X axis labels disabled\n                     *\n                     * @default {highcharts|highstock|gantt} true\n                     * @default {highmaps} false\n                     */\n                    enabled: true,\n                    /**\n                     * A [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                     * for the axis label.\n                     *\n                     * @sample {highcharts|highstock} highcharts/yaxis/labels-format/\n                     *         Add units to Y axis label\n                     *\n                     * @type      {string}\n                     * @default   {value}\n                     * @since     3.0\n                     * @apioption xAxis.labels.format\n                     */\n                    /**\n                     * Callback JavaScript function to format the label. The value\n                     * is given by `this.value`. Additional properties for `this` are\n                     * `axis`, `chart`, `isFirst` and `isLast`. The value of the default\n                     * label formatter can be retrieved by calling\n                     * `this.axis.defaultLabelFormatter.call(this)` within the function.\n                     *\n                     * Defaults to:\n                     * ```js\n                     * function() {\n                     *     return this.value;\n                     * }\n                     * ```\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-formatter-linked/\n                     *         Linked category names\n                     * @sample {highcharts} highcharts/xaxis/labels-formatter-extended/\n                     *         Modified numeric labels\n                     * @sample {highstock} stock/xaxis/labels-formatter/\n                     *         Added units on Y axis\n                     *\n                     * @type      {Highcharts.AxisLabelsFormatterCallbackFunction}\n                     * @apioption xAxis.labels.formatter\n                     */\n                    /**\n                     * The number of pixels to indent the labels per level in a treegrid\n                     * axis.\n                     *\n                     * @sample gantt/treegrid-axis/demo\n                     *         Indentation 10px by default.\n                     * @sample gantt/treegrid-axis/indentation-0px\n                     *         Indentation set to 0px.\n                     *\n                     * @product gantt\n                     */\n                    indentation: 10,\n                    /**\n                     * Horizontal axis only. When `staggerLines` is not set,\n                     * `maxStaggerLines` defines how many lines the axis is allowed to\n                     * add to automatically avoid overlapping X labels. Set to `1` to\n                     * disable overlap detection.\n                     *\n                     * @deprecated\n                     * @type      {number}\n                     * @default   5\n                     * @since     1.3.3\n                     * @apioption xAxis.labels.maxStaggerLines\n                     */\n                    /**\n                     * How to handle overflowing labels on horizontal axis. If set to\n                     * `\"allow\"`, it will not be aligned at all. By default it\n                     * `\"justify\"` labels inside the chart area. If there is room to\n                     * move it, it will be aligned to the edge, else it will be removed.\n                     *\n                     * @type       {string}\n                     * @default    justify\n                     * @since      2.2.5\n                     * @validvalue [\"allow\", \"justify\"]\n                     * @apioption  xAxis.labels.overflow\n                     */\n                    /**\n                     * The pixel padding for axis labels, to ensure white space between\n                     * them.\n                     *\n                     * @type      {number}\n                     * @default   5\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.padding\n                     */\n                    /**\n                     * Whether to reserve space for the labels. By default, space is\n                     * reserved for the labels in these cases:\n                     *\n                     * * On all horizontal axes.\n                     * * On vertical axes if `label.align` is `right` on a left-side\n                     * axis or `left` on a right-side axis.\n                     * * On vertical axes if `label.align` is `center`.\n                     *\n                     * This can be turned off when for example the labels are rendered\n                     * inside the plot area instead of outside.\n                     *\n                     * @see [labels.align](#xAxis.labels.align)\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace/\n                     *         No reserved space, labels inside plot\n                     * @sample {highcharts} highcharts/xaxis/labels-reservespace-true/\n                     *         Left-aligned labels on a vertical category axis\n                     *\n                     * @type      {boolean}\n                     * @since     4.1.10\n                     * @product   highcharts gantt\n                     * @apioption xAxis.labels.reserveSpace\n                     */\n                    /**\n                     * Rotation of the labels in degrees.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-rotation/\n                     *         X axis labels rotated 90°\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @apioption xAxis.labels.rotation\n                     */\n                    /**\n                     * Horizontal axes only. The number of lines to spread the labels\n                     * over to make room or tighter labels.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-staggerlines/\n                     *         Show labels over two lines\n                     * @sample {highstock} stock/xaxis/labels-staggerlines/\n                     *         Show labels over two lines\n                     *\n                     * @type      {number}\n                     * @since     2.1\n                     * @apioption xAxis.labels.staggerLines\n                     */\n                    /**\n                     * To show only every _n_'th label on the axis, set the step to _n_.\n                     * Setting the step to 2 shows every other label.\n                     *\n                     * By default, the step is calculated automatically to avoid\n                     * overlap. To prevent this, set it to 1\\. This usually only\n                     * happens on a category axis, and is often a sign that you have\n                     * chosen the wrong axis type.\n                     *\n                     * Read more at\n                     * [Axis docs](https://www.highcharts.com/docs/chart-concepts/axes)\n                     * => What axis should I use?\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-step/\n                     *         Showing only every other axis label on a categorized\n                     *         x-axis\n                     * @sample {highcharts} highcharts/xaxis/labels-step-auto/\n                     *         Auto steps on a category axis\n                     *\n                     * @type      {number}\n                     * @since     2.1\n                     * @apioption xAxis.labels.step\n                     */\n                    /**\n                     * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                     * to render the labels.\n                     *\n                     * @type      {boolean}\n                     * @default   false\n                     * @apioption xAxis.labels.useHTML\n                     */\n                    /**\n                     * The x position offset of the label relative to the tick position\n                     * on the axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     */\n                    x: 0,\n                    /**\n                     * The y position offset of the label relative to the tick position\n                     * on the axis. The default makes it adapt to the font size on\n                     * bottom axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     *\n                     * @type      {number}\n                     * @apioption xAxis.labels.y\n                     */\n                    /**\n                     * The Z index for the axis labels.\n                     *\n                     * @type      {number}\n                     * @default   7\n                     * @apioption xAxis.labels.zIndex\n                     */\n                    /**\n                     * CSS styles for the label. Use `whiteSpace: 'nowrap'` to prevent\n                     * wrapping of category labels. Use `textOverflow: 'none'` to\n                     * prevent ellipsis (dots).\n                     *\n                     * In styled mode, the labels are styled with the\n                     * `.highcharts-axis-labels` class.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-style/\n                     *         Red X axis labels\n                     *\n                     * @type      {Highcharts.CSSObject}\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#666666',\n                        /** @internal */\n                        cursor: 'default',\n                        /** @internal */\n                        fontSize: '11px'\n                    }\n                },\n                /**\n                 * The left position as the horizontal axis. If it's a number, it is\n                 * interpreted as pixel position relative to the chart.\n                 *\n                 * Since Highcharts v5.0.13: If it's a percentage string, it is\n                 * interpreted as percentages of the plot width, offset from plot area\n                 * left.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.left\n                 */\n                /**\n                 * The top position as the vertical axis. If it's a number, it is\n                 * interpreted as pixel position relative to the chart.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted\n                 * as percentages of the plot height, offset from plot area top.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.top\n                 */\n                /**\n                 * Index of another axis that this axis is linked to. When an axis is\n                 * linked to a master axis, it will take the same extremes as\n                 * the master, but as assigned by min or max or by setExtremes.\n                 * It can be used to show additional info, or to ease reading the\n                 * chart by duplicating the scales.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/linkedto/\n                 *         Different string formats of the same date\n                 * @sample {highcharts} highcharts/yaxis/linkedto/\n                 *         Y values on both sides\n                 *\n                 * @type      {number}\n                 * @since     2.0.2\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.linkedTo\n                 */\n                /**\n                 * The maximum value of the axis. If `null`, the max value is\n                 * automatically calculated.\n                 *\n                 * If the [endOnTick](#yAxis.endOnTick) option is true, the `max` value\n                 * might be rounded up.\n                 *\n                 * If a [tickAmount](#yAxis.tickAmount) is set, the axis may be extended\n                 * beyond the set max in order to reach the given number of ticks. The\n                 * same may happen in a chart with multiple axes, determined by [chart.\n                 * alignTicks](#chart), where a `tickAmount` is applied internally.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/max-200/\n                 *         Y axis max of 200\n                 * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n                 *         Y axis max on logarithmic axis\n                 * @sample {highstock} stock/xaxis/min-max/\n                 *         Fixed min and max on X axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @type      {number|null}\n                 * @apioption xAxis.max\n                 */\n                /**\n                 * Padding of the max value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the highest data value to appear on the edge\n                 * of the plot area. When the axis' `max` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/maxpadding/\n                 *         Max padding of 0.25 on y axis\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Add some padding\n                 *\n                 * @default   {highcharts} 0.01\n                 * @default   {highstock|highmaps} 0\n                 * @since     1.2.0\n                 */\n                maxPadding: 0.01,\n                /**\n                 * Deprecated. Use `minRange` instead.\n                 *\n                 * @deprecated\n                 * @type      {number}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.maxZoom\n                 */\n                /**\n                 * The minimum value of the axis. If `null` the min value is\n                 * automatically calculated.\n                 *\n                 * If the [startOnTick](#yAxis.startOnTick) option is true (default),\n                 * the `min` value might be rounded down.\n                 *\n                 * The automatically calculated minimum value is also affected by\n                 * [floor](#yAxis.floor), [softMin](#yAxis.softMin),\n                 * [minPadding](#yAxis.minPadding), [minRange](#yAxis.minRange)\n                 * as well as [series.threshold](#plotOptions.series.threshold)\n                 * and [series.softThreshold](#plotOptions.series.softThreshold).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n                 *         -50 with startOnTick to false\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n                 *         -50 with startOnTick true by default\n                 * @sample {highstock} stock/xaxis/min-max/\n                 *         Set min and max on X axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @type      {number|null}\n                 * @apioption xAxis.min\n                 */\n                /**\n                 * The dash or dot style of the minor grid lines. For possible values,\n                 * see [this demonstration](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinedashstyle/\n                 *         Long dashes on minor grid lines\n                 * @sample {highstock} stock/xaxis/minorgridlinedashstyle/\n                 *         Long dashes on minor grid lines\n                 *\n                 * @type      {Highcharts.DashStyleValue}\n                 * @default   Solid\n                 * @since     1.2\n                 * @apioption xAxis.minorGridLineDashStyle\n                 */\n                /**\n                 * Specific tick interval in axis units for the minor ticks. On a linear\n                 * axis, if `\"auto\"`, the minor tick interval is calculated as a fifth\n                 * of the tickInterval. If `null` or `undefined`, minor ticks are not\n                 * shown.\n                 *\n                 * On logarithmic axes, the unit is the power of the value. For example,\n                 * setting the minorTickInterval to 1 puts one tick on each of 0.1, 1,\n                 * 10, 100 etc. Setting the minorTickInterval to 0.1 produces 9 ticks\n                 * between 1 and 10, 10 and 100 etc.\n                 *\n                 * If user settings dictate minor ticks to become too dense, they don't\n                 * make sense, and will be ignored to prevent performance problems.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-null/\n                 *         Null by default\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-5/\n                 *         5 units\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-log-auto/\n                 *         \"auto\"\n                 * @sample {highcharts} highcharts/yaxis/minortickinterval-log/\n                 *         0.1\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         Null by default\n                 * @sample {highstock} stock/xaxis/minortickinterval-auto/\n                 *         \"auto\"\n                 *\n                 * @type      {number|string|null}\n                 * @apioption xAxis.minorTickInterval\n                 */\n                /**\n                 * The pixel length of the minor tick marks.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorticklength/\n                 *         10px on Y axis\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         10px on Y axis\n                 */\n                minorTickLength: 2,\n                /**\n                 * The position of the minor tick marks relative to the axis line.\n                 *  Can be one of `inside` and `outside`.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickposition-outside/\n                 *         Outside by default\n                 * @sample {highcharts} highcharts/yaxis/minortickposition-inside/\n                 *         Inside\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         Inside\n                 *\n                 * @validvalue [\"inside\", \"outside\"]\n                 */\n                minorTickPosition: 'outside',\n                /**\n                 * Enable or disable minor ticks. Unless\n                 * [minorTickInterval](#xAxis.minorTickInterval) is set, the tick\n                 * interval is calculated as a fifth of the `tickInterval`.\n                 *\n                 * On a logarithmic axis, minor ticks are laid out based on a best\n                 * guess, attempting to enter approximately 5 minor ticks between\n                 * each major tick.\n                 *\n                 * Prior to v6.0.0, ticks were unabled in auto layout by setting\n                 * `minorTickInterval` to `\"auto\"`.\n                 *\n                 * @productdesc {highcharts}\n                 * On axes using [categories](#xAxis.categories), minor ticks are not\n                 * supported.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorticks-true/\n                 *         Enabled on linear Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     6.0.0\n                 * @apioption xAxis.minorTicks\n                 */\n                /**\n                 * The pixel width of the minor tick mark.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickwidth/\n                 *         3px width\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         1px width\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.minorTickWidth\n                 */\n                /**\n                 * Padding of the min value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the lowest data value to appear on the edge\n                 * of the plot area. When the axis' `min` option is set or a min extreme\n                 * is set using `axis.setExtremes()`, the minPadding will be ignored.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minpadding/\n                 *         Min padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 * @sample {highmaps} maps/chart/plotbackgroundcolor-gradient/\n                 *         Add some padding\n                 *\n                 * @default    {highcharts} 0.01\n                 * @default    {highstock|highmaps} 0\n                 * @since      1.2.0\n                 * @product    highcharts highstock gantt\n                 */\n                minPadding: 0.01,\n                /**\n                 * The minimum range to display on this axis. The entire axis will not\n                 * be allowed to span over a smaller interval than this. For example,\n                 * for a datetime axis the main unit is milliseconds. If minRange is\n                 * set to 3600000, you can't zoom in more than to one hour.\n                 *\n                 * The default minRange for the x axis is five times the smallest\n                 * interval between any of the data points.\n                 *\n                 * On a logarithmic axis, the unit for the minimum range is the power.\n                 * So a minRange of 1 means that the axis can be zoomed to 10-100,\n                 * 100-1000, 1000-10000 etc.\n                 *\n                 * **Note**: The `minPadding`, `maxPadding`, `startOnTick` and\n                 * `endOnTick` settings also affect how the extremes of the axis\n                 * are computed.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/minrange/\n                 *         Minimum range of 5\n                 * @sample {highstock} stock/xaxis/minrange/\n                 *         Max zoom of 6 months overrides user selections\n                 * @sample {highmaps} maps/axis/minrange/\n                 *         Minimum range of 1000\n                 *\n                 * @type      {number}\n                 * @apioption xAxis.minRange\n                 */\n                /**\n                 * The minimum tick interval allowed in axis values. For example on\n                 * zooming in on an axis with daily data, this can be used to prevent\n                 * the axis from showing hours. Defaults to the closest distance between\n                 * two points on the axis.\n                 *\n                 * @type      {number}\n                 * @since     2.3.0\n                 * @apioption xAxis.minTickInterval\n                 */\n                /**\n                 * The distance in pixels from the plot area to the axis line.\n                 * A positive offset moves the axis with it's line, labels and ticks\n                 * away from the plot area. This is typically used when two or more\n                 * axes are displayed on the same side of the plot. With multiple\n                 * axes the offset is dynamically adjusted to avoid collision, this\n                 * can be overridden by setting offset explicitly.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/offset/\n                 *         Y axis offset of 70\n                 * @sample {highcharts} highcharts/yaxis/offset-centered/\n                 *         Axes positioned in the center of the plot\n                 * @sample {highstock} stock/xaxis/offset/\n                 *         Y axis offset by 70 px\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.offset\n                 */\n                /**\n                 * Whether to display the axis on the opposite side of the normal. The\n                 * normal is on the left side for vertical axes and bottom for\n                 * horizontal, so the opposite sides will be right and top respectively.\n                 * This is typically used with dual or multiple axes.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/opposite/\n                 *         Secondary Y axis opposite\n                 * @sample {highstock} stock/xaxis/opposite/\n                 *         Y axis on left side\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption xAxis.opposite\n                 */\n                /**\n                 * In an ordinal axis, the points are equally spaced in the chart\n                 * regardless of the actual time or x distance between them. This means\n                 * that missing data periods (e.g. nights or weekends for a stock chart)\n                 * will not take up space in the chart.\n                 * Having `ordinal: false` will show any gaps created by the `gapSize`\n                 * setting proportionate to their duration.\n                 *\n                 * In stock charts the X axis is ordinal by default, unless\n                 * the boost module is used and at least one of the series' data length\n                 * exceeds the [boostThreshold](#series.line.boostThreshold).\n                 *\n                 * @sample {highstock} stock/xaxis/ordinal-true/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/ordinal-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     1.1\n                 * @product   highstock\n                 * @apioption xAxis.ordinal\n                 */\n                /**\n                 * Additional range on the right side of the xAxis. Works similar to\n                 * `xAxis.maxPadding`, but value is set in milliseconds. Can be set for\n                 * both main `xAxis` and the navigator's `xAxis`.\n                 *\n                 * @sample {highstock} stock/xaxis/overscroll/\n                 *         One minute overscroll with live data\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     6.0.0\n                 * @product   highstock\n                 * @apioption xAxis.overscroll\n                 */\n                /**\n                 * Refers to the index in the [panes](#panes) array. Used for circular\n                 * gauges and polar charts. When the option is not set then first pane\n                 * will be used.\n                 *\n                 * @sample highcharts/demo/gauge-vu-meter\n                 *         Two gauges with different center\n                 *\n                 * @type      {number}\n                 * @product   highcharts\n                 * @apioption xAxis.pane\n                 */\n                /**\n                 * The zoomed range to display when only defining one or none of `min`\n                 * or `max`. For example, to show the latest month, a range of one month\n                 * can be set.\n                 *\n                 * @sample {highstock} stock/xaxis/range/\n                 *         Setting a zoomed range when the rangeSelector is disabled\n                 *\n                 * @type      {number}\n                 * @product   highstock\n                 * @apioption xAxis.range\n                 */\n                /**\n                 * Whether to reverse the axis so that the highest number is closest\n                 * to the origin. If the chart is inverted, the x axis is reversed by\n                 * default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversed/\n                 *         Reversed Y axis\n                 * @sample {highstock} stock/xaxis/reversed/\n                 *         Reversed Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption xAxis.reversed\n                 */\n                // reversed: false,\n                /**\n                 * This option determines how stacks should be ordered within a group.\n                 * For example reversed xAxis also reverses stacks, so first series\n                 * comes last in a group. To keep order like for non-reversed xAxis\n                 * enable this option.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/reversedstacks/\n                 *         Reversed stacks comparison\n                 * @sample {highstock} highcharts/xaxis/reversedstacks/\n                 *         Reversed stacks comparison\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     6.1.1\n                 * @product   highcharts highstock\n                 * @apioption xAxis.reversedStacks\n                 */\n                /**\n                 * An optional scrollbar to display on the X axis in response to\n                 * limiting the minimum and maximum of the axis values.\n                 *\n                 * In styled mode, all the presentational options for the scrollbar are\n                 * replaced by the classes `.highcharts-scrollbar-thumb`,\n                 * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n                 * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n                 *\n                 * @sample {highstock} stock/yaxis/heatmap-scrollbars/\n                 *         Heatmap with both scrollbars\n                 *\n                 * @extends   scrollbar\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption xAxis.scrollbar\n                 */\n                /**\n                 * Whether to show the axis line and title when the axis has no data.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/showempty/\n                 *         When clicking the legend to hide series, one axis preserves\n                 *         line and title, the other doesn't\n                 * @sample {highstock} highcharts/yaxis/showempty/\n                 *         When clicking the legend to hide series, one axis preserves\n                 *         line and title, the other doesn't\n                 *\n                 * @since     1.1\n                 */\n                showEmpty: true,\n                /**\n                 * Whether to show the first tick label.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/showfirstlabel-false/\n                 *         Set to false on X axis\n                 * @sample {highstock} stock/xaxis/showfirstlabel/\n                 *         Labels below plot lines on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @apioption xAxis.showFirstLabel\n                 */\n                /**\n                 * Whether to show the last tick label. Defaults to `true` on cartesian\n                 * charts, and `false` on polar charts.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/showlastlabel-true/\n                 *         Set to true on X axis\n                 * @sample {highstock} stock/xaxis/showfirstlabel/\n                 *         Labels below plot lines on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.showLastLabel\n                 */\n                /**\n                 * A soft maximum for the axis. If the series data maximum is less than\n                 * this, the axis will stay at this maximum, but if the series data\n                 * maximum is higher, the axis will flex to show all data.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.softMax\n                 */\n                /**\n                 * A soft minimum for the axis. If the series data minimum is greater\n                 * than this, the axis will stay at this minimum, but if the series\n                 * data minimum is lower, the axis will flex to show all data.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.softMin\n                 */\n                /**\n                 * For datetime axes, this decides where to put the tick between weeks.\n                 *  0 = Sunday, 1 = Monday.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startofweek-monday/\n                 *         Monday by default\n                 * @sample {highcharts} highcharts/xaxis/startofweek-sunday/\n                 *         Sunday\n                 * @sample {highstock} stock/xaxis/startofweek-1\n                 *         Monday by default\n                 * @sample {highstock} stock/xaxis/startofweek-0\n                 *         Sunday\n                 *\n                 * @product highcharts highstock gantt\n                 */\n                startOfWeek: 1,\n                /**\n                 * Whether to force the axis to start on a tick. Use this option with\n                 * the `minPadding` option to control the axis start.\n                 *\n                 * @productdesc {highstock}\n                 * In Highstock, `startOnTick` is always `false` when the navigator\n                 * is enabled, to prevent jumpy scrolling.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startontick-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/xaxis/startontick-true/\n                 *         True\n                 *\n                 * @since 1.2.0\n                 */\n                startOnTick: false,\n                /**\n                 * The amount of ticks to draw on the axis. This opens up for aligning\n                 * the ticks of multiple charts or panes within a chart. This option\n                 * overrides the `tickPixelInterval` option.\n                 *\n                 * This option only has an effect on linear axes. Datetime, logarithmic\n                 * or category axes are not affected.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/tickamount/\n                 *         8 ticks on Y axis\n                 * @sample {highstock} highcharts/yaxis/tickamount/\n                 *         8 ticks on Y axis\n                 *\n                 * @type      {number}\n                 * @since     4.1.0\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.tickAmount\n                 */\n                /**\n                 * The interval of the tick marks in axis units. When `undefined`, the\n                 * tick interval is computed to approximately follow the\n                 * [tickPixelInterval](#xAxis.tickPixelInterval) on linear and datetime\n                 * axes. On categorized axes, a `undefined` tickInterval will default to\n                 * 1, one category. Note that datetime axes are based on milliseconds,\n                 * so for example an interval of one day is expressed as\n                 * `24 * 3600 * 1000`.\n                 *\n                 * On logarithmic axes, the tickInterval is based on powers, so a\n                 * tickInterval of 1 means one tick on each of 0.1, 1, 10, 100 etc. A\n                 * tickInterval of 2 means a tick of 0.1, 10, 1000 etc. A tickInterval\n                 * of 0.2 puts a tick on 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10, 20,\n                 * 40 etc.\n                 *\n                 *\n                 * If the tickInterval is too dense for labels to be drawn, Highcharts\n                 * may remove ticks.\n                 *\n                 * If the chart has multiple axes, the [alignTicks](#chart.alignTicks)\n                 * option may interfere with the `tickInterval` setting.\n                 *\n                 * @see [tickPixelInterval](#xAxis.tickPixelInterval)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickinterval-5/\n                 *         Tick interval of 5 on a linear axis\n                 * @sample {highstock} stock/xaxis/tickinterval/\n                 *         Tick interval of 0.01 on Y axis\n                 *\n                 * @type      {number}\n                 * @apioption xAxis.tickInterval\n                 */\n                /**\n                 * The pixel length of the main tick marks.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/ticklength/\n                 *         20 px tick length on the X axis\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 */\n                tickLength: 10,\n                /**\n                 * If tickInterval is `null` this option sets the approximate pixel\n                 * interval of the tick marks. Not applicable to categorized axis.\n                 *\n                 * The tick interval is also influenced by the [minTickInterval](\n                 * #xAxis.minTickInterval) option, that, by default prevents ticks from\n                 * being denser than the data points.\n                 *\n                 * @see [tickInterval](#xAxis.tickInterval)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpixelinterval-50/\n                 *         50 px on X axis\n                 * @sample {highstock} stock/xaxis/tickpixelinterval/\n                 *         200 px on X axis\n                 */\n                tickPixelInterval: 100,\n                /**\n                 * For categorized axes only. If `on` the tick mark is placed in the\n                 * center of the category, if `between` the tick mark is placed between\n                 * categories. The default is `between` if the `tickInterval` is 1, else\n                 * `on`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickmarkplacement-between/\n                 *         \"between\" by default\n                 * @sample {highcharts} highcharts/xaxis/tickmarkplacement-on/\n                 *         \"on\"\n                 *\n                 * @product    highcharts gantt\n                 * @validvalue [\"on\", \"between\"]\n                 */\n                tickmarkPlacement: 'between',\n                /**\n                 * The position of the major tick marks relative to the axis line.\n                 * Can be one of `inside` and `outside`.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickposition-outside/\n                 *         \"outside\" by default\n                 * @sample {highcharts} highcharts/xaxis/tickposition-inside/\n                 *         \"inside\"\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 *\n                 * @validvalue [\"inside\", \"outside\"]\n                 */\n                tickPosition: 'outside',\n                /**\n                 * A callback function returning array defining where the ticks are\n                 * laid out on the axis. This overrides the default behaviour of\n                 * [tickPixelInterval](#xAxis.tickPixelInterval) and [tickInterval](\n                 * #xAxis.tickInterval). The automatic tick positions are accessible\n                 * through `this.tickPositions` and can be modified by the callback.\n                 *\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 *\n                 * @type      {Highcharts.AxisTickPositionerCallbackFunction}\n                 * @apioption xAxis.tickPositioner\n                 */\n                /**\n                 * An array defining where the ticks are laid out on the axis. This\n                 * overrides the default behaviour of [tickPixelInterval](\n                 * #xAxis.tickPixelInterval) and [tickInterval](#xAxis.tickInterval).\n                 *\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 * @sample {highstock} highcharts/xaxis/tickpositions-tickpositioner/\n                 *         Demo of tickPositions and tickPositioner\n                 *\n                 * @type      {Array<number>}\n                 * @apioption xAxis.tickPositions\n                 */\n                /**\n                 * The pixel width of the major tick marks. Defaults to 0 on category\n                 * axes, otherwise 1.\n                 *\n                 * In styled mode, the stroke width is given in the `.highcharts-tick`\n                 * class, but in order for the element to be generated on category axes,\n                 * the option must be explicitly set to 1.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickwidth/\n                 *         10 px width\n                 * @sample {highcharts} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 * @sample {highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 *\n                 * @type      {undefined|number}\n                 * @default   {highstock} 1\n                 * @default   {highmaps} 0\n                 * @apioption xAxis.tickWidth\n                 */\n                /**\n                 * The axis title, showing next to the axis line.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis is hidden by default, but adding an axis title\n                 * is still possible. X axis and Y axis titles will appear at the bottom\n                 * and left by default.\n                 */\n                title: {\n                    /**\n                     * Deprecated. Set the `text` to `null` to disable the title.\n                     *\n                     * @deprecated\n                     * @type      {boolean}\n                     * @product   highcharts\n                     * @apioption xAxis.title.enabled\n                     */\n                    /**\n                     * The pixel distance between the axis labels or line and the title.\n                     * Defaults to 0 for horizontal axes, 10 for vertical\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-margin/\n                     *         Y axis title margin of 60\n                     *\n                     * @type      {number}\n                     * @apioption xAxis.title.margin\n                     */\n                    /**\n                     * The distance of the axis title from the axis line. By default,\n                     * this distance is computed from the offset width of the labels,\n                     * the labels' distance from the axis and the title's margin.\n                     * However when the offset option is set, it overrides all this.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Place the axis title on top of the axis\n                     * @sample {highstock} highcharts/yaxis/title-offset/\n                     *         Place the axis title on top of the Y axis\n                     *\n                     * @type      {number}\n                     * @since     2.2.0\n                     * @apioption xAxis.title.offset\n                     */\n                    /**\n                     * Whether to reserve space for the title when laying out the axis.\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     5.0.11\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.reserveSpace\n                     */\n                    /**\n                     * The rotation of the text in degrees. 0 is horizontal, 270 is\n                     * vertical reading from bottom to top.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Horizontal\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @apioption xAxis.title.rotation\n                     */\n                    /**\n                     * The actual text of the axis title. It can contain basic HTML tags\n                     * like `b`, `i` and `span` with style.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-text/\n                     *         Custom HTML\n                     * @sample {highstock} stock/xaxis/title-text/\n                     *         Titles for both axes\n                     *\n                     * @type      {string|null}\n                     * @apioption xAxis.title.text\n                     */\n                    /**\n                     * Alignment of the text, can be `\"left\"`, `\"right\"` or `\"center\"`.\n                     * Default alignment depends on the\n                     * [title.align](xAxis.title.align):\n                     *\n                     * Horizontal axes:\n                     * - for `align` = `\"low\"`, `textAlign` is set to `left`\n                     * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n                     * - for `align` = `\"high\"`, `textAlign` is set to `right`\n                     *\n                     * Vertical axes:\n                     * - for `align` = `\"low\"` and `opposite` = `true`, `textAlign` is\n                     *   set to `right`\n                     * - for `align` = `\"low\"` and `opposite` = `false`, `textAlign` is\n                     *   set to `left`\n                     * - for `align` = `\"middle\"`, `textAlign` is set to `center`\n                     * - for `align` = `\"high\"` and `opposite` = `true` `textAlign` is\n                     *   set to `left`\n                     * - for `align` = `\"high\"` and `opposite` = `false` `textAlign` is\n                     *   set to `right`\n                     *\n                     * @type      {Highcharts.AlignValue}\n                     * @apioption xAxis.title.textAlign\n                     */\n                    /**\n                     * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                     * to render the axis title.\n                     *\n                     * @type      {boolean}\n                     * @default   false\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.useHTML\n                     */\n                    /**\n                     * Horizontal pixel offset of the title position.\n                     *\n                     * @type      {number}\n                     * @default   0\n                     * @since     4.1.6\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.x\n                     */\n                    /**\n                     * Vertical pixel offset of the title position.\n                     *\n                     * @type      {number}\n                     * @product   highcharts highstock gantt\n                     * @apioption xAxis.title.y\n                     */\n                    /**\n                     * Alignment of the title relative to the axis values. Possible\n                     * values are \"low\", \"middle\" or \"high\".\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-align-low/\n                     *         \"low\"\n                     * @sample {highcharts} highcharts/xaxis/title-align-center/\n                     *         \"middle\" by default\n                     * @sample {highcharts} highcharts/xaxis/title-align-high/\n                     *         \"high\"\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Place the Y axis title on top of the axis\n                     * @sample {highstock} stock/xaxis/title-align/\n                     *         Aligned to \"high\" value\n                     *\n                     * @type {Highcharts.AxisTitleAlignValue}\n                     */\n                    align: 'middle',\n                    /**\n                     * CSS styles for the title. If the title text is longer than the\n                     * axis length, it will wrap to multiple lines by default. This can\n                     * be customized by setting `textOverflow: 'ellipsis'`, by\n                     * setting a specific `width` or by setting `whiteSpace: 'nowrap'`.\n                     *\n                     * In styled mode, the stroke width is given in the\n                     * `.highcharts-axis-title` class.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-style/\n                     *         Red\n                     * @sample {highcharts} highcharts/css/axis/\n                     *         Styled mode\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#666666'\n                    }\n                },\n                /**\n                 * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`\n                 * or `category`. In a datetime axis, the numbers are given in\n                 * milliseconds, and tick marks are placed on appropriate values like\n                 * full hours or days. In a category axis, the\n                 * [point names](#series.line.data.name) of the chart's series are used\n                 * for categories, if not a [categories](#xAxis.categories) array is\n                 * defined.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/type-linear/\n                 *         Linear\n                 * @sample {highcharts} highcharts/yaxis/type-log/\n                 *         Logarithmic\n                 * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n                 *         Logarithmic with minor grid lines\n                 * @sample {highcharts} highcharts/xaxis/type-log-both/\n                 *         Logarithmic on two axes\n                 * @sample {highcharts} highcharts/yaxis/type-log-negative/\n                 *         Logarithmic with extension to emulate negative values\n                 *\n                 * @type    {Highcharts.AxisTypeValue}\n                 * @product highcharts gantt\n                 */\n                type: 'linear',\n                /**\n                 * If there are multiple axes on the same side of the chart, the pixel\n                 * margin between the axes. Defaults to 0 on vertical axes, 15 on\n                 * horizontal axes.\n                 *\n                 * @type      {number}\n                 * @since     7.0.3\n                 * @apioption xAxis.margin\n                 */\n                /**\n                 * Applies only when the axis `type` is `category`. When `uniqueNames`\n                 * is true, points are placed on the X axis according to their names.\n                 * If the same point name is repeated in the same or another series,\n                 * the point is placed on the same X position as other points of the\n                 * same name. When `uniqueNames` is false, the points are laid out in\n                 * increasing X positions regardless of their names, and the X axis\n                 * category will take the name of the last point in each position.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/uniquenames-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/xaxis/uniquenames-false/\n                 *         False\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.2.7\n                 * @product   highcharts gantt\n                 * @apioption xAxis.uniqueNames\n                 */\n                /**\n                 * Datetime axis only. An array determining what time intervals the\n                 * ticks are allowed to fall on. Each array item is an array where the\n                 * first value is the time unit and the second value another array of\n                 * allowed multiples.\n                 *\n                 * Defaults to:\n                 * ```js\n                 * units: [[\n                 *     'millisecond', // unit name\n                 *     [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                 * ], [\n                 *     'second',\n                 *     [1, 2, 5, 10, 15, 30]\n                 * ], [\n                 *     'minute',\n                 *     [1, 2, 5, 10, 15, 30]\n                 * ], [\n                 *     'hour',\n                 *     [1, 2, 3, 4, 6, 8, 12]\n                 * ], [\n                 *     'day',\n                 *     [1]\n                 * ], [\n                 *     'week',\n                 *     [1]\n                 * ], [\n                 *     'month',\n                 *     [1, 3, 6]\n                 * ], [\n                 *     'year',\n                 *     null\n                 * ]]\n                 * ```\n                 *\n                 * @type      {Array<Array<string,(Array<number>|null)>>}\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.units\n                 */\n                /**\n                 * Whether axis, including axis title, line, ticks and labels, should\n                 * be visible.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.1.9\n                 * @product   highcharts highstock gantt\n                 * @apioption xAxis.visible\n                 */\n                /**\n                 * Color of the minor, secondary grid lines.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-minor-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinecolor/\n                 *         Bright grey lines from Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/minorgridlinecolor/\n                 *         Bright grey lines from Y axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #f2f2f2\n                 */\n                minorGridLineColor: '#f2f2f2',\n                /**\n                 * Width of the minor, secondary grid lines.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minorgridlinewidth/\n                 *         2px lines from Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/minorgridlinewidth/\n                 *         2px lines from Y axis\n                 */\n                minorGridLineWidth: 1,\n                /**\n                 * Color for the minor tick marks.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minortickcolor/\n                 *         Black tick marks on Y axis\n                 * @sample {highstock} stock/xaxis/minorticks/\n                 *         Black tick marks on Y axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #999999\n                 */\n                minorTickColor: '#999999',\n                /**\n                 * The color of the line marking the axis itself.\n                 *\n                 * In styled mode, the line stroke is given in the\n                 * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis line is hidden by default, because the axis is\n                 * not visible by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/linecolor/\n                 *         A red line on Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis/\n                 *         Axes in styled mode\n                 * @sample {highstock} stock/xaxis/linecolor/\n                 *         A red line on X axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #ccd6eb\n                 */\n                lineColor: '#ccd6eb',\n                /**\n                 * The width of the line marking the axis itself.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-axis-line` or `.highcharts-xaxis-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/linecolor/\n                 *         A 1px line on Y axis\n                 * @sample {highcharts|highstock} highcharts/css/axis/\n                 *         Axes in styled mode\n                 * @sample {highstock} stock/xaxis/linewidth/\n                 *         A 2px line on X axis\n                 *\n                 * @default {highcharts|highstock} 1\n                 * @default {highmaps} 0\n                 */\n                lineWidth: 1,\n                /**\n                 * Color of the grid lines extending the ticks across the plot area.\n                 *\n                 * In styled mode, the stroke is given in the `.highcharts-grid-line`\n                 * class.\n                 *\n                 * @productdesc {highmaps}\n                 * In Highmaps, the grid lines are hidden by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinecolor/\n                 *         Green lines\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/gridlinecolor/\n                 *         Green lines\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #e6e6e6\n                 */\n                gridLineColor: '#e6e6e6',\n                // gridLineDashStyle: 'solid',\n                /**\n                 * The width of the grid lines extending the ticks across the plot area.\n                 *\n                 * In styled mode, the stroke width is given in the\n                 * `.highcharts-grid-line` class.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/gridlinewidth/\n                 *         2px lines\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/gridlinewidth/\n                 *         2px lines\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption xAxis.gridLineWidth\n                 */\n                // gridLineWidth: 0,\n                /**\n                 * The height as the vertical axis. If it's a number, it is\n                 * interpreted as pixels.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted\n                 * as percentages of the total plot height.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.height\n                 */\n                /**\n                 * The width as the horizontal axis. If it's a number, it is interpreted\n                 * as pixels.\n                 *\n                 * Since Highcharts v5.0.13: If it's a percentage string, it is\n                 * interpreted as percentages of the total plot width.\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption xAxis.width\n                 */\n                /**\n                 * Color for the main tick marks.\n                 *\n                 * In styled mode, the stroke is given in the `.highcharts-tick`\n                 * class.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickcolor/\n                 *         Red ticks on X axis\n                 * @sample {highcharts|highstock} highcharts/css/axis-grid/\n                 *         Styled mode\n                 * @sample {highstock} stock/xaxis/ticks/\n                 *         Formatted ticks on X axis\n                 *\n                 * @type    {Highcharts.ColorType}\n                 * @default #ccd6eb\n                 */\n                tickColor: '#ccd6eb'\n                // tickWidth: 1\n            };\n            /**\n             * The Y axis or value axis. Normally this is the vertical axis,\n             * though if the chart is inverted this is the horizontal axis.\n             * In case of multiple axes, the yAxis node is an array of\n             * configuration objects.\n             *\n             * See [the Axis object](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @type         {*|Array<*>}\n             * @extends      xAxis\n             * @excluding    currentDateIndicator,ordinal,overscroll\n             * @optionparent yAxis\n             *\n             * @private\n             */\n            Axis.defaultYAxisOptions = {\n                /**\n                 * The type of axis. Can be one of `linear`, `logarithmic`, `datetime`,\n                 * `category` or `treegrid`. Defaults to `treegrid` for Gantt charts,\n                 * `linear` for other chart types.\n                 *\n                 * In a datetime axis, the numbers are given in milliseconds, and tick\n                 * marks are placed on appropriate values, like full hours or days. In a\n                 * category or treegrid axis, the [point names](#series.line.data.name)\n                 * of the chart's series are used for categories, if a\n                 * [categories](#xAxis.categories) array is not defined.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/type-log-minorgrid/\n                 *         Logarithmic with minor grid lines\n                 * @sample {highcharts} highcharts/yaxis/type-log-negative/\n                 *         Logarithmic with extension to emulate negative values\n                 * @sample {gantt} gantt/treegrid-axis/demo\n                 *         Treegrid axis\n                 *\n                 * @type      {Highcharts.AxisTypeValue}\n                 * @default   {highcharts} linear\n                 * @default   {gantt} treegrid\n                 * @product   highcharts gantt\n                 * @apioption yAxis.type\n                 */\n                /**\n                 * The height of the Y axis. If it's a number, it is interpreted as\n                 * pixels.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted as\n                 * percentages of the total plot height.\n                 *\n                 * @see [yAxis.top](#yAxis.top)\n                 *\n                 * @sample {highstock} stock/demo/candlestick-and-volume/\n                 *         Percentage height panes\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption yAxis.height\n                 */\n                /**\n                 * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n                 * to represent the maximum value of the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n                 *         Min and max colors\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #003399\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.maxColor\n                 */\n                /**\n                 * Solid gauge only. Unless [stops](#yAxis.stops) are set, the color\n                 * to represent the minimum value of the Y axis.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/mincolor-maxcolor/\n                 *         Min and max color\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @default   #e6ebf5\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.minColor\n                 */\n                /**\n                 * Whether to reverse the axis so that the highest number is closest\n                 * to the origin.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversed/\n                 *         Reversed Y axis\n                 * @sample {highstock} stock/xaxis/reversed/\n                 *         Reversed Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} false\n                 * @default   {highstock} false\n                 * @default   {highmaps} true\n                 * @default   {gantt} true\n                 * @apioption yAxis.reversed\n                 */\n                /**\n                 * If `true`, the first series in a stack will be drawn on top in a\n                 * positive, non-reversed Y axis. If `false`, the first series is in\n                 * the base of the stack.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/reversedstacks-false/\n                 *         Non-reversed stacks\n                 * @sample {highstock} highcharts/yaxis/reversedstacks-false/\n                 *         Non-reversed stacks\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     3.0.10\n                 * @product   highcharts highstock\n                 * @apioption yAxis.reversedStacks\n                 */\n                /**\n                 * Solid gauge series only. Color stops for the solid gauge. Use this\n                 * in cases where a linear gradient between a `minColor` and `maxColor`\n                 * is not sufficient. The stops is an array of tuples, where the first\n                 * item is a float between 0 and 1 assigning the relative position in\n                 * the gradient, and the second item is the color.\n                 *\n                 * For solid gauges, the Y axis also inherits the concept of\n                 * [data classes](https://api.highcharts.com/highmaps#colorAxis.dataClasses)\n                 * from the Highmaps color axis.\n                 *\n                 * @see [minColor](#yAxis.minColor)\n                 * @see [maxColor](#yAxis.maxColor)\n                 *\n                 * @sample {highcharts} highcharts/demo/gauge-solid/\n                 *         True by default\n                 *\n                 * @type      {Array<Highcharts.GradientColorStopObject>}\n                 * @since     4.0\n                 * @product   highcharts\n                 * @apioption yAxis.stops\n                 */\n                /**\n                 * The pixel width of the major tick marks.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/tickwidth/ 10 px width\n                 * @sample {highstock} stock/xaxis/ticks/ Formatted ticks on X axis\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.tickWidth\n                 */\n                /**\n                 * Angular gauges and solid gauges only.\n                 * The label's pixel distance from the perimeter of the plot area.\n                 *\n                 * Since v7.1.2: If it's a percentage string, it is interpreted the\n                 * same as [series.radius](#plotOptions.gauge.radius), so label can be\n                 * aligned under the gauge's shape.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/labels-distance/\n                 *                      Labels centered under the arc\n                 *\n                 * @type      {number|string}\n                 * @default   -25\n                 * @product   highcharts\n                 * @apioption yAxis.labels.distance\n                 */\n                /**\n                 * The y position offset of the label relative to the tick position\n                 * on the axis.\n                 *\n                 * @sample {highcharts} highcharts/xaxis/labels-x/\n                 *         Y axis labels placed on grid lines\n                 *\n                 * @type      {number}\n                 * @default   {highcharts} 3\n                 * @default   {highstock} -2\n                 * @default   {highmaps} 3\n                 * @apioption yAxis.labels.y\n                 */\n                /**\n                 * Whether to force the axis to end on a tick. Use this option with\n                 * the `maxPadding` option to control the axis end.\n                 *\n                 * This option is always disabled, when panning type is\n                 * either `y` or `xy`.\n                 *\n                 * @see [type](#chart.panning.type)\n                 *\n                 *\n                 * @sample {highcharts} highcharts/chart/reflow-true/\n                 *         True by default\n                 * @sample {highcharts} highcharts/yaxis/endontick/\n                 *         False\n                 * @sample {highstock} stock/demo/basic-line/\n                 *         True by default\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False for Y axis\n                 *\n                 * @since 1.2.0\n                 */\n                endOnTick: true,\n                /**\n                 * Padding of the max value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the highest data value to appear on the edge\n                 * of the plot area. When the axis' `max` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * Also the `softThreshold` option takes precedence over `maxPadding`,\n                 * so if the data is tangent to the threshold, `maxPadding` may not\n                 * apply unless `softThreshold` is set to false.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/maxpadding-02/\n                 *         Max padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                maxPadding: 0.05,\n                /**\n                 * Padding of the min value relative to the length of the axis. A\n                 * padding of 0.05 will make a 100px axis 5px longer. This is useful\n                 * when you don't want the lowest data value to appear on the edge\n                 * of the plot area. When the axis' `min` option is set or a max extreme\n                 * is set using `axis.setExtremes()`, the maxPadding will be ignored.\n                 *\n                 * Also the `softThreshold` option takes precedence over `minPadding`,\n                 * so if the data is tangent to the threshold, `minPadding` may not\n                 * apply unless `softThreshold` is set to false.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/minpadding/\n                 *         Min padding of 0.2\n                 * @sample {highstock} stock/xaxis/minpadding-maxpadding/\n                 *         Greater min- and maxPadding\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                minPadding: 0.05,\n                /**\n                 * @productdesc {highstock}\n                 * In Highstock 1.x, the Y axis was placed on the left side by default.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/opposite/\n                 *         Secondary Y axis opposite\n                 * @sample {highstock} stock/xaxis/opposite/\n                 *         Y axis on left side\n                 *\n                 * @type      {boolean}\n                 * @default   {highstock} true\n                 * @default   {highcharts} false\n                 * @product   highstock highcharts gantt\n                 * @apioption yAxis.opposite\n                 */\n                /**\n                 * @see [tickInterval](#xAxis.tickInterval)\n                 * @see [tickPositioner](#xAxis.tickPositioner)\n                 * @see [tickPositions](#xAxis.tickPositions)\n                 */\n                tickPixelInterval: 72,\n                showLastLabel: true,\n                /**\n                 * @extends xAxis.labels\n                 */\n                labels: {\n                    /**\n                     * What part of the string the given position is anchored to. Can\n                     * be one of `\"left\"`, `\"center\"` or `\"right\"`. The exact position\n                     * also depends on the `labels.x` setting.\n                     *\n                     * Angular gauges and solid gauges defaults to `\"center\"`.\n                     * Solid gauges with two labels have additional option `\"auto\"`\n                     * for automatic horizontal and vertical alignment.\n                     *\n                     * @see [yAxis.labels.distance](#yAxis.labels.distance)\n                     *\n                     * @sample {highcharts} highcharts/yaxis/labels-align-left/\n                     *         Left\n                     * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n                     *         Solid gauge labels auto aligned\n                     *\n                     * @type       {Highcharts.AlignValue}\n                     * @default    {highcharts|highmaps} right\n                     * @default    {highstock} left\n                     * @apioption  yAxis.labels.align\n                     */\n                    /**\n                     * The x position offset of the label relative to the tick position\n                     * on the axis. Defaults to -15 for left axis, 15 for right axis.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/labels-x/\n                     *         Y axis labels placed on grid lines\n                     */\n                    x: -8\n                },\n                /**\n                 * @productdesc {highmaps}\n                 * In Highmaps, the axis line is hidden by default, because the axis is\n                 * not visible by default.\n                 *\n                 * @type      {Highcharts.ColorType}\n                 * @apioption yAxis.lineColor\n                 */\n                /**\n                 * @sample {highcharts} highcharts/yaxis/max-200/\n                 *         Y axis max of 200\n                 * @sample {highcharts} highcharts/yaxis/max-logarithmic/\n                 *         Y axis max on logarithmic axis\n                 * @sample {highstock} stock/yaxis/min-max/\n                 *         Fixed min and max on Y axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @apioption yAxis.max\n                 */\n                /**\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-false/\n                 *         -50 with startOnTick to false\n                 * @sample {highcharts} highcharts/yaxis/min-startontick-true/\n                 *         -50 with startOnTick true by default\n                 * @sample {highstock} stock/yaxis/min-max/\n                 *         Fixed min and max on Y axis\n                 * @sample {highmaps} maps/axis/min-max/\n                 *         Pre-zoomed to a specific area\n                 *\n                 * @apioption yAxis.min\n                 */\n                /**\n                 * An optional scrollbar to display on the Y axis in response to\n                 * limiting the minimum an maximum of the axis values.\n                 *\n                 * In styled mode, all the presentational options for the scrollbar\n                 * are replaced by the classes `.highcharts-scrollbar-thumb`,\n                 * `.highcharts-scrollbar-arrow`, `.highcharts-scrollbar-button`,\n                 * `.highcharts-scrollbar-rifles` and `.highcharts-scrollbar-track`.\n                 *\n                 * @sample {highstock} stock/yaxis/scrollbar/\n                 *         Scrollbar on the Y axis\n                 *\n                 * @extends   scrollbar\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @excluding height\n                 * @apioption yAxis.scrollbar\n                 */\n                /**\n                 * Enable the scrollbar on the Y axis.\n                 *\n                 * @sample {highstock} stock/yaxis/scrollbar/\n                 *         Enabled on Y axis\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.enabled\n                 */\n                /**\n                 * Pixel margin between the scrollbar and the axis elements.\n                 *\n                 * @type      {number}\n                 * @default   10\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.margin\n                 */\n                /**\n                 * Whether to show the scrollbar when it is fully zoomed out at max\n                 * range. Setting it to `false` on the Y axis makes the scrollbar stay\n                 * hidden until the user zooms in, like common in browsers.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.showFull\n                 */\n                /**\n                 * The width of a vertical scrollbar or height of a horizontal\n                 * scrollbar. Defaults to 20 on touch devices.\n                 *\n                 * @type      {number}\n                 * @default   14\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.size\n                 */\n                /**\n                 * Z index of the scrollbar elements.\n                 *\n                 * @type      {number}\n                 * @default   3\n                 * @since     4.2.6\n                 * @product   highstock\n                 * @apioption yAxis.scrollbar.zIndex\n                 */\n                /**\n                 * A soft maximum for the axis. If the series data maximum is less\n                 * than this, the axis will stay at this maximum, but if the series\n                 * data maximum is higher, the axis will flex to show all data.\n                 *\n                 * **Note**: The [series.softThreshold](\n                 * #plotOptions.series.softThreshold) option takes precedence over this\n                 * option.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.softMax\n                 */\n                /**\n                 * A soft minimum for the axis. If the series data minimum is greater\n                 * than this, the axis will stay at this minimum, but if the series\n                 * data minimum is lower, the axis will flex to show all data.\n                 *\n                 * **Note**: The [series.softThreshold](\n                 * #plotOptions.series.softThreshold) option takes precedence over this\n                 * option.\n                 *\n                 * @sample highcharts/yaxis/softmin-softmax/\n                 *         Soft min and max\n                 *\n                 * @type      {number}\n                 * @since     5.0.1\n                 * @product   highcharts highstock gantt\n                 * @apioption yAxis.softMin\n                 */\n                /**\n                 * Defines the horizontal alignment of the stack total label. Can be one\n                 * of `\"left\"`, `\"center\"` or `\"right\"`. The default value is calculated\n                 * at runtime and depends on orientation and whether the stack is\n                 * positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-left/\n                 *         Aligned to the left\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-center/\n                 *         Aligned in center\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-align-right/\n                 *         Aligned to the right\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.align\n                 */\n                /**\n                 * A format string for the data label. Available variables are the same\n                 * as for `formatter`.\n                 *\n                 * @type      {string}\n                 * @default   {total}\n                 * @since     3.0.2\n                 * @product   highcharts highstock\n                 * @apioption yAxis.stackLabels.format\n                 */\n                /**\n                 * Rotation of the labels in degrees.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-rotation/\n                 *         Labels rotated 45°\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.rotation\n                 */\n                /**\n                 * The text alignment for the label. While `align` determines where the\n                 * texts anchor point is placed with regards to the stack, `textAlign`\n                 * determines how the text is aligned against its anchor point. Possible\n                 * values are `\"left\"`, `\"center\"` and `\"right\"`. The default value is\n                 * calculated at runtime and depends on orientation and whether the\n                 * stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-textalign-left/\n                 *         Label in center position but text-aligned left\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.textAlign\n                 */\n                /**\n                 * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the labels.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     3.0\n                 * @product   highcharts highstock\n                 * @apioption yAxis.stackLabels.useHTML\n                 */\n                /**\n                 * Defines the vertical alignment of the stack total label. Can be one\n                 * of `\"top\"`, `\"middle\"` or `\"bottom\"`. The default value is calculated\n                 * at runtime and depends on orientation and whether the stack is\n                 * positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-top/\n                 *         Vertically aligned top\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-middle/\n                 *         Vertically aligned middle\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-verticalalign-bottom/\n                 *         Vertically aligned bottom\n                 *\n                 * @type      {Highcharts.VerticalAlignValue}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.verticalAlign\n                 */\n                /**\n                 * The x position offset of the label relative to the left of the\n                 * stacked bar. The default value is calculated at runtime and depends\n                 * on orientation and whether the stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-x/\n                 *         Stack total labels with x offset\n                 *\n                 * @type      {number}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.x\n                 */\n                /**\n                 * The y position offset of the label relative to the tick position\n                 * on the axis. The default value is calculated at runtime and depends\n                 * on orientation and whether the stack is positive or negative.\n                 *\n                 * @sample {highcharts} highcharts/yaxis/stacklabels-y/\n                 *         Stack total labels with y offset\n                 *\n                 * @type      {number}\n                 * @since     2.1.5\n                 * @product   highcharts\n                 * @apioption yAxis.stackLabels.y\n                 */\n                /**\n                 * Whether to force the axis to start on a tick. Use this option with\n                 * the `maxPadding` option to control the axis start.\n                 *\n                 * This option is always disabled, when panning type is\n                 * either `y` or `xy`.\n                 *\n                 * @see [type](#chart.panning.type)\n                 *\n                 * @sample {highcharts} highcharts/xaxis/startontick-false/\n                 *         False by default\n                 * @sample {highcharts} highcharts/xaxis/startontick-true/\n                 *         True\n                 * @sample {highstock} stock/xaxis/endontick/\n                 *         False for Y axis\n                 *\n                 * @since   1.2.0\n                 * @product highcharts highstock gantt\n                 */\n                startOnTick: true,\n                title: {\n                    /**\n                     * The pixel distance between the axis labels and the title.\n                     * Positive values are outside the axis line, negative are inside.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-margin/\n                     *         Y axis title margin of 60\n                     *\n                     * @type      {number}\n                     * @default   40\n                     * @apioption yAxis.title.margin\n                     */\n                    /**\n                     * The rotation of the text in degrees. 0 is horizontal, 270 is\n                     * vertical reading from bottom to top.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/title-offset/\n                     *         Horizontal\n                     */\n                    rotation: 270,\n                    /**\n                     * The actual text of the axis title. Horizontal texts can contain\n                     * HTML, but rotated texts are painted using vector techniques and\n                     * must be clean text. The Y axis title is disabled by setting the\n                     * `text` option to `undefined`.\n                     *\n                     * @sample {highcharts} highcharts/xaxis/title-text/\n                     *         Custom HTML\n                     *\n                     * @type    {string|null}\n                     * @default {highcharts} Values\n                     * @default {highstock} undefined\n                     * @product highcharts highstock gantt\n                     */\n                    text: 'Values'\n                },\n                /**\n                 * The top position of the Y axis. If it's a number, it is interpreted\n                 * as pixel position relative to the chart.\n                 *\n                 * Since Highcharts 2: If it's a percentage string, it is interpreted as\n                 * percentages of the plot height, offset from plot area top.\n                 *\n                 * @see [yAxis.height](#yAxis.height)\n                 *\n                 * @sample {highstock} stock/demo/candlestick-and-volume/\n                 *         Percentage height panes\n                 *\n                 * @type      {number|string}\n                 * @product   highcharts highstock\n                 * @apioption yAxis.top\n                 */\n                /**\n                 * The stack labels show the total value for each bar in a stacked\n                 * column or bar chart. The label will be placed on top of positive\n                 * columns and below negative columns. In case of an inverted column\n                 * chart or a bar chart the label is placed to the right of positive\n                 * bars and to the left of negative bars.\n                 *\n                 * @product highcharts\n                 */\n                stackLabels: {\n                    /**\n                     * Allow the stack labels to overlap.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-allowoverlap-false/\n                     *         Default false\n                     *\n                     * @since   5.0.13\n                     * @product highcharts\n                     */\n                    allowOverlap: false,\n                    /**\n                     * The background color or gradient for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {Highcharts.ColorType}\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.backgroundColor\n                     */\n                    /**\n                     * The border color for the stack label. Defaults to `undefined`.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {Highcharts.ColorType}\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderColor\n                     */\n                    /**\n                     * The border radius in pixels for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {number}\n                     * @default   0\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderRadius\n                     */\n                    /**\n                     * The border width in pixels for the stack label.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-box/\n                     *          Stack labels box options\n                     * @type      {number}\n                     * @default   0\n                     * @since 8.1.0\n                     * @apioption yAxis.stackLabels.borderWidth\n                     */\n                    /**\n                     * Enable or disable the stack total labels.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-enabled/\n                     *         Enabled stack total labels\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-enabled-waterfall/\n                     *         Enabled stack labels in waterfall chart\n                     *\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    enabled: false,\n                    /**\n                     * Whether to hide stack labels that are outside the plot area.\n                     * By default, the stack label is moved\n                     * inside the plot area according to the\n                     * [overflow](/highcharts/#yAxis/stackLabels/overflow)\n                     * option.\n                     *\n                     * @type  {boolean}\n                     * @since 7.1.3\n                     */\n                    crop: true,\n                    /**\n                     * How to handle stack total labels that flow outside the plot area.\n                     * The default is set to `\"justify\"`,\n                     * which aligns them inside the plot area.\n                     * For columns and bars, this means it will be moved inside the bar.\n                     * To display stack labels outside the plot area,\n                     * set `crop` to `false` and `overflow` to `\"allow\"`.\n                     *\n                     * @sample highcharts/yaxis/stacklabels-overflow/\n                     *         Stack labels flows outside the plot area.\n                     *\n                     * @type  {Highcharts.DataLabelsOverflowValue}\n                     * @since 7.1.3\n                     */\n                    overflow: 'justify',\n                    /* eslint-disable valid-jsdoc */\n                    /**\n                     * Callback JavaScript function to format the label. The value is\n                     * given by `this.total`.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-formatter/\n                     *         Added units to stack total value\n                     *\n                     * @type    {Highcharts.FormatterCallbackFunction<Highcharts.StackItemObject>}\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    formatter: function () {\n                        var numberFormatter = this.axis.chart.numberFormatter;\n                        /* eslint-enable valid-jsdoc */\n                        return numberFormatter(this.total, -1);\n                    },\n                    /**\n                     * CSS styles for the label.\n                     *\n                     * In styled mode, the styles are set in the\n                     * `.highcharts-stack-label` class.\n                     *\n                     * @sample {highcharts} highcharts/yaxis/stacklabels-style/\n                     *         Red stack total labels\n                     *\n                     * @type    {Highcharts.CSSObject}\n                     * @since   2.1.5\n                     * @product highcharts\n                     */\n                    style: {\n                        /** @internal */\n                        color: '#000000',\n                        /** @internal */\n                        fontSize: '11px',\n                        /** @internal */\n                        fontWeight: 'bold',\n                        /** @internal */\n                        textOutline: '1px contrast'\n                    }\n                },\n                gridLineWidth: 1,\n                lineWidth: 0\n                // tickWidth: 0\n            };\n            /**\n             * The Z axis or depth axis for 3D plots.\n             *\n             * See the [Axis class](/class-reference/Highcharts.Axis) for programmatic\n             * access to the axis.\n             *\n             * @sample {highcharts} highcharts/3d/scatter-zaxis-categories/\n             *         Z-Axis with Categories\n             * @sample {highcharts} highcharts/3d/scatter-zaxis-grid/\n             *         Z-Axis with styling\n             *\n             * @type      {*|Array<*>}\n             * @extends   xAxis\n             * @since     5.0.0\n             * @product   highcharts\n             * @excluding breaks, crosshair, height, left, lineColor, lineWidth,\n             *            nameToX, showEmpty, top, width\n             * @apioption zAxis\n             *\n             * @private\n             */\n            // This variable extends the defaultOptions for left axes.\n            Axis.defaultLeftAxisOptions = {\n                labels: {\n                    x: -15\n                },\n                title: {\n                    rotation: 270\n                }\n            };\n            // This variable extends the defaultOptions for right axes.\n            Axis.defaultRightAxisOptions = {\n                labels: {\n                    x: 15\n                },\n                title: {\n                    rotation: 90\n                }\n            };\n            // This variable extends the defaultOptions for bottom axes.\n            Axis.defaultBottomAxisOptions = {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined,\n                    // staggerLines: null\n                },\n                margin: 15,\n                title: {\n                    rotation: 0\n                }\n            };\n            // This variable extends the defaultOptions for top axes.\n            Axis.defaultTopAxisOptions = {\n                labels: {\n                    autoRotation: [-45],\n                    x: 0\n                    // overflow: undefined\n                    // staggerLines: null\n                },\n                margin: 15,\n                title: {\n                    rotation: 0\n                }\n            };\n            // Properties to survive after destroy, needed for Axis.update (#4317,\n            // #5773, #5881).\n            Axis.keepProps = ['extKey', 'hcEvents', 'names', 'series', 'userMax', 'userMin'];\n            return Axis;\n        }());\n        H.Axis = Axis;\n\n        return H.Axis;\n    });\n    _registerModule(_modules, 'parts/DateTimeAxis.js', [_modules['parts/Axis.js'], _modules['parts/Utilities.js']], function (Axis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            getMagnitude = U.getMagnitude,\n            normalizeTickInterval = U.normalizeTickInterval,\n            timeUnits = U.timeUnits;\n        /* eslint-disable valid-jsdoc */\n        var DateTimeAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function DateTimeAxisAdditions(axis) {\n                    this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Get a normalized tick interval for dates. Returns a configuration object\n             * with unit range (interval), count and name. Used to prepare data for\n             * `getTimeTicks`. Previously this logic was part of getTimeTicks, but as\n             * `getTimeTicks` now runs of segments in stock charts, the normalizing\n             * logic was extracted in order to prevent it for running over again for\n             * each segment having the same interval. #662, #697.\n             * @private\n             */\n            /**\n             * Get a normalized tick interval for dates. Returns a configuration object\n             * with unit range (interval), count and name. Used to prepare data for\n             * `getTimeTicks`. Previously this logic was part of getTimeTicks, but as\n             * `getTimeTicks` now runs of segments in stock charts, the normalizing\n             * logic was extracted in order to prevent it for running over again for\n             * each segment having the same interval. #662, #697.\n             * @private\n             */\n            DateTimeAxisAdditions.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {\n                var units = unitsOption || [[\n                            'millisecond',\n                            [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n                        ],\n                    [\n                            'second',\n                            [1, 2, 5, 10, 15, 30]\n                        ],\n                    [\n                            'minute',\n                            [1, 2, 5, 10, 15, 30]\n                        ],\n                    [\n                            'hour',\n                            [1, 2, 3, 4, 6, 8, 12]\n                        ],\n                    [\n                            'day',\n                            [1, 2]\n                        ],\n                    [\n                            'week',\n                            [1, 2]\n                        ],\n                    [\n                            'month',\n                            [1, 2, 3, 4, 6]\n                        ],\n                    [\n                            'year',\n                            null\n                        ]],\n                    unit = units[units.length - 1], // default unit is years\n                    interval = timeUnits[unit[0]],\n                    multiples = unit[1],\n                    count,\n                    i;\n                // loop through the units to find the one that best fits the\n                // tickInterval\n                for (i = 0; i < units.length; i++) {\n                    unit = units[i];\n                    interval = timeUnits[unit[0]];\n                    multiples = unit[1];\n                    if (units[i + 1]) {\n                        // lessThan is in the middle between the highest multiple and\n                        // the next unit.\n                        var lessThan = (interval *\n                                multiples[multiples.length - 1] +\n                                timeUnits[units[i + 1][0]]) / 2;\n                        // break and keep the current unit\n                        if (tickInterval <= lessThan) {\n                            break;\n                        }\n                    }\n                }\n                // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n                if (interval === timeUnits.year && tickInterval < 5 * interval) {\n                    multiples = [1, 2, 5];\n                }\n                // get the count\n                count = normalizeTickInterval(tickInterval / interval, multiples, unit[0] === 'year' ? // #1913, #2360\n                    Math.max(getMagnitude(tickInterval / interval), 1) :\n                    1);\n                return {\n                    unitRange: interval,\n                    count: count,\n                    unitName: unit[0]\n                };\n            };\n            return DateTimeAxisAdditions;\n        }());\n        /**\n         * Date and time support for axes.\n         *\n         * @private\n         * @class\n         */\n        var DateTimeAxis = /** @class */ (function () {\n                function DateTimeAxis() {\n                }\n                /* *\n                 *\n                 *  Static Functions\n                 *\n                 * */\n                /**\n                 * Extends axis class with date and time support.\n                 * @private\n                 */\n                DateTimeAxis.compose = function (AxisClass) {\n                    AxisClass.keepProps.push('dateTime');\n                var axisProto = AxisClass.prototype;\n                /**\n                 * Set the tick positions to a time unit that makes sense, for example\n                 * on the first of each month or on every Monday. Return an array with\n                 * the time positions. Used in datetime axes as well as for grouping\n                 * data on a datetime axis.\n                 *\n                 * @private\n                 * @function Highcharts.Axis#getTimeTicks\n                 *\n                 * @param {Highcharts.TimeNormalizeObject} normalizedInterval\n                 * The interval in axis values (ms) and thecount.\n                 *\n                 * @param {number} min\n                 * The minimum in axis values.\n                 *\n                 * @param {number} max\n                 * The maximum in axis values.\n                 *\n                 * @param {number} startOfWeek\n                 *\n                 * @return {Highcharts.AxisTickPositionsArray}\n                 */\n                axisProto.getTimeTicks = function () {\n                    return this.chart.time.getTimeTicks.apply(this.chart.time, arguments);\n                };\n                /* eslint-disable no-invalid-this */\n                addEvent(AxisClass, 'init', function (e) {\n                    var axis = this;\n                    var options = e.userOptions;\n                    if (options.type !== 'datetime') {\n                        axis.dateTime = void 0;\n                        return;\n                    }\n                    if (!axis.dateTime) {\n                        axis.dateTime = new DateTimeAxisAdditions(axis);\n                    }\n                });\n                /* eslint-enable no-invalid-this */\n            };\n            /* *\n             *\n             *  Static Properties\n             *\n             * */\n            DateTimeAxis.AdditionsClass = DateTimeAxisAdditions;\n            return DateTimeAxis;\n        }());\n        DateTimeAxis.compose(Axis);\n\n        return DateTimeAxis;\n    });\n    _registerModule(_modules, 'parts/LogarithmicAxis.js', [_modules['parts/Axis.js'], _modules['parts/Utilities.js']], function (Axis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            getMagnitude = U.getMagnitude,\n            normalizeTickInterval = U.normalizeTickInterval,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Provides logarithmic support for axes.\n         *\n         * @private\n         * @class\n         */\n        var LogarithmicAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function LogarithmicAxisAdditions(axis) {\n                    this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set the tick positions of a logarithmic axis.\n             */\n            LogarithmicAxisAdditions.prototype.getLogTickPositions = function (interval, min, max, minor) {\n                var log = this;\n                var axis = log.axis;\n                var axisLength = axis.len;\n                var options = axis.options;\n                // Since we use this method for both major and minor ticks,\n                // use a local variable and return the result\n                var positions = [];\n                // Reset\n                if (!minor) {\n                    log.minorAutoInterval = void 0;\n                }\n                // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n                if (interval >= 0.5) {\n                    interval = Math.round(interval);\n                    positions = axis.getLinearTickPositions(interval, min, max);\n                    // Second case: We need intermediary ticks. For example\n                    // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n                }\n                else if (interval >= 0.08) {\n                    var roundedMin = Math.floor(min),\n                        intermediate,\n                        i,\n                        j,\n                        len,\n                        pos,\n                        lastPos,\n                        break2;\n                    if (interval > 0.3) {\n                        intermediate = [1, 2, 4];\n                        // 0.2 equals five minor ticks per 1, 10, 100 etc\n                    }\n                    else if (interval > 0.15) {\n                        intermediate = [1, 2, 4, 6, 8];\n                    }\n                    else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n                        intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n                    }\n                    for (i = roundedMin; i < max + 1 && !break2; i++) {\n                        len = intermediate.length;\n                        for (j = 0; j < len && !break2; j++) {\n                            pos = log.log2lin(log.lin2log(i) * intermediate[j]);\n                            // #1670, lastPos is #3113\n                            if (pos > min &&\n                                (!minor || lastPos <= max) &&\n                                typeof lastPos !== 'undefined') {\n                                positions.push(lastPos);\n                            }\n                            if (lastPos > max) {\n                                break2 = true;\n                            }\n                            lastPos = pos;\n                        }\n                    }\n                    // Third case: We are so deep in between whole logarithmic values that\n                    // we might as well handle the tick positions like a linear axis. For\n                    // example 1.01, 1.02, 1.03, 1.04.\n                }\n                else {\n                    var realMin = log.lin2log(min),\n                        realMax = log.lin2log(max),\n                        tickIntervalOption = minor ?\n                            axis.getMinorTickInterval() :\n                            options.tickInterval,\n                        filteredTickIntervalOption = tickIntervalOption === 'auto' ?\n                            null :\n                            tickIntervalOption,\n                        tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n                        totalPixelLength = minor ?\n                            axisLength / axis.tickPositions.length :\n                            axisLength;\n                    interval = pick(filteredTickIntervalOption, log.minorAutoInterval, (realMax - realMin) *\n                        tickPixelIntervalOption / (totalPixelLength || 1));\n                    interval = normalizeTickInterval(interval, void 0, getMagnitude(interval));\n                    positions = axis.getLinearTickPositions(interval, realMin, realMax).map(log.log2lin);\n                    if (!minor) {\n                        log.minorAutoInterval = interval / 5;\n                    }\n                }\n                // Set the axis-level tickInterval variable\n                if (!minor) {\n                    axis.tickInterval = interval;\n                }\n                return positions;\n            };\n            LogarithmicAxisAdditions.prototype.lin2log = function (num) {\n                return Math.pow(10, num);\n            };\n            LogarithmicAxisAdditions.prototype.log2lin = function (num) {\n                return Math.log(num) / Math.LN10;\n            };\n            return LogarithmicAxisAdditions;\n        }());\n        var LogarithmicAxis = /** @class */ (function () {\n                function LogarithmicAxis() {\n                }\n                /**\n                 * Provides logarithmic support for axes.\n                 *\n                 * @private\n                 */\n                LogarithmicAxis.compose = function (AxisClass) {\n                    AxisClass.keepProps.push('logarithmic');\n                // HC <= 8 backwards compatibility, allow wrapping\n                // Axis.prototype.lin2log and log2lin\n                // @todo Remove this in next major\n                var axisProto = AxisClass.prototype;\n                var logAxisProto = LogarithmicAxisAdditions.prototype;\n                axisProto.log2lin = logAxisProto.log2lin;\n                axisProto.lin2log = logAxisProto.lin2log;\n                /* eslint-disable no-invalid-this */\n                addEvent(AxisClass, 'init', function (e) {\n                    var axis = this;\n                    var options = e.userOptions;\n                    var logarithmic = axis.logarithmic;\n                    if (options.type !== 'logarithmic') {\n                        axis.logarithmic = void 0;\n                    }\n                    else {\n                        if (!logarithmic) {\n                            logarithmic = axis.logarithmic = new LogarithmicAxisAdditions(axis);\n                        }\n                        // HC <= 8 backwards compatibility, allow wrapping\n                        // Axis.prototype.lin2log and log2lin\n                        // @todo Remove this in next major\n                        if (axis.log2lin !== logarithmic.log2lin) {\n                            logarithmic.log2lin = axis.log2lin.bind(axis);\n                        }\n                        if (axis.lin2log !== logarithmic.lin2log) {\n                            logarithmic.lin2log = axis.lin2log.bind(axis);\n                        }\n                    }\n                });\n                addEvent(AxisClass, 'afterInit', function () {\n                    var axis = this;\n                    var log = axis.logarithmic;\n                    // extend logarithmic axis\n                    if (log) {\n                        axis.lin2val = function (num) {\n                            return log.lin2log(num);\n                        };\n                        axis.val2lin = function (num) {\n                            return log.log2lin(num);\n                        };\n                    }\n                });\n            };\n            return LogarithmicAxis;\n        }());\n        LogarithmicAxis.compose(Axis); // @todo move to factory functions\n\n        return LogarithmicAxis;\n    });\n    _registerModule(_modules, 'parts/PlotLineOrBand.js', [_modules['parts/Axis.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Axis, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Options for plot bands on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotBandsOptions|Highcharts.YAxisPlotBandsOptions|Highcharts.ZAxisPlotBandsOptions} Highcharts.AxisPlotBandsOptions\n         */\n        /**\n         * Options for plot band labels on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotBandsLabelOptions|Highcharts.YAxisPlotBandsLabelOptions|Highcharts.ZAxisPlotBandsLabelOptions} Highcharts.AxisPlotBandsLabelOptions\n         */\n        /**\n         * Options for plot lines on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotLinesOptions|Highcharts.YAxisPlotLinesOptions|Highcharts.ZAxisPlotLinesOptions} Highcharts.AxisPlotLinesOptions\n         */\n        /**\n         * Options for plot line labels on axes.\n         *\n         * @typedef {Highcharts.XAxisPlotLinesLabelOptions|Highcharts.YAxisPlotLinesLabelOptions|Highcharts.ZAxisPlotLinesLabelOptions} Highcharts.AxisPlotLinesLabelOptions\n         */\n        var arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The object wrapper for plot lines and plot bands\n         *\n         * @class\n         * @name Highcharts.PlotLineOrBand\n         *\n         * @param {Highcharts.Axis} axis\n         *\n         * @param {Highcharts.AxisPlotLinesOptions|Highcharts.AxisPlotBandsOptions} [options]\n         */\n        var PlotLineOrBand = /** @class */ (function () {\n                function PlotLineOrBand(axis, options) {\n                    this.axis = axis;\n                if (options) {\n                    this.options = options;\n                    this.id = options.id;\n                }\n            }\n            /**\n             * Render the plot line or plot band. If it is already existing,\n             * move it.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#render\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             */\n            PlotLineOrBand.prototype.render = function () {\n                H.fireEvent(this, 'render');\n                var plotLine = this,\n                    axis = plotLine.axis,\n                    horiz = axis.horiz,\n                    log = axis.logarithmic,\n                    options = plotLine.options,\n                    optionsLabel = options.label,\n                    label = plotLine.label,\n                    to = options.to,\n                    from = options.from,\n                    value = options.value,\n                    isBand = defined(from) && defined(to),\n                    isLine = defined(value),\n                    svgElem = plotLine.svgElem,\n                    isNew = !svgElem,\n                    path = [],\n                    color = options.color,\n                    zIndex = pick(options.zIndex, 0),\n                    events = options.events,\n                    attribs = {\n                        'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') +\n                            (options.className || '')\n                    },\n                    groupAttribs = {},\n                    renderer = axis.chart.renderer,\n                    groupName = isBand ? 'bands' : 'lines',\n                    group;\n                // logarithmic conversion\n                if (log) {\n                    from = log.log2lin(from);\n                    to = log.log2lin(to);\n                    value = log.log2lin(value);\n                }\n                // Set the presentational attributes\n                if (!axis.chart.styledMode) {\n                    if (isLine) {\n                        attribs.stroke = color || '#999999';\n                        attribs['stroke-width'] = pick(options.width, 1);\n                        if (options.dashStyle) {\n                            attribs.dashstyle =\n                                options.dashStyle;\n                        }\n                    }\n                    else if (isBand) { // plot band\n                        attribs.fill = color || '#e6ebf5';\n                        if (options.borderWidth) {\n                            attribs.stroke = options.borderColor;\n                            attribs['stroke-width'] = options.borderWidth;\n                        }\n                    }\n                }\n                // Grouping and zIndex\n                groupAttribs.zIndex = zIndex;\n                groupName += '-' + zIndex;\n                group = axis.plotLinesAndBandsGroups[groupName];\n                if (!group) {\n                    axis.plotLinesAndBandsGroups[groupName] = group =\n                        renderer.g('plot-' + groupName)\n                            .attr(groupAttribs).add();\n                }\n                // Create the path\n                if (isNew) {\n                    /**\n                     * SVG element of the plot line or band.\n                     *\n                     * @name Highcharts.PlotLineOrBand#svgElement\n                     * @type {Highcharts.SVGElement}\n                     */\n                    plotLine.svgElem = svgElem = renderer\n                        .path()\n                        .attr(attribs)\n                        .add(group);\n                }\n                // Set the path or return\n                if (isLine) {\n                    path = axis.getPlotLinePath({\n                        value: value,\n                        lineWidth: svgElem.strokeWidth(),\n                        acrossPanes: options.acrossPanes\n                    });\n                }\n                else if (isBand) { // plot band\n                    path = axis.getPlotBandPath(from, to, options);\n                }\n                else {\n                    return;\n                }\n                // common for lines and bands\n                // Add events only if they were not added before.\n                if (!plotLine.eventsAdded && events) {\n                    objectEach(events, function (event, eventType) {\n                        svgElem.on(eventType, function (e) {\n                            events[eventType].apply(plotLine, [e]);\n                        });\n                    });\n                    plotLine.eventsAdded = true;\n                }\n                if ((isNew || !svgElem.d) && path && path.length) {\n                    svgElem.attr({ d: path });\n                }\n                else if (svgElem) {\n                    if (path) {\n                        svgElem.show(true);\n                        svgElem.animate({ d: path });\n                    }\n                    else if (svgElem.d) {\n                        svgElem.hide();\n                        if (label) {\n                            plotLine.label = label = label.destroy();\n                        }\n                    }\n                }\n                // the plot band/line label\n                if (optionsLabel &&\n                    (defined(optionsLabel.text) || defined(optionsLabel.formatter)) &&\n                    path &&\n                    path.length &&\n                    axis.width > 0 &&\n                    axis.height > 0 &&\n                    !path.isFlat) {\n                    // apply defaults\n                    optionsLabel = merge({\n                        align: horiz && isBand && 'center',\n                        x: horiz ? !isBand && 4 : 10,\n                        verticalAlign: !horiz && isBand && 'middle',\n                        y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n                        rotation: horiz && !isBand && 90\n                    }, optionsLabel);\n                    this.renderLabel(optionsLabel, path, isBand, zIndex);\n                }\n                else if (label) { // move out of sight\n                    label.hide();\n                }\n                // chainable\n                return plotLine;\n            };\n            /**\n             * Render and align label for plot line or band.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#renderLabel\n             * @param {Highcharts.AxisPlotLinesLabelOptions|Highcharts.AxisPlotBandsLabelOptions} optionsLabel\n             * @param {Highcharts.SVGPathArray} path\n             * @param {boolean} [isBand]\n             * @param {number} [zIndex]\n             * @return {void}\n             */\n            PlotLineOrBand.prototype.renderLabel = function (optionsLabel, path, isBand, zIndex) {\n                var plotLine = this,\n                    label = plotLine.label,\n                    renderer = plotLine.axis.chart.renderer,\n                    attribs,\n                    xBounds,\n                    yBounds,\n                    x,\n                    y,\n                    labelText;\n                // add the SVG element\n                if (!label) {\n                    attribs = {\n                        align: optionsLabel.textAlign || optionsLabel.align,\n                        rotation: optionsLabel.rotation,\n                        'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') +\n                            '-label ' + (optionsLabel.className || '')\n                    };\n                    attribs.zIndex = zIndex;\n                    labelText = this.getLabelText(optionsLabel);\n                    /**\n                     * SVG element of the label.\n                     *\n                     * @name Highcharts.PlotLineOrBand#label\n                     * @type {Highcharts.SVGElement}\n                     */\n                    plotLine.label = label = renderer\n                        .text(labelText, 0, 0, optionsLabel.useHTML)\n                        .attr(attribs)\n                        .add();\n                    if (!this.axis.chart.styledMode) {\n                        label.css(optionsLabel.style);\n                    }\n                }\n                // get the bounding box and align the label\n                // #3000 changed to better handle choice between plotband or plotline\n                xBounds = path.xBounds ||\n                    [path[0][1], path[1][1], (isBand ? path[2][1] : path[0][1])];\n                yBounds = path.yBounds ||\n                    [path[0][2], path[1][2], (isBand ? path[2][2] : path[0][2])];\n                x = arrayMin(xBounds);\n                y = arrayMin(yBounds);\n                label.align(optionsLabel, false, {\n                    x: x,\n                    y: y,\n                    width: arrayMax(xBounds) - x,\n                    height: arrayMax(yBounds) - y\n                });\n                label.show(true);\n            };\n            /**\n             * Get label's text content.\n             *\n             * @private\n             * @function Highcharts.PlotLineOrBand#getLabelText\n             * @param {Highcharts.AxisPlotLinesLabelOptions|Highcharts.AxisPlotBandsLabelOptions} optionsLabel\n             * @return {string}\n             */\n            PlotLineOrBand.prototype.getLabelText = function (optionsLabel) {\n                return defined(optionsLabel.formatter) ?\n                    optionsLabel.formatter\n                        .call(this) :\n                    optionsLabel.text;\n            };\n            /**\n             * Remove the plot line or band.\n             *\n             * @function Highcharts.PlotLineOrBand#destroy\n             * @return {void}\n             */\n            PlotLineOrBand.prototype.destroy = function () {\n                // remove it from the lookup\n                erase(this.axis.plotLinesAndBands, this);\n                delete this.axis;\n                destroyObjectProperties(this);\n            };\n            return PlotLineOrBand;\n        }());\n        /* eslint-enable no-invalid-this, valid-jsdoc */\n        // Object with members for extending the Axis prototype\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n            /**\n             * An array of colored bands stretching across the plot area marking an\n             * interval on the axis.\n             *\n             * In styled mode, the plot bands are styled by the `.highcharts-plot-band`\n             * class in addition to the `className` option.\n             *\n             * @productdesc {highcharts}\n             * In a gauge, a plot band on the Y axis (value axis) will stretch along the\n             * perimeter of the gauge.\n             *\n             * @type      {Array<*>}\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.plotBands\n             */\n            /**\n             * Flag to decide if plotBand should be rendered across all panes.\n             *\n             * @since     7.1.2\n             * @product   highstock\n             * @type      {boolean}\n             * @default   true\n             * @apioption xAxis.plotBands.acrossPanes\n             */\n            /**\n             * Border color for the plot band. Also requires `borderWidth` to be set.\n             *\n             * @type      {Highcharts.ColorString}\n             * @apioption xAxis.plotBands.borderColor\n             */\n            /**\n             * Border width for the plot band. Also requires `borderColor` to be set.\n             *\n             * @type      {number}\n             * @default   0\n             * @apioption xAxis.plotBands.borderWidth\n             */\n            /**\n             * A custom class name, in addition to the default `highcharts-plot-band`,\n             * to apply to each individual band.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption xAxis.plotBands.className\n             */\n            /**\n             * The color of the plot band.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Color band\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #e6ebf5\n             * @apioption xAxis.plotBands.color\n             */\n            /**\n             * An object defining mouse events for the plot band. Supported properties\n             * are `click`, `mouseover`, `mouseout`, `mousemove`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-events/\n             *         Mouse events demonstrated\n             *\n             * @since     1.2\n             * @apioption xAxis.plotBands.events\n             */\n            /**\n             * Click event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.click\n             */\n            /**\n             * Mouse move event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mousemove\n             */\n            /**\n             * Mouse out event on the corner of a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mouseout\n             */\n            /**\n             * Mouse over event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotBands.events.mouseover\n             */\n            /**\n             * The start position of the plot band in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Datetime axis\n             * @sample {highcharts} highcharts/xaxis/plotbands-from/\n             *         Categorized axis\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotBands.from\n             */\n            /**\n             * An id used for identifying the plot band in Axis.removePlotBand.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-id/\n             *         Remove plot band by id\n             * @sample {highstock} highcharts/xaxis/plotbands-id/\n             *         Remove plot band by id\n             *\n             * @type      {string}\n             * @apioption xAxis.plotBands.id\n             */\n            /**\n             * The end position of the plot band in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Datetime axis\n             * @sample {highcharts} highcharts/xaxis/plotbands-from/\n             *         Categorized axis\n             * @sample {highstock} stock/xaxis/plotbands/\n             *         Plot band on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotBands.to\n             */\n            /**\n             * The z index of the plot band within the chart, relative to other\n             * elements. Using the same z index as another element may give\n             * unpredictable results, as the last rendered element will be on top.\n             * Values from 0 to 20 make sense.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-color/\n             *         Behind plot lines by default\n             * @sample {highcharts} highcharts/xaxis/plotbands-zindex/\n             *         Above plot lines\n             * @sample {highcharts} highcharts/xaxis/plotbands-zindex-above-series/\n             *         Above plot lines and series\n             *\n             * @type      {number}\n             * @since     1.2\n             * @apioption xAxis.plotBands.zIndex\n             */\n            /**\n             * Text labels for the plot bands\n             *\n             * @product   highcharts highstock gantt\n             * @apioption xAxis.plotBands.label\n             */\n            /**\n             * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n             * \"right\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n             *         Aligned to the right\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {Highcharts.AlignValue}\n             * @default   center\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.align\n             */\n            /**\n             * Rotation of the text label in degrees .\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n             *         Vertical text\n             *\n             * @type      {number}\n             * @default   0\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.rotation\n             */\n            /**\n             * CSS styles for the text label.\n             *\n             * In styled mode, the labels are styled by the\n             * `.highcharts-plot-band-label` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-style/\n             *         Blue and bold label\n             *\n             * @type      {Highcharts.CSSObject}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.style\n             */\n            /**\n             * The string text itself. A subset of HTML is supported.\n             *\n             * @type      {string}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.text\n             */\n            /**\n             * The text alignment for the label. While `align` determines where the\n             * texts anchor point is placed within the plot band, `textAlign` determines\n             * how the text is aligned against its anchor point. Possible values are\n             * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-rotation/\n             *         Vertical text in center position but text-aligned left\n             *\n             * @type       {Highcharts.AlignValue}\n             * @since      2.1\n             * @apioption  xAxis.plotBands.label.textAlign\n             */\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the labels.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     3.0.3\n             * @apioption xAxis.plotBands.label.useHTML\n             */\n            /**\n             * Vertical alignment of the label relative to the plot band. Can be one of\n             * \"top\", \"middle\" or \"bottom\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-verticalalign/\n             *         Vertically centered label\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type       {Highcharts.VerticalAlignValue}\n             * @default    top\n             * @since      2.1\n             * @apioption  xAxis.plotBands.label.verticalAlign\n             */\n            /**\n             * Horizontal position relative the alignment. Default varies by\n             * orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-align/\n             *         Aligned 10px from the right edge\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.x\n             */\n            /**\n             * Vertical position of the text baseline relative to the alignment. Default\n             * varies by orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-label-y/\n             *         Label on x axis\n             * @sample {highstock} stock/xaxis/plotbands-label/\n             *         Plot band with labels\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotBands.label.y\n             */\n            /**\n             * An array of lines stretching across the plot area, marking a specific\n             * value on one of the axes.\n             *\n             * In styled mode, the plot lines are styled by the\n             * `.highcharts-plot-line` class in addition to the `className` option.\n             *\n             * @type      {Array<*>}\n             * @product   highcharts highstock gantt\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         Basic plot line\n             * @sample {highcharts} highcharts/series-solidgauge/labels-auto-aligned/\n             *         Solid gauge plot line\n             * @apioption xAxis.plotLines\n             */\n            /**\n             * Flag to decide if plotLine should be rendered across all panes.\n             *\n             * @sample {highstock} stock/xaxis/plotlines-acrosspanes/\n             *         Plot lines on different panes\n             *\n             * @since     7.1.2\n             * @product   highstock\n             * @type      {boolean}\n             * @default   true\n             * @apioption xAxis.plotLines.acrossPanes\n             */\n            /**\n             * A custom class name, in addition to the default `highcharts-plot-line`,\n             * to apply to each individual line.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption xAxis.plotLines.className\n             */\n            /**\n             * The color of the line.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         A red line from X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {Highcharts.ColorString}\n             * @default   #999999\n             * @apioption xAxis.plotLines.color\n             */\n            /**\n             * The dashing or dot style for the plot line. For possible values see\n             * [this overview](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-dashstyle-all/).\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-dashstyle/\n             *         Dash and dot pattern\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @default   Solid\n             * @since     1.2\n             * @apioption xAxis.plotLines.dashStyle\n             */\n            /**\n             * An object defining mouse events for the plot line. Supported\n             * properties are `click`, `mouseover`, `mouseout`, `mousemove`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-events/\n             *         Mouse events demonstrated\n             *\n             * @since     1.2\n             * @apioption xAxis.plotLines.events\n             */\n            /**\n             * Click event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.click\n             */\n            /**\n             * Mouse move event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mousemove\n             */\n            /**\n             * Mouse out event on the corner of a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mouseout\n             */\n            /**\n             * Mouse over event on a plot band.\n             *\n             * @type      {Highcharts.EventCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.events.mouseover\n             */\n            /**\n             * An id used for identifying the plot line in Axis.removePlotLine.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             *\n             * @type      {string}\n             * @apioption xAxis.plotLines.id\n             */\n            /**\n             * The position of the line in axis units.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         Between two categories on X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @apioption xAxis.plotLines.value\n             */\n            /**\n             * The width or thickness of the plot line.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-color/\n             *         2px wide line from X axis\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @default   2\n             * @apioption xAxis.plotLines.width\n             */\n            /**\n             * The z index of the plot line within the chart.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-behind/\n             *         Behind plot lines by default\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above/\n             *         Above plot lines\n             * @sample {highcharts} highcharts/xaxis/plotlines-zindex-above-all/\n             *         Above plot lines and series\n             *\n             * @type      {number}\n             * @since     1.2\n             * @apioption xAxis.plotLines.zIndex\n             */\n            /**\n             * Text labels for the plot bands\n             *\n             * @apioption xAxis.plotLines.label\n             */\n            /**\n             * Horizontal alignment of the label. Can be one of \"left\", \"center\" or\n             * \"right\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n             *         Aligned to the right\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type       {Highcharts.AlignValue}\n             * @default    left\n             * @since      2.1\n             * @apioption  xAxis.plotLines.label.align\n             */\n            /**\n             * Callback JavaScript function to format the label. Useful properties like\n             * the value of plot line or the range of plot band (`from` & `to`\n             * properties) can be found in `this.options` object.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-plotbands-label-formatter\n             *         Label formatters for plot line and plot band.\n             * @type      {Highcharts.FormatterCallbackFunction<Highcharts.PlotLineOrBand>}\n             * @apioption xAxis.plotLines.label.formatter\n             */\n            /**\n             * Rotation of the text label in degrees. Defaults to 0 for horizontal plot\n             * lines and 90 for vertical lines.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n             *         Slanted text\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.rotation\n             */\n            /**\n             * CSS styles for the text label.\n             *\n             * In styled mode, the labels are styled by the\n             * `.highcharts-plot-line-label` class.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-style/\n             *         Blue and bold label\n             *\n             * @type      {Highcharts.CSSObject}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.style\n             */\n            /**\n             * The text itself. A subset of HTML is supported.\n             *\n             * @type      {string}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.text\n             */\n            /**\n             * The text alignment for the label. While `align` determines where the\n             * texts anchor point is placed within the plot band, `textAlign` determines\n             * how the text is aligned against its anchor point. Possible values are\n             * \"left\", \"center\" and \"right\". Defaults to the same as the `align` option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-textalign/\n             *         Text label in bottom position\n             *\n             * @type      {Highcharts.AlignValue}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.textAlign\n             */\n            /**\n             * Whether to [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n             * to render the labels.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     3.0.3\n             * @apioption xAxis.plotLines.label.useHTML\n             */\n            /**\n             * Vertical alignment of the label relative to the plot line. Can be\n             * one of \"top\", \"middle\" or \"bottom\".\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-verticalalign-middle/\n             *         Vertically centered label\n             *\n             * @type       {Highcharts.VerticalAlignValue}\n             * @default    {highcharts} top\n             * @default    {highstock} top\n             * @since      2.1\n             * @apioption  xAxis.plotLines.label.verticalAlign\n             */\n            /**\n             * Horizontal position relative the alignment. Default varies by\n             * orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-align-right/\n             *         Aligned 10px from the right edge\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.x\n             */\n            /**\n             * Vertical position of the text baseline relative to the alignment. Default\n             * varies by orientation.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotlines-label-y/\n             *         Label below the plot line\n             * @sample {highstock} stock/xaxis/plotlines/\n             *         Plot line on Y axis\n             *\n             * @type      {number}\n             * @since     2.1\n             * @apioption xAxis.plotLines.label.y\n             */\n            /**\n             *\n             * @type      {Array<*>}\n             * @extends   xAxis.plotBands\n             * @apioption yAxis.plotBands\n             */\n            /**\n             * In a gauge chart, this option determines the inner radius of the\n             * plot band that stretches along the perimeter. It can be given as\n             * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n             * By default, the inner radius is controlled by the [thickness](\n             * #yAxis.plotBands.thickness) option.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.innerRadius\n             */\n            /**\n             * In a gauge chart, this option determines the outer radius of the\n             * plot band that stretches along the perimeter. It can be given as\n             * a percentage string, like `\"100%\"`, or as a pixel number, like `100`.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @default   100%\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.outerRadius\n             */\n            /**\n             * In a gauge chart, this option sets the width of the plot band\n             * stretching along the perimeter. It can be given as a percentage\n             * string, like `\"10%\"`, or as a pixel number, like `10`. The default\n             * value 10 is the same as the default [tickLength](#yAxis.tickLength),\n             * thus making the plot band act as a background for the tick markers.\n             *\n             * @sample {highcharts} highcharts/xaxis/plotbands-gauge\n             *         Gauge plot band\n             *\n             * @type      {number|string}\n             * @default   10\n             * @since     2.3\n             * @product   highcharts\n             * @apioption yAxis.plotBands.thickness\n             */\n            /**\n             * @type      {Array<*>}\n             * @extends   xAxis.plotLines\n             * @apioption yAxis.plotLines\n             */\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Internal function to create the SVG path definition for a plot band.\n             *\n             * @function Highcharts.Axis#getPlotBandPath\n             *\n             * @param {number} from\n             *        The axis value to start from.\n             *\n             * @param {number} to\n             *        The axis value to end on.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The SVG path definition in array form.\n             */\n            getPlotBandPath: function (from, to) {\n                var toPath = this.getPlotLinePath({\n                        value: to,\n                        force: true,\n                        acrossPanes: this.options.acrossPanes\n                    }),\n                    path = this.getPlotLinePath({\n                        value: from,\n                        force: true,\n                        acrossPanes: this.options.acrossPanes\n                    }),\n                    result = [],\n                    i, \n                    // #4964 check if chart is inverted or plotband is on yAxis\n                    horiz = this.horiz,\n                    plus = 1,\n                    isFlat,\n                    outside = (from < this.min && to < this.min) ||\n                        (from > this.max && to > this.max);\n                if (path && toPath) {\n                    // Flat paths don't need labels (#3836)\n                    if (outside) {\n                        isFlat = path.toString() === toPath.toString();\n                        plus = 0;\n                    }\n                    // Go over each subpath - for panes in Highstock\n                    for (i = 0; i < path.length; i += 2) {\n                        var pathStart = path[i],\n                            pathEnd = path[i + 1],\n                            toPathStart = toPath[i],\n                            toPathEnd = toPath[i + 1];\n                        // Type checking all affected path segments. Consider something\n                        // smarter.\n                        if ((pathStart[0] === 'M' || pathStart[0] === 'L') &&\n                            (pathEnd[0] === 'M' || pathEnd[0] === 'L') &&\n                            (toPathStart[0] === 'M' || toPathStart[0] === 'L') &&\n                            (toPathEnd[0] === 'M' || toPathEnd[0] === 'L')) {\n                            // Add 1 pixel when coordinates are the same\n                            if (horiz && toPathStart[1] === pathStart[1]) {\n                                toPathStart[1] += plus;\n                                toPathEnd[1] += plus;\n                            }\n                            else if (!horiz && toPathStart[2] === pathStart[2]) {\n                                toPathStart[2] += plus;\n                                toPathEnd[2] += plus;\n                            }\n                            result.push(['M', pathStart[1], pathStart[2]], ['L', pathEnd[1], pathEnd[2]], ['L', toPathEnd[1], toPathEnd[2]], ['L', toPathStart[1], toPathStart[2]], ['Z']);\n                        }\n                        result.isFlat = isFlat;\n                    }\n                }\n                else { // outside the axis area\n                    path = null;\n                }\n                return result;\n            },\n            /**\n             * Add a plot band after render time.\n             *\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             *\n             * @function Highcharts.Axis#addPlotBand\n             *\n             * @param {Highcharts.AxisPlotBandsOptions} options\n             *        A configuration object for the plot band, as defined in\n             *        [xAxis.plotBands](https://api.highcharts.com/highcharts/xAxis.plotBands).\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             *         The added plot band.\n             */\n            addPlotBand: function (options) {\n                return this.addPlotBandOrLine(options, 'plotBands');\n            },\n            /**\n             * Add a plot line after render time.\n             *\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             *\n             * @function Highcharts.Axis#addPlotLine\n             *\n             * @param {Highcharts.AxisPlotLinesOptions} options\n             *        A configuration object for the plot line, as defined in\n             *        [xAxis.plotLines](https://api.highcharts.com/highcharts/xAxis.plotLines).\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             *         The added plot line.\n             */\n            addPlotLine: function (options) {\n                return this.addPlotBandOrLine(options, 'plotLines');\n            },\n            /**\n             * Add a plot band or plot line after render time. Called from addPlotBand\n             * and addPlotLine internally.\n             *\n             * @private\n             * @function Highcharts.Axis#addPlotBandOrLine\n             *\n             * @param {Highcharts.AxisPlotBandsOptions|Highcharts.AxisPlotLinesOptions} options\n             *        The plotBand or plotLine configuration object.\n             *\n             * @param {\"plotBands\"|\"plotLines\"} [coll]\n             *\n             * @return {Highcharts.PlotLineOrBand|undefined}\n             */\n            addPlotBandOrLine: function (options, coll) {\n                var obj = new PlotLineOrBand(this,\n                    options).render(),\n                    userOptions = this.userOptions;\n                if (obj) { // #2189\n                    // Add it to the user options for exporting and Axis.update\n                    if (coll) {\n                        // Workaround Microsoft/TypeScript issue #32693\n                        var updatedOptions = (userOptions[coll] || []);\n                        updatedOptions.push(options);\n                        userOptions[coll] = updatedOptions;\n                    }\n                    this.plotLinesAndBands.push(obj);\n                    this._addedPlotLB = true;\n                }\n                return obj;\n            },\n            /**\n             * Remove a plot band or plot line from the chart by id. Called internally\n             * from `removePlotBand` and `removePlotLine`.\n             *\n             * @private\n             * @function Highcharts.Axis#removePlotBandOrLine\n             * @param {string} id\n             * @return {void}\n             */\n            removePlotBandOrLine: function (id) {\n                var plotLinesAndBands = this.plotLinesAndBands,\n                    options = this.options,\n                    userOptions = this.userOptions,\n                    i = plotLinesAndBands.length;\n                while (i--) {\n                    if (plotLinesAndBands[i].id === id) {\n                        plotLinesAndBands[i].destroy();\n                    }\n                }\n                ([\n                    options.plotLines || [],\n                    userOptions.plotLines || [],\n                    options.plotBands || [],\n                    userOptions.plotBands || []\n                ]).forEach(function (arr) {\n                    i = arr.length;\n                    while (i--) {\n                        if ((arr[i] || {}).id === id) {\n                            erase(arr, arr[i]);\n                        }\n                    }\n                });\n            },\n            /**\n             * Remove a plot band by its id.\n             *\n             * @sample highcharts/members/axis-removeplotband/\n             *         Remove plot band by id\n             * @sample highcharts/members/axis-addplotband/\n             *         Toggle the plot band from a button\n             *\n             * @function Highcharts.Axis#removePlotBand\n             *\n             * @param {string} id\n             *        The plot band's `id` as given in the original configuration\n             *        object or in the `addPlotBand` option.\n             *\n             * @return {void}\n             */\n            removePlotBand: function (id) {\n                this.removePlotBandOrLine(id);\n            },\n            /**\n             * Remove a plot line by its id.\n             *\n             * @sample highcharts/xaxis/plotlines-id/\n             *         Remove plot line by id\n             * @sample highcharts/members/axis-addplotline/\n             *         Toggle the plot line from a button\n             *\n             * @function Highcharts.Axis#removePlotLine\n             *\n             * @param {string} id\n             *        The plot line's `id` as given in the original configuration\n             *        object or in the `addPlotLine` option.\n             */\n            removePlotLine: function (id) {\n                this.removePlotBandOrLine(id);\n            }\n        });\n        H.PlotLineOrBand = PlotLineOrBand;\n\n        return H.PlotLineOrBand;\n    });\n    _registerModule(_modules, 'parts/Tooltip.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var doc = H.doc;\n        var clamp = U.clamp,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            pick = U.pick,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout,\n            timeUnits = U.timeUnits;\n        /**\n         * Callback function to format the text of the tooltip from scratch.\n         *\n         * In case of single or shared tooltips, a string should be be returned. In case\n         * of splitted tooltips, it should return an array where the first item is the\n         * header, and subsequent items are mapped to the points. Return `false` to\n         * disable tooltip for a specific point on series.\n         *\n         * @callback Highcharts.TooltipFormatterCallbackFunction\n         *\n         * @param {Highcharts.TooltipFormatterContextObject} this\n         *        Context to format\n         *\n         * @param {Highcharts.Tooltip} tooltip\n         *        The tooltip instance\n         *\n         * @return {false|string|Array<(string|null|undefined)>|null|undefined}\n         *         Formatted text or false\n         */\n        /**\n         * @interface Highcharts.TooltipFormatterContextObject\n         */ /**\n        * @name Highcharts.TooltipFormatterContextObject#color\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#colorIndex\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#key\n        * @type {number}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#percentage\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#points\n        * @type {Array<Highcharts.TooltipFormatterContextObject>|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#series\n        * @type {Highcharts.Series}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#total\n        * @type {number|undefined}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#x\n        * @type {number}\n        */ /**\n        * @name Highcharts.TooltipFormatterContextObject#y\n        * @type {number}\n        */\n        /**\n         * A callback function to place the tooltip in a specific position.\n         *\n         * @callback Highcharts.TooltipPositionerCallbackFunction\n         *\n         * @param {Highcharts.Tooltip} this\n         * Tooltip context of the callback.\n         *\n         * @param {number} labelWidth\n         * Width of the tooltip.\n         *\n         * @param {number} labelHeight\n         * Height of the tooltip.\n         *\n         * @param {Highcharts.Point|Highcharts.TooltipPositionerPointObject} point\n         * Point information for positioning a tooltip.\n         *\n         * @return {Highcharts.PositionObject}\n         * New position for the tooltip.\n         */\n        /**\n         * Point information for positioning a tooltip.\n         *\n         * @interface Highcharts.TooltipPositionerPointObject\n         */ /**\n        * If `tooltip.split` option is enabled and positioner is called for each of the\n        * boxes separately, this property indicates the call on the xAxis header, which\n        * is not a point itself.\n        * @name Highcharts.TooltipPositionerPointObject#isHeader\n        * @type {boolean}\n        */ /**\n        * The reference point relative to the plot area. Add chart.plotLeft to get the\n        * full coordinates.\n        * @name Highcharts.TooltipPositionerPointObject#plotX\n        * @type {number}\n        */ /**\n        * The reference point relative to the plot area. Add chart.plotTop to get the\n        * full coordinates.\n        * @name Highcharts.TooltipPositionerPointObject#plotY\n        * @type {number}\n        */\n        /**\n         * @typedef {\"callout\"|\"circle\"|\"square\"} Highcharts.TooltipShapeValue\n         */\n        ''; // separates doclets above from variables below\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Tooltip of a chart.\n         *\n         * @class\n         * @name Highcharts.Tooltip\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.TooltipOptions} options\n         * Tooltip options.\n         */\n        var Tooltip = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Tooltip(chart, options) {\n                    this.container = void 0;\n                this.crosshairs = [];\n                this.distance = 0;\n                this.isHidden = true;\n                this.isSticky = false;\n                this.now = {};\n                this.options = {};\n                this.outside = false;\n                this.chart = chart;\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * In styled mode, apply the default filter for the tooltip drop-shadow. It\n             * needs to have an id specific to the chart, otherwise there will be issues\n             * when one tooltip adopts the filter of a different chart, specifically one\n             * where the container is hidden.\n             *\n             * @private\n             * @function Highcharts.Tooltip#applyFilter\n             */\n            Tooltip.prototype.applyFilter = function () {\n                var chart = this.chart;\n                chart.renderer.definition({\n                    tagName: 'filter',\n                    id: 'drop-shadow-' + chart.index,\n                    opacity: 0.5,\n                    children: [{\n                            tagName: 'feGaussianBlur',\n                            'in': 'SourceAlpha',\n                            stdDeviation: 1\n                        }, {\n                            tagName: 'feOffset',\n                            dx: 1,\n                            dy: 1\n                        }, {\n                            tagName: 'feComponentTransfer',\n                            children: [{\n                                    tagName: 'feFuncA',\n                                    type: 'linear',\n                                    slope: 0.3\n                                }]\n                        }, {\n                            tagName: 'feMerge',\n                            children: [{\n                                    tagName: 'feMergeNode'\n                                }, {\n                                    tagName: 'feMergeNode',\n                                    'in': 'SourceGraphic'\n                                }]\n                        }]\n                });\n                chart.renderer.definition({\n                    tagName: 'style',\n                    textContent: '.highcharts-tooltip-' + chart.index + '{' +\n                        'filter:url(#drop-shadow-' + chart.index + ')' +\n                        '}'\n                });\n            };\n            /**\n             * Build the body (lines) of the tooltip by iterating over the items and\n             * returning one entry for each item, abstracting this functionality allows\n             * to easily overwrite and extend it.\n             *\n             * @private\n             * @function Highcharts.Tooltip#bodyFormatter\n             * @param {Array<(Highcharts.Point|Highcharts.Series)>} items\n             * @return {Array<string>}\n             */\n            Tooltip.prototype.bodyFormatter = function (items) {\n                return items.map(function (item) {\n                    var tooltipOptions = item.series.tooltipOptions;\n                    return (tooltipOptions[(item.point.formatPrefix || 'point') + 'Formatter'] ||\n                        item.point.tooltipFormatter).call(item.point, tooltipOptions[(item.point.formatPrefix || 'point') + 'Format'] || '');\n                });\n            };\n            /**\n             * Destroy the single tooltips in a split tooltip.\n             * If the tooltip is active then it is not destroyed, unless forced to.\n             *\n             * @private\n             * @function Highcharts.Tooltip#cleanSplit\n             *\n             * @param {boolean} [force]\n             *        Force destroy all tooltips.\n             */\n            Tooltip.prototype.cleanSplit = function (force) {\n                this.chart.series.forEach(function (series) {\n                    var tt = series && series.tt;\n                    if (tt) {\n                        if (!tt.isActive || force) {\n                            series.tt = tt.destroy();\n                        }\n                        else {\n                            tt.isActive = false;\n                        }\n                    }\n                });\n            };\n            /**\n             * In case no user defined formatter is given, this will be used. Note that\n             * the context here is an object holding point, series, x, y etc.\n             *\n             * @function Highcharts.Tooltip#defaultFormatter\n             *\n             * @param {Highcharts.Tooltip} tooltip\n             *\n             * @return {Array<string>}\n             */\n            Tooltip.prototype.defaultFormatter = function (tooltip) {\n                var items = this.points || splat(this),\n                    s;\n                // Build the header\n                s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n                // build the values\n                s = s.concat(tooltip.bodyFormatter(items));\n                // footer\n                s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n                return s;\n            };\n            /**\n             * Removes and destroys the tooltip and its elements.\n             *\n             * @function Highcharts.Tooltip#destroy\n             */\n            Tooltip.prototype.destroy = function () {\n                // Destroy and clear local variables\n                if (this.label) {\n                    this.label = this.label.destroy();\n                }\n                if (this.split && this.tt) {\n                    this.cleanSplit(this.chart, true);\n                    this.tt = this.tt.destroy();\n                }\n                if (this.renderer) {\n                    this.renderer = this.renderer.destroy();\n                    discardElement(this.container);\n                }\n                U.clearTimeout(this.hideTimer);\n                U.clearTimeout(this.tooltipTimeout);\n            };\n            /**\n             * Extendable method to get the anchor position of the tooltip\n             * from a point or set of points\n             *\n             * @private\n             * @function Highcharts.Tooltip#getAnchor\n             *\n             * @param {Highcharts.Point|Array<Highcharts.Point>} points\n             *\n             * @param {Highcharts.PointerEventObject} [mouseEvent]\n             *\n             * @return {Array<number>}\n             */\n            Tooltip.prototype.getAnchor = function (points, mouseEvent) {\n                var ret,\n                    chart = this.chart,\n                    pointer = chart.pointer,\n                    inverted = chart.inverted,\n                    plotTop = chart.plotTop,\n                    plotLeft = chart.plotLeft,\n                    plotX = 0,\n                    plotY = 0,\n                    yAxis,\n                    xAxis;\n                points = splat(points);\n                // When tooltip follows mouse, relate the position to the mouse\n                if (this.followPointer && mouseEvent) {\n                    if (typeof mouseEvent.chartX === 'undefined') {\n                        mouseEvent = pointer.normalize(mouseEvent);\n                    }\n                    ret = [\n                        mouseEvent.chartX - plotLeft,\n                        mouseEvent.chartY - plotTop\n                    ];\n                    // Some series types use a specificly calculated tooltip position for\n                    // each point\n                }\n                else if (points[0].tooltipPos) {\n                    ret = points[0].tooltipPos;\n                    // When shared, use the average position\n                }\n                else {\n                    points.forEach(function (point) {\n                        yAxis = point.series.yAxis;\n                        xAxis = point.series.xAxis;\n                        plotX += point.plotX +\n                            (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n                        plotY += (point.plotLow ?\n                            (point.plotLow + point.plotHigh) / 2 :\n                            point.plotY) + (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n                    });\n                    plotX /= points.length;\n                    plotY /= points.length;\n                    ret = [\n                        inverted ? chart.plotWidth - plotY : plotX,\n                        this.shared && !inverted && points.length > 1 && mouseEvent ?\n                            // place shared tooltip next to the mouse (#424)\n                            mouseEvent.chartY - plotTop :\n                            inverted ? chart.plotHeight - plotX : plotY\n                    ];\n                }\n                return ret.map(Math.round);\n            };\n            /**\n             * Get the optimal date format for a point, based on a range.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getDateFormat\n             *\n             * @param {number} range\n             *        The time range\n             *\n             * @param {number} date\n             *        The date of the point in question\n             *\n             * @param {number} startOfWeek\n             *        An integer representing the first day of the week, where 0 is\n             *        Sunday.\n             *\n             * @param {Highcharts.Dictionary<string>} dateTimeLabelFormats\n             *        A map of time units to formats.\n             *\n             * @return {string}\n             *         The optimal date format for a point.\n             */\n            Tooltip.prototype.getDateFormat = function (range, date, startOfWeek, dateTimeLabelFormats) {\n                var time = this.chart.time, dateStr = time.dateFormat('%m-%d %H:%M:%S.%L', date), format, n, blank = '01-01 00:00:00.000', strpos = {\n                        millisecond: 15,\n                        second: 12,\n                        minute: 9,\n                        hour: 6,\n                        day: 3\n                    }, lastN = 'millisecond'; // for sub-millisecond data, #4223\n                    for (n in timeUnits) { // eslint-disable-line guard-for-in\n                        // If the range is exactly one week and we're looking at a\n                        // Sunday/Monday, go for the week format\n                        if (range === timeUnits.week &&\n                            +time.dateFormat('%w', date) === startOfWeek &&\n                            dateStr.substr(6) === blank.substr(6)) {\n                            n = 'week';\n                        break;\n                    }\n                    // The first format that is too great for the range\n                    if (timeUnits[n] > range) {\n                        n = lastN;\n                        break;\n                    }\n                    // If the point is placed every day at 23:59, we need to show\n                    // the minutes as well. #2637.\n                    if (strpos[n] &&\n                        dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n                        break;\n                    }\n                    // Weeks are outside the hierarchy, only apply them on\n                    // Mondays/Sundays like in the first condition\n                    if (n !== 'week') {\n                        lastN = n;\n                    }\n                }\n                if (n) {\n                    format = time.resolveDTLFormat(dateTimeLabelFormats[n]).main;\n                }\n                return format;\n            };\n            /**\n             * Creates the Tooltip label element if it does not exist, then returns it.\n             *\n             * @function Highcharts.Tooltip#getLabel\n             * @return {Highcharts.SVGElement}\n             */\n            Tooltip.prototype.getLabel = function () {\n                var _a,\n                    _b;\n                var tooltip = this,\n                    renderer = this.chart.renderer,\n                    styledMode = this.chart.styledMode,\n                    options = this.options,\n                    className = ('tooltip' + (defined(options.className) ?\n                        ' ' + options.className :\n                        '')),\n                    pointerEvents = (((_a = options.style) === null || _a === void 0 ? void 0 : _a.pointerEvents) ||\n                        (!this.followPointer && options.stickOnContact ? 'auto' : 'none')),\n                    container,\n                    set,\n                    onMouseEnter = function () {\n                        tooltip.inContact = true;\n                }, onMouseLeave = function () {\n                    var series = tooltip.chart.hoverSeries;\n                    tooltip.inContact = false;\n                    if (series &&\n                        series.onMouseOut) {\n                        series.onMouseOut();\n                    }\n                };\n                if (!this.label) {\n                    if (this.outside) {\n                        /**\n                         * Reference to the tooltip's container, when\n                         * [Highcharts.Tooltip#outside] is set to true, otherwise\n                         * it's undefined.\n                         *\n                         * @name Highcharts.Tooltip#container\n                         * @type {Highcharts.HTMLDOMElement|undefined}\n                         */\n                        this.container = container = H.doc.createElement('div');\n                        container.className = 'highcharts-tooltip-container';\n                        css(container, {\n                            position: 'absolute',\n                            top: '1px',\n                            pointerEvents: pointerEvents,\n                            zIndex: 3\n                        });\n                        H.doc.body.appendChild(container);\n                        /**\n                         * Reference to the tooltip's renderer, when\n                         * [Highcharts.Tooltip#outside] is set to true, otherwise\n                         * it's undefined.\n                         *\n                         * @name Highcharts.Tooltip#renderer\n                         * @type {Highcharts.SVGRenderer|undefined}\n                         */\n                        this.renderer = renderer = new H.Renderer(container, 0, 0, (_b = this.chart.options.chart) === null || _b === void 0 ? void 0 : _b.style, void 0, void 0, renderer.styledMode);\n                    }\n                    // Create the label\n                    if (this.split) {\n                        this.label = renderer.g(className);\n                    }\n                    else {\n                        this.label = renderer\n                            .label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, className)\n                            .attr({\n                            padding: options.padding,\n                            r: options.borderRadius\n                        });\n                        if (!styledMode) {\n                            this.label\n                                .attr({\n                                fill: options.backgroundColor,\n                                'stroke-width': options.borderWidth\n                            })\n                                // #2301, #2657\n                                .css(options.style)\n                                .css({ pointerEvents: pointerEvents })\n                                .shadow(options.shadow);\n                        }\n                    }\n                    if (styledMode) {\n                        // Apply the drop-shadow filter\n                        this.applyFilter();\n                        this.label.addClass('highcharts-tooltip-' + this.chart.index);\n                    }\n                    // Split tooltip use updateTooltipContainer to position the tooltip\n                    // container.\n                    if (tooltip.outside && !tooltip.split) {\n                        var label_1 = this.label;\n                        var xSetter_1 = label_1.xSetter,\n                            ySetter_1 = label_1.ySetter;\n                        label_1.xSetter = function (value) {\n                            xSetter_1.call(label_1, tooltip.distance);\n                            container.style.left = value + 'px';\n                        };\n                        label_1.ySetter = function (value) {\n                            ySetter_1.call(label_1, tooltip.distance);\n                            container.style.top = value + 'px';\n                        };\n                    }\n                    this.label\n                        .on('mouseenter', onMouseEnter)\n                        .on('mouseleave', onMouseLeave)\n                        .attr({ zIndex: 8 })\n                        .add();\n                }\n                return this.label;\n            };\n            /**\n             * Place the tooltip in a chart without spilling over\n             * and not covering the point it self.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getPosition\n             *\n             * @param {number} boxWidth\n             *\n             * @param {number} boxHeight\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {Highcharts.PositionObject}\n             */\n            Tooltip.prototype.getPosition = function (boxWidth, boxHeight, point) {\n                var chart = this.chart,\n                    distance = this.distance,\n                    ret = {}, \n                    // Don't use h if chart isn't inverted (#7242) ???\n                    h = (chart.inverted && point.h) || 0, // #4117 ???\n                    swapped,\n                    outside = this.outside,\n                    outerWidth = outside ?\n                        // substract distance to prevent scrollbars\n                        doc.documentElement.clientWidth - 2 * distance :\n                        chart.chartWidth,\n                    outerHeight = outside ?\n                        Math.max(doc.body.scrollHeight,\n                    doc.documentElement.scrollHeight,\n                    doc.body.offsetHeight,\n                    doc.documentElement.offsetHeight,\n                    doc.documentElement.clientHeight) :\n                        chart.chartHeight,\n                    chartPosition = chart.pointer.getChartPosition(),\n                    containerScaling = chart.containerScaling,\n                    scaleX = function (val) { return ( // eslint-disable-line no-confusing-arrow\n                    containerScaling ? val * containerScaling.scaleX : val); },\n                    scaleY = function (val) { return ( // eslint-disable-line no-confusing-arrow\n                    containerScaling ? val * containerScaling.scaleY : val); }, \n                    // Build parameter arrays for firstDimension()/secondDimension()\n                    buildDimensionArray = function (dim) {\n                        var isX = dim === 'x';\n                    return [\n                        dim,\n                        isX ? outerWidth : outerHeight,\n                        isX ? boxWidth : boxHeight\n                    ].concat(outside ? [\n                        // If we are using tooltip.outside, we need to scale the\n                        // position to match scaling of the container in case there\n                        // is a transform/zoom on the container. #11329\n                        isX ? scaleX(boxWidth) : scaleY(boxHeight),\n                        isX ? chartPosition.left - distance +\n                            scaleX(point.plotX + chart.plotLeft) :\n                            chartPosition.top - distance +\n                                scaleY(point.plotY + chart.plotTop),\n                        0,\n                        isX ? outerWidth : outerHeight\n                    ] : [\n                        // Not outside, no scaling is needed\n                        isX ? boxWidth : boxHeight,\n                        isX ? point.plotX + chart.plotLeft :\n                            point.plotY + chart.plotTop,\n                        isX ? chart.plotLeft : chart.plotTop,\n                        isX ? chart.plotLeft + chart.plotWidth :\n                            chart.plotTop + chart.plotHeight\n                    ]);\n                }, first = buildDimensionArray('y'), second = buildDimensionArray('x'), \n                // The far side is right or bottom\n                preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n                /*\n                 * Handle the preferred dimension. When the preferred dimension is\n                 * tooltip on top or bottom of the point, it will look for space\n                 * there.\n                 *\n                 * @private\n                 */\n                firstDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n                point, min, max) {\n                    var scaledDist = dim === 'y' ?\n                            scaleY(distance) : scaleX(distance),\n                        scaleDiff = (innerSize - scaledInnerSize) / 2,\n                        roomLeft = scaledInnerSize < point - distance,\n                        roomRight = point + distance + scaledInnerSize < outerSize,\n                        alignedLeft = point - scaledDist - innerSize + scaleDiff,\n                        alignedRight = point + scaledDist - scaleDiff;\n                    if (preferFarSide && roomRight) {\n                        ret[dim] = alignedRight;\n                    }\n                    else if (!preferFarSide && roomLeft) {\n                        ret[dim] = alignedLeft;\n                    }\n                    else if (roomLeft) {\n                        ret[dim] = Math.min(max - scaledInnerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n                    }\n                    else if (roomRight) {\n                        ret[dim] = Math.max(min, alignedRight + h + innerSize > outerSize ?\n                            alignedRight :\n                            alignedRight + h);\n                    }\n                    else {\n                        return false;\n                    }\n                }, \n                /*\n                 * Handle the secondary dimension. If the preferred dimension is\n                 * tooltip on top or bottom of the point, the second dimension is to\n                 * align the tooltip above the point, trying to align center but\n                 * allowing left or right align within the chart box.\n                 *\n                 * @private\n                 */\n                secondDimension = function (dim, outerSize, innerSize, scaledInnerSize, // #11329\n                point) {\n                    var retVal;\n                    // Too close to the edge, return false and swap dimensions\n                    if (point < distance || point > outerSize - distance) {\n                        retVal = false;\n                        // Align left/top\n                    }\n                    else if (point < innerSize / 2) {\n                        ret[dim] = 1;\n                        // Align right/bottom\n                    }\n                    else if (point > outerSize - scaledInnerSize / 2) {\n                        ret[dim] = outerSize - scaledInnerSize - 2;\n                        // Align center\n                    }\n                    else {\n                        ret[dim] = point - innerSize / 2;\n                    }\n                    return retVal;\n                }, \n                /*\n                 * Swap the dimensions\n                 */\n                swap = function (count) {\n                    var temp = first;\n                    first = second;\n                    second = temp;\n                    swapped = count;\n                }, run = function () {\n                    if (firstDimension.apply(0, first) !== false) {\n                        if (secondDimension.apply(0, second) === false &&\n                            !swapped) {\n                            swap(true);\n                            run();\n                        }\n                    }\n                    else if (!swapped) {\n                        swap(true);\n                        run();\n                    }\n                    else {\n                        ret.x = ret.y = 0;\n                    }\n                };\n                // Under these conditions, prefer the tooltip on the side of the point\n                if (chart.inverted || this.len > 1) {\n                    swap();\n                }\n                run();\n                return ret;\n            };\n            /**\n             * Get the best X date format based on the closest point range on the axis.\n             *\n             * @private\n             * @function Highcharts.Tooltip#getXDateFormat\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *\n             * @param {Highcharts.Axis} xAxis\n             *\n             * @return {string}\n             */\n            Tooltip.prototype.getXDateFormat = function (point, options, xAxis) {\n                var xDateFormat,\n                    dateTimeLabelFormats = options.dateTimeLabelFormats,\n                    closestPointRange = xAxis && xAxis.closestPointRange;\n                if (closestPointRange) {\n                    xDateFormat = this.getDateFormat(closestPointRange, point.x, xAxis.options.startOfWeek, dateTimeLabelFormats);\n                }\n                else {\n                    xDateFormat = dateTimeLabelFormats.day;\n                }\n                return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n            };\n            /**\n             * Hides the tooltip with a fade out animation.\n             *\n             * @function Highcharts.Tooltip#hide\n             *\n             * @param {number} [delay]\n             *        The fade out in milliseconds. If no value is provided the value\n             *        of the tooltip.hideDelay option is used. A value of 0 disables\n             *        the fade out animation.\n             */\n            Tooltip.prototype.hide = function (delay) {\n                var tooltip = this;\n                // disallow duplicate timers (#1728, #1766)\n                U.clearTimeout(this.hideTimer);\n                delay = pick(delay, this.options.hideDelay, 500);\n                if (!this.isHidden) {\n                    this.hideTimer = syncTimeout(function () {\n                        // If there is a delay, do fadeOut with the default duration. If\n                        // the hideDelay is 0, we assume no animation is wanted, so we\n                        // pass 0 duration. #12994.\n                        tooltip.getLabel().fadeOut(delay ? void 0 : delay);\n                        tooltip.isHidden = true;\n                    }, delay);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Tooltip#init\n             *\n             * @param {Highcharts.Chart} chart\n             *        The chart instance.\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *        Tooltip options.\n             */\n            Tooltip.prototype.init = function (chart, options) {\n                /**\n                 * Chart of the tooltip.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#chart\n                 * @type {Highcharts.Chart}\n                 */\n                this.chart = chart;\n                /**\n                 * Used tooltip options.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#options\n                 * @type {Highcharts.TooltipOptions}\n                 */\n                this.options = options;\n                /**\n                 * List of crosshairs.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#crosshairs\n                 * @type {Array<null>}\n                 */\n                this.crosshairs = [];\n                /**\n                 * Current values of x and y when animating.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#now\n                 * @type {Highcharts.PositionObject}\n                 */\n                this.now = { x: 0, y: 0 };\n                /**\n                 * Tooltips are initially hidden.\n                 *\n                 * @private\n                 * @readonly\n                 * @name Highcharts.Tooltip#isHidden\n                 * @type {boolean}\n                 */\n                this.isHidden = true;\n                /**\n                 * True, if the tooltip is split into one label per series, with the\n                 * header close to the axis.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#split\n                 * @type {boolean|undefined}\n                 */\n                this.split = options.split && !chart.inverted && !chart.polar;\n                /**\n                 * When the tooltip is shared, the entire plot area will capture mouse\n                 * movement or touch events.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#shared\n                 * @type {boolean|undefined}\n                 */\n                this.shared = options.shared || this.split;\n                /**\n                 * Whether to allow the tooltip to render outside the chart's SVG\n                 * element box. By default (false), the tooltip is rendered within the\n                 * chart's SVG element, which results in the tooltip being aligned\n                 * inside the chart area.\n                 *\n                 * @readonly\n                 * @name Highcharts.Tooltip#outside\n                 * @type {boolean}\n                 *\n                 * @todo\n                 * Split tooltip does not support outside in the first iteration. Should\n                 * not be too complicated to implement.\n                 */\n                this.outside = pick(options.outside, Boolean(chart.scrollablePixelsX || chart.scrollablePixelsY));\n            };\n            /**\n             * Returns true, if the pointer is in contact with the tooltip tracker.\n             */\n            Tooltip.prototype.isStickyOnContact = function () {\n                return !!(!this.followPointer &&\n                    this.options.stickOnContact &&\n                    this.inContact);\n            };\n            /**\n             * Moves the tooltip with a soft animation to a new position.\n             *\n             * @private\n             * @function Highcharts.Tooltip#move\n             *\n             * @param {number} x\n             *\n             * @param {number} y\n             *\n             * @param {number} anchorX\n             *\n             * @param {number} anchorY\n             */\n            Tooltip.prototype.move = function (x, y, anchorX, anchorY) {\n                var tooltip = this,\n                    now = tooltip.now,\n                    animate = tooltip.options.animation !== false &&\n                        !tooltip.isHidden &&\n                        // When we get close to the target position, abort animation and\n                        // land on the right place (#3056)\n                        (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1),\n                    skipAnchor = tooltip.followPointer || tooltip.len > 1;\n                // Get intermediate values for animation\n                extend(now, {\n                    x: animate ? (2 * now.x + x) / 3 : x,\n                    y: animate ? (now.y + y) / 2 : y,\n                    anchorX: skipAnchor ?\n                        void 0 :\n                        animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n                    anchorY: skipAnchor ?\n                        void 0 :\n                        animate ? (now.anchorY + anchorY) / 2 : anchorY\n                });\n                // Move to the intermediate value\n                tooltip.getLabel().attr(now);\n                tooltip.drawTracker();\n                // Run on next tick of the mouse tracker\n                if (animate) {\n                    // Never allow two timeouts\n                    U.clearTimeout(this.tooltipTimeout);\n                    // Set the fixed interval ticking for the smooth tooltip\n                    this.tooltipTimeout = setTimeout(function () {\n                        // The interval function may still be running during destroy,\n                        // so check that the chart is really there before calling.\n                        if (tooltip) {\n                            tooltip.move(x, y, anchorX, anchorY);\n                        }\n                    }, 32);\n                }\n            };\n            /**\n             * Refresh the tooltip's text and position.\n             *\n             * @function Highcharts.Tooltip#refresh\n             *\n             * @param {Highcharts.Point|Array<Highcharts.Point>} pointOrPoints\n             *        Either a point or an array of points.\n             *\n             * @param {Highcharts.PointerEventObject} [mouseEvent]\n             *        Mouse event, that is responsible for the refresh and should be\n             *        used for the tooltip update.\n             */\n            Tooltip.prototype.refresh = function (pointOrPoints, mouseEvent) {\n                var tooltip = this,\n                    chart = this.chart,\n                    options = tooltip.options,\n                    x,\n                    y,\n                    point = pointOrPoints,\n                    anchor,\n                    textConfig = {},\n                    text,\n                    pointConfig = [],\n                    formatter = options.formatter || tooltip.defaultFormatter,\n                    shared = tooltip.shared,\n                    currentSeries,\n                    styledMode = chart.styledMode;\n                if (!options.enabled) {\n                    return;\n                }\n                U.clearTimeout(this.hideTimer);\n                // get the reference point coordinates (pie charts use tooltipPos)\n                tooltip.followPointer = splat(point)[0].series.tooltipOptions\n                    .followPointer;\n                anchor = tooltip.getAnchor(point, mouseEvent);\n                x = anchor[0];\n                y = anchor[1];\n                // shared tooltip, array is sent over\n                if (shared &&\n                    !(point.series &&\n                        point.series.noSharedTooltip)) {\n                    chart.pointer.applyInactiveState(point);\n                    // Now set hover state for the choosen ones:\n                    point.forEach(function (item) {\n                        item.setState('hover');\n                        pointConfig.push(item.getLabelConfig());\n                    });\n                    textConfig = {\n                        x: point[0].category,\n                        y: point[0].y\n                    };\n                    textConfig.points = pointConfig;\n                    point = point[0];\n                    // single point tooltip\n                }\n                else {\n                    textConfig = point.getLabelConfig();\n                }\n                this.len = pointConfig.length; // #6128\n                text = formatter.call(textConfig, tooltip);\n                // register the current series\n                currentSeries = point.series;\n                this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n                // update the inner HTML\n                if (text === false) {\n                    this.hide();\n                }\n                else {\n                    // update text\n                    if (tooltip.split) {\n                        this.renderSplit(text, splat(pointOrPoints));\n                    }\n                    else {\n                        var label = tooltip.getLabel();\n                        // Prevent the tooltip from flowing over the chart box (#6659)\n                        if (!options.style.width || styledMode) {\n                            label.css({\n                                width: this.chart.spacingBox.width + 'px'\n                            });\n                        }\n                        label.attr({\n                            text: text && text.join ?\n                                text.join('') :\n                                text\n                        });\n                        // Set the stroke color of the box to reflect the point\n                        label.removeClass(/highcharts-color-[\\d]+/g)\n                            .addClass('highcharts-color-' +\n                            pick(point.colorIndex, currentSeries.colorIndex));\n                        if (!styledMode) {\n                            label.attr({\n                                stroke: (options.borderColor ||\n                                    point.color ||\n                                    currentSeries.color ||\n                                    '#666666')\n                            });\n                        }\n                        tooltip.updatePosition({\n                            plotX: x,\n                            plotY: y,\n                            negative: point.negative,\n                            ttBelow: point.ttBelow,\n                            h: anchor[2] || 0\n                        });\n                    }\n                    // show it\n                    if (tooltip.isHidden && tooltip.label) {\n                        tooltip.label.attr({\n                            opacity: 1\n                        }).show();\n                    }\n                    tooltip.isHidden = false;\n                }\n                fireEvent(this, 'refresh');\n            };\n            /**\n             * Render the split tooltip. Loops over each point's text and adds\n             * a label next to the point, then uses the distribute function to\n             * find best non-overlapping positions.\n             *\n             * @private\n             * @function Highcharts.Tooltip#renderSplit\n             *\n             * @param {string|Array<(boolean|string)>} labels\n             *\n             * @param {Array<Highcharts.Point>} points\n             */\n            Tooltip.prototype.renderSplit = function (labels, points) {\n                var tooltip = this;\n                var chart = tooltip.chart,\n                    _a = tooltip.chart,\n                    chartWidth = _a.chartWidth,\n                    chartHeight = _a.chartHeight,\n                    plotHeight = _a.plotHeight,\n                    plotLeft = _a.plotLeft,\n                    plotTop = _a.plotTop,\n                    pointer = _a.pointer,\n                    ren = _a.renderer,\n                    _b = _a.scrollablePixelsY,\n                    scrollablePixelsY = _b === void 0 ? 0 : _b,\n                    _c = _a.scrollingContainer,\n                    _d = _c === void 0 ? { scrollLeft: 0,\n                    scrollTop: 0 } : _c,\n                    scrollLeft = _d.scrollLeft,\n                    scrollTop = _d.scrollTop,\n                    styledMode = _a.styledMode,\n                    distance = tooltip.distance,\n                    options = tooltip.options,\n                    positioner = tooltip.options.positioner;\n                // The area which the tooltip should be limited to. Limit to scrollable\n                // plot area if enabled, otherwise limit to the chart container.\n                var bounds = {\n                        left: scrollLeft,\n                        right: scrollLeft + chartWidth,\n                        top: scrollTop,\n                        bottom: scrollTop + chartHeight\n                    };\n                var tooltipLabel = tooltip.getLabel();\n                var headerTop = Boolean(chart.xAxis[0] && chart.xAxis[0].opposite);\n                var distributionBoxTop = plotTop + scrollTop;\n                var headerHeight = 0;\n                var adjustedPlotHeight = plotHeight - scrollablePixelsY;\n                /**\n                 * Calculates the anchor position for the partial tooltip\n                 *\n                 * @private\n                 * @param {Highcharts.Point} point The point related to the tooltip\n                 * @return {object} Returns an object with anchorX and anchorY\n                 */\n                function getAnchor(point) {\n                    var isHeader = point.isHeader,\n                        _a = point.plotX,\n                        plotX = _a === void 0 ? 0 : _a,\n                        _b = point.plotY,\n                        plotY = _b === void 0 ? 0 : _b,\n                        series = point.series;\n                    var anchorX;\n                    var anchorY;\n                    if (isHeader) {\n                        // Set anchorX to plotX\n                        anchorX = plotLeft + plotX;\n                        // Set anchorY to center of visible plot area.\n                        anchorY = plotTop + plotHeight / 2;\n                    }\n                    else {\n                        var xAxis = series.xAxis,\n                            yAxis = series.yAxis;\n                        // Set anchorX to plotX. Limit to within xAxis.\n                        anchorX = xAxis.pos + clamp(plotX, -distance, xAxis.len + distance);\n                        // Set anchorY, limit to the scrollable plot area\n                        if (yAxis.pos + plotY >= scrollTop + plotTop &&\n                            yAxis.pos + plotY <= scrollTop + plotTop + plotHeight - scrollablePixelsY) {\n                            anchorY = yAxis.pos + plotY;\n                        }\n                    }\n                    // Limit values to plot area\n                    anchorX = clamp(anchorX, bounds.left - distance, bounds.right + distance);\n                    return { anchorX: anchorX, anchorY: anchorY };\n                }\n                /**\n                 * Calculates the position of the partial tooltip\n                 *\n                 * @private\n                 * @param {number} anchorX The partial tooltip anchor x position\n                 * @param {number} anchorY The partial tooltip anchor y position\n                 * @param {boolean} isHeader Whether the partial tooltip is a header\n                 * @param {number} boxWidth Width of the partial tooltip\n                 * @return {Highcharts.PositionObject} Returns the partial tooltip x and\n                 * y position\n                 */\n                function defaultPositioner(anchorX, anchorY, isHeader, boxWidth, alignedLeft) {\n                    if (alignedLeft === void 0) { alignedLeft = true; }\n                    var y;\n                    var x;\n                    if (isHeader) {\n                        y = headerTop ? 0 : adjustedPlotHeight;\n                        x = clamp(anchorX - (boxWidth / 2), bounds.left, bounds.right - boxWidth);\n                    }\n                    else {\n                        y = anchorY - distributionBoxTop;\n                        x = alignedLeft ?\n                            anchorX - boxWidth - distance :\n                            anchorX + distance;\n                        x = clamp(x, alignedLeft ? x : bounds.left, bounds.right);\n                    }\n                    // NOTE: y is relative to distributionBoxTop\n                    return { x: x, y: y };\n                }\n                /**\n                 * Updates the attributes and styling of the partial tooltip. Creates a\n                 * new partial tooltip if it does not exists.\n                 *\n                 * @private\n                 * @param {Highcharts.SVGElement|undefined} partialTooltip\n                 *  The partial tooltip to update\n                 * @param {Highcharts.Point} point\n                 *  The point related to the partial tooltip\n                 * @param {boolean|string} str The text for the partial tooltip\n                 * @return {Highcharts.SVGElement} Returns the updated partial tooltip\n                 */\n                function updatePartialTooltip(partialTooltip, point, str) {\n                    var tt = partialTooltip;\n                    var isHeader = point.isHeader,\n                        series = point.series;\n                    var colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none');\n                    if (!tt) {\n                        var attribs = {\n                                padding: options.padding,\n                                r: options.borderRadius\n                            };\n                        if (!styledMode) {\n                            attribs.fill = options.backgroundColor;\n                            attribs['stroke-width'] = options.borderWidth;\n                        }\n                        tt = ren\n                            .label('', 0, 0, (options[isHeader ? 'headerShape' : 'shape']) ||\n                            'callout', void 0, void 0, options.useHTML)\n                            .addClass((isHeader ? 'highcharts-tooltip-header ' : '') +\n                            'highcharts-tooltip-box ' +\n                            colorClass)\n                            .attr(attribs)\n                            .add(tooltipLabel);\n                    }\n                    tt.isActive = true;\n                    tt.attr({\n                        text: str\n                    });\n                    if (!styledMode) {\n                        tt.css(options.style)\n                            .shadow(options.shadow)\n                            .attr({\n                            stroke: (options.borderColor ||\n                                point.color ||\n                                series.color ||\n                                '#333333')\n                        });\n                    }\n                    return tt;\n                }\n                // Graceful degradation for legacy formatters\n                if (isString(labels)) {\n                    labels = [false, labels];\n                }\n                // Create the individual labels for header and points, ignore footer\n                var boxes = labels.slice(0,\n                    points.length + 1).reduce(function (boxes,\n                    str,\n                    i) {\n                        if (str !== false && str !== '') {\n                            var point = (points[i - 1] ||\n                                {\n                                    // Item 0 is the header. Instead of this, we could also\n                                    // use the crosshair label\n                                    isHeader: true,\n                                    plotX: points[0].plotX,\n                                    plotY: plotHeight,\n                                    series: {}\n                                });\n                        var isHeader = point.isHeader;\n                        // Store the tooltip label referance on the series\n                        var owner = isHeader ? tooltip : point.series;\n                        var tt = owner.tt = updatePartialTooltip(owner.tt,\n                            point,\n                            str);\n                        // Get X position now, so we can move all to the other side in\n                        // case of overflow\n                        var bBox = tt.getBBox();\n                        var boxWidth = bBox.width + tt.strokeWidth();\n                        if (isHeader) {\n                            headerHeight = bBox.height;\n                            adjustedPlotHeight += headerHeight;\n                            if (headerTop) {\n                                distributionBoxTop -= headerHeight;\n                            }\n                        }\n                        var _a = getAnchor(point),\n                            anchorX = _a.anchorX,\n                            anchorY = _a.anchorY;\n                        if (typeof anchorY === 'number') {\n                            var size = bBox.height + 1;\n                            var boxPosition = (positioner ?\n                                    positioner.call(tooltip,\n                                boxWidth,\n                                size,\n                                point) :\n                                    defaultPositioner(anchorX,\n                                anchorY,\n                                isHeader,\n                                boxWidth));\n                            boxes.push({\n                                // 0-align to the top, 1-align to the bottom\n                                align: positioner ? 0 : void 0,\n                                anchorX: anchorX,\n                                anchorY: anchorY,\n                                boxWidth: boxWidth,\n                                point: point,\n                                rank: pick(boxPosition.rank, isHeader ? 1 : 0),\n                                size: size,\n                                target: boxPosition.y,\n                                tt: tt,\n                                x: boxPosition.x\n                            });\n                        }\n                        else {\n                            // Hide tooltips which anchorY is outside the visible plot\n                            // area\n                            tt.isActive = false;\n                        }\n                    }\n                    return boxes;\n                }, []);\n                // If overflow left then align all labels to the right\n                if (!positioner && boxes.some(function (box) { return box.x < bounds.left; })) {\n                    boxes = boxes.map(function (box) {\n                        var _a = defaultPositioner(box.anchorX,\n                            box.anchorY,\n                            box.point.isHeader,\n                            box.boxWidth,\n                            false),\n                            x = _a.x,\n                            y = _a.y;\n                        return extend(box, {\n                            target: y,\n                            x: x\n                        });\n                    });\n                }\n                // Clean previous run (for missing points)\n                tooltip.cleanSplit();\n                // Distribute and put in place\n                H.distribute(boxes, adjustedPlotHeight);\n                boxes.forEach(function (box) {\n                    var anchorX = box.anchorX,\n                        anchorY = box.anchorY,\n                        pos = box.pos,\n                        x = box.x;\n                    // Put the label in place\n                    box.tt.attr({\n                        visibility: typeof pos === 'undefined' ? 'hidden' : 'inherit',\n                        x: x,\n                        /* NOTE: y should equal pos to be consistent with !split\n                         * tooltip, but is currently relative to plotTop. Is left as is\n                         * to avoid breaking change. Remove distributionBoxTop to make\n                         * it consistent.\n                         */\n                        y: pos + distributionBoxTop,\n                        anchorX: anchorX,\n                        anchorY: anchorY\n                    });\n                });\n                /* If we have a seperate tooltip container, then update the necessary\n                 * container properties.\n                 * Test that tooltip has its own container and renderer before executing\n                 * the operation.\n                 */\n                var container = tooltip.container,\n                    outside = tooltip.outside,\n                    renderer = tooltip.renderer;\n                if (outside && container && renderer) {\n                    // Set container size to fit the tooltip\n                    var _e = tooltipLabel.getBBox(),\n                        width = _e.width,\n                        height = _e.height,\n                        x = _e.x,\n                        y = _e.y;\n                    renderer.setSize(width + x, height + y, false);\n                    // Position the tooltip container to the chart container\n                    var chartPosition = pointer.getChartPosition();\n                    container.style.left = chartPosition.left + 'px';\n                    container.style.top = chartPosition.top + 'px';\n                }\n            };\n            /**\n             * If the `stickOnContact` option is active, this will add a tracker shape.\n             *\n             * @private\n             * @function Highcharts.Tooltip#drawTracker\n             */\n            Tooltip.prototype.drawTracker = function () {\n                var tooltip = this;\n                if (tooltip.followPointer ||\n                    !tooltip.options.stickOnContact) {\n                    if (tooltip.tracker) {\n                        tooltip.tracker.destroy();\n                    }\n                    return;\n                }\n                var chart = tooltip.chart;\n                var label = tooltip.label;\n                var point = chart.hoverPoint;\n                if (!label || !point) {\n                    return;\n                }\n                var box = {\n                        x: 0,\n                        y: 0,\n                        width: 0,\n                        height: 0\n                    };\n                // Combine anchor and tooltip\n                var anchorPos = this.getAnchor(point);\n                var labelBBox = label.getBBox();\n                anchorPos[0] += chart.plotLeft - label.translateX;\n                anchorPos[1] += chart.plotTop - label.translateY;\n                // When the mouse pointer is between the anchor point and the label,\n                // the label should stick.\n                box.x = Math.min(0, anchorPos[0]);\n                box.y = Math.min(0, anchorPos[1]);\n                box.width = (anchorPos[0] < 0 ?\n                    Math.max(Math.abs(anchorPos[0]), (labelBBox.width - anchorPos[0])) :\n                    Math.max(Math.abs(anchorPos[0]), labelBBox.width));\n                box.height = (anchorPos[1] < 0 ?\n                    Math.max(Math.abs(anchorPos[1]), (labelBBox.height - Math.abs(anchorPos[1]))) :\n                    Math.max(Math.abs(anchorPos[1]), labelBBox.height));\n                if (tooltip.tracker) {\n                    tooltip.tracker.attr(box);\n                }\n                else {\n                    tooltip.tracker = label.renderer\n                        .rect(box)\n                        .addClass('highcharts-tracker')\n                        .add(label);\n                    if (!chart.styledMode) {\n                        tooltip.tracker.attr({\n                            fill: 'rgba(0,0,0,0)'\n                        });\n                    }\n                }\n            };\n            /**\n             * @private\n             */\n            Tooltip.prototype.styledModeFormat = function (formatString) {\n                return formatString\n                    .replace('style=\"font-size: 10px\"', 'class=\"highcharts-header\"')\n                    .replace(/style=\"color:{(point|series)\\.color}\"/g, 'class=\"highcharts-color-{$1.colorIndex}\"');\n            };\n            /**\n             * Format the footer/header of the tooltip\n             * #3397: abstraction to enable formatting of footer and header\n             *\n             * @private\n             * @function Highcharts.Tooltip#tooltipFooterHeaderFormatter\n             * @param {Highcharts.PointLabelObject} labelConfig\n             * @param {boolean} [isFooter]\n             * @return {string}\n             */\n            Tooltip.prototype.tooltipFooterHeaderFormatter = function (labelConfig, isFooter) {\n                var footOrHead = isFooter ? 'footer' : 'header',\n                    series = labelConfig.series,\n                    tooltipOptions = series.tooltipOptions,\n                    xDateFormat = tooltipOptions.xDateFormat,\n                    xAxis = series.xAxis,\n                    isDateTime = (xAxis &&\n                        xAxis.options.type === 'datetime' &&\n                        isNumber(labelConfig.key)),\n                    formatString = tooltipOptions[footOrHead + 'Format'],\n                    e = {\n                        isFooter: isFooter,\n                        labelConfig: labelConfig\n                    };\n                fireEvent(this, 'headerFormatter', e, function (e) {\n                    // Guess the best date format based on the closest point distance\n                    // (#568, #3418)\n                    if (isDateTime && !xDateFormat) {\n                        xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n                    }\n                    // Insert the footer date format if any\n                    if (isDateTime && xDateFormat) {\n                        ((labelConfig.point && labelConfig.point.tooltipDateKeys) ||\n                            ['key']).forEach(function (key) {\n                            formatString = formatString.replace('{point.' + key + '}', '{point.' + key + ':' + xDateFormat + '}');\n                        });\n                    }\n                    // Replace default header style with class name\n                    if (series.chart.styledMode) {\n                        formatString = this.styledModeFormat(formatString);\n                    }\n                    e.text = format(formatString, {\n                        point: labelConfig,\n                        series: series\n                    }, this.chart);\n                });\n                return e.text;\n            };\n            /**\n             * Updates the tooltip with the provided tooltip options.\n             *\n             * @function Highcharts.Tooltip#update\n             *\n             * @param {Highcharts.TooltipOptions} options\n             *        The tooltip options to update.\n             */\n            Tooltip.prototype.update = function (options) {\n                this.destroy();\n                // Update user options (#6218)\n                merge(true, this.chart.options.tooltip.userOptions, options);\n                this.init(this.chart, merge(true, this.options, options));\n            };\n            /**\n             * Find the new position and perform the move\n             *\n             * @private\n             * @function Highcharts.Tooltip#updatePosition\n             *\n             * @param {Highcharts.Point} point\n             */\n            Tooltip.prototype.updatePosition = function (point) {\n                var chart = this.chart,\n                    pointer = chart.pointer,\n                    label = this.getLabel(),\n                    pos,\n                    anchorX = point.plotX + chart.plotLeft,\n                    anchorY = point.plotY + chart.plotTop,\n                    pad;\n                // Needed for outside: true (#11688)\n                var chartPosition = pointer.getChartPosition();\n                pos = (this.options.positioner || this.getPosition).call(this, label.width, label.height, point);\n                // Set the renderer size dynamically to prevent document size to change\n                if (this.outside) {\n                    pad = (this.options.borderWidth || 0) + 2 * this.distance;\n                    this.renderer.setSize(label.width + pad, label.height + pad, false);\n                    // Anchor and tooltip container need scaling if chart container has\n                    // scale transform/css zoom. #11329.\n                    var containerScaling = chart.containerScaling;\n                    if (containerScaling) {\n                        css(this.container, {\n                            transform: \"scale(\" + containerScaling.scaleX + \", \" + containerScaling.scaleY + \")\"\n                        });\n                        anchorX *= containerScaling.scaleX;\n                        anchorY *= containerScaling.scaleY;\n                    }\n                    anchorX += chartPosition.left - pos.x;\n                    anchorY += chartPosition.top - pos.y;\n                }\n                // do the move\n                this.move(Math.round(pos.x), Math.round(pos.y || 0), // can be undefined (#3977)\n                anchorX, anchorY);\n            };\n            return Tooltip;\n        }());\n        H.Tooltip = Tooltip;\n\n        return H.Tooltip;\n    });\n    _registerModule(_modules, 'parts/Pointer.js', [_modules['parts/Color.js'], _modules['parts/Globals.js'], _modules['parts/Tooltip.js'], _modules['parts/Utilities.js']], function (Color, H, Tooltip, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var charts = H.charts,\n            noop = H.noop;\n        var addEvent = U.addEvent,\n            attr = U.attr,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            objectEach = U.objectEach,\n            offset = U.offset,\n            pick = U.pick,\n            splat = U.splat;\n        /**\n         * One position in relation to an axis.\n         *\n         * @interface Highcharts.PointerAxisCoordinateObject\n         */ /**\n        * Related axis.\n        *\n        * @name Highcharts.PointerAxisCoordinateObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Axis value.\n        *\n        * @name Highcharts.PointerAxisCoordinateObject#value\n        * @type {number}\n        */\n        /**\n         * Positions in terms of axis values.\n         *\n         * @interface Highcharts.PointerAxisCoordinatesObject\n         */ /**\n        * Positions on the x-axis.\n        * @name Highcharts.PointerAxisCoordinatesObject#xAxis\n        * @type {Array<Highcharts.PointerAxisCoordinateObject>}\n        */ /**\n        * Positions on the y-axis.\n        * @name Highcharts.PointerAxisCoordinatesObject#yAxis\n        * @type {Array<Highcharts.PointerAxisCoordinateObject>}\n        */\n        /**\n         * Pointer coordinates.\n         *\n         * @interface Highcharts.PointerCoordinatesObject\n         */ /**\n        * @name Highcharts.PointerCoordinatesObject#chartX\n        * @type {number}\n        */ /**\n        * @name Highcharts.PointerCoordinatesObject#chartY\n        * @type {number}\n        */\n        /**\n         * A native browser mouse or touch event, extended with position information\n         * relative to the {@link Chart.container}.\n         *\n         * @interface Highcharts.PointerEventObject\n         * @extends global.PointerEvent\n         */ /**\n        * The X coordinate of the pointer interaction relative to the chart.\n        *\n        * @name Highcharts.PointerEventObject#chartX\n        * @type {number}\n        */ /**\n        * The Y coordinate of the pointer interaction relative to the chart.\n        *\n        * @name Highcharts.PointerEventObject#chartY\n        * @type {number}\n        */\n        /**\n         * Axis-specific data of a selection.\n         *\n         * @interface Highcharts.SelectDataObject\n         */ /**\n        * @name Highcharts.SelectDataObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * @name Highcharts.SelectDataObject#max\n        * @type {number}\n        */ /**\n        * @name Highcharts.SelectDataObject#min\n        * @type {number}\n        */\n        /**\n         * Object for select events.\n         *\n         * @interface Highcharts.SelectEventObject\n         */ /**\n        * @name Highcharts.SelectEventObject#originalEvent\n        * @type {global.Event}\n        */ /**\n        * @name Highcharts.SelectEventObject#xAxis\n        * @type {Array<Highcharts.SelectDataObject>}\n        */ /**\n        * @name Highcharts.SelectEventObject#yAxis\n        * @type {Array<Highcharts.SelectDataObject>}\n        */\n        ''; // detach doclets above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The mouse and touch tracker object. Each {@link Chart} item has one\n         * assosiated Pointer item that can be accessed from the  {@link Chart.pointer}\n         * property.\n         *\n         * @class\n         * @name Highcharts.Pointer\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.Options} options\n         * The root options object. The pointer uses options from the chart and\n         * tooltip structures.\n         */\n        var Pointer = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Pointer(chart, options) {\n                    this.lastValidTouch = {};\n                this.pinchDown = [];\n                this.runChartClick = false;\n                this.chart = chart;\n                this.hasDragged = false;\n                this.options = options;\n                this.unbindContainerMouseLeave = function () { };\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Set inactive state to all series that are not currently hovered,\n             * or, if `inactiveOtherPoints` is set to true, set inactive state to\n             * all points within that series.\n             *\n             * @private\n             * @function Highcharts.Pointer#applyInactiveState\n             * @param {Array<Highcharts.Point>} points\n             * Currently hovered points\n             */\n            Pointer.prototype.applyInactiveState = function (points) {\n                var activeSeries = [],\n                    series;\n                // Get all active series from the hovered points\n                (points || []).forEach(function (item) {\n                    series = item.series;\n                    // Include itself\n                    activeSeries.push(series);\n                    // Include parent series\n                    if (series.linkedParent) {\n                        activeSeries.push(series.linkedParent);\n                    }\n                    // Include all child series\n                    if (series.linkedSeries) {\n                        activeSeries = activeSeries.concat(series.linkedSeries);\n                    }\n                    // Include navigator series\n                    if (series.navigatorSeries) {\n                        activeSeries.push(series.navigatorSeries);\n                    }\n                });\n                // Now loop over all series, filtering out active series\n                this.chart.series.forEach(function (inactiveSeries) {\n                    if (activeSeries.indexOf(inactiveSeries) === -1) {\n                        // Inactive series\n                        inactiveSeries.setState('inactive', true);\n                    }\n                    else if (inactiveSeries.options.inactiveOtherPoints) {\n                        // Active series, but other points should be inactivated\n                        inactiveSeries.setAllPointsToState('inactive');\n                    }\n                });\n            };\n            /**\n             * Destroys the Pointer object and disconnects DOM events.\n             *\n             * @function Highcharts.Pointer#destroy\n             */\n            Pointer.prototype.destroy = function () {\n                var pointer = this;\n                if (typeof pointer.unDocMouseMove !== 'undefined') {\n                    pointer.unDocMouseMove();\n                }\n                this.unbindContainerMouseLeave();\n                if (!H.chartCount) {\n                    if (H.unbindDocumentMouseUp) {\n                        H.unbindDocumentMouseUp = H.unbindDocumentMouseUp();\n                    }\n                    if (H.unbindDocumentTouchEnd) {\n                        H.unbindDocumentTouchEnd = H.unbindDocumentTouchEnd();\n                    }\n                }\n                // memory and CPU leak\n                clearInterval(pointer.tooltipTimeout);\n                objectEach(pointer, function (_val, prop) {\n                    pointer[prop] = void 0;\n                });\n            };\n            /**\n             * Perform a drag operation in response to a mousemove event while the mouse\n             * is down.\n             *\n             * @private\n             * @function Highcharts.Pointer#drag\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.drag = function (e) {\n                var chart = this.chart,\n                    chartOptions = chart.options.chart,\n                    chartX = e.chartX,\n                    chartY = e.chartY,\n                    zoomHor = this.zoomHor,\n                    zoomVert = this.zoomVert,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    clickedInside,\n                    size,\n                    selectionMarker = this.selectionMarker,\n                    mouseDownX = (this.mouseDownX || 0),\n                    mouseDownY = (this.mouseDownY || 0),\n                    panningEnabled = isObject(chartOptions.panning) ?\n                        chartOptions.panning && chartOptions.panning.enabled :\n                        chartOptions.panning,\n                    panKey = (chartOptions.panKey && e[chartOptions.panKey + 'Key']);\n                // If the device supports both touch and mouse (like IE11), and we are\n                // touch-dragging inside the plot area, don't handle the mouse event.\n                // #4339.\n                if (selectionMarker && selectionMarker.touch) {\n                    return;\n                }\n                // If the mouse is outside the plot area, adjust to cooordinates\n                // inside to prevent the selection marker from going outside\n                if (chartX < plotLeft) {\n                    chartX = plotLeft;\n                }\n                else if (chartX > plotLeft + plotWidth) {\n                    chartX = plotLeft + plotWidth;\n                }\n                if (chartY < plotTop) {\n                    chartY = plotTop;\n                }\n                else if (chartY > plotTop + plotHeight) {\n                    chartY = plotTop + plotHeight;\n                }\n                // determine if the mouse has moved more than 10px\n                this.hasDragged = Math.sqrt(Math.pow(mouseDownX - chartX, 2) +\n                    Math.pow(mouseDownY - chartY, 2));\n                if (this.hasDragged > 10) {\n                    clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n                    // make a selection\n                    if (chart.hasCartesianSeries &&\n                        (this.zoomX || this.zoomY) &&\n                        clickedInside &&\n                        !panKey) {\n                        if (!selectionMarker) {\n                            this.selectionMarker = selectionMarker =\n                                chart.renderer.rect(plotLeft, plotTop, zoomHor ? 1 : plotWidth, zoomVert ? 1 : plotHeight, 0)\n                                    .attr({\n                                    'class': 'highcharts-selection-marker',\n                                    zIndex: 7\n                                })\n                                    .add();\n                            if (!chart.styledMode) {\n                                selectionMarker.attr({\n                                    fill: (chartOptions.selectionMarkerFill ||\n                                        color('#335cad')\n                                            .setOpacity(0.25).get())\n                                });\n                            }\n                        }\n                    }\n                    // adjust the width of the selection marker\n                    if (selectionMarker && zoomHor) {\n                        size = chartX - mouseDownX;\n                        selectionMarker.attr({\n                            width: Math.abs(size),\n                            x: (size > 0 ? 0 : size) + mouseDownX\n                        });\n                    }\n                    // adjust the height of the selection marker\n                    if (selectionMarker && zoomVert) {\n                        size = chartY - mouseDownY;\n                        selectionMarker.attr({\n                            height: Math.abs(size),\n                            y: (size > 0 ? 0 : size) + mouseDownY\n                        });\n                    }\n                    // panning\n                    if (clickedInside &&\n                        !selectionMarker &&\n                        panningEnabled) {\n                        chart.pan(e, chartOptions.panning);\n                    }\n                }\n            };\n            /**\n             * Start a drag operation.\n             *\n             * @private\n             * @function Highcharts.Pointer#dragStart\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.dragStart = function (e) {\n                var chart = this.chart;\n                // Record the start position\n                chart.mouseIsDown = e.type;\n                chart.cancelClick = false;\n                chart.mouseDownX = this.mouseDownX = e.chartX;\n                chart.mouseDownY = this.mouseDownY = e.chartY;\n            };\n            /**\n             * On mouse up or touch end across the entire document, drop the selection.\n             *\n             * @private\n             * @function Highcharts.Pointer#drop\n             *\n             * @param {global.Event} e\n             */\n            Pointer.prototype.drop = function (e) {\n                var pointer = this,\n                    chart = this.chart,\n                    hasPinched = this.hasPinched;\n                if (this.selectionMarker) {\n                    var selectionData = {\n                            originalEvent: e,\n                            xAxis: [],\n                            yAxis: []\n                        },\n                        selectionBox = this.selectionMarker,\n                        selectionLeft = selectionBox.attr ?\n                            selectionBox.attr('x') :\n                            selectionBox.x,\n                        selectionTop = selectionBox.attr ?\n                            selectionBox.attr('y') :\n                            selectionBox.y,\n                        selectionWidth = selectionBox.attr ?\n                            selectionBox.attr('width') :\n                            selectionBox.width,\n                        selectionHeight = selectionBox.attr ?\n                            selectionBox.attr('height') :\n                            selectionBox.height,\n                        runZoom;\n                    // a selection has been made\n                    if (this.hasDragged || hasPinched) {\n                        // record each axis' min and max\n                        chart.axes.forEach(function (axis) {\n                            if (axis.zoomEnabled &&\n                                defined(axis.min) &&\n                                (hasPinched ||\n                                    pointer[{\n                                        xAxis: 'zoomX',\n                                        yAxis: 'zoomY'\n                                    }[axis.coll]]) &&\n                                isNumber(selectionLeft) &&\n                                isNumber(selectionTop)) { // #859, #3569\n                                var horiz = axis.horiz,\n                                    minPixelPadding = e.type === 'touchend' ?\n                                        axis.minPixelPadding :\n                                        0, // #1207, #3075\n                                    selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) +\n                                        minPixelPadding),\n                                    selectionMax = axis.toValue((horiz ?\n                                        selectionLeft + selectionWidth :\n                                        selectionTop + selectionHeight) - minPixelPadding);\n                                selectionData[axis.coll].push({\n                                    axis: axis,\n                                    // Min/max for reversed axes\n                                    min: Math.min(selectionMin, selectionMax),\n                                    max: Math.max(selectionMin, selectionMax)\n                                });\n                                runZoom = true;\n                            }\n                        });\n                        if (runZoom) {\n                            fireEvent(chart, 'selection', selectionData, function (args) {\n                                chart.zoom(extend(args, hasPinched ?\n                                    { animation: false } :\n                                    null));\n                            });\n                        }\n                    }\n                    if (isNumber(chart.index)) {\n                        this.selectionMarker = this.selectionMarker.destroy();\n                    }\n                    // Reset scaling preview\n                    if (hasPinched) {\n                        this.scaleGroups();\n                    }\n                }\n                // Reset all. Check isNumber because it may be destroyed on mouse up\n                // (#877)\n                if (chart && isNumber(chart.index)) {\n                    css(chart.container, { cursor: chart._cursor });\n                    chart.cancelClick = this.hasDragged > 10; // #370\n                    chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n                    this.pinchDown = [];\n                }\n            };\n            /**\n             * Finds the closest point to a set of coordinates, using the k-d-tree\n             * algorithm.\n             *\n             * @function Highcharts.Pointer#findNearestKDPoint\n             *\n             * @param {Array<Highcharts.Series>} series\n             *        All the series to search in.\n             *\n             * @param {boolean|undefined} shared\n             *        Whether it is a shared tooltip or not.\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *        The pointer event object, containing chart coordinates of the\n             *        pointer.\n             *\n             * @return {Highcharts.Point|undefined}\n             *         The point closest to given coordinates.\n             */\n            Pointer.prototype.findNearestKDPoint = function (series, shared, e) {\n                var chart = this.chart;\n                var hoverPoint = chart.hoverPoint;\n                var tooltip = chart.tooltip;\n                if (hoverPoint &&\n                    tooltip &&\n                    tooltip.isStickyOnContact()) {\n                    return hoverPoint;\n                }\n                var closest;\n                /** @private */\n                function sort(p1, p2) {\n                    var isCloserX = p1.distX - p2.distX,\n                        isCloser = p1.dist - p2.dist,\n                        isAbove = (p2.series.group && p2.series.group.zIndex) -\n                            (p1.series.group && p1.series.group.zIndex),\n                        result;\n                    // We have two points which are not in the same place on xAxis\n                    // and shared tooltip:\n                    if (isCloserX !== 0 && shared) { // #5721\n                        result = isCloserX;\n                        // Points are not exactly in the same place on x/yAxis:\n                    }\n                    else if (isCloser !== 0) {\n                        result = isCloser;\n                        // The same xAxis and yAxis position, sort by z-index:\n                    }\n                    else if (isAbove !== 0) {\n                        result = isAbove;\n                        // The same zIndex, sort by array index:\n                    }\n                    else {\n                        result =\n                            p1.series.index > p2.series.index ?\n                                -1 :\n                                1;\n                    }\n                    return result;\n                }\n                series.forEach(function (s) {\n                    var noSharedTooltip = s.noSharedTooltip && shared,\n                        compareX = (!noSharedTooltip &&\n                            s.options.findNearestPointBy.indexOf('y') < 0),\n                        point = s.searchPoint(e,\n                        compareX);\n                    if ( // Check that we actually found a point on the series.\n                    isObject(point, true) &&\n                        // Use the new point if it is closer.\n                        (!isObject(closest, true) ||\n                            (sort(closest, point) > 0))) {\n                        closest = point;\n                    }\n                });\n                return closest;\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#getChartCoordinatesFromPoint\n             * @param {Highcharts.Point} point\n             * @param {boolean} [inverted]\n             * @return {Highcharts.PointerCoordinatesObject|undefined}\n             */\n            Pointer.prototype.getChartCoordinatesFromPoint = function (point, inverted) {\n                var series = point.series,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    plotX = pick(point.clientX,\n                    point.plotX),\n                    shapeArgs = point.shapeArgs;\n                if (xAxis && yAxis) {\n                    return inverted ? {\n                        chartX: xAxis.len + xAxis.pos - plotX,\n                        chartY: yAxis.len + yAxis.pos - point.plotY\n                    } : {\n                        chartX: plotX + xAxis.pos,\n                        chartY: point.plotY + yAxis.pos\n                    };\n                }\n                if (shapeArgs && shapeArgs.x && shapeArgs.y) {\n                    // E.g. pies do not have axes\n                    return {\n                        chartX: shapeArgs.x,\n                        chartY: shapeArgs.y\n                    };\n                }\n            };\n            /**\n             * Return the cached chartPosition if it is available on the Pointer,\n             * otherwise find it. Running offset is quite expensive, so it should be\n             * avoided when we know the chart hasn't moved.\n             *\n             * @function Highcharts.Pointer#getChartPosition\n             *\n             * @return {Highcharts.OffsetObject}\n             *         The offset of the chart container within the page\n             */\n            Pointer.prototype.getChartPosition = function () {\n                return (this.chartPosition ||\n                    (this.chartPosition = offset(this.chart.container)));\n            };\n            /**\n             * Get the click position in terms of axis values.\n             *\n             * @function Highcharts.Pointer#getCoordinates\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *        Pointer event, extended with `chartX` and `chartY` properties.\n             *\n             * @return {Highcharts.PointerAxisCoordinatesObject}\n             */\n            Pointer.prototype.getCoordinates = function (e) {\n                var coordinates = {\n                        xAxis: [],\n                        yAxis: []\n                    };\n                this.chart.axes.forEach(function (axis) {\n                    coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n                        axis: axis,\n                        value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n                    });\n                });\n                return coordinates;\n            };\n            /**\n             * Calculates what is the current hovered point/points and series.\n             *\n             * @private\n             * @function Highcharts.Pointer#getHoverData\n             *\n             * @param {Highcharts.Point|undefined} existingHoverPoint\n             *        The point currrently beeing hovered.\n             *\n             * @param {Highcharts.Series|undefined} existingHoverSeries\n             *        The series currently beeing hovered.\n             *\n             * @param {Array<Highcharts.Series>} series\n             *        All the series in the chart.\n             *\n             * @param {boolean} isDirectTouch\n             *        Is the pointer directly hovering the point.\n             *\n             * @param {boolean|undefined} shared\n             *        Whether it is a shared tooltip or not.\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             *        The triggering event, containing chart coordinates of the pointer.\n             *\n             * @return {object}\n             *         Object containing resulting hover data: hoverPoint, hoverSeries,\n             *         and hoverPoints.\n             */\n            Pointer.prototype.getHoverData = function (existingHoverPoint, existingHoverSeries, series, isDirectTouch, shared, e) {\n                var hoverPoint,\n                    hoverPoints = [],\n                    hoverSeries = existingHoverSeries,\n                    useExisting = !!(isDirectTouch && existingHoverPoint),\n                    notSticky = hoverSeries && !hoverSeries.stickyTracking, \n                    // Which series to look in for the hover point\n                    searchSeries, \n                    // Parameters needed for beforeGetHoverData event.\n                    eventArgs = {\n                        chartX: e ? e.chartX : void 0,\n                        chartY: e ? e.chartY : void 0,\n                        shared: shared\n                    },\n                    filter = function (s) {\n                        return (s.visible &&\n                            !(!shared && s.directTouch) && // #3821\n                            pick(s.options.enableMouseTracking,\n                    true));\n                };\n                // Find chart.hoverPane and update filter method in polar.\n                fireEvent(this, 'beforeGetHoverData', eventArgs);\n                searchSeries = notSticky ?\n                    // Only search on hovered series if it has stickyTracking false\n                    [hoverSeries] :\n                    // Filter what series to look in.\n                    series.filter(function (s) {\n                        return eventArgs.filter ? eventArgs.filter(s) : filter(s) &&\n                            s.stickyTracking;\n                    });\n                // Use existing hovered point or find the one closest to coordinates.\n                hoverPoint = useExisting || !e ?\n                    existingHoverPoint :\n                    this.findNearestKDPoint(searchSeries, shared, e);\n                // Assign hover series\n                hoverSeries = hoverPoint && hoverPoint.series;\n                // If we have a hoverPoint, assign hoverPoints.\n                if (hoverPoint) {\n                    // When tooltip is shared, it displays more than one point\n                    if (shared && !hoverSeries.noSharedTooltip) {\n                        searchSeries = series.filter(function (s) {\n                            return eventArgs.filter ?\n                                eventArgs.filter(s) : filter(s) && !s.noSharedTooltip;\n                        });\n                        // Get all points with the same x value as the hoverPoint\n                        searchSeries.forEach(function (s) {\n                            var point = find(s.points,\n                                function (p) {\n                                    return p.x === hoverPoint.x && !p.isNull;\n                            });\n                            if (isObject(point)) {\n                                /*\n                                * Boost returns a minimal point. Convert it to a usable\n                                * point for tooltip and states.\n                                */\n                                if (s.chart.isBoosting) {\n                                    point = s.getPoint(point);\n                                }\n                                hoverPoints.push(point);\n                            }\n                        });\n                    }\n                    else {\n                        hoverPoints.push(hoverPoint);\n                    }\n                }\n                // Check whether the hoverPoint is inside pane we are hovering over.\n                eventArgs = { hoverPoint: hoverPoint };\n                fireEvent(this, 'afterGetHoverData', eventArgs);\n                return {\n                    hoverPoint: eventArgs.hoverPoint,\n                    hoverSeries: hoverSeries,\n                    hoverPoints: hoverPoints\n                };\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#getPointFromEvent\n             *\n             * @param {global.Event} e\n             *\n             * @return {Highcharts.Point|undefined}\n             */\n            Pointer.prototype.getPointFromEvent = function (e) {\n                var target = e.target,\n                    point;\n                while (target && !point) {\n                    point = target.point;\n                    target = target.parentNode;\n                }\n                return point;\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onTrackerMouseOut\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onTrackerMouseOut = function (e) {\n                var chart = this.chart;\n                var relatedTarget = e.relatedTarget || e.toElement;\n                var series = chart.hoverSeries;\n                this.isDirectTouch = false;\n                if (series &&\n                    relatedTarget &&\n                    !series.stickyTracking &&\n                    !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n                    (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465, #5553\n                        !this.inClass(relatedTarget, 'highcharts-tracker'))) {\n                    series.onMouseOut();\n                }\n            };\n            /**\n             * Utility to detect whether an element has, or has a parent with, a\n             * specificclass name. Used on detection of tracker objects and on deciding\n             * whether hovering the tooltip should cause the active series to mouse out.\n             *\n             * @function Highcharts.Pointer#inClass\n             *\n             * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n             *        The element to investigate.\n             *\n             * @param {string} className\n             *        The class name to look for.\n             *\n             * @return {boolean|undefined}\n             *         True if either the element or one of its parents has the given\n             *         class name.\n             */\n            Pointer.prototype.inClass = function (element, className) {\n                var elemClassName;\n                while (element) {\n                    elemClassName = attr(element, 'class');\n                    if (elemClassName) {\n                        if (elemClassName.indexOf(className) !== -1) {\n                            return true;\n                        }\n                        if (elemClassName.indexOf('highcharts-container') !== -1) {\n                            return false;\n                        }\n                    }\n                    element = element.parentNode;\n                }\n            };\n            /**\n             * Initialize the Pointer.\n             *\n             * @private\n             * @function Highcharts.Pointer#init\n             *\n             * @param {Highcharts.Chart} chart\n             *        The Chart instance.\n             *\n             * @param {Highcharts.Options} options\n             *        The root options object. The pointer uses options from the chart\n             *        and tooltip structures.\n             *\n             * @return {void}\n             */\n            Pointer.prototype.init = function (chart, options) {\n                // Store references\n                this.options = options;\n                this.chart = chart;\n                // Do we need to handle click on a touch device?\n                this.runChartClick =\n                    options.chart.events &&\n                        !!options.chart.events.click;\n                this.pinchDown = [];\n                this.lastValidTouch = {};\n                if (Tooltip) {\n                    /**\n                     * Tooltip object for points of series.\n                     *\n                     * @name Highcharts.Chart#tooltip\n                     * @type {Highcharts.Tooltip}\n                     */\n                    chart.tooltip = new Tooltip(chart, options.tooltip);\n                    this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n                }\n                this.setDOMEvents();\n            };\n            /**\n             * Takes a browser event object and extends it with custom Highcharts\n             * properties `chartX` and `chartY` in order to work on the internal\n             * coordinate system.\n             *\n             * @function Highcharts.Pointer#normalize\n             *\n             * @param {global.MouseEvent|global.PointerEvent|global.TouchEvent} e\n             *        Event object in standard browsers.\n             *\n             * @param {Highcharts.OffsetObject} [chartPosition]\n             *        Additional chart offset.\n             *\n             * @return {Highcharts.PointerEventObject}\n             *         A browser event with extended properties `chartX` and `chartY`.\n             */\n            Pointer.prototype.normalize = function (e, chartPosition) {\n                var touches = e.touches;\n                // iOS (#2757)\n                var ePos = (touches ?\n                        touches.length ?\n                            touches.item(0) :\n                            (pick(// #13534\n                            touches.changedTouches,\n                    e.changedTouches))[0] :\n                        e);\n                // Get mouse position\n                if (!chartPosition) {\n                    chartPosition = this.getChartPosition();\n                }\n                var chartX = ePos.pageX - chartPosition.left,\n                    chartY = ePos.pageY - chartPosition.top;\n                // #11329 - when there is scaling on a parent element, we need to take\n                // this into account\n                var containerScaling = this.chart.containerScaling;\n                if (containerScaling) {\n                    chartX /= containerScaling.scaleX;\n                    chartY /= containerScaling.scaleY;\n                }\n                return extend(e, {\n                    chartX: Math.round(chartX),\n                    chartY: Math.round(chartY)\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerClick\n             */\n            Pointer.prototype.onContainerClick = function (e) {\n                var chart = this.chart;\n                var hoverPoint = chart.hoverPoint;\n                var pEvt = this.normalize(e);\n                var plotLeft = chart.plotLeft;\n                var plotTop = chart.plotTop;\n                if (!chart.cancelClick) {\n                    // On tracker click, fire the series and point events. #783, #1583\n                    if (hoverPoint &&\n                        this.inClass(pEvt.target, 'highcharts-tracker')) {\n                        // the series click event\n                        fireEvent(hoverPoint.series, 'click', extend(pEvt, {\n                            point: hoverPoint\n                        }));\n                        // the point click event\n                        if (chart.hoverPoint) { // it may be destroyed (#1844)\n                            hoverPoint.firePointEvent('click', pEvt);\n                        }\n                        // When clicking outside a tracker, fire a chart event\n                    }\n                    else {\n                        extend(pEvt, this.getCoordinates(pEvt));\n                        // fire a click event in the chart\n                        if (chart.isInsidePlot((pEvt.chartX - plotLeft), (pEvt.chartY - plotTop))) {\n                            fireEvent(chart, 'click', pEvt);\n                        }\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseDown\n             *\n             * @param {global.MouseEvent} e\n             */\n            Pointer.prototype.onContainerMouseDown = function (e) {\n                // Normalize before the 'if' for the legacy IE (#7850)\n                e = this.normalize(e);\n                // #11635, Firefox does not reliable fire move event after click scroll\n                if (H.isFirefox &&\n                    e.button !== 0) {\n                    this.onContainerMouseMove(e);\n                }\n                // #11635, limiting to primary button (incl. IE 8 support)\n                if (typeof e.button === 'undefined' ||\n                    ((e.buttons || e.button) & 1) === 1) {\n                    this.zoomOption(e);\n                    this.dragStart(e);\n                }\n            };\n            /**\n             * When mouse leaves the container, hide the tooltip.\n             *\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseLeave\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerMouseLeave = function (e) {\n                var chart = charts[pick(H.hoverChartIndex, -1)];\n                var tooltip = this.chart.tooltip;\n                e = this.normalize(e);\n                // #4886, MS Touch end fires mouseleave but with no related target\n                if (chart &&\n                    (e.relatedTarget || e.toElement)) {\n                    chart.pointer.reset();\n                    // Also reset the chart position, used in #149 fix\n                    chart.pointer.chartPosition = void 0;\n                }\n                if ( // #11635, Firefox wheel scroll does not fire out events consistently\n                tooltip &&\n                    !tooltip.isHidden) {\n                    this.reset();\n                }\n            };\n            /**\n             * The mousemove, touchmove and touchstart event handler\n             *\n             * @private\n             * @function Highcharts.Pointer#onContainerMouseMove\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerMouseMove = function (e) {\n                var chart = this.chart;\n                var pEvt = this.normalize(e);\n                this.setHoverChartIndex();\n                // In IE8 we apparently need this returnValue set to false in order to\n                // avoid text being selected. But in Chrome, e.returnValue is prevented,\n                // plus we don't need to run e.preventDefault to prevent selected text\n                // in modern browsers. So we set it conditionally. Remove it when IE8 is\n                // no longer needed. #2251, #3224.\n                if (!pEvt.preventDefault) {\n                    pEvt.returnValue = false;\n                }\n                if (chart.mouseIsDown === 'mousedown') {\n                    this.drag(pEvt);\n                }\n                // Show the tooltip and run mouse over events (#977)\n                if (!chart.openMenu &&\n                    (this.inClass(pEvt.target, 'highcharts-tracker') ||\n                        chart.isInsidePlot((pEvt.chartX - chart.plotLeft), (pEvt.chartY - chart.plotTop)))) {\n                    this.runPointActions(pEvt);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentTouchEnd\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentTouchEnd = function (e) {\n                if (charts[H.hoverChartIndex]) {\n                    charts[H.hoverChartIndex].pointer.drop(e);\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerTouchMove\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerTouchMove = function (e) {\n                this.touch(e);\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerTouchStart\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onContainerTouchStart = function (e) {\n                this.zoomOption(e);\n                this.touch(e, true);\n            };\n            /**\n             * Special handler for mouse move that will hide the tooltip when the mouse\n             * leaves the plotarea. Issue #149 workaround. The mouseleave event does not\n             * always fire.\n             *\n             * @private\n             * @function Highcharts.Pointer#onDocumentMouseMove\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentMouseMove = function (e) {\n                var chart = this.chart;\n                var chartPosition = this.chartPosition;\n                var pEvt = this.normalize(e,\n                    chartPosition);\n                var tooltip = chart.tooltip;\n                // If we're outside, hide the tooltip\n                if (chartPosition &&\n                    (!tooltip ||\n                        !tooltip.isStickyOnContact()) &&\n                    !chart.isInsidePlot(pEvt.chartX - chart.plotLeft, pEvt.chartY - chart.plotTop) &&\n                    !this.inClass(pEvt.target, 'highcharts-tracker')) {\n                    this.reset();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentMouseUp\n             *\n             * @param {global.MouseEvent} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.onDocumentMouseUp = function (e) {\n                var chart = charts[pick(H.hoverChartIndex, -1)];\n                if (chart) {\n                    chart.pointer.drop(e);\n                }\n            };\n            /**\n             * Handle touch events with two touches\n             *\n             * @private\n             * @function Highcharts.Pointer#pinch\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinch = function (e) {\n                var self = this,\n                    chart = self.chart,\n                    pinchDown = self.pinchDown,\n                    touches = (e.touches || []),\n                    touchesLength = touches.length,\n                    lastValidTouch = self.lastValidTouch,\n                    hasZoom = self.hasZoom,\n                    selectionMarker = self.selectionMarker,\n                    transform = {},\n                    fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, 'highcharts-tracker') &&\n                        chart.runTrackerClick) ||\n                        self.runChartClick),\n                    clip = {};\n                // Don't initiate panning until the user has pinched. This prevents us\n                // from blocking page scrolling as users scroll down a long page\n                // (#4210).\n                if (touchesLength > 1) {\n                    self.initiated = true;\n                }\n                // On touch devices, only proceed to trigger click if a handler is\n                // defined\n                if (hasZoom && self.initiated && !fireClickEvent) {\n                    e.preventDefault();\n                }\n                // Normalize each touch\n                [].map.call(touches, function (e) {\n                    return self.normalize(e);\n                });\n                // Register the touch start position\n                if (e.type === 'touchstart') {\n                    [].forEach.call(touches, function (e, i) {\n                        pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };\n                    });\n                    lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] &&\n                            pinchDown[1].chartX];\n                    lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] &&\n                            pinchDown[1].chartY];\n                    // Identify the data bounds in pixels\n                    chart.axes.forEach(function (axis) {\n                        if (axis.zoomEnabled) {\n                            var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n                                minPixelPadding = axis.minPixelPadding,\n                                min = axis.toPixels(Math.min(pick(axis.options.min,\n                                axis.dataMin),\n                                axis.dataMin)),\n                                max = axis.toPixels(Math.max(pick(axis.options.max,\n                                axis.dataMax),\n                                axis.dataMax)),\n                                absMin = Math.min(min,\n                                max),\n                                absMax = Math.max(min,\n                                max);\n                            // Store the bounds for use in the touchmove handler\n                            bounds.min = Math.min(axis.pos, absMin - minPixelPadding);\n                            bounds.max = Math.max(axis.pos + axis.len, absMax + minPixelPadding);\n                        }\n                    });\n                    self.res = true; // reset on next move\n                    // Optionally move the tooltip on touchmove\n                }\n                else if (self.followTouchMove && touchesLength === 1) {\n                    this.runPointActions(self.normalize(e));\n                    // Event type is touchmove, handle panning and pinching\n                }\n                else if (pinchDown.length) { // can be 0 when releasing, if touchend\n                    // fires first\n                    // Set the marker\n                    if (!selectionMarker) {\n                        self.selectionMarker = selectionMarker = extend({\n                            destroy: noop,\n                            touch: true\n                        }, chart.plotBox);\n                    }\n                    self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                    self.hasPinched = hasZoom;\n                    // Scale and translate the groups to provide visual feedback during\n                    // pinching\n                    self.scaleGroups(transform, clip);\n                    if (self.res) {\n                        self.res = false;\n                        this.reset(false, 0);\n                    }\n                }\n            };\n            /**\n             * Run translation operations\n             *\n             * @private\n             * @function Highcharts.Pointer#pinchTranslate\n             *\n             * @param {Array<*>} pinchDown\n             *\n             * @param {Array<Highcharts.PointerEventObject>} touches\n             *\n             * @param {*} transform\n             *\n             * @param {*} selectionMarker\n             *\n             * @param {*} clip\n             *\n             * @param {*} lastValidTouch\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinchTranslate = function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n                if (this.zoomHor) {\n                    this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n                if (this.zoomVert) {\n                    this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n                }\n            };\n            /**\n             * Run translation operations for each direction (horizontal and vertical)\n             * independently.\n             *\n             * @private\n             * @function Highcharts.Pointer#pinchTranslateDirection\n             *\n             * @param {boolean} horiz\n             *\n             * @param {Array<*>} pinchDown\n             *\n             * @param {Array<Highcharts.PointerEventObject>} touches\n             *\n             * @param {*} transform\n             *\n             * @param {*} selectionMarker\n             *\n             * @param {*} clip\n             *\n             * @param {*} lastValidTouch\n             *\n             * @param {number|undefined} [forcedScale=1]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.pinchTranslateDirection = function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {\n                var chart = this.chart, xy = horiz ? 'x' : 'y', XY = horiz ? 'X' : 'Y', sChartXY = ('chart' + XY), wh = horiz ? 'width' : 'height', plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')], selectionWH, selectionXY, clipXY, scale = forcedScale || 1, inverted = chart.inverted, bounds = chart.bounds[horiz ? 'h' : 'v'], singleTouch = pinchDown.length === 1, touch0Start = pinchDown[0][sChartXY], touch0Now = touches[0][sChartXY], touch1Start = !singleTouch && pinchDown[1][sChartXY], touch1Now = !singleTouch && touches[1][sChartXY], outOfBounds, transformScale, scaleKey, setScale = function () {\n                        // Don't zoom if fingers are too close on this axis\n                        if (typeof touch1Now === 'number' &&\n                            Math.abs(touch0Start - touch1Start) > 20) {\n                            scale = forcedScale ||\n                                Math.abs(touch0Now - touch1Now) /\n                                    Math.abs(touch0Start - touch1Start);\n                    }\n                    clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n                    selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n                };\n                // Set the scale, first pass\n                setScale();\n                // The clip position (x or y) is altered if out of bounds, the selection\n                // position is not\n                selectionXY = clipXY;\n                // Out of bounds\n                if (selectionXY < bounds.min) {\n                    selectionXY = bounds.min;\n                    outOfBounds = true;\n                }\n                else if (selectionXY + selectionWH > bounds.max) {\n                    selectionXY = bounds.max - selectionWH;\n                    outOfBounds = true;\n                }\n                // Is the chart dragged off its bounds, determined by dataMin and\n                // dataMax?\n                if (outOfBounds) {\n                    // Modify the touchNow position in order to create an elastic drag\n                    // movement. This indicates to the user that the chart is responsive\n                    // but can't be dragged further.\n                    touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n                    if (typeof touch1Now === 'number') {\n                        touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n                    }\n                    // Set the scale, second pass to adapt to the modified touchNow\n                    // positions\n                    setScale();\n                }\n                else {\n                    lastValidTouch[xy] = [touch0Now, touch1Now];\n                }\n                // Set geometry for clipping, selection and transformation\n                if (!inverted) {\n                    clip[xy] = clipXY - plotLeftTop;\n                    clip[wh] = selectionWH;\n                }\n                scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n                transformScale = inverted ? 1 / scale : scale;\n                selectionMarker[wh] = selectionWH;\n                selectionMarker[xy] = selectionXY;\n                transform[scaleKey] = scale;\n                transform['translate' + XY] = (transformScale * plotLeftTop) +\n                    (touch0Now - (transformScale * touch0Start));\n            };\n            /**\n             * Reset the tracking by hiding the tooltip, the hover series state and the\n             * hover point\n             *\n             * @function Highcharts.Pointer#reset\n             *\n             * @param {boolean} [allowMove]\n             *        Instead of destroying the tooltip altogether, allow moving it if\n             *        possible.\n             *\n             * @param {number} [delay]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.reset = function (allowMove, delay) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    hoverSeries = chart.hoverSeries,\n                    hoverPoint = chart.hoverPoint,\n                    hoverPoints = chart.hoverPoints,\n                    tooltip = chart.tooltip,\n                    tooltipPoints = tooltip && tooltip.shared ?\n                        hoverPoints :\n                        hoverPoint;\n                // Check if the points have moved outside the plot area (#1003, #4736,\n                // #5101)\n                if (allowMove && tooltipPoints) {\n                    splat(tooltipPoints).forEach(function (point) {\n                        if (point.series.isCartesian &&\n                            typeof point.plotX === 'undefined') {\n                            allowMove = false;\n                        }\n                    });\n                }\n                // Just move the tooltip, #349\n                if (allowMove) {\n                    if (tooltip && tooltipPoints && splat(tooltipPoints).length) {\n                        tooltip.refresh(tooltipPoints);\n                        if (tooltip.shared && hoverPoints) { // #8284\n                            hoverPoints.forEach(function (point) {\n                                point.setState(point.state, true);\n                                if (point.series.isCartesian) {\n                                    if (point.series.xAxis.crosshair) {\n                                        point.series.xAxis\n                                            .drawCrosshair(null, point);\n                                    }\n                                    if (point.series.yAxis.crosshair) {\n                                        point.series.yAxis\n                                            .drawCrosshair(null, point);\n                                    }\n                                }\n                            });\n                        }\n                        else if (hoverPoint) { // #2500\n                            hoverPoint.setState(hoverPoint.state, true);\n                            chart.axes.forEach(function (axis) {\n                                if (axis.crosshair &&\n                                    hoverPoint.series[axis.coll] === axis) {\n                                    axis.drawCrosshair(null, hoverPoint);\n                                }\n                            });\n                        }\n                    }\n                    // Full reset\n                }\n                else {\n                    if (hoverPoint) {\n                        hoverPoint.onMouseOut();\n                    }\n                    if (hoverPoints) {\n                        hoverPoints.forEach(function (point) {\n                            point.setState();\n                        });\n                    }\n                    if (hoverSeries) {\n                        hoverSeries.onMouseOut();\n                    }\n                    if (tooltip) {\n                        tooltip.hide(delay);\n                    }\n                    if (pointer.unDocMouseMove) {\n                        pointer.unDocMouseMove = pointer.unDocMouseMove();\n                    }\n                    // Remove crosshairs\n                    chart.axes.forEach(function (axis) {\n                        axis.hideCrosshair();\n                    });\n                    pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;\n                }\n            };\n            /**\n             * With line type charts with a single tracker, get the point closest to the\n             * mouse. Run Point.onMouseOver and display tooltip for the point or points.\n             *\n             * @private\n             * @function Highcharts.Pointer#runPointActions\n             *\n             * @param {global.Event} e\n             *\n             * @param {Highcharts.PointerEventObject} [p]\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:mouseOut\n             * @fires Highcharts.Point#event:mouseOver\n             */\n            Pointer.prototype.runPointActions = function (e, p) {\n                var pointer = this,\n                    chart = pointer.chart,\n                    series = chart.series,\n                    tooltip = (chart.tooltip && chart.tooltip.options.enabled ?\n                        chart.tooltip :\n                        void 0),\n                    shared = (tooltip ?\n                        tooltip.shared :\n                        false),\n                    hoverPoint = p || chart.hoverPoint,\n                    hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries, \n                    // onMouseOver or already hovering a series with directTouch\n                    isDirectTouch = (!e || e.type !== 'touchmove') && (!!p || ((hoverSeries && hoverSeries.directTouch) &&\n                        pointer.isDirectTouch)),\n                    hoverData = this.getHoverData(hoverPoint,\n                    hoverSeries,\n                    series,\n                    isDirectTouch,\n                    shared,\n                    e),\n                    useSharedTooltip,\n                    followPointer,\n                    anchor,\n                    points;\n                // Update variables from hoverData.\n                hoverPoint = hoverData.hoverPoint;\n                points = hoverData.hoverPoints;\n                hoverSeries = hoverData.hoverSeries;\n                followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n                useSharedTooltip = (shared &&\n                    hoverSeries &&\n                    !hoverSeries.noSharedTooltip);\n                // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n                // #3926, #4200\n                if (hoverPoint &&\n                    // !(hoverSeries && hoverSeries.directTouch) &&\n                    (hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))) {\n                    (chart.hoverPoints || []).forEach(function (p) {\n                        if (points.indexOf(p) === -1) {\n                            p.setState();\n                        }\n                    });\n                    // Set normal state to previous series\n                    if (chart.hoverSeries !== hoverSeries) {\n                        hoverSeries.onMouseOver();\n                    }\n                    pointer.applyInactiveState(points);\n                    // Do mouseover on all points (#3919, #3985, #4410, #5622)\n                    (points || []).forEach(function (p) {\n                        p.setState('hover');\n                    });\n                    // If tracking is on series in stead of on each point,\n                    // fire mouseOver on hover point. // #4448\n                    if (chart.hoverPoint) {\n                        chart.hoverPoint.firePointEvent('mouseOut');\n                    }\n                    // Hover point may have been destroyed in the event handlers (#7127)\n                    if (!hoverPoint.series) {\n                        return;\n                    }\n                    /**\n                     * Contains all hovered points.\n                     *\n                     * @name Highcharts.Chart#hoverPoints\n                     * @type {Array<Highcharts.Point>|null}\n                     */\n                    chart.hoverPoints = points;\n                    /**\n                     * Contains the original hovered point.\n                     *\n                     * @name Highcharts.Chart#hoverPoint\n                     * @type {Highcharts.Point|null}\n                     */\n                    chart.hoverPoint = hoverPoint;\n                    /**\n                     * Hover state should not be lost when axis is updated (#12569)\n                     * Axis.update runs pointer.reset which uses chart.hoverPoint.state\n                     * to apply state which does not exist in hoverPoint yet.\n                     * The mouseOver event should be triggered when hoverPoint\n                     * is correct.\n                     */\n                    hoverPoint.firePointEvent('mouseOver');\n                    // Draw tooltip if necessary\n                    if (tooltip) {\n                        tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n                    }\n                    // Update positions (regardless of kdpoint or hoverPoint)\n                }\n                else if (followPointer && tooltip && !tooltip.isHidden) {\n                    anchor = tooltip.getAnchor([{}], e);\n                    tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n                }\n                // Start the event listener to pick up the tooltip and crosshairs\n                if (!pointer.unDocMouseMove) {\n                    pointer.unDocMouseMove = addEvent(chart.container.ownerDocument, 'mousemove', function (e) {\n                        var chart = charts[H.hoverChartIndex];\n                        if (chart) {\n                            chart.pointer.onDocumentMouseMove(e);\n                        }\n                    });\n                }\n                // Issues related to crosshair #4927, #5269 #5066, #5658\n                chart.axes.forEach(function drawAxisCrosshair(axis) {\n                    var snap = pick((axis.crosshair || {}).snap,\n                        true);\n                    var point;\n                    if (snap) {\n                        point = chart.hoverPoint; // #13002\n                        if (!point || point.series[axis.coll] !== axis) {\n                            point = find(points, function (p) {\n                                return p.series[axis.coll] === axis;\n                            });\n                        }\n                    }\n                    // Axis has snapping crosshairs, and one of the hover points belongs\n                    // to axis. Always call drawCrosshair when it is not snap.\n                    if (point || !snap) {\n                        axis.drawCrosshair(e, point);\n                        // Axis has snapping crosshairs, but no hover point belongs to axis\n                    }\n                    else {\n                        axis.hideCrosshair();\n                    }\n                });\n            };\n            /**\n             * Scale series groups to a certain scale and translation.\n             *\n             * @private\n             * @function Highcharts.Pointer#scaleGroups\n             *\n             * @param {Highcharts.SeriesPlotBoxObject} [attribs]\n             *\n             * @param {boolean} [clip]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.scaleGroups = function (attribs, clip) {\n                var chart = this.chart,\n                    seriesAttribs;\n                // Scale each series\n                chart.series.forEach(function (series) {\n                    seriesAttribs = attribs || series.getPlotBox(); // #1701\n                    if (series.xAxis && series.xAxis.zoomEnabled && series.group) {\n                        series.group.attr(seriesAttribs);\n                        if (series.markerGroup) {\n                            series.markerGroup.attr(seriesAttribs);\n                            series.markerGroup.clip(clip ? chart.clipRect : null);\n                        }\n                        if (series.dataLabelsGroup) {\n                            series.dataLabelsGroup.attr(seriesAttribs);\n                        }\n                    }\n                });\n                // Clip\n                chart.clipRect.attr(clip || chart.clipBox);\n            };\n            /**\n             * Set the JS DOM events on the container and document. This method should\n             * contain a one-to-one assignment between methods and their handlers. Any\n             * advanced logic should be moved to the handler reflecting the event's\n             * name.\n             *\n             * @private\n             * @function Highcharts.Pointer#setDOMEvents\n             *\n             * @return {void}\n             */\n            Pointer.prototype.setDOMEvents = function () {\n                var container = this.chart.container,\n                    ownerDoc = container.ownerDocument;\n                container.onmousedown = this.onContainerMouseDown.bind(this);\n                container.onmousemove = this.onContainerMouseMove.bind(this);\n                container.onclick = this.onContainerClick.bind(this);\n                this.unbindContainerMouseLeave = addEvent(container, 'mouseleave', this.onContainerMouseLeave.bind(this));\n                if (!H.unbindDocumentMouseUp) {\n                    H.unbindDocumentMouseUp = addEvent(ownerDoc, 'mouseup', this.onDocumentMouseUp.bind(this));\n                }\n                if (H.hasTouch) {\n                    addEvent(container, 'touchstart', this.onContainerTouchStart.bind(this));\n                    addEvent(container, 'touchmove', this.onContainerTouchMove.bind(this));\n                    if (!H.unbindDocumentTouchEnd) {\n                        H.unbindDocumentTouchEnd = addEvent(ownerDoc, 'touchend', this.onDocumentTouchEnd.bind(this));\n                    }\n                }\n            };\n            /**\n             * Sets the index of the hovered chart and leaves the previous hovered\n             * chart, to reset states like tooltip.\n             *\n             * @private\n             * @function Highcharts.Pointer#setHoverChartIndex\n             */\n            Pointer.prototype.setHoverChartIndex = function () {\n                var chart = this.chart;\n                var hoverChart = H.charts[pick(H.hoverChartIndex, -1)];\n                if (hoverChart &&\n                    hoverChart !== chart) {\n                    hoverChart.pointer.onContainerMouseLeave({ relatedTarget: true });\n                }\n                if (!hoverChart ||\n                    !hoverChart.mouseIsDown) {\n                    H.hoverChartIndex = chart.index;\n                }\n            };\n            /**\n             * General touch handler shared by touchstart and touchmove.\n             *\n             * @private\n             * @function Highcharts.Pointer#touch\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @param {boolean} [start]\n             *\n             * @return {void}\n             */\n            Pointer.prototype.touch = function (e, start) {\n                var chart = this.chart,\n                    hasMoved,\n                    pinchDown,\n                    isInside;\n                this.setHoverChartIndex();\n                if (e.touches.length === 1) {\n                    e = this.normalize(e);\n                    isInside = chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop);\n                    if (isInside && !chart.openMenu) {\n                        // Run mouse events and display tooltip etc\n                        if (start) {\n                            this.runPointActions(e);\n                        }\n                        // Android fires touchmove events after the touchstart even if\n                        // the finger hasn't moved, or moved only a pixel or two. In iOS\n                        // however, the touchmove doesn't fire unless the finger moves\n                        // more than ~4px. So we emulate this behaviour in Android by\n                        // checking how much it moved, and cancelling on small\n                        // distances. #3450.\n                        if (e.type === 'touchmove') {\n                            pinchDown = this.pinchDown;\n                            hasMoved = pinchDown[0] ? Math.sqrt(// #5266\n                            Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n                                Math.pow(pinchDown[0].chartY - e.chartY, 2)) >= 4 : false;\n                        }\n                        if (pick(hasMoved, true)) {\n                            this.pinch(e);\n                        }\n                    }\n                    else if (start) {\n                        // Hide the tooltip on touching outside the plot area (#1203)\n                        this.reset();\n                    }\n                }\n                else if (e.touches.length === 2) {\n                    this.pinch(e);\n                }\n            };\n            /**\n             * Resolve the zoomType option, this is reset on all touch start and mouse\n             * down events.\n             *\n             * @private\n             * @function Highcharts.Pointer#zoomOption\n             *\n             * @param {global.Event} e\n             *        Event object.\n             *\n             * @param {void}\n             */\n            Pointer.prototype.zoomOption = function (e) {\n                var chart = this.chart,\n                    options = chart.options.chart,\n                    zoomType = options.zoomType || '',\n                    inverted = chart.inverted,\n                    zoomX,\n                    zoomY;\n                // Look for the pinchType option\n                if (/touch/.test(e.type)) {\n                    zoomType = pick(options.pinchType, zoomType);\n                }\n                this.zoomX = zoomX = /x/.test(zoomType);\n                this.zoomY = zoomY = /y/.test(zoomType);\n                this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n                this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n                this.hasZoom = zoomX || zoomY;\n            };\n            return Pointer;\n        }());\n        H.Pointer = Pointer;\n\n        return Pointer;\n    });\n    _registerModule(_modules, 'parts/MSPointer.js', [_modules['parts/Globals.js'], _modules['parts/Pointer.js'], _modules['parts/Utilities.js']], function (H, Pointer, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var __extends = (this && this.__extends) || (function () {\n                var extendStatics = function (d,\n            b) {\n                    extendStatics = Object.setPrototypeOf ||\n                        ({ __proto__: [] } instanceof Array && function (d,\n            b) { d.__proto__ = b; }) ||\n                        function (d,\n            b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n                return extendStatics(d, b);\n            };\n            return function (d, b) {\n                extendStatics(d, b);\n                function __() { this.constructor = d; }\n                d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n            };\n        })();\n        var charts = H.charts,\n            doc = H.doc,\n            noop = H.noop,\n            win = H.win;\n        var addEvent = U.addEvent,\n            css = U.css,\n            objectEach = U.objectEach,\n            removeEvent = U.removeEvent;\n        /* globals MSPointerEvent, PointerEvent */\n        // The touches object keeps track of the points being touched at all times\n        var touches = {};\n        var hasPointerEvent = !!win.PointerEvent;\n        /* eslint-disable valid-jsdoc */\n        /** @private */\n        function getWebkitTouches() {\n            var fake = [];\n            fake.item = function (i) {\n                return this[i];\n            };\n            objectEach(touches, function (touch) {\n                fake.push({\n                    pageX: touch.pageX,\n                    pageY: touch.pageY,\n                    target: touch.target\n                });\n            });\n            return fake;\n        }\n        /** @private */\n        function translateMSPointer(e, method, wktype, func) {\n            var p;\n            if ((e.pointerType === 'touch' ||\n                e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[H.hoverChartIndex]) {\n                func(e);\n                p = charts[H.hoverChartIndex].pointer;\n                p[method]({\n                    type: wktype,\n                    target: e.currentTarget,\n                    preventDefault: noop,\n                    touches: getWebkitTouches()\n                });\n            }\n        }\n        /** @private */\n        var MSPointer = /** @class */ (function (_super) {\n                __extends(MSPointer, _super);\n            function MSPointer() {\n                return _super !== null && _super.apply(this, arguments) || this;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Add or remove the MS Pointer specific events\n             *\n             * @private\n             * @function Highcharts.Pointer#batchMSEvents\n             *\n             * @param {Function} fn\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.batchMSEvents = function (fn) {\n                fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n                fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n                fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n            };\n            // Destroy MS events also\n            MSPointer.prototype.destroy = function () {\n                this.batchMSEvents(removeEvent);\n                _super.prototype.destroy.call(this);\n            };\n            // Disable default IE actions for pinch and such on chart element\n            MSPointer.prototype.init = function (chart, options) {\n                _super.prototype.init.call(this, chart, options);\n                if (this.hasZoom) { // #4014\n                    css(chart.container, {\n                        '-ms-touch-action': 'none',\n                        'touch-action': 'none'\n                    });\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerPointerDown\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onContainerPointerDown = function (e) {\n                translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {\n                    touches[e.pointerId] = {\n                        pageX: e.pageX,\n                        pageY: e.pageY,\n                        target: e.currentTarget\n                    };\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onContainerPointerMove\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onContainerPointerMove = function (e) {\n                translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {\n                    touches[e.pointerId] = ({ pageX: e.pageX, pageY: e.pageY });\n                    if (!touches[e.pointerId].target) {\n                        touches[e.pointerId].target = e.currentTarget;\n                    }\n                });\n            };\n            /**\n             * @private\n             * @function Highcharts.Pointer#onDocumentPointerUp\n             *\n             * @param {Highcharts.PointerEventObject} e\n             *\n             * @return {void}\n             */\n            MSPointer.prototype.onDocumentPointerUp = function (e) {\n                translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function (e) {\n                    delete touches[e.pointerId];\n                });\n            };\n            // Add IE specific touch events to chart\n            MSPointer.prototype.setDOMEvents = function () {\n                _super.prototype.setDOMEvents.call(this);\n                if (this.hasZoom || this.followTouchMove) {\n                    this.batchMSEvents(addEvent);\n                }\n            };\n            return MSPointer;\n        }(Pointer));\n\n        return MSPointer;\n    });\n    _registerModule(_modules, 'parts/Legend.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Gets fired when the legend item belonging to a point is clicked. The default\n         * action is to toggle the visibility of the point. This can be prevented by\n         * returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.PointLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        The point on which the event occured.\n         *\n         * @param {Highcharts.PointLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the legend click event.\n         *\n         * @interface Highcharts.PointLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.PointLegendItemClickEventObject#browserEvent\n        * @type {Highcharts.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the point.\n        * @name Highcharts.PointLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related point.\n        * @name Highcharts.PointLegendItemClickEventObject#target\n        * @type {Highcharts.Point}\n        */ /**\n        * Event type.\n        * @name Highcharts.PointLegendItemClickEventObject#type\n        * @type {\"legendItemClick\"}\n        */\n        /**\n         * Gets fired when the legend item belonging to a series is clicked. The default\n         * action is to toggle the visibility of the series. This can be prevented by\n         * returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the legend click event.\n         *\n         * @interface Highcharts.SeriesLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n        * @type {Highcharts.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesLegendItemClickEventObject#type\n        * @type {\"legendItemClick\"}\n        */\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            setAnimation = U.setAnimation,\n            stableSort = U.stableSort,\n            syncTimeout = U.syncTimeout,\n            wrap = U.wrap;\n        var isFirefox = H.isFirefox,\n            marginNames = H.marginNames,\n            win = H.win;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The overview of the chart's series. The legend object is instanciated\n         * internally in the chart constructor, and is available from the `chart.legend`\n         * property. Each chart has only one legend.\n         *\n         * @class\n         * @name Highcharts.Legend\n         *\n         * @param {Highcharts.Chart} chart\n         * The chart instance.\n         *\n         * @param {Highcharts.LegendOptions} options\n         * Legend options.\n         */\n        var Legend = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Legend(chart, options) {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    this.allItems = [];\n                this.box = void 0;\n                this.contentGroup = void 0;\n                this.display = false;\n                this.group = void 0;\n                this.initialItemY = 0;\n                this.itemHeight = 0;\n                this.itemMarginBottom = 0;\n                this.itemMarginTop = 0;\n                this.itemX = 0;\n                this.itemY = 0;\n                this.lastItemY = 0;\n                this.lastLineHeight = 0;\n                this.legendHeight = 0;\n                this.legendWidth = 0;\n                this.maxItemWidth = 0;\n                this.maxLegendWidth = 0;\n                this.offsetWidth = 0;\n                this.options = {};\n                this.padding = 0;\n                this.pages = [];\n                this.proximate = false;\n                this.scrollGroup = void 0;\n                this.symbolHeight = 0;\n                this.symbolWidth = 0;\n                this.titleHeight = 0;\n                this.totalItemWidth = 0;\n                this.widthOption = 0;\n                this.chart = chart;\n                this.init(chart, options);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Initialize the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#init\n             *\n             * @param {Highcharts.Chart} chart\n             * The chart instance.\n             *\n             * @param {Highcharts.LegendOptions} options\n             * Legend options.\n             */\n            Legend.prototype.init = function (chart, options) {\n                /**\n                 * Chart of this legend.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#chart\n                 * @type {Highcharts.Chart}\n                 */\n                this.chart = chart;\n                this.setOptions(options);\n                if (options.enabled) {\n                    // Render it\n                    this.render();\n                    // move checkboxes\n                    addEvent(this.chart, 'endResize', function () {\n                        this.legend.positionCheckboxes();\n                    });\n                    if (this.proximate) {\n                        this.unchartrender = addEvent(this.chart, 'render', function () {\n                            this.legend.proximatePositions();\n                            this.legend.positionItems();\n                        });\n                    }\n                    else if (this.unchartrender) {\n                        this.unchartrender();\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#setOptions\n             * @param {Highcharts.LegendOptions} options\n             */\n            Legend.prototype.setOptions = function (options) {\n                var padding = pick(options.padding, 8);\n                /**\n                 * Legend options.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#options\n                 * @type {Highcharts.LegendOptions}\n                 */\n                this.options = options;\n                if (!this.chart.styledMode) {\n                    this.itemStyle = options.itemStyle;\n                    this.itemHiddenStyle = merge(this.itemStyle, options.itemHiddenStyle);\n                }\n                this.itemMarginTop = options.itemMarginTop || 0;\n                this.itemMarginBottom = options.itemMarginBottom || 0;\n                this.padding = padding;\n                this.initialItemY = padding - 5; // 5 is pixels above the text\n                this.symbolWidth = pick(options.symbolWidth, 16);\n                this.pages = [];\n                this.proximate = options.layout === 'proximate' && !this.chart.inverted;\n                this.baseline = void 0; // #12705: baseline has to be reset on every update\n            };\n            /**\n             * Update the legend with new options. Equivalent to running `chart.update`\n             * with a legend configuration option.\n             *\n             * @sample highcharts/legend/legend-update/\n             *         Legend update\n             *\n             * @function Highcharts.Legend#update\n             *\n             * @param {Highcharts.LegendOptions} options\n             * Legend options.\n             *\n             * @param {boolean} [redraw=true]\n             * Whether to redraw the chart after the axis is altered. If doing more\n             * operations on the chart, it is a good idea to set redraw to false and\n             * call {@link Chart#redraw} after. Whether to redraw the chart.\n             *\n             * @fires Highcharts.Legends#event:afterUpdate\n             */\n            Legend.prototype.update = function (options, redraw) {\n                var chart = this.chart;\n                this.setOptions(merge(true, this.options, options));\n                this.destroy();\n                chart.isDirtyLegend = chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n                fireEvent(this, 'afterUpdate');\n            };\n            /**\n             * Set the colors for the legend item.\n             *\n             * @private\n             * @function Highcharts.Legend#colorizeItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             *        A Series or Point instance\n             * @param {boolean} [visible=false]\n             *        Dimmed or colored\n             *\n             * @todo\n             * Make events official: Fires the event `afterColorizeItem`.\n             */\n            Legend.prototype.colorizeItem = function (item, visible) {\n                item.legendGroup[visible ? 'removeClass' : 'addClass']('highcharts-legend-item-hidden');\n                if (!this.chart.styledMode) {\n                    var legend = this,\n                        options = legend.options,\n                        legendItem = item.legendItem,\n                        legendLine = item.legendLine,\n                        legendSymbol = item.legendSymbol,\n                        hiddenColor = legend.itemHiddenStyle.color,\n                        textColor = visible ?\n                            options.itemStyle.color :\n                            hiddenColor,\n                        symbolColor = visible ?\n                            (item.color || hiddenColor) :\n                            hiddenColor,\n                        markerOptions = item.options && item.options.marker,\n                        symbolAttr = { fill: symbolColor };\n                    if (legendItem) {\n                        legendItem.css({\n                            fill: textColor,\n                            color: textColor // #1553, oldIE\n                        });\n                    }\n                    if (legendLine) {\n                        legendLine.attr({ stroke: symbolColor });\n                    }\n                    if (legendSymbol) {\n                        // Apply marker options\n                        if (markerOptions && legendSymbol.isMarker) { // #585\n                            symbolAttr = item.pointAttribs();\n                            if (!visible) {\n                                // #6769\n                                symbolAttr.stroke = symbolAttr.fill = hiddenColor;\n                            }\n                        }\n                        legendSymbol.attr(symbolAttr);\n                    }\n                }\n                fireEvent(this, 'afterColorizeItem', { item: item, visible: visible });\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#positionItems\n             */\n            Legend.prototype.positionItems = function () {\n                // Now that the legend width and height are established, put the items\n                // in the final position\n                this.allItems.forEach(this.positionItem, this);\n                if (!this.chart.isResizing) {\n                    this.positionCheckboxes();\n                }\n            };\n            /**\n             * Position the legend item.\n             *\n             * @private\n             * @function Highcharts.Legend#positionItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to position\n             */\n            Legend.prototype.positionItem = function (item) {\n                var _this = this;\n                var legend = this,\n                    options = legend.options,\n                    symbolPadding = options.symbolPadding,\n                    ltr = !options.rtl,\n                    legendItemPos = item._legendItemPos,\n                    itemX = legendItemPos[0],\n                    itemY = legendItemPos[1],\n                    checkbox = item.checkbox,\n                    legendGroup = item.legendGroup;\n                if (legendGroup && legendGroup.element) {\n                    var attribs = {\n                            translateX: ltr ?\n                                itemX :\n                                legend.legendWidth - itemX - 2 * symbolPadding - 4,\n                            translateY: itemY\n                        };\n                    var complete = function () {\n                            fireEvent(_this, 'afterPositionItem', { item: item });\n                    };\n                    if (defined(legendGroup.translateY)) {\n                        legendGroup.animate(attribs, { complete: complete });\n                    }\n                    else {\n                        legendGroup.attr(attribs);\n                        complete();\n                    }\n                }\n                if (checkbox) {\n                    checkbox.x = itemX;\n                    checkbox.y = itemY;\n                }\n            };\n            /**\n             * Destroy a single legend item, used internally on removing series items.\n             *\n             * @private\n             * @function Highcharts.Legend#destroyItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to remove\n             */\n            Legend.prototype.destroyItem = function (item) {\n                var checkbox = item.checkbox;\n                // destroy SVG elements\n                ['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'].forEach(function (key) {\n                    if (item[key]) {\n                        item[key] = item[key].destroy();\n                    }\n                });\n                if (checkbox) {\n                    discardElement(item.checkbox);\n                }\n            };\n            /**\n             * Destroy the legend. Used internally. To reflow objects, `chart.redraw`\n             * must be called after destruction.\n             *\n             * @private\n             * @function Highcharts.Legend#destroy\n             */\n            Legend.prototype.destroy = function () {\n                /**\n                 * @private\n                 * @param {string} key\n                 * @return {void}\n                 */\n                function destroyItems(key) {\n                    if (this[key]) {\n                        this[key] = this[key].destroy();\n                    }\n                }\n                // Destroy items\n                this.getAllItems().forEach(function (item) {\n                    ['legendItem', 'legendGroup'].forEach(destroyItems, item);\n                });\n                // Destroy legend elements\n                [\n                    'clipRect',\n                    'up',\n                    'down',\n                    'pager',\n                    'nav',\n                    'box',\n                    'title',\n                    'group'\n                ].forEach(destroyItems, this);\n                this.display = null; // Reset in .render on update.\n            };\n            /**\n             * Position the checkboxes after the width is determined.\n             *\n             * @private\n             * @function Highcharts.Legend#positionCheckboxes\n             */\n            Legend.prototype.positionCheckboxes = function () {\n                var alignAttr = this.group && this.group.alignAttr,\n                    translateY,\n                    clipHeight = this.clipHeight || this.legendHeight,\n                    titleHeight = this.titleHeight;\n                if (alignAttr) {\n                    translateY = alignAttr.translateY;\n                    this.allItems.forEach(function (item) {\n                        var checkbox = item.checkbox,\n                            top;\n                        if (checkbox) {\n                            top = translateY + titleHeight + checkbox.y +\n                                (this.scrollOffset || 0) + 3;\n                            css(checkbox, {\n                                left: (alignAttr.translateX + item.checkboxOffset +\n                                    checkbox.x - 20) + 'px',\n                                top: top + 'px',\n                                display: this.proximate || (top > translateY - 6 &&\n                                    top < translateY + clipHeight - 6) ?\n                                    '' :\n                                    'none'\n                            });\n                        }\n                    }, this);\n                }\n            };\n            /**\n             * Render the legend title on top of the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#renderTitle\n             */\n            Legend.prototype.renderTitle = function () {\n                var options = this.options,\n                    padding = this.padding,\n                    titleOptions = options.title,\n                    titleHeight = 0,\n                    bBox;\n                if (titleOptions.text) {\n                    if (!this.title) {\n                        /**\n                         * SVG element of the legend title.\n                         *\n                         * @readonly\n                         * @name Highcharts.Legend#title\n                         * @type {Highcharts.SVGElement}\n                         */\n                        this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, options.useHTML, null, 'legend-title')\n                            .attr({ zIndex: 1 });\n                        if (!this.chart.styledMode) {\n                            this.title.css(titleOptions.style);\n                        }\n                        this.title.add(this.group);\n                    }\n                    // Set the max title width (#7253)\n                    if (!titleOptions.width) {\n                        this.title.css({\n                            width: this.maxLegendWidth + 'px'\n                        });\n                    }\n                    bBox = this.title.getBBox();\n                    titleHeight = bBox.height;\n                    this.offsetWidth = bBox.width; // #1717\n                    this.contentGroup.attr({ translateY: titleHeight });\n                }\n                this.titleHeight = titleHeight;\n            };\n            /**\n             * Set the legend item text.\n             *\n             * @function Highcharts.Legend#setText\n             * @param {Highcharts.Point|Highcharts.Series} item\n             *        The item for which to update the text in the legend.\n             */\n            Legend.prototype.setText = function (item) {\n                var options = this.options;\n                item.legendItem.attr({\n                    text: options.labelFormat ?\n                        format(options.labelFormat, item, this.chart) :\n                        options.labelFormatter.call(item)\n                });\n            };\n            /**\n             * Render a single specific legend item. Called internally from the `render`\n             * function.\n             *\n             * @private\n             * @function Highcharts.Legend#renderItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             * The item to render.\n             */\n            Legend.prototype.renderItem = function (item) {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    options = legend.options,\n                    horizontal = options.layout === 'horizontal',\n                    symbolWidth = legend.symbolWidth,\n                    symbolPadding = options.symbolPadding,\n                    itemStyle = legend.itemStyle,\n                    itemHiddenStyle = legend.itemHiddenStyle,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    ltr = !options.rtl,\n                    bBox,\n                    li = item.legendItem,\n                    isSeries = !item.series,\n                    series = !isSeries && item.series.drawLegendSymbol ?\n                        item.series :\n                        item,\n                    seriesOptions = series.options,\n                    showCheckbox = legend.createCheckboxForItem &&\n                        seriesOptions &&\n                        seriesOptions.showCheckbox, \n                    // full width minus text width\n                    itemExtraWidth = symbolWidth + symbolPadding +\n                        itemDistance + (showCheckbox ? 20 : 0),\n                    useHTML = options.useHTML,\n                    itemClassName = item.options.className;\n                if (!li) { // generate it once, later move it\n                    // Generate the group box, a group to hold the symbol and text. Text\n                    // is to be appended in Legend class.\n                    item.legendGroup = renderer\n                        .g('legend-item')\n                        .addClass('highcharts-' + series.type + '-series ' +\n                        'highcharts-color-' + item.colorIndex +\n                        (itemClassName ? ' ' + itemClassName : '') +\n                        (isSeries ?\n                            ' highcharts-series-' + item.index :\n                            ''))\n                        .attr({ zIndex: 1 })\n                        .add(legend.scrollGroup);\n                    // Generate the list item text and add it to the group\n                    item.legendItem = li = renderer.text('', ltr ?\n                        symbolWidth + symbolPadding :\n                        -symbolPadding, legend.baseline || 0, useHTML);\n                    if (!chart.styledMode) {\n                        // merge to prevent modifying original (#1021)\n                        li.css(merge(item.visible ?\n                            itemStyle :\n                            itemHiddenStyle));\n                    }\n                    li\n                        .attr({\n                        align: ltr ? 'left' : 'right',\n                        zIndex: 2\n                    })\n                        .add(item.legendGroup);\n                    // Get the baseline for the first item - the font size is equal for\n                    // all\n                    if (!legend.baseline) {\n                        legend.fontMetrics = renderer.fontMetrics(chart.styledMode ? 12 : itemStyle.fontSize, li);\n                        legend.baseline =\n                            legend.fontMetrics.f + 3 + legend.itemMarginTop;\n                        li.attr('y', legend.baseline);\n                    }\n                    // Draw the legend symbol inside the group box\n                    legend.symbolHeight =\n                        options.symbolHeight || legend.fontMetrics.f;\n                    series.drawLegendSymbol(legend, item);\n                    if (legend.setItemEvents) {\n                        legend.setItemEvents(item, li, useHTML);\n                    }\n                }\n                // Add the HTML checkbox on top\n                if (showCheckbox && !item.checkbox && legend.createCheckboxForItem) {\n                    legend.createCheckboxForItem(item);\n                }\n                // Colorize the items\n                legend.colorizeItem(item, item.visible);\n                // Take care of max width and text overflow (#6659)\n                if (chart.styledMode || !itemStyle.width) {\n                    li.css({\n                        width: ((options.itemWidth ||\n                            legend.widthOption ||\n                            chart.spacingBox.width) - itemExtraWidth) + 'px'\n                    });\n                }\n                // Always update the text\n                legend.setText(item);\n                // calculate the positions for the next line\n                bBox = li.getBBox();\n                item.itemWidth = item.checkboxOffset =\n                    options.itemWidth ||\n                        item.legendItemWidth ||\n                        bBox.width + itemExtraWidth;\n                legend.maxItemWidth = Math.max(legend.maxItemWidth, item.itemWidth);\n                legend.totalItemWidth += item.itemWidth;\n                legend.itemHeight = item.itemHeight = Math.round(item.legendItemHeight || bBox.height || legend.symbolHeight);\n            };\n            /**\n             * Get the position of the item in the layout. We now know the\n             * maxItemWidth from the previous loop.\n             *\n             * @private\n             * @function Highcharts.Legend#layoutItem\n             * @param {Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series} item\n             */\n            Legend.prototype.layoutItem = function (item) {\n                var options = this.options,\n                    padding = this.padding,\n                    horizontal = options.layout === 'horizontal',\n                    itemHeight = item.itemHeight,\n                    itemMarginBottom = this.itemMarginBottom,\n                    itemMarginTop = this.itemMarginTop,\n                    itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n                    maxLegendWidth = this.maxLegendWidth,\n                    itemWidth = (options.alignColumns &&\n                        this.totalItemWidth > maxLegendWidth) ?\n                        this.maxItemWidth :\n                        item.itemWidth;\n                // If the item exceeds the width, start a new line\n                if (horizontal &&\n                    this.itemX - padding + itemWidth > maxLegendWidth) {\n                    this.itemX = padding;\n                    if (this.lastLineHeight) { // Not for the first line (#10167)\n                        this.itemY += (itemMarginTop +\n                            this.lastLineHeight +\n                            itemMarginBottom);\n                    }\n                    this.lastLineHeight = 0; // reset for next line (#915, #3976)\n                }\n                // Set the edge positions\n                this.lastItemY = itemMarginTop + this.itemY + itemMarginBottom;\n                this.lastLineHeight = Math.max(// #915\n                itemHeight, this.lastLineHeight);\n                // cache the position of the newly generated or reordered items\n                item._legendItemPos = [this.itemX, this.itemY];\n                // advance\n                if (horizontal) {\n                    this.itemX += itemWidth;\n                }\n                else {\n                    this.itemY +=\n                        itemMarginTop + itemHeight + itemMarginBottom;\n                    this.lastLineHeight = itemHeight;\n                }\n                // the width of the widest item\n                this.offsetWidth = this.widthOption || Math.max((horizontal ? this.itemX - padding - (item.checkbox ?\n                    // decrease by itemDistance only when no checkbox #4853\n                    0 :\n                    itemDistance) : itemWidth) + padding, this.offsetWidth);\n            };\n            /**\n             * Get all items, which is one item per series for most series and one\n             * item per point for pie series and its derivatives. Fires the event\n             * `afterGetAllItems`.\n             *\n             * @private\n             * @function Highcharts.Legend#getAllItems\n             * @return {Array<(Highcharts.BubbleLegend|Highcharts.Point|Highcharts.Series)>}\n             * The current items in the legend.\n             * @fires Highcharts.Legend#event:afterGetAllItems\n             */\n            Legend.prototype.getAllItems = function () {\n                var allItems = [];\n                this.chart.series.forEach(function (series) {\n                    var seriesOptions = series && series.options;\n                    // Handle showInLegend. If the series is linked to another series,\n                    // defaults to false.\n                    if (series && pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? void 0 : false, true)) {\n                        // Use points or series for the legend item depending on\n                        // legendType\n                        allItems = allItems.concat(series.legendItems ||\n                            (seriesOptions.legendType === 'point' ?\n                                series.data :\n                                series));\n                    }\n                });\n                fireEvent(this, 'afterGetAllItems', { allItems: allItems });\n                return allItems;\n            };\n            /**\n             * Get a short, three letter string reflecting the alignment and layout.\n             *\n             * @private\n             * @function Highcharts.Legend#getAlignment\n             * @return {string}\n             * The alignment, empty string if floating\n             */\n            Legend.prototype.getAlignment = function () {\n                var options = this.options;\n                // Use the first letter of each alignment option in order to detect\n                // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n                if (this.proximate) {\n                    return options.align.charAt(0) + 'tv';\n                }\n                return options.floating ? '' : (options.align.charAt(0) +\n                    options.verticalAlign.charAt(0) +\n                    options.layout.charAt(0));\n            };\n            /**\n             * Adjust the chart margins by reserving space for the legend on only one\n             * side of the chart. If the position is set to a corner, top or bottom is\n             * reserved for horizontal legends and left or right for vertical ones.\n             *\n             * @private\n             * @function Highcharts.Legend#adjustMargins\n             * @param {Array<number>} margin\n             * @param {Array<number>} spacing\n             */\n            Legend.prototype.adjustMargins = function (margin, spacing) {\n                var chart = this.chart,\n                    options = this.options,\n                    alignment = this.getAlignment();\n                if (alignment) {\n                    ([\n                        /(lth|ct|rth)/,\n                        /(rtv|rm|rbv)/,\n                        /(rbh|cb|lbh)/,\n                        /(lbv|lm|ltv)/\n                    ]).forEach(function (alignments, side) {\n                        if (alignments.test(alignment) && !defined(margin[side])) {\n                            // Now we have detected on which side of the chart we should\n                            // reserve space for the legend\n                            chart[marginNames[side]] = Math.max(chart[marginNames[side]], (chart.legend[(side + 1) % 2 ? 'legendHeight' : 'legendWidth'] +\n                                [1, -1, -1, 1][side] * options[(side % 2) ? 'x' : 'y'] +\n                                pick(options.margin, 12) +\n                                spacing[side] +\n                                (chart.titleOffset[side] || 0)));\n                        }\n                    });\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Legend#proximatePositions\n             */\n            Legend.prototype.proximatePositions = function () {\n                var chart = this.chart,\n                    boxes = [],\n                    alignLeft = this.options.align === 'left';\n                this.allItems.forEach(function (item) {\n                    var lastPoint,\n                        height,\n                        useFirstPoint = alignLeft,\n                        target,\n                        top;\n                    if (item.yAxis && item.points) {\n                        if (item.xAxis.options.reversed) {\n                            useFirstPoint = !useFirstPoint;\n                        }\n                        lastPoint = find(useFirstPoint ?\n                            item.points :\n                            item.points.slice(0).reverse(), function (item) {\n                            return isNumber(item.plotY);\n                        });\n                        height = this.itemMarginTop +\n                            item.legendItem.getBBox().height +\n                            this.itemMarginBottom;\n                        top = item.yAxis.top - chart.plotTop;\n                        if (item.visible) {\n                            target = lastPoint ?\n                                lastPoint.plotY :\n                                item.yAxis.height;\n                            target += top - 0.3 * height;\n                        }\n                        else {\n                            target = top + item.yAxis.height;\n                        }\n                        boxes.push({\n                            target: target,\n                            size: height,\n                            item: item\n                        });\n                    }\n                }, this);\n                H.distribute(boxes, chart.plotHeight);\n                boxes.forEach(function (box) {\n                    box.item._legendItemPos[1] =\n                        chart.plotTop - chart.spacing[0] + box.pos;\n                });\n            };\n            /**\n             * Render the legend. This method can be called both before and after\n             * `chart.render`. If called after, it will only rearrange items instead\n             * of creating new ones. Called internally on initial render and after\n             * redraws.\n             *\n             * @private\n             * @function Highcharts.Legend#render\n             */\n            Legend.prototype.render = function () {\n                var legend = this,\n                    chart = legend.chart,\n                    renderer = chart.renderer,\n                    legendGroup = legend.group,\n                    allItems,\n                    display,\n                    legendWidth,\n                    legendHeight,\n                    box = legend.box,\n                    options = legend.options,\n                    padding = legend.padding,\n                    allowedWidth;\n                legend.itemX = padding;\n                legend.itemY = legend.initialItemY;\n                legend.offsetWidth = 0;\n                legend.lastItemY = 0;\n                legend.widthOption = relativeLength(options.width, chart.spacingBox.width - padding);\n                // Compute how wide the legend is allowed to be\n                allowedWidth =\n                    chart.spacingBox.width - 2 * padding - options.x;\n                if (['rm', 'lm'].indexOf(legend.getAlignment().substring(0, 2)) > -1) {\n                    allowedWidth /= 2;\n                }\n                legend.maxLegendWidth = legend.widthOption || allowedWidth;\n                if (!legendGroup) {\n                    /**\n                     * SVG group of the legend.\n                     *\n                     * @readonly\n                     * @name Highcharts.Legend#group\n                     * @type {Highcharts.SVGElement}\n                     */\n                    legend.group = legendGroup = renderer.g('legend')\n                        .attr({ zIndex: 7 })\n                        .add();\n                    legend.contentGroup = renderer.g()\n                        .attr({ zIndex: 1 }) // above background\n                        .add(legendGroup);\n                    legend.scrollGroup = renderer.g()\n                        .add(legend.contentGroup);\n                }\n                legend.renderTitle();\n                // add each series or point\n                allItems = legend.getAllItems();\n                // sort by legendIndex\n                stableSort(allItems, function (a, b) {\n                    return ((a.options && a.options.legendIndex) || 0) -\n                        ((b.options && b.options.legendIndex) || 0);\n                });\n                // reversed legend\n                if (options.reversed) {\n                    allItems.reverse();\n                }\n                /**\n                 * All items for the legend, which is an array of series for most series\n                 * and an array of points for pie series and its derivatives.\n                 *\n                 * @readonly\n                 * @name Highcharts.Legend#allItems\n                 * @type {Array<(Highcharts.Point|Highcharts.Series)>}\n                 */\n                legend.allItems = allItems;\n                legend.display = display = !!allItems.length;\n                // Render the items. First we run a loop to set the text and properties\n                // and read all the bounding boxes. The next loop computes the item\n                // positions based on the bounding boxes.\n                legend.lastLineHeight = 0;\n                legend.maxItemWidth = 0;\n                legend.totalItemWidth = 0;\n                legend.itemHeight = 0;\n                allItems.forEach(legend.renderItem, legend);\n                allItems.forEach(legend.layoutItem, legend);\n                // Get the box\n                legendWidth = (legend.widthOption || legend.offsetWidth) + padding;\n                legendHeight = legend.lastItemY + legend.lastLineHeight +\n                    legend.titleHeight;\n                legendHeight = legend.handleOverflow(legendHeight);\n                legendHeight += padding;\n                // Draw the border and/or background\n                if (!box) {\n                    /**\n                     * SVG element of the legend box.\n                     *\n                     * @readonly\n                     * @name Highcharts.Legend#box\n                     * @type {Highcharts.SVGElement}\n                     */\n                    legend.box = box = renderer.rect()\n                        .addClass('highcharts-legend-box')\n                        .attr({\n                        r: options.borderRadius\n                    })\n                        .add(legendGroup);\n                    box.isNew = true;\n                }\n                // Presentational\n                if (!chart.styledMode) {\n                    box\n                        .attr({\n                        stroke: options.borderColor,\n                        'stroke-width': options.borderWidth || 0,\n                        fill: options.backgroundColor || 'none'\n                    })\n                        .shadow(options.shadow);\n                }\n                if (legendWidth > 0 && legendHeight > 0) {\n                    box[box.isNew ? 'attr' : 'animate'](box.crisp.call({}, {\n                        x: 0,\n                        y: 0,\n                        width: legendWidth,\n                        height: legendHeight\n                    }, box.strokeWidth()));\n                    box.isNew = false;\n                }\n                // hide the border if no items\n                box[display ? 'show' : 'hide']();\n                // Open for responsiveness\n                if (chart.styledMode && legendGroup.getStyle('display') === 'none') {\n                    legendWidth = legendHeight = 0;\n                }\n                legend.legendWidth = legendWidth;\n                legend.legendHeight = legendHeight;\n                if (display) {\n                    legend.align();\n                }\n                if (!this.proximate) {\n                    this.positionItems();\n                }\n                fireEvent(this, 'afterRender');\n            };\n            /**\n             * Align the legend to chart's box.\n             *\n             * @private\n             * @function Highcharts.align\n             * @param {Highcharts.BBoxObject} alignTo\n             * @return {void}\n             */\n            Legend.prototype.align = function (alignTo) {\n                if (alignTo === void 0) { alignTo = this.chart.spacingBox; }\n                var chart = this.chart,\n                    options = this.options;\n                // If aligning to the top and the layout is horizontal, adjust for\n                // the title (#7428)\n                var y = alignTo.y;\n                if (/(lth|ct|rth)/.test(this.getAlignment()) &&\n                    chart.titleOffset[0] > 0) {\n                    y += chart.titleOffset[0];\n                }\n                else if (/(lbh|cb|rbh)/.test(this.getAlignment()) &&\n                    chart.titleOffset[2] > 0) {\n                    y -= chart.titleOffset[2];\n                }\n                if (y !== alignTo.y) {\n                    alignTo = merge(alignTo, { y: y });\n                }\n                this.group.align(merge(options, {\n                    width: this.legendWidth,\n                    height: this.legendHeight,\n                    verticalAlign: this.proximate ? 'top' : options.verticalAlign\n                }), true, alignTo);\n            };\n            /**\n             * Set up the overflow handling by adding navigation with up and down arrows\n             * below the legend.\n             *\n             * @private\n             * @function Highcharts.Legend#handleOverflow\n             * @param {number} legendHeight\n             * @return {number}\n             */\n            Legend.prototype.handleOverflow = function (legendHeight) {\n                var legend = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    options = this.options,\n                    optionsY = options.y,\n                    alignTop = options.verticalAlign === 'top',\n                    padding = this.padding,\n                    spaceHeight = (chart.spacingBox.height +\n                        (alignTop ? -optionsY : optionsY) - padding),\n                    maxHeight = options.maxHeight,\n                    clipHeight,\n                    clipRect = this.clipRect,\n                    navOptions = options.navigation,\n                    animation = pick(navOptions.animation,\n                    true),\n                    arrowSize = navOptions.arrowSize || 12,\n                    nav = this.nav,\n                    pages = this.pages,\n                    lastY,\n                    allItems = this.allItems,\n                    clipToHeight = function (height) {\n                        if (typeof height === 'number') {\n                            clipRect.attr({\n                                height: height\n                            });\n                    }\n                    else if (clipRect) { // Reset (#5912)\n                        legend.clipRect = clipRect.destroy();\n                        legend.contentGroup.clip();\n                    }\n                    // useHTML\n                    if (legend.contentGroup.div) {\n                        legend.contentGroup.div.style.clip = height ?\n                            'rect(' + padding + 'px,9999px,' +\n                                (padding + height) + 'px,0)' :\n                            'auto';\n                    }\n                }, addTracker = function (key) {\n                    legend[key] = renderer\n                        .circle(0, 0, arrowSize * 1.3)\n                        .translate(arrowSize / 2, arrowSize / 2)\n                        .add(nav);\n                    if (!chart.styledMode) {\n                        legend[key].attr('fill', 'rgba(0,0,0,0.0001)');\n                    }\n                    return legend[key];\n                };\n                // Adjust the height\n                if (options.layout === 'horizontal' &&\n                    options.verticalAlign !== 'middle' &&\n                    !options.floating) {\n                    spaceHeight /= 2;\n                }\n                if (maxHeight) {\n                    spaceHeight = Math.min(spaceHeight, maxHeight);\n                }\n                // Reset the legend height and adjust the clipping rectangle\n                pages.length = 0;\n                if (legendHeight > spaceHeight &&\n                    navOptions.enabled !== false) {\n                    this.clipHeight = clipHeight =\n                        Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n                    this.currentPage = pick(this.currentPage, 1);\n                    this.fullHeight = legendHeight;\n                    // Fill pages with Y positions so that the top of each a legend item\n                    // defines the scroll top for each page (#2098)\n                    allItems.forEach(function (item, i) {\n                        var y = item._legendItemPos[1],\n                            h = Math.round(item.legendItem.getBBox().height),\n                            len = pages.length;\n                        if (!len || (y - pages[len - 1] > clipHeight &&\n                            (lastY || y) !== pages[len - 1])) {\n                            pages.push(lastY || y);\n                            len++;\n                        }\n                        // Keep track of which page each item is on\n                        item.pageIx = len - 1;\n                        if (lastY) {\n                            allItems[i - 1].pageIx = len - 1;\n                        }\n                        if (i === allItems.length - 1 &&\n                            y + h - pages[len - 1] > clipHeight &&\n                            y !== lastY // #2617\n                        ) {\n                            pages.push(y);\n                            item.pageIx = len;\n                        }\n                        if (y !== lastY) {\n                            lastY = y;\n                        }\n                    });\n                    // Only apply clipping if needed. Clipping causes blurred legend in\n                    // PDF export (#1787)\n                    if (!clipRect) {\n                        clipRect = legend.clipRect =\n                            renderer.clipRect(0, padding, 9999, 0);\n                        legend.contentGroup.clip(clipRect);\n                    }\n                    clipToHeight(clipHeight);\n                    // Add navigation elements\n                    if (!nav) {\n                        this.nav = nav = renderer.g()\n                            .attr({ zIndex: 1 })\n                            .add(this.group);\n                        this.up = renderer\n                            .symbol('triangle', 0, 0, arrowSize, arrowSize)\n                            .add(nav);\n                        addTracker('upTracker')\n                            .on('click', function () {\n                            legend.scroll(-1, animation);\n                        });\n                        this.pager = renderer.text('', 15, 10)\n                            .addClass('highcharts-legend-navigation');\n                        if (!chart.styledMode) {\n                            this.pager.css(navOptions.style);\n                        }\n                        this.pager.add(nav);\n                        this.down = renderer\n                            .symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n                            .add(nav);\n                        addTracker('downTracker')\n                            .on('click', function () {\n                            legend.scroll(1, animation);\n                        });\n                    }\n                    // Set initial position\n                    legend.scroll(0);\n                    legendHeight = spaceHeight;\n                    // Reset\n                }\n                else if (nav) {\n                    clipToHeight();\n                    this.nav = nav.destroy(); // #6322\n                    this.scrollGroup.attr({\n                        translateY: 1\n                    });\n                    this.clipHeight = 0; // #1379\n                }\n                return legendHeight;\n            };\n            /**\n             * Scroll the legend by a number of pages.\n             *\n             * @private\n             * @function Highcharts.Legend#scroll\n             *\n             * @param {number} scrollBy\n             *        The number of pages to scroll.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether and how to apply animation.\n             *\n             * @return {void}\n             */\n            Legend.prototype.scroll = function (scrollBy, animation) {\n                var _this = this;\n                var chart = this.chart,\n                    pages = this.pages,\n                    pageCount = pages.length,\n                    currentPage = this.currentPage + scrollBy,\n                    clipHeight = this.clipHeight,\n                    navOptions = this.options.navigation,\n                    pager = this.pager,\n                    padding = this.padding;\n                // When resizing while looking at the last page\n                if (currentPage > pageCount) {\n                    currentPage = pageCount;\n                }\n                if (currentPage > 0) {\n                    if (typeof animation !== 'undefined') {\n                        setAnimation(animation, chart);\n                    }\n                    this.nav.attr({\n                        translateX: padding,\n                        translateY: clipHeight + this.padding + 7 + this.titleHeight,\n                        visibility: 'visible'\n                    });\n                    [this.up, this.upTracker].forEach(function (elem) {\n                        elem.attr({\n                            'class': currentPage === 1 ?\n                                'highcharts-legend-nav-inactive' :\n                                'highcharts-legend-nav-active'\n                        });\n                    });\n                    pager.attr({\n                        text: currentPage + '/' + pageCount\n                    });\n                    [this.down, this.downTracker].forEach(function (elem) {\n                        elem.attr({\n                            // adjust to text width\n                            x: 18 + this.pager.getBBox().width,\n                            'class': currentPage === pageCount ?\n                                'highcharts-legend-nav-inactive' :\n                                'highcharts-legend-nav-active'\n                        });\n                    }, this);\n                    if (!chart.styledMode) {\n                        this.up\n                            .attr({\n                            fill: currentPage === 1 ?\n                                navOptions.inactiveColor :\n                                navOptions.activeColor\n                        });\n                        this.upTracker\n                            .css({\n                            cursor: currentPage === 1 ? 'default' : 'pointer'\n                        });\n                        this.down\n                            .attr({\n                            fill: currentPage === pageCount ?\n                                navOptions.inactiveColor :\n                                navOptions.activeColor\n                        });\n                        this.downTracker\n                            .css({\n                            cursor: currentPage === pageCount ?\n                                'default' :\n                                'pointer'\n                        });\n                    }\n                    this.scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n                    this.scrollGroup.animate({\n                        translateY: this.scrollOffset\n                    });\n                    this.currentPage = currentPage;\n                    this.positionCheckboxes();\n                    // Fire event after scroll animation is complete\n                    var animOptions = animObject(pick(animation,\n                        chart.renderer.globalAnimation,\n                        true));\n                    syncTimeout(function () {\n                        fireEvent(_this, 'afterScroll', { currentPage: currentPage });\n                    }, animOptions.duration || 0);\n                }\n            };\n            return Legend;\n        }());\n        // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n        // and for #2580, a similar drawing flaw in Firefox 26.\n        // Explore if there's a general cause for this. The problem may be related\n        // to nested group elements, as the legend item texts are within 4 group\n        // elements.\n        if (/Trident\\/7\\.0/.test(win.navigator && win.navigator.userAgent) ||\n            isFirefox) {\n            wrap(Legend.prototype, 'positionItem', function (proceed, item) {\n                var legend = this, \n                    // If chart destroyed in sync, this is undefined (#2030)\n                    runPositionItem = function () {\n                        if (item._legendItemPos) {\n                            proceed.call(legend,\n                    item);\n                    }\n                };\n                // Do it now, for export and to get checkbox placement\n                runPositionItem();\n                // Do it after to work around the core issue\n                if (!legend.bubbleLegend) {\n                    setTimeout(runPositionItem);\n                }\n            });\n        }\n        H.Legend = Legend;\n\n        return H.Legend;\n    });\n    _registerModule(_modules, 'parts/Chart.js', [_modules['parts/Axis.js'], _modules['parts/Globals.js'], _modules['parts/Legend.js'], _modules['parts/MSPointer.js'], _modules['parts/Options.js'], _modules['parts/Pointer.js'], _modules['parts/Time.js'], _modules['parts/Utilities.js']], function (Axis, H, Legend, MSPointer, O, Pointer, Time, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var charts = H.charts,\n            doc = H.doc,\n            seriesTypes = H.seriesTypes,\n            win = H.win;\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            animate = U.animate,\n            animObject = U.animObject,\n            attr = U.attr,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            discardElement = U.discardElement,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            getStyle = U.getStyle,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            numberFormat = U.numberFormat,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            pInt = U.pInt,\n            relativeLength = U.relativeLength,\n            removeEvent = U.removeEvent,\n            setAnimation = U.setAnimation,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Callback for chart constructors.\n         *\n         * @callback Highcharts.ChartCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        Created chart.\n         */\n        /**\n         * Format a number and return a string based on input settings.\n         *\n         * @callback Highcharts.NumberFormatterCallbackFunction\n         *\n         * @param {number} number\n         *        The input number to format.\n         *\n         * @param {number} decimals\n         *        The amount of decimals. A value of -1 preserves the amount in the\n         *        input number.\n         *\n         * @param {string} [decimalPoint]\n         *        The decimal point, defaults to the one given in the lang options, or\n         *        a dot.\n         *\n         * @param {string} [thousandsSep]\n         *        The thousands separator, defaults to the one given in the lang\n         *        options, or a space character.\n         *\n         * @return {string} The formatted number.\n         */\n        /**\n         * The chart title. The title has an `update` method that allows modifying the\n         * options directly or indirectly via `chart.update`.\n         *\n         * @interface Highcharts.TitleObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the title.\n        *\n        * @function Highcharts.TitleObject#update\n        *\n        * @param {Highcharts.TitleOptions} titleOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the title is altered. If doing more\n        *        operations on the chart, it is a good idea to set redraw to false and\n        *        call {@link Chart#redraw} after.\n        */\n        /**\n         * The chart subtitle. The subtitle has an `update` method that\n         * allows modifying the options directly or indirectly via\n         * `chart.update`.\n         *\n         * @interface Highcharts.SubtitleObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the subtitle.\n        *\n        * @function Highcharts.SubtitleObject#update\n        *\n        * @param {Highcharts.SubtitleOptions} subtitleOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the subtitle is altered. If doing\n        *        more operations on the chart, it is a good idea to set redraw to false\n        *        and call {@link Chart#redraw} after.\n        */\n        /**\n         * The chart caption. The caption has an `update` method that\n         * allows modifying the options directly or indirectly via\n         * `chart.update`.\n         *\n         * @interface Highcharts.CaptionObject\n         * @extends Highcharts.SVGElement\n         */ /**\n        * Modify options for the caption.\n        *\n        * @function Highcharts.CaptionObject#update\n        *\n        * @param {Highcharts.CaptionOptions} captionOptions\n        *        Options to modify.\n        *\n        * @param {boolean} [redraw=true]\n        *        Whether to redraw the chart after the caption is altered. If doing\n        *        more operations on the chart, it is a good idea to set redraw to false\n        *        and call {@link Chart#redraw} after.\n        */\n        var marginNames = H.marginNames;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n         *\n         * @example\n         * var chart = Highcharts.chart('container', {\n         *        title: {\n         *               text: 'My chart'\n         *        },\n         *        series: [{\n         *            data: [1, 3, 2, 4]\n         *        }]\n         * })\n         *\n         * @class\n         * @name Highcharts.Chart\n         *\n         * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n         *        The DOM element to render to, or its id.\n         *\n         * @param {Highcharts.Options} options\n         *        The chart options structure.\n         *\n         * @param {Highcharts.ChartCallbackFunction} [callback]\n         *        Function to run when the chart has loaded and and all external images\n         *        are loaded. Defining a\n         *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n         *        handler is equivalent.\n         */\n        var Chart = /** @class */ (function () {\n                function Chart(a, b, c) {\n                    this.axes = void 0;\n                this.axisOffset = void 0;\n                this.bounds = void 0;\n                this.chartHeight = void 0;\n                this.chartWidth = void 0;\n                this.clipBox = void 0;\n                this.colorCounter = void 0;\n                this.container = void 0;\n                this.index = void 0;\n                this.isResizing = void 0;\n                this.labelCollectors = void 0;\n                this.legend = void 0;\n                this.margin = void 0;\n                this.numberFormatter = void 0;\n                this.options = void 0;\n                this.plotBox = void 0;\n                this.plotHeight = void 0;\n                this.plotLeft = void 0;\n                this.plotTop = void 0;\n                this.plotWidth = void 0;\n                this.pointCount = void 0;\n                this.pointer = void 0;\n                this.renderer = void 0;\n                this.renderTo = void 0;\n                this.series = void 0;\n                this.spacing = void 0;\n                this.spacingBox = void 0;\n                this.symbolCounter = void 0;\n                this.time = void 0;\n                this.titleOffset = void 0;\n                this.userOptions = void 0;\n                this.xAxis = void 0;\n                this.yAxis = void 0;\n                this.getArgs(a, b, c);\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Handle the arguments passed to the constructor.\n             *\n             * @private\n             * @function Highcharts.Chart#getArgs\n             *\n             * @param {...Array<*>} arguments\n             * All arguments for the constructor.\n             *\n             * @fires Highcharts.Chart#event:init\n             * @fires Highcharts.Chart#event:afterInit\n             */\n            Chart.prototype.getArgs = function (a, b, c) {\n                // Remove the optional first argument, renderTo, and\n                // set it on this.\n                if (isString(a) || a.nodeName) {\n                    this.renderTo = a;\n                    this.init(b, c);\n                }\n                else {\n                    this.init(a, b);\n                }\n            };\n            /**\n             * Overridable function that initializes the chart. The constructor's\n             * arguments are passed on directly.\n             *\n             * @function Highcharts.Chart#init\n             *\n             * @param {Highcharts.Options} userOptions\n             *        Custom options.\n             *\n             * @param {Function} [callback]\n             *        Function to run when the chart has loaded and and all external\n             *        images are loaded.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:init\n             * @fires Highcharts.Chart#event:afterInit\n             */\n            Chart.prototype.init = function (userOptions, callback) {\n                // Handle regular options\n                var options, \n                    // skip merging data points to increase performance\n                    seriesOptions = userOptions.series,\n                    userPlotOptions = userOptions.plotOptions || {};\n                // Fire the event with a default function\n                fireEvent(this, 'init', { args: arguments }, function () {\n                    userOptions.series = null;\n                    options = merge(defaultOptions, userOptions); // do the merge\n                    var optionsChart = options.chart || {};\n                    // Override (by copy of user options) or clear tooltip options\n                    // in chart.options.plotOptions (#6218)\n                    objectEach(options.plotOptions, function (typeOptions, type) {\n                        if (isObject(typeOptions)) { // #8766\n                            typeOptions.tooltip = (userPlotOptions[type] && // override by copy:\n                                merge(userPlotOptions[type].tooltip)) || void 0; // or clear\n                        }\n                    });\n                    // User options have higher priority than default options\n                    // (#6218). In case of exporting: path is changed\n                    options.tooltip.userOptions = (userOptions.chart &&\n                        userOptions.chart.forExport &&\n                        userOptions.tooltip.userOptions) || userOptions.tooltip;\n                    // set back the series data\n                    options.series = userOptions.series = seriesOptions;\n                    /**\n                     * The original options given to the constructor or a chart factory\n                     * like {@link Highcharts.chart} and {@link Highcharts.stockChart}.\n                     *\n                     * @name Highcharts.Chart#userOptions\n                     * @type {Highcharts.Options}\n                     */\n                    this.userOptions = userOptions;\n                    var chartEvents = optionsChart.events;\n                    this.margin = [];\n                    this.spacing = [];\n                    // Pixel data bounds for touch zoom\n                    this.bounds = { h: {}, v: {} };\n                    // An array of functions that returns labels that should be\n                    // considered for anti-collision\n                    this.labelCollectors = [];\n                    this.callback = callback;\n                    this.isResizing = 0;\n                    /**\n                     * The options structure for the chart after merging\n                     * {@link #defaultOptions} and {@link #userOptions}. It contains\n                     * members for the sub elements like series, legend, tooltip etc.\n                     *\n                     * @name Highcharts.Chart#options\n                     * @type {Highcharts.Options}\n                     */\n                    this.options = options;\n                    /**\n                     * All the axes in the chart.\n                     *\n                     * @see  Highcharts.Chart.xAxis\n                     * @see  Highcharts.Chart.yAxis\n                     *\n                     * @name Highcharts.Chart#axes\n                     * @type {Array<Highcharts.Axis>}\n                     */\n                    this.axes = [];\n                    /**\n                     * All the current series in the chart.\n                     *\n                     * @name Highcharts.Chart#series\n                     * @type {Array<Highcharts.Series>}\n                     */\n                    this.series = [];\n                    /**\n                     * The `Time` object associated with the chart. Since v6.0.5,\n                     * time settings can be applied individually for each chart. If\n                     * no individual settings apply, the `Time` object is shared by\n                     * all instances.\n                     *\n                     * @name Highcharts.Chart#time\n                     * @type {Highcharts.Time}\n                     */\n                    this.time =\n                        userOptions.time && Object.keys(userOptions.time).length ?\n                            new Time(userOptions.time) :\n                            H.time;\n                    /**\n                     * Callback function to override the default function that formats\n                     * all the numbers in the chart. Returns a string with the formatted\n                     * number.\n                     *\n                     * @name Highcharts.Chart#numberFormatter\n                     * @type {Highcharts.NumberFormatterCallbackFunction}\n                     */\n                    this.numberFormatter = optionsChart.numberFormatter || numberFormat;\n                    /**\n                     * Whether the chart is in styled mode, meaning all presentatinoal\n                     * attributes are avoided.\n                     *\n                     * @name Highcharts.Chart#styledMode\n                     * @type {boolean}\n                     */\n                    this.styledMode = optionsChart.styledMode;\n                    this.hasCartesianSeries = optionsChart.showAxes;\n                    var chart = this;\n                    /**\n                     * Index position of the chart in the {@link Highcharts#charts}\n                     * property.\n                     *\n                     * @name Highcharts.Chart#index\n                     * @type {number}\n                     * @readonly\n                     */\n                    chart.index = charts.length; // Add the chart to the global lookup\n                    charts.push(chart);\n                    H.chartCount++;\n                    // Chart event handlers\n                    if (chartEvents) {\n                        objectEach(chartEvents, function (event, eventType) {\n                            if (isFunction(event)) {\n                                addEvent(chart, eventType, event);\n                            }\n                        });\n                    }\n                    /**\n                     * A collection of the X axes in the chart.\n                     *\n                     * @name Highcharts.Chart#xAxis\n                     * @type {Array<Highcharts.Axis>}\n                     */\n                    chart.xAxis = [];\n                    /**\n                     * A collection of the Y axes in the chart.\n                     *\n                     * @name Highcharts.Chart#yAxis\n                     * @type {Array<Highcharts.Axis>}\n                     *\n                     * @todo\n                     * Make events official: Fire the event `afterInit`.\n                     */\n                    chart.yAxis = [];\n                    chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n                    // Fire after init but before first render, before axes and series\n                    // have been initialized.\n                    fireEvent(chart, 'afterInit');\n                    chart.firstRender();\n                });\n            };\n            /**\n             * Internal function to unitialize an individual series.\n             *\n             * @private\n             * @function Highcharts.Chart#initSeries\n             */\n            Chart.prototype.initSeries = function (options) {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    type = (options.type ||\n                        optionsChart.type ||\n                        optionsChart.defaultSeriesType),\n                    series,\n                    Constr = seriesTypes[type];\n                // No such series type\n                if (!Constr) {\n                    error(17, true, chart, { missingModuleFor: type });\n                }\n                series = new Constr();\n                series.init(this, options);\n                return series;\n            };\n            /**\n             * Internal function to set data for all series with enabled sorting.\n             *\n             * @private\n             * @function Highcharts.Chart#setSeriesData\n             */\n            Chart.prototype.setSeriesData = function () {\n                this.getSeriesOrderByLinks().forEach(function (series) {\n                    // We need to set data for series with sorting after series init\n                    if (!series.points && !series.data && series.enabledDataSorting) {\n                        series.setData(series.options.data, false);\n                    }\n                });\n            };\n            /**\n             * Sort and return chart series in order depending on the number of linked\n             * series.\n             *\n             * @private\n             * @function Highcharts.Series#getSeriesOrderByLinks\n             * @return {Array<Highcharts.Series>}\n             */\n            Chart.prototype.getSeriesOrderByLinks = function () {\n                return this.series.concat().sort(function (a, b) {\n                    if (a.linkedSeries.length || b.linkedSeries.length) {\n                        return b.linkedSeries.length - a.linkedSeries.length;\n                    }\n                    return 0;\n                });\n            };\n            /**\n             * Order all series above a given index. When series are added and ordered\n             * by configuration, only the last series is handled (#248, #1123, #2456,\n             * #6112). This function is called on series initialization and destroy.\n             *\n             * @private\n             * @function Highcharts.Series#orderSeries\n             * @param {number} [fromIndex]\n             * If this is given, only the series above this index are handled.\n             */\n            Chart.prototype.orderSeries = function (fromIndex) {\n                var series = this.series,\n                    i = fromIndex || 0;\n                for (; i < series.length; i++) {\n                    if (series[i]) {\n                        /**\n                         * Contains the series' index in the `Chart.series` array.\n                         *\n                         * @name Highcharts.Series#index\n                         * @type {number}\n                         * @readonly\n                         */\n                        series[i].index = i;\n                        series[i].name = series[i].getName();\n                    }\n                }\n            };\n            /**\n             * Check whether a given point is within the plot area.\n             *\n             * @function Highcharts.Chart#isInsidePlot\n             *\n             * @param {number} plotX\n             * Pixel x relative to the plot area.\n             *\n             * @param {number} plotY\n             * Pixel y relative to the plot area.\n             *\n             * @param {boolean} [inverted]\n             * Whether the chart is inverted.\n             *\n             * @return {boolean}\n             * Returns true if the given point is inside the plot area.\n             */\n            Chart.prototype.isInsidePlot = function (plotX, plotY, inverted) {\n                var x = inverted ? plotY : plotX,\n                    y = inverted ? plotX : plotY,\n                    e = {\n                        x: x,\n                        y: y,\n                        isInsidePlot: x >= 0 &&\n                            x <= this.plotWidth &&\n                            y >= 0 &&\n                            y <= this.plotHeight\n                    };\n                fireEvent(this, 'afterIsInsidePlot', e);\n                return e.isInsidePlot;\n            };\n            /**\n             * Redraw the chart after changes have been done to the data, axis extremes\n             * chart size or chart elements. All methods for updating axes, series or\n             * points have a parameter for redrawing the chart. This is `true` by\n             * default. But in many cases you want to do more than one operation on the\n             * chart before redrawing, for example add a number of points. In those\n             * cases it is a waste of resources to redraw the chart for each new point\n             * added. So you add the points and call `chart.redraw()` after.\n             *\n             * @function Highcharts.Chart#redraw\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             * If or how to apply animation to the redraw.\n             *\n             * @fires Highcharts.Chart#event:afterSetExtremes\n             * @fires Highcharts.Chart#event:beforeRedraw\n             * @fires Highcharts.Chart#event:predraw\n             * @fires Highcharts.Chart#event:redraw\n             * @fires Highcharts.Chart#event:render\n             * @fires Highcharts.Chart#event:updatedData\n             */\n            Chart.prototype.redraw = function (animation) {\n                fireEvent(this, 'beforeRedraw');\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    pointer = chart.pointer,\n                    legend = chart.legend,\n                    legendUserOptions = chart.userOptions.legend,\n                    redrawLegend = chart.isDirtyLegend,\n                    hasStackedSeries,\n                    hasDirtyStacks,\n                    hasCartesianSeries = chart.hasCartesianSeries,\n                    isDirtyBox = chart.isDirtyBox,\n                    i,\n                    serie,\n                    renderer = chart.renderer,\n                    isHiddenChart = renderer.isHidden(),\n                    afterRedraw = [];\n                // Handle responsive rules, not only on resize (#6130)\n                if (chart.setResponsive) {\n                    chart.setResponsive(false);\n                }\n                // Set the global animation. When chart.hasRendered is not true, the\n                // redraw call comes from a responsive rule and animation should not\n                // occur.\n                setAnimation(chart.hasRendered ? animation : false, chart);\n                if (isHiddenChart) {\n                    chart.temporaryDisplay();\n                }\n                // Adjust title layout (reflow multiline text)\n                chart.layOutTitles();\n                // link stacked series\n                i = series.length;\n                while (i--) {\n                    serie = series[i];\n                    if (serie.options.stacking) {\n                        hasStackedSeries = true;\n                        if (serie.isDirty) {\n                            hasDirtyStacks = true;\n                            break;\n                        }\n                    }\n                }\n                if (hasDirtyStacks) { // mark others as dirty\n                    i = series.length;\n                    while (i--) {\n                        serie = series[i];\n                        if (serie.options.stacking) {\n                            serie.isDirty = true;\n                        }\n                    }\n                }\n                // Handle updated data in the series\n                series.forEach(function (serie) {\n                    if (serie.isDirty) {\n                        if (serie.options.legendType === 'point') {\n                            if (serie.updateTotals) {\n                                serie.updateTotals();\n                            }\n                            redrawLegend = true;\n                        }\n                        else if (legendUserOptions &&\n                            (legendUserOptions.labelFormatter ||\n                                legendUserOptions.labelFormat)) {\n                            redrawLegend = true; // #2165\n                        }\n                    }\n                    if (serie.isDirtyData) {\n                        fireEvent(serie, 'updatedData');\n                    }\n                });\n                // handle added or removed series\n                if (redrawLegend && legend && legend.options.enabled) {\n                    // draw legend graphics\n                    legend.render();\n                    chart.isDirtyLegend = false;\n                }\n                // reset stacks\n                if (hasStackedSeries) {\n                    chart.getStacks();\n                }\n                if (hasCartesianSeries) {\n                    // set axes scales\n                    axes.forEach(function (axis) {\n                        // Don't do setScale again if we're only resizing. Regression\n                        // #13507. But we need it after chart.update (responsive), as\n                        // axis is initialized again (#12137).\n                        if (!chart.isResizing || !isNumber(axis.min)) {\n                            axis.updateNames();\n                            axis.setScale();\n                        }\n                    });\n                }\n                chart.getMargins(); // #3098\n                if (hasCartesianSeries) {\n                    // If one axis is dirty, all axes must be redrawn (#792, #2169)\n                    axes.forEach(function (axis) {\n                        if (axis.isDirty) {\n                            isDirtyBox = true;\n                        }\n                    });\n                    // redraw axes\n                    axes.forEach(function (axis) {\n                        // Fire 'afterSetExtremes' only if extremes are set\n                        var key = axis.min + ',' + axis.max;\n                        if (axis.extKey !== key) { // #821, #4452\n                            axis.extKey = key;\n                            // prevent a recursive call to chart.redraw() (#1119)\n                            afterRedraw.push(function () {\n                                fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n                                delete axis.eventArgs;\n                            });\n                        }\n                        if (isDirtyBox || hasStackedSeries) {\n                            axis.redraw();\n                        }\n                    });\n                }\n                // the plot areas size has changed\n                if (isDirtyBox) {\n                    chart.drawChartBox();\n                }\n                // Fire an event before redrawing series, used by the boost module to\n                // clear previous series renderings.\n                fireEvent(chart, 'predraw');\n                // redraw affected series\n                series.forEach(function (serie) {\n                    if ((isDirtyBox || serie.isDirty) && serie.visible) {\n                        serie.redraw();\n                    }\n                    // Set it here, otherwise we will have unlimited 'updatedData' calls\n                    // for a hidden series after setData(). Fixes #6012\n                    serie.isDirtyData = false;\n                });\n                // move tooltip or reset\n                if (pointer) {\n                    pointer.reset(true);\n                }\n                // redraw if canvas\n                renderer.draw();\n                // Fire the events\n                fireEvent(chart, 'redraw');\n                fireEvent(chart, 'render');\n                if (isHiddenChart) {\n                    chart.temporaryDisplay(true);\n                }\n                // Fire callbacks that are put on hold until after the redraw\n                afterRedraw.forEach(function (callback) {\n                    callback.call();\n                });\n            };\n            /**\n             * Get an axis, series or point object by `id` as given in the configuration\n             * options. Returns `undefined` if no item is found.\n             *\n             * @sample highcharts/plotoptions/series-id/\n             *         Get series by id\n             *\n             * @function Highcharts.Chart#get\n             *\n             * @param {string} id\n             * The id as given in the configuration options.\n             *\n             * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n             * The retrieved item.\n             */\n            Chart.prototype.get = function (id) {\n                var ret,\n                    series = this.series,\n                    i;\n                /**\n                 * @private\n                 * @param {Highcharts.Axis|Highcharts.Series} item\n                 * @return {boolean}\n                 */\n                function itemById(item) {\n                    return (item.id === id ||\n                        (item.options && item.options.id === id));\n                }\n                ret =\n                    // Search axes\n                    find(this.axes, itemById) ||\n                        // Search series\n                        find(this.series, itemById);\n                // Search points\n                for (i = 0; !ret && i < series.length; i++) {\n                    ret = find(series[i].points || [], itemById);\n                }\n                return ret;\n            };\n            /**\n             * Create the Axis instances based on the config options.\n             *\n             * @private\n             * @function Highcharts.Chart#getAxes\n             * @fires Highcharts.Chart#event:afterGetAxes\n             * @fires Highcharts.Chart#event:getAxes\n             */\n            Chart.prototype.getAxes = function () {\n                var chart = this,\n                    options = this.options,\n                    xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n                    yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n                    optionsArray;\n                fireEvent(this, 'getAxes');\n                // make sure the options are arrays and add some members\n                xAxisOptions.forEach(function (axis, i) {\n                    axis.index = i;\n                    axis.isX = true;\n                });\n                yAxisOptions.forEach(function (axis, i) {\n                    axis.index = i;\n                });\n                // concatenate all axis options into one array\n                optionsArray = xAxisOptions.concat(yAxisOptions);\n                optionsArray.forEach(function (axisOptions) {\n                    new Axis(chart, axisOptions); // eslint-disable-line no-new\n                });\n                fireEvent(this, 'afterGetAxes');\n            };\n            /**\n             * Returns an array of all currently selected points in the chart. Points\n             * can be selected by clicking or programmatically by the\n             * {@link Highcharts.Point#select}\n             * function.\n             *\n             * @sample highcharts/plotoptions/series-allowpointselect-line/\n             *         Get selected points\n             *\n             * @function Highcharts.Chart#getSelectedPoints\n             *\n             * @return {Array<Highcharts.Point>}\n             *         The currently selected points.\n             */\n            Chart.prototype.getSelectedPoints = function () {\n                var points = [];\n                this.series.forEach(function (serie) {\n                    // For one-to-one points inspect series.data in order to retrieve\n                    // points outside the visible range (#6445). For grouped data,\n                    // inspect the generated series.points.\n                    points = points.concat(serie.getPointsCollection().filter(function (point) {\n                        return pick(point.selectedStaging, point.selected);\n                    }));\n                });\n                return points;\n            };\n            /**\n             * Returns an array of all currently selected series in the chart. Series\n             * can be selected either programmatically by the\n             * {@link Highcharts.Series#select}\n             * function or by checking the checkbox next to the legend item if\n             * [series.showCheckBox](https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox)\n             * is true.\n             *\n             * @sample highcharts/members/chart-getselectedseries/\n             *         Get selected series\n             *\n             * @function Highcharts.Chart#getSelectedSeries\n             *\n             * @return {Array<Highcharts.Series>}\n             *         The currently selected series.\n             */\n            Chart.prototype.getSelectedSeries = function () {\n                return this.series.filter(function (serie) {\n                    return serie.selected;\n                });\n            };\n            /**\n             * Set a new title or subtitle for the chart.\n             *\n             * @sample highcharts/members/chart-settitle/\n             *         Set title text and styles\n             *\n             * @function Highcharts.Chart#setTitle\n             *\n             * @param {Highcharts.TitleOptions} [titleOptions]\n             *        New title options. The title text itself is set by the\n             *        `titleOptions.text` property.\n             *\n             * @param {Highcharts.SubtitleOptions} [subtitleOptions]\n             *        New subtitle options. The subtitle text itself is set by the\n             *        `subtitleOptions.text` property.\n             *\n             * @param {boolean} [redraw]\n             *        Whether to redraw the chart or wait for a later call to\n             *        `chart.redraw()`.\n             */\n            Chart.prototype.setTitle = function (titleOptions, subtitleOptions, redraw) {\n                this.applyDescription('title', titleOptions);\n                this.applyDescription('subtitle', subtitleOptions);\n                // The initial call also adds the caption. On update, chart.update will\n                // relay to Chart.setCaption.\n                this.applyDescription('caption', void 0);\n                this.layOutTitles(redraw);\n            };\n            /**\n             * Apply a title, subtitle or caption for the chart\n             *\n             * @private\n             * @function Highcharts.Chart#applyDescription\n             * @param name {string}\n             * Either title, subtitle or caption\n             * @param {Highcharts.TitleOptions|Highcharts.SubtitleOptions|Highcharts.CaptionOptions|undefined} explicitOptions\n             * The options to set, will be merged with default options.\n             */\n            Chart.prototype.applyDescription = function (name, explicitOptions) {\n                var chart = this;\n                // Default style\n                var style = name === 'title' ? {\n                        color: '#333333',\n                        fontSize: this.options.isStock ? '16px' : '18px' // #2944\n                    } : {\n                        color: '#666666'\n                    };\n                // Merge default options with explicit options\n                var options = this.options[name] = merge(\n                    // Default styles\n                    (!this.styledMode && { style: style }),\n                    this.options[name],\n                    explicitOptions);\n                var elem = this[name];\n                if (elem && explicitOptions) {\n                    this[name] = elem = elem.destroy(); // remove old\n                }\n                if (options && !elem) {\n                    elem = this.renderer.text(options.text, 0, 0, options.useHTML)\n                        .attr({\n                        align: options.align,\n                        'class': 'highcharts-' + name,\n                        zIndex: options.zIndex || 4\n                    })\n                        .add();\n                    // Update methods, shortcut to Chart.setTitle, Chart.setSubtitle and\n                    // Chart.setCaption\n                    elem.update = function (updateOptions) {\n                        var fn = {\n                                title: 'setTitle',\n                                subtitle: 'setSubtitle',\n                                caption: 'setCaption'\n                            }[name];\n                        chart[fn](updateOptions);\n                    };\n                    // Presentational\n                    if (!this.styledMode) {\n                        elem.css(options.style);\n                    }\n                    /**\n                     * The chart title. The title has an `update` method that allows\n                     * modifying the options directly or indirectly via\n                     * `chart.update`.\n                     *\n                     * @sample highcharts/members/title-update/\n                     *         Updating titles\n                     *\n                     * @name Highcharts.Chart#title\n                     * @type {Highcharts.TitleObject}\n                     */\n                    /**\n                     * The chart subtitle. The subtitle has an `update` method that\n                     * allows modifying the options directly or indirectly via\n                     * `chart.update`.\n                     *\n                     * @name Highcharts.Chart#subtitle\n                     * @type {Highcharts.SubtitleObject}\n                     */\n                    this[name] = elem;\n                }\n            };\n            /**\n             * Internal function to lay out the chart title, subtitle and caption, and\n             * cache the full offset height for use in `getMargins`. The result is\n             * stored in `this.titleOffset`.\n             *\n             * @private\n             * @function Highcharts.Chart#layOutTitles\n             *\n             * @param {boolean} [redraw=true]\n             * @fires Highcharts.Chart#event:afterLayOutTitles\n             */\n            Chart.prototype.layOutTitles = function (redraw) {\n                var titleOffset = [0, 0, 0],\n                    requiresDirtyBox,\n                    renderer = this.renderer,\n                    spacingBox = this.spacingBox;\n                // Lay out the title and the subtitle respectively\n                ['title', 'subtitle', 'caption'].forEach(function (key) {\n                    var title = this[key], titleOptions = this.options[key], verticalAlign = titleOptions.verticalAlign || 'top', offset = key === 'title' ? -3 :\n                            // Floating subtitle (#6574)\n                            verticalAlign === 'top' ? titleOffset[0] + 2 : 0, titleSize, height;\n                    if (title) {\n                        if (!this.styledMode) {\n                            titleSize = titleOptions.style.fontSize;\n                        }\n                        titleSize = renderer.fontMetrics(titleSize, title).b;\n                        title\n                            .css({\n                            width: (titleOptions.width ||\n                                spacingBox.width + (titleOptions.widthAdjust || 0)) + 'px'\n                        });\n                        // Skip the cache for HTML (#3481, #11666)\n                        height = Math.round(title.getBBox(titleOptions.useHTML).height);\n                        title.align(extend({\n                            y: verticalAlign === 'bottom' ?\n                                titleSize :\n                                offset + titleSize,\n                            height: height\n                        }, titleOptions), false, 'spacingBox');\n                        if (!titleOptions.floating) {\n                            if (verticalAlign === 'top') {\n                                titleOffset[0] = Math.ceil(titleOffset[0] +\n                                    height);\n                            }\n                            else if (verticalAlign === 'bottom') {\n                                titleOffset[2] = Math.ceil(titleOffset[2] +\n                                    height);\n                            }\n                        }\n                    }\n                }, this);\n                // Handle title.margin and caption.margin\n                if (titleOffset[0] &&\n                    (this.options.title.verticalAlign || 'top') === 'top') {\n                    titleOffset[0] += this.options.title.margin;\n                }\n                if (titleOffset[2] &&\n                    this.options.caption.verticalAlign === 'bottom') {\n                    titleOffset[2] += this.options.caption.margin;\n                }\n                requiresDirtyBox = (!this.titleOffset ||\n                    this.titleOffset.join(',') !== titleOffset.join(','));\n                // Used in getMargins\n                this.titleOffset = titleOffset;\n                fireEvent(this, 'afterLayOutTitles');\n                if (!this.isDirtyBox && requiresDirtyBox) {\n                    this.isDirtyBox = this.isDirtyLegend = requiresDirtyBox;\n                    // Redraw if necessary (#2719, #2744)\n                    if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n                        this.redraw();\n                    }\n                }\n            };\n            /**\n             * Internal function to get the chart width and height according to options\n             * and container size. Sets {@link Chart.chartWidth} and\n             * {@link Chart.chartHeight}.\n             *\n             * @private\n             * @function Highcharts.Chart#getChartSize\n             */\n            Chart.prototype.getChartSize = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    widthOption = optionsChart.width,\n                    heightOption = optionsChart.height,\n                    renderTo = chart.renderTo;\n                // Get inner width and height\n                if (!defined(widthOption)) {\n                    chart.containerWidth = getStyle(renderTo, 'width');\n                }\n                if (!defined(heightOption)) {\n                    chart.containerHeight = getStyle(renderTo, 'height');\n                }\n                /**\n                 * The current pixel width of the chart.\n                 *\n                 * @name Highcharts.Chart#chartWidth\n                 * @type {number}\n                 */\n                chart.chartWidth = Math.max(// #1393\n                0, widthOption || chart.containerWidth || 600 // #1460\n                );\n                /**\n                 * The current pixel height of the chart.\n                 *\n                 * @name Highcharts.Chart#chartHeight\n                 * @type {number}\n                 */\n                chart.chartHeight = Math.max(0, relativeLength(heightOption, chart.chartWidth) ||\n                    (chart.containerHeight > 1 ?\n                        chart.containerHeight :\n                        400));\n            };\n            /**\n             * If the renderTo element has no offsetWidth, most likely one or more of\n             * its parents are hidden. Loop up the DOM tree to temporarily display the\n             * parents, then save the original display properties, and when the true\n             * size is retrieved, reset them. Used on first render and on redraws.\n             *\n             * @private\n             * @function Highcharts.Chart#temporaryDisplay\n             *\n             * @param {boolean} [revert]\n             * Revert to the saved original styles.\n             */\n            Chart.prototype.temporaryDisplay = function (revert) {\n                var node = this.renderTo,\n                    tempStyle;\n                if (!revert) {\n                    while (node && node.style) {\n                        // When rendering to a detached node, it needs to be temporarily\n                        // attached in order to read styling and bounding boxes (#5783,\n                        // #7024).\n                        if (!doc.body.contains(node) && !node.parentNode) {\n                            node.hcOrigDetached = true;\n                            doc.body.appendChild(node);\n                        }\n                        if (getStyle(node, 'display', false) === 'none' ||\n                            node.hcOricDetached) {\n                            node.hcOrigStyle = {\n                                display: node.style.display,\n                                height: node.style.height,\n                                overflow: node.style.overflow\n                            };\n                            tempStyle = {\n                                display: 'block',\n                                overflow: 'hidden'\n                            };\n                            if (node !== this.renderTo) {\n                                tempStyle.height = 0;\n                            }\n                            css(node, tempStyle);\n                            // If it still doesn't have an offset width after setting\n                            // display to block, it probably has an !important priority\n                            // #2631, 6803\n                            if (!node.offsetWidth) {\n                                node.style.setProperty('display', 'block', 'important');\n                            }\n                        }\n                        node = node.parentNode;\n                        if (node === doc.body) {\n                            break;\n                        }\n                    }\n                }\n                else {\n                    while (node && node.style) {\n                        if (node.hcOrigStyle) {\n                            css(node, node.hcOrigStyle);\n                            delete node.hcOrigStyle;\n                        }\n                        if (node.hcOrigDetached) {\n                            doc.body.removeChild(node);\n                            node.hcOrigDetached = false;\n                        }\n                        node = node.parentNode;\n                    }\n                }\n            };\n            /**\n             * Set the {@link Chart.container|chart container's} class name, in\n             * addition to `highcharts-container`.\n             *\n             * @function Highcharts.Chart#setClassName\n             *\n             * @param {string} [className]\n             * The additional class name.\n             */\n            Chart.prototype.setClassName = function (className) {\n                this.container.className = 'highcharts-container ' + (className || '');\n            };\n            /**\n             * Get the containing element, determine the size and create the inner\n             * container div to hold the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#afterGetContainer\n             * @fires Highcharts.Chart#event:afterGetContainer\n             */\n            Chart.prototype.getContainer = function () {\n                var chart = this,\n                    container,\n                    options = chart.options,\n                    optionsChart = options.chart,\n                    chartWidth,\n                    chartHeight,\n                    renderTo = chart.renderTo,\n                    indexAttrName = 'data-highcharts-chart',\n                    oldChartIndex,\n                    Ren,\n                    containerId = uniqueKey(),\n                    containerStyle,\n                    key;\n                if (!renderTo) {\n                    chart.renderTo = renderTo =\n                        optionsChart.renderTo;\n                }\n                if (isString(renderTo)) {\n                    chart.renderTo = renderTo =\n                        doc.getElementById(renderTo);\n                }\n                // Display an error if the renderTo is wrong\n                if (!renderTo) {\n                    error(13, true, chart);\n                }\n                // If the container already holds a chart, destroy it. The check for\n                // hasRendered is there because web pages that are saved to disk from\n                // the browser, will preserve the data-highcharts-chart attribute and\n                // the SVG contents, but not an interactive chart. So in this case,\n                // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n                oldChartIndex = pInt(attr(renderTo, indexAttrName));\n                if (isNumber(oldChartIndex) &&\n                    charts[oldChartIndex] &&\n                    charts[oldChartIndex].hasRendered) {\n                    charts[oldChartIndex].destroy();\n                }\n                // Make a reference to the chart from the div\n                attr(renderTo, indexAttrName, chart.index);\n                // remove previous chart\n                renderTo.innerHTML = '';\n                // If the container doesn't have an offsetWidth, it has or is a child of\n                // a node that has display:none. We need to temporarily move it out to a\n                // visible state to determine the size, else the legend and tooltips\n                // won't render properly. The skipClone option is used in sparklines as\n                // a micro optimization, saving about 1-2 ms each chart.\n                if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n                    chart.temporaryDisplay();\n                }\n                // get the width and height\n                chart.getChartSize();\n                chartWidth = chart.chartWidth;\n                chartHeight = chart.chartHeight;\n                // Allow table cells and flex-boxes to shrink without the chart blocking\n                // them out (#6427)\n                css(renderTo, { overflow: 'hidden' });\n                // Create the inner container\n                if (!chart.styledMode) {\n                    containerStyle = extend({\n                        position: 'relative',\n                        // needed for context menu (avoidscrollbars) and content\n                        // overflow in IE\n                        overflow: 'hidden',\n                        width: chartWidth + 'px',\n                        height: chartHeight + 'px',\n                        textAlign: 'left',\n                        lineHeight: 'normal',\n                        zIndex: 0,\n                        '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\n                        userSelect: 'none' // #13503\n                    }, optionsChart.style);\n                }\n                /**\n                 * The containing HTML element of the chart. The container is\n                 * dynamically inserted into the element given as the `renderTo`\n                 * parameter in the {@link Highcharts#chart} constructor.\n                 *\n                 * @name Highcharts.Chart#container\n                 * @type {Highcharts.HTMLDOMElement}\n                 */\n                container = createElement('div', {\n                    id: containerId\n                }, containerStyle, renderTo);\n                chart.container = container;\n                // cache the cursor (#1650)\n                chart._cursor = container.style.cursor;\n                // Initialize the renderer\n                Ren = H[optionsChart.renderer] || H.Renderer;\n                /**\n                 * The renderer instance of the chart. Each chart instance has only one\n                 * associated renderer.\n                 *\n                 * @name Highcharts.Chart#renderer\n                 * @type {Highcharts.SVGRenderer}\n                 */\n                chart.renderer = new Ren(container, chartWidth, chartHeight, null, optionsChart.forExport, options.exporting && options.exporting.allowHTML, chart.styledMode);\n                // Set the initial animation from the options\n                setAnimation(void 0, chart);\n                chart.setClassName(optionsChart.className);\n                if (!chart.styledMode) {\n                    chart.renderer.setStyle(optionsChart.style);\n                }\n                else {\n                    // Initialize definitions\n                    for (key in options.defs) { // eslint-disable-line guard-for-in\n                        this.renderer.definition(options.defs[key]);\n                    }\n                }\n                // Add a reference to the charts index\n                chart.renderer.chartIndex = chart.index;\n                fireEvent(this, 'afterGetContainer');\n            };\n            /**\n             * Calculate margins by rendering axis labels in a preliminary position.\n             * Title, subtitle and legend have already been rendered at this stage, but\n             * will be moved into their final positions.\n             *\n             * @private\n             * @function Highcharts.Chart#getMargins\n             * @fires Highcharts.Chart#event:getMargins\n             */\n            Chart.prototype.getMargins = function (skipAxes) {\n                var _a = this,\n                    spacing = _a.spacing,\n                    margin = _a.margin,\n                    titleOffset = _a.titleOffset;\n                this.resetMargins();\n                // Adjust for title and subtitle\n                if (titleOffset[0] && !defined(margin[0])) {\n                    this.plotTop = Math.max(this.plotTop, titleOffset[0] + spacing[0]);\n                }\n                if (titleOffset[2] && !defined(margin[2])) {\n                    this.marginBottom = Math.max(this.marginBottom, titleOffset[2] + spacing[2]);\n                }\n                // Adjust for legend\n                if (this.legend && this.legend.display) {\n                    this.legend.adjustMargins(margin, spacing);\n                }\n                fireEvent(this, 'getMargins');\n                if (!skipAxes) {\n                    this.getAxisMargins();\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.Chart#getAxisMargins\n             */\n            Chart.prototype.getAxisMargins = function () {\n                var chart = this, \n                    // [top, right, bottom, left]\n                    axisOffset = chart.axisOffset = [0, 0, 0, 0],\n                    colorAxis = chart.colorAxis,\n                    margin = chart.margin,\n                    getOffset = function (axes) {\n                        axes.forEach(function (axis) {\n                            if (axis.visible) {\n                                axis.getOffset();\n                        }\n                    });\n                };\n                // pre-render axes to get labels offset width\n                if (chart.hasCartesianSeries) {\n                    getOffset(chart.axes);\n                }\n                else if (colorAxis && colorAxis.length) {\n                    getOffset(colorAxis);\n                }\n                // Add the axis offsets\n                marginNames.forEach(function (m, side) {\n                    if (!defined(margin[side])) {\n                        chart[m] += axisOffset[side];\n                    }\n                });\n                chart.setChartSize();\n            };\n            /**\n             * Reflows the chart to its container. By default, the chart reflows\n             * automatically to its container following a `window.resize` event, as per\n             * the [chart.reflow](https://api.highcharts.com/highcharts/chart.reflow)\n             * option. However, there are no reliable events for div resize, so if the\n             * container is resized without a window resize event, this must be called\n             * explicitly.\n             *\n             * @sample highcharts/members/chart-reflow/\n             *         Resize div and reflow\n             * @sample highcharts/chart/events-container/\n             *         Pop up and reflow\n             *\n             * @function Highcharts.Chart#reflow\n             *\n             * @param {global.Event} [e]\n             *        Event arguments. Used primarily when the function is called\n             *        internally as a response to window resize.\n             */\n            Chart.prototype.reflow = function (e) {\n                var chart = this, optionsChart = chart.options.chart, renderTo = chart.renderTo, hasUserSize = (defined(optionsChart.width) &&\n                        defined(optionsChart.height)), width = optionsChart.width || getStyle(renderTo, 'width'), height = optionsChart.height || getStyle(renderTo, 'height'), target = e ? e.target : win;\n                // Width and height checks for display:none. Target is doc in IE8 and\n                // Opera, win in Firefox, Chrome and IE9.\n                if (!hasUserSize &&\n                    !chart.isPrinting &&\n                    width &&\n                    height &&\n                    (target === win || target === doc)) {\n                    if (width !== chart.containerWidth ||\n                        height !== chart.containerHeight) {\n                        U.clearTimeout(chart.reflowTimeout);\n                        // When called from window.resize, e is set, else it's called\n                        // directly (#2224)\n                        chart.reflowTimeout = syncTimeout(function () {\n                            // Set size, it may have been destroyed in the meantime\n                            // (#1257)\n                            if (chart.container) {\n                                chart.setSize(void 0, void 0, false);\n                            }\n                        }, e ? 100 : 0);\n                    }\n                    chart.containerWidth = width;\n                    chart.containerHeight = height;\n                }\n            };\n            /**\n             * Toggle the event handlers necessary for auto resizing, depending on the\n             * `chart.reflow` option.\n             *\n             * @private\n             * @function Highcharts.Chart#setReflow\n             */\n            Chart.prototype.setReflow = function (reflow) {\n                var chart = this;\n                if (reflow !== false && !this.unbindReflow) {\n                    this.unbindReflow = addEvent(win, 'resize', function (e) {\n                        // a removed event listener still runs in Edge and IE if the\n                        // listener was removed while the event runs, so check if the\n                        // chart is not destroyed (#11609)\n                        if (chart.options) {\n                            chart.reflow(e);\n                        }\n                    });\n                    addEvent(this, 'destroy', this.unbindReflow);\n                }\n                else if (reflow === false && this.unbindReflow) {\n                    // Unbind and unset\n                    this.unbindReflow = this.unbindReflow();\n                }\n                // The following will add listeners to re-fit the chart before and after\n                // printing (#2284). However it only works in WebKit. Should have worked\n                // in Firefox, but not supported in IE.\n                /*\n                if (win.matchMedia) {\n                    win.matchMedia('print').addListener(function reflow() {\n                        chart.reflow();\n                    });\n                }\n                //*/\n            };\n            /**\n             * Resize the chart to a given width and height. In order to set the width\n             * only, the height argument may be skipped. To set the height only, pass\n             * `undefined` for the width.\n             *\n             * @sample highcharts/members/chart-setsize-button/\n             *         Test resizing from buttons\n             * @sample highcharts/members/chart-setsize-jquery-resizable/\n             *         Add a jQuery UI resizable\n             * @sample stock/members/chart-setsize/\n             *         Highstock with UI resizable\n             *\n             * @function Highcharts.Chart#setSize\n             *\n             * @param {number|null} [width]\n             *        The new pixel width of the chart. Since v4.2.6, the argument can\n             *        be `undefined` in order to preserve the current value (when\n             *        setting height only), or `null` to adapt to the width of the\n             *        containing element.\n             *\n             * @param {number|null} [height]\n             *        The new pixel height of the chart. Since v4.2.6, the argument can\n             *        be `undefined` in order to preserve the current value, or `null`\n             *        in order to adapt to the height of the containing element.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:endResize\n             * @fires Highcharts.Chart#event:resize\n             */\n            Chart.prototype.setSize = function (width, height, animation) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    globalAnimation;\n                // Handle the isResizing counter\n                chart.isResizing += 1;\n                // set the animation for the current process\n                setAnimation(animation, chart);\n                globalAnimation = renderer.globalAnimation;\n                chart.oldChartHeight = chart.chartHeight;\n                chart.oldChartWidth = chart.chartWidth;\n                if (typeof width !== 'undefined') {\n                    chart.options.chart.width = width;\n                }\n                if (typeof height !== 'undefined') {\n                    chart.options.chart.height = height;\n                }\n                chart.getChartSize();\n                // Resize the container with the global animation applied if enabled\n                // (#2503)\n                if (!chart.styledMode) {\n                    (globalAnimation ? animate : css)(chart.container, {\n                        width: chart.chartWidth + 'px',\n                        height: chart.chartHeight + 'px'\n                    }, globalAnimation);\n                }\n                chart.setChartSize(true);\n                renderer.setSize(chart.chartWidth, chart.chartHeight, globalAnimation);\n                // handle axes\n                chart.axes.forEach(function (axis) {\n                    axis.isDirty = true;\n                    axis.setScale();\n                });\n                chart.isDirtyLegend = true; // force legend redraw\n                chart.isDirtyBox = true; // force redraw of plot and chart border\n                chart.layOutTitles(); // #2857\n                chart.getMargins();\n                chart.redraw(globalAnimation);\n                chart.oldChartHeight = null;\n                fireEvent(chart, 'resize');\n                // Fire endResize and set isResizing back. If animation is disabled,\n                // fire without delay\n                syncTimeout(function () {\n                    if (chart) {\n                        fireEvent(chart, 'endResize', null, function () {\n                            chart.isResizing -= 1;\n                        });\n                    }\n                }, animObject(globalAnimation).duration || 0);\n            };\n            /**\n             * Set the public chart properties. This is done before and after the\n             * pre-render to determine margin sizes.\n             *\n             * @private\n             * @function Highcharts.Chart#setChartSize\n             * @fires Highcharts.Chart#event:afterSetChartSize\n             */\n            Chart.prototype.setChartSize = function (skipAxes) {\n                var chart = this,\n                    inverted = chart.inverted,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    optionsChart = chart.options.chart,\n                    spacing = chart.spacing,\n                    clipOffset = chart.clipOffset,\n                    clipX,\n                    clipY,\n                    plotLeft,\n                    plotTop,\n                    plotWidth,\n                    plotHeight,\n                    plotBorderWidth;\n                /**\n                 * The current left position of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotLeft\n                 * @type {number}\n                 */\n                chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n                /**\n                 * The current top position of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotTop\n                 * @type {number}\n                 */\n                chart.plotTop = plotTop = Math.round(chart.plotTop);\n                /**\n                 * The current width of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotWidth\n                 * @type {number}\n                 */\n                chart.plotWidth = plotWidth = Math.max(0, Math.round(chartWidth - plotLeft - chart.marginRight));\n                /**\n                 * The current height of the plot area in pixels.\n                 *\n                 * @name Highcharts.Chart#plotHeight\n                 * @type {number}\n                 */\n                chart.plotHeight = plotHeight = Math.max(0, Math.round(chartHeight - plotTop - chart.marginBottom));\n                chart.plotSizeX = inverted ? plotHeight : plotWidth;\n                chart.plotSizeY = inverted ? plotWidth : plotHeight;\n                chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n                // Set boxes used for alignment\n                chart.spacingBox = renderer.spacingBox = {\n                    x: spacing[3],\n                    y: spacing[0],\n                    width: chartWidth - spacing[3] - spacing[1],\n                    height: chartHeight - spacing[0] - spacing[2]\n                };\n                chart.plotBox = renderer.plotBox = {\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                };\n                plotBorderWidth = 2 * Math.floor(chart.plotBorderWidth / 2);\n                clipX = Math.ceil(Math.max(plotBorderWidth, clipOffset[3]) / 2);\n                clipY = Math.ceil(Math.max(plotBorderWidth, clipOffset[0]) / 2);\n                chart.clipBox = {\n                    x: clipX,\n                    y: clipY,\n                    width: Math.floor(chart.plotSizeX -\n                        Math.max(plotBorderWidth, clipOffset[1]) / 2 -\n                        clipX),\n                    height: Math.max(0, Math.floor(chart.plotSizeY -\n                        Math.max(plotBorderWidth, clipOffset[2]) / 2 -\n                        clipY))\n                };\n                if (!skipAxes) {\n                    chart.axes.forEach(function (axis) {\n                        axis.setAxisSize();\n                        axis.setAxisTranslation();\n                    });\n                }\n                fireEvent(chart, 'afterSetChartSize', { skipAxes: skipAxes });\n            };\n            /**\n             * Initial margins before auto size margins are applied.\n             *\n             * @private\n             * @function Highcharts.Chart#resetMargins\n             */\n            Chart.prototype.resetMargins = function () {\n                fireEvent(this, 'resetMargins');\n                var chart = this,\n                    chartOptions = chart.options.chart;\n                // Create margin and spacing array\n                ['margin', 'spacing'].forEach(function splashArrays(target) {\n                    var value = chartOptions[target],\n                        values = isObject(value) ? value : [value,\n                        value,\n                        value,\n                        value];\n                    [\n                        'Top',\n                        'Right',\n                        'Bottom',\n                        'Left'\n                    ].forEach(function (sideName, side) {\n                        chart[target][side] = pick(chartOptions[target + sideName], values[side]);\n                    });\n                });\n                // Set margin names like chart.plotTop, chart.plotLeft,\n                // chart.marginRight, chart.marginBottom.\n                marginNames.forEach(function (m, side) {\n                    chart[m] = pick(chart.margin[side], chart.spacing[side]);\n                });\n                chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n                chart.clipOffset = [0, 0, 0, 0];\n            };\n            /**\n             * Internal function to draw or redraw the borders and backgrounds for chart\n             * and plot area.\n             *\n             * @private\n             * @function Highcharts.Chart#drawChartBox\n             * @fires Highcharts.Chart#event:afterDrawChartBox\n             */\n            Chart.prototype.drawChartBox = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    renderer = chart.renderer,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    chartBackground = chart.chartBackground,\n                    plotBackground = chart.plotBackground,\n                    plotBorder = chart.plotBorder,\n                    chartBorderWidth,\n                    styledMode = chart.styledMode,\n                    plotBGImage = chart.plotBGImage,\n                    chartBackgroundColor = optionsChart.backgroundColor,\n                    plotBackgroundColor = optionsChart.plotBackgroundColor,\n                    plotBackgroundImage = optionsChart.plotBackgroundImage,\n                    mgn,\n                    bgAttr,\n                    plotLeft = chart.plotLeft,\n                    plotTop = chart.plotTop,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotBox = chart.plotBox,\n                    clipRect = chart.clipRect,\n                    clipBox = chart.clipBox,\n                    verb = 'animate';\n                // Chart area\n                if (!chartBackground) {\n                    chart.chartBackground = chartBackground = renderer.rect()\n                        .addClass('highcharts-background')\n                        .add();\n                    verb = 'attr';\n                }\n                if (!styledMode) {\n                    // Presentational\n                    chartBorderWidth = optionsChart.borderWidth || 0;\n                    mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n                    bgAttr = {\n                        fill: chartBackgroundColor || 'none'\n                    };\n                    if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n                        bgAttr.stroke = optionsChart.borderColor;\n                        bgAttr['stroke-width'] = chartBorderWidth;\n                    }\n                    chartBackground\n                        .attr(bgAttr)\n                        .shadow(optionsChart.shadow);\n                }\n                else {\n                    chartBorderWidth = mgn = chartBackground.strokeWidth();\n                }\n                chartBackground[verb]({\n                    x: mgn / 2,\n                    y: mgn / 2,\n                    width: chartWidth - mgn - chartBorderWidth % 2,\n                    height: chartHeight - mgn - chartBorderWidth % 2,\n                    r: optionsChart.borderRadius\n                });\n                // Plot background\n                verb = 'animate';\n                if (!plotBackground) {\n                    verb = 'attr';\n                    chart.plotBackground = plotBackground = renderer.rect()\n                        .addClass('highcharts-plot-background')\n                        .add();\n                }\n                plotBackground[verb](plotBox);\n                if (!styledMode) {\n                    // Presentational attributes for the background\n                    plotBackground\n                        .attr({\n                        fill: plotBackgroundColor || 'none'\n                    })\n                        .shadow(optionsChart.plotShadow);\n                    // Create the background image\n                    if (plotBackgroundImage) {\n                        if (!plotBGImage) {\n                            chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight).add();\n                        }\n                        else {\n                            if (plotBackgroundImage !== plotBGImage.attr('href')) {\n                                plotBGImage.attr('href', plotBackgroundImage);\n                            }\n                            plotBGImage.animate(plotBox);\n                        }\n                    }\n                }\n                // Plot clip\n                if (!clipRect) {\n                    chart.clipRect = renderer.clipRect(clipBox);\n                }\n                else {\n                    clipRect.animate({\n                        width: clipBox.width,\n                        height: clipBox.height\n                    });\n                }\n                // Plot area border\n                verb = 'animate';\n                if (!plotBorder) {\n                    verb = 'attr';\n                    chart.plotBorder = plotBorder = renderer.rect()\n                        .addClass('highcharts-plot-border')\n                        .attr({\n                        zIndex: 1 // Above the grid\n                    })\n                        .add();\n                }\n                if (!styledMode) {\n                    // Presentational\n                    plotBorder.attr({\n                        stroke: optionsChart.plotBorderColor,\n                        'stroke-width': optionsChart.plotBorderWidth || 0,\n                        fill: 'none'\n                    });\n                }\n                plotBorder[verb](plotBorder.crisp({\n                    x: plotLeft,\n                    y: plotTop,\n                    width: plotWidth,\n                    height: plotHeight\n                }, -plotBorder.strokeWidth())); // #3282 plotBorder should be negative;\n                // reset\n                chart.isDirtyBox = false;\n                fireEvent(this, 'afterDrawChartBox');\n            };\n            /**\n             * Detect whether a certain chart property is needed based on inspecting its\n             * options and series. This mainly applies to the chart.inverted property,\n             * and in extensions to the chart.angular and chart.polar properties.\n             *\n             * @private\n             * @function Highcharts.Chart#propFromSeries\n             * @return {void}\n             */\n            Chart.prototype.propFromSeries = function () {\n                var chart = this,\n                    optionsChart = chart.options.chart,\n                    klass,\n                    seriesOptions = chart.options.series,\n                    i,\n                    value;\n                /**\n                 * The flag is set to `true` if a series of the chart is inverted.\n                 *\n                 * @name Highcharts.Chart#inverted\n                 * @type {boolean|undefined}\n                 */\n                ['inverted', 'angular', 'polar'].forEach(function (key) {\n                    // The default series type's class\n                    klass = seriesTypes[(optionsChart.type ||\n                        optionsChart.defaultSeriesType)];\n                    // Get the value from available chart-wide properties\n                    value =\n                        // It is set in the options:\n                        optionsChart[key] ||\n                            // The default series class:\n                            (klass && klass.prototype[key]);\n                    // requires it\n                    // 4. Check if any the chart's series require it\n                    i = seriesOptions && seriesOptions.length;\n                    while (!value && i--) {\n                        klass = seriesTypes[seriesOptions[i].type];\n                        if (klass && klass.prototype[key]) {\n                            value = true;\n                        }\n                    }\n                    // Set the chart property\n                    chart[key] = value;\n                });\n            };\n            /**\n             * Internal function to link two or more series together, based on the\n             * `linkedTo` option. This is done from `Chart.render`, and after\n             * `Chart.addSeries` and `Series.remove`.\n             *\n             * @private\n             * @function Highcharts.Chart#linkSeries\n             * @fires Highcharts.Chart#event:afterLinkSeries\n             */\n            Chart.prototype.linkSeries = function () {\n                var chart = this,\n                    chartSeries = chart.series;\n                // Reset links\n                chartSeries.forEach(function (series) {\n                    series.linkedSeries.length = 0;\n                });\n                // Apply new links\n                chartSeries.forEach(function (series) {\n                    var linkedTo = series.options.linkedTo;\n                    if (isString(linkedTo)) {\n                        if (linkedTo === ':previous') {\n                            linkedTo = chart.series[series.index - 1];\n                        }\n                        else {\n                            linkedTo = chart.get(linkedTo);\n                        }\n                        // #3341 avoid mutual linking\n                        if (linkedTo && linkedTo.linkedParent !== series) {\n                            linkedTo.linkedSeries.push(series);\n                            series.linkedParent = linkedTo;\n                            if (linkedTo.enabledDataSorting) {\n                                series.setDataSortingOptions();\n                            }\n                            series.visible = pick(series.options.visible, linkedTo.options.visible, series.visible); // #3879\n                        }\n                    }\n                });\n                fireEvent(this, 'afterLinkSeries');\n            };\n            /**\n             * Render series for the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#renderSeries\n             */\n            Chart.prototype.renderSeries = function () {\n                this.series.forEach(function (serie) {\n                    serie.translate();\n                    serie.render();\n                });\n            };\n            /**\n             * Render labels for the chart.\n             *\n             * @private\n             * @function Highcharts.Chart#renderLabels\n             */\n            Chart.prototype.renderLabels = function () {\n                var chart = this,\n                    labels = chart.options.labels;\n                if (labels.items) {\n                    labels.items.forEach(function (label) {\n                        var style = extend(labels.style,\n                            label.style),\n                            x = pInt(style.left) + chart.plotLeft,\n                            y = pInt(style.top) + chart.plotTop + 12;\n                        // delete to prevent rewriting in IE\n                        delete style.left;\n                        delete style.top;\n                        chart.renderer.text(label.html, x, y)\n                            .attr({ zIndex: 2 })\n                            .css(style)\n                            .add();\n                    });\n                }\n            };\n            /**\n             * Render all graphics for the chart. Runs internally on initialization.\n             *\n             * @private\n             * @function Highcharts.Chart#render\n             */\n            Chart.prototype.render = function () {\n                var chart = this,\n                    axes = chart.axes,\n                    colorAxis = chart.colorAxis,\n                    renderer = chart.renderer,\n                    options = chart.options,\n                    correction = 0, // correction for X axis labels\n                    tempWidth,\n                    tempHeight,\n                    redoHorizontal,\n                    redoVertical,\n                    renderAxes = function (axes) {\n                        axes.forEach(function (axis) {\n                            if (axis.visible) {\n                                axis.render();\n                        }\n                    });\n                };\n                // Title\n                chart.setTitle();\n                /**\n                 * The overview of the chart's series.\n                 *\n                 * @name Highcharts.Chart#legend\n                 * @type {Highcharts.Legend}\n                 */\n                chart.legend = new Legend(chart, options.legend);\n                // Get stacks\n                if (chart.getStacks) {\n                    chart.getStacks();\n                }\n                // Get chart margins\n                chart.getMargins(true);\n                chart.setChartSize();\n                // Record preliminary dimensions for later comparison\n                tempWidth = chart.plotWidth;\n                axes.some(function (axis) {\n                    if (axis.horiz &&\n                        axis.visible &&\n                        axis.options.labels.enabled &&\n                        axis.series.length) {\n                        // 21 is the most common correction for X axis labels\n                        correction = 21;\n                        return true;\n                    }\n                });\n                // use Math.max to prevent negative plotHeight\n                chart.plotHeight = Math.max(chart.plotHeight - correction, 0);\n                tempHeight = chart.plotHeight;\n                // Get margins by pre-rendering axes\n                axes.forEach(function (axis) {\n                    axis.setScale();\n                });\n                chart.getAxisMargins();\n                // If the plot area size has changed significantly, calculate tick\n                // positions again\n                redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n                // Height is more sensitive, use lower threshold\n                redoVertical = tempHeight / chart.plotHeight > 1.05;\n                if (redoHorizontal || redoVertical) {\n                    axes.forEach(function (axis) {\n                        if ((axis.horiz && redoHorizontal) ||\n                            (!axis.horiz && redoVertical)) {\n                            // update to reflect the new margins\n                            axis.setTickInterval(true);\n                        }\n                    });\n                    chart.getMargins(); // second pass to check for new labels\n                }\n                // Draw the borders and backgrounds\n                chart.drawChartBox();\n                // Axes\n                if (chart.hasCartesianSeries) {\n                    renderAxes(axes);\n                }\n                else if (colorAxis && colorAxis.length) {\n                    renderAxes(colorAxis);\n                }\n                // The series\n                if (!chart.seriesGroup) {\n                    chart.seriesGroup = renderer.g('series-group')\n                        .attr({ zIndex: 3 })\n                        .add();\n                }\n                chart.renderSeries();\n                // Labels\n                chart.renderLabels();\n                // Credits\n                chart.addCredits();\n                // Handle responsiveness\n                if (chart.setResponsive) {\n                    chart.setResponsive();\n                }\n                // Handle scaling\n                chart.updateContainerScaling();\n                // Set flag\n                chart.hasRendered = true;\n            };\n            /**\n             * Set a new credits label for the chart.\n             *\n             * @sample highcharts/credits/credits-update/\n             *         Add and update credits\n             *\n             * @function Highcharts.Chart#addCredits\n             *\n             * @param {Highcharts.CreditsOptions} [credits]\n             * A configuration object for the new credits.\n             */\n            Chart.prototype.addCredits = function (credits) {\n                var chart = this,\n                    creds = merge(true,\n                    this.options.credits,\n                    credits);\n                if (creds.enabled && !this.credits) {\n                    /**\n                     * The chart's credits label. The label has an `update` method that\n                     * allows setting new options as per the\n                     * [credits options set](https://api.highcharts.com/highcharts/credits).\n                     *\n                     * @name Highcharts.Chart#credits\n                     * @type {Highcharts.SVGElement}\n                     */\n                    this.credits = this.renderer.text(creds.text + (this.mapCredits || ''), 0, 0)\n                        .addClass('highcharts-credits')\n                        .on('click', function () {\n                        if (creds.href) {\n                            win.location.href = creds.href;\n                        }\n                    })\n                        .attr({\n                        align: creds.position.align,\n                        zIndex: 8\n                    });\n                    if (!chart.styledMode) {\n                        this.credits.css(creds.style);\n                    }\n                    this.credits\n                        .add()\n                        .align(creds.position);\n                    // Dynamically update\n                    this.credits.update = function (options) {\n                        chart.credits = chart.credits.destroy();\n                        chart.addCredits(options);\n                    };\n                }\n            };\n            /**\n             * Handle scaling, #11329 - when there is scaling/transform on the container\n             * or on a parent element, we need to take this into account. We calculate\n             * the scaling once here and it is picked up where we need to use it\n             * (Pointer, Tooltip).\n             *\n             * @private\n             * @function Highcharts.Chart#updateContainerScaling\n             */\n            Chart.prototype.updateContainerScaling = function () {\n                var container = this.container;\n                // #13342 - tooltip was not visible in Chrome, when chart\n                // updates height.\n                if (container.offsetWidth > 2 && // #13342\n                    container.offsetHeight > 2 && // #13342\n                    container.getBoundingClientRect) {\n                    var bb = container.getBoundingClientRect(),\n                        scaleX = bb.width / container.offsetWidth,\n                        scaleY = bb.height / container.offsetHeight;\n                    if (scaleX !== 1 || scaleY !== 1) {\n                        this.containerScaling = { scaleX: scaleX, scaleY: scaleY };\n                    }\n                    else {\n                        delete this.containerScaling;\n                    }\n                }\n            };\n            /**\n             * Remove the chart and purge memory. This method is called internally\n             * before adding a second chart into the same container, as well as on\n             * window unload to prevent leaks.\n             *\n             * @sample highcharts/members/chart-destroy/\n             *         Destroy the chart from a button\n             * @sample stock/members/chart-destroy/\n             *         Destroy with Highstock\n             *\n             * @function Highcharts.Chart#destroy\n             *\n             * @fires Highcharts.Chart#event:destroy\n             */\n            Chart.prototype.destroy = function () {\n                var chart = this,\n                    axes = chart.axes,\n                    series = chart.series,\n                    container = chart.container,\n                    i,\n                    parentNode = container && container.parentNode;\n                // fire the chart.destoy event\n                fireEvent(chart, 'destroy');\n                // Delete the chart from charts lookup array\n                if (chart.renderer.forExport) {\n                    erase(charts, chart); // #6569\n                }\n                else {\n                    charts[chart.index] = void 0;\n                }\n                H.chartCount--;\n                chart.renderTo.removeAttribute('data-highcharts-chart');\n                // remove events\n                removeEvent(chart);\n                // ==== Destroy collections:\n                // Destroy axes\n                i = axes.length;\n                while (i--) {\n                    axes[i] = axes[i].destroy();\n                }\n                // Destroy scroller & scroller series before destroying base series\n                if (this.scroller && this.scroller.destroy) {\n                    this.scroller.destroy();\n                }\n                // Destroy each series\n                i = series.length;\n                while (i--) {\n                    series[i] = series[i].destroy();\n                }\n                // ==== Destroy chart properties:\n                [\n                    'title', 'subtitle', 'chartBackground', 'plotBackground',\n                    'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n                    'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n                    'renderer'\n                ].forEach(function (name) {\n                    var prop = chart[name];\n                    if (prop && prop.destroy) {\n                        chart[name] = prop.destroy();\n                    }\n                });\n                // Remove container and all SVG, check container as it can break in IE\n                // when destroyed before finished loading\n                if (container) {\n                    container.innerHTML = '';\n                    removeEvent(container);\n                    if (parentNode) {\n                        discardElement(container);\n                    }\n                }\n                // clean it all up\n                objectEach(chart, function (val, key) {\n                    delete chart[key];\n                });\n            };\n            /**\n             * Prepare for first rendering after all data are loaded.\n             *\n             * @private\n             * @function Highcharts.Chart#firstRender\n             * @fires Highcharts.Chart#event:beforeRender\n             */\n            Chart.prototype.firstRender = function () {\n                var chart = this,\n                    options = chart.options;\n                // Hook for oldIE to check whether the chart is ready to render\n                if (chart.isReadyToRender && !chart.isReadyToRender()) {\n                    return;\n                }\n                // Create the container\n                chart.getContainer();\n                chart.resetMargins();\n                chart.setChartSize();\n                // Set the common chart properties (mainly invert) from the given series\n                chart.propFromSeries();\n                // get axes\n                chart.getAxes();\n                // Initialize the series\n                (isArray(options.series) ? options.series : []).forEach(\n                // #9680\n                function (serieOptions) {\n                    chart.initSeries(serieOptions);\n                });\n                chart.linkSeries();\n                chart.setSeriesData();\n                // Run an event after axes and series are initialized, but before\n                // render. At this stage, the series data is indexed and cached in the\n                // xData and yData arrays, so we can access those before rendering. Used\n                // in Highstock.\n                fireEvent(chart, 'beforeRender');\n                // depends on inverted and on margins being set\n                if (Pointer) {\n                    if (!H.hasTouch && (win.PointerEvent || win.MSPointerEvent)) {\n                        chart.pointer = new MSPointer(chart, options);\n                    }\n                    else {\n                        /**\n                         * The Pointer that keeps track of mouse and touch interaction.\n                         *\n                         * @memberof Highcharts.Chart\n                         * @name pointer\n                         * @type {Highcharts.Pointer}\n                         * @instance\n                         */\n                        chart.pointer = new Pointer(chart, options);\n                    }\n                }\n                chart.render();\n                // Fire the load event if there are no external images\n                if (!chart.renderer.imgCount && !chart.hasLoaded) {\n                    chart.onload();\n                }\n                // If the chart was rendered outside the top container, put it back in\n                // (#3679)\n                chart.temporaryDisplay(true);\n            };\n            /**\n             * Internal function that runs on chart load, async if any images are loaded\n             * in the chart. Runs the callbacks and triggers the `load` and `render`\n             * events.\n             *\n             * @private\n             * @function Highcharts.Chart#onload\n             * @fires Highcharts.Chart#event:load\n             * @fires Highcharts.Chart#event:render\n             */\n            Chart.prototype.onload = function () {\n                // Run callbacks, first the ones registered by modules, then user's one\n                this.callbacks.concat([this.callback]).forEach(function (fn) {\n                    // Chart destroyed in its own callback (#3600)\n                    if (fn && typeof this.index !== 'undefined') {\n                        fn.apply(this, [this]);\n                    }\n                }, this);\n                fireEvent(this, 'load');\n                fireEvent(this, 'render');\n                // Set up auto resize, check for not destroyed (#6068)\n                if (defined(this.index)) {\n                    this.setReflow(this.options.chart.reflow);\n                }\n                // Don't run again\n                this.hasLoaded = true;\n            };\n            return Chart;\n        }());\n        // Hook for adding callbacks in modules\n        Chart.prototype.callbacks = [];\n        /**\n         * Factory function for basic charts.\n         *\n         * @example\n         * // Render a chart in to div#container\n         * var chart = Highcharts.chart('container', {\n         *     title: {\n         *         text: 'My chart'\n         *     },\n         *     series: [{\n         *         data: [1, 3, 2, 4]\n         *     }]\n         * });\n         *\n         * @function Highcharts.chart\n         *\n         * @param {string|Highcharts.HTMLDOMElement} [renderTo]\n         *        The DOM element to render to, or its id.\n         *\n         * @param {Highcharts.Options} options\n         *        The chart options structure.\n         *\n         * @param {Highcharts.ChartCallbackFunction} [callback]\n         *        Function to run when the chart has loaded and and all external images\n         *        are loaded. Defining a\n         *        [chart.events.load](https://api.highcharts.com/highcharts/chart.events.load)\n         *        handler is equivalent.\n         *\n         * @return {Highcharts.Chart}\n         *         Returns the Chart object.\n         */\n        function chart(a, b, c) {\n            return new Chart(a, b, c);\n        }\n        H.chart = chart;\n        H.Chart = Chart;\n\n        return Chart;\n    });\n    _registerModule(_modules, 'parts/ScrollablePlotArea.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Chart, H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         *  Highcharts feature to make the Y axis stay fixed when scrolling the chart\n         *  horizontally on mobile devices. Supports left and right side axes.\n         */\n        /*\n        WIP on vertical scrollable plot area (#9378). To do:\n        - Bottom axis positioning\n        - Test with Gantt\n        - Look for size optimizing the code\n        - API and demos\n         */\n        var addEvent = U.addEvent,\n            createElement = U.createElement,\n            pick = U.pick,\n            stop = U.stop;\n        /**\n         * Options for a scrollable plot area. This feature provides a minimum size for\n         * the plot area of the chart. If the size gets smaller than this, typically\n         * on mobile devices, a native browser scrollbar is presented. This scrollbar\n         * provides smooth scrolling for the contents of the plot area, whereas the\n         * title, legend and unaffected axes are fixed.\n         *\n         * Since v7.1.2, a scrollable plot area can be defined for either horizontal or\n         * vertical scrolling, depending on whether the `minWidth` or `minHeight`\n         * option is set.\n         *\n         * @sample highcharts/chart/scrollable-plotarea\n         *         Scrollable plot area\n         * @sample highcharts/chart/scrollable-plotarea-vertical\n         *         Vertically scrollable plot area\n         * @sample {gantt} highcharts/chart/scrollable-plotarea-vertical\n         *         Gantt chart with vertically scrollable plot area\n         *\n         * @since     6.1.0\n         * @product   highcharts gantt\n         * @apioption chart.scrollablePlotArea\n         */\n        /**\n         * The minimum height for the plot area. If it gets smaller than this, the plot\n         * area will become scrollable.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.minHeight\n         */\n        /**\n         * The minimum width for the plot area. If it gets smaller than this, the plot\n         * area will become scrollable.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.minWidth\n         */\n        /**\n         * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n         * 1, where 0 aligns the plot area to the left and 1 aligns it to the right.\n         * Typically we would use 1 if the chart has right aligned Y axes.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.scrollPositionX\n         */\n        /**\n         * The initial scrolling position of the scrollable plot area. Ranges from 0 to\n         * 1, where 0 aligns the plot area to the top and 1 aligns it to the bottom.\n         *\n         * @type      {number}\n         * @apioption chart.scrollablePlotArea.scrollPositionY\n         */\n        /**\n         * The opacity of mask applied on one of the sides of the plot\n         * area.\n         *\n         * @sample {highcharts} highcharts/chart/scrollable-plotarea-opacity\n         *         Disabled opacity for the mask\n         *\n         * @type        {number}\n         * @default     0.85\n         * @since       7.1.1\n         * @apioption   chart.scrollablePlotArea.opacity\n         */\n        ''; // detach API doclets\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        addEvent(Chart, 'afterSetChartSize', function (e) {\n            var scrollablePlotArea = this.options.chart.scrollablePlotArea,\n                scrollableMinWidth = scrollablePlotArea && scrollablePlotArea.minWidth,\n                scrollableMinHeight = scrollablePlotArea && scrollablePlotArea.minHeight,\n                scrollablePixelsX,\n                scrollablePixelsY,\n                corrections;\n            if (!this.renderer.forExport) {\n                // The amount of pixels to scroll, the difference between chart\n                // width and scrollable width\n                if (scrollableMinWidth) {\n                    this.scrollablePixelsX = scrollablePixelsX = Math.max(0, scrollableMinWidth - this.chartWidth);\n                    if (scrollablePixelsX) {\n                        this.plotWidth += scrollablePixelsX;\n                        if (this.inverted) {\n                            this.clipBox.height += scrollablePixelsX;\n                            this.plotBox.height += scrollablePixelsX;\n                        }\n                        else {\n                            this.clipBox.width += scrollablePixelsX;\n                            this.plotBox.width += scrollablePixelsX;\n                        }\n                        corrections = {\n                            // Corrections for right side\n                            1: { name: 'right', value: scrollablePixelsX }\n                        };\n                    }\n                    // Currently we can only do either X or Y\n                }\n                else if (scrollableMinHeight) {\n                    this.scrollablePixelsY = scrollablePixelsY = Math.max(0, scrollableMinHeight - this.chartHeight);\n                    if (scrollablePixelsY) {\n                        this.plotHeight += scrollablePixelsY;\n                        if (this.inverted) {\n                            this.clipBox.width += scrollablePixelsY;\n                            this.plotBox.width += scrollablePixelsY;\n                        }\n                        else {\n                            this.clipBox.height += scrollablePixelsY;\n                            this.plotBox.height += scrollablePixelsY;\n                        }\n                        corrections = {\n                            2: { name: 'bottom', value: scrollablePixelsY }\n                        };\n                    }\n                }\n                if (corrections && !e.skipAxes) {\n                    this.axes.forEach(function (axis) {\n                        // For right and bottom axes, only fix the plot line length\n                        if (corrections[axis.side]) {\n                            // Get the plot lines right in getPlotLinePath,\n                            // temporarily set it to the adjusted plot width.\n                            axis.getPlotLinePath = function () {\n                                var marginName = corrections[axis.side].name,\n                                    correctionValue = corrections[axis.side].value, \n                                    // axis.right or axis.bottom\n                                    margin = this[marginName],\n                                    path;\n                                // Temporarily adjust\n                                this[marginName] = margin - correctionValue;\n                                path = H.Axis.prototype.getPlotLinePath.apply(this, arguments);\n                                // Reset\n                                this[marginName] = margin;\n                                return path;\n                            };\n                        }\n                        else {\n                            // Apply the corrected plotWidth\n                            axis.setAxisSize();\n                            axis.setAxisTranslation();\n                        }\n                    });\n                }\n            }\n        });\n        addEvent(Chart, 'render', function () {\n            if (this.scrollablePixelsX || this.scrollablePixelsY) {\n                if (this.setUpScrolling) {\n                    this.setUpScrolling();\n                }\n                this.applyFixed();\n            }\n            else if (this.fixedDiv) { // Has been in scrollable mode\n                this.applyFixed();\n            }\n        });\n        /**\n         * @private\n         * @function Highcharts.Chart#setUpScrolling\n         * @return {void}\n         */\n        Chart.prototype.setUpScrolling = function () {\n            var _this = this;\n            var attribs = {\n                    WebkitOverflowScrolling: 'touch',\n                    overflowX: 'hidden',\n                    overflowY: 'hidden'\n                };\n            if (this.scrollablePixelsX) {\n                attribs.overflowX = 'auto';\n            }\n            if (this.scrollablePixelsY) {\n                attribs.overflowY = 'auto';\n            }\n            // Add the necessary divs to provide scrolling\n            this.scrollingContainer = createElement('div', {\n                'className': 'highcharts-scrolling'\n            }, attribs, this.renderTo);\n            // On scroll, reset the chart position because it applies to the scrolled\n            // container\n            addEvent(this.scrollingContainer, 'scroll', function () {\n                if (_this.pointer) {\n                    delete _this.pointer.chartPosition;\n                }\n            });\n            this.innerContainer = createElement('div', {\n                'className': 'highcharts-inner-container'\n            }, null, this.scrollingContainer);\n            // Now move the container inside\n            this.innerContainer.appendChild(this.container);\n            // Don't run again\n            this.setUpScrolling = null;\n        };\n        /**\n         * These elements are moved over to the fixed renderer and stay fixed when the\n         * user scrolls the chart\n         * @private\n         */\n        Chart.prototype.moveFixedElements = function () {\n            var container = this.container,\n                fixedRenderer = this.fixedRenderer,\n                fixedSelectors = [\n                    '.highcharts-contextbutton',\n                    '.highcharts-credits',\n                    '.highcharts-legend',\n                    '.highcharts-legend-checkbox',\n                    '.highcharts-navigator-series',\n                    '.highcharts-navigator-xaxis',\n                    '.highcharts-navigator-yaxis',\n                    '.highcharts-navigator',\n                    '.highcharts-reset-zoom',\n                    '.highcharts-scrollbar',\n                    '.highcharts-subtitle',\n                    '.highcharts-title'\n                ],\n                axisClass;\n            if (this.scrollablePixelsX && !this.inverted) {\n                axisClass = '.highcharts-yaxis';\n            }\n            else if (this.scrollablePixelsX && this.inverted) {\n                axisClass = '.highcharts-xaxis';\n            }\n            else if (this.scrollablePixelsY && !this.inverted) {\n                axisClass = '.highcharts-xaxis';\n            }\n            else if (this.scrollablePixelsY && this.inverted) {\n                axisClass = '.highcharts-yaxis';\n            }\n            fixedSelectors.push(axisClass, axisClass + '-labels');\n            fixedSelectors.forEach(function (className) {\n                [].forEach.call(container.querySelectorAll(className), function (elem) {\n                    (elem.namespaceURI === fixedRenderer.SVG_NS ?\n                        fixedRenderer.box :\n                        fixedRenderer.box.parentNode).appendChild(elem);\n                    elem.style.pointerEvents = 'auto';\n                });\n            });\n        };\n        /**\n         * @private\n         * @function Highcharts.Chart#applyFixed\n         * @return {void}\n         */\n        Chart.prototype.applyFixed = function () {\n            var _a;\n            var fixedRenderer,\n                scrollableWidth,\n                scrollableHeight,\n                firstTime = !this.fixedDiv,\n                scrollableOptions = this.options.chart.scrollablePlotArea;\n            // First render\n            if (firstTime) {\n                this.fixedDiv = createElement('div', {\n                    className: 'highcharts-fixed'\n                }, {\n                    position: 'absolute',\n                    overflow: 'hidden',\n                    pointerEvents: 'none',\n                    zIndex: 2\n                }, null, true);\n                this.renderTo.insertBefore(this.fixedDiv, this.renderTo.firstChild);\n                this.renderTo.style.overflow = 'visible';\n                this.fixedRenderer = fixedRenderer = new H.Renderer(this.fixedDiv, this.chartWidth, this.chartHeight, (_a = this.options.chart) === null || _a === void 0 ? void 0 : _a.style);\n                // Mask\n                this.scrollableMask = fixedRenderer\n                    .path()\n                    .attr({\n                    fill: this.options.chart.backgroundColor || '#fff',\n                    'fill-opacity': pick(scrollableOptions.opacity, 0.85),\n                    zIndex: -1\n                })\n                    .addClass('highcharts-scrollable-mask')\n                    .add();\n                this.moveFixedElements();\n                addEvent(this, 'afterShowResetZoom', this.moveFixedElements);\n                addEvent(this, 'afterLayOutTitles', this.moveFixedElements);\n            }\n            else {\n                // Set the size of the fixed renderer to the visible width\n                this.fixedRenderer.setSize(this.chartWidth, this.chartHeight);\n            }\n            // Increase the size of the scrollable renderer and background\n            scrollableWidth = this.chartWidth + (this.scrollablePixelsX || 0);\n            scrollableHeight = this.chartHeight + (this.scrollablePixelsY || 0);\n            stop(this.container);\n            this.container.style.width = scrollableWidth + 'px';\n            this.container.style.height = scrollableHeight + 'px';\n            this.renderer.boxWrapper.attr({\n                width: scrollableWidth,\n                height: scrollableHeight,\n                viewBox: [0, 0, scrollableWidth, scrollableHeight].join(' ')\n            });\n            this.chartBackground.attr({\n                width: scrollableWidth,\n                height: scrollableHeight\n            });\n            this.scrollingContainer.style.height = this.chartHeight + 'px';\n            // Set scroll position\n            if (firstTime) {\n                if (scrollableOptions.scrollPositionX) {\n                    this.scrollingContainer.scrollLeft =\n                        this.scrollablePixelsX *\n                            scrollableOptions.scrollPositionX;\n                }\n                if (scrollableOptions.scrollPositionY) {\n                    this.scrollingContainer.scrollTop =\n                        this.scrollablePixelsY *\n                            scrollableOptions.scrollPositionY;\n                }\n            }\n            // Mask behind the left and right side\n            var axisOffset = this.axisOffset,\n                maskTop = this.plotTop - axisOffset[0] - 1,\n                maskLeft = this.plotLeft - axisOffset[3] - 1,\n                maskBottom = this.plotTop + this.plotHeight + axisOffset[2] + 1,\n                maskRight = this.plotLeft + this.plotWidth + axisOffset[1] + 1,\n                maskPlotRight = this.plotLeft + this.plotWidth -\n                    (this.scrollablePixelsX || 0),\n                maskPlotBottom = this.plotTop + this.plotHeight -\n                    (this.scrollablePixelsY || 0),\n                d;\n            if (this.scrollablePixelsX) {\n                d = [\n                    // Left side\n                    ['M', 0, maskTop],\n                    ['L', this.plotLeft - 1, maskTop],\n                    ['L', this.plotLeft - 1, maskBottom],\n                    ['L', 0, maskBottom],\n                    ['Z'],\n                    // Right side\n                    ['M', maskPlotRight, maskTop],\n                    ['L', this.chartWidth, maskTop],\n                    ['L', this.chartWidth, maskBottom],\n                    ['L', maskPlotRight, maskBottom],\n                    ['Z']\n                ];\n            }\n            else if (this.scrollablePixelsY) {\n                d = [\n                    // Top side\n                    ['M', maskLeft, 0],\n                    ['L', maskLeft, this.plotTop - 1],\n                    ['L', maskRight, this.plotTop - 1],\n                    ['L', maskRight, 0],\n                    ['Z'],\n                    // Bottom side\n                    ['M', maskLeft, maskPlotBottom],\n                    ['L', maskLeft, this.chartHeight],\n                    ['L', maskRight, this.chartHeight],\n                    ['L', maskRight, maskPlotBottom],\n                    ['Z']\n                ];\n            }\n            else {\n                d = [['M', 0, 0]];\n            }\n            if (this.redrawTrigger !== 'adjustHeight') {\n                this.scrollableMask.attr({ d: d });\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/StackingAxis.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            destroyObjectProperties = U.destroyObjectProperties,\n            fireEvent = U.fireEvent,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Adds stacking support to axes.\n         * @private\n         * @class\n         */\n        var StackingAxisAdditions = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function StackingAxisAdditions(axis) {\n                    this.oldStacks = {};\n                this.stacks = {};\n                this.stacksTouched = 0;\n                this.axis = axis;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Build the stacks from top down\n             * @private\n             */\n            StackingAxisAdditions.prototype.buildStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var axisSeries = axis.series;\n                var reversedStacks = pick(axis.options.reversedStacks,\n                    true);\n                var len = axisSeries.length;\n                var actualSeries,\n                    i;\n                if (!axis.isXAxis) {\n                    stacking.usePercentage = false;\n                    i = len;\n                    while (i--) {\n                        actualSeries = axisSeries[reversedStacks ? i : len - i - 1];\n                        actualSeries.setStackedPoints();\n                        actualSeries.setGroupedPoints();\n                    }\n                    // Loop up again to compute percent and stream stack\n                    for (i = 0; i < len; i++) {\n                        axisSeries[i].modifyStacks();\n                    }\n                    fireEvent(axis, 'afterBuildStacks');\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxisAdditions.prototype.cleanStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var stacks;\n                if (!axis.isXAxis) {\n                    if (stacking.oldStacks) {\n                        stacks = stacking.stacks = stacking.oldStacks;\n                    }\n                    // reset stacks\n                    objectEach(stacks, function (type) {\n                        objectEach(type, function (stack) {\n                            stack.cumulative = stack.total;\n                        });\n                    });\n                }\n            };\n            /**\n             * Set all the stacks to initial states and destroy unused ones.\n             * @private\n             */\n            StackingAxisAdditions.prototype.resetStacks = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var stacks = stacking.stacks;\n                if (!axis.isXAxis) {\n                    objectEach(stacks, function (type) {\n                        objectEach(type, function (stack, key) {\n                            // Clean up memory after point deletion (#1044, #4320)\n                            if (stack.touched < stacking.stacksTouched) {\n                                stack.destroy();\n                                delete type[key];\n                                // Reset stacks\n                            }\n                            else {\n                                stack.total = null;\n                                stack.cumulative = null;\n                            }\n                        });\n                    });\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxisAdditions.prototype.renderStackTotals = function () {\n                var stacking = this;\n                var axis = stacking.axis;\n                var chart = axis.chart;\n                var renderer = chart.renderer;\n                var stacks = stacking.stacks;\n                var stackTotalGroup = stacking.stackTotalGroup = (stacking.stackTotalGroup ||\n                        renderer\n                            .g('stack-labels')\n                            .attr({\n                            visibility: 'visible',\n                            zIndex: 6\n                        })\n                            .add());\n                // plotLeft/Top will change when y axis gets wider so we need to\n                // translate the stackTotalGroup at every render call. See bug #506\n                // and #516\n                stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n                // Render each stack total\n                objectEach(stacks, function (type) {\n                    objectEach(type, function (stack) {\n                        stack.render(stackTotalGroup);\n                    });\n                });\n            };\n            return StackingAxisAdditions;\n        }());\n        /**\n         * Axis with stacking support.\n         * @private\n         * @class\n         */\n        var StackingAxis = /** @class */ (function () {\n                function StackingAxis() {\n                }\n                /* *\n                 *\n                 *  Static Functions\n                 *\n                 * */\n                /**\n                 * Extends axis with stacking support.\n                 * @private\n                 */\n                StackingAxis.compose = function (AxisClass) {\n                    var axisProto = AxisClass.prototype;\n                addEvent(AxisClass, 'init', StackingAxis.onInit);\n                addEvent(AxisClass, 'destroy', StackingAxis.onDestroy);\n            };\n            /**\n             * @private\n             */\n            StackingAxis.onDestroy = function () {\n                var stacking = this.stacking;\n                if (!stacking) {\n                    return;\n                }\n                var stacks = stacking.stacks;\n                // Destroy each stack total\n                objectEach(stacks, function (stack, stackKey) {\n                    destroyObjectProperties(stack);\n                    stacks[stackKey] = null;\n                });\n                if (stacking &&\n                    stacking.stackTotalGroup) {\n                    stacking.stackTotalGroup.destroy();\n                }\n            };\n            /**\n             * @private\n             */\n            StackingAxis.onInit = function () {\n                var axis = this;\n                if (!axis.stacking) {\n                    axis.stacking = new StackingAxisAdditions(axis);\n                }\n            };\n            return StackingAxis;\n        }());\n\n        return StackingAxis;\n    });\n    _registerModule(_modules, 'mixins/legend-symbol.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var merge = U.merge,\n            pick = U.pick;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Legend symbol mixin.\n         *\n         * @private\n         * @mixin Highcharts.LegendSymbolMixin\n         */\n        H.LegendSymbolMixin = {\n            /**\n             * Get the series' symbol in the legend\n             *\n             * @private\n             * @function Highcharts.LegendSymbolMixin.drawRectangle\n             *\n             * @param {Highcharts.Legend} legend\n             * The legend object\n             *\n             * @param {Highcharts.Point|Highcharts.Series} item\n             * The series (this) or point\n             */\n            drawRectangle: function (legend, item) {\n                var options = legend.options,\n                    symbolHeight = legend.symbolHeight,\n                    square = options.squareSymbol,\n                    symbolWidth = square ? symbolHeight : legend.symbolWidth;\n                item.legendSymbol = this.chart.renderer.rect(square ? (legend.symbolWidth - symbolHeight) / 2 : 0, legend.baseline - symbolHeight + 1, // #3988\n                symbolWidth, symbolHeight, pick(legend.options.symbolRadius, symbolHeight / 2))\n                    .addClass('highcharts-point')\n                    .attr({\n                    zIndex: 3\n                }).add(item.legendGroup);\n            },\n            /**\n             * Get the series' symbol in the legend. This method should be overridable\n             * to create custom symbols through\n             * Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n             *\n             * @private\n             * @function Highcharts.LegendSymbolMixin.drawLineMarker\n             *\n             * @param {Highcharts.Legend} legend\n             * The legend object.\n             */\n            drawLineMarker: function (legend) {\n                var options = this.options,\n                    markerOptions = options.marker,\n                    radius,\n                    legendSymbol,\n                    symbolWidth = legend.symbolWidth,\n                    symbolHeight = legend.symbolHeight,\n                    generalRadius = symbolHeight / 2,\n                    renderer = this.chart.renderer,\n                    legendItemGroup = this.legendGroup,\n                    verticalCenter = legend.baseline -\n                        Math.round(legend.fontMetrics.b * 0.3),\n                    attr = {};\n                // Draw the line\n                if (!this.chart.styledMode) {\n                    attr = {\n                        'stroke-width': options.lineWidth || 0\n                    };\n                    if (options.dashStyle) {\n                        attr.dashstyle = options.dashStyle;\n                    }\n                }\n                this.legendLine = renderer\n                    .path([\n                    'M',\n                    0,\n                    verticalCenter,\n                    'L',\n                    symbolWidth,\n                    verticalCenter\n                ])\n                    .addClass('highcharts-graph')\n                    .attr(attr)\n                    .add(legendItemGroup);\n                // Draw the marker\n                if (markerOptions && markerOptions.enabled !== false && symbolWidth) {\n                    // Do not allow the marker to be larger than the symbolHeight\n                    radius = Math.min(pick(markerOptions.radius, generalRadius), generalRadius);\n                    // Restrict symbol markers size\n                    if (this.symbol.indexOf('url') === 0) {\n                        markerOptions = merge(markerOptions, {\n                            width: symbolHeight,\n                            height: symbolHeight\n                        });\n                        radius = 0;\n                    }\n                    this.legendSymbol = legendSymbol = renderer.symbol(this.symbol, (symbolWidth / 2) - radius, verticalCenter - radius, 2 * radius, 2 * radius, markerOptions)\n                        .addClass('highcharts-point')\n                        .add(legendItemGroup);\n                    legendSymbol.isMarker = true;\n                }\n            }\n        };\n\n        return H.LegendSymbolMixin;\n    });\n    _registerModule(_modules, 'parts/Point.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var animObject = U.animObject,\n            defined = U.defined,\n            erase = U.erase,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            getNestedProperty = U.getNestedProperty,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            syncTimeout = U.syncTimeout,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Function callback when a series point is clicked. Return false to cancel the\n         * action.\n         *\n         * @callback Highcharts.PointClickCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        The point where the event occured.\n         *\n         * @param {Highcharts.PointClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Common information for a click event on a series point.\n         *\n         * @interface Highcharts.PointClickEventObject\n         * @extends Highcharts.PointerEventObject\n         */ /**\n        * Clicked point.\n        * @name Highcharts.PointClickEventObject#point\n        * @type {Highcharts.Point}\n        */\n        /**\n         * Configuration hash for the data label and tooltip formatters.\n         *\n         * @interface Highcharts.PointLabelObject\n         */ /**\n        * The point's current color.\n        * @name Highcharts.PointLabelObject#color\n        * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n        */ /**\n        * The point's current color index, used in styled mode instead of `color`. The\n        * color index is inserted in class names used for styling.\n        * @name Highcharts.PointLabelObject#colorIndex\n        * @type {number}\n        */ /**\n        * The name of the related point.\n        * @name Highcharts.PointLabelObject#key\n        * @type {string|undefined}\n        */ /**\n        * The percentage for related points in a stacked series or pies.\n        * @name Highcharts.PointLabelObject#percentage\n        * @type {number}\n        */ /**\n        * The related point. The point name, if defined, is available through\n        * `this.point.name`.\n        * @name Highcharts.PointLabelObject#point\n        * @type {Highcharts.Point}\n        */ /**\n        * The related series. The series name is available through `this.series.name`.\n        * @name Highcharts.PointLabelObject#series\n        * @type {Highcharts.Series}\n        */ /**\n        * The total of values in either a stack for stacked series, or a pie in a pie\n        * series.\n        * @name Highcharts.PointLabelObject#total\n        * @type {number|undefined}\n        */ /**\n        * For categorized axes this property holds the category name for the point. For\n        * other axes it holds the X value.\n        * @name Highcharts.PointLabelObject#x\n        * @type {number|string|undefined}\n        */ /**\n        * The y value of the point.\n        * @name Highcharts.PointLabelObject#y\n        * @type {number|undefined}\n        */\n        /**\n         * Gets fired when the mouse leaves the area close to the point.\n         *\n         * @callback Highcharts.PointMouseOutCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Gets fired when the mouse enters the area close to the point.\n         *\n         * @callback Highcharts.PointMouseOverCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * The generic point options for all series.\n         *\n         * In TypeScript you have to extend `PointOptionsObject` with an additional\n         * declaration to allow custom data options:\n         *\n         * ```\n         * declare interface PointOptionsObject {\n         *     customProperty: string;\n         * }\n         * ```\n         *\n         * @interface Highcharts.PointOptionsObject\n         */\n        /**\n         * Possible option types for a data point.\n         *\n         * @typedef {number|string|Array<(number|string)>|Highcharts.PointOptionsObject|null} Highcharts.PointOptionsType\n         */\n        /**\n         * Gets fired when the point is removed using the `.remove()` method.\n         *\n         * @callback Highcharts.PointRemoveCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * Possible key values for the point state options.\n         *\n         * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.PointStateValue\n         */\n        /**\n         * Gets fired when the point is updated programmatically through the `.update()`\n         * method.\n         *\n         * @callback Highcharts.PointUpdateCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointUpdateEventObject} event\n         *        Event that occured.\n         */\n        /**\n         * Information about the update event.\n         *\n         * @interface Highcharts.PointUpdateEventObject\n         * @extends global.Event\n         */ /**\n        * Options data of the update event.\n        * @name Highcharts.PointUpdateEventObject#options\n        * @type {Highcharts.PointOptionsType}\n        */\n        ''; // detach doclet above\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The Point object. The point objects are generated from the `series.data`\n         * configuration objects or raw numbers. They can be accessed from the\n         * `Series.points` array. Other ways to instantiate points are through {@link\n         * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n         *\n         * @class\n         * @name Highcharts.Point\n         */\n        var Point = /** @class */ (function () {\n                function Point() {\n                    /* *\n                     *\n                     *  Properties\n                     *\n                     * */\n                    /**\n                     * For categorized axes this property holds the category name for the\n                     * point. For other axes it holds the X value.\n                     *\n                     * @name Highcharts.Point#category\n                     * @type {string}\n                     */\n                    this.category = void 0;\n                /**\n                 * The point's current color index, used in styled mode instead of\n                 * `color`. The color index is inserted in class names used for styling.\n                 *\n                 * @name Highcharts.Point#colorIndex\n                 * @type {number}\n                 */\n                this.colorIndex = void 0;\n                this.formatPrefix = 'point';\n                this.id = void 0;\n                this.isNull = false;\n                /**\n                 * The name of the point. The name can be given as the first position of the\n                 * point configuration array, or as a `name` property in the configuration:\n                 *\n                 * @example\n                 * // Array config\n                 * data: [\n                 *     ['John', 1],\n                 *     ['Jane', 2]\n                 * ]\n                 *\n                 * // Object config\n                 * data: [{\n                 *        name: 'John',\n                 *        y: 1\n                 * }, {\n                 *     name: 'Jane',\n                 *     y: 2\n                 * }]\n                 *\n                 * @name Highcharts.Point#name\n                 * @type {string}\n                 */\n                this.name = void 0;\n                /**\n                 * The point's options as applied in the initial configuration, or\n                 * extended through `Point.update`.\n                 *\n                 * In TypeScript you have to extend `PointOptionsObject` via an\n                 * additional interface to allow custom data options:\n                 *\n                 * ```\n                 * declare interface PointOptionsObject {\n                 *     customProperty: string;\n                 * }\n                 * ```\n                 *\n                 * @name Highcharts.Point#options\n                 * @type {Highcharts.PointOptionsObject}\n                 */\n                this.options = void 0;\n                /**\n                 * The percentage for points in a stacked series or pies.\n                 *\n                 * @name Highcharts.Point#percentage\n                 * @type {number|undefined}\n                 */\n                this.percentage = void 0;\n                this.selected = false;\n                /**\n                 * The series object associated with the point.\n                 *\n                 * @name Highcharts.Point#series\n                 * @type {Highcharts.Series}\n                 */\n                this.series = void 0;\n                /**\n                 * The total of values in either a stack for stacked series, or a pie in a\n                 * pie series.\n                 *\n                 * @name Highcharts.Point#total\n                 * @type {number|undefined}\n                 */\n                this.total = void 0;\n                /**\n                 * For certain series types, like pie charts, where individual points can\n                 * be shown or hidden.\n                 *\n                 * @name Highcharts.Point#visible\n                 * @type {boolean}\n                 * @default true\n                 */\n                this.visible = true;\n                this.x = void 0;\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Animate SVG elements associated with the point.\n             *\n             * @private\n             * @function Highcharts.Point#animateBeforeDestroy\n             */\n            Point.prototype.animateBeforeDestroy = function () {\n                var point = this,\n                    animateParams = { x: point.startXPos,\n                    opacity: 0 },\n                    isDataLabel,\n                    graphicalProps = point.getGraphicalProps();\n                graphicalProps.singular.forEach(function (prop) {\n                    isDataLabel = prop === 'dataLabel';\n                    point[prop] = point[prop].animate(isDataLabel ? {\n                        x: point[prop].startXPos,\n                        y: point[prop].startYPos,\n                        opacity: 0\n                    } : animateParams);\n                });\n                graphicalProps.plural.forEach(function (plural) {\n                    point[plural].forEach(function (item) {\n                        if (item.element) {\n                            item.animate(extend({ x: point.startXPos }, (item.startYPos ? {\n                                x: item.startXPos,\n                                y: item.startYPos\n                            } : {})));\n                        }\n                    });\n                });\n            };\n            /**\n             * Apply the options containing the x and y data and possible some extra\n             * properties. Called on point init or from point.update.\n             *\n             * @private\n             * @function Highcharts.Point#applyOptions\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options as defined in series.data.\n             *\n             * @param {number} [x]\n             *        Optionally, the x value.\n             *\n             * @return {Highcharts.Point}\n             *         The Point instance.\n             */\n            Point.prototype.applyOptions = function (options, x) {\n                var point = this,\n                    series = point.series,\n                    pointValKey = series.options.pointValKey || series.pointValKey;\n                options = Point.prototype.optionsToObject.call(this, options);\n                // copy options directly to point\n                extend(point, options);\n                point.options = point.options ? extend(point.options, options) : options;\n                // Since options are copied into the Point instance, some accidental\n                // options must be shielded (#5681)\n                if (options.group) {\n                    delete point.group;\n                }\n                if (options.dataLabels) {\n                    delete point.dataLabels;\n                }\n                /**\n                 * The y value of the point.\n                 * @name Highcharts.Point#y\n                 * @type {number|undefined}\n                 */\n                // For higher dimension series types. For instance, for ranges, point.y\n                // is mapped to point.low.\n                if (pointValKey) {\n                    point.y = Point.prototype.getNestedProperty.call(point, pointValKey);\n                }\n                point.isNull = pick(point.isValid && !point.isValid(), point.x === null || !isNumber(point.y)); // #3571, check for NaN\n                point.formatPrefix = point.isNull ? 'null' : 'point'; // #9233, #10874\n                // The point is initially selected by options (#5777)\n                if (point.selected) {\n                    point.state = 'select';\n                }\n                /**\n                 * The x value of the point.\n                 * @name Highcharts.Point#x\n                 * @type {number}\n                 */\n                // If no x is set by now, get auto incremented value. All points must\n                // have an x value, however the y value can be null to create a gap in\n                // the series\n                if ('name' in point &&\n                    typeof x === 'undefined' &&\n                    series.xAxis &&\n                    series.xAxis.hasNames) {\n                    point.x = series.xAxis.nameToX(point);\n                }\n                if (typeof point.x === 'undefined' && series) {\n                    if (typeof x === 'undefined') {\n                        point.x = series.autoIncrement(point);\n                    }\n                    else {\n                        point.x = x;\n                    }\n                }\n                return point;\n            };\n            /**\n             * Destroy a point to clear memory. Its reference still stays in\n             * `series.data`.\n             *\n             * @private\n             * @function Highcharts.Point#destroy\n             */\n            Point.prototype.destroy = function () {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    dataSorting = series.options.dataSorting,\n                    hoverPoints = chart.hoverPoints,\n                    globalAnimation = point.series.chart.renderer.globalAnimation,\n                    animation = animObject(globalAnimation),\n                    prop;\n                /**\n                 * Allow to call after animation.\n                 * @private\n                 */\n                function destroyPoint() {\n                    // Remove all events and elements\n                    if (point.graphic || point.dataLabel || point.dataLabels) {\n                        removeEvent(point);\n                        point.destroyElements();\n                    }\n                    for (prop in point) { // eslint-disable-line guard-for-in\n                        point[prop] = null;\n                    }\n                }\n                if (point.legendItem) { // pies have legend items\n                    chart.legend.destroyItem(point);\n                }\n                if (hoverPoints) {\n                    point.setState();\n                    erase(hoverPoints, point);\n                    if (!hoverPoints.length) {\n                        chart.hoverPoints = null;\n                    }\n                }\n                if (point === chart.hoverPoint) {\n                    point.onMouseOut();\n                }\n                // Remove properties after animation\n                if (!dataSorting || !dataSorting.enabled) {\n                    destroyPoint();\n                }\n                else {\n                    this.animateBeforeDestroy();\n                    syncTimeout(destroyPoint, animation.duration);\n                }\n                chart.pointCount--;\n            };\n            /**\n             * Destroy SVG elements associated with the point.\n             *\n             * @private\n             * @function Highcharts.Point#destroyElements\n             * @param {Highcharts.Dictionary<number>} [kinds]\n             */\n            Point.prototype.destroyElements = function (kinds) {\n                var point = this,\n                    props = point.getGraphicalProps(kinds);\n                props.singular.forEach(function (prop) {\n                    point[prop] = point[prop].destroy();\n                });\n                props.plural.forEach(function (plural) {\n                    point[plural].forEach(function (item) {\n                        if (item.element) {\n                            item.destroy();\n                        }\n                    });\n                    delete point[plural];\n                });\n            };\n            /**\n             * Fire an event on the Point object.\n             *\n             * @private\n             * @function Highcharts.Point#firePointEvent\n             *\n             * @param {string} eventType\n             *        Type of the event.\n             *\n             * @param {Highcharts.Dictionary<any>|Event} [eventArgs]\n             *        Additional event arguments.\n             *\n             * @param {Highcharts.EventCallbackFunction<Highcharts.Point>|Function} [defaultFunction]\n             *        Default event handler.\n             *\n             * @fires Highcharts.Point#event:*\n             */\n            Point.prototype.firePointEvent = function (eventType, eventArgs, defaultFunction) {\n                var point = this,\n                    series = this.series,\n                    seriesOptions = series.options;\n                // load event handlers on demand to save time on mouseover/out\n                if (seriesOptions.point.events[eventType] ||\n                    (point.options &&\n                        point.options.events &&\n                        point.options.events[eventType])) {\n                    point.importEvents();\n                }\n                // add default handler if in selection mode\n                if (eventType === 'click' && seriesOptions.allowPointSelect) {\n                    defaultFunction = function (event) {\n                        // Control key is for Windows, meta (= Cmd key) for Mac, Shift\n                        // for Opera.\n                        if (point.select) { // #2911\n                            point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n                        }\n                    };\n                }\n                fireEvent(point, eventType, eventArgs, defaultFunction);\n            };\n            /**\n             * Get the CSS class names for individual points. Used internally where the\n             * returned value is set on every point.\n             *\n             * @function Highcharts.Point#getClassName\n             *\n             * @return {string}\n             *         The class names.\n             */\n            Point.prototype.getClassName = function () {\n                var point = this;\n                return 'highcharts-point' +\n                    (point.selected ? ' highcharts-point-select' : '') +\n                    (point.negative ? ' highcharts-negative' : '') +\n                    (point.isNull ? ' highcharts-null-point' : '') +\n                    (typeof point.colorIndex !== 'undefined' ?\n                        ' highcharts-color-' + point.colorIndex : '') +\n                    (point.options.className ? ' ' + point.options.className : '') +\n                    (point.zone && point.zone.className ? ' ' +\n                        point.zone.className.replace('highcharts-negative', '') : '');\n            };\n            /**\n             * Get props of all existing graphical point elements.\n             *\n             * @private\n             * @function Highcharts.Point#getGraphicalProps\n             * @param {Highcharts.Dictionary<number>} [kinds]\n             * @return {Highcharts.PointGraphicalProps}\n             */\n            Point.prototype.getGraphicalProps = function (kinds) {\n                var point = this,\n                    props = [],\n                    prop,\n                    i,\n                    graphicalProps = { singular: [],\n                    plural: [] };\n                kinds = kinds || { graphic: 1, dataLabel: 1 };\n                if (kinds.graphic) {\n                    props.push('graphic', 'shadowGroup');\n                }\n                if (kinds.dataLabel) {\n                    props.push('dataLabel', 'dataLabelUpper', 'connector');\n                }\n                i = props.length;\n                while (i--) {\n                    prop = props[i];\n                    if (point[prop]) {\n                        graphicalProps.singular.push(prop);\n                    }\n                }\n                ['dataLabel', 'connector'].forEach(function (prop) {\n                    var plural = prop + 's';\n                    if (kinds[prop] && point[plural]) {\n                        graphicalProps.plural.push(plural);\n                    }\n                });\n                return graphicalProps;\n            };\n            /**\n             * Return the configuration hash needed for the data label and tooltip\n             * formatters.\n             *\n             * @function Highcharts.Point#getLabelConfig\n             *\n             * @return {Highcharts.PointLabelObject}\n             *         Abstract object used in formatters and formats.\n             */\n            Point.prototype.getLabelConfig = function () {\n                return {\n                    x: this.category,\n                    y: this.y,\n                    color: this.color,\n                    colorIndex: this.colorIndex,\n                    key: this.name || this.category,\n                    series: this.series,\n                    point: this,\n                    percentage: this.percentage,\n                    total: this.total || this.stackTotal\n                };\n            };\n            /**\n             * Returns the value of the point property for a given value.\n             * @private\n             */\n            Point.prototype.getNestedProperty = function (key) {\n                if (!key) {\n                    return;\n                }\n                if (key.indexOf('custom.') === 0) {\n                    return getNestedProperty(key, this.options);\n                }\n                return this[key];\n            };\n            /**\n             * In a series with `zones`, return the zone that the point belongs to.\n             *\n             * @function Highcharts.Point#getZone\n             *\n             * @return {Highcharts.SeriesZonesOptionsObject}\n             *         The zone item.\n             */\n            Point.prototype.getZone = function () {\n                var series = this.series,\n                    zones = series.zones,\n                    zoneAxis = series.zoneAxis || 'y',\n                    i = 0,\n                    zone;\n                zone = zones[i];\n                while (this[zoneAxis] >= zone.value) {\n                    zone = zones[++i];\n                }\n                // For resetting or reusing the point (#8100)\n                if (!this.nonZonedColor) {\n                    this.nonZonedColor = this.color;\n                }\n                if (zone && zone.color && !this.options.color) {\n                    this.color = zone.color;\n                }\n                else {\n                    this.color = this.nonZonedColor;\n                }\n                return zone;\n            };\n            /**\n             * Utility to check if point has new shape type. Used in column series and\n             * all others that are based on column series.\n             *\n             * @return boolean|undefined\n             */\n            Point.prototype.hasNewShapeType = function () {\n                var point = this;\n                var oldShapeType = point.graphic &&\n                        (point.graphic.symbolName || point.graphic.element.nodeName);\n                return oldShapeType !== this.shapeType;\n            };\n            /**\n             * Initialize the point. Called internally based on the `series.data`\n             * option.\n             *\n             * @function Highcharts.Point#init\n             *\n             * @param {Highcharts.Series} series\n             *        The series object containing this point.\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The data in either number, array or object format.\n             *\n             * @param {number} [x]\n             *        Optionally, the X value of the point.\n             *\n             * @return {Highcharts.Point}\n             *         The Point instance.\n             *\n             * @fires Highcharts.Point#event:afterInit\n             */\n            Point.prototype.init = function (series, options, x) {\n                this.series = series;\n                this.applyOptions(options, x);\n                // Add a unique ID to the point if none is assigned\n                this.id = defined(this.id) ? this.id : uniqueKey();\n                this.resolveColor();\n                series.chart.pointCount++;\n                fireEvent(this, 'afterInit');\n                return this;\n            };\n            /**\n             * Transform number or array configs into objects. Also called for object\n             * configs. Used internally to unify the different configuration formats for\n             * points. For example, a simple number `10` in a line series will be\n             * transformed to `{ y: 10 }`, and an array config like `[1, 10]` in a\n             * scatter series will be transformed to `{ x: 1, y: 10 }`.\n             *\n             * @function Highcharts.Point#optionsToObject\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The input option.\n             *\n             * @return {Highcharts.Dictionary<*>}\n             *         Transformed options.\n             */\n            Point.prototype.optionsToObject = function (options) {\n                var ret = {},\n                    series = this.series,\n                    keys = series.options.keys,\n                    pointArrayMap = keys || series.pointArrayMap || ['y'],\n                    valueCount = pointArrayMap.length,\n                    firstItemType,\n                    i = 0,\n                    j = 0;\n                if (isNumber(options) || options === null) {\n                    ret[pointArrayMap[0]] = options;\n                }\n                else if (isArray(options)) {\n                    // with leading x value\n                    if (!keys && options.length > valueCount) {\n                        firstItemType = typeof options[0];\n                        if (firstItemType === 'string') {\n                            ret.name = options[0];\n                        }\n                        else if (firstItemType === 'number') {\n                            ret.x = options[0];\n                        }\n                        i++;\n                    }\n                    while (j < valueCount) {\n                        // Skip undefined positions for keys\n                        if (!keys || typeof options[i] !== 'undefined') {\n                            if (pointArrayMap[j].indexOf('.') > 0) {\n                                // Handle nested keys, e.g. ['color.pattern.image']\n                                // Avoid function call unless necessary.\n                                Point.prototype.setNestedProperty(ret, options[i], pointArrayMap[j]);\n                            }\n                            else {\n                                ret[pointArrayMap[j]] = options[i];\n                            }\n                        }\n                        i++;\n                        j++;\n                    }\n                }\n                else if (typeof options === 'object') {\n                    ret = options;\n                    // This is the fastest way to detect if there are individual point\n                    // dataLabels that need to be considered in drawDataLabels. These\n                    // can only occur in object configs.\n                    if (options.dataLabels) {\n                        series._hasPointLabels = true;\n                    }\n                    // Same approach as above for markers\n                    if (options.marker) {\n                        series._hasPointMarkers = true;\n                    }\n                }\n                return ret;\n            };\n            /**\n             * @private\n             * @function Highcharts.Point#resolveColor\n             * @return {void}\n             */\n            Point.prototype.resolveColor = function () {\n                var series = this.series,\n                    colors,\n                    optionsChart = series.chart.options.chart,\n                    colorCount = optionsChart.colorCount,\n                    styledMode = series.chart.styledMode,\n                    colorIndex;\n                // remove points nonZonedColor for later recalculation\n                delete this.nonZonedColor;\n                /**\n                 * The point's current color.\n                 *\n                 * @name Highcharts.Point#color\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject|undefined}\n                 */\n                if (!styledMode && !this.options.color) {\n                    this.color = series.color; // #3445\n                }\n                if (series.options.colorByPoint) {\n                    if (!styledMode) {\n                        colors = series.options.colors || series.chart.options.colors;\n                        this.color = this.color || colors[series.colorCounter];\n                        colorCount = colors.length;\n                    }\n                    colorIndex = series.colorCounter;\n                    series.colorCounter++;\n                    // loop back to zero\n                    if (series.colorCounter === colorCount) {\n                        series.colorCounter = 0;\n                    }\n                }\n                else {\n                    colorIndex = series.colorIndex;\n                }\n                this.colorIndex = pick(this.colorIndex, colorIndex);\n            };\n            /**\n             * Set a value in an object, on the property defined by key. The key\n             * supports nested properties using dot notation. The function modifies the\n             * input object and does not make a copy.\n             *\n             * @function Highcharts.Point#setNestedProperty<T>\n             *\n             * @param {T} object\n             *        The object to set the value on.\n             *\n             * @param {*} value\n             *        The value to set.\n             *\n             * @param {string} key\n             *        Key to the property to set.\n             *\n             * @return {T}\n             *         The modified object.\n             */\n            Point.prototype.setNestedProperty = function (object, value, key) {\n                var nestedKeys = key.split('.');\n                nestedKeys.reduce(function (result, key, i, arr) {\n                    var isLastKey = arr.length - 1 === i;\n                    result[key] = (isLastKey ?\n                        value :\n                        isObject(result[key], true) ?\n                            result[key] :\n                            {});\n                    return result[key];\n                }, object);\n                return object;\n            };\n            /**\n             * Extendable method for formatting each point's tooltip line.\n             *\n             * @function Highcharts.Point#tooltipFormatter\n             *\n             * @param {string} pointFormat\n             *        The point format.\n             *\n             * @return {string}\n             *         A string to be concatenated in to the common tooltip text.\n             */\n            Point.prototype.tooltipFormatter = function (pointFormat) {\n                // Insert options for valueDecimals, valuePrefix, and valueSuffix\n                var series = this.series, seriesTooltipOptions = series.tooltipOptions, valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''), valuePrefix = seriesTooltipOptions.valuePrefix || '', valueSuffix = seriesTooltipOptions.valueSuffix || '';\n                // Replace default point style with class name\n                if (series.chart.styledMode) {\n                    pointFormat =\n                        series.chart.tooltip.styledModeFormat(pointFormat);\n                }\n                // Loop over the point array map and replace unformatted values with\n                // sprintf formatting markup\n                (series.pointArrayMap || ['y']).forEach(function (key) {\n                    key = '{point.' + key; // without the closing bracket\n                    if (valuePrefix || valueSuffix) {\n                        pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), valuePrefix + key + '}' + valueSuffix);\n                    }\n                    pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), key + ':,.' + valueDecimals + 'f}');\n                });\n                return format(pointFormat, {\n                    point: this,\n                    series: this.series\n                }, series.chart);\n            };\n            return Point;\n        }());\n        H.Point = Point;\n\n        return Point;\n    });\n    _registerModule(_modules, 'parts/Series.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/SVGElement.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, O, Point, SVGElement, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            arrayMin = U.arrayMin,\n            clamp = U.clamp,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            getNestedProperty = U.getNestedProperty,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            seriesType = U.seriesType,\n            splat = U.splat,\n            syncTimeout = U.syncTimeout;\n        /**\n         * This is a placeholder type of the possible series options for\n         * [Highcharts](../highcharts/series), [Highstock](../highstock/series),\n         * [Highmaps](../highmaps/series), and [Gantt](../gantt/series).\n         *\n         * In TypeScript is this dynamically generated to reference all possible types\n         * of series options.\n         *\n         * @ignore-declaration\n         * @typedef {Highcharts.SeriesOptions|Highcharts.Dictionary<*>} Highcharts.SeriesOptionsType\n         */\n        /**\n         * Options for `dataSorting`.\n         *\n         * @interface Highcharts.DataSortingOptionsObject\n         * @since 8.0.0\n         */ /**\n        * Enable or disable data sorting for the series.\n        * @name Highcharts.DataSortingOptionsObject#enabled\n        * @type {boolean|undefined}\n        */ /**\n        * Whether to allow matching points by name in an update.\n        * @name Highcharts.DataSortingOptionsObject#matchByName\n        * @type {boolean|undefined}\n        */ /**\n        * Determines what data value should be used to sort by.\n        * @name Highcharts.DataSortingOptionsObject#sortKey\n        * @type {string|undefined}\n        */\n        /**\n         * Function callback when a series has been animated.\n         *\n         * @callback Highcharts.SeriesAfterAnimateCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesAfterAnimateEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Event information regarding completed animation of a series.\n         *\n         * @interface Highcharts.SeriesAfterAnimateEventObject\n         */ /**\n        * Animated series.\n        * @name Highcharts.SeriesAfterAnimateEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesAfterAnimateEventObject#type\n        * @type {\"afterAnimate\"}\n        */\n        /**\n         * Function callback when the checkbox next to the series' name in the legend is\n         * clicked.\n         *\n         * @callback Highcharts.SeriesCheckboxClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesCheckboxClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Event information regarding check of a series box.\n         *\n         * @interface Highcharts.SeriesCheckboxClickEventObject\n         */ /**\n        * Whether the box has been checked.\n        * @name Highcharts.SeriesCheckboxClickEventObject#checked\n        * @type {boolean}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#item\n        * @type {Highcharts.Series}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesCheckboxClickEventObject#type\n        * @type {\"checkboxClick\"}\n        */\n        /**\n         * Function callback when a series is clicked. Return false to cancel toogle\n         * actions.\n         *\n         * @callback Highcharts.SeriesClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesClickEventObject} event\n         *        Event arguments.\n         */\n        /**\n         * Common information for a click event on a series.\n         *\n         * @interface Highcharts.SeriesClickEventObject\n         * @extends global.Event\n         */ /**\n        * Nearest point on the graph.\n        * @name Highcharts.SeriesClickEventObject#point\n        * @type {Highcharts.Point}\n        */\n        /**\n         * Gets fired when the series is hidden after chart generation time, either by\n         * clicking the legend item or by calling `.hide()`.\n         *\n         * @callback Highcharts.SeriesHideCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * The SVG value used for the `stroke-linecap` and `stroke-linejoin` of a line\n         * graph.\n         *\n         * @typedef {\"butt\"|\"round\"|\"square\"|string} Highcharts.SeriesLinecapValue\n         */\n        /**\n         * Gets fired when the legend item belonging to the series is clicked. The\n         * default action is to toggle the visibility of the series. This can be\n         * prevented by returning `false` or calling `event.preventDefault()`.\n         *\n         * @callback Highcharts.SeriesLegendItemClickCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        The series where the event occured.\n         *\n         * @param {Highcharts.SeriesLegendItemClickEventObject} event\n         *        The event that occured.\n         */\n        /**\n         * Information about the event.\n         *\n         * @interface Highcharts.SeriesLegendItemClickEventObject\n         */ /**\n        * Related browser event.\n        * @name Highcharts.SeriesLegendItemClickEventObject#browserEvent\n        * @type {global.PointerEvent}\n        */ /**\n        * Prevent the default action of toggle the visibility of the series.\n        * @name Highcharts.SeriesLegendItemClickEventObject#preventDefault\n        * @type {Function}\n        */ /**\n        * Related series.\n        * @name Highcharts.SeriesCheckboxClickEventObject#target\n        * @type {Highcharts.Series}\n        */ /**\n        * Event type.\n        * @name Highcharts.SeriesCheckboxClickEventObject#type\n        * @type {\"checkboxClick\"}\n        */\n        /**\n         * Gets fired when the mouse leaves the graph.\n         *\n         * @callback Highcharts.SeriesMouseOutCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Gets fired when the mouse enters the graph.\n         *\n         * @callback Highcharts.SeriesMouseOverCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.PointerEvent} event\n         *        Event that occured.\n         */\n        /**\n         * Translation and scale for the plot area of a series.\n         *\n         * @interface Highcharts.SeriesPlotBoxObject\n         */ /**\n        * @name Highcharts.SeriesPlotBoxObject#scaleX\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#scaleY\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#translateX\n        * @type {number}\n        */ /**\n        * @name Highcharts.SeriesPlotBoxObject#translateY\n        * @type {number}\n        */\n        /**\n         * Gets fired when the series is shown after chart generation time, either by\n         * clicking the legend item or by calling `.show()`.\n         *\n         * @callback Highcharts.SeriesShowCallbackFunction\n         *\n         * @param {Highcharts.Series} this\n         *        Series where the event occured.\n         *\n         * @param {global.Event} event\n         *        Event that occured.\n         */\n        /**\n         * Possible key values for the series state options.\n         *\n         * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.SeriesStateValue\n         */\n        ''; // detach doclets above\n        var seriesTypes = H.seriesTypes,\n            win = H.win;\n        /**\n         * This is the base series prototype that all other series types inherit from.\n         * A new series is initialized either through the\n         * [series](https://api.highcharts.com/highcharts/series)\n         * option structure, or after the chart is initialized, through\n         * {@link Highcharts.Chart#addSeries}.\n         *\n         * The object can be accessed in a number of ways. All series and point event\n         * handlers give a reference to the `series` object. The chart object has a\n         * {@link Highcharts.Chart#series|series} property that is a collection of all\n         * the chart's series. The point objects and axis objects also have the same\n         * reference.\n         *\n         * Another way to reference the series programmatically is by `id`. Add an id\n         * in the series configuration options, and get the series object by\n         * {@link Highcharts.Chart#get}.\n         *\n         * Configuration options for the series are given in three levels. Options for\n         * all series in a chart are given in the\n         * [plotOptions.series](https://api.highcharts.com/highcharts/plotOptions.series)\n         * object. Then options for all series of a specific type\n         * are given in the plotOptions of that type, for example `plotOptions.line`.\n         * Next, options for one single series are given in the series array, or as\n         * arguments to `chart.addSeries`.\n         *\n         * The data in the series is stored in various arrays.\n         *\n         * - First, `series.options.data` contains all the original config options for\n         *   each point whether added by options or methods like `series.addPoint`.\n         *\n         * - Next, `series.data` contains those values converted to points, but in case\n         *   the series data length exceeds the `cropThreshold`, or if the data is\n         *   grouped, `series.data` doesn't contain all the points. It only contains the\n         *   points that have been created on demand.\n         *\n         * - Then there's `series.points` that contains all currently visible point\n         *   objects. In case of cropping, the cropped-away points are not part of this\n         *   array. The `series.points` array starts at `series.cropStart` compared to\n         *   `series.data` and `series.options.data`. If however the series data is\n         *   grouped, these can't be correlated one to one.\n         *\n         * - `series.xData` and `series.processedXData` contain clean x values,\n         *   equivalent to `series.data` and `series.points`.\n         *\n         * - `series.yData` and `series.processedYData` contain clean y values,\n         *   equivalent to `series.data` and `series.points`.\n         *\n         * @class\n         * @name Highcharts.Series\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart instance.\n         *\n         * @param {Highcharts.SeriesOptionsType|object} options\n         *        The series options.\n         */ /**\n        * The line series is the base type and is therefor the series base prototype.\n        *\n        * @private\n        * @class\n        * @name Highcharts.seriesTypes.line\n        *\n        * @augments Highcharts.Series\n        */\n        H.Series = seriesType('line', \n        /**\n         * Series options for specific data and the data itself. In TypeScript you\n         * have to cast the series options to specific series types, to get all\n         * possible options for a series.\n         *\n         * @example\n         * // TypeScript example\n         * Highcharts.chart('container', {\n         *     series: [{\n         *         color: '#06C',\n         *         data: [[0, 1], [2, 3]]\n         *     } as Highcharts.SeriesLineOptions ]\n         * });\n         *\n         * @type      {Array<*>}\n         * @apioption series\n         */\n        /**\n         * An id for the series. This can be used after render time to get a pointer\n         * to the series object through `chart.get()`.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-id/\n         *         Get series by id\n         *\n         * @type      {string}\n         * @since     1.2.0\n         * @apioption series.id\n         */\n        /**\n         * The index of the series in the chart, affecting the internal index in the\n         * `chart.series` array, the visible Z index as well as the order in the\n         * legend.\n         *\n         * @type      {number}\n         * @since     2.3.0\n         * @apioption series.index\n         */\n        /**\n         * The sequential index of the series in the legend.\n         *\n         * @see [legend.reversed](#legend.reversed),\n         *      [yAxis.reversedStacks](#yAxis.reversedStacks)\n         *\n         * @sample {highcharts|highstock} highcharts/series/legendindex/\n         *         Legend in opposite order\n         *\n         * @type      {number}\n         * @apioption series.legendIndex\n         */\n        /**\n         * The name of the series as shown in the legend, tooltip etc.\n         *\n         * @sample {highcharts} highcharts/series/name/\n         *         Series name\n         * @sample {highmaps} maps/demo/category-map/\n         *         Series name\n         *\n         * @type      {string}\n         * @apioption series.name\n         */\n        /**\n         * This option allows grouping series in a stacked chart. The stack option\n         * can be a string or anything else, as long as the grouped series' stack\n         * options match each other after conversion into a string.\n         *\n         * @sample {highcharts} highcharts/series/stack/\n         *         Stacked and grouped columns\n         *\n         * @type      {number|string}\n         * @since     2.1\n         * @product   highcharts highstock\n         * @apioption series.stack\n         */\n        /**\n         * The type of series, for example `line` or `column`. By default, the\n         * series type is inherited from [chart.type](#chart.type), so unless the\n         * chart is a combination of series types, there is no need to set it on the\n         * series level.\n         *\n         * @sample {highcharts} highcharts/series/type/\n         *         Line and column in the same chart\n         * @sample highcharts/series/type-dynamic/\n         *         Dynamic types with button selector\n         * @sample {highmaps} maps/demo/mapline-mappoint/\n         *         Multiple types in the same map\n         *\n         * @type      {string}\n         * @apioption series.type\n         */\n        /**\n         * When using dual or multiple x axes, this number defines which xAxis the\n         * particular series is connected to. It refers to either the\n         * {@link #xAxis.id|axis id}\n         * or the index of the axis in the xAxis array, with 0 being the first.\n         *\n         * @type      {number|string}\n         * @default   0\n         * @product   highcharts highstock\n         * @apioption series.xAxis\n         */\n        /**\n         * When using dual or multiple y axes, this number defines which yAxis the\n         * particular series is connected to. It refers to either the\n         * {@link #yAxis.id|axis id}\n         * or the index of the axis in the yAxis array, with 0 being the first.\n         *\n         * @sample {highcharts} highcharts/series/yaxis/\n         *         Apply the column series to the secondary Y axis\n         *\n         * @type      {number|string}\n         * @default   0\n         * @product   highcharts highstock\n         * @apioption series.yAxis\n         */\n        /**\n         * Define the visual z index of the series.\n         *\n         * @sample {highcharts} highcharts/plotoptions/series-zindex-default/\n         *         With no z index, the series defined last are on top\n         * @sample {highcharts} highcharts/plotoptions/series-zindex/\n         *         With a z index, the series with the highest z index is on top\n         * @sample {highstock} highcharts/plotoptions/series-zindex-default/\n         *         With no z index, the series defined last are on top\n         * @sample {highstock} highcharts/plotoptions/series-zindex/\n         *         With a z index, the series with the highest z index is on top\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.zIndex\n         */\n        null, \n        /**\n         * General options for all series types.\n         *\n         * @optionparent plotOptions.series\n         */\n        {\n            /**\n             * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n             * of a line graph. Round means that lines are rounded in the ends and\n             * bends.\n             *\n             * @type       {Highcharts.SeriesLinecapValue}\n             * @default    round\n             * @since      3.0.7\n             * @apioption  plotOptions.line.linecap\n             */\n            /**\n             * Pixel width of the graph line.\n             *\n             * @see In styled mode, the line stroke-width can be set with the\n             *      `.highcharts-graph` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-linewidth-general/\n             *         On all series\n             * @sample {highcharts} highcharts/plotoptions/series-linewidth-specific/\n             *         On one single series\n             *\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            lineWidth: 2,\n            /**\n             * For some series, there is a limit that shuts down initial animation\n             * by default when the total number of points in the chart is too high.\n             * For example, for a column chart and its derivatives, animation does\n             * not run if there is more than 250 points totally. To disable this\n             * cap, set `animationLimit` to `Infinity`.\n             *\n             * @type      {number}\n             * @apioption plotOptions.series.animationLimit\n             */\n            /**\n             * Allow this series' points to be selected by clicking on the graphic\n             * (columns, point markers, pie slices, map areas etc).\n             *\n             * The selected points can be handled by point select and unselect\n             * events, or collectively by the [getSelectedPoints\n             * ](/class-reference/Highcharts.Chart#getSelectedPoints) function.\n             *\n             * And alternative way of selecting points is through dragging.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-allowpointselect-pie/\n             *         Pie\n             * @sample {highcharts} highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n             *         Map area\n             * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n             *         Map bubble\n             *\n             * @since 1.2.0\n             *\n             * @private\n             */\n            allowPointSelect: false,\n            /**\n             * When true, each point or column edge is rounded to its nearest pixel\n             * in order to render sharp on screen. In some cases, when there are a\n             * lot of densely packed columns, this leads to visible difference\n             * in column widths or distance between columns. In these cases,\n             * setting `crisp` to `false` may look better, even though each column\n             * is rendered blurry.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-crisp-false/\n             *         Crisp is false\n             *\n             * @since   5.0.10\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            crisp: true,\n            /**\n             * If true, a checkbox is displayed next to the legend item to allow\n             * selecting the series. The state of the checkbox is determined by\n             * the `selected` option.\n             *\n             * @productdesc {highmaps}\n             * Note that if a `colorAxis` is defined, the color axis is represented\n             * in the legend, not the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showcheckbox-true/\n             *         Show select box\n             *\n             * @since 1.2.0\n             *\n             * @private\n             */\n            showCheckbox: false,\n            /**\n             * Enable or disable the initial animation when a series is displayed.\n             * The animation can also be set as a configuration object. Please\n             * note that this option only applies to the initial animation of the\n             * series itself. For other animations, see [chart.animation](\n             * #chart.animation) and the animation parameter under the API methods.\n             * The following properties are supported:\n             *\n             * - `duration`: The duration of the animation in milliseconds.\n             *\n             * - `easing`: Can be a string reference to an easing function set on\n             *   the `Math` object or a function. See the _Custom easing function_\n             *   demo below.\n             *\n             * Due to poor performance, animation is disabled in old IE browsers\n             * for several chart types.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-animation-disabled/\n             *         Animation disabled\n             * @sample {highcharts} highcharts/plotoptions/series-animation-slower/\n             *         Slower animation\n             * @sample {highcharts} highcharts/plotoptions/series-animation-easing/\n             *         Custom easing function\n             * @sample {highstock} stock/plotoptions/animation-slower/\n             *         Slower animation\n             * @sample {highstock} stock/plotoptions/animation-easing/\n             *         Custom easing function\n             * @sample {highmaps} maps/plotoptions/series-animation-true/\n             *         Animation enabled on map series\n             * @sample {highmaps} maps/plotoptions/mapbubble-animation-false/\n             *         Disabled on mapbubble series\n             *\n             * @type    {boolean|Highcharts.AnimationOptionsObject}\n             * @default {highcharts} true\n             * @default {highstock} true\n             * @default {highmaps} false\n             *\n             * @private\n             */\n            animation: {\n                /** @internal */\n                duration: 1000\n            },\n            /**\n             * An additional class name to apply to the series' graphical elements.\n             * This option does not replace default class names of the graphical\n             * element.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption plotOptions.series.className\n             */\n            /**\n             * Disable this option to allow series rendering in the whole plotting\n             * area.\n             *\n             * **Note:** Clipping should be always enabled when\n             * [chart.zoomType](#chart.zoomType) is set\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-clip/\n             *         Disabled clipping\n             *\n             * @default   true\n             * @type      {boolean}\n             * @since     3.0.0\n             * @apioption plotOptions.series.clip\n             */\n            /**\n             * The main color of the series. In line type series it applies to the\n             * line and the point markers unless otherwise specified. In bar type\n             * series it applies to the bars unless a color is specified per point.\n             * The default value is pulled from the `options.colors` array.\n             *\n             * In styled mode, the color can be defined by the\n             * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n             * color can be set with the `.highcharts-series`,\n             * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n             * `.highcharts-series-{n}` class, or individual classes given by the\n             * `className` option.\n             *\n             * @productdesc {highmaps}\n             * In maps, the series color is rarely used, as most choropleth maps use\n             * the color to denote the value of each point. The series color can\n             * however be used in a map with multiple series holding categorized\n             * data.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-color-general/\n             *         General plot option\n             * @sample {highcharts} highcharts/plotoptions/series-color-specific/\n             *         One specific series\n             * @sample {highcharts} highcharts/plotoptions/series-color-area/\n             *         Area color\n             * @sample {highcharts} highcharts/series/infographic/\n             *         Pattern fill\n             * @sample {highmaps} maps/demo/category-map/\n             *         Category map by multiple series\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @apioption plotOptions.series.color\n             */\n            /**\n             * Styled mode only. A specific color index to use for the series, so\n             * its graphic representations are given the class name\n             * `highcharts-color-{n}`.\n             *\n             * @type      {number}\n             * @since     5.0.0\n             * @apioption plotOptions.series.colorIndex\n             */\n            /**\n             * Whether to connect a graph line across null points, or render a gap\n             * between the two points on either side of the null.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-connectnulls-false/\n             *         False by default\n             * @sample {highcharts} highcharts/plotoptions/series-connectnulls-true/\n             *         True\n             *\n             * @type      {boolean}\n             * @default   false\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.connectNulls\n             */\n            /**\n             * You can set the cursor to \"pointer\" if you have click events attached\n             * to the series, to signal to the user that the points and lines can\n             * be clicked.\n             *\n             * In styled mode, the series cursor can be set with the same classes\n             * as listed under [series.color](#plotOptions.series.color).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-line/\n             *         On line graph\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-column/\n             *         On columns\n             * @sample {highcharts} highcharts/plotoptions/series-cursor-scatter/\n             *         On scatter markers\n             * @sample {highstock} stock/plotoptions/cursor/\n             *         Pointer on a line graph\n             * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n             *         Map area\n             * @sample {highmaps} maps/plotoptions/mapbubble-allowpointselect/\n             *         Map bubble\n             *\n             * @type      {string|Highcharts.CursorValue}\n             * @apioption plotOptions.series.cursor\n             */\n            /**\n             * A reserved subspace to store options and values for customized\n             * functionality. Here you can add additional data for your own event\n             * callbacks and formatter callbacks.\n             *\n             * @sample {highcharts} highcharts/point/custom/\n             *         Point and series with custom data\n             *\n             * @type      {Highcharts.Dictionary<*>}\n             * @apioption plotOptions.series.custom\n             */\n            /**\n             * Name of the dash style to use for the graph, or for some series types\n             * the outline of each shape.\n             *\n             * In styled mode, the\n             * [stroke dash-array](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/series-dashstyle/)\n             * can be set with the same classes as listed under\n             * [series.color](#plotOptions.series.color).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highcharts} highcharts/plotoptions/series-dashstyle/\n             *         Chart suitable for printing in black and white\n             * @sample {highstock} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highmaps} highcharts/plotoptions/series-dashstyle-all/\n             *         Possible values demonstrated\n             * @sample {highmaps} maps/plotoptions/series-dashstyle/\n             *         Dotted borders on a map\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @default   Solid\n             * @since     2.1\n             * @apioption plotOptions.series.dashStyle\n             */\n            /**\n             * A description of the series to add to the screen reader information\n             * about the series.\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @requires  modules/accessibility\n             * @apioption plotOptions.series.description\n             */\n            /**\n             * Options for the series data sorting.\n             *\n             * @type      {Highcharts.DataSortingOptionsObject}\n             * @since     8.0.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.dataSorting\n             */\n            /**\n             * Enable or disable data sorting for the series. Use [xAxis.reversed](\n             * #xAxis.reversed) to change the sorting order.\n             *\n             * @sample {highcharts} highcharts/datasorting/animation/\n             *         Data sorting in scatter-3d\n             * @sample {highcharts} highcharts/datasorting/labels-animation/\n             *         Axis labels animation\n             * @sample {highcharts} highcharts/datasorting/dependent-sorting/\n             *         Dependent series sorting\n             * @sample {highcharts} highcharts/datasorting/independent-sorting/\n             *         Independent series sorting\n             *\n             * @type      {boolean}\n             * @since     8.0.0\n             * @apioption plotOptions.series.dataSorting.enabled\n             */\n            /**\n             * Whether to allow matching points by name in an update. If this option\n             * is disabled, points will be matched by order.\n             *\n             * @sample {highcharts} highcharts/datasorting/match-by-name/\n             *         Enabled match by name\n             *\n             * @type      {boolean}\n             * @since     8.0.0\n             * @apioption plotOptions.series.dataSorting.matchByName\n             */\n            /**\n             * Determines what data value should be used to sort by.\n             *\n             * @sample {highcharts} highcharts/datasorting/sort-key/\n             *         Sort key as `z` value\n             *\n             * @type      {string}\n             * @since     8.0.0\n             * @default   y\n             * @apioption plotOptions.series.dataSorting.sortKey\n             */\n            /**\n             * Enable or disable the mouse tracking for a specific series. This\n             * includes point tooltips and click events on graphs and points. For\n             * large datasets it improves performance.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-enablemousetracking-false/\n             *         No mouse tracking\n             * @sample {highmaps} maps/plotoptions/series-enablemousetracking-false/\n             *         No mouse tracking\n             *\n             * @type      {boolean}\n             * @default   true\n             * @apioption plotOptions.series.enableMouseTracking\n             */\n            /**\n             * Whether to use the Y extremes of the total chart width or only the\n             * zoomed area when zooming in on parts of the X axis. By default, the\n             * Y axis adjusts to the min and max of the visible data. Cartesian\n             * series only.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.6\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.getExtremesFromAll\n             */\n            /**\n             * An array specifying which option maps to which key in the data point\n             * array. This makes it convenient to work with unstructured data arrays\n             * from different sources.\n             *\n             * @see [series.data](#series.line.data)\n             *\n             * @sample {highcharts|highstock} highcharts/series/data-keys/\n             *         An extended data array with keys\n             * @sample {highcharts|highstock} highcharts/series/data-nested-keys/\n             *         Nested keys used to access object properties\n             *\n             * @type      {Array<string>}\n             * @since     4.1.6\n             * @apioption plotOptions.series.keys\n             */\n            /**\n             * The line cap used for line ends and line joins on the graph.\n             *\n             * @type       {Highcharts.SeriesLinecapValue}\n             * @default    round\n             * @product    highcharts highstock\n             * @apioption  plotOptions.series.linecap\n             */\n            /**\n             * The [id](#series.id) of another series to link to. Additionally,\n             * the value can be \":previous\" to link to the previous series. When\n             * two series are linked, only the first one appears in the legend.\n             * Toggling the visibility of this also toggles the linked series.\n             *\n             * If master series uses data sorting and linked series does not have\n             * its own sorting definition, the linked series will be sorted in the\n             * same order as the master one.\n             *\n             * @sample {highcharts|highstock} highcharts/demo/arearange-line/\n             *         Linked series\n             *\n             * @type      {string}\n             * @since     3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.linkedTo\n             */\n            /**\n             * Options for the corresponding navigator series if `showInNavigator`\n             * is `true` for this series. Available options are the same as any\n             * series, documented at [plotOptions](#plotOptions.series) and\n             * [series](#series).\n             *\n             * These options are merged with options in [navigator.series](\n             * #navigator.series), and will take precedence if the same option is\n             * defined both places.\n             *\n             * @see [navigator.series](#navigator.series)\n             *\n             * @type      {Highcharts.PlotSeriesOptions}\n             * @since     5.0.0\n             * @product   highstock\n             * @apioption plotOptions.series.navigatorOptions\n             */\n            /**\n             * The color for the parts of the graph or points that are below the\n             * [threshold](#plotOptions.series.threshold). Note that `zones` takes\n             * precedence over the negative color. Using `negativeColor` is\n             * equivalent to applying a zone with value of 0.\n             *\n             * @see In styled mode, a negative color is applied by setting this option\n             *      to `true` combined with the `.highcharts-negative` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highcharts} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             * @sample {highcharts} highcharts/css/series-negative-color/\n             *         Styled mode\n             * @sample {highstock} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highstock} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             * @sample {highmaps} highcharts/plotoptions/series-negative-color/\n             *         Spline, area and column\n             * @sample {highmaps} highcharts/plotoptions/arearange-negativecolor/\n             *         Arearange\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     3.0\n             * @apioption plotOptions.series.negativeColor\n             */\n            /**\n             * Same as\n             * [accessibility.pointDescriptionFormatter](#accessibility.pointDescriptionFormatter),\n             * but for an individual series. Overrides the chart wide configuration.\n             *\n             * @type      {Function}\n             * @since     5.0.12\n             * @apioption plotOptions.series.pointDescriptionFormatter\n             */\n            /**\n             * If no x values are given for the points in a series, `pointInterval`\n             * defines the interval of the x values. For example, if a series\n             * contains one value every decade starting from year 0, set\n             * `pointInterval` to `10`. In true `datetime` axes, the `pointInterval`\n             * is set in milliseconds.\n             *\n             * It can be also be combined with `pointIntervalUnit` to draw irregular\n             * time intervals.\n             *\n             * Please note that this options applies to the _series data_, not the\n             * interval of the axis ticks, which is independent.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n             *         Datetime X axis\n             * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n             *         Using pointStart and pointInterval\n             *\n             * @type      {number}\n             * @default   1\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointInterval\n             */\n            /**\n             * On datetime series, this allows for setting the\n             * [pointInterval](#plotOptions.series.pointInterval) to irregular time\n             * units, `day`, `month` and `year`. A day is usually the same as 24\n             * hours, but `pointIntervalUnit` also takes the DST crossover into\n             * consideration when dealing with local time. Combine this option with\n             * `pointInterval` to draw weeks, quarters, 6 months, 10 years etc.\n             *\n             * Please note that this options applies to the _series data_, not the\n             * interval of the axis ticks, which is independent.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointintervalunit/\n             *         One point a month\n             * @sample {highstock} highcharts/plotoptions/series-pointintervalunit/\n             *         One point a month\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts highstock gantt\n             * @validvalue [\"day\", \"month\", \"year\"]\n             * @apioption  plotOptions.series.pointIntervalUnit\n             */\n            /**\n             * Possible values: `\"on\"`, `\"between\"`, `number`.\n             *\n             * In a column chart, when pointPlacement is `\"on\"`, the point will not\n             * create any padding of the X axis. In a polar column chart this means\n             * that the first column points directly north. If the pointPlacement is\n             * `\"between\"`, the columns will be laid out between ticks. This is\n             * useful for example for visualising an amount between two points in\n             * time or in a certain sector of a polar chart.\n             *\n             * Since Highcharts 3.0.2, the point placement can also be numeric,\n             * where 0 is on the axis value, -0.5 is between this value and the\n             * previous, and 0.5 is between this value and the next. Unlike the\n             * textual options, numeric point placement options won't affect axis\n             * padding.\n             *\n             * Note that pointPlacement needs a [pointRange](\n             * #plotOptions.series.pointRange) to work. For column series this is\n             * computed, but for line-type series it needs to be set.\n             *\n             * For the `xrange` series type and gantt charts, if the Y axis is a\n             * category axis, the `pointPlacement` applies to the Y axis rather than\n             * the (typically datetime) X axis.\n             *\n             * Defaults to `undefined` in cartesian charts, `\"between\"` in polar\n             * charts.\n             *\n             * @see [xAxis.tickmarkPlacement](#xAxis.tickmarkPlacement)\n             *\n             * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-between/\n             *         Between in a column chart\n             * @sample {highcharts|highstock} highcharts/plotoptions/series-pointplacement-numeric/\n             *         Numeric placement for custom layout\n             * @sample {highcharts|highstock} maps/plotoptions/heatmap-pointplacement/\n             *         Placement in heatmap\n             *\n             * @type      {string|number}\n             * @since     2.3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointPlacement\n             */\n            /**\n             * If no x values are given for the points in a series, pointStart\n             * defines on what value to start. For example, if a series contains one\n             * yearly value starting from 1945, set pointStart to 1945.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-linear/\n             *         Linear\n             * @sample {highcharts} highcharts/plotoptions/series-pointstart-datetime/\n             *         Datetime\n             * @sample {highstock} stock/plotoptions/pointinterval-pointstart/\n             *         Using pointStart and pointInterval\n             *\n             * @type      {number}\n             * @default   0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.series.pointStart\n             */\n            /**\n             * Whether to select the series initially. If `showCheckbox` is true,\n             * the checkbox next to the series name in the legend will be checked\n             * for a selected series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-selected/\n             *         One out of two series selected\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     1.2.0\n             * @apioption plotOptions.series.selected\n             */\n            /**\n             * Whether to apply a drop shadow to the graph line. Since 2.3 the\n             * shadow can be an object configuration containing `color`, `offsetX`,\n             * `offsetY`, `opacity` and `width`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-shadow/\n             *         Shadow enabled\n             *\n             * @type      {boolean|Highcharts.ShadowOptionsObject}\n             * @default   false\n             * @apioption plotOptions.series.shadow\n             */\n            /**\n             * Whether to display this particular series or series type in the\n             * legend. Standalone series are shown in legend by default, and linked\n             * series are not. Since v7.2.0 it is possible to show series that use\n             * colorAxis by setting this option to `true`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n             *         One series in the legend, one hidden\n             *\n             * @type      {boolean}\n             * @apioption plotOptions.series.showInLegend\n             */\n            /**\n             * Whether or not to show the series in the navigator. Takes precedence\n             * over [navigator.baseSeries](#navigator.baseSeries) if defined.\n             *\n             * @type      {boolean}\n             * @since     5.0.0\n             * @product   highstock\n             * @apioption plotOptions.series.showInNavigator\n             */\n            /**\n             * If set to `true`, the accessibility module will skip past the points\n             * in this series for keyboard navigation.\n             *\n             * @type      {boolean}\n             * @since     5.0.12\n             * @apioption plotOptions.series.skipKeyboardNavigation\n             */\n            /**\n             * Whether to stack the values of each series on top of each other.\n             * Possible values are `undefined` to disable, `\"normal\"` to stack by\n             * value or `\"percent\"`.\n             *\n             * When stacking is enabled, data must be sorted\n             * in ascending X order.\n             *\n             * Some stacking options are related to specific series types. In the\n             * streamgraph series type, the stacking option is set to `\"stream\"`.\n             * The second one is `\"overlap\"`, which only applies to waterfall\n             * series.\n             *\n             * @see [yAxis.reversedStacks](#yAxis.reversedStacks)\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-bar/\n             *         Bar\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-area/\n             *         Area\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-line/\n             *         Line\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-column/\n             *         Column\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-bar/\n             *         Bar\n             * @sample {highcharts} highcharts/plotoptions/series-stacking-percent-area/\n             *         Area\n             * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-normal-stacking\n             *         Waterfall with normal stacking\n             * @sample {highcharts} highcharts/plotoptions/series-waterfall-with-overlap-stacking\n             *         Waterfall with overlap stacking\n             * @sample {highstock} stock/plotoptions/stacking/\n             *         Area\n             *\n             * @type       {string}\n             * @product    highcharts highstock\n             * @validvalue [\"normal\", \"overlap\", \"percent\", \"stream\"]\n             * @apioption  plotOptions.series.stacking\n             */\n            /**\n             * Whether to apply steps to the line. Possible values are `left`,\n             * `center` and `right`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/line-step/\n             *         Different step line options\n             * @sample {highcharts} highcharts/plotoptions/area-step/\n             *         Stepped, stacked area\n             * @sample {highstock} stock/plotoptions/line-step/\n             *         Step line\n             *\n             * @type       {string}\n             * @since      1.2.5\n             * @product    highcharts highstock\n             * @validvalue [\"left\", \"center\", \"right\"]\n             * @apioption  plotOptions.series.step\n             */\n            /**\n             * The threshold, also called zero level or base level. For line type\n             * series this is only used in conjunction with\n             * [negativeColor](#plotOptions.series.negativeColor).\n             *\n             * @see [softThreshold](#plotOptions.series.softThreshold).\n             *\n             * @type      {number}\n             * @default   0\n             * @since     3.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.threshold\n             */\n            /**\n             * Set the initial visibility of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-visible/\n             *         Two series, one hidden and one visible\n             * @sample {highstock} stock/plotoptions/series-visibility/\n             *         Hidden series\n             *\n             * @type      {boolean}\n             * @default   true\n             * @apioption plotOptions.series.visible\n             */\n            /**\n             * Defines the Axis on which the zones are applied.\n             *\n             * @see [zones](#plotOptions.series.zones)\n             *\n             * @sample {highcharts} highcharts/series/color-zones-zoneaxis-x/\n             *         Zones on the X-Axis\n             * @sample {highstock} highcharts/series/color-zones-zoneaxis-x/\n             *         Zones on the X-Axis\n             *\n             * @type      {string}\n             * @default   y\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zoneAxis\n             */\n            /**\n             * General event handlers for the series items. These event hooks can\n             * also be attached to the series at run time using the\n             * `Highcharts.addEvent` function.\n             *\n             * @declare Highcharts.SeriesEventsOptionsObject\n             *\n             * @private\n             */\n            events: {},\n            /**\n             * Fires after the series has finished its initial animation, or in case\n             * animation is disabled, immediately as the series is displayed.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-afteranimate/\n             *         Show label after animate\n             * @sample {highstock} highcharts/plotoptions/series-events-afteranimate/\n             *         Show label after animate\n             *\n             * @type      {Highcharts.SeriesAfterAnimateCallbackFunction}\n             * @since     4.0\n             * @product   highcharts highstock gantt\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.afterAnimate\n             */\n            /**\n             * Fires when the checkbox next to the series' name in the legend is\n             * clicked. One parameter, `event`, is passed to the function. The state\n             * of the checkbox is found by `event.checked`. The checked item is\n             * found by `event.item`. Return `false` to prevent the default action\n             * which is to toggle the select state of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n             *         Alert checkbox status\n             *\n             * @type      {Highcharts.SeriesCheckboxClickCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.checkboxClick\n             */\n            /**\n             * Fires when the series is clicked. One parameter, `event`, is passed\n             * to the function, containing common event information. Additionally,\n             * `event.point` holds a pointer to the nearest point on the graph.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-click/\n             *         Alert click info\n             * @sample {highstock} stock/plotoptions/series-events-click/\n             *         Alert click info\n             * @sample {highmaps} maps/plotoptions/series-events-click/\n             *         Display click info in subtitle\n             *\n             * @type      {Highcharts.SeriesClickCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.click\n             */\n            /**\n             * Fires when the series is hidden after chart generation time, either\n             * by clicking the legend item or by calling `.hide()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-hide/\n             *         Alert when the series is hidden by clicking the legend item\n             *\n             * @type      {Highcharts.SeriesHideCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.hide\n             */\n            /**\n             * Fires when the legend item belonging to the series is clicked. One\n             * parameter, `event`, is passed to the function. The default action\n             * is to toggle the visibility of the series. This can be prevented\n             * by returning `false` or calling `event.preventDefault()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-legenditemclick/\n             *         Confirm hiding and showing\n             *\n             * @type      {Highcharts.SeriesLegendItemClickCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.legendItemClick\n             */\n            /**\n             * Fires when the mouse leaves the graph. One parameter, `event`, is\n             * passed to the function, containing common event information. If the\n             * [stickyTracking](#plotOptions.series) option is true, `mouseOut`\n             * doesn't happen before the mouse enters another graph or leaves the\n             * plot area.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n             *         With sticky tracking by default\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n             *         Without sticky tracking\n             *\n             * @type      {Highcharts.SeriesMouseOutCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.mouseOut\n             */\n            /**\n             * Fires when the mouse enters the graph. One parameter, `event`, is\n             * passed to the function, containing common event information.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-sticky/\n             *         With sticky tracking by default\n             * @sample {highcharts} highcharts/plotoptions/series-events-mouseover-no-sticky/\n             *         Without sticky tracking\n             *\n             * @type      {Highcharts.SeriesMouseOverCallbackFunction}\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.mouseOver\n             */\n            /**\n             * Fires when the series is shown after chart generation time, either\n             * by clicking the legend item or by calling `.show()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-show/\n             *         Alert when the series is shown by clicking the legend item.\n             *\n             * @type      {Highcharts.SeriesShowCallbackFunction}\n             * @since     1.2.0\n             * @context   Highcharts.Series\n             * @apioption plotOptions.series.events.show\n             */\n            /**\n             * Options for the point markers of line-like series. Properties like\n             * `fillColor`, `lineColor` and `lineWidth` define the visual appearance\n             * of the markers. Other series types, like column series, don't have\n             * markers, but have visual options on the series level instead.\n             *\n             * In styled mode, the markers can be styled with the\n             * `.highcharts-point`, `.highcharts-point-hover` and\n             * `.highcharts-point-select` class names.\n             *\n             * @declare Highcharts.PointMarkerOptionsObject\n             *\n             * @private\n             */\n            marker: {\n                /**\n                 * Enable or disable the point marker. If `undefined`, the markers\n                 * are hidden when the data is dense, and shown for more widespread\n                 * data points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-enabled/\n                 *         Disabled markers\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-enabled-false/\n                 *         Disabled in normal state but enabled on hover\n                 * @sample {highstock} stock/plotoptions/series-marker/\n                 *         Enabled markers\n                 *\n                 * @type      {boolean}\n                 * @default   {highcharts} undefined\n                 * @default   {highstock} false\n                 * @apioption plotOptions.series.marker.enabled\n                 */\n                /**\n                 * The threshold for how dense the point markers should be before\n                 * they are hidden, given that `enabled` is not defined. The number\n                 * indicates the horizontal distance between the two closest points\n                 * in the series, as multiples of the `marker.radius`. In other\n                 * words, the default value of 2 means points are hidden if\n                 * overlapping horizontally.\n                 *\n                 * @sample highcharts/plotoptions/series-marker-enabledthreshold\n                 *         A higher threshold\n                 *\n                 * @since 6.0.5\n                 */\n                enabledThreshold: 2,\n                /**\n                 * The fill color of the point marker. When `undefined`, the series'\n                 * or point's color is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         White fill\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.marker.fillColor\n                 */\n                /**\n                 * Image markers only. Set the image width explicitly. When using\n                 * this option, a `width` must also be set.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 *\n                 * @type      {number}\n                 * @since     4.0.4\n                 * @apioption plotOptions.series.marker.height\n                 */\n                /**\n                 * The color of the point marker's outline. When `undefined`, the\n                 * series' or point's color is used.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         Inherit from series color (undefined)\n                 *\n                 * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 */\n                lineColor: '#ffffff',\n                /**\n                 * The width of the point marker's outline.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-fillcolor/\n                 *         2px blue marker\n                 */\n                lineWidth: 0,\n                /**\n                 * The radius of the point marker.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-radius/\n                 *         Bigger markers\n                 *\n                 * @default {highstock} 2\n                 */\n                radius: 4,\n                /**\n                 * A predefined shape or symbol for the marker. When undefined, the\n                 * symbol is pulled from options.symbols. Other possible values are\n                 * `'circle'`, `'square'`,`'diamond'`, `'triangle'` and\n                 * `'triangle-down'`.\n                 *\n                 * Additionally, the URL to a graphic can be given on this form:\n                 * `'url(graphic.png)'`. Note that for the image to be applied to\n                 * exported charts, its URL needs to be accessible by the export\n                 * server.\n                 *\n                 * Custom callbacks for symbol path generation can also be added to\n                 * `Highcharts.SVGRenderer.prototype.symbols`. The callback is then\n                 * used by its method name, as shown in the demo.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-symbol/\n                 *         Predefined, graphic and custom markers\n                 * @sample {highstock} highcharts/plotoptions/series-marker-symbol/\n                 *         Predefined, graphic and custom markers\n                 *\n                 * @type      {string}\n                 * @apioption plotOptions.series.marker.symbol\n                 */\n                /**\n                 * Image markers only. Set the image width explicitly. When using\n                 * this option, a `height` must also be set.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 * @sample {highstock} highcharts/plotoptions/series-marker-width-height/\n                 *         Fixed width and height\n                 *\n                 * @type      {number}\n                 * @since     4.0.4\n                 * @apioption plotOptions.series.marker.width\n                 */\n                /**\n                 * States for a single point marker.\n                 *\n                 * @declare Highcharts.PointStatesOptionsObject\n                 */\n                states: {\n                    /**\n                     * The normal state of a single point marker. Currently only\n                     * used for setting animation when returning to normal state\n                     * from hover.\n                     *\n                     * @declare Highcharts.PointStatesNormalOptionsObject\n                     */\n                    normal: {\n                        /**\n                         * Animation when returning to normal state after hovering.\n                         *\n                         * @type {boolean|Highcharts.AnimationOptionsObject}\n                         */\n                        animation: true\n                    },\n                    /**\n                     * The hover state for a single point marker.\n                     *\n                     * @declare Highcharts.PointStatesHoverOptionsObject\n                     */\n                    hover: {\n                        /**\n                         * Animation when hovering over the marker.\n                         *\n                         * @type {boolean|Highcharts.AnimationOptionsObject}\n                         */\n                        animation: {\n                            /** @internal */\n                            duration: 50\n                        },\n                        /**\n                         * Enable or disable the point marker.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-enabled/\n                         *         Disabled hover state\n                         */\n                        enabled: true,\n                        /**\n                         * The fill color of the marker in hover state. When\n                         * `undefined`, the series' or point's fillColor for normal\n                         * state is used.\n                         *\n                         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         * @apioption plotOptions.series.marker.states.hover.fillColor\n                         */\n                        /**\n                         * The color of the point marker's outline. When\n                         * `undefined`, the series' or point's lineColor for normal\n                         * state is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linecolor/\n                         *         White fill color, black line color\n                         *\n                         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         * @apioption plotOptions.series.marker.states.hover.lineColor\n                         */\n                        /**\n                         * The width of the point marker's outline. When\n                         * `undefined`, the series' or point's lineWidth for normal\n                         * state is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-linewidth/\n                         *         3px line width\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.hover.lineWidth\n                         */\n                        /**\n                         * The radius of the point marker. In hover state, it\n                         * defaults to the normal state's radius + 2 as per the\n                         * [radiusPlus](#plotOptions.series.marker.states.hover.radiusPlus)\n                         * option.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-hover-radius/\n                         *         10px radius\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.hover.radius\n                         */\n                        /**\n                         * The number of pixels to increase the radius of the\n                         * hovered point.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         5 pixels greater radius on hover\n                         * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         5 pixels greater radius on hover\n                         *\n                         * @since 4.0.3\n                         */\n                        radiusPlus: 2,\n                        /**\n                         * The additional line width for a hovered point.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         2 pixels wider on hover\n                         * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                         *         2 pixels wider on hover\n                         *\n                         * @since 4.0.3\n                         */\n                        lineWidthPlus: 1\n                    },\n                    /**\n                     * The appearance of the point marker when selected. In order to\n                     * allow a point to be selected, set the\n                     * `series.allowPointSelect` option to true.\n                     *\n                     * @declare Highcharts.PointStatesSelectOptionsObject\n                     */\n                    select: {\n                        /**\n                         * Enable or disable visible feedback for selection.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-enabled/\n                         *         Disabled select state\n                         *\n                         * @type      {boolean}\n                         * @default   true\n                         * @apioption plotOptions.series.marker.states.select.enabled\n                         */\n                        /**\n                         * The radius of the point marker. In hover state, it\n                         * defaults to the normal state's radius + 2.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-radius/\n                         *         10px radius for selected points\n                         *\n                         * @type      {number}\n                         * @apioption plotOptions.series.marker.states.select.radius\n                         */\n                        /**\n                         * The fill color of the point marker.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-fillcolor/\n                         *         Solid red discs for selected points\n                         *\n                         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         */\n                        fillColor: '#cccccc',\n                        /**\n                         * The color of the point marker's outline. When\n                         * `undefined`, the series' or point's color is used.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linecolor/\n                         *         Red line color for selected points\n                         *\n                         * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                         */\n                        lineColor: '#000000',\n                        /**\n                         * The width of the point marker's outline.\n                         *\n                         * @sample {highcharts} highcharts/plotoptions/series-marker-states-select-linewidth/\n                         *         3px line width for selected points\n                         */\n                        lineWidth: 2\n                    }\n                }\n            },\n            /**\n             * Properties for each single point.\n             *\n             * @declare Highcharts.PlotSeriesPointOptions\n             *\n             * @private\n             */\n            point: {\n                /**\n                 * Fires when a point is clicked. One parameter, `event`, is passed\n                 * to the function, containing common event information.\n                 *\n                 * If the `series.allowPointSelect` option is true, the default\n                 * action for the point's click event is to toggle the point's\n                 * select state. Returning `false` cancels this action.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click/\n                 *         Click marker to alert values\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click-column/\n                 *         Click column\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-click-url/\n                 *         Go to URL\n                 * @sample {highmaps} maps/plotoptions/series-point-events-click/\n                 *         Click marker to display values\n                 * @sample {highmaps} maps/plotoptions/series-point-events-click-url/\n                 *         Go to URL\n                 *\n                 * @type      {Highcharts.PointClickCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.click\n                 */\n                /**\n                 * Fires when the mouse leaves the area close to the point. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Show values in the chart's corner on mouse over\n                 *\n                 * @type      {Highcharts.PointMouseOutCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.mouseOut\n                 */\n                /**\n                 * Fires when the mouse enters the area close to the point. One\n                 * parameter, `event`, is passed to the function, containing common\n                 * event information.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-mouseover/\n                 *         Show values in the chart's corner on mouse over\n                 *\n                 * @type      {Highcharts.PointMouseOverCallbackFunction}\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.mouseOver\n                 */\n                /**\n                 * Fires when the point is removed using the `.remove()` method. One\n                 * parameter, `event`, is passed to the function. Returning `false`\n                 * cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-remove/\n                 *         Remove point and confirm\n                 *\n                 * @type      {Highcharts.PointRemoveCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.remove\n                 */\n                /**\n                 * Fires when the point is selected either programmatically or\n                 * following a click on the point. One parameter, `event`, is passed\n                 * to the function. Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-select/\n                 *         Report the last selected point\n                 * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n                 *         Report select and unselect\n                 *\n                 * @type      {Highcharts.PointSelectCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.select\n                 */\n                /**\n                 * Fires when the point is unselected either programmatically or\n                 * following a click on the point. One parameter, `event`, is passed\n                 * to the function.\n                 *  Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-unselect/\n                 *         Report the last unselected point\n                 * @sample {highmaps} maps/plotoptions/series-allowpointselect/\n                 *         Report select and unselect\n                 *\n                 * @type      {Highcharts.PointUnselectCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.unselect\n                 */\n                /**\n                 * Fires when the point is updated programmatically through the\n                 * `.update()` method. One parameter, `event`, is passed to the\n                 * function. The new point options can be accessed through\n                 * `event.options`. Returning `false` cancels the operation.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-point-events-update/\n                 *         Confirm point updating\n                 *\n                 * @type      {Highcharts.PointUpdateCallbackFunction}\n                 * @since     1.2.0\n                 * @context   Highcharts.Point\n                 * @apioption plotOptions.series.point.events.update\n                 */\n                /**\n                 * Events for each single point.\n                 *\n                 * @declare Highcharts.PointEventsOptionsObject\n                 */\n                events: {}\n            },\n            /**\n             * Options for the series data labels, appearing next to each data\n             * point.\n             *\n             * Since v6.2.0, multiple data labels can be applied to each single\n             * point by defining them as an array of configs.\n             *\n             * In styled mode, the data labels can be styled with the\n             * `.highcharts-data-label-box` and `.highcharts-data-label` class names\n             * ([see example](https://www.highcharts.com/samples/highcharts/css/series-datalabels)).\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled\n             *         Data labels enabled\n             * @sample {highcharts} highcharts/plotoptions/series-datalabels-multiple\n             *         Multiple data labels on a bar series\n             * @sample {highcharts} highcharts/css/series-datalabels\n             *         Style mode example\n             *\n             * @type    {*|Array<*>}\n             * @product highcharts highstock highmaps gantt\n             *\n             * @private\n             */\n            dataLabels: {\n                /**\n                 * The alignment of the data label compared to the point. If\n                 * `right`, the right side of the label should be touching the\n                 * point. For points with an extent, like columns, the alignments\n                 * also dictates how to align it inside the box, as given with the\n                 * [inside](#plotOptions.column.dataLabels.inside)\n                 * option. Can be one of `left`, `center` or `right`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-align-left/\n                 *         Left aligned\n                 * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n                 *         Data labels inside the bar\n                 *\n                 * @type {Highcharts.AlignValue|null}\n                 */\n                align: 'center',\n                /**\n                 * Whether to allow data labels to overlap. To make the labels less\n                 * sensitive for overlapping, the\n                 * [dataLabels.padding](#plotOptions.series.dataLabels.padding)\n                 * can be set to 0.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-allowoverlap-false/\n                 *         Don't allow overlap\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @since     4.1.0\n                 * @apioption plotOptions.series.dataLabels.allowOverlap\n                 */\n                /**\n                 * The background color or gradient for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.backgroundColor\n                 */\n                /**\n                 * The border color for the data label. Defaults to `undefined`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderColor\n                 */\n                /**\n                 * The border radius in pixels for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderRadius\n                 */\n                /**\n                 * The border width in pixels for the data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.borderWidth\n                 */\n                /**\n                 * A class name for the data label. Particularly in styled mode,\n                 * this can be used to give each series' or point's data label\n                 * unique styling. In addition to this option, a default color class\n                 * name is added so that we can give the labels a contrast text\n                 * shadow.\n                 *\n                 * @sample {highcharts} highcharts/css/data-label-contrast/\n                 *         Contrast text shadow\n                 * @sample {highcharts} highcharts/css/series-datalabels/\n                 *         Styling by CSS\n                 *\n                 * @type      {string}\n                 * @since     5.0.0\n                 * @apioption plotOptions.series.dataLabels.className\n                 */\n                /**\n                 * The text color for the data labels. Defaults to `undefined`. For\n                 * certain series types, like column or map, the data labels can be\n                 * drawn inside the points. In this case the data label will be\n                 * drawn with maximum contrast by default. Additionally, it will be\n                 * given a `text-outline` style with the opposite color, to further\n                 * increase the contrast. This can be overridden by setting the\n                 * `text-outline` style to `none` in the `dataLabels.style` option.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-color/\n                 *         Red data labels\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         White data labels\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @apioption plotOptions.series.dataLabels.color\n                 */\n                /**\n                 * Whether to hide data labels that are outside the plot area. By\n                 * default, the data label is moved inside the plot area according\n                 * to the\n                 * [overflow](#plotOptions.series.dataLabels.overflow)\n                 * option.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.3.3\n                 * @apioption plotOptions.series.dataLabels.crop\n                 */\n                /**\n                 * Whether to defer displaying the data labels until the initial\n                 * series animation has finished.\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     4.0.0\n                 * @product   highcharts highstock gantt\n                 * @apioption plotOptions.series.dataLabels.defer\n                 */\n                /**\n                 * Enable or disable the data labels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-enabled/\n                 *         Data labels enabled\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         Data labels enabled\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption plotOptions.series.dataLabels.enabled\n                 */\n                /**\n                 * A declarative filter to control of which data labels to display.\n                 * The declarative filter is designed for use when callback\n                 * functions are not available, like when the chart options require\n                 * a pure JSON structure or for use with graphical editors. For\n                 * programmatic control, use the `formatter` instead, and return\n                 * `undefined` to disable a single data label.\n                 *\n                 * @example\n                 * filter: {\n                 *     property: 'percentage',\n                 *     operator: '>',\n                 *     value: 4\n                 * }\n                 *\n                 * @sample {highcharts} highcharts/demo/pie-monochrome\n                 *         Data labels filtered by percentage\n                 *\n                 * @declare   Highcharts.DataLabelsFilterOptionsObject\n                 * @since     6.0.3\n                 * @apioption plotOptions.series.dataLabels.filter\n                 */\n                /**\n                 * The operator to compare by. Can be one of `>`, `<`, `>=`, `<=`,\n                 * `==`, and `===`.\n                 *\n                 * @type       {string}\n                 * @validvalue [\">\", \"<\", \">=\", \"<=\", \"==\", \"===\"]\n                 * @apioption  plotOptions.series.dataLabels.filter.operator\n                 */\n                /**\n                 * The point property to filter by. Point options are passed\n                 * directly to properties, additionally there are `y` value,\n                 * `percentage` and others listed under {@link Highcharts.Point}\n                 * members.\n                 *\n                 * @type      {string}\n                 * @apioption plotOptions.series.dataLabels.filter.property\n                 */\n                /**\n                 * The value to compare against.\n                 *\n                 * @type      {number}\n                 * @apioption plotOptions.series.dataLabels.filter.value\n                 */\n                /**\n                 * A\n                 * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n                 * for the data label. Available variables are the same as for\n                 * `formatter`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Add a unit\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n                 *         Formatted value in the data label\n                 *\n                 * @type      {string}\n                 * @default   y\n                 * @default   point.value\n                 * @since     3.0\n                 * @apioption plotOptions.series.dataLabels.format\n                 */\n                // eslint-disable-next-line valid-jsdoc\n                /**\n                 * Callback JavaScript function to format the data label. Note that\n                 * if a `format` is defined, the format takes precedence and the\n                 * formatter is ignored.\n                 *\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-format/\n                 *         Formatted value\n                 *\n                 * @type {Highcharts.DataLabelsFormatterCallbackFunction}\n                 */\n                formatter: function () {\n                    var numberFormatter = this.series.chart.numberFormatter;\n                    return typeof this.y !== 'number' ? '' : numberFormatter(this.y, -1);\n                },\n                /**\n                 * For points with an extent, like columns or map areas, whether to\n                 * align the data label inside the box or to the actual value point.\n                 * Defaults to `false` in most cases, `true` in stacked columns.\n                 *\n                 * @type      {boolean}\n                 * @since     3.0\n                 * @apioption plotOptions.series.dataLabels.inside\n                 */\n                /**\n                 * Format for points with the value of null. Works analogously to\n                 * [format](#plotOptions.series.dataLabels.format). `nullFormat` can\n                 * be applied only to series which support displaying null points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {boolean|string}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.nullFormat\n                 */\n                /**\n                 * Callback JavaScript function that defines formatting for points\n                 * with the value of null. Works analogously to\n                 * [formatter](#plotOptions.series.dataLabels.formatter).\n                 * `nullPointFormatter` can be applied only to series which support\n                 * displaying null points.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-format/\n                 *         Format data label and tooltip for null point.\n                 *\n                 * @type      {Highcharts.DataLabelsFormatterCallbackFunction}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.nullFormatter\n                 */\n                /**\n                 * How to handle data labels that flow outside the plot area. The\n                 * default is `\"justify\"`, which aligns them inside the plot area.\n                 * For columns and bars, this means it will be moved inside the bar.\n                 * To display data labels outside the plot area, set `crop` to\n                 * `false` and `overflow` to `\"allow\"`.\n                 *\n                 * @type       {Highcharts.DataLabelsOverflowValue}\n                 * @default    justify\n                 * @since      3.0.6\n                 * @apioption  plotOptions.series.dataLabels.overflow\n                 */\n                /**\n                 * When either the `borderWidth` or the `backgroundColor` is set,\n                 * this is the padding within the box.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 * @sample {highmaps} maps/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @since 2.2.1\n                 */\n                padding: 5,\n                /**\n                 * Aligns data labels relative to points. If `center` alignment is\n                 * not possible, it defaults to `right`.\n                 *\n                 * @type      {Highcharts.AlignValue}\n                 * @default   center\n                 * @apioption plotOptions.series.dataLabels.position\n                 */\n                /**\n                 * Text rotation in degrees. Note that due to a more complex\n                 * structure, backgrounds, borders and padding will be lost on a\n                 * rotated data label.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical labels\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @apioption plotOptions.series.dataLabels.rotation\n                 */\n                /**\n                 * The shadow of the box. Works best with `borderWidth` or\n                 * `backgroundColor`. Since 2.3 the shadow can be an object\n                 * configuration containing `color`, `offsetX`, `offsetY`, `opacity`\n                 * and `width`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-box/\n                 *         Data labels box options\n                 *\n                 * @type      {boolean|Highcharts.ShadowOptionsObject}\n                 * @default   false\n                 * @since     2.2.1\n                 * @apioption plotOptions.series.dataLabels.shadow\n                 */\n                /**\n                 * The name of a symbol to use for the border around the label.\n                 * Symbols are predefined functions on the Renderer object.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-shape/\n                 *         A callout for annotations\n                 *\n                 * @type      {string}\n                 * @default   square\n                 * @since     4.1.2\n                 * @apioption plotOptions.series.dataLabels.shape\n                 */\n                /**\n                 * Styles for the label. The default `color` setting is\n                 * `\"contrast\"`, which is a pseudo color that Highcharts picks up\n                 * and applies the maximum contrast to the underlying point item,\n                 * for example the bar in a bar chart.\n                 *\n                 * The `textOutline` is a pseudo property that applies an outline of\n                 * the given width with the given color, which by default is the\n                 * maximum contrast to the text. So a bright text color will result\n                 * in a black text outline for maximum readability on a mixed\n                 * background. In some cases, especially with grayscale text, the\n                 * text outline doesn't work well, in which cases it can be disabled\n                 * by setting it to `\"none\"`. When `useHTML` is true, the\n                 * `textOutline` will not be picked up. In this, case, the same\n                 * effect can be acheived through the `text-shadow` CSS property.\n                 *\n                 * For some series types, where each point has an extent, like for\n                 * example tree maps, the data label may overflow the point. There\n                 * are two strategies for handling overflow. By default, the text\n                 * will wrap to multiple lines. The other strategy is to set\n                 * `style.textOverflow` to `ellipsis`, which will keep the text on\n                 * one line plus it will break inside long words.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-style/\n                 *         Bold labels\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow/\n                 *         Long labels truncated with an ellipsis in a pie\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap/\n                 *         Long labels are wrapped in a pie\n                 * @sample {highmaps} maps/demo/color-axis/\n                 *         Bold labels\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @since     4.1.0\n                 * @apioption plotOptions.series.dataLabels.style\n                 */\n                style: {\n                    /** @internal */\n                    fontSize: '11px',\n                    /** @internal */\n                    fontWeight: 'bold',\n                    /** @internal */\n                    color: 'contrast',\n                    /** @internal */\n                    textOutline: '1px contrast'\n                },\n                /**\n                 * Options for a label text which should follow marker's shape.\n                 * Border and background are disabled for a label that follows a\n                 * path.\n                 *\n                 * **Note:** Only SVG-based renderer supports this option. Setting\n                 * `useHTML` to true will disable this option.\n                 *\n                 * @declare   Highcharts.DataLabelsTextPathOptionsObject\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath\n                 */\n                /**\n                 * Presentation attributes for the text path.\n                 *\n                 * @type      {Highcharts.SVGAttributes}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath.attributes\n                 */\n                /**\n                 * Enable or disable `textPath` option for link's or marker's data\n                 * labels.\n                 *\n                 * @type      {boolean}\n                 * @since     7.1.0\n                 * @apioption plotOptions.series.dataLabels.textPath.enabled\n                 */\n                /**\n                 * Whether to\n                 * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)\n                 * to render the labels.\n                 *\n                 * @type      {boolean}\n                 * @default   false\n                 * @apioption plotOptions.series.dataLabels.useHTML\n                 */\n                /**\n                 * The vertical alignment of a data label. Can be one of `top`,\n                 * `middle` or `bottom`. The default value depends on the data, for\n                 * instance in a column chart, the label is above positive values\n                 * and below negative values.\n                 *\n                 * @type  {Highcharts.VerticalAlignValue|null}\n                 * @since 2.3.3\n                 */\n                verticalAlign: 'bottom',\n                /**\n                 * The x position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical and positioned\n                 * @sample {highcharts} highcharts/plotoptions/bar-datalabels-align-inside-bar/\n                 *         Data labels inside the bar\n                 */\n                x: 0,\n                /**\n                 * The Z index of the data labels. The default Z index puts it above\n                 * the series. Use a Z index of 2 to display it behind the series.\n                 *\n                 * @type      {number}\n                 * @default   6\n                 * @since     2.3.5\n                 * @apioption plotOptions.series.dataLabels.z\n                 */\n                /**\n                 * The y position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/series-datalabels-rotation/\n                 *         Vertical and positioned\n                 */\n                y: 0\n            },\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, even if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @since   2.2\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            cropThreshold: 300,\n            /**\n             * Opacity of a series parts: line, fill (e.g. area) and dataLabels.\n             *\n             * @see [states.inactive.opacity](#plotOptions.series.states.inactive.opacity)\n             *\n             * @since 7.1.0\n             *\n             * @private\n             */\n            opacity: 1,\n            /**\n             * The width of each point on the x axis. For example in a column chart\n             * with one value each day, the pointRange would be 1 day (= 24 * 3600\n             * * 1000 milliseconds). This is normally computed automatically, but\n             * this option can be used to override the automatic value.\n             *\n             * @product highstock\n             *\n             * @private\n             */\n            pointRange: 0,\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            softThreshold: true,\n            /**\n             * @declare Highcharts.SeriesStatesOptionsObject\n             *\n             * @private\n             */\n            states: {\n                /**\n                 * The normal state of a series, or for point items in column, pie\n                 * and similar series. Currently only used for setting animation\n                 * when returning to normal state from hover.\n                 *\n                 * @declare Highcharts.SeriesStatesNormalOptionsObject\n                 */\n                normal: {\n                    /**\n                     * Animation when returning to normal state after hovering.\n                     *\n                     * @type {boolean|Highcharts.AnimationOptionsObject}\n                     */\n                    animation: true\n                },\n                /**\n                 * Options for the hovered series. These settings override the\n                 * normal state options when a series is moused over or touched.\n                 *\n                 * @declare Highcharts.SeriesStatesHoverOptionsObject\n                 */\n                hover: {\n                    /**\n                     * Enable separate styles for the hovered series to visualize\n                     * that the user hovers either the series itself or the legend.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled/\n                     *         Line\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-column/\n                     *         Column\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-enabled-pie/\n                     *         Pie\n                     *\n                     * @type      {boolean}\n                     * @default   true\n                     * @since     1.2\n                     * @apioption plotOptions.series.states.hover.enabled\n                     */\n                    /**\n                     * Animation setting for hovering the graph in line-type series.\n                     *\n                     * @type    {boolean|Highcharts.AnimationOptionsObject}\n                     * @since   5.0.8\n                     * @product highcharts highstock\n                     */\n                    animation: {\n                        /**\n                         * The duration of the hover animation in milliseconds. By\n                         * default the hover state animates quickly in, and slowly\n                         * back to normal.\n                         *\n                         * @internal\n                         */\n                        duration: 50\n                    },\n                    /**\n                     * Pixel width of the graph line. By default this property is\n                     * undefined, and the `lineWidthPlus` property dictates how much\n                     * to increase the linewidth from normal state.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidth/\n                     *         5px line on hover\n                     *\n                     * @type      {number}\n                     * @product   highcharts highstock\n                     * @apioption plotOptions.series.states.hover.lineWidth\n                     */\n                    /**\n                     * The additional line width for the graph of a hovered series.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/series-states-hover-linewidthplus/\n                     *         5 pixels wider\n                     * @sample {highstock} highcharts/plotoptions/series-states-hover-linewidthplus/\n                     *         5 pixels wider\n                     *\n                     * @since   4.0.3\n                     * @product highcharts highstock\n                     */\n                    lineWidthPlus: 1,\n                    /**\n                     * In Highcharts 1.0, the appearance of all markers belonging\n                     * to the hovered series. For settings on the hover state of the\n                     * individual point, see\n                     * [marker.states.hover](#plotOptions.series.marker.states.hover).\n                     *\n                     * @deprecated\n                     *\n                     * @extends   plotOptions.series.marker\n                     * @excluding states\n                     * @product   highcharts highstock\n                     */\n                    marker: {\n                    // lineWidth: base + 1,\n                    // radius: base + 1\n                    },\n                    /**\n                     * Options for the halo appearing around the hovered point in\n                     * line-type series as well as outside the hovered slice in pie\n                     * charts. By default the halo is filled by the current point or\n                     * series color with an opacity of 0.25\\. The halo can be\n                     * disabled by setting the `halo` option to `null`.\n                     *\n                     * In styled mode, the halo is styled with the\n                     * `.highcharts-halo` class, with colors inherited from\n                     * `.highcharts-color-{n}`.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/halo/\n                     *         Halo options\n                     * @sample {highstock} highcharts/plotoptions/halo/\n                     *         Halo options\n                     *\n                     * @declare Highcharts.SeriesStatesHoverHaloOptionsObject\n                     * @type    {null|*}\n                     * @since   4.0\n                     * @product highcharts highstock\n                     */\n                    halo: {\n                        /**\n                         * A collection of SVG attributes to override the appearance\n                         * of the halo, for example `fill`, `stroke` and\n                         * `stroke-width`.\n                         *\n                         * @type      {Highcharts.SVGAttributes}\n                         * @since     4.0\n                         * @product   highcharts highstock\n                         * @apioption plotOptions.series.states.hover.halo.attributes\n                         */\n                        /**\n                         * The pixel size of the halo. For point markers this is the\n                         * radius of the halo. For pie slices it is the width of the\n                         * halo outside the slice. For bubbles it defaults to 5 and\n                         * is the width of the halo outside the bubble.\n                         *\n                         * @since   4.0\n                         * @product highcharts highstock\n                         */\n                        size: 10,\n                        /**\n                         * Opacity for the halo unless a specific fill is overridden\n                         * using the `attributes` setting. Note that Highcharts is\n                         * only able to apply opacity to colors of hex or rgb(a)\n                         * formats.\n                         *\n                         * @since   4.0\n                         * @product highcharts highstock\n                         */\n                        opacity: 0.25\n                    }\n                },\n                /**\n                 * Specific options for point in selected states, after being\n                 * selected by\n                 * [allowPointSelect](#plotOptions.series.allowPointSelect)\n                 * or programmatically.\n                 *\n                 * @sample maps/plotoptions/series-allowpointselect/\n                 *         Allow point select demo\n                 *\n                 * @declare   Highcharts.SeriesStatesSelectOptionsObject\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding brightness\n                 */\n                select: {\n                    animation: {\n                        /** @internal */\n                        duration: 0\n                    }\n                },\n                /**\n                 * The opposite state of a hover for series.\n                 *\n                 * @sample highcharts/plotoptions/series-states-inactive-disabled\n                 *         Disabled inactive state\n                 *\n                 * @declare Highcharts.SeriesStatesInactiveOptionsObject\n                 */\n                inactive: {\n                    /**\n                     * Enable or disable the inactive state for a series\n                     *\n                     * @sample highcharts/plotoptions/series-states-inactive-disabled\n                     *         Disabled inactive state\n                     *\n                     * @type {boolean}\n                     * @default true\n                     * @apioption plotOptions.series.states.inactive.enabled\n                     */\n                    /**\n                     * The animation for entering the inactive state.\n                     *\n                     * @type {boolean|Highcharts.AnimationOptionsObject}\n                     */\n                    animation: {\n                        /** @internal */\n                        duration: 50\n                    },\n                    /**\n                     * Opacity of series elements (dataLabels, line, area).\n                     *\n                     * @type {number}\n                     */\n                    opacity: 0.2\n                }\n            },\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event on a\n             * series isn't triggered until the mouse moves over another series, or\n             * out of the plot area. When false, the `mouseOut` event on a series is\n             * triggered when the mouse leaves the area around the series' graph or\n             * markers. This also implies the tooltip when not shared. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series. Defaults to true\n             * for line and area type series, but to false for columns, pies etc.\n             *\n             * **Note:** The boost module will force this option because of\n             * technical limitations.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-stickytracking-true/\n             *         True by default\n             * @sample {highcharts} highcharts/plotoptions/series-stickytracking-false/\n             *         False\n             *\n             * @default {highcharts} true\n             * @default {highstock} true\n             * @default {highmaps} false\n             * @since   2.0\n             *\n             * @private\n             */\n            stickyTracking: true,\n            /**\n             * A configuration object for the tooltip rendering of each single\n             * series. Properties are inherited from [tooltip](#tooltip), but only\n             * the following properties can be defined on a series level.\n             *\n             * @declare   Highcharts.SeriesTooltipOptionsObject\n             * @since     2.3\n             * @extends   tooltip\n             * @excluding animation, backgroundColor, borderColor, borderRadius,\n             *            borderWidth, className, crosshairs, enabled, formatter,\n             *            headerShape, hideDelay, outside, padding, positioner,\n             *            shadow, shape, shared, snap, split, style, useHTML\n             * @apioption plotOptions.series.tooltip\n             */\n            /**\n             * When a series contains a data array that is longer than this, only\n             * one dimensional arrays of numbers, or two dimensional arrays with\n             * x and y values are allowed. Also, only the first point is tested,\n             * and the rest are assumed to be the same format. This saves expensive\n             * data checking and indexing in long series. Set it to `0` disable.\n             *\n             * Note:\n             * In boost mode turbo threshold is forced. Only array of numbers or\n             * two dimensional arrays are allowed.\n             *\n             * @since   2.2\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            turboThreshold: 1000,\n            /**\n             * An array defining zones within a series. Zones can be applied to the\n             * X axis, Y axis or Z axis for bubbles, according to the `zoneAxis`\n             * option. The zone definitions have to be in ascending order regarding\n             * to the value.\n             *\n             * In styled mode, the color zones are styled with the\n             * `.highcharts-zone-{n}` class, or custom classed from the `className`\n             * option\n             * ([view live demo](https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/color-zones/)).\n             *\n             * @see [zoneAxis](#plotOptions.series.zoneAxis)\n             *\n             * @sample {highcharts} highcharts/series/color-zones-simple/\n             *         Color zones\n             * @sample {highstock} highcharts/series/color-zones-simple/\n             *         Color zones\n             *\n             * @declare   Highcharts.SeriesZonesOptionsObject\n             * @type      {Array<*>}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones\n             */\n            /**\n             * Styled mode only. A custom class name for the zone.\n             *\n             * @sample highcharts/css/color-zones/\n             *         Zones styled by class name\n             *\n             * @type      {string}\n             * @since     5.0.0\n             * @apioption plotOptions.series.zones.className\n             */\n            /**\n             * Defines the color of the series.\n             *\n             * @see [series color](#plotOptions.series.color)\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.color\n             */\n            /**\n             * A name for the dash style to use for the graph.\n             *\n             * @see [plotOptions.series.dashStyle](#plotOptions.series.dashStyle)\n             *\n             * @sample {highcharts|highstock} highcharts/series/color-zones-dashstyle-dot/\n             *         Dashed line indicates prognosis\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.dashStyle\n             */\n            /**\n             * Defines the fill color for the series (in area type series)\n             *\n             * @see [fillColor](#plotOptions.area.fillColor)\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.fillColor\n             */\n            /**\n             * The value up to where the zone extends, if undefined the zones\n             * stretches to the last value in the series.\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts highstock\n             * @apioption plotOptions.series.zones.value\n             */\n            /**\n             * When using dual or multiple color axes, this number defines which\n             * colorAxis the particular series is connected to. It refers to\n             * either the\n             * {@link #colorAxis.id|axis id}\n             * or the index of the axis in the colorAxis array, with 0 being the\n             * first. Set this option to false to prevent a series from connecting\n             * to the default color axis.\n             *\n             * Since v7.2.0 the option can also be an axis id or an axis index\n             * instead of a boolean flag.\n             *\n             * @sample highcharts/coloraxis/coloraxis-with-pie/\n             *         Color axis with pie series\n             * @sample highcharts/coloraxis/multiple-coloraxis/\n             *         Multiple color axis\n             *\n             * @type      {number|string|boolean}\n             * @default   0\n             * @product   highcharts highstock highmaps\n             * @apioption plotOptions.series.colorAxis\n             */\n            /**\n             * Determines what data value should be used to calculate point color\n             * if `colorAxis` is used. Requires to set `min` and `max` if some\n             * custom point property is used or if approximation for data grouping\n             * is set to `'sum'`.\n             *\n             * @sample highcharts/coloraxis/custom-color-key/\n             *         Custom color key\n             * @sample highcharts/coloraxis/changed-default-color-key/\n             *         Changed default color key\n             *\n             * @type      {string}\n             * @default   y\n             * @since     7.2.0\n             * @product   highcharts highstock highmaps\n             * @apioption plotOptions.series.colorKey\n             */\n            /**\n             * Determines whether the series should look for the nearest point\n             * in both dimensions or just the x-dimension when hovering the series.\n             * Defaults to `'xy'` for scatter series and `'x'` for most other\n             * series. If the data has duplicate x-values, it is recommended to\n             * set this to `'xy'` to allow hovering over all points.\n             *\n             * Applies only to series types using nearest neighbor search (not\n             * direct hover) for tooltip.\n             *\n             * @sample {highcharts} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             * @sample {highstock} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             * @sample {highmaps} highcharts/series/findnearestpointby/\n             *         Different hover behaviors\n             *\n             * @since      5.0.10\n             * @validvalue [\"x\", \"xy\"]\n             *\n             * @private\n             */\n            findNearestPointBy: 'x'\n        }, \n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /** @lends Highcharts.Series.prototype */\n        {\n            axisTypes: ['xAxis', 'yAxis'],\n            coll: 'series',\n            colorCounter: 0,\n            cropShoulder: 1,\n            directTouch: false,\n            eventsToUnbind: [],\n            isCartesian: true,\n            // each point's x and y values are stored in this.xData and this.yData\n            parallelArrays: ['x', 'y'],\n            pointClass: Point,\n            requireSorting: true,\n            sorted: true,\n            init: function (chart, options) {\n                fireEvent(this, 'init', { options: options });\n                var series = this,\n                    events,\n                    chartSeries = chart.series,\n                    lastSeries;\n                // A lookup over those events that are added by _options_ (not\n                // programmatically). These are updated through Series.update()\n                // (#10861).\n                this.eventOptions = this.eventOptions || {};\n                /**\n                 * Read only. The chart that the series belongs to.\n                 *\n                 * @name Highcharts.Series#chart\n                 * @type {Highcharts.Chart}\n                 */\n                series.chart = chart;\n                /**\n                 * Read only. The series' type, like \"line\", \"area\", \"column\" etc.\n                 * The type in the series options anc can be altered using\n                 * {@link Series#update}.\n                 *\n                 * @name Highcharts.Series#type\n                 * @type {string}\n                 */\n                /**\n                 * Read only. The series' current options. To update, use\n                 * {@link Series#update}.\n                 *\n                 * @name Highcharts.Series#options\n                 * @type {Highcharts.SeriesOptionsType}\n                 */\n                series.options = options = series.setOptions(options);\n                series.linkedSeries = [];\n                // bind the axes\n                series.bindAxes();\n                // set some variables\n                extend(series, {\n                    /**\n                     * The series name as given in the options. Defaults to\n                     * \"Series {n}\".\n                     *\n                     * @name Highcharts.Series#name\n                     * @type {string}\n                     */\n                    name: options.name,\n                    state: '',\n                    /**\n                     * Read only. The series' visibility state as set by {@link\n                     * Series#show}, {@link Series#hide}, or in the initial\n                     * configuration.\n                     *\n                     * @name Highcharts.Series#visible\n                     * @type {boolean}\n                     */\n                    visible: options.visible !== false,\n                    /**\n                     * Read only. The series' selected state as set by {@link\n                     * Highcharts.Series#select}.\n                     *\n                     * @name Highcharts.Series#selected\n                     * @type {boolean}\n                     */\n                    selected: options.selected === true // false by default\n                });\n                // Register event listeners\n                events = options.events;\n                objectEach(events, function (event, eventType) {\n                    if (isFunction(event)) {\n                        // If event does not exist, or is changed by Series.update\n                        if (series.eventOptions[eventType] !== event) {\n                            // Remove existing if set by option\n                            if (isFunction(series.eventOptions[eventType])) {\n                                removeEvent(series, eventType, series.eventOptions[eventType]);\n                            }\n                            series.eventOptions[eventType] = event;\n                            addEvent(series, eventType, event);\n                        }\n                    }\n                });\n                if ((events && events.click) ||\n                    (options.point &&\n                        options.point.events &&\n                        options.point.events.click) ||\n                    options.allowPointSelect) {\n                    chart.runTrackerClick = true;\n                }\n                series.getColor();\n                series.getSymbol();\n                // Initialize the parallel data arrays\n                series.parallelArrays.forEach(function (key) {\n                    if (!series[key + 'Data']) {\n                        series[key + 'Data'] = [];\n                    }\n                });\n                // Mark cartesian\n                if (series.isCartesian) {\n                    chart.hasCartesianSeries = true;\n                }\n                // Get the index and register the series in the chart. The index is\n                // one more than the current latest series index (#5960).\n                if (chartSeries.length) {\n                    lastSeries = chartSeries[chartSeries.length - 1];\n                }\n                series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n                series.opacity = series.options.opacity;\n                // Insert the series and re-order all series above the insertion\n                // point.\n                chart.orderSeries(this.insert(chartSeries));\n                // Set options for series with sorting and set data later.\n                if (options.dataSorting && options.dataSorting.enabled) {\n                    series.setDataSortingOptions();\n                }\n                else if (!series.points && !series.data) {\n                    series.setData(options.data, false);\n                }\n                fireEvent(this, 'afterInit');\n            },\n            /**\n             * Check whether the series item is itself or inherits from a certain\n             * series type.\n             *\n             * @function Highcharts.Series#is\n             * @param {string} type The type of series to check for, can be either\n             *        featured or custom series types. For example `column`, `pie`,\n             *        `ohlc` etc.\n             *\n             * @return {boolean}\n             *        True if this item is or inherits from the given type.\n             */\n            is: function (type) {\n                return seriesTypes[type] && this instanceof seriesTypes[type];\n            },\n            /**\n             * Insert the series in a collection with other series, either the chart\n             * series or yAxis series, in the correct order according to the index\n             * option. Used internally when adding series.\n             *\n             * @private\n             * @function Highcharts.Series#insert\n             * @param {Array<Highcharts.Series>} collection\n             *        A collection of series, like `chart.series` or `xAxis.series`.\n             * @return {number}\n             *         The index of the series in the collection.\n             */\n            insert: function (collection) {\n                var indexOption = this.options.index,\n                    i;\n                // Insert by index option\n                if (isNumber(indexOption)) {\n                    i = collection.length;\n                    while (i--) {\n                        // Loop down until the interted element has higher index\n                        if (indexOption >=\n                            pick(collection[i].options.index, collection[i]._i)) {\n                            collection.splice(i + 1, 0, this);\n                            break;\n                        }\n                    }\n                    if (i === -1) {\n                        collection.unshift(this);\n                    }\n                    i = i + 1;\n                    // Or just push it to the end\n                }\n                else {\n                    collection.push(this);\n                }\n                return pick(i, collection.length - 1);\n            },\n            /**\n             * Set the xAxis and yAxis properties of cartesian series, and register\n             * the series in the `axis.series` array.\n             *\n             * @private\n             * @function Highcharts.Series#bindAxes\n             * @return {void}\n             * @exception 18\n             */\n            bindAxes: function () {\n                var series = this,\n                    seriesOptions = series.options,\n                    chart = series.chart,\n                    axisOptions;\n                fireEvent(this, 'bindAxes', null, function () {\n                    // repeat for xAxis and yAxis\n                    (series.axisTypes || []).forEach(function (AXIS) {\n                        // loop through the chart's axis objects\n                        chart[AXIS].forEach(function (axis) {\n                            axisOptions = axis.options;\n                            // apply if the series xAxis or yAxis option mathches\n                            // the number of the axis, or if undefined, use the\n                            // first axis\n                            if (seriesOptions[AXIS] ===\n                                axisOptions.index ||\n                                (typeof seriesOptions[AXIS] !==\n                                    'undefined' &&\n                                    seriesOptions[AXIS] === axisOptions.id) ||\n                                (typeof seriesOptions[AXIS] ===\n                                    'undefined' &&\n                                    axisOptions.index === 0)) {\n                                // register this series in the axis.series lookup\n                                series.insert(axis.series);\n                                // set this series.xAxis or series.yAxis reference\n                                /**\n                                 * Read only. The unique xAxis object associated\n                                 * with the series.\n                                 *\n                                 * @name Highcharts.Series#xAxis\n                                 * @type {Highcharts.Axis}\n                                 */\n                                /**\n                                 * Read only. The unique yAxis object associated\n                                 * with the series.\n                                 *\n                                 * @name Highcharts.Series#yAxis\n                                 * @type {Highcharts.Axis}\n                                 */\n                                series[AXIS] = axis;\n                                // mark dirty for redraw\n                                axis.isDirty = true;\n                            }\n                        });\n                        // The series needs an X and an Y axis\n                        if (!series[AXIS] &&\n                            series.optionalAxis !== AXIS) {\n                            error(18, true, chart);\n                        }\n                    });\n                });\n                fireEvent(this, 'afterBindAxes');\n            },\n            /**\n             * For simple series types like line and column, the data values are\n             * held in arrays like xData and yData for quick lookup to find extremes\n             * and more. For multidimensional series like bubble and map, this can\n             * be extended with arrays like zData and valueData by adding to the\n             * `series.parallelArrays` array.\n             *\n             * @private\n             * @function Highcharts.Series#updateParallelArrays\n             * @param {Highcharts.Point} point\n             * @param {number|string} i\n             * @return {void}\n             */\n            updateParallelArrays: function (point, i) {\n                var series = point.series,\n                    args = arguments,\n                    fn = isNumber(i) ?\n                        // Insert the value in the given position\n                        function (key) {\n                            var val = key === 'y' && series.toYData ?\n                                series.toYData(point) :\n                                point[key];\n                        series[key + 'Data'][i] = val;\n                    } :\n                    // Apply the method specified in i with the following\n                    // arguments as arguments\n                    function (key) {\n                        Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));\n                    };\n                series.parallelArrays.forEach(fn);\n            },\n            /**\n             * Define hasData functions for series. These return true if there\n             * are data points on this series within the plot area.\n             *\n             * @private\n             * @function Highcharts.Series#hasData\n             * @return {boolean}\n             */\n            hasData: function () {\n                return ((this.visible &&\n                    typeof this.dataMax !== 'undefined' &&\n                    typeof this.dataMin !== 'undefined') || ( // #3703\n                this.visible &&\n                    this.yData &&\n                    this.yData.length > 0) // #9758\n                );\n            },\n            /**\n             * Return an auto incremented x value based on the pointStart and\n             * pointInterval options. This is only used if an x value is not given\n             * for the point that calls autoIncrement.\n             *\n             * @private\n             * @function Highcharts.Series#autoIncrement\n             * @return {number}\n             */\n            autoIncrement: function () {\n                var options = this.options,\n                    xIncrement = this.xIncrement,\n                    date,\n                    pointInterval,\n                    pointIntervalUnit = options.pointIntervalUnit,\n                    time = this.chart.time;\n                xIncrement = pick(xIncrement, options.pointStart, 0);\n                this.pointInterval = pointInterval = pick(this.pointInterval, options.pointInterval, 1);\n                // Added code for pointInterval strings\n                if (pointIntervalUnit) {\n                    date = new time.Date(xIncrement);\n                    if (pointIntervalUnit === 'day') {\n                        time.set('Date', date, time.get('Date', date) + pointInterval);\n                    }\n                    else if (pointIntervalUnit === 'month') {\n                        time.set('Month', date, time.get('Month', date) + pointInterval);\n                    }\n                    else if (pointIntervalUnit === 'year') {\n                        time.set('FullYear', date, time.get('FullYear', date) + pointInterval);\n                    }\n                    pointInterval = date.getTime() - xIncrement;\n                }\n                this.xIncrement = xIncrement + pointInterval;\n                return xIncrement;\n            },\n            /**\n             * Internal function to set properties for series if data sorting is\n             * enabled.\n             *\n             * @private\n             * @function Highcharts.Series#setDataSortingOptions\n             * @return {void}\n             */\n            setDataSortingOptions: function () {\n                var options = this.options;\n                extend(this, {\n                    requireSorting: false,\n                    sorted: false,\n                    enabledDataSorting: true,\n                    allowDG: false\n                });\n                // To allow unsorted data for column series.\n                if (!defined(options.pointRange)) {\n                    options.pointRange = 1;\n                }\n            },\n            /**\n             * Set the series options by merging from the options tree. Called\n             * internally on initializing and updating series. This function will\n             * not redraw the series. For API usage, use {@link Series#update}.\n             * @private\n             * @function Highcharts.Series#setOptions\n             * @param {Highcharts.SeriesOptionsType} itemOptions\n             *        The series options.\n             * @return {Highcharts.SeriesOptionsType}\n             * @fires Highcharts.Series#event:afterSetOptions\n             */\n            setOptions: function (itemOptions) {\n                var chart = this.chart,\n                    chartOptions = chart.options,\n                    plotOptions = chartOptions.plotOptions,\n                    userOptions = chart.userOptions || {},\n                    seriesUserOptions = merge(itemOptions),\n                    options,\n                    zones,\n                    zone,\n                    styledMode = chart.styledMode,\n                    e = {\n                        plotOptions: plotOptions,\n                        userOptions: seriesUserOptions\n                    };\n                fireEvent(this, 'setOptions', e);\n                // These may be modified by the event\n                var typeOptions = e.plotOptions[this.type],\n                    userPlotOptions = (userOptions.plotOptions || {});\n                // use copy to prevent undetected changes (#9762)\n                /**\n                 * Contains series options by the user without defaults.\n                 * @name Highcharts.Series#userOptions\n                 * @type {Highcharts.SeriesOptionsType}\n                 */\n                this.userOptions = e.userOptions;\n                options = merge(typeOptions, plotOptions.series, \n                // #3881, chart instance plotOptions[type] should trump\n                // plotOptions.series\n                userOptions.plotOptions &&\n                    userOptions.plotOptions[this.type], seriesUserOptions);\n                // The tooltip options are merged between global and series specific\n                // options. Importance order asscendingly:\n                // globals: (1)tooltip, (2)plotOptions.series,\n                // (3)plotOptions[this.type]\n                // init userOptions with possible later updates: 4-6 like 1-3 and\n                // (7)this series options\n                this.tooltipOptions = merge(defaultOptions.tooltip, // 1\n                defaultOptions.plotOptions.series &&\n                    defaultOptions.plotOptions.series.tooltip, // 2\n                defaultOptions.plotOptions[this.type].tooltip, // 3\n                chartOptions.tooltip.userOptions, // 4\n                plotOptions.series &&\n                    plotOptions.series.tooltip, // 5\n                plotOptions[this.type].tooltip, // 6\n                seriesUserOptions.tooltip // 7\n                );\n                // When shared tooltip, stickyTracking is true by default,\n                // unless user says otherwise.\n                this.stickyTracking = pick(seriesUserOptions.stickyTracking, userPlotOptions[this.type] &&\n                    userPlotOptions[this.type].stickyTracking, userPlotOptions.series && userPlotOptions.series.stickyTracking, (this.tooltipOptions.shared && !this.noSharedTooltip ?\n                    true :\n                    options.stickyTracking));\n                // Delete marker object if not allowed (#1125)\n                if (typeOptions.marker === null) {\n                    delete options.marker;\n                }\n                // Handle color zones\n                this.zoneAxis = options.zoneAxis;\n                zones = this.zones = (options.zones || []).slice();\n                if ((options.negativeColor || options.negativeFillColor) &&\n                    !options.zones) {\n                    zone = {\n                        value: options[this.zoneAxis + 'Threshold'] ||\n                            options.threshold ||\n                            0,\n                        className: 'highcharts-negative'\n                    };\n                    if (!styledMode) {\n                        zone.color = options.negativeColor;\n                        zone.fillColor = options.negativeFillColor;\n                    }\n                    zones.push(zone);\n                }\n                if (zones.length) { // Push one extra zone for the rest\n                    if (defined(zones[zones.length - 1].value)) {\n                        zones.push(styledMode ? {} : {\n                            color: this.color,\n                            fillColor: this.fillColor\n                        });\n                    }\n                }\n                fireEvent(this, 'afterSetOptions', { options: options });\n                return options;\n            },\n            /**\n             * Return series name in \"Series {Number}\" format or the one defined by\n             * a user. This method can be simply overridden as series name format\n             * can vary (e.g. technical indicators).\n             *\n             * @function Highcharts.Series#getName\n             * @return {string}\n             *         The series name.\n             */\n            getName: function () {\n                // #4119\n                return pick(this.options.name, 'Series ' + (this.index + 1));\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#getCyclic\n             * @param {string} prop\n             * @param {*} [value]\n             * @param {Highcharts.Dictionary<any>} [defaults]\n             * @return {void}\n             */\n            getCyclic: function (prop, value, defaults) {\n                var i, chart = this.chart, userOptions = this.userOptions, indexName = prop + 'Index', counterName = prop + 'Counter', len = defaults ? defaults.length : pick(chart.options.chart[prop + 'Count'], chart[prop + 'Count']), setting;\n                if (!value) {\n                    // Pick up either the colorIndex option, or the _colorIndex\n                    // after Series.update()\n                    setting = pick(userOptions[indexName], userOptions['_' + indexName]);\n                    if (defined(setting)) { // after Series.update()\n                        i = setting;\n                    }\n                    else {\n                        // #6138\n                        if (!chart.series.length) {\n                            chart[counterName] = 0;\n                        }\n                        userOptions['_' + indexName] = i =\n                            chart[counterName] % len;\n                        chart[counterName] += 1;\n                    }\n                    if (defaults) {\n                        value = defaults[i];\n                    }\n                }\n                // Set the colorIndex\n                if (typeof i !== 'undefined') {\n                    this[indexName] = i;\n                }\n                this[prop] = value;\n            },\n            /**\n             * Get the series' color based on either the options or pulled from\n             * global options.\n             *\n             * @private\n             * @function Highcharts.Series#getColor\n             * @return {void}\n             */\n            getColor: function () {\n                if (this.chart.styledMode) {\n                    this.getCyclic('color');\n                }\n                else if (this.options.colorByPoint) {\n                    // #4359, selected slice got series.color even when colorByPoint\n                    // was set.\n                    this.options.color = null;\n                }\n                else {\n                    this.getCyclic('color', this.options.color ||\n                        defaultOptions.plotOptions[this.type].color, this.chart.options.colors);\n                }\n            },\n            /**\n             * Get all points' instances created for this series.\n             *\n             * @private\n             * @function Highcharts.Series#getPointsCollection\n             * @return {Array<Highcharts.Point>}\n             */\n            getPointsCollection: function () {\n                return (this.hasGroupedData ? this.points : this.data) || [];\n            },\n            /**\n             * Get the series' symbol based on either the options or pulled from\n             * global options.\n             *\n             * @private\n             * @function Highcharts.Series#getSymbol\n             * @return {void}\n             */\n            getSymbol: function () {\n                var seriesMarkerOption = this.options.marker;\n                this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);\n            },\n            /**\n             * Finds the index of an existing point that matches the given point\n             * options.\n             *\n             * @private\n             * @function Highcharts.Series#findPointIndex\n             * @param    {Highcharts.PointOptionsObject} optionsObject\n             *           The options of the point.\n             * @param    {number} fromIndex\n             *           The index to start searching from, used for optimizing\n             *           series with required sorting.\n             * @returns  {number|undefined}\n             *           Returns the index of a matching point, or undefined if no\n             *           match is found.\n             */\n            findPointIndex: function (optionsObject, fromIndex) {\n                var id = optionsObject.id,\n                    x = optionsObject.x,\n                    oldData = this.points,\n                    matchingPoint,\n                    matchedById,\n                    pointIndex,\n                    matchKey,\n                    dataSorting = this.options.dataSorting;\n                if (id) {\n                    matchingPoint = this.chart.get(id);\n                }\n                else if (this.linkedParent || this.enabledDataSorting) {\n                    matchKey = (dataSorting && dataSorting.matchByName) ?\n                        'name' : 'index';\n                    matchingPoint = find(oldData, function (oldPoint) {\n                        return !oldPoint.touched && oldPoint[matchKey] ===\n                            optionsObject[matchKey];\n                    });\n                    // Add unmatched point as a new point\n                    if (!matchingPoint) {\n                        return void 0;\n                    }\n                }\n                if (matchingPoint) {\n                    pointIndex = matchingPoint && matchingPoint.index;\n                    if (typeof pointIndex !== 'undefined') {\n                        matchedById = true;\n                    }\n                }\n                // Search for the same X in the existing data set\n                if (typeof pointIndex === 'undefined' && isNumber(x)) {\n                    pointIndex = this.xData.indexOf(x, fromIndex);\n                }\n                // Reduce pointIndex if data is cropped\n                if (pointIndex !== -1 &&\n                    typeof pointIndex !== 'undefined' &&\n                    this.cropped) {\n                    pointIndex = (pointIndex >= this.cropStart) ?\n                        pointIndex - this.cropStart : pointIndex;\n                }\n                if (!matchedById &&\n                    oldData[pointIndex] && oldData[pointIndex].touched) {\n                    pointIndex = void 0;\n                }\n                return pointIndex;\n            },\n            /**\n             * @private\n             * @borrows LegendSymbolMixin.drawLineMarker as Highcharts.Series#drawLegendSymbol\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n            /**\n             * Internal function called from setData. If the point count is the same\n             * as is was, or if there are overlapping X values, just run\n             * Point.update which is cheaper, allows animation, and keeps references\n             * to points. This also allows adding or removing points if the X-es\n             * don't match.\n             *\n             * @private\n             * @function Highcharts.Series#updateData\n             *\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *\n             * @return {boolean}\n             */\n            updateData: function (data, animation) {\n                var options = this.options,\n                    dataSorting = options.dataSorting,\n                    oldData = this.points,\n                    pointsToAdd = [],\n                    hasUpdatedByKey,\n                    i,\n                    point,\n                    lastIndex,\n                    requireSorting = this.requireSorting,\n                    equalLength = data.length === oldData.length,\n                    succeeded = true;\n                this.xIncrement = null;\n                // Iterate the new data\n                data.forEach(function (pointOptions, i) {\n                    var id,\n                        x,\n                        pointIndex,\n                        optionsObject = (defined(pointOptions) &&\n                            this.pointClass.prototype.optionsToObject.call({ series: this },\n                        pointOptions)) || {};\n                    // Get the x of the new data point\n                    x = optionsObject.x;\n                    id = optionsObject.id;\n                    if (id || isNumber(x)) {\n                        pointIndex = this.findPointIndex(optionsObject, lastIndex);\n                        // Matching X not found\n                        // or used already due to ununique x values (#8995),\n                        // add point (but later)\n                        if (pointIndex === -1 ||\n                            typeof pointIndex === 'undefined') {\n                            pointsToAdd.push(pointOptions);\n                            // Matching X found, update\n                        }\n                        else if (oldData[pointIndex] &&\n                            pointOptions !== options.data[pointIndex]) {\n                            oldData[pointIndex].update(pointOptions, false, null, false);\n                            // Mark it touched, below we will remove all points that\n                            // are not touched.\n                            oldData[pointIndex].touched = true;\n                            // Speed optimize by only searching after last known\n                            // index. Performs ~20% bettor on large data sets.\n                            if (requireSorting) {\n                                lastIndex = pointIndex + 1;\n                            }\n                            // Point exists, no changes, don't remove it\n                        }\n                        else if (oldData[pointIndex]) {\n                            oldData[pointIndex].touched = true;\n                        }\n                        // If the length is equal and some of the nodes had a\n                        // match in the same position, we don't want to remove\n                        // non-matches.\n                        if (!equalLength ||\n                            i !== pointIndex ||\n                            (dataSorting && dataSorting.enabled) ||\n                            this.hasDerivedData) {\n                            hasUpdatedByKey = true;\n                        }\n                    }\n                    else {\n                        // Gather all points that are not matched\n                        pointsToAdd.push(pointOptions);\n                    }\n                }, this);\n                // Remove points that don't exist in the updated data set\n                if (hasUpdatedByKey) {\n                    i = oldData.length;\n                    while (i--) {\n                        point = oldData[i];\n                        if (point && !point.touched && point.remove) {\n                            point.remove(false, animation);\n                        }\n                    }\n                    // If we did not find keys (ids or x-values), and the length is the\n                    // same, update one-to-one\n                }\n                else if (equalLength && (!dataSorting || !dataSorting.enabled)) {\n                    data.forEach(function (point, i) {\n                        // .update doesn't exist on a linked, hidden series (#3709)\n                        // (#10187)\n                        if (oldData[i].update && point !== oldData[i].y) {\n                            oldData[i].update(point, false, null, false);\n                        }\n                    });\n                    // Don't add new points since those configs are used above\n                    pointsToAdd.length = 0;\n                    // Did not succeed in updating data\n                }\n                else {\n                    succeeded = false;\n                }\n                oldData.forEach(function (point) {\n                    if (point) {\n                        point.touched = false;\n                    }\n                });\n                if (!succeeded) {\n                    return false;\n                }\n                // Add new points\n                pointsToAdd.forEach(function (point) {\n                    this.addPoint(point, false, null, null, false);\n                }, this);\n                if (this.xIncrement === null &&\n                    this.xData &&\n                    this.xData.length) {\n                    this.xIncrement = arrayMax(this.xData);\n                    this.autoIncrement();\n                }\n                return true;\n            },\n            /**\n             * Apply a new set of data to the series and optionally redraw it. The\n             * new data array is passed by reference (except in case of\n             * `updatePoints`), and may later be mutated when updating the chart\n             * data.\n             *\n             * Note the difference in behaviour when setting the same amount of\n             * points, or a different amount of points, as handled by the\n             * `updatePoints` parameter.\n             *\n             * @sample highcharts/members/series-setdata/\n             *         Set new data from a button\n             * @sample highcharts/members/series-setdata-pie/\n             *         Set data in a pie\n             * @sample stock/members/series-setdata/\n             *         Set new data in Highstock\n             * @sample maps/members/series-setdata/\n             *         Set new data in Highmaps\n             *\n             * @function Highcharts.Series#setData\n             *\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Takes an array of data in the same format as described under\n             *        `series.{type}.data` for the given series type, for example a\n             *        line series would take data in the form described under\n             *        [series.line.data](https://api.highcharts.com/highcharts/series.line.data).\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the series is altered. If\n             *        doing more operations on the chart, it is a good idea to set\n             *        redraw to false and call {@link Chart#redraw} after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        When the updated data is the same length as the existing data,\n             *        points will be updated by default, and animation visualizes\n             *        how the points are changed. Set false to disable animation, or\n             *        a configuration object to set duration or easing.\n             *\n             * @param {boolean} [updatePoints=true]\n             *        When this is true, points will be updated instead of replaced\n             *        whenever possible. This occurs a) when the updated data is the\n             *        same length as the existing data, b) when points are matched\n             *        by their id's, or c) when points can be matched by X values.\n             *        This allows updating with animation and performs better. In\n             *        this case, the original array is not passed by reference. Set\n             *        `false` to prevent.\n             *\n             * @return {void}\n             */\n            setData: function (data, redraw, animation, updatePoints) {\n                var series = this,\n                    oldData = series.points,\n                    oldDataLength = (oldData && oldData.length) || 0,\n                    dataLength,\n                    options = series.options,\n                    chart = series.chart,\n                    dataSorting = options.dataSorting,\n                    firstPoint = null,\n                    xAxis = series.xAxis,\n                    i,\n                    turboThreshold = options.turboThreshold,\n                    pt,\n                    xData = this.xData,\n                    yData = this.yData,\n                    pointArrayMap = series.pointArrayMap,\n                    valueCount = pointArrayMap && pointArrayMap.length,\n                    keys = options.keys,\n                    indexOfX = 0,\n                    indexOfY = 1,\n                    updatedData;\n                data = data || [];\n                dataLength = data.length;\n                redraw = pick(redraw, true);\n                if (dataSorting && dataSorting.enabled) {\n                    data = this.sortData(data);\n                }\n                // First try to run Point.update which is cheaper, allows animation,\n                // and keeps references to points.\n                if (updatePoints !== false &&\n                    dataLength &&\n                    oldDataLength &&\n                    !series.cropped &&\n                    !series.hasGroupedData &&\n                    series.visible &&\n                    // Soft updating has no benefit in boost, and causes JS error\n                    // (#8355)\n                    !series.isSeriesBoosting) {\n                    updatedData = this.updateData(data, animation);\n                }\n                if (!updatedData) {\n                    // Reset properties\n                    series.xIncrement = null;\n                    series.colorCounter = 0; // for series with colorByPoint (#1547)\n                    // Update parallel arrays\n                    this.parallelArrays.forEach(function (key) {\n                        series[key + 'Data'].length = 0;\n                    });\n                    // In turbo mode, only one- or twodimensional arrays of numbers\n                    // are allowed. The first value is tested, and we assume that\n                    // all the rest are defined the same way. Although the 'for'\n                    // loops are similar, they are repeated inside each if-else\n                    // conditional for max performance.\n                    if (turboThreshold && dataLength > turboThreshold) {\n                        firstPoint = series.getFirstValidPoint(data);\n                        if (isNumber(firstPoint)) { // assume all points are numbers\n                            for (i = 0; i < dataLength; i++) {\n                                xData[i] = this.autoIncrement();\n                                yData[i] = data[i];\n                            }\n                            // Assume all points are arrays when first point is\n                        }\n                        else if (isArray(firstPoint)) {\n                            if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[0];\n                                    yData[i] =\n                                        pt.slice(1, valueCount + 1);\n                                }\n                            }\n                            else { // [x, y]\n                                if (keys) {\n                                    indexOfX = keys.indexOf('x');\n                                    indexOfY = keys.indexOf('y');\n                                    indexOfX = indexOfX >= 0 ? indexOfX : 0;\n                                    indexOfY = indexOfY >= 0 ? indexOfY : 1;\n                                }\n                                for (i = 0; i < dataLength; i++) {\n                                    pt = data[i];\n                                    xData[i] = pt[indexOfX];\n                                    yData[i] = pt[indexOfY];\n                                }\n                            }\n                        }\n                        else {\n                            // Highcharts expects configs to be numbers or arrays in\n                            // turbo mode\n                            error(12, false, chart);\n                        }\n                    }\n                    else {\n                        for (i = 0; i < dataLength; i++) {\n                            // stray commas in oldIE:\n                            if (typeof data[i] !== 'undefined') {\n                                pt = { series: series };\n                                series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\n                                series.updateParallelArrays(pt, i);\n                            }\n                        }\n                    }\n                    // Forgetting to cast strings to numbers is a common caveat when\n                    // handling CSV or JSON\n                    if (yData && isString(yData[0])) {\n                        error(14, true, chart);\n                    }\n                    series.data = [];\n                    series.options.data = series.userOptions.data = data;\n                    // destroy old points\n                    i = oldDataLength;\n                    while (i--) {\n                        if (oldData[i] && oldData[i].destroy) {\n                            oldData[i].destroy();\n                        }\n                    }\n                    // reset minRange (#878)\n                    if (xAxis) {\n                        xAxis.minRange = xAxis.userMinRange;\n                    }\n                    // redraw\n                    series.isDirty = chart.isDirtyBox = true;\n                    series.isDirtyData = !!oldData;\n                    animation = false;\n                }\n                // Typically for pie series, points need to be processed and\n                // generated prior to rendering the legend\n                if (options.legendType === 'point') {\n                    this.processData();\n                    this.generatePoints();\n                }\n                if (redraw) {\n                    chart.redraw(animation);\n                }\n            },\n            /**\n             * Internal function to sort series data\n             *\n             * @private\n             * @function Highcharts.Series#sortData\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Force data grouping.\n             * @return {Array<Highcharts.PointOptionsObject>}\n             */\n            sortData: function (data) {\n                var series = this,\n                    options = series.options,\n                    dataSorting = options.dataSorting,\n                    sortKey = dataSorting.sortKey || 'y',\n                    sortedData,\n                    getPointOptionsObject = function (series,\n                    pointOptions) {\n                        return (defined(pointOptions) &&\n                            series.pointClass.prototype.optionsToObject.call({\n                                series: series\n                            },\n                    pointOptions)) || {};\n                };\n                data.forEach(function (pointOptions, i) {\n                    data[i] = getPointOptionsObject(series, pointOptions);\n                    data[i].index = i;\n                }, this);\n                // Sorting\n                sortedData = data.concat().sort(function (a, b) {\n                    var aValue = getNestedProperty(sortKey,\n                        a);\n                    var bValue = getNestedProperty(sortKey,\n                        b);\n                    return bValue < aValue ? -1 : bValue > aValue ? 1 : 0;\n                });\n                // Set x value depending on the position in the array\n                sortedData.forEach(function (point, i) {\n                    point.x = i;\n                }, this);\n                // Set the same x for linked series points if they don't have their\n                // own sorting\n                if (series.linkedSeries) {\n                    series.linkedSeries.forEach(function (linkedSeries) {\n                        var options = linkedSeries.options,\n                            seriesData = options.data;\n                        if ((!options.dataSorting ||\n                            !options.dataSorting.enabled) &&\n                            seriesData) {\n                            seriesData.forEach(function (pointOptions, i) {\n                                seriesData[i] = getPointOptionsObject(linkedSeries, pointOptions);\n                                if (data[i]) {\n                                    seriesData[i].x = data[i].x;\n                                    seriesData[i].index = i;\n                                }\n                            });\n                            linkedSeries.setData(seriesData, false);\n                        }\n                    });\n                }\n                return data;\n            },\n            /**\n             * Internal function to process the data by cropping away unused data\n             * points if the series is longer than the crop threshold. This saves\n             * computing time for large series.\n             *\n             * @private\n             * @function Highcharts.Series#getProcessedData\n             * @param {boolean} [forceExtremesFromAll]\n             *        Force getting extremes of a total series data range.\n             * @return {Highcharts.SeriesProcessedDataObject}\n             */\n            getProcessedData: function (forceExtremesFromAll) {\n                var series = this, \n                    // copied during slice operation:\n                    processedXData = series.xData,\n                    processedYData = series.yData,\n                    dataLength = processedXData.length,\n                    croppedData,\n                    cropStart = 0,\n                    cropped,\n                    distance,\n                    closestPointRange,\n                    xAxis = series.xAxis,\n                    i, // loop variable\n                    options = series.options,\n                    cropThreshold = options.cropThreshold,\n                    getExtremesFromAll = forceExtremesFromAll ||\n                        series.getExtremesFromAll ||\n                        options.getExtremesFromAll, // #4599\n                    isCartesian = series.isCartesian,\n                    xExtremes,\n                    val2lin = xAxis && xAxis.val2lin,\n                    isLog = !!(xAxis && xAxis.logarithmic),\n                    throwOnUnsorted = series.requireSorting,\n                    min,\n                    max;\n                if (xAxis) {\n                    // corrected for log axis (#3053)\n                    xExtremes = xAxis.getExtremes();\n                    min = xExtremes.min;\n                    max = xExtremes.max;\n                }\n                // optionally filter out points outside the plot area\n                if (isCartesian &&\n                    series.sorted &&\n                    !getExtremesFromAll &&\n                    (!cropThreshold ||\n                        dataLength > cropThreshold ||\n                        series.forceCrop)) {\n                    // it's outside current extremes\n                    if (processedXData[dataLength - 1] < min ||\n                        processedXData[0] > max) {\n                        processedXData = [];\n                        processedYData = [];\n                        // only crop if it's actually spilling out\n                    }\n                    else if (series.yData && (processedXData[0] < min ||\n                        processedXData[dataLength - 1] > max)) {\n                        croppedData = this.cropData(series.xData, series.yData, min, max);\n                        processedXData = croppedData.xData;\n                        processedYData = croppedData.yData;\n                        cropStart = croppedData.start;\n                        cropped = true;\n                    }\n                }\n                // Find the closest distance between processed points\n                i = processedXData.length || 1;\n                while (--i) {\n                    distance = (isLog ?\n                        (val2lin(processedXData[i]) -\n                            val2lin(processedXData[i - 1])) :\n                        (processedXData[i] -\n                            processedXData[i - 1]));\n                    if (distance > 0 &&\n                        (typeof closestPointRange === 'undefined' ||\n                            distance < closestPointRange)) {\n                        closestPointRange = distance;\n                        // Unsorted data is not supported by the line tooltip, as well\n                        // as data grouping and navigation in Stock charts (#725) and\n                        // width calculation of columns (#1900)\n                    }\n                    else if (distance < 0 && throwOnUnsorted) {\n                        error(15, false, series.chart);\n                        throwOnUnsorted = false; // Only once\n                    }\n                }\n                return {\n                    xData: processedXData,\n                    yData: processedYData,\n                    cropped: cropped,\n                    cropStart: cropStart,\n                    closestPointRange: closestPointRange\n                };\n            },\n            /**\n             * Internal function to apply processed data.\n             * In Highstock, this function is extended to provide data grouping.\n             *\n             * @private\n             * @function Highcharts.Series#processData\n             * @param {boolean} [force]\n             *        Force data grouping.\n             * @return {boolean|undefined}\n             */\n            processData: function (force) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    processedData;\n                // If the series data or axes haven't changed, don't go through\n                // this. Return false to pass the message on to override methods\n                // like in data grouping.\n                if (series.isCartesian &&\n                    !series.isDirty &&\n                    !xAxis.isDirty &&\n                    !series.yAxis.isDirty &&\n                    !force) {\n                    return false;\n                }\n                processedData = series.getProcessedData();\n                // Record the properties\n                series.cropped = processedData.cropped; // undefined or true\n                series.cropStart = processedData.cropStart;\n                series.processedXData = processedData.xData;\n                series.processedYData = processedData.yData;\n                series.closestPointRange =\n                    series.basePointRange = processedData.closestPointRange;\n            },\n            /**\n             * Iterate over xData and crop values between min and max. Returns\n             * object containing crop start/end cropped xData with corresponding\n             * part of yData, dataMin and dataMax within the cropped range.\n             *\n             * @private\n             * @function Highcharts.Series#cropData\n             * @param {Array<number>} xData\n             * @param {Array<number>} yData\n             * @param {number} min\n             * @param {number} max\n             * @param {number} [cropShoulder]\n             * @return {Highcharts.SeriesCropDataObject}\n             */\n            cropData: function (xData, yData, min, max, cropShoulder) {\n                var dataLength = xData.length,\n                    cropStart = 0,\n                    cropEnd = dataLength,\n                    i,\n                    j;\n                // line-type series need one point outside\n                cropShoulder = pick(cropShoulder, this.cropShoulder);\n                // iterate up to find slice start\n                for (i = 0; i < dataLength; i++) {\n                    if (xData[i] >= min) {\n                        cropStart = Math.max(0, i - cropShoulder);\n                        break;\n                    }\n                }\n                // proceed to find slice end\n                for (j = i; j < dataLength; j++) {\n                    if (xData[j] > max) {\n                        cropEnd = j + cropShoulder;\n                        break;\n                    }\n                }\n                return {\n                    xData: xData.slice(cropStart, cropEnd),\n                    yData: yData.slice(cropStart, cropEnd),\n                    start: cropStart,\n                    end: cropEnd\n                };\n            },\n            /**\n             * Generate the data point after the data has been processed by cropping\n             * away unused points and optionally grouped in Highcharts Stock.\n             *\n             * @private\n             * @function Highcharts.Series#generatePoints\n             */\n            generatePoints: function () {\n                var series = this,\n                    options = series.options,\n                    dataOptions = options.data,\n                    data = series.data,\n                    dataLength,\n                    processedXData = series.processedXData,\n                    processedYData = series.processedYData,\n                    PointClass = series.pointClass,\n                    processedDataLength = processedXData.length,\n                    cropStart = series.cropStart || 0,\n                    cursor,\n                    hasGroupedData = series.hasGroupedData,\n                    keys = options.keys,\n                    point,\n                    points = [],\n                    i;\n                if (!data && !hasGroupedData) {\n                    var arr = [];\n                    arr.length = dataOptions.length;\n                    data = series.data = arr;\n                }\n                if (keys && hasGroupedData) {\n                    // grouped data has already applied keys (#6590)\n                    series.options.keys = false;\n                }\n                for (i = 0; i < processedDataLength; i++) {\n                    cursor = cropStart + i;\n                    if (!hasGroupedData) {\n                        point = data[cursor];\n                        // #970:\n                        if (!point &&\n                            typeof dataOptions[cursor] !== 'undefined') {\n                            data[cursor] = point = (new PointClass()).init(series, dataOptions[cursor], processedXData[i]);\n                        }\n                    }\n                    else {\n                        // splat the y data in case of ohlc data array\n                        point = (new PointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));\n                        /**\n                         * Highstock only. If a point object is created by data\n                         * grouping, it doesn't reflect actual points in the raw\n                         * data. In this case, the `dataGroup` property holds\n                         * information that points back to the raw data.\n                         *\n                         * - `dataGroup.start` is the index of the first raw data\n                         *   point in the group.\n                         *\n                         * - `dataGroup.length` is the amount of points in the\n                         *   group.\n                         *\n                         * @product highstock\n                         *\n                         * @name Highcharts.Point#dataGroup\n                         * @type {Highcharts.DataGroupingInfoObject|undefined}\n                         */\n                        point.dataGroup = series.groupMap[i];\n                        if (point.dataGroup.options) {\n                            point.options = point.dataGroup.options;\n                            extend(point, point.dataGroup.options);\n                            // Collision of props and options (#9770)\n                            delete point.dataLabels;\n                        }\n                    }\n                    if (point) { // #6279\n                        /**\n                         * Contains the point's index in the `Series.points` array.\n                         *\n                         * @name Highcharts.Point#index\n                         * @type {number}\n                         * @readonly\n                         */\n                        point.index = cursor; // For faster access in Point.update\n                        points[i] = point;\n                    }\n                }\n                // restore keys options (#6590)\n                series.options.keys = keys;\n                // Hide cropped-away points - this only runs when the number of\n                // points is above cropThreshold, or when swithching view from\n                // non-grouped data to grouped data (#637)\n                if (data &&\n                    (processedDataLength !== (dataLength = data.length) ||\n                        hasGroupedData)) {\n                    for (i = 0; i < dataLength; i++) {\n                        // when has grouped data, clear all points\n                        if (i === cropStart && !hasGroupedData) {\n                            i += processedDataLength;\n                        }\n                        if (data[i]) {\n                            data[i].destroyElements();\n                            data[i].plotX = void 0; // #1003\n                        }\n                    }\n                }\n                /**\n                 * Read only. An array containing those values converted to points.\n                 * In case the series data length exceeds the `cropThreshold`, or if\n                 * the data is grouped, `series.data` doesn't contain all the\n                 * points. Also, in case a series is hidden, the `data` array may be\n                 * empty. To access raw values, `series.options.data` will always be\n                 * up to date. `Series.data` only contains the points that have been\n                 * created on demand. To modify the data, use\n                 * {@link Highcharts.Series#setData} or\n                 * {@link Highcharts.Point#update}.\n                 *\n                 * @see Series.points\n                 *\n                 * @name Highcharts.Series#data\n                 * @type {Array<Highcharts.Point>}\n                 */\n                series.data = data;\n                /**\n                 * An array containing all currently visible point objects. In case\n                 * of cropping, the cropped-away points are not part of this array.\n                 * The `series.points` array starts at `series.cropStart` compared\n                 * to `series.data` and `series.options.data`. If however the series\n                 * data is grouped, these can't be correlated one to one. To modify\n                 * the data, use {@link Highcharts.Series#setData} or\n                 * {@link Highcharts.Point#update}.\n                 *\n                 * @name Highcharts.Series#points\n                 * @type {Array<Highcharts.Point>}\n                 */\n                series.points = points;\n                fireEvent(this, 'afterGeneratePoints');\n            },\n            /**\n             * Get current X extremes for the visible data.\n             *\n             * @private\n             * @function Highcharts.Series#getXExtremes\n             *\n             * @param {Array<number>} xData\n             *        The data to inspect. Defaults to the current data within the\n             *        visible range.\n             * @return {Highcharts.RangeObject}\n             */\n            getXExtremes: function (xData) {\n                return {\n                    min: arrayMin(xData),\n                    max: arrayMax(xData)\n                };\n            },\n            /**\n             * Calculate Y extremes for the visible data. The result is returned\n             * as an object with `dataMin` and `dataMax` properties.\n             *\n             * @private\n             * @function Highcharts.Series#getExtremes\n             * @param {Array<number>} [yData]\n             *        The data to inspect. Defaults to the current data within the\n             *        visible range.\n             * @param {boolean} [forceExtremesFromAll]\n             *        Force getting extremes of a total series data range.\n             * @return {Highcharts.DataExtremesObject}\n             */\n            getExtremes: function (yData, forceExtremesFromAll) {\n                var xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    xData = this.processedXData || this.xData,\n                    yDataLength,\n                    activeYData = [],\n                    activeCounter = 0, \n                    // #2117, need to compensate for log X axis\n                    xExtremes,\n                    xMin = 0,\n                    xMax = 0,\n                    validValue,\n                    withinRange, \n                    // Handle X outside the viewed area. This does not work with\n                    // non-sorted data like scatter (#7639).\n                    shoulder = this.requireSorting ? this.cropShoulder : 0,\n                    positiveValuesOnly = yAxis ? yAxis.positiveValuesOnly : false,\n                    x,\n                    y,\n                    i,\n                    j;\n                yData = yData || this.stackedYData || this.processedYData || [];\n                yDataLength = yData.length;\n                if (xAxis) {\n                    xExtremes = xAxis.getExtremes();\n                    xMin = xExtremes.min;\n                    xMax = xExtremes.max;\n                }\n                for (i = 0; i < yDataLength; i++) {\n                    x = xData[i];\n                    y = yData[i];\n                    // For points within the visible range, including the first\n                    // point outside the visible range (#7061), consider y extremes.\n                    validValue = ((isNumber(y) || isArray(y)) &&\n                        ((y.length || y > 0) || !positiveValuesOnly));\n                    withinRange = (forceExtremesFromAll ||\n                        this.getExtremesFromAll ||\n                        this.options.getExtremesFromAll ||\n                        this.cropped ||\n                        !xAxis || // for colorAxis support\n                        ((xData[i + shoulder] || x) >= xMin &&\n                            (xData[i - shoulder] || x) <= xMax));\n                    if (validValue && withinRange) {\n                        j = y.length;\n                        if (j) { // array, like ohlc or range data\n                            while (j--) {\n                                if (isNumber(y[j])) { // #7380, #11513\n                                    activeYData[activeCounter++] = y[j];\n                                }\n                            }\n                        }\n                        else {\n                            activeYData[activeCounter++] = y;\n                        }\n                    }\n                }\n                var dataExtremes = {\n                        dataMin: arrayMin(activeYData),\n                        dataMax: arrayMax(activeYData)\n                    };\n                fireEvent(this, 'afterGetExtremes', { dataExtremes: dataExtremes });\n                return dataExtremes;\n            },\n            /**\n             * Set the current data extremes as `dataMin` and `dataMax` on the\n             * Series item. Use this only when the series properties should be\n             * updated.\n             *\n             * @private\n             * @function Highcharts.Series#applyExtremes\n             * @return {void}\n             */\n            applyExtremes: function () {\n                var dataExtremes = this.getExtremes();\n                /**\n                 * Contains the minimum value of the series' data point.\n                 * @name Highcharts.Series#dataMin\n                 * @type {number}\n                 * @readonly\n                 */\n                this.dataMin = dataExtremes.dataMin;\n                /* *\n                 * Contains the maximum value of the series' data point.\n                 * @name Highcharts.Series#dataMax\n                 * @type {number}\n                 * @readonly\n                 */\n                this.dataMax = dataExtremes.dataMax;\n                return dataExtremes;\n            },\n            /**\n             * Find and return the first non null point in the data\n             *\n             * @private\n             * @function Highcharts.Series.getFirstValidPoint\n             * @param {Array<Highcharts.PointOptionsType>} data\n             *        Array of options for points\n             *\n             * @return {Highcharts.PointOptionsType}\n             */\n            getFirstValidPoint: function (data) {\n                var firstPoint = null,\n                    dataLength = data.length,\n                    i = 0;\n                while (firstPoint === null && i < dataLength) {\n                    firstPoint = data[i];\n                    i++;\n                }\n                return firstPoint;\n            },\n            /**\n             * Translate data points from raw data values to chart specific\n             * positioning data needed later in the `drawPoints` and `drawGraph`\n             * functions. This function can be overridden in plugins and custom\n             * series type implementations.\n             *\n             * @function Highcharts.Series#translate\n             * @return {void}\n             * @fires Highcharts.Series#events:translate\n             */\n            translate: function () {\n                if (!this.processedXData) { // hidden series\n                    this.processData();\n                }\n                this.generatePoints();\n                var series = this,\n                    options = series.options,\n                    stacking = options.stacking,\n                    xAxis = series.xAxis,\n                    categories = xAxis.categories,\n                    enabledDataSorting = series.enabledDataSorting,\n                    yAxis = series.yAxis,\n                    points = series.points,\n                    dataLength = points.length,\n                    hasModifyValue = !!series.modifyValue,\n                    i,\n                    pointPlacement = series.pointPlacementToXValue(), // #7860\n                    dynamicallyPlaced = Boolean(pointPlacement),\n                    threshold = options.threshold,\n                    stackThreshold = options.startFromThreshold ? threshold : 0,\n                    plotX,\n                    lastPlotX,\n                    stackIndicator,\n                    zoneAxis = this.zoneAxis || 'y',\n                    closestPointRangePx = Number.MAX_VALUE;\n                /**\n                 * Plotted coordinates need to be within a limited range. Drawing\n                 * too far outside the viewport causes various rendering issues\n                 * (#3201, #3923, #7555).\n                 * @private\n                 */\n                function limitedRange(val) {\n                    return clamp(val, -1e5, 1e5);\n                }\n                // Translate each point\n                for (i = 0; i < dataLength; i++) {\n                    var point = points[i],\n                        xValue = point.x,\n                        yValue = point.y,\n                        yBottom = point.low,\n                        stack = stacking && yAxis.stacking && yAxis.stacking.stacks[(series.negStacks &&\n                            yValue <\n                                (stackThreshold ? 0 : threshold) ?\n                            '-' :\n                            '') + series.stackKey],\n                        pointStack,\n                        stackValues;\n                    // Discard disallowed y values for log axes (#3434)\n                    if (yAxis.positiveValuesOnly &&\n                        yValue !== null &&\n                        yValue <= 0) {\n                        point.isNull = true;\n                    }\n                    // Get the plotX translation\n                    point.plotX = plotX = correctFloat(// #5236\n                    limitedRange(xAxis.translate(// #3923\n                    xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags')) // #3923\n                    );\n                    // Calculate the bottom y value for stacked series\n                    if (stacking &&\n                        series.visible &&\n                        stack &&\n                        stack[xValue]) {\n                        stackIndicator = series.getStackIndicator(stackIndicator, xValue, series.index);\n                        if (!point.isNull) {\n                            pointStack = stack[xValue];\n                            stackValues =\n                                pointStack.points[stackIndicator.key];\n                        }\n                    }\n                    if (isArray(stackValues)) {\n                        yBottom = stackValues[0];\n                        yValue = stackValues[1];\n                        if (yBottom === stackThreshold &&\n                            stackIndicator.key ===\n                                stack[xValue].base) {\n                            yBottom = pick((isNumber(threshold) && threshold), yAxis.min);\n                        }\n                        // #1200, #1232\n                        if (yAxis.positiveValuesOnly && yBottom <= 0) {\n                            yBottom = null;\n                        }\n                        point.total = point.stackTotal = pointStack.total;\n                        point.percentage =\n                            pointStack.total &&\n                                (point.y / pointStack.total * 100);\n                        point.stackY = yValue;\n                        // Place the stack label\n                        // in case of variwide series (where widths of points are\n                        // different in most cases), stack labels are positioned\n                        // wrongly, so the call of the setOffset is omited here and\n                        // labels are correctly positioned later, at the end of the\n                        // variwide's translate function (#10962)\n                        if (!series.irregularWidths) {\n                            pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);\n                        }\n                    }\n                    // Set translated yBottom or remove it\n                    point.yBottom = defined(yBottom) ?\n                        limitedRange(yAxis.translate(yBottom, 0, 1, 0, 1)) :\n                        null;\n                    // general hook, used for Highstock compare mode\n                    if (hasModifyValue) {\n                        yValue = series.modifyValue(yValue, point);\n                    }\n                    // Set the the plotY value, reset it for redraws\n                    // #3201\n                    point.plotY = ((typeof yValue === 'number' && yValue !== Infinity) ?\n                        limitedRange(yAxis.translate(yValue, 0, 1, 0, 1)) :\n                        void 0);\n                    point.isInside = this.isPointInside(point);\n                    // Set client related positions for mouse tracking\n                    point.clientX = dynamicallyPlaced ?\n                        correctFloat(xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement)) :\n                        plotX; // #1514, #5383, #5518\n                    // Negative points. For bubble charts, this means negative z\n                    // values (#9728)\n                    point.negative = point[zoneAxis] < (options[zoneAxis + 'Threshold'] ||\n                        threshold ||\n                        0);\n                    // some API data\n                    point.category = (categories &&\n                        typeof categories[point.x] !== 'undefined' ?\n                        categories[point.x] :\n                        point.x);\n                    // Determine auto enabling of markers (#3635, #5099)\n                    if (!point.isNull && point.visible !== false) {\n                        if (typeof lastPlotX !== 'undefined') {\n                            closestPointRangePx = Math.min(closestPointRangePx, Math.abs(plotX - lastPlotX));\n                        }\n                        lastPlotX = plotX;\n                    }\n                    // Find point zone\n                    point.zone = (this.zones.length && point.getZone());\n                    // Animate new points with data sorting\n                    if (!point.graphic && series.group && enabledDataSorting) {\n                        point.isNew = true;\n                    }\n                }\n                series.closestPointRangePx = closestPointRangePx;\n                fireEvent(this, 'afterTranslate');\n            },\n            /**\n             * Return the series points with null points filtered out.\n             *\n             * @function Highcharts.Series#getValidPoints\n             *\n             * @param {Array<Highcharts.Point>} [points]\n             *        The points to inspect, defaults to {@link Series.points}.\n             *\n             * @param {boolean} [insideOnly=false]\n             *        Whether to inspect only the points that are inside the visible\n             *        view.\n             *\n             * @param {boolean} [allowNull=false]\n             *        Whether to allow null points to pass as valid points.\n             *\n             * @return {Array<Highcharts.Point>}\n             *         The valid points.\n             */\n            getValidPoints: function (points, insideOnly, allowNull) {\n                var chart = this.chart;\n                // #3916, #5029, #5085\n                return (points || this.points || []).filter(function isValidPoint(point) {\n                    if (insideOnly && !chart.isInsidePlot(point.plotX, point.plotY, chart.inverted)) {\n                        return false;\n                    }\n                    return point.visible !== false &&\n                        (allowNull || !point.isNull);\n                });\n            },\n            /**\n             * Get the clipping for the series. Could be called for a series to\n             * initiate animating the clip or to set the final clip (only width\n             * and x).\n             *\n             * @private\n             * @function Highcharts.Series#getClip\n             * @param  {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *         Initialize the animation.\n             * @param  {boolean} [finalBox]\n             *         Final size for the clip - end state for the animation.\n             * @return {Highcharts.Dictionary<number>}\n             */\n            getClipBox: function (animation, finalBox) {\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    inverted = chart.inverted,\n                    xAxis = series.xAxis,\n                    yAxis = xAxis && series.yAxis,\n                    clipBox,\n                    scrollablePlotAreaOptions = chart.options.chart.scrollablePlotArea || {};\n                if (animation && options.clip === false && yAxis) {\n                    // support for not clipped series animation (#10450)\n                    clipBox = inverted ? {\n                        y: -chart.chartWidth + yAxis.len + yAxis.pos,\n                        height: chart.chartWidth,\n                        width: chart.chartHeight,\n                        x: -chart.chartHeight + xAxis.len + xAxis.pos\n                    } : {\n                        y: -yAxis.pos,\n                        height: chart.chartHeight,\n                        width: chart.chartWidth,\n                        x: -xAxis.pos\n                    };\n                    // x and width will be changed later when setting for animation\n                    // initial state in Series.setClip\n                }\n                else {\n                    clipBox = series.clipBox || chart.clipBox;\n                    if (finalBox) {\n                        clipBox.width = chart.plotSizeX;\n                        clipBox.x = (chart.scrollablePixelsX || 0) *\n                            (scrollablePlotAreaOptions.scrollPositionX || 0);\n                    }\n                }\n                return !finalBox ? clipBox : {\n                    width: clipBox.width,\n                    x: clipBox.x\n                };\n            },\n            /**\n             * Set the clipping for the series. For animated series it is called\n             * twice, first to initiate animating the clip then the second time\n             * without the animation to set the final clip.\n             *\n             * @private\n             * @function Highcharts.Series#setClip\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             */\n            setClip: function (animation) {\n                var chart = this.chart, options = this.options, renderer = chart.renderer, inverted = chart.inverted, seriesClipBox = this.clipBox, clipBox = this.getClipBox(animation), sharedClipKey = this.sharedClipKey ||\n                        [\n                            '_sharedClip',\n                            animation && animation.duration,\n                            animation && animation.easing,\n                            clipBox.height,\n                            options.xAxis,\n                            options.yAxis\n                        ].join(','), // #4526\n                    clipRect = chart[sharedClipKey], markerClipRect = chart[sharedClipKey + 'm'];\n                if (animation) {\n                    clipBox.width = 0;\n                    if (inverted) {\n                        clipBox.x = chart.plotHeight +\n                            (options.clip !== false ? 0 : chart.plotTop);\n                    }\n                }\n                // If a clipping rectangle with the same properties is currently\n                // present in the chart, use that.\n                if (!clipRect) {\n                    // When animation is set, prepare the initial positions\n                    if (animation) {\n                        chart[sharedClipKey + 'm'] = markerClipRect =\n                            renderer.clipRect(\n                            // include the width of the first marker\n                            inverted ? chart.plotSizeX + 99 : -99, inverted ? -chart.plotLeft : -chart.plotTop, 99, inverted ? chart.chartWidth : chart.chartHeight);\n                    }\n                    chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n                    // Create hashmap for series indexes\n                    clipRect.count = { length: 0 };\n                    // When the series is rendered again before starting animating, in\n                    // compliance to a responsive rule\n                }\n                else if (!chart.hasLoaded) {\n                    clipRect.attr(clipBox);\n                }\n                if (animation) {\n                    if (!clipRect.count[this.index]) {\n                        clipRect.count[this.index] = true;\n                        clipRect.count.length += 1;\n                    }\n                }\n                if (options.clip !== false || animation) {\n                    this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n                    this.markerGroup.clip(markerClipRect);\n                    this.sharedClipKey = sharedClipKey;\n                }\n                // Remove the shared clipping rectangle when all series are shown\n                if (!animation) {\n                    if (clipRect.count[this.index]) {\n                        delete clipRect.count[this.index];\n                        clipRect.count.length -= 1;\n                    }\n                    if (clipRect.count.length === 0 &&\n                        sharedClipKey &&\n                        chart[sharedClipKey]) {\n                        if (!seriesClipBox) {\n                            chart[sharedClipKey] =\n                                chart[sharedClipKey].destroy();\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'] =\n                                chart[sharedClipKey + 'm'].destroy();\n                        }\n                    }\n                }\n            },\n            /**\n             * Animate in the series. Called internally twice. First with the `init`\n             * parameter set to true, which sets up the initial state of the\n             * animation. Then when ready, it is called with the `init` parameter\n             * undefined, in order to perform the actual animation. After the\n             * second run, the function is removed.\n             *\n             * @function Highcharts.Series#animate\n             *\n             * @param {boolean} [init]\n             *        Initialize the animation.\n             */\n            animate: function (init) {\n                var series = this,\n                    chart = series.chart,\n                    animation = animObject(series.options.animation),\n                    clipRect,\n                    sharedClipKey,\n                    finalBox;\n                // Initialize the animation. Set up the clipping rectangle.\n                if (!chart.hasRendered) {\n                    if (init) {\n                        series.setClip(animation);\n                        // Run the animation\n                    }\n                    else {\n                        sharedClipKey = this.sharedClipKey;\n                        clipRect = chart[sharedClipKey];\n                        finalBox = series.getClipBox(animation, true);\n                        if (clipRect) {\n                            clipRect.animate(finalBox, animation);\n                        }\n                        if (chart[sharedClipKey + 'm']) {\n                            chart[sharedClipKey + 'm'].animate({\n                                width: finalBox.width + 99,\n                                x: finalBox.x - (chart.inverted ? 0 : 99)\n                            }, animation);\n                        }\n                    }\n                }\n            },\n            /**\n             * This runs after animation to land on the final plot clipping.\n             *\n             * @private\n             * @function Highcharts.Series#afterAnimate\n             * @fires Highcharts.Series#event:afterAnimate\n             */\n            afterAnimate: function () {\n                this.setClip();\n                fireEvent(this, 'afterAnimate');\n                this.finishedAnimating = true;\n            },\n            /**\n             * Draw the markers for line-like series types, and columns or other\n             * graphical representation for {@link Point} objects for other series\n             * types. The resulting element is typically stored as\n             * {@link Point.graphic}, and is created on the first call and updated\n             * and moved on subsequent calls.\n             *\n             * @function Highcharts.Series#drawPoints\n             */\n            drawPoints: function () {\n                var series = this,\n                    points = series.points,\n                    chart = series.chart,\n                    i,\n                    point,\n                    graphic,\n                    verb,\n                    options = series.options,\n                    seriesMarkerOptions = options.marker,\n                    pointMarkerOptions,\n                    hasPointMarker,\n                    markerGroup = (series[series.specialGroup] ||\n                        series.markerGroup),\n                    xAxis = series.xAxis,\n                    markerAttribs,\n                    globallyEnabled = pick(seriesMarkerOptions.enabled, !xAxis || xAxis.isRadial ? true : null, \n                    // Use larger or equal as radius is null in bubbles (#6321)\n                    series.closestPointRangePx >= (seriesMarkerOptions.enabledThreshold *\n                        seriesMarkerOptions.radius));\n                if (seriesMarkerOptions.enabled !== false ||\n                    series._hasPointMarkers) {\n                    for (i = 0; i < points.length; i++) {\n                        point = points[i];\n                        graphic = point.graphic;\n                        verb = graphic ? 'animate' : 'attr';\n                        pointMarkerOptions = point.marker || {};\n                        hasPointMarker = !!point.marker;\n                        var shouldDrawMarker = ((globallyEnabled &&\n                                typeof pointMarkerOptions.enabled === 'undefined') || pointMarkerOptions.enabled) && !point.isNull && point.visible !== false;\n                        // only draw the point if y is defined\n                        if (shouldDrawMarker) {\n                            // Shortcuts\n                            var symbol = pick(pointMarkerOptions.symbol,\n                                series.symbol);\n                            markerAttribs = series.markerAttribs(point, (point.selected && 'select'));\n                            // Set starting position for point sliding animation.\n                            if (series.enabledDataSorting) {\n                                point.startXPos = xAxis.reversed ?\n                                    -markerAttribs.width :\n                                    xAxis.width;\n                            }\n                            var isInside = point.isInside !== false;\n                            if (graphic) { // update\n                                // Since the marker group isn't clipped, each\n                                // individual marker must be toggled\n                                graphic[isInside ? 'show' : 'hide'](isInside)\n                                    .animate(markerAttribs);\n                            }\n                            else if (isInside &&\n                                (markerAttribs.width > 0 || point.hasImage)) {\n                                /**\n                                 * The graphic representation of the point.\n                                 * Typically this is a simple shape, like a `rect`\n                                 * for column charts or `path` for line markers, but\n                                 * for some complex series types like boxplot or 3D\n                                 * charts, the graphic may be a `g` element\n                                 * containing other shapes. The graphic is generated\n                                 * the first time {@link Series#drawPoints} runs,\n                                 * and updated and moved on subsequent runs.\n                                 *\n                                 * @name Point#graphic\n                                 * @type {SVGElement}\n                                 */\n                                point.graphic = graphic = chart.renderer\n                                    .symbol(symbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, hasPointMarker ?\n                                    pointMarkerOptions :\n                                    seriesMarkerOptions)\n                                    .add(markerGroup);\n                                // Sliding animation for new points\n                                if (series.enabledDataSorting &&\n                                    chart.hasRendered) {\n                                    graphic.attr({\n                                        x: point.startXPos\n                                    });\n                                    verb = 'animate';\n                                }\n                            }\n                            if (graphic && verb === 'animate') { // update\n                                // Since the marker group isn't clipped, each\n                                // individual marker must be toggled\n                                graphic[isInside ? 'show' : 'hide'](isInside)\n                                    .animate(markerAttribs);\n                            }\n                            // Presentational attributes\n                            if (graphic && !chart.styledMode) {\n                                graphic[verb](series.pointAttribs(point, (point.selected && 'select')));\n                            }\n                            if (graphic) {\n                                graphic.addClass(point.getClassName(), true);\n                            }\n                        }\n                        else if (graphic) {\n                            point.graphic = graphic.destroy(); // #1269\n                        }\n                    }\n                }\n            },\n            /**\n             * Get non-presentational attributes for a point. Used internally for\n             * both styled mode and classic. Can be overridden for different series\n             * types.\n             *\n             * @see Series#pointAttribs\n             *\n             * @function Highcharts.Series#markerAttribs\n             *\n             * @param {Highcharts.Point} point\n             *        The Point to inspect.\n             *\n             * @param {string} [state]\n             *        The state, can be either `hover`, `select` or undefined.\n             *\n             * @return {Highcharts.SVGAttributes}\n             *         A hash containing those attributes that are not settable from\n             *         CSS.\n             */\n            markerAttribs: function (point, state) {\n                var seriesOptions = this.options,\n                    seriesMarkerOptions = seriesOptions.marker,\n                    seriesStateOptions,\n                    pointMarkerOptions = point.marker || {},\n                    symbol = (pointMarkerOptions.symbol ||\n                        seriesMarkerOptions.symbol),\n                    pointStateOptions,\n                    radius = pick(pointMarkerOptions.radius,\n                    seriesMarkerOptions.radius),\n                    attribs;\n                // Handle hover and select states\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state];\n                    radius = pick(pointStateOptions && pointStateOptions.radius, seriesStateOptions && seriesStateOptions.radius, radius + (seriesStateOptions && seriesStateOptions.radiusPlus ||\n                        0));\n                }\n                point.hasImage = symbol && symbol.indexOf('url') === 0;\n                if (point.hasImage) {\n                    radius = 0; // and subsequently width and height is not set\n                }\n                attribs = {\n                    // Math.floor for #1843:\n                    x: seriesOptions.crisp ?\n                        Math.floor(point.plotX) - radius :\n                        point.plotX - radius,\n                    y: point.plotY - radius\n                };\n                if (radius) {\n                    attribs.width = attribs.height = 2 * radius;\n                }\n                return attribs;\n            },\n            /**\n             * Internal function to get presentational attributes for each point.\n             * Unlike {@link Series#markerAttribs}, this function should return\n             * those attributes that can also be set in CSS. In styled mode,\n             * `pointAttribs` won't be called.\n             *\n             * @private\n             * @function Highcharts.Series#pointAttribs\n             *\n             * @param {Highcharts.Point} [point]\n             *        The point instance to inspect.\n             *\n             * @param {string} [state]\n             *        The point state, can be either `hover`, `select` or 'normal'.\n             *        If undefined, normal state is assumed.\n             *\n             * @return {Highcharts.SVGAttributes}\n             *         The presentational attributes to be set on the point.\n             */\n            pointAttribs: function (point, state) {\n                var seriesMarkerOptions = this.options.marker,\n                    seriesStateOptions,\n                    pointOptions = point && point.options,\n                    pointMarkerOptions = ((pointOptions && pointOptions.marker) || {}),\n                    pointStateOptions,\n                    color = this.color,\n                    pointColorOption = pointOptions && pointOptions.color,\n                    pointColor = point && point.color,\n                    strokeWidth = pick(pointMarkerOptions.lineWidth,\n                    seriesMarkerOptions.lineWidth),\n                    zoneColor = point && point.zone && point.zone.color,\n                    fill,\n                    stroke,\n                    opacity = 1;\n                color = (pointColorOption ||\n                    zoneColor ||\n                    pointColor ||\n                    color);\n                fill = (pointMarkerOptions.fillColor ||\n                    seriesMarkerOptions.fillColor ||\n                    color);\n                stroke = (pointMarkerOptions.lineColor ||\n                    seriesMarkerOptions.lineColor ||\n                    color);\n                // Handle hover and select states\n                state = state || 'normal';\n                if (state) {\n                    seriesStateOptions = seriesMarkerOptions.states[state];\n                    pointStateOptions = (pointMarkerOptions.states &&\n                        pointMarkerOptions.states[state]) || {};\n                    strokeWidth = pick(pointStateOptions.lineWidth, seriesStateOptions.lineWidth, strokeWidth + pick(pointStateOptions.lineWidthPlus, seriesStateOptions.lineWidthPlus, 0));\n                    fill = (pointStateOptions.fillColor ||\n                        seriesStateOptions.fillColor ||\n                        fill);\n                    stroke = (pointStateOptions.lineColor ||\n                        seriesStateOptions.lineColor ||\n                        stroke);\n                    opacity = pick(pointStateOptions.opacity, seriesStateOptions.opacity, opacity);\n                }\n                return {\n                    'stroke': stroke,\n                    'stroke-width': strokeWidth,\n                    'fill': fill,\n                    'opacity': opacity\n                };\n            },\n            /**\n             * Clear DOM objects and free up memory.\n             *\n             * @private\n             * @function Highcharts.Series#destroy\n             * @param {boolean} [keepEventsForUpdate]\n             * @return {void}\n             * @fires Highcharts.Series#event:destroy\n             */\n            destroy: function (keepEventsForUpdate) {\n                var series = this,\n                    chart = series.chart,\n                    issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent),\n                    destroy,\n                    i,\n                    data = series.data || [],\n                    point,\n                    axis;\n                // add event hook\n                fireEvent(series, 'destroy');\n                // remove events\n                this.removeEvents(keepEventsForUpdate);\n                // erase from axes\n                (series.axisTypes || []).forEach(function (AXIS) {\n                    axis = series[AXIS];\n                    if (axis && axis.series) {\n                        erase(axis.series, series);\n                        axis.isDirty = axis.forceRedraw = true;\n                    }\n                });\n                // remove legend items\n                if (series.legendItem) {\n                    series.chart.legend.destroyItem(series);\n                }\n                // destroy all points with their elements\n                i = data.length;\n                while (i--) {\n                    point = data[i];\n                    if (point && point.destroy) {\n                        point.destroy();\n                    }\n                }\n                series.points = null;\n                // Clear the animation timeout if we are destroying the series\n                // during initial animation\n                U.clearTimeout(series.animationTimeout);\n                // Destroy all SVGElements associated to the series\n                objectEach(series, function (val, prop) {\n                    // Survive provides a hook for not destroying\n                    if (val instanceof SVGElement && !val.survive) {\n                        // issue 134 workaround\n                        destroy = issue134 && prop === 'group' ?\n                            'hide' :\n                            'destroy';\n                        val[destroy]();\n                    }\n                });\n                // remove from hoverSeries\n                if (chart.hoverSeries === series) {\n                    chart.hoverSeries = null;\n                }\n                erase(chart.series, series);\n                chart.orderSeries();\n                // clear all members\n                objectEach(series, function (val, prop) {\n                    if (!keepEventsForUpdate || prop !== 'hcEvents') {\n                        delete series[prop];\n                    }\n                });\n            },\n            /**\n             * Get the graph path.\n             *\n             * @private\n             * @function Highcharts.Series#getGraphPath\n             * @param {Array<Highcharts.Point>} points\n             * @param {boolean} [nullsAsZeroes]\n             * @param {boolean} [connectCliffs]\n             * @return {Highcharts.SVGPathArray}\n             */\n            getGraphPath: function (points, nullsAsZeroes, connectCliffs) {\n                var series = this,\n                    options = series.options,\n                    step = options.step,\n                    reversed,\n                    graphPath = [],\n                    xMap = [],\n                    gap;\n                points = points || series.points;\n                // Bottom of a stack is reversed\n                reversed = points.reversed;\n                if (reversed) {\n                    points.reverse();\n                }\n                // Reverse the steps (#5004)\n                step = {\n                    right: 1,\n                    center: 2\n                }[step] || (step && 3);\n                if (step && reversed) {\n                    step = 4 - step;\n                }\n                // Remove invalid points, especially in spline (#5015)\n                points = this.getValidPoints(points, false, !(options.connectNulls && !nullsAsZeroes && !connectCliffs));\n                // Build the line\n                points.forEach(function (point, i) {\n                    var plotX = point.plotX,\n                        plotY = point.plotY,\n                        lastPoint = points[i - 1], \n                        // the path to this point from the previous\n                        pathToPoint;\n                    if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) &&\n                        !connectCliffs) {\n                        gap = true; // ... and continue\n                    }\n                    // Line series, nullsAsZeroes is not handled\n                    if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n                        gap = !options.connectNulls;\n                        // Area series, nullsAsZeroes is set\n                    }\n                    else if (point.isNull && !nullsAsZeroes) {\n                        gap = true;\n                    }\n                    else {\n                        if (i === 0 || gap) {\n                            pathToPoint = [[\n                                    'M',\n                                    point.plotX,\n                                    point.plotY\n                                ]];\n                            // Generate the spline as defined in the SplineSeries object\n                        }\n                        else if (series.getPointSpline) {\n                            pathToPoint = [series.getPointSpline(points, point, i)];\n                        }\n                        else if (step) {\n                            if (step === 1) { // right\n                                pathToPoint = [[\n                                        'L',\n                                        lastPoint.plotX,\n                                        plotY\n                                    ]];\n                            }\n                            else if (step === 2) { // center\n                                pathToPoint = [[\n                                        'L',\n                                        (lastPoint.plotX + plotX) / 2,\n                                        lastPoint.plotY\n                                    ], [\n                                        'L',\n                                        (lastPoint.plotX + plotX) / 2,\n                                        plotY\n                                    ]];\n                            }\n                            else {\n                                pathToPoint = [[\n                                        'L',\n                                        plotX,\n                                        lastPoint.plotY\n                                    ]];\n                            }\n                            pathToPoint.push([\n                                'L',\n                                plotX,\n                                plotY\n                            ]);\n                        }\n                        else {\n                            // normal line to next point\n                            pathToPoint = [[\n                                    'L',\n                                    plotX,\n                                    plotY\n                                ]];\n                        }\n                        // Prepare for animation. When step is enabled, there are\n                        // two path nodes for each x value.\n                        xMap.push(point.x);\n                        if (step) {\n                            xMap.push(point.x);\n                            if (step === 2) { // step = center (#8073)\n                                xMap.push(point.x);\n                            }\n                        }\n                        graphPath.push.apply(graphPath, pathToPoint);\n                        gap = false;\n                    }\n                });\n                graphPath.xMap = xMap;\n                series.graphPath = graphPath;\n                return graphPath;\n            },\n            /**\n             * Draw the graph. Called internally when rendering line-like series\n             * types. The first time it generates the `series.graph` item and\n             * optionally other series-wide items like `series.area` for area\n             * charts. On subsequent calls these items are updated with new\n             * positions and attributes.\n             *\n             * @function Highcharts.Series#drawGraph\n             */\n            drawGraph: function () {\n                var series = this,\n                    options = this.options,\n                    graphPath = (this.gappedPath || this.getGraphPath).call(this),\n                    styledMode = this.chart.styledMode,\n                    props = [[\n                            'graph',\n                            'highcharts-graph'\n                        ]];\n                // Presentational properties\n                if (!styledMode) {\n                    props[0].push((options.lineColor ||\n                        this.color ||\n                        '#cccccc' // when colorByPoint = true\n                    ), options.dashStyle);\n                }\n                props = series.getZonesGraphs(props);\n                // Draw the graph\n                props.forEach(function (prop, i) {\n                    var graphKey = prop[0],\n                        graph = series[graphKey],\n                        verb = graph ? 'animate' : 'attr',\n                        attribs;\n                    if (graph) {\n                        graph.endX = series.preventGraphAnimation ?\n                            null :\n                            graphPath.xMap;\n                        graph.animate({ d: graphPath });\n                    }\n                    else if (graphPath.length) { // #1487\n                        /**\n                         * SVG element of area-based charts. Can be used for styling\n                         * purposes. If zones are configured, this element will be\n                         * hidden and replaced by multiple zone areas, accessible\n                         * via `series['zone-area-x']` (where x is a number,\n                         * starting with 0).\n                         *\n                         * @name Highcharts.Series#area\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        /**\n                         * SVG element of line-based charts. Can be used for styling\n                         * purposes. If zones are configured, this element will be\n                         * hidden and replaced by multiple zone lines, accessible\n                         * via `series['zone-graph-x']` (where x is a number,\n                         * starting with 0).\n                         *\n                         * @name Highcharts.Series#graph\n                         * @type {Highcharts.SVGElement|undefined}\n                         */\n                        series[graphKey] = graph = series.chart.renderer\n                            .path(graphPath)\n                            .addClass(prop[1])\n                            .attr({ zIndex: 1 }) // #1069\n                            .add(series.group);\n                    }\n                    if (graph && !styledMode) {\n                        attribs = {\n                            'stroke': prop[2],\n                            'stroke-width': options.lineWidth,\n                            // Polygon series use filled graph\n                            'fill': (series.fillGraph && series.color) || 'none'\n                        };\n                        if (prop[3]) {\n                            attribs.dashstyle = prop[3];\n                        }\n                        else if (options.linecap !== 'square') {\n                            attribs['stroke-linecap'] =\n                                attribs['stroke-linejoin'] = 'round';\n                        }\n                        graph[verb](attribs)\n                            // Add shadow to normal series (0) or to first\n                            // zone (1) #3932\n                            .shadow((i < 2) && options.shadow);\n                    }\n                    // Helpers for animation\n                    if (graph) {\n                        graph.startX = graphPath.xMap;\n                        graph.isArea = graphPath.isArea; // For arearange animation\n                    }\n                });\n            },\n            /**\n             * Get zones properties for building graphs. Extendable by series with\n             * multiple lines within one series.\n             *\n             * @private\n             * @function Highcharts.Series#getZonesGraphs\n             *\n             * @param {Array<Array<string>>} props\n             *\n             * @return {Array<Array<string>>}\n             */\n            getZonesGraphs: function (props) {\n                // Add the zone properties if any\n                this.zones.forEach(function (zone, i) {\n                    var propset = [\n                            'zone-graph-' + i,\n                            'highcharts-graph highcharts-zone-graph-' + i + ' ' +\n                                (zone.className || '')\n                        ];\n                    if (!this.chart.styledMode) {\n                        propset.push((zone.color || this.color), (zone.dashStyle || this.options.dashStyle));\n                    }\n                    props.push(propset);\n                }, this);\n                return props;\n            },\n            /**\n             * Clip the graphs into zones for colors and styling.\n             *\n             * @private\n             * @function Highcharts.Series#applyZones\n             * @return {void}\n             */\n            applyZones: function () {\n                var series = this,\n                    chart = this.chart,\n                    renderer = chart.renderer,\n                    zones = this.zones,\n                    translatedFrom,\n                    translatedTo,\n                    clips = (this.clips || []),\n                    clipAttr,\n                    graph = this.graph,\n                    area = this.area,\n                    chartSizeMax = Math.max(chart.chartWidth,\n                    chart.chartHeight),\n                    axis = this[(this.zoneAxis || 'y') + 'Axis'],\n                    extremes,\n                    reversed,\n                    inverted = chart.inverted,\n                    horiz,\n                    pxRange,\n                    pxPosMin,\n                    pxPosMax,\n                    ignoreZones = false,\n                    zoneArea,\n                    zoneGraph;\n                if (zones.length &&\n                    (graph || area) &&\n                    axis &&\n                    typeof axis.min !== 'undefined') {\n                    reversed = axis.reversed;\n                    horiz = axis.horiz;\n                    // The use of the Color Threshold assumes there are no gaps\n                    // so it is safe to hide the original graph and area\n                    // unless it is not waterfall series, then use showLine property\n                    // to set lines between columns to be visible (#7862)\n                    if (graph && !this.showLine) {\n                        graph.hide();\n                    }\n                    if (area) {\n                        area.hide();\n                    }\n                    // Create the clips\n                    extremes = axis.getExtremes();\n                    zones.forEach(function (threshold, i) {\n                        translatedFrom = reversed ?\n                            (horiz ? chart.plotWidth : 0) :\n                            (horiz ? 0 : (axis.toPixels(extremes.min) || 0));\n                        translatedFrom = clamp(pick(translatedTo, translatedFrom), 0, chartSizeMax);\n                        translatedTo = clamp(Math.round(axis.toPixels(pick(threshold.value, extremes.max), true) || 0), 0, chartSizeMax);\n                        if (ignoreZones) {\n                            translatedFrom = translatedTo =\n                                axis.toPixels(extremes.max);\n                        }\n                        pxRange = Math.abs(translatedFrom - translatedTo);\n                        pxPosMin = Math.min(translatedFrom, translatedTo);\n                        pxPosMax = Math.max(translatedFrom, translatedTo);\n                        if (axis.isXAxis) {\n                            clipAttr = {\n                                x: inverted ? pxPosMax : pxPosMin,\n                                y: 0,\n                                width: pxRange,\n                                height: chartSizeMax\n                            };\n                            if (!horiz) {\n                                clipAttr.x = chart.plotHeight - clipAttr.x;\n                            }\n                        }\n                        else {\n                            clipAttr = {\n                                x: 0,\n                                y: inverted ? pxPosMax : pxPosMin,\n                                width: chartSizeMax,\n                                height: pxRange\n                            };\n                            if (horiz) {\n                                clipAttr.y = chart.plotWidth - clipAttr.y;\n                            }\n                        }\n                        // VML SUPPPORT\n                        if (inverted && renderer.isVML) {\n                            if (axis.isXAxis) {\n                                clipAttr = {\n                                    x: 0,\n                                    y: reversed ? pxPosMin : pxPosMax,\n                                    height: clipAttr.width,\n                                    width: chart.chartWidth\n                                };\n                            }\n                            else {\n                                clipAttr = {\n                                    x: (clipAttr.y -\n                                        chart.plotLeft -\n                                        chart.spacingBox.x),\n                                    y: 0,\n                                    width: clipAttr.height,\n                                    height: chart.chartHeight\n                                };\n                            }\n                        }\n                        // END OF VML SUPPORT\n                        if (clips[i]) {\n                            clips[i].animate(clipAttr);\n                        }\n                        else {\n                            clips[i] = renderer.clipRect(clipAttr);\n                        }\n                        // when no data, graph zone is not applied and after setData\n                        // clip was ignored. As a result, it should be applied each\n                        // time.\n                        zoneArea = series['zone-area-' + i];\n                        zoneGraph = series['zone-graph-' + i];\n                        if (graph && zoneGraph) {\n                            zoneGraph.clip(clips[i]);\n                        }\n                        if (area && zoneArea) {\n                            zoneArea.clip(clips[i]);\n                        }\n                        // if this zone extends out of the axis, ignore the others\n                        ignoreZones = threshold.value > extremes.max;\n                        // Clear translatedTo for indicators\n                        if (series.resetZones && translatedTo === 0) {\n                            translatedTo = void 0;\n                        }\n                    });\n                    this.clips = clips;\n                }\n                else if (series.visible) {\n                    // If zones were removed, restore graph and area\n                    if (graph) {\n                        graph.show(true);\n                    }\n                    if (area) {\n                        area.show(true);\n                    }\n                }\n            },\n            /**\n             * Initialize and perform group inversion on series.group and\n             * series.markerGroup.\n             *\n             * @private\n             * @function Highcharts.Series#invertGroups\n             * @param {boolean} [inverted]\n             * @return {void}\n             */\n            invertGroups: function (inverted) {\n                var series = this,\n                    chart = series.chart;\n                /**\n                 * @private\n                 */\n                function setInvert() {\n                    ['group', 'markerGroup'].forEach(function (groupName) {\n                        if (series[groupName]) {\n                            // VML/HTML needs explicit attributes for flipping\n                            if (chart.renderer.isVML) {\n                                series[groupName].attr({\n                                    width: series.yAxis.len,\n                                    height: series.xAxis.len\n                                });\n                            }\n                            series[groupName].width = series.yAxis.len;\n                            series[groupName].height = series.xAxis.len;\n                            // If inverted polar, don't invert series group\n                            series[groupName].invert(series.isRadialSeries ? false : inverted);\n                        }\n                    });\n                }\n                // Pie, go away (#1736)\n                if (!series.xAxis) {\n                    return;\n                }\n                // A fixed size is needed for inversion to work\n                series.eventsToUnbind.push(addEvent(chart, 'resize', setInvert));\n                // Do it now\n                setInvert();\n                // On subsequent render and redraw, just do setInvert without\n                // setting up events again\n                series.invertGroups = setInvert;\n            },\n            /**\n             * General abstraction for creating plot groups like series.group,\n             * series.dataLabelsGroup and series.markerGroup. On subsequent calls,\n             * the group will only be adjusted to the updated plot size.\n             *\n             * @private\n             * @function Highcharts.Series#plotGroup\n             * @param {string} prop\n             * @param {string} name\n             * @param {string} visibility\n             * @param {number} [zIndex]\n             * @param {Highcharts.SVGElement} [parent]\n             * @return {Highcharts.SVGElement}\n             */\n            plotGroup: function (prop, name, visibility, zIndex, parent) {\n                var group = this[prop],\n                    isNew = !group,\n                    attrs = {\n                        visibility: visibility,\n                        zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n                    };\n                // Avoid setting undefined opacity, or in styled mode\n                if (typeof this.opacity !== 'undefined' &&\n                    !this.chart.styledMode) {\n                    attrs.opacity = this.opacity;\n                }\n                // Generate it on first call\n                if (isNew) {\n                    this[prop] = group = this.chart.renderer\n                        .g()\n                        .add(parent);\n                }\n                // Add the class names, and replace existing ones as response to\n                // Series.update (#6660)\n                group.addClass(('highcharts-' + name +\n                    ' highcharts-series-' + this.index +\n                    ' highcharts-' + this.type + '-series ' +\n                    (defined(this.colorIndex) ?\n                        'highcharts-color-' + this.colorIndex + ' ' :\n                        '') +\n                    (this.options.className || '') +\n                    (group.hasClass('highcharts-tracker') ?\n                        ' highcharts-tracker' :\n                        '')), true);\n                // Place it on first and subsequent (redraw) calls\n                group.attr(attrs)[isNew ? 'attr' : 'animate'](this.getPlotBox());\n                return group;\n            },\n            /**\n             * Get the translation and scale for the plot area of this series.\n             *\n             * @function Highcharts.Series#getPlotBox\n             *\n             * @return {Highcharts.SeriesPlotBoxObject}\n             */\n            getPlotBox: function () {\n                var chart = this.chart,\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis;\n                // Swap axes for inverted (#2339)\n                if (chart.inverted) {\n                    xAxis = yAxis;\n                    yAxis = this.xAxis;\n                }\n                return {\n                    translateX: xAxis ? xAxis.left : chart.plotLeft,\n                    translateY: yAxis ? yAxis.top : chart.plotTop,\n                    scaleX: 1,\n                    scaleY: 1\n                };\n            },\n            /**\n             * Removes the event handlers attached previously with addEvents.\n             *\n             * @private\n             * @function Highcharts.Series#removeEvents\n             * @param {boolean} [keepEventsForUpdate]\n             * @return {void}\n             */\n            removeEvents: function (keepEventsForUpdate) {\n                var series = this;\n                if (!keepEventsForUpdate) {\n                    // remove all events\n                    removeEvent(series);\n                }\n                else if (series.eventsToUnbind.length) {\n                    // remove only internal events for proper update\n                    // #12355 - solves problem with multiple destroy events\n                    series.eventsToUnbind.forEach(function (unbind) {\n                        unbind();\n                    });\n                    series.eventsToUnbind.length = 0;\n                }\n            },\n            /**\n             * Render the graph and markers. Called internally when first rendering\n             * and later when redrawing the chart. This function can be extended in\n             * plugins, but normally shouldn't be called directly.\n             *\n             * @function Highcharts.Series#render\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:afterRender\n             */\n            render: function () {\n                var series = this,\n                    chart = series.chart,\n                    group,\n                    options = series.options, \n                    // Animation doesn't work in IE8 quirks when the group div is\n                    // hidden, and looks bad in other oldIE\n                    animDuration = (!series.finishedAnimating &&\n                        chart.renderer.isSVG &&\n                        animObject(options.animation).duration),\n                    visibility = series.visible ? 'inherit' : 'hidden', // #2597\n                    zIndex = options.zIndex,\n                    hasRendered = series.hasRendered,\n                    chartSeriesGroup = chart.seriesGroup,\n                    inverted = chart.inverted;\n                fireEvent(this, 'render');\n                // the group\n                group = series.plotGroup('group', 'series', visibility, zIndex, chartSeriesGroup);\n                series.markerGroup = series.plotGroup('markerGroup', 'markers', visibility, zIndex, chartSeriesGroup);\n                // initiate the animation\n                if (animDuration && series.animate) {\n                    series.animate(true);\n                }\n                // SVGRenderer needs to know this before drawing elements (#1089,\n                // #1795)\n                group.inverted = series.isCartesian || series.invertable ?\n                    inverted : false;\n                // Draw the graph if any\n                if (series.drawGraph) {\n                    series.drawGraph();\n                    series.applyZones();\n                }\n                // Draw the points\n                if (series.visible) {\n                    series.drawPoints();\n                }\n                /* series.points.forEach(function (point) {\n                    if (point.redraw) {\n                        point.redraw();\n                    }\n                }); */\n                // Draw the data labels\n                if (series.drawDataLabels) {\n                    series.drawDataLabels();\n                }\n                // In pie charts, slices are added to the DOM, but actual rendering\n                // is postponed until labels reserved their space\n                if (series.redrawPoints) {\n                    series.redrawPoints();\n                }\n                // draw the mouse tracking area\n                if (series.drawTracker &&\n                    series.options.enableMouseTracking !== false) {\n                    series.drawTracker();\n                }\n                // Handle inverted series and tracker groups\n                series.invertGroups(inverted);\n                // Initial clipping, must be defined after inverting groups for VML.\n                // Applies to columns etc. (#3839).\n                if (options.clip !== false &&\n                    !series.sharedClipKey &&\n                    !hasRendered) {\n                    group.clip(chart.clipRect);\n                }\n                // Run the animation\n                if (animDuration && series.animate) {\n                    series.animate();\n                }\n                // Call the afterAnimate function on animation complete (but don't\n                // overwrite the animation.complete option which should be available\n                // to the user).\n                if (!hasRendered) {\n                    series.animationTimeout = syncTimeout(function () {\n                        series.afterAnimate();\n                    }, animDuration || 0);\n                }\n                // Means data is in accordance with what you see\n                series.isDirty = false;\n                // (See #322) series.isDirty = series.isDirtyData = false; // means\n                // data is in accordance with what you see\n                series.hasRendered = true;\n                fireEvent(series, 'afterRender');\n            },\n            /**\n             * Redraw the series. This function is called internally from\n             * `chart.redraw` and normally shouldn't be called directly.\n             *\n             * @private\n             * @function Highcharts.Series#redraw\n             * @return {void}\n             */\n            redraw: function () {\n                var series = this,\n                    chart = series.chart, \n                    // cache it here as it is set to false in render, but used after\n                    wasDirty = series.isDirty || series.isDirtyData,\n                    group = series.group,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                // reposition on resize\n                if (group) {\n                    if (chart.inverted) {\n                        group.attr({\n                            width: chart.plotWidth,\n                            height: chart.plotHeight\n                        });\n                    }\n                    group.animate({\n                        translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n                        translateY: pick(yAxis && yAxis.top, chart.plotTop)\n                    });\n                }\n                series.translate();\n                series.render();\n                if (wasDirty) { // #3868, #3945\n                    delete this.kdTree;\n                }\n            },\n            kdAxisArray: ['clientX', 'plotY'],\n            /**\n             * @private\n             * @function Highcharts.Series#searchPoint\n             * @param {Highcharts.PointerEventObject} e\n             * @param {boolean} [compareX]\n             * @return {Highcharts.Point}\n             */\n            searchPoint: function (e, compareX) {\n                var series = this,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    inverted = series.chart.inverted;\n                return this.searchKDTree({\n                    clientX: inverted ?\n                        xAxis.len - e.chartY + xAxis.pos :\n                        e.chartX - xAxis.pos,\n                    plotY: inverted ?\n                        yAxis.len - e.chartX + yAxis.pos :\n                        e.chartY - yAxis.pos\n                }, compareX, e);\n            },\n            /**\n             * Build the k-d-tree that is used by mouse and touch interaction to get\n             * the closest point. Line-like series typically have a one-dimensional\n             * tree where points are searched along the X axis, while scatter-like\n             * series typically search in two dimensions, X and Y.\n             *\n             * @private\n             * @function Highcharts.Series#buildKDTree\n             * @param {Highcharts.PointerEventObject} [e]\n             * @return {void}\n             */\n            buildKDTree: function (e) {\n                // Prevent multiple k-d-trees from being built simultaneously\n                // (#6235)\n                this.buildingKdTree = true;\n                var series = this,\n                    dimensions = series.options.findNearestPointBy\n                        .indexOf('y') > -1 ? 2 : 1;\n                /**\n                 * Internal function\n                 * @private\n                 */\n                function _kdtree(points, depth, dimensions) {\n                    var axis,\n                        median,\n                        length = points && points.length;\n                    if (length) {\n                        // alternate between the axis\n                        axis = series.kdAxisArray[depth % dimensions];\n                        // sort point array\n                        points.sort(function (a, b) {\n                            return a[axis] - b[axis];\n                        });\n                        median = Math.floor(length / 2);\n                        // build and return nod\n                        return {\n                            point: points[median],\n                            left: _kdtree(points.slice(0, median), depth + 1, dimensions),\n                            right: _kdtree(points.slice(median + 1), depth + 1, dimensions)\n                        };\n                    }\n                }\n                /**\n                 * Start the recursive build process with a clone of the points\n                 * array and null points filtered out. (#3873)\n                 * @private\n                 */\n                function startRecursive() {\n                    series.kdTree = _kdtree(series.getValidPoints(null, \n                    // For line-type series restrict to plot area, but\n                    // column-type series not (#3916, #4511)\n                    !series.directTouch), dimensions, dimensions);\n                    series.buildingKdTree = false;\n                }\n                delete series.kdTree;\n                // For testing tooltips, don't build async. Also if touchstart, we\n                // may be dealing with click events on mobile, so don't delay\n                // (#6817).\n                syncTimeout(startRecursive, series.options.kdNow || (e && e.type === 'touchstart') ? 0 : 1);\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#searchKDTree\n             * @param {Highcharts.KDPointSearchObject} point\n             * @param {boolean} [compareX]\n             * @param {Highcharts.PointerEventObject} [e]\n             * @return {Highcharts.Point|undefined}\n             */\n            searchKDTree: function (point, compareX, e) {\n                var series = this,\n                    kdX = this.kdAxisArray[0],\n                    kdY = this.kdAxisArray[1],\n                    kdComparer = compareX ? 'distX' : 'dist',\n                    kdDimensions = series.options.findNearestPointBy\n                        .indexOf('y') > -1 ? 2 : 1;\n                /**\n                 * Set the one and two dimensional distance on the point object.\n                 * @private\n                 */\n                function setDistance(p1, p2) {\n                    var x = (defined(p1[kdX]) &&\n                            defined(p2[kdX])) ?\n                            Math.pow(p1[kdX] - p2[kdX], 2) :\n                            null,\n                        y = (defined(p1[kdY]) &&\n                            defined(p2[kdY])) ?\n                            Math.pow(p1[kdY] - p2[kdY], 2) :\n                            null,\n                        r = (x || 0) + (y || 0);\n                    p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n                    p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n                }\n                /**\n                 * @private\n                 */\n                function _search(search, tree, depth, dimensions) {\n                    var point = tree.point,\n                        axis = series.kdAxisArray[depth % dimensions],\n                        tdist,\n                        sideA,\n                        sideB,\n                        ret = point,\n                        nPoint1,\n                        nPoint2;\n                    setDistance(search, point);\n                    // Pick side based on distance to splitting point\n                    tdist = search[axis] - point[axis];\n                    sideA = tdist < 0 ? 'left' : 'right';\n                    sideB = tdist < 0 ? 'right' : 'left';\n                    // End of tree\n                    if (tree[sideA]) {\n                        nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n                        ret = (nPoint1[kdComparer] <\n                            ret[kdComparer] ?\n                            nPoint1 :\n                            point);\n                    }\n                    if (tree[sideB]) {\n                        // compare distance to current best to splitting point to\n                        // decide wether to check side B or not\n                        if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n                            nPoint2 = _search(search, tree[sideB], depth + 1, dimensions);\n                            ret = (nPoint2[kdComparer] <\n                                ret[kdComparer] ?\n                                nPoint2 :\n                                ret);\n                        }\n                    }\n                    return ret;\n                }\n                if (!this.kdTree && !this.buildingKdTree) {\n                    this.buildKDTree(e);\n                }\n                if (this.kdTree) {\n                    return _search(point, this.kdTree, kdDimensions, kdDimensions);\n                }\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#pointPlacementToXValue\n             * @return {number}\n             */\n            pointPlacementToXValue: function () {\n                var _a = this,\n                    _b = _a.options,\n                    pointPlacement = _b.pointPlacement,\n                    pointRange = _b.pointRange,\n                    axis = _a.xAxis;\n                var factor = pointPlacement;\n                // Point placement is relative to each series pointRange (#5889)\n                if (factor === 'between') {\n                    factor = axis.reversed ? -0.5 : 0.5; // #11955\n                }\n                return isNumber(factor) ?\n                    factor * pick(pointRange, axis.pointRange) :\n                    0;\n            },\n            /**\n             * @private\n             * @function Highcharts.Series#isPointInside\n             * @param {Highcharts.Point} point\n             * @return {boolean}\n             */\n            isPointInside: function (point) {\n                var isInside = typeof point.plotY !== 'undefined' &&\n                        typeof point.plotX !== 'undefined' &&\n                        point.plotY >= 0 &&\n                        point.plotY <= this.yAxis.len && // #3519\n                        point.plotX >= 0 &&\n                        point.plotX <= this.xAxis.len;\n                return isInside;\n            }\n        }); // end Series prototype\n        /**\n         * A line series displays information as a series of data points connected by\n         * straight line segments.\n         *\n         * @sample {highcharts} highcharts/demo/line-basic/\n         *         Line chart\n         * @sample {highstock} stock/demo/basic-line/\n         *         Line chart\n         *\n         * @extends   plotOptions.series\n         * @product   highcharts highstock\n         * @apioption plotOptions.line\n         */\n        /**\n         * The SVG value used for the `stroke-linecap` and `stroke-linejoin`\n         * of a line graph. Round means that lines are rounded in the ends and\n         * bends.\n         *\n         * @type       {Highcharts.SeriesLinecapValue}\n         * @default    round\n         * @since      3.0.7\n         * @apioption  plotOptions.line.linecap\n         */\n        /**\n         * A `line` series. If the [type](#series.line.type) option is not\n         * specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.line\n         * @excluding dataParser,dataURL\n         * @product   highcharts highstock\n         * @apioption series.line\n         */\n        /**\n         * An array of data points for the series. For the `line` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 1],\n         *        [1, 2],\n         *        [2, 8]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.line.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * **Note:** In TypeScript you have to extend `PointOptionsObject` with an\n         * additional declaration to allow custom data types:\n         * ```ts\n         * declare module `highcharts` {\n         *   interface PointOptionsObject {\n         *     custom: Record<string, (boolean|number|string)>;\n         *   }\n         * }\n         * ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @declare   Highcharts.PointOptionsObject\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @apioption series.line.data\n         */\n        /**\n         * An additional, individual class name for the data point's graphic\n         * representation.\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @product   highcharts gantt\n         * @apioption series.line.data.className\n         */\n        /**\n         * Individual color for the point. By default the color is pulled from\n         * the global `colors` array.\n         *\n         * In styled mode, the `color` option doesn't take effect. Instead, use\n         * `colorIndex`.\n         *\n         * @sample {highcharts} highcharts/point/color/\n         *         Mark the highest point\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.color\n         */\n        /**\n         * A specific color index to use for the point, so its graphic representations\n         * are given the class name `highcharts-color-{n}`. In styled mode this will\n         * change the color of the graphic. In non-styled mode, the color by is set by\n         * the `fill` attribute, so the change in class name won't have a visual effect\n         * by default.\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @product   highcharts gantt\n         * @apioption series.line.data.colorIndex\n         */\n        /**\n         * A reserved subspace to store options and values for customized functionality.\n         * Here you can add additional data for your own event callbacks and formatter\n         * callbacks.\n         *\n         * @sample {highcharts} highcharts/point/custom/\n         *         Point and series with custom data\n         *\n         * @type      {Highcharts.Dictionary<*>}\n         * @apioption series.line.data.custom\n         */\n        /**\n         * Individual data label for each point. The options are the same as\n         * the ones for [plotOptions.series.dataLabels](\n         * #plotOptions.series.dataLabels).\n         *\n         * @sample highcharts/point/datalabels/\n         *         Show a label for the last value\n         *\n         * @declare   Highcharts.DataLabelsOptions\n         * @extends   plotOptions.line.dataLabels\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.dataLabels\n         */\n        /**\n         * A description of the point to add to the screen reader information\n         * about the point.\n         *\n         * @type      {string}\n         * @since     5.0.0\n         * @requires  modules/accessibility\n         * @apioption series.line.data.description\n         */\n        /**\n         * An id for the point. This can be used after render time to get a\n         * pointer to the point object through `chart.get()`.\n         *\n         * @sample {highcharts} highcharts/point/id/\n         *         Remove an id'd point\n         *\n         * @type      {string}\n         * @since     1.2.0\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.id\n         */\n        /**\n         * The rank for this point's data label in case of collision. If two\n         * data labels are about to overlap, only the one with the highest `labelrank`\n         * will be drawn.\n         *\n         * @type      {number}\n         * @apioption series.line.data.labelrank\n         */\n        /**\n         * The name of the point as shown in the legend, tooltip, dataLabels, etc.\n         *\n         * @see [xAxis.uniqueNames](#xAxis.uniqueNames)\n         *\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Point names\n         *\n         * @type      {string}\n         * @apioption series.line.data.name\n         */\n        /**\n         * Whether the data point is selected initially.\n         *\n         * @type      {boolean}\n         * @default   false\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.selected\n         */\n        /**\n         * The x value of the point. For datetime axes, the X value is the timestamp\n         * in milliseconds since 1970.\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.line.data.x\n         */\n        /**\n         * The y value of the point.\n         *\n         * @type      {number|null}\n         * @product   highcharts highstock\n         * @apioption series.line.data.y\n         */\n        /**\n         * The individual point events.\n         *\n         * @extends   plotOptions.series.point.events\n         * @product   highcharts highstock gantt\n         * @apioption series.line.data.events\n         */\n        /**\n         * Options for the point markers of line-like series.\n         *\n         * @declare   Highcharts.PointMarkerOptionsObject\n         * @extends   plotOptions.series.marker\n         * @product   highcharts highstock\n         * @apioption series.line.data.marker\n         */\n        ''; // include precedent doclets in transpilat\n\n    });\n    _registerModule(_modules, 'parts/Stacking.js', [_modules['parts/Axis.js'], _modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/StackingAxis.js'], _modules['parts/Utilities.js']], function (Axis, Chart, H, StackingAxis, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var correctFloat = U.correctFloat,\n            defined = U.defined,\n            destroyObjectProperties = U.destroyObjectProperties,\n            format = U.format,\n            isNumber = U.isNumber,\n            pick = U.pick;\n        /**\n         * Stack of data points\n         *\n         * @product highcharts\n         *\n         * @interface Highcharts.StackItemObject\n         */ /**\n        * Alignment settings\n        * @name Highcharts.StackItemObject#alignOptions\n        * @type {Highcharts.AlignObject}\n        */ /**\n        * Related axis\n        * @name Highcharts.StackItemObject#axis\n        * @type {Highcharts.Axis}\n        */ /**\n        * Cumulative value of the stacked data points\n        * @name Highcharts.StackItemObject#cumulative\n        * @type {number}\n        */ /**\n        * True if on the negative side\n        * @name Highcharts.StackItemObject#isNegative\n        * @type {boolean}\n        */ /**\n        * Related SVG element\n        * @name Highcharts.StackItemObject#label\n        * @type {Highcharts.SVGElement}\n        */ /**\n        * Related stack options\n        * @name Highcharts.StackItemObject#options\n        * @type {Highcharts.YAxisStackLabelsOptions}\n        */ /**\n        * Total value of the stacked data points\n        * @name Highcharts.StackItemObject#total\n        * @type {number}\n        */ /**\n        * Shared x value of the stack\n        * @name Highcharts.StackItemObject#x\n        * @type {number}\n        */\n        ''; // detached doclets above\n        var Series = H.Series;\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * The class for stacks. Each stack, on a specific X value and either negative\n         * or positive, has its own stack item.\n         *\n         * @private\n         * @class\n         * @name Highcharts.StackItem\n         * @param {Highcharts.Axis} axis\n         * @param {Highcharts.YAxisStackLabelsOptions} options\n         * @param {boolean} isNegative\n         * @param {number} x\n         * @param {Highcharts.OptionsStackingValue} [stackOption]\n         */\n        var StackItem = /** @class */ (function () {\n                function StackItem(axis, options, isNegative, x, stackOption) {\n                    var inverted = axis.chart.inverted;\n                this.axis = axis;\n                // Tells if the stack is negative\n                this.isNegative = isNegative;\n                // Save the options to be able to style the label\n                this.options = options = options || {};\n                // Save the x value to be able to position the label later\n                this.x = x;\n                // Initialize total value\n                this.total = null;\n                // This will keep each points' extremes stored by series.index and point\n                // index\n                this.points = {};\n                this.hasValidPoints = false;\n                // Save the stack option on the series configuration object,\n                // and whether to treat it as percent\n                this.stack = stackOption;\n                this.leftCliff = 0;\n                this.rightCliff = 0;\n                // The align options and text align varies on whether the stack is\n                // negative and if the chart is inverted or not.\n                // First test the user supplied value, then use the dynamic.\n                this.alignOptions = {\n                    align: options.align ||\n                        (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n                    verticalAlign: options.verticalAlign ||\n                        (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n                    y: options.y,\n                    x: options.x\n                };\n                this.textAlign = options.textAlign ||\n                    (inverted ? (isNegative ? 'right' : 'left') : 'center');\n            }\n            /**\n             * @private\n             * @function Highcharts.StackItem#destroy\n             */\n            StackItem.prototype.destroy = function () {\n                destroyObjectProperties(this, this.axis);\n            };\n            /**\n             * Renders the stack total label and adds it to the stack label group.\n             *\n             * @private\n             * @function Highcharts.StackItem#render\n             * @param {Highcharts.SVGElement} group\n             */\n            StackItem.prototype.render = function (group) {\n                var chart = this.axis.chart,\n                    options = this.options,\n                    formatOption = options.format,\n                    attr = {},\n                    str = formatOption ? // format the text in the label\n                        format(formatOption,\n                    this,\n                    chart) :\n                        options.formatter.call(this);\n                // Change the text to reflect the new total and set visibility to hidden\n                // in case the serie is hidden\n                if (this.label) {\n                    this.label.attr({ text: str, visibility: 'hidden' });\n                }\n                else {\n                    // Create new label\n                    this.label = chart.renderer\n                        .label(str, null, null, options.shape, null, null, options.useHTML, false, 'stack-labels');\n                    attr = {\n                        r: options.borderRadius || 0,\n                        text: str,\n                        rotation: options.rotation,\n                        padding: pick(options.padding, 5),\n                        visibility: 'hidden' // hidden until setOffset is called\n                    };\n                    if (!chart.styledMode) {\n                        attr.fill = options.backgroundColor;\n                        attr.stroke = options.borderColor;\n                        attr['stroke-width'] = options.borderWidth;\n                        this.label.css(options.style);\n                    }\n                    this.label.attr(attr);\n                    if (!this.label.added) {\n                        this.label.add(group); // add to the labels-group\n                    }\n                }\n                // Rank it higher than data labels (#8742)\n                this.label.labelrank = chart.plotHeight;\n            };\n            /**\n             * Sets the offset that the stack has from the x value and repositions the\n             * label.\n             *\n             * @private\n             * @function Highcarts.StackItem#setOffset\n             * @param {number} xOffset\n             * @param {number} xWidth\n             * @param {number} [boxBottom]\n             * @param {number} [boxTop]\n             * @param {number} [defaultX]\n             */\n            StackItem.prototype.setOffset = function (xOffset, xWidth, boxBottom, boxTop, defaultX) {\n                var stackItem = this,\n                    axis = stackItem.axis,\n                    chart = axis.chart, \n                    // stack value translated mapped to chart coordinates\n                    y = axis.translate(axis.stacking.usePercentage ?\n                        100 :\n                        (boxTop ?\n                            boxTop :\n                            stackItem.total), 0, 0, 0, 1),\n                    yZero = axis.translate(boxBottom ? boxBottom : 0), // stack origin\n                    // stack height:\n                    h = defined(y) && Math.abs(y - yZero), \n                    // x position:\n                    x = pick(defaultX,\n                    chart.xAxis[0].translate(stackItem.x)) +\n                        xOffset,\n                    stackBox = defined(y) && stackItem.getStackBox(chart,\n                    stackItem,\n                    x,\n                    y,\n                    xWidth,\n                    h,\n                    axis),\n                    label = stackItem.label,\n                    isNegative = stackItem.isNegative,\n                    isJustify = pick(stackItem.options.overflow, 'justify') === 'justify',\n                    textAlign = stackItem.textAlign,\n                    visible;\n                if (label && stackBox) {\n                    var bBox = label.getBBox(),\n                        padding = label.padding,\n                        boxOffsetX,\n                        boxOffsetY;\n                    if (textAlign === 'left') {\n                        boxOffsetX = chart.inverted ? -padding : padding;\n                    }\n                    else if (textAlign === 'right') {\n                        boxOffsetX = bBox.width;\n                    }\n                    else {\n                        if (chart.inverted && textAlign === 'center') {\n                            boxOffsetX = bBox.width / 2;\n                        }\n                        else {\n                            boxOffsetX = chart.inverted ?\n                                (isNegative ? bBox.width + padding : -padding) : bBox.width / 2;\n                        }\n                    }\n                    boxOffsetY = chart.inverted ?\n                        bBox.height / 2 : (isNegative ? -padding : bBox.height);\n                    // Reset alignOptions property after justify #12337\n                    stackItem.alignOptions.x = pick(stackItem.options.x, 0);\n                    stackItem.alignOptions.y = pick(stackItem.options.y, 0);\n                    // Set the stackBox position\n                    stackBox.x -= boxOffsetX;\n                    stackBox.y -= boxOffsetY;\n                    // Align the label to the box\n                    label.align(stackItem.alignOptions, null, stackBox);\n                    // Check if label is inside the plotArea #12294\n                    if (chart.isInsidePlot(label.alignAttr.x + boxOffsetX - stackItem.alignOptions.x, label.alignAttr.y + boxOffsetY - stackItem.alignOptions.y)) {\n                        label.show();\n                    }\n                    else {\n                        // Move label away to avoid the overlapping issues\n                        label.alignAttr.y = -9999;\n                        isJustify = false;\n                    }\n                    if (isJustify) {\n                        // Justify stackLabel into the stackBox\n                        Series.prototype.justifyDataLabel.call(this.axis, label, stackItem.alignOptions, label.alignAttr, bBox, stackBox);\n                    }\n                    label.attr({\n                        x: label.alignAttr.x,\n                        y: label.alignAttr.y\n                    });\n                    if (pick(!isJustify && stackItem.options.crop, true)) {\n                        visible =\n                            isNumber(label.x) &&\n                                isNumber(label.y) &&\n                                chart.isInsidePlot(label.x - padding + label.width, label.y) &&\n                                chart.isInsidePlot(label.x + padding, label.y);\n                        if (!visible) {\n                            label.hide();\n                        }\n                    }\n                }\n            };\n            /**\n             * @private\n             * @function Highcharts.StackItem#getStackBox\n             *\n             * @param {Highcharts.Chart} chart\n             *\n             * @param {Highcharts.StackItem} stackItem\n             *\n             * @param {number} x\n             *\n             * @param {number} y\n             *\n             * @param {number} xWidth\n             *\n             * @param {number} h\n             *\n             * @param {Highcharts.Axis} axis\n             *\n             * @return {Highcharts.BBoxObject}\n             */\n            StackItem.prototype.getStackBox = function (chart, stackItem, x, y, xWidth, h, axis) {\n                var reversed = stackItem.axis.reversed,\n                    inverted = chart.inverted,\n                    axisPos = axis.height + axis.pos -\n                        (inverted ? chart.plotLeft : chart.plotTop),\n                    neg = (stackItem.isNegative && !reversed) ||\n                        (!stackItem.isNegative && reversed); // #4056\n                    return {\n                        x: inverted ? (neg ? y - axis.right : y - h + axis.pos - chart.plotLeft) :\n                            x + chart.xAxis[0].transB - chart.plotLeft,\n                        y: inverted ?\n                            axis.height - x - xWidth :\n                            (neg ?\n                                (axisPos - y - h) :\n                                axisPos - y),\n                        width: inverted ? h : xWidth,\n                        height: inverted ? xWidth : h\n                    };\n            };\n            return StackItem;\n        }());\n        /**\n         * Generate stacks for each series and calculate stacks total values\n         *\n         * @private\n         * @function Highcharts.Chart#getStacks\n         */\n        Chart.prototype.getStacks = function () {\n            var chart = this,\n                inverted = chart.inverted;\n            // reset stacks for each yAxis\n            chart.yAxis.forEach(function (axis) {\n                if (axis.stacking && axis.stacking.stacks && axis.hasVisibleSeries) {\n                    axis.stacking.oldStacks = axis.stacking.stacks;\n                }\n            });\n            chart.series.forEach(function (series) {\n                var xAxisOptions = series.xAxis && series.xAxis.options || {};\n                if (series.options.stacking &&\n                    (series.visible === true ||\n                        chart.options.chart.ignoreHiddenSeries === false)) {\n                    series.stackKey = [\n                        series.type,\n                        pick(series.options.stack, ''),\n                        inverted ? xAxisOptions.top : xAxisOptions.left,\n                        inverted ? xAxisOptions.height : xAxisOptions.width\n                    ].join(',');\n                }\n            });\n        };\n        // Stacking methods defined on the Axis prototype\n        StackingAxis.compose(Axis);\n        // Stacking methods defined for Series prototype\n        /**\n         * Set grouped points in a stack-like object. When `centerInCategory` is true,\n         * and `stacking` is not enabled, we need a pseudo (horizontal) stack in order\n         * to handle grouping of points within the same category.\n         *\n         * @private\n         * @function Highcharts.Series#setStackedPoints\n         * @return {void}\n         */\n        Series.prototype.setGroupedPoints = function () {\n            if (this.options.centerInCategory &&\n                (this.is('column') || this.is('columnrange')) &&\n                // With stacking enabled, we already have stacks that we can compute\n                // from\n                !this.options.stacking &&\n                // With only one series, we don't need to consider centerInCategory\n                this.chart.series.length > 1) {\n                Series.prototype.setStackedPoints.call(this, 'group');\n            }\n        };\n        /**\n         * Adds series' points value to corresponding stack\n         *\n         * @private\n         * @function Highcharts.Series#setStackedPoints\n         */\n        Series.prototype.setStackedPoints = function (stackingParam) {\n            var stacking = stackingParam || this.options.stacking;\n            if (!stacking ||\n                (this.visible !== true &&\n                    this.chart.options.chart.ignoreHiddenSeries !== false)) {\n                return;\n            }\n            var series = this, xData = series.processedXData, yData = series.processedYData, stackedYData = [], yDataLength = yData.length, seriesOptions = series.options, threshold = seriesOptions.threshold, stackThreshold = pick(seriesOptions.startFromThreshold && threshold, 0), stackOption = seriesOptions.stack, stackKey = stackingParam ? series.type + \",\" + stacking : series.stackKey, negKey = '-' + stackKey, negStacks = series.negStacks, yAxis = series.yAxis, stacks = yAxis.stacking.stacks, oldStacks = yAxis.stacking.oldStacks, stackIndicator, isNegative, stack, other, key, pointKey, i, x, y;\n            yAxis.stacking.stacksTouched += 1;\n            // loop over the non-null y values and read them into a local array\n            for (i = 0; i < yDataLength; i++) {\n                x = xData[i];\n                y = yData[i];\n                stackIndicator = series.getStackIndicator(stackIndicator, x, series.index);\n                pointKey = stackIndicator.key;\n                // Read stacked values into a stack based on the x value,\n                // the sign of y and the stack key. Stacking is also handled for null\n                // values (#739)\n                isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n                key = isNegative ? negKey : stackKey;\n                // Create empty object for this stack if it doesn't exist yet\n                if (!stacks[key]) {\n                    stacks[key] =\n                        {};\n                }\n                // Initialize StackItem for this x\n                if (!stacks[key][x]) {\n                    if (oldStacks[key] &&\n                        oldStacks[key][x]) {\n                        stacks[key][x] = oldStacks[key][x];\n                        stacks[key][x].total = null;\n                    }\n                    else {\n                        stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);\n                    }\n                }\n                // If the StackItem doesn't exist, create it first\n                stack = stacks[key][x];\n                if (y !== null) {\n                    stack.points[pointKey] = stack.points[series.index] =\n                        [pick(stack.cumulative, stackThreshold)];\n                    // Record the base of the stack\n                    if (!defined(stack.cumulative)) {\n                        stack.base = pointKey;\n                    }\n                    stack.touched = yAxis.stacking.stacksTouched;\n                    // In area charts, if there are multiple points on the same X value,\n                    // let the area fill the full span of those points\n                    if (stackIndicator.index > 0 && series.singleStacks === false) {\n                        stack.points[pointKey][0] =\n                            stack.points[series.index + ',' + x + ',0'][0];\n                    }\n                    // When updating to null, reset the point stack (#7493)\n                }\n                else {\n                    stack.points[pointKey] = stack.points[series.index] =\n                        null;\n                }\n                // Add value to the stack total\n                if (stacking === 'percent') {\n                    // Percent stacked column, totals are the same for the positive and\n                    // negative stacks\n                    other = isNegative ? stackKey : negKey;\n                    if (negStacks && stacks[other] && stacks[other][x]) {\n                        other = stacks[other][x];\n                        stack.total = other.total =\n                            Math.max(other.total, stack.total) +\n                                Math.abs(y) ||\n                                0;\n                        // Percent stacked areas\n                    }\n                    else {\n                        stack.total =\n                            correctFloat(stack.total + (Math.abs(y) || 0));\n                    }\n                }\n                else if (stacking === 'group') {\n                    // In this stack, the total is the number of valid points\n                    if (y !== null) {\n                        stack.total = (stack.total || 0) + 1;\n                    }\n                }\n                else {\n                    stack.total = correctFloat(stack.total + (y || 0));\n                }\n                if (stacking === 'group') {\n                    // This point's index within the stack, pushed to stack.points[1]\n                    stack.cumulative = (stack.total || 1) - 1;\n                }\n                else {\n                    stack.cumulative =\n                        pick(stack.cumulative, stackThreshold) + (y || 0);\n                }\n                if (y !== null) {\n                    stack.points[pointKey].push(stack.cumulative);\n                    stackedYData[i] = stack.cumulative;\n                    stack.hasValidPoints = true;\n                }\n            }\n            if (stacking === 'percent') {\n                yAxis.stacking.usePercentage = true;\n            }\n            if (stacking !== 'group') {\n                this.stackedYData = stackedYData; // To be used in getExtremes\n            }\n            // Reset old stacks\n            yAxis.stacking.oldStacks = {};\n        };\n        /**\n         * Iterate over all stacks and compute the absolute values to percent\n         *\n         * @private\n         * @function Highcharts.Series#modifyStacks\n         */\n        Series.prototype.modifyStacks = function () {\n            var series = this,\n                yAxis = series.yAxis,\n                stackKey = series.stackKey,\n                stacks = yAxis.stacking.stacks,\n                processedXData = series.processedXData,\n                stackIndicator,\n                stacking = series.options.stacking;\n            if (series[stacking + 'Stacker']) { // Modifier function exists\n                [stackKey, '-' + stackKey].forEach(function (key) {\n                    var i = processedXData.length,\n                        x,\n                        stack,\n                        pointExtremes;\n                    while (i--) {\n                        x = processedXData[i];\n                        stackIndicator = series.getStackIndicator(stackIndicator, x, series.index, key);\n                        stack = stacks[key] && stacks[key][x];\n                        pointExtremes =\n                            stack && stack.points[stackIndicator.key];\n                        if (pointExtremes) {\n                            series[stacking + 'Stacker'](pointExtremes, stack, i);\n                        }\n                    }\n                });\n            }\n        };\n        /**\n         * Modifier function for percent stacks. Blows up the stack to 100%.\n         *\n         * @private\n         * @function Highcharts.Series#percentStacker\n         * @param {Array<number>} pointExtremes\n         * @param {Highcharts.StackItem} stack\n         * @param {number} i\n         */\n        Series.prototype.percentStacker = function (pointExtremes, stack, i) {\n            var totalFactor = stack.total ? 100 / stack.total : 0;\n            // Y bottom value\n            pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n            // Y value\n            pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n            this.stackedYData[i] = pointExtremes[1];\n        };\n        /**\n         * Get stack indicator, according to it's x-value, to determine points with the\n         * same x-value\n         *\n         * @private\n         * @function Highcharts.Series#getStackIndicator\n         * @param {Highcharts.StackItemIndicatorObject|undefined} stackIndicator\n         * @param {number} x\n         * @param {number} index\n         * @param {string} [key]\n         * @return {Highcharts.StackItemIndicatorObject}\n         */\n        Series.prototype.getStackIndicator = function (stackIndicator, x, index, key) {\n            // Update stack indicator, when:\n            // first point in a stack || x changed || stack type (negative vs positive)\n            // changed:\n            if (!defined(stackIndicator) ||\n                stackIndicator.x !== x ||\n                (key && stackIndicator.key !== key)) {\n                stackIndicator = {\n                    x: x,\n                    index: 0,\n                    key: key\n                };\n            }\n            else {\n                (stackIndicator).index++;\n            }\n            stackIndicator.key =\n                [index, x, stackIndicator.index].join(',');\n            return stackIndicator;\n        };\n        H.StackItem = StackItem;\n\n        return H.StackItem;\n    });\n    _registerModule(_modules, 'parts/Dynamics.js', [_modules['parts/Axis.js'], _modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/Time.js'], _modules['parts/Utilities.js']], function (Axis, Chart, H, O, Point, Time, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var time = O.time;\n        var addEvent = U.addEvent,\n            animate = U.animate,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            erase = U.erase,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            setAnimation = U.setAnimation,\n            splat = U.splat;\n        var Series = H.Series,\n            seriesTypes = H.seriesTypes;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * Remove settings that have not changed, to avoid unnecessary rendering or\n         * computing (#9197).\n         * @private\n         */\n        H.cleanRecursively = function (newer, older) {\n            var result = {};\n            objectEach(newer, function (val, key) {\n                var ob;\n                // Dive into objects (except DOM nodes)\n                if (isObject(newer[key], true) &&\n                    !newer.nodeType && // #10044\n                    older[key]) {\n                    ob = H.cleanRecursively(newer[key], older[key]);\n                    if (Object.keys(ob).length) {\n                        result[key] = ob;\n                    }\n                    // Arrays, primitives and DOM nodes are copied directly\n                }\n                else if (isObject(newer[key]) ||\n                    newer[key] !== older[key]) {\n                    result[key] = newer[key];\n                }\n            });\n            return result;\n        };\n        // Extend the Chart prototype for dynamic methods\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n            /**\n             * Add a series to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initialized, add the series as a configuration\n             * option instead. With multiple axes, the `offset` is dynamically adjusted.\n             *\n             * @sample highcharts/members/chart-addseries/\n             *         Add a series from a button\n             * @sample stock/members/chart-addseries/\n             *         Add a series in Highstock\n             *\n             * @function Highcharts.Chart#addSeries\n             *\n             * @param {Highcharts.SeriesOptionsType} options\n             *        The config options for the series.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {Highcharts.Series}\n             *         The newly created series object.\n             *\n             * @fires Highcharts.Chart#event:addSeries\n             * @fires Highcharts.Chart#event:afterAddSeries\n             */\n            addSeries: function (options, redraw, animation) {\n                var series,\n                    chart = this;\n                if (options) { // <- not necessary\n                    redraw = pick(redraw, true); // defaults to true\n                    fireEvent(chart, 'addSeries', { options: options }, function () {\n                        series = chart.initSeries(options);\n                        chart.isDirtyLegend = true;\n                        chart.linkSeries();\n                        if (series.enabledDataSorting) {\n                            // We need to call `setData` after `linkSeries`\n                            series.setData(options.data, false);\n                        }\n                        fireEvent(chart, 'afterAddSeries', { series: series });\n                        if (redraw) {\n                            chart.redraw(animation);\n                        }\n                    });\n                }\n                return series;\n            },\n            /**\n             * Add an axis to the chart after render time. Note that this method should\n             * never be used when adding data synchronously at chart render time, as it\n             * adds expense to the calculations and rendering. When adding data at the\n             * same time as the chart is initialized, add the axis as a configuration\n             * option instead.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Chart#addAxis\n             *\n             * @param {Highcharts.AxisOptions} options\n             *        The axis options.\n             *\n             * @param {boolean} [isX=false]\n             *        Whether it is an X axis or a value axis.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation in the redraw.\n             *\n             * @return {Highcharts.Axis}\n             *         The newly generated Axis object.\n             */\n            addAxis: function (options, isX, redraw, animation) {\n                return this.createAxis(isX ? 'xAxis' : 'yAxis', { axis: options, redraw: redraw, animation: animation });\n            },\n            /**\n             * Add a color axis to the chart after render time. Note that this method\n             * should never be used when adding data synchronously at chart render time,\n             * as it adds expense to the calculations and rendering. When adding data at\n             * the same time as the chart is initialized, add the axis as a\n             * configuration option instead.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Chart#addColorAxis\n             *\n             * @param {Highcharts.ColorAxisOptions} options\n             *        The axis options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after adding.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether and how to apply animation in the redraw.\n             *\n             * @return {Highcharts.ColorAxis}\n             *         The newly generated Axis object.\n             */\n            addColorAxis: function (options, redraw, animation) {\n                return this.createAxis('colorAxis', { axis: options, redraw: redraw, animation: animation });\n            },\n            /**\n             * Factory for creating different axis types.\n             *\n             * @private\n             * @function Highcharts.Chart#createAxis\n             *\n             * @param {string} type\n             *        An axis type.\n             *\n             * @param {...Array<*>} arguments\n             *        All arguments for the constructor.\n             *\n             * @return {Highcharts.Axis | Highcharts.ColorAxis}\n             *         The newly generated Axis object.\n             */\n            createAxis: function (type, options) {\n                var chartOptions = this.options,\n                    isColorAxis = type === 'colorAxis',\n                    axisOptions = options.axis,\n                    redraw = options.redraw,\n                    animation = options.animation,\n                    userOptions = merge(axisOptions, {\n                        index: this[type].length,\n                        isX: type === 'xAxis'\n                    }),\n                    axis;\n                if (isColorAxis) {\n                    axis = new H.ColorAxis(this, userOptions);\n                }\n                else {\n                    axis = new Axis(this, userOptions);\n                }\n                // Push the new axis options to the chart options\n                chartOptions[type] = splat(chartOptions[type] || {});\n                chartOptions[type].push(userOptions);\n                if (isColorAxis) {\n                    this.isDirtyLegend = true;\n                    // Clear before 'bindAxes' (#11924)\n                    this.axes.forEach(function (axis) {\n                        axis.series = [];\n                    });\n                    this.series.forEach(function (series) {\n                        series.bindAxes();\n                        series.isDirtyData = true;\n                    });\n                }\n                if (pick(redraw, true)) {\n                    this.redraw(animation);\n                }\n                return axis;\n            },\n            /**\n             * Dim the chart and show a loading text or symbol. Options for the loading\n             * screen are defined in {@link\n             * https://api.highcharts.com/highcharts/loading|the loading options}.\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample highcharts/members/chart-showloading/\n             *         Apply different text labels\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             *\n             * @function Highcharts.Chart#showLoading\n             *\n             * @param {string} [str]\n             *        An optional text to show in the loading label instead of the\n             *        default one. The default text is set in\n             *        [lang.loading](https://api.highcharts.com/highcharts/lang.loading).\n             */\n            showLoading: function (str) {\n                var chart = this,\n                    options = chart.options,\n                    loadingDiv = chart.loadingDiv,\n                    loadingOptions = options.loading,\n                    setLoadingSize = function () {\n                        if (loadingDiv) {\n                            css(loadingDiv, {\n                                left: chart.plotLeft + 'px',\n                                top: chart.plotTop + 'px',\n                                width: chart.plotWidth + 'px',\n                                height: chart.plotHeight + 'px'\n                            });\n                    }\n                };\n                // create the layer at the first call\n                if (!loadingDiv) {\n                    chart.loadingDiv = loadingDiv = createElement('div', {\n                        className: 'highcharts-loading highcharts-loading-hidden'\n                    }, null, chart.container);\n                    chart.loadingSpan = createElement('span', { className: 'highcharts-loading-inner' }, null, loadingDiv);\n                    addEvent(chart, 'redraw', setLoadingSize); // #1080\n                }\n                loadingDiv.className = 'highcharts-loading';\n                // Update text\n                chart.loadingSpan.innerHTML =\n                    pick(str, options.lang.loading, '');\n                if (!chart.styledMode) {\n                    // Update visuals\n                    css(loadingDiv, extend(loadingOptions.style, {\n                        zIndex: 10\n                    }));\n                    css(chart.loadingSpan, loadingOptions.labelStyle);\n                    // Show it\n                    if (!chart.loadingShown) {\n                        css(loadingDiv, {\n                            opacity: 0,\n                            display: ''\n                        });\n                        animate(loadingDiv, {\n                            opacity: loadingOptions.style.opacity || 0.5\n                        }, {\n                            duration: loadingOptions.showDuration || 0\n                        });\n                    }\n                }\n                chart.loadingShown = true;\n                setLoadingSize();\n            },\n            /**\n             * Hide the loading layer.\n             *\n             * @see Highcharts.Chart#showLoading\n             *\n             * @sample highcharts/members/chart-hideloading/\n             *         Show and hide loading from a button\n             * @sample stock/members/chart-show-hide-loading/\n             *         Toggle loading in Highstock\n             *\n             * @function Highcharts.Chart#hideLoading\n             */\n            hideLoading: function () {\n                var options = this.options,\n                    loadingDiv = this.loadingDiv;\n                if (loadingDiv) {\n                    loadingDiv.className =\n                        'highcharts-loading highcharts-loading-hidden';\n                    if (!this.styledMode) {\n                        animate(loadingDiv, {\n                            opacity: 0\n                        }, {\n                            duration: options.loading.hideDuration || 100,\n                            complete: function () {\n                                css(loadingDiv, { display: 'none' });\n                            }\n                        });\n                    }\n                }\n                this.loadingShown = false;\n            },\n            /**\n             * These properties cause isDirtyBox to be set to true when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireDirtyBox: [\n                'backgroundColor',\n                'borderColor',\n                'borderWidth',\n                'borderRadius',\n                'plotBackgroundColor',\n                'plotBackgroundImage',\n                'plotBorderColor',\n                'plotBorderWidth',\n                'plotShadow',\n                'shadow'\n            ],\n            /**\n             * These properties require a full reflow of chart elements, best\n             * implemented through running `Chart.setSize` internally (#8190).\n             * @type {Array}\n             */\n            propsRequireReflow: [\n                'margin',\n                'marginTop',\n                'marginRight',\n                'marginBottom',\n                'marginLeft',\n                'spacing',\n                'spacingTop',\n                'spacingRight',\n                'spacingBottom',\n                'spacingLeft'\n            ],\n            /**\n             * These properties cause all series to be updated when updating. Can be\n             * extended from plugins.\n             */\n            propsRequireUpdateSeries: [\n                'chart.inverted',\n                'chart.polar',\n                'chart.ignoreHiddenSeries',\n                'chart.type',\n                'colors',\n                'plotOptions',\n                'time',\n                'tooltip'\n            ],\n            /**\n             * These collections (arrays) implement update() methods with support for\n             * one-to-one option.\n             */\n            collectionsWithUpdate: [\n                'xAxis',\n                'yAxis',\n                'zAxis',\n                'series'\n            ],\n            /**\n             * A generic function to update any element of the chart. Elements can be\n             * enabled and disabled, moved, re-styled, re-formatted etc.\n             *\n             * A special case is configuration objects that take arrays, for example\n             * [xAxis](https://api.highcharts.com/highcharts/xAxis),\n             * [yAxis](https://api.highcharts.com/highcharts/yAxis) or\n             * [series](https://api.highcharts.com/highcharts/series). For these\n             * collections, an `id` option is used to map the new option set to an\n             * existing object. If an existing object of the same id is not found, the\n             * corresponding item is updated. So for example, running `chart.update`\n             * with a series item without an id, will cause the existing chart's series\n             * with the same index in the series array to be updated. When the\n             * `oneToOne` parameter is true, `chart.update` will also take care of\n             * adding and removing items from the collection. Read more under the\n             * parameter description below.\n             *\n             * Note that when changing series data, `chart.update` may mutate the passed\n             * data options.\n             *\n             * See also the\n             * [responsive option set](https://api.highcharts.com/highcharts/responsive).\n             * Switching between `responsive.rules` basically runs `chart.update` under\n             * the hood.\n             *\n             * @sample highcharts/members/chart-update/\n             *         Update chart geometry\n             *\n             * @function Highcharts.Chart#update\n             *\n             * @param {Highcharts.Options} options\n             *        A configuration object for the new chart options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart.\n             *\n             * @param {boolean} [oneToOne=false]\n             *        When `true`, the `series`, `xAxis`, `yAxis` and `annotations`\n             *        collections will be updated one to one, and items will be either\n             *        added or removed to match the new updated options. For example,\n             *        if the chart has two series and we call `chart.update` with a\n             *        configuration containing three series, one will be added. If we\n             *        call `chart.update` with one series, one will be removed. Setting\n             *        an empty `series` array will remove all series, but leaving out\n             *        the`series` property will leave all series untouched. If the\n             *        series have id's, the new series options will be matched by id,\n             *        and the remaining ones removed.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @fires Highcharts.Chart#event:update\n             * @fires Highcharts.Chart#event:afterUpdate\n             */\n            update: function (options, redraw, oneToOne, animation) {\n                var chart = this,\n                    adders = {\n                        credits: 'addCredits',\n                        title: 'setTitle',\n                        subtitle: 'setSubtitle',\n                        caption: 'setCaption'\n                    },\n                    optionsChart,\n                    updateAllAxes,\n                    updateAllSeries,\n                    newWidth,\n                    newHeight,\n                    runSetSize,\n                    isResponsiveOptions = options.isResponsiveOptions,\n                    itemsForRemoval = [];\n                fireEvent(chart, 'update', { options: options });\n                // If there are responsive rules in action, undo the responsive rules\n                // before we apply the updated options and replay the responsive rules\n                // on top from the chart.redraw function (#9617).\n                if (!isResponsiveOptions) {\n                    chart.setResponsive(false, true);\n                }\n                options = H.cleanRecursively(options, chart.options);\n                merge(true, chart.userOptions, options);\n                // If the top-level chart option is present, some special updates are\n                // required\n                optionsChart = options.chart;\n                if (optionsChart) {\n                    merge(true, chart.options.chart, optionsChart);\n                    // Setter function\n                    if ('className' in optionsChart) {\n                        chart.setClassName(optionsChart.className);\n                    }\n                    if ('reflow' in optionsChart) {\n                        chart.setReflow(optionsChart.reflow);\n                    }\n                    if ('inverted' in optionsChart ||\n                        'polar' in optionsChart ||\n                        'type' in optionsChart) {\n                        // Parse options.chart.inverted and options.chart.polar together\n                        // with the available series.\n                        chart.propFromSeries();\n                        updateAllAxes = true;\n                    }\n                    if ('alignTicks' in optionsChart) { // #6452\n                        updateAllAxes = true;\n                    }\n                    objectEach(optionsChart, function (val, key) {\n                        if (chart.propsRequireUpdateSeries.indexOf('chart.' + key) !==\n                            -1) {\n                            updateAllSeries = true;\n                        }\n                        // Only dirty box\n                        if (chart.propsRequireDirtyBox.indexOf(key) !== -1) {\n                            chart.isDirtyBox = true;\n                        }\n                        // Chart setSize\n                        if (chart.propsRequireReflow.indexOf(key) !== -1) {\n                            if (isResponsiveOptions) {\n                                chart.isDirtyBox = true;\n                            }\n                            else {\n                                runSetSize = true;\n                            }\n                        }\n                    });\n                    if (!chart.styledMode && 'style' in optionsChart) {\n                        chart.renderer.setStyle(optionsChart.style);\n                    }\n                }\n                // Moved up, because tooltip needs updated plotOptions (#6218)\n                if (!chart.styledMode && options.colors) {\n                    this.options.colors = options.colors;\n                }\n                if (options.plotOptions) {\n                    merge(true, this.options.plotOptions, options.plotOptions);\n                }\n                // Maintaining legacy global time. If the chart is instanciated first\n                // with global time, then updated with time options, we need to create a\n                // new Time instance to avoid mutating the global time (#10536).\n                if (options.time && this.time === time) {\n                    this.time = new Time(options.time);\n                }\n                // Some option stuctures correspond one-to-one to chart objects that\n                // have update methods, for example\n                // options.credits => chart.credits\n                // options.legend => chart.legend\n                // options.title => chart.title\n                // options.tooltip => chart.tooltip\n                // options.subtitle => chart.subtitle\n                // options.mapNavigation => chart.mapNavigation\n                // options.navigator => chart.navigator\n                // options.scrollbar => chart.scrollbar\n                objectEach(options, function (val, key) {\n                    if (chart[key] &&\n                        typeof chart[key].update === 'function') {\n                        chart[key].update(val, false);\n                        // If a one-to-one object does not exist, look for an adder function\n                    }\n                    else if (typeof chart[adders[key]] === 'function') {\n                        chart[adders[key]](val);\n                    }\n                    if (key !== 'chart' &&\n                        chart.propsRequireUpdateSeries.indexOf(key) !== -1) {\n                        updateAllSeries = true;\n                    }\n                });\n                // Setters for collections. For axes and series, each item is referred\n                // by an id. If the id is not found, it defaults to the corresponding\n                // item in the collection, so setting one series without an id, will\n                // update the first series in the chart. Setting two series without\n                // an id will update the first and the second respectively (#6019)\n                // chart.update and responsive.\n                this.collectionsWithUpdate.forEach(function (coll) {\n                    var indexMap;\n                    if (options[coll]) {\n                        // In stock charts, the navigator series are also part of the\n                        // chart.series array, but those series should not be handled\n                        // here (#8196).\n                        if (coll === 'series') {\n                            indexMap = [];\n                            chart[coll].forEach(function (s, i) {\n                                if (!s.options.isInternal) {\n                                    indexMap.push(pick(s.options.index, i));\n                                }\n                            });\n                        }\n                        splat(options[coll]).forEach(function (newOptions, i) {\n                            var hasId = defined(newOptions.id);\n                            var item;\n                            // Match by id\n                            if (hasId) {\n                                item = chart.get(newOptions.id);\n                            }\n                            // No match by id found, match by index instead\n                            if (!item) {\n                                item = chart[coll][indexMap ? indexMap[i] : i];\n                                // Check if we grabbed an item with an exising but\n                                // different id (#13541)\n                                if (item && hasId && defined(item.options.id)) {\n                                    item = void 0;\n                                }\n                            }\n                            if (item && item.coll === coll) {\n                                item.update(newOptions, false);\n                                if (oneToOne) {\n                                    item.touched = true;\n                                }\n                            }\n                            // If oneToOne and no matching item is found, add one\n                            if (!item && oneToOne && chart.collectionsWithInit[coll]) {\n                                chart.collectionsWithInit[coll][0].apply(chart, \n                                // [newOptions, ...extraArguments, redraw=false]\n                                [\n                                    newOptions\n                                ].concat(\n                                // Not all initializers require extra args\n                                chart.collectionsWithInit[coll][1] || []).concat([\n                                    false\n                                ])).touched = true;\n                            }\n                        });\n                        // Add items for removal\n                        if (oneToOne) {\n                            chart[coll].forEach(function (item) {\n                                if (!item.touched && !item.options.isInternal) {\n                                    itemsForRemoval.push(item);\n                                }\n                                else {\n                                    delete item.touched;\n                                }\n                            });\n                        }\n                    }\n                });\n                itemsForRemoval.forEach(function (item) {\n                    if (item.remove) {\n                        item.remove(false);\n                    }\n                });\n                if (updateAllAxes) {\n                    chart.axes.forEach(function (axis) {\n                        axis.update({}, false);\n                    });\n                }\n                // Certain options require the whole series structure to be thrown away\n                // and rebuilt\n                if (updateAllSeries) {\n                    chart.getSeriesOrderByLinks().forEach(function (series) {\n                        // Avoid removed navigator series\n                        if (series.chart) {\n                            series.update({}, false);\n                        }\n                    }, this);\n                }\n                // For loading, just update the options, do not redraw\n                if (options.loading) {\n                    merge(true, chart.options.loading, options.loading);\n                }\n                // Update size. Redraw is forced.\n                newWidth = optionsChart && optionsChart.width;\n                newHeight = optionsChart && optionsChart.height;\n                if (isString(newHeight)) {\n                    newHeight = relativeLength(newHeight, newWidth || chart.chartWidth);\n                }\n                if (\n                // In this case, run chart.setSize with newWidth and newHeight which\n                // are undefined, only for reflowing chart elements because margin\n                // or spacing has been set (#8190)\n                runSetSize ||\n                    // In this case, the size is actually set\n                    (isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n                    (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n                    chart.setSize(newWidth, newHeight, animation);\n                }\n                else if (pick(redraw, true)) {\n                    chart.redraw(animation);\n                }\n                fireEvent(chart, 'afterUpdate', {\n                    options: options,\n                    redraw: redraw,\n                    animation: animation\n                });\n            },\n            /**\n             * Shortcut to set the subtitle options. This can also be done from {@link\n             * Chart#update} or {@link Chart#setTitle}.\n             *\n             * @function Highcharts.Chart#setSubtitle\n             *\n             * @param {Highcharts.SubtitleOptions} options\n             *        New subtitle options. The subtitle text itself is set by the\n             *        `options.text` property.\n             */\n            setSubtitle: function (options, redraw) {\n                this.applyDescription('subtitle', options);\n                this.layOutTitles(redraw);\n            },\n            /**\n             * Set the caption options. This can also be done from {@link\n             * Chart#update}.\n             *\n             * @function Highcharts.Chart#setCaption\n             *\n             * @param {Highcharts.CaptionOptions} options\n             *        New caption options. The caption text itself is set by the\n             *        `options.text` property.\n             */\n            setCaption: function (options, redraw) {\n                this.applyDescription('caption', options);\n                this.layOutTitles(redraw);\n            }\n        });\n        /**\n         * These collections (arrays) implement `Chart.addSomethig` method used in\n         * chart.update() to create new object in the collection. Equivalent for\n         * deleting is resolved by simple `Somethig.remove()`.\n         *\n         * Note: We need to define these references after initializers are bound to\n         * chart's prototype.\n         */\n        Chart.prototype.collectionsWithInit = {\n            // collectionName: [ initializingMethod, [extraArguments] ]\n            xAxis: [Chart.prototype.addAxis, [true]],\n            yAxis: [Chart.prototype.addAxis, [false]],\n            series: [Chart.prototype.addSeries]\n        };\n        // extend the Point prototype for dynamic methods\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Update point with new options (typically x/y data) and optionally redraw\n             * the series.\n             *\n             * @sample highcharts/members/point-update-column/\n             *         Update column value\n             * @sample highcharts/members/point-update-pie/\n             *         Update pie slice\n             * @sample maps/members/point-update/\n             *         Update map area value in Highmaps\n             *\n             * @function Highcharts.Point#update\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options. Point options are handled as described under\n             *        the `series.type.data` item for each series type. For example\n             *        for a line series, if options is a single number, the point will\n             *        be given that number as the marin y value. If it is an array, it\n             *        will be interpreted as x and y values respectively. If it is an\n             *        object, advanced options are applied.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is updated. If doing\n             *        more operations on the chart, it is best practice to set\n             *        `redraw` to false and call `chart.redraw()` after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=true]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:update\n             */\n            update: function (options, redraw, animation, runEvent) {\n                var point = this,\n                    series = point.series,\n                    graphic = point.graphic,\n                    i,\n                    chart = series.chart,\n                    seriesOptions = series.options;\n                redraw = pick(redraw, true);\n                /**\n                 * @private\n                 */\n                function update() {\n                    point.applyOptions(options);\n                    // Update visuals, #4146\n                    // Handle dummy graphic elements for a11y, #12718\n                    var hasDummyGraphic = graphic && point.hasDummyGraphic;\n                    var shouldDestroyGraphic = point.y === null ? !hasDummyGraphic : hasDummyGraphic;\n                    if (graphic && shouldDestroyGraphic) {\n                        point.graphic = graphic.destroy();\n                        delete point.hasDummyGraphic;\n                    }\n                    if (isObject(options, true)) {\n                        // Destroy so we can get new elements\n                        if (graphic && graphic.element) {\n                            // \"null\" is also a valid symbol\n                            if (options &&\n                                options.marker &&\n                                typeof options.marker.symbol !== 'undefined') {\n                                point.graphic = graphic.destroy();\n                            }\n                        }\n                        if (options && options.dataLabels && point.dataLabel) {\n                            point.dataLabel = point.dataLabel.destroy(); // #2468\n                        }\n                        if (point.connector) {\n                            point.connector = point.connector.destroy(); // #7243\n                        }\n                    }\n                    // record changes in the parallel arrays\n                    i = point.index;\n                    series.updateParallelArrays(point, i);\n                    // Record the options to options.data. If the old or the new config\n                    // is an object, use point options, otherwise use raw options\n                    // (#4701, #4916).\n                    seriesOptions.data[i] = (isObject(seriesOptions.data[i], true) ||\n                        isObject(options, true)) ?\n                        point.options :\n                        pick(options, seriesOptions.data[i]);\n                    // redraw\n                    series.isDirty = series.isDirtyData = true;\n                    if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n                        chart.isDirtyBox = true;\n                    }\n                    if (seriesOptions.legendType === 'point') { // #1831, #1885\n                        chart.isDirtyLegend = true;\n                    }\n                    if (redraw) {\n                        chart.redraw(animation);\n                    }\n                }\n                // Fire the event with a default handler of doing the update\n                if (runEvent === false) { // When called from setData\n                    update();\n                }\n                else {\n                    point.firePointEvent('update', { options: options }, update);\n                }\n            },\n            /**\n             * Remove a point and optionally redraw the series and if necessary the axes\n             *\n             * @sample highcharts/plotoptions/series-point-events-remove/\n             *         Remove point and confirm\n             * @sample highcharts/members/point-remove/\n             *         Remove pie slice\n             * @sample maps/members/point-remove/\n             *         Remove selected points in Highmaps\n             *\n             * @function Highcharts.Point#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call. When\n             *        doing more operations on the chart, for example running\n             *        `point.remove()` in a loop, it is best practice to set `redraw`\n             *        to false and call `chart.redraw()` after.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation=false]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @return {void}\n             */\n            remove: function (redraw, animation) {\n                this.series.removePoint(this.series.data.indexOf(this), redraw, animation);\n            }\n        });\n        // Extend the series prototype for dynamic methods\n        extend(Series.prototype, /** @lends Series.prototype */ {\n            /**\n             * Add a point to the series after render time. The point can be added at\n             * the end, or by giving it an X value, to the start or in the middle of the\n             * series.\n             *\n             * @sample highcharts/members/series-addpoint-append/\n             *         Append point\n             * @sample highcharts/members/series-addpoint-append-and-shift/\n             *         Append and shift\n             * @sample highcharts/members/series-addpoint-x-and-y/\n             *         Both X and Y values given\n             * @sample highcharts/members/series-addpoint-pie/\n             *         Append pie slice\n             * @sample stock/members/series-addpoint/\n             *         Append 100 points in Highstock\n             * @sample stock/members/series-addpoint-shift/\n             *         Append and shift in Highstock\n             * @sample maps/members/series-addpoint/\n             *         Add a point in Highmaps\n             *\n             * @function Highcharts.Series#addPoint\n             *\n             * @param {Highcharts.PointOptionsType} options\n             *        The point options. If options is a single number, a point with\n             *        that y value is appended to the series. If it is an array, it will\n             *        be interpreted as x and y values respectively. If it is an\n             *        object, advanced options as outlined under `series.data` are\n             *        applied.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is added. When adding\n             *        more than one point, it is highly recommended that the redraw\n             *        option be set to false, and instead {@link Chart#redraw} is\n             *        explicitly called after the adding of points is finished.\n             *        Otherwise, the chart will redraw after adding each point.\n             *\n             * @param {boolean} [shift=false]\n             *        If true, a point is shifted off the start of the series as one is\n             *        appended to the end.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @param {boolean} [withEvent=true]\n             *        Used internally, whether to fire the series `addPoint` event.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:addPoint\n             */\n            addPoint: function (options, redraw, shift, animation, withEvent) {\n                var series = this,\n                    seriesOptions = series.options,\n                    data = series.data,\n                    chart = series.chart,\n                    xAxis = series.xAxis,\n                    names = xAxis && xAxis.hasNames && xAxis.names,\n                    dataOptions = seriesOptions.data,\n                    point,\n                    xData = series.xData,\n                    isInTheMiddle,\n                    i,\n                    x;\n                // Optional redraw, defaults to true\n                redraw = pick(redraw, true);\n                // Get options and push the point to xData, yData and series.options. In\n                // series.generatePoints the Point instance will be created on demand\n                // and pushed to the series.data array.\n                point = { series: series };\n                series.pointClass.prototype.applyOptions.apply(point, [options]);\n                x = point.x;\n                // Get the insertion point\n                i = xData.length;\n                if (series.requireSorting && x < xData[i - 1]) {\n                    isInTheMiddle = true;\n                    while (i && xData[i - 1] > x) {\n                        i--;\n                    }\n                }\n                // Insert undefined item\n                series.updateParallelArrays(point, 'splice', i, 0, 0);\n                // Update it\n                series.updateParallelArrays(point, i);\n                if (names && point.name) {\n                    names[x] = point.name;\n                }\n                dataOptions.splice(i, 0, options);\n                if (isInTheMiddle) {\n                    series.data.splice(i, 0, null);\n                    series.processData();\n                }\n                // Generate points to be added to the legend (#1329)\n                if (seriesOptions.legendType === 'point') {\n                    series.generatePoints();\n                }\n                // Shift the first point off the parallel arrays\n                if (shift) {\n                    if (data[0] && data[0].remove) {\n                        data[0].remove(false);\n                    }\n                    else {\n                        data.shift();\n                        series.updateParallelArrays(point, 'shift');\n                        dataOptions.shift();\n                    }\n                }\n                // Fire event\n                if (withEvent !== false) {\n                    fireEvent(series, 'addPoint', { point: point });\n                }\n                // redraw\n                series.isDirty = true;\n                series.isDirtyData = true;\n                if (redraw) {\n                    chart.redraw(animation); // Animation is set anyway on redraw, #5665\n                }\n            },\n            /**\n             * Remove a point from the series. Unlike the\n             * {@link Highcharts.Point#remove} method, this can also be done on a point\n             * that is not instanciated because it is outside the view or subject to\n             * Highstock data grouping.\n             *\n             * @sample highcharts/members/series-removepoint/\n             *         Remove cropped point\n             *\n             * @function Highcharts.Series#removePoint\n             *\n             * @param {number} i\n             *        The index of the point in the {@link Highcharts.Series.data|data}\n             *        array.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the point is added. When\n             *        removing more than one point, it is highly recommended that the\n             *        `redraw` option be set to `false`, and instead {@link\n             *        Highcharts.Chart#redraw} is explicitly called after the adding of\n             *        points is finished.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether and optionally how the series should be animated.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Point#event:remove\n             */\n            removePoint: function (i, redraw, animation) {\n                var series = this,\n                    data = series.data,\n                    point = data[i],\n                    points = series.points,\n                    chart = series.chart,\n                    remove = function () {\n                        if (points && points.length === data.length) { // #4935\n                            points.splice(i, 1);\n                    }\n                    data.splice(i, 1);\n                    series.options.data.splice(i, 1);\n                    series.updateParallelArrays(point || { series: series }, 'splice', i, 1);\n                    if (point) {\n                        point.destroy();\n                    }\n                    // redraw\n                    series.isDirty = true;\n                    series.isDirtyData = true;\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                };\n                setAnimation(animation, chart);\n                redraw = pick(redraw, true);\n                // Fire the event with a default handler of removing the point\n                if (point) {\n                    point.firePointEvent('remove', null, remove);\n                }\n                else {\n                    remove();\n                }\n            },\n            /**\n             * Remove a series and optionally redraw the chart.\n             *\n             * @sample highcharts/members/series-remove/\n             *         Remove first series from a button\n             *\n             * @function Highcharts.Series#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart or wait for an explicit call to\n             *        {@link Highcharts.Chart#redraw}.\n             *\n             * @param {boolean|Highcharts.AnimationOptionsObject} [animation]\n             *        Whether to apply animation, and optionally animation\n             *        configuration.\n             *\n             * @param {boolean} [withEvent=true]\n             *        Used internally, whether to fire the series `remove` event.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:remove\n             */\n            remove: function (redraw, animation, withEvent, keepEvents) {\n                var series = this,\n                    chart = series.chart;\n                /**\n                 * @private\n                 */\n                function remove() {\n                    // Destroy elements\n                    series.destroy(keepEvents);\n                    series.remove = null; // Prevent from doing again (#9097)\n                    // Redraw\n                    chart.isDirtyLegend = chart.isDirtyBox = true;\n                    chart.linkSeries();\n                    if (pick(redraw, true)) {\n                        chart.redraw(animation);\n                    }\n                }\n                // Fire the event with a default handler of removing the point\n                if (withEvent !== false) {\n                    fireEvent(series, 'remove', null, remove);\n                }\n                else {\n                    remove();\n                }\n            },\n            /**\n             * Update the series with a new set of options. For a clean and precise\n             * handling of new options, all methods and elements from the series are\n             * removed, and it is initialized from scratch. Therefore, this method is\n             * more performance expensive than some other utility methods like {@link\n             * Series#setData} or {@link Series#setVisible}.\n             *\n             * Note that `Series.update` may mutate the passed `data` options.\n             *\n             * @sample highcharts/members/series-update/\n             *         Updating series options\n             * @sample maps/members/series-update/\n             *         Update series options in Highmaps\n             *\n             * @function Highcharts.Series#update\n             *\n             * @param {Highcharts.SeriesOptionsType} options\n             *        New options that will be merged with the series' existing options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the series is altered. If doing\n             *        more operations on the chart, it is a good idea to set redraw to\n             *        false and call {@link Chart#redraw} after.\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:update\n             * @fires Highcharts.Series#event:afterUpdate\n             */\n            update: function (options, redraw) {\n                options = H.cleanRecursively(options, this.userOptions);\n                fireEvent(this, 'update', { options: options });\n                var series = this,\n                    chart = series.chart, \n                    // must use user options when changing type because series.options\n                    // is merged in with type specific plotOptions\n                    oldOptions = series.userOptions,\n                    seriesOptions,\n                    initialType = series.initialType || series.type,\n                    newType = (options.type ||\n                        oldOptions.type ||\n                        chart.options.chart.type),\n                    keepPoints = !(\n                    // Indicators, histograms etc recalculate the data. It should be\n                    // possible to omit this.\n                    this.hasDerivedData ||\n                        // Changes to data grouping requires new points in new groups\n                        options.dataGrouping ||\n                        // New type requires new point classes\n                        (newType && newType !== this.type) ||\n                        // New options affecting how the data points are built\n                        typeof options.pointStart !== 'undefined' ||\n                        options.pointInterval ||\n                        options.pointIntervalUnit ||\n                        options.keys),\n                    initialSeriesProto = seriesTypes[initialType].prototype,\n                    n,\n                    groups = [\n                        'group',\n                        'markerGroup',\n                        'dataLabelsGroup',\n                        'transformGroup'\n                    ],\n                    preserve = [\n                        'eventOptions',\n                        'navigatorSeries',\n                        'baseSeries'\n                    ], \n                    // Animation must be enabled when calling update before the initial\n                    // animation has first run. This happens when calling update\n                    // directly after chart initialization, or when applying responsive\n                    // rules (#6912).\n                    animation = series.finishedAnimating && { animation: false },\n                    kinds = {};\n                if (keepPoints) {\n                    preserve.push('data', 'isDirtyData', 'points', 'processedXData', 'processedYData', 'xIncrement', 'cropped', '_hasPointMarkers', '_hasPointLabels', \n                    // Map specific, consider moving it to series-specific preserve-\n                    // properties (#10617)\n                    'mapMap', 'mapData', 'minY', 'maxY', 'minX', 'maxX');\n                    if (options.visible !== false) {\n                        preserve.push('area', 'graph');\n                    }\n                    series.parallelArrays.forEach(function (key) {\n                        preserve.push(key + 'Data');\n                    });\n                    if (options.data) {\n                        // setData uses dataSorting options so we need to update them\n                        // earlier\n                        if (options.dataSorting) {\n                            extend(series.options.dataSorting, options.dataSorting);\n                        }\n                        this.setData(options.data, false);\n                    }\n                }\n                // Do the merge, with some forced options\n                options = merge(oldOptions, animation, {\n                    // When oldOptions.index is null it should't be cleared.\n                    // Otherwise navigator series will have wrong indexes (#10193).\n                    index: typeof oldOptions.index === 'undefined' ?\n                        series.index : oldOptions.index,\n                    pointStart: pick(\n                    // when updating from blank (#7933)\n                    oldOptions.pointStart, \n                    // when updating after addPoint\n                    series.xData[0])\n                }, (!keepPoints && { data: series.options.data }), options);\n                // Merge does not merge arrays, but replaces them. Since points were\n                // updated, `series.options.data` has correct merged options, use it:\n                if (keepPoints && options.data) {\n                    options.data = series.options.data;\n                }\n                // Make sure preserved properties are not destroyed (#3094)\n                preserve = groups.concat(preserve);\n                preserve.forEach(function (prop) {\n                    preserve[prop] = series[prop];\n                    delete series[prop];\n                });\n                // Destroy the series and delete all properties. Reinsert all\n                // methods and properties from the new type prototype (#2270,\n                // #3719).\n                series.remove(false, null, false, true);\n                for (n in initialSeriesProto) { // eslint-disable-line guard-for-in\n                    series[n] = void 0;\n                }\n                if (seriesTypes[newType || initialType]) {\n                    extend(series, seriesTypes[newType || initialType].prototype);\n                }\n                else {\n                    error(17, true, chart, { missingModuleFor: (newType || initialType) });\n                }\n                // Re-register groups (#3094) and other preserved properties\n                preserve.forEach(function (prop) {\n                    series[prop] = preserve[prop];\n                });\n                series.init(chart, options);\n                // Remove particular elements of the points. Check `series.options`\n                // because we need to consider the options being set on plotOptions as\n                // well.\n                if (keepPoints && this.points) {\n                    seriesOptions = series.options;\n                    // What kind of elements to destroy\n                    if (seriesOptions.visible === false) {\n                        kinds.graphic = 1;\n                        kinds.dataLabel = 1;\n                    }\n                    else if (!series._hasPointLabels) {\n                        var marker = seriesOptions.marker,\n                            dataLabels = seriesOptions.dataLabels;\n                        if (marker && (marker.enabled === false ||\n                            'symbol' in marker // #10870\n                        )) {\n                            kinds.graphic = 1;\n                        }\n                        if (dataLabels &&\n                            dataLabels.enabled === false) {\n                            kinds.dataLabel = 1;\n                        }\n                    }\n                    this.points.forEach(function (point) {\n                        if (point && point.series) {\n                            point.resolveColor();\n                            // Destroy elements in order to recreate based on updated\n                            // series options.\n                            if (Object.keys(kinds).length) {\n                                point.destroyElements(kinds);\n                            }\n                            if (seriesOptions.showInLegend === false &&\n                                point.legendItem) {\n                                chart.legend.destroyItem(point);\n                            }\n                        }\n                    }, this);\n                }\n                series.initialType = initialType;\n                chart.linkSeries(); // Links are lost in series.remove (#3028)\n                fireEvent(this, 'afterUpdate');\n                if (pick(redraw, true)) {\n                    chart.redraw(keepPoints ? void 0 : false);\n                }\n            },\n            /**\n             * Used from within series.update\n             *\n             * @private\n             * @function Highcharts.Series#setName\n             *\n             * @param {string} name\n             *\n             * @return {void}\n             */\n            setName: function (name) {\n                this.name = this.options.name = this.userOptions.name = name;\n                this.chart.isDirtyLegend = true;\n            }\n        });\n        // Extend the Axis.prototype for dynamic methods\n        extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n            /**\n             * Update an axis object with a new set of options. The options are merged\n             * with the existing options, so only new or altered options need to be\n             * specified.\n             *\n             * @sample highcharts/members/axis-update/\n             *         Axis update demo\n             *\n             * @function Highcharts.Axis#update\n             *\n             * @param {Highcharts.AxisOptions} options\n             *        The new options that will be merged in with existing options on\n             *        the axis.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after the axis is altered. If doing\n             *        more operations on the chart, it is a good idea to set redraw to\n             *        false and call {@link Chart#redraw} after.\n             *\n             * @return {void}\n             */\n            update: function (options, redraw) {\n                var chart = this.chart,\n                    newEvents = ((options && options.events) || {});\n                options = merge(this.userOptions, options);\n                // Color Axis is not an array,\n                // This change is applied in the ColorAxis wrapper\n                if (chart.options[this.coll].indexOf) {\n                    // Don't use this.options.index,\n                    // StockChart has Axes in navigator too\n                    chart.options[this.coll][chart.options[this.coll].indexOf(this.userOptions)] = options;\n                }\n                // Remove old events, if no new exist (#8161)\n                objectEach(chart.options[this.coll].events, function (fn, ev) {\n                    if (typeof newEvents[ev] === 'undefined') {\n                        newEvents[ev] = void 0;\n                    }\n                });\n                this.destroy(true);\n                this.init(chart, extend(options, { events: newEvents }));\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Remove the axis from the chart.\n             *\n             * @sample highcharts/members/chart-addaxis/\n             *         Add and remove axes\n             *\n             * @function Highcharts.Axis#remove\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart following the remove.\n             *\n             * @return {void}\n             */\n            remove: function (redraw) {\n                var chart = this.chart,\n                    key = this.coll, // xAxis or yAxis\n                    axisSeries = this.series,\n                    i = axisSeries.length;\n                // Remove associated series (#2687)\n                while (i--) {\n                    if (axisSeries[i]) {\n                        axisSeries[i].remove(false);\n                    }\n                }\n                // Remove the axis\n                erase(chart.axes, this);\n                erase(chart[key], this);\n                if (isArray(chart.options[key])) {\n                    chart.options[key].splice(this.options.index, 1);\n                }\n                else { // color axis, #6488\n                    delete chart.options[key];\n                }\n                chart[key].forEach(function (axis, i) {\n                    // Re-index, #1706, #8075\n                    axis.options.index = axis.userOptions.index = i;\n                });\n                this.destroy();\n                chart.isDirtyBox = true;\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Update the axis title by options after render time.\n             *\n             * @sample highcharts/members/axis-settitle/\n             *         Set a new Y axis title\n             *\n             * @function Highcharts.Axis#setTitle\n             *\n             * @param {Highcharts.AxisTitleOptions} titleOptions\n             *        The additional title options.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart after setting the title.\n             *\n             * @return {void}\n             */\n            setTitle: function (titleOptions, redraw) {\n                this.update({ title: titleOptions }, redraw);\n            },\n            /**\n             * Set new axis categories and optionally redraw.\n             *\n             * @sample highcharts/members/axis-setcategories/\n             *         Set categories by click on a button\n             *\n             * @function Highcharts.Axis#setCategories\n             *\n             * @param {Array<string>} categories\n             *        The new categories.\n             *\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw the chart.\n             *\n             * @return {void}\n             */\n            setCategories: function (categories, redraw) {\n                this.update({ categories: categories }, redraw);\n            }\n        });\n\n    });\n    _registerModule(_modules, 'parts/AreaSeries.js', [_modules['parts/Globals.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Utilities.js']], function (H, Color, LegendSymbolMixin, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var objectEach = U.objectEach,\n            pick = U.pick,\n            seriesType = U.seriesType;\n        var Series = H.Series;\n        /**\n         * Area series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.area\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('area', 'line', \n        /**\n         * The area series type.\n         *\n         * @sample {highcharts} highcharts/demo/area-basic/\n         *         Area chart\n         * @sample {highstock} stock/demo/area/\n         *         Area chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.area\n         */\n        {\n            /**\n             * Fill color or gradient for the area. When `null`, the series' `color`\n             * is used with the series' `fillOpacity`.\n             *\n             * In styled mode, the fill color can be set with the `.highcharts-area`\n             * class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-fillcolor-default/\n             *         Null by default\n             * @sample {highcharts} highcharts/plotoptions/area-fillcolor-gradient/\n             *         Gradient\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.fillColor\n             */\n            /**\n             * Fill opacity for the area. When you set an explicit `fillColor`,\n             * the `fillOpacity` is not applied. Instead, you should define the\n             * opacity in the `fillColor` with an rgba color definition. The\n             * `fillOpacity` setting, also the default setting, overrides the alpha\n             * component of the `color` setting.\n             *\n             * In styled mode, the fill opacity can be set with the\n             * `.highcharts-area` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-fillopacity/\n             *         Automatic fill color and fill opacity of 0.1\n             *\n             * @type      {number}\n             * @default   {highcharts} 0.75\n             * @default   {highstock} 0.75\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.fillOpacity\n             */\n            /**\n             * A separate color for the graph line. By default the line takes the\n             * `color` of the series, but the lineColor setting allows setting a\n             * separate color for the line without altering the `fillColor`.\n             *\n             * In styled mode, the line stroke can be set with the\n             * `.highcharts-graph` class name.\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-linecolor/\n             *         Dark gray line\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.lineColor\n             */\n            /**\n             * A separate color for the negative part of the area.\n             *\n             * In styled mode, a negative color is set with the\n             * `.highcharts-negative` class name.\n             *\n             * @see [negativeColor](#plotOptions.area.negativeColor)\n             *\n             * @sample {highcharts} highcharts/css/series-negative-color/\n             *         Negative color in styled mode\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.area.negativeFillColor\n             */\n            /**\n             * Whether the whole area or just the line should respond to mouseover\n             * tooltips and other mouse or touch events.\n             *\n             * @sample {highcharts|highstock} highcharts/plotoptions/area-trackbyarea/\n             *         Display the tooltip when the area is hovered\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     1.1.6\n             * @product   highcharts highstock\n             * @apioption plotOptions.area.trackByArea\n             */\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             */\n            softThreshold: false,\n            /**\n             * The Y axis value to serve as the base for the area, for\n             * distinguishing between values above and below a threshold. The area\n             * between the graph and the threshold is filled.\n             *\n             * * If a number is given, the Y axis will scale to the threshold.\n             * * If `null`, the scaling behaves like a line series with fill between\n             *   the graph and the Y axis minimum.\n             * * If `Infinity` or `-Infinity`, the area between the graph and the\n             *   corresponding Y axis extreme is filled (since v6.1.0).\n             *\n             * @sample {highcharts} highcharts/plotoptions/area-threshold/\n             *         A threshold of 100\n             * @sample {highcharts} highcharts/plotoptions/area-threshold-infinity/\n             *         A threshold of Infinity\n             *\n             * @type    {number|null}\n             * @since   2.0\n             * @product highcharts highstock\n             */\n            threshold: 0\n        }, \n        /* eslint-disable valid-jsdoc */\n        /**\n         * @lends seriesTypes.area.prototype\n         */\n        {\n            singleStacks: false,\n            /**\n             * Return an array of stacked points, where null and missing points are\n             * replaced by dummy points in order for gaps to be drawn correctly in\n             * stacks.\n             * @private\n             */\n            getStackPoints: function (points) {\n                var series = this,\n                    segment = [],\n                    keys = [],\n                    xAxis = this.xAxis,\n                    yAxis = this.yAxis,\n                    stack = yAxis.stacking.stacks[this.stackKey],\n                    pointMap = {},\n                    seriesIndex = series.index,\n                    yAxisSeries = yAxis.series,\n                    seriesLength = yAxisSeries.length,\n                    visibleSeries,\n                    upOrDown = pick(yAxis.options.reversedStacks,\n                    true) ? 1 : -1,\n                    i;\n                points = points || this.points;\n                if (this.options.stacking) {\n                    for (i = 0; i < points.length; i++) {\n                        // Reset after point update (#7326)\n                        points[i].leftNull = points[i].rightNull = void 0;\n                        // Create a map where we can quickly look up the points by\n                        // their X values.\n                        pointMap[points[i].x] = points[i];\n                    }\n                    // Sort the keys (#1651)\n                    objectEach(stack, function (stackX, x) {\n                        // nulled after switching between\n                        // grouping and not (#1651, #2336)\n                        if (stackX.total !== null) {\n                            keys.push(x);\n                        }\n                    });\n                    keys.sort(function (a, b) {\n                        return a - b;\n                    });\n                    visibleSeries = yAxisSeries.map(function (s) {\n                        return s.visible;\n                    });\n                    keys.forEach(function (x, idx) {\n                        var y = 0,\n                            stackPoint,\n                            stackedValues;\n                        if (pointMap[x] && !pointMap[x].isNull) {\n                            segment.push(pointMap[x]);\n                            // Find left and right cliff. -1 goes left, 1 goes\n                            // right.\n                            [-1, 1].forEach(function (direction) {\n                                var nullName = direction === 1 ?\n                                        'rightNull' :\n                                        'leftNull',\n                                    cliffName = direction === 1 ?\n                                        'rightCliff' :\n                                        'leftCliff',\n                                    cliff = 0,\n                                    otherStack = stack[keys[idx + direction]];\n                                // If there is a stack next to this one,\n                                // to the left or to the right...\n                                if (otherStack) {\n                                    i = seriesIndex;\n                                    // Can go either up or down,\n                                    // depending on reversedStacks\n                                    while (i >= 0 && i < seriesLength) {\n                                        stackPoint = otherStack.points[i];\n                                        if (!stackPoint) {\n                                            // If the next point in this series\n                                            // is missing, mark the point\n                                            // with point.leftNull or\n                                            // point.rightNull = true.\n                                            if (i === seriesIndex) {\n                                                pointMap[x][nullName] =\n                                                    true;\n                                                // If there are missing points in\n                                                // the next stack in any of the\n                                                // series below this one, we need\n                                                // to substract the missing values\n                                                // and add a hiatus to the left or\n                                                // right.\n                                            }\n                                            else if (visibleSeries[i]) {\n                                                stackedValues =\n                                                    stack[x].points[i];\n                                                if (stackedValues) {\n                                                    cliff -=\n                                                        stackedValues[1] -\n                                                            stackedValues[0];\n                                                }\n                                            }\n                                        }\n                                        // When reversedStacks is true, loop up,\n                                        // else loop down\n                                        i += upOrDown;\n                                    }\n                                }\n                                pointMap[x][cliffName] = cliff;\n                            });\n                            // There is no point for this X value in this series, so we\n                            // insert a dummy point in order for the areas to be drawn\n                            // correctly.\n                        }\n                        else {\n                            // Loop down the stack to find the series below this\n                            // one that has a value (#1991)\n                            i = seriesIndex;\n                            while (i >= 0 && i < seriesLength) {\n                                stackPoint = stack[x].points[i];\n                                if (stackPoint) {\n                                    y = stackPoint[1];\n                                    break;\n                                }\n                                // When reversedStacks is true, loop up, else loop\n                                // down\n                                i += upOrDown;\n                            }\n                            y = yAxis.translate(// #6272\n                            y, 0, 1, 0, 1);\n                            segment.push({\n                                isNull: true,\n                                plotX: xAxis.translate(// #6272\n                                x, 0, 0, 0, 1),\n                                x: x,\n                                plotY: y,\n                                yBottom: y\n                            });\n                        }\n                    });\n                }\n                return segment;\n            },\n            /**\n             * @private\n             */\n            getGraphPath: function (points) {\n                var getGraphPath = Series.prototype.getGraphPath, graphPath, options = this.options, stacking = options.stacking, yAxis = this.yAxis, topPath, bottomPath, bottomPoints = [], graphPoints = [], seriesIndex = this.index, i, areaPath, plotX, stacks = yAxis.stacking.stacks[this.stackKey], threshold = options.threshold, translatedThreshold = Math.round(// #10909\n                    yAxis.getThreshold(options.threshold)), isNull, yBottom, connectNulls = pick(// #10574\n                    options.connectNulls, stacking === 'percent'), \n                    // To display null points in underlying stacked series, this\n                    // series graph must be broken, and the area also fall down to\n                    // fill the gap left by the null point. #2069\n                    addDummyPoints = function (i, otherI, side) {\n                        var point = points[i], stackedValues = stacking &&\n                            stacks[point.x].points[seriesIndex], nullVal = point[side + 'Null'] || 0, cliffVal = point[side + 'Cliff'] || 0, top, bottom, isNull = true;\n                    if (cliffVal || nullVal) {\n                        top = (nullVal ?\n                            stackedValues[0] :\n                            stackedValues[1]) + cliffVal;\n                        bottom = stackedValues[0] + cliffVal;\n                        isNull = !!nullVal;\n                    }\n                    else if (!stacking &&\n                        points[otherI] &&\n                        points[otherI].isNull) {\n                        top = bottom = threshold;\n                    }\n                    // Add to the top and bottom line of the area\n                    if (typeof top !== 'undefined') {\n                        graphPoints.push({\n                            plotX: plotX,\n                            plotY: top === null ?\n                                translatedThreshold :\n                                yAxis.getThreshold(top),\n                            isNull: isNull,\n                            isCliff: true\n                        });\n                        bottomPoints.push({\n                            plotX: plotX,\n                            plotY: bottom === null ?\n                                translatedThreshold :\n                                yAxis.getThreshold(bottom),\n                            doCurve: false // #1041, gaps in areaspline areas\n                        });\n                    }\n                };\n                // Find what points to use\n                points = points || this.points;\n                // Fill in missing points\n                if (stacking) {\n                    points = this.getStackPoints(points);\n                }\n                for (i = 0; i < points.length; i++) {\n                    // Reset after series.update of stacking property (#12033)\n                    if (!stacking) {\n                        points[i].leftCliff = points[i].rightCliff =\n                            points[i].leftNull = points[i].rightNull = void 0;\n                    }\n                    isNull = points[i].isNull;\n                    plotX = pick(points[i].rectPlotX, points[i].plotX);\n                    yBottom = pick(points[i].yBottom, translatedThreshold);\n                    if (!isNull || connectNulls) {\n                        if (!connectNulls) {\n                            addDummyPoints(i, i - 1, 'left');\n                        }\n                        // Skip null point when stacking is false and connectNulls\n                        // true\n                        if (!(isNull && !stacking && connectNulls)) {\n                            graphPoints.push(points[i]);\n                            bottomPoints.push({\n                                x: i,\n                                plotX: plotX,\n                                plotY: yBottom\n                            });\n                        }\n                        if (!connectNulls) {\n                            addDummyPoints(i, i + 1, 'right');\n                        }\n                    }\n                }\n                topPath = getGraphPath.call(this, graphPoints, true, true);\n                bottomPoints.reversed = true;\n                bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n                var firstBottomPoint = bottomPath[0];\n                if (firstBottomPoint && firstBottomPoint[0] === 'M') {\n                    bottomPath[0] = ['L', firstBottomPoint[1], firstBottomPoint[2]];\n                }\n                areaPath = topPath.concat(bottomPath);\n                // TODO: don't set leftCliff and rightCliff when connectNulls?\n                graphPath = getGraphPath\n                    .call(this, graphPoints, false, connectNulls);\n                areaPath.xMap = topPath.xMap;\n                this.areaPath = areaPath;\n                return graphPath;\n            },\n            /**\n             * Draw the graph and the underlying area. This method calls the Series\n             * base function and adds the area. The areaPath is calculated in the\n             * getSegmentPath method called from Series.prototype.drawGraph.\n             * @private\n             */\n            drawGraph: function () {\n                // Define or reset areaPath\n                this.areaPath = [];\n                // Call the base method\n                Series.prototype.drawGraph.apply(this);\n                // Define local variables\n                var series = this,\n                    areaPath = this.areaPath,\n                    options = this.options,\n                    zones = this.zones,\n                    props = [[\n                            'area',\n                            'highcharts-area',\n                            this.color,\n                            options.fillColor\n                        ]]; // area name, main color, fill color\n                    zones.forEach(function (zone,\n                    i) {\n                        props.push([\n                            'zone-area-' + i,\n                            'highcharts-area highcharts-zone-area-' + i + ' ' +\n                                zone.className,\n                            zone.color || series.color,\n                            zone.fillColor || options.fillColor\n                        ]);\n                });\n                props.forEach(function (prop) {\n                    var areaKey = prop[0],\n                        area = series[areaKey],\n                        verb = area ? 'animate' : 'attr',\n                        attribs = {};\n                    // Create or update the area\n                    if (area) { // update\n                        area.endX = series.preventGraphAnimation ?\n                            null :\n                            areaPath.xMap;\n                        area.animate({ d: areaPath });\n                    }\n                    else { // create\n                        attribs.zIndex = 0; // #1069\n                        area = series[areaKey] = series.chart.renderer\n                            .path(areaPath)\n                            .addClass(prop[1])\n                            .add(series.group);\n                        area.isArea = true;\n                    }\n                    if (!series.chart.styledMode) {\n                        attribs.fill = pick(prop[3], color(prop[2])\n                            .setOpacity(pick(options.fillOpacity, 0.75))\n                            .get());\n                    }\n                    area[verb](attribs);\n                    area.startX = areaPath.xMap;\n                    area.shiftUnit = options.step ? 2 : 1;\n                });\n            },\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n        /* eslint-enable valid-jsdoc */\n        /**\n         * A `area` series. If the [type](#series.area.type) option is not\n         * specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.area\n         * @excluding dataParser, dataURL, useOhlcData\n         * @product   highcharts highstock\n         * @apioption series.area\n         */\n        /**\n         * An array of data points for the series. For the `area` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` * and `pointInterval` given in the series options. If the\n         *    axis has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 9],\n         *        [1, 7],\n         *        [2, 6]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.area.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.area.data\n         */\n        ''; // adds doclets above to transpilat\n\n    });\n    _registerModule(_modules, 'parts/SplineSeries.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var pick = U.pick,\n            seriesType = U.seriesType;\n        /**\n         * Spline series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.spline\n         *\n         * @augments Highcarts.Series\n         */\n        seriesType('spline', 'line', \n        /**\n         * A spline series is a special type of line series, where the segments\n         * between the data points are smoothed.\n         *\n         * @sample {highcharts} highcharts/demo/spline-irregular-time/\n         *         Spline chart\n         * @sample {highstock} stock/demo/spline/\n         *         Spline chart\n         *\n         * @extends      plotOptions.series\n         * @excluding    step\n         * @product      highcharts highstock\n         * @optionparent plotOptions.spline\n         */\n        {}, \n        /**\n         * @lends seriesTypes.spline.prototype\n         */\n        {\n            /* eslint-disable valid-jsdoc */\n            /**\n             * Get the spline segment from a given point's previous neighbour to the\n             * given point.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.spline#getPointSpline\n             *\n             * @param {Array<Highcharts.Point>}\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @param {number} i\n             *\n             * @return {Highcharts.SVGPathArray}\n             */\n            getPointSpline: function (points, point, i) {\n                var \n                    // 1 means control points midway between points, 2 means 1/3\n                    // from the point, 3 is 1/4 etc\n                    smoothing = 1.5,\n                    denom = smoothing + 1,\n                    plotX = point.plotX || 0,\n                    plotY = point.plotY || 0,\n                    lastPoint = points[i - 1],\n                    nextPoint = points[i + 1],\n                    leftContX,\n                    leftContY,\n                    rightContX,\n                    rightContY,\n                    ret;\n                /**\n                 * @private\n                 */\n                function doCurve(otherPoint) {\n                    return otherPoint &&\n                        !otherPoint.isNull &&\n                        otherPoint.doCurve !== false &&\n                        // #6387, area splines next to null:\n                        !point.isCliff;\n                }\n                // Find control points\n                if (doCurve(lastPoint) && doCurve(nextPoint)) {\n                    var lastX = lastPoint.plotX || 0,\n                        lastY = lastPoint.plotY || 0,\n                        nextX = nextPoint.plotX || 0,\n                        nextY = nextPoint.plotY || 0,\n                        correction = 0;\n                    leftContX = (smoothing * plotX + lastX) / denom;\n                    leftContY = (smoothing * plotY + lastY) / denom;\n                    rightContX = (smoothing * plotX + nextX) / denom;\n                    rightContY = (smoothing * plotY + nextY) / denom;\n                    // Have the two control points make a straight line through main\n                    // point\n                    if (rightContX !== leftContX) { // #5016, division by zero\n                        correction = (((rightContY - leftContY) *\n                            (rightContX - plotX)) /\n                            (rightContX - leftContX) + plotY - rightContY);\n                    }\n                    leftContY += correction;\n                    rightContY += correction;\n                    // to prevent false extremes, check that control points are\n                    // between neighbouring points' y values\n                    if (leftContY > lastY && leftContY > plotY) {\n                        leftContY = Math.max(lastY, plotY);\n                        // mirror of left control point\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    else if (leftContY < lastY && leftContY < plotY) {\n                        leftContY = Math.min(lastY, plotY);\n                        rightContY = 2 * plotY - leftContY;\n                    }\n                    if (rightContY > nextY && rightContY > plotY) {\n                        rightContY = Math.max(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n                    else if (rightContY < nextY && rightContY < plotY) {\n                        rightContY = Math.min(nextY, plotY);\n                        leftContY = 2 * plotY - rightContY;\n                    }\n                    // record for drawing in next point\n                    point.rightContX = rightContX;\n                    point.rightContY = rightContY;\n                }\n                // Visualize control points for debugging\n                /*\n            if (leftContX) {\n                this.chart.renderer.circle(\n                        leftContX + this.chart.plotLeft,\n                        leftContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer.path(['M', leftContX + this.chart.plotLeft,\n                    leftContY + this.chart.plotTop,\n                    'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                    .attr({\n                        stroke: 'red',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n            if (rightContX) {\n                this.chart.renderer.circle(\n                        rightContX + this.chart.plotLeft,\n                        rightContY + this.chart.plotTop,\n                        2\n                    )\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        fill: 'none',\n                        zIndex: 9\n                    })\n                    .add();\n                this.chart.renderer.path(['M', rightContX + this.chart.plotLeft,\n                    rightContY + this.chart.plotTop,\n                    'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n                    .attr({\n                        stroke: 'green',\n                        'stroke-width': 2,\n                        zIndex: 9\n                    })\n                    .add();\n            }\n                // */\n                ret = [\n                    'C',\n                    pick(lastPoint.rightContX, lastPoint.plotX, 0),\n                    pick(lastPoint.rightContY, lastPoint.plotY, 0),\n                    pick(leftContX, plotX, 0),\n                    pick(leftContY, plotY, 0),\n                    plotX,\n                    plotY\n                ];\n                // reset for updating series later\n                lastPoint.rightContX = lastPoint.rightContY = void 0;\n                return ret;\n            }\n            /* eslint-enable valid-jsdoc */\n        });\n        /**\n         * A `spline` series. If the [type](#series.spline.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.spline\n         * @excluding dataParser, dataURL, step\n         * @product   highcharts highstock\n         * @apioption series.spline\n         */\n        /**\n         * An array of data points for the series. For the `spline` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 9],\n         *        [1, 2],\n         *        [2, 8]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.spline.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 0,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.spline.data\n         */\n        ''; // adds doclets above intro transpilat\n\n    });\n    _registerModule(_modules, 'parts/AreaSplineSeries.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Options.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, O, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var seriesType = U.seriesType;\n        var areaProto = H.seriesTypes.area.prototype;\n        /**\n         * AreaSpline series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.areaspline\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('areaspline', 'spline', \n        /**\n         * The area spline series is an area series where the graph between the\n         * points is smoothed into a spline.\n         *\n         * @sample {highcharts} highcharts/demo/areaspline/\n         *         Area spline chart\n         * @sample {highstock} stock/demo/areaspline/\n         *         Area spline chart\n         *\n         * @extends   plotOptions.area\n         * @excluding step\n         * @product   highcharts highstock\n         * @apioption plotOptions.areaspline\n         */\n        defaultOptions.plotOptions.area, {\n            getStackPoints: areaProto.getStackPoints,\n            getGraphPath: areaProto.getGraphPath,\n            drawGraph: areaProto.drawGraph,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle\n        });\n        /**\n         * A `areaspline` series. If the [type](#series.areaspline.type) option\n         * is not specified, it is inherited from [chart.type](#chart.type).\n         *\n         *\n         * @extends   series,plotOptions.areaspline\n         * @excluding dataParser, dataURL, step\n         * @product   highcharts highstock\n         * @apioption series.areaspline\n         */\n        /**\n         * An array of data points for the series. For the `areaspline` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 10],\n         *        [1, 9],\n         *        [2, 3]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.areaspline.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.areaspline.data\n         */\n        ''; // adds doclets above into transpilat\n\n    });\n    _registerModule(_modules, 'parts/ColumnSeries.js', [_modules['parts/Globals.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Utilities.js']], function (H, Color, LegendSymbolMixin, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * Adjusted width and x offset of the columns for grouping.\n         *\n         * @private\n         * @interface Highcharts.ColumnMetricsObject\n         */ /**\n        * Width of the columns.\n        * @name Highcharts.ColumnMetricsObject#width\n        * @type {number}\n        */ /**\n        * Offset of the columns.\n        * @name Highcharts.ColumnMetricsObject#offset\n        * @type {number}\n        */\n        ''; // detach doclets above\n        var color = Color.parse;\n        var animObject = U.animObject,\n            clamp = U.clamp,\n            defined = U.defined,\n            extend = U.extend,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            seriesType = U.seriesType;\n        var noop = H.noop,\n            Series = H.Series,\n            svg = H.svg;\n        /**\n         * The column series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.column\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('column', 'line', \n        /**\n         * Column series display one column per value along an X axis.\n         *\n         * @sample {highcharts} highcharts/demo/column-basic/\n         *         Column chart\n         * @sample {highstock} stock/demo/column/\n         *         Column chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    connectEnds, connectNulls, gapSize, gapUnit, linecap,\n         *               lineWidth, marker, step, useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.column\n         */\n        {\n            /**\n             * The corner radius of the border surrounding each column or bar.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-borderradius/\n             *         Rounded columns\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            borderRadius: 0,\n            /**\n             * When using automatic point colors pulled from the global\n             * [colors](colors) or series-specific\n             * [plotOptions.column.colors](series.colors) collections, this option\n             * determines whether the chart should receive one color per series or\n             * one color per point.\n             *\n             * In styled mode, the `colors` or `series.colors` arrays are not\n             * supported, and instead this option gives the points individual color\n             * class names on the form `highcharts-color-{n}`.\n             *\n             * @see [series colors](#plotOptions.column.colors)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-false/\n             *         False by default\n             * @sample {highcharts} highcharts/plotoptions/column-colorbypoint-true/\n             *         True\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     2.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.colorByPoint\n             */\n            /**\n             * A series specific or series type specific color set to apply instead\n             * of the global [colors](#colors) when [colorByPoint](\n             * #plotOptions.column.colorByPoint) is true.\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.colors\n             */\n            /**\n             * When `true`, the columns will center in the category, ignoring null\n             * or missing points. When `false`, space will be reserved for null or\n             * missing points.\n             *\n             * @sample {highcharts} highcharts/series-column/centerincategory/\n             *         Center in category\n             *\n             * @since   8.0.1\n             * @product highcharts highstock gantt\n             */\n            centerInCategory: false,\n            /**\n             * Padding between each value groups, in x axis units.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-grouppadding-default/\n             *         0.2 by default\n             * @sample {highcharts} highcharts/plotoptions/column-grouppadding-none/\n             *         No group padding - all columns are evenly spaced\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            groupPadding: 0.2,\n            /**\n             * Whether to group non-stacked columns or to let them render\n             * independent of each other. Non-grouped columns will be laid out\n             * individually and overlap each other.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-grouping-false/\n             *         Grouping disabled\n             * @sample {highstock} highcharts/plotoptions/column-grouping-false/\n             *         Grouping disabled\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     2.3.0\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.grouping\n             */\n            /**\n             * @ignore-option\n             * @private\n             */\n            marker: null,\n            /**\n             * The maximum allowed pixel width for a column, translated to the\n             * height of a bar in a bar chart. This prevents the columns from\n             * becoming too wide when there is a small number of points in the\n             * chart.\n             *\n             * @see [pointWidth](#plotOptions.column.pointWidth)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-maxpointwidth-20/\n             *         Limited to 50\n             * @sample {highstock} highcharts/plotoptions/column-maxpointwidth-20/\n             *         Limited to 50\n             *\n             * @type      {number}\n             * @since     4.1.8\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.maxPointWidth\n             */\n            /**\n             * Padding between each column or bar, in x axis units.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-default/\n             *         0.1 by default\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-025/\n             *          0.25\n             * @sample {highcharts} highcharts/plotoptions/column-pointpadding-none/\n             *         0 for tightly packed columns\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            pointPadding: 0.1,\n            /**\n             * A pixel value specifying a fixed width for each column or bar. When\n             * `null`, the width is calculated from the `pointPadding` and\n             * `groupPadding`.\n             *\n             * @see [maxPointWidth](#plotOptions.column.maxPointWidth)\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointwidth-20/\n             *         20px wide columns regardless of chart width or the amount of\n             *         data points\n             *\n             * @type      {number}\n             * @since     1.2.5\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.pointWidth\n             */\n            /**\n             * A pixel value specifying a fixed width for the column or bar.\n             * Overrides pointWidth on the series.\n             *\n             * @see [series.pointWidth](#plotOptions.column.pointWidth)\n             *\n             * @type      {number}\n             * @default   undefined\n             * @since     7.0.0\n             * @product   highcharts highstock gantt\n             * @apioption series.column.data.pointWidth\n             */\n            /**\n             * The minimal height for a column or width for a bar. By default,\n             * 0 values are not shown. To visualize a 0 (or close to zero) point,\n             * set the minimal point length to a pixel value like 3\\. In stacked\n             * column charts, minPointLength might not be respected for tightly\n             * packed values.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-minpointlength/\n             *         Zero base value\n             * @sample {highcharts} highcharts/plotoptions/column-minpointlength-pos-and-neg/\n             *         Positive and negative close to zero values\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            minPointLength: 0,\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, event if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            cropThreshold: 50,\n            /**\n             * The X axis range that each point is valid for. This determines the\n             * width of the column. On a categorized axis, the range will be 1\n             * by default (one category unit). On linear and datetime axes, the\n             * range will be computed as the distance between the two closest data\n             * points.\n             *\n             * The default `null` means it is computed automatically, but this\n             * option can be used to override the automatic value.\n             *\n             * This option is set by default to 1 if data sorting is enabled.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-pointrange/\n             *         Set the point range to one day on a data set with one week\n             *         between the points\n             *\n             * @type    {number|null}\n             * @since   2.3\n             * @product highcharts highstock gantt\n             *\n             * @private\n             */\n            pointRange: null,\n            states: {\n                /**\n                 * Options for the hovered point. These settings override the normal\n                 * state options when a point is moused over or touched.\n                 *\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding halo, lineWidth, lineWidthPlus, marker\n                 * @product   highcharts highstock gantt\n                 */\n                hover: {\n                    /** @ignore-option */\n                    halo: false,\n                    /**\n                     * A specific border color for the hovered point. Defaults to\n                     * inherit the normal state border color.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @product   highcharts gantt\n                     * @apioption plotOptions.column.states.hover.borderColor\n                     */\n                    /**\n                     * A specific color for the hovered point.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @product   highcharts gantt\n                     * @apioption plotOptions.column.states.hover.color\n                     */\n                    /**\n                     * How much to brighten the point on interaction. Requires the\n                     * main color to be defined in hex or rgb(a) format.\n                     *\n                     * In styled mode, the hover brightening is by default replaced\n                     * with a fill-opacity set in the `.highcharts-point:hover`\n                     * rule.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/column-states-hover-brightness/\n                     *         Brighten by 0.5\n                     *\n                     * @product highcharts highstock gantt\n                     */\n                    brightness: 0.1\n                },\n                /**\n                 * Options for the selected point. These settings override the\n                 * normal state options when a point is selected.\n                 *\n                 * @extends   plotOptions.series.states.select\n                 * @excluding halo, lineWidth, lineWidthPlus, marker\n                 * @product   highcharts highstock gantt\n                 */\n                select: {\n                    /**\n                     * A specific color for the selected point.\n                     *\n                     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default #cccccc\n                     * @product highcharts highstock gantt\n                     */\n                    color: '#cccccc',\n                    /**\n                     * A specific border color for the selected point.\n                     *\n                     * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default #000000\n                     * @product highcharts highstock gantt\n                     */\n                    borderColor: '#000000'\n                }\n            },\n            dataLabels: {\n                align: void 0,\n                verticalAlign: void 0,\n                /**\n                 * The y position offset of the label relative to the point in\n                 * pixels.\n                 *\n                 * @type {number}\n                 */\n                y: void 0\n            },\n            /**\n             * When this is true, the series will not cause the Y axis to cross\n             * the zero plane (or [threshold](#plotOptions.series.threshold) option)\n             * unless the data actually crosses the plane.\n             *\n             * For example, if `softThreshold` is `false`, a series of 0, 1, 2,\n             * 3 will make the Y axis show negative values according to the\n             * `minPadding` option. If `softThreshold` is `true`, the Y axis starts\n             * at 0.\n             *\n             * @since   4.1.9\n             * @product highcharts highstock\n             *\n             * @private\n             */\n            softThreshold: false,\n            // false doesn't work well: https://jsfiddle.net/highcharts/hz8fopan/14/\n            /**\n             * @ignore-option\n             * @private\n             */\n            startFromThreshold: true,\n            stickyTracking: false,\n            tooltip: {\n                distance: 6\n            },\n            /**\n             * The Y axis value to serve as the base for the columns, for\n             * distinguishing between values above and below a threshold. If `null`,\n             * the columns extend from the padding Y axis minimum.\n             *\n             * @type    {number|null}\n             * @since   2.0\n             * @product highcharts\n             *\n             * @private\n             */\n            threshold: 0,\n            /**\n             * The width of the border surrounding each column or bar. Defaults to\n             * `1` when there is room for a border, but to `0` when the columns are\n             * so dense that a border would cover the next column.\n             *\n             * In styled mode, the stroke width can be set with the\n             * `.highcharts-point` rule.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n             *         2px black border\n             *\n             * @type      {number}\n             * @default   undefined\n             * @product   highcharts highstock gantt\n             * @apioption plotOptions.column.borderWidth\n             */\n            /**\n             * The color of the border surrounding each column or bar.\n             *\n             * In styled mode, the border stroke can be set with the\n             * `.highcharts-point` rule.\n             *\n             * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n             *         Dark gray border\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #ffffff\n             * @product   highcharts highstock gantt\n             *\n             * @private\n             */\n            borderColor: '#ffffff'\n        }, \n        /**\n         * @lends seriesTypes.column.prototype\n         */\n        {\n            cropShoulder: 0,\n            // When tooltip is not shared, this series (and derivatives) requires\n            // direct touch/hover. KD-tree does not apply.\n            directTouch: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            // use separate negative stacks, unlike area stacks where a negative\n            // point is substracted from previous (#1910)\n            negStacks: true,\n            /* eslint-disable valid-jsdoc */\n            /**\n             * Initialize the series. Extends the basic Series.init method by\n             * marking other series of the same type as dirty.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#init\n             * @return {void}\n             */\n            init: function () {\n                Series.prototype.init.apply(this, arguments);\n                var series = this,\n                    chart = series.chart;\n                // if the series is added dynamically, force redraw of other\n                // series affected by a new column\n                if (chart.hasRendered) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n            },\n            /**\n             * Return the width and x offset of the columns adjusted for grouping,\n             * groupPadding, pointPadding, pointWidth etc.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#getColumnMetrics\n             * @return {Highcharts.ColumnMetricsObject}\n             */\n            getColumnMetrics: function () {\n                var series = this,\n                    options = series.options,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    reversedStacks = xAxis.options.reversedStacks, \n                    // Keep backward compatibility: reversed xAxis had reversed\n                    // stacks\n                    reverseStacks = (xAxis.reversed && !reversedStacks) ||\n                        (!xAxis.reversed && reversedStacks),\n                    stackKey,\n                    stackGroups = {},\n                    columnCount = 0;\n                // Get the total number of column type series. This is called on\n                // every series. Consider moving this logic to a chart.orderStacks()\n                // function and call it on init, addSeries and removeSeries\n                if (options.grouping === false) {\n                    columnCount = 1;\n                }\n                else {\n                    series.chart.series.forEach(function (otherSeries) {\n                        var otherYAxis = otherSeries.yAxis,\n                            otherOptions = otherSeries.options,\n                            columnIndex;\n                        if (otherSeries.type === series.type &&\n                            (otherSeries.visible ||\n                                !series.chart.options.chart\n                                    .ignoreHiddenSeries) &&\n                            yAxis.len === otherYAxis.len &&\n                            yAxis.pos === otherYAxis.pos) { // #642, #2086\n                            if (otherOptions.stacking && otherOptions.stacking !== 'group') {\n                                stackKey = otherSeries.stackKey;\n                                if (typeof stackGroups[stackKey] ===\n                                    'undefined') {\n                                    stackGroups[stackKey] = columnCount++;\n                                }\n                                columnIndex = stackGroups[stackKey];\n                            }\n                            else if (otherOptions.grouping !== false) { // #1162\n                                columnIndex = columnCount++;\n                            }\n                            otherSeries.columnIndex = columnIndex;\n                        }\n                    });\n                }\n                var categoryWidth = Math.min(Math.abs(xAxis.transA) * ((xAxis.ordinal && xAxis.ordinal.slope) ||\n                        options.pointRange ||\n                        xAxis.closestPointRange ||\n                        xAxis.tickInterval ||\n                        1), // #2610\n                    xAxis.len // #1535\n                    ),\n                    groupPadding = categoryWidth * options.groupPadding,\n                    groupWidth = categoryWidth - 2 * groupPadding,\n                    pointOffsetWidth = groupWidth / (columnCount || 1),\n                    pointWidth = Math.min(options.maxPointWidth || xAxis.len,\n                    pick(options.pointWidth,\n                    pointOffsetWidth * (1 - 2 * options.pointPadding))),\n                    pointPadding = (pointOffsetWidth - pointWidth) / 2, \n                    // #1251, #3737\n                    colIndex = (series.columnIndex || 0) + (reverseStacks ? 1 : 0),\n                    pointXOffset = pointPadding +\n                        (groupPadding +\n                            colIndex * pointOffsetWidth -\n                            (categoryWidth / 2)) * (reverseStacks ? -1 : 1);\n                // Save it for reading in linked series (Error bars particularly)\n                series.columnMetrics = {\n                    width: pointWidth,\n                    offset: pointXOffset,\n                    paddedWidth: pointOffsetWidth,\n                    columnCount: columnCount\n                };\n                return series.columnMetrics;\n            },\n            /**\n             * Make the columns crisp. The edges are rounded to the nearest full\n             * pixel.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#crispCol\n             * @param {number} x\n             * @param {number} y\n             * @param {number} w\n             * @param {number} h\n             * @return {Highcharts.BBoxObject}\n             */\n            crispCol: function (x, y, w, h) {\n                var chart = this.chart,\n                    borderWidth = this.borderWidth,\n                    xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n                    yCrisp = borderWidth % 2 ? 0.5 : 1,\n                    right,\n                    bottom,\n                    fromTop;\n                if (chart.inverted && chart.renderer.isVML) {\n                    yCrisp += 1;\n                }\n                // Horizontal. We need to first compute the exact right edge, then\n                // round it and compute the width from there.\n                if (this.options.crisp) {\n                    right = Math.round(x + w) + xCrisp;\n                    x = Math.round(x) + xCrisp;\n                    w = right - x;\n                }\n                // Vertical\n                bottom = Math.round(y + h) + yCrisp;\n                fromTop = Math.abs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n                y = Math.round(y) + yCrisp;\n                h = bottom - y;\n                // Top edges are exceptions\n                if (fromTop && h) { // #5146\n                    y -= 1;\n                    h += 1;\n                }\n                return {\n                    x: x,\n                    y: y,\n                    width: w,\n                    height: h\n                };\n            },\n            /**\n             * Adjust for missing columns, according to the `centerInCategory`\n             * option. Missing columns are either single points or stacks where the\n             * point or points are either missing or null.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#adjustForMissingColumns\n             * @param {number} x\n             *        The x coordinate of the column, left side\n             * @param {number} pointWidth\n             *        The pointWidth, already computed upstream\n             * @param {Highcharts.ColumnPoint} point\n             *        The point instance\n             * @param {Highcharts.ColumnMetricsObject} metrics\n             *        The series-wide column metrics\n             * @return {number}\n             *        The adjusted x position, or the original if not adjusted\n             */\n            adjustForMissingColumns: function (x, pointWidth, point, metrics) {\n                var _this = this;\n                var stacking = this.options.stacking;\n                if (!point.isNull && metrics.columnCount > 1) {\n                    var indexInCategory_1 = 0;\n                    var totalInCategory_1 = 0;\n                    // Loop over all the stacks on the Y axis. When stacking is\n                    // enabled, these are real point stacks. When stacking is not\n                    // enabled, but `centerInCategory` is true, there is one stack\n                    // handling the grouping of points in each category. This is\n                    // done in the `setGroupedPoints` function.\n                    Highcharts.objectEach(this.yAxis.stacking && this.yAxis.stacking.stacks, function (stack) {\n                        if (typeof point.x === 'number') {\n                            var stackItem = stack[point.x.toString()];\n                            if (stackItem) {\n                                var pointValues = stackItem.points[_this.index],\n                                    total = stackItem.total;\n                                // If true `stacking` is enabled, count the\n                                // total number of non-null stacks in the\n                                // category, and note which index this point is\n                                // within those stacks.\n                                if (stacking) {\n                                    if (pointValues) {\n                                        indexInCategory_1 = totalInCategory_1;\n                                    }\n                                    if (stackItem.hasValidPoints) {\n                                        totalInCategory_1++;\n                                    }\n                                    // If `stacking` is not enabled, look for the\n                                    // index and total of the `group` stack.\n                                }\n                                else if (H.isArray(pointValues)) {\n                                    indexInCategory_1 = pointValues[1];\n                                    totalInCategory_1 = total || 0;\n                                }\n                            }\n                        }\n                    });\n                    // Compute the adjusted x position\n                    var boxWidth = (totalInCategory_1 - 1) * metrics.paddedWidth +\n                            pointWidth;\n                    x = (point.plotX || 0) + boxWidth / 2 - pointWidth -\n                        indexInCategory_1 * metrics.paddedWidth;\n                }\n                return x;\n            },\n            /**\n             * Translate each point to the plot area coordinate system and find\n             * shape positions\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#translate\n             */\n            translate: function () {\n                var series = this,\n                    chart = series.chart,\n                    options = series.options,\n                    dense = series.dense =\n                        series.closestPointRange * series.xAxis.transA < 2,\n                    borderWidth = series.borderWidth = pick(options.borderWidth,\n                    dense ? 0 : 1 // #3635\n                    ),\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis,\n                    threshold = options.threshold,\n                    translatedThreshold = series.translatedThreshold =\n                        yAxis.getThreshold(threshold),\n                    minPointLength = pick(options.minPointLength, 5),\n                    metrics = series.getColumnMetrics(),\n                    seriesPointWidth = metrics.width, \n                    // postprocessed for border width\n                    seriesBarW = series.barW =\n                        Math.max(seriesPointWidth, 1 + 2 * borderWidth),\n                    seriesXOffset = series.pointXOffset = metrics.offset,\n                    dataMin = series.dataMin,\n                    dataMax = series.dataMax;\n                if (chart.inverted) {\n                    translatedThreshold -= 0.5; // #3355\n                }\n                // When the pointPadding is 0, we want the columns to be packed\n                // tightly, so we allow individual columns to have individual sizes.\n                // When pointPadding is greater, we strive for equal-width columns\n                // (#2694).\n                if (options.pointPadding) {\n                    seriesBarW = Math.ceil(seriesBarW);\n                }\n                Series.prototype.translate.apply(series);\n                // Record the new values\n                series.points.forEach(function (point) {\n                    var yBottom = pick(point.yBottom,\n                        translatedThreshold),\n                        safeDistance = 999 + Math.abs(yBottom),\n                        pointWidth = seriesPointWidth,\n                        plotX = point.plotX || 0, \n                        // Don't draw too far outside plot area (#1303, #2241,\n                        // #4264)\n                        plotY = clamp(point.plotY, -safeDistance,\n                        yAxis.len + safeDistance),\n                        barX = plotX + seriesXOffset,\n                        barW = seriesBarW,\n                        barY = Math.min(plotY,\n                        yBottom),\n                        up,\n                        barH = Math.max(plotY,\n                        yBottom) - barY;\n                    // Handle options.minPointLength\n                    if (minPointLength && Math.abs(barH) < minPointLength) {\n                        barH = minPointLength;\n                        up = (!yAxis.reversed && !point.negative) ||\n                            (yAxis.reversed && point.negative);\n                        // Reverse zeros if there's no positive value in the series\n                        // in visible range (#7046)\n                        if (isNumber(threshold) &&\n                            isNumber(dataMax) &&\n                            point.y === threshold &&\n                            dataMax <= threshold &&\n                            // and if there's room for it (#7311)\n                            (yAxis.min || 0) < threshold &&\n                            // if all points are the same value (i.e zero) not draw\n                            // as negative points (#10646)\n                            dataMin !== dataMax) {\n                            up = !up;\n                        }\n                        // If stacked...\n                        barY = (Math.abs(barY - translatedThreshold) > minPointLength ?\n                            // ...keep position\n                            yBottom - minPointLength :\n                            // #1485, #4051\n                            translatedThreshold -\n                                (up ? minPointLength : 0));\n                    }\n                    // Handle point.options.pointWidth\n                    // @todo Handle grouping/stacking too. Calculate offset properly\n                    if (defined(point.options.pointWidth)) {\n                        pointWidth = barW =\n                            Math.ceil(point.options.pointWidth);\n                        barX -= Math.round((pointWidth - seriesPointWidth) / 2);\n                    }\n                    // Adjust for null or missing points\n                    if (options.centerInCategory) {\n                        barX = series.adjustForMissingColumns(barX, pointWidth, point, metrics);\n                    }\n                    // Cache for access in polar\n                    point.barX = barX;\n                    point.pointWidth = pointWidth;\n                    // Fix the tooltip on center of grouped columns (#1216, #424,\n                    // #3648)\n                    point.tooltipPos = chart.inverted ?\n                        [\n                            yAxis.len + yAxis.pos - chart.plotLeft - plotY,\n                            xAxis.len + xAxis.pos - chart.plotTop - (plotX || 0) - seriesXOffset - barW / 2,\n                            barH\n                        ] :\n                        [barX + barW / 2, plotY + yAxis.pos -\n                                chart.plotTop, barH];\n                    // Register shape type and arguments to be used in drawPoints\n                    // Allow shapeType defined on pointClass level\n                    point.shapeType =\n                        series.pointClass.prototype.shapeType || 'rect';\n                    point.shapeArgs = series.crispCol.apply(series, point.isNull ?\n                        // #3169, drilldown from null must have a position to work\n                        // from #6585, dataLabel should be placed on xAxis, not\n                        // floating in the middle of the chart\n                        [barX, translatedThreshold, barW, 0] :\n                        [barX, barY, barW, barH]);\n                });\n            },\n            getSymbol: noop,\n            /**\n             * Use a solid rectangle like the area series types\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawLegendSymbol\n             *\n             * @param {Highcharts.Legend} legend\n             *        The legend object\n             *\n             * @param {Highcharts.Series|Highcharts.Point} item\n             *        The series (this) or point\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            /**\n             * Columns have no graph\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawGraph\n             */\n            drawGraph: function () {\n                this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n            },\n            /**\n             * Get presentational attributes\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#pointAttribs\n             *\n             * @param {Highcharts.ColumnPoint} point\n             *\n             * @param {string} state\n             *\n             * @return {Highcharts.SVGAttributes}\n             */\n            pointAttribs: function (point, state) {\n                var options = this.options, stateOptions, ret, p2o = this.pointAttrToOptions || {}, strokeOption = p2o.stroke || 'borderColor', strokeWidthOption = p2o['stroke-width'] || 'borderWidth', fill = (point && point.color) || this.color, \n                    // set to fill when borderColor null:\n                    stroke = ((point && point[strokeOption]) ||\n                        options[strokeOption] ||\n                        this.color ||\n                        fill), strokeWidth = (point && point[strokeWidthOption]) ||\n                        options[strokeWidthOption] ||\n                        this[strokeWidthOption] || 0, dashstyle = (point && point.options.dashStyle) || options.dashStyle, opacity = pick(point && point.opacity, options.opacity, 1), zone, brightness;\n                // Handle zone colors\n                if (point && this.zones.length) {\n                    zone = point.getZone();\n                    // When zones are present, don't use point.color (#4267).\n                    // Changed order (#6527), added support for colorAxis (#10670)\n                    fill = (point.options.color ||\n                        (zone && (zone.color || point.nonZonedColor)) ||\n                        this.color);\n                    if (zone) {\n                        stroke = zone.borderColor || stroke;\n                        dashstyle = zone.dashStyle || dashstyle;\n                        strokeWidth = zone.borderWidth || strokeWidth;\n                    }\n                }\n                // Select or hover states\n                if (state && point) {\n                    stateOptions = merge(options.states[state], \n                    // #6401\n                    point.options.states &&\n                        point.options.states[state] ||\n                        {});\n                    brightness = stateOptions.brightness;\n                    fill =\n                        stateOptions.color || (typeof brightness !== 'undefined' &&\n                            color(fill)\n                                .brighten(stateOptions.brightness)\n                                .get()) || fill;\n                    stroke = stateOptions[strokeOption] || stroke;\n                    strokeWidth =\n                        stateOptions[strokeWidthOption] || strokeWidth;\n                    dashstyle = stateOptions.dashStyle || dashstyle;\n                    opacity = pick(stateOptions.opacity, opacity);\n                }\n                ret = {\n                    fill: fill,\n                    stroke: stroke,\n                    'stroke-width': strokeWidth,\n                    opacity: opacity\n                };\n                if (dashstyle) {\n                    ret.dashstyle = dashstyle;\n                }\n                return ret;\n            },\n            /**\n             * Draw the columns. For bars, the series.group is rotated, so the same\n             * coordinates apply for columns and bars. This method is inherited by\n             * scatter series.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#drawPoints\n             */\n            drawPoints: function () {\n                var series = this,\n                    chart = this.chart,\n                    options = series.options,\n                    renderer = chart.renderer,\n                    animationLimit = options.animationLimit || 250,\n                    shapeArgs;\n                // draw the columns\n                series.points.forEach(function (point) {\n                    var plotY = point.plotY,\n                        graphic = point.graphic,\n                        hasGraphic = !!graphic,\n                        verb = graphic && chart.pointCount < animationLimit ?\n                            'animate' : 'attr';\n                    if (isNumber(plotY) && point.y !== null) {\n                        shapeArgs = point.shapeArgs;\n                        // When updating a series between 2d and 3d or cartesian and\n                        // polar, the shape type changes.\n                        if (graphic && point.hasNewShapeType()) {\n                            graphic = graphic.destroy();\n                        }\n                        // Set starting position for point sliding animation.\n                        if (series.enabledDataSorting) {\n                            point.startXPos = series.xAxis.reversed ?\n                                -(shapeArgs ? shapeArgs.width : 0) :\n                                series.xAxis.width;\n                        }\n                        if (!graphic) {\n                            point.graphic = graphic =\n                                renderer[point.shapeType](shapeArgs)\n                                    .add(point.group || series.group);\n                            if (graphic &&\n                                series.enabledDataSorting &&\n                                chart.hasRendered &&\n                                chart.pointCount < animationLimit) {\n                                graphic.attr({\n                                    x: point.startXPos\n                                });\n                                hasGraphic = true;\n                                verb = 'animate';\n                            }\n                        }\n                        if (graphic && hasGraphic) { // update\n                            graphic[verb](merge(shapeArgs));\n                        }\n                        // Border radius is not stylable (#6900)\n                        if (options.borderRadius) {\n                            graphic[verb]({\n                                r: options.borderRadius\n                            });\n                        }\n                        // Presentational\n                        if (!chart.styledMode) {\n                            graphic[verb](series.pointAttribs(point, (point.selected && 'select')))\n                                .shadow(point.allowShadow !== false && options.shadow, null, options.stacking && !options.borderRadius);\n                        }\n                        graphic.addClass(point.getClassName(), true);\n                    }\n                    else if (graphic) {\n                        point.graphic = graphic.destroy(); // #1269\n                    }\n                });\n            },\n            /**\n             * Animate the column heights one by one from zero.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#animate\n             *\n             * @param {boolean} init\n             *        Whether to initialize the animation or run it\n             */\n            animate: function (init) {\n                var series = this,\n                    yAxis = this.yAxis,\n                    options = series.options,\n                    inverted = this.chart.inverted,\n                    attr = {},\n                    translateProp = inverted ? 'translateX' : 'translateY',\n                    translateStart,\n                    translatedThreshold;\n                if (init) {\n                    attr.scaleY = 0.001;\n                    translatedThreshold = clamp(yAxis.toPixels(options.threshold), yAxis.pos, yAxis.pos + yAxis.len);\n                    if (inverted) {\n                        attr.translateX = translatedThreshold - yAxis.len;\n                    }\n                    else {\n                        attr.translateY = translatedThreshold;\n                    }\n                    // apply finnal clipping (used in Highstock) (#7083)\n                    // animation is done by scaleY, so cliping is for panes\n                    if (series.clipBox) {\n                        series.setClip();\n                    }\n                    series.group.attr(attr);\n                }\n                else { // run the animation\n                    translateStart = series.group.attr(translateProp);\n                    series.group.animate({ scaleY: 1 }, extend(animObject(series.options.animation), {\n                        // Do the scale synchronously to ensure smooth\n                        // updating (#5030, #7228)\n                        step: function (val, fx) {\n                            if (series.group) {\n                                attr[translateProp] = translateStart +\n                                    fx.pos * (yAxis.pos - translateStart);\n                                series.group.attr(attr);\n                            }\n                        }\n                    }));\n                }\n            },\n            /**\n             * Remove this series from the chart\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#remove\n             */\n            remove: function () {\n                var series = this,\n                    chart = series.chart;\n                // column and bar series affects other series of the same type\n                // as they are either stacked or grouped\n                if (chart.hasRendered) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.type === series.type) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n                Series.prototype.remove.apply(series, arguments);\n            }\n        });\n        /* eslint-enable valid-jsdoc */\n        /**\n         * A `column` series. If the [type](#series.column.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.column\n         * @excluding connectNulls, dataParser, dataURL, gapSize, gapUnit, linecap,\n         *            lineWidth, marker, connectEnds, step\n         * @product   highcharts highstock\n         * @apioption series.column\n         */\n        /**\n         * An array of data points for the series. For the `column` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 6],\n         *        [1, 2],\n         *        [2, 6]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.column.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @excluding marker\n         * @product   highcharts highstock\n         * @apioption series.column.data\n         */\n        /**\n         * The color of the border surrounding the column or bar.\n         *\n         * In styled mode, the border stroke can be set with the `.highcharts-point`\n         * rule.\n         *\n         * @sample {highcharts} highcharts/plotoptions/column-bordercolor/\n         *         Dark gray border\n         *\n         * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n         * @product   highcharts highstock\n         * @apioption series.column.data.borderColor\n         */\n        /**\n         * The width of the border surrounding the column or bar.\n         *\n         * In styled mode, the stroke width can be set with the `.highcharts-point`\n         * rule.\n         *\n         * @sample {highcharts} highcharts/plotoptions/column-borderwidth/\n         *         2px black border\n         *\n         * @type      {number}\n         * @product   highcharts highstock\n         * @apioption series.column.data.borderWidth\n         */\n        /**\n         * A name for the dash style to use for the column or bar. Overrides\n         * dashStyle on the series.\n         *\n         * In styled mode, the stroke dash-array can be set with the same classes as\n         * listed under [data.color](#series.column.data.color).\n         *\n         * @see [series.pointWidth](#plotOptions.column.dashStyle)\n         *\n         * @type      {Highcharts.DashStyleValue}\n         * @apioption series.column.data.dashStyle\n         */\n        /**\n         * A pixel value specifying a fixed width for the column or bar. Overrides\n         * pointWidth on the series.\n         *\n         * @see [series.pointWidth](#plotOptions.column.pointWidth)\n         *\n         * @type      {number}\n         * @apioption series.column.data.pointWidth\n         */\n        /**\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock\n         * @apioption series.column.states.hover\n         */\n        /**\n         * @excluding halo, lineWidth, lineWidthPlus, marker\n         * @product   highcharts highstock\n         * @apioption series.column.states.select\n         */\n        ''; // includes above doclets in transpilat\n\n    });\n    _registerModule(_modules, 'parts/BarSeries.js', [_modules['parts/Utilities.js']], function (U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var seriesType = U.seriesType;\n        /**\n         * Bar series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.bar\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('bar', 'column', \n        /**\n         * A bar series is a special type of column series where the columns are\n         * horizontal.\n         *\n         * @sample highcharts/demo/bar-basic/\n         *         Bar chart\n         *\n         * @extends   plotOptions.column\n         * @product   highcharts\n         * @apioption plotOptions.bar\n         */\n        /**\n         * @ignore\n         */\n        null, {\n            inverted: true\n        });\n        /**\n         * A `bar` series. If the [type](#series.bar.type) option is not specified,\n         * it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.bar\n         * @excluding connectNulls, dashStyle, dataParser, dataURL, gapSize, gapUnit,\n         *            linecap, lineWidth, marker, connectEnds, step\n         * @product   highcharts\n         * @apioption series.bar\n         */\n        /**\n         * An array of data points for the series. For the `bar` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 5],\n         *        [1, 10],\n         *        [2, 3]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.bar.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 1,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 10,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.column.data\n         * @product   highcharts\n         * @apioption series.bar.data\n         */\n        /**\n         * @excluding halo,lineWidth,lineWidthPlus,marker\n         * @product   highcharts highstock\n         * @apioption series.bar.states.hover\n         */\n        /**\n         * @excluding halo,lineWidth,lineWidthPlus,marker\n         * @product   highcharts highstock\n         * @apioption series.bar.states.select\n         */\n        ''; // gets doclets above into transpilat\n\n    });\n    _registerModule(_modules, 'parts/ScatterSeries.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            seriesType = U.seriesType;\n        var Series = H.Series;\n        /**\n         * Scatter series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.scatter\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('scatter', 'line', \n        /**\n         * A scatter plot uses cartesian coordinates to display values for two\n         * variables for a set of data.\n         *\n         * @sample {highcharts} highcharts/demo/scatter/\n         *         Scatter plot\n         *\n         * @extends      plotOptions.line\n         * @excluding    pointPlacement, shadow, useOhlcData\n         * @product      highcharts highstock\n         * @optionparent plotOptions.scatter\n         */\n        {\n            /**\n             * The width of the line connecting the data points.\n             *\n             * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-none/\n             *         0 by default\n             * @sample {highcharts} highcharts/plotoptions/scatter-linewidth-1/\n             *         1px\n             *\n             * @product highcharts highstock\n             */\n            lineWidth: 0,\n            findNearestPointBy: 'xy',\n            /**\n             * Apply a jitter effect for the rendered markers. When plotting\n             * discrete values, a little random noise may help telling the points\n             * apart. The jitter setting applies a random displacement of up to `n`\n             * axis units in either direction. So for example on a horizontal X\n             * axis, setting the `jitter.x` to 0.24 will render the point in a\n             * random position between 0.24 units to the left and 0.24 units to the\n             * right of the true axis position. On a category axis, setting it to\n             * 0.5 will fill up the bin and make the data appear continuous.\n             *\n             * When rendered on top of a box plot or a column series, a jitter value\n             * of 0.24 will correspond to the underlying series' default\n             * [groupPadding](\n             * https://api.highcharts.com/highcharts/plotOptions.column.groupPadding)\n             * and [pointPadding](\n             * https://api.highcharts.com/highcharts/plotOptions.column.pointPadding)\n             * settings.\n             *\n             * @sample {highcharts} highcharts/series-scatter/jitter\n             *         Jitter on a scatter plot\n             *\n             * @sample {highcharts} highcharts/series-scatter/jitter-boxplot\n             *         Jittered scatter plot on top of a box plot\n             *\n             * @product highcharts highstock\n             * @since 7.0.2\n             */\n            jitter: {\n                /**\n                 * The maximal X offset for the random jitter effect.\n                 */\n                x: 0,\n                /**\n                 * The maximal Y offset for the random jitter effect.\n                 */\n                y: 0\n            },\n            marker: {\n                enabled: true // Overrides auto-enabling in line series (#3647)\n            },\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event\n             * on a series isn't triggered until the mouse moves over another\n             * series, or out of the plot area. When false, the `mouseOut` event on\n             * a series is triggered when the mouse leaves the area around the\n             * series' graph or markers. This also implies the tooltip. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @product   highcharts highstock\n             * @apioption plotOptions.scatter.stickyTracking\n             */\n            /**\n             * A configuration object for the tooltip rendering of each single\n             * series. Properties are inherited from [tooltip](#tooltip).\n             * Overridable properties are `headerFormat`, `pointFormat`,\n             * `yDecimals`, `xDateFormat`, `yPrefix` and `ySuffix`. Unlike other\n             * series, in a scatter plot the series.name by default shows in the\n             * headerFormat and point.x and point.y in the pointFormat.\n             *\n             * @product highcharts highstock\n             */\n            tooltip: {\n                headerFormat: '<span style=\"color:{point.color}\">\\u25CF</span> ' +\n                    '<span style=\"font-size: 10px\"> {series.name}</span><br/>',\n                pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'\n            }\n            // Prototype members\n        }, {\n            sorted: false,\n            requireSorting: false,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n            takeOrdinalPosition: false,\n            /* eslint-disable valid-jsdoc */\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.scatter#drawGraph\n             */\n            drawGraph: function () {\n                if (this.options.lineWidth) {\n                    Series.prototype.drawGraph.call(this);\n                }\n            },\n            // Optionally add the jitter effect\n            applyJitter: function () {\n                var series = this,\n                    jitter = this.options.jitter,\n                    len = this.points.length;\n                /**\n                 * Return a repeatable, pseudo-random number based on an integer\n                 * seed.\n                 * @private\n                 */\n                function unrandom(seed) {\n                    var rand = Math.sin(seed) * 10000;\n                    return rand - Math.floor(rand);\n                }\n                if (jitter) {\n                    this.points.forEach(function (point, i) {\n                        ['x', 'y'].forEach(function (dim, j) {\n                            var axis,\n                                plotProp = 'plot' + dim.toUpperCase(),\n                                min,\n                                max,\n                                translatedJitter;\n                            if (jitter[dim] && !point.isNull) {\n                                axis = series[dim + 'Axis'];\n                                translatedJitter =\n                                    jitter[dim] * axis.transA;\n                                if (axis && !axis.isLog) {\n                                    // Identify the outer bounds of the jitter range\n                                    min = Math.max(0, point[plotProp] - translatedJitter);\n                                    max = Math.min(axis.len, point[plotProp] + translatedJitter);\n                                    // Find a random position within this range\n                                    point[plotProp] = min +\n                                        (max - min) * unrandom(i + j * len);\n                                    // Update clientX for the tooltip k-d-tree\n                                    if (dim === 'x') {\n                                        point.clientX = point.plotX;\n                                    }\n                                }\n                            }\n                        });\n                    });\n                }\n            }\n            /* eslint-enable valid-jsdoc */\n        });\n        /* eslint-disable no-invalid-this */\n        addEvent(Series, 'afterTranslate', function () {\n            if (this.applyJitter) {\n                this.applyJitter();\n            }\n        });\n        /* eslint-enable no-invalid-this */\n        /**\n         * A `scatter` series. If the [type](#series.scatter.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.scatter\n         * @excluding dataParser, dataURL, useOhlcData\n         * @product   highcharts highstock\n         * @apioption series.scatter\n         */\n        /**\n         * An array of data points for the series. For the `scatter` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. The `x` values will be automatically\n         *    calculated, either starting at 0 and incremented by 1, or from\n         *    `pointStart` and `pointInterval` given in the series options. If the axis\n         *    has categories, these will be used. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of arrays with 2 values. In this case, the values correspond to\n         *    `x,y`. If the first value is a string, it is applied as the name of the\n         *    point, and the `x` value is inferred.\n         *    ```js\n         *    data: [\n         *        [0, 0],\n         *        [1, 8],\n         *        [2, 9]\n         *    ]\n         *    ```\n         *\n         * 3. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.scatter.turboThreshold), this option is not\n         *    available.\n         *    ```js\n         *    data: [{\n         *        x: 1,\n         *        y: 2,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        x: 1,\n         *        y: 4,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<(number|string),(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @product   highcharts highstock\n         * @apioption series.scatter.data\n         */\n        ''; // adds doclets above to transpilat\n\n    });\n    _registerModule(_modules, 'mixins/centered-series.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        /**\n         * @private\n         * @interface Highcharts.RadianAngles\n         */ /**\n        * @name Highcharts.RadianAngles#end\n        * @type {number}\n        */ /**\n        * @name Highcharts.RadianAngles#start\n        * @type {number}\n        */\n        var isNumber = U.isNumber,\n            pick = U.pick,\n            relativeLength = U.relativeLength;\n        var deg2rad = H.deg2rad;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * @private\n         * @mixin Highcharts.CenteredSeriesMixin\n         */\n        H.CenteredSeriesMixin = {\n            /**\n             * Get the center of the pie based on the size and center options relative\n             * to the plot area. Borrowed by the polar and gauge series types.\n             *\n             * @private\n             * @function Highcharts.CenteredSeriesMixin.getCenter\n             *\n             * @return {Array<number>}\n             */\n            getCenter: function () {\n                var options = this.options,\n                    chart = this.chart,\n                    slicingRoom = 2 * (options.slicedOffset || 0),\n                    handleSlicingRoom,\n                    plotWidth = chart.plotWidth - 2 * slicingRoom,\n                    plotHeight = chart.plotHeight - 2 * slicingRoom,\n                    centerOption = options.center,\n                    smallestSize = Math.min(plotWidth,\n                    plotHeight),\n                    size = options.size,\n                    innerSize = options.innerSize || 0,\n                    positions,\n                    i,\n                    value;\n                if (typeof size === 'string') {\n                    size = parseFloat(size);\n                }\n                if (typeof innerSize === 'string') {\n                    innerSize = parseFloat(innerSize);\n                }\n                positions = [\n                    pick(centerOption[0], '50%'),\n                    pick(centerOption[1], '50%'),\n                    // Prevent from negative values\n                    pick(size && size < 0 ? void 0 : options.size, '100%'),\n                    pick(innerSize && innerSize < 0 ? void 0 : options.innerSize || 0, '0%')\n                ];\n                // No need for inner size in angular (gauges) series but still required\n                // for pie series\n                if (chart.angular && !(this instanceof H.Series)) {\n                    positions[3] = 0;\n                }\n                for (i = 0; i < 4; ++i) {\n                    value = positions[i];\n                    handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n                    // i == 0: centerX, relative to width\n                    // i == 1: centerY, relative to height\n                    // i == 2: size, relative to smallestSize\n                    // i == 3: innerSize, relative to size\n                    positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) + (handleSlicingRoom ? slicingRoom : 0);\n                }\n                // innerSize cannot be larger than size (#3632)\n                if (positions[3] > positions[2]) {\n                    positions[3] = positions[2];\n                }\n                return positions;\n            },\n            /**\n             * getStartAndEndRadians - Calculates start and end angles in radians.\n             * Used in series types such as pie and sunburst.\n             *\n             * @private\n             * @function Highcharts.CenteredSeriesMixin.getStartAndEndRadians\n             *\n             * @param {number} [start]\n             *        Start angle in degrees.\n             *\n             * @param {number} [end]\n             *        Start angle in degrees.\n             *\n             * @return {Highcharts.RadianAngles}\n             *         Returns an object containing start and end angles as radians.\n             */\n            getStartAndEndRadians: function (start, end) {\n                var startAngle = isNumber(start) ? start : 0, // must be a number\n                    endAngle = ((isNumber(end) && // must be a number\n                        end > startAngle && // must be larger than the start angle\n                        // difference must be less than 360 degrees\n                        (end - startAngle) < 360) ?\n                        end :\n                        startAngle + 360),\n                    correction = -90;\n                return {\n                    start: deg2rad * (startAngle + correction),\n                    end: deg2rad * (endAngle + correction)\n                };\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/PieSeries.js', [_modules['parts/Globals.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (H, LegendSymbolMixin, Point, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            clamp = U.clamp,\n            defined = U.defined,\n            fireEvent = U.fireEvent,\n            isNumber = U.isNumber,\n            merge = U.merge,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            seriesType = U.seriesType,\n            setAnimation = U.setAnimation;\n        var CenteredSeriesMixin = H.CenteredSeriesMixin,\n            getStartAndEndRadians = CenteredSeriesMixin.getStartAndEndRadians,\n            noop = H.noop,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes;\n        /**\n         * Pie series type.\n         *\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.pie\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('pie', 'line', \n        /**\n         * A pie chart is a circular graphic which is divided into slices to\n         * illustrate numerical proportion.\n         *\n         * @sample highcharts/demo/pie-basic/\n         *         Pie chart\n         *\n         * @extends      plotOptions.line\n         * @excluding    animationLimit, boostThreshold, connectEnds, connectNulls,\n         *               cropThreshold, dashStyle, dataSorting, dragDrop,\n         *               findNearestPointBy, getExtremesFromAll, label, lineWidth,\n         *               marker, negativeColor, pointInterval, pointIntervalUnit,\n         *               pointPlacement, pointStart, softThreshold, stacking, step,\n         *               threshold, turboThreshold, zoneAxis, zones, dataSorting\n         * @product      highcharts\n         * @optionparent plotOptions.pie\n         */\n        {\n            /**\n             * @excluding legendItemClick\n             * @apioption plotOptions.pie.events\n             */\n            /**\n             * Fires when the checkbox next to the point name in the legend is\n             * clicked. One parameter, event, is passed to the function. The state\n             * of the checkbox is found by event.checked. The checked item is found\n             * by event.item. Return false to prevent the default action which is to\n             * toggle the select state of the series.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-events-checkboxclick/\n             *         Alert checkbox status\n             *\n             * @type      {Function}\n             * @since     1.2.0\n             * @product   highcharts\n             * @context   Highcharts.Point\n             * @apioption plotOptions.pie.events.checkboxClick\n             */\n            /**\n             * Fires when the legend item belonging to the pie point (slice) is\n             * clicked. The `this` keyword refers to the point itself. One\n             * parameter, `event`, is passed to the function, containing common\n             * event information. The default action is to toggle the visibility of\n             * the point. This can be prevented by calling `event.preventDefault()`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-point-events-legenditemclick/\n             *         Confirm toggle visibility\n             *\n             * @type      {Highcharts.PointLegendItemClickCallbackFunction}\n             * @since     1.2.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.point.events.legendItemClick\n             */\n            /**\n             * The center of the pie chart relative to the plot area. Can be\n             * percentages or pixel values. The default behaviour (as of 3.0) is to\n             * center the pie so that all slices and data labels are within the plot\n             * area. As a consequence, the pie may actually jump around in a chart\n             * with dynamic values, as the data labels move. In that case, the\n             * center should be explicitly set, for example to `[\"50%\", \"50%\"]`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-center/\n             *         Centered at 100, 100\n             *\n             * @type    {Array<(number|string|null),(number|string|null)>}\n             * @default [null, null]\n             * @product highcharts\n             *\n             * @private\n             */\n            center: [null, null],\n            /**\n             * The color of the pie series. A pie series is represented as an empty\n             * circle if the total sum of its values is 0. Use this property to\n             * define the color of its border.\n             *\n             * In styled mode, the color can be defined by the\n             * [colorIndex](#plotOptions.series.colorIndex) option. Also, the series\n             * color can be set with the `.highcharts-series`,\n             * `.highcharts-color-{n}`, `.highcharts-{type}-series` or\n             * `.highcharts-series-{n}` class, or individual classes given by the\n             * `className` option.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n             *         Empty pie series\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default   #cccccc\n             * @apioption plotOptions.pie.color\n             */\n            /**\n             * @product highcharts\n             *\n             * @private\n             */\n            clip: false,\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            colorByPoint: true,\n            /**\n             * A series specific or series type specific color set to use instead\n             * of the global [colors](#colors).\n             *\n             * @sample {highcharts} highcharts/demo/pie-monochrome/\n             *         Set default colors for all pies\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.colors\n             */\n            /**\n             * @declare   Highcharts.SeriesPieDataLabelsOptionsObject\n             * @extends   plotOptions.series.dataLabels\n             * @excluding align, allowOverlap, inside, staggerLines, step\n             * @private\n             */\n            dataLabels: {\n                /**\n                 * Alignment method for data labels. Possible values are:\n                 *\n                 * - `toPlotEdges`: Each label touches the nearest vertical edge of\n                 *   the plot area.\n                 *\n                 * - `connectors`: Connectors have the same x position and the\n                 *   widest label of each half (left & right) touches the nearest\n                 *   vertical edge of the plot area.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-connectors/\n                 *         alignTo: connectors\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-alignto-plotedges/\n                 *         alignTo: plotEdges\n                 *\n                 * @type      {string}\n                 * @since     7.0.0\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.alignTo\n                 */\n                allowOverlap: true,\n                /**\n                 * The color of the line connecting the data label to the pie slice.\n                 * The default color is the same as the point's color.\n                 *\n                 * In styled mode, the connector stroke is given in the\n                 * `.highcharts-data-label-connector` class.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorcolor/\n                 *         Blue connectors\n                 * @sample {highcharts} highcharts/css/pie-point/\n                 *         Styled connectors\n                 *\n                 * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since     2.1\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.connectorColor\n                 */\n                /**\n                 * The distance from the data label to the connector. Note that\n                 * data labels also have a default `padding`, so in order for the\n                 * connector to touch the text, the `padding` must also be 0.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorpadding/\n                 *         No padding\n                 *\n                 * @since   2.1\n                 * @product highcharts\n                 */\n                connectorPadding: 5,\n                /**\n                 * Specifies the method that is used to generate the connector path.\n                 * Highcharts provides 3 built-in connector shapes: `'fixedOffset'`\n                 * (default), `'straight'` and `'crookedLine'`. Using\n                 * `'crookedLine'` has the most sense (in most of the cases) when\n                 * `'alignTo'` is set.\n                 *\n                 * Users can provide their own method by passing a function instead\n                 * of a String. 3 arguments are passed to the callback:\n                 *\n                 * - Object that holds the information about the coordinates of the\n                 *   label (`x` & `y` properties) and how the label is located in\n                 *   relation to the pie (`alignment` property). `alignment` can by\n                 *   one of the following:\n                 *   `'left'` (pie on the left side of the data label),\n                 *   `'right'` (pie on the right side of the data label) or\n                 *   `'center'` (data label overlaps the pie).\n                 *\n                 * - Object that holds the information about the position of the\n                 *   connector. Its `touchingSliceAt`  porperty tells the position\n                 *   of the place where the connector touches the slice.\n                 *\n                 * - Data label options\n                 *\n                 * The function has to return an SVG path definition in array form\n                 * (see the example).\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorshape-string/\n                 *         connectorShape is a String\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorshape-function/\n                 *         connectorShape is a function\n                 *\n                 * @type    {string|Function}\n                 * @since   7.0.0\n                 * @product highcharts\n                 */\n                connectorShape: 'fixedOffset',\n                /**\n                 * The width of the line connecting the data label to the pie slice.\n                 *\n                 * In styled mode, the connector stroke width is given in the\n                 * `.highcharts-data-label-connector` class.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-connectorwidth-disabled/\n                 *         Disable the connector\n                 * @sample {highcharts} highcharts/css/pie-point/\n                 *         Styled connectors\n                 *\n                 * @type      {number}\n                 * @default   1\n                 * @since     2.1\n                 * @product   highcharts\n                 * @apioption plotOptions.pie.dataLabels.connectorWidth\n                 */\n                /**\n                 * Works only if `connectorShape` is `'crookedLine'`. It defines how\n                 * far from the vertical plot edge the coonnector path should be\n                 * crooked.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-crookdistance/\n                 *         crookDistance set to 90%\n                 *\n                 * @since   7.0.0\n                 * @product highcharts\n                 */\n                crookDistance: '70%',\n                /**\n                 * The distance of the data label from the pie's edge. Negative\n                 * numbers put the data label on top of the pie slices. Can also be\n                 * defined as a percentage of pie's radius. Connectors are only\n                 * shown for data labels outside the pie.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-distance/\n                 *         Data labels on top of the pie\n                 *\n                 * @type    {number|string}\n                 * @since   2.1\n                 * @product highcharts\n                 */\n                distance: 30,\n                enabled: true,\n                formatter: function () {\n                    return this.point.isNull ? void 0 : this.point.name;\n                },\n                /**\n                 * Whether to render the connector as a soft arc or a line with\n                 * sharp break. Works only if `connectorShape` equals to\n                 * `fixedOffset`.\n                 *\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-softconnector-true/\n                 *         Soft\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-softconnector-false/\n                 *         Non soft\n                 *\n                 * @since   2.1.7\n                 * @product highcharts\n                 */\n                softConnector: true,\n                /**\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow\n                 *         Long labels truncated with an ellipsis\n                 * @sample {highcharts} highcharts/plotoptions/pie-datalabels-overflow-wrap\n                 *         Long labels are wrapped\n                 *\n                 * @type      {Highcharts.CSSObject}\n                 * @apioption plotOptions.pie.dataLabels.style\n                 */\n                x: 0\n            },\n            /**\n             * If the total sum of the pie's values is 0, the series is represented\n             * as an empty circle . The `fillColor` option defines the color of that\n             * circle. Use [pie.borderWidth](#plotOptions.pie.borderWidth) to set\n             * the border thickness.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-emptyseries/\n             *         Empty pie series\n             *\n             * @type {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @private\n             */\n            fillColor: void 0,\n            /**\n             * The end angle of the pie in degrees where 0 is top and 90 is right.\n             * Defaults to `startAngle` plus 360.\n             *\n             * @sample {highcharts} highcharts/demo/pie-semi-circle/\n             *         Semi-circle donut\n             *\n             * @type      {number}\n             * @since     1.3.6\n             * @product   highcharts\n             * @apioption plotOptions.pie.endAngle\n             */\n            /**\n             * Equivalent to [chart.ignoreHiddenSeries](#chart.ignoreHiddenSeries),\n             * this option tells whether the series shall be redrawn as if the\n             * hidden point were `null`.\n             *\n             * The default value changed from `false` to `true` with Highcharts\n             * 3.0.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-ignorehiddenpoint/\n             *         True, the hiddden point is ignored\n             *\n             * @since   2.3.0\n             * @product highcharts\n             *\n             * @private\n             */\n            ignoreHiddenPoint: true,\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            inactiveOtherPoints: true,\n            /**\n             * The size of the inner diameter for the pie. A size greater than 0\n             * renders a donut chart. Can be a percentage or pixel value.\n             * Percentages are relative to the pie size. Pixel values are given as\n             * integers.\n             *\n             *\n             * Note: in Highcharts < 4.1.2, the percentage was relative to the plot\n             * area, not the pie size.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-innersize-80px/\n             *         80px inner size\n             * @sample {highcharts} highcharts/plotoptions/pie-innersize-50percent/\n             *         50% of the plot area\n             * @sample {highcharts} highcharts/demo/3d-pie-donut/\n             *         3D donut\n             *\n             * @type      {number|string}\n             * @default   0\n             * @since     2.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.innerSize\n             */\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            legendType: 'point',\n            /**\n             * @ignore-option\n             *\n             * @private\n             */\n            marker: null,\n            /**\n             * The minimum size for a pie in response to auto margins. The pie will\n             * try to shrink to make room for data labels in side the plot area,\n             *  but only to this size.\n             *\n             * @type      {number|string}\n             * @default   80\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.pie.minSize\n             */\n            /**\n             * The diameter of the pie relative to the plot area. Can be a\n             * percentage or pixel value. Pixel values are given as integers. The\n             * default behaviour (as of 3.0) is to scale to the plot area and give\n             * room for data labels within the plot area.\n             * [slicedOffset](#plotOptions.pie.slicedOffset) is also included in the\n             * default size calculation. As a consequence, the size of the pie may\n             * vary when points are updated and data labels more around. In that\n             * case it is best to set a fixed value, for example `\"75%\"`.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-size/\n             *         Smaller pie\n             *\n             * @type    {number|string|null}\n             * @product highcharts\n             *\n             * @private\n             */\n            size: null,\n            /**\n             * Whether to display this particular series or series type in the\n             * legend. Since 2.1, pies are not shown in the legend by default.\n             *\n             * @sample {highcharts} highcharts/plotoptions/series-showinlegend/\n             *         One series in the legend, one hidden\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            showInLegend: false,\n            /**\n             * If a point is sliced, moved out from the center, how many pixels\n             * should it be moved?.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-slicedoffset-20/\n             *         20px offset\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            slicedOffset: 10,\n            /**\n             * The start angle of the pie slices in degrees where 0 is top and 90\n             * right.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-startangle-90/\n             *         Start from right\n             *\n             * @type      {number}\n             * @default   0\n             * @since     2.3.4\n             * @product   highcharts\n             * @apioption plotOptions.pie.startAngle\n             */\n            /**\n             * Sticky tracking of mouse events. When true, the `mouseOut` event\n             * on a series isn't triggered until the mouse moves over another\n             * series, or out of the plot area. When false, the `mouseOut` event on\n             * a series is triggered when the mouse leaves the area around the\n             * series'  graph or markers. This also implies the tooltip. When\n             * `stickyTracking` is false and `tooltip.shared` is false, the tooltip\n             * will be hidden when moving the mouse between series.\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            stickyTracking: false,\n            tooltip: {\n                followPointer: true\n            },\n            /**\n             * The color of the border surrounding each slice. When `null`, the\n             * border takes the same color as the slice fill. This can be used\n             * together with a `borderWidth` to fill drawing gaps created by\n             * antialiazing artefacts in borderless pies.\n             *\n             * In styled mode, the border stroke is given in the `.highcharts-point`\n             * class.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-bordercolor-black/\n             *         Black border\n             *\n             * @type    {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @default #ffffff\n             * @product highcharts\n             *\n             * @private\n             */\n            borderColor: '#ffffff',\n            /**\n             * The width of the border surrounding each slice.\n             *\n             * When setting the border width to 0, there may be small gaps between\n             * the slices due to SVG antialiasing artefacts. To work around this,\n             * keep the border width at 0.5 or 1, but set the `borderColor` to\n             * `null` instead.\n             *\n             * In styled mode, the border stroke width is given in the\n             * `.highcharts-point` class.\n             *\n             * @sample {highcharts} highcharts/plotoptions/pie-borderwidth/\n             *         3px border\n             *\n             * @product highcharts\n             *\n             * @private\n             */\n            borderWidth: 1,\n            /**\n             * @ignore-options\n             * @private\n             */\n            lineWidth: void 0,\n            states: {\n                /**\n                 * @extends   plotOptions.series.states.hover\n                 * @excluding marker, lineWidth, lineWidthPlus\n                 * @product   highcharts\n                 */\n                hover: {\n                    /**\n                     * How much to brighten the point on interaction. Requires the\n                     * main color to be defined in hex or rgb(a) format.\n                     *\n                     * In styled mode, the hover brightness is by default replaced\n                     * by a fill-opacity given in the `.highcharts-point-hover`\n                     * class.\n                     *\n                     * @sample {highcharts} highcharts/plotoptions/pie-states-hover-brightness/\n                     *         Brightened by 0.5\n                     *\n                     * @product highcharts\n                     */\n                    brightness: 0.1\n                }\n            }\n        }, \n        /* eslint-disable valid-jsdoc */\n        /**\n         * @lends seriesTypes.pie.prototype\n         */\n        {\n            isCartesian: false,\n            requireSorting: false,\n            directTouch: true,\n            noSharedTooltip: true,\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            axisTypes: [],\n            pointAttribs: seriesTypes.column.prototype.pointAttribs,\n            /**\n             * Animate the pies in\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#animate\n             *\n             * @param {boolean} [init=false]\n             */\n            animate: function (init) {\n                var series = this,\n                    points = series.points,\n                    startAngleRad = series.startAngleRad;\n                if (!init) {\n                    points.forEach(function (point) {\n                        var graphic = point.graphic,\n                            args = point.shapeArgs;\n                        if (graphic && args) {\n                            // start values\n                            graphic.attr({\n                                // animate from inner radius (#779)\n                                r: pick(point.startR, (series.center && series.center[3] / 2)),\n                                start: startAngleRad,\n                                end: startAngleRad\n                            });\n                            // animate\n                            graphic.animate({\n                                r: args.r,\n                                start: args.start,\n                                end: args.end\n                            }, series.options.animation);\n                        }\n                    });\n                }\n            },\n            // Define hasData function for non-cartesian series.\n            // Returns true if the series has points at all.\n            hasData: function () {\n                return !!this.processedXData.length; // != 0\n            },\n            /**\n             * Recompute total chart sum and update percentages of points.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#updateTotals\n             * @return {void}\n             */\n            updateTotals: function () {\n                var i,\n                    total = 0,\n                    points = this.points,\n                    len = points.length,\n                    point,\n                    ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n                // Get the total sum\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    total += (ignoreHiddenPoint && !point.visible) ?\n                        0 :\n                        point.isNull ?\n                            0 :\n                            point.y;\n                }\n                this.total = total;\n                // Set each point's properties\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    point.percentage =\n                        (total > 0 && (point.visible || !ignoreHiddenPoint)) ?\n                            point.y / total * 100 :\n                            0;\n                    point.total = total;\n                }\n            },\n            /**\n             * Extend the generatePoints method by adding total and percentage\n             * properties to each point\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#generatePoints\n             * @return {void}\n             */\n            generatePoints: function () {\n                Series.prototype.generatePoints.call(this);\n                this.updateTotals();\n            },\n            /**\n             * Utility for getting the x value from a given y, used for\n             * anticollision logic in data labels. Added point for using specific\n             * points' label distance.\n             * @private\n             */\n            getX: function (y, left, point) {\n                var center = this.center, \n                    // Variable pie has individual radius\n                    radius = this.radii ?\n                        this.radii[point.index] :\n                        center[2] / 2,\n                    angle,\n                    x;\n                angle = Math.asin(clamp((y - center[1]) / (radius + point.labelDistance), -1, 1));\n                x = center[0] +\n                    (left ? -1 : 1) *\n                        (Math.cos(angle) * (radius + point.labelDistance)) +\n                    (point.labelDistance > 0 ?\n                        (left ? -1 : 1) * this.options.dataLabels.padding :\n                        0);\n                return x;\n            },\n            /**\n             * Do translation for pie slices\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#translate\n             * @param {Array<number>} [positions]\n             * @return {void}\n             */\n            translate: function (positions) {\n                this.generatePoints();\n                var series = this,\n                    cumulative = 0,\n                    precision = 1000, // issue #172\n                    options = series.options,\n                    slicedOffset = options.slicedOffset,\n                    connectorOffset = slicedOffset + (options.borderWidth || 0),\n                    finalConnectorOffset,\n                    start,\n                    end,\n                    angle,\n                    radians = getStartAndEndRadians(options.startAngle,\n                    options.endAngle),\n                    startAngleRad = series.startAngleRad = radians.start,\n                    endAngleRad = series.endAngleRad = radians.end,\n                    circ = endAngleRad - startAngleRad, // 2 * Math.PI,\n                    points = series.points, \n                    // the x component of the radius vector for a given point\n                    radiusX,\n                    radiusY,\n                    labelDistance = options.dataLabels.distance,\n                    ignoreHiddenPoint = options.ignoreHiddenPoint,\n                    i,\n                    len = points.length,\n                    point;\n                // Get positions - either an integer or a percentage string must be\n                // given. If positions are passed as a parameter, we're in a\n                // recursive loop for adjusting space for data labels.\n                if (!positions) {\n                    series.center = positions = series.getCenter();\n                }\n                // Calculate the geometry for each point\n                for (i = 0; i < len; i++) {\n                    point = points[i];\n                    // set start and end angle\n                    start = startAngleRad + (cumulative * circ);\n                    if (!ignoreHiddenPoint || point.visible) {\n                        cumulative += point.percentage / 100;\n                    }\n                    end = startAngleRad + (cumulative * circ);\n                    // set the shape\n                    point.shapeType = 'arc';\n                    point.shapeArgs = {\n                        x: positions[0],\n                        y: positions[1],\n                        r: positions[2] / 2,\n                        innerR: positions[3] / 2,\n                        start: Math.round(start * precision) / precision,\n                        end: Math.round(end * precision) / precision\n                    };\n                    // Used for distance calculation for specific point.\n                    point.labelDistance = pick((point.options.dataLabels &&\n                        point.options.dataLabels.distance), labelDistance);\n                    // Compute point.labelDistance if it's defined as percentage\n                    // of slice radius (#8854)\n                    point.labelDistance = relativeLength(point.labelDistance, point.shapeArgs.r);\n                    // Saved for later dataLabels distance calculation.\n                    series.maxLabelDistance = Math.max(series.maxLabelDistance || 0, point.labelDistance);\n                    // The angle must stay within -90 and 270 (#2645)\n                    angle = (end + start) / 2;\n                    if (angle > 1.5 * Math.PI) {\n                        angle -= 2 * Math.PI;\n                    }\n                    else if (angle < -Math.PI / 2) {\n                        angle += 2 * Math.PI;\n                    }\n                    // Center for the sliced out slice\n                    point.slicedTranslation = {\n                        translateX: Math.round(Math.cos(angle) * slicedOffset),\n                        translateY: Math.round(Math.sin(angle) * slicedOffset)\n                    };\n                    // set the anchor point for tooltips\n                    radiusX = Math.cos(angle) * positions[2] / 2;\n                    radiusY = Math.sin(angle) * positions[2] / 2;\n                    point.tooltipPos = [\n                        positions[0] + radiusX * 0.7,\n                        positions[1] + radiusY * 0.7\n                    ];\n                    point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ?\n                        1 :\n                        0;\n                    point.angle = angle;\n                    // Set the anchor point for data labels. Use point.labelDistance\n                    // instead of labelDistance // #1174\n                    // finalConnectorOffset - not override connectorOffset value.\n                    finalConnectorOffset = Math.min(connectorOffset, point.labelDistance / 5); // #1678\n                    point.labelPosition = {\n                        natural: {\n                            // initial position of the data label - it's utilized for\n                            // finding the final position for the label\n                            x: positions[0] + radiusX + Math.cos(angle) *\n                                point.labelDistance,\n                            y: positions[1] + radiusY + Math.sin(angle) *\n                                point.labelDistance\n                        },\n                        'final': {\n                        // used for generating connector path -\n                        // initialized later in drawDataLabels function\n                        // x: undefined,\n                        // y: undefined\n                        },\n                        // left - pie on the left side of the data label\n                        // right - pie on the right side of the data label\n                        // center - data label overlaps the pie\n                        alignment: point.labelDistance < 0 ?\n                            'center' : point.half ? 'right' : 'left',\n                        connectorPosition: {\n                            breakAt: {\n                                x: positions[0] + radiusX + Math.cos(angle) *\n                                    finalConnectorOffset,\n                                y: positions[1] + radiusY + Math.sin(angle) *\n                                    finalConnectorOffset\n                            },\n                            touchingSliceAt: {\n                                x: positions[0] + radiusX,\n                                y: positions[1] + radiusY\n                            }\n                        }\n                    };\n                }\n                fireEvent(series, 'afterTranslate');\n            },\n            /**\n             * Called internally to draw auxiliary graph in pie-like series in\n             * situtation when the default graph is not sufficient enough to present\n             * the data well. Auxiliary graph is saved in the same object as\n             * regular graph.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawEmpty\n             */\n            drawEmpty: function () {\n                var centerX,\n                    centerY,\n                    start = this.startAngleRad,\n                    end = this.endAngleRad,\n                    options = this.options;\n                // Draw auxiliary graph if there're no visible points.\n                if (this.total === 0) {\n                    centerX = this.center[0];\n                    centerY = this.center[1];\n                    if (!this.graph) {\n                        this.graph = this.chart.renderer\n                            .arc(centerX, centerY, this.center[1] / 2, 0, start, end)\n                            .addClass('highcharts-empty-series')\n                            .add(this.group);\n                    }\n                    this.graph.attr({\n                        d: Highcharts.SVGRenderer.prototype.symbols.arc(centerX, centerY, this.center[2] / 2, 0, {\n                            start: start,\n                            end: end,\n                            innerR: this.center[3] / 2\n                        })\n                    });\n                    if (!this.chart.styledMode) {\n                        this.graph.attr({\n                            'stroke-width': options.borderWidth,\n                            fill: options.fillColor || 'none',\n                            stroke: options.color ||\n                                '#cccccc'\n                        });\n                    }\n                }\n                else if (this.graph) { // Destroy the graph object.\n                    this.graph = this.graph.destroy();\n                }\n            },\n            /**\n             * Draw the data points\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawPoints\n             * @return {void}\n             */\n            redrawPoints: function () {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    groupTranslation,\n                    graphic,\n                    pointAttr,\n                    shapeArgs,\n                    shadow = series.options.shadow;\n                this.drawEmpty();\n                if (shadow && !series.shadowGroup && !chart.styledMode) {\n                    series.shadowGroup = renderer.g('shadow')\n                        .attr({ zIndex: -1 })\n                        .add(series.group);\n                }\n                // draw the slices\n                series.points.forEach(function (point) {\n                    var animateTo = {};\n                    graphic = point.graphic;\n                    if (!point.isNull && graphic) {\n                        shapeArgs = point.shapeArgs;\n                        // If the point is sliced, use special translation, else use\n                        // plot area translation\n                        groupTranslation = point.getTranslate();\n                        if (!chart.styledMode) {\n                            // Put the shadow behind all points\n                            var shadowGroup = point.shadowGroup;\n                            if (shadow && !shadowGroup) {\n                                shadowGroup = point.shadowGroup = renderer\n                                    .g('shadow')\n                                    .add(series.shadowGroup);\n                            }\n                            if (shadowGroup) {\n                                shadowGroup.attr(groupTranslation);\n                            }\n                            pointAttr = series.pointAttribs(point, (point.selected && 'select'));\n                        }\n                        // Draw the slice\n                        if (!point.delayedRendering) {\n                            graphic\n                                .setRadialReference(series.center);\n                            if (!chart.styledMode) {\n                                merge(true, animateTo, pointAttr);\n                            }\n                            merge(true, animateTo, shapeArgs, groupTranslation);\n                            graphic.animate(animateTo);\n                        }\n                        else {\n                            graphic\n                                .setRadialReference(series.center)\n                                .attr(shapeArgs)\n                                .attr(groupTranslation);\n                            if (!chart.styledMode) {\n                                graphic\n                                    .attr(pointAttr)\n                                    .attr({ 'stroke-linejoin': 'round' })\n                                    .shadow(shadow, shadowGroup);\n                            }\n                            point.delayedRendering = false;\n                        }\n                        graphic.attr({\n                            visibility: point.visible ? 'inherit' : 'hidden'\n                        });\n                        graphic.addClass(point.getClassName());\n                    }\n                    else if (graphic) {\n                        point.graphic = graphic.destroy();\n                    }\n                });\n            },\n            /**\n             * Slices in pie chart are initialized in DOM, but it's shapes and\n             * animations are normally run in `drawPoints()`.\n             * @private\n             */\n            drawPoints: function () {\n                var renderer = this.chart.renderer;\n                this.points.forEach(function (point) {\n                    // When updating a series between 2d and 3d or cartesian and\n                    // polar, the shape type changes.\n                    if (point.graphic && point.hasNewShapeType()) {\n                        point.graphic = point.graphic.destroy();\n                    }\n                    if (!point.graphic) {\n                        point.graphic = renderer[point.shapeType](point.shapeArgs)\n                            .add(point.series.group);\n                        point.delayedRendering = true;\n                    }\n                });\n            },\n            /**\n             * @private\n             * @deprecated\n             * @function Highcharts.seriesTypes.pie#searchPoint\n             */\n            searchPoint: noop,\n            /**\n             * Utility for sorting data labels\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#sortByAngle\n             * @param {Array<Highcharts.Point>} points\n             * @param {number} sign\n             * @return {void}\n             */\n            sortByAngle: function (points, sign) {\n                points.sort(function (a, b) {\n                    return ((typeof a.angle !== 'undefined') &&\n                        (b.angle - a.angle) * sign);\n                });\n            },\n            /**\n             * Use a simple symbol from LegendSymbolMixin.\n             *\n             * @private\n             * @borrows Highcharts.LegendSymbolMixin.drawRectangle as Highcharts.seriesTypes.pie#drawLegendSymbol\n             */\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            /**\n             * Use the getCenter method from drawLegendSymbol.\n             *\n             * @private\n             * @borrows Highcharts.CenteredSeriesMixin.getCenter as Highcharts.seriesTypes.pie#getCenter\n             */\n            getCenter: CenteredSeriesMixin.getCenter,\n            /**\n             * Pies don't have point marker symbols.\n             *\n             * @deprecated\n             * @private\n             * @function Highcharts.seriesTypes.pie#getSymbol\n             */\n            getSymbol: noop,\n            /**\n             * @private\n             * @type {null}\n             */\n            drawGraph: null\n        }, \n        /**\n         * @lends seriesTypes.pie.prototype.pointClass.prototype\n         */\n        {\n            /**\n             * Initialize the pie slice\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#init\n             * @return {Highcharts.Point}\n             */\n            init: function () {\n                Point.prototype.init.apply(this, arguments);\n                var point = this,\n                    toggleSlice;\n                point.name = pick(point.name, 'Slice');\n                // add event listener for select\n                toggleSlice = function (e) {\n                    point.slice(e.type === 'select');\n                };\n                addEvent(point, 'select', toggleSlice);\n                addEvent(point, 'unselect', toggleSlice);\n                return point;\n            },\n            /**\n             * Negative points are not valid (#1530, #3623, #5322)\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#isValid\n             * @return {boolean}\n             */\n            isValid: function () {\n                return isNumber(this.y) && this.y >= 0;\n            },\n            /**\n             * Toggle the visibility of the pie slice\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#setVisible\n             * @param {boolean} vis\n             *        Whether to show the slice or not. If undefined, the visibility\n             *        is toggled.\n             * @param {boolean} [redraw=false]\n             * @return {void}\n             */\n            setVisible: function (vis, redraw) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n                redraw = pick(redraw, ignoreHiddenPoint);\n                if (vis !== point.visible) {\n                    // If called without an argument, toggle visibility\n                    point.visible = point.options.visible = vis =\n                        typeof vis === 'undefined' ? !point.visible : vis;\n                    // update userOptions.data\n                    series.options.data[series.data.indexOf(point)] =\n                        point.options;\n                    // Show and hide associated elements. This is performed\n                    // regardless of redraw or not, because chart.redraw only\n                    // handles full series.\n                    ['graphic', 'dataLabel', 'connector', 'shadowGroup'].forEach(function (key) {\n                        if (point[key]) {\n                            point[key][vis ? 'show' : 'hide'](true);\n                        }\n                    });\n                    if (point.legendItem) {\n                        chart.legend.colorizeItem(point, vis);\n                    }\n                    // #4170, hide halo after hiding point\n                    if (!vis && point.state === 'hover') {\n                        point.setState('');\n                    }\n                    // Handle ignore hidden slices\n                    if (ignoreHiddenPoint) {\n                        series.isDirty = true;\n                    }\n                    if (redraw) {\n                        chart.redraw();\n                    }\n                }\n            },\n            /**\n             * Set or toggle whether the slice is cut out from the pie\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#slice\n             * @param {boolean} sliced\n             *        When undefined, the slice state is toggled.\n             * @param {boolean} redraw\n             *        Whether to redraw the chart. True by default.\n             * @param {boolean|Highcharts.AnimationOptionsObject}\n             *        Animation options.\n             * @return {void}\n             */\n            slice: function (sliced, redraw, animation) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n                setAnimation(animation, chart);\n                // redraw is true by default\n                redraw = pick(redraw, true);\n                /**\n                 * Pie series only. Whether to display a slice offset from the\n                 * center.\n                 * @name Highcharts.Point#sliced\n                 * @type {boolean|undefined}\n                 */\n                // if called without an argument, toggle\n                point.sliced = point.options.sliced = sliced =\n                    defined(sliced) ? sliced : !point.sliced;\n                // update userOptions.data\n                series.options.data[series.data.indexOf(point)] =\n                    point.options;\n                if (point.graphic) {\n                    point.graphic.animate(this.getTranslate());\n                }\n                if (point.shadowGroup) {\n                    point.shadowGroup.animate(this.getTranslate());\n                }\n            },\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#getTranslate\n             * @return {Highcharts.TranslationAttributes}\n             */\n            getTranslate: function () {\n                return this.sliced ? this.slicedTranslation : {\n                    translateX: 0,\n                    translateY: 0\n                };\n            },\n            /**\n             * @private\n             * @function Highcharts.seriesTypes.pie#pointClass#haloPath\n             * @param {number} size\n             * @return {Highcharts.SVGPathArray}\n             */\n            haloPath: function (size) {\n                var shapeArgs = this.shapeArgs;\n                return this.sliced || !this.visible ?\n                    [] :\n                    this.series.chart.renderer.symbols.arc(shapeArgs.x, shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {\n                        // Substract 1px to ensure the background is not bleeding\n                        // through between the halo and the slice (#7495).\n                        innerR: shapeArgs.r - 1,\n                        start: shapeArgs.start,\n                        end: shapeArgs.end\n                    });\n            },\n            connectorShapes: {\n                // only one available before v7.0.0\n                fixedOffset: function (labelPosition, connectorPosition, options) {\n                    var breakAt = connectorPosition.breakAt,\n                        touchingSliceAt = connectorPosition.touchingSliceAt,\n                        lineSegment = options.softConnector ? [\n                            'C',\n                            // 1st control point (of the curve)\n                            labelPosition.x +\n                                // 5 gives the connector a little horizontal bend\n                                (labelPosition.alignment === 'left' ? -5 : 5),\n                            labelPosition.y,\n                            2 * breakAt.x - touchingSliceAt.x,\n                            2 * breakAt.y - touchingSliceAt.y,\n                            breakAt.x,\n                            breakAt.y //\n                        ] : [\n                            'L',\n                            breakAt.x,\n                            breakAt.y\n                        ];\n                    // assemble the path\n                    return ([\n                        ['M', labelPosition.x, labelPosition.y],\n                        lineSegment,\n                        ['L', touchingSliceAt.x, touchingSliceAt.y]\n                    ]);\n                },\n                straight: function (labelPosition, connectorPosition) {\n                    var touchingSliceAt = connectorPosition.touchingSliceAt;\n                    // direct line to the slice\n                    return [\n                        ['M', labelPosition.x, labelPosition.y],\n                        ['L', touchingSliceAt.x, touchingSliceAt.y]\n                    ];\n                },\n                crookedLine: function (labelPosition, connectorPosition, options) {\n                    var touchingSliceAt = connectorPosition.touchingSliceAt,\n                        series = this.series,\n                        pieCenterX = series.center[0],\n                        plotWidth = series.chart.plotWidth,\n                        plotLeft = series.chart.plotLeft,\n                        alignment = labelPosition.alignment,\n                        radius = this.shapeArgs.r,\n                        crookDistance = relativeLength(// % to fraction\n                        options.crookDistance, 1),\n                        crookX = alignment === 'left' ?\n                            pieCenterX + radius + (plotWidth + plotLeft -\n                                pieCenterX - radius) * (1 - crookDistance) :\n                            plotLeft + (pieCenterX - radius) * crookDistance,\n                        segmentWithCrook = [\n                            'L',\n                            crookX,\n                            labelPosition.y\n                        ],\n                        useCrook = true;\n                    // crookedLine formula doesn't make sense if the path overlaps\n                    // the label - use straight line instead in that case\n                    if (alignment === 'left' ?\n                        (crookX > labelPosition.x || crookX < touchingSliceAt.x) :\n                        (crookX < labelPosition.x || crookX > touchingSliceAt.x)) {\n                        useCrook = false;\n                    }\n                    // assemble the path\n                    var path = [\n                            ['M',\n                        labelPosition.x,\n                        labelPosition.y]\n                        ];\n                    if (useCrook) {\n                        path.push(segmentWithCrook);\n                    }\n                    path.push(['L', touchingSliceAt.x, touchingSliceAt.y]);\n                    return path;\n                }\n            },\n            /**\n             * Extendable method for getting the path of the connector between the\n             * data label and the pie slice.\n             */\n            getConnectorPath: function () {\n                var labelPosition = this.labelPosition,\n                    options = this.series.options.dataLabels,\n                    connectorShape = options.connectorShape,\n                    predefinedShapes = this.connectorShapes;\n                // find out whether to use the predefined shape\n                if (predefinedShapes[connectorShape]) {\n                    connectorShape = predefinedShapes[connectorShape];\n                }\n                return connectorShape.call(this, {\n                    // pass simplified label position object for user's convenience\n                    x: labelPosition.final.x,\n                    y: labelPosition.final.y,\n                    alignment: labelPosition.alignment\n                }, labelPosition.connectorPosition, options);\n            }\n        }\n        /* eslint-enable valid-jsdoc */\n        );\n        /**\n         * A `pie` series. If the [type](#series.pie.type) option is not specified,\n         * it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.pie\n         * @excluding dataParser, dataURL, stack, xAxis, yAxis, dataSorting, step\n         * @product   highcharts\n         * @apioption series.pie\n         */\n        /**\n         * An array of data points for the series. For the `pie` series type,\n         * points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `y` options. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.pie.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *    data: [{\n         *        y: 1,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *    }, {\n         *        y: 7,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *    }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-arrays/\n         *         Arrays of numeric x and y\n         * @sample {highcharts} highcharts/series/data-array-of-arrays-datetime/\n         *         Arrays of datetime x and y\n         * @sample {highcharts} highcharts/series/data-array-of-name-value/\n         *         Arrays of point.name and y\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|Array<string,(number|null)>|null|*>}\n         * @extends   series.line.data\n         * @excluding marker, x\n         * @product   highcharts\n         * @apioption series.pie.data\n         */\n        /**\n         * @type      {Highcharts.SeriesPieDataLabelsOptionsObject}\n         * @product   highcharts\n         * @apioption series.pie.data.dataLabels\n         */\n        /**\n         * The sequential index of the data point in the legend.\n         *\n         * @type      {number}\n         * @product   highcharts\n         * @apioption series.pie.data.legendIndex\n         */\n        /**\n         * Whether to display a slice offset from the center.\n         *\n         * @sample {highcharts} highcharts/point/sliced/\n         *         One sliced point\n         *\n         * @type      {boolean}\n         * @product   highcharts\n         * @apioption series.pie.data.sliced\n         */\n        /**\n         * @excluding legendItemClick\n         * @product   highcharts\n         * @apioption series.pie.events\n         */\n        ''; // placeholder for transpiled doclets above\n\n    });\n    _registerModule(_modules, 'parts/DataLabels.js', [_modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (H, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var noop = H.noop,\n            seriesTypes = H.seriesTypes;\n        var animObject = U.animObject,\n            arrayMax = U.arrayMax,\n            clamp = U.clamp,\n            defined = U.defined,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            format = U.format,\n            isArray = U.isArray,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            relativeLength = U.relativeLength,\n            splat = U.splat,\n            stableSort = U.stableSort;\n        /**\n         * Callback JavaScript function to format the data label as a string. Note that\n         * if a `format` is defined, the format takes precedence and the formatter is\n         * ignored.\n         *\n         * @callback Highcharts.DataLabelsFormatterCallbackFunction\n         *\n         * @param {Highcharts.PointLabelObject} this\n         * Data label context to format\n         *\n         * @param {Highcharts.DataLabelsOptions} options\n         * [API options](/highcharts/plotOptions.series.dataLabels) of the data label\n         *\n         * @return {number|string|null|undefined}\n         * Formatted data label text\n         */\n        /**\n         * Values for handling data labels that flow outside the plot area.\n         *\n         * @typedef {\"allow\"|\"justify\"} Highcharts.DataLabelsOverflowValue\n         */\n        var Series = H.Series;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * General distribution algorithm for distributing labels of differing size\n         * along a confined length in two dimensions. The algorithm takes an array of\n         * objects containing a size, a target and a rank. It will place the labels as\n         * close as possible to their targets, skipping the lowest ranked labels if\n         * necessary.\n         *\n         * @private\n         * @function Highcharts.distribute\n         * @param {Highcharts.DataLabelsBoxArray} boxes\n         * @param {number} len\n         * @param {number} [maxDistance]\n         * @return {void}\n         */\n        H.distribute = function (boxes, len, maxDistance) {\n            var i,\n                overlapping = true,\n                origBoxes = boxes, // Original array will be altered with added .pos\n                restBoxes = [], // The outranked overshoot\n                box,\n                target,\n                total = 0,\n                reducedLen = origBoxes.reducedLen || len;\n            /**\n             * @private\n             */\n            function sortByTarget(a, b) {\n                return a.target - b.target;\n            }\n            // If the total size exceeds the len, remove those boxes with the lowest\n            // rank\n            i = boxes.length;\n            while (i--) {\n                total += boxes[i].size;\n            }\n            // Sort by rank, then slice away overshoot\n            if (total > reducedLen) {\n                stableSort(boxes, function (a, b) {\n                    return (b.rank || 0) - (a.rank || 0);\n                });\n                i = 0;\n                total = 0;\n                while (total <= reducedLen) {\n                    total += boxes[i].size;\n                    i++;\n                }\n                restBoxes = boxes.splice(i - 1, boxes.length);\n            }\n            // Order by target\n            stableSort(boxes, sortByTarget);\n            // So far we have been mutating the original array. Now\n            // create a copy with target arrays\n            boxes = boxes.map(function (box) {\n                return {\n                    size: box.size,\n                    targets: [box.target],\n                    align: pick(box.align, 0.5)\n                };\n            });\n            while (overlapping) {\n                // Initial positions: target centered in box\n                i = boxes.length;\n                while (i--) {\n                    box = boxes[i];\n                    // Composite box, average of targets\n                    target = (Math.min.apply(0, box.targets) +\n                        Math.max.apply(0, box.targets)) / 2;\n                    box.pos = clamp(target - box.size * box.align, 0, len - box.size);\n                }\n                // Detect overlap and join boxes\n                i = boxes.length;\n                overlapping = false;\n                while (i--) {\n                    // Overlap\n                    if (i > 0 &&\n                        boxes[i - 1].pos + boxes[i - 1].size >\n                            boxes[i].pos) {\n                        // Add this size to the previous box\n                        boxes[i - 1].size += boxes[i].size;\n                        boxes[i - 1].targets = boxes[i - 1]\n                            .targets\n                            .concat(boxes[i].targets);\n                        boxes[i - 1].align = 0.5;\n                        // Overlapping right, push left\n                        if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n                            boxes[i - 1].pos = len - boxes[i - 1].size;\n                        }\n                        boxes.splice(i, 1); // Remove this item\n                        overlapping = true;\n                    }\n                }\n            }\n            // Add the rest (hidden boxes)\n            origBoxes.push.apply(origBoxes, restBoxes);\n            // Now the composite boxes are placed, we need to put the original boxes\n            // within them\n            i = 0;\n            boxes.some(function (box) {\n                var posInCompositeBox = 0;\n                if (box.targets.some(function () {\n                    origBoxes[i].pos = box.pos + posInCompositeBox;\n                    // If the distance between the position and the target exceeds\n                    // maxDistance, abort the loop and decrease the length in increments\n                    // of 10% to recursively reduce the  number of visible boxes by\n                    // rank. Once all boxes are within the maxDistance, we're good.\n                    if (typeof maxDistance !== 'undefined' &&\n                        Math.abs(origBoxes[i].pos - origBoxes[i].target) > maxDistance) {\n                        // Reset the positions that are already set\n                        origBoxes.slice(0, i + 1).forEach(function (box) {\n                            delete box.pos;\n                        });\n                        // Try with a smaller length\n                        origBoxes.reducedLen =\n                            (origBoxes.reducedLen || len) - (len * 0.1);\n                        // Recurse\n                        if (origBoxes.reducedLen > len * 0.1) {\n                            H.distribute(origBoxes, len, maxDistance);\n                        }\n                        // Exceeded maxDistance => abort\n                        return true;\n                    }\n                    posInCompositeBox += origBoxes[i].size;\n                    i++;\n                })) {\n                    // Exceeded maxDistance => abort\n                    return true;\n                }\n            });\n            // Add the rest (hidden) boxes and sort by target\n            stableSort(origBoxes, sortByTarget);\n        };\n        /**\n         * Draw the data labels\n         *\n         * @private\n         * @function Highcharts.Series#drawDataLabels\n         * @return {void}\n         * @fires Highcharts.Series#event:afterDrawDataLabels\n         */\n        Series.prototype.drawDataLabels = function () {\n            var series = this,\n                chart = series.chart,\n                seriesOptions = series.options,\n                seriesDlOptions = seriesOptions.dataLabels,\n                points = series.points,\n                pointOptions,\n                hasRendered = series.hasRendered || 0,\n                dataLabelsGroup,\n                seriesAnimDuration = animObject(seriesOptions.animation).duration,\n                fadeInDuration = Math.min(seriesAnimDuration, 200),\n                defer = !chart.renderer.forExport && pick(seriesDlOptions.defer,\n                fadeInDuration > 0),\n                renderer = chart.renderer;\n            /**\n             * Handle the dataLabels.filter option.\n             * @private\n             */\n            function applyFilter(point, options) {\n                var filter = options.filter,\n                    op,\n                    prop,\n                    val;\n                if (filter) {\n                    op = filter.operator;\n                    prop = point[filter.property];\n                    val = filter.value;\n                    if ((op === '>' && prop > val) ||\n                        (op === '<' && prop < val) ||\n                        (op === '>=' && prop >= val) ||\n                        (op === '<=' && prop <= val) ||\n                        (op === '==' && prop == val) || // eslint-disable-line eqeqeq\n                        (op === '===' && prop === val)) {\n                        return true;\n                    }\n                    return false;\n                }\n                return true;\n            }\n            /**\n             * Merge two objects that can be arrays. If one of them is an array, the\n             * other is merged into each element. If both are arrays, each element is\n             * merged by index. If neither are arrays, we use normal merge.\n             * @private\n             */\n            function mergeArrays(one, two) {\n                var res = [],\n                    i;\n                if (isArray(one) && !isArray(two)) {\n                    res = one.map(function (el) {\n                        return merge(el, two);\n                    });\n                }\n                else if (isArray(two) && !isArray(one)) {\n                    res = two.map(function (el) {\n                        return merge(one, el);\n                    });\n                }\n                else if (!isArray(one) && !isArray(two)) {\n                    res = merge(one, two);\n                }\n                else {\n                    i = Math.max(one.length, two.length);\n                    while (i--) {\n                        res[i] = merge(one[i], two[i]);\n                    }\n                }\n                return res;\n            }\n            // Merge in plotOptions.dataLabels for series\n            seriesDlOptions = mergeArrays(mergeArrays(chart.options.plotOptions &&\n                chart.options.plotOptions.series &&\n                chart.options.plotOptions.series.dataLabels, chart.options.plotOptions &&\n                chart.options.plotOptions[series.type] &&\n                chart.options.plotOptions[series.type].dataLabels), seriesDlOptions);\n            fireEvent(this, 'drawDataLabels');\n            if (isArray(seriesDlOptions) ||\n                seriesDlOptions.enabled ||\n                series._hasPointLabels) {\n                // Create a separate group for the data labels to avoid rotation\n                dataLabelsGroup = series.plotGroup('dataLabelsGroup', 'data-labels', defer && !hasRendered ? 'hidden' : 'inherit', // #5133, #10220\n                seriesDlOptions.zIndex || 6);\n                if (defer) {\n                    dataLabelsGroup.attr({ opacity: +hasRendered }); // #3300\n                    if (!hasRendered) {\n                        setTimeout(function () {\n                            var group = series.dataLabelsGroup;\n                            if (group) {\n                                if (series.visible) { // #2597, #3023, #3024\n                                    dataLabelsGroup.show(true);\n                                }\n                                group[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: fadeInDuration });\n                            }\n                        }, seriesAnimDuration - fadeInDuration);\n                    }\n                }\n                // Make the labels for each point\n                points.forEach(function (point) {\n                    // Merge in series options for the point.\n                    // @note dataLabelAttribs (like pointAttribs) would eradicate\n                    // the need for dlOptions, and simplify the section below.\n                    pointOptions = splat(mergeArrays(seriesDlOptions, point.dlOptions || // dlOptions is used in treemaps\n                        (point.options && point.options.dataLabels)));\n                    // Handle each individual data label for this point\n                    pointOptions.forEach(function (labelOptions, i) {\n                        // Options for one datalabel\n                        var labelEnabled = (labelOptions.enabled &&\n                                // #2282, #4641, #7112, #10049\n                                (!point.isNull || point.dataLabelOnNull) &&\n                                applyFilter(point,\n                            labelOptions)),\n                            labelConfig,\n                            formatString,\n                            labelText,\n                            style,\n                            rotation,\n                            attr,\n                            dataLabel = point.dataLabels ? point.dataLabels[i] :\n                                point.dataLabel,\n                            connector = point.connectors ? point.connectors[i] :\n                                point.connector,\n                            labelDistance = pick(labelOptions.distance,\n                            point.labelDistance),\n                            isNew = !dataLabel;\n                        if (labelEnabled) {\n                            // Create individual options structure that can be extended\n                            // without affecting others\n                            labelConfig = point.getLabelConfig();\n                            formatString = pick(labelOptions[point.formatPrefix + 'Format'], labelOptions.format);\n                            labelText = defined(formatString) ?\n                                format(formatString, labelConfig, chart) :\n                                (labelOptions[point.formatPrefix + 'Formatter'] ||\n                                    labelOptions.formatter).call(labelConfig, labelOptions);\n                            style = labelOptions.style;\n                            rotation = labelOptions.rotation;\n                            if (!chart.styledMode) {\n                                // Determine the color\n                                style.color = pick(labelOptions.color, style.color, series.color, '#000000');\n                                // Get automated contrast color\n                                if (style.color === 'contrast') {\n                                    point.contrastColor = renderer.getContrast((point.color || series.color));\n                                    style.color = (!defined(labelDistance) &&\n                                        labelOptions.inside) ||\n                                        labelDistance < 0 ||\n                                        !!seriesOptions.stacking ?\n                                        point.contrastColor :\n                                        '#000000';\n                                }\n                                else {\n                                    delete point.contrastColor;\n                                }\n                                if (seriesOptions.cursor) {\n                                    style.cursor = seriesOptions.cursor;\n                                }\n                            }\n                            attr = {\n                                r: labelOptions.borderRadius || 0,\n                                rotation: rotation,\n                                padding: labelOptions.padding,\n                                zIndex: 1\n                            };\n                            if (!chart.styledMode) {\n                                attr.fill = labelOptions.backgroundColor;\n                                attr.stroke = labelOptions.borderColor;\n                                attr['stroke-width'] = labelOptions.borderWidth;\n                            }\n                            // Remove unused attributes (#947)\n                            objectEach(attr, function (val, name) {\n                                if (typeof val === 'undefined') {\n                                    delete attr[name];\n                                }\n                            });\n                        }\n                        // If the point is outside the plot area, destroy it. #678, #820\n                        if (dataLabel && (!labelEnabled || !defined(labelText))) {\n                            point.dataLabel =\n                                point.dataLabel && point.dataLabel.destroy();\n                            if (point.dataLabels) {\n                                // Remove point.dataLabels if this was the last one\n                                if (point.dataLabels.length === 1) {\n                                    delete point.dataLabels;\n                                }\n                                else {\n                                    delete point.dataLabels[i];\n                                }\n                            }\n                            if (!i) {\n                                delete point.dataLabel;\n                            }\n                            if (connector) {\n                                point.connector = point.connector.destroy();\n                                if (point.connectors) {\n                                    // Remove point.connectors if this was the last one\n                                    if (point.connectors.length === 1) {\n                                        delete point.connectors;\n                                    }\n                                    else {\n                                        delete point.connectors[i];\n                                    }\n                                }\n                            }\n                            // Individual labels are disabled if the are explicitly disabled\n                            // in the point options, or if they fall outside the plot area.\n                        }\n                        else if (labelEnabled && defined(labelText)) {\n                            if (!dataLabel) {\n                                // Create new label element\n                                point.dataLabels = point.dataLabels || [];\n                                dataLabel = point.dataLabels[i] = rotation ?\n                                    // Labels don't rotate, use text element\n                                    renderer.text(labelText, 0, -9999, labelOptions.useHTML)\n                                        .addClass('highcharts-data-label') :\n                                    // We can use label\n                                    renderer.label(labelText, 0, -9999, labelOptions.shape, null, null, labelOptions.useHTML, null, 'data-label');\n                                // Store for backwards compatibility\n                                if (!i) {\n                                    point.dataLabel = dataLabel;\n                                }\n                                dataLabel.addClass(' highcharts-data-label-color-' + point.colorIndex +\n                                    ' ' + (labelOptions.className || '') +\n                                    ( // #3398\n                                    labelOptions.useHTML ?\n                                        ' highcharts-tracker' :\n                                        ''));\n                            }\n                            else {\n                                // Use old element and just update text\n                                attr.text = labelText;\n                            }\n                            // Store data label options for later access\n                            dataLabel.options = labelOptions;\n                            dataLabel.attr(attr);\n                            if (!chart.styledMode) {\n                                // Styles must be applied before add in order to read\n                                // text bounding box\n                                dataLabel.css(style).shadow(labelOptions.shadow);\n                            }\n                            if (!dataLabel.added) {\n                                dataLabel.add(dataLabelsGroup);\n                            }\n                            if (labelOptions.textPath && !labelOptions.useHTML) {\n                                dataLabel.setTextPath((point.getDataLabelPath &&\n                                    point.getDataLabelPath(dataLabel)) || point.graphic, labelOptions.textPath);\n                                if (point.dataLabelPath &&\n                                    !labelOptions.textPath.enabled) {\n                                    // clean the DOM\n                                    point.dataLabelPath = point.dataLabelPath.destroy();\n                                }\n                            }\n                            // Now the data label is created and placed at 0,0, so we\n                            // need to align it\n                            series.alignDataLabel(point, dataLabel, labelOptions, null, isNew);\n                        }\n                    });\n                });\n            }\n            fireEvent(this, 'afterDrawDataLabels');\n        };\n        /**\n         * Align each individual data label.\n         *\n         * @private\n         * @function Highcharts.Series#alignDataLabel\n         * @param {Highcharts.Point} point\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.DataLabelsOptions} options\n         * @param {Highcharts.BBoxObject} alignTo\n         * @param {boolean} [isNew]\n         * @return {void}\n         */\n        Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n            var series = this,\n                chart = this.chart,\n                inverted = this.isCartesian && chart.inverted,\n                enabledDataSorting = this.enabledDataSorting,\n                plotX = pick(point.dlBox && point.dlBox.centerX,\n                point.plotX, -9999),\n                plotY = pick(point.plotY, -9999),\n                bBox = dataLabel.getBBox(),\n                baseline,\n                rotation = options.rotation,\n                normRotation,\n                negRotation,\n                align = options.align,\n                rotCorr, // rotation correction\n                isInsidePlot = chart.isInsidePlot(plotX,\n                Math.round(plotY),\n                inverted), \n                // Math.round for rounding errors (#2683), alignTo to allow column\n                // labels (#2700)\n                alignAttr, // the final position;\n            justify = pick(options.overflow, (enabledDataSorting ? 'none' : 'justify')) === 'justify', visible = this.visible &&\n                point.visible !== false &&\n                (point.series.forceDL ||\n                    (enabledDataSorting && !justify) ||\n                    isInsidePlot ||\n                    (\n                    // If the data label is inside the align box, it is enough\n                    // that parts of the align box is inside the plot area\n                    // (#12370)\n                    options.inside && alignTo && chart.isInsidePlot(plotX, inverted ?\n                        alignTo.x + 1 :\n                        alignTo.y + alignTo.height - 1, inverted))), setStartPos = function (alignOptions) {\n                if (enabledDataSorting && series.xAxis && !justify) {\n                    series.setDataLabelStartPos(point, dataLabel, isNew, isInsidePlot, alignOptions);\n                }\n            };\n            if (visible) {\n                baseline = chart.renderer.fontMetrics(chart.styledMode ? void 0 : options.style.fontSize, dataLabel).b;\n                // The alignment box is a singular point\n                alignTo = extend({\n                    x: inverted ? this.yAxis.len - plotY : plotX,\n                    y: Math.round(inverted ? this.xAxis.len - plotX : plotY),\n                    width: 0,\n                    height: 0\n                }, alignTo);\n                // Add the text size for alignment calculation\n                extend(options, {\n                    width: bBox.width,\n                    height: bBox.height\n                });\n                // Allow a hook for changing alignment in the last moment, then do the\n                // alignment\n                if (rotation) {\n                    justify = false; // Not supported for rotated text\n                    rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n                    alignAttr = {\n                        x: (alignTo.x +\n                            (options.x || 0) +\n                            alignTo.width / 2 +\n                            rotCorr.x),\n                        y: (alignTo.y +\n                            (options.y || 0) +\n                            { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] *\n                                alignTo.height)\n                    };\n                    setStartPos(alignAttr); // data sorting\n                    dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n                        .attr({\n                        align: align\n                    });\n                    // Compensate for the rotated label sticking out on the sides\n                    normRotation = (rotation + 720) % 360;\n                    negRotation = normRotation > 180 && normRotation < 360;\n                    if (align === 'left') {\n                        alignAttr.y -= negRotation ? bBox.height : 0;\n                    }\n                    else if (align === 'center') {\n                        alignAttr.x -= bBox.width / 2;\n                        alignAttr.y -= bBox.height / 2;\n                    }\n                    else if (align === 'right') {\n                        alignAttr.x -= bBox.width;\n                        alignAttr.y -= negRotation ? 0 : bBox.height;\n                    }\n                    dataLabel.placed = true;\n                    dataLabel.alignAttr = alignAttr;\n                }\n                else {\n                    setStartPos(alignTo); // data sorting\n                    dataLabel.align(options, null, alignTo);\n                    alignAttr = dataLabel.alignAttr;\n                }\n                // Handle justify or crop\n                if (justify && alignTo.height >= 0) { // #8830\n                    this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);\n                    // Now check that the data label is within the plot area\n                }\n                else if (pick(options.crop, true)) {\n                    visible =\n                        chart.isInsidePlot(alignAttr.x, alignAttr.y) &&\n                            chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n                }\n                // When we're using a shape, make it possible with a connector or an\n                // arrow pointing to thie point\n                if (options.shape && !rotation) {\n                    dataLabel[isNew ? 'attr' : 'animate']({\n                        anchorX: inverted ?\n                            chart.plotWidth - point.plotY :\n                            point.plotX,\n                        anchorY: inverted ?\n                            chart.plotHeight - point.plotX :\n                            point.plotY\n                    });\n                }\n            }\n            // To use alignAttr property in hideOverlappingLabels\n            if (isNew && enabledDataSorting) {\n                dataLabel.placed = false;\n            }\n            // Show or hide based on the final aligned position\n            if (!visible && (!enabledDataSorting || justify)) {\n                dataLabel.hide(true);\n                dataLabel.placed = false; // don't animate back in\n            }\n        };\n        /**\n         * Set starting position for data label sorting animation.\n         *\n         * @private\n         * @function Highcharts.Series#setDataLabelStartPos\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.ColumnPoint} point\n         * @param {boolean | undefined} [isNew]\n         * @param {boolean} [isInside]\n         * @param {Highcharts.AlignObject} [alignOptions]\n         *\n         * @return {void}\n         */\n        Series.prototype.setDataLabelStartPos = function (point, dataLabel, isNew, isInside, alignOptions) {\n            var chart = this.chart,\n                inverted = chart.inverted,\n                xAxis = this.xAxis,\n                reversed = xAxis.reversed,\n                labelCenter = inverted ? dataLabel.height / 2 : dataLabel.width / 2,\n                pointWidth = point.pointWidth,\n                halfWidth = pointWidth ? pointWidth / 2 : 0,\n                startXPos,\n                startYPos;\n            startXPos = inverted ?\n                alignOptions.x :\n                (reversed ?\n                    -labelCenter - halfWidth :\n                    xAxis.width - labelCenter + halfWidth);\n            startYPos = inverted ?\n                (reversed ?\n                    this.yAxis.height - labelCenter + halfWidth :\n                    -labelCenter - halfWidth) : alignOptions.y;\n            dataLabel.startXPos = startXPos;\n            dataLabel.startYPos = startYPos;\n            // We need to handle visibility in case of sorting point outside plot area\n            if (!isInside) {\n                dataLabel\n                    .attr({ opacity: 1 })\n                    .animate({ opacity: 0 }, void 0, dataLabel.hide);\n            }\n            else if (dataLabel.visibility === 'hidden') {\n                dataLabel.show();\n                dataLabel\n                    .attr({ opacity: 0 })\n                    .animate({ opacity: 1 });\n            }\n            // Save start position on first render, but do not change position\n            if (!chart.hasRendered) {\n                return;\n            }\n            // Set start position\n            if (isNew) {\n                dataLabel.attr({ x: dataLabel.startXPos, y: dataLabel.startYPos });\n            }\n            dataLabel.placed = true;\n        };\n        /**\n         * If data labels fall partly outside the plot area, align them back in, in a\n         * way that doesn't hide the point.\n         *\n         * @private\n         * @function Highcharts.Series#justifyDataLabel\n         * @param {Highcharts.SVGElement} dataLabel\n         * @param {Highcharts.DataLabelsOptions} options\n         * @param {Highcharts.SVGAttributes} alignAttr\n         * @param {Highcharts.BBoxObject} bBox\n         * @param {Highcharts.BBoxObject} [alignTo]\n         * @param {boolean} [isNew]\n         * @return {boolean|undefined}\n         */\n        Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n            var chart = this.chart,\n                align = options.align,\n                verticalAlign = options.verticalAlign,\n                off,\n                justified,\n                padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n            var _a = options.x,\n                x = _a === void 0 ? 0 : _a,\n                _b = options.y,\n                y = _b === void 0 ? 0 : _b;\n            // Off left\n            off = alignAttr.x + padding;\n            if (off < 0) {\n                if (align === 'right' && x >= 0) {\n                    options.align = 'left';\n                    options.inside = true;\n                }\n                else {\n                    x -= off;\n                }\n                justified = true;\n            }\n            // Off right\n            off = alignAttr.x + bBox.width - padding;\n            if (off > chart.plotWidth) {\n                if (align === 'left' && x <= 0) {\n                    options.align = 'right';\n                    options.inside = true;\n                }\n                else {\n                    x += chart.plotWidth - off;\n                }\n                justified = true;\n            }\n            // Off top\n            off = alignAttr.y + padding;\n            if (off < 0) {\n                if (verticalAlign === 'bottom' && y >= 0) {\n                    options.verticalAlign = 'top';\n                    options.inside = true;\n                }\n                else {\n                    y -= off;\n                }\n                justified = true;\n            }\n            // Off bottom\n            off = alignAttr.y + bBox.height - padding;\n            if (off > chart.plotHeight) {\n                if (verticalAlign === 'top' && y <= 0) {\n                    options.verticalAlign = 'bottom';\n                    options.inside = true;\n                }\n                else {\n                    y += chart.plotHeight - off;\n                }\n                justified = true;\n            }\n            if (justified) {\n                options.x = x;\n                options.y = y;\n                dataLabel.placed = !isNew;\n                dataLabel.align(options, void 0, alignTo);\n            }\n            return justified;\n        };\n        if (seriesTypes.pie) {\n            seriesTypes.pie.prototype.dataLabelPositioners = {\n                // Based on the value computed in Highcharts' distribute algorithm.\n                radialDistributionY: function (point) {\n                    return point.top + point.distributeBox.pos;\n                },\n                // get the x - use the natural x position for labels near the\n                // top and bottom, to prevent the top and botton slice\n                // connectors from touching each other on either side\n                // Based on the value computed in Highcharts' distribute algorithm.\n                radialDistributionX: function (series, point, y, naturalY) {\n                    return series.getX(y < point.top + 2 || y > point.bottom - 2 ?\n                        naturalY :\n                        y, point.half, point);\n                },\n                // dataLabels.distance determines the x position of the label\n                justify: function (point, radius, seriesCenter) {\n                    return seriesCenter[0] + (point.half ? -1 : 1) *\n                        (radius + point.labelDistance);\n                },\n                // Left edges of the left-half labels touch the left edge of the plot\n                // area. Right edges of the right-half labels touch the right edge of\n                // the plot area.\n                alignToPlotEdges: function (dataLabel, half, plotWidth, plotLeft) {\n                    var dataLabelWidth = dataLabel.getBBox().width;\n                    return half ? dataLabelWidth + plotLeft :\n                        plotWidth - dataLabelWidth - plotLeft;\n                },\n                // Connectors of each side end in the same x position. Labels are\n                // aligned to them. Left edge of the widest left-half label touches the\n                // left edge of the plot area. Right edge of the widest right-half label\n                // touches the right edge of the plot area.\n                alignToConnectors: function (points, half, plotWidth, plotLeft) {\n                    var maxDataLabelWidth = 0,\n                        dataLabelWidth;\n                    // find widest data label\n                    points.forEach(function (point) {\n                        dataLabelWidth = point.dataLabel.getBBox().width;\n                        if (dataLabelWidth > maxDataLabelWidth) {\n                            maxDataLabelWidth = dataLabelWidth;\n                        }\n                    });\n                    return half ? maxDataLabelWidth + plotLeft :\n                        plotWidth - maxDataLabelWidth - plotLeft;\n                }\n            };\n            /**\n             * Override the base drawDataLabels method by pie specific functionality\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#drawDataLabels\n             * @return {void}\n             */\n            seriesTypes.pie.prototype.drawDataLabels = function () {\n                var series = this,\n                    data = series.data,\n                    point,\n                    chart = series.chart,\n                    options = series.options.dataLabels || {},\n                    connectorPadding = options.connectorPadding,\n                    connectorWidth,\n                    plotWidth = chart.plotWidth,\n                    plotHeight = chart.plotHeight,\n                    plotLeft = chart.plotLeft,\n                    maxWidth = Math.round(chart.chartWidth / 3),\n                    connector,\n                    seriesCenter = series.center,\n                    radius = seriesCenter[2] / 2,\n                    centerY = seriesCenter[1],\n                    dataLabel,\n                    dataLabelWidth, \n                    // labelPos,\n                    labelPosition,\n                    labelHeight, \n                    // divide the points into right and left halves for anti collision\n                    halves = [\n                        [],\n                        [] // left\n                    ],\n                    x,\n                    y,\n                    visibility,\n                    j,\n                    overflow = [0, 0, 0, 0], // top, right, bottom, left\n                    dataLabelPositioners = series.dataLabelPositioners,\n                    pointDataLabelsOptions;\n                // get out if not enabled\n                if (!series.visible ||\n                    (!options.enabled &&\n                        !series._hasPointLabels)) {\n                    return;\n                }\n                // Reset all labels that have been shortened\n                data.forEach(function (point) {\n                    if (point.dataLabel && point.visible && point.dataLabel.shortened) {\n                        point.dataLabel\n                            .attr({\n                            width: 'auto'\n                        }).css({\n                            width: 'auto',\n                            textOverflow: 'clip'\n                        });\n                        point.dataLabel.shortened = false;\n                    }\n                });\n                // run parent method\n                Series.prototype.drawDataLabels.apply(series);\n                data.forEach(function (point) {\n                    if (point.dataLabel) {\n                        if (point.visible) { // #407, #2510\n                            // Arrange points for detection collision\n                            halves[point.half].push(point);\n                            // Reset positions (#4905)\n                            point.dataLabel._pos = null;\n                            // Avoid long labels squeezing the pie size too far down\n                            if (!defined(options.style.width) &&\n                                !defined(point.options.dataLabels &&\n                                    point.options.dataLabels.style &&\n                                    point.options.dataLabels.style.width)) {\n                                if (point.dataLabel.getBBox().width > maxWidth) {\n                                    point.dataLabel.css({\n                                        // Use a fraction of the maxWidth to avoid\n                                        // wrapping close to the end of the string.\n                                        width: Math.round(maxWidth * 0.7) + 'px'\n                                    });\n                                    point.dataLabel.shortened = true;\n                                }\n                            }\n                        }\n                        else {\n                            point.dataLabel = point.dataLabel.destroy();\n                            // Workaround to make pies destroy multiple datalabels\n                            // correctly. This logic needs rewriting to support multiple\n                            // datalabels fully.\n                            if (point.dataLabels && point.dataLabels.length === 1) {\n                                delete point.dataLabels;\n                            }\n                        }\n                    }\n                });\n                /* Loop over the points in each half, starting from the top and bottom\n                 * of the pie to detect overlapping labels.\n                 */\n                halves.forEach(function (points, i) {\n                    var top,\n                        bottom,\n                        length = points.length,\n                        positions = [],\n                        naturalY,\n                        sideOverflow,\n                        size,\n                        distributionLength;\n                    if (!length) {\n                        return;\n                    }\n                    // Sort by angle\n                    series.sortByAngle(points, i - 0.5);\n                    // Only do anti-collision when we have dataLabels outside the pie\n                    // and have connectors. (#856)\n                    if (series.maxLabelDistance > 0) {\n                        top = Math.max(0, centerY - radius - series.maxLabelDistance);\n                        bottom = Math.min(centerY + radius + series.maxLabelDistance, chart.plotHeight);\n                        points.forEach(function (point) {\n                            // check if specific points' label is outside the pie\n                            if (point.labelDistance > 0 && point.dataLabel) {\n                                // point.top depends on point.labelDistance value\n                                // Used for calculation of y value in getX method\n                                point.top = Math.max(0, centerY - radius - point.labelDistance);\n                                point.bottom = Math.min(centerY + radius + point.labelDistance, chart.plotHeight);\n                                size = point.dataLabel.getBBox().height || 21;\n                                // point.positionsIndex is needed for getting index of\n                                // parameter related to specific point inside positions\n                                // array - not every point is in positions array.\n                                point.distributeBox = {\n                                    target: point.labelPosition.natural.y -\n                                        point.top + size / 2,\n                                    size: size,\n                                    rank: point.y\n                                };\n                                positions.push(point.distributeBox);\n                            }\n                        });\n                        distributionLength = bottom + size - top;\n                        H.distribute(positions, distributionLength, distributionLength / 5);\n                    }\n                    // Now the used slots are sorted, fill them up sequentially\n                    for (j = 0; j < length; j++) {\n                        point = points[j];\n                        // labelPos = point.labelPos;\n                        labelPosition = point.labelPosition;\n                        dataLabel = point.dataLabel;\n                        visibility = point.visible === false ? 'hidden' : 'inherit';\n                        naturalY = labelPosition.natural.y;\n                        y = naturalY;\n                        if (positions && defined(point.distributeBox)) {\n                            if (typeof point.distributeBox.pos === 'undefined') {\n                                visibility = 'hidden';\n                            }\n                            else {\n                                labelHeight = point.distributeBox.size;\n                                // Find label's y position\n                                y = dataLabelPositioners\n                                    .radialDistributionY(point);\n                            }\n                        }\n                        // It is needed to delete point.positionIndex for\n                        // dynamically added points etc.\n                        delete point.positionIndex; // @todo unused\n                        // Find label's x position\n                        // justify is undocumented in the API - preserve support for it\n                        if (options.justify) {\n                            x = dataLabelPositioners.justify(point, radius, seriesCenter);\n                        }\n                        else {\n                            switch (options.alignTo) {\n                                case 'connectors':\n                                    x = dataLabelPositioners.alignToConnectors(points, i, plotWidth, plotLeft);\n                                    break;\n                                case 'plotEdges':\n                                    x = dataLabelPositioners.alignToPlotEdges(dataLabel, i, plotWidth, plotLeft);\n                                    break;\n                                default:\n                                    x = dataLabelPositioners.radialDistributionX(series, point, y, naturalY);\n                            }\n                        }\n                        // Record the placement and visibility\n                        dataLabel._attr = {\n                            visibility: visibility,\n                            align: labelPosition.alignment\n                        };\n                        pointDataLabelsOptions = point.options.dataLabels || {};\n                        dataLabel._pos = {\n                            x: (x +\n                                pick(pointDataLabelsOptions.x, options.x) + // (#12985)\n                                ({\n                                    left: connectorPadding,\n                                    right: -connectorPadding\n                                }[labelPosition.alignment] || 0)),\n                            // 10 is for the baseline (label vs text)\n                            y: (y +\n                                pick(pointDataLabelsOptions.y, options.y) - // (#12985)\n                                10)\n                        };\n                        // labelPos.x = x;\n                        // labelPos.y = y;\n                        labelPosition.final.x = x;\n                        labelPosition.final.y = y;\n                        // Detect overflowing data labels\n                        if (pick(options.crop, true)) {\n                            dataLabelWidth = dataLabel.getBBox().width;\n                            sideOverflow = null;\n                            // Overflow left\n                            if (x - dataLabelWidth < connectorPadding &&\n                                i === 1 // left half\n                            ) {\n                                sideOverflow = Math.round(dataLabelWidth - x + connectorPadding);\n                                overflow[3] = Math.max(sideOverflow, overflow[3]);\n                                // Overflow right\n                            }\n                            else if (x + dataLabelWidth > plotWidth - connectorPadding &&\n                                i === 0 // right half\n                            ) {\n                                sideOverflow = Math.round(x + dataLabelWidth - plotWidth + connectorPadding);\n                                overflow[1] = Math.max(sideOverflow, overflow[1]);\n                            }\n                            // Overflow top\n                            if (y - labelHeight / 2 < 0) {\n                                overflow[0] = Math.max(Math.round(-y + labelHeight / 2), overflow[0]);\n                                // Overflow left\n                            }\n                            else if (y + labelHeight / 2 > plotHeight) {\n                                overflow[2] = Math.max(Math.round(y + labelHeight / 2 - plotHeight), overflow[2]);\n                            }\n                            dataLabel.sideOverflow = sideOverflow;\n                        }\n                    } // for each point\n                }); // for each half\n                // Do not apply the final placement and draw the connectors until we\n                // have verified that labels are not spilling over.\n                if (arrayMax(overflow) === 0 ||\n                    this.verifyDataLabelOverflow(overflow)) {\n                    // Place the labels in the final position\n                    this.placeDataLabels();\n                    this.points.forEach(function (point) {\n                        // #8864: every connector can have individual options\n                        pointDataLabelsOptions =\n                            merge(options, point.options.dataLabels);\n                        connectorWidth =\n                            pick(pointDataLabelsOptions.connectorWidth, 1);\n                        // Draw the connector\n                        if (connectorWidth) {\n                            var isNew;\n                            connector = point.connector;\n                            dataLabel = point.dataLabel;\n                            if (dataLabel &&\n                                dataLabel._pos &&\n                                point.visible &&\n                                point.labelDistance > 0) {\n                                visibility = dataLabel._attr.visibility;\n                                isNew = !connector;\n                                if (isNew) {\n                                    point.connector = connector = chart.renderer\n                                        .path()\n                                        .addClass('highcharts-data-label-connector ' +\n                                        ' highcharts-color-' + point.colorIndex +\n                                        (point.className ?\n                                            ' ' + point.className :\n                                            ''))\n                                        .add(series.dataLabelsGroup);\n                                    if (!chart.styledMode) {\n                                        connector.attr({\n                                            'stroke-width': connectorWidth,\n                                            'stroke': (pointDataLabelsOptions.connectorColor ||\n                                                point.color ||\n                                                '#666666')\n                                        });\n                                    }\n                                }\n                                connector[isNew ? 'attr' : 'animate']({\n                                    d: point.getConnectorPath()\n                                });\n                                connector.attr('visibility', visibility);\n                            }\n                            else if (connector) {\n                                point.connector = connector.destroy();\n                            }\n                        }\n                    });\n                }\n            };\n            /**\n             * Extendable method for getting the path of the connector between the data\n             * label and the pie slice.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#connectorPath\n             *\n             * @param {*} labelPos\n             *\n             * @return {Highcharts.SVGPathArray}\n             */\n            // TODO: depracated - remove it\n            /*\n            seriesTypes.pie.prototype.connectorPath = function (labelPos) {\n                var x = labelPos.x,\n                        y = labelPos.y;\n                return pick(this.options.dataLabels.softConnector, true) ? [\n                    'M',\n                    // end of the string at the label\n                    x + (labelPos[6] === 'left' ? 5 : -5), y,\n                    'C',\n                    x, y, // first break, next to the label\n                    2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ] : [\n                    'M',\n                    // end of the string at the label\n                    x + (labelPos[6] === 'left' ? 5 : -5), y,\n                    'L',\n                    labelPos[2], labelPos[3], // second break\n                    'L',\n                    labelPos[4], labelPos[5] // base\n                ];\n            };\n            */\n            /**\n             * Perform the final placement of the data labels after we have verified\n             * that they fall within the plot area.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#placeDataLabels\n             * @return {void}\n             */\n            seriesTypes.pie.prototype.placeDataLabels = function () {\n                this.points.forEach(function (point) {\n                    var dataLabel = point.dataLabel,\n                        _pos;\n                    if (dataLabel && point.visible) {\n                        _pos = dataLabel._pos;\n                        if (_pos) {\n                            // Shorten data labels with ellipsis if they still overflow\n                            // after the pie has reached minSize (#223).\n                            if (dataLabel.sideOverflow) {\n                                dataLabel._attr.width =\n                                    Math.max(dataLabel.getBBox().width -\n                                        dataLabel.sideOverflow, 0);\n                                dataLabel.css({\n                                    width: dataLabel._attr.width + 'px',\n                                    textOverflow: ((this.options.dataLabels.style || {})\n                                        .textOverflow ||\n                                        'ellipsis')\n                                });\n                                dataLabel.shortened = true;\n                            }\n                            dataLabel.attr(dataLabel._attr);\n                            dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n                            dataLabel.moved = true;\n                        }\n                        else if (dataLabel) {\n                            dataLabel.attr({ y: -9999 });\n                        }\n                    }\n                    // Clear for update\n                    delete point.distributeBox;\n                }, this);\n            };\n            seriesTypes.pie.prototype.alignDataLabel = noop;\n            /**\n             * Verify whether the data labels are allowed to draw, or we should run more\n             * translation and data label positioning to keep them inside the plot area.\n             * Returns true when data labels are ready to draw.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.pie#verifyDataLabelOverflow\n             * @param {Array<number>} overflow\n             * @return {boolean}\n             */\n            seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {\n                var center = this.center,\n                    options = this.options,\n                    centerOption = options.center,\n                    minSize = options.minSize || 80,\n                    newSize = minSize, \n                    // If a size is set, return true and don't try to shrink the pie\n                    // to fit the labels.\n                    ret = options.size !== null;\n                if (!ret) {\n                    // Handle horizontal size and center\n                    if (centerOption[0] !== null) { // Fixed center\n                        newSize = Math.max(center[2] -\n                            Math.max(overflow[1], overflow[3]), minSize);\n                    }\n                    else { // Auto center\n                        newSize = Math.max(\n                        // horizontal overflow\n                        center[2] - overflow[1] - overflow[3], minSize);\n                        // horizontal center\n                        center[0] += (overflow[3] - overflow[1]) / 2;\n                    }\n                    // Handle vertical size and center\n                    if (centerOption[1] !== null) { // Fixed center\n                        newSize = clamp(newSize, minSize, center[2] - Math.max(overflow[0], overflow[2]));\n                    }\n                    else { // Auto center\n                        newSize = clamp(newSize, minSize, \n                        // vertical overflow\n                        center[2] - overflow[0] - overflow[2]);\n                        // vertical center\n                        center[1] += (overflow[0] - overflow[2]) / 2;\n                    }\n                    // If the size must be decreased, we need to run translate and\n                    // drawDataLabels again\n                    if (newSize < center[2]) {\n                        center[2] = newSize;\n                        center[3] = Math.min(// #3632\n                        relativeLength(options.innerSize || 0, newSize), newSize);\n                        this.translate(center);\n                        if (this.drawDataLabels) {\n                            this.drawDataLabels();\n                        }\n                        // Else, return true to indicate that the pie and its labels is\n                        // within the plot area\n                    }\n                    else {\n                        ret = true;\n                    }\n                }\n                return ret;\n            };\n        }\n        if (seriesTypes.column) {\n            /**\n             * Override the basic data label alignment by adjusting for the position of\n             * the column.\n             *\n             * @private\n             * @function Highcharts.seriesTypes.column#alignDataLabel\n             * @param {Highcharts.Point} point\n             * @param {Highcharts.SVGElement} dataLabel\n             * @param {Highcharts.DataLabelsOptions} options\n             * @param {Highcharts.BBoxObject} alignTo\n             * @param {boolean} [isNew]\n             * @return {void}\n             */\n            seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {\n                var inverted = this.chart.inverted,\n                    series = point.series, \n                    // data label box for alignment\n                    dlBox = point.dlBox || point.shapeArgs,\n                    below = pick(point.below, // range series\n                    point.plotY >\n                        pick(this.translatedThreshold,\n                    series.yAxis.len)), \n                    // draw it inside the box?\n                    inside = pick(options.inside, !!this.options.stacking),\n                    overshoot;\n                // Align to the column itself, or the top of it\n                if (dlBox) { // Area range uses this method but not alignTo\n                    alignTo = merge(dlBox);\n                    if (alignTo.y < 0) {\n                        alignTo.height += alignTo.y;\n                        alignTo.y = 0;\n                    }\n                    // If parts of the box overshoots outside the plot area, modify the\n                    // box to center the label inside\n                    overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n                    if (overshoot > 0 && overshoot < alignTo.height) {\n                        alignTo.height -= overshoot;\n                    }\n                    if (inverted) {\n                        alignTo = {\n                            x: series.yAxis.len - alignTo.y - alignTo.height,\n                            y: series.xAxis.len - alignTo.x - alignTo.width,\n                            width: alignTo.height,\n                            height: alignTo.width\n                        };\n                    }\n                    // Compute the alignment box\n                    if (!inside) {\n                        if (inverted) {\n                            alignTo.x += below ? 0 : alignTo.width;\n                            alignTo.width = 0;\n                        }\n                        else {\n                            alignTo.y += below ? alignTo.height : 0;\n                            alignTo.height = 0;\n                        }\n                    }\n                }\n                // When alignment is undefined (typically columns and bars), display the\n                // individual point below or above the point depending on the threshold\n                options.align = pick(options.align, !inverted || inside ? 'center' : below ? 'right' : 'left');\n                options.verticalAlign = pick(options.verticalAlign, inverted || inside ? 'middle' : below ? 'top' : 'bottom');\n                // Call the parent method\n                Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n                // If label was justified and we have contrast, set it:\n                if (options.inside && point.contrastColor) {\n                    dataLabel.css({\n                        color: point.contrastColor\n                    });\n                }\n            };\n        }\n\n    });\n    _registerModule(_modules, 'modules/overlapping-datalabels.src.js', [_modules['parts/Chart.js'], _modules['parts/Utilities.js']], function (Chart, U) {\n        /* *\n         *\n         *  Highcharts module to hide overlapping data labels.\n         *  This module is included in Highcharts.\n         *\n         *  (c) 2009-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var addEvent = U.addEvent,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /* eslint-disable no-invalid-this */\n        // Collect potensial overlapping data labels. Stack labels probably don't need\n        // to be considered because they are usually accompanied by data labels that lie\n        // inside the columns.\n        addEvent(Chart, 'render', function collectAndHide() {\n            var labels = [];\n            // Consider external label collectors\n            (this.labelCollectors || []).forEach(function (collector) {\n                labels = labels.concat(collector());\n            });\n            (this.yAxis || []).forEach(function (yAxis) {\n                if (yAxis.stacking &&\n                    yAxis.options.stackLabels &&\n                    !yAxis.options.stackLabels.allowOverlap) {\n                    objectEach(yAxis.stacking.stacks, function (stack) {\n                        objectEach(stack, function (stackItem) {\n                            labels.push(stackItem.label);\n                        });\n                    });\n                }\n            });\n            (this.series || []).forEach(function (series) {\n                var dlOptions = series.options.dataLabels;\n                if (series.visible &&\n                    !(dlOptions.enabled === false && !series._hasPointLabels)) { // #3866\n                    (series.nodes || series.points).forEach(function (point) {\n                        if (point.visible) {\n                            var dataLabels = (isArray(point.dataLabels) ?\n                                    point.dataLabels :\n                                    (point.dataLabel ? [point.dataLabel] : []));\n                            dataLabels.forEach(function (label) {\n                                var options = label.options;\n                                label.labelrank = pick(options.labelrank, point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118\n                                if (!options.allowOverlap) {\n                                    labels.push(label);\n                                }\n                            });\n                        }\n                    });\n                }\n            });\n            this.hideOverlappingLabels(labels);\n        });\n        /**\n         * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n         * provide a smooth visual imression.\n         *\n         * @private\n         * @function Highcharts.Chart#hideOverlappingLabels\n         * @param {Array<Highcharts.SVGElement>} labels\n         * Rendered data labels\n         * @requires modules/overlapping-datalabels\n         */\n        Chart.prototype.hideOverlappingLabels = function (labels) {\n            var chart = this,\n                len = labels.length,\n                ren = chart.renderer,\n                label,\n                i,\n                j,\n                label1,\n                label2,\n                box1,\n                box2,\n                isLabelAffected = false,\n                isIntersectRect = function (box1,\n                box2) {\n                    return !(box2.x > box1.x + box1.width ||\n                        box2.x + box2.width < box1.x ||\n                        box2.y > box1.y + box1.height ||\n                        box2.y + box2.height < box1.y);\n            }, \n            // Get the box with its position inside the chart, as opposed to getBBox\n            // that only reports the position relative to the parent.\n            getAbsoluteBox = function (label) {\n                var pos,\n                    parent,\n                    bBox, \n                    // Substract the padding if no background or border (#4333)\n                    padding = label.box ? 0 : (label.padding || 0),\n                    lineHeightCorrection = 0,\n                    xOffset = 0,\n                    boxWidth,\n                    alignValue;\n                if (label &&\n                    (!label.alignAttr || label.placed)) {\n                    pos = label.alignAttr || {\n                        x: label.attr('x'),\n                        y: label.attr('y')\n                    };\n                    parent = label.parentGroup;\n                    // Get width and height if pure text nodes (stack labels)\n                    if (!label.width) {\n                        bBox = label.getBBox();\n                        label.width = bBox.width;\n                        label.height = bBox.height;\n                        // Labels positions are computed from top left corner, so\n                        // we need to substract the text height from text nodes too.\n                        lineHeightCorrection = ren\n                            .fontMetrics(null, label.element).h;\n                    }\n                    boxWidth = label.width - 2 * padding;\n                    alignValue = {\n                        left: '0',\n                        center: '0.5',\n                        right: '1'\n                    }[label.alignValue];\n                    if (alignValue) {\n                        xOffset = +alignValue * boxWidth;\n                    }\n                    else if (isNumber(label.x) && Math.round(label.x) !== label.translateX) {\n                        xOffset = label.x - label.translateX;\n                    }\n                    return {\n                        x: pos.x + (parent.translateX || 0) + padding - xOffset,\n                        y: pos.y + (parent.translateY || 0) + padding -\n                            lineHeightCorrection,\n                        width: label.width - 2 * padding,\n                        height: label.height - 2 * padding\n                    };\n                }\n            };\n            for (i = 0; i < len; i++) {\n                label = labels[i];\n                if (label) {\n                    // Mark with initial opacity\n                    label.oldOpacity = label.opacity;\n                    label.newOpacity = 1;\n                    label.absoluteBox = getAbsoluteBox(label);\n                }\n            }\n            // Prevent a situation in a gradually rising slope, that each label will\n            // hide the previous one because the previous one always has lower rank.\n            labels.sort(function (a, b) {\n                return (b.labelrank || 0) - (a.labelrank || 0);\n            });\n            // Detect overlapping labels\n            for (i = 0; i < len; i++) {\n                label1 = labels[i];\n                box1 = label1 && label1.absoluteBox;\n                for (j = i + 1; j < len; ++j) {\n                    label2 = labels[j];\n                    box2 = label2 && label2.absoluteBox;\n                    if (box1 &&\n                        box2 &&\n                        label1 !== label2 && // #6465, polar chart with connectEnds\n                        label1.newOpacity !== 0 &&\n                        label2.newOpacity !== 0) {\n                        if (isIntersectRect(box1, box2)) {\n                            (label1.labelrank < label2.labelrank ? label1 : label2)\n                                .newOpacity = 0;\n                        }\n                    }\n                }\n            }\n            // Hide or show\n            labels.forEach(function (label) {\n                var complete,\n                    newOpacity;\n                if (label) {\n                    newOpacity = label.newOpacity;\n                    if (label.oldOpacity !== newOpacity) {\n                        // Make sure the label is completely hidden to avoid catching\n                        // clicks (#4362)\n                        if (label.alignAttr && label.placed) { // data labels\n                            label[newOpacity ? 'removeClass' : 'addClass']('highcharts-data-label-hidden');\n                            complete = function () {\n                                if (!chart.styledMode) {\n                                    label.css({ pointerEvents: newOpacity ? 'auto' : 'none' });\n                                }\n                                label.visibility = newOpacity ? 'inherit' : 'hidden';\n                                label.placed = !!newOpacity;\n                            };\n                            isLabelAffected = true;\n                            // Animate or set the opacity\n                            label.alignAttr.opacity = newOpacity;\n                            label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);\n                            fireEvent(chart, 'afterHideOverlappingLabel');\n                        }\n                        else { // other labels, tick labels\n                            label.attr({\n                                opacity: newOpacity\n                            });\n                        }\n                    }\n                    label.isOld = true;\n                }\n            });\n            if (isLabelAffected) {\n                fireEvent(chart, 'afterHideAllOverlappingLabels');\n            }\n        };\n\n    });\n    _registerModule(_modules, 'parts/Interaction.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Legend.js'], _modules['parts/Options.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (Chart, H, Legend, O, Point, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            createElement = U.createElement,\n            css = U.css,\n            defined = U.defined,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isFunction = U.isFunction,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick;\n        /**\n         * @interface Highcharts.PointEventsOptionsObject\n         */ /**\n        * Fires when the point is selected either programmatically or following a click\n        * on the point. One parameter, `event`, is passed to the function. Returning\n        * `false` cancels the operation.\n        * @name Highcharts.PointEventsOptionsObject#select\n        * @type {Highcharts.PointSelectCallbackFunction|undefined}\n        */ /**\n        * Fires when the point is unselected either programmatically or following a\n        * click on the point. One parameter, `event`, is passed to the function.\n        * Returning `false` cancels the operation.\n        * @name Highcharts.PointEventsOptionsObject#unselect\n        * @type {Highcharts.PointUnselectCallbackFunction|undefined}\n        */\n        /**\n         * Information about the select/unselect event.\n         *\n         * @interface Highcharts.PointInteractionEventObject\n         * @extends global.Event\n         */ /**\n        * @name Highcharts.PointInteractionEventObject#accumulate\n        * @type {boolean}\n        */\n        /**\n         * Gets fired when the point is selected either programmatically or following a\n         * click on the point.\n         *\n         * @callback Highcharts.PointSelectCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointInteractionEventObject} event\n         *        Event that occured.\n         */\n        /**\n         * Fires when the point is unselected either programmatically or following a\n         * click on the point.\n         *\n         * @callback Highcharts.PointUnselectCallbackFunction\n         *\n         * @param {Highcharts.Point} this\n         *        Point where the event occured.\n         *\n         * @param {Highcharts.PointInteractionEventObject} event\n         *        Event that occured.\n         */\n        var hasTouch = H.hasTouch,\n            Series = H.Series,\n            seriesTypes = H.seriesTypes,\n            svg = H.svg,\n            TrackerMixin;\n        /* eslint-disable valid-jsdoc */\n        /**\n         * TrackerMixin for points and graphs.\n         *\n         * @private\n         * @mixin Highcharts.TrackerMixin\n         */\n        TrackerMixin = H.TrackerMixin = {\n            /**\n             * Draw the tracker for a point.\n             *\n             * @private\n             * @function Highcharts.TrackerMixin.drawTrackerPoint\n             * @param {Highcharts.Series} this\n             * @fires Highcharts.Series#event:afterDrawTracker\n             */\n            drawTrackerPoint: function () {\n                var series = this,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    onMouseOver = function (e) {\n                        var point = pointer.getPointFromEvent(e);\n                    // undefined on graph in scatterchart\n                    if (typeof point !== 'undefined') {\n                        pointer.isDirectTouch = true;\n                        point.onMouseOver(e);\n                    }\n                }, dataLabels;\n                // Add reference to the point\n                series.points.forEach(function (point) {\n                    dataLabels = (isArray(point.dataLabels) ?\n                        point.dataLabels :\n                        (point.dataLabel ? [point.dataLabel] : []));\n                    if (point.graphic) {\n                        point.graphic.element.point = point;\n                    }\n                    dataLabels.forEach(function (dataLabel) {\n                        if (dataLabel.div) {\n                            dataLabel.div.point = point;\n                        }\n                        else {\n                            dataLabel.element.point = point;\n                        }\n                    });\n                });\n                // Add the event listeners, we need to do this only once\n                if (!series._hasTracking) {\n                    series.trackerGroups.forEach(function (key) {\n                        if (series[key]) {\n                            // we don't always have dataLabelsGroup\n                            series[key]\n                                .addClass('highcharts-tracker')\n                                .on('mouseover', onMouseOver)\n                                .on('mouseout', function (e) {\n                                pointer.onTrackerMouseOut(e);\n                            });\n                            if (hasTouch) {\n                                series[key].on('touchstart', onMouseOver);\n                            }\n                            if (!chart.styledMode && series.options.cursor) {\n                                series[key]\n                                    .css(css)\n                                    .css({ cursor: series.options.cursor });\n                            }\n                        }\n                    });\n                    series._hasTracking = true;\n                }\n                fireEvent(this, 'afterDrawTracker');\n            },\n            /**\n             * Draw the tracker object that sits above all data labels and markers to\n             * track mouse events on the graph or points. For the line type charts\n             * the tracker uses the same graphPath, but with a greater stroke width\n             * for better control.\n             *\n             * @private\n             * @function Highcharts.TrackerMixin.drawTrackerGraph\n             * @param {Highcharts.Series} this\n             * @fires Highcharts.Series#event:afterDrawTracker\n             */\n            drawTrackerGraph: function () {\n                var series = this,\n                    options = series.options,\n                    trackByArea = options.trackByArea,\n                    trackerPath = [].concat(trackByArea ?\n                        series.areaPath :\n                        series.graphPath), \n                    // trackerPathLength = trackerPath.length,\n                    chart = series.chart,\n                    pointer = chart.pointer,\n                    renderer = chart.renderer,\n                    snap = chart.options.tooltip.snap,\n                    tracker = series.tracker,\n                    i,\n                    onMouseOver = function (e) {\n                        if (chart.hoverSeries !== series) {\n                            series.onMouseOver();\n                    }\n                }, \n                /*\n                 * Empirical lowest possible opacities for TRACKER_FILL for an\n                 * element to stay invisible but clickable\n                 * IE6: 0.002\n                 * IE7: 0.002\n                 * IE8: 0.002\n                 * IE9: 0.00000000001 (unlimited)\n                 * IE10: 0.0001 (exporting only)\n                 * FF: 0.00000000001 (unlimited)\n                 * Chrome: 0.000001\n                 * Safari: 0.000001\n                 * Opera: 0.00000000001 (unlimited)\n                 */\n                TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n                // Draw the tracker\n                if (tracker) {\n                    tracker.attr({ d: trackerPath });\n                }\n                else if (series.graph) { // create\n                    series.tracker = renderer.path(trackerPath)\n                        .attr({\n                        visibility: series.visible ? 'visible' : 'hidden',\n                        zIndex: 2\n                    })\n                        .addClass(trackByArea ?\n                        'highcharts-tracker-area' :\n                        'highcharts-tracker-line')\n                        .add(series.group);\n                    if (!chart.styledMode) {\n                        series.tracker.attr({\n                            'stroke-linecap': 'round',\n                            'stroke-linejoin': 'round',\n                            stroke: TRACKER_FILL,\n                            fill: trackByArea ? TRACKER_FILL : 'none',\n                            'stroke-width': series.graph.strokeWidth() +\n                                (trackByArea ? 0 : 2 * snap)\n                        });\n                    }\n                    // The tracker is added to the series group, which is clipped, but\n                    // is covered by the marker group. So the marker group also needs to\n                    // capture events.\n                    [series.tracker, series.markerGroup].forEach(function (tracker) {\n                        tracker.addClass('highcharts-tracker')\n                            .on('mouseover', onMouseOver)\n                            .on('mouseout', function (e) {\n                            pointer.onTrackerMouseOut(e);\n                        });\n                        if (options.cursor && !chart.styledMode) {\n                            tracker.css({ cursor: options.cursor });\n                        }\n                        if (hasTouch) {\n                            tracker.on('touchstart', onMouseOver);\n                        }\n                    });\n                }\n                fireEvent(this, 'afterDrawTracker');\n            }\n        };\n        /* End TrackerMixin */\n        // Add tracking event listener to the series group, so the point graphics\n        // themselves act as trackers\n        if (seriesTypes.column) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.column#drawTracker\n             */\n            seriesTypes.column.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        if (seriesTypes.pie) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.pie#drawTracker\n             */\n            seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        if (seriesTypes.scatter) {\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerPoint as Highcharts.seriesTypes.scatter#drawTracker\n             */\n            seriesTypes.scatter.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n        }\n        // Extend Legend for item events.\n        extend(Legend.prototype, {\n            /**\n             * @private\n             * @function Highcharts.Legend#setItemEvents\n             * @param {Highcharts.BubbleLegend|Point|Highcharts.Series} item\n             * @param {Highcharts.SVGElement} legendItem\n             * @param {boolean} [useHTML=false]\n             * @fires Highcharts.Point#event:legendItemClick\n             * @fires Highcharts.Series#event:legendItemClick\n             */\n            setItemEvents: function (item, legendItem, useHTML) {\n                var legend = this,\n                    boxWrapper = legend.chart.renderer.boxWrapper,\n                    isPoint = item instanceof Point,\n                    activeClass = 'highcharts-legend-' +\n                        (isPoint ? 'point' : 'series') + '-active',\n                    styledMode = legend.chart.styledMode, \n                    // When `useHTML`, the symbol is rendered in other group, so\n                    // we need to apply events listeners to both places\n                    legendItems = useHTML ?\n                        [legendItem,\n                    item.legendSymbol] :\n                        [item.legendGroup];\n                // Set the events on the item group, or in case of useHTML, the item\n                // itself (#1249)\n                legendItems.forEach(function (element) {\n                    if (element) {\n                        element\n                            .on('mouseover', function () {\n                            if (item.visible) {\n                                legend.allItems.forEach(function (inactiveItem) {\n                                    if (item !== inactiveItem) {\n                                        inactiveItem.setState('inactive', !isPoint);\n                                    }\n                                });\n                            }\n                            item.setState('hover');\n                            // A CSS class to dim or hide other than the hovered\n                            // series.\n                            // Works only if hovered series is visible (#10071).\n                            if (item.visible) {\n                                boxWrapper.addClass(activeClass);\n                            }\n                            if (!styledMode) {\n                                legendItem.css(legend.options.itemHoverStyle);\n                            }\n                        })\n                            .on('mouseout', function () {\n                            if (!legend.chart.styledMode) {\n                                legendItem.css(merge(item.visible ?\n                                    legend.itemStyle :\n                                    legend.itemHiddenStyle));\n                            }\n                            legend.allItems.forEach(function (inactiveItem) {\n                                if (item !== inactiveItem) {\n                                    inactiveItem.setState('', !isPoint);\n                                }\n                            });\n                            // A CSS class to dim or hide other than the hovered\n                            // series.\n                            boxWrapper.removeClass(activeClass);\n                            item.setState();\n                        })\n                            .on('click', function (event) {\n                            var strLegendItemClick = 'legendItemClick',\n                                fnLegendItemClick = function () {\n                                    if (item.setVisible) {\n                                        item.setVisible();\n                                }\n                                // Reset inactive state\n                                legend.allItems.forEach(function (inactiveItem) {\n                                    if (item !== inactiveItem) {\n                                        inactiveItem.setState(item.visible ? 'inactive' : '', !isPoint);\n                                    }\n                                });\n                            };\n                            // A CSS class to dim or hide other than the hovered\n                            // series. Event handling in iOS causes the activeClass\n                            // to be added prior to click in some cases (#7418).\n                            boxWrapper.removeClass(activeClass);\n                            // Pass over the click/touch event. #4.\n                            event = {\n                                browserEvent: event\n                            };\n                            // click the name or symbol\n                            if (item.firePointEvent) { // point\n                                item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n                            }\n                            else {\n                                fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n                            }\n                        });\n                    }\n                });\n            },\n            /**\n             * @private\n             * @function Highcharts.Legend#createCheckboxForItem\n             * @param {Highcharts.BubbleLegend|Point|Highcharts.Series} item\n             * @fires Highcharts.Series#event:checkboxClick\n             */\n            createCheckboxForItem: function (item) {\n                var legend = this;\n                item.checkbox = createElement('input', {\n                    type: 'checkbox',\n                    className: 'highcharts-legend-checkbox',\n                    checked: item.selected,\n                    defaultChecked: item.selected // required by IE7\n                }, legend.options.itemCheckboxStyle, legend.chart.container);\n                addEvent(item.checkbox, 'click', function (event) {\n                    var target = event.target;\n                    fireEvent(item.series || item, 'checkboxClick', {\n                        checked: target.checked,\n                        item: item\n                    }, function () {\n                        item.select();\n                    });\n                });\n            }\n        });\n        // Extend the Chart object with interaction\n        extend(Chart.prototype, /** @lends Chart.prototype */ {\n            /**\n             * Display the zoom button, so users can reset zoom to the default view\n             * settings.\n             *\n             * @function Highcharts.Chart#showResetZoom\n             *\n             * @fires Highcharts.Chart#event:afterShowResetZoom\n             * @fires Highcharts.Chart#event:beforeShowResetZoom\n             */\n            showResetZoom: function () {\n                var chart = this,\n                    lang = defaultOptions.lang,\n                    btnOptions = chart.options.chart.resetZoomButton,\n                    theme = btnOptions.theme,\n                    states = theme.states,\n                    alignTo = (btnOptions.relativeTo === 'chart' ||\n                        btnOptions.relativeTo === 'spaceBox' ?\n                        null :\n                        'plotBox');\n                /**\n                 * @private\n                 */\n                function zoomOut() {\n                    chart.zoomOut();\n                }\n                fireEvent(this, 'beforeShowResetZoom', null, function () {\n                    chart.resetZoomButton = chart.renderer\n                        .button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n                        .attr({\n                        align: btnOptions.position.align,\n                        title: lang.resetZoomTitle\n                    })\n                        .addClass('highcharts-reset-zoom')\n                        .add()\n                        .align(btnOptions.position, false, alignTo);\n                });\n                fireEvent(this, 'afterShowResetZoom');\n            },\n            /**\n             * Zoom the chart out after a user has zoomed in. See also\n             * [Axis.setExtremes](/class-reference/Highcharts.Axis#setExtremes).\n             *\n             * @function Highcharts.Chart#zoomOut\n             *\n             * @fires Highcharts.Chart#event:selection\n             */\n            zoomOut: function () {\n                fireEvent(this, 'selection', { resetSelection: true }, this.zoom);\n            },\n            /**\n             * Zoom into a given portion of the chart given by axis coordinates.\n             *\n             * @private\n             * @function Highcharts.Chart#zoom\n             * @param {Highcharts.SelectEventObject} event\n             */\n            zoom: function (event) {\n                var chart = this,\n                    hasZoomed,\n                    pointer = chart.pointer,\n                    displayButton = false,\n                    mouseDownPos = chart.inverted ? pointer.mouseDownX : pointer.mouseDownY,\n                    resetZoomButton;\n                // If zoom is called with no arguments, reset the axes\n                if (!event || event.resetSelection) {\n                    chart.axes.forEach(function (axis) {\n                        hasZoomed = axis.zoom();\n                    });\n                    pointer.initiated = false; // #6804\n                }\n                else { // else, zoom in on all axes\n                    event.xAxis.concat(event.yAxis).forEach(function (axisData) {\n                        var axis = axisData.axis,\n                            axisStartPos = chart.inverted ? axis.left : axis.top,\n                            axisEndPos = chart.inverted ?\n                                axisStartPos + axis.width : axisStartPos + axis.height,\n                            isXAxis = axis.isXAxis,\n                            isWithinPane = false;\n                        // Check if zoomed area is within the pane (#1289).\n                        // In case of multiple panes only one pane should be zoomed.\n                        if ((!isXAxis &&\n                            mouseDownPos >= axisStartPos &&\n                            mouseDownPos <= axisEndPos) ||\n                            isXAxis ||\n                            !defined(mouseDownPos)) {\n                            isWithinPane = true;\n                        }\n                        // don't zoom more than minRange\n                        if (pointer[isXAxis ? 'zoomX' : 'zoomY'] && isWithinPane) {\n                            hasZoomed = axis.zoom(axisData.min, axisData.max);\n                            if (axis.displayBtn) {\n                                displayButton = true;\n                            }\n                        }\n                    });\n                }\n                // Show or hide the Reset zoom button\n                resetZoomButton = chart.resetZoomButton;\n                if (displayButton && !resetZoomButton) {\n                    chart.showResetZoom();\n                }\n                else if (!displayButton && isObject(resetZoomButton)) {\n                    chart.resetZoomButton = resetZoomButton.destroy();\n                }\n                // Redraw\n                if (hasZoomed) {\n                    chart.redraw(pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100));\n                }\n            },\n            /**\n             * Pan the chart by dragging the mouse across the pane. This function is\n             * called on mouse move, and the distance to pan is computed from chartX\n             * compared to the first chartX position in the dragging operation.\n             *\n             * @private\n             * @function Highcharts.Chart#pan\n             * @param {Highcharts.PointerEventObject} e\n             * @param {string} panning\n             */\n            pan: function (e, panning) {\n                var chart = this,\n                    hoverPoints = chart.hoverPoints,\n                    panningOptions,\n                    chartOptions = chart.options.chart,\n                    hasMapNavigation = chart.options.mapNavigation &&\n                        chart.options.mapNavigation.enabled,\n                    doRedraw,\n                    type;\n                if (typeof panning === 'object') {\n                    panningOptions = panning;\n                }\n                else {\n                    panningOptions = {\n                        enabled: panning,\n                        type: 'x'\n                    };\n                }\n                if (chartOptions && chartOptions.panning) {\n                    chartOptions.panning = panningOptions;\n                }\n                type = panningOptions.type;\n                fireEvent(this, 'pan', { originalEvent: e }, function () {\n                    // remove active points for shared tooltip\n                    if (hoverPoints) {\n                        hoverPoints.forEach(function (point) {\n                            point.setState();\n                        });\n                    }\n                    // panning axis mapping\n                    var xy = [1]; // x\n                        if (type === 'xy') {\n                            xy = [1, 0];\n                    }\n                    else if (type === 'y') {\n                        xy = [0];\n                    }\n                    xy.forEach(function (isX) {\n                        var axis = chart[isX ? 'xAxis' : 'yAxis'][0], horiz = axis.horiz, mousePos = e[horiz ? 'chartX' : 'chartY'], mouseDown = horiz ? 'mouseDownX' : 'mouseDownY', startPos = chart[mouseDown], halfPointRange = (axis.pointRange || 0) / 2, pointRangeDirection = (axis.reversed && !chart.inverted) ||\n                                (!axis.reversed && chart.inverted) ?\n                                -1 :\n                                1, extremes = axis.getExtremes(), panMin = axis.toValue(startPos - mousePos, true) +\n                                halfPointRange * pointRangeDirection, panMax = axis.toValue(startPos + axis.len - mousePos, true) -\n                                halfPointRange * pointRangeDirection, flipped = panMax < panMin, newMin = flipped ? panMax : panMin, newMax = flipped ? panMin : panMax, hasVerticalPanning = axis.hasVerticalPanning(), paddedMin, paddedMax, spill, panningState = axis.panningState;\n                        // General calculations of panning state.\n                        // This is related to using vertical panning. (#11315).\n                        axis.series.forEach(function (series) {\n                            if (hasVerticalPanning &&\n                                !isX && (!panningState || panningState.isDirty)) {\n                                var processedData = series.getProcessedData(true),\n                                    dataExtremes = series.getExtremes(processedData.yData,\n                                    true);\n                                if (!panningState) {\n                                    panningState = {\n                                        startMin: Number.MAX_VALUE,\n                                        startMax: -Number.MAX_VALUE\n                                    };\n                                }\n                                if (isNumber(dataExtremes.dataMin) &&\n                                    isNumber(dataExtremes.dataMax)) {\n                                    panningState.startMin = Math.min(dataExtremes.dataMin, panningState.startMin);\n                                    panningState.startMax = Math.max(dataExtremes.dataMax, panningState.startMax);\n                                }\n                            }\n                        });\n                        paddedMin = Math.min(H.pick(panningState === null || panningState === void 0 ? void 0 : panningState.startMin, extremes.dataMin), halfPointRange ?\n                            extremes.min :\n                            axis.toValue(axis.toPixels(extremes.min) -\n                                axis.minPixelPadding));\n                        paddedMax = Math.max(H.pick(panningState === null || panningState === void 0 ? void 0 : panningState.startMax, extremes.dataMax), halfPointRange ?\n                            extremes.max :\n                            axis.toValue(axis.toPixels(extremes.max) +\n                                axis.minPixelPadding));\n                        axis.panningState = panningState;\n                        // It is not necessary to calculate extremes on ordinal axis,\n                        // because they are already calculated, so we don't want to\n                        // override them.\n                        if (!axis.isOrdinal) {\n                            // If the new range spills over, either to the min or max,\n                            // adjust the new range.\n                            spill = paddedMin - newMin;\n                            if (spill > 0) {\n                                newMax += spill;\n                                newMin = paddedMin;\n                            }\n                            spill = newMax - paddedMax;\n                            if (spill > 0) {\n                                newMax = paddedMax;\n                                newMin -= spill;\n                            }\n                            // Set new extremes if they are actually new\n                            if (axis.series.length &&\n                                newMin !== extremes.min &&\n                                newMax !== extremes.max &&\n                                newMin >= paddedMin &&\n                                newMax <= paddedMax) {\n                                axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });\n                                if (!chart.resetZoomButton &&\n                                    !hasMapNavigation &&\n                                    // Show reset zoom button only when both newMin and\n                                    // newMax values are between padded axis range.\n                                    newMin !== paddedMin &&\n                                    newMax !== paddedMax &&\n                                    type.match('y')) {\n                                    chart.showResetZoom();\n                                    axis.displayBtn = false;\n                                }\n                                doRedraw = true;\n                            }\n                            // set new reference for next run:\n                            chart[mouseDown] = mousePos;\n                        }\n                    });\n                    if (doRedraw) {\n                        chart.redraw(false);\n                    }\n                    css(chart.container, { cursor: 'move' });\n                });\n            }\n        });\n        // Extend the Point object with interaction\n        extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n            /**\n             * Toggle the selection status of a point.\n             *\n             * @see Highcharts.Chart#getSelectedPoints\n             *\n             * @sample highcharts/members/point-select/\n             *         Select a point from a button\n             * @sample highcharts/chart/events-selection-points/\n             *         Select a range of points through a drag selection\n             * @sample maps/series/data-id/\n             *         Select a point in Highmaps\n             *\n             * @function Highcharts.Point#select\n             *\n             * @param {boolean} [selected]\n             * When `true`, the point is selected. When `false`, the point is\n             * unselected. When `null` or `undefined`, the selection state is toggled.\n             *\n             * @param {boolean} [accumulate=false]\n             * When `true`, the selection is added to other selected points.\n             * When `false`, other selected points are deselected. Internally in\n             * Highcharts, when\n             * [allowPointSelect](https://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect)\n             * is `true`, selected points are accumulated on Control, Shift or Cmd\n             * clicking the point.\n             *\n             * @fires Highcharts.Point#event:select\n             * @fires Highcharts.Point#event:unselect\n             */\n            select: function (selected, accumulate) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart;\n                selected = pick(selected, !point.selected);\n                this.selectedStaging = selected;\n                // fire the event with the default handler\n                point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n                    /**\n                     * Whether the point is selected or not.\n                     *\n                     * @see Point#select\n                     * @see Chart#getSelectedPoints\n                     *\n                     * @name Highcharts.Point#selected\n                     * @type {boolean}\n                     */\n                    point.selected = point.options.selected = selected;\n                    series.options.data[series.data.indexOf(point)] =\n                        point.options;\n                    point.setState(selected && 'select');\n                    // unselect all other points unless Ctrl or Cmd + click\n                    if (!accumulate) {\n                        chart.getSelectedPoints().forEach(function (loopPoint) {\n                            var loopSeries = loopPoint.series;\n                            if (loopPoint.selected && loopPoint !== point) {\n                                loopPoint.selected = loopPoint.options.selected =\n                                    false;\n                                loopSeries.options.data[loopSeries.data.indexOf(loopPoint)] = loopPoint.options;\n                                // Programatically selecting a point should restore\n                                // normal state, but when click happened on other\n                                // point, set inactive state to match other points\n                                loopPoint.setState(chart.hoverPoints &&\n                                    loopSeries.options.inactiveOtherPoints ?\n                                    'inactive' : '');\n                                loopPoint.firePointEvent('unselect');\n                            }\n                        });\n                    }\n                });\n                delete this.selectedStaging;\n            },\n            /**\n             * Runs on mouse over the point. Called internally from mouse and touch\n             * events.\n             *\n             * @function Highcharts.Point#onMouseOver\n             *\n             * @param {Highcharts.PointerEventObject} [e]\n             *        The event arguments.\n             */\n            onMouseOver: function (e) {\n                var point = this,\n                    series = point.series,\n                    chart = series.chart,\n                    pointer = chart.pointer;\n                e = e ?\n                    pointer.normalize(e) :\n                    // In cases where onMouseOver is called directly without an event\n                    pointer.getChartCoordinatesFromPoint(point, chart.inverted);\n                pointer.runPointActions(e, point);\n            },\n            /**\n             * Runs on mouse out from the point. Called internally from mouse and touch\n             * events.\n             *\n             * @function Highcharts.Point#onMouseOut\n             * @fires Highcharts.Point#event:mouseOut\n             */\n            onMouseOut: function () {\n                var point = this,\n                    chart = point.series.chart;\n                point.firePointEvent('mouseOut');\n                if (!point.series.options.inactiveOtherPoints) {\n                    (chart.hoverPoints || []).forEach(function (p) {\n                        p.setState();\n                    });\n                }\n                chart.hoverPoints = chart.hoverPoint = null;\n            },\n            /**\n             * Import events from the series' and point's options. Only do it on\n             * demand, to save processing time on hovering.\n             *\n             * @private\n             * @function Highcharts.Point#importEvents\n             */\n            importEvents: function () {\n                if (!this.hasImportedEvents) {\n                    var point = this,\n                        options = merge(point.series.options.point,\n                        point.options),\n                        events = options.events;\n                    point.events = events;\n                    objectEach(events, function (event, eventType) {\n                        if (isFunction(event)) {\n                            addEvent(point, eventType, event);\n                        }\n                    });\n                    this.hasImportedEvents = true;\n                }\n            },\n            /**\n             * Set the point's state.\n             *\n             * @function Highcharts.Point#setState\n             *\n             * @param {Highcharts.PointStateValue|\"\"} [state]\n             *        The new state, can be one of `'hover'`, `'select'`, `'inactive'`,\n             *        or `''` (an empty string), `'normal'` or `undefined` to set to\n             *        normal state.\n             * @param {boolean} [move]\n             *        State for animation.\n             *\n             * @fires Highcharts.Point#event:afterSetState\n             */\n            setState: function (state, move) {\n                var point = this,\n                    series = point.series,\n                    previousState = point.state,\n                    stateOptions = (series.options.states[state || 'normal'] ||\n                        {}),\n                    markerOptions = (defaultOptions.plotOptions[series.type].marker &&\n                        series.options.marker),\n                    normalDisabled = (markerOptions && markerOptions.enabled === false),\n                    markerStateOptions = ((markerOptions &&\n                        markerOptions.states &&\n                        markerOptions.states[state || 'normal']) || {}),\n                    stateDisabled = markerStateOptions.enabled === false,\n                    stateMarkerGraphic = series.stateMarkerGraphic,\n                    pointMarker = point.marker || {},\n                    chart = series.chart,\n                    halo = series.halo,\n                    haloOptions,\n                    markerAttribs,\n                    pointAttribs,\n                    pointAttribsAnimation,\n                    hasMarkers = (markerOptions && series.markerAttribs),\n                    newSymbol;\n                state = state || ''; // empty string\n                if (\n                // already has this state\n                (state === point.state && !move) ||\n                    // selected points don't respond to hover\n                    (point.selected && state !== 'select') ||\n                    // series' state options is disabled\n                    (stateOptions.enabled === false) ||\n                    // general point marker's state options is disabled\n                    (state && (stateDisabled ||\n                        (normalDisabled &&\n                            markerStateOptions.enabled === false))) ||\n                    // individual point marker's state options is disabled\n                    (state &&\n                        pointMarker.states &&\n                        pointMarker.states[state] &&\n                        pointMarker.states[state].enabled === false) // #1610\n                ) {\n                    return;\n                }\n                point.state = state;\n                if (hasMarkers) {\n                    markerAttribs = series.markerAttribs(point, state);\n                }\n                // Apply hover styles to the existing point\n                if (point.graphic) {\n                    if (previousState) {\n                        point.graphic.removeClass('highcharts-point-' + previousState);\n                    }\n                    if (state) {\n                        point.graphic.addClass('highcharts-point-' + state);\n                    }\n                    if (!chart.styledMode) {\n                        pointAttribs = series.pointAttribs(point, state);\n                        pointAttribsAnimation = pick(chart.options.chart.animation, stateOptions.animation);\n                        // Some inactive points (e.g. slices in pie) should apply\n                        // oppacity also for it's labels\n                        if (series.options.inactiveOtherPoints && pointAttribs.opacity) {\n                            (point.dataLabels || []).forEach(function (label) {\n                                if (label) {\n                                    label.animate({\n                                        opacity: pointAttribs.opacity\n                                    }, pointAttribsAnimation);\n                                }\n                            });\n                            if (point.connector) {\n                                point.connector.animate({\n                                    opacity: pointAttribs.opacity\n                                }, pointAttribsAnimation);\n                            }\n                        }\n                        point.graphic.animate(pointAttribs, pointAttribsAnimation);\n                    }\n                    if (markerAttribs) {\n                        point.graphic.animate(markerAttribs, pick(\n                        // Turn off globally:\n                        chart.options.chart.animation, markerStateOptions.animation, markerOptions.animation));\n                    }\n                    // Zooming in from a range with no markers to a range with markers\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic.hide();\n                    }\n                }\n                else {\n                    // if a graphic is not applied to each point in the normal state,\n                    // create a shared graphic for the hover state\n                    if (state && markerStateOptions) {\n                        newSymbol = pointMarker.symbol || series.symbol;\n                        // If the point has another symbol than the previous one, throw\n                        // away the state marker graphic and force a new one (#1459)\n                        if (stateMarkerGraphic &&\n                            stateMarkerGraphic.currentSymbol !== newSymbol) {\n                            stateMarkerGraphic = stateMarkerGraphic.destroy();\n                        }\n                        // Add a new state marker graphic\n                        if (markerAttribs) {\n                            if (!stateMarkerGraphic) {\n                                if (newSymbol) {\n                                    series.stateMarkerGraphic = stateMarkerGraphic =\n                                        chart.renderer\n                                            .symbol(newSymbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height)\n                                            .add(series.markerGroup);\n                                    stateMarkerGraphic.currentSymbol = newSymbol;\n                                }\n                                // Move the existing graphic\n                            }\n                            else {\n                                stateMarkerGraphic[move ? 'animate' : 'attr']({\n                                    x: markerAttribs.x,\n                                    y: markerAttribs.y\n                                });\n                            }\n                        }\n                        if (!chart.styledMode && stateMarkerGraphic) {\n                            stateMarkerGraphic.attr(series.pointAttribs(point, state));\n                        }\n                    }\n                    if (stateMarkerGraphic) {\n                        stateMarkerGraphic[state && point.isInside ? 'show' : 'hide'](); // #2450\n                        stateMarkerGraphic.element.point = point; // #4310\n                    }\n                }\n                // Show me your halo\n                haloOptions = stateOptions.halo;\n                var markerGraphic = (point.graphic || stateMarkerGraphic);\n                var markerVisibility = (markerGraphic && markerGraphic.visibility || 'inherit');\n                if (haloOptions &&\n                    haloOptions.size &&\n                    markerGraphic &&\n                    markerVisibility !== 'hidden' &&\n                    !point.isCluster) {\n                    if (!halo) {\n                        series.halo = halo = chart.renderer.path()\n                            // #5818, #5903, #6705\n                            .add(markerGraphic.parentGroup);\n                    }\n                    halo.show()[move ? 'animate' : 'attr']({\n                        d: point.haloPath(haloOptions.size)\n                    });\n                    halo.attr({\n                        'class': 'highcharts-halo highcharts-color-' +\n                            pick(point.colorIndex, series.colorIndex) +\n                            (point.className ? ' ' + point.className : ''),\n                        'visibility': markerVisibility,\n                        'zIndex': -1 // #4929, #8276\n                    });\n                    halo.point = point; // #6055\n                    if (!chart.styledMode) {\n                        halo.attr(extend({\n                            'fill': point.color || series.color,\n                            'fill-opacity': haloOptions.opacity\n                        }, haloOptions.attributes));\n                    }\n                }\n                else if (halo && halo.point && halo.point.haloPath) {\n                    // Animate back to 0 on the current halo point (#6055)\n                    halo.animate({ d: halo.point.haloPath(0) }, null, \n                    // Hide after unhovering. The `complete` callback runs in the\n                    // halo's context (#7681).\n                    halo.hide);\n                }\n                fireEvent(point, 'afterSetState');\n            },\n            /**\n             * Get the path definition for the halo, which is usually a shadow-like\n             * circle around the currently hovered point.\n             *\n             * @function Highcharts.Point#haloPath\n             *\n             * @param {number} size\n             *        The radius of the circular halo.\n             *\n             * @return {Highcharts.SVGPathArray}\n             *         The path definition.\n             */\n            haloPath: function (size) {\n                var series = this.series,\n                    chart = series.chart;\n                return chart.renderer.symbols.circle(Math.floor(this.plotX) - size, this.plotY - size, size * 2, size * 2);\n            }\n        });\n        // Extend the Series object with interaction\n        extend(Series.prototype, /** @lends Highcharts.Series.prototype */ {\n            /**\n             * Runs on mouse over the series graphical items.\n             *\n             * @function Highcharts.Series#onMouseOver\n             * @fires Highcharts.Series#event:mouseOver\n             */\n            onMouseOver: function () {\n                var series = this,\n                    chart = series.chart,\n                    hoverSeries = chart.hoverSeries,\n                    pointer = chart.pointer;\n                pointer.setHoverChartIndex();\n                // set normal state to previous series\n                if (hoverSeries && hoverSeries !== series) {\n                    hoverSeries.onMouseOut();\n                }\n                // trigger the event, but to save processing time,\n                // only if defined\n                if (series.options.events.mouseOver) {\n                    fireEvent(series, 'mouseOver');\n                }\n                // hover this\n                series.setState('hover');\n                /**\n                 * Contains the original hovered series.\n                 *\n                 * @name Highcharts.Chart#hoverSeries\n                 * @type {Highcharts.Series|null}\n                 */\n                chart.hoverSeries = series;\n            },\n            /**\n             * Runs on mouse out of the series graphical items.\n             *\n             * @function Highcharts.Series#onMouseOut\n             *\n             * @fires Highcharts.Series#event:mouseOut\n             */\n            onMouseOut: function () {\n                // trigger the event only if listeners exist\n                var series = this,\n                    options = series.options,\n                    chart = series.chart,\n                    tooltip = chart.tooltip,\n                    hoverPoint = chart.hoverPoint;\n                // #182, set to null before the mouseOut event fires\n                chart.hoverSeries = null;\n                // trigger mouse out on the point, which must be in this series\n                if (hoverPoint) {\n                    hoverPoint.onMouseOut();\n                }\n                // fire the mouse out event\n                if (series && options.events.mouseOut) {\n                    fireEvent(series, 'mouseOut');\n                }\n                // hide the tooltip\n                if (tooltip &&\n                    !series.stickyTracking &&\n                    (!tooltip.shared || series.noSharedTooltip)) {\n                    tooltip.hide();\n                }\n                // Reset all inactive states\n                chart.series.forEach(function (s) {\n                    s.setState('', true);\n                });\n            },\n            /**\n             * Set the state of the series. Called internally on mouse interaction\n             * operations, but it can also be called directly to visually\n             * highlight a series.\n             *\n             * @function Highcharts.Series#setState\n             *\n             * @param {Highcharts.SeriesStateValue|\"\"} [state]\n             *        The new state, can be either `'hover'`, `'inactive'`, `'select'`,\n             *        or `''` (an empty string), `'normal'` or `undefined` to set to\n             *        normal state.\n             * @param {boolean} [inherit]\n             *        Determines if state should be inherited by points too.\n             */\n            setState: function (state, inherit) {\n                var series = this,\n                    options = series.options,\n                    graph = series.graph,\n                    inactiveOtherPoints = options.inactiveOtherPoints,\n                    stateOptions = options.states,\n                    lineWidth = options.lineWidth,\n                    opacity = options.opacity, \n                    // By default a quick animation to hover/inactive,\n                    // slower to un-hover\n                    stateAnimation = pick((stateOptions[state || 'normal'] &&\n                        stateOptions[state || 'normal'].animation),\n                    series.chart.options.chart.animation),\n                    attribs,\n                    i = 0;\n                state = state || '';\n                if (series.state !== state) {\n                    // Toggle class names\n                    [\n                        series.group,\n                        series.markerGroup,\n                        series.dataLabelsGroup\n                    ].forEach(function (group) {\n                        if (group) {\n                            // Old state\n                            if (series.state) {\n                                group.removeClass('highcharts-series-' + series.state);\n                            }\n                            // New state\n                            if (state) {\n                                group.addClass('highcharts-series-' + state);\n                            }\n                        }\n                    });\n                    series.state = state;\n                    if (!series.chart.styledMode) {\n                        if (stateOptions[state] &&\n                            stateOptions[state].enabled === false) {\n                            return;\n                        }\n                        if (state) {\n                            lineWidth = (stateOptions[state].lineWidth ||\n                                lineWidth + (stateOptions[state].lineWidthPlus || 0)); // #4035\n                            opacity = pick(stateOptions[state].opacity, opacity);\n                        }\n                        if (graph && !graph.dashstyle) {\n                            attribs = {\n                                'stroke-width': lineWidth\n                            };\n                            // Animate the graph stroke-width.\n                            graph.animate(attribs, stateAnimation);\n                            while (series['zone-graph-' + i]) {\n                                series['zone-graph-' + i].attr(attribs);\n                                i = i + 1;\n                            }\n                        }\n                        // For some types (pie, networkgraph, sankey) opacity is\n                        // resolved on a point level\n                        if (!inactiveOtherPoints) {\n                            [\n                                series.group,\n                                series.markerGroup,\n                                series.dataLabelsGroup,\n                                series.labelBySeries\n                            ].forEach(function (group) {\n                                if (group) {\n                                    group.animate({\n                                        opacity: opacity\n                                    }, stateAnimation);\n                                }\n                            });\n                        }\n                    }\n                }\n                // Don't loop over points on a series that doesn't apply inactive state\n                // to siblings markers (e.g. line, column)\n                if (inherit && inactiveOtherPoints && series.points) {\n                    series.setAllPointsToState(state);\n                }\n            },\n            /**\n             * Set the state for all points in the series.\n             *\n             * @function Highcharts.Series#setAllPointsToState\n             *\n             * @private\n             *\n             * @param {string} [state]\n             *        Can be either `hover` or undefined to set to normal state.\n             */\n            setAllPointsToState: function (state) {\n                this.points.forEach(function (point) {\n                    if (point.setState) {\n                        point.setState(state);\n                    }\n                });\n            },\n            /**\n             * Show or hide the series.\n             *\n             * @function Highcharts.Series#setVisible\n             *\n             * @param {boolean} [visible]\n             * True to show the series, false to hide. If undefined, the visibility is\n             * toggled.\n             *\n             * @param {boolean} [redraw=true]\n             * Whether to redraw the chart after the series is altered. If doing more\n             * operations on the chart, it is a good idea to set redraw to false and\n             * call {@link Chart#redraw|chart.redraw()} after.\n             *\n             * @fires Highcharts.Series#event:hide\n             * @fires Highcharts.Series#event:show\n             */\n            setVisible: function (vis, redraw) {\n                var series = this,\n                    chart = series.chart,\n                    legendItem = series.legendItem,\n                    showOrHide,\n                    ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n                    oldVisibility = series.visible;\n                // if called without an argument, toggle visibility\n                series.visible =\n                    vis =\n                        series.options.visible =\n                            series.userOptions.visible =\n                                typeof vis === 'undefined' ? !oldVisibility : vis; // #5618\n                showOrHide = vis ? 'show' : 'hide';\n                // show or hide elements\n                [\n                    'group',\n                    'dataLabelsGroup',\n                    'markerGroup',\n                    'tracker',\n                    'tt'\n                ].forEach(function (key) {\n                    if (series[key]) {\n                        series[key][showOrHide]();\n                    }\n                });\n                // hide tooltip (#1361)\n                if (chart.hoverSeries === series ||\n                    (chart.hoverPoint && chart.hoverPoint.series) === series) {\n                    series.onMouseOut();\n                }\n                if (legendItem) {\n                    chart.legend.colorizeItem(series, vis);\n                }\n                // rescale or adapt to resized chart\n                series.isDirty = true;\n                // in a stack, all other series are affected\n                if (series.options.stacking) {\n                    chart.series.forEach(function (otherSeries) {\n                        if (otherSeries.options.stacking && otherSeries.visible) {\n                            otherSeries.isDirty = true;\n                        }\n                    });\n                }\n                // show or hide linked series\n                series.linkedSeries.forEach(function (otherSeries) {\n                    otherSeries.setVisible(vis, false);\n                });\n                if (ignoreHiddenSeries) {\n                    chart.isDirtyBox = true;\n                }\n                fireEvent(series, showOrHide);\n                if (redraw !== false) {\n                    chart.redraw();\n                }\n            },\n            /**\n             * Show the series if hidden.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             *\n             * @function Highcharts.Series#show\n             * @fires Highcharts.Series#event:show\n             */\n            show: function () {\n                this.setVisible(true);\n            },\n            /**\n             * Hide the series if visible. If the\n             * [chart.ignoreHiddenSeries](https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries)\n             * option is true, the chart is redrawn without this series.\n             *\n             * @sample highcharts/members/series-hide/\n             *         Toggle visibility from a button\n             *\n             * @function Highcharts.Series#hide\n             * @fires Highcharts.Series#event:hide\n             */\n            hide: function () {\n                this.setVisible(false);\n            },\n            /**\n             * Select or unselect the series. This means its\n             * {@link Highcharts.Series.selected|selected}\n             * property is set, the checkbox in the legend is toggled and when selected,\n             * the series is returned by the {@link Highcharts.Chart#getSelectedSeries}\n             * function.\n             *\n             * @sample highcharts/members/series-select/\n             *         Select a series from a button\n             *\n             * @function Highcharts.Series#select\n             *\n             * @param {boolean} [selected]\n             * True to select the series, false to unselect. If undefined, the selection\n             * state is toggled.\n             *\n             * @fires Highcharts.Series#event:select\n             * @fires Highcharts.Series#event:unselect\n             */\n            select: function (selected) {\n                var series = this;\n                series.selected =\n                    selected =\n                        this.options.selected = (typeof selected === 'undefined' ?\n                            !series.selected :\n                            selected);\n                if (series.checkbox) {\n                    series.checkbox.checked = selected;\n                }\n                fireEvent(series, selected ? 'select' : 'unselect');\n            },\n            /**\n             * @private\n             * @borrows Highcharts.TrackerMixin.drawTrackerGraph as Highcharts.Series#drawTracker\n             */\n            drawTracker: TrackerMixin.drawTrackerGraph\n        });\n\n    });\n    _registerModule(_modules, 'parts/Responsive.js', [_modules['parts/Chart.js'], _modules['parts/Utilities.js']], function (Chart, U) {\n        /* *\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var find = U.find,\n            isArray = U.isArray,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            splat = U.splat,\n            uniqueKey = U.uniqueKey;\n        /**\n         * A callback function to gain complete control on when the responsive rule\n         * applies.\n         *\n         * @callback Highcharts.ResponsiveCallbackFunction\n         *\n         * @param {Highcharts.Chart} this\n         *        Chart context.\n         *\n         * @return {boolean}\n         *         Return `true` if it applies.\n         */\n        /**\n         * Allows setting a set of rules to apply for different screen or chart\n         * sizes. Each rule specifies additional chart options.\n         *\n         * @sample {highstock} stock/demo/responsive/\n         *         Stock chart\n         * @sample highcharts/responsive/axis/\n         *         Axis\n         * @sample highcharts/responsive/legend/\n         *         Legend\n         * @sample highcharts/responsive/classname/\n         *         Class name\n         *\n         * @since     5.0.0\n         * @apioption responsive\n         */\n        /**\n         * A set of rules for responsive settings. The rules are executed from\n         * the top down.\n         *\n         * @sample {highcharts} highcharts/responsive/axis/\n         *         Axis changes\n         * @sample {highstock} highcharts/responsive/axis/\n         *         Axis changes\n         * @sample {highmaps} highcharts/responsive/axis/\n         *         Axis changes\n         *\n         * @type      {Array<*>}\n         * @since     5.0.0\n         * @apioption responsive.rules\n         */\n        /**\n         * A full set of chart options to apply as overrides to the general\n         * chart options. The chart options are applied when the given rule\n         * is active.\n         *\n         * A special case is configuration objects that take arrays, for example\n         * [xAxis](#xAxis), [yAxis](#yAxis) or [series](#series). For these\n         * collections, an `id` option is used to map the new option set to\n         * an existing object. If an existing object of the same id is not found,\n         * the item of the same indexupdated. So for example, setting `chartOptions`\n         * with two series items without an `id`, will cause the existing chart's\n         * two series to be updated with respective options.\n         *\n         * @sample {highstock} stock/demo/responsive/\n         *         Stock chart\n         * @sample highcharts/responsive/axis/\n         *         Axis\n         * @sample highcharts/responsive/legend/\n         *         Legend\n         * @sample highcharts/responsive/classname/\n         *         Class name\n         *\n         * @type      {Highcharts.Options}\n         * @since     5.0.0\n         * @apioption responsive.rules.chartOptions\n         */\n        /**\n         * Under which conditions the rule applies.\n         *\n         * @since     5.0.0\n         * @apioption responsive.rules.condition\n         */\n        /**\n         * A callback function to gain complete control on when the responsive\n         * rule applies. Return `true` if it applies. This opens for checking\n         * against other metrics than the chart size, for example the document\n         * size or other elements.\n         *\n         * @type      {Highcharts.ResponsiveCallbackFunction}\n         * @since     5.0.0\n         * @context   Highcharts.Chart\n         * @apioption responsive.rules.condition.callback\n         */\n        /**\n         * The responsive rule applies if the chart height is less than this.\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.maxHeight\n         */\n        /**\n         * The responsive rule applies if the chart width is less than this.\n         *\n         * @sample highcharts/responsive/axis/\n         *         Max width is 500\n         *\n         * @type      {number}\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.maxWidth\n         */\n        /**\n         * The responsive rule applies if the chart height is greater than this.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.minHeight\n         */\n        /**\n         * The responsive rule applies if the chart width is greater than this.\n         *\n         * @type      {number}\n         * @default   0\n         * @since     5.0.0\n         * @apioption responsive.rules.condition.minWidth\n         */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Update the chart based on the current chart/document size and options for\n         * responsiveness.\n         *\n         * @private\n         * @function Highcharts.Chart#setResponsive\n         * @param  {boolean} [redraw=true]\n         * @param  {boolean} [reset=false]\n         * Reset by un-applying all rules. Chart.update resets all rules before applying\n         * updated options.\n         */\n        Chart.prototype.setResponsive = function (redraw, reset) {\n            var options = this.options.responsive,\n                ruleIds = [],\n                currentResponsive = this.currentResponsive,\n                currentRuleIds,\n                undoOptions;\n            if (!reset && options && options.rules) {\n                options.rules.forEach(function (rule) {\n                    if (typeof rule._id === 'undefined') {\n                        rule._id = uniqueKey();\n                    }\n                    this.matchResponsiveRule(rule, ruleIds /* , redraw */);\n                }, this);\n            }\n            // Merge matching rules\n            var mergedOptions = merge.apply(0,\n                ruleIds.map(function (ruleId) {\n                    return find(options.rules,\n                function (rule) {\n                        return rule._id === ruleId;\n                }).chartOptions;\n            }));\n            mergedOptions.isResponsiveOptions = true;\n            // Stringified key for the rules that currently apply.\n            ruleIds = (ruleIds.toString() || void 0);\n            currentRuleIds = currentResponsive && currentResponsive.ruleIds;\n            // Changes in what rules apply\n            if (ruleIds !== currentRuleIds) {\n                // Undo previous rules. Before we apply a new set of rules, we need to\n                // roll back completely to base options (#6291).\n                if (currentResponsive) {\n                    this.update(currentResponsive.undoOptions, redraw, true);\n                }\n                if (ruleIds) {\n                    // Get undo-options for matching rules\n                    undoOptions = this.currentOptions(mergedOptions);\n                    undoOptions.isResponsiveOptions = true;\n                    this.currentResponsive = {\n                        ruleIds: ruleIds,\n                        mergedOptions: mergedOptions,\n                        undoOptions: undoOptions\n                    };\n                    this.update(mergedOptions, redraw, true);\n                }\n                else {\n                    this.currentResponsive = void 0;\n                }\n            }\n        };\n        /**\n         * Handle a single responsiveness rule.\n         *\n         * @private\n         * @function Highcharts.Chart#matchResponsiveRule\n         * @param {Highcharts.ResponsiveRulesOptions} rule\n         * @param {Array<string>} matches\n         */\n        Chart.prototype.matchResponsiveRule = function (rule, matches) {\n            var condition = rule.condition,\n                fn = condition.callback || function () {\n                    return (this.chartWidth <= pick(condition.maxWidth,\n                Number.MAX_VALUE) &&\n                        this.chartHeight <=\n                            pick(condition.maxHeight,\n                Number.MAX_VALUE) &&\n                        this.chartWidth >= pick(condition.minWidth, 0) &&\n                        this.chartHeight >= pick(condition.minHeight, 0));\n            };\n            if (fn.call(this)) {\n                matches.push(rule._id);\n            }\n        };\n        /**\n         * Get the current values for a given set of options. Used before we update\n         * the chart with a new responsiveness rule.\n         *\n         * @todo Restore axis options (by id?). The matching of items in collections\n         * bears resemblance to the oneToOne matching in Chart.update. Probably we can\n         * refactor out that matching and reuse it in both functions.\n         *\n         * @private\n         * @function Highcharts.Chart#currentOptions\n         * @param {Highcharts.Options} options\n         * @return {Highcharts.Options}\n         */\n        Chart.prototype.currentOptions = function (options) {\n            var chart = this,\n                ret = {};\n            /**\n             * Recurse over a set of options and its current values,\n             * and store the current values in the ret object.\n             */\n            function getCurrent(options, curr, ret, depth) {\n                var i;\n                objectEach(options, function (val, key) {\n                    if (!depth &&\n                        chart.collectionsWithUpdate.indexOf(key) > -1) {\n                        val = splat(val);\n                        ret[key] = [];\n                        // Iterate over collections like series, xAxis or yAxis and map\n                        // the items by index.\n                        for (i = 0; i < Math.max(val.length, curr[key].length); i++) {\n                            // Item exists in current data (#6347)\n                            if (curr[key][i]) {\n                                // If the item is missing from the new data, we need to\n                                // save the whole config structure. Like when\n                                // responsively updating from a dual axis layout to a\n                                // single axis and back (#13544).\n                                if (val[i] === void 0) {\n                                    ret[key][i] = curr[key][i];\n                                    // Otherwise, proceed\n                                }\n                                else {\n                                    ret[key][i] = {};\n                                    getCurrent(val[i], curr[key][i], ret[key][i], depth + 1);\n                                }\n                            }\n                        }\n                    }\n                    else if (isObject(val)) {\n                        ret[key] = isArray(val) ? [] : {};\n                        getCurrent(val, curr[key] || {}, ret[key], depth + 1);\n                    }\n                    else if (typeof curr[key] === 'undefined') { // #10286\n                        ret[key] = null;\n                    }\n                    else {\n                        ret[key] = curr[key];\n                    }\n                });\n            }\n            getCurrent(options, this.options, ret, 0);\n            return ret;\n        };\n\n    });\n    _registerModule(_modules, 'masters/highcharts.src.js', [_modules['parts/Globals.js']], function (Highcharts) {\n\n\n        return Highcharts;\n    });\n    _modules['masters/highcharts.src.js']._modules = _modules;\n    return _modules['masters/highcharts.src.js'];\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/highcharts/highcharts.src.js\n// module id = 980\n// module chunks = 0 1","/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * (c) 2014-2019 Highsoft AS\n * Authors: Jon Arild Nygard / Oystein Moseng\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function (factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = factory;\n    } else if (typeof define === 'function' && define.amd) {\n        define('highcharts/modules/treemap', ['highcharts'], function (Highcharts) {\n            factory(Highcharts);\n            factory.Highcharts = Highcharts;\n            return factory;\n        });\n    } else {\n        factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);\n    }\n}(function (Highcharts) {\n    var _modules = Highcharts ? Highcharts._modules : {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'mixins/tree-series.js', [_modules['parts/Color.js'], _modules['parts/Utilities.js']], function (Color, U) {\n        /* *\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var extend = U.extend,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            merge = U.merge,\n            pick = U.pick;\n        var isBoolean = function (x) {\n                return typeof x === 'boolean';\n        }, isFn = function (x) {\n            return typeof x === 'function';\n        };\n        /* eslint-disable valid-jsdoc */\n        /**\n         * @todo Combine buildTree and buildNode with setTreeValues\n         * @todo Remove logic from Treemap and make it utilize this mixin.\n         * @private\n         */\n        var setTreeValues = function setTreeValues(tree,\n            options) {\n                var before = options.before,\n            idRoot = options.idRoot,\n            mapIdToNode = options.mapIdToNode,\n            nodeRoot = mapIdToNode[idRoot],\n            levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                    options.levelIsConstant :\n                    true),\n            points = options.points,\n            point = points[tree.i],\n            optionsPoint = point && point.options || {},\n            childrenTotal = 0,\n            children = [],\n            value;\n            extend(tree, {\n                levelDynamic: tree.level - (levelIsConstant ? 0 : nodeRoot.level),\n                name: pick(point && point.name, ''),\n                visible: (idRoot === tree.id ||\n                    (isBoolean(options.visible) ? options.visible : false))\n            });\n            if (isFn(before)) {\n                tree = before(tree, options);\n            }\n            // First give the children some values\n            tree.children.forEach(function (child, i) {\n                var newOptions = extend({},\n                    options);\n                extend(newOptions, {\n                    index: i,\n                    siblings: tree.children.length,\n                    visible: tree.visible\n                });\n                child = setTreeValues(child, newOptions);\n                children.push(child);\n                if (child.visible) {\n                    childrenTotal += child.val;\n                }\n            });\n            tree.visible = childrenTotal > 0 || tree.visible;\n            // Set the values\n            value = pick(optionsPoint.value, childrenTotal);\n            extend(tree, {\n                children: children,\n                childrenTotal: childrenTotal,\n                isLeaf: tree.visible && !childrenTotal,\n                val: value\n            });\n            return tree;\n        };\n        /**\n         * @private\n         */\n        var getColor = function getColor(node,\n            options) {\n                var index = options.index,\n            mapOptionsToLevel = options.mapOptionsToLevel,\n            parentColor = options.parentColor,\n            parentColorIndex = options.parentColorIndex,\n            series = options.series,\n            colors = options.colors,\n            siblings = options.siblings,\n            points = series.points,\n            getColorByPoint,\n            chartOptionsChart = series.chart.options.chart,\n            point,\n            level,\n            colorByPoint,\n            colorIndexByPoint,\n            color,\n            colorIndex;\n            /**\n             * @private\n             */\n            function variation(color) {\n                var colorVariation = level && level.colorVariation;\n                if (colorVariation) {\n                    if (colorVariation.key === 'brightness') {\n                        return Color.parse(color).brighten(colorVariation.to * (index / siblings)).get();\n                    }\n                }\n                return color;\n            }\n            if (node) {\n                point = points[node.i];\n                level = mapOptionsToLevel[node.level] || {};\n                getColorByPoint = point && level.colorByPoint;\n                if (getColorByPoint) {\n                    colorIndexByPoint = point.index % (colors ?\n                        colors.length :\n                        chartOptionsChart.colorCount);\n                    colorByPoint = colors && colors[colorIndexByPoint];\n                }\n                // Select either point color, level color or inherited color.\n                if (!series.chart.styledMode) {\n                    color = pick(point && point.options.color, level && level.color, colorByPoint, parentColor && variation(parentColor), series.color);\n                }\n                colorIndex = pick(point && point.options.colorIndex, level && level.colorIndex, colorIndexByPoint, parentColorIndex, options.colorIndex);\n            }\n            return {\n                color: color,\n                colorIndex: colorIndex\n            };\n        };\n        /**\n         * Creates a map from level number to its given options.\n         *\n         * @private\n         * @function getLevelOptions\n         * @param {object} params\n         *        Object containing parameters.\n         *        - `defaults` Object containing default options. The default options\n         *           are merged with the userOptions to get the final options for a\n         *           specific level.\n         *        - `from` The lowest level number.\n         *        - `levels` User options from series.levels.\n         *        - `to` The highest level number.\n         * @return {Highcharts.Dictionary<object>|null}\n         *         Returns a map from level number to its given options.\n         */\n        var getLevelOptions = function getLevelOptions(params) {\n                var result = null,\n            defaults,\n            converted,\n            i,\n            from,\n            to,\n            levels;\n            if (isObject(params)) {\n                result = {};\n                from = isNumber(params.from) ? params.from : 1;\n                levels = params.levels;\n                converted = {};\n                defaults = isObject(params.defaults) ? params.defaults : {};\n                if (isArray(levels)) {\n                    converted = levels.reduce(function (obj, item) {\n                        var level,\n                            levelIsConstant,\n                            options;\n                        if (isObject(item) && isNumber(item.level)) {\n                            options = merge({}, item);\n                            levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                                options.levelIsConstant :\n                                defaults.levelIsConstant);\n                            // Delete redundant properties.\n                            delete options.levelIsConstant;\n                            delete options.level;\n                            // Calculate which level these options apply to.\n                            level = item.level + (levelIsConstant ? 0 : from - 1);\n                            if (isObject(obj[level])) {\n                                extend(obj[level], options);\n                            }\n                            else {\n                                obj[level] = options;\n                            }\n                        }\n                        return obj;\n                    }, {});\n                }\n                to = isNumber(params.to) ? params.to : 1;\n                for (i = 0; i <= to; i++) {\n                    result[i] = merge({}, defaults, isObject(converted[i]) ? converted[i] : {});\n                }\n            }\n            return result;\n        };\n        /**\n         * Update the rootId property on the series. Also makes sure that it is\n         * accessible to exporting.\n         *\n         * @private\n         * @function updateRootId\n         *\n         * @param {object} series\n         *        The series to operate on.\n         *\n         * @return {string}\n         *         Returns the resulting rootId after update.\n         */\n        var updateRootId = function (series) {\n                var rootId,\n            options;\n            if (isObject(series)) {\n                // Get the series options.\n                options = isObject(series.options) ? series.options : {};\n                // Calculate the rootId.\n                rootId = pick(series.rootNode, options.rootId, '');\n                // Set rootId on series.userOptions to pick it up in exporting.\n                if (isObject(series.userOptions)) {\n                    series.userOptions.rootId = rootId;\n                }\n                // Set rootId on series to pick it up on next update.\n                series.rootNode = rootId;\n            }\n            return rootId;\n        };\n        var result = {\n                getColor: getColor,\n                getLevelOptions: getLevelOptions,\n                setTreeValues: setTreeValues,\n                updateRootId: updateRootId\n            };\n\n        return result;\n    });\n    _registerModule(_modules, 'mixins/draw-point.js', [], function () {\n        /* *\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var isFn = function (x) {\n                return typeof x === 'function';\n        };\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handles the drawing of a component.\n         * Can be used for any type of component that reserves the graphic property, and\n         * provides a shouldDraw on its context.\n         *\n         * @private\n         * @function draw\n         * @param {DrawPointParams} params\n         *        Parameters.\n         *\n         * @todo add type checking.\n         * @todo export this function to enable usage\n         */\n        var draw = function draw(params) {\n                var _a;\n            var component = this,\n                graphic = component.graphic,\n                animatableAttribs = params.animatableAttribs,\n                onComplete = params.onComplete,\n                css = params.css,\n                renderer = params.renderer,\n                animation = (_a = component.series) === null || _a === void 0 ? void 0 : _a.options.animation;\n            if (component.shouldDraw()) {\n                if (!graphic) {\n                    component.graphic = graphic =\n                        renderer[params.shapeType](params.shapeArgs)\n                            .add(params.group);\n                }\n                graphic\n                    .css(css)\n                    .attr(params.attribs)\n                    .animate(animatableAttribs, params.isNew ? false : animation, onComplete);\n            }\n            else if (graphic) {\n                var destroy = function () {\n                        component.graphic = graphic = graphic.destroy();\n                    if (isFn(onComplete)) {\n                        onComplete();\n                    }\n                };\n                // animate only runs complete callback if something was animated.\n                if (Object.keys(animatableAttribs).length) {\n                    graphic.animate(animatableAttribs, void 0, function () {\n                        destroy();\n                    });\n                }\n                else {\n                    destroy();\n                }\n            }\n        };\n        /**\n         * An extended version of draw customized for points.\n         * It calls additional methods that is expected when rendering a point.\n         * @private\n         * @param {Highcharts.Dictionary<any>} params Parameters\n         */\n        var drawPoint = function drawPoint(params) {\n                var point = this,\n            attribs = params.attribs = params.attribs || {};\n            // Assigning class in dot notation does go well in IE8\n            // eslint-disable-next-line dot-notation\n            attribs['class'] = point.getClassName();\n            // Call draw to render component\n            draw.call(point, params);\n        };\n\n        return drawPoint;\n    });\n    _registerModule(_modules, 'modules/treemap.src.js', [_modules['parts/Globals.js'], _modules['mixins/tree-series.js'], _modules['mixins/draw-point.js'], _modules['parts/Color.js'], _modules['mixins/legend-symbol.js'], _modules['parts/Point.js'], _modules['parts/Utilities.js']], function (H, mixinTreeSeries, drawPoint, Color, LegendSymbolMixin, Point, U) {\n        /* *\n         *\n         *  (c) 2014-2020 Highsoft AS\n         *\n         *  Authors: Jon Arild Nygard / Oystein Moseng\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var color = Color.parse;\n        var addEvent = U.addEvent,\n            correctFloat = U.correctFloat,\n            defined = U.defined,\n            error = U.error,\n            extend = U.extend,\n            fireEvent = U.fireEvent,\n            isArray = U.isArray,\n            isNumber = U.isNumber,\n            isObject = U.isObject,\n            isString = U.isString,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            seriesType = U.seriesType,\n            stableSort = U.stableSort;\n        /* eslint-disable no-invalid-this */\n        var AXIS_MAX = 100;\n        var seriesTypes = H.seriesTypes,\n            noop = H.noop,\n            getColor = mixinTreeSeries.getColor,\n            getLevelOptions = mixinTreeSeries.getLevelOptions, \n            // @todo Similar to eachObject, this function is likely redundant\n            isBoolean = function (x) {\n                return typeof x === 'boolean';\n        }, Series = H.Series, \n        // @todo Similar to recursive, this function is likely redundant\n        eachObject = function (list, func, context) {\n            context = context || this;\n            objectEach(list, function (val, key) {\n                func.call(context, val, key, list);\n            });\n        }, \n        // @todo find correct name for this function.\n        // @todo Similar to reduce, this function is likely redundant\n        recursive = function (item, func, context) {\n            var next;\n            context = context || this;\n            next = func.call(context, item);\n            if (next !== false) {\n                recursive(next, func, context);\n            }\n        }, updateRootId = mixinTreeSeries.updateRootId, treemapAxisDefaultValues = false;\n        /* eslint-enable no-invalid-this */\n        /**\n         * @private\n         * @class\n         * @name Highcharts.seriesTypes.treemap\n         *\n         * @augments Highcharts.Series\n         */\n        seriesType('treemap', 'scatter'\n        /**\n         * A treemap displays hierarchical data using nested rectangles. The data\n         * can be laid out in varying ways depending on options.\n         *\n         * @sample highcharts/demo/treemap-large-dataset/\n         *         Treemap\n         *\n         * @extends      plotOptions.scatter\n         * @excluding    dragDrop, marker, jitter, dataSorting\n         * @product      highcharts\n         * @requires     modules/treemap\n         * @optionparent plotOptions.treemap\n         */\n        , {\n            /**\n             * When enabled the user can click on a point which is a parent and\n             * zoom in on its children. Deprecated and replaced by\n             * [allowTraversingTree](#plotOptions.treemap.allowTraversingTree).\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-allowdrilltonode/\n             *         Enabled\n             *\n             * @deprecated\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.allowDrillToNode\n             */\n            /**\n             * When enabled the user can click on a point which is a parent and\n             * zoom in on its children.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-allowtraversingtree/\n             *         Enabled\n             *\n             * @since     7.0.3\n             * @product   highcharts\n             */\n            allowTraversingTree: false,\n            animationLimit: 250,\n            /**\n             * When the series contains less points than the crop threshold, all\n             * points are drawn, event if the points fall outside the visible plot\n             * area at the current zoom. The advantage of drawing all points\n             * (including markers and columns), is that animation is performed on\n             * updates. On the other hand, when the series contains more points than\n             * the crop threshold, the series data is cropped to only contain points\n             * that fall within the plot area. The advantage of cropping away\n             * invisible points is to increase performance on large series.\n             *\n             * @type      {number}\n             * @default   300\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.cropThreshold\n             */\n            /**\n             * Fires on a request for change of root node for the tree, before the\n             * update is made. An event object is passed to the function, containing\n             * additional properties `newRootId`, `previousRootId`, `redraw` and\n             * `trigger`.\n             *\n             * @type {function}\n             * @default undefined\n             * @sample {highcharts} highcharts/plotoptions/treemap-events-setrootnode/\n             *         Alert update information on setRootNode event.\n             * @since 7.0.3\n             * @product highcharts\n             * @apioption plotOptions.treemap.events.setRootNode\n             */\n            /**\n             * This option decides if the user can interact with the parent nodes\n             * or just the leaf nodes. When this option is undefined, it will be\n             * true by default. However when allowTraversingTree is true, then it\n             * will be false by default.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-interactbyleaf-false/\n             *         False\n             * @sample {highcharts} highcharts/plotoptions/treemap-interactbyleaf-true-and-allowtraversingtree/\n             *         InteractByLeaf and allowTraversingTree is true\n             *\n             * @type      {boolean}\n             * @since     4.1.2\n             * @product   highcharts\n             * @apioption plotOptions.treemap.interactByLeaf\n             */\n            /**\n             * The sort index of the point inside the treemap level.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-sortindex/\n             *         Sort by years\n             *\n             * @type      {number}\n             * @since     4.1.10\n             * @product   highcharts\n             * @apioption plotOptions.treemap.sortIndex\n             */\n            /**\n             * A series specific or series type specific color set to apply instead\n             * of the global [colors](#colors) when\n             * [colorByPoint](#plotOptions.treemap.colorByPoint) is true.\n             *\n             * @type      {Array<Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject>}\n             * @since     3.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.colors\n             */\n            /**\n             * Whether to display this series type or specific series item in the\n             * legend.\n             */\n            showInLegend: false,\n            /**\n             * @ignore-option\n             */\n            marker: false,\n            /**\n             * When using automatic point colors pulled from the `options.colors`\n             * collection, this option determines whether the chart should receive\n             * one color per series or one color per point.\n             *\n             * @see [series colors](#plotOptions.treemap.colors)\n             *\n             * @since     2.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.colorByPoint\n             */\n            colorByPoint: false,\n            /**\n             * @since 4.1.0\n             */\n            dataLabels: {\n                defer: false,\n                enabled: true,\n                formatter: function () {\n                    var point = this && this.point ?\n                            this.point :\n                            {},\n                        name = isString(point.name) ? point.name : '';\n                    return name;\n                },\n                inside: true,\n                verticalAlign: 'middle'\n            },\n            tooltip: {\n                headerFormat: '',\n                pointFormat: '<b>{point.name}</b>: {point.value}<br/>'\n            },\n            /**\n             * Whether to ignore hidden points when the layout algorithm runs.\n             * If `false`, hidden points will leave open spaces.\n             *\n             * @since 5.0.8\n             */\n            ignoreHiddenPoint: true,\n            /**\n             * This option decides which algorithm is used for setting position\n             * and dimensions of the points.\n             *\n             * @see [How to write your own algorithm](https://www.highcharts.com/docs/chart-and-series-types/treemap)\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-sliceanddice/\n             *         SliceAndDice by default\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-stripes/\n             *         Stripes\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-squarified/\n             *         Squarified\n             * @sample {highcharts} highcharts/plotoptions/treemap-layoutalgorithm-strip/\n             *         Strip\n             *\n             * @since      4.1.0\n             * @validvalue [\"sliceAndDice\", \"stripes\", \"squarified\", \"strip\"]\n             */\n            layoutAlgorithm: 'sliceAndDice',\n            /**\n             * Defines which direction the layout algorithm will start drawing.\n             *\n             * @since       4.1.0\n             * @validvalue [\"vertical\", \"horizontal\"]\n             */\n            layoutStartingDirection: 'vertical',\n            /**\n             * Enabling this option will make the treemap alternate the drawing\n             * direction between vertical and horizontal. The next levels starting\n             * direction will always be the opposite of the previous.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-alternatestartingdirection-true/\n             *         Enabled\n             *\n             * @since 4.1.0\n             */\n            alternateStartingDirection: false,\n            /**\n             * Used together with the levels and allowTraversingTree options. When\n             * set to false the first level visible to be level one, which is\n             * dynamic when traversing the tree. Otherwise the level will be the\n             * same as the tree structure.\n             *\n             * @since 4.1.0\n             */\n            levelIsConstant: true,\n            /**\n             * Options for the button appearing when drilling down in a treemap.\n             * Deprecated and replaced by\n             * [traverseUpButton](#plotOptions.treemap.traverseUpButton).\n             *\n             * @deprecated\n             */\n            drillUpButton: {\n                /**\n                 * The position of the button.\n                 *\n                 * @deprecated\n                 */\n                position: {\n                    /**\n                     * Vertical alignment of the button.\n                     *\n                     * @deprecated\n                     * @type      {Highcharts.VerticalAlignValue}\n                     * @default   top\n                     * @product   highcharts\n                     * @apioption plotOptions.treemap.drillUpButton.position.verticalAlign\n                     */\n                    /**\n                     * Horizontal alignment of the button.\n                     *\n                     * @deprecated\n                     * @type {Highcharts.AlignValue}\n                     */\n                    align: 'right',\n                    /**\n                     * Horizontal offset of the button.\n                     *\n                     * @deprecated\n                     */\n                    x: -10,\n                    /**\n                     * Vertical offset of the button.\n                     *\n                     * @deprecated\n                     */\n                    y: 10\n                }\n            },\n            /**\n             * Options for the button appearing when traversing down in a treemap.\n             */\n            traverseUpButton: {\n                /**\n                 * The position of the button.\n                 */\n                position: {\n                    /**\n                     * Vertical alignment of the button.\n                     *\n                     * @type      {Highcharts.VerticalAlignValue}\n                     * @default   top\n                     * @product   highcharts\n                     * @apioption plotOptions.treemap.traverseUpButton.position.verticalAlign\n                     */\n                    /**\n                     * Horizontal alignment of the button.\n                     *\n                     * @type {Highcharts.AlignValue}\n                     */\n                    align: 'right',\n                    /**\n                     * Horizontal offset of the button.\n                     */\n                    x: -10,\n                    /**\n                     * Vertical offset of the button.\n                     */\n                    y: 10\n                }\n            },\n            /**\n             * Set options on specific levels. Takes precedence over series options,\n             * but not point options.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-levels/\n             *         Styling dataLabels and borders\n             * @sample {highcharts} highcharts/demo/treemap-with-levels/\n             *         Different layoutAlgorithm\n             *\n             * @type      {Array<*>}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels\n             */\n            /**\n             * Can set a `borderColor` on all points which lies on the same level.\n             *\n             * @type      {Highcharts.ColorString}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderColor\n             */\n            /**\n             * Set the dash style of the border of all the point which lies on the\n             * level. See\n             * [plotOptions.scatter.dashStyle](#plotoptions.scatter.dashstyle)\n             * for possible options.\n             *\n             * @type      {Highcharts.DashStyleValue}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderDashStyle\n             */\n            /**\n             * Can set the borderWidth on all points which lies on the same level.\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.borderWidth\n             */\n            /**\n             * Can set a color on all points which lies on the same level.\n             *\n             * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.color\n             */\n            /**\n             * A configuration object to define how the color of a child varies from\n             * the parent's color. The variation is distributed among the children\n             * of node. For example when setting brightness, the brightness change\n             * will range from the parent's original brightness on the first child,\n             * to the amount set in the `to` setting on the last node. This allows a\n             * gradient-like color scheme that sets children out from each other\n             * while highlighting the grouping on treemaps and sectors on sunburst\n             * charts.\n             *\n             * @sample highcharts/demo/sunburst/\n             *         Sunburst with color variation\n             *\n             * @since     6.0.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.colorVariation\n             */\n            /**\n             * The key of a color variation. Currently supports `brightness` only.\n             *\n             * @type       {string}\n             * @since      6.0.0\n             * @product    highcharts\n             * @validvalue [\"brightness\"]\n             * @apioption  plotOptions.treemap.levels.colorVariation.key\n             */\n            /**\n             * The ending value of a color variation. The last sibling will receive\n             * this value.\n             *\n             * @type      {number}\n             * @since     6.0.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.colorVariation.to\n             */\n            /**\n             * Can set the options of dataLabels on each point which lies on the\n             * level.\n             * [plotOptions.treemap.dataLabels](#plotOptions.treemap.dataLabels) for\n             * possible values.\n             *\n             * @extends   plotOptions.treemap.dataLabels\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.dataLabels\n             */\n            /**\n             * Can set the layoutAlgorithm option on a specific level.\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts\n             * @validvalue [\"sliceAndDice\", \"stripes\", \"squarified\", \"strip\"]\n             * @apioption  plotOptions.treemap.levels.layoutAlgorithm\n             */\n            /**\n             * Can set the layoutStartingDirection option on a specific level.\n             *\n             * @type       {string}\n             * @since      4.1.0\n             * @product    highcharts\n             * @validvalue [\"vertical\", \"horizontal\"]\n             * @apioption  plotOptions.treemap.levels.layoutStartingDirection\n             */\n            /**\n             * Decides which level takes effect from the options set in the levels\n             * object.\n             *\n             * @sample {highcharts} highcharts/plotoptions/treemap-levels/\n             *         Styling of both levels\n             *\n             * @type      {number}\n             * @since     4.1.0\n             * @product   highcharts\n             * @apioption plotOptions.treemap.levels.level\n             */\n            // Presentational options\n            /**\n             * The color of the border surrounding each tree map item.\n             *\n             * @type {Highcharts.ColorString}\n             */\n            borderColor: '#e6e6e6',\n            /**\n             * The width of the border surrounding each tree map item.\n             */\n            borderWidth: 1,\n            colorKey: 'colorValue',\n            /**\n             * The opacity of a point in treemap. When a point has children, the\n             * visibility of the children is determined by the opacity.\n             *\n             * @since 4.2.4\n             */\n            opacity: 0.15,\n            /**\n             * A wrapper object for all the series options in specific states.\n             *\n             * @extends plotOptions.heatmap.states\n             */\n            states: {\n                /**\n                 * Options for the hovered series\n                 *\n                 * @extends   plotOptions.heatmap.states.hover\n                 * @excluding halo\n                 */\n                hover: {\n                    /**\n                     * The border color for the hovered state.\n                     */\n                    borderColor: '#999999',\n                    /**\n                     * Brightness for the hovered point. Defaults to 0 if the\n                     * heatmap series is loaded first, otherwise 0.1.\n                     *\n                     * @type    {number}\n                     * @default undefined\n                     */\n                    brightness: seriesTypes.heatmap ? 0 : 0.1,\n                    /**\n                     * @extends plotOptions.heatmap.states.hover.halo\n                     */\n                    halo: false,\n                    /**\n                     * The opacity of a point in treemap. When a point has children,\n                     * the visibility of the children is determined by the opacity.\n                     *\n                     * @since 4.2.4\n                     */\n                    opacity: 0.75,\n                    /**\n                     * The shadow option for hovered state.\n                     */\n                    shadow: false\n                }\n            }\n            // Prototype members\n        }, {\n            pointArrayMap: ['value'],\n            directTouch: true,\n            optionalAxis: 'colorAxis',\n            getSymbol: noop,\n            parallelArrays: ['x', 'y', 'value', 'colorValue'],\n            colorKey: 'colorValue',\n            trackerGroups: ['group', 'dataLabelsGroup'],\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Creates an object map from parent id to childrens index.\n             *\n             * @private\n             * @function Highcharts.Series#getListOfParents\n             *\n             * @param {Highcharts.SeriesTreemapDataOptions} [data]\n             *        List of points set in options.\n             *\n             * @param {Array<string>} [existingIds]\n             *        List of all point ids.\n             *\n             * @return {object}\n             *         Map from parent id to children index in data.\n             */\n            getListOfParents: function (data, existingIds) {\n                var arr = isArray(data) ? data : [],\n                    ids = isArray(existingIds) ? existingIds : [],\n                    listOfParents = arr.reduce(function (prev,\n                    curr,\n                    i) {\n                        var parent = pick(curr.parent, '');\n                    if (typeof prev[parent] === 'undefined') {\n                        prev[parent] = [];\n                    }\n                    prev[parent].push(i);\n                    return prev;\n                }, {\n                    '': [] // Root of tree\n                });\n                // If parent does not exist, hoist parent to root of tree.\n                eachObject(listOfParents, function (children, parent, list) {\n                    if ((parent !== '') && (ids.indexOf(parent) === -1)) {\n                        children.forEach(function (child) {\n                            list[''].push(child);\n                        });\n                        delete list[parent];\n                    }\n                });\n                return listOfParents;\n            },\n            // Creates a tree structured object from the series points\n            getTree: function () {\n                var series = this,\n                    allIds = this.data.map(function (d) {\n                        return d.id;\n                }), parentList = series.getListOfParents(this.data, allIds);\n                series.nodeMap = [];\n                return series.buildNode('', -1, 0, parentList, null);\n            },\n            // Define hasData function for non-cartesian series.\n            // Returns true if the series has points at all.\n            hasData: function () {\n                return !!this.processedXData.length; // != 0\n            },\n            init: function (chart, options) {\n                var series = this,\n                    colorMapSeriesMixin = H.colorMapSeriesMixin;\n                // If color series logic is loaded, add some properties\n                if (colorMapSeriesMixin) {\n                    this.colorAttribs = colorMapSeriesMixin.colorAttribs;\n                }\n                // Handle deprecated options.\n                series.eventsToUnbind.push(addEvent(series, 'setOptions', function (event) {\n                    var options = event.userOptions;\n                    if (defined(options.allowDrillToNode) &&\n                        !defined(options.allowTraversingTree)) {\n                        options.allowTraversingTree = options.allowDrillToNode;\n                        delete options.allowDrillToNode;\n                    }\n                    if (defined(options.drillUpButton) &&\n                        !defined(options.traverseUpButton)) {\n                        options.traverseUpButton = options.drillUpButton;\n                        delete options.drillUpButton;\n                    }\n                }));\n                Series.prototype.init.call(series, chart, options);\n                // Treemap's opacity is a different option from other series\n                delete series.opacity;\n                if (series.options.allowTraversingTree) {\n                    series.eventsToUnbind.push(addEvent(series, 'click', series.onClickDrillToNode));\n                }\n            },\n            buildNode: function (id, i, level, list, parent) {\n                var series = this,\n                    children = [],\n                    point = series.points[i],\n                    height = 0,\n                    node,\n                    child;\n                // Actions\n                ((list[id] || [])).forEach(function (i) {\n                    child = series.buildNode(series.points[i].id, i, (level + 1), list, id);\n                    height = Math.max(child.height + 1, height);\n                    children.push(child);\n                });\n                node = {\n                    id: id,\n                    i: i,\n                    children: children,\n                    height: height,\n                    level: level,\n                    parent: parent,\n                    visible: false // @todo move this to better location\n                };\n                series.nodeMap[node.id] = node;\n                if (point) {\n                    point.node = node;\n                }\n                return node;\n            },\n            setTreeValues: function (tree) {\n                var series = this,\n                    options = series.options,\n                    idRoot = series.rootNode,\n                    mapIdToNode = series.nodeMap,\n                    nodeRoot = mapIdToNode[idRoot],\n                    levelIsConstant = (isBoolean(options.levelIsConstant) ?\n                        options.levelIsConstant :\n                        true),\n                    childrenTotal = 0,\n                    children = [],\n                    val,\n                    point = series.points[tree.i];\n                // First give the children some values\n                tree.children.forEach(function (child) {\n                    child = series.setTreeValues(child);\n                    children.push(child);\n                    if (!child.ignore) {\n                        childrenTotal += child.val;\n                    }\n                });\n                // Sort the children\n                stableSort(children, function (a, b) {\n                    return a.sortIndex - b.sortIndex;\n                });\n                // Set the values\n                val = pick(point && point.options.value, childrenTotal);\n                if (point) {\n                    point.value = val;\n                }\n                extend(tree, {\n                    children: children,\n                    childrenTotal: childrenTotal,\n                    // Ignore this node if point is not visible\n                    ignore: !(pick(point && point.visible, true) && (val > 0)),\n                    isLeaf: tree.visible && !childrenTotal,\n                    levelDynamic: (tree.level - (levelIsConstant ? 0 : nodeRoot.level)),\n                    name: pick(point && point.name, ''),\n                    sortIndex: pick(point && point.sortIndex, -val),\n                    val: val\n                });\n                return tree;\n            },\n            /**\n             * Recursive function which calculates the area for all children of a\n             * node.\n             *\n             * @private\n             * @function Highcharts.Series#calculateChildrenAreas\n             *\n             * @param {object} node\n             *        The node which is parent to the children.\n             *\n             * @param {object} area\n             *        The rectangular area of the parent.\n             */\n            calculateChildrenAreas: function (parent, area) {\n                var series = this,\n                    options = series.options,\n                    mapOptionsToLevel = series.mapOptionsToLevel,\n                    level = mapOptionsToLevel[parent.level + 1],\n                    algorithm = pick((series[(level && level.layoutAlgorithm)] &&\n                        level.layoutAlgorithm),\n                    options.layoutAlgorithm),\n                    alternate = options.alternateStartingDirection,\n                    childrenValues = [],\n                    children;\n                // Collect all children which should be included\n                children = parent.children.filter(function (n) {\n                    return !n.ignore;\n                });\n                if (level && level.layoutStartingDirection) {\n                    area.direction = level.layoutStartingDirection === 'vertical' ?\n                        0 :\n                        1;\n                }\n                childrenValues = series[algorithm](area, children);\n                children.forEach(function (child, index) {\n                    var values = childrenValues[index];\n                    child.values = merge(values, {\n                        val: child.childrenTotal,\n                        direction: (alternate ? 1 - area.direction : area.direction)\n                    });\n                    child.pointValues = merge(values, {\n                        x: (values.x / series.axisRatio),\n                        // Flip y-values to avoid visual regression with csvCoord in\n                        // Axis.translate at setPointValues. #12488\n                        y: AXIS_MAX - values.y - values.height,\n                        width: (values.width / series.axisRatio)\n                    });\n                    // If node has children, then call method recursively\n                    if (child.children.length) {\n                        series.calculateChildrenAreas(child, child.values);\n                    }\n                });\n            },\n            setPointValues: function () {\n                var series = this;\n                var points = series.points,\n                    xAxis = series.xAxis,\n                    yAxis = series.yAxis;\n                var styledMode = series.chart.styledMode;\n                // Get the crisp correction in classic mode. For this to work in\n                // styled mode, we would need to first add the shape (without x,\n                // y, width and height), then read the rendered stroke width\n                // using point.graphic.strokeWidth(), then modify and apply the\n                // shapeArgs. This applies also to column series, but the\n                // downside is performance and code complexity.\n                var getCrispCorrection = function (point) { return (styledMode ?\n                        0 :\n                        ((series.pointAttribs(point)['stroke-width'] || 0) % 2) / 2); };\n                points.forEach(function (point) {\n                    var _a = point.node,\n                        values = _a.pointValues,\n                        visible = _a.visible;\n                    // Points which is ignored, have no values.\n                    if (values && visible) {\n                        var height = values.height,\n                            width = values.width,\n                            x = values.x,\n                            y = values.y;\n                        var crispCorr = getCrispCorrection(point);\n                        var x1 = Math.round(xAxis.toPixels(x,\n                            true)) - crispCorr;\n                        var x2 = Math.round(xAxis.toPixels(x + width,\n                            true)) - crispCorr;\n                        var y1 = Math.round(yAxis.toPixels(y,\n                            true)) - crispCorr;\n                        var y2 = Math.round(yAxis.toPixels(y + height,\n                            true)) - crispCorr;\n                        // Set point values\n                        point.shapeArgs = {\n                            x: Math.min(x1, x2),\n                            y: Math.min(y1, y2),\n                            width: Math.abs(x2 - x1),\n                            height: Math.abs(y2 - y1)\n                        };\n                        point.plotX =\n                            point.shapeArgs.x + (point.shapeArgs.width / 2);\n                        point.plotY =\n                            point.shapeArgs.y + (point.shapeArgs.height / 2);\n                    }\n                    else {\n                        // Reset visibility\n                        delete point.plotX;\n                        delete point.plotY;\n                    }\n                });\n            },\n            // Set the node's color recursively, from the parent down.\n            setColorRecursive: function (node, parentColor, colorIndex, index, siblings) {\n                var series = this,\n                    chart = series && series.chart,\n                    colors = chart && chart.options && chart.options.colors,\n                    colorInfo,\n                    point;\n                if (node) {\n                    colorInfo = getColor(node, {\n                        colors: colors,\n                        index: index,\n                        mapOptionsToLevel: series.mapOptionsToLevel,\n                        parentColor: parentColor,\n                        parentColorIndex: colorIndex,\n                        series: series,\n                        siblings: siblings\n                    });\n                    point = series.points[node.i];\n                    if (point) {\n                        point.color = colorInfo.color;\n                        point.colorIndex = colorInfo.colorIndex;\n                    }\n                    // Do it all again with the children\n                    (node.children || []).forEach(function (child, i) {\n                        series.setColorRecursive(child, colorInfo.color, colorInfo.colorIndex, i, node.children.length);\n                    });\n                }\n            },\n            algorithmGroup: function (h, w, d, p) {\n                this.height = h;\n                this.width = w;\n                this.plot = p;\n                this.direction = d;\n                this.startDirection = d;\n                this.total = 0;\n                this.nW = 0;\n                this.lW = 0;\n                this.nH = 0;\n                this.lH = 0;\n                this.elArr = [];\n                this.lP = {\n                    total: 0,\n                    lH: 0,\n                    nH: 0,\n                    lW: 0,\n                    nW: 0,\n                    nR: 0,\n                    lR: 0,\n                    aspectRatio: function (w, h) {\n                        return Math.max((w / h), (h / w));\n                    }\n                };\n                this.addElement = function (el) {\n                    this.lP.total = this.elArr[this.elArr.length - 1];\n                    this.total = this.total + el;\n                    if (this.direction === 0) {\n                        // Calculate last point old aspect ratio\n                        this.lW = this.nW;\n                        this.lP.lH = this.lP.total / this.lW;\n                        this.lP.lR = this.lP.aspectRatio(this.lW, this.lP.lH);\n                        // Calculate last point new aspect ratio\n                        this.nW = this.total / this.height;\n                        this.lP.nH = this.lP.total / this.nW;\n                        this.lP.nR = this.lP.aspectRatio(this.nW, this.lP.nH);\n                    }\n                    else {\n                        // Calculate last point old aspect ratio\n                        this.lH = this.nH;\n                        this.lP.lW = this.lP.total / this.lH;\n                        this.lP.lR = this.lP.aspectRatio(this.lP.lW, this.lH);\n                        // Calculate last point new aspect ratio\n                        this.nH = this.total / this.width;\n                        this.lP.nW = this.lP.total / this.nH;\n                        this.lP.nR = this.lP.aspectRatio(this.lP.nW, this.nH);\n                    }\n                    this.elArr.push(el);\n                };\n                this.reset = function () {\n                    this.nW = 0;\n                    this.lW = 0;\n                    this.elArr = [];\n                    this.total = 0;\n                };\n            },\n            algorithmCalcPoints: function (directionChange, last, group, childrenArea) {\n                var pX,\n                    pY,\n                    pW,\n                    pH,\n                    gW = group.lW,\n                    gH = group.lH,\n                    plot = group.plot,\n                    keep,\n                    i = 0,\n                    end = group.elArr.length - 1;\n                if (last) {\n                    gW = group.nW;\n                    gH = group.nH;\n                }\n                else {\n                    keep = group.elArr[group.elArr.length - 1];\n                }\n                group.elArr.forEach(function (p) {\n                    if (last || (i < end)) {\n                        if (group.direction === 0) {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pW = gW;\n                            pH = p / pW;\n                        }\n                        else {\n                            pX = plot.x;\n                            pY = plot.y;\n                            pH = gH;\n                            pW = p / pH;\n                        }\n                        childrenArea.push({\n                            x: pX,\n                            y: pY,\n                            width: pW,\n                            height: correctFloat(pH)\n                        });\n                        if (group.direction === 0) {\n                            plot.y = plot.y + pH;\n                        }\n                        else {\n                            plot.x = plot.x + pW;\n                        }\n                    }\n                    i = i + 1;\n                });\n                // Reset variables\n                group.reset();\n                if (group.direction === 0) {\n                    group.width = group.width - gW;\n                }\n                else {\n                    group.height = group.height - gH;\n                }\n                plot.y = plot.parent.y + (plot.parent.height - group.height);\n                plot.x = plot.parent.x + (plot.parent.width - group.width);\n                if (directionChange) {\n                    group.direction = 1 - group.direction;\n                }\n                // If not last, then add uncalculated element\n                if (!last) {\n                    group.addElement(keep);\n                }\n            },\n            algorithmLowAspectRatio: function (directionChange, parent, children) {\n                var childrenArea = [],\n                    series = this,\n                    pTot,\n                    plot = {\n                        x: parent.x,\n                        y: parent.y,\n                        parent: parent\n                    },\n                    direction = parent.direction,\n                    i = 0,\n                    end = children.length - 1,\n                    group = new this.algorithmGroup(// eslint-disable-line new-cap\n                    parent.height,\n                    parent.width,\n                    direction,\n                    plot);\n                // Loop through and calculate all areas\n                children.forEach(function (child) {\n                    pTot =\n                        (parent.width * parent.height) * (child.val / parent.val);\n                    group.addElement(pTot);\n                    if (group.lP.nR > group.lP.lR) {\n                        series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot // @todo no supported\n                        );\n                    }\n                    // If last child, then calculate all remaining areas\n                    if (i === end) {\n                        series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot // @todo not supported\n                        );\n                    }\n                    i = i + 1;\n                });\n                return childrenArea;\n            },\n            algorithmFill: function (directionChange, parent, children) {\n                var childrenArea = [],\n                    pTot,\n                    direction = parent.direction,\n                    x = parent.x,\n                    y = parent.y,\n                    width = parent.width,\n                    height = parent.height,\n                    pX,\n                    pY,\n                    pW,\n                    pH;\n                children.forEach(function (child) {\n                    pTot =\n                        (parent.width * parent.height) * (child.val / parent.val);\n                    pX = x;\n                    pY = y;\n                    if (direction === 0) {\n                        pH = height;\n                        pW = pTot / pH;\n                        width = width - pW;\n                        x = x + pW;\n                    }\n                    else {\n                        pW = width;\n                        pH = pTot / pW;\n                        height = height - pH;\n                        y = y + pH;\n                    }\n                    childrenArea.push({\n                        x: pX,\n                        y: pY,\n                        width: pW,\n                        height: pH\n                    });\n                    if (directionChange) {\n                        direction = 1 - direction;\n                    }\n                });\n                return childrenArea;\n            },\n            strip: function (parent, children) {\n                return this.algorithmLowAspectRatio(false, parent, children);\n            },\n            squarified: function (parent, children) {\n                return this.algorithmLowAspectRatio(true, parent, children);\n            },\n            sliceAndDice: function (parent, children) {\n                return this.algorithmFill(true, parent, children);\n            },\n            stripes: function (parent, children) {\n                return this.algorithmFill(false, parent, children);\n            },\n            translate: function () {\n                var series = this,\n                    options = series.options, \n                    // NOTE: updateRootId modifies series.\n                    rootId = updateRootId(series),\n                    rootNode,\n                    pointValues,\n                    seriesArea,\n                    tree,\n                    val;\n                // Call prototype function\n                Series.prototype.translate.call(series);\n                // @todo Only if series.isDirtyData is true\n                tree = series.tree = series.getTree();\n                rootNode = series.nodeMap[rootId];\n                series.renderTraverseUpButton(rootId);\n                series.mapOptionsToLevel = getLevelOptions({\n                    from: rootNode.level + 1,\n                    levels: options.levels,\n                    to: tree.height,\n                    defaults: {\n                        levelIsConstant: series.options.levelIsConstant,\n                        colorByPoint: options.colorByPoint\n                    }\n                });\n                if (rootId !== '' &&\n                    (!rootNode || !rootNode.children.length)) {\n                    series.setRootNode('', false);\n                    rootId = series.rootNode;\n                    rootNode = series.nodeMap[rootId];\n                }\n                // Parents of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode], function (node) {\n                    var next = false,\n                        p = node.parent;\n                    node.visible = true;\n                    if (p || p === '') {\n                        next = series.nodeMap[p];\n                    }\n                    return next;\n                });\n                // Children of the root node is by default visible\n                recursive(series.nodeMap[series.rootNode].children, function (children) {\n                    var next = false;\n                    children.forEach(function (child) {\n                        child.visible = true;\n                        if (child.children.length) {\n                            next = (next || []).concat(child.children);\n                        }\n                    });\n                    return next;\n                });\n                series.setTreeValues(tree);\n                // Calculate plotting values.\n                series.axisRatio = (series.xAxis.len / series.yAxis.len);\n                series.nodeMap[''].pointValues = pointValues = {\n                    x: 0,\n                    y: 0,\n                    width: AXIS_MAX,\n                    height: AXIS_MAX\n                };\n                series.nodeMap[''].values = seriesArea = merge(pointValues, {\n                    width: (pointValues.width * series.axisRatio),\n                    direction: (options.layoutStartingDirection === 'vertical' ? 0 : 1),\n                    val: tree.val\n                });\n                series.calculateChildrenAreas(tree, seriesArea);\n                // Logic for point colors\n                if (!series.colorAxis &&\n                    !options.colorByPoint) {\n                    series.setColorRecursive(series.tree);\n                }\n                // Update axis extremes according to the root node.\n                if (options.allowTraversingTree) {\n                    val = rootNode.pointValues;\n                    series.xAxis.setExtremes(val.x, val.x + val.width, false);\n                    series.yAxis.setExtremes(val.y, val.y + val.height, false);\n                    series.xAxis.setScale();\n                    series.yAxis.setScale();\n                }\n                // Assign values to points.\n                series.setPointValues();\n            },\n            /**\n             * Extend drawDataLabels with logic to handle custom options related to\n             * the treemap series:\n             *\n             * - Points which is not a leaf node, has dataLabels disabled by\n             *   default.\n             *\n             * - Options set on series.levels is merged in.\n             *\n             * - Width of the dataLabel is set to match the width of the point\n             *   shape.\n             *\n             * @private\n             * @function Highcharts.Series#drawDataLabels\n             */\n            drawDataLabels: function () {\n                var series = this,\n                    mapOptionsToLevel = series.mapOptionsToLevel,\n                    points = series.points.filter(function (n) {\n                        return n.node.visible;\n                }), options, level;\n                points.forEach(function (point) {\n                    level = mapOptionsToLevel[point.node.level];\n                    // Set options to new object to avoid problems with scope\n                    options = { style: {} };\n                    // If not a leaf, then label should be disabled as default\n                    if (!point.node.isLeaf) {\n                        options.enabled = false;\n                    }\n                    // If options for level exists, include them as well\n                    if (level && level.dataLabels) {\n                        options = merge(options, level.dataLabels);\n                        series._hasPointLabels = true;\n                    }\n                    // Set dataLabel width to the width of the point shape.\n                    if (point.shapeArgs) {\n                        options.style.width = point.shapeArgs.width;\n                        if (point.dataLabel) {\n                            point.dataLabel.css({\n                                width: point.shapeArgs.width + 'px'\n                            });\n                        }\n                    }\n                    // Merge custom options with point options\n                    point.dlOptions = merge(options, point.options.dataLabels);\n                });\n                Series.prototype.drawDataLabels.call(this);\n            },\n            // Over the alignment method by setting z index\n            alignDataLabel: function (point, dataLabel, labelOptions) {\n                var style = labelOptions.style;\n                // #8160: Prevent the label from exceeding the point's\n                // boundaries in treemaps by applying ellipsis overflow.\n                // The issue was happening when datalabel's text contained a\n                // long sequence of characters without a whitespace.\n                if (!defined(style.textOverflow) &&\n                    dataLabel.text &&\n                    dataLabel.getBBox().width > dataLabel.text.textWidth) {\n                    dataLabel.css({\n                        textOverflow: 'ellipsis',\n                        // unit (px) is required when useHTML is true\n                        width: style.width += 'px'\n                    });\n                }\n                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);\n                if (point.dataLabel) {\n                    // point.node.zIndex could be undefined (#6956)\n                    point.dataLabel.attr({ zIndex: (point.node.zIndex || 0) + 1 });\n                }\n            },\n            // Get presentational attributes\n            pointAttribs: function (point, state) {\n                var series = this,\n                    mapOptionsToLevel = (isObject(series.mapOptionsToLevel) ?\n                        series.mapOptionsToLevel :\n                        {}),\n                    level = point && mapOptionsToLevel[point.node.level] || {},\n                    options = this.options,\n                    attr,\n                    stateOptions = (state && options.states[state]) || {},\n                    className = (point && point.getClassName()) || '',\n                    opacity;\n                // Set attributes by precedence. Point trumps level trumps series.\n                // Stroke width uses pick because it can be 0.\n                attr = {\n                    'stroke': (point && point.borderColor) ||\n                        level.borderColor ||\n                        stateOptions.borderColor ||\n                        options.borderColor,\n                    'stroke-width': pick(point && point.borderWidth, level.borderWidth, stateOptions.borderWidth, options.borderWidth),\n                    'dashstyle': (point && point.borderDashStyle) ||\n                        level.borderDashStyle ||\n                        stateOptions.borderDashStyle ||\n                        options.borderDashStyle,\n                    'fill': (point && point.color) || this.color\n                };\n                // Hide levels above the current view\n                if (className.indexOf('highcharts-above-level') !== -1) {\n                    attr.fill = 'none';\n                    attr['stroke-width'] = 0;\n                    // Nodes with children that accept interaction\n                }\n                else if (className.indexOf('highcharts-internal-node-interactive') !== -1) {\n                    opacity = pick(stateOptions.opacity, options.opacity);\n                    attr.fill = color(attr.fill).setOpacity(opacity).get();\n                    attr.cursor = 'pointer';\n                    // Hide nodes that have children\n                }\n                else if (className.indexOf('highcharts-internal-node') !== -1) {\n                    attr.fill = 'none';\n                }\n                else if (state) {\n                    // Brighten and hoist the hover nodes\n                    attr.fill = color(attr.fill)\n                        .brighten(stateOptions.brightness)\n                        .get();\n                }\n                return attr;\n            },\n            // Override drawPoints\n            drawPoints: function () {\n                var series = this,\n                    chart = series.chart,\n                    renderer = chart.renderer,\n                    points = series.points,\n                    styledMode = chart.styledMode,\n                    options = series.options,\n                    shadow = styledMode ? {} : options.shadow,\n                    borderRadius = options.borderRadius,\n                    withinAnimationLimit = chart.pointCount < options.animationLimit,\n                    allowTraversingTree = options.allowTraversingTree;\n                points.forEach(function (point) {\n                    var levelDynamic = point.node.levelDynamic,\n                        animate = {},\n                        attr = {},\n                        css = {},\n                        groupKey = 'level-group-' + levelDynamic,\n                        hasGraphic = !!point.graphic,\n                        shouldAnimate = withinAnimationLimit && hasGraphic,\n                        shapeArgs = point.shapeArgs;\n                    // Don't bother with calculate styling if the point is not drawn\n                    if (point.shouldDraw()) {\n                        if (borderRadius) {\n                            attr.r = borderRadius;\n                        }\n                        merge(true, // Extend object\n                        // Which object to extend\n                        shouldAnimate ? animate : attr, \n                        // Add shapeArgs to animate/attr if graphic exists\n                        hasGraphic ? shapeArgs : {}, \n                        // Add style attribs if !styleMode\n                        styledMode ?\n                            {} :\n                            series.pointAttribs(point, (point.selected && 'select')));\n                        // In styled mode apply point.color. Use CSS, otherwise the\n                        // fill used in the style sheet will take precedence over\n                        // the fill attribute.\n                        if (series.colorAttribs && styledMode) {\n                            // Heatmap is loaded\n                            extend(css, series.colorAttribs(point));\n                        }\n                        if (!series[groupKey]) {\n                            series[groupKey] = renderer.g(groupKey)\n                                .attr({\n                                // @todo Set the zIndex based upon the number of\n                                // levels, instead of using 1000\n                                zIndex: 1000 - levelDynamic\n                            })\n                                .add(series.group);\n                            series[groupKey].survive = true;\n                        }\n                    }\n                    // Draw the point\n                    point.draw({\n                        animatableAttribs: animate,\n                        attribs: attr,\n                        css: css,\n                        group: series[groupKey],\n                        renderer: renderer,\n                        shadow: shadow,\n                        shapeArgs: shapeArgs,\n                        shapeType: 'rect'\n                    });\n                    // If setRootNode is allowed, set a point cursor on clickables &\n                    // add drillId to point\n                    if (allowTraversingTree && point.graphic) {\n                        point.drillId = options.interactByLeaf ?\n                            series.drillToByLeaf(point) :\n                            series.drillToByGroup(point);\n                    }\n                });\n            },\n            // Add drilling on the suitable points\n            onClickDrillToNode: function (event) {\n                var series = this,\n                    point = event.point,\n                    drillId = point && point.drillId;\n                // If a drill id is returned, add click event and cursor.\n                if (isString(drillId) &&\n                    (series.isDrillAllowed ? series.isDrillAllowed(drillId) : true)) {\n                    point.setState(''); // Remove hover\n                    series.setRootNode(drillId, true, { trigger: 'click' });\n                }\n            },\n            /**\n             * Finds the drill id for a parent node. Returns false if point should\n             * not have a click event.\n             *\n             * @private\n             * @function Highcharts.Series#drillToByGroup\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {boolean|string}\n             *         Drill to id or false when point should not have a click\n             *         event.\n             */\n            drillToByGroup: function (point) {\n                var series = this,\n                    drillId = false;\n                if ((point.node.level - series.nodeMap[series.rootNode].level) ===\n                    1 &&\n                    !point.node.isLeaf) {\n                    drillId = point.id;\n                }\n                return drillId;\n            },\n            /**\n             * Finds the drill id for a leaf node. Returns false if point should not\n             * have a click event\n             *\n             * @private\n             * @function Highcharts.Series#drillToByLeaf\n             *\n             * @param {Highcharts.Point} point\n             *\n             * @return {boolean|string}\n             *         Drill to id or false when point should not have a click\n             *         event.\n             */\n            drillToByLeaf: function (point) {\n                var series = this,\n                    drillId = false,\n                    nodeParent;\n                if ((point.node.parent !== series.rootNode) &&\n                    point.node.isLeaf) {\n                    nodeParent = point.node;\n                    while (!drillId) {\n                        nodeParent = series.nodeMap[nodeParent.parent];\n                        if (nodeParent.parent === series.rootNode) {\n                            drillId = nodeParent.id;\n                        }\n                    }\n                }\n                return drillId;\n            },\n            drillUp: function () {\n                var series = this,\n                    node = series.nodeMap[series.rootNode];\n                if (node && isString(node.parent)) {\n                    series.setRootNode(node.parent, true, { trigger: 'traverseUpButton' });\n                }\n            },\n            // TODO remove this function at a suitable version.\n            drillToNode: function (id, redraw) {\n                error(32, false, void 0, { 'treemap.drillToNode': 'use treemap.setRootNode' });\n                this.setRootNode(id, redraw);\n            },\n            /**\n             * Sets a new root node for the series.\n             *\n             * @private\n             * @function Highcharts.Series#setRootNode\n             *\n             * @param {string} id The id of the new root node.\n             * @param {boolean} [redraw=true] Wether to redraw the chart or not.\n             * @param {object} [eventArguments] Arguments to be accessed in\n             * event handler.\n             * @param {string} [eventArguments.newRootId] Id of the new root.\n             * @param {string} [eventArguments.previousRootId] Id of the previous\n             * root.\n             * @param {boolean} [eventArguments.redraw] Wether to redraw the\n             * chart after.\n             * @param {object} [eventArguments.series] The series to update the root\n             * of.\n             * @param {string} [eventArguments.trigger] The action which\n             * triggered the event. Undefined if the setRootNode is called\n             * directly.\n             * @return {void}\n             *\n             * @fires Highcharts.Series#event:setRootNode\n             */\n            setRootNode: function (id, redraw, eventArguments) {\n                var series = this,\n                    eventArgs = extend({\n                        newRootId: id,\n                        previousRootId: series.rootNode,\n                        redraw: pick(redraw,\n                    true),\n                        series: series\n                    },\n                    eventArguments);\n                /**\n                 * The default functionality of the setRootNode event.\n                 *\n                 * @private\n                 * @param {object} args The event arguments.\n                 * @param {string} args.newRootId Id of the new root.\n                 * @param {string} args.previousRootId Id of the previous root.\n                 * @param {boolean} args.redraw Wether to redraw the chart after.\n                 * @param {object} args.series The series to update the root of.\n                 * @param {string} [args.trigger=undefined] The action which\n                 * triggered the event. Undefined if the setRootNode is called\n                 * directly.\n                 * @return {void}\n                 */\n                var defaultFn = function (args) {\n                        var series = args.series;\n                    // Store previous and new root ids on the series.\n                    series.idPreviousRoot = args.previousRootId;\n                    series.rootNode = args.newRootId;\n                    // Redraw the chart\n                    series.isDirty = true; // Force redraw\n                    if (args.redraw) {\n                        series.chart.redraw();\n                    }\n                };\n                // Fire setRootNode event.\n                fireEvent(series, 'setRootNode', eventArgs, defaultFn);\n            },\n            /**\n             * Check if the drill up/down is allowed.\n             *\n             * @private\n             */\n            isDrillAllowed: function (targetNode) {\n                var tree = this.tree,\n                    firstChild = tree.children[0];\n                // The sunburst series looks exactly the same on the level ''\n                // and level 1 if there’s only one element on level 1. Disable\n                // drilling up/down when it doesn't perform any visual\n                // difference (#13388).\n                return !(tree.children.length === 1 && ((this.rootNode === '' && targetNode === firstChild.id) ||\n                    (this.rootNode === firstChild.id && targetNode === '')));\n            },\n            renderTraverseUpButton: function (rootId) {\n                var series = this,\n                    nodeMap = series.nodeMap,\n                    node = nodeMap[rootId],\n                    name = node.name,\n                    buttonOptions = series.options.traverseUpButton,\n                    backText = pick(buttonOptions.text,\n                    name, '< Back'),\n                    attr,\n                    states;\n                if (rootId === '' ||\n                    (series.isDrillAllowed ?\n                        !(isString(node.parent) && series.isDrillAllowed(node.parent)) : false)) {\n                    if (series.drillUpButton) {\n                        series.drillUpButton =\n                            series.drillUpButton.destroy();\n                    }\n                }\n                else if (!this.drillUpButton) {\n                    attr = buttonOptions.theme;\n                    states = attr && attr.states;\n                    this.drillUpButton = this.chart.renderer\n                        .button(backText, null, null, function () {\n                        series.drillUp();\n                    }, attr, states && states.hover, states && states.select)\n                        .addClass('highcharts-drillup-button')\n                        .attr({\n                        align: buttonOptions.position.align,\n                        zIndex: 7\n                    })\n                        .add()\n                        .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n                }\n                else {\n                    this.drillUpButton.placed = false;\n                    this.drillUpButton.attr({\n                        text: backText\n                    })\n                        .align();\n                }\n            },\n            buildKDTree: noop,\n            drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n            getExtremes: function () {\n                // Get the extremes from the value data\n                var _a = Series.prototype.getExtremes\n                        .call(this,\n                    this.colorValueData),\n                    dataMin = _a.dataMin,\n                    dataMax = _a.dataMax;\n                this.valueMin = dataMin;\n                this.valueMax = dataMax;\n                // Get the extremes from the y data\n                return Series.prototype.getExtremes.call(this);\n            },\n            getExtremesFromAll: true,\n            /**\n             * Workaround for `inactive` state. Since `series.opacity` option is\n             * already reserved, don't use that state at all by disabling\n             * `inactiveOtherPoints` and not inheriting states by points.\n             *\n             * @private\n             */\n            setState: function (state) {\n                this.options.inactiveOtherPoints = true;\n                Series.prototype.setState.call(this, state, false);\n                this.options.inactiveOtherPoints = false;\n            },\n            utils: {\n                recursive: recursive\n            }\n            /* eslint-enable no-invalid-this, valid-jsdoc */\n        }, {\n            draw: drawPoint,\n            setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible,\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            getClassName: function () {\n                var className = Point.prototype.getClassName.call(this),\n                    series = this.series,\n                    options = series.options;\n                // Above the current level\n                if (this.node.level <= series.nodeMap[series.rootNode].level) {\n                    className += ' highcharts-above-level';\n                }\n                else if (!this.node.isLeaf &&\n                    !pick(options.interactByLeaf, !options.allowTraversingTree)) {\n                    className += ' highcharts-internal-node-interactive';\n                }\n                else if (!this.node.isLeaf) {\n                    className += ' highcharts-internal-node';\n                }\n                return className;\n            },\n            /**\n             * A tree point is valid if it has han id too, assume it may be a parent\n             * item.\n             *\n             * @private\n             * @function Highcharts.Point#isValid\n             */\n            isValid: function () {\n                return this.id || isNumber(this.value);\n            },\n            setState: function (state) {\n                Point.prototype.setState.call(this, state);\n                // Graphic does not exist when point is not visible.\n                if (this.graphic) {\n                    this.graphic.attr({\n                        zIndex: state === 'hover' ? 1 : 0\n                    });\n                }\n            },\n            shouldDraw: function () {\n                var point = this;\n                return isNumber(point.plotY) && point.y !== null;\n            }\n        });\n        addEvent(H.Series, 'afterBindAxes', function () {\n            var series = this,\n                xAxis = series.xAxis,\n                yAxis = series.yAxis,\n                treeAxis;\n            if (xAxis && yAxis) {\n                if (series.is('treemap')) {\n                    treeAxis = {\n                        endOnTick: false,\n                        gridLineWidth: 0,\n                        lineWidth: 0,\n                        min: 0,\n                        dataMin: 0,\n                        minPadding: 0,\n                        max: AXIS_MAX,\n                        dataMax: AXIS_MAX,\n                        maxPadding: 0,\n                        startOnTick: false,\n                        title: null,\n                        tickPositions: []\n                    };\n                    extend(yAxis.options, treeAxis);\n                    extend(xAxis.options, treeAxis);\n                    treemapAxisDefaultValues = true;\n                }\n                else if (treemapAxisDefaultValues) {\n                    yAxis.setOptions(yAxis.userOptions);\n                    xAxis.setOptions(xAxis.userOptions);\n                    treemapAxisDefaultValues = false;\n                }\n            }\n        });\n        /* eslint-enable no-invalid-this, valid-jsdoc */\n        /**\n         * A `treemap` series. If the [type](#series.treemap.type) option is\n         * not specified, it is inherited from [chart.type](#chart.type).\n         *\n         * @extends   series,plotOptions.treemap\n         * @excluding dataParser, dataURL, stack, dataSorting\n         * @product   highcharts\n         * @requires  modules/treemap\n         * @apioption series.treemap\n         */\n        /**\n         * An array of data points for the series. For the `treemap` series\n         * type, points can be given in the following ways:\n         *\n         * 1. An array of numerical values. In this case, the numerical values will be\n         *    interpreted as `value` options. Example:\n         *    ```js\n         *    data: [0, 5, 3, 5]\n         *    ```\n         *\n         * 2. An array of objects with named values. The following snippet shows only a\n         *    few settings, see the complete options set below. If the total number of\n         *    data points exceeds the series'\n         *    [turboThreshold](#series.treemap.turboThreshold),\n         *    this option is not available.\n         *    ```js\n         *      data: [{\n         *        value: 9,\n         *        name: \"Point2\",\n         *        color: \"#00FF00\"\n         *      }, {\n         *        value: 6,\n         *        name: \"Point1\",\n         *        color: \"#FF00FF\"\n         *      }]\n         *    ```\n         *\n         * @sample {highcharts} highcharts/chart/reflow-true/\n         *         Numerical values\n         * @sample {highcharts} highcharts/series/data-array-of-objects/\n         *         Config objects\n         *\n         * @type      {Array<number|null|*>}\n         * @extends   series.heatmap.data\n         * @excluding x, y\n         * @product   highcharts\n         * @apioption series.treemap.data\n         */\n        /**\n         * The value of the point, resulting in a relative area of the point\n         * in the treemap.\n         *\n         * @type      {number|null}\n         * @product   highcharts\n         * @apioption series.treemap.data.value\n         */\n        /**\n         * Serves a purpose only if a `colorAxis` object is defined in the chart\n         * options. This value will decide which color the point gets from the\n         * scale of the colorAxis.\n         *\n         * @type      {number}\n         * @since     4.1.0\n         * @product   highcharts\n         * @apioption series.treemap.data.colorValue\n         */\n        /**\n         * Only for treemap. Use this option to build a tree structure. The\n         * value should be the id of the point which is the parent. If no points\n         * has a matching id, or this option is undefined, then the parent will\n         * be set to the root.\n         *\n         * @sample {highcharts} highcharts/point/parent/\n         *         Point parent\n         * @sample {highcharts} highcharts/demo/treemap-with-levels/\n         *         Example where parent id is not matching\n         *\n         * @type      {string}\n         * @since     4.1.0\n         * @product   highcharts\n         * @apioption series.treemap.data.parent\n         */\n        ''; // adds doclets above to transpiled file\n\n    });\n    _registerModule(_modules, 'masters/modules/treemap.src.js', [], function () {\n\n\n    });\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/highcharts/modules/treemap.src.js\n// module id = 981\n// module chunks = 0 1","/**\n * @license Highcharts JS v8.1.2 (2020-06-16)\n *\n * Exporting module\n *\n * (c) 2010-2019 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n(function (factory) {\n    if (typeof module === 'object' && module.exports) {\n        factory['default'] = factory;\n        module.exports = factory;\n    } else if (typeof define === 'function' && define.amd) {\n        define('highcharts/modules/exporting', ['highcharts'], function (Highcharts) {\n            factory(Highcharts);\n            factory.Highcharts = Highcharts;\n            return factory;\n        });\n    } else {\n        factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);\n    }\n}(function (Highcharts) {\n    var _modules = Highcharts ? Highcharts._modules : {};\n    function _registerModule(obj, path, args, fn) {\n        if (!obj.hasOwnProperty(path)) {\n            obj[path] = fn.apply(null, args);\n        }\n    }\n    _registerModule(_modules, 'modules/full-screen.src.js', [_modules['parts/Chart.js'], _modules['parts/Globals.js'], _modules['parts/Utilities.js']], function (Chart, H, U) {\n        /* *\n         * (c) 2009-2020 Rafal Sebestjanski\n         *\n         * Full screen for Highcharts\n         *\n         * License: www.highcharts.com/license\n         */\n        var addEvent = U.addEvent;\n        /**\n         * The module allows user to enable display chart in full screen mode.\n         * Used in StockTools too.\n         * Based on default solutions in browsers.\n         *\n         */\n        /* eslint-disable no-invalid-this, valid-jsdoc */\n        /**\n         * Handles displaying chart's container in the fullscreen mode.\n         *\n         * @class\n         * @name Highcharts.Fullscreen\n         * @hideconstructor\n         * @requires modules/full-screen\n         */\n        var Fullscreen = /** @class */ (function () {\n                /* *\n                 *\n                 *  Constructors\n                 *\n                 * */\n                function Fullscreen(chart) {\n                    /**\n                     * Chart managed by the fullscreen controller.\n                     * @name Highcharts.Fullscreen#chart\n                     * @type {Highcharts.Chart}\n                     */\n                    this.chart = chart;\n                /**\n                 * The flag is set to `true` when the chart is displayed in\n                 * the fullscreen mode.\n                 *\n                 * @name Highcharts.Fullscreen#isOpen\n                 * @type {boolean|undefined}\n                 * @since 8.0.1\n                 */\n                this.isOpen = false;\n                var container = chart.renderTo;\n                // Hold event and methods available only for a current browser.\n                if (!this.browserProps) {\n                    if (typeof container.requestFullscreen === 'function') {\n                        this.browserProps = {\n                            fullscreenChange: 'fullscreenchange',\n                            requestFullscreen: 'requestFullscreen',\n                            exitFullscreen: 'exitFullscreen'\n                        };\n                    }\n                    else if (container.mozRequestFullScreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'mozfullscreenchange',\n                            requestFullscreen: 'mozRequestFullScreen',\n                            exitFullscreen: 'mozCancelFullScreen'\n                        };\n                    }\n                    else if (container.webkitRequestFullScreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'webkitfullscreenchange',\n                            requestFullscreen: 'webkitRequestFullScreen',\n                            exitFullscreen: 'webkitExitFullscreen'\n                        };\n                    }\n                    else if (container.msRequestFullscreen) {\n                        this.browserProps = {\n                            fullscreenChange: 'MSFullscreenChange',\n                            requestFullscreen: 'msRequestFullscreen',\n                            exitFullscreen: 'msExitFullscreen'\n                        };\n                    }\n                }\n            }\n            /* *\n             *\n             *  Functions\n             *\n             * */\n            /**\n             * Stops displaying the chart in fullscreen mode.\n             * Exporting module required.\n             *\n             * @since       8.0.1\n             *\n             * @function    Highcharts.Fullscreen#close\n             * @return      {void}\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.close = function () {\n                var fullscreen = this,\n                    chart = fullscreen.chart;\n                // Don't fire exitFullscreen() when user exited using 'Escape' button.\n                if (fullscreen.isOpen &&\n                    fullscreen.browserProps &&\n                    chart.container.ownerDocument instanceof Document) {\n                    chart.container.ownerDocument[fullscreen.browserProps.exitFullscreen]();\n                }\n                // Unbind event as it's necessary only before exiting from fullscreen.\n                if (fullscreen.unbindFullscreenEvent) {\n                    fullscreen.unbindFullscreenEvent();\n                }\n                fullscreen.isOpen = false;\n                fullscreen.setButtonText();\n            };\n            /**\n             * Displays the chart in fullscreen mode.\n             * When fired customly by user before exporting context button is created,\n             * button's text will not be replaced - it's on the user side.\n             * Exporting module required.\n             *\n             * @since       8.0.1\n             *\n             * @function Highcharts.Fullscreen#open\n             * @return      {void}\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.open = function () {\n                var fullscreen = this,\n                    chart = fullscreen.chart;\n                // Handle exitFullscreen() method when user clicks 'Escape' button.\n                if (fullscreen.browserProps) {\n                    fullscreen.unbindFullscreenEvent = addEvent(chart.container.ownerDocument, // chart's document\n                    fullscreen.browserProps.fullscreenChange, function () {\n                        // Handle lack of async of browser's fullScreenChange event.\n                        if (fullscreen.isOpen) {\n                            fullscreen.isOpen = false;\n                            fullscreen.close();\n                        }\n                        else {\n                            fullscreen.isOpen = true;\n                            fullscreen.setButtonText();\n                        }\n                    });\n                    var promise = chart.renderTo[fullscreen.browserProps.requestFullscreen]();\n                    if (promise) {\n                        // No dot notation because of IE8 compatibility\n                        promise['catch'](function () {\n                            alert(// eslint-disable-line no-alert\n                            'Full screen is not supported inside a frame.');\n                        });\n                    }\n                    addEvent(chart, 'destroy', fullscreen.unbindFullscreenEvent);\n                }\n            };\n            /**\n             * Replaces the exporting context button's text when toogling the\n             * fullscreen mode.\n             *\n             * @private\n             *\n             * @since 8.0.1\n             *\n             * @requires modules/full-screen\n             * @return {void}\n             */\n            Fullscreen.prototype.setButtonText = function () {\n                var _a;\n                var chart = this.chart,\n                    exportDivElements = chart.exportDivElements,\n                    exportingOptions = chart.options.exporting,\n                    menuItems = (_a = exportingOptions === null || exportingOptions === void 0 ? void 0 : exportingOptions.buttons) === null || _a === void 0 ? void 0 : _a.contextButton.menuItems,\n                    lang = chart.options.lang;\n                if ((exportingOptions === null || exportingOptions === void 0 ? void 0 : exportingOptions.menuItemDefinitions) && (lang === null || lang === void 0 ? void 0 : lang.exitFullscreen) &&\n                    lang.viewFullscreen &&\n                    menuItems &&\n                    exportDivElements &&\n                    exportDivElements.length) {\n                    exportDivElements[menuItems.indexOf('viewFullscreen')]\n                        .innerHTML = !this.isOpen ?\n                        (exportingOptions.menuItemDefinitions.viewFullscreen.text ||\n                            lang.viewFullscreen) : lang.exitFullscreen;\n                }\n            };\n            /**\n             * Toggles displaying the chart in fullscreen mode.\n             * By default, when the exporting module is enabled, a context button with\n             * a drop down menu in the upper right corner accesses this function.\n             * Exporting module required.\n             *\n             * @since 8.0.1\n             *\n             * @sample      highcharts/members/chart-togglefullscreen/\n             *              Toggle fullscreen mode from a HTML button\n             *\n             * @function Highcharts.Fullscreen#toggle\n             * @requires    modules/full-screen\n             */\n            Fullscreen.prototype.toggle = function () {\n                var fullscreen = this;\n                if (!fullscreen.isOpen) {\n                    fullscreen.open();\n                }\n                else {\n                    fullscreen.close();\n                }\n            };\n            return Fullscreen;\n        }());\n        H.Fullscreen = Fullscreen;\n        // Initialize fullscreen\n        addEvent(Chart, 'beforeRender', function () {\n            /**\n             * @name Highcharts.Chart#fullscreen\n             * @type {Highcharts.Fullscreen}\n             * @requires modules/full-screen\n             */\n            this.fullscreen = new H.Fullscreen(this);\n        });\n\n        return H.Fullscreen;\n    });\n    _registerModule(_modules, 'mixins/navigation.js', [], function () {\n        /**\n         *\n         *  (c) 2010-2018 Paweł Fus\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var chartNavigation = {\n                /**\n                 * Initializes `chart.navigation` object which delegates `update()` methods\n                 * to all other common classes (used in exporting and navigationBindings).\n                 *\n                 * @private\n                 * @param {Highcharts.Chart} chart\n                 *        The chart instance.\n                 * @return {void}\n                 */\n                initUpdate: function (chart) {\n                    if (!chart.navigation) {\n                        chart.navigation = {\n                            updates: [],\n                            update: function (options,\n            redraw) {\n                                this.updates.forEach(function (updateConfig) {\n                                    updateConfig.update.call(updateConfig.context,\n            options,\n            redraw);\n                            });\n                        }\n                    };\n                }\n            },\n            /**\n             * Registers an `update()` method in the `chart.navigation` object.\n             *\n             * @private\n             * @param {Highcharts.ChartNavigationUpdateFunction} update\n             *        The `update()` method that will be called in `chart.update()`.\n             * @param {Highcharts.Chart} chart\n             *        The chart instance. `update()` will use that as a context\n             *        (`this`).\n             * @return {void}\n             */\n            addUpdate: function (update, chart) {\n                if (!chart.navigation) {\n                    this.initUpdate(chart);\n                }\n                chart.navigation.updates.push({\n                    update: update,\n                    context: chart\n                });\n            }\n        };\n\n        return chartNavigation;\n    });\n    _registerModule(_modules, 'modules/exporting.src.js', [_modules['parts/Chart.js'], _modules['mixins/navigation.js'], _modules['parts/Globals.js'], _modules['parts/Options.js'], _modules['parts/SVGRenderer.js'], _modules['parts/Utilities.js']], function (Chart, chartNavigationMixin, H, O, SVGRenderer, U) {\n        /* *\n         *\n         *  Exporting module\n         *\n         *  (c) 2010-2020 Torstein Honsi\n         *\n         *  License: www.highcharts.com/license\n         *\n         *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!\n         *\n         * */\n        var doc = H.doc,\n            isTouchDevice = H.isTouchDevice,\n            win = H.win;\n        var defaultOptions = O.defaultOptions;\n        var addEvent = U.addEvent,\n            css = U.css,\n            createElement = U.createElement,\n            discardElement = U.discardElement,\n            extend = U.extend,\n            find = U.find,\n            fireEvent = U.fireEvent,\n            isObject = U.isObject,\n            merge = U.merge,\n            objectEach = U.objectEach,\n            pick = U.pick,\n            removeEvent = U.removeEvent,\n            uniqueKey = U.uniqueKey;\n        /**\n         * Gets fired after a chart is printed through the context menu item or the\n         * Chart.print method.\n         *\n         * @callback Highcharts.ExportingAfterPrintCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Gets fired before a chart is printed through the context menu item or the\n         * Chart.print method.\n         *\n         * @callback Highcharts.ExportingBeforePrintCallbackFunction\n         *\n         * @param {Highcharts.Chart} chart\n         *        The chart on which the event occured.\n         *\n         * @param {global.Event} event\n         *        The event that occured.\n         */\n        /**\n         * Function to call if the offline-exporting module fails to export a chart on\n         * the client side.\n         *\n         * @callback Highcharts.ExportingErrorCallbackFunction\n         *\n         * @param {Highcharts.ExportingOptions} options\n         *        The exporting options.\n         *\n         * @param {global.Error} err\n         *        The error from the module.\n         */\n        /**\n         * Definition for a menu item in the context menu.\n         *\n         * @interface Highcharts.ExportingMenuObject\n         */ /**\n        * The text for the menu item.\n        *\n        * @name Highcharts.ExportingMenuObject#text\n        * @type {string|undefined}\n        */ /**\n        * If internationalization is required, the key to a language string.\n        *\n        * @name Highcharts.ExportingMenuObject#textKey\n        * @type {string|undefined}\n        */ /**\n        * The click handler for the menu item.\n        *\n        * @name Highcharts.ExportingMenuObject#onclick\n        * @type {Highcharts.EventCallbackFunction<Highcharts.Chart>|undefined}\n        */ /**\n        * Indicates a separator line instead of an item.\n        *\n        * @name Highcharts.ExportingMenuObject#separator\n        * @type {boolean|undefined}\n        */\n        /**\n         * Possible MIME types for exporting.\n         *\n         * @typedef {\"image/png\"|\"image/jpeg\"|\"application/pdf\"|\"image/svg+xml\"} Highcharts.ExportingMimeTypeValue\n         */\n        // create shortcuts\n        var userAgent = win.navigator.userAgent,\n            symbols = H.Renderer.prototype.symbols,\n            isMSBrowser = /Edge\\/|Trident\\/|MSIE /.test(userAgent),\n            isFirefoxBrowser = /firefox/i.test(userAgent);\n        // Add language\n        extend(defaultOptions.lang\n        /**\n         * @optionparent lang\n         */\n        , {\n            /**\n             * Exporting module only. The text for the menu item to view the chart\n             * in full screen.\n             *\n             * @since 8.0.1\n             *\n             * @private\n             */\n            viewFullscreen: 'View in full screen',\n            /**\n             * Exporting module only. The text for the menu item to exit the chart\n             * from full screen.\n             *\n             * @since 8.0.1\n             *\n             * @private\n             */\n            exitFullscreen: 'Exit from full screen',\n            /**\n             * Exporting module only. The text for the menu item to print the chart.\n             *\n             * @since    3.0.1\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            printChart: 'Print chart',\n            /**\n             * Exporting module only. The text for the PNG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadPNG: 'Download PNG image',\n            /**\n             * Exporting module only. The text for the JPEG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadJPEG: 'Download JPEG image',\n            /**\n             * Exporting module only. The text for the PDF download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadPDF: 'Download PDF document',\n            /**\n             * Exporting module only. The text for the SVG download menu item.\n             *\n             * @since    2.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            downloadSVG: 'Download SVG vector image',\n            /**\n             * Exporting module menu. The tooltip title for the context menu holding\n             * print and export menu items.\n             *\n             * @since    3.0\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            contextButtonTitle: 'Chart context menu'\n        });\n        if (!defaultOptions.navigation) {\n            // Buttons and menus are collected in a separate config option set called\n            // 'navigation'. This can be extended later to add control buttons like\n            // zoom and pan right click menus.\n            /**\n             * A collection of options for buttons and menus appearing in the exporting\n             * module.\n             *\n             * @requires     modules/exporting\n             * @optionparent navigation\n             */\n            defaultOptions.navigation = {};\n        }\n        merge(true, defaultOptions.navigation, {\n            /**\n             * @optionparent navigation.buttonOptions\n             *\n             * @private\n             */\n            buttonOptions: {\n                theme: {},\n                /**\n                 * Whether to enable buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-enabled/\n                 *         Exporting module loaded but buttons disabled\n                 *\n                 * @type      {boolean}\n                 * @default   true\n                 * @since     2.0\n                 * @apioption navigation.buttonOptions.enabled\n                 */\n                /**\n                 * The pixel size of the symbol on the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolSize: 14,\n                /**\n                 * The x position of the center of the symbol inside the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolX: 12.5,\n                /**\n                 * The y position of the center of the symbol inside the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolY: 10.5,\n                /**\n                 * Alignment for the buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-align/\n                 *         Center aligned\n                 *\n                 * @type  {Highcharts.AlignValue}\n                 * @since 2.0\n                 */\n                align: 'right',\n                /**\n                 * The pixel spacing between buttons.\n                 *\n                 * @since 2.0\n                 */\n                buttonSpacing: 3,\n                /**\n                 * Pixel height of the buttons.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                height: 22,\n                /**\n                 * A text string to add to the individual button.\n                 *\n                 * @sample highcharts/exporting/buttons-text/\n                 *         Full text button\n                 * @sample highcharts/exporting/buttons-text-symbol/\n                 *         Combined symbol and text\n                 *\n                 * @type      {string}\n                 * @default   null\n                 * @since     3.0\n                 * @apioption navigation.buttonOptions.text\n                 */\n                /**\n                 * The vertical offset of the button's position relative to its\n                 * `verticalAlign`.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-verticalalign/\n                 *         Buttons at lower right\n                 *\n                 * @type      {number}\n                 * @default   0\n                 * @since     2.0\n                 * @apioption navigation.buttonOptions.y\n                 */\n                /**\n                 * The vertical alignment of the buttons. Can be one of `\"top\"`,\n                 * `\"middle\"` or `\"bottom\"`.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-verticalalign/\n                 *         Buttons at lower right\n                 *\n                 * @type  {Highcharts.VerticalAlignValue}\n                 * @since 2.0\n                 */\n                verticalAlign: 'top',\n                /**\n                 * The pixel width of the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                width: 24\n            }\n        });\n        // Presentational attributes\n        merge(true, defaultOptions.navigation\n        /**\n         * A collection of options for buttons and menus appearing in the exporting\n         * module.\n         *\n         * @optionparent navigation\n         */\n        , {\n            /**\n             * CSS styles for the popup menu appearing by default when the export\n             * icon is clicked. This menu is rendered in HTML.\n             *\n             * @see In styled mode, the menu is styled with the `.highcharts-menu`\n             *      class.\n             *\n             * @sample highcharts/navigation/menustyle/\n             *         Light gray menu background\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"border\": \"1px solid #999999\", \"background\": \"#ffffff\", \"padding\": \"5px 0\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuStyle: {\n                /** @ignore-option */\n                border: '1px solid #999999',\n                /** @ignore-option */\n                background: '#ffffff',\n                /** @ignore-option */\n                padding: '5px 0'\n            },\n            /**\n             * CSS styles for the individual items within the popup menu appearing\n             * by default when the export icon is clicked. The menu items are\n             * rendered in HTML. Font size defaults to `11px` on desktop and `14px`\n             * on touch devices.\n             *\n             * @see In styled mode, the menu items are styled with the\n             *      `.highcharts-menu-item` class.\n             *\n             * @sample {highcharts} highcharts/navigation/menuitemstyle/\n             *         Add a grey stripe to the left\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"padding\": \"0.5em 1em\", \"color\": \"#333333\", \"background\": \"none\", \"fontSize\": \"11px/14px\", \"transition\": \"background 250ms, color 250ms\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuItemStyle: {\n                /** @ignore-option */\n                padding: '0.5em 1em',\n                /** @ignore-option */\n                color: '#333333',\n                /** @ignore-option */\n                background: 'none',\n                /** @ignore-option */\n                fontSize: isTouchDevice ? '14px' : '11px',\n                /** @ignore-option */\n                transition: 'background 250ms, color 250ms'\n            },\n            /**\n             * CSS styles for the hover state of the individual items within the\n             * popup menu appearing by default when the export icon is clicked. The\n             * menu items are rendered in HTML.\n             *\n             * @see In styled mode, the menu items are styled with the\n             *      `.highcharts-menu-item` class.\n             *\n             * @sample highcharts/navigation/menuitemhoverstyle/\n             *         Bold text on hover\n             *\n             * @type    {Highcharts.CSSObject}\n             * @default {\"background\": \"#335cad\", \"color\": \"#ffffff\"}\n             * @since   2.0\n             *\n             * @private\n             */\n            menuItemHoverStyle: {\n                /** @ignore-option */\n                background: '#335cad',\n                /** @ignore-option */\n                color: '#ffffff'\n            },\n            /**\n             * A collection of options for buttons appearing in the exporting\n             * module.\n             *\n             * In styled mode, the buttons are styled with the\n             * `.highcharts-contextbutton` and `.highcharts-button-symbol` classes.\n             *\n             * @requires modules/exporting\n             *\n             * @private\n             */\n            buttonOptions: {\n                /**\n                 * Fill color for the symbol within the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-symbolfill/\n                 *         Blue symbol stroke for one of the buttons\n                 *\n                 * @type  {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                 * @since 2.0\n                 */\n                symbolFill: '#666666',\n                /**\n                 * The color of the symbol's stroke or line.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-symbolstroke/\n                 *         Blue symbol stroke\n                 *\n                 * @type  {Highcharts.ColorString}\n                 * @since 2.0\n                 */\n                symbolStroke: '#666666',\n                /**\n                 * The pixel stroke width of the symbol on the button.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-height/\n                 *         Bigger buttons\n                 *\n                 * @since 2.0\n                 */\n                symbolStrokeWidth: 3,\n                /**\n                 * A configuration object for the button theme. The object accepts\n                 * SVG properties like `stroke-width`, `stroke` and `fill`.\n                 * Tri-state button styles are supported by the `states.hover` and\n                 * `states.select` objects.\n                 *\n                 * @sample highcharts/navigation/buttonoptions-theme/\n                 *         Theming the buttons\n                 *\n                 * @requires modules/exporting\n                 *\n                 * @since 3.0\n                 */\n                theme: {\n                    /**\n                     * The default fill exists only to capture hover events.\n                     *\n                     * @type      {Highcharts.ColorString|Highcharts.GradientColorObject|Highcharts.PatternObject}\n                     * @default   #ffffff\n                     * @apioption navigation.buttonOptions.theme.fill\n                     */\n                    /**\n                     * Default stroke for the buttons.\n                     * @type      {Highcharts.ColorString}\n                     * @default   none\n                     * @apioption navigation.buttonOptions.theme.stroke\n                     */\n                    /**\n                     * Padding for the button.\n                     */\n                    padding: 5\n                }\n            }\n        });\n        // Add the export related options\n        /**\n         * Options for the exporting module. For an overview on the matter, see\n         * [the docs](https://www.highcharts.com/docs/export-module/export-module-overview).\n         *\n         * @requires     modules/exporting\n         * @optionparent exporting\n         */\n        defaultOptions.exporting = {\n            /**\n             * Experimental setting to allow HTML inside the chart (added through\n             * the `useHTML` options), directly in the exported image. This allows\n             * you to preserve complicated HTML structures like tables or bi-directional\n             * text in exported charts.\n             *\n             * Disclaimer: The HTML is rendered in a `foreignObject` tag in the\n             * generated SVG. The official export server is based on PhantomJS,\n             * which supports this, but other SVG clients, like Batik, does not\n             * support it. This also applies to downloaded SVG that you want to\n             * open in a desktop client.\n             *\n             * @type      {boolean}\n             * @default   false\n             * @since     4.1.8\n             * @apioption exporting.allowHTML\n             */\n            /**\n             * Additional chart options to be merged into the chart before exporting to\n             * an image format. This does not apply to printing the chart via the export\n             * menu.\n             *\n             * For example, a common use case is to add data labels to improve\n             * readability of the exported chart, or to add a printer-friendly color\n             * scheme to exported PDFs.\n             *\n             * @sample {highcharts} highcharts/exporting/chartoptions-data-labels/\n             *         Added data labels\n             * @sample {highstock} highcharts/exporting/chartoptions-data-labels/\n             *         Added data labels\n             *\n             * @type      {Highcharts.Options}\n             * @apioption exporting.chartOptions\n             */\n            /**\n             * Whether to enable the exporting module. Disabling the module will\n             * hide the context button, but API methods will still be available.\n             *\n             * @sample {highcharts} highcharts/exporting/enabled-false/\n             *         Exporting module is loaded but disabled\n             * @sample {highstock} highcharts/exporting/enabled-false/\n             *         Exporting module is loaded but disabled\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     2.0\n             * @apioption exporting.enabled\n             */\n            /**\n             * Function to call if the offline-exporting module fails to export\n             * a chart on the client side, and [fallbackToExportServer](\n             * #exporting.fallbackToExportServer) is disabled. If left undefined, an\n             * exception is thrown instead. Receives two parameters, the exporting\n             * options, and the error from the module.\n             *\n             * @see [fallbackToExportServer](#exporting.fallbackToExportServer)\n             *\n             * @type      {Highcharts.ExportingErrorCallbackFunction}\n             * @since     5.0.0\n             * @requires  modules/exporting\n             * @requires  modules/offline-exporting\n             * @apioption exporting.error\n             */\n            /**\n             * Whether or not to fall back to the export server if the offline-exporting\n             * module is unable to export the chart on the client side. This happens for\n             * certain browsers, and certain features (e.g.\n             * [allowHTML](#exporting.allowHTML)), depending on the image type exporting\n             * to. For very complex charts, it is possible that export can fail in\n             * browsers that don't support Blob objects, due to data URL length limits.\n             * It is recommended to define the [exporting.error](#exporting.error)\n             * handler if disabling fallback, in order to notify users in case export\n             * fails.\n             *\n             * @type      {boolean}\n             * @default   true\n             * @since     4.1.8\n             * @requires  modules/exporting\n             * @requires  modules/offline-exporting\n             * @apioption exporting.fallbackToExportServer\n             */\n            /**\n             * The filename, without extension, to use for the exported chart.\n             *\n             * @sample {highcharts} highcharts/exporting/filename/\n             *         Custom file name\n             * @sample {highstock} highcharts/exporting/filename/\n             *         Custom file name\n             *\n             * @type      {string}\n             * @default   chart\n             * @since     2.0\n             * @apioption exporting.filename\n             */\n            /**\n             * An object containing additional key value data for the POST form that\n             * sends the SVG to the export server. For example, a `target` can be set to\n             * make sure the generated image is received in another frame, or a custom\n             * `enctype` or `encoding` can be set.\n             *\n             * @type      {Highcharts.HTMLAttributes}\n             * @since     3.0.8\n             * @apioption exporting.formAttributes\n             */\n            /**\n             * Path where Highcharts will look for export module dependencies to\n             * load on demand if they don't already exist on `window`. Should currently\n             * point to location of [CanVG](https://github.com/canvg/canvg) library,\n             * [RGBColor.js](https://github.com/canvg/canvg),\n             * [jsPDF](https://github.com/yWorks/jsPDF) and\n             * [svg2pdf.js](https://github.com/yWorks/svg2pdf.js), required for client\n             * side export in certain browsers.\n             *\n             * @type      {string}\n             * @default   https://code.highcharts.com/{version}/lib\n             * @since     5.0.0\n             * @apioption exporting.libURL\n             */\n            /**\n             * Analogous to [sourceWidth](#exporting.sourceWidth).\n             *\n             * @type      {number}\n             * @since     3.0\n             * @apioption exporting.sourceHeight\n             */\n            /**\n             * The width of the original chart when exported, unless an explicit\n             * [chart.width](#chart.width) is set, or a pixel width is set on the\n             * container. The width exported raster image is then multiplied by\n             * [scale](#exporting.scale).\n             *\n             * @sample {highcharts} highcharts/exporting/sourcewidth/\n             *         Source size demo\n             * @sample {highstock} highcharts/exporting/sourcewidth/\n             *         Source size demo\n             * @sample {highmaps} maps/exporting/sourcewidth/\n             *         Source size demo\n             *\n             * @type      {number}\n             * @since     3.0\n             * @apioption exporting.sourceWidth\n             */\n            /**\n             * The pixel width of charts exported to PNG or JPG. As of Highcharts\n             * 3.0, the default pixel width is a function of the [chart.width](\n             * #chart.width) or [exporting.sourceWidth](#exporting.sourceWidth) and the\n             * [exporting.scale](#exporting.scale).\n             *\n             * @sample {highcharts} highcharts/exporting/width/\n             *         Export to 200px wide images\n             * @sample {highstock} highcharts/exporting/width/\n             *         Export to 200px wide images\n             *\n             * @type      {number}\n             * @since     2.0\n             * @apioption exporting.width\n             */\n            /**\n             * Default MIME type for exporting if `chart.exportChart()` is called\n             * without specifying a `type` option. Possible values are `image/png`,\n             *  `image/jpeg`, `application/pdf` and `image/svg+xml`.\n             *\n             * @type  {Highcharts.ExportingMimeTypeValue}\n             * @since 2.0\n             */\n            type: 'image/png',\n            /**\n             * The URL for the server module converting the SVG string to an image\n             * format. By default this points to Highchart's free web service.\n             *\n             * @since 2.0\n             */\n            url: 'https://export.highcharts.com/',\n            /**\n             * When printing the chart from the menu item in the burger menu, if\n             * the on-screen chart exceeds this width, it is resized. After printing\n             * or cancelled, it is restored. The default width makes the chart\n             * fit into typical paper format. Note that this does not affect the\n             * chart when printing the web page as a whole.\n             *\n             * @since 4.2.5\n             */\n            printMaxWidth: 780,\n            /**\n             * Defines the scale or zoom factor for the exported image compared\n             * to the on-screen display. While for instance a 600px wide chart\n             * may look good on a website, it will look bad in print. The default\n             * scale of 2 makes this chart export to a 1200px PNG or JPG.\n             *\n             * @see [chart.width](#chart.width)\n             * @see [exporting.sourceWidth](#exporting.sourceWidth)\n             *\n             * @sample {highcharts} highcharts/exporting/scale/\n             *         Scale demonstrated\n             * @sample {highstock} highcharts/exporting/scale/\n             *         Scale demonstrated\n             * @sample {highmaps} maps/exporting/scale/\n             *         Scale demonstrated\n             *\n             * @since 3.0\n             */\n            scale: 2,\n            /**\n             * Options for the export related buttons, print and export. In addition\n             * to the default buttons listed here, custom buttons can be added.\n             * See [navigation.buttonOptions](#navigation.buttonOptions) for general\n             * options.\n             *\n             * @type     {Highcharts.Dictionary<*>}\n             * @requires modules/exporting\n             */\n            buttons: {\n                /**\n                 * Options for the export button.\n                 *\n                 * In styled mode, export button styles can be applied with the\n                 * `.highcharts-contextbutton` class.\n                 *\n                 * @declare  Highcharts.ExportingButtonsOptionsObject\n                 * @extends  navigation.buttonOptions\n                 * @requires modules/exporting\n                 */\n                contextButton: {\n                    /**\n                     * A click handler callback to use on the button directly instead of\n                     * the popup menu.\n                     *\n                     * @sample highcharts/exporting/buttons-contextbutton-onclick/\n                     *         Skip the menu and export the chart directly\n                     *\n                     * @type      {Function}\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.onclick\n                     */\n                    /**\n                     * See [navigation.buttonOptions.symbolFill](\n                     * #navigation.buttonOptions.symbolFill).\n                     *\n                     * @type      {Highcharts.ColorString}\n                     * @default   #666666\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.symbolFill\n                     */\n                    /**\n                     * The horizontal position of the button relative to the `align`\n                     * option.\n                     *\n                     * @type      {number}\n                     * @default   -10\n                     * @since     2.0\n                     * @apioption exporting.buttons.contextButton.x\n                     */\n                    /**\n                     * The class name of the context button.\n                     */\n                    className: 'highcharts-contextbutton',\n                    /**\n                     * The class name of the menu appearing from the button.\n                     */\n                    menuClassName: 'highcharts-contextmenu',\n                    /**\n                     * The symbol for the button. Points to a definition function in\n                     * the `Highcharts.Renderer.symbols` collection. The default\n                     * `exportIcon` function is part of the exporting module. Possible\n                     * values are \"circle\", \"square\", \"diamond\", \"triangle\",\n                     * \"triangle-down\", \"menu\", \"menuball\" or custom shape.\n                     *\n                     * @sample highcharts/exporting/buttons-contextbutton-symbol/\n                     *         Use a circle for symbol\n                     * @sample highcharts/exporting/buttons-contextbutton-symbol-custom/\n                     *         Custom shape as symbol\n                     *\n                     * @type  {Highcharts.SymbolKeyValue|\"exportIcon\"|\"menu\"|\"menuball\"|string}\n                     * @since 2.0\n                     */\n                    symbol: 'menu',\n                    /**\n                     * The key to a [lang](#lang) option setting that is used for the\n                     * button's title tooltip. When the key is `contextButtonTitle`, it\n                     * refers to [lang.contextButtonTitle](#lang.contextButtonTitle)\n                     * that defaults to \"Chart context menu\".\n                     *\n                     * @since 6.1.4\n                     */\n                    titleKey: 'contextButtonTitle',\n                    /**\n                     * This option is deprecated, use\n                     * [titleKey](#exporting.buttons.contextButton.titleKey) instead.\n                     *\n                     * @deprecated\n                     * @type      {string}\n                     * @apioption exporting.buttons.contextButton._titleKey\n                     */\n                    /**\n                     * A collection of strings pointing to config options for the menu\n                     * items. The config options are defined in the\n                     * `menuItemDefinitions` option.\n                     *\n                     * By default, there is the \"View in full screen\" and \"Print\" menu\n                     * items, plus one menu item for each of the available export types.\n                     *\n                     * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n                     *         Menu item definitions\n                     *\n                     * @type    {Array<string>}\n                     * @default [\"viewFullscreen\", \"printChart\", \"separator\", \"downloadPNG\", \"downloadJPEG\", \"downloadPDF\", \"downloadSVG\"]\n                     * @since   2.0\n                     */\n                    menuItems: [\n                        'viewFullscreen',\n                        'printChart',\n                        'separator',\n                        'downloadPNG',\n                        'downloadJPEG',\n                        'downloadPDF',\n                        'downloadSVG'\n                    ]\n                }\n            },\n            /**\n             * An object consisting of definitions for the menu items in the context\n             * menu. Each key value pair has a `key` that is referenced in the\n             * [menuItems](#exporting.buttons.contextButton.menuItems) setting,\n             * and a `value`, which is an object with the following properties:\n             *\n             * - **onclick:** The click handler for the menu item\n             *\n             * - **text:** The text for the menu item\n             *\n             * - **textKey:** If internationalization is required, the key to a language\n             *   string\n             *\n             * Custom text for the \"exitFullScreen\" can be set only in lang options\n             * (it is not a separate button).\n             *\n             * @sample {highcharts} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highstock} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             * @sample {highmaps} highcharts/exporting/menuitemdefinitions/\n             *         Menu item definitions\n             *\n             *\n             * @type    {Highcharts.Dictionary<Highcharts.ExportingMenuObject>}\n             * @default {\"viewFullscreen\": {}, \"printChart\": {}, \"separator\": {}, \"downloadPNG\": {}, \"downloadJPEG\": {}, \"downloadPDF\": {}, \"downloadSVG\": {}}\n             * @since   5.0.13\n             */\n            menuItemDefinitions: {\n                /**\n                 * @ignore\n                 */\n                viewFullscreen: {\n                    textKey: 'viewFullscreen',\n                    onclick: function () {\n                        this.fullscreen.toggle();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                printChart: {\n                    textKey: 'printChart',\n                    onclick: function () {\n                        this.print();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                separator: {\n                    separator: true\n                },\n                /**\n                 * @ignore\n                 */\n                downloadPNG: {\n                    textKey: 'downloadPNG',\n                    onclick: function () {\n                        this.exportChart();\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadJPEG: {\n                    textKey: 'downloadJPEG',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'image/jpeg'\n                        });\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadPDF: {\n                    textKey: 'downloadPDF',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'application/pdf'\n                        });\n                    }\n                },\n                /**\n                 * @ignore\n                 */\n                downloadSVG: {\n                    textKey: 'downloadSVG',\n                    onclick: function () {\n                        this.exportChart({\n                            type: 'image/svg+xml'\n                        });\n                    }\n                }\n            }\n        };\n        /**\n         * Fires after a chart is printed through the context menu item or the\n         * `Chart.print` method.\n         *\n         * @sample highcharts/chart/events-beforeprint-afterprint/\n         *         Rescale the chart to print\n         *\n         * @type      {Highcharts.ExportingAfterPrintCallbackFunction}\n         * @since     4.1.0\n         * @context   Highcharts.Chart\n         * @requires  modules/exporting\n         * @apioption chart.events.afterPrint\n         */\n        /**\n         * Fires before a chart is printed through the context menu item or\n         * the `Chart.print` method.\n         *\n         * @sample highcharts/chart/events-beforeprint-afterprint/\n         *         Rescale the chart to print\n         *\n         * @type      {Highcharts.ExportingBeforePrintCallbackFunction}\n         * @since     4.1.0\n         * @context   Highcharts.Chart\n         * @requires  modules/exporting\n         * @apioption chart.events.beforePrint\n         */\n        /**\n         * The post utility\n         *\n         * @private\n         * @function Highcharts.post\n         * @param {string} url\n         *        Post URL\n         * @param {object} data\n         *        Post data\n         * @param {Highcharts.Dictionary<string>} [formAttributes]\n         *        Additional attributes for the post request\n         * @return {void}\n         */\n        H.post = function (url, data, formAttributes) {\n            // create the form\n            var form = createElement('form',\n                merge({\n                    method: 'post',\n                    action: url,\n                    enctype: 'multipart/form-data'\n                },\n                formAttributes), {\n                    display: 'none'\n                },\n                doc.body);\n            // add the data\n            objectEach(data, function (val, name) {\n                createElement('input', {\n                    type: 'hidden',\n                    name: name,\n                    value: val\n                }, null, form);\n            });\n            // submit\n            form.submit();\n            // clean up\n            discardElement(form);\n        };\n        if (H.isSafari) {\n            H.win.matchMedia('print').addListener(function (mqlEvent) {\n                if (!H.printingChart) {\n                    return void 0;\n                }\n                if (mqlEvent.matches) {\n                    H.printingChart.beforePrint();\n                }\n                else {\n                    H.printingChart.afterPrint();\n                }\n            });\n        }\n        extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n            /* eslint-disable no-invalid-this, valid-jsdoc */\n            /**\n             * Exporting module only. A collection of fixes on the produced SVG to\n             * account for expando properties, browser bugs, VML problems and other.\n             * Returns a cleaned SVG.\n             *\n             * @private\n             * @function Highcharts.Chart#sanitizeSVG\n             * @param {string} svg\n             *        SVG code to sanitize\n             * @param {Highcharts.Options} options\n             *        Chart options to apply\n             * @return {string}\n             *         Sanitized SVG code\n             * @requires modules/exporting\n             */\n            sanitizeSVG: function (svg, options) {\n                var split = svg.indexOf('</svg>') + 6,\n                    html = svg.substr(split);\n                // Remove any HTML added to the container after the SVG (#894, #9087)\n                svg = svg.substr(0, split);\n                // Move HTML into a foreignObject\n                if (options && options.exporting && options.exporting.allowHTML) {\n                    if (html) {\n                        html = '<foreignObject x=\"0\" y=\"0\" ' +\n                            'width=\"' + options.chart.width + '\" ' +\n                            'height=\"' + options.chart.height + '\">' +\n                            '<body xmlns=\"http://www.w3.org/1999/xhtml\">' +\n                            html +\n                            '</body>' +\n                            '</foreignObject>';\n                        svg = svg.replace('</svg>', html + '</svg>');\n                    }\n                }\n                svg = svg\n                    .replace(/zIndex=\"[^\"]+\"/g, '')\n                    .replace(/symbolName=\"[^\"]+\"/g, '')\n                    .replace(/jQuery[0-9]+=\"[^\"]+\"/g, '')\n                    .replace(/url\\((\"|&quot;)(.*?)(\"|&quot;)\\;?\\)/g, 'url($2)')\n                    .replace(/url\\([^#]+#/g, 'url(#')\n                    .replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n                    .replace(/ (|NS[0-9]+\\:)href=/g, ' xlink:href=') // #3567\n                    .replace(/\\n/, ' ')\n                    // Batik doesn't support rgba fills and strokes (#3095)\n                    .replace(/(fill|stroke)=\"rgba\\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\\.]+)\\)\"/g, // eslint-disable-line max-len\n                '$1=\"rgb($2)\" $1-opacity=\"$3\"')\n                    // Replace HTML entities, issue #347\n                    .replace(/&nbsp;/g, '\\u00A0') // no-break space\n                    .replace(/&shy;/g, '\\u00AD'); // soft hyphen\n                // Further sanitize for oldIE\n                if (this.ieSanitizeSVG) {\n                    svg = this.ieSanitizeSVG(svg);\n                }\n                return svg;\n            },\n            /**\n             * Return the unfiltered innerHTML of the chart container. Used as hook for\n             * plugins. In styled mode, it also takes care of inlining CSS style rules.\n             *\n             * @see Chart#getSVG\n             *\n             * @function Highcharts.Chart#getChartHTML\n             *\n             * @returns {string}\n             *          The unfiltered SVG of the chart.\n             *\n             * @requires modules/exporting\n             */\n            getChartHTML: function () {\n                if (this.styledMode) {\n                    this.inlineStyles();\n                }\n                return this.container.innerHTML;\n            },\n            /**\n             * Return an SVG representation of the chart.\n             *\n             * @sample highcharts/members/chart-getsvg/\n             *         View the SVG from a button\n             *\n             * @function Highcharts.Chart#getSVG\n             *\n             * @param {Highcharts.Options} [chartOptions]\n             *        Additional chart options for the generated SVG representation. For\n             *        collections like `xAxis`, `yAxis` or `series`, the additional\n             *        options is either merged in to the original item of the same\n             *        `id`, or to the first item if a common id is not found.\n             *\n             * @return {string}\n             *         The SVG representation of the rendered chart.\n             *\n             * @fires Highcharts.Chart#event:getSVG\n             *\n             * @requires modules/exporting\n             */\n            getSVG: function (chartOptions) {\n                var chart = this,\n                    chartCopy,\n                    sandbox,\n                    svg,\n                    seriesOptions,\n                    sourceWidth,\n                    sourceHeight,\n                    cssWidth,\n                    cssHeight, \n                    // Copy the options and add extra options\n                    options = merge(chart.options,\n                    chartOptions);\n                // Use userOptions to make the options chain in series right (#3881)\n                options.plotOptions = merge(chart.userOptions.plotOptions, chartOptions && chartOptions.plotOptions);\n                // ... and likewise with time, avoid that undefined time properties are\n                // merged over legacy global time options\n                options.time = merge(chart.userOptions.time, chartOptions && chartOptions.time);\n                // create a sandbox where a new chart will be generated\n                sandbox = createElement('div', null, {\n                    position: 'absolute',\n                    top: '-9999em',\n                    width: chart.chartWidth + 'px',\n                    height: chart.chartHeight + 'px'\n                }, doc.body);\n                // get the source size\n                cssWidth = chart.renderTo.style.width;\n                cssHeight = chart.renderTo.style.height;\n                sourceWidth = options.exporting.sourceWidth ||\n                    options.chart.width ||\n                    (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n                    (options.isGantt ? 800 : 600);\n                sourceHeight = options.exporting.sourceHeight ||\n                    options.chart.height ||\n                    (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n                    400;\n                // override some options\n                extend(options.chart, {\n                    animation: false,\n                    renderTo: sandbox,\n                    forExport: true,\n                    renderer: 'SVGRenderer',\n                    width: sourceWidth,\n                    height: sourceHeight\n                });\n                options.exporting.enabled = false; // hide buttons in print\n                delete options.data; // #3004\n                // prepare for replicating the chart\n                options.series = [];\n                chart.series.forEach(function (serie) {\n                    seriesOptions = merge(serie.userOptions, {\n                        animation: false,\n                        enableMouseTracking: false,\n                        showCheckbox: false,\n                        visible: serie.visible\n                    });\n                    // Used for the navigator series that has its own option set\n                    if (!seriesOptions.isInternal) {\n                        options.series.push(seriesOptions);\n                    }\n                });\n                // Assign an internal key to ensure a one-to-one mapping (#5924)\n                chart.axes.forEach(function (axis) {\n                    if (!axis.userOptions.internalKey) { // #6444\n                        axis.userOptions.internalKey = uniqueKey();\n                    }\n                });\n                // generate the chart copy\n                chartCopy = new H.Chart(options, chart.callback);\n                // Axis options and series options  (#2022, #3900, #5982)\n                if (chartOptions) {\n                    ['xAxis', 'yAxis', 'series'].forEach(function (coll) {\n                        var collOptions = {};\n                        if (chartOptions[coll]) {\n                            collOptions[coll] = chartOptions[coll];\n                            chartCopy.update(collOptions);\n                        }\n                    });\n                }\n                // Reflect axis extremes in the export (#5924)\n                chart.axes.forEach(function (axis) {\n                    var axisCopy = find(chartCopy.axes,\n                        function (copy) {\n                            return copy.options.internalKey ===\n                                axis.userOptions.internalKey;\n                    }), extremes = axis.getExtremes(), userMin = extremes.userMin, userMax = extremes.userMax;\n                    if (axisCopy &&\n                        ((typeof userMin !== 'undefined' &&\n                            userMin !== axisCopy.min) || (typeof userMax !== 'undefined' &&\n                            userMax !== axisCopy.max))) {\n                        axisCopy.setExtremes(userMin, userMax, true, false);\n                    }\n                });\n                // Get the SVG from the container's innerHTML\n                svg = chartCopy.getChartHTML();\n                fireEvent(this, 'getSVG', { chartCopy: chartCopy });\n                svg = chart.sanitizeSVG(svg, options);\n                // free up memory\n                options = null;\n                chartCopy.destroy();\n                discardElement(sandbox);\n                return svg;\n            },\n            /**\n             * @private\n             * @function Highcharts.Chart#getSVGForExport\n             * @param {Highcharts.ExportingOptions} options\n             * @param {Highcharts.Options} chartOptions\n             * @return {string}\n             * @requires modules/exporting\n             */\n            getSVGForExport: function (options, chartOptions) {\n                var chartExportingOptions = this.options.exporting;\n                return this.getSVG(merge({ chart: { borderRadius: 0 } }, chartExportingOptions.chartOptions, chartOptions, {\n                    exporting: {\n                        sourceWidth: ((options && options.sourceWidth) ||\n                            chartExportingOptions.sourceWidth),\n                        sourceHeight: ((options && options.sourceHeight) ||\n                            chartExportingOptions.sourceHeight)\n                    }\n                }));\n            },\n            /**\n             * Get the default file name used for exported charts. By default it creates\n             * a file name based on the chart title.\n             *\n             * @function Highcharts.Chart#getFilename\n             *\n             * @return {string} A file name without extension.\n             *\n             * @requires modules/exporting\n             */\n            getFilename: function () {\n                var s = this.userOptions.title && this.userOptions.title.text,\n                    filename = this.options.exporting.filename;\n                if (filename) {\n                    return filename.replace(/\\//g, '-');\n                }\n                if (typeof s === 'string') {\n                    filename = s\n                        .toLowerCase()\n                        .replace(/<\\/?[^>]+(>|$)/g, '') // strip HTML tags\n                        .replace(/[\\s_]+/g, '-')\n                        .replace(/[^a-z0-9\\-]/g, '') // preserve only latin\n                        .replace(/^[\\-]+/g, '') // dashes in the start\n                        .replace(/[\\-]+/g, '-') // dashes in a row\n                        .substr(0, 24)\n                        .replace(/[\\-]+$/g, ''); // dashes in the end;\n                }\n                if (!filename || filename.length < 5) {\n                    filename = 'chart';\n                }\n                return filename;\n            },\n            /**\n             * Exporting module required. Submit an SVG version of the chart to a server\n             * along with some parameters for conversion.\n             *\n             * @sample highcharts/members/chart-exportchart/\n             *         Export with no options\n             * @sample highcharts/members/chart-exportchart-filename/\n             *         PDF type and custom filename\n             * @sample highcharts/members/chart-exportchart-custom-background/\n             *         Different chart background in export\n             * @sample stock/members/chart-exportchart/\n             *         Export with Highstock\n             *\n             * @function Highcharts.Chart#exportChart\n             *\n             * @param {Highcharts.ExportingOptions} exportingOptions\n             *        Exporting options in addition to those defined in\n             *        [exporting](https://api.highcharts.com/highcharts/exporting).\n             *\n             * @param {Highcharts.Options} chartOptions\n             *        Additional chart options for the exported chart. For example a\n             *        different background color can be added here, or `dataLabels` for\n             *        export only.\n             *\n             * @return {void}\n             *\n             * @requires modules/exporting\n             */\n            exportChart: function (exportingOptions, chartOptions) {\n                var svg = this.getSVGForExport(exportingOptions,\n                    chartOptions);\n                // merge the options\n                exportingOptions = merge(this.options.exporting, exportingOptions);\n                // do the post\n                H.post(exportingOptions.url, {\n                    filename: exportingOptions.filename ? exportingOptions.filename.replace(/\\//g, '-') : this.getFilename(),\n                    type: exportingOptions.type,\n                    // IE8 fails to post undefined correctly, so use 0\n                    width: exportingOptions.width || 0,\n                    scale: exportingOptions.scale,\n                    svg: svg\n                }, exportingOptions.formAttributes);\n            },\n            /**\n            * Move the chart container(s) to another div.\n            *\n            * @function Highcharts#moveContainers\n            *\n            * @private\n            *\n            * @param {Highcharts.HTMLDOMElement} moveTo\n            *        Move target\n            * @return {void}\n            */\n            moveContainers: function (moveTo) {\n                var chart = this;\n                (chart.fixedDiv ? // When scrollablePlotArea is active (#9533)\n                    [chart.fixedDiv, chart.scrollingContainer] :\n                    [chart.container]).forEach(function (div) {\n                    moveTo.appendChild(div);\n                });\n            },\n            /**\n            * Prepare chart and document before printing a chart.\n            *\n            * @function Highcharts#beforePrint\n            *\n            * @private\n            *\n            * @return {void}\n            *\n            * @fires Highcharts.Chart#event:beforePrint\n            */\n            beforePrint: function () {\n                var chart = this,\n                    body = doc.body,\n                    printMaxWidth = chart.options.exporting.printMaxWidth,\n                    printReverseInfo = {\n                        childNodes: body.childNodes,\n                        origDisplay: [],\n                        resetParams: void 0\n                    };\n                var handleMaxWidth;\n                chart.isPrinting = true;\n                chart.pointer.reset(null, 0);\n                fireEvent(chart, 'beforePrint');\n                // Handle printMaxWidth\n                handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;\n                if (handleMaxWidth) {\n                    printReverseInfo.resetParams = [\n                        chart.options.chart.width,\n                        void 0,\n                        false\n                    ];\n                    chart.setSize(printMaxWidth, void 0, false);\n                }\n                // hide all body content\n                [].forEach.call(printReverseInfo.childNodes, function (node, i) {\n                    if (node.nodeType === 1) {\n                        printReverseInfo.origDisplay[i] = node.style.display;\n                        node.style.display = 'none';\n                    }\n                });\n                // pull out the chart\n                chart.moveContainers(body);\n                // Storage details for undo action after printing\n                chart.printReverseInfo = printReverseInfo;\n            },\n            /**\n            * Clena up after printing a chart.\n            *\n            * @function Highcharts#afterPrint\n            *\n            * @private\n            *\n            * @param {Highcharts.Chart} chart\n            *        Chart that was (or suppose to be) printed\n            * @return {void}\n            *\n            * @fires Highcharts.Chart#event:afterPrint\n            */\n            afterPrint: function () {\n                var chart = this;\n                if (!chart.printReverseInfo) {\n                    return void 0;\n                }\n                var childNodes = chart.printReverseInfo.childNodes,\n                    origDisplay = chart.printReverseInfo.origDisplay,\n                    resetParams = chart.printReverseInfo.resetParams;\n                // put the chart back in\n                chart.moveContainers(chart.renderTo);\n                // restore all body content\n                [].forEach.call(childNodes, function (node, i) {\n                    if (node.nodeType === 1) {\n                        node.style.display = (origDisplay[i] || '');\n                    }\n                });\n                chart.isPrinting = false;\n                // Reset printMaxWidth\n                if (resetParams) {\n                    chart.setSize.apply(chart, resetParams);\n                }\n                delete chart.printReverseInfo;\n                delete H.printingChart;\n                fireEvent(chart, 'afterPrint');\n            },\n            /**\n             * Exporting module required. Clears away other elements in the page and\n             * prints the chart as it is displayed. By default, when the exporting\n             * module is enabled, a context button with a drop down menu in the upper\n             * right corner accesses this function.\n             *\n             * @sample highcharts/members/chart-print/\n             *         Print from a HTML button\n             *\n             * @function Highcharts.Chart#print\n             *\n             * @return {void}\n             *\n             * @fires Highcharts.Chart#event:beforePrint\n             * @fires Highcharts.Chart#event:afterPrint\n             *\n             * @requires modules/exporting\n             */\n            print: function () {\n                var chart = this;\n                if (chart.isPrinting) { // block the button while in printing mode\n                    return;\n                }\n                H.printingChart = chart;\n                if (!H.isSafari) {\n                    chart.beforePrint();\n                }\n                // Give the browser time to draw WebGL content, an issue that randomly\n                // appears (at least) in Chrome ~67 on the Mac (#8708).\n                setTimeout(function () {\n                    win.focus(); // #1510\n                    win.print();\n                    // allow the browser to prepare before reverting\n                    if (!H.isSafari) {\n                        setTimeout(function () {\n                            chart.afterPrint();\n                        }, 1000);\n                    }\n                }, 1);\n            },\n            /**\n             * Display a popup menu for choosing the export type.\n             *\n             * @private\n             * @function Highcharts.Chart#contextMenu\n             * @param {string} className\n             *        An identifier for the menu.\n             * @param {Array<string|Highcharts.ExportingMenuObject>} items\n             *        A collection with text and onclicks for the items.\n             * @param {number} x\n             *        The x position of the opener button\n             * @param {number} y\n             *        The y position of the opener button\n             * @param {number} width\n             *        The width of the opener button\n             * @param {number} height\n             *        The height of the opener button\n             * @return {void}\n             * @requires modules/exporting\n             */\n            contextMenu: function (className, items, x, y, width, height, button) {\n                var chart = this,\n                    navOptions = chart.options.navigation,\n                    chartWidth = chart.chartWidth,\n                    chartHeight = chart.chartHeight,\n                    cacheName = 'cache-' + className,\n                    menu = chart[cacheName],\n                    menuPadding = Math.max(width,\n                    height), // for mouse leave detection\n                    innerMenu,\n                    menuStyle;\n                // create the menu only the first time\n                if (!menu) {\n                    // create a HTML element above the SVG\n                    chart.exportContextMenu = chart[cacheName] = menu =\n                        createElement('div', {\n                            className: className\n                        }, {\n                            position: 'absolute',\n                            zIndex: 1000,\n                            padding: menuPadding + 'px',\n                            pointerEvents: 'auto'\n                        }, chart.fixedDiv || chart.container);\n                    innerMenu = createElement('ul', { className: 'highcharts-menu' }, {\n                        listStyle: 'none',\n                        margin: 0,\n                        padding: 0\n                    }, menu);\n                    // Presentational CSS\n                    if (!chart.styledMode) {\n                        css(innerMenu, extend({\n                            MozBoxShadow: '3px 3px 10px #888',\n                            WebkitBoxShadow: '3px 3px 10px #888',\n                            boxShadow: '3px 3px 10px #888'\n                        }, navOptions.menuStyle));\n                    }\n                    // hide on mouse out\n                    menu.hideMenu = function () {\n                        css(menu, { display: 'none' });\n                        if (button) {\n                            button.setState(0);\n                        }\n                        chart.openMenu = false;\n                        css(chart.renderTo, { overflow: 'hidden' }); // #10361\n                        U.clearTimeout(menu.hideTimer);\n                        fireEvent(chart, 'exportMenuHidden');\n                    };\n                    // Hide the menu some time after mouse leave (#1357)\n                    chart.exportEvents.push(addEvent(menu, 'mouseleave', function () {\n                        menu.hideTimer = win.setTimeout(menu.hideMenu, 500);\n                    }), addEvent(menu, 'mouseenter', function () {\n                        U.clearTimeout(menu.hideTimer);\n                    }), \n                    // Hide it on clicking or touching outside the menu (#2258,\n                    // #2335, #2407)\n                    addEvent(doc, 'mouseup', function (e) {\n                        if (!chart.pointer.inClass(e.target, className)) {\n                            menu.hideMenu();\n                        }\n                    }), addEvent(menu, 'click', function () {\n                        if (chart.openMenu) {\n                            menu.hideMenu();\n                        }\n                    }));\n                    // create the items\n                    items.forEach(function (item) {\n                        if (typeof item === 'string') {\n                            item = chart.options.exporting\n                                .menuItemDefinitions[item];\n                        }\n                        if (isObject(item, true)) {\n                            var element;\n                            if (item.separator) {\n                                element = createElement('hr', null, null, innerMenu);\n                            }\n                            else {\n                                element = createElement('li', {\n                                    className: 'highcharts-menu-item',\n                                    onclick: function (e) {\n                                        if (e) { // IE7\n                                            e.stopPropagation();\n                                        }\n                                        menu.hideMenu();\n                                        if (item.onclick) {\n                                            item.onclick\n                                                .apply(chart, arguments);\n                                        }\n                                    },\n                                    innerHTML: (item.text ||\n                                        chart.options.lang[item.textKey])\n                                }, null, innerMenu);\n                                if (!chart.styledMode) {\n                                    element.onmouseover = function () {\n                                        css(this, navOptions.menuItemHoverStyle);\n                                    };\n                                    element.onmouseout = function () {\n                                        css(this, navOptions.menuItemStyle);\n                                    };\n                                    css(element, extend({\n                                        cursor: 'pointer'\n                                    }, navOptions.menuItemStyle));\n                                }\n                            }\n                            // Keep references to menu divs to be able to destroy them\n                            chart.exportDivElements.push(element);\n                        }\n                    });\n                    // Keep references to menu and innerMenu div to be able to destroy\n                    // them\n                    chart.exportDivElements.push(innerMenu, menu);\n                    chart.exportMenuWidth = menu.offsetWidth;\n                    chart.exportMenuHeight = menu.offsetHeight;\n                }\n                menuStyle = { display: 'block' };\n                // if outside right, right align it\n                if (x + chart.exportMenuWidth > chartWidth) {\n                    menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';\n                }\n                else {\n                    menuStyle.left = (x - menuPadding) + 'px';\n                }\n                // if outside bottom, bottom align it\n                if (y + height + chart.exportMenuHeight > chartHeight &&\n                    button.alignOptions.verticalAlign !== 'top') {\n                    menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';\n                }\n                else {\n                    menuStyle.top = (y + height - menuPadding) + 'px';\n                }\n                css(menu, menuStyle);\n                css(chart.renderTo, { overflow: '' }); // #10361\n                chart.openMenu = true;\n                fireEvent(chart, 'exportMenuShown');\n            },\n            /**\n             * Add the export button to the chart, with options.\n             *\n             * @private\n             * @function Highcharts.Chart#addButton\n             * @param {Highcharts.NavigationButtonOptions} options\n             * @return {void}\n             * @requires modules/exporting\n             */\n            addButton: function (options) {\n                var chart = this,\n                    renderer = chart.renderer,\n                    btnOptions = merge(chart.options.navigation.buttonOptions,\n                    options),\n                    onclick = btnOptions.onclick,\n                    menuItems = btnOptions.menuItems,\n                    symbol,\n                    button,\n                    symbolSize = btnOptions.symbolSize || 12;\n                if (!chart.btnCount) {\n                    chart.btnCount = 0;\n                }\n                // Keeps references to the button elements\n                if (!chart.exportDivElements) {\n                    chart.exportDivElements = [];\n                    chart.exportSVGElements = [];\n                }\n                if (btnOptions.enabled === false) {\n                    return;\n                }\n                var attr = btnOptions.theme,\n                    states = attr.states,\n                    hover = states && states.hover,\n                    select = states && states.select,\n                    callback;\n                if (!chart.styledMode) {\n                    attr.fill = pick(attr.fill, '#ffffff');\n                    attr.stroke = pick(attr.stroke, 'none');\n                }\n                delete attr.states;\n                if (onclick) {\n                    callback = function (e) {\n                        if (e) {\n                            e.stopPropagation();\n                        }\n                        onclick.call(chart, e);\n                    };\n                }\n                else if (menuItems) {\n                    callback = function (e) {\n                        // consistent with onclick call (#3495)\n                        if (e) {\n                            e.stopPropagation();\n                        }\n                        chart.contextMenu(button.menuClassName, menuItems, button.translateX, button.translateY, button.width, button.height, button);\n                        button.setState(2);\n                    };\n                }\n                if (btnOptions.text && btnOptions.symbol) {\n                    attr.paddingLeft = pick(attr.paddingLeft, 25);\n                }\n                else if (!btnOptions.text) {\n                    extend(attr, {\n                        width: btnOptions.width,\n                        height: btnOptions.height,\n                        padding: 0\n                    });\n                }\n                if (!chart.styledMode) {\n                    attr['stroke-linecap'] = 'round';\n                    attr.fill = pick(attr.fill, '#ffffff');\n                    attr.stroke = pick(attr.stroke, 'none');\n                }\n                button = renderer\n                    .button(btnOptions.text, 0, 0, callback, attr, hover, select)\n                    .addClass(options.className)\n                    .attr({\n                    title: pick(chart.options.lang[btnOptions._titleKey || btnOptions.titleKey], '')\n                });\n                button.menuClassName = (options.menuClassName ||\n                    'highcharts-menu-' + chart.btnCount++);\n                if (btnOptions.symbol) {\n                    symbol = renderer\n                        .symbol(btnOptions.symbol, btnOptions.symbolX - (symbolSize / 2), btnOptions.symbolY - (symbolSize / 2), symbolSize, symbolSize\n                    // If symbol is an image, scale it (#7957)\n                    , {\n                        width: symbolSize,\n                        height: symbolSize\n                    })\n                        .addClass('highcharts-button-symbol')\n                        .attr({\n                        zIndex: 1\n                    })\n                        .add(button);\n                    if (!chart.styledMode) {\n                        symbol.attr({\n                            stroke: btnOptions.symbolStroke,\n                            fill: btnOptions.symbolFill,\n                            'stroke-width': btnOptions.symbolStrokeWidth || 1\n                        });\n                    }\n                }\n                button\n                    .add(chart.exportingGroup)\n                    .align(extend(btnOptions, {\n                    width: button.width,\n                    x: pick(btnOptions.x, chart.buttonOffset) // #1654\n                }), true, 'spacingBox');\n                chart.buttonOffset += ((button.width + btnOptions.buttonSpacing) *\n                    (btnOptions.align === 'right' ? -1 : 1));\n                chart.exportSVGElements.push(button, symbol);\n            },\n            /**\n             * Destroy the export buttons.\n             * @private\n             * @function Highcharts.Chart#destroyExport\n             * @param {global.Event} [e]\n             * @return {void}\n             * @requires modules/exporting\n             */\n            destroyExport: function (e) {\n                var chart = e ? e.target : this,\n                    exportSVGElements = chart.exportSVGElements,\n                    exportDivElements = chart.exportDivElements,\n                    exportEvents = chart.exportEvents,\n                    cacheName;\n                // Destroy the extra buttons added\n                if (exportSVGElements) {\n                    exportSVGElements.forEach(function (elem, i) {\n                        // Destroy and null the svg elements\n                        if (elem) { // #1822\n                            elem.onclick = elem.ontouchstart = null;\n                            cacheName = 'cache-' + elem.menuClassName;\n                            if (chart[cacheName]) {\n                                delete chart[cacheName];\n                            }\n                            chart.exportSVGElements[i] = elem.destroy();\n                        }\n                    });\n                    exportSVGElements.length = 0;\n                }\n                // Destroy the exporting group\n                if (chart.exportingGroup) {\n                    chart.exportingGroup.destroy();\n                    delete chart.exportingGroup;\n                }\n                // Destroy the divs for the menu\n                if (exportDivElements) {\n                    exportDivElements.forEach(function (elem, i) {\n                        // Remove the event handler\n                        U.clearTimeout(elem.hideTimer); // #5427\n                        removeEvent(elem, 'mouseleave');\n                        // Remove inline events\n                        chart.exportDivElements[i] =\n                            elem.onmouseout =\n                                elem.onmouseover =\n                                    elem.ontouchstart =\n                                        elem.onclick = null;\n                        // Destroy the div by moving to garbage bin\n                        discardElement(elem);\n                    });\n                    exportDivElements.length = 0;\n                }\n                if (exportEvents) {\n                    exportEvents.forEach(function (unbind) {\n                        unbind();\n                    });\n                    exportEvents.length = 0;\n                }\n            }\n            /* eslint-enable no-invalid-this, valid-jsdoc */\n        });\n        // These ones are translated to attributes rather than styles\n        SVGRenderer.prototype.inlineToAttributes = [\n            'fill',\n            'stroke',\n            'strokeLinecap',\n            'strokeLinejoin',\n            'strokeWidth',\n            'textAnchor',\n            'x',\n            'y'\n        ];\n        // These CSS properties are not inlined. Remember camelCase.\n        SVGRenderer.prototype.inlineBlacklist = [\n            /-/,\n            /^(clipPath|cssText|d|height|width)$/,\n            /^font$/,\n            /[lL]ogical(Width|Height)$/,\n            /perspective/,\n            /TapHighlightColor/,\n            /^transition/,\n            /^length$/ // #7700\n            // /^text (border|color|cursor|height|webkitBorder)/\n        ];\n        SVGRenderer.prototype.unstyledElements = [\n            'clipPath',\n            'defs',\n            'desc'\n        ];\n        /**\n         * Analyze inherited styles from stylesheets and add them inline\n         *\n         * @private\n         * @function Highcharts.Chart#inlineStyles\n         * @return {void}\n         *\n         * @todo: What are the border styles for text about? In general, text has a lot\n         * of properties.\n         * @todo: Make it work with IE9 and IE10.\n         *\n         * @requires modules/exporting\n         */\n        Chart.prototype.inlineStyles = function () {\n            var renderer = this.renderer,\n                inlineToAttributes = renderer.inlineToAttributes,\n                blacklist = renderer.inlineBlacklist,\n                whitelist = renderer.inlineWhitelist, // For IE\n                unstyledElements = renderer.unstyledElements,\n                defaultStyles = {},\n                dummySVG,\n                iframe,\n                iframeDoc;\n            // Create an iframe where we read default styles without pollution from this\n            // body\n            iframe = doc.createElement('iframe');\n            css(iframe, {\n                width: '1px',\n                height: '1px',\n                visibility: 'hidden'\n            });\n            doc.body.appendChild(iframe);\n            iframeDoc = iframe.contentWindow.document;\n            iframeDoc.open();\n            iframeDoc.write('<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>');\n            iframeDoc.close();\n            /**\n             * Make hyphenated property names out of camelCase\n             * @private\n             * @param {string} prop\n             *        Property name in camelCase\n             * @return {string}\n             *         Hyphenated property name\n             */\n            function hyphenate(prop) {\n                return prop.replace(/([A-Z])/g, function (a, b) {\n                    return '-' + b.toLowerCase();\n                });\n            }\n            /**\n             * Call this on all elements and recurse to children\n             * @private\n             * @param {Highcharts.HTMLDOMElement} node\n             *        Element child\n             * @return {void}\n             */\n            function recurse(node) {\n                var styles,\n                    parentStyles,\n                    cssText = '',\n                    dummy,\n                    styleAttr,\n                    blacklisted,\n                    whitelisted,\n                    i;\n                /**\n                 * Check computed styles and whether they are in the white/blacklist for\n                 * styles or atttributes.\n                 * @private\n                 * @param {string} val\n                 *        Style value\n                 * @param {string} prop\n                 *        Style property name\n                 * @return {void}\n                 */\n                function filterStyles(val, prop) {\n                    // Check against whitelist & blacklist\n                    blacklisted = whitelisted = false;\n                    if (whitelist) {\n                        // Styled mode in IE has a whitelist instead.\n                        // Exclude all props not in this list.\n                        i = whitelist.length;\n                        while (i-- && !whitelisted) {\n                            whitelisted = whitelist[i].test(prop);\n                        }\n                        blacklisted = !whitelisted;\n                    }\n                    // Explicitly remove empty transforms\n                    if (prop === 'transform' && val === 'none') {\n                        blacklisted = true;\n                    }\n                    i = blacklist.length;\n                    while (i-- && !blacklisted) {\n                        blacklisted = (blacklist[i].test(prop) ||\n                            typeof val === 'function');\n                    }\n                    if (!blacklisted) {\n                        // If parent node has the same style, it gets inherited, no need\n                        // to inline it. Top-level props should be diffed against parent\n                        // (#7687).\n                        if ((parentStyles[prop] !== val || node.nodeName === 'svg') &&\n                            defaultStyles[node.nodeName][prop] !== val) {\n                            // Attributes\n                            if (!inlineToAttributes ||\n                                inlineToAttributes.indexOf(prop) !== -1) {\n                                if (val) {\n                                    node.setAttribute(hyphenate(prop), val);\n                                }\n                                // Styles\n                            }\n                            else {\n                                cssText += hyphenate(prop) + ':' + val + ';';\n                            }\n                        }\n                    }\n                }\n                if (node.nodeType === 1 &&\n                    unstyledElements.indexOf(node.nodeName) === -1) {\n                    styles = win.getComputedStyle(node, null);\n                    parentStyles = node.nodeName === 'svg' ?\n                        {} :\n                        win.getComputedStyle(node.parentNode, null);\n                    // Get default styles from the browser so that we don't have to add\n                    // these\n                    if (!defaultStyles[node.nodeName]) {\n                        /*\n                        if (!dummySVG) {\n                            dummySVG = doc.createElementNS(H.SVG_NS, 'svg');\n                            dummySVG.setAttribute('version', '1.1');\n                            doc.body.appendChild(dummySVG);\n                        }\n                        */\n                        dummySVG = iframeDoc.getElementsByTagName('svg')[0];\n                        dummy = iframeDoc.createElementNS(node.namespaceURI, node.nodeName);\n                        dummySVG.appendChild(dummy);\n                        // Copy, so we can remove the node\n                        defaultStyles[node.nodeName] = merge(win.getComputedStyle(dummy, null));\n                        // Remove default fill, otherwise text disappears when exported\n                        if (node.nodeName === 'text') {\n                            delete defaultStyles.text.fill;\n                        }\n                        dummySVG.removeChild(dummy);\n                    }\n                    // Loop through all styles and add them inline if they are ok\n                    if (isFirefoxBrowser || isMSBrowser) {\n                        // Some browsers put lots of styles on the prototype\n                        for (var p in styles) { // eslint-disable-line guard-for-in\n                            filterStyles(styles[p], p);\n                        }\n                    }\n                    else {\n                        objectEach(styles, filterStyles);\n                    }\n                    // Apply styles\n                    if (cssText) {\n                        styleAttr = node.getAttribute('style');\n                        node.setAttribute('style', (styleAttr ? styleAttr + ';' : '') + cssText);\n                    }\n                    // Set default stroke width (needed at least for IE)\n                    if (node.nodeName === 'svg') {\n                        node.setAttribute('stroke-width', '1px');\n                    }\n                    if (node.nodeName === 'text') {\n                        return;\n                    }\n                    // Recurse\n                    [].forEach.call(node.children || node.childNodes, recurse);\n                }\n            }\n            /**\n             * Remove the dummy objects used to get defaults\n             * @private\n             * @return {void}\n             */\n            function tearDown() {\n                dummySVG.parentNode.removeChild(dummySVG);\n            }\n            recurse(this.container.querySelector('svg'));\n            tearDown();\n        };\n        symbols.menu = function (x, y, width, height) {\n            var arr = [\n                    ['M',\n                x,\n                y + 2.5],\n                    ['L',\n                x + width,\n                y + 2.5],\n                    ['M',\n                x,\n                y + height / 2 + 0.5],\n                    ['L',\n                x + width,\n                y + height / 2 + 0.5],\n                    ['M',\n                x,\n                y + height - 1.5],\n                    ['L',\n                x + width,\n                y + height - 1.5]\n                ];\n            return arr;\n        };\n        symbols.menuball = function (x, y, width, height) {\n            var path = [],\n                h = (height / 3) - 2;\n            path = path.concat(this.circle(width - h, y, h, h), this.circle(width - h, y + h + 4, h, h), this.circle(width - h, y + 2 * (h + 4), h, h));\n            return path;\n        };\n        /**\n         * Add the buttons on chart load\n         * @private\n         * @function Highcharts.Chart#renderExporting\n         * @return {void}\n         * @requires modules/exporting\n         */\n        Chart.prototype.renderExporting = function () {\n            var chart = this,\n                exportingOptions = chart.options.exporting,\n                buttons = exportingOptions.buttons,\n                isDirty = chart.isDirtyExporting || !chart.exportSVGElements;\n            chart.buttonOffset = 0;\n            if (chart.isDirtyExporting) {\n                chart.destroyExport();\n            }\n            if (isDirty && exportingOptions.enabled !== false) {\n                chart.exportEvents = [];\n                chart.exportingGroup = chart.exportingGroup ||\n                    chart.renderer.g('exporting-group').attr({\n                        zIndex: 3 // #4955, // #8392\n                    }).add();\n                objectEach(buttons, function (button) {\n                    chart.addButton(button);\n                });\n                chart.isDirtyExporting = false;\n            }\n            // Destroy the export elements at chart destroy\n            addEvent(chart, 'destroy', chart.destroyExport);\n        };\n        /* eslint-disable no-invalid-this */\n        // Add update methods to handle chart.update and chart.exporting.update and\n        // chart.navigation.update. These must be added to the chart instance rather\n        // than the Chart prototype in order to use the chart instance inside the update\n        // function.\n        addEvent(Chart, 'init', function () {\n            var chart = this;\n            /**\n             * @private\n             * @param {\"exporting\"|\"navigation\"} prop\n             *        Property name in option root\n             * @param {Highcharts.ExportingOptions|Highcharts.NavigationOptions} options\n             *        Options to update\n             * @param {boolean} [redraw=true]\n             *        Whether to redraw\n             * @return {void}\n             */\n            function update(prop, options, redraw) {\n                chart.isDirtyExporting = true;\n                merge(true, chart.options[prop], options);\n                if (pick(redraw, true)) {\n                    chart.redraw();\n                }\n            }\n            chart.exporting = {\n                update: function (options, redraw) {\n                    update('exporting', options, redraw);\n                }\n            };\n            // Register update() method for navigation. Can not be set the same way as\n            // for exporting, because navigation options are shared with bindings which\n            // has separate update() logic.\n            chartNavigationMixin.addUpdate(function (options, redraw) {\n                update('navigation', options, redraw);\n            }, chart);\n        });\n        /* eslint-enable no-invalid-this */\n        Chart.prototype.callbacks.push(function (chart) {\n            chart.renderExporting();\n            addEvent(chart, 'redraw', chart.renderExporting);\n            // Uncomment this to see a button directly below the chart, for quick\n            // testing of export\n            /*\n            var button,\n                viewImage,\n                viewSource;\n            if (!chart.renderer.forExport) {\n                viewImage = function () {\n                    var div = doc.createElement('div');\n                    div.innerHTML = chart.getSVGForExport();\n                    chart.renderTo.parentNode.appendChild(div);\n                };\n\n                viewSource = function () {\n                    var pre = doc.createElement('pre');\n                    pre.innerHTML = chart.getSVGForExport()\n                        .replace(/</g, '\\n&lt;')\n                        .replace(/>/g, '&gt;');\n                    chart.renderTo.parentNode.appendChild(pre);\n                };\n\n                viewImage();\n\n                // View SVG Image\n                button = doc.createElement('button');\n                button.innerHTML = 'View SVG Image';\n                chart.renderTo.parentNode.appendChild(button);\n                button.onclick = viewImage;\n\n                // View SVG Source\n                button = doc.createElement('button');\n                button.innerHTML = 'View SVG Source';\n                chart.renderTo.parentNode.appendChild(button);\n                button.onclick = viewSource;\n            }\n            //*/\n        });\n\n    });\n    _registerModule(_modules, 'masters/modules/exporting.src.js', [], function () {\n\n\n    });\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/highcharts/modules/exporting.src.js\n// module id = 982\n// module chunks = 0 1","/**\n * Highcharts pattern fill plugin\n *\n * Version         2.0.2\n * Author:         Torstein Honsi\n *                 Stephane Vanraes\n * Last revision:  2015-05-04\n * License:        MIT License\n *\n * Remark:         The latest version is not compatible with earlier versions.\n *\n * Usage:          Add a 'defs' object to the options\n *                 Create a 'patterns' array under 'defs'\n *                 Each item in this array represents a pattern\n *                 To use a pattern, set the color to `url(#id-of-pattern)'\n *\n * Options for the patterns:\n * - id:           The id for the pattern, defaults to highcharts-pattern-# with # an increasing number for each pattern without id\n * - width:        The width of the pattern, defaults to 10\n * - height:       The height of the pattern, defaults to 10\n * - opacity       A general opacity for the pattern\n * - path:         In SVG, the path for the pattern\n *                 (Note: this can be a string with only a path, or an object with d, stroke, strokeWidth and fill)\n * - image:        An image source for the pattern\n * - color:        A color to be used instead of a path\n *\n * Notes:          VML does not support the path setting\n *                 If all other fills fail (no path, image or color) the pattern will return #A0A0A0 as a color\n *                 Several patterns have been predefined, called highcharts-default-pattern-# (numbered 0-9)\n */\n//[dz] wrap this in a function to avoid global Highcharts usage, code is otherwise intact\n/*global document */\nexport default function patternFill(Highcharts) {\n\n    'use strict';\n\n    var idCounter = 0,\n        wrap = Highcharts.wrap;\n\n    /**\n     * Exposed method to add a pattern to the renderer.\n     */\n    Highcharts.SVGRenderer.prototype.addPattern = function (id, options) {\n        var pattern,\n            path,\n            w = options.width || 10,\n            h = options.height || 10,\n            ren = this;\n\n        /**\n         * Add a rectangle for solid color\n         */\n        function rect (fill) {\n            ren.rect(0, 0, w, h)\n                .attr({\n                    fill: fill\n                })\n                .add(pattern);\n        }\n\n        if (!id) {\n            id = 'highcharts-pattern-' + idCounter;\n            idCounter += 1;\n        }\n\n        pattern = this.createElement('pattern').attr({\n            id: id,\n            patternUnits: 'userSpaceOnUse',\n            width: options.width || 10,\n            height: options.height || 10\n        }).add(this.defs);\n\n        // Get id\n        pattern.id = pattern.element.id;\n\n        // Use an SVG path for the pattern\n        if (options.path) {\n            path = options.path;\n\n            // The background\n            if (path.fill) {\n                rect(path.fill);\n            }\n\n            // The pattern\n            this.createElement('path').attr({\n                'd': path.d || path,\n                'stroke': path.stroke || options.color || '#343434',\n                'stroke-width': path.strokeWidth || 2\n            }).add(pattern);\n            pattern.color = options.color;\n\n        // Image pattern\n        } else if (options.image) {\n\n            this.image(options.image, 0, 0, options.width, options.height).add(pattern);\n\n        // A solid color\n        } else if (options.color) {\n\n            rect(options.color);\n\n        }\n\n        if (options.opacity !== undefined) {\n            pattern.element.children.forEach(function (child) {\n                child.setAttribute('opacity', options.opacity);\n            });\n        }\n\n        return pattern;\n    };\n\n    if (Highcharts.VMLElement) {\n\n        Highcharts.VMLRenderer.prototype.addPattern = function (id, options) {\n\n            var patterns;\n            if (!id) {\n                id = 'highcharts-pattern-' + idCounter;\n                idCounter += 1;\n            }\n            patterns = this.patterns || {};\n            patterns[id] = options;\n            this.patterns = patterns;\n        };\n\n        Highcharts.wrap(Highcharts.VMLRenderer.prototype.Element.prototype, 'fillSetter', function (proceed, color, prop, elem) {\n            if (typeof color === 'string' && color.substring(0, 5) === 'url(#') {\n                var id = color.substring(5, color.length - 1),\n                    pattern = this.renderer.patterns[id],\n                    markup;\n\n                if (pattern.image) {\n                    // Remove Previous fills\n                    if (elem.getElementsByTagName('fill').length) {\n                        elem.removeChild(elem.getElementsByTagName('fill')[0]);\n                    }\n\n                    markup = this.renderer.prepVML(['<', prop, ' type=\"tile\" src=\"', pattern.image, '\" />']);\n                    elem.appendChild(document.createElement(markup));\n\n                    // Work around display bug on updating attached nodes\n                    if (elem.parentNode.nodeType === 1) {\n                        elem.outerHTML = elem.outerHTML;\n                    }\n\n                } else if (pattern.color) {\n                    proceed.call(this, pattern.color, prop, elem);\n                } else {\n                    proceed.call(this, '#A0A0A0', prop, elem);\n                }\n            } else {\n                proceed.call(this, color, prop, elem);\n            }\n        });\n    }\n\n    /**\n     * Add the predefined patterns\n     */\n    function addPredefinedPatterns(renderer) {\n        var colors = Highcharts.getOptions().colors;\n\n        [\n          'M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11',\n          'M 0 10 L 10 0 M -1 1 L 1 -1 M 9 11 L 11 9',\n          'M 3 0 L 3 10 M 8 0 L 8 10',\n          'M 0 3 L 10 3 M 0 8 L 10 8',\n          'M 0 3 L 5 3 L 5 0 M 5 10 L 5 7 L 10 7',\n          'M 3 3 L 8 3 L 8 8 L 3 8 Z',\n          'M 5 5 m -4 0 a 4 4 0 1 1 8 0 a 4 4 0 1 1 -8 0',\n          'M 10 3 L 5 3 L 5 0 M 5 10 L 5 7 L 0 7',\n          'M 2 5 L 5 2 L 8 5 L 5 8 Z',\n          'M 0 0 L 5 10 L 10 0'\n        ].forEach(function (pattern, i) {\n            renderer.addPattern('highcharts-default-pattern-' + i, {\n                path: pattern,\n                color: colors[i]\n            });\n        });\n    }\n\n    // Add patterns to the defs element\n    wrap(Highcharts.Chart.prototype, 'getContainer', function (proceed) {\n        proceed.apply(this);\n\n        var chart = this,\n            renderer = chart.renderer,\n            options = chart.options,\n            patterns = options.defs && options.defs.patterns;\n\n        // First add default patterns\n        addPredefinedPatterns(renderer);\n\n        // Add user defined patterns\n        if (patterns) {\n            patterns.forEach(function (pattern) {\n                renderer.addPattern(pattern.id, pattern);\n            });\n        }\n\n    });\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/highcharts_og/vendor/highcharts-pattern-fill.ts","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shallowEqual;\n\nfunction shallowEqual(objA, objB) {\n  if (objA === objB) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n  for (var i = 0; i < keysA.length; i++) {\n    if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-pure-render/shallowEqual.js\n// module id = 984\n// module chunks = 0 1","import $ from 'jquery';\n\nexport default {\n  componentWillMount() {\n    this.documentListeners = [];\n  },\n\n  onDocument(eventName, callback) {\n    $(document).on(eventName, callback);\n    this.documentListeners.push([eventName, callback]);\n  },\n\n  componentWillUnmount() {\n    this.documentListeners.forEach((documentListener) => {\n      $(document).off(documentListener[0], documentListener[1]);\n    });\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/document_mixin.ts","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport LegendItem from './legend_item';\nimport LegendSort from './legend_sort';\nimport LegendMoreButton from './legend_more_button';\n\nexport default class Legend extends React.Component<any, any> {\n  static propTypes = {\n    lines: PropTypes.array,\n    legendSortBy: PropTypes.string,\n    onSortChange: PropTypes.func\n  }\n\n  static defaultProps = {\n    onSortChange: _.noop\n  };\n\n  render() {\n    let showMoreLine = {};\n    let items: any = {};\n    const {lines} = this.props;\n    const hasMore = lines ? _.some(lines, {name: 'Show More'}) : false;\n\n    if (lines && lines.length > 0) {\n      items = lines.map((line) => {\n        return (\n          <LegendItem\n            key={line.id}\n            line={line}\n            color={line.color} />\n        );\n      }, this);\n\n      if (hasMore) {\n        showMoreLine = (_.last(items) as any).props.line;\n        items.pop();\n      }\n    }\n\n    return (\n      <div className=\"report__legend-wrapper grid-legend\">\n        <LegendSort selection={this.props.legendSortBy} onSelect={this.props.onSortChange} />\n        <div className=\"legend__items\">\n          {lines && lines.length > 0 && items}\n          {lines && lines.length > 0 && hasMore &&\n            <LegendMoreButton\n              ref=\"moreButton\"\n              hasMore={hasMore}\n              line={showMoreLine} />\n          }\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/grid_legend/index.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class LegendItem extends React.Component<any, any> {\n  static propTypes = {\n    line: PropTypes.object.isRequired,\n    color: PropTypes.string\n  }\n\n  render() {\n    const {line} = this.props;\n\n    return (\n      <button id={'legend_' + line.id}\n         className=\"legend__item\"\n         style={{color: this.props.color}}\n         title={line.name}\n         aria-label={'Filter visualization by '+ line.name}\n         onClick={line.events.legendItemClick.bind(this, line.name)}>\n\n        <div className=\"legend__item__decorator\" style={{background: this.props.color}} />\n        <span className=\"legend__item__text\">{line.name}</span>\n      </button>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/grid_legend/legend_item.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\n\nconst SortItemFactories = {\n  alpha: () => <span className=\"wd-alpha-sort\">A to Z</span>,\n  alpha_rev: () => <span className=\"wd-alpha_rev-sort\">Z to A</span>,\n  desc: () => <span className=\"wd-desc-sort\">Large to Small</span>,\n  asc: () => <span className=\"wd-asc-sort\">Small to Large</span>\n};\n\nconst SortItemOrder = ['alpha', 'alpha_rev', 'desc', 'asc'];\n\nexport default class LegendSort extends React.Component<any, any> {\n  static propTypes = {\n    selection: PropTypes.string,\n    onSelect: PropTypes.func\n  }\n\n  static defaultProps = {\n    selection: 'desc',\n    onSelect: _.noop\n  };\n\n  render() {\n    const {selection} = this.props;\n\n    const items = SortItemOrder.map((sortId) => {\n      return (\n        <li key={sortId}>\n          <a className={selection === sortId ? 'active' : ''} onClick={this.props.onSelect.bind(this, sortId)}>{SortItemFactories[sortId]()}</a>\n        </li>\n      );\n    }, this);\n\n    const currentSort = SortItemFactories[selection]();\n\n    return (\n      <div className=\"legend__sort\">\n        <Ovid.Dropdown title={currentSort} toggleClass=\"legend__sort__target wd-legend-toggle\" label=\"Sort\">\n          <header className=\"ui-dropdown__header\">\n            <h4>Sort by</h4>\n          </header>\n          <ul className=\"ui-dropdown__list wd-legend-options\">\n            {items}\n          </ul>\n        </Ovid.Dropdown>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/grid_legend/legend_sort.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class LegendMoreButton extends React.Component<any, any> {\n  static propTypes = {\n    hasMore: PropTypes.bool,\n    line: PropTypes.object\n  }\n\n  render() {\n    const {line} = this.props;\n    if (!this.props.hasMore) {\n      return null;\n    }\n\n    return (\n      <div className=\"legend__button-wrapper\">\n        {this.props.hasMore ? (\n          <button\n            className=\"ui-button small wd-legend-show-more\"\n            onClick={line.events.legendItemClick.bind(this, line.name)} >Show More</button>\n        ) : null}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/grid_legend/legend_more_button.tsx","\n/**\n * @license\n *\n * chroma.js - JavaScript library for color conversions\n * \n * Copyright (c) 2011-2017, Gregor Aisch\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * \n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n * \n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * \n * 3. The name Gregor Aisch may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n(function() {\n  var Color, DEG2RAD, LAB_CONSTANTS, PI, PITHIRD, RAD2DEG, TWOPI, _average_lrgb, _guess_formats, _guess_formats_sorted, _input, _interpolators, abs, atan2, bezier, blend, blend_f, brewer, burn, chroma, clip_rgb, cmyk2rgb, colors, cos, css2rgb, darken, dodge, each, floor, hcg2rgb, hex2rgb, hsi2rgb, hsl2css, hsl2rgb, hsv2rgb, interpolate, interpolate_hsx, interpolate_lab, interpolate_lrgb, interpolate_num, interpolate_rgb, lab2lch, lab2rgb, lab_xyz, lch2lab, lch2rgb, lighten, limit, log, luminance_x, m, max, multiply, normal, num2rgb, overlay, pow, rgb2cmyk, rgb2css, rgb2hcg, rgb2hex, rgb2hsi, rgb2hsl, rgb2hsv, rgb2lab, rgb2lch, rgb2luminance, rgb2num, rgb2temperature, rgb2xyz, rgb_xyz, rnd, root, round, screen, sin, sqrt, temperature2rgb, type, unpack, w3cx11, xyz_lab, xyz_rgb,\n    slice = [].slice;\n\n  type = (function() {\n\n    /*\n    for browser-safe type checking+\n    ported from jQuery's $.type\n     */\n    var classToType, len, name, o, ref;\n    classToType = {};\n    ref = \"Boolean Number String Function Array Date RegExp Undefined Null\".split(\" \");\n    for (o = 0, len = ref.length; o < len; o++) {\n      name = ref[o];\n      classToType[\"[object \" + name + \"]\"] = name.toLowerCase();\n    }\n    return function(obj) {\n      var strType;\n      strType = Object.prototype.toString.call(obj);\n      return classToType[strType] || \"object\";\n    };\n  })();\n\n  limit = function(x, min, max) {\n    if (min == null) {\n      min = 0;\n    }\n    if (max == null) {\n      max = 1;\n    }\n    if (x < min) {\n      x = min;\n    }\n    if (x > max) {\n      x = max;\n    }\n    return x;\n  };\n\n  unpack = function(args) {\n    if (args.length >= 3) {\n      return Array.prototype.slice.call(args);\n    } else {\n      return args[0];\n    }\n  };\n\n  clip_rgb = function(rgb) {\n    var i, o;\n    rgb._clipped = false;\n    rgb._unclipped = rgb.slice(0);\n    for (i = o = 0; o < 3; i = ++o) {\n      if (i < 3) {\n        if (rgb[i] < 0 || rgb[i] > 255) {\n          rgb._clipped = true;\n        }\n        if (rgb[i] < 0) {\n          rgb[i] = 0;\n        }\n        if (rgb[i] > 255) {\n          rgb[i] = 255;\n        }\n      } else if (i === 3) {\n        if (rgb[i] < 0) {\n          rgb[i] = 0;\n        }\n        if (rgb[i] > 1) {\n          rgb[i] = 1;\n        }\n      }\n    }\n    if (!rgb._clipped) {\n      delete rgb._unclipped;\n    }\n    return rgb;\n  };\n\n  PI = Math.PI, round = Math.round, cos = Math.cos, floor = Math.floor, pow = Math.pow, log = Math.log, sin = Math.sin, sqrt = Math.sqrt, atan2 = Math.atan2, max = Math.max, abs = Math.abs;\n\n  TWOPI = PI * 2;\n\n  PITHIRD = PI / 3;\n\n  DEG2RAD = PI / 180;\n\n  RAD2DEG = 180 / PI;\n\n  chroma = function() {\n    if (arguments[0] instanceof Color) {\n      return arguments[0];\n    }\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, arguments, function(){});\n  };\n\n  chroma[\"default\"] = chroma;\n\n  _interpolators = [];\n\n  if ((typeof module !== \"undefined\" && module !== null) && (module.exports != null)) {\n    module.exports = chroma;\n  }\n\n  if (typeof define === 'function' && define.amd) {\n    define([], function() {\n      return chroma;\n    });\n  } else {\n    root = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n    root.chroma = chroma;\n  }\n\n  chroma.version = '1.4.1';\n\n  _input = {};\n\n  _guess_formats = [];\n\n  _guess_formats_sorted = false;\n\n  Color = (function() {\n    function Color() {\n      var arg, args, chk, len, len1, me, mode, o, w;\n      me = this;\n      args = [];\n      for (o = 0, len = arguments.length; o < len; o++) {\n        arg = arguments[o];\n        if (arg != null) {\n          args.push(arg);\n        }\n      }\n      if (args.length > 1) {\n        mode = args[args.length - 1];\n      }\n      if (_input[mode] != null) {\n        me._rgb = clip_rgb(_input[mode](unpack(args.slice(0, -1))));\n      } else {\n        if (!_guess_formats_sorted) {\n          _guess_formats = _guess_formats.sort(function(a, b) {\n            return b.p - a.p;\n          });\n          _guess_formats_sorted = true;\n        }\n        for (w = 0, len1 = _guess_formats.length; w < len1; w++) {\n          chk = _guess_formats[w];\n          mode = chk.test.apply(chk, args);\n          if (mode) {\n            break;\n          }\n        }\n        if (mode) {\n          me._rgb = clip_rgb(_input[mode].apply(_input, args));\n        }\n      }\n      if (me._rgb == null) {\n        console.warn('unknown format: ' + args);\n      }\n      if (me._rgb == null) {\n        me._rgb = [0, 0, 0];\n      }\n      if (me._rgb.length === 3) {\n        me._rgb.push(1);\n      }\n    }\n\n    Color.prototype.toString = function() {\n      return this.hex();\n    };\n\n    return Color;\n\n  })();\n\n  chroma._input = _input;\n\n\n  /**\n  \tColorBrewer colors for chroma.js\n  \n  \tCopyright (c) 2002 Cynthia Brewer, Mark Harrower, and The \n  \tPennsylvania State University.\n  \n  \tLicensed under the Apache License, Version 2.0 (the \"License\"); \n  \tyou may not use this file except in compliance with the License.\n  \tYou may obtain a copy of the License at\t\n  \thttp://www.apache.org/licenses/LICENSE-2.0\n  \n  \tUnless required by applicable law or agreed to in writing, software distributed\n  \tunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n  \tCONDITIONS OF ANY KIND, either express or implied. See the License for the\n  \tspecific language governing permissions and limitations under the License.\n  \n      @preserve\n   */\n\n  chroma.brewer = brewer = {\n    OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n    PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n    BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n    Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n    BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n    YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n    YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n    Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n    RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n    Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n    YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n    Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n    GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n    Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n    YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n    PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n    Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n    PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n    Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n    Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n    RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n    RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n    PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n    PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n    RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n    BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n    RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n    PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n    Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n    Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n    Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n    Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n    Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n    Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n    Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n    Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n  };\n\n  (function() {\n    var key, results;\n    results = [];\n    for (key in brewer) {\n      results.push(brewer[key.toLowerCase()] = brewer[key]);\n    }\n    return results;\n  })();\n\n\n  /**\n  \tX11 color names\n  \n  \thttp://www.w3.org/TR/css3-color/#svg-color\n   */\n\n  w3cx11 = {\n    aliceblue: '#f0f8ff',\n    antiquewhite: '#faebd7',\n    aqua: '#00ffff',\n    aquamarine: '#7fffd4',\n    azure: '#f0ffff',\n    beige: '#f5f5dc',\n    bisque: '#ffe4c4',\n    black: '#000000',\n    blanchedalmond: '#ffebcd',\n    blue: '#0000ff',\n    blueviolet: '#8a2be2',\n    brown: '#a52a2a',\n    burlywood: '#deb887',\n    cadetblue: '#5f9ea0',\n    chartreuse: '#7fff00',\n    chocolate: '#d2691e',\n    coral: '#ff7f50',\n    cornflower: '#6495ed',\n    cornflowerblue: '#6495ed',\n    cornsilk: '#fff8dc',\n    crimson: '#dc143c',\n    cyan: '#00ffff',\n    darkblue: '#00008b',\n    darkcyan: '#008b8b',\n    darkgoldenrod: '#b8860b',\n    darkgray: '#a9a9a9',\n    darkgreen: '#006400',\n    darkgrey: '#a9a9a9',\n    darkkhaki: '#bdb76b',\n    darkmagenta: '#8b008b',\n    darkolivegreen: '#556b2f',\n    darkorange: '#ff8c00',\n    darkorchid: '#9932cc',\n    darkred: '#8b0000',\n    darksalmon: '#e9967a',\n    darkseagreen: '#8fbc8f',\n    darkslateblue: '#483d8b',\n    darkslategray: '#2f4f4f',\n    darkslategrey: '#2f4f4f',\n    darkturquoise: '#00ced1',\n    darkviolet: '#9400d3',\n    deeppink: '#ff1493',\n    deepskyblue: '#00bfff',\n    dimgray: '#696969',\n    dimgrey: '#696969',\n    dodgerblue: '#1e90ff',\n    firebrick: '#b22222',\n    floralwhite: '#fffaf0',\n    forestgreen: '#228b22',\n    fuchsia: '#ff00ff',\n    gainsboro: '#dcdcdc',\n    ghostwhite: '#f8f8ff',\n    gold: '#ffd700',\n    goldenrod: '#daa520',\n    gray: '#808080',\n    green: '#008000',\n    greenyellow: '#adff2f',\n    grey: '#808080',\n    honeydew: '#f0fff0',\n    hotpink: '#ff69b4',\n    indianred: '#cd5c5c',\n    indigo: '#4b0082',\n    ivory: '#fffff0',\n    khaki: '#f0e68c',\n    laserlemon: '#ffff54',\n    lavender: '#e6e6fa',\n    lavenderblush: '#fff0f5',\n    lawngreen: '#7cfc00',\n    lemonchiffon: '#fffacd',\n    lightblue: '#add8e6',\n    lightcoral: '#f08080',\n    lightcyan: '#e0ffff',\n    lightgoldenrod: '#fafad2',\n    lightgoldenrodyellow: '#fafad2',\n    lightgray: '#d3d3d3',\n    lightgreen: '#90ee90',\n    lightgrey: '#d3d3d3',\n    lightpink: '#ffb6c1',\n    lightsalmon: '#ffa07a',\n    lightseagreen: '#20b2aa',\n    lightskyblue: '#87cefa',\n    lightslategray: '#778899',\n    lightslategrey: '#778899',\n    lightsteelblue: '#b0c4de',\n    lightyellow: '#ffffe0',\n    lime: '#00ff00',\n    limegreen: '#32cd32',\n    linen: '#faf0e6',\n    magenta: '#ff00ff',\n    maroon: '#800000',\n    maroon2: '#7f0000',\n    maroon3: '#b03060',\n    mediumaquamarine: '#66cdaa',\n    mediumblue: '#0000cd',\n    mediumorchid: '#ba55d3',\n    mediumpurple: '#9370db',\n    mediumseagreen: '#3cb371',\n    mediumslateblue: '#7b68ee',\n    mediumspringgreen: '#00fa9a',\n    mediumturquoise: '#48d1cc',\n    mediumvioletred: '#c71585',\n    midnightblue: '#191970',\n    mintcream: '#f5fffa',\n    mistyrose: '#ffe4e1',\n    moccasin: '#ffe4b5',\n    navajowhite: '#ffdead',\n    navy: '#000080',\n    oldlace: '#fdf5e6',\n    olive: '#808000',\n    olivedrab: '#6b8e23',\n    orange: '#ffa500',\n    orangered: '#ff4500',\n    orchid: '#da70d6',\n    palegoldenrod: '#eee8aa',\n    palegreen: '#98fb98',\n    paleturquoise: '#afeeee',\n    palevioletred: '#db7093',\n    papayawhip: '#ffefd5',\n    peachpuff: '#ffdab9',\n    peru: '#cd853f',\n    pink: '#ffc0cb',\n    plum: '#dda0dd',\n    powderblue: '#b0e0e6',\n    purple: '#800080',\n    purple2: '#7f007f',\n    purple3: '#a020f0',\n    rebeccapurple: '#663399',\n    red: '#ff0000',\n    rosybrown: '#bc8f8f',\n    royalblue: '#4169e1',\n    saddlebrown: '#8b4513',\n    salmon: '#fa8072',\n    sandybrown: '#f4a460',\n    seagreen: '#2e8b57',\n    seashell: '#fff5ee',\n    sienna: '#a0522d',\n    silver: '#c0c0c0',\n    skyblue: '#87ceeb',\n    slateblue: '#6a5acd',\n    slategray: '#708090',\n    slategrey: '#708090',\n    snow: '#fffafa',\n    springgreen: '#00ff7f',\n    steelblue: '#4682b4',\n    tan: '#d2b48c',\n    teal: '#008080',\n    thistle: '#d8bfd8',\n    tomato: '#ff6347',\n    turquoise: '#40e0d0',\n    violet: '#ee82ee',\n    wheat: '#f5deb3',\n    white: '#ffffff',\n    whitesmoke: '#f5f5f5',\n    yellow: '#ffff00',\n    yellowgreen: '#9acd32'\n  };\n\n  chroma.colors = colors = w3cx11;\n\n  lab2rgb = function() {\n    var a, args, b, g, l, r, x, y, z;\n    args = unpack(arguments);\n    l = args[0], a = args[1], b = args[2];\n    y = (l + 16) / 116;\n    x = isNaN(a) ? y : y + a / 500;\n    z = isNaN(b) ? y : y - b / 200;\n    y = LAB_CONSTANTS.Yn * lab_xyz(y);\n    x = LAB_CONSTANTS.Xn * lab_xyz(x);\n    z = LAB_CONSTANTS.Zn * lab_xyz(z);\n    r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z);\n    g = xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z);\n    b = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  xyz_rgb = function(r) {\n    return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055);\n  };\n\n  lab_xyz = function(t) {\n    if (t > LAB_CONSTANTS.t1) {\n      return t * t * t;\n    } else {\n      return LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0);\n    }\n  };\n\n  LAB_CONSTANTS = {\n    Kn: 18,\n    Xn: 0.950470,\n    Yn: 1,\n    Zn: 1.088830,\n    t0: 0.137931034,\n    t1: 0.206896552,\n    t2: 0.12841855,\n    t3: 0.008856452\n  };\n\n  rgb2lab = function() {\n    var b, g, r, ref, ref1, x, y, z;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    ref1 = rgb2xyz(r, g, b), x = ref1[0], y = ref1[1], z = ref1[2];\n    return [116 * y - 16, 500 * (x - y), 200 * (y - z)];\n  };\n\n  rgb_xyz = function(r) {\n    if ((r /= 255) <= 0.04045) {\n      return r / 12.92;\n    } else {\n      return pow((r + 0.055) / 1.055, 2.4);\n    }\n  };\n\n  xyz_lab = function(t) {\n    if (t > LAB_CONSTANTS.t3) {\n      return pow(t, 1 / 3);\n    } else {\n      return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0;\n    }\n  };\n\n  rgb2xyz = function() {\n    var b, g, r, ref, x, y, z;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = rgb_xyz(r);\n    g = rgb_xyz(g);\n    b = rgb_xyz(b);\n    x = xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn);\n    y = xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / LAB_CONSTANTS.Yn);\n    z = xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn);\n    return [x, y, z];\n  };\n\n  chroma.lab = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['lab']), function(){});\n  };\n\n  _input.lab = lab2rgb;\n\n  Color.prototype.lab = function() {\n    return rgb2lab(this._rgb);\n  };\n\n  bezier = function(colors) {\n    var I, I0, I1, c, lab0, lab1, lab2, lab3, ref, ref1, ref2;\n    colors = (function() {\n      var len, o, results;\n      results = [];\n      for (o = 0, len = colors.length; o < len; o++) {\n        c = colors[o];\n        results.push(chroma(c));\n      }\n      return results;\n    })();\n    if (colors.length === 2) {\n      ref = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref[0], lab1 = ref[1];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push(lab0[i] + t * (lab1[i] - lab0[i]));\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 3) {\n      ref1 = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref1[0], lab1 = ref1[1], lab2 = ref1[2];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push((1 - t) * (1 - t) * lab0[i] + 2 * (1 - t) * t * lab1[i] + t * t * lab2[i]);\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 4) {\n      ref2 = (function() {\n        var len, o, results;\n        results = [];\n        for (o = 0, len = colors.length; o < len; o++) {\n          c = colors[o];\n          results.push(c.lab());\n        }\n        return results;\n      })(), lab0 = ref2[0], lab1 = ref2[1], lab2 = ref2[2], lab3 = ref2[3];\n      I = function(t) {\n        var i, lab;\n        lab = (function() {\n          var o, results;\n          results = [];\n          for (i = o = 0; o <= 2; i = ++o) {\n            results.push((1 - t) * (1 - t) * (1 - t) * lab0[i] + 3 * (1 - t) * (1 - t) * t * lab1[i] + 3 * (1 - t) * t * t * lab2[i] + t * t * t * lab3[i]);\n          }\n          return results;\n        })();\n        return chroma.lab.apply(chroma, lab);\n      };\n    } else if (colors.length === 5) {\n      I0 = bezier(colors.slice(0, 3));\n      I1 = bezier(colors.slice(2, 5));\n      I = function(t) {\n        if (t < 0.5) {\n          return I0(t * 2);\n        } else {\n          return I1((t - 0.5) * 2);\n        }\n      };\n    }\n    return I;\n  };\n\n  chroma.bezier = function(colors) {\n    var f;\n    f = bezier(colors);\n    f.scale = function() {\n      return chroma.scale(f);\n    };\n    return f;\n  };\n\n  chroma.cubehelix = function(start, rotations, hue, gamma, lightness) {\n    var dh, dl, f;\n    if (start == null) {\n      start = 300;\n    }\n    if (rotations == null) {\n      rotations = -1.5;\n    }\n    if (hue == null) {\n      hue = 1;\n    }\n    if (gamma == null) {\n      gamma = 1;\n    }\n    if (lightness == null) {\n      lightness = [0, 1];\n    }\n    dh = 0;\n    if (type(lightness) === 'array') {\n      dl = lightness[1] - lightness[0];\n    } else {\n      dl = 0;\n      lightness = [lightness, lightness];\n    }\n    f = function(fract) {\n      var a, amp, b, cos_a, g, h, l, r, sin_a;\n      a = TWOPI * ((start + 120) / 360 + rotations * fract);\n      l = pow(lightness[0] + dl * fract, gamma);\n      h = dh !== 0 ? hue[0] + fract * dh : hue;\n      amp = h * l * (1 - l) / 2;\n      cos_a = cos(a);\n      sin_a = sin(a);\n      r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n      g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n      b = l + amp * (+1.97294 * cos_a);\n      return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n    };\n    f.start = function(s) {\n      if (s == null) {\n        return start;\n      }\n      start = s;\n      return f;\n    };\n    f.rotations = function(r) {\n      if (r == null) {\n        return rotations;\n      }\n      rotations = r;\n      return f;\n    };\n    f.gamma = function(g) {\n      if (g == null) {\n        return gamma;\n      }\n      gamma = g;\n      return f;\n    };\n    f.hue = function(h) {\n      if (h == null) {\n        return hue;\n      }\n      hue = h;\n      if (type(hue) === 'array') {\n        dh = hue[1] - hue[0];\n        if (dh === 0) {\n          hue = hue[1];\n        }\n      } else {\n        dh = 0;\n      }\n      return f;\n    };\n    f.lightness = function(h) {\n      if (h == null) {\n        return lightness;\n      }\n      if (type(h) === 'array') {\n        lightness = h;\n        dl = h[1] - h[0];\n      } else {\n        lightness = [h, h];\n        dl = 0;\n      }\n      return f;\n    };\n    f.scale = function() {\n      return chroma.scale(f);\n    };\n    f.hue(hue);\n    return f;\n  };\n\n  chroma.random = function() {\n    var code, digits, i, o;\n    digits = '0123456789abcdef';\n    code = '#';\n    for (i = o = 0; o < 6; i = ++o) {\n      code += digits.charAt(floor(Math.random() * 16));\n    }\n    return new Color(code);\n  };\n\n  _interpolators = [];\n\n  interpolate = function(col1, col2, f, m) {\n    var interpol, len, o, res;\n    if (f == null) {\n      f = 0.5;\n    }\n    if (m == null) {\n      m = 'rgb';\n    }\n\n    /*\n    interpolates between colors\n    f = 0 --> me\n    f = 1 --> col\n     */\n    if (type(col1) !== 'object') {\n      col1 = chroma(col1);\n    }\n    if (type(col2) !== 'object') {\n      col2 = chroma(col2);\n    }\n    for (o = 0, len = _interpolators.length; o < len; o++) {\n      interpol = _interpolators[o];\n      if (m === interpol[0]) {\n        res = interpol[1](col1, col2, f, m);\n        break;\n      }\n    }\n    if (res == null) {\n      throw \"color mode \" + m + \" is not supported\";\n    }\n    return res.alpha(col1.alpha() + f * (col2.alpha() - col1.alpha()));\n  };\n\n  chroma.interpolate = interpolate;\n\n  Color.prototype.interpolate = function(col2, f, m) {\n    return interpolate(this, col2, f, m);\n  };\n\n  chroma.mix = interpolate;\n\n  Color.prototype.mix = Color.prototype.interpolate;\n\n  _input.rgb = function() {\n    var k, ref, results, v;\n    ref = unpack(arguments);\n    results = [];\n    for (k in ref) {\n      v = ref[k];\n      results.push(v);\n    }\n    return results;\n  };\n\n  chroma.rgb = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['rgb']), function(){});\n  };\n\n  Color.prototype.rgb = function(round) {\n    if (round == null) {\n      round = true;\n    }\n    if (round) {\n      return this._rgb.map(Math.round).slice(0, 3);\n    } else {\n      return this._rgb.slice(0, 3);\n    }\n  };\n\n  Color.prototype.rgba = function(round) {\n    if (round == null) {\n      round = true;\n    }\n    if (!round) {\n      return this._rgb.slice(0);\n    }\n    return [Math.round(this._rgb[0]), Math.round(this._rgb[1]), Math.round(this._rgb[2]), this._rgb[3]];\n  };\n\n  _guess_formats.push({\n    p: 3,\n    test: function(n) {\n      var a;\n      a = unpack(arguments);\n      if (type(a) === 'array' && a.length === 3) {\n        return 'rgb';\n      }\n      if (a.length === 4 && type(a[3]) === \"number\" && a[3] >= 0 && a[3] <= 1) {\n        return 'rgb';\n      }\n    }\n  });\n\n  _input.lrgb = _input.rgb;\n\n  interpolate_lrgb = function(col1, col2, f, m) {\n    var xyz0, xyz1;\n    xyz0 = col1._rgb;\n    xyz1 = col2._rgb;\n    return new Color(sqrt(pow(xyz0[0], 2) * (1 - f) + pow(xyz1[0], 2) * f), sqrt(pow(xyz0[1], 2) * (1 - f) + pow(xyz1[1], 2) * f), sqrt(pow(xyz0[2], 2) * (1 - f) + pow(xyz1[2], 2) * f), m);\n  };\n\n  _average_lrgb = function(colors) {\n    var col, f, len, o, rgb, xyz;\n    f = 1 / colors.length;\n    xyz = [0, 0, 0, 0];\n    for (o = 0, len = colors.length; o < len; o++) {\n      col = colors[o];\n      rgb = col._rgb;\n      xyz[0] += pow(rgb[0], 2) * f;\n      xyz[1] += pow(rgb[1], 2) * f;\n      xyz[2] += pow(rgb[2], 2) * f;\n      xyz[3] += rgb[3] * f;\n    }\n    xyz[0] = sqrt(xyz[0]);\n    xyz[1] = sqrt(xyz[1]);\n    xyz[2] = sqrt(xyz[2]);\n    if (xyz[3] > 1) {\n      xyz[3] = 1;\n    }\n    return new Color(clip_rgb(xyz));\n  };\n\n  _interpolators.push(['lrgb', interpolate_lrgb]);\n\n  chroma.average = function(colors, mode) {\n    var A, alpha, c, cnt, dx, dy, first, i, l, len, o, xyz, xyz2;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    l = colors.length;\n    colors = colors.map(function(c) {\n      return chroma(c);\n    });\n    first = colors.splice(0, 1)[0];\n    if (mode === 'lrgb') {\n      return _average_lrgb(colors);\n    }\n    xyz = first.get(mode);\n    cnt = [];\n    dx = 0;\n    dy = 0;\n    for (i in xyz) {\n      xyz[i] = xyz[i] || 0;\n      cnt.push(isNaN(xyz[i]) ? 0 : 1);\n      if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n        A = xyz[i] / 180 * PI;\n        dx += cos(A);\n        dy += sin(A);\n      }\n    }\n    alpha = first.alpha();\n    for (o = 0, len = colors.length; o < len; o++) {\n      c = colors[o];\n      xyz2 = c.get(mode);\n      alpha += c.alpha();\n      for (i in xyz) {\n        if (!isNaN(xyz2[i])) {\n          cnt[i] += 1;\n          if (mode.charAt(i) === 'h') {\n            A = xyz2[i] / 180 * PI;\n            dx += cos(A);\n            dy += sin(A);\n          } else {\n            xyz[i] += xyz2[i];\n          }\n        }\n      }\n    }\n    for (i in xyz) {\n      if (mode.charAt(i) === 'h') {\n        A = atan2(dy / cnt[i], dx / cnt[i]) / PI * 180;\n        while (A < 0) {\n          A += 360;\n        }\n        while (A >= 360) {\n          A -= 360;\n        }\n        xyz[i] = A;\n      } else {\n        xyz[i] = xyz[i] / cnt[i];\n      }\n    }\n    return chroma(xyz, mode).alpha(alpha / l);\n  };\n\n  hex2rgb = function(hex) {\n    var a, b, g, r, rgb, u;\n    if (hex.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/)) {\n      if (hex.length === 4 || hex.length === 7) {\n        hex = hex.substr(1);\n      }\n      if (hex.length === 3) {\n        hex = hex.split(\"\");\n        hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n      }\n      u = parseInt(hex, 16);\n      r = u >> 16;\n      g = u >> 8 & 0xFF;\n      b = u & 0xFF;\n      return [r, g, b, 1];\n    }\n    if (hex.match(/^#?([A-Fa-f0-9]{8})$/)) {\n      if (hex.length === 9) {\n        hex = hex.substr(1);\n      }\n      u = parseInt(hex, 16);\n      r = u >> 24 & 0xFF;\n      g = u >> 16 & 0xFF;\n      b = u >> 8 & 0xFF;\n      a = round((u & 0xFF) / 0xFF * 100) / 100;\n      return [r, g, b, a];\n    }\n    if ((_input.css != null) && (rgb = _input.css(hex))) {\n      return rgb;\n    }\n    throw \"unknown color: \" + hex;\n  };\n\n  rgb2hex = function(channels, mode) {\n    var a, b, g, hxa, r, str, u;\n    if (mode == null) {\n      mode = 'auto';\n    }\n    r = channels[0], g = channels[1], b = channels[2], a = channels[3];\n    if (mode === 'auto') {\n      mode = a < 1 ? 'rgba' : 'rgb';\n    }\n    r = Math.round(r);\n    g = Math.round(g);\n    b = Math.round(b);\n    u = r << 16 | g << 8 | b;\n    str = \"000000\" + u.toString(16);\n    str = str.substr(str.length - 6);\n    hxa = '0' + round(a * 255).toString(16);\n    hxa = hxa.substr(hxa.length - 2);\n    return \"#\" + (function() {\n      switch (mode.toLowerCase()) {\n        case 'rgba':\n          return str + hxa;\n        case 'argb':\n          return hxa + str;\n        default:\n          return str;\n      }\n    })();\n  };\n\n  _input.hex = function(h) {\n    return hex2rgb(h);\n  };\n\n  chroma.hex = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hex']), function(){});\n  };\n\n  Color.prototype.hex = function(mode) {\n    if (mode == null) {\n      mode = 'auto';\n    }\n    return rgb2hex(this._rgb, mode);\n  };\n\n  _guess_formats.push({\n    p: 4,\n    test: function(n) {\n      if (arguments.length === 1 && type(n) === \"string\") {\n        return 'hex';\n      }\n    }\n  });\n\n  hsl2rgb = function() {\n    var args, b, c, g, h, i, l, o, r, ref, s, t1, t2, t3;\n    args = unpack(arguments);\n    h = args[0], s = args[1], l = args[2];\n    if (s === 0) {\n      r = g = b = l * 255;\n    } else {\n      t3 = [0, 0, 0];\n      c = [0, 0, 0];\n      t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n      t1 = 2 * l - t2;\n      h /= 360;\n      t3[0] = h + 1 / 3;\n      t3[1] = h;\n      t3[2] = h - 1 / 3;\n      for (i = o = 0; o <= 2; i = ++o) {\n        if (t3[i] < 0) {\n          t3[i] += 1;\n        }\n        if (t3[i] > 1) {\n          t3[i] -= 1;\n        }\n        if (6 * t3[i] < 1) {\n          c[i] = t1 + (t2 - t1) * 6 * t3[i];\n        } else if (2 * t3[i] < 1) {\n          c[i] = t2;\n        } else if (3 * t3[i] < 2) {\n          c[i] = t1 + (t2 - t1) * ((2 / 3) - t3[i]) * 6;\n        } else {\n          c[i] = t1;\n        }\n      }\n      ref = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)], r = ref[0], g = ref[1], b = ref[2];\n    }\n    if (args.length > 3) {\n      return [r, g, b, args[3]];\n    } else {\n      return [r, g, b];\n    }\n  };\n\n  rgb2hsl = function(r, g, b) {\n    var h, l, min, ref, s;\n    if (r !== void 0 && r.length >= 3) {\n      ref = r, r = ref[0], g = ref[1], b = ref[2];\n    }\n    r /= 255;\n    g /= 255;\n    b /= 255;\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    l = (max + min) / 2;\n    if (max === min) {\n      s = 0;\n      h = Number.NaN;\n    } else {\n      s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n    }\n    if (r === max) {\n      h = (g - b) / (max - min);\n    } else if (g === max) {\n      h = 2 + (b - r) / (max - min);\n    } else if (b === max) {\n      h = 4 + (r - g) / (max - min);\n    }\n    h *= 60;\n    if (h < 0) {\n      h += 360;\n    }\n    return [h, s, l];\n  };\n\n  chroma.hsl = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsl']), function(){});\n  };\n\n  _input.hsl = hsl2rgb;\n\n  Color.prototype.hsl = function() {\n    return rgb2hsl(this._rgb);\n  };\n\n  hsv2rgb = function() {\n    var args, b, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, s, t, v;\n    args = unpack(arguments);\n    h = args[0], s = args[1], v = args[2];\n    v *= 255;\n    if (s === 0) {\n      r = g = b = v;\n    } else {\n      if (h === 360) {\n        h = 0;\n      }\n      if (h > 360) {\n        h -= 360;\n      }\n      if (h < 0) {\n        h += 360;\n      }\n      h /= 60;\n      i = floor(h);\n      f = h - i;\n      p = v * (1 - s);\n      q = v * (1 - s * f);\n      t = v * (1 - s * (1 - f));\n      switch (i) {\n        case 0:\n          ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2];\n          break;\n        case 1:\n          ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2];\n          break;\n        case 2:\n          ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2];\n          break;\n        case 3:\n          ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2];\n          break;\n        case 4:\n          ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2];\n          break;\n        case 5:\n          ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2];\n      }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hsv = function() {\n    var b, delta, g, h, min, r, ref, s, v;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    delta = max - min;\n    v = max / 255.0;\n    if (max === 0) {\n      h = Number.NaN;\n      s = 0;\n    } else {\n      s = delta / max;\n      if (r === max) {\n        h = (g - b) / delta;\n      }\n      if (g === max) {\n        h = 2 + (b - r) / delta;\n      }\n      if (b === max) {\n        h = 4 + (r - g) / delta;\n      }\n      h *= 60;\n      if (h < 0) {\n        h += 360;\n      }\n    }\n    return [h, s, v];\n  };\n\n  chroma.hsv = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsv']), function(){});\n  };\n\n  _input.hsv = hsv2rgb;\n\n  Color.prototype.hsv = function() {\n    return rgb2hsv(this._rgb);\n  };\n\n  num2rgb = function(num) {\n    var b, g, r;\n    if (type(num) === \"number\" && num >= 0 && num <= 0xFFFFFF) {\n      r = num >> 16;\n      g = (num >> 8) & 0xFF;\n      b = num & 0xFF;\n      return [r, g, b, 1];\n    }\n    console.warn(\"unknown num color: \" + num);\n    return [0, 0, 0, 1];\n  };\n\n  rgb2num = function() {\n    var b, g, r, ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    return (r << 16) + (g << 8) + b;\n  };\n\n  chroma.num = function(num) {\n    return new Color(num, 'num');\n  };\n\n  Color.prototype.num = function(mode) {\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    return rgb2num(this._rgb, mode);\n  };\n\n  _input.num = num2rgb;\n\n  _guess_formats.push({\n    p: 1,\n    test: function(n) {\n      if (arguments.length === 1 && type(n) === \"number\" && n >= 0 && n <= 0xFFFFFF) {\n        return 'num';\n      }\n    }\n  });\n\n  hcg2rgb = function() {\n    var _c, _g, args, b, c, f, g, h, i, p, q, r, ref, ref1, ref2, ref3, ref4, ref5, t, v;\n    args = unpack(arguments);\n    h = args[0], c = args[1], _g = args[2];\n    c = c / 100;\n    g = g / 100 * 255;\n    _c = c * 255;\n    if (c === 0) {\n      r = g = b = _g;\n    } else {\n      if (h === 360) {\n        h = 0;\n      }\n      if (h > 360) {\n        h -= 360;\n      }\n      if (h < 0) {\n        h += 360;\n      }\n      h /= 60;\n      i = floor(h);\n      f = h - i;\n      p = _g * (1 - c);\n      q = p + _c * (1 - f);\n      t = p + _c * f;\n      v = p + _c;\n      switch (i) {\n        case 0:\n          ref = [v, t, p], r = ref[0], g = ref[1], b = ref[2];\n          break;\n        case 1:\n          ref1 = [q, v, p], r = ref1[0], g = ref1[1], b = ref1[2];\n          break;\n        case 2:\n          ref2 = [p, v, t], r = ref2[0], g = ref2[1], b = ref2[2];\n          break;\n        case 3:\n          ref3 = [p, q, v], r = ref3[0], g = ref3[1], b = ref3[2];\n          break;\n        case 4:\n          ref4 = [t, p, v], r = ref4[0], g = ref4[1], b = ref4[2];\n          break;\n        case 5:\n          ref5 = [v, p, q], r = ref5[0], g = ref5[1], b = ref5[2];\n      }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hcg = function() {\n    var _g, b, c, delta, g, h, min, r, ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    min = Math.min(r, g, b);\n    max = Math.max(r, g, b);\n    delta = max - min;\n    c = delta * 100 / 255;\n    _g = min / (255 - delta) * 100;\n    if (delta === 0) {\n      h = Number.NaN;\n    } else {\n      if (r === max) {\n        h = (g - b) / delta;\n      }\n      if (g === max) {\n        h = 2 + (b - r) / delta;\n      }\n      if (b === max) {\n        h = 4 + (r - g) / delta;\n      }\n      h *= 60;\n      if (h < 0) {\n        h += 360;\n      }\n    }\n    return [h, c, _g];\n  };\n\n  chroma.hcg = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hcg']), function(){});\n  };\n\n  _input.hcg = hcg2rgb;\n\n  Color.prototype.hcg = function() {\n    return rgb2hcg(this._rgb);\n  };\n\n  css2rgb = function(css) {\n    var aa, ab, hsl, i, m, o, rgb, w;\n    css = css.toLowerCase();\n    if ((chroma.colors != null) && chroma.colors[css]) {\n      return hex2rgb(chroma.colors[css]);\n    }\n    if (m = css.match(/rgb\\(\\s*(\\-?\\d+),\\s*(\\-?\\d+)\\s*,\\s*(\\-?\\d+)\\s*\\)/)) {\n      rgb = m.slice(1, 4);\n      for (i = o = 0; o <= 2; i = ++o) {\n        rgb[i] = +rgb[i];\n      }\n      rgb[3] = 1;\n    } else if (m = css.match(/rgba\\(\\s*(\\-?\\d+),\\s*(\\-?\\d+)\\s*,\\s*(\\-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      rgb = m.slice(1, 5);\n      for (i = w = 0; w <= 3; i = ++w) {\n        rgb[i] = +rgb[i];\n      }\n    } else if (m = css.match(/rgb\\(\\s*(\\-?\\d+(?:\\.\\d+)?)%,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*\\)/)) {\n      rgb = m.slice(1, 4);\n      for (i = aa = 0; aa <= 2; i = ++aa) {\n        rgb[i] = round(rgb[i] * 2.55);\n      }\n      rgb[3] = 1;\n    } else if (m = css.match(/rgba\\(\\s*(\\-?\\d+(?:\\.\\d+)?)%,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      rgb = m.slice(1, 5);\n      for (i = ab = 0; ab <= 2; i = ++ab) {\n        rgb[i] = round(rgb[i] * 2.55);\n      }\n      rgb[3] = +rgb[3];\n    } else if (m = css.match(/hsl\\(\\s*(\\-?\\d+(?:\\.\\d+)?),\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*\\)/)) {\n      hsl = m.slice(1, 4);\n      hsl[1] *= 0.01;\n      hsl[2] *= 0.01;\n      rgb = hsl2rgb(hsl);\n      rgb[3] = 1;\n    } else if (m = css.match(/hsla\\(\\s*(\\-?\\d+(?:\\.\\d+)?),\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(\\-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)/)) {\n      hsl = m.slice(1, 4);\n      hsl[1] *= 0.01;\n      hsl[2] *= 0.01;\n      rgb = hsl2rgb(hsl);\n      rgb[3] = +m[4];\n    }\n    return rgb;\n  };\n\n  rgb2css = function(rgba) {\n    var mode;\n    mode = rgba[3] < 1 ? 'rgba' : 'rgb';\n    if (mode === 'rgb') {\n      return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ')';\n    } else if (mode === 'rgba') {\n      return mode + '(' + rgba.slice(0, 3).map(round).join(',') + ',' + rgba[3] + ')';\n    } else {\n\n    }\n  };\n\n  rnd = function(a) {\n    return round(a * 100) / 100;\n  };\n\n  hsl2css = function(hsl, alpha) {\n    var mode;\n    mode = alpha < 1 ? 'hsla' : 'hsl';\n    hsl[0] = rnd(hsl[0] || 0);\n    hsl[1] = rnd(hsl[1] * 100) + '%';\n    hsl[2] = rnd(hsl[2] * 100) + '%';\n    if (mode === 'hsla') {\n      hsl[3] = alpha;\n    }\n    return mode + '(' + hsl.join(',') + ')';\n  };\n\n  _input.css = function(h) {\n    return css2rgb(h);\n  };\n\n  chroma.css = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['css']), function(){});\n  };\n\n  Color.prototype.css = function(mode) {\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    if (mode.slice(0, 3) === 'rgb') {\n      return rgb2css(this._rgb);\n    } else if (mode.slice(0, 3) === 'hsl') {\n      return hsl2css(this.hsl(), this.alpha());\n    }\n  };\n\n  _input.named = function(name) {\n    return hex2rgb(w3cx11[name]);\n  };\n\n  _guess_formats.push({\n    p: 5,\n    test: function(n) {\n      if (arguments.length === 1 && (w3cx11[n] != null)) {\n        return 'named';\n      }\n    }\n  });\n\n  Color.prototype.name = function(n) {\n    var h, k;\n    if (arguments.length) {\n      if (w3cx11[n]) {\n        this._rgb = hex2rgb(w3cx11[n]);\n      }\n      this._rgb[3] = 1;\n      this;\n    }\n    h = this.hex('rgb');\n    for (k in w3cx11) {\n      if (h === w3cx11[k]) {\n        return k;\n      }\n    }\n    return h;\n  };\n\n  lch2lab = function() {\n\n    /*\n    Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n    These formulas were invented by David Dalrymple to obtain maximum contrast without going\n    out of gamut if the parameters are in the range 0-1.\n    \n    A saturation multiplier was added by Gregor Aisch\n     */\n    var c, h, l, ref;\n    ref = unpack(arguments), l = ref[0], c = ref[1], h = ref[2];\n    h = h * DEG2RAD;\n    return [l, cos(h) * c, sin(h) * c];\n  };\n\n  lch2rgb = function() {\n    var L, a, args, b, c, g, h, l, r, ref, ref1;\n    args = unpack(arguments);\n    l = args[0], c = args[1], h = args[2];\n    ref = lch2lab(l, c, h), L = ref[0], a = ref[1], b = ref[2];\n    ref1 = lab2rgb(L, a, b), r = ref1[0], g = ref1[1], b = ref1[2];\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n  };\n\n  lab2lch = function() {\n    var a, b, c, h, l, ref;\n    ref = unpack(arguments), l = ref[0], a = ref[1], b = ref[2];\n    c = sqrt(a * a + b * b);\n    h = (atan2(b, a) * RAD2DEG + 360) % 360;\n    if (round(c * 10000) === 0) {\n      h = Number.NaN;\n    }\n    return [l, c, h];\n  };\n\n  rgb2lch = function() {\n    var a, b, g, l, r, ref, ref1;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    ref1 = rgb2lab(r, g, b), l = ref1[0], a = ref1[1], b = ref1[2];\n    return lab2lch(l, a, b);\n  };\n\n  chroma.lch = function() {\n    var args;\n    args = unpack(arguments);\n    return new Color(args, 'lch');\n  };\n\n  chroma.hcl = function() {\n    var args;\n    args = unpack(arguments);\n    return new Color(args, 'hcl');\n  };\n\n  _input.lch = lch2rgb;\n\n  _input.hcl = function() {\n    var c, h, l, ref;\n    ref = unpack(arguments), h = ref[0], c = ref[1], l = ref[2];\n    return lch2rgb([l, c, h]);\n  };\n\n  Color.prototype.lch = function() {\n    return rgb2lch(this._rgb);\n  };\n\n  Color.prototype.hcl = function() {\n    return rgb2lch(this._rgb).reverse();\n  };\n\n  rgb2cmyk = function(mode) {\n    var b, c, f, g, k, m, r, ref, y;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = r / 255;\n    g = g / 255;\n    b = b / 255;\n    k = 1 - Math.max(r, Math.max(g, b));\n    f = k < 1 ? 1 / (1 - k) : 0;\n    c = (1 - r - k) * f;\n    m = (1 - g - k) * f;\n    y = (1 - b - k) * f;\n    return [c, m, y, k];\n  };\n\n  cmyk2rgb = function() {\n    var alpha, args, b, c, g, k, m, r, y;\n    args = unpack(arguments);\n    c = args[0], m = args[1], y = args[2], k = args[3];\n    alpha = args.length > 4 ? args[4] : 1;\n    if (k === 1) {\n      return [0, 0, 0, alpha];\n    }\n    r = c >= 1 ? 0 : 255 * (1 - c) * (1 - k);\n    g = m >= 1 ? 0 : 255 * (1 - m) * (1 - k);\n    b = y >= 1 ? 0 : 255 * (1 - y) * (1 - k);\n    return [r, g, b, alpha];\n  };\n\n  _input.cmyk = function() {\n    return cmyk2rgb(unpack(arguments));\n  };\n\n  chroma.cmyk = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['cmyk']), function(){});\n  };\n\n  Color.prototype.cmyk = function() {\n    return rgb2cmyk(this._rgb);\n  };\n\n  _input.gl = function() {\n    var i, k, o, rgb, v;\n    rgb = (function() {\n      var ref, results;\n      ref = unpack(arguments);\n      results = [];\n      for (k in ref) {\n        v = ref[k];\n        results.push(v);\n      }\n      return results;\n    }).apply(this, arguments);\n    for (i = o = 0; o <= 2; i = ++o) {\n      rgb[i] *= 255;\n    }\n    return rgb;\n  };\n\n  chroma.gl = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['gl']), function(){});\n  };\n\n  Color.prototype.gl = function() {\n    var rgb;\n    rgb = this._rgb;\n    return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n  };\n\n  rgb2luminance = function(r, g, b) {\n    var ref;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    r = luminance_x(r);\n    g = luminance_x(g);\n    b = luminance_x(b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  };\n\n  luminance_x = function(x) {\n    x /= 255;\n    if (x <= 0.03928) {\n      return x / 12.92;\n    } else {\n      return pow((x + 0.055) / 1.055, 2.4);\n    }\n  };\n\n  interpolate_rgb = function(col1, col2, f, m) {\n    var xyz0, xyz1;\n    xyz0 = col1._rgb;\n    xyz1 = col2._rgb;\n    return new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m);\n  };\n\n  _interpolators.push(['rgb', interpolate_rgb]);\n\n  Color.prototype.luminance = function(lum, mode) {\n    var cur_lum, eps, max_iter, rgba, test;\n    if (mode == null) {\n      mode = 'rgb';\n    }\n    if (!arguments.length) {\n      return rgb2luminance(this._rgb);\n    }\n    rgba = this._rgb;\n    if (lum === 0) {\n      rgba = [0, 0, 0, this._rgb[3]];\n    } else if (lum === 1) {\n      rgba = [255, 255, 255, this[3]];\n    } else {\n      cur_lum = rgb2luminance(this._rgb);\n      eps = 1e-7;\n      max_iter = 20;\n      test = function(l, h) {\n        var lm, m;\n        m = l.interpolate(h, 0.5, mode);\n        lm = m.luminance();\n        if (Math.abs(lum - lm) < eps || !max_iter--) {\n          return m;\n        }\n        if (lm > lum) {\n          return test(l, m);\n        }\n        return test(m, h);\n      };\n      if (cur_lum > lum) {\n        rgba = test(chroma('black'), this).rgba();\n      } else {\n        rgba = test(this, chroma('white')).rgba();\n      }\n    }\n    return chroma(rgba).alpha(this.alpha());\n  };\n\n  temperature2rgb = function(kelvin) {\n    var b, g, r, temp;\n    temp = kelvin / 100;\n    if (temp < 66) {\n      r = 255;\n      g = -155.25485562709179 - 0.44596950469579133 * (g = temp - 2) + 104.49216199393888 * log(g);\n      b = temp < 20 ? 0 : -254.76935184120902 + 0.8274096064007395 * (b = temp - 10) + 115.67994401066147 * log(b);\n    } else {\n      r = 351.97690566805693 + 0.114206453784165 * (r = temp - 55) - 40.25366309332127 * log(r);\n      g = 325.4494125711974 + 0.07943456536662342 * (g = temp - 50) - 28.0852963507957 * log(g);\n      b = 255;\n    }\n    return [r, g, b];\n  };\n\n  rgb2temperature = function() {\n    var b, eps, g, maxTemp, minTemp, r, ref, rgb, temp;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    minTemp = 1000;\n    maxTemp = 40000;\n    eps = 0.4;\n    while (maxTemp - minTemp > eps) {\n      temp = (maxTemp + minTemp) * 0.5;\n      rgb = temperature2rgb(temp);\n      if ((rgb[2] / rgb[0]) >= (b / r)) {\n        maxTemp = temp;\n      } else {\n        minTemp = temp;\n      }\n    }\n    return round(temp);\n  };\n\n  chroma.temperature = chroma.kelvin = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['temperature']), function(){});\n  };\n\n  _input.temperature = _input.kelvin = _input.K = temperature2rgb;\n\n  Color.prototype.temperature = function() {\n    return rgb2temperature(this._rgb);\n  };\n\n  Color.prototype.kelvin = Color.prototype.temperature;\n\n  chroma.contrast = function(a, b) {\n    var l1, l2, ref, ref1;\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    l1 = a.luminance();\n    l2 = b.luminance();\n    if (l1 > l2) {\n      return (l1 + 0.05) / (l2 + 0.05);\n    } else {\n      return (l2 + 0.05) / (l1 + 0.05);\n    }\n  };\n\n  chroma.distance = function(a, b, mode) {\n    var d, i, l1, l2, ref, ref1, sum_sq;\n    if (mode == null) {\n      mode = 'lab';\n    }\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    l1 = a.get(mode);\n    l2 = b.get(mode);\n    sum_sq = 0;\n    for (i in l1) {\n      d = (l1[i] || 0) - (l2[i] || 0);\n      sum_sq += d * d;\n    }\n    return Math.sqrt(sum_sq);\n  };\n\n  chroma.deltaE = function(a, b, L, C) {\n    var L1, L2, a1, a2, b1, b2, c1, c2, c4, dH2, delA, delB, delC, delL, f, h1, ref, ref1, ref2, ref3, sc, sh, sl, t, v1, v2, v3;\n    if (L == null) {\n      L = 1;\n    }\n    if (C == null) {\n      C = 1;\n    }\n    if ((ref = type(a)) === 'string' || ref === 'number') {\n      a = new Color(a);\n    }\n    if ((ref1 = type(b)) === 'string' || ref1 === 'number') {\n      b = new Color(b);\n    }\n    ref2 = a.lab(), L1 = ref2[0], a1 = ref2[1], b1 = ref2[2];\n    ref3 = b.lab(), L2 = ref3[0], a2 = ref3[1], b2 = ref3[2];\n    c1 = sqrt(a1 * a1 + b1 * b1);\n    c2 = sqrt(a2 * a2 + b2 * b2);\n    sl = L1 < 16.0 ? 0.511 : (0.040975 * L1) / (1.0 + 0.01765 * L1);\n    sc = (0.0638 * c1) / (1.0 + 0.0131 * c1) + 0.638;\n    h1 = c1 < 0.000001 ? 0.0 : (atan2(b1, a1) * 180.0) / PI;\n    while (h1 < 0) {\n      h1 += 360;\n    }\n    while (h1 >= 360) {\n      h1 -= 360;\n    }\n    t = (h1 >= 164.0) && (h1 <= 345.0) ? 0.56 + abs(0.2 * cos((PI * (h1 + 168.0)) / 180.0)) : 0.36 + abs(0.4 * cos((PI * (h1 + 35.0)) / 180.0));\n    c4 = c1 * c1 * c1 * c1;\n    f = sqrt(c4 / (c4 + 1900.0));\n    sh = sc * (f * t + 1.0 - f);\n    delL = L1 - L2;\n    delC = c1 - c2;\n    delA = a1 - a2;\n    delB = b1 - b2;\n    dH2 = delA * delA + delB * delB - delC * delC;\n    v1 = delL / (L * sl);\n    v2 = delC / (C * sc);\n    v3 = sh;\n    return sqrt(v1 * v1 + v2 * v2 + (dH2 / (v3 * v3)));\n  };\n\n  Color.prototype.get = function(modechan) {\n    var channel, i, me, mode, ref, src;\n    me = this;\n    ref = modechan.split('.'), mode = ref[0], channel = ref[1];\n    src = me[mode]();\n    if (channel) {\n      i = mode.indexOf(channel);\n      if (i > -1) {\n        return src[i];\n      } else {\n        return console.warn('unknown channel ' + channel + ' in mode ' + mode);\n      }\n    } else {\n      return src;\n    }\n  };\n\n  Color.prototype.set = function(modechan, value) {\n    var channel, i, me, mode, ref, src;\n    me = this;\n    ref = modechan.split('.'), mode = ref[0], channel = ref[1];\n    if (channel) {\n      src = me[mode]();\n      i = mode.indexOf(channel);\n      if (i > -1) {\n        if (type(value) === 'string') {\n          switch (value.charAt(0)) {\n            case '+':\n              src[i] += +value;\n              break;\n            case '-':\n              src[i] += +value;\n              break;\n            case '*':\n              src[i] *= +(value.substr(1));\n              break;\n            case '/':\n              src[i] /= +(value.substr(1));\n              break;\n            default:\n              src[i] = +value;\n          }\n        } else {\n          src[i] = value;\n        }\n      } else {\n        console.warn('unknown channel ' + channel + ' in mode ' + mode);\n      }\n    } else {\n      src = value;\n    }\n    return chroma(src, mode).alpha(me.alpha());\n  };\n\n  Color.prototype.clipped = function() {\n    return this._rgb._clipped || false;\n  };\n\n  Color.prototype.alpha = function(a) {\n    if (arguments.length) {\n      return chroma.rgb([this._rgb[0], this._rgb[1], this._rgb[2], a]);\n    }\n    return this._rgb[3];\n  };\n\n  Color.prototype.darken = function(amount) {\n    var lab, me;\n    if (amount == null) {\n      amount = 1;\n    }\n    me = this;\n    lab = me.lab();\n    lab[0] -= LAB_CONSTANTS.Kn * amount;\n    return chroma.lab(lab).alpha(me.alpha());\n  };\n\n  Color.prototype.brighten = function(amount) {\n    if (amount == null) {\n      amount = 1;\n    }\n    return this.darken(-amount);\n  };\n\n  Color.prototype.darker = Color.prototype.darken;\n\n  Color.prototype.brighter = Color.prototype.brighten;\n\n  Color.prototype.saturate = function(amount) {\n    var lch, me;\n    if (amount == null) {\n      amount = 1;\n    }\n    me = this;\n    lch = me.lch();\n    lch[1] += amount * LAB_CONSTANTS.Kn;\n    if (lch[1] < 0) {\n      lch[1] = 0;\n    }\n    return chroma.lch(lch).alpha(me.alpha());\n  };\n\n  Color.prototype.desaturate = function(amount) {\n    if (amount == null) {\n      amount = 1;\n    }\n    return this.saturate(-amount);\n  };\n\n  Color.prototype.premultiply = function() {\n    var a, rgb;\n    rgb = this.rgb();\n    a = this.alpha();\n    return chroma(rgb[0] * a, rgb[1] * a, rgb[2] * a, a);\n  };\n\n  blend = function(bottom, top, mode) {\n    if (!blend[mode]) {\n      throw 'unknown blend mode ' + mode;\n    }\n    return blend[mode](bottom, top);\n  };\n\n  blend_f = function(f) {\n    return function(bottom, top) {\n      var c0, c1;\n      c0 = chroma(top).rgb();\n      c1 = chroma(bottom).rgb();\n      return chroma(f(c0, c1), 'rgb');\n    };\n  };\n\n  each = function(f) {\n    return function(c0, c1) {\n      var i, o, out;\n      out = [];\n      for (i = o = 0; o <= 3; i = ++o) {\n        out[i] = f(c0[i], c1[i]);\n      }\n      return out;\n    };\n  };\n\n  normal = function(a, b) {\n    return a;\n  };\n\n  multiply = function(a, b) {\n    return a * b / 255;\n  };\n\n  darken = function(a, b) {\n    if (a > b) {\n      return b;\n    } else {\n      return a;\n    }\n  };\n\n  lighten = function(a, b) {\n    if (a > b) {\n      return a;\n    } else {\n      return b;\n    }\n  };\n\n  screen = function(a, b) {\n    return 255 * (1 - (1 - a / 255) * (1 - b / 255));\n  };\n\n  overlay = function(a, b) {\n    if (b < 128) {\n      return 2 * a * b / 255;\n    } else {\n      return 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\n    }\n  };\n\n  burn = function(a, b) {\n    return 255 * (1 - (1 - b / 255) / (a / 255));\n  };\n\n  dodge = function(a, b) {\n    if (a === 255) {\n      return 255;\n    }\n    a = 255 * (b / 255) / (1 - a / 255);\n    if (a > 255) {\n      return 255;\n    } else {\n      return a;\n    }\n  };\n\n  blend.normal = blend_f(each(normal));\n\n  blend.multiply = blend_f(each(multiply));\n\n  blend.screen = blend_f(each(screen));\n\n  blend.overlay = blend_f(each(overlay));\n\n  blend.darken = blend_f(each(darken));\n\n  blend.lighten = blend_f(each(lighten));\n\n  blend.dodge = blend_f(each(dodge));\n\n  blend.burn = blend_f(each(burn));\n\n  chroma.blend = blend;\n\n  chroma.analyze = function(data) {\n    var len, o, r, val;\n    r = {\n      min: Number.MAX_VALUE,\n      max: Number.MAX_VALUE * -1,\n      sum: 0,\n      values: [],\n      count: 0\n    };\n    for (o = 0, len = data.length; o < len; o++) {\n      val = data[o];\n      if ((val != null) && !isNaN(val)) {\n        r.values.push(val);\n        r.sum += val;\n        if (val < r.min) {\n          r.min = val;\n        }\n        if (val > r.max) {\n          r.max = val;\n        }\n        r.count += 1;\n      }\n    }\n    r.domain = [r.min, r.max];\n    r.limits = function(mode, num) {\n      return chroma.limits(r, mode, num);\n    };\n    return r;\n  };\n\n  chroma.scale = function(colors, positions) {\n    var _classes, _colorCache, _colors, _correctLightness, _domain, _fixed, _gamma, _max, _min, _mode, _nacol, _out, _padding, _pos, _spread, _useCache, classifyValue, f, getClass, getColor, resetCache, setColors, tmap;\n    _mode = 'rgb';\n    _nacol = chroma('#ccc');\n    _spread = 0;\n    _fixed = false;\n    _domain = [0, 1];\n    _pos = [];\n    _padding = [0, 0];\n    _classes = false;\n    _colors = [];\n    _out = false;\n    _min = 0;\n    _max = 1;\n    _correctLightness = false;\n    _colorCache = {};\n    _useCache = true;\n    _gamma = 1;\n    setColors = function(colors) {\n      var c, col, o, ref, ref1, w;\n      if (colors == null) {\n        colors = ['#fff', '#000'];\n      }\n      if ((colors != null) && type(colors) === 'string' && (chroma.brewer != null)) {\n        colors = chroma.brewer[colors] || chroma.brewer[colors.toLowerCase()] || colors;\n      }\n      if (type(colors) === 'array') {\n        if (colors.length === 1) {\n          colors = [colors[0], colors[0]];\n        }\n        colors = colors.slice(0);\n        for (c = o = 0, ref = colors.length - 1; 0 <= ref ? o <= ref : o >= ref; c = 0 <= ref ? ++o : --o) {\n          col = colors[c];\n          if (type(col) === \"string\") {\n            colors[c] = chroma(col);\n          }\n        }\n        _pos.length = 0;\n        for (c = w = 0, ref1 = colors.length - 1; 0 <= ref1 ? w <= ref1 : w >= ref1; c = 0 <= ref1 ? ++w : --w) {\n          _pos.push(c / (colors.length - 1));\n        }\n      }\n      resetCache();\n      return _colors = colors;\n    };\n    getClass = function(value) {\n      var i, n;\n      if (_classes != null) {\n        n = _classes.length - 1;\n        i = 0;\n        while (i < n && value >= _classes[i]) {\n          i++;\n        }\n        return i - 1;\n      }\n      return 0;\n    };\n    tmap = function(t) {\n      return t;\n    };\n    classifyValue = function(value) {\n      var i, maxc, minc, n, val;\n      val = value;\n      if (_classes.length > 2) {\n        n = _classes.length - 1;\n        i = getClass(value);\n        minc = _classes[0] + (_classes[1] - _classes[0]) * (0 + _spread * 0.5);\n        maxc = _classes[n - 1] + (_classes[n] - _classes[n - 1]) * (1 - _spread * 0.5);\n        val = _min + ((_classes[i] + (_classes[i + 1] - _classes[i]) * 0.5 - minc) / (maxc - minc)) * (_max - _min);\n      }\n      return val;\n    };\n    getColor = function(val, bypassMap) {\n      var c, col, i, k, o, p, ref, t;\n      if (bypassMap == null) {\n        bypassMap = false;\n      }\n      if (isNaN(val) || val === null) {\n        return _nacol;\n      }\n      if (!bypassMap) {\n        if (_classes && _classes.length > 2) {\n          c = getClass(val);\n          t = c / (_classes.length - 2);\n        } else if (_max !== _min) {\n          t = (val - _min) / (_max - _min);\n        } else {\n          t = 1;\n        }\n      } else {\n        t = val;\n      }\n      if (!bypassMap) {\n        t = tmap(t);\n      }\n      if (_gamma !== 1) {\n        t = pow(t, _gamma);\n      }\n      t = _padding[0] + (t * (1 - _padding[0] - _padding[1]));\n      t = Math.min(1, Math.max(0, t));\n      k = Math.floor(t * 10000);\n      if (_useCache && _colorCache[k]) {\n        col = _colorCache[k];\n      } else {\n        if (type(_colors) === 'array') {\n          for (i = o = 0, ref = _pos.length - 1; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) {\n            p = _pos[i];\n            if (t <= p) {\n              col = _colors[i];\n              break;\n            }\n            if (t >= p && i === _pos.length - 1) {\n              col = _colors[i];\n              break;\n            }\n            if (t > p && t < _pos[i + 1]) {\n              t = (t - p) / (_pos[i + 1] - p);\n              col = chroma.interpolate(_colors[i], _colors[i + 1], t, _mode);\n              break;\n            }\n          }\n        } else if (type(_colors) === 'function') {\n          col = _colors(t);\n        }\n        if (_useCache) {\n          _colorCache[k] = col;\n        }\n      }\n      return col;\n    };\n    resetCache = function() {\n      return _colorCache = {};\n    };\n    setColors(colors);\n    f = function(v) {\n      var c;\n      c = chroma(getColor(v));\n      if (_out && c[_out]) {\n        return c[_out]();\n      } else {\n        return c;\n      }\n    };\n    f.classes = function(classes) {\n      var d;\n      if (classes != null) {\n        if (type(classes) === 'array') {\n          _classes = classes;\n          _domain = [classes[0], classes[classes.length - 1]];\n        } else {\n          d = chroma.analyze(_domain);\n          if (classes === 0) {\n            _classes = [d.min, d.max];\n          } else {\n            _classes = chroma.limits(d, 'e', classes);\n          }\n        }\n        return f;\n      }\n      return _classes;\n    };\n    f.domain = function(domain) {\n      var c, d, k, len, o, ref, w;\n      if (!arguments.length) {\n        return _domain;\n      }\n      _min = domain[0];\n      _max = domain[domain.length - 1];\n      _pos = [];\n      k = _colors.length;\n      if (domain.length === k && _min !== _max) {\n        for (o = 0, len = domain.length; o < len; o++) {\n          d = domain[o];\n          _pos.push((d - _min) / (_max - _min));\n        }\n      } else {\n        for (c = w = 0, ref = k - 1; 0 <= ref ? w <= ref : w >= ref; c = 0 <= ref ? ++w : --w) {\n          _pos.push(c / (k - 1));\n        }\n      }\n      _domain = [_min, _max];\n      return f;\n    };\n    f.mode = function(_m) {\n      if (!arguments.length) {\n        return _mode;\n      }\n      _mode = _m;\n      resetCache();\n      return f;\n    };\n    f.range = function(colors, _pos) {\n      setColors(colors, _pos);\n      return f;\n    };\n    f.out = function(_o) {\n      _out = _o;\n      return f;\n    };\n    f.spread = function(val) {\n      if (!arguments.length) {\n        return _spread;\n      }\n      _spread = val;\n      return f;\n    };\n    f.correctLightness = function(v) {\n      if (v == null) {\n        v = true;\n      }\n      _correctLightness = v;\n      resetCache();\n      if (_correctLightness) {\n        tmap = function(t) {\n          var L0, L1, L_actual, L_diff, L_ideal, max_iter, pol, t0, t1;\n          L0 = getColor(0, true).lab()[0];\n          L1 = getColor(1, true).lab()[0];\n          pol = L0 > L1;\n          L_actual = getColor(t, true).lab()[0];\n          L_ideal = L0 + (L1 - L0) * t;\n          L_diff = L_actual - L_ideal;\n          t0 = 0;\n          t1 = 1;\n          max_iter = 20;\n          while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n            (function() {\n              if (pol) {\n                L_diff *= -1;\n              }\n              if (L_diff < 0) {\n                t0 = t;\n                t += (t1 - t) * 0.5;\n              } else {\n                t1 = t;\n                t += (t0 - t) * 0.5;\n              }\n              L_actual = getColor(t, true).lab()[0];\n              return L_diff = L_actual - L_ideal;\n            })();\n          }\n          return t;\n        };\n      } else {\n        tmap = function(t) {\n          return t;\n        };\n      }\n      return f;\n    };\n    f.padding = function(p) {\n      if (p != null) {\n        if (type(p) === 'number') {\n          p = [p, p];\n        }\n        _padding = p;\n        return f;\n      } else {\n        return _padding;\n      }\n    };\n    f.colors = function(numColors, out) {\n      var dd, dm, i, o, ref, result, results, samples, w;\n      if (arguments.length < 2) {\n        out = 'hex';\n      }\n      result = [];\n      if (arguments.length === 0) {\n        result = _colors.slice(0);\n      } else if (numColors === 1) {\n        result = [f(0.5)];\n      } else if (numColors > 1) {\n        dm = _domain[0];\n        dd = _domain[1] - dm;\n        result = (function() {\n          results = [];\n          for (var o = 0; 0 <= numColors ? o < numColors : o > numColors; 0 <= numColors ? o++ : o--){ results.push(o); }\n          return results;\n        }).apply(this).map(function(i) {\n          return f(dm + i / (numColors - 1) * dd);\n        });\n      } else {\n        colors = [];\n        samples = [];\n        if (_classes && _classes.length > 2) {\n          for (i = w = 1, ref = _classes.length; 1 <= ref ? w < ref : w > ref; i = 1 <= ref ? ++w : --w) {\n            samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n          }\n        } else {\n          samples = _domain;\n        }\n        result = samples.map(function(v) {\n          return f(v);\n        });\n      }\n      if (chroma[out]) {\n        result = result.map(function(c) {\n          return c[out]();\n        });\n      }\n      return result;\n    };\n    f.cache = function(c) {\n      if (c != null) {\n        _useCache = c;\n        return f;\n      } else {\n        return _useCache;\n      }\n    };\n    f.gamma = function(g) {\n      if (g != null) {\n        _gamma = g;\n        return f;\n      } else {\n        return _gamma;\n      }\n    };\n    f.nodata = function(d) {\n      if (d != null) {\n        _nacol = chroma(d);\n        return f;\n      } else {\n        return _nacol;\n      }\n    };\n    return f;\n  };\n\n  if (chroma.scales == null) {\n    chroma.scales = {};\n  }\n\n  chroma.scales.cool = function() {\n    return chroma.scale([chroma.hsl(180, 1, .9), chroma.hsl(250, .7, .4)]);\n  };\n\n  chroma.scales.hot = function() {\n    return chroma.scale(['#000', '#f00', '#ff0', '#fff'], [0, .25, .75, 1]).mode('rgb');\n  };\n\n  chroma.analyze = function(data, key, filter) {\n    var add, k, len, o, r, val, visit;\n    r = {\n      min: Number.MAX_VALUE,\n      max: Number.MAX_VALUE * -1,\n      sum: 0,\n      values: [],\n      count: 0\n    };\n    if (filter == null) {\n      filter = function() {\n        return true;\n      };\n    }\n    add = function(val) {\n      if ((val != null) && !isNaN(val)) {\n        r.values.push(val);\n        r.sum += val;\n        if (val < r.min) {\n          r.min = val;\n        }\n        if (val > r.max) {\n          r.max = val;\n        }\n        r.count += 1;\n      }\n    };\n    visit = function(val, k) {\n      if (filter(val, k)) {\n        if ((key != null) && type(key) === 'function') {\n          return add(key(val));\n        } else if ((key != null) && type(key) === 'string' || type(key) === 'number') {\n          return add(val[key]);\n        } else {\n          return add(val);\n        }\n      }\n    };\n    if (type(data) === 'array') {\n      for (o = 0, len = data.length; o < len; o++) {\n        val = data[o];\n        visit(val);\n      }\n    } else {\n      for (k in data) {\n        val = data[k];\n        visit(val, k);\n      }\n    }\n    r.domain = [r.min, r.max];\n    r.limits = function(mode, num) {\n      return chroma.limits(r, mode, num);\n    };\n    return r;\n  };\n\n  chroma.limits = function(data, mode, num) {\n    var aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, assignments, best, centroids, cluster, clusterSizes, dist, i, j, kClusters, limits, max_log, min, min_log, mindist, n, nb_iters, newCentroids, o, p, pb, pr, ref, ref1, ref10, ref11, ref12, ref13, ref14, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, repeat, sum, tmpKMeansBreaks, v, value, values, w;\n    if (mode == null) {\n      mode = 'equal';\n    }\n    if (num == null) {\n      num = 7;\n    }\n    if (type(data) === 'array') {\n      data = chroma.analyze(data);\n    }\n    min = data.min;\n    max = data.max;\n    sum = data.sum;\n    values = data.values.sort(function(a, b) {\n      return a - b;\n    });\n    if (num === 1) {\n      return [min, max];\n    }\n    limits = [];\n    if (mode.substr(0, 1) === 'c') {\n      limits.push(min);\n      limits.push(max);\n    }\n    if (mode.substr(0, 1) === 'e') {\n      limits.push(min);\n      for (i = o = 1, ref = num - 1; 1 <= ref ? o <= ref : o >= ref; i = 1 <= ref ? ++o : --o) {\n        limits.push(min + (i / num) * (max - min));\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'l') {\n      if (min <= 0) {\n        throw 'Logarithmic scales are only possible for values > 0';\n      }\n      min_log = Math.LOG10E * log(min);\n      max_log = Math.LOG10E * log(max);\n      limits.push(min);\n      for (i = w = 1, ref1 = num - 1; 1 <= ref1 ? w <= ref1 : w >= ref1; i = 1 <= ref1 ? ++w : --w) {\n        limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'q') {\n      limits.push(min);\n      for (i = aa = 1, ref2 = num - 1; 1 <= ref2 ? aa <= ref2 : aa >= ref2; i = 1 <= ref2 ? ++aa : --aa) {\n        p = (values.length - 1) * i / num;\n        pb = floor(p);\n        if (pb === p) {\n          limits.push(values[pb]);\n        } else {\n          pr = p - pb;\n          limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n        }\n      }\n      limits.push(max);\n    } else if (mode.substr(0, 1) === 'k') {\n\n      /*\n      implementation based on\n      http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n      simplified for 1-d input values\n       */\n      n = values.length;\n      assignments = new Array(n);\n      clusterSizes = new Array(num);\n      repeat = true;\n      nb_iters = 0;\n      centroids = null;\n      centroids = [];\n      centroids.push(min);\n      for (i = ab = 1, ref3 = num - 1; 1 <= ref3 ? ab <= ref3 : ab >= ref3; i = 1 <= ref3 ? ++ab : --ab) {\n        centroids.push(min + (i / num) * (max - min));\n      }\n      centroids.push(max);\n      while (repeat) {\n        for (j = ac = 0, ref4 = num - 1; 0 <= ref4 ? ac <= ref4 : ac >= ref4; j = 0 <= ref4 ? ++ac : --ac) {\n          clusterSizes[j] = 0;\n        }\n        for (i = ad = 0, ref5 = n - 1; 0 <= ref5 ? ad <= ref5 : ad >= ref5; i = 0 <= ref5 ? ++ad : --ad) {\n          value = values[i];\n          mindist = Number.MAX_VALUE;\n          for (j = ae = 0, ref6 = num - 1; 0 <= ref6 ? ae <= ref6 : ae >= ref6; j = 0 <= ref6 ? ++ae : --ae) {\n            dist = abs(centroids[j] - value);\n            if (dist < mindist) {\n              mindist = dist;\n              best = j;\n            }\n          }\n          clusterSizes[best]++;\n          assignments[i] = best;\n        }\n        newCentroids = new Array(num);\n        for (j = af = 0, ref7 = num - 1; 0 <= ref7 ? af <= ref7 : af >= ref7; j = 0 <= ref7 ? ++af : --af) {\n          newCentroids[j] = null;\n        }\n        for (i = ag = 0, ref8 = n - 1; 0 <= ref8 ? ag <= ref8 : ag >= ref8; i = 0 <= ref8 ? ++ag : --ag) {\n          cluster = assignments[i];\n          if (newCentroids[cluster] === null) {\n            newCentroids[cluster] = values[i];\n          } else {\n            newCentroids[cluster] += values[i];\n          }\n        }\n        for (j = ah = 0, ref9 = num - 1; 0 <= ref9 ? ah <= ref9 : ah >= ref9; j = 0 <= ref9 ? ++ah : --ah) {\n          newCentroids[j] *= 1 / clusterSizes[j];\n        }\n        repeat = false;\n        for (j = ai = 0, ref10 = num - 1; 0 <= ref10 ? ai <= ref10 : ai >= ref10; j = 0 <= ref10 ? ++ai : --ai) {\n          if (newCentroids[j] !== centroids[i]) {\n            repeat = true;\n            break;\n          }\n        }\n        centroids = newCentroids;\n        nb_iters++;\n        if (nb_iters > 200) {\n          repeat = false;\n        }\n      }\n      kClusters = {};\n      for (j = aj = 0, ref11 = num - 1; 0 <= ref11 ? aj <= ref11 : aj >= ref11; j = 0 <= ref11 ? ++aj : --aj) {\n        kClusters[j] = [];\n      }\n      for (i = ak = 0, ref12 = n - 1; 0 <= ref12 ? ak <= ref12 : ak >= ref12; i = 0 <= ref12 ? ++ak : --ak) {\n        cluster = assignments[i];\n        kClusters[cluster].push(values[i]);\n      }\n      tmpKMeansBreaks = [];\n      for (j = al = 0, ref13 = num - 1; 0 <= ref13 ? al <= ref13 : al >= ref13; j = 0 <= ref13 ? ++al : --al) {\n        tmpKMeansBreaks.push(kClusters[j][0]);\n        tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n      }\n      tmpKMeansBreaks = tmpKMeansBreaks.sort(function(a, b) {\n        return a - b;\n      });\n      limits.push(tmpKMeansBreaks[0]);\n      for (i = am = 1, ref14 = tmpKMeansBreaks.length - 1; am <= ref14; i = am += 2) {\n        v = tmpKMeansBreaks[i];\n        if (!isNaN(v) && limits.indexOf(v) === -1) {\n          limits.push(v);\n        }\n      }\n    }\n    return limits;\n  };\n\n  hsi2rgb = function(h, s, i) {\n\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n     */\n    var args, b, g, r;\n    args = unpack(arguments);\n    h = args[0], s = args[1], i = args[2];\n    if (isNaN(h)) {\n      h = 0;\n    }\n    h /= 360;\n    if (h < 1 / 3) {\n      b = (1 - s) / 3;\n      r = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      g = 1 - (b + r);\n    } else if (h < 2 / 3) {\n      h -= 1 / 3;\n      r = (1 - s) / 3;\n      g = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      b = 1 - (r + g);\n    } else {\n      h -= 2 / 3;\n      g = (1 - s) / 3;\n      b = (1 + s * cos(TWOPI * h) / cos(PITHIRD - TWOPI * h)) / 3;\n      r = 1 - (g + b);\n    }\n    r = limit(i * r * 3);\n    g = limit(i * g * 3);\n    b = limit(i * b * 3);\n    return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n  };\n\n  rgb2hsi = function() {\n\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n     */\n    var b, g, h, i, min, r, ref, s;\n    ref = unpack(arguments), r = ref[0], g = ref[1], b = ref[2];\n    TWOPI = Math.PI * 2;\n    r /= 255;\n    g /= 255;\n    b /= 255;\n    min = Math.min(r, g, b);\n    i = (r + g + b) / 3;\n    s = 1 - min / i;\n    if (s === 0) {\n      h = 0;\n    } else {\n      h = ((r - g) + (r - b)) / 2;\n      h /= Math.sqrt((r - g) * (r - g) + (r - b) * (g - b));\n      h = Math.acos(h);\n      if (b > g) {\n        h = TWOPI - h;\n      }\n      h /= TWOPI;\n    }\n    return [h * 360, s, i];\n  };\n\n  chroma.hsi = function() {\n    return (function(func, args, ctor) {\n      ctor.prototype = func.prototype;\n      var child = new ctor, result = func.apply(child, args);\n      return Object(result) === result ? result : child;\n    })(Color, slice.call(arguments).concat(['hsi']), function(){});\n  };\n\n  _input.hsi = hsi2rgb;\n\n  Color.prototype.hsi = function() {\n    return rgb2hsi(this._rgb);\n  };\n\n  interpolate_hsx = function(col1, col2, f, m) {\n    var dh, hue, hue0, hue1, lbv, lbv0, lbv1, res, sat, sat0, sat1, xyz0, xyz1;\n    if (m === 'hsl') {\n      xyz0 = col1.hsl();\n      xyz1 = col2.hsl();\n    } else if (m === 'hsv') {\n      xyz0 = col1.hsv();\n      xyz1 = col2.hsv();\n    } else if (m === 'hcg') {\n      xyz0 = col1.hcg();\n      xyz1 = col2.hcg();\n    } else if (m === 'hsi') {\n      xyz0 = col1.hsi();\n      xyz1 = col2.hsi();\n    } else if (m === 'lch' || m === 'hcl') {\n      m = 'hcl';\n      xyz0 = col1.hcl();\n      xyz1 = col2.hcl();\n    }\n    if (m.substr(0, 1) === 'h') {\n      hue0 = xyz0[0], sat0 = xyz0[1], lbv0 = xyz0[2];\n      hue1 = xyz1[0], sat1 = xyz1[1], lbv1 = xyz1[2];\n    }\n    if (!isNaN(hue0) && !isNaN(hue1)) {\n      if (hue1 > hue0 && hue1 - hue0 > 180) {\n        dh = hue1 - (hue0 + 360);\n      } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n        dh = hue1 + 360 - hue0;\n      } else {\n        dh = hue1 - hue0;\n      }\n      hue = hue0 + f * dh;\n    } else if (!isNaN(hue0)) {\n      hue = hue0;\n      if ((lbv1 === 1 || lbv1 === 0) && m !== 'hsv') {\n        sat = sat0;\n      }\n    } else if (!isNaN(hue1)) {\n      hue = hue1;\n      if ((lbv0 === 1 || lbv0 === 0) && m !== 'hsv') {\n        sat = sat1;\n      }\n    } else {\n      hue = Number.NaN;\n    }\n    if (sat == null) {\n      sat = sat0 + f * (sat1 - sat0);\n    }\n    lbv = lbv0 + f * (lbv1 - lbv0);\n    return res = chroma[m](hue, sat, lbv);\n  };\n\n  _interpolators = _interpolators.concat((function() {\n    var len, o, ref, results;\n    ref = ['hsv', 'hsl', 'hsi', 'hcl', 'lch', 'hcg'];\n    results = [];\n    for (o = 0, len = ref.length; o < len; o++) {\n      m = ref[o];\n      results.push([m, interpolate_hsx]);\n    }\n    return results;\n  })());\n\n  interpolate_num = function(col1, col2, f, m) {\n    var n1, n2;\n    n1 = col1.num();\n    n2 = col2.num();\n    return chroma.num(n1 + (n2 - n1) * f, 'num');\n  };\n\n  _interpolators.push(['num', interpolate_num]);\n\n  interpolate_lab = function(col1, col2, f, m) {\n    var res, xyz0, xyz1;\n    xyz0 = col1.lab();\n    xyz1 = col2.lab();\n    return res = new Color(xyz0[0] + f * (xyz1[0] - xyz0[0]), xyz0[1] + f * (xyz1[1] - xyz0[1]), xyz0[2] + f * (xyz1[2] - xyz0[2]), m);\n  };\n\n  _interpolators.push(['lab', interpolate_lab]);\n\n}).call(this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/chroma-js/chroma.js\n// module id = 990\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { List } from 'immutable';\n\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\n\nexport default class MapAmountMenu extends React.Component<any, any> {\n\n  static propTypes = {\n    amountChoices: PropTypes.instanceOf(List).isRequired,\n    currentAmount: PropTypes.string.isRequired,\n    onSelect: PropTypes.func.isRequired\n  };\n\n  render() {\n    const { amountChoices, currentAmount, onSelect } = this.props;\n\n    return (\n      <DropdownList\n        label=\"Amount by\"\n        value={currentAmount}\n        onChange={columnName => columnName !== currentAmount && onSelect(columnName)}>\n        {amountChoices.map((column, i) => {\n          return (\n            <DropdownListItem\n              key={i}\n              value={column.get('name')}\n              title={column.get('label')} />\n          );\n        }).toArray()}\n      </DropdownList>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map_amount_menu.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { List } from 'immutable';\nimport className from 'classnames';\n\nimport { Dropdown } from '@opengov/ovid';\nimport { MapTypes, MapTypeNames } from '../../maps/map_constants';\n\nconst MapTypeToIconClassesMap = {\n  [MapTypes.Bubble.name]: [\n    'icon-map-bubble',\n  ],\n  [MapTypes.Point.name]: [\n    'icon-map-point-1',\n    'icon-map-point-2',\n    'icon-map-point-3',\n    'icon-map-point-4',\n  ],\n  [MapTypes.Heatmap.name]: [\n    'icon-map-heat-1',\n    'icon-map-heat-2',\n    'icon-map-heat-3',\n  ],\n};\n\nconst MapTypeIcon = ({ mapType }) => (\n  <div className={`ui-maptype__icon ${mapType}`}>\n    {MapTypeToIconClassesMap[mapType].map(className => (\n      <i className={className} key={className} />\n    ))}\n  </div>\n);\n\nclass MapTypeMenuListItem extends React.Component<any, any> {\n  static propTypes = {\n    value: PropTypes.any,\n    title: PropTypes.node,\n    iconClassname: PropTypes.string\n  };\n\n  _onClick = (e) => {\n    e.preventDefault();\n    if (this.props.onClick) {\n      this.props.onClick(this.props.value);\n    }\n  }\n\n  render() {\n    const { selected, title, value } = this.props;\n\n    const classNames = className('ui-maptype__option', { 'is-selected': selected });\n\n    return (\n      <li onClick={this._onClick}>\n        <button className={classNames}>\n          <MapTypeIcon mapType={value} />\n          {title}\n        </button>\n      </li>\n    );\n  }\n}\n\nexport default class MapTypeMenu extends React.Component<any, any> {\n\n  static propTypes = {\n    currentMapType: PropTypes.oneOf(MapTypeNames),\n    mapTypes: PropTypes.instanceOf(List),\n    onSelect: PropTypes.func.isRequired\n  };\n\n  renderTitle() {\n    const { currentMapType, mapTypes } = this.props;\n    return (\n      <span className=\"ui-maptype__title\">\n        <MapTypeIcon mapType={currentMapType} />\n        {mapTypes.find(mapType => mapType.get('name') == currentMapType).get('label')}\n      </span>\n    );\n  }\n\n  render() {\n    const { currentMapType, mapTypes, onSelect } = this.props;\n    return (\n      <Dropdown\n        toggleClass=\"ui-dropdown__toggle\"\n        title={this.renderTitle()}\n        label=\"Map as\">\n        <div className=\"ui-container_scroll ui-maptype__container\">\n          <ul className=\"ui-dropdown__list\">\n            {mapTypes.map((mapType, i) => {\n              return (\n                <MapTypeMenuListItem\n                  key={i}\n                  value={mapType.get('name')}\n                  title={mapType.get('label')}\n                  selected={currentMapType == mapType.get('name')}\n                  onClick={onSelect} />\n              );\n            }).toArray()}\n          </ul>\n        </div>\n      </Dropdown>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/map_type_menu.tsx","import GridReportActions from '../actions/grid_report_actions';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport cx from 'classnames';\n\nimport { translate } from 'react-i18next';\n\nclass GraphType extends React.Component<any, any> {\n  static propTypes = {\n    graphTypes: PropTypes.array.isRequired,\n    graphType: PropTypes.string.isRequired,\n    isMapEnabled: PropTypes.bool.isRequired\n  };\n\n  graphTypes = {\n    table: {\n      icon: 'ui-graphtype__table',\n      name: 'Table View'\n    },\n    line: {\n      icon: 'ui-graphtype__line',\n      name: 'Line Graph'\n    },\n    stacked: {\n      icon: 'ui-graphtype__stacked',\n      name: 'Stacked Graph'\n    },\n    horizontal_stacked: {\n      icon: 'ui-graphtype__horizontal-stack',\n      name: 'Horizonal Stacked Chart'\n    },\n    percentage: {\n      icon: 'ui-graphtype__percentage',\n      name: 'Percentage Graph'\n    },\n    pie: {\n      icon: 'ui-graphtype__pie',\n      name: 'Pie Graph'\n    },\n    bar: {\n      icon: 'ui-graphtype__bar',\n      name: 'Bar Graph'\n    },\n    treemap: {\n      icon: 'ui-graphtype__treemap',\n      name: 'Treemap'\n    },\n    map: {\n      icon: 'ui-graphtype__map',\n      name: 'Map'\n    }\n  };\n\n  render() {\n    const { t } = this.props;\n\n    return (\n      <div className=\"ui-graphtype ui-button-group\">\n\n      {this.props.graphTypes.map((id) => {\n        if (!this.props.isMapEnabled && id == 'map') return;\n        const graphType = this.graphTypes[id];\n        const classes = {};\n        const name = t(`strings.graph.types.${id}`);\n\n        classes[graphType.icon] = true;\n        classes['ui-button'] = true;\n        classes['is-selected'] = id === this.props.graphType;\n\n        return (\n          <button\n            key={id}\n            ref={id}\n            className={cx(classes)}\n            onClick={()=>GridReportActions.setVisualizationType(id)}\n            data-hint={name}\n            data-hint-position=\"bottom\">\n            <span className=\"ui-graphtype__icon\" aria-label={`Switch to ${name}`}/>\n          </button>\n        );\n      })}\n      </div>\n    );\n  }\n}\n\nexport default translate('report', { wait: true })(GraphType);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/grid_graph_type.tsx","import React from 'react';\n\nexport default ({ height }) => {\n  return (\n    <div className=\"map__unsupported__container\" style={{ height, marginTop: height / 4 }}>\n      <div className=\"map__unsupported__icon\">\n        <i className=\"ui-graphtype__map\"><span className=\"ui-graphtype__icon\"></span></i>\n      </div>\n      <div className=\"map__unsupported__message\">\n        <div className=\"map__unsupported__message_title\">Supported Map Browsers</div>\n        <div className=\"map__unsupported__message_body\">\n          We've worked hard to provide you with the best maps possible &mdash;\n          unfortunately that meant abandoning support for your browser.\n          To fully experience OpenGov maps, we recommend switching to\n          any of the following browsers:\n            <span> </span>\n            <a className=\"map__unsupported__message_browser\" href=\"http://outdatedbrowser.com/\" target=\"_new\">Edge</a>\n            <span>, </span>\n            <a className=\"map__unsupported__message_browser\" href=\"http://outdatedbrowser.com/\" target=\"_new\">Chrome</a>\n            <span>, </span>\n            <a className=\"map__unsupported__message_browser\" href=\"http://outdatedbrowser.com/\" target=\"_new\">Safari</a>\n            <span>, </span>\n            and <a className=\"map__unsupported__message_browser\" href=\"http://outdatedbrowser.com/\" target=\"_new\">Firefox</a>\n            <span>.</span>\n        </div>\n      </div>\n    </div>\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/map_unsupported_message.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Observable } from 'rx';\nimport { List, Map } from 'immutable';\nimport _ from 'lodash';\n\nimport GridReportActions from '../../actions/grid_report_actions';\n\nimport {\n  MapBoxAPIAccessToken,\n  MapTypes,\n  MapTypeNames,\n  HeatMapGradient,\n  OpenGovVectorTileLayerURL\n} from '../../maps/map_constants';\n\nconst { Heatmap: { configuration: HeatmapConfig } } = MapTypes;\n\nimport {\n  boundsNearlyEqual,\n  featureLocationsVirtuallyIdentical,\n  getBoundsForFeatures,\n  getFeatureCoordinates,\n  HeatmapExtractorsMap\n} from '../../maps/utils/geodata_utils';\n\nimport {\n  FeatureLayerTypes\n} from '../../maps/utils/layer_utils';\n\nimport MapLegend from './grid_map_legend';\nimport BubbleMapLegend from './bubble_map_legend';\nimport HeatMapLegend from './heat_map_legend';\n\nimport MapGL from 'react-map-gl';\n\nimport FeatureLayer from '../../maps/feature_layer';\nimport GLHeatmapLayer from '../../maps/gl_heat_map_layer';\nimport GLMapTooltip from '../../maps/gl_map_tooltip';\n\nconst LayerComponentMap = {\n  [MapTypes.Point.name]: FeatureLayer,\n  [MapTypes.Bubble.name]: FeatureLayer,\n  [MapTypes.Heatmap.name]: GLHeatmapLayer,\n};\n\nexport default class GLGridMap extends React.PureComponent<any, any> {\n\n  static propTypes = {\n    locale: PropTypes.string.isRequired,\n    height: PropTypes.number.isRequired,\n    data: PropTypes.array,\n    mapType: PropTypes.oneOf(MapTypeNames),\n    layer: PropTypes.instanceOf(Map),\n    legendPage: PropTypes.number.isRequired,\n    showLegend: PropTypes.bool.isRequired,\n    colorMap: PropTypes.object,\n    visualization: PropTypes.object,\n    filter: PropTypes.object,\n    breakdown: PropTypes.string,\n    mapExtractors: PropTypes.object\n  };\n\n  state = {\n    map: null,\n    viewport: {\n      latitude: this.props.stats.getIn(['center', 'lat']),\n      longitude: this.props.stats.getIn(['center', 'lng']),\n      zoom: 10,\n    },\n    bounds: this.props.visualization.get('mapBounds')\n  };\n\n  componentDidMount() {\n    setImmediate(() => {\n      GridReportActions.mapLoading();\n      GridReportActions.resetAndLoadMap();\n    });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const { visualization, filter, breakdown } = nextProps;\n    const {\n      visualization: previousViz,\n      filter: previousFilter,\n      breakdown: previousBreakdown\n    } = this.props;\n\n    const nextBounds = visualization.get('mapBounds');\n    const bounds = previousViz.get('mapBounds');\n\n    if (!bounds || nextBounds !== bounds && !boundsNearlyEqual(nextBounds, bounds)) {\n      this.setState({ bounds: nextBounds });\n    }\n\n    const breakdownColumnsPresent = visualization.get('breakdownColumns')\n      && visualization.get('breakdownColumns').size > 0;\n\n    const breakdownInitialized = breakdownColumnsPresent && (\n      !previousViz.get('breakdownColumns')\n      || previousViz.get('breakdownColumns').size == 0\n    );\n\n    if (breakdownInitialized) {\n      setImmediate(() => GridReportActions.resetAndLoadMap());\n    }\n\n    if (filter !== previousFilter || breakdown !== previousBreakdown) {\n      setImmediate(() => {\n        GridReportActions.resetAndLoadMap();\n        GridReportActions.mapLegendReset();\n      });\n    }\n  }\n\n  renderTooltip() {\n    const { colorMap, data, mapExtractors, visualization, locale } = this.props;\n    const mapTooltip = visualization.get('mapTooltip');\n\n    const shouldRenderTooltip = (\n      !!mapTooltip.get('locationForTooltip')\n      && (mapTooltip.get('editing') || mapTooltip.get('config'))\n      && data.length > 0\n    );\n\n    if (shouldRenderTooltip) {\n\n      return (\n        <GLMapTooltip\n          locale={locale}\n          colorExtractor={mapExtractors.get('colorExtractor')}\n          colorMapLoading={!colorMap}\n          tooltip={mapTooltip} />\n      );\n    }\n\n    return null;\n  }\n\n  _getBounds() {\n    return this.props.visualization.get('mapBounds');\n  }\n\n  _getCenter() {\n    return this.props.stats.get('center');\n  }\n\n  _initMapMoveHandlers(map) {\n    const moveStart = Observable.fromEvent(map, 'movestart');\n\n    /* This observable is debounced because it's called when map movement ends.\n      The user may click and drag, zoom, and drag again in quick\n      succession and without a debounce this will unnecessarily save the\n      grid state after each movement. */\n    Observable.zip(moveStart, Observable.fromEvent(map, 'moveend'))\n      .debounce((() => Observable.timer(700)) as any)\n      .subscribe(() => this._saveMapBounds());\n\n    moveStart.subscribe(_.throttle(() => _.defer(() => GridReportActions.mapMoveStart()), 50));\n  }\n\n  _onMapRenderAndLoaded = _.debounce(() => {\n    if (this.state.map.loaded()) {\n      GridReportActions.mapLoaded();\n    } else {\n      this._onMapRenderAndLoaded();\n    }\n  }, 1000);\n\n  _onMapRender = _.debounce(() => {\n    GridReportActions.mapLoading();\n    this._onMapRenderAndLoaded();\n  }, 100);\n\n  _initMapLoadingHandlers(map) {\n    map.on('render', this._onMapRender);\n  }\n\n  _onMapLoaded(map) {\n    this.setState({ map });\n    GridReportActions.mapLoaded();\n    this._initMapMoveHandlers(map);\n    this._initMapLoadingHandlers(map);\n  }\n\n  zoomIn() {\n    if (this.state.map) {\n      this.state.map.zoomIn();\n    }\n  }\n\n  zoomOut() {\n    if (this.state.map) {\n      this.state.map.zoomOut();\n    }\n  }\n\n  _saveMapBounds() {\n    if (this.state.map.zooming) {\n      return;\n    }\n\n    const { visualization } = this.props;\n    const newBounds = List(this.state.map.getBounds().toArray().map(List));\n    const currentBounds = visualization.get('mapBounds');\n\n    // See comment on why this is here in map_constants\n    if (boundsNearlyEqual(newBounds, currentBounds)) {\n      return;\n    }\n\n    GridReportActions.mapFitBounds(newBounds);\n  }\n\n  _shouldMountLayer() {\n    return (\n      !!this.state.map\n      && this.props.data.length > 0\n      && _.keys(this.props.colorMap).length > 0\n      && (\n        !FeatureLayerTypes.some(featureType => featureType === this.props.mapType)\n        || this.props.layer\n      )\n    );\n  }\n\n  renderMap() {\n    const { height, mapType, visualization } = this.props;\n    const mapTooltip = visualization.get('mapTooltip');\n    const GLLayerComponent = LayerComponentMap[mapType];\n\n    if (!GLLayerComponent || this.props.stats.get('isInvalid')) {\n      return null;\n    }\n    return (\n      <MapGL\n        {...this.state.viewport}\n        mapboxApiAccessToken={MapBoxAPIAccessToken}\n        bounds={this.state.bounds}\n        mapStyle={OpenGovVectorTileLayerURL}\n        onMapLoaded={map => this._onMapLoaded(map)}\n        onChangeViewport={viewport => this.setState({ viewport })}\n        zoomDisabled={mapTooltip.get('editing')}\n        dragDisabled={mapTooltip.get('editing')}\n        width={'100%'}\n        height={height}>\n        {this._shouldMountLayer() && <GLLayerComponent {...this.getLayerProps()} />}\n        {/* in the future we can add multiple layers here :) */}\n        {mapType != MapTypes.Heatmap.name && this.renderTooltip()}\n      </MapGL>\n    );\n  }\n\n  getAmountHeatmapExtractors() {\n    const { mapType, visualization } = this.props;\n    const isHeatmap = mapType === MapTypes.Heatmap.name;\n\n    if (!isHeatmap) {\n      return {};\n    }\n\n    return HeatmapExtractorsMap[visualization.get('heatmapType')];\n  }\n\n  _onFeaturesClick = features => {\n    if (featureLocationsVirtuallyIdentical(features)) {\n      GridReportActions.getRowsForTooltip(null, features);\n      return;\n    }\n\n    const bounds = getBoundsForFeatures(features);\n    GridReportActions.mapFitBounds(bounds);\n  };\n\n  getLayerProps() {\n    const { data, mapType, layer } = this.props;\n    const { map } = this.state;\n\n    if (mapType === MapTypes.Heatmap.name) {\n      return {\n        ...this.state.viewport,\n        ...this.getAmountHeatmapExtractors(),\n        data,\n        lngLatExtractor: getFeatureCoordinates,\n        gradientColors: HeatMapGradient\n      };\n    }\n\n    if (FeatureLayerTypes.some(featureType => featureType === mapType)) {\n      return {\n        data,\n        layer,\n        map,\n        onLoading: GridReportActions.mapLoading,\n        onFeaturesClick: this._onFeaturesClick\n      };\n    }\n\n    return {};\n  }\n\n  renderLegend() {\n    const { colorMap, breakdown, legendPage, mapType, stats } = this.props;\n\n    switch (mapType) {\n    case MapTypes.Heatmap.name:\n      if (!stats.get('formattedMinAmount')) return null;\n\n      const { visualization } = this.props;\n      const isAmountHeatmapType = visualization.get('heatmapType') === MapTypes.Heatmap.types.amount;\n\n      const heatmapLegendProps = {\n        min: isAmountHeatmapType ? stats.get('formattedMinAmount') : HeatmapConfig.min,\n        mid: isAmountHeatmapType ? null : (HeatmapConfig.min + HeatmapConfig.max) / 2,\n        max: isAmountHeatmapType ? stats.get('formattedMaxAmount') : HeatmapConfig.max,\n      };\n\n      return (\n        <div className=\"map__legend__wrapper\">\n          <HeatMapLegend {...heatmapLegendProps} />\n        </div>\n      );\n\n    case MapTypes.Bubble.name:\n      if (!colorMap || stats.get('isInvalid')) return null;\n\n      return (\n        <MapLegend colorMap={colorMap} page={legendPage} legendColumn={breakdown}>\n          <BubbleMapLegend minValue={stats.get('formattedMinAmount')} maxValue={stats.get('formattedMaxAmount')} />\n        </MapLegend>\n      );\n\n    case MapTypes.Point.name:\n      if (!colorMap) return null;\n\n      return (\n        <MapLegend colorMap={colorMap} page={legendPage} legendColumn={breakdown} />\n      );\n\n    default:\n      return null;\n    }\n  }\n\n  renderMapControls() {\n    // The controls are manually rendered here because Uber's overlay\n    // structure results in the heatmap overlaying the zoom controls\n    return (\n      <div className=\"mapboxgl-control-container\">\n        <div className=\"mapboxgl-ctrl-top-left\" style={{ top: '50px' }}> {/* Offset by 50px to align top-left */}\n          <div className=\"mapboxgl-ctrl-group mapboxgl-ctrl\">\n            <button className=\"mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in\" onClick={() => this.zoomIn()}></button>\n            <button className=\"mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out\" onClick={() => this.zoomOut()}></button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { showLegend, visualization } = this.props;\n    const mapTooltipEditing = visualization.getIn(['mapTooltip', 'editing']);\n\n    return (\n      <div className=\"grid_map__container\">\n        {!mapTooltipEditing && this.renderMapControls()}\n        {showLegend && this.renderLegend()}\n        {this.renderMap()}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/gl_grid_map.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport GridReportActions from '../../actions/grid_report_actions';\nimport { MapLegendConfig } from '../../maps/map_constants';\n\nclass MapLegendItem extends React.Component<any, any> {\n\n  static propTypes = {\n    legendColumn: PropTypes.string.isRequired,\n    label: PropTypes.string.isRequired,\n    color: PropTypes.string.isRequired\n  };\n\n  render() {\n    const { label, color, legendColumn } = this.props;\n\n    return (\n      <button id={`legend_${label}`}\n        className=\"map__legend__item legend__item\"\n        title={label}\n        aria-label={`Filter visualization by ${label}`}\n        key={label}\n        onClick={() => GridReportActions.filterColumn(legendColumn, 'eq', label)}>\n        <div className=\"legend__item__decorator map__legend__item__decorator\" style={{color: color, background: color}} />\n        <span className=\"legend__item__text map__legend__item__text\">{label}</span>\n      </button>\n    );\n  }\n}\n\nexport default class MapLegend extends React.Component<any, any> {\n\n  static propTypes = {\n    colorMap: PropTypes.object.isRequired,\n    legendColumn: PropTypes.string.isRequired,\n    page: PropTypes.number.isRequired\n  }\n\n  _itemsPerPage = MapLegendConfig.itemsPerPage;\n\n  renderLegendItems() {\n    const { colorMap, page, legendColumn } = this.props;\n    const take = items => _.take(items, this._itemsPerPage);\n    const skip = items => _.drop(items, (page - 1) * this._itemsPerPage);\n\n    return _.map(take(skip(_.keys(this.props.colorMap))), (label: string) => (\n      <MapLegendItem key={label} color={colorMap[label]} label={label} legendColumn={legendColumn}/>\n    ));\n  }\n\n  renderLegendShowMore() {\n    const followingCount = _.keys(this.props.colorMap).length - (this.props.page * this._itemsPerPage);\n\n    if (followingCount > 0) {\n      return (\n        <button id={`legend_show_more`}\n          className=\"map__legend__item map__legend__item_show_more legend__item\"\n          title=\"Show More\"\n          onClick={GridReportActions.mapLegendShowMoreClicked}>\n          <div className=\"map__legend__item__next_group\" />\n          <span className=\"legend__item__text map__legend__item__text\">More ({followingCount} grouped)</span>\n        </button>\n      );\n    }\n  }\n\n  renderLegendShowPrevious() {\n    const previousCount = (this.props.page - 1) * this._itemsPerPage;\n\n    if (previousCount > 0) {\n      return (\n        <button id={`legend_show_previous`}\n          className=\"map__legend__item legend__item\"\n          title=\"Show More\"\n          onClick={GridReportActions.mapLegendShowPreviousClicked}>\n          <div className=\"map__legend__item__previous_group\" />\n          <span className=\"legend__item__text map__legend__item__text\">Previous ({previousCount} grouped)</span>\n        </button>\n      );\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"map__legend__wrapper\">\n        <div className=\"map__legend__container\">\n          <div className=\"map__legend__title_container\" title=\"Show More\">\n            <span className=\"map__legend__title\">legend</span>\n          </div>\n          {this.renderLegendShowPrevious()}\n          {this.renderLegendItems()}\n          {this.renderLegendShowMore()}\n        </div>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/grid_map_legend.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport HorizontalScaledCircles from './horizontal_scaled_circles';\nimport { MapTypes } from '../../maps/map_constants';\n\nconst { minBubbleRadius, maxBubbleRadius } = MapTypes.Bubble.configuration;\n\nconst RADIUS_RANGE = maxBubbleRadius - minBubbleRadius;\n// the following values are set specifically to fit in the legend container\nconst BUBBLE_CONTAINER_HEIGHT = maxBubbleRadius * 2 + 8;\nconst BUBBLE_CONTAINER_WIDTH = 189;\nconst CIRCLE_PADDING = 13;\nconst CONTAINER_PADDING = 14;\n\nexport default class BubbleMapLegend extends React.PureComponent<any, any> {\n\n  static propTypes = {\n    minValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n    maxValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired\n  };\n\n  render() {\n    return (\n      <div className=\"map__aux_legend__container\">\n        <div className=\"map__legend__title_container\">\n          <div className=\"map__aux_legend__title map__legend__title\">Sizing</div>\n        </div>\n        <div className=\"map__aux_legend__content\">\n          <HorizontalScaledCircles\n            numCircles={5}\n            containerWidth={BUBBLE_CONTAINER_WIDTH}\n            containerHeight={BUBBLE_CONTAINER_HEIGHT}\n            minRadius={minBubbleRadius}\n            circlePadding={CIRCLE_PADDING}\n            containerPadding={CONTAINER_PADDING}\n            radiusRange={RADIUS_RANGE} />\n        </div>\n        <div className=\"map__aux_legend__labels\">\n          <div className=\"map__aux_legend__label left\">\n            {this.props.minValue}\n          </div>\n          <div\n            className=\"map__aux_legend__label right\"\n            style={{ textAlign: 'center' }}>\n            {this.props.maxValue}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/bubble_map_legend.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nexport default class HorizontalScaledCircles extends React.PureComponent<any, any> {\n\n  static propTypes = {\n    numCircles: PropTypes.number.isRequired,\n    containerWidth: PropTypes.number.isRequired,\n    containerHeight: PropTypes.number.isRequired,\n    minRadius: PropTypes.number.isRequired,\n    radiusRange: PropTypes.number.isRequired,\n    circlePadding: PropTypes.number.isRequired,\n    containerPadding: PropTypes.number.isRequired,\n  };\n\n  render() {\n    const {\n      numCircles,\n      containerWidth,\n      containerHeight,\n      minRadius,\n      circlePadding,\n      containerPadding,\n      radiusRange\n    } = this.props;\n\n    return (\n      <svg\n        viewBox={`0 0 ${containerWidth} ${containerHeight}`}\n        style={{ width: containerWidth, height: containerHeight }}\n        version=\"1.1\"\n        xmlns=\"http://www.w3.org/2000/svg\">\n        <g>\n          {_.times(numCircles, (index) => {\n            const circleNum = index;\n            const radius = (circleNum / numCircles) * radiusRange + minRadius;\n            const y = containerHeight / 2;\n            const x = (radius + circlePadding) * circleNum + containerPadding;\n\n            return (\n              <circle key={index} cx={x} cy={y} r={radius}/>\n            );\n          })}\n        </g>\n      </svg>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/horizontal_scaled_circles.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { HeatMapGradientStops } from '../../maps/map_constants';\n\nconst GRADIENT_WIDTH = 172;\nconst GRADIENT_HEIGHT = 10;\nconst GRADIENT_CONTAINER_HEIGHT = 14;\nconst GRADIENT_Y = GRADIENT_HEIGHT / 2 - ((GRADIENT_CONTAINER_HEIGHT - GRADIENT_HEIGHT) / 2);\nconst GRADIENT_CORNER_RADIUS = 5;\n\nexport default class HeatMapLegend extends React.PureComponent<any, any> {\n\n  static propTypes = {\n    min: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n    mid: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n    max: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  };\n\n  render() {\n    return (\n      <div className=\"map__aux_legend__container\">\n        <div className=\"map__legend__title_container\">\n          <div className=\"map__aux_legend__title map__legend__title\">Legend</div>\n        </div>\n        <div className=\"map__aux_legend__content heatmap\">\n          <svg height={GRADIENT_CONTAINER_HEIGHT} width={GRADIENT_WIDTH}>\n            <defs>\n              <linearGradient id=\"heatmap_legend_grad_1\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n                {HeatMapGradientStops.map(({ color, stop }, index) => {\n                  return (\n                    <stop key={index} offset={`${(stop as any) * 100}%`} style={{ stopColor: color, stopOpacity: 1 }} />\n                  );\n                })}\n              </linearGradient>\n            </defs>\n            <rect\n              x=\"0\"\n              y={GRADIENT_Y}\n              rx={GRADIENT_CORNER_RADIUS}\n              ry={GRADIENT_CORNER_RADIUS}\n              width={GRADIENT_WIDTH}\n              height={GRADIENT_HEIGHT}\n              fill=\"url(#heatmap_legend_grad_1)\" />\n          </svg>\n        </div>\n        <div className=\"map__aux_legend__labels\">\n          <div className=\"map__aux_legend__label left\">\n            {this.props.min}\n          </div>\n          <div className=\"map__aux_legend__label center\">\n            {this.props.mid}\n          </div>\n          <div className=\"map__aux_legend__label right\">\n            {this.props.max}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/map/heat_map_legend.tsx","// Copyright (c) 2016 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// Export as ES5 module\nmodule.exports = require('./dist');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/index.js\n// module id = 1000\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _map = require('./map.react');\n\nObject.defineProperty(exports, 'default', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_map).default;\n  }\n});\n\nvar _fitBounds = require('./fit-bounds');\n\nObject.defineProperty(exports, 'fitBounds', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_fitBounds).default;\n  }\n});\n\nvar _overlays = require('./overlays');\n\nObject.keys(_overlays).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _overlays[key];\n    }\n  });\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozt3Q0FvQlFBLE87Ozs7Ozs7Ozs4Q0FDQUEsTzs7Ozs7O0FBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuZXhwb3J0IHtkZWZhdWx0IGFzIGRlZmF1bHR9IGZyb20gJy4vbWFwLnJlYWN0JztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmaXRCb3VuZHN9IGZyb20gJy4vZml0LWJvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL292ZXJsYXlzJztcbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/index.js\n// module id = 1001\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class, _desc, _value, _class2; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n// NOTE: Transform is not a public API so we should be careful to always lock\n// down mapbox-gl to a specific major, minor, and patch version.\n\n\nvar _assert = require('assert');\n\nvar _assert2 = _interopRequireDefault(_assert);\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = require('autobind-decorator');\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _pureRenderDecorator = require('pure-render-decorator');\n\nvar _pureRenderDecorator2 = _interopRequireDefault(_pureRenderDecorator);\n\nvar _d = require('d3');\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = require('immutable');\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _mapboxGl = require('mapbox-gl');\n\nvar _mapboxGl2 = _interopRequireDefault(_mapboxGl);\n\nvar _config = require('./config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _mapInteractions = require('./map-interactions.react');\n\nvar _mapInteractions2 = _interopRequireDefault(_mapInteractions);\n\nvar _diffStyles2 = require('./diff-styles');\n\nvar _diffStyles3 = _interopRequireDefault(_diffStyles2);\n\nvar _transform = require('mapbox-gl/js/geo/transform');\n\nvar _transform2 = _interopRequireDefault(_transform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\n// Note: Max pitch is a hard coded value (not a named constant) in transform.js\nvar MAX_PITCH = 60;\nvar PITCH_MOUSE_THRESHOLD = 20;\nvar PITCH_ACCEL = 1.2;\n\nvar PROP_TYPES = {\n  /**\n    * The latitude of the center of the map.\n    */\n  latitude: _propTypes2.default.number.isRequired,\n  /**\n    * The longitude of the center of the map.\n    */\n  longitude: _propTypes2.default.number.isRequired,\n  /**\n    * The tile zoom level of the map.\n    */\n  zoom: _propTypes2.default.number.isRequired,\n  /**\n    * The Mapbox style the component should use. Can either be a string url\n    * or a MapboxGL style Immutable.Map object.\n    */\n  mapStyle: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.instanceOf(_immutable2.default.Map)]),\n  /**\n    * The Mapbox API access token to provide to mapbox-gl-js. This is required\n    * when using Mapbox provided vector tiles and styles.\n    */\n  mapboxApiAccessToken: _propTypes2.default.string,\n  /**\n    * `onChangeViewport` callback is fired when the user interacted with the\n    * map. The object passed to the callback containers `latitude`,\n    * `longitude` and `zoom` information.\n    */\n  onChangeViewport: _propTypes2.default.func,\n  /**\n    * `onMapLoaded` callback is fired on the map's 'load' event\n    */\n  onMapLoaded: _propTypes2.default.func,\n  /**\n    * The width of the map. Number in pixels or CSS string prop e.g. '100%'\n    */\n  width: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  /**\n    * The height of the map. Number in pixels or CSS string prop e.g. '100%'\n    */\n  height: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  /**\n    * Is the component currently being dragged. This is used to show/hide the\n    * drag cursor. Also used as an optimization in some overlays by preventing\n    * rendering while dragging.\n    */\n  isDragging: _propTypes2.default.bool,\n  /**\n    * Required to calculate the mouse projection after the first click event\n    * during dragging. Where the map is depends on where you first clicked on\n    * the map.\n    */\n  startDragLngLat: _propTypes2.default.array,\n  /**\n    * Called when a feature is hovered over. Features must set the\n    * `interactive` property to `true` for this to work properly. see the\n    * Mapbox example: https://www.mapbox.com/mapbox-gl-js/example/featuresat/\n    * The first argument of the callback will be the array of feature the\n    * mouse is over. This is the same response returned from `featuresAt`.\n    */\n  onHoverFeatures: _propTypes2.default.func,\n  /**\n    * Defaults to TRUE\n    * Set to false to enable onHoverFeatures to be called regardless if\n    * there is an actual feature at x, y. This is useful to emulate\n    * \"mouse-out\" behaviors on features.\n    */\n  ignoreEmptyFeatures: _propTypes2.default.bool,\n\n  /**\n    * Show attribution control or not.\n    */\n  attributionControl: _propTypes2.default.bool,\n\n  /**\n    * Called when a feature is clicked on. Features must set the\n    * `interactive` property to `true` for this to work properly. see the\n    * Mapbox example: https://www.mapbox.com/mapbox-gl-js/example/featuresat/\n    * The first argument of the callback will be the array of feature the\n    * mouse is over. This is the same response returned from `featuresAt`.\n    */\n  onClickFeatures: _propTypes2.default.func,\n\n  /**\n    * Passed to Mapbox Map constructor which passes it to the canvas context.\n    * This is unseful when you want to export the canvas as a PNG.\n    */\n  preserveDrawingBuffer: _propTypes2.default.bool,\n\n  /**\n    * There are still known issues with style diffing. As a temporary stopgap,\n    * add the option to prevent style diffing.\n    */\n  preventStyleDiffing: _propTypes2.default.bool,\n\n  /**\n    * Enables perspective control event handling (Command-rotate)\n    */\n  perspectiveEnabled: _propTypes2.default.bool,\n\n  /**\n    * Specify the bearing of the viewport\n    */\n  bearing: _propTypes2.default.number,\n\n  /**\n    * Specify the pitch of the viewport\n    */\n  pitch: _propTypes2.default.number,\n\n  /**\n    * Specify the altitude of the viewport camera\n    * Unit: map heights, default 1.5\n    * Non-public API, see https://github.com/mapbox/mapbox-gl-js/issues/1137\n    */\n  altitude: _propTypes2.default.number,\n\n  /**\n    * Disabled dragging of the map\n    */\n  dragDisabled: _propTypes2.default.bool,\n\n  /**\n    * Disabled zooming of the map\n    */\n  zoomDisabled: _propTypes2.default.bool,\n\n  /**\n    * Bounds to fit on screen\n    */\n  bounds: _propTypes2.default.instanceOf(_immutable2.default.List)\n};\n\nvar DEFAULT_PROPS = {\n  mapStyle: 'mapbox://styles/mapbox/light-v8',\n  onChangeViewport: null,\n  mapboxApiAccessToken: _config2.default.DEFAULTS.MAPBOX_API_ACCESS_TOKEN,\n  preserveDrawingBuffer: false,\n  attributionControl: true,\n  ignoreEmptyFeatures: true,\n  bearing: 0,\n  pitch: 0,\n  altitude: 1.5\n};\n\nvar CHILD_CONTEXT_TYPES = {\n  map: _propTypes2.default.object\n};\n\nvar MapGL = (0, _pureRenderDecorator2.default)(_class = (_class2 = function (_Component) {\n  _inherits(MapGL, _Component);\n\n  function MapGL(props) {\n    _classCallCheck(this, MapGL);\n\n    var _this = _possibleConstructorReturn(this, (MapGL.__proto__ || Object.getPrototypeOf(MapGL)).call(this, props));\n\n    _this.state = {\n      isDragging: false,\n      startDragLngLat: null,\n      startBearing: null,\n      startPitch: null\n    };\n    _mapboxGl2.default.accessToken = props.mapboxApiAccessToken;\n\n    _this._mapReady = false;\n\n    _this.getChildContext = function () {\n      return {\n        map: _this._map\n      };\n    };\n    return _this;\n  }\n\n  _createClass(MapGL, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var mapStyle = this.props.mapStyle instanceof _immutable2.default.Map ? this.props.mapStyle.toJS() : this.props.mapStyle;\n      var map = new _mapboxGl2.default.Map({\n        container: this.refs.mapboxMap,\n        center: [this.props.longitude, this.props.latitude],\n        zoom: this.props.zoom,\n        pitch: this.props.pitch,\n        bearing: this.props.bearing,\n        style: mapStyle,\n        interactive: false,\n        preserveDrawingBuffer: this.props.preserveDrawingBuffer\n        // TODO?\n        // attributionControl: this.props.attributionControl\n      });\n\n      _d2.default.select(map.getCanvas()).style('outline', 'none');\n\n      this._map = map;\n      this._updateMapViewport({}, this.props);\n      this._callOnChangeViewport(map.transform);\n\n      if (this.props.onMapLoaded) {\n        map.on('load', function () {\n          return _this2.props.onMapLoaded(map);\n        });\n      }\n\n      // support for external manipulation of underlying map\n      // TODO a better approach\n      map.on('style.load', function () {\n        return _this2._mapReady = true;\n      });\n      map.on('moveend', function () {\n        return _this2._callOnChangeViewport(map.transform);\n      });\n      map.on('zoomend', function () {\n        return _this2._callOnChangeViewport(map.transform);\n      });\n    }\n\n    // New props are comin' round the corner!\n\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(newProps) {\n      this._updateStateFromProps(this.props, newProps);\n      this._updateMapViewport(this.props, newProps);\n      this._updateMapStyle(this.props, newProps);\n      // Save width/height so that we can check them in componentDidUpdate\n      this.setState({\n        width: this.props.width,\n        height: this.props.height\n      });\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      // map.resize() reads size from DOM, we need to call after render\n      this._updateMapSize(this.state, this.props);\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      if (this._map) {\n        this._map.remove();\n      }\n    }\n  }, {\n    key: '_cursor',\n    value: function _cursor() {\n      var isInteractive = this.props.onChangeViewport || this.props.onClickFeature || this.props.onHoverFeatures;\n      if (isInteractive) {\n        return this.props.isDragging ? _config2.default.CURSOR.GRABBING : _config2.default.CURSOR.GRAB;\n      }\n      return 'inherit';\n    }\n  }, {\n    key: '_getMap',\n    value: function _getMap() {\n      return this._map;\n    }\n  }, {\n    key: '_updateStateFromProps',\n    value: function _updateStateFromProps(oldProps, newProps) {\n      _mapboxGl2.default.accessToken = newProps.mapboxApiAccessToken;\n      var startDragLngLat = newProps.startDragLngLat;\n\n      this.setState({\n        startDragLngLat: startDragLngLat && startDragLngLat.slice()\n      });\n    }\n\n    // Individually update the maps source and layers that have changed if all\n    // other style props haven't changed. This prevents flicking of the map when\n    // styles only change sources or layers.\n\n  }, {\n    key: '_setDiffStyle',\n    value: function _setDiffStyle(prevStyle, nextStyle) {\n      var prevKeysMap = prevStyle && styleKeysMap(prevStyle) || {};\n      var nextKeysMap = styleKeysMap(nextStyle);\n      function styleKeysMap(style) {\n        return style.map(function () {\n          return true;\n        }).delete('layers').delete('sources').toJS();\n      }\n      function propsOtherThanLayersOrSourcesDiffer() {\n        var prevKeysList = Object.keys(prevKeysMap);\n        var nextKeysList = Object.keys(nextKeysMap);\n        if (prevKeysList.length !== nextKeysList.length) {\n          return true;\n        }\n        // `nextStyle` and `prevStyle` should not have the same set of props.\n        if (nextKeysList.some(function (key) {\n          return prevStyle.get(key) !== nextStyle.get(key);\n        }\n        // But the value of one of those props is different.\n        )) {\n          return true;\n        }\n        return false;\n      }\n\n      var map = this._getMap();\n\n      if (!prevStyle || propsOtherThanLayersOrSourcesDiffer()) {\n        map.setStyle(nextStyle.toJS());\n        return;\n      }\n\n      var _diffStyles = (0, _diffStyles3.default)(prevStyle, nextStyle),\n          sourcesDiff = _diffStyles.sourcesDiff,\n          layersDiff = _diffStyles.layersDiff;\n\n      // TODO: It's rather difficult to determine style diffing in the presence\n      // of refs. For now, if any style update has a ref, fallback to no diffing.\n      // We can come back to this case if there's a solid usecase.\n\n\n      if (layersDiff.updates.some(function (node) {\n        return node.layer.get('ref');\n      })) {\n        map.setStyle(nextStyle.toJS());\n        return;\n      }\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = sourcesDiff.enter[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var enter = _step.value;\n\n          map.addSource(enter.id, enter.source.toJS());\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = sourcesDiff.update[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var update = _step2.value;\n\n          map.removeSource(update.id);\n          map.addSource(update.id, update.source.toJS());\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion3 = true;\n      var _didIteratorError3 = false;\n      var _iteratorError3 = undefined;\n\n      try {\n        for (var _iterator3 = sourcesDiff.exit[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n          var exit = _step3.value;\n\n          map.removeSource(exit.id);\n        }\n      } catch (err) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion3 && _iterator3.return) {\n            _iterator3.return();\n          }\n        } finally {\n          if (_didIteratorError3) {\n            throw _iteratorError3;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion4 = true;\n      var _didIteratorError4 = false;\n      var _iteratorError4 = undefined;\n\n      try {\n        for (var _iterator4 = layersDiff.exiting[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n          var _exit = _step4.value;\n\n          if (map.style.getLayer(_exit.id)) {\n            map.removeLayer(_exit.id);\n          }\n        }\n      } catch (err) {\n        _didIteratorError4 = true;\n        _iteratorError4 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion4 && _iterator4.return) {\n            _iterator4.return();\n          }\n        } finally {\n          if (_didIteratorError4) {\n            throw _iteratorError4;\n          }\n        }\n      }\n\n      var _iteratorNormalCompletion5 = true;\n      var _didIteratorError5 = false;\n      var _iteratorError5 = undefined;\n\n      try {\n        for (var _iterator5 = layersDiff.updates[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n          var _update = _step5.value;\n\n          if (!_update.enter) {\n            // This is an old layer that needs to be updated. Remove the old layer\n            // with the same id and add it back again.\n            map.removeLayer(_update.id);\n          }\n          map.addLayer(_update.layer.toJS(), _update.before);\n        }\n      } catch (err) {\n        _didIteratorError5 = true;\n        _iteratorError5 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion5 && _iterator5.return) {\n            _iterator5.return();\n          }\n        } finally {\n          if (_didIteratorError5) {\n            throw _iteratorError5;\n          }\n        }\n      }\n    }\n  }, {\n    key: '_updateMapStyle',\n    value: function _updateMapStyle(oldProps, newProps) {\n      var mapStyle = newProps.mapStyle;\n      var oldMapStyle = oldProps.mapStyle;\n      if (mapStyle !== oldMapStyle) {\n        if (mapStyle instanceof _immutable2.default.Map) {\n          if (this.props.preventStyleDiffing) {\n            this._getMap().setStyle(mapStyle.toJS());\n          } else {\n            this._setDiffStyle(oldMapStyle, mapStyle);\n          }\n        } else {\n          this._getMap().setStyle(mapStyle);\n        }\n      }\n    }\n  }, {\n    key: '_updateMapViewport',\n    value: function _updateMapViewport(oldProps, newProps) {\n      var viewportChanged = newProps.latitude !== oldProps.latitude || newProps.longitude !== oldProps.longitude || newProps.zoom !== oldProps.zoom || newProps.pitch !== oldProps.pitch || newProps.bearing !== oldProps.bearing || newProps.altitude !== oldProps.altitude;\n\n      var map = this._getMap();\n\n      if (viewportChanged) {\n        map.jumpTo({\n          center: [newProps.longitude, newProps.latitude],\n          zoom: newProps.zoom,\n          bearing: newProps.bearing,\n          pitch: newProps.pitch\n        });\n\n        // TODO - jumpTo doesn't handle altitude\n        if (newProps.altitude !== oldProps.altitude) {\n          map.transform.altitude = newProps.altitude;\n        }\n      }\n\n      if (oldProps.bounds !== newProps.bounds && newProps.bounds) {\n        map.fitBounds(newProps.bounds.toJS());\n      }\n    }\n\n    // Note: needs to be called after render (e.g. in componentDidUpdate)\n\n  }, {\n    key: '_updateMapSize',\n    value: function _updateMapSize(oldProps, newProps) {\n      var sizeChanged = oldProps.width !== newProps.width || oldProps.height !== newProps.height;\n\n      if (sizeChanged) {\n        var map = this._getMap();\n        map.resize();\n        this._callOnChangeViewport(map.transform);\n      }\n    }\n  }, {\n    key: '_calculateNewPitchAndBearing',\n    value: function _calculateNewPitchAndBearing(_ref) {\n      var pos = _ref.pos,\n          startPos = _ref.startPos,\n          startBearing = _ref.startBearing,\n          startPitch = _ref.startPitch;\n\n      var xDelta = pos.x - startPos.x;\n      var bearing = startBearing + 180 * xDelta / this.props.width;\n\n      var pitch = startPitch;\n      var yDelta = pos.y - startPos.y;\n      if (yDelta > 0) {\n        // Dragging downwards, gradually decrease pitch\n        if (Math.abs(this.props.height - startPos.y) > PITCH_MOUSE_THRESHOLD) {\n          var scale = yDelta / (this.props.height - startPos.y);\n          pitch = (1 - scale) * PITCH_ACCEL * startPitch;\n        }\n      } else if (yDelta < 0) {\n        // Dragging upwards, gradually increase pitch\n        if (startPos.y > PITCH_MOUSE_THRESHOLD) {\n          // Move from 0 to 1 as we drag upwards\n          var yScale = 1 - pos.y / startPos.y;\n          // Gradually add until we hit max pitch\n          pitch = startPitch + yScale * (MAX_PITCH - startPitch);\n        }\n      }\n\n      // console.debug(startPitch, pitch);\n      return {\n        pitch: Math.max(Math.min(pitch, MAX_PITCH), 0),\n        bearing: bearing\n      };\n    }\n\n    // Helper to call props.onChangeViewport\n\n  }, {\n    key: '_callOnChangeViewport',\n    value: function _callOnChangeViewport(transform) {\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (this.props.onChangeViewport) {\n        var _getMap$getContainer = this._getMap().getContainer(),\n            height = _getMap$getContainer.scrollHeight,\n            width = _getMap$getContainer.scrollWidth;\n\n        this.props.onChangeViewport(_extends({\n          latitude: transform.center.lat,\n          longitude: mod(transform.center.lng + 180, 360) - 180,\n          zoom: transform.zoom,\n          pitch: transform.pitch,\n          bearing: mod(transform.bearing + 180, 360) - 180,\n\n          isDragging: this.props.isDragging,\n          startDragLngLat: this.props.startDragLngLat,\n          startBearing: this.props.startBearing,\n          startPitch: this.props.startPitch,\n\n          projectionMatrix: transform.projMatrix,\n\n          height: height,\n          width: width\n\n        }, opts));\n      }\n    }\n  }, {\n    key: '_onMouseDown',\n    value: function _onMouseDown(_ref2) {\n      var pos = _ref2.pos;\n\n      var map = this._getMap();\n      var lngLat = unprojectFromTransform(map.transform, pos);\n      this._callOnChangeViewport(map.transform, {\n        isDragging: true,\n        startDragLngLat: [lngLat.lng, lngLat.lat],\n        startBearing: map.transform.bearing,\n        startPitch: map.transform.pitch\n      });\n    }\n  }, {\n    key: '_onMouseDrag',\n    value: function _onMouseDrag(_ref3) {\n      var pos = _ref3.pos;\n\n      if (!this.props.onChangeViewport || this.props.dragDisabled) {\n        return;\n      }\n\n      // take the start lnglat and put it where the mouse is down.\n      (0, _assert2.default)(this.props.startDragLngLat, '`startDragLngLat` prop is required ' + 'for mouse drag behavior to calculate where to position the map.');\n\n      var map = this._getMap();\n      var transform = cloneTransform(map.transform);\n      transform.setLocationAtPoint(this.props.startDragLngLat, pos);\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onMouseRotate',\n    value: function _onMouseRotate(_ref4) {\n      var pos = _ref4.pos,\n          startPos = _ref4.startPos;\n\n      if (!this.props.onChangeViewport || !this.props.perspectiveEnabled) {\n        return;\n      }\n\n      var _props = this.props,\n          startBearing = _props.startBearing,\n          startPitch = _props.startPitch;\n\n      (0, _assert2.default)(typeof startBearing === 'number', '`startBearing` prop is required for mouse rotate behavior');\n      (0, _assert2.default)(typeof startPitch === 'number', '`startPitch` prop is required for mouse rotate behavior');\n\n      var map = this._getMap();\n\n      var _calculateNewPitchAnd = this._calculateNewPitchAndBearing({\n        pos: pos,\n        startPos: startPos,\n        startBearing: startBearing,\n        startPitch: startPitch\n      }),\n          pitch = _calculateNewPitchAnd.pitch,\n          bearing = _calculateNewPitchAnd.bearing;\n\n      var transform = cloneTransform(map.transform);\n      transform.bearing = bearing;\n      transform.pitch = pitch;\n\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onMouseMove',\n    value: function _onMouseMove(opt) {\n      if (!this.props.onHoverFeatures) {\n        return;\n      }\n\n      var map = this._getMap();\n      var pos = opt.pos;\n\n      var features = map.queryRenderedFeatures([pos.x, pos.y]);\n      if (!features.length && this.props.ignoreEmptyFeatures) {\n        return;\n      }\n      this.props.onHoverFeatures(features);\n    }\n  }, {\n    key: '_onMouseUp',\n    value: function _onMouseUp(opt) {\n      if (!this.props.onClickFeatures) {\n        return;\n      }\n\n      var map = this._getMap();\n      this._callOnChangeViewport(map.transform, {\n        isDragging: false,\n        startDragLngLat: null,\n        startBearing: null,\n        startPitch: null\n      });\n\n      var pos = opt.pos;\n\n      // Radius enables point features, like marker symbols, to be clicked.\n      var size = 15;\n      var bbox = [[pos.x - size, pos.y - size], [pos.x + size, pos.y + size]];\n      var features = map.queryRenderedFeatures(bbox);\n      if (!features.length && this.props.ignoreEmptyFeatures) {\n        return;\n      }\n      this.props.onClickFeatures(features);\n    }\n  }, {\n    key: '_onZoom',\n    value: function _onZoom(_ref5) {\n      var pos = _ref5.pos,\n          scale = _ref5.scale;\n\n      if (this.props.zoomDisabled) {\n        return;\n      }\n\n      var map = this._getMap();\n      var transform = cloneTransform(map.transform);\n      var around = unprojectFromTransform(transform, pos);\n      transform.zoom = transform.scaleZoom(map.transform.scale * scale);\n      transform.setLocationAtPoint(around, pos);\n      this._callOnChangeViewport(transform, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: '_onZoomEnd',\n    value: function _onZoomEnd() {\n      var map = this._getMap();\n      this._callOnChangeViewport(map.transform, {\n        isDragging: false\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          className = _props2.className,\n          width = _props2.width,\n          height = _props2.height,\n          style = _props2.style;\n\n      var mapStyle = _extends({}, style, {\n        width: width,\n        height: height,\n        cursor: this._cursor()\n      });\n\n      var content = [_react2.default.createElement('div', { key: 'map', ref: 'mapboxMap',\n        style: mapStyle, className: className }), _react2.default.createElement(\n        'div',\n        { key: 'overlays', className: 'overlays',\n          style: { position: 'absolute', left: 0, top: 0 } },\n        this.props.children\n      )];\n\n      if (this.props.onChangeViewport) {\n        content = _react2.default.createElement(\n          _mapInteractions2.default,\n          {\n            onMouseDown: this._onMouseDown,\n            onMouseDrag: this._onMouseDrag,\n            onMouseRotate: this._onMouseRotate,\n            onMouseUp: this._onMouseUp,\n            onMouseMove: this._onMouseMove,\n            onZoom: this._onZoom,\n            onZoomEnd: this._onZoomEnd,\n            width: this.props.width,\n            height: this.props.height,\n            zoomDisabled: this.props.zoomDisabled,\n            dragDisabled: this.props.dragDisabled },\n          content\n        );\n      }\n\n      return _react2.default.createElement(\n        'div',\n        {\n          style: _extends({}, this.props.style, {\n            width: this.props.width,\n            height: this.props.height,\n            position: 'relative'\n          }) },\n        content\n      );\n    }\n  }]);\n\n  return MapGL;\n}(_react.Component), (_applyDecoratedDescriptor(_class2.prototype, '_onMouseDown', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseDown'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseDrag'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseRotate', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseRotate'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseMove', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseMove'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onMouseUp', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onMouseUp'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onZoom', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onZoom'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, '_onZoomEnd', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class2.prototype, '_onZoomEnd'), _class2.prototype)), _class2)) || _class;\n\nexports.default = MapGL;\n\n\nfunction mod(value, divisor) {\n  var modulus = value % divisor;\n  return modulus < 0 ? divisor + modulus : modulus;\n}\n\nfunction unprojectFromTransform(transform, point) {\n  return transform.pointLocation(_mapboxGl.Point.convert(point));\n}\n\nfunction cloneTransform(original) {\n  var transform = new _transform2.default(original._minZoom, original._maxZoom);\n  transform.latRange = original.latRange;\n  transform.width = original.width;\n  transform.height = original.height;\n  transform.zoom = original.zoom;\n  transform.center = original.center;\n  transform.angle = original.angle;\n  transform.altitude = original.altitude;\n  transform.pitch = original.pitch;\n  transform.bearing = original.bearing;\n  transform.altitude = original.altitude;\n  return transform;\n}\n\nMapGL.propTypes = PROP_TYPES;\nMapGL.childContextTypes = CHILD_CONTEXT_TYPES;\nMapGL.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAucmVhY3QuanMiXSwibmFtZXMiOlsiTUFYX1BJVENIIiwiUElUQ0hfTU9VU0VfVEhSRVNIT0xEIiwiUElUQ0hfQUNDRUwiLCJQUk9QX1RZUEVTIiwibGF0aXR1ZGUiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwibG9uZ2l0dWRlIiwiem9vbSIsIm1hcFN0eWxlIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiaW5zdGFuY2VPZiIsIkltbXV0YWJsZSIsIk1hcCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwib25DaGFuZ2VWaWV3cG9ydCIsImZ1bmMiLCJvbk1hcExvYWRlZCIsIndpZHRoIiwiaGVpZ2h0IiwiaXNEcmFnZ2luZyIsImJvb2wiLCJzdGFydERyYWdMbmdMYXQiLCJhcnJheSIsIm9uSG92ZXJGZWF0dXJlcyIsImlnbm9yZUVtcHR5RmVhdHVyZXMiLCJhdHRyaWJ1dGlvbkNvbnRyb2wiLCJvbkNsaWNrRmVhdHVyZXMiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJwcmV2ZW50U3R5bGVEaWZmaW5nIiwicGVyc3BlY3RpdmVFbmFibGVkIiwiYmVhcmluZyIsInBpdGNoIiwiYWx0aXR1ZGUiLCJkcmFnRGlzYWJsZWQiLCJ6b29tRGlzYWJsZWQiLCJib3VuZHMiLCJMaXN0IiwiREVGQVVMVF9QUk9QUyIsImNvbmZpZyIsIkRFRkFVTFRTIiwiTUFQQk9YX0FQSV9BQ0NFU1NfVE9LRU4iLCJDSElMRF9DT05URVhUX1RZUEVTIiwibWFwIiwib2JqZWN0IiwiTWFwR0wiLCJwdXJlUmVuZGVyIiwicHJvcHMiLCJzdGF0ZSIsInN0YXJ0QmVhcmluZyIsInN0YXJ0UGl0Y2giLCJtYXBib3hnbCIsImFjY2Vzc1Rva2VuIiwiX21hcFJlYWR5IiwiZ2V0Q2hpbGRDb250ZXh0IiwiX21hcCIsInRvSlMiLCJjb250YWluZXIiLCJyZWZzIiwibWFwYm94TWFwIiwiY2VudGVyIiwic3R5bGUiLCJpbnRlcmFjdGl2ZSIsImQzIiwic2VsZWN0IiwiZ2V0Q2FudmFzIiwiX3VwZGF0ZU1hcFZpZXdwb3J0IiwiX2NhbGxPbkNoYW5nZVZpZXdwb3J0IiwidHJhbnNmb3JtIiwib24iLCJuZXdQcm9wcyIsIl91cGRhdGVTdGF0ZUZyb21Qcm9wcyIsIl91cGRhdGVNYXBTdHlsZSIsInNldFN0YXRlIiwiX3VwZGF0ZU1hcFNpemUiLCJyZW1vdmUiLCJpc0ludGVyYWN0aXZlIiwib25DbGlja0ZlYXR1cmUiLCJDVVJTT1IiLCJHUkFCQklORyIsIkdSQUIiLCJvbGRQcm9wcyIsInNsaWNlIiwicHJldlN0eWxlIiwibmV4dFN0eWxlIiwicHJldktleXNNYXAiLCJzdHlsZUtleXNNYXAiLCJuZXh0S2V5c01hcCIsImRlbGV0ZSIsInByb3BzT3RoZXJUaGFuTGF5ZXJzT3JTb3VyY2VzRGlmZmVyIiwicHJldktleXNMaXN0IiwiT2JqZWN0Iiwia2V5cyIsIm5leHRLZXlzTGlzdCIsImxlbmd0aCIsInNvbWUiLCJnZXQiLCJrZXkiLCJfZ2V0TWFwIiwic2V0U3R5bGUiLCJzb3VyY2VzRGlmZiIsImxheWVyc0RpZmYiLCJ1cGRhdGVzIiwibm9kZSIsImxheWVyIiwiZW50ZXIiLCJhZGRTb3VyY2UiLCJpZCIsInNvdXJjZSIsInVwZGF0ZSIsInJlbW92ZVNvdXJjZSIsImV4aXQiLCJleGl0aW5nIiwiZ2V0TGF5ZXIiLCJyZW1vdmVMYXllciIsImFkZExheWVyIiwiYmVmb3JlIiwib2xkTWFwU3R5bGUiLCJfc2V0RGlmZlN0eWxlIiwidmlld3BvcnRDaGFuZ2VkIiwianVtcFRvIiwiZml0Qm91bmRzIiwic2l6ZUNoYW5nZWQiLCJyZXNpemUiLCJwb3MiLCJzdGFydFBvcyIsInhEZWx0YSIsIngiLCJ5RGVsdGEiLCJ5IiwiTWF0aCIsImFicyIsInNjYWxlIiwieVNjYWxlIiwibWF4IiwibWluIiwib3B0cyIsImdldENvbnRhaW5lciIsInNjcm9sbEhlaWdodCIsInNjcm9sbFdpZHRoIiwibGF0IiwibW9kIiwibG5nIiwicHJvamVjdGlvbk1hdHJpeCIsInByb2pNYXRyaXgiLCJsbmdMYXQiLCJ1bnByb2plY3RGcm9tVHJhbnNmb3JtIiwiY2xvbmVUcmFuc2Zvcm0iLCJzZXRMb2NhdGlvbkF0UG9pbnQiLCJfY2FsY3VsYXRlTmV3UGl0Y2hBbmRCZWFyaW5nIiwib3B0IiwiZmVhdHVyZXMiLCJxdWVyeVJlbmRlcmVkRmVhdHVyZXMiLCJzaXplIiwiYmJveCIsImFyb3VuZCIsInNjYWxlWm9vbSIsImNsYXNzTmFtZSIsImN1cnNvciIsIl9jdXJzb3IiLCJjb250ZW50IiwicG9zaXRpb24iLCJsZWZ0IiwidG9wIiwiY2hpbGRyZW4iLCJfb25Nb3VzZURvd24iLCJfb25Nb3VzZURyYWciLCJfb25Nb3VzZVJvdGF0ZSIsIl9vbk1vdXNlVXAiLCJfb25Nb3VzZU1vdmUiLCJfb25ab29tIiwiX29uWm9vbUVuZCIsIkNvbXBvbmVudCIsImF1dG9iaW5kIiwidmFsdWUiLCJkaXZpc29yIiwibW9kdWx1cyIsInBvaW50IiwicG9pbnRMb2NhdGlvbiIsIlBvaW50IiwiY29udmVydCIsIm9yaWdpbmFsIiwiVHJhbnNmb3JtIiwiX21pblpvb20iLCJfbWF4Wm9vbSIsImxhdFJhbmdlIiwiYW5nbGUiLCJwcm9wVHlwZXMiLCJjaGlsZENvbnRleHRUeXBlcyIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7b0NBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQWNBO0FBQ0E7OztBQWRBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBLElBQU1BLFlBQVksRUFBbEI7QUFDQSxJQUFNQyx3QkFBd0IsRUFBOUI7QUFDQSxJQUFNQyxjQUFjLEdBQXBCOztBQUVBLElBQU1D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QUF6QztBQUNEOztBQUVELFNBQVM5QixzQkFBVCxDQUFnQzlFLFNBQWhDLEVBQTJDNkcsS0FBM0MsRUFBa0Q7QUFDaEQsU0FBTzdHLFVBQVU4RyxhQUFWLENBQXdCQyxnQkFBTUMsT0FBTixDQUFjSCxLQUFkLENBQXhCLENBQVA7QUFDRDs7QUFFRCxTQUFTOUIsY0FBVCxDQUF3QmtDLFFBQXhCLEVBQWtDO0FBQ2hDLE1BQU1qSCxZQUFZLElBQUlrSCxtQkFBSixDQUFjRCxTQUFTRSxRQUF2QixFQUFpQ0YsU0FBU0csUUFBMUMsQ0FBbEI7QUFDQXBILFlBQVVxSCxRQUFWLEdBQXFCSixTQUFTSSxRQUE5QjtBQUNBckgsWUFBVWxELEtBQVYsR0FBa0JtSyxTQUFTbkssS0FBM0I7QUFDQWtELFlBQVVqRCxNQUFWLEdBQW1Ca0ssU0FBU2xLLE1BQTVCO0FBQ0FpRCxZQUFVN0QsSUFBVixHQUFpQjhLLFNBQVM5SyxJQUExQjtBQUNBNkQsWUFBVVIsTUFBVixHQUFtQnlILFNBQVN6SCxNQUE1QjtBQUNBUSxZQUFVc0gsS0FBVixHQUFrQkwsU0FBU0ssS0FBM0I7QUFDQXRILFlBQVVuQyxRQUFWLEdBQXFCb0osU0FBU3BKLFFBQTlCO0FBQ0FtQyxZQUFVcEMsS0FBVixHQUFrQnFKLFNBQVNySixLQUEzQjtBQUNBb0MsWUFBVXJDLE9BQVYsR0FBb0JzSixTQUFTdEosT0FBN0I7QUFDQXFDLFlBQVVuQyxRQUFWLEdBQXFCb0osU0FBU3BKLFFBQTlCO0FBQ0EsU0FBT21DLFNBQVA7QUFDRDs7QUFFRHZCLE1BQU04SSxTQUFOLEdBQWtCMUwsVUFBbEI7QUFDQTRDLE1BQU0rSSxpQkFBTixHQUEwQmxKLG1CQUExQjtBQUNBRyxNQUFNZ0osWUFBTixHQUFxQnZKLGFBQXJCIiwiZmlsZSI6Im1hcC5yZWFjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCBwdXJlUmVuZGVyIGZyb20gJ3B1cmUtcmVuZGVyLWRlY29yYXRvcic7XG5pbXBvcnQgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IG1hcGJveGdsLCB7UG9pbnR9IGZyb20gJ21hcGJveC1nbCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IE1hcEludGVyYWN0aW9ucyBmcm9tICcuL21hcC1pbnRlcmFjdGlvbnMucmVhY3QnO1xuaW1wb3J0IGRpZmZTdHlsZXMgZnJvbSAnLi9kaWZmLXN0eWxlcyc7XG5cbi8vIE5PVEU6IFRyYW5zZm9ybSBpcyBub3QgYSBwdWJsaWMgQVBJIHNvIHdlIHNob3VsZCBiZSBjYXJlZnVsIHRvIGFsd2F5cyBsb2NrXG4vLyBkb3duIG1hcGJveC1nbCB0byBhIHNwZWNpZmljIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIHZlcnNpb24uXG5pbXBvcnQgVHJhbnNmb3JtIGZyb20gJ21hcGJveC1nbC9qcy9nZW8vdHJhbnNmb3JtJztcblxuLy8gTm90ZTogTWF4IHBpdGNoIGlzIGEgaGFyZCBjb2RlZCB2YWx1ZSAobm90IGEgbmFtZWQgY29uc3RhbnQpIGluIHRyYW5zZm9ybS5qc1xuY29uc3QgTUFYX1BJVENIID0gNjA7XG5jb25zdCBQSVRDSF9NT1VTRV9USFJFU0hPTEQgPSAyMDtcbmNvbnN0IFBJVENIX0FDQ0VMID0gMS4yO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICAvKipcbiAgICAqIFRoZSBsYXRpdHVkZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXAuXG4gICAgKi9cbiAgbGF0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAgKiBUaGUgbG9uZ2l0dWRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIG1hcC5cbiAgICAqL1xuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAgKiBUaGUgdGlsZSB6b29tIGxldmVsIG9mIHRoZSBtYXAuXG4gICAgKi9cbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKipcbiAgICAqIFRoZSBNYXBib3ggc3R5bGUgdGhlIGNvbXBvbmVudCBzaG91bGQgdXNlLiBDYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHVybFxuICAgICogb3IgYSBNYXBib3hHTCBzdHlsZSBJbW11dGFibGUuTWFwIG9iamVjdC5cbiAgICAqL1xuICBtYXBTdHlsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihJbW11dGFibGUuTWFwKVxuICBdKSxcbiAgLyoqXG4gICAgKiBUaGUgTWFwYm94IEFQSSBhY2Nlc3MgdG9rZW4gdG8gcHJvdmlkZSB0byBtYXBib3gtZ2wtanMuIFRoaXMgaXMgcmVxdWlyZWRcbiAgICAqIHdoZW4gdXNpbmcgTWFwYm94IHByb3ZpZGVkIHZlY3RvciB0aWxlcyBhbmQgc3R5bGVzLlxuICAgICovXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICAqIGBvbkNoYW5nZVZpZXdwb3J0YCBjYWxsYmFjayBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0ZWQgd2l0aCB0aGVcbiAgICAqIG1hcC4gVGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGNvbnRhaW5lcnMgYGxhdGl0dWRlYCxcbiAgICAqIGBsb25naXR1ZGVgIGFuZCBgem9vbWAgaW5mb3JtYXRpb24uXG4gICAgKi9cbiAgb25DaGFuZ2VWaWV3cG9ydDogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgICogYG9uTWFwTG9hZGVkYCBjYWxsYmFjayBpcyBmaXJlZCBvbiB0aGUgbWFwJ3MgJ2xvYWQnIGV2ZW50XG4gICAgKi9cbiAgb25NYXBMb2FkZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbWFwLiBOdW1iZXIgaW4gcGl4ZWxzIG9yIENTUyBzdHJpbmcgcHJvcCBlLmcuICcxMDAlJ1xuICAgICovXG4gIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgIFByb3BUeXBlcy5zdHJpbmdcbiAgXSksXG4gIC8qKlxuICAgICogVGhlIGhlaWdodCBvZiB0aGUgbWFwLiBOdW1iZXIgaW4gcGl4ZWxzIG9yIENTUyBzdHJpbmcgcHJvcCBlLmcuICcxMDAlJ1xuICAgICovXG4gIGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICBQcm9wVHlwZXMuc3RyaW5nXG4gIF0pLFxuICAvKipcbiAgICAqIElzIHRoZSBjb21wb25lbnQgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQuIFRoaXMgaXMgdXNlZCB0byBzaG93L2hpZGUgdGhlXG4gICAgKiBkcmFnIGN1cnNvci4gQWxzbyB1c2VkIGFzIGFuIG9wdGltaXphdGlvbiBpbiBzb21lIG92ZXJsYXlzIGJ5IHByZXZlbnRpbmdcbiAgICAqIHJlbmRlcmluZyB3aGlsZSBkcmFnZ2luZy5cbiAgICAqL1xuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAgKiBSZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIG1vdXNlIHByb2plY3Rpb24gYWZ0ZXIgdGhlIGZpcnN0IGNsaWNrIGV2ZW50XG4gICAgKiBkdXJpbmcgZHJhZ2dpbmcuIFdoZXJlIHRoZSBtYXAgaXMgZGVwZW5kcyBvbiB3aGVyZSB5b3UgZmlyc3QgY2xpY2tlZCBvblxuICAgICogdGhlIG1hcC5cbiAgICAqL1xuICBzdGFydERyYWdMbmdMYXQ6IFByb3BUeXBlcy5hcnJheSxcbiAgLyoqXG4gICAgKiBDYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgaG92ZXJlZCBvdmVyLiBGZWF0dXJlcyBtdXN0IHNldCB0aGVcbiAgICAqIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgdG8gYHRydWVgIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuIHNlZSB0aGVcbiAgICAqIE1hcGJveCBleGFtcGxlOiBodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZlYXR1cmVzYXQvXG4gICAgKiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGNhbGxiYWNrIHdpbGwgYmUgdGhlIGFycmF5IG9mIGZlYXR1cmUgdGhlXG4gICAgKiBtb3VzZSBpcyBvdmVyLiBUaGlzIGlzIHRoZSBzYW1lIHJlc3BvbnNlIHJldHVybmVkIGZyb20gYGZlYXR1cmVzQXRgLlxuICAgICovXG4gIG9uSG92ZXJGZWF0dXJlczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgICogRGVmYXVsdHMgdG8gVFJVRVxuICAgICogU2V0IHRvIGZhbHNlIHRvIGVuYWJsZSBvbkhvdmVyRmVhdHVyZXMgdG8gYmUgY2FsbGVkIHJlZ2FyZGxlc3MgaWZcbiAgICAqIHRoZXJlIGlzIGFuIGFjdHVhbCBmZWF0dXJlIGF0IHgsIHkuIFRoaXMgaXMgdXNlZnVsIHRvIGVtdWxhdGVcbiAgICAqIFwibW91c2Utb3V0XCIgYmVoYXZpb3JzIG9uIGZlYXR1cmVzLlxuICAgICovXG4gIGlnbm9yZUVtcHR5RmVhdHVyZXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogU2hvdyBhdHRyaWJ1dGlvbiBjb250cm9sIG9yIG5vdC5cbiAgICAqL1xuICBhdHRyaWJ1dGlvbkNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogQ2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb24uIEZlYXR1cmVzIG11c3Qgc2V0IHRoZVxuICAgICogYGludGVyYWN0aXZlYCBwcm9wZXJ0eSB0byBgdHJ1ZWAgZm9yIHRoaXMgdG8gd29yayBwcm9wZXJseS4gc2VlIHRoZVxuICAgICogTWFwYm94IGV4YW1wbGU6IGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmVhdHVyZXNhdC9cbiAgICAqIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgY2FsbGJhY2sgd2lsbCBiZSB0aGUgYXJyYXkgb2YgZmVhdHVyZSB0aGVcbiAgICAqIG1vdXNlIGlzIG92ZXIuIFRoaXMgaXMgdGhlIHNhbWUgcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSBgZmVhdHVyZXNBdGAuXG4gICAgKi9cbiAgb25DbGlja0ZlYXR1cmVzOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICAqIFBhc3NlZCB0byBNYXBib3ggTWFwIGNvbnN0cnVjdG9yIHdoaWNoIHBhc3NlcyBpdCB0byB0aGUgY2FudmFzIGNvbnRleHQuXG4gICAgKiBUaGlzIGlzIHVuc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBleHBvcnQgdGhlIGNhbnZhcyBhcyBhIFBORy5cbiAgICAqL1xuICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogVGhlcmUgYXJlIHN0aWxsIGtub3duIGlzc3VlcyB3aXRoIHN0eWxlIGRpZmZpbmcuIEFzIGEgdGVtcG9yYXJ5IHN0b3BnYXAsXG4gICAgKiBhZGQgdGhlIG9wdGlvbiB0byBwcmV2ZW50IHN0eWxlIGRpZmZpbmcuXG4gICAgKi9cbiAgcHJldmVudFN0eWxlRGlmZmluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBFbmFibGVzIHBlcnNwZWN0aXZlIGNvbnRyb2wgZXZlbnQgaGFuZGxpbmcgKENvbW1hbmQtcm90YXRlKVxuICAgICovXG4gIHBlcnNwZWN0aXZlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBTcGVjaWZ5IHRoZSBiZWFyaW5nIG9mIHRoZSB2aWV3cG9ydFxuICAgICovXG4gIGJlYXJpbmc6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAgKiBTcGVjaWZ5IHRoZSBwaXRjaCBvZiB0aGUgdmlld3BvcnRcbiAgICAqL1xuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICAqIFNwZWNpZnkgdGhlIGFsdGl0dWRlIG9mIHRoZSB2aWV3cG9ydCBjYW1lcmFcbiAgICAqIFVuaXQ6IG1hcCBoZWlnaHRzLCBkZWZhdWx0IDEuNVxuICAgICogTm9uLXB1YmxpYyBBUEksIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTEzN1xuICAgICovXG4gIGFsdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgICogRGlzYWJsZWQgZHJhZ2dpbmcgb2YgdGhlIG1hcFxuICAgICovXG4gIGRyYWdEaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAgKiBEaXNhYmxlZCB6b29taW5nIG9mIHRoZSBtYXBcbiAgICAqL1xuICB6b29tRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgICogQm91bmRzIHRvIGZpdCBvbiBzY3JlZW5cbiAgICAqL1xuICBib3VuZHM6IFByb3BUeXBlcy5pbnN0YW5jZU9mKEltbXV0YWJsZS5MaXN0KVxufTtcblxuY29uc3QgREVGQVVMVF9QUk9QUyA9IHtcbiAgbWFwU3R5bGU6ICdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY4JyxcbiAgb25DaGFuZ2VWaWV3cG9ydDogbnVsbCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IGNvbmZpZy5ERUZBVUxUUy5NQVBCT1hfQVBJX0FDQ0VTU19UT0tFTixcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuICBpZ25vcmVFbXB0eUZlYXR1cmVzOiB0cnVlLFxuICBiZWFyaW5nOiAwLFxuICBwaXRjaDogMCxcbiAgYWx0aXR1ZGU6IDEuNVxufTtcblxuY29uc3QgQ0hJTERfQ09OVEVYVF9UWVBFUyA9IHtcbiAgbWFwOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5AcHVyZVJlbmRlclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFwR0wgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIHN0YXJ0RHJhZ0xuZ0xhdDogbnVsbCxcbiAgICAgIHN0YXJ0QmVhcmluZzogbnVsbCxcbiAgICAgIHN0YXJ0UGl0Y2g6IG51bGxcbiAgICB9O1xuICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gcHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW47XG5cbiAgICB0aGlzLl9tYXBSZWFkeSA9IGZhbHNlO1xuXG4gICAgdGhpcy5nZXRDaGlsZENvbnRleHQgPSAoKSA9PiAoe1xuICAgICAgbWFwOiB0aGlzLl9tYXBcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IG1hcFN0eWxlID0gdGhpcy5wcm9wcy5tYXBTdHlsZSBpbnN0YW5jZW9mIEltbXV0YWJsZS5NYXAgP1xuICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZS50b0pTKCkgOlxuICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZTtcbiAgICBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5yZWZzLm1hcGJveE1hcCxcbiAgICAgIGNlbnRlcjogW3RoaXMucHJvcHMubG9uZ2l0dWRlLCB0aGlzLnByb3BzLmxhdGl0dWRlXSxcbiAgICAgIHpvb206IHRoaXMucHJvcHMuem9vbSxcbiAgICAgIHBpdGNoOiB0aGlzLnByb3BzLnBpdGNoLFxuICAgICAgYmVhcmluZzogdGhpcy5wcm9wcy5iZWFyaW5nLFxuICAgICAgc3R5bGU6IG1hcFN0eWxlLFxuICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0aGlzLnByb3BzLnByZXNlcnZlRHJhd2luZ0J1ZmZlclxuICAgICAgLy8gVE9ETz9cbiAgICAgIC8vIGF0dHJpYnV0aW9uQ29udHJvbDogdGhpcy5wcm9wcy5hdHRyaWJ1dGlvbkNvbnRyb2xcbiAgICB9KTtcblxuICAgIGQzLnNlbGVjdChtYXAuZ2V0Q2FudmFzKCkpLnN0eWxlKCdvdXRsaW5lJywgJ25vbmUnKTtcblxuICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydCh7fSwgdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vbk1hcExvYWRlZCkge1xuICAgICAgbWFwLm9uKCdsb2FkJywgKCkgPT4gdGhpcy5wcm9wcy5vbk1hcExvYWRlZChtYXApKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0IGZvciBleHRlcm5hbCBtYW5pcHVsYXRpb24gb2YgdW5kZXJseWluZyBtYXBcbiAgICAvLyBUT0RPIGEgYmV0dGVyIGFwcHJvYWNoXG4gICAgbWFwLm9uKCdzdHlsZS5sb2FkJywgKCkgPT4gdGhpcy5fbWFwUmVhZHkgPSB0cnVlKTtcbiAgICBtYXAub24oJ21vdmVlbmQnLCAoKSA9PiB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydChtYXAudHJhbnNmb3JtKSk7XG4gICAgbWFwLm9uKCd6b29tZW5kJywgKCkgPT4gdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSkpO1xuICB9XG5cbiAgLy8gTmV3IHByb3BzIGFyZSBjb21pbicgcm91bmQgdGhlIGNvcm5lciFcbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcykge1xuICAgIHRoaXMuX3VwZGF0ZVN0YXRlRnJvbVByb3BzKHRoaXMucHJvcHMsIG5ld1Byb3BzKTtcbiAgICB0aGlzLl91cGRhdGVNYXBWaWV3cG9ydCh0aGlzLnByb3BzLCBuZXdQcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlTWFwU3R5bGUodGhpcy5wcm9wcywgbmV3UHJvcHMpO1xuICAgIC8vIFNhdmUgd2lkdGgvaGVpZ2h0IHNvIHRoYXQgd2UgY2FuIGNoZWNrIHRoZW0gaW4gY29tcG9uZW50RGlkVXBkYXRlXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB3aWR0aDogdGhpcy5wcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5wcm9wcy5oZWlnaHRcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAvLyBtYXAucmVzaXplKCkgcmVhZHMgc2l6ZSBmcm9tIERPTSwgd2UgbmVlZCB0byBjYWxsIGFmdGVyIHJlbmRlclxuICAgIHRoaXMuX3VwZGF0ZU1hcFNpemUodGhpcy5zdGF0ZSwgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgX2N1cnNvcigpIHtcbiAgICBjb25zdCBpc0ludGVyYWN0aXZlID1cbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCB8fFxuICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrRmVhdHVyZSB8fFxuICAgICAgdGhpcy5wcm9wcy5vbkhvdmVyRmVhdHVyZXM7XG4gICAgaWYgKGlzSW50ZXJhY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmlzRHJhZ2dpbmcgP1xuICAgICAgICBjb25maWcuQ1VSU09SLkdSQUJCSU5HIDogY29uZmlnLkNVUlNPUi5HUkFCO1xuICAgIH1cbiAgICByZXR1cm4gJ2luaGVyaXQnO1xuICB9XG5cbiAgX2dldE1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwO1xuICB9XG5cbiAgX3VwZGF0ZVN0YXRlRnJvbVByb3BzKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gbmV3UHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW47XG4gICAgY29uc3Qge3N0YXJ0RHJhZ0xuZ0xhdH0gPSBuZXdQcm9wcztcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN0YXJ0RHJhZ0xuZ0xhdDogc3RhcnREcmFnTG5nTGF0ICYmIHN0YXJ0RHJhZ0xuZ0xhdC5zbGljZSgpXG4gICAgfSk7XG4gIH1cblxuICAvLyBJbmRpdmlkdWFsbHkgdXBkYXRlIHRoZSBtYXBzIHNvdXJjZSBhbmQgbGF5ZXJzIHRoYXQgaGF2ZSBjaGFuZ2VkIGlmIGFsbFxuICAvLyBvdGhlciBzdHlsZSBwcm9wcyBoYXZlbid0IGNoYW5nZWQuIFRoaXMgcHJldmVudHMgZmxpY2tpbmcgb2YgdGhlIG1hcCB3aGVuXG4gIC8vIHN0eWxlcyBvbmx5IGNoYW5nZSBzb3VyY2VzIG9yIGxheWVycy5cbiAgX3NldERpZmZTdHlsZShwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICAgIGNvbnN0IHByZXZLZXlzTWFwID0gcHJldlN0eWxlICYmIHN0eWxlS2V5c01hcChwcmV2U3R5bGUpIHx8IHt9O1xuICAgIGNvbnN0IG5leHRLZXlzTWFwID0gc3R5bGVLZXlzTWFwKG5leHRTdHlsZSk7XG4gICAgZnVuY3Rpb24gc3R5bGVLZXlzTWFwKHN0eWxlKSB7XG4gICAgICByZXR1cm4gc3R5bGUubWFwKCgpID0+IHRydWUpLmRlbGV0ZSgnbGF5ZXJzJykuZGVsZXRlKCdzb3VyY2VzJykudG9KUygpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wc090aGVyVGhhbkxheWVyc09yU291cmNlc0RpZmZlcigpIHtcbiAgICAgIGNvbnN0IHByZXZLZXlzTGlzdCA9IE9iamVjdC5rZXlzKHByZXZLZXlzTWFwKTtcbiAgICAgIGNvbnN0IG5leHRLZXlzTGlzdCA9IE9iamVjdC5rZXlzKG5leHRLZXlzTWFwKTtcbiAgICAgIGlmIChwcmV2S2V5c0xpc3QubGVuZ3RoICE9PSBuZXh0S2V5c0xpc3QubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gYG5leHRTdHlsZWAgYW5kIGBwcmV2U3R5bGVgIHNob3VsZCBub3QgaGF2ZSB0aGUgc2FtZSBzZXQgb2YgcHJvcHMuXG4gICAgICBpZiAobmV4dEtleXNMaXN0LnNvbWUoXG4gICAgICAgIGtleSA9PiBwcmV2U3R5bGUuZ2V0KGtleSkgIT09IG5leHRTdHlsZS5nZXQoa2V5KVxuICAgICAgICAvLyBCdXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aG9zZSBwcm9wcyBpcyBkaWZmZXJlbnQuXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuXG4gICAgaWYgKCFwcmV2U3R5bGUgfHwgcHJvcHNPdGhlclRoYW5MYXllcnNPclNvdXJjZXNEaWZmZXIoKSkge1xuICAgICAgbWFwLnNldFN0eWxlKG5leHRTdHlsZS50b0pTKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtzb3VyY2VzRGlmZiwgbGF5ZXJzRGlmZn0gPSBkaWZmU3R5bGVzKHByZXZTdHlsZSwgbmV4dFN0eWxlKTtcblxuICAgIC8vIFRPRE86IEl0J3MgcmF0aGVyIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgc3R5bGUgZGlmZmluZyBpbiB0aGUgcHJlc2VuY2VcbiAgICAvLyBvZiByZWZzLiBGb3Igbm93LCBpZiBhbnkgc3R5bGUgdXBkYXRlIGhhcyBhIHJlZiwgZmFsbGJhY2sgdG8gbm8gZGlmZmluZy5cbiAgICAvLyBXZSBjYW4gY29tZSBiYWNrIHRvIHRoaXMgY2FzZSBpZiB0aGVyZSdzIGEgc29saWQgdXNlY2FzZS5cbiAgICBpZiAobGF5ZXJzRGlmZi51cGRhdGVzLnNvbWUobm9kZSA9PiBub2RlLmxheWVyLmdldCgncmVmJykpKSB7XG4gICAgICBtYXAuc2V0U3R5bGUobmV4dFN0eWxlLnRvSlMoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRlciBvZiBzb3VyY2VzRGlmZi5lbnRlcikge1xuICAgICAgbWFwLmFkZFNvdXJjZShlbnRlci5pZCwgZW50ZXIuc291cmNlLnRvSlMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXBkYXRlIG9mIHNvdXJjZXNEaWZmLnVwZGF0ZSkge1xuICAgICAgbWFwLnJlbW92ZVNvdXJjZSh1cGRhdGUuaWQpO1xuICAgICAgbWFwLmFkZFNvdXJjZSh1cGRhdGUuaWQsIHVwZGF0ZS5zb3VyY2UudG9KUygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBleGl0IG9mIHNvdXJjZXNEaWZmLmV4aXQpIHtcbiAgICAgIG1hcC5yZW1vdmVTb3VyY2UoZXhpdC5pZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhpdCBvZiBsYXllcnNEaWZmLmV4aXRpbmcpIHtcbiAgICAgIGlmIChtYXAuc3R5bGUuZ2V0TGF5ZXIoZXhpdC5pZCkpIHtcbiAgICAgICAgbWFwLnJlbW92ZUxheWVyKGV4aXQuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiBsYXllcnNEaWZmLnVwZGF0ZXMpIHtcbiAgICAgIGlmICghdXBkYXRlLmVudGVyKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gb2xkIGxheWVyIHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZC4gUmVtb3ZlIHRoZSBvbGQgbGF5ZXJcbiAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSBpZCBhbmQgYWRkIGl0IGJhY2sgYWdhaW4uXG4gICAgICAgIG1hcC5yZW1vdmVMYXllcih1cGRhdGUuaWQpO1xuICAgICAgfVxuICAgICAgbWFwLmFkZExheWVyKHVwZGF0ZS5sYXllci50b0pTKCksIHVwZGF0ZS5iZWZvcmUpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXBTdHlsZShvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBtYXBTdHlsZSA9IG5ld1Byb3BzLm1hcFN0eWxlO1xuICAgIGNvbnN0IG9sZE1hcFN0eWxlID0gb2xkUHJvcHMubWFwU3R5bGU7XG4gICAgaWYgKG1hcFN0eWxlICE9PSBvbGRNYXBTdHlsZSkge1xuICAgICAgaWYgKG1hcFN0eWxlIGluc3RhbmNlb2YgSW1tdXRhYmxlLk1hcCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5wcmV2ZW50U3R5bGVEaWZmaW5nKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0TWFwKCkuc2V0U3R5bGUobWFwU3R5bGUudG9KUygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZXREaWZmU3R5bGUob2xkTWFwU3R5bGUsIG1hcFN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0TWFwKCkuc2V0U3R5bGUobWFwU3R5bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXBWaWV3cG9ydChvbGRQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCB2aWV3cG9ydENoYW5nZWQgPVxuICAgICAgbmV3UHJvcHMubGF0aXR1ZGUgIT09IG9sZFByb3BzLmxhdGl0dWRlIHx8XG4gICAgICBuZXdQcm9wcy5sb25naXR1ZGUgIT09IG9sZFByb3BzLmxvbmdpdHVkZSB8fFxuICAgICAgbmV3UHJvcHMuem9vbSAhPT0gb2xkUHJvcHMuem9vbSB8fFxuICAgICAgbmV3UHJvcHMucGl0Y2ggIT09IG9sZFByb3BzLnBpdGNoIHx8XG4gICAgICBuZXdQcm9wcy5iZWFyaW5nICE9PSBvbGRQcm9wcy5iZWFyaW5nIHx8XG4gICAgICBuZXdQcm9wcy5hbHRpdHVkZSAhPT0gb2xkUHJvcHMuYWx0aXR1ZGU7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcblxuICAgIGlmICh2aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgIG1hcC5qdW1wVG8oe1xuICAgICAgICBjZW50ZXI6IFtuZXdQcm9wcy5sb25naXR1ZGUsIG5ld1Byb3BzLmxhdGl0dWRlXSxcbiAgICAgICAgem9vbTogbmV3UHJvcHMuem9vbSxcbiAgICAgICAgYmVhcmluZzogbmV3UHJvcHMuYmVhcmluZyxcbiAgICAgICAgcGl0Y2g6IG5ld1Byb3BzLnBpdGNoXG4gICAgICB9KTtcblxuICAgICAgLy8gVE9ETyAtIGp1bXBUbyBkb2Vzbid0IGhhbmRsZSBhbHRpdHVkZVxuICAgICAgaWYgKG5ld1Byb3BzLmFsdGl0dWRlICE9PSBvbGRQcm9wcy5hbHRpdHVkZSkge1xuICAgICAgICBtYXAudHJhbnNmb3JtLmFsdGl0dWRlID0gbmV3UHJvcHMuYWx0aXR1ZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFByb3BzLmJvdW5kcyAhPT0gbmV3UHJvcHMuYm91bmRzICYmIG5ld1Byb3BzLmJvdW5kcykge1xuICAgICAgbWFwLmZpdEJvdW5kcyhuZXdQcm9wcy5ib3VuZHMudG9KUygpKTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3RlOiBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgcmVuZGVyIChlLmcuIGluIGNvbXBvbmVudERpZFVwZGF0ZSlcbiAgX3VwZGF0ZU1hcFNpemUob2xkUHJvcHMsIG5ld1Byb3BzKSB7XG4gICAgY29uc3Qgc2l6ZUNoYW5nZWQgPVxuICAgICAgb2xkUHJvcHMud2lkdGggIT09IG5ld1Byb3BzLndpZHRoIHx8IG9sZFByb3BzLmhlaWdodCAhPT0gbmV3UHJvcHMuaGVpZ2h0O1xuXG4gICAgaWYgKHNpemVDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICAgIG1hcC5yZXNpemUoKTtcbiAgICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KG1hcC50cmFuc2Zvcm0pO1xuICAgIH1cbiAgfVxuXG4gIF9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoe3Bvcywgc3RhcnRQb3MsIHN0YXJ0QmVhcmluZywgc3RhcnRQaXRjaH0pIHtcbiAgICBjb25zdCB4RGVsdGEgPSBwb3MueCAtIHN0YXJ0UG9zLng7XG4gICAgY29uc3QgYmVhcmluZyA9IHN0YXJ0QmVhcmluZyArIDE4MCAqIHhEZWx0YSAvIHRoaXMucHJvcHMud2lkdGg7XG5cbiAgICBsZXQgcGl0Y2ggPSBzdGFydFBpdGNoO1xuICAgIGNvbnN0IHlEZWx0YSA9IHBvcy55IC0gc3RhcnRQb3MueTtcbiAgICBpZiAoeURlbHRhID4gMCkge1xuICAgICAgLy8gRHJhZ2dpbmcgZG93bndhcmRzLCBncmFkdWFsbHkgZGVjcmVhc2UgcGl0Y2hcbiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnByb3BzLmhlaWdodCAtIHN0YXJ0UG9zLnkpID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlID0geURlbHRhIC8gKHRoaXMucHJvcHMuaGVpZ2h0IC0gc3RhcnRQb3MueSk7XG4gICAgICAgIHBpdGNoID0gKDEgLSBzY2FsZSkgKiBQSVRDSF9BQ0NFTCAqIHN0YXJ0UGl0Y2g7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5RGVsdGEgPCAwKSB7XG4gICAgICAvLyBEcmFnZ2luZyB1cHdhcmRzLCBncmFkdWFsbHkgaW5jcmVhc2UgcGl0Y2hcbiAgICAgIGlmIChzdGFydFBvcy55ID4gUElUQ0hfTU9VU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgIC8vIE1vdmUgZnJvbSAwIHRvIDEgYXMgd2UgZHJhZyB1cHdhcmRzXG4gICAgICAgIGNvbnN0IHlTY2FsZSA9IDEgLSBwb3MueSAvIHN0YXJ0UG9zLnk7XG4gICAgICAgIC8vIEdyYWR1YWxseSBhZGQgdW50aWwgd2UgaGl0IG1heCBwaXRjaFxuICAgICAgICBwaXRjaCA9IHN0YXJ0UGl0Y2ggKyB5U2NhbGUgKiAoTUFYX1BJVENIIC0gc3RhcnRQaXRjaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5kZWJ1ZyhzdGFydFBpdGNoLCBwaXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBpdGNoOiBNYXRoLm1heChNYXRoLm1pbihwaXRjaCwgTUFYX1BJVENIKSwgMCksXG4gICAgICBiZWFyaW5nXG4gICAgfTtcbiAgfVxuXG4gICAvLyBIZWxwZXIgdG8gY2FsbCBwcm9wcy5vbkNoYW5nZVZpZXdwb3J0XG4gIF9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIG9wdHMgPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHtzY3JvbGxIZWlnaHQ6IGhlaWdodCwgc2Nyb2xsV2lkdGg6IHdpZHRofSA9IHRoaXMuX2dldE1hcCgpLmdldENvbnRhaW5lcigpO1xuXG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlVmlld3BvcnQoe1xuICAgICAgICBsYXRpdHVkZTogdHJhbnNmb3JtLmNlbnRlci5sYXQsXG4gICAgICAgIGxvbmdpdHVkZTogbW9kKHRyYW5zZm9ybS5jZW50ZXIubG5nICsgMTgwLCAzNjApIC0gMTgwLFxuICAgICAgICB6b29tOiB0cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgcGl0Y2g6IHRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgYmVhcmluZzogbW9kKHRyYW5zZm9ybS5iZWFyaW5nICsgMTgwLCAzNjApIC0gMTgwLFxuXG4gICAgICAgIGlzRHJhZ2dpbmc6IHRoaXMucHJvcHMuaXNEcmFnZ2luZyxcbiAgICAgICAgc3RhcnREcmFnTG5nTGF0OiB0aGlzLnByb3BzLnN0YXJ0RHJhZ0xuZ0xhdCxcbiAgICAgICAgc3RhcnRCZWFyaW5nOiB0aGlzLnByb3BzLnN0YXJ0QmVhcmluZyxcbiAgICAgICAgc3RhcnRQaXRjaDogdGhpcy5wcm9wcy5zdGFydFBpdGNoLFxuXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXg6IHRyYW5zZm9ybS5wcm9qTWF0cml4LFxuXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgd2lkdGgsXG5cbiAgICAgICAgLi4ub3B0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQGF1dG9iaW5kIF9vbk1vdXNlRG93bih7cG9zfSkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIGNvbnN0IGxuZ0xhdCA9IHVucHJvamVjdEZyb21UcmFuc2Zvcm0obWFwLnRyYW5zZm9ybSwgcG9zKTtcbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydChtYXAudHJhbnNmb3JtLCB7XG4gICAgICBpc0RyYWdnaW5nOiB0cnVlLFxuICAgICAgc3RhcnREcmFnTG5nTGF0OiBbbG5nTGF0LmxuZywgbG5nTGF0LmxhdF0sXG4gICAgICBzdGFydEJlYXJpbmc6IG1hcC50cmFuc2Zvcm0uYmVhcmluZyxcbiAgICAgIHN0YXJ0UGl0Y2g6IG1hcC50cmFuc2Zvcm0ucGl0Y2hcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25Nb3VzZURyYWcoe3Bvc30pIHtcbiAgICBpZiAoIXRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCB8fCB0aGlzLnByb3BzLmRyYWdEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRha2UgdGhlIHN0YXJ0IGxuZ2xhdCBhbmQgcHV0IGl0IHdoZXJlIHRoZSBtb3VzZSBpcyBkb3duLlxuICAgIGFzc2VydCh0aGlzLnByb3BzLnN0YXJ0RHJhZ0xuZ0xhdCwgJ2BzdGFydERyYWdMbmdMYXRgIHByb3AgaXMgcmVxdWlyZWQgJyArXG4gICAgICAnZm9yIG1vdXNlIGRyYWcgYmVoYXZpb3IgdG8gY2FsY3VsYXRlIHdoZXJlIHRvIHBvc2l0aW9uIHRoZSBtYXAuJyk7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KHRoaXMucHJvcHMuc3RhcnREcmFnTG5nTGF0LCBwb3MpO1xuICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KHRyYW5zZm9ybSwge1xuICAgICAgaXNEcmFnZ2luZzogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgQGF1dG9iaW5kIF9vbk1vdXNlUm90YXRlKHtwb3MsIHN0YXJ0UG9zfSkge1xuICAgIGlmICghdGhpcy5wcm9wcy5vbkNoYW5nZVZpZXdwb3J0IHx8ICF0aGlzLnByb3BzLnBlcnNwZWN0aXZlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtzdGFydEJlYXJpbmcsIHN0YXJ0UGl0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICBhc3NlcnQodHlwZW9mIHN0YXJ0QmVhcmluZyA9PT0gJ251bWJlcicsXG4gICAgICAnYHN0YXJ0QmVhcmluZ2AgcHJvcCBpcyByZXF1aXJlZCBmb3IgbW91c2Ugcm90YXRlIGJlaGF2aW9yJyk7XG4gICAgYXNzZXJ0KHR5cGVvZiBzdGFydFBpdGNoID09PSAnbnVtYmVyJyxcbiAgICAgICdgc3RhcnRQaXRjaGAgcHJvcCBpcyByZXF1aXJlZCBmb3IgbW91c2Ugcm90YXRlIGJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcblxuICAgIGNvbnN0IHtwaXRjaCwgYmVhcmluZ30gPSB0aGlzLl9jYWxjdWxhdGVOZXdQaXRjaEFuZEJlYXJpbmcoe1xuICAgICAgcG9zLFxuICAgICAgc3RhcnRQb3MsXG4gICAgICBzdGFydEJlYXJpbmcsXG4gICAgICBzdGFydFBpdGNoXG4gICAgfSk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgdHJhbnNmb3JtLnBpdGNoID0gcGl0Y2g7XG5cbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25Nb3VzZU1vdmUob3B0KSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLm9uSG92ZXJGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIGNvbnN0IHBvcyA9IG9wdC5wb3M7XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoW3Bvcy54LCBwb3MueV0pO1xuICAgIGlmICghZmVhdHVyZXMubGVuZ3RoICYmIHRoaXMucHJvcHMuaWdub3JlRW1wdHlGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uSG92ZXJGZWF0dXJlcyhmZWF0dXJlcyk7XG4gIH1cblxuICBAYXV0b2JpbmQgX29uTW91c2VVcChvcHQpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMub25DbGlja0ZlYXR1cmVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gdGhpcy5fZ2V0TWFwKCk7XG4gICAgdGhpcy5fY2FsbE9uQ2hhbmdlVmlld3BvcnQobWFwLnRyYW5zZm9ybSwge1xuICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICBzdGFydERyYWdMbmdMYXQ6IG51bGwsXG4gICAgICBzdGFydEJlYXJpbmc6IG51bGwsXG4gICAgICBzdGFydFBpdGNoOiBudWxsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb3MgPSBvcHQucG9zO1xuXG4gICAgLy8gUmFkaXVzIGVuYWJsZXMgcG9pbnQgZmVhdHVyZXMsIGxpa2UgbWFya2VyIHN5bWJvbHMsIHRvIGJlIGNsaWNrZWQuXG4gICAgY29uc3Qgc2l6ZSA9IDE1O1xuICAgIGNvbnN0IGJib3ggPSBbW3Bvcy54IC0gc2l6ZSwgcG9zLnkgLSBzaXplXSwgW3Bvcy54ICsgc2l6ZSwgcG9zLnkgKyBzaXplXV07XG4gICAgY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGJib3gpO1xuICAgIGlmICghZmVhdHVyZXMubGVuZ3RoICYmIHRoaXMucHJvcHMuaWdub3JlRW1wdHlGZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uQ2xpY2tGZWF0dXJlcyhmZWF0dXJlcyk7XG4gIH1cblxuICBAYXV0b2JpbmQgX29uWm9vbSh7cG9zLCBzY2FsZX0pIHtcbiAgICBpZiAodGhpcy5wcm9wcy56b29tRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSB0aGlzLl9nZXRNYXAoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjbG9uZVRyYW5zZm9ybShtYXAudHJhbnNmb3JtKTtcbiAgICBjb25zdCBhcm91bmQgPSB1bnByb2plY3RGcm9tVHJhbnNmb3JtKHRyYW5zZm9ybSwgcG9zKTtcbiAgICB0cmFuc2Zvcm0uem9vbSA9IHRyYW5zZm9ybS5zY2FsZVpvb20obWFwLnRyYW5zZm9ybS5zY2FsZSAqIHNjYWxlKTtcbiAgICB0cmFuc2Zvcm0uc2V0TG9jYXRpb25BdFBvaW50KGFyb3VuZCwgcG9zKTtcbiAgICB0aGlzLl9jYWxsT25DaGFuZ2VWaWV3cG9ydCh0cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIEBhdXRvYmluZCBfb25ab29tRW5kKCkge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuX2dldE1hcCgpO1xuICAgIHRoaXMuX2NhbGxPbkNoYW5nZVZpZXdwb3J0KG1hcC50cmFuc2Zvcm0sIHtcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2NsYXNzTmFtZSwgd2lkdGgsIGhlaWdodCwgc3R5bGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtYXBTdHlsZSA9IHtcbiAgICAgIC4uLnN0eWxlLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBjdXJzb3I6IHRoaXMuX2N1cnNvcigpXG4gICAgfTtcblxuICAgIGxldCBjb250ZW50ID0gW1xuICAgICAgPGRpdiBrZXk9XCJtYXBcIiByZWY9XCJtYXBib3hNYXBcIlxuICAgICAgICBzdHlsZT17IG1hcFN0eWxlIH0gY2xhc3NOYW1lPXsgY2xhc3NOYW1lIH0vPixcbiAgICAgIDxkaXYga2V5PVwib3ZlcmxheXNcIiBjbGFzc05hbWU9XCJvdmVybGF5c1wiXG4gICAgICAgIHN0eWxlPXsge3Bvc2l0aW9uOiAnYWJzb2x1dGUnLCBsZWZ0OiAwLCB0b3A6IDB9IH0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5jaGlsZHJlbiB9XG4gICAgICA8L2Rpdj5cbiAgICBdO1xuXG4gICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2VWaWV3cG9ydCkge1xuICAgICAgY29udGVudCA9IChcbiAgICAgICAgPE1hcEludGVyYWN0aW9uc1xuICAgICAgICAgIG9uTW91c2VEb3duID17IHRoaXMuX29uTW91c2VEb3duIH1cbiAgICAgICAgICBvbk1vdXNlRHJhZyA9eyB0aGlzLl9vbk1vdXNlRHJhZyB9XG4gICAgICAgICAgb25Nb3VzZVJvdGF0ZSA9eyB0aGlzLl9vbk1vdXNlUm90YXRlIH1cbiAgICAgICAgICBvbk1vdXNlVXAgPXsgdGhpcy5fb25Nb3VzZVVwIH1cbiAgICAgICAgICBvbk1vdXNlTW92ZSA9eyB0aGlzLl9vbk1vdXNlTW92ZSB9XG4gICAgICAgICAgb25ab29tID17IHRoaXMuX29uWm9vbSB9XG4gICAgICAgICAgb25ab29tRW5kID17IHRoaXMuX29uWm9vbUVuZCB9XG4gICAgICAgICAgd2lkdGggPXsgdGhpcy5wcm9wcy53aWR0aCB9XG4gICAgICAgICAgaGVpZ2h0ID17IHRoaXMucHJvcHMuaGVpZ2h0IH1cbiAgICAgICAgICB6b29tRGlzYWJsZWQgPXsgdGhpcy5wcm9wcy56b29tRGlzYWJsZWQgfVxuICAgICAgICAgIGRyYWdEaXNhYmxlZCA9eyB0aGlzLnByb3BzLmRyYWdEaXNhYmxlZCB9PlxuXG4gICAgICAgICAgeyBjb250ZW50IH1cblxuICAgICAgICA8L01hcEludGVyYWN0aW9ucz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5zdHlsZSxcbiAgICAgICAgICB3aWR0aDogdGhpcy5wcm9wcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMucHJvcHMuaGVpZ2h0LFxuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0gfT5cblxuICAgICAgICB7IGNvbnRlbnQgfVxuXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vZCh2YWx1ZSwgZGl2aXNvcikge1xuICBjb25zdCBtb2R1bHVzID0gdmFsdWUgJSBkaXZpc29yO1xuICByZXR1cm4gbW9kdWx1cyA8IDAgPyBkaXZpc29yICsgbW9kdWx1cyA6IG1vZHVsdXM7XG59XG5cbmZ1bmN0aW9uIHVucHJvamVjdEZyb21UcmFuc2Zvcm0odHJhbnNmb3JtLCBwb2ludCkge1xuICByZXR1cm4gdHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwb2ludCkpO1xufVxuXG5mdW5jdGlvbiBjbG9uZVRyYW5zZm9ybShvcmlnaW5hbCkge1xuICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKG9yaWdpbmFsLl9taW5ab29tLCBvcmlnaW5hbC5fbWF4Wm9vbSk7XG4gIHRyYW5zZm9ybS5sYXRSYW5nZSA9IG9yaWdpbmFsLmxhdFJhbmdlO1xuICB0cmFuc2Zvcm0ud2lkdGggPSBvcmlnaW5hbC53aWR0aDtcbiAgdHJhbnNmb3JtLmhlaWdodCA9IG9yaWdpbmFsLmhlaWdodDtcbiAgdHJhbnNmb3JtLnpvb20gPSBvcmlnaW5hbC56b29tO1xuICB0cmFuc2Zvcm0uY2VudGVyID0gb3JpZ2luYWwuY2VudGVyO1xuICB0cmFuc2Zvcm0uYW5nbGUgPSBvcmlnaW5hbC5hbmdsZTtcbiAgdHJhbnNmb3JtLmFsdGl0dWRlID0gb3JpZ2luYWwuYWx0aXR1ZGU7XG4gIHRyYW5zZm9ybS5waXRjaCA9IG9yaWdpbmFsLnBpdGNoO1xuICB0cmFuc2Zvcm0uYmVhcmluZyA9IG9yaWdpbmFsLmJlYXJpbmc7XG4gIHRyYW5zZm9ybS5hbHRpdHVkZSA9IG9yaWdpbmFsLmFsdGl0dWRlO1xuICByZXR1cm4gdHJhbnNmb3JtO1xufVxuXG5NYXBHTC5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuTWFwR0wuY2hpbGRDb250ZXh0VHlwZXMgPSBDSElMRF9DT05URVhUX1RZUEVTO1xuTWFwR0wuZGVmYXVsdFByb3BzID0gREVGQVVMVF9QUk9QUztcbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/map.react.js\n// module id = 1002\n// module chunks = 0 1","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/assert/node_modules/object-assign/index.js\n// module id = 1003\n// module chunks = 0 1","module.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/node-libs-browser/node_modules/util/support/isBufferBrowser.js\n// module id = 1004\n// module chunks = 0 1","if (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/node-libs-browser/node_modules/inherits/inherits_browser.js\n// module id = 1005\n// module chunks = 0 1","/**\n * @author Félix Girault <felix.girault@gmail.com>\n * @license MIT\n */\n'use strict';\n\nvar warning = require('fbjs/lib/warning');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\n\n\n\n/**\n * Tells if a component should update given it's next props\n * and state.\n *\n * @param object nextProps Next props.\n * @param object nextState Next state.\n */\nfunction shouldComponentUpdate(nextProps, nextState) {\n  return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState);\n}\n\n/**\n * Returns a text description of the component that can be\n * used to identify it in error messages.\n *\n * @see https://github.com/facebook/react/blob/v15.4.0-rc.3/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js#L1143\n * @param {function} component The component.\n * @return {string} The name of the component.\n */\nfunction getComponentName(component) {\n  var constructor = component.prototype && component.prototype.constructor;\n\n  return (\n    component.displayName\n    || (constructor && constructor.displayName)\n    || component.name\n    || (constructor && constructor.name)\n    || 'a component'\n  );\n}\n\n/**\n * Makes the given component \"pure\".\n *\n * @param object component Component.\n */\nfunction pureRenderDecorator(component) {\n  if (component.prototype.shouldComponentUpdate !== undefined) {\n    // We're not using the condition mecanism of warning()\n    // here to avoid useless calls to getComponentName().\n    warning(\n      false,\n      'Cannot decorate `%s` with @pureRenderDecorator, '\n      + 'because it already implements `shouldComponentUpdate().',\n      getComponentName(component)\n    )\n  }\n\n  component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n  return component;\n}\n\n\n\nmodule.exports = pureRenderDecorator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/pure-render-decorator/index.js\n// module id = 1006\n// module chunks = 0 1","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n  var printWarning = function printWarning(format) {\n    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    var argIndex = 0;\n    var message = 'Warning: ' + format.replace(/%s/g, function () {\n      return args[argIndex++];\n    });\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n\n  warning = function warning(condition, format) {\n    if (format === undefined) {\n      throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n    }\n\n    if (format.indexOf('Failed Composite propType: ') === 0) {\n      return; // Ignore CompositeComponent proptype check.\n    }\n\n    if (!condition) {\n      for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n        args[_key2 - 2] = arguments[_key2];\n      }\n\n      printWarning.apply(undefined, [format].concat(args));\n    }\n  };\n}\n\nmodule.exports = warning;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/warning.js\n// module id = 1007\n// module chunks = 0 1","module.exports = {\"_args\":[[\"mapbox-gl@0.20.1\",\"/srv/opengov\"]],\"_from\":\"mapbox-gl@0.20.1\",\"_id\":\"mapbox-gl@0.20.1\",\"_inBundle\":false,\"_integrity\":\"sha1-wiy+f9OuQ7jg/6ItCICYfJOxvkE=\",\"_location\":\"/react-map-gl/mapbox-gl\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"mapbox-gl@0.20.1\",\"name\":\"mapbox-gl\",\"escapedName\":\"mapbox-gl\",\"rawSpec\":\"0.20.1\",\"saveSpec\":null,\"fetchSpec\":\"0.20.1\"},\"_requiredBy\":[\"/react-map-gl\"],\"_resolved\":\"https://artifactory.opengov.zone:443/artifactory/api/npm/npm/mapbox-gl/-/mapbox-gl-0.20.1.tgz\",\"_spec\":\"0.20.1\",\"_where\":\"/srv/opengov\",\"browser\":{\"./js/util/ajax.js\":\"./js/util/browser/ajax.js\",\"./js/util/browser.js\":\"./js/util/browser/browser.js\",\"./js/util/canvas.js\":\"./js/util/browser/canvas.js\",\"./js/util/dom.js\":\"./js/util/browser/dom.js\",\"./js/util/dispatcher.js\":\"./js/util/browser/dispatcher.js\"},\"browserify\":{\"transform\":[\"envify\"]},\"bugs\":{\"url\":\"https://github.com/mapbox/mapbox-gl-js/issues\"},\"dependencies\":{\"csscolorparser\":\"^1.0.2\",\"earcut\":\"^2.0.3\",\"envify\":\"^3.4.0\",\"feature-filter\":\"^2.1.0\",\"geojson-rewind\":\"^0.1.0\",\"geojson-vt\":\"2.1.8\",\"gl-matrix\":\"^2.3.1\",\"grid-index\":\"^0.1.0\",\"mapbox-gl-function\":\"^1.2.1\",\"mapbox-gl-js-supported\":\"^1.1.0\",\"mapbox-gl-shaders\":\"github:mapbox/mapbox-gl-shaders#9af2892c56c74c4d2d7e5cc59b6e5e4fe3837c6f\",\"mapbox-gl-style-spec\":\"^8.7.0\",\"minifyify\":\"^7.0.1\",\"pbf\":\"^1.3.2\",\"pngjs\":\"^2.2.0\",\"point-geometry\":\"^0.0.0\",\"quickselect\":\"^1.0.0\",\"request\":\"^2.39.0\",\"resolve-url\":\"^0.2.1\",\"shelf-pack\":\"^1.0.0\",\"supercluster\":\"^2.0.1\",\"unassertify\":\"^2.0.0\",\"unitbezier\":\"^0.0.0\",\"vector-tile\":\"^1.2.1\",\"vt-pbf\":\"^2.0.2\",\"webworkify\":\"1.2.0\",\"whoots-js\":\"^2.0.0\"},\"description\":\"A WebGL interactive maps library\",\"devDependencies\":{\"benchmark\":\"~2.1.0\",\"browserify\":\"^13.0.0\",\"browserify-middleware\":\"^7.0.0\",\"concat-stream\":\"1.5.1\",\"coveralls\":\"^2.11.8\",\"doctrine\":\"^1.2.1\",\"documentation\":\"https://github.com/documentationjs/documentation/archive/bb41619c734e59ef3fbc3648610032efcfdaaace.tar.gz\",\"documentation-theme-utils\":\"3.0.0\",\"eslint\":\"^2.5.3\",\"eslint-config-mourner\":\"^2.0.0\",\"express\":\"^4.13.4\",\"gl\":\"^4.0.1\",\"handlebars\":\"4.0.5\",\"highlight.js\":\"9.3.0\",\"istanbul\":\"^0.4.2\",\"lodash\":\"^4.13.1\",\"mapbox-gl-test-suite\":\"github:mapbox/mapbox-gl-test-suite#6d3bcff5d51f6acea41230ffabad6bebdea49fa3\",\"nyc\":\"^6.1.1\",\"remark\":\"4.2.2\",\"remark-html\":\"3.0.0\",\"sinon\":\"^1.15.4\",\"st\":\"^1.0.0\",\"tap\":\"^5.7.0\",\"through\":\"^2.3.7\",\"unist-util-visit\":\"1.1.0\",\"vinyl\":\"1.1.1\",\"vinyl-fs\":\"2.4.3\",\"watchify\":\"^3.2.2\"},\"engines\":{\"node\":\">=4.0.0\"},\"homepage\":\"https://github.com/mapbox/mapbox-gl-js#readme\",\"license\":\"BSD-3-Clause\",\"main\":\"js/mapbox-gl.js\",\"name\":\"mapbox-gl\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/mapbox/mapbox-gl-js.git\"},\"scripts\":{\"build-dev\":\"browserify -d js/mapbox-gl.js --standalone mapboxgl > dist/mapbox-gl-dev.js\",\"build-docs\":\"documentation build --github --format html -c documentation.yml --theme ./docs/_theme --output docs/api/\",\"build-min\":\"browserify js/mapbox-gl.js --debug --transform unassertify --plugin [minifyify --map mapbox-gl.js.map --output dist/mapbox-gl.js.map] --standalone mapboxgl > dist/mapbox-gl.js\",\"download-bench-data\":\"[ -f ./bench/data/naturalearth-land.json ] || (mkdir -p ./bench/data && curl -s https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_land.geojson > ./bench/data/naturalearth-land.json)\",\"lint\":\"eslint js test bench\",\"prepublish\":\"[ -z \\\"$BUILDPACK_DIR\\\" ] || npm run build-docs\",\"start\":\"npm run download-bench-data && node server.js\",\"start-docs\":\"npm run build-min && npm run build-docs && jekyll serve -w\",\"test\":\"npm run lint && npm run build-min && tap --reporter dot test/js/*/*.js # update ci.sh if test invocation changes\",\"test-suite\":\"node test/render.test.js && node test/query.test.js # update ci.sh if test invocation changes\"},\"version\":\"0.20.1\"}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/package.json\n// module id = 1008\n// module chunks = 0 1","'use strict';\n\nvar Canvas = require('../util/canvas');\nvar util = require('../util/util');\nvar browser = require('../util/browser');\nvar window = require('../util/browser').window;\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\n\nvar Style = require('../style/style');\nvar AnimationLoop = require('../style/animation_loop');\nvar Painter = require('../render/painter');\n\nvar Transform = require('../geo/transform');\nvar Hash = require('./hash');\n\nvar bindHandlers = require('./bind_handlers');\n\nvar Camera = require('./camera');\nvar LngLat = require('../geo/lng_lat');\nvar LngLatBounds = require('../geo/lng_lat_bounds');\nvar Point = require('point-geometry');\nvar Attribution = require('./control/attribution');\n\nvar defaultMinZoom = 0;\nvar defaultMaxZoom = 20;\nvar defaultOptions = {\n    center: [0, 0],\n    zoom: 0,\n    bearing: 0,\n    pitch: 0,\n\n    minZoom: defaultMinZoom,\n    maxZoom: defaultMaxZoom,\n\n    interactive: true,\n\n    scrollZoom: true,\n    boxZoom: true,\n    dragRotate: true,\n    dragPan: true,\n    keyboard: true,\n    doubleClickZoom: true,\n    touchZoomRotate: true,\n\n    bearingSnap: 7,\n\n    hash: false,\n\n    attributionControl: true,\n\n    failIfMajorPerformanceCaveat: false,\n    preserveDrawingBuffer: false,\n\n    trackResize: true,\n    workerCount: Math.max(browser.hardwareConcurrency - 1, 1)\n};\n\n/**\n * Creates a map instance. This is usually the beginning of your map:\n * you tell Mapbox GL JS where to put the map by specifying a `container`\n * option, and the map's style with `style` and other attributes of the map,\n * and in return Mapbox GL JS initializes the map on your page and returns\n * a map variable that lets you programmatically call methods on the map.\n * @class Map\n * @param {Object} options\n * @param {string|Element} options.container HTML element to initialize the map in (or element id as string)\n * @param {number} [options.minZoom=0] Minimum zoom of the map\n * @param {number} [options.maxZoom=20] Maximum zoom of the map\n * @param {Object|string} [options.style] Map style. This must be an an object conforming to the schema described in\n * the [style reference](https://mapbox.com/mapbox-gl-style-spec/), or a URL to a JSON style. To load a style from the\n * Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, where `:owner` is your Mapbox account\n * name and `:style` is the style ID. Or you can use one of [the predefined Mapbox styles](https://www.mapbox.com/maps/).\n * The Style URLs of the predefined Mapbox styles are:\n *  * `mapbox://styles/mapbox/streets-v9`\n *  * `mapbox://styles/mapbox/outdoors-v9`\n *  * `mapbox://styles/mapbox/light-v9`\n *  * `mapbox://styles/mapbox/dark-v9`\n *  * `mapbox://styles/mapbox/satellite-v9`\n *  * `mapbox://styles/mapbox/satellite-streets-v9`\n * @param {boolean} [options.hash=false] If `true`, the map will track and update the page URL according to map position\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners are attached to the map, so it will not respond to input\n * @param {number} [options.bearingSnap=7] Snap to north threshold in degrees.\n * @param {Array} [options.classes] Style class names with which to initialize the map\n * @param {boolean} [options.attributionControl=true] If `true`, an attribution control will be added to the map.\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected.\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, The maps canvas can be exported to a PNG using `map.getCanvas().toDataURL();`. This is false by default as a performance optimization.\n * @param {LngLatBounds|Array<Array<number>>} [options.maxBounds] If set, the map is constrained to the given bounds.\n * @param {boolean} [options.scrollZoom=true] If `true`, enable the \"scroll to zoom\" interaction (see `ScrollZoomHandler`)\n * @param {boolean} [options.boxZoom=true] If `true`, enable the \"box zoom\" interaction (see `BoxZoomHandler`)\n * @param {boolean} [options.dragRotate=true] If `true`, enable the \"drag to rotate\" interaction (see `DragRotateHandler`).\n * @param {boolean} [options.dragPan=true] If `true`, enable the \"drag to pan\" interaction (see `DragPanHandler`).\n * @param {boolean} [options.keyboard=true] If `true`, enable keyboard shortcuts (see `KeyboardHandler`).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, enable the \"double click to zoom\" interaction (see `DoubleClickZoomHandler`).\n * @param {boolean} [options.touchZoomRotate=true] If `true`, enable the \"pinch to rotate and zoom\" interaction (see `TouchZoomRotateHandler`).\n * @param {boolean} [options.trackResize=true]  If `true`, automatically resize the map when the browser window resizes.\n * @param {LngLat} [options.center] The geographic coordinate on which the map's initial viewport is centered.\n * @param {number} [options.zoom] The zoom level of the map's initial viewport.\n * @param {number} [options.bearing] The bearing (rotation) of the map's initial viewport measured in degrees counter-clockwise from north.\n * @param {number} [options.pitch] The pitch of the map's initial viewport measured in degrees.\n * @param {number} [options.workerCount=navigator.hardwareConcurrency - 1] The number of WebWorkers the map should use to process vector tile data.\n * @example\n * var map = new mapboxgl.Map({\n *   container: 'map',\n *   center: [-122.420679, 37.772537],\n *   zoom: 13,\n *   style: style_object,\n *   hash: true\n * });\n */\nvar Map = module.exports = function(options) {\n\n    options = util.extend({}, defaultOptions, options);\n\n    if (options.workerCount < 1) {\n        throw new Error('workerCount must an integer greater than or equal to 1.');\n    }\n\n    this._interactive = options.interactive;\n    this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n    this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n    this._trackResize = options.trackResize;\n    this._workerCount = options.workerCount;\n\n    if (typeof options.container === 'string') {\n        this._container = document.getElementById(options.container);\n    } else {\n        this._container = options.container;\n    }\n\n    this.animationLoop = new AnimationLoop();\n    this.transform = new Transform(options.minZoom, options.maxZoom);\n\n    if (options.maxBounds) {\n        this.setMaxBounds(options.maxBounds);\n    }\n\n    util.bindAll([\n        '_forwardStyleEvent',\n        '_forwardSourceEvent',\n        '_forwardLayerEvent',\n        '_forwardTileEvent',\n        '_onStyleLoad',\n        '_onStyleChange',\n        '_onSourceAdd',\n        '_onSourceRemove',\n        '_onSourceUpdate',\n        '_onWindowOnline',\n        '_onWindowResize',\n        'onError',\n        '_update',\n        '_render'\n    ], this);\n\n    this._setupContainer();\n    this._setupPainter();\n\n    this.on('move', this._update.bind(this, false));\n    this.on('zoom', this._update.bind(this, true));\n    this.on('moveend', function() {\n        this.animationLoop.set(300); // text fading\n        this._rerender();\n    }.bind(this));\n\n    if (typeof window !== 'undefined') {\n        window.addEventListener('online', this._onWindowOnline, false);\n        window.addEventListener('resize', this._onWindowResize, false);\n    }\n\n    bindHandlers(this, {\n        scrollZoom: options.interactive && options.scrollZoom,\n        boxZoom: options.interactive && options.boxZoom,\n        dragRotate: options.interactive && options.dragRotate,\n        dragPan: options.interactive && options.dragPan,\n        keyboard: options.interactive && options.keyboard,\n        doubleClickZoom: options.interactive && options.doubleClickZoom,\n        touchZoomRotate: options.interactive && options.touchZoomRotate\n    }, options);\n\n    this._hash = options.hash && (new Hash()).addTo(this);\n    // don't set position from options if set through hash\n    if (!this._hash || !this._hash._onHashChange()) {\n        this.jumpTo({\n            center: options.center,\n            zoom: options.zoom,\n            bearing: options.bearing,\n            pitch: options.pitch\n        });\n    }\n\n    this.stacks = {};\n    this._classes = [];\n\n    this.resize();\n\n    if (options.classes) this.setClasses(options.classes);\n    if (options.style) this.setStyle(options.style);\n    if (options.attributionControl) this.addControl(new Attribution(options.attributionControl));\n\n    this.on('error', this.onError);\n    this.on('style.error', this.onError);\n    this.on('source.error', this.onError);\n    this.on('tile.error', this.onError);\n    this.on('layer.error', this.onError);\n};\n\nutil.extend(Map.prototype, Evented);\nutil.extend(Map.prototype, Camera.prototype);\nutil.extend(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Adds a control to the map, calling `control.addTo(this)`.\n     *\n     * @param {Control} control\n     * @returns {Map} `this`\n     */\n    addControl: function(control) {\n        control.addTo(this);\n        return this;\n    },\n\n    /**\n     * Adds a style class to a map.\n     *\n     * @param {string} klass name of style class\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    addClass: function(klass, options) {\n        if (this._classes.indexOf(klass) >= 0 || klass === '') return this;\n        this._classes.push(klass);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Removes a style class from a map.\n     *\n     * @param {string} klass name of style class\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    removeClass: function(klass, options) {\n        var i = this._classes.indexOf(klass);\n        if (i < 0 || klass === '') return this;\n        this._classes.splice(i, 1);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Helper method to add more than one class.\n     *\n     * @param {Array<string>} klasses An array of class names\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    setClasses: function(klasses, options) {\n        var uniqueClasses = {};\n        for (var i = 0; i < klasses.length; i++) {\n            if (klasses[i] !== '') uniqueClasses[klasses[i]] = true;\n        }\n        this._classes = Object.keys(uniqueClasses);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Check whether a style class is active.\n     *\n     * @param {string} klass Name of style class\n     * @returns {boolean}\n     */\n    hasClass: function(klass) {\n        return this._classes.indexOf(klass) >= 0;\n    },\n\n    /**\n     * Return an array of the current active style classes.\n     *\n     * @returns {boolean}\n     */\n    getClasses: function() {\n        return this._classes;\n    },\n\n    /**\n     * Detect the map's new width and height and resize it. Given\n     * the `container` of the map specified in the Map constructor,\n     * this reads the new width from the DOM: so this method is often\n     * called after the map's container is resized by another script\n     * or the map is shown after being initially hidden with CSS.\n     *\n     * @returns {Map} `this`\n     */\n    resize: function() {\n        var width = 0, height = 0;\n\n        if (this._container) {\n            width = this._container.offsetWidth || 400;\n            height = this._container.offsetHeight || 300;\n        }\n\n        this._canvas.resize(width, height);\n        this.transform.resize(width, height);\n        this.painter.resize(width, height);\n\n        return this\n            .fire('movestart')\n            .fire('move')\n            .fire('resize')\n            .fire('moveend');\n    },\n\n    /**\n     * Get the map's geographical bounds.\n     *\n     * @returns {LngLatBounds}\n     */\n    getBounds: function() {\n        var bounds = new LngLatBounds(\n            this.transform.pointLocation(new Point(0, 0)),\n            this.transform.pointLocation(this.transform.size));\n\n        if (this.transform.angle || this.transform.pitch) {\n            bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0)));\n            bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y)));\n        }\n\n        return bounds;\n    },\n\n    /**\n     * Set constraint on the map's geographical bounds. Pan or zoom operations that would result in\n     * displaying regions that fall outside of the bounds instead result in displaying the map at the\n     * closest point and/or zoom level of the requested operation that is within the max bounds.\n     *\n     * @param {LngLatBounds | Array<Array<number>> | null | undefined} lnglatbounds Desired max bounds of the map. If null or undefined, function removes any bounds constraints on the map.\n     * @returns {Map} `this`\n     */\n    setMaxBounds: function (lnglatbounds) {\n        if (lnglatbounds) {\n            var b = LngLatBounds.convert(lnglatbounds);\n            this.transform.lngRange = [b.getWest(), b.getEast()];\n            this.transform.latRange = [b.getSouth(), b.getNorth()];\n            this.transform._constrain();\n            this._update();\n        } else if (lnglatbounds === null || lnglatbounds === undefined) {\n            this.transform.lngRange = [];\n            this.transform.latRange = [];\n            this._update();\n        }\n        return this;\n\n    },\n    /**\n     * Set the map's minimum zoom level, and zooms map to that level if it is\n     * currently below it. If no parameter provided, unsets the current\n     * minimum zoom (sets it to 0)\n     *\n     * @param {number} minZoom Minimum zoom level. Must be between 0 and 20.\n     * @returns {Map} `this\n     */\n    setMinZoom: function(minZoom) {\n\n        minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n        if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n            this.transform.minZoom = minZoom;\n            this._update();\n\n            if (this.getZoom() < minZoom) this.setZoom(minZoom);\n\n            return this;\n\n        } else throw new Error('minZoom must be between ' + defaultMinZoom + ' and the current maxZoom, inclusive');\n    },\n\n    /**\n     * Set the map's maximum zoom level, and zooms map to that level if it is\n     * currently above it. If no parameter provided, unsets the current\n     * maximum zoom (sets it to 20)\n     * @param {number} maxZoom Maximum zoom level. Must be between 0 and 20.\n     * @returns {Map} `this`\n     */\n    setMaxZoom: function(maxZoom) {\n\n        maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n        if (maxZoom >= this.transform.minZoom && maxZoom <= defaultMaxZoom) {\n            this.transform.maxZoom = maxZoom;\n            this._update();\n\n            if (this.getZoom() > maxZoom) this.setZoom(maxZoom);\n\n            return this;\n\n        } else throw new Error('maxZoom must be between the current minZoom and ' + defaultMaxZoom + ', inclusive');\n    },\n    /**\n     * Get pixel coordinates relative to the map container, given a geographical\n     * location.\n     *\n     * @param {LngLat} lnglat\n     * @returns {Object} `x` and `y` coordinates\n     */\n    project: function(lnglat) {\n        return this.transform.locationPoint(LngLat.convert(lnglat));\n    },\n\n    /**\n     * Get geographical coordinates, given pixel coordinates.\n     *\n     * @param {Array<number>} point [x, y] pixel coordinates\n     * @returns {LngLat}\n     */\n    unproject: function(point) {\n        return this.transform.pointLocation(Point.convert(point));\n    },\n\n    /**\n     * Query rendered features at a point or within a rectangle.\n     *\n     * @param {Point|Array<number>|Array<Point>|Array<Array<number>>} [pointOrBox] - The geometry of a query region:\n     * either [x, y] pixel coordinates of a point, or [[x1, y1], [x2, y2]] pixel coordinates of opposite corners of\n     * a bounding rectangle. Omitting this parameter (i.e. calling `queryRenderedFeatures` with zero arguments,\n     * or with a single `params` argument), is equivalent to passing a bounding rectangle encompassing the entire\n     * viewport.\n     * @param {Object} [params]\n     * @param {Array<string>} [params.layers] Only query features from layers with these layer IDs.\n     * @param {Array} [params.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) satisfying the query parameters.\n     *\n     * The `properties` value of each feature contains the properties of the source feature. For GeoJSON sources, only\n     * string and numeric values are supported; null, Array, and Object values are not supported.\n     *\n     * Each feature includes a top-level `layer` property whose value is an object representing the style layer to\n     * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated\n     * for the given zoom level and feature.\n     *\n     * Only visible features are returned. The topmost rendered feature appears first in the returned array, and\n     * subsequent features are sorted by descending z-order. Features which are rendered multiple times due to wrapping\n     * across the antimeridian at low zoom levels are returned only once, subject to the caveat that follows.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and features may appear duplicated across tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     *\n     * @example\n     * // Find all features at a point\n     * var features = map.queryRenderedFeatures(\n     *   [20, 35],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a static bounding box\n     * var features = map.queryRenderedFeatures(\n     *   [[10, 20], [30, 50]],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a bounding box around a point\n     * var width = 10;\n     * var height = 20;\n     * var features = map.queryRenderedFeatures([\n     *   [point.x - width / 2, point.y - height / 2],\n     *   [point.x + width / 2, point.y + height / 2]\n     * ], { layers: ['my-layer-name'] });\n     *\n     * @example\n     * // Query all rendered features from a single layer\n     * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });\n     */\n    queryRenderedFeatures: function(pointOrBox, params) {\n        if (!(pointOrBox instanceof Point || Array.isArray(pointOrBox))) {\n            params = pointOrBox;\n            pointOrBox = undefined;\n        }\n        var queryGeometry = this._makeQueryGeometry(pointOrBox);\n        return this.style.queryRenderedFeatures(queryGeometry, params, this.transform.zoom, this.transform.angle);\n    },\n\n    _makeQueryGeometry: function(pointOrBox) {\n        if (pointOrBox === undefined) {\n            // bounds was omitted: use full viewport\n            pointOrBox = [\n                Point.convert([0, 0]),\n                Point.convert([this.transform.width, this.transform.height])\n            ];\n        }\n\n        var queryGeometry;\n        var isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number';\n\n        if (isPoint) {\n            var point = Point.convert(pointOrBox);\n            queryGeometry = [point];\n        } else {\n            var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])];\n            queryGeometry = [\n                box[0],\n                new Point(box[1].x, box[0].y),\n                box[1],\n                new Point(box[0].x, box[1].y),\n                box[0]\n            ];\n        }\n\n        queryGeometry = queryGeometry.map(function(p) {\n            return this.transform.pointCoordinate(p);\n        }.bind(this));\n\n        return queryGeometry;\n    },\n\n    /**\n     * Query data from vector tile or GeoJSON sources.\n     *\n     * @param {string} sourceID source ID\n     * @param {Object} params\n     * @param {string} [params.sourceLayer] The name of the vector tile layer to get features from. For vector tile\n     * sources, this parameter is required. For GeoJSON sources, it is ignored.\n     * @param {Array} [params.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) satisfying the query parameters.\n     *\n     * In contrast to `queryRenderedFeatures`, `querySourceFeatures` returns all features matching the query parameters,\n     * whether they are rendered by the current style or not. The domain of the query consists of all currently-loaded\n     * vector tile or GeoJSON source tiles; `querySourceFeatures` does not load additional tiles beyond the currently\n     * visible viewport.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and features may appear duplicated across tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     */\n    querySourceFeatures: function(sourceID, params) {\n        return this.style.querySourceFeatures(sourceID, params);\n    },\n\n    /**\n     * Replaces the map's style object with a new value. Unlike the `style`\n     * option in the Map constructor, this method only accepts an object\n     * of a new style, not a URL string.\n     *\n     * @param {Object} style A style object formatted as JSON\n     * @returns {Map} `this`\n     */\n    setStyle: function(style) {\n        if (this.style) {\n            this.style\n                .off('load', this._onStyleLoad)\n                .off('error', this._forwardStyleEvent)\n                .off('change', this._onStyleChange)\n                .off('source.add', this._onSourceAdd)\n                .off('source.remove', this._onSourceRemove)\n                .off('source.load', this._onSourceUpdate)\n                .off('source.error', this._forwardSourceEvent)\n                .off('source.change', this._onSourceUpdate)\n                .off('layer.add', this._forwardLayerEvent)\n                .off('layer.remove', this._forwardLayerEvent)\n                .off('layer.error', this._forwardLayerEvent)\n                .off('tile.add', this._forwardTileEvent)\n                .off('tile.remove', this._forwardTileEvent)\n                .off('tile.load', this._update)\n                .off('tile.error', this._forwardTileEvent)\n                .off('tile.stats', this._forwardTileEvent)\n                ._remove();\n\n            this.off('rotate', this.style._redoPlacement);\n            this.off('pitch', this.style._redoPlacement);\n        }\n\n        if (!style) {\n            this.style = null;\n            return this;\n        } else if (style instanceof Style) {\n            this.style = style;\n        } else {\n            this.style = new Style(style, this.animationLoop, this._workerCount);\n        }\n\n        this.style\n            .on('load', this._onStyleLoad)\n            .on('error', this._forwardStyleEvent)\n            .on('change', this._onStyleChange)\n            .on('source.add', this._onSourceAdd)\n            .on('source.remove', this._onSourceRemove)\n            .on('source.load', this._onSourceUpdate)\n            .on('source.error', this._forwardSourceEvent)\n            .on('source.change', this._onSourceUpdate)\n            .on('layer.add', this._forwardLayerEvent)\n            .on('layer.remove', this._forwardLayerEvent)\n            .on('layer.error', this._forwardLayerEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.load', this._update)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this.on('rotate', this.style._redoPlacement);\n        this.on('pitch', this.style._redoPlacement);\n\n        return this;\n    },\n\n    /**\n     * Get a style object that can be used to recreate the map's style.\n     *\n     * @returns {Object} style\n     */\n    getStyle: function() {\n        if (this.style) {\n            return this.style.serialize();\n        }\n    },\n\n    /**\n     * Add a source to the map style.\n     *\n     * @param {string} id ID of the source. Must not be used by any existing source.\n     * @param {Object} source source specification, following the\n     * [Mapbox GL Style Reference](https://www.mapbox.com/mapbox-gl-style-spec/#sources)\n     * @fires source.add\n     * @returns {Map} `this`\n     */\n    addSource: function(id, source) {\n        this.style.addSource(id, source);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Remove an existing source from the map style.\n     *\n     * @param {string} id ID of the source to remove\n     * @fires source.remove\n     * @returns {Map} `this`\n     */\n    removeSource: function(id) {\n        this.style.removeSource(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Return the style source object with the given `id`.\n     *\n     * @param {string} id source ID\n     * @returns {Object}\n     */\n    getSource: function(id) {\n        return this.style.getSource(id);\n    },\n\n    /**\n     * Add a [Mapbox GL style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers)\n     * to the map. A layer references a source from which it pulls data and specifies\n     * styling for that data.\n     *\n     * If a value for `before` is provided, the layer will be inserted before the layer\n     * with the specified ID. If `before` is omitted, the layer will be inserted above\n     * every existing layer.\n     *\n     * @param {StyleLayer|Object} layer\n     * @param {string=} before  ID of an existing layer to insert before\n     * @fires layer.add\n     * @returns {Map} `this`\n     */\n    addLayer: function(layer, before) {\n        this.style.addLayer(layer, before);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Remove the layer with the given `id` from the map. Any layers which refer to the\n     * specified layer via a `ref` property are also removed.\n     *\n     * @param {string} id layer id\n     * @throws {Error} if no layer with the given `id` exists\n     * @fires layer.remove\n     * @returns {Map} `this`\n     */\n    removeLayer: function(id) {\n        this.style.removeLayer(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Return the style layer object with the given `id`.\n     *\n     * @param {string} id layer id\n     * @returns {?Object} a layer, if one with the given `id` exists\n     */\n    getLayer: function(id) {\n        return this.style.getLayer(id);\n    },\n\n    /**\n     * Set the filter for a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {Array} filter filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     * @returns {Map} `this`\n     * @example\n     * map.setFilter('my-layer', ['==', 'name', 'USA']);\n     */\n    setFilter: function(layer, filter) {\n        this.style.setFilter(layer, filter);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Set the zoom extent for a given style layer.\n     *\n     * @param {string} layerId ID of a layer\n     * @param {number} minzoom minimum zoom extent\n     * @param {number} maxzoom maximum zoom extent\n     * @returns {Map} `this`\n     * @example\n     * map.setLayerZoomRange('my-layer', 2, 5);\n     */\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the filter for a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @returns {Array} filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter)\n     */\n    getFilter: function(layer) {\n        return this.style.getFilter(layer);\n    },\n\n    /**\n     * Set the value of a paint property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a paint property\n     * @param {*} value value for the paint propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n     * @param {string=} klass optional class specifier for the property\n     * @returns {Map} `this`\n     * @example\n     * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n     */\n    setPaintProperty: function(layer, name, value, klass) {\n        this.style.setPaintProperty(layer, name, value, klass);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the value of a paint property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a paint property\n     * @param {string=} klass optional class specifier for the property\n     * @returns {*} value for the paint propery\n     */\n    getPaintProperty: function(layer, name, klass) {\n        return this.style.getPaintProperty(layer, name, klass);\n    },\n\n    /**\n     * Set the value of a layout property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a layout property\n     * @param {*} value value for the layout propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n     * @returns {Map} `this`\n     * @example\n     * map.setLayoutProperty('my-layer', 'visibility', 'none');\n     */\n    setLayoutProperty: function(layer, name, value) {\n        this.style.setLayoutProperty(layer, name, value);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Get the value of a layout property in a given style layer.\n     *\n     * @param {string} layer ID of a layer\n     * @param {string} name name of a layout property\n     * @param {string=} klass optional class specifier for the property\n     * @returns {*} value for the layout propery\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.style.getLayoutProperty(layer, name);\n    },\n\n    /**\n     * Get the Map's container as an HTML element\n     * @returns {HTMLElement} container\n     */\n    getContainer: function() {\n        return this._container;\n    },\n\n    /**\n     * Get the container for the map `canvas` element.\n     *\n     * If you want to add non-GL overlays to the map, you should append them to this element. This\n     * is the element to which event bindings for map interactivity such as panning and zooming are\n     * attached. It will receive bubbled events for child elements such as the `canvas`, but not for\n     * map controls.\n     *\n     * @returns {HTMLElement} container\n     */\n    getCanvasContainer: function() {\n        return this._canvasContainer;\n    },\n\n    /**\n     * Get the Map's canvas as an HTML canvas\n     * @returns {HTMLElement} canvas\n     */\n    getCanvas: function() {\n        return this._canvas.getElement();\n    },\n\n    _setupContainer: function() {\n        var container = this._container;\n        container.classList.add('mapboxgl-map');\n\n        var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n        if (this._interactive) {\n            canvasContainer.classList.add('mapboxgl-interactive');\n        }\n        this._canvas = new Canvas(this, canvasContainer);\n\n        var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n        var corners = this._controlCorners = {};\n        ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) {\n            corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer);\n        });\n    },\n\n    _setupPainter: function() {\n        var gl = this._canvas.getWebGLContext({\n            failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n            preserveDrawingBuffer: this._preserveDrawingBuffer\n        });\n\n        if (!gl) {\n            this.fire('error', { error: new Error('Failed to initialize WebGL') });\n            return;\n        }\n\n        this.painter = new Painter(gl, this.transform);\n    },\n\n    /**\n     * WebGL Context Lost event.\n     *\n     * @event webglcontextlost\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {Event} originalEvent the original DOM event\n     */\n    _contextLost: function(event) {\n        event.preventDefault();\n        if (this._frameId) {\n            browser.cancelFrame(this._frameId);\n        }\n        this.fire('webglcontextlost', {originalEvent: event});\n    },\n\n    /**\n     * WebGL Context Restored event.\n     *\n     * @event webglcontextrestored\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     */\n    _contextRestored: function(event) {\n        this._setupPainter();\n        this.resize();\n        this._update();\n        this.fire('webglcontextrestored', {originalEvent: event});\n    },\n\n    /**\n     * Is this map fully loaded? If the style isn't loaded\n     * or it has a change to the sources or style that isn't\n     * propagated to its style, return false.\n     *\n     * @returns {boolean} whether the map is loaded\n     */\n    loaded: function() {\n        if (this._styleDirty || this._sourcesDirty)\n            return false;\n        if (!this.style || !this.style.loaded())\n            return false;\n        return true;\n    },\n\n    /**\n     * Update this map's style and sources, and re-render the map.\n     *\n     * @param {boolean} updateStyle mark the map's style for reprocessing as\n     * well as its sources\n     * @returns {Map} this\n     * @private\n     */\n    _update: function(updateStyle) {\n        if (!this.style) return this;\n\n        this._styleDirty = this._styleDirty || updateStyle;\n        this._sourcesDirty = true;\n\n        this._rerender();\n\n        return this;\n    },\n\n    /**\n     * Call when a (re-)render of the map is required, e.g. when the\n     * user panned or zoomed,f or new data is available.\n     * @returns {Map} this\n     * @private\n     */\n    _render: function() {\n        try {\n            if (this.style && this._styleDirty) {\n                this._styleDirty = false;\n                this.style.update(this._classes, this._classOptions);\n                this._classOptions = null;\n                this.style._recalculate(this.transform.zoom);\n            }\n\n            if (this.style && this._sourcesDirty) {\n                this._sourcesDirty = false;\n                this.style._updateSources(this.transform);\n            }\n\n            this.painter.render(this.style, {\n                debug: this.showTileBoundaries,\n                showOverdrawInspector: this._showOverdrawInspector,\n                vertices: this.vertices,\n                rotating: this.rotating,\n                zooming: this.zooming\n            });\n\n            this.fire('render');\n\n            if (this.loaded() && !this._loaded) {\n                this._loaded = true;\n                this.fire('load');\n            }\n\n            this._frameId = null;\n\n            if (!this.animationLoop.stopped()) {\n                this._styleDirty = true;\n            }\n\n            if (this._sourcesDirty || this._repaint || !this.animationLoop.stopped()) {\n                this._rerender();\n            }\n\n        } catch (error) {\n            this.fire('error', {error: error});\n        }\n\n        return this;\n    },\n\n    /**\n     * Destroys the map's underlying resources, including web workers and DOM elements. Afterwards,\n     * you must not call any further methods on this Map instance.\n     *\n     * @returns {undefined}\n     */\n    remove: function() {\n        if (this._hash) this._hash.remove();\n        browser.cancelFrame(this._frameId);\n        this.setStyle(null);\n        if (typeof window !== 'undefined') {\n            window.removeEventListener('resize', this._onWindowResize, false);\n        }\n        removeNode(this._canvasContainer);\n        removeNode(this._controlContainer);\n        this._container.classList.remove('mapboxgl-map');\n    },\n\n    /**\n     * A default error handler for `style.error`, `source.error`, `layer.error`,\n     * and `tile.error` events.\n     * It logs the error via `console.error`.\n     *\n     * @example\n     * // Disable the default error handler\n     * map.off('error', map.onError);\n     * map.off('style.error', map.onError);\n     * map.off('source.error', map.onError);\n     * map.off('tile.error', map.onError);\n     * map.off('layer.error', map.onError);\n     */\n    onError: function(e) {\n        console.error(e.error);\n    },\n\n    _rerender: function() {\n        if (this.style && !this._frameId) {\n            this._frameId = browser.frame(this._render);\n        }\n    },\n\n    _forwardStyleEvent: function(e) {\n        this.fire('style.' + e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _onStyleLoad: function(e) {\n        if (this.transform.unmodified) {\n            this.jumpTo(this.style.stylesheet);\n        }\n        this.style.update(this._classes, {transition: false});\n        this._forwardStyleEvent(e);\n    },\n\n    _onStyleChange: function(e) {\n        this._update(true);\n        this._forwardStyleEvent(e);\n    },\n\n    _onSourceAdd: function(e) {\n        var source = e.source;\n        if (source.onAdd)\n            source.onAdd(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceRemove: function(e) {\n        var source = e.source;\n        if (source.onRemove)\n            source.onRemove(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceUpdate: function(e) {\n        this._update();\n        this._forwardSourceEvent(e);\n    },\n\n    _onWindowOnline: function() {\n        this._update();\n    },\n\n    _onWindowResize: function() {\n        if (this._trackResize) {\n            this.stop().resize()._update();\n        }\n    }\n});\n\nutil.extendAll(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Draw an outline around each rendered tile for debugging.\n     *\n     * @name showTileBoundaries\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showTileBoundaries: false,\n    get showTileBoundaries() { return this._showTileBoundaries; },\n    set showTileBoundaries(value) {\n        if (this._showTileBoundaries === value) return;\n        this._showTileBoundaries = value;\n        this._update();\n    },\n\n    /**\n     * Draw boxes around all symbols in the data source, showing which were\n     * rendered and which were hidden due to collisions with other symbols for\n     * style debugging.\n     *\n     * @name showCollisionBoxes\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showCollisionBoxes: false,\n    get showCollisionBoxes() { return this._showCollisionBoxes; },\n    set showCollisionBoxes(value) {\n        if (this._showCollisionBoxes === value) return;\n        this._showCollisionBoxes = value;\n        this.style._redoPlacement();\n    },\n\n    /*\n     * Show how many times each fragment has been shaded. White fragments have\n     * been shaded 8 or more times. Black fragments have been shaded 0 times.\n     *\n     * @name showOverdraw\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showOverdrawInspector: false,\n    get showOverdrawInspector() { return this._showOverdrawInspector; },\n    set showOverdrawInspector(value) {\n        if (this._showOverdrawInspector === value) return;\n        this._showOverdrawInspector = value;\n        this._update();\n    },\n\n    /**\n     * Enable continuous repaint to analyze performance.\n     *\n     * @name repaint\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _repaint: false,\n    get repaint() { return this._repaint; },\n    set repaint(value) { this._repaint = value; this._update(); },\n\n    // show vertices\n    _vertices: false,\n    get vertices() { return this._vertices; },\n    set vertices(value) { this._vertices = value; this._update(); }\n});\n\nfunction removeNode(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\n\n/**\n * Options common to {@link Map#addClass}, {@link Map#removeClass},\n * and {@link Map#setClasses}, controlling\n * whether or not to smoothly transition property changes triggered by the class change.\n *\n * @typedef {Object} StyleOptions\n * @property {boolean} transition\n */\n\n /**\n  * This event is fired whenever the map is drawn to the screen because of\n  *\n  *  - a change in map position, zoom, pitch, or bearing\n  *  - a change to the map style\n  *  - a change to a GeoJSON source\n  *  - a vector tile, GeoJSON file, glyph, or sprite being loaded\n  *\n  * @event render\n  * @memberof Map\n  * @instance\n  */\n\n\n  /**\n   * When an event fires as a result of a\n   * user interaction, the event will be called with an EventData\n   * object containing the original DOM event along with coordinates of\n   * the event target.\n   *\n   * @typedef {Object} EventData\n   * @property {Event} originalEvent The original DOM event\n   * @property {Point} point The pixel location of the event\n   * @property {LngLat} lngLat The geographic location of the event\n   * @example\n   * map.on('click', function(data) {\n   *   var e = data && data.originalEvent;\n   *   console.log('got click ' + (e ? 'button = ' + e.button : ''));\n   * });\n   */\n\n  /**\n   * Mouse down event.\n   *\n   * @event mousedown\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mousedown event](https://developer.mozilla.org/en-US/docs/Web/Events/mousedown)\n   */\n\n  /**\n   * Mouse up event.\n   *\n   * @event mouseup\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mouseup event](https://developer.mozilla.org/en-US/docs/Web/Events/mouseup)\n   */\n\n  /**\n   * Mouse move event.\n   *\n   * @event mousemove\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [mousemouse event](https://developer.mozilla.org/en-US/docs/Web/Events/mousemove)\n   */\n\n  /**\n   * Touch start event.\n   *\n   * @event touchstart\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchstart event](https://developer.mozilla.org/en-US/docs/Web/Events/touchstart).\n   */\n\n  /**\n   * Touch end event.\n   *\n   * @event touchend\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchcancel event](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel).\n   */\n\n  /**\n   * Touch move event.\n   *\n   * @event touchmove\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchmove event](https://developer.mozilla.org/en-US/docs/Web/Events/touchmove).\n   */\n\n  /**\n   * Touch cancel event.\n   *\n   * @event touchcancel\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [touchcancel event](https://developer.mozilla.org/en-US/docs/Web/Events/touchcancel).\n   */\n\n  /**\n   * Click event.\n   *\n   * @event click\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data: a [click event](https://developer.mozilla.org/en-US/docs/Web/Events/click)\n   */\n\n  /**\n   * Double click event.\n   *\n   * @event dblclick\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data\n   */\n\n  /**\n   * Context menu event.\n   *\n   * @event contextmenu\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if available\n   */\n\n  /**\n   * Load event. This event is emitted immediately after all necessary resources have been downloaded\n   * and the first visually complete rendering has occurred.\n   *\n   * @event load\n   * @memberof Map\n   * @instance\n   * @type {Object}\n   */\n\n  /**\n   * Move start event. This event is emitted just before the map begins a transition from one\n   * view to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event movestart\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n  /**\n   * Move event. This event is emitted repeatedly during animated transitions from one view to\n   * another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event move\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n  /**\n   * Move end event. This event is emitted just after the map completes a transition from one\n   * view to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n   *\n   * @event moveend\n   * @memberof Map\n   * @instance\n   * @property {EventData} data Original event data, if fired interactively\n   */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/map.js\n// module id = 1009\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util');\nvar isSupported = require('mapbox-gl-js-supported');\n\nmodule.exports = Canvas;\n\nfunction Canvas(parent, container) {\n    this.canvas = document.createElement('canvas');\n\n    if (parent && container) {\n        this.canvas.style.position = 'absolute';\n        this.canvas.classList.add('mapboxgl-canvas');\n        this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false);\n        this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false);\n        this.canvas.setAttribute('tabindex', 0);\n        container.appendChild(this.canvas);\n    }\n}\n\nCanvas.prototype.resize = function(width, height) {\n    var pixelRatio = window.devicePixelRatio || 1;\n\n    // Request the required canvas size taking the pixelratio into account.\n    this.canvas.width = pixelRatio * width;\n    this.canvas.height = pixelRatio * height;\n\n    // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n    this.canvas.style.width = width + 'px';\n    this.canvas.style.height = height + 'px';\n};\n\nCanvas.prototype.getWebGLContext = function(attributes) {\n    attributes = util.extend({}, attributes, isSupported.webGLContextAttributes);\n\n    return this.canvas.getContext('webgl', attributes) ||\n        this.canvas.getContext('experimental-webgl', attributes);\n};\n\nCanvas.prototype.getElement = function() {\n    return this.canvas;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/canvas.js\n// module id = 1010\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\n\nmodule.exports = StyleTransition;\n\n/*\n * Represents a transition between two declarations\n */\nfunction StyleTransition(reference, declaration, oldTransition, value) {\n\n    this.declaration = declaration;\n    this.startTime = this.endTime = (new Date()).getTime();\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.interp = interpZoomTransitioned;\n    } else {\n        this.interp = interpolate[reference.type];\n    }\n\n    this.oldTransition = oldTransition;\n    this.duration = value.duration || 0;\n    this.delay = value.delay || 0;\n\n    if (!this.instant()) {\n        this.endTime = this.startTime + this.duration + this.delay;\n        this.ease = util.easeCubicInOut;\n    }\n\n    if (oldTransition && oldTransition.endTime <= this.startTime) {\n        // Old transition is done running, so we can\n        // delete its reference to its old transition.\n\n        delete oldTransition.oldTransition;\n    }\n}\n\nStyleTransition.prototype.instant = function() {\n    return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n};\n\n/*\n * Return the value of the transitioning property at zoom level `z` and optional time `t`\n */\nStyleTransition.prototype.calculate = function(globalProperties, featureProperties) {\n    var value = this.declaration.calculate(\n        util.extend({}, globalProperties, {duration: this.duration}),\n        featureProperties\n    );\n\n    if (this.instant()) return value;\n\n    var t = globalProperties.time || Date.now();\n\n    if (t < this.endTime) {\n        var oldValue = this.oldTransition.calculate(\n            util.extend({}, globalProperties, {time: this.startTime}),\n            featureProperties\n        );\n        var eased = this.ease((t - this.startTime - this.delay) / this.duration);\n        value = this.interp(oldValue, value, eased);\n    }\n\n    return value;\n\n};\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction interpZoomTransitioned(from, to, t) {\n    if ((from && from.to) === undefined || (to && to.to) === undefined) {\n        return undefined;\n    } else {\n        return {\n            from: from.to,\n            fromScale: from.toScale,\n            to: to.to,\n            toScale: to.toScale,\n            t: t\n        };\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_transition.js\n// module id = 1011\n// module chunks = 0 1","'use strict';\n\nvar MapboxGLFunction = require('./style_function');\nvar parseColor = require('./parse_color');\nvar util = require('../util/util');\n\nmodule.exports = StyleDeclaration;\n\nfunction StyleDeclaration(reference, value) {\n    this.type = reference.type;\n    this.transitionable = reference.transition;\n    this.value = util.clone(value);\n    this.isFunction = MapboxGLFunction.isFunctionDefinition(value);\n\n    // immutable representation of value. used for comparison\n    this.json = JSON.stringify(this.value);\n\n    var parsedValue = this.type === 'color' ? parseColor(this.value) : value;\n    this.calculate = MapboxGLFunction[reference.function || 'piecewise-constant'](parsedValue);\n    this.isFeatureConstant = this.calculate.isFeatureConstant;\n    this.isZoomConstant = this.calculate.isZoomConstant;\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.calculate = transitioned(this.calculate);\n    }\n\n    if (!this.isFeatureConstant && !this.isZoomConstant) {\n        this.stopZoomLevels = [];\n        var interpolationAmountStops = [];\n        var stops = this.value.stops;\n        for (var i = 0; i < this.value.stops.length; i++) {\n            var zoom = stops[i][0].zoom;\n            if (this.stopZoomLevels.indexOf(zoom) < 0) {\n                this.stopZoomLevels.push(zoom);\n                interpolationAmountStops.push([zoom, interpolationAmountStops.length]);\n            }\n        }\n\n        this.calculateInterpolationT = MapboxGLFunction.interpolated({\n            stops: interpolationAmountStops,\n            base: value.base\n        });\n    }\n}\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction transitioned(calculate) {\n    return function(globalProperties, featureProperties) {\n        var z = globalProperties.zoom;\n        var zh = globalProperties.zoomHistory;\n        var duration = globalProperties.duration;\n\n        var fraction = z % 1;\n        var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1);\n        var fromScale = 1;\n        var toScale = 1;\n        var mix, from, to;\n\n        if (z > zh.lastIntegerZoom) {\n            mix = fraction + (1 - fraction) * t;\n            fromScale *= 2;\n            from = calculate({zoom: z - 1}, featureProperties);\n            to = calculate({zoom: z}, featureProperties);\n        } else {\n            mix = 1 - (1 - t) * fraction;\n            to = calculate({zoom: z}, featureProperties);\n            from = calculate({zoom: z + 1}, featureProperties);\n            fromScale /= 2;\n        }\n\n        if (from === undefined || to === undefined) {\n            return undefined;\n        } else {\n            return {\n                from: from,\n                fromScale: fromScale,\n                to: to,\n                toScale: toScale,\n                t: mix\n            };\n        }\n    };\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_declaration.js\n// module id = 1012\n// module chunks = 0 1","module.exports = require('./v8.json');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/latest.js\n// module id = 1013\n// module chunks = 0 1","module.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8],\"doc\":\"Style specification version number. Must be 8.\",\"example\":8},\"name\":{\"type\":\"string\",\"doc\":\"A human-readable name for the style.\",\"example\":\"Bright\"},\"metadata\":{\"type\":\"*\",\"doc\":\"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"},\"center\":{\"type\":\"array\",\"value\":\"number\",\"doc\":\"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":[-73.9749,40.7736]},\"zoom\":{\"type\":\"number\",\"doc\":\"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":12.5},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"doc\":\"Default bearing, in degrees clockwise from true north.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":29},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\",\"doc\":\"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\",\"example\":50},\"light\":{\"type\":\"light\",\"doc\":\"The global light source.\",\"example\":{\"anchor\":\"viewport\",\"color\":\"white\",\"intensity\":0.4}},\"sources\":{\"required\":true,\"type\":\"sources\",\"doc\":\"Data source specifications.\",\"example\":{\"mapbox-streets\":{\"type\":\"vector\",\"url\":\"mapbox://mapbox.mapbox-streets-v6\"}}},\"sprite\":{\"type\":\"string\",\"doc\":\"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties.\",\"example\":\"mapbox://sprites/mapbox/bright-v8\"},\"glyphs\":{\"type\":\"string\",\"doc\":\"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property.\",\"example\":\"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\"},\"transition\":{\"type\":\"transition\",\"doc\":\"A global transition definition to use as a default across properties.\",\"example\":{\"duration\":300,\"delay\":0}},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\",\"doc\":\"Layers will be drawn in the order of this array.\",\"example\":[{\"id\":\"water\",\"source\":\"mapbox-streets\",\"source-layer\":\"water\",\"type\":\"fill\",\"paint\":{\"fill-color\":\"#00ffff\"}}]}},\"sources\":{\"*\":{\"type\":\"source\",\"doc\":\"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"vector\":{\"doc\":\"A vector tile source.\"},\"raster\":{\"doc\":\"A raster tile source.\"}},\"doc\":\"The data type of the tile source.\"},\"url\":{\"type\":\"string\",\"doc\":\"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`.\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\",\"doc\":\"An array of one or more tile source URLs, as in the TileJSON spec.\"},\"minzoom\":{\"type\":\"number\",\"default\":0,\"doc\":\"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"},\"maxzoom\":{\"type\":\"number\",\"default\":22,\"doc\":\"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\",\"doc\":\"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"},\"*\":{\"type\":\"*\",\"doc\":\"Other keys to configure the data source.\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"geojson\":{\"doc\":\"A GeoJSON data source.\"}},\"doc\":\"The data type of the GeoJSON source.\"},\"data\":{\"type\":\"*\",\"doc\":\"A URL to a GeoJSON file, or inline GeoJSON.\"},\"maxzoom\":{\"type\":\"number\",\"default\":18,\"doc\":\"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\"},\"buffer\":{\"type\":\"number\",\"default\":128,\"maximum\":512,\"minimum\":0,\"doc\":\"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\"},\"tolerance\":{\"type\":\"number\",\"default\":0.375,\"doc\":\"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\"},\"cluster\":{\"type\":\"boolean\",\"default\":false,\"doc\":\"If the data is a collection of point features, setting this to true clusters the points by radius into groups.\"},\"clusterRadius\":{\"type\":\"number\",\"default\":50,\"minimum\":0,\"doc\":\"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\"},\"clusterMaxZoom\":{\"type\":\"number\",\"doc\":\"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered).\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"video\":{\"doc\":\"A video data source.\"}},\"doc\":\"The data type of the video source.\"},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\",\"doc\":\"URLs to video content in order of preferred format.\"},\"coordinates\":{\"required\":true,\"doc\":\"Corners of video specified in longitude, latitude pairs.\",\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"doc\":\"A single longitude, latitude pair.\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"image\":{\"doc\":\"An image data source.\"}},\"doc\":\"The data type of the image source.\"},\"url\":{\"required\":true,\"type\":\"string\",\"doc\":\"URL that points to an image.\"},\"coordinates\":{\"required\":true,\"doc\":\"Corners of image specified in longitude, latitude pairs.\",\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\",\"doc\":\"A single longitude, latitude pair.\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"doc\":\"Unique layer name.\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":{\"fill\":{\"doc\":\"A filled polygon with an optional stroked border.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line\":{\"doc\":\"A stroked line.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol\":{\"doc\":\"An icon or a text label.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle\":{\"doc\":\"A filled circle.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-extrusion\":{\"doc\":\"An extruded (3D) polygon.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"raster\":{\"doc\":\"Raster map textures such as satellite imagery.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background\":{\"doc\":\"The background color or pattern of the map.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"doc\":\"Rendering type of this layer.\"},\"metadata\":{\"type\":\"*\",\"doc\":\"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\"},\"ref\":{\"type\":\"string\",\"doc\":\"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient.\"},\"source\":{\"type\":\"string\",\"doc\":\"Name of a source description to be used for this layer.\"},\"source-layer\":{\"type\":\"string\",\"doc\":\"Layer to use from a vector tile source. Required if the source supports multiple layers.\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24,\"doc\":\"The minimum zoom level on which the layer gets parsed and appears on.\"},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24,\"doc\":\"The maximum zoom level on which the layer gets parsed and appears on.\"},\"filter\":{\"type\":\"filter\",\"doc\":\"A expression specifying conditions on source features. Only features that match the filter are displayed.\"},\"layout\":{\"type\":\"layout\",\"doc\":\"Layout properties for the layer.\"},\"paint\":{\"type\":\"paint\",\"doc\":\"Default paint properties for this layer.\"},\"paint.*\":{\"type\":\"paint\",\"doc\":\"[Deprecated] Class-specific paint properties for this layer. The class name is the part after the first dot. Note: class-specific paint properties are deprecated and will be removed in the next version of this spec.\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_fill-extrusion\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"butt\":{\"doc\":\"A cap with a squared-off end which is drawn to the exact endpoint of the line.\"},\"round\":{\"doc\":\"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"},\"square\":{\"doc\":\"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"}},\"default\":\"butt\",\"doc\":\"The display of line endings.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"bevel\":{\"doc\":\"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\"},\"round\":{\"doc\":\"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\"},\"miter\":{\"doc\":\"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\"}},\"default\":\"miter\",\"doc\":\"The display of lines when joining.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Used to automatically convert miter joins to bevel joins for sharp angles.\",\"requires\":[{\"line-join\":\"miter\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Used to automatically convert round joins to miter joins for shallow angles.\",\"requires\":[{\"line-join\":\"round\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"point\":{\"doc\":\"The label is placed at the point where the geometry is located.\"},\"line\":{\"doc\":\"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\"}},\"default\":\"point\",\"doc\":\"Label placement relative to its geometry.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"doc\":\"Distance between two symbol anchors.\",\"requires\":[{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the icon will be visible even if it collides with other previously drawn symbols.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, other symbols can be visible even if they collide with the icon.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\",\"requires\":[\"icon-image\",\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line`, aligns icon x-axes with the line.\"},\"viewport\":{\"doc\":\"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"},\"auto\":{\"doc\":\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\"}},\"default\":\"auto\",\"doc\":\"In combination with `symbol-placement`, determines the rotation behavior of icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Scale factor for icon. 1 is original size, 3 triples the size.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{\"doc\":\"The icon is displayed at its intrinsic aspect ratio.\"},\"width\":{\"doc\":\"The icon is scaled in the x-dimension to fit the width of the text.\"},\"height\":{\"doc\":\"The icon is scaled in the y-dimension to fit the height of the text.\"},\"both\":{\"doc\":\"The icon is scaled in both x- and y-dimensions.\"}},\"default\":\"none\",\"doc\":\"Scales the icon to fit around the associated text.\",\"requires\":[\"icon-image\",\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\",\"requires\":[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"doc\":\"A string with {tokens} replaced, referencing the data property to pull from.\",\"tokens\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"doc\":\"Rotates the icon clockwise.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.21.0\"}}},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"doc\":\"Size of the additional area around the icon bounding box used for detecting symbol collisions.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the icon may be flipped to prevent it from being rendered upside-down.\",\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"doc\":\"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The text is aligned to the plane of the map.\"},\"viewport\":{\"doc\":\"The text is aligned to the plane of the viewport.\"},\"auto\":{\"doc\":\"Automatically matches the value of `text-rotation-alignment`.\"}},\"default\":\"auto\",\"doc\":\"Orientation of text when map is pitched.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line`, aligns text x-axes with the line.\"},\"viewport\":{\"doc\":\"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\"},\"auto\":{\"doc\":\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\"}},\"default\":\"auto\",\"doc\":\"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"`auto` value\":{\"js\":\"0.25.0\",\"android\":\"4.2.0\"}}},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":\"\",\"tokens\":true,\"doc\":\"Value to use for a text label. Feature properties are specified using tokens like {field_name}.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"doc\":\"Font stack to use for displaying text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Font size.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"The maximum line width for text wrapping.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Text leading value for multi-line text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Text tracking amount.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"left\":{\"doc\":\"The text is aligned to the left.\"},\"center\":{\"doc\":\"The text is centered.\"},\"right\":{\"doc\":\"The text is aligned to the right.\"}},\"default\":\"center\",\"doc\":\"Text justification options.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"center\":{\"doc\":\"The center of the text is placed closest to the anchor.\"},\"left\":{\"doc\":\"The left side of the text is placed closest to the anchor.\"},\"right\":{\"doc\":\"The right side of the text is placed closest to the anchor.\"},\"top\":{\"doc\":\"The top of the text is placed closest to the anchor.\"},\"bottom\":{\"doc\":\"The bottom of the text is placed closest to the anchor.\"},\"top-left\":{\"doc\":\"The top left corner of the text is placed closest to the anchor.\"},\"top-right\":{\"doc\":\"The top right corner of the text is placed closest to the anchor.\"},\"bottom-left\":{\"doc\":\"The bottom left corner of the text is placed closest to the anchor.\"},\"bottom-right\":{\"doc\":\"The bottom right corner of the text is placed closest to the anchor.\"}},\"default\":\"center\",\"doc\":\"Part of the text placed closest to the anchor.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Maximum angle change between adjacent characters.\",\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Rotates the text clockwise.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Size of the additional area around the text bounding box used for detecting symbol collisions.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"doc\":\"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\",\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{\"doc\":\"The text is not altered.\"},\"uppercase\":{\"doc\":\"Forces all letters to be displayed in uppercase.\"},\"lowercase\":{\"doc\":\"Forces all letters to be displayed in lowercase.\"}},\"default\":\"none\",\"doc\":\"Specifies how to capitalize text, similar to the CSS `text-transform` property.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-offset\":{\"type\":\"array\",\"doc\":\"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, the text will be visible even if it collides with other previously drawn symbols.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, other symbols can be visible even if they collide with the text.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"doc\":\"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\",\"requires\":[\"text-field\",\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{\"doc\":\"The layer is shown.\"},\"none\":{\"doc\":\"The layer is not shown.\"}},\"default\":\"visible\",\"doc\":\"Whether this layer is displayed.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"filter\":{\"type\":\"array\",\"value\":\"*\",\"doc\":\"A filter selects specific features from a layer.\"},\"filter_operator\":{\"type\":\"enum\",\"values\":{\"==\":{\"doc\":\"`[\\\"==\\\", key, value]` equality: `feature[key] = value`\"},\"!=\":{\"doc\":\"`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`\"},\">\":{\"doc\":\"`[\\\">\\\", key, value]` greater than: `feature[key] > value`\"},\">=\":{\"doc\":\"`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`\"},\"<\":{\"doc\":\"`[\\\"<\\\", key, value]` less than: `feature[key] < value`\"},\"<=\":{\"doc\":\"`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`\"},\"in\":{\"doc\":\"`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`\"},\"!in\":{\"doc\":\"`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`\"},\"all\":{\"doc\":\"`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`\"},\"any\":{\"doc\":\"`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`\"},\"none\":{\"doc\":\"`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`\"},\"has\":{\"doc\":\"`[\\\"has\\\", key]` `feature[key]` exists\"},\"!has\":{\"doc\":\"`[\\\"!has\\\", key]` `feature[key]` does not exist\"}},\"doc\":\"The filter operator.\"},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{\"doc\":\"Filter to point geometries.\"},\"LineString\":{\"doc\":\"Filter to line geometries.\"},\"Polygon\":{\"doc\":\"Filter to polygon geometries.\"}},\"doc\":\"The geometry type for the filter to select.\"},\"function\":{\"stops\":{\"type\":\"array\",\"doc\":\"An array of stops.\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"doc\":\"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\"},\"property\":{\"type\":\"string\",\"doc\":\"The name of a feature property to use as the function input.\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{\"doc\":\"Return the input value as the output value.\"},\"exponential\":{\"doc\":\"Generate an output by interpolating between stops just less than and just greater than the function input.\"},\"interval\":{\"doc\":\"Return the output value of the stop just less than the function input.\"},\"categorical\":{\"doc\":\"Return the output value of the stop equal to the function input.\"}},\"doc\":\"The interpolation strategy to use in function evaluation.\",\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{\"doc\":\"Use the RGB color space to interpolate color values\"},\"lab\":{\"doc\":\"Use the LAB color space to interpolate color values.\"},\"hcl\":{\"doc\":\"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\"}},\"doc\":\"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\",\"default\":\"rgb\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2,\"doc\":\"Zoom level and value pair.\"},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{\"doc\":\"The position of the light source is aligned to the rotation of the map.\"},\"viewport\":{\"doc\":\"The position of the light source is aligned to the rotation of the viewport.\"}},\"transition\":false,\"doc\":\"Whether extruded geometries are lit relative to the map or viewport.\",\"example\":\"map\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"transition\":true,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"doc\":\"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\",\"example\":[1.5,90,80],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"color\":{\"type\":\"color\",\"default\":\"#ffffff\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true,\"doc\":\"Color tint for lighting extruded geometries.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"intensity\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true,\"doc\":\"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"doc\":\"Whether or not the fill should be antialiased.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.21.0\"}}},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.19.0\"}}},\"fill-outline-color\":{\"type\":\"color\",\"doc\":\"The outline color of the fill. Matches the value of `fill-color` if unspecified.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.19.0\"}}},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The fill is translated relative to the map.\"},\"viewport\":{\"doc\":\"The fill is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"fill-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The fill extrusion is translated relative to the map.\"},\"viewport\":{\"doc\":\"The fill extrusion is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-height\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"doc\":\"The height with which to extrude this layer.\",\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}},\"fill-extrusion-base\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"doc\":\"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.27.0\"},\"data-driven styling\":{\"js\":\"0.27.0\"}}}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the line will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-color\":{\"type\":\"color\",\"doc\":\"The color with which the line will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.23.0\"}}},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The line is translated relative to the map.\"},\"viewport\":{\"doc\":\"The line is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"line-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Stroke thickness.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"doc\":\"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-offset\":{\"type\":\"number\",\"default\":0,\"doc\":\"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.12.1\",\"ios\":\"3.1.0\",\"android\":\"3.0.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Blur applied to the line, in pixels.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"doc\":\"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.\",\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Circle radius.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.18.0\"}}},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The fill color of the circle.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.18.0\"}}},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"doc\":\"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.20.0\"}}},\"circle-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the circle will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"},\"data-driven styling\":{\"js\":\"0.20.0\"}}},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The circle is translated relative to the map.\"},\"viewport\":{\"doc\":\"The circle is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"circle-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"Circles are scaled according to their apparent distance to the camera.\"},\"viewport\":{\"doc\":\"Circles are not scaled.\"}},\"default\":\"map\",\"doc\":\"Controls the scaling behavior of the circle when the map is pitched.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.21.0\",\"android\":\"4.2.0\"}}},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The stroke color of the circle.\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}},\"circle-stroke-opacity\":{\"type\":\"number\",\"doc\":\"The opacity of the circle's stroke.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.29.0\"},\"data-driven styling\":{\"js\":\"0.29.0\"}}}},\"paint_symbol\":{\"icon-opacity\":{\"doc\":\"The opacity at which the icon will be drawn.\",\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the icon. This can only be used with sdf icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the icon's halo. Icon halos can only be used with SDF icons.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the icon outline.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Fade out the halo towards the outside.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\"requires\":[\"icon-image\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"Icons are translated relative to the map.\"},\"viewport\":{\"doc\":\"Icons are translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the text will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-color\":{\"type\":\"color\",\"doc\":\"The color with which the text will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"doc\":\"The color of the text's halo, which helps it stand out from backgrounds.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"The halo's fadeout distance towards the outside.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\",\"requires\":[\"text-field\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{\"doc\":\"The text is translated relative to the map.\"},\"viewport\":{\"doc\":\"The text is translated relative to the viewport.\"}},\"doc\":\"Controls the translation reference point.\",\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the image will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\",\"doc\":\"Rotates hues around the color wheel.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Increase or reduce the brightness of the image. The value is the minimum brightness.\",\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"doc\":\"Increase or reduce the brightness of the image. The value is the maximum brightness.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-saturation\":{\"type\":\"number\",\"doc\":\"Increase or reduce the saturation of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-contrast\":{\"type\":\"number\",\"doc\":\"Increase or reduce the contrast of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\",\"doc\":\"Fade duration when a new tile is added.\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color with which the background will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}],\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\",\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity at which the background will be drawn.\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"sdk-support\":{\"basic functionality\":{\"js\":\"0.10.0\",\"ios\":\"2.0.0\",\"android\":\"2.0.1\"}}}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Time allotted for transitions to complete.\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Length of time before a transition begins.\"}}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/v8.json\n// module id = 1014\n// module chunks = 0 1","'use strict';\n\nvar validateConstants = require('./validate/validate_constants');\nvar validate = require('./validate/validate');\nvar latestStyleSpec = require('../reference/latest.min');\nvar validateGlyphsURL = require('./validate/validate_glyphs_url');\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n *     If omitted, the latest style spec is used.\n * @returns {Array<ValidationError>}\n * @example\n *   var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n *   var errors = validate(style);\n */\nfunction validateStyleMin(style, styleSpec) {\n    styleSpec = styleSpec || latestStyleSpec;\n\n    var errors = [];\n\n    errors = errors.concat(validate({\n        key: '',\n        value: style,\n        valueSpec: styleSpec.$root,\n        styleSpec: styleSpec,\n        style: style,\n        objectElementValidators: {\n            glyphs: validateGlyphsURL,\n            '*': function() {\n                return [];\n            }\n        }\n    }));\n\n    if (styleSpec.$version > 7 && style.constants) {\n        errors = errors.concat(validateConstants({\n            key: 'constants',\n            value: style.constants,\n            style: style,\n            styleSpec: styleSpec\n        }));\n    }\n\n    return sortErrors(errors);\n}\n\nvalidateStyleMin.source = wrapCleanErrors(require('./validate/validate_source'));\nvalidateStyleMin.light = wrapCleanErrors(require('./validate/validate_light'));\nvalidateStyleMin.layer = wrapCleanErrors(require('./validate/validate_layer'));\nvalidateStyleMin.filter = wrapCleanErrors(require('./validate/validate_filter'));\nvalidateStyleMin.paintProperty = wrapCleanErrors(require('./validate/validate_paint_property'));\nvalidateStyleMin.layoutProperty = wrapCleanErrors(require('./validate/validate_layout_property'));\n\nfunction sortErrors(errors) {\n    return [].concat(errors).sort(function (a, b) {\n        return a.line - b.line;\n    });\n}\n\nfunction wrapCleanErrors(inner) {\n    return function() {\n        return sortErrors(inner.apply(this, arguments));\n    };\n}\n\nmodule.exports = validateStyleMin;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate_style.min.js\n// module id = 1015\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateBoolean(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'boolean') {\n        return [new ValidationError(key, value, 'boolean expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_boolean.js\n// module id = 1016\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar parseCSSColor = require('csscolorparser').parseCSSColor;\n\nmodule.exports = function validateColor(options) {\n    var key = options.key;\n    var value = options.value;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'color expected, %s found', type)];\n    }\n\n    if (parseCSSColor(value) === null) {\n        return [new ValidationError(key, value, 'color expected, \"%s\" found', value)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_color.js\n// module id = 1017\n// module chunks = 0 1","module.exports = require('./v8.min.json');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/latest.min.js\n// module id = 1018\n// module chunks = 0 1","module.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8]},\"name\":{\"type\":\"string\"},\"metadata\":{\"type\":\"*\"},\"center\":{\"type\":\"array\",\"value\":\"number\"},\"zoom\":{\"type\":\"number\"},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\"},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\"},\"light\":{\"type\":\"light\"},\"sources\":{\"required\":true,\"type\":\"sources\"},\"sprite\":{\"type\":\"string\"},\"glyphs\":{\"type\":\"string\"},\"transition\":{\"type\":\"transition\"},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\"}},\"sources\":{\"*\":{\"type\":\"source\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"vector\":{},\"raster\":{}}},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"*\":{\"type\":\"*\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"geojson\":{}}},\"data\":{\"type\":\"*\"},\"maxzoom\":{\"type\":\"number\",\"default\":18},\"buffer\":{\"type\":\"number\",\"default\":128,\"maximum\":512,\"minimum\":0},\"tolerance\":{\"type\":\"number\",\"default\":0.375},\"cluster\":{\"type\":\"boolean\",\"default\":false},\"clusterRadius\":{\"type\":\"number\",\"default\":50,\"minimum\":0},\"clusterMaxZoom\":{\"type\":\"number\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"video\":{}}},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":{\"image\":{}}},\"url\":{\"required\":true,\"type\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":{\"fill\":{},\"line\":{},\"symbol\":{},\"circle\":{},\"fill-extrusion\":{},\"raster\":{},\"background\":{}}},\"metadata\":{\"type\":\"*\"},\"ref\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"source-layer\":{\"type\":\"string\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":24},\"filter\":{\"type\":\"filter\"},\"layout\":{\"type\":\"layout\"},\"paint\":{\"type\":\"paint\"},\"paint.*\":{\"type\":\"paint\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_fill-extrusion\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_fill-extrusion\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"butt\":{},\"round\":{},\"square\":{}},\"default\":\"butt\"},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"bevel\":{},\"round\":{},\"miter\":{}},\"default\":\"miter\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[{\"line-join\":\"miter\"}]},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[{\"line-join\":\"round\"}]},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"point\":{},\"line\":{}},\"default\":\"point\"},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"requires\":[{\"symbol-placement\":\"line\"}]},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\",\"text-field\"]},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"icon-image\"]},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"icon-image\"]},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{},\"width\":{},\"height\":{},\"both\":{}},\"default\":\"none\",\"requires\":[\"icon-image\",\"text-field\"]},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"icon-image\",\"text-field\",{\"icon-text-fit\":[\"both\",\"width\",\"height\"]}]},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"tokens\":true},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"requires\":[\"icon-image\"]},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"]},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{},\"auto\":{}},\"default\":\"auto\",\"requires\":[\"text-field\"]},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":\"\",\"tokens\":true},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"requires\":[\"text-field\"]},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"left\":{},\"center\":{},\"right\":{}},\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"center\":{},\"left\":{},\"right\":{},\"top\":{},\"bottom\":{},\"top-left\":{},\"top-right\":{},\"bottom-left\":{},\"bottom-right\":{}},\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}]},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"requires\":[\"text-field\"]},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true,\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"none\":{},\"uppercase\":{},\"lowercase\":{}},\"default\":\"none\",\"requires\":[\"text-field\"]},\"text-offset\":{\"type\":\"array\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"]},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":false,\"requires\":[\"text-field\",\"icon-image\"]},\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"values\":{\"visible\":{},\"none\":{}},\"default\":\"visible\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_operator\":{\"type\":\"enum\",\"values\":{\"==\":{},\"!=\":{},\">\":{},\">=\":{},\"<\":{},\"<=\":{},\"in\":{},\"!in\":{},\"all\":{},\"any\":{},\"none\":{},\"has\":{},\"!has\":{}}},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{},\"LineString\":{},\"Polygon\":{}}},\"function\":{\"stops\":{\"type\":\"array\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{},\"exponential\":{},\"interval\":{},\"categorical\":{}},\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{},\"lab\":{},\"hcl\":{}},\"default\":\"rgb\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{},\"viewport\":{}},\"transition\":false},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"transition\":true,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false},\"color\":{\"type\":\"color\",\"default\":\"#ffffff\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true},\"intensity\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}]},\"fill-outline-color\":{\"type\":\"color\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}]},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"]},\"fill-extrusion-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"fill-extrusion-height\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true},\"fill-extrusion-base\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"]}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}]},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"circle-translate\"]},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\"},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-stroke-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}]},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/reference/v8.min.json\n// module id = 1019\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar validateString = require('./validate_string');\n\nmodule.exports = function(options) {\n    var value = options.value;\n    var key = options.key;\n\n    var errors = validateString(options);\n    if (errors.length) return errors;\n\n    if (value.indexOf('{fontstack}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n    }\n\n    if (value.indexOf('{range}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-style-spec/lib/validate/validate_glyphs_url.js\n// module id = 1020\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction BackgroundStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = BackgroundStyleLayer;\n\nBackgroundStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/background_style_layer.js\n// module id = 1021\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction CircleStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = CircleStyleLayer;\n\nCircleStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/circle_style_layer.js\n// module id = 1022\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction FillStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nFillStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValue.call(this, 'fill-color', globalProperties, featureProperties);\n        } else {\n            return StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties);\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, arguments);\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, 'fill-color', zoom);\n        } else {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, name, zoom);\n        }\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, name);\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, name);\n        }\n    }\n\n});\n\nmodule.exports = FillStyleLayer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/fill_style_layer.js\n// module id = 1023\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction LineStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = LineStyleLayer;\n\nLineStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var value = StyleLayer.prototype.getPaintValue.apply(this, arguments);\n\n        // If the line is dashed, scale the dash lengths by the line\n        // width at the previous round zoom level.\n        if (value && name === 'line-dasharray') {\n            var flooredZoom = Math.floor(globalProperties.zoom);\n            if (this._flooredZoom !== flooredZoom) {\n                this._flooredZoom = flooredZoom;\n                this._flooredLineWidth = this.getPaintValue('line-width', globalProperties, featureProperties);\n            }\n\n            value.fromScale *= this._flooredLineWidth;\n            value.toScale *= this._flooredLineWidth;\n        }\n\n        return value;\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/line_style_layer.js\n// module id = 1024\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction RasterStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = RasterStyleLayer;\n\nRasterStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/raster_style_layer.js\n// module id = 1025\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction SymbolStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = SymbolStyleLayer;\n\nSymbolStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    isHidden: function() {\n        if (StyleLayer.prototype.isHidden.apply(this, arguments)) return true;\n\n        var isTextHidden = this.paint['text-opacity'] === 0 || !this.layout['text-field'];\n        var isIconHidden = this.paint['icon-opacity'] === 0 || !this.layout['icon-image'];\n        if (isTextHidden && isIconHidden) return true;\n\n        return false;\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        if (name === 'text-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('text-rotation-alignment')) {\n            return 'map';\n        } else if (name === 'icon-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('icon-rotation-alignment')) {\n            return 'map';\n        } else {\n            return StyleLayer.prototype.getLayoutValue.apply(this, arguments);\n        }\n    }\n\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/style_layer/symbol_style_layer.js\n// module id = 1026\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\nvar normalizeURL = require('../util/mapbox').normalizeSpriteURL;\n\nmodule.exports = ImageSprite;\n\nfunction ImageSprite(base) {\n    this.base = base;\n    this.retina = browser.devicePixelRatio > 1;\n\n    var format = this.retina ? '@2x' : '';\n\n    ajax.getJSON(normalizeURL(base, format, '.json'), function(err, data) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        this.data = data;\n        if (this.img) this.fire('load');\n    }.bind(this));\n\n    ajax.getImage(normalizeURL(base, format, '.png'), function(err, img) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        // premultiply the sprite\n        var data = img.getData();\n        var newdata = img.data = new Uint8Array(data.length);\n        for (var i = 0; i < data.length; i += 4) {\n            var alpha = data[i + 3] / 255;\n            newdata[i + 0] = data[i + 0] * alpha;\n            newdata[i + 1] = data[i + 1] * alpha;\n            newdata[i + 2] = data[i + 2] * alpha;\n            newdata[i + 3] = data[i + 3];\n        }\n\n        this.img = img;\n        if (this.data) this.fire('load');\n    }.bind(this));\n}\n\nImageSprite.prototype = Object.create(Evented);\n\nImageSprite.prototype.toJSON = function() {\n    return this.base;\n};\n\nImageSprite.prototype.loaded = function() {\n    return !!(this.data && this.img);\n};\n\nImageSprite.prototype.resize = function(/*gl*/) {\n    if (browser.devicePixelRatio > 1 !== this.retina) {\n        var newSprite = new ImageSprite(this.base);\n        newSprite.on('load', function() {\n            this.img = newSprite.img;\n            this.data = newSprite.data;\n            this.retina = newSprite.retina;\n        }.bind(this));\n    }\n};\n\nfunction SpritePosition() {}\nSpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false };\n\nImageSprite.prototype.getSpritePosition = function(name) {\n    if (!this.loaded()) return new SpritePosition();\n\n    var pos = this.data && this.data[name];\n    if (pos && this.img) return pos;\n\n    return new SpritePosition();\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/style/image_sprite.js\n// module id = 1027\n// module chunks = 0 1","'use strict';\n\nvar normalizeURL = require('../util/mapbox').normalizeGlyphsURL;\nvar getArrayBuffer = require('../util/ajax').getArrayBuffer;\nvar Glyphs = require('../util/glyphs');\nvar GlyphAtlas = require('../symbol/glyph_atlas');\nvar Protobuf = require('pbf');\n\nmodule.exports = GlyphSource;\n\n/**\n * A glyph source has a URL from which to load new glyphs and manages\n * GlyphAtlases in which to store glyphs used by the requested fontstacks\n * and ranges.\n *\n * @param {string} url glyph template url\n * @private\n */\nfunction GlyphSource(url) {\n    this.url = url && normalizeURL(url);\n    this.atlases = {};\n    this.stacks = {};\n    this.loading = {};\n}\n\nGlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) {\n    if (this.stacks[fontstack] === undefined) {\n        this.stacks[fontstack] = {};\n    }\n    if (this.atlases[fontstack] === undefined) {\n        this.atlases[fontstack] = new GlyphAtlas(128, 128);\n    }\n\n    var glyphs = {};\n    var stack = this.stacks[fontstack];\n    var atlas = this.atlases[fontstack];\n\n    // the number of pixels the sdf bitmaps are padded by\n    var buffer = 3;\n\n    var missing = {};\n    var remaining = 0;\n    var range;\n\n    for (var i = 0; i < glyphIDs.length; i++) {\n        var glyphID = glyphIDs[i];\n        range = Math.floor(glyphID / 256);\n\n        if (stack[range]) {\n            var glyph = stack[range].glyphs[glyphID];\n            var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n            if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n        } else {\n            if (missing[range] === undefined) {\n                missing[range] = [];\n                remaining++;\n            }\n            missing[range].push(glyphID);\n        }\n    }\n\n    if (!remaining) callback(undefined, glyphs, fontstack);\n\n    var onRangeLoaded = function(err, range, data) {\n        // TODO not be silent about errors\n        if (!err) {\n            var stack = this.stacks[fontstack][range] = data.stacks[0];\n            for (var i = 0; i < missing[range].length; i++) {\n                var glyphID = missing[range][i];\n                var glyph = stack.glyphs[glyphID];\n                var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n                if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n            }\n        }\n        remaining--;\n        if (!remaining) callback(undefined, glyphs, fontstack);\n    }.bind(this);\n\n    for (var r in missing) {\n        this.loadRange(fontstack, r, onRangeLoaded);\n    }\n};\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nfunction SimpleGlyph(glyph, rect, buffer) {\n    var padding = 1;\n    this.advance = glyph.advance;\n    this.left = glyph.left - buffer - padding;\n    this.top = glyph.top + buffer + padding;\n    this.rect = rect;\n}\n\nGlyphSource.prototype.loadRange = function(fontstack, range, callback) {\n    if (range * 256 > 65535) return callback('glyphs > 65535 not supported');\n\n    if (this.loading[fontstack] === undefined) {\n        this.loading[fontstack] = {};\n    }\n    var loading = this.loading[fontstack];\n\n    if (loading[range]) {\n        loading[range].push(callback);\n    } else {\n        loading[range] = [callback];\n\n        var rangeName = (range * 256) + '-' + (range * 256 + 255);\n        var url = glyphUrl(fontstack, rangeName, this.url);\n\n        getArrayBuffer(url, function(err, data) {\n            var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data)));\n            for (var i = 0; i < loading[range].length; i++) {\n                loading[range][i](err, range, glyphs);\n            }\n            delete loading[range];\n        });\n    }\n};\n\nGlyphSource.prototype.getGlyphAtlas = function(fontstack) {\n    return this.atlases[fontstack];\n};\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n    subdomains = subdomains || 'abc';\n\n    return url\n        .replace('{s}', subdomains[fontstack.length % subdomains.length])\n        .replace('{fontstack}', fontstack)\n        .replace('{range}', range);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/glyph_source.js\n// module id = 1028\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n    this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n    if (tag === 1) {\n        var fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n        stacks.push(fontstack);\n    }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n    if (tag === 1) fontstack.name = pbf.readString();\n    else if (tag === 2) fontstack.range = pbf.readString();\n    else if (tag === 3) {\n        var glyph = pbf.readMessage(readGlyph, {});\n        fontstack.glyphs[glyph.id] = glyph;\n    }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n    if (tag === 1) glyph.id = pbf.readVarint();\n    else if (tag === 2) glyph.bitmap = pbf.readBytes();\n    else if (tag === 3) glyph.width = pbf.readVarint();\n    else if (tag === 4) glyph.height = pbf.readVarint();\n    else if (tag === 5) glyph.left = pbf.readSVarint();\n    else if (tag === 6) glyph.top = pbf.readSVarint();\n    else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/glyphs.js\n// module id = 1029\n// module chunks = 0 1","'use strict';\n\nvar ShelfPack = require('shelf-pack');\nvar util = require('../util/util');\n\nmodule.exports = GlyphAtlas;\nfunction GlyphAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.index = {};\n    this.ids = {};\n    this.data = new Uint8Array(width * height);\n}\n\nGlyphAtlas.prototype.getGlyphs = function() {\n    var glyphs = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!glyphs[name]) glyphs[name] = [];\n        glyphs[name].push(id);\n    }\n\n    return glyphs;\n};\n\nGlyphAtlas.prototype.getRects = function() {\n    var rects = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!rects[name]) rects[name] = {};\n        rects[name][id] = this.index[key];\n    }\n\n    return rects;\n};\n\n\nGlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) {\n    if (!glyph) return null;\n\n    var key = name + \"#\" + glyph.id;\n\n    // The glyph is already in this texture.\n    if (this.index[key]) {\n        if (this.ids[key].indexOf(id) < 0) {\n            this.ids[key].push(id);\n        }\n        return this.index[key];\n    }\n\n    // The glyph bitmap has zero width.\n    if (!glyph.bitmap) {\n        return null;\n    }\n\n    var bufferedWidth = glyph.width + buffer * 2;\n    var bufferedHeight = glyph.height + buffer * 2;\n\n    // Add a 1px border around every image.\n    var padding = 1;\n    var packWidth = bufferedWidth + 2 * padding;\n    var packHeight = bufferedHeight + 2 * padding;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    packWidth += (4 - packWidth % 4);\n    packHeight += (4 - packHeight % 4);\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        this.resize();\n        rect = this.bin.packOne(packWidth, packHeight);\n    }\n    if (!rect) {\n        util.warnOnce('glyph bitmap overflow');\n        return null;\n    }\n\n    this.index[key] = rect;\n    this.ids[key] = [id];\n\n    var target = this.data;\n    var source = glyph.bitmap;\n    for (var y = 0; y < bufferedHeight; y++) {\n        var y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n        var y2 = bufferedWidth * y;\n        for (var x = 0; x < bufferedWidth; x++) {\n            target[y1 + x] = source[y2 + x];\n        }\n    }\n\n    this.dirty = true;\n\n    return rect;\n};\n\nGlyphAtlas.prototype.resize = function() {\n    var origw = this.width,\n        origh = this.height;\n\n    // For now, don't grow the atlas beyond 1024x1024 because of how\n    // texture coords pack into unsigned byte in symbol bucket.\n    if (origw > 512 || origh > 512) return;\n\n    if (this.texture) {\n        if (this.gl) {\n            this.gl.deleteTexture(this.texture);\n        }\n        this.texture = null;\n    }\n\n    this.width *= 2;\n    this.height *= 2;\n    this.bin.resize(this.width, this.height);\n\n    var buf = new ArrayBuffer(this.width * this.height),\n        src, dst;\n    for (var i = 0; i < origh; i++) {\n        src = new Uint8Array(this.data.buffer, origh * i, origw);\n        dst = new Uint8Array(buf, origh * i * 2, origw);\n        dst.set(src);\n    }\n    this.data = new Uint8Array(buf);\n};\n\nGlyphAtlas.prototype.bind = function(gl) {\n    this.gl = gl;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n};\n\nGlyphAtlas.prototype.updateTexture = function(gl) {\n    this.bind(gl);\n    if (this.dirty) {\n        gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n        this.dirty = false;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/glyph_atlas.js\n// module id = 1030\n// module chunks = 0 1","'use strict';\n\n// lightweight Buffer shim for pbf browser build\n// based on code from github.com/feross/buffer (MIT-licensed)\n\nmodule.exports = Buffer;\n\nvar ieee754 = require('ieee754');\n\nvar BufferMethods;\n\nfunction Buffer(length) {\n    var arr;\n    if (length && length.length) {\n        arr = length;\n        length = arr.length;\n    }\n    var buf = new Uint8Array(length || 0);\n    if (arr) buf.set(arr);\n\n    buf.readUInt32LE = BufferMethods.readUInt32LE;\n    buf.writeUInt32LE = BufferMethods.writeUInt32LE;\n    buf.readInt32LE = BufferMethods.readInt32LE;\n    buf.writeInt32LE = BufferMethods.writeInt32LE;\n    buf.readFloatLE = BufferMethods.readFloatLE;\n    buf.writeFloatLE = BufferMethods.writeFloatLE;\n    buf.readDoubleLE = BufferMethods.readDoubleLE;\n    buf.writeDoubleLE = BufferMethods.writeDoubleLE;\n    buf.toString = BufferMethods.toString;\n    buf.write = BufferMethods.write;\n    buf.slice = BufferMethods.slice;\n    buf.copy = BufferMethods.copy;\n\n    buf._isBuffer = true;\n    return buf;\n}\n\nvar lastStr, lastStrEncoded;\n\nBufferMethods = {\n    readUInt32LE: function(pos) {\n        return ((this[pos]) |\n            (this[pos + 1] << 8) |\n            (this[pos + 2] << 16)) +\n            (this[pos + 3] * 0x1000000);\n    },\n\n    writeUInt32LE: function(val, pos) {\n        this[pos] = val;\n        this[pos + 1] = (val >>> 8);\n        this[pos + 2] = (val >>> 16);\n        this[pos + 3] = (val >>> 24);\n    },\n\n    readInt32LE: function(pos) {\n        return ((this[pos]) |\n            (this[pos + 1] << 8) |\n            (this[pos + 2] << 16)) +\n            (this[pos + 3] << 24);\n    },\n\n    readFloatLE:  function(pos) { return ieee754.read(this, pos, true, 23, 4); },\n    readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); },\n\n    writeFloatLE:  function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); },\n    writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); },\n\n    toString: function(encoding, start, end) {\n        var str = '',\n            tmp = '';\n\n        start = start || 0;\n        end = Math.min(this.length, end || this.length);\n\n        for (var i = start; i < end; i++) {\n            var ch = this[i];\n            if (ch <= 0x7F) {\n                str += decodeURIComponent(tmp) + String.fromCharCode(ch);\n                tmp = '';\n            } else {\n                tmp += '%' + ch.toString(16);\n            }\n        }\n\n        str += decodeURIComponent(tmp);\n\n        return str;\n    },\n\n    write: function(str, pos) {\n        var bytes = str === lastStr ? lastStrEncoded : encodeString(str);\n        for (var i = 0; i < bytes.length; i++) {\n            this[pos + i] = bytes[i];\n        }\n    },\n\n    slice: function(start, end) {\n        return this.subarray(start, end);\n    },\n\n    copy: function(buf, pos) {\n        pos = pos || 0;\n        for (var i = 0; i < this.length; i++) {\n            buf[pos + i] = this[i];\n        }\n    }\n};\n\nBufferMethods.writeInt32LE = BufferMethods.writeUInt32LE;\n\nBuffer.byteLength = function(str) {\n    lastStr = str;\n    lastStrEncoded = encodeString(str);\n    return lastStrEncoded.length;\n};\n\nBuffer.isBuffer = function(buf) {\n    return !!(buf && buf._isBuffer);\n};\n\nfunction encodeString(str) {\n    var length = str.length,\n        bytes = [];\n\n    for (var i = 0, c, lead; i < length; i++) {\n        c = str.charCodeAt(i); // code point\n\n        if (c > 0xD7FF && c < 0xE000) {\n\n            if (lead) {\n                if (c < 0xDC00) {\n                    bytes.push(0xEF, 0xBF, 0xBD);\n                    lead = c;\n                    continue;\n\n                } else {\n                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n                    lead = null;\n                }\n\n            } else {\n                if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD);\n                else lead = c;\n\n                continue;\n            }\n\n        } else if (lead) {\n            bytes.push(0xEF, 0xBF, 0xBD);\n            lead = null;\n        }\n\n        if (c < 0x80) bytes.push(c);\n        else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80);\n        else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n        else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n    }\n    return bytes;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/pbf/buffer.js\n// module id = 1031\n// module chunks = 0 1","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ieee754/index.js\n// module id = 1032\n// module chunks = 0 1","'use strict';\n\nvar ShelfPack = require('shelf-pack');\nvar browser = require('../util/browser');\nvar util = require('../util/util');\n\nmodule.exports = SpriteAtlas;\nfunction SpriteAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.images = {};\n    this.data = false;\n    this.texture = 0; // WebGL ID\n    this.filter = 0; // WebGL ID\n    this.pixelRatio = 1;\n    this.dirty = true;\n}\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n    var srcI = srcY * srcStride + srcX;\n    var dstI = dstY * dstStride + dstX;\n    var x, y;\n\n    if (wrap) {\n        // add 1 pixel wrapped padding on each side of the image\n        dstI -= dstStride;\n        for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) {\n            for (x = -1; x <= width; x++) {\n                dst[dstI + x] = src[srcI + ((x + width) % width)];\n            }\n        }\n\n    } else {\n        for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n            for (x = 0; x < width; x++) {\n                dst[dstI + x] = src[srcI + x];\n            }\n        }\n    }\n}\n\nSpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) {\n\n    pixelWidth = pixelWidth / this.pixelRatio;\n    pixelHeight = pixelHeight / this.pixelRatio;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    // Pad icons to prevent them from polluting neighbours during linear interpolation\n    var padding = 2;\n    var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n    var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        util.warnOnce('SpriteAtlas out of space.');\n        return null;\n    }\n\n    return rect;\n};\n\nSpriteAtlas.prototype.getImage = function(name, wrap) {\n    if (this.images[name]) {\n        return this.images[name];\n    }\n\n    if (!this.sprite) {\n        return null;\n    }\n\n    var pos = this.sprite.getSpritePosition(name);\n    if (!pos.width || !pos.height) {\n        return null;\n    }\n\n    var rect = this.allocateImage(pos.width, pos.height);\n    if (!rect) {\n        return null;\n    }\n\n    var image = new AtlasImage(rect, pos.width / pos.pixelRatio, pos.height / pos.pixelRatio, pos.sdf, pos.pixelRatio / this.pixelRatio);\n    this.images[name] = image;\n\n    this.copy(rect, pos, wrap);\n\n    return image;\n};\n\n\n// Return position of a repeating fill pattern.\nSpriteAtlas.prototype.getPosition = function(name, repeating) {\n    var image = this.getImage(name, repeating);\n    var rect = image && image.rect;\n\n    if (!rect) {\n        return null;\n    }\n\n    var width = image.width * image.pixelRatio;\n    var height = image.height * image.pixelRatio;\n    var padding = 1;\n\n    return {\n        size: [image.width, image.height],\n        tl: [(rect.x + padding)         / this.width, (rect.y + padding)          / this.height],\n        br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n    };\n};\n\n\nSpriteAtlas.prototype.allocate = function() {\n    if (!this.data) {\n        var w = Math.floor(this.width * this.pixelRatio);\n        var h = Math.floor(this.height * this.pixelRatio);\n        this.data = new Uint32Array(w * h);\n        for (var i = 0; i < this.data.length; i++) {\n            this.data[i] = 0;\n        }\n    }\n};\n\n\nSpriteAtlas.prototype.copy = function(dst, src, wrap) {\n    if (!this.sprite.img.data) return;\n    var srcImg = new Uint32Array(this.sprite.img.data.buffer);\n\n    this.allocate();\n    var dstImg = this.data;\n\n    var padding = 1;\n\n    copyBitmap(\n        /* source buffer */  srcImg,\n        /* source stride */  this.sprite.img.width,\n        /* source x */       src.x,\n        /* source y */       src.y,\n        /* dest buffer */    dstImg,\n        /* dest stride */    this.width * this.pixelRatio,\n        /* dest x */         (dst.x + padding) * this.pixelRatio,\n        /* dest y */         (dst.y + padding) * this.pixelRatio,\n        /* icon dimension */ src.width,\n        /* icon dimension */ src.height,\n        /* wrap */ wrap\n    );\n\n    this.dirty = true;\n};\n\nSpriteAtlas.prototype.setSprite = function(sprite) {\n    if (sprite) {\n        this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1;\n\n        if (this.canvas) {\n            this.canvas.width = this.width * this.pixelRatio;\n            this.canvas.height = this.height * this.pixelRatio;\n        }\n    }\n    this.sprite = sprite;\n};\n\nSpriteAtlas.prototype.addIcons = function(icons, callback) {\n    for (var i = 0; i < icons.length; i++) {\n        this.getImage(icons[i]);\n    }\n\n    callback(null, this.images);\n};\n\nSpriteAtlas.prototype.bind = function(gl, linear) {\n    var first = false;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        first = true;\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n\n    var filterVal = linear ? gl.LINEAR : gl.NEAREST;\n    if (filterVal !== this.filter) {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n        this.filter = filterVal;\n    }\n\n    if (this.dirty) {\n        this.allocate();\n\n        if (first) {\n            gl.texImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // ind level\n                gl.RGBA, // ind internalformat\n                this.width * this.pixelRatio, // GLsizei width\n                this.height * this.pixelRatio, // GLsizei height\n                0, // ind border\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object data\n            );\n        } else {\n            gl.texSubImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // int level\n                0, // int xoffset\n                0, // int yoffset\n                this.width * this.pixelRatio, // long width\n                this.height * this.pixelRatio, // long height\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object pixels\n            );\n        }\n\n        this.dirty = false;\n    }\n};\n\nfunction AtlasImage(rect, width, height, sdf, pixelRatio) {\n    this.rect = rect;\n    this.width = width;\n    this.height = height;\n    this.sdf = sdf;\n    this.pixelRatio = pixelRatio;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/sprite_atlas.js\n// module id = 1033\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\n\nmodule.exports = LineAtlas;\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nfunction LineAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n    this.nextRow = 0;\n\n    this.bytes = 4;\n    this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n    this.positions = {};\n}\n\nLineAtlas.prototype.setSprite = function(sprite) {\n    this.sprite = sprite;\n};\n\n/**\n * Get or create a dash line pattern.\n *\n * @param {Array<number>} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\nLineAtlas.prototype.getDash = function(dasharray, round) {\n    var key = dasharray.join(\",\") + round;\n\n    if (!this.positions[key]) {\n        this.positions[key] = this.addDash(dasharray, round);\n    }\n    return this.positions[key];\n};\n\nLineAtlas.prototype.addDash = function(dasharray, round) {\n\n    var n = round ? 7 : 0;\n    var height = 2 * n + 1;\n    var offset = 128;\n\n    if (this.nextRow + height > this.height) {\n        util.warnOnce('LineAtlas out of space');\n        return null;\n    }\n\n    var length = 0;\n    for (var i = 0; i < dasharray.length; i++) {\n        length += dasharray[i];\n    }\n\n    var stretch = this.width / length;\n    var halfWidth = stretch / 2;\n\n    // If dasharray has an odd length, both the first and last parts\n    // are dashes and should be joined seamlessly.\n    var oddLength = dasharray.length % 2 === 1;\n\n    for (var y = -n; y <= n; y++) {\n        var row = this.nextRow + n + y;\n        var index = this.width * row;\n\n        var left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n        var right = dasharray[0];\n        var partIndex = 1;\n\n        for (var x = 0; x < this.width; x++) {\n\n            while (right < x / stretch) {\n                left = right;\n                right = right + dasharray[partIndex];\n\n                if (oddLength && partIndex === dasharray.length - 1) {\n                    right += dasharray[0];\n                }\n\n                partIndex++;\n            }\n\n            var distLeft = Math.abs(x - left * stretch);\n            var distRight = Math.abs(x - right * stretch);\n            var dist = Math.min(distLeft, distRight);\n            var inside = (partIndex % 2) === 1;\n            var signedDistance;\n\n            if (round) {\n                // Add circle caps\n                var distMiddle = n ? y / n * (halfWidth + 1) : 0;\n                if (inside) {\n                    var distEdge = halfWidth - Math.abs(distMiddle);\n                    signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n                } else {\n                    signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n                }\n            } else {\n                signedDistance = (inside ? 1 : -1) * dist;\n            }\n\n            this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n        }\n    }\n\n    var pos = {\n        y: (this.nextRow + n + 0.5) / this.height,\n        height: 2 * n / this.height,\n        width: length\n    };\n\n    this.nextRow += height;\n    this.dirty = true;\n\n    return pos;\n};\n\nLineAtlas.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (this.dirty) {\n            this.dirty = false;\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/line_atlas.js\n// module id = 1034\n// module chunks = 0 1","'use strict';\n\nvar Actor = require('../actor');\nvar WebWorkify = require('webworkify');\n\nmodule.exports = Dispatcher;\n\nfunction Dispatcher(length, parent) {\n    this.actors = [];\n    this.currentActor = 0;\n    for (var i = 0; i < length; i++) {\n        var worker = new WebWorkify(require('../../source/worker'));\n        var actor = new Actor(worker, parent);\n        actor.name = \"Worker \" + i;\n        this.actors.push(actor);\n    }\n}\n\nDispatcher.prototype = {\n    broadcast: function(type, data) {\n        for (var i = 0; i < this.actors.length; i++) {\n            this.actors[i].send(type, data);\n        }\n    },\n\n    send: function(type, data, callback, targetID, buffers) {\n        if (typeof targetID !== 'number' || isNaN(targetID)) {\n            // Use round robin to send requests to web workers.\n            targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n        }\n\n        this.actors[targetID].send(type, data, callback, buffers);\n        return targetID;\n    },\n\n    remove: function() {\n        for (var i = 0; i < this.actors.length; i++) {\n            this.actors[i].target.terminate();\n        }\n        this.actors = [];\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/browser/dispatcher.js\n// module id = 1035\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Actor;\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @private\n */\nfunction Actor(target, parent) {\n    this.target = target;\n    this.parent = parent;\n    this.callbacks = {};\n    this.callbackID = 0;\n    this.receive = this.receive.bind(this);\n    this.target.addEventListener('message', this.receive, false);\n}\n\nActor.prototype.receive = function(message) {\n    var data = message.data,\n        callback;\n\n    if (data.type === '<response>') {\n        callback = this.callbacks[data.id];\n        delete this.callbacks[data.id];\n        callback(data.error || null, data.data);\n    } else if (typeof data.id !== 'undefined') {\n        var id = data.id;\n        this.parent[data.type](data.data, function(err, data, buffers) {\n            this.postMessage({\n                type: '<response>',\n                id: String(id),\n                error: err ? String(err) : null,\n                data: data\n            }, buffers);\n        }.bind(this));\n    } else {\n        this.parent[data.type](data.data);\n    }\n};\n\nActor.prototype.send = function(type, data, callback, buffers) {\n    var id = null;\n    if (callback) this.callbacks[id = this.callbackID++] = callback;\n    this.postMessage({ type: type, id: String(id), data: data }, buffers);\n};\n\n/**\n * Wrapped postMessage API that abstracts around IE's lack of\n * `transferList` support.\n *\n * @param {Object} message\n * @param {Object} transferList\n * @private\n */\nActor.prototype.postMessage = function(message, transferList) {\n    this.target.postMessage(message, transferList);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/actor.js\n// module id = 1036\n// module chunks = 0 1","module.exports = function() {\n\treturn require(\"!!/srv/opengov/node_modules/worker-loader/createInlineWorker.js\")(\"!function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\\\"a\\\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\\\"\\\",e(e.s=42)}([function(t,e,n){\\\"use strict\\\";var i=n(46),r=n(47);e.easeCubicInOut=function(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,n=e*t;return 4*(t<.5?n:3*(t-e)+n-.75)},e.bezier=function(t,e,n,r){var o=new i(t,e,n,r);return function(t){return o.solve(t)}},e.ease=e.bezier(.25,.1,.25,1),e.clamp=function(t,e,n){return Math.min(n,Math.max(e,t))},e.wrap=function(t,e,n){var i=n-e,r=((t-e)%i+i)%i+e;return r===e?n:r},e.coalesce=function(){for(var t=0;t<arguments.length;t++){var e=arguments[t];if(null!==e&&void 0!==e)return e}},e.asyncAll=function(t,e,n){if(!t.length)return n(null,[]);var i=t.length,r=new Array(t.length),o=null;t.forEach(function(t,a){e(t,function(t,e){t&&(o=t),r[a]=e,0==--i&&n(o,r)})})},e.keysDifference=function(t,e){var n=[];for(var i in t)i in e||n.push(i);return n},e.extend=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)t[i]=n[i]}return t},e.extendAll=function(t,e){for(var n in e)Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n));return t},e.inherit=function(t,n){var i=\\\"function\\\"==typeof t?t.prototype:t,r=Object.create(i);return e.extendAll(r,n),r},e.pick=function(t,e){for(var n={},i=0;i<e.length;i++){var r=e[i];r in t&&(n[r]=t[r])}return n};var o=1;e.uniqueId=function(){return o++},e.debounce=function(t,e){var n,i;return function(){i=arguments,clearTimeout(n),n=setTimeout(function(){t.apply(null,i)},e)}},e.bindAll=function(t,e){t.forEach(function(t){e[t]=e[t].bind(e)})},e.bindHandlers=function(t){for(var e in t)\\\"function\\\"==typeof t[e]&&0===e.indexOf(\\\"_on\\\")&&(t[e]=t[e].bind(t))},e.setOptions=function(t,e){t.hasOwnProperty(\\\"options\\\")||(t.options=t.options?Object.create(t.options):{});for(var n in e)t.options[n]=e[n];return t.options},e.getCoordinatesCenter=function(t){for(var e=1/0,n=1/0,i=-1/0,o=-1/0,a=0;a<t.length;a++)e=Math.min(e,t[a].column),n=Math.min(n,t[a].row),i=Math.max(i,t[a].column),o=Math.max(o,t[a].row);var s=i-e,u=o-n,l=Math.max(s,u);return new r((e+i)/2,(n+o)/2,0).zoomTo(Math.floor(-Math.log(l)/Math.LN2))},e.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)},e.startsWith=function(t,e){return 0===t.indexOf(e)},e.mapObject=function(t,e,n){var i={};for(var r in t)i[r]=e.call(n||this,t[r],r,t);return i},e.filterObject=function(t,e,n){var i={};for(var r in t)e.call(n||this,t[r],r,t)&&(i[r]=t[r]);return i},e.deepEqual=function t(e,n){if(Array.isArray(e)){if(!Array.isArray(n)||e.length!==n.length)return!1;for(var i=0;i<e.length;i++)if(!t(e[i],n[i]))return!1;return!0}if(\\\"object\\\"==typeof e){if(\\\"object\\\"!=typeof n)return!1;if(Object.keys(e).length!==Object.keys(n).length)return!1;for(var r in e)if(!t(e[r],n[r]))return!1;return!0}return e===n},e.clone=function(t){return Array.isArray(t)?t.map(e.clone):\\\"object\\\"==typeof t?e.mapObject(t,e.clone):t},e.arraysIntersect=function(t,e){for(var n=0;n<t.length;n++)if(e.indexOf(t[n])>=0)return!0;return!1};var a={};e.warnOnce=function(t){a[t]||(\\\"undefined\\\"!=typeof console&&console.warn(t),a[t]=!0)}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.message=(t?t+\\\": \\\":\\\"\\\")+r.apply(r,Array.prototype.slice.call(arguments,2)),null!==e&&void 0!==e&&e.__line__&&(this.line=e.__line__)}var r=n(18).format;t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){this.x=t,this.y=e}t.exports=i,i.prototype={clone:function(){return new i(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,n=t.y-this.y;return e*e+n*n},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,n=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=n,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),n=Math.sin(t),i=e*this.x-n*this.y,r=n*this.x+e*this.y;return this.x=i,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},i.convert=function(t){return t instanceof i?t:Array.isArray(t)?new i(t[0],t[1]):t}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number?\\\"number\\\":t instanceof String?\\\"string\\\":t instanceof Boolean?\\\"boolean\\\":Array.isArray(t)?\\\"array\\\":null===t?\\\"null\\\":typeof t}},function(t,e,n){\\\"use strict\\\";function i(t){if(this.zoom=t.zoom,this.overscaling=t.overscaling,this.layer=t.layer,this.childLayers=t.childLayers,this.type=this.layer.type,this.features=[],this.id=this.layer.id,this.index=t.index,this.sourceLayer=this.layer.sourceLayer,this.sourceLayerIndex=t.sourceLayerIndex,this.minZoom=this.layer.minzoom,this.maxZoom=this.layer.maxzoom,this.paintAttributes=o(this),t.arrays){var e=this.childLayers;this.bufferGroups=c.mapObject(t.arrays,function(n,i){return n.map(function(n){var r=c.mapObject(n,function(e,n){return c.mapObject(e,function(e,r){var o=t.arrayTypes[i][n][r],a=o.members.length&&\\\"vertices\\\"===o.members[0].name?l.BufferType.ELEMENT:l.BufferType.VERTEX;return new l(e,o,a)})});r.vaos={},r.layout.element2&&(r.secondVaos={});for(var o=0;o<e.length;o++){var a=e[o].id;r.vaos[a]=new f,r.layout.element2&&(r.secondVaos[a]=new f)}return r})})}}function r(t){return new p({members:[{type:l.ELEMENT_ATTRIBUTE_TYPE,name:\\\"vertices\\\",components:t||3}]})}function o(t){var e={};for(var n in t.programInterfaces){for(var i=e[n]={},r=0;r<t.childLayers.length;r++){i[t.childLayers[r].id]={attributes:[],uniforms:[],defines:[],vertexPragmas:{define:{},initialize:{}},fragmentPragmas:{define:{},initialize:{}}}}var o=t.programInterfaces[n];if(o.paintAttributes)for(var u=0;u<o.paintAttributes.length;u++){var l=o.paintAttributes[u];l.multiplier=l.multiplier||1;for(var p=0;p<t.childLayers.length;p++){var f=t.childLayers[p],d=i[f.id],y=1===l.components?\\\"float\\\":\\\"vec\\\"+l.components,m=l.name;h(\\\"a_\\\"===l.name.slice(0,2));var v,g=l.name.slice(2);d.fragmentPragmas.initialize[g]=\\\"\\\";if(f.isPaintValueFeatureConstant(l.paintProperty))d.uniforms.push(l),d.fragmentPragmas.define[g]=d.vertexPragmas.define[g]=[\\\"uniform\\\",\\\"{precision}\\\",y,m].join(\\\" \\\")+\\\";\\\",d.fragmentPragmas.initialize[g]=d.vertexPragmas.initialize[g]=[\\\"{precision}\\\",y,g,\\\"=\\\",m].join(\\\" \\\")+\\\";\\\\n\\\";else if(f.isPaintValueZoomConstant(l.paintProperty)){d.attributes.push(c.extend({},l,{name:m})),v=[\\\"varying\\\",\\\"{precision}\\\",y,g].join(\\\" \\\")+\\\";\\\\n\\\";var x=[d.fragmentPragmas.define[g],\\\"attribute\\\",\\\"{precision}\\\",y,m].join(\\\" \\\")+\\\";\\\\n\\\";d.fragmentPragmas.define[g]=v,d.vertexPragmas.define[g]=v+x,d.vertexPragmas.initialize[g]=[g,\\\"=\\\",m,\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}else{for(var b=\\\"u_\\\"+m.slice(2)+\\\"_t\\\",w=f.getPaintValueStopZoomLevels(l.paintProperty),k=0;k<w.length&&w[k]<t.zoom;)k++;for(var _=Math.max(0,Math.min(w.length-4,k-2)),S=[],z=0;z<4;z++)S.push(w[Math.min(_+z,w.length-1)]);v=[\\\"varying\\\",\\\"{precision}\\\",y,g].join(\\\" \\\")+\\\";\\\\n\\\",d.vertexPragmas.define[g]=v+[\\\"uniform\\\",\\\"lowp\\\",\\\"float\\\",b].join(\\\" \\\")+\\\";\\\\n\\\",d.fragmentPragmas.define[g]=v,d.uniforms.push(c.extend({},l,{name:b,getValue:s(l,_),components:1}));var T=l.components;if(1===T)d.attributes.push(c.extend({},l,{getValue:a(l,S),isFunction:!0,components:4*T})),d.vertexPragmas.define[g]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"vec4\\\",m].join(\\\" \\\")+\\\";\\\\n\\\",d.vertexPragmas.initialize[g]=[g,\\\"=\\\",\\\"evaluate_zoom_function_1(\\\"+m+\\\", \\\"+b+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\";else{for(var j=[],M=0;M<4;M++)j.push(m+M),d.attributes.push(c.extend({},l,{getValue:a(l,[S[M]]),isFunction:!0,name:m+M})),d.vertexPragmas.define[g]+=[\\\"attribute\\\",\\\"{precision}\\\",y,m+M].join(\\\" \\\")+\\\";\\\\n\\\";d.vertexPragmas.initialize[g]=[g,\\\" = \\\",\\\"evaluate_zoom_function_4(\\\"+j.join(\\\", \\\")+\\\", \\\"+b+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}}}}}return e}function a(t,e){return function(n,i,r){if(1===e.length)return t.getValue(n,c.extend({},i,{zoom:e[0]}),r);for(var o=[],a=0;a<e.length;a++){var s=e[a];o.push(t.getValue(n,c.extend({},i,{zoom:s}),r)[0])}return o}}function s(t,e){return function(n,i){var r=n.getPaintInterpolationT(t.paintProperty,i.zoom);return[Math.max(0,Math.min(4,r-e))]}}var u=n(16),l=n(48),c=n(0),p=n(8),f=n(53),h=n(11);t.exports=i,i.create=function(t){return new({fill:n(54),line:n(58),circle:n(59),symbol:n(60)}[t.layer.type])(t)},i.EXTENT=8192,i.prototype.populateBuffers=function(){this.createArrays(),this.recalculateStyleLayers();for(var t=0;t<this.features.length;t++)this.addFeature(this.features[t]);this.trimArrays()},i.prototype.makeRoomFor=function(t,e){var n=this.arrayGroups[t],i=n.length&&n[n.length-1];if(!i||i.layout.vertex.length+e>65535){var r=this.arrayTypes[t],o=r.layout.vertex,a=r.layout.element,s=r.layout.element2;i={index:n.length,layout:{},paint:{}},i.layout.vertex=new o,a&&(i.layout.element=new a),s&&(i.layout.element2=new s);for(var u=0;u<this.childLayers.length;u++){var l=this.childLayers[u].id,c=r.paint[l];i.paint[l]=new c}n.push(i)}return i},i.prototype.createArrays=function(){this.arrayGroups={},this.arrayTypes={};for(var t in this.programInterfaces){var e=this.programInterfaces[t],n=this.arrayTypes[t]={layout:{},paint:{}};if(this.arrayGroups[t]=[],e.vertexBuffer){var i=new p({members:this.programInterfaces[t].layoutAttributes,alignment:l.VERTEX_ATTRIBUTE_ALIGNMENT});n.layout.vertex=i;var o=this.paintAttributes[t];for(var a in o){var s=new p({members:o[a].attributes,alignment:l.VERTEX_ATTRIBUTE_ALIGNMENT});n.paint[a]=s}}if(e.elementBuffer){var u=r(e.elementBufferComponents);n.layout.element=u}if(e.elementBuffer2){var c=r(e.elementBuffer2Components);n.layout.element2=c}}},i.prototype.destroy=function(t){for(var e in this.bufferGroups)for(var n=this.bufferGroups[e],i=0;i<n.length;i++){var r=n[i];for(var o in r.paint)r.paint[o].destroy(t);for(var a in r.layout)r.layout[a].destroy(t);for(var s in r.vaos)r.vaos[s].destroy(t);for(var u in r.secondVaos)r.secondVaos[u].destroy(t)}},i.prototype.trimArrays=function(){for(var t in this.arrayGroups){var e=this.arrayGroups[t];for(var n in e.paint)e.paint[n].trim();for(var i in e.layout)e.layout[i].trim()}},i.prototype.setUniforms=function(t,e,n,i,r){for(var o=this.paintAttributes[e][i.id].uniforms,a=0;a<o.length;a++){var s=o[a],u=n[s.name];t[\\\"uniform\\\"+s.components+\\\"fv\\\"](u,s.getValue(i,r))}},i.prototype.serialize=function(){return{layerId:this.layer.id,zoom:this.zoom,arrays:c.mapObject(this.arrayGroups,function(t){return t.map(function(t){return c.mapObject(t,function(t){return c.mapObject(t,function(t){return t.serialize()})})})}),arrayTypes:c.mapObject(this.arrayTypes,function(t){return c.mapObject(t,function(t){return c.mapObject(t,function(t){return t.serialize()})})}),childLayerIds:this.childLayers.map(function(t){return t.id})}},i.prototype.createFilter=function(){this.filter||(this.filter=u(this.layer.filter))};var d={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};i.prototype.recalculateStyleLayers=function(){for(var t=0;t<this.childLayers.length;t++)this.childLayers[t].recalculate(this.zoom,d)},i.prototype.populatePaintArrays=function(t,e,n,i,r){for(var o=0;o<this.childLayers.length;o++)for(var a=this.childLayers[o],s=this.arrayGroups[t],u=i.index;u<s.length;u++){var l=s[u],c=l.layout.vertex.length,p=l.paint[a.id];p.resize(c);for(var f=this.paintAttributes[t][a.id].attributes,h=0;h<f.length;h++)for(var d=f[h],y=d.getValue(a,e,n),m=d.multiplier||1,v=d.components||1,g=r;g<c;g++)for(var x=p.get(g),b=0;b<v;b++){var w=v>1?d.name+b:d.name;x[w]=y[b]*m}}}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.set(t,e)}function r(t){return t.value}var o=n(0),a=n(77),s=n(78),u=n(80),l=n(83),c=n(28),p=n(90);t.exports=i;i.create=function(t,e){return new({background:n(91),circle:n(92),fill:n(93),line:n(94),raster:n(95),symbol:n(96)}[(e||t).type])(t,e)},i.prototype=o.inherit(p,{set:function(t,e){this.id=t.id,this.ref=t.ref,this.metadata=t.metadata,this.type=(e||t).type,this.source=(e||t).source,this.sourceLayer=(e||t)[\\\"source-layer\\\"],this.minzoom=(e||t).minzoom,this.maxzoom=(e||t).maxzoom,this.filter=(e||t).filter,this.paint={},this.layout={},this._paintSpecifications=u[\\\"paint_\\\"+this.type],this._layoutSpecifications=u[\\\"layout_\\\"+this.type],this._paintTransitions={},this._paintTransitionOptions={},this._paintDeclarations={},this._layoutDeclarations={},this._layoutFunctions={};var n,i;for(var r in t){var o=r.match(/^paint(?:\\\\.(.*))?$/);if(o){var a=o[1]||\\\"\\\";for(n in t[r])this.setPaintProperty(n,t[r][n],a)}}if(this.ref)this._layoutDeclarations=e._layoutDeclarations;else for(i in t.layout)this.setLayoutProperty(i,t.layout[i]);for(n in this._paintSpecifications)this.paint[n]=this.getPaintValue(n);for(i in this._layoutSpecifications)this._updateLayoutValue(i)},setLayoutProperty:function(t,e){if(null==e)delete this._layoutDeclarations[t];else{var n=\\\"layers.\\\"+this.id+\\\".layout.\\\"+t;if(this._handleErrors(l.layoutProperty,n,t,e))return;this._layoutDeclarations[t]=new s(this._layoutSpecifications[t],e)}this._updateLayoutValue(t)},getLayoutProperty:function(t){return this._layoutDeclarations[t]&&this._layoutDeclarations[t].value},getLayoutValue:function(t,e,n){var i=this._layoutSpecifications[t],r=this._layoutDeclarations[t];return r?r.calculate(e,n):i.default},setPaintProperty:function(t,e,n){var i=\\\"layers.\\\"+this.id+(n?'[\\\"paint.'+n+'\\\"].':\\\".paint.\\\")+t;if(o.endsWith(t,\\\"-transition\\\"))if(this._paintTransitionOptions[n||\\\"\\\"]||(this._paintTransitionOptions[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintTransitionOptions[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,i,t,e))return;this._paintTransitionOptions[n||\\\"\\\"][t]=e}else if(this._paintDeclarations[n||\\\"\\\"]||(this._paintDeclarations[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintDeclarations[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,i,t,e))return;this._paintDeclarations[n||\\\"\\\"][t]=new s(this._paintSpecifications[t],e)}},getPaintProperty:function(t,e){return e=e||\\\"\\\",o.endsWith(t,\\\"-transition\\\")?this._paintTransitionOptions[e]&&this._paintTransitionOptions[e][t]:this._paintDeclarations[e]&&this._paintDeclarations[e][t]&&this._paintDeclarations[e][t].value},getPaintValue:function(t,e,n){var i=this._paintSpecifications[t],r=this._paintTransitions[t];return r?r.calculate(e,n):\\\"color\\\"===i.type&&i.default?c(i.default):i.default},getPaintValueStopZoomLevels:function(t){var e=this._paintTransitions[t];return e?e.declaration.stopZoomLevels:[]},getPaintInterpolationT:function(t,e){return this._paintTransitions[t].declaration.calculateInterpolationT({zoom:e})},isPaintValueFeatureConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isFeatureConstant},isPaintValueZoomConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isZoomConstant},isHidden:function(t){return!!(this.minzoom&&t<this.minzoom)||(!!(this.maxzoom&&t>=this.maxzoom)||(\\\"none\\\"===this.layout.visibility||0===this.paint[this.type+\\\"-opacity\\\"]))},updatePaintTransitions:function(t,e,n,i){for(var r=o.extend({},this._paintDeclarations[\\\"\\\"]),a=0;a<t.length;a++)o.extend(r,this._paintDeclarations[t[a]]);var s;for(s in r)this._applyPaintDeclaration(s,r[s],e,n,i);for(s in this._paintTransitions)s in r||this._applyPaintDeclaration(s,null,e,n,i)},updatePaintTransition:function(t,e,n,i,r){for(var o=this._paintDeclarations[\\\"\\\"][t],a=0;a<e.length;a++){var s=this._paintDeclarations[e[a]];s&&s[t]&&(o=s[t])}this._applyPaintDeclaration(t,o,n,i,r)},recalculate:function(t,e){for(var n in this._paintTransitions)this.paint[n]=this.getPaintValue(n,{zoom:t,zoomHistory:e});for(var i in this._layoutFunctions)this.layout[i]=this.getLayoutValue(i,{zoom:t,zoomHistory:e})},serialize:function(t){var e={id:this.id,ref:this.ref,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom};for(var n in this._paintDeclarations){e[\\\"\\\"===n?\\\"paint\\\":\\\"paint.\\\"+n]=o.mapObject(this._paintDeclarations[n],r)}return(!this.ref||t&&t.includeRefProperties)&&o.extend(e,{type:this.type,source:this.source,\\\"source-layer\\\":this.sourceLayer,filter:this.filter,layout:o.mapObject(this._layoutDeclarations,r)}),o.filterObject(e,function(t,e){return void 0!==t&&!(\\\"layout\\\"===e&&!Object.keys(t).length)})},_applyPaintDeclaration:function(t,e,n,i,r){var u=n.transition?this._paintTransitions[t]:void 0,l=this._paintSpecifications[t];if(null!==e&&void 0!==e||(e=new s(l,l.default)),!u||u.declaration.json!==e.json){var c=o.extend({duration:300,delay:0},i,this.getPaintProperty(t+\\\"-transition\\\")),p=this._paintTransitions[t]=new a(l,e,u,c);p.instant()||(p.loopID=r.set(p.endTime-Date.now())),u&&r.cancel(u.loopID)}},_updateLayoutValue:function(t){var e=this._layoutDeclarations[t];e&&e.isFunction?this._layoutFunctions[t]=!0:(delete this._layoutFunctions[t],this.layout[t]=this.getLayoutValue(t))},_handleErrors:function(t,e,n,i){return l.emitErrors(this,t.call(l,{key:e,layerType:this.type,objectKey:n,value:i,styleSpec:u,style:{glyphs:!0,sprite:!0}}))}})},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(31);t.exports=function(t){var e=n(32),a=n(9),s={\\\"*\\\":function(){return[]},array:n(33),boolean:n(85),number:n(34),color:n(86),constants:n(30),enum:n(14),filter:n(15),function:n(32),layer:n(35),object:n(9),source:n(38),light:n(39),string:n(40)},u=t.value,l=t.valueSpec,c=t.key,p=t.styleSpec,f=t.style;if(\\\"string\\\"===r(u)&&\\\"@\\\"===u[0]){if(p.$version>7)return[new i(c,u,\\\"constants have been deprecated as of v8\\\")];if(!(u in f.constants))return[new i(c,u,'constant \\\"%s\\\" not found',u)];t=o({},t,{value:f.constants[u]})}return l.function&&\\\"object\\\"===r(u)?e(t):l.type&&s[l.type]?s[l.type](t):a(o({},t,{valueSpec:l.type?p[l.type]:l}))}},function(t,e,n){\\\"use strict\\\";var i=n(0),r=n(4).EXTENT,o=-2*r,a=2*r-1;t.exports=function(t){for(var e=r/t.extent,n=t.loadGeometry(),s=0;s<n.length;s++)for(var u=n[s],l=0;l<u.length;l++){var c=u[l];c.x=Math.round(c.x*e),c.y=Math.round(c.y*e),(c.x<o||c.x>a||c.y<o||c.y>a)&&i.warnOnce(\\\"Geometry exceeds allowed extent, reduce your vector tile buffer size\\\")}return n}},function(t,e,n){\\\"use strict\\\";function i(t){function e(){f.apply(this,arguments)}function n(){h.apply(this,arguments),this.members=e.prototype.members}var i=JSON.stringify(t);if(m[i])return m[i];void 0===t.alignment&&(t.alignment=1),e.prototype=Object.create(f.prototype);var s=0,l=0,v=[\\\"Uint8\\\"];return e.prototype.members=t.members.map(function(n){n={name:n.name,type:n.type,components:n.components||1},d(n.name.length),d(n.type in y),v.indexOf(n.type)<0&&v.push(n.type);var i=a(n.type);l=Math.max(l,i),n.offset=s=o(s,Math.max(t.alignment,i));for(var r=0;r<n.components;r++)Object.defineProperty(e.prototype,n.name+(1===n.components?\\\"\\\":r),{get:c(n,r),set:p(n,r)});return s+=i*n.components,n}),e.prototype.alignment=t.alignment,e.prototype.size=o(s,Math.max(l,t.alignment)),n.serialize=r,n.prototype=Object.create(h.prototype),n.prototype.StructType=e,n.prototype.bytesPerElement=e.prototype.size,n.prototype.emplaceBack=u(e.prototype.members,e.prototype.size),n.prototype._usedTypes=v,m[i]=n,n}function r(){return{members:this.prototype.StructType.prototype.members,alignment:this.prototype.StructType.prototype.alignment,bytesPerElement:this.prototype.bytesPerElement}}function o(t,e){return Math.ceil(t/e)*e}function a(t){return y[t].BYTES_PER_ELEMENT}function s(t){return t.toLowerCase()}function u(t,e){for(var n=[],i=[],r=\\\"var i = this.length;\\\\nthis.resize(this.length + 1);\\\\n\\\",o=0;o<t.length;o++){var u=t[o],l=a(u.type);n.indexOf(l)<0&&(n.push(l),r+=\\\"var o\\\"+l.toFixed(0)+\\\" = i * \\\"+(e/l).toFixed(0)+\\\";\\\\n\\\");for(var c=0;c<u.components;c++){var p=\\\"v\\\"+i.length,f=\\\"o\\\"+l.toFixed(0)+\\\" + \\\"+(u.offset/l+c).toFixed(0);r+=\\\"this.\\\"+s(u.type)+\\\"[\\\"+f+\\\"] = \\\"+p+\\\";\\\\n\\\",i.push(p)}}return r+=\\\"return i;\\\",new Function(i,r)}function l(t,e){var n=\\\"this._pos\\\"+a(t.type).toFixed(0),i=(t.offset/a(t.type)+e).toFixed(0),r=n+\\\" + \\\"+i;return\\\"this._structArray.\\\"+s(t.type)+\\\"[\\\"+r+\\\"]\\\"}function c(t,e){return new Function([],\\\"return \\\"+l(t,e)+\\\";\\\")}function p(t,e){return new Function([\\\"x\\\"],l(t,e)+\\\" = x;\\\")}function f(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8}function h(t){void 0!==t?(this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.capacity=this.arrayBuffer.byteLength/this.bytesPerElement,this._refreshViews()):(this.capacity=-1,this.resize(0))}var d=n(11);t.exports=i;var y={Int8:Int8Array,Uint8:Uint8Array,Uint8Clamped:Uint8ClampedArray,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array,Float64:Float64Array},m={};h.prototype.DEFAULT_CAPACITY=128,h.prototype.RESIZE_MULTIPLIER=5,h.prototype.serialize=function(){return this.trim(),{length:this.length,arrayBuffer:this.arrayBuffer}},h.prototype.get=function(t){return new this.StructType(this,t)},h.prototype.trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},h.prototype.resize=function(t){if(this.length=t,t>this.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*this.RESIZE_MULTIPLIER),this.DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},h.prototype._refreshViews=function(){for(var t=0;t<this._usedTypes.length;t++){var e=this._usedTypes[t];this[s(e)]=new y[e](this.arrayBuffer)}},h.prototype.toArray=function(t,e){for(var n=[],i=t;i<e;i++){var r=this.get(i);n.push(r)}return n}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6);t.exports=function(t){var e=t.key,n=t.value,a=t.valueSpec||{},s=t.objectElementValidators||{},u=t.style,l=t.styleSpec,c=[],p=r(n);if(\\\"object\\\"!==p)return[new i(e,n,\\\"object expected, %s found\\\",p)];for(var f in n){var h,d=f.split(\\\".\\\")[0],y=a[d]||a[\\\"*\\\"];if(s[d])h=s[d];else if(a[d])h=o;else if(s[\\\"*\\\"])h=s[\\\"*\\\"];else{if(!a[\\\"*\\\"]){c.push(new i(e,n[f],'unknown property \\\"%s\\\"',f));continue}h=o}c=c.concat(h({key:(e?e+\\\".\\\":e)+f,value:n[f],valueSpec:y,style:u,styleSpec:l,object:n,objectKey:f}))}for(d in a)a[d].required&&void 0===a[d].default&&void 0===n[d]&&c.push(new i(e,n,'missing required property \\\"%s\\\"',d));return c}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}},function(t,e,n){\\\"use strict\\\";(function(e){function i(t,e){if(t===e)return 0;for(var n=t.length,i=e.length,r=0,o=Math.min(n,i);r<o;++r)if(t[r]!==e[r]){n=t[r],i=e[r];break}return n<i?-1:i<n?1:0}function r(t){return e.Buffer&&\\\"function\\\"==typeof e.Buffer.isBuffer?e.Buffer.isBuffer(t):!(null==t||!t._isBuffer)}function o(t){return Object.prototype.toString.call(t)}function a(t){return!r(t)&&(\\\"function\\\"==typeof e.ArrayBuffer&&(\\\"function\\\"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):!!t&&(t instanceof DataView||!!(t.buffer&&t.buffer instanceof ArrayBuffer))))}function s(t){if(k.isFunction(t)){if(z)return t.name;var e=t.toString(),n=e.match(j);return n&&n[1]}}function u(t,e){return\\\"string\\\"==typeof t?t.length<e?t:t.slice(0,e):t}function l(t){if(z||!k.isFunction(t))return k.inspect(t);var e=s(t);return\\\"[Function\\\"+(e?\\\": \\\"+e:\\\"\\\")+\\\"]\\\"}function c(t){return u(l(t.actual),128)+\\\" \\\"+t.operator+\\\" \\\"+u(l(t.expected),128)}function p(t,e,n,i,r){throw new T.AssertionError({message:n,actual:t,expected:e,operator:i,stackStartFunction:r})}function f(t,e){t||p(t,!0,e,\\\"==\\\",T.ok)}function h(t,e,n,s){if(t===e)return!0;if(r(t)&&r(e))return 0===i(t,e);if(k.isDate(t)&&k.isDate(e))return t.getTime()===e.getTime();if(k.isRegExp(t)&&k.isRegExp(e))return t.source===e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&\\\"object\\\"==typeof t||null!==e&&\\\"object\\\"==typeof e){if(a(t)&&a(e)&&o(t)===o(e)&&!(t instanceof Float32Array||t instanceof Float64Array))return 0===i(new Uint8Array(t.buffer),new Uint8Array(e.buffer));if(r(t)!==r(e))return!1;s=s||{actual:[],expected:[]};var u=s.actual.indexOf(t);return-1!==u&&u===s.expected.indexOf(e)||(s.actual.push(t),s.expected.push(e),y(t,e,n,s))}return n?t===e:t==e}function d(t){return\\\"[object Arguments]\\\"==Object.prototype.toString.call(t)}function y(t,e,n,i){if(null===t||void 0===t||null===e||void 0===e)return!1;if(k.isPrimitive(t)||k.isPrimitive(e))return t===e;if(n&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var r=d(t),o=d(e);if(r&&!o||!r&&o)return!1;if(r)return t=S.call(t),e=S.call(e),h(t,e,n);var a,s,u=M(t),l=M(e);if(u.length!==l.length)return!1;for(u.sort(),l.sort(),s=u.length-1;s>=0;s--)if(u[s]!==l[s])return!1;for(s=u.length-1;s>=0;s--)if(a=u[s],!h(t[a],e[a],n,i))return!1;return!0}function m(t,e,n){h(t,e,!0)&&p(t,e,n,\\\"notDeepStrictEqual\\\",m)}function v(t,e){if(!t||!e)return!1;if(\\\"[object RegExp]\\\"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function g(t){var e;try{t()}catch(t){e=t}return e}function x(t,e,n,i){var r;if(\\\"function\\\"!=typeof e)throw new TypeError('\\\"block\\\" argument must be a function');\\\"string\\\"==typeof n&&(i=n,n=null),r=g(e),i=(n&&n.name?\\\" (\\\"+n.name+\\\").\\\":\\\".\\\")+(i?\\\" \\\"+i:\\\".\\\"),t&&!r&&p(r,n,\\\"Missing expected exception\\\"+i);var o=\\\"string\\\"==typeof i,a=!t&&k.isError(r),s=!t&&r&&!n;if((a&&o&&v(r,n)||s)&&p(r,n,\\\"Got unwanted exception\\\"+i),t&&r&&n&&!v(r,n)||!t&&r)throw r}function b(t,e){t||p(t,!0,e,\\\"==\\\",b)}var w=n(49),k=n(18),_=Object.prototype.hasOwnProperty,S=Array.prototype.slice,z=function(){return\\\"foo\\\"===function(){}.name}(),T=t.exports=f,j=/\\\\s*function\\\\s+([^\\\\(\\\\s]*)\\\\s*/;T.AssertionError=function(t){this.name=\\\"AssertionError\\\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=c(this),this.generatedMessage=!0);var e=t.stackStartFunction||p;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var n=new Error;if(n.stack){var i=n.stack,r=s(e),o=i.indexOf(\\\"\\\\n\\\"+r);if(o>=0){var a=i.indexOf(\\\"\\\\n\\\",o+1);i=i.substring(a+1)}this.stack=i}}},k.inherits(T.AssertionError,Error),T.fail=p,T.ok=f,T.equal=function(t,e,n){t!=e&&p(t,e,n,\\\"==\\\",T.equal)},T.notEqual=function(t,e,n){t==e&&p(t,e,n,\\\"!=\\\",T.notEqual)},T.deepEqual=function(t,e,n){h(t,e,!1)||p(t,e,n,\\\"deepEqual\\\",T.deepEqual)},T.deepStrictEqual=function(t,e,n){h(t,e,!0)||p(t,e,n,\\\"deepStrictEqual\\\",T.deepStrictEqual)},T.notDeepEqual=function(t,e,n){h(t,e,!1)&&p(t,e,n,\\\"notDeepEqual\\\",T.notDeepEqual)},T.notDeepStrictEqual=m,T.strictEqual=function(t,e,n){t!==e&&p(t,e,n,\\\"===\\\",T.strictEqual)},T.notStrictEqual=function(t,e,n){t===e&&p(t,e,n,\\\"!==\\\",T.notStrictEqual)},T.throws=function(t,e,n){x(!0,t,e,n)},T.doesNotThrow=function(t,e,n){x(!1,t,e,n)},T.ifError=function(t){if(t)throw t},T.strict=w(b,T,{equal:T.strictEqual,deepEqual:T.deepStrictEqual,notEqual:T.notStrictEqual,notDeepEqual:T.notDeepStrictEqual}),T.strict.strict=T.strict;var M=Object.keys||function(t){var e=[];for(var n in t)_.call(t,n)&&e.push(n);return e}}).call(e,n(17))},function(t,e,n){t.exports.VectorTile=n(68),t.exports.VectorTileFeature=n(26),t.exports.VectorTileLayer=n(25)},function(t,e,n){\\\"use strict\\\";(function(e){function i(t){this.buf=m.isBuffer(t)?t:new m(t||0),this.pos=0,this.length=this.buf.length}function r(t,e){var n,i=e.buf;if(n=i[e.pos++],t+=268435456*(127&n),n<128)return t;if(n=i[e.pos++],t+=34359738368*(127&n),n<128)return t;if(n=i[e.pos++],t+=4398046511104*(127&n),n<128)return t;if(n=i[e.pos++],t+=562949953421312*(127&n),n<128)return t;if(n=i[e.pos++],t+=72057594037927940*(127&n),n<128)return t;if(n=i[e.pos++],t+=0x8000000000000000*(127&n),n<128)return t;throw new Error(\\\"Expected varint not more than 10 bytes\\\")}function o(t,e){e.realloc(10);for(var n=e.pos+10;t>=1;){if(e.pos>=n)throw new Error(\\\"Given varint doesn't fit into 10 bytes\\\");var i=255&t;e.buf[e.pos++]=i|(t>=128?128:0),t/=128}}function a(t,e,n){var i=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.ceil(Math.log(e)/(7*Math.LN2));n.realloc(i);for(var r=n.pos-1;r>=t;r--)n.buf[r+i]=n.buf[r]}function s(t,e){for(var n=0;n<t.length;n++)e.writeVarint(t[n])}function u(t,e){for(var n=0;n<t.length;n++)e.writeSVarint(t[n])}function l(t,e){for(var n=0;n<t.length;n++)e.writeFloat(t[n])}function c(t,e){for(var n=0;n<t.length;n++)e.writeDouble(t[n])}function p(t,e){for(var n=0;n<t.length;n++)e.writeBoolean(t[n])}function f(t,e){for(var n=0;n<t.length;n++)e.writeFixed32(t[n])}function h(t,e){for(var n=0;n<t.length;n++)e.writeSFixed32(t[n])}function d(t,e){for(var n=0;n<t.length;n++)e.writeFixed64(t[n])}function y(t,e){for(var n=0;n<t.length;n++)e.writeSFixed64(t[n])}t.exports=i;var m=e.Buffer||n(69);i.Varint=0,i.Fixed64=1,i.Bytes=2,i.Fixed32=5;var v=Math.pow(2,63);i.prototype={destroy:function(){this.buf=null},readFields:function(t,e,n){for(n=n||this.length;this.pos<n;){var i=this.readVarint(),r=i>>3,o=this.pos;t(r,e,this),this.pos===o&&this.skip(i)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readUInt32LE(this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readInt32LE(this.pos+4);return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,e,n=this.buf;return e=n[this.pos++],t=127&e,e<128?t:(e=n[this.pos++],t|=(127&e)<<7,e<128?t:(e=n[this.pos++],t|=(127&e)<<14,e<128?t:(e=n[this.pos++],t|=(127&e)<<21,e<128?t:r(t,this))))},readVarint64:function(){var t=this.pos,e=this.readVarint();if(e<v)return e;for(var n=this.pos-2;255===this.buf[n];)n--;n<t&&(n=t),e=0;for(var i=0;i<n-t+1;i++){var r=127&~this.buf[t+i];e+=i<4?r<<7*i:r*Math.pow(2,7*i)}return-e-1},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.buf.toString(\\\"utf8\\\",this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.slice(this.pos,t);return this.pos=t,e},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readVarint());return e},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(t){var e=7&t;if(e===i.Varint)for(;this.buf[this.pos++]>127;);else if(e===i.Bytes)this.pos=this.readVarint()+this.pos;else if(e===i.Fixed32)this.pos+=4;else{if(e!==i.Fixed64)throw new Error(\\\"Unimplemented type: \\\"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var n=new m(e);this.buf.copy(n),this.buf=n,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(t){if((t=+t)>268435455)return void o(t,this);this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var e=m.byteLength(t);this.writeVarint(e),this.realloc(e),this.buf.write(t,this.pos),this.pos+=e},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var n=0;n<e;n++)this.buf[this.pos++]=t[n]},writeRawMessage:function(t,e){this.pos++;var n=this.pos;t(e,this);var i=this.pos-n;i>=128&&a(n,i,this),this.pos=n-1,this.writeVarint(i),this.pos+=i},writeMessage:function(t,e,n){this.writeTag(t,i.Bytes),this.writeRawMessage(e,n)},writePackedVarint:function(t,e){this.writeMessage(t,s,e)},writePackedSVarint:function(t,e){this.writeMessage(t,u,e)},writePackedBoolean:function(t,e){this.writeMessage(t,p,e)},writePackedFloat:function(t,e){this.writeMessage(t,l,e)},writePackedDouble:function(t,e){this.writeMessage(t,c,e)},writePackedFixed32:function(t,e){this.writeMessage(t,f,e)},writePackedSFixed32:function(t,e){this.writeMessage(t,h,e)},writePackedFixed64:function(t,e){this.writeMessage(t,d,e)},writePackedSFixed64:function(t,e){this.writeMessage(t,y,e)},writeBytesField:function(t,e){this.writeTag(t,i.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,i.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,i.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,i.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,i.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,i.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,i.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,i.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,i.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,i.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}}}).call(e,n(17))},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=[];return Array.isArray(o.values)?-1===o.values.indexOf(r(n))&&a.push(new i(e,n,\\\"expected one of [%s], %s found\\\",o.values.join(\\\", \\\"),n)):-1===Object.keys(o.values).indexOf(r(n))&&a.push(new i(e,n,\\\"expected one of [%s], %s found\\\",Object.keys(o.values).join(\\\", \\\"),n)),a}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(14),o=n(3),a=n(10);t.exports=function t(e){var n,s=e.value,u=e.key,l=e.styleSpec,c=[];if(\\\"array\\\"!==o(s))return[new i(u,s,\\\"array expected, %s found\\\",o(s))];if(s.length<1)return[new i(u,s,\\\"filter array must have at least 1 element\\\")];switch(c=c.concat(r({key:u+\\\"[0]\\\",value:s[0],valueSpec:l.filter_operator,style:e.style,styleSpec:e.styleSpec})),a(s[0])){case\\\"<\\\":case\\\"<=\\\":case\\\">\\\":case\\\">=\\\":s.length>=2&&\\\"$type\\\"==s[1]&&c.push(new i(u,s,'\\\"$type\\\" cannot be use with operator \\\"%s\\\"',s[0]));case\\\"==\\\":case\\\"!=\\\":3!=s.length&&c.push(new i(u,s,'filter array for operator \\\"%s\\\" must have 3 elements',s[0]));case\\\"in\\\":case\\\"!in\\\":s.length>=2&&(n=o(s[1]),\\\"string\\\"!==n?c.push(new i(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new i(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\")));for(var p=2;p<s.length;p++)n=o(s[p]),\\\"$type\\\"==s[1]?c=c.concat(r({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],valueSpec:l.geometry_type,style:e.style,styleSpec:e.styleSpec})):\\\"string\\\"===n&&\\\"@\\\"===s[p][0]?c.push(new i(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"filter value cannot be a constant\\\")):\\\"string\\\"!==n&&\\\"number\\\"!==n&&\\\"boolean\\\"!==n&&c.push(new i(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"string, number, or boolean expected, %s found\\\",n));break;case\\\"any\\\":case\\\"all\\\":case\\\"none\\\":for(p=1;p<s.length;p++)c=c.concat(t({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],style:e.style,styleSpec:e.styleSpec}));break;case\\\"has\\\":case\\\"!has\\\":n=o(s[1]),2!==s.length?c.push(new i(u,s,'filter array for \\\"%s\\\" operator must have 2 elements',s[0])):\\\"string\\\"!==n?c.push(new i(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new i(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\"))}return c}},function(t,e,n){\\\"use strict\\\";function i(t){return new Function(\\\"f\\\",\\\"var p = (f && f.properties || {}); return \\\"+r(t))}function r(t){if(!t)return\\\"true\\\";var e=t[0];return t.length<=1?\\\"any\\\"===e?\\\"false\\\":\\\"true\\\":\\\"(\\\"+(\\\"==\\\"===e?a(t[1],t[2],\\\"===\\\",!1):\\\"!=\\\"===e?a(t[1],t[2],\\\"!==\\\",!1):\\\"<\\\"===e||\\\">\\\"===e||\\\"<=\\\"===e||\\\">=\\\"===e?a(t[1],t[2],e,!0):\\\"any\\\"===e?s(t.slice(1),\\\"||\\\"):\\\"all\\\"===e?s(t.slice(1),\\\"&&\\\"):\\\"none\\\"===e?c(s(t.slice(1),\\\"||\\\")):\\\"in\\\"===e?u(t[1],t.slice(2)):\\\"!in\\\"===e?c(u(t[1],t.slice(2))):\\\"has\\\"===e?l(t[1]):\\\"!has\\\"===e?c(l([t[1]])):\\\"true\\\")+\\\")\\\"}function o(t){return\\\"$type\\\"===t?\\\"f.type\\\":\\\"$id\\\"===t?\\\"f.id\\\":\\\"p[\\\"+JSON.stringify(t)+\\\"]\\\"}function a(t,e,n,i){var r=o(t),a=\\\"$type\\\"===t?f.indexOf(e):JSON.stringify(e);return(i?\\\"typeof \\\"+r+\\\"=== typeof \\\"+a+\\\"&&\\\":\\\"\\\")+r+n+a}function s(t,e){return t.map(r).join(e)}function u(t,e){\\\"$type\\\"===t&&(e=e.map(function(t){return f.indexOf(t)}));var n=JSON.stringify(e.sort(p)),i=o(t);return e.length<=200?n+\\\".indexOf(\\\"+i+\\\") !== -1\\\":\\\"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1;    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }(\\\"+i+\\\", \\\"+n+\\\",0,\\\"+(e.length-1)+\\\")\\\"}function l(t){return JSON.stringify(t)+\\\" in p\\\"}function c(t){return\\\"!(\\\"+t+\\\")\\\"}function p(t,e){return t<e?-1:t>e?1:0}t.exports=i;var f=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},function(t,e){var n;n=function(){return this}();try{n=n||Function(\\\"return this\\\")()||(0,eval)(\\\"this\\\")}catch(t){\\\"object\\\"==typeof window&&(n=window)}t.exports=n},function(t,e,n){(function(t){function i(t,n){var i={seen:[],stylize:o};return arguments.length>=3&&(i.depth=arguments[2]),arguments.length>=4&&(i.colors=arguments[3]),d(n)?i.showHidden=n:n&&e._extend(i,n),b(i.showHidden)&&(i.showHidden=!1),b(i.depth)&&(i.depth=2),b(i.colors)&&(i.colors=!1),b(i.customInspect)&&(i.customInspect=!0),i.colors&&(i.stylize=r),s(i,t,i.depth)}function r(t,e){var n=i.styles[e];return n?\\\"\\u001b[\\\"+i.colors[n][0]+\\\"m\\\"+t+\\\"\\u001b[\\\"+i.colors[n][1]+\\\"m\\\":t}function o(t,e){return t}function a(t){var e={};return t.forEach(function(t,n){e[t]=!0}),e}function s(t,n,i){if(t.customInspect&&n&&z(n.inspect)&&n.inspect!==e.inspect&&(!n.constructor||n.constructor.prototype!==n)){var r=n.inspect(i,t);return g(r)||(r=s(t,r,i)),r}var o=u(t,n);if(o)return o;var d=Object.keys(n),y=a(d);if(t.showHidden&&(d=Object.getOwnPropertyNames(n)),S(n)&&(d.indexOf(\\\"message\\\")>=0||d.indexOf(\\\"description\\\")>=0))return l(n);if(0===d.length){if(z(n)){var m=n.name?\\\": \\\"+n.name:\\\"\\\";return t.stylize(\\\"[Function\\\"+m+\\\"]\\\",\\\"special\\\")}if(w(n))return t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\");if(_(n))return t.stylize(Date.prototype.toString.call(n),\\\"date\\\");if(S(n))return l(n)}var v=\\\"\\\",x=!1,b=[\\\"{\\\",\\\"}\\\"];if(h(n)&&(x=!0,b=[\\\"[\\\",\\\"]\\\"]),z(n)){v=\\\" [Function\\\"+(n.name?\\\": \\\"+n.name:\\\"\\\")+\\\"]\\\"}if(w(n)&&(v=\\\" \\\"+RegExp.prototype.toString.call(n)),_(n)&&(v=\\\" \\\"+Date.prototype.toUTCString.call(n)),S(n)&&(v=\\\" \\\"+l(n)),0===d.length&&(!x||0==n.length))return b[0]+v+b[1];if(i<0)return w(n)?t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\"):t.stylize(\\\"[Object]\\\",\\\"special\\\");t.seen.push(n);var k;return k=x?c(t,n,i,y,d):d.map(function(e){return p(t,n,i,y,e,x)}),t.seen.pop(),f(k,v,b)}function u(t,e){if(b(e))return t.stylize(\\\"undefined\\\",\\\"undefined\\\");if(g(e)){var n=\\\"'\\\"+JSON.stringify(e).replace(/^\\\"|\\\"$/g,\\\"\\\").replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"')+\\\"'\\\";return t.stylize(n,\\\"string\\\")}return v(e)?t.stylize(\\\"\\\"+e,\\\"number\\\"):d(e)?t.stylize(\\\"\\\"+e,\\\"boolean\\\"):y(e)?t.stylize(\\\"null\\\",\\\"null\\\"):void 0}function l(t){return\\\"[\\\"+Error.prototype.toString.call(t)+\\\"]\\\"}function c(t,e,n,i,r){for(var o=[],a=0,s=e.length;a<s;++a)P(e,String(a))?o.push(p(t,e,n,i,String(a),!0)):o.push(\\\"\\\");return r.forEach(function(r){r.match(/^\\\\d+$/)||o.push(p(t,e,n,i,r,!0))}),o}function p(t,e,n,i,r,o){var a,u,l;if(l=Object.getOwnPropertyDescriptor(e,r)||{value:e[r]},l.get?u=l.set?t.stylize(\\\"[Getter/Setter]\\\",\\\"special\\\"):t.stylize(\\\"[Getter]\\\",\\\"special\\\"):l.set&&(u=t.stylize(\\\"[Setter]\\\",\\\"special\\\")),P(i,r)||(a=\\\"[\\\"+r+\\\"]\\\"),u||(t.seen.indexOf(l.value)<0?(u=y(n)?s(t,l.value,null):s(t,l.value,n-1),u.indexOf(\\\"\\\\n\\\")>-1&&(u=o?u.split(\\\"\\\\n\\\").map(function(t){return\\\"  \\\"+t}).join(\\\"\\\\n\\\").substr(2):\\\"\\\\n\\\"+u.split(\\\"\\\\n\\\").map(function(t){return\\\"   \\\"+t}).join(\\\"\\\\n\\\"))):u=t.stylize(\\\"[Circular]\\\",\\\"special\\\")),b(a)){if(o&&r.match(/^\\\\d+$/))return u;a=JSON.stringify(\\\"\\\"+r),a.match(/^\\\"([a-zA-Z_][a-zA-Z_0-9]*)\\\"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,\\\"name\\\")):(a=a.replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"').replace(/(^\\\"|\\\"$)/g,\\\"'\\\"),a=t.stylize(a,\\\"string\\\"))}return a+\\\": \\\"+u}function f(t,e,n){var i=0;return t.reduce(function(t,e){return i++,e.indexOf(\\\"\\\\n\\\")>=0&&i++,t+e.replace(/\\\\u001b\\\\[\\\\d\\\\d?m/g,\\\"\\\").length+1},0)>60?n[0]+(\\\"\\\"===e?\\\"\\\":e+\\\"\\\\n \\\")+\\\" \\\"+t.join(\\\",\\\\n  \\\")+\\\" \\\"+n[1]:n[0]+e+\\\" \\\"+t.join(\\\", \\\")+\\\" \\\"+n[1]}function h(t){return Array.isArray(t)}function d(t){return\\\"boolean\\\"==typeof t}function y(t){return null===t}function m(t){return null==t}function v(t){return\\\"number\\\"==typeof t}function g(t){return\\\"string\\\"==typeof t}function x(t){return\\\"symbol\\\"==typeof t}function b(t){return void 0===t}function w(t){return k(t)&&\\\"[object RegExp]\\\"===j(t)}function k(t){return\\\"object\\\"==typeof t&&null!==t}function _(t){return k(t)&&\\\"[object Date]\\\"===j(t)}function S(t){return k(t)&&(\\\"[object Error]\\\"===j(t)||t instanceof Error)}function z(t){return\\\"function\\\"==typeof t}function T(t){return null===t||\\\"boolean\\\"==typeof t||\\\"number\\\"==typeof t||\\\"string\\\"==typeof t||\\\"symbol\\\"==typeof t||void 0===t}function j(t){return Object.prototype.toString.call(t)}function M(t){return t<10?\\\"0\\\"+t.toString(10):t.toString(10)}function I(){var t=new Date,e=[M(t.getHours()),M(t.getMinutes()),M(t.getSeconds())].join(\\\":\\\");return[t.getDate(),O[t.getMonth()],e].join(\\\" \\\")}function P(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function E(t,e){if(!t){var n=new Error(\\\"Promise was rejected with a falsy value\\\");n.reason=t,t=n}return e(t)}function F(e){function n(){for(var n=[],i=0;i<arguments.length;i++)n.push(arguments[i]);var r=n.pop();if(\\\"function\\\"!=typeof r)throw new TypeError(\\\"The last argument must be of type Function\\\");var o=this,a=function(){return r.apply(o,arguments)};e.apply(this,n).then(function(e){t.nextTick(a,null,e)},function(e){t.nextTick(E,e,a)})}if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"original\\\" argument must be of type Function');return Object.setPrototypeOf(n,Object.getPrototypeOf(e)),Object.defineProperties(n,A(e)),n}var A=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),n={},i=0;i<e.length;i++)n[e[i]]=Object.getOwnPropertyDescriptor(t,e[i]);return n},V=/%[sdj%]/g;e.format=function(t){if(!g(t)){for(var e=[],n=0;n<arguments.length;n++)e.push(i(arguments[n]));return e.join(\\\" \\\")}for(var n=1,r=arguments,o=r.length,a=String(t).replace(V,function(t){if(\\\"%%\\\"===t)return\\\"%\\\";if(n>=o)return t;switch(t){case\\\"%s\\\":return String(r[n++]);case\\\"%d\\\":return Number(r[n++]);case\\\"%j\\\":try{return JSON.stringify(r[n++])}catch(t){return\\\"[Circular]\\\"}default:return t}}),s=r[n];n<o;s=r[++n])y(s)||!k(s)?a+=\\\" \\\"+s:a+=\\\" \\\"+i(s);return a},e.deprecate=function(n,i){function r(){if(!o){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),o=!0}return n.apply(this,arguments)}if(void 0!==t&&!0===t.noDeprecation)return n;if(void 0===t)return function(){return e.deprecate(n,i).apply(this,arguments)};var o=!1;return r};var q,L={};e.debuglog=function(n){if(b(q)&&(q=Object({NODE_ENV:\\\"production\\\"}).NODE_DEBUG||\\\"\\\"),n=n.toUpperCase(),!L[n])if(new RegExp(\\\"\\\\\\\\b\\\"+n+\\\"\\\\\\\\b\\\",\\\"i\\\").test(q)){var i=t.pid;L[n]=function(){var t=e.format.apply(e,arguments);console.error(\\\"%s %d: %s\\\",n,i,t)}}else L[n]=function(){};return L[n]},e.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:\\\"cyan\\\",number:\\\"yellow\\\",boolean:\\\"yellow\\\",undefined:\\\"grey\\\",null:\\\"bold\\\",string:\\\"green\\\",date:\\\"magenta\\\",regexp:\\\"red\\\"},e.isArray=h,e.isBoolean=d,e.isNull=y,e.isNullOrUndefined=m,e.isNumber=v,e.isString=g,e.isSymbol=x,e.isUndefined=b,e.isRegExp=w,e.isObject=k,e.isDate=_,e.isError=S,e.isFunction=z,e.isPrimitive=T,e.isBuffer=n(51);var O=[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"];e.log=function(){console.log(\\\"%s - %s\\\",I(),e.format.apply(e,arguments))},e.inherits=n(52),e._extend=function(t,e){if(!e||!k(e))return t;for(var n=Object.keys(e),i=n.length;i--;)t[n[i]]=e[n[i]];return t};var B=\\\"undefined\\\"!=typeof Symbol?Symbol(\\\"util.promisify.custom\\\"):void 0;e.promisify=function(t){function e(){for(var e,n,i=new Promise(function(t,i){e=t,n=i}),r=[],o=0;o<arguments.length;o++)r.push(arguments[o]);r.push(function(t,i){t?n(t):e(i)});try{t.apply(this,r)}catch(t){n(t)}return i}if(\\\"function\\\"!=typeof t)throw new TypeError('The \\\"original\\\" argument must be of type Function');if(B&&t[B]){var e=t[B];if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"util.promisify.custom\\\" argument must be of type Function');return Object.defineProperty(e,B,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),B&&Object.defineProperty(e,B,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,A(t))},e.promisify.custom=B,e.callbackify=F}).call(e,n(50))},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.x=t,this.y=e,this.angle=n,void 0!==i&&(this.segment=i)}var r=n(2);t.exports=i,i.prototype=Object.create(r.prototype),i.prototype.clone=function(){return new i(this.x,this.y,this.angle,this.segment)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){return t*(1-n)+e*n}t.exports=i,i.number=i,i.vec2=function(t,e,n){return[i(t[0],e[0],n),i(t[1],e[1],n)]},i.color=function(t,e,n){return[i(t[0],e[0],n),i(t[1],e[1],n),i(t[2],e[2],n),i(t[3],e[3],n)]},i.array=function(t,e,n){return t.map(function(t,r){return i(t,e[r],n)})}},function(t,e,n){\\\"use strict\\\";function i(t,e){return e.replace(/{([^{}]+)}/g,function(e,n){return n in t?t[n]:\\\"\\\"})}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a,s,u){this.anchorPoint=t,this.tl=e,this.tr=n,this.bl=i,this.br=r,this.tex=o,this.angle=a,this.minScale=s,this.maxScale=u}function r(t,e,n,r,o,a){var l=e.image.rect,c=e.left-1,p=c+l.w/e.image.pixelRatio,f=e.top-1,h=f+l.h/e.image.pixelRatio,d=new s(c,f),y=new s(p,f),m=new s(p,h),v=new s(c,h),g=o[\\\"icon-rotate\\\"]*Math.PI/180;if(a){var x=r[t.segment];if(t.y===x.y&&t.x===x.x&&t.segment+1<r.length){var b=r[t.segment+1];g+=Math.atan2(t.y-b.y,t.x-b.x)+Math.PI}else g+=Math.atan2(t.y-x.y,t.x-x.x)}if(g){var w=Math.sin(g),k=Math.cos(g),_=[k,-w,w,k];d=d.matMult(_),y=y.matMult(_),v=v.matMult(_),m=m.matMult(_)}return[new i(new s(t.x,t.y),d,y,v,m,e.image.rect,0,u,1/0)]}function o(t,e,n,r,o,l){for(var c=o[\\\"text-rotate\\\"]*Math.PI/180,p=o[\\\"text-keep-upright\\\"],f=e.positionedGlyphs,h=[],d=0;d<f.length;d++){var y=f[d],m=y.glyph,v=m.rect;if(v){var g,x=(y.x+m.advance/2)*n,b=u;l?(g=[],b=a(g,t,x,r,t.segment,!0),p&&(b=Math.min(b,a(g,t,x,r,t.segment,!1)))):g=[{anchorPoint:new s(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:u}];for(var w=y.x+m.left,k=y.y-m.top,_=w+v.w,S=k+v.h,z=new s(w,k),T=new s(_,k),j=new s(w,S),M=new s(_,S),I=0;I<g.length;I++){var P=g[I],E=z,F=T,A=j,V=M,q=P.angle+c;if(q){var L=Math.sin(q),O=Math.cos(q),B=[O,-L,L,O];E=E.matMult(B),F=F.matMult(B),A=A.matMult(B),V=V.matMult(B)}var C=Math.max(P.minScale,b),D=(t.angle+c+P.offset+2*Math.PI)%(2*Math.PI);h.push(new i(P.anchorPoint,E,F,A,V,v,D,C,P.maxScale))}}}return h}function a(t,e,n,i,r,o){var a=!o;n<0&&(o=!o),o&&r++;var l=new s(e.x,e.y),c=i[r],p=1/0;n=Math.abs(n);for(var f=u;;){var h=l.dist(c),d=n/h,y=Math.atan2(c.y-l.y,c.x-l.x);if(o||(y+=Math.PI),a&&(y+=Math.PI),t.push({anchorPoint:l,offset:a?Math.PI:0,minScale:d,maxScale:p,angle:(y+2*Math.PI)%(2*Math.PI)}),d<=f)break;for(l=c;l.equals(c);)if(r+=o?1:-1,!(c=i[r]))return d;var m=c.sub(l)._unit();l=l.sub(m._mult(h)),p=d}return f}var s=n(2);t.exports={getIconQuads:r,getGlyphQuads:o,SymbolQuad:i};var u=.5},function(t,e,n){\\\"use strict\\\";function i(t,e,n){var i=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var o=new Int32Array(this.arrayBuffer);t=o[0],e=o[1],n=o[2],this.d=e+2*n;for(var a=0;a<this.d*this.d;a++){var s=o[r+a],u=o[r+a+1];i.push(s===u?null:o.subarray(s,u))}var l=o[r+i.length],c=o[r+i.length+1];this.keys=o.subarray(l,c),this.bboxes=o.subarray(c),this.insert=this._insertReadonly}else{this.d=e+2*n;for(var p=0;p<this.d*this.d;p++)i.push([]);this.keys=[],this.bboxes=[]}this.n=e,this.extent=t,this.padding=n,this.scale=e/t,this.uid=0;var f=n/e*t;this.min=-f,this.max=t+f}t.exports=i;var r=3;i.prototype.insert=function(t,e,n,i,r){this._forEachCell(e,n,i,r,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(n),this.bboxes.push(i),this.bboxes.push(r)},i.prototype._insertReadonly=function(){throw\\\"Cannot insert into a GridIndex created from an ArrayBuffer.\\\"},i.prototype._insertCell=function(t,e,n,i,r,o){this.cells[r].push(o)},i.prototype.query=function(t,e,n,i){var r=this.min,o=this.max;if(t<=r&&e<=r&&o<=n&&o<=i)return this.keys.slice();var a=[],s={};return this._forEachCell(t,e,n,i,this._queryCell,a,s),a},i.prototype._queryCell=function(t,e,n,i,r,o,a){var s=this.cells[r];if(null!==s)for(var u=this.keys,l=this.bboxes,c=0;c<s.length;c++){var p=s[c];if(void 0===a[p]){var f=4*p;t<=l[f+2]&&e<=l[f+3]&&n>=l[f+0]&&i>=l[f+1]?(a[p]=!0,o.push(u[p])):a[p]=!1}}},i.prototype._forEachCell=function(t,e,n,i,r,o,a){for(var s=this._convertToCellCoord(t),u=this._convertToCellCoord(e),l=this._convertToCellCoord(n),c=this._convertToCellCoord(i),p=s;p<=l;p++)for(var f=u;f<=c;f++){var h=this.d*f+p;if(r.call(this,t,e,n,i,h,o,a))return}},i.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},i.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=r+this.cells.length+1+1,n=0,i=0;i<this.cells.length;i++)n+=this.cells[i].length;var o=new Int32Array(e+n+this.keys.length+this.bboxes.length);o[0]=this.extent,o[1]=this.n,o[2]=this.padding;for(var a=e,s=0;s<t.length;s++){var u=t[s];o[r+s]=a,o.set(u,a),a+=u.length}return o[r+t.length]=a,o.set(this.keys,a),a+=this.keys.length,o[r+t.length+1]=a,o.set(this.bboxes,a),a+=this.bboxes.length,o.buffer}},function(t,e,n){\\\"use strict\\\";function i(t){this._stringToNumber={},this._numberToString=[];for(var e=0;e<t.length;e++){var n=t[e];this._stringToNumber[n]=e,this._numberToString[e]=n}}var r=n(11);t.exports=i,i.prototype.encode=function(t){return r(t in this._stringToNumber),this._stringToNumber[t]},i.prototype.decode=function(t){return r(t<this._numberToString.length),this._numberToString[t]}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(r,this,e),this.length=this._features.length}function r(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():5===t?e.extent=n.readVarint():2===t?e._features.push(n.pos):3===t?e._keys.push(n.readString()):4===t&&e._values.push(o(n))}function o(t){for(var e=null,n=t.readVarint()+t.pos;t.pos<n;){var i=t.readVarint()>>3;e=1===i?t.readString():2===i?t.readFloat():3===i?t.readDouble():4===i?t.readVarint64():5===i?t.readVarint():6===i?t.readSVarint():7===i?t.readBoolean():null}return e}var a=n(26);t.exports=i,i.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\\\"feature index out of bounds\\\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new a(this._pbf,e,this.extent,this._keys,this._values)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){this.properties={},this.extent=n,this.type=0,this._pbf=t,this._geometry=-1,this._keys=i,this._values=o,t.readFields(r,this,e)}function r(t,e,n){1==t?e.id=n.readVarint():2==t?o(n,e):3==t?e.type=n.readVarint():4==t&&(e._geometry=n.pos)}function o(t,e){for(var n=t.readVarint()+t.pos;t.pos<n;){var i=e._keys[t.readVarint()],r=e._values[t.readVarint()];e.properties[i]=r}}function a(t){var e=t.length;if(e<=1)return[t];for(var n,i,r=[],o=0;o<e;o++){var a=s(t[o]);0!==a&&(void 0===i&&(i=a<0),i===a<0?(n&&r.push(n),n=[t[o]]):n.push(t[o]))}return n&&r.push(n),r}function s(t){for(var e,n,i=0,r=0,o=t.length,a=o-1;r<o;a=r++)e=t[r],n=t[a],i+=(n.x-e.x)*(e.y+n.y);return i}var u=n(2);t.exports=i,i.types=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"],i.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,n=t.readVarint()+t.pos,i=1,r=0,o=0,a=0,s=[];t.pos<n;){if(!r){var l=t.readVarint();i=7&l,r=l>>3}if(r--,1===i||2===i)o+=t.readSVarint(),a+=t.readSVarint(),1===i&&(e&&s.push(e),e=[]),e.push(new u(o,a));else{if(7!==i)throw new Error(\\\"unknown command \\\"+i);e&&e.push(e[0].clone())}}return e&&s.push(e),s},i.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,n=1,i=0,r=0,o=0,a=1/0,s=-1/0,u=1/0,l=-1/0;t.pos<e;){if(!i){var c=t.readVarint();n=7&c,i=c>>3}if(i--,1===n||2===n)r+=t.readSVarint(),o+=t.readSVarint(),r<a&&(a=r),r>s&&(s=r),o<u&&(u=o),o>l&&(l=o);else if(7!==n)throw new Error(\\\"unknown command \\\"+n)}return[a,u,s,l]},i.prototype.toGeoJSON=function(t,e,n){function r(t){for(var e=0;e<t.length;e++){var n=t[e],i=180-360*(n.y+c)/u;t[e]=[360*(n.x+l)/u-180,360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90]}}var o,s,u=this.extent*Math.pow(2,n),l=this.extent*t,c=this.extent*e,p=this.loadGeometry(),f=i.types[this.type];switch(this.type){case 1:var h=[];for(o=0;o<p.length;o++)h[o]=p[o][0];p=h,r(p);break;case 2:for(o=0;o<p.length;o++)r(p[o]);break;case 3:for(p=a(p),o=0;o<p.length;o++)for(s=0;s<p[o].length;s++)r(p[o][s])}1===p.length?p=p[0]:f=\\\"Multi\\\"+f;var d={type:\\\"Feature\\\",geometry:{type:f,coordinates:p},properties:this.properties};return\\\"id\\\"in this&&(d.id=this.id),d}},function(t,e,n){\\\"use strict\\\";var i=n(79);e.interpolated=function(t){var e=i.interpolated(t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e[\\\"piecewise-constant\\\"]=function(t){var e=i[\\\"piecewise-constant\\\"](t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e.isFunctionDefinition=i.isFunctionDefinition},function(t,e,n){\\\"use strict\\\";var i=n(29).parseCSSColor,r=n(0),o=n(27),a={};t.exports=function t(e){if(o.isFunctionDefinition(e))return r.extend({},e,{stops:e.stops.map(function(e){return[e[0],t(e[1])]})});if(\\\"string\\\"==typeof e){if(!a[e]){var n=i(e);if(!n)throw new Error(\\\"Invalid color \\\"+e);a[e]=[n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3]]}return a[e]}throw new Error(\\\"Invalid color \\\"+e)}},function(t,e){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function i(t){return t<0?0:t>1?1:t}function r(t){return n(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function o(t){return i(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))}function a(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function s(t){var e=t.replace(/ /g,\\\"\\\").toLowerCase();if(e in u)return u[e].slice();if(\\\"#\\\"===e[0]){if(4===e.length){var i=parseInt(e.substr(1),16);return i>=0&&i<=4095?[(3840&i)>>4|(3840&i)>>8,240&i|(240&i)>>4,15&i|(15&i)<<4,1]:null}if(7===e.length){var i=parseInt(e.substr(1),16);return i>=0&&i<=16777215?[(16711680&i)>>16,(65280&i)>>8,255&i,1]:null}return null}var s=e.indexOf(\\\"(\\\"),l=e.indexOf(\\\")\\\");if(-1!==s&&l+1===e.length){var c=e.substr(0,s),p=e.substr(s+1,l-(s+1)).split(\\\",\\\"),f=1;switch(c){case\\\"rgba\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"rgb\\\":return 3!==p.length?null:[r(p[0]),r(p[1]),r(p[2]),f];case\\\"hsla\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"hsl\\\":if(3!==p.length)return null;var h=(parseFloat(p[0])%360+360)%360/360,d=o(p[1]),y=o(p[2]),m=y<=.5?y*(d+1):y+d-y*d,v=2*y-m;return[n(255*a(v,m,h+1/3)),n(255*a(v,m,h)),n(255*a(v,m,h-1/3)),f];default:return null}}return null}var u={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{e.parseCSSColor=s}catch(t){}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3);t.exports=function(t){var e=t.key,n=t.value;if(t.styleSpec.$version>7)return n?[new i(e,n,\\\"constants have been deprecated as of v8\\\")]:[];var o=r(n);if(\\\"object\\\"!==o)return[new i(e,n,\\\"object expected, %s found\\\",o)];var a=[];for(var s in n)\\\"@\\\"!==s[0]&&a.push(new i(e+\\\".\\\"+s,n[s],'constants must start with \\\"@\\\"'));return a}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)t[i]=n[i]}return t}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6),a=n(9),s=n(33),u=n(34),l=n(10);t.exports=function(t){function e(t){if(\\\"identity\\\"===y)return[new i(t.key,t.value,'identity function may not have a \\\"stops\\\" property')];var e=[],o=t.value;return e=e.concat(s({key:t.key,value:o,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:n})),\\\"array\\\"===r(o)&&0===o.length&&e.push(new i(t.key,o,\\\"array must have at least one stop\\\")),e}function n(t){var e=[],n=t.value,s=t.key;if(\\\"array\\\"!==r(n))return[new i(s,n,\\\"array expected, %s found\\\",r(n))];if(2!==n.length)return[new i(s,n,\\\"array length %d expected, length %d found\\\",2,n.length)];if(x){if(\\\"object\\\"!==r(n[0]))return[new i(s,n,\\\"object expected, %s found\\\",r(n[0]))];if(void 0===n[0].zoom)return[new i(s,n,\\\"object stop key must have zoom\\\")];if(void 0===n[0].value)return[new i(s,n,\\\"object stop key must have value\\\")];if(h&&h>l(n[0].zoom))return[new i(s,n[0].zoom,\\\"stop zoom values must appear in ascending order\\\")];l(n[0].zoom)!==h&&(h=l(n[0].zoom),f=void 0),e=e.concat(a({key:s+\\\"[0]\\\",value:n[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:u,value:c}}))}else e=e.concat(c({key:s+\\\"[0]\\\",value:n[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec}));return e=e.concat(o({key:s+\\\"[1]\\\",value:n[1],valueSpec:d,style:t.style,styleSpec:t.styleSpec})),\\\"number\\\"===r(n[0])&&\\\"piecewise-constant\\\"===d.function&&n[0]%1!=0&&e.push(new i(s+\\\"[0]\\\",n[0],\\\"zoom level for piecewise-constant functions must be an integer\\\")),e}function c(t){var e=r(t.value),n=l(t.value);if(p){if(e!==p)return[new i(t.key,t.value,\\\"%s stop domain type must match previous stop domain type %s\\\",e,p)]}else p=e,y||\\\"string\\\"!==e||(y=\\\"categorical\\\");return\\\"number\\\"!==e&&\\\"string\\\"!==e?[new i(t.key,t.value,\\\"property value must be a number or string\\\")]:\\\"number\\\"!==e&&\\\"categorical\\\"!==y?[new i(t.key,t.value,\\\"number expected, %s found\\\",e)]:\\\"categorical\\\"!==y||\\\"number\\\"!==e||isFinite(n)&&Math.floor(n)===n?\\\"number\\\"===e&&void 0!==f&&n<f?[new i(t.key,t.value,\\\"stop domain values must appear in ascending order\\\")]:(f=n,\\\"categorical\\\"===y&&n in m?[new i(t.key,t.value,\\\"stop domain values must be unique\\\")]:(m[n]=!0,[])):[new i(t.key,t.value,\\\"integer expected, found %s\\\",n)]}var p,f,h,d=t.valueSpec,y=l(t.value.type),m={},v=\\\"categorical\\\"!==y&&void 0===t.value.property,g=!v,x=\\\"array\\\"===r(t.value.stops)&&\\\"array\\\"===r(t.value.stops[0])&&\\\"object\\\"===r(t.value.stops[0][0]),b=a({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:e}});return\\\"identity\\\"===y||t.value.stops||b.push(new i(t.key,t.value,'missing required property \\\"stops\\\"')),\\\"exponential\\\"===y&&\\\"piecewise-constant\\\"===t.valueSpec.function&&b.push(new i(t.key,t.value,\\\"exponential functions not supported\\\")),t.styleSpec.$version>=8&&(g&&!t.valueSpec[\\\"property-function\\\"]?b.push(new i(t.key,t.value,\\\"property functions not supported\\\")):v&&!t.valueSpec[\\\"zoom-function\\\"]&&b.push(new i(t.key,t.value,\\\"zoom functions not supported\\\"))),\\\"categorical\\\"!==y&&!x||void 0!==t.value.property||b.push(new i(t.key,t.value,'\\\"property\\\" property is required')),b}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(6),o=n(1);t.exports=function(t){var e=t.value,n=t.valueSpec,a=t.style,s=t.styleSpec,u=t.key,l=t.arrayElementValidator||r;if(\\\"array\\\"!==i(e))return[new o(u,e,\\\"array expected, %s found\\\",i(e))];if(n.length&&e.length!==n.length)return[new o(u,e,\\\"array length %d expected, length %d found\\\",n.length,e.length)];if(n[\\\"min-length\\\"]&&e.length<n[\\\"min-length\\\"])return[new o(u,e,\\\"array length at least %d expected, length %d found\\\",n[\\\"min-length\\\"],e.length)];var c={type:n.value};s.$version<7&&(c.function=n.function),\\\"object\\\"===i(n.value)&&(c=n.value);for(var p=[],f=0;f<e.length;f++)p=p.concat(l({array:e,arrayIndex:f,value:e[f],valueSpec:c,style:a,styleSpec:s,key:u+\\\"[\\\"+f+\\\"]\\\"}));return p}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=i(n);return\\\"number\\\"!==a?[new r(e,n,\\\"number expected, %s found\\\",a)]:\\\"minimum\\\"in o&&n<o.minimum?[new r(e,n,\\\"%s is less than the minimum value %s\\\",n,o.minimum)]:\\\"maximum\\\"in o&&n>o.maximum?[new r(e,n,\\\"%s is greater than the maximum value %s\\\",n,o.maximum)]:[]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10),o=n(9),a=n(15),s=n(36),u=n(37),l=n(31);t.exports=function(t){var e=[],n=t.value,c=t.key,p=t.style,f=t.styleSpec;n.type||n.ref||e.push(new i(c,n,'either \\\"type\\\" or \\\"ref\\\" is required'));var h=r(n.type),d=r(n.ref);if(n.id)for(var y=0;y<t.arrayIndex;y++){var m=p.layers[y];r(m.id)===r(n.id)&&e.push(new i(c,n.id,'duplicate layer id \\\"%s\\\", previously used at line %d',n.id,m.id.__line__))}if(\\\"ref\\\"in n){[\\\"type\\\",\\\"source\\\",\\\"source-layer\\\",\\\"filter\\\",\\\"layout\\\"].forEach(function(t){t in n&&e.push(new i(c,n[t],'\\\"%s\\\" is prohibited for ref layers',t))});var v;p.layers.forEach(function(t){t.id==d&&(v=t)}),v?v.ref?e.push(new i(c,n.ref,\\\"ref cannot reference another ref layer\\\")):h=r(v.type):e.push(new i(c,n.ref,'ref layer \\\"%s\\\" not found',d))}else if(\\\"background\\\"!==h)if(n.source){var g=p.sources&&p.sources[n.source];g?\\\"vector\\\"==g.type&&\\\"raster\\\"==h?e.push(new i(c,n.source,'layer \\\"%s\\\" requires a raster source',n.id)):\\\"raster\\\"==g.type&&\\\"raster\\\"!=h?e.push(new i(c,n.source,'layer \\\"%s\\\" requires a vector source',n.id)):\\\"vector\\\"!=g.type||n[\\\"source-layer\\\"]||e.push(new i(c,n,'layer \\\"%s\\\" must specify a \\\"source-layer\\\"',n.id)):e.push(new i(c,n.source,'source \\\"%s\\\" not found',n.source))}else e.push(new i(c,n,'missing required property \\\"source\\\"'));return e=e.concat(o({key:c,value:n,valueSpec:f.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(){return[]},filter:a,layout:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return u(l({layerType:h},t))}}})},paint:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return s(l({layerType:h},t))}}})}}}))}},function(t,e,n){\\\"use strict\\\";var i=n(6),r=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"paint_\\\"+t.layerType];if(!u)return[];var l=s.match(/^(.*)-transition$/);return l&&u[l[1]]&&u[l[1]].transition?i({key:e,value:a,valueSpec:o.transition,style:n,styleSpec:o}):t.valueSpec||u[s]?i({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}):[new r(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var i=n(6),r=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"layout_\\\"+t.layerType];if(!u)return[];if(t.valueSpec||u[s]){var l=[];return\\\"symbol\\\"===t.layerType&&(\\\"icon-image\\\"===s&&n&&!n.sprite?l.push(new r(e,a,'use of \\\"icon-image\\\" requires a style \\\"sprite\\\" property')):\\\"text-field\\\"===s&&n&&!n.glyphs&&l.push(new r(e,a,'use of \\\"text-field\\\" requires a style \\\"glyphs\\\" property'))),l.concat(i({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}))}return[new r(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(10),o=n(9),a=n(14);t.exports=function(t){var e=t.value,n=t.key,s=t.styleSpec,u=t.style;if(!e.type)return[new i(n,e,'\\\"type\\\" is required')];switch(r(e.type)){case\\\"vector\\\":case\\\"raster\\\":var l=[];if(l=l.concat(o({key:n,value:e,valueSpec:s.source_tile,style:t.style,styleSpec:s})),\\\"url\\\"in e)for(var c in e)[\\\"type\\\",\\\"url\\\",\\\"tileSize\\\"].indexOf(c)<0&&l.push(new i(n+\\\".\\\"+c,e[c],'a source with a \\\"url\\\" property may not include a \\\"%s\\\" property',c));return l;case\\\"geojson\\\":return o({key:n,value:e,valueSpec:s.source_geojson,style:u,styleSpec:s});case\\\"video\\\":return o({key:n,value:e,valueSpec:s.source_video,style:u,styleSpec:s});case\\\"image\\\":return o({key:n,value:e,valueSpec:s.source_image,style:u,styleSpec:s});default:return a({key:n+\\\".type\\\",value:e.type,valueSpec:{values:[\\\"vector\\\",\\\"raster\\\",\\\"geojson\\\",\\\"video\\\",\\\"image\\\"]},style:u,styleSpec:s})}}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(6);t.exports=function(t){var e=t.value,n=t.styleSpec,a=n.light,s=t.style,u=[],l=r(e);if(void 0===e)return u;if(\\\"object\\\"!==l)return u=u.concat([new i(\\\"light\\\",e,\\\"object expected, %s found\\\",l)]);for(var c in e){var p=c.match(/^(.*)-transition$/);u=p&&a[p[1]]&&a[p[1]].transition?u.concat(o({key:c,value:e[c],valueSpec:n.transition,style:s,styleSpec:n})):a[c]?u.concat(o({key:c,value:e[c],valueSpec:a[c],style:s,styleSpec:n})):u.concat([new i(c,e[c],'unknown property \\\"%s\\\"',c)])}return u}},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.value,n=t.key,o=i(e);return\\\"string\\\"!==o?[new r(n,e,\\\"string expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,a,s,u,l){if(n/=e,i/=e,u>=n&&l<=i)return t;if(u>i||l<n)return null;for(var c=[],p=0;p<t.length;p++){var f,h,d=t[p],y=d.geometry,m=d.type;if(f=d.min[a],h=d.max[a],f>=n&&h<=i)c.push(d);else if(!(f>i||h<n)){var v=1===m?r(y,n,i,a):o(y,n,i,a,s,3===m);v.length&&c.push({geometry:v,type:m,tags:t[p].tags||null,min:d.min,max:d.max})}}return c.length?c:null}function r(t,e,n,i){for(var r=[],o=0;o<t.length;o++){var a=t[o],s=a[i];s>=e&&s<=n&&r.push(a)}return r}function o(t,e,n,i,r,o){for(var s=[],u=0;u<t.length;u++){var l,c,p,f=0,h=0,d=null,y=t[u],m=y.area,v=y.dist,g=y.length,x=[];for(c=0;c<g-1;c++)l=d||y[c],d=y[c+1],f=h||l[i],h=d[i],f<e?h>n?(x.push(r(l,d,e),r(l,d,n)),o||(x=a(s,x,m,v))):h>=e&&x.push(r(l,d,e)):f>n?h<e?(x.push(r(l,d,n),r(l,d,e)),o||(x=a(s,x,m,v))):h<=n&&x.push(r(l,d,n)):(x.push(l),h<e?(x.push(r(l,d,e)),o||(x=a(s,x,m,v))):h>n&&(x.push(r(l,d,n)),o||(x=a(s,x,m,v))));l=y[g-1],f=l[i],f>=e&&f<=n&&x.push(l),p=x[x.length-1],o&&p&&(x[0][0]!==p[0]||x[0][1]!==p[1])&&x.push(x[0]),a(s,x,m,v)}return s}function a(t,e,n,i){return e.length&&(e.area=n,e.dist=i,t.push(e)),[]}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t){this.self=t,this.actor=new o(t,this),this.loading={},this.loaded={},this.geoJSONIndexes={}}function r(t){var e={};for(var n in t){var i=t[n],r=i.ref||i.id,o=t[r];o.layout&&\\\"none\\\"===o.layout.visibility||(e[r]=e[r]||[],n===r?e[r].unshift(i):e[r].push(i))}return e}var o=n(43),a=n(44),s=n(5),u=n(0),l=n(97),c=n(12),p=n(13),f=n(98),h=n(103),d=n(109),y=n(112),m=n(113);t.exports=function(t){return new i(t)},u.extend(i.prototype,{\\\"set layers\\\":function(t){function e(t){var e=s.create(t,t.ref&&n.layers[t.ref]);e.updatePaintTransitions({},{transition:!1}),n.layers[e.id]=e}this.layers={};for(var n=this,i=[],o=0;o<t.length;o++){var a=t[o];\\\"fill\\\"!==a.type&&\\\"line\\\"!==a.type&&\\\"circle\\\"!==a.type&&\\\"symbol\\\"!==a.type||(a.ref?i.push(o):e(a))}for(var u=0;u<i.length;u++)e(t[i[u]]);this.layerFamilies=r(this.layers)},\\\"update layers\\\":function(t){function e(t){var e=o.layers[t.ref];o.layers[t.id]?o.layers[t.id].set(t,e):o.layers[t.id]=s.create(t,e),o.layers[t.id].updatePaintTransitions({},{transition:!1})}var n,i,o=this;for(n in t)i=t[n],i.ref&&e(i);for(n in t)i=t[n],i.ref||e(i);this.layerFamilies=r(this.layers)},\\\"load tile\\\":function(t,e){function n(t,n){if(delete this.loading[i][r],t)return e(t);o.data=new c.VectorTile(new p(new Uint8Array(n))),o.parse(o.data,this.layerFamilies,this.actor,n,e),this.loaded[i]=this.loaded[i]||{},this.loaded[i][r]=o}var i=t.source,r=t.uid;this.loading[i]||(this.loading[i]={});var o=this.loading[i][r]=new a(t);o.xhr=l.getArrayBuffer(t.url,n.bind(this))},\\\"reload tile\\\":function(t,e){var n=this.loaded[t.source],i=t.uid;if(n&&n[i]){var r=n[i];r.parse(r.data,this.layerFamilies,this.actor,t.rawTileData,e)}},\\\"abort tile\\\":function(t){var e=this.loading[t.source],n=t.uid;e&&e[n]&&(e[n].xhr.abort(),delete e[n])},\\\"remove tile\\\":function(t){var e=this.loaded[t.source],n=t.uid;e&&e[n]&&delete e[n]},\\\"redo placement\\\":function(t,e){var n=this.loaded[t.source],i=this.loading[t.source],r=t.uid;if(n&&n[r]){var o=n[r],a=o.redoPlacement(t.angle,t.pitch,t.showCollisionBoxes);a.result&&e(null,a.result,a.transferables)}else i&&i[r]&&(i[r].angle=t.angle)},\\\"parse geojson\\\":function(t,e){var n=function(n,i){if(d(i,!0),n)return e(n);if(\\\"object\\\"!=typeof i)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));try{this.geoJSONIndexes[t.source]=t.cluster?f(t.superclusterOptions).load(i.features):h(i,t.geojsonVtOptions)}catch(n){return e(n)}e(null)}.bind(this);if(t.url)l.getJSON(t.url,n);else{if(\\\"string\\\"!=typeof t.data)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));n(null,JSON.parse(t.data))}},\\\"load geojson tile\\\":function(t,e){var n=t.source,i=t.coord;if(!this.geoJSONIndexes[n])return e(null,null);var r=this.geoJSONIndexes[n].getTile(Math.min(i.z,t.maxZoom),i.x,i.y),o=r?new a(t):void 0;if(this.loaded[n]=this.loaded[n]||{},this.loaded[n][t.uid]=o,!r)return e(null,null);var s=new y(r.features);s.name=\\\"_geojsonTileLayer\\\";var u=m({layers:{_geojsonTileLayer:s}});0===u.byteOffset&&u.byteLength===u.buffer.byteLength||(u=new Uint8Array(u)),o.parse(s,this.layerFamilies,this.actor,u.buffer,e)}}),t.exports(self)},function(t,e,n){\\\"use strict\\\";function i(t,e){this.target=t,this.parent=e,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener(\\\"message\\\",this.receive,!1)}t.exports=i,i.prototype.receive=function(t){var e,n=t.data;if(\\\"<response>\\\"===n.type)e=this.callbacks[n.id],delete this.callbacks[n.id],e(n.error||null,n.data);else if(void 0!==n.id){var i=n.id;this.parent[n.type](n.data,function(t,e,n){this.postMessage({type:\\\"<response>\\\",id:String(i),error:t?String(t):null,data:e},n)}.bind(this))}else this.parent[n.type](n.data)},i.prototype.send=function(t,e,n,i){var r=null;n&&(this.callbacks[r=this.callbackID++]=n),this.postMessage({type:t,id:String(r),data:e},i)},i.prototype.postMessage=function(t,e){this.target.postMessage(t,e)}},function(t,e,n){\\\"use strict\\\";function i(t){this.coord=t.coord,this.uid=t.uid,this.zoom=t.zoom,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=t.overscaling,this.angle=t.angle,this.pitch=t.pitch,this.showCollisionBoxes=t.showCollisionBoxes}function r(t){for(var e in t.arrayGroups)for(var n=t.arrayGroups[e],i=0;i<n.length;i++){var r=n[i];for(var o in r){var a=r[o];for(var s in a)if(a[s].length>0)return!0}}return!1}function o(t){return t.serialize()}function a(t){var e=[];for(var n in t){var i=t[n];for(var r in i.arrayGroups)for(var o=i.arrayGroups[r],a=0;a<o.length;a++){var s=o[a];for(var u in s){var l=s[u];for(var c in l)e.push(l[c].arrayBuffer)}}}return e}function s(t){return t.id}var u=n(45),l=n(73),c=n(4),p=n(74),f=n(24),h=n(0),d=n(75),y=n(76);t.exports=i,i.prototype.parse=function(t,e,n,i,m){function v(t,e){for(var n=0;n<t.length;n++){var i=t.feature(n);i.index=n;for(var r in e)e[r].filter(i)&&e[r].features.push(i)}}function g(t){if(t)return m(t);if(2===++D){for(var e=q.length-1;e>=0;e--)x(I,q[e]);b()}}function x(t,e){var n=Date.now();e.populateBuffers(z,C,B);var i=Date.now()-n;if(\\\"symbol\\\"!==e.type)for(var r=0;r<e.features.length;r++){var o=e.features[r];T.insert(o,o.index,e.sourceLayerIndex,e.index)}e.features=null,M._total+=i,M[e.id]=(M[e.id]||0)+i}function b(){I.status=\\\"done\\\",I.redoPlacementAfterDone&&(I.redoPlacement(I.angle,I.pitch,null),I.redoPlacementAfterDone=!1);var t=T.serialize(),e=z.serialize(),n=I.collisionBoxArray.serialize(),s=I.symbolInstancesArray.serialize(),u=I.symbolQuadsArray.serialize(),l=[i].concat(t.transferables).concat(e.transferables),c=V.filter(r);m(null,{buckets:c.map(o),bucketStats:M,featureIndex:t.data,collisionTile:e.data,collisionBoxArray:n,symbolInstancesArray:s,symbolQuadsArray:u,rawTileData:i},a(c).concat(l))}this.status=\\\"parsing\\\",this.data=t,this.collisionBoxArray=new p,this.symbolInstancesArray=new d,this.symbolQuadsArray=new y;var w,k,_,S,z=new l(this.angle,this.pitch,this.collisionBoxArray),T=new u(this.coord,this.overscaling,z,t.layers),j=new f(t.layers?Object.keys(t.layers).sort():[\\\"_geojsonTileLayer\\\"]),M={_total:0},I=this,P={},E={},F=0;for(var A in e)k=e[A][0],k.source===this.source&&(k.ref||k.minzoom&&this.zoom<k.minzoom||k.maxzoom&&this.zoom>=k.maxzoom||k.layout&&\\\"none\\\"===k.layout.visibility||t.layers&&!t.layers[k.sourceLayer]||(S=c.create({layer:k,index:F++,childLayers:e[A],zoom:this.zoom,overscaling:this.overscaling,showCollisionBoxes:this.showCollisionBoxes,collisionBoxArray:this.collisionBoxArray,symbolQuadsArray:this.symbolQuadsArray,symbolInstancesArray:this.symbolInstancesArray,sourceLayerIndex:j.encode(k.sourceLayer||\\\"_geojsonTileLayer\\\")}),S.createFilter(),P[k.id]=S,t.layers&&(_=k.sourceLayer,E[_]=E[_]||{},E[_][k.id]=S)));if(t.layers)for(_ in E)1===k.version&&h.warnOnce('Vector tile source \\\"'+this.source+'\\\" layer \\\"'+_+'\\\" does not use vector tile spec v2 and therefore may have some rendering errors.'),(k=t.layers[_])&&v(k,E[_]);else v(t,P);var V=[],q=this.symbolBuckets=[],L=[];T.bucketLayerIDs={};for(var O in P)S=P[O],0!==S.features.length&&(T.bucketLayerIDs[S.index]=S.childLayers.map(s),V.push(S),\\\"symbol\\\"===S.type?q.push(S):L.push(S));var B={},C={},D=0;if(q.length>0){for(w=q.length-1;w>=0;w--)q[w].updateIcons(B),q[w].updateFont(C);for(var N in C)C[N]=Object.keys(C[N]).map(Number);B=Object.keys(B),n.send(\\\"get glyphs\\\",{uid:this.uid,stacks:C},function(t,e){C=e,g(t)}),B.length?n.send(\\\"get icons\\\",{icons:B},function(t,e){B=e,g(t)}):g()}for(w=L.length-1;w>=0;w--)x(this,L[w]);if(0===q.length)return b()},i.prototype.redoPlacement=function(t,e,n){if(\\\"done\\\"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=t,{};for(var i=new l(t,e,this.collisionBoxArray),s=this.symbolBuckets,u=s.length-1;u>=0;u--)s[u].placeFeatures(i,n);var c=i.serialize(),p=s.filter(r);return{result:{buckets:p.map(o),collisionTile:c.data},transferables:a(p).concat(c.transferables)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){if(t.grid){var i=t,r=e;t=i.coord,e=i.overscaling,this.grid=new d(i.grid),this.featureIndexArray=new S(i.featureIndexArray),this.rawTileData=r,this.bucketLayerIDs=i.bucketLayerIDs}else this.grid=new d(p,16,0),this.featureIndexArray=new S;this.coord=t,this.overscaling=e,this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.setCollisionTile(n)}function r(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function o(t,e){return e-t}function a(t){return t[\\\"line-gap-width\\\"]>0?t[\\\"line-gap-width\\\"]+2*t[\\\"line-width\\\"]:t[\\\"line-width\\\"]}function s(t,e,n,i,r){if(!e[0]&&!e[1])return t;e=l.convert(e),\\\"viewport\\\"===n&&e._rotate(-i);for(var o=[],a=0;a<t.length;a++){for(var s=t[a],u=[],c=0;c<s.length;c++)u.push(s[c].sub(e._mult(r)));o.push(u)}return o}function u(t,e){for(var n=[],i=new l(0,0),r=0;r<t.length;r++){for(var o=t[r],a=[],s=0;s<o.length;s++){var u=o[s-1],c=o[s],p=o[s+1],f=0===s?i:c.sub(u)._unit()._perp(),h=s===o.length-1?i:p.sub(c)._unit()._perp(),d=f._add(h)._unit(),y=d.x*h.x+d.y*h.y;d._mult(1/y),a.push(d._mult(e)._add(c))}n.push(a)}return n}var l=n(2),c=n(7),p=n(4).EXTENT,f=n(16),h=n(8),d=n(23),y=n(24),m=n(12),v=n(13),g=n(71),x=n(0).arraysIntersect,b=n(72),w=b.multiPolygonIntersectsBufferedMultiPoint,k=b.multiPolygonIntersectsMultiPolygon,_=b.multiPolygonIntersectsBufferedMultiLine,S=new h({members:[{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"}]});t.exports=i,i.prototype.insert=function(t,e,n,i){var r=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(e,n,i);for(var o=c(t),a=0;a<o.length;a++){for(var s=o[a],u=[1/0,1/0,-1/0,-1/0],l=0;l<s.length;l++){var p=s[l];u[0]=Math.min(u[0],p.x),u[1]=Math.min(u[1],p.y),u[2]=Math.max(u[2],p.x),u[3]=Math.max(u[3],p.y)}this.grid.insert(r,u[0],u[1],u[2],u[3])}},i.prototype.setCollisionTile=function(t){this.collisionTile=t},i.prototype.serialize=function(){var t={coord:this.coord,overscaling:this.overscaling,grid:this.grid.toArrayBuffer(),featureIndexArray:this.featureIndexArray.serialize(),bucketLayerIDs:this.bucketLayerIDs};return{data:t,transferables:[t.grid,t.featureIndexArray.arrayBuffer]}},i.prototype.query=function(t,e){this.vtLayers||(this.vtLayers=new m.VectorTile(new v(new Uint8Array(this.rawTileData))).layers,this.sourceLayerCoder=new y(this.vtLayers?Object.keys(this.vtLayers).sort():[\\\"_geojsonTileLayer\\\"]));var n={},i=t.params||{},s=p/t.tileSize/t.scale,u=f(i.filter),c=0;for(var h in e){var d=e[h],g=d.paint,x=0;\\\"line\\\"===d.type?x=a(g)/2+Math.abs(g[\\\"line-offset\\\"])+r(g[\\\"line-translate\\\"]):\\\"fill\\\"===d.type?x=r(g[\\\"fill-translate\\\"]):\\\"circle\\\"===d.type&&(x=g[\\\"circle-radius\\\"]+r(g[\\\"circle-translate\\\"])),c=Math.max(c,x*s)}for(var b=t.queryGeometry.map(function(t){return t.map(function(t){return new l(t.x,t.y)})}),w=1/0,k=1/0,_=-1/0,S=-1/0,z=0;z<b.length;z++)for(var T=b[z],j=0;j<T.length;j++){var M=T[j];w=Math.min(w,M.x),k=Math.min(k,M.y),_=Math.max(_,M.x),S=Math.max(S,M.y)}var I=this.grid.query(w-c,k-c,_+c,S+c);I.sort(o),this.filterMatching(n,I,this.featureIndexArray,b,u,i.layers,e,t.bearing,s);var P=this.collisionTile.queryRenderedSymbols(w,k,_,S,t.scale);return P.sort(),this.filterMatching(n,P,this.collisionTile.collisionBoxArray,b,u,i.layers,e,t.bearing,s),n},i.prototype.filterMatching=function(t,e,n,i,r,o,l,p,f){for(var h,d=0;d<e.length;d++){var y=e[d];if(y!==h){h=y;var m=n.get(y),v=this.bucketLayerIDs[m.bucketIndex];if(!o||x(o,v)){var b=this.sourceLayerCoder.decode(m.sourceLayerIndex),S=this.vtLayers[b],z=S.feature(m.featureIndex);if(r(z))for(var T=null,j=0;j<v.length;j++){var M=v[j];if(!(o&&o.indexOf(M)<0)){var I=l[M];if(I){var P;if(\\\"symbol\\\"!==I.type){T||(T=c(z));var E=I.paint;if(\\\"line\\\"===I.type){P=s(i,E[\\\"line-translate\\\"],E[\\\"line-translate-anchor\\\"],p,f);var F=a(E)/2*f;if(E[\\\"line-offset\\\"]&&(T=u(T,E[\\\"line-offset\\\"]*f)),!_(P,T,F))continue}else if(\\\"fill\\\"===I.type){if(P=s(i,E[\\\"fill-translate\\\"],E[\\\"fill-translate-anchor\\\"],p,f),!k(P,T))continue}else if(\\\"circle\\\"===I.type){P=s(i,E[\\\"circle-translate\\\"],E[\\\"circle-translate-anchor\\\"],p,f);var A=E[\\\"circle-radius\\\"]*f;if(!w(P,T,A))continue}}var V=new g(z,this.z,this.x,this.y);V.layer=I.serialize({includeRefProperties:!0});var q=t[M];void 0===q&&(q=t[M]=[]),q.push(V)}}}}}}}},function(t,e){function n(t,e,n,i){this.cx=3*t,this.bx=3*(n-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(i-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=i,this.p2x=n,this.p2y=i}t.exports=n,n.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){void 0===e&&(e=1e-6);var n,i,r,o,a;for(r=t,a=0;a<8;a++){if(o=this.sampleCurveX(r)-t,Math.abs(o)<e)return r;var s=this.sampleCurveDerivativeX(r);if(Math.abs(s)<1e-6)break;r-=o/s}if(n=0,i=1,(r=t)<n)return n;if(r>i)return i;for(;n<i;){if(o=this.sampleCurveX(r),Math.abs(o-t)<e)return r;t>o?n=r:i=r,r=.5*(i-n)+n}return r},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){this.column=t,this.row=e,this.zoom=n}t.exports=i,i.prototype={clone:function(){return new i(this.column,this.row,this.zoom)},zoomTo:function(t){return this.clone()._zoomTo(t)},sub:function(t){return this.clone()._sub(t)},_zoomTo:function(t){var e=Math.pow(2,t-this.zoom);return this.column*=e,this.row*=e,this.zoom=t,this},_sub:function(t){return t=t.zoomTo(this.zoom),this.column-=t.column,this.row-=t.row,this}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.attributes=e.members,this.itemSize=e.bytesPerElement,this.type=n,this.arrayType=e}t.exports=i,i.prototype.bind=function(t){var e=t[this.type];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.arrayBuffer,t.STATIC_DRAW),this.arrayBuffer=null)};var r={Int8:\\\"BYTE\\\",Uint8:\\\"UNSIGNED_BYTE\\\",Int16:\\\"SHORT\\\",Uint16:\\\"UNSIGNED_SHORT\\\"};i.prototype.setVertexAttribPointers=function(t,e){for(var n=0;n<this.attributes.length;n++){var i=this.attributes[n],o=e[i.name];void 0!==o&&t.vertexAttribPointer(o,i.components,t[r[i.type]],!1,this.arrayType.bytesPerElement,i.offset)}},i.prototype.destroy=function(t){this.buffer&&t.deleteBuffer(this.buffer)},i.BufferType={VERTEX:\\\"ARRAY_BUFFER\\\",ELEMENT:\\\"ELEMENT_ARRAY_BUFFER\\\"},i.ELEMENT_ATTRIBUTE_TYPE=\\\"Uint16\\\",i.VERTEX_ATTRIBUTE_ALIGNMENT=4},function(t,e,n){\\\"use strict\\\";function i(t){if(null===t||void 0===t)throw new TypeError(\\\"Object.assign cannot be called with null or undefined\\\");return Object(t)}var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\\\"abc\\\");if(t[5]=\\\"de\\\",\\\"5\\\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e[\\\"_\\\"+String.fromCharCode(n)]=n;if(\\\"0123456789\\\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\\\"\\\"))return!1;var i={};return\\\"abcdefghijklmnopqrst\\\".split(\\\"\\\").forEach(function(t){i[t]=t}),\\\"abcdefghijklmnopqrst\\\"===Object.keys(Object.assign({},i)).join(\\\"\\\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,s,u=i(t),l=1;l<arguments.length;l++){n=Object(arguments[l]);for(var c in n)o.call(n,c)&&(u[c]=n[c]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(t,e){function n(){throw new Error(\\\"setTimeout has not been defined\\\")}function i(){throw new Error(\\\"clearTimeout has not been defined\\\")}function r(t){if(c===setTimeout)return setTimeout(t,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function o(t){if(p===clearTimeout)return clearTimeout(t);if((p===i||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(t);try{return p(t)}catch(e){try{return p.call(null,t)}catch(e){return p.call(this,t)}}}function a(){y&&h&&(y=!1,h.length?d=h.concat(d):m=-1,d.length&&s())}function s(){if(!y){var t=r(a);y=!0;for(var e=d.length;e;){for(h=d,d=[];++m<e;)h&&h[m].run();m=-1,e=d.length}h=null,y=!1,o(t)}}function u(t,e){this.fun=t,this.array=e}function l(){}var c,p,f=t.exports={};!function(){try{c=\\\"function\\\"==typeof setTimeout?setTimeout:n}catch(t){c=n}try{p=\\\"function\\\"==typeof clearTimeout?clearTimeout:i}catch(t){p=i}}();var h,d=[],y=!1,m=-1;f.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];d.push(new u(t,e)),1!==d.length||y||r(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\\\"browser\\\",f.browser=!0,f.env={},f.argv=[],f.version=\\\"\\\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(t){return[]},f.binding=function(t){throw new Error(\\\"process.binding is not supported\\\")},f.cwd=function(){return\\\"/\\\"},f.chdir=function(t){throw new Error(\\\"process.chdir is not supported\\\")},f.umask=function(){return 0}},function(t,e){t.exports=function(t){return t&&\\\"object\\\"==typeof t&&\\\"function\\\"==typeof t.copy&&\\\"function\\\"==typeof t.fill&&\\\"function\\\"==typeof t.readUInt8}},function(t,e){\\\"function\\\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e,n){\\\"use strict\\\";function i(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.vao=null}var r=n(11);t.exports=i,i.prototype.bind=function(t,e,n,i,r){void 0===t.extVertexArrayObject&&(t.extVertexArrayObject=t.getExtension(\\\"OES_vertex_array_object\\\"));var o=!this.vao||this.boundProgram!==e||this.boundVertexBuffer!==n||this.boundVertexBuffer2!==r||this.boundElementBuffer!==i;!t.extVertexArrayObject||o?this.freshBind(t,e,n,i,r):t.extVertexArrayObject.bindVertexArrayOES(this.vao)},i.prototype.freshBind=function(t,e,n,i,o){var a,s=e.numAttributes;if(t.extVertexArrayObject)this.vao&&this.destroy(t),this.vao=t.extVertexArrayObject.createVertexArrayOES(),t.extVertexArrayObject.bindVertexArrayOES(this.vao),a=0,this.boundProgram=e,this.boundVertexBuffer=n,this.boundVertexBuffer2=o,this.boundElementBuffer=i;else{a=t.currentNumAttributes||0;for(var u=s;u<a;u++)r(0!==u),t.disableVertexAttribArray(u)}for(var l=a;l<s;l++)t.enableVertexAttribArray(l);n.bind(t),n.setVertexAttribPointers(t,e),o&&(o.bind(t),o.setVertexAttribPointers(t,e)),i&&i.bind(t),t.currentNumAttributes=s},i.prototype.unbind=function(t){var e=t.extVertexArrayObject;e&&e.bindVertexArrayOES(null)},i.prototype.destroy=function(t){var e=t.extVertexArrayObject;e&&this.vao&&(e.deleteVertexArrayOES(this.vao),this.vao=null)}},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=n(55),u=n(56);t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.programInterfaces={fill:{vertexBuffer:!0,elementBuffer:!0,elementBufferComponents:1,elementBuffer2:!0,elementBuffer2Components:2,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}],paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-color\\\"},{name:\\\"a_outline_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-outline-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-outline-color\\\"}]}},i.prototype.addFeature=function(t){for(var e=a(t),n=u(e,500),i=this.makeRoomFor(\\\"fill\\\",0),r=i.layout.vertex.length,o=0;o<n.length;o++)this.addPolygon(n[o]);this.populatePaintArrays(\\\"fill\\\",{zoom:this.zoom},t.properties,i,r)},i.prototype.addPolygon=function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n].length;for(var i=this.makeRoomFor(\\\"fill\\\",e),r=[],o=[],a=i.layout.vertex.length,u=0;u<t.length;u++){var l=t[u];u>0&&o.push(r.length/2);for(var c=0;c<l.length;c++){var p=l[c],f=i.layout.vertex.emplaceBack(p.x,p.y);c>=1&&i.layout.element2.emplaceBack(f-1,f),r.push(p.x),r.push(p.y)}}for(var h=s(r,o),d=0;d<h.length;d++)i.layout.element.emplaceBack(h[d]+a)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){n=n||2;var i=e&&e.length,o=i?e[0]*n:t.length,s=r(t,0,o,n,!0),u=[];if(!s||s.next===s.prev)return u;var l,c,f,h,d,y,m;if(i&&(s=p(t,e,s,n)),t.length>80*n){l=f=t[0],c=h=t[1];for(var v=n;v<o;v+=n)d=t[v],y=t[v+1],d<l&&(l=d),y<c&&(c=y),d>f&&(f=d),y>h&&(h=y);m=Math.max(f-l,h-c),m=0!==m?1/m:0}return a(s,u,n,l,c,m),u}function r(t,e,n,i,r){var o,a;if(r===V(t,e,n,i)>0)for(o=e;o<n;o+=i)a=E(o,t[o],t[o+1],a);else for(o=n-i;o>=e;o-=i)a=E(o,t[o],t[o+1],a);return a&&_(a,a.next)&&(F(a),a=a.next),a}function o(t,e){if(!t)return t;e||(e=t);var n,i=t;do{if(n=!1,i.steiner||!_(i,i.next)&&0!==k(i.prev,i,i.next))i=i.next;else{if(F(i),(i=e=i.prev)===i.next)break;n=!0}}while(n||i!==e);return e}function a(t,e,n,i,r,p,f){if(t){!f&&p&&m(t,i,r,p);for(var h,d,y=t;t.prev!==t.next;)if(h=t.prev,d=t.next,p?u(t,i,r,p):s(t))e.push(h.i/n),e.push(t.i/n),e.push(d.i/n),F(t),t=d.next,y=d.next;else if((t=d)===y){f?1===f?(t=l(o(t),e,n),a(t,e,n,i,r,p,2)):2===f&&c(t,e,n,i,r,p):a(o(t),e,n,i,r,p,1);break}}}function s(t){var e=t.prev,n=t,i=t.next;if(k(e,n,i)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(b(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&k(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function u(t,e,n,i){var r=t.prev,o=t,a=t.next;if(k(r,o,a)>=0)return!1;for(var s=r.x<o.x?r.x<a.x?r.x:a.x:o.x<a.x?o.x:a.x,u=r.y<o.y?r.y<a.y?r.y:a.y:o.y<a.y?o.y:a.y,l=r.x>o.x?r.x>a.x?r.x:a.x:o.x>a.x?o.x:a.x,c=r.y>o.y?r.y>a.y?r.y:a.y:o.y>a.y?o.y:a.y,p=g(s,u,e,n,i),f=g(l,c,e,n,i),h=t.prevZ,d=t.nextZ;h&&h.z>=p&&d&&d.z<=f;){if(h!==t.prev&&h!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,h.x,h.y)&&k(h.prev,h,h.next)>=0)return!1;if(h=h.prevZ,d!==t.prev&&d!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,d.x,d.y)&&k(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;h&&h.z>=p;){if(h!==t.prev&&h!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,h.x,h.y)&&k(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;d&&d.z<=f;){if(d!==t.prev&&d!==t.next&&b(r.x,r.y,o.x,o.y,a.x,a.y,d.x,d.y)&&k(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function l(t,e,n){var i=t;do{var r=i.prev,a=i.next.next;!_(r,a)&&S(r,i,i.next,a)&&M(r,a)&&M(a,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(a.i/n),F(i),F(i.next),i=t=a),i=i.next}while(i!==t);return o(i)}function c(t,e,n,i,r,s){var u=t;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&w(u,l)){var c=P(u,l);return u=o(u,u.next),c=o(c,c.next),a(u,e,n,i,r,s),void a(c,e,n,i,r,s)}l=l.next}u=u.next}while(u!==t)}function p(t,e,n,i){var a,s,u,l,c,p=[];for(a=0,s=e.length;a<s;a++)u=e[a]*i,l=a<s-1?e[a+1]*i:t.length,c=r(t,u,l,i,!1),c===c.next&&(c.steiner=!0),p.push(x(c));for(p.sort(f),a=0;a<p.length;a++)h(p[a],n),n=o(n,n.next);return n}function f(t,e){return t.x-e.x}function h(t,e){if(e=d(t,e)){var n=P(e,t);o(e,e.next),o(n,n.next)}}function d(t,e){var n,i=e,r=t.x,o=t.y,a=-1/0;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){var s=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(s<=r&&s>a){if(a=s,s===r){if(o===i.y)return i;if(o===i.next.y)return i.next}n=i.x<i.next.x?i:i.next}}i=i.next}while(i!==e);if(!n)return null;if(r===a)return n;var u,l=n,c=n.x,p=n.y,f=1/0;i=n;do{r>=i.x&&i.x>=c&&r!==i.x&&b(o<p?r:a,o,c,p,o<p?a:r,o,i.x,i.y)&&(u=Math.abs(o-i.y)/(r-i.x),M(i,t)&&(u<f||u===f&&(i.x>n.x||i.x===n.x&&y(n,i)))&&(n=i,f=u)),i=i.next}while(i!==l);return n}function y(t,e){return k(t.prev,t,e.prev)<0&&k(e.next,t,t.next)<0}function m(t,e,n,i){var r=t;do{null===r.z&&(r.z=g(r.x,r.y,e,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,v(r)}function v(t){var e,n,i,r,o,a,s,u,l=1;do{for(n=t,t=null,o=null,a=0;n;){for(a++,i=n,s=0,e=0;e<l&&(s++,i=i.nextZ);e++);for(u=l;s>0||u>0&&i;)0!==s&&(0===u||!i||n.z<=i.z)?(r=n,n=n.nextZ,s--):(r=i,i=i.nextZ,u--),o?o.nextZ=r:t=r,r.prevZ=o,o=r;n=i}o.nextZ=null,l*=2}while(a>1);return t}function g(t,e,n,i,r){return t=32767*(t-n)*r,e=32767*(e-i)*r,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function x(t){var e=t,n=t;do{(e.x<n.x||e.x===n.x&&e.y<n.y)&&(n=e),e=e.next}while(e!==t);return n}function b(t,e,n,i,r,o,a,s){return(r-a)*(e-s)-(t-a)*(o-s)>=0&&(t-a)*(i-s)-(n-a)*(e-s)>=0&&(n-a)*(o-s)-(r-a)*(i-s)>=0}function w(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!j(t,e)&&(M(t,e)&&M(e,t)&&I(t,e)&&(k(t.prev,t,e.prev)||k(t,e.prev,e))||_(t,e)&&k(t.prev,t,t.next)>0&&k(e.prev,e,e.next)>0)}function k(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _(t,e){return t.x===e.x&&t.y===e.y}function S(t,e,n,i){var r=T(k(t,e,n)),o=T(k(t,e,i)),a=T(k(n,i,t)),s=T(k(n,i,e));return r!==o&&a!==s||(!(0!==r||!z(t,n,e))||(!(0!==o||!z(t,i,e))||(!(0!==a||!z(n,t,i))||!(0!==s||!z(n,e,i)))))}function z(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function T(t){return t>0?1:t<0?-1:0}function j(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&S(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function M(t,e){return k(t.prev,t,t.next)<0?k(t,e,t.next)>=0&&k(t,t.prev,e)>=0:k(t,e,t.prev)<0||k(t,t.next,e)<0}function I(t,e){var n=t,i=!1,r=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&r<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==t);return i}function P(t,e){var n=new A(t.i,t.x,t.y),i=new A(e.i,e.x,e.y),r=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=r,r.prev=n,i.next=n,n.prev=i,o.next=i,i.prev=o,i}function E(t,e,n,i){var r=new A(t,e,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function F(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function A(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function V(t,e,n,i){for(var r=0,o=e,a=n-i;o<n;o+=i)r+=(t[a]-t[o])*(t[o+1]+t[a+1]),a=o;return r}t.exports=i,t.exports.default=i,i.deviation=function(t,e,n,i){var r=e&&e.length,o=r?e[0]*n:t.length,a=Math.abs(V(t,0,o,n));if(r)for(var s=0,u=e.length;s<u;s++){var l=e[s]*n,c=s<u-1?e[s+1]*n:t.length;a-=Math.abs(V(t,l,c,n))}var p=0;for(s=0;s<i.length;s+=3){var f=i[s]*n,h=i[s+1]*n,d=i[s+2]*n;p+=Math.abs((t[f]-t[d])*(t[h+1]-t[f+1])-(t[f]-t[h])*(t[d+1]-t[f+1]))}return 0===a&&0===p?0:Math.abs((p-a)/a)},i.flatten=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},i=0,r=0;r<t.length;r++){for(var o=0;o<t[r].length;o++)for(var a=0;a<e;a++)n.vertices.push(t[r][o][a]);r>0&&(i+=t[r-1].length,n.holes.push(i))}return n}},function(t,e,n){\\\"use strict\\\";function i(t,e){return e.area-t.area}function r(t){for(var e,n,i=0,r=0,o=t.length,a=o-1;r<o;a=r++)e=t[r],n=t[a],i+=(n.x-e.x)*(e.y+n.y);return i}var o=n(57);t.exports=function(t,e){var n=t.length;if(n<=1)return[t];for(var a,s,u=[],l=0;l<n;l++){var c=r(t[l]);0!==c&&(t[l].area=Math.abs(c),void 0===s&&(s=c<0),s===c<0?(a&&u.push(a),a=[t[l]]):a.push(t[l]))}if(a&&u.push(a),e>1)for(var p=0;p<u.length;p++)u[p].length<=e||(o(u[p],e,1,u[p].length-1,i),u[p]=u[p].slice(0,e));return u}},function(t,e,n){!function(e,n){t.exports=n()}(0,function(){\\\"use strict\\\";function t(t,n,r,o,a){e(t,n,r||0,o||t.length-1,a||i)}function e(t,i,r,o,a){for(;o>r;){if(o-r>600){var s=o-r+1,u=i-r+1,l=Math.log(s),c=.5*Math.exp(2*l/3),p=.5*Math.sqrt(l*c*(s-c)/s)*(u-s/2<0?-1:1);e(t,i,Math.max(r,Math.floor(i-u*c/s+p)),Math.min(o,Math.floor(i+(s-u)*c/s+p)),a)}var f=t[i],h=r,d=o;for(n(t,r,i),a(t[o],f)>0&&n(t,r,o);h<d;){for(n(t,h,d),h++,d--;a(t[h],f)<0;)h++;for(;a(t[d],f)>0;)d--}0===a(t[r],f)?n(t,r,d):(d++,n(t,d,o)),d<=i&&(r=d+1),i<=d&&(o=d-1)}}function n(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}function i(t,e){return t<e?-1:t>e?1:0}return t})},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=r.EXTENT,u=Math.cos(Math.PI/180*37.5),l=Math.pow(2,14)/.5;t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.addLineVertex=function(t,e,n,i,r,o,a){return t.emplaceBack(e.x<<1|i,e.y<<1|r,Math.round(63*n.x)+128,Math.round(63*n.y)+128,1+(0===o?0:o<0?-1:1)|(.5*a&63)<<2,.5*a>>6)},i.prototype.programInterfaces={line:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]}},i.prototype.addFeature=function(t){for(var e=a(t),n=0;n<e.length;n++)this.addLine(e[n],this.layer.layout[\\\"line-join\\\"],this.layer.layout[\\\"line-cap\\\"],this.layer.layout[\\\"line-miter-limit\\\"],this.layer.layout[\\\"line-round-limit\\\"])},i.prototype.addLine=function(t,e,n,i,r){for(var o=t.length;o>2&&t[o-1].equals(t[o-2]);)o--;if(!(t.length<2)){\\\"bevel\\\"===e&&(i=1.05);var a=s/(512*this.overscaling)*15,l=t[0],c=t[o-1],p=l.equals(c);if(this.makeRoomFor(\\\"line\\\",10*o),2!==o||!p){this.distance=0;var f,h,d,y,m,v,g,x=n,b=p?\\\"butt\\\":n,w=!0;this.e1=this.e2=this.e3=-1,p&&(f=t[o-2],m=l.sub(f)._unit()._perp());for(var k=0;k<o;k++)if(!(d=p&&k===o-1?t[1]:t[k+1])||!t[k].equals(d)){m&&(y=m),f&&(h=f),f=t[k],m=d?d.sub(f)._unit()._perp():y,y=y||m;var _=y.add(m)._unit(),S=_.x*m.x+_.y*m.y,z=1/S,T=S<u&&h&&d;if(T&&k>0){var j=f.dist(h);if(j>2*a){var M=f.sub(f.sub(h)._mult(a/j)._round());this.distance+=M.dist(h),this.addCurrentVertex(M,this.distance,y.mult(1),0,0,!1),h=M}}var I=h&&d,P=I?e:d?x:b;if(I&&\\\"round\\\"===P&&(z<r?P=\\\"miter\\\":z<=2&&(P=\\\"fakeround\\\")),\\\"miter\\\"===P&&z>i&&(P=\\\"bevel\\\"),\\\"bevel\\\"===P&&(z>2&&(P=\\\"flipbevel\\\"),z<i&&(P=\\\"miter\\\")),h&&(this.distance+=f.dist(h)),\\\"miter\\\"===P)_._mult(z),this.addCurrentVertex(f,this.distance,_,0,0,!1);else if(\\\"flipbevel\\\"===P){if(z>100)_=m.clone();else{var E=y.x*m.y-y.y*m.x>0?-1:1,F=z*y.add(m).mag()/y.sub(m).mag();_._perp()._mult(F*E)}this.addCurrentVertex(f,this.distance,_,0,0,!1),this.addCurrentVertex(f,this.distance,_.mult(-1),0,0,!1)}else if(\\\"bevel\\\"===P||\\\"fakeround\\\"===P){var A=y.x*m.y-y.y*m.x>0,V=-Math.sqrt(z*z-1);if(A?(g=0,v=V):(v=0,g=V),w||this.addCurrentVertex(f,this.distance,y,v,g,!1),\\\"fakeround\\\"===P){for(var q,L=Math.floor(8*(.5-(S-.5))),O=0;O<L;O++)q=m.mult((O+1)/(L+1))._add(y)._unit(),this.addPieSliceVertex(f,this.distance,q,A);this.addPieSliceVertex(f,this.distance,_,A);for(var B=L-1;B>=0;B--)q=y.mult((B+1)/(L+1))._add(m)._unit(),this.addPieSliceVertex(f,this.distance,q,A)}d&&this.addCurrentVertex(f,this.distance,m,-v,-g,!1)}else\\\"butt\\\"===P?(w||this.addCurrentVertex(f,this.distance,y,0,0,!1),d&&this.addCurrentVertex(f,this.distance,m,0,0,!1)):\\\"square\\\"===P?(w||(this.addCurrentVertex(f,this.distance,y,1,1,!1),this.e1=this.e2=-1),d&&this.addCurrentVertex(f,this.distance,m,-1,-1,!1)):\\\"round\\\"===P&&(w||(this.addCurrentVertex(f,this.distance,y,0,0,!1),this.addCurrentVertex(f,this.distance,y,1,1,!0),this.e1=this.e2=-1),d&&(this.addCurrentVertex(f,this.distance,m,-1,-1,!0),this.addCurrentVertex(f,this.distance,m,0,0,!1)));if(T&&k<o-1){var C=f.dist(d);if(C>2*a){var D=f.add(d.sub(f)._mult(a/C)._round());this.distance+=D.dist(f),this.addCurrentVertex(D,this.distance,m.mult(1),0,0,!1),f=D}}w=!1}}}},i.prototype.addCurrentVertex=function(t,e,n,i,r,o){var a,s=o?1:0,u=this.arrayGroups.line[this.arrayGroups.line.length-1].layout,c=u.vertex,p=u.element;a=n.clone(),i&&a._sub(n.perp()._mult(i)),this.e3=this.addLineVertex(c,t,a,s,0,i,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,a=n.mult(-1),r&&a._sub(n.perp()._mult(r)),this.e3=this.addLineVertex(c,t,a,s,1,-r,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,e>l/2&&(this.distance=0,this.addCurrentVertex(t,this.distance,n,i,r,o))},i.prototype.addPieSliceVertex=function(t,e,n,i){var r=i?1:0;n=n.mult(i?-1:1);var o=this.arrayGroups.line[this.arrayGroups.line.length-1].layout,a=o.vertex,s=o.element;this.e3=this.addLineVertex(a,t,n,0,r,0,e),this.e1>=0&&this.e2>=0&&s.emplaceBack(this.e1,this.e2,this.e3),i?this.e2=this.e3:this.e1=this.e3}},function(t,e,n){\\\"use strict\\\";function i(){r.apply(this,arguments)}var r=n(4),o=n(0),a=n(7),s=r.EXTENT;t.exports=i,i.prototype=o.inherit(r,{}),i.prototype.addCircleVertex=function(t,e,n,i,r){return t.emplaceBack(2*e+(i+1)/2,2*n+(r+1)/2)},i.prototype.programInterfaces={circle:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}],paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"circle-color\\\",e,n)},multiplier:255,paintProperty:\\\"circle-color\\\"},{name:\\\"a_radius\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-radius\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-radius\\\"},{name:\\\"a_blur\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-blur\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-blur\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"circle-opacity\\\"}]}},i.prototype.addFeature=function(t){for(var e={zoom:this.zoom},n=a(t),i=this.makeRoomFor(\\\"circle\\\",0),r=i.layout.vertex.length,o=0;o<n.length;o++)for(var u=0;u<n[o].length;u++){var l=n[o][u].x,c=n[o][u].y;if(!(l<0||l>=s||c<0||c>=s)){var p=this.makeRoomFor(\\\"circle\\\",4),f=p.layout.vertex,h=this.addCircleVertex(f,l,c,-1,-1);this.addCircleVertex(f,l,c,1,-1),this.addCircleVertex(f,l,c,1,1),this.addCircleVertex(f,l,c,-1,1),p.layout.element.emplaceBack(h,h+1,h+2),p.layout.element.emplaceBack(h,h+3,h+2)}}this.populatePaintArrays(\\\"circle\\\",e,t.properties,i,r)}},function(t,e,n){\\\"use strict\\\";function i(t){a.apply(this,arguments),this.showCollisionBoxes=t.showCollisionBoxes,this.overscaling=t.overscaling,this.collisionBoxArray=t.collisionBoxArray,this.symbolQuadsArray=t.symbolQuadsArray,this.symbolInstancesArray=t.symbolInstancesArray,this.sdfIcons=t.sdfIcons,this.iconsNeedLinear=t.iconsNeedLinear,this.adjustedTextSize=t.adjustedTextSize,this.adjustedIconSize=t.adjustedIconSize,this.fontstack=t.fontstack}function r(t,e,n,i,r,o,a,s,u,l){return t.emplaceBack(e,n,Math.round(64*i),Math.round(64*r),o/4,a/4,10*(l||0),0,10*(s||0),10*Math.min(u||25,25))}var o=n(2),a=n(4),s=n(19),u=n(61),l=n(21),c=n(22),p=n(63),f=n(64),h=n(65),d=n(66),y=n(0),m=n(7),v=n(67),g=p.shapeText,x=p.shapeIcon,b=c.getGlyphQuads,w=c.getIconQuads,k=a.EXTENT;t.exports=i,i.prototype=y.inherit(a,{}),i.prototype.serialize=function(){var t=a.prototype.serialize.apply(this);return t.sdfIcons=this.sdfIcons,t.iconsNeedLinear=this.iconsNeedLinear,t.adjustedTextSize=this.adjustedTextSize,t.adjustedIconSize=this.adjustedIconSize,t.fontstack=this.fontstack,t};var _=[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_offset\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data1\\\",components:4,type:\\\"Uint8\\\"},{name:\\\"a_data2\\\",components:2,type:\\\"Uint8\\\"}];i.prototype.addCollisionBoxVertex=function(t,e,n,i,r){return t.emplaceBack(e.x,e.y,Math.round(n.x),Math.round(n.y),10*i,10*r)},i.prototype.programInterfaces={glyph:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:_},icon:{vertexBuffer:!0,elementBuffer:!0,layoutAttributes:_},collisionBox:{vertexBuffer:!0,layoutAttributes:[{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_extrude\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:2,type:\\\"Uint8\\\"}]}},i.prototype.populateBuffers=function(t,e,n){var i={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};this.adjustedTextMaxSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:18,zoomHistory:i}),this.adjustedTextSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:this.zoom+1,zoomHistory:i}),this.adjustedIconMaxSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:18,zoomHistory:i}),this.adjustedIconSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:this.zoom+1,zoomHistory:i});var r=512*this.overscaling;this.tilePixelRatio=k/r,this.compareText={},this.iconsNeedLinear=!1,this.symbolInstancesStartIndex=this.symbolInstancesArray.length;var o=this.layer.layout,a=this.features,s=this.textFeatures,u=.5,c=.5;switch(o[\\\"text-anchor\\\"]){case\\\"right\\\":case\\\"top-right\\\":case\\\"bottom-right\\\":u=1;break;case\\\"left\\\":case\\\"top-left\\\":case\\\"bottom-left\\\":u=0}switch(o[\\\"text-anchor\\\"]){case\\\"bottom\\\":case\\\"bottom-right\\\":case\\\"bottom-left\\\":c=1;break;case\\\"top\\\":case\\\"top-right\\\":case\\\"top-left\\\":c=0}for(var p=\\\"right\\\"===o[\\\"text-justify\\\"]?1:\\\"left\\\"===o[\\\"text-justify\\\"]?0:.5,f=24*o[\\\"text-line-height\\\"],d=\\\"line\\\"!==o[\\\"symbol-placement\\\"]?24*o[\\\"text-max-width\\\"]:0,v=24*o[\\\"text-letter-spacing\\\"],b=[24*o[\\\"text-offset\\\"][0],24*o[\\\"text-offset\\\"][1]],w=this.fontstack=o[\\\"text-font\\\"].join(\\\",\\\"),_=[],S=0;S<a.length;S++)_.push(m(a[S]));if(\\\"line\\\"===o[\\\"symbol-placement\\\"]){var z=h(a,s,_);_=z.geometries,a=z.features,s=z.textFeatures}for(var T,j,M=0;M<a.length;M++)if(_[M]){if(T=s[M]?g(s[M],e[w],d,f,u,c,p,v,b):null,o[\\\"icon-image\\\"]){var I=l(a[M].properties,o[\\\"icon-image\\\"]),P=n[I];j=x(P,o),P&&(void 0===this.sdfIcons?this.sdfIcons=P.sdf:this.sdfIcons!==P.sdf&&y.warnOnce(\\\"Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer\\\"),1!==P.pixelRatio&&(this.iconsNeedLinear=!0))}else j=null;(T||j)&&this.addFeature(_[M],T,j,a[M].index)}this.symbolInstancesEndIndex=this.symbolInstancesArray.length,this.placeFeatures(t,this.showCollisionBoxes),this.trimArrays()},i.prototype.addFeature=function(t,e,n,i){var r=this.layer.layout,o=this.adjustedTextSize/24,a=void 0!==this.adjustedTextMaxSize?this.adjustedTextMaxSize:this.adjustedTextSize,l=this.tilePixelRatio*o,c=this.tilePixelRatio*a/24,p=this.tilePixelRatio*this.adjustedIconSize,f=this.tilePixelRatio*r[\\\"symbol-spacing\\\"],h=r[\\\"symbol-avoid-edges\\\"],y=r[\\\"text-padding\\\"]*this.tilePixelRatio,m=r[\\\"icon-padding\\\"]*this.tilePixelRatio,v=r[\\\"text-max-angle\\\"]/180*Math.PI,g=\\\"map\\\"===r[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===r[\\\"symbol-placement\\\"],x=\\\"map\\\"===r[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===r[\\\"symbol-placement\\\"],b=r[\\\"text-allow-overlap\\\"]||r[\\\"icon-allow-overlap\\\"]||r[\\\"text-ignore-placement\\\"]||r[\\\"icon-ignore-placement\\\"],w=\\\"line\\\"===r[\\\"symbol-placement\\\"],_=f/2;w&&(t=d(t,0,0,k,k));for(var S=0;S<t.length;S++){var z,T=t[S];z=w?u(T,f,v,e,n,24,c,this.overscaling,k):[new s(T[0].x,T[0].y,0)];for(var j=0,M=z.length;j<M;j++){var I=z[j];if(!(e&&w&&this.anchorIsTooClose(e.text,_,I))){var P=!(I.x<0||I.x>k||I.y<0||I.y>k);if(!h||P){var E=P||b;this.addSymbolInstance(I,T,e,n,r,E,this.symbolInstancesArray.length,this.collisionBoxArray,i,this.sourceLayerIndex,this.index,l,y,g,p,m,x)}}}}},i.prototype.anchorIsTooClose=function(t,e,n){var i=this.compareText;if(t in i){for(var r=i[t],o=r.length-1;o>=0;o--)if(n.dist(r[o])<e)return!0}else i[t]=[];return i[t].push(n),!1},i.prototype.placeFeatures=function(t,e){this.recalculateStyleLayers(),this.createArrays();var n=this.layer.layout,i=t.maxScale,r=\\\"map\\\"===n[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"],o=\\\"map\\\"===n[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"];if(n[\\\"text-allow-overlap\\\"]||n[\\\"icon-allow-overlap\\\"]||n[\\\"text-ignore-placement\\\"]||n[\\\"icon-ignore-placement\\\"]){var a=this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex,this.symbolInstancesEndIndex),s=t.angle,u=Math.sin(s),l=Math.cos(s);this.sortedSymbolInstances=a.sort(function(t,e){return(u*t.anchorPointX+l*t.anchorPointY|0)-(u*e.anchorPointX+l*e.anchorPointY|0)||e.index-t.index})}for(var c=this.symbolInstancesStartIndex;c<this.symbolInstancesEndIndex;c++){var p=this.sortedSymbolInstances?this.sortedSymbolInstances[c-this.symbolInstancesStartIndex]:this.symbolInstancesArray.get(c),f={boxStartIndex:p.textBoxStartIndex,boxEndIndex:p.textBoxEndIndex},h={boxStartIndex:p.iconBoxStartIndex,boxEndIndex:p.iconBoxEndIndex},d=!(p.textBoxStartIndex===p.textBoxEndIndex),y=!(p.iconBoxStartIndex===p.iconBoxEndIndex),m=n[\\\"text-optional\\\"]||!d,v=n[\\\"icon-optional\\\"]||!y,g=d?t.placeCollisionFeature(f,n[\\\"text-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale,x=y?t.placeCollisionFeature(h,n[\\\"icon-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale;m||v?!v&&g?g=Math.max(x,g):!m&&x&&(x=Math.max(x,g)):x=g=Math.max(x,g),d&&(t.insertCollisionFeature(f,g,n[\\\"text-ignore-placement\\\"]),g<=i&&this.addSymbols(\\\"glyph\\\",p.glyphQuadStartIndex,p.glyphQuadEndIndex,g,n[\\\"text-keep-upright\\\"],r,t.angle)),y&&(t.insertCollisionFeature(h,x,n[\\\"icon-ignore-placement\\\"]),x<=i&&this.addSymbols(\\\"icon\\\",p.iconQuadStartIndex,p.iconQuadEndIndex,x,n[\\\"icon-keep-upright\\\"],o,t.angle))}e&&this.addToDebugBuffers(t)},i.prototype.addSymbols=function(t,e,n,i,o,a,s){for(var u=this.makeRoomFor(t,4*(n-e)),l=u.layout.element,c=u.layout.vertex,p=this.zoom,f=Math.max(Math.log(i)/Math.LN2+p,0),h=e;h<n;h++){var d=this.symbolQuadsArray.get(h).SymbolQuad,y=d.angle,m=(y+s+Math.PI)%(2*Math.PI);if(!(o&&a&&(m<=Math.PI/2||m>3*Math.PI/2))){var v=d.tl,g=d.tr,x=d.bl,b=d.br,w=d.tex,k=d.anchorPoint,_=Math.max(p+Math.log(d.minScale)/Math.LN2,f),S=Math.min(p+Math.log(d.maxScale)/Math.LN2,25);if(!(S<=_)){_===f&&(_=0);var z=r(c,k.x,k.y,v.x,v.y,w.x,w.y,_,S,f);r(c,k.x,k.y,g.x,g.y,w.x+w.w,w.y,_,S,f),r(c,k.x,k.y,x.x,x.y,w.x,w.y+w.h,_,S,f),r(c,k.x,k.y,b.x,b.y,w.x+w.w,w.y+w.h,_,S,f),l.emplaceBack(z,z+1,z+2),l.emplaceBack(z+1,z+2,z+3)}}}},i.prototype.updateIcons=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"icon-image\\\"];if(e)for(var n=0;n<this.features.length;n++){var i=l(this.features[n].properties,e);i&&(t[i]=!0)}},i.prototype.updateFont=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"text-font\\\"],n=t[e]=t[e]||{};this.textFeatures=f(this.features,this.layer.layout,n)},i.prototype.addToDebugBuffers=function(t){for(var e=this.makeRoomFor(\\\"collisionBox\\\",0),n=e.layout.vertex,i=-t.angle,r=t.yStretch,a=this.symbolInstancesStartIndex;a<this.symbolInstancesEndIndex;a++){var s=this.symbolInstancesArray.get(a);s.textCollisionFeature={boxStartIndex:s.textBoxStartIndex,boxEndIndex:s.textBoxEndIndex},s.iconCollisionFeature={boxStartIndex:s.iconBoxStartIndex,boxEndIndex:s.iconBoxEndIndex};for(var u=0;u<2;u++){var l=s[0===u?\\\"textCollisionFeature\\\":\\\"iconCollisionFeature\\\"];if(l)for(var c=l.boxStartIndex;c<l.boxEndIndex;c++){var p=this.collisionBoxArray.get(c),f=p.anchorPoint,h=new o(p.x1,p.y1*r)._rotate(i),d=new o(p.x2,p.y1*r)._rotate(i),y=new o(p.x1,p.y2*r)._rotate(i),m=new o(p.x2,p.y2*r)._rotate(i),v=Math.max(0,Math.min(25,this.zoom+Math.log(p.maxScale)/Math.LN2)),g=Math.max(0,Math.min(25,this.zoom+Math.log(p.placementScale)/Math.LN2));this.addCollisionBoxVertex(n,f,h,v,g),this.addCollisionBoxVertex(n,f,d,v,g),this.addCollisionBoxVertex(n,f,d,v,g),this.addCollisionBoxVertex(n,f,m,v,g),this.addCollisionBoxVertex(n,f,m,v,g),this.addCollisionBoxVertex(n,f,y,v,g),this.addCollisionBoxVertex(n,f,y,v,g),this.addCollisionBoxVertex(n,f,h,v,g)}}}},i.prototype.addSymbolInstance=function(t,e,n,i,r,o,a,s,u,l,c,p,f,h,d,y,m){var g,x,k,_,S,z,T,j;if(n&&(T=o?b(t,n,p,e,r,h):[],S=new v(s,e,t,u,l,c,n,p,f,h,!1)),g=this.symbolQuadsArray.length,T&&T.length)for(var M=0;M<T.length;M++)this.addSymbolQuad(T[M]);x=this.symbolQuadsArray.length;var I=S?S.boxStartIndex:this.collisionBoxArray.length,P=S?S.boxEndIndex:this.collisionBoxArray.length;i&&(j=o?w(t,i,d,e,r,m):[],z=new v(s,e,t,u,l,c,i,d,y,m,!0)),k=this.symbolQuadsArray.length,j&&1===j.length&&this.addSymbolQuad(j[0]),_=this.symbolQuadsArray.length;var E=z?z.boxStartIndex:this.collisionBoxArray.length,F=z?z.boxEndIndex:this.collisionBoxArray.length;return this.symbolInstancesArray.emplaceBack(I,P,E,F,g,x,k,_,t.x,t.y,a)},i.prototype.addSymbolQuad=function(t){return this.symbolQuadsArray.emplaceBack(t.anchorPoint.x,t.anchorPoint.y,t.tl.x,t.tl.y,t.tr.x,t.tr.y,t.bl.x,t.bl.y,t.br.x,t.br.y,t.tex.h,t.tex.w,t.tex.x,t.tex.y,t.angle,t.maxScale,t.minScale)}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a,s,u,l){var c=i?.6*a*s:0,p=Math.max(i?i.right-i.left:0,o?o.right-o.left:0),f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;e-p*s<e/4&&(e=p*s+e/4);var h=2*a;return r(t,f?e/2*u%e:(p/2+h)*s*u%e,e,c,n,p*s,f,!1,l)}function r(t,e,n,i,u,l,c,p,f){for(var h=l/2,d=0,y=0;y<t.length-1;y++)d+=t[y].dist(t[y+1]);for(var m=0,v=e-n,g=[],x=0;x<t.length-1;x++){for(var b=t[x],w=t[x+1],k=b.dist(w),_=w.angleTo(b);v+n<m+k;){v+=n;var S=(v-m)/k,z=o(b.x,w.x,S),T=o(b.y,w.y,S);if(z>=0&&z<f&&T>=0&&T<f&&v-h>=0&&v+h<=d){var j=new a(z,T,_,x)._round();i&&!s(t,j,l,i,u)||g.push(j)}}m+=k}return p||g.length||c||(g=r(t,m/2,n,i,u,l,c,!0,f)),g}var o=n(20),a=n(19),s=n(62);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r){if(void 0===e.segment)return!0;for(var o=e,a=e.segment+1,s=0;s>-n/2;){if(--a<0)return!1;s-=t[a].dist(o),o=t[a]}s+=t[a].dist(t[a+1]),a++;for(var u=[],l=0;s<n/2;){var c=t[a-1],p=t[a],f=t[a+1];if(!f)return!1;var h=c.angleTo(p)-p.angleTo(f);for(h=Math.abs((h+3*Math.PI)%(2*Math.PI)-Math.PI),u.push({distance:s,angleDelta:h}),l+=h;s-u[0].distance>i;)l-=u.shift().angleDelta;if(l>r)return!1;a++,s+=p.dist(f)}return!0}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.codePoint=t,this.x=e,this.y=n,this.glyph=i}function r(t,e,n,i,r,o){this.positionedGlyphs=t,this.text=e,this.top=n,this.bottom=i,this.left=r,this.right=o}function o(t,e,n,o,s,u,l,c,p){for(var f=[],h=new r(f,t,p[1],p[1],p[0],p[0]),d=0,y=0;y<t.length;y++){var m=t.charCodeAt(y),v=e[m];v&&(f.push(new i(m,d,-17,v)),d+=v.advance+c)}return!!f.length&&(a(h,e,o,n,s,u,l,p),h)}function a(t,e,n,i,r,o,a,l){var c=null,h=0,d=0,y=0,m=0,v=t.positionedGlyphs;if(i)for(var g=0;g<v.length;g++){var x=v[g];if(x.x-=h,x.y+=n*y,x.x>i&&null!==c){var b=v[c+1].x;m=Math.max(b,m);for(var w=c+1;w<=g;w++)v[w].y+=n,v[w].x-=b;if(a){var k=c;p[v[c].codePoint]&&k--,s(v,e,d,k,a)}d=c+1,c=null,h+=b,y++}f[x.codePoint]&&(c=g)}var _=v[v.length-1],S=_.x+e[_.codePoint].advance;m=Math.max(m,S);var z=(y+1)*n;s(v,e,d,v.length-1,a),u(v,a,r,o,m,n,y,l),t.top+=-o*z,t.bottom=t.top+z,t.left+=-r*m,t.right=t.left+m}function s(t,e,n,i,r){for(var o=e[t[i].codePoint].advance,a=(t[i].x+o)*r,s=n;s<=i;s++)t[s].x-=a}function u(t,e,n,i,r,o,a,s){for(var u=(e-n)*r+s[0],l=(-i*(a+1)+.5)*o+s[1],c=0;c<t.length;c++)t[c].x+=u,t[c].y+=l}function l(t,e){if(!t||!t.rect)return null;var n=e[\\\"icon-offset\\\"][0],i=e[\\\"icon-offset\\\"][1],r=n-t.width/2,o=r+t.width,a=i-t.height/2;return new c(t,a,a+t.height,r,o)}function c(t,e,n,i,r){this.image=t,this.top=e,this.bottom=n,this.left=i,this.right=r}t.exports={shapeText:o,shapeIcon:l};var p={32:!0,8203:!0},f={32:!0,38:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){for(var i=[],o=0,a=t.length;o<a;o++){var s=r(t[o].properties,e[\\\"text-field\\\"]);if(s){s=s.toString();var u=e[\\\"text-transform\\\"];\\\"uppercase\\\"===u?s=s.toLocaleUpperCase():\\\"lowercase\\\"===u&&(s=s.toLocaleLowerCase());for(var l=0;l<s.length;l++)n[s.charCodeAt(l)]=!0;i[o]=s}else i[o]=null}return i}var r=n(21);t.exports=i},function(t,e,n){\\\"use strict\\\";t.exports=function(t,e,n){function i(i){c.push(t[i]),p.push(n[i]),f.push(e[i]),h++}function r(t,e,n){var i=l[t];return delete l[t],l[e]=i,p[i][0].pop(),p[i][0]=p[i][0].concat(n[0]),i}function o(t,e,n){var i=u[e];return delete u[e],u[t]=i,p[i][0].shift(),p[i][0]=n[0].concat(p[i][0]),i}function a(t,e,n){var i=n?e[0][e[0].length-1]:e[0][0];return t+\\\":\\\"+i.x+\\\":\\\"+i.y}var s,u={},l={},c=[],p=[],f=[],h=0;for(s=0;s<t.length;s++){var d=n[s],y=e[s];if(y){var m=a(y,d),v=a(y,d,!0);if(m in l&&v in u&&l[m]!==u[v]){var g=o(m,v,d),x=r(m,v,p[g]);delete u[m],delete l[v],l[a(y,p[x],!0)]=x,p[g]=null}else m in l?r(m,v,d):v in u?o(m,v,d):(i(s),u[m]=h-1,l[v]=h-1)}else i(s)}return{features:c,textFeatures:f,geometries:p}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){for(var a=[],s=0;s<t.length;s++)for(var u,l=t[s],c=0;c<l.length-1;c++){var p=l[c],f=l[c+1];p.x<e&&f.x<e||(p.x<e?p=new r(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round():f.x<e&&(f=new r(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round()),p.y<n&&f.y<n||(p.y<n?p=new r(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round():f.y<n&&(f=new r(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round()),p.x>=i&&f.x>=i||(p.x>=i?p=new r(i,p.y+(f.y-p.y)*((i-p.x)/(f.x-p.x)))._round():f.x>=i&&(f=new r(i,p.y+(f.y-p.y)*((i-p.x)/(f.x-p.x)))._round()),p.y>=o&&f.y>=o||(p.y>=o?p=new r(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round():f.y>=o&&(f=new r(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round()),u&&p.equals(u[u.length-1])||(u=[p],a.push(u)),u.push(f)))))}return a}var r=n(2);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a,s,u,l,c){var p=a.top*s-u,f=a.bottom*s+u,h=a.left*s-u,d=a.right*s+u;if(this.boxStartIndex=t.length,l){var y=f-p,m=d-h;if(y>0)if(y=Math.max(10*s,y),c){var v=e[n.segment+1].sub(e[n.segment])._unit()._mult(m),g=[n.sub(v),n.add(v)];this._addLineCollisionBoxes(t,g,n,0,m,y,i,r,o)}else this._addLineCollisionBoxes(t,e,n,n.segment,m,y,i,r,o)}else t.emplaceBack(n.x,n.y,h,p,d,f,1/0,i,r,o,0,0,0,0,0);this.boxEndIndex=t.length}t.exports=i,i.prototype._addLineCollisionBoxes=function(t,e,n,i,r,o,a,s,u){var l=o/2,c=Math.floor(r/l),p=-o/2,f=this.boxes,h=n,d=i+1,y=p;do{if(--d<0)return f;y-=e[d].dist(h),h=e[d]}while(y>-r/2);for(var m=e[d].dist(e[d+1]),v=0;v<c;v++){for(var g=-r/2+v*l;y+m<g;){if(y+=m,++d+1>=e.length)return f;m=e[d].dist(e[d+1])}var x=g-y,b=e[d],w=e[d+1],k=w.sub(b)._unit()._mult(x)._add(b)._round(),_=Math.max(Math.abs(g-p)-l/2,0),S=r/2/_;t.emplaceBack(k.x,k.y,-o/2,-o/2,o/2,o/2,S,a,s,u,0,0,0,0,0)}return f}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.layers=t.readFields(r,{},e)}function r(t,e,n){if(3===t){var i=new o(n,n.readVarint()+n.pos);i.length&&(e[i.name]=i)}}var o=n(25);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t){var e;t&&t.length&&(e=t,t=e.length);var n=new Uint8Array(t||0);return e&&n.set(e),n.readUInt32LE=o.readUInt32LE,n.writeUInt32LE=o.writeUInt32LE,n.readInt32LE=o.readInt32LE,n.writeInt32LE=o.writeInt32LE,n.readFloatLE=o.readFloatLE,n.writeFloatLE=o.writeFloatLE,n.readDoubleLE=o.readDoubleLE,n.writeDoubleLE=o.writeDoubleLE,n.toString=o.toString,n.write=o.write,n.slice=o.slice,n.copy=o.copy,n._isBuffer=!0,n}function r(t){for(var e,n,i=t.length,r=[],o=0;o<i;o++){if((e=t.charCodeAt(o))>55295&&e<57344){if(!n){e>56319||o+1===i?r.push(239,191,189):n=e;continue}if(e<56320){r.push(239,191,189),n=e;continue}e=n-55296<<10|e-56320|65536,n=null}else n&&(r.push(239,191,189),n=null);e<128?r.push(e):e<2048?r.push(e>>6|192,63&e|128):e<65536?r.push(e>>12|224,e>>6&63|128,63&e|128):r.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return r}t.exports=i;var o,a,s,u=n(70);o={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return u.read(this,t,!0,23,4)},readDoubleLE:function(t){return u.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return u.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return u.write(this,t,e,!0,52,8)},toString:function(t,e,n){var i=\\\"\\\",r=\\\"\\\";e=e||0,n=Math.min(this.length,n||this.length);for(var o=e;o<n;o++){var a=this[o];a<=127?(i+=decodeURIComponent(r)+String.fromCharCode(a),r=\\\"\\\"):r+=\\\"%\\\"+a.toString(16)}return i+=decodeURIComponent(r)},write:function(t,e){for(var n=t===a?s:r(t),i=0;i<n.length;i++)this[e+i]=n[i]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var n=0;n<this.length;n++)t[e+n]=this[n]}},o.writeInt32LE=o.writeUInt32LE,i.byteLength=function(t){return a=t,s=r(t),s.length},i.isBuffer=function(t){return!(!t||!t._isBuffer)}},function(t,e){e.read=function(t,e,n,i,r){var o,a,s=8*r-i-1,u=(1<<s)-1,l=u>>1,c=-7,p=n?r-1:0,f=n?-1:1,h=t[e+p];for(p+=f,o=h&(1<<-c)-1,h>>=-c,c+=s;c>0;o=256*o+t[e+p],p+=f,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=i;c>0;a=256*a+t[e+p],p+=f,c-=8);if(0===o)o=1-l;else{if(o===u)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,i),o-=l}return(h?-1:1)*a*Math.pow(2,o-i)},e.write=function(t,e,n,i,r,o){var a,s,u,l=8*o-r-1,c=(1<<l)-1,p=c>>1,f=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,h=i?0:o-1,d=i?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),e+=a+p>=1?f/u:f*Math.pow(2,1-p),e*u>=2&&(a++,u/=2),a+p>=c?(s=0,a=c):a+p>=1?(s=(e*u-1)*Math.pow(2,r),a+=p):(s=e*Math.pow(2,p-1)*Math.pow(2,r),a=0));r>=8;t[n+h]=255&s,h+=d,s/=256,r-=8);for(a=a<<r|s,l+=r;l>0;t[n+h]=255&a,h+=d,a/=256,l-=8);t[n+h-d]|=128*y}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this._vectorTileFeature=t,t._z=e,t._x=n,t._y=i,this.properties=t.properties,t._id&&(this.id=t._id)}t.exports=i,i.prototype={type:\\\"Feature\\\",get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},set geometry(t){this._geometry=t},toJSON:function(){var t={};for(var e in this)\\\"_geometry\\\"!==e&&\\\"_vectorTileFeature\\\"!==e&&\\\"toJSON\\\"!==e&&(t[e]=this[e]);return t}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){for(var i=0;i<t.length;i++)for(var r=t[i],o=0;o<e.length;o++)for(var a=e[o],s=0;s<a.length;s++){var u=a[s];if(h(r,u))return!0;if(c(u,r,n))return!0}return!1}function r(t,e){if(1===t.length&&1===t[0].length)return f(e,t[0][0]);for(var n=0;n<e.length;n++)for(var i=e[n],r=0;r<i.length;r++)if(f(t,i[r]))return!0;for(var o=0;o<t.length;o++){for(var a=t[o],u=0;u<a.length;u++)if(f(e,a[u]))return!0;for(var l=0;l<e.length;l++)if(s(a,e[l]))return!0}return!1}function o(t,e,n){for(var i=0;i<e.length;i++)for(var r=e[i],o=0;o<t.length;o++){var s=t[o];if(s.length>=3)for(var u=0;u<r.length;u++)if(h(s,r[u]))return!0;if(a(s,r,n))return!0}return!1}function a(t,e,n){if(t.length>1){if(s(t,e))return!0;for(var i=0;i<e.length;i++)if(c(e[i],t,n))return!0}for(var r=0;r<t.length;r++)if(c(t[r],e,n))return!0;return!1}function s(t,e){for(var n=0;n<t.length-1;n++)for(var i=t[n],r=t[n+1],o=0;o<e.length-1;o++){var a=e[o],s=e[o+1];if(l(i,r,a,s))return!0}return!1}function u(t,e,n){return(n.y-t.y)*(e.x-t.x)>(e.y-t.y)*(n.x-t.x)}function l(t,e,n,i){return u(t,n,i)!==u(e,n,i)&&u(t,e,n)!==u(t,e,i)}function c(t,e,n){var i=n*n;if(1===e.length)return t.distSqr(e[0])<i;for(var r=1;r<e.length;r++){if(p(t,e[r-1],e[r])<i)return!0}return!1}function p(t,e,n){var i=e.distSqr(n);if(0===i)return t.distSqr(e);var r=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/i;return r<0?t.distSqr(e):r>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(r)._add(e))}function f(t,e){for(var n,i,r,o=!1,a=0;a<t.length;a++){n=t[a];for(var s=0,u=n.length-1;s<n.length;u=s++)i=n[s],r=n[u],i.y>e.y!=r.y>e.y&&e.x<(r.x-i.x)*(e.y-i.y)/(r.y-i.y)+i.x&&(o=!o)}return o}function h(t,e){for(var n=!1,i=0,r=t.length-1;i<t.length;r=i++){var o=t[i],a=t[r];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}t.exports={multiPolygonIntersectsBufferedMultiPoint:i,multiPolygonIntersectsMultiPolygon:r,multiPolygonIntersectsBufferedMultiLine:o}},function(t,e,n){\\\"use strict\\\";function i(t,e,n){if(\\\"object\\\"==typeof t){var i=t;n=e,t=i.angle,e=i.pitch,this.grid=new a(i.grid),this.ignoredGrid=new a(i.ignoredGrid)}else this.grid=new a(o,12,6),this.ignoredGrid=new a(o,12,0);this.angle=t,this.pitch=e;var r=Math.sin(t),s=Math.cos(t);if(this.rotationMatrix=[s,-r,r,s],this.reverseRotationMatrix=[s,r,-r,s],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=n,0===n.length){n.emplaceBack();n.emplaceBack(0,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(o,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,0,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,o,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=n.get(0),this.edges=[n.get(1),n.get(2),n.get(3),n.get(4)]}var r=n(2),o=n(4).EXTENT,a=n(23);t.exports=i,i.prototype.serialize=function(){var t={angle:this.angle,pitch:this.pitch,grid:this.grid.toArrayBuffer(),ignoredGrid:this.ignoredGrid.toArrayBuffer()};return{data:t,transferables:[t.grid,t.ignoredGrid]}},i.prototype.minScale=.25,i.prototype.maxScale=2,i.prototype.placeCollisionFeature=function(t,e,n){for(var i=this.collisionBoxArray,o=this.minScale,a=this.rotationMatrix,s=this.yStretch,u=t.boxStartIndex;u<t.boxEndIndex;u++){var l=i.get(u),c=l.anchorPoint._matMult(a),p=c.x,f=c.y,h=p+l.x1,d=f+l.y1*s,y=p+l.x2,m=f+l.y2*s;if(l.bbox0=h,l.bbox1=d,l.bbox2=y,l.bbox3=m,!e)for(var v=this.grid.query(h,d,y,m),g=0;g<v.length;g++){var x=i.get(v[g]),b=x.anchorPoint._matMult(a);if((o=this.getPlacementScale(o,c,l,b,x))>=this.maxScale)return o}if(n){var w;if(this.angle){var k=this.reverseRotationMatrix,_=new r(l.x1,l.y1).matMult(k),S=new r(l.x2,l.y1).matMult(k),z=new r(l.x1,l.y2).matMult(k),T=new r(l.x2,l.y2).matMult(k);w=this.tempCollisionBox,w.anchorPointX=l.anchorPoint.x,w.anchorPointY=l.anchorPoint.y,w.x1=Math.min(_.x,S.x,z.x,T.x),w.y1=Math.min(_.y,S.x,z.x,T.x),w.x2=Math.max(_.x,S.x,z.x,T.x),w.y2=Math.max(_.y,S.x,z.x,T.x),w.maxScale=l.maxScale}else w=l;for(var j=0;j<this.edges.length;j++){var M=this.edges[j];if((o=this.getPlacementScale(o,l.anchorPoint,w,M.anchorPoint,M))>=this.maxScale)return o}}}return o},i.prototype.queryRenderedSymbols=function(t,e,n,i,o){var a={},s=[],u=this.collisionBoxArray,l=this.rotationMatrix,c=new r(t,e)._matMult(l),p=this.tempCollisionBox;p.anchorX=c.x,p.anchorY=c.y,p.x1=0,p.y1=0,p.x2=n-t,p.y2=i-e,p.maxScale=o,o=p.maxScale;for(var f=[c.x+p.x1/o,c.y+p.y1/o*this.yStretch,c.x+p.x2/o,c.y+p.y2/o*this.yStretch],h=this.grid.query(f[0],f[1],f[2],f[3]),d=this.ignoredGrid.query(f[0],f[1],f[2],f[3]),y=0;y<d.length;y++)h.push(d[y]);for(var m=0;m<h.length;m++){var v=u.get(h[m]),g=v.sourceLayerIndex,x=v.featureIndex;if(void 0===a[g]&&(a[g]={}),!a[g][x]){var b=v.anchorPoint.matMult(l);this.getPlacementScale(this.minScale,c,p,b,v)>=o&&(a[g][x]=!0,s.push(h[m]))}}return s},i.prototype.getPlacementScale=function(t,e,n,i,r){var o=e.x-i.x,a=e.y-i.y,s=(r.x1-n.x2)/o,u=(r.x2-n.x1)/o,l=(r.y1-n.y2)*this.yStretch/a,c=(r.y2-n.y1)*this.yStretch/a;(isNaN(s)||isNaN(u))&&(s=u=1),(isNaN(l)||isNaN(c))&&(l=c=1);var p=Math.min(Math.max(s,u),Math.max(l,c)),f=r.maxScale,h=n.maxScale;return p>f&&(p=f),p>h&&(p=h),p>t&&p>=r.placementScale&&(t=p),t},i.prototype.insertCollisionFeature=function(t,e,n){for(var i=n?this.ignoredGrid:this.grid,r=this.collisionBoxArray,o=t.boxStartIndex;o<t.boxEndIndex;o++){var a=r.get(o);a.placementScale=e,e<this.maxScale&&i.insert(o,a.bbox0,a.bbox1,a.bbox2,a.bbox3)}}},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=t.exports=new i({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int16\\\",name:\\\"x1\\\"},{type:\\\"Int16\\\",name:\\\"y1\\\"},{type:\\\"Int16\\\",name:\\\"x2\\\"},{type:\\\"Int16\\\",name:\\\"y2\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"},{type:\\\"Int16\\\",name:\\\"bbox0\\\"},{type:\\\"Int16\\\",name:\\\"bbox1\\\"},{type:\\\"Int16\\\",name:\\\"bbox2\\\"},{type:\\\"Int16\\\",name:\\\"bbox3\\\"},{type:\\\"Float32\\\",name:\\\"placementScale\\\"}]});r.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=t.exports=new i({members:[{type:\\\"Uint16\\\",name:\\\"textBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"textBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadEndIndex\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int8\\\",name:\\\"index\\\"}]});r.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var i=n(8),r=n(0),o=n(2),a=n(22).SymbolQuad,s=t.exports=new i({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Float32\\\",name:\\\"tlX\\\"},{type:\\\"Float32\\\",name:\\\"tlY\\\"},{type:\\\"Float32\\\",name:\\\"trX\\\"},{type:\\\"Float32\\\",name:\\\"trY\\\"},{type:\\\"Float32\\\",name:\\\"blX\\\"},{type:\\\"Float32\\\",name:\\\"blY\\\"},{type:\\\"Float32\\\",name:\\\"brX\\\"},{type:\\\"Float32\\\",name:\\\"brY\\\"},{type:\\\"Int16\\\",name:\\\"texH\\\"},{type:\\\"Int16\\\",name:\\\"texW\\\"},{type:\\\"Int16\\\",name:\\\"texX\\\"},{type:\\\"Int16\\\",name:\\\"texY\\\"},{type:\\\"Float32\\\",name:\\\"angle\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Float32\\\",name:\\\"minScale\\\"}]});r.extendAll(s.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)},get SymbolQuad(){return new a(this.anchorPoint,new o(this.tlX,this.tlY),new o(this.trX,this.trY),new o(this.blX,this.blY),new o(this.brX,this.brY),{x:this.texX,y:this.texY,h:this.texH,w:this.texW,height:this.texH,width:this.texW},this.angle,this.minScale,this.maxScale)}})},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i){this.declaration=e,this.startTime=this.endTime=(new Date).getTime(),\\\"piecewise-constant\\\"===t.function&&t.transition?this.interp=r:this.interp=a[t.type],this.oldTransition=n,this.duration=i.duration||0,this.delay=i.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=o.easeCubicInOut),n&&n.endTime<=this.startTime&&delete n.oldTransition}function r(t,e,n){return void 0===(t&&t.to)||void 0===(e&&e.to)?void 0:{from:t.to,fromScale:t.toScale,to:e.to,toScale:e.toScale,t:n}}var o=n(0),a=n(20);t.exports=i,i.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},i.prototype.calculate=function(t,e){var n=this.declaration.calculate(o.extend({},t,{duration:this.duration}),e);if(this.instant())return n;var i=t.time||Date.now();if(i<this.endTime){var r=this.oldTransition.calculate(o.extend({},t,{time:this.startTime}),e),a=this.ease((i-this.startTime-this.delay)/this.duration);n=this.interp(r,n,a)}return n}},function(t,e,n){\\\"use strict\\\";function i(t,e){this.type=t.type,this.transitionable=t.transition,this.value=s.clone(e),this.isFunction=o.isFunctionDefinition(e),this.json=JSON.stringify(this.value);var n=\\\"color\\\"===this.type?a(this.value):e;if(this.calculate=o[t.function||\\\"piecewise-constant\\\"](n),this.isFeatureConstant=this.calculate.isFeatureConstant,this.isZoomConstant=this.calculate.isZoomConstant,\\\"piecewise-constant\\\"===t.function&&t.transition&&(this.calculate=r(this.calculate)),!this.isFeatureConstant&&!this.isZoomConstant){this.stopZoomLevels=[];for(var i=[],u=this.value.stops,l=0;l<this.value.stops.length;l++){var c=u[l][0].zoom;this.stopZoomLevels.indexOf(c)<0&&(this.stopZoomLevels.push(c),i.push([c,i.length]))}this.calculateInterpolationT=o.interpolated({stops:i,base:e.base})}}function r(t){return function(e,n){var i,r,o,a=e.zoom,s=e.zoomHistory,u=e.duration,l=a%1,c=Math.min((Date.now()-s.lastIntegerZoomTime)/u,1),p=1;return a>s.lastIntegerZoom?(i=l+(1-l)*c,p*=2,r=t({zoom:a-1},n),o=t({zoom:a},n)):(i=1-(1-c)*l,o=t({zoom:a},n),r=t({zoom:a+1},n),p/=2),void 0===r||void 0===o?void 0:{from:r,fromScale:p,to:o,toScale:1,t:i}}}var o=n(27),a=n(28),s=n(0);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){var n;if(p(t)){var u,l=t.stops&&\\\"object\\\"==typeof t.stops[0][0],c=l||void 0!==t.property,f=l||!c,h=t.type||e||\\\"exponential\\\";if(\\\"exponential\\\"===h)u=a;else if(\\\"interval\\\"===h)u=o;else if(\\\"categorical\\\"===h)u=r;else{if(\\\"identity\\\"!==h)throw new Error('Unknown function type \\\"'+h+'\\\"');u=s}if(l){for(var d={},y=[],m=0;m<t.stops.length;m++){var v=t.stops[m];void 0===d[v[0].zoom]&&(d[v[0].zoom]={zoom:v[0].zoom,type:t.type,property:t.property,stops:[]}),d[v[0].zoom].stops.push([v[0].value,v[1]])}for(var g in d)y.push([d[g].zoom,i(d[g])]);n=function(e,n){return a({stops:y,base:t.base},e)(e,n)},n.isFeatureConstant=!1,n.isZoomConstant=!1}else f?(n=function(e){return u(t,e)},n.isFeatureConstant=!0,n.isZoomConstant=!1):(n=function(e,n){return u(t,n[t.property])},n.isFeatureConstant=!1,n.isZoomConstant=!0)}else n=function(){return t},n.isFeatureConstant=!0,n.isZoomConstant=!0;return n}function r(t,e){for(var n=0;n<t.stops.length;n++)if(e===t.stops[n][0])return t.stops[n][1];return t.stops[0][1]}function o(t,e){for(var n=0;n<t.stops.length&&!(e<t.stops[n][0]);n++);return t.stops[Math.max(n-1,0)][1]}function a(t,e){for(var n=void 0!==t.base?t.base:1,i=0;;){if(i>=t.stops.length)break;if(e<=t.stops[i][0])break;i++}return 0===i?t.stops[i][1]:i===t.stops.length?t.stops[i-1][1]:u(e,n,t.stops[i-1][0],t.stops[i][0],t.stops[i-1][1],t.stops[i][1])}function s(t,e){return e}function u(t,e,n,i,r,o){return\\\"function\\\"==typeof r?function(){var a=r.apply(void 0,arguments),s=o.apply(void 0,arguments);return u(t,e,n,i,a,s)}:r.length?c(t,e,n,i,r,o):l(t,e,n,i,r,o)}function l(t,e,n,i,r,o){var a,s=i-n,u=t-n;return a=1===e?u/s:(Math.pow(e,u)-1)/(Math.pow(e,s)-1),r*(1-a)+o*a}function c(t,e,n,i,r,o){for(var a=[],s=0;s<r.length;s++)a[s]=l(t,e,n,i,r[s],o[s]);return a}function p(t){return\\\"object\\\"==typeof t&&(t.stops||\\\"identity\\\"===t.type)}t.exports.isFunctionDefinition=p,t.exports.interpolated=function(t){return i(t,\\\"exponential\\\")},t.exports[\\\"piecewise-constant\\\"]=function(t){return i(t,\\\"interval\\\")}},function(t,e,n){\\\"use strict\\\";t.exports=n(81)},function(t,e,n){t.exports=n(82)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8],doc:\\\"Style specification version number. Must be 8.\\\",example:8},name:{type:\\\"string\\\",doc:\\\"A human-readable name for the style.\\\",example:\\\"Bright\\\"},metadata:{type:\\\"*\\\",doc:\\\"Arbitrary properties useful to track with the stylesheet, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\\\"},center:{type:\\\"array\\\",value:\\\"number\\\",doc:\\\"Default map center in longitude and latitude.  The style center will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:[-73.9749,40.7736]},zoom:{type:\\\"number\\\",doc:\\\"Default zoom level.  The style zoom will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:12.5},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",doc:\\\"Default bearing, in degrees clockwise from true north.  The style bearing will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:29},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\",doc:\\\"Default pitch, in degrees. Zero is perpendicular to the surface, for a look straight down at the map, while a greater value like 60 looks ahead towards the horizon. The style pitch will be used only if the map has not been positioned by other means (e.g. map options or user interaction).\\\",example:50},light:{type:\\\"light\\\",doc:\\\"The global light source.\\\",example:{anchor:\\\"viewport\\\",color:\\\"white\\\",intensity:.4}},sources:{required:!0,type:\\\"sources\\\",doc:\\\"Data source specifications.\\\",example:{\\\"mapbox-streets\\\":{type:\\\"vector\\\",url:\\\"mapbox://mapbox.mapbox-streets-v6\\\"}}},sprite:{type:\\\"string\\\",doc:\\\"A base URL for retrieving the sprite image and metadata. The extensions `.png`, `.json` and scale factor `@2x.png` will be automatically appended. This property is required if any layer uses the `background-pattern`, `fill-pattern`, `line-pattern`, `fill-extrusion-pattern`, or `icon-image` properties.\\\",example:\\\"mapbox://sprites/mapbox/bright-v8\\\"},glyphs:{type:\\\"string\\\",doc:\\\"A URL template for loading signed-distance-field glyph sets in PBF format. The URL must include `{fontstack}` and `{range}` tokens. This property is required if any layer uses the `text-field` layout property.\\\",example:\\\"mapbox://fonts/mapbox/{fontstack}/{range}.pbf\\\"},transition:{type:\\\"transition\\\",doc:\\\"A global transition definition to use as a default across properties.\\\",example:{duration:300,delay:0}},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\",doc:\\\"Layers will be drawn in the order of this array.\\\",example:[{id:\\\"water\\\",source:\\\"mapbox-streets\\\",\\\"source-layer\\\":\\\"water\\\",type:\\\"fill\\\",paint:{\\\"fill-color\\\":\\\"#00ffff\\\"}}]}},sources:{\\\"*\\\":{type:\\\"source\\\",doc:\\\"Specification of a data source. For vector and raster sources, either TileJSON or a URL to a TileJSON must be provided. For image and video sources, a URL must be provided. For GeoJSON sources, a URL or inline GeoJSON must be provided.\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:{vector:{doc:\\\"A vector tile source.\\\"},raster:{doc:\\\"A raster tile source.\\\"}},doc:\\\"The data type of the tile source.\\\"},url:{type:\\\"string\\\",doc:\\\"A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://<mapid>`.\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\",doc:\\\"An array of one or more tile source URLs, as in the TileJSON spec.\\\"},minzoom:{type:\\\"number\\\",default:0,doc:\\\"Minimum zoom level for which tiles are available, as in the TileJSON spec.\\\"},maxzoom:{type:\\\"number\\\",default:22,doc:\\\"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\\\"},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\",doc:\\\"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\\\"},\\\"*\\\":{type:\\\"*\\\",doc:\\\"Other keys to configure the data source.\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:{geojson:{doc:\\\"A GeoJSON data source.\\\"}},doc:\\\"The data type of the GeoJSON source.\\\"},data:{type:\\\"*\\\",doc:\\\"A URL to a GeoJSON file, or inline GeoJSON.\\\"},maxzoom:{type:\\\"number\\\",default:18,doc:\\\"Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels).\\\"},buffer:{type:\\\"number\\\",default:128,maximum:512,minimum:0,doc:\\\"Size of the tile buffer on each side. A value of 0 produces no buffer. A value of 512 produces a buffer as wide as the tile itself. Larger values produce fewer rendering artifacts near tile edges and slower performance.\\\"},tolerance:{type:\\\"number\\\",default:.375,doc:\\\"Douglas-Peucker simplification tolerance (higher means simpler geometries and faster performance).\\\"},cluster:{type:\\\"boolean\\\",default:!1,doc:\\\"If the data is a collection of point features, setting this to true clusters the points by radius into groups.\\\"},clusterRadius:{type:\\\"number\\\",default:50,minimum:0,doc:\\\"Radius of each cluster if clustering is enabled. A value of 512 indicates a radius equal to the width of a tile.\\\"},clusterMaxZoom:{type:\\\"number\\\",doc:\\\"Max zoom on which to cluster points if clustering is enabled. Defaults to one zoom less than maxzoom (so that last zoom features are not clustered).\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:{video:{doc:\\\"A video data source.\\\"}},doc:\\\"The data type of the video source.\\\"},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\",doc:\\\"URLs to video content in order of preferred format.\\\"},coordinates:{required:!0,doc:\\\"Corners of video specified in longitude, latitude pairs.\\\",type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\",doc:\\\"A single longitude, latitude pair.\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:{image:{doc:\\\"An image data source.\\\"}},doc:\\\"The data type of the image source.\\\"},url:{required:!0,type:\\\"string\\\",doc:\\\"URL that points to an image.\\\"},coordinates:{required:!0,doc:\\\"Corners of image specified in longitude, latitude pairs.\\\",type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\",doc:\\\"A single longitude, latitude pair.\\\"}}},layer:{id:{type:\\\"string\\\",doc:\\\"Unique layer name.\\\",required:!0},type:{type:\\\"enum\\\",values:{fill:{doc:\\\"A filled polygon with an optional stroked border.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},line:{doc:\\\"A stroked line.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},symbol:{doc:\\\"An icon or a text label.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},circle:{doc:\\\"A filled circle.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-extrusion\\\":{doc:\\\"An extruded (3D) polygon.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},raster:{doc:\\\"Raster map textures such as satellite imagery.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},background:{doc:\\\"The background color or pattern of the map.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},doc:\\\"Rendering type of this layer.\\\"},metadata:{type:\\\"*\\\",doc:\\\"Arbitrary properties useful to track with the layer, but do not influence rendering. Properties should be prefixed to avoid collisions, like 'mapbox:'.\\\"},ref:{type:\\\"string\\\",doc:\\\"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient.\\\"},source:{type:\\\"string\\\",doc:\\\"Name of a source description to be used for this layer.\\\"},\\\"source-layer\\\":{type:\\\"string\\\",doc:\\\"Layer to use from a vector tile source. Required if the source supports multiple layers.\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:24,doc:\\\"The minimum zoom level on which the layer gets parsed and appears on.\\\"},maxzoom:{type:\\\"number\\\",minimum:0,maximum:24,doc:\\\"The maximum zoom level on which the layer gets parsed and appears on.\\\"},filter:{type:\\\"filter\\\",doc:\\\"A expression specifying conditions on source features. Only features that match the filter are displayed.\\\"},layout:{type:\\\"layout\\\",doc:\\\"Layout properties for the layer.\\\"},paint:{type:\\\"paint\\\",doc:\\\"Default paint properties for this layer.\\\"},\\\"paint.*\\\":{type:\\\"paint\\\",doc:\\\"[Deprecated] Class-specific paint properties for this layer. The class name is the part after the first dot. Note: class-specific paint properties are deprecated and will be removed in the next version of this spec.\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_fill-extrusion\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_fill:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_circle:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},\\\"layout_fill-extrusion\\\":{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{butt:{doc:\\\"A cap with a squared-off end which is drawn to the exact endpoint of the line.\\\"},round:{doc:\\\"A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\\\"},square:{doc:\\\"A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\\\"}},default:\\\"butt\\\",doc:\\\"The display of line endings.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{bevel:{doc:\\\"A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\\\"},round:{doc:\\\"A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\\\"},miter:{doc:\\\"A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\\\"}},default:\\\"miter\\\",doc:\\\"The display of lines when joining.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Used to automatically convert miter joins to bevel joins for sharp angles.\\\",requires:[{\\\"line-join\\\":\\\"miter\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Used to automatically convert round joins to miter joins for shallow angles.\\\",requires:[{\\\"line-join\\\":\\\"round\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{point:{doc:\\\"The label is placed at the point where the geometry is located.\\\"},line:{doc:\\\"The label is placed along the line of the geometry. Can only be used on `LineString` and `Polygon` geometries.\\\"}},default:\\\"point\\\",doc:\\\"Label placement relative to its geometry.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",doc:\\\"Distance between two symbol anchors.\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the icon will be visible even if it collides with other previously drawn symbols.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, other symbols can be visible even if they collide with the icon.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"When `symbol-placement` is set to `point`, aligns icons east-west. When `symbol-placement` is set to `line`, aligns icon x-axes with the line.\\\"},viewport:{doc:\\\"Produces icons whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\\\"},auto:{doc:\\\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\\\"}},default:\\\"auto\\\",doc:\\\"In combination with `symbol-placement`, determines the rotation behavior of icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Scale factor for icon. 1 is original size, 3 triples the size.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{doc:\\\"The icon is displayed at its intrinsic aspect ratio.\\\"},width:{doc:\\\"The icon is scaled in the x-dimension to fit the width of the text.\\\"},height:{doc:\\\"The icon is scaled in the y-dimension to fit the height of the text.\\\"},both:{doc:\\\"The icon is scaled in both x- and y-dimensions.\\\"}},default:\\\"none\\\",doc:\\\"Scales the icon to fit around the associated text.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Size of the additional area added to dimensions determined by `icon-text-fit`, in clockwise order: top, right, bottom, left.\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\",{\\\"icon-text-fit\\\":[\\\"both\\\",\\\"width\\\",\\\"height\\\"]}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,doc:\\\"A string with {tokens} replaced, referencing the data property to pull from.\\\",tokens:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",doc:\\\"Rotates the icon clockwise.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.21.0\\\"}}},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",doc:\\\"Size of the additional area around the icon bounding box used for detecting symbol collisions.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the icon may be flipped to prevent it from being rendered upside-down.\\\",requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,doc:\\\"Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with `icon-rotate` the offset will be as if the rotated direction was up.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The text is aligned to the plane of the map.\\\"},viewport:{doc:\\\"The text is aligned to the plane of the viewport.\\\"},auto:{doc:\\\"Automatically matches the value of `text-rotation-alignment`.\\\"}},default:\\\"auto\\\",doc:\\\"Orientation of text when map is pitched.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"When `symbol-placement` is set to `point`, aligns text east-west. When `symbol-placement` is set to `line`, aligns text x-axes with the line.\\\"},viewport:{doc:\\\"Produces glyphs whose x-axes are aligned with the x-axis of the viewport, regardless of the value of `symbol-placement`.\\\"},auto:{doc:\\\"When `symbol-placement` is set to `point`, this is equivalent to `viewport`. When `symbol-placement` is set to `line`, this is equivalent to `map`.\\\"}},default:\\\"auto\\\",doc:\\\"In combination with `symbol-placement`, determines the rotation behavior of the individual glyphs forming the text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"`auto` value\\\":{js:\\\"0.25.0\\\",android:\\\"4.2.0\\\"}}},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:\\\"\\\",tokens:!0,doc:\\\"Value to use for a text label. Feature properties are specified using tokens like {field_name}.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],doc:\\\"Font stack to use for displaying text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Font size.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"The maximum line width for text wrapping.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Text leading value for multi-line text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Text tracking amount.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{left:{doc:\\\"The text is aligned to the left.\\\"},center:{doc:\\\"The text is centered.\\\"},right:{doc:\\\"The text is aligned to the right.\\\"}},default:\\\"center\\\",doc:\\\"Text justification options.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{center:{doc:\\\"The center of the text is placed closest to the anchor.\\\"},left:{doc:\\\"The left side of the text is placed closest to the anchor.\\\"},right:{doc:\\\"The right side of the text is placed closest to the anchor.\\\"},top:{doc:\\\"The top of the text is placed closest to the anchor.\\\"},bottom:{doc:\\\"The bottom of the text is placed closest to the anchor.\\\"},\\\"top-left\\\":{doc:\\\"The top left corner of the text is placed closest to the anchor.\\\"},\\\"top-right\\\":{doc:\\\"The top right corner of the text is placed closest to the anchor.\\\"},\\\"bottom-left\\\":{doc:\\\"The bottom left corner of the text is placed closest to the anchor.\\\"},\\\"bottom-right\\\":{doc:\\\"The bottom right corner of the text is placed closest to the anchor.\\\"}},default:\\\"center\\\",doc:\\\"Part of the text placed closest to the anchor.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Maximum angle change between adjacent characters.\\\",requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Rotates the text clockwise.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Size of the additional area around the text bounding box used for detecting symbol collisions.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,doc:\\\"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\\\",requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{doc:\\\"The text is not altered.\\\"},uppercase:{doc:\\\"Forces all letters to be displayed in uppercase.\\\"},lowercase:{doc:\\\"Forces all letters to be displayed in lowercase.\\\"}},default:\\\"none\\\",doc:\\\"Specifies how to capitalize text, similar to the CSS `text-transform` property.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-offset\\\":{type:\\\"array\\\",doc:\\\"Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up.\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, the text will be visible even if it collides with other previously drawn symbols.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, other symbols can be visible even if they collide with the text.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,doc:\\\"If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not.\\\",requires:[\\\"text-field\\\",\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},layout_raster:{visibility:{type:\\\"enum\\\",values:{visible:{doc:\\\"The layer is shown.\\\"},none:{doc:\\\"The layer is not shown.\\\"}},default:\\\"visible\\\",doc:\\\"Whether this layer is displayed.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},filter:{type:\\\"array\\\",value:\\\"*\\\",doc:\\\"A filter selects specific features from a layer.\\\"},filter_operator:{type:\\\"enum\\\",values:{\\\"==\\\":{doc:'`[\\\"==\\\", key, value]` equality: `feature[key] = value`'},\\\"!=\\\":{doc:'`[\\\"!=\\\", key, value]` inequality: `feature[key] ≠ value`'},\\\">\\\":{doc:'`[\\\">\\\", key, value]` greater than: `feature[key] > value`'},\\\">=\\\":{doc:'`[\\\">=\\\", key, value]` greater than or equal: `feature[key] ≥ value`'},\\\"<\\\":{doc:'`[\\\"<\\\", key, value]` less than: `feature[key] < value`'},\\\"<=\\\":{doc:'`[\\\"<=\\\", key, value]` less than or equal: `feature[key] ≤ value`'},in:{doc:'`[\\\"in\\\", key, v0, ..., vn]` set inclusion: `feature[key] ∈ {v0, ..., vn}`'},\\\"!in\\\":{doc:'`[\\\"!in\\\", key, v0, ..., vn]` set exclusion: `feature[key] ∉ {v0, ..., vn}`'},all:{doc:'`[\\\"all\\\", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`'},any:{doc:'`[\\\"any\\\", f0, ..., fn]` logical `OR`: `f0 ∨ ... ∨ fn`'},none:{doc:'`[\\\"none\\\", f0, ..., fn]` logical `NOR`: `¬f0 ∧ ... ∧ ¬fn`'},has:{doc:'`[\\\"has\\\", key]` `feature[key]` exists'},\\\"!has\\\":{doc:'`[\\\"!has\\\", key]` `feature[key]` does not exist'}},doc:\\\"The filter operator.\\\"},geometry_type:{type:\\\"enum\\\",values:{Point:{doc:\\\"Filter to point geometries.\\\"},LineString:{doc:\\\"Filter to line geometries.\\\"},Polygon:{doc:\\\"Filter to polygon geometries.\\\"}},doc:\\\"The geometry type for the filter to select.\\\"},function:{stops:{type:\\\"array\\\",doc:\\\"An array of stops.\\\",value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0,doc:\\\"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\\\"},property:{type:\\\"string\\\",doc:\\\"The name of a feature property to use as the function input.\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:{identity:{doc:\\\"Return the input value as the output value.\\\"},exponential:{doc:\\\"Generate an output by interpolating between stops just less than and just greater than the function input.\\\"},interval:{doc:\\\"Return the output value of the stop just less than the function input.\\\"},categorical:{doc:\\\"Return the output value of the stop equal to the function input.\\\"}},doc:\\\"The interpolation strategy to use in function evaluation.\\\",default:\\\"exponential\\\"},colorSpace:{type:\\\"enum\\\",values:{rgb:{doc:\\\"Use the RGB color space to interpolate color values\\\"},lab:{doc:\\\"Use the LAB color space to interpolate color values.\\\"},hcl:{doc:\\\"Use the HCL color space to interpolate color values, interpolating the Hue, Chroma, and Luminance channels individually.\\\"}},doc:\\\"The color space in which colors interpolated. Interpolating colors in perceptual color spaces like LAB and HCL tend to produce color ramps that look more consistent and produce colors that can be differentiated more easily than those interpolated in RGB space.\\\",default:\\\"rgb\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2,doc:\\\"Zoom level and value pair.\\\"},light:{anchor:{type:\\\"enum\\\",default:\\\"viewport\\\",values:{map:{doc:\\\"The position of the light source is aligned to the rotation of the map.\\\"},viewport:{doc:\\\"The position of the light source is aligned to the rotation of the viewport.\\\"}},transition:!1,doc:\\\"Whether extruded geometries are lit relative to the map or viewport.\\\",example:\\\"map\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},position:{type:\\\"array\\\",default:[1.15,210,30],length:3,value:\\\"number\\\",transition:!0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,doc:\\\"Position of the light source relative to lit (extruded) geometries, in [r radial coordinate, a azimuthal angle, p polar angle] where r indicates the distance from the center of the base of an object to its light, a indicates the position of the light relative to 0° (0° when `light.anchor` is set to `viewport` corresponds to the top of the viewport, or 0° when `light.anchor` is set to `map` corresponds to due north, and degrees proceed clockwise), and p indicates the height of the light (from 0°, directly above, to 180°, directly below).\\\",example:[1.5,90,80],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},color:{type:\\\"color\\\",default:\\\"#ffffff\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0,doc:\\\"Color tint for lighting extruded geometries.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},intensity:{type:\\\"number\\\",default:.5,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0,doc:\\\"Intensity of lighting (on a scale from 0 to 1). Higher numbers will present as more extreme contrast.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}}},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_fill-extrusion\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,doc:\\\"Whether or not the fill should be antialiased.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,doc:\\\"The opacity of the entire fill layer. In contrast to the `fill-color`, this value will also affect the 1px stroke around the fill, if the stroke is used.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.21.0\\\"}}},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.19.0\\\"}}},\\\"fill-outline-color\\\":{type:\\\"color\\\",doc:\\\"The outline color of the fill. Matches the value of `fill-color` if unspecified.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.19.0\\\"}}},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The fill is translated relative to the map.\\\"},viewport:{doc:\\\"The fill is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"fill-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},\\\"paint_fill-extrusion\\\":{\\\"fill-extrusion-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,default:1,minimum:0,maximum:1,doc:\\\"The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use `fill-extrusion-opacity` to set layer opacity.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-extrusion-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The fill extrusion is translated relative to the map.\\\"},viewport:{doc:\\\"The fill extrusion is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"fill-extrusion-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-height\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",doc:\\\"The height with which to extrude this layer.\\\",transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}},\\\"fill-extrusion-base\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",doc:\\\"The height with which to extrude the base of this layer. Must be less than or equal to `fill-extrusion-height`.\\\",transition:!0,requires:[\\\"fill-extrusion-height\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.27.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.27.0\\\"}}}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the line will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-color\\\":{type:\\\"color\\\",doc:\\\"The color with which the line will be drawn.\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.23.0\\\"}}},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The line is translated relative to the map.\\\"},viewport:{doc:\\\"The line is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"line-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Stroke thickness.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,doc:\\\"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-offset\\\":{type:\\\"number\\\",default:0,doc:\\\"The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.12.1\\\",ios:\\\"3.1.0\\\",android:\\\"3.0.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Blur applied to the line, in pixels.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,doc:\\\"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.\\\",minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Circle radius.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.18.0\\\"}}},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The fill color of the circle.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.18.0\\\"}}},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,doc:\\\"Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.20.0\\\"}}},\\\"circle-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the circle will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"},\\\"data-driven styling\\\":{js:\\\"0.20.0\\\"}}},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The circle is translated relative to the map.\\\"},viewport:{doc:\\\"The circle is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"circle-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"Circles are scaled according to their apparent distance to the camera.\\\"},viewport:{doc:\\\"Circles are not scaled.\\\"}},default:\\\"map\\\",doc:\\\"Controls the scaling behavior of the circle when the map is pitched.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.21.0\\\",android:\\\"4.2.0\\\"}}},\\\"circle-stroke-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The width of the circle's stroke. Strokes are placed outside of the `circle-radius`.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"circle-stroke-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The stroke color of the circle.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}},\\\"circle-stroke-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity of the circle's stroke.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.29.0\\\"},\\\"data-driven styling\\\":{js:\\\"0.29.0\\\"}}}},paint_symbol:{\\\"icon-opacity\\\":{doc:\\\"The opacity at which the icon will be drawn.\\\",type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the icon. This can only be used with sdf icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the icon's halo. Icon halos can only be used with SDF icons.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance of halo to the icon outline.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Fade out the halo towards the outside.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\\\",requires:[\\\"icon-image\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"Icons are translated relative to the map.\\\"},viewport:{doc:\\\"Icons are translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the text will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-color\\\":{type:\\\"color\\\",doc:\\\"The color with which the text will be drawn.\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"The color of the text's halo, which helps it stand out from backgrounds.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"The halo's fadeout distance towards the outside.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",doc:\\\"Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up.\\\",requires:[\\\"text-field\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{doc:\\\"The text is translated relative to the map.\\\"},viewport:{doc:\\\"The text is translated relative to the viewport.\\\"}},doc:\\\"Controls the translation reference point.\\\",default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",doc:\\\"The opacity at which the image will be drawn.\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\",doc:\\\"Rotates hues around the color wheel.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Increase or reduce the brightness of the image. The value is the minimum brightness.\\\",default:0,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,doc:\\\"Increase or reduce the brightness of the image. The value is the maximum brightness.\\\",default:1,minimum:0,maximum:1,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-saturation\\\":{type:\\\"number\\\",doc:\\\"Increase or reduce the saturation of the image.\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-contrast\\\":{type:\\\"number\\\",doc:\\\"Increase or reduce the contrast of the image.\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\",doc:\\\"Fade duration when a new tile is added.\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",doc:\\\"The color with which the background will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}],\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0,doc:\\\"Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512).\\\",\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,doc:\\\"The opacity at which the background will be drawn.\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,\\\"sdk-support\\\":{\\\"basic functionality\\\":{js:\\\"0.10.0\\\",ios:\\\"2.0.0\\\",android:\\\"2.0.1\\\"}}}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\",doc:\\\"Time allotted for transitions to complete.\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\",doc:\\\"Length of time before a transition begins.\\\"}}}},function(t,e,n){\\\"use strict\\\";t.exports=n(84),t.exports.emitErrors=function(t,e){if(e&&e.length){for(var n=0;n<e.length;n++)t.fire(\\\"error\\\",{error:new Error(e[n].message)});return!0}return!1},t.exports.throwErrors=function(t,e){if(e)for(var n=0;n<e.length;n++)throw new Error(e[n].message)}},function(t,e,n){\\\"use strict\\\";function i(t,e){e=e||u;var n=[];return n=n.concat(s({key:\\\"\\\",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:l,\\\"*\\\":function(){return[]}}})),e.$version>7&&t.constants&&(n=n.concat(a({key:\\\"constants\\\",value:t.constants,style:t,styleSpec:e}))),r(n)}function r(t){return[].concat(t).sort(function(t,e){return t.line-e.line})}function o(t){return function(){return r(t.apply(this,arguments))}}var a=n(30),s=n(6),u=n(87),l=n(89);i.source=o(n(38)),i.light=o(n(39)),i.layer=o(n(35)),i.filter=o(n(15)),i.paintProperty=o(n(36)),i.layoutProperty=o(n(37)),t.exports=i},function(t,e,n){\\\"use strict\\\";var i=n(3),r=n(1);t.exports=function(t){var e=t.value,n=t.key,o=i(e);return\\\"boolean\\\"!==o?[new r(n,e,\\\"boolean expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(3),o=n(29).parseCSSColor;t.exports=function(t){var e=t.key,n=t.value,a=r(n);return\\\"string\\\"!==a?[new i(e,n,\\\"color expected, %s found\\\",a)]:null===o(n)?[new i(e,n,'color expected, \\\"%s\\\" found',n)]:[]}},function(t,e,n){t.exports=n(88)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8]},name:{type:\\\"string\\\"},metadata:{type:\\\"*\\\"},center:{type:\\\"array\\\",value:\\\"number\\\"},zoom:{type:\\\"number\\\"},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\"},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\"},light:{type:\\\"light\\\"},sources:{required:!0,type:\\\"sources\\\"},sprite:{type:\\\"string\\\"},glyphs:{type:\\\"string\\\"},transition:{type:\\\"transition\\\"},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\"}},sources:{\\\"*\\\":{type:\\\"source\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:{vector:{},raster:{}}},url:{type:\\\"string\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\"},minzoom:{type:\\\"number\\\",default:0},maxzoom:{type:\\\"number\\\",default:22},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\"},\\\"*\\\":{type:\\\"*\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:{geojson:{}}},data:{type:\\\"*\\\"},maxzoom:{type:\\\"number\\\",default:18},buffer:{type:\\\"number\\\",default:128,maximum:512,minimum:0},tolerance:{type:\\\"number\\\",default:.375},cluster:{type:\\\"boolean\\\",default:!1},clusterRadius:{type:\\\"number\\\",default:50,minimum:0},clusterMaxZoom:{type:\\\"number\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:{video:{}}},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:{image:{}}},url:{required:!0,type:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},layer:{id:{type:\\\"string\\\",required:!0},type:{type:\\\"enum\\\",values:{fill:{},line:{},symbol:{},circle:{},\\\"fill-extrusion\\\":{},raster:{},background:{}}},metadata:{type:\\\"*\\\"},ref:{type:\\\"string\\\"},source:{type:\\\"string\\\"},\\\"source-layer\\\":{type:\\\"string\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:24},maxzoom:{type:\\\"number\\\",minimum:0,maximum:24},filter:{type:\\\"filter\\\"},layout:{type:\\\"layout\\\"},paint:{type:\\\"paint\\\"},\\\"paint.*\\\":{type:\\\"paint\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_fill-extrusion\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_fill:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_circle:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},\\\"layout_fill-extrusion\\\":{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{butt:{},round:{},square:{}},default:\\\"butt\\\"},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{bevel:{},round:{},miter:{}},default:\\\"miter\\\"},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[{\\\"line-join\\\":\\\"miter\\\"}]},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[{\\\"line-join\\\":\\\"round\\\"}]},visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{point:{},line:{}},default:\\\"point\\\"},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"icon-image\\\"]},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{},width:{},height:{},both:{}},default:\\\"none\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"icon-image\\\",\\\"text-field\\\",{\\\"icon-text-fit\\\":[\\\"both\\\",\\\"width\\\",\\\"height\\\"]}]},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,tokens:!0},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",requires:[\\\"icon-image\\\"]},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"text-field\\\"]},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{},auto:{}},default:\\\"auto\\\",requires:[\\\"text-field\\\"]},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:\\\"\\\",tokens:!0},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],requires:[\\\"text-field\\\"]},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{left:{},center:{},right:{}},default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{center:{},left:{},right:{},top:{},bottom:{},\\\"top-left\\\":{},\\\"top-right\\\":{},\\\"bottom-left\\\":{},\\\"bottom-right\\\":{}},default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0,requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{none:{},uppercase:{},lowercase:{}},default:\\\"none\\\",requires:[\\\"text-field\\\"]},\\\"text-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"]},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!1,requires:[\\\"text-field\\\",\\\"icon-image\\\"]},visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},layout_raster:{visibility:{type:\\\"enum\\\",values:{visible:{},none:{}},default:\\\"visible\\\"}},filter:{type:\\\"array\\\",value:\\\"*\\\"},filter_operator:{type:\\\"enum\\\",values:{\\\"==\\\":{},\\\"!=\\\":{},\\\">\\\":{},\\\">=\\\":{},\\\"<\\\":{},\\\"<=\\\":{},in:{},\\\"!in\\\":{},all:{},any:{},none:{},has:{},\\\"!has\\\":{}}},geometry_type:{type:\\\"enum\\\",values:{Point:{},LineString:{},Polygon:{}}},function:{stops:{type:\\\"array\\\",value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0},property:{type:\\\"string\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:{identity:{},exponential:{},interval:{},categorical:{}},default:\\\"exponential\\\"},colorSpace:{type:\\\"enum\\\",values:{rgb:{},lab:{},hcl:{}},default:\\\"rgb\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2},light:{anchor:{type:\\\"enum\\\",default:\\\"viewport\\\",values:{map:{},viewport:{}},transition:!1},position:{type:\\\"array\\\",default:[1.15,210,30],length:3,value:\\\"number\\\",transition:!0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1},color:{type:\\\"color\\\",default:\\\"#ffffff\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0},intensity:{type:\\\"number\\\",default:.5,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,transition:!0}},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_fill-extrusion\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,default:!0},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}]},\\\"fill-outline-color\\\":{type:\\\"color\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}]},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"fill-translate\\\"]},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0}},\\\"paint_fill-extrusion\\\":{\\\"fill-extrusion-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-extrusion-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-extrusion-pattern\\\"}]},\\\"fill-extrusion-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-extrusion-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"fill-extrusion-translate\\\"]},\\\"fill-extrusion-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"fill-extrusion-height\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",transition:!0},\\\"fill-extrusion-base\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:0,minimum:0,units:\\\"meters\\\",transition:!0,requires:[\\\"fill-extrusion-height\\\"]}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"line-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"line-translate\\\"]},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-offset\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"circle-translate\\\"]},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\"},\\\"circle-stroke-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-stroke-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-stroke-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_symbol:{\\\"icon-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"]},\\\"text-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:{map:{},viewport:{}},default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"]}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\"},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:0,minimum:0,maximum:1,transition:!0},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"raster-saturation\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-contrast\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\"}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}]},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\"}}}},function(t,e,n){\\\"use strict\\\";var i=n(1),r=n(40);t.exports=function(t){var e=t.value,n=t.key,o=r(t);return o.length?o:(-1===e.indexOf(\\\"{fontstack}\\\")&&o.push(new i(n,e,'\\\"glyphs\\\" url must include a \\\"{fontstack}\\\" token')),-1===e.indexOf(\\\"{range}\\\")&&o.push(new i(n,e,'\\\"glyphs\\\" url must include a \\\"{range}\\\" token')),o)}},function(t,e,n){\\\"use strict\\\";var i=n(0),r={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var n=this._events[t].indexOf(e);n>=0&&this._events[t].splice(n,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var n=function(i){this.off(t,n),e.call(this,i)}.bind(this);return this.on(t,n),this},fire:function(t,e){if(!this.listens(t))return this;e=i.extend({},e),i.extend(e,{type:t,target:this});for(var n=this._events[t].slice(),r=0;r<n.length;r++)n[r].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};t.exports=r},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);i.prototype=r.inherit(o,{getPaintValue:function(t,e,n){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValue.call(this,\\\"fill-color\\\",e,n):o.prototype.getPaintValue.call(this,t,e,n)},getPaintValueStopZoomLevels:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValueStopZoomLevels.call(this,\\\"fill-color\\\"):o.prototype.getPaintValueStopZoomLevels.call(this,arguments)},getPaintInterpolationT:function(t,e){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintInterpolationT.call(this,\\\"fill-color\\\",e):o.prototype.getPaintInterpolationT.call(this,t,e)},isPaintValueFeatureConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueFeatureConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueFeatureConstant.call(this,t)},isPaintValueZoomConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueZoomConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueZoomConstant.call(this,t)}}),t.exports=i},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{getPaintValue:function(t,e,n){var i=o.prototype.getPaintValue.apply(this,arguments);if(i&&\\\"line-dasharray\\\"===t){var r=Math.floor(e.zoom);this._flooredZoom!==r&&(this._flooredZoom=r,this._flooredLineWidth=this.getPaintValue(\\\"line-width\\\",e,n)),i.fromScale*=this._flooredLineWidth,i.toScale*=this._flooredLineWidth}return i}})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function i(){o.apply(this,arguments)}var r=n(0),o=n(5);t.exports=i,i.prototype=r.inherit(o,{isHidden:function(){if(o.prototype.isHidden.apply(this,arguments))return!0;var t=0===this.paint[\\\"text-opacity\\\"]||!this.layout[\\\"text-field\\\"],e=0===this.paint[\\\"icon-opacity\\\"]||!this.layout[\\\"icon-image\\\"];return!(!t||!e)},getLayoutValue:function(t,e,n){return(\\\"text-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"text-rotation-alignment\\\"))&&(\\\"icon-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"icon-rotation-alignment\\\"))?o.prototype.getLayoutValue.apply(this,arguments):\\\"map\\\"}})},function(t,e,n){\\\"use strict\\\";function i(t){var e=document.createElement(\\\"a\\\");return e.href=t,e.protocol===document.location.protocol&&e.host===document.location.host}e.getJSON=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.setRequestHeader(\\\"Accept\\\",\\\"application/json\\\"),n.onerror=function(t){e(t)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var t;try{t=JSON.parse(n.response)}catch(t){return e(t)}e(null,t)}else e(new Error(n.statusText))},n.send(),n},e.getArrayBuffer=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.responseType=\\\"arraybuffer\\\",n.onerror=function(t){e(t)},n.onload=function(){n.status>=200&&n.status<300&&n.response?e(null,n.response):e(new Error(n.statusText))},n.send(),n},e.getImage=function(t,n){return e.getArrayBuffer(t,function(t,e){if(t)return n(t);var i=new Image;i.onload=function(){n(null,i),(window.URL||window.webkitURL).revokeObjectURL(i.src)};var r=new Blob([new Uint8Array(e)],{type:\\\"image/png\\\"});return i.src=(window.URL||window.webkitURL).createObjectURL(r),i.getData=function(){var t=document.createElement(\\\"canvas\\\"),e=t.getContext(\\\"2d\\\");return t.width=i.width,t.height=i.height,e.drawImage(i,0,0),e.getImageData(0,0,i.width,i.height).data},i})},e.getVideo=function(t,e){var n=document.createElement(\\\"video\\\");n.onloadstart=function(){e(null,n)};for(var r=0;r<t.length;r++){var o=document.createElement(\\\"source\\\");i(t[r])||(n.crossOrigin=\\\"Anonymous\\\"),o.src=t[r],n.appendChild(o)}return n.getData=function(){return n},n}},function(t,e,n){\\\"use strict\\\";function i(t){return new r(t)}function r(t){this.options=h(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function o(t,e,n,i,r){return{x:t,y:e,zoom:1/0,id:i,properties:r,parentId:-1,numPoints:n}}function a(t,e){var n=t.geometry.coordinates;return{x:l(n[0]),y:c(n[1]),zoom:1/0,id:e,parentId:-1}}function s(t){return{type:\\\"Feature\\\",properties:u(t),geometry:{type:\\\"Point\\\",coordinates:[p(t.x),f(t.y)]}}}function u(t){var e=t.numPoints,n=e>=1e4?Math.round(e/1e3)+\\\"k\\\":e>=1e3?Math.round(e/100)/10+\\\"k\\\":e;return h(h({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:n})}function l(t){return t/360+.5}function c(t){var e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){return 360*(t-.5)}function f(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function h(t,e){for(var n in e)t[n]=e[n];return t}function d(t){return t.x}function y(t){return t.y}var m=n(99);t.exports=i,r.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,initial:function(){return{}},map:function(t){return t}},load:function(t){var e=this.options.log;e&&console.time(\\\"total time\\\");var n=\\\"prepare \\\"+t.length+\\\" points\\\";e&&console.time(n),this.points=t;var i=t.map(a);e&&console.timeEnd(n);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var o=+Date.now();this.trees[r+1]=m(i,d,y,this.options.nodeSize,Float32Array),i=this._cluster(i,r),e&&console.log(\\\"z%d: %d clusters in %dms\\\",r,i.length,+Date.now()-o)}return this.trees[this.options.minZoom]=m(i,d,y,this.options.nodeSize,Float32Array),e&&console.timeEnd(\\\"total time\\\"),this},getClusters:function(t,e){for(var n=this.trees[this._limitZoom(e)],i=n.range(l(t[0]),c(t[3]),l(t[2]),c(t[1])),r=[],o=0;o<i.length;o++){var a=n.points[i[o]];r.push(a.numPoints?s(a):this.points[a.id])}return r},getChildren:function(t,e){for(var n=this.trees[e+1].points[t],i=this.options.radius/(this.options.extent*Math.pow(2,e)),r=this.trees[e+1].within(n.x,n.y,i),o=[],a=0;a<r.length;a++){var u=this.trees[e+1].points[r[a]];u.parentId===t&&o.push(u.numPoints?s(u):this.points[u.id])}return o},getLeaves:function(t,e,n,i){n=n||10,i=i||0;var r=[];return this._appendLeaves(r,t,e,n,i,0),r},getTile:function(t,e,n){var i=this.trees[this._limitZoom(t)],r=Math.pow(2,t),o=this.options.extent,a=this.options.radius,s=a/o,u=(n-s)/r,l=(n+1+s)/r,c={features:[]};return this._addTileFeatures(i.range((e-s)/r,u,(e+1+s)/r,l),i.points,e,n,r,c),0===e&&this._addTileFeatures(i.range(1-s/r,u,1,l),i.points,r,n,r,c),e===r-1&&this._addTileFeatures(i.range(0,u,s/r,l),i.points,-1,n,r,c),c.features.length?c:null},getClusterExpansionZoom:function(t,e){for(;e<this.options.maxZoom;){var n=this.getChildren(t,e);if(e++,1!==n.length)break;t=n[0].properties.cluster_id}return e},_appendLeaves:function(t,e,n,i,r,o){for(var a=this.getChildren(e,n),s=0;s<a.length;s++){var u=a[s].properties;if(u.cluster?o+u.point_count<=r?o+=u.point_count:o=this._appendLeaves(t,u.cluster_id,n+1,i,r,o):o<r?o++:t.push(a[s]),t.length===i)break}return o},_addTileFeatures:function(t,e,n,i,r,o){for(var a=0;a<t.length;a++){var s=e[t[a]];o.features.push({type:1,geometry:[[Math.round(this.options.extent*(s.x*r-n)),Math.round(this.options.extent*(s.y*r-i))]],tags:s.numPoints?u(s):this.points[s.id].properties})}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var n=[],i=this.options.radius/(this.options.extent*Math.pow(2,e)),r=0;r<t.length;r++){var a=t[r];if(!(a.zoom<=e)){a.zoom=e;var s=this.trees[e+1],u=s.within(a.x,a.y,i),l=a.numPoints||1,c=a.x*l,p=a.y*l,f=null;this.options.reduce&&(f=this.options.initial(),this._accumulate(f,a));for(var h=0;h<u.length;h++){var d=s.points[u[h]];if(e<d.zoom){var y=d.numPoints||1;d.zoom=e,c+=d.x*y,p+=d.y*y,l+=y,d.parentId=r,this.options.reduce&&this._accumulate(f,d)}}1===l?n.push(a):(a.parentId=r,n.push(o(c/l,p/l,l,r,f)))}}return n},_accumulate:function(t,e){var n=e.numPoints?e.properties:this.options.map(this.points[e.id].properties);this.options.reduce(t,n)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o){return new r(t,e,n,i,o)}function r(t,e,n,i,r){e=e||o,n=n||a,r=r||Array,this.nodeSize=i||64,this.points=t,this.ids=new r(t.length),this.coords=new r(2*t.length);for(var u=0;u<t.length;u++)this.ids[u]=u,this.coords[2*u]=e(t[u]),this.coords[2*u+1]=n(t[u]);s(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function o(t){return t[0]}function a(t){return t[1]}var s=n(100),u=n(101),l=n(102);t.exports=i,r.prototype={range:function(t,e,n,i){return u(this.ids,this.coords,t,e,n,i,this.nodeSize)},within:function(t,e,n){return l(this.ids,this.coords,t,e,n,this.nodeSize)}}},function(t,e,n){\\\"use strict\\\";function i(t,e,n,o,a,s){if(!(a-o<=n)){var u=Math.floor((o+a)/2);r(t,e,u,o,a,s%2),i(t,e,n,o,u-1,s+1),i(t,e,n,u+1,a,s+1)}}function r(t,e,n,i,a,s){for(;a>i;){if(a-i>600){var u=a-i+1,l=n-i+1,c=Math.log(u),p=.5*Math.exp(2*c/3),f=.5*Math.sqrt(c*p*(u-p)/u)*(l-u/2<0?-1:1);r(t,e,n,Math.max(i,Math.floor(n-l*p/u+f)),Math.min(a,Math.floor(n+(u-l)*p/u+f)),s)}var h=e[2*n+s],d=i,y=a;for(o(t,e,i,n),e[2*a+s]>h&&o(t,e,i,a);d<y;){for(o(t,e,d,y),d++,y--;e[2*d+s]<h;)d++;for(;e[2*y+s]>h;)y--}e[2*i+s]===h?o(t,e,i,y):(y++,o(t,e,y,a)),y<=n&&(i=y+1),n<=y&&(a=y-1)}}function o(t,e,n,i){a(t,n,i),a(e,2*n,2*i),a(e,2*n+1,2*i+1)}function a(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,r,o,a){for(var s,u,l=[0,t.length-1,0],c=[];l.length;){var p=l.pop(),f=l.pop(),h=l.pop();if(f-h<=a)for(var d=h;d<=f;d++)s=e[2*d],u=e[2*d+1],s>=n&&s<=r&&u>=i&&u<=o&&c.push(t[d]);else{var y=Math.floor((h+f)/2);s=e[2*y],u=e[2*y+1],s>=n&&s<=r&&u>=i&&u<=o&&c.push(t[y]);var m=(p+1)%2;(0===p?n<=s:i<=u)&&(l.push(h),l.push(y-1),l.push(m)),(0===p?r>=s:o>=u)&&(l.push(y+1),l.push(f),l.push(m))}}return c}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a){for(var s=[0,t.length-1,0],u=[],l=o*o;s.length;){var c=s.pop(),p=s.pop(),f=s.pop();if(p-f<=a)for(var h=f;h<=p;h++)r(e[2*h],e[2*h+1],n,i)<=l&&u.push(t[h]);else{var d=Math.floor((f+p)/2),y=e[2*d],m=e[2*d+1];r(y,m,n,i)<=l&&u.push(t[d]);var v=(c+1)%2;(0===c?n-o<=y:i-o<=m)&&(s.push(f),s.push(d-1),s.push(v)),(0===c?n+o>=y:i+o>=m)&&(s.push(d+1),s.push(p),s.push(v))}}return u}function r(t,e,n,i){var r=t-n,o=e-i;return r*r+o*o}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){return new r(t,e)}function r(t,e){e=this.options=u(Object.create(this.options),e);var n=e.debug;n&&console.time(\\\"preprocess data\\\");var i=1<<e.maxZoom,r=c(t,e.tolerance/(i*e.extent));this.tiles={},this.tileCoords=[],n&&(console.timeEnd(\\\"preprocess data\\\"),console.log(\\\"index: maxZoom: %d, maxPoints: %d\\\",e.indexMaxZoom,e.indexMaxPoints),console.time(\\\"generate tiles\\\"),this.stats={},this.total=0),r=h(r,e.buffer/e.extent,a),r.length&&this.splitTile(r,0,0,0),n&&(r.length&&console.log(\\\"features: %d, points: %d\\\",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd(\\\"generate tiles\\\"),console.log(\\\"tiles generated:\\\",this.total,JSON.stringify(this.stats)))}function o(t,e,n){return 32*((1<<t)*n+e)+t}function a(t,e,n){return[n,(n-t[0])*(e[1]-t[1])/(e[0]-t[0])+t[1],1]}function s(t,e,n){return[(n-t[1])*(e[0]-t[0])/(e[1]-t[1])+t[0],n,1]}function u(t,e){for(var n in e)t[n]=e[n];return t}function l(t,e,n){var i=t.source;if(1!==i.length)return!1;var r=i[0];if(3!==r.type||r.geometry.length>1)return!1;var o=r.geometry[0].length;if(5!==o)return!1;for(var a=0;a<o;a++){var s=p.point(r.geometry[0][a],e,t.z2,t.x,t.y);if(s[0]!==-n&&s[0]!==e+n||s[1]!==-n&&s[1]!==e+n)return!1}return!0}t.exports=i;var c=n(104),p=n(106),f=n(41),h=n(107),d=n(108);r.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},r.prototype.splitTile=function(t,e,n,i,r,u,c){for(var p=[t,e,n,i],h=this.options,y=h.debug,m=null;p.length;){i=p.pop(),n=p.pop(),e=p.pop(),t=p.pop();var v=1<<e,g=o(e,n,i),x=this.tiles[g],b=e===h.maxZoom?0:h.tolerance/(v*h.extent);if(!x&&(y>1&&console.time(\\\"creation\\\"),x=this.tiles[g]=d(t,v,n,i,b,e===h.maxZoom),this.tileCoords.push({z:e,x:n,y:i}),y)){y>1&&(console.log(\\\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\\\",e,n,i,x.numFeatures,x.numPoints,x.numSimplified),console.timeEnd(\\\"creation\\\"));var w=\\\"z\\\"+e;this.stats[w]=(this.stats[w]||0)+1,this.total++}if(x.source=t,r){if(e===h.maxZoom||e===r)continue;var k=1<<r-e;if(n!==Math.floor(u/k)||i!==Math.floor(c/k))continue}else if(e===h.indexMaxZoom||x.numPoints<=h.indexMaxPoints)continue;if(h.solidChildren||!l(x,h.extent,h.buffer)){x.source=null,y>1&&console.time(\\\"clipping\\\");var _,S,z,T,j,M,I=.5*h.buffer/h.extent,P=.5-I,E=.5+I,F=1+I;_=S=z=T=null,j=f(t,v,n-I,n+E,0,a,x.min[0],x.max[0]),M=f(t,v,n+P,n+F,0,a,x.min[0],x.max[0]),j&&(_=f(j,v,i-I,i+E,1,s,x.min[1],x.max[1]),S=f(j,v,i+P,i+F,1,s,x.min[1],x.max[1])),M&&(z=f(M,v,i-I,i+E,1,s,x.min[1],x.max[1]),T=f(M,v,i+P,i+F,1,s,x.min[1],x.max[1])),y>1&&console.timeEnd(\\\"clipping\\\"),_&&p.push(_,e+1,2*n,2*i),S&&p.push(S,e+1,2*n,2*i+1),z&&p.push(z,e+1,2*n+1,2*i),T&&p.push(T,e+1,2*n+1,2*i+1)}else r&&(m=e)}return m},r.prototype.getTile=function(t,e,n){var i=this.options,r=i.extent,a=i.debug,s=1<<t;e=(e%s+s)%s;var u=o(t,e,n);if(this.tiles[u])return p.tile(this.tiles[u],r);a>1&&console.log(\\\"drilling down to z%d-%d-%d\\\",t,e,n);for(var c,f=t,h=e,d=n;!c&&f>0;)f--,h=Math.floor(h/2),d=Math.floor(d/2),c=this.tiles[o(f,h,d)];if(!c||!c.source)return null;if(a>1&&console.log(\\\"found parent tile z%d-%d-%d\\\",f,h,d),l(c,r,i.buffer))return p.tile(c,r);a>1&&console.time(\\\"drilling down\\\");var y=this.splitTile(c.source,f,h,d,t,e,n);if(a>1&&console.timeEnd(\\\"drilling down\\\"),null!==y){var m=1<<t-y;u=o(y,Math.floor(e/m),Math.floor(n/m))}return this.tiles[u]?p.tile(this.tiles[u],r):null}},function(t,e,n){\\\"use strict\\\";function i(t,e){var n=[];if(\\\"FeatureCollection\\\"===t.type)for(var i=0;i<t.features.length;i++)r(n,t.features[i],e);else\\\"Feature\\\"===t.type?r(n,t,e):r(n,{geometry:t},e);return n}function r(t,e,n){var i,u,l,c=e.geometry,p=c.type,f=c.coordinates,h=e.properties;if(\\\"Point\\\"===p)t.push(o(h,1,[s(f)]));else if(\\\"MultiPoint\\\"===p)t.push(o(h,1,a(f)));else if(\\\"LineString\\\"===p)t.push(o(h,2,[a(f,n)]));else if(\\\"MultiLineString\\\"===p||\\\"Polygon\\\"===p){for(l=[],i=0;i<f.length;i++)l.push(a(f[i],n));t.push(o(h,\\\"Polygon\\\"===p?3:2,l))}else if(\\\"MultiPolygon\\\"===p){for(l=[],i=0;i<f.length;i++)for(u=0;u<f[i].length;u++)l.push(a(f[i][u],n));t.push(o(h,3,l))}else{if(\\\"GeometryCollection\\\"!==p)throw new Error(\\\"Input data is not a valid GeoJSON object.\\\");for(i=0;i<c.geometries.length;i++)r(t,{geometry:c.geometries[i],properties:h},n)}}function o(t,e,n){var i={geometry:n,type:e,tags:t||null,min:[2,1],max:[-1,0]};return l(i),i}function a(t,e){for(var n=[],i=0;i<t.length;i++)n.push(s(t[i]));return e&&(p(n,e),u(n)),n}function s(t){var e=Math.sin(t[1]*Math.PI/180),n=t[0]/360+.5,i=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return i=i<-1?-1:i>1?1:i,[n,i,0]}function u(t){for(var e,n,i=0,r=0,o=0;o<t.length-1;o++)e=n||t[o],n=t[o+1],i+=e[0]*n[1]-n[0]*e[1],r+=Math.abs(n[0]-e[0])+Math.abs(n[1]-e[1]);t.area=Math.abs(i/2),t.dist=r}function l(t){var e=t.geometry,n=t.min,i=t.max;if(1===t.type)c(n,i,e);else for(var r=0;r<e.length;r++)c(n,i,e[r]);return t}function c(t,e,n){for(var i,r=0;r<n.length;r++)i=n[r],t[0]=Math.min(i[0],t[0]),e[0]=Math.max(i[0],e[0]),t[1]=Math.min(i[1],t[1]),e[1]=Math.max(i[1],e[1])}t.exports=i;var p=n(105)},function(t,e,n){\\\"use strict\\\";function i(t,e){var n,i,o,a,s=e*e,u=t.length,l=0,c=u-1,p=[];for(t[l][2]=1,t[c][2]=1;c;){for(i=0,n=l+1;n<c;n++)(o=r(t[n],t[l],t[c]))>i&&(a=n,i=o);i>s?(t[a][2]=i,p.push(l),p.push(a),l=a):(c=p.pop(),l=p.pop())}}function r(t,e,n){var i=e[0],r=e[1],o=n[0],a=n[1],s=t[0],u=t[1],l=o-i,c=a-r;if(0!==l||0!==c){var p=((s-i)*l+(u-r)*c)/(l*l+c*c);p>1?(i=o,r=a):p>0&&(i+=l*p,r+=c*p)}return l=s-i,c=u-r,l*l+c*c}t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e){if(t.transformed)return t;var n,i,o,a=t.z2,s=t.x,u=t.y;for(n=0;n<t.features.length;n++){var l=t.features[n],c=l.geometry;if(1===l.type)for(i=0;i<c.length;i++)c[i]=r(c[i],e,a,s,u);else for(i=0;i<c.length;i++){var p=c[i];for(o=0;o<p.length;o++)p[o]=r(p[o],e,a,s,u)}}return t.transformed=!0,t}function r(t,e,n,i,r){return[Math.round(e*(t[0]*n-i)),Math.round(e*(t[1]*n-r))]}e.tile=i,e.point=r},function(t,e,n){\\\"use strict\\\";function i(t,e,n){var i=t,o=a(t,1,-1-e,e,0,n,-1,2),s=a(t,1,1-e,2+e,0,n,-1,2);return(o||s)&&(i=a(t,1,-e,1+e,0,n,-1,2),o&&(i=r(o,1).concat(i)),s&&(i=i.concat(r(s,-1)))),i}function r(t,e){for(var n=[],i=0;i<t.length;i++){var r,a=t[i],s=a.type;if(1===s)r=o(a.geometry,e);else{r=[];for(var u=0;u<a.geometry.length;u++)r.push(o(a.geometry[u],e))}n.push({geometry:r,type:s,tags:a.tags,min:[a.min[0]+e,a.min[1]],max:[a.max[0]+e,a.max[1]]})}return n}function o(t,e){var n=[];n.area=t.area,n.dist=t.dist;for(var i=0;i<t.length;i++)n.push([t[i][0]+e,t[i][1],t[i][2]]);return n}var a=n(41);t.exports=i},function(t,e,n){\\\"use strict\\\";function i(t,e,n,i,o,a){for(var s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:n,y:i,z2:e,transformed:!1,min:[2,1],max:[-1,0]},u=0;u<t.length;u++){s.numFeatures++,r(s,t[u],o,a);var l=t[u].min,c=t[u].max;l[0]<s.min[0]&&(s.min[0]=l[0]),l[1]<s.min[1]&&(s.min[1]=l[1]),c[0]>s.max[0]&&(s.max[0]=c[0]),c[1]>s.max[1]&&(s.max[1]=c[1])}return s}function r(t,e,n,i){var r,o,a,s,u=e.geometry,l=e.type,c=[],p=n*n;if(1===l)for(r=0;r<u.length;r++)c.push(u[r]),t.numPoints++,t.numSimplified++;else for(r=0;r<u.length;r++)if(a=u[r],i||!(2===l&&a.dist<n||3===l&&a.area<p)){var f=[];for(o=0;o<a.length;o++)s=a[o],(i||s[2]>p)&&(f.push(s),t.numSimplified++),t.numPoints++;c.push(f)}else t.numPoints+=a.length;c.length&&t.features.push({geometry:c,type:l,tags:e.tags||null})}t.exports=i},function(t,e,n){function i(t,e){switch(t&&t.type||null){case\\\"FeatureCollection\\\":return t.features=t.features.map(r(i,e)),t;case\\\"Feature\\\":return t.geometry=i(t.geometry,e),t;case\\\"Polygon\\\":case\\\"MultiPolygon\\\":return o(t,e);default:return t}}function r(t,e){return function(n){return t(n,e)}}function o(t,e){return\\\"Polygon\\\"===t.type?t.coordinates=a(t.coordinates,e):\\\"MultiPolygon\\\"===t.type&&(t.coordinates=t.coordinates.map(r(a,e))),t}function a(t,e){e=!!e,t[0]=s(t[0],!e);for(var n=1;n<t.length;n++)t[n]=s(t[n],e);return t}function s(t,e){return u(t)===e?t:t.reverse()}function u(t){return l.ring(t)>=0}var l=n(110);t.exports=i},function(t,e,n){function i(t){if(\\\"Polygon\\\"===t.type)return r(t.coordinates);if(\\\"MultiPolygon\\\"===t.type){for(var e=0,n=0;n<t.coordinates.length;n++)e+=r(t.coordinates[n]);return e}return null}function r(t){var e=0;if(t&&t.length>0){e+=Math.abs(o(t[0]));for(var n=1;n<t.length;n++)e-=Math.abs(o(t[n]))}return e}function o(t){var e=0;if(t.length>2){for(var n,i,r=0;r<t.length-1;r++)n=t[r],i=t[r+1],e+=a(i[0]-n[0])*(2+Math.sin(a(n[1]))+Math.sin(a(i[1])));e=e*s.RADIUS*s.RADIUS/2}return e}function a(t){return t*Math.PI/180}var s=n(111);t.exports.geometry=i,t.exports.ring=o},function(t,e){t.exports.RADIUS=6378137,t.exports.FLATTENING=1/298.257223563,t.exports.POLAR_RADIUS=6356752.3142},function(t,e,n){\\\"use strict\\\";function i(t){this.features=t,this.length=t.length,this.extent=s}function r(t){if(this.type=t.type,1===t.type){this.rawGeometry=[];for(var e=0;e<t.geometry.length;e++)this.rawGeometry.push([t.geometry[e]])}else this.rawGeometry=t.geometry;this.properties=t.tags,this.extent=s}var o=n(2),a=n(12).VectorTileFeature,s=n(4).EXTENT;t.exports=i,i.prototype.feature=function(t){return new r(this.features[t])},r.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],i=[],r=0;r<n.length;r++)i.push(new o(n[r][0],n[r][1]));this.geometry.push(i)}return this.geometry},r.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,i=1/0,r=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),i=Math.min(i,u.y),r=Math.max(r,u.y)}return[e,i,n,r]},r.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){function i(t){var e=[];for(var n in t.layers)e.push(o(t.layers[n]));var i=new c;return p.tile.write({layers:e},i),i.finish()}function r(t){var e={};for(var n in t)e[n]=new f(t[n].features),e[n].name=n;return i({layers:e})}function o(t){for(var e={name:t.name||\\\"\\\",version:t.version||1,extent:t.extent||4096,keys:[],values:[],features:[]},n={},i={},r=0;r<t.length;r++){var o=t.feature(r);o.geometry=u(o.loadGeometry());var a=[];for(var s in o.properties){var c=n[s];void 0===c&&(e.keys.push(s),c=e.keys.length-1,n[s]=c);var p=l(o.properties[s]),f=i[p.key];void 0===f&&(e.values.push(p),f=e.values.length-1,i[p.key]=f),a.push(c),a.push(f)}o.tags=a,e.features.push(o)}return e}function a(t,e){return(e<<3)+(7&t)}function s(t){return t<<1^t>>31}function u(t){for(var e=[],n=0,i=0,r=t.length,o=0;o<r;o++){var u=t[o];e.push(a(1,1));for(var l=0;l<u.length;l++){1===l&&e.push(a(2,u.length-1));var c=u[l].x-n,p=u[l].y-i;e.push(s(c),s(p)),n+=c,i+=p}}return e}function l(t){var e,n=typeof t;return\\\"string\\\"===n?e={string_value:t}:\\\"boolean\\\"===n?e={bool_value:t}:\\\"number\\\"===n?e=t%1!=0?{double_value:t}:t<0?{sint_value:t}:{uint_value:t}:(t=JSON.stringify(t),e={string_value:t}),e.key=n+\\\":\\\"+t,e}var c=n(13),p=n(114),f=n(115);t.exports=i,t.exports.fromVectorTileJs=i,t.exports.fromGeojsonVt=r,t.exports.GeoJSONWrapper=f},function(t,e,n){\\\"use strict\\\";function i(t,e){return t.readFields(r,{layers:[]},e)}function r(t,e,n){3===t&&e.layers.push(f(n,n.readVarint()+n.pos))}function o(t,e){var n;if(void 0!==t.layers)for(n=0;n<t.layers.length;n++)e.writeMessage(3,d,t.layers[n])}function a(t,e){return t.readFields(s,{},e)}function s(t,e,n){1===t?e.string_value=n.readString():2===t?e.float_value=n.readFloat():3===t?e.double_value=n.readDouble():4===t?e.int_value=n.readVarint():5===t?e.uint_value=n.readVarint():6===t?e.sint_value=n.readSVarint():7===t&&(e.bool_value=n.readBoolean())}function u(t,e){void 0!==t.string_value&&e.writeStringField(1,t.string_value),void 0!==t.float_value&&e.writeFloatField(2,t.float_value),void 0!==t.double_value&&e.writeDoubleField(3,t.double_value),void 0!==t.int_value&&e.writeVarintField(4,t.int_value),void 0!==t.uint_value&&e.writeVarintField(5,t.uint_value),void 0!==t.sint_value&&e.writeSVarintField(6,t.sint_value),void 0!==t.bool_value&&e.writeBooleanField(7,t.bool_value)}function l(t,e){var n=t.readFields(c,{},e);return void 0===n.type&&(n.type=\\\"Unknown\\\"),n}function c(t,e,n){1===t?e.id=n.readVarint():2===t?e.tags=n.readPackedVarint():3===t?e.type=n.readVarint():4===t&&(e.geometry=n.readPackedVarint())}function p(t,e){void 0!==t.id&&e.writeVarintField(1,t.id),void 0!==t.tags&&e.writePackedVarint(2,t.tags),void 0!==t.type&&e.writeVarintField(3,t.type),void 0!==t.geometry&&e.writePackedVarint(4,t.geometry)}function f(t,e){return t.readFields(h,{features:[],keys:[],values:[]},e)}function h(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():2===t?e.features.push(l(n,n.readVarint()+n.pos)):3===t?e.keys.push(n.readString()):4===t?e.values.push(a(n,n.readVarint()+n.pos)):5===t&&(e.extent=n.readVarint())}function d(t,e){void 0!==t.version&&e.writeVarintField(15,t.version),void 0!==t.name&&e.writeStringField(1,t.name);var n;if(void 0!==t.features)for(n=0;n<t.features.length;n++)e.writeMessage(2,p,t.features[n]);if(void 0!==t.keys)for(n=0;n<t.keys.length;n++)e.writeStringField(3,t.keys[n]);if(void 0!==t.values)for(n=0;n<t.values.length;n++)e.writeMessage(4,u,t.values[n]);void 0!==t.extent&&e.writeVarintField(5,t.extent)}var y=e.tile={read:i,write:o};y.GeomType={Unknown:0,Point:1,LineString:2,Polygon:3},y.value={read:a,write:u},y.feature={read:l,write:p},y.layer={read:f,write:d}},function(t,e,n){\\\"use strict\\\";function i(t){this.features=t,this.length=t.length}function r(t){this.id=\\\"number\\\"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=4096}var o=n(2),a=n(12).VectorTileFeature;t.exports=i,i.prototype.feature=function(t){return new r(this.features[t])},r.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],i=[],r=0;r<n.length;r++)i.push(new o(n[r][0],n[r][1]));this.geometry.push(i)}return this.geometry},r.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,i=1/0,r=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),i=Math.min(i,u.y),r=Math.max(r,u.y)}return[e,i,n,r]},r.prototype.toGeoJSON=a.prototype.toGeoJSON}]);\\n//# sourceMappingURL=cec7116681391ae7493a.worker.js.cec7116681391ae7493a.map\", __webpack_public_path__ + \"cec7116681391ae7493a.worker.js\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/source/worker.js\n// module id = 1037\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar earcut = require('earcut');\nvar classifyRings = require('../../util/classify_rings');\nvar EARCUT_MAX_RINGS = 500;\n\nmodule.exports = FillBucket;\n\nfunction FillBucket() {\n    Bucket.apply(this, arguments);\n}\n\nFillBucket.prototype = util.inherit(Bucket, {});\n\nFillBucket.prototype.programInterfaces = {\n    fill: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        elementBufferComponents: 1,\n        elementBuffer2: true,\n        elementBuffer2Components: 2,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }],\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-color'\n        }, {\n            name: 'a_outline_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-outline-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-outline-color'\n        }]\n    }\n};\n\nFillBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    var polygons = classifyRings(lines, EARCUT_MAX_RINGS);\n\n    var startGroup = this.makeRoomFor('fill', 0);\n    var startIndex = startGroup.layout.vertex.length;\n\n    for (var i = 0; i < polygons.length; i++) {\n        this.addPolygon(polygons[i]);\n    }\n\n    this.populatePaintArrays('fill', {zoom: this.zoom}, feature.properties, startGroup, startIndex);\n};\n\nFillBucket.prototype.addPolygon = function(polygon) {\n    var numVertices = 0;\n    for (var k = 0; k < polygon.length; k++) {\n        numVertices += polygon[k].length;\n    }\n\n    var group = this.makeRoomFor('fill', numVertices);\n    var flattened = [];\n    var holeIndices = [];\n    var startIndex = group.layout.vertex.length;\n\n    for (var r = 0; r < polygon.length; r++) {\n        var ring = polygon[r];\n\n        if (r > 0) holeIndices.push(flattened.length / 2);\n\n        for (var v = 0; v < ring.length; v++) {\n            var vertex = ring[v];\n\n            var index = group.layout.vertex.emplaceBack(vertex.x, vertex.y);\n\n            if (v >= 1) {\n                group.layout.element2.emplaceBack(index - 1, index);\n            }\n\n            // convert to format used by earcut\n            flattened.push(vertex.x);\n            flattened.push(vertex.y);\n        }\n    }\n\n    var triangleIndices = earcut(flattened, holeIndices);\n\n    for (var i = 0; i < triangleIndices.length; i++) {\n        group.layout.element.emplaceBack(triangleIndices[i] + startIndex);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/fill_bucket.js\n// module id = 1038\n// module chunks = 0 1","'use strict';\n\nvar quickselect = require('quickselect');\n\n// classifies an array of rings into polygons with outer rings and holes\nmodule.exports = function classifyRings(rings, maxRings) {\n    var len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    var polygons = [],\n        polygon,\n        ccw;\n\n    for (var i = 0; i < len; i++) {\n        var area = calculateSignedArea(rings[i]);\n        if (area === 0) continue;\n\n        rings[i].area = Math.abs(area);\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    // Earcut performance degrages with the # of rings in a polygon. For this\n    // reason, we limit strip out all but the `maxRings` largest rings.\n    if (maxRings > 1) {\n        for (var j = 0; j < polygons.length; j++) {\n            if (polygons[j].length <= maxRings) continue;\n            quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n            polygons[j] = polygons[j].slice(0, maxRings);\n        }\n    }\n\n    return polygons;\n};\n\nfunction compareAreas(a, b) {\n    return b.area - a.area;\n}\n\nfunction calculateSignedArea(ring) {\n    var sum = 0;\n    for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/classify_rings.js\n// module id = 1039\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar EXTENT = Bucket.EXTENT;\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nvar EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nvar COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nvar SHARP_CORNER_OFFSET = 15;\n\n// The number of bits that is used to store the line distance in the buffer.\nvar LINE_DISTANCE_BUFFER_BITS = 14;\n\n// We don't have enough bits for the line distance as we'd like to have, so\n// use this value to scale the line distance (in tile units) down to a smaller\n// value. This lets us store longer distances while sacrificing precision.\nvar LINE_DISTANCE_SCALE = 1 / 2;\n\n// The maximum line distance, in tile units, that fits in the buffer.\nvar MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS) / LINE_DISTANCE_SCALE;\n\n\nmodule.exports = LineBucket;\n\n/**\n * @private\n */\nfunction LineBucket() {\n    Bucket.apply(this, arguments);\n}\n\nLineBucket.prototype = util.inherit(Bucket, {});\n\nLineBucket.prototype.addLineVertex = function(vertexBuffer, point, extrude, tx, ty, dir, linesofar) {\n    return vertexBuffer.emplaceBack(\n            // a_pos\n            (point.x << 1) | tx,\n            (point.y << 1) | ty,\n            // a_data\n            // add 128 to store an byte in an unsigned byte\n            Math.round(EXTRUDE_SCALE * extrude.x) + 128,\n            Math.round(EXTRUDE_SCALE * extrude.y) + 128,\n            // Encode the -1/0/1 direction value into the first two bits of .z of a_data.\n            // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make\n            // room for the direction value). The upper 8 bits of `linesofar` are placed in\n            // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that\n            // we can store longer distances while sacrificing precision.\n            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2),\n            (linesofar * LINE_DISTANCE_SCALE) >> 6);\n};\n\nLineBucket.prototype.programInterfaces = {\n    line: {\n        vertexBuffer: true,\n        elementBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 4,\n            type: 'Uint8'\n        }]\n    }\n};\n\nLineBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    for (var i = 0; i < lines.length; i++) {\n        this.addLine(\n            lines[i],\n            this.layer.layout['line-join'],\n            this.layer.layout['line-cap'],\n            this.layer.layout['line-miter-limit'],\n            this.layer.layout['line-round-limit']\n        );\n    }\n};\n\nLineBucket.prototype.addLine = function(vertices, join, cap, miterLimit, roundLimit) {\n\n    var len = vertices.length;\n    // If the line has duplicate vertices at the end, adjust length to remove them.\n    while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) {\n        len--;\n    }\n\n    // a line must have at least two vertices\n    if (vertices.length < 2) return;\n\n    if (join === 'bevel') miterLimit = 1.05;\n\n    var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling));\n\n    var firstVertex = vertices[0],\n        lastVertex = vertices[len - 1],\n        closed = firstVertex.equals(lastVertex);\n\n    // we could be more precise, but it would only save a negligible amount of space\n    this.makeRoomFor('line', len * 10);\n\n    // a line may not have coincident points\n    if (len === 2 && closed) return;\n\n    this.distance = 0;\n\n    var beginCap = cap,\n        endCap = closed ? 'butt' : cap,\n        startOfLine = true,\n        currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n    // the last three vertices added\n    this.e1 = this.e2 = this.e3 = -1;\n\n    if (closed) {\n        currentVertex = vertices[len - 2];\n        nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n    }\n\n    for (var i = 0; i < len; i++) {\n\n        nextVertex = closed && i === len - 1 ?\n            vertices[1] : // if the line is closed, we treat the last vertex like the first\n            vertices[i + 1]; // just the next vertex\n\n        // if two consecutive vertices exist, skip the current one\n        if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n        if (nextNormal) prevNormal = nextNormal;\n        if (currentVertex) prevVertex = currentVertex;\n\n        currentVertex = vertices[i];\n\n        // Calculate the normal towards the next vertex in this line. In case\n        // there is no next vertex, pretend that the line is continuing straight,\n        // meaning that we are just using the previous normal.\n        nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n        // If we still don't have a previous normal, this is the beginning of a\n        // non-closed line, so we're doing a straight \"join\".\n        prevNormal = prevNormal || nextNormal;\n\n        // Determine the normal of the join extrusion. It is the angle bisector\n        // of the segments between the previous line and the next line.\n        var joinNormal = prevNormal.add(nextNormal)._unit();\n\n        /*  joinNormal     prevNormal\n         *             ↖      ↑\n         *                .________. prevVertex\n         *                |\n         * nextNormal  ←  |  currentVertex\n         *                |\n         *     nextVertex !\n         *\n         */\n\n        // Calculate the length of the miter (the ratio of the miter to the width).\n        // Find the cosine of the angle between the next and join normals\n        // using dot product. The inverse of that is the miter length.\n        var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n        var miterLength = 1 / cosHalfAngle;\n\n        var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n\n        if (isSharpCorner && i > 0) {\n            var prevSegmentLength = currentVertex.dist(prevVertex);\n            if (prevSegmentLength > 2 * sharpCornerOffset) {\n                var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n                this.distance += newPrevVertex.dist(prevVertex);\n                this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false);\n                prevVertex = newPrevVertex;\n            }\n        }\n\n        // The join if a middle vertex, otherwise the cap.\n        var middleVertex = prevVertex && nextVertex;\n        var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n        if (middleVertex && currentJoin === 'round') {\n            if (miterLength < roundLimit) {\n                currentJoin = 'miter';\n            } else if (miterLength <= 2) {\n                currentJoin = 'fakeround';\n            }\n        }\n\n        if (currentJoin === 'miter' && miterLength > miterLimit) {\n            currentJoin = 'bevel';\n        }\n\n        if (currentJoin === 'bevel') {\n            // The maximum extrude length is 128 / 63 = 2 times the width of the line\n            // so if miterLength >= 2 we need to draw a different type of bevel where.\n            if (miterLength > 2) currentJoin = 'flipbevel';\n\n            // If the miterLength is really small and the line bevel wouldn't be visible,\n            // just draw a miter join to save a triangle.\n            if (miterLength < miterLimit) currentJoin = 'miter';\n        }\n\n        // Calculate how far along the line the currentVertex is\n        if (prevVertex) this.distance += currentVertex.dist(prevVertex);\n\n        if (currentJoin === 'miter') {\n\n            joinNormal._mult(miterLength);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n\n        } else if (currentJoin === 'flipbevel') {\n            // miter is too big, flip the direction to make a beveled join\n\n            if (miterLength > 100) {\n                // Almost parallel lines\n                joinNormal = nextNormal.clone();\n\n            } else {\n                var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n                var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n                joinNormal._perp()._mult(bevelLength * direction);\n            }\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false);\n\n        } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n            var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n            var offset = -Math.sqrt(miterLength * miterLength - 1);\n            if (lineTurnsLeft) {\n                offsetB = 0;\n                offsetA = offset;\n            } else {\n                offsetA = 0;\n                offsetB = offset;\n            }\n\n            // Close previous segment with a bevel\n            if (!startOfLine) {\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false);\n            }\n\n            if (currentJoin === 'fakeround') {\n                // The join angle is sharp enough that a round join would be visible.\n                // Bevel joins fill the gap between segments with a single pie slice triangle.\n                // Create a round join by adding multiple pie slices. The join isn't actually round, but\n                // it looks like it is at the sizes we render lines at.\n\n                // Add more triangles for sharper angles.\n                // This math is just a good enough approximation. It isn't \"correct\".\n                var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n                var approxFractionalJoinNormal;\n\n                for (var m = 0; m < n; m++) {\n                    approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n\n                this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft);\n\n                for (var k = n - 1; k >= 0; k--) {\n                    approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false);\n            }\n\n        } else if (currentJoin === 'butt') {\n            if (!startOfLine) {\n                // Close previous segment with a butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n            }\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n\n        } else if (currentJoin === 'square') {\n\n            if (!startOfLine) {\n                // Close previous segment with a square cap\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false);\n            }\n\n        } else if (currentJoin === 'round') {\n\n            if (!startOfLine) {\n                // Close previous segment with butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n\n                // Add round cap or linejoin at end of segment\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                // Add round cap before first segment\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true);\n\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n        }\n\n        if (isSharpCorner && i < len - 1) {\n            var nextSegmentLength = currentVertex.dist(nextVertex);\n            if (nextSegmentLength > 2 * sharpCornerOffset) {\n                var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n                this.distance += newCurrentVertex.dist(currentVertex);\n                this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false);\n                currentVertex = newCurrentVertex;\n            }\n        }\n\n        startOfLine = false;\n    }\n\n};\n\n/**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beginning of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\nLineBucket.prototype.addCurrentVertex = function(currentVertex, distance, normal, endLeft, endRight, round) {\n    var tx = round ? 1 : 0;\n    var extrude;\n    var layoutArrays = this.arrayGroups.line[this.arrayGroups.line.length - 1].layout;\n    var vertexArray = layoutArrays.vertex;\n    var elementArray = layoutArrays.element;\n\n    extrude = normal.clone();\n    if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, tx, 0, endLeft, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    extrude = normal.mult(-1);\n    if (endRight) extrude._sub(normal.perp()._mult(endRight));\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, tx, 1, -endRight, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    // There is a maximum \"distance along the line\" that we can store in the buffers.\n    // When we get close to the distance, reset it to zero and add the vertex again with\n    // a distance of zero. The max distance is determined by the number of bits we allocate\n    // to `linesofar`.\n    if (distance > MAX_LINE_DISTANCE / 2) {\n        this.distance = 0;\n        this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round);\n    }\n};\n\n/**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\nLineBucket.prototype.addPieSliceVertex = function(currentVertex, distance, extrude, lineTurnsLeft) {\n    var ty = lineTurnsLeft ? 1 : 0;\n    extrude = extrude.mult(lineTurnsLeft ? -1 : 1);\n    var layoutArrays = this.arrayGroups.line[this.arrayGroups.line.length - 1].layout;\n    var vertexArray = layoutArrays.vertex;\n    var elementArray = layoutArrays.element;\n\n    this.e3 = this.addLineVertex(vertexArray, currentVertex, extrude, 0, ty, 0, distance);\n\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n\n    if (lineTurnsLeft) {\n        this.e2 = this.e3;\n    } else {\n        this.e1 = this.e3;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/line_bucket.js\n// module id = 1040\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = CircleBucket;\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nfunction CircleBucket() {\n    Bucket.apply(this, arguments);\n}\n\nCircleBucket.prototype = util.inherit(Bucket, {});\n\nCircleBucket.prototype.addCircleVertex = function(vertexArray, x, y, extrudeX, extrudeY) {\n    return vertexArray.emplaceBack(\n            (x * 2) + ((extrudeX + 1) / 2),\n            (y * 2) + ((extrudeY + 1) / 2));\n};\n\nCircleBucket.prototype.programInterfaces = {\n    circle: {\n        vertexBuffer: true,\n        elementBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }],\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"circle-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'circle-color'\n        }, {\n            name: 'a_radius',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-radius\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-radius'\n        }, {\n            name: 'a_blur',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-blur\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-blur'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'circle-opacity'\n        }]\n    }\n};\n\nCircleBucket.prototype.addFeature = function(feature) {\n    var globalProperties = {zoom: this.zoom};\n    var geometries = loadGeometry(feature);\n\n    var startGroup = this.makeRoomFor('circle', 0);\n    var startIndex = startGroup.layout.vertex.length;\n\n    for (var j = 0; j < geometries.length; j++) {\n        for (var k = 0; k < geometries[j].length; k++) {\n\n            var x = geometries[j][k].x;\n            var y = geometries[j][k].y;\n\n            // Do not include points that are outside the tile boundaries.\n            if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n            // this geometry will be of the Point type, and we'll derive\n            // two triangles from it.\n            //\n            // ┌─────────┐\n            // │ 3     2 │\n            // │         │\n            // │ 0     1 │\n            // └─────────┘\n\n            var group = this.makeRoomFor('circle', 4);\n            var vertexArray = group.layout.vertex;\n\n            var index = this.addCircleVertex(vertexArray, x, y, -1, -1);\n            this.addCircleVertex(vertexArray, x, y, 1, -1);\n            this.addCircleVertex(vertexArray, x, y, 1, 1);\n            this.addCircleVertex(vertexArray, x, y, -1, 1);\n\n            group.layout.element.emplaceBack(index, index + 1, index + 2);\n            group.layout.element.emplaceBack(index, index + 3, index + 2);\n        }\n    }\n\n    this.populatePaintArrays('circle', globalProperties, feature.properties, startGroup, startIndex);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/circle_bucket.js\n// module id = 1041\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nvar Bucket = require('../bucket');\nvar Anchor = require('../../symbol/anchor');\nvar getAnchors = require('../../symbol/get_anchors');\nvar resolveTokens = require('../../util/token');\nvar Quads = require('../../symbol/quads');\nvar Shaping = require('../../symbol/shaping');\nvar resolveText = require('../../symbol/resolve_text');\nvar mergeLines = require('../../symbol/mergelines');\nvar clipLine = require('../../symbol/clip_line');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar CollisionFeature = require('../../symbol/collision_feature');\n\nvar shapeText = Shaping.shapeText;\nvar shapeIcon = Shaping.shapeIcon;\nvar getGlyphQuads = Quads.getGlyphQuads;\nvar getIconQuads = Quads.getIconQuads;\n\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = SymbolBucket;\n\nfunction SymbolBucket(options) {\n    Bucket.apply(this, arguments);\n    this.showCollisionBoxes = options.showCollisionBoxes;\n    this.overscaling = options.overscaling;\n    this.collisionBoxArray = options.collisionBoxArray;\n    this.symbolQuadsArray = options.symbolQuadsArray;\n    this.symbolInstancesArray = options.symbolInstancesArray;\n\n    this.sdfIcons = options.sdfIcons;\n    this.iconsNeedLinear = options.iconsNeedLinear;\n    this.adjustedTextSize = options.adjustedTextSize;\n    this.adjustedIconSize = options.adjustedIconSize;\n    this.fontstack = options.fontstack;\n}\n\nSymbolBucket.prototype = util.inherit(Bucket, {});\n\nSymbolBucket.prototype.serialize = function() {\n    var serialized = Bucket.prototype.serialize.apply(this);\n    serialized.sdfIcons = this.sdfIcons;\n    serialized.iconsNeedLinear = this.iconsNeedLinear;\n    serialized.adjustedTextSize = this.adjustedTextSize;\n    serialized.adjustedIconSize = this.adjustedIconSize;\n    serialized.fontstack = this.fontstack;\n    return serialized;\n};\n\nvar programAttributes = [{\n    name: 'a_pos',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_offset',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_data1',\n    components: 4,\n    type: 'Uint8'\n}, {\n    name: 'a_data2',\n    components: 2,\n    type: 'Uint8'\n}];\n\nfunction addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom) {\n    return array.emplaceBack(\n            // pos\n            x,\n            y,\n            // offset\n            Math.round(ox * 64), // use 1/64 pixels for placement\n            Math.round(oy * 64),\n            // data1\n            tx / 4,                   // tex\n            ty / 4,                   // tex\n            (labelminzoom || 0) * 10, // labelminzoom\n            0,\n            // data2\n            (minzoom || 0) * 10,               // minzoom\n            Math.min(maxzoom || 25, 25) * 10); // minzoom\n}\n\nSymbolBucket.prototype.addCollisionBoxVertex = function(vertexArray, point, extrude, maxZoom, placementZoom) {\n    return vertexArray.emplaceBack(\n            // pos\n            point.x,\n            point.y,\n            // extrude\n            Math.round(extrude.x),\n            Math.round(extrude.y),\n            // data\n            maxZoom * 10,\n            placementZoom * 10);\n};\n\nSymbolBucket.prototype.programInterfaces = {\n\n    glyph: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        layoutAttributes: programAttributes\n    },\n\n    icon: {\n        vertexBuffer: true,\n        elementBuffer: true,\n        layoutAttributes: programAttributes\n    },\n\n    collisionBox: {\n        vertexBuffer: true,\n\n        layoutAttributes: [{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_extrude',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 2,\n            type: 'Uint8'\n        }]\n    }\n};\n\nSymbolBucket.prototype.populateBuffers = function(collisionTile, stacks, icons) {\n\n    // To reduce the number of labels that jump around when zooming we need\n    // to use a text-size value that is the same for all zoom levels.\n    // This calculates text-size at a high zoom level so that all tiles can\n    // use the same value when calculating anchor positions.\n    var zoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\n    this.adjustedTextMaxSize = this.layer.getLayoutValue('text-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedTextSize = this.layer.getLayoutValue('text-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n    this.adjustedIconMaxSize = this.layer.getLayoutValue('icon-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedIconSize = this.layer.getLayoutValue('icon-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n\n    var tileSize = 512 * this.overscaling;\n    this.tilePixelRatio = EXTENT / tileSize;\n    this.compareText = {};\n    this.iconsNeedLinear = false;\n    this.symbolInstancesStartIndex = this.symbolInstancesArray.length;\n\n    var layout = this.layer.layout;\n    var features = this.features;\n    var textFeatures = this.textFeatures;\n\n    var horizontalAlign = 0.5,\n        verticalAlign = 0.5;\n\n    switch (layout['text-anchor']) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        horizontalAlign = 1;\n        break;\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        horizontalAlign = 0;\n        break;\n    }\n\n    switch (layout['text-anchor']) {\n    case 'bottom':\n    case 'bottom-right':\n    case 'bottom-left':\n        verticalAlign = 1;\n        break;\n    case 'top':\n    case 'top-right':\n    case 'top-left':\n        verticalAlign = 0;\n        break;\n    }\n\n    var justify = layout['text-justify'] === 'right' ? 1 :\n        layout['text-justify'] === 'left' ? 0 :\n        0.5;\n\n    var oneEm = 24;\n    var lineHeight = layout['text-line-height'] * oneEm;\n    var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n    var spacing = layout['text-letter-spacing'] * oneEm;\n    var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n    var fontstack = this.fontstack = layout['text-font'].join(',');\n\n    var geometries = [];\n    for (var g = 0; g < features.length; g++) {\n        geometries.push(loadGeometry(features[g]));\n    }\n\n    if (layout['symbol-placement'] === 'line') {\n        // Merge adjacent lines with the same text to improve labelling.\n        // It's better to place labels on one long line than on many short segments.\n        var merged = mergeLines(features, textFeatures, geometries);\n\n        geometries = merged.geometries;\n        features = merged.features;\n        textFeatures = merged.textFeatures;\n    }\n\n    var shapedText, shapedIcon;\n\n    for (var k = 0; k < features.length; k++) {\n        if (!geometries[k]) continue;\n\n        if (textFeatures[k]) {\n            shapedText = shapeText(textFeatures[k], stacks[fontstack], maxWidth,\n                    lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset);\n        } else {\n            shapedText = null;\n        }\n\n        if (layout['icon-image']) {\n            var iconName = resolveTokens(features[k].properties, layout['icon-image']);\n            var image = icons[iconName];\n            shapedIcon = shapeIcon(image, layout);\n\n            if (image) {\n                if (this.sdfIcons === undefined) {\n                    this.sdfIcons = image.sdf;\n                } else if (this.sdfIcons !== image.sdf) {\n                    util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n                }\n                if (image.pixelRatio !== 1) {\n                    this.iconsNeedLinear = true;\n                }\n            }\n        } else {\n            shapedIcon = null;\n        }\n\n        if (shapedText || shapedIcon) {\n            this.addFeature(geometries[k], shapedText, shapedIcon, features[k].index);\n        }\n    }\n    this.symbolInstancesEndIndex = this.symbolInstancesArray.length;\n    this.placeFeatures(collisionTile, this.showCollisionBoxes);\n\n    this.trimArrays();\n};\n\nSymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon, featureIndex) {\n    var layout = this.layer.layout;\n\n    var glyphSize = 24;\n\n    var fontScale = this.adjustedTextSize / glyphSize,\n        textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize,\n        textBoxScale = this.tilePixelRatio * fontScale,\n        textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize,\n        iconBoxScale = this.tilePixelRatio * this.adjustedIconSize,\n        symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'],\n        avoidEdges = layout['symbol-avoid-edges'],\n        textPadding = layout['text-padding'] * this.tilePixelRatio,\n        iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n        textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n        textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n            layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n        isLine = layout['symbol-placement'] === 'line',\n        textRepeatDistance = symbolMinDistance / 2;\n\n    if (isLine) {\n        lines = clipLine(lines, 0, 0, EXTENT, EXTENT);\n    }\n\n    for (var i = 0; i < lines.length; i++) {\n        var line = lines[i];\n\n        // Calculate the anchor points around which you want to place labels\n        var anchors;\n        if (isLine) {\n            anchors = getAnchors(\n                line,\n                symbolMinDistance,\n                textMaxAngle,\n                shapedText,\n                shapedIcon,\n                glyphSize,\n                textMaxBoxScale,\n                this.overscaling,\n                EXTENT\n            );\n        } else {\n            anchors = [ new Anchor(line[0].x, line[0].y, 0) ];\n        }\n\n        // For each potential label, create the placement features used to check for collisions, and the quads use for rendering.\n        for (var j = 0, len = anchors.length; j < len; j++) {\n            var anchor = anchors[j];\n\n            if (shapedText && isLine) {\n                if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n                    continue;\n                }\n            }\n\n            var inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT);\n\n            if (avoidEdges && !inside) continue;\n\n            // Normally symbol layers are drawn across tile boundaries. Only symbols\n            // with their anchors within the tile boundaries are added to the buffers\n            // to prevent symbols from being drawn twice.\n            //\n            // Symbols in layers with overlap are sorted in the y direction so that\n            // symbols lower on the canvas are drawn on top of symbols near the top.\n            // To preserve this order across tile boundaries these symbols can't\n            // be drawn across tile boundaries. Instead they need to be included in\n            // the buffers for both tiles and clipped to tile boundaries at draw time.\n            var addToBuffers = inside || mayOverlap;\n            this.addSymbolInstance(anchor, line, shapedText, shapedIcon, layout,\n                addToBuffers, this.symbolInstancesArray.length, this.collisionBoxArray, featureIndex, this.sourceLayerIndex, this.index,\n                textBoxScale, textPadding, textAlongLine,\n                iconBoxScale, iconPadding, iconAlongLine);\n        }\n    }\n};\n\nSymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) {\n    var compareText = this.compareText;\n    if (!(text in compareText)) {\n        compareText[text] = [];\n    } else {\n        var otherAnchors = compareText[text];\n        for (var k = otherAnchors.length - 1; k >= 0; k--) {\n            if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n                // If it's within repeatDistance of one anchor, stop looking\n                return true;\n            }\n        }\n    }\n    // If anchor is not within repeatDistance of any other anchor, add to array\n    compareText[text].push(anchor);\n    return false;\n};\n\nSymbolBucket.prototype.placeFeatures = function(collisionTile, showCollisionBoxes) {\n    this.recalculateStyleLayers();\n\n    // Calculate which labels can be shown and when they can be shown and\n    // create the bufers used for rendering.\n\n    this.createArrays();\n\n    var layout = this.layer.layout;\n\n    var maxScale = collisionTile.maxScale;\n\n    var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n    var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n    var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n        layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n    // Sort symbols by their y position on the canvas so that the lower symbols\n    // are drawn on top of higher symbols.\n    // Don't sort symbols that won't overlap because it isn't necessary and\n    // because it causes more labels to pop in and out when rotating.\n    if (mayOverlap) {\n        // Only need the symbol instances from the current tile to sort, so convert those instances into an array\n        // of `StructType`s to enable sorting\n        var symbolInstancesStructTypeArray = this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex, this.symbolInstancesEndIndex);\n\n        var angle = collisionTile.angle;\n\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle);\n\n        this.sortedSymbolInstances = symbolInstancesStructTypeArray.sort(function(a, b) {\n            var aRotated = (sin * a.anchorPointX + cos * a.anchorPointY) | 0;\n            var bRotated = (sin * b.anchorPointX + cos * b.anchorPointY) | 0;\n            return (aRotated - bRotated) || (b.index - a.index);\n        });\n    }\n\n    for (var p = this.symbolInstancesStartIndex; p < this.symbolInstancesEndIndex; p++) {\n        var symbolInstance = this.sortedSymbolInstances ? this.sortedSymbolInstances[p - this.symbolInstancesStartIndex] : this.symbolInstancesArray.get(p);\n        var textCollisionFeature = {\n            boxStartIndex: symbolInstance.textBoxStartIndex,\n            boxEndIndex: symbolInstance.textBoxEndIndex\n        };\n        var iconCollisionFeature = {\n            boxStartIndex: symbolInstance.iconBoxStartIndex,\n            boxEndIndex: symbolInstance.iconBoxEndIndex\n        };\n\n        var hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex);\n        var hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex);\n\n        var iconWithoutText = layout['text-optional'] || !hasText,\n            textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n        // Calculate the scales at which the text and icon can be placed without collision.\n\n        var glyphScale = hasText ?\n            collisionTile.placeCollisionFeature(textCollisionFeature,\n\t\t\t\t\tlayout['text-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n        var iconScale = hasIcon ?\n            collisionTile.placeCollisionFeature(iconCollisionFeature,\n                    layout['icon-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n\n        // Combine the scales for icons and text.\n\n        if (!iconWithoutText && !textWithoutIcon) {\n            iconScale = glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!textWithoutIcon && glyphScale) {\n            glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!iconWithoutText && iconScale) {\n            iconScale = Math.max(iconScale, glyphScale);\n        }\n\n\n        // Insert final placement into collision tree and add glyphs/icons to buffers\n\n        if (hasText) {\n            collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']);\n            if (glyphScale <= maxScale) {\n                this.addSymbols('glyph', symbolInstance.glyphQuadStartIndex, symbolInstance.glyphQuadEndIndex, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle);\n            }\n        }\n\n        if (hasIcon) {\n            collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']);\n            if (iconScale <= maxScale) {\n                this.addSymbols('icon', symbolInstance.iconQuadStartIndex, symbolInstance.iconQuadEndIndex, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle);\n            }\n        }\n\n    }\n\n    if (showCollisionBoxes) this.addToDebugBuffers(collisionTile);\n};\n\nSymbolBucket.prototype.addSymbols = function(programName, quadsStart, quadsEnd, scale, keepUpright, alongLine, placementAngle) {\n\n    var group = this.makeRoomFor(programName, 4 * (quadsEnd - quadsStart));\n\n    var elementArray = group.layout.element;\n    var vertexArray = group.layout.vertex;\n\n    var zoom = this.zoom;\n    var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n    for (var k = quadsStart; k < quadsEnd; k++) {\n\n        var symbol = this.symbolQuadsArray.get(k).SymbolQuad,\n            angle = symbol.angle;\n\n        // drop upside down versions of glyphs\n        var a = (angle + placementAngle + Math.PI) % (Math.PI * 2);\n        if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n        var tl = symbol.tl,\n            tr = symbol.tr,\n            bl = symbol.bl,\n            br = symbol.br,\n            tex = symbol.tex,\n            anchorPoint = symbol.anchorPoint,\n\n            minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom),\n            maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n        if (maxZoom <= minZoom) continue;\n\n        // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n        if (minZoom === placementZoom) minZoom = 0;\n\n        var index = addVertex(vertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n        addVertex(vertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n\n        elementArray.emplaceBack(index, index + 1, index + 2);\n        elementArray.emplaceBack(index + 1, index + 2, index + 3);\n    }\n\n};\n\nSymbolBucket.prototype.updateIcons = function(icons) {\n    this.recalculateStyleLayers();\n    var iconValue = this.layer.layout['icon-image'];\n    if (!iconValue) return;\n\n    for (var i = 0; i < this.features.length; i++) {\n        var iconName = resolveTokens(this.features[i].properties, iconValue);\n        if (iconName)\n            icons[iconName] = true;\n    }\n};\n\nSymbolBucket.prototype.updateFont = function(stacks) {\n    this.recalculateStyleLayers();\n    var fontName = this.layer.layout['text-font'],\n        stack = stacks[fontName] = stacks[fontName] || {};\n\n    this.textFeatures = resolveText(this.features, this.layer.layout, stack);\n};\n\nSymbolBucket.prototype.addToDebugBuffers = function(collisionTile) {\n    var group = this.makeRoomFor('collisionBox', 0);\n    var vertexArray = group.layout.vertex;\n    var angle = -collisionTile.angle;\n    var yStretch = collisionTile.yStretch;\n\n    for (var j = this.symbolInstancesStartIndex; j < this.symbolInstancesEndIndex; j++) {\n        var symbolInstance = this.symbolInstancesArray.get(j);\n        symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex};\n        symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex};\n\n        for (var i = 0; i < 2; i++) {\n            var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n            if (!feature) continue;\n\n            for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {\n                var box = this.collisionBoxArray.get(b);\n                var anchorPoint = box.anchorPoint;\n\n                var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n                var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n                var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n                var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n                var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n                var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(vertexArray, anchorPoint, tl, maxZoom, placementZoom);\n            }\n        }\n    }\n};\n\nSymbolBucket.prototype.addSymbolInstance = function(anchor, line, shapedText, shapedIcon, layout, addToBuffers, index, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex,\n    textBoxScale, textPadding, textAlongLine,\n    iconBoxScale, iconPadding, iconAlongLine) {\n\n    var glyphQuadStartIndex, glyphQuadEndIndex, iconQuadStartIndex, iconQuadEndIndex, textCollisionFeature, iconCollisionFeature, glyphQuads, iconQuads;\n    if (shapedText) {\n        glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layout, textAlongLine) : [];\n        textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedText, textBoxScale, textPadding, textAlongLine, false);\n    }\n\n    glyphQuadStartIndex = this.symbolQuadsArray.length;\n    if (glyphQuads && glyphQuads.length) {\n        for (var i = 0; i < glyphQuads.length; i++) {\n            this.addSymbolQuad(glyphQuads[i]);\n        }\n    }\n    glyphQuadEndIndex = this.symbolQuadsArray.length;\n\n    var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    if (shapedIcon) {\n        iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layout, iconAlongLine) : [];\n        iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true);\n    }\n\n    iconQuadStartIndex = this.symbolQuadsArray.length;\n    if (iconQuads && iconQuads.length === 1) {\n        this.addSymbolQuad(iconQuads[0]);\n    }\n    iconQuadEndIndex = this.symbolQuadsArray.length;\n\n    var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    return this.symbolInstancesArray.emplaceBack(\n        textBoxStartIndex,\n        textBoxEndIndex,\n        iconBoxStartIndex,\n        iconBoxEndIndex,\n        glyphQuadStartIndex,\n        glyphQuadEndIndex,\n        iconQuadStartIndex,\n        iconQuadEndIndex,\n        anchor.x,\n        anchor.y,\n        index);\n};\n\nSymbolBucket.prototype.addSymbolQuad = function(symbolQuad) {\n    return this.symbolQuadsArray.emplaceBack(\n        // anchorPoints\n        symbolQuad.anchorPoint.x,\n        symbolQuad.anchorPoint.y,\n        // corners\n        symbolQuad.tl.x,\n        symbolQuad.tl.y,\n        symbolQuad.tr.x,\n        symbolQuad.tr.y,\n        symbolQuad.bl.x,\n        symbolQuad.bl.y,\n        symbolQuad.br.x,\n        symbolQuad.br.y,\n        // texture\n        symbolQuad.tex.h,\n        symbolQuad.tex.w,\n        symbolQuad.tex.x,\n        symbolQuad.tex.y,\n        //angle\n        symbolQuad.angle,\n        // scales\n        symbolQuad.maxScale,\n        symbolQuad.minScale);\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/bucket/symbol_bucket.js\n// module id = 1042\n// module chunks = 0 1","'use strict';\n\nvar interpolate = require('../util/interpolate');\nvar Anchor = require('../symbol/anchor');\nvar checkMaxAngle = require('./check_max_angle');\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {\n\n    // Resample a line to get anchor points for labels and check that each\n    // potential label passes text-max-angle check and has enough froom to fit\n    // on the line.\n\n    var angleWindowSize = shapedText ?\n        3 / 5 * glyphSize * boxScale :\n        0;\n\n    var labelLength = Math.max(\n        shapedText ? shapedText.right - shapedText.left : 0,\n        shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n    // Is the line continued from outside the tile boundary?\n    var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n    // Is the label long, relative to the spacing?\n    // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n    if (spacing - labelLength * boxScale  < spacing / 4) {\n        spacing = labelLength * boxScale + spacing / 4;\n    }\n\n    // Offset the first anchor by:\n    // Either half the label length plus a fixed extra offset if the line is not continued\n    // Or half the spacing if the line is continued.\n\n    // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n    var fixedExtraOffset = glyphSize * 2;\n\n    var offset = !isLineContinued ?\n        ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n        (spacing / 2 * overscaling) % spacing;\n\n    return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {\n\n    var halfLabelLength = labelLength / 2;\n    var lineLength = 0;\n    for (var k = 0; k < line.length - 1; k++) {\n        lineLength += line[k].dist(line[k + 1]);\n    }\n\n    var distance = 0,\n        markedDistance = offset - spacing;\n\n    var anchors = [];\n\n    for (var i = 0; i < line.length - 1; i++) {\n\n        var a = line[i],\n            b = line[i + 1];\n\n        var segmentDist = a.dist(b),\n            angle = b.angleTo(a);\n\n        while (markedDistance + spacing < distance + segmentDist) {\n            markedDistance += spacing;\n\n            var t = (markedDistance - distance) / segmentDist,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            // Check that the point is within the tile boundaries and that\n            // the label would fit before the beginning and end of the line\n            // if placed at this point.\n            if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n                    markedDistance - halfLabelLength >= 0 &&\n                    markedDistance + halfLabelLength <= lineLength) {\n                var anchor = new Anchor(x, y, angle, i)._round();\n\n                if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                    anchors.push(anchor);\n                }\n            }\n        }\n\n        distance += segmentDist;\n    }\n\n    if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n        // The first attempt at finding anchors at which labels can be placed failed.\n        // Try again, but this time just try placing one anchor at the middle of the line.\n        // This has the most effect for short lines in overscaled tiles, since the\n        // initial offset used in overscaled tiles is calculated to align labels with positions in\n        // parent tiles instead of placing the label as close to the beginning as possible.\n        anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n    }\n\n    return anchors;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/get_anchors.js\n// module id = 1043\n// module chunks = 0 1","'use strict';\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n    // horizontal labels always pass\n    if (anchor.segment === undefined) return true;\n\n    var p = anchor;\n    var index = anchor.segment + 1;\n    var anchorDistance = 0;\n\n    // move backwards along the line to the first segment the label appears on\n    while (anchorDistance > -labelLength / 2) {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        if (index < 0) return false;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    }\n\n    anchorDistance += line[index].dist(line[index + 1]);\n    index++;\n\n    // store recent corners and their total angle difference\n    var recentCorners = [];\n    var recentAngleDelta = 0;\n\n    // move forwards by the length of the label and check angles along the way\n    while (anchorDistance < labelLength / 2) {\n        var prev = line[index - 1];\n        var current = line[index];\n        var next = line[index + 1];\n\n        // there isn't enough room for the label before the end of the line\n        if (!next) return false;\n\n        var angleDelta = prev.angleTo(current) - current.angleTo(next);\n        // restrict angle to -pi..pi range\n        angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n        recentCorners.push({\n            distance: anchorDistance,\n            angleDelta: angleDelta\n        });\n        recentAngleDelta += angleDelta;\n\n        // remove corners that are far enough away from the list of recent anchors\n        while (anchorDistance - recentCorners[0].distance > windowSize) {\n            recentAngleDelta -= recentCorners.shift().angleDelta;\n        }\n\n        // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n        if (recentAngleDelta > maxAngle) return false;\n\n        index++;\n        anchorDistance += current.dist(next);\n    }\n\n    // no part of the line had an angle greater than the maximum allowed. check passes.\n    return true;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/check_max_angle.js\n// module id = 1044\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n    shapeText: shapeText,\n    shapeIcon: shapeIcon\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph) {\n    this.codePoint = codePoint;\n    this.x = x;\n    this.y = y;\n    this.glyph = glyph;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right) {\n    this.positionedGlyphs = positionedGlyphs;\n    this.text = text;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) {\n\n    var positionedGlyphs = [];\n    var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]);\n\n    // the y offset *should* be part of the font metadata\n    var yOffset = -17;\n\n    var x = 0;\n    var y = yOffset;\n\n    for (var i = 0; i < text.length; i++) {\n        var codePoint = text.charCodeAt(i);\n        var glyph = glyphs[codePoint];\n\n        if (!glyph) continue;\n\n        positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph));\n        x += glyph.advance + spacing;\n    }\n\n    if (!positionedGlyphs.length) return false;\n\n    linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate);\n\n    return shaping;\n}\n\nvar invisible = {\n    0x20:   true, // space\n    0x200b: true  // zero-width space\n};\n\nvar breakable = {\n    0x20:   true, // space\n    0x26:   true, // ampersand\n    0x2b:   true, // plus sign\n    0x2d:   true, // hyphen-minus\n    0x2f:   true, // solidus\n    0xad:   true, // soft hyphen\n    0xb7:   true, // middle dot\n    0x200b: true, // zero-width space\n    0x2010: true, // hyphen\n    0x2013: true  // en dash\n};\n\nfunction linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate) {\n    var lastSafeBreak = null;\n\n    var lengthBeforeCurrentLine = 0;\n    var lineStartIndex = 0;\n    var line = 0;\n\n    var maxLineLength = 0;\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n\n    if (maxWidth) {\n        for (var i = 0; i < positionedGlyphs.length; i++) {\n            var positionedGlyph = positionedGlyphs[i];\n\n            positionedGlyph.x -= lengthBeforeCurrentLine;\n            positionedGlyph.y += lineHeight * line;\n\n            if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) {\n\n                var lineLength = positionedGlyphs[lastSafeBreak + 1].x;\n                maxLineLength = Math.max(lineLength, maxLineLength);\n\n                for (var k = lastSafeBreak + 1; k <= i; k++) {\n                    positionedGlyphs[k].y += lineHeight;\n                    positionedGlyphs[k].x -= lineLength;\n                }\n\n                if (justify) {\n                    // Collapse invisible characters.\n                    var lineEnd = lastSafeBreak;\n                    if (invisible[positionedGlyphs[lastSafeBreak].codePoint]) {\n                        lineEnd--;\n                    }\n\n                    justifyLine(positionedGlyphs, glyphs, lineStartIndex, lineEnd, justify);\n                }\n\n                lineStartIndex = lastSafeBreak + 1;\n                lastSafeBreak = null;\n                lengthBeforeCurrentLine += lineLength;\n                line++;\n            }\n\n            if (breakable[positionedGlyph.codePoint]) {\n                lastSafeBreak = i;\n            }\n        }\n    }\n\n    var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1];\n    var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance;\n    maxLineLength = Math.max(maxLineLength, lastLineLength);\n\n    var height = (line + 1) * lineHeight;\n\n    justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n    align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate);\n\n    // Calculate the bounding box\n    shaping.top += -verticalAlign * height;\n    shaping.bottom = shaping.top + height;\n    shaping.left += -horizontalAlign * maxLineLength;\n    shaping.right = shaping.left + maxLineLength;\n}\n\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n    var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n    var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n    for (var j = start; j <= end; j++) {\n        positionedGlyphs[j].x -= lineIndent;\n    }\n\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate) {\n    var shiftX = (justify - horizontalAlign) * maxLineLength + translate[0];\n    var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight + translate[1];\n\n    for (var j = 0; j < positionedGlyphs.length; j++) {\n        positionedGlyphs[j].x += shiftX;\n        positionedGlyphs[j].y += shiftY;\n    }\n}\n\n\nfunction shapeIcon(image, layout) {\n    if (!image || !image.rect) return null;\n\n    var dx = layout['icon-offset'][0];\n    var dy = layout['icon-offset'][1];\n    var x1 = dx - image.width / 2;\n    var x2 = x1 + image.width;\n    var y1 = dy - image.height / 2;\n    var y2 = y1 + image.height;\n\n    return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n    this.image = image;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/shaping.js\n// module id = 1045\n// module chunks = 0 1","'use strict';\n\nvar resolveTokens = require('../util/token');\n\nmodule.exports = resolveText;\n\n/**\n * For an array of features determine what glyphs need to be loaded\n * and apply any text preprocessing. The remaining users of text should\n * use the `textFeatures` key returned by this function rather than accessing\n * feature text directly.\n * @private\n */\nfunction resolveText(features, layoutProperties, codepoints) {\n    var textFeatures = [];\n\n    for (var i = 0, fl = features.length; i < fl; i++) {\n        var text = resolveTokens(features[i].properties, layoutProperties['text-field']);\n        if (!text) {\n            textFeatures[i] = null;\n            continue;\n        }\n        text = text.toString();\n\n        var transform = layoutProperties['text-transform'];\n        if (transform === 'uppercase') {\n            text = text.toLocaleUpperCase();\n        } else if (transform === 'lowercase') {\n            text = text.toLocaleLowerCase();\n        }\n\n        for (var j = 0; j < text.length; j++) {\n            codepoints[text.charCodeAt(j)] = true;\n        }\n\n        // Track indexes of features with text.\n        textFeatures[i] = text;\n    }\n\n    return textFeatures;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/resolve_text.js\n// module id = 1046\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function (features, textFeatures, geometries) {\n\n    var leftIndex = {},\n        rightIndex = {},\n        mergedFeatures = [],\n        mergedGeom = [],\n        mergedTexts = [],\n        mergedIndex = 0,\n        k;\n\n    function add(k) {\n        mergedFeatures.push(features[k]);\n        mergedGeom.push(geometries[k]);\n        mergedTexts.push(textFeatures[k]);\n        mergedIndex++;\n    }\n\n    function mergeFromRight(leftKey, rightKey, geom) {\n        var i = rightIndex[leftKey];\n        delete rightIndex[leftKey];\n        rightIndex[rightKey] = i;\n\n        mergedGeom[i][0].pop();\n        mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]);\n        return i;\n    }\n\n    function mergeFromLeft(leftKey, rightKey, geom) {\n        var i = leftIndex[rightKey];\n        delete leftIndex[rightKey];\n        leftIndex[leftKey] = i;\n\n        mergedGeom[i][0].shift();\n        mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]);\n        return i;\n    }\n\n    function getKey(text, geom, onRight) {\n        var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n        return text + ':' + point.x + ':' + point.y;\n    }\n\n    for (k = 0; k < features.length; k++) {\n        var geom = geometries[k],\n            text = textFeatures[k];\n\n        if (!text) {\n            add(k);\n            continue;\n        }\n\n        var leftKey = getKey(text, geom),\n            rightKey = getKey(text, geom, true);\n\n        if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n            // found lines with the same text adjacent to both ends of the current line, merge all three\n            var j = mergeFromLeft(leftKey, rightKey, geom);\n            var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]);\n\n            delete leftIndex[leftKey];\n            delete rightIndex[rightKey];\n\n            rightIndex[getKey(text, mergedGeom[i], true)] = i;\n            mergedGeom[j] = null;\n\n        } else if (leftKey in rightIndex) {\n            // found mergeable line adjacent to the start of the current line, merge\n            mergeFromRight(leftKey, rightKey, geom);\n\n        } else if (rightKey in leftIndex) {\n            // found mergeable line adjacent to the end of the current line, merge\n            mergeFromLeft(leftKey, rightKey, geom);\n\n        } else {\n            // no adjacent lines, add as a new item\n            add(k);\n            leftIndex[leftKey] = mergedIndex - 1;\n            rightIndex[rightKey] = mergedIndex - 1;\n        }\n    }\n\n    return {\n        features: mergedFeatures,\n        textFeatures: mergedTexts,\n        geometries: mergedGeom\n    };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/mergelines.js\n// module id = 1047\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array<Array<Point>>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array<Array<Point>>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n    var clippedLines = [];\n\n    for (var l = 0; l < lines.length; l++) {\n        var line = lines[l];\n        var clippedLine;\n\n        for (var i = 0; i < line.length - 1; i++) {\n            var p0 = line[i];\n            var p1 = line[i + 1];\n\n\n            if (p0.x < x1 && p1.x < x1) {\n                continue;\n            } else if (p0.x < x1) {\n                p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x < x1) {\n                p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y < y1 && p1.y < y1) {\n                continue;\n            } else if (p0.y < y1) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            } else if (p1.y < y1) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            }\n\n            if (p0.x >= x2 && p1.x >= x2) {\n                continue;\n            } else if (p0.x >= x2) {\n                p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x >= x2) {\n                p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y >= y2 && p1.y >= y2) {\n                continue;\n            } else if (p0.y >= y2) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            } else if (p1.y >= y2) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            }\n\n            if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n                clippedLine = [p0];\n                clippedLines.push(clippedLine);\n            }\n\n            clippedLine.push(p1);\n        }\n    }\n\n    return clippedLines;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/clip_line.js\n// module id = 1048\n// module chunks = 0 1","'use strict';\n\nmodule.exports = CollisionFeature;\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @class CollisionFeature\n * @param {Array<Point>} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {Array<string>} layerIDs The IDs of the layers that this CollisionFeature is a part of.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n *\n * @private\n */\nfunction CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) {\n\n    var y1 = shaped.top * boxScale - padding;\n    var y2 = shaped.bottom * boxScale + padding;\n    var x1 = shaped.left * boxScale - padding;\n    var x2 = shaped.right * boxScale + padding;\n\n    this.boxStartIndex = collisionBoxArray.length;\n\n    if (alignLine) {\n\n        var height = y2 - y1;\n        var length = x2 - x1;\n\n        if (height > 0) {\n            // set minimum box height to avoid very many small labels\n            height = Math.max(10 * boxScale, height);\n\n            if (straight) {\n                // used for icon labels that are aligned with the line, but don't curve along it\n                var vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length);\n                var straightLine = [anchor.sub(vector), anchor.add(vector)];\n                this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            } else {\n                // used for text labels that curve along a line\n                this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            }\n        }\n\n    } else {\n        collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    this.boxEndIndex = collisionBoxArray.length;\n}\n\n/**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\nCollisionFeature.prototype._addLineCollisionBoxes = function(collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) {\n    var step = boxSize / 2;\n    var nBoxes = Math.floor(labelLength / step);\n\n    // offset the center of the first box by half a box so that the edge of the\n    // box is at the edge of the label.\n    var firstBoxOffset = -boxSize / 2;\n\n    var bboxes = this.boxes;\n\n    var p = anchor;\n    var index = segment + 1;\n    var anchorDistance = firstBoxOffset;\n\n    // move backwards along the line to the first segment the label appears on\n    do {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        // checkMaxAngle should have already caught this\n        if (index < 0) return bboxes;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    } while (anchorDistance > -labelLength / 2);\n\n    var segmentLength = line[index].dist(line[index + 1]);\n\n    for (var i = 0; i < nBoxes; i++) {\n        // the distance the box will be from the anchor\n        var boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n        // the box is not on the current segment. Move to the next segment.\n        while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n            anchorDistance += segmentLength;\n            index++;\n\n            // There isn't enough room before the end of the line.\n            if (index + 1 >= line.length) return bboxes;\n\n            segmentLength = line[index].dist(line[index + 1]);\n        }\n\n        // the distance the box will be from the beginning of the segment\n        var segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n        var p0 = line[index];\n        var p1 = line[index + 1];\n        var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();\n\n        var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n        var maxScale = labelLength / 2 / distanceToInnerEdge;\n\n        collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,\n                -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale,\n                featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    return bboxes;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_feature.js\n// module id = 1049\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\nvar loadGeometry = require('./load_geometry');\nvar EXTENT = require('./bucket').EXTENT;\nvar featureFilter = require('feature-filter');\nvar StructArrayType = require('../util/struct_array');\nvar Grid = require('grid-index');\nvar DictionaryCoder = require('../util/dictionary_coder');\nvar vt = require('vector-tile');\nvar Protobuf = require('pbf');\nvar GeoJSONFeature = require('../util/vectortile_to_geojson');\nvar arraysIntersect = require('../util/util').arraysIntersect;\n\nvar intersection = require('../util/intersection_tests');\nvar multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint;\nvar multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon;\nvar multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine;\n\n\nvar FeatureIndexArray = new StructArrayType({\n    members: [\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' }\n    ]});\n\nmodule.exports = FeatureIndex;\n\nfunction FeatureIndex(coord, overscaling, collisionTile) {\n    if (coord.grid) {\n        var serialized = coord;\n        var rawTileData = overscaling;\n        coord = serialized.coord;\n        overscaling = serialized.overscaling;\n        this.grid = new Grid(serialized.grid);\n        this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray);\n        this.rawTileData = rawTileData;\n        this.bucketLayerIDs = serialized.bucketLayerIDs;\n    } else {\n        this.grid = new Grid(EXTENT, 16, 0);\n        this.featureIndexArray = new FeatureIndexArray();\n    }\n    this.coord = coord;\n    this.overscaling = overscaling;\n    this.x = coord.x;\n    this.y = coord.y;\n    this.z = coord.z - Math.log(overscaling) / Math.LN2;\n    this.setCollisionTile(collisionTile);\n}\n\nFeatureIndex.prototype.insert = function(feature, featureIndex, sourceLayerIndex, bucketIndex) {\n    var key = this.featureIndexArray.length;\n    this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);\n    var geometry = loadGeometry(feature);\n\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n\n        // TODO: skip holes when we start using vector tile spec 2.0\n\n        var bbox = [Infinity, Infinity, -Infinity, -Infinity];\n        for (var i = 0; i < ring.length; i++) {\n            var p = ring[i];\n            bbox[0] = Math.min(bbox[0], p.x);\n            bbox[1] = Math.min(bbox[1], p.y);\n            bbox[2] = Math.max(bbox[2], p.x);\n            bbox[3] = Math.max(bbox[3], p.y);\n        }\n\n        this.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n    }\n};\n\nFeatureIndex.prototype.setCollisionTile = function(collisionTile) {\n    this.collisionTile = collisionTile;\n};\n\nFeatureIndex.prototype.serialize = function() {\n    var data = {\n        coord: this.coord,\n        overscaling: this.overscaling,\n        grid: this.grid.toArrayBuffer(),\n        featureIndexArray: this.featureIndexArray.serialize(),\n        bucketLayerIDs: this.bucketLayerIDs\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.featureIndexArray.arrayBuffer]\n    };\n};\n\nfunction translateDistance(translate) {\n    return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\n// Finds features in this tile at a particular position.\nFeatureIndex.prototype.query = function(args, styleLayers) {\n    if (!this.vtLayers) {\n        this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n    }\n\n    var result = {};\n\n    var params = args.params || {},\n        pixelsToTileUnits = EXTENT / args.tileSize / args.scale,\n        filter = featureFilter(params.filter);\n\n    // Features are indexed their original geometries. The rendered geometries may\n    // be buffered, translated or offset. Figure out how much the search radius needs to be\n    // expanded by to include these features.\n    var additionalRadius = 0;\n    for (var id in styleLayers) {\n        var styleLayer = styleLayers[id];\n        var paint = styleLayer.paint;\n\n        var styleLayerDistance = 0;\n        if (styleLayer.type === 'line') {\n            styleLayerDistance = getLineWidth(paint) / 2 + Math.abs(paint['line-offset']) + translateDistance(paint['line-translate']);\n        } else if (styleLayer.type === 'fill') {\n            styleLayerDistance = translateDistance(paint['fill-translate']);\n        } else if (styleLayer.type === 'circle') {\n            styleLayerDistance = paint['circle-radius'] + translateDistance(paint['circle-translate']);\n        }\n        additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits);\n    }\n\n    var queryGeometry = args.queryGeometry.map(function(q) {\n        return q.map(function(p) {\n            return new Point(p.x, p.y);\n        });\n    });\n\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        for (var k = 0; k < ring.length; k++) {\n            var p = ring[k];\n            minX = Math.min(minX, p.x);\n            minY = Math.min(minY, p.y);\n            maxX = Math.max(maxX, p.x);\n            maxY = Math.max(maxY, p.y);\n        }\n    }\n\n    var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius);\n    matching.sort(topDownFeatureComparator);\n    this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    var matchingSymbols = this.collisionTile.queryRenderedSymbols(minX, minY, maxX, maxY, args.scale);\n    matchingSymbols.sort();\n    this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    return result;\n};\n\nfunction topDownFeatureComparator(a, b) {\n    return b - a;\n}\n\nfunction getLineWidth(paint) {\n    if (paint['line-gap-width'] > 0) {\n        return paint['line-gap-width'] + 2 * paint['line-width'];\n    } else {\n        return paint['line-width'];\n    }\n}\n\nFeatureIndex.prototype.filterMatching = function(result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) {\n    var previousIndex;\n    for (var k = 0; k < matching.length; k++) {\n        var index = matching[k];\n\n        // don't check the same feature more than once\n        if (index === previousIndex) continue;\n        previousIndex = index;\n\n        var match = array.get(index);\n\n        var layerIDs = this.bucketLayerIDs[match.bucketIndex];\n        if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue;\n\n        var sourceLayerName = this.sourceLayerCoder.decode(match.sourceLayerIndex);\n        var sourceLayer = this.vtLayers[sourceLayerName];\n        var feature = sourceLayer.feature(match.featureIndex);\n\n        if (!filter(feature)) continue;\n\n        var geometry = null;\n\n        for (var l = 0; l < layerIDs.length; l++) {\n            var layerID = layerIDs[l];\n\n            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n                continue;\n            }\n\n            var styleLayer = styleLayers[layerID];\n            if (!styleLayer) continue;\n\n            var translatedPolygon;\n            if (styleLayer.type !== 'symbol') {\n                // all symbols already match the style\n\n                if (!geometry) geometry = loadGeometry(feature);\n\n                var paint = styleLayer.paint;\n\n                if (styleLayer.type === 'line') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['line-translate'], paint['line-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var halfWidth = getLineWidth(paint) / 2 * pixelsToTileUnits;\n                    if (paint['line-offset']) {\n                        geometry = offsetLine(geometry, paint['line-offset'] * pixelsToTileUnits);\n                    }\n                    if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue;\n\n                } else if (styleLayer.type === 'fill') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['fill-translate'], paint['fill-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue;\n\n                } else if (styleLayer.type === 'circle') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['circle-translate'], paint['circle-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var circleRadius = paint['circle-radius'] * pixelsToTileUnits;\n                    if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue;\n                }\n            }\n\n            var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);\n            geojsonFeature.layer = styleLayer.serialize({\n                includeRefProperties: true\n            });\n            var layerResult = result[layerID];\n            if (layerResult === undefined) {\n                layerResult = result[layerID] = [];\n            }\n            layerResult.push(geojsonFeature);\n        }\n    }\n};\n\nfunction translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {\n    if (!translate[0] && !translate[1]) {\n        return queryGeometry;\n    }\n\n    translate = Point.convert(translate);\n\n    if (translateAnchor === \"viewport\") {\n        translate._rotate(-bearing);\n    }\n\n    var translated = [];\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        var translatedRing = [];\n        for (var k = 0; k < ring.length; k++) {\n            translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits)));\n        }\n        translated.push(translatedRing);\n    }\n    return translated;\n}\n\nfunction offsetLine(rings, offset) {\n    var newRings = [];\n    var zero = new Point(0, 0);\n    for (var k = 0; k < rings.length; k++) {\n        var ring = rings[k];\n        var newRing = [];\n        for (var i = 0; i < ring.length; i++) {\n            var a = ring[i - 1];\n            var b = ring[i];\n            var c = ring[i + 1];\n            var aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n            var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n            var extrude = aToB._add(bToC)._unit();\n\n            var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n            extrude._mult(1 / cosHalfAngle);\n\n            newRing.push(extrude._mult(offset)._add(b));\n        }\n        newRings.push(newRing);\n    }\n    return newRings;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/data/feature_index.js\n// module id = 1050\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = DictionaryCoder;\n\nfunction DictionaryCoder(strings) {\n    this._stringToNumber = {};\n    this._numberToString = [];\n    for (var i = 0; i < strings.length; i++) {\n        var string = strings[i];\n        this._stringToNumber[string] = i;\n        this._numberToString[i] = string;\n    }\n}\n\nDictionaryCoder.prototype.encode = function(string) {\n    assert(string in this._stringToNumber);\n    return this._stringToNumber[string];\n};\n\nDictionaryCoder.prototype.decode = function(n) {\n    assert(n < this._numberToString.length);\n    return this._numberToString[n];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/dictionary_coder.js\n// module id = 1051\n// module chunks = 0 1","'use strict';\n\nvar VectorTileLayer = require('./vectortilelayer');\n\nmodule.exports = VectorTile;\n\nfunction VectorTile(pbf, end) {\n    this.layers = pbf.readFields(readTile, {}, end);\n}\n\nfunction readTile(tag, layers, pbf) {\n    if (tag === 3) {\n        var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n        if (layer.length) layers[layer.name] = layer;\n    }\n}\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vector-tile/lib/vectortile.js\n// module id = 1052\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n    multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint,\n    multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon,\n    multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine\n};\n\nfunction multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) {\n    for (var j = 0; j < multiPolygon.length; j++) {\n        var polygon = multiPolygon[j];\n        for (var i = 0; i < rings.length; i++) {\n            var ring = rings[i];\n            for (var k = 0; k < ring.length; k++) {\n                var point = ring[k];\n                if (polygonContainsPoint(polygon, point)) return true;\n                if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) {\n\n    if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) {\n        return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]);\n    }\n\n    for (var m = 0; m < multiPolygonB.length; m++) {\n        var ring = multiPolygonB[m];\n        for (var n = 0; n < ring.length; n++) {\n            if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true;\n        }\n    }\n\n    for (var j = 0; j < multiPolygonA.length; j++) {\n        var polygon = multiPolygonA[j];\n        for (var i = 0; i < polygon.length; i++) {\n            if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true;\n        }\n\n        for (var k = 0; k < multiPolygonB.length; k++) {\n            if (lineIntersectsLine(polygon, multiPolygonB[k])) return true;\n        }\n    }\n\n    return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) {\n    for (var i = 0; i < multiLine.length; i++) {\n        var line = multiLine[i];\n\n        for (var j = 0; j < multiPolygon.length; j++) {\n            var polygon = multiPolygon[j];\n\n            if (polygon.length >= 3) {\n                for (var k = 0; k < line.length; k++) {\n                    if (polygonContainsPoint(polygon, line[k])) return true;\n                }\n            }\n\n            if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n        }\n    }\n    return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA, lineB, radius) {\n\n    if (lineA.length > 1) {\n        if (lineIntersectsLine(lineA, lineB)) return true;\n\n        // Check whether any point in either line is within radius of the other line\n        for (var j = 0; j < lineB.length; j++) {\n            if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n        }\n    }\n\n    for (var k = 0; k < lineA.length; k++) {\n        if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n    }\n\n    return false;\n}\n\nfunction lineIntersectsLine(lineA, lineB) {\n    for (var i = 0; i < lineA.length - 1; i++) {\n        var a0 = lineA[i];\n        var a1 = lineA[i + 1];\n        for (var j = 0; j < lineB.length - 1; j++) {\n            var b0 = lineB[j];\n            var b1 = lineB[j + 1];\n            if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n        }\n    }\n    return false;\n}\n\n\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nfunction isCounterClockwise(a, b, c) {\n    return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n}\n\nfunction lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {\n    return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n        isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p, line, radius) {\n    var radiusSquared = radius * radius;\n\n    if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n    for (var i = 1; i < line.length; i++) {\n        // Find line segments that have a distance <= radius^2 to p\n        // In that case, we treat the line as \"containing point p\".\n        var v = line[i - 1], w = line[i];\n        if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n    }\n    return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n    var l2 = v.distSqr(w);\n    if (l2 === 0) return p.distSqr(v);\n    var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n    if (t < 0) return p.distSqr(v);\n    if (t > 1) return p.distSqr(w);\n    return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings, p) {\n    var c = false,\n        ring, p1, p2;\n\n    for (var k = 0; k < rings.length; k++) {\n        ring = rings[k];\n        for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n            p1 = ring[i];\n            p2 = ring[j];\n            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n                c = !c;\n            }\n        }\n    }\n    return c;\n}\n\nfunction polygonContainsPoint(ring, p) {\n    var c = false;\n    for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n        var p1 = ring[i];\n        var p2 = ring[j];\n        if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n            c = !c;\n        }\n    }\n    return c;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/intersection_tests.js\n// module id = 1053\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar Grid = require('grid-index');\n\nmodule.exports = CollisionTile;\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @class CollisionTile\n * @param {number} angle\n * @param {number} pitch\n * @private\n */\nfunction CollisionTile(angle, pitch, collisionBoxArray) {\n    if (typeof angle === 'object') {\n        var serialized = angle;\n        collisionBoxArray = pitch;\n        angle = serialized.angle;\n        pitch = serialized.pitch;\n        this.grid = new Grid(serialized.grid);\n        this.ignoredGrid = new Grid(serialized.ignoredGrid);\n    } else {\n        this.grid = new Grid(EXTENT, 12, 6);\n        this.ignoredGrid = new Grid(EXTENT, 12, 0);\n    }\n\n    this.angle = angle;\n    this.pitch = pitch;\n\n    var sin = Math.sin(angle),\n        cos = Math.cos(angle);\n    this.rotationMatrix = [cos, -sin, sin, cos];\n    this.reverseRotationMatrix = [cos, sin, -sin, cos];\n\n    // Stretch boxes in y direction to account for the map tilt.\n    this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n    // The amount the map is squished depends on the y position.\n    // Sort of account for this by making all boxes a bit bigger.\n    this.yStretch = Math.pow(this.yStretch, 1.3);\n\n    this.collisionBoxArray = collisionBoxArray;\n    if (collisionBoxArray.length === 0) {\n        // the first collisionBoxArray is passed to a CollisionTile\n\n        // tempCollisionBox\n        collisionBoxArray.emplaceBack();\n\n        var maxInt16 = 32767;\n        //left\n        collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // right\n        collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // top\n        collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // bottom\n        collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n    }\n\n    this.tempCollisionBox = collisionBoxArray.get(0);\n    this.edges = [\n        collisionBoxArray.get(1),\n        collisionBoxArray.get(2),\n        collisionBoxArray.get(3),\n        collisionBoxArray.get(4)\n    ];\n}\n\nCollisionTile.prototype.serialize = function() {\n    var data = {\n        angle: this.angle,\n        pitch: this.pitch,\n        grid: this.grid.toArrayBuffer(),\n        ignoredGrid: this.ignoredGrid.toArrayBuffer()\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.ignoredGrid]\n    };\n};\n\nCollisionTile.prototype.minScale = 0.25;\nCollisionTile.prototype.maxScale = 2;\n\n\n/**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\nCollisionTile.prototype.placeCollisionFeature = function(collisionFeature, allowOverlap, avoidEdges) {\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var minPlacementScale = this.minScale;\n    var rotationMatrix = this.rotationMatrix;\n    var yStretch = this.yStretch;\n\n    for (var b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) {\n\n        var box = collisionBoxArray.get(b);\n\n        var anchorPoint = box.anchorPoint._matMult(rotationMatrix);\n        var x = anchorPoint.x;\n        var y = anchorPoint.y;\n\n        var x1 = x + box.x1;\n        var y1 = y + box.y1 * yStretch;\n        var x2 = x + box.x2;\n        var y2 = y + box.y2 * yStretch;\n\n        box.bbox0 = x1;\n        box.bbox1 = y1;\n        box.bbox2 = x2;\n        box.bbox3 = y2;\n\n        if (!allowOverlap) {\n            var blockingBoxes = this.grid.query(x1, y1, x2, y2);\n\n            for (var i = 0; i < blockingBoxes.length; i++) {\n                var blocking = collisionBoxArray.get(blockingBoxes[i]);\n                var blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix);\n\n                minPlacementScale = this.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n\n        if (avoidEdges) {\n            var rotatedCollisionBox;\n\n            if (this.angle) {\n                var reverseRotationMatrix = this.reverseRotationMatrix;\n                var tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix);\n                var tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix);\n                var bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix);\n                var br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix);\n\n                rotatedCollisionBox = this.tempCollisionBox;\n                rotatedCollisionBox.anchorPointX = box.anchorPoint.x;\n                rotatedCollisionBox.anchorPointY = box.anchorPoint.y;\n                rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.maxScale = box.maxScale;\n            } else {\n                rotatedCollisionBox = box;\n            }\n\n            for (var k = 0; k < this.edges.length; k++) {\n                var edgeBox = this.edges[k];\n                minPlacementScale = this.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n    }\n\n    return minPlacementScale;\n};\n\nCollisionTile.prototype.queryRenderedSymbols = function(minX, minY, maxX, maxY, scale) {\n    var sourceLayerFeatures = {};\n    var result = [];\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var rotationMatrix = this.rotationMatrix;\n    var anchorPoint = new Point(minX, minY)._matMult(rotationMatrix);\n\n    var queryBox = this.tempCollisionBox;\n    queryBox.anchorX = anchorPoint.x;\n    queryBox.anchorY = anchorPoint.y;\n    queryBox.x1 = 0;\n    queryBox.y1 = 0;\n    queryBox.x2 = maxX - minX;\n    queryBox.y2 = maxY - minY;\n    queryBox.maxScale = scale;\n\n    // maxScale is stored using a Float32. Convert `scale` to the stored Float32 value.\n    scale = queryBox.maxScale;\n\n    var searchBox = [\n        anchorPoint.x + queryBox.x1 / scale,\n        anchorPoint.y + queryBox.y1 / scale * this.yStretch,\n        anchorPoint.x + queryBox.x2 / scale,\n        anchorPoint.y + queryBox.y2 / scale * this.yStretch\n    ];\n\n    var blockingBoxKeys = this.grid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    var blockingBoxKeys2 = this.ignoredGrid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    for (var k = 0; k < blockingBoxKeys2.length; k++) {\n        blockingBoxKeys.push(blockingBoxKeys2[k]);\n    }\n\n    for (var i = 0; i < blockingBoxKeys.length; i++) {\n        var blocking = collisionBoxArray.get(blockingBoxKeys[i]);\n\n        var sourceLayer = blocking.sourceLayerIndex;\n        var featureIndex = blocking.featureIndex;\n        if (sourceLayerFeatures[sourceLayer] === undefined) {\n            sourceLayerFeatures[sourceLayer] = {};\n        }\n\n        if (!sourceLayerFeatures[sourceLayer][featureIndex]) {\n            var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix);\n            var minPlacementScale = this.getPlacementScale(this.minScale, anchorPoint, queryBox, blockingAnchorPoint, blocking);\n            if (minPlacementScale >= scale) {\n                sourceLayerFeatures[sourceLayer][featureIndex] = true;\n                result.push(blockingBoxKeys[i]);\n            }\n        }\n    }\n\n    return result;\n};\n\nCollisionTile.prototype.getPlacementScale = function(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) {\n\n    // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n    // Original algorithm:\n    var anchorDiffX = anchorPoint.x - blockingAnchorPoint.x;\n    var anchorDiffY = anchorPoint.y - blockingAnchorPoint.y;\n    var s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box\n    var s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box\n    var s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box\n    var s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box\n\n    if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n    if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n    var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n    var blockingMaxScale = blocking.maxScale;\n    var boxMaxScale = box.maxScale;\n\n    if (collisionFreeScale > blockingMaxScale) {\n        // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n        // so unblock the new box at the scale that the old box disappears.\n        collisionFreeScale = blockingMaxScale;\n    }\n\n    if (collisionFreeScale > boxMaxScale) {\n        // If the box can only be shown after it is visible, then the box can never be shown.\n        // But the label can be shown after this box is not visible.\n        collisionFreeScale = boxMaxScale;\n    }\n\n    if (collisionFreeScale > minPlacementScale &&\n            collisionFreeScale >= blocking.placementScale) {\n        // If this collision occurs at a lower scale than previously found collisions\n        // and the collision occurs while the other label is visible\n\n        // this this is the lowest scale at which the label won't collide with anything\n        minPlacementScale = collisionFreeScale;\n    }\n\n    return minPlacementScale;\n};\n\n\n/**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\nCollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale, ignorePlacement) {\n\n    var grid = ignorePlacement ? this.ignoredGrid : this.grid;\n    var collisionBoxArray = this.collisionBoxArray;\n\n    for (var k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) {\n        var box = collisionBoxArray.get(k);\n        box.placementScale = minPlacementScale;\n        if (minPlacementScale < this.maxScale) {\n            grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_tile.js\n// module id = 1054\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBoxArray\n * @private\n */\n\nvar CollisionBoxArray = module.exports = new StructArrayType({\n    members: [\n        // the box is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // distances to the edges from the anchor\n        { type: 'Int16', name: 'x1' },\n        { type: 'Int16', name: 'y1' },\n        { type: 'Int16', name: 'x2' },\n        { type: 'Int16', name: 'y2' },\n\n        // the box is only valid for scales < maxScale.\n        // The box does not block other boxes at scales >= maxScale;\n        { type: 'Float32', name: 'maxScale' },\n\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' },\n\n        // rotated and scaled bbox used for indexing\n        { type: 'Int16', name: 'bbox0' },\n        { type: 'Int16', name: 'bbox1' },\n        { type: 'Int16', name: 'bbox2' },\n        { type: 'Int16', name: 'bbox3' },\n\n        { type: 'Float32', name: 'placementScale' }\n    ]});\n\nutil.extendAll(CollisionBoxArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/collision_box.js\n// module id = 1055\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\n\n/*\n *\n * A StructArray implementation of symbolInstances from data/bucket/symbol_bucket.js\n * this will allow symbolInstances to be transferred between the worker and main threads\n *\n * @class SymbolInstanceArray\n * @private\n */\n\nvar SymbolInstancesArray = module.exports = new StructArrayType({\n    members: [\n\n        { type: 'Uint16', name: 'textBoxStartIndex' },\n        { type: 'Uint16', name: 'textBoxEndIndex' },\n        { type: 'Uint16', name: 'iconBoxStartIndex' },\n        { type: 'Uint16', name: 'iconBoxEndIndex' },\n        { type: 'Uint16', name: 'glyphQuadStartIndex' },\n        { type: 'Uint16', name: 'glyphQuadEndIndex' },\n        { type: 'Uint16', name: 'iconQuadStartIndex' },\n        { type: 'Uint16', name: 'iconQuadEndIndex' },\n\n        // each symbolInstance is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // index -- not sure if we need this -@mollymerp\n        { type: 'Int8', name: 'index' }\n    ]\n});\n\nutil.extendAll(SymbolInstancesArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/symbol_instances.js\n// module id = 1056\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\nvar SymbolQuad = require('./quads').SymbolQuad;\n\n// notes from ansis on slack:\n// it would be best if they are added to a buffer in advance so that they are only created once. There would be a separate buffer with all the individual collision boxes and then SymbolInstance would store the beginning and end indexes of a feature's collisionboxes. CollisionFeature wouldn't really exist as a standalone thing, it would just be a range of boxes in the big collision box buffer\n\n/*\n *\n * A StructArray implementation of glyphQuad from symbol/quads\n * this will allow glyph quads to be transferred between the worker and main threads along with the rest of\n * the symbolInstances\n *\n * @class SymbolQuadsArray\n * @private\n */\n\nvar SymbolQuadsArray = module.exports = new StructArrayType({\n    members: [\n        // the quad is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // the offsets of the tl (top-left), tr, bl, br corners from the anchor point\n        // do these need to be floats?\n        { type: 'Float32', name: 'tlX' },\n        { type: 'Float32', name: 'tlY' },\n        { type: 'Float32', name: 'trX' },\n        { type: 'Float32', name: 'trY' },\n        { type: 'Float32', name: 'blX' },\n        { type: 'Float32', name: 'blY' },\n        { type: 'Float32', name: 'brX' },\n        { type: 'Float32', name: 'brY' },\n\n        // texture coordinates (height, width, x, and y)\n        { type: 'Int16', name: 'texH' },\n        { type: 'Int16', name: 'texW' },\n        { type: 'Int16', name: 'texX' },\n        { type: 'Int16', name: 'texY' },\n\n        //the angle of the label at it's center, not the angle of this quad.\n        { type: 'Float32', name: 'angle' },\n\n        // quad is only valid for scales < maxScale && scale > minScale.\n        { type: 'Float32', name: 'maxScale' },\n        { type: 'Float32', name: 'minScale' }\n    ]\n});\n\nutil.extendAll(SymbolQuadsArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    },\n    get SymbolQuad() {\n        return new SymbolQuad(this.anchorPoint,\n            new Point(this.tlX, this.tlY),\n            new Point(this.trX, this.trY),\n            new Point(this.blX, this.blY),\n            new Point(this.brX, this.brY),\n            { x: this.texX, y: this.texY, h: this.texH, w: this.texW, height: this.texH, width: this.texW },\n            this.angle,\n            this.minScale,\n            this.maxScale);\n    }\n});\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/symbol/symbol_quads.js\n// module id = 1057\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LRUCache;\n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n * @private\n */\nfunction LRUCache(max, onRemove) {\n    this.max = max;\n    this.onRemove = onRemove;\n    this.reset();\n}\n\n/**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.reset = function() {\n    for (var key in this.data) {\n        this.onRemove(this.data[key]);\n    }\n\n    this.data = {};\n    this.order = [];\n\n    return this;\n};\n\n/**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.add = function(key, data) {\n\n    if (this.has(key)) {\n        this.order.splice(this.order.indexOf(key), 1);\n        this.data[key] = data;\n        this.order.push(key);\n\n    } else {\n        this.data[key] = data;\n        this.order.push(key);\n\n        if (this.order.length > this.max) {\n            var removedData = this.get(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n    }\n\n    return this;\n};\n\n/**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\nLRUCache.prototype.has = function(key) {\n    return key in this.data;\n};\n\n/**\n * List all keys in the cache\n *\n * @returns {Array<string>} an array of keys in this cache.\n * @private\n */\nLRUCache.prototype.keys = function() {\n    return this.order;\n};\n\n/**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\nLRUCache.prototype.get = function(key) {\n    if (!this.has(key)) { return null; }\n\n    var data = this.data[key];\n\n    delete this.data[key];\n    this.order.splice(this.order.indexOf(key), 1);\n\n    return data;\n};\n\n/**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.setMaxSize = function(max) {\n    this.max = max;\n\n    while (this.order.length > this.max) {\n        var removedData = this.get(this.order[0]);\n        if (removedData) this.onRemove(removedData);\n    }\n\n    return this;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/util/lru_cache.js\n// module id = 1058\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\nvar FrameHistory = require('./frame_history');\nvar TilePyramid = require('../source/tile_pyramid');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('./vertex_array_object');\nvar RasterBoundsArray = require('./draw_raster').RasterBoundsArray;\nvar createUniformPragmas = require('./create_uniform_pragmas');\n\nmodule.exports = Painter;\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nfunction Painter(gl, transform) {\n    this.gl = gl;\n    this.transform = transform;\n\n    this.reusableTextures = {};\n    this.preFbos = {};\n\n    this.frameHistory = new FrameHistory();\n\n    this.setup();\n\n    // Within each layer there are multiple distinct z-planes that can be drawn to.\n    // This is implemented using the WebGL depth buffer.\n    this.numSublayers = TilePyramid.maxUnderzooming + TilePyramid.maxOverzooming + 1;\n    this.depthEpsilon = 1 / Math.pow(2, 16);\n\n    this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n}\n\nutil.extend(Painter.prototype, require('./painter/use_program'));\n\n/*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\nPainter.prototype.resize = function(width, height) {\n    var gl = this.gl;\n\n    this.width = width * browser.devicePixelRatio;\n    this.height = height * browser.devicePixelRatio;\n    gl.viewport(0, 0, this.width, this.height);\n\n};\n\nPainter.prototype.setup = function() {\n    var gl = this.gl;\n\n    gl.verbose = true;\n\n    // We are blending the new pixels *behind* the existing pixels. That way we can\n    // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.enable(gl.STENCIL_TEST);\n\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n\n    this._depthMask = false;\n    gl.depthMask(false);\n\n    var PosArray = this.PosArray = new StructArrayType({\n        members: [{ name: 'a_pos', type: 'Int16', components: 2 }]\n    });\n\n    var tileExtentArray = new PosArray();\n    tileExtentArray.emplaceBack(0, 0);\n    tileExtentArray.emplaceBack(EXTENT, 0);\n    tileExtentArray.emplaceBack(0, EXTENT);\n    tileExtentArray.emplaceBack(EXTENT, EXTENT);\n    this.tileExtentBuffer = new Buffer(tileExtentArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.tileExtentVAO = new VertexArrayObject();\n    this.tileExtentPatternVAO = new VertexArrayObject();\n\n    var debugArray = new PosArray();\n    debugArray.emplaceBack(0, 0);\n    debugArray.emplaceBack(EXTENT, 0);\n    debugArray.emplaceBack(EXTENT, EXTENT);\n    debugArray.emplaceBack(0, EXTENT);\n    debugArray.emplaceBack(0, 0);\n    this.debugBuffer = new Buffer(debugArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.debugVAO = new VertexArrayObject();\n\n    var rasterBoundsArray = new RasterBoundsArray();\n    rasterBoundsArray.emplaceBack(0, 0, 0, 0);\n    rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0);\n    rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767);\n    rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767);\n    this.rasterBoundsBuffer = new Buffer(rasterBoundsArray.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n    this.rasterBoundsVAO = new VertexArrayObject();\n};\n\n/*\n * Reset the color buffers of the drawing canvas.\n */\nPainter.prototype.clearColor = function() {\n    var gl = this.gl;\n    gl.clearColor(0, 0, 0, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n};\n\n/*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\nPainter.prototype.clearStencil = function() {\n    var gl = this.gl;\n    gl.clearStencil(0x0);\n    gl.stencilMask(0xFF);\n    gl.clear(gl.STENCIL_BUFFER_BIT);\n};\n\nPainter.prototype.clearDepth = function() {\n    var gl = this.gl;\n    gl.clearDepth(1);\n    this.depthMask(true);\n    gl.clear(gl.DEPTH_BUFFER_BIT);\n};\n\nPainter.prototype._renderTileClippingMasks = function(coords) {\n    var gl = this.gl;\n    gl.colorMask(false, false, false, false);\n    this.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n    gl.enable(gl.STENCIL_TEST);\n\n    // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills.\n    gl.stencilMask(0xF8);\n    // Tests will always pass, and ref value will be written to stencil buffer.\n    gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n\n    var idNext = 1;\n    this._tileClippingMaskIDs = {};\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var id = this._tileClippingMaskIDs[coord.id] = (idNext++) << 3;\n\n        gl.stencilFunc(gl.ALWAYS, id, 0xF8);\n\n        var pragmas = createUniformPragmas([{name: 'u_color', components: 4}]);\n        var program = this.useProgram('fill', [], pragmas, pragmas);\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        // Draw the clipping mask\n        this.tileExtentVAO.bind(gl, program, this.tileExtentBuffer);\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.colorMask(true, true, true, true);\n    this.depthMask(true);\n    gl.enable(gl.DEPTH_TEST);\n};\n\nPainter.prototype.enableTileClippingMask = function(coord) {\n    var gl = this.gl;\n    gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8);\n};\n\n// Overridden by headless tests.\nPainter.prototype.prepareBuffers = function() {};\nPainter.prototype.bindDefaultFramebuffer = function() {\n    var gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\nvar draw = {\n    symbol: require('./draw_symbol'),\n    circle: require('./draw_circle'),\n    line: require('./draw_line'),\n    fill: require('./draw_fill'),\n    raster: require('./draw_raster'),\n    background: require('./draw_background'),\n    debug: require('./draw_debug')\n};\n\nPainter.prototype.render = function(style, options) {\n    this.style = style;\n    this.options = options;\n\n    this.lineAtlas = style.lineAtlas;\n\n    this.spriteAtlas = style.spriteAtlas;\n    this.spriteAtlas.setSprite(style.sprite);\n\n    this.glyphSource = style.glyphSource;\n\n    this.frameHistory.record(this.transform.zoom);\n\n    this.prepareBuffers();\n    this.clearColor();\n    this.clearDepth();\n\n    this.showOverdrawInspector(options.showOverdrawInspector);\n\n    this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon;\n\n    this.renderPass({isOpaquePass: true});\n    this.renderPass({isOpaquePass: false});\n};\n\nPainter.prototype.renderPass = function(options) {\n    var groups = this.style._groups;\n    var isOpaquePass = options.isOpaquePass;\n    this.currentLayer = isOpaquePass ? this.style._order.length : -1;\n\n    for (var i = 0; i < groups.length; i++) {\n        var group = groups[isOpaquePass ? groups.length - 1 - i : i];\n        var source = this.style.sources[group.source];\n\n        var j;\n        var coords = [];\n        if (source) {\n            coords = source.getVisibleCoordinates();\n            for (j = 0; j < coords.length; j++) {\n                coords[j].posMatrix = this.transform.calculatePosMatrix(coords[j], source.maxzoom);\n            }\n            this.clearStencil();\n            if (source.prepare) source.prepare();\n            if (source.isTileClipped) {\n                this._renderTileClippingMasks(coords);\n            }\n        }\n\n        if (isOpaquePass) {\n            if (!this._showOverdrawInspector) {\n                this.gl.disable(this.gl.BLEND);\n            }\n            this.isOpaquePass = true;\n        } else {\n            this.gl.enable(this.gl.BLEND);\n            this.isOpaquePass = false;\n            coords.reverse();\n        }\n\n        for (j = 0; j < group.length; j++) {\n            var layer = group[isOpaquePass ? group.length - 1 - j : j];\n            this.currentLayer += isOpaquePass ? -1 : 1;\n            this.renderLayer(this, source, layer, coords);\n        }\n\n        if (source) {\n            draw.debug(this, source, coords);\n        }\n    }\n};\n\nPainter.prototype.depthMask = function(mask) {\n    if (mask !== this._depthMask) {\n        this._depthMask = mask;\n        this.gl.depthMask(mask);\n    }\n};\n\nPainter.prototype.renderLayer = function(painter, source, layer, coords) {\n    if (layer.isHidden(this.transform.zoom)) return;\n    if (layer.type !== 'background' && !coords.length) return;\n    this.id = layer.id;\n    draw[layer.type](painter, source, layer, coords);\n};\n\nPainter.prototype.setDepthSublayer = function(n) {\n    var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n    var nearDepth = farDepth - 1 + this.depthRange;\n    this.gl.depthRange(nearDepth, farDepth);\n};\n\nPainter.prototype.translatePosMatrix = function(matrix, tile, translate, anchor) {\n    if (!translate[0] && !translate[1]) return matrix;\n\n    if (anchor === 'viewport') {\n        var sinA = Math.sin(-this.transform.angle);\n        var cosA = Math.cos(-this.transform.angle);\n        translate = [\n            translate[0] * cosA - translate[1] * sinA,\n            translate[0] * sinA + translate[1] * cosA\n        ];\n    }\n\n    var translation = [\n        pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n        pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n        0\n    ];\n\n    var translatedMatrix = new Float32Array(16);\n    mat4.translate(translatedMatrix, matrix, translation);\n    return translatedMatrix;\n};\n\nPainter.prototype.saveTexture = function(texture) {\n    var textures = this.reusableTextures[texture.size];\n    if (!textures) {\n        this.reusableTextures[texture.size] = [texture];\n    } else {\n        textures.push(texture);\n    }\n};\n\n\nPainter.prototype.getTexture = function(size) {\n    var textures = this.reusableTextures[size];\n    return textures && textures.length > 0 ? textures.pop() : null;\n};\n\nPainter.prototype.lineWidth = function(width) {\n    this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1]));\n};\n\nPainter.prototype.showOverdrawInspector = function(enabled) {\n    if (!enabled && !this._showOverdrawInspector) return;\n    this._showOverdrawInspector = enabled;\n\n    var gl = this.gl;\n    if (enabled) {\n        gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE);\n        var numOverdrawSteps = 8;\n        var a = 1 / numOverdrawSteps;\n        gl.blendColor(a, a, a, 0);\n        gl.clearColor(0, 0, 0, 1);\n        gl.clear(gl.COLOR_BUFFER_BIT);\n    } else {\n        gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/painter.js\n// module id = 1059\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\nvar mat2 = {};\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\nmat2.fromValues = function(m00, m01, m10, m11) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\nmat2.set = function(out, m00, m01, m10, m11) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a1 = a[1];\n        out[1] = a[2];\n        out[2] = a1;\n    } else {\n        out[0] = a[0];\n        out[1] = a[2];\n        out[2] = a[1];\n        out[3] = a[3];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n        // Calculate the determinant\n        det = a0 * a3 - a2 * a1;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n    \n    out[0] =  a3 * det;\n    out[1] = -a1 * det;\n    out[2] = -a2 * det;\n    out[3] =  a0 * det;\n\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n    // Caching this value is nessecary if out == a\n    var a0 = a[0];\n    out[0] =  a[3];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] =  a0;\n\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n    return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.fromRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2} out\n */\nmat2.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n    return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {mat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)))\n};\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {mat2} L the lower triangular matrix \n * @param {mat2} D the diagonal matrix \n * @param {mat2} U the upper triangular matrix \n * @param {mat2} a the input matrix to factorize\n */\n\nmat2.LDU = function (L, D, U, a) { \n    L[2] = a[2]/a[0]; \n    U[0] = a[0]; \n    U[1] = a[1]; \n    U[3] = a[3] - L[2] * U[1]; \n    return [L, D, U];       \n}; \n\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\nmat2.sub = mat2.subtract;\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\nmat2.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\nmat2.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\nmodule.exports = mat2;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/mat2.js\n// module id = 1060\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n * <pre>\n * [a, c, tx,\n *  b, d, ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, c, tx,\n *  b, d, ty,\n *  0, 0, 1]\n * </pre>\n * The last row is ignored so the array is shorter and operations are faster.\n */\nvar mat2d = {};\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\nmat2d.fromValues = function(a, b, c, d, tx, ty) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\nmat2d.set = function(out, a, b, c, d, tx, ty) {\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n    var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n        atx = a[4], aty = a[5];\n\n    var det = aa * ad - ab * ac;\n    if(!det){\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = ad * det;\n    out[1] = -ab * det;\n    out[2] = -ac * det;\n    out[3] = aa * det;\n    out[4] = (ac * aty - ad * atx) * det;\n    out[5] = (ab * atx - aa * aty) * det;\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n    return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    out[4] = a0 * b4 + a2 * b5 + a4;\n    out[5] = a1 * b4 + a3 * b5 + a5;\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0;\n    out[1] = a1;\n    out[2] = a2;\n    out[3] = a3;\n    out[4] = a0 * v0 + a2 * v1 + a4;\n    out[5] = a1 * v0 + a3 * v1 + a5;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2d} out\n */\nmat2d.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat2d} out\n */\nmat2d.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = v[0];\n    out[5] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n    return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {mat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2d.frob = function (a) { \n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1))\n}; \n\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\nmat2d.sub = mat2d.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\nmat2d.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    return out;\n};\n\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\nmat2d.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)));\n};\n\nmodule.exports = mat2d;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/mat2d.js\n// module id = 1061\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {\n  scalar: {},\n  SIMD: {},\n};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nmat4.fromValues = function(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nmat4.set = function(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3],\n            a12 = a[6], a13 = a[7],\n            a23 = a[11];\n\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.transpose = function(out, a) {\n    var a0, a1, a2, a3,\n        tmp01, tmp23,\n        out0, out1, out2, out3;\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    a1 = SIMD.Float32x4.load(a, 4);\n    a2 = SIMD.Float32x4.load(a, 8);\n    a3 = SIMD.Float32x4.load(a, 12);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n    out0  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out1  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 0,  out0);\n    SIMD.Float32x4.store(out, 4,  out1);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n    out2  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out3  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 8,  out2);\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Transpse a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = glMatrix.USE_SIMD ? mat4.SIMD.transpose : mat4.scalar.transpose;\n\n/**\n * Inverts a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n};\n\n/**\n * Inverts a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.invert = function(out, a) {\n  var row0, row1, row2, row3,\n      tmp1,\n      minor0, minor1, minor2, minor3,\n      det,\n      a0 = SIMD.Float32x4.load(a, 0),\n      a1 = SIMD.Float32x4.load(a, 4),\n      a2 = SIMD.Float32x4.load(a, 8),\n      a3 = SIMD.Float32x4.load(a, 12);\n\n  // Compute matrix adjugate\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  // Compute matrix determinant\n  det   = SIMD.Float32x4.mul(row0, minor0);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 2, 3, 0, 1), det);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 1, 0, 3, 2), det);\n  tmp1  = SIMD.Float32x4.reciprocalApproximation(det);\n  det   = SIMD.Float32x4.sub(\n               SIMD.Float32x4.add(tmp1, tmp1),\n               SIMD.Float32x4.mul(det, SIMD.Float32x4.mul(tmp1, tmp1)));\n  det   = SIMD.Float32x4.swizzle(det, 0, 0, 0, 0);\n  if (!det) {\n      return null;\n  }\n\n  // Compute matrix inverse\n  SIMD.Float32x4.store(out, 0,  SIMD.Float32x4.mul(det, minor0));\n  SIMD.Float32x4.store(out, 4,  SIMD.Float32x4.mul(det, minor1));\n  SIMD.Float32x4.store(out, 8,  SIMD.Float32x4.mul(det, minor2));\n  SIMD.Float32x4.store(out, 12, SIMD.Float32x4.mul(det, minor3));\n  return out;\n}\n\n/**\n * Inverts a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = glMatrix.USE_SIMD ? mat4.SIMD.invert : mat4.scalar.invert;\n\n/**\n * Calculates the adjugate of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    out[0]  =  (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n    out[1]  = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n    out[2]  =  (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n    out[3]  = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n    out[4]  = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n    out[5]  =  (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n    out[6]  = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n    out[7]  =  (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n    out[8]  =  (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n    out[9]  = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n    out[10] =  (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n    out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n    out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n    out[13] =  (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n    out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n    out[15] =  (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.adjoint = function(out, a) {\n  var a0, a1, a2, a3;\n  var row0, row1, row2, row3;\n  var tmp1;\n  var minor0, minor1, minor2, minor3;\n\n  var a0 = SIMD.Float32x4.load(a, 0);\n  var a1 = SIMD.Float32x4.load(a, 4);\n  var a2 = SIMD.Float32x4.load(a, 8);\n  var a3 = SIMD.Float32x4.load(a, 12);\n\n  // Transpose the source matrix.  Sort of.  Not a true transpose operation\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  SIMD.Float32x4.store(out, 0,  minor0);\n  SIMD.Float32x4.store(out, 4,  minor1);\n  SIMD.Float32x4.store(out, 8,  minor2);\n  SIMD.Float32x4.store(out, 12, minor3);\n  return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n mat4.adjoint = glMatrix.USE_SIMD ? mat4.SIMD.adjoint : mat4.scalar.adjoint;\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's explicitly using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand, must be a Float32Array\n * @param {mat4} b the second operand, must be a Float32Array\n * @returns {mat4} out\n */\nmat4.SIMD.multiply = function (out, a, b) {\n    var a0 = SIMD.Float32x4.load(a, 0);\n    var a1 = SIMD.Float32x4.load(a, 4);\n    var a2 = SIMD.Float32x4.load(a, 8);\n    var a3 = SIMD.Float32x4.load(a, 12);\n\n    var b0 = SIMD.Float32x4.load(b, 0);\n    var out0 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 0, out0);\n\n    var b1 = SIMD.Float32x4.load(b, 4);\n    var out1 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 4, out1);\n\n    var b2 = SIMD.Float32x4.load(b, 8);\n    var out2 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 2, 2, 2, 2), a2),\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 8, out2);\n\n    var b3 = SIMD.Float32x4.load(b, 12);\n    var out3 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                        SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 1, 1, 1, 1), a1),\n                        SIMD.Float32x4.add(\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 2, 2, 2, 2), a2),\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Multiplies two mat4's explicitly not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.scalar.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    // Cache only the current line of the second matrix\n    var b0  = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n    out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n    out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n    out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n    return out;\n};\n\n/**\n * Multiplies two mat4's using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = glMatrix.USE_SIMD ? mat4.SIMD.multiply : mat4.scalar.multiply;\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.scalar.translate = function (out, a, v) {\n    var x = v[0], y = v[1], z = v[2],\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23;\n\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n        a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n        a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n        out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n        out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n        out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.SIMD.translate = function (out, a, v) {\n    var a0 = SIMD.Float32x4.load(a, 0),\n        a1 = SIMD.Float32x4.load(a, 4),\n        a2 = SIMD.Float32x4.load(a, 8),\n        a3 = SIMD.Float32x4.load(a, 12),\n        vec = SIMD.Float32x4(v[0], v[1], v[2] , 0);\n\n    if (a !== out) {\n        out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n        out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n        out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n    }\n\n    a0 = SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0));\n    a1 = SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1));\n    a2 = SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2));\n\n    var t0 = SIMD.Float32x4.add(a0, SIMD.Float32x4.add(a1, SIMD.Float32x4.add(a2, a3)));\n    SIMD.Float32x4.store(out, 12, t0);\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = glMatrix.USE_SIMD ? mat4.SIMD.translate : mat4.scalar.translate;\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scalar.scale = function(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.SIMD.scale = function(out, a, v) {\n    var a0, a1, a2;\n    var vec = SIMD.Float32x4(v[0], v[1], v[2], 0);\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    SIMD.Float32x4.store(\n        out, 0, SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0)));\n\n    a1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(\n        out, 4, SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1)));\n\n    a2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(\n        out, 8, SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2)));\n\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n */\nmat4.scale = glMatrix.USE_SIMD ? mat4.SIMD.scale : mat4.scalar.scale;\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t,\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23,\n        b00, b01, b02,\n        b10, b11, b12,\n        b20, b21, b22;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n    a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n    a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateX = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[0]  = a[0];\n        out[1]  = a[1];\n        out[2]  = a[2];\n        out[3]  = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateX = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n      out[0]  = a[0];\n      out[1]  = a[1];\n      out[2]  = a[2];\n      out[3]  = a[3];\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_2, c), SIMD.Float32x4.mul(a_1, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD if availabe and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = glMatrix.USE_SIMD ? mat4.SIMD.rotateX : mat4.scalar.rotateX;\n\n/**\n * Rotates a matrix by the given angle around the Y axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateY = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateY = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, s), SIMD.Float32x4.mul(a_2, c)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateY = glMatrix.USE_SIMD ? mat4.SIMD.rotateY : mat4.scalar.rotateY;\n\n/**\n * Rotates a matrix by the given angle around the Z axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateZ = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateZ = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_1, s)));\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_0, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateZ = glMatrix.USE_SIMD ? mat4.SIMD.rotateZ : mat4.scalar.rotateZ;\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\nmat4.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.fromRotation = function(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromXRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = 1;\n    out[1]  = 0;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromYRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = 0;\n    out[2]  = -s;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromZRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = s;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nmat4.getTranslation = function (out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n\n  return out;\n};\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nmat4.getRotation = function (out, mat) {\n  // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n  var trace = mat[0] + mat[5] + mat[10];\n  var S = 0;\n\n  if (trace > 0) { \n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (mat[6] - mat[9]) / S;\n    out[1] = (mat[8] - mat[2]) / S; \n    out[2] = (mat[1] - mat[4]) / S; \n  } else if ((mat[0] > mat[5])&(mat[0] > mat[10])) { \n    S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;\n    out[3] = (mat[6] - mat[9]) / S;\n    out[0] = 0.25 * S;\n    out[1] = (mat[1] + mat[4]) / S; \n    out[2] = (mat[8] + mat[2]) / S; \n  } else if (mat[5] > mat[10]) { \n    S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;\n    out[3] = (mat[8] - mat[2]) / S;\n    out[0] = (mat[1] + mat[4]) / S; \n    out[1] = 0.25 * S;\n    out[2] = (mat[6] + mat[9]) / S; \n  } else { \n    S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;\n    out[3] = (mat[1] - mat[4]) / S;\n    out[0] = (mat[8] + mat[2]) / S;\n    out[1] = (mat[6] + mat[9]) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScale = function (out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2,\n        sx = s[0],\n        sy = s[1],\n        sz = s[2];\n\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) {\n  // Quaternion math\n  var x = q[0], y = q[1], z = q[2], w = q[3],\n      x2 = x + x,\n      y2 = y + y,\n      z2 = z + z,\n\n      xx = x * x2,\n      xy = x * y2,\n      xz = x * z2,\n      yy = y * y2,\n      yz = y * z2,\n      zz = z * z2,\n      wx = w * x2,\n      wy = w * y2,\n      wz = w * z2,\n\n      sx = s[0],\n      sy = s[1],\n      sz = s[2],\n\n      ox = o[0],\n      oy = o[1],\n      oz = o[2];\n\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);\n  out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);\n  out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);\n  out[15] = 1;\n\n  return out;\n};\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nmat4.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left),\n        tb = 1 / (top - bottom),\n        nf = 1 / (near - far);\n    out[0] = (near * 2) * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = (near * 2) * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (far * near * 2) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2),\n        nf = 1 / (near - far);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (2 * far * near) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspectiveFromFieldOfView = function (out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI/180.0),\n        downTan = Math.tan(fov.downDegrees * Math.PI/180.0),\n        leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0),\n        rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0),\n        xScale = 2.0 / (leftTan + rightTan),\n        yScale = 2.0 / (upTan + downTan);\n\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = ((upTan - downTan) * yScale * 0.5);\n    out[10] = far / (near - far);\n    out[11] = -1.0;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = (far * near) / (near - far);\n    out[15] = 0.0;\n    return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right),\n        bt = 1 / (bottom - top),\n        nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n        eyex = eye[0],\n        eyey = eye[1],\n        eyez = eye[2],\n        upx = up[0],\n        upy = up[1],\n        upz = up[2],\n        centerx = center[0],\n        centery = center[1],\n        centerz = center[2];\n\n    if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n        Math.abs(eyey - centery) < glMatrix.EPSILON &&\n        Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n        return mat4.identity(out);\n    }\n\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n\n    len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n\n    len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n    return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n                    a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n                    a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' +\n                    a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat4.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) ))\n};\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n};\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nmat4.sub = mat4.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nmat4.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n};\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nmat4.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    out[9] = a[9] + (b[9] * scale);\n    out[10] = a[10] + (b[10] * scale);\n    out[11] = a[11] + (b[11] * scale);\n    out[12] = a[12] + (b[12] * scale);\n    out[13] = a[13] + (b[13] * scale);\n    out[14] = a[14] + (b[14] * scale);\n    out[15] = a[15] + (b[15] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && \n           a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && \n           a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] &&\n           a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.equals = function (a, b) {\n    var a0  = a[0],  a1  = a[1],  a2  = a[2],  a3  = a[3],\n        a4  = a[4],  a5  = a[5],  a6  = a[6],  a7  = a[7], \n        a8  = a[8],  a9  = a[9],  a10 = a[10], a11 = a[11], \n        a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n\n    var b0  = b[0],  b1  = b[1],  b2  = b[2],  b3  = b[3],\n        b4  = b[4],  b5  = b[5],  b6  = b[6],  b7  = b[7], \n        b8  = b[8],  b9  = b[9],  b10 = b[10], b11 = b[11], \n        b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&\n            Math.abs(a9 - b9) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&\n            Math.abs(a10 - b10) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&\n            Math.abs(a11 - b11) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&\n            Math.abs(a12 - b12) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&\n            Math.abs(a13 - b13) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&\n            Math.abs(a14 - b14) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&\n            Math.abs(a15 - b15) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a15), Math.abs(b15)));\n};\n\n\n\nmodule.exports = mat4;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/mat4.js\n// module id = 1062\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\nvar mat3 = require(\"./mat3.js\");\nvar vec3 = require(\"./vec3.js\");\nvar vec4 = require(\"./vec4.js\");\n\n/**\n * @class Quaternion\n * @name quat\n */\nvar quat = {};\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\nquat.rotationTo = (function() {\n    var tmpvec3 = vec3.create();\n    var xUnitVec3 = vec3.fromValues(1,0,0);\n    var yUnitVec3 = vec3.fromValues(0,1,0);\n\n    return function(out, a, b) {\n        var dot = vec3.dot(a, b);\n        if (dot < -0.999999) {\n            vec3.cross(tmpvec3, xUnitVec3, a);\n            if (vec3.length(tmpvec3) < 0.000001)\n                vec3.cross(tmpvec3, yUnitVec3, a);\n            vec3.normalize(tmpvec3, tmpvec3);\n            quat.setAxisAngle(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            vec3.cross(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot;\n            return quat.normalize(out, out);\n        }\n    };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view  the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nquat.setAxes = (function() {\n    var matr = mat3.create();\n\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n\n        return quat.normalize(out, quat.fromMat3(out, matr));\n    };\n})();\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n};\n\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {quat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\nquat.getAxisAngle = function(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s != 0.0) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        by = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bz = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n    var x = a[0], y = a[1], z = a[2];\n\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    var        omega, cosom, sinom, scale0, scale1;\n\n    // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    // adjust signs (if necessary)\n    if ( cosom < 0.0 ) {\n        cosom = -cosom;\n        bx = - bx;\n        by = - by;\n        bz = - bz;\n        bw = - bw;\n    }\n    // calculate coefficients\n    if ( (1.0 - cosom) > 0.000001 ) {\n        // standard case (slerp)\n        omega  = Math.acos(cosom);\n        sinom  = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {        \n        // \"from\" and \"to\" quaternions are very close \n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    \n    return out;\n};\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount\n * @returns {quat} out\n */\nquat.sqlerp = (function () {\n  var temp1 = quat.create();\n  var temp2 = quat.create();\n  \n  return function (out, a, b, c, d, t) {\n    quat.slerp(temp1, a, d, t);\n    quat.slerp(temp2, b, c, t);\n    quat.slerp(out, temp1, temp2, 2 * t * (1 - t));\n    \n    return out;\n  };\n}());\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n        invDot = dot ? 1.0/dot : 0;\n    \n    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n    out[0] = -a0*invDot;\n    out[1] = -a1*invDot;\n    out[2] = -a2*invDot;\n    out[3] = a3*invDot;\n    return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = function(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n\n    if ( fTrace > 0.0 ) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0);  // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5/fRoot;  // 1/(4w)\n        out[0] = (m[5]-m[7])*fRoot;\n        out[1] = (m[6]-m[2])*fRoot;\n        out[2] = (m[1]-m[3])*fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if ( m[4] > m[0] )\n          i = 1;\n        if ( m[8] > m[i*3+i] )\n          i = 2;\n        var j = (i+1)%3;\n        var k = (i+2)%3;\n        \n        fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j*3+k] - m[k*3+j]) * fRoot;\n        out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n        out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n    }\n    \n    return out;\n};\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n    return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {quat} a The first quaternion.\n * @param {quat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.exactEquals = vec4.exactEquals;\n\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {quat} a The first vector.\n * @param {quat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.equals = vec4.equals;\n\nmodule.exports = quat;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/quat.js\n// module id = 1063\n// module chunks = 0 1","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = 0;\n    out[1] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\nvec2.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\nvec2.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\nvec2.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n};\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nvec2.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n    var x = a[0],\n        y = a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nvec2.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1];\n    var len = x*x + y*y;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nvec2.random = function (out, scale) {\n    scale = scale || 1.0;\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale;\n    out[1] = Math.sin(r) * scale;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n    var x = a[0], \n        y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n    var vec = vec2.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 2;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n    return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)));\n};\n\nmodule.exports = vec2;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/gl-matrix/src/gl-matrix/vec2.js\n// module id = 1064\n// module chunks = 0 1","'use strict';\n\nmodule.exports = FrameHistory;\n\nfunction FrameHistory() {\n    this.changeTimes = new Float64Array(256);\n    this.changeOpacities = new Uint8Array(256);\n    this.opacities = new Uint8ClampedArray(256);\n    this.array = new Uint8Array(this.opacities.buffer);\n\n    this.fadeDuration = 300;\n    this.previousZoom = 0;\n    this.firstFrame = true;\n}\n\nFrameHistory.prototype.record = function(zoom) {\n    var now = Date.now();\n\n    if (this.firstFrame) {\n        now = 0;\n        this.firstFrame = false;\n    }\n\n    zoom = Math.floor(zoom * 10);\n\n    var z;\n    if (zoom < this.previousZoom) {\n        for (z = zoom + 1; z <= this.previousZoom; z++) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    } else {\n        for (z = zoom; z > this.previousZoom; z--) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    }\n\n    for (z = 0; z < 256; z++) {\n        var timeSince = now - this.changeTimes[z];\n        var opacityChange = timeSince / this.fadeDuration * 255;\n        if (z <= zoom) {\n            this.opacities[z] = this.changeOpacities[z] + opacityChange;\n        } else {\n            this.opacities[z] = this.changeOpacities[z] - opacityChange;\n        }\n    }\n\n    this.changed = true;\n    this.previousZoom = zoom;\n};\n\nFrameHistory.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        if (this.changed) {\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n            this.changed = false;\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/frame_history.js\n// module id = 1065\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\nvar util = require('../../util/util');\nvar shaders = require('mapbox-gl-shaders');\n\nvar utilSource = shaders.util;\n\nmodule.exports._createProgram = function(name, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n    var program = gl.createProgram();\n    var definition = shaders[name];\n\n    var definesSource = '#define MAPBOX_GL_JS;\\n';\n    for (var j = 0; j < defines.length; j++) {\n        definesSource += '#define ' + defines[j] + ';\\n';\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, applyPragmas(definesSource + definition.fragmentSource, fragmentPragmas));\n    gl.compileShader(fragmentShader);\n    assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));\n    gl.attachShader(program, fragmentShader);\n\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, applyPragmas(definesSource + utilSource + definition.vertexSource, vertexPragmas));\n    gl.compileShader(vertexShader);\n    assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));\n    gl.attachShader(program, vertexShader);\n\n    gl.linkProgram(program);\n    assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program));\n\n    var attributes = {};\n    var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n    for (var i = 0; i < numAttributes; i++) {\n        var attribute = gl.getActiveAttrib(program, i);\n        attributes[attribute.name] = gl.getAttribLocation(program, attribute.name);\n    }\n\n    var uniforms = {};\n    var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n    for (var ui = 0; ui < numUniforms; ui++) {\n        var uniform = gl.getActiveUniform(program, ui);\n        uniforms[uniform.name] = gl.getUniformLocation(program, uniform.name);\n    }\n\n    return util.extend({\n        program: program,\n        definition: definition,\n        attributes: attributes,\n        numAttributes: numAttributes\n    }, attributes, uniforms);\n};\n\nmodule.exports._createProgramCached = function(name, defines, vertexPragmas, fragmentPragmas) {\n    this.cache = this.cache || {};\n\n    var key = JSON.stringify({\n        name: name,\n        defines: defines,\n        vertexPragmas: vertexPragmas,\n        fragmentPragmas: fragmentPragmas\n    });\n\n    if (!this.cache[key]) {\n        this.cache[key] = this._createProgram(name, defines, vertexPragmas, fragmentPragmas);\n    }\n    return this.cache[key];\n};\n\nmodule.exports.useProgram = function (nextProgramName, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n\n    defines = defines || [];\n    if (this._showOverdrawInspector) {\n        defines = defines.concat('OVERDRAW_INSPECTOR');\n    }\n\n    var nextProgram = this._createProgramCached(nextProgramName, defines, vertexPragmas, fragmentPragmas);\n    var previousProgram = this.currentProgram;\n\n    if (previousProgram !== nextProgram) {\n        gl.useProgram(nextProgram.program);\n        this.currentProgram = nextProgram;\n    }\n\n    return nextProgram;\n};\n\nfunction applyPragmas(source, pragmas) {\n    return source.replace(/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g, function(match, operation, precision, type, name) {\n        return pragmas[operation][name].replace(/{precision}/g, precision);\n    });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/painter/use_program.js\n// module id = 1066\n// module chunks = 0 1","\nvar path = require('path');\n\n// readFileSync calls must be written out long-form for brfs.\nmodule.exports = {\n  debug: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\n\\nvoid main() {\\n    gl_FragColor = u_color;\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\\n}\\n\"\n  },\n  fill: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\nuniform lowp float u_opacity;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    gl_FragColor = color * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n}\\n\"\n  },\n  circle: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp vec4 blur\\n#pragma mapbox: define lowp vec4 opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp vec4 blur\\n    #pragma mapbox: initialize lowp vec4 opacity\\n\\n    float t = smoothstep(1.0 - max(blur, v_antialiasblur), 1.0, length(v_extrude));\\n    gl_FragColor = color * (1.0 - t) * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_extrude_scale;\\nuniform float u_devicepixelratio;\\n\\nattribute vec2 a_pos;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp vec4 blur\\n#pragma mapbox: define lowp vec4 opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main(void) {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize mediump float radius\\n    #pragma mapbox: initialize lowp vec4 blur\\n    #pragma mapbox: initialize lowp vec4 opacity\\n\\n    // unencode the extrusion vector that we snuck into the a_pos vector\\n    v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\\n\\n    vec2 extrude = v_extrude * radius * u_extrude_scale;\\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\\n    // in extrusion data\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\\n\\n    gl_Position.xy += extrude;\\n\\n    // This is a minimum blur distance that serves as a faux-antialiasing for\\n    // the circle. since blur is a ratio of the circle's size and the intent is\\n    // to keep the blur at roughly 1px, the two are inversely related.\\n    v_antialiasblur = 1.0 / u_devicepixelratio / radius;\\n}\\n\"\n  },\n  line: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform float u_blur;\\n\\nvarying vec2 v_linewidth;\\nvarying vec2 v_normal;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\nuniform mediump float u_blur;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_blur;\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_fade;\\nuniform float u_opacity;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\\n    float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\\n    float y_a = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_a.y);\\n    float y_b = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_b.y);\\n    vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\\n    vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\\n\\n    vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\\n\\n    alpha *= u_opacity;\\n\\n    gl_FragColor = color * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n    v_linesofar = a_linesofar;\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n#ifndef MAPBOX_GL_JS\\n    float perspective_scale = 1.0 / (1.0 - y * u_extra);\\n#else\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n#endif\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linesdfpattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\n\\nuniform float u_blur;\\nuniform sampler2D u_image;\\nuniform float u_sdfgamma;\\nuniform float u_mix;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float sdfdist_a = texture2D(u_image, v_tex_a).a;\\n    float sdfdist_b = texture2D(u_image, v_tex_b).a;\\n    float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\\n    alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform vec2 u_patternscale_a;\\nuniform float u_tex_y_a;\\nuniform vec2 u_patternscale_b;\\nuniform float u_tex_y_b;\\nuniform float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\\n    v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  outline: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    gl_FragColor = outline_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos;\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  outlinepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    // find distance to outline for alpha interpolation\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    \\n\\n    gl_FragColor = mix(color1, color2, u_mix) * alpha * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform vec2 u_patternscale_a;\\nuniform vec2 u_patternscale_b;\\nuniform vec2 u_offset_a;\\nuniform vec2 u_offset_b;\\n#else\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    v_pos_a = u_patternscale_a * a_pos + u_offset_a;\\n    v_pos_b = u_patternscale_b * a_pos + u_offset_b;\\n    v_pos = (gl_Position.xy/gl_Position.w + 1.0) / 2.0 * u_world;\\n#else\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    // \\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n#endif\\n}\\n\"\n  },\n  pattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform mat4 u_matrix;\\nuniform vec2 u_patternscale_a;\\nuniform vec2 u_patternscale_b;\\nuniform vec2 u_offset_a;\\nuniform vec2 u_offset_b;\\n#else\\nuniform mat4 u_matrix;\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    v_pos_a = u_patternscale_a * a_pos + u_offset_a;\\n    v_pos_b = u_patternscale_b * a_pos + u_offset_b;\\n#else\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    // \\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n#endif\\n}\\n\"\n  },\n  raster: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nuniform sampler2D u_image;\\nuniform float u_opacity;\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nvarying vec2 v_pos;\\n#else\\nuniform float u_opacity0;\\nuniform float u_opacity1;\\nuniform sampler2D u_image0;\\nuniform sampler2D u_image1;\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n#endif\\n\\nuniform float u_brightness_low;\\nuniform float u_brightness_high;\\n\\nuniform float u_saturation_factor;\\nuniform float u_contrast_factor;\\nuniform vec3 u_spin_weights;\\n\\nvoid main() {\\n\\n#ifndef MAPBOX_GL_JS\\n    vec4 color = texture2D(u_image, v_pos) * u_opacity;\\n#else\\n    // read and cross-fade colors from the main and parent tiles\\n    vec4 color0 = texture2D(u_image0, v_pos0);\\n    vec4 color1 = texture2D(u_image1, v_pos1);\\n    vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\\n#endif\\n    vec3 rgb = color.rgb;\\n\\n    // spin\\n    rgb = vec3(\\n        dot(rgb, u_spin_weights.xyz),\\n        dot(rgb, u_spin_weights.zxy),\\n        dot(rgb, u_spin_weights.yzx));\\n\\n    // saturation\\n    float average = (color.r + color.g + color.b) / 3.0;\\n    rgb += (average - rgb) * u_saturation_factor;\\n\\n    // contrast\\n    rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\\n\\n    // brightness\\n    vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\\n    vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\\n\\n    gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\n#ifndef MAPBOX_GL_JS\\nuniform float u_buffer;\\n#else\\nuniform vec2 u_tl_parent;\\nuniform float u_scale_parent;\\nuniform float u_buffer_scale;\\n#endif\\n\\nattribute vec2 a_pos;\\n#ifdef MAPBOX_GL_JS\\nattribute vec2 a_texture_pos;\\n#endif\\n\\n#ifndef MAPBOX_GL_JS\\nvarying vec2 v_pos;\\n\\n#else\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n#endif\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n#ifndef MAPBOX_GL_JS\\n    float dimension = (8192.0 + 2.0 * u_buffer);\\n    v_pos = (a_pos / dimension) + (u_buffer / dimension);\\n#else\\n    v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\\n    v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\\n#endif\\n}\\n\"\n  },\n  icon: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\\n    gl_FragColor = texture2D(u_texture, v_tex) * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec4 a_data1;\\nattribute vec4 a_data2;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_skewed;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    vec2 a_tex = a_data1.xy;\\n    mediump float a_labelminzoom = a_data1[2];\\n    mediump vec2 a_zoom = a_data2.st;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_skewed) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  sdf: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform lowp float u_buffer;\\nuniform lowp float u_gamma;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    lowp float dist = texture2D(u_texture, v_tex).a;\\n    lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\\n    lowp float gamma = u_gamma * v_gamma_scale;\\n    lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec4 a_data1;\\nattribute vec4 a_data2;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_skewed;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_tex = a_data1.xy;\\n    mediump float a_labelminzoom = a_data1[2];\\n    mediump vec2 a_zoom = a_data2.st;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_skewed) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_gamma_scale = (gl_Position.w - 0.5);\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  collisionbox: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_zoom;\\nuniform float u_maxzoom;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n\\n    float alpha = 0.5;\\n\\n    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n    if (v_placement_zoom > u_zoom) {\\n        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n    }\\n\\n    if (u_zoom >= v_max_zoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\\n    }\\n\\n    if (v_placement_zoom >= u_maxzoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\\n    }\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_extrude;\\nattribute vec2 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform float u_scale;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n    v_max_zoom = a_data.x;\\n    v_placement_zoom = a_data.y;\\n}\\n\"\n  }\n};\n\nmodule.exports.util = \"float evaluate_zoom_function_1(const vec4 values, const float t) {\\n    if (t < 1.0) {\\n        return mix(values[0], values[1], t);\\n    } else if (t < 2.0) {\\n        return mix(values[1], values[2], t - 1.0);\\n    } else {\\n        return mix(values[2], values[3], t - 2.0);\\n    }\\n}\\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\\n    if (t < 1.0) {\\n        return mix(value0, value1, t);\\n    } else if (t < 2.0) {\\n        return mix(value1, value2, t - 1.0);\\n    } else {\\n        return mix(value2, value3, t - 2.0);\\n    }\\n}\\n\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl-shaders/index.js\n// module id = 1067\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar drawCollisionDebug = require('./draw_collision_debug');\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] ||\n        layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']);\n\n    var gl = painter.gl;\n\n    // Disable the stencil test so that labels aren't clipped to tile boundaries.\n    //\n    // Layers with features that may be drawn overlapping aren't clipped. These\n    // layers are sorted in the y direction, and to draw the correct ordering near\n    // tile edges the icons are included in both tiles and clipped when drawing.\n    if (drawAcrossEdges) {\n        gl.disable(gl.STENCIL_TEST);\n    } else {\n        gl.enable(gl.STENCIL_TEST);\n    }\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n\n    drawLayerSymbols(painter, source, layer, coords, false,\n            layer.paint['icon-translate'],\n            layer.paint['icon-translate-anchor'],\n            layer.layout['icon-rotation-alignment'],\n            layer.layout['icon-size'],\n            layer.paint['icon-halo-width'],\n            layer.paint['icon-halo-color'],\n            layer.paint['icon-halo-blur'],\n            layer.paint['icon-opacity'],\n            layer.paint['icon-color']);\n\n    drawLayerSymbols(painter, source, layer, coords, true,\n            layer.paint['text-translate'],\n            layer.paint['text-translate-anchor'],\n            layer.layout['text-rotation-alignment'],\n            layer.layout['text-size'],\n            layer.paint['text-halo-width'],\n            layer.paint['text-halo-color'],\n            layer.paint['text-halo-blur'],\n            layer.paint['text-opacity'],\n            layer.paint['text-color']);\n\n    gl.enable(gl.DEPTH_TEST);\n\n    drawCollisionDebug(painter, source, layer, coords);\n}\n\nfunction drawLayerSymbols(painter, source, layer, coords, isText,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    for (var j = 0; j < coords.length; j++) {\n        var tile = source.getTile(coords[j]);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bothBufferGroups = bucket.bufferGroups;\n        var bufferGroups = isText ? bothBufferGroups.glyph : bothBufferGroups.icon;\n        if (!bufferGroups.length) continue;\n\n        painter.enableTileClippingMask(coords[j]);\n        drawSymbol(painter, layer, coords[j].posMatrix, tile, bucket, bufferGroups, isText,\n                isText || bucket.sdfIcons, !isText && bucket.iconsNeedLinear,\n                isText ? bucket.adjustedTextSize : bucket.adjustedIconSize, bucket.fontstack,\n                translate,\n                translateAnchor,\n                rotationAlignment,\n                size,\n                haloWidth,\n                haloColor,\n                haloBlur,\n                opacity,\n                color);\n    }\n}\n\nfunction drawSymbol(painter, layer, posMatrix, tile, bucket, bufferGroups, isText, sdf, iconsNeedLinear, adjustedSize, fontstack,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n    var gl = painter.gl;\n    var tr = painter.transform;\n    var alignedWithMap = rotationAlignment === 'map';\n\n    var defaultSize = isText ? 24 : 1;\n    var fontScale = size / defaultSize;\n\n    var extrudeScale, s, gammaScale;\n    if (alignedWithMap) {\n        s = pixelsToTileUnits(tile, 1, painter.transform.zoom) * fontScale;\n        gammaScale = 1 / Math.cos(tr._pitch);\n        extrudeScale = [s, s];\n    } else {\n        s = painter.transform.altitude * fontScale;\n        gammaScale = 1;\n        extrudeScale = [ tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s];\n    }\n\n    if (!isText && !painter.style.sprite.loaded())\n        return;\n\n    var program = painter.useProgram(sdf ? 'sdf' : 'icon');\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(posMatrix, tile, translate, translateAnchor));\n    gl.uniform1i(program.u_skewed, alignedWithMap);\n    gl.uniform2fv(program.u_extrude_scale, extrudeScale);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(program.u_texture, 0);\n\n    if (isText) {\n        // use the fonstack used when parsing the tile, not the fontstack\n        // at the current zoom level (layout['text-font']).\n        var glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack);\n        if (!glyphAtlas) return;\n\n        glyphAtlas.updateTexture(gl);\n        gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4);\n    } else {\n        var mapMoving = painter.options.rotating || painter.options.zooming;\n        var iconScaled = fontScale !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear;\n        var iconTransformed = alignedWithMap || painter.transform.pitch;\n        painter.spriteAtlas.bind(gl, sdf || mapMoving || iconScaled || iconTransformed);\n        gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4);\n    }\n\n    // adjust min/max zooms for variable font sizes\n    var zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0;\n    gl.uniform1f(program.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level\n\n    gl.activeTexture(gl.TEXTURE1);\n    painter.frameHistory.bind(gl);\n    gl.uniform1i(program.u_fadetexture, 1);\n\n    var group;\n\n    if (sdf) {\n        var sdfPx = 8;\n        var blurOffset = 1.19;\n        var haloOffset = 6;\n        var gamma = 0.105 * defaultSize / size / browser.devicePixelRatio;\n\n        if (haloWidth) {\n            // Draw halo underneath the text.\n            gl.uniform1f(program.u_gamma, (haloBlur * blurOffset / fontScale / sdfPx + gamma) * gammaScale);\n            gl.uniform4fv(program.u_color, haloColor);\n            gl.uniform1f(program.u_opacity, opacity);\n            gl.uniform1f(program.u_buffer, (haloOffset - haloWidth / fontScale) / sdfPx);\n\n            for (var j = 0; j < bufferGroups.length; j++) {\n                group = bufferGroups[j];\n                group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n                gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n            }\n        }\n\n        gl.uniform1f(program.u_gamma, gamma * gammaScale);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        gl.uniform1f(program.u_buffer, (256 - 64) / 256);\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n\n    } else {\n        gl.uniform1f(program.u_opacity, opacity);\n        for (var k = 0; k < bufferGroups.length; k++) {\n            group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_symbol.js\n// module id = 1068\n// module chunks = 0 1","'use strict';\n\nmodule.exports = drawCollisionDebug;\n\nfunction drawCollisionDebug(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n    var program = painter.useProgram('collisionbox');\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.collisionBox;\n\n        if (!bufferGroups || !bufferGroups.length) continue;\n        var group = bufferGroups[0];\n        if (group.layout.vertex.length === 0) continue;\n\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        painter.enableTileClippingMask(coord);\n\n        painter.lineWidth(1);\n        gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n        gl.uniform1f(program.u_zoom, painter.transform.zoom * 10);\n        gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10);\n\n        group.vaos[layer.id].bind(gl, program, group.layout.vertex);\n        gl.drawArrays(gl.LINES, 0, group.layout.vertex.length);\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_collision_debug.js\n// module id = 1069\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\n\nmodule.exports = drawCircles;\n\nfunction drawCircles(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    // Allow circles to be drawn across boundaries, so that\n    // large circles are not clipped to tiles\n    gl.disable(gl.STENCIL_TEST);\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.circle;\n        if (!bufferGroups) continue;\n\n        var programOptions = bucket.paintAttributes.circle[layer.id];\n        var program = painter.useProgram(\n            'circle',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform2f(program.u_extrude_scale,\n                painter.transform.pixelsToGLUnits[0] * painter.transform.altitude,\n                painter.transform.pixelsToGLUnits[1] * painter.transform.altitude);\n        gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n            coord.posMatrix,\n            tile,\n            layer.paint['circle-translate'],\n            layer.paint['circle-translate-anchor']\n        ));\n\n        bucket.setUniforms(gl, 'circle', program, layer, {zoom: painter.transform.zoom});\n\n        for (var k = 0; k < bufferGroups.length; k++) {\n            var group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element, group.paint[layer.id]);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_circle.js\n// module id = 1070\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar mat2 = require('gl-matrix').mat2;\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    // don't draw zero-width lines\n    if (layer.paint['line-width'] <= 0) return;\n\n    // the distance over which the line edge fades out.\n    // Retina devices need a smaller distance to avoid aliasing.\n    var antialiasing = 1 / browser.devicePixelRatio;\n\n    var blur = layer.paint['line-blur'] + antialiasing;\n    var color = layer.paint['line-color'];\n\n    var tr = painter.transform;\n\n    var antialiasingMatrix = mat2.create();\n    mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]);\n    mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle);\n\n    // calculate how much longer the real world distance is at the top of the screen\n    // than at the middle of the screen.\n    var topedgelength = Math.sqrt(tr.height * tr.height / 4  * (1 + tr.altitude * tr.altitude));\n    var x = tr.height / 2 * Math.tan(tr._pitch);\n    var extra = (topedgelength + x) / topedgelength - 1;\n\n    var dasharray = layer.paint['line-dasharray'];\n    var image = layer.paint['line-pattern'];\n    var program, posA, posB, imagePosA, imagePosB;\n\n    if (dasharray) {\n        program = painter.useProgram('linesdfpattern');\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n\n        posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n        posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.lineAtlas.bind(gl);\n\n        gl.uniform1f(program.u_tex_y_a, posA.y);\n        gl.uniform1f(program.u_tex_y_b, posB.y);\n        gl.uniform1f(program.u_mix, dasharray.t);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else if (image) {\n        imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n        imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n        if (!imagePosA || !imagePosB) return;\n\n        program = painter.useProgram('linepattern');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_fade, image.t);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else {\n        program = painter.useProgram('line');\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n    }\n\n    for (var k = 0; k < coords.length; k++) {\n        var coord = coords[k];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.line;\n        if (!bufferGroups) continue;\n\n        painter.enableTileClippingMask(coord);\n\n        // set uniforms that are different for each tile\n        var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n        gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n        var ratio = 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom);\n\n        if (dasharray) {\n            var widthA = posA.width * dasharray.fromScale;\n            var widthB = posB.width * dasharray.toScale;\n            var scaleA = [1 / pixelsToTileUnits(tile, widthA, painter.transform.tileZoom), -posA.height / 2];\n            var scaleB = [1 / pixelsToTileUnits(tile, widthB, painter.transform.tileZoom), -posB.height / 2];\n            var gamma = painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2;\n            gl.uniform1f(program.u_ratio, ratio);\n            gl.uniform2fv(program.u_patternscale_a, scaleA);\n            gl.uniform2fv(program.u_patternscale_b, scaleB);\n            gl.uniform1f(program.u_sdfgamma, gamma);\n\n        } else if (image) {\n            gl.uniform1f(program.u_ratio, ratio);\n            gl.uniform2fv(program.u_pattern_size_a, [\n                pixelsToTileUnits(tile, imagePosA.size[0] * image.fromScale, painter.transform.tileZoom),\n                imagePosB.size[1]\n            ]);\n            gl.uniform2fv(program.u_pattern_size_b, [\n                pixelsToTileUnits(tile, imagePosB.size[0] * image.toScale, painter.transform.tileZoom),\n                imagePosB.size[1]\n            ]);\n\n        } else {\n            gl.uniform1f(program.u_ratio, ratio);\n        }\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            var group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element);\n            gl.drawElements(gl.TRIANGLES, group.layout.element.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_line.js\n// module id = 1071\n// module chunks = 0 1","'use strict';\n\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\nmodule.exports = draw;\n\nfunction draw(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    var color = layer.paint['fill-color'];\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    // Draw fill\n    if (image ? !painter.isOpaquePass : painter.isOpaquePass === (color[3] === 1 && opacity === 1)) {\n        // Once we switch to earcut drawing we can pull most of the WebGL setup\n        // outside of this coords loop.\n        painter.setDepthSublayer(1);\n        for (var i = 0; i < coords.length; i++) {\n            drawFill(painter, source, layer, coords[i]);\n        }\n    }\n\n    if (!painter.isOpaquePass && layer.paint['fill-antialias']) {\n        if (isOutlineColorDefined || !layer.paint['fill-pattern']) {\n            painter.lineWidth(2);\n            painter.depthMask(false);\n\n            if (isOutlineColorDefined) {\n                // If we defined a different color for the fill outline, we are\n                // going to ignore the bits in 0x07 and just care about the global\n                // clipping mask.\n                painter.setDepthSublayer(2);\n            } else {\n                // Otherwise, we only want to drawFill the antialiased parts that are\n                // *outside* the current shape. This is important in case the fill\n                // or stroke color is translucent. If we wouldn't clip to outside\n                // the current shape, some pixels from the outline stroke overlapped\n                // the (non-antialiased) fill.\n                painter.setDepthSublayer(0);\n            }\n\n            for (var j = 0; j < coords.length; j++) {\n                drawStroke(painter, source, layer, coords[j]);\n            }\n        } else {\n            painter.lineWidth(2);\n            painter.depthMask(false);\n            // Otherwise, we only want to drawFill the antialiased parts that are\n            // *outside* the current shape. This is important in case the fill\n            // or stroke color is translucent. If we wouldn't clip to outside\n            // the current shape, some pixels from the outline stroke overlapped\n            // the (non-antialiased) fill.\n            painter.setDepthSublayer(0);\n\n            for (var k = 0; k < coords.length; k++) {\n                drawStroke(painter, source, layer, coords[k]);\n            }\n        }\n\n    }\n}\n\nfunction drawFill(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.fill;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var program;\n\n    if (!image) {\n\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'fill',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n        gl.uniform1f(program.u_opacity, opacity);\n\n    } else {\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        setPattern(image, opacity, tile, coord, painter, program);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    painter.enableTileClippingMask(coord);\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element, group.paint[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.layout.element.length, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\nfunction drawStroke(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n\n    var gl = painter.gl;\n    var bufferGroups = bucket.bufferGroups.fill;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    var program;\n    if (image && !isOutlineColorDefined) {\n        program = painter.useProgram('outlinepattern');\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    } else {\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'outline',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n        gl.uniform1f(program.u_opacity, opacity);\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    if (image) { setPattern(image, opacity, tile, coord, painter, program); }\n\n    painter.enableTileClippingMask(coord);\n\n    for (var k = 0; k < bufferGroups.length; k++) {\n        var group = bufferGroups[k];\n        group.secondVaos[layer.id].bind(gl, program, group.layout.vertex, group.layout.element2, group.paint[layer.id]);\n        gl.drawElements(gl.LINES, group.layout.element2.length * 2, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\nfunction setPattern(image, opacity, tile, coord, painter, program) {\n    var gl = painter.gl;\n\n    var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n    var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n    if (!imagePosA || !imagePosB) return;\n\n    gl.uniform1i(program.u_image, 0);\n    gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n    gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n    gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n    gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n    gl.uniform1f(program.u_opacity, opacity);\n    gl.uniform1f(program.u_mix, image.t);\n\n    gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n    gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n    gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n    gl.uniform1f(program.u_scale_a, image.fromScale);\n    gl.uniform1f(program.u_scale_b, image.toScale);\n\n    var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n    var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n    var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n    // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n    gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n    gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n\n    gl.activeTexture(gl.TEXTURE0);\n    painter.spriteAtlas.bind(gl, true);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_fill.js\n// module id = 1072\n// module chunks = 0 1","'use strict';\n\nvar TilePyramid = require('../source/tile_pyramid');\nvar pyramid = new TilePyramid({ tileSize: 512 });\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\nvar createUniformPragmas = require('./create_uniform_pragmas');\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, source, layer) {\n    var gl = painter.gl;\n    var transform = painter.transform;\n    var color = layer.paint['background-color'];\n    var image = layer.paint['background-pattern'];\n    var opacity = layer.paint['background-opacity'];\n    var program;\n\n    var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null;\n    var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null;\n\n    painter.setDepthSublayer(0);\n    if (imagePosA && imagePosB) {\n\n        if (painter.isOpaquePass) return;\n\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        gl.uniform1i(program.u_image, 0);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_opacity, opacity);\n\n        gl.uniform1f(program.u_mix, image.t);\n\n        gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n        gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n        gl.uniform1f(program.u_scale_a, image.fromScale);\n        gl.uniform1f(program.u_scale_b, image.toScale);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer);\n    } else {\n        // Draw filling rectangle.\n        if (painter.isOpaquePass !== (color[3] === 1)) return;\n\n        var pragmas = createUniformPragmas([{name: 'u_color', components: 4}]);\n        program = painter.useProgram('fill', [], pragmas, pragmas);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer);\n    }\n\n    gl.disable(gl.STENCIL_TEST);\n\n    // We need to draw the background in tiles in order to use calculatePosMatrix\n    // which applies the projection matrix (transform.projMatrix). Otherwise\n    // the depth and stencil buffers get into a bad state.\n    // This can be refactored into a single draw call once earcut lands and\n    // we don't have so much going on in the stencil buffer.\n    var coords = pyramid.coveringTiles(transform);\n    for (var c = 0; c < coords.length; c++) {\n        var coord = coords[c];\n        var tileSize = 512;\n        // var pixelsToTileUnitsBound = pixelsToTileUnits.bind({coord:coord, tileSize: tileSize});\n        if (imagePosA && imagePosB) {\n            var tile = {coord:coord, tileSize: tileSize};\n\n            gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n\n            var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n            var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n            var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n            // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n            gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n            gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n        }\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord));\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_background.js\n// module id = 1073\n// module chunks = 0 1","'use strict';\n\nvar textVertices = require('../lib/debugtext');\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\nvar EXTENT = require('../data/bucket').EXTENT;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('./vertex_array_object');\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, source, coords) {\n    if (painter.isOpaquePass) return;\n    if (!painter.options.debug) return;\n\n    for (var i = 0; i < coords.length; i++) {\n        drawDebugTile(painter, source, coords[i]);\n    }\n}\n\nfunction drawDebugTile(painter, source, coord) {\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n    painter.lineWidth(1 * browser.devicePixelRatio);\n\n    var posMatrix = coord.posMatrix;\n    var program = painter.useProgram('debug');\n\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.uniform4f(program.u_color, 1, 0, 0, 1);\n    painter.debugVAO.bind(gl, program, painter.debugBuffer);\n    gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length);\n\n    var vertices = textVertices(coord.toString(), 50, 200, 5);\n    var debugTextArray = new painter.PosArray();\n    for (var v = 0; v < vertices.length; v += 2) {\n        debugTextArray.emplaceBack(vertices[v], vertices[v + 1]);\n    }\n    var debugTextBuffer = new Buffer(debugTextArray.serialize(), painter.PosArray.serialize(), Buffer.BufferType.VERTEX);\n    var debugTextVAO = new VertexArrayObject();\n    debugTextVAO.bind(gl, program, debugTextBuffer);\n    gl.uniform4f(program.u_color, 1, 1, 1, 1);\n\n    // Draw the halo with multiple 1px lines instead of one wider line because\n    // the gl spec doesn't guarantee support for lines with width > 1.\n    var tileSize = source.getTile(coord).tileSize;\n    var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize);\n    var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]];\n    for (var i = 0; i < translations.length; i++) {\n        var translation = translations[i];\n        gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0]));\n        gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n    }\n\n    gl.uniform4f(program.u_color, 0, 0, 0, 1);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/render/draw_debug.js\n// module id = 1074\n// module chunks = 0 1","'use strict';\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nvar simplexFont = {\n    \" \": [16, []],\n    \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n    \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n    \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n    \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n    \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n    \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n    \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n    \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n    \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n    \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"-\": [26, [4, 9, 22, 9]],\n    \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"/\": [22, [20, 25, 2, -7]],\n    \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n    \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n    \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n    \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n    \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n    \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n    \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n    \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n    \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"<\": [24, [20, 18, 4, 9, 20, 0]],\n    \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n    \">\": [24, [4, 18, 20, 9, 4, 0]],\n    \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n    \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n    \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n    \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n    \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n    \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n    \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n    \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n    \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n    \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n    \"I\": [8, [4, 21, 4, 0]],\n    \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n    \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n    \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n    \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n    \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n    \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n    \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n    \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n    \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n    \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n    \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n    \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n    \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n    \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n    \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n    \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n    \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n    \"\\\\\": [14, [0, 21, 14, -3]],\n    \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n    \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n    \"_\": [16, [0, -2, 16, -2]],\n    \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n    \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n    \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n    \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n    \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n    \"l\": [8, [4, 21, 4, 0]],\n    \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n    \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n    \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n    \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n    \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n    \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n    \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n    \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n    \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n    \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n    \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n    \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n    \"|\": [8, [4, 25, 4, -7]],\n    \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n    \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nmodule.exports = function textVertices(text, left, baseline, scale) {\n    scale = scale || 1;\n\n    var strokes = [],\n        i, len, j, len2, glyph, x, y, prev;\n\n    for (i = 0, len = text.length; i < len; i++) {\n        glyph = simplexFont[text[i]];\n        if (!glyph) continue;\n        prev = null;\n\n        for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n            if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n                prev = null;\n\n            } else {\n                x = left + glyph[1][j] * scale;\n                y = baseline - glyph[1][j + 1] * scale;\n                if (prev) {\n                    strokes.push(prev.x, prev.y, x, y);\n                }\n                prev = {x: x, y: y};\n            }\n        }\n        left += glyph[0] * scale;\n    }\n\n    return strokes;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/lib/debugtext.js\n// module id = 1075\n// module chunks = 0 1","'use strict';\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @class mapboxgl.Hash\n * @returns {Hash} `this`\n */\nmodule.exports = Hash;\n\nvar util = require('../util/util');\n\nfunction Hash() {\n    util.bindAll([\n        '_onHashChange',\n        '_updateHash'\n    ], this);\n}\n\nHash.prototype = {\n    /*\n     * Map element to listen for coordinate changes\n     *\n     * @param {Object} map\n     * @returns {Hash} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        window.addEventListener('hashchange', this._onHashChange, false);\n        this._map.on('moveend', this._updateHash);\n        return this;\n    },\n\n    /*\n     * Removes hash\n     *\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        window.removeEventListener('hashchange', this._onHashChange, false);\n        this._map.off('moveend', this._updateHash);\n        delete this._map;\n        return this;\n    },\n\n    _onHashChange: function() {\n        var loc = location.hash.replace('#', '').split('/');\n        if (loc.length >= 3) {\n            this._map.jumpTo({\n                center: [+loc[2], +loc[1]],\n                zoom: +loc[0],\n                bearing: +(loc[3] || 0)\n            });\n            return true;\n        }\n        return false;\n    },\n\n    _updateHash: function() {\n        var center = this._map.getCenter(),\n            zoom = this._map.getZoom(),\n            bearing = this._map.getBearing(),\n            precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),\n\n            hash = '#' + (Math.round(zoom * 100) / 100) +\n                '/' + center.lat.toFixed(precision) +\n                '/' + center.lng.toFixed(precision) +\n                (bearing ? '/' + (Math.round(bearing * 10) / 10) : '');\n\n        window.history.replaceState('', '', hash);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/hash.js\n// module id = 1076\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../util/dom');\nvar Point = require('point-geometry');\n\nvar handlers = {\n    scrollZoom: require('./handler/scroll_zoom'),\n    boxZoom: require('./handler/box_zoom'),\n    dragRotate: require('./handler/drag_rotate'),\n    dragPan: require('./handler/drag_pan'),\n    keyboard: require('./handler/keyboard'),\n    doubleClickZoom: require('./handler/dblclick_zoom'),\n    touchZoomRotate: require('./handler/touch_zoom_rotate')\n};\n\nmodule.exports = function bindHandlers(map, bindOptions, mapOptions) {\n    var el = map.getCanvasContainer();\n    var contextMenuEvent = null;\n    var startPos = null;\n    var tapped = null;\n\n    for (var name in handlers) {\n        map[name] = new handlers[name](map, mapOptions);\n        if (bindOptions[name]) {\n            map[name].enable();\n        }\n    }\n\n    el.addEventListener('mousedown', onMouseDown, false);\n    el.addEventListener('mouseup', onMouseUp, false);\n    el.addEventListener('mousemove', onMouseMove, false);\n    el.addEventListener('touchstart', onTouchStart, false);\n    el.addEventListener('touchend', onTouchEnd, false);\n    el.addEventListener('touchmove', onTouchMove, false);\n    el.addEventListener('touchcancel', onTouchCancel, false);\n    el.addEventListener('click', onClick, false);\n    el.addEventListener('dblclick', onDblClick, false);\n    el.addEventListener('contextmenu', onContextMenu, false);\n\n    function onMouseDown(e) {\n        map.stop();\n        startPos = DOM.mousePos(el, e);\n        fireMouseEvent('mousedown', e);\n    }\n\n    function onMouseUp(e) {\n        var rotating = map.dragRotate && map.dragRotate.isActive();\n\n        if (contextMenuEvent && !rotating) {\n            fireMouseEvent('contextmenu', contextMenuEvent);\n        }\n\n        contextMenuEvent = null;\n        fireMouseEvent('mouseup', e);\n    }\n\n    function onMouseMove(e) {\n        if (map.dragPan && map.dragPan.isActive()) return;\n        if (map.dragRotate && map.dragRotate.isActive()) return;\n\n        var target = e.toElement || e.target;\n        while (target && target !== el) target = target.parentNode;\n        if (target !== el) return;\n\n        fireMouseEvent('mousemove', e);\n    }\n\n    function onTouchStart(e) {\n        map.stop();\n        fireTouchEvent('touchstart', e);\n\n        if (!e.touches || e.touches.length > 1) return;\n\n        if (!tapped) {\n            tapped = setTimeout(onTouchTimeout, 300);\n\n        } else {\n            clearTimeout(tapped);\n            tapped = null;\n            fireMouseEvent('dblclick', e);\n        }\n    }\n\n    function onTouchMove(e) {\n        fireTouchEvent('touchmove', e);\n    }\n\n    function onTouchEnd(e) {\n        fireTouchEvent('touchend', e);\n    }\n\n    function onTouchCancel(e) {\n        fireTouchEvent('touchcancel', e);\n    }\n\n    function onTouchTimeout() {\n        tapped = null;\n    }\n\n    function onClick(e) {\n        var pos = DOM.mousePos(el, e);\n\n        if (pos.equals(startPos)) {\n            fireMouseEvent('click', e);\n        }\n    }\n\n    function onDblClick(e) {\n        fireMouseEvent('dblclick', e);\n        e.preventDefault();\n    }\n\n    function onContextMenu(e) {\n        contextMenuEvent = e;\n        e.preventDefault();\n    }\n\n    function fireMouseEvent(type, e) {\n        var pos = DOM.mousePos(el, e);\n\n        return map.fire(type, {\n            lngLat: map.unproject(pos),\n            point: pos,\n            originalEvent: e\n        });\n    }\n\n    function fireTouchEvent(type, e) {\n        var touches = DOM.touchPos(el, e);\n        var singular = touches.reduce(function(prev, curr, i, arr) {\n            return prev.add(curr.div(arr.length));\n        }, new Point(0, 0));\n\n        return map.fire(type, {\n            lngLat: map.unproject(singular),\n            point: singular,\n            lngLats: touches.map(function(t) { return map.unproject(t); }, this),\n            points: touches,\n            originalEvent: e\n        });\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/bind_handlers.js\n// module id = 1077\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    browser = require('../../util/browser'),\n    util = require('../../util/util');\n\nmodule.exports = ScrollZoomHandler;\n\n\nvar ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '',\n    firefox = ua.indexOf('firefox') !== -1,\n    safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n\n/**\n * The `ScrollZoomHandler` allows a user to zoom the map by scrolling.\n * @class ScrollZoomHandler\n */\nfunction ScrollZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nScrollZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"scroll to zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"scroll to zoom\" interaction.\n     * @example\n     *   map.scrollZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('wheel', this._onWheel, false);\n        this._el.addEventListener('mousewheel', this._onWheel, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"scroll to zoom\" interaction.\n     * @example\n     *   map.scrollZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('wheel', this._onWheel);\n        this._el.removeEventListener('mousewheel', this._onWheel);\n        this._enabled = false;\n    },\n\n    _onWheel: function (e) {\n        var value;\n\n        if (e.type === 'wheel') {\n            value = e.deltaY;\n            // Firefox doubles the values on retina screens...\n            if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n            if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n        } else if (e.type === 'mousewheel') {\n            value = -e.wheelDeltaY;\n            if (safari) value = value / 3;\n        }\n\n        var now = browser.now(),\n            timeDelta = now - (this._time || 0);\n\n        this._pos = DOM.mousePos(this._el, e);\n        this._time = now;\n\n        if (value !== 0 && (value % 4.000244140625) === 0) {\n            // This one is definitely a mouse wheel event.\n            this._type = 'wheel';\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / 4);\n\n        } else if (value !== 0 && Math.abs(value) < 4) {\n            // This one is definitely a trackpad event because it is so small.\n            this._type = 'trackpad';\n\n        } else if (timeDelta > 400) {\n            // This is likely a new scroll action.\n            this._type = null;\n            this._lastValue = value;\n\n            // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n            this._timeout = setTimeout(this._onTimeout, 40);\n\n        } else if (!this._type) {\n            // This is a repeating event, but we don't know the type of event just yet.\n            // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n            this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n            // Make sure our delayed event isn't fired again, because we accumulate\n            // the previous event (which was less than 40ms ago) into this event.\n            if (this._timeout) {\n                clearTimeout(this._timeout);\n                this._timeout = null;\n                value += this._lastValue;\n            }\n        }\n\n        // Slow down zoom if shift key is held for more precise zooming\n        if (e.shiftKey && value) value = value / 4;\n\n        // Only fire the callback if we actually know what type of scrolling device the user uses.\n        if (this._type) this._zoom(-value, e);\n\n        e.preventDefault();\n    },\n\n    _onTimeout: function () {\n        this._type = 'wheel';\n        this._zoom(-this._lastValue);\n    },\n\n    _zoom: function (delta, e) {\n        if (delta === 0) return;\n        var map = this._map;\n\n        // Scale by sigmoid of scroll wheel delta.\n        var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n        if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n        var fromScale = map.ease ? map.ease.to : map.transform.scale,\n            targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n        map.zoomTo(targetZoom, {\n            duration: 0,\n            around: map.unproject(this._pos),\n            delayEndEvents: 200\n        }, { originalEvent: e });\n    }\n};\n\n\n/**\n * Zoom start event. This event is emitted just before the map begins a transition from one\n * zoom level to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoomstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n/**\n * Zoom event. This event is emitted repeatedly during animated transitions from one zoom level to\n * another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoom\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n/**\n * Zoom end event. This event is emitted just after the map completes a transition from one\n * zoom level to another, either as a result of user interaction or the use of methods such as `Map#jumpTo`.\n *\n * @event zoomend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data, if fired interactively\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/scroll_zoom.js\n// module id = 1078\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    LngLatBounds = require('../../geo/lng_lat_bounds'),\n    util = require('../../util/util');\n\nmodule.exports = BoxZoomHandler;\n\n/**\n * The `BoxZoomHandler` allows a user to zoom the map to fit a bounding box.\n * The bounding box is defined by holding `shift` while dragging the cursor.\n * @class BoxZoomHandler\n */\nfunction BoxZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._container = map.getContainer();\n\n    util.bindHandlers(this);\n}\n\nBoxZoomHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"box zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"box zoom\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"box zoom\" interaction.\n     * @example\n     *   map.boxZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onMouseDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"box zoom\" interaction.\n     * @example\n     *   map.boxZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onMouseDown);\n        this._enabled = false;\n    },\n\n    _onMouseDown: function (e) {\n        if (!(e.shiftKey && e.button === 0)) return;\n\n        document.addEventListener('mousemove', this._onMouseMove, false);\n        document.addEventListener('keydown', this._onKeyDown, false);\n        document.addEventListener('mouseup', this._onMouseUp, false);\n\n        DOM.disableDrag();\n        this._startPos = DOM.mousePos(this._el, e);\n        this._active = true;\n    },\n\n    _onMouseMove: function (e) {\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e);\n\n        if (!this._box) {\n            this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n            this._container.classList.add('mapboxgl-crosshair');\n            this._fireEvent('boxzoomstart', e);\n        }\n\n        var minX = Math.min(p0.x, p1.x),\n            maxX = Math.max(p0.x, p1.x),\n            minY = Math.min(p0.y, p1.y),\n            maxY = Math.max(p0.y, p1.y);\n\n        DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)');\n\n        this._box.style.width = (maxX - minX) + 'px';\n        this._box.style.height = (maxY - minY) + 'px';\n    },\n\n    _onMouseUp: function (e) {\n        if (e.button !== 0) return;\n\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e),\n            bounds = new LngLatBounds(this._map.unproject(p0), this._map.unproject(p1));\n\n        this._finish();\n\n        if (p0.x === p1.x && p0.y === p1.y) {\n            this._fireEvent('boxzoomcancel', e);\n        } else {\n            this._map\n                .fitBounds(bounds, {linear: true})\n                .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds });\n        }\n    },\n\n    _onKeyDown: function (e) {\n        if (e.keyCode === 27) {\n            this._finish();\n            this._fireEvent('boxzoomcancel', e);\n        }\n    },\n\n    _finish: function () {\n        this._active = false;\n\n        document.removeEventListener('mousemove', this._onMouseMove, false);\n        document.removeEventListener('keydown', this._onKeyDown, false);\n        document.removeEventListener('mouseup', this._onMouseUp, false);\n\n        this._container.classList.remove('mapboxgl-crosshair');\n\n        if (this._box) {\n            this._box.parentNode.removeChild(this._box);\n            this._box = null;\n        }\n\n        DOM.enableDrag();\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    }\n};\n\n\n/**\n * Boxzoom start event. This event is emitted at the start of a box zoom interaction.\n *\n * @event boxzoomstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Boxzoom end event. This event is emitted at the end of a box zoom interaction\n *\n * @event boxzoomend\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {Event} originalEvent the original DOM event\n * @property {LngLatBounds} boxZoomBounds the bounds of the box zoom target\n */\n\n/**\n * Boxzoom cancel event.  This event is emitted when the user cancels a box zoom interaction,\n *   or when the box zoom does not meet the minimum size threshold.\n *\n * @event boxzoomcancel\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/box_zoom.js\n// module id = 1079\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    Point = require('point-geometry'),\n    util = require('../../util/util');\n\nmodule.exports = DragRotateHandler;\n\nvar inertiaLinearity = 0.25,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 180, // deg/s\n    inertiaDeceleration = 720; // deg/s^2\n\n\n/**\n * The `DragRotateHandler` allows a user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or the `ctrl` key.\n * @class DragRotateHandler\n */\nfunction DragRotateHandler(map, options) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._bearingSnap = options.bearingSnap;\n\n    util.bindHandlers(this);\n}\n\nDragRotateHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"drag to rotate\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"drag to rotate\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"drag to rotate\" interaction.\n     * @example\n     * map.dragRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"drag to rotate\" interaction.\n     * @example\n     * map.dragRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        document.addEventListener('mousemove', this._onMove);\n        document.addEventListener('mouseup', this._onUp);\n\n        this._active = false;\n        this._inertia = [[Date.now(), this._map.getBearing()]];\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._center = this._map.transform.centerPoint;  // Center of rotation\n\n        // If the first click was too close to the center, move the center of rotation by 200 pixels\n        // in the direction of the click.\n        var startToCenter = this._startPos.sub(this._center),\n            startToCenterDist = startToCenter.mag();\n\n        if (startToCenterDist < 200) {\n            this._center = this._startPos.add(new Point(-200, 0)._rotate(startToCenter.angle()));\n        }\n\n        e.preventDefault();\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('rotatestart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var map = this._map;\n        map.stop();\n\n        var p1 = this._pos,\n            p2 = DOM.mousePos(this._el, e),\n            center = this._center,\n            bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180,\n            bearing = map.getBearing() - bearingDiff,\n            inertia = this._inertia,\n            last = inertia[inertia.length - 1];\n\n        this._drainInertiaBuffer();\n        inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]);\n\n        map.transform.bearing = bearing;\n\n        this._fireEvent('rotate', e);\n        this._fireEvent('move', e);\n\n        this._pos = p2;\n    },\n\n    _onUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onUp);\n\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('rotateend', e);\n        this._drainInertiaBuffer();\n\n        var map = this._map,\n            mapBearing = map.getBearing(),\n            inertia = this._inertia;\n\n        var finish = function() {\n            if (Math.abs(mapBearing) < this._bearingSnap) {\n                map.resetNorth({noMoveStart: true}, { originalEvent: e });\n            } else {\n                this._fireEvent('moveend', e);\n            }\n        }.bind(this);\n\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var first = inertia[0],\n            last = inertia[inertia.length - 1],\n            previous = inertia[inertia.length - 2],\n            bearing = map._normalizeBearing(mapBearing, previous[1]),\n            flingDiff = last[1] - first[1],\n            sign = flingDiff < 0 ? -1 : 1,\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDiff === 0 || flingDuration === 0) {\n            finish();\n            return;\n        }\n\n        var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration));  // deg/s\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = sign * speed * (duration / 2);\n\n        bearing += offset;\n\n        if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) {\n            bearing = map._normalizeBearing(0, bearing);\n        }\n\n        map.rotateTo(bearing, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragPan && map.dragPan.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            var buttons = (e.ctrlKey ? 1 : 2),  // ? ctrl+left button : right button\n                button = (e.ctrlKey ? 0 : 2);   // ? ctrl+left button : right button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   //msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff)\n            inertia.shift();\n    }\n\n};\n\n\n/**\n * Rotate start event. This event is emitted at the start of a user-initiated rotate interaction.\n *\n * @event rotatestart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Rotate event. This event is emitted repeatedly during a user-initiated rotate interaction.\n *\n * @event rotate\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Rotate end event. This event is emitted at the end of a user-initiated rotate interaction.\n *\n * @event rotateend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/drag_rotate.js\n// module id = 1080\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    util = require('../../util/util');\n\nmodule.exports = DragPanHandler;\n\nvar inertiaLinearity = 0.3,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 1400, // px/s\n    inertiaDeceleration = 2500; // px/s^2\n\n\n/**\n * The `DragPanHandler` allows a user to pan the map by clicking and dragging\n * the cursor.\n * @class DragPanHandler\n */\nfunction DragPanHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nDragPanHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"drag to pan\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns true if the \"drag to pan\" interaction is currently active, i.e. currently being used.\n     * @returns {boolean} active state\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enable the \"drag to pan\" interaction.\n     * @example\n     * map.dragPan.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._el.addEventListener('touchstart', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"drag to pan\" interaction.\n     * @example\n     * map.dragPan.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._el.removeEventListener('touchstart', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        if (e.touches) {\n            document.addEventListener('touchmove', this._onMove);\n            document.addEventListener('touchend', this._onTouchEnd);\n        } else {\n            document.addEventListener('mousemove', this._onMove);\n            document.addEventListener('mouseup', this._onMouseUp);\n        }\n\n        this._active = false;\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._inertia = [[Date.now(), this._pos]];\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('dragstart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var pos = DOM.mousePos(this._el, e),\n            map = this._map;\n\n        map.stop();\n        this._drainInertiaBuffer();\n        this._inertia.push([Date.now(), pos]);\n\n        map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n\n        this._fireEvent('drag', e);\n        this._fireEvent('move', e);\n\n        this._pos = pos;\n\n        e.preventDefault();\n    },\n\n    _onUp: function (e) {\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('dragend', e);\n        this._drainInertiaBuffer();\n\n        var finish = function() {\n            this._fireEvent('moveend', e);\n        }.bind(this);\n\n        var inertia = this._inertia;\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            flingOffset = last[1].sub(first[1]),\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDuration === 0 || last[1].equals(first[1])) {\n            finish();\n            return;\n        }\n\n        // calculate px/s velocity & adjust for increased initial animation speed when easing out\n        var velocity = flingOffset.mult(inertiaLinearity / flingDuration),\n            speed = velocity.mag(); // px/s\n\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n            velocity._unit()._mult(speed);\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = velocity.mult(-duration / 2);\n\n        this._map.panBy(offset, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _onMouseUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onMouseUp);\n    },\n\n    _onTouchEnd: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onTouchEnd);\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragRotate && map.dragRotate.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            if (e.ctrlKey) return true;\n            var buttons = 1,  // left button\n                button = 0;   // left button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   // msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/**\n * Drag start event. This event is emitted at the start of a user-initiated pan interaction.\n *\n * @event dragstart\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Drag event. This event is emitted repeatedly during a user-initiated pan interaction.\n *\n * @event drag\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n/**\n * Drag end event. This event is emitted at the end of a user-initiated pan interaction.\n *\n * @event dragend\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/drag_pan.js\n// module id = 1081\n// module chunks = 0 1","'use strict';\n\nmodule.exports = KeyboardHandler;\n\n\nvar panDelta = 80,\n    rotateDelta = 2,\n    pitchDelta = 5;\n\n/**\n * The `KeyboardHandler` allows a user to zoom, rotate, and pan the map using\n * following keyboard shortcuts:\n *  * `=` / `+`: increase zoom level by 1\n *  * `Shift-=` / `Shift-+`: increase zoom level by 2\n *  * `-`: decrease zoom level by 1\n *  * `Shift--`: decrease zoom level by 2\n *  * Arrow keys: pan by 80 pixels\n *  * `Shift+⇢`: increase rotation by 2 degrees\n *  * `Shift+⇠`: decrease rotation by 2 degrees\n *  * `Shift+⇡`: increase pitch by 5 degrees\n *  * `Shift+⇣`: decrease pitch by 5 degrees\n * @class KeyboardHandler\n */\nfunction KeyboardHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    this._onKeyDown = this._onKeyDown.bind(this);\n}\n\nKeyboardHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of keyboard interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the ability to interact with the map using keyboard input.\n     * @example\n     * map.keyboard.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('keydown', this._onKeyDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the ability to interact with the map using keyboard input.\n     * @example\n     * map.keyboard.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('keydown', this._onKeyDown);\n        this._enabled = false;\n    },\n\n    _onKeyDown: function (e) {\n        if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n        var map = this._map,\n            eventData = { originalEvent: e };\n\n        if (map.isEasing()) return;\n\n        switch (e.keyCode) {\n        case 61:\n        case 107:\n        case 171:\n        case 187:\n            map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 189:\n        case 109:\n        case 173:\n            map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 37:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() - rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([-panDelta, 0], eventData);\n            }\n            break;\n\n        case 39:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() + rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([panDelta, 0], eventData);\n            }\n            break;\n\n        case 38:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: map.getPitch() + pitchDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, -panDelta], eventData);\n            }\n            break;\n\n        case 40:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: Math.max(map.getPitch() - pitchDelta, 0) }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, panDelta], eventData);\n            }\n            break;\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/keyboard.js\n// module id = 1082\n// module chunks = 0 1","'use strict';\n\nmodule.exports = DoubleClickZoomHandler;\n\n/**\n * The `DoubleClickZoomHandler` allows a user to zoom the map around point by\n * double clicking.\n * @class DoubleClickZoomHandler\n */\nfunction DoubleClickZoomHandler(map) {\n    this._map = map;\n    this._onDblClick = this._onDblClick.bind(this);\n}\n\nDoubleClickZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"double click to zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"double click to zoom\" interaction.\n     * @example\n     * map.doubleClickZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._map.on('dblclick', this._onDblClick);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"double click to zoom\" interaction.\n     * @example\n     * map.doubleClickZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._map.off('dblclick', this._onDblClick);\n        this._enabled = false;\n    },\n\n    _onDblClick: function (e) {\n        this._map.zoomTo(this._map.getZoom() +\n            (e.originalEvent.shiftKey ? -1 : 1), {around: e.lngLat});\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/dblclick_zoom.js\n// module id = 1083\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    util = require('../../util/util');\n\nmodule.exports = TouchZoomRotateHandler;\n\nvar inertiaLinearity = 0.15,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaDeceleration = 12, // scale / s^2\n    inertiaMaxSpeed = 2.5, // scale / s\n    significantScaleThreshold = 0.15,\n    significantRotateThreshold = 4;\n\n\n/**\n * The `TouchZoomRotateHandler` allows a user to zoom and rotate the map by\n * pinching on a touchscreen.\n * @class TouchZoomRotateHandler\n */\nfunction TouchZoomRotateHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nTouchZoomRotateHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns the current enabled/disabled state of the \"pinch to rotate and zoom\" interaction.\n     * @returns {boolean} enabled state\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enable the \"pinch to rotate and zoom\" interaction.\n     * @example\n     *   map.touchZoomRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('touchstart', this._onStart, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disable the \"pinch to rotate and zoom\" interaction.\n     * @example\n     *   map.touchZoomRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('touchstart', this._onStart);\n        this._enabled = false;\n    },\n\n    /**\n     * Disable the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n     * interaction enabled.\n     * @example\n     *   map.touchZoomRotate.disableRotation();\n     */\n    disableRotation: function() {\n        this._rotationDisabled = true;\n    },\n\n    /**\n     * Enable the \"pinch to rotate\" interaction, undoing a call to\n     * `disableRotation`.\n     * @example\n     *   map.touchZoomRotate.enable();\n     *   map.touchZoomRotate.enableRotation();\n     */\n    enableRotation: function() {\n        this._rotationDisabled = false;\n    },\n\n    _onStart: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]);\n\n        this._startVec = p0.sub(p1);\n        this._startScale = this._map.transform.scale;\n        this._startBearing = this._map.transform.bearing;\n        this._gestureIntent = undefined;\n        this._inertia = [];\n\n        document.addEventListener('touchmove', this._onMove, false);\n        document.addEventListener('touchend', this._onEnd, false);\n    },\n\n    _onMove: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]),\n            p = p0.add(p1).div(2),\n            vec = p0.sub(p1),\n            scale = vec.mag() / this._startVec.mag(),\n            bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI,\n            map = this._map;\n\n        // Determine 'intent' by whichever threshold is surpassed first,\n        // then keep that state for the duration of this gesture.\n        if (!this._gestureIntent) {\n            var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold),\n                rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold);\n\n            if (rotatingSignificantly) {\n                this._gestureIntent = 'rotate';\n            } else if (scalingSignificantly) {\n                this._gestureIntent = 'zoom';\n            }\n\n            if (this._gestureIntent) {\n                this._startVec = vec;\n                this._startScale = map.transform.scale;\n                this._startBearing = map.transform.bearing;\n            }\n\n        } else {\n            var param = { duration: 0, around: map.unproject(p) };\n\n            if (this._gestureIntent === 'rotate') {\n                param.bearing = this._startBearing + bearing;\n            }\n            if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') {\n                param.zoom = map.transform.scaleZoom(this._startScale * scale);\n            }\n\n            map.stop();\n            this._drainInertiaBuffer();\n            this._inertia.push([Date.now(), scale, p]);\n\n            map.easeTo(param, { originalEvent: e });\n        }\n\n        e.preventDefault();\n    },\n\n    _onEnd: function (e) {\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onEnd);\n        this._drainInertiaBuffer();\n\n        var inertia = this._inertia,\n            map = this._map;\n\n        if (inertia.length < 2) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            lastScale = map.transform.scaleZoom(this._startScale * last[1]),\n            firstScale = map.transform.scaleZoom(this._startScale * first[1]),\n            scaleOffset = lastScale - firstScale,\n            scaleDuration = (last[0] - first[0]) / 1000,\n            p = last[2];\n\n        if (scaleDuration === 0 || lastScale === firstScale) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        // calculate scale/s speed and adjust for increased initial animation speed when easing\n        var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s\n\n        if (Math.abs(speed) > inertiaMaxSpeed) {\n            if (speed > 0) {\n                speed = inertiaMaxSpeed;\n            } else {\n                speed = -inertiaMaxSpeed;\n            }\n        }\n\n        var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000,\n            targetScale = lastScale + speed * duration / 2000;\n\n        if (targetScale < 0) {\n            targetScale = 0;\n        }\n\n        map.easeTo({\n            zoom: targetScale,\n            duration: duration,\n            easing: inertiaEasing,\n            around: map.unproject(p)\n        }, { originalEvent: e });\n    },\n\n    _drainInertiaBuffer: function() {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160; // msec\n\n        while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/handler/touch_zoom_rotate.js\n// module id = 1084\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\nvar browser = require('../util/browser');\nvar LngLat = require('../geo/lng_lat');\nvar LngLatBounds = require('../geo/lng_lat_bounds');\nvar Point = require('point-geometry');\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo},\n * controlling the destination location, zoom level, bearing and pitch.\n * All properties are options; unspecified\n * options will default to the current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLat} center Map center\n * @property {number} zoom Map zoom level\n * @property {number} bearing Map rotation bearing in degrees counter-clockwise from north\n * @property {number} pitch Map angle in degrees at which the camera is looking at the ground\n * @property {LngLat} around If zooming, the zoom center (defaults to map center)\n */\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration of the animation and easing function. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration Number in milliseconds\n * @property {Function} easing\n * @property {Array} offset point, origin of movement relative to map center\n * @property {boolean} animate When set to false, no animation happens\n */\n\nvar Camera = module.exports = function() {};\n\nutil.extend(Camera.prototype, /** @lends Map.prototype */{\n    /**\n     * Get the current view geographical point.\n     * @returns {LngLat}\n     */\n    getCenter: function() { return this.transform.center; },\n\n    /**\n     * Sets a map location. Equivalent to `jumpTo({center: center})`.\n     *\n     * @param {LngLat} center Map center to jump to\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * map.setCenter([-74, 38]);\n     */\n    setCenter: function(center, eventData) {\n        this.jumpTo({center: center}, eventData);\n        return this;\n    },\n\n    /**\n     * Pan by a certain number of pixels\n     *\n     * @param {Array<number>} offset [x, y]\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panBy: function(offset, options, eventData) {\n        this.panTo(this.transform.center,\n            util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Pan to a certain location with easing\n     *\n     * @param {LngLat} lnglat Location to pan to\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panTo: function(lnglat, options, eventData) {\n        return this.easeTo(util.extend({\n            center: lnglat\n        }, options), eventData);\n    },\n\n\n    /**\n     * Get the current zoom\n     * @returns {number}\n     */\n    getZoom: function() { return this.transform.zoom; },\n\n    /**\n     * Sets a map zoom. Equivalent to `jumpTo({zoom: zoom})`.\n     *\n     * @param {number} zoom Map zoom level\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     * @example\n     * // zoom the map to 5\n     * map.setZoom(5);\n     */\n    setZoom: function(zoom, eventData) {\n        this.jumpTo({zoom: zoom}, eventData);\n        return this;\n    },\n\n    /**\n     * Zooms to a certain zoom level with easing.\n     *\n     * @param {number} zoom\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomTo: function(zoom, options, eventData) {\n        return this.easeTo(util.extend({\n            zoom: zoom\n        }, options), eventData);\n    },\n\n    /**\n     * Zoom in by 1 level\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomIn: function(options, eventData) {\n        this.zoomTo(this.getZoom() + 1, options, eventData);\n        return this;\n    },\n\n    /**\n     * Zoom out by 1 level\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomOut: function(options, eventData) {\n        this.zoomTo(this.getZoom() - 1, options, eventData);\n        return this;\n    },\n\n\n    /**\n     * Get the current bearing in degrees\n     * @returns {number}\n     */\n    getBearing: function() { return this.transform.bearing; },\n\n    /**\n     * Sets a map rotation. Equivalent to `jumpTo({bearing: bearing})`.\n     *\n     * @param {number} bearing Map rotation bearing in degrees counter-clockwise from north\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // rotate the map to 90 degrees\n     * map.setBearing(90);\n     */\n    setBearing: function(bearing, eventData) {\n        this.jumpTo({bearing: bearing}, eventData);\n        return this;\n    },\n\n    /**\n     * Rotate bearing by a certain number of degrees with easing\n     *\n     * @param {number} bearing\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    rotateTo: function(bearing, options, eventData) {\n        return this.easeTo(util.extend({\n            bearing: bearing\n        }, options), eventData);\n    },\n\n    /**\n     * Sets map bearing to 0 (north) with easing\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    resetNorth: function(options, eventData) {\n        this.rotateTo(0, util.extend({duration: 1000}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Animates map bearing to 0 (north) if it's already close to it.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    snapToNorth: function(options, eventData) {\n        if (Math.abs(this.getBearing()) < this.options.bearingSnap) {\n            return this.resetNorth(options, eventData);\n        }\n        return this;\n    },\n\n    /**\n     * Get the current angle in degrees\n     * @returns {number}\n     */\n    getPitch: function() { return this.transform.pitch; },\n\n    /**\n     * Sets a map angle. Equivalent to `jumpTo({pitch: pitch})`.\n     *\n     * @param {number} pitch The angle at which the camera is looking at the ground\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    setPitch: function(pitch, eventData) {\n        this.jumpTo({pitch: pitch}, eventData);\n        return this;\n    },\n\n\n    /**\n     * Zoom to contain certain geographical bounds\n     *\n     * @param {LngLatBounds|Array<Array<number>>} bounds [[minLng, minLat], [maxLng, maxLat]]\n     * @param {Object} options\n     * @param {boolean} [options.linear] When true, the map transitions to the new camera using\n     *     {@link Map#easeTo}. When false, the map transitions using {@link Map#flyTo}. See\n     *     {@link Map#flyTo} for information on options specific to that animation transition.\n     * @param {Function} options.easing\n     * @param {number} options.padding how much padding there is around the given bounds on each side in pixels\n     * @param {number} options.maxZoom The resulting zoom level will be at most\n     *     this value.\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    fitBounds: function(bounds, options, eventData) {\n\n        options = util.extend({\n            padding: 0,\n            offset: [0, 0],\n            maxZoom: Infinity\n        }, options);\n\n        bounds = LngLatBounds.convert(bounds);\n\n        var offset = Point.convert(options.offset),\n            tr = this.transform,\n            nw = tr.project(bounds.getNorthWest()),\n            se = tr.project(bounds.getSouthEast()),\n            size = se.sub(nw),\n            scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x,\n            scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n        options.center = tr.unproject(nw.add(se).div(2));\n        options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n        options.bearing = 0;\n\n        return options.linear ?\n            this.easeTo(options, eventData) :\n            this.flyTo(options, eventData);\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, without\n     * a transition. The map will retain the current values for any options\n     * not included in `options`.\n     *\n     * @param {CameraOptions} options map view options\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    jumpTo: function(options, eventData) {\n        this.stop();\n\n        var tr = this.transform,\n            zoomChanged = false,\n            bearingChanged = false,\n            pitchChanged = false;\n\n        if ('zoom' in options && tr.zoom !== +options.zoom) {\n            zoomChanged = true;\n            tr.zoom = +options.zoom;\n        }\n\n        if ('center' in options) {\n            tr.center = LngLat.convert(options.center);\n        }\n\n        if ('bearing' in options && tr.bearing !== +options.bearing) {\n            bearingChanged = true;\n            tr.bearing = +options.bearing;\n        }\n\n        if ('pitch' in options && tr.pitch !== +options.pitch) {\n            pitchChanged = true;\n            tr.pitch = +options.pitch;\n        }\n\n        this.fire('movestart', eventData)\n            .fire('move', eventData);\n\n        if (zoomChanged) {\n            this.fire('zoomstart', eventData)\n                .fire('zoom', eventData)\n                .fire('zoomend', eventData);\n        }\n\n        if (bearingChanged) {\n            this.fire('rotate', eventData);\n        }\n\n        if (pitchChanged) {\n            this.fire('pitch', eventData);\n        }\n\n        return this.fire('moveend', eventData);\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, with a smooth animation\n     * between old and new values. The map will retain the current values for any options\n     * not included in `options`.\n     *\n     * @param {CameraOptions|AnimationOptions} options map view and animation options\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    easeTo: function(options, eventData) {\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            duration: 500,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n\n            zoom = 'zoom' in options ? +options.zoom : startZoom,\n            bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n            pitch = 'pitch' in options ? +options.pitch : startPitch,\n\n            toLngLat,\n            toPoint;\n\n        if ('center' in options) {\n            toLngLat = LngLat.convert(options.center);\n            toPoint = tr.centerPoint.add(offset);\n        } else if ('around' in options) {\n            toLngLat = LngLat.convert(options.around);\n            toPoint = tr.locationPoint(toLngLat);\n        } else {\n            toPoint = tr.centerPoint.add(offset);\n            toLngLat = tr.pointLocation(toPoint);\n        }\n\n        var fromPoint = tr.locationPoint(toLngLat);\n\n        if (options.animate === false) options.duration = 0;\n\n        this.zooming = (zoom !== startZoom);\n        this.rotating = (startBearing !== bearing);\n        this.pitching = (pitch !== startPitch);\n\n        if (!options.noMoveStart) {\n            this.fire('movestart', eventData);\n        }\n        if (this.zooming) {\n            this.fire('zoomstart', eventData);\n        }\n\n        clearTimeout(this._onEaseEnd);\n\n        this._ease(function (k) {\n            if (this.zooming) {\n                tr.zoom = interpolate(startZoom, zoom, k);\n            }\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k)));\n\n            this.fire('move', eventData);\n            if (this.zooming) {\n                this.fire('zoom', eventData);\n            }\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            if (options.delayEndEvents) {\n                this._onEaseEnd = setTimeout(this._easeToEnd.bind(this, eventData), options.delayEndEvents);\n            } else {\n                this._easeToEnd(eventData);\n            }\n        }.bind(this), options);\n\n        return this;\n    },\n\n    _easeToEnd: function(eventData) {\n        if (this.zooming) {\n            this.fire('zoomend', eventData);\n        }\n        this.fire('moveend', eventData);\n\n        this.zooming = false;\n        this.rotating = false;\n        this.pitching = false;\n    },\n\n    /**\n     * Change any combination of center, zoom, bearing, and pitch, animated along a curve that\n     * evokes flight. The transition animation seamlessly incorporates zooming and panning to help\n     * the user find his or her bearings even after traversing a great distance.\n     *\n     * @param {CameraOptions|AnimationOptions} options map view and animation options\n     * @param {number} [options.curve=1.42] Relative amount of zooming that takes place along the\n     *     flight path. A high value maximizes zooming for an exaggerated animation, while a low\n     *     value minimizes zooming for something closer to {@link Map#easeTo}. 1.42 is the average\n     *     value selected by participants in the user study in\n     *     [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n     *     `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n     *     value of 1 would produce a circular motion.\n     * @param {number} [options.minZoom] Zero-based zoom level at the peak of the flight path. If\n     *     `options.curve` is specified, this option is ignored.\n     * @param {number} [options.speed=1.2] Average speed of the animation. A speed of 1.2 means that\n     *     the map appears to move along the flight path by 1.2 times `options.curve` screenfuls every\n     *     second. A _screenful_ is the visible span in pixels. It does not correspond to a fixed\n     *     physical distance but rather varies by zoom level.\n     * @param {number} [options.screenSpeed] Average speed of the animation, measured in screenfuls\n     *     per second, assuming a linear timing curve. If `options.speed` is specified, this option\n     *     is ignored.\n     * @param {Function} [options.easing] Transition timing curve\n     * @param {EventData} [eventData] Data to propagate to any event receivers\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {this}\n     * @example\n     * // fly with default options to null island\n     * map.flyTo({center: [0, 0], zoom: 9});\n     * // using flyTo options\n     * map.flyTo({\n     *   center: [0, 0],\n     *   zoom: 9,\n     *   speed: 0.2,\n     *   curve: 1,\n     *   easing: function(t) {\n     *     return t;\n     *   }\n     * });\n     */\n    flyTo: function(options, eventData) {\n        // This method implements an “optimal path” animation, as detailed in:\n        //\n        // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n        //   ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.\n        //\n        // Where applicable, local variable documentation begins with the associated variable or\n        // function in van Wijk (2003).\n\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            speed: 1.2,\n            curve: 1.42,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch();\n\n        var center = 'center' in options ? LngLat.convert(options.center) : this.getCenter();\n        var zoom = 'zoom' in options ?  +options.zoom : startZoom;\n        var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n        var pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n        // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n        // interpolating between the two endpoints will cross it.\n        if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) {\n            if (tr.center.lng > 0 && center.lng < 0) {\n                center.lng += 360;\n            } else if (tr.center.lng < 0 && center.lng > 0) {\n                center.lng -= 360;\n            }\n        }\n\n        var scale = tr.zoomScale(zoom - startZoom),\n            from = tr.point,\n            to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from;\n\n        var startWorldSize = tr.worldSize,\n            rho = options.curve,\n\n            // w₀: Initial visible span, measured in pixels at the initial scale.\n            w0 = Math.max(tr.width, tr.height),\n            // w₁: Final visible span, measured in pixels with respect to the initial scale.\n            w1 = w0 / scale,\n            // Length of the flight path as projected onto the ground plane, measured in pixels from\n            // the world image origin at the initial scale.\n            u1 = to.sub(from).mag();\n\n        if ('minZoom' in options) {\n            var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n            // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial\n            // scale.\n            var wMax = w0 / tr.zoomScale(minZoom - startZoom);\n            rho = Math.sqrt(wMax / u1 * 2);\n        }\n\n        // ρ²\n        var rho2 = rho * rho;\n\n        /**\n         * rᵢ: Returns the zoom-out factor at one end of the animation.\n         *\n         * @param i 0 for the ascent or 1 for the descent.\n         * @private\n         */\n        function r(i) {\n            var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n            return Math.log(Math.sqrt(b * b + 1) - b);\n        }\n\n        function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n        function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n        function tanh(n) { return sinh(n) / cosh(n); }\n\n        // r₀: Zoom-out factor during ascent.\n        var r0 = r(0),\n            /**\n             * w(s): Returns the visible span on the ground, measured in pixels with respect to the\n             * initial scale.\n             *\n             * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n             * @private\n             */\n            w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n            /**\n             * u(s): Returns the distance along the flight path as projected onto the ground plane,\n             * measured in pixels from the world image origin at the initial scale.\n             * @private\n             */\n            u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n            // S: Total length of the flight path, measured in ρ-screenfuls.\n            S = (r(1) - r0) / rho;\n\n        // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n        if (Math.abs(u1) < 0.000001) {\n            // Perform a more or less instantaneous transition if the path is too short.\n            if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options);\n\n            var k = w1 < w0 ? -1 : 1;\n            S = Math.abs(Math.log(w1 / w0)) / rho;\n\n            u = function() { return 0; };\n            w = function(s) { return Math.exp(k * rho * s); };\n        }\n\n        if ('duration' in options) {\n            options.duration = +options.duration;\n        } else {\n            var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n            options.duration = 1000 * S / V;\n        }\n\n        this.zooming = true;\n        if (startBearing !== bearing) this.rotating = true;\n        if (startPitch !== pitch) this.pitching = true;\n\n        this.fire('movestart', eventData);\n        this.fire('zoomstart', eventData);\n\n        this._ease(function (k) {\n            // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n            var s = k * S,\n                us = u(s);\n\n            tr.zoom = startZoom + tr.scaleZoom(1 / w(s));\n            tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize);\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            this.fire('move', eventData);\n            this.fire('zoom', eventData);\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            this.fire('zoomend', eventData);\n            this.fire('moveend', eventData);\n            this.zooming = false;\n            this.rotating = false;\n            this.pitching = false;\n        }, options);\n\n        return this;\n    },\n\n    isEasing: function() {\n        return !!this._abortFn;\n    },\n\n    /**\n     * Stop current animation\n     *\n     * @returns {Map} `this`\n     */\n    stop: function() {\n        if (this._abortFn) {\n            this._abortFn();\n            this._finishEase();\n        }\n        return this;\n    },\n\n    _ease: function(frame, finish, options) {\n        this._finishFn = finish;\n        this._abortFn = browser.timed(function (t) {\n            frame.call(this, options.easing(t));\n            if (t === 1) {\n                this._finishEase();\n            }\n        }, options.animate === false ? 0 : options.duration, this);\n    },\n\n    _finishEase: function() {\n        delete this._abortFn;\n        // The finish function might emit events which trigger new eases, which\n        // set a new _finishFn. Ensure we don't delete it unintentionally.\n        var finish = this._finishFn;\n        delete this._finishFn;\n        finish.call(this);\n    },\n\n    // convert bearing so that it's numerically close to the current one so that it interpolates properly\n    _normalizeBearing: function(bearing, currentBearing) {\n        bearing = util.wrap(bearing, -180, 180);\n        var diff = Math.abs(bearing - currentBearing);\n        if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n        if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n        return bearing;\n    },\n\n    _updateEasing: function(duration, zoom, bezier) {\n        var easing;\n\n        if (this.ease) {\n            var ease = this.ease,\n                t = (Date.now() - ease.start) / ease.duration,\n                speed = ease.easing(t + 0.01) - ease.easing(t),\n\n                // Quick hack to make new bezier that is continuous with last\n                x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n                y = Math.sqrt(0.27 * 0.27 - x * x);\n\n            easing = util.bezier(x, y, 0.25, 1);\n        } else {\n            easing = bezier ? util.bezier.apply(util, bezier) : util.ease;\n        }\n\n        // store information on current easing\n        this.ease = {\n            start: (new Date()).getTime(),\n            to: Math.pow(2, zoom),\n            duration: duration,\n            easing: easing\n        };\n\n        return easing;\n    }\n});\n\n/**\n * Pitch event. This event is emitted whenever the map's pitch changes.\n *\n * @event pitch\n * @memberof Map\n * @instance\n * @property {EventData} data Original event data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/camera.js\n// module id = 1085\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Navigation;\n\n/**\n * Creates a navigation control with zoom buttons and a compass\n * @class Navigation\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * map.addControl(new mapboxgl.Navigation({position: 'top-left'})); // position is optional\n */\nfunction Navigation(options) {\n    util.setOptions(this, options);\n}\n\nNavigation.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map));\n        this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map));\n        this._compass = this._createButton(className + '-icon ' + className + '-compass', map.resetNorth.bind(map));\n\n        this._compassArrow = DOM.create('div', 'arrow', this._compass);\n\n        this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n        this._onCompassMove = this._onCompassMove.bind(this);\n        this._onCompassUp = this._onCompassUp.bind(this);\n\n        map.on('rotate', this._rotateCompassArrow.bind(this));\n        this._rotateCompassArrow();\n\n        this._el = map.getCanvasContainer();\n\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onCompassDown: function(e) {\n        if (e.button !== 0) return;\n\n        DOM.disableDrag();\n        document.addEventListener('mousemove', this._onCompassMove);\n        document.addEventListener('mouseup', this._onCompassUp);\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassMove: function(e) {\n        if (e.button !== 0) return;\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassUp: function(e) {\n        if (e.button !== 0) return;\n\n        document.removeEventListener('mousemove', this._onCompassMove);\n        document.removeEventListener('mouseup', this._onCompassUp);\n        DOM.enableDrag();\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _createButton: function(className, fn) {\n        var a = DOM.create('button', className, this._container);\n        a.addEventListener('click', function() { fn(); });\n        return a;\n    },\n\n    _rotateCompassArrow: function() {\n        var rotate = 'rotate(' + (this._map.transform.angle * (180 / Math.PI)) + 'deg)';\n        this._compassArrow.style.transform = rotate;\n    }\n});\n\n\nfunction copyMouseEvent(e) {\n    return new MouseEvent(e.type, {\n        button: 2,    // right click\n        buttons: 2,   // right click\n        bubbles: true,\n        cancelable: true,\n        detail: e.detail,\n        view: e.view,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        movementX: e.movementX,\n        movementY: e.movementY,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey\n    });\n}\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/navigation.js\n// module id = 1086\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar browser = require('../../util/browser');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Geolocate;\n\nvar geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };\n\n\n/**\n * Creates a geolocation control\n * @class Geolocate\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * map.addControl(new mapboxgl.Geolocate({position: 'top-left'})); // position is optional\n */\nfunction Geolocate(options) {\n    util.setOptions(this, options);\n}\n\nGeolocate.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        if (!browser.supportsGeolocation) return container;\n\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._geolocateButton = DOM.create('button', (className + '-icon ' + className + '-geolocate'), this._container);\n        this._geolocateButton.addEventListener('click', this._onClickGeolocate.bind(this));\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onClickGeolocate: function() {\n        navigator.geolocation.getCurrentPosition(this._success.bind(this), this._error.bind(this), geoOptions);\n\n        // This timeout ensures that we still call finish() even if\n        // the user declines to share their location in Firefox\n        this._timeoutId = setTimeout(this._finish.bind(this), 10000 /* 10sec */);\n    },\n\n    _success: function(position) {\n        this._map.jumpTo({\n            center: [position.coords.longitude, position.coords.latitude],\n            zoom: 17,\n            bearing: 0,\n            pitch: 0\n        });\n\n        this.fire('geolocate', position);\n        this._finish();\n    },\n\n    _error: function(error) {\n        this.fire('error', error);\n        this._finish();\n    },\n\n    _finish: function() {\n        if (this._timeoutId) { clearTimeout(this._timeoutId); }\n        this._timeoutId = undefined;\n    }\n\n});\n\n /**\n  * geolocate event.\n  *\n  * @event geolocate\n  * @memberof Control\n  * @instance\n  * @property {EventData} data The returned Position object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition)\n  *\n  */\n\n /**\n  * error event.\n  *\n  * @event error\n  * @memberof Control\n  * @instance\n  * @property {EventData} data The returned PositionError object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition)\n  *\n  */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/control/geolocate.js\n// module id = 1087\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Popup;\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\nvar LngLat = require('../geo/lng_lat');\n\n/**\n * Creates a popup component\n * @class Popup\n * @param {Object} options\n * @param {boolean} options.closeButton whether to show a close button in the\n * top right corner of the popup.\n * @param {boolean} options.closeOnClick whether to close the popup when the\n * map is clicked.\n * @param {string} options.anchor - One of \"top\", \"bottom\", \"left\", \"right\", \"top-left\",\n * \"top-right\", \"bottom-left\", or \"bottom-right\", describing where the popup's anchor\n * relative to the coordinate set via `setLngLat`.\n * @example\n * var tooltip = new mapboxgl.Popup()\n *   .setLngLat(e.lngLat)\n *   .setHTML(\"<h1>Hello World!</h1>\")\n *   .addTo(map);\n */\nfunction Popup(options) {\n    util.setOptions(this, options);\n    util.bindAll([\n        '_update',\n        '_onClickClose'],\n        this);\n}\n\nPopup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{\n    options: {\n        closeButton: true,\n        closeOnClick: true\n    },\n\n    /**\n     * Attaches the popup to a map\n     * @param {Map} map\n     * @returns {Popup} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        this._map.on('move', this._update);\n        if (this.options.closeOnClick) {\n            this._map.on('click', this._onClickClose);\n        }\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the popup from a map\n     * @example\n     * var popup = new mapboxgl.Popup().addTo(map);\n     * popup.remove();\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        if (this._container) {\n            this._container.parentNode.removeChild(this._container);\n            delete this._container;\n        }\n\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map.off('click', this._onClickClose);\n            delete this._map;\n        }\n\n        return this;\n    },\n\n    /**\n     * Get the popup's geographical location\n     * @returns {LngLat}\n     */\n    getLngLat: function() {\n        return this._lngLat;\n    },\n\n    /**\n     * Set the popup's geographical position and move it.\n     * @param {LngLat} lnglat\n     * @returns {Popup} `this`\n     */\n    setLngLat: function(lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Fill a popup element with text only content. This creates a text node\n     * in the DOM, so it cannot end up appending raw HTML. Use this method\n     * if you want an added level of security against XSS if the popup\n     * content is user-provided.\n     * @param {string} text\n     * @returns {Popup} `this`\n     * @example\n     * var tooltip = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setText('Hello, world!')\n     *   .addTo(map);\n     */\n    setText: function(text) {\n        return this.setDOMContent(document.createTextNode(text));\n    },\n\n    /**\n     * Fill a popup element with HTML content, provided as a string.\n     * @param {string} html\n     * @returns {Popup} `this`\n     */\n    setHTML: function(html) {\n        var frag = document.createDocumentFragment();\n        var temp = document.createElement('body'), child;\n        temp.innerHTML = html;\n        while (true) {\n            child = temp.firstChild;\n            if (!child) break;\n            frag.appendChild(child);\n        }\n\n        return this.setDOMContent(frag);\n    },\n\n    /**\n     * Fill a popup element with DOM content\n     * @param {Node} htmlNode Popup content as a DOM node\n     * @returns {Popup} `this`\n     * @example\n     * // create an element with the popup content\n     * var div = document.createElement('div');\n     * div.innerHTML = 'Hello, world!';\n     * var tooltip = new mapboxgl.Popup()\n     *   .setLngLat(e.lngLat)\n     *   .setDOMContent(div)\n     *   .addTo(map);\n     */\n    setDOMContent: function(htmlNode) {\n        this._createContent();\n        this._content.appendChild(htmlNode);\n        this._update();\n        return this;\n    },\n\n    _createContent: function() {\n        if (this._content && this._content.parentNode) {\n            this._content.parentNode.removeChild(this._content);\n        }\n\n        this._content = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n        if (this.options.closeButton) {\n            this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content);\n            this._closeButton.innerHTML = '&#215;';\n            this._closeButton.addEventListener('click', this._onClickClose);\n        }\n    },\n\n    _update: function() {\n        if (!this._map || !this._lngLat || !this._content) { return; }\n\n        if (!this._container) {\n            this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n            this._tip       = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n            this._container.appendChild(this._content);\n        }\n\n        var pos = this._map.project(this._lngLat).round(),\n            anchor = this.options.anchor;\n\n        if (!anchor) {\n            var width = this._container.offsetWidth,\n                height = this._container.offsetHeight;\n\n            if (pos.y < height) {\n                anchor = ['top'];\n            } else if (pos.y > this._map.transform.height - height) {\n                anchor = ['bottom'];\n            } else {\n                anchor = [];\n            }\n\n            if (pos.x < width / 2) {\n                anchor.push('left');\n            } else if (pos.x > this._map.transform.width - width / 2) {\n                anchor.push('right');\n            }\n\n            if (anchor.length === 0) {\n                anchor = 'bottom';\n            } else {\n                anchor = anchor.join('-');\n            }\n        }\n\n        var anchorTranslate = {\n            'top': 'translate(-50%,0)',\n            'top-left': 'translate(0,0)',\n            'top-right': 'translate(-100%,0)',\n            'bottom': 'translate(-50%,-100%)',\n            'bottom-left': 'translate(0,-100%)',\n            'bottom-right': 'translate(-100%,-100%)',\n            'left': 'translate(0,-50%)',\n            'right': 'translate(-100%,-50%)'\n        };\n\n        var classList = this._container.classList;\n        for (var key in anchorTranslate) {\n            classList.remove('mapboxgl-popup-anchor-' + key);\n        }\n        classList.add('mapboxgl-popup-anchor-' + anchor);\n\n        DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + pos.x + 'px,' + pos.y + 'px)');\n    },\n\n    _onClickClose: function() {\n        this.remove();\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/node_modules/mapbox-gl/js/ui/popup.js\n// module id = 1088\n// module chunks = 0 1","/*!\n * Bowser - a browser detector\n * https://github.com/ded/bowser\n * MIT License | (c) Dustin Diaz 2015\n */\n\n!function (root, name, definition) {\n  if (typeof module != 'undefined' && module.exports) module.exports = definition()\n  else if (typeof define == 'function' && define.amd) define(name, definition)\n  else root[name] = definition()\n}(this, 'bowser', function () {\n  /**\n    * See useragents.js for examples of navigator.userAgent\n    */\n\n  var t = true\n\n  function detect(ua) {\n\n    function getFirstMatch(regex) {\n      var match = ua.match(regex);\n      return (match && match.length > 1 && match[1]) || '';\n    }\n\n    function getSecondMatch(regex) {\n      var match = ua.match(regex);\n      return (match && match.length > 1 && match[2]) || '';\n    }\n\n    var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()\n      , likeAndroid = /like android/i.test(ua)\n      , android = !likeAndroid && /android/i.test(ua)\n      , nexusMobile = /nexus\\s*[0-6]\\s*/i.test(ua)\n      , nexusTablet = !nexusMobile && /nexus\\s*[0-9]+/i.test(ua)\n      , chromeos = /CrOS/.test(ua)\n      , silk = /silk/i.test(ua)\n      , sailfish = /sailfish/i.test(ua)\n      , tizen = /tizen/i.test(ua)\n      , webos = /(web|hpw)(o|0)s/i.test(ua)\n      , windowsphone = /windows phone/i.test(ua)\n      , samsungBrowser = /SamsungBrowser/i.test(ua)\n      , windows = !windowsphone && /windows/i.test(ua)\n      , mac = !iosdevice && !silk && /macintosh/i.test(ua)\n      , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)\n      , edgeVersion = getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.\\d+)?)/i)\n      , versionIdentifier = getFirstMatch(/version\\/(\\d+(\\.\\d+)?)/i)\n      , tablet = /tablet/i.test(ua) && !/tablet pc/i.test(ua)\n      , mobile = !tablet && /[^-]mobi/i.test(ua)\n      , xbox = /xbox/i.test(ua)\n      , result\n\n    if (/opera/i.test(ua)) {\n      //  an old Opera\n      result = {\n        name: 'Opera'\n      , opera: t\n      , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    } else if (/opr\\/|opios/i.test(ua)) {\n      // a new Opera\n      result = {\n        name: 'Opera'\n        , opera: t\n        , version: getFirstMatch(/(?:opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (/SamsungBrowser/i.test(ua)) {\n      result = {\n        name: 'Samsung Internet for Android'\n        , samsungBrowser: t\n        , version: versionIdentifier || getFirstMatch(/(?:SamsungBrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/Whale/i.test(ua)) {\n      result = {\n        name: 'NAVER Whale browser'\n        , whale: t\n        , version: getFirstMatch(/(?:whale)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/MZBrowser/i.test(ua)) {\n      result = {\n        name: 'MZ Browser'\n        , mzbrowser: t\n        , version: getFirstMatch(/(?:MZBrowser)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/coast/i.test(ua)) {\n      result = {\n        name: 'Opera Coast'\n        , coast: t\n        , version: versionIdentifier || getFirstMatch(/(?:coast)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/focus/i.test(ua)) {\n      result = {\n        name: 'Focus'\n        , focus: t\n        , version: getFirstMatch(/(?:focus)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/yabrowser/i.test(ua)) {\n      result = {\n        name: 'Yandex Browser'\n      , yandexbrowser: t\n      , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/ucbrowser/i.test(ua)) {\n      result = {\n          name: 'UC Browser'\n        , ucbrowser: t\n        , version: getFirstMatch(/(?:ucbrowser)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/mxios/i.test(ua)) {\n      result = {\n        name: 'Maxthon'\n        , maxthon: t\n        , version: getFirstMatch(/(?:mxios)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/epiphany/i.test(ua)) {\n      result = {\n        name: 'Epiphany'\n        , epiphany: t\n        , version: getFirstMatch(/(?:epiphany)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/puffin/i.test(ua)) {\n      result = {\n        name: 'Puffin'\n        , puffin: t\n        , version: getFirstMatch(/(?:puffin)[\\s\\/](\\d+(?:\\.\\d+)?)/i)\n      }\n    }\n    else if (/sleipnir/i.test(ua)) {\n      result = {\n        name: 'Sleipnir'\n        , sleipnir: t\n        , version: getFirstMatch(/(?:sleipnir)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (/k-meleon/i.test(ua)) {\n      result = {\n        name: 'K-Meleon'\n        , kMeleon: t\n        , version: getFirstMatch(/(?:k-meleon)[\\s\\/](\\d+(?:\\.\\d+)+)/i)\n      }\n    }\n    else if (windowsphone) {\n      result = {\n        name: 'Windows Phone'\n      , osname: 'Windows Phone'\n      , windowsphone: t\n      }\n      if (edgeVersion) {\n        result.msedge = t\n        result.version = edgeVersion\n      }\n      else {\n        result.msie = t\n        result.version = getFirstMatch(/iemobile\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/msie|trident/i.test(ua)) {\n      result = {\n        name: 'Internet Explorer'\n      , msie: t\n      , version: getFirstMatch(/(?:msie |rv:)(\\d+(\\.\\d+)?)/i)\n      }\n    } else if (chromeos) {\n      result = {\n        name: 'Chrome'\n      , osname: 'Chrome OS'\n      , chromeos: t\n      , chromeBook: t\n      , chrome: t\n      , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n      }\n    } else if (/edg([ea]|ios)/i.test(ua)) {\n      result = {\n        name: 'Microsoft Edge'\n      , msedge: t\n      , version: edgeVersion\n      }\n    }\n    else if (/vivaldi/i.test(ua)) {\n      result = {\n        name: 'Vivaldi'\n        , vivaldi: t\n        , version: getFirstMatch(/vivaldi\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (sailfish) {\n      result = {\n        name: 'Sailfish'\n      , osname: 'Sailfish OS'\n      , sailfish: t\n      , version: getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/seamonkey\\//i.test(ua)) {\n      result = {\n        name: 'SeaMonkey'\n      , seamonkey: t\n      , version: getFirstMatch(/seamonkey\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/firefox|iceweasel|fxios/i.test(ua)) {\n      result = {\n        name: 'Firefox'\n      , firefox: t\n      , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \\/](\\d+(\\.\\d+)?)/i)\n      }\n      if (/\\((mobile|tablet);[^\\)]*rv:[\\d\\.]+\\)/i.test(ua)) {\n        result.firefoxos = t\n        result.osname = 'Firefox OS'\n      }\n    }\n    else if (silk) {\n      result =  {\n        name: 'Amazon Silk'\n      , silk: t\n      , version : getFirstMatch(/silk\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/phantom/i.test(ua)) {\n      result = {\n        name: 'PhantomJS'\n      , phantom: t\n      , version: getFirstMatch(/phantomjs\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/slimerjs/i.test(ua)) {\n      result = {\n        name: 'SlimerJS'\n        , slimer: t\n        , version: getFirstMatch(/slimerjs\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (/blackberry|\\bbb\\d+/i.test(ua) || /rim\\stablet/i.test(ua)) {\n      result = {\n        name: 'BlackBerry'\n      , osname: 'BlackBerry OS'\n      , blackberry: t\n      , version: versionIdentifier || getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (webos) {\n      result = {\n        name: 'WebOS'\n      , osname: 'WebOS'\n      , webos: t\n      , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\\/(\\d+(\\.\\d+)?)/i)\n      };\n      /touchpad\\//i.test(ua) && (result.touchpad = t)\n    }\n    else if (/bada/i.test(ua)) {\n      result = {\n        name: 'Bada'\n      , osname: 'Bada'\n      , bada: t\n      , version: getFirstMatch(/dolfin\\/(\\d+(\\.\\d+)?)/i)\n      };\n    }\n    else if (tizen) {\n      result = {\n        name: 'Tizen'\n      , osname: 'Tizen'\n      , tizen: t\n      , version: getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n      };\n    }\n    else if (/qupzilla/i.test(ua)) {\n      result = {\n        name: 'QupZilla'\n        , qupzilla: t\n        , version: getFirstMatch(/(?:qupzilla)[\\s\\/](\\d+(?:\\.\\d+)+)/i) || versionIdentifier\n      }\n    }\n    else if (/chromium/i.test(ua)) {\n      result = {\n        name: 'Chromium'\n        , chromium: t\n        , version: getFirstMatch(/(?:chromium)[\\s\\/](\\d+(?:\\.\\d+)?)/i) || versionIdentifier\n      }\n    }\n    else if (/chrome|crios|crmo/i.test(ua)) {\n      result = {\n        name: 'Chrome'\n        , chrome: t\n        , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n      }\n    }\n    else if (android) {\n      result = {\n        name: 'Android'\n        , version: versionIdentifier\n      }\n    }\n    else if (/safari|applewebkit/i.test(ua)) {\n      result = {\n        name: 'Safari'\n      , safari: t\n      }\n      if (versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    }\n    else if (iosdevice) {\n      result = {\n        name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'\n      }\n      // WTF: version is not part of user agent in web apps\n      if (versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    }\n    else if(/googlebot/i.test(ua)) {\n      result = {\n        name: 'Googlebot'\n      , googlebot: t\n      , version: getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i) || versionIdentifier\n      }\n    }\n    else {\n      result = {\n        name: getFirstMatch(/^(.*)\\/(.*) /),\n        version: getSecondMatch(/^(.*)\\/(.*) /)\n     };\n   }\n\n    // set webkit or gecko flag for browsers based on these engines\n    if (!result.msedge && /(apple)?webkit/i.test(ua)) {\n      if (/(apple)?webkit\\/537\\.36/i.test(ua)) {\n        result.name = result.name || \"Blink\"\n        result.blink = t\n      } else {\n        result.name = result.name || \"Webkit\"\n        result.webkit = t\n      }\n      if (!result.version && versionIdentifier) {\n        result.version = versionIdentifier\n      }\n    } else if (!result.opera && /gecko\\//i.test(ua)) {\n      result.name = result.name || \"Gecko\"\n      result.gecko = t\n      result.version = result.version || getFirstMatch(/gecko\\/(\\d+(\\.\\d+)?)/i)\n    }\n\n    // set OS flags for platforms that have multiple browsers\n    if (!result.windowsphone && (android || result.silk)) {\n      result.android = t\n      result.osname = 'Android'\n    } else if (!result.windowsphone && iosdevice) {\n      result[iosdevice] = t\n      result.ios = t\n      result.osname = 'iOS'\n    } else if (mac) {\n      result.mac = t\n      result.osname = 'macOS'\n    } else if (xbox) {\n      result.xbox = t\n      result.osname = 'Xbox'\n    } else if (windows) {\n      result.windows = t\n      result.osname = 'Windows'\n    } else if (linux) {\n      result.linux = t\n      result.osname = 'Linux'\n    }\n\n    function getWindowsVersion (s) {\n      switch (s) {\n        case 'NT': return 'NT'\n        case 'XP': return 'XP'\n        case 'NT 5.0': return '2000'\n        case 'NT 5.1': return 'XP'\n        case 'NT 5.2': return '2003'\n        case 'NT 6.0': return 'Vista'\n        case 'NT 6.1': return '7'\n        case 'NT 6.2': return '8'\n        case 'NT 6.3': return '8.1'\n        case 'NT 10.0': return '10'\n        default: return undefined\n      }\n    }\n\n    // OS version extraction\n    var osVersion = '';\n    if (result.windows) {\n      osVersion = getWindowsVersion(getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i))\n    } else if (result.windowsphone) {\n      osVersion = getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i);\n    } else if (result.mac) {\n      osVersion = getFirstMatch(/Mac OS X (\\d+([_\\.\\s]\\d+)*)/i);\n      osVersion = osVersion.replace(/[_\\s]/g, '.');\n    } else if (iosdevice) {\n      osVersion = getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i);\n      osVersion = osVersion.replace(/[_\\s]/g, '.');\n    } else if (android) {\n      osVersion = getFirstMatch(/android[ \\/-](\\d+(\\.\\d+)*)/i);\n    } else if (result.webos) {\n      osVersion = getFirstMatch(/(?:web|hpw)os\\/(\\d+(\\.\\d+)*)/i);\n    } else if (result.blackberry) {\n      osVersion = getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i);\n    } else if (result.bada) {\n      osVersion = getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i);\n    } else if (result.tizen) {\n      osVersion = getFirstMatch(/tizen[\\/\\s](\\d+(\\.\\d+)*)/i);\n    }\n    if (osVersion) {\n      result.osversion = osVersion;\n    }\n\n    // device type extraction\n    var osMajorVersion = !result.windows && osVersion.split('.')[0];\n    if (\n         tablet\n      || nexusTablet\n      || iosdevice == 'ipad'\n      || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))\n      || result.silk\n    ) {\n      result.tablet = t\n    } else if (\n         mobile\n      || iosdevice == 'iphone'\n      || iosdevice == 'ipod'\n      || android\n      || nexusMobile\n      || result.blackberry\n      || result.webos\n      || result.bada\n    ) {\n      result.mobile = t\n    }\n\n    // Graded Browser Support\n    // http://developer.yahoo.com/yui/articles/gbs\n    if (result.msedge ||\n        (result.msie && result.version >= 10) ||\n        (result.yandexbrowser && result.version >= 15) ||\n\t\t    (result.vivaldi && result.version >= 1.0) ||\n        (result.chrome && result.version >= 20) ||\n        (result.samsungBrowser && result.version >= 4) ||\n        (result.whale && compareVersions([result.version, '1.0']) === 1) ||\n        (result.mzbrowser && compareVersions([result.version, '6.0']) === 1) ||\n        (result.focus && compareVersions([result.version, '1.0']) === 1) ||\n        (result.firefox && result.version >= 20.0) ||\n        (result.safari && result.version >= 6) ||\n        (result.opera && result.version >= 10.0) ||\n        (result.ios && result.osversion && result.osversion.split(\".\")[0] >= 6) ||\n        (result.blackberry && result.version >= 10.1)\n        || (result.chromium && result.version >= 20)\n        ) {\n      result.a = t;\n    }\n    else if ((result.msie && result.version < 10) ||\n        (result.chrome && result.version < 20) ||\n        (result.firefox && result.version < 20.0) ||\n        (result.safari && result.version < 6) ||\n        (result.opera && result.version < 10.0) ||\n        (result.ios && result.osversion && result.osversion.split(\".\")[0] < 6)\n        || (result.chromium && result.version < 20)\n        ) {\n      result.c = t\n    } else result.x = t\n\n    return result\n  }\n\n  var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent || '' : '')\n\n  bowser.test = function (browserList) {\n    for (var i = 0; i < browserList.length; ++i) {\n      var browserItem = browserList[i];\n      if (typeof browserItem=== 'string') {\n        if (browserItem in bowser) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Get version precisions count\n   *\n   * @example\n   *   getVersionPrecision(\"1.10.3\") // 3\n   *\n   * @param  {string} version\n   * @return {number}\n   */\n  function getVersionPrecision(version) {\n    return version.split(\".\").length;\n  }\n\n  /**\n   * Array::map polyfill\n   *\n   * @param  {Array} arr\n   * @param  {Function} iterator\n   * @return {Array}\n   */\n  function map(arr, iterator) {\n    var result = [], i;\n    if (Array.prototype.map) {\n      return Array.prototype.map.call(arr, iterator);\n    }\n    for (i = 0; i < arr.length; i++) {\n      result.push(iterator(arr[i]));\n    }\n    return result;\n  }\n\n  /**\n   * Calculate browser version weight\n   *\n   * @example\n   *   compareVersions(['1.10.2.1',  '1.8.2.1.90'])    // 1\n   *   compareVersions(['1.010.2.1', '1.09.2.1.90']);  // 1\n   *   compareVersions(['1.10.2.1',  '1.10.2.1']);     // 0\n   *   compareVersions(['1.10.2.1',  '1.0800.2']);     // -1\n   *\n   * @param  {Array<String>} versions versions to compare\n   * @return {Number} comparison result\n   */\n  function compareVersions(versions) {\n    // 1) get common precision for both versions, for example for \"10.0\" and \"9\" it should be 2\n    var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));\n    var chunks = map(versions, function (version) {\n      var delta = precision - getVersionPrecision(version);\n\n      // 2) \"9\" -> \"9.0\" (for precision = 2)\n      version = version + new Array(delta + 1).join(\".0\");\n\n      // 3) \"9.0\" -> [\"000000000\"\", \"000000009\"]\n      return map(version.split(\".\"), function (chunk) {\n        return new Array(20 - chunk.length).join(\"0\") + chunk;\n      }).reverse();\n    });\n\n    // iterate in reverse order by reversed chunks array\n    while (--precision >= 0) {\n      // 4) compare: \"000000009\" > \"000000010\" = false (but \"9\" > \"10\" = true)\n      if (chunks[0][precision] > chunks[1][precision]) {\n        return 1;\n      }\n      else if (chunks[0][precision] === chunks[1][precision]) {\n        if (precision === 0) {\n          // all version chunks are same\n          return 0;\n        }\n      }\n      else {\n        return -1;\n      }\n    }\n  }\n\n  /**\n   * Check if browser is unsupported\n   *\n   * @example\n   *   bowser.isUnsupportedBrowser({\n   *     msie: \"10\",\n   *     firefox: \"23\",\n   *     chrome: \"29\",\n   *     safari: \"5.1\",\n   *     opera: \"16\",\n   *     phantom: \"534\"\n   *   });\n   *\n   * @param  {Object}  minVersions map of minimal version to browser\n   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map\n   * @param  {String}  [ua] user agent string\n   * @return {Boolean}\n   */\n  function isUnsupportedBrowser(minVersions, strictMode, ua) {\n    var _bowser = bowser;\n\n    // make strictMode param optional with ua param usage\n    if (typeof strictMode === 'string') {\n      ua = strictMode;\n      strictMode = void(0);\n    }\n\n    if (strictMode === void(0)) {\n      strictMode = false;\n    }\n    if (ua) {\n      _bowser = detect(ua);\n    }\n\n    var version = \"\" + _bowser.version;\n    for (var browser in minVersions) {\n      if (minVersions.hasOwnProperty(browser)) {\n        if (_bowser[browser]) {\n          if (typeof minVersions[browser] !== 'string') {\n            throw new Error('Browser version in the minVersion map should be a string: ' + browser + ': ' + String(minVersions));\n          }\n\n          // browser version and min supported version.\n          return compareVersions([version, minVersions[browser]]) < 0;\n        }\n      }\n    }\n\n    return strictMode; // not found\n  }\n\n  /**\n   * Check if browser is supported\n   *\n   * @param  {Object} minVersions map of minimal version to browser\n   * @param  {Boolean} [strictMode = false] flag to return false if browser wasn't found in map\n   * @param  {String}  [ua] user agent string\n   * @return {Boolean}\n   */\n  function check(minVersions, strictMode, ua) {\n    return !isUnsupportedBrowser(minVersions, strictMode, ua);\n  }\n\n  bowser.isUnsupportedBrowser = isUnsupportedBrowser;\n  bowser.compareVersions = compareVersions;\n  bowser.check = check;\n\n  /*\n   * Set our detect method to the main bowser object so we can\n   * reuse it to test other user agents.\n   * This is needed to implement future tests.\n   */\n  bowser._detect = detect;\n\n  /*\n   * Set our detect public method to the main bowser object\n   * This is needed to implement bowser in server side\n   */\n  bowser.detect = detect;\n  return bowser\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/bowser/src/bowser.js\n// module id = 1089\n// module chunks = 0 1","module.exports = function() {\r\n\tthrow new Error(\"define cannot be used indirect\");\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/amd-define.js\n// module id = 1090\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _desc, _value, _class; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = require('autobind-decorator');\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _mapboxGl = require('mapbox-gl');\n\nvar _document = require('global/document');\n\nvar _document2 = _interopRequireDefault(_document);\n\nvar _window = require('global/window');\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _noop = require('./noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar ua = typeof _window2.default.navigator !== 'undefined' ? _window2.default.navigator.userAgent.toLowerCase() : '';\nvar firefox = ua.indexOf('firefox') !== -1;\n\nfunction mousePos(el, event) {\n  var rect = el.getBoundingClientRect();\n  event = event.touches ? event.touches[0] : event;\n  return new _mapboxGl.Point(event.clientX - rect.left - el.clientLeft, event.clientY - rect.top - el.clientTop);\n}\n\n/* eslint-disable max-len */\n// Portions of the code below originally from:\n// https://github.com/mapbox/mapbox-gl-js/blob/master/js/ui/handler/scroll_zoom.js\n/* eslint-enable max-len */\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  height: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),\n  onMouseDown: _propTypes2.default.func,\n  onMouseDrag: _propTypes2.default.func,\n  onMouseRotate: _propTypes2.default.func,\n  onMouseUp: _propTypes2.default.func,\n  onMouseMove: _propTypes2.default.func,\n  onZoom: _propTypes2.default.func,\n  onZoomEnd: _propTypes2.default.func\n};\n\nvar DEFAULT_PROPS = {\n  onMouseDown: _noop2.default,\n  onMouseDrag: _noop2.default,\n  onMouseRotate: _noop2.default,\n  onMouseUp: _noop2.default,\n  onMouseMove: _noop2.default,\n  onZoom: _noop2.default,\n  onZoomEnd: _noop2.default\n};\n\nvar MapInteractions = (_class = function (_Component) {\n  _inherits(MapInteractions, _Component);\n\n  function MapInteractions(props) {\n    _classCallCheck(this, MapInteractions);\n\n    var _this = _possibleConstructorReturn(this, (MapInteractions.__proto__ || Object.getPrototypeOf(MapInteractions)).call(this, props));\n\n    _this.state = {\n      startPos: null,\n      pos: null,\n      mouseWheelPos: null\n    };\n    return _this;\n  }\n\n  _createClass(MapInteractions, [{\n    key: '_getMousePos',\n    value: function _getMousePos(event) {\n      var el = this.refs.container;\n      return mousePos(el, event);\n    }\n  }, {\n    key: '_onMouseDown',\n    value: function _onMouseDown(event) {\n      var pos = this._getMousePos(event);\n      this.setState({\n        startPos: pos,\n        pos: pos,\n        metaKey: Boolean(event.metaKey)\n      });\n      this.props.onMouseDown({ pos: pos });\n      _document2.default.addEventListener('mousemove', this._onMouseDrag, false);\n      _document2.default.addEventListener('mouseup', this._onMouseUp, false);\n    }\n  }, {\n    key: '_onMouseDrag',\n    value: function _onMouseDrag(event) {\n      var pos = this._getMousePos(event);\n      this.setState({ pos: pos });\n      if (this.state.metaKey) {\n        var startPos = this.state.startPos;\n\n        this.props.onMouseRotate({ pos: pos, startPos: startPos });\n      } else {\n        this.props.onMouseDrag({ pos: pos });\n      }\n    }\n  }, {\n    key: '_onMouseUp',\n    value: function _onMouseUp(event) {\n      _document2.default.removeEventListener('mousemove', this._onMouseDrag, false);\n      _document2.default.removeEventListener('mouseup', this._onMouseUp, false);\n      var pos = this._getMousePos(event);\n      this.setState({ pos: pos });\n      this.props.onMouseUp({ pos: pos });\n    }\n  }, {\n    key: '_onMouseMove',\n    value: function _onMouseMove(event) {\n      var pos = this._getMousePos(event);\n      this.props.onMouseMove({ pos: pos });\n    }\n\n    /* eslint-disable complexity, max-statements */\n\n  }, {\n    key: '_onWheel',\n    value: function _onWheel(event) {\n      // the following have been disabled because they eliminate\n      // the ability to scroll selects/select-like elements in popups\n      if (this.props.zoomDisabled) {\n        return;\n      }\n\n      event.stopPropagation();\n      event.preventDefault();\n      var value = event.deltaY;\n      // Firefox doubles the values on retina screens...\n      if (firefox && event.deltaMode === _window2.default.WheelEvent.DOM_DELTA_PIXEL) {\n        value /= _window2.default.devicePixelRatio;\n      }\n      if (event.deltaMode === _window2.default.WheelEvent.DOM_DELTA_LINE) {\n        value *= 40;\n      }\n\n      var type = this.state.mouseWheelType;\n      var timeout = this.state.mouseWheelTimeout;\n      var lastValue = this.state.mouseWheelLastValue;\n      var time = this.state.mouseWheelTime;\n\n      var now = (_window2.default.performance || Date).now();\n      var timeDelta = now - (time || 0);\n\n      var pos = this._getMousePos(event);\n      time = now;\n\n      if (value !== 0 && value % 4.000244140625 === 0) {\n        // This one is definitely a mouse wheel event.\n        type = 'wheel';\n        // Normalize this value to match trackpad.\n        value = Math.floor(value / 4);\n      } else if (value !== 0 && Math.abs(value) < 4) {\n        // This one is definitely a trackpad event because it is so small.\n        type = 'trackpad';\n      } else if (timeDelta > 400) {\n        // This is likely a new scroll action.\n        type = null;\n        lastValue = value;\n\n        // Start a timeout in case this was a singular event, and delay it by up\n        // to 40ms.\n        timeout = _window2.default.setTimeout(function setTimeout() {\n          var _type = 'wheel';\n          this._zoom(-this.state.mouseWheelLastValue, this.state.mouseWheelPos);\n          this.setState({ mouseWheelType: _type });\n        }.bind(this), 40);\n      } else if (!this._type) {\n        // This is a repeating event, but we don't know the type of event just\n        // yet.\n        // If the delta per time is small, we assume it's a fast trackpad;\n        // otherwise we switch into wheel mode.\n        type = Math.abs(timeDelta * value) < 200 ? 'trackpad' : 'wheel';\n\n        // Make sure our delayed event isn't fired again, because we accumulate\n        // the previous event (which was less than 40ms ago) into this event.\n        if (timeout) {\n          _window2.default.clearTimeout(timeout);\n          timeout = null;\n          value += lastValue;\n        }\n      }\n\n      // Slow down zoom if shift key is held for more precise zooming\n      if (event.shiftKey && value) {\n        value = value / 4;\n      }\n\n      // Only fire the callback if we actually know what type of scrolling device\n      // the user uses.\n      if (type) {\n        this._zoom(-value, pos);\n      }\n\n      this.setState({\n        mouseWheelTime: time,\n        mouseWheelPos: pos,\n        mouseWheelType: type,\n        mouseWheelTimeout: timeout,\n        mouseWheelLastValue: lastValue\n      });\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: '_zoom',\n    value: function _zoom(delta, pos) {\n\n      // Scale by sigmoid of scroll wheel delta.\n      var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n      if (delta < 0 && scale !== 0) {\n        scale = 1 / scale;\n      }\n      this.props.onZoom({ pos: pos, scale: scale });\n      _window2.default.clearTimeout(this._zoomEndTimeout);\n      this._zoomEndTimeout = _window2.default.setTimeout(function _setTimeout() {\n        this.props.onZoomEnd();\n      }.bind(this), 200);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'div',\n        {\n          ref: 'container',\n          onMouseMove: this._onMouseMove,\n          onMouseDown: this._onMouseDown,\n          onContextMenu: this._onMouseDown,\n          onWheel: this._onWheel,\n          style: {\n            width: this.props.width,\n            height: this.props.height,\n            position: 'relative'\n          } },\n        this.props.children\n      );\n    }\n  }]);\n\n  return MapInteractions;\n}(_react.Component), (_applyDecoratedDescriptor(_class.prototype, '_onMouseDown', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseDown'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseDrag'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseUp', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseUp'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onMouseMove', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onMouseMove'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onWheel', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onWheel'), _class.prototype)), _class);\nexports.default = MapInteractions;\n\n\nMapInteractions.propTypes = PROP_TYPES;\nMapInteractions.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtaW50ZXJhY3Rpb25zLnJlYWN0LmpzIl0sIm5hbWVzIjpbInVhIiwid2luZG93IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJmaXJlZm94IiwiaW5kZXhPZiIsIm1vdXNlUG9zIiwiZWwiLCJldmVudCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3VjaGVzIiwiUG9pbnQiLCJjbGllbnRYIiwibGVmdCIsImNsaWVudExlZnQiLCJjbGllbnRZIiwidG9wIiwiY2xpZW50VG9wIiwiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwib25lT2ZUeXBlIiwibnVtYmVyIiwic3RyaW5nIiwiaGVpZ2h0Iiwib25Nb3VzZURvd24iLCJmdW5jIiwib25Nb3VzZURyYWciLCJvbk1vdXNlUm90YXRlIiwib25Nb3VzZVVwIiwib25Nb3VzZU1vdmUiLCJvblpvb20iLCJvblpvb21FbmQiLCJERUZBVUxUX1BST1BTIiwibm9vcCIsIk1hcEludGVyYWN0aW9ucyIsInByb3BzIiwic3RhdGUiLCJzdGFydFBvcyIsInBvcyIsIm1vdXNlV2hlZWxQb3MiLCJyZWZzIiwiY29udGFpbmVyIiwiX2dldE1vdXNlUG9zIiwic2V0U3RhdGUiLCJtZXRhS2V5IiwiQm9vbGVhbiIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbk1vdXNlRHJhZyIsIl9vbk1vdXNlVXAiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiem9vbURpc2FibGVkIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJ2YWx1ZSIsImRlbHRhWSIsImRlbHRhTW9kZSIsIldoZWVsRXZlbnQiLCJET01fREVMVEFfUElYRUwiLCJkZXZpY2VQaXhlbFJhdGlvIiwiRE9NX0RFTFRBX0xJTkUiLCJ0eXBlIiwibW91c2VXaGVlbFR5cGUiLCJ0aW1lb3V0IiwibW91c2VXaGVlbFRpbWVvdXQiLCJsYXN0VmFsdWUiLCJtb3VzZVdoZWVsTGFzdFZhbHVlIiwidGltZSIsIm1vdXNlV2hlZWxUaW1lIiwibm93IiwicGVyZm9ybWFuY2UiLCJEYXRlIiwidGltZURlbHRhIiwiTWF0aCIsImZsb29yIiwiYWJzIiwic2V0VGltZW91dCIsIl90eXBlIiwiX3pvb20iLCJiaW5kIiwiY2xlYXJUaW1lb3V0Iiwic2hpZnRLZXkiLCJkZWx0YSIsInNjYWxlIiwiZXhwIiwiX3pvb21FbmRUaW1lb3V0IiwiX3NldFRpbWVvdXQiLCJfb25Nb3VzZU1vdmUiLCJfb25Nb3VzZURvd24iLCJfb25XaGVlbCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJDb21wb25lbnQiLCJhdXRvYmluZCIsInByb3BUeXBlcyIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OzJCQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxLQUFLLE9BQU9DLGlCQUFPQyxTQUFkLEtBQTRCLFdBQTVCLEdBQ1RELGlCQUFPQyxTQUFQLENBQWlCQyxTQUFqQixDQUEyQkMsV0FBM0IsRUFEUyxHQUNrQyxFQUQ3QztBQUVBLElBQU1DLFVBQVVMLEdBQUdNLE9BQUgsQ0FBVyxTQUFYLE1BQTBCLENBQUMsQ0FBM0M7O0FBRUEsU0FBU0MsUUFBVCxDQUFrQkMsRUFBbEIsRUFBc0JDLEtBQXRCLEVBQTZCO0FBQzNCLE1BQU1DLE9BQU9GLEdBQUdHLHFCQUFILEVBQWI7QUFDQUYsVUFBUUEsTUFBTUcsT0FBTixHQUFnQkgsTUFBTUcsT0FBTixDQUFjLENBQWQsQ0FBaEIsR0FBbUNILEtBQTNDO0FBQ0EsU0FBTyxJQUFJSSxlQUFKLENBQ0xKLE1BQU1LLE9BQU4sR0FBZ0JKLEtBQUtLLElBQXJCLEdBQTRC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Z0IxQ0MsMkIsc0pBYUFBLDJCLG9KQVlBQSwyQixvSkFTQUEsMkIsa0pBT0FBLDJCO2tCQXpEa0IzRCxlOzs7QUFtTHJCQSxnQkFBZ0I0RCxTQUFoQixHQUE0QjdFLFVBQTVCO0FBQ0FpQixnQkFBZ0I2RCxZQUFoQixHQUErQi9ELGFBQS9CIiwiZmlsZSI6Im1hcC1pbnRlcmFjdGlvbnMucmVhY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcbmltcG9ydCB7UG9pbnR9IGZyb20gJ21hcGJveC1nbCc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgbm9vcCBmcm9tICcuL25vb3AnO1xuXG5jb25zdCB1YSA9IHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/XG4gIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkgOiAnJztcbmNvbnN0IGZpcmVmb3ggPSB1YS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuXG5mdW5jdGlvbiBtb3VzZVBvcyhlbCwgZXZlbnQpIHtcbiAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBldmVudCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gIHJldHVybiBuZXcgUG9pbnQoXG4gICAgZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICk7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8vIFBvcnRpb25zIG9mIHRoZSBjb2RlIGJlbG93IG9yaWdpbmFsbHkgZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2Jsb2IvbWFzdGVyL2pzL3VpL2hhbmRsZXIvc2Nyb2xsX3pvb20uanNcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICBQcm9wVHlwZXMuc3RyaW5nXG4gIF0pLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5udW1iZXIsXG4gICAgUHJvcFR5cGVzLnN0cmluZ1xuICBdKSxcbiAgb25Nb3VzZURvd246IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlRHJhZzogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VSb3RhdGU6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlVXA6IFByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTW92ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uWm9vbTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uWm9vbUVuZDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IERFRkFVTFRfUFJPUFMgPSB7XG4gIG9uTW91c2VEb3duOiBub29wLFxuICBvbk1vdXNlRHJhZzogbm9vcCxcbiAgb25Nb3VzZVJvdGF0ZTogbm9vcCxcbiAgb25Nb3VzZVVwOiBub29wLFxuICBvbk1vdXNlTW92ZTogbm9vcCxcbiAgb25ab29tOiBub29wLFxuICBvblpvb21FbmQ6IG5vb3Bcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcEludGVyYWN0aW9ucyBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHN0YXJ0UG9zOiBudWxsLFxuICAgICAgcG9zOiBudWxsLFxuICAgICAgbW91c2VXaGVlbFBvczogbnVsbFxuICAgIH07XG4gIH1cblxuICBfZ2V0TW91c2VQb3MoZXZlbnQpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMucmVmcy5jb250YWluZXI7XG4gICAgcmV0dXJuIG1vdXNlUG9zKGVsLCBldmVudCk7XG4gIH1cblxuICBAYXV0b2JpbmRcbiAgX29uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3MoZXZlbnQpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3RhcnRQb3M6IHBvcyxcbiAgICAgIHBvcyxcbiAgICAgIG1ldGFLZXk6IEJvb2xlYW4oZXZlbnQubWV0YUtleSlcbiAgICB9KTtcbiAgICB0aGlzLnByb3BzLm9uTW91c2VEb3duKHtwb3N9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlRHJhZywgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25Nb3VzZURyYWcoZXZlbnQpIHtcbiAgICBjb25zdCBwb3MgPSB0aGlzLl9nZXRNb3VzZVBvcyhldmVudCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7cG9zfSk7XG4gICAgaWYgKHRoaXMuc3RhdGUubWV0YUtleSkge1xuICAgICAgY29uc3Qge3N0YXJ0UG9zfSA9IHRoaXMuc3RhdGU7XG4gICAgICB0aGlzLnByb3BzLm9uTW91c2VSb3RhdGUoe3Bvcywgc3RhcnRQb3N9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdXNlRHJhZyh7cG9zfSk7XG4gICAgfVxuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9vbk1vdXNlVXAoZXZlbnQpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlRHJhZywgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcbiAgICBjb25zdCBwb3MgPSB0aGlzLl9nZXRNb3VzZVBvcyhldmVudCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7cG9zfSk7XG4gICAgdGhpcy5wcm9wcy5vbk1vdXNlVXAoe3Bvc30pO1xuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9vbk1vdXNlTW92ZShldmVudCkge1xuICAgIGNvbnN0IHBvcyA9IHRoaXMuX2dldE1vdXNlUG9zKGV2ZW50KTtcbiAgICB0aGlzLnByb3BzLm9uTW91c2VNb3ZlKHtwb3N9KTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzICovXG4gIEBhdXRvYmluZFxuICBfb25XaGVlbChldmVudCkge1xuICAgIC8vIHRoZSBmb2xsb3dpbmcgaGF2ZSBiZWVuIGRpc2FibGVkIGJlY2F1c2UgdGhleSBlbGltaW5hdGVcbiAgICAvLyB0aGUgYWJpbGl0eSB0byBzY3JvbGwgc2VsZWN0cy9zZWxlY3QtbGlrZSBlbGVtZW50cyBpbiBwb3B1cHNcbiAgICBpZiAodGhpcy5wcm9wcy56b29tRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LmRlbHRhWTtcbiAgICAvLyBGaXJlZm94IGRvdWJsZXMgdGhlIHZhbHVlcyBvbiByZXRpbmEgc2NyZWVucy4uLlxuICAgIGlmIChmaXJlZm94ICYmIGV2ZW50LmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMKSB7XG4gICAgICB2YWx1ZSAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB9XG4gICAgaWYgKGV2ZW50LmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHtcbiAgICAgIHZhbHVlICo9IDQwO1xuICAgIH1cblxuICAgIGxldCB0eXBlID0gdGhpcy5zdGF0ZS5tb3VzZVdoZWVsVHlwZTtcbiAgICBsZXQgdGltZW91dCA9IHRoaXMuc3RhdGUubW91c2VXaGVlbFRpbWVvdXQ7XG4gICAgbGV0IGxhc3RWYWx1ZSA9IHRoaXMuc3RhdGUubW91c2VXaGVlbExhc3RWYWx1ZTtcbiAgICBsZXQgdGltZSA9IHRoaXMuc3RhdGUubW91c2VXaGVlbFRpbWU7XG5cbiAgICBjb25zdCBub3cgPSAod2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGUpLm5vdygpO1xuICAgIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtICh0aW1lIHx8IDApO1xuXG4gICAgY29uc3QgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3MoZXZlbnQpO1xuICAgIHRpbWUgPSBub3c7XG5cbiAgICBpZiAodmFsdWUgIT09IDAgJiYgdmFsdWUgJSA0LjAwMDI0NDE0MDYyNSA9PT0gMCkge1xuICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgICAgdHlwZSA9ICd3aGVlbCc7XG4gICAgICAvLyBOb3JtYWxpemUgdGhpcyB2YWx1ZSB0byBtYXRjaCB0cmFja3BhZC5cbiAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSAvIDQpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IDAgJiYgTWF0aC5hYnModmFsdWUpIDwgNCkge1xuICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIHRyYWNrcGFkIGV2ZW50IGJlY2F1c2UgaXQgaXMgc28gc21hbGwuXG4gICAgICB0eXBlID0gJ3RyYWNrcGFkJztcbiAgICB9IGVsc2UgaWYgKHRpbWVEZWx0YSA+IDQwMCkge1xuICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgIHR5cGUgPSBudWxsO1xuICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIC8vIFN0YXJ0IGEgdGltZW91dCBpbiBjYXNlIHRoaXMgd2FzIGEgc2luZ3VsYXIgZXZlbnQsIGFuZCBkZWxheSBpdCBieSB1cFxuICAgICAgLy8gdG8gNDBtcy5cbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiBzZXRUaW1lb3V0KCkge1xuICAgICAgICBjb25zdCBfdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX3pvb20oLXRoaXMuc3RhdGUubW91c2VXaGVlbExhc3RWYWx1ZSwgdGhpcy5zdGF0ZS5tb3VzZVdoZWVsUG9zKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bW91c2VXaGVlbFR5cGU6IF90eXBlfSk7XG4gICAgICB9LmJpbmQodGhpcyksIDQwKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0XG4gICAgICAvLyB5ZXQuXG4gICAgICAvLyBJZiB0aGUgZGVsdGEgcGVyIHRpbWUgaXMgc21hbGwsIHdlIGFzc3VtZSBpdCdzIGEgZmFzdCB0cmFja3BhZDtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgdHlwZSA9IE1hdGguYWJzKHRpbWVEZWx0YSAqIHZhbHVlKSA8IDIwMCA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdmFsdWUgKz0gbGFzdFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB2YWx1ZSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlXG4gICAgLy8gdGhlIHVzZXIgdXNlcy5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy5fem9vbSgtdmFsdWUsIHBvcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtb3VzZVdoZWVsVGltZTogdGltZSxcbiAgICAgIG1vdXNlV2hlZWxQb3M6IHBvcyxcbiAgICAgIG1vdXNlV2hlZWxUeXBlOiB0eXBlLFxuICAgICAgbW91c2VXaGVlbFRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICBtb3VzZVdoZWVsTGFzdFZhbHVlOiBsYXN0VmFsdWVcbiAgICB9KTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzICovXG5cbiAgX3pvb20oZGVsdGEsIHBvcykge1xuXG4gICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgbGV0IHNjYWxlID0gMiAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKGRlbHRhIC8gMTAwKSkpO1xuICAgIGlmIChkZWx0YSA8IDAgJiYgc2NhbGUgIT09IDApIHtcbiAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLm9uWm9vbSh7cG9zLCBzY2FsZX0pO1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fem9vbUVuZFRpbWVvdXQpO1xuICAgIHRoaXMuX3pvb21FbmRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gX3NldFRpbWVvdXQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uWm9vbUVuZCgpO1xuICAgIH0uYmluZCh0aGlzKSwgMjAwKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9XCJjb250YWluZXJcIlxuICAgICAgICBvbk1vdXNlTW92ZT17IHRoaXMuX29uTW91c2VNb3ZlIH1cbiAgICAgICAgb25Nb3VzZURvd249eyB0aGlzLl9vbk1vdXNlRG93biB9XG4gICAgICAgIG9uQ29udGV4dE1lbnU9eyB0aGlzLl9vbk1vdXNlRG93biB9XG4gICAgICAgIG9uV2hlZWw9eyB0aGlzLl9vbldoZWVsIH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgd2lkdGg6IHRoaXMucHJvcHMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLnByb3BzLmhlaWdodCxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9IH0+XG5cbiAgICAgICAgeyB0aGlzLnByb3BzLmNoaWxkcmVuIH1cblxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5NYXBJbnRlcmFjdGlvbnMucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcbk1hcEludGVyYWN0aW9ucy5kZWZhdWx0UHJvcHMgPSBERUZBVUxUX1BST1BTO1xuIl19\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/map-interactions.react.js\n// module id = 1091\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.diffSources = diffSources;\nexports.diffLayers = diffLayers;\nexports.default = diffStyle;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable max-statements */\nfunction diffSources(prevStyle, nextStyle) {\n  var prevSources = prevStyle.get('sources');\n  var nextSources = nextStyle.get('sources');\n  var enter = [];\n  var update = [];\n  var exit = [];\n  var prevIds = prevSources.keySeq().toArray();\n  var nextIds = nextSources.keySeq().toArray();\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = prevIds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var id = _step.value;\n\n      var nextSource = nextSources.get(id);\n      if (nextSource) {\n        if (!nextSource.equals(prevSources.get(id))) {\n          update.push({ id: id, source: nextSources.get(id) });\n        }\n      } else {\n        exit.push({ id: id, source: prevSources.get(id) });\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = nextIds[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var _id = _step2.value;\n\n      var prevSource = prevSources.get(_id);\n      if (!prevSource) {\n        enter.push({ id: _id, source: nextSources.get(_id) });\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n\n  return { enter: enter, update: update, exit: exit };\n}\n/* eslint-enable max-statements */\n\nfunction diffLayers(prevStyle, nextStyle) {\n  var prevLayers = prevStyle.get('layers');\n  var nextLayers = nextStyle.get('layers');\n  var updates = [];\n  var exiting = [];\n  var prevMap = {};\n  var nextMap = {};\n  nextLayers.forEach(function (layer, index) {\n    var id = layer.get('id');\n    var layerImBehind = nextLayers.get(index + 1);\n    nextMap[id] = {\n      layer: layer,\n      id: id,\n      // The `id` of the layer before this one.\n      before: layerImBehind ? layerImBehind.get('id') : null,\n      enter: true\n    };\n  });\n  prevLayers.forEach(function (layer, index) {\n    var id = layer.get('id');\n    var layerImBehind = prevLayers.get(index + 1);\n    prevMap[id] = {\n      layer: layer,\n      id: id,\n      before: layerImBehind ? layerImBehind.get('id') : null\n    };\n    if (nextMap[id]) {\n      // Not a new layer.\n      nextMap[id].enter = false;\n    } else {\n      // This layer is being removed.\n      exiting.push(prevMap[id]);\n    }\n  });\n  var _iteratorNormalCompletion3 = true;\n  var _didIteratorError3 = false;\n  var _iteratorError3 = undefined;\n\n  try {\n    for (var _iterator3 = nextLayers.reverse()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n      var layer = _step3.value;\n\n      var id = layer.get('id');\n      if (!prevMap[id] || !prevMap[id].layer.equals(nextMap[id].layer) || prevMap[id].before !== nextMap[id].before) {\n        // This layer is being changed.\n        updates.push(nextMap[id]);\n      }\n    }\n  } catch (err) {\n    _didIteratorError3 = true;\n    _iteratorError3 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion3 && _iterator3.return) {\n        _iterator3.return();\n      }\n    } finally {\n      if (_didIteratorError3) {\n        throw _iteratorError3;\n      }\n    }\n  }\n\n  return { updates: updates, exiting: exiting };\n}\n\nfunction diffStyle(prevStyle, nextStyle) {\n  return {\n    sourcesDiff: diffSources(prevStyle, nextStyle),\n    layersDiff: diffLayers(prevStyle, nextStyle)\n  };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaWZmLXN0eWxlcy5qcyJdLCJuYW1lcyI6WyJkaWZmU291cmNlcyIsImRpZmZMYXllcnMiLCJkaWZmU3R5bGUiLCJwcmV2U3R5bGUiLCJuZXh0U3R5bGUiLCJwcmV2U291cmNlcyIsImdldCIsIm5leHRTb3VyY2VzIiwiZW50ZXIiLCJ1cGRhdGUiLCJleGl0IiwicHJldklkcyIsImtleVNlcSIsInRvQXJyYXkiLCJuZXh0SWRzIiwiaWQiLCJuZXh0U291cmNlIiwiZXF1YWxzIiwicHVzaCIsInNvdXJjZSIsInByZXZTb3VyY2UiLCJwcmV2TGF5ZXJzIiwibmV4dExheWVycyIsInVwZGF0ZXMiLCJleGl0aW5nIiwicHJldk1hcCIsIm5leHRNYXAiLCJmb3JFYWNoIiwibGF5ZXIiLCJpbmRleCIsImxheWVySW1CZWhpbmQiLCJiZWZvcmUiLCJyZXZlcnNlIiwic291cmNlc0RpZmYiLCJsYXllcnNEaWZmIl0sIm1hcHBpbmdzIjoiOzs7OztRQXFCZ0JBLFcsR0FBQUEsVztRQTRCQUMsVSxHQUFBQSxVO2tCQWdEUUMsUztBQWpHeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDTyxTQUFTRixXQUFULENBQXFCRyxTQUFyQixFQUFnQ0MsU0FBaEMsRUFBMkM7QUFDaEQsTUFBTUMsY0FBY0YsVUFBVUcsR0FBVixDQUFjLFNBQWQsQ0FBcEI7QUFDQSxNQUFNQyxjQUFjSCxVQUFVRSxHQUFWLENBQWMsU0FBZCxDQUFwQjtBQUNBLE1BQU1FLFFBQVEsRUFBZDtBQUNBLE1BQU1DLFNBQVMsRUFBZjtBQUNBLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE1BQU1DLFVBQVVOLFlBQVlPLE1BQVosR0FBcUJDLE9BQXJCLEVBQWhCO0FBQ0EsTUFBTUMsVUFBVVAsWUFBWUssTUFBWixHQUFxQkMsT0FBckIsRUFBaEI7QUFQZ0Q7QUFBQTtBQUFBOztBQUFBO0FB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QVdVLE9BQVgsRUFBcEIsbUlBQTBDO0FBQUEsVUFBL0JKLEtBQStCOztBQUN4QyxVQUFNYixLQUFLYSxNQUFNdEIsR0FBTixDQUFVLElBQVYsQ0FBWDtBQUNBLFVBQ0UsQ0FBQ21CLFFBQVFWLEVBQVIsQ0FBRCxJQUNBLENBQUNVLFFBQVFWLEVBQVIsRUFBWWEsS0FBWixDQUFrQlgsTUFBbEIsQ0FBeUJTLFFBQVFYLEVBQVIsRUFBWWEsS0FBckMsQ0FERCxJQUVBSCxRQUFRVixFQUFSLEVBQVlnQixNQUFaLEtBQXVCTCxRQUFRWCxFQUFSLEVBQVlnQixNQUhyQyxFQUlFO0FBQ0E7QUFDQVIsZ0JBQVFMLElBQVIsQ0FBYVEsUUFBUVgsRUFBUixDQUFiO0FBQ0Q7QUFDRjtBQTVDOEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUE2Qy9DLFNBQU8sRUFBQ1EsZ0JBQUQsRUFBVUMsZ0JBQVYsRUFBUDtBQUNEOztBQUVjLFNBQVN0QixTQUFULENBQW1CQyxTQUFuQixFQUE4QkMsU0FBOUIsRUFBeUM7QUFDdEQsU0FBTztBQUNMNkIsaUJBQWFqQyxZQUFZRyxTQUFaLEVBQXVCQyxTQUF2QixDQURSO0FBRUw4QixnQkFBWWpDLFdBQVdFLFNBQVgsRUFBc0JDLFNBQXRCO0FBRlAsR0FBUDtBQUlEIiwiZmlsZSI6ImRpZmYtc3R5bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmU291cmNlcyhwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICBjb25zdCBwcmV2U291cmNlcyA9IHByZXZTdHlsZS5nZXQoJ3NvdXJjZXMnKTtcbiAgY29uc3QgbmV4dFNvdXJjZXMgPSBuZXh0U3R5bGUuZ2V0KCdzb3VyY2VzJyk7XG4gIGNvbnN0IGVudGVyID0gW107XG4gIGNvbnN0IHVwZGF0ZSA9IFtdO1xuICBjb25zdCBleGl0ID0gW107XG4gIGNvbnN0IHByZXZJZHMgPSBwcmV2U291cmNlcy5rZXlTZXEoKS50b0FycmF5KCk7XG4gIGNvbnN0IG5leHRJZHMgPSBuZXh0U291cmNlcy5rZXlTZXEoKS50b0FycmF5KCk7XG4gIGZvciAoY29uc3QgaWQgb2YgcHJldklkcykge1xuICAgIGNvbnN0IG5leHRTb3VyY2UgPSBuZXh0U291cmNlcy5nZXQoaWQpO1xuICAgIGlmIChuZXh0U291cmNlKSB7XG4gICAgICBpZiAoIW5leHRTb3VyY2UuZXF1YWxzKHByZXZTb3VyY2VzLmdldChpZCkpKSB7XG4gICAgICAgIHVwZGF0ZS5wdXNoKHtpZCwgc291cmNlOiBuZXh0U291cmNlcy5nZXQoaWQpfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXQucHVzaCh7aWQsIHNvdXJjZTogcHJldlNvdXJjZXMuZ2V0KGlkKX0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGlkIG9mIG5leHRJZHMpIHtcbiAgICBjb25zdCBwcmV2U291cmNlID0gcHJldlNvdXJjZXMuZ2V0KGlkKTtcbiAgICBpZiAoIXByZXZTb3VyY2UpIHtcbiAgICAgIGVudGVyLnB1c2goe2lkLCBzb3VyY2U6IG5leHRTb3VyY2VzLmdldChpZCl9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtlbnRlciwgdXBkYXRlLCBleGl0fTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZMYXllcnMocHJldlN0eWxlLCBuZXh0U3R5bGUpIHtcbiAgY29uc3QgcHJldkxheWVycyA9IHByZXZTdHlsZS5nZXQoJ2xheWVycycpO1xuICBjb25zdCBuZXh0TGF5ZXJzID0gbmV4dFN0eWxlLmdldCgnbGF5ZXJzJyk7XG4gIGNvbnN0IHVwZGF0ZXMgPSBbXTtcbiAgY29uc3QgZXhpdGluZyA9IFtdO1xuICBjb25zdCBwcmV2TWFwID0ge307XG4gIGNvbnN0IG5leHRNYXAgPSB7fTtcbiAgbmV4dExheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZCA9IGxheWVyLmdldCgnaWQnKTtcbiAgICBjb25zdCBsYXllckltQmVoaW5kID0gbmV4dExheWVycy5nZXQoaW5kZXggKyAxKTtcbiAgICBuZXh0TWFwW2lkXSA9IHtcbiAgICAgIGxheWVyLFxuICAgICAgaWQsXG4gICAgICAvLyBUaGUgYGlkYCBvZiB0aGUgbGF5ZXIgYmVmb3JlIHRoaXMgb25lLlxuICAgICAgYmVmb3JlOiBsYXllckltQmVoaW5kID8gbGF5ZXJJbUJlaGluZC5nZXQoJ2lkJykgOiBudWxsLFxuICAgICAgZW50ZXI6IHRydWVcbiAgICB9O1xuICB9KTtcbiAgcHJldkxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZCA9IGxheWVyLmdldCgnaWQnKTtcbiAgICBjb25zdCBsYXllckltQmVoaW5kID0gcHJldkxheWVycy5nZXQoaW5kZXggKyAxKTtcbiAgICBwcmV2TWFwW2lkXSA9IHtcbiAgICAgIGxheWVyLFxuICAgICAgaWQsXG4gICAgICBiZWZvcmU6IGxheWVySW1CZWhpbmQgPyBsYXllckltQmVoaW5kLmdldCgnaWQnKSA6IG51bGxcbiAgICB9O1xuICAgIGlmIChuZXh0TWFwW2lkXSkge1xuICAgICAgLy8gTm90IGEgbmV3IGxheWVyLlxuICAgICAgbmV4dE1hcFtpZF0uZW50ZXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBsYXllciBpcyBiZWluZyByZW1vdmVkLlxuICAgICAgZXhpdGluZy5wdXNoKHByZXZNYXBbaWRdKTtcbiAgICB9XG4gIH0pO1xuICBmb3IgKGNvbnN0IGxheWVyIG9mIG5leHRMYXllcnMucmV2ZXJzZSgpKSB7XG4gICAgY29uc3QgaWQgPSBsYXllci5nZXQoJ2lkJyk7XG4gICAgaWYgKFxuICAgICAgIXByZXZNYXBbaWRdIHx8XG4gICAgICAhcHJldk1hcFtpZF0ubGF5ZXIuZXF1YWxzKG5leHRNYXBbaWRdLmxheWVyKSB8fFxuICAgICAgcHJldk1hcFtpZF0uYmVmb3JlICE9PSBuZXh0TWFwW2lkXS5iZWZvcmVcbiAgICApIHtcbiAgICAgIC8vIFRoaXMgbGF5ZXIgaXMgYmVpbmcgY2hhbmdlZC5cbiAgICAgIHVwZGF0ZXMucHVzaChuZXh0TWFwW2lkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7dXBkYXRlcywgZXhpdGluZ307XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZTdHlsZShwcmV2U3R5bGUsIG5leHRTdHlsZSkge1xuICByZXR1cm4ge1xuICAgIHNvdXJjZXNEaWZmOiBkaWZmU291cmNlcyhwcmV2U3R5bGUsIG5leHRTdHlsZSksXG4gICAgbGF5ZXJzRGlmZjogZGlmZkxheWVycyhwcmV2U3R5bGUsIG5leHRTdHlsZSlcbiAgfTtcbn1cbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/diff-styles.js\n// module id = 1093\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = fitBounds;\n\nvar _mapboxGl = require('mapbox-gl');\n\nvar _transform = require('mapbox-gl/js/geo/transform');\n\nvar _transform2 = _interopRequireDefault(_transform);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction fitBounds(width, height, _bounds, options) {\n  var bounds = new _mapboxGl.LngLatBounds([_bounds[0].reverse(), _bounds[1].reverse()]);\n  options = options || {};\n  var padding = typeof options.padding === 'undefined' ? 0 : options.padding;\n  var offset = _mapboxGl.Point.convert([0, 0]);\n  var tr = new _transform2.default();\n  tr.width = width;\n  tr.height = height;\n  var nw = tr.project(bounds.getNorthWest());\n  var se = tr.project(bounds.getSouthEast());\n  var size = se.sub(nw);\n  var scaleX = (tr.width - padding * 2 - Math.abs(offset.x) * 2) / size.x;\n  var scaleY = (tr.height - padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n  var center = tr.unproject(nw.add(se).div(2));\n  var zoom = tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY));\n  return {\n    latitude: center.lat,\n    longitude: center.lng,\n    zoom: zoom\n  };\n}\n\n// NOTE: Transform is not a public API so we should be careful to always lock\n// down mapbox-gl to a specific major, minor, and patch version.\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9maXQtYm91bmRzLmpzIl0sIm5hbWVzIjpbImZpdEJvdW5kcyIsIndpZHRoIiwiaGVpZ2h0IiwiX2JvdW5kcyIsIm9wdGlvbnMiLCJib3VuZHMiLCJMbmdMYXRCb3VuZHMiLCJyZXZlcnNlIiwicGFkZGluZyIsIm9mZnNldCIsIlBvaW50IiwiY29udmVydCIsInRyIiwiVHJhbnNmb3JtIiwibnciLCJwcm9qZWN0IiwiZ2V0Tm9ydGhXZXN0Iiwic2UiLCJnZXRTb3V0aEVhc3QiLCJzaXplIiwic3ViIiwic2NhbGVYIiwiTWF0aCIsImFicyIsIngiLCJzY2FsZVkiLCJ5IiwiY2VudGVyIiwidW5wcm9qZWN0IiwiYWRkIiwiZGl2Iiwiem9vbSIsInNjYWxlWm9vbSIsInNjYWxlIiwibWluIiwibGF0aXR1ZGUiLCJsYXQiLCJsb25naXR1ZGUiLCJsbmciXSwibWFwcGluZ3MiOiI7Ozs7O2tCQTBCd0JBLFM7O0FBTnhCOztBQUlBOzs7Ozs7QUF4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUWUsU0FBU0EsU0FBVCxDQUFtQkMsS0FBbkIsRUFBMEJDLE1BQTFCLEVBQWtDQyxPQUFsQyxFQUEyQ0MsT0FBM0MsRUFBb0Q7QUFDakUsTUFBTUMsU0FBUyxJQUFJQyxzQkFBSixDQUFpQixDQUFDSCxRQUFRLENBQVIsRUFBV0ksT0FBWCxFQUFELEVBQXVCSixRQUFRLENBQVIsRUFBV0ksT0FBWCxFQUF2QixDQUFqQixDQUFmO0FBQ0FILFlBQVVBLFdBQVcsRUFBckI7QUFDQSxNQUFNSSxVQUFVLE9BQU9KLFFBQVFJLE9BQWYsS0FBMkIsV0FBM0IsR0FBeUMsQ0FBekMsR0FBNkNKLFFBQVFJLE9BQXJFO0FBQ0EsTUFBTUMsU0FBU0MsZ0JBQU1DLE9BQU4sQ0FBYyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWQsQ0FBZjtBQUNBLE1BQU1DLEtBQUssSUFBSUMsbUJBQUosRUFBWDtBQUNBRCxLQUFHWCxLQUFILEdBQVdBLEtBQVg7QUFDQVcsS0FBR1YsTUFBSCxHQUFZQSxNQUFaO0FBQ0EsTUFBTVksS0FBS0YsR0FBR0csT0FBSCxDQUFXVixPQUFPVyxZQUFQLEVBQVgsQ0FBWDtBQUNBLE1BQU1DLEtBQUtMLEdBQUdHLE9BQUgsQ0FBV1YsT0FBT2EsWUFBUCxFQUFYLENBQVg7QUFDQSxNQUFNQyxPQUFPRixHQUFHRyxHQUFILENBQU9OLEVBQVAsQ0FBYjtBQUNBLE1BQU1PLFNBQVMsQ0FBQ1QsR0FBR1gsS0FBSCxHQUFXTyxVQUFVLENBQXJCLEdBQXlCYyxLQUFLQyxHQUFMLENBQVNkLE9BQU9lLENBQWhCLElBQXFCLENBQS9DLElBQW9ETCxLQUFLSyxDQUF4RTtBQUNBLE1BQU1DLFNBQVMsQ0FBQ2IsR0FBR1YsTUFBSCxHQUFZTSxVQUFVLENBQXRCLEdBQTBCYyxLQUFLQyxHQUFMLENBQVNkLE9BQU9pQixDQUFoQixJQUFxQixDQUFoRCxJQUFxRFAsS0FBS08sQ0FBekU7O0FBRUEsTUFBTUMsU0FBU2YsR0FBR2dCLFNBQUgsQ0FBYWQsR0FBR2UsR0FBSCxDQUFPWixFQUFQLEVBQVdhLEdBQVgsQ0FBZSxDQUFmLENBQWIsQ0FBZjtBQUNBLE1BQU1DLE9BQU9uQixHQUFHb0IsU0FBSCxDQUFhcEIsR0FBR3FCLEtBQUgsR0FBV1gsS0FBS1ksR0FBTCxDQUFTYixNQUFULEVBQWlCSSxNQUFqQixDQUF4QixDQUFiO0FBQ0EsU0FBTztBQUNMVSxjQUFVUixPQUFPUyxHQURaO0FBRUxDLGVBQVdWLE9BQU9XLEdBRmI7QUFHTFA7QUFISyxHQUFQO0FBS0Q7O0FBekJEO0FBQ0EiLCJmaWxlIjoiZml0LWJvdW5kcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7TG5nTGF0Qm91bmRzLCBQb2ludH0gZnJvbSAnbWFwYm94LWdsJztcblxuLy8gTk9URTogVHJhbnNmb3JtIGlzIG5vdCBhIHB1YmxpYyBBUEkgc28gd2Ugc2hvdWxkIGJlIGNhcmVmdWwgdG8gYWx3YXlzIGxvY2tcbi8vIGRvd24gbWFwYm94LWdsIHRvIGEgc3BlY2lmaWMgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggdmVyc2lvbi5cbmltcG9ydCBUcmFuc2Zvcm0gZnJvbSAnbWFwYm94LWdsL2pzL2dlby90cmFuc2Zvcm0nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaXRCb3VuZHMod2lkdGgsIGhlaWdodCwgX2JvdW5kcywgb3B0aW9ucykge1xuICBjb25zdCBib3VuZHMgPSBuZXcgTG5nTGF0Qm91bmRzKFtfYm91bmRzWzBdLnJldmVyc2UoKSwgX2JvdW5kc1sxXS5yZXZlcnNlKCldKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBhZGRpbmcgPSB0eXBlb2Ygb3B0aW9ucy5wYWRkaW5nID09PSAndW5kZWZpbmVkJyA/IDAgOiBvcHRpb25zLnBhZGRpbmc7XG4gIGNvbnN0IG9mZnNldCA9IFBvaW50LmNvbnZlcnQoWzAsIDBdKTtcbiAgY29uc3QgdHIgPSBuZXcgVHJhbnNmb3JtKCk7XG4gIHRyLndpZHRoID0gd2lkdGg7XG4gIHRyLmhlaWdodCA9IGhlaWdodDtcbiAgY29uc3QgbncgPSB0ci5wcm9qZWN0KGJvdW5kcy5nZXROb3J0aFdlc3QoKSk7XG4gIGNvbnN0IHNlID0gdHIucHJvamVjdChib3VuZHMuZ2V0U291dGhFYXN0KCkpO1xuICBjb25zdCBzaXplID0gc2Uuc3ViKG53KTtcbiAgY29uc3Qgc2NhbGVYID0gKHRyLndpZHRoIC0gcGFkZGluZyAqIDIgLSBNYXRoLmFicyhvZmZzZXQueCkgKiAyKSAvIHNpemUueDtcbiAgY29uc3Qgc2NhbGVZID0gKHRyLmhlaWdodCAtIHBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LnkpICogMikgLyBzaXplLnk7XG5cbiAgY29uc3QgY2VudGVyID0gdHIudW5wcm9qZWN0KG53LmFkZChzZSkuZGl2KDIpKTtcbiAgY29uc3Qgem9vbSA9IHRyLnNjYWxlWm9vbSh0ci5zY2FsZSAqIE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSk7XG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IGNlbnRlci5sYXQsXG4gICAgbG9uZ2l0dWRlOiBjZW50ZXIubG5nLFxuICAgIHpvb21cbiAgfTtcbn1cbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/fit-bounds.js\n// module id = 1094\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _canvas = require('./canvas.react');\n\nObject.defineProperty(exports, 'CanvasOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_canvas).default;\n  }\n});\n\nvar _choropleth = require('./choropleth.react');\n\nObject.defineProperty(exports, 'ChoroplethOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_choropleth).default;\n  }\n});\n\nvar _draggablePoints = require('./draggable-points.react');\n\nObject.defineProperty(exports, 'DraggablePointsOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_draggablePoints).default;\n  }\n});\n\nvar _html = require('./html.react');\n\nObject.defineProperty(exports, 'HTMLOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_html).default;\n  }\n});\n\nvar _scatterplot = require('./scatterplot.react');\n\nObject.defineProperty(exports, 'ScatterplotOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_scatterplot).default;\n  }\n});\n\nvar _svg = require('./svg.react');\n\nObject.defineProperty(exports, 'SVGOverlay', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_svg).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzsyQ0FBUUEsTzs7Ozs7Ozs7OytDQUNBQSxPOzs7Ozs7Ozs7b0RBQ0FBLE87Ozs7Ozs7Ozt5Q0FDQUEsTzs7Ozs7Ozs7O2dEQUNBQSxPOzs7Ozs7Ozs7d0NBQ0FBLE8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge2RlZmF1bHQgYXMgQ2FudmFzT3ZlcmxheX0gZnJvbSAnLi9jYW52YXMucmVhY3QnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIENob3JvcGxldGhPdmVybGF5fSBmcm9tICcuL2Nob3JvcGxldGgucmVhY3QnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIERyYWdnYWJsZVBvaW50c092ZXJsYXl9IGZyb20gJy4vZHJhZ2dhYmxlLXBvaW50cy5yZWFjdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgSFRNTE92ZXJsYXl9IGZyb20gJy4vaHRtbC5yZWFjdCc7XG5leHBvcnQge2RlZmF1bHQgYXMgU2NhdHRlcnBsb3RPdmVybGF5fSBmcm9tICcuL3NjYXR0ZXJwbG90LnJlYWN0JztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBTVkdPdmVybGF5fSBmcm9tICcuL3N2Zy5yZWFjdCc7XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/index.js\n// module id = 1095\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = require('viewport-mercator-project');\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nvar _window = require('global/window');\n\nvar _window2 = _interopRequireDefault(_window);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n};\n\nvar CanvasOverlay = function (_Component) {\n  _inherits(CanvasOverlay, _Component);\n\n  function CanvasOverlay() {\n    _classCallCheck(this, CanvasOverlay);\n\n    return _possibleConstructorReturn(this, (CanvasOverlay.__proto__ || Object.getPrototypeOf(CanvasOverlay)).apply(this, arguments));\n  }\n\n  _createClass(CanvasOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      this.props.redraw({\n        width: this.props.width,\n        height: this.props.height,\n        ctx: ctx,\n        project: mercator.project,\n        unproject: mercator.unproject,\n        isDragging: this.props.isDragging\n      });\n      ctx.restore();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: this.props.width * pixelRatio,\n        height: this.props.height * pixelRatio,\n        style: {\n          width: this.props.width + 'px',\n          height: this.props.height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return CanvasOverlay;\n}(_react.Component);\n\nexports.default = CanvasOverlay;\n\n\nCanvasOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9jYW52YXMucmVhY3QuanMiXSwibmFtZXMiOlsiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiem9vbSIsInJlZHJhdyIsImZ1bmMiLCJpc0RyYWdnaW5nIiwiYm9vbCIsIkNhbnZhc092ZXJsYXkiLCJfcmVkcmF3IiwicGl4ZWxSYXRpbyIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJjYW52YXMiLCJyZWZzIiwib3ZlcmxheSIsImN0eCIsImdldENvbnRleHQiLCJzYXZlIiwic2NhbGUiLCJtZXJjYXRvciIsInByb3BzIiwicHJvamVjdCIsInVucHJvamVjdCIsInJlc3RvcmUiLCJwb3NpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJsZWZ0IiwidG9wIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7K2VBdkJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9BLElBQU1BLGFBQWE7QUFDakJDLFNBQU9DLG9CQUFVQyxNQUFWLENBQWlCQyxVQURQO0FBRWpCQyxVQUFRSCxvQkFBVUMsTUFBVixDQUFpQkMsVUFGUjtBQUdqQkUsWUFBVUosb0JBQVVDLE1BQVYsQ0FBaUJDLFVBSFY7QUFJakJHLGFBQVdMLG9CQUFVQyxNQUFWLENBQWlCQyxVQUpYO0FBS2pCSSxRQUFNTixvQkFBVUMsTUFBVixDQUFpQkMsVUFMTjtBQU1qQkssVUFBUVAsb0JBQVVRLElBQVYsQ0FBZU4sVUFOTjtBQU9qQk8sY0FBWVQsb0JBQVVVLElBQVYsQ0FBZVI7QUFQVixDQUFuQjs7SUFVcUJTLGE7Ozs7Ozs7Ozs7O3dDQUVDO0FBQ2xCLFdBQUtDLE9BQUw7QUFDRDs7O3lDQUVvQjtBQUNuQixXQUFLQSxPQUFMO0FBQ0Q7Ozs4QkFFUztBQUNSLFVBQU1DLGFBQWFDLGlCQUFPQyxnQkFBUCxJQUEyQixDQUE5QztBQUNBLFVBQU1DLFNBQVMsS0FBS0MsSUFBTCxDQUFVQyxPQUF6QjtBQUNBLFVBQU1DLE1BQU1ILE9BQU9JLFVBQVAsQ0FBa0IsSUFBbEIsQ0FBWjtBQUNBRCxVQUFJRSxJQUFKO0FBQ0FGLFVBQUlHLEtBQUosQ0FBVVQsVUFBVixFQUFzQkEsVUFBdEI7QUFDQSxVQUFNVSxXQUFXLHVDQUFpQixLQUFLQyxLQUF0QixDQUFqQjtBQUNBLFdBQUtBLEtBQUwsQ0FBV2pCLE1BQVgsQ0FBa0I7QUFDaEJSLGVBQU8sS0FBS3lCLEtBQUwsQ0FBV3pCLEtBREY7QUFFaEJJLGdCQUFRLEtBQUtxQixLQUFMLENBQVdyQixNQUZIO0FBR2hCZ0IsZ0JBSGdCO0FBSWhCTSxpQkFBU0YsU0FBU0UsT0FKRjtBQUtoQkMsbUJBQVdILFNBQVNHLFNBTEo7QUFNaEJqQixvQkFBWSxLQUFLZSxLQUFMLENBQVdmO0FBTlAsT0FBbEI7QUFRQVUsVUFBSVEsT0FBSjtBQUNEOzs7NkJBRVE7QUFDUCxVQUFNZCxhQUFhQyxpQkFBT0MsZ0JBQVAsSUFBMkIsQ0FBOUM7QUFDQSxhQUNFO0FBQ0UsYUFBSSxTQUROO0FBRUUsZUFBUSxLQUFLUyxLQUFMLENBQVd6QixLQUFYLEdBQW1CYyxVQUY3QjtBQUdFLGdCQUFTLEtBQUtXLEtBQUwsQ0FBV3JCLE1BQVgsR0FBb0JVLFVBSC9CO0FBSUUsZUFBUTtBQUNOZCxpQkFBVSxLQUFLeUIsS0FBTCxDQUFXekIsS0FBckIsT0FETTtBQUVOSSxrQkFBVyxLQUFLcUIsS0FBTCxDQUFXckIsTUFBdEIsT0FGTTtBQUdOeUIsb0JBQVUsVUFISjtBQUlOQyx5QkFBZSxNQUpUO0FBS05DLGdCQUFNLENBTEE7QUFNTkMsZUFBSztBQU5DLFNBSlYsR0FERjtBQWNEOzs7O0VBNUN3Q0MsZ0I7O2tCQUF0QnJCLGE7OztBQStDckJBLGNBQWNzQixTQUFkLEdBQTBCbkMsVUFBMUIiLCJmaWxlIjoiY2FudmFzLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgbGF0aXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgbG9uZ2l0dWRlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHpvb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVkcmF3OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW52YXNPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIF9yZWRyYXcoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZWZzLm92ZXJsYXk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMucHJvcHMucmVkcmF3KHtcbiAgICAgIHdpZHRoOiB0aGlzLnByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLnByb3BzLmhlaWdodCxcbiAgICAgIGN0eCxcbiAgICAgIHByb2plY3Q6IG1lcmNhdG9yLnByb2plY3QsXG4gICAgICB1bnByb2plY3Q6IG1lcmNhdG9yLnVucHJvamVjdCxcbiAgICAgIGlzRHJhZ2dpbmc6IHRoaXMucHJvcHMuaXNEcmFnZ2luZ1xuICAgIH0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgcmV0dXJuIChcbiAgICAgIDxjYW52YXNcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgdGhpcy5wcm9wcy53aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyB0aGlzLnByb3BzLmhlaWdodCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBzdHlsZT17IHtcbiAgICAgICAgICB3aWR0aDogYCR7dGhpcy5wcm9wcy53aWR0aH1weGAsXG4gICAgICAgICAgaGVpZ2h0OiBgJHt0aGlzLnByb3BzLmhlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgdG9wOiAwXG4gICAgICAgIH0gfS8+XG4gICAgKTtcbiAgfVxufVxuXG5DYW52YXNPdmVybGF5LnByb3BUeXBlcyA9IFBST1BfVFlQRVM7XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/canvas.react.js\n// module id = 1096\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = require('viewport-mercator-project');\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nvar _window = require('global/window');\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _d = require('d3');\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = require('immutable');\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  renderWhileDragging: _propTypes2.default.bool.isRequired,\n  globalOpacity: _propTypes2.default.number.isRequired,\n  /**\n    * An Immutable List of feature objects.\n    */\n  features: _propTypes2.default.instanceOf(_immutable2.default.List),\n  colorDomain: _propTypes2.default.array,\n  colorRange: _propTypes2.default.array.isRequired,\n  valueAccessor: _propTypes2.default.func.isRequired\n};\n\nvar DEFAULT_PROPS = {\n  renderWhileDragging: true,\n  globalOpacity: 1,\n  colorDomain: null,\n  colorRange: ['#FFFFFF', '#1FBAD6'],\n  valueAccessor: function valueAccessor(feature) {\n    return feature.get('properties').get('value');\n  }\n};\n\nvar ChoroplethOverlay = function (_Component) {\n  _inherits(ChoroplethOverlay, _Component);\n\n  function ChoroplethOverlay() {\n    _classCallCheck(this, ChoroplethOverlay);\n\n    return _possibleConstructorReturn(this, (ChoroplethOverlay.__proto__ || Object.getPrototypeOf(ChoroplethOverlay)).apply(this, arguments));\n  }\n\n  _createClass(ChoroplethOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var pixelRatio = _window2.default.devicePixelRatio;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      ctx.clearRect(0, 0, this.props.width, this.props.height);\n\n      function projectPoint(lon, lat) {\n        var point = mercator.project([lon, lat]);\n        /* eslint-disable no-invalid-this */\n        this.stream.point(point[0], point[1]);\n        /* eslint-enable no-invalid-this */\n      }\n\n      if (this.props.renderWhileDragging || !this.props.isDragging) {\n        var transform = _d2.default.geo.transform({ point: projectPoint });\n        var path = _d2.default.geo.path().projection(transform).context(ctx);\n        this._drawFeatures(ctx, path);\n      }\n      ctx.restore();\n    }\n  }, {\n    key: '_drawFeatures',\n    value: function _drawFeatures(ctx, path) {\n      var features = this.props.features;\n\n      if (!features) {\n        return;\n      }\n      var colorDomain = this.props.colorDomain || _d2.default.extent(features.toArray(), this.props.valueAccessor);\n\n      var colorScale = _d2.default.scale.linear().domain(colorDomain).range(this.props.colorRange).clamp(true);\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = features[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var feature = _step.value;\n\n          ctx.beginPath();\n          ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';\n          ctx.lineWidth = '1';\n          ctx.fillStyle = colorScale(this.props.valueAccessor(feature));\n          var geometry = feature.get('geometry');\n          path({\n            type: geometry.get('type'),\n            coordinates: geometry.get('coordinates').toJS()\n          });\n          ctx.fill();\n          ctx.stroke();\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: this.props.width * pixelRatio,\n        height: this.props.height * pixelRatio,\n        style: {\n          width: this.props.width + 'px',\n          height: this.props.height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          opacity: this.props.globalOpacity,\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return ChoroplethOverlay;\n}(_react.Component);\n\nexports.default = ChoroplethOverlay;\n\n\nChoroplethOverlay.propTypes = PROP_TYPES;\nChoroplethOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9jaG9yb3BsZXRoLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInpvb20iLCJpc0RyYWdnaW5nIiwiYm9vbCIsInJlbmRlcldoaWxlRHJhZ2dpbmciLCJnbG9iYWxPcGFjaXR5IiwiZmVhdHVyZXMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImNvbG9yRG9tYWluIiwiYXJyYXkiLCJjb2xvclJhbmdlIiwidmFsdWVBY2Nlc3NvciIsImZ1bmMiLCJERUZBVUxUX1BST1BTIiwiZmVhdHVyZSIsImdldCIsIkNob3JvcGxldGhPdmVybGF5IiwiX3JlZHJhdyIsInBpeGVsUmF0aW8iLCJ3aW5kb3ciLCJkZXZpY2VQaXhlbFJhdGlvIiwiY2FudmFzIiwicmVmcyIsIm92ZXJsYXkiLCJjdHgiLCJnZXRDb250ZXh0IiwibWVyY2F0b3IiLCJwcm9wcyIsInNhdmUiLCJzY2FsZSIsImNsZWFyUmVjdCIsInByb2plY3RQb2ludCIsImxvbiIsImxhdCIsInBvaW50IiwicHJvamVjdCIsInN0cmVhbSIsInRyYW5zZm9ybSIsImQzIiwiZ2VvIiwicGF0aCIsInByb2plY3Rpb24iLCJjb250ZXh0IiwiX2RyYXdGZWF0dXJlcyIsInJlc3RvcmUiLCJleHRlbnQiLCJ0b0FycmF5IiwiY29sb3JTY2FsZSIsImxpbmVhciIsImRvbWFpbiIsInJhbmdlIiwiY2xhbXAiLCJiZWdpblBhdGgiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImZpbGxTdHlsZSIsImdlb21ldHJ5IiwidHlwZSIsImNvb3JkaW5hdGVzIiwidG9KUyIsImZpbGwiLCJzdHJva2UiLCJwb3NpdGlvbiIsInBvaW50ZXJFdmVudHMiLCJvcGFjaXR5IiwibGVmdCIsInRvcCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIs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Ozs2QkFFUTtBQUNQLFVBQU0zQyxhQUFhQyxpQkFBT0MsZ0JBQVAsSUFBMkIsQ0FBOUM7QUFDQSxhQUNFO0FBQ0UsYUFBSSxTQUROO0FBRUUsZUFBUSxLQUFLTyxLQUFMLENBQVduQyxLQUFYLEdBQW1CMEIsVUFGN0I7QUFHRSxnQkFBUyxLQUFLUyxLQUFMLENBQVcvQixNQUFYLEdBQW9Cc0IsVUFIL0I7QUFJRSxlQUFRO0FBQ04xQixpQkFBVSxLQUFLbUMsS0FBTCxDQUFXbkMsS0FBckIsT0FETTtBQUVOSSxrQkFBVyxLQUFLK0IsS0FBTCxDQUFXL0IsTUFBdEIsT0FGTTtBQUdOa0Usb0JBQVUsVUFISjtBQUlOQyx5QkFBZSxNQUpUO0FBS05DLG1CQUFTLEtBQUtyQyxLQUFMLENBQVd4QixhQUxkO0FBTU44RCxnQkFBTSxDQU5BO0FBT05DLGVBQUs7QUFQQyxTQUpWLEdBREY7QUFlRDs7OztFQWhGNENDLGdCOztrQkFBMUJuRCxpQjs7O0FBbUZyQkEsa0JBQWtCb0QsU0FBbEIsR0FBOEI3RSxVQUE5QjtBQUNBeUIsa0JBQWtCcUQsWUFBbEIsR0FBaUN4RCxhQUFqQyIsImZpbGUiOiJjaG9yb3BsZXRoLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBWaWV3cG9ydE1lcmNhdG9yIGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICByZW5kZXJXaGlsZURyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBnbG9iYWxPcGFjaXR5OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIC8qKlxuICAgICogQW4gSW1tdXRhYmxlIExpc3Qgb2YgZmVhdHVyZSBvYmplY3RzLlxuICAgICovXG4gIGZlYXR1cmVzOiBQcm9wVHlwZXMuaW5zdGFuY2VPZihJbW11dGFibGUuTGlzdCksXG4gIGNvbG9yRG9tYWluOiBQcm9wVHlwZXMuYXJyYXksXG4gIGNvbG9yUmFuZ2U6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICB2YWx1ZUFjY2Vzc29yOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBERUZBVUxUX1BST1BTID0ge1xuICByZW5kZXJXaGlsZURyYWdnaW5nOiB0cnVlLFxuICBnbG9iYWxPcGFjaXR5OiAxLFxuICBjb2xvckRvbWFpbjogbnVsbCxcbiAgY29sb3JSYW5nZTogWycjRkZGRkZGJywgJyMxRkJBRDYnXSxcbiAgdmFsdWVBY2Nlc3NvcihmZWF0dXJlKSB7XG4gICAgcmV0dXJuIGZlYXR1cmUuZ2V0KCdwcm9wZXJ0aWVzJykuZ2V0KCd2YWx1ZScpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaG9yb3BsZXRoT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gIH1cblxuICBfcmVkcmF3KCkge1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLnJlZnMub3ZlcmxheTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb25zdCBtZXJjYXRvciA9IFZpZXdwb3J0TWVyY2F0b3IodGhpcy5wcm9wcyk7XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMucHJvcHMud2lkdGgsIHRoaXMucHJvcHMuaGVpZ2h0KTtcblxuICAgIGZ1bmN0aW9uIHByb2plY3RQb2ludChsb24sIGxhdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBtZXJjYXRvci5wcm9qZWN0KFtsb24sIGxhdF0pO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG4gICAgICB0aGlzLnN0cmVhbS5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5yZW5kZXJXaGlsZURyYWdnaW5nIHx8ICF0aGlzLnByb3BzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGQzLmdlby50cmFuc2Zvcm0oe3BvaW50OiBwcm9qZWN0UG9pbnR9KTtcbiAgICAgIGNvbnN0IHBhdGggPSBkMy5nZW8ucGF0aCgpLnByb2plY3Rpb24odHJhbnNmb3JtKS5jb250ZXh0KGN0eCk7XG4gICAgICB0aGlzLl9kcmF3RmVhdHVyZXMoY3R4LCBwYXRoKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIF9kcmF3RmVhdHVyZXMoY3R4LCBwYXRoKSB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFmZWF0dXJlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xvckRvbWFpbiA9IHRoaXMucHJvcHMuY29sb3JEb21haW4gfHxcbiAgICAgIGQzLmV4dGVudChmZWF0dXJlcy50b0FycmF5KCksIHRoaXMucHJvcHMudmFsdWVBY2Nlc3Nvcik7XG5cbiAgICBjb25zdCBjb2xvclNjYWxlID0gZDMuc2NhbGUubGluZWFyKClcbiAgICAgIC5kb21haW4oY29sb3JEb21haW4pXG4gICAgICAucmFuZ2UodGhpcy5wcm9wcy5jb2xvclJhbmdlKVxuICAgICAgLmNsYW1wKHRydWUpO1xuXG4gICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJztcbiAgICAgIGN0eC5saW5lV2lkdGggPSAnMSc7XG4gICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JTY2FsZSh0aGlzLnByb3BzLnZhbHVlQWNjZXNzb3IoZmVhdHVyZSkpO1xuICAgICAgY29uc3QgZ2VvbWV0cnkgPSBmZWF0dXJlLmdldCgnZ2VvbWV0cnknKTtcbiAgICAgIHBhdGgoe1xuICAgICAgICB0eXBlOiBnZW9tZXRyeS5nZXQoJ3R5cGUnKSxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGdlb21ldHJ5LmdldCgnY29vcmRpbmF0ZXMnKS50b0pTKClcbiAgICAgIH0pO1xuICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgcmV0dXJuIChcbiAgICAgIDxjYW52YXNcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgdGhpcy5wcm9wcy53aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyB0aGlzLnByb3BzLmhlaWdodCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBzdHlsZT17IHtcbiAgICAgICAgICB3aWR0aDogYCR7dGhpcy5wcm9wcy53aWR0aH1weGAsXG4gICAgICAgICAgaGVpZ2h0OiBgJHt0aGlzLnByb3BzLmhlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIG9wYWNpdHk6IHRoaXMucHJvcHMuZ2xvYmFsT3BhY2l0eSxcbiAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgIHRvcDogMFxuICAgICAgICB9IH0vPlxuICAgICk7XG4gIH1cbn1cblxuQ2hvcm9wbGV0aE92ZXJsYXkucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcbkNob3JvcGxldGhPdmVybGF5LmRlZmF1bHRQcm9wcyA9IERFRkFVTFRfUFJPUFM7XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/choropleth.react.js\n// module id = 1097\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _desc, _value, _class; // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _autobindDecorator = require('autobind-decorator');\n\nvar _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);\n\nvar _immutable = require('immutable');\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _svgTransform = require('svg-transform');\n\nvar _svgTransform2 = _interopRequireDefault(_svgTransform);\n\nvar _document = require('global/document');\n\nvar _document2 = _interopRequireDefault(_document);\n\nvar _noop = require('../noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nvar _config = require('../config');\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _utils = require('../utils');\n\nvar _viewportMercatorProject = require('viewport-mercator-project');\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object['ke' + 'ys'](descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object['define' + 'Property'](target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  points: _propTypes2.default.instanceOf(_immutable2.default.List).isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  keyAccessor: _propTypes2.default.func.isRequired,\n  lngLatAccessor: _propTypes2.default.func.isRequired,\n  onAddPoint: _propTypes2.default.func.isRequired,\n  onUpdatePoint: _propTypes2.default.func.isRequired,\n  renderPoint: _propTypes2.default.func.isRequired\n};\n\nvar DEFAULT_PROPS = {\n  keyAccessor: function keyAccessor(point) {\n    return point.get('id');\n  },\n  lngLatAccessor: function lngLatAccessor(point) {\n    return point.get('location').toArray();\n  },\n\n  onAddPoint: _noop2.default,\n  onUpdatePoint: _noop2.default,\n  renderPoint: _noop2.default,\n  isDragging: false\n};\n\nvar DraggablePointsOverlay = (_class = function (_Component) {\n  _inherits(DraggablePointsOverlay, _Component);\n\n  function DraggablePointsOverlay(props) {\n    _classCallCheck(this, DraggablePointsOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DraggablePointsOverlay.__proto__ || Object.getPrototypeOf(DraggablePointsOverlay)).call(this, props));\n\n    _this.state = {\n      draggedPointKey: null\n    };\n    return _this;\n  }\n\n  _createClass(DraggablePointsOverlay, [{\n    key: '_onDragStart',\n    value: function _onDragStart(point, event) {\n      event.stopPropagation();\n      _document2.default.addEventListener('mousemove', this._onDrag, false);\n      _document2.default.addEventListener('mouseup', this._onDragEnd, false);\n      this.setState({ draggedPointKey: this.props.keyAccessor(point) });\n    }\n  }, {\n    key: '_onDrag',\n    value: function _onDrag(event) {\n      event.stopPropagation();\n      var pixel = (0, _utils.relativeMousePosition)(this.refs.container, event);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var lngLat = mercator.unproject(pixel);\n      var key = this.state.draggedPointKey;\n      this.props.onUpdatePoint({ key: key, location: lngLat });\n    }\n  }, {\n    key: '_onDragEnd',\n    value: function _onDragEnd(event) {\n      event.stopPropagation();\n      _document2.default.removeEventListener('mousemove', this._onDrag, false);\n      _document2.default.removeEventListener('mouseup', this._onDragEnd, false);\n      this.setState({ draggedPoint: null });\n    }\n  }, {\n    key: '_addPoint',\n    value: function _addPoint(event) {\n      event.stopPropagation();\n      event.preventDefault();\n      var pixel = (0, _utils.relativeMousePosition)(this.refs.container, event);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      this.props.onAddPoint(mercator.unproject(pixel));\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props = this.props,\n          points = _props.points,\n          width = _props.width,\n          height = _props.height,\n          isDragging = _props.isDragging,\n          style = _props.style;\n\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      return _react2.default.createElement(\n        'svg',\n        {\n          ref: 'container',\n          width: width,\n          height: height,\n          style: _extends({\n            pointerEvents: 'all',\n            position: 'absolute',\n            left: 0,\n            top: 0,\n            cursor: isDragging ? _config2.default.CURSOR.GRABBING : _config2.default.CURSOR.GRAB\n          }, style),\n          onContextMenu: this._addPoint },\n        _react2.default.createElement(\n          'g',\n          { style: { cursor: 'pointer' } },\n          points.map(function (point, index) {\n            var pixel = mercator.project(_this2.props.lngLatAccessor(point));\n            return _react2.default.createElement(\n              'g',\n              {\n                key: index,\n                style: { pointerEvents: 'all' },\n                transform: (0, _svgTransform2.default)([{ translate: pixel }]),\n                onMouseDown: _this2._onDragStart.bind(_this2, point) },\n              _this2.props.renderPoint.call(_this2, point, pixel)\n            );\n          })\n        )\n      );\n    }\n  }]);\n\n  return DraggablePointsOverlay;\n}(_react.Component), (_applyDecoratedDescriptor(_class.prototype, '_onDragStart', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDragStart'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onDrag', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDrag'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_onDragEnd', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_onDragEnd'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_addPoint', [_autobindDecorator2.default], Object.getOwnPropertyDescriptor(_class.prototype, '_addPoint'), _class.prototype)), _class);\nexports.default = DraggablePointsOverlay;\n\n\nDraggablePointsOverlay.propTypes = PROP_TYPES;\nDraggablePointsOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9kcmFnZ2FibGUtcG9pbnRzLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInpvb20iLCJwb2ludHMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImlzRHJhZ2dpbmciLCJib29sIiwia2V5QWNjZXNzb3IiLCJmdW5jIiwibG5nTGF0QWNjZXNzb3IiLCJvbkFkZFBvaW50Iiwib25VcGRhdGVQb2ludCIsInJlbmRlclBvaW50IiwiREVGQVVMVF9QUk9QUyIsInBvaW50IiwiZ2V0IiwidG9BcnJheSIsIm5vb3AiLCJEcmFnZ2FibGVQb2ludHNPdmVybGF5IiwicHJvcHMiLCJzdGF0ZSIsImRyYWdnZWRQb2ludEtleSIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uRHJhZyIsIl9vbkRyYWdFbmQiLCJzZXRTdGF0ZSIsInBpeGVsIiwicmVmcyIsImNvbnRhaW5lciIsIm1lcmNhdG9yIiwibG5nTGF0IiwidW5wcm9qZWN0Iiwia2V5IiwibG9jYXRpb24iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZHJhZ2dlZFBvaW50IiwicHJldmVudERlZmF1bHQiLCJzdHlsZSIsInBvaW50ZXJFdmVudHMiLCJwb3NpdGlvbiIsImxlZnQiLCJ0b3AiLCJjdXJzb3IiLCJjb25maWciLCJDVVJTT1IiLCJHUkFCQklORyIsIkdSQUIiLCJfYWRkUG9pbnQiLCJtYXAiLCJpbmRleCIsInByb2plY3QiLCJ0cmFuc2xhdGUiLCJfb25EcmFnU3RhcnQiLCJiaW5kIiwiY2FsbCIsIkNvbXBvbmVudCIsImF1dG9iaW5kIiwicHJvcFR5cGVzIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzsyQkFBQTs7QUFFQTtB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Q0FBakIsQ0FBZDtBQUNBLG1CQUNFO0FBQUE7QUFBQTtBQUNFLHFCQUFNc0MsS0FEUjtBQUVFLHVCQUFRLEVBQUNYLGVBQWUsS0FBaEIsRUFGVjtBQUdFLDJCQUFZLDRCQUFVLENBQUMsRUFBQ2EsV0FBV3pCLEtBQVosRUFBRCxDQUFWLENBSGQ7QUFJRSw2QkFBYyxPQUFLMEIsWUFBTCxDQUFrQkMsSUFBbEIsQ0FBdUIsTUFBdkIsRUFBNkIxQyxLQUE3QixDQUpoQjtBQU1JLHFCQUFLSyxLQUFMLENBQVdQLFdBQVgsQ0FBdUI2QyxJQUF2QixDQUE0QixNQUE1QixFQUFrQzNDLEtBQWxDLEVBQXlDZSxLQUF6QztBQU5KLGFBREY7QUFXRCxXQWJEO0FBRkY7QUFkRixPQURGO0FBbUNEOzs7O0VBbEZpRDZCLGdCLGlFQVNqREMsMkIsaUpBUUFBLDJCLCtJQVVBQSwyQixpSkFRQUEsMkI7a0JBbkNrQnpDLHNCOzs7QUFxRnJCQSx1QkFBdUIwQyxTQUF2QixHQUFtQ3BFLFVBQW5DO0FBQ0EwQix1QkFBdUIyQyxZQUF2QixHQUFzQ2hELGFBQXRDIiwiZmlsZSI6ImRyYWdnYWJsZS1wb2ludHMucmVhY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cblxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgYXV0b2JpbmQgZnJvbSAnYXV0b2JpbmQtZGVjb3JhdG9yJztcblxuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJ3N2Zy10cmFuc2Zvcm0nO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgbm9vcCBmcm9tICcuLi9ub29wJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7cmVsYXRpdmVNb3VzZVBvc2l0aW9uIGFzIG1vdXNlfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgVmlld3BvcnRNZXJjYXRvciBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcblxuY29uc3QgUFJPUF9UWVBFUyA9IHtcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxhdGl0dWRlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxvbmdpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB6b29tOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBvaW50czogUHJvcFR5cGVzLmluc3RhbmNlT2YoSW1tdXRhYmxlLkxpc3QpLmlzUmVxdWlyZWQsXG4gIGlzRHJhZ2dpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGtleUFjY2Vzc29yOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBsbmdMYXRBY2Nlc3NvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25BZGRQb2ludDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25VcGRhdGVQb2ludDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgcmVuZGVyUG9pbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IERFRkFVTFRfUFJPUFMgPSB7XG4gIGtleUFjY2Vzc29yKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50LmdldCgnaWQnKTtcbiAgfSxcbiAgbG5nTGF0QWNjZXNzb3IocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnQuZ2V0KCdsb2NhdGlvbicpLnRvQXJyYXkoKTtcbiAgfSxcbiAgb25BZGRQb2ludDogbm9vcCxcbiAgb25VcGRhdGVQb2ludDogbm9vcCxcbiAgcmVuZGVyUG9pbnQ6IG5vb3AsXG4gIGlzRHJhZ2dpbmc6IGZhbHNlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnZ2FibGVQb2ludHNPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ2dlZFBvaW50S2V5OiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnU3RhcnQocG9pbnQsIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25EcmFnLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uRHJhZ0VuZCwgZmFsc2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdnZWRQb2ludEtleTogdGhpcy5wcm9wcy5rZXlBY2Nlc3Nvcihwb2ludCl9KTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcGl4ZWwgPSBtb3VzZSh0aGlzLnJlZnMuY29udGFpbmVyLCBldmVudCk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIGNvbnN0IGxuZ0xhdCA9IG1lcmNhdG9yLnVucHJvamVjdChwaXhlbCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zdGF0ZS5kcmFnZ2VkUG9pbnRLZXk7XG4gICAgdGhpcy5wcm9wcy5vblVwZGF0ZVBvaW50KHtrZXksIGxvY2F0aW9uOiBsbmdMYXR9KTtcbiAgfVxuXG4gIEBhdXRvYmluZFxuICBfb25EcmFnRW5kKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25EcmFnLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uRHJhZ0VuZCwgZmFsc2UpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2RyYWdnZWRQb2ludDogbnVsbH0pO1xuICB9XG5cbiAgQGF1dG9iaW5kXG4gIF9hZGRQb2ludChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGl4ZWwgPSBtb3VzZSh0aGlzLnJlZnMuY29udGFpbmVyLCBldmVudCk7XG4gICAgY29uc3QgbWVyY2F0b3IgPSBWaWV3cG9ydE1lcmNhdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMucHJvcHMub25BZGRQb2ludChtZXJjYXRvci51bnByb2plY3QocGl4ZWwpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7cG9pbnRzLCB3aWR0aCwgaGVpZ2h0LCBpc0RyYWdnaW5nLCBzdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1lcmNhdG9yID0gVmlld3BvcnRNZXJjYXRvcih0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPHN2Z1xuICAgICAgICByZWY9XCJjb250YWluZXJcIlxuICAgICAgICB3aWR0aD17IHdpZHRoIH1cbiAgICAgICAgaGVpZ2h0PXsgaGVpZ2h0IH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCcsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgY3Vyc29yOiBpc0RyYWdnaW5nID8gY29uZmlnLkNVUlNPUi5HUkFCQklORyA6IGNvbmZpZy5DVVJTT1IuR1JBQixcbiAgICAgICAgICAuLi5zdHlsZVxuICAgICAgICB9IH1cbiAgICAgICAgb25Db250ZXh0TWVudT17IHRoaXMuX2FkZFBvaW50IH0+XG5cbiAgICAgICAgPGcgc3R5bGU9eyB7Y3Vyc29yOiAncG9pbnRlcid9IH0+XG4gICAgICAgIHtcbiAgICAgICAgICBwb2ludHMubWFwKChwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gbWVyY2F0b3IucHJvamVjdCh0aGlzLnByb3BzLmxuZ0xhdEFjY2Vzc29yKHBvaW50KSk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Z1xuICAgICAgICAgICAgICAgIGtleT17IGluZGV4IH1cbiAgICAgICAgICAgICAgICBzdHlsZT17IHtwb2ludGVyRXZlbnRzOiAnYWxsJ30gfVxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybT17IHRyYW5zZm9ybShbe3RyYW5zbGF0ZTogcGl4ZWx9XSkgfVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXsgdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzLCBwb2ludCkgfT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbmRlclBvaW50LmNhbGwodGhpcywgcG9pbnQsIHBpeGVsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgICk7XG4gIH1cbn1cblxuRHJhZ2dhYmxlUG9pbnRzT3ZlcmxheS5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuRHJhZ2dhYmxlUG9pbnRzT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSBERUZBVUxUX1BST1BTO1xuIl19\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/draggable-points.react.js\n// module id = 1098\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function transform(props) {\n  var transform = [];\n  if (Array.isArray(props)) {\n    props.forEach(function forEachAccessor(prop) {\n      var key = Object.keys(prop)[0];\n      transform.push(key + '(' + prop[key] + ')');\n    });\n  }\n  return transform.join(' ');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/svg-transform/index.js\n// module id = 1099\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.relativeMousePosition = relativeMousePosition;\n// Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nfunction relativeMousePosition(container, event) {\n  var rect = container.getBoundingClientRect();\n  var x = event.clientX - rect.left - container.clientLeft;\n  var y = event.clientY - rect.top - container.clientTop;\n  return [x, y];\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJyZWxhdGl2ZU1vdXNlUG9zaXRpb24iLCJjb250YWluZXIiLCJldmVudCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ4IiwiY2xpZW50WCIsImxlZnQiLCJjbGllbnRMZWZ0IiwieSIsImNsaWVudFkiLCJ0b3AiLCJjbGllbnRUb3AiXSwibWFwcGluZ3MiOiI7Ozs7O1FBb0JnQkEscUIsR0FBQUEscUI7QUFwQmhCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNBLHFCQUFULENBQStCQyxTQUEvQixFQUEwQ0MsS0FBMUMsRUFBaUQ7QUFDdEQsTUFBTUMsT0FBT0YsVUFBVUcscUJBQVYsRUFBYjtBQUNBLE1BQU1DLElBQUlILE1BQU1JLE9BQU4sR0FBZ0JILEtBQUtJLElBQXJCLEdBQTRCTixVQUFVTyxVQUFoRDtBQUNBLE1BQU1DLElBQUlQLE1BQU1RLE9BQU4sR0FBZ0JQLEtBQUtRLEdBQXJCLEdBQTJCVixVQUFVVyxTQUEvQztBQUNBLFNBQU8sQ0FBQ1AsQ0FBRCxFQUFJSSxDQUFKLENBQVA7QUFDRCIsImZpbGUiOiJ1dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxNSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZU1vdXNlUG9zaXRpb24oY29udGFpbmVyLCBldmVudCkge1xuICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0O1xuICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcDtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbiJdfQ==\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/utils.js\n// module id = 1100\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  project: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n  // TODO: style\n};\n\nvar HTMLOverlay = function (_Component) {\n  _inherits(HTMLOverlay, _Component);\n\n  function HTMLOverlay() {\n    _classCallCheck(this, HTMLOverlay);\n\n    return _possibleConstructorReturn(this, (HTMLOverlay.__proto__ || Object.getPrototypeOf(HTMLOverlay)).apply(this, arguments));\n  }\n\n  _createClass(HTMLOverlay, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          project = _props.project,\n          isDragging = _props.isDragging;\n\n      var style = _extends({\n        position: 'absolute',\n        pointerEvents: 'none',\n        left: 0,\n        top: 0,\n        width: width,\n        height: height\n      }, this.props.style);\n      return _react2.default.createElement(\n        'div',\n        { ref: 'overlay', style: style },\n        this.props.redraw({ width: width, height: height, project: project, isDragging: isDragging })\n      );\n    }\n  }]);\n\n  return HTMLOverlay;\n}(_react.Component);\n\nexports.default = HTMLOverlay;\n\n\nHTMLOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9odG1sLnJlYWN0LmpzIl0sIm5hbWVzIjpbIlBST1BfVFlQRVMiLCJ3aWR0aCIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJoZWlnaHQiLCJyZWRyYXciLCJmdW5jIiwicHJvamVjdCIsImlzRHJhZ2dpbmciLCJib29sIiwiSFRNTE92ZXJsYXkiLCJwcm9wcyIsInN0eWxlIiwicG9zaXRpb24iLCJwb2ludGVyRXZlbnRzIiwibGVmdCIsInRvcCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7Ozs7Ozs7OzsrZUFyQkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBS0EsSUFBTUEsYUFBYTtBQUNqQkMsU0FBT0Msb0JBQVVDLE1BQVYsQ0FBaUJDLFVBRFA7QUFFakJDLFVBQVFILG9CQUFVQyxNQUFWLENBQWlCQyxVQUZSO0FBR2pCRSxVQUFRSixvQkFBVUssSUFBVixDQUFlSCxVQUhOO0FBSWpCSSxXQUFTTixvQkFBVUssSUFBVixDQUFlSCxVQUpQO0FBS2pCSyxjQUFZUCxvQkFBVVEsSUFBVixDQUFlTjtBQUMzQjtBQU5pQixDQUFuQjs7SUFTcUJPLFc7Ozs7Ozs7Ozs7OzZCQUVWO0FBQUEsbUJBQ3NDLEtBQUtDLEtBRDNDO0FBQUEsVUFDQVgsS0FEQSxVQUNBQSxLQURBO0FBQUEsVUFDT0ksTUFEUCxVQUNPQSxNQURQO0FBQUEsVUFDZUcsT0FEZixVQUNlQSxPQURmO0FBQUEsVUFDd0JDLFVBRHhCLFVBQ3dCQSxVQUR4Qjs7QUFFUCxVQUFNSTtBQUNKQyxrQkFBVSxVQUROO0FBRUpDLHVCQUFlLE1BRlg7QUFHSkMsY0FBTSxDQUhGO0FBSUpDLGFBQUssQ0FKRDtBQUtKaEIsb0JBTEk7QUFNSkk7QUFOSSxTQU9ELEtBQUtPLEtBQUwsQ0FBV0MsS0FQVixDQUFOO0FBU0EsYUFDRTtBQUFBO0FBQUEsVUFBSyxLQUFJLFNBQVQsRUFBbUIsT0FBUUEsS0FBM0I7QUFDSSxhQUFLRCxLQUFMLENBQVdOLE1BQVgsQ0FBa0IsRUFBQ0wsWUFBRCxFQUFRSSxjQUFSLEVBQWdCRyxnQkFBaEIsRUFBeUJDLHNCQUF6QixFQUFsQjtBQURKLE9BREY7QUFLRDs7OztFQWxCc0NTLGdCOztrQkFBcEJQLFc7OztBQXFCckJBLFlBQVlRLFNBQVosR0FBd0JuQixVQUF4QiIsImZpbGUiOiJodG1sLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCBQUk9QX1RZUEVTID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVkcmF3OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBwcm9qZWN0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXG4gIC8vIFRPRE86IHN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MT3ZlcmxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBwcm9qZWN0LCBpc0RyYWdnaW5nfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIC4uLnRoaXMucHJvcHMuc3R5bGVcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj1cIm92ZXJsYXlcIiBzdHlsZT17IHN0eWxlIH0+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5yZWRyYXcoe3dpZHRoLCBoZWlnaHQsIHByb2plY3QsIGlzRHJhZ2dpbmd9KSB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbkhUTUxPdmVybGF5LnByb3BUeXBlcyA9IFBST1BfVFlQRVM7XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/html.react.js\n// module id = 1101\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _window = require('global/window');\n\nvar _window2 = _interopRequireDefault(_window);\n\nvar _d = require('d3');\n\nvar _d2 = _interopRequireDefault(_d);\n\nvar _immutable = require('immutable');\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _canvasCompositeTypes = require('canvas-composite-types');\n\nvar _canvasCompositeTypes2 = _interopRequireDefault(_canvasCompositeTypes);\n\nvar _viewportMercatorProject = require('viewport-mercator-project');\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired,\n  locations: _propTypes2.default.instanceOf(_immutable2.default.List).isRequired,\n  lngLatAccessor: _propTypes2.default.func.isRequired,\n  renderWhileDragging: _propTypes2.default.bool,\n  globalOpacity: _propTypes2.default.number.isRequired,\n  dotRadius: _propTypes2.default.number.isRequired,\n  dotFill: _propTypes2.default.string.isRequired,\n  compositeOperation: _propTypes2.default.oneOf(_canvasCompositeTypes2.default).isRequired\n};\n\nvar DEFAULT_PROPS = {\n  lngLatAccessor: function lngLatAccessor(location) {\n    return [location.get(0), location.get(1)];\n  },\n\n  renderWhileDragging: true,\n  dotRadius: 4,\n  dotFill: '#1FBAD6',\n  globalOpacity: 1,\n  // Same as browser default.\n  compositeOperation: 'source-over'\n};\n\nvar ScatterplotOverlay = function (_Component) {\n  _inherits(ScatterplotOverlay, _Component);\n\n  function ScatterplotOverlay() {\n    _classCallCheck(this, ScatterplotOverlay);\n\n    return _possibleConstructorReturn(this, (ScatterplotOverlay.__proto__ || Object.getPrototypeOf(ScatterplotOverlay)).apply(this, arguments));\n  }\n\n  _createClass(ScatterplotOverlay, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._redraw();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this._redraw();\n    }\n\n    /* eslint-disable max-statements */\n\n  }, {\n    key: '_redraw',\n    value: function _redraw() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          dotRadius = _props.dotRadius,\n          dotFill = _props.dotFill,\n          compositeOperation = _props.compositeOperation,\n          renderWhileDragging = _props.renderWhileDragging,\n          isDragging = _props.isDragging,\n          locations = _props.locations,\n          lngLatAccessor = _props.lngLatAccessor;\n\n\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      var canvas = this.refs.overlay;\n      var ctx = canvas.getContext('2d');\n\n      ctx.save();\n      ctx.scale(pixelRatio, pixelRatio);\n      ctx.clearRect(0, 0, width, height);\n      ctx.globalCompositeOperation = compositeOperation;\n\n      if ((renderWhileDragging || !isDragging) && locations) {\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n          for (var _iterator = locations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n            var location = _step.value;\n\n            var pixel = mercator.project(lngLatAccessor(location));\n            var pixelRounded = [_d2.default.round(pixel[0], 1), _d2.default.round(pixel[1], 1)];\n            if (pixelRounded[0] + dotRadius >= 0 && pixelRounded[0] - dotRadius < width && pixelRounded[1] + dotRadius >= 0 && pixelRounded[1] - dotRadius < height) {\n              ctx.fillStyle = dotFill;\n              ctx.beginPath();\n              ctx.arc(pixelRounded[0], pixelRounded[1], dotRadius, 0, Math.PI * 2);\n              ctx.fill();\n            }\n          }\n        } catch (err) {\n          _didIteratorError = true;\n          _iteratorError = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion && _iterator.return) {\n              _iterator.return();\n            }\n          } finally {\n            if (_didIteratorError) {\n              throw _iteratorError;\n            }\n          }\n        }\n      }\n\n      ctx.restore();\n    }\n    /* eslint-enable max-statements */\n\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          width = _props2.width,\n          height = _props2.height,\n          globalOpacity = _props2.globalOpacity;\n\n      var pixelRatio = _window2.default.devicePixelRatio || 1;\n      return _react2.default.createElement('canvas', {\n        ref: 'overlay',\n        width: width * pixelRatio,\n        height: height * pixelRatio,\n        style: {\n          width: width + 'px',\n          height: height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          opacity: globalOpacity,\n          left: 0,\n          top: 0\n        } });\n    }\n  }]);\n\n  return ScatterplotOverlay;\n}(_react.Component);\n\nexports.default = ScatterplotOverlay;\n\n\nScatterplotOverlay.propTypes = PROP_TYPES;\nScatterplotOverlay.defaultProps = DEFAULT_PROPS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9zY2F0dGVycGxvdC5yZWFjdC5qcyJdLCJuYW1lcyI6WyJQUk9QX1RZUEVTIiwid2lkdGgiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiaGVpZ2h0IiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiaXNEcmFnZ2luZyIsImJvb2wiLCJsb2NhdGlvbnMiLCJpbnN0YW5jZU9mIiwiSW1tdXRhYmxlIiwiTGlzdCIsImxuZ0xhdEFjY2Vzc29yIiwiZnVuYyIsInJlbmRlcldoaWxlRHJhZ2dpbmciLCJnbG9iYWxPcGFjaXR5IiwiZG90UmFkaXVzIiwiZG90RmlsbCIsInN0cmluZyIsImNvbXBvc2l0ZU9wZXJhdGlvbiIsIm9uZU9mIiwiQ09NUE9TSVRFX1RZUEVTIiwiREVGQVVMVF9QUk9QUyIsImxvY2F0aW9uIiwiZ2V0IiwiU2NhdHRlcnBsb3RPdmVybGF5IiwiX3JlZHJhdyIsInByb3BzIiwibWVyY2F0b3IiLCJwaXhlbFJhdGlvIiwid2luZG93IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImNhbnZhcyIsInJlZnMiLCJvdmVybGF5IiwiY3R4IiwiZ2V0Q29udGV4dCIsInNhdmUiLCJzY2FsZSIsImNsZWFyUmVjdCIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsInBpeGVsIiwicHJvamVjdCIsInBpeGVsUm91bmRlZCIsImQzIiwicm91bmQiLCJmaWxsU3R5bGUiLCJiZWdpblBhdGgiLCJhcmMiLCJNYXRoIiwiUEkiLCJmaWxsIiwicmVzdG9yZSIsInBvc2l0aW9uIiwicG9pbnRlckV2ZW50cyIsIm9wYWNpdHkiLCJsZWZ0IiwidG9wIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7K2VBMUJBOztBQUVBO0FBQ0E7QUFDQTtB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QUtOQyxtQkFBU3hDLGFBTEg7QUFNTnlDLGdCQUFNLENBTkE7QUFPTkMsZUFBSztBQVBDLFNBSlYsR0FERjtBQWVEOzs7O0VBbEU2Q0MsZ0I7O2tCQUEzQmpDLGtCOzs7QUFxRXJCQSxtQkFBbUJrQyxTQUFuQixHQUErQjlELFVBQS9CO0FBQ0E0QixtQkFBbUJtQyxZQUFuQixHQUFrQ3RDLGFBQWxDIiwiZmlsZSI6InNjYXR0ZXJwbG90LnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgQ09NUE9TSVRFX1RZUEVTIGZyb20gJ2NhbnZhcy1jb21wb3NpdGUtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBpc0RyYWdnaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBsb2NhdGlvbnM6IFByb3BUeXBlcy5pbnN0YW5jZU9mKEltbXV0YWJsZS5MaXN0KS5pc1JlcXVpcmVkLFxuICBsbmdMYXRBY2Nlc3NvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgcmVuZGVyV2hpbGVEcmFnZ2luZzogUHJvcFR5cGVzLmJvb2wsXG4gIGdsb2JhbE9wYWNpdHk6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgZG90UmFkaXVzOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGRvdEZpbGw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgY29tcG9zaXRlT3BlcmF0aW9uOiBQcm9wVHlwZXMub25lT2YoQ09NUE9TSVRFX1RZUEVTKS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBERUZBVUxUX1BST1BTID0ge1xuICBsbmdMYXRBY2Nlc3Nvcihsb2NhdGlvbikge1xuICAgIHJldHVybiBbbG9jYXRpb24uZ2V0KDApLCBsb2NhdGlvbi5nZXQoMSldO1xuICB9LFxuICByZW5kZXJXaGlsZURyYWdnaW5nOiB0cnVlLFxuICBkb3RSYWRpdXM6IDQsXG4gIGRvdEZpbGw6ICcjMUZCQUQ2JyxcbiAgZ2xvYmFsT3BhY2l0eTogMSxcbiAgLy8gU2FtZSBhcyBicm93c2VyIGRlZmF1bHQuXG4gIGNvbXBvc2l0ZU9wZXJhdGlvbjogJ3NvdXJjZS1vdmVyJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NhdHRlcnBsb3RPdmVybGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzICovXG4gIF9yZWRyYXcoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsIGhlaWdodCwgZG90UmFkaXVzLCBkb3RGaWxsLCBjb21wb3NpdGVPcGVyYXRpb24sXG4gICAgICByZW5kZXJXaGlsZURyYWdnaW5nLCBpc0RyYWdnaW5nLCBsb2NhdGlvbnMsIGxuZ0xhdEFjY2Vzc29yXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBtZXJjYXRvciA9IFZpZXdwb3J0TWVyY2F0b3IodGhpcy5wcm9wcyk7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZWZzLm92ZXJsYXk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjb21wb3NpdGVPcGVyYXRpb247XG5cbiAgICBpZiAoKHJlbmRlcldoaWxlRHJhZ2dpbmcgfHwgIWlzRHJhZ2dpbmcpICYmIGxvY2F0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGl4ZWwgPSBtZXJjYXRvci5wcm9qZWN0KGxuZ0xhdEFjY2Vzc29yKGxvY2F0aW9uKSk7XG4gICAgICAgIGNvbnN0IHBpeGVsUm91bmRlZCA9IFtkMy5yb3VuZChwaXhlbFswXSwgMSksIGQzLnJvdW5kKHBpeGVsWzFdLCAxKV07XG4gICAgICAgIGlmIChwaXhlbFJvdW5kZWRbMF0gKyBkb3RSYWRpdXMgPj0gMCAmJlxuICAgICAgICAgICAgcGl4ZWxSb3VuZGVkWzBdIC0gZG90UmFkaXVzIDwgd2lkdGggJiZcbiAgICAgICAgICAgIHBpeGVsUm91bmRlZFsxXSArIGRvdFJhZGl1cyA+PSAwICYmXG4gICAgICAgICAgICBwaXhlbFJvdW5kZWRbMV0gLSBkb3RSYWRpdXMgPCBoZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGRvdEZpbGw7XG4gICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgIGN0eC5hcmMocGl4ZWxSb3VuZGVkWzBdLCBwaXhlbFJvdW5kZWRbMV0sIGRvdFJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGdsb2JhbE9wYWNpdHl9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICByZXR1cm4gKFxuICAgICAgPGNhbnZhc1xuICAgICAgICByZWY9XCJvdmVybGF5XCJcbiAgICAgICAgd2lkdGg9eyB3aWR0aCAqIHBpeGVsUmF0aW8gfVxuICAgICAgICBoZWlnaHQ9eyBoZWlnaHQgKiBwaXhlbFJhdGlvIH1cbiAgICAgICAgc3R5bGU9eyB7XG4gICAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIG9wYWNpdHk6IGdsb2JhbE9wYWNpdHksXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IDBcbiAgICAgICAgfSB9Lz5cbiAgICApO1xuICB9XG59XG5cblNjYXR0ZXJwbG90T3ZlcmxheS5wcm9wVHlwZXMgPSBQUk9QX1RZUEVTO1xuU2NhdHRlcnBsb3RPdmVybGF5LmRlZmF1bHRQcm9wcyA9IERFRkFVTFRfUFJPUFM7XG4iXX0=\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/scatterplot.react.js\n// module id = 1102\n// module chunks = 0 1","'use strict';\n\nmodule.exports = [\n  'source-over',\n  'source-in',\n  'source-out',\n  'source-atop',\n  'destination-over',\n  'destination-in',\n  'destination-out',\n  'destination-atop',\n  'lighter',\n  'copy',\n  'xor',\n  'multiply',\n  'screen',\n  'overlay',\n  'darken',\n  'lighten',\n  'color-dodge',\n  'color-burn',\n  'hard-light',\n  'soft-light',\n  'difference',\n  'exclusion',\n  'hue',\n  'saturation',\n  'color',\n  'luminosity'\n];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/canvas-composite-types/index.js\n// module id = 1103\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _viewportMercatorProject = require('viewport-mercator-project');\n\nvar _viewportMercatorProject2 = _interopRequireDefault(_viewportMercatorProject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) 2015 Uber Technologies, Inc.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar PROP_TYPES = {\n  width: _propTypes2.default.number.isRequired,\n  height: _propTypes2.default.number.isRequired,\n  latitude: _propTypes2.default.number.isRequired,\n  longitude: _propTypes2.default.number.isRequired,\n  zoom: _propTypes2.default.number.isRequired,\n  redraw: _propTypes2.default.func.isRequired,\n  isDragging: _propTypes2.default.bool.isRequired\n};\n\nvar SVGOverlay = function (_Component) {\n  _inherits(SVGOverlay, _Component);\n\n  function SVGOverlay() {\n    _classCallCheck(this, SVGOverlay);\n\n    return _possibleConstructorReturn(this, (SVGOverlay.__proto__ || Object.getPrototypeOf(SVGOverlay)).apply(this, arguments));\n  }\n\n  _createClass(SVGOverlay, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          width = _props.width,\n          height = _props.height,\n          isDragging = _props.isDragging;\n\n      var style = _extends({\n        pointerEvents: 'none',\n        position: 'absolute',\n        left: 0,\n        top: 0\n      }, this.props.style);\n      var mercator = (0, _viewportMercatorProject2.default)(this.props);\n      var project = mercator.project,\n          unproject = mercator.unproject;\n\n\n      return _react2.default.createElement(\n        'svg',\n        {\n          ref: 'overlay',\n          width: width,\n          height: height,\n          style: style },\n        this.props.redraw({ width: width, height: height, project: project, unproject: unproject, isDragging: isDragging })\n      );\n    }\n  }]);\n\n  return SVGOverlay;\n}(_react.Component);\n\nexports.default = SVGOverlay;\n\n\nSVGOverlay.propTypes = PROP_TYPES;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vdmVybGF5cy9zdmcucmVhY3QuanMiXSwibmFtZXMiOlsiUFJPUF9UWVBFUyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiem9vbSIsInJlZHJhdyIsImZ1bmMiLCJpc0RyYWdnaW5nIiwiYm9vbCIsIlNWR092ZXJsYXkiLCJwcm9wcyIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsInBvc2l0aW9uIiwibGVmdCIsInRvcCIsIm1lcmNhdG9yIiwicHJvamVjdCIsInVucHJvamVjdCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQXRCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQSxJQUFNQSxhQUFhO0FBQ2pCQyxTQUFPQyxvQkFBVUMsTUFBVixDQUFpQkMsVUFEUDtBQUVqQkMsVUFBUUgsb0JBQVVDLE1BQVYsQ0FBaUJDLFVBRlI7QUFHakJFLFlBQVVKLG9CQUFVQyxNQUFWLENBQWlCQyxVQUhWO0FBSWpCRyxhQUFXTCxvQkFBVUMsTUFBVixDQUFpQkMsVUFKWDtBQUtqQkksUUFBTU4sb0JBQVVDLE1BQVYsQ0FBaUJDLFVBTE47QUFNakJLLFVBQVFQLG9CQUFVUSxJQUFWLENBQWVOLFVBTk47QUFPakJPLGNBQVlULG9CQUFVVSxJQUFWLENBQWVSO0FBUFYsQ0FBbkI7O0lBVXFCUyxVOzs7Ozs7Ozs7Ozs2QkFDVjtBQUFBLG1CQUM2QixLQUFLQyxLQURsQztBQUFBLFVBQ0FiLEtBREEsVUFDQUEsS0FEQTtBQUFBLFVBQ09JLE1BRFAsVUFDT0EsTUFEUDtBQUFBLFVBQ2VNLFVBRGYsVUFDZUEsVUFEZjs7QUFFUCxVQUFNSTtBQUNKQyx1QkFBZSxNQURYO0FBRUpDLGtCQUFVLFVBRk47QUFHSkMsY0FBTSxDQUhGO0FBSUpDLGFBQUs7QUFKRCxTQUtELEtBQUtMLEtBQUwsQ0FBV0MsS0FMVixDQUFOO0FBT0EsVUFBTUssV0FBVyx1Q0FBaUIsS0FBS04sS0FBdEIsQ0FBakI7QUFUTyxVQVVBTyxPQVZBLEdBVXNCRCxRQVZ0QixDQVVBQyxPQVZBO0FBQUEsVUFVU0MsU0FWVCxHQVVzQkYsUUFWdEIsQ0FVU0UsU0FWVDs7O0FBWVAsYUFDRTtBQUFBO0FBQUE7QUFDRSxlQUFJLFNBRE47QUFFRSxpQkFBUXJCLEtBRlY7QUFHRSxrQkFBU0ksTUFIWDtBQUlFLGlCQUFRVSxLQUpWO0FBTUksYUFBS0QsS0FBTCxDQUFXTCxNQUFYLENBQWtCLEVBQUNSLFlBQUQsRUFBUUksY0FBUixFQUFnQmdCLGdCQUFoQixFQUF5QkMsb0JBQXpCLEVBQW9DWCxzQkFBcEMsRUFBbEI7QUFOSixPQURGO0FBV0Q7Ozs7RUF4QnFDWSxnQjs7a0JBQW5CVixVOzs7QUEyQnJCQSxXQUFXVyxTQUFYLEdBQXVCeEIsVUFBdkIiLCJmaWxlIjoic3ZnLnJlYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE1IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG5cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFZpZXdwb3J0TWVyY2F0b3IgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5cbmNvbnN0IFBST1BfVFlQRVMgPSB7XG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsYXRpdHVkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb25naXR1ZGU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgem9vbTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByZWRyYXc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzRHJhZ2dpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNWR092ZXJsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGlzRHJhZ2dpbmd9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBzdHlsZSA9IHtcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIC4uLnRoaXMucHJvcHMuc3R5bGVcbiAgICB9O1xuICAgIGNvbnN0IG1lcmNhdG9yID0gVmlld3BvcnRNZXJjYXRvcih0aGlzLnByb3BzKTtcbiAgICBjb25zdCB7cHJvamVjdCwgdW5wcm9qZWN0fSA9IG1lcmNhdG9yO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxzdmdcbiAgICAgICAgcmVmPVwib3ZlcmxheVwiXG4gICAgICAgIHdpZHRoPXsgd2lkdGggfVxuICAgICAgICBoZWlnaHQ9eyBoZWlnaHQgfVxuICAgICAgICBzdHlsZT17IHN0eWxlIH0+XG5cbiAgICAgICAgeyB0aGlzLnByb3BzLnJlZHJhdyh7d2lkdGgsIGhlaWdodCwgcHJvamVjdCwgdW5wcm9qZWN0LCBpc0RyYWdnaW5nfSkgfVxuXG4gICAgICA8L3N2Zz5cbiAgICApO1xuICB9XG59XG5cblNWR092ZXJsYXkucHJvcFR5cGVzID0gUFJPUF9UWVBFUztcblxuIl19\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-map-gl/dist/overlays/svg.react.js\n// module id = 1104\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Immutable, { Map } from 'immutable';\nimport _ from 'lodash';\n\nimport { buildFeatureCollection } from './utils/geodata_utils';\n\nexport default class FeatureLayer extends React.PureComponent<any, any> {\n\n  source: any;\n\n  static propTypes = {\n    data: PropTypes.array.isRequired,\n    layer: PropTypes.instanceOf(Map).isRequired,\n    map: PropTypes.object.isRequired,\n    onLoading: PropTypes.func,\n    onFeaturesClick: PropTypes.func\n  };\n\n  componentWillReceiveProps(nextProps) {\n    const { layer, map } = nextProps;\n    const { layer: prevLayer } = this.props;\n\n    if (layer.get('type') !== prevLayer.get('type')) {\n      this._destroy();\n      this._init();\n      return;\n    }\n\n    if (layer !== prevLayer) {\n      layer.get('paint')\n        .filter((paintVal, paintKey) => paintVal !== prevLayer.getIn(['paint', paintKey]))\n        .forEach((paintVal, paintKey) => {\n          map.setPaintProperty(layer.get('id'), paintKey, Immutable.isImmutable(paintVal) ? paintVal.toJS() : paintVal);\n        });\n    }\n  }\n\n  onClick = evt => {\n    const { layer, map, onFeaturesClick } = this.props;\n\n    const features = map.queryRenderedFeatures(evt.point, { layers: [layer.get('id')] });\n\n    if (features.length == 0) {\n      return;\n    }\n\n    onFeaturesClick && onFeaturesClick(features);\n  };\n\n  _updateFeatures = _.debounce(props => {\n    const { data, layer, map, onLoading } = props;\n    onLoading && onLoading();\n\n    // It's possible that the map is in the process of unmounting and will fail on the\n    // `map.getSource` call below because `map.style` is not defined\n    if (!map.style) {\n      return;\n    }\n\n    const dataSource = map.getSource(layer.get('source'));\n\n    // It's possible that the user was interacting with the filter\n    // and then changed the map type, which means this layer\n    // may have been unmounted before this debounced function is actually executed\n    if (dataSource) {\n      dataSource.setData(buildFeatureCollection(data));\n    }\n  }, 100);\n\n  _init() {\n    const { data, layer, map, onLoading } = this.props;\n\n    onLoading && setImmediate(() => onLoading());\n\n    this.source = {\n      type: 'geojson',\n      data: buildFeatureCollection(data)\n    };\n\n    map.addSource(layer.get('source'), this.source);\n    map.addLayer(layer.toJS());\n    map.on('click', this.onClick);\n  }\n\n  _destroy() {\n    const { layer, map } = this.props;\n    const id = layer.get('id');\n\n    // If the entire map is unmounting we don't need to do it ourselves\n    if (!map.style || !map.getLayer(id)) {\n      return;\n    }\n\n    map.removeLayer(id);\n    map.removeSource(layer.get('source'));\n\n    map.off('click', this.onClick);\n  }\n\n  componentWillMount() {\n    this._init();\n  }\n\n  componentWillUnmount() {\n    this._destroy();\n  }\n\n  render() {\n    this._updateFeatures(this.props);\n\n    return null;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/feature_layer.tsx","import _ from 'lodash';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport Immutable from 'immutable';\nimport WebGLHeatmap from 'webgl-heatmap';\nimport viewportMercator from 'viewport-mercator-project';\n\nimport { HeatMapGradient, MapTypes, MapboxGl } from './map_constants';\n\nimport { lngLatExtractor, shouldIgnoreLngLat } from './utils/geodata_utils';\n\nconst { Heatmap: { configuration: HeatmapConfig } } = MapTypes;\n\nconst INTENSITY_FACTOR = 1 / (HeatmapConfig.max * 3) / MapboxGl.maxZoom;\n\nexport default class HeatmapLayer extends React.PureComponent<any, any> {\n\n  _heatmap: any;\n\n  static contextTypes = {\n    map: PropTypes.object\n  };\n\n  static propTypes = {\n    width: PropTypes.number.isRequired,\n    height: PropTypes.number.isRequired,\n    longitude: PropTypes.number.isRequired,\n    latitude: PropTypes.number.isRequired,\n    zoom: PropTypes.number.isRequired,\n    data: PropTypes.oneOfType([\n      PropTypes.array,\n      PropTypes.instanceOf(Immutable.List)\n    ]),\n    lngLatExtractor: PropTypes.func,\n    intensityExtractor: PropTypes.func,\n    sizeExtractor: PropTypes.func,\n    gradientColors: PropTypes.object\n  };\n\n  static defaultProps = {\n    lngLatExtractor() {\n      return lngLatExtractor;\n    },\n    intensityExtractor(row, zoom) {\n      return zoom * INTENSITY_FACTOR;\n    },\n    sizeExtractor() {\n      return HeatmapConfig.radius;\n    },\n    gradientColors: HeatMapGradient,\n    width: '100%'\n  };\n\n  _prevGradientColors = null;\n  _gradientTexture = null;\n\n  componentDidMount() {\n    this._update();\n  }\n\n  componentDidUpdate() {\n    this._update();\n  }\n\n  componentWillUnmount() {\n    this._heatmap = null;\n  }\n\n  _getGradientTexture() {\n    if (this._prevGradientColors === this.props.gradientColors) {\n      return this._gradientTexture;\n    }\n\n    const canvas = document.createElement('canvas');\n    const width = this.context.map.transform.tileSize;\n    const height = this.context.map.transform.height;\n    (canvas as any).width = String(width);\n    (canvas as any).height = String(height);\n    const ctx = canvas.getContext('2d');\n    const gradient = ctx.createLinearGradient(0, height / 2, width, height / 2);\n    _.each(this.props.gradientColors, (color, stop: any) => {\n      gradient.addColorStop(stop, color);\n    });\n    ctx.fillStyle = gradient;\n    ctx.fillRect(0, 0, width, height);\n    const image = new (window as any).Image();\n    image.src = canvas.toDataURL('image/png');\n    return image;\n  }\n\n  _interpolateWithZoom(rawVal) {\n    return rawVal * this.props.zoom;\n  }\n\n  _redraw() {\n    const mercator = viewportMercator(this.props);\n    this._heatmap.clear();\n    this._heatmap.adjustSize();\n\n    this.props.data.forEach((location) => {\n      const size = this.props.sizeExtractor(location);\n      const intensity = this.props.intensityExtractor(location, this.props.zoom);\n      const lngLat = this.props.lngLatExtractor(location);\n\n      if (shouldIgnoreLngLat(lngLat)) {\n        return;\n      }\n\n      const pixel = mercator.project(lngLat);\n\n      this._heatmap.addPoint(\n        pixel[0], pixel[1],\n        this._interpolateWithZoom(size),\n        intensity\n      );\n    });\n\n    this._heatmap.update();\n    this._heatmap.display();\n  }\n\n  _update() {\n    const gradientTexture = this._getGradientTexture();\n    if (this._gradientTexture !== gradientTexture) {\n      this._heatmap = new WebGLHeatmap({\n        canvas: this.refs.overlay,\n        intensityToAlpha: true,\n        alphaRange: [0, 0.1],\n        gradientTexture: gradientTexture\n      });\n      this._gradientTexture = gradientTexture;\n    }\n    this._redraw();\n    this._prevGradientColors = this.props.gradientColors;\n  }\n\n  render() {\n    const pixelRatio = window.devicePixelRatio || 1;\n\n    return (\n      <canvas\n        ref=\"overlay\"\n        width={this.props.width * pixelRatio}\n        height={this.props.height * pixelRatio}\n        style={{\n          width: this.props.width + 'px',\n          height: this.props.height + 'px',\n          position: 'absolute',\n          pointerEvents: 'none',\n          left: 0,\n          top: 0,\n          opacity: 0.8\n        }} />\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/gl_heat_map_layer.tsx","// Generated by CoffeeScript 1.8.0\n\nvar WebGLHeatmap = require('./webgl-heatmap');\nvar HeatmapTexture = require('./heatmap-texture');\n\nvar path = require('path');\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\n\nvar __indexOf = [].indexOf || function(item) {\n  for (var i = 0, l = this.length; i < l; i++) {\n    if (i in this && this[i] === item) {\n      return i;\n    }\n  }\n  return -1;\n};\n\nfunction nukeVendorPrefix() {\n  var getExtension, getSupportedExtensions, vendorRe, vendors;\n  if (window.WebGLRenderingContext != null) {\n    vendors = ['WEBKIT', 'MOZ', 'MS', 'O'];\n    vendorRe = /^WEBKIT_(.*)|MOZ_(.*)|MS_(.*)|O_(.*)/;\n    getExtension = WebGLRenderingContext.prototype.getExtension;\n    WebGLRenderingContext.prototype.getExtension = function(name) {\n      var extobj, match, vendor, _i, _len;\n      match = name.match(vendorRe);\n      if (match !== null) {\n        name = match[1];\n      }\n      extobj = getExtension.call(this, name);\n      if (extobj === null) {\n        for (_i = 0, _len = vendors.length; _i < _len; _i++) {\n          vendor = vendors[_i];\n          extobj = getExtension.call(this, vendor + '_' + name);\n          if (extobj !== null) {\n            return extobj;\n          }\n        }\n        return null;\n      } else {\n        return extobj;\n      }\n    };\n    getSupportedExtensions = WebGLRenderingContext.prototype.getSupportedExtensions;\n    return WebGLRenderingContext.prototype.getSupportedExtensions = function() {\n      var extension, match, result, supported, _i, _len;\n      supported = getSupportedExtensions.call(this);\n      result = [];\n      for (_i = 0, _len = supported.length; _i < _len; _i++) {\n        extension = supported[_i];\n        match = extension.match(vendorRe);\n        if (match !== null) {\n          extension = match[1];\n        }\n        if (__indexOf.call(result, extension) < 0) {\n          result.push(extension);\n        }\n      }\n      return result;\n    };\n  }\n};\n\nfunction textureFloatShims() {\n  var checkColorBuffer, checkFloatLinear, checkSupport, checkTexture, createSourceCanvas, getExtension, getSupportedExtensions, name, shimExtensions, shimLookup, unshimExtensions, unshimLookup, _i, _len;\n  createSourceCanvas = function() {\n    var canvas, ctx, imageData;\n    canvas = document.createElement('canvas');\n    canvas.width = 2;\n    canvas.height = 2;\n    ctx = canvas.getContext('2d');\n    imageData = ctx.getImageData(0, 0, 2, 2);\n    imageData.data.set(new Uint8ClampedArray([0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255]));\n    ctx.putImageData(imageData, 0, 0);\n    return canvas;\n  };\n  createSourceCanvas();\n  checkFloatLinear = function(gl, sourceType) {\n    var buffer, cleanup, fragmentShader, framebuffer, positionLoc, program, readBuffer, result, source, sourceCanvas, sourceLoc, target, vertexShader, vertices;\n    program = gl.createProgram();\n    vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.attachShader(program, vertexShader);\n    gl.shaderSource(vertexShader, 'attribute vec2 position;\\nvoid main(){\\n    gl_Position = vec4(position, 0.0, 1.0);\\n}');\n    gl.compileShader(vertexShader);\n    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n      throw gl.getShaderInfoLog(vertexShader);\n    }\n    fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.attachShader(program, fragmentShader);\n    gl.shaderSource(fragmentShader, 'uniform sampler2D source;\\nvoid main(){\\n    gl_FragColor = texture2D(source, vec2(1.0, 1.0));\\n}');\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      throw gl.getShaderInfoLog(fragmentShader);\n    }\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      throw gl.getProgramInfoLog(program);\n    }\n    gl.useProgram(program);\n    cleanup = function() {\n      gl.deleteShader(fragmentShader);\n      gl.deleteShader(vertexShader);\n      gl.deleteProgram(program);\n      gl.deleteBuffer(buffer);\n      gl.deleteTexture(source);\n      gl.deleteTexture(target);\n      gl.deleteFramebuffer(framebuffer);\n      gl.bindBuffer(gl.ARRAY_BUFFER, null);\n      gl.useProgram(null);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    };\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target, 0);\n    sourceCanvas = createSourceCanvas();\n    source = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, source);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, sourceType, sourceCanvas);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1]);\n    buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n    positionLoc = gl.getAttribLocation(program, 'position');\n    sourceLoc = gl.getUniformLocation(program, 'source');\n    gl.enableVertexAttribArray(positionLoc);\n    gl.vertexAttribPointer(positionLoc, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(sourceLoc, 0);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    readBuffer = new Uint8Array(4 * 4);\n    gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, readBuffer);\n    result = Math.abs(readBuffer[0] - 127) < 10;\n    cleanup();\n    return result;\n  };\n  checkTexture = function(gl, targetType) {\n    var target;\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, targetType, null);\n    if (gl.getError() === 0) {\n      gl.deleteTexture(target);\n      return true;\n    } else {\n      gl.deleteTexture(target);\n      return false;\n    }\n  };\n  checkColorBuffer = function(gl, targetType) {\n    var check, framebuffer, target;\n    target = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, target);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, targetType, null);\n    framebuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target, 0);\n    check = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    gl.deleteTexture(target);\n    gl.deleteFramebuffer(framebuffer);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    if (check === gl.FRAMEBUFFER_COMPLETE) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n  shimExtensions = [];\n  shimLookup = {};\n  unshimExtensions = [];\n  checkSupport = function() {\n    var canvas, extobj, gl, halfFloatExt, halfFloatTexturing, singleFloatExt, singleFloatTexturing;\n    canvas = document.createElement('canvas');\n    gl = null;\n    try {\n      gl = canvas.getContext('experimental-webgl');\n      if (gl === null) {\n        gl = canvas.getContext('webgl');\n      }\n    } catch (_error) {}\n    if (gl != null) {\n      singleFloatExt = gl.getExtension('OES_texture_float');\n      if (singleFloatExt === null) {\n        if (checkTexture(gl, gl.FLOAT)) {\n          singleFloatTexturing = true;\n          shimExtensions.push('OES_texture_float');\n          shimLookup.OES_texture_float = {\n            shim: true\n          };\n        } else {\n          singleFloatTexturing = false;\n          unshimExtensions.push('OES_texture_float');\n        }\n      } else {\n        if (checkTexture(gl, gl.FLOAT)) {\n          singleFloatTexturing = true;\n          shimExtensions.push('OES_texture_float');\n        } else {\n          singleFloatTexturing = false;\n          unshimExtensions.push('OES_texture_float');\n        }\n      }\n      if (singleFloatTexturing) {\n        extobj = gl.getExtension('WEBGL_color_buffer_float');\n        if (extobj === null) {\n          if (checkColorBuffer(gl, gl.FLOAT)) {\n            shimExtensions.push('WEBGL_color_buffer_float');\n            shimLookup.WEBGL_color_buffer_float = {\n              shim: true,\n              RGBA32F_EXT: 0x8814,\n              RGB32F_EXT: 0x8815,\n              FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n              UNSIGNED_NORMALIZED_EXT: 0x8C17\n            };\n          } else {\n            unshimExtensions.push('WEBGL_color_buffer_float');\n          }\n        } else {\n          if (checkColorBuffer(gl, gl.FLOAT)) {\n            shimExtensions.push('WEBGL_color_buffer_float');\n          } else {\n            unshimExtensions.push('WEBGL_color_buffer_float');\n          }\n        }\n        extobj = gl.getExtension('OES_texture_float_linear');\n        if (extobj === null) {\n          if (checkFloatLinear(gl, gl.FLOAT)) {\n            shimExtensions.push('OES_texture_float_linear');\n            shimLookup.OES_texture_float_linear = {\n              shim: true\n            };\n          } else {\n            unshimExtensions.push('OES_texture_float_linear');\n          }\n        } else {\n          if (checkFloatLinear(gl, gl.FLOAT)) {\n            shimExtensions.push('OES_texture_float_linear');\n          } else {\n            unshimExtensions.push('OES_texture_float_linear');\n          }\n        }\n      }\n      halfFloatExt = gl.getExtension('OES_texture_half_float');\n      if (halfFloatExt === null) {\n        if (checkTexture(gl, 0x8D61)) {\n          halfFloatTexturing = true;\n          shimExtensions.push('OES_texture_half_float');\n          halfFloatExt = shimLookup.OES_texture_half_float = {\n            HALF_FLOAT_OES: 0x8D61,\n            shim: true\n          };\n        } else {\n          halfFloatTexturing = false;\n          unshimExtensions.push('OES_texture_half_float');\n        }\n      } else {\n        if (checkTexture(gl, halfFloatExt.HALF_FLOAT_OES)) {\n          halfFloatTexturing = true;\n          shimExtensions.push('OES_texture_half_float');\n        } else {\n          halfFloatTexturing = false;\n          unshimExtensions.push('OES_texture_half_float');\n        }\n      }\n      if (halfFloatTexturing) {\n        extobj = gl.getExtension('EXT_color_buffer_half_float');\n        if (extobj === null) {\n          if (checkColorBuffer(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('EXT_color_buffer_half_float');\n            shimLookup.EXT_color_buffer_half_float = {\n              shim: true,\n              RGBA16F_EXT: 0x881A,\n              RGB16F_EXT: 0x881B,\n              FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n              UNSIGNED_NORMALIZED_EXT: 0x8C17\n            };\n          } else {\n            unshimExtensions.push('EXT_color_buffer_half_float');\n          }\n        } else {\n          if (checkColorBuffer(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('EXT_color_buffer_half_float');\n          } else {\n            unshimExtensions.push('EXT_color_buffer_half_float');\n          }\n        }\n        extobj = gl.getExtension('OES_texture_half_float_linear');\n        if (extobj === null) {\n          if (checkFloatLinear(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            shimExtensions.push('OES_texture_half_float_linear');\n            return shimLookup.OES_texture_half_float_linear = {\n              shim: true\n            };\n          } else {\n            return unshimExtensions.push('OES_texture_half_float_linear');\n          }\n        } else {\n          if (checkFloatLinear(gl, halfFloatExt.HALF_FLOAT_OES)) {\n            return shimExtensions.push('OES_texture_half_float_linear');\n          } else {\n            return unshimExtensions.push('OES_texture_half_float_linear');\n          }\n        }\n      }\n    }\n  };\n  if (window.WebGLRenderingContext != null) {\n    checkSupport();\n    unshimLookup = {};\n    for (_i = 0, _len = unshimExtensions.length; _i < _len; _i++) {\n      name = unshimExtensions[_i];\n      unshimLookup[name] = true;\n    }\n    getExtension = WebGLRenderingContext.prototype.getExtension;\n    WebGLRenderingContext.prototype.getExtension = function(name) {\n      var extobj;\n      extobj = shimLookup[name];\n      if (extobj === void 0) {\n        if (unshimLookup[name]) {\n          return null;\n        } else {\n          return getExtension.call(this, name);\n        }\n      } else {\n        return extobj;\n      }\n    };\n    getSupportedExtensions = WebGLRenderingContext.prototype.getSupportedExtensions;\n    WebGLRenderingContext.prototype.getSupportedExtensions = function() {\n      var extension, result, supported, _j, _k, _len1, _len2;\n      supported = getSupportedExtensions.call(this);\n      result = [];\n      for (_j = 0, _len1 = supported.length; _j < _len1; _j++) {\n        extension = supported[_j];\n        if (unshimLookup[extension] === void 0) {\n          result.push(extension);\n        }\n      }\n      for (_k = 0, _len2 = shimExtensions.length; _k < _len2; _k++) {\n        extension = shimExtensions[_k];\n        if (__indexOf.call(result, extension) < 0) {\n          result.push(extension);\n        }\n      }\n      return result;\n    };\n    return WebGLRenderingContext.prototype.getFloatExtension = function(spec) {\n      var candidate, candidates, half, halfFramebuffer, halfLinear, halfTexture, i, importance, preference, result, single, singleFramebuffer, singleLinear, singleTexture, use, _j, _k, _l, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2;\n      if (spec.prefer == null) {\n        spec.prefer = ['half'];\n      }\n      if (spec.require == null) {\n        spec.require = [];\n      }\n      if (spec.throws == null) {\n        spec.throws = true;\n      }\n      singleTexture = this.getExtension('OES_texture_float');\n      halfTexture = this.getExtension('OES_texture_half_float');\n      singleFramebuffer = this.getExtension('WEBGL_color_buffer_float');\n      halfFramebuffer = this.getExtension('EXT_color_buffer_half_float');\n      singleLinear = this.getExtension('OES_texture_float_linear');\n      halfLinear = this.getExtension('OES_texture_half_float_linear');\n      single = {\n        texture: singleTexture !== null,\n        filterable: singleLinear !== null,\n        renderable: singleFramebuffer !== null,\n        score: 0,\n        precision: 'single',\n        half: false,\n        single: true,\n        type: this.FLOAT\n      };\n      half = {\n        texture: halfTexture !== null,\n        filterable: halfLinear !== null,\n        renderable: halfFramebuffer !== null,\n        score: 0,\n        precision: 'half',\n        half: true,\n        single: false,\n        type: (_ref = halfTexture != null ? halfTexture.HALF_FLOAT_OES : void 0) != null ? _ref : null\n      };\n      candidates = [];\n      if (single.texture) {\n        candidates.push(single);\n      }\n      if (half.texture) {\n        candidates.push(half);\n      }\n      result = [];\n      for (_j = 0, _len1 = candidates.length; _j < _len1; _j++) {\n        candidate = candidates[_j];\n        use = true;\n        _ref1 = spec.require;\n        for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {\n          name = _ref1[_k];\n          if (candidate[name] === false) {\n            use = false;\n          }\n        }\n        if (use) {\n          result.push(candidate);\n        }\n      }\n      for (_l = 0, _len3 = result.length; _l < _len3; _l++) {\n        candidate = result[_l];\n        _ref2 = spec.prefer;\n        for (i = _m = 0, _len4 = _ref2.length; _m < _len4; i = ++_m) {\n          preference = _ref2[i];\n          importance = Math.pow(2, spec.prefer.length - i - 1);\n          if (candidate[preference]) {\n            candidate.score += importance;\n          }\n        }\n      }\n      result.sort(function sort(a, b) {\n        if (a.score === b.score) {\n          return 0;\n        } else if (a.score < b.score) {\n          return 1;\n        } else if (a.score > b.score) {\n          return -1;\n        }\n      });\n      if (result.length === 0) {\n        if (spec.throws) {\n          throw 'No floating point texture support that is ' +\n            spec.require.join(', ');\n        } else {\n          return null;\n        }\n      } else {\n        result = result[0];\n        return {\n          filterable: result.filterable,\n          renderable: result.renderable,\n          type: result.type,\n          precision: result.precision\n        };\n      }\n    };\n  }\n}\n\nnukeVendorPrefix();\ntextureFloatShims();\n\nmodule.exports = WebGLHeatmap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/index.js\n// module id = 1107\n// module chunks = 0 1","'use strict';\n\nvar document = require('global/document');\nvar window = require('global/window');\n\nvar path = require('path');\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\nvar HeatmapTexture = require('./heatmap-texture');\nvar HeatmapHeights = require('./heatmap-heights');\nvar HeatmapShader = require('./heatmap-shader');\n\nfunction WebGLHeatmap(_arg) {\n  var alphaEnd, alphaRange, alphaStart, error, getColorFun, gradientTexture, image, intensityToAlpha, output, quad, textureGradient, _ref, _ref1;\n  _ref = _arg != null ? _arg : {}, this.canvas = _ref.canvas, this.width = _ref.width, this.height = _ref.height, intensityToAlpha = _ref.intensityToAlpha, gradientTexture = _ref.gradientTexture, alphaRange = _ref.alphaRange;\n  if (!this.canvas) {\n    this.canvas = document.createElement('canvas');\n  }\n  try {\n    this.gl = this.canvas.getContext('experimental-webgl', {\n      depth: false,\n      antialias: false\n    });\n    if (this.gl === null) {\n      this.gl = this.canvas.getContext('webgl', {\n        depth: false,\n        antialias: false\n      });\n      if (this.gl === null) {\n        throw 'WebGL not supported';\n      }\n    }\n  } catch (_error) {\n    error = _error;\n    throw 'WebGL not supported';\n  }\n  if (window.WebGLDebugUtils != null) {\n    console.log('debugging mode');\n    this.gl = WebGLDebugUtils.makeDebugContext(this.gl, function(err, funcName, args) {\n      throw WebGLDebugUtils.glEnumToString(err) + \" was caused by call to: \" + funcName;\n    });\n  }\n  this.gl.enableVertexAttribArray(0);\n  this.gl.blendFunc(this.gl.ONE, this.gl.ONE);\n  if (gradientTexture) {\n    textureGradient = this.gradientTexture = new HeatmapTexture(this.gl, {\n      channels: 'rgba'\n    }).bind(0).setSize(2, 2).nearest().clampToEdge();\n    if (typeof gradientTexture === 'string') {\n      image = new window.Image();\n      image.onload = function() {\n        return textureGradient.bind().upload(image);\n      };\n      image.src = gradientTexture;\n    } else {\n      if (gradientTexture.width > 0 && gradientTexture.height > 0) {\n        textureGradient.upload(gradientTexture);\n      } else {\n        gradientTexture.onload = function() {\n          return textureGradient.upload(gradientTexture);\n        };\n      }\n    }\n    getColorFun = 'uniform sampler2D gradientTexture;\\nvec3 getColor(float intensity){\\n    return texture2D(gradientTexture, vec2(intensity, 0.0)).rgb;\\n}';\n  } else {\n    textureGradient = null;\n    getColorFun = 'vec3 getColor(float intensity){\\n    vec3 blue = vec3(0.0, 0.0, 1.0);\\n    vec3 cyan = vec3(0.0, 1.0, 1.0);\\n    vec3 green = vec3(0.0, 1.0, 0.0);\\n    vec3 yellow = vec3(1.0, 1.0, 0.0);\\n    vec3 red = vec3(1.0, 0.0, 0.0);\\n\\n    vec3 color = (\\n        fade(-0.25, 0.25, intensity)*blue +\\n        fade(0.0, 0.5, intensity)*cyan +\\n        fade(0.25, 0.75, intensity)*green +\\n        fade(0.5, 1.0, intensity)*yellow +\\n        smoothstep(0.75, 1.0, intensity)*red\\n    );\\n    return color;\\n}';\n  }\n  if (intensityToAlpha == null) {\n    intensityToAlpha = true;\n  }\n  if (intensityToAlpha) {\n    _ref1 = alphaRange != null ? alphaRange : [0, 1], alphaStart = _ref1[0], alphaEnd = _ref1[1];\n    output = \"vec4 alphaFun(vec3 color, float intensity){\\n    float alpha = smoothstep(\" + (alphaStart.toFixed(8)) + \", \" + (alphaEnd.toFixed(8)) + \", intensity);\\n    return vec4(color*alpha, alpha);\\n}\";\n  } else {\n    output = 'vec4 alphaFun(vec3 color, float intensity){\\n    return vec4(color, 1.0);\\n}';\n  }\n  this.shader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + (\"float linstep(float low, float high, float value){\\n    return clamp((value-low)/(high-low), 0.0, 1.0);\\n}\\n\\nfloat fade(float low, float high, float value){\\n    float mid = (low+high)*0.5;\\n    float range = (high-low)*0.5;\\n    float x = 1.0 - clamp(abs(mid-value)/range, 0.0, 1.0);\\n    return smoothstep(0.0, 1.0, x);\\n}\\n\\n\" + getColorFun + \"\\n\" + output + \"\\n\\nvoid main(){\\n    float intensity = smoothstep(0.0, 1.0, texture2D(source, texcoord).r);\\n    vec3 color = getColor(intensity);\\n    gl_FragColor = alphaFun(color, intensity);\\n}\")\n  });\n  if (this.width == null) {\n    this.width = this.canvas.offsetWidth || 2;\n  }\n  if (this.height == null) {\n    this.height = this.canvas.offsetHeight || 2;\n  }\n  this.canvas.width = this.width;\n  this.canvas.height = this.height;\n  this.gl.viewport(0, 0, this.width, this.height);\n  this.quad = this.gl.createBuffer();\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quad);\n  quad = new Float32Array([-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, 1, 0, 1, 1, -1, 0, 1, 1, 1, 0, 1]);\n  this.gl.bufferData(this.gl.ARRAY_BUFFER, quad, this.gl.STATIC_DRAW);\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);\n  this.heights = new HeatmapHeights(this, this.gl, this.width, this.height);\n}\n\nWebGLHeatmap.prototype.adjustSize = function() {\n  var canvasHeight, canvasWidth;\n  canvasWidth = this.canvas.offsetWidth || 2;\n  canvasHeight = this.canvas.offsetHeight || 2;\n  if (this.width !== canvasWidth || this.height !== canvasHeight) {\n    this.gl.viewport(0, 0, canvasWidth, canvasHeight);\n    this.canvas.width = canvasWidth;\n    this.canvas.height = canvasHeight;\n    this.width = canvasWidth;\n    this.height = canvasHeight;\n    return this.heights.resize(this.width, this.height);\n  }\n};\n\nWebGLHeatmap.prototype.display = function() {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.heights.nodeFront.bind(0);\n  if (this.gradientTexture) {\n    this.gradientTexture.bind(1);\n  }\n  this.shader.use().int('source', 0).int('gradientTexture', 1);\n  return this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n};\n\nWebGLHeatmap.prototype.update = function() {\n  return this.heights.update();\n};\n\nWebGLHeatmap.prototype.clear = function() {\n  return this.heights.clear();\n};\n\nWebGLHeatmap.prototype.clamp = function(min, max) {\n  if (min == null) {\n    min = 0;\n  }\n  if (max == null) {\n    max = 1;\n  }\n  return this.heights.clamp(min, max);\n};\n\nWebGLHeatmap.prototype.multiply = function(value) {\n  if (value == null) {\n    value = 0.95;\n  }\n  return this.heights.multiply(value);\n};\n\nWebGLHeatmap.prototype.blur = function() {\n  return this.heights.blur();\n};\n\nWebGLHeatmap.prototype.addPoint = function(x, y, size, intensity) {\n  return this.heights.addPoint(x, y, size, intensity);\n};\n\nWebGLHeatmap.prototype.addPoints = function(items) {\n  var item, _i, _len, _results;\n  _results = [];\n  for (_i = 0, _len = items.length; _i < _len; _i++) {\n    item = items[_i];\n    _results.push(this.addPoint(item.x, item.y, item.size, item.intensity));\n  }\n  return _results;\n};\n\nmodule.exports = WebGLHeatmap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/webgl-heatmap.js\n// module id = 1108\n// module chunks = 0 1","'use strict';\n\nvar HeatmapShader = require('./heatmap-shader');\n\nvar path = require('path');\n/* eslint-disable max-len */\nvar vertexShaderBlit = \"attribute vec4 position;\\nvarying vec2 texcoord;\\nvoid main() {\\n  texcoord = position.xy * 0.5 + 0.5;\\n  gl_Position = position;\\n}\";\nvar fragmentShaderBlit = \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nuniform sampler2D source;\\nvarying vec2 texcoord;\";\n/* eslint-enable max-len */\nvar HeatmapNode = require('./heatmap-node');\n\nfunction HeatmapHeights(heatmap, gl, width, height) {\n  var i, _i, _ref;\n  this.heatmap = heatmap;\n  this.gl = gl;\n  this.width = width;\n  this.height = height;\n  this.shader = new HeatmapShader(this.gl, {\n    vertex: 'attribute vec4 position, intensity;\\nvarying vec2 off, dim;\\nvarying float vIntensity;\\nuniform vec2 viewport;\\n\\nvoid main(){\\n    dim = abs(position.zw);\\n    off = position.zw;\\n    vec2 pos = position.xy + position.zw;\\n    vIntensity = intensity.x;\\n    gl_Position = vec4((pos/viewport)*2.0-1.0, 0.0, 1.0);\\n}',\n    fragment: '#ifdef GL_FRAGMENT_PRECISION_HIGH\\n    precision highp int;\\n    precision highp float;\\n#else\\n    precision mediump int;\\n    precision mediump float;\\n#endif\\nvarying vec2 off, dim;\\nvarying float vIntensity;\\nvoid main(){\\n    float falloff = (1.0 - smoothstep(0.0, 1.0, length(off/dim)));\\n    float intensity = falloff*vIntensity;\\n    gl_FragColor = vec4(intensity);\\n}'\n  });\n  this.clampShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform float low, high;\\nvoid main(){\\n    gl_FragColor = vec4(clamp(texture2D(source, texcoord).rgb, low, high), 1.0);\\n}'\n  });\n  this.multiplyShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform float value;\\nvoid main(){\\n    gl_FragColor = vec4(texture2D(source, texcoord).rgb*value, 1.0);\\n}'\n  });\n  this.blurShader = new HeatmapShader(this.gl, {\n    vertex: vertexShaderBlit,\n    fragment: fragmentShaderBlit + 'uniform vec2 viewport;\\nvoid main(){\\n    vec4 result = vec4(0.0);\\n    for(int x=-1; x<=1; x++){\\n        for(int y=-1; y<=1; y++){\\n            vec2 off = vec2(x,y)/viewport;\\n            //float factor = 1.0 - smoothstep(0.0, 1.5, length(off));\\n            float factor = 1.0;\\n            result += vec4(texture2D(source, texcoord+off).rgb*factor, factor);\\n        }\\n    }\\n    gl_FragColor = vec4(result.rgb/result.w, 1.0);\\n}'\n  });\n  this.nodeBack = new HeatmapNode(this.gl, this.width, this.height);\n  this.nodeFront = new HeatmapNode(this.gl, this.width, this.height);\n  this.vertexBuffer = this.gl.createBuffer();\n  this.vertexSize = 8;\n  this.maxPointCount = 1024 * 10;\n  this.vertexBufferData = new Float32Array(this.maxPointCount * this.vertexSize * 6);\n  this.vertexBufferViews = [];\n  for (i = _i = 0, _ref = this.maxPointCount; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n    this.vertexBufferViews.push(new Float32Array(this.vertexBufferData.buffer, 0, i * this.vertexSize * 6));\n  }\n  this.bufferIndex = 0;\n  this.pointCount = 0;\n}\n\nHeatmapHeights.prototype.resize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  this.nodeBack.resize(this.width, this.height);\n  return this.nodeFront.resize(this.width, this.height);\n};\n\nHeatmapHeights.prototype.update = function() {\n  var intensityLoc, positionLoc;\n  if (this.pointCount > 0) {\n    this.gl.enable(this.gl.BLEND);\n    this.nodeFront.use();\n    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);\n    this.gl.bufferData(this.gl.ARRAY_BUFFER, this.vertexBufferViews[this.pointCount], this.gl.STREAM_DRAW);\n    positionLoc = this.shader.attribLocation('position');\n    intensityLoc = this.shader.attribLocation('intensity');\n    this.gl.enableVertexAttribArray(1);\n    this.gl.vertexAttribPointer(positionLoc, 4, this.gl.FLOAT, false, 8 * 4, 0 * 4);\n    this.gl.vertexAttribPointer(intensityLoc, 4, this.gl.FLOAT, false, 8 * 4, 4 * 4);\n    this.shader.use().vec2('viewport', this.width, this.height);\n    this.gl.drawArrays(this.gl.TRIANGLES, 0, this.pointCount * 6);\n    this.gl.disableVertexAttribArray(1);\n    this.pointCount = 0;\n    this.bufferIndex = 0;\n    this.nodeFront.end();\n    return this.gl.disable(this.gl.BLEND);\n  }\n};\n\nHeatmapHeights.prototype.clear = function() {\n  this.nodeFront.use();\n  this.gl.clearColor(0, 0, 0, 1);\n  this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n  return this.nodeFront.end();\n};\n\nHeatmapHeights.prototype.clamp = function(min, max) {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.clampShader.use().int('source', 0).float('low', min).float('high', max);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.multiply = function(value) {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.multiplyShader.use().int('source', 0).float('value', value);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.blur = function() {\n  this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.heatmap.quad);\n  this.gl.vertexAttribPointer(0, 4, this.gl.FLOAT, false, 0, 0);\n  this.nodeFront.bind(0);\n  this.nodeBack.use();\n  this.blurShader.use().int('source', 0).vec2('viewport', this.width, this.height);\n  this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);\n  this.nodeBack.end();\n  return this.swap();\n};\n\nHeatmapHeights.prototype.swap = function() {\n  var tmp;\n  tmp = this.nodeFront;\n  this.nodeFront = this.nodeBack;\n  return this.nodeBack = tmp;\n};\n\nHeatmapHeights.prototype.addVertex = function(x, y, xs, ys, intensity) {\n  this.vertexBufferData[this.bufferIndex++] = x;\n  this.vertexBufferData[this.bufferIndex++] = y;\n  this.vertexBufferData[this.bufferIndex++] = xs;\n  this.vertexBufferData[this.bufferIndex++] = ys;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  this.vertexBufferData[this.bufferIndex++] = intensity;\n  return this.vertexBufferData[this.bufferIndex++] = intensity;\n};\n\nHeatmapHeights.prototype.addPoint = function(x, y, size, intensity) {\n  var s;\n  if (size == null) {\n    size = 50;\n  }\n  if (intensity == null) {\n    intensity = 0.2;\n  }\n  if (this.pointCount >= this.maxPointCount - 1) {\n    this.update();\n  }\n  y = this.height - y;\n  s = size / 2;\n  this.addVertex(x, y, -s, -s, intensity);\n  this.addVertex(x, y, +s, -s, intensity);\n  this.addVertex(x, y, -s, +s, intensity);\n  this.addVertex(x, y, -s, +s, intensity);\n  this.addVertex(x, y, +s, -s, intensity);\n  this.addVertex(x, y, +s, +s, intensity);\n  return this.pointCount += 1;\n};\n\nmodule.exports = HeatmapHeights;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/heatmap-heights.js\n// module id = 1109\n// module chunks = 0 1","'use strict';\n\nvar HeatmapTexture = require('./heatmap-texture');\nvar Framebuffer = require('./framebuffer');\n\nfunction HeatmapNode(gl, width, height) {\n  var floatExt;\n  this.gl = gl;\n  this.width = width;\n  this.height = height;\n  floatExt = this.gl.getFloatExtension({\n    require: ['renderable']\n  });\n  this.texture = new HeatmapTexture(this.gl, {\n    type: floatExt.type\n  }).bind(0).setSize(this.width, this.height).nearest().clampToEdge();\n  this.fbo = new Framebuffer(this.gl).bind().color(this.texture).unbind();\n}\n\nHeatmapNode.prototype.use = function() {\n  return this.fbo.bind();\n};\n\nHeatmapNode.prototype.bind = function(unit) {\n  return this.texture.bind(unit);\n};\n\nHeatmapNode.prototype.end = function() {\n  return this.fbo.unbind();\n};\n\nHeatmapNode.prototype.resize = function(width, height) {\n  this.width = width;\n  this.height = height;\n  return this.texture.bind(0).setSize(this.width, this.height);\n};\n\nmodule.exports = HeatmapNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/heatmap-node.js\n// module id = 1110\n// module chunks = 0 1","'use strict';\n\nfunction Framebuffer(gl) {\n  this.gl = gl;\n  this.buffer = this.gl.createFramebuffer();\n}\n\nFramebuffer.prototype.destroy = function() {\n  return this.gl.deleteFRamebuffer(this.buffer);\n};\n\nFramebuffer.prototype.bind = function() {\n  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.buffer);\n  return this;\n};\n\nFramebuffer.prototype.unbind = function() {\n  this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n  return this;\n};\n\nFramebuffer.prototype.check = function() {\n  var result;\n  result = this.gl.checkFramebufferStatus(this.gl.FRAMEBUFFER);\n  switch (result) {\n    case this.gl.FRAMEBUFFER_UNSUPPORTED:\n      throw 'Framebuffer is unsupported';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n      throw 'Framebuffer incomplete attachment';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n      throw 'Framebuffer incomplete dimensions';\n      break;\n    case this.gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n      throw 'Framebuffer incomplete missing attachment';\n  }\n  return this;\n};\n\nFramebuffer.prototype.color = function(texture) {\n  this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, texture.target, texture.handle, 0);\n  this.check();\n  return this;\n};\n\nFramebuffer.prototype.depth = function(buffer) {\n  this.gl.framebufferRenderbuffer(this.gl.FRAMEBUFFER, this.gl.DEPTH_ATTACHMENT, this.gl.RENDERBUFFER, buffer.id);\n  this.check();\n  return this;\n};\n\nFramebuffer.prototype.destroy = function() {\n  return this.gl.deleteFramebuffer(this.buffer);\n};\n\nmodule.exports = Framebuffer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/webgl-heatmap/framebuffer.js\n// module id = 1111\n// module chunks = 0 1","import React from 'react';\n\nimport GridReportActions from '../actions/grid_report_actions';\n\nimport TooltipEditor from './tooltip_editor';\nimport Tooltip from './tooltip';\nimport GLPopup from './gl_popup';\n\nexport default class GLMapTooltip extends React.PureComponent<any, any> {\n\n  getLngLatForTooltip() {\n    const { lat, lng } = this.props.tooltip.get('locationForTooltip');\n    return [ lng, lat ];\n  }\n\n  renderEditor() {\n    const { tooltip, locale } = this.props;\n\n    return (\n      <TooltipEditor\n        locale={locale}\n        rowForTooltip={tooltip.get('itemsForTooltip').first()}\n        currentTooltip={tooltip.get('draft')}\n        selectableColumns={tooltip.get('selectableColumns')}\n        updateCurrentTooltip={GridReportActions.mapTooltipEdited}\n        saveTooltip={GridReportActions.mapTooltipSaved} />\n    );\n  }\n\n  renderTooltip() {\n    const { colorExtractor, tooltip, locale } = this.props;\n\n    return (\n      <Tooltip\n        locale={locale}\n        editable={tooltip.get('editable')}\n        currentItems={tooltip.get('itemsForTooltip')}\n        config={tooltip.get('config')}\n        colorExtractor={colorExtractor} />\n    );\n  }\n\n  renderLoading() {\n    return (\n      <div className=\"tooltip__container\">\n        <div className=\"tooltip__column_container\">\n          Loading...\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { colorMapLoading, style, tooltip } = this.props;\n    const isLoading = tooltip.get('loading') || colorMapLoading;\n    const isEditing = tooltip.get('editing');\n\n    const shouldRenderEditor = !isLoading && isEditing;\n    const shouldRenderTooltip = !isLoading && !isEditing;\n\n    return (\n      <GLPopup\n        key=\"popup-tooltip\"\n        className=\"grid_report__map-popup-tooltip\"\n        coordinates={this.getLngLatForTooltip()}\n        closeButton={false}\n        closeOnClick={shouldRenderTooltip}\n        onClose={GridReportActions.clearRowsForTooltip}\n        keepInView={true}\n        anchor=\"bottom\"\n        disableScroll={shouldRenderEditor}\n        {...this.props}>\n        <div style={style} onClick={(e) => e.preventDefault()}>\n            {isLoading && this.renderLoading()}\n            {shouldRenderEditor && this.renderEditor()}\n            {shouldRenderTooltip && this.renderTooltip()}\n        </div>\n      </GLPopup>\n    );\n  }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/gl_map_tooltip.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport className from 'classnames';\nimport { noop } from 'lodash';\nimport { DragDropContext } from 'react-dnd';\nimport HTML5Backend from 'react-dnd-html5-backend';\n\nimport SortableTooltipEditorItem from './sortable_tooltip_editor_item';\n\nimport { currentMapTooltipSchema, MAX_NUMBER_OF_TOOLTIP_FIELDS } from './map_constants';\n\nconst { addNewColumn, removeColumn, updateColumnInTooltip, reorderColumns } = currentMapTooltipSchema;\n\n@DragDropContext(HTML5Backend)\nexport default class MapTooltipEditor extends React.Component<any, any> {\n\n  static propTypes = {\n    locale: PropTypes.string.isRequired,\n    rowForTooltip: PropTypes.object.isRequired,\n    currentTooltip: PropTypes.object.isRequired,\n    selectableColumns: PropTypes.object.isRequired,\n    updateCurrentTooltip: PropTypes.func.isRequired,\n    saveTooltip: PropTypes.func.isRequired\n  };\n\n  render() {\n    const { currentTooltip, updateCurrentTooltip, selectableColumns, rowForTooltip, saveTooltip, locale } = this.props;\n    const columns = currentTooltip.get('columns');\n    const addItemDisabled = columns.size >= MAX_NUMBER_OF_TOOLTIP_FIELDS;\n    const addItemClasses = className('tooltip_editor__add_button', { disabled: addItemDisabled });\n    const addItemCallback = () => updateCurrentTooltip(addNewColumn(currentTooltip, selectableColumns.first()));\n\n    return (\n      <div className=\"tooltip_editor\">\n        <div className=\"tooltip_editor__show_column_name\">SHOW COLUMN NAME</div>\n        <table>\n          <tbody>\n            {columns.map((column, i) => {\n              return (\n                <SortableTooltipEditorItem\n                  key={i}\n                  id={column}\n                  moveItem={(moved, movedOver) => updateCurrentTooltip(reorderColumns(currentTooltip, moved, movedOver))}\n                  setItem={noop}\n                  isDraggable={true}\n                  wrapper={false}\n                  isFirst={i == 0}\n                  rowForTooltip={rowForTooltip}\n                  locale={locale}\n                  column={column}\n                  selectableColumns={selectableColumns}\n                  updateColumn={newColumn => updateCurrentTooltip(updateColumnInTooltip(column, newColumn, currentTooltip))}\n                  removeColumn={() => updateCurrentTooltip(removeColumn(column, currentTooltip))}\n                />\n              );\n            })}\n          </tbody>\n          <tfoot className=\"tooltip_editor__footer\">\n            <tr>\n              <th className=\"tooltip_editor__show_column_name_footer\">\n              </th>\n              <td colSpan={2} className=\"tooltip_editor__footer_add-item\">\n                <a\n                  className={addItemClasses}\n                  onClick={!addItemDisabled && addItemCallback}>\n                  <span>\n                    <i className=\"tooltip_editor__add_button_icon icon-plus-1\"/>\n                    ADD ITEM\n                  </span>\n                </a>\n              </td>\n              <td className=\"tooltip_editor__save_button_column\">\n                <button\n                  className=\"ui-button primary small tooltip_editor__save_button\"\n                  onClick={() => saveTooltip(currentTooltip)}>\n                  <span>SAVE</span>\n                </button>\n              </td>\n            </tr>\n          </tfoot>\n        </table>\n      </div>\n    );\n  }\n}\n\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/tooltip_editor.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _DragDropManager = require('./DragDropManager');\n\nObject.defineProperty(exports, 'DragDropManager', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragDropManager).default;\n  }\n});\n\nvar _DragSource = require('./DragSource');\n\nObject.defineProperty(exports, 'DragSource', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DragSource).default;\n  }\n});\n\nvar _DropTarget = require('./DropTarget');\n\nObject.defineProperty(exports, 'DropTarget', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_DropTarget).default;\n  }\n});\n\nvar _createTestBackend = require('./backends/createTestBackend');\n\nObject.defineProperty(exports, 'createTestBackend', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_createTestBackend).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/index.js\n// module id = 1114\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _createStore = require('redux/lib/createStore');\n\nvar _createStore2 = _interopRequireDefault(_createStore);\n\nvar _reducers = require('./reducers');\n\nvar _reducers2 = _interopRequireDefault(_reducers);\n\nvar _dragDrop = require('./actions/dragDrop');\n\nvar dragDropActions = _interopRequireWildcard(_dragDrop);\n\nvar _DragDropMonitor = require('./DragDropMonitor');\n\nvar _DragDropMonitor2 = _interopRequireDefault(_DragDropMonitor);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragDropManager = function () {\n\tfunction DragDropManager(createBackend) {\n\t\tvar context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t_classCallCheck(this, DragDropManager);\n\n\t\tvar store = (0, _createStore2.default)(_reducers2.default);\n\t\tthis.context = context;\n\t\tthis.store = store;\n\t\tthis.monitor = new _DragDropMonitor2.default(store);\n\t\tthis.registry = this.monitor.registry;\n\t\tthis.backend = createBackend(this);\n\n\t\tstore.subscribe(this.handleRefCountChange.bind(this));\n\t}\n\n\t_createClass(DragDropManager, [{\n\t\tkey: 'handleRefCountChange',\n\t\tvalue: function handleRefCountChange() {\n\t\t\tvar shouldSetUp = this.store.getState().refCount > 0;\n\t\t\tif (shouldSetUp && !this.isSetUp) {\n\t\t\t\tthis.backend.setup();\n\t\t\t\tthis.isSetUp = true;\n\t\t\t} else if (!shouldSetUp && this.isSetUp) {\n\t\t\t\tthis.backend.teardown();\n\t\t\t\tthis.isSetUp = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getContext',\n\t\tvalue: function getContext() {\n\t\t\treturn this.context;\n\t\t}\n\t}, {\n\t\tkey: 'getMonitor',\n\t\tvalue: function getMonitor() {\n\t\t\treturn this.monitor;\n\t\t}\n\t}, {\n\t\tkey: 'getBackend',\n\t\tvalue: function getBackend() {\n\t\t\treturn this.backend;\n\t\t}\n\t}, {\n\t\tkey: 'getRegistry',\n\t\tvalue: function getRegistry() {\n\t\t\treturn this.registry;\n\t\t}\n\t}, {\n\t\tkey: 'getActions',\n\t\tvalue: function getActions() {\n\t\t\tvar manager = this;\n\t\t\tvar dispatch = this.store.dispatch;\n\n\n\t\t\tfunction bindActionCreator(actionCreator) {\n\t\t\t\treturn function () {\n\t\t\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\t\t\targs[_key] = arguments[_key];\n\t\t\t\t\t}\n\n\t\t\t\t\tvar action = actionCreator.apply(manager, args);\n\t\t\t\t\tif (typeof action !== 'undefined') {\n\t\t\t\t\t\tdispatch(action);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn Object.keys(dragDropActions).filter(function (key) {\n\t\t\t\treturn typeof dragDropActions[key] === 'function';\n\t\t\t}).reduce(function (boundActions, key) {\n\t\t\t\tvar action = dragDropActions[key];\n\t\t\t\tboundActions[key] = bindActionCreator(action); // eslint-disable-line no-param-reassign\n\t\t\t\treturn boundActions;\n\t\t\t}, {});\n\t\t}\n\t}]);\n\n\treturn DragDropManager;\n}();\n\nexports.default = DragDropManager;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/DragDropManager.js\n// module id = 1115\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\nexports.ActionTypes = undefined;\nexports['default'] = createStore;\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _symbolObservable = require('symbol-observable');\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar ActionTypes = exports.ActionTypes = {\n  INIT: '@@redux/INIT'\n\n  /**\n   * Creates a Redux store that holds the state tree.\n   * The only way to change the data in the store is to call `dispatch()` on it.\n   *\n   * There should only be a single store in your app. To specify how different\n   * parts of the state tree respond to actions, you may combine several reducers\n   * into a single reducer function by using `combineReducers`.\n   *\n   * @param {Function} reducer A function that returns the next state tree, given\n   * the current state tree and the action to handle.\n   *\n   * @param {any} [preloadedState] The initial state. You may optionally specify it\n   * to hydrate the state from the server in universal apps, or to restore a\n   * previously serialized user session.\n   * If you use `combineReducers` to produce the root reducer function, this must be\n   * an object with the same shape as `combineReducers` keys.\n   *\n   * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n   * to enhance the store with third-party capabilities such as middleware,\n   * time travel, persistence, etc. The only store enhancer that ships with Redux\n   * is `applyMiddleware()`.\n   *\n   * @returns {Store} A Redux store that lets you read the state, dispatch actions\n   * and subscribe to changes.\n   */\n};function createStore(reducer, preloadedState, enhancer) {\n  var _ref2;\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n    enhancer = preloadedState;\n    preloadedState = undefined;\n  }\n\n  if (typeof enhancer !== 'undefined') {\n    if (typeof enhancer !== 'function') {\n      throw new Error('Expected the enhancer to be a function.');\n    }\n\n    return enhancer(createStore)(reducer, preloadedState);\n  }\n\n  if (typeof reducer !== 'function') {\n    throw new Error('Expected the reducer to be a function.');\n  }\n\n  var currentReducer = reducer;\n  var currentState = preloadedState;\n  var currentListeners = [];\n  var nextListeners = currentListeners;\n  var isDispatching = false;\n\n  function ensureCanMutateNextListeners() {\n    if (nextListeners === currentListeners) {\n      nextListeners = currentListeners.slice();\n    }\n  }\n\n  /**\n   * Reads the state tree managed by the store.\n   *\n   * @returns {any} The current state tree of your application.\n   */\n  function getState() {\n    return currentState;\n  }\n\n  /**\n   * Adds a change listener. It will be called any time an action is dispatched,\n   * and some part of the state tree may potentially have changed. You may then\n   * call `getState()` to read the current state tree inside the callback.\n   *\n   * You may call `dispatch()` from a change listener, with the following\n   * caveats:\n   *\n   * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n   * If you subscribe or unsubscribe while the listeners are being invoked, this\n   * will not have any effect on the `dispatch()` that is currently in progress.\n   * However, the next `dispatch()` call, whether nested or not, will use a more\n   * recent snapshot of the subscription list.\n   *\n   * 2. The listener should not expect to see all state changes, as the state\n   * might have been updated multiple times during a nested `dispatch()` before\n   * the listener is called. It is, however, guaranteed that all subscribers\n   * registered before the `dispatch()` started will be called with the latest\n   * state by the time it exits.\n   *\n   * @param {Function} listener A callback to be invoked on every dispatch.\n   * @returns {Function} A function to remove this change listener.\n   */\n  function subscribe(listener) {\n    if (typeof listener !== 'function') {\n      throw new Error('Expected listener to be a function.');\n    }\n\n    var isSubscribed = true;\n\n    ensureCanMutateNextListeners();\n    nextListeners.push(listener);\n\n    return function unsubscribe() {\n      if (!isSubscribed) {\n        return;\n      }\n\n      isSubscribed = false;\n\n      ensureCanMutateNextListeners();\n      var index = nextListeners.indexOf(listener);\n      nextListeners.splice(index, 1);\n    };\n  }\n\n  /**\n   * Dispatches an action. It is the only way to trigger a state change.\n   *\n   * The `reducer` function, used to create the store, will be called with the\n   * current state tree and the given `action`. Its return value will\n   * be considered the **next** state of the tree, and the change listeners\n   * will be notified.\n   *\n   * The base implementation only supports plain object actions. If you want to\n   * dispatch a Promise, an Observable, a thunk, or something else, you need to\n   * wrap your store creating function into the corresponding middleware. For\n   * example, see the documentation for the `redux-thunk` package. Even the\n   * middleware will eventually dispatch plain object actions using this method.\n   *\n   * @param {Object} action A plain object representing “what changed”. It is\n   * a good idea to keep actions serializable so you can record and replay user\n   * sessions, or use the time travelling `redux-devtools`. An action must have\n   * a `type` property which may not be `undefined`. It is a good idea to use\n   * string constants for action types.\n   *\n   * @returns {Object} For convenience, the same action object you dispatched.\n   *\n   * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n   * return something else (for example, a Promise you can await).\n   */\n  function dispatch(action) {\n    if (!(0, _isPlainObject2['default'])(action)) {\n      throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n    }\n\n    if (typeof action.type === 'undefined') {\n      throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n    }\n\n    if (isDispatching) {\n      throw new Error('Reducers may not dispatch actions.');\n    }\n\n    try {\n      isDispatching = true;\n      currentState = currentReducer(currentState, action);\n    } finally {\n      isDispatching = false;\n    }\n\n    var listeners = currentListeners = nextListeners;\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      listener();\n    }\n\n    return action;\n  }\n\n  /**\n   * Replaces the reducer currently used by the store to calculate the state.\n   *\n   * You might need this if your app implements code splitting and you want to\n   * load some of the reducers dynamically. You might also need this if you\n   * implement a hot reloading mechanism for Redux.\n   *\n   * @param {Function} nextReducer The reducer for the store to use instead.\n   * @returns {void}\n   */\n  function replaceReducer(nextReducer) {\n    if (typeof nextReducer !== 'function') {\n      throw new Error('Expected the nextReducer to be a function.');\n    }\n\n    currentReducer = nextReducer;\n    dispatch({ type: ActionTypes.INIT });\n  }\n\n  /**\n   * Interoperability point for observable/reactive libraries.\n   * @returns {observable} A minimal observable of state changes.\n   * For more information, see the observable proposal:\n   * https://github.com/tc39/proposal-observable\n   */\n  function observable() {\n    var _ref;\n\n    var outerSubscribe = subscribe;\n    return _ref = {\n      /**\n       * The minimal observable subscription method.\n       * @param {Object} observer Any object that can be used as an observer.\n       * The observer object should have a `next` method.\n       * @returns {subscription} An object with an `unsubscribe` method that can\n       * be used to unsubscribe the observable from the store, and prevent further\n       * emission of values from the observable.\n       */\n      subscribe: function subscribe(observer) {\n        if (typeof observer !== 'object') {\n          throw new TypeError('Expected the observer to be an object.');\n        }\n\n        function observeState() {\n          if (observer.next) {\n            observer.next(getState());\n          }\n        }\n\n        observeState();\n        var unsubscribe = outerSubscribe(observeState);\n        return { unsubscribe: unsubscribe };\n      }\n    }, _ref[_symbolObservable2['default']] = function () {\n      return this;\n    }, _ref;\n  }\n\n  // When a store is created, an \"INIT\" action is dispatched so that every\n  // reducer returns their initial state. This effectively populates\n  // the initial state tree.\n  dispatch({ type: ActionTypes.INIT });\n\n  return _ref2 = {\n    dispatch: dispatch,\n    subscribe: subscribe,\n    getState: getState,\n    replaceReducer: replaceReducer\n  }, _ref2[_symbolObservable2['default']] = observable, _ref2;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/lib/createStore.js\n// module id = 1116\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/isPlainObject.js\n// module id = 1117\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_baseGetTag.js\n// module id = 1118\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_root.js\n// module id = 1119\n// module chunks = 0 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_freeGlobal.js\n// module id = 1120\n// module chunks = 0 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_getRawTag.js\n// module id = 1121\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_objectToString.js\n// module id = 1122\n// module chunks = 0 1","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_getPrototype.js\n// module id = 1123\n// module chunks = 0 1","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/_overArg.js\n// module id = 1124\n// module chunks = 0 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/redux/node_modules/lodash/isObjectLike.js\n// module id = 1125\n// module chunks = 0 1","/* global window */\nimport ponyfill from './ponyfill.js';\n\nvar root;\n\nif (typeof self !== 'undefined') {\n  root = self;\n} else if (typeof window !== 'undefined') {\n  root = window;\n} else if (typeof global !== 'undefined') {\n  root = global;\n} else if (typeof module !== 'undefined') {\n  root = module;\n} else {\n  root = Function('return this')();\n}\n\nvar result = ponyfill(root);\nexport default result;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/symbol-observable/es/index.js\n// module id = 1126\n// module chunks = 0 1","module.exports = function(originalModule) {\r\n\tif(!originalModule.webpackPolyfill) {\r\n\t\tvar module = Object.create(originalModule);\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"exports\", {\r\n\t\t\tenumerable: true,\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/harmony-module.js\n// module id = 1127\n// module chunks = 0 1","export default function symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/symbol-observable/es/ponyfill.js\n// module id = 1128\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = reduce;\n\nvar _dragOffset = require('./dragOffset');\n\nvar _dragOffset2 = _interopRequireDefault(_dragOffset);\n\nvar _dragOperation = require('./dragOperation');\n\nvar _dragOperation2 = _interopRequireDefault(_dragOperation);\n\nvar _refCount = require('./refCount');\n\nvar _refCount2 = _interopRequireDefault(_refCount);\n\nvar _dirtyHandlerIds = require('./dirtyHandlerIds');\n\nvar _dirtyHandlerIds2 = _interopRequireDefault(_dirtyHandlerIds);\n\nvar _stateId = require('./stateId');\n\nvar _stateId2 = _interopRequireDefault(_stateId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction reduce() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\tvar action = arguments[1];\n\n\treturn {\n\t\tdirtyHandlerIds: (0, _dirtyHandlerIds2.default)(state.dirtyHandlerIds, action, state.dragOperation),\n\t\tdragOffset: (0, _dragOffset2.default)(state.dragOffset, action),\n\t\trefCount: (0, _refCount2.default)(state.refCount, action),\n\t\tdragOperation: (0, _dragOperation2.default)(state.dragOperation, action),\n\t\tstateId: (0, _stateId2.default)(state.stateId)\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/index.js\n// module id = 1129\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = dragOperation;\n\nvar _without = require('lodash/without');\n\nvar _without2 = _interopRequireDefault(_without);\n\nvar _dragDrop = require('../actions/dragDrop');\n\nvar _registry = require('../actions/registry');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar initialState = {\n\titemType: null,\n\titem: null,\n\tsourceId: null,\n\ttargetIds: [],\n\tdropResult: null,\n\tdidDrop: false,\n\tisSourcePublic: null\n};\n\nfunction dragOperation() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _dragDrop.BEGIN_DRAG:\n\t\t\treturn _extends({}, state, {\n\t\t\t\titemType: action.itemType,\n\t\t\t\titem: action.item,\n\t\t\t\tsourceId: action.sourceId,\n\t\t\t\tisSourcePublic: action.isSourcePublic,\n\t\t\t\tdropResult: null,\n\t\t\t\tdidDrop: false\n\t\t\t});\n\t\tcase _dragDrop.PUBLISH_DRAG_SOURCE:\n\t\t\treturn _extends({}, state, {\n\t\t\t\tisSourcePublic: true\n\t\t\t});\n\t\tcase _dragDrop.HOVER:\n\t\t\treturn _extends({}, state, {\n\t\t\t\ttargetIds: action.targetIds\n\t\t\t});\n\t\tcase _registry.REMOVE_TARGET:\n\t\t\tif (state.targetIds.indexOf(action.targetId) === -1) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn _extends({}, state, {\n\t\t\t\ttargetIds: (0, _without2.default)(state.targetIds, action.targetId)\n\t\t\t});\n\t\tcase _dragDrop.DROP:\n\t\t\treturn _extends({}, state, {\n\t\t\t\tdropResult: action.dropResult,\n\t\t\t\tdidDrop: true,\n\t\t\t\ttargetIds: []\n\t\t\t});\n\t\tcase _dragDrop.END_DRAG:\n\t\t\treturn _extends({}, state, {\n\t\t\t\titemType: null,\n\t\t\t\titem: null,\n\t\t\t\tsourceId: null,\n\t\t\t\tdropResult: null,\n\t\t\t\tdidDrop: false,\n\t\t\t\tisSourcePublic: null,\n\t\t\t\ttargetIds: []\n\t\t\t});\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/dragOperation.js\n// module id = 1130\n// module chunks = 0 1","var baseDifference = require('./_baseDifference'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/without.js\n// module id = 1131\n// module chunks = 0 1","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_MapCache.js\n// module id = 1132\n// module chunks = 0 1","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_mapCacheClear.js\n// module id = 1133\n// module chunks = 0 1","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_Hash.js\n// module id = 1134\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_hashClear.js\n// module id = 1135\n// module chunks = 0 1","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseIsNative.js\n// module id = 1136\n// module chunks = 0 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_freeGlobal.js\n// module id = 1137\n// module chunks = 0 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_getRawTag.js\n// module id = 1138\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_objectToString.js\n// module id = 1139\n// module chunks = 0 1","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_isMasked.js\n// module id = 1140\n// module chunks = 0 1","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_coreJsData.js\n// module id = 1141\n// module chunks = 0 1","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_toSource.js\n// module id = 1142\n// module chunks = 0 1","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_getValue.js\n// module id = 1143\n// module chunks = 0 1","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_hashDelete.js\n// module id = 1144\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_hashGet.js\n// module id = 1145\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_hashHas.js\n// module id = 1146\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_hashSet.js\n// module id = 1147\n// module chunks = 0 1","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_ListCache.js\n// module id = 1148\n// module chunks = 0 1","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_listCacheClear.js\n// module id = 1149\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_listCacheDelete.js\n// module id = 1150\n// module chunks = 0 1","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/eq.js\n// module id = 1151\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_listCacheGet.js\n// module id = 1152\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_listCacheHas.js\n// module id = 1153\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_listCacheSet.js\n// module id = 1154\n// module chunks = 0 1","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_Map.js\n// module id = 1155\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_mapCacheDelete.js\n// module id = 1156\n// module chunks = 0 1","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_isKeyable.js\n// module id = 1157\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_mapCacheGet.js\n// module id = 1158\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_mapCacheHas.js\n// module id = 1159\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_mapCacheSet.js\n// module id = 1160\n// module chunks = 0 1","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_setCacheAdd.js\n// module id = 1161\n// module chunks = 0 1","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_setCacheHas.js\n// module id = 1162\n// module chunks = 0 1","var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseIndexOf.js\n// module id = 1163\n// module chunks = 0 1","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseFindIndex.js\n// module id = 1164\n// module chunks = 0 1","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseIsNaN.js\n// module id = 1165\n// module chunks = 0 1","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_strictIndexOf.js\n// module id = 1166\n// module chunks = 0 1","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_overRest.js\n// module id = 1167\n// module chunks = 0 1","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_apply.js\n// module id = 1168\n// module chunks = 0 1","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_setToString.js\n// module id = 1169\n// module chunks = 0 1","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseSetToString.js\n// module id = 1170\n// module chunks = 0 1","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/constant.js\n// module id = 1171\n// module chunks = 0 1","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_defineProperty.js\n// module id = 1172\n// module chunks = 0 1","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_shortOut.js\n// module id = 1173\n// module chunks = 0 1","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isArrayLike.js\n// module id = 1174\n// module chunks = 0 1","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isLength.js\n// module id = 1175\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = refCount;\n\nvar _registry = require('../actions/registry');\n\nfunction refCount() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\tvar action = arguments[1];\n\n\tswitch (action.type) {\n\t\tcase _registry.ADD_SOURCE:\n\t\tcase _registry.ADD_TARGET:\n\t\t\treturn state + 1;\n\t\tcase _registry.REMOVE_SOURCE:\n\t\tcase _registry.REMOVE_TARGET:\n\t\t\treturn state - 1;\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/refCount.js\n// module id = 1176\n// module chunks = 0 1","var arrayFilter = require('./_arrayFilter'),\n    baseRest = require('./_baseRest'),\n    baseXor = require('./_baseXor'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\nvar xor = baseRest(function(arrays) {\n  return baseXor(arrayFilter(arrays, isArrayLikeObject));\n});\n\nmodule.exports = xor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/xor.js\n// module id = 1177\n// module chunks = 0 1","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_arrayFilter.js\n// module id = 1178\n// module chunks = 0 1","var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\nfunction baseXor(arrays, iteratee, comparator) {\n  var length = arrays.length;\n  if (length < 2) {\n    return length ? baseUniq(arrays[0]) : [];\n  }\n  var index = -1,\n      result = Array(length);\n\n  while (++index < length) {\n    var array = arrays[index],\n        othIndex = -1;\n\n    while (++othIndex < length) {\n      if (othIndex != index) {\n        result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n      }\n    }\n  }\n  return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n}\n\nmodule.exports = baseXor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseXor.js\n// module id = 1179\n// module chunks = 0 1","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseFlatten.js\n// module id = 1180\n// module chunks = 0 1","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_arrayPush.js\n// module id = 1181\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_isFlattenable.js\n// module id = 1182\n// module chunks = 0 1","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/isArguments.js\n// module id = 1183\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseIsArguments.js\n// module id = 1184\n// module chunks = 0 1","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseUniq.js\n// module id = 1185\n// module chunks = 0 1","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_createSet.js\n// module id = 1186\n// module chunks = 0 1","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_Set.js\n// module id = 1187\n// module chunks = 0 1","var arrayMap = require('./_arrayMap'),\n    baseIntersection = require('./_baseIntersection'),\n    baseRest = require('./_baseRest'),\n    castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n  var mapped = arrayMap(arrays, castArrayLikeObject);\n  return (mapped.length && mapped[0] === arrays[0])\n    ? baseIntersection(mapped)\n    : [];\n});\n\nmodule.exports = intersection;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/intersection.js\n// module id = 1188\n// module chunks = 0 1","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n  var includes = comparator ? arrayIncludesWith : arrayIncludes,\n      length = arrays[0].length,\n      othLength = arrays.length,\n      othIndex = othLength,\n      caches = Array(othLength),\n      maxLength = Infinity,\n      result = [];\n\n  while (othIndex--) {\n    var array = arrays[othIndex];\n    if (othIndex && iteratee) {\n      array = arrayMap(array, baseUnary(iteratee));\n    }\n    maxLength = nativeMin(array.length, maxLength);\n    caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n      ? new SetCache(othIndex && array)\n      : undefined;\n  }\n  array = arrays[0];\n\n  var index = -1,\n      seen = caches[0];\n\n  outer:\n  while (++index < length && result.length < maxLength) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (!(seen\n          ? cacheHas(seen, computed)\n          : includes(result, computed, comparator)\n        )) {\n      othIndex = othLength;\n      while (--othIndex) {\n        var cache = caches[othIndex];\n        if (!(cache\n              ? cacheHas(cache, computed)\n              : includes(arrays[othIndex], computed, comparator))\n            ) {\n          continue outer;\n        }\n      }\n      if (seen) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseIntersection;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_baseIntersection.js\n// module id = 1189\n// module chunks = 0 1","var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n  return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/node_modules/lodash/_castArrayLikeObject.js\n// module id = 1190\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = stateId;\nfunction stateId() {\n\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n\treturn state + 1;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/reducers/stateId.js\n// module id = 1191\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _matchesType = require('./utils/matchesType');\n\nvar _matchesType2 = _interopRequireDefault(_matchesType);\n\nvar _HandlerRegistry = require('./HandlerRegistry');\n\nvar _HandlerRegistry2 = _interopRequireDefault(_HandlerRegistry);\n\nvar _dragOffset = require('./reducers/dragOffset');\n\nvar _dirtyHandlerIds = require('./reducers/dirtyHandlerIds');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragDropMonitor = function () {\n\tfunction DragDropMonitor(store) {\n\t\t_classCallCheck(this, DragDropMonitor);\n\n\t\tthis.store = store;\n\t\tthis.registry = new _HandlerRegistry2.default(store);\n\t}\n\n\t_createClass(DragDropMonitor, [{\n\t\tkey: 'subscribeToStateChange',\n\t\tvalue: function subscribeToStateChange(listener) {\n\t\t\tvar _this = this;\n\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\t\tvar handlerIds = options.handlerIds;\n\n\t\t\t(0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.');\n\t\t\t(0, _invariant2.default)(typeof handlerIds === 'undefined' || (0, _isArray2.default)(handlerIds), 'handlerIds, when specified, must be an array of strings.');\n\n\t\t\tvar prevStateId = this.store.getState().stateId;\n\t\t\tvar handleChange = function handleChange() {\n\t\t\t\tvar state = _this.store.getState();\n\t\t\t\tvar currentStateId = state.stateId;\n\t\t\t\ttry {\n\t\t\t\t\tvar canSkipListener = currentStateId === prevStateId || currentStateId === prevStateId + 1 && !(0, _dirtyHandlerIds.areDirty)(state.dirtyHandlerIds, handlerIds);\n\n\t\t\t\t\tif (!canSkipListener) {\n\t\t\t\t\t\tlistener();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tprevStateId = currentStateId;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn this.store.subscribe(handleChange);\n\t\t}\n\t}, {\n\t\tkey: 'subscribeToOffsetChange',\n\t\tvalue: function subscribeToOffsetChange(listener) {\n\t\t\tvar _this2 = this;\n\n\t\t\t(0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.');\n\n\t\t\tvar previousState = this.store.getState().dragOffset;\n\t\t\tvar handleChange = function handleChange() {\n\t\t\t\tvar nextState = _this2.store.getState().dragOffset;\n\t\t\t\tif (nextState === previousState) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpreviousState = nextState;\n\t\t\t\tlistener();\n\t\t\t};\n\n\t\t\treturn this.store.subscribe(handleChange);\n\t\t}\n\t}, {\n\t\tkey: 'canDragSource',\n\t\tvalue: function canDragSource(sourceId) {\n\t\t\tvar source = this.registry.getSource(sourceId);\n\t\t\t(0, _invariant2.default)(source, 'Expected to find a valid source.');\n\n\t\t\tif (this.isDragging()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn source.canDrag(this, sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'canDropOnTarget',\n\t\tvalue: function canDropOnTarget(targetId) {\n\t\t\tvar target = this.registry.getTarget(targetId);\n\t\t\t(0, _invariant2.default)(target, 'Expected to find a valid target.');\n\n\t\t\tif (!this.isDragging() || this.didDrop()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetType = this.registry.getTargetType(targetId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\treturn (0, _matchesType2.default)(targetType, draggedItemType) && target.canDrop(this, targetId);\n\t\t}\n\t}, {\n\t\tkey: 'isDragging',\n\t\tvalue: function isDragging() {\n\t\t\treturn Boolean(this.getItemType());\n\t\t}\n\t}, {\n\t\tkey: 'isDraggingSource',\n\t\tvalue: function isDraggingSource(sourceId) {\n\t\t\tvar source = this.registry.getSource(sourceId, true);\n\t\t\t(0, _invariant2.default)(source, 'Expected to find a valid source.');\n\n\t\t\tif (!this.isDragging() || !this.isSourcePublic()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar sourceType = this.registry.getSourceType(sourceId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\tif (sourceType !== draggedItemType) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn source.isDragging(this, sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'isOverTarget',\n\t\tvalue: function isOverTarget(targetId) {\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { shallow: false };\n\t\t\tvar shallow = options.shallow;\n\n\t\t\tif (!this.isDragging()) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetType = this.registry.getTargetType(targetId);\n\t\t\tvar draggedItemType = this.getItemType();\n\t\t\tif (!(0, _matchesType2.default)(targetType, draggedItemType)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar targetIds = this.getTargetIds();\n\t\t\tif (!targetIds.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar index = targetIds.indexOf(targetId);\n\t\t\tif (shallow) {\n\t\t\t\treturn index === targetIds.length - 1;\n\t\t\t} else {\n\t\t\t\treturn index > -1;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.store.getState().dragOperation.itemType;\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.store.getState().dragOperation.item;\n\t\t}\n\t}, {\n\t\tkey: 'getSourceId',\n\t\tvalue: function getSourceId() {\n\t\t\treturn this.store.getState().dragOperation.sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'getTargetIds',\n\t\tvalue: function getTargetIds() {\n\t\t\treturn this.store.getState().dragOperation.targetIds;\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.store.getState().dragOperation.dropResult;\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.store.getState().dragOperation.didDrop;\n\t\t}\n\t}, {\n\t\tkey: 'isSourcePublic',\n\t\tvalue: function isSourcePublic() {\n\t\t\treturn this.store.getState().dragOperation.isSourcePublic;\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.initialClientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.initialSourceClientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.store.getState().dragOffset.clientOffset;\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn (0, _dragOffset.getSourceClientOffset)(this.store.getState().dragOffset);\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn (0, _dragOffset.getDifferenceFromInitialOffset)(this.store.getState().dragOffset);\n\t\t}\n\t}]);\n\n\treturn DragDropMonitor;\n}();\n\nexports.default = DragDropMonitor;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/DragDropMonitor.js\n// module id = 1192\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isArray = require('lodash/isArray');\n\nvar _isArray2 = _interopRequireDefault(_isArray);\n\nvar _asap = require('asap');\n\nvar _asap2 = _interopRequireDefault(_asap);\n\nvar _registry = require('./actions/registry');\n\nvar _getNextUniqueId = require('./utils/getNextUniqueId');\n\nvar _getNextUniqueId2 = _interopRequireDefault(_getNextUniqueId);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HandlerRoles = {\n\tSOURCE: 'SOURCE',\n\tTARGET: 'TARGET'\n};\n\nfunction validateSourceContract(source) {\n\t(0, _invariant2.default)(typeof source.canDrag === 'function', 'Expected canDrag to be a function.');\n\t(0, _invariant2.default)(typeof source.beginDrag === 'function', 'Expected beginDrag to be a function.');\n\t(0, _invariant2.default)(typeof source.endDrag === 'function', 'Expected endDrag to be a function.');\n}\n\nfunction validateTargetContract(target) {\n\t(0, _invariant2.default)(typeof target.canDrop === 'function', 'Expected canDrop to be a function.');\n\t(0, _invariant2.default)(typeof target.hover === 'function', 'Expected hover to be a function.');\n\t(0, _invariant2.default)(typeof target.drop === 'function', 'Expected beginDrag to be a function.');\n}\n\nfunction validateType(type, allowArray) {\n\tif (allowArray && (0, _isArray2.default)(type)) {\n\t\ttype.forEach(function (t) {\n\t\t\treturn validateType(t, false);\n\t\t});\n\t\treturn;\n\t}\n\n\t(0, _invariant2.default)(typeof type === 'string' || (typeof type === 'undefined' ? 'undefined' : _typeof(type)) === 'symbol', allowArray ? 'Type can only be a string, a symbol, or an array of either.' : 'Type can only be a string or a symbol.');\n}\n\nfunction getNextHandlerId(role) {\n\tvar id = (0, _getNextUniqueId2.default)().toString();\n\tswitch (role) {\n\t\tcase HandlerRoles.SOURCE:\n\t\t\treturn 'S' + id;\n\t\tcase HandlerRoles.TARGET:\n\t\t\treturn 'T' + id;\n\t\tdefault:\n\t\t\t(0, _invariant2.default)(false, 'Unknown role: ' + role);\n\t}\n}\n\nfunction parseRoleFromHandlerId(handlerId) {\n\tswitch (handlerId[0]) {\n\t\tcase 'S':\n\t\t\treturn HandlerRoles.SOURCE;\n\t\tcase 'T':\n\t\t\treturn HandlerRoles.TARGET;\n\t\tdefault:\n\t\t\t(0, _invariant2.default)(false, 'Cannot parse handler ID: ' + handlerId);\n\t}\n}\n\nvar HandlerRegistry = function () {\n\tfunction HandlerRegistry(store) {\n\t\t_classCallCheck(this, HandlerRegistry);\n\n\t\tthis.store = store;\n\n\t\tthis.types = {};\n\t\tthis.handlers = {};\n\n\t\tthis.pinnedSourceId = null;\n\t\tthis.pinnedSource = null;\n\t}\n\n\t_createClass(HandlerRegistry, [{\n\t\tkey: 'addSource',\n\t\tvalue: function addSource(type, source) {\n\t\t\tvalidateType(type);\n\t\t\tvalidateSourceContract(source);\n\n\t\t\tvar sourceId = this.addHandler(HandlerRoles.SOURCE, type, source);\n\t\t\tthis.store.dispatch((0, _registry.addSource)(sourceId));\n\t\t\treturn sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'addTarget',\n\t\tvalue: function addTarget(type, target) {\n\t\t\tvalidateType(type, true);\n\t\t\tvalidateTargetContract(target);\n\n\t\t\tvar targetId = this.addHandler(HandlerRoles.TARGET, type, target);\n\t\t\tthis.store.dispatch((0, _registry.addTarget)(targetId));\n\t\t\treturn targetId;\n\t\t}\n\t}, {\n\t\tkey: 'addHandler',\n\t\tvalue: function addHandler(role, type, handler) {\n\t\t\tvar id = getNextHandlerId(role);\n\t\t\tthis.types[id] = type;\n\t\t\tthis.handlers[id] = handler;\n\n\t\t\treturn id;\n\t\t}\n\t}, {\n\t\tkey: 'containsHandler',\n\t\tvalue: function containsHandler(handler) {\n\t\t\tvar _this = this;\n\n\t\t\treturn Object.keys(this.handlers).some(function (key) {\n\t\t\t\treturn _this.handlers[key] === handler;\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getSource',\n\t\tvalue: function getSource(sourceId, includePinned) {\n\t\t\t(0, _invariant2.default)(this.isSourceId(sourceId), 'Expected a valid source ID.');\n\n\t\t\tvar isPinned = includePinned && sourceId === this.pinnedSourceId;\n\t\t\tvar source = isPinned ? this.pinnedSource : this.handlers[sourceId];\n\n\t\t\treturn source;\n\t\t}\n\t}, {\n\t\tkey: 'getTarget',\n\t\tvalue: function getTarget(targetId) {\n\t\t\t(0, _invariant2.default)(this.isTargetId(targetId), 'Expected a valid target ID.');\n\t\t\treturn this.handlers[targetId];\n\t\t}\n\t}, {\n\t\tkey: 'getSourceType',\n\t\tvalue: function getSourceType(sourceId) {\n\t\t\t(0, _invariant2.default)(this.isSourceId(sourceId), 'Expected a valid source ID.');\n\t\t\treturn this.types[sourceId];\n\t\t}\n\t}, {\n\t\tkey: 'getTargetType',\n\t\tvalue: function getTargetType(targetId) {\n\t\t\t(0, _invariant2.default)(this.isTargetId(targetId), 'Expected a valid target ID.');\n\t\t\treturn this.types[targetId];\n\t\t}\n\t}, {\n\t\tkey: 'isSourceId',\n\t\tvalue: function isSourceId(handlerId) {\n\t\t\tvar role = parseRoleFromHandlerId(handlerId);\n\t\t\treturn role === HandlerRoles.SOURCE;\n\t\t}\n\t}, {\n\t\tkey: 'isTargetId',\n\t\tvalue: function isTargetId(handlerId) {\n\t\t\tvar role = parseRoleFromHandlerId(handlerId);\n\t\t\treturn role === HandlerRoles.TARGET;\n\t\t}\n\t}, {\n\t\tkey: 'removeSource',\n\t\tvalue: function removeSource(sourceId) {\n\t\t\tvar _this2 = this;\n\n\t\t\t(0, _invariant2.default)(this.getSource(sourceId), 'Expected an existing source.');\n\t\t\tthis.store.dispatch((0, _registry.removeSource)(sourceId));\n\n\t\t\t(0, _asap2.default)(function () {\n\t\t\t\tdelete _this2.handlers[sourceId];\n\t\t\t\tdelete _this2.types[sourceId];\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'removeTarget',\n\t\tvalue: function removeTarget(targetId) {\n\t\t\tvar _this3 = this;\n\n\t\t\t(0, _invariant2.default)(this.getTarget(targetId), 'Expected an existing target.');\n\t\t\tthis.store.dispatch((0, _registry.removeTarget)(targetId));\n\n\t\t\t(0, _asap2.default)(function () {\n\t\t\t\tdelete _this3.handlers[targetId];\n\t\t\t\tdelete _this3.types[targetId];\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'pinSource',\n\t\tvalue: function pinSource(sourceId) {\n\t\t\tvar source = this.getSource(sourceId);\n\t\t\t(0, _invariant2.default)(source, 'Expected an existing source.');\n\n\t\t\tthis.pinnedSourceId = sourceId;\n\t\t\tthis.pinnedSource = source;\n\t\t}\n\t}, {\n\t\tkey: 'unpinSource',\n\t\tvalue: function unpinSource() {\n\t\t\t(0, _invariant2.default)(this.pinnedSource, 'No source is pinned at the time.');\n\n\t\t\tthis.pinnedSourceId = null;\n\t\t\tthis.pinnedSource = null;\n\t\t}\n\t}]);\n\n\treturn HandlerRegistry;\n}();\n\nexports.default = HandlerRegistry;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/HandlerRegistry.js\n// module id = 1193\n// module chunks = 0 1","\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n    if (pendingErrors.length) {\n        throw pendingErrors.shift();\n    }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n    var rawTask;\n    if (freeTasks.length) {\n        rawTask = freeTasks.pop();\n    } else {\n        rawTask = new RawTask();\n    }\n    rawTask.task = task;\n    rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects.  A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n    this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n    try {\n        this.task.call();\n    } catch (error) {\n        if (asap.onerror) {\n            // This hook exists purely for testing purposes.\n            // Its name will be periodically randomized to break any code that\n            // depends on its existence.\n            asap.onerror(error);\n        } else {\n            // In a web browser, exceptions are not fatal. However, to avoid\n            // slowing down the queue of pending tasks, we rethrow the error in a\n            // lower priority turn.\n            pendingErrors.push(error);\n            requestErrorThrow();\n        }\n    } finally {\n        this.task = null;\n        freeTasks[freeTasks.length] = this;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/asap/browser-asap.js\n// module id = 1194\n// module chunks = 0 1","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n    if (!queue.length) {\n        requestFlush();\n        flushing = true;\n    }\n    // Equivalent to push, but avoids a function call.\n    queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n    while (index < queue.length) {\n        var currentIndex = index;\n        // Advance the index before calling the task. This ensures that we will\n        // begin flushing on the next task the task throws an error.\n        index = index + 1;\n        queue[currentIndex].call();\n        // Prevent leaking memory for long chains of recursive calls to `asap`.\n        // If we call `asap` within tasks scheduled by `asap`, the queue will\n        // grow, but to avoid an O(n) walk for every task we execute, we don't\n        // shift tasks off the queue after they have been executed.\n        // Instead, we periodically shift 1024 tasks off the queue.\n        if (index > capacity) {\n            // Manually shift all values starting at the index back to the\n            // beginning of the queue.\n            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n                queue[scan] = queue[scan + index];\n            }\n            queue.length -= index;\n            index = 0;\n        }\n    }\n    queue.length = 0;\n    index = 0;\n    flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n    requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n    requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n    var toggle = 1;\n    var observer = new BrowserMutationObserver(callback);\n    var node = document.createTextNode(\"\");\n    observer.observe(node, {characterData: true});\n    return function requestCall() {\n        toggle = -toggle;\n        node.data = toggle;\n    };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n//     var channel = new MessageChannel();\n//     channel.port1.onmessage = callback;\n//     return function requestCall() {\n//         channel.port2.postMessage(0);\n//     };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n//     return function requestCall() {\n//         setImmediate(callback);\n//     };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n    return function requestCall() {\n        // We dispatch a timeout with a specified delay of 0 for engines that\n        // can reliably accommodate that request. This will usually be snapped\n        // to a 4 milisecond delay, but once we're flushing, there's no delay\n        // between events.\n        var timeoutHandle = setTimeout(handleTimer, 0);\n        // However, since this timer gets frequently dropped in Firefox\n        // workers, we enlist an interval handle that will try to fire\n        // an event 20 times per second until it succeeds.\n        var intervalHandle = setInterval(handleTimer, 50);\n\n        function handleTimer() {\n            // Whichever timer succeeds will cancel both timers and\n            // execute the callback.\n            clearTimeout(timeoutHandle);\n            clearInterval(intervalHandle);\n            callback();\n        }\n    };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/asap/browser-raw.js\n// module id = 1195\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = getNextUniqueId;\nvar nextUniqueId = 0;\n\nfunction getNextUniqueId() {\n\treturn nextUniqueId++;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/utils/getNextUniqueId.js\n// module id = 1196\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DragSource = function () {\n\tfunction DragSource() {\n\t\t_classCallCheck(this, DragSource);\n\t}\n\n\t_createClass(DragSource, [{\n\t\tkey: \"canDrag\",\n\t\tvalue: function canDrag() {\n\t\t\treturn true;\n\t\t}\n\t}, {\n\t\tkey: \"isDragging\",\n\t\tvalue: function isDragging(monitor, handle) {\n\t\t\treturn handle === monitor.getSourceId();\n\t\t}\n\t}, {\n\t\tkey: \"endDrag\",\n\t\tvalue: function endDrag() {}\n\t}]);\n\n\treturn DragSource;\n}();\n\nexports.default = DragSource;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/DragSource.js\n// module id = 1197\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DropTarget = function () {\n\tfunction DropTarget() {\n\t\t_classCallCheck(this, DropTarget);\n\t}\n\n\t_createClass(DropTarget, [{\n\t\tkey: \"canDrop\",\n\t\tvalue: function canDrop() {\n\t\t\treturn true;\n\t\t}\n\t}, {\n\t\tkey: \"hover\",\n\t\tvalue: function hover() {}\n\t}, {\n\t\tkey: \"drop\",\n\t\tvalue: function drop() {}\n\t}]);\n\n\treturn DropTarget;\n}();\n\nexports.default = DropTarget;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/DropTarget.js\n// module id = 1198\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createBackend;\n\nvar _noop = require('lodash/noop');\n\nvar _noop2 = _interopRequireDefault(_noop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar TestBackend = function () {\n\tfunction TestBackend(manager) {\n\t\t_classCallCheck(this, TestBackend);\n\n\t\tthis.actions = manager.getActions();\n\t}\n\n\t_createClass(TestBackend, [{\n\t\tkey: 'setup',\n\t\tvalue: function setup() {\n\t\t\tthis.didCallSetup = true;\n\t\t}\n\t}, {\n\t\tkey: 'teardown',\n\t\tvalue: function teardown() {\n\t\t\tthis.didCallTeardown = true;\n\t\t}\n\t}, {\n\t\tkey: 'connectDragSource',\n\t\tvalue: function connectDragSource() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'connectDragPreview',\n\t\tvalue: function connectDragPreview() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'connectDropTarget',\n\t\tvalue: function connectDropTarget() {\n\t\t\treturn _noop2.default;\n\t\t}\n\t}, {\n\t\tkey: 'simulateBeginDrag',\n\t\tvalue: function simulateBeginDrag(sourceIds, options) {\n\t\t\tthis.actions.beginDrag(sourceIds, options);\n\t\t}\n\t}, {\n\t\tkey: 'simulatePublishDragSource',\n\t\tvalue: function simulatePublishDragSource() {\n\t\t\tthis.actions.publishDragSource();\n\t\t}\n\t}, {\n\t\tkey: 'simulateHover',\n\t\tvalue: function simulateHover(targetIds, options) {\n\t\t\tthis.actions.hover(targetIds, options);\n\t\t}\n\t}, {\n\t\tkey: 'simulateDrop',\n\t\tvalue: function simulateDrop() {\n\t\t\tthis.actions.drop();\n\t\t}\n\t}, {\n\t\tkey: 'simulateEndDrag',\n\t\tvalue: function simulateEndDrag() {\n\t\t\tthis.actions.endDrag();\n\t\t}\n\t}]);\n\n\treturn TestBackend;\n}();\n\nfunction createBackend(manager) {\n\treturn new TestBackend(manager);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/dnd-core/lib/backends/createTestBackend.js\n// module id = 1199\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _class, _temp;\n\nvar _react = require('react');\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _DragDropContext = require('./DragDropContext');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * This class is a React-Component based version of the DragDropContext.\n * This is an alternative to decorating an application component with an ES7 decorator.\n */\nvar DragDropContextProvider = (_temp = _class = function (_Component) {\n\t_inherits(DragDropContextProvider, _Component);\n\n\tfunction DragDropContextProvider(props, context) {\n\t\t_classCallCheck(this, DragDropContextProvider);\n\n\t\t/**\n   * This property determines which window global to use for creating the DragDropManager.\n   * If a window has been injected explicitly via props, that is used first. If it is available\n   * as a context value, then use that, otherwise use the browser global.\n   */\n\t\tvar _this = _possibleConstructorReturn(this, (DragDropContextProvider.__proto__ || Object.getPrototypeOf(DragDropContextProvider)).call(this, props, context));\n\n\t\tvar getWindow = function getWindow() {\n\t\t\tif (props && props.window) {\n\t\t\t\treturn props.window;\n\t\t\t} else if (context && context.window) {\n\t\t\t\treturn context.window;\n\t\t\t} else if (typeof window !== 'undefined') {\n\t\t\t\treturn window;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\n\t\t_this.backend = (0, _DragDropContext.unpackBackendForEs5Users)(props.backend);\n\t\t_this.childContext = (0, _DragDropContext.createChildContext)(_this.backend, {\n\t\t\twindow: getWindow()\n\t\t});\n\t\treturn _this;\n\t}\n\n\t_createClass(DragDropContextProvider, [{\n\t\tkey: 'componentWillReceiveProps',\n\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\tif (nextProps.backend !== this.props.backend || nextProps.window !== this.props.window) {\n\t\t\t\tthrow new Error('DragDropContextProvider backend and window props must not change.');\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getChildContext',\n\t\tvalue: function getChildContext() {\n\t\t\treturn this.childContext;\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\treturn _react.Children.only(this.props.children);\n\t\t}\n\t}]);\n\n\treturn DragDropContextProvider;\n}(_react.Component), _class.propTypes = {\n\tbackend: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.object]).isRequired,\n\tchildren: _propTypes2.default.element.isRequired,\n\twindow: _propTypes2.default.object // eslint-disable-line react/forbid-prop-types\n}, _class.defaultProps = {\n\twindow: undefined\n}, _class.childContextTypes = _DragDropContext.CHILD_CONTEXT_TYPES, _class.displayName = 'DragDropContextProvider', _class.contextTypes = {\n\twindow: _propTypes2.default.object\n}, _temp);\nexports.default = DragDropContextProvider;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/DragDropContextProvider.js\n// module id = 1200\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = DragLayer;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _hoistNonReactStatics = require('hoist-non-react-statics');\n\nvar _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics);\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _shallowEqual = require('./utils/shallowEqual');\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _shallowEqualScalar = require('./utils/shallowEqualScalar');\n\nvar _shallowEqualScalar2 = _interopRequireDefault(_shallowEqualScalar);\n\nvar _checkDecoratorArguments = require('./utils/checkDecoratorArguments');\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction DragLayer(collect) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragLayer', 'collect[, options]'].concat(Array.prototype.slice.call(arguments))); // eslint-disable-line prefer-rest-params\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the first argument to DragLayer to be a function that collects props to inject into the component. ', 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs-drag-layer.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the second argument to DragLayer to be a plain object when specified. ' + 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs-drag-layer.html', options);\n\n\treturn function decorateLayer(DecoratedComponent) {\n\t\tvar _class, _temp;\n\n\t\tvar _options$arePropsEqua = options.arePropsEqual,\n\t\t    arePropsEqual = _options$arePropsEqua === undefined ? _shallowEqualScalar2.default : _options$arePropsEqua;\n\n\t\tvar displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n\t\tvar DragLayerContainer = (_temp = _class = function (_Component) {\n\t\t\t_inherits(DragLayerContainer, _Component);\n\n\t\t\t_createClass(DragLayerContainer, [{\n\t\t\t\tkey: 'getDecoratedComponentInstance',\n\t\t\t\tvalue: function getDecoratedComponentInstance() {\n\t\t\t\t\t(0, _invariant2.default)(this.child, 'In order to access an instance of the decorated component it can not be a stateless component.');\n\t\t\t\t\treturn this.child;\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'shouldComponentUpdate',\n\t\t\t\tvalue: function shouldComponentUpdate(nextProps, nextState) {\n\t\t\t\t\treturn !arePropsEqual(nextProps, this.props) || !(0, _shallowEqual2.default)(nextState, this.state);\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\tfunction DragLayerContainer(props, context) {\n\t\t\t\t_classCallCheck(this, DragLayerContainer);\n\n\t\t\t\tvar _this = _possibleConstructorReturn(this, (DragLayerContainer.__proto__ || Object.getPrototypeOf(DragLayerContainer)).call(this, props));\n\n\t\t\t\t_this.handleChange = _this.handleChange.bind(_this);\n\n\t\t\t\t_this.manager = context.dragDropManager;\n\t\t\t\t(0, _invariant2.default)(_typeof(_this.manager) === 'object', 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to wrap the top-level component of your app with DragDropContext. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-troubleshooting.html#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);\n\n\t\t\t\t_this.state = _this.getCurrentState();\n\t\t\t\treturn _this;\n\t\t\t}\n\n\t\t\t_createClass(DragLayerContainer, [{\n\t\t\t\tkey: 'componentDidMount',\n\t\t\t\tvalue: function componentDidMount() {\n\t\t\t\t\tthis.isCurrentlyMounted = true;\n\n\t\t\t\t\tvar monitor = this.manager.getMonitor();\n\t\t\t\t\tthis.unsubscribeFromOffsetChange = monitor.subscribeToOffsetChange(this.handleChange);\n\t\t\t\t\tthis.unsubscribeFromStateChange = monitor.subscribeToStateChange(this.handleChange);\n\n\t\t\t\t\tthis.handleChange();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'componentWillUnmount',\n\t\t\t\tvalue: function componentWillUnmount() {\n\t\t\t\t\tthis.isCurrentlyMounted = false;\n\n\t\t\t\t\tthis.unsubscribeFromOffsetChange();\n\t\t\t\t\tthis.unsubscribeFromStateChange();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'handleChange',\n\t\t\t\tvalue: function handleChange() {\n\t\t\t\t\tif (!this.isCurrentlyMounted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar nextState = this.getCurrentState();\n\t\t\t\t\tif (!(0, _shallowEqual2.default)(nextState, this.state)) {\n\t\t\t\t\t\tthis.setState(nextState);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'getCurrentState',\n\t\t\t\tvalue: function getCurrentState() {\n\t\t\t\t\tvar monitor = this.manager.getMonitor();\n\t\t\t\t\treturn collect(monitor, this.props);\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tkey: 'render',\n\t\t\t\tvalue: function render() {\n\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\treturn _react2.default.createElement(DecoratedComponent, _extends({}, this.props, this.state, {\n\t\t\t\t\t\tref: function ref(child) {\n\t\t\t\t\t\t\t_this2.child = child;\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}]);\n\n\t\t\treturn DragLayerContainer;\n\t\t}(_react.Component), _class.DecoratedComponent = DecoratedComponent, _class.displayName = 'DragLayer(' + displayName + ')', _class.contextTypes = {\n\t\t\tdragDropManager: _propTypes2.default.object.isRequired\n\t\t}, _temp);\n\n\n\t\treturn (0, _hoistNonReactStatics2.default)(DragLayerContainer, DecoratedComponent);\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/DragLayer.js\n// module id = 1201\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_baseGetTag.js\n// module id = 1202\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_root.js\n// module id = 1203\n// module chunks = 0 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_freeGlobal.js\n// module id = 1204\n// module chunks = 0 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_getRawTag.js\n// module id = 1205\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_objectToString.js\n// module id = 1206\n// module chunks = 0 1","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_getPrototype.js\n// module id = 1207\n// module chunks = 0 1","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/_overArg.js\n// module id = 1208\n// module chunks = 0 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/isObjectLike.js\n// module id = 1209\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = DragSource;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _checkDecoratorArguments = require('./utils/checkDecoratorArguments');\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nvar _decorateHandler = require('./decorateHandler');\n\nvar _decorateHandler2 = _interopRequireDefault(_decorateHandler);\n\nvar _registerSource = require('./registerSource');\n\nvar _registerSource2 = _interopRequireDefault(_registerSource);\n\nvar _createSourceFactory = require('./createSourceFactory');\n\nvar _createSourceFactory2 = _interopRequireDefault(_createSourceFactory);\n\nvar _createSourceMonitor = require('./createSourceMonitor');\n\nvar _createSourceMonitor2 = _interopRequireDefault(_createSourceMonitor);\n\nvar _createSourceConnector = require('./createSourceConnector');\n\nvar _createSourceConnector2 = _interopRequireDefault(_createSourceConnector);\n\nvar _isValidType = require('./utils/isValidType');\n\nvar _isValidType2 = _interopRequireDefault(_isValidType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction DragSource(type, spec, collect) {\n\tvar options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DragSource', 'type, spec, collect[, options]'].concat(Array.prototype.slice.call(arguments)));\n\tvar getType = type;\n\tif (typeof type !== 'function') {\n\t\t(0, _invariant2.default)((0, _isValidType2.default)(type), 'Expected \"type\" provided as the first argument to DragSource to be ' + 'a string, or a function that returns a string given the current props. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', type);\n\t\tgetType = function getType() {\n\t\t\treturn type;\n\t\t};\n\t}\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(spec), 'Expected \"spec\" provided as the second argument to DragSource to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', spec);\n\tvar createSource = (0, _createSourceFactory2.default)(spec);\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the third argument to DragSource to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the fourth argument to DragSource to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', collect);\n\n\treturn function decorateSource(DecoratedComponent) {\n\t\treturn (0, _decorateHandler2.default)({\n\t\t\tconnectBackend: function connectBackend(backend, sourceId) {\n\t\t\t\treturn backend.connectDragSource(sourceId);\n\t\t\t},\n\t\t\tcontainerDisplayName: 'DragSource',\n\t\t\tcreateHandler: createSource,\n\t\t\tregisterHandler: _registerSource2.default,\n\t\t\tcreateMonitor: _createSourceMonitor2.default,\n\t\t\tcreateConnector: _createSourceConnector2.default,\n\t\t\tDecoratedComponent: DecoratedComponent,\n\t\t\tgetType: getType,\n\t\t\tcollect: collect,\n\t\t\toptions: options\n\t\t});\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/DragSource.js\n// module id = 1210\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _isDisposable2 = require('./isDisposable');\n\nvar _isDisposable3 = _interopRequireDefault(_isDisposable2);\n\nexports.isDisposable = _isDisposable3['default'];\n\nvar _Disposable2 = require('./Disposable');\n\nvar _Disposable3 = _interopRequireDefault(_Disposable2);\n\nexports.Disposable = _Disposable3['default'];\n\nvar _CompositeDisposable2 = require('./CompositeDisposable');\n\nvar _CompositeDisposable3 = _interopRequireDefault(_CompositeDisposable2);\n\nexports.CompositeDisposable = _CompositeDisposable3['default'];\n\nvar _SerialDisposable2 = require('./SerialDisposable');\n\nvar _SerialDisposable3 = _interopRequireDefault(_SerialDisposable2);\n\nexports.SerialDisposable = _SerialDisposable3['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/disposables/modules/index.js\n// module id = 1211\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar noop = function noop() {};\n\n/**\n * The basic disposable.\n */\n\nvar Disposable = (function () {\n  _createClass(Disposable, null, [{\n    key: \"empty\",\n    value: { dispose: noop },\n    enumerable: true\n  }]);\n\n  function Disposable(action) {\n    _classCallCheck(this, Disposable);\n\n    this.isDisposed = false;\n    this.action = action || noop;\n  }\n\n  Disposable.prototype.dispose = function dispose() {\n    if (!this.isDisposed) {\n      this.action.call(null);\n      this.isDisposed = true;\n    }\n  };\n\n  return Disposable;\n})();\n\nexports[\"default\"] = Disposable;\nmodule.exports = exports[\"default\"];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/disposables/modules/Disposable.js\n// module id = 1212\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _isDisposable = require('./isDisposable');\n\nvar _isDisposable2 = _interopRequireDefault(_isDisposable);\n\n/**\n * Represents a group of disposable resources that are disposed together.\n */\n\nvar CompositeDisposable = (function () {\n  function CompositeDisposable() {\n    for (var _len = arguments.length, disposables = Array(_len), _key = 0; _key < _len; _key++) {\n      disposables[_key] = arguments[_key];\n    }\n\n    _classCallCheck(this, CompositeDisposable);\n\n    if (Array.isArray(disposables[0]) && disposables.length === 1) {\n      disposables = disposables[0];\n    }\n\n    for (var i = 0; i < disposables.length; i++) {\n      if (!_isDisposable2['default'](disposables[i])) {\n        throw new Error('Expected a disposable');\n      }\n    }\n\n    this.disposables = disposables;\n    this.isDisposed = false;\n  }\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Disposable} item Disposable to add.\n   */\n\n  CompositeDisposable.prototype.add = function add(item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Disposable} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n\n  CompositeDisposable.prototype.remove = function remove(item) {\n    if (this.isDisposed) {\n      return false;\n    }\n\n    var index = this.disposables.indexOf(item);\n    if (index === -1) {\n      return false;\n    }\n\n    this.disposables.splice(index, 1);\n    item.dispose();\n    return true;\n  };\n\n  /**\n   * Disposes all disposables in the group and removes them from the group.\n   */\n\n  CompositeDisposable.prototype.dispose = function dispose() {\n    if (this.isDisposed) {\n      return;\n    }\n\n    var len = this.disposables.length;\n    var currentDisposables = new Array(len);\n    for (var i = 0; i < len; i++) {\n      currentDisposables[i] = this.disposables[i];\n    }\n\n    this.isDisposed = true;\n    this.disposables = [];\n    this.length = 0;\n\n    for (var i = 0; i < len; i++) {\n      currentDisposables[i].dispose();\n    }\n  };\n\n  return CompositeDisposable;\n})();\n\nexports['default'] = CompositeDisposable;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/disposables/modules/CompositeDisposable.js\n// module id = 1213\n// module chunks = 0 1","'use strict';\n\nexports.__esModule = true;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _isDisposable = require('./isDisposable');\n\nvar _isDisposable2 = _interopRequireDefault(_isDisposable);\n\nvar SerialDisposable = (function () {\n  function SerialDisposable() {\n    _classCallCheck(this, SerialDisposable);\n\n    this.isDisposed = false;\n    this.current = null;\n  }\n\n  /**\n   * Gets the underlying disposable.\n   * @return The underlying disposable.\n   */\n\n  SerialDisposable.prototype.getDisposable = function getDisposable() {\n    return this.current;\n  };\n\n  /**\n   * Sets the underlying disposable.\n   * @param {Disposable} value The new underlying disposable.\n   */\n\n  SerialDisposable.prototype.setDisposable = function setDisposable() {\n    var value = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0];\n\n    if (value != null && !_isDisposable2['default'](value)) {\n      throw new Error('Expected either an empty value or a valid disposable');\n    }\n\n    var isDisposed = this.isDisposed;\n    var previous = undefined;\n\n    if (!isDisposed) {\n      previous = this.current;\n      this.current = value;\n    }\n\n    if (previous) {\n      previous.dispose();\n    }\n\n    if (isDisposed && value) {\n      value.dispose();\n    }\n  };\n\n  /**\n   * Disposes the underlying disposable as well as all future replacements.\n   */\n\n  SerialDisposable.prototype.dispose = function dispose() {\n    if (this.isDisposed) {\n      return;\n    }\n\n    this.isDisposed = true;\n    var previous = this.current;\n    this.current = null;\n\n    if (previous) {\n      previous.dispose();\n    }\n  };\n\n  return SerialDisposable;\n})();\n\nexports['default'] = SerialDisposable;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/disposables/modules/SerialDisposable.js\n// module id = 1214\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = registerSource;\nfunction registerSource(type, source, manager) {\n\tvar registry = manager.getRegistry();\n\tvar sourceId = registry.addSource(type, source);\n\n\tfunction unregisterSource() {\n\t\tregistry.removeSource(sourceId);\n\t}\n\n\treturn {\n\t\thandlerId: sourceId,\n\t\tunregister: unregisterSource\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/registerSource.js\n// module id = 1215\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createSourceFactory;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ALLOWED_SPEC_METHODS = ['canDrag', 'beginDrag', 'isDragging', 'endDrag'];\nvar REQUIRED_SPEC_METHODS = ['beginDrag'];\n\nfunction createSourceFactory(spec) {\n\tObject.keys(spec).forEach(function (key) {\n\t\t(0, _invariant2.default)(ALLOWED_SPEC_METHODS.indexOf(key) > -1, 'Expected the drag source specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected \"%s\" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', ALLOWED_SPEC_METHODS.join(', '), key);\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', key, key, spec[key]);\n\t});\n\tREQUIRED_SPEC_METHODS.forEach(function (key) {\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', key, key, spec[key]);\n\t});\n\n\tvar Source = function () {\n\t\tfunction Source(monitor) {\n\t\t\t_classCallCheck(this, Source);\n\n\t\t\tthis.monitor = monitor;\n\t\t\tthis.props = null;\n\t\t\tthis.component = null;\n\t\t}\n\n\t\t_createClass(Source, [{\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.props = props;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveComponent',\n\t\t\tvalue: function receiveComponent(component) {\n\t\t\t\tthis.component = component;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrag',\n\t\t\tvalue: function canDrag() {\n\t\t\t\tif (!spec.canDrag) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn spec.canDrag(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'isDragging',\n\t\t\tvalue: function isDragging(globalMonitor, sourceId) {\n\t\t\t\tif (!spec.isDragging) {\n\t\t\t\t\treturn sourceId === globalMonitor.getSourceId();\n\t\t\t\t}\n\n\t\t\t\treturn spec.isDragging(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'beginDrag',\n\t\t\tvalue: function beginDrag() {\n\t\t\t\tvar item = spec.beginDrag(this.props, this.monitor, this.component);\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\t(0, _invariant2.default)((0, _isPlainObject2.default)(item), 'beginDrag() must return a plain object that represents the dragged item. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source.html', item);\n\t\t\t\t}\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'endDrag',\n\t\t\tvalue: function endDrag() {\n\t\t\t\tif (!spec.endDrag) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tspec.endDrag(this.props, this.monitor, this.component);\n\t\t\t}\n\t\t}]);\n\n\t\treturn Source;\n\t}();\n\n\treturn function createSource(monitor) {\n\t\treturn new Source(monitor);\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createSourceFactory.js\n// module id = 1216\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createSourceMonitor;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar isCallingCanDrag = false;\nvar isCallingIsDragging = false;\n\nvar SourceMonitor = function () {\n\tfunction SourceMonitor(manager) {\n\t\t_classCallCheck(this, SourceMonitor);\n\n\t\tthis.internalMonitor = manager.getMonitor();\n\t}\n\n\t_createClass(SourceMonitor, [{\n\t\tkey: 'receiveHandlerId',\n\t\tvalue: function receiveHandlerId(sourceId) {\n\t\t\tthis.sourceId = sourceId;\n\t\t}\n\t}, {\n\t\tkey: 'canDrag',\n\t\tvalue: function canDrag() {\n\t\t\t(0, _invariant2.default)(!isCallingCanDrag, 'You may not call monitor.canDrag() inside your canDrag() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingCanDrag = true;\n\t\t\t\treturn this.internalMonitor.canDragSource(this.sourceId);\n\t\t\t} finally {\n\t\t\t\tisCallingCanDrag = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'isDragging',\n\t\tvalue: function isDragging() {\n\t\t\t(0, _invariant2.default)(!isCallingIsDragging, 'You may not call monitor.isDragging() inside your isDragging() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drag-source-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingIsDragging = true;\n\t\t\t\treturn this.internalMonitor.isDraggingSource(this.sourceId);\n\t\t\t} finally {\n\t\t\t\tisCallingIsDragging = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.internalMonitor.getItemType();\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.internalMonitor.getItem();\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.internalMonitor.getDropResult();\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.internalMonitor.didDrop();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.internalMonitor.getClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn this.internalMonitor.getDifferenceFromInitialOffset();\n\t\t}\n\t}]);\n\n\treturn SourceMonitor;\n}();\n\nfunction createSourceMonitor(manager) {\n\treturn new SourceMonitor(manager);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createSourceMonitor.js\n// module id = 1217\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = createSourceConnector;\n\nvar _wrapConnectorHooks = require('./wrapConnectorHooks');\n\nvar _wrapConnectorHooks2 = _interopRequireDefault(_wrapConnectorHooks);\n\nvar _areOptionsEqual = require('./areOptionsEqual');\n\nvar _areOptionsEqual2 = _interopRequireDefault(_areOptionsEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createSourceConnector(backend) {\n\tvar currentHandlerId = void 0;\n\n\tvar currentDragSourceNode = void 0;\n\tvar currentDragSourceOptions = void 0;\n\tvar disconnectCurrentDragSource = void 0;\n\n\tvar currentDragPreviewNode = void 0;\n\tvar currentDragPreviewOptions = void 0;\n\tvar disconnectCurrentDragPreview = void 0;\n\n\tfunction reconnectDragSource() {\n\t\tif (disconnectCurrentDragSource) {\n\t\t\tdisconnectCurrentDragSource();\n\t\t\tdisconnectCurrentDragSource = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDragSourceNode) {\n\t\t\tdisconnectCurrentDragSource = backend.connectDragSource(currentHandlerId, currentDragSourceNode, currentDragSourceOptions);\n\t\t}\n\t}\n\n\tfunction reconnectDragPreview() {\n\t\tif (disconnectCurrentDragPreview) {\n\t\t\tdisconnectCurrentDragPreview();\n\t\t\tdisconnectCurrentDragPreview = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDragPreviewNode) {\n\t\t\tdisconnectCurrentDragPreview = backend.connectDragPreview(currentHandlerId, currentDragPreviewNode, currentDragPreviewOptions);\n\t\t}\n\t}\n\n\tfunction receiveHandlerId(handlerId) {\n\t\tif (handlerId === currentHandlerId) {\n\t\t\treturn;\n\t\t}\n\n\t\tcurrentHandlerId = handlerId;\n\t\treconnectDragSource();\n\t\treconnectDragPreview();\n\t}\n\n\tvar hooks = (0, _wrapConnectorHooks2.default)({\n\t\tdragSource: function connectDragSource(node, options) {\n\t\t\tif (node === currentDragSourceNode && (0, _areOptionsEqual2.default)(options, currentDragSourceOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDragSourceNode = node;\n\t\t\tcurrentDragSourceOptions = options;\n\n\t\t\treconnectDragSource();\n\t\t},\n\n\t\tdragPreview: function connectDragPreview(node, options) {\n\t\t\tif (node === currentDragPreviewNode && (0, _areOptionsEqual2.default)(options, currentDragPreviewOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDragPreviewNode = node;\n\t\t\tcurrentDragPreviewOptions = options;\n\n\t\t\treconnectDragPreview();\n\t\t}\n\t});\n\n\treturn {\n\t\treceiveHandlerId: receiveHandlerId,\n\t\thooks: hooks\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createSourceConnector.js\n// module id = 1218\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = cloneWithRef;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _react = require('react');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction cloneWithRef(element, newRef) {\n\tvar previousRef = element.ref;\n\t(0, _invariant2.default)(typeof previousRef !== 'string', 'Cannot connect React DnD to an element with an existing string ref. ' + 'Please convert it to use a callback ref instead, or wrap it into a <span> or <div>. ' + 'Read more: https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute');\n\n\tif (!previousRef) {\n\t\t// When there is no ref on the element, use the new ref directly\n\t\treturn (0, _react.cloneElement)(element, {\n\t\t\tref: newRef\n\t\t});\n\t}\n\n\treturn (0, _react.cloneElement)(element, {\n\t\tref: function ref(node) {\n\t\t\tnewRef(node);\n\n\t\t\tif (previousRef) {\n\t\t\t\tpreviousRef(node);\n\t\t\t}\n\t\t}\n\t});\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/utils/cloneWithRef.js\n// module id = 1219\n// module chunks = 0 1","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/node_modules/lodash/isArray.js\n// module id = 1220\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = DropTarget;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nvar _checkDecoratorArguments = require('./utils/checkDecoratorArguments');\n\nvar _checkDecoratorArguments2 = _interopRequireDefault(_checkDecoratorArguments);\n\nvar _decorateHandler = require('./decorateHandler');\n\nvar _decorateHandler2 = _interopRequireDefault(_decorateHandler);\n\nvar _registerTarget = require('./registerTarget');\n\nvar _registerTarget2 = _interopRequireDefault(_registerTarget);\n\nvar _createTargetFactory = require('./createTargetFactory');\n\nvar _createTargetFactory2 = _interopRequireDefault(_createTargetFactory);\n\nvar _createTargetMonitor = require('./createTargetMonitor');\n\nvar _createTargetMonitor2 = _interopRequireDefault(_createTargetMonitor);\n\nvar _createTargetConnector = require('./createTargetConnector');\n\nvar _createTargetConnector2 = _interopRequireDefault(_createTargetConnector);\n\nvar _isValidType = require('./utils/isValidType');\n\nvar _isValidType2 = _interopRequireDefault(_isValidType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction DropTarget(type, spec, collect) {\n\tvar options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t_checkDecoratorArguments2.default.apply(undefined, ['DropTarget', 'type, spec, collect[, options]'].concat(Array.prototype.slice.call(arguments)));\n\tvar getType = type;\n\tif (typeof type !== 'function') {\n\t\t(0, _invariant2.default)((0, _isValidType2.default)(type, true), 'Expected \"type\" provided as the first argument to DropTarget to be ' + 'a string, an array of strings, or a function that returns either given ' + 'the current props. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', type);\n\t\tgetType = function getType() {\n\t\t\treturn type;\n\t\t};\n\t}\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(spec), 'Expected \"spec\" provided as the second argument to DropTarget to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', spec);\n\tvar createTarget = (0, _createTargetFactory2.default)(spec);\n\t(0, _invariant2.default)(typeof collect === 'function', 'Expected \"collect\" provided as the third argument to DropTarget to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', collect);\n\t(0, _invariant2.default)((0, _isPlainObject2.default)(options), 'Expected \"options\" provided as the fourth argument to DropTarget to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', collect);\n\n\treturn function decorateTarget(DecoratedComponent) {\n\t\treturn (0, _decorateHandler2.default)({\n\t\t\tconnectBackend: function connectBackend(backend, targetId) {\n\t\t\t\treturn backend.connectDropTarget(targetId);\n\t\t\t},\n\t\t\tcontainerDisplayName: 'DropTarget',\n\t\t\tcreateHandler: createTarget,\n\t\t\tregisterHandler: _registerTarget2.default,\n\t\t\tcreateMonitor: _createTargetMonitor2.default,\n\t\t\tcreateConnector: _createTargetConnector2.default,\n\t\t\tDecoratedComponent: DecoratedComponent,\n\t\t\tgetType: getType,\n\t\t\tcollect: collect,\n\t\t\toptions: options\n\t\t});\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/DropTarget.js\n// module id = 1221\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = registerTarget;\nfunction registerTarget(type, target, manager) {\n\tvar registry = manager.getRegistry();\n\tvar targetId = registry.addTarget(type, target);\n\n\tfunction unregisterTarget() {\n\t\tregistry.removeTarget(targetId);\n\t}\n\n\treturn {\n\t\thandlerId: targetId,\n\t\tunregister: unregisterTarget\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/registerTarget.js\n// module id = 1222\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createTargetFactory;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _isPlainObject = require('lodash/isPlainObject');\n\nvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ALLOWED_SPEC_METHODS = ['canDrop', 'hover', 'drop'];\n\nfunction createTargetFactory(spec) {\n\tObject.keys(spec).forEach(function (key) {\n\t\t(0, _invariant2.default)(ALLOWED_SPEC_METHODS.indexOf(key) > -1, 'Expected the drop target specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected \"%s\" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', ALLOWED_SPEC_METHODS.join(', '), key);\n\t\t(0, _invariant2.default)(typeof spec[key] === 'function', 'Expected %s in the drop target specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', key, key, spec[key]);\n\t});\n\n\tvar Target = function () {\n\t\tfunction Target(monitor) {\n\t\t\t_classCallCheck(this, Target);\n\n\t\t\tthis.monitor = monitor;\n\t\t\tthis.props = null;\n\t\t\tthis.component = null;\n\t\t}\n\n\t\t_createClass(Target, [{\n\t\t\tkey: 'receiveProps',\n\t\t\tvalue: function receiveProps(props) {\n\t\t\t\tthis.props = props;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveMonitor',\n\t\t\tvalue: function receiveMonitor(monitor) {\n\t\t\t\tthis.monitor = monitor;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'receiveComponent',\n\t\t\tvalue: function receiveComponent(component) {\n\t\t\t\tthis.component = component;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrop',\n\t\t\tvalue: function canDrop() {\n\t\t\t\tif (!spec.canDrop) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn spec.canDrop(this.props, this.monitor);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'hover',\n\t\t\tvalue: function hover() {\n\t\t\t\tif (!spec.hover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tspec.hover(this.props, this.monitor, this.component);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'drop',\n\t\t\tvalue: function drop() {\n\t\t\t\tif (!spec.drop) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tvar dropResult = spec.drop(this.props, this.monitor, this.component);\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\t(0, _invariant2.default)(typeof dropResult === 'undefined' || (0, _isPlainObject2.default)(dropResult), 'drop() must either return undefined, or an object that represents the drop result. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target.html', dropResult);\n\t\t\t\t}\n\t\t\t\treturn dropResult;\n\t\t\t}\n\t\t}]);\n\n\t\treturn Target;\n\t}();\n\n\treturn function createTarget(monitor) {\n\t\treturn new Target(monitor);\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createTargetFactory.js\n// module id = 1223\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.default = createTargetMonitor;\n\nvar _invariant = require('invariant');\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar isCallingCanDrop = false;\n\nvar TargetMonitor = function () {\n\tfunction TargetMonitor(manager) {\n\t\t_classCallCheck(this, TargetMonitor);\n\n\t\tthis.internalMonitor = manager.getMonitor();\n\t}\n\n\t_createClass(TargetMonitor, [{\n\t\tkey: 'receiveHandlerId',\n\t\tvalue: function receiveHandlerId(targetId) {\n\t\t\tthis.targetId = targetId;\n\t\t}\n\t}, {\n\t\tkey: 'canDrop',\n\t\tvalue: function canDrop() {\n\t\t\t(0, _invariant2.default)(!isCallingCanDrop, 'You may not call monitor.canDrop() inside your canDrop() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs-drop-target-monitor.html');\n\n\t\t\ttry {\n\t\t\t\tisCallingCanDrop = true;\n\t\t\t\treturn this.internalMonitor.canDropOnTarget(this.targetId);\n\t\t\t} finally {\n\t\t\t\tisCallingCanDrop = false;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'isOver',\n\t\tvalue: function isOver(options) {\n\t\t\treturn this.internalMonitor.isOverTarget(this.targetId, options);\n\t\t}\n\t}, {\n\t\tkey: 'getItemType',\n\t\tvalue: function getItemType() {\n\t\t\treturn this.internalMonitor.getItemType();\n\t\t}\n\t}, {\n\t\tkey: 'getItem',\n\t\tvalue: function getItem() {\n\t\t\treturn this.internalMonitor.getItem();\n\t\t}\n\t}, {\n\t\tkey: 'getDropResult',\n\t\tvalue: function getDropResult() {\n\t\t\treturn this.internalMonitor.getDropResult();\n\t\t}\n\t}, {\n\t\tkey: 'didDrop',\n\t\tvalue: function didDrop() {\n\t\t\treturn this.internalMonitor.didDrop();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialClientOffset',\n\t\tvalue: function getInitialClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getInitialSourceClientOffset',\n\t\tvalue: function getInitialSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getInitialSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset() {\n\t\t\treturn this.internalMonitor.getSourceClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getClientOffset',\n\t\tvalue: function getClientOffset() {\n\t\t\treturn this.internalMonitor.getClientOffset();\n\t\t}\n\t}, {\n\t\tkey: 'getDifferenceFromInitialOffset',\n\t\tvalue: function getDifferenceFromInitialOffset() {\n\t\t\treturn this.internalMonitor.getDifferenceFromInitialOffset();\n\t\t}\n\t}]);\n\n\treturn TargetMonitor;\n}();\n\nfunction createTargetMonitor(manager) {\n\treturn new TargetMonitor(manager);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createTargetMonitor.js\n// module id = 1224\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = createTargetConnector;\n\nvar _wrapConnectorHooks = require('./wrapConnectorHooks');\n\nvar _wrapConnectorHooks2 = _interopRequireDefault(_wrapConnectorHooks);\n\nvar _areOptionsEqual = require('./areOptionsEqual');\n\nvar _areOptionsEqual2 = _interopRequireDefault(_areOptionsEqual);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createTargetConnector(backend) {\n\tvar currentHandlerId = void 0;\n\n\tvar currentDropTargetNode = void 0;\n\tvar currentDropTargetOptions = void 0;\n\tvar disconnectCurrentDropTarget = void 0;\n\n\tfunction reconnectDropTarget() {\n\t\tif (disconnectCurrentDropTarget) {\n\t\t\tdisconnectCurrentDropTarget();\n\t\t\tdisconnectCurrentDropTarget = null;\n\t\t}\n\n\t\tif (currentHandlerId && currentDropTargetNode) {\n\t\t\tdisconnectCurrentDropTarget = backend.connectDropTarget(currentHandlerId, currentDropTargetNode, currentDropTargetOptions);\n\t\t}\n\t}\n\n\tfunction receiveHandlerId(handlerId) {\n\t\tif (handlerId === currentHandlerId) {\n\t\t\treturn;\n\t\t}\n\n\t\tcurrentHandlerId = handlerId;\n\t\treconnectDropTarget();\n\t}\n\n\tvar hooks = (0, _wrapConnectorHooks2.default)({\n\t\tdropTarget: function connectDropTarget(node, options) {\n\t\t\tif (node === currentDropTargetNode && (0, _areOptionsEqual2.default)(options, currentDropTargetOptions)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentDropTargetNode = node;\n\t\t\tcurrentDropTargetOptions = options;\n\n\t\t\treconnectDropTarget();\n\t\t}\n\t});\n\n\treturn {\n\t\treceiveHandlerId: receiveHandlerId,\n\t\thooks: hooks\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd/lib/createTargetConnector.js\n// module id = 1225\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getEmptyImage = exports.NativeTypes = undefined;\nexports.default = createHTML5Backend;\n\nvar _HTML5Backend = require('./HTML5Backend');\n\nvar _HTML5Backend2 = _interopRequireDefault(_HTML5Backend);\n\nvar _getEmptyImage = require('./getEmptyImage');\n\nvar _getEmptyImage2 = _interopRequireDefault(_getEmptyImage);\n\nvar _NativeTypes = require('./NativeTypes');\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.NativeTypes = NativeTypes;\nexports.getEmptyImage = _getEmptyImage2.default;\nfunction createHTML5Backend(manager) {\n\treturn new _HTML5Backend2.default(manager);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/index.js\n// module id = 1226\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* eslint-disable no-underscore-dangle */\n\n\nvar _defaults = require('lodash/defaults');\n\nvar _defaults2 = _interopRequireDefault(_defaults);\n\nvar _shallowEqual = require('./shallowEqual');\n\nvar _shallowEqual2 = _interopRequireDefault(_shallowEqual);\n\nvar _EnterLeaveCounter = require('./EnterLeaveCounter');\n\nvar _EnterLeaveCounter2 = _interopRequireDefault(_EnterLeaveCounter);\n\nvar _BrowserDetector = require('./BrowserDetector');\n\nvar _OffsetUtils = require('./OffsetUtils');\n\nvar _NativeDragSources = require('./NativeDragSources');\n\nvar _NativeTypes = require('./NativeTypes');\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar HTML5Backend = function () {\n\tfunction HTML5Backend(manager) {\n\t\t_classCallCheck(this, HTML5Backend);\n\n\t\tthis.actions = manager.getActions();\n\t\tthis.monitor = manager.getMonitor();\n\t\tthis.registry = manager.getRegistry();\n\t\tthis.context = manager.getContext();\n\n\t\tthis.sourcePreviewNodes = {};\n\t\tthis.sourcePreviewNodeOptions = {};\n\t\tthis.sourceNodes = {};\n\t\tthis.sourceNodeOptions = {};\n\t\tthis.enterLeaveCounter = new _EnterLeaveCounter2.default();\n\n\t\tthis.dragStartSourceIds = [];\n\t\tthis.dropTargetIds = [];\n\t\tthis.dragEnterTargetIds = [];\n\t\tthis.currentNativeSource = null;\n\t\tthis.currentNativeHandle = null;\n\t\tthis.currentDragSourceNode = null;\n\t\tthis.currentDragSourceNodeOffset = null;\n\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\t\tthis.altKeyPressed = false;\n\t\tthis.mouseMoveTimeoutTimer = null;\n\n\t\tthis.getSourceClientOffset = this.getSourceClientOffset.bind(this);\n\t\tthis.handleTopDragStart = this.handleTopDragStart.bind(this);\n\t\tthis.handleTopDragStartCapture = this.handleTopDragStartCapture.bind(this);\n\t\tthis.handleTopDragEndCapture = this.handleTopDragEndCapture.bind(this);\n\t\tthis.handleTopDragEnter = this.handleTopDragEnter.bind(this);\n\t\tthis.handleTopDragEnterCapture = this.handleTopDragEnterCapture.bind(this);\n\t\tthis.handleTopDragLeaveCapture = this.handleTopDragLeaveCapture.bind(this);\n\t\tthis.handleTopDragOver = this.handleTopDragOver.bind(this);\n\t\tthis.handleTopDragOverCapture = this.handleTopDragOverCapture.bind(this);\n\t\tthis.handleTopDrop = this.handleTopDrop.bind(this);\n\t\tthis.handleTopDropCapture = this.handleTopDropCapture.bind(this);\n\t\tthis.handleSelectStart = this.handleSelectStart.bind(this);\n\t\tthis.endDragIfSourceWasRemovedFromDOM = this.endDragIfSourceWasRemovedFromDOM.bind(this);\n\t\tthis.endDragNativeItem = this.endDragNativeItem.bind(this);\n\t\tthis.asyncEndDragNativeItem = this.asyncEndDragNativeItem.bind(this);\n\t\tthis.isNodeInDocument = this.isNodeInDocument.bind(this);\n\t}\n\n\t_createClass(HTML5Backend, [{\n\t\tkey: 'setup',\n\t\tvalue: function setup() {\n\t\t\tif (this.window === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.window.__isReactDndBackendSetUp) {\n\t\t\t\tthrow new Error('Cannot have two HTML5 backends at the same time.');\n\t\t\t}\n\t\t\tthis.window.__isReactDndBackendSetUp = true;\n\t\t\tthis.addEventListeners(this.window);\n\t\t}\n\t}, {\n\t\tkey: 'teardown',\n\t\tvalue: function teardown() {\n\t\t\tif (this.window === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.window.__isReactDndBackendSetUp = false;\n\t\t\tthis.removeEventListeners(this.window);\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tif (this.asyncEndDragFrameId) {\n\t\t\t\tthis.window.cancelAnimationFrame(this.asyncEndDragFrameId);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'addEventListeners',\n\t\tvalue: function addEventListeners(target) {\n\t\t\t// SSR Fix (https://github.com/react-dnd/react-dnd/pull/813\n\t\t\tif (!target.addEventListener) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget.addEventListener('dragstart', this.handleTopDragStart);\n\t\t\ttarget.addEventListener('dragstart', this.handleTopDragStartCapture, true);\n\t\t\ttarget.addEventListener('dragend', this.handleTopDragEndCapture, true);\n\t\t\ttarget.addEventListener('dragenter', this.handleTopDragEnter);\n\t\t\ttarget.addEventListener('dragenter', this.handleTopDragEnterCapture, true);\n\t\t\ttarget.addEventListener('dragleave', this.handleTopDragLeaveCapture, true);\n\t\t\ttarget.addEventListener('dragover', this.handleTopDragOver);\n\t\t\ttarget.addEventListener('dragover', this.handleTopDragOverCapture, true);\n\t\t\ttarget.addEventListener('drop', this.handleTopDrop);\n\t\t\ttarget.addEventListener('drop', this.handleTopDropCapture, true);\n\t\t}\n\t}, {\n\t\tkey: 'removeEventListeners',\n\t\tvalue: function removeEventListeners(target) {\n\t\t\t// SSR Fix (https://github.com/react-dnd/react-dnd/pull/813\n\t\t\tif (!target.removeEventListener) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget.removeEventListener('dragstart', this.handleTopDragStart);\n\t\t\ttarget.removeEventListener('dragstart', this.handleTopDragStartCapture, true);\n\t\t\ttarget.removeEventListener('dragend', this.handleTopDragEndCapture, true);\n\t\t\ttarget.removeEventListener('dragenter', this.handleTopDragEnter);\n\t\t\ttarget.removeEventListener('dragenter', this.handleTopDragEnterCapture, true);\n\t\t\ttarget.removeEventListener('dragleave', this.handleTopDragLeaveCapture, true);\n\t\t\ttarget.removeEventListener('dragover', this.handleTopDragOver);\n\t\t\ttarget.removeEventListener('dragover', this.handleTopDragOverCapture, true);\n\t\t\ttarget.removeEventListener('drop', this.handleTopDrop);\n\t\t\ttarget.removeEventListener('drop', this.handleTopDropCapture, true);\n\t\t}\n\t}, {\n\t\tkey: 'connectDragPreview',\n\t\tvalue: function connectDragPreview(sourceId, node, options) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.sourcePreviewNodeOptions[sourceId] = options;\n\t\t\tthis.sourcePreviewNodes[sourceId] = node;\n\n\t\t\treturn function () {\n\t\t\t\tdelete _this.sourcePreviewNodes[sourceId];\n\t\t\t\tdelete _this.sourcePreviewNodeOptions[sourceId];\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'connectDragSource',\n\t\tvalue: function connectDragSource(sourceId, node, options) {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.sourceNodes[sourceId] = node;\n\t\t\tthis.sourceNodeOptions[sourceId] = options;\n\n\t\t\tvar handleDragStart = function handleDragStart(e) {\n\t\t\t\treturn _this2.handleDragStart(e, sourceId);\n\t\t\t};\n\t\t\tvar handleSelectStart = function handleSelectStart(e) {\n\t\t\t\treturn _this2.handleSelectStart(e, sourceId);\n\t\t\t};\n\n\t\t\tnode.setAttribute('draggable', true);\n\t\t\tnode.addEventListener('dragstart', handleDragStart);\n\t\t\tnode.addEventListener('selectstart', handleSelectStart);\n\n\t\t\treturn function () {\n\t\t\t\tdelete _this2.sourceNodes[sourceId];\n\t\t\t\tdelete _this2.sourceNodeOptions[sourceId];\n\n\t\t\t\tnode.removeEventListener('dragstart', handleDragStart);\n\t\t\t\tnode.removeEventListener('selectstart', handleSelectStart);\n\t\t\t\tnode.setAttribute('draggable', false);\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'connectDropTarget',\n\t\tvalue: function connectDropTarget(targetId, node) {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar handleDragEnter = function handleDragEnter(e) {\n\t\t\t\treturn _this3.handleDragEnter(e, targetId);\n\t\t\t};\n\t\t\tvar handleDragOver = function handleDragOver(e) {\n\t\t\t\treturn _this3.handleDragOver(e, targetId);\n\t\t\t};\n\t\t\tvar handleDrop = function handleDrop(e) {\n\t\t\t\treturn _this3.handleDrop(e, targetId);\n\t\t\t};\n\n\t\t\tnode.addEventListener('dragenter', handleDragEnter);\n\t\t\tnode.addEventListener('dragover', handleDragOver);\n\t\t\tnode.addEventListener('drop', handleDrop);\n\n\t\t\treturn function () {\n\t\t\t\tnode.removeEventListener('dragenter', handleDragEnter);\n\t\t\t\tnode.removeEventListener('dragover', handleDragOver);\n\t\t\t\tnode.removeEventListener('drop', handleDrop);\n\t\t\t};\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentSourceNodeOptions',\n\t\tvalue: function getCurrentSourceNodeOptions() {\n\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\tvar sourceNodeOptions = this.sourceNodeOptions[sourceId];\n\n\t\t\treturn (0, _defaults2.default)(sourceNodeOptions || {}, {\n\t\t\t\tdropEffect: this.altKeyPressed ? 'copy' : 'move'\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentDropEffect',\n\t\tvalue: function getCurrentDropEffect() {\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\t// It makes more sense to default to 'copy' for native resources\n\t\t\t\treturn 'copy';\n\t\t\t}\n\n\t\t\treturn this.getCurrentSourceNodeOptions().dropEffect;\n\t\t}\n\t}, {\n\t\tkey: 'getCurrentSourcePreviewNodeOptions',\n\t\tvalue: function getCurrentSourcePreviewNodeOptions() {\n\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\tvar sourcePreviewNodeOptions = this.sourcePreviewNodeOptions[sourceId];\n\n\t\t\treturn (0, _defaults2.default)(sourcePreviewNodeOptions || {}, {\n\t\t\t\tanchorX: 0.5,\n\t\t\t\tanchorY: 0.5,\n\t\t\t\tcaptureDraggingState: false\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'getSourceClientOffset',\n\t\tvalue: function getSourceClientOffset(sourceId) {\n\t\t\treturn (0, _OffsetUtils.getNodeClientOffset)(this.sourceNodes[sourceId]);\n\t\t}\n\t}, {\n\t\tkey: 'isDraggingNativeItem',\n\t\tvalue: function isDraggingNativeItem() {\n\t\t\tvar itemType = this.monitor.getItemType();\n\t\t\treturn Object.keys(NativeTypes).some(function (key) {\n\t\t\t\treturn NativeTypes[key] === itemType;\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'beginDragNativeItem',\n\t\tvalue: function beginDragNativeItem(type) {\n\t\t\tthis.clearCurrentDragSourceNode();\n\n\t\t\tvar SourceType = (0, _NativeDragSources.createNativeDragSource)(type);\n\t\t\tthis.currentNativeSource = new SourceType();\n\t\t\tthis.currentNativeHandle = this.registry.addSource(type, this.currentNativeSource);\n\t\t\tthis.actions.beginDrag([this.currentNativeHandle]);\n\t\t}\n\t}, {\n\t\tkey: 'asyncEndDragNativeItem',\n\t\tvalue: function asyncEndDragNativeItem() {\n\t\t\tthis.asyncEndDragFrameId = this.window.requestAnimationFrame(this.endDragNativeItem);\n\t\t}\n\t}, {\n\t\tkey: 'endDragNativeItem',\n\t\tvalue: function endDragNativeItem() {\n\t\t\tif (!this.isDraggingNativeItem()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.actions.endDrag();\n\t\t\tthis.registry.removeSource(this.currentNativeHandle);\n\t\t\tthis.currentNativeHandle = null;\n\t\t\tthis.currentNativeSource = null;\n\t\t}\n\t}, {\n\t\tkey: 'isNodeInDocument',\n\t\tvalue: function isNodeInDocument(node) {\n\t\t\t// Check the node either in the main document or in the current context\n\t\t\treturn document.body.contains(node) || this.window ? this.window.document.body.contains(node) : false;\n\t\t}\n\t}, {\n\t\tkey: 'endDragIfSourceWasRemovedFromDOM',\n\t\tvalue: function endDragIfSourceWasRemovedFromDOM() {\n\t\t\tvar node = this.currentDragSourceNode;\n\t\t\tif (this.isNodeInDocument(node)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.clearCurrentDragSourceNode()) {\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'setCurrentDragSourceNode',\n\t\tvalue: function setCurrentDragSourceNode(node) {\n\t\t\tvar _this4 = this;\n\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tthis.currentDragSourceNode = node;\n\t\t\tthis.currentDragSourceNodeOffset = (0, _OffsetUtils.getNodeClientOffset)(node);\n\t\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\n\t\t\t// A timeout of > 0 is necessary to resolve Firefox issue referenced\n\t\t\t// See:\n\t\t\t//   * https://github.com/react-dnd/react-dnd/pull/928\n\t\t\t//   * https://github.com/react-dnd/react-dnd/issues/869\n\t\t\tvar MOUSE_MOVE_TIMEOUT = 1000;\n\n\t\t\t// Receiving a mouse event in the middle of a dragging operation\n\t\t\t// means it has ended and the drag source node disappeared from DOM,\n\t\t\t// so the browser didn't dispatch the dragend event.\n\t\t\t//\n\t\t\t// We need to wait before we start listening for mousemove events.\n\t\t\t// This is needed because the drag preview needs to be drawn or else it fires an 'mousemove' event\n\t\t\t// immediately in some browsers.\n\t\t\t//\n\t\t\t// See:\n\t\t\t//   * https://github.com/react-dnd/react-dnd/pull/928\n\t\t\t//   * https://github.com/react-dnd/react-dnd/issues/869\n\t\t\t//\n\t\t\tthis.mouseMoveTimeoutTimer = setTimeout(function () {\n\t\t\t\t_this4.mouseMoveTimeoutId = null;\n\t\t\t\treturn _this4.window.addEventListener('mousemove', _this4.endDragIfSourceWasRemovedFromDOM, true);\n\t\t\t}, MOUSE_MOVE_TIMEOUT);\n\t\t}\n\t}, {\n\t\tkey: 'clearCurrentDragSourceNode',\n\t\tvalue: function clearCurrentDragSourceNode() {\n\t\t\tif (this.currentDragSourceNode) {\n\t\t\t\tthis.currentDragSourceNode = null;\n\t\t\t\tthis.currentDragSourceNodeOffset = null;\n\t\t\t\tthis.currentDragSourceNodeOffsetChanged = false;\n\t\t\t\tthis.window.clearTimeout(this.mouseMoveTimeoutTimer);\n\t\t\t\tthis.window.removeEventListener('mousemove', this.endDragIfSourceWasRemovedFromDOM, true);\n\t\t\t\tthis.mouseMoveTimeoutTimer = null;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}, {\n\t\tkey: 'checkIfCurrentDragSourceRectChanged',\n\t\tvalue: function checkIfCurrentDragSourceRectChanged() {\n\t\t\tvar node = this.currentDragSourceNode;\n\t\t\tif (!node) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.currentDragSourceNodeOffsetChanged) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.currentDragSourceNodeOffsetChanged = !(0, _shallowEqual2.default)((0, _OffsetUtils.getNodeClientOffset)(node), this.currentDragSourceNodeOffset);\n\n\t\t\treturn this.currentDragSourceNodeOffsetChanged;\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragStartCapture',\n\t\tvalue: function handleTopDragStartCapture() {\n\t\t\tthis.clearCurrentDragSourceNode();\n\t\t\tthis.dragStartSourceIds = [];\n\t\t}\n\t}, {\n\t\tkey: 'handleDragStart',\n\t\tvalue: function handleDragStart(e, sourceId) {\n\t\t\tthis.dragStartSourceIds.unshift(sourceId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragStart',\n\t\tvalue: function handleTopDragStart(e) {\n\t\t\tvar _this5 = this;\n\n\t\t\tvar dragStartSourceIds = this.dragStartSourceIds;\n\n\t\t\tthis.dragStartSourceIds = null;\n\n\t\t\tvar clientOffset = (0, _OffsetUtils.getEventClientOffset)(e);\n\n\t\t\t// Avoid crashing if we missed a drop event or our previous drag died\n\t\t\tif (this.monitor.isDragging()) {\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\n\t\t\t// Don't publish the source just yet (see why below)\n\t\t\tthis.actions.beginDrag(dragStartSourceIds, {\n\t\t\t\tpublishSource: false,\n\t\t\t\tgetSourceClientOffset: this.getSourceClientOffset,\n\t\t\t\tclientOffset: clientOffset\n\t\t\t});\n\n\t\t\tvar dataTransfer = e.dataTransfer;\n\n\t\t\tvar nativeType = (0, _NativeDragSources.matchNativeItemType)(dataTransfer);\n\n\t\t\tif (this.monitor.isDragging()) {\n\t\t\t\tif (typeof dataTransfer.setDragImage === 'function') {\n\t\t\t\t\t// Use custom drag image if user specifies it.\n\t\t\t\t\t// If child drag source refuses drag but parent agrees,\n\t\t\t\t\t// use parent's node as drag image. Neither works in IE though.\n\t\t\t\t\tvar sourceId = this.monitor.getSourceId();\n\t\t\t\t\tvar sourceNode = this.sourceNodes[sourceId];\n\t\t\t\t\tvar dragPreview = this.sourcePreviewNodes[sourceId] || sourceNode;\n\n\t\t\t\t\tvar _getCurrentSourcePrev = this.getCurrentSourcePreviewNodeOptions(),\n\t\t\t\t\t    anchorX = _getCurrentSourcePrev.anchorX,\n\t\t\t\t\t    anchorY = _getCurrentSourcePrev.anchorY,\n\t\t\t\t\t    offsetX = _getCurrentSourcePrev.offsetX,\n\t\t\t\t\t    offsetY = _getCurrentSourcePrev.offsetY;\n\n\t\t\t\t\tvar anchorPoint = { anchorX: anchorX, anchorY: anchorY };\n\t\t\t\t\tvar offsetPoint = { offsetX: offsetX, offsetY: offsetY };\n\t\t\t\t\tvar dragPreviewOffset = (0, _OffsetUtils.getDragPreviewOffset)(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint);\n\n\t\t\t\t\tdataTransfer.setDragImage(dragPreview, dragPreviewOffset.x, dragPreviewOffset.y);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\t// Firefox won't drag without setting data\n\t\t\t\t\tdataTransfer.setData('application/json', {});\n\t\t\t\t} catch (err) {}\n\t\t\t\t// IE doesn't support MIME types in setData\n\n\n\t\t\t\t// Store drag source node so we can check whether\n\t\t\t\t// it is removed from DOM and trigger endDrag manually.\n\t\t\t\tthis.setCurrentDragSourceNode(e.target);\n\n\t\t\t\t// Now we are ready to publish the drag source.. or are we not?\n\n\t\t\t\tvar _getCurrentSourcePrev2 = this.getCurrentSourcePreviewNodeOptions(),\n\t\t\t\t    captureDraggingState = _getCurrentSourcePrev2.captureDraggingState;\n\n\t\t\t\tif (!captureDraggingState) {\n\t\t\t\t\t// Usually we want to publish it in the next tick so that browser\n\t\t\t\t\t// is able to screenshot the current (not yet dragging) state.\n\t\t\t\t\t//\n\t\t\t\t\t// It also neatly avoids a situation where render() returns null\n\t\t\t\t\t// in the same tick for the source element, and browser freaks out.\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\treturn _this5.actions.publishDragSource();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// In some cases the user may want to override this behavior, e.g.\n\t\t\t\t\t// to work around IE not supporting custom drag previews.\n\t\t\t\t\t//\n\t\t\t\t\t// When using a custom drag layer, the only way to prevent\n\t\t\t\t\t// the default drag preview from drawing in IE is to screenshot\n\t\t\t\t\t// the dragging state in which the node itself has zero opacity\n\t\t\t\t\t// and height. In this case, though, returning null from render()\n\t\t\t\t\t// will abruptly end the dragging, which is not obvious.\n\t\t\t\t\t//\n\t\t\t\t\t// This is the reason such behavior is strictly opt-in.\n\t\t\t\t\tthis.actions.publishDragSource();\n\t\t\t\t}\n\t\t\t} else if (nativeType) {\n\t\t\t\t// A native item (such as URL) dragged from inside the document\n\t\t\t\tthis.beginDragNativeItem(nativeType);\n\t\t\t} else if (!dataTransfer.types && (!e.target.hasAttribute || !e.target.hasAttribute('draggable'))) {\n\t\t\t\t// Looks like a Safari bug: dataTransfer.types is null, but there was no draggable.\n\t\t\t\t// Just let it drag. It's a native type (URL or text) and will be picked up in\n\t\t\t\t// dragenter handler.\n\t\t\t\treturn; // eslint-disable-line no-useless-return\n\t\t\t} else {\n\t\t\t\t// If by this time no drag source reacted, tell browser not to drag.\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEndCapture',\n\t\tvalue: function handleTopDragEndCapture() {\n\t\t\tif (this.clearCurrentDragSourceNode()) {\n\t\t\t\t// Firefox can dispatch this event in an infinite loop\n\t\t\t\t// if dragend handler does something like showing an alert.\n\t\t\t\t// Only proceed if we have not handled it already.\n\t\t\t\tthis.actions.endDrag();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEnterCapture',\n\t\tvalue: function handleTopDragEnterCapture(e) {\n\t\t\tthis.dragEnterTargetIds = [];\n\n\t\t\tvar isFirstEnter = this.enterLeaveCounter.enter(e.target);\n\t\t\tif (!isFirstEnter || this.monitor.isDragging()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar dataTransfer = e.dataTransfer;\n\n\t\t\tvar nativeType = (0, _NativeDragSources.matchNativeItemType)(dataTransfer);\n\n\t\t\tif (nativeType) {\n\t\t\t\t// A native item (such as file or URL) dragged from outside the document\n\t\t\t\tthis.beginDragNativeItem(nativeType);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleDragEnter',\n\t\tvalue: function handleDragEnter(e, targetId) {\n\t\t\tthis.dragEnterTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragEnter',\n\t\tvalue: function handleTopDragEnter(e) {\n\t\t\tvar _this6 = this;\n\n\t\t\tvar dragEnterTargetIds = this.dragEnterTargetIds;\n\n\t\t\tthis.dragEnterTargetIds = [];\n\n\t\t\tif (!this.monitor.isDragging()) {\n\t\t\t\t// This is probably a native item type we don't understand.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.altKeyPressed = e.altKey;\n\n\t\t\tif (!(0, _BrowserDetector.isFirefox)()) {\n\t\t\t\t// Don't emit hover in `dragenter` on Firefox due to an edge case.\n\t\t\t\t// If the target changes position as the result of `dragenter`, Firefox\n\t\t\t\t// will still happily dispatch `dragover` despite target being no longer\n\t\t\t\t// there. The easy solution is to only fire `hover` in `dragover` on FF.\n\t\t\t\tthis.actions.hover(dragEnterTargetIds, {\n\t\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar canDrop = dragEnterTargetIds.some(function (targetId) {\n\t\t\t\treturn _this6.monitor.canDropOnTarget(targetId);\n\t\t\t});\n\n\t\t\tif (canDrop) {\n\t\t\t\t// IE requires this to fire dragover events\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = this.getCurrentDropEffect();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragOverCapture',\n\t\tvalue: function handleTopDragOverCapture() {\n\t\t\tthis.dragOverTargetIds = [];\n\t\t}\n\t}, {\n\t\tkey: 'handleDragOver',\n\t\tvalue: function handleDragOver(e, targetId) {\n\t\t\tthis.dragOverTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragOver',\n\t\tvalue: function handleTopDragOver(e) {\n\t\t\tvar _this7 = this;\n\n\t\t\tvar dragOverTargetIds = this.dragOverTargetIds;\n\n\t\t\tthis.dragOverTargetIds = [];\n\n\t\t\tif (!this.monitor.isDragging()) {\n\t\t\t\t// This is probably a native item type we don't understand.\n\t\t\t\t// Prevent default \"drop and blow away the whole document\" action.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'none';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.altKeyPressed = e.altKey;\n\n\t\t\tthis.actions.hover(dragOverTargetIds, {\n\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t});\n\n\t\t\tvar canDrop = dragOverTargetIds.some(function (targetId) {\n\t\t\t\treturn _this7.monitor.canDropOnTarget(targetId);\n\t\t\t});\n\n\t\t\tif (canDrop) {\n\t\t\t\t// Show user-specified drop effect.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = this.getCurrentDropEffect();\n\t\t\t} else if (this.isDraggingNativeItem()) {\n\t\t\t\t// Don't show a nice cursor but still prevent default\n\t\t\t\t// \"drop and blow away the whole document\" action.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'none';\n\t\t\t} else if (this.checkIfCurrentDragSourceRectChanged()) {\n\t\t\t\t// Prevent animating to incorrect position.\n\t\t\t\t// Drop effect must be other than 'none' to prevent animation.\n\t\t\t\te.preventDefault();\n\t\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDragLeaveCapture',\n\t\tvalue: function handleTopDragLeaveCapture(e) {\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tvar isLastLeave = this.enterLeaveCounter.leave(e.target);\n\t\t\tif (!isLastLeave) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.endDragNativeItem();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDropCapture',\n\t\tvalue: function handleTopDropCapture(e) {\n\t\t\tthis.dropTargetIds = [];\n\t\t\te.preventDefault();\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.currentNativeSource.mutateItemByReadingDataTransfer(e.dataTransfer);\n\t\t\t}\n\n\t\t\tthis.enterLeaveCounter.reset();\n\t\t}\n\t}, {\n\t\tkey: 'handleDrop',\n\t\tvalue: function handleDrop(e, targetId) {\n\t\t\tthis.dropTargetIds.unshift(targetId);\n\t\t}\n\t}, {\n\t\tkey: 'handleTopDrop',\n\t\tvalue: function handleTopDrop(e) {\n\t\t\tvar dropTargetIds = this.dropTargetIds;\n\n\t\t\tthis.dropTargetIds = [];\n\n\t\t\tthis.actions.hover(dropTargetIds, {\n\t\t\t\tclientOffset: (0, _OffsetUtils.getEventClientOffset)(e)\n\t\t\t});\n\t\t\tthis.actions.drop({ dropEffect: this.getCurrentDropEffect() });\n\n\t\t\tif (this.isDraggingNativeItem()) {\n\t\t\t\tthis.endDragNativeItem();\n\t\t\t} else {\n\t\t\t\tthis.endDragIfSourceWasRemovedFromDOM();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'handleSelectStart',\n\t\tvalue: function handleSelectStart(e) {\n\t\t\tvar target = e.target;\n\n\t\t\t// Only IE requires us to explicitly say\n\t\t\t// we want drag drop operation to start\n\n\t\t\tif (typeof target.dragDrop !== 'function') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Inputs and textareas should be selectable\n\t\t\tif (target.tagName === 'INPUT' || target.tagName === 'SELECT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For other targets, ask IE\n\t\t\t// to enable drag and drop\n\t\t\te.preventDefault();\n\t\t\ttarget.dragDrop();\n\t\t}\n\t}, {\n\t\tkey: 'window',\n\t\tget: function get() {\n\t\t\tif (this.context && this.context.window) {\n\t\t\t\treturn this.context.window;\n\t\t\t} else if (typeof window !== 'undefined') {\n\t\t\t\treturn window;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t}]);\n\n\treturn HTML5Backend;\n}();\n\nexports.default = HTML5Backend;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/HTML5Backend.js\n// module id = 1227\n// module chunks = 0 1","var baseRest = require('./_baseRest'),\n    eq = require('./eq'),\n    isIterateeCall = require('./_isIterateeCall'),\n    keysIn = require('./keysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n  object = Object(object);\n\n  var index = -1;\n  var length = sources.length;\n  var guard = length > 2 ? sources[2] : undefined;\n\n  if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n    length = 1;\n  }\n\n  while (++index < length) {\n    var source = sources[index];\n    var props = keysIn(source);\n    var propsIndex = -1;\n    var propsLength = props.length;\n\n    while (++propsIndex < propsLength) {\n      var key = props[propsIndex];\n      var value = object[key];\n\n      if (value === undefined ||\n          (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        object[key] = source[key];\n      }\n    }\n  }\n\n  return object;\n});\n\nmodule.exports = defaults;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/defaults.js\n// module id = 1228\n// module chunks = 0 1","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_overRest.js\n// module id = 1229\n// module chunks = 0 1","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_apply.js\n// module id = 1230\n// module chunks = 0 1","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_setToString.js\n// module id = 1231\n// module chunks = 0 1","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseSetToString.js\n// module id = 1232\n// module chunks = 0 1","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/constant.js\n// module id = 1233\n// module chunks = 0 1","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_defineProperty.js\n// module id = 1234\n// module chunks = 0 1","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsNative.js\n// module id = 1235\n// module chunks = 0 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_getRawTag.js\n// module id = 1236\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_objectToString.js\n// module id = 1237\n// module chunks = 0 1","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isMasked.js\n// module id = 1238\n// module chunks = 0 1","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_coreJsData.js\n// module id = 1239\n// module chunks = 0 1","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_toSource.js\n// module id = 1240\n// module chunks = 0 1","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_getValue.js\n// module id = 1241\n// module chunks = 0 1","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_shortOut.js\n// module id = 1242\n// module chunks = 0 1","var eq = require('./eq'),\n    isArrayLike = require('./isArrayLike'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isIterateeCall.js\n// module id = 1243\n// module chunks = 0 1","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/keysIn.js\n// module id = 1244\n// module chunks = 0 1","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayLikeKeys.js\n// module id = 1245\n// module chunks = 0 1","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseTimes.js\n// module id = 1246\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsArguments.js\n// module id = 1247\n// module chunks = 0 1","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isBuffer.js\n// module id = 1248\n// module chunks = 0 1","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/stubFalse.js\n// module id = 1249\n// module chunks = 0 1","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/isTypedArray.js\n// module id = 1250\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsTypedArray.js\n// module id = 1251\n// module chunks = 0 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_nodeUtil.js\n// module id = 1252\n// module chunks = 0 1","var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseKeysIn.js\n// module id = 1253\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isPrototype.js\n// module id = 1254\n// module chunks = 0 1","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_nativeKeysIn.js\n// module id = 1255\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = shallowEqual;\nfunction shallowEqual(objA, objB) {\n\tif (objA === objB) {\n\t\treturn true;\n\t}\n\n\tvar keysA = Object.keys(objA);\n\tvar keysB = Object.keys(objB);\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\t// Test for A's keys different from B.\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tfor (var i = 0; i < keysA.length; i += 1) {\n\t\tif (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar valA = objA[keysA[i]];\n\t\tvar valB = objB[keysA[i]];\n\n\t\tif (valA !== valB) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/shallowEqual.js\n// module id = 1256\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _union = require('lodash/union');\n\nvar _union2 = _interopRequireDefault(_union);\n\nvar _without = require('lodash/without');\n\nvar _without2 = _interopRequireDefault(_without);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EnterLeaveCounter = function () {\n\tfunction EnterLeaveCounter() {\n\t\t_classCallCheck(this, EnterLeaveCounter);\n\n\t\tthis.entered = [];\n\t}\n\n\t_createClass(EnterLeaveCounter, [{\n\t\tkey: 'enter',\n\t\tvalue: function enter(enteringNode) {\n\t\t\tvar previousLength = this.entered.length;\n\n\t\t\tvar isNodeEntered = function isNodeEntered(node) {\n\t\t\t\treturn document.documentElement.contains(node) && (!node.contains || node.contains(enteringNode));\n\t\t\t};\n\n\t\t\tthis.entered = (0, _union2.default)(this.entered.filter(isNodeEntered), [enteringNode]);\n\n\t\t\treturn previousLength === 0 && this.entered.length > 0;\n\t\t}\n\t}, {\n\t\tkey: 'leave',\n\t\tvalue: function leave(leavingNode) {\n\t\t\tvar previousLength = this.entered.length;\n\n\t\t\tthis.entered = (0, _without2.default)(this.entered.filter(function (node) {\n\t\t\t\treturn document.documentElement.contains(node);\n\t\t\t}), leavingNode);\n\n\t\t\treturn previousLength > 0 && this.entered.length === 0;\n\t\t}\n\t}, {\n\t\tkey: 'reset',\n\t\tvalue: function reset() {\n\t\t\tthis.entered = [];\n\t\t}\n\t}]);\n\n\treturn EnterLeaveCounter;\n}();\n\nexports.default = EnterLeaveCounter;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/EnterLeaveCounter.js\n// module id = 1257\n// module chunks = 0 1","var baseFlatten = require('./_baseFlatten'),\n    baseRest = require('./_baseRest'),\n    baseUniq = require('./_baseUniq'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/union.js\n// module id = 1258\n// module chunks = 0 1","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseFlatten.js\n// module id = 1259\n// module chunks = 0 1","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayPush.js\n// module id = 1260\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isFlattenable.js\n// module id = 1261\n// module chunks = 0 1","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseUniq.js\n// module id = 1262\n// module chunks = 0 1","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheClear.js\n// module id = 1263\n// module chunks = 0 1","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_Hash.js\n// module id = 1264\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashClear.js\n// module id = 1265\n// module chunks = 0 1","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashDelete.js\n// module id = 1266\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashGet.js\n// module id = 1267\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashHas.js\n// module id = 1268\n// module chunks = 0 1","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_hashSet.js\n// module id = 1269\n// module chunks = 0 1","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_ListCache.js\n// module id = 1270\n// module chunks = 0 1","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheClear.js\n// module id = 1271\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheDelete.js\n// module id = 1272\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheGet.js\n// module id = 1273\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheHas.js\n// module id = 1274\n// module chunks = 0 1","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_listCacheSet.js\n// module id = 1275\n// module chunks = 0 1","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_Map.js\n// module id = 1276\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheDelete.js\n// module id = 1277\n// module chunks = 0 1","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_isKeyable.js\n// module id = 1278\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheGet.js\n// module id = 1279\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheHas.js\n// module id = 1280\n// module chunks = 0 1","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_mapCacheSet.js\n// module id = 1281\n// module chunks = 0 1","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_setCacheAdd.js\n// module id = 1282\n// module chunks = 0 1","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_setCacheHas.js\n// module id = 1283\n// module chunks = 0 1","var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIndexOf.js\n// module id = 1284\n// module chunks = 0 1","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseFindIndex.js\n// module id = 1285\n// module chunks = 0 1","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseIsNaN.js\n// module id = 1286\n// module chunks = 0 1","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_strictIndexOf.js\n// module id = 1287\n// module chunks = 0 1","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_createSet.js\n// module id = 1288\n// module chunks = 0 1","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_Set.js\n// module id = 1289\n// module chunks = 0 1","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/noop.js\n// module id = 1290\n// module chunks = 0 1","var baseDifference = require('./_baseDifference'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n  return isArrayLikeObject(array)\n    ? baseDifference(array, values)\n    : [];\n});\n\nmodule.exports = without;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/without.js\n// module id = 1291\n// module chunks = 0 1","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_baseDifference.js\n// module id = 1292\n// module chunks = 0 1","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/_arrayMap.js\n// module id = 1293\n// module chunks = 0 1","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/node_modules/lodash/memoize.js\n// module id = 1294\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.getNodeClientOffset = getNodeClientOffset;\nexports.getEventClientOffset = getEventClientOffset;\nexports.getDragPreviewOffset = getDragPreviewOffset;\n\nvar _BrowserDetector = require('./BrowserDetector');\n\nvar _MonotonicInterpolant = require('./MonotonicInterpolant');\n\nvar _MonotonicInterpolant2 = _interopRequireDefault(_MonotonicInterpolant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint\n   no-mixed-operators: off\n*/\nvar ELEMENT_NODE = 1;\n\nfunction getNodeClientOffset(node) {\n\tvar el = node.nodeType === ELEMENT_NODE ? node : node.parentElement;\n\n\tif (!el) {\n\t\treturn null;\n\t}\n\n\tvar _el$getBoundingClient = el.getBoundingClientRect(),\n\t    top = _el$getBoundingClient.top,\n\t    left = _el$getBoundingClient.left;\n\n\treturn { x: left, y: top };\n}\n\nfunction getEventClientOffset(e) {\n\treturn {\n\t\tx: e.clientX,\n\t\ty: e.clientY\n\t};\n}\n\nfunction isImageNode(node) {\n\treturn node.nodeName === 'IMG' && ((0, _BrowserDetector.isFirefox)() || !document.documentElement.contains(node));\n}\n\nfunction getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight) {\n\tvar dragPreviewWidth = isImage ? dragPreview.width : sourceWidth;\n\tvar dragPreviewHeight = isImage ? dragPreview.height : sourceHeight;\n\n\t// Work around @2x coordinate discrepancies in browsers\n\tif ((0, _BrowserDetector.isSafari)() && isImage) {\n\t\tdragPreviewHeight /= window.devicePixelRatio;\n\t\tdragPreviewWidth /= window.devicePixelRatio;\n\t}\n\treturn { dragPreviewWidth: dragPreviewWidth, dragPreviewHeight: dragPreviewHeight };\n}\n\nfunction getDragPreviewOffset(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint) {\n\t// The browsers will use the image intrinsic size under different conditions.\n\t// Firefox only cares if it's an image, but WebKit also wants it to be detached.\n\tvar isImage = isImageNode(dragPreview);\n\tvar dragPreviewNode = isImage ? sourceNode : dragPreview;\n\tvar dragPreviewNodeOffsetFromClient = getNodeClientOffset(dragPreviewNode);\n\tvar offsetFromDragPreview = {\n\t\tx: clientOffset.x - dragPreviewNodeOffsetFromClient.x,\n\t\ty: clientOffset.y - dragPreviewNodeOffsetFromClient.y\n\t};\n\tvar sourceWidth = sourceNode.offsetWidth,\n\t    sourceHeight = sourceNode.offsetHeight;\n\tvar anchorX = anchorPoint.anchorX,\n\t    anchorY = anchorPoint.anchorY;\n\n\tvar _getDragPreviewSize = getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight),\n\t    dragPreviewWidth = _getDragPreviewSize.dragPreviewWidth,\n\t    dragPreviewHeight = _getDragPreviewSize.dragPreviewHeight;\n\n\tvar calculateYOffset = function calculateYOffset() {\n\t\tvar interpolantY = new _MonotonicInterpolant2.default([0, 0.5, 1], [\n\t\t// Dock to the top\n\t\toffsetFromDragPreview.y,\n\t\t// Align at the center\n\t\toffsetFromDragPreview.y / sourceHeight * dragPreviewHeight,\n\t\t// Dock to the bottom\n\t\toffsetFromDragPreview.y + dragPreviewHeight - sourceHeight]);\n\t\tvar y = interpolantY.interpolate(anchorY);\n\t\t// Work around Safari 8 positioning bug\n\t\tif ((0, _BrowserDetector.isSafari)() && isImage) {\n\t\t\t// We'll have to wait for @3x to see if this is entirely correct\n\t\t\ty += (window.devicePixelRatio - 1) * dragPreviewHeight;\n\t\t}\n\t\treturn y;\n\t};\n\n\tvar calculateXOffset = function calculateXOffset() {\n\t\t// Interpolate coordinates depending on anchor point\n\t\t// If you know a simpler way to do this, let me know\n\t\tvar interpolantX = new _MonotonicInterpolant2.default([0, 0.5, 1], [\n\t\t// Dock to the left\n\t\toffsetFromDragPreview.x,\n\t\t// Align at the center\n\t\toffsetFromDragPreview.x / sourceWidth * dragPreviewWidth,\n\t\t// Dock to the right\n\t\toffsetFromDragPreview.x + dragPreviewWidth - sourceWidth]);\n\t\treturn interpolantX.interpolate(anchorX);\n\t};\n\n\t// Force offsets if specified in the options.\n\tvar offsetX = offsetPoint.offsetX,\n\t    offsetY = offsetPoint.offsetY;\n\n\tvar isManualOffsetX = offsetX === 0 || offsetX;\n\tvar isManualOffsetY = offsetY === 0 || offsetY;\n\treturn {\n\t\tx: isManualOffsetX ? offsetX : calculateXOffset(),\n\t\ty: isManualOffsetY ? offsetY : calculateYOffset()\n\t};\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/OffsetUtils.js\n// module id = 1295\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint\n   no-plusplus: off,\n   no-mixed-operators: off\n*/\nvar MonotonicInterpolant = function () {\n\tfunction MonotonicInterpolant(xs, ys) {\n\t\t_classCallCheck(this, MonotonicInterpolant);\n\n\t\tvar length = xs.length;\n\n\t\t// Rearrange xs and ys so that xs is sorted\n\t\tvar indexes = [];\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tindexes.push(i);\n\t\t}\n\t\tindexes.sort(function (a, b) {\n\t\t\treturn xs[a] < xs[b] ? -1 : 1;\n\t\t});\n\n\t\t// Get consecutive differences and slopes\n\t\tvar dys = [];\n\t\tvar dxs = [];\n\t\tvar ms = [];\n\t\tvar dx = void 0;\n\t\tvar dy = void 0;\n\t\tfor (var _i = 0; _i < length - 1; _i++) {\n\t\t\tdx = xs[_i + 1] - xs[_i];\n\t\t\tdy = ys[_i + 1] - ys[_i];\n\t\t\tdxs.push(dx);\n\t\t\tdys.push(dy);\n\t\t\tms.push(dy / dx);\n\t\t}\n\n\t\t// Get degree-1 coefficients\n\t\tvar c1s = [ms[0]];\n\t\tfor (var _i2 = 0; _i2 < dxs.length - 1; _i2++) {\n\t\t\tvar _m = ms[_i2];\n\t\t\tvar mNext = ms[_i2 + 1];\n\t\t\tif (_m * mNext <= 0) {\n\t\t\t\tc1s.push(0);\n\t\t\t} else {\n\t\t\t\tdx = dxs[_i2];\n\t\t\t\tvar dxNext = dxs[_i2 + 1];\n\t\t\t\tvar common = dx + dxNext;\n\t\t\t\tc1s.push(3 * common / ((common + dxNext) / _m + (common + dx) / mNext));\n\t\t\t}\n\t\t}\n\t\tc1s.push(ms[ms.length - 1]);\n\n\t\t// Get degree-2 and degree-3 coefficients\n\t\tvar c2s = [];\n\t\tvar c3s = [];\n\t\tvar m = void 0;\n\t\tfor (var _i3 = 0; _i3 < c1s.length - 1; _i3++) {\n\t\t\tm = ms[_i3];\n\t\t\tvar c1 = c1s[_i3];\n\t\t\tvar invDx = 1 / dxs[_i3];\n\t\t\tvar _common = c1 + c1s[_i3 + 1] - m - m;\n\t\t\tc2s.push((m - c1 - _common) * invDx);\n\t\t\tc3s.push(_common * invDx * invDx);\n\t\t}\n\n\t\tthis.xs = xs;\n\t\tthis.ys = ys;\n\t\tthis.c1s = c1s;\n\t\tthis.c2s = c2s;\n\t\tthis.c3s = c3s;\n\t}\n\n\t_createClass(MonotonicInterpolant, [{\n\t\tkey: \"interpolate\",\n\t\tvalue: function interpolate(x) {\n\t\t\tvar xs = this.xs,\n\t\t\t    ys = this.ys,\n\t\t\t    c1s = this.c1s,\n\t\t\t    c2s = this.c2s,\n\t\t\t    c3s = this.c3s;\n\n\t\t\t// The rightmost point in the dataset should give an exact result\n\n\t\t\tvar i = xs.length - 1;\n\t\t\tif (x === xs[i]) {\n\t\t\t\treturn ys[i];\n\t\t\t}\n\n\t\t\t// Search for the interval x is in, returning the corresponding y if x is one of the original xs\n\t\t\tvar low = 0;\n\t\t\tvar high = c3s.length - 1;\n\t\t\tvar mid = void 0;\n\t\t\twhile (low <= high) {\n\t\t\t\tmid = Math.floor(0.5 * (low + high));\n\t\t\t\tvar xHere = xs[mid];\n\t\t\t\tif (xHere < x) {\n\t\t\t\t\tlow = mid + 1;\n\t\t\t\t} else if (xHere > x) {\n\t\t\t\t\thigh = mid - 1;\n\t\t\t\t} else {\n\t\t\t\t\treturn ys[mid];\n\t\t\t\t}\n\t\t\t}\n\t\t\ti = Math.max(0, high);\n\n\t\t\t// Interpolate\n\t\t\tvar diff = x - xs[i];\n\t\t\tvar diffSq = diff * diff;\n\t\t\treturn ys[i] + c1s[i] * diff + c2s[i] * diffSq + c3s[i] * diff * diffSq;\n\t\t}\n\t}]);\n\n\treturn MonotonicInterpolant;\n}();\n\nexports.default = MonotonicInterpolant;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/MonotonicInterpolant.js\n// module id = 1296\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _nativeTypesConfig;\n\nexports.createNativeDragSource = createNativeDragSource;\nexports.matchNativeItemType = matchNativeItemType;\n\nvar _NativeTypes = require('./NativeTypes');\n\nvar NativeTypes = _interopRequireWildcard(_NativeTypes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; desc.configurable = desc.enumerable = true; if (\"value\" in desc) desc.writable = true; Object.defineProperty(obj, key, desc); } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction getDataFromDataTransfer(dataTransfer, typesToTry, defaultValue) {\n\tvar result = typesToTry.reduce(function (resultSoFar, typeToTry) {\n\t\treturn resultSoFar || dataTransfer.getData(typeToTry);\n\t}, null);\n\n\treturn result != null // eslint-disable-line eqeqeq\n\t? result : defaultValue;\n}\n\nvar nativeTypesConfig = (_nativeTypesConfig = {}, _defineProperty(_nativeTypesConfig, NativeTypes.FILE, {\n\texposeProperty: 'files',\n\tmatchesTypes: ['Files'],\n\tgetData: function getData(dataTransfer) {\n\t\treturn Array.prototype.slice.call(dataTransfer.files);\n\t}\n}), _defineProperty(_nativeTypesConfig, NativeTypes.URL, {\n\texposeProperty: 'urls',\n\tmatchesTypes: ['Url', 'text/uri-list'],\n\tgetData: function getData(dataTransfer, matchesTypes) {\n\t\treturn getDataFromDataTransfer(dataTransfer, matchesTypes, '').split('\\n');\n\t}\n}), _defineProperty(_nativeTypesConfig, NativeTypes.TEXT, {\n\texposeProperty: 'text',\n\tmatchesTypes: ['Text', 'text/plain'],\n\tgetData: function getData(dataTransfer, matchesTypes) {\n\t\treturn getDataFromDataTransfer(dataTransfer, matchesTypes, '');\n\t}\n}), _nativeTypesConfig);\n\nfunction createNativeDragSource(type) {\n\tvar _nativeTypesConfig$ty = nativeTypesConfig[type],\n\t    exposeProperty = _nativeTypesConfig$ty.exposeProperty,\n\t    matchesTypes = _nativeTypesConfig$ty.matchesTypes,\n\t    getData = _nativeTypesConfig$ty.getData;\n\n\n\treturn function () {\n\t\tfunction NativeDragSource() {\n\t\t\tvar _item, _mutatorMap;\n\n\t\t\t_classCallCheck(this, NativeDragSource);\n\n\t\t\tthis.item = (_item = {}, _mutatorMap = {}, _mutatorMap[exposeProperty] = _mutatorMap[exposeProperty] || {}, _mutatorMap[exposeProperty].get = function () {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn('Browser doesn\\'t allow reading \"' + exposeProperty + '\" until the drop event.');\n\t\t\t\treturn null;\n\t\t\t}, _defineEnumerableProperties(_item, _mutatorMap), _item);\n\t\t}\n\n\t\t_createClass(NativeDragSource, [{\n\t\t\tkey: 'mutateItemByReadingDataTransfer',\n\t\t\tvalue: function mutateItemByReadingDataTransfer(dataTransfer) {\n\t\t\t\tdelete this.item[exposeProperty];\n\t\t\t\tthis.item[exposeProperty] = getData(dataTransfer, matchesTypes);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'canDrag',\n\t\t\tvalue: function canDrag() {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'beginDrag',\n\t\t\tvalue: function beginDrag() {\n\t\t\t\treturn this.item;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'isDragging',\n\t\t\tvalue: function isDragging(monitor, handle) {\n\t\t\t\treturn handle === monitor.getSourceId();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: 'endDrag',\n\t\t\tvalue: function endDrag() {}\n\t\t}]);\n\n\t\treturn NativeDragSource;\n\t}();\n}\n\nfunction matchNativeItemType(dataTransfer) {\n\tvar dataTransferTypes = Array.prototype.slice.call(dataTransfer.types || []);\n\n\treturn Object.keys(nativeTypesConfig).filter(function (nativeItemType) {\n\t\tvar matchesTypes = nativeTypesConfig[nativeItemType].matchesTypes;\n\n\t\treturn matchesTypes.some(function (t) {\n\t\t\treturn dataTransferTypes.indexOf(t) > -1;\n\t\t});\n\t})[0] || null;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/NativeDragSources.js\n// module id = 1297\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports.default = getEmptyImage;\nvar emptyImage = void 0;\nfunction getEmptyImage() {\n\tif (!emptyImage) {\n\t\temptyImage = new Image();\n\t\temptyImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t}\n\n\treturn emptyImage;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dnd-html5-backend/lib/getEmptyImage.js\n// module id = 1298\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { DragSource, DropTarget } from 'react-dnd';\nimport compose from 'recompose/compose';\nimport TooltipEditorColumnSelect from './tooltip_editor_column_select';\n\nconst itemSource = {\n  beginDrag(props) {\n    return {\n      id: props.id\n    };\n  },\n\n  endDrag(props, monitor) {\n    if (!monitor.didDrop()) {\n      return;\n    }\n\n    props.setItem();\n  }\n};\n\nconst itemTarget = {\n  hover(props, monitor) {\n    const draggedId = monitor.getItem().id;\n\n    if (draggedId !== props.id) {\n      props.moveItem(draggedId, props.id);\n    }\n  }\n};\n\nexport class TooltipEditorItem extends React.Component<any, any> {\n  static propTypes = {\n    connectDragSource: PropTypes.func.isRequired,\n    connectDropTarget: PropTypes.func.isRequired,\n    isDragging: PropTypes.bool.isRequired,\n    wrapper: PropTypes.bool,\n    isDraggable: PropTypes.bool,\n    children: PropTypes.object,\n    locale: PropTypes.string.isRequired,\n    rowForTooltip: PropTypes.object.isRequired,\n    column: PropTypes.object.isRequired,\n    selectableColumns: PropTypes.object.isRequired,\n    updateColumn: PropTypes.func.isRequired,\n    removeColumn: PropTypes.func.isRequired\n  };\n\n  render() {\n    const {\n      connectDragSource,\n      connectDropTarget,\n      isDraggable,\n      rowForTooltip,\n      column,\n      selectableColumns,\n      updateColumn,\n      removeColumn,\n      locale\n    } = this.props;\n\n    const tooltipRow = (\n      <tr className=\"tooltip_editor__option\">\n        <td className=\"checkbox_column\">\n          <fieldset className=\"ui-form\">\n            <label className=\"ui-form__checkbox-label\">\n              <input type=\"checkbox\"\n                checked={column.get('showColumnName')}\n                onChange={() => updateColumn(column.set('showColumnName', !column.get('showColumnName')))} />\n            </label>\n          </fieldset>\n        </td>\n        <td className=\"remove_column\">\n          <a onClick={() => removeColumn(column)}><i className=\"tooltip_editor__add_button_icon icon-remove-1\"/></a>\n        </td>\n        <td>\n          <TooltipEditorColumnSelect\n            locale={locale}\n            rowForTooltip={rowForTooltip}\n            selectedColumn={column}\n            selectableColumns={selectableColumns}\n            onSelect={(newColumn) => updateColumn(newColumn)} />\n        </td>\n        <td className=\"tooltip_editor__draggable\"><span className=\"tooltip_editor__draggable_icon\"></span></td>\n      </tr>\n    );\n\n    if (isDraggable) {\n      return connectDragSource(connectDropTarget(tooltipRow));\n    }\n\n    return tooltipRow;\n  }\n}\n\nconst SortableTooltipEditorItem = compose(\n  DropTarget('ITEM', itemTarget, connect => ({\n    connectDropTarget: connect.dropTarget()\n  })),\n  DragSource('ITEM', itemSource, (connect, monitor) => ({\n    connectDragSource: connect.dragSource(),\n    isDragging: monitor.isDragging()\n  }))\n)(TooltipEditorItem);\n\nexport default SortableTooltipEditorItem;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/sortable_tooltip_editor_item.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _flowRight = require('lodash/flowRight');\n\nvar _flowRight2 = _interopRequireDefault(_flowRight);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _flowRight2.default;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/compose.js\n// module id = 1300\n// module chunks = 0 1","var createFlow = require('./_createFlow');\n\n/**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flowRight = createFlow(true);\n\nmodule.exports = flowRight;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/flowRight.js\n// module id = 1301\n// module chunks = 0 1","var LodashWrapper = require('./_LodashWrapper'),\n    flatRest = require('./_flatRest'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    isArray = require('./isArray'),\n    isLaziable = require('./_isLaziable');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n    WRAP_PARTIAL_FLAG = 32,\n    WRAP_ARY_FLAG = 128,\n    WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n  return flatRest(function(funcs) {\n    var length = funcs.length,\n        index = length,\n        prereq = LodashWrapper.prototype.thru;\n\n    if (fromRight) {\n      funcs.reverse();\n    }\n    while (index--) {\n      var func = funcs[index];\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n        var wrapper = new LodashWrapper([], true);\n      }\n    }\n    index = wrapper ? index : length;\n    while (++index < length) {\n      func = funcs[index];\n\n      var funcName = getFuncName(func),\n          data = funcName == 'wrapper' ? getData(func) : undefined;\n\n      if (data && isLaziable(data[0]) &&\n            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n            !data[4].length && data[9] == 1\n          ) {\n        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n      } else {\n        wrapper = (func.length == 1 && isLaziable(func))\n          ? wrapper[funcName]()\n          : wrapper.thru(func);\n      }\n    }\n    return function() {\n      var args = arguments,\n          value = args[0];\n\n      if (wrapper && args.length == 1 && isArray(value)) {\n        return wrapper.plant(value).value();\n      }\n      var index = 0,\n          result = length ? funcs[index].apply(this, args) : value;\n\n      while (++index < length) {\n        result = funcs[index].call(this, result);\n      }\n      return result;\n    };\n  });\n}\n\nmodule.exports = createFlow;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_createFlow.js\n// module id = 1302\n// module chunks = 0 1","var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_flatRest.js\n// module id = 1303\n// module chunks = 0 1","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/flatten.js\n// module id = 1304\n// module chunks = 0 1","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseFlatten.js\n// module id = 1305\n// module chunks = 0 1","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_arrayPush.js\n// module id = 1306\n// module chunks = 0 1","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_isFlattenable.js\n// module id = 1307\n// module chunks = 0 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_freeGlobal.js\n// module id = 1308\n// module chunks = 0 1","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/isArguments.js\n// module id = 1309\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseIsArguments.js\n// module id = 1310\n// module chunks = 0 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_getRawTag.js\n// module id = 1311\n// module chunks = 0 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_objectToString.js\n// module id = 1312\n// module chunks = 0 1","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_overRest.js\n// module id = 1313\n// module chunks = 0 1","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_apply.js\n// module id = 1314\n// module chunks = 0 1","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_setToString.js\n// module id = 1315\n// module chunks = 0 1","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseSetToString.js\n// module id = 1316\n// module chunks = 0 1","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/constant.js\n// module id = 1317\n// module chunks = 0 1","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_defineProperty.js\n// module id = 1318\n// module chunks = 0 1","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_baseIsNative.js\n// module id = 1319\n// module chunks = 0 1","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/isFunction.js\n// module id = 1320\n// module chunks = 0 1","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_isMasked.js\n// module id = 1321\n// module chunks = 0 1","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_coreJsData.js\n// module id = 1322\n// module chunks = 0 1","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_toSource.js\n// module id = 1323\n// module chunks = 0 1","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_getValue.js\n// module id = 1324\n// module chunks = 0 1","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/identity.js\n// module id = 1325\n// module chunks = 0 1","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_shortOut.js\n// module id = 1326\n// module chunks = 0 1","var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_metaMap.js\n// module id = 1327\n// module chunks = 0 1","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_WeakMap.js\n// module id = 1328\n// module chunks = 0 1","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/noop.js\n// module id = 1329\n// module chunks = 0 1","/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_realNames.js\n// module id = 1330\n// module chunks = 0 1","var LazyWrapper = require('./_LazyWrapper'),\n    getData = require('./_getData'),\n    getFuncName = require('./_getFuncName'),\n    lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n *  else `false`.\n */\nfunction isLaziable(func) {\n  var funcName = getFuncName(func),\n      other = lodash[funcName];\n\n  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n    return false;\n  }\n  if (func === other) {\n    return true;\n  }\n  var data = getData(other);\n  return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_isLaziable.js\n// module id = 1331\n// module chunks = 0 1","var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    baseLodash = require('./_baseLodash'),\n    isArray = require('./isArray'),\n    isObjectLike = require('./isObjectLike'),\n    wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n    if (value instanceof LodashWrapper) {\n      return value;\n    }\n    if (hasOwnProperty.call(value, '__wrapped__')) {\n      return wrapperClone(value);\n    }\n  }\n  return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/wrapperLodash.js\n// module id = 1332\n// module chunks = 0 1","var LazyWrapper = require('./_LazyWrapper'),\n    LodashWrapper = require('./_LodashWrapper'),\n    copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n  if (wrapper instanceof LazyWrapper) {\n    return wrapper.clone();\n  }\n  var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n  result.__actions__ = copyArray(wrapper.__actions__);\n  result.__index__  = wrapper.__index__;\n  result.__values__ = wrapper.__values__;\n  return result;\n}\n\nmodule.exports = wrapperClone;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_wrapperClone.js\n// module id = 1333\n// module chunks = 0 1","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/recompose/node_modules/lodash/_copyArray.js\n// module id = 1334\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport className from 'classnames';\n\nimport TooltipValue from './tooltip_value';\n\nexport default class TooltipEditorColumnSelect extends React.Component<any, any> {\n\n  static propTypes = {\n    locale: PropTypes.string.isRequired,\n    rowForTooltip: PropTypes.object.isRequired,\n    selectedColumn: PropTypes.object.isRequired,\n    selectableColumns: PropTypes.object.isRequired,\n    onSelect: PropTypes.func.isRequired\n  };\n\n  state = {\n    display: false\n  };\n\n  toggleMenu() {\n    this.setState({ display: !this.state.display });\n  }\n\n  render() {\n    const { rowForTooltip, selectedColumn, selectableColumns, onSelect, locale } = this.props;\n    const dropDownStyle = this.state.display ? { display: 'inline-block' } : null;\n    const columnValue = rowForTooltip.get(selectedColumn.get('name')) || '- no data -'; // TODO a better option here\n    const labelClasses = className('field-label', { unshown: !selectedColumn.get('showColumnName') });\n\n    return (\n      <div className=\"tooltip_editor__column_select\">\n        <div className={labelClasses}>{`${selectedColumn.get('label')}`.toUpperCase()}</div>\n        <div className=\"ui-dropdown\">\n          <a className=\"ui-dropdown__toggle ui-button\" onClick={() => this.toggleMenu()}>\n            <TooltipValue\n              locale={locale}\n              value={columnValue}\n              columnName={selectedColumn.get('name')}\n              columnType={selectedColumn.get('type')} />\n          </a>\n          <div className=\"ui-dropdown__target\" style={dropDownStyle}>\n            <div className=\"column_select_container\">\n              <ul className=\"ui-dropdown__list\">\n                {selectableColumns.map((column) => {\n                  return (\n                    <li key={column.get('name')}>\n                      <a onClick={() => { this.toggleMenu(); onSelect(column); }}>\n                        {column.get('label')}\n                      </a>\n                    </li>\n                  );\n                })}\n              </ul>\n            </div>\n            <footer className=\"ui-dropdown__footer\">\n              <a className=\"ui-dropdown__action\" onClick={() => this.toggleMenu()}>Cancel</a>\n            </footer>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/tooltip_editor_column_select.tsx","import _ from 'lodash';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { List, Map } from 'immutable';\nimport className from 'classnames';\nimport GridReportActions from '../actions/grid_report_actions';\nimport TooltipValue from './tooltip_value';\n\nexport default class Tooltip extends Component<any, any> {\n\n  static propTypes = {\n    colorExtractor: PropTypes.func.isRequired,\n    config: PropTypes.object.isRequired,\n    currentItems: PropTypes.instanceOf(List).isRequired,\n    editable: PropTypes.bool\n  };\n\n  render() {\n    const { colorExtractor, config, currentItems, editable } = this.props;\n\n    if (currentItems.size == 1) {\n      return (\n        <SingleItemTooltip\n          colorExtractor={colorExtractor}\n          config={config}\n          currentItem={currentItems.first()}\n          editable={editable} />\n      );\n    }\n\n    return (\n      <MultiItemTooltip\n        colorExtractor={colorExtractor}\n        config={config}\n        currentItems={currentItems}\n        editable={editable} />\n    );\n  }\n}\n\nconst EditButton = () => (\n  <div className=\"tooltip__edit_button\">\n    <a onClick={GridReportActions.setMapTooltipEditing}>\n      <i className=\"tooltip__edit_icon icon-app-manage\"/>\n    </a>\n  </div>\n);\n\nconst groupItemsByColorAndSort = props => {\n  return props.currentItems\n    .groupBy(item => props.colorExtractor(item))\n    .reduce((groups, items, color) => groups.push(Map({\n      color,\n      items\n    })), List())\n    .sortBy(group => -group.get('items').size)\n    .reduce((groups, group, index) => groups.push(\n      group.set('startIndex',\n        index == 0\n          ? 0\n          : groups.getIn([index - 1, 'items']).size + groups.getIn([index - 1, 'startIndex'])\n      )\n    ), List());\n};\n\nconst TooltipItemGroup = ({ color, count, index, onClick }) => (\n    <div className=\"group\" onClick={() => onClick(index)}>\n        <div\n            className=\"group_color_indicator legend__item__decorator map__legend__item__decorator\"\n            style={{color: color, background: color}} />\n        <div className=\"group_count\">{count}</div>\n    </div>\n);\n\nconst TooltipValueWrapper = ({ index, label, name, showColumnName, type, value, valueClass }) => (\n    <div key={index} className=\"tooltip__column_container\">\n        {showColumnName && <header className=\"tooltip__label\">{`${label}`.toUpperCase()}</header>}\n        <div className={valueClass}>\n            <TooltipValue value={value} columnName={name} columnType={type} />\n        </div>\n    </div>\n);\n\nconst mapValueWrapperProps = (item, config) => config.get('columns').map((column, index) => ({\n  index,\n  key: index,\n  label: column.get('label'),\n  name: column.get('name'),\n  showColumnName: column.get('showColumnName'),\n  type: column.get('type'),\n  value: item.get(column.get('name')),\n  valueClass: className('tooltip__value', { leading: index == 0 })\n})).toJS();\n\nclass MultiItemTooltip extends Component<any, any> {\n  static propTypes = {\n    colorExtractor: PropTypes.func.isRequired,\n    config: PropTypes.object.isRequired,\n    currentItems: PropTypes.object.isRequired,\n    editable: PropTypes.bool\n  };\n\n  state = {\n    currentIndex: 0,\n    groupedItems: groupItemsByColorAndSort(this.props),\n    items: groupItemsByColorAndSort(this.props).map(group => group.get('items')).flatten(1),\n    contentClass: ''\n  };\n\n  _handleIndexChange = (newIndex) => {\n    const { currentIndex, items } = this.state;\n\n    if (newIndex < 0 || newIndex >= items.size || newIndex == currentIndex) {\n      return;\n    }\n\n    this.setState({\n      currentIndex: newIndex,\n      contentClass: newIndex > this.state.currentIndex ? 'tooltip__multi__animation_right' : 'tooltip__multi__animation_left'\n    });\n\n    setTimeout(() => this.setState({ contentClass: '' }), 100);\n  }\n\n  _onBack = () => this._handleIndexChange(this.state.currentIndex - 1);\n\n  _onForward = () => this._handleIndexChange(this.state.currentIndex + 1);\n\n  _onJumpTo = index => this._handleIndexChange(index);\n\n  componentWillReceiveProps(nextProps) {\n    if (_.some(['colorExtractor', 'currentItems'], key => nextProps[key] !== this.props[key])) {\n      this.setState({\n        groupedItems: groupItemsByColorAndSort(nextProps),\n        items: groupItemsByColorAndSort(nextProps).map(group => group.get('items')).flatten(1)\n      });\n    }\n  }\n\n  render() {\n    const { colorExtractor, config, editable } = this.props;\n    const { currentIndex, contentClass, groupedItems, items } = this.state;\n    const currentItem = items.get(currentIndex);\n    const color = colorExtractor(currentItem);\n\n    return (\n      <div className=\"tooltip__container multi\">\n        <div className=\"tooltip__multi__header\" style={{ backgroundColor: color }}>\n          <div className=\"header_count\">{currentIndex + 1}/{items.size}</div>\n          <div className=\"header_nav\">\n            <div className=\"header_nav_button_back\" onClick={this._onBack}>\n              <span className=\"icon-lefthead-3\" style={{ color: color }}></span>\n              <span className=\"icon-circle-1 base\"></span>\n            </div>\n            <div className=\"header_nav_button_forward\" onClick={this._onForward}>\n              <span className=\"icon-righthead-3\" style={{ color: color }}></span>\n              <span className=\"icon-circle-1 base\"></span>\n            </div>\n          </div>\n        </div>\n        <div className=\"tooltip__multi__content\">\n          <div className=\"tooltip__multi__item\">\n            <div className={contentClass}>\n              {mapValueWrapperProps(currentItem, config).map(props => <TooltipValueWrapper {...props} />)}\n            </div>\n            {editable && <EditButton />}\n          </div>\n          <div className=\"tooltip__multi__groups\">\n            {groupedItems.map(group =>\n              <TooltipItemGroup\n                key={group.get('startIndex')}\n                color={group.get('color')}\n                count={group.get('items').size}\n                index={group.get('startIndex')}\n                onClick={this._onJumpTo} />\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nclass SingleItemTooltip extends Component<any, any> {\n  static propTypes = {\n    colorExtractor: PropTypes.func.isRequired,\n    config: PropTypes.object.isRequired,\n    currentItem: PropTypes.object.isRequired,\n    editable: PropTypes.bool\n  };\n\n  render() {\n    const { colorExtractor, config, currentItem, editable } = this.props;\n    const colorForItem = colorExtractor(currentItem);\n    const containerStyle = !!colorForItem ? { borderTop: `4px ${colorForItem} solid` } : null;\n\n    return (\n      <div className=\"tooltip__container\" style={containerStyle}>\n        {mapValueWrapperProps(currentItem, config).map(props => <TooltipValueWrapper {...props} />)}\n        {editable && <EditButton />}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/tooltip.tsx","import MapboxGl from 'mapbox-gl';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { render, unmountComponentAtNode } from 'react-dom';\nimport _ from 'lodash';\n\nexport default class GLPopup extends React.PureComponent<any, any> {\n  static contextTypes = {\n    map: PropTypes.object\n  };\n\n  static propTypes = {\n    coordinates: PropTypes.arrayOf(PropTypes.number).isRequired,\n    dangerouslySetInnerHTML: PropTypes.string,\n    text: PropTypes.string,\n    closeButton: PropTypes.bool,\n    closeOnClick: PropTypes.bool,\n    anchor: PropTypes.oneOf([\n      'top',\n      'bottom',\n      'left',\n      'right',\n      'top-left',\n      'top-right',\n      'bottom-left',\n      'bottom-right'\n    ]),\n    disableScroll: PropTypes.bool,\n    onClose: PropTypes.func,\n  }\n\n  div = document.createElement('div');\n\n  popup = new MapboxGl.Popup({\n    closeButton: this.props.closeButton,\n    closeOnClick: false,\n    anchor: this.props.anchor\n  });\n\n  componentWillMount() {\n    const { div, popup } = this;\n    const { map } = this.context;\n    const {\n      coordinates,\n      children,\n      dangerouslySetInnerHTML,\n      text\n    } = this.props;\n\n    if (children) {\n      popup.setDOMContent(div);\n    } else if (dangerouslySetInnerHTML) {\n      popup.setHTML(dangerouslySetInnerHTML);\n    } else {\n      popup.setText(text || '');\n    }\n\n    popup.setLngLat(coordinates);\n\n    render(this.renderPopupContent(), div, () => {\n      popup.addTo(map);\n      this._panTo(coordinates);\n    });\n  }\n\n  renderPopupContent() {\n    return (\n      <div className={this.props.className} style={{ maxWidth: this.props.maxWidth, minWidth: this.props.minWidth }}>\n        {this.props.children}\n      </div>\n    );\n  }\n\n  // The following two functions are debounced to avoid bouncy/jittery updates to the map\n\n  _update = _.debounce(() => {\n    render(this.renderPopupContent(), this.div, () => {\n      this.popup.setDOMContent(this.div);\n    });\n  }, 90);\n\n  _panTo = _.debounce((coordinates) => {\n    this.context.map.panTo(coordinates, { offset: [0, 110] });\n  }, 250);\n\n  _onClose = () => {\n    this.props.onClose();\n    this.context.map.off('click', this._onClose);\n  };\n\n  _clickAttached = null;\n\n  componentDidMount() {\n    if (this.props.onClose) {\n      this._clickAttached = this.context.map.on('click', this._onClose);\n    }\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const { popup } = this;\n    const {\n      children,\n      coordinates,\n      dangerouslySetInnerHTML,\n      text\n    } = nextProps;\n\n    if (!children) {\n      if (\n        this.props.dangerouslySetInnerHTML &&\n        dangerouslySetInnerHTML !== this.props.dangerouslySetInnerHTML\n      ) {\n        popup.setHTML(dangerouslySetInnerHTML);\n      } else if (text !== this.props.text) {\n        popup.setText(text);\n      }\n    } else {\n      this._update();\n    }\n\n    if (this.props.coordinates !== coordinates) {\n      popup.setLngLat(coordinates);\n      this._panTo(coordinates);\n    }\n\n    if (nextProps.onClose && this.props.onClose != nextProps.onClose) {\n      this._clickAttached = this.context.map.on('click', this._onClose);\n    }\n  }\n\n  componentWillUnmount() {\n    const { popup, div } = this;\n    popup.remove();\n    unmountComponentAtNode(div);\n\n    if (this.props.onClose) {\n      this.context.map.off('click', this._clickAttached);\n    }\n  }\n\n  render() {\n    return null;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/maps/gl_popup.tsx","module.exports = {\"_args\":[[\"mapbox-gl@0.23.0\",\"/srv/opengov\"]],\"_from\":\"mapbox-gl@0.23.0\",\"_id\":\"mapbox-gl@0.23.0\",\"_inBundle\":false,\"_integrity\":\"sha1-3tby1wV99IBpXtXF6/U+1HiThkM=\",\"_location\":\"/mapbox-gl\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"mapbox-gl@0.23.0\",\"name\":\"mapbox-gl\",\"escapedName\":\"mapbox-gl\",\"rawSpec\":\"0.23.0\",\"saveSpec\":null,\"fetchSpec\":\"0.23.0\"},\"_requiredBy\":[\"/\"],\"_resolved\":\"https://artifactory.opengov.zone:443/artifactory/api/npm/npm/mapbox-gl/-/mapbox-gl-0.23.0.tgz\",\"_spec\":\"0.23.0\",\"_where\":\"/srv/opengov\",\"browser\":{\"./js/util/ajax.js\":\"./js/util/browser/ajax.js\",\"./js/util/browser.js\":\"./js/util/browser/browser.js\",\"./js/util/canvas.js\":\"./js/util/browser/canvas.js\",\"./js/util/dom.js\":\"./js/util/browser/dom.js\",\"./js/util/web_worker.js\":\"./js/util/browser/web_worker.js\"},\"bugs\":{\"url\":\"https://github.com/mapbox/mapbox-gl-js/issues\"},\"dependencies\":{\"csscolorparser\":\"^1.0.2\",\"earcut\":\"^2.0.3\",\"feature-filter\":\"^2.2.0\",\"geojson-rewind\":\"^0.1.0\",\"geojson-vt\":\"^2.4.0\",\"gl-matrix\":\"^2.3.1\",\"grid-index\":\"^1.0.0\",\"mapbox-gl-function\":\"^1.2.1\",\"mapbox-gl-shaders\":\"github:mapbox/mapbox-gl-shaders#df162476980d9ee2ab6f8d0cf5a06e27aac60472\",\"mapbox-gl-style-spec\":\"github:mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae\",\"mapbox-gl-supported\":\"^1.2.0\",\"pbf\":\"^1.3.2\",\"pngjs\":\"^2.2.0\",\"point-geometry\":\"^0.0.0\",\"quickselect\":\"^1.0.0\",\"request\":\"^2.39.0\",\"resolve-url\":\"^0.2.1\",\"shelf-pack\":\"^1.0.0\",\"supercluster\":\"^2.0.1\",\"tinyqueue\":\"^1.1.0\",\"unassertify\":\"^2.0.0\",\"unitbezier\":\"^0.0.0\",\"vector-tile\":\"^1.3.0\",\"vt-pbf\":\"^2.0.2\",\"webworkify\":\"^1.3.0\",\"whoots-js\":\"^2.0.0\"},\"description\":\"A WebGL interactive maps library\",\"devDependencies\":{\"babel-preset-react\":\"^6.11.1\",\"babelify\":\"^7.3.0\",\"benchmark\":\"~2.1.0\",\"browserify\":\"^13.0.0\",\"clipboard\":\"^1.5.12\",\"concat-stream\":\"1.5.1\",\"coveralls\":\"^2.11.8\",\"doctrine\":\"^1.2.1\",\"documentation\":\"https://github.com/documentationjs/documentation/archive/bb41619c734e59ef3fbc3648610032efcfdaaace.tar.gz\",\"documentation-theme-utils\":\"3.0.0\",\"envify\":\"^3.4.0\",\"eslint\":\"^3.3.1\",\"eslint-config-mourner\":\"^2.0.0\",\"eslint-plugin-html\":\"^1.5.1\",\"gl\":\"^4.0.1\",\"handlebars\":\"4.0.5\",\"highlight.js\":\"9.3.0\",\"istanbul\":\"^0.4.2\",\"jsdom\":\"^9.4.2\",\"jsdom-global\":\"^2.1.0\",\"json-loader\":\"^0.5.4\",\"lodash\":\"^4.13.1\",\"mapbox-gl-test-suite\":\"github:mapbox/mapbox-gl-test-suite#35efbce663a0f13d37d34afac799e33178ee610a\",\"memory-fs\":\"^0.3.0\",\"minifyify\":\"^7.0.1\",\"npm-run-all\":\"^3.0.0\",\"nyc\":\"6.4.0\",\"proxyquire\":\"^1.7.9\",\"remark\":\"4.2.2\",\"remark-html\":\"3.0.0\",\"sinon\":\"^1.15.4\",\"st\":\"^1.2.0\",\"tap\":\"^5.7.0\",\"transform-loader\":\"^0.2.3\",\"unist-util-visit\":\"1.1.0\",\"vinyl\":\"1.1.1\",\"vinyl-fs\":\"2.4.3\",\"watchify\":\"^3.7.0\",\"webpack\":\"^1.13.1\",\"webworkify-webpack\":\"^1.1.3\"},\"engines\":{\"node\":\">=4.0.0\"},\"homepage\":\"https://github.com/mapbox/mapbox-gl-js#readme\",\"license\":\"BSD-3-Clause\",\"main\":\"js/mapbox-gl.js\",\"name\":\"mapbox-gl\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/mapbox/mapbox-gl-js.git\"},\"scripts\":{\"build\":\"npm run build-docs # invoked by publisher when publishing docs on the mb-pages branch\",\"build-dev\":\"browserify js/mapbox-gl.js --debug --standalone mapboxgl > dist/mapbox-gl-dev.js && tap --no-coverage test/build/dev.test.js\",\"build-docs\":\"documentation build --github --format html --config documentation.yml --theme ./docs/_theme --output docs/api/\",\"build-min\":\"browserify js/mapbox-gl.js --debug --transform unassertify --plugin [minifyify --map mapbox-gl.js.map --output dist/mapbox-gl.js.map] --standalone mapboxgl > dist/mapbox-gl.js && tap --no-coverage test/build/min.test.js\",\"build-token\":\"browserify debug/access-token.js --debug --transform envify > debug/access-token-generated.js\",\"lint\":\"eslint  --ignore-path .gitignore js test bench docs/_posts/examples/*.html\",\"open-changed-examples\":\"git diff --name-only mb-pages HEAD -- docs/_posts/examples/*.html | awk '{print \\\"http://127.0.0.1:4000/mapbox-gl-js/example/\\\" substr($0,33,length($0)-37)}' | xargs open\",\"start\":\"run-p build-token watch-dev watch-bench start-server\",\"start-bench\":\"run-p build-token watch-bench start-server\",\"start-debug\":\"run-p build-token watch-dev start-server\",\"start-docs\":\"npm run build-min && npm run build-docs && jekyll serve --watch\",\"start-server\":\"st --no-cache --localhost --port 9966 --index index.html .\",\"test\":\"npm run lint && tap --reporter dot test/js test/build/webpack.test.js\",\"test-suite\":\"node test/render.test.js && node test/query.test.js\",\"watch-bench\":\"node bench/download-data.js && watchify bench/index.js --plugin [minifyify --no-map] --transform [babelify --presets react] --transform unassertify --transform envify --outfile bench/index-generated.js --verbose\",\"watch-dev\":\"watchify js/mapbox-gl.js --debug --standalone mapboxgl --outfile dist/mapbox-gl-dev.js --verbose\"},\"version\":\"0.23.0\"}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/package.json\n// module id = 1338\n// module chunks = 0 1","'use strict';\n\nvar Canvas = require('../util/canvas');\nvar util = require('../util/util');\nvar browser = require('../util/browser');\nvar window = require('../util/browser').window;\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\n\nvar Style = require('../style/style');\nvar AnimationLoop = require('../style/animation_loop');\nvar Painter = require('../render/painter');\n\nvar Transform = require('../geo/transform');\nvar Hash = require('./hash');\n\nvar bindHandlers = require('./bind_handlers');\n\nvar Camera = require('./camera');\nvar LngLat = require('../geo/lng_lat');\nvar LngLatBounds = require('../geo/lng_lat_bounds');\nvar Point = require('point-geometry');\nvar Attribution = require('./control/attribution');\n\nvar defaultMinZoom = 0;\nvar defaultMaxZoom = 20;\nvar defaultOptions = {\n    center: [0, 0],\n    zoom: 0,\n    bearing: 0,\n    pitch: 0,\n\n    minZoom: defaultMinZoom,\n    maxZoom: defaultMaxZoom,\n\n    interactive: true,\n\n    scrollZoom: true,\n    boxZoom: true,\n    dragRotate: true,\n    dragPan: true,\n    keyboard: true,\n    doubleClickZoom: true,\n    touchZoomRotate: true,\n\n    bearingSnap: 7,\n\n    hash: false,\n\n    attributionControl: true,\n\n    failIfMajorPerformanceCaveat: false,\n    preserveDrawingBuffer: false,\n\n    trackResize: true\n};\n\n/**\n * The `Map` object represents the map on your page. It exposes methods\n * and properties that enable you to programmatically change the map,\n * and fires events as users interact with it.\n *\n * You create a `Map` by specifying a `container` and other options.\n * Then Mapbox GL JS initializes the map on the page and returns your `Map`\n * object.\n *\n * The `Map` class mixes in [`Evented`](#Evented) methods.\n *\n * @class Map\n * @param {Object} options\n * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`.\n * @param {number} [options.minZoom=0] The minimum zoom level of the map (1-20).\n * @param {number} [options.maxZoom=20] The maximum zoom level of the map (1-20).\n * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to\n * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to\n * such JSON.\n *\n * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`,\n * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following\n * [the predefined Mapbox styles](https://www.mapbox.com/maps/):\n *\n *  * `mapbox://styles/mapbox/streets-v9`\n *  * `mapbox://styles/mapbox/outdoors-v9`\n *  * `mapbox://styles/mapbox/light-v9`\n *  * `mapbox://styles/mapbox/dark-v9`\n *  * `mapbox://styles/mapbox/satellite-v9`\n *  * `mapbox://styles/mapbox/satellite-streets-v9`\n *\n * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, and bearing) will be synced with the hash fragment of the page's URL.\n *   For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1`.\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.\n * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's\n *   bearing (rotation) will snap to north. For example, with a `bearingSnap` of 7, if the user rotates\n *   the map within 7 degrees of north, the map will automatically snap to exact north.\n * @param {Array<string>} [options.classes] Mapbox style class names with which to initialize the map.\n *   Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n *   in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n *   [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n * @param {boolean} [options.attributionControl=true] If `true`, an [Attribution](#Attribution) control will be added to the map.\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox\n *   GL JS would be dramatically worse than expected (i.e. a software renderer would be used).\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.\n * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds.\n * @param {boolean} [options.scrollZoom=true] If `true`, the \"scroll to zoom\" interaction is enabled (see [`ScrollZoomHandler`](#ScrollZoomHandler)).\n * @param {boolean} [options.boxZoom=true] If `true`, the \"box zoom\" interaction is enabled (see [`BoxZoomHandler`](#BoxZoomHandler)).\n * @param {boolean} [options.dragRotate=true] If `true`, the \"drag to rotate\" interaction is enabled (see [`DragRotateHandler`](#DragRotateHandler)).\n * @param {boolean} [options.dragPan=true] If `true`, the \"drag to pan\" interaction is enabled (see [`DragPanHandler`](#DragPanHandler)).\n * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see [`KeyboardHandler`](#KeyboardHandler)).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, the \"double click to zoom\" interaction is enabled (see [`DoubleClickZoomHandler`](#DoubleClickZoomHandler)).\n * @param {boolean} [options.touchZoomRotate=true] If `true`, the \"pinch to rotate and zoom\" interaction is enabled (see [`TouchZoomRotateHandler`](#TouchZoomRotateHandler)).\n * @param {boolean} [options.trackResize=true]  If `true`, the map will automatically resize when the browser window resizes.\n * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]`.\n * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @example\n * var map = new mapboxgl.Map({\n *   container: 'map',\n *   center: [-122.420679, 37.772537],\n *   zoom: 13,\n *   style: style_object,\n *   hash: true\n * });\n */\nvar Map = module.exports = function(options) {\n\n    options = util.extend({}, defaultOptions, options);\n\n    this._interactive = options.interactive;\n    this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n    this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n    this._trackResize = options.trackResize;\n    this._bearingSnap = options.bearingSnap;\n\n    if (typeof options.container === 'string') {\n        this._container = document.getElementById(options.container);\n    } else {\n        this._container = options.container;\n    }\n\n    this.animationLoop = new AnimationLoop();\n    this.transform = new Transform(options.minZoom, options.maxZoom);\n\n    if (options.maxBounds) {\n        this.setMaxBounds(options.maxBounds);\n    }\n\n    util.bindAll([\n        '_forwardStyleEvent',\n        '_forwardSourceEvent',\n        '_forwardLayerEvent',\n        '_forwardTileEvent',\n        '_onStyleLoad',\n        '_onStyleChange',\n        '_onSourceAdd',\n        '_onSourceRemove',\n        '_onSourceUpdate',\n        '_onWindowOnline',\n        '_onWindowResize',\n        '_update',\n        '_render'\n    ], this);\n\n    this._setupContainer();\n    this._setupPainter();\n\n    this.on('move', this._update.bind(this, false));\n    this.on('zoom', this._update.bind(this, true));\n    this.on('moveend', function() {\n        this.animationLoop.set(300); // text fading\n        this._rerender();\n    }.bind(this));\n\n    if (typeof window !== 'undefined') {\n        window.addEventListener('online', this._onWindowOnline, false);\n        window.addEventListener('resize', this._onWindowResize, false);\n    }\n\n    bindHandlers(this, options);\n\n    this._hash = options.hash && (new Hash()).addTo(this);\n    // don't set position from options if set through hash\n    if (!this._hash || !this._hash._onHashChange()) {\n        this.jumpTo({\n            center: options.center,\n            zoom: options.zoom,\n            bearing: options.bearing,\n            pitch: options.pitch\n        });\n    }\n\n    this.stacks = {};\n    this._classes = [];\n\n    this.resize();\n\n    if (options.classes) this.setClasses(options.classes);\n    if (options.style) this.setStyle(options.style);\n    if (options.attributionControl) this.addControl(new Attribution(options.attributionControl));\n\n    var fireError = this.fire.bind(this, 'error');\n    this.on('style.error', fireError);\n    this.on('source.error', fireError);\n    this.on('tile.error', fireError);\n    this.on('layer.error', fireError);\n};\n\nutil.extend(Map.prototype, Evented);\nutil.extend(Map.prototype, Camera.prototype);\nutil.extend(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Adds a [`Control`](#Control) to the map, calling `control.addTo(this)`.\n     *\n     * @param {Control} control The [`Control`](#Control) to add.\n     * @returns {Map} `this`\n     */\n    addControl: function(control) {\n        control.addTo(this);\n        return this;\n    },\n\n    /**\n     * Adds a Mapbox style class to the map.\n     *\n     * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n     * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n     * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n     *\n     * @param {string} klass The style class to add.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    addClass: function(klass, options) {\n        if (this._classes.indexOf(klass) >= 0 || klass === '') return this;\n        this._classes.push(klass);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Removes a Mapbox style class from the map.\n     *\n     * @param {string} klass The style class to remove.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    removeClass: function(klass, options) {\n        var i = this._classes.indexOf(klass);\n        if (i < 0 || klass === '') return this;\n        this._classes.splice(i, 1);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Replaces the map's existing Mapbox style classes with a new array of classes.\n     *\n     * @param {Array<string>} klasses The style classes to set.\n     * @param {StyleOptions} [options]\n     * @fires change\n     * @returns {Map} `this`\n     */\n    setClasses: function(klasses, options) {\n        var uniqueClasses = {};\n        for (var i = 0; i < klasses.length; i++) {\n            if (klasses[i] !== '') uniqueClasses[klasses[i]] = true;\n        }\n        this._classes = Object.keys(uniqueClasses);\n        this._classOptions = options;\n\n        if (this.style) this.style.updateClasses();\n        return this._update(true);\n    },\n\n    /**\n     * Returns a Boolean indicating whether the map has the\n     * specified Mapbox style class.\n     *\n     * @param {string} klass The style class to test.\n     * @returns {boolean} `true` if the map has the specified style class.\n     */\n    hasClass: function(klass) {\n        return this._classes.indexOf(klass) >= 0;\n    },\n\n    /**\n     * Returns the map's Mapbox style classes.\n     *\n     * @returns {Array<string>} The map's style classes.\n     */\n    getClasses: function() {\n        return this._classes;\n    },\n\n    /**\n     * Resizes the map according to the dimensions of its\n     * `container` element.\n     *\n     * This method must be called after the map's `container` is resized by another script,\n     * or when the map is shown after being initially hidden with CSS.\n     *\n     * @returns {Map} `this`\n     */\n    resize: function() {\n        var width = 0, height = 0;\n\n        if (this._container) {\n            width = this._container.offsetWidth || 400;\n            height = this._container.offsetHeight || 300;\n        }\n\n        this._canvas.resize(width, height);\n        this.transform.resize(width, height);\n        this.painter.resize(width, height);\n\n        return this\n            .fire('movestart')\n            .fire('move')\n            .fire('resize')\n            .fire('moveend');\n    },\n\n    /**\n     * Returns the map's geographical bounds.\n     *\n     * @returns {LngLatBounds} The map's geographical bounds.\n     */\n    getBounds: function() {\n        var bounds = new LngLatBounds(\n            this.transform.pointLocation(new Point(0, 0)),\n            this.transform.pointLocation(this.transform.size));\n\n        if (this.transform.angle || this.transform.pitch) {\n            bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0)));\n            bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y)));\n        }\n\n        return bounds;\n    },\n\n    /**\n     * Sets or clears the map's geographical bounds.\n     *\n     * Pan and zoom operations are constrained within these bounds.\n     * If a pan or zoom is performed that would\n     * display regions outside these bounds, the map will\n     * instead display a position and zoom level\n     * as close as possible to the operation's request while still\n     * remaining within the bounds.\n     *\n     * @param {LngLatBoundsLike | null | undefined} lnglatbounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.\n     * @returns {Map} `this`\n     */\n    setMaxBounds: function (lnglatbounds) {\n        if (lnglatbounds) {\n            var b = LngLatBounds.convert(lnglatbounds);\n            this.transform.lngRange = [b.getWest(), b.getEast()];\n            this.transform.latRange = [b.getSouth(), b.getNorth()];\n            this.transform._constrain();\n            this._update();\n        } else if (lnglatbounds === null || lnglatbounds === undefined) {\n            this.transform.lngRange = [];\n            this.transform.latRange = [];\n            this._update();\n        }\n        return this;\n\n    },\n    /**\n     * Sets or clears the map's minimum zoom level.\n     * If the map's current zoom level is lower than the new minimum,\n     * the map will zoom to the new minimum.\n     *\n     * @param {?number} minZoom The minimum zoom level to set (0-20).\n     *   If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0).\n     * @returns {Map} `this`\n     */\n    setMinZoom: function(minZoom) {\n\n        minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n        if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n            this.transform.minZoom = minZoom;\n            this._update();\n\n            if (this.getZoom() < minZoom) this.setZoom(minZoom);\n\n            return this;\n\n        } else throw new Error('minZoom must be between ' + defaultMinZoom + ' and the current maxZoom, inclusive');\n    },\n\n    /**\n     * Sets or clears the map's maximum zoom level.\n     * If the map's current zoom level is higher than the new maximum,\n     * the map will zoom to the new maximum.\n     *\n     * @param {?number} maxZoom The maximum zoom level to set (0-20).\n     *   If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 20).\n     * @returns {Map} `this`\n     */\n    setMaxZoom: function(maxZoom) {\n\n        maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n        if (maxZoom >= this.transform.minZoom && maxZoom <= defaultMaxZoom) {\n            this.transform.maxZoom = maxZoom;\n            this._update();\n\n            if (this.getZoom() > maxZoom) this.setZoom(maxZoom);\n\n            return this;\n\n        } else throw new Error('maxZoom must be between the current minZoom and ' + defaultMaxZoom + ', inclusive');\n    },\n    /**\n     * Returns a [`Point`](#Point) representing pixel coordinates, relative to the map's `container`,\n     * that correspond to the specified geographical location.\n     *\n     * @param {LngLatLike} lnglat The geographical location to project.\n     * @returns {Point} The [`Point`](#Point) corresponding to `lnglat`, relative to the map's `container`.\n     */\n    project: function(lnglat) {\n        return this.transform.locationPoint(LngLat.convert(lnglat));\n    },\n\n    /**\n     * Returns a [`LngLat`](#LngLat) representing geographical coordinates that correspond\n     * to the specified pixel coordinates.\n     *\n     * @param {PointLike} point The pixel coordinates to unproject.\n     * @returns {LngLat} The [`LngLat`](#LngLat) corresponding to `point`.\n     */\n    unproject: function(point) {\n        return this.transform.pointLocation(Point.convert(point));\n    },\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n     * representing visible features that satisfy the query parameters.\n     *\n     * @param {PointLike|Array<PointLike>} [geometry] - The geometry of the query region:\n     * either a single point or southwest and northeast points describing a bounding box.\n     * Omitting this parameter (i.e. calling [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures) with zero arguments,\n     * or with only a `parameters` argument) is equivalent to passing a bounding box encompassing the entire\n     * map viewport.\n     * @param {Object} [parameters]\n     * @param {Array<string>} [parameters.layers] An array of style layer IDs for the query to inspect.\n     *   Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.\n     * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     *   to limit query results.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n     *\n     * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only\n     * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported).\n     *\n     * Each feature includes a top-level `layer` property whose value is an object representing the style layer to\n     * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated\n     * for the given zoom level and feature.\n     *\n     * Only visible features are returned. The topmost rendered feature appears first in the returned array, and\n     * subsequent features are sorted by descending z-order. Features that are rendered multiple times (due to wrapping\n     * across the antimeridian at low zoom levels) are returned only once (though subject to the following caveat).\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and, as a result, features may appear multiple times in query\n     * results when they span multiple tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     *\n     * @example\n     * // Find all features at a point\n     * var features = map.queryRenderedFeatures(\n     *   [20, 35],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a static bounding box\n     * var features = map.queryRenderedFeatures(\n     *   [[10, 20], [30, 50]],\n     *   { layers: ['my-layer-name'] }\n     * );\n     *\n     * @example\n     * // Find all features within a bounding box around a point\n     * var width = 10;\n     * var height = 20;\n     * var features = map.queryRenderedFeatures([\n     *   [point.x - width / 2, point.y - height / 2],\n     *   [point.x + width / 2, point.y + height / 2]\n     * ], { layers: ['my-layer-name'] });\n     *\n     * @example\n     * // Query all rendered features from a single layer\n     * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });\n     */\n    queryRenderedFeatures: function() {\n        var params = {};\n        var geometry;\n\n        if (arguments.length === 2) {\n            geometry = arguments[0];\n            params = arguments[1];\n        } else if (arguments.length === 1 && isPointLike(arguments[0])) {\n            geometry = arguments[0];\n        } else if (arguments.length === 1) {\n            params = arguments[0];\n        }\n\n        return this.style.queryRenderedFeatures(\n            this._makeQueryGeometry(geometry),\n            params,\n            this.transform.zoom,\n            this.transform.angle\n        );\n\n        function isPointLike(input) {\n            return input instanceof Point || Array.isArray(input);\n        }\n    },\n\n    _makeQueryGeometry: function(pointOrBox) {\n        if (pointOrBox === undefined) {\n            // bounds was omitted: use full viewport\n            pointOrBox = [\n                Point.convert([0, 0]),\n                Point.convert([this.transform.width, this.transform.height])\n            ];\n        }\n\n        var queryGeometry;\n        var isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number';\n\n        if (isPoint) {\n            var point = Point.convert(pointOrBox);\n            queryGeometry = [point];\n        } else {\n            var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])];\n            queryGeometry = [\n                box[0],\n                new Point(box[1].x, box[0].y),\n                box[1],\n                new Point(box[0].x, box[1].y),\n                box[0]\n            ];\n        }\n\n        queryGeometry = queryGeometry.map(function(p) {\n            return this.transform.pointCoordinate(p);\n        }.bind(this));\n\n        return queryGeometry;\n    },\n\n    /**\n     * Returns an array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n     * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.\n     *\n     * @param {string} sourceID The ID of the vector tile or GeoJSON source to query.\n     * @param {Object} parameters\n     * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile\n     *   sources, this parameter is required.* For GeoJSON sources, it is ignored.\n     * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n     *   to limit query results.\n     *\n     * @returns {Array<Object>} An array of [GeoJSON](http://geojson.org/)\n     * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n     *\n     * In contrast to [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures), this function\n     * returns all features matching the query parameters,\n     * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded\n     * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently\n     * visible viewport.\n     *\n     * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n     * geometries are clipped at tile boundaries and, as a result, features may appear multiple times in query\n     * results when they span multiple tiles. For example, suppose\n     * there is a highway running through the bounding rectangle of a query. The results of the query will be those\n     * parts of the highway that lie within the map tiles covering the bounding rectangle, even if the highway extends\n     * into other tiles, and the portion of the highway within each map tile will be returned as a separate feature.\n     */\n    querySourceFeatures: function(sourceID, params) {\n        return this.style.querySourceFeatures(sourceID, params);\n    },\n\n    /**\n     * Replaces the map's Mapbox style object with a new value.\n     *\n     * @param {Object|string} style A JSON object conforming to the schema described in the\n     *   [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON.\n     * @returns {Map} `this`\n     */\n    setStyle: function(style) {\n        if (this.style) {\n            this.style\n                .off('load', this._onStyleLoad)\n                .off('error', this._forwardStyleEvent)\n                .off('change', this._onStyleChange)\n                .off('source.add', this._onSourceAdd)\n                .off('source.remove', this._onSourceRemove)\n                .off('source.load', this._onSourceUpdate)\n                .off('source.error', this._forwardSourceEvent)\n                .off('source.change', this._onSourceUpdate)\n                .off('layer.add', this._forwardLayerEvent)\n                .off('layer.remove', this._forwardLayerEvent)\n                .off('layer.error', this._forwardLayerEvent)\n                .off('tile.add', this._forwardTileEvent)\n                .off('tile.remove', this._forwardTileEvent)\n                .off('tile.load', this._update)\n                .off('tile.error', this._forwardTileEvent)\n                .off('tile.stats', this._forwardTileEvent)\n                ._remove();\n\n            this.off('rotate', this.style._redoPlacement);\n            this.off('pitch', this.style._redoPlacement);\n        }\n\n        if (!style) {\n            this.style = null;\n            return this;\n        } else if (style instanceof Style) {\n            this.style = style;\n        } else {\n            this.style = new Style(style, this.animationLoop);\n        }\n\n        this.style\n            .on('load', this._onStyleLoad)\n            .on('error', this._forwardStyleEvent)\n            .on('change', this._onStyleChange)\n            .on('source.add', this._onSourceAdd)\n            .on('source.remove', this._onSourceRemove)\n            .on('source.load', this._onSourceUpdate)\n            .on('source.error', this._forwardSourceEvent)\n            .on('source.change', this._onSourceUpdate)\n            .on('layer.add', this._forwardLayerEvent)\n            .on('layer.remove', this._forwardLayerEvent)\n            .on('layer.error', this._forwardLayerEvent)\n            .on('tile.add', this._forwardTileEvent)\n            .on('tile.remove', this._forwardTileEvent)\n            .on('tile.load', this._update)\n            .on('tile.error', this._forwardTileEvent)\n            .on('tile.stats', this._forwardTileEvent);\n\n        this.on('rotate', this.style._redoPlacement);\n        this.on('pitch', this.style._redoPlacement);\n\n        return this;\n    },\n\n    /**\n     * Returns the map's Mapbox style object, which can be used to recreate the map's style.\n     *\n     * @returns {Object} The map's style object.\n     */\n    getStyle: function() {\n        if (this.style) {\n            return this.style.serialize();\n        }\n    },\n\n    /**\n     * Adds a source to the map's style.\n     *\n     * @param {string} id The ID of the source to add. Must not conflict with existing sources.\n     * @param {Object} source The source object, conforming to the\n     * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources).\n     * @param {string} source.type The source type, which must be either one of the core Mapbox GL source types defined in the style specification or a custom type that has been added to the map with {@link Map#addSourceType}.\n     * @fires source.add\n     * @returns {Map} `this`\n     */\n    addSource: function(id, source) {\n        this.style.addSource(id, source);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Adds a [custom source type](#Custom Sources), making it available for use with\n     * {@link Map#addSource}.\n     * @private\n     * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.\n     * @param {Function} SourceType A {@link Source} constructor.\n     * @param {Function} callback Called when the source type is ready or with an error argument if there is an error.\n     */\n    addSourceType: function (name, SourceType, callback) {\n        return this.style.addSourceType(name, SourceType, callback);\n    },\n\n    /**\n     * Removes a source from the map's style.\n     *\n     * @param {string} id The ID of the source to remove.\n     * @fires source.remove\n     * @returns {Map} `this`\n     */\n    removeSource: function(id) {\n        this.style.removeSource(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the source with the specified ID in the map's style.\n     *\n     * @param {string} id The ID of the source to get.\n     * @returns {?Object} The style source with the specified ID, or `undefined`\n     *   if the ID corresponds to no existing sources.\n     */\n    getSource: function(id) {\n        return this.style.getSource(id);\n    },\n\n    /**\n     * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers)\n     * to the map's style.\n     *\n     * A layer defines styling for data from a specified source.\n     *\n     * @param {Object} layer The style layer to add, conforming to the Mapbox Style Specification's\n     *   [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers).\n     * @param {string} [before] The ID of an existing layer to insert the new layer before.\n     *   If this argument is omitted, the layer will be appended to the end of the layers array.\n     * @fires layer.add\n     * @returns {Map} `this`\n     */\n    addLayer: function(layer, before) {\n        this.style.addLayer(layer, before);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Removes a layer from the map's style.\n     *\n     * Also removes any layers which refer to the specified layer via a\n     * [`ref` property](https://www.mapbox.com/mapbox-gl-style-spec/#layer-ref).\n     *\n     * @param {string} id The ID of the layer to remove.\n     * @throws {Error} if no layer with the specified `id` exists.\n     * @fires layer.remove\n     * @returns {Map} `this`\n     */\n    removeLayer: function(id) {\n        this.style.removeLayer(id);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the layer with the specified ID in the map's style.\n     *\n     * @param {string} id The ID of the layer to get.\n     * @returns {?Object} The layer with the specified ID, or `undefined`\n     *   if the ID corresponds to no existing layers.\n     */\n    getLayer: function(id) {\n        return this.style.getLayer(id);\n    },\n\n    /**\n     * Sets the filter for the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to which the filter will be applied.\n     * @param {Array} filter The filter, conforming to the Mapbox Style Specification's\n     *   [filter definition](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n     * @returns {Map} `this`\n     * @example\n     * map.setFilter('my-layer', ['==', 'name', 'USA']);\n     */\n    setFilter: function(layer, filter) {\n        this.style.setFilter(layer, filter);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Sets the zoom extent for the specified style layer.\n     *\n     * @param {string} layerId The ID of the layer to which the zoom extent will be applied.\n     * @param {number} minzoom The minimum zoom to set (0-20).\n     * @param {number} maxzoom The maximum zoom to set (0-20).\n     * @returns {Map} `this`\n     * @example\n     * map.setLayerZoomRange('my-layer', 2, 5);\n     */\n    setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n        this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the filter applied to the specified style layer.\n     *\n     * @param {string} layer The ID of the style layer whose filter to get.\n     * @returns {Array} The layer's filter.\n     */\n    getFilter: function(layer) {\n        return this.style.getFilter(layer);\n    },\n\n    /**\n     * Sets the value of a paint property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to set the paint property in.\n     * @param {string} name The name of the paint property to set.\n     * @param {*} value The value of the paint propery to set.\n     *   Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @param {string=} klass A style class specifier for the paint property.\n     * @returns {Map} `this`\n     * @example\n     * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n     */\n    setPaintProperty: function(layer, name, value, klass) {\n        this.style.setPaintProperty(layer, name, value, klass);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the value of a paint property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to get the paint property from.\n     * @param {string} name The name of a paint property to get.\n     * @param {string=} klass A class specifier for the paint property.\n     * @returns {*} The value of the specified paint property.\n     */\n    getPaintProperty: function(layer, name, klass) {\n        return this.style.getPaintProperty(layer, name, klass);\n    },\n\n    /**\n     * Sets the value of a layout property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to set the layout property in.\n     * @param {string} name The name of the layout property to set.\n     * @param {*} value The value of the layout propery. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n     * @returns {Map} `this`\n     * @example\n     * map.setLayoutProperty('my-layer', 'visibility', 'none');\n     */\n    setLayoutProperty: function(layer, name, value) {\n        this.style.setLayoutProperty(layer, name, value);\n        this._update(true);\n        return this;\n    },\n\n    /**\n     * Returns the value of a layout property in the specified style layer.\n     *\n     * @param {string} layer The ID of the layer to get the layout property from.\n     * @param {string} name The name of the layout property to get.\n     * @returns {*} The value of the specified layout property.\n     */\n    getLayoutProperty: function(layer, name) {\n        return this.style.getLayoutProperty(layer, name);\n    },\n\n    /**\n     * Returns the map's containing HTML element.\n     *\n     * @returns {HTMLElement} The map's container.\n     */\n    getContainer: function() {\n        return this._container;\n    },\n\n    /**\n     * Returns the HTML element containing the map's `<canvas>` element.\n     *\n     * If you want to add non-GL overlays to the map, you should append them to this element.\n     *\n     * This is the element to which event bindings for map interactivity (such as panning and zooming) are\n     * attached. It will receive bubbled events from child elements such as the `<canvas>`, but not from\n     * map controls.\n     *\n     * @returns {HTMLElement} The container of the map's `<canvas>`.\n     */\n    getCanvasContainer: function() {\n        return this._canvasContainer;\n    },\n\n    /**\n     * Returns the map's `<canvas>` element.\n     *\n     * @returns {HTMLCanvasElement} The map's `<canvas>` element.\n     */\n    getCanvas: function() {\n        return this._canvas.getElement();\n    },\n\n    _setupContainer: function() {\n        var container = this._container;\n        container.classList.add('mapboxgl-map');\n\n        var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n        if (this._interactive) {\n            canvasContainer.classList.add('mapboxgl-interactive');\n        }\n        this._canvas = new Canvas(this, canvasContainer);\n\n        var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n        var corners = this._controlCorners = {};\n        ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) {\n            corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer);\n        });\n    },\n\n    _setupPainter: function() {\n        var gl = this._canvas.getWebGLContext({\n            failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n            preserveDrawingBuffer: this._preserveDrawingBuffer\n        });\n\n        if (!gl) {\n            this.fire('error', { error: new Error('Failed to initialize WebGL') });\n            return;\n        }\n\n        this.painter = new Painter(gl, this.transform);\n    },\n\n    /**\n     * Fired when the WebGL context is lost.\n     *\n     * @event webglcontextlost\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {WebGLContextEvent} originalEvent The original DOM event.\n     */\n    _contextLost: function(event) {\n        event.preventDefault();\n        if (this._frameId) {\n            browser.cancelFrame(this._frameId);\n        }\n        this.fire('webglcontextlost', {originalEvent: event});\n    },\n\n    /**\n     * Fired when the WebGL context is restored.\n     *\n     * @event webglcontextrestored\n     * @memberof Map\n     * @instance\n     * @type {Object}\n     * @property {WebGLContextEvent} originalEvent The original DOM event.\n     */\n    _contextRestored: function(event) {\n        this._setupPainter();\n        this.resize();\n        this._update();\n        this.fire('webglcontextrestored', {originalEvent: event});\n    },\n\n    /**\n     * Returns a Boolean indicating whether the map is fully loaded.\n     *\n     * Returns `false` if the style is not yet fully loaded,\n     * or if there has been a change to the sources or style that\n     * has not yet fully loaded.\n     *\n     * @returns {boolean} A Boolean indicating whether the map is fully loaded.\n     */\n    loaded: function() {\n        if (this._styleDirty || this._sourcesDirty)\n            return false;\n        if (!this.style || !this.style.loaded())\n            return false;\n        return true;\n    },\n\n    /**\n     * Update this map's style and sources, and re-render the map.\n     *\n     * @param {boolean} updateStyle mark the map's style for reprocessing as\n     * well as its sources\n     * @returns {Map} this\n     * @private\n     */\n    _update: function(updateStyle) {\n        if (!this.style) return this;\n\n        this._styleDirty = this._styleDirty || updateStyle;\n        this._sourcesDirty = true;\n\n        this._rerender();\n\n        return this;\n    },\n\n    /**\n     * Call when a (re-)render of the map is required, e.g. when the\n     * user panned or zoomed,f or new data is available.\n     * @returns {Map} this\n     * @private\n     */\n    _render: function() {\n        try {\n            if (this.style && this._styleDirty) {\n                this._styleDirty = false;\n                this.style.update(this._classes, this._classOptions);\n                this._classOptions = null;\n                this.style._recalculate(this.transform.zoom);\n            }\n\n            if (this.style && this._sourcesDirty) {\n                this._sourcesDirty = false;\n                this.style._updateSources(this.transform);\n            }\n\n            this.painter.render(this.style, {\n                debug: this.showTileBoundaries,\n                showOverdrawInspector: this._showOverdrawInspector,\n                vertices: this.vertices,\n                rotating: this.rotating,\n                zooming: this.zooming\n            });\n\n            this.fire('render');\n\n            if (this.loaded() && !this._loaded) {\n                this._loaded = true;\n                this.fire('load');\n            }\n\n            this._frameId = null;\n\n            if (!this.animationLoop.stopped()) {\n                this._styleDirty = true;\n            }\n\n            if (this._sourcesDirty || this._repaint || this._styleDirty) {\n                this._rerender();\n            }\n\n        } catch (error) {\n            this.fire('error', {error: error});\n        }\n\n        return this;\n    },\n\n    /**\n     * Destroys the map's underlying resources, including web workers and DOM elements.\n     *\n     * After calling this method, you must not call any other methods on the map.\n     */\n    remove: function() {\n        if (this._hash) this._hash.remove();\n        browser.cancelFrame(this._frameId);\n        this.setStyle(null);\n        if (typeof window !== 'undefined') {\n            window.removeEventListener('resize', this._onWindowResize, false);\n        }\n        var extension = this.painter.gl.getExtension('WEBGL_lose_context');\n        if (extension) extension.loseContext();\n        removeNode(this._canvasContainer);\n        removeNode(this._controlContainer);\n        this._container.classList.remove('mapboxgl-map');\n    },\n\n    _rerender: function() {\n        if (this.style && !this._frameId) {\n            this._frameId = browser.frame(this._render);\n        }\n    },\n\n    _forwardStyleEvent: function(e) {\n        this.fire('style.' + e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardSourceEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardLayerEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _forwardTileEvent: function(e) {\n        this.fire(e.type, util.extend({style: e.target}, e));\n    },\n\n    _onStyleLoad: function(e) {\n        if (this.transform.unmodified) {\n            this.jumpTo(this.style.stylesheet);\n        }\n        this.style.update(this._classes, {transition: false});\n        this._forwardStyleEvent(e);\n    },\n\n    _onStyleChange: function(e) {\n        this._update(true);\n        this._forwardStyleEvent(e);\n    },\n\n    _onSourceAdd: function(e) {\n        var source = e.source;\n        if (source.onAdd)\n            source.onAdd(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceRemove: function(e) {\n        var source = e.source;\n        if (source.onRemove)\n            source.onRemove(this);\n        this._forwardSourceEvent(e);\n    },\n\n    _onSourceUpdate: function(e) {\n        this._update();\n        this._forwardSourceEvent(e);\n    },\n\n    _onWindowOnline: function() {\n        this._update();\n    },\n\n    _onWindowResize: function() {\n        if (this._trackResize) {\n            this.stop().resize()._update();\n        }\n    }\n});\n\nutil.extendAll(Map.prototype, /** @lends Map.prototype */{\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render an outline\n     * around each tile. These tile boundaries are useful for debugging.\n     *\n     * @name showTileBoundaries\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showTileBoundaries: false,\n    get showTileBoundaries() { return this._showTileBoundaries; },\n    set showTileBoundaries(value) {\n        if (this._showTileBoundaries === value) return;\n        this._showTileBoundaries = value;\n        this._update();\n    },\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will render boxes\n     * around all symbols in the data source, revealing which symbols\n     * were rendered or which were hidden due to collisions.\n     * This information is useful for debugging.\n     *\n     * @name showCollisionBoxes\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showCollisionBoxes: false,\n    get showCollisionBoxes() { return this._showCollisionBoxes; },\n    set showCollisionBoxes(value) {\n        if (this._showCollisionBoxes === value) return;\n        this._showCollisionBoxes = value;\n        this.style._redoPlacement();\n    },\n\n    /*\n     * Gets and sets a Boolean indicating whether the map should color-code\n     * each fragment to show how many times it has been shaded.\n     * White fragments have been shaded 8 or more times.\n     * Black fragments have been shaded 0 times.\n     * This information is useful for debugging.\n     *\n     * @name showOverdraw\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _showOverdrawInspector: false,\n    get showOverdrawInspector() { return this._showOverdrawInspector; },\n    set showOverdrawInspector(value) {\n        if (this._showOverdrawInspector === value) return;\n        this._showOverdrawInspector = value;\n        this._update();\n    },\n\n    /**\n     * Gets and sets a Boolean indicating whether the map will\n     * continuously repaint. This information is useful for analyzing performance.\n     *\n     * @name repaint\n     * @type {boolean}\n     * @instance\n     * @memberof Map\n     */\n    _repaint: false,\n    get repaint() { return this._repaint; },\n    set repaint(value) { this._repaint = value; this._update(); },\n\n    // show vertices\n    _vertices: false,\n    get vertices() { return this._vertices; },\n    set vertices(value) { this._vertices = value; this._update(); }\n});\n\nfunction removeNode(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\n\n/**\n * A [`LngLat`](#LngLat) object or an array of two numbers representing longitude and latitude.\n *\n * @typedef {(LngLat | Array<number>)} LngLatLike\n * @example\n * var v1 = new mapboxgl.LngLat(-122.420679, 37.772537);\n * var v2 = [-122.420679, 37.772537];\n */\n\n/**\n * A [`LngLatBounds`](#LngLatBounds) object or an array of [`LngLatLike`](#LngLatLike) objects.\n *\n * @typedef {(LngLatBounds | Array<LngLatLike>)} LngLatBoundsLike\n * @example\n * var v1 = new mapboxgl.LngLatBounds(\n *   new mapboxgl.LngLat(-73.9876, 40.7661),\n *   new mapboxgl.LngLat(-73.9397, 40.8002)\n * );\n * var v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002])\n * var v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n */\n\n/**\n * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has\n * `x` and `y` properties representing coordinates.\n *\n * @typedef {Object} Point\n */\n\n/**\n * A [`Point`](#Point) or an array of two numbers representing `x` and `y` coordinates.\n *\n * @typedef {(Point | Array<number>)} PointLike\n */\n\n/**\n * Options common to {@link Map#addClass}, {@link Map#removeClass},\n * and {@link Map#setClasses}, controlling\n * whether or not to smoothly transition property changes triggered by a class change.\n *\n * @typedef {Object} StyleOptions\n * @property {boolean} transition If `true`, property changes will smootly transition.\n */\n\n/**\n * Fired whenever the map is drawn to the screen, as the result of\n *\n * - a change to the map's position, zoom, pitch, or bearing\n * - a change to the map's style\n * - a change to a GeoJSON source\n * - the loading of a vector tile, GeoJSON file, glyph, or sprite\n *\n * @event render\n * @memberof Map\n * @instance\n */\n\n/**\n * Fired when a point device (usually a mouse) leaves the map's canvas.\n *\n * @event mouseout\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed within the map.\n *\n * @event mousedown\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is released within the map.\n *\n * @event mouseup\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is moved within the map.\n *\n * @event mousemove\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a touch point is placed on the map.\n *\n * @event touchstart\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is removed from the map.\n *\n * @event touchend\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is moved within the map.\n *\n * @event touchmove\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point has been disrupted.\n *\n * @event touchcancel\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed and released at the same point on the map.\n *\n * @event click\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is clicked twice at the same point on the map.\n *\n * @event dblclick\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when the right button of the mouse is clicked or the context menu key is pressed within the map.\n *\n * @event contextmenu\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired immediately after all necessary resources have been downloaded\n * and the first visually complete rendering of the map has occurred.\n *\n * @event load\n * @memberof Map\n * @instance\n * @type {Object}\n */\n\n/**\n * Fired just before the map begins a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event movestart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one view to\n * another, as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event move\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired just after the map completes a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event moveend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n /**\n  * Fired if any error occurs. This is GL JS's primary error reporting\n  * mechanism. We use an event instead of `throw` to better accommodate\n  * asyncronous operations. If no listeners are bound to the `error` event, the\n  * error will be printed to the console.\n  *\n  * @event error\n  * @memberof Map\n  * @instance\n  * @property {{error: {message: string}}} data\n  */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/map.js\n// module id = 1339\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util');\nvar isSupported = require('mapbox-gl-supported');\n\nmodule.exports = Canvas;\n\nfunction Canvas(parent, container) {\n    this.canvas = document.createElement('canvas');\n\n    if (parent && container) {\n        this.canvas.style.position = 'absolute';\n        this.canvas.classList.add('mapboxgl-canvas');\n        this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false);\n        this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false);\n        this.canvas.setAttribute('tabindex', 0);\n        container.appendChild(this.canvas);\n    }\n}\n\nCanvas.prototype.resize = function(width, height) {\n    var pixelRatio = window.devicePixelRatio || 1;\n\n    // Request the required canvas size taking the pixelratio into account.\n    this.canvas.width = pixelRatio * width;\n    this.canvas.height = pixelRatio * height;\n\n    // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n    this.canvas.style.width = width + 'px';\n    this.canvas.style.height = height + 'px';\n};\n\nCanvas.prototype.getWebGLContext = function(attributes) {\n    attributes = util.extend({}, attributes, isSupported.webGLContextAttributes);\n\n    return this.canvas.getContext('webgl', attributes) ||\n        this.canvas.getContext('experimental-webgl', attributes);\n};\n\nCanvas.prototype.getElement = function() {\n    return this.canvas;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/browser/canvas.js\n// module id = 1340\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\n\nmodule.exports = StyleTransition;\n\n/*\n * Represents a transition between two declarations\n */\nfunction StyleTransition(reference, declaration, oldTransition, value) {\n\n    this.declaration = declaration;\n    this.startTime = this.endTime = (new Date()).getTime();\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.interp = interpZoomTransitioned;\n    } else {\n        this.interp = interpolate[reference.type];\n    }\n\n    this.oldTransition = oldTransition;\n    this.duration = value.duration || 0;\n    this.delay = value.delay || 0;\n\n    if (!this.instant()) {\n        this.endTime = this.startTime + this.duration + this.delay;\n        this.ease = util.easeCubicInOut;\n    }\n\n    if (oldTransition && oldTransition.endTime <= this.startTime) {\n        // Old transition is done running, so we can\n        // delete its reference to its old transition.\n\n        delete oldTransition.oldTransition;\n    }\n}\n\nStyleTransition.prototype.instant = function() {\n    return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n};\n\n/*\n * Return the value of the transitioning property at zoom level `z` and optional time `t`\n */\nStyleTransition.prototype.calculate = function(globalProperties, featureProperties) {\n    var value = this.declaration.calculate(\n        util.extend({}, globalProperties, {duration: this.duration}),\n        featureProperties\n    );\n\n    if (this.instant()) return value;\n\n    var t = globalProperties.time || Date.now();\n\n    if (t < this.endTime) {\n        var oldValue = this.oldTransition.calculate(\n            util.extend({}, globalProperties, {time: this.startTime}),\n            featureProperties\n        );\n        var eased = this.ease((t - this.startTime - this.delay) / this.duration);\n        value = this.interp(oldValue, value, eased);\n    }\n\n    return value;\n\n};\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction interpZoomTransitioned(from, to, t) {\n    if ((from && from.to) === undefined || (to && to.to) === undefined) {\n        return undefined;\n    } else {\n        return {\n            from: from.to,\n            fromScale: from.toScale,\n            to: to.to,\n            toScale: to.toScale,\n            t: t\n        };\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_transition.js\n// module id = 1341\n// module chunks = 0 1","'use strict';\n\nvar MapboxGLFunction = require('./style_function');\nvar parseColor = require('./parse_color');\nvar util = require('../util/util');\n\nmodule.exports = StyleDeclaration;\n\nfunction StyleDeclaration(reference, value) {\n    this.value = util.clone(value);\n    this.isFunction = MapboxGLFunction.isFunctionDefinition(value);\n\n    // immutable representation of value. used for comparison\n    this.json = JSON.stringify(this.value);\n\n    var parsedValue = reference.type === 'color' && this.value ? parseColor(this.value) : value;\n    this.calculate = MapboxGLFunction[reference.function || 'piecewise-constant'](parsedValue);\n    this.isFeatureConstant = this.calculate.isFeatureConstant;\n    this.isZoomConstant = this.calculate.isZoomConstant;\n\n    if (reference.function === 'piecewise-constant' && reference.transition) {\n        this.calculate = transitioned(this.calculate);\n    }\n\n    if (!this.isFeatureConstant && !this.isZoomConstant) {\n        this.stopZoomLevels = [];\n        var interpolationAmountStops = [];\n        var stops = this.value.stops;\n        for (var i = 0; i < this.value.stops.length; i++) {\n            var zoom = stops[i][0].zoom;\n            if (this.stopZoomLevels.indexOf(zoom) < 0) {\n                this.stopZoomLevels.push(zoom);\n                interpolationAmountStops.push([zoom, interpolationAmountStops.length]);\n            }\n        }\n\n        this.calculateInterpolationT = MapboxGLFunction.interpolated({\n            stops: interpolationAmountStops,\n            base: value.base\n        });\n    }\n}\n\n// This function is used to smoothly transition between discrete values, such\n// as images and dasharrays.\nfunction transitioned(calculate) {\n    return function(globalProperties, featureProperties) {\n        var z = globalProperties.zoom;\n        var zh = globalProperties.zoomHistory;\n        var duration = globalProperties.duration;\n\n        var fraction = z % 1;\n        var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1);\n        var fromScale = 1;\n        var toScale = 1;\n        var mix, from, to;\n\n        if (z > zh.lastIntegerZoom) {\n            mix = fraction + (1 - fraction) * t;\n            fromScale *= 2;\n            from = calculate({zoom: z - 1}, featureProperties);\n            to = calculate({zoom: z}, featureProperties);\n        } else {\n            mix = 1 - (1 - t) * fraction;\n            to = calculate({zoom: z}, featureProperties);\n            from = calculate({zoom: z + 1}, featureProperties);\n            fromScale /= 2;\n        }\n\n        if (from === undefined || to === undefined) {\n            return undefined;\n        } else {\n            return {\n                from: from,\n                fromScale: fromScale,\n                to: to,\n                toScale: toScale,\n                t: mix\n            };\n        }\n    };\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_declaration.js\n// module id = 1342\n// module chunks = 0 1","module.exports = {\"$version\":8,\"$root\":{\"version\":{\"required\":true,\"type\":\"enum\",\"values\":[8]},\"name\":{\"type\":\"string\"},\"metadata\":{\"type\":\"*\"},\"center\":{\"type\":\"array\",\"value\":\"number\"},\"zoom\":{\"type\":\"number\"},\"bearing\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\"},\"pitch\":{\"type\":\"number\",\"default\":0,\"units\":\"degrees\"},\"sources\":{\"required\":true,\"type\":\"sources\"},\"sprite\":{\"type\":\"string\"},\"glyphs\":{\"type\":\"string\"},\"transition\":{\"type\":\"transition\"},\"layers\":{\"required\":true,\"type\":\"array\",\"value\":\"layer\"}},\"sources\":{\"*\":{\"type\":\"source\"}},\"source\":[\"source_tile\",\"source_geojson\",\"source_video\",\"source_image\"],\"source_tile\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"vector\",\"raster\"]},\"url\":{\"type\":\"string\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\"},\"minzoom\":{\"type\":\"number\",\"default\":0},\"maxzoom\":{\"type\":\"number\",\"default\":22},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\"},\"*\":{\"type\":\"*\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"geojson\"]},\"data\":{\"type\":\"*\"},\"maxzoom\":{\"type\":\"number\",\"default\":14},\"buffer\":{\"type\":\"number\",\"default\":64},\"tolerance\":{\"type\":\"number\",\"default\":3},\"cluster\":{\"type\":\"boolean\",\"default\":false},\"clusterRadius\":{\"type\":\"number\",\"default\":400},\"clusterMaxZoom\":{\"type\":\"number\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"video\"]},\"urls\":{\"required\":true,\"type\":\"array\",\"value\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"source_image\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"image\"]},\"url\":{\"required\":true,\"type\":\"string\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"required\":true},\"type\":{\"type\":\"enum\",\"values\":[\"fill\",\"line\",\"symbol\",\"circle\",\"raster\",\"background\"]},\"metadata\":{\"type\":\"*\"},\"ref\":{\"type\":\"string\"},\"source\":{\"type\":\"string\"},\"source-layer\":{\"type\":\"string\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22},\"interactive\":{\"type\":\"boolean\",\"default\":false},\"filter\":{\"type\":\"filter\"},\"layout\":{\"type\":\"layout\"},\"paint\":{\"type\":\"paint\"},\"paint.*\":{\"type\":\"paint\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_circle\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_circle\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"butt\",\"round\",\"square\"],\"default\":\"butt\"},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"bevel\",\"round\",\"miter\"],\"default\":\"miter\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[{\"line-join\":\"miter\"}]},\"line-round-limit\":{\"type\":\"number\",\"default\":1.05,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[{\"line-join\":\"round\"}]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"point\",\"line\"],\"default\":\"point\"},\"symbol-spacing\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"pixels\",\"requires\":[{\"symbol-placement\":\"line\"}]},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\"]},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\",\"text-field\"]},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"requires\":[\"icon-image\"]},\"icon-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"icon-text-fit\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":false,\"values\":[\"none\",\"both\",\"width\",\"height\"],\"default\":\"none\",\"requires\":[\"icon-image\",\"text-field\"]},\"icon-text-fit-padding\":{\"type\":\"array\",\"value\":\"number\",\"length\":4,\"default\":[0,0,0,0],\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\",\"icon-text-fit\",\"text-field\"]},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"tokens\":true},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"degrees\",\"requires\":[\"icon-image\"]},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"icon-image\"]},\"text-pitch-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"requires\":[\"text-field\"]},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"requires\":[\"text-field\"]},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":\"\",\"tokens\":true},\"text-font\":{\"type\":\"array\",\"value\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":[\"Open Sans Regular\",\"Arial Unicode MS Regular\"],\"requires\":[\"text-field\"]},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-max-width\":{\"type\":\"number\",\"default\":10,\"minimum\":0,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"em\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"left\",\"center\",\"right\"],\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"center\",\"left\",\"right\",\"top\",\"bottom\",\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"default\":\"center\",\"requires\":[\"text-field\"]},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}]},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"requires\":[\"text-field\"]},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":true,\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"},{\"symbol-placement\":\"line\"}]},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"none\",\"uppercase\",\"lowercase\"],\"default\":\"none\",\"requires\":[\"text-field\"]},\"text-offset\":{\"type\":\"array\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"]},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\"]},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":false,\"requires\":[\"text-field\",\"icon-image\"]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":[\"visible\",\"none\"],\"default\":\"visible\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_operator\":{\"type\":\"enum\",\"values\":[\"==\",\"!=\",\">\",\">=\",\"<\",\"<=\",\"in\",\"!in\",\"all\",\"any\",\"none\",\"has\",\"!has\"]},\"geometry_type\":{\"type\":\"enum\",\"values\":[\"Point\",\"LineString\",\"Polygon\"]},\"color_operation\":{\"type\":\"enum\",\"values\":[\"lighten\",\"saturate\",\"spin\",\"fade\",\"mix\"]},\"function\":{\"stops\":{\"type\":\"array\",\"required\":true,\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":[\"exponential\",\"interval\",\"categorical\"],\"default\":\"exponential\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"default\":true},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}]},\"fill-outline-color\":{\"type\":\"color\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}]},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"circle-translate\"]},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\"}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"property-function\":true,\"values\":[\"map\",\"viewport\"],\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}]},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/reference/v8.min.json\n// module id = 1343\n// module chunks = 0 1","'use strict';\n\nvar validateConstants = require('./validate/validate_constants');\nvar validate = require('./validate/validate');\nvar latestStyleSpec = require('../reference/latest.min');\nvar validateGlyphsURL = require('./validate/validate_glyphs_url');\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n *     If omitted, the latest style spec is used.\n * @returns {Array<ValidationError>}\n * @example\n *   var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n *   var errors = validate(style);\n */\nfunction validateStyleMin(style, styleSpec) {\n    styleSpec = styleSpec || latestStyleSpec;\n\n    var errors = [];\n\n    errors = errors.concat(validate({\n        key: '',\n        value: style,\n        valueSpec: styleSpec.$root,\n        styleSpec: styleSpec,\n        style: style,\n        objectElementValidators: {\n            glyphs: validateGlyphsURL\n        }\n    }));\n\n    if (styleSpec.$version > 7 && style.constants) {\n        errors = errors.concat(validateConstants({\n            key: 'constants',\n            value: style.constants,\n            style: style,\n            styleSpec: styleSpec\n        }));\n    }\n\n    return sortErrors(errors);\n}\n\nvalidateStyleMin.source = wrapCleanErrors(require('./validate/validate_source'));\nvalidateStyleMin.layer = wrapCleanErrors(require('./validate/validate_layer'));\nvalidateStyleMin.filter = wrapCleanErrors(require('./validate/validate_filter'));\nvalidateStyleMin.paintProperty = wrapCleanErrors(require('./validate/validate_paint_property'));\nvalidateStyleMin.layoutProperty = wrapCleanErrors(require('./validate/validate_layout_property'));\n\nfunction sortErrors(errors) {\n    return [].concat(errors).sort(function (a, b) {\n        return a.line - b.line;\n    });\n}\n\nfunction wrapCleanErrors(inner) {\n    return function() {\n        return sortErrors(inner.apply(this, arguments));\n    };\n}\n\nmodule.exports = validateStyleMin;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate_style.min.js\n// module id = 1344\n// module chunks = 0 1","'use strict';\n\nvar getType = require('../util/get_type');\nvar ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateBoolean(options) {\n    var value = options.value;\n    var key = options.key;\n    var type = getType(value);\n\n    if (type !== 'boolean') {\n        return [new ValidationError(key, value, 'boolean expected, %s found', type)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_boolean.js\n// module id = 1345\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar getType = require('../util/get_type');\nvar parseCSSColor = require('csscolorparser').parseCSSColor;\n\nmodule.exports = function validateColor(options) {\n    var key = options.key;\n    var value = options.value;\n    var type = getType(value);\n\n    if (type !== 'string') {\n        return [new ValidationError(key, value, 'color expected, %s found', type)];\n    }\n\n    if (parseCSSColor(value) === null) {\n        return [new ValidationError(key, value, 'color expected, \"%s\" found', value)];\n    }\n\n    return [];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_color.js\n// module id = 1346\n// module chunks = 0 1","'use strict';\n\nvar ValidationError = require('../error/validation_error');\nvar validateString = require('./validate_string');\n\nmodule.exports = function(options) {\n    var value = options.value;\n    var key = options.key;\n\n    var errors = validateString(options);\n    if (errors.length) return errors;\n\n    if (value.indexOf('{fontstack}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n    }\n\n    if (value.indexOf('{range}') === -1) {\n        errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n    }\n\n    return errors;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-style-spec/lib/validate/validate_glyphs_url.js\n// module id = 1347\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction BackgroundStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = BackgroundStyleLayer;\n\nBackgroundStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/background_style_layer.js\n// module id = 1348\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction CircleStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = CircleStyleLayer;\n\nCircleStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/circle_style_layer.js\n// module id = 1349\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction FillStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nFillStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValue.call(this, 'fill-color', globalProperties, featureProperties);\n        } else {\n            return StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties);\n        }\n    },\n\n    getPaintValueStopZoomLevels: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, arguments);\n        }\n    },\n\n    getPaintInterpolationT: function(name, zoom) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, 'fill-color', zoom);\n        } else {\n            return StyleLayer.prototype.getPaintInterpolationT.call(this, name, zoom);\n        }\n    },\n\n    isPaintValueFeatureConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, name);\n        }\n    },\n\n    isPaintValueZoomConstant: function(name) {\n        if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, 'fill-color');\n        } else {\n            return StyleLayer.prototype.isPaintValueZoomConstant.call(this, name);\n        }\n    },\n\n    isHidden: function(zoom) {\n        if (this.minzoom && zoom < this.minzoom) return true;\n        if (this.maxzoom && zoom >= this.maxzoom) return true;\n        if (this.layout['visibility'] === 'none') return true;\n\n        var isFillHidden = (\n            (this.isPaintValueFeatureConstant('fill-opacity') && this.paint['fill-opacity'] === 0) ||\n            (this.isPaintValueFeatureConstant('fill-color') && this.paint['fill-color'][3] === 0)\n        );\n\n        var isOutlineHidden = (\n            this.isPaintValueFeatureConstant('fill-outline-color') &&\n            this.paint['fill-outline-color'][3] === 0\n        );\n\n        return isFillHidden && isOutlineHidden;\n    }\n\n});\n\nmodule.exports = FillStyleLayer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/fill_style_layer.js\n// module id = 1350\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction LineStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = LineStyleLayer;\n\nLineStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    getPaintValue: function(name, globalProperties, featureProperties) {\n        var value = StyleLayer.prototype.getPaintValue.apply(this, arguments);\n\n        // If the line is dashed, scale the dash lengths by the line\n        // width at the previous round zoom level.\n        if (value && name === 'line-dasharray') {\n            var flooredZoom = Math.floor(globalProperties.zoom);\n            if (this._flooredZoom !== flooredZoom) {\n                this._flooredZoom = flooredZoom;\n                this._flooredLineWidth = this.getPaintValue('line-width', globalProperties, featureProperties);\n            }\n\n            value.fromScale *= this._flooredLineWidth;\n            value.toScale *= this._flooredLineWidth;\n        }\n\n        return value;\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/line_style_layer.js\n// module id = 1351\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction RasterStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = RasterStyleLayer;\n\nRasterStyleLayer.prototype = util.inherit(StyleLayer, {});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/raster_style_layer.js\n// module id = 1352\n// module chunks = 0 1","'use strict';\n\nvar util = require('../../util/util');\nvar StyleLayer = require('../style_layer');\n\nfunction SymbolStyleLayer() {\n    StyleLayer.apply(this, arguments);\n}\n\nmodule.exports = SymbolStyleLayer;\n\nSymbolStyleLayer.prototype = util.inherit(StyleLayer, {\n\n    isHidden: function() {\n        if (StyleLayer.prototype.isHidden.apply(this, arguments)) return true;\n\n        var isTextHidden = this.paint['text-opacity'] === 0 || !this.layout['text-field'];\n        var isIconHidden = this.paint['icon-opacity'] === 0 || !this.layout['icon-image'];\n        if (isTextHidden && isIconHidden) return true;\n\n        return false;\n    },\n\n    getLayoutValue: function(name, globalProperties, featureProperties) {\n        if (name === 'text-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('text-rotation-alignment')) {\n            return 'map';\n        } else if (name === 'icon-rotation-alignment' &&\n                this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' &&\n                !this.getLayoutProperty('icon-rotation-alignment')) {\n            return 'map';\n        // If unspecified `text-pitch-alignment` inherits `text-rotation-alignment`\n        } else if (name === 'text-pitch-alignment' && !this.getLayoutProperty('text-pitch-alignment')) {\n            return this.getLayoutValue('text-rotation-alignment');\n        } else {\n            return StyleLayer.prototype.getLayoutValue.apply(this, arguments);\n        }\n    }\n\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/style_layer/symbol_style_layer.js\n// module id = 1353\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\nvar normalizeURL = require('../util/mapbox').normalizeSpriteURL;\n\nmodule.exports = ImageSprite;\n\nfunction ImageSprite(base) {\n    this.base = base;\n    this.retina = browser.devicePixelRatio > 1;\n\n    var format = this.retina ? '@2x' : '';\n\n    ajax.getJSON(normalizeURL(base, format, '.json'), function(err, data) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        this.data = data;\n        if (this.img) this.fire('load');\n    }.bind(this));\n\n    ajax.getImage(normalizeURL(base, format, '.png'), function(err, img) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n\n        // premultiply the sprite\n        var data = img.getData();\n        var newdata = img.data = new Uint8Array(data.length);\n        for (var i = 0; i < data.length; i += 4) {\n            var alpha = data[i + 3] / 255;\n            newdata[i + 0] = data[i + 0] * alpha;\n            newdata[i + 1] = data[i + 1] * alpha;\n            newdata[i + 2] = data[i + 2] * alpha;\n            newdata[i + 3] = data[i + 3];\n        }\n\n        this.img = img;\n        if (this.data) this.fire('load');\n    }.bind(this));\n}\n\nImageSprite.prototype = Object.create(Evented);\n\nImageSprite.prototype.toJSON = function() {\n    return this.base;\n};\n\nImageSprite.prototype.loaded = function() {\n    return !!(this.data && this.img);\n};\n\nImageSprite.prototype.resize = function(/*gl*/) {\n    if (browser.devicePixelRatio > 1 !== this.retina) {\n        var newSprite = new ImageSprite(this.base);\n        newSprite.on('load', function() {\n            this.img = newSprite.img;\n            this.data = newSprite.data;\n            this.retina = newSprite.retina;\n        }.bind(this));\n    }\n};\n\nfunction SpritePosition() {}\nSpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false };\n\nImageSprite.prototype.getSpritePosition = function(name) {\n    if (!this.loaded()) return new SpritePosition();\n\n    var pos = this.data && this.data[name];\n    if (pos && this.img) return pos;\n\n    return new SpritePosition();\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/style/image_sprite.js\n// module id = 1354\n// module chunks = 0 1","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n  this.protocol = null;\n  this.slashes = null;\n  this.auth = null;\n  this.host = null;\n  this.port = null;\n  this.hostname = null;\n  this.hash = null;\n  this.search = null;\n  this.query = null;\n  this.pathname = null;\n  this.path = null;\n  this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n    portPattern = /:[0-9]*$/,\n\n    // Special case for a simple path URL\n    simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n    // RFC 2396: characters reserved for delimiting URLs.\n    // We actually just auto-escape these.\n    delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n    // RFC 2396: characters not allowed for various reasons.\n    unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.\n    autoEscape = ['\\''].concat(unwise),\n    // Characters that are never ever allowed in a hostname.\n    // Note that any invalid chars are also handled, but these\n    // are the ones that are *expected* to be seen, so we fast-path\n    // them.\n    nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n    hostEndingChars = ['/', '?', '#'],\n    hostnameMaxLen = 255,\n    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n    // protocols that can allow \"unsafe\" and \"unwise\" chars.\n    unsafeProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that never have a hostname.\n    hostlessProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that always contain a // bit.\n    slashedProtocol = {\n      'http': true,\n      'https': true,\n      'ftp': true,\n      'gopher': true,\n      'file': true,\n      'http:': true,\n      'https:': true,\n      'ftp:': true,\n      'gopher:': true,\n      'file:': true\n    },\n    querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n  if (url && util.isObject(url) && url instanceof Url) return url;\n\n  var u = new Url;\n  u.parse(url, parseQueryString, slashesDenoteHost);\n  return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n  if (!util.isString(url)) {\n    throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n  }\n\n  // Copy chrome, IE, opera backslash-handling behavior.\n  // Back slashes before the query string get converted to forward slashes\n  // See: https://code.google.com/p/chromium/issues/detail?id=25916\n  var queryIndex = url.indexOf('?'),\n      splitter =\n          (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n      uSplit = url.split(splitter),\n      slashRegex = /\\\\/g;\n  uSplit[0] = uSplit[0].replace(slashRegex, '/');\n  url = uSplit.join(splitter);\n\n  var rest = url;\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim();\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    var simplePath = simplePathPattern.exec(rest);\n    if (simplePath) {\n      this.path = rest;\n      this.href = rest;\n      this.pathname = simplePath[1];\n      if (simplePath[2]) {\n        this.search = simplePath[2];\n        if (parseQueryString) {\n          this.query = querystring.parse(this.search.substr(1));\n        } else {\n          this.query = this.search.substr(1);\n        }\n      } else if (parseQueryString) {\n        this.search = '';\n        this.query = {};\n      }\n      return this;\n    }\n  }\n\n  var proto = protocolPattern.exec(rest);\n  if (proto) {\n    proto = proto[0];\n    var lowerProto = proto.toLowerCase();\n    this.protocol = lowerProto;\n    rest = rest.substr(proto.length);\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    var slashes = rest.substr(0, 2) === '//';\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2);\n      this.slashes = true;\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    var hostEnd = -1;\n    for (var i = 0; i < hostEndingChars.length; i++) {\n      var hec = rest.indexOf(hostEndingChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    var auth, atSign;\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@');\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd);\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign);\n      rest = rest.slice(atSign + 1);\n      this.auth = decodeURIComponent(auth);\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1;\n    for (var i = 0; i < nonHostChars.length; i++) {\n      var hec = rest.indexOf(nonHostChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1)\n      hostEnd = rest.length;\n\n    this.host = rest.slice(0, hostEnd);\n    rest = rest.slice(hostEnd);\n\n    // pull out port.\n    this.parseHost();\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || '';\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    var ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']';\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      var hostparts = this.hostname.split(/\\./);\n      for (var i = 0, l = hostparts.length; i < l; i++) {\n        var part = hostparts[i];\n        if (!part) continue;\n        if (!part.match(hostnamePartPattern)) {\n          var newpart = '';\n          for (var j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x';\n            } else {\n              newpart += part[j];\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            var validParts = hostparts.slice(0, i);\n            var notHost = hostparts.slice(i + 1);\n            var bit = part.match(hostnamePartStart);\n            if (bit) {\n              validParts.push(bit[1]);\n              notHost.unshift(bit[2]);\n            }\n            if (notHost.length) {\n              rest = '/' + notHost.join('.') + rest;\n            }\n            this.hostname = validParts.join('.');\n            break;\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = '';\n    } else {\n      // hostnames are always lower case.\n      this.hostname = this.hostname.toLowerCase();\n    }\n\n    if (!ipv6Hostname) {\n      // IDNA Support: Returns a punycoded representation of \"domain\".\n      // It only converts parts of the domain name that\n      // have non-ASCII characters, i.e. it doesn't matter if\n      // you call it with a domain that already is ASCII-only.\n      this.hostname = punycode.toASCII(this.hostname);\n    }\n\n    var p = this.port ? ':' + this.port : '';\n    var h = this.hostname || '';\n    this.host = h + p;\n    this.href += this.host;\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n      if (rest[0] !== '/') {\n        rest = '/' + rest;\n      }\n    }\n  }\n\n  // now rest is set to the post-host stuff.\n  // chop off any delim chars.\n  if (!unsafeProtocol[lowerProto]) {\n\n    // First, make 100% sure that any \"autoEscape\" chars get\n    // escaped, even if encodeURIComponent doesn't think they\n    // need to be.\n    for (var i = 0, l = autoEscape.length; i < l; i++) {\n      var ae = autoEscape[i];\n      if (rest.indexOf(ae) === -1)\n        continue;\n      var esc = encodeURIComponent(ae);\n      if (esc === ae) {\n        esc = escape(ae);\n      }\n      rest = rest.split(ae).join(esc);\n    }\n  }\n\n\n  // chop off from the tail first.\n  var hash = rest.indexOf('#');\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash);\n    rest = rest.slice(0, hash);\n  }\n  var qm = rest.indexOf('?');\n  if (qm !== -1) {\n    this.search = rest.substr(qm);\n    this.query = rest.substr(qm + 1);\n    if (parseQueryString) {\n      this.query = querystring.parse(this.query);\n    }\n    rest = rest.slice(0, qm);\n  } else if (parseQueryString) {\n    // no query string, but parseQueryString still requested\n    this.search = '';\n    this.query = {};\n  }\n  if (rest) this.pathname = rest;\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = '/';\n  }\n\n  //to support http.request\n  if (this.pathname || this.search) {\n    var p = this.pathname || '';\n    var s = this.search || '';\n    this.path = p + s;\n  }\n\n  // finally, reconstruct the href based on what has been validated.\n  this.href = this.format();\n  return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n  // ensure it's an object, and not a string url.\n  // If it's an obj, this is a no-op.\n  // this way, you can call url_format() on strings\n  // to clean up potentially wonky urls.\n  if (util.isString(obj)) obj = urlParse(obj);\n  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n  return obj.format();\n}\n\nUrl.prototype.format = function() {\n  var auth = this.auth || '';\n  if (auth) {\n    auth = encodeURIComponent(auth);\n    auth = auth.replace(/%3A/i, ':');\n    auth += '@';\n  }\n\n  var protocol = this.protocol || '',\n      pathname = this.pathname || '',\n      hash = this.hash || '',\n      host = false,\n      query = '';\n\n  if (this.host) {\n    host = auth + this.host;\n  } else if (this.hostname) {\n    host = auth + (this.hostname.indexOf(':') === -1 ?\n        this.hostname :\n        '[' + this.hostname + ']');\n    if (this.port) {\n      host += ':' + this.port;\n    }\n  }\n\n  if (this.query &&\n      util.isObject(this.query) &&\n      Object.keys(this.query).length) {\n    query = querystring.stringify(this.query);\n  }\n\n  var search = this.search || (query && ('?' + query)) || '';\n\n  if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n  // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.\n  // unless they had them to begin with.\n  if (this.slashes ||\n      (!protocol || slashedProtocol[protocol]) && host !== false) {\n    host = '//' + (host || '');\n    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n  } else if (!host) {\n    host = '';\n  }\n\n  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n  if (search && search.charAt(0) !== '?') search = '?' + search;\n\n  pathname = pathname.replace(/[?#]/g, function(match) {\n    return encodeURIComponent(match);\n  });\n  search = search.replace('#', '%23');\n\n  return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n  return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n  return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n  if (!source) return relative;\n  return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n  if (util.isString(relative)) {\n    var rel = new Url();\n    rel.parse(relative, false, true);\n    relative = rel;\n  }\n\n  var result = new Url();\n  var tkeys = Object.keys(this);\n  for (var tk = 0; tk < tkeys.length; tk++) {\n    var tkey = tkeys[tk];\n    result[tkey] = this[tkey];\n  }\n\n  // hash is always overridden, no matter what.\n  // even href=\"\" will remove it.\n  result.hash = relative.hash;\n\n  // if the relative url is empty, then there's nothing left to do here.\n  if (relative.href === '') {\n    result.href = result.format();\n    return result;\n  }\n\n  // hrefs like //foo/bar always cut to the protocol.\n  if (relative.slashes && !relative.protocol) {\n    // take everything except the protocol from relative\n    var rkeys = Object.keys(relative);\n    for (var rk = 0; rk < rkeys.length; rk++) {\n      var rkey = rkeys[rk];\n      if (rkey !== 'protocol')\n        result[rkey] = relative[rkey];\n    }\n\n    //urlParse appends trailing / to urls like http://www.example.com\n    if (slashedProtocol[result.protocol] &&\n        result.hostname && !result.pathname) {\n      result.path = result.pathname = '/';\n    }\n\n    result.href = result.format();\n    return result;\n  }\n\n  if (relative.protocol && relative.protocol !== result.protocol) {\n    // if it's a known url protocol, then changing\n    // the protocol does weird things\n    // first, if it's not file:, then we MUST have a host,\n    // and if there was a path\n    // to begin with, then we MUST have a path.\n    // if it is file:, then the host is dropped,\n    // because that's known to be hostless.\n    // anything else is assumed to be absolute.\n    if (!slashedProtocol[relative.protocol]) {\n      var keys = Object.keys(relative);\n      for (var v = 0; v < keys.length; v++) {\n        var k = keys[v];\n        result[k] = relative[k];\n      }\n      result.href = result.format();\n      return result;\n    }\n\n    result.protocol = relative.protocol;\n    if (!relative.host && !hostlessProtocol[relative.protocol]) {\n      var relPath = (relative.pathname || '').split('/');\n      while (relPath.length && !(relative.host = relPath.shift()));\n      if (!relative.host) relative.host = '';\n      if (!relative.hostname) relative.hostname = '';\n      if (relPath[0] !== '') relPath.unshift('');\n      if (relPath.length < 2) relPath.unshift('');\n      result.pathname = relPath.join('/');\n    } else {\n      result.pathname = relative.pathname;\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    result.host = relative.host || '';\n    result.auth = relative.auth;\n    result.hostname = relative.hostname || relative.host;\n    result.port = relative.port;\n    // to support http.request\n    if (result.pathname || result.search) {\n      var p = result.pathname || '';\n      var s = result.search || '';\n      result.path = p + s;\n    }\n    result.slashes = result.slashes || relative.slashes;\n    result.href = result.format();\n    return result;\n  }\n\n  var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n      isRelAbs = (\n          relative.host ||\n          relative.pathname && relative.pathname.charAt(0) === '/'\n      ),\n      mustEndAbs = (isRelAbs || isSourceAbs ||\n                    (result.host && relative.pathname)),\n      removeAllDots = mustEndAbs,\n      srcPath = result.pathname && result.pathname.split('/') || [],\n      relPath = relative.pathname && relative.pathname.split('/') || [],\n      psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n  // if the url is a non-slashed url, then relative\n  // links like ../.. should be able\n  // to crawl up to the hostname, as well.  This is strange.\n  // result.protocol has already been set by now.\n  // Later on, put the first path part into the host field.\n  if (psychotic) {\n    result.hostname = '';\n    result.port = null;\n    if (result.host) {\n      if (srcPath[0] === '') srcPath[0] = result.host;\n      else srcPath.unshift(result.host);\n    }\n    result.host = '';\n    if (relative.protocol) {\n      relative.hostname = null;\n      relative.port = null;\n      if (relative.host) {\n        if (relPath[0] === '') relPath[0] = relative.host;\n        else relPath.unshift(relative.host);\n      }\n      relative.host = null;\n    }\n    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n  }\n\n  if (isRelAbs) {\n    // it's absolute.\n    result.host = (relative.host || relative.host === '') ?\n                  relative.host : result.host;\n    result.hostname = (relative.hostname || relative.hostname === '') ?\n                      relative.hostname : result.hostname;\n    result.search = relative.search;\n    result.query = relative.query;\n    srcPath = relPath;\n    // fall through to the dot-handling below.\n  } else if (relPath.length) {\n    // it's relative\n    // throw away the existing file, and take the new path instead.\n    if (!srcPath) srcPath = [];\n    srcPath.pop();\n    srcPath = srcPath.concat(relPath);\n    result.search = relative.search;\n    result.query = relative.query;\n  } else if (!util.isNullOrUndefined(relative.search)) {\n    // just pull out the search.\n    // like href='?foo'.\n    // Put this after the other two cases because it simplifies the booleans\n    if (psychotic) {\n      result.hostname = result.host = srcPath.shift();\n      //occationaly the auth can get stuck only in host\n      //this especially happens in cases like\n      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n      var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                       result.host.split('@') : false;\n      if (authInHost) {\n        result.auth = authInHost.shift();\n        result.host = result.hostname = authInHost.shift();\n      }\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    //to support http.request\n    if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n      result.path = (result.pathname ? result.pathname : '') +\n                    (result.search ? result.search : '');\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  if (!srcPath.length) {\n    // no path at all.  easy.\n    // we've already handled the other stuff above.\n    result.pathname = null;\n    //to support http.request\n    if (result.search) {\n      result.path = '/' + result.search;\n    } else {\n      result.path = null;\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  // if a url ENDs in . or .., then it must get a trailing slash.\n  // however, if it ends in anything else non-slashy,\n  // then it must NOT get a trailing slash.\n  var last = srcPath.slice(-1)[0];\n  var hasTrailingSlash = (\n      (result.host || relative.host || srcPath.length > 1) &&\n      (last === '.' || last === '..') || last === '');\n\n  // strip single dots, resolve double dots to parent dir\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = srcPath.length; i >= 0; i--) {\n    last = srcPath[i];\n    if (last === '.') {\n      srcPath.splice(i, 1);\n    } else if (last === '..') {\n      srcPath.splice(i, 1);\n      up++;\n    } else if (up) {\n      srcPath.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (!mustEndAbs && !removeAllDots) {\n    for (; up--; up) {\n      srcPath.unshift('..');\n    }\n  }\n\n  if (mustEndAbs && srcPath[0] !== '' &&\n      (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n    srcPath.unshift('');\n  }\n\n  if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n    srcPath.push('');\n  }\n\n  var isAbsolute = srcPath[0] === '' ||\n      (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n  // put the host back\n  if (psychotic) {\n    result.hostname = result.host = isAbsolute ? '' :\n                                    srcPath.length ? srcPath.shift() : '';\n    //occationaly the auth can get stuck only in host\n    //this especially happens in cases like\n    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n    var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                     result.host.split('@') : false;\n    if (authInHost) {\n      result.auth = authInHost.shift();\n      result.host = result.hostname = authInHost.shift();\n    }\n  }\n\n  mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n  if (mustEndAbs && !isAbsolute) {\n    srcPath.unshift('');\n  }\n\n  if (!srcPath.length) {\n    result.pathname = null;\n    result.path = null;\n  } else {\n    result.pathname = srcPath.join('/');\n  }\n\n  //to support request.http\n  if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n    result.path = (result.pathname ? result.pathname : '') +\n                  (result.search ? result.search : '');\n  }\n  result.auth = relative.auth || result.auth;\n  result.slashes = result.slashes || relative.slashes;\n  result.href = result.format();\n  return result;\n};\n\nUrl.prototype.parseHost = function() {\n  var host = this.host;\n  var port = portPattern.exec(host);\n  if (port) {\n    port = port[0];\n    if (port !== ':') {\n      this.port = port.substr(1);\n    }\n    host = host.substr(0, host.length - port.length);\n  }\n  if (host) this.hostname = host;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url/url.js\n// module id = 1355\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n  isString: function(arg) {\n    return typeof(arg) === 'string';\n  },\n  isObject: function(arg) {\n    return typeof(arg) === 'object' && arg !== null;\n  },\n  isNull: function(arg) {\n    return arg === null;\n  },\n  isNullOrUndefined: function(arg) {\n    return arg == null;\n  }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url/util.js\n// module id = 1356\n// module chunks = 0 1","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n  sep = sep || '&';\n  eq = eq || '=';\n  var obj = {};\n\n  if (typeof qs !== 'string' || qs.length === 0) {\n    return obj;\n  }\n\n  var regexp = /\\+/g;\n  qs = qs.split(sep);\n\n  var maxKeys = 1000;\n  if (options && typeof options.maxKeys === 'number') {\n    maxKeys = options.maxKeys;\n  }\n\n  var len = qs.length;\n  // maxKeys <= 0 means that we should not limit keys count\n  if (maxKeys > 0 && len > maxKeys) {\n    len = maxKeys;\n  }\n\n  for (var i = 0; i < len; ++i) {\n    var x = qs[i].replace(regexp, '%20'),\n        idx = x.indexOf(eq),\n        kstr, vstr, k, v;\n\n    if (idx >= 0) {\n      kstr = x.substr(0, idx);\n      vstr = x.substr(idx + 1);\n    } else {\n      kstr = x;\n      vstr = '';\n    }\n\n    k = decodeURIComponent(kstr);\n    v = decodeURIComponent(vstr);\n\n    if (!hasOwnProperty(obj, k)) {\n      obj[k] = v;\n    } else if (isArray(obj[k])) {\n      obj[k].push(v);\n    } else {\n      obj[k] = [obj[k], v];\n    }\n  }\n\n  return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/decode.js\n// module id = 1357\n// module chunks = 0 1","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n  switch (typeof v) {\n    case 'string':\n      return v;\n\n    case 'boolean':\n      return v ? 'true' : 'false';\n\n    case 'number':\n      return isFinite(v) ? v : '';\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n  sep = sep || '&';\n  eq = eq || '=';\n  if (obj === null) {\n    obj = undefined;\n  }\n\n  if (typeof obj === 'object') {\n    return map(objectKeys(obj), function(k) {\n      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n      if (isArray(obj[k])) {\n        return map(obj[k], function(v) {\n          return ks + encodeURIComponent(stringifyPrimitive(v));\n        }).join(sep);\n      } else {\n        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n      }\n    }).join(sep);\n\n  }\n\n  if (!name) return '';\n  return encodeURIComponent(stringifyPrimitive(name)) + eq +\n         encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n  if (xs.map) return xs.map(f);\n  var res = [];\n  for (var i = 0; i < xs.length; i++) {\n    res.push(f(xs[i], i));\n  }\n  return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n  var res = [];\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n  }\n  return res;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/encode.js\n// module id = 1358\n// module chunks = 0 1","'use strict';\n\nvar normalizeURL = require('../util/mapbox').normalizeGlyphsURL;\nvar getArrayBuffer = require('../util/ajax').getArrayBuffer;\nvar Glyphs = require('../util/glyphs');\nvar GlyphAtlas = require('../symbol/glyph_atlas');\nvar Protobuf = require('pbf');\n\nmodule.exports = GlyphSource;\n\n/**\n * A glyph source has a URL from which to load new glyphs and manages\n * GlyphAtlases in which to store glyphs used by the requested fontstacks\n * and ranges.\n *\n * @param {string} url glyph template url\n * @private\n */\nfunction GlyphSource(url) {\n    this.url = url && normalizeURL(url);\n    this.atlases = {};\n    this.stacks = {};\n    this.loading = {};\n}\n\nGlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) {\n    if (this.stacks[fontstack] === undefined) {\n        this.stacks[fontstack] = {};\n    }\n    if (this.atlases[fontstack] === undefined) {\n        this.atlases[fontstack] = new GlyphAtlas();\n    }\n\n    var glyphs = {};\n    var stack = this.stacks[fontstack];\n    var atlas = this.atlases[fontstack];\n\n    // the number of pixels the sdf bitmaps are padded by\n    var buffer = 3;\n\n    var missing = {};\n    var remaining = 0;\n    var range;\n\n    for (var i = 0; i < glyphIDs.length; i++) {\n        var glyphID = glyphIDs[i];\n        range = Math.floor(glyphID / 256);\n\n        if (stack[range]) {\n            var glyph = stack[range].glyphs[glyphID];\n            var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n            if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n        } else {\n            if (missing[range] === undefined) {\n                missing[range] = [];\n                remaining++;\n            }\n            missing[range].push(glyphID);\n        }\n    }\n\n    if (!remaining) callback(undefined, glyphs, fontstack);\n\n    var onRangeLoaded = function(err, range, data) {\n        if (!err) {\n            var stack = this.stacks[fontstack][range] = data.stacks[0];\n            for (var i = 0; i < missing[range].length; i++) {\n                var glyphID = missing[range][i];\n                var glyph = stack.glyphs[glyphID];\n                var rect  = atlas.addGlyph(uid, fontstack, glyph, buffer);\n                if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n            }\n        }\n        remaining--;\n        if (!remaining) callback(undefined, glyphs, fontstack);\n    }.bind(this);\n\n    for (var r in missing) {\n        this.loadRange(fontstack, r, onRangeLoaded);\n    }\n};\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nfunction SimpleGlyph(glyph, rect, buffer) {\n    var padding = 1;\n    this.advance = glyph.advance;\n    this.left = glyph.left - buffer - padding;\n    this.top = glyph.top + buffer + padding;\n    this.rect = rect;\n}\n\nGlyphSource.prototype.loadRange = function(fontstack, range, callback) {\n    if (range * 256 > 65535) return callback('glyphs > 65535 not supported');\n\n    if (this.loading[fontstack] === undefined) {\n        this.loading[fontstack] = {};\n    }\n    var loading = this.loading[fontstack];\n\n    if (loading[range]) {\n        loading[range].push(callback);\n    } else {\n        loading[range] = [callback];\n\n        var rangeName = (range * 256) + '-' + (range * 256 + 255);\n        var url = glyphUrl(fontstack, rangeName, this.url);\n\n        getArrayBuffer(url, function(err, data) {\n            var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data)));\n            for (var i = 0; i < loading[range].length; i++) {\n                loading[range][i](err, range, glyphs);\n            }\n            delete loading[range];\n        });\n    }\n};\n\nGlyphSource.prototype.getGlyphAtlas = function(fontstack) {\n    return this.atlases[fontstack];\n};\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n    subdomains = subdomains || 'abc';\n\n    return url\n        .replace('{s}', subdomains[fontstack.length % subdomains.length])\n        .replace('{fontstack}', fontstack)\n        .replace('{range}', range);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/glyph_source.js\n// module id = 1359\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n    this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n    if (tag === 1) {\n        var fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n        stacks.push(fontstack);\n    }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n    if (tag === 1) fontstack.name = pbf.readString();\n    else if (tag === 2) fontstack.range = pbf.readString();\n    else if (tag === 3) {\n        var glyph = pbf.readMessage(readGlyph, {});\n        fontstack.glyphs[glyph.id] = glyph;\n    }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n    if (tag === 1) glyph.id = pbf.readVarint();\n    else if (tag === 2) glyph.bitmap = pbf.readBytes();\n    else if (tag === 3) glyph.width = pbf.readVarint();\n    else if (tag === 4) glyph.height = pbf.readVarint();\n    else if (tag === 5) glyph.left = pbf.readSVarint();\n    else if (tag === 6) glyph.top = pbf.readSVarint();\n    else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/glyphs.js\n// module id = 1360\n// module chunks = 0 1","'use strict';\n\nvar ShelfPack = require('shelf-pack');\nvar util = require('../util/util');\n\nvar SIZE_GROWTH_RATE = 4;\nvar DEFAULT_SIZE = 128;\n// must be \"DEFAULT_SIZE * SIZE_GROWTH_RATE ^ n\" for some integer n\nvar MAX_SIZE = 2048;\n\nmodule.exports = GlyphAtlas;\nfunction GlyphAtlas() {\n    this.width = DEFAULT_SIZE;\n    this.height = DEFAULT_SIZE;\n\n    this.bin = new ShelfPack(this.width, this.height);\n    this.index = {};\n    this.ids = {};\n    this.data = new Uint8Array(this.width * this.height);\n}\n\nGlyphAtlas.prototype.getGlyphs = function() {\n    var glyphs = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!glyphs[name]) glyphs[name] = [];\n        glyphs[name].push(id);\n    }\n\n    return glyphs;\n};\n\nGlyphAtlas.prototype.getRects = function() {\n    var rects = {},\n        split,\n        name,\n        id;\n\n    for (var key in this.ids) {\n        split = key.split('#');\n        name = split[0];\n        id = split[1];\n\n        if (!rects[name]) rects[name] = {};\n        rects[name][id] = this.index[key];\n    }\n\n    return rects;\n};\n\n\nGlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) {\n    if (!glyph) return null;\n\n    var key = name + \"#\" + glyph.id;\n\n    // The glyph is already in this texture.\n    if (this.index[key]) {\n        if (this.ids[key].indexOf(id) < 0) {\n            this.ids[key].push(id);\n        }\n        return this.index[key];\n    }\n\n    // The glyph bitmap has zero width.\n    if (!glyph.bitmap) {\n        return null;\n    }\n\n    var bufferedWidth = glyph.width + buffer * 2;\n    var bufferedHeight = glyph.height + buffer * 2;\n\n    // Add a 1px border around every image.\n    var padding = 1;\n    var packWidth = bufferedWidth + 2 * padding;\n    var packHeight = bufferedHeight + 2 * padding;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into fewer bytes.\n    packWidth += (4 - packWidth % 4);\n    packHeight += (4 - packHeight % 4);\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        this.resize();\n        rect = this.bin.packOne(packWidth, packHeight);\n    }\n    if (!rect) {\n        util.warnOnce('glyph bitmap overflow');\n        return null;\n    }\n\n    this.index[key] = rect;\n    this.ids[key] = [id];\n\n    var target = this.data;\n    var source = glyph.bitmap;\n    for (var y = 0; y < bufferedHeight; y++) {\n        var y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n        var y2 = bufferedWidth * y;\n        for (var x = 0; x < bufferedWidth; x++) {\n            target[y1 + x] = source[y2 + x];\n        }\n    }\n\n    this.dirty = true;\n\n    return rect;\n};\n\nGlyphAtlas.prototype.resize = function() {\n    var prevWidth = this.width;\n    var prevHeight = this.height;\n\n    if (prevWidth >= MAX_SIZE || prevHeight >= MAX_SIZE) return;\n\n    if (this.texture) {\n        if (this.gl) {\n            this.gl.deleteTexture(this.texture);\n        }\n        this.texture = null;\n    }\n\n    this.width *= SIZE_GROWTH_RATE;\n    this.height *= SIZE_GROWTH_RATE;\n    this.bin.resize(this.width, this.height);\n\n    var buf = new ArrayBuffer(this.width * this.height);\n    for (var i = 0; i < prevHeight; i++) {\n        var src = new Uint8Array(this.data.buffer, prevHeight * i, prevWidth);\n        var dst = new Uint8Array(buf, prevHeight * i * SIZE_GROWTH_RATE, prevWidth);\n        dst.set(src);\n    }\n    this.data = new Uint8Array(buf);\n};\n\nGlyphAtlas.prototype.bind = function(gl) {\n    this.gl = gl;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n};\n\nGlyphAtlas.prototype.updateTexture = function(gl) {\n    this.bind(gl);\n    if (this.dirty) {\n        gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n        this.dirty = false;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/glyph_atlas.js\n// module id = 1361\n// module chunks = 0 1","'use strict';\n\nvar ShelfPack = require('shelf-pack');\nvar browser = require('../util/browser');\nvar util = require('../util/util');\n\nmodule.exports = SpriteAtlas;\nfunction SpriteAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n\n    this.bin = new ShelfPack(width, height);\n    this.images = {};\n    this.data = false;\n    this.texture = 0; // WebGL ID\n    this.filter = 0; // WebGL ID\n    this.pixelRatio = 1;\n    this.dirty = true;\n}\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n    var srcI = srcY * srcStride + srcX;\n    var dstI = dstY * dstStride + dstX;\n    var x, y;\n\n    if (wrap) {\n        // add 1 pixel wrapped padding on each side of the image\n        dstI -= dstStride;\n        for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) {\n            for (x = -1; x <= width; x++) {\n                dst[dstI + x] = src[srcI + ((x + width) % width)];\n            }\n        }\n\n    } else {\n        for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n            for (x = 0; x < width; x++) {\n                dst[dstI + x] = src[srcI + x];\n            }\n        }\n    }\n}\n\nSpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) {\n\n    pixelWidth = pixelWidth / this.pixelRatio;\n    pixelHeight = pixelHeight / this.pixelRatio;\n\n    // Increase to next number divisible by 4, but at least 1.\n    // This is so we can scale down the texture coordinates and pack them\n    // into 2 bytes rather than 4 bytes.\n    // Pad icons to prevent them from polluting neighbours during linear interpolation\n    var padding = 2;\n    var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n    var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n    var rect = this.bin.packOne(packWidth, packHeight);\n    if (!rect) {\n        util.warnOnce('SpriteAtlas out of space.');\n        return null;\n    }\n\n    return rect;\n};\n\nSpriteAtlas.prototype.getImage = function(name, wrap) {\n    if (this.images[name]) {\n        return this.images[name];\n    }\n\n    if (!this.sprite) {\n        return null;\n    }\n\n    var pos = this.sprite.getSpritePosition(name);\n    if (!pos.width || !pos.height) {\n        return null;\n    }\n\n    var rect = this.allocateImage(pos.width, pos.height);\n    if (!rect) {\n        return null;\n    }\n\n    var image = new AtlasImage(rect, pos.width / pos.pixelRatio, pos.height / pos.pixelRatio, pos.sdf, pos.pixelRatio / this.pixelRatio);\n    this.images[name] = image;\n\n    this.copy(rect, pos, wrap);\n\n    return image;\n};\n\n\n// Return position of a repeating fill pattern.\nSpriteAtlas.prototype.getPosition = function(name, repeating) {\n    var image = this.getImage(name, repeating);\n    var rect = image && image.rect;\n\n    if (!rect) {\n        return null;\n    }\n\n    var width = image.width * image.pixelRatio;\n    var height = image.height * image.pixelRatio;\n    var padding = 1;\n\n    return {\n        size: [image.width, image.height],\n        tl: [(rect.x + padding)         / this.width, (rect.y + padding)          / this.height],\n        br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n    };\n};\n\n\nSpriteAtlas.prototype.allocate = function() {\n    if (!this.data) {\n        var w = Math.floor(this.width * this.pixelRatio);\n        var h = Math.floor(this.height * this.pixelRatio);\n        this.data = new Uint32Array(w * h);\n        for (var i = 0; i < this.data.length; i++) {\n            this.data[i] = 0;\n        }\n    }\n};\n\n\nSpriteAtlas.prototype.copy = function(dst, src, wrap) {\n    if (!this.sprite.img.data) return;\n    var srcImg = new Uint32Array(this.sprite.img.data.buffer);\n\n    this.allocate();\n    var dstImg = this.data;\n\n    var padding = 1;\n\n    copyBitmap(\n        /* source buffer */  srcImg,\n        /* source stride */  this.sprite.img.width,\n        /* source x */       src.x,\n        /* source y */       src.y,\n        /* dest buffer */    dstImg,\n        /* dest stride */    this.width * this.pixelRatio,\n        /* dest x */         (dst.x + padding) * this.pixelRatio,\n        /* dest y */         (dst.y + padding) * this.pixelRatio,\n        /* icon dimension */ src.width,\n        /* icon dimension */ src.height,\n        /* wrap */ wrap\n    );\n\n    this.dirty = true;\n};\n\nSpriteAtlas.prototype.setSprite = function(sprite) {\n    if (sprite) {\n        this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1;\n\n        if (this.canvas) {\n            this.canvas.width = this.width * this.pixelRatio;\n            this.canvas.height = this.height * this.pixelRatio;\n        }\n    }\n    this.sprite = sprite;\n};\n\nSpriteAtlas.prototype.addIcons = function(icons, callback) {\n    for (var i = 0; i < icons.length; i++) {\n        this.getImage(icons[i]);\n    }\n\n    callback(null, this.images);\n};\n\nSpriteAtlas.prototype.bind = function(gl, linear) {\n    var first = false;\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        first = true;\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n    }\n\n    var filterVal = linear ? gl.LINEAR : gl.NEAREST;\n    if (filterVal !== this.filter) {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n        this.filter = filterVal;\n    }\n\n    if (this.dirty) {\n        this.allocate();\n\n        if (first) {\n            gl.texImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // ind level\n                gl.RGBA, // ind internalformat\n                this.width * this.pixelRatio, // GLsizei width\n                this.height * this.pixelRatio, // GLsizei height\n                0, // ind border\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object data\n            );\n        } else {\n            gl.texSubImage2D(\n                gl.TEXTURE_2D, // enum target\n                0, // int level\n                0, // int xoffset\n                0, // int yoffset\n                this.width * this.pixelRatio, // long width\n                this.height * this.pixelRatio, // long height\n                gl.RGBA, // enum format\n                gl.UNSIGNED_BYTE, // enum type\n                new Uint8Array(this.data.buffer) // Object pixels\n            );\n        }\n\n        this.dirty = false;\n    }\n};\n\nfunction AtlasImage(rect, width, height, sdf, pixelRatio) {\n    this.rect = rect;\n    this.width = width;\n    this.height = height;\n    this.sdf = sdf;\n    this.pixelRatio = pixelRatio;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/sprite_atlas.js\n// module id = 1362\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\n\nmodule.exports = LineAtlas;\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nfunction LineAtlas(width, height) {\n    this.width = width;\n    this.height = height;\n    this.nextRow = 0;\n\n    this.bytes = 4;\n    this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n    this.positions = {};\n}\n\nLineAtlas.prototype.setSprite = function(sprite) {\n    this.sprite = sprite;\n};\n\n/**\n * Get or create a dash line pattern.\n *\n * @param {Array<number>} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\nLineAtlas.prototype.getDash = function(dasharray, round) {\n    var key = dasharray.join(\",\") + round;\n\n    if (!this.positions[key]) {\n        this.positions[key] = this.addDash(dasharray, round);\n    }\n    return this.positions[key];\n};\n\nLineAtlas.prototype.addDash = function(dasharray, round) {\n\n    var n = round ? 7 : 0;\n    var height = 2 * n + 1;\n    var offset = 128;\n\n    if (this.nextRow + height > this.height) {\n        util.warnOnce('LineAtlas out of space');\n        return null;\n    }\n\n    var length = 0;\n    for (var i = 0; i < dasharray.length; i++) {\n        length += dasharray[i];\n    }\n\n    var stretch = this.width / length;\n    var halfWidth = stretch / 2;\n\n    // If dasharray has an odd length, both the first and last parts\n    // are dashes and should be joined seamlessly.\n    var oddLength = dasharray.length % 2 === 1;\n\n    for (var y = -n; y <= n; y++) {\n        var row = this.nextRow + n + y;\n        var index = this.width * row;\n\n        var left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n        var right = dasharray[0];\n        var partIndex = 1;\n\n        for (var x = 0; x < this.width; x++) {\n\n            while (right < x / stretch) {\n                left = right;\n                right = right + dasharray[partIndex];\n\n                if (oddLength && partIndex === dasharray.length - 1) {\n                    right += dasharray[0];\n                }\n\n                partIndex++;\n            }\n\n            var distLeft = Math.abs(x - left * stretch);\n            var distRight = Math.abs(x - right * stretch);\n            var dist = Math.min(distLeft, distRight);\n            var inside = (partIndex % 2) === 1;\n            var signedDistance;\n\n            if (round) {\n                // Add circle caps\n                var distMiddle = n ? y / n * (halfWidth + 1) : 0;\n                if (inside) {\n                    var distEdge = halfWidth - Math.abs(distMiddle);\n                    signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n                } else {\n                    signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n                }\n            } else {\n                signedDistance = (inside ? 1 : -1) * dist;\n            }\n\n            this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n        }\n    }\n\n    var pos = {\n        y: (this.nextRow + n + 0.5) / this.height,\n        height: 2 * n / this.height,\n        width: length\n    };\n\n    this.nextRow += height;\n    this.dirty = true;\n\n    return pos;\n};\n\nLineAtlas.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n        if (this.dirty) {\n            this.dirty = false;\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/line_atlas.js\n// module id = 1363\n// module chunks = 0 1","'use strict';\n\nvar util = require('./util');\nvar Actor = require('./actor');\n\nmodule.exports = Dispatcher;\n\n/**\n * Responsible for sending messages from a {@link Source} to an associated\n * {@link WorkerSource}.\n *\n * @interface Dispatcher\n * @private\n */\nfunction Dispatcher(workerPool, parent) {\n    this.workerPool = workerPool;\n    this.actors = [];\n    this.currentActor = 0;\n    this.id = util.uniqueId();\n    var workers = this.workerPool.acquire(this.id);\n    for (var i = 0; i < workers.length; i++) {\n        var worker = workers[i];\n        var actor = new Actor(worker, parent, this.id);\n        actor.name = \"Worker \" + i;\n        this.actors.push(actor);\n    }\n}\n\nDispatcher.prototype = {\n    /**\n     * Broadcast a message to all Workers.\n     * @method\n     * @name broadcast\n     * @param {string} type\n     * @param {object} data\n     * @param {Function} callback\n     * @memberof Dispatcher\n     * @instance\n     */\n    broadcast: function(type, data, cb) {\n        cb = cb || function () {};\n        util.asyncAll(this.actors, function (actor, done) {\n            actor.send(type, data, done);\n        }, cb);\n    },\n\n    /**\n     * Send a message to a Worker.\n     * @method\n     * @name send\n     * @param {string} type\n     * @param {object} data\n     * @param {Function} callback\n     * @param {number|undefined} [targetID] The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose.\n     * @returns {number} The ID of the worker to which the message was sent.\n     * @memberof Dispatcher\n     * @instance\n     */\n    send: function(type, data, callback, targetID, buffers) {\n        if (typeof targetID !== 'number' || isNaN(targetID)) {\n            // Use round robin to send requests to web workers.\n            targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n        }\n\n        this.actors[targetID].send(type, data, callback, buffers);\n        return targetID;\n    },\n\n    remove: function() {\n        this.workerPool.release(this.id);\n        this.actors = [];\n    }\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/dispatcher.js\n// module id = 1364\n// module chunks = 0 1","'use strict';\n\nmodule.exports = Actor;\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @param {string|number} mapId A unique identifier for the Map instance using this Actor.\n * @private\n */\nfunction Actor(target, parent, mapId) {\n    this.target = target;\n    this.parent = parent;\n    this.mapId = mapId;\n    this.callbacks = {};\n    this.callbackID = 0;\n    this.receive = this.receive.bind(this);\n    this.target.addEventListener('message', this.receive, false);\n}\n\nActor.prototype.receive = function(message) {\n    var data = message.data,\n        id = data.id,\n        callback;\n\n    if (data.type === '<response>') {\n        callback = this.callbacks[data.id];\n        delete this.callbacks[data.id];\n        if (callback) callback(data.error || null, data.data);\n    } else if (typeof data.id !== 'undefined' && this.parent[data.type]) {\n        // data.type == 'load tile', 'remove tile', etc.\n        this.parent[data.type](data.mapId, data.data, done.bind(this));\n    } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) {\n        // data.type == sourcetype.method\n        var keys = data.type.split('.');\n        var workerSource = this.parent.getWorkerSource(data.mapId, keys[0]);\n        workerSource[keys[1]](data.data, done.bind(this));\n    } else {\n        this.parent[data.type](data.data);\n    }\n\n    function done(err, data, buffers) {\n        this.postMessage({\n            mapId: this.mapId,\n            type: '<response>',\n            id: String(id),\n            error: err ? String(err) : null,\n            data: data\n        }, buffers);\n    }\n};\n\nActor.prototype.send = function(type, data, callback, buffers) {\n    var id = callback ? this.mapId + ':' + this.callbackID++ : null;\n    if (callback) this.callbacks[id] = callback;\n    this.postMessage({ mapId: this.mapId, type: type, id: String(id), data: data }, buffers);\n};\n\n/**\n * Wrapped postMessage API that abstracts around IE's lack of\n * `transferList` support.\n *\n * @param {Object} message\n * @param {Object} transferList\n * @private\n */\nActor.prototype.postMessage = function(message, transferList) {\n    this.target.postMessage(message, transferList);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/actor.js\n// module id = 1365\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar util = require('../util/util');\nvar loadTileJSON = require('./load_tilejson');\nvar normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nmodule.exports = VectorTileSource;\n\nfunction VectorTileSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    this._options = util.extend({ type: 'vector' }, options);\n\n    if (this.tileSize !== 512) {\n        throw new Error('vector tile sources must have a tileSize of 512');\n    }\n\n    loadTileJSON(options, function (err, tileJSON) {\n        if (err) {\n            this.fire('error', err);\n            return;\n        }\n        util.extend(this, tileJSON);\n        this.fire('load');\n    }.bind(this));\n}\n\nVectorTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    scheme: 'xyz',\n    tileSize: 512,\n    reparseOverscaled: true,\n    isTileClipped: true,\n\n    onAdd: function(map) {\n        this.map = map;\n    },\n\n    serialize: function() {\n        return util.extend({}, this._options);\n    },\n\n    loadTile: function(tile, callback) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url),\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            tileSize: this.tileSize * overscaling,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        if (tile.workerID) {\n            if (tile.state === 'loading') {\n                // schedule tile reloading after it has been loaded\n                tile.reloadCallback = callback;\n            } else {\n                params.rawTileData = tile.rawTileData;\n                this.dispatcher.send('reload tile', params, done.bind(this), tile.workerID);\n            }\n        } else {\n            tile.workerID = this.dispatcher.send('load tile', params, done.bind(this));\n        }\n\n        function done(err, data) {\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            callback(null);\n\n            if (tile.reloadCallback) {\n                this.loadTile(tile, tile.reloadCallback);\n                tile.reloadCallback = null;\n            }\n        }\n    },\n\n    abortTile: function(tile) {\n        this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    },\n\n    unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/vector_tile_source.js\n// module id = 1366\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar Evented = require('../util/evented');\nvar loadTileJSON = require('./load_tilejson');\nvar normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nmodule.exports = RasterTileSource;\n\nfunction RasterTileSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n    loadTileJSON(options, function (err, tileJSON) {\n        if (err) {\n            return this.fire('error', err);\n        }\n        util.extend(this, tileJSON);\n        this.fire('load');\n    }.bind(this));\n}\n\nRasterTileSource.prototype = util.inherit(Evented, {\n    minzoom: 0,\n    maxzoom: 22,\n    roundZoom: true,\n    scheme: 'xyz',\n    tileSize: 512,\n    _loaded: false,\n\n    onAdd: function (map) {\n        this.map = map;\n    },\n\n    serialize: function() {\n        return {\n            type: 'raster',\n            url: this.url,\n            tileSize: this.tileSize\n        };\n    },\n\n    loadTile: function(tile, callback) {\n        var url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize);\n\n        tile.request = ajax.getImage(url, done.bind(this));\n\n        function done(err, img) {\n            delete tile.request;\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            var gl = this.map.painter.gl;\n            tile.texture = this.map.painter.getTexture(img.width);\n            if (tile.texture) {\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n            } else {\n                tile.texture = gl.createTexture();\n                gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n                tile.texture.size = img.width;\n            }\n            gl.generateMipmap(gl.TEXTURE_2D);\n\n            this.map.animationLoop.set(this.map.style.rasterFadeDuration);\n\n            tile.state = 'loaded';\n\n            callback(null);\n        }\n    },\n\n    abortTile: function(tile) {\n        if (tile.request) {\n            tile.request.abort();\n            delete tile.request;\n        }\n    },\n\n    unloadTile: function(tile) {\n        if (tile.texture) this.map.painter.saveTexture(tile.texture);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/raster_tile_source.js\n// module id = 1367\n// module chunks = 0 1","'use strict';\n\nvar Evented = require('../util/evented');\nvar util = require('../util/util');\nvar urlResolve = require('resolve-url');\nvar EXTENT = require('../data/bucket').EXTENT;\n\nmodule.exports = GeoJSONSource;\n\n/**\n * A source containing GeoJSON.\n *\n * @class GeoJSONSource\n * @param {Object} [options]\n * @param {Object|string} [options.data] A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON objects.\n * @param {number} [options.maxzoom=18] The maximum zoom level at which to preserve detail (1-20).\n * @param {number} [options.buffer=128] The tile buffer, measured in pixels. The buffer extends each\n *   tile's data just past its visible edges, helping to ensure seamless rendering across tile boundaries.\n *   The default value, 128, is a safe value for label layers, preventing text clipping at boundaries.\n *   You can read more about buffers and clipping in the\n *   [Mapbox Vector Tile Specification](https://www.mapbox.com/vector-tiles/specification/#clipping).\n * @param {number} [options.tolerance=0.375] The simplification tolerance, measured in pixels.\n *   This value is passed into a modified [Ramer–Douglas–Peucker algorithm](https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm)\n *   to simplify (i.e. reduce the number of points) in curves. Higher values result in greater simplification.\n * @param {boolean} [options.cluster] If `true`, a collection of point features will be clustered into groups,\n *   according to `options.clusterRadius`.\n * @param {number} [options.clusterRadius=50] The radius of each cluster when clustering points, measured in pixels.\n * @param {number} [options.clusterMaxZoom] The maximum zoom level to cluster points in. By default, this value is\n *   one zoom level less than the map's `maxzoom`, so that at the highest zoom level features are not clustered.\n *\n * @example\n * map.addSource('some id', {\n *     data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'\n * });\n *\n * @example\n * map.addSource('some id', {\n *    type: 'geojson',\n *    data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [\n *                    -76.53063297271729,\n *                    39.18174077994108\n *                ]\n *            }\n *        }]\n *    }\n * });\n *\n * @example\n * map.getSource('some id').setData({\n *     data: {\n *        \"type\": \"FeatureCollection\",\n *        \"features\": [{\n *            \"type\": \"Feature\",\n *            \"properties\": { \"name\": \"Null Island\" },\n *            \"geometry\": {\n *                \"type\": \"Point\",\n *                \"coordinates\": [ 0, 0 ]\n *            }\n *        }]\n *     }\n * });\n */\nfunction GeoJSONSource(id, options, dispatcher) {\n    options = options || {};\n    this.id = id;\n    this.dispatcher = dispatcher;\n\n    this._data = options.data;\n\n    if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n    if (options.type) this.type = options.type;\n\n    var scale = EXTENT / this.tileSize;\n\n    // sent to the worker, along with `url: ...` or `data: literal geojson`,\n    // so that it can load/parse/index the geojson data\n    // extending with `options.workerOptions` helps to make it easy for\n    // third-party sources to hack/reuse GeoJSONSource.\n    this.workerOptions = util.extend({\n        source: this.id,\n        cluster: options.cluster || false,\n        geojsonVtOptions: {\n            buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n            tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n            extent: EXTENT,\n            maxZoom: this.maxzoom\n        },\n        superclusterOptions: {\n            maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom - 1) || (this.maxzoom - 1),\n            extent: EXTENT,\n            radius: (options.clusterRadius || 50) * scale,\n            log: false\n        }\n    }, options.workerOptions);\n\n    this._updateWorkerData(function done(err) {\n        if (err) {\n            this.fire('error', {error: err});\n            return;\n        }\n        this.fire('load');\n    }.bind(this));\n}\n\nGeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */ {\n    // `type` is a property rather than a constant to make it easy for 3rd\n    // parties to use GeoJSONSource to build their own source types.\n    type: 'geojson',\n    minzoom: 0,\n    maxzoom: 18,\n    tileSize: 512,\n    isTileClipped: true,\n    reparseOverscaled: true,\n\n    onAdd: function (map) {\n        this.map = map;\n    },\n\n    /**\n     * Sets the GeoJSON data and re-renders the map.\n     *\n     * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.\n     * @returns {GeoJSONSource} this\n     */\n    setData: function(data) {\n        this._data = data;\n\n        this._updateWorkerData(function (err) {\n            if (err) {\n                return this.fire('error', { error: err });\n            }\n            this.fire('change');\n        }.bind(this));\n\n        return this;\n    },\n\n    /*\n     * Responsible for invoking WorkerSource's geojson.loadData target, which\n     * handles loading the geojson data and preparing to serve it up as tiles,\n     * using geojson-vt or supercluster as appropriate.\n     */\n    _updateWorkerData: function(callback) {\n        var options = util.extend({}, this.workerOptions);\n        var data = this._data;\n        if (typeof data === 'string') {\n            options.url = typeof window != 'undefined' ? urlResolve(window.location.href, data) : data;\n        } else {\n            options.data = JSON.stringify(data);\n        }\n\n        // target {this.type}.loadData rather than literally geojson.loadData,\n        // so that other geojson-like source types can easily reuse this\n        // implementation\n        this.workerID = this.dispatcher.send(this.type + '.loadData', options, function(err) {\n            this._loaded = true;\n            callback(err);\n\n        }.bind(this));\n    },\n\n    loadTile: function (tile, callback) {\n        var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n        var params = {\n            type: this.type,\n            uid: tile.uid,\n            coord: tile.coord,\n            zoom: tile.coord.z,\n            maxZoom: this.maxzoom,\n            tileSize: this.tileSize,\n            source: this.id,\n            overscaling: overscaling,\n            angle: this.map.transform.angle,\n            pitch: this.map.transform.pitch,\n            showCollisionBoxes: this.map.showCollisionBoxes\n        };\n\n        tile.workerID = this.dispatcher.send('load tile', params, function(err, data) {\n\n            tile.unloadVectorData(this.map.painter);\n\n            if (tile.aborted)\n                return;\n\n            if (err) {\n                return callback(err);\n            }\n\n            tile.loadVectorData(data, this.map.style);\n\n            if (tile.redoWhenDone) {\n                tile.redoWhenDone = false;\n                tile.redoPlacement(this);\n            }\n\n            return callback(null);\n\n        }.bind(this), this.workerID);\n    },\n\n    abortTile: function(tile) {\n        tile.aborted = true;\n    },\n\n    unloadTile: function(tile) {\n        tile.unloadVectorData(this.map.painter);\n        this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, function() {}, tile.workerID);\n    },\n\n    serialize: function() {\n        return {\n            type: this.type,\n            data: this._data\n        };\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/geojson_source.js\n// module id = 1368\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\n\nmodule.exports = ArrayGroup;\n\n/**\n * A class that manages vertex and element arrays for a range of features. It handles initialization,\n * serialization for transfer to the main thread, and certain intervening mutations.\n *\n * Array elements are broken into array groups based on inherent limits of WebGL. Within a group is:\n *\n * * A \"layout\" vertex array, with fixed layout, containing values calculated from layout properties.\n * * Zero, one, or two element arrays, with fixed layout, typically for eventual use in\n *   `gl.drawElements(gl.TRIANGLES, ...)`.\n * * Zero or more \"paint\" vertex arrays keyed by layer ID, each with a dynamic layout which depends\n *   on which paint properties of that layer use data-driven-functions (property functions or\n *   property-and-zoom functions). Values are calculated by evaluating those functions.\n *\n * @private\n */\nfunction ArrayGroup(arrayTypes) {\n    var LayoutVertexArrayType = arrayTypes.layoutVertexArrayType;\n    this.layoutVertexArray = new LayoutVertexArrayType();\n\n    var ElementArrayType = arrayTypes.elementArrayType;\n    if (ElementArrayType) this.elementArray = new ElementArrayType();\n\n    var ElementArrayType2 = arrayTypes.elementArrayType2;\n    if (ElementArrayType2) this.elementArray2 = new ElementArrayType2();\n\n    this.paintVertexArrays = util.mapObject(arrayTypes.paintVertexArrayTypes, function (PaintVertexArrayType) {\n        return new PaintVertexArrayType();\n    });\n}\n\n/**\n * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit\n * addressing of vertex buffers.\n * @private\n * @readonly\n */\nArrayGroup.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;\n\nArrayGroup.prototype.hasCapacityFor = function(numVertices) {\n    return this.layoutVertexArray.length + numVertices <= ArrayGroup.MAX_VERTEX_ARRAY_LENGTH;\n};\n\nArrayGroup.prototype.isEmpty = function() {\n    return this.layoutVertexArray.length === 0;\n};\n\nArrayGroup.prototype.trim = function() {\n    this.layoutVertexArray.trim();\n\n    if (this.elementArray) {\n        this.elementArray.trim();\n    }\n\n    if (this.elementArray2) {\n        this.elementArray2.trim();\n    }\n\n    for (var layerName in this.paintVertexArrays) {\n        this.paintVertexArrays[layerName].trim();\n    }\n};\n\nArrayGroup.prototype.serialize = function() {\n    return {\n        layoutVertexArray: this.layoutVertexArray.serialize(),\n        elementArray: this.elementArray && this.elementArray.serialize(),\n        elementArray2: this.elementArray2 && this.elementArray2.serialize(),\n        paintVertexArrays: util.mapObject(this.paintVertexArrays, function(array) {\n            return array.serialize();\n        })\n    };\n};\n\nArrayGroup.prototype.getTransferables = function(transferables) {\n    transferables.push(this.layoutVertexArray.arrayBuffer);\n\n    if (this.elementArray) {\n        transferables.push(this.elementArray.arrayBuffer);\n    }\n\n    if (this.elementArray2) {\n        transferables.push(this.elementArray2.arrayBuffer);\n    }\n\n    for (var layerName in this.paintVertexArrays) {\n        transferables.push(this.paintVertexArrays[layerName].arrayBuffer);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/array_group.js\n// module id = 1369\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Buffer = require('./buffer');\nvar VertexArrayObject = require('../render/vertex_array_object');\n\nmodule.exports = BufferGroup;\n\nfunction BufferGroup(arrayGroup, arrayTypes) {\n    this.layoutVertexBuffer = new Buffer(arrayGroup.layoutVertexArray,\n        arrayTypes.layoutVertexArrayType, Buffer.BufferType.VERTEX);\n\n    if (arrayGroup.elementArray) {\n        this.elementBuffer = new Buffer(arrayGroup.elementArray,\n            arrayTypes.elementArrayType, Buffer.BufferType.ELEMENT);\n    }\n\n    var vaos = this.vaos = {};\n    var secondVaos;\n\n    if (arrayGroup.elementArray2) {\n        this.elementBuffer2 = new Buffer(arrayGroup.elementArray2,\n            arrayTypes.elementArrayType2, Buffer.BufferType.ELEMENT);\n        secondVaos = this.secondVaos = {};\n    }\n\n    this.paintVertexBuffers = util.mapObject(arrayGroup.paintVertexArrays, function(array, name) {\n        vaos[name] = new VertexArrayObject();\n        if (arrayGroup.elementArray2) {\n            secondVaos[name] = new VertexArrayObject();\n        }\n        return new Buffer(array, arrayTypes.paintVertexArrayTypes[name], Buffer.BufferType.VERTEX);\n    });\n}\n\nBufferGroup.prototype.destroy = function(gl) {\n    this.layoutVertexBuffer.destroy(gl);\n    if (this.elementBuffer) {\n        this.elementBuffer.destroy(gl);\n    }\n    if (this.elementBuffer2) {\n        this.elementBuffer2.destroy(gl);\n    }\n    for (var n in this.paintVertexBuffers) {\n        this.paintVertexBuffers[n].destroy(gl);\n    }\n    for (var j in this.vaos) {\n        this.vaos[j].destroy(gl);\n    }\n    for (var k in this.secondVaos) {\n        this.secondVaos[k].destroy(gl);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/buffer_group.js\n// module id = 1370\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar earcut = require('earcut');\nvar classifyRings = require('../../util/classify_rings');\nvar EARCUT_MAX_RINGS = 500;\n\nmodule.exports = FillBucket;\n\nfunction FillBucket() {\n    Bucket.apply(this, arguments);\n}\n\nFillBucket.prototype = util.inherit(Bucket, {});\n\nFillBucket.prototype.programInterfaces = {\n    fill: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }]),\n        elementArrayType: new Bucket.ElementArrayType(1),\n        elementArrayType2: new Bucket.ElementArrayType(2),\n\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-color'\n        }, {\n            name: 'a_outline_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"fill-outline-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'fill-outline-color'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"fill-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'fill-opacity'\n        }]\n    }\n};\n\nFillBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature);\n    var polygons = classifyRings(lines, EARCUT_MAX_RINGS);\n\n    var startGroup = this.prepareArrayGroup('fill', 0);\n    var startIndex = startGroup.layoutVertexArray.length;\n\n    for (var i = 0; i < polygons.length; i++) {\n        this.addPolygon(polygons[i]);\n    }\n\n    this.populatePaintArrays('fill', {zoom: this.zoom}, feature.properties, startGroup, startIndex);\n};\n\nFillBucket.prototype.addPolygon = function(polygon) {\n    var numVertices = 0;\n    for (var k = 0; k < polygon.length; k++) {\n        numVertices += polygon[k].length;\n    }\n\n    var group = this.prepareArrayGroup('fill', numVertices);\n    var flattened = [];\n    var holeIndices = [];\n    var startIndex = group.layoutVertexArray.length;\n\n    for (var r = 0; r < polygon.length; r++) {\n        var ring = polygon[r];\n\n        if (r > 0) holeIndices.push(flattened.length / 2);\n\n        for (var v = 0; v < ring.length; v++) {\n            var vertex = ring[v];\n\n            var index = group.layoutVertexArray.emplaceBack(vertex.x, vertex.y);\n\n            if (v >= 1) {\n                group.elementArray2.emplaceBack(index - 1, index);\n            }\n\n            // convert to format used by earcut\n            flattened.push(vertex.x);\n            flattened.push(vertex.y);\n        }\n    }\n\n    var triangleIndices = earcut(flattened, holeIndices);\n\n    for (var i = 0; i < triangleIndices.length; i++) {\n        group.elementArray.emplaceBack(triangleIndices[i] + startIndex);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/bucket/fill_bucket.js\n// module id = 1371\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar EXTENT = Bucket.EXTENT;\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nvar EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nvar COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nvar SHARP_CORNER_OFFSET = 15;\n\n// The number of bits that is used to store the line distance in the buffer.\nvar LINE_DISTANCE_BUFFER_BITS = 15;\n\n// We don't have enough bits for the line distance as we'd like to have, so\n// use this value to scale the line distance (in tile units) down to a smaller\n// value. This lets us store longer distances while sacrificing precision.\nvar LINE_DISTANCE_SCALE = 1 / 2;\n\n// The maximum line distance, in tile units, that fits in the buffer.\nvar MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;\n\n\nmodule.exports = LineBucket;\n\n/**\n * @private\n */\nfunction LineBucket() {\n    Bucket.apply(this, arguments);\n}\n\nLineBucket.prototype = util.inherit(Bucket, {});\n\nLineBucket.prototype.addLineVertex = function(layoutVertexBuffer, point, extrude, tx, ty, dir, linesofar) {\n    return layoutVertexBuffer.emplaceBack(\n            // a_pos\n            (point.x << 1) | tx,\n            (point.y << 1) | ty,\n            // a_data\n            // add 128 to store an byte in an unsigned byte\n            Math.round(EXTRUDE_SCALE * extrude.x) + 128,\n            Math.round(EXTRUDE_SCALE * extrude.y) + 128,\n            // Encode the -1/0/1 direction value into the first two bits of .z of a_data.\n            // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make\n            // room for the direction value). The upper 8 bits of `linesofar` are placed in\n            // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that\n            // we can store longer distances while sacrificing precision.\n            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2),\n            (linesofar * LINE_DISTANCE_SCALE) >> 6);\n};\n\nLineBucket.prototype.programInterfaces = {\n    line: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 4,\n            type: 'Uint8'\n        }]),\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"line-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'line-color'\n        }],\n        elementArrayType: new Bucket.ElementArrayType()\n    }\n};\n\nLineBucket.prototype.addFeature = function(feature) {\n    var lines = loadGeometry(feature, LINE_DISTANCE_BUFFER_BITS);\n    for (var i = 0; i < lines.length; i++) {\n        this.addLine(\n            lines[i],\n            feature.properties,\n            this.layer.layout['line-join'],\n            this.layer.layout['line-cap'],\n            this.layer.layout['line-miter-limit'],\n            this.layer.layout['line-round-limit']\n        );\n    }\n};\n\nLineBucket.prototype.addLine = function(vertices, featureProperties, join, cap, miterLimit, roundLimit) {\n\n    var len = vertices.length;\n    // If the line has duplicate vertices at the end, adjust length to remove them.\n    while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) {\n        len--;\n    }\n\n    // a line must have at least two vertices\n    if (vertices.length < 2) return;\n\n    if (join === 'bevel') miterLimit = 1.05;\n\n    var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling));\n\n    var firstVertex = vertices[0],\n        lastVertex = vertices[len - 1],\n        closed = firstVertex.equals(lastVertex);\n\n    // we could be more precise, but it would only save a negligible amount of space\n    var group = this.prepareArrayGroup('line', len * 10);\n    var startIndex = group.layoutVertexArray.length;\n\n    // a line may not have coincident points\n    if (len === 2 && closed) return;\n\n    this.distance = 0;\n\n    var beginCap = cap,\n        endCap = closed ? 'butt' : cap,\n        startOfLine = true,\n        currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n    // the last three vertices added\n    this.e1 = this.e2 = this.e3 = -1;\n\n    if (closed) {\n        currentVertex = vertices[len - 2];\n        nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n    }\n\n    for (var i = 0; i < len; i++) {\n\n        nextVertex = closed && i === len - 1 ?\n            vertices[1] : // if the line is closed, we treat the last vertex like the first\n            vertices[i + 1]; // just the next vertex\n\n        // if two consecutive vertices exist, skip the current one\n        if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n        if (nextNormal) prevNormal = nextNormal;\n        if (currentVertex) prevVertex = currentVertex;\n\n        currentVertex = vertices[i];\n\n        // Calculate the normal towards the next vertex in this line. In case\n        // there is no next vertex, pretend that the line is continuing straight,\n        // meaning that we are just using the previous normal.\n        nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n        // If we still don't have a previous normal, this is the beginning of a\n        // non-closed line, so we're doing a straight \"join\".\n        prevNormal = prevNormal || nextNormal;\n\n        // Determine the normal of the join extrusion. It is the angle bisector\n        // of the segments between the previous line and the next line.\n        var joinNormal = prevNormal.add(nextNormal)._unit();\n\n        /*  joinNormal     prevNormal\n         *             ↖      ↑\n         *                .________. prevVertex\n         *                |\n         * nextNormal  ←  |  currentVertex\n         *                |\n         *     nextVertex !\n         *\n         */\n\n        // Calculate the length of the miter (the ratio of the miter to the width).\n        // Find the cosine of the angle between the next and join normals\n        // using dot product. The inverse of that is the miter length.\n        var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n        var miterLength = 1 / cosHalfAngle;\n\n        var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n\n        if (isSharpCorner && i > 0) {\n            var prevSegmentLength = currentVertex.dist(prevVertex);\n            if (prevSegmentLength > 2 * sharpCornerOffset) {\n                var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n                this.distance += newPrevVertex.dist(prevVertex);\n                this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false);\n                prevVertex = newPrevVertex;\n            }\n        }\n\n        // The join if a middle vertex, otherwise the cap.\n        var middleVertex = prevVertex && nextVertex;\n        var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n        if (middleVertex && currentJoin === 'round') {\n            if (miterLength < roundLimit) {\n                currentJoin = 'miter';\n            } else if (miterLength <= 2) {\n                currentJoin = 'fakeround';\n            }\n        }\n\n        if (currentJoin === 'miter' && miterLength > miterLimit) {\n            currentJoin = 'bevel';\n        }\n\n        if (currentJoin === 'bevel') {\n            // The maximum extrude length is 128 / 63 = 2 times the width of the line\n            // so if miterLength >= 2 we need to draw a different type of bevel where.\n            if (miterLength > 2) currentJoin = 'flipbevel';\n\n            // If the miterLength is really small and the line bevel wouldn't be visible,\n            // just draw a miter join to save a triangle.\n            if (miterLength < miterLimit) currentJoin = 'miter';\n        }\n\n        // Calculate how far along the line the currentVertex is\n        if (prevVertex) this.distance += currentVertex.dist(prevVertex);\n\n        if (currentJoin === 'miter') {\n\n            joinNormal._mult(miterLength);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n\n        } else if (currentJoin === 'flipbevel') {\n            // miter is too big, flip the direction to make a beveled join\n\n            if (miterLength > 100) {\n                // Almost parallel lines\n                joinNormal = nextNormal.clone();\n\n            } else {\n                var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n                var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n                joinNormal._perp()._mult(bevelLength * direction);\n            }\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false);\n            this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false);\n\n        } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n            var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n            var offset = -Math.sqrt(miterLength * miterLength - 1);\n            if (lineTurnsLeft) {\n                offsetB = 0;\n                offsetA = offset;\n            } else {\n                offsetA = 0;\n                offsetB = offset;\n            }\n\n            // Close previous segment with a bevel\n            if (!startOfLine) {\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false);\n            }\n\n            if (currentJoin === 'fakeround') {\n                // The join angle is sharp enough that a round join would be visible.\n                // Bevel joins fill the gap between segments with a single pie slice triangle.\n                // Create a round join by adding multiple pie slices. The join isn't actually round, but\n                // it looks like it is at the sizes we render lines at.\n\n                // Add more triangles for sharper angles.\n                // This math is just a good enough approximation. It isn't \"correct\".\n                var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n                var approxFractionalJoinNormal;\n\n                for (var m = 0; m < n; m++) {\n                    approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n\n                this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft);\n\n                for (var k = n - 1; k >= 0; k--) {\n                    approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n                    this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft);\n                }\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false);\n            }\n\n        } else if (currentJoin === 'butt') {\n            if (!startOfLine) {\n                // Close previous segment with a butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n            }\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n\n        } else if (currentJoin === 'square') {\n\n            if (!startOfLine) {\n                // Close previous segment with a square cap\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n            // Start next segment\n            if (nextVertex) {\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false);\n            }\n\n        } else if (currentJoin === 'round') {\n\n            if (!startOfLine) {\n                // Close previous segment with butt\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false);\n\n                // Add round cap or linejoin at end of segment\n                this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true);\n\n                // The segment is done. Unset vertices to disconnect segments.\n                this.e1 = this.e2 = -1;\n            }\n\n\n            // Start next segment with a butt\n            if (nextVertex) {\n                // Add round cap before first segment\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true);\n\n                this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false);\n            }\n        }\n\n        if (isSharpCorner && i < len - 1) {\n            var nextSegmentLength = currentVertex.dist(nextVertex);\n            if (nextSegmentLength > 2 * sharpCornerOffset) {\n                var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n                this.distance += newCurrentVertex.dist(currentVertex);\n                this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false);\n                currentVertex = newCurrentVertex;\n            }\n        }\n\n        startOfLine = false;\n    }\n\n    this.populatePaintArrays(\n        'line', {zoom: this.zoom},\n        featureProperties,\n        group,\n        startIndex\n    );\n};\n\n/**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beginning of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\nLineBucket.prototype.addCurrentVertex = function(currentVertex, distance, normal, endLeft, endRight, round) {\n    var tx = round ? 1 : 0;\n    var extrude;\n    var arrayGroup = this.arrayGroups.line[this.arrayGroups.line.length - 1];\n    var layoutVertexArray = arrayGroup.layoutVertexArray;\n    var elementArray = arrayGroup.elementArray;\n\n    extrude = normal.clone();\n    if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 0, endLeft, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    extrude = normal.mult(-1);\n    if (endRight) extrude._sub(normal.perp()._mult(endRight));\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 1, -endRight, distance);\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n    this.e1 = this.e2;\n    this.e2 = this.e3;\n\n    // There is a maximum \"distance along the line\" that we can store in the buffers.\n    // When we get close to the distance, reset it to zero and add the vertex again with\n    // a distance of zero. The max distance is determined by the number of bits we allocate\n    // to `linesofar`.\n    if (distance > MAX_LINE_DISTANCE / 2) {\n        this.distance = 0;\n        this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round);\n    }\n};\n\n/**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\nLineBucket.prototype.addPieSliceVertex = function(currentVertex, distance, extrude, lineTurnsLeft) {\n    var ty = lineTurnsLeft ? 1 : 0;\n    extrude = extrude.mult(lineTurnsLeft ? -1 : 1);\n    var arrayGroup = this.arrayGroups.line[this.arrayGroups.line.length - 1];\n    var layoutVertexArray = arrayGroup.layoutVertexArray;\n    var elementArray = arrayGroup.elementArray;\n\n    this.e3 = this.addLineVertex(layoutVertexArray, currentVertex, extrude, 0, ty, 0, distance);\n\n    if (this.e1 >= 0 && this.e2 >= 0) {\n        elementArray.emplaceBack(this.e1, this.e2, this.e3);\n    }\n\n    if (lineTurnsLeft) {\n        this.e2 = this.e3;\n    } else {\n        this.e1 = this.e3;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/bucket/line_bucket.js\n// module id = 1372\n// module chunks = 0 1","'use strict';\n\nvar Bucket = require('../bucket');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = CircleBucket;\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nfunction CircleBucket() {\n    Bucket.apply(this, arguments);\n}\n\nCircleBucket.prototype = util.inherit(Bucket, {});\n\nCircleBucket.prototype.addCircleVertex = function(layoutVertexArray, x, y, extrudeX, extrudeY) {\n    return layoutVertexArray.emplaceBack(\n            (x * 2) + ((extrudeX + 1) / 2),\n            (y * 2) + ((extrudeY + 1) / 2));\n};\n\nCircleBucket.prototype.programInterfaces = {\n    circle: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }]),\n        elementArrayType: new Bucket.ElementArrayType(),\n\n        paintAttributes: [{\n            name: 'a_color',\n            components: 4,\n            type: 'Uint8',\n            getValue: function(layer, globalProperties, featureProperties) {\n                return layer.getPaintValue(\"circle-color\", globalProperties, featureProperties);\n            },\n            multiplier: 255,\n            paintProperty: 'circle-color'\n        }, {\n            name: 'a_radius',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-radius\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-radius'\n        }, {\n            name: 'a_blur',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-blur\", globalProperties, featureProperties)];\n            },\n            multiplier: 10,\n            paintProperty: 'circle-blur'\n        }, {\n            name: 'a_opacity',\n            components: 1,\n            type: 'Uint16',\n            isLayerConstant: false,\n            getValue: function(layer, globalProperties, featureProperties) {\n                return [layer.getPaintValue(\"circle-opacity\", globalProperties, featureProperties)];\n            },\n            multiplier: 255,\n            paintProperty: 'circle-opacity'\n        }]\n    }\n};\n\nCircleBucket.prototype.addFeature = function(feature) {\n    var globalProperties = {zoom: this.zoom};\n    var geometries = loadGeometry(feature);\n\n    var startGroup = this.prepareArrayGroup('circle', 0);\n    var startIndex = startGroup.layoutVertexArray.length;\n\n    for (var j = 0; j < geometries.length; j++) {\n        for (var k = 0; k < geometries[j].length; k++) {\n\n            var x = geometries[j][k].x;\n            var y = geometries[j][k].y;\n\n            // Do not include points that are outside the tile boundaries.\n            if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n            // this geometry will be of the Point type, and we'll derive\n            // two triangles from it.\n            //\n            // ┌─────────┐\n            // │ 3     2 │\n            // │         │\n            // │ 0     1 │\n            // └─────────┘\n\n            var group = this.prepareArrayGroup('circle', 4);\n            var layoutVertexArray = group.layoutVertexArray;\n\n            var index = this.addCircleVertex(layoutVertexArray, x, y, -1, -1);\n            this.addCircleVertex(layoutVertexArray, x, y, 1, -1);\n            this.addCircleVertex(layoutVertexArray, x, y, 1, 1);\n            this.addCircleVertex(layoutVertexArray, x, y, -1, 1);\n\n            group.elementArray.emplaceBack(index, index + 1, index + 2);\n            group.elementArray.emplaceBack(index, index + 3, index + 2);\n        }\n    }\n\n    this.populatePaintArrays('circle', globalProperties, feature.properties, startGroup, startIndex);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/bucket/circle_bucket.js\n// module id = 1373\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nvar Bucket = require('../bucket');\nvar Anchor = require('../../symbol/anchor');\nvar getAnchors = require('../../symbol/get_anchors');\nvar resolveTokens = require('../../util/token');\nvar Quads = require('../../symbol/quads');\nvar Shaping = require('../../symbol/shaping');\nvar resolveText = require('../../symbol/resolve_text');\nvar mergeLines = require('../../symbol/mergelines');\nvar clipLine = require('../../symbol/clip_line');\nvar util = require('../../util/util');\nvar loadGeometry = require('../load_geometry');\nvar CollisionFeature = require('../../symbol/collision_feature');\nvar findPoleOfInaccessibility = require('../../util/find_pole_of_inaccessibility');\nvar classifyRings = require('../../util/classify_rings');\n\nvar shapeText = Shaping.shapeText;\nvar shapeIcon = Shaping.shapeIcon;\nvar getGlyphQuads = Quads.getGlyphQuads;\nvar getIconQuads = Quads.getIconQuads;\n\nvar EXTENT = Bucket.EXTENT;\n\nmodule.exports = SymbolBucket;\n\nfunction SymbolBucket(options) {\n    Bucket.apply(this, arguments);\n    this.showCollisionBoxes = options.showCollisionBoxes;\n    this.overscaling = options.overscaling;\n    this.collisionBoxArray = options.collisionBoxArray;\n    this.symbolQuadsArray = options.symbolQuadsArray;\n    this.symbolInstancesArray = options.symbolInstancesArray;\n\n    this.sdfIcons = options.sdfIcons;\n    this.iconsNeedLinear = options.iconsNeedLinear;\n    this.adjustedTextSize = options.adjustedTextSize;\n    this.adjustedIconSize = options.adjustedIconSize;\n    this.fontstack = options.fontstack;\n}\n\n// this constant is based on the size of the glyphQuadEndIndex and iconQuadEndIndex\n// in the symbol_instances StructArrayType\n// eg the max valid UInt16 is 65,535\nSymbolBucket.MAX_QUADS = 65535;\n\nSymbolBucket.prototype = util.inherit(Bucket, {});\n\nSymbolBucket.prototype.serialize = function() {\n    var serialized = Bucket.prototype.serialize.apply(this);\n    serialized.sdfIcons = this.sdfIcons;\n    serialized.iconsNeedLinear = this.iconsNeedLinear;\n    serialized.adjustedTextSize = this.adjustedTextSize;\n    serialized.adjustedIconSize = this.adjustedIconSize;\n    serialized.fontstack = this.fontstack;\n    return serialized;\n};\n\nvar layoutVertexArrayType = new Bucket.VertexArrayType([{\n    name: 'a_pos',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_offset',\n    components: 2,\n    type: 'Int16'\n}, {\n    name: 'a_texture_pos',\n    components: 2,\n    type: 'Uint16'\n}, {\n    name: 'a_data',\n    components: 4,\n    type: 'Uint8'\n}]);\n\nvar elementArrayType = new Bucket.ElementArrayType();\n\nfunction addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom, labelangle) {\n    return array.emplaceBack(\n            // a_pos\n            x,\n            y,\n\n            // a_offset\n            Math.round(ox * 64),\n            Math.round(oy * 64),\n\n            // a_texture_pos\n            tx / 4, // x coordinate of symbol on glyph atlas texture\n            ty / 4, // y coordinate of symbol on glyph atlas texture\n\n            // a_data\n            (labelminzoom || 0) * 10, // labelminzoom\n            labelangle, // labelangle\n            (minzoom || 0) * 10, // minzoom\n            Math.min(maxzoom || 25, 25) * 10); // maxzoom\n}\n\nSymbolBucket.prototype.addCollisionBoxVertex = function(layoutVertexArray, point, extrude, maxZoom, placementZoom) {\n    return layoutVertexArray.emplaceBack(\n            // pos\n            point.x,\n            point.y,\n            // extrude\n            Math.round(extrude.x),\n            Math.round(extrude.y),\n            // data\n            maxZoom * 10,\n            placementZoom * 10);\n};\n\nSymbolBucket.prototype.programInterfaces = {\n\n    glyph: {\n        layoutVertexArrayType: layoutVertexArrayType,\n        elementArrayType: elementArrayType\n    },\n\n    icon: {\n        layoutVertexArrayType: layoutVertexArrayType,\n        elementArrayType: elementArrayType\n    },\n\n    collisionBox: {\n        layoutVertexArrayType: new Bucket.VertexArrayType([{\n            name: 'a_pos',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_extrude',\n            components: 2,\n            type: 'Int16'\n        }, {\n            name: 'a_data',\n            components: 2,\n            type: 'Uint8'\n        }])\n    }\n};\n\nSymbolBucket.prototype.populateArrays = function(collisionTile, stacks, icons) {\n\n    // To reduce the number of labels that jump around when zooming we need\n    // to use a text-size value that is the same for all zoom levels.\n    // This calculates text-size at a high zoom level so that all tiles can\n    // use the same value when calculating anchor positions.\n    var zoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 };\n    this.adjustedTextMaxSize = this.layer.getLayoutValue('text-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedTextSize = this.layer.getLayoutValue('text-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n    this.adjustedIconMaxSize = this.layer.getLayoutValue('icon-size', {zoom: 18, zoomHistory: zoomHistory});\n    this.adjustedIconSize = this.layer.getLayoutValue('icon-size', {zoom: this.zoom + 1, zoomHistory: zoomHistory});\n\n    var tileSize = 512 * this.overscaling;\n    this.tilePixelRatio = EXTENT / tileSize;\n    this.compareText = {};\n    this.iconsNeedLinear = false;\n    this.symbolInstancesStartIndex = this.symbolInstancesArray.length;\n\n    var layout = this.layer.layout;\n    var features = this.features;\n    var textFeatures = this.textFeatures;\n\n    var horizontalAlign = 0.5,\n        verticalAlign = 0.5;\n\n    switch (layout['text-anchor']) {\n    case 'right':\n    case 'top-right':\n    case 'bottom-right':\n        horizontalAlign = 1;\n        break;\n    case 'left':\n    case 'top-left':\n    case 'bottom-left':\n        horizontalAlign = 0;\n        break;\n    }\n\n    switch (layout['text-anchor']) {\n    case 'bottom':\n    case 'bottom-right':\n    case 'bottom-left':\n        verticalAlign = 1;\n        break;\n    case 'top':\n    case 'top-right':\n    case 'top-left':\n        verticalAlign = 0;\n        break;\n    }\n\n    var justify = layout['text-justify'] === 'right' ? 1 :\n        layout['text-justify'] === 'left' ? 0 :\n        0.5;\n\n    var oneEm = 24;\n    var lineHeight = layout['text-line-height'] * oneEm;\n    var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n    var spacing = layout['text-letter-spacing'] * oneEm;\n    var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n    var fontstack = this.fontstack = layout['text-font'].join(',');\n\n    var geometries = [];\n    for (var g = 0; g < features.length; g++) {\n        geometries.push(loadGeometry(features[g]));\n    }\n\n    if (layout['symbol-placement'] === 'line') {\n        // Merge adjacent lines with the same text to improve labelling.\n        // It's better to place labels on one long line than on many short segments.\n        var merged = mergeLines(features, textFeatures, geometries);\n\n        geometries = merged.geometries;\n        features = merged.features;\n        textFeatures = merged.textFeatures;\n    }\n\n    var shapedText, shapedIcon;\n\n    for (var k = 0; k < features.length; k++) {\n        if (!geometries[k]) continue;\n\n        if (textFeatures[k]) {\n            shapedText = shapeText(textFeatures[k], stacks[fontstack], maxWidth,\n                    lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset);\n        } else {\n            shapedText = null;\n        }\n\n        if (layout['icon-image']) {\n            var iconName = resolveTokens(features[k].properties, layout['icon-image']);\n            var image = icons[iconName];\n            shapedIcon = shapeIcon(image, layout);\n\n            if (image) {\n                if (this.sdfIcons === undefined) {\n                    this.sdfIcons = image.sdf;\n                } else if (this.sdfIcons !== image.sdf) {\n                    util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n                }\n                if (image.pixelRatio !== 1) {\n                    this.iconsNeedLinear = true;\n                } else if (layout['icon-rotate'] !== 0 || !this.layer.isLayoutValueFeatureConstant('icon-rotate')) {\n                    this.iconsNeedLinear = true;\n                }\n            }\n        } else {\n            shapedIcon = null;\n        }\n\n        if (shapedText || shapedIcon) {\n            this.addFeature(geometries[k], shapedText, shapedIcon, features[k]);\n        }\n    }\n    this.symbolInstancesEndIndex = this.symbolInstancesArray.length;\n    this.placeFeatures(collisionTile, this.showCollisionBoxes);\n\n    this.trimArrays();\n};\n\nSymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon, feature) {\n    var layout = this.layer.layout;\n\n    var glyphSize = 24;\n\n    var fontScale = this.adjustedTextSize / glyphSize,\n        textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize,\n        textBoxScale = this.tilePixelRatio * fontScale,\n        textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize,\n        iconBoxScale = this.tilePixelRatio * this.adjustedIconSize,\n        symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'],\n        avoidEdges = layout['symbol-avoid-edges'],\n        textPadding = layout['text-padding'] * this.tilePixelRatio,\n        iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n        textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n        textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n        mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n            layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n        symbolPlacement = layout['symbol-placement'],\n        isLine = symbolPlacement === 'line',\n        textRepeatDistance = symbolMinDistance / 2;\n\n    var list = null;\n    if (isLine) {\n        list = clipLine(lines, 0, 0, EXTENT, EXTENT);\n    } else {\n        // Only care about looping through the outer rings\n        list = classifyRings(lines, 0);\n    }\n\n    for (var i = 0; i < list.length; i++) {\n        var anchors = null;\n        // At this point it is a list of points for a line or a list of polygon rings\n        var pointsOrRings = list[i];\n        var line = null;\n\n        // Calculate the anchor points around which you want to place labels\n        if (isLine) {\n            line = pointsOrRings;\n            anchors = getAnchors(\n                line,\n                symbolMinDistance,\n                textMaxAngle,\n                shapedText,\n                shapedIcon,\n                glyphSize,\n                textMaxBoxScale,\n                this.overscaling,\n                EXTENT\n            );\n        } else {\n            line = pointsOrRings[0];\n            anchors = this.findPolygonAnchors(pointsOrRings);\n        }\n\n\n        // Here line is a list of points that is either the outer ring of a polygon or just a line\n\n        // For each potential label, create the placement features used to check for collisions, and the quads use for rendering.\n        for (var j = 0, len = anchors.length; j < len; j++) {\n            var anchor = anchors[j];\n\n            if (shapedText && isLine) {\n                if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n                    continue;\n                }\n            }\n\n            var inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT);\n\n            if (avoidEdges && !inside) continue;\n\n            // Normally symbol layers are drawn across tile boundaries. Only symbols\n            // with their anchors within the tile boundaries are added to the buffers\n            // to prevent symbols from being drawn twice.\n            //\n            // Symbols in layers with overlap are sorted in the y direction so that\n            // symbols lower on the canvas are drawn on top of symbols near the top.\n            // To preserve this order across tile boundaries these symbols can't\n            // be drawn across tile boundaries. Instead they need to be included in\n            // the buffers for both tiles and clipped to tile boundaries at draw time.\n            var addToBuffers = inside || mayOverlap;\n            this.addSymbolInstance(anchor, line, shapedText, shapedIcon, this.layer,\n                addToBuffers, this.symbolInstancesArray.length, this.collisionBoxArray, feature.index, this.sourceLayerIndex, this.index,\n                textBoxScale, textPadding, textAlongLine,\n                iconBoxScale, iconPadding, iconAlongLine, {zoom: this.zoom}, feature.properties);\n        }\n    }\n};\n\nSymbolBucket.prototype.findPolygonAnchors = function(polygonRings) {\n\n    var outerRing = polygonRings[0];\n    if (outerRing.length === 0) {\n        return [];\n    } else if (outerRing.length < 3 || !util.isClosedPolygon(outerRing)) {\n        return [ new Anchor(outerRing[0].x, outerRing[0].y, 0) ];\n    }\n\n    var anchors = null;\n    // 16 here represents 2 pixels\n    var poi = findPoleOfInaccessibility(polygonRings, 16);\n    anchors = [ new Anchor(poi.x, poi.y, 0) ];\n\n    return anchors;\n};\n\nSymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) {\n    var compareText = this.compareText;\n    if (!(text in compareText)) {\n        compareText[text] = [];\n    } else {\n        var otherAnchors = compareText[text];\n        for (var k = otherAnchors.length - 1; k >= 0; k--) {\n            if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n                // If it's within repeatDistance of one anchor, stop looking\n                return true;\n            }\n        }\n    }\n    // If anchor is not within repeatDistance of any other anchor, add to array\n    compareText[text].push(anchor);\n    return false;\n};\n\nSymbolBucket.prototype.placeFeatures = function(collisionTile, showCollisionBoxes) {\n    this.recalculateStyleLayers();\n\n    // Calculate which labels can be shown and when they can be shown and\n    // create the bufers used for rendering.\n\n    this.createArrays();\n\n    var layout = this.layer.layout;\n\n    var maxScale = collisionTile.maxScale;\n\n    var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n    var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n    var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n        layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n    // Sort symbols by their y position on the canvas so that the lower symbols\n    // are drawn on top of higher symbols.\n    // Don't sort symbols that won't overlap because it isn't necessary and\n    // because it causes more labels to pop in and out when rotating.\n    if (mayOverlap) {\n        // Only need the symbol instances from the current tile to sort, so convert those instances into an array\n        // of `StructType`s to enable sorting\n        var symbolInstancesStructTypeArray = this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex, this.symbolInstancesEndIndex);\n\n        var angle = collisionTile.angle;\n\n        var sin = Math.sin(angle),\n            cos = Math.cos(angle);\n\n        this.sortedSymbolInstances = symbolInstancesStructTypeArray.sort(function(a, b) {\n            var aRotated = (sin * a.anchorPointX + cos * a.anchorPointY) | 0;\n            var bRotated = (sin * b.anchorPointX + cos * b.anchorPointY) | 0;\n            return (aRotated - bRotated) || (b.index - a.index);\n        });\n    }\n\n    for (var p = this.symbolInstancesStartIndex; p < this.symbolInstancesEndIndex; p++) {\n        var symbolInstance = this.sortedSymbolInstances ? this.sortedSymbolInstances[p - this.symbolInstancesStartIndex] : this.symbolInstancesArray.get(p);\n        var textCollisionFeature = {\n            boxStartIndex: symbolInstance.textBoxStartIndex,\n            boxEndIndex: symbolInstance.textBoxEndIndex\n        };\n        var iconCollisionFeature = {\n            boxStartIndex: symbolInstance.iconBoxStartIndex,\n            boxEndIndex: symbolInstance.iconBoxEndIndex\n        };\n\n        var hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex);\n        var hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex);\n\n        var iconWithoutText = layout['text-optional'] || !hasText,\n            textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n        // Calculate the scales at which the text and icon can be placed without collision.\n\n        var glyphScale = hasText ?\n            collisionTile.placeCollisionFeature(textCollisionFeature,\n\t\t\t\t\tlayout['text-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n        var iconScale = hasIcon ?\n            collisionTile.placeCollisionFeature(iconCollisionFeature,\n                    layout['icon-allow-overlap'], layout['symbol-avoid-edges']) :\n            collisionTile.minScale;\n\n\n        // Combine the scales for icons and text.\n\n        if (!iconWithoutText && !textWithoutIcon) {\n            iconScale = glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!textWithoutIcon && glyphScale) {\n            glyphScale = Math.max(iconScale, glyphScale);\n        } else if (!iconWithoutText && iconScale) {\n            iconScale = Math.max(iconScale, glyphScale);\n        }\n\n\n        // Insert final placement into collision tree and add glyphs/icons to buffers\n\n        if (hasText) {\n            collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']);\n            if (glyphScale <= maxScale) {\n                this.addSymbols('glyph', symbolInstance.glyphQuadStartIndex, symbolInstance.glyphQuadEndIndex, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle);\n            }\n        }\n\n        if (hasIcon) {\n            collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']);\n            if (iconScale <= maxScale) {\n                this.addSymbols('icon', symbolInstance.iconQuadStartIndex, symbolInstance.iconQuadEndIndex, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle);\n            }\n        }\n\n    }\n\n    if (showCollisionBoxes) this.addToDebugBuffers(collisionTile);\n};\n\nSymbolBucket.prototype.addSymbols = function(programName, quadsStart, quadsEnd, scale, keepUpright, alongLine, placementAngle) {\n\n    var group = this.prepareArrayGroup(programName, 4 * (quadsEnd - quadsStart));\n\n    var elementArray = group.elementArray;\n    var layoutVertexArray = group.layoutVertexArray;\n\n    var zoom = this.zoom;\n    var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n    for (var k = quadsStart; k < quadsEnd; k++) {\n\n        var symbol = this.symbolQuadsArray.get(k).SymbolQuad;\n\n        // drop upside down versions of glyphs\n        var a = (symbol.anchorAngle + placementAngle + Math.PI) % (Math.PI * 2);\n        if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n        var tl = symbol.tl,\n            tr = symbol.tr,\n            bl = symbol.bl,\n            br = symbol.br,\n            tex = symbol.tex,\n            anchorPoint = symbol.anchorPoint,\n\n            minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom),\n            maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n        if (maxZoom <= minZoom) continue;\n\n        // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n        if (minZoom === placementZoom) minZoom = 0;\n\n        // Encode angle of glyph\n        var glyphAngle = Math.round((symbol.glyphAngle / (Math.PI * 2)) * 256);\n\n        var index = addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n        addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n\n        elementArray.emplaceBack(index, index + 1, index + 2);\n        elementArray.emplaceBack(index + 1, index + 2, index + 3);\n    }\n\n};\n\nSymbolBucket.prototype.updateIcons = function(icons) {\n    this.recalculateStyleLayers();\n    var iconValue = this.layer.layout['icon-image'];\n    if (!iconValue) return;\n\n    for (var i = 0; i < this.features.length; i++) {\n        var iconName = resolveTokens(this.features[i].properties, iconValue);\n        if (iconName)\n            icons[iconName] = true;\n    }\n};\n\nSymbolBucket.prototype.updateFont = function(stacks) {\n    this.recalculateStyleLayers();\n    var fontName = this.layer.layout['text-font'],\n        stack = stacks[fontName] = stacks[fontName] || {};\n\n    this.textFeatures = resolveText(this.features, this.layer.layout, stack);\n};\n\nSymbolBucket.prototype.addToDebugBuffers = function(collisionTile) {\n    var group = this.prepareArrayGroup('collisionBox', 0);\n    var layoutVertexArray = group.layoutVertexArray;\n    var angle = -collisionTile.angle;\n    var yStretch = collisionTile.yStretch;\n\n    for (var j = this.symbolInstancesStartIndex; j < this.symbolInstancesEndIndex; j++) {\n        var symbolInstance = this.symbolInstancesArray.get(j);\n        symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex};\n        symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex};\n\n        for (var i = 0; i < 2; i++) {\n            var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n            if (!feature) continue;\n\n            for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {\n                var box = this.collisionBoxArray.get(b);\n                var anchorPoint = box.anchorPoint;\n\n                var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n                var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n                var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n                var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n                var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n                var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom);\n                this.addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom);\n            }\n        }\n    }\n};\n\nSymbolBucket.prototype.addSymbolInstance = function(anchor, line, shapedText, shapedIcon, layer, addToBuffers, index, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex,\n    textBoxScale, textPadding, textAlongLine,\n    iconBoxScale, iconPadding, iconAlongLine, globalProperties, featureProperties) {\n\n    var glyphQuadStartIndex, glyphQuadEndIndex, iconQuadStartIndex, iconQuadEndIndex, textCollisionFeature, iconCollisionFeature, glyphQuads, iconQuads;\n    if (shapedText) {\n        glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layer, textAlongLine) : [];\n        textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedText, textBoxScale, textPadding, textAlongLine, false);\n    }\n\n    glyphQuadStartIndex = this.symbolQuadsArray.length;\n    if (glyphQuads && glyphQuads.length) {\n        for (var i = 0; i < glyphQuads.length; i++) {\n            this.addSymbolQuad(glyphQuads[i]);\n        }\n    }\n    glyphQuadEndIndex = this.symbolQuadsArray.length;\n\n    var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n    if (shapedIcon) {\n        iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layer, iconAlongLine, shapedText, globalProperties, featureProperties) : [];\n        iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true);\n    }\n\n    iconQuadStartIndex = this.symbolQuadsArray.length;\n    if (iconQuads && iconQuads.length === 1) {\n        this.addSymbolQuad(iconQuads[0]);\n    }\n    iconQuadEndIndex = this.symbolQuadsArray.length;\n\n    var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n    var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n    if (iconQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce(\"Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n    if (glyphQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n\n    return this.symbolInstancesArray.emplaceBack(\n        textBoxStartIndex,\n        textBoxEndIndex,\n        iconBoxStartIndex,\n        iconBoxEndIndex,\n        glyphQuadStartIndex,\n        glyphQuadEndIndex,\n        iconQuadStartIndex,\n        iconQuadEndIndex,\n        anchor.x,\n        anchor.y,\n        index);\n};\n\nSymbolBucket.prototype.addSymbolQuad = function(symbolQuad) {\n    return this.symbolQuadsArray.emplaceBack(\n        // anchorPoints\n        symbolQuad.anchorPoint.x,\n        symbolQuad.anchorPoint.y,\n        // corners\n        symbolQuad.tl.x,\n        symbolQuad.tl.y,\n        symbolQuad.tr.x,\n        symbolQuad.tr.y,\n        symbolQuad.bl.x,\n        symbolQuad.bl.y,\n        symbolQuad.br.x,\n        symbolQuad.br.y,\n        // texture\n        symbolQuad.tex.h,\n        symbolQuad.tex.w,\n        symbolQuad.tex.x,\n        symbolQuad.tex.y,\n        //angle\n        symbolQuad.anchorAngle,\n        symbolQuad.glyphAngle,\n        // scales\n        symbolQuad.maxScale,\n        symbolQuad.minScale);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/bucket/symbol_bucket.js\n// module id = 1374\n// module chunks = 0 1","'use strict';\n\nvar interpolate = require('../util/interpolate');\nvar Anchor = require('../symbol/anchor');\nvar checkMaxAngle = require('./check_max_angle');\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {\n\n    // Resample a line to get anchor points for labels and check that each\n    // potential label passes text-max-angle check and has enough froom to fit\n    // on the line.\n\n    var angleWindowSize = shapedText ?\n        3 / 5 * glyphSize * boxScale :\n        0;\n\n    var labelLength = Math.max(\n        shapedText ? shapedText.right - shapedText.left : 0,\n        shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n    // Is the line continued from outside the tile boundary?\n    var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n    // Is the label long, relative to the spacing?\n    // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n    if (spacing - labelLength * boxScale  < spacing / 4) {\n        spacing = labelLength * boxScale + spacing / 4;\n    }\n\n    // Offset the first anchor by:\n    // Either half the label length plus a fixed extra offset if the line is not continued\n    // Or half the spacing if the line is continued.\n\n    // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n    var fixedExtraOffset = glyphSize * 2;\n\n    var offset = !isLineContinued ?\n        ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n        (spacing / 2 * overscaling) % spacing;\n\n    return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {\n\n    var halfLabelLength = labelLength / 2;\n    var lineLength = 0;\n    for (var k = 0; k < line.length - 1; k++) {\n        lineLength += line[k].dist(line[k + 1]);\n    }\n\n    var distance = 0,\n        markedDistance = offset - spacing;\n\n    var anchors = [];\n\n    for (var i = 0; i < line.length - 1; i++) {\n\n        var a = line[i],\n            b = line[i + 1];\n\n        var segmentDist = a.dist(b),\n            angle = b.angleTo(a);\n\n        while (markedDistance + spacing < distance + segmentDist) {\n            markedDistance += spacing;\n\n            var t = (markedDistance - distance) / segmentDist,\n                x = interpolate(a.x, b.x, t),\n                y = interpolate(a.y, b.y, t);\n\n            // Check that the point is within the tile boundaries and that\n            // the label would fit before the beginning and end of the line\n            // if placed at this point.\n            if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n                    markedDistance - halfLabelLength >= 0 &&\n                    markedDistance + halfLabelLength <= lineLength) {\n                var anchor = new Anchor(x, y, angle, i)._round();\n\n                if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n                    anchors.push(anchor);\n                }\n            }\n        }\n\n        distance += segmentDist;\n    }\n\n    if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n        // The first attempt at finding anchors at which labels can be placed failed.\n        // Try again, but this time just try placing one anchor at the middle of the line.\n        // This has the most effect for short lines in overscaled tiles, since the\n        // initial offset used in overscaled tiles is calculated to align labels with positions in\n        // parent tiles instead of placing the label as close to the beginning as possible.\n        anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n    }\n\n    return anchors;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/get_anchors.js\n// module id = 1375\n// module chunks = 0 1","'use strict';\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n    // horizontal labels always pass\n    if (anchor.segment === undefined) return true;\n\n    var p = anchor;\n    var index = anchor.segment + 1;\n    var anchorDistance = 0;\n\n    // move backwards along the line to the first segment the label appears on\n    while (anchorDistance > -labelLength / 2) {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        if (index < 0) return false;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    }\n\n    anchorDistance += line[index].dist(line[index + 1]);\n    index++;\n\n    // store recent corners and their total angle difference\n    var recentCorners = [];\n    var recentAngleDelta = 0;\n\n    // move forwards by the length of the label and check angles along the way\n    while (anchorDistance < labelLength / 2) {\n        var prev = line[index - 1];\n        var current = line[index];\n        var next = line[index + 1];\n\n        // there isn't enough room for the label before the end of the line\n        if (!next) return false;\n\n        var angleDelta = prev.angleTo(current) - current.angleTo(next);\n        // restrict angle to -pi..pi range\n        angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n        recentCorners.push({\n            distance: anchorDistance,\n            angleDelta: angleDelta\n        });\n        recentAngleDelta += angleDelta;\n\n        // remove corners that are far enough away from the list of recent anchors\n        while (anchorDistance - recentCorners[0].distance > windowSize) {\n            recentAngleDelta -= recentCorners.shift().angleDelta;\n        }\n\n        // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n        if (recentAngleDelta > maxAngle) return false;\n\n        index++;\n        anchorDistance += current.dist(next);\n    }\n\n    // no part of the line had an angle greater than the maximum allowed. check passes.\n    return true;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/check_max_angle.js\n// module id = 1376\n// module chunks = 0 1","'use strict';\n\nmodule.exports = {\n    shapeText: shapeText,\n    shapeIcon: shapeIcon\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph) {\n    this.codePoint = codePoint;\n    this.x = x;\n    this.y = y;\n    this.glyph = glyph;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right) {\n    this.positionedGlyphs = positionedGlyphs;\n    this.text = text;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) {\n\n    var positionedGlyphs = [];\n    var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]);\n\n    // the y offset *should* be part of the font metadata\n    var yOffset = -17;\n\n    var x = 0;\n    var y = yOffset;\n\n    for (var i = 0; i < text.length; i++) {\n        var codePoint = text.charCodeAt(i);\n        var glyph = glyphs[codePoint];\n\n        if (!glyph) continue;\n\n        positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph));\n        x += glyph.advance + spacing;\n    }\n\n    if (!positionedGlyphs.length) return false;\n\n    linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate);\n\n    return shaping;\n}\n\nvar invisible = {\n    0x20:   true, // space\n    0x200b: true  // zero-width space\n};\n\nvar breakable = {\n    0x20:   true, // space\n    0x26:   true, // ampersand\n    0x2b:   true, // plus sign\n    0x2d:   true, // hyphen-minus\n    0x2f:   true, // solidus\n    0xad:   true, // soft hyphen\n    0xb7:   true, // middle dot\n    0x200b: true, // zero-width space\n    0x2010: true, // hyphen\n    0x2013: true  // en dash\n};\n\nfunction linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify, translate) {\n    var lastSafeBreak = null;\n\n    var lengthBeforeCurrentLine = 0;\n    var lineStartIndex = 0;\n    var line = 0;\n\n    var maxLineLength = 0;\n\n    var positionedGlyphs = shaping.positionedGlyphs;\n\n    if (maxWidth) {\n        for (var i = 0; i < positionedGlyphs.length; i++) {\n            var positionedGlyph = positionedGlyphs[i];\n\n            positionedGlyph.x -= lengthBeforeCurrentLine;\n            positionedGlyph.y += lineHeight * line;\n\n            if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) {\n\n                var lineLength = positionedGlyphs[lastSafeBreak + 1].x;\n                maxLineLength = Math.max(lineLength, maxLineLength);\n\n                for (var k = lastSafeBreak + 1; k <= i; k++) {\n                    positionedGlyphs[k].y += lineHeight;\n                    positionedGlyphs[k].x -= lineLength;\n                }\n\n                if (justify) {\n                    // Collapse invisible characters.\n                    var lineEnd = lastSafeBreak;\n                    if (invisible[positionedGlyphs[lastSafeBreak].codePoint]) {\n                        lineEnd--;\n                    }\n\n                    justifyLine(positionedGlyphs, glyphs, lineStartIndex, lineEnd, justify);\n                }\n\n                lineStartIndex = lastSafeBreak + 1;\n                lastSafeBreak = null;\n                lengthBeforeCurrentLine += lineLength;\n                line++;\n            }\n\n            if (breakable[positionedGlyph.codePoint]) {\n                lastSafeBreak = i;\n            }\n        }\n    }\n\n    var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1];\n    var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance;\n    maxLineLength = Math.max(maxLineLength, lastLineLength);\n\n    var height = (line + 1) * lineHeight;\n\n    justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n    align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate);\n\n    // Calculate the bounding box\n    shaping.top += -verticalAlign * height;\n    shaping.bottom = shaping.top + height;\n    shaping.left += -horizontalAlign * maxLineLength;\n    shaping.right = shaping.left + maxLineLength;\n}\n\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n    var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n    var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n    for (var j = start; j <= end; j++) {\n        positionedGlyphs[j].x -= lineIndent;\n    }\n\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line, translate) {\n    var shiftX = (justify - horizontalAlign) * maxLineLength + translate[0];\n    var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight + translate[1];\n\n    for (var j = 0; j < positionedGlyphs.length; j++) {\n        positionedGlyphs[j].x += shiftX;\n        positionedGlyphs[j].y += shiftY;\n    }\n}\n\n\nfunction shapeIcon(image, layout) {\n    if (!image || !image.rect) return null;\n\n    var dx = layout['icon-offset'][0];\n    var dy = layout['icon-offset'][1];\n    var x1 = dx - image.width / 2;\n    var x2 = x1 + image.width;\n    var y1 = dy - image.height / 2;\n    var y2 = y1 + image.height;\n\n    return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n    this.image = image;\n    this.top = top;\n    this.bottom = bottom;\n    this.left = left;\n    this.right = right;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/shaping.js\n// module id = 1377\n// module chunks = 0 1","'use strict';\n\nvar resolveTokens = require('../util/token');\n\nmodule.exports = resolveText;\n\n/**\n * For an array of features determine what glyphs need to be loaded\n * and apply any text preprocessing. The remaining users of text should\n * use the `textFeatures` key returned by this function rather than accessing\n * feature text directly.\n * @private\n */\nfunction resolveText(features, layoutProperties, codepoints) {\n    var textFeatures = [];\n\n    for (var i = 0, fl = features.length; i < fl; i++) {\n        var text = resolveTokens(features[i].properties, layoutProperties['text-field']);\n        if (!text) {\n            textFeatures[i] = null;\n            continue;\n        }\n        text = text.toString();\n\n        var transform = layoutProperties['text-transform'];\n        if (transform === 'uppercase') {\n            text = text.toLocaleUpperCase();\n        } else if (transform === 'lowercase') {\n            text = text.toLocaleLowerCase();\n        }\n\n        for (var j = 0; j < text.length; j++) {\n            codepoints[text.charCodeAt(j)] = true;\n        }\n\n        // Track indexes of features with text.\n        textFeatures[i] = text;\n    }\n\n    return textFeatures;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/resolve_text.js\n// module id = 1378\n// module chunks = 0 1","'use strict';\n\nmodule.exports = function (features, textFeatures, geometries) {\n\n    var leftIndex = {},\n        rightIndex = {},\n        mergedFeatures = [],\n        mergedGeom = [],\n        mergedTexts = [],\n        mergedIndex = 0,\n        k;\n\n    function add(k) {\n        mergedFeatures.push(features[k]);\n        mergedGeom.push(geometries[k]);\n        mergedTexts.push(textFeatures[k]);\n        mergedIndex++;\n    }\n\n    function mergeFromRight(leftKey, rightKey, geom) {\n        var i = rightIndex[leftKey];\n        delete rightIndex[leftKey];\n        rightIndex[rightKey] = i;\n\n        mergedGeom[i][0].pop();\n        mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]);\n        return i;\n    }\n\n    function mergeFromLeft(leftKey, rightKey, geom) {\n        var i = leftIndex[rightKey];\n        delete leftIndex[rightKey];\n        leftIndex[leftKey] = i;\n\n        mergedGeom[i][0].shift();\n        mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]);\n        return i;\n    }\n\n    function getKey(text, geom, onRight) {\n        var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n        return text + ':' + point.x + ':' + point.y;\n    }\n\n    for (k = 0; k < features.length; k++) {\n        var geom = geometries[k],\n            text = textFeatures[k];\n\n        if (!text) {\n            add(k);\n            continue;\n        }\n\n        var leftKey = getKey(text, geom),\n            rightKey = getKey(text, geom, true);\n\n        if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n            // found lines with the same text adjacent to both ends of the current line, merge all three\n            var j = mergeFromLeft(leftKey, rightKey, geom);\n            var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]);\n\n            delete leftIndex[leftKey];\n            delete rightIndex[rightKey];\n\n            rightIndex[getKey(text, mergedGeom[i], true)] = i;\n            mergedGeom[j] = null;\n\n        } else if (leftKey in rightIndex) {\n            // found mergeable line adjacent to the start of the current line, merge\n            mergeFromRight(leftKey, rightKey, geom);\n\n        } else if (rightKey in leftIndex) {\n            // found mergeable line adjacent to the end of the current line, merge\n            mergeFromLeft(leftKey, rightKey, geom);\n\n        } else {\n            // no adjacent lines, add as a new item\n            add(k);\n            leftIndex[leftKey] = mergedIndex - 1;\n            rightIndex[rightKey] = mergedIndex - 1;\n        }\n    }\n\n    return {\n        features: mergedFeatures,\n        textFeatures: mergedTexts,\n        geometries: mergedGeom\n    };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/mergelines.js\n// module id = 1379\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array<Array<Point>>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array<Array<Point>>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n    var clippedLines = [];\n\n    for (var l = 0; l < lines.length; l++) {\n        var line = lines[l];\n        var clippedLine;\n\n        for (var i = 0; i < line.length - 1; i++) {\n            var p0 = line[i];\n            var p1 = line[i + 1];\n\n\n            if (p0.x < x1 && p1.x < x1) {\n                continue;\n            } else if (p0.x < x1) {\n                p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x < x1) {\n                p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y < y1 && p1.y < y1) {\n                continue;\n            } else if (p0.y < y1) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            } else if (p1.y < y1) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n            }\n\n            if (p0.x >= x2 && p1.x >= x2) {\n                continue;\n            } else if (p0.x >= x2) {\n                p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            } else if (p1.x >= x2) {\n                p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n            }\n\n            if (p0.y >= y2 && p1.y >= y2) {\n                continue;\n            } else if (p0.y >= y2) {\n                p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            } else if (p1.y >= y2) {\n                p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n            }\n\n            if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n                clippedLine = [p0];\n                clippedLines.push(clippedLine);\n            }\n\n            clippedLine.push(p1);\n        }\n    }\n\n    return clippedLines;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/clip_line.js\n// module id = 1380\n// module chunks = 0 1","'use strict';\n\nmodule.exports = CollisionFeature;\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @class CollisionFeature\n * @param {Array<Point>} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {Array<string>} layerIDs The IDs of the layers that this CollisionFeature is a part of.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n *\n * @private\n */\nfunction CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) {\n\n    var y1 = shaped.top * boxScale - padding;\n    var y2 = shaped.bottom * boxScale + padding;\n    var x1 = shaped.left * boxScale - padding;\n    var x2 = shaped.right * boxScale + padding;\n\n    this.boxStartIndex = collisionBoxArray.length;\n\n    if (alignLine) {\n\n        var height = y2 - y1;\n        var length = x2 - x1;\n\n        if (height > 0) {\n            // set minimum box height to avoid very many small labels\n            height = Math.max(10 * boxScale, height);\n\n            if (straight) {\n                // used for icon labels that are aligned with the line, but don't curve along it\n                var vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length);\n                var straightLine = [anchor.sub(vector), anchor.add(vector)];\n                this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            } else {\n                // used for text labels that curve along a line\n                this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n            }\n        }\n\n    } else {\n        collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    this.boxEndIndex = collisionBoxArray.length;\n}\n\n/**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array<Point>} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\nCollisionFeature.prototype._addLineCollisionBoxes = function(collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) {\n    var step = boxSize / 2;\n    var nBoxes = Math.floor(labelLength / step);\n\n    // offset the center of the first box by half a box so that the edge of the\n    // box is at the edge of the label.\n    var firstBoxOffset = -boxSize / 2;\n\n    var bboxes = this.boxes;\n\n    var p = anchor;\n    var index = segment + 1;\n    var anchorDistance = firstBoxOffset;\n\n    // move backwards along the line to the first segment the label appears on\n    do {\n        index--;\n\n        // there isn't enough room for the label after the beginning of the line\n        // checkMaxAngle should have already caught this\n        if (index < 0) return bboxes;\n\n        anchorDistance -= line[index].dist(p);\n        p = line[index];\n    } while (anchorDistance > -labelLength / 2);\n\n    var segmentLength = line[index].dist(line[index + 1]);\n\n    for (var i = 0; i < nBoxes; i++) {\n        // the distance the box will be from the anchor\n        var boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n        // the box is not on the current segment. Move to the next segment.\n        while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n            anchorDistance += segmentLength;\n            index++;\n\n            // There isn't enough room before the end of the line.\n            if (index + 1 >= line.length) return bboxes;\n\n            segmentLength = line[index].dist(line[index + 1]);\n        }\n\n        // the distance the box will be from the beginning of the segment\n        var segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n        var p0 = line[index];\n        var p1 = line[index + 1];\n        var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();\n\n        var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n        var maxScale = labelLength / 2 / distanceToInnerEdge;\n\n        collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,\n                -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale,\n                featureIndex, sourceLayerIndex, bucketIndex,\n                0, 0, 0, 0, 0);\n    }\n\n    return bboxes;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/collision_feature.js\n// module id = 1381\n// module chunks = 0 1","'use strict';\nvar Queue = require('tinyqueue');\nvar Point = require('point-geometry');\nvar distToSegmentSquared = require('./intersection_tests').distToSegmentSquared;\n\n/**\n * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility\n * This is a copy of http://github.com/mapbox/polylabel adapted to use Points\n *\n * @param {Array<Array<Point>>} List of polygon rings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings\n * @param {number} [precision=1] Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision\n * @param {bool} [debug=false] Print some statistics to the console during execution\n *\n * @returns {Point} Pole of Inaccessibiliy.\n */\nmodule.exports = function (polygonRings, precision, debug) {\n    precision = precision || 1.0;\n\n    // find the bounding box of the outer ring\n    var minX, minY, maxX, maxY;\n    var outerRing = polygonRings[0];\n    for (var i = 0; i < outerRing.length; i++) {\n        var p = outerRing[i];\n        if (!i || p.x < minX) minX = p.x;\n        if (!i || p.y < minY) minY = p.y;\n        if (!i || p.x > maxX) maxX = p.x;\n        if (!i || p.y > maxY) maxY = p.y;\n    }\n\n    var width = maxX - minX;\n    var height = maxY - minY;\n    var cellSize = Math.min(width, height);\n    var h = cellSize / 2;\n\n    // a priority queue of cells in order of their \"potential\" (max distance to polygon)\n    var cellQueue = new Queue(null, compareMax);\n\n    // cover polygon with initial cells\n    for (var x = minX; x < maxX; x += cellSize) {\n        for (var y = minY; y < maxY; y += cellSize) {\n            cellQueue.push(new Cell(x + h, y + h, h, polygonRings));\n        }\n    }\n\n    // take centroid as the first best guess\n    var bestCell = getCentroidCell(polygonRings);\n    var numProbes = cellQueue.length;\n\n    while (cellQueue.length) {\n        // pick the most promising cell from the queue\n        var cell = cellQueue.pop();\n\n        // update the best cell if we found a better one\n        if (cell.d > bestCell.d) {\n            bestCell = cell;\n            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);\n        }\n\n        // do not drill down further if there's no chance of a better solution\n        if (cell.max - bestCell.d <= precision) continue;\n\n        // split the cell into four cells\n        h = cell.h / 2;\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));\n        cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));\n        numProbes += 4;\n    }\n\n    if (debug) {\n        console.log('num probes: ' + numProbes);\n        console.log('best distance: ' + bestCell.d);\n    }\n\n    return bestCell.p;\n};\n\nfunction compareMax(a, b) {\n    return b.max - a.max;\n}\n\nfunction Cell(x, y, h, polygon) {\n    this.p = new Point(x, y);\n    this.h = h; // half the cell size\n    this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon\n    this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell\n}\n\n// signed distance from point to polygon outline (negative if point is outside)\nfunction pointToPolygonDist(p, polygon) {\n    var inside = false;\n    var minDistSq = Infinity;\n\n    for (var k = 0; k < polygon.length; k++) {\n        var ring = polygon[k];\n\n        for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {\n            var a = ring[i];\n            var b = ring[j];\n\n            if ((a.y > p.y !== b.y > p.y) &&\n                (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside;\n\n            minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));\n        }\n    }\n\n    return (inside ? 1 : -1) * Math.sqrt(minDistSq);\n}\n\n// get polygon centroid\nfunction getCentroidCell(polygon) {\n    var area = 0;\n    var x = 0;\n    var y = 0;\n    var points = polygon[0];\n    for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) {\n        var a = points[i];\n        var b = points[j];\n        var f = a.x * b.y - b.x * a.y;\n        x += (a.x + b.x) * f;\n        y += (a.y + b.y) * f;\n        area += f * 3;\n    }\n    return new Cell(x / area, y / area, 0, polygon);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/find_pole_of_inaccessibility.js\n// module id = 1382\n// module chunks = 0 1","'use strict';\n\nmodule.exports = TinyQueue;\nmodule.exports.default = TinyQueue;\n\nfunction TinyQueue(data, compare) {\n    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);\n\n    this.data = data || [];\n    this.length = this.data.length;\n    this.compare = compare || defaultCompare;\n\n    if (this.length > 0) {\n        for (var i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n    }\n}\n\nfunction defaultCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n\nTinyQueue.prototype = {\n\n    push: function (item) {\n        this.data.push(item);\n        this.length++;\n        this._up(this.length - 1);\n    },\n\n    pop: function () {\n        if (this.length === 0) return undefined;\n\n        var top = this.data[0];\n        this.length--;\n\n        if (this.length > 0) {\n            this.data[0] = this.data[this.length];\n            this._down(0);\n        }\n        this.data.pop();\n\n        return top;\n    },\n\n    peek: function () {\n        return this.data[0];\n    },\n\n    _up: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var item = data[pos];\n\n        while (pos > 0) {\n            var parent = (pos - 1) >> 1;\n            var current = data[parent];\n            if (compare(item, current) >= 0) break;\n            data[pos] = current;\n            pos = parent;\n        }\n\n        data[pos] = item;\n    },\n\n    _down: function (pos) {\n        var data = this.data;\n        var compare = this.compare;\n        var halfLength = this.length >> 1;\n        var item = data[pos];\n\n        while (pos < halfLength) {\n            var left = (pos << 1) + 1;\n            var right = left + 1;\n            var best = data[left];\n\n            if (right < this.length && compare(data[right], best) < 0) {\n                left = right;\n                best = data[right];\n            }\n            if (compare(best, item) >= 0) break;\n\n            data[pos] = best;\n            pos = left;\n        }\n\n        data[pos] = item;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tinyqueue/index.js\n// module id = 1383\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar TileCoord = require('./tile_coord');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar RasterBoundsArray = require('../render/draw_raster').RasterBoundsArray;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('../render/vertex_array_object');\n\nmodule.exports = VideoSource;\n\n/**\n * A data source containing video.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.)\n * @interface VideoSource\n * @example\n * // add to map\n * map.addSource('some id', {\n *    type: 'video',\n *    url: [\n *        'https://www.mapbox.com/videos/baltimore-smoke.mp4',\n *        'https://www.mapbox.com/videos/baltimore-smoke.webm'\n *    ],\n *    coordinates: [\n *        [-76.54, 39.18],\n *        [-76.52, 39.18],\n *        [-76.52, 39.17],\n *        [-76.54, 39.17]\n *    ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n */\nfunction VideoSource(id, options) {\n    this.id = id;\n    this.urls = options.urls;\n    this.coordinates = options.coordinates;\n\n    ajax.getVideo(options.urls, function(err, video) {\n        if (err) return this.fire('error', {error: err});\n\n        this.video = video;\n        this.video.loop = true;\n\n        var loopID;\n\n        // start repainting when video starts playing\n        this.video.addEventListener('playing', function() {\n            loopID = this.map.style.animationLoop.set(Infinity);\n            this.map._rerender();\n        }.bind(this));\n\n        // stop repainting when video stops\n        this.video.addEventListener('pause', function() {\n            this.map.style.animationLoop.cancel(loopID);\n        }.bind(this));\n\n        if (this.map) {\n            this.video.play();\n            this.setCoordinates(options.coordinates);\n        }\n\n        this.fire('load');\n    }.bind(this));\n}\n\nVideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{\n    minzoom: 0,\n    maxzoom: 22,\n    tileSize: 512,\n    roundZoom: true,\n\n    /**\n     * Returns the HTML `video` element.\n     *\n     * @returns {HTMLVideoElement} The HTML `video` element.\n     */\n    getVideo: function() {\n        return this.video;\n    },\n\n    onAdd: function(map) {\n        if (this.map) return;\n        this.map = map;\n        if (this.video) {\n            this.video.play();\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Sets the video's coordinates and re-renders the map.\n     *\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     *   represented as arrays of longitude and latitude numbers, which define the corners of the video.\n     *   The coordinates start at the top left corner of the video and proceed in clockwise order.\n     *   They do not have to represent a rectangle.\n     * @returns {VideoSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        this.minzoom = this.maxzoom = centerCoord.zoom;\n        this._coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row);\n        this._tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        this.fire('change');\n        return this;\n    },\n\n    _setTile: function (tile) {\n        this._prepared = false;\n        this.tile = tile;\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0);\n        array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n        this.tile.state = 'loaded';\n    },\n\n    prepare: function() {\n        if (this.video.readyState < 2) return; // not enough data for current position\n        if (!this.tile) return;\n\n        var gl = this.map.painter.gl;\n        if (!this._prepared) {\n            this._prepared = true;\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n        }\n\n        this._currentTime = this.video.currentTime;\n    },\n\n    loadTile: function(tile, callback) {\n        // We have a single tile -- whoose coordinates are this._coord -- that\n        // covers the video frame we want to render.  If that's the one being\n        // requested, set it up with the image; otherwise, mark the tile as\n        // `errored` to indicate that we have no data for it.\n        if (this._coord && this._coord.toString() === tile.coord.toString()) {\n            this._setTile(tile);\n            callback(null);\n        } else {\n            tile.state = 'errored';\n            callback(null);\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'video',\n            urls: this.urls,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/video_source.js\n// module id = 1384\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar TileCoord = require('./tile_coord');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar RasterBoundsArray = require('../render/draw_raster').RasterBoundsArray;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('../render/vertex_array_object');\n\nmodule.exports = ImageSource;\n\n/**\n * A data source containing an image.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.)\n *\n * @interface ImageSource\n * @example\n * // add to map\n * map.addSource('some id', {\n *    type: 'image',\n *    url: 'https://www.mapbox.com/images/foo.png',\n *    coordinates: [\n *        [-76.54, 39.18],\n *        [-76.52, 39.18],\n *        [-76.52, 39.17],\n *        [-76.54, 39.17]\n *    ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n *     [-76.54335737228394, 39.18579907229748],\n *     [-76.52803659439087, 39.1838364847587],\n *     [-76.5295386314392, 39.17683392507606],\n *     [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id');  // remove\n */\nfunction ImageSource(id, options, dispatcher) {\n    this.id = id;\n    this.dispatcher = dispatcher;\n    this.url = options.url;\n    this.coordinates = options.coordinates;\n\n    ajax.getImage(options.url, function(err, image) {\n        if (err) return this.fire('error', {error: err});\n\n        this.image = image;\n\n        this.image.addEventListener('load', function() {\n            this.map._rerender();\n        }.bind(this));\n\n        this._loaded = true;\n        this.fire('load');\n\n        if (this.map) {\n            this.setCoordinates(options.coordinates);\n        }\n    }.bind(this));\n}\n\nImageSource.prototype = util.inherit(Evented, /** @lends ImageSource.prototype */ {\n    minzoom: 0,\n    maxzoom: 22,\n    tileSize: 512,\n    onAdd: function(map) {\n        this.map = map;\n        if (this.image) {\n            this.setCoordinates(this.coordinates);\n        }\n    },\n\n    /**\n     * Sets the image's coordinates and re-renders the map.\n     *\n     * @param {Array<Array<number>>} coordinates Four geographical coordinates,\n     *   represented as arrays of longitude and latitude numbers, which define the corners of the image.\n     *   The coordinates start at the top left corner of the image and proceed in clockwise order.\n     *   They do not have to represent a rectangle.\n     * @returns {ImageSource} this\n     */\n    setCoordinates: function(coordinates) {\n        this.coordinates = coordinates;\n\n        // Calculate which mercator tile is suitable for rendering the video in\n        // and create a buffer with the corner coordinates. These coordinates\n        // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n        var map = this.map;\n        var cornerZ0Coords = coordinates.map(function(coord) {\n            return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n        });\n\n        var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n        centerCoord.column = Math.round(centerCoord.column);\n        centerCoord.row = Math.round(centerCoord.row);\n\n        this.minzoom = this.maxzoom = centerCoord.zoom;\n        this._coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row);\n        this._tileCoords = cornerZ0Coords.map(function(coord) {\n            var zoomedCoord = coord.zoomTo(centerCoord.zoom);\n            return new Point(\n                Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n                Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n        });\n\n        this.fire('change');\n        return this;\n    },\n\n    _setTile: function (tile) {\n        this._prepared = false;\n        this.tile = tile;\n        var maxInt16 = 32767;\n        var array = new RasterBoundsArray();\n        array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0);\n        array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0);\n        array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16);\n        array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16);\n\n        this.tile.buckets = {};\n\n        this.tile.boundsBuffer = new Buffer(array.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n        this.tile.boundsVAO = new VertexArrayObject();\n        this.tile.state = 'loaded';\n    },\n\n    prepare: function() {\n        if (!this._loaded || !this.image || !this.image.complete) return;\n        if (!this.tile) return;\n\n        var painter = this.map.painter;\n        var gl = painter.gl;\n\n        if (!this._prepared) {\n            this.tile.texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        } else {\n            gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.image);\n        }\n    },\n\n    loadTile: function(tile, callback) {\n        // We have a single tile -- whoose coordinates are this._coord -- that\n        // covers the image we want to render.  If that's the one being\n        // requested, set it up with the image; otherwise, mark the tile as\n        // `errored` to indicate that we have no data for it.\n        if (this._coord && this._coord.toString() === tile.coord.toString()) {\n            this._setTile(tile);\n            callback(null);\n        } else {\n            tile.state = 'errored';\n            callback(null);\n        }\n    },\n\n    serialize: function() {\n        return {\n            type: 'image',\n            urls: this.url,\n            coordinates: this.coordinates\n        };\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/image_source.js\n// module id = 1385\n// module chunks = 0 1","'use strict';\nvar TileCoord = require('./tile_coord');\n\nexports.rendered = function(sourceCache, styleLayers, queryGeometry, params, zoom, bearing) {\n    var tilesIn = sourceCache.tilesIn(queryGeometry);\n\n    tilesIn.sort(sortTilesIn);\n\n    var renderedFeatureLayers = [];\n    for (var r = 0; r < tilesIn.length; r++) {\n        var tileIn = tilesIn[r];\n        if (!tileIn.tile.featureIndex) continue;\n\n        renderedFeatureLayers.push(tileIn.tile.featureIndex.query({\n            queryGeometry: tileIn.queryGeometry,\n            scale: tileIn.scale,\n            tileSize: tileIn.tile.tileSize,\n            bearing: bearing,\n            params: params\n        }, styleLayers));\n    }\n    return mergeRenderedFeatureLayers(renderedFeatureLayers);\n};\n\nexports.source = function(sourceCache, params) {\n    var tiles = sourceCache.getRenderableIds().map(function(id) {\n        return sourceCache.getTileByID(id);\n    });\n\n    var result = [];\n\n    var dataTiles = {};\n    for (var i = 0; i < tiles.length; i++) {\n        var tile = tiles[i];\n        var dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id;\n        if (!dataTiles[dataID]) {\n            dataTiles[dataID] = true;\n            tile.querySourceFeatures(result, params);\n        }\n    }\n\n    return result;\n};\n\nfunction sortTilesIn(a, b) {\n    var coordA = a.coord;\n    var coordB = b.coord;\n    return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles) {\n    var result = tiles[0] || {};\n    for (var i = 1; i < tiles.length; i++) {\n        var tile = tiles[i];\n        for (var layerID in tile) {\n            var tileFeatures = tile[layerID];\n            var resultFeatures = result[layerID];\n            if (resultFeatures === undefined) {\n                resultFeatures = result[layerID] = tileFeatures;\n            } else {\n                for (var f = 0; f < tileFeatures.length; f++) {\n                    resultFeatures.push(tileFeatures[f]);\n                }\n            }\n        }\n    }\n    return result;\n}\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/query_features.js\n// module id = 1386\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar Bucket = require('../data/bucket');\nvar FeatureIndex = require('../data/feature_index');\nvar vt = require('vector-tile');\nvar Protobuf = require('pbf');\nvar GeoJSONFeature = require('../util/vectortile_to_geojson');\nvar featureFilter = require('feature-filter');\nvar CollisionTile = require('../symbol/collision_tile');\nvar CollisionBoxArray = require('../symbol/collision_box');\nvar SymbolInstancesArray = require('../symbol/symbol_instances');\nvar SymbolQuadsArray = require('../symbol/symbol_quads');\n\nmodule.exports = Tile;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @param {Coordinate} coord\n * @param {number} size\n * @private\n */\nfunction Tile(coord, size, sourceMaxZoom) {\n    this.coord = coord;\n    this.uid = util.uniqueId();\n    this.uses = 0;\n    this.tileSize = size;\n    this.sourceMaxZoom = sourceMaxZoom;\n    this.buckets = {};\n\n    // `this.state` must be one of\n    //\n    // - `loading`:   Tile data is in the process of loading.\n    // - `loaded`:    Tile data has been loaded. Tile can be rendered.\n    // - `reloading`: Tile data has been loaded and is being updated. Tile can be rendered.\n    // - `unloaded`:  Tile data has been deleted.\n    // - `errored`:   Tile data was not loaded because of an error.\n    this.state = 'loading';\n}\n\nTile.prototype = {\n\n    /**\n     * Given a data object with a 'buffers' property, load it into\n     * this tile's elementGroups and buffers properties and set loaded\n     * to true. If the data is null, like in the case of an empty\n     * GeoJSON tile, no-op but still set loaded to true.\n     * @param {Object} data\n     * @returns {undefined}\n     * @private\n     */\n    loadVectorData: function(data, style) {\n        this.state = 'loaded';\n\n        // empty GeoJSON tile\n        if (!data) return;\n\n        this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray);\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.symbolInstancesArray = new SymbolInstancesArray(data.symbolInstancesArray);\n        this.symbolQuadsArray = new SymbolQuadsArray(data.symbolQuadsArray);\n        this.featureIndex = new FeatureIndex(data.featureIndex, data.rawTileData, this.collisionTile);\n        this.rawTileData = data.rawTileData;\n        this.buckets = unserializeBuckets(data.buckets, style);\n    },\n\n    /**\n     * given a data object and a GL painter, destroy and re-create\n     * all of its buffers.\n     * @param {Object} data\n     * @param {Object} painter\n     * @returns {undefined}\n     * @private\n     */\n    reloadSymbolData: function(data, painter, style) {\n        if (this.state === 'unloaded') return;\n\n        this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n        this.featureIndex.setCollisionTile(this.collisionTile);\n\n        // Destroy and delete existing symbol buckets\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            if (bucket.type === 'symbol') {\n                bucket.destroy(painter.gl);\n                delete this.buckets[id];\n            }\n        }\n\n        // Add new symbol buckets\n        util.extend(this.buckets, unserializeBuckets(data.buckets, style));\n    },\n\n    /**\n     * Make sure that this tile doesn't own any data within a given\n     * painter, so that it doesn't consume any memory or maintain\n     * any references to the painter.\n     * @param {Object} painter gl painter object\n     * @returns {undefined}\n     * @private\n     */\n    unloadVectorData: function(painter) {\n        for (var id in this.buckets) {\n            var bucket = this.buckets[id];\n            bucket.destroy(painter.gl);\n        }\n\n        this.collisionBoxArray = null;\n        this.symbolQuadsArray = null;\n        this.symbolInstancesArray = null;\n        this.collisionTile = null;\n        this.featureIndex = null;\n        this.rawTileData = null;\n        this.buckets = null;\n        this.state = 'unloaded';\n    },\n\n    redoPlacement: function(source) {\n        if (this.state !== 'loaded' || this.state === 'reloading') {\n            this.redoWhenDone = true;\n            return;\n        }\n\n        this.state = 'reloading';\n\n        source.dispatcher.send('redo placement', {\n            uid: this.uid,\n            source: source.id,\n            angle: source.map.transform.angle,\n            pitch: source.map.transform.pitch,\n            showCollisionBoxes: source.map.showCollisionBoxes\n        }, done.bind(this), this.workerID);\n\n        function done(_, data) {\n            this.reloadSymbolData(data, source.map.painter, source.map.style);\n            source.fire('tile.load', {tile: this});\n\n            this.state = 'loaded';\n            if (this.redoWhenDone) {\n                this.redoPlacement(source);\n                this.redoWhenDone = false;\n            }\n        }\n    },\n\n    getBucket: function(layer) {\n        return this.buckets && this.buckets[layer.ref || layer.id];\n    },\n\n    querySourceFeatures: function(result, params) {\n        if (!this.rawTileData) return;\n\n        if (!this.vtLayers) {\n            this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        }\n\n        var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer];\n\n        if (!layer) return;\n\n        var filter = featureFilter(params.filter);\n        var coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y };\n\n        for (var i = 0; i < layer.length; i++) {\n            var feature = layer.feature(i);\n            if (filter(feature)) {\n                var geojsonFeature = new GeoJSONFeature(feature, this.coord.z, this.coord.x, this.coord.y);\n                geojsonFeature.tile = coord;\n                result.push(geojsonFeature);\n            }\n        }\n    },\n\n    isRenderable: function() {\n        return this.state === 'loaded' || this.state === 'reloading';\n    }\n};\n\nfunction unserializeBuckets(input, style) {\n    // Guard against the case where the map's style has been set to null while\n    // this bucket has been parsing.\n    if (!style) return;\n\n    var output = {};\n    for (var i = 0; i < input.length; i++) {\n        var layer = style.getLayer(input[i].layerId);\n        if (!layer) continue;\n\n        var bucket = Bucket.create(util.extend({\n            layer: layer,\n            childLayers: input[i].childLayerIds\n                .map(style.getLayer.bind(style))\n                .filter(function(layer) { return layer; })\n        }, input[i]));\n        output[bucket.id] = bucket;\n    }\n    return output;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/tile.js\n// module id = 1387\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\nvar loadGeometry = require('./load_geometry');\nvar EXTENT = require('./bucket').EXTENT;\nvar featureFilter = require('feature-filter');\nvar StructArrayType = require('../util/struct_array');\nvar Grid = require('grid-index');\nvar DictionaryCoder = require('../util/dictionary_coder');\nvar vt = require('vector-tile');\nvar Protobuf = require('pbf');\nvar GeoJSONFeature = require('../util/vectortile_to_geojson');\nvar arraysIntersect = require('../util/util').arraysIntersect;\n\nvar intersection = require('../util/intersection_tests');\nvar multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint;\nvar multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon;\nvar multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine;\n\n\nvar FeatureIndexArray = new StructArrayType({\n    members: [\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' }\n    ]});\n\nmodule.exports = FeatureIndex;\n\nfunction FeatureIndex(coord, overscaling, collisionTile) {\n    if (coord.grid) {\n        var serialized = coord;\n        var rawTileData = overscaling;\n        coord = serialized.coord;\n        overscaling = serialized.overscaling;\n        this.grid = new Grid(serialized.grid);\n        this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray);\n        this.rawTileData = rawTileData;\n        this.bucketLayerIDs = serialized.bucketLayerIDs;\n    } else {\n        this.grid = new Grid(EXTENT, 16, 0);\n        this.featureIndexArray = new FeatureIndexArray();\n    }\n    this.coord = coord;\n    this.overscaling = overscaling;\n    this.x = coord.x;\n    this.y = coord.y;\n    this.z = coord.z - Math.log(overscaling) / Math.LN2;\n    this.setCollisionTile(collisionTile);\n}\n\nFeatureIndex.prototype.insert = function(feature, featureIndex, sourceLayerIndex, bucketIndex) {\n    var key = this.featureIndexArray.length;\n    this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);\n    var geometry = loadGeometry(feature);\n\n    for (var r = 0; r < geometry.length; r++) {\n        var ring = geometry[r];\n\n        var bbox = [Infinity, Infinity, -Infinity, -Infinity];\n        for (var i = 0; i < ring.length; i++) {\n            var p = ring[i];\n            bbox[0] = Math.min(bbox[0], p.x);\n            bbox[1] = Math.min(bbox[1], p.y);\n            bbox[2] = Math.max(bbox[2], p.x);\n            bbox[3] = Math.max(bbox[3], p.y);\n        }\n\n        this.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n    }\n};\n\nFeatureIndex.prototype.setCollisionTile = function(collisionTile) {\n    this.collisionTile = collisionTile;\n};\n\nFeatureIndex.prototype.serialize = function() {\n    var data = {\n        coord: this.coord,\n        overscaling: this.overscaling,\n        grid: this.grid.toArrayBuffer(),\n        featureIndexArray: this.featureIndexArray.serialize(),\n        bucketLayerIDs: this.bucketLayerIDs\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.featureIndexArray.arrayBuffer]\n    };\n};\n\nfunction translateDistance(translate) {\n    return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\n// Finds features in this tile at a particular position.\nFeatureIndex.prototype.query = function(args, styleLayers) {\n    if (!this.vtLayers) {\n        this.vtLayers = new vt.VectorTile(new Protobuf(new Uint8Array(this.rawTileData))).layers;\n        this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n    }\n\n    var result = {};\n\n    var params = args.params || {},\n        pixelsToTileUnits = EXTENT / args.tileSize / args.scale,\n        filter = featureFilter(params.filter);\n\n    // Features are indexed their original geometries. The rendered geometries may\n    // be buffered, translated or offset. Figure out how much the search radius needs to be\n    // expanded by to include these features.\n    var additionalRadius = 0;\n    for (var id in styleLayers) {\n        var styleLayer = styleLayers[id];\n        var paint = styleLayer.paint;\n\n        var styleLayerDistance = 0;\n        if (styleLayer.type === 'line') {\n            styleLayerDistance = getLineWidth(paint) / 2 + Math.abs(paint['line-offset']) + translateDistance(paint['line-translate']);\n        } else if (styleLayer.type === 'fill') {\n            styleLayerDistance = translateDistance(paint['fill-translate']);\n        } else if (styleLayer.type === 'circle') {\n            styleLayerDistance = paint['circle-radius'] + translateDistance(paint['circle-translate']);\n        }\n        additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits);\n    }\n\n    var queryGeometry = args.queryGeometry.map(function(q) {\n        return q.map(function(p) {\n            return new Point(p.x, p.y);\n        });\n    });\n\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        for (var k = 0; k < ring.length; k++) {\n            var p = ring[k];\n            minX = Math.min(minX, p.x);\n            minY = Math.min(minY, p.y);\n            maxX = Math.max(maxX, p.x);\n            maxY = Math.max(maxY, p.y);\n        }\n    }\n\n    var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius);\n    matching.sort(topDownFeatureComparator);\n    this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    var matchingSymbols = this.collisionTile.queryRenderedSymbols(minX, minY, maxX, maxY, args.scale);\n    matchingSymbols.sort();\n    this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n    return result;\n};\n\nfunction topDownFeatureComparator(a, b) {\n    return b - a;\n}\n\nfunction getLineWidth(paint) {\n    if (paint['line-gap-width'] > 0) {\n        return paint['line-gap-width'] + 2 * paint['line-width'];\n    } else {\n        return paint['line-width'];\n    }\n}\n\nFeatureIndex.prototype.filterMatching = function(result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) {\n    var previousIndex;\n    for (var k = 0; k < matching.length; k++) {\n        var index = matching[k];\n\n        // don't check the same feature more than once\n        if (index === previousIndex) continue;\n        previousIndex = index;\n\n        var match = array.get(index);\n\n        var layerIDs = this.bucketLayerIDs[match.bucketIndex];\n        if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue;\n\n        var sourceLayerName = this.sourceLayerCoder.decode(match.sourceLayerIndex);\n        var sourceLayer = this.vtLayers[sourceLayerName];\n        var feature = sourceLayer.feature(match.featureIndex);\n\n        if (!filter(feature)) continue;\n\n        var geometry = null;\n\n        for (var l = 0; l < layerIDs.length; l++) {\n            var layerID = layerIDs[l];\n\n            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n                continue;\n            }\n\n            var styleLayer = styleLayers[layerID];\n            if (!styleLayer) continue;\n\n            var translatedPolygon;\n            if (styleLayer.type !== 'symbol') {\n                // all symbols already match the style\n\n                if (!geometry) geometry = loadGeometry(feature);\n\n                var paint = styleLayer.paint;\n\n                if (styleLayer.type === 'line') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['line-translate'], paint['line-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var halfWidth = getLineWidth(paint) / 2 * pixelsToTileUnits;\n                    if (paint['line-offset']) {\n                        geometry = offsetLine(geometry, paint['line-offset'] * pixelsToTileUnits);\n                    }\n                    if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue;\n\n                } else if (styleLayer.type === 'fill') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['fill-translate'], paint['fill-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue;\n\n                } else if (styleLayer.type === 'circle') {\n                    translatedPolygon = translate(queryGeometry,\n                            paint['circle-translate'], paint['circle-translate-anchor'],\n                            bearing, pixelsToTileUnits);\n                    var circleRadius = paint['circle-radius'] * pixelsToTileUnits;\n                    if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue;\n                }\n            }\n\n            var geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);\n            geojsonFeature.layer = styleLayer.serialize({\n                includeRefProperties: true\n            });\n            var layerResult = result[layerID];\n            if (layerResult === undefined) {\n                layerResult = result[layerID] = [];\n            }\n            layerResult.push(geojsonFeature);\n        }\n    }\n};\n\nfunction translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {\n    if (!translate[0] && !translate[1]) {\n        return queryGeometry;\n    }\n\n    translate = Point.convert(translate);\n\n    if (translateAnchor === \"viewport\") {\n        translate._rotate(-bearing);\n    }\n\n    var translated = [];\n    for (var i = 0; i < queryGeometry.length; i++) {\n        var ring = queryGeometry[i];\n        var translatedRing = [];\n        for (var k = 0; k < ring.length; k++) {\n            translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits)));\n        }\n        translated.push(translatedRing);\n    }\n    return translated;\n}\n\nfunction offsetLine(rings, offset) {\n    var newRings = [];\n    var zero = new Point(0, 0);\n    for (var k = 0; k < rings.length; k++) {\n        var ring = rings[k];\n        var newRing = [];\n        for (var i = 0; i < ring.length; i++) {\n            var a = ring[i - 1];\n            var b = ring[i];\n            var c = ring[i + 1];\n            var aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n            var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n            var extrude = aToB._add(bToC)._unit();\n\n            var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n            extrude._mult(1 / cosHalfAngle);\n\n            newRing.push(extrude._mult(offset)._add(b));\n        }\n        newRings.push(newRing);\n    }\n    return newRings;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/data/feature_index.js\n// module id = 1388\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\n\nmodule.exports = DictionaryCoder;\n\nfunction DictionaryCoder(strings) {\n    this._stringToNumber = {};\n    this._numberToString = [];\n    for (var i = 0; i < strings.length; i++) {\n        var string = strings[i];\n        this._stringToNumber[string] = i;\n        this._numberToString[i] = string;\n    }\n}\n\nDictionaryCoder.prototype.encode = function(string) {\n    assert(string in this._stringToNumber);\n    return this._stringToNumber[string];\n};\n\nDictionaryCoder.prototype.decode = function(n) {\n    assert(n < this._numberToString.length);\n    return this._numberToString[n];\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/dictionary_coder.js\n// module id = 1389\n// module chunks = 0 1","'use strict';\n\nvar Point = require('point-geometry');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar Grid = require('grid-index');\n\nmodule.exports = CollisionTile;\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @class CollisionTile\n * @param {number} angle\n * @param {number} pitch\n * @private\n */\nfunction CollisionTile(angle, pitch, collisionBoxArray) {\n    if (typeof angle === 'object') {\n        var serialized = angle;\n        collisionBoxArray = pitch;\n        angle = serialized.angle;\n        pitch = serialized.pitch;\n        this.grid = new Grid(serialized.grid);\n        this.ignoredGrid = new Grid(serialized.ignoredGrid);\n    } else {\n        this.grid = new Grid(EXTENT, 12, 6);\n        this.ignoredGrid = new Grid(EXTENT, 12, 0);\n    }\n\n    this.angle = angle;\n    this.pitch = pitch;\n\n    var sin = Math.sin(angle),\n        cos = Math.cos(angle);\n    this.rotationMatrix = [cos, -sin, sin, cos];\n    this.reverseRotationMatrix = [cos, sin, -sin, cos];\n\n    // Stretch boxes in y direction to account for the map tilt.\n    this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n    // The amount the map is squished depends on the y position.\n    // Sort of account for this by making all boxes a bit bigger.\n    this.yStretch = Math.pow(this.yStretch, 1.3);\n\n    this.collisionBoxArray = collisionBoxArray;\n    if (collisionBoxArray.length === 0) {\n        // the first collisionBoxArray is passed to a CollisionTile\n\n        // tempCollisionBox\n        collisionBoxArray.emplaceBack();\n\n        var maxInt16 = 32767;\n        //left\n        collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // right\n        collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // top\n        collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n        // bottom\n        collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16,\n                0, 0, 0, 0, 0, 0, 0, 0,\n                0);\n    }\n\n    this.tempCollisionBox = collisionBoxArray.get(0);\n    this.edges = [\n        collisionBoxArray.get(1),\n        collisionBoxArray.get(2),\n        collisionBoxArray.get(3),\n        collisionBoxArray.get(4)\n    ];\n}\n\nCollisionTile.prototype.serialize = function() {\n    var data = {\n        angle: this.angle,\n        pitch: this.pitch,\n        grid: this.grid.toArrayBuffer(),\n        ignoredGrid: this.ignoredGrid.toArrayBuffer()\n    };\n    return {\n        data: data,\n        transferables: [data.grid, data.ignoredGrid]\n    };\n};\n\nCollisionTile.prototype.minScale = 0.25;\nCollisionTile.prototype.maxScale = 2;\n\n\n/**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\nCollisionTile.prototype.placeCollisionFeature = function(collisionFeature, allowOverlap, avoidEdges) {\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var minPlacementScale = this.minScale;\n    var rotationMatrix = this.rotationMatrix;\n    var yStretch = this.yStretch;\n\n    for (var b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) {\n\n        var box = collisionBoxArray.get(b);\n\n        var anchorPoint = box.anchorPoint._matMult(rotationMatrix);\n        var x = anchorPoint.x;\n        var y = anchorPoint.y;\n\n        var x1 = x + box.x1;\n        var y1 = y + box.y1 * yStretch;\n        var x2 = x + box.x2;\n        var y2 = y + box.y2 * yStretch;\n\n        box.bbox0 = x1;\n        box.bbox1 = y1;\n        box.bbox2 = x2;\n        box.bbox3 = y2;\n\n        if (!allowOverlap) {\n            var blockingBoxes = this.grid.query(x1, y1, x2, y2);\n\n            for (var i = 0; i < blockingBoxes.length; i++) {\n                var blocking = collisionBoxArray.get(blockingBoxes[i]);\n                var blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix);\n\n                minPlacementScale = this.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n\n        if (avoidEdges) {\n            var rotatedCollisionBox;\n\n            if (this.angle) {\n                var reverseRotationMatrix = this.reverseRotationMatrix;\n                var tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix);\n                var tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix);\n                var bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix);\n                var br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix);\n\n                rotatedCollisionBox = this.tempCollisionBox;\n                rotatedCollisionBox.anchorPointX = box.anchorPoint.x;\n                rotatedCollisionBox.anchorPointY = box.anchorPoint.y;\n                rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n                rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x);\n                rotatedCollisionBox.maxScale = box.maxScale;\n            } else {\n                rotatedCollisionBox = box;\n            }\n\n            for (var k = 0; k < this.edges.length; k++) {\n                var edgeBox = this.edges[k];\n                minPlacementScale = this.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox);\n                if (minPlacementScale >= this.maxScale) {\n                    return minPlacementScale;\n                }\n            }\n        }\n    }\n\n    return minPlacementScale;\n};\n\nCollisionTile.prototype.queryRenderedSymbols = function(minX, minY, maxX, maxY, scale) {\n    var sourceLayerFeatures = {};\n    var result = [];\n\n    var collisionBoxArray = this.collisionBoxArray;\n    var rotationMatrix = this.rotationMatrix;\n    var anchorPoint = new Point(minX, minY)._matMult(rotationMatrix);\n\n    var queryBox = this.tempCollisionBox;\n    queryBox.anchorX = anchorPoint.x;\n    queryBox.anchorY = anchorPoint.y;\n    queryBox.x1 = 0;\n    queryBox.y1 = 0;\n    queryBox.x2 = maxX - minX;\n    queryBox.y2 = maxY - minY;\n    queryBox.maxScale = scale;\n\n    // maxScale is stored using a Float32. Convert `scale` to the stored Float32 value.\n    scale = queryBox.maxScale;\n\n    var searchBox = [\n        anchorPoint.x + queryBox.x1 / scale,\n        anchorPoint.y + queryBox.y1 / scale * this.yStretch,\n        anchorPoint.x + queryBox.x2 / scale,\n        anchorPoint.y + queryBox.y2 / scale * this.yStretch\n    ];\n\n    var blockingBoxKeys = this.grid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    var blockingBoxKeys2 = this.ignoredGrid.query(searchBox[0], searchBox[1], searchBox[2], searchBox[3]);\n    for (var k = 0; k < blockingBoxKeys2.length; k++) {\n        blockingBoxKeys.push(blockingBoxKeys2[k]);\n    }\n\n    for (var i = 0; i < blockingBoxKeys.length; i++) {\n        var blocking = collisionBoxArray.get(blockingBoxKeys[i]);\n\n        var sourceLayer = blocking.sourceLayerIndex;\n        var featureIndex = blocking.featureIndex;\n        if (sourceLayerFeatures[sourceLayer] === undefined) {\n            sourceLayerFeatures[sourceLayer] = {};\n        }\n\n        if (!sourceLayerFeatures[sourceLayer][featureIndex]) {\n            var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix);\n            var minPlacementScale = this.getPlacementScale(this.minScale, anchorPoint, queryBox, blockingAnchorPoint, blocking);\n            if (minPlacementScale >= scale) {\n                sourceLayerFeatures[sourceLayer][featureIndex] = true;\n                result.push(blockingBoxKeys[i]);\n            }\n        }\n    }\n\n    return result;\n};\n\nCollisionTile.prototype.getPlacementScale = function(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) {\n\n    // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n    // Original algorithm:\n    var anchorDiffX = anchorPoint.x - blockingAnchorPoint.x;\n    var anchorDiffY = anchorPoint.y - blockingAnchorPoint.y;\n    var s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box\n    var s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box\n    var s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box\n    var s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box\n\n    if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n    if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n    var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n    var blockingMaxScale = blocking.maxScale;\n    var boxMaxScale = box.maxScale;\n\n    if (collisionFreeScale > blockingMaxScale) {\n        // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n        // so unblock the new box at the scale that the old box disappears.\n        collisionFreeScale = blockingMaxScale;\n    }\n\n    if (collisionFreeScale > boxMaxScale) {\n        // If the box can only be shown after it is visible, then the box can never be shown.\n        // But the label can be shown after this box is not visible.\n        collisionFreeScale = boxMaxScale;\n    }\n\n    if (collisionFreeScale > minPlacementScale &&\n            collisionFreeScale >= blocking.placementScale) {\n        // If this collision occurs at a lower scale than previously found collisions\n        // and the collision occurs while the other label is visible\n\n        // this this is the lowest scale at which the label won't collide with anything\n        minPlacementScale = collisionFreeScale;\n    }\n\n    return minPlacementScale;\n};\n\n\n/**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\nCollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale, ignorePlacement) {\n\n    var grid = ignorePlacement ? this.ignoredGrid : this.grid;\n    var collisionBoxArray = this.collisionBoxArray;\n\n    for (var k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) {\n        var box = collisionBoxArray.get(k);\n        box.placementScale = minPlacementScale;\n        if (minPlacementScale < this.maxScale) {\n            grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3);\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/collision_tile.js\n// module id = 1390\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBoxArray\n * @private\n */\n\nvar CollisionBoxArray = module.exports = new StructArrayType({\n    members: [\n        // the box is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // distances to the edges from the anchor\n        { type: 'Int16', name: 'x1' },\n        { type: 'Int16', name: 'y1' },\n        { type: 'Int16', name: 'x2' },\n        { type: 'Int16', name: 'y2' },\n\n        // the box is only valid for scales < maxScale.\n        // The box does not block other boxes at scales >= maxScale;\n        { type: 'Float32', name: 'maxScale' },\n\n        // the index of the feature in the original vectortile\n        { type: 'Uint32', name: 'featureIndex' },\n        // the source layer the feature appears in\n        { type: 'Uint16', name: 'sourceLayerIndex' },\n        // the bucket the feature appears in\n        { type: 'Uint16', name: 'bucketIndex' },\n\n        // rotated and scaled bbox used for indexing\n        { type: 'Int16', name: 'bbox0' },\n        { type: 'Int16', name: 'bbox1' },\n        { type: 'Int16', name: 'bbox2' },\n        { type: 'Int16', name: 'bbox3' },\n\n        { type: 'Float32', name: 'placementScale' }\n    ]});\n\nutil.extendAll(CollisionBoxArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/collision_box.js\n// module id = 1391\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\n\n/*\n *\n * A StructArray implementation of symbolInstances from data/bucket/symbol_bucket.js\n * this will allow symbolInstances to be transferred between the worker and main threads\n *\n * @class SymbolInstanceArray\n * @private\n */\n\nvar SymbolInstancesArray = module.exports = new StructArrayType({\n    members: [\n\n        { type: 'Uint16', name: 'textBoxStartIndex' },\n        { type: 'Uint16', name: 'textBoxEndIndex' },\n        { type: 'Uint16', name: 'iconBoxStartIndex' },\n        { type: 'Uint16', name: 'iconBoxEndIndex' },\n        { type: 'Uint16', name: 'glyphQuadStartIndex' },\n        { type: 'Uint16', name: 'glyphQuadEndIndex' },\n        { type: 'Uint16', name: 'iconQuadStartIndex' },\n        { type: 'Uint16', name: 'iconQuadEndIndex' },\n\n        // each symbolInstance is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // index -- not sure if we need this -@mollymerp\n        { type: 'Int8', name: 'index' }\n    ]\n});\n\nutil.extendAll(SymbolInstancesArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    }\n});\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/symbol_instances.js\n// module id = 1392\n// module chunks = 0 1","'use strict';\n\nvar StructArrayType = require('../util/struct_array');\nvar util = require('../util/util');\nvar Point = require('point-geometry');\nvar SymbolQuad = require('./quads').SymbolQuad;\n\n// notes from ansis on slack:\n// it would be best if they are added to a buffer in advance so that they are only created once. There would be a separate buffer with all the individual collision boxes and then SymbolInstance would store the beginning and end indexes of a feature's collisionboxes. CollisionFeature wouldn't really exist as a standalone thing, it would just be a range of boxes in the big collision box buffer\n\n/*\n *\n * A StructArray implementation of glyphQuad from symbol/quads\n * this will allow glyph quads to be transferred between the worker and main threads along with the rest of\n * the symbolInstances\n *\n * @class SymbolQuadsArray\n * @private\n */\n\nvar SymbolQuadsArray = module.exports = new StructArrayType({\n    members: [\n        // the quad is centered around the anchor point\n        { type: 'Int16', name: 'anchorPointX' },\n        { type: 'Int16', name: 'anchorPointY' },\n\n        // the offsets of the tl (top-left), tr, bl, br corners from the anchor point\n        // do these need to be floats?\n        { type: 'Float32', name: 'tlX' },\n        { type: 'Float32', name: 'tlY' },\n        { type: 'Float32', name: 'trX' },\n        { type: 'Float32', name: 'trY' },\n        { type: 'Float32', name: 'blX' },\n        { type: 'Float32', name: 'blY' },\n        { type: 'Float32', name: 'brX' },\n        { type: 'Float32', name: 'brY' },\n\n        // texture coordinates (height, width, x, and y)\n        { type: 'Int16', name: 'texH' },\n        { type: 'Int16', name: 'texW' },\n        { type: 'Int16', name: 'texX' },\n        { type: 'Int16', name: 'texY' },\n\n        // the angle of the label at it's center, not the angle of this quad.\n        { type: 'Float32', name: 'anchorAngle' },\n        // the angle of this quad.\n        { type: 'Float32', name: 'glyphAngle' },\n\n        // quad is only valid for scales < maxScale && scale > minScale.\n        { type: 'Float32', name: 'maxScale' },\n        { type: 'Float32', name: 'minScale' }\n    ]\n});\n\nutil.extendAll(SymbolQuadsArray.prototype.StructType.prototype, {\n    get anchorPoint() {\n        return new Point(this.anchorPointX, this.anchorPointY);\n    },\n    get SymbolQuad() {\n        return new SymbolQuad(this.anchorPoint,\n            new Point(this.tlX, this.tlY),\n            new Point(this.trX, this.trY),\n            new Point(this.blX, this.blY),\n            new Point(this.brX, this.brY),\n            { x: this.texX, y: this.texY, h: this.texH, w: this.texW, height: this.texH, width: this.texW },\n            this.anchorAngle,\n            this.glyphAngle,\n            this.minScale,\n            this.maxScale);\n    }\n});\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/symbol/symbol_quads.js\n// module id = 1393\n// module chunks = 0 1","'use strict';\n\nmodule.exports = LRUCache;\n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n * @private\n */\nfunction LRUCache(max, onRemove) {\n    this.max = max;\n    this.onRemove = onRemove;\n    this.reset();\n}\n\n/**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.reset = function() {\n    for (var key in this.data) {\n        this.onRemove(this.data[key]);\n    }\n\n    this.data = {};\n    this.order = [];\n\n    return this;\n};\n\n/**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.add = function(key, data) {\n\n    if (this.has(key)) {\n        this.order.splice(this.order.indexOf(key), 1);\n        this.data[key] = data;\n        this.order.push(key);\n\n    } else {\n        this.data[key] = data;\n        this.order.push(key);\n\n        if (this.order.length > this.max) {\n            var removedData = this.get(this.order[0]);\n            if (removedData) this.onRemove(removedData);\n        }\n    }\n\n    return this;\n};\n\n/**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\nLRUCache.prototype.has = function(key) {\n    return key in this.data;\n};\n\n/**\n * List all keys in the cache\n *\n * @returns {Array<string>} an array of keys in this cache.\n * @private\n */\nLRUCache.prototype.keys = function() {\n    return this.order;\n};\n\n/**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\nLRUCache.prototype.get = function(key) {\n    if (!this.has(key)) { return null; }\n\n    var data = this.data[key];\n\n    delete this.data[key];\n    this.order.splice(this.order.indexOf(key), 1);\n\n    return data;\n};\n\n/**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n * @private\n */\nLRUCache.prototype.setMaxSize = function(max) {\n    this.max = max;\n\n    while (this.order.length > this.max) {\n        var removedData = this.get(this.order[0]);\n        if (removedData) this.onRemove(removedData);\n    }\n\n    return this;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/lru_cache.js\n// module id = 1394\n// module chunks = 0 1","'use strict';\nvar WorkerPool = require('./util/worker_pool');\n\nvar globalWorkerPool;\n\n/**\n * Creates (if necessary) and returns the single, global WorkerPool instance\n * to be shared across each Map\n * @private\n */\nmodule.exports = function getGlobalWorkerPool () {\n    if (!globalWorkerPool) {\n        globalWorkerPool = new WorkerPool();\n    }\n    return globalWorkerPool;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/global_worker_pool.js\n// module id = 1395\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\nvar WebWorker = require('./web_worker');\n\nmodule.exports = WorkerPool;\n\n/**\n * Constructs a worker pool.\n * @private\n */\nfunction WorkerPool() {\n    this.active = {};\n}\n\nWorkerPool.prototype = {\n    acquire: function (mapId) {\n        if (!this.workers) {\n            // Lazily look up the value of mapboxgl.workerCount.  This allows\n            // client code a chance to set it while circumventing cyclic\n            // dependency problems\n            var workerCount = require('../mapbox-gl').workerCount;\n            assert(typeof workerCount === 'number' && workerCount < Infinity);\n\n            this.workers = [];\n            while (this.workers.length < workerCount) {\n                this.workers.push(new WebWorker());\n            }\n        }\n\n        this.active[mapId] = true;\n        return this.workers.slice();\n    },\n\n    release: function (mapId) {\n        delete this.active[mapId];\n        if (Object.keys(this.active).length === 0) {\n            this.workers.forEach(function (w) { w.terminate(); });\n            this.workers = null;\n        }\n    }\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/worker_pool.js\n// module id = 1396\n// module chunks = 0 1","'use strict';\nvar WebWorkify = require('webworkify');\n\nmodule.exports = function () {\n    return new WebWorkify(require('../../source/worker'));\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/util/browser/web_worker.js\n// module id = 1397\n// module chunks = 0 1","module.exports = function() {\n\treturn require(\"!!/srv/opengov/node_modules/worker-loader/createInlineWorker.js\")(\"!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\\\"a\\\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\\\"\\\",e(e.s=47)}([function(t,e,n){\\\"use strict\\\";var r=n(49),i=n(50);e.easeCubicInOut=function(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,n=e*t;return 4*(t<.5?n:3*(t-e)+n-.75)},e.bezier=function(t,e,n,i){var o=new r(t,e,n,i);return function(t){return o.solve(t)}},e.ease=e.bezier(.25,.1,.25,1),e.clamp=function(t,e,n){return Math.min(n,Math.max(e,t))},e.wrap=function(t,e,n){var r=n-e,i=((t-e)%r+r)%r+e;return i===e?n:i},e.coalesce=function(){for(var t=0;t<arguments.length;t++){var e=arguments[t];if(null!==e&&void 0!==e)return e}},e.asyncAll=function(t,e,n){if(!t.length)return n(null,[]);var r=t.length,i=new Array(t.length),o=null;t.forEach(function(t,a){e(t,function(t,e){t&&(o=t),i[a]=e,0==--r&&n(o,i)})})},e.keysDifference=function(t,e){var n=[];for(var r in t)r in e||n.push(r);return n},e.extend=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t},e.extendAll=function(t,e){for(var n in e)Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n));return t},e.inherit=function(t,n){var r=\\\"function\\\"==typeof t?t.prototype:t,i=Object.create(r);return e.extendAll(i,n),i},e.pick=function(t,e){for(var n={},r=0;r<e.length;r++){var i=e[r];i in t&&(n[i]=t[i])}return n};var o=1;e.uniqueId=function(){return o++},e.debounce=function(t,e){var n,r;return function(){r=arguments,clearTimeout(n),n=setTimeout(function(){t.apply(null,r)},e)}},e.bindAll=function(t,e){t.forEach(function(t){e[t]&&(e[t]=e[t].bind(e))})},e.bindHandlers=function(t){for(var e in t)\\\"function\\\"==typeof t[e]&&0===e.indexOf(\\\"_on\\\")&&(t[e]=t[e].bind(t))},e.setOptions=function(t,e){t.hasOwnProperty(\\\"options\\\")||(t.options=t.options?Object.create(t.options):{});for(var n in e)t.options[n]=e[n];return t.options},e.getCoordinatesCenter=function(t){for(var e=1/0,n=1/0,r=-1/0,o=-1/0,a=0;a<t.length;a++)e=Math.min(e,t[a].column),n=Math.min(n,t[a].row),r=Math.max(r,t[a].column),o=Math.max(o,t[a].row);var s=r-e,u=o-n,l=Math.max(s,u);return new i((e+r)/2,(n+o)/2,0).zoomTo(Math.floor(-Math.log(l)/Math.LN2))},e.endsWith=function(t,e){return-1!==t.indexOf(e,t.length-e.length)},e.startsWith=function(t,e){return 0===t.indexOf(e)},e.mapObject=function(t,e,n){var r={};for(var i in t)r[i]=e.call(n||this,t[i],i,t);return r},e.filterObject=function(t,e,n){var r={};for(var i in t)e.call(n||this,t[i],i,t)&&(r[i]=t[i]);return r},e.deepEqual=function t(e,n){if(Array.isArray(e)){if(!Array.isArray(n)||e.length!==n.length)return!1;for(var r=0;r<e.length;r++)if(!t(e[r],n[r]))return!1;return!0}if(\\\"object\\\"==typeof e&&null!==e&&null!==n){if(\\\"object\\\"!=typeof n)return!1;if(Object.keys(e).length!==Object.keys(n).length)return!1;for(var i in e)if(!t(e[i],n[i]))return!1;return!0}return e===n},e.clone=function(t){return Array.isArray(t)?t.map(e.clone):\\\"object\\\"==typeof t?e.mapObject(t,e.clone):t},e.arraysIntersect=function(t,e){for(var n=0;n<t.length;n++)if(e.indexOf(t[n])>=0)return!0;return!1};var a={};e.warnOnce=function(t){a[t]||(\\\"undefined\\\"!=typeof console&&console.warn(t),a[t]=!0)},e.isCounterClockwise=function(t,e,n){return(n.y-t.y)*(e.x-t.x)>(e.y-t.y)*(n.x-t.x)},e.calculateSignedArea=function(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n.x-e.x)*(e.y+n.y);return r},e.isClosedPolygon=function(t){if(t.length<4)return!1;var n=t[0],r=t[t.length-1];return!(Math.abs(n.x-r.x)>0||Math.abs(n.y-r.y)>0)&&Math.abs(e.calculateSignedArea(t))>.01}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.message=(t?t+\\\": \\\":\\\"\\\")+i.apply(i,Array.prototype.slice.call(arguments,2)),null!==e&&void 0!==e&&e.__line__&&(this.line=e.__line__)}var i=n(23).format;t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){this.x=t,this.y=e}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,n=t.y-this.y;return e*e+n*n},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,n=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=n,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),n=Math.sin(t),r=e*this.x-n*this.y,i=n*this.x+e*this.y;return this.x=r,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(t){return t instanceof r?t:Array.isArray(t)?new r(t[0],t[1]):t}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number?\\\"number\\\":t instanceof String?\\\"string\\\":t instanceof Boolean?\\\"boolean\\\":Array.isArray(t)?\\\"array\\\":null===t?\\\"null\\\":typeof t}},function(t,e,n){\\\"use strict\\\";function r(t){if(this.zoom=t.zoom,this.overscaling=t.overscaling,this.layer=t.layer,this.childLayers=t.childLayers,this.type=this.layer.type,this.features=[],this.id=this.layer.id,this.index=t.index,this.sourceLayer=this.layer.sourceLayer,this.sourceLayerIndex=t.sourceLayerIndex,this.minZoom=this.layer.minzoom,this.maxZoom=this.layer.maxzoom,this.paintAttributes=i(this),t.arrays){var e=this.programInterfaces;this.bufferGroups=c.mapObject(t.arrays,function(n,r){var i=e[r],o=t.paintVertexArrayTypes[r];return n.map(function(t){return new l(t,{layoutVertexArrayType:i.layoutVertexArrayType.serialize(),elementArrayType:i.elementArrayType&&i.elementArrayType.serialize(),elementArrayType2:i.elementArrayType2&&i.elementArrayType2.serialize(),paintVertexArrayTypes:o})})})}}function i(t){var e={};for(var n in t.programInterfaces){for(var r=e[n]={},i=0;i<t.childLayers.length;i++){r[t.childLayers[i].id]={attributes:[],uniforms:[],defines:[],vertexPragmas:{define:{},initialize:{}},fragmentPragmas:{define:{},initialize:{}}}}var s=t.programInterfaces[n];if(s.paintAttributes)for(var u=0;u<s.paintAttributes.length;u++){var l=s.paintAttributes[u];l.multiplier=l.multiplier||1;for(var p=0;p<t.childLayers.length;p++){var h=t.childLayers[p],y=r[h.id],d=l.name;f(\\\"a_\\\"===l.name.slice(0,2));var m,v=l.name.slice(2);if(y.fragmentPragmas.initialize[v]=\\\"\\\",h.isPaintValueFeatureConstant(l.paintProperty))y.uniforms.push(l),y.fragmentPragmas.define[v]=y.vertexPragmas.define[v]=[\\\"uniform\\\",\\\"{precision}\\\",\\\"{type}\\\",d].join(\\\" \\\")+\\\";\\\",y.fragmentPragmas.initialize[v]=y.vertexPragmas.initialize[v]=[\\\"{precision}\\\",\\\"{type}\\\",v,\\\"=\\\",d].join(\\\" \\\")+\\\";\\\\n\\\";else if(h.isPaintValueZoomConstant(l.paintProperty)){y.attributes.push(c.extend({},l,{name:d})),m=[\\\"varying\\\",\\\"{precision}\\\",\\\"{type}\\\",v].join(\\\" \\\")+\\\";\\\\n\\\";var x=[y.fragmentPragmas.define[v],\\\"attribute\\\",\\\"{precision}\\\",\\\"{type}\\\",d].join(\\\" \\\")+\\\";\\\\n\\\";y.fragmentPragmas.define[v]=m,y.vertexPragmas.define[v]=m+x,y.vertexPragmas.initialize[v]=[v,\\\"=\\\",d,\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}else{for(var g=\\\"u_\\\"+d.slice(2)+\\\"_t\\\",b=h.getPaintValueStopZoomLevels(l.paintProperty),w=0;w<b.length&&b[w]<t.zoom;)w++;for(var S=Math.max(0,Math.min(b.length-4,w-2)),_=[],A=0;A<4;A++)_.push(b[Math.min(S+A,b.length-1)]);m=[\\\"varying\\\",\\\"{precision}\\\",\\\"{type}\\\",v].join(\\\" \\\")+\\\";\\\\n\\\",y.vertexPragmas.define[v]=m+[\\\"uniform\\\",\\\"lowp\\\",\\\"float\\\",g].join(\\\" \\\")+\\\";\\\\n\\\",y.fragmentPragmas.define[v]=m,y.uniforms.push(c.extend({},l,{name:g,getValue:a(l,S),components:1}));var M=l.components;if(1===M)y.attributes.push(c.extend({},l,{getValue:o(l,_),isFunction:!0,components:4*M})),y.vertexPragmas.define[v]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"vec4\\\",d].join(\\\" \\\")+\\\";\\\\n\\\",y.vertexPragmas.initialize[v]=[v,\\\"=\\\",\\\"evaluate_zoom_function_1(\\\"+d+\\\", \\\"+g+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\";else{for(var P=[],z=0;z<4;z++)P.push(d+z),y.attributes.push(c.extend({},l,{getValue:o(l,[_[z]]),isFunction:!0,name:d+z})),y.vertexPragmas.define[v]+=[\\\"attribute\\\",\\\"{precision}\\\",\\\"{type}\\\",d+z].join(\\\" \\\")+\\\";\\\\n\\\";y.vertexPragmas.initialize[v]=[v,\\\" = \\\",\\\"evaluate_zoom_function_4(\\\"+P.join(\\\", \\\")+\\\", \\\"+g+\\\")\\\",\\\"/\\\",l.multiplier.toFixed(1)].join(\\\" \\\")+\\\";\\\\n\\\"}}}}}return e}function o(t,e){return function(n,r,i){if(1===e.length)return t.getValue(n,c.extend({},r,{zoom:e[0]}),i);for(var o=[],a=0;a<e.length;a++){var s=e[a];o.push(t.getValue(n,c.extend({},r,{zoom:s}),i)[0])}return o}}function a(t,e){return function(n,r){var i=n.getPaintInterpolationT(t.paintProperty,r.zoom);return[Math.max(0,Math.min(4,i-e))]}}var s=n(38),u=n(76),l=n(77),c=n(0),p=n(10),f=n(9);t.exports=r,r.create=function(t){return new({fill:n(81),line:n(84),circle:n(85),symbol:n(86)}[t.layer.type])(t)},r.EXTENT=8192,r.prototype.populateArrays=function(){this.createArrays(),this.recalculateStyleLayers();for(var t=0;t<this.features.length;t++)this.addFeature(this.features[t]);this.trimArrays()},r.prototype.prepareArrayGroup=function(t,e){var n=this.arrayGroups[t],r=n.length&&n[n.length-1];return r&&r.hasCapacityFor(e)||(r=new u({layoutVertexArrayType:this.programInterfaces[t].layoutVertexArrayType,elementArrayType:this.programInterfaces[t].elementArrayType,elementArrayType2:this.programInterfaces[t].elementArrayType2,paintVertexArrayTypes:this.paintVertexArrayTypes[t]}),r.index=n.length,n.push(r)),r},r.prototype.createArrays=function(){this.arrayGroups={},this.paintVertexArrayTypes={};for(var t in this.programInterfaces){this.arrayGroups[t]=[];var e=this.paintVertexArrayTypes[t]={},n=this.paintAttributes[t];for(var i in n)e[i]=new r.VertexArrayType(n[i].attributes)}},r.prototype.destroy=function(t){for(var e in this.bufferGroups)for(var n=this.bufferGroups[e],r=0;r<n.length;r++)n[r].destroy(t)},r.prototype.trimArrays=function(){for(var t in this.arrayGroups)for(var e=this.arrayGroups[t],n=0;n<e.length;n++)e[n].trim()},r.prototype.isEmpty=function(){for(var t in this.arrayGroups)for(var e=this.arrayGroups[t],n=0;n<e.length;n++)if(!e[n].isEmpty())return!1;return!0},r.prototype.getTransferables=function(t){for(var e in this.arrayGroups)for(var n=this.arrayGroups[e],r=0;r<n.length;r++)n[r].getTransferables(t)},r.prototype.setUniforms=function(t,e,n,r,i){for(var o=this.paintAttributes[e][r.id].uniforms,a=0;a<o.length;a++){var s=o[a],u=n[s.name];t[\\\"uniform\\\"+s.components+\\\"fv\\\"](u,s.getValue(r,i))}},r.prototype.serialize=function(){return{layerId:this.layer.id,zoom:this.zoom,arrays:c.mapObject(this.arrayGroups,function(t){return t.map(function(t){return t.serialize()})}),paintVertexArrayTypes:c.mapObject(this.paintVertexArrayTypes,function(t){return c.mapObject(t,function(t){return t.serialize()})}),childLayerIds:this.childLayers.map(function(t){return t.id})}},r.prototype.createFilter=function(){this.filter||(this.filter=s(this.layer.filter))};var h={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};r.prototype.recalculateStyleLayers=function(){for(var t=0;t<this.childLayers.length;t++)this.childLayers[t].recalculate(this.zoom,h)},r.prototype.populatePaintArrays=function(t,e,n,r,i){for(var o=0;o<this.childLayers.length;o++)for(var a=this.childLayers[o],s=this.arrayGroups[t],u=r.index;u<s.length;u++){var l=s[u],c=l.layoutVertexArray.length,p=l.paintVertexArrays[a.id];p.resize(c);for(var f=this.paintAttributes[t][a.id].attributes,h=0;h<f.length;h++)for(var y=f[h],d=y.getValue(a,e,n),m=y.multiplier||1,v=y.components||1,x=u===r.index?i:0,g=x;g<c;g++)for(var b=p.get(g),w=0;w<v;w++){var S=v>1?y.name+w:y.name;b[S]=d[w]*m}}},r.VertexArrayType=function(t){return new p({members:t,alignment:4})},r.ElementArrayType=function(t){return new p({members:[{type:\\\"Uint16\\\",name:\\\"vertices\\\",components:t||3}]})}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.set(t,e)}function i(t){return t.value}var o=n(0),a=n(51),s=n(52),u=n(54),l=n(56),c=n(19),p=n(64);t.exports=r;r.create=function(t,e){return new({background:n(65),circle:n(66),fill:n(67),line:n(68),raster:n(69),symbol:n(70)}[(e||t).type])(t,e)},r.prototype=o.inherit(p,{set:function(t,e){this.id=t.id,this.ref=t.ref,this.metadata=t.metadata,this.type=(e||t).type,this.source=(e||t).source,this.sourceLayer=(e||t)[\\\"source-layer\\\"],this.minzoom=(e||t).minzoom,this.maxzoom=(e||t).maxzoom,this.filter=(e||t).filter,this.paint={},this.layout={},this._paintSpecifications=u[\\\"paint_\\\"+this.type],this._layoutSpecifications=u[\\\"layout_\\\"+this.type],this._paintTransitions={},this._paintTransitionOptions={},this._paintDeclarations={},this._layoutDeclarations={},this._layoutFunctions={};var n,r;for(var i in t){var o=i.match(/^paint(?:\\\\.(.*))?$/);if(o){var a=o[1]||\\\"\\\";for(n in t[i])this.setPaintProperty(n,t[i][n],a)}}if(this.ref)this._layoutDeclarations=e._layoutDeclarations;else for(r in t.layout)this.setLayoutProperty(r,t.layout[r]);for(n in this._paintSpecifications)this.paint[n]=this.getPaintValue(n);for(r in this._layoutSpecifications)this._updateLayoutValue(r)},setLayoutProperty:function(t,e){if(null==e)delete this._layoutDeclarations[t];else{var n=\\\"layers.\\\"+this.id+\\\".layout.\\\"+t;if(this._handleErrors(l.layoutProperty,n,t,e))return;this._layoutDeclarations[t]=new s(this._layoutSpecifications[t],e)}this._updateLayoutValue(t)},getLayoutProperty:function(t){return this._layoutDeclarations[t]&&this._layoutDeclarations[t].value},getLayoutValue:function(t,e,n){var r=this._layoutSpecifications[t],i=this._layoutDeclarations[t];return i?i.calculate(e,n):r.default},setPaintProperty:function(t,e,n){var r=\\\"layers.\\\"+this.id+(n?'[\\\"paint.'+n+'\\\"].':\\\".paint.\\\")+t;if(o.endsWith(t,\\\"-transition\\\"))if(this._paintTransitionOptions[n||\\\"\\\"]||(this._paintTransitionOptions[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintTransitionOptions[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,r,t,e))return;this._paintTransitionOptions[n||\\\"\\\"][t]=e}else if(this._paintDeclarations[n||\\\"\\\"]||(this._paintDeclarations[n||\\\"\\\"]={}),null===e||void 0===e)delete this._paintDeclarations[n||\\\"\\\"][t];else{if(this._handleErrors(l.paintProperty,r,t,e))return;this._paintDeclarations[n||\\\"\\\"][t]=new s(this._paintSpecifications[t],e)}},getPaintProperty:function(t,e){return e=e||\\\"\\\",o.endsWith(t,\\\"-transition\\\")?this._paintTransitionOptions[e]&&this._paintTransitionOptions[e][t]:this._paintDeclarations[e]&&this._paintDeclarations[e][t]&&this._paintDeclarations[e][t].value},getPaintValue:function(t,e,n){var r=this._paintSpecifications[t],i=this._paintTransitions[t];return i?i.calculate(e,n):\\\"color\\\"===r.type&&r.default?c(r.default):r.default},getPaintValueStopZoomLevels:function(t){var e=this._paintTransitions[t];return e?e.declaration.stopZoomLevels:[]},getPaintInterpolationT:function(t,e){return this._paintTransitions[t].declaration.calculateInterpolationT({zoom:e})},isPaintValueFeatureConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isFeatureConstant},isLayoutValueFeatureConstant:function(t){var e=this._layoutDeclarations[t];return!e||e.isFeatureConstant},isPaintValueZoomConstant:function(t){var e=this._paintTransitions[t];return!e||e.declaration.isZoomConstant},isHidden:function(t){return!!(this.minzoom&&t<this.minzoom)||(!!(this.maxzoom&&t>=this.maxzoom)||(\\\"none\\\"===this.layout.visibility||(!(!this.isPaintValueFeatureConstant(this.type+\\\"-opacity\\\")||0!==this.paint[this.type+\\\"-opacity\\\"])||!(!this.isPaintValueFeatureConstant(this.type+\\\"-color\\\")||!this.paint[this.type+\\\"-color\\\"]||0!==this.paint[this.type+\\\"-color\\\"][3]))))},updatePaintTransitions:function(t,e,n,r){for(var i=o.extend({},this._paintDeclarations[\\\"\\\"]),a=0;a<t.length;a++)o.extend(i,this._paintDeclarations[t[a]]);var s;for(s in i)this._applyPaintDeclaration(s,i[s],e,n,r);for(s in this._paintTransitions)s in i||this._applyPaintDeclaration(s,null,e,n,r)},updatePaintTransition:function(t,e,n,r,i){for(var o=this._paintDeclarations[\\\"\\\"][t],a=0;a<e.length;a++){var s=this._paintDeclarations[e[a]];s&&s[t]&&(o=s[t])}this._applyPaintDeclaration(t,o,n,r,i)},recalculate:function(t,e){for(var n in this._paintTransitions)this.paint[n]=this.getPaintValue(n,{zoom:t,zoomHistory:e});for(var r in this._layoutFunctions)this.layout[r]=this.getLayoutValue(r,{zoom:t,zoomHistory:e})},serialize:function(t){var e={id:this.id,ref:this.ref,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom};for(var n in this._paintDeclarations){e[\\\"\\\"===n?\\\"paint\\\":\\\"paint.\\\"+n]=o.mapObject(this._paintDeclarations[n],i)}return(!this.ref||t&&t.includeRefProperties)&&o.extend(e,{type:this.type,source:this.source,\\\"source-layer\\\":this.sourceLayer,filter:this.filter,layout:o.mapObject(this._layoutDeclarations,i)}),o.filterObject(e,function(t,e){return void 0!==t&&!(\\\"layout\\\"===e&&!Object.keys(t).length)})},_applyPaintDeclaration:function(t,e,n,r,i){var u=n.transition?this._paintTransitions[t]:void 0,l=this._paintSpecifications[t];if(null!==e&&void 0!==e||(e=new s(l,l.default)),!u||u.declaration.json!==e.json){var c=o.extend({duration:300,delay:0},r,this.getPaintProperty(t+\\\"-transition\\\")),p=this._paintTransitions[t]=new a(l,e,u,c);p.instant()||(p.loopID=i.set(p.endTime-Date.now())),u&&i.cancel(u.loopID)}},_updateLayoutValue:function(t){var e=this._layoutDeclarations[t];e&&e.isFunction?this._layoutFunctions[t]=!0:(delete this._layoutFunctions[t],this.layout[t]=this.getLayoutValue(t))},_handleErrors:function(t,e,n,r){return l.emitErrors(this,t.call(l,{key:e,layerType:this.type,objectKey:n,value:r,styleSpec:u,style:{glyphs:!0,sprite:!0}}))}})},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(24);t.exports=function(t){var e=n(25),a=n(7),s={\\\"*\\\":function(){return[]},array:n(26),boolean:n(61),number:n(27),color:n(62),constants:n(22),enum:n(13),filter:n(14),function:n(25),layer:n(28),object:n(7),source:n(31),string:n(32)},u=t.value,l=t.valueSpec,c=t.key,p=t.styleSpec,f=t.style;if(\\\"string\\\"===i(u)&&\\\"@\\\"===u[0]){if(p.$version>7)return[new r(c,u,\\\"constants have been deprecated as of v8\\\")];if(!(u in f.constants))return[new r(c,u,'constant \\\"%s\\\" not found',u)];t=o({},t,{value:f.constants[u]})}return l.function&&\\\"object\\\"===i(u)?e(t):l.type&&s[l.type]?s[l.type](t):a(o({},t,{valueSpec:l.type?p[l.type]:l}))}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(6);t.exports=function(t){var e=t.key,n=t.value,a=t.valueSpec,s=t.objectElementValidators||{},u=t.style,l=t.styleSpec,c=[],p=i(n);if(\\\"object\\\"!==p)return[new r(e,n,\\\"object expected, %s found\\\",p)];for(var f in n){var h=f.split(\\\".\\\")[0],y=a&&(a[h]||a[\\\"*\\\"]),d=s[h]||s[\\\"*\\\"];y||d?c=c.concat((d||o)({key:(e?e+\\\".\\\":e)+f,value:n[f],valueSpec:y,style:u,styleSpec:l,object:n,objectKey:f})):\\\"\\\"!==e&&1!==e.split(\\\".\\\").length&&c.push(new r(e,n[f],'unknown property \\\"%s\\\"',f))}for(h in a)a[h].required&&void 0===a[h].default&&void 0===n[h]&&c.push(new r(e,n,'missing required property \\\"%s\\\"',h));return c}},function(t,e,n){\\\"use strict\\\";function r(t){return{min:-1*Math.pow(2,t-1),max:Math.pow(2,t-1)-1}}var i=n(0),o=n(4).EXTENT,a=n(9),s={15:r(15),16:r(16)};t.exports=function(t,e){var n=s[e||16];a(n);for(var r=o/t.extent,u=t.loadGeometry(),l=0;l<u.length;l++)for(var c=u[l],p=0;p<c.length;p++){var f=c[p];f.x=Math.round(f.x*r),f.y=Math.round(f.y*r),(f.x<n.min||f.x>n.max||f.y<n.min||f.y>n.max)&&i.warnOnce(\\\"Geometry exceeds allowed extent, reduce your vector tile buffer size\\\")}return u}},function(t,e,n){\\\"use strict\\\";(function(e){function r(t,e){if(t===e)return 0;for(var n=t.length,r=e.length,i=0,o=Math.min(n,r);i<o;++i)if(t[i]!==e[i]){n=t[i],r=e[i];break}return n<r?-1:r<n?1:0}function i(t){return e.Buffer&&\\\"function\\\"==typeof e.Buffer.isBuffer?e.Buffer.isBuffer(t):!(null==t||!t._isBuffer)}function o(t){return Object.prototype.toString.call(t)}function a(t){return!i(t)&&(\\\"function\\\"==typeof e.ArrayBuffer&&(\\\"function\\\"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):!!t&&(t instanceof DataView||!!(t.buffer&&t.buffer instanceof ArrayBuffer))))}function s(t){if(S.isFunction(t)){if(M)return t.name;var e=t.toString(),n=e.match(z);return n&&n[1]}}function u(t,e){return\\\"string\\\"==typeof t?t.length<e?t:t.slice(0,e):t}function l(t){if(M||!S.isFunction(t))return S.inspect(t);var e=s(t);return\\\"[Function\\\"+(e?\\\": \\\"+e:\\\"\\\")+\\\"]\\\"}function c(t){return u(l(t.actual),128)+\\\" \\\"+t.operator+\\\" \\\"+u(l(t.expected),128)}function p(t,e,n,r,i){throw new P.AssertionError({message:n,actual:t,expected:e,operator:r,stackStartFunction:i})}function f(t,e){t||p(t,!0,e,\\\"==\\\",P.ok)}function h(t,e,n,s){if(t===e)return!0;if(i(t)&&i(e))return 0===r(t,e);if(S.isDate(t)&&S.isDate(e))return t.getTime()===e.getTime();if(S.isRegExp(t)&&S.isRegExp(e))return t.source===e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&\\\"object\\\"==typeof t||null!==e&&\\\"object\\\"==typeof e){if(a(t)&&a(e)&&o(t)===o(e)&&!(t instanceof Float32Array||t instanceof Float64Array))return 0===r(new Uint8Array(t.buffer),new Uint8Array(e.buffer));if(i(t)!==i(e))return!1;s=s||{actual:[],expected:[]};var u=s.actual.indexOf(t);return-1!==u&&u===s.expected.indexOf(e)||(s.actual.push(t),s.expected.push(e),d(t,e,n,s))}return n?t===e:t==e}function y(t){return\\\"[object Arguments]\\\"==Object.prototype.toString.call(t)}function d(t,e,n,r){if(null===t||void 0===t||null===e||void 0===e)return!1;if(S.isPrimitive(t)||S.isPrimitive(e))return t===e;if(n&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var i=y(t),o=y(e);if(i&&!o||!i&&o)return!1;if(i)return t=A.call(t),e=A.call(e),h(t,e,n);var a,s,u=I(t),l=I(e);if(u.length!==l.length)return!1;for(u.sort(),l.sort(),s=u.length-1;s>=0;s--)if(u[s]!==l[s])return!1;for(s=u.length-1;s>=0;s--)if(a=u[s],!h(t[a],e[a],n,r))return!1;return!0}function m(t,e,n){h(t,e,!0)&&p(t,e,n,\\\"notDeepStrictEqual\\\",m)}function v(t,e){if(!t||!e)return!1;if(\\\"[object RegExp]\\\"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function x(t){var e;try{t()}catch(t){e=t}return e}function g(t,e,n,r){var i;if(\\\"function\\\"!=typeof e)throw new TypeError('\\\"block\\\" argument must be a function');\\\"string\\\"==typeof n&&(r=n,n=null),i=x(e),r=(n&&n.name?\\\" (\\\"+n.name+\\\").\\\":\\\".\\\")+(r?\\\" \\\"+r:\\\".\\\"),t&&!i&&p(i,n,\\\"Missing expected exception\\\"+r);var o=\\\"string\\\"==typeof r,a=!t&&S.isError(i),s=!t&&i&&!n;if((a&&o&&v(i,n)||s)&&p(i,n,\\\"Got unwanted exception\\\"+r),t&&i&&n&&!v(i,n)||!t&&i)throw i}function b(t,e){t||p(t,!0,e,\\\"==\\\",b)}var w=n(80),S=n(23),_=Object.prototype.hasOwnProperty,A=Array.prototype.slice,M=function(){return\\\"foo\\\"===function(){}.name}(),P=t.exports=f,z=/\\\\s*function\\\\s+([^\\\\(\\\\s]*)\\\\s*/;P.AssertionError=function(t){this.name=\\\"AssertionError\\\",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=c(this),this.generatedMessage=!0);var e=t.stackStartFunction||p;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var n=new Error;if(n.stack){var r=n.stack,i=s(e),o=r.indexOf(\\\"\\\\n\\\"+i);if(o>=0){var a=r.indexOf(\\\"\\\\n\\\",o+1);r=r.substring(a+1)}this.stack=r}}},S.inherits(P.AssertionError,Error),P.fail=p,P.ok=f,P.equal=function(t,e,n){t!=e&&p(t,e,n,\\\"==\\\",P.equal)},P.notEqual=function(t,e,n){t==e&&p(t,e,n,\\\"!=\\\",P.notEqual)},P.deepEqual=function(t,e,n){h(t,e,!1)||p(t,e,n,\\\"deepEqual\\\",P.deepEqual)},P.deepStrictEqual=function(t,e,n){h(t,e,!0)||p(t,e,n,\\\"deepStrictEqual\\\",P.deepStrictEqual)},P.notDeepEqual=function(t,e,n){h(t,e,!1)&&p(t,e,n,\\\"notDeepEqual\\\",P.notDeepEqual)},P.notDeepStrictEqual=m,P.strictEqual=function(t,e,n){t!==e&&p(t,e,n,\\\"===\\\",P.strictEqual)},P.notStrictEqual=function(t,e,n){t===e&&p(t,e,n,\\\"!==\\\",P.notStrictEqual)},P.throws=function(t,e,n){g(!0,t,e,n)},P.doesNotThrow=function(t,e,n){g(!1,t,e,n)},P.ifError=function(t){if(t)throw t},P.strict=w(b,P,{equal:P.strictEqual,deepEqual:P.deepStrictEqual,notEqual:P.notStrictEqual,notDeepEqual:P.notDeepStrictEqual}),P.strict.strict=P.strict;var I=Object.keys||function(t){var e=[];for(var n in t)_.call(t,n)&&e.push(n);return e}}).call(e,n(37))},function(t,e,n){\\\"use strict\\\";function r(t){function e(){f.apply(this,arguments)}function n(){h.apply(this,arguments),this.members=e.prototype.members}var r=JSON.stringify(t);if(m[r])return m[r];void 0===t.alignment&&(t.alignment=1),e.prototype=Object.create(f.prototype);var s=0,l=0,v=[\\\"Uint8\\\"];return e.prototype.members=t.members.map(function(n){n={name:n.name,type:n.type,components:n.components||1},y(n.name.length),y(n.type in d),v.indexOf(n.type)<0&&v.push(n.type);var r=a(n.type);l=Math.max(l,r),n.offset=s=o(s,Math.max(t.alignment,r));for(var i=0;i<n.components;i++)Object.defineProperty(e.prototype,n.name+(1===n.components?\\\"\\\":i),{get:c(n,i),set:p(n,i)});return s+=r*n.components,n}),e.prototype.alignment=t.alignment,e.prototype.size=o(s,Math.max(l,t.alignment)),n.serialize=i,n.prototype=Object.create(h.prototype),n.prototype.StructType=e,n.prototype.bytesPerElement=e.prototype.size,n.prototype.emplaceBack=u(e.prototype.members,e.prototype.size),n.prototype._usedTypes=v,m[r]=n,n}function i(){return{members:this.prototype.StructType.prototype.members,alignment:this.prototype.StructType.prototype.alignment,bytesPerElement:this.prototype.bytesPerElement}}function o(t,e){return Math.ceil(t/e)*e}function a(t){return d[t].BYTES_PER_ELEMENT}function s(t){return t.toLowerCase()}function u(t,e){for(var n=[],r=[],i=\\\"var i = this.length;\\\\nthis.resize(this.length + 1);\\\\n\\\",o=0;o<t.length;o++){var u=t[o],l=a(u.type);n.indexOf(l)<0&&(n.push(l),i+=\\\"var o\\\"+l.toFixed(0)+\\\" = i * \\\"+(e/l).toFixed(0)+\\\";\\\\n\\\");for(var c=0;c<u.components;c++){var p=\\\"v\\\"+r.length,f=\\\"o\\\"+l.toFixed(0)+\\\" + \\\"+(u.offset/l+c).toFixed(0);i+=\\\"this.\\\"+s(u.type)+\\\"[\\\"+f+\\\"] = \\\"+p+\\\";\\\\n\\\",r.push(p)}}return i+=\\\"return i;\\\",new Function(r,i)}function l(t,e){var n=\\\"this._pos\\\"+a(t.type).toFixed(0),r=(t.offset/a(t.type)+e).toFixed(0),i=n+\\\" + \\\"+r;return\\\"this._structArray.\\\"+s(t.type)+\\\"[\\\"+i+\\\"]\\\"}function c(t,e){return new Function([],\\\"return \\\"+l(t,e)+\\\";\\\")}function p(t,e){return new Function([\\\"x\\\"],l(t,e)+\\\" = x;\\\")}function f(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8}function h(t){void 0!==t?(this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.capacity=this.arrayBuffer.byteLength/this.bytesPerElement,this._refreshViews()):(this.capacity=-1,this.resize(0))}var y=n(9);t.exports=r;var d={Int8:Int8Array,Uint8:Uint8Array,Uint8Clamped:Uint8ClampedArray,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array,Float64:Float64Array},m={};h.prototype.DEFAULT_CAPACITY=128,h.prototype.RESIZE_MULTIPLIER=5,h.prototype.serialize=function(){return this.trim(),{length:this.length,arrayBuffer:this.arrayBuffer}},h.prototype.get=function(t){return new this.StructType(this,t)},h.prototype.trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},h.prototype.resize=function(t){if(this.length=t,t>this.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*this.RESIZE_MULTIPLIER),this.DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},h.prototype._refreshViews=function(){for(var t=0;t<this._usedTypes.length;t++){var e=this._usedTypes[t];this[s(e)]=new d[e](this.arrayBuffer)}},h.prototype.toArray=function(t,e){for(var n=[],r=t;r<e;r++){var i=this.get(r);n.push(i)}return n}},function(t,e,n){\\\"use strict\\\";t.exports=function(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}},function(t,e,n){t.exports.VectorTile=n(71),t.exports.VectorTileFeature=n(36),t.exports.VectorTileLayer=n(35)},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=[];return-1===o.values.indexOf(i(n))&&a.push(new r(e,n,\\\"expected one of [%s], %s found\\\",o.values.join(\\\", \\\"),n)),a}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(13),o=n(3),a=n(11);t.exports=function t(e){var n,s=e.value,u=e.key,l=e.styleSpec,c=[];if(\\\"array\\\"!==o(s))return[new r(u,s,\\\"array expected, %s found\\\",o(s))];if(s.length<1)return[new r(u,s,\\\"filter array must have at least 1 element\\\")];switch(c=c.concat(i({key:u+\\\"[0]\\\",value:s[0],valueSpec:l.filter_operator,style:e.style,styleSpec:e.styleSpec})),a(s[0])){case\\\"<\\\":case\\\"<=\\\":case\\\">\\\":case\\\">=\\\":s.length>=2&&\\\"$type\\\"==s[1]&&c.push(new r(u,s,'\\\"$type\\\" cannot be use with operator \\\"%s\\\"',s[0]));case\\\"==\\\":case\\\"!=\\\":3!=s.length&&c.push(new r(u,s,'filter array for operator \\\"%s\\\" must have 3 elements',s[0]));case\\\"in\\\":case\\\"!in\\\":s.length>=2&&(n=o(s[1]),\\\"string\\\"!==n?c.push(new r(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new r(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\")));for(var p=2;p<s.length;p++)n=o(s[p]),\\\"$type\\\"==s[1]?c=c.concat(i({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],valueSpec:l.geometry_type,style:e.style,styleSpec:e.styleSpec})):\\\"string\\\"===n&&\\\"@\\\"===s[p][0]?c.push(new r(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"filter value cannot be a constant\\\")):\\\"string\\\"!==n&&\\\"number\\\"!==n&&\\\"boolean\\\"!==n&&c.push(new r(u+\\\"[\\\"+p+\\\"]\\\",s[p],\\\"string, number, or boolean expected, %s found\\\",n));break;case\\\"any\\\":case\\\"all\\\":case\\\"none\\\":for(p=1;p<s.length;p++)c=c.concat(t({key:u+\\\"[\\\"+p+\\\"]\\\",value:s[p],style:e.style,styleSpec:e.styleSpec}));break;case\\\"has\\\":case\\\"!has\\\":n=o(s[1]),2!==s.length?c.push(new r(u,s,'filter array for \\\"%s\\\" operator must have 2 elements',s[0])):\\\"string\\\"!==n?c.push(new r(u+\\\"[1]\\\",s[1],\\\"string expected, %s found\\\",n)):\\\"@\\\"===s[1][0]&&c.push(new r(u+\\\"[1]\\\",s[1],\\\"filter key cannot be a constant\\\"))}return c}},function(t,e,n){\\\"use strict\\\";(function(e){function r(t){this.buf=m.isBuffer(t)?t:new m(t||0),this.pos=0,this.length=this.buf.length}function i(t,e){var n,r=e.buf;if(n=r[e.pos++],t+=268435456*(127&n),n<128)return t;if(n=r[e.pos++],t+=34359738368*(127&n),n<128)return t;if(n=r[e.pos++],t+=4398046511104*(127&n),n<128)return t;if(n=r[e.pos++],t+=562949953421312*(127&n),n<128)return t;if(n=r[e.pos++],t+=72057594037927940*(127&n),n<128)return t;if(n=r[e.pos++],t+=0x8000000000000000*(127&n),n<128)return t;throw new Error(\\\"Expected varint not more than 10 bytes\\\")}function o(t,e){e.realloc(10);for(var n=e.pos+10;t>=1;){if(e.pos>=n)throw new Error(\\\"Given varint doesn't fit into 10 bytes\\\");var r=255&t;e.buf[e.pos++]=r|(t>=128?128:0),t/=128}}function a(t,e,n){var r=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.ceil(Math.log(e)/(7*Math.LN2));n.realloc(r);for(var i=n.pos-1;i>=t;i--)n.buf[i+r]=n.buf[i]}function s(t,e){for(var n=0;n<t.length;n++)e.writeVarint(t[n])}function u(t,e){for(var n=0;n<t.length;n++)e.writeSVarint(t[n])}function l(t,e){for(var n=0;n<t.length;n++)e.writeFloat(t[n])}function c(t,e){for(var n=0;n<t.length;n++)e.writeDouble(t[n])}function p(t,e){for(var n=0;n<t.length;n++)e.writeBoolean(t[n])}function f(t,e){for(var n=0;n<t.length;n++)e.writeFixed32(t[n])}function h(t,e){for(var n=0;n<t.length;n++)e.writeSFixed32(t[n])}function y(t,e){for(var n=0;n<t.length;n++)e.writeFixed64(t[n])}function d(t,e){for(var n=0;n<t.length;n++)e.writeSFixed64(t[n])}t.exports=r;var m=e.Buffer||n(72);r.Varint=0,r.Fixed64=1,r.Bytes=2,r.Fixed32=5;var v=Math.pow(2,63);r.prototype={destroy:function(){this.buf=null},readFields:function(t,e,n){for(n=n||this.length;this.pos<n;){var r=this.readVarint(),i=r>>3,o=this.pos;t(i,e,this),this.pos===o&&this.skip(r)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readUInt32LE(this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+4294967296*this.buf.readInt32LE(this.pos+4);return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,e,n=this.buf;return e=n[this.pos++],t=127&e,e<128?t:(e=n[this.pos++],t|=(127&e)<<7,e<128?t:(e=n[this.pos++],t|=(127&e)<<14,e<128?t:(e=n[this.pos++],t|=(127&e)<<21,e<128?t:i(t,this))))},readVarint64:function(){var t=this.pos,e=this.readVarint();if(e<v)return e;for(var n=this.pos-2;255===this.buf[n];)n--;n<t&&(n=t),e=0;for(var r=0;r<n-t+1;r++){var i=127&~this.buf[t+r];e+=r<4?i<<7*r:i*Math.pow(2,7*r)}return-e-1},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.buf.toString(\\\"utf8\\\",this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.slice(this.pos,t);return this.pos=t,e},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readVarint());return e},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,e=[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(t){var e=7&t;if(e===r.Varint)for(;this.buf[this.pos++]>127;);else if(e===r.Bytes)this.pos=this.readVarint()+this.pos;else if(e===r.Fixed32)this.pos+=4;else{if(e!==r.Fixed64)throw new Error(\\\"Unimplemented type: \\\"+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var n=new m(e);this.buf.copy(n),this.buf=n,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeUInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(-1&t,this.pos),this.buf.writeInt32LE(Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(t){if((t=+t)>268435455)return void o(t,this);this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var e=m.byteLength(t);this.writeVarint(e),this.realloc(e),this.buf.write(t,this.pos),this.pos+=e},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var n=0;n<e;n++)this.buf[this.pos++]=t[n]},writeRawMessage:function(t,e){this.pos++;var n=this.pos;t(e,this);var r=this.pos-n;r>=128&&a(n,r,this),this.pos=n-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,e,n){this.writeTag(t,r.Bytes),this.writeRawMessage(e,n)},writePackedVarint:function(t,e){this.writeMessage(t,s,e)},writePackedSVarint:function(t,e){this.writeMessage(t,u,e)},writePackedBoolean:function(t,e){this.writeMessage(t,p,e)},writePackedFloat:function(t,e){this.writeMessage(t,l,e)},writePackedDouble:function(t,e){this.writeMessage(t,c,e)},writePackedFixed32:function(t,e){this.writeMessage(t,f,e)},writePackedSFixed32:function(t,e){this.writeMessage(t,h,e)},writePackedFixed64:function(t,e){this.writeMessage(t,y,e)},writePackedSFixed64:function(t,e){this.writeMessage(t,d,e)},writeBytesField:function(t,e){this.writeTag(t,r.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,r.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,r.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,r.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,r.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,r.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,r.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,r.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,r.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,r.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}}}).call(e,n(37))},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){var o={id:r||null,type:e,geometry:n,tags:t||null,min:[1/0,1/0],max:[-1/0,-1/0]};return i(o),o}function i(t){var e=t.geometry,n=t.min,r=t.max;if(1===t.type)o(n,r,e);else for(var i=0;i<e.length;i++)o(n,r,e[i]);return t}function o(t,e,n){for(var r,i=0;i<n.length;i++)r=n[i],t[0]=Math.min(r[0],t[0]),e[0]=Math.max(r[0],e[0]),t[1]=Math.min(r[1],t[1]),e[1]=Math.max(r[1],e[1])}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n){return t*(1-n)+e*n}t.exports=r,r.number=r,r.vec2=function(t,e,n){return[r(t[0],e[0],n),r(t[1],e[1],n)]},r.color=function(t,e,n){return[r(t[0],e[0],n),r(t[1],e[1],n),r(t[2],e[2],n),r(t[3],e[3],n)]},r.array=function(t,e,n){return t.map(function(t,i){return r(t,e[i],n)})}},function(t,e,n){\\\"use strict\\\";var r=n(53);e.interpolated=function(t){var e=r.interpolated(t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e[\\\"piecewise-constant\\\"]=function(t){var e=r[\\\"piecewise-constant\\\"](t),n=function(t,n){return e(t&&t.zoom,n||{})};return n.isFeatureConstant=e.isFeatureConstant,n.isZoomConstant=e.isZoomConstant,n},e.isFunctionDefinition=r.isFunctionDefinition},function(t,e,n){\\\"use strict\\\";var r=n(20).parseCSSColor,i=n(0),o=n(18),a={};t.exports=function t(e){if(o.isFunctionDefinition(e))return i.extend({},e,{stops:e.stops.map(function(e){return[e[0],t(e[1])]})});if(\\\"string\\\"==typeof e){if(!a[e]){var n=r(e);if(!n)throw new Error(\\\"Invalid color \\\"+e);a[e]=[n[0]/255*n[3],n[1]/255*n[3],n[2]/255*n[3],n[3]]}return a[e]}throw new Error(\\\"Invalid color \\\"+e)}},function(t,e){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function r(t){return t<0?0:t>1?1:t}function i(t){return n(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100*255:parseInt(t))}function o(t){return r(\\\"%\\\"===t[t.length-1]?parseFloat(t)/100:parseFloat(t))}function a(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function s(t){var e=t.replace(/ /g,\\\"\\\").toLowerCase();if(e in u)return u[e].slice();if(\\\"#\\\"===e[0]){if(4===e.length){var r=parseInt(e.substr(1),16);return r>=0&&r<=4095?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===e.length){var r=parseInt(e.substr(1),16);return r>=0&&r<=16777215?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var s=e.indexOf(\\\"(\\\"),l=e.indexOf(\\\")\\\");if(-1!==s&&l+1===e.length){var c=e.substr(0,s),p=e.substr(s+1,l-(s+1)).split(\\\",\\\"),f=1;switch(c){case\\\"rgba\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"rgb\\\":return 3!==p.length?null:[i(p[0]),i(p[1]),i(p[2]),f];case\\\"hsla\\\":if(4!==p.length)return null;f=o(p.pop());case\\\"hsl\\\":if(3!==p.length)return null;var h=(parseFloat(p[0])%360+360)%360/360,y=o(p[1]),d=o(p[2]),m=d<=.5?d*(y+1):d+y-d*y,v=2*d-m;return[n(255*a(v,m,h+1/3)),n(255*a(v,m,h)),n(255*a(v,m,h-1/3)),f];default:return null}}return null}var u={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{e.parseCSSColor=s}catch(t){}},function(t,e,n){t.exports=n(55)},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3);t.exports=function(t){var e=t.key,n=t.value;if(t.styleSpec.$version>7)return n?[new r(e,n,\\\"constants have been deprecated as of v8\\\")]:[];var o=i(n);if(\\\"object\\\"!==o)return[new r(e,n,\\\"object expected, %s found\\\",o)];var a=[];for(var s in n)\\\"@\\\"!==s[0]&&a.push(new r(e+\\\".\\\"+s,n[s],'constants must start with \\\"@\\\"'));return a}},function(t,e,n){(function(t){function r(t,n){var r={seen:[],stylize:o};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),y(n)?r.showHidden=n:n&&e._extend(r,n),b(r.showHidden)&&(r.showHidden=!1),b(r.depth)&&(r.depth=2),b(r.colors)&&(r.colors=!1),b(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=i),s(r,t,r.depth)}function i(t,e){var n=r.styles[e];return n?\\\"\\u001b[\\\"+r.colors[n][0]+\\\"m\\\"+t+\\\"\\u001b[\\\"+r.colors[n][1]+\\\"m\\\":t}function o(t,e){return t}function a(t){var e={};return t.forEach(function(t,n){e[t]=!0}),e}function s(t,n,r){if(t.customInspect&&n&&M(n.inspect)&&n.inspect!==e.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,t);return x(i)||(i=s(t,i,r)),i}var o=u(t,n);if(o)return o;var y=Object.keys(n),d=a(y);if(t.showHidden&&(y=Object.getOwnPropertyNames(n)),A(n)&&(y.indexOf(\\\"message\\\")>=0||y.indexOf(\\\"description\\\")>=0))return l(n);if(0===y.length){if(M(n)){var m=n.name?\\\": \\\"+n.name:\\\"\\\";return t.stylize(\\\"[Function\\\"+m+\\\"]\\\",\\\"special\\\")}if(w(n))return t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\");if(_(n))return t.stylize(Date.prototype.toString.call(n),\\\"date\\\");if(A(n))return l(n)}var v=\\\"\\\",g=!1,b=[\\\"{\\\",\\\"}\\\"];if(h(n)&&(g=!0,b=[\\\"[\\\",\\\"]\\\"]),M(n)){v=\\\" [Function\\\"+(n.name?\\\": \\\"+n.name:\\\"\\\")+\\\"]\\\"}if(w(n)&&(v=\\\" \\\"+RegExp.prototype.toString.call(n)),_(n)&&(v=\\\" \\\"+Date.prototype.toUTCString.call(n)),A(n)&&(v=\\\" \\\"+l(n)),0===y.length&&(!g||0==n.length))return b[0]+v+b[1];if(r<0)return w(n)?t.stylize(RegExp.prototype.toString.call(n),\\\"regexp\\\"):t.stylize(\\\"[Object]\\\",\\\"special\\\");t.seen.push(n);var S;return S=g?c(t,n,r,d,y):y.map(function(e){return p(t,n,r,d,e,g)}),t.seen.pop(),f(S,v,b)}function u(t,e){if(b(e))return t.stylize(\\\"undefined\\\",\\\"undefined\\\");if(x(e)){var n=\\\"'\\\"+JSON.stringify(e).replace(/^\\\"|\\\"$/g,\\\"\\\").replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"')+\\\"'\\\";return t.stylize(n,\\\"string\\\")}return v(e)?t.stylize(\\\"\\\"+e,\\\"number\\\"):y(e)?t.stylize(\\\"\\\"+e,\\\"boolean\\\"):d(e)?t.stylize(\\\"null\\\",\\\"null\\\"):void 0}function l(t){return\\\"[\\\"+Error.prototype.toString.call(t)+\\\"]\\\"}function c(t,e,n,r,i){for(var o=[],a=0,s=e.length;a<s;++a)V(e,String(a))?o.push(p(t,e,n,r,String(a),!0)):o.push(\\\"\\\");return i.forEach(function(i){i.match(/^\\\\d+$/)||o.push(p(t,e,n,r,i,!0))}),o}function p(t,e,n,r,i,o){var a,u,l;if(l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]},l.get?u=l.set?t.stylize(\\\"[Getter/Setter]\\\",\\\"special\\\"):t.stylize(\\\"[Getter]\\\",\\\"special\\\"):l.set&&(u=t.stylize(\\\"[Setter]\\\",\\\"special\\\")),V(r,i)||(a=\\\"[\\\"+i+\\\"]\\\"),u||(t.seen.indexOf(l.value)<0?(u=d(n)?s(t,l.value,null):s(t,l.value,n-1),u.indexOf(\\\"\\\\n\\\")>-1&&(u=o?u.split(\\\"\\\\n\\\").map(function(t){return\\\"  \\\"+t}).join(\\\"\\\\n\\\").substr(2):\\\"\\\\n\\\"+u.split(\\\"\\\\n\\\").map(function(t){return\\\"   \\\"+t}).join(\\\"\\\\n\\\"))):u=t.stylize(\\\"[Circular]\\\",\\\"special\\\")),b(a)){if(o&&i.match(/^\\\\d+$/))return u;a=JSON.stringify(\\\"\\\"+i),a.match(/^\\\"([a-zA-Z_][a-zA-Z_0-9]*)\\\"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,\\\"name\\\")):(a=a.replace(/'/g,\\\"\\\\\\\\'\\\").replace(/\\\\\\\\\\\"/g,'\\\"').replace(/(^\\\"|\\\"$)/g,\\\"'\\\"),a=t.stylize(a,\\\"string\\\"))}return a+\\\": \\\"+u}function f(t,e,n){var r=0;return t.reduce(function(t,e){return r++,e.indexOf(\\\"\\\\n\\\")>=0&&r++,t+e.replace(/\\\\u001b\\\\[\\\\d\\\\d?m/g,\\\"\\\").length+1},0)>60?n[0]+(\\\"\\\"===e?\\\"\\\":e+\\\"\\\\n \\\")+\\\" \\\"+t.join(\\\",\\\\n  \\\")+\\\" \\\"+n[1]:n[0]+e+\\\" \\\"+t.join(\\\", \\\")+\\\" \\\"+n[1]}function h(t){return Array.isArray(t)}function y(t){return\\\"boolean\\\"==typeof t}function d(t){return null===t}function m(t){return null==t}function v(t){return\\\"number\\\"==typeof t}function x(t){return\\\"string\\\"==typeof t}function g(t){return\\\"symbol\\\"==typeof t}function b(t){return void 0===t}function w(t){return S(t)&&\\\"[object RegExp]\\\"===z(t)}function S(t){return\\\"object\\\"==typeof t&&null!==t}function _(t){return S(t)&&\\\"[object Date]\\\"===z(t)}function A(t){return S(t)&&(\\\"[object Error]\\\"===z(t)||t instanceof Error)}function M(t){return\\\"function\\\"==typeof t}function P(t){return null===t||\\\"boolean\\\"==typeof t||\\\"number\\\"==typeof t||\\\"string\\\"==typeof t||\\\"symbol\\\"==typeof t||void 0===t}function z(t){return Object.prototype.toString.call(t)}function I(t){return t<10?\\\"0\\\"+t.toString(10):t.toString(10)}function T(){var t=new Date,e=[I(t.getHours()),I(t.getMinutes()),I(t.getSeconds())].join(\\\":\\\");return[t.getDate(),B[t.getMonth()],e].join(\\\" \\\")}function V(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function k(t,e){if(!t){var n=new Error(\\\"Promise was rejected with a falsy value\\\");n.reason=t,t=n}return e(t)}function E(e){function n(){for(var n=[],r=0;r<arguments.length;r++)n.push(arguments[r]);var i=n.pop();if(\\\"function\\\"!=typeof i)throw new TypeError(\\\"The last argument must be of type Function\\\");var o=this,a=function(){return i.apply(o,arguments)};e.apply(this,n).then(function(e){t.nextTick(a,null,e)},function(e){t.nextTick(k,e,a)})}if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"original\\\" argument must be of type Function');return Object.setPrototypeOf(n,Object.getPrototypeOf(e)),Object.defineProperties(n,F(e)),n}var F=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),n={},r=0;r<e.length;r++)n[e[r]]=Object.getOwnPropertyDescriptor(t,e[r]);return n},j=/%[sdj%]/g;e.format=function(t){if(!x(t)){for(var e=[],n=0;n<arguments.length;n++)e.push(r(arguments[n]));return e.join(\\\" \\\")}for(var n=1,i=arguments,o=i.length,a=String(t).replace(j,function(t){if(\\\"%%\\\"===t)return\\\"%\\\";if(n>=o)return t;switch(t){case\\\"%s\\\":return String(i[n++]);case\\\"%d\\\":return Number(i[n++]);case\\\"%j\\\":try{return JSON.stringify(i[n++])}catch(t){return\\\"[Circular]\\\"}default:return t}}),s=i[n];n<o;s=i[++n])d(s)||!S(s)?a+=\\\" \\\"+s:a+=\\\" \\\"+r(s);return a},e.deprecate=function(n,r){function i(){if(!o){if(t.throwDeprecation)throw new Error(r);t.traceDeprecation?console.trace(r):console.error(r),o=!0}return n.apply(this,arguments)}if(void 0!==t&&!0===t.noDeprecation)return n;if(void 0===t)return function(){return e.deprecate(n,r).apply(this,arguments)};var o=!1;return i};var L,O={};e.debuglog=function(n){if(b(L)&&(L=Object({NODE_ENV:\\\"production\\\"}).NODE_DEBUG||\\\"\\\"),n=n.toUpperCase(),!O[n])if(new RegExp(\\\"\\\\\\\\b\\\"+n+\\\"\\\\\\\\b\\\",\\\"i\\\").test(L)){var r=t.pid;O[n]=function(){var t=e.format.apply(e,arguments);console.error(\\\"%s %d: %s\\\",n,r,t)}}else O[n]=function(){};return O[n]},e.inspect=r,r.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r.styles={special:\\\"cyan\\\",number:\\\"yellow\\\",boolean:\\\"yellow\\\",undefined:\\\"grey\\\",null:\\\"bold\\\",string:\\\"green\\\",date:\\\"magenta\\\",regexp:\\\"red\\\"},e.isArray=h,e.isBoolean=y,e.isNull=d,e.isNullOrUndefined=m,e.isNumber=v,e.isString=x,e.isSymbol=g,e.isUndefined=b,e.isRegExp=w,e.isObject=S,e.isDate=_,e.isError=A,e.isFunction=M,e.isPrimitive=P,e.isBuffer=n(59);var B=[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"];e.log=function(){console.log(\\\"%s - %s\\\",T(),e.format.apply(e,arguments))},e.inherits=n(60),e._extend=function(t,e){if(!e||!S(e))return t;for(var n=Object.keys(e),r=n.length;r--;)t[n[r]]=e[n[r]];return t};var C=\\\"undefined\\\"!=typeof Symbol?Symbol(\\\"util.promisify.custom\\\"):void 0;e.promisify=function(t){function e(){for(var e,n,r=new Promise(function(t,r){e=t,n=r}),i=[],o=0;o<arguments.length;o++)i.push(arguments[o]);i.push(function(t,r){t?n(t):e(r)});try{t.apply(this,i)}catch(t){n(t)}return r}if(\\\"function\\\"!=typeof t)throw new TypeError('The \\\"original\\\" argument must be of type Function');if(C&&t[C]){var e=t[C];if(\\\"function\\\"!=typeof e)throw new TypeError('The \\\"util.promisify.custom\\\" argument must be of type Function');return Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),C&&Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,F(t))},e.promisify.custom=C,e.callbackify=E}).call(e,n(58))},function(t,e,n){\\\"use strict\\\";t.exports=function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(6),a=n(7),s=n(26),u=n(27);t.exports=function(t){function e(t){var e=[],o=t.value;return e=e.concat(s({key:t.key,value:o,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:n})),\\\"array\\\"===i(o)&&0===o.length&&e.push(new r(t.key,o,\\\"array must have at least one stop\\\")),e}function n(t){var e=[],n=t.value,s=t.key;if(\\\"array\\\"!==i(n))return[new r(s,n,\\\"array expected, %s found\\\",i(n))];if(2!==n.length)return[new r(s,n,\\\"array length %d expected, length %d found\\\",2,n.length)];var f=i(n[0]);if(c||(c=f),f!==c)return[new r(s,n,\\\"%s stop key type must match previous stop key type %s\\\",f,c)];if(\\\"object\\\"===f){if(void 0===n[0].zoom)return[new r(s,n,\\\"object stop key must have zoom\\\")];if(void 0===n[0].value)return[new r(s,n,\\\"object stop key must have value\\\")];e=e.concat(a({key:s+\\\"[0]\\\",value:n[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:u,value:l}}))}else e=e.concat((h?u:l)({key:s+\\\"[0]\\\",value:n[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec}));return e=e.concat(o({key:s+\\\"[1]\\\",value:n[1],valueSpec:p,style:t.style,styleSpec:t.styleSpec})),\\\"number\\\"===i(n[0])&&(\\\"piecewise-constant\\\"===p.function&&n[0]%1!=0&&e.push(new r(s+\\\"[0]\\\",n[0],\\\"zoom level for piecewise-constant functions must be an integer\\\")),0!==t.arrayIndex&&n[0]<t.array[t.arrayIndex-1][0]&&e.push(new r(s+\\\"[0]\\\",n[0],\\\"array stops must appear in ascending order\\\"))),e}function l(t){var e=[],n=i(t.value);return\\\"number\\\"!==n&&\\\"string\\\"!==n&&\\\"array\\\"!==n&&e.push(new r(t.key,t.value,\\\"property value must be a number, string or array\\\")),e}var c,p=t.valueSpec,f=void 0!==t.value.property||\\\"object\\\"===c,h=void 0===t.value.property||\\\"object\\\"===c,y=a({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:e}});return t.styleSpec.$version>=8&&(f&&!t.valueSpec[\\\"property-function\\\"]?y.push(new r(t.key,t.value,\\\"property functions not supported\\\")):h&&!t.valueSpec[\\\"zoom-function\\\"]&&y.push(new r(t.key,t.value,\\\"zoom functions not supported\\\"))),y}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(6),o=n(1);t.exports=function(t){var e=t.value,n=t.valueSpec,a=t.style,s=t.styleSpec,u=t.key,l=t.arrayElementValidator||i;if(\\\"array\\\"!==r(e))return[new o(u,e,\\\"array expected, %s found\\\",r(e))];if(n.length&&e.length!==n.length)return[new o(u,e,\\\"array length %d expected, length %d found\\\",n.length,e.length)];if(n[\\\"min-length\\\"]&&e.length<n[\\\"min-length\\\"])return[new o(u,e,\\\"array length at least %d expected, length %d found\\\",n[\\\"min-length\\\"],e.length)];var c={type:n.value};s.$version<7&&(c.function=n.function),\\\"object\\\"===r(n.value)&&(c=n.value);for(var p=[],f=0;f<e.length;f++)p=p.concat(l({array:e,arrayIndex:f,value:e[f],valueSpec:c,style:a,styleSpec:s,key:u+\\\"[\\\"+f+\\\"]\\\"}));return p}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.key,n=t.value,o=t.valueSpec,a=r(n);return\\\"number\\\"!==a?[new i(e,n,\\\"number expected, %s found\\\",a)]:\\\"minimum\\\"in o&&n<o.minimum?[new i(e,n,\\\"%s is less than the minimum value %s\\\",n,o.minimum)]:\\\"maximum\\\"in o&&n>o.maximum?[new i(e,n,\\\"%s is greater than the maximum value %s\\\",n,o.maximum)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11),o=n(7),a=n(14),s=n(29),u=n(30),l=n(24);t.exports=function(t){var e=[],n=t.value,c=t.key,p=t.style,f=t.styleSpec;n.type||n.ref||e.push(new r(c,n,'either \\\"type\\\" or \\\"ref\\\" is required'));var h=i(n.type),y=i(n.ref);if(n.id)for(var d=0;d<t.arrayIndex;d++){var m=p.layers[d];i(m.id)===i(n.id)&&e.push(new r(c,n.id,'duplicate layer id \\\"%s\\\", previously used at line %d',n.id,m.id.__line__))}if(\\\"ref\\\"in n){[\\\"type\\\",\\\"source\\\",\\\"source-layer\\\",\\\"filter\\\",\\\"layout\\\"].forEach(function(t){t in n&&e.push(new r(c,n[t],'\\\"%s\\\" is prohibited for ref layers',t))});var v;p.layers.forEach(function(t){t.id==y&&(v=t)}),v?v.ref?e.push(new r(c,n.ref,\\\"ref cannot reference another ref layer\\\")):h=i(v.type):e.push(new r(c,n.ref,'ref layer \\\"%s\\\" not found',y))}else if(\\\"background\\\"!==h)if(n.source){var x=p.sources&&p.sources[n.source];x?\\\"vector\\\"==x.type&&\\\"raster\\\"==h?e.push(new r(c,n.source,'layer \\\"%s\\\" requires a raster source',n.id)):\\\"raster\\\"==x.type&&\\\"raster\\\"!=h?e.push(new r(c,n.source,'layer \\\"%s\\\" requires a vector source',n.id)):\\\"vector\\\"!=x.type||n[\\\"source-layer\\\"]||e.push(new r(c,n,'layer \\\"%s\\\" must specify a \\\"source-layer\\\"',n.id)):e.push(new r(c,n.source,'source \\\"%s\\\" not found',n.source))}else e.push(new r(c,n,'missing required property \\\"source\\\"'));return e=e.concat(o({key:c,value:n,valueSpec:f.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{filter:a,layout:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return u(l({layerType:h},t))}}})},paint:function(t){return o({layer:n,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{\\\"*\\\":function(t){return s(l({layerType:h},t))}}})}}}))}},function(t,e,n){\\\"use strict\\\";var r=n(6),i=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"paint_\\\"+t.layerType],l=s.match(/^(.*)-transition$/);return l&&u[l[1]]&&u[l[1]].transition?r({key:e,value:a,valueSpec:o.transition,style:n,styleSpec:o}):t.valueSpec||u[s]?r({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}):[new i(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var r=n(6),i=n(1);t.exports=function(t){var e=t.key,n=t.style,o=t.styleSpec,a=t.value,s=t.objectKey,u=o[\\\"layout_\\\"+t.layerType];if(t.valueSpec||u[s]){var l=[];return\\\"symbol\\\"===t.layerType&&(\\\"icon-image\\\"===s&&n&&!n.sprite?l.push(new i(e,a,'use of \\\"icon-image\\\" requires a style \\\"sprite\\\" property')):\\\"text-field\\\"===s&&n&&!n.glyphs&&l.push(new i(e,a,'use of \\\"text-field\\\" requires a style \\\"glyphs\\\" property'))),l.concat(r({key:t.key,value:a,valueSpec:t.valueSpec||u[s],style:n,styleSpec:o}))}return[new i(e,a,'unknown property \\\"%s\\\"',s)]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(11),o=n(7),a=n(13);t.exports=function(t){var e=t.value,n=t.key,s=t.styleSpec,u=t.style;if(!e.type)return[new r(n,e,'\\\"type\\\" is required')];switch(i(e.type)){case\\\"vector\\\":case\\\"raster\\\":var l=[];if(l=l.concat(o({key:n,value:e,valueSpec:s.source_tile,style:t.style,styleSpec:s})),\\\"url\\\"in e)for(var c in e)[\\\"type\\\",\\\"url\\\",\\\"tileSize\\\"].indexOf(c)<0&&l.push(new r(n+\\\".\\\"+c,e[c],'a source with a \\\"url\\\" property may not include a \\\"%s\\\" property',c));return l;case\\\"geojson\\\":return o({key:n,value:e,valueSpec:s.source_geojson,style:u,styleSpec:s});case\\\"video\\\":return o({key:n,value:e,valueSpec:s.source_video,style:u,styleSpec:s});case\\\"image\\\":return o({key:n,value:e,valueSpec:s.source_image,style:u,styleSpec:s});default:return a({key:n+\\\".type\\\",value:e.type,valueSpec:{values:[\\\"vector\\\",\\\"raster\\\",\\\"geojson\\\",\\\"video\\\",\\\"image\\\"]},style:u,styleSpec:s})}}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.value,n=t.key,o=r(e);return\\\"string\\\"!==o?[new i(n,e,\\\"string expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.actor=t,this.styleLayers=e,n&&(this.loadVectorData=n),this.loading={},this.loaded={}}var i=n(34),o=n(12),a=n(15),s=n(74);t.exports=r,r.prototype={loadTile:function(t,e){function n(t,n){return delete this.loading[r][i],t?e(t):n?(o.data=n.tile,o.parse(o.data,this.styleLayers.getLayerFamilies(),this.actor,n.rawTileData,e),this.loaded[r]=this.loaded[r]||{},void(this.loaded[r][i]=o)):e(null,null)}var r=t.source,i=t.uid;this.loading[r]||(this.loading[r]={});var o=this.loading[r][i]=new s(t);o.abort=this.loadVectorData(t,n.bind(this))},reloadTile:function(t,e){var n=this.loaded[t.source],r=t.uid;if(n&&n[r]){var i=n[r];i.parse(i.data,this.styleLayers.getLayerFamilies(),this.actor,t.rawTileData,e)}},abortTile:function(t){var e=this.loading[t.source],n=t.uid;e&&e[n]&&e[n].abort&&(e[n].abort(),delete e[n])},removeTile:function(t){var e=this.loaded[t.source],n=t.uid;e&&e[n]&&delete e[n]},loadVectorData:function(t,e){function n(t,n){if(t)return e(t);var r=new o.VectorTile(new a(new Uint8Array(n)));e(t,{tile:r,rawTileData:n})}var r=i.getArrayBuffer(t.url,n.bind(this));return function(){r.abort()}},redoPlacement:function(t,e){var n=this.loaded[t.source],r=this.loading[t.source],i=t.uid;if(n&&n[i]){var o=n[i],a=o.redoPlacement(t.angle,t.pitch,t.showCollisionBoxes);a.result&&e(null,a.result,a.transferables)}else r&&r[i]&&(r[i].angle=t.angle)}}},function(t,e,n){\\\"use strict\\\";function r(t){var e=document.createElement(\\\"a\\\");return e.href=t,e.protocol===document.location.protocol&&e.host===document.location.host}e.getJSON=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.setRequestHeader(\\\"Accept\\\",\\\"application/json\\\"),n.onerror=function(t){e(t)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var t;try{t=JSON.parse(n.response)}catch(t){return e(t)}e(null,t)}else e(new Error(n.statusText))},n.send(),n},e.getArrayBuffer=function(t,e){var n=new XMLHttpRequest;return n.open(\\\"GET\\\",t,!0),n.responseType=\\\"arraybuffer\\\",n.onerror=function(t){e(t)},n.onload=function(){n.status>=200&&n.status<300&&n.response?e(null,n.response):e(new Error(n.statusText))},n.send(),n},e.getImage=function(t,n){return e.getArrayBuffer(t,function(t,e){if(t)return n(t);var r=new Image;r.onload=function(){n(null,r),(window.URL||window.webkitURL).revokeObjectURL(r.src)};var i=new Blob([new Uint8Array(e)],{type:\\\"image/png\\\"});return r.src=(window.URL||window.webkitURL).createObjectURL(i),r.getData=function(){var t=document.createElement(\\\"canvas\\\"),e=t.getContext(\\\"2d\\\");return t.width=r.width,t.height=r.height,e.drawImage(r,0,0),e.getImageData(0,0,r.width,r.height).data},r})},e.getVideo=function(t,e){var n=document.createElement(\\\"video\\\");n.onloadstart=function(){e(null,n)};for(var i=0;i<t.length;i++){var o=document.createElement(\\\"source\\\");r(t[i])||(n.crossOrigin=\\\"Anonymous\\\"),o.src=t[i],n.appendChild(o)}return n.getData=function(){return n},n}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(i,this,e),this.length=this._features.length}function i(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():5===t?e.extent=n.readVarint():2===t?e._features.push(n.pos):3===t?e._keys.push(n.readString()):4===t&&e._values.push(o(n))}function o(t){for(var e=null,n=t.readVarint()+t.pos;t.pos<n;){var r=t.readVarint()>>3;e=1===r?t.readString():2===r?t.readFloat():3===r?t.readDouble():4===r?t.readVarint64():5===r?t.readVarint():6===r?t.readSVarint():7===r?t.readBoolean():null}return e}var a=n(36);t.exports=r,r.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error(\\\"feature index out of bounds\\\");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new a(this._pbf,e,this.extent,this._keys,this._values)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){this.properties={},this.extent=n,this.type=0,this._pbf=t,this._geometry=-1,this._keys=r,this._values=o,t.readFields(i,this,e)}function i(t,e,n){1==t?e.id=n.readVarint():2==t?o(n,e):3==t?e.type=n.readVarint():4==t&&(e._geometry=n.pos)}function o(t,e){for(var n=t.readVarint()+t.pos;t.pos<n;){var r=e._keys[t.readVarint()],i=e._values[t.readVarint()];e.properties[r]=i}}function a(t){var e=t.length;if(e<=1)return[t];for(var n,r,i=[],o=0;o<e;o++){var a=s(t[o]);0!==a&&(void 0===r&&(r=a<0),r===a<0?(n&&i.push(n),n=[t[o]]):n.push(t[o]))}return n&&i.push(n),i}function s(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n.x-e.x)*(e.y+n.y);return r}var u=n(2);t.exports=r,r.types=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"],r.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,n=t.readVarint()+t.pos,r=1,i=0,o=0,a=0,s=[];t.pos<n;){if(!i){var l=t.readVarint();r=7&l,i=l>>3}if(i--,1===r||2===r)o+=t.readSVarint(),a+=t.readSVarint(),1===r&&(e&&s.push(e),e=[]),e.push(new u(o,a));else{if(7!==r)throw new Error(\\\"unknown command \\\"+r);e&&e.push(e[0].clone())}}return e&&s.push(e),s},r.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,n=1,r=0,i=0,o=0,a=1/0,s=-1/0,u=1/0,l=-1/0;t.pos<e;){if(!r){var c=t.readVarint();n=7&c,r=c>>3}if(r--,1===n||2===n)i+=t.readSVarint(),o+=t.readSVarint(),i<a&&(a=i),i>s&&(s=i),o<u&&(u=o),o>l&&(l=o);else if(7!==n)throw new Error(\\\"unknown command \\\"+n)}return[a,u,s,l]},r.prototype.toGeoJSON=function(t,e,n){function i(t){for(var e=0;e<t.length;e++){var n=t[e],r=180-360*(n.y+c)/u;t[e]=[360*(n.x+l)/u-180,360/Math.PI*Math.atan(Math.exp(r*Math.PI/180))-90]}}var o,s,u=this.extent*Math.pow(2,n),l=this.extent*t,c=this.extent*e,p=this.loadGeometry(),f=r.types[this.type];switch(this.type){case 1:var h=[];for(o=0;o<p.length;o++)h[o]=p[o][0];p=h,i(p);break;case 2:for(o=0;o<p.length;o++)i(p[o]);break;case 3:for(p=a(p),o=0;o<p.length;o++)for(s=0;s<p[o].length;s++)i(p[o][s])}1===p.length?p=p[0]:f=\\\"Multi\\\"+f;var y={type:\\\"Feature\\\",geometry:{type:f,coordinates:p},properties:this.properties};return\\\"id\\\"in this&&(y.id=this.id),y}},function(t,e){var n;n=function(){return this}();try{n=n||Function(\\\"return this\\\")()||(0,eval)(\\\"this\\\")}catch(t){\\\"object\\\"==typeof window&&(n=window)}t.exports=n},function(t,e,n){\\\"use strict\\\";function r(t){return new Function(\\\"f\\\",\\\"var p = (f && f.properties || {}); return \\\"+i(t))}function i(t){if(!t)return\\\"true\\\";var e=t[0];return t.length<=1?\\\"any\\\"===e?\\\"false\\\":\\\"true\\\":\\\"(\\\"+(\\\"==\\\"===e?a(t[1],t[2],\\\"===\\\",!1):\\\"!=\\\"===e?a(t[1],t[2],\\\"!==\\\",!1):\\\"<\\\"===e||\\\">\\\"===e||\\\"<=\\\"===e||\\\">=\\\"===e?a(t[1],t[2],e,!0):\\\"any\\\"===e?s(t.slice(1),\\\"||\\\"):\\\"all\\\"===e?s(t.slice(1),\\\"&&\\\"):\\\"none\\\"===e?c(s(t.slice(1),\\\"||\\\")):\\\"in\\\"===e?u(t[1],t.slice(2)):\\\"!in\\\"===e?c(u(t[1],t.slice(2))):\\\"has\\\"===e?l(t[1]):\\\"!has\\\"===e?c(l([t[1]])):\\\"true\\\")+\\\")\\\"}function o(t){return\\\"$type\\\"===t?\\\"f.type\\\":\\\"$id\\\"===t?\\\"f.id\\\":\\\"p[\\\"+JSON.stringify(t)+\\\"]\\\"}function a(t,e,n,r){var i=o(t),a=\\\"$type\\\"===t?f.indexOf(e):JSON.stringify(e);return(r?\\\"typeof \\\"+i+\\\"=== typeof \\\"+a+\\\"&&\\\":\\\"\\\")+i+n+a}function s(t,e){return t.map(i).join(e)}function u(t,e){\\\"$type\\\"===t&&(e=e.map(function(t){return f.indexOf(t)}));var n=JSON.stringify(e.sort(p)),r=o(t);return e.length<=200?n+\\\".indexOf(\\\"+r+\\\") !== -1\\\":\\\"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1;    if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }(\\\"+r+\\\", \\\"+n+\\\",0,\\\"+(e.length-1)+\\\")\\\"}function l(t){return JSON.stringify(t)+\\\" in p\\\"}function c(t){return\\\"!(\\\"+t+\\\")\\\"}function p(t,e){return t<e?-1:t>e?1:0}t.exports=r;var f=[\\\"Unknown\\\",\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.area-t.area}var i=n(83),o=n(0).calculateSignedArea;t.exports=function(t,e){var n=t.length;if(n<=1)return[t];for(var a,s,u=[],l=0;l<n;l++){var c=o(t[l]);0!==c&&(t[l].area=Math.abs(c),void 0===s&&(s=c<0),s===c<0?(a&&u.push(a),a=[t[l]]):a.push(t[l]))}if(a&&u.push(a),e>1)for(var p=0;p<u.length;p++)u[p].length<=e||(i(u[p],e,1,u[p].length-1,r),u[p]=u[p].slice(0,e));return u}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.x=t,this.y=e,this.angle=n,void 0!==r&&(this.segment=r)}var i=n(2);t.exports=r,r.prototype=Object.create(i.prototype),r.prototype.clone=function(){return new r(this.x,this.y,this.angle,this.segment)}},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.replace(/{([^{}]+)}/g,function(e,n){return n in t?t[n]:\\\"\\\"})}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a,s,u,l){this.anchorPoint=t,this.tl=e,this.tr=n,this.bl=r,this.br=i,this.tex=o,this.anchorAngle=a,this.glyphAngle=s,this.minScale=u,this.maxScale=l}function i(t,e,n,i,o,a,l,c,p){var f,h,y,d,m=e.image.rect,v=o.layout,x=e.left-1,g=x+m.w/e.image.pixelRatio,b=e.top-1,w=b+m.h/e.image.pixelRatio;if(\\\"none\\\"!==v[\\\"icon-text-fit\\\"]&&l){var S=g-x,_=w-b,A=v[\\\"text-size\\\"]/24,M=l.left*A,P=l.right*A,z=l.top*A,I=l.bottom*A,T=P-M,V=I-z,k=v[\\\"icon-text-fit-padding\\\"][0],E=v[\\\"icon-text-fit-padding\\\"][1],F=v[\\\"icon-text-fit-padding\\\"][2],j=v[\\\"icon-text-fit-padding\\\"][3],L=\\\"width\\\"===v[\\\"icon-text-fit\\\"]?.5*(V-_):0,O=\\\"height\\\"===v[\\\"icon-text-fit\\\"]?.5*(T-S):0,B=\\\"width\\\"===v[\\\"icon-text-fit\\\"]||\\\"both\\\"===v[\\\"icon-text-fit\\\"]?T:S,C=\\\"height\\\"===v[\\\"icon-text-fit\\\"]||\\\"both\\\"===v[\\\"icon-text-fit\\\"]?V:_;f=new s(M+O-j,z+L-k),h=new s(M+O+E+B,z+L-k),y=new s(M+O+E+B,z+L+F+C),d=new s(M+O-j,z+L+F+C)}else f=new s(x,b),h=new s(g,b),y=new s(g,w),d=new s(x,w);var q=o.getLayoutValue(\\\"icon-rotate\\\",c,p)*Math.PI/180;if(a){var D=i[t.segment];if(t.y===D.y&&t.x===D.x&&t.segment+1<i.length){var N=i[t.segment+1];q+=Math.atan2(t.y-N.y,t.x-N.x)+Math.PI}else q+=Math.atan2(t.y-D.y,t.x-D.x)}if(q){var U=Math.sin(q),Z=Math.cos(q),G=[Z,-U,U,Z];f=f.matMult(G),h=h.matMult(G),d=d.matMult(G),y=y.matMult(G)}return[new r(new s(t.x,t.y),f,h,d,y,e.image.rect,0,0,u,1/0)]}function o(t,e,n,i,o,l){for(var c=o.layout[\\\"text-rotate\\\"]*Math.PI/180,p=o.layout[\\\"text-keep-upright\\\"],f=e.positionedGlyphs,h=[],y=0;y<f.length;y++){var d=f[y],m=d.glyph,v=m.rect;if(v){var x,g=(d.x+m.advance/2)*n,b=u;l?(x=[],b=a(x,t,g,i,t.segment,!0),p&&(b=Math.min(b,a(x,t,g,i,t.segment,!1)))):x=[{anchorPoint:new s(t.x,t.y),offset:0,angle:0,maxScale:1/0,minScale:u}];for(var w=d.x+m.left,S=d.y-m.top,_=w+v.w,A=S+v.h,M=new s(w,S),P=new s(_,S),z=new s(w,A),I=new s(_,A),T=0;T<x.length;T++){var V=x[T],k=M,E=P,F=z,j=I;if(c){var L=Math.sin(c),O=Math.cos(c),B=[O,-L,L,O];k=k.matMult(B),E=E.matMult(B),F=F.matMult(B),j=j.matMult(B)}var C=Math.max(V.minScale,b),q=(t.angle+V.offset+2*Math.PI)%(2*Math.PI),D=(V.angle+V.offset+2*Math.PI)%(2*Math.PI);h.push(new r(V.anchorPoint,k,E,F,j,v,q,D,C,V.maxScale))}}}return h}function a(t,e,n,r,i,o){var a=!o;n<0&&(o=!o),o&&i++;var l=new s(e.x,e.y),c=r[i],p=1/0;n=Math.abs(n);for(var f=u;;){var h=l.dist(c),y=n/h,d=Math.atan2(c.y-l.y,c.x-l.x);if(o||(d+=Math.PI),t.push({anchorPoint:l,offset:a?Math.PI:0,minScale:y,maxScale:p,angle:(d+2*Math.PI)%(2*Math.PI)}),y<=f)break;for(l=c;l.equals(c);)if(i+=o?1:-1,!(c=r[i]))return y;var m=c.sub(l)._unit();l=l.sub(m._mult(h)),p=y}return f}var s=n(2);t.exports={getIconQuads:i,getGlyphQuads:o,SymbolQuad:r};var u=.5},function(t,e,n){\\\"use strict\\\";function r(t,e,n){for(var r=0;r<t.length;r++)for(var i=t[r],o=0;o<e.length;o++)for(var a=e[o],s=0;s<a.length;s++){var u=a[s];if(f(i,u))return!0;if(l(u,i,n))return!0}return!1}function i(t,e){if(1===t.length&&1===t[0].length)return p(e,t[0][0]);for(var n=0;n<e.length;n++)for(var r=e[n],i=0;i<r.length;i++)if(p(t,r[i]))return!0;for(var o=0;o<t.length;o++){for(var a=t[o],u=0;u<a.length;u++)if(p(e,a[u]))return!0;for(var l=0;l<e.length;l++)if(s(a,e[l]))return!0}return!1}function o(t,e,n){for(var r=0;r<e.length;r++)for(var i=e[r],o=0;o<t.length;o++){var s=t[o];if(s.length>=3)for(var u=0;u<i.length;u++)if(f(s,i[u]))return!0;if(a(s,i,n))return!0}return!1}function a(t,e,n){if(t.length>1){if(s(t,e))return!0;for(var r=0;r<e.length;r++)if(l(e[r],t,n))return!0}for(var i=0;i<t.length;i++)if(l(t[i],e,n))return!0;return!1}function s(t,e){for(var n=0;n<t.length-1;n++)for(var r=t[n],i=t[n+1],o=0;o<e.length-1;o++){var a=e[o],s=e[o+1];if(u(r,i,a,s))return!0}return!1}function u(t,e,n,r){return h(t,n,r)!==h(e,n,r)&&h(t,e,n)!==h(t,e,r)}function l(t,e,n){var r=n*n;if(1===e.length)return t.distSqr(e[0])<r;for(var i=1;i<e.length;i++){if(c(t,e[i-1],e[i])<r)return!0}return!1}function c(t,e,n){var r=e.distSqr(n);if(0===r)return t.distSqr(e);var i=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/r;return i<0?t.distSqr(e):i>1?t.distSqr(n):t.distSqr(n.sub(e)._mult(i)._add(e))}function p(t,e){for(var n,r,i,o=!1,a=0;a<t.length;a++){n=t[a];for(var s=0,u=n.length-1;s<n.length;u=s++)r=n[s],i=n[u],r.y>e.y!=i.y>e.y&&e.x<(i.x-r.x)*(e.y-r.y)/(i.y-r.y)+r.x&&(o=!o)}return o}function f(t,e){for(var n=!1,r=0,i=t.length-1;r<t.length;i=r++){var o=t[r],a=t[i];o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(n=!n)}return n}var h=n(0).isCounterClockwise;t.exports={multiPolygonIntersectsBufferedMultiPoint:r,multiPolygonIntersectsMultiPolygon:i,multiPolygonIntersectsBufferedMultiLine:o,distToSegmentSquared:c}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){var r=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var o=new Int32Array(this.arrayBuffer);t=o[0],e=o[1],n=o[2],this.d=e+2*n;for(var a=0;a<this.d*this.d;a++){var s=o[i+a],u=o[i+a+1];r.push(s===u?null:o.subarray(s,u))}var l=o[i+r.length],c=o[i+r.length+1];this.keys=o.subarray(l,c),this.bboxes=o.subarray(c),this.insert=this._insertReadonly}else{this.d=e+2*n;for(var p=0;p<this.d*this.d;p++)r.push([]);this.keys=[],this.bboxes=[]}this.n=e,this.extent=t,this.padding=n,this.scale=e/t,this.uid=0;var f=n/e*t;this.min=-f,this.max=t+f}t.exports=r;var i=3;r.prototype.insert=function(t,e,n,r,i){this._forEachCell(e,n,r,i,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(n),this.bboxes.push(r),this.bboxes.push(i)},r.prototype._insertReadonly=function(){throw\\\"Cannot insert into a GridIndex created from an ArrayBuffer.\\\"},r.prototype._insertCell=function(t,e,n,r,i,o){this.cells[i].push(o)},r.prototype.query=function(t,e,n,r,i){var o=this.min,a=this.max;if(t<=o&&e<=o&&a<=n&&a<=r&&!i)return Array.prototype.slice.call(this.keys);var s=[],u={};return this._forEachCell(t,e,n,r,this._queryCell,s,u,i),s},r.prototype._queryCell=function(t,e,n,r,i,o,a,s){var u=this.cells[i];if(null!==u)for(var l=this.keys,c=this.bboxes,p=0;p<u.length;p++){var f=u[p];if(void 0===a[f]){var h=4*f;(s?s(c[h+0],c[h+1],c[h+2],c[h+3]):t<=c[h+2]&&e<=c[h+3]&&n>=c[h+0]&&r>=c[h+1])?(a[f]=!0,o.push(l[f])):a[f]=!1}}},r.prototype._forEachCell=function(t,e,n,r,i,o,a,s){for(var u=this._convertToCellCoord(t),l=this._convertToCellCoord(e),c=this._convertToCellCoord(n),p=this._convertToCellCoord(r),f=u;f<=c;f++)for(var h=l;h<=p;h++){var y=this.d*h+f;if((!s||s(this._convertFromCellCoord(f),this._convertFromCellCoord(h),this._convertFromCellCoord(f+1),this._convertFromCellCoord(h+1)))&&i.call(this,t,e,n,r,y,o,a,s))return}},r.prototype._convertFromCellCoord=function(t){return(t-this.padding)/this.scale},r.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},r.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=i+this.cells.length+1+1,n=0,r=0;r<this.cells.length;r++)n+=this.cells[r].length;var o=new Int32Array(e+n+this.keys.length+this.bboxes.length);o[0]=this.extent,o[1]=this.n,o[2]=this.padding;for(var a=e,s=0;s<t.length;s++){var u=t[s];o[i+s]=a,o.set(u,a),a+=u.length}return o[i+t.length]=a,o.set(this.keys,a),a+=this.keys.length,o[i+t.length+1]=a,o.set(this.bboxes,a),a+=this.bboxes.length,o.buffer}},function(t,e,n){\\\"use strict\\\";function r(t){this._stringToNumber={},this._numberToString=[];for(var e=0;e<t.length;e++){var n=t[e];this._stringToNumber[n]=e,this._numberToString[e]=n}}var i=n(9);t.exports=r,r.prototype.encode=function(t){return i(t in this._stringToNumber),this._stringToNumber[t]},r.prototype.decode=function(t){return i(t<this._numberToString.length),this._numberToString[t]}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,a,u,l,c){if(n/=e,r/=e,l>=n&&c<=r)return t;if(l>r||c<n)return null;for(var p=[],f=0;f<t.length;f++){var h,y,d=t[f],m=d.geometry,v=d.type;if(h=d.min[a],y=d.max[a],h>=n&&y<=r)p.push(d);else if(!(h>r||y<n)){var x=1===v?i(m,n,r,a):o(m,n,r,a,u,3===v);x.length&&p.push(s(d.tags,v,x,d.id))}}return p.length?p:null}function i(t,e,n,r){for(var i=[],o=0;o<t.length;o++){var a=t[o],s=a[r];s>=e&&s<=n&&i.push(a)}return i}function o(t,e,n,r,i,o){for(var s=[],u=0;u<t.length;u++){var l,c,p,f=0,h=0,y=null,d=t[u],m=d.area,v=d.dist,x=d.outer,g=d.length,b=[];for(c=0;c<g-1;c++)l=y||d[c],y=d[c+1],f=h||l[r],h=y[r],f<e?h>n?(b.push(i(l,y,e),i(l,y,n)),o||(b=a(s,b,m,v,x))):h>=e&&b.push(i(l,y,e)):f>n?h<e?(b.push(i(l,y,n),i(l,y,e)),o||(b=a(s,b,m,v,x))):h<=n&&b.push(i(l,y,n)):(b.push(l),h<e?(b.push(i(l,y,e)),o||(b=a(s,b,m,v,x))):h>n&&(b.push(i(l,y,n)),o||(b=a(s,b,m,v,x))));l=d[g-1],f=l[r],f>=e&&f<=n&&b.push(l),p=b[b.length-1],o&&p&&(b[0][0]!==p[0]||b[0][1]!==p[1])&&b.push(b[0]),a(s,b,m,v,x)}return s}function a(t,e,n,r,i){return e.length&&(e.area=n,e.dist=r,void 0!==i&&(e.outer=i),t.push(e)),[]}t.exports=r;var s=n(16)},function(t,e,n){\\\"use strict\\\";function r(t){this.self=t,this.actor=new o(t,this),this.layers={},this.layerFamilies={},this.workerSourceTypes={vector:u,geojson:l},this.workerSources={},this.self.registerWorkerSource=function(t,e){if(this.workerSourceTypes[t])throw new Error('Worker source with name \\\"'+t+'\\\" already registered.');this.workerSourceTypes[t]=e}.bind(this)}function i(t){var e={};for(var n in t){var r=t[n],i=r.ref||r.id,o=t[i];o.layout&&\\\"none\\\"===o.layout.visibility||(e[i]=e[i]||[],n===i?e[i].unshift(r):e[i].push(r))}return e}var o=n(48),a=n(5),s=n(0),u=n(33),l=n(101);t.exports=function(t){return new r(t)},s.extend(r.prototype,{\\\"set layers\\\":function(t,e){function n(t){var e=a.create(t,t.ref&&r[t.ref]);e.updatePaintTransitions({},{transition:!1}),r[e.id]=e}for(var r=this.layers[t]={},o=[],s=0;s<e.length;s++){var u=e[s];\\\"fill\\\"!==u.type&&\\\"line\\\"!==u.type&&\\\"circle\\\"!==u.type&&\\\"symbol\\\"!==u.type||(u.ref?o.push(s):n(u))}for(var l=0;l<o.length;l++)n(e[o[l]]);this.layerFamilies[t]=i(this.layers[t])},\\\"update layers\\\":function(t,e){function n(t){var e=s[t.ref];s[t.id]?s[t.id].set(t,e):s[t.id]=a.create(t,e),s[t.id].updatePaintTransitions({},{transition:!1})}var r,o,s=this.layers[t];for(r in e)o=e[r],o.ref&&n(o);for(r in e)o=e[r],o.ref||n(o);this.layerFamilies[t]=i(this.layers[t])},\\\"load tile\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).loadTile(e,n)},\\\"reload tile\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).reloadTile(e,n)},\\\"abort tile\\\":function(t,e){var n=e.type||\\\"vector\\\";this.getWorkerSource(t,n).abortTile(e)},\\\"remove tile\\\":function(t,e){var n=e.type||\\\"vector\\\";this.getWorkerSource(t,n).removeTile(e)},\\\"redo placement\\\":function(t,e,n){var r=e.type||\\\"vector\\\";this.getWorkerSource(t,r).redoPlacement(e,n)},\\\"load worker source\\\":function(t,e,n){try{this.self.importScripts(e.url),n()}catch(t){n(t)}},getWorkerSource:function(t,e){if(this.workerSources[t]||(this.workerSources[t]={}),!this.workerSources[t][e]){var n={getLayers:function(){return this.layers[t]}.bind(this),getLayerFamilies:function(){return this.layerFamilies[t]}.bind(this)};this.workerSources[t][e]=new this.workerSourceTypes[e](this.actor,n)}return this.workerSources[t][e]}}),t.exports(self)},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.target=t,this.parent=e,this.mapId=n,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener(\\\"message\\\",this.receive,!1)}t.exports=r,r.prototype.receive=function(t){function e(t,e,n){this.postMessage({mapId:this.mapId,type:\\\"<response>\\\",id:String(i),error:t?String(t):null,data:e},n)}var n,r=t.data,i=r.id;if(\\\"<response>\\\"===r.type)n=this.callbacks[r.id],delete this.callbacks[r.id],n&&n(r.error||null,r.data);else if(void 0!==r.id&&this.parent[r.type])this.parent[r.type](r.mapId,r.data,e.bind(this));else if(void 0!==r.id&&this.parent.getWorkerSource){var o=r.type.split(\\\".\\\"),a=this.parent.getWorkerSource(r.mapId,o[0]);a[o[1]](r.data,e.bind(this))}else this.parent[r.type](r.data)},r.prototype.send=function(t,e,n,r){var i=n?this.mapId+\\\":\\\"+this.callbackID++:null;n&&(this.callbacks[i]=n),this.postMessage({mapId:this.mapId,type:t,id:String(i),data:e},r)},r.prototype.postMessage=function(t,e){this.target.postMessage(t,e)}},function(t,e){function n(t,e,n,r){this.cx=3*t,this.bx=3*(n-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(r-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=n,this.p2y=r}t.exports=n,n.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){void 0===e&&(e=1e-6);var n,r,i,o,a;for(i=t,a=0;a<8;a++){if(o=this.sampleCurveX(i)-t,Math.abs(o)<e)return i;var s=this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=o/s}if(n=0,r=1,(i=t)<n)return n;if(i>r)return r;for(;n<r;){if(o=this.sampleCurveX(i),Math.abs(o-t)<e)return i;t>o?n=i:r=i,i=.5*(r-n)+n}return i},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.column=t,this.row=e,this.zoom=n}t.exports=r,r.prototype={clone:function(){return new r(this.column,this.row,this.zoom)},zoomTo:function(t){return this.clone()._zoomTo(t)},sub:function(t){return this.clone()._sub(t)},_zoomTo:function(t){var e=Math.pow(2,t-this.zoom);return this.column*=e,this.row*=e,this.zoom=t,this},_sub:function(t){return t=t.zoomTo(this.zoom),this.column-=t.column,this.row-=t.row,this}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.declaration=e,this.startTime=this.endTime=(new Date).getTime(),\\\"piecewise-constant\\\"===t.function&&t.transition?this.interp=i:this.interp=a[t.type],this.oldTransition=n,this.duration=r.duration||0,this.delay=r.delay||0,this.instant()||(this.endTime=this.startTime+this.duration+this.delay,this.ease=o.easeCubicInOut),n&&n.endTime<=this.startTime&&delete n.oldTransition}function i(t,e,n){return void 0===(t&&t.to)||void 0===(e&&e.to)?void 0:{from:t.to,fromScale:t.toScale,to:e.to,toScale:e.toScale,t:n}}var o=n(0),a=n(17);t.exports=r,r.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},r.prototype.calculate=function(t,e){var n=this.declaration.calculate(o.extend({},t,{duration:this.duration}),e);if(this.instant())return n;var r=t.time||Date.now();if(r<this.endTime){var i=this.oldTransition.calculate(o.extend({},t,{time:this.startTime}),e),a=this.ease((r-this.startTime-this.delay)/this.duration);n=this.interp(i,n,a)}return n}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.value=s.clone(e),this.isFunction=o.isFunctionDefinition(e),this.json=JSON.stringify(this.value);var n=\\\"color\\\"===t.type&&this.value?a(this.value):e;if(this.calculate=o[t.function||\\\"piecewise-constant\\\"](n),this.isFeatureConstant=this.calculate.isFeatureConstant,this.isZoomConstant=this.calculate.isZoomConstant,\\\"piecewise-constant\\\"===t.function&&t.transition&&(this.calculate=i(this.calculate)),!this.isFeatureConstant&&!this.isZoomConstant){this.stopZoomLevels=[];for(var r=[],u=this.value.stops,l=0;l<this.value.stops.length;l++){var c=u[l][0].zoom;this.stopZoomLevels.indexOf(c)<0&&(this.stopZoomLevels.push(c),r.push([c,r.length]))}this.calculateInterpolationT=o.interpolated({stops:r,base:e.base})}}function i(t){return function(e,n){var r,i,o,a=e.zoom,s=e.zoomHistory,u=e.duration,l=a%1,c=Math.min((Date.now()-s.lastIntegerZoomTime)/u,1),p=1;return a>s.lastIntegerZoom?(r=l+(1-l)*c,p*=2,i=t({zoom:a-1},n),o=t({zoom:a},n)):(r=1-(1-c)*l,o=t({zoom:a},n),i=t({zoom:a+1},n),p/=2),void 0===i||void 0===o?void 0:{from:i,fromScale:p,to:o,toScale:1,t:r}}}var o=n(18),a=n(19),s=n(0);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){var n;if(p(t)){var u,l=t.stops&&\\\"object\\\"==typeof t.stops[0][0],c=l||void 0!==t.property,f=l||!c,h=t.type||e||\\\"exponential\\\";if(\\\"exponential\\\"===h)u=a;else if(\\\"interval\\\"===h)u=o;else if(\\\"categorical\\\"===h)u=i;else{if(\\\"identity\\\"!==h)throw new Error('Unknown function type \\\"'+h+'\\\"');u=s}if(l){for(var y={},d=[],m=0;m<t.stops.length;m++){var v=t.stops[m];void 0===y[v[0].zoom]&&(y[v[0].zoom]={zoom:v[0].zoom,type:t.type,property:t.property,stops:[]}),y[v[0].zoom].stops.push([v[0].value,v[1]])}for(var x in y)d.push([y[x].zoom,r(y[x])]);n=function(e,n){return a({stops:d,base:t.base},e)(e,n)},n.isFeatureConstant=!1,n.isZoomConstant=!1}else f?(n=function(e){return u(t,e)},n.isFeatureConstant=!0,n.isZoomConstant=!1):(n=function(e,n){return u(t,n[t.property])},n.isFeatureConstant=!1,n.isZoomConstant=!0)}else n=function(){return t},n.isFeatureConstant=!0,n.isZoomConstant=!0;return n}function i(t,e){for(var n=0;n<t.stops.length;n++)if(e===t.stops[n][0])return t.stops[n][1];return t.stops[0][1]}function o(t,e){for(var n=0;n<t.stops.length&&!(e<t.stops[n][0]);n++);return t.stops[Math.max(n-1,0)][1]}function a(t,e){for(var n=void 0!==t.base?t.base:1,r=0;;){if(r>=t.stops.length)break;if(e<=t.stops[r][0])break;r++}return 0===r?t.stops[r][1]:r===t.stops.length?t.stops[r-1][1]:u(e,n,t.stops[r-1][0],t.stops[r][0],t.stops[r-1][1],t.stops[r][1])}function s(t,e){return e}function u(t,e,n,r,i,o){return\\\"function\\\"==typeof i?function(){var a=i.apply(void 0,arguments),s=o.apply(void 0,arguments);return u(t,e,n,r,a,s)}:i.length?c(t,e,n,r,i,o):l(t,e,n,r,i,o)}function l(t,e,n,r,i,o){var a,s=r-n,u=t-n;return a=1===e?u/s:(Math.pow(e,u)-1)/(Math.pow(e,s)-1),i*(1-a)+o*a}function c(t,e,n,r,i,o){for(var a=[],s=0;s<i.length;s++)a[s]=l(t,e,n,r,i[s],o[s]);return a}function p(t){return\\\"object\\\"==typeof t&&(t.stops||\\\"identity\\\"===t.type)}t.exports.isFunctionDefinition=p,t.exports.interpolated=function(t){return r(t,\\\"exponential\\\")},t.exports[\\\"piecewise-constant\\\"]=function(t){return r(t,\\\"interval\\\")}},function(t,e,n){\\\"use strict\\\";t.exports=n(21)},function(t,e){t.exports={$version:8,$root:{version:{required:!0,type:\\\"enum\\\",values:[8]},name:{type:\\\"string\\\"},metadata:{type:\\\"*\\\"},center:{type:\\\"array\\\",value:\\\"number\\\"},zoom:{type:\\\"number\\\"},bearing:{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\"},pitch:{type:\\\"number\\\",default:0,units:\\\"degrees\\\"},sources:{required:!0,type:\\\"sources\\\"},sprite:{type:\\\"string\\\"},glyphs:{type:\\\"string\\\"},transition:{type:\\\"transition\\\"},layers:{required:!0,type:\\\"array\\\",value:\\\"layer\\\"}},sources:{\\\"*\\\":{type:\\\"source\\\"}},source:[\\\"source_tile\\\",\\\"source_geojson\\\",\\\"source_video\\\",\\\"source_image\\\"],source_tile:{type:{required:!0,type:\\\"enum\\\",values:[\\\"vector\\\",\\\"raster\\\"]},url:{type:\\\"string\\\"},tiles:{type:\\\"array\\\",value:\\\"string\\\"},minzoom:{type:\\\"number\\\",default:0},maxzoom:{type:\\\"number\\\",default:22},tileSize:{type:\\\"number\\\",default:512,units:\\\"pixels\\\"},\\\"*\\\":{type:\\\"*\\\"}},source_geojson:{type:{required:!0,type:\\\"enum\\\",values:[\\\"geojson\\\"]},data:{type:\\\"*\\\"},maxzoom:{type:\\\"number\\\",default:14},buffer:{type:\\\"number\\\",default:64},tolerance:{type:\\\"number\\\",default:3},cluster:{type:\\\"boolean\\\",default:!1},clusterRadius:{type:\\\"number\\\",default:400},clusterMaxZoom:{type:\\\"number\\\"}},source_video:{type:{required:!0,type:\\\"enum\\\",values:[\\\"video\\\"]},urls:{required:!0,type:\\\"array\\\",value:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},source_image:{type:{required:!0,type:\\\"enum\\\",values:[\\\"image\\\"]},url:{required:!0,type:\\\"string\\\"},coordinates:{required:!0,type:\\\"array\\\",length:4,value:{type:\\\"array\\\",length:2,value:\\\"number\\\"}}},layer:{id:{type:\\\"string\\\",required:!0},type:{type:\\\"enum\\\",values:[\\\"fill\\\",\\\"line\\\",\\\"symbol\\\",\\\"circle\\\",\\\"raster\\\",\\\"background\\\"]},metadata:{type:\\\"*\\\"},ref:{type:\\\"string\\\"},source:{type:\\\"string\\\"},\\\"source-layer\\\":{type:\\\"string\\\"},minzoom:{type:\\\"number\\\",minimum:0,maximum:22},maxzoom:{type:\\\"number\\\",minimum:0,maximum:22},interactive:{type:\\\"boolean\\\",default:!1},filter:{type:\\\"filter\\\"},layout:{type:\\\"layout\\\"},paint:{type:\\\"paint\\\"},\\\"paint.*\\\":{type:\\\"paint\\\"}},layout:[\\\"layout_fill\\\",\\\"layout_line\\\",\\\"layout_circle\\\",\\\"layout_symbol\\\",\\\"layout_raster\\\",\\\"layout_background\\\"],layout_background:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_fill:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_circle:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_line:{\\\"line-cap\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"butt\\\",\\\"round\\\",\\\"square\\\"],default:\\\"butt\\\"},\\\"line-join\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"bevel\\\",\\\"round\\\",\\\"miter\\\"],default:\\\"miter\\\"},\\\"line-miter-limit\\\":{type:\\\"number\\\",default:2,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[{\\\"line-join\\\":\\\"miter\\\"}]},\\\"line-round-limit\\\":{type:\\\"number\\\",default:1.05,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[{\\\"line-join\\\":\\\"round\\\"}]},visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_symbol:{\\\"symbol-placement\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"point\\\",\\\"line\\\"],default:\\\"point\\\"},\\\"symbol-spacing\\\":{type:\\\"number\\\",default:250,minimum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"pixels\\\",requires:[{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"symbol-avoid-edges\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1},\\\"icon-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\"]},\\\"icon-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"viewport\\\",requires:[\\\"icon-image\\\"]},\\\"icon-size\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"icon-text-fit\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!1,values:[\\\"none\\\",\\\"both\\\",\\\"width\\\",\\\"height\\\"],default:\\\"none\\\",requires:[\\\"icon-image\\\",\\\"text-field\\\"]},\\\"icon-text-fit-padding\\\":{type:\\\"array\\\",value:\\\"number\\\",length:4,default:[0,0,0,0],units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\",\\\"icon-text-fit\\\",\\\"text-field\\\"]},\\\"icon-image\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,tokens:!0},\\\"icon-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"degrees\\\",requires:[\\\"icon-image\\\"]},\\\"icon-padding\\\":{type:\\\"number\\\",default:2,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"icon-image\\\",{\\\"icon-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"icon-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"icon-image\\\"]},\\\"text-pitch-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],requires:[\\\"text-field\\\"]},\\\"text-rotation-alignment\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"viewport\\\",requires:[\\\"text-field\\\"]},\\\"text-field\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:\\\"\\\",tokens:!0},\\\"text-font\\\":{type:\\\"array\\\",value:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:[\\\"Open Sans Regular\\\",\\\"Arial Unicode MS Regular\\\"],requires:[\\\"text-field\\\"]},\\\"text-size\\\":{type:\\\"number\\\",default:16,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-max-width\\\":{type:\\\"number\\\",default:10,minimum:0,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-line-height\\\":{type:\\\"number\\\",default:1.2,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-letter-spacing\\\":{type:\\\"number\\\",default:0,units:\\\"em\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-justify\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"left\\\",\\\"center\\\",\\\"right\\\"],default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"center\\\",\\\"left\\\",\\\"right\\\",\\\"top\\\",\\\"bottom\\\",\\\"top-left\\\",\\\"top-right\\\",\\\"bottom-left\\\",\\\"bottom-right\\\"],default:\\\"center\\\",requires:[\\\"text-field\\\"]},\\\"text-max-angle\\\":{type:\\\"number\\\",default:45,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\",{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-rotate\\\":{type:\\\"number\\\",default:0,period:360,units:\\\"degrees\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-padding\\\":{type:\\\"number\\\",default:2,minimum:0,units:\\\"pixels\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,requires:[\\\"text-field\\\"]},\\\"text-keep-upright\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!0,requires:[\\\"text-field\\\",{\\\"text-rotation-alignment\\\":\\\"map\\\"},{\\\"symbol-placement\\\":\\\"line\\\"}]},\\\"text-transform\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"none\\\",\\\"uppercase\\\",\\\"lowercase\\\"],default:\\\"none\\\",requires:[\\\"text-field\\\"]},\\\"text-offset\\\":{type:\\\"array\\\",value:\\\"number\\\",units:\\\"ems\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,length:2,default:[0,0],requires:[\\\"text-field\\\"]},\\\"text-allow-overlap\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-ignore-placement\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\"]},\\\"text-optional\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!1,requires:[\\\"text-field\\\",\\\"icon-image\\\"]},visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},layout_raster:{visibility:{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,values:[\\\"visible\\\",\\\"none\\\"],default:\\\"visible\\\"}},filter:{type:\\\"array\\\",value:\\\"*\\\"},filter_operator:{type:\\\"enum\\\",values:[\\\"==\\\",\\\"!=\\\",\\\">\\\",\\\">=\\\",\\\"<\\\",\\\"<=\\\",\\\"in\\\",\\\"!in\\\",\\\"all\\\",\\\"any\\\",\\\"none\\\",\\\"has\\\",\\\"!has\\\"]},geometry_type:{type:\\\"enum\\\",values:[\\\"Point\\\",\\\"LineString\\\",\\\"Polygon\\\"]},color_operation:{type:\\\"enum\\\",values:[\\\"lighten\\\",\\\"saturate\\\",\\\"spin\\\",\\\"fade\\\",\\\"mix\\\"]},function:{stops:{type:\\\"array\\\",required:!0,value:\\\"function_stop\\\"},base:{type:\\\"number\\\",default:1,minimum:0},property:{type:\\\"string\\\",default:\\\"$zoom\\\"},type:{type:\\\"enum\\\",values:[\\\"exponential\\\",\\\"interval\\\",\\\"categorical\\\"],default:\\\"exponential\\\"}},function_stop:{type:\\\"array\\\",minimum:0,maximum:22,value:[\\\"number\\\",\\\"color\\\"],length:2},paint:[\\\"paint_fill\\\",\\\"paint_line\\\",\\\"paint_circle\\\",\\\"paint_symbol\\\",\\\"paint_raster\\\",\\\"paint_background\\\"],paint_fill:{\\\"fill-antialias\\\":{type:\\\"boolean\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:!0},\\\"fill-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"fill-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"}]},\\\"fill-outline-color\\\":{type:\\\"color\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"fill-pattern\\\"},{\\\"fill-antialias\\\":!0}]},\\\"fill-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"fill-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"fill-translate\\\"]},\\\"fill-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_line:{\\\"line-opacity\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"line-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"line-translate\\\"]},\\\"line-width\\\":{type:\\\"number\\\",default:1,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-gap-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-offset\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"line-dasharray\\\":{type:\\\"array\\\",value:\\\"number\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,minimum:0,transition:!0,units:\\\"line widths\\\",requires:[{\\\"!\\\":\\\"line-pattern\\\"}]},\\\"line-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0}},paint_circle:{\\\"circle-radius\\\":{type:\\\"number\\\",default:5,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-blur\\\":{type:\\\"number\\\",default:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0},\\\"circle-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\"},\\\"circle-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"circle-translate\\\"]},\\\"circle-pitch-scale\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\"}},paint_symbol:{\\\"icon-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"icon-image\\\"]},\\\"icon-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"icon-image\\\"]},\\\"icon-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"icon-image\\\",\\\"icon-translate\\\"]},\\\"text-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-color\\\":{type:\\\"color\\\",default:\\\"rgba(0, 0, 0, 0)\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,requires:[\\\"text-field\\\"]},\\\"text-halo-width\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-halo-blur\\\":{type:\\\"number\\\",default:0,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate\\\":{type:\\\"array\\\",value:\\\"number\\\",length:2,default:[0,0],function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,transition:!0,units:\\\"pixels\\\",requires:[\\\"text-field\\\"]},\\\"text-translate-anchor\\\":{type:\\\"enum\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,\\\"property-function\\\":!0,values:[\\\"map\\\",\\\"viewport\\\"],default:\\\"map\\\",requires:[\\\"text-field\\\",\\\"text-translate\\\"]}},paint_raster:{\\\"raster-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-hue-rotate\\\":{type:\\\"number\\\",default:0,period:360,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"degrees\\\"},\\\"raster-brightness-min\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:0,minimum:0,maximum:1,transition:!0},\\\"raster-brightness-max\\\":{type:\\\"number\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,default:1,minimum:0,maximum:1,transition:!0},\\\"raster-saturation\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-contrast\\\":{type:\\\"number\\\",default:0,minimum:-1,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"raster-fade-duration\\\":{type:\\\"number\\\",default:300,minimum:0,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,units:\\\"milliseconds\\\"}},paint_background:{\\\"background-color\\\":{type:\\\"color\\\",default:\\\"#000000\\\",function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0,requires:[{\\\"!\\\":\\\"background-pattern\\\"}]},\\\"background-pattern\\\":{type:\\\"string\\\",function:\\\"piecewise-constant\\\",\\\"zoom-function\\\":!0,transition:!0},\\\"background-opacity\\\":{type:\\\"number\\\",default:1,minimum:0,maximum:1,function:\\\"interpolated\\\",\\\"zoom-function\\\":!0,transition:!0}},transition:{duration:{type:\\\"number\\\",default:300,minimum:0,units:\\\"milliseconds\\\"},delay:{type:\\\"number\\\",default:0,minimum:0,units:\\\"milliseconds\\\"}}}},function(t,e,n){\\\"use strict\\\";t.exports=n(57),t.exports.emitErrors=function(t,e){if(e&&e.length){for(var n=0;n<e.length;n++)t.fire(\\\"error\\\",{error:new Error(e[n].message)});return!0}return!1},t.exports.throwErrors=function(t,e){if(e)for(var n=0;n<e.length;n++)throw new Error(e[n].message)}},function(t,e,n){\\\"use strict\\\";function r(t,e){e=e||u;var n=[];return n=n.concat(s({key:\\\"\\\",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:l}})),e.$version>7&&t.constants&&(n=n.concat(a({key:\\\"constants\\\",value:t.constants,style:t,styleSpec:e}))),i(n)}function i(t){return[].concat(t).sort(function(t,e){return t.line-e.line})}function o(t){return function(){return i(t.apply(this,arguments))}}var a=n(22),s=n(6),u=n(21),l=n(63);r.source=o(n(31)),r.layer=o(n(28)),r.filter=o(n(14)),r.paintProperty=o(n(29)),r.layoutProperty=o(n(30)),t.exports=r},function(t,e){function n(){throw new Error(\\\"setTimeout has not been defined\\\")}function r(){throw new Error(\\\"clearTimeout has not been defined\\\")}function i(t){if(c===setTimeout)return setTimeout(t,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function o(t){if(p===clearTimeout)return clearTimeout(t);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(t);try{return p(t)}catch(e){try{return p.call(null,t)}catch(e){return p.call(this,t)}}}function a(){d&&h&&(d=!1,h.length?y=h.concat(y):m=-1,y.length&&s())}function s(){if(!d){var t=i(a);d=!0;for(var e=y.length;e;){for(h=y,y=[];++m<e;)h&&h[m].run();m=-1,e=y.length}h=null,d=!1,o(t)}}function u(t,e){this.fun=t,this.array=e}function l(){}var c,p,f=t.exports={};!function(){try{c=\\\"function\\\"==typeof setTimeout?setTimeout:n}catch(t){c=n}try{p=\\\"function\\\"==typeof clearTimeout?clearTimeout:r}catch(t){p=r}}();var h,y=[],d=!1,m=-1;f.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];y.push(new u(t,e)),1!==y.length||d||i(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\\\"browser\\\",f.browser=!0,f.env={},f.argv=[],f.version=\\\"\\\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(t){return[]},f.binding=function(t){throw new Error(\\\"process.binding is not supported\\\")},f.cwd=function(){return\\\"/\\\"},f.chdir=function(t){throw new Error(\\\"process.chdir is not supported\\\")},f.umask=function(){return 0}},function(t,e){t.exports=function(t){return t&&\\\"object\\\"==typeof t&&\\\"function\\\"==typeof t.copy&&\\\"function\\\"==typeof t.fill&&\\\"function\\\"==typeof t.readUInt8}},function(t,e){\\\"function\\\"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e,n){\\\"use strict\\\";var r=n(3),i=n(1);t.exports=function(t){var e=t.value,n=t.key,o=r(e);return\\\"boolean\\\"!==o?[new i(n,e,\\\"boolean expected, %s found\\\",o)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(3),o=n(20).parseCSSColor;t.exports=function(t){var e=t.key,n=t.value,a=i(n);return\\\"string\\\"!==a?[new r(e,n,\\\"color expected, %s found\\\",a)]:null===o(n)?[new r(e,n,'color expected, \\\"%s\\\" found',n)]:[]}},function(t,e,n){\\\"use strict\\\";var r=n(1),i=n(32);t.exports=function(t){var e=t.value,n=t.key,o=i(t);return o.length?o:(-1===e.indexOf(\\\"{fontstack}\\\")&&o.push(new r(n,e,'\\\"glyphs\\\" url must include a \\\"{fontstack}\\\" token')),-1===e.indexOf(\\\"{range}\\\")&&o.push(new r(n,e,'\\\"glyphs\\\" url must include a \\\"{range}\\\" token')),o)}},function(t,e,n){\\\"use strict\\\";var r=n(0),i={on:function(t,e){return this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e),this},off:function(t,e){if(!t)return delete this._events,this;if(!this.listens(t))return this;if(e){var n=this._events[t].indexOf(e);n>=0&&this._events[t].splice(n,1),this._events[t].length||delete this._events[t]}else delete this._events[t];return this},once:function(t,e){var n=function(r){this.off(t,n),e.call(this,r)}.bind(this);return this.on(t,n),this},fire:function(t,e){if(!this.listens(t))return r.endsWith(t,\\\"error\\\")&&console.error(e&&e.error||e||\\\"Empty error event\\\"),this;e=r.extend({},e),r.extend(e,{type:t,target:this});for(var n=this._events[t].slice(),i=0;i<n.length;i++)n[i].call(this,e);return this},listens:function(t){return!(!this._events||!this._events[t])}};t.exports=i},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);r.prototype=i.inherit(o,{getPaintValue:function(t,e,n){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValue.call(this,\\\"fill-color\\\",e,n):o.prototype.getPaintValue.call(this,t,e,n)},getPaintValueStopZoomLevels:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintValueStopZoomLevels.call(this,\\\"fill-color\\\"):o.prototype.getPaintValueStopZoomLevels.call(this,arguments)},getPaintInterpolationT:function(t,e){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.getPaintInterpolationT.call(this,\\\"fill-color\\\",e):o.prototype.getPaintInterpolationT.call(this,t,e)},isPaintValueFeatureConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueFeatureConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueFeatureConstant.call(this,t)},isPaintValueZoomConstant:function(t){return\\\"fill-outline-color\\\"===t&&void 0===this.getPaintProperty(\\\"fill-outline-color\\\")?o.prototype.isPaintValueZoomConstant.call(this,\\\"fill-color\\\"):o.prototype.isPaintValueZoomConstant.call(this,t)},isHidden:function(t){if(this.minzoom&&t<this.minzoom)return!0;if(this.maxzoom&&t>=this.maxzoom)return!0;if(\\\"none\\\"===this.layout.visibility)return!0;var e=this.isPaintValueFeatureConstant(\\\"fill-opacity\\\")&&0===this.paint[\\\"fill-opacity\\\"]||this.isPaintValueFeatureConstant(\\\"fill-color\\\")&&0===this.paint[\\\"fill-color\\\"][3],n=this.isPaintValueFeatureConstant(\\\"fill-outline-color\\\")&&0===this.paint[\\\"fill-outline-color\\\"][3];return e&&n}}),t.exports=r},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{getPaintValue:function(t,e,n){var r=o.prototype.getPaintValue.apply(this,arguments);if(r&&\\\"line-dasharray\\\"===t){var i=Math.floor(e.zoom);this._flooredZoom!==i&&(this._flooredZoom=i,this._flooredLineWidth=this.getPaintValue(\\\"line-width\\\",e,n)),r.fromScale*=this._flooredLineWidth,r.toScale*=this._flooredLineWidth}return r}})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{})},function(t,e,n){\\\"use strict\\\";function r(){o.apply(this,arguments)}var i=n(0),o=n(5);t.exports=r,r.prototype=i.inherit(o,{isHidden:function(){if(o.prototype.isHidden.apply(this,arguments))return!0;var t=0===this.paint[\\\"text-opacity\\\"]||!this.layout[\\\"text-field\\\"],e=0===this.paint[\\\"icon-opacity\\\"]||!this.layout[\\\"icon-image\\\"];return!(!t||!e)},getLayoutValue:function(t,e,n){return(\\\"text-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"text-rotation-alignment\\\"))&&(\\\"icon-rotation-alignment\\\"!==t||\\\"line\\\"!==this.getLayoutValue(\\\"symbol-placement\\\",e,n)||this.getLayoutProperty(\\\"icon-rotation-alignment\\\"))?\\\"text-pitch-alignment\\\"!==t||this.getLayoutProperty(\\\"text-pitch-alignment\\\")?o.prototype.getLayoutValue.apply(this,arguments):this.getLayoutValue(\\\"text-rotation-alignment\\\"):\\\"map\\\"}})},function(t,e,n){\\\"use strict\\\";function r(t,e){this.layers=t.readFields(i,{},e)}function i(t,e,n){if(3===t){var r=new o(n,n.readVarint()+n.pos);r.length&&(e[r.name]=r)}}var o=n(35);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t){var e;t&&t.length&&(e=t,t=e.length);var n=new Uint8Array(t||0);return e&&n.set(e),n.readUInt32LE=o.readUInt32LE,n.writeUInt32LE=o.writeUInt32LE,n.readInt32LE=o.readInt32LE,n.writeInt32LE=o.writeInt32LE,n.readFloatLE=o.readFloatLE,n.writeFloatLE=o.writeFloatLE,n.readDoubleLE=o.readDoubleLE,n.writeDoubleLE=o.writeDoubleLE,n.toString=o.toString,n.write=o.write,n.slice=o.slice,n.copy=o.copy,n._isBuffer=!0,n}function i(t){for(var e,n,r=t.length,i=[],o=0;o<r;o++){if((e=t.charCodeAt(o))>55295&&e<57344){if(!n){e>56319||o+1===r?i.push(239,191,189):n=e;continue}if(e<56320){i.push(239,191,189),n=e;continue}e=n-55296<<10|e-56320|65536,n=null}else n&&(i.push(239,191,189),n=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}t.exports=r;var o,a,s,u=n(73);o={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return u.read(this,t,!0,23,4)},readDoubleLE:function(t){return u.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return u.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return u.write(this,t,e,!0,52,8)},toString:function(t,e,n){var r=\\\"\\\",i=\\\"\\\";e=e||0,n=Math.min(this.length,n||this.length);for(var o=e;o<n;o++){var a=this[o];a<=127?(r+=decodeURIComponent(i)+String.fromCharCode(a),i=\\\"\\\"):i+=\\\"%\\\"+a.toString(16)}return r+=decodeURIComponent(i)},write:function(t,e){for(var n=t===a?s:i(t),r=0;r<n.length;r++)this[e+r]=n[r]},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var n=0;n<this.length;n++)t[e+n]=this[n]}},o.writeInt32LE=o.writeUInt32LE,r.byteLength=function(t){return a=t,s=i(t),s.length},r.isBuffer=function(t){return!(!t||!t._isBuffer)}},function(t,e){e.read=function(t,e,n,r,i){var o,a,s=8*i-r-1,u=(1<<s)-1,l=u>>1,c=-7,p=n?i-1:0,f=n?-1:1,h=t[e+p];for(p+=f,o=h&(1<<-c)-1,h>>=-c,c+=s;c>0;o=256*o+t[e+p],p+=f,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=r;c>0;a=256*a+t[e+p],p+=f,c-=8);if(0===o)o=1-l;else{if(o===u)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,r),o-=l}return(h?-1:1)*a*Math.pow(2,o-r)},e.write=function(t,e,n,r,i,o){var a,s,u,l=8*o-i-1,c=(1<<l)-1,p=c>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,y=r?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),e+=a+p>=1?f/u:f*Math.pow(2,1-p),e*u>=2&&(a++,u/=2),a+p>=c?(s=0,a=c):a+p>=1?(s=(e*u-1)*Math.pow(2,i),a+=p):(s=e*Math.pow(2,p-1)*Math.pow(2,i),a=0));i>=8;t[n+h]=255&s,h+=y,s/=256,i-=8);for(a=a<<i|s,l+=i;l>0;t[n+h]=255&a,h+=y,a/=256,l-=8);t[n+h-y]|=128*d}},function(t,e,n){\\\"use strict\\\";function r(t){this.coord=t.coord,this.uid=t.uid,this.zoom=t.zoom,this.tileSize=t.tileSize,this.source=t.source,this.overscaling=t.overscaling,this.angle=t.angle,this.pitch=t.pitch,this.showCollisionBoxes=t.showCollisionBoxes}function i(t){return!t.isEmpty()}function o(t){return t.serialize()}function a(t){var e=[];for(var n in t)t[n].getTransferables(e);return e}function s(t){return t.id}var u=n(75),l=n(97),c=n(4),p=n(98),f=n(45),h=n(0),y=n(99),d=n(100);t.exports=r,r.prototype.parse=function(t,e,n,r,m){function v(t,e){for(var n=0;n<t.length;n++){var r=t.feature(n);r.index=n;for(var i in e)e[i].filter(r)&&e[i].features.push(r)}}function x(t){if(t)return m(t);if(2===++q){for(var e=j.length-1;e>=0;e--)g(I,j[e]);b()}}function g(t,e){if(e.populateArrays(M,C,B),\\\"symbol\\\"!==e.type)for(var n=0;n<e.features.length;n++){var r=e.features[n];P.insert(r,r.index,e.sourceLayerIndex,e.index)}e.features=null}function b(){I.status=\\\"done\\\",I.redoPlacementAfterDone&&(I.redoPlacement(I.angle,I.pitch,null),I.redoPlacementAfterDone=!1);var t=P.serialize(),e=M.serialize(),n=I.collisionBoxArray.serialize(),s=I.symbolInstancesArray.serialize(),u=I.symbolQuadsArray.serialize(),l=[r].concat(t.transferables).concat(e.transferables),c=F.filter(i);m(null,{buckets:c.map(o),featureIndex:t.data,collisionTile:e.data,collisionBoxArray:n,symbolInstancesArray:s,symbolQuadsArray:u,rawTileData:r},a(c).concat(l))}this.status=\\\"parsing\\\",this.data=t,this.collisionBoxArray=new p,this.symbolInstancesArray=new y,this.symbolQuadsArray=new d;var w,S,_,A,M=new l(this.angle,this.pitch,this.collisionBoxArray),P=new u(this.coord,this.overscaling,M,t.layers),z=new f(t.layers?Object.keys(t.layers).sort():[\\\"_geojsonTileLayer\\\"]),I=this,T={},V={},k=0;for(var E in e)S=e[E][0],S.source===this.source&&(S.ref||S.minzoom&&this.zoom<S.minzoom||S.maxzoom&&this.zoom>=S.maxzoom||S.layout&&\\\"none\\\"===S.layout.visibility||t.layers&&!t.layers[S.sourceLayer]||(A=c.create({layer:S,index:k++,childLayers:e[E],zoom:this.zoom,overscaling:this.overscaling,showCollisionBoxes:this.showCollisionBoxes,collisionBoxArray:this.collisionBoxArray,symbolQuadsArray:this.symbolQuadsArray,symbolInstancesArray:this.symbolInstancesArray,sourceLayerIndex:z.encode(S.sourceLayer||\\\"_geojsonTileLayer\\\")}),A.createFilter(),T[S.id]=A,t.layers&&(_=S.sourceLayer,V[_]=V[_]||{},V[_][S.id]=A)));if(t.layers)for(_ in V)1===S.version&&h.warnOnce('Vector tile source \\\"'+this.source+'\\\" layer \\\"'+_+'\\\" does not use vector tile spec v2 and therefore may have some rendering errors.'),(S=t.layers[_])&&v(S,V[_]);else v(t,T);var F=[],j=this.symbolBuckets=[],L=[];P.bucketLayerIDs={};for(var O in T)A=T[O],0!==A.features.length&&(P.bucketLayerIDs[A.index]=A.childLayers.map(s),F.push(A),\\\"symbol\\\"===A.type?j.push(A):L.push(A));var B={},C={},q=0;if(j.length>0){for(w=j.length-1;w>=0;w--)j[w].updateIcons(B),j[w].updateFont(C);for(var D in C)C[D]=Object.keys(C[D]).map(Number);B=Object.keys(B),n.send(\\\"get glyphs\\\",{uid:this.uid,stacks:C},function(t,e){C=e,x(t)}),B.length?n.send(\\\"get icons\\\",{icons:B},function(t,e){B=e,x(t)}):x()}for(w=L.length-1;w>=0;w--)g(this,L[w]);if(0===j.length)return b()},r.prototype.redoPlacement=function(t,e,n){if(\\\"done\\\"!==this.status)return this.redoPlacementAfterDone=!0,this.angle=t,{};for(var r=new l(t,e,this.collisionBoxArray),s=this.symbolBuckets,u=s.length-1;u>=0;u--)s[u].placeFeatures(r,n);var c=r.serialize(),p=s.filter(i);return{result:{buckets:p.map(o),collisionTile:c.data},transferables:a(p).concat(c.transferables)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){if(t.grid){var r=t,i=e;t=r.coord,e=r.overscaling,this.grid=new y(r.grid),this.featureIndexArray=new A(r.featureIndexArray),this.rawTileData=i,this.bucketLayerIDs=r.bucketLayerIDs}else this.grid=new y(p,16,0),this.featureIndexArray=new A;this.coord=t,this.overscaling=e,this.x=t.x,this.y=t.y,this.z=t.z-Math.log(e)/Math.LN2,this.setCollisionTile(n)}function i(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function o(t,e){return e-t}function a(t){return t[\\\"line-gap-width\\\"]>0?t[\\\"line-gap-width\\\"]+2*t[\\\"line-width\\\"]:t[\\\"line-width\\\"]}function s(t,e,n,r,i){if(!e[0]&&!e[1])return t;e=l.convert(e),\\\"viewport\\\"===n&&e._rotate(-r);for(var o=[],a=0;a<t.length;a++){for(var s=t[a],u=[],c=0;c<s.length;c++)u.push(s[c].sub(e._mult(i)));o.push(u)}return o}function u(t,e){for(var n=[],r=new l(0,0),i=0;i<t.length;i++){for(var o=t[i],a=[],s=0;s<o.length;s++){var u=o[s-1],c=o[s],p=o[s+1],f=0===s?r:c.sub(u)._unit()._perp(),h=s===o.length-1?r:p.sub(c)._unit()._perp(),y=f._add(h)._unit(),d=y.x*h.x+y.y*h.y;y._mult(1/d),a.push(y._mult(e)._add(c))}n.push(a)}return n}var l=n(2),c=n(8),p=n(4).EXTENT,f=n(38),h=n(10),y=n(44),d=n(45),m=n(12),v=n(15),x=n(96),g=n(0).arraysIntersect,b=n(43),w=b.multiPolygonIntersectsBufferedMultiPoint,S=b.multiPolygonIntersectsMultiPolygon,_=b.multiPolygonIntersectsBufferedMultiLine,A=new h({members:[{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"}]});t.exports=r,r.prototype.insert=function(t,e,n,r){var i=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(e,n,r);for(var o=c(t),a=0;a<o.length;a++){for(var s=o[a],u=[1/0,1/0,-1/0,-1/0],l=0;l<s.length;l++){var p=s[l];u[0]=Math.min(u[0],p.x),u[1]=Math.min(u[1],p.y),u[2]=Math.max(u[2],p.x),u[3]=Math.max(u[3],p.y)}this.grid.insert(i,u[0],u[1],u[2],u[3])}},r.prototype.setCollisionTile=function(t){this.collisionTile=t},r.prototype.serialize=function(){var t={coord:this.coord,overscaling:this.overscaling,grid:this.grid.toArrayBuffer(),featureIndexArray:this.featureIndexArray.serialize(),bucketLayerIDs:this.bucketLayerIDs};return{data:t,transferables:[t.grid,t.featureIndexArray.arrayBuffer]}},r.prototype.query=function(t,e){this.vtLayers||(this.vtLayers=new m.VectorTile(new v(new Uint8Array(this.rawTileData))).layers,this.sourceLayerCoder=new d(this.vtLayers?Object.keys(this.vtLayers).sort():[\\\"_geojsonTileLayer\\\"]));var n={},r=t.params||{},s=p/t.tileSize/t.scale,u=f(r.filter),c=0;for(var h in e){var y=e[h],x=y.paint,g=0;\\\"line\\\"===y.type?g=a(x)/2+Math.abs(x[\\\"line-offset\\\"])+i(x[\\\"line-translate\\\"]):\\\"fill\\\"===y.type?g=i(x[\\\"fill-translate\\\"]):\\\"circle\\\"===y.type&&(g=x[\\\"circle-radius\\\"]+i(x[\\\"circle-translate\\\"])),c=Math.max(c,g*s)}for(var b=t.queryGeometry.map(function(t){return t.map(function(t){return new l(t.x,t.y)})}),w=1/0,S=1/0,_=-1/0,A=-1/0,M=0;M<b.length;M++)for(var P=b[M],z=0;z<P.length;z++){var I=P[z];w=Math.min(w,I.x),S=Math.min(S,I.y),_=Math.max(_,I.x),A=Math.max(A,I.y)}var T=this.grid.query(w-c,S-c,_+c,A+c);T.sort(o),this.filterMatching(n,T,this.featureIndexArray,b,u,r.layers,e,t.bearing,s);var V=this.collisionTile.queryRenderedSymbols(w,S,_,A,t.scale);return V.sort(),this.filterMatching(n,V,this.collisionTile.collisionBoxArray,b,u,r.layers,e,t.bearing,s),n},r.prototype.filterMatching=function(t,e,n,r,i,o,l,p,f){for(var h,y=0;y<e.length;y++){var d=e[y];if(d!==h){h=d;var m=n.get(d),v=this.bucketLayerIDs[m.bucketIndex];if(!o||g(o,v)){var b=this.sourceLayerCoder.decode(m.sourceLayerIndex),A=this.vtLayers[b],M=A.feature(m.featureIndex);if(i(M))for(var P=null,z=0;z<v.length;z++){var I=v[z];if(!(o&&o.indexOf(I)<0)){var T=l[I];if(T){var V;if(\\\"symbol\\\"!==T.type){P||(P=c(M));var k=T.paint;if(\\\"line\\\"===T.type){V=s(r,k[\\\"line-translate\\\"],k[\\\"line-translate-anchor\\\"],p,f);var E=a(k)/2*f;if(k[\\\"line-offset\\\"]&&(P=u(P,k[\\\"line-offset\\\"]*f)),!_(V,P,E))continue}else if(\\\"fill\\\"===T.type){if(V=s(r,k[\\\"fill-translate\\\"],k[\\\"fill-translate-anchor\\\"],p,f),!S(V,P))continue}else if(\\\"circle\\\"===T.type){V=s(r,k[\\\"circle-translate\\\"],k[\\\"circle-translate-anchor\\\"],p,f);var F=k[\\\"circle-radius\\\"]*f;if(!w(V,P,F))continue}}var j=new x(M,this.z,this.x,this.y);j.layer=T.serialize({includeRefProperties:!0});var L=t[I];void 0===L&&(L=t[I]=[]),L.push(j)}}}}}}}},function(t,e,n){\\\"use strict\\\";function r(t){var e=t.layoutVertexArrayType;this.layoutVertexArray=new e;var n=t.elementArrayType;n&&(this.elementArray=new n);var r=t.elementArrayType2;r&&(this.elementArray2=new r),this.paintVertexArrays=i.mapObject(t.paintVertexArrayTypes,function(t){return new t})}var i=n(0);t.exports=r,r.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,r.prototype.hasCapacityFor=function(t){return this.layoutVertexArray.length+t<=r.MAX_VERTEX_ARRAY_LENGTH},r.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},r.prototype.trim=function(){this.layoutVertexArray.trim(),this.elementArray&&this.elementArray.trim(),this.elementArray2&&this.elementArray2.trim();for(var t in this.paintVertexArrays)this.paintVertexArrays[t].trim()},r.prototype.serialize=function(){return{layoutVertexArray:this.layoutVertexArray.serialize(),elementArray:this.elementArray&&this.elementArray.serialize(),elementArray2:this.elementArray2&&this.elementArray2.serialize(),paintVertexArrays:i.mapObject(this.paintVertexArrays,function(t){return t.serialize()})}},r.prototype.getTransferables=function(t){t.push(this.layoutVertexArray.arrayBuffer),this.elementArray&&t.push(this.elementArray.arrayBuffer),this.elementArray2&&t.push(this.elementArray2.arrayBuffer);for(var e in this.paintVertexArrays)t.push(this.paintVertexArrays[e].arrayBuffer)}},function(t,e,n){\\\"use strict\\\";function r(t,e){this.layoutVertexBuffer=new o(t.layoutVertexArray,e.layoutVertexArrayType,o.BufferType.VERTEX),t.elementArray&&(this.elementBuffer=new o(t.elementArray,e.elementArrayType,o.BufferType.ELEMENT));var n,r=this.vaos={};t.elementArray2&&(this.elementBuffer2=new o(t.elementArray2,e.elementArrayType2,o.BufferType.ELEMENT),n=this.secondVaos={}),this.paintVertexBuffers=i.mapObject(t.paintVertexArrays,function(i,s){return r[s]=new a,t.elementArray2&&(n[s]=new a),new o(i,e.paintVertexArrayTypes[s],o.BufferType.VERTEX)})}var i=n(0),o=n(78),a=n(79);t.exports=r,r.prototype.destroy=function(t){this.layoutVertexBuffer.destroy(t),this.elementBuffer&&this.elementBuffer.destroy(t),this.elementBuffer2&&this.elementBuffer2.destroy(t);for(var e in this.paintVertexBuffers)this.paintVertexBuffers[e].destroy(t);for(var n in this.vaos)this.vaos[n].destroy(t);for(var r in this.secondVaos)this.secondVaos[r].destroy(t)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.attributes=e.members,this.itemSize=e.bytesPerElement,this.type=n,this.arrayType=e}t.exports=r,r.prototype.bind=function(t){var e=t[this.type];this.buffer?t.bindBuffer(e,this.buffer):(this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.arrayBuffer,t.STATIC_DRAW),this.arrayBuffer=null)};var i={Int8:\\\"BYTE\\\",Uint8:\\\"UNSIGNED_BYTE\\\",Int16:\\\"SHORT\\\",Uint16:\\\"UNSIGNED_SHORT\\\"};r.prototype.setVertexAttribPointers=function(t,e){for(var n=0;n<this.attributes.length;n++){var r=this.attributes[n],o=e[r.name];void 0!==o&&t.vertexAttribPointer(o,r.components,t[i[r.type]],!1,this.arrayType.bytesPerElement,r.offset)}},r.prototype.destroy=function(t){this.buffer&&t.deleteBuffer(this.buffer)},r.BufferType={VERTEX:\\\"ARRAY_BUFFER\\\",ELEMENT:\\\"ELEMENT_ARRAY_BUFFER\\\"}},function(t,e,n){\\\"use strict\\\";function r(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.vao=null}var i=n(9);t.exports=r,r.prototype.bind=function(t,e,n,r,i){void 0===t.extVertexArrayObject&&(t.extVertexArrayObject=t.getExtension(\\\"OES_vertex_array_object\\\"));var o=!this.vao||this.boundProgram!==e||this.boundVertexBuffer!==n||this.boundVertexBuffer2!==i||this.boundElementBuffer!==r;!t.extVertexArrayObject||o?this.freshBind(t,e,n,r,i):t.extVertexArrayObject.bindVertexArrayOES(this.vao)},r.prototype.freshBind=function(t,e,n,r,o){var a,s=e.numAttributes;if(t.extVertexArrayObject)this.vao&&this.destroy(t),this.vao=t.extVertexArrayObject.createVertexArrayOES(),t.extVertexArrayObject.bindVertexArrayOES(this.vao),a=0,this.boundProgram=e,this.boundVertexBuffer=n,this.boundVertexBuffer2=o,this.boundElementBuffer=r;else{a=t.currentNumAttributes||0;for(var u=s;u<a;u++)i(0!==u),t.disableVertexAttribArray(u)}for(var l=a;l<s;l++)t.enableVertexAttribArray(l);n.bind(t),n.setVertexAttribPointers(t,e),o&&(o.bind(t),o.setVertexAttribPointers(t,e)),r&&r.bind(t),t.currentNumAttributes=s},r.prototype.unbind=function(t){var e=t.extVertexArrayObject;e&&e.bindVertexArrayOES(null)},r.prototype.destroy=function(t){var e=t.extVertexArrayObject;e&&this.vao&&(e.deleteVertexArrayOES(this.vao),this.vao=null)}},function(t,e,n){\\\"use strict\\\";function r(t){if(null===t||void 0===t)throw new TypeError(\\\"Object.assign cannot be called with null or undefined\\\");return Object(t)}var i=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String(\\\"abc\\\");if(t[5]=\\\"de\\\",\\\"5\\\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e[\\\"_\\\"+String.fromCharCode(n)]=n;if(\\\"0123456789\\\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\\\"\\\"))return!1;var r={};return\\\"abcdefghijklmnopqrst\\\".split(\\\"\\\").forEach(function(t){r[t]=t}),\\\"abcdefghijklmnopqrst\\\"===Object.keys(Object.assign({},r)).join(\\\"\\\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,s,u=r(t),l=1;l<arguments.length;l++){n=Object(arguments[l]);for(var c in n)o.call(n,c)&&(u[c]=n[c]);if(i){s=i(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=n(82),u=n(39);t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.programInterfaces={fill:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}]),elementArrayType:new i.ElementArrayType(1),elementArrayType2:new i.ElementArrayType(2),paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-color\\\"},{name:\\\"a_outline_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"fill-outline-color\\\",e,n)},multiplier:255,paintProperty:\\\"fill-outline-color\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint8\\\",getValue:function(t,e,n){return[t.getPaintValue(\\\"fill-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"fill-opacity\\\"}]}},r.prototype.addFeature=function(t){for(var e=a(t),n=u(e,500),r=this.prepareArrayGroup(\\\"fill\\\",0),i=r.layoutVertexArray.length,o=0;o<n.length;o++)this.addPolygon(n[o]);this.populatePaintArrays(\\\"fill\\\",{zoom:this.zoom},t.properties,r,i)},r.prototype.addPolygon=function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n].length;for(var r=this.prepareArrayGroup(\\\"fill\\\",e),i=[],o=[],a=r.layoutVertexArray.length,u=0;u<t.length;u++){var l=t[u];u>0&&o.push(i.length/2);for(var c=0;c<l.length;c++){var p=l[c],f=r.layoutVertexArray.emplaceBack(p.x,p.y);c>=1&&r.elementArray2.emplaceBack(f-1,f),i.push(p.x),i.push(p.y)}}for(var h=s(i,o),y=0;y<h.length;y++)r.elementArray.emplaceBack(h[y]+a)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){n=n||2;var r=e&&e.length,o=r?e[0]*n:t.length,s=i(t,0,o,n,!0),u=[];if(!s||s.next===s.prev)return u;var l,c,f,h,y,d,m;if(r&&(s=p(t,e,s,n)),t.length>80*n){l=f=t[0],c=h=t[1];for(var v=n;v<o;v+=n)y=t[v],d=t[v+1],y<l&&(l=y),d<c&&(c=d),y>f&&(f=y),d>h&&(h=d);m=Math.max(f-l,h-c),m=0!==m?1/m:0}return a(s,u,n,l,c,m),u}function i(t,e,n,r,i){var o,a;if(i===j(t,e,n,r)>0)for(o=e;o<n;o+=r)a=k(o,t[o],t[o+1],a);else for(o=n-r;o>=e;o-=r)a=k(o,t[o],t[o+1],a);return a&&_(a,a.next)&&(E(a),a=a.next),a}function o(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!_(r,r.next)&&0!==S(r.prev,r,r.next))r=r.next;else{if(E(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function a(t,e,n,r,i,p,f){if(t){!f&&p&&m(t,r,i,p);for(var h,y,d=t;t.prev!==t.next;)if(h=t.prev,y=t.next,p?u(t,r,i,p):s(t))e.push(h.i/n),e.push(t.i/n),e.push(y.i/n),E(t),t=y.next,d=y.next;else if((t=y)===d){f?1===f?(t=l(o(t),e,n),a(t,e,n,r,i,p,2)):2===f&&c(t,e,n,r,i,p):a(o(t),e,n,r,i,p,1);break}}}function s(t){var e=t.prev,n=t,r=t.next;if(S(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(b(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&S(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function u(t,e,n,r){var i=t.prev,o=t,a=t.next;if(S(i,o,a)>=0)return!1;for(var s=i.x<o.x?i.x<a.x?i.x:a.x:o.x<a.x?o.x:a.x,u=i.y<o.y?i.y<a.y?i.y:a.y:o.y<a.y?o.y:a.y,l=i.x>o.x?i.x>a.x?i.x:a.x:o.x>a.x?o.x:a.x,c=i.y>o.y?i.y>a.y?i.y:a.y:o.y>a.y?o.y:a.y,p=x(s,u,e,n,r),f=x(l,c,e,n,r),h=t.prevZ,y=t.nextZ;h&&h.z>=p&&y&&y.z<=f;){if(h!==t.prev&&h!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&S(h.prev,h,h.next)>=0)return!1;if(h=h.prevZ,y!==t.prev&&y!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,y.x,y.y)&&S(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;h&&h.z>=p;){if(h!==t.prev&&h!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,h.x,h.y)&&S(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;y&&y.z<=f;){if(y!==t.prev&&y!==t.next&&b(i.x,i.y,o.x,o.y,a.x,a.y,y.x,y.y)&&S(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function l(t,e,n){var r=t;do{var i=r.prev,a=r.next.next;!_(i,a)&&A(i,r,r.next,a)&&I(i,a)&&I(a,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(a.i/n),E(r),E(r.next),r=t=a),r=r.next}while(r!==t);return o(r)}function c(t,e,n,r,i,s){var u=t;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&w(u,l)){var c=V(u,l);return u=o(u,u.next),c=o(c,c.next),a(u,e,n,r,i,s),void a(c,e,n,r,i,s)}l=l.next}u=u.next}while(u!==t)}function p(t,e,n,r){var a,s,u,l,c,p=[];for(a=0,s=e.length;a<s;a++)u=e[a]*r,l=a<s-1?e[a+1]*r:t.length,c=i(t,u,l,r,!1),c===c.next&&(c.steiner=!0),p.push(g(c));for(p.sort(f),a=0;a<p.length;a++)h(p[a],n),n=o(n,n.next);return n}function f(t,e){return t.x-e.x}function h(t,e){if(e=y(t,e)){var n=V(e,t);o(e,e.next),o(n,n.next)}}function y(t,e){var n,r=e,i=t.x,o=t.y,a=-1/0;do{if(o<=r.y&&o>=r.next.y&&r.next.y!==r.y){var s=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=i&&s>a){if(a=s,s===i){if(o===r.y)return r;if(o===r.next.y)return r.next}n=r.x<r.next.x?r:r.next}}r=r.next}while(r!==e);if(!n)return null;if(i===a)return n;var u,l=n,c=n.x,p=n.y,f=1/0;r=n;do{i>=r.x&&r.x>=c&&i!==r.x&&b(o<p?i:a,o,c,p,o<p?a:i,o,r.x,r.y)&&(u=Math.abs(o-r.y)/(i-r.x),I(r,t)&&(u<f||u===f&&(r.x>n.x||r.x===n.x&&d(n,r)))&&(n=r,f=u)),r=r.next}while(r!==l);return n}function d(t,e){return S(t.prev,t,e.prev)<0&&S(e.next,t,t.next)<0}function m(t,e,n,r){var i=t;do{null===i.z&&(i.z=x(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,v(i)}function v(t){var e,n,r,i,o,a,s,u,l=1;do{for(n=t,t=null,o=null,a=0;n;){for(a++,r=n,s=0,e=0;e<l&&(s++,r=r.nextZ);e++);for(u=l;s>0||u>0&&r;)0!==s&&(0===u||!r||n.z<=r.z)?(i=n,n=n.nextZ,s--):(i=r,r=r.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;n=r}o.nextZ=null,l*=2}while(a>1);return t}function x(t,e,n,r,i){return t=32767*(t-n)*i,e=32767*(e-r)*i,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function g(t){var e=t,n=t;do{(e.x<n.x||e.x===n.x&&e.y<n.y)&&(n=e),e=e.next}while(e!==t);return n}function b(t,e,n,r,i,o,a,s){return(i-a)*(e-s)-(t-a)*(o-s)>=0&&(t-a)*(r-s)-(n-a)*(e-s)>=0&&(n-a)*(o-s)-(i-a)*(r-s)>=0}function w(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!z(t,e)&&(I(t,e)&&I(e,t)&&T(t,e)&&(S(t.prev,t,e.prev)||S(t,e.prev,e))||_(t,e)&&S(t.prev,t,t.next)>0&&S(e.prev,e,e.next)>0)}function S(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _(t,e){return t.x===e.x&&t.y===e.y}function A(t,e,n,r){var i=P(S(t,e,n)),o=P(S(t,e,r)),a=P(S(n,r,t)),s=P(S(n,r,e));return i!==o&&a!==s||(!(0!==i||!M(t,n,e))||(!(0!==o||!M(t,r,e))||(!(0!==a||!M(n,t,r))||!(0!==s||!M(n,e,r)))))}function M(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function P(t){return t>0?1:t<0?-1:0}function z(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&A(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function I(t,e){return S(t.prev,t,t.next)<0?S(t,e,t.next)>=0&&S(t,t.prev,e)>=0:S(t,e,t.prev)<0||S(t,t.next,e)<0}function T(t,e){var n=t,r=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&i<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}function V(t,e){var n=new F(t.i,t.x,t.y),r=new F(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,o.next=r,r.prev=o,r}function k(t,e,n,r){var i=new F(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function E(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function F(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function j(t,e,n,r){for(var i=0,o=e,a=n-r;o<n;o+=r)i+=(t[a]-t[o])*(t[o+1]+t[a+1]),a=o;return i}t.exports=r,t.exports.default=r,r.deviation=function(t,e,n,r){var i=e&&e.length,o=i?e[0]*n:t.length,a=Math.abs(j(t,0,o,n));if(i)for(var s=0,u=e.length;s<u;s++){var l=e[s]*n,c=s<u-1?e[s+1]*n:t.length;a-=Math.abs(j(t,l,c,n))}var p=0;for(s=0;s<r.length;s+=3){var f=r[s]*n,h=r[s+1]*n,y=r[s+2]*n;p+=Math.abs((t[f]-t[y])*(t[h+1]-t[f+1])-(t[f]-t[h])*(t[y+1]-t[f+1]))}return 0===a&&0===p?0:Math.abs((p-a)/a)},r.flatten=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},r=0,i=0;i<t.length;i++){for(var o=0;o<t[i].length;o++)for(var a=0;a<e;a++)n.vertices.push(t[i][o][a]);i>0&&(r+=t[i-1].length,n.holes.push(r))}return n}},function(t,e,n){!function(e,n){t.exports=n()}(0,function(){\\\"use strict\\\";function t(t,n,i,o,a){e(t,n,i||0,o||t.length-1,a||r)}function e(t,r,i,o,a){for(;o>i;){if(o-i>600){var s=o-i+1,u=r-i+1,l=Math.log(s),c=.5*Math.exp(2*l/3),p=.5*Math.sqrt(l*c*(s-c)/s)*(u-s/2<0?-1:1);e(t,r,Math.max(i,Math.floor(r-u*c/s+p)),Math.min(o,Math.floor(r+(s-u)*c/s+p)),a)}var f=t[r],h=i,y=o;for(n(t,i,r),a(t[o],f)>0&&n(t,i,o);h<y;){for(n(t,h,y),h++,y--;a(t[h],f)<0;)h++;for(;a(t[y],f)>0;)y--}0===a(t[i],f)?n(t,i,y):(y++,n(t,y,o)),y<=r&&(i=y+1),r<=y&&(o=y-1)}}function n(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function r(t,e){return t<e?-1:t>e?1:0}return t})},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=i.EXTENT,u=Math.cos(Math.PI/180*37.5),l=Math.pow(2,14)/.5;t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.addLineVertex=function(t,e,n,r,i,o,a){return t.emplaceBack(e.x<<1|r,e.y<<1|i,Math.round(63*n.x)+128,Math.round(63*n.y)+128,1+(0===o?0:o<0?-1:1)|(.5*a&63)<<2,.5*a>>6)},r.prototype.programInterfaces={line:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]),paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"line-color\\\",e,n)},multiplier:255,paintProperty:\\\"line-color\\\"}],elementArrayType:new i.ElementArrayType}},r.prototype.addFeature=function(t){for(var e=a(t,15),n=0;n<e.length;n++)this.addLine(e[n],t.properties,this.layer.layout[\\\"line-join\\\"],this.layer.layout[\\\"line-cap\\\"],this.layer.layout[\\\"line-miter-limit\\\"],this.layer.layout[\\\"line-round-limit\\\"])},r.prototype.addLine=function(t,e,n,r,i,o){for(var a=t.length;a>2&&t[a-1].equals(t[a-2]);)a--;if(!(t.length<2)){\\\"bevel\\\"===n&&(i=1.05);var l=s/(512*this.overscaling)*15,c=t[0],p=t[a-1],f=c.equals(p),h=this.prepareArrayGroup(\\\"line\\\",10*a),y=h.layoutVertexArray.length;if(2!==a||!f){this.distance=0;var d,m,v,x,g,b,w,S=r,_=f?\\\"butt\\\":r,A=!0;this.e1=this.e2=this.e3=-1,f&&(d=t[a-2],g=c.sub(d)._unit()._perp());for(var M=0;M<a;M++)if(!(v=f&&M===a-1?t[1]:t[M+1])||!t[M].equals(v)){g&&(x=g),d&&(m=d),d=t[M],g=v?v.sub(d)._unit()._perp():x,x=x||g;var P=x.add(g)._unit(),z=P.x*g.x+P.y*g.y,I=1/z,T=z<u&&m&&v;if(T&&M>0){var V=d.dist(m);if(V>2*l){var k=d.sub(d.sub(m)._mult(l/V)._round());this.distance+=k.dist(m),this.addCurrentVertex(k,this.distance,x.mult(1),0,0,!1),m=k}}var E=m&&v,F=E?n:v?S:_;if(E&&\\\"round\\\"===F&&(I<o?F=\\\"miter\\\":I<=2&&(F=\\\"fakeround\\\")),\\\"miter\\\"===F&&I>i&&(F=\\\"bevel\\\"),\\\"bevel\\\"===F&&(I>2&&(F=\\\"flipbevel\\\"),I<i&&(F=\\\"miter\\\")),m&&(this.distance+=d.dist(m)),\\\"miter\\\"===F)P._mult(I),this.addCurrentVertex(d,this.distance,P,0,0,!1);else if(\\\"flipbevel\\\"===F){if(I>100)P=g.clone();else{var j=x.x*g.y-x.y*g.x>0?-1:1,L=I*x.add(g).mag()/x.sub(g).mag();P._perp()._mult(L*j)}this.addCurrentVertex(d,this.distance,P,0,0,!1),this.addCurrentVertex(d,this.distance,P.mult(-1),0,0,!1)}else if(\\\"bevel\\\"===F||\\\"fakeround\\\"===F){var O=x.x*g.y-x.y*g.x>0,B=-Math.sqrt(I*I-1);if(O?(w=0,b=B):(b=0,w=B),A||this.addCurrentVertex(d,this.distance,x,b,w,!1),\\\"fakeround\\\"===F){for(var C,q=Math.floor(8*(.5-(z-.5))),D=0;D<q;D++)C=g.mult((D+1)/(q+1))._add(x)._unit(),this.addPieSliceVertex(d,this.distance,C,O);this.addPieSliceVertex(d,this.distance,P,O);for(var N=q-1;N>=0;N--)C=x.mult((N+1)/(q+1))._add(g)._unit(),this.addPieSliceVertex(d,this.distance,C,O)}v&&this.addCurrentVertex(d,this.distance,g,-b,-w,!1)}else\\\"butt\\\"===F?(A||this.addCurrentVertex(d,this.distance,x,0,0,!1),v&&this.addCurrentVertex(d,this.distance,g,0,0,!1)):\\\"square\\\"===F?(A||(this.addCurrentVertex(d,this.distance,x,1,1,!1),this.e1=this.e2=-1),v&&this.addCurrentVertex(d,this.distance,g,-1,-1,!1)):\\\"round\\\"===F&&(A||(this.addCurrentVertex(d,this.distance,x,0,0,!1),this.addCurrentVertex(d,this.distance,x,1,1,!0),this.e1=this.e2=-1),v&&(this.addCurrentVertex(d,this.distance,g,-1,-1,!0),this.addCurrentVertex(d,this.distance,g,0,0,!1)));if(T&&M<a-1){var U=d.dist(v);if(U>2*l){var Z=d.add(v.sub(d)._mult(l/U)._round());this.distance+=Z.dist(d),this.addCurrentVertex(Z,this.distance,g.mult(1),0,0,!1),d=Z}}A=!1}this.populatePaintArrays(\\\"line\\\",{zoom:this.zoom},e,h,y)}}},r.prototype.addCurrentVertex=function(t,e,n,r,i,o){var a,s=o?1:0,u=this.arrayGroups.line[this.arrayGroups.line.length-1],c=u.layoutVertexArray,p=u.elementArray;a=n.clone(),r&&a._sub(n.perp()._mult(r)),this.e3=this.addLineVertex(c,t,a,s,0,r,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,a=n.mult(-1),i&&a._sub(n.perp()._mult(i)),this.e3=this.addLineVertex(c,t,a,s,1,-i,e),this.e1>=0&&this.e2>=0&&p.emplaceBack(this.e1,this.e2,this.e3),this.e1=this.e2,this.e2=this.e3,e>l/2&&(this.distance=0,this.addCurrentVertex(t,this.distance,n,r,i,o))},r.prototype.addPieSliceVertex=function(t,e,n,r){var i=r?1:0;n=n.mult(r?-1:1);var o=this.arrayGroups.line[this.arrayGroups.line.length-1],a=o.layoutVertexArray,s=o.elementArray;this.e3=this.addLineVertex(a,t,n,0,i,0,e),this.e1>=0&&this.e2>=0&&s.emplaceBack(this.e1,this.e2,this.e3),r?this.e2=this.e3:this.e1=this.e3}},function(t,e,n){\\\"use strict\\\";function r(){i.apply(this,arguments)}var i=n(4),o=n(0),a=n(8),s=i.EXTENT;t.exports=r,r.prototype=o.inherit(i,{}),r.prototype.addCircleVertex=function(t,e,n,r,i){return t.emplaceBack(2*e+(r+1)/2,2*n+(i+1)/2)},r.prototype.programInterfaces={circle:{layoutVertexArrayType:new i.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"}]),elementArrayType:new i.ElementArrayType,paintAttributes:[{name:\\\"a_color\\\",components:4,type:\\\"Uint8\\\",getValue:function(t,e,n){return t.getPaintValue(\\\"circle-color\\\",e,n)},multiplier:255,paintProperty:\\\"circle-color\\\"},{name:\\\"a_radius\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-radius\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-radius\\\"},{name:\\\"a_blur\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-blur\\\",e,n)]},multiplier:10,paintProperty:\\\"circle-blur\\\"},{name:\\\"a_opacity\\\",components:1,type:\\\"Uint16\\\",isLayerConstant:!1,getValue:function(t,e,n){return[t.getPaintValue(\\\"circle-opacity\\\",e,n)]},multiplier:255,paintProperty:\\\"circle-opacity\\\"}]}},r.prototype.addFeature=function(t){for(var e={zoom:this.zoom},n=a(t),r=this.prepareArrayGroup(\\\"circle\\\",0),i=r.layoutVertexArray.length,o=0;o<n.length;o++)for(var u=0;u<n[o].length;u++){var l=n[o][u].x,c=n[o][u].y;if(!(l<0||l>=s||c<0||c>=s)){var p=this.prepareArrayGroup(\\\"circle\\\",4),f=p.layoutVertexArray,h=this.addCircleVertex(f,l,c,-1,-1);this.addCircleVertex(f,l,c,1,-1),this.addCircleVertex(f,l,c,1,1),this.addCircleVertex(f,l,c,-1,1),p.elementArray.emplaceBack(h,h+1,h+2),p.elementArray.emplaceBack(h,h+3,h+2)}}this.populatePaintArrays(\\\"circle\\\",e,t.properties,r,i)}},function(t,e,n){\\\"use strict\\\";function r(t){a.apply(this,arguments),this.showCollisionBoxes=t.showCollisionBoxes,this.overscaling=t.overscaling,this.collisionBoxArray=t.collisionBoxArray,this.symbolQuadsArray=t.symbolQuadsArray,this.symbolInstancesArray=t.symbolInstancesArray,this.sdfIcons=t.sdfIcons,this.iconsNeedLinear=t.iconsNeedLinear,this.adjustedTextSize=t.adjustedTextSize,this.adjustedIconSize=t.adjustedIconSize,this.fontstack=t.fontstack}function i(t,e,n,r,i,o,a,s,u,l,c){return t.emplaceBack(e,n,Math.round(64*r),Math.round(64*i),o/4,a/4,10*(l||0),c,10*(s||0),10*Math.min(u||25,25))}var o=n(2),a=n(4),s=n(40),u=n(87),l=n(41),c=n(42),p=n(89),f=n(90),h=n(91),y=n(92),d=n(0),m=n(8),v=n(93),x=n(94),g=n(39),b=p.shapeText,w=p.shapeIcon,S=c.getGlyphQuads,_=c.getIconQuads,A=a.EXTENT;t.exports=r,r.MAX_QUADS=65535,r.prototype=d.inherit(a,{}),r.prototype.serialize=function(){var t=a.prototype.serialize.apply(this);return t.sdfIcons=this.sdfIcons,t.iconsNeedLinear=this.iconsNeedLinear,t.adjustedTextSize=this.adjustedTextSize,t.adjustedIconSize=this.adjustedIconSize,t.fontstack=this.fontstack,t};var M=new a.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_offset\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_texture_pos\\\",components:2,type:\\\"Uint16\\\"},{name:\\\"a_data\\\",components:4,type:\\\"Uint8\\\"}]),P=new a.ElementArrayType;r.prototype.addCollisionBoxVertex=function(t,e,n,r,i){return t.emplaceBack(e.x,e.y,Math.round(n.x),Math.round(n.y),10*r,10*i)},r.prototype.programInterfaces={glyph:{layoutVertexArrayType:M,elementArrayType:P},icon:{layoutVertexArrayType:M,elementArrayType:P},collisionBox:{layoutVertexArrayType:new a.VertexArrayType([{name:\\\"a_pos\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_extrude\\\",components:2,type:\\\"Int16\\\"},{name:\\\"a_data\\\",components:2,type:\\\"Uint8\\\"}])}},r.prototype.populateArrays=function(t,e,n){var r={lastIntegerZoom:1/0,lastIntegerZoomTime:0,lastZoom:0};this.adjustedTextMaxSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:18,zoomHistory:r}),this.adjustedTextSize=this.layer.getLayoutValue(\\\"text-size\\\",{zoom:this.zoom+1,zoomHistory:r}),this.adjustedIconMaxSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:18,zoomHistory:r}),this.adjustedIconSize=this.layer.getLayoutValue(\\\"icon-size\\\",{zoom:this.zoom+1,zoomHistory:r});var i=512*this.overscaling;this.tilePixelRatio=A/i,this.compareText={},this.iconsNeedLinear=!1,this.symbolInstancesStartIndex=this.symbolInstancesArray.length;var o=this.layer.layout,a=this.features,s=this.textFeatures,u=.5,c=.5;switch(o[\\\"text-anchor\\\"]){case\\\"right\\\":case\\\"top-right\\\":case\\\"bottom-right\\\":u=1;break;case\\\"left\\\":case\\\"top-left\\\":case\\\"bottom-left\\\":u=0}switch(o[\\\"text-anchor\\\"]){case\\\"bottom\\\":case\\\"bottom-right\\\":case\\\"bottom-left\\\":c=1;break;case\\\"top\\\":case\\\"top-right\\\":case\\\"top-left\\\":c=0}for(var p=\\\"right\\\"===o[\\\"text-justify\\\"]?1:\\\"left\\\"===o[\\\"text-justify\\\"]?0:.5,f=24*o[\\\"text-line-height\\\"],y=\\\"line\\\"!==o[\\\"symbol-placement\\\"]?24*o[\\\"text-max-width\\\"]:0,v=24*o[\\\"text-letter-spacing\\\"],x=[24*o[\\\"text-offset\\\"][0],24*o[\\\"text-offset\\\"][1]],g=this.fontstack=o[\\\"text-font\\\"].join(\\\",\\\"),S=[],_=0;_<a.length;_++)S.push(m(a[_]));if(\\\"line\\\"===o[\\\"symbol-placement\\\"]){var M=h(a,s,S);S=M.geometries,a=M.features,s=M.textFeatures}for(var P,z,I=0;I<a.length;I++)if(S[I]){if(P=s[I]?b(s[I],e[g],y,f,u,c,p,v,x):null,o[\\\"icon-image\\\"]){var T=l(a[I].properties,o[\\\"icon-image\\\"]),V=n[T];z=w(V,o),V&&(void 0===this.sdfIcons?this.sdfIcons=V.sdf:this.sdfIcons!==V.sdf&&d.warnOnce(\\\"Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer\\\"),1!==V.pixelRatio?this.iconsNeedLinear=!0:0===o[\\\"icon-rotate\\\"]&&this.layer.isLayoutValueFeatureConstant(\\\"icon-rotate\\\")||(this.iconsNeedLinear=!0))}else z=null;(P||z)&&this.addFeature(S[I],P,z,a[I])}this.symbolInstancesEndIndex=this.symbolInstancesArray.length,this.placeFeatures(t,this.showCollisionBoxes),this.trimArrays()},r.prototype.addFeature=function(t,e,n,r){var i=this.layer.layout,o=this.adjustedTextSize/24,a=void 0!==this.adjustedTextMaxSize?this.adjustedTextMaxSize:this.adjustedTextSize,s=this.tilePixelRatio*o,l=this.tilePixelRatio*a/24,c=this.tilePixelRatio*this.adjustedIconSize,p=this.tilePixelRatio*i[\\\"symbol-spacing\\\"],f=i[\\\"symbol-avoid-edges\\\"],h=i[\\\"text-padding\\\"]*this.tilePixelRatio,d=i[\\\"icon-padding\\\"]*this.tilePixelRatio,m=i[\\\"text-max-angle\\\"]/180*Math.PI,v=\\\"map\\\"===i[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===i[\\\"symbol-placement\\\"],x=\\\"map\\\"===i[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===i[\\\"symbol-placement\\\"],b=i[\\\"text-allow-overlap\\\"]||i[\\\"icon-allow-overlap\\\"]||i[\\\"text-ignore-placement\\\"]||i[\\\"icon-ignore-placement\\\"],w=i[\\\"symbol-placement\\\"],S=\\\"line\\\"===w,_=p/2,M=null;M=S?y(t,0,0,A,A):g(t,0);for(var P=0;P<M.length;P++){var z=null,I=M[P],T=null;S?(T=I,z=u(T,p,m,e,n,24,l,this.overscaling,A)):(T=I[0],z=this.findPolygonAnchors(I));for(var V=0,k=z.length;V<k;V++){var E=z[V];if(!(e&&S&&this.anchorIsTooClose(e.text,_,E))){var F=!(E.x<0||E.x>A||E.y<0||E.y>A);if(!f||F){var j=F||b;this.addSymbolInstance(E,T,e,n,this.layer,j,this.symbolInstancesArray.length,this.collisionBoxArray,r.index,this.sourceLayerIndex,this.index,s,h,v,c,d,x,{zoom:this.zoom},r.properties)}}}}},r.prototype.findPolygonAnchors=function(t){var e=t[0];if(0===e.length)return[];if(e.length<3||!d.isClosedPolygon(e))return[new s(e[0].x,e[0].y,0)];var n=x(t,16);return[new s(n.x,n.y,0)]},r.prototype.anchorIsTooClose=function(t,e,n){var r=this.compareText;if(t in r){for(var i=r[t],o=i.length-1;o>=0;o--)if(n.dist(i[o])<e)return!0}else r[t]=[];return r[t].push(n),!1},r.prototype.placeFeatures=function(t,e){this.recalculateStyleLayers(),this.createArrays();var n=this.layer.layout,r=t.maxScale,i=\\\"map\\\"===n[\\\"text-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"],o=\\\"map\\\"===n[\\\"icon-rotation-alignment\\\"]&&\\\"line\\\"===n[\\\"symbol-placement\\\"];if(n[\\\"text-allow-overlap\\\"]||n[\\\"icon-allow-overlap\\\"]||n[\\\"text-ignore-placement\\\"]||n[\\\"icon-ignore-placement\\\"]){var a=this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex,this.symbolInstancesEndIndex),s=t.angle,u=Math.sin(s),l=Math.cos(s);this.sortedSymbolInstances=a.sort(function(t,e){return(u*t.anchorPointX+l*t.anchorPointY|0)-(u*e.anchorPointX+l*e.anchorPointY|0)||e.index-t.index})}for(var c=this.symbolInstancesStartIndex;c<this.symbolInstancesEndIndex;c++){var p=this.sortedSymbolInstances?this.sortedSymbolInstances[c-this.symbolInstancesStartIndex]:this.symbolInstancesArray.get(c),f={boxStartIndex:p.textBoxStartIndex,boxEndIndex:p.textBoxEndIndex},h={boxStartIndex:p.iconBoxStartIndex,boxEndIndex:p.iconBoxEndIndex},y=!(p.textBoxStartIndex===p.textBoxEndIndex),d=!(p.iconBoxStartIndex===p.iconBoxEndIndex),m=n[\\\"text-optional\\\"]||!y,v=n[\\\"icon-optional\\\"]||!d,x=y?t.placeCollisionFeature(f,n[\\\"text-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale,g=d?t.placeCollisionFeature(h,n[\\\"icon-allow-overlap\\\"],n[\\\"symbol-avoid-edges\\\"]):t.minScale;m||v?!v&&x?x=Math.max(g,x):!m&&g&&(g=Math.max(g,x)):g=x=Math.max(g,x),y&&(t.insertCollisionFeature(f,x,n[\\\"text-ignore-placement\\\"]),x<=r&&this.addSymbols(\\\"glyph\\\",p.glyphQuadStartIndex,p.glyphQuadEndIndex,x,n[\\\"text-keep-upright\\\"],i,t.angle)),d&&(t.insertCollisionFeature(h,g,n[\\\"icon-ignore-placement\\\"]),g<=r&&this.addSymbols(\\\"icon\\\",p.iconQuadStartIndex,p.iconQuadEndIndex,g,n[\\\"icon-keep-upright\\\"],o,t.angle))}e&&this.addToDebugBuffers(t)},r.prototype.addSymbols=function(t,e,n,r,o,a,s){for(var u=this.prepareArrayGroup(t,4*(n-e)),l=u.elementArray,c=u.layoutVertexArray,p=this.zoom,f=Math.max(Math.log(r)/Math.LN2+p,0),h=e;h<n;h++){var y=this.symbolQuadsArray.get(h).SymbolQuad,d=(y.anchorAngle+s+Math.PI)%(2*Math.PI);if(!(o&&a&&(d<=Math.PI/2||d>3*Math.PI/2))){var m=y.tl,v=y.tr,x=y.bl,g=y.br,b=y.tex,w=y.anchorPoint,S=Math.max(p+Math.log(y.minScale)/Math.LN2,f),_=Math.min(p+Math.log(y.maxScale)/Math.LN2,25);if(!(_<=S)){S===f&&(S=0);var A=Math.round(y.glyphAngle/(2*Math.PI)*256),M=i(c,w.x,w.y,m.x,m.y,b.x,b.y,S,_,f,A);i(c,w.x,w.y,v.x,v.y,b.x+b.w,b.y,S,_,f,A),i(c,w.x,w.y,x.x,x.y,b.x,b.y+b.h,S,_,f,A),i(c,w.x,w.y,g.x,g.y,b.x+b.w,b.y+b.h,S,_,f,A),l.emplaceBack(M,M+1,M+2),l.emplaceBack(M+1,M+2,M+3)}}}},r.prototype.updateIcons=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"icon-image\\\"];if(e)for(var n=0;n<this.features.length;n++){var r=l(this.features[n].properties,e);r&&(t[r]=!0)}},r.prototype.updateFont=function(t){this.recalculateStyleLayers();var e=this.layer.layout[\\\"text-font\\\"],n=t[e]=t[e]||{};this.textFeatures=f(this.features,this.layer.layout,n)},r.prototype.addToDebugBuffers=function(t){for(var e=this.prepareArrayGroup(\\\"collisionBox\\\",0),n=e.layoutVertexArray,r=-t.angle,i=t.yStretch,a=this.symbolInstancesStartIndex;a<this.symbolInstancesEndIndex;a++){var s=this.symbolInstancesArray.get(a);s.textCollisionFeature={boxStartIndex:s.textBoxStartIndex,boxEndIndex:s.textBoxEndIndex},s.iconCollisionFeature={boxStartIndex:s.iconBoxStartIndex,boxEndIndex:s.iconBoxEndIndex};for(var u=0;u<2;u++){var l=s[0===u?\\\"textCollisionFeature\\\":\\\"iconCollisionFeature\\\"];if(l)for(var c=l.boxStartIndex;c<l.boxEndIndex;c++){var p=this.collisionBoxArray.get(c),f=p.anchorPoint,h=new o(p.x1,p.y1*i)._rotate(r),y=new o(p.x2,p.y1*i)._rotate(r),d=new o(p.x1,p.y2*i)._rotate(r),m=new o(p.x2,p.y2*i)._rotate(r),v=Math.max(0,Math.min(25,this.zoom+Math.log(p.maxScale)/Math.LN2)),x=Math.max(0,Math.min(25,this.zoom+Math.log(p.placementScale)/Math.LN2));this.addCollisionBoxVertex(n,f,h,v,x),this.addCollisionBoxVertex(n,f,y,v,x),this.addCollisionBoxVertex(n,f,y,v,x),this.addCollisionBoxVertex(n,f,m,v,x),this.addCollisionBoxVertex(n,f,m,v,x),this.addCollisionBoxVertex(n,f,d,v,x),this.addCollisionBoxVertex(n,f,d,v,x),this.addCollisionBoxVertex(n,f,h,v,x)}}}},r.prototype.addSymbolInstance=function(t,e,n,i,o,a,s,u,l,c,p,f,h,y,m,x,g,b,w){var A,M,P,z,I,T,V,k;if(n&&(V=a?S(t,n,f,e,o,y):[],I=new v(u,e,t,l,c,p,n,f,h,y,!1)),A=this.symbolQuadsArray.length,V&&V.length)for(var E=0;E<V.length;E++)this.addSymbolQuad(V[E]);M=this.symbolQuadsArray.length;var F=I?I.boxStartIndex:this.collisionBoxArray.length,j=I?I.boxEndIndex:this.collisionBoxArray.length;i&&(k=a?_(t,i,m,e,o,g,n,b,w):[],T=new v(u,e,t,l,c,p,i,m,x,g,!0)),P=this.symbolQuadsArray.length,k&&1===k.length&&this.addSymbolQuad(k[0]),z=this.symbolQuadsArray.length;var L=T?T.boxStartIndex:this.collisionBoxArray.length,O=T?T.boxEndIndex:this.collisionBoxArray.length;return z>r.MAX_QUADS&&d.warnOnce(\\\"Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\\\"),M>r.MAX_QUADS&&d.warnOnce(\\\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\\\"),this.symbolInstancesArray.emplaceBack(F,j,L,O,A,M,P,z,t.x,t.y,s)},r.prototype.addSymbolQuad=function(t){return this.symbolQuadsArray.emplaceBack(t.anchorPoint.x,t.anchorPoint.y,t.tl.x,t.tl.y,t.tr.x,t.tr.y,t.bl.x,t.bl.y,t.br.x,t.br.y,t.tex.h,t.tex.w,t.tex.x,t.tex.y,t.anchorAngle,t.glyphAngle,t.maxScale,t.minScale)}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a,s,u,l){var c=r?.6*a*s:0,p=Math.max(r?r.right-r.left:0,o?o.right-o.left:0),f=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;e-p*s<e/4&&(e=p*s+e/4);var h=2*a;return i(t,f?e/2*u%e:(p/2+h)*s*u%e,e,c,n,p*s,f,!1,l)}function i(t,e,n,r,u,l,c,p,f){for(var h=l/2,y=0,d=0;d<t.length-1;d++)y+=t[d].dist(t[d+1]);for(var m=0,v=e-n,x=[],g=0;g<t.length-1;g++){for(var b=t[g],w=t[g+1],S=b.dist(w),_=w.angleTo(b);v+n<m+S;){v+=n;var A=(v-m)/S,M=o(b.x,w.x,A),P=o(b.y,w.y,A);if(M>=0&&M<f&&P>=0&&P<f&&v-h>=0&&v+h<=y){var z=new a(M,P,_,g)._round();r&&!s(t,z,l,r,u)||x.push(z)}}m+=S}return p||x.length||c||(x=i(t,m/2,n,r,u,l,c,!0,f)),x}var o=n(17),a=n(40),s=n(88);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i){if(void 0===e.segment)return!0;for(var o=e,a=e.segment+1,s=0;s>-n/2;){if(--a<0)return!1;s-=t[a].dist(o),o=t[a]}s+=t[a].dist(t[a+1]),a++;for(var u=[],l=0;s<n/2;){var c=t[a-1],p=t[a],f=t[a+1];if(!f)return!1;var h=c.angleTo(p)-p.angleTo(f);for(h=Math.abs((h+3*Math.PI)%(2*Math.PI)-Math.PI),u.push({distance:s,angleDelta:h}),l+=h;s-u[0].distance>r;)l-=u.shift().angleDelta;if(l>i)return!1;a++,s+=p.dist(f)}return!0}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this.codePoint=t,this.x=e,this.y=n,this.glyph=r}function i(t,e,n,r,i,o){this.positionedGlyphs=t,this.text=e,this.top=n,this.bottom=r,this.left=i,this.right=o}function o(t,e,n,o,s,u,l,c,p){for(var f=[],h=new i(f,t,p[1],p[1],p[0],p[0]),y=0,d=0;d<t.length;d++){var m=t.charCodeAt(d),v=e[m];v&&(f.push(new r(m,y,-17,v)),y+=v.advance+c)}return!!f.length&&(a(h,e,o,n,s,u,l,p),h)}function a(t,e,n,r,i,o,a,l){var c=null,h=0,y=0,d=0,m=0,v=t.positionedGlyphs;if(r)for(var x=0;x<v.length;x++){var g=v[x];if(g.x-=h,g.y+=n*d,g.x>r&&null!==c){var b=v[c+1].x;m=Math.max(b,m);for(var w=c+1;w<=x;w++)v[w].y+=n,v[w].x-=b;if(a){var S=c;p[v[c].codePoint]&&S--,s(v,e,y,S,a)}y=c+1,c=null,h+=b,d++}f[g.codePoint]&&(c=x)}var _=v[v.length-1],A=_.x+e[_.codePoint].advance;m=Math.max(m,A);var M=(d+1)*n;s(v,e,y,v.length-1,a),u(v,a,i,o,m,n,d,l),t.top+=-o*M,t.bottom=t.top+M,t.left+=-i*m,t.right=t.left+m}function s(t,e,n,r,i){for(var o=e[t[r].codePoint].advance,a=(t[r].x+o)*i,s=n;s<=r;s++)t[s].x-=a}function u(t,e,n,r,i,o,a,s){for(var u=(e-n)*i+s[0],l=(-r*(a+1)+.5)*o+s[1],c=0;c<t.length;c++)t[c].x+=u,t[c].y+=l}function l(t,e){if(!t||!t.rect)return null;var n=e[\\\"icon-offset\\\"][0],r=e[\\\"icon-offset\\\"][1],i=n-t.width/2,o=i+t.width,a=r-t.height/2;return new c(t,a,a+t.height,i,o)}function c(t,e,n,r,i){this.image=t,this.top=e,this.bottom=n,this.left=r,this.right=i}t.exports={shapeText:o,shapeIcon:l};var p={32:!0,8203:!0},f={32:!0,38:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){for(var r=[],o=0,a=t.length;o<a;o++){var s=i(t[o].properties,e[\\\"text-field\\\"]);if(s){s=s.toString();var u=e[\\\"text-transform\\\"];\\\"uppercase\\\"===u?s=s.toLocaleUpperCase():\\\"lowercase\\\"===u&&(s=s.toLocaleLowerCase());for(var l=0;l<s.length;l++)n[s.charCodeAt(l)]=!0;r[o]=s}else r[o]=null}return r}var i=n(41);t.exports=r},function(t,e,n){\\\"use strict\\\";t.exports=function(t,e,n){function r(r){c.push(t[r]),p.push(n[r]),f.push(e[r]),h++}function i(t,e,n){var r=l[t];return delete l[t],l[e]=r,p[r][0].pop(),p[r][0]=p[r][0].concat(n[0]),r}function o(t,e,n){var r=u[e];return delete u[e],u[t]=r,p[r][0].shift(),p[r][0]=n[0].concat(p[r][0]),r}function a(t,e,n){var r=n?e[0][e[0].length-1]:e[0][0];return t+\\\":\\\"+r.x+\\\":\\\"+r.y}var s,u={},l={},c=[],p=[],f=[],h=0;for(s=0;s<t.length;s++){var y=n[s],d=e[s];if(d){var m=a(d,y),v=a(d,y,!0);if(m in l&&v in u&&l[m]!==u[v]){var x=o(m,v,y),g=i(m,v,p[x]);delete u[m],delete l[v],l[a(d,p[g],!0)]=g,p[x]=null}else m in l?i(m,v,y):v in u?o(m,v,y):(r(s),u[m]=h-1,l[v]=h-1)}else r(s)}return{features:c,textFeatures:f,geometries:p}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){for(var a=[],s=0;s<t.length;s++)for(var u,l=t[s],c=0;c<l.length-1;c++){var p=l[c],f=l[c+1];p.x<e&&f.x<e||(p.x<e?p=new i(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round():f.x<e&&(f=new i(e,p.y+(f.y-p.y)*((e-p.x)/(f.x-p.x)))._round()),p.y<n&&f.y<n||(p.y<n?p=new i(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round():f.y<n&&(f=new i(p.x+(f.x-p.x)*((n-p.y)/(f.y-p.y)),n)._round()),p.x>=r&&f.x>=r||(p.x>=r?p=new i(r,p.y+(f.y-p.y)*((r-p.x)/(f.x-p.x)))._round():f.x>=r&&(f=new i(r,p.y+(f.y-p.y)*((r-p.x)/(f.x-p.x)))._round()),p.y>=o&&f.y>=o||(p.y>=o?p=new i(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round():f.y>=o&&(f=new i(p.x+(f.x-p.x)*((o-p.y)/(f.y-p.y)),o)._round()),u&&p.equals(u[u.length-1])||(u=[p],a.push(u)),u.push(f)))))}return a}var i=n(2);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a,s,u,l,c){var p=a.top*s-u,f=a.bottom*s+u,h=a.left*s-u,y=a.right*s+u;if(this.boxStartIndex=t.length,l){var d=f-p,m=y-h;if(d>0)if(d=Math.max(10*s,d),c){var v=e[n.segment+1].sub(e[n.segment])._unit()._mult(m),x=[n.sub(v),n.add(v)];this._addLineCollisionBoxes(t,x,n,0,m,d,r,i,o)}else this._addLineCollisionBoxes(t,e,n,n.segment,m,d,r,i,o)}else t.emplaceBack(n.x,n.y,h,p,y,f,1/0,r,i,o,0,0,0,0,0);this.boxEndIndex=t.length}t.exports=r,r.prototype._addLineCollisionBoxes=function(t,e,n,r,i,o,a,s,u){var l=o/2,c=Math.floor(i/l),p=-o/2,f=this.boxes,h=n,y=r+1,d=p;do{if(--y<0)return f;d-=e[y].dist(h),h=e[y]}while(d>-i/2);for(var m=e[y].dist(e[y+1]),v=0;v<c;v++){for(var x=-i/2+v*l;d+m<x;){if(d+=m,++y+1>=e.length)return f;m=e[y].dist(e[y+1])}var g=x-d,b=e[y],w=e[y+1],S=w.sub(b)._unit()._mult(g)._add(b)._round(),_=Math.max(Math.abs(x-p)-l/2,0),A=i/2/_;t.emplaceBack(S.x,S.y,-o/2,-o/2,o/2,o/2,A,a,s,u,0,0,0,0,0)}return f}},function(t,e,n){\\\"use strict\\\";function r(t,e){return e.max-t.max}function i(t,e,n,r){this.p=new u(t,e),this.h=n,this.d=o(this.p,r),this.max=this.d+this.h*Math.SQRT2}function o(t,e){for(var n=!1,r=1/0,i=0;i<e.length;i++)for(var o=e[i],a=0,s=o.length,u=s-1;a<s;u=a++){var c=o[a],p=o[u];c.y>t.y!=p.y>t.y&&t.x<(p.x-c.x)*(t.y-c.y)/(p.y-c.y)+c.x&&(n=!n),r=Math.min(r,l(t,c,p))}return(n?1:-1)*Math.sqrt(r)}function a(t){for(var e=0,n=0,r=0,o=t[0],a=0,s=o.length,u=s-1;a<s;u=a++){var l=o[a],c=o[u],p=l.x*c.y-c.x*l.y;n+=(l.x+c.x)*p,r+=(l.y+c.y)*p,e+=3*p}return new i(n/e,r/e,0,t)}var s=n(95),u=n(2),l=n(43).distToSegmentSquared;t.exports=function(t,e,n){e=e||1;for(var o,u,l,c,p=t[0],f=0;f<p.length;f++){var h=p[f];(!f||h.x<o)&&(o=h.x),(!f||h.y<u)&&(u=h.y),(!f||h.x>l)&&(l=h.x),(!f||h.y>c)&&(c=h.y)}for(var y=l-o,d=c-u,m=Math.min(y,d),v=m/2,x=new s(null,r),g=o;g<l;g+=m)for(var b=u;b<c;b+=m)x.push(new i(g+v,b+v,v,t));for(var w=a(t),S=x.length;x.length;){var _=x.pop();_.d>w.d&&(w=_,n&&console.log(\\\"found best %d after %d probes\\\",Math.round(1e4*_.d)/1e4,S)),_.max-w.d<=e||(v=_.h/2,x.push(new i(_.p.x-v,_.p.y-v,v,t)),x.push(new i(_.p.x+v,_.p.y-v,v,t)),x.push(new i(_.p.x-v,_.p.y+v,v,t)),x.push(new i(_.p.x+v,_.p.y+v,v,t)),S+=4)}return n&&(console.log(\\\"num probes: \\\"+S),console.log(\\\"best distance: \\\"+w.d)),w.p}},function(t,e,n){\\\"use strict\\\";function r(t,e){if(!(this instanceof r))return new r(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||i,this.length>0)for(var n=(this.length>>1)-1;n>=0;n--)this._down(n)}function i(t,e){return t<e?-1:t>e?1:0}t.exports=r,t.exports.default=r,r.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,n=this.compare,r=e[t];t>0;){var i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r},_down:function(t){for(var e=this.data,n=this.compare,r=this.length>>1,i=e[t];t<r;){var o=1+(t<<1),a=o+1,s=e[o];if(a<this.length&&n(e[a],s)<0&&(o=a,s=e[a]),n(s,i)>=0)break;e[t]=s,t=o}e[t]=i}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r){this._vectorTileFeature=t,t._z=e,t._x=n,t._y=r,this.properties=t.properties,null!=t.id&&(this.id=t.id)}t.exports=r,r.prototype={type:\\\"Feature\\\",get geometry(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},set geometry(t){this._geometry=t},toJSON:function(){var t={};for(var e in this)\\\"_geometry\\\"!==e&&\\\"_vectorTileFeature\\\"!==e&&\\\"toJSON\\\"!==e&&(t[e]=this[e]);return t}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n){if(\\\"object\\\"==typeof t){var r=t;n=e,t=r.angle,e=r.pitch,this.grid=new a(r.grid),this.ignoredGrid=new a(r.ignoredGrid)}else this.grid=new a(o,12,6),this.ignoredGrid=new a(o,12,0);this.angle=t,this.pitch=e;var i=Math.sin(t),s=Math.cos(t);if(this.rotationMatrix=[s,-i,i,s],this.reverseRotationMatrix=[s,i,-i,s],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=n,0===n.length){n.emplaceBack();n.emplaceBack(0,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(o,0,0,-32767,0,32767,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,0,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0),n.emplaceBack(0,o,-32767,0,32767,0,32767,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=n.get(0),this.edges=[n.get(1),n.get(2),n.get(3),n.get(4)]}var i=n(2),o=n(4).EXTENT,a=n(44);t.exports=r,r.prototype.serialize=function(){var t={angle:this.angle,pitch:this.pitch,grid:this.grid.toArrayBuffer(),ignoredGrid:this.ignoredGrid.toArrayBuffer()};return{data:t,transferables:[t.grid,t.ignoredGrid]}},r.prototype.minScale=.25,r.prototype.maxScale=2,r.prototype.placeCollisionFeature=function(t,e,n){for(var r=this.collisionBoxArray,o=this.minScale,a=this.rotationMatrix,s=this.yStretch,u=t.boxStartIndex;u<t.boxEndIndex;u++){var l=r.get(u),c=l.anchorPoint._matMult(a),p=c.x,f=c.y,h=p+l.x1,y=f+l.y1*s,d=p+l.x2,m=f+l.y2*s;if(l.bbox0=h,l.bbox1=y,l.bbox2=d,l.bbox3=m,!e)for(var v=this.grid.query(h,y,d,m),x=0;x<v.length;x++){var g=r.get(v[x]),b=g.anchorPoint._matMult(a);if((o=this.getPlacementScale(o,c,l,b,g))>=this.maxScale)return o}if(n){var w;if(this.angle){var S=this.reverseRotationMatrix,_=new i(l.x1,l.y1).matMult(S),A=new i(l.x2,l.y1).matMult(S),M=new i(l.x1,l.y2).matMult(S),P=new i(l.x2,l.y2).matMult(S);w=this.tempCollisionBox,w.anchorPointX=l.anchorPoint.x,w.anchorPointY=l.anchorPoint.y,w.x1=Math.min(_.x,A.x,M.x,P.x),w.y1=Math.min(_.y,A.x,M.x,P.x),w.x2=Math.max(_.x,A.x,M.x,P.x),w.y2=Math.max(_.y,A.x,M.x,P.x),w.maxScale=l.maxScale}else w=l;for(var z=0;z<this.edges.length;z++){var I=this.edges[z];if((o=this.getPlacementScale(o,l.anchorPoint,w,I.anchorPoint,I))>=this.maxScale)return o}}}return o},r.prototype.queryRenderedSymbols=function(t,e,n,r,o){var a={},s=[],u=this.collisionBoxArray,l=this.rotationMatrix,c=new i(t,e)._matMult(l),p=this.tempCollisionBox;p.anchorX=c.x,p.anchorY=c.y,p.x1=0,p.y1=0,p.x2=n-t,p.y2=r-e,p.maxScale=o,o=p.maxScale;for(var f=[c.x+p.x1/o,c.y+p.y1/o*this.yStretch,c.x+p.x2/o,c.y+p.y2/o*this.yStretch],h=this.grid.query(f[0],f[1],f[2],f[3]),y=this.ignoredGrid.query(f[0],f[1],f[2],f[3]),d=0;d<y.length;d++)h.push(y[d]);for(var m=0;m<h.length;m++){var v=u.get(h[m]),x=v.sourceLayerIndex,g=v.featureIndex;if(void 0===a[x]&&(a[x]={}),!a[x][g]){var b=v.anchorPoint.matMult(l);this.getPlacementScale(this.minScale,c,p,b,v)>=o&&(a[x][g]=!0,s.push(h[m]))}}return s},r.prototype.getPlacementScale=function(t,e,n,r,i){var o=e.x-r.x,a=e.y-r.y,s=(i.x1-n.x2)/o,u=(i.x2-n.x1)/o,l=(i.y1-n.y2)*this.yStretch/a,c=(i.y2-n.y1)*this.yStretch/a;(isNaN(s)||isNaN(u))&&(s=u=1),(isNaN(l)||isNaN(c))&&(l=c=1);var p=Math.min(Math.max(s,u),Math.max(l,c)),f=i.maxScale,h=n.maxScale;return p>f&&(p=f),p>h&&(p=h),p>t&&p>=i.placementScale&&(t=p),t},r.prototype.insertCollisionFeature=function(t,e,n){for(var r=n?this.ignoredGrid:this.grid,i=this.collisionBoxArray,o=t.boxStartIndex;o<t.boxEndIndex;o++){var a=i.get(o);a.placementScale=e,e<this.maxScale&&r.insert(o,a.bbox0,a.bbox1,a.bbox2,a.bbox3)}}},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=t.exports=new r({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int16\\\",name:\\\"x1\\\"},{type:\\\"Int16\\\",name:\\\"y1\\\"},{type:\\\"Int16\\\",name:\\\"x2\\\"},{type:\\\"Int16\\\",name:\\\"y2\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Uint32\\\",name:\\\"featureIndex\\\"},{type:\\\"Uint16\\\",name:\\\"sourceLayerIndex\\\"},{type:\\\"Uint16\\\",name:\\\"bucketIndex\\\"},{type:\\\"Int16\\\",name:\\\"bbox0\\\"},{type:\\\"Int16\\\",name:\\\"bbox1\\\"},{type:\\\"Int16\\\",name:\\\"bbox2\\\"},{type:\\\"Int16\\\",name:\\\"bbox3\\\"},{type:\\\"Float32\\\",name:\\\"placementScale\\\"}]});i.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=t.exports=new r({members:[{type:\\\"Uint16\\\",name:\\\"textBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"textBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconBoxEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"glyphQuadEndIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadStartIndex\\\"},{type:\\\"Uint16\\\",name:\\\"iconQuadEndIndex\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Int8\\\",name:\\\"index\\\"}]});i.extendAll(a.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)}})},function(t,e,n){\\\"use strict\\\";var r=n(10),i=n(0),o=n(2),a=n(42).SymbolQuad,s=t.exports=new r({members:[{type:\\\"Int16\\\",name:\\\"anchorPointX\\\"},{type:\\\"Int16\\\",name:\\\"anchorPointY\\\"},{type:\\\"Float32\\\",name:\\\"tlX\\\"},{type:\\\"Float32\\\",name:\\\"tlY\\\"},{type:\\\"Float32\\\",name:\\\"trX\\\"},{type:\\\"Float32\\\",name:\\\"trY\\\"},{type:\\\"Float32\\\",name:\\\"blX\\\"},{type:\\\"Float32\\\",name:\\\"blY\\\"},{type:\\\"Float32\\\",name:\\\"brX\\\"},{type:\\\"Float32\\\",name:\\\"brY\\\"},{type:\\\"Int16\\\",name:\\\"texH\\\"},{type:\\\"Int16\\\",name:\\\"texW\\\"},{type:\\\"Int16\\\",name:\\\"texX\\\"},{type:\\\"Int16\\\",name:\\\"texY\\\"},{type:\\\"Float32\\\",name:\\\"anchorAngle\\\"},{type:\\\"Float32\\\",name:\\\"glyphAngle\\\"},{type:\\\"Float32\\\",name:\\\"maxScale\\\"},{type:\\\"Float32\\\",name:\\\"minScale\\\"}]});i.extendAll(s.prototype.StructType.prototype,{get anchorPoint(){return new o(this.anchorPointX,this.anchorPointY)},get SymbolQuad(){return new a(this.anchorPoint,new o(this.tlX,this.tlY),new o(this.trX,this.trY),new o(this.blX,this.blY),new o(this.brX,this.brY),{x:this.texX,y:this.texY,h:this.texH,w:this.texW,height:this.texH,width:this.texW},this.anchorAngle,this.glyphAngle,this.minScale,this.maxScale)}})},function(t,e,n){\\\"use strict\\\";function r(t,e,n){n&&(this.loadGeoJSON=n),p.call(this,t,e)}var i=n(0),o=n(34),a=n(102),s=n(105),u=n(106),l=n(109),c=n(114),p=n(33);t.exports=r,r.prototype=i.inherit(p,{_geoJSONIndexes:{},loadVectorData:function(t,e){var n=t.source,r=t.coord;if(!this._geoJSONIndexes[n])return e(null,null);var i=this._geoJSONIndexes[n].getTile(Math.min(r.z,t.maxZoom),r.x,r.y);if(!i)return e(null,null);var o=new s(i.features);o.name=\\\"_geojsonTileLayer\\\";var a=u({layers:{_geojsonTileLayer:o}});0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),e(null,{tile:o,rawTileData:a.buffer})},loadData:function(t,e){var n=function(n,r){return n?e(n):\\\"object\\\"!=typeof r?e(new Error(\\\"Input data is not a valid GeoJSON object.\\\")):(a(r,!0),void this._indexData(r,t,function(n,r){if(n)return e(n);this._geoJSONIndexes[t.source]=r,e(null)}.bind(this)))}.bind(this);this.loadGeoJSON(t,n)},loadGeoJSON:function(t,e){if(t.url)o.getJSON(t.url,e);else{if(\\\"string\\\"!=typeof t.data)return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"));try{return e(null,JSON.parse(t.data))}catch(t){return e(new Error(\\\"Input data is not a valid GeoJSON object.\\\"))}}},_indexData:function(t,e,n){try{e.cluster?n(null,l(e.superclusterOptions).load(t.features)):n(null,c(t,e.geojsonVtOptions))}catch(t){return n(t)}}})},function(t,e,n){function r(t,e){switch(t&&t.type||null){case\\\"FeatureCollection\\\":return t.features=t.features.map(i(r,e)),t;case\\\"Feature\\\":return t.geometry=r(t.geometry,e),t;case\\\"Polygon\\\":case\\\"MultiPolygon\\\":return o(t,e);default:return t}}function i(t,e){return function(n){return t(n,e)}}function o(t,e){return\\\"Polygon\\\"===t.type?t.coordinates=a(t.coordinates,e):\\\"MultiPolygon\\\"===t.type&&(t.coordinates=t.coordinates.map(i(a,e))),t}function a(t,e){e=!!e,t[0]=s(t[0],!e);for(var n=1;n<t.length;n++)t[n]=s(t[n],e);return t}function s(t,e){return u(t)===e?t:t.reverse()}function u(t){return l.ring(t)>=0}var l=n(103);t.exports=r},function(t,e,n){function r(t){if(\\\"Polygon\\\"===t.type)return i(t.coordinates);if(\\\"MultiPolygon\\\"===t.type){for(var e=0,n=0;n<t.coordinates.length;n++)e+=i(t.coordinates[n]);return e}return null}function i(t){var e=0;if(t&&t.length>0){e+=Math.abs(o(t[0]));for(var n=1;n<t.length;n++)e-=Math.abs(o(t[n]))}return e}function o(t){var e=0;if(t.length>2){for(var n,r,i=0;i<t.length-1;i++)n=t[i],r=t[i+1],e+=a(r[0]-n[0])*(2+Math.sin(a(n[1]))+Math.sin(a(r[1])));e=e*s.RADIUS*s.RADIUS/2}return e}function a(t){return t*Math.PI/180}var s=n(104);t.exports.geometry=r,t.exports.ring=o},function(t,e){t.exports.RADIUS=6378137,t.exports.FLATTENING=1/298.257223563,t.exports.POLAR_RADIUS=6356752.3142},function(t,e,n){\\\"use strict\\\";function r(t){this.features=t,this.length=t.length,this.extent=s}function i(t){if(this.type=t.type,1===t.type){this.rawGeometry=[];for(var e=0;e<t.geometry.length;e++)this.rawGeometry.push([t.geometry[e]])}else this.rawGeometry=t.geometry;this.properties=t.tags,this.extent=s}var o=n(2),a=n(12).VectorTileFeature,s=n(4).EXTENT;t.exports=r,r.prototype.feature=function(t){return new i(this.features[t])},i.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],r=[],i=0;i<n.length;i++)r.push(new o(n[i][0],n[i][1]));this.geometry.push(r)}return this.geometry},i.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,r=1/0,i=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),r=Math.min(r,u.y),i=Math.max(i,u.y)}return[e,r,n,i]},i.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){function r(t){var e=[];for(var n in t.layers)e.push(o(t.layers[n]));var r=new c;return p.tile.write({layers:e},r),r.finish()}function i(t){var e={};for(var n in t)e[n]=new f(t[n].features),e[n].name=n;return r({layers:e})}function o(t){for(var e={name:t.name||\\\"\\\",version:t.version||1,extent:t.extent||4096,keys:[],values:[],features:[]},n={},r={},i=0;i<t.length;i++){var o=t.feature(i);o.geometry=u(o.loadGeometry());var a=[];for(var s in o.properties){var c=n[s];void 0===c&&(e.keys.push(s),c=e.keys.length-1,n[s]=c);var p=l(o.properties[s]),f=r[p.key];void 0===f&&(e.values.push(p),f=e.values.length-1,r[p.key]=f),a.push(c),a.push(f)}o.tags=a,e.features.push(o)}return e}function a(t,e){return(e<<3)+(7&t)}function s(t){return t<<1^t>>31}function u(t){for(var e=[],n=0,r=0,i=t.length,o=0;o<i;o++){var u=t[o];e.push(a(1,1));for(var l=0;l<u.length;l++){1===l&&e.push(a(2,u.length-1));var c=u[l].x-n,p=u[l].y-r;e.push(s(c),s(p)),n+=c,r+=p}}return e}function l(t){var e,n=typeof t;return\\\"string\\\"===n?e={string_value:t}:\\\"boolean\\\"===n?e={bool_value:t}:\\\"number\\\"===n?e=t%1!=0?{double_value:t}:t<0?{sint_value:t}:{uint_value:t}:(t=JSON.stringify(t),e={string_value:t}),e.key=n+\\\":\\\"+t,e}var c=n(15),p=n(107),f=n(108);t.exports=r,t.exports.fromVectorTileJs=r,t.exports.fromGeojsonVt=i,t.exports.GeoJSONWrapper=f},function(t,e,n){\\\"use strict\\\";function r(t,e){return t.readFields(i,{layers:[]},e)}function i(t,e,n){3===t&&e.layers.push(f(n,n.readVarint()+n.pos))}function o(t,e){var n;if(void 0!==t.layers)for(n=0;n<t.layers.length;n++)e.writeMessage(3,y,t.layers[n])}function a(t,e){return t.readFields(s,{},e)}function s(t,e,n){1===t?e.string_value=n.readString():2===t?e.float_value=n.readFloat():3===t?e.double_value=n.readDouble():4===t?e.int_value=n.readVarint():5===t?e.uint_value=n.readVarint():6===t?e.sint_value=n.readSVarint():7===t&&(e.bool_value=n.readBoolean())}function u(t,e){void 0!==t.string_value&&e.writeStringField(1,t.string_value),void 0!==t.float_value&&e.writeFloatField(2,t.float_value),void 0!==t.double_value&&e.writeDoubleField(3,t.double_value),void 0!==t.int_value&&e.writeVarintField(4,t.int_value),void 0!==t.uint_value&&e.writeVarintField(5,t.uint_value),void 0!==t.sint_value&&e.writeSVarintField(6,t.sint_value),void 0!==t.bool_value&&e.writeBooleanField(7,t.bool_value)}function l(t,e){var n=t.readFields(c,{},e);return void 0===n.type&&(n.type=\\\"Unknown\\\"),n}function c(t,e,n){1===t?e.id=n.readVarint():2===t?e.tags=n.readPackedVarint():3===t?e.type=n.readVarint():4===t&&(e.geometry=n.readPackedVarint())}function p(t,e){void 0!==t.id&&e.writeVarintField(1,t.id),void 0!==t.tags&&e.writePackedVarint(2,t.tags),void 0!==t.type&&e.writeVarintField(3,t.type),void 0!==t.geometry&&e.writePackedVarint(4,t.geometry)}function f(t,e){return t.readFields(h,{features:[],keys:[],values:[]},e)}function h(t,e,n){15===t?e.version=n.readVarint():1===t?e.name=n.readString():2===t?e.features.push(l(n,n.readVarint()+n.pos)):3===t?e.keys.push(n.readString()):4===t?e.values.push(a(n,n.readVarint()+n.pos)):5===t&&(e.extent=n.readVarint())}function y(t,e){void 0!==t.version&&e.writeVarintField(15,t.version),void 0!==t.name&&e.writeStringField(1,t.name);var n;if(void 0!==t.features)for(n=0;n<t.features.length;n++)e.writeMessage(2,p,t.features[n]);if(void 0!==t.keys)for(n=0;n<t.keys.length;n++)e.writeStringField(3,t.keys[n]);if(void 0!==t.values)for(n=0;n<t.values.length;n++)e.writeMessage(4,u,t.values[n]);void 0!==t.extent&&e.writeVarintField(5,t.extent)}var d=e.tile={read:r,write:o};d.GeomType={Unknown:0,Point:1,LineString:2,Polygon:3},d.value={read:a,write:u},d.feature={read:l,write:p},d.layer={read:f,write:y}},function(t,e,n){\\\"use strict\\\";function r(t){this.features=t,this.length=t.length}function i(t){this.id=\\\"number\\\"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=4096}var o=n(2),a=n(12).VectorTileFeature;t.exports=r,r.prototype.feature=function(t){return new i(this.features[t])},i.prototype.loadGeometry=function(){var t=this.rawGeometry;this.geometry=[];for(var e=0;e<t.length;e++){for(var n=t[e],r=[],i=0;i<n.length;i++)r.push(new o(n[i][0],n[i][1]));this.geometry.push(r)}return this.geometry},i.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,n=-1/0,r=1/0,i=-1/0,o=0;o<t.length;o++)for(var a=t[o],s=0;s<a.length;s++){var u=a[s];e=Math.min(e,u.x),n=Math.max(n,u.x),r=Math.min(r,u.y),i=Math.max(i,u.y)}return[e,r,n,i]},i.prototype.toGeoJSON=a.prototype.toGeoJSON},function(t,e,n){\\\"use strict\\\";function r(t){return new i(t)}function i(t){this.options=h(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function o(t,e,n,r,i){return{x:t,y:e,zoom:1/0,id:r,properties:i,parentId:-1,numPoints:n}}function a(t,e){var n=t.geometry.coordinates;return{x:l(n[0]),y:c(n[1]),zoom:1/0,id:e,parentId:-1}}function s(t){return{type:\\\"Feature\\\",properties:u(t),geometry:{type:\\\"Point\\\",coordinates:[p(t.x),f(t.y)]}}}function u(t){var e=t.numPoints,n=e>=1e4?Math.round(e/1e3)+\\\"k\\\":e>=1e3?Math.round(e/100)/10+\\\"k\\\":e;return h(h({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:n})}function l(t){return t/360+.5}function c(t){var e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){return 360*(t-.5)}function f(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function h(t,e){for(var n in e)t[n]=e[n];return t}function y(t){return t.x}function d(t){return t.y}var m=n(110);t.exports=r,i.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,initial:function(){return{}},map:function(t){return t}},load:function(t){var e=this.options.log;e&&console.time(\\\"total time\\\");var n=\\\"prepare \\\"+t.length+\\\" points\\\";e&&console.time(n),this.points=t;var r=t.map(a);e&&console.timeEnd(n);for(var i=this.options.maxZoom;i>=this.options.minZoom;i--){var o=+Date.now();this.trees[i+1]=m(r,y,d,this.options.nodeSize,Float32Array),r=this._cluster(r,i),e&&console.log(\\\"z%d: %d clusters in %dms\\\",i,r.length,+Date.now()-o)}return this.trees[this.options.minZoom]=m(r,y,d,this.options.nodeSize,Float32Array),e&&console.timeEnd(\\\"total time\\\"),this},getClusters:function(t,e){for(var n=this.trees[this._limitZoom(e)],r=n.range(l(t[0]),c(t[3]),l(t[2]),c(t[1])),i=[],o=0;o<r.length;o++){var a=n.points[r[o]];i.push(a.numPoints?s(a):this.points[a.id])}return i},getChildren:function(t,e){for(var n=this.trees[e+1].points[t],r=this.options.radius/(this.options.extent*Math.pow(2,e)),i=this.trees[e+1].within(n.x,n.y,r),o=[],a=0;a<i.length;a++){var u=this.trees[e+1].points[i[a]];u.parentId===t&&o.push(u.numPoints?s(u):this.points[u.id])}return o},getLeaves:function(t,e,n,r){n=n||10,r=r||0;var i=[];return this._appendLeaves(i,t,e,n,r,0),i},getTile:function(t,e,n){var r=this.trees[this._limitZoom(t)],i=Math.pow(2,t),o=this.options.extent,a=this.options.radius,s=a/o,u=(n-s)/i,l=(n+1+s)/i,c={features:[]};return this._addTileFeatures(r.range((e-s)/i,u,(e+1+s)/i,l),r.points,e,n,i,c),0===e&&this._addTileFeatures(r.range(1-s/i,u,1,l),r.points,i,n,i,c),e===i-1&&this._addTileFeatures(r.range(0,u,s/i,l),r.points,-1,n,i,c),c.features.length?c:null},getClusterExpansionZoom:function(t,e){for(;e<this.options.maxZoom;){var n=this.getChildren(t,e);if(e++,1!==n.length)break;t=n[0].properties.cluster_id}return e},_appendLeaves:function(t,e,n,r,i,o){for(var a=this.getChildren(e,n),s=0;s<a.length;s++){var u=a[s].properties;if(u.cluster?o+u.point_count<=i?o+=u.point_count:o=this._appendLeaves(t,u.cluster_id,n+1,r,i,o):o<i?o++:t.push(a[s]),t.length===r)break}return o},_addTileFeatures:function(t,e,n,r,i,o){for(var a=0;a<t.length;a++){var s=e[t[a]];o.features.push({type:1,geometry:[[Math.round(this.options.extent*(s.x*i-n)),Math.round(this.options.extent*(s.y*i-r))]],tags:s.numPoints?u(s):this.points[s.id].properties})}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var n=[],r=this.options.radius/(this.options.extent*Math.pow(2,e)),i=0;i<t.length;i++){var a=t[i];if(!(a.zoom<=e)){a.zoom=e;var s=this.trees[e+1],u=s.within(a.x,a.y,r),l=a.numPoints||1,c=a.x*l,p=a.y*l,f=null;this.options.reduce&&(f=this.options.initial(),this._accumulate(f,a));for(var h=0;h<u.length;h++){var y=s.points[u[h]];if(e<y.zoom){var d=y.numPoints||1;y.zoom=e,c+=y.x*d,p+=y.y*d,l+=d,y.parentId=i,this.options.reduce&&this._accumulate(f,y)}}1===l?n.push(a):(a.parentId=i,n.push(o(c/l,p/l,l,i,f)))}}return n},_accumulate:function(t,e){var n=e.numPoints?e.properties:this.options.map(this.points[e.id].properties);this.options.reduce(t,n)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o){return new i(t,e,n,r,o)}function i(t,e,n,r,i){e=e||o,n=n||a,i=i||Array,this.nodeSize=r||64,this.points=t,this.ids=new i(t.length),this.coords=new i(2*t.length);for(var u=0;u<t.length;u++)this.ids[u]=u,this.coords[2*u]=e(t[u]),this.coords[2*u+1]=n(t[u]);s(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function o(t){return t[0]}function a(t){return t[1]}var s=n(111),u=n(112),l=n(113);t.exports=r,i.prototype={range:function(t,e,n,r){return u(this.ids,this.coords,t,e,n,r,this.nodeSize)},within:function(t,e,n){return l(this.ids,this.coords,t,e,n,this.nodeSize)}}},function(t,e,n){\\\"use strict\\\";function r(t,e,n,o,a,s){if(!(a-o<=n)){var u=Math.floor((o+a)/2);i(t,e,u,o,a,s%2),r(t,e,n,o,u-1,s+1),r(t,e,n,u+1,a,s+1)}}function i(t,e,n,r,a,s){for(;a>r;){if(a-r>600){var u=a-r+1,l=n-r+1,c=Math.log(u),p=.5*Math.exp(2*c/3),f=.5*Math.sqrt(c*p*(u-p)/u)*(l-u/2<0?-1:1);i(t,e,n,Math.max(r,Math.floor(n-l*p/u+f)),Math.min(a,Math.floor(n+(u-l)*p/u+f)),s)}var h=e[2*n+s],y=r,d=a;for(o(t,e,r,n),e[2*a+s]>h&&o(t,e,r,a);y<d;){for(o(t,e,y,d),y++,d--;e[2*y+s]<h;)y++;for(;e[2*d+s]>h;)d--}e[2*r+s]===h?o(t,e,r,d):(d++,o(t,e,d,a)),d<=n&&(r=d+1),n<=d&&(a=d-1)}}function o(t,e,n,r){a(t,n,r),a(e,2*n,2*r),a(e,2*n+1,2*r+1)}function a(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,i,o,a){for(var s,u,l=[0,t.length-1,0],c=[];l.length;){var p=l.pop(),f=l.pop(),h=l.pop();if(f-h<=a)for(var y=h;y<=f;y++)s=e[2*y],u=e[2*y+1],s>=n&&s<=i&&u>=r&&u<=o&&c.push(t[y]);else{var d=Math.floor((h+f)/2);s=e[2*d],u=e[2*d+1],s>=n&&s<=i&&u>=r&&u<=o&&c.push(t[d]);var m=(p+1)%2;(0===p?n<=s:r<=u)&&(l.push(h),l.push(d-1),l.push(m)),(0===p?i>=s:o>=u)&&(l.push(d+1),l.push(f),l.push(m))}}return c}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a){for(var s=[0,t.length-1,0],u=[],l=o*o;s.length;){var c=s.pop(),p=s.pop(),f=s.pop();if(p-f<=a)for(var h=f;h<=p;h++)i(e[2*h],e[2*h+1],n,r)<=l&&u.push(t[h]);else{var y=Math.floor((f+p)/2),d=e[2*y],m=e[2*y+1];i(d,m,n,r)<=l&&u.push(t[y]);var v=(c+1)%2;(0===c?n-o<=d:r-o<=m)&&(s.push(f),s.push(y-1),s.push(v)),(0===c?n+o>=d:r+o>=m)&&(s.push(y+1),s.push(p),s.push(v))}}return u}function i(t,e,n,r){var i=t-n,o=e-r;return i*i+o*o}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){return new i(t,e)}function i(t,e){e=this.options=u(Object.create(this.options),e);var n=e.debug;n&&console.time(\\\"preprocess data\\\");var r=1<<e.maxZoom,i=c(t,e.tolerance/(r*e.extent));this.tiles={},this.tileCoords=[],n&&(console.timeEnd(\\\"preprocess data\\\"),console.log(\\\"index: maxZoom: %d, maxPoints: %d\\\",e.indexMaxZoom,e.indexMaxPoints),console.time(\\\"generate tiles\\\"),this.stats={},this.total=0),i=h(i,e.buffer/e.extent,a),i.length&&this.splitTile(i,0,0,0),n&&(i.length&&console.log(\\\"features: %d, points: %d\\\",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd(\\\"generate tiles\\\"),console.log(\\\"tiles generated:\\\",this.total,JSON.stringify(this.stats)))}function o(t,e,n){return 32*((1<<t)*n+e)+t}function a(t,e,n){return[n,(n-t[0])*(e[1]-t[1])/(e[0]-t[0])+t[1],1]}function s(t,e,n){return[(n-t[1])*(e[0]-t[0])/(e[1]-t[1])+t[0],n,1]}function u(t,e){for(var n in e)t[n]=e[n];return t}function l(t,e,n){var r=t.source;if(1!==r.length)return!1;var i=r[0];if(3!==i.type||i.geometry.length>1)return!1;var o=i.geometry[0].length;if(5!==o)return!1;for(var a=0;a<o;a++){var s=p.point(i.geometry[0][a],e,t.z2,t.x,t.y);if(s[0]!==-n&&s[0]!==e+n||s[1]!==-n&&s[1]!==e+n)return!1}return!0}t.exports=r;var c=n(115),p=n(117),f=n(46),h=n(118),y=n(119);i.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},i.prototype.splitTile=function(t,e,n,r,i,u,c){for(var p=[t,e,n,r],h=this.options,d=h.debug,m=null;p.length;){r=p.pop(),n=p.pop(),e=p.pop(),t=p.pop();var v=1<<e,x=o(e,n,r),g=this.tiles[x],b=e===h.maxZoom?0:h.tolerance/(v*h.extent);if(!g&&(d>1&&console.time(\\\"creation\\\"),g=this.tiles[x]=y(t,v,n,r,b,e===h.maxZoom),this.tileCoords.push({z:e,x:n,y:r}),d)){d>1&&(console.log(\\\"tile z%d-%d-%d (features: %d, points: %d, simplified: %d)\\\",e,n,r,g.numFeatures,g.numPoints,g.numSimplified),console.timeEnd(\\\"creation\\\"));var w=\\\"z\\\"+e;this.stats[w]=(this.stats[w]||0)+1,this.total++}if(g.source=t,i){if(e===h.maxZoom||e===i)continue;var S=1<<i-e;if(n!==Math.floor(u/S)||r!==Math.floor(c/S))continue}else if(e===h.indexMaxZoom||g.numPoints<=h.indexMaxPoints)continue;if(h.solidChildren||!l(g,h.extent,h.buffer)){g.source=null,d>1&&console.time(\\\"clipping\\\");var _,A,M,P,z,I,T=.5*h.buffer/h.extent,V=.5-T,k=.5+T,E=1+T;_=A=M=P=null,z=f(t,v,n-T,n+k,0,a,g.min[0],g.max[0]),I=f(t,v,n+V,n+E,0,a,g.min[0],g.max[0]),z&&(_=f(z,v,r-T,r+k,1,s,g.min[1],g.max[1]),A=f(z,v,r+V,r+E,1,s,g.min[1],g.max[1])),I&&(M=f(I,v,r-T,r+k,1,s,g.min[1],g.max[1]),P=f(I,v,r+V,r+E,1,s,g.min[1],g.max[1])),d>1&&console.timeEnd(\\\"clipping\\\"),t.length&&(p.push(_||[],e+1,2*n,2*r),p.push(A||[],e+1,2*n,2*r+1),p.push(M||[],e+1,2*n+1,2*r),p.push(P||[],e+1,2*n+1,2*r+1))}else i&&(m=e)}return m},i.prototype.getTile=function(t,e,n){var r=this.options,i=r.extent,a=r.debug,s=1<<t;e=(e%s+s)%s;var u=o(t,e,n);if(this.tiles[u])return p.tile(this.tiles[u],i);a>1&&console.log(\\\"drilling down to z%d-%d-%d\\\",t,e,n);for(var c,f=t,h=e,y=n;!c&&f>0;)f--,h=Math.floor(h/2),y=Math.floor(y/2),c=this.tiles[o(f,h,y)];if(!c||!c.source)return null;if(a>1&&console.log(\\\"found parent tile z%d-%d-%d\\\",f,h,y),l(c,i,r.buffer))return p.tile(c,i);a>1&&console.time(\\\"drilling down\\\");var d=this.splitTile(c.source,f,h,y,t,e,n);if(a>1&&console.timeEnd(\\\"drilling down\\\"),null!==d){var m=1<<t-d;u=o(d,Math.floor(e/m),Math.floor(n/m))}return this.tiles[u]?p.tile(this.tiles[u],i):null}},function(t,e,n){\\\"use strict\\\";function r(t,e){var n=[];if(\\\"FeatureCollection\\\"===t.type)for(var r=0;r<t.features.length;r++)i(n,t.features[r],e);else\\\"Feature\\\"===t.type?i(n,t,e):i(n,{geometry:t},e);return n}function i(t,e,n){if(null!==e.geometry){var r,s,u,c,p=e.geometry,f=p.type,h=p.coordinates,y=e.properties,d=e.id;if(\\\"Point\\\"===f)t.push(l(y,1,[a(h)],d));else if(\\\"MultiPoint\\\"===f)t.push(l(y,1,o(h),d));else if(\\\"LineString\\\"===f)t.push(l(y,2,[o(h,n)],d));else if(\\\"MultiLineString\\\"===f||\\\"Polygon\\\"===f){for(u=[],r=0;r<h.length;r++)c=o(h[r],n),\\\"Polygon\\\"===f&&(c.outer=0===r),u.push(c);t.push(l(y,\\\"Polygon\\\"===f?3:2,u,d))}else if(\\\"MultiPolygon\\\"===f){for(u=[],r=0;r<h.length;r++)for(s=0;s<h[r].length;s++)c=o(h[r][s],n),c.outer=0===s,u.push(c);t.push(l(y,3,u,d))}else{if(\\\"GeometryCollection\\\"!==f)throw new Error(\\\"Input data is not a valid GeoJSON object.\\\");for(r=0;r<p.geometries.length;r++)i(t,{geometry:p.geometries[r],properties:y},n)}}}function o(t,e){for(var n=[],r=0;r<t.length;r++)n.push(a(t[r]));return e&&(u(n,e),s(n)),n}function a(t){var e=Math.sin(t[1]*Math.PI/180),n=t[0]/360+.5,r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r=r<0?0:r>1?1:r,[n,r,0]}function s(t){for(var e,n,r=0,i=0,o=0;o<t.length-1;o++)e=n||t[o],n=t[o+1],r+=e[0]*n[1]-n[0]*e[1],i+=Math.abs(n[0]-e[0])+Math.abs(n[1]-e[1]);t.area=Math.abs(r/2),t.dist=i}t.exports=r;var u=n(116),l=n(16)},function(t,e,n){\\\"use strict\\\";function r(t,e){var n,r,o,a,s=e*e,u=t.length,l=0,c=u-1,p=[];for(t[l][2]=1,t[c][2]=1;c;){for(r=0,n=l+1;n<c;n++)(o=i(t[n],t[l],t[c]))>r&&(a=n,r=o);r>s?(t[a][2]=r,p.push(l),p.push(a),l=a):(c=p.pop(),l=p.pop())}}function i(t,e,n){var r=e[0],i=e[1],o=n[0],a=n[1],s=t[0],u=t[1],l=o-r,c=a-i;if(0!==l||0!==c){var p=((s-r)*l+(u-i)*c)/(l*l+c*c);p>1?(r=o,i=a):p>0&&(r+=l*p,i+=c*p)}return l=s-r,c=u-i,l*l+c*c}t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e){if(t.transformed)return t;var n,r,o,a=t.z2,s=t.x,u=t.y;for(n=0;n<t.features.length;n++){var l=t.features[n],c=l.geometry;if(1===l.type)for(r=0;r<c.length;r++)c[r]=i(c[r],e,a,s,u);else for(r=0;r<c.length;r++){var p=c[r];for(o=0;o<p.length;o++)p[o]=i(p[o],e,a,s,u)}}return t.transformed=!0,t}function i(t,e,n,r,i){return[Math.round(e*(t[0]*n-r)),Math.round(e*(t[1]*n-i))]}e.tile=r,e.point=i},function(t,e,n){\\\"use strict\\\";function r(t,e,n){var r=t,o=a(t,1,-1-e,e,0,n,-1,2),s=a(t,1,1-e,2+e,0,n,-1,2);return(o||s)&&(r=a(t,1,-e,1+e,0,n,-1,2)||[],o&&(r=i(o,1).concat(r)),s&&(r=r.concat(i(s,-1)))),r}function i(t,e){for(var n=[],r=0;r<t.length;r++){var i,a=t[r],u=a.type;if(1===u)i=o(a.geometry,e);else{i=[];for(var l=0;l<a.geometry.length;l++)i.push(o(a.geometry[l],e))}n.push(s(a.tags,u,i,a.id))}return n}function o(t,e){var n=[];n.area=t.area,n.dist=t.dist;for(var r=0;r<t.length;r++)n.push([t[r][0]+e,t[r][1],t[r][2]]);return n}var a=n(46),s=n(16);t.exports=r},function(t,e,n){\\\"use strict\\\";function r(t,e,n,r,o,a){for(var s={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:n,y:r,z2:e,transformed:!1,min:[2,1],max:[-1,0]},u=0;u<t.length;u++){s.numFeatures++,i(s,t[u],o,a);var l=t[u].min,c=t[u].max;l[0]<s.min[0]&&(s.min[0]=l[0]),l[1]<s.min[1]&&(s.min[1]=l[1]),c[0]>s.max[0]&&(s.max[0]=c[0]),c[1]>s.max[1]&&(s.max[1]=c[1])}return s}function i(t,e,n,r){var i,a,s,u,l=e.geometry,c=e.type,p=[],f=n*n;if(1===c)for(i=0;i<l.length;i++)p.push(l[i]),t.numPoints++,t.numSimplified++;else for(i=0;i<l.length;i++)if(s=l[i],r||!(2===c&&s.dist<n||3===c&&s.area<f)){var h=[];for(a=0;a<s.length;a++)u=s[a],(r||u[2]>f)&&(h.push(u),t.numSimplified++),t.numPoints++;3===c&&o(h,s.outer),p.push(h)}else t.numPoints+=s.length;if(p.length){var y={geometry:p,type:c,tags:e.tags||null};null!==e.id&&(y.id=e.id),t.features.push(y)}}function o(t,e){a(t)<0===e&&t.reverse()}function a(t){for(var e,n,r=0,i=0,o=t.length,a=o-1;i<o;a=i++)e=t[i],n=t[a],r+=(n[0]-e[0])*(e[1]+n[1]);return r}t.exports=r}]);\\n//# sourceMappingURL=07cc73f5e73e7d2ddb99.worker.js.07cc73f5e73e7d2ddb99.map\", __webpack_public_path__ + \"07cc73f5e73e7d2ddb99.worker.js\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/source/worker.js\n// module id = 1398\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\nvar FrameHistory = require('./frame_history');\nvar SourceCache = require('../source/source_cache');\nvar EXTENT = require('../data/bucket').EXTENT;\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\nvar util = require('../util/util');\nvar StructArrayType = require('../util/struct_array');\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('./vertex_array_object');\nvar RasterBoundsArray = require('./draw_raster').RasterBoundsArray;\nvar createUniformPragmas = require('./create_uniform_pragmas');\n\nmodule.exports = Painter;\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nfunction Painter(gl, transform) {\n    this.gl = gl;\n    this.transform = transform;\n\n    this.reusableTextures = {};\n    this.preFbos = {};\n\n    this.frameHistory = new FrameHistory();\n\n    this.setup();\n\n    // Within each layer there are multiple distinct z-planes that can be drawn to.\n    // This is implemented using the WebGL depth buffer.\n    this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;\n    this.depthEpsilon = 1 / Math.pow(2, 16);\n\n    this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n}\n\nutil.extend(Painter.prototype, require('./painter/use_program'));\n\n/*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\nPainter.prototype.resize = function(width, height) {\n    var gl = this.gl;\n\n    this.width = width * browser.devicePixelRatio;\n    this.height = height * browser.devicePixelRatio;\n    gl.viewport(0, 0, this.width, this.height);\n\n};\n\nPainter.prototype.setup = function() {\n    var gl = this.gl;\n\n    gl.verbose = true;\n\n    // We are blending the new pixels *behind* the existing pixels. That way we can\n    // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n    gl.enable(gl.STENCIL_TEST);\n\n    gl.enable(gl.DEPTH_TEST);\n    gl.depthFunc(gl.LEQUAL);\n\n    this._depthMask = false;\n    gl.depthMask(false);\n\n    var PosArray = this.PosArray = new StructArrayType({\n        members: [{ name: 'a_pos', type: 'Int16', components: 2 }]\n    });\n\n    var tileExtentArray = new PosArray();\n    tileExtentArray.emplaceBack(0, 0);\n    tileExtentArray.emplaceBack(EXTENT, 0);\n    tileExtentArray.emplaceBack(0, EXTENT);\n    tileExtentArray.emplaceBack(EXTENT, EXTENT);\n    this.tileExtentBuffer = new Buffer(tileExtentArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.tileExtentVAO = new VertexArrayObject();\n    this.tileExtentPatternVAO = new VertexArrayObject();\n\n    var debugArray = new PosArray();\n    debugArray.emplaceBack(0, 0);\n    debugArray.emplaceBack(EXTENT, 0);\n    debugArray.emplaceBack(EXTENT, EXTENT);\n    debugArray.emplaceBack(0, EXTENT);\n    debugArray.emplaceBack(0, 0);\n    this.debugBuffer = new Buffer(debugArray.serialize(), PosArray.serialize(), Buffer.BufferType.VERTEX);\n    this.debugVAO = new VertexArrayObject();\n\n    var rasterBoundsArray = new RasterBoundsArray();\n    rasterBoundsArray.emplaceBack(0, 0, 0, 0);\n    rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0);\n    rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767);\n    rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767);\n    this.rasterBoundsBuffer = new Buffer(rasterBoundsArray.serialize(), RasterBoundsArray.serialize(), Buffer.BufferType.VERTEX);\n    this.rasterBoundsVAO = new VertexArrayObject();\n};\n\n/*\n * Reset the color buffers of the drawing canvas.\n */\nPainter.prototype.clearColor = function() {\n    var gl = this.gl;\n    gl.clearColor(0, 0, 0, 0);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n};\n\n/*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\nPainter.prototype.clearStencil = function() {\n    var gl = this.gl;\n    gl.clearStencil(0x0);\n    gl.stencilMask(0xFF);\n    gl.clear(gl.STENCIL_BUFFER_BIT);\n};\n\nPainter.prototype.clearDepth = function() {\n    var gl = this.gl;\n    gl.clearDepth(1);\n    this.depthMask(true);\n    gl.clear(gl.DEPTH_BUFFER_BIT);\n};\n\nPainter.prototype._renderTileClippingMasks = function(coords) {\n    var gl = this.gl;\n    gl.colorMask(false, false, false, false);\n    this.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n    gl.enable(gl.STENCIL_TEST);\n\n    // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills.\n    gl.stencilMask(0xF8);\n    // Tests will always pass, and ref value will be written to stencil buffer.\n    gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n\n    var idNext = 1;\n    this._tileClippingMaskIDs = {};\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var id = this._tileClippingMaskIDs[coord.id] = (idNext++) << 3;\n\n        gl.stencilFunc(gl.ALWAYS, id, 0xF8);\n\n        var pragmas = createUniformPragmas([\n            {name: 'u_color', components: 4},\n            {name: 'u_opacity', components: 1}\n        ]);\n        var program = this.useProgram('fill', [], pragmas, pragmas);\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        // Draw the clipping mask\n        this.tileExtentVAO.bind(gl, program, this.tileExtentBuffer);\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.colorMask(true, true, true, true);\n    this.depthMask(true);\n    gl.enable(gl.DEPTH_TEST);\n};\n\nPainter.prototype.enableTileClippingMask = function(coord) {\n    var gl = this.gl;\n    gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8);\n};\n\n// Overridden by headless tests.\nPainter.prototype.prepareBuffers = function() {};\nPainter.prototype.bindDefaultFramebuffer = function() {\n    var gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\nvar draw = {\n    symbol: require('./draw_symbol'),\n    circle: require('./draw_circle'),\n    line: require('./draw_line'),\n    fill: require('./draw_fill'),\n    raster: require('./draw_raster'),\n    background: require('./draw_background'),\n    debug: require('./draw_debug')\n};\n\nPainter.prototype.render = function(style, options) {\n    this.style = style;\n    this.options = options;\n\n    this.lineAtlas = style.lineAtlas;\n\n    this.spriteAtlas = style.spriteAtlas;\n    this.spriteAtlas.setSprite(style.sprite);\n\n    this.glyphSource = style.glyphSource;\n\n    this.frameHistory.record(this.transform.zoom);\n\n    this.prepareBuffers();\n    this.clearColor();\n    this.clearDepth();\n\n    this.showOverdrawInspector(options.showOverdrawInspector);\n\n    this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon;\n\n    this.renderPass({isOpaquePass: true});\n    this.renderPass({isOpaquePass: false});\n};\n\nPainter.prototype.renderPass = function(options) {\n    var groups = this.style._groups;\n    var isOpaquePass = options.isOpaquePass;\n    this.currentLayer = isOpaquePass ? this.style._order.length : -1;\n\n    for (var i = 0; i < groups.length; i++) {\n        var group = groups[isOpaquePass ? groups.length - 1 - i : i];\n        var source = this.style.sources[group.source];\n\n        var j;\n        var coords = [];\n        if (source) {\n            coords = source.getVisibleCoordinates();\n            for (j = 0; j < coords.length; j++) {\n                coords[j].posMatrix = this.transform.calculatePosMatrix(coords[j], source.maxzoom);\n            }\n            this.clearStencil();\n            if (source.prepare) source.prepare();\n            if (source.isTileClipped) {\n                this._renderTileClippingMasks(coords);\n            }\n        }\n\n        if (isOpaquePass) {\n            if (!this._showOverdrawInspector) {\n                this.gl.disable(this.gl.BLEND);\n            }\n            this.isOpaquePass = true;\n        } else {\n            this.gl.enable(this.gl.BLEND);\n            this.isOpaquePass = false;\n            coords.reverse();\n        }\n\n        for (j = 0; j < group.length; j++) {\n            var layer = group[isOpaquePass ? group.length - 1 - j : j];\n            this.currentLayer += isOpaquePass ? -1 : 1;\n            this.renderLayer(this, source, layer, coords);\n        }\n\n        if (source) {\n            draw.debug(this, source, coords);\n        }\n    }\n};\n\nPainter.prototype.depthMask = function(mask) {\n    if (mask !== this._depthMask) {\n        this._depthMask = mask;\n        this.gl.depthMask(mask);\n    }\n};\n\nPainter.prototype.renderLayer = function(painter, source, layer, coords) {\n    if (layer.isHidden(this.transform.zoom)) return;\n    if (layer.type !== 'background' && !coords.length) return;\n    this.id = layer.id;\n    draw[layer.type](painter, source, layer, coords);\n};\n\nPainter.prototype.setDepthSublayer = function(n) {\n    var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n    var nearDepth = farDepth - 1 + this.depthRange;\n    this.gl.depthRange(nearDepth, farDepth);\n};\n\nPainter.prototype.translatePosMatrix = function(matrix, tile, translate, anchor) {\n    if (!translate[0] && !translate[1]) return matrix;\n\n    if (anchor === 'viewport') {\n        var sinA = Math.sin(-this.transform.angle);\n        var cosA = Math.cos(-this.transform.angle);\n        translate = [\n            translate[0] * cosA - translate[1] * sinA,\n            translate[0] * sinA + translate[1] * cosA\n        ];\n    }\n\n    var translation = [\n        pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n        pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n        0\n    ];\n\n    var translatedMatrix = new Float32Array(16);\n    mat4.translate(translatedMatrix, matrix, translation);\n    return translatedMatrix;\n};\n\nPainter.prototype.saveTexture = function(texture) {\n    var textures = this.reusableTextures[texture.size];\n    if (!textures) {\n        this.reusableTextures[texture.size] = [texture];\n    } else {\n        textures.push(texture);\n    }\n};\n\n\nPainter.prototype.getTexture = function(size) {\n    var textures = this.reusableTextures[size];\n    return textures && textures.length > 0 ? textures.pop() : null;\n};\n\nPainter.prototype.lineWidth = function(width) {\n    this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1]));\n};\n\nPainter.prototype.showOverdrawInspector = function(enabled) {\n    if (!enabled && !this._showOverdrawInspector) return;\n    this._showOverdrawInspector = enabled;\n\n    var gl = this.gl;\n    if (enabled) {\n        gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE);\n        var numOverdrawSteps = 8;\n        var a = 1 / numOverdrawSteps;\n        gl.blendColor(a, a, a, 0);\n        gl.clearColor(0, 0, 0, 1);\n        gl.clear(gl.COLOR_BUFFER_BIT);\n    } else {\n        gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/painter.js\n// module id = 1399\n// module chunks = 0 1","'use strict';\n\nmodule.exports = FrameHistory;\n\nfunction FrameHistory() {\n    this.changeTimes = new Float64Array(256);\n    this.changeOpacities = new Uint8Array(256);\n    this.opacities = new Uint8ClampedArray(256);\n    this.array = new Uint8Array(this.opacities.buffer);\n\n    this.fadeDuration = 300;\n    this.previousZoom = 0;\n    this.firstFrame = true;\n}\n\nFrameHistory.prototype.record = function(zoom) {\n    var now = Date.now();\n\n    if (this.firstFrame) {\n        now = 0;\n        this.firstFrame = false;\n    }\n\n    zoom = Math.floor(zoom * 10);\n\n    var z;\n    if (zoom < this.previousZoom) {\n        for (z = zoom + 1; z <= this.previousZoom; z++) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    } else {\n        for (z = zoom; z > this.previousZoom; z--) {\n            this.changeTimes[z] = now;\n            this.changeOpacities[z] = this.opacities[z];\n        }\n    }\n\n    for (z = 0; z < 256; z++) {\n        var timeSince = now - this.changeTimes[z];\n        var opacityChange = timeSince / this.fadeDuration * 255;\n        if (z <= zoom) {\n            this.opacities[z] = this.changeOpacities[z] + opacityChange;\n        } else {\n            this.opacities[z] = this.changeOpacities[z] - opacityChange;\n        }\n    }\n\n    this.changed = true;\n    this.previousZoom = zoom;\n};\n\nFrameHistory.prototype.bind = function(gl) {\n    if (!this.texture) {\n        this.texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, this.texture);\n        if (this.changed) {\n            gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n            this.changed = false;\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/frame_history.js\n// module id = 1400\n// module chunks = 0 1","'use strict';\n\nvar assert = require('assert');\nvar util = require('../../util/util');\nvar shaders = require('mapbox-gl-shaders');\n\nvar utilSource = shaders.util;\n\nmodule.exports._createProgram = function(name, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n    var program = gl.createProgram();\n    var definition = shaders[name];\n\n    var definesSource = '#define MAPBOX_GL_JS;\\n';\n    for (var j = 0; j < defines.length; j++) {\n        definesSource += '#define ' + defines[j] + ';\\n';\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, applyPragmas(definesSource + definition.fragmentSource, fragmentPragmas));\n    gl.compileShader(fragmentShader);\n    assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));\n    gl.attachShader(program, fragmentShader);\n\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, applyPragmas(definesSource + utilSource + definition.vertexSource, vertexPragmas));\n    gl.compileShader(vertexShader);\n    assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));\n    gl.attachShader(program, vertexShader);\n\n    gl.linkProgram(program);\n    assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program));\n\n    var attributes = {};\n    var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n    for (var i = 0; i < numAttributes; i++) {\n        var attribute = gl.getActiveAttrib(program, i);\n        attributes[attribute.name] = gl.getAttribLocation(program, attribute.name);\n    }\n\n    var uniforms = {};\n    var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n    for (var ui = 0; ui < numUniforms; ui++) {\n        var uniform = gl.getActiveUniform(program, ui);\n        uniforms[uniform.name] = gl.getUniformLocation(program, uniform.name);\n    }\n\n    return util.extend({\n        program: program,\n        definition: definition,\n        attributes: attributes,\n        numAttributes: numAttributes\n    }, attributes, uniforms);\n};\n\nmodule.exports._createProgramCached = function(name, defines, vertexPragmas, fragmentPragmas) {\n    this.cache = this.cache || {};\n\n    var key = JSON.stringify({\n        name: name,\n        defines: defines,\n        vertexPragmas: vertexPragmas,\n        fragmentPragmas: fragmentPragmas\n    });\n\n    if (!this.cache[key]) {\n        this.cache[key] = this._createProgram(name, defines, vertexPragmas, fragmentPragmas);\n    }\n    return this.cache[key];\n};\n\nmodule.exports.useProgram = function (nextProgramName, defines, vertexPragmas, fragmentPragmas) {\n    var gl = this.gl;\n\n    defines = defines || [];\n    if (this._showOverdrawInspector) {\n        defines = defines.concat('OVERDRAW_INSPECTOR');\n    }\n\n    var nextProgram = this._createProgramCached(nextProgramName, defines, vertexPragmas, fragmentPragmas);\n    var previousProgram = this.currentProgram;\n\n    if (previousProgram !== nextProgram) {\n        gl.useProgram(nextProgram.program);\n        this.currentProgram = nextProgram;\n    }\n\n    return nextProgram;\n};\n\nfunction applyPragmas(source, pragmas) {\n    return source.replace(/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g, function(match, operation, precision, type, name) {\n        return pragmas[operation][name].replace(/{type}/g, type).replace(/{precision}/g, precision);\n    });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/painter/use_program.js\n// module id = 1401\n// module chunks = 0 1","\nvar path = require('path');\n\n// readFileSync calls must be written out long-form for brfs.\nmodule.exports = {\n  debug: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp vec4 u_color;\\n\\nvoid main() {\\n    gl_FragColor = u_color;\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\\n}\\n\"\n  },\n  fill: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_FragColor = color * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n}\\n\"\n  },\n  circle: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize lowp float blur\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    float t = smoothstep(1.0 - max(blur, v_antialiasblur), 1.0, length(v_extrude));\\n    gl_FragColor = color * (1.0 - t) * opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform bool u_scale_with_map;\\nuniform vec2 u_extrude_scale;\\nuniform float u_devicepixelratio;\\n\\nattribute vec2 a_pos;\\n\\n#pragma mapbox: define lowp vec4 color\\n#pragma mapbox: define mediump float radius\\n#pragma mapbox: define lowp float blur\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_extrude;\\nvarying lowp float v_antialiasblur;\\n\\nvoid main(void) {\\n    #pragma mapbox: initialize lowp vec4 color\\n    #pragma mapbox: initialize mediump float radius\\n    #pragma mapbox: initialize lowp float blur\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    // unencode the extrusion vector that we snuck into the a_pos vector\\n    v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\\n\\n    vec2 extrude = v_extrude * radius * u_extrude_scale;\\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\\n    // in extrusion data\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\\n\\n    if (u_scale_with_map) {\\n        gl_Position.xy += extrude;\\n    } else {\\n        gl_Position.xy += extrude * gl_Position.w;\\n    }\\n\\n    // This is a minimum blur distance that serves as a faux-antialiasing for\\n    // the circle. since blur is a ratio of the circle's size and the intent is\\n    // to keep the blur at roughly 1px, the two are inversely related.\\n    v_antialiasblur = 1.0 / u_devicepixelratio / radius;\\n}\\n\"\n  },\n  line: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp float u_opacity;\\nuniform float u_blur;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvarying vec2 v_linewidth;\\nvarying vec2 v_normal;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    gl_FragColor = color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\nuniform mediump float u_blur;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_blur;\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_fade;\\nuniform float u_opacity;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\\n    float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\\n    float y_a = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_a.y);\\n    float y_b = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_b.y);\\n    vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\\n    vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\\n\\n    vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\\n\\n    alpha *= u_opacity;\\n\\n    gl_FragColor = color * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform mediump float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying float v_linesofar;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n    v_linesofar = a_linesofar;\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  linesdfpattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform lowp float u_opacity;\\n\\nuniform float u_blur;\\nuniform sampler2D u_image;\\nuniform float u_sdfgamma;\\nuniform float u_mix;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    // Calculate the distance of the pixel from the line in pixels.\\n    float dist = length(v_normal) * v_linewidth.s;\\n\\n    // Calculate the antialiasing fade factor. This is either when fading in\\n    // the line in case of an offset line (v_linewidth.t) or when fading out\\n    // (v_linewidth.s)\\n    float blur = u_blur * v_gamma_scale;\\n    float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\\n\\n    float sdfdist_a = texture2D(u_image, v_tex_a).a;\\n    float sdfdist_b = texture2D(u_image, v_tex_b).a;\\n    float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\\n    alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\\n\\n    gl_FragColor = color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n// floor(127 / 2) == 63.0\\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\\n// there are also \\\"special\\\" normals that have a bigger length (of up to 126 in\\n// this case).\\n// #define scale 63.0\\n#define scale 0.015873016\\n\\n// We scale the distance before adding it to the buffers so that we can store\\n// long distances for long segments. Use this value to unscale the distance.\\n#define LINE_DISTANCE_SCALE 2.0\\n\\nattribute vec2 a_pos;\\nattribute vec4 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform mediump float u_ratio;\\nuniform mediump float u_linewidth;\\nuniform mediump float u_gapwidth;\\nuniform mediump float u_antialiasing;\\nuniform vec2 u_patternscale_a;\\nuniform float u_tex_y_a;\\nuniform vec2 u_patternscale_b;\\nuniform float u_tex_y_b;\\nuniform float u_extra;\\nuniform mat2 u_antialiasingmatrix;\\nuniform mediump float u_offset;\\n\\nvarying vec2 v_normal;\\nvarying vec2 v_linewidth;\\nvarying vec2 v_tex_a;\\nvarying vec2 v_tex_b;\\nvarying float v_gamma_scale;\\n\\n#pragma mapbox: define lowp vec4 color\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 color\\n\\n    vec2 a_extrude = a_data.xy - 128.0;\\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\\n\\n    // We store the texture normals in the most insignificant bit\\n    // transform y so that 0 => -1 and 1 => 1\\n    // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\\n    // y is 1 if the normal points up, and -1 if it points down\\n    mediump vec2 normal = mod(a_pos, 2.0);\\n    normal.y = sign(normal.y - 0.5);\\n    v_normal = normal;\\n\\n    float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\\n    float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\\n\\n    // Scale the extrusion vector down to a normal and then up by the line width\\n    // of this vertex.\\n    mediump vec2 dist = outset * a_extrude * scale;\\n\\n    // Calculate the offset when drawing a line that is to the side of the actual line.\\n    // We do this by creating a vector that points towards the extrude, but rotate\\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\\n    // extrude vector points in another direction.\\n    mediump float u = 0.5 * a_direction;\\n    mediump float t = 1.0 - abs(u);\\n    mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n    // Remove the texture normal bit of the position before scaling it with the\\n    // model/view matrix.\\n    gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n    v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\\n    v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\\n\\n    // position of y on the screen\\n    float y = gl_Position.y / gl_Position.w;\\n\\n    // how much features are squished in the y direction by the tilt\\n    float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\\n\\n    // how much features are squished in all directions by the perspectiveness\\n    float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n    v_linewidth = vec2(outset, inset);\\n    v_gamma_scale = perspective_scale * squish_scale;\\n}\\n\"\n  },\n  outline: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\n\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    gl_FragColor = outline_color * (alpha * opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos;\\n\\n#pragma mapbox: define lowp vec4 outline_color\\n#pragma mapbox: define lowp float opacity\\n\\nvoid main() {\\n    #pragma mapbox: initialize lowp vec4 outline_color\\n    #pragma mapbox: initialize lowp float opacity\\n\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  outlinepattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    // find distance to outline for alpha interpolation\\n\\n    float dist = length(v_pos - gl_FragCoord.xy);\\n    float alpha = smoothstep(1.0, 0.0, dist);\\n    \\n\\n    gl_FragColor = mix(color1, color2, u_mix) * alpha * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n\\nattribute vec2 a_pos;\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_world;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\nvarying vec2 v_pos;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    //\\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n\\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\\n}\\n\"\n  },\n  pattern: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity;\\nuniform vec2 u_pattern_tl_a;\\nuniform vec2 u_pattern_br_a;\\nuniform vec2 u_pattern_tl_b;\\nuniform vec2 u_pattern_br_b;\\nuniform float u_mix;\\n\\nuniform sampler2D u_image;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n\\n    vec2 imagecoord = mod(v_pos_a, 1.0);\\n    vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\\n    vec4 color1 = texture2D(u_image, pos);\\n\\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\\n    vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\\n    vec4 color2 = texture2D(u_image, pos2);\\n\\n    gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_pattern_size_a;\\nuniform vec2 u_pattern_size_b;\\nuniform vec2 u_pixel_coord_upper;\\nuniform vec2 u_pixel_coord_lower;\\nuniform float u_scale_a;\\nuniform float u_scale_b;\\nuniform float u_tile_units_to_pixels;\\n\\nattribute vec2 a_pos;\\n\\nvarying vec2 v_pos_a;\\nvarying vec2 v_pos_b;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    vec2 scaled_size_a = u_scale_a * u_pattern_size_a;\\n    vec2 scaled_size_b = u_scale_b * u_pattern_size_b;\\n\\n    // the correct offset needs to be calculated.\\n    //\\n    // The offset depends on how many pixels are between the world origin and\\n    // the edge of the tile:\\n    // vec2 offset = mod(pixel_coord, size)\\n    //\\n    // At high zoom levels there are a ton of pixels between the world origin\\n    // and the edge of the tile. The glsl spec only guarantees 16 bits of\\n    // precision for highp floats. We need more than that.\\n    //\\n    // The pixel_coord is passed in as two 16 bit values:\\n    // pixel_coord_upper = floor(pixel_coord / 2^16)\\n    // pixel_coord_lower = mod(pixel_coord, 2^16)\\n    //\\n    // The offset is calculated in a series of steps that should preserve this precision:\\n    vec2 offset_a = mod(mod(mod(u_pixel_coord_upper, scaled_size_a) * 256.0, scaled_size_a) * 256.0 + u_pixel_coord_lower, scaled_size_a);\\n    vec2 offset_b = mod(mod(mod(u_pixel_coord_upper, scaled_size_b) * 256.0, scaled_size_b) * 256.0 + u_pixel_coord_lower, scaled_size_b);\\n\\n    v_pos_a = (u_tile_units_to_pixels * a_pos + offset_a) / scaled_size_a;\\n    v_pos_b = (u_tile_units_to_pixels * a_pos + offset_b) / scaled_size_b;\\n}\\n\"\n  },\n  raster: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_opacity0;\\nuniform float u_opacity1;\\nuniform sampler2D u_image0;\\nuniform sampler2D u_image1;\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n\\nuniform float u_brightness_low;\\nuniform float u_brightness_high;\\n\\nuniform float u_saturation_factor;\\nuniform float u_contrast_factor;\\nuniform vec3 u_spin_weights;\\n\\nvoid main() {\\n\\n    // read and cross-fade colors from the main and parent tiles\\n    vec4 color0 = texture2D(u_image0, v_pos0);\\n    vec4 color1 = texture2D(u_image1, v_pos1);\\n    vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\\n    vec3 rgb = color.rgb;\\n\\n    // spin\\n    rgb = vec3(\\n        dot(rgb, u_spin_weights.xyz),\\n        dot(rgb, u_spin_weights.zxy),\\n        dot(rgb, u_spin_weights.yzx));\\n\\n    // saturation\\n    float average = (color.r + color.g + color.b) / 3.0;\\n    rgb += (average - rgb) * u_saturation_factor;\\n\\n    // contrast\\n    rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\\n\\n    // brightness\\n    vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\\n    vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\\n\\n    gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform mat4 u_matrix;\\nuniform vec2 u_tl_parent;\\nuniform float u_scale_parent;\\nuniform float u_buffer_scale;\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_texture_pos;\\n\\nvarying vec2 v_pos0;\\nvarying vec2 v_pos1;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\\n    v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\\n    v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\\n}\\n\"\n  },\n  icon: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp float u_opacity;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\\n    gl_FragColor = texture2D(u_texture, v_tex) * alpha;\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec2 a_texture_pos;\\nattribute vec4 a_data;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_rotate_with_map;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\n\\nvoid main() {\\n    vec2 a_tex = a_texture_pos.xy;\\n    mediump float a_labelminzoom = a_data[0];\\n    mediump vec2 a_zoom = a_data.pq;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n    if (u_rotate_with_map) {\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    } else {\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  sdf: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform sampler2D u_texture;\\nuniform sampler2D u_fadetexture;\\nuniform lowp vec4 u_color;\\nuniform lowp float u_opacity;\\nuniform lowp float u_buffer;\\nuniform lowp float u_gamma;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    lowp float dist = texture2D(u_texture, v_tex).a;\\n    lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\\n    lowp float gamma = u_gamma * v_gamma_scale;\\n    lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\\n\\n    gl_FragColor = u_color * (alpha * u_opacity);\\n\\n#ifdef OVERDRAW_INSPECTOR\\n    gl_FragColor = vec4(1.0);\\n#endif\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nconst float PI = 3.141592653589793;\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_offset;\\nattribute vec2 a_texture_pos;\\nattribute vec4 a_data;\\n\\n\\n// matrix is for the vertex position.\\nuniform mat4 u_matrix;\\n\\nuniform mediump float u_zoom;\\nuniform bool u_rotate_with_map;\\nuniform bool u_pitch_with_map;\\nuniform mediump float u_pitch;\\nuniform mediump float u_bearing;\\nuniform mediump float u_aspect_ratio;\\nuniform vec2 u_extrude_scale;\\n\\nuniform vec2 u_texsize;\\n\\nvarying vec2 v_tex;\\nvarying vec2 v_fade_tex;\\nvarying float v_gamma_scale;\\n\\nvoid main() {\\n    vec2 a_tex = a_texture_pos.xy;\\n    mediump float a_labelminzoom = a_data[0];\\n    mediump vec2 a_zoom = a_data.pq;\\n    mediump float a_minzoom = a_zoom[0];\\n    mediump float a_maxzoom = a_zoom[1];\\n\\n    // u_zoom is the current zoom level adjusted for the change in font size\\n    mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\\n\\n    // pitch-alignment: map\\n    // rotation-alignment: map | viewport\\n    if (u_pitch_with_map) {\\n        lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\\n        lowp float asin = sin(angle);\\n        lowp float acos = cos(angle);\\n        mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\\n        vec2 offset = RotationMatrix * a_offset;\\n        vec2 extrude = u_extrude_scale * (offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\\n        gl_Position.z += z * gl_Position.w;\\n    // pitch-alignment: viewport\\n    // rotation-alignment: map\\n    } else if (u_rotate_with_map) {\\n        // foreshortening factor to apply on pitched maps\\n        // as a label goes from horizontal <=> vertical in angle\\n        // it goes from 0% foreshortening to up to around 70% foreshortening\\n        lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\\n\\n        lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\\n\\n        // use the lineangle to position points a,b along the line\\n        // project the points and calculate the label angle in projected space\\n        // this calculation allows labels to be rendered unskewed on pitched maps\\n        vec4 a = u_matrix * vec4(a_pos, 0, 1);\\n        vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\\n        lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\\n        lowp float asin = sin(angle);\\n        lowp float acos = cos(angle);\\n        mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\\n\\n        vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\\n        vec2 extrude = u_extrude_scale * (offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n        gl_Position.z += z * gl_Position.w;\\n    // pitch-alignment: viewport\\n    // rotation-alignment: viewport\\n    } else {\\n        vec2 extrude = u_extrude_scale * (a_offset / 64.0);\\n        gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\\n    }\\n\\n    v_gamma_scale = (gl_Position.w - 0.5);\\n\\n    v_tex = a_tex / u_texsize;\\n    v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\\n}\\n\"\n  },\n  collisionbox: {\n    fragmentSource: \"#ifdef GL_ES\\nprecision mediump float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nuniform float u_zoom;\\nuniform float u_maxzoom;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n\\n    float alpha = 0.5;\\n\\n    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n    if (v_placement_zoom > u_zoom) {\\n        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n    }\\n\\n    if (u_zoom >= v_max_zoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\\n    }\\n\\n    if (v_placement_zoom >= u_maxzoom) {\\n        gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\\n    }\\n}\\n\",\n    vertexSource: \"#ifdef GL_ES\\nprecision highp float;\\n#else\\n#define lowp\\n#define mediump\\n#define highp\\n#endif\\n\\nattribute vec2 a_pos;\\nattribute vec2 a_extrude;\\nattribute vec2 a_data;\\n\\nuniform mat4 u_matrix;\\nuniform float u_scale;\\n\\nvarying float v_max_zoom;\\nvarying float v_placement_zoom;\\n\\nvoid main() {\\n    gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n    v_max_zoom = a_data.x;\\n    v_placement_zoom = a_data.y;\\n}\\n\"\n  }\n};\n\nmodule.exports.util = \"float evaluate_zoom_function_1(const vec4 values, const float t) {\\n    if (t < 1.0) {\\n        return mix(values[0], values[1], t);\\n    } else if (t < 2.0) {\\n        return mix(values[1], values[2], t - 1.0);\\n    } else {\\n        return mix(values[2], values[3], t - 2.0);\\n    }\\n}\\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\\n    if (t < 1.0) {\\n        return mix(value0, value1, t);\\n    } else if (t < 2.0) {\\n        return mix(value1, value2, t - 1.0);\\n    } else {\\n        return mix(value2, value3, t - 2.0);\\n    }\\n}\\n\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl-shaders/index.js\n// module id = 1402\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar drawCollisionDebug = require('./draw_collision_debug');\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] ||\n        layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']);\n\n    var gl = painter.gl;\n\n    // Disable the stencil test so that labels aren't clipped to tile boundaries.\n    //\n    // Layers with features that may be drawn overlapping aren't clipped. These\n    // layers are sorted in the y direction, and to draw the correct ordering near\n    // tile edges the icons are included in both tiles and clipped when drawing.\n    if (drawAcrossEdges) {\n        gl.disable(gl.STENCIL_TEST);\n    } else {\n        gl.enable(gl.STENCIL_TEST);\n    }\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n    gl.disable(gl.DEPTH_TEST);\n\n    drawLayerSymbols(painter, source, layer, coords, false,\n            layer.paint['icon-translate'],\n            layer.paint['icon-translate-anchor'],\n            layer.layout['icon-rotation-alignment'],\n            // icon-pitch-alignment is not yet implemented\n            // and we simply inherit the rotation alignment\n            layer.layout['icon-rotation-alignment'],\n            layer.layout['icon-size'],\n            layer.paint['icon-halo-width'],\n            layer.paint['icon-halo-color'],\n            layer.paint['icon-halo-blur'],\n            layer.paint['icon-opacity'],\n            layer.paint['icon-color']);\n\n    drawLayerSymbols(painter, source, layer, coords, true,\n            layer.paint['text-translate'],\n            layer.paint['text-translate-anchor'],\n            layer.layout['text-rotation-alignment'],\n            layer.layout['text-pitch-alignment'],\n            layer.layout['text-size'],\n            layer.paint['text-halo-width'],\n            layer.paint['text-halo-color'],\n            layer.paint['text-halo-blur'],\n            layer.paint['text-opacity'],\n            layer.paint['text-color']);\n\n    gl.enable(gl.DEPTH_TEST);\n\n    if (source.map.showCollisionBoxes) {\n        drawCollisionDebug(painter, source, layer, coords);\n    }\n}\n\nfunction drawLayerSymbols(painter, source, layer, coords, isText,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        pitchAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    for (var j = 0; j < coords.length; j++) {\n        var tile = source.getTile(coords[j]);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bothBufferGroups = bucket.bufferGroups;\n        var bufferGroups = isText ? bothBufferGroups.glyph : bothBufferGroups.icon;\n        if (!bufferGroups.length) continue;\n\n        painter.enableTileClippingMask(coords[j]);\n        drawSymbol(painter, layer, coords[j].posMatrix, tile, bucket, bufferGroups, isText,\n                isText || bucket.sdfIcons, !isText && bucket.iconsNeedLinear,\n                isText ? bucket.adjustedTextSize : bucket.adjustedIconSize, bucket.fontstack,\n                translate,\n                translateAnchor,\n                rotationAlignment,\n                pitchAlignment,\n                size,\n                haloWidth,\n                haloColor,\n                haloBlur,\n                opacity,\n                color);\n    }\n}\n\nfunction drawSymbol(painter, layer, posMatrix, tile, bucket, bufferGroups, isText, sdf, iconsNeedLinear, adjustedSize, fontstack,\n        translate,\n        translateAnchor,\n        rotationAlignment,\n        pitchAlignment,\n        size,\n        haloWidth,\n        haloColor,\n        haloBlur,\n        opacity,\n        color) {\n\n    var gl = painter.gl;\n    var tr = painter.transform;\n    var rotateWithMap = rotationAlignment === 'map';\n    var pitchWithMap = pitchAlignment === 'map';\n\n    var defaultSize = isText ? 24 : 1;\n    var fontScale = size / defaultSize;\n\n    var extrudeScale, s, gammaScale;\n    if (pitchWithMap) {\n        s = pixelsToTileUnits(tile, 1, painter.transform.zoom) * fontScale;\n        gammaScale = 1 / Math.cos(tr._pitch);\n        extrudeScale = [s, s];\n    } else {\n        s = painter.transform.altitude * fontScale;\n        gammaScale = 1;\n        extrudeScale = [ tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s];\n    }\n\n    if (!isText && !painter.style.sprite.loaded())\n        return;\n\n    var program = painter.useProgram(sdf ? 'sdf' : 'icon');\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(posMatrix, tile, translate, translateAnchor));\n    gl.uniform1i(program.u_rotate_with_map, rotateWithMap);\n    gl.uniform1i(program.u_pitch_with_map, pitchWithMap);\n    gl.uniform2fv(program.u_extrude_scale, extrudeScale);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(program.u_texture, 0);\n\n    if (isText) {\n        // use the fonstack used when parsing the tile, not the fontstack\n        // at the current zoom level (layout['text-font']).\n        var glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack);\n        if (!glyphAtlas) return;\n\n        glyphAtlas.updateTexture(gl);\n        gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4);\n    } else {\n        var mapMoving = painter.options.rotating || painter.options.zooming;\n        var iconScaled = fontScale !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear;\n        var iconTransformed = pitchWithMap || painter.transform.pitch;\n        painter.spriteAtlas.bind(gl, sdf || mapMoving || iconScaled || iconTransformed);\n        gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4);\n    }\n\n    // adjust min/max zooms for variable font sizes\n    var zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0;\n    gl.uniform1f(program.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level\n\n    gl.activeTexture(gl.TEXTURE1);\n    painter.frameHistory.bind(gl);\n    gl.uniform1i(program.u_fadetexture, 1);\n\n    var group;\n\n    if (sdf) {\n        var sdfPx = 8;\n        var blurOffset = 1.19;\n        var haloOffset = 6;\n        var gamma = 0.105 * defaultSize / size / browser.devicePixelRatio;\n\n        if (haloWidth) {\n            // Draw halo underneath the text.\n            gl.uniform1f(program.u_gamma, (haloBlur * blurOffset / fontScale / sdfPx + gamma) * gammaScale);\n            gl.uniform4fv(program.u_color, haloColor);\n            gl.uniform1f(program.u_opacity, opacity);\n            gl.uniform1f(program.u_buffer, (haloOffset - haloWidth / fontScale) / sdfPx);\n\n            for (var j = 0; j < bufferGroups.length; j++) {\n                group = bufferGroups[j];\n                group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n                gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n            }\n        }\n\n        gl.uniform1f(program.u_gamma, gamma * gammaScale);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        gl.uniform1f(program.u_buffer, (256 - 64) / 256);\n        gl.uniform1f(program.u_pitch, tr.pitch / 360 * 2 * Math.PI);\n        gl.uniform1f(program.u_bearing, tr.bearing / 360 * 2 * Math.PI);\n        gl.uniform1f(program.u_aspect_ratio, tr.width / tr.height);\n\n        for (var i = 0; i < bufferGroups.length; i++) {\n            group = bufferGroups[i];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n\n    } else {\n        gl.uniform1f(program.u_opacity, opacity);\n        for (var k = 0; k < bufferGroups.length; k++) {\n            group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_symbol.js\n// module id = 1403\n// module chunks = 0 1","'use strict';\n\nmodule.exports = drawCollisionDebug;\n\nfunction drawCollisionDebug(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n    var program = painter.useProgram('collisionbox');\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.collisionBox;\n\n        if (!bufferGroups || !bufferGroups.length) continue;\n        var group = bufferGroups[0];\n        if (group.layoutVertexBuffer.length === 0) continue;\n\n        gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n        painter.enableTileClippingMask(coord);\n\n        painter.lineWidth(1);\n        gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n        gl.uniform1f(program.u_zoom, painter.transform.zoom * 10);\n        gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10);\n\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer);\n        gl.drawArrays(gl.LINES, 0, group.layoutVertexBuffer.length);\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_collision_debug.js\n// module id = 1404\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\n\nmodule.exports = drawCircles;\n\nfunction drawCircles(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n\n    var gl = painter.gl;\n\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    // Allow circles to be drawn across boundaries, so that\n    // large circles are not clipped to tiles\n    gl.disable(gl.STENCIL_TEST);\n\n    for (var i = 0; i < coords.length; i++) {\n        var coord = coords[i];\n\n        var tile = source.getTile(coord);\n        var bucket = tile.getBucket(layer);\n        if (!bucket) continue;\n        var bufferGroups = bucket.bufferGroups.circle;\n        if (!bufferGroups) continue;\n\n        var programOptions = bucket.paintAttributes.circle[layer.id];\n        var program = painter.useProgram(\n            'circle',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        if (layer.paint['circle-pitch-scale'] === 'map') {\n            gl.uniform1i(program.u_scale_with_map, true);\n            gl.uniform2f(program.u_extrude_scale,\n                painter.transform.pixelsToGLUnits[0] * painter.transform.altitude,\n                painter.transform.pixelsToGLUnits[1] * painter.transform.altitude);\n        } else {\n            gl.uniform1i(program.u_scale_with_map, false);\n            gl.uniform2fv(program.u_extrude_scale, painter.transform.pixelsToGLUnits);\n        }\n\n        gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n            coord.posMatrix,\n            tile,\n            layer.paint['circle-translate'],\n            layer.paint['circle-translate-anchor']\n        ));\n\n        bucket.setUniforms(gl, 'circle', program, layer, {zoom: painter.transform.zoom});\n\n        for (var k = 0; k < bufferGroups.length; k++) {\n            var group = bufferGroups[k];\n            group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n            gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_circle.js\n// module id = 1405\n// module chunks = 0 1","'use strict';\n\nvar browser = require('../util/browser');\nvar mat2 = require('gl-matrix').mat2;\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, source, layer, coords) {\n    if (painter.isOpaquePass) return;\n    painter.setDepthSublayer(0);\n    painter.depthMask(false);\n\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    // don't draw zero-width lines\n    if (layer.paint['line-width'] <= 0) return;\n\n    for (var k = 0; k < coords.length; k++) {\n        drawLineTile(painter, source, layer, coords[k]);\n    }\n\n};\n\nfunction drawLineTile(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.line;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var programOptions = bucket.paintAttributes.line[layer.id];\n\n    // the distance over which the line edge fades out.\n    // Retina devices need a smaller distance to avoid aliasing.\n    var antialiasing = 1 / browser.devicePixelRatio;\n\n    var blur = layer.paint['line-blur'] + antialiasing;\n    var color = layer.paint['line-color'];\n\n    var tr = painter.transform;\n\n    var antialiasingMatrix = mat2.create();\n    mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]);\n    mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle);\n\n    // calculate how much longer the real world distance is at the top of the screen\n    // than at the middle of the screen.\n    var topedgelength = Math.sqrt(tr.height * tr.height / 4  * (1 + tr.altitude * tr.altitude));\n    var x = tr.height / 2 * Math.tan(tr._pitch);\n    var extra = (topedgelength + x) / topedgelength - 1;\n\n    var dasharray = layer.paint['line-dasharray'];\n    var image = layer.paint['line-pattern'];\n    var program, posA, posB, imagePosA, imagePosB;\n\n    if (dasharray) {\n        program = painter.useProgram(\n            'linesdfpattern',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n\n        posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n        posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.lineAtlas.bind(gl);\n\n        gl.uniform1f(program.u_tex_y_a, posA.y);\n        gl.uniform1f(program.u_tex_y_b, posB.y);\n        gl.uniform1f(program.u_mix, dasharray.t);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else if (image) {\n        imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n        imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n        if (!imagePosA || !imagePosB) return;\n\n        program = painter.useProgram(\n            'linepattern',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1i(program.u_image, 0);\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_fade, image.t);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n\n    } else {\n        program = painter.useProgram(\n            'line',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n\n        gl.uniform1f(program.u_linewidth, layer.paint['line-width'] / 2);\n        gl.uniform1f(program.u_gapwidth, layer.paint['line-gap-width'] / 2);\n        gl.uniform1f(program.u_antialiasing, antialiasing / 2);\n        gl.uniform1f(program.u_blur, blur);\n        gl.uniform1f(program.u_extra, extra);\n        gl.uniform1f(program.u_offset, -layer.paint['line-offset']);\n        gl.uniformMatrix2fv(program.u_antialiasingmatrix, false, antialiasingMatrix);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, layer.paint['line-opacity']);\n    }\n\n    painter.enableTileClippingMask(coord);\n\n    // set uniforms that are different for each tile\n    var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n    var ratio = 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom);\n\n    if (dasharray) {\n        var widthA = posA.width * dasharray.fromScale;\n        var widthB = posB.width * dasharray.toScale;\n        var scaleA = [1 / pixelsToTileUnits(tile, widthA, painter.transform.tileZoom), -posA.height / 2];\n        var scaleB = [1 / pixelsToTileUnits(tile, widthB, painter.transform.tileZoom), -posB.height / 2];\n        var gamma = painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2;\n        gl.uniform1f(program.u_ratio, ratio);\n        gl.uniform2fv(program.u_patternscale_a, scaleA);\n        gl.uniform2fv(program.u_patternscale_b, scaleB);\n        gl.uniform1f(program.u_sdfgamma, gamma);\n\n    } else if (image) {\n        gl.uniform1f(program.u_ratio, ratio);\n        gl.uniform2fv(program.u_pattern_size_a, [\n            pixelsToTileUnits(tile, imagePosA.size[0] * image.fromScale, painter.transform.tileZoom),\n            imagePosB.size[1]\n        ]);\n        gl.uniform2fv(program.u_pattern_size_b, [\n            pixelsToTileUnits(tile, imagePosB.size[0] * image.toScale, painter.transform.tileZoom),\n            imagePosB.size[1]\n        ]);\n\n    } else {\n        gl.uniform1f(program.u_ratio, ratio);\n    }\n\n    bucket.setUniforms(gl, 'line', program, layer, {zoom: painter.transform.zoom});\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.elementBuffer.length * 3, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_line.js\n// module id = 1406\n// module chunks = 0 1","'use strict';\n\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\nmodule.exports = draw;\n\nfunction draw(painter, source, layer, coords) {\n    var gl = painter.gl;\n    gl.enable(gl.STENCIL_TEST);\n\n    var isOpaque;\n    if (layer.paint['fill-pattern']) {\n        isOpaque = false;\n    } else {\n        isOpaque = (\n            layer.isPaintValueFeatureConstant('fill-color') &&\n            layer.isPaintValueFeatureConstant('fill-opacity') &&\n            layer.paint['fill-color'][3] === 1 &&\n            layer.paint['fill-opacity'] === 1\n        );\n    }\n\n    // Draw fill\n    if (painter.isOpaquePass === isOpaque) {\n        // Once we switch to earcut drawing we can pull most of the WebGL setup\n        // outside of this coords loop.\n        painter.setDepthSublayer(1);\n        for (var i = 0; i < coords.length; i++) {\n            drawFill(painter, source, layer, coords[i]);\n        }\n    }\n\n    if (!painter.isOpaquePass && layer.paint['fill-antialias']) {\n        painter.lineWidth(2);\n        painter.depthMask(false);\n\n        var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n        if (isOutlineColorDefined || !layer.paint['fill-pattern']) {\n            if (isOutlineColorDefined) {\n                // If we defined a different color for the fill outline, we are\n                // going to ignore the bits in 0x07 and just care about the global\n                // clipping mask.\n                painter.setDepthSublayer(2);\n            } else {\n                // Otherwise, we only want to drawFill the antialiased parts that are\n                // *outside* the current shape. This is important in case the fill\n                // or stroke color is translucent. If we wouldn't clip to outside\n                // the current shape, some pixels from the outline stroke overlapped\n                // the (non-antialiased) fill.\n                painter.setDepthSublayer(0);\n            }\n        } else {\n            // Otherwise, we only want to drawFill the antialiased parts that are\n            // *outside* the current shape. This is important in case the fill\n            // or stroke color is translucent. If we wouldn't clip to outside\n            // the current shape, some pixels from the outline stroke overlapped\n            // the (non-antialiased) fill.\n            painter.setDepthSublayer(0);\n        }\n\n        for (var j = 0; j < coords.length; j++) {\n            drawStroke(painter, source, layer, coords[j]);\n        }\n    }\n}\n\nfunction drawFill(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n    var bufferGroups = bucket.bufferGroups.fill;\n    if (!bufferGroups) return;\n\n    var gl = painter.gl;\n\n    var image = layer.paint['fill-pattern'];\n    var program;\n\n    if (!image) {\n\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'fill',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n\n    } else {\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        setPattern(image, layer.paint['fill-opacity'], tile, coord, painter, program);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    painter.enableTileClippingMask(coord);\n\n    for (var i = 0; i < bufferGroups.length; i++) {\n        var group = bufferGroups[i];\n        group.vaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.TRIANGLES, group.elementBuffer.length, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\nfunction drawStroke(painter, source, layer, coord) {\n    var tile = source.getTile(coord);\n    var bucket = tile.getBucket(layer);\n    if (!bucket) return;\n\n    var gl = painter.gl;\n    var bufferGroups = bucket.bufferGroups.fill;\n\n    var image = layer.paint['fill-pattern'];\n    var opacity = layer.paint['fill-opacity'];\n    var isOutlineColorDefined = layer.getPaintProperty('fill-outline-color');\n\n    var program;\n    if (image && !isOutlineColorDefined) {\n        program = painter.useProgram('outlinepattern');\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    } else {\n        var programOptions = bucket.paintAttributes.fill[layer.id];\n        program = painter.useProgram(\n            'outline',\n            programOptions.defines,\n            programOptions.vertexPragmas,\n            programOptions.fragmentPragmas\n        );\n        gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n        gl.uniform1f(program.u_opacity, opacity);\n        bucket.setUniforms(gl, 'fill', program, layer, {zoom: painter.transform.zoom});\n    }\n\n    gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n        coord.posMatrix,\n        tile,\n        layer.paint['fill-translate'],\n        layer.paint['fill-translate-anchor']\n    ));\n\n    if (image) { setPattern(image, opacity, tile, coord, painter, program); }\n\n    painter.enableTileClippingMask(coord);\n\n    for (var k = 0; k < bufferGroups.length; k++) {\n        var group = bufferGroups[k];\n        group.secondVaos[layer.id].bind(gl, program, group.layoutVertexBuffer, group.elementBuffer2, group.paintVertexBuffers[layer.id]);\n        gl.drawElements(gl.LINES, group.elementBuffer2.length * 2, gl.UNSIGNED_SHORT, 0);\n    }\n}\n\n\nfunction setPattern(image, opacity, tile, coord, painter, program) {\n    var gl = painter.gl;\n\n    var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n    var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n    if (!imagePosA || !imagePosB) return;\n\n    gl.uniform1i(program.u_image, 0);\n    gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n    gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n    gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n    gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n    gl.uniform1f(program.u_opacity, opacity);\n    gl.uniform1f(program.u_mix, image.t);\n\n    gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n    gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n    gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n    gl.uniform1f(program.u_scale_a, image.fromScale);\n    gl.uniform1f(program.u_scale_b, image.toScale);\n\n    var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n    var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n    var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n    // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n    gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n    gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n\n    gl.activeTexture(gl.TEXTURE0);\n    painter.spriteAtlas.bind(gl, true);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_fill.js\n// module id = 1407\n// module chunks = 0 1","'use strict';\n\nvar pixelsToTileUnits = require('../source/pixels_to_tile_units');\nvar createUniformPragmas = require('./create_uniform_pragmas');\n\nvar tileSize = 512;\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, source, layer) {\n    var gl = painter.gl;\n    var transform = painter.transform;\n    var color = layer.paint['background-color'];\n    var image = layer.paint['background-pattern'];\n    var opacity = layer.paint['background-opacity'];\n    var program;\n\n    var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null;\n    var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null;\n\n    painter.setDepthSublayer(0);\n    if (imagePosA && imagePosB) {\n\n        if (painter.isOpaquePass) return;\n\n        // Draw texture fill\n        program = painter.useProgram('pattern');\n        gl.uniform1i(program.u_image, 0);\n        gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n        gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n        gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n        gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n        gl.uniform1f(program.u_opacity, opacity);\n\n        gl.uniform1f(program.u_mix, image.t);\n\n        gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n        gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n        gl.uniform1f(program.u_scale_a, image.fromScale);\n        gl.uniform1f(program.u_scale_b, image.toScale);\n\n        gl.activeTexture(gl.TEXTURE0);\n        painter.spriteAtlas.bind(gl, true);\n\n        painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer);\n    } else {\n        // Draw filling rectangle.\n        if (painter.isOpaquePass !== (color[3] === 1)) return;\n\n        var pragmas = createUniformPragmas([\n            {name: 'u_color', components: 4},\n            {name: 'u_opacity', components: 1}\n        ]);\n        program = painter.useProgram('fill', [], pragmas, pragmas);\n        gl.uniform4fv(program.u_color, color);\n        gl.uniform1f(program.u_opacity, opacity);\n        painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer);\n    }\n\n    gl.disable(gl.STENCIL_TEST);\n\n    // We need to draw the background in tiles in order to use calculatePosMatrix\n    // which applies the projection matrix (transform.projMatrix). Otherwise\n    // the depth and stencil buffers get into a bad state.\n    // This can be refactored into a single draw call once earcut lands and\n    // we don't have so much going on in the stencil buffer.\n    var coords = transform.coveringTiles({ tileSize: tileSize });\n    for (var c = 0; c < coords.length; c++) {\n        var coord = coords[c];\n        // var pixelsToTileUnitsBound = pixelsToTileUnits.bind({coord:coord, tileSize: tileSize});\n        if (imagePosA && imagePosB) {\n            var tile = {coord:coord, tileSize: tileSize};\n\n            gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n\n            var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n            var pixelX = tileSizeAtNearestZoom * (tile.coord.x + coord.w * Math.pow(2, tile.coord.z));\n            var pixelY = tileSizeAtNearestZoom * tile.coord.y;\n            // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n            gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n            gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n        }\n\n        gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord));\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length);\n    }\n\n    gl.stencilMask(0x00);\n    gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_background.js\n// module id = 1408\n// module chunks = 0 1","'use strict';\n\nvar textVertices = require('../lib/debugtext');\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\nvar EXTENT = require('../data/bucket').EXTENT;\nvar Buffer = require('../data/buffer');\nvar VertexArrayObject = require('./vertex_array_object');\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, source, coords) {\n    if (painter.isOpaquePass) return;\n    if (!painter.options.debug) return;\n\n    for (var i = 0; i < coords.length; i++) {\n        drawDebugTile(painter, source, coords[i]);\n    }\n}\n\nfunction drawDebugTile(painter, source, coord) {\n    var gl = painter.gl;\n\n    gl.disable(gl.STENCIL_TEST);\n    painter.lineWidth(1 * browser.devicePixelRatio);\n\n    var posMatrix = coord.posMatrix;\n    var program = painter.useProgram('debug');\n\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.uniform4f(program.u_color, 1, 0, 0, 1);\n    painter.debugVAO.bind(gl, program, painter.debugBuffer);\n    gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length);\n\n    var vertices = textVertices(coord.toString(), 50, 200, 5);\n    var debugTextArray = new painter.PosArray();\n    for (var v = 0; v < vertices.length; v += 2) {\n        debugTextArray.emplaceBack(vertices[v], vertices[v + 1]);\n    }\n    var debugTextBuffer = new Buffer(debugTextArray.serialize(), painter.PosArray.serialize(), Buffer.BufferType.VERTEX);\n    var debugTextVAO = new VertexArrayObject();\n    debugTextVAO.bind(gl, program, debugTextBuffer);\n    gl.uniform4f(program.u_color, 1, 1, 1, 1);\n\n    // Draw the halo with multiple 1px lines instead of one wider line because\n    // the gl spec doesn't guarantee support for lines with width > 1.\n    var tileSize = source.getTile(coord).tileSize;\n    var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize);\n    var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]];\n    for (var i = 0; i < translations.length; i++) {\n        var translation = translations[i];\n        gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0]));\n        gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n    }\n\n    gl.uniform4f(program.u_color, 0, 0, 0, 1);\n    gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n    gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/render/draw_debug.js\n// module id = 1409\n// module chunks = 0 1","'use strict';\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nvar simplexFont = {\n    \" \": [16, []],\n    \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n    \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n    \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n    \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n    \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n    \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n    \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n    \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n    \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n    \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"-\": [26, [4, 9, 22, 9]],\n    \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \"/\": [22, [20, 25, 2, -7]],\n    \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n    \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n    \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n    \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n    \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n    \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n    \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n    \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n    \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n    \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n    \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n    \"<\": [24, [20, 18, 4, 9, 20, 0]],\n    \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n    \">\": [24, [4, 18, 20, 9, 4, 0]],\n    \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n    \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n    \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n    \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n    \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n    \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n    \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n    \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n    \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n    \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n    \"I\": [8, [4, 21, 4, 0]],\n    \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n    \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n    \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n    \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n    \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n    \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n    \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n    \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n    \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n    \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n    \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n    \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n    \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n    \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n    \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n    \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n    \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n    \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n    \"\\\\\": [14, [0, 21, 14, -3]],\n    \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n    \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n    \"_\": [16, [0, -2, 16, -2]],\n    \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n    \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n    \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n    \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n    \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n    \"l\": [8, [4, 21, 4, 0]],\n    \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n    \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n    \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n    \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n    \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n    \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n    \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n    \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n    \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n    \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n    \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n    \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n    \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n    \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n    \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n    \"|\": [8, [4, 25, 4, -7]],\n    \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n    \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nmodule.exports = function textVertices(text, left, baseline, scale) {\n    scale = scale || 1;\n\n    var strokes = [],\n        i, len, j, len2, glyph, x, y, prev;\n\n    for (i = 0, len = text.length; i < len; i++) {\n        glyph = simplexFont[text[i]];\n        if (!glyph) continue;\n        prev = null;\n\n        for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n            if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n                prev = null;\n\n            } else {\n                x = left + glyph[1][j] * scale;\n                y = baseline - glyph[1][j + 1] * scale;\n                if (prev) {\n                    strokes.push(prev.x, prev.y, x, y);\n                }\n                prev = {x: x, y: y};\n            }\n        }\n        left += glyph[0] * scale;\n    }\n\n    return strokes;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/lib/debugtext.js\n// module id = 1410\n// module chunks = 0 1","'use strict';\n\nvar LngLat = require('./lng_lat'),\n    Point = require('point-geometry'),\n    Coordinate = require('./coordinate'),\n    wrap = require('../util/util').wrap,\n    interp = require('../util/interpolate'),\n    TileCoord = require('../source/tile_coord'),\n    EXTENT = require('../data/bucket').EXTENT,\n    glmatrix = require('gl-matrix');\n\nvar vec4 = glmatrix.vec4,\n    mat4 = glmatrix.mat4,\n    mat2 = glmatrix.mat2;\n\nmodule.exports = Transform;\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n *\n * @param {number} minZoom\n * @param {number} maxZoom\n * @private\n */\nfunction Transform(minZoom, maxZoom) {\n    this.tileSize = 512; // constant\n\n    this._minZoom = minZoom || 0;\n    this._maxZoom = maxZoom || 22;\n\n    this.latRange = [-85.05113, 85.05113];\n\n    this.width = 0;\n    this.height = 0;\n    this._center = new LngLat(0, 0);\n    this.zoom = 0;\n    this.angle = 0;\n    this._altitude = 1.5;\n    this._pitch = 0;\n    this._unmodified = true;\n}\n\nTransform.prototype = {\n    get minZoom() { return this._minZoom; },\n    set minZoom(zoom) {\n        if (this._minZoom === zoom) return;\n        this._minZoom = zoom;\n        this.zoom = Math.max(this.zoom, zoom);\n    },\n\n    get maxZoom() { return this._maxZoom; },\n    set maxZoom(zoom) {\n        if (this._maxZoom === zoom) return;\n        this._maxZoom = zoom;\n        this.zoom = Math.min(this.zoom, zoom);\n    },\n\n    get worldSize() {\n        return this.tileSize * this.scale;\n    },\n\n    get centerPoint() {\n        return this.size._div(2);\n    },\n\n    get size() {\n        return new Point(this.width, this.height);\n    },\n\n    get bearing() {\n        return -this.angle / Math.PI * 180;\n    },\n    set bearing(bearing) {\n        var b = -wrap(bearing, -180, 180) * Math.PI / 180;\n        if (this.angle === b) return;\n        this._unmodified = false;\n        this.angle = b;\n        this._calcMatrices();\n\n        // 2x2 matrix for rotating points\n        this.rotationMatrix = mat2.create();\n        mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n    },\n\n    get pitch() {\n        return this._pitch / Math.PI * 180;\n    },\n    set pitch(pitch) {\n        var p = Math.min(60, pitch) / 180 * Math.PI;\n        if (this._pitch === p) return;\n        this._unmodified = false;\n        this._pitch = p;\n        this._calcMatrices();\n    },\n\n    get altitude() {\n        return this._altitude;\n    },\n    set altitude(altitude) {\n        var a = Math.max(0.75, altitude);\n        if (this._altitude === a) return;\n        this._unmodified = false;\n        this._altitude = a;\n        this._calcMatrices();\n    },\n\n    get zoom() { return this._zoom; },\n    set zoom(zoom) {\n        var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n        if (this._zoom === z) return;\n        this._unmodified = false;\n        this._zoom = z;\n        this.scale = this.zoomScale(z);\n        this.tileZoom = Math.floor(z);\n        this.zoomFraction = z - this.tileZoom;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get center() { return this._center; },\n    set center(center) {\n        if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n        this._unmodified = false;\n        this._center = center;\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    /**\n     * Return a zoom level that will cover all tiles the transform\n     * @param {Object} options\n     * @param {number} options.tileSize\n     * @param {boolean} options.roundZoom\n     * @returns {number} zoom level\n     * @private\n     */\n    coveringZoomLevel: function(options) {\n        return (options.roundZoom ? Math.round : Math.floor)(\n            this.zoom + this.scaleZoom(this.tileSize / options.tileSize)\n        );\n    },\n\n    /**\n     * Return all coordinates that could cover this transform for a covering\n     * zoom level.\n     * @param {Object} options\n     * @param {number} options.tileSize\n     * @param {number} options.minzoom\n     * @param {number} options.maxzoom\n     * @param {boolean} options.roundZoom\n     * @param {boolean} options.reparseOverscaled\n     * @returns {Array<Tile>} tiles\n     * @private\n     */\n    coveringTiles: function(options) {\n        var z = this.coveringZoomLevel(options);\n        var actualZ = z;\n\n        if (z < options.minzoom) return [];\n        if (z > options.maxzoom) z = options.maxzoom;\n\n        var tr = this,\n            tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z),\n            centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5);\n\n        return TileCoord.cover(z, [\n            tr.pointCoordinate(new Point(0, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z),\n            tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z),\n            tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z)\n        ], options.reparseOverscaled ? actualZ : z).sort(function(a, b) {\n            return centerPoint.dist(a) - centerPoint.dist(b);\n        });\n    },\n\n    resize: function(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.pixelsToGLUnits = [2 / width, -2 / height];\n        this._calcMatrices();\n        this._constrain();\n    },\n\n    get unmodified() { return this._unmodified; },\n\n    zoomScale: function(zoom) { return Math.pow(2, zoom); },\n    scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; },\n\n    project: function(lnglat, worldSize) {\n        return new Point(\n            this.lngX(lnglat.lng, worldSize),\n            this.latY(lnglat.lat, worldSize));\n    },\n\n    unproject: function(point, worldSize) {\n        return new LngLat(\n            this.xLng(point.x, worldSize),\n            this.yLat(point.y, worldSize));\n    },\n\n    get x() { return this.lngX(this.center.lng); },\n    get y() { return this.latY(this.center.lat); },\n\n    get point() { return new Point(this.x, this.y); },\n\n    /**\n     * latitude to absolute x coord\n     * @param {number} lon\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    lngX: function(lng, worldSize) {\n        return (180 + lng) * (worldSize || this.worldSize) / 360;\n    },\n    /**\n     * latitude to absolute y coord\n     * @param {number} lat\n     * @param {number} [worldSize=this.worldSize]\n     * @returns {number} pixel coordinate\n     * @private\n     */\n    latY: function(lat, worldSize) {\n        var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n        return (180 - y) * (worldSize || this.worldSize) / 360;\n    },\n\n    xLng: function(x, worldSize) {\n        return x * 360 / (worldSize || this.worldSize) - 180;\n    },\n    yLat: function(y, worldSize) {\n        var y2 = 180 - y * 360 / (worldSize || this.worldSize);\n        return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n    },\n\n    panBy: function(offset) {\n        var point = this.centerPoint._add(offset);\n        this.center = this.pointLocation(point);\n    },\n\n    setLocationAtPoint: function(lnglat, point) {\n        var c = this.locationCoordinate(lnglat);\n        var coordAtPoint = this.pointCoordinate(point);\n        var coordCenter = this.pointCoordinate(this.centerPoint);\n        var translate = coordAtPoint._sub(c);\n        this._unmodified = false;\n        this.center = this.coordinateLocation(coordCenter._sub(translate));\n    },\n\n    /**\n     * Given a location, return the screen point that corresponds to it\n     * @param {LngLat} lnglat location\n     * @returns {Point} screen point\n     * @private\n     */\n    locationPoint: function(lnglat) {\n        return this.coordinatePoint(this.locationCoordinate(lnglat));\n    },\n\n    /**\n     * Given a point on screen, return its lnglat\n     * @param {Point} p screen point\n     * @returns {LngLat} lnglat location\n     * @private\n     */\n    pointLocation: function(p) {\n        return this.coordinateLocation(this.pointCoordinate(p));\n    },\n\n    /**\n     * Given a geographical lnglat, return an unrounded\n     * coordinate that represents it at this transform's zoom level and\n     * worldsize.\n     * @param {LngLat} lnglat\n     * @returns {Coordinate}\n     * @private\n     */\n    locationCoordinate: function(lnglat) {\n        var k = this.zoomScale(this.tileZoom) / this.worldSize,\n            ll = LngLat.convert(lnglat);\n\n        return new Coordinate(\n            this.lngX(ll.lng) * k,\n            this.latY(ll.lat) * k,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a Coordinate, return its geographical position.\n     * @param {Coordinate} coord\n     * @returns {LngLat} lnglat\n     * @private\n     */\n    coordinateLocation: function(coord) {\n        var worldSize = this.zoomScale(coord.zoom);\n        return new LngLat(\n            this.xLng(coord.column, worldSize),\n            this.yLat(coord.row, worldSize));\n    },\n\n    pointCoordinate: function(p) {\n\n        var targetZ = 0;\n        // since we don't know the correct projected z value for the point,\n        // unproject two points to get a line and then find the point on that\n        // line with z=0\n\n        var coord0 = [p.x, p.y, 0, 1];\n        var coord1 = [p.x, p.y, 1, 1];\n\n        vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse);\n        vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse);\n\n        var w0 = coord0[3];\n        var w1 = coord1[3];\n        var x0 = coord0[0] / w0;\n        var x1 = coord1[0] / w1;\n        var y0 = coord0[1] / w0;\n        var y1 = coord1[1] / w1;\n        var z0 = coord0[2] / w0;\n        var z1 = coord1[2] / w1;\n\n\n        var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n        var scale = this.worldSize / this.zoomScale(this.tileZoom);\n\n        return new Coordinate(\n            interp(x0, x1, t) / scale,\n            interp(y0, y1, t) / scale,\n            this.tileZoom);\n    },\n\n    /**\n     * Given a coordinate, return the screen point that corresponds to it\n     * @param {Coordinate} coord\n     * @returns {Point} screen point\n     * @private\n     */\n    coordinatePoint: function(coord) {\n        var scale = this.worldSize / this.zoomScale(coord.zoom);\n        var p = [coord.column * scale, coord.row * scale, 0, 1];\n        vec4.transformMat4(p, p, this.pixelMatrix);\n        return new Point(p[0] / p[3], p[1] / p[3]);\n    },\n\n    /**\n     * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.\n     * @param {TileCoord|Coordinate} coord\n     * @param {Number} maxZoom maximum source zoom to account for overscaling\n     * @private\n     */\n    calculatePosMatrix: function(coord, maxZoom) {\n        if (maxZoom === undefined) maxZoom = Infinity;\n        if (coord instanceof TileCoord) coord = coord.toCoordinate(maxZoom);\n\n        // Initialize model-view matrix that converts from the tile coordinates to screen coordinates.\n\n        // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n        // so calculate the matrix the maxzoom tile would use.\n        var z = Math.min(coord.zoom, maxZoom);\n\n        var scale = this.worldSize / Math.pow(2, z);\n        var posMatrix = new Float64Array(16);\n\n        mat4.identity(posMatrix);\n        mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]);\n        mat4.scale(posMatrix, posMatrix, [ scale / EXTENT, scale / EXTENT, 1 ]);\n        mat4.multiply(posMatrix, this.projMatrix, posMatrix);\n\n        return new Float32Array(posMatrix);\n    },\n\n    _constrain: function() {\n        if (!this.center || !this.width || !this.height || this._constraining) return;\n\n        this._constraining = true;\n\n        var minY, maxY, minX, maxX, sy, sx, x2, y2,\n            size = this.size,\n            unmodified = this._unmodified;\n\n        if (this.latRange) {\n            minY = this.latY(this.latRange[1]);\n            maxY = this.latY(this.latRange[0]);\n            sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n        }\n\n        if (this.lngRange) {\n            minX = this.lngX(this.lngRange[0]);\n            maxX = this.lngX(this.lngRange[1]);\n            sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n        }\n\n        // how much the map should scale to fit the screen into given latitude/longitude ranges\n        var s = Math.max(sx || 0, sy || 0);\n\n        if (s) {\n            this.center = this.unproject(new Point(\n                sx ? (maxX + minX) / 2 : this.x,\n                sy ? (maxY + minY) / 2 : this.y));\n            this.zoom += this.scaleZoom(s);\n            this._unmodified = unmodified;\n            this._constraining = false;\n            return;\n        }\n\n        if (this.latRange) {\n            var y = this.y,\n                h2 = size.y / 2;\n\n            if (y - h2 < minY) y2 = minY + h2;\n            if (y + h2 > maxY) y2 = maxY - h2;\n        }\n\n        if (this.lngRange) {\n            var x = this.x,\n                w2 = size.x / 2;\n\n            if (x - w2 < minX) x2 = minX + w2;\n            if (x + w2 > maxX) x2 = maxX - w2;\n        }\n\n        // pan the map if the screen goes off the range\n        if (x2 !== undefined || y2 !== undefined) {\n            this.center = this.unproject(new Point(\n                x2 !== undefined ? x2 : this.x,\n                y2 !== undefined ? y2 : this.y));\n        }\n\n        this._unmodified = unmodified;\n        this._constraining = false;\n    },\n\n    _calcMatrices: function() {\n        if (!this.height) return;\n\n        // Find the distance from the center point to the center top in altitude units using law of sines.\n        var halfFov = Math.atan(0.5 / this.altitude);\n        var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov);\n\n        // Calculate z value of the farthest fragment that should be rendered.\n        var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude;\n\n        // matrix for conversion from location to GL coordinates (-1 .. 1)\n        var m = new Float64Array(16);\n        mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ);\n        mat4.translate(m, m, [0, 0, -this.altitude]);\n\n        // After the rotateX, z values are in pixel units. Convert them to\n        // altitude units. 1 altitude unit = the screen height.\n        mat4.scale(m, m, [1, -1, 1 / this.height]);\n\n        mat4.rotateX(m, m, this._pitch);\n        mat4.rotateZ(m, m, this.angle);\n        mat4.translate(m, m, [-this.x, -this.y, 0]);\n\n        this.projMatrix = m;\n\n        // matrix for conversion from location to screen coordinates\n        m = mat4.create();\n        mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n        mat4.translate(m, m, [1, -1, 0]);\n        this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix);\n\n        // inverse matrix for conversion from screen coordinaes to location\n        m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n        if (!m) throw new Error(\"failed to invert matrix\");\n        this.pixelMatrixInverse = m;\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/geo/transform.js\n// module id = 1411\n// module chunks = 0 1","'use strict';\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @class mapboxgl.Hash\n * @returns {Hash} `this`\n */\nmodule.exports = Hash;\n\nvar util = require('../util/util');\n\nfunction Hash() {\n    util.bindAll([\n        '_onHashChange',\n        '_updateHash'\n    ], this);\n}\n\nHash.prototype = {\n    /*\n     * Map element to listen for coordinate changes\n     *\n     * @param {Object} map\n     * @returns {Hash} `this`\n     */\n    addTo: function(map) {\n        this._map = map;\n        window.addEventListener('hashchange', this._onHashChange, false);\n        this._map.on('moveend', this._updateHash);\n        return this;\n    },\n\n    /*\n     * Removes hash\n     *\n     * @returns {Popup} `this`\n     */\n    remove: function() {\n        window.removeEventListener('hashchange', this._onHashChange, false);\n        this._map.off('moveend', this._updateHash);\n        delete this._map;\n        return this;\n    },\n\n    _onHashChange: function() {\n        var loc = location.hash.replace('#', '').split('/');\n        if (loc.length >= 3) {\n            this._map.jumpTo({\n                center: [+loc[2], +loc[1]],\n                zoom: +loc[0],\n                bearing: +(loc[3] || 0)\n            });\n            return true;\n        }\n        return false;\n    },\n\n    _updateHash: function() {\n        var center = this._map.getCenter(),\n            zoom = this._map.getZoom(),\n            bearing = this._map.getBearing(),\n            precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),\n\n            hash = '#' + (Math.round(zoom * 100) / 100) +\n                '/' + center.lat.toFixed(precision) +\n                '/' + center.lng.toFixed(precision) +\n                (bearing ? '/' + (Math.round(bearing * 10) / 10) : '');\n\n        window.history.replaceState('', '', hash);\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/hash.js\n// module id = 1412\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../util/dom');\nvar Point = require('point-geometry');\n\nvar handlers = {\n    scrollZoom: require('./handler/scroll_zoom'),\n    boxZoom: require('./handler/box_zoom'),\n    dragRotate: require('./handler/drag_rotate'),\n    dragPan: require('./handler/drag_pan'),\n    keyboard: require('./handler/keyboard'),\n    doubleClickZoom: require('./handler/dblclick_zoom'),\n    touchZoomRotate: require('./handler/touch_zoom_rotate')\n};\n\nmodule.exports = function bindHandlers(map, options) {\n    var el = map.getCanvasContainer();\n    var contextMenuEvent = null;\n    var startPos = null;\n    var tapped = null;\n\n    for (var name in handlers) {\n        map[name] = new handlers[name](map, options);\n        if (options.interactive && options[name]) {\n            map[name].enable();\n        }\n    }\n\n    el.addEventListener('mouseout', onMouseOut, false);\n    el.addEventListener('mousedown', onMouseDown, false);\n    el.addEventListener('mouseup', onMouseUp, false);\n    el.addEventListener('mousemove', onMouseMove, false);\n    el.addEventListener('touchstart', onTouchStart, false);\n    el.addEventListener('touchend', onTouchEnd, false);\n    el.addEventListener('touchmove', onTouchMove, false);\n    el.addEventListener('touchcancel', onTouchCancel, false);\n    el.addEventListener('click', onClick, false);\n    el.addEventListener('dblclick', onDblClick, false);\n    el.addEventListener('contextmenu', onContextMenu, false);\n\n    function onMouseOut(e) {\n        fireMouseEvent('mouseout', e);\n    }\n\n    function onMouseDown(e) {\n        map.stop();\n        startPos = DOM.mousePos(el, e);\n        fireMouseEvent('mousedown', e);\n    }\n\n    function onMouseUp(e) {\n        var rotating = map.dragRotate && map.dragRotate.isActive();\n\n        if (contextMenuEvent && !rotating) {\n            fireMouseEvent('contextmenu', contextMenuEvent);\n        }\n\n        contextMenuEvent = null;\n        fireMouseEvent('mouseup', e);\n    }\n\n    function onMouseMove(e) {\n        if (map.dragPan && map.dragPan.isActive()) return;\n        if (map.dragRotate && map.dragRotate.isActive()) return;\n\n        var target = e.toElement || e.target;\n        while (target && target !== el) target = target.parentNode;\n        if (target !== el) return;\n\n        fireMouseEvent('mousemove', e);\n    }\n\n    function onTouchStart(e) {\n        map.stop();\n        fireTouchEvent('touchstart', e);\n\n        if (!e.touches || e.touches.length > 1) return;\n\n        if (!tapped) {\n            tapped = setTimeout(onTouchTimeout, 300);\n\n        } else {\n            clearTimeout(tapped);\n            tapped = null;\n            fireMouseEvent('dblclick', e);\n        }\n    }\n\n    function onTouchMove(e) {\n        fireTouchEvent('touchmove', e);\n    }\n\n    function onTouchEnd(e) {\n        fireTouchEvent('touchend', e);\n    }\n\n    function onTouchCancel(e) {\n        fireTouchEvent('touchcancel', e);\n    }\n\n    function onTouchTimeout() {\n        tapped = null;\n    }\n\n    function onClick(e) {\n        var pos = DOM.mousePos(el, e);\n\n        if (pos.equals(startPos)) {\n            fireMouseEvent('click', e);\n        }\n    }\n\n    function onDblClick(e) {\n        fireMouseEvent('dblclick', e);\n        e.preventDefault();\n    }\n\n    function onContextMenu(e) {\n        contextMenuEvent = e;\n        e.preventDefault();\n    }\n\n    function fireMouseEvent(type, e) {\n        var pos = DOM.mousePos(el, e);\n\n        return map.fire(type, {\n            lngLat: map.unproject(pos),\n            point: pos,\n            originalEvent: e\n        });\n    }\n\n    function fireTouchEvent(type, e) {\n        var touches = DOM.touchPos(el, e);\n        var singular = touches.reduce(function(prev, curr, i, arr) {\n            return prev.add(curr.div(arr.length));\n        }, new Point(0, 0));\n\n        return map.fire(type, {\n            lngLat: map.unproject(singular),\n            point: singular,\n            lngLats: touches.map(function(t) { return map.unproject(t); }, this),\n            points: touches,\n            originalEvent: e\n        });\n    }\n};\n\n/**\n * @typedef {Object} MapMouseEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {MouseEvent} originalEvent\n * @property {Point} point The pixel coordinates of the mouse event target, relative to the map\n *   and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the mouse event target.\n */\n\n/**\n * @typedef {Object} MapTouchEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {TouchEvent} originalEvent\n * @property {Point} point The pixel coordinates of the center of the touch event points, relative to the map\n *   and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the center of the touch event points.\n * @property {Array<Point>} points The array of pixel coordinates corresponding to\n *   a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n *   property.\n * @property {Array<LngLat>} lngLats The geographical locations on the map corresponding to\n *   a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n *   property.\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/bind_handlers.js\n// module id = 1413\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    browser = require('../../util/browser'),\n    util = require('../../util/util');\n\nmodule.exports = ScrollZoomHandler;\n\n\nvar ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '',\n    firefox = ua.indexOf('firefox') !== -1,\n    safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.\n *\n * @class ScrollZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction ScrollZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nScrollZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"scroll to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"scroll to zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"scroll to zoom\" interaction.\n     *\n     * @example\n     *   map.scrollZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('wheel', this._onWheel, false);\n        this._el.addEventListener('mousewheel', this._onWheel, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"scroll to zoom\" interaction.\n     *\n     * @example\n     *   map.scrollZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('wheel', this._onWheel);\n        this._el.removeEventListener('mousewheel', this._onWheel);\n        this._enabled = false;\n    },\n\n    _onWheel: function (e) {\n        var value;\n\n        if (e.type === 'wheel') {\n            value = e.deltaY;\n            // Firefox doubles the values on retina screens...\n            if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n            if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n        } else if (e.type === 'mousewheel') {\n            value = -e.wheelDeltaY;\n            if (safari) value = value / 3;\n        }\n\n        var now = browser.now(),\n            timeDelta = now - (this._time || 0);\n\n        this._pos = DOM.mousePos(this._el, e);\n        this._time = now;\n\n        if (value !== 0 && (value % 4.000244140625) === 0) {\n            // This one is definitely a mouse wheel event.\n            this._type = 'wheel';\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / 4);\n\n        } else if (value !== 0 && Math.abs(value) < 4) {\n            // This one is definitely a trackpad event because it is so small.\n            this._type = 'trackpad';\n\n        } else if (timeDelta > 400) {\n            // This is likely a new scroll action.\n            this._type = null;\n            this._lastValue = value;\n\n            // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n            this._timeout = setTimeout(this._onTimeout, 40);\n\n        } else if (!this._type) {\n            // This is a repeating event, but we don't know the type of event just yet.\n            // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n            this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n            // Make sure our delayed event isn't fired again, because we accumulate\n            // the previous event (which was less than 40ms ago) into this event.\n            if (this._timeout) {\n                clearTimeout(this._timeout);\n                this._timeout = null;\n                value += this._lastValue;\n            }\n        }\n\n        // Slow down zoom if shift key is held for more precise zooming\n        if (e.shiftKey && value) value = value / 4;\n\n        // Only fire the callback if we actually know what type of scrolling device the user uses.\n        if (this._type) this._zoom(-value, e);\n\n        e.preventDefault();\n    },\n\n    _onTimeout: function () {\n        this._type = 'wheel';\n        this._zoom(-this._lastValue);\n    },\n\n    _zoom: function (delta, e) {\n        if (delta === 0) return;\n        var map = this._map;\n\n        // Scale by sigmoid of scroll wheel delta.\n        var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n        if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n        var fromScale = map.ease ? map.ease.to : map.transform.scale,\n            targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n        map.zoomTo(targetZoom, {\n            duration: 0,\n            around: map.unproject(this._pos),\n            delayEndEvents: 200\n        }, { originalEvent: e });\n    }\n};\n\n\n/**\n * Fired just before the map begins a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomstart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoom\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired just after the map completes a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/scroll_zoom.js\n// module id = 1414\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    LngLatBounds = require('../../geo/lng_lat_bounds'),\n    util = require('../../util/util');\n\nmodule.exports = BoxZoomHandler;\n\n/**\n * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.\n * The bounding box is defined by clicking and holding `shift` while dragging the cursor.\n *\n * @class BoxZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction BoxZoomHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._container = map.getContainer();\n\n    util.bindHandlers(this);\n}\n\nBoxZoomHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"box zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"box zoom\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"box zoom\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"box zoom\" interaction.\n     *\n     * @example\n     *   map.boxZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onMouseDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"box zoom\" interaction.\n     *\n     * @example\n     *   map.boxZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onMouseDown);\n        this._enabled = false;\n    },\n\n    _onMouseDown: function (e) {\n        if (!(e.shiftKey && e.button === 0)) return;\n\n        document.addEventListener('mousemove', this._onMouseMove, false);\n        document.addEventListener('keydown', this._onKeyDown, false);\n        document.addEventListener('mouseup', this._onMouseUp, false);\n\n        DOM.disableDrag();\n        this._startPos = DOM.mousePos(this._el, e);\n        this._active = true;\n    },\n\n    _onMouseMove: function (e) {\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e);\n\n        if (!this._box) {\n            this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n            this._container.classList.add('mapboxgl-crosshair');\n            this._fireEvent('boxzoomstart', e);\n        }\n\n        var minX = Math.min(p0.x, p1.x),\n            maxX = Math.max(p0.x, p1.x),\n            minY = Math.min(p0.y, p1.y),\n            maxY = Math.max(p0.y, p1.y);\n\n        DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)');\n\n        this._box.style.width = (maxX - minX) + 'px';\n        this._box.style.height = (maxY - minY) + 'px';\n    },\n\n    _onMouseUp: function (e) {\n        if (e.button !== 0) return;\n\n        var p0 = this._startPos,\n            p1 = DOM.mousePos(this._el, e),\n            bounds = new LngLatBounds(this._map.unproject(p0), this._map.unproject(p1));\n\n        this._finish();\n\n        if (p0.x === p1.x && p0.y === p1.y) {\n            this._fireEvent('boxzoomcancel', e);\n        } else {\n            this._map\n                .fitBounds(bounds, {linear: true})\n                .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds });\n        }\n    },\n\n    _onKeyDown: function (e) {\n        if (e.keyCode === 27) {\n            this._finish();\n            this._fireEvent('boxzoomcancel', e);\n        }\n    },\n\n    _finish: function () {\n        this._active = false;\n\n        document.removeEventListener('mousemove', this._onMouseMove, false);\n        document.removeEventListener('keydown', this._onKeyDown, false);\n        document.removeEventListener('mouseup', this._onMouseUp, false);\n\n        this._container.classList.remove('mapboxgl-crosshair');\n\n        if (this._box) {\n            this._box.parentNode.removeChild(this._box);\n            this._box = null;\n        }\n\n        DOM.enableDrag();\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    }\n};\n\n/**\n * @typedef {Object} MapBoxZoomEvent\n * @property {MouseEvent} originalEvent\n * @property {LngLatBounds} boxZoomBounds The bounding box of the \"box zoom\" interaction.\n *   This property is only provided for `boxzoomend` events.\n */\n\n/**\n * Fired when a \"box zoom\" interaction starts. See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomstart\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when a \"box zoom\" interaction ends.  See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomend\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when the user cancels a \"box zoom\" interaction, or when the bounding box does not meet the minimum size threshold.\n * See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomcancel\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/box_zoom.js\n// module id = 1415\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    Point = require('point-geometry'),\n    util = require('../../util/util');\n\nmodule.exports = DragRotateHandler;\n\nvar inertiaLinearity = 0.25,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 180, // deg/s\n    inertiaDeceleration = 720; // deg/s^2\n\n\n/**\n * The `DragRotateHandler` allows the user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or `ctrl` key.\n *\n * @class DragRotateHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n * @param {Object} [options]\n * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's\n *   bearing (rotation) will snap to north.\n */\nfunction DragRotateHandler(map, options) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n    this._bearingSnap = options.bearingSnap;\n\n    util.bindHandlers(this);\n}\n\nDragRotateHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"drag to rotate\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to rotate\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"drag to rotate\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"drag to rotate\" interaction.\n     *\n     * @example\n     * map.dragRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        document.addEventListener('mousemove', this._onMove);\n        document.addEventListener('mouseup', this._onUp);\n\n        this._active = false;\n        this._inertia = [[Date.now(), this._map.getBearing()]];\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._center = this._map.transform.centerPoint;  // Center of rotation\n\n        // If the first click was too close to the center, move the center of rotation by 200 pixels\n        // in the direction of the click.\n        var startToCenter = this._startPos.sub(this._center),\n            startToCenterDist = startToCenter.mag();\n\n        if (startToCenterDist < 200) {\n            this._center = this._startPos.add(new Point(-200, 0)._rotate(startToCenter.angle()));\n        }\n\n        e.preventDefault();\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('rotatestart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var map = this._map;\n        map.stop();\n\n        var p1 = this._pos,\n            p2 = DOM.mousePos(this._el, e),\n            center = this._center,\n            bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180,\n            bearing = map.getBearing() - bearingDiff,\n            inertia = this._inertia,\n            last = inertia[inertia.length - 1];\n\n        this._drainInertiaBuffer();\n        inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]);\n\n        map.transform.bearing = bearing;\n\n        this._fireEvent('rotate', e);\n        this._fireEvent('move', e);\n\n        this._pos = p2;\n    },\n\n    _onUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onUp);\n\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('rotateend', e);\n        this._drainInertiaBuffer();\n\n        var map = this._map,\n            mapBearing = map.getBearing(),\n            inertia = this._inertia;\n\n        var finish = function() {\n            if (Math.abs(mapBearing) < this._bearingSnap) {\n                map.resetNorth({noMoveStart: true}, { originalEvent: e });\n            } else {\n                this._fireEvent('moveend', e);\n            }\n        }.bind(this);\n\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var first = inertia[0],\n            last = inertia[inertia.length - 1],\n            previous = inertia[inertia.length - 2],\n            bearing = map._normalizeBearing(mapBearing, previous[1]),\n            flingDiff = last[1] - first[1],\n            sign = flingDiff < 0 ? -1 : 1,\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDiff === 0 || flingDuration === 0) {\n            finish();\n            return;\n        }\n\n        var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration));  // deg/s\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = sign * speed * (duration / 2);\n\n        bearing += offset;\n\n        if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) {\n            bearing = map._normalizeBearing(0, bearing);\n        }\n\n        map.rotateTo(bearing, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragPan && map.dragPan.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            var buttons = (e.ctrlKey ? 1 : 2),  // ? ctrl+left button : right button\n                button = (e.ctrlKey ? 0 : 2);   // ? ctrl+left button : right button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   //msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff)\n            inertia.shift();\n    }\n\n};\n\n\n/**\n * Fired when a \"drag to rotate\" interaction starts. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotatestart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during a \"drag to rotate\" interaction. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotate\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to rotate\" interaction ends. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotateend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/drag_rotate.js\n// module id = 1416\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    util = require('../../util/util');\n\nmodule.exports = DragPanHandler;\n\nvar inertiaLinearity = 0.3,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaMaxSpeed = 1400, // px/s\n    inertiaDeceleration = 2500; // px/s^2\n\n\n/**\n * The `DragPanHandler` allows the user to pan the map by clicking and dragging\n * the cursor.\n *\n * @class DragPanHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction DragPanHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nDragPanHandler.prototype = {\n\n    _enabled: false,\n    _active: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"drag to pan\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Returns a Boolean indicating whether the \"drag to pan\" interaction is active, i.e. currently being used.\n     *\n     * @returns {boolean} `true` if the \"drag to pan\" interaction is active.\n     */\n    isActive: function () {\n        return this._active;\n    },\n\n    /**\n     * Enables the \"drag to pan\" interaction.\n     *\n     * @example\n     * map.dragPan.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('mousedown', this._onDown);\n        this._el.addEventListener('touchstart', this._onDown);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"drag to pan\" interaction.\n     *\n     * @example\n     * map.dragPan.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('mousedown', this._onDown);\n        this._el.removeEventListener('touchstart', this._onDown);\n        this._enabled = false;\n    },\n\n    _onDown: function (e) {\n        if (this._ignoreEvent(e)) return;\n        if (this.isActive()) return;\n\n        if (e.touches) {\n            document.addEventListener('touchmove', this._onMove);\n            document.addEventListener('touchend', this._onTouchEnd);\n        } else {\n            document.addEventListener('mousemove', this._onMove);\n            document.addEventListener('mouseup', this._onMouseUp);\n        }\n\n        this._active = false;\n        this._startPos = this._pos = DOM.mousePos(this._el, e);\n        this._inertia = [[Date.now(), this._pos]];\n    },\n\n    _onMove: function (e) {\n        if (this._ignoreEvent(e)) return;\n\n        if (!this.isActive()) {\n            this._active = true;\n            this._fireEvent('dragstart', e);\n            this._fireEvent('movestart', e);\n        }\n\n        var pos = DOM.mousePos(this._el, e),\n            map = this._map;\n\n        map.stop();\n        this._drainInertiaBuffer();\n        this._inertia.push([Date.now(), pos]);\n\n        map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n\n        this._fireEvent('drag', e);\n        this._fireEvent('move', e);\n\n        this._pos = pos;\n\n        e.preventDefault();\n    },\n\n    _onUp: function (e) {\n        if (!this.isActive()) return;\n\n        this._active = false;\n        this._fireEvent('dragend', e);\n        this._drainInertiaBuffer();\n\n        var finish = function() {\n            this._fireEvent('moveend', e);\n        }.bind(this);\n\n        var inertia = this._inertia;\n        if (inertia.length < 2) {\n            finish();\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            flingOffset = last[1].sub(first[1]),\n            flingDuration = (last[0] - first[0]) / 1000;\n\n        if (flingDuration === 0 || last[1].equals(first[1])) {\n            finish();\n            return;\n        }\n\n        // calculate px/s velocity & adjust for increased initial animation speed when easing out\n        var velocity = flingOffset.mult(inertiaLinearity / flingDuration),\n            speed = velocity.mag(); // px/s\n\n        if (speed > inertiaMaxSpeed) {\n            speed = inertiaMaxSpeed;\n            velocity._unit()._mult(speed);\n        }\n\n        var duration = speed / (inertiaDeceleration * inertiaLinearity),\n            offset = velocity.mult(-duration / 2);\n\n        this._map.panBy(offset, {\n            duration: duration * 1000,\n            easing: inertiaEasing,\n            noMoveStart: true\n        }, { originalEvent: e });\n    },\n\n    _onMouseUp: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('mousemove', this._onMove);\n        document.removeEventListener('mouseup', this._onMouseUp);\n    },\n\n    _onTouchEnd: function (e) {\n        if (this._ignoreEvent(e)) return;\n        this._onUp(e);\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onTouchEnd);\n    },\n\n    _fireEvent: function (type, e) {\n        return this._map.fire(type, { originalEvent: e });\n    },\n\n    _ignoreEvent: function (e) {\n        var map = this._map;\n\n        if (map.boxZoom && map.boxZoom.isActive()) return true;\n        if (map.dragRotate && map.dragRotate.isActive()) return true;\n        if (e.touches) {\n            return (e.touches.length > 1);\n        } else {\n            if (e.ctrlKey) return true;\n            var buttons = 1,  // left button\n                button = 0;   // left button\n            return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button);\n        }\n    },\n\n    _drainInertiaBuffer: function () {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160;   // msec\n\n        while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n/**\n * Fired when a \"drag to pan\" interaction starts. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragstart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during a \"drag to pan\" interaction. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event drag\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to pan\" interaction ends. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/drag_pan.js\n// module id = 1417\n// module chunks = 0 1","'use strict';\n\nmodule.exports = KeyboardHandler;\n\n\nvar panDelta = 80,\n    rotateDelta = 2,\n    pitchDelta = 5;\n\n/**\n * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using\n * the following keyboard shortcuts:\n *\n * - `=` / `+`: Increase the zoom level by 1.\n * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.\n * - `-`: Decrease the zoom level by 1.\n * - `Shift--`: Decrease the zoom level by 2.\n * - Arrow keys: Pan by 80 pixels.\n * - `Shift+⇢`: Increase the rotation by 2 degrees.\n * - `Shift+⇠`: Decrease the rotation by 2 degrees.\n * - `Shift+⇡`: Increase the pitch by 5 degrees.\n * - `Shift+⇣`: Decrease the pitch by 5 degrees.\n *\n * @class KeyboardHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction KeyboardHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    this._onKeyDown = this._onKeyDown.bind(this);\n}\n\nKeyboardHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether keyboard interaction is enabled.\n     *\n     * @returns {boolean} `true` if keyboard interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables keyboard interaction.\n     *\n     * @example\n     * map.keyboard.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('keydown', this._onKeyDown, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables keyboard interaction.\n     *\n     * @example\n     * map.keyboard.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('keydown', this._onKeyDown);\n        this._enabled = false;\n    },\n\n    _onKeyDown: function (e) {\n        if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n        var map = this._map,\n            eventData = { originalEvent: e };\n\n        if (map.isEasing()) return;\n\n        switch (e.keyCode) {\n        case 61:\n        case 107:\n        case 171:\n        case 187:\n            map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 189:\n        case 109:\n        case 173:\n            map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1), eventData);\n            break;\n\n        case 37:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() - rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([-panDelta, 0], eventData);\n            }\n            break;\n\n        case 39:\n            if (e.shiftKey) {\n                map.easeTo({ bearing: map.getBearing() + rotateDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([panDelta, 0], eventData);\n            }\n            break;\n\n        case 38:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: map.getPitch() + pitchDelta }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, -panDelta], eventData);\n            }\n            break;\n\n        case 40:\n            if (e.shiftKey) {\n                map.easeTo({ pitch: Math.max(map.getPitch() - pitchDelta, 0) }, eventData);\n            } else {\n                e.preventDefault();\n                map.panBy([0, panDelta], eventData);\n            }\n            break;\n        }\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/keyboard.js\n// module id = 1418\n// module chunks = 0 1","'use strict';\n\nmodule.exports = DoubleClickZoomHandler;\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by\n * double clicking.\n *\n * @class DoubleClickZoomHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction DoubleClickZoomHandler(map) {\n    this._map = map;\n    this._onDblClick = this._onDblClick.bind(this);\n}\n\nDoubleClickZoomHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"double click to zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"double click to zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._map.on('dblclick', this._onDblClick);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"double click to zoom\" interaction.\n     *\n     * @example\n     * map.doubleClickZoom.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._map.off('dblclick', this._onDblClick);\n        this._enabled = false;\n    },\n\n    _onDblClick: function (e) {\n        this._map.zoomTo(\n            this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1),\n            {around: e.lngLat},\n            e\n        );\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/dblclick_zoom.js\n// module id = 1419\n// module chunks = 0 1","'use strict';\n\nvar DOM = require('../../util/dom'),\n    util = require('../../util/util');\n\nmodule.exports = TouchZoomRotateHandler;\n\nvar inertiaLinearity = 0.15,\n    inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n    inertiaDeceleration = 12, // scale / s^2\n    inertiaMaxSpeed = 2.5, // scale / s\n    significantScaleThreshold = 0.15,\n    significantRotateThreshold = 4;\n\n\n/**\n * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by\n * pinching on a touchscreen.\n *\n * @class TouchZoomRotateHandler\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nfunction TouchZoomRotateHandler(map) {\n    this._map = map;\n    this._el = map.getCanvasContainer();\n\n    util.bindHandlers(this);\n}\n\nTouchZoomRotateHandler.prototype = {\n\n    _enabled: false,\n\n    /**\n     * Returns a Boolean indicating whether the \"pinch to rotate and zoom\" interaction is enabled.\n     *\n     * @returns {boolean} `true` if the \"pinch to rotate and zoom\" interaction is enabled.\n     */\n    isEnabled: function () {\n        return this._enabled;\n    },\n\n    /**\n     * Enables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.enable();\n     */\n    enable: function () {\n        if (this.isEnabled()) return;\n        this._el.addEventListener('touchstart', this._onStart, false);\n        this._enabled = true;\n    },\n\n    /**\n     * Disables the \"pinch to rotate and zoom\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.disable();\n     */\n    disable: function () {\n        if (!this.isEnabled()) return;\n        this._el.removeEventListener('touchstart', this._onStart);\n        this._enabled = false;\n    },\n\n    /**\n     * Disables the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n     * interaction enabled.\n     *\n     * @example\n     *   map.touchZoomRotate.disableRotation();\n     */\n    disableRotation: function() {\n        this._rotationDisabled = true;\n    },\n\n    /**\n     * Enables the \"pinch to rotate\" interaction.\n     *\n     * @example\n     *   map.touchZoomRotate.enable();\n     *   map.touchZoomRotate.enableRotation();\n     */\n    enableRotation: function() {\n        this._rotationDisabled = false;\n    },\n\n    _onStart: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]);\n\n        this._startVec = p0.sub(p1);\n        this._startScale = this._map.transform.scale;\n        this._startBearing = this._map.transform.bearing;\n        this._gestureIntent = undefined;\n        this._inertia = [];\n\n        document.addEventListener('touchmove', this._onMove, false);\n        document.addEventListener('touchend', this._onEnd, false);\n    },\n\n    _onMove: function (e) {\n        if (e.touches.length !== 2) return;\n\n        var p0 = DOM.mousePos(this._el, e.touches[0]),\n            p1 = DOM.mousePos(this._el, e.touches[1]),\n            p = p0.add(p1).div(2),\n            vec = p0.sub(p1),\n            scale = vec.mag() / this._startVec.mag(),\n            bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI,\n            map = this._map;\n\n        // Determine 'intent' by whichever threshold is surpassed first,\n        // then keep that state for the duration of this gesture.\n        if (!this._gestureIntent) {\n            var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold),\n                rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold);\n\n            if (rotatingSignificantly) {\n                this._gestureIntent = 'rotate';\n            } else if (scalingSignificantly) {\n                this._gestureIntent = 'zoom';\n            }\n\n            if (this._gestureIntent) {\n                this._startVec = vec;\n                this._startScale = map.transform.scale;\n                this._startBearing = map.transform.bearing;\n            }\n\n        } else {\n            var param = { duration: 0, around: map.unproject(p) };\n\n            if (this._gestureIntent === 'rotate') {\n                param.bearing = this._startBearing + bearing;\n            }\n            if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') {\n                param.zoom = map.transform.scaleZoom(this._startScale * scale);\n            }\n\n            map.stop();\n            this._drainInertiaBuffer();\n            this._inertia.push([Date.now(), scale, p]);\n\n            map.easeTo(param, { originalEvent: e });\n        }\n\n        e.preventDefault();\n    },\n\n    _onEnd: function (e) {\n        document.removeEventListener('touchmove', this._onMove);\n        document.removeEventListener('touchend', this._onEnd);\n        this._drainInertiaBuffer();\n\n        var inertia = this._inertia,\n            map = this._map;\n\n        if (inertia.length < 2) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        var last = inertia[inertia.length - 1],\n            first = inertia[0],\n            lastScale = map.transform.scaleZoom(this._startScale * last[1]),\n            firstScale = map.transform.scaleZoom(this._startScale * first[1]),\n            scaleOffset = lastScale - firstScale,\n            scaleDuration = (last[0] - first[0]) / 1000,\n            p = last[2];\n\n        if (scaleDuration === 0 || lastScale === firstScale) {\n            map.snapToNorth({}, { originalEvent: e });\n            return;\n        }\n\n        // calculate scale/s speed and adjust for increased initial animation speed when easing\n        var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s\n\n        if (Math.abs(speed) > inertiaMaxSpeed) {\n            if (speed > 0) {\n                speed = inertiaMaxSpeed;\n            } else {\n                speed = -inertiaMaxSpeed;\n            }\n        }\n\n        var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000,\n            targetScale = lastScale + speed * duration / 2000;\n\n        if (targetScale < 0) {\n            targetScale = 0;\n        }\n\n        map.easeTo({\n            zoom: targetScale,\n            duration: duration,\n            easing: inertiaEasing,\n            around: map.unproject(p)\n        }, { originalEvent: e });\n    },\n\n    _drainInertiaBuffer: function() {\n        var inertia = this._inertia,\n            now = Date.now(),\n            cutoff = 160; // msec\n\n        while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift();\n    }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/handler/touch_zoom_rotate.js\n// module id = 1420\n// module chunks = 0 1","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\nvar browser = require('../util/browser');\nvar LngLat = require('../geo/lng_lat');\nvar LngLatBounds = require('../geo/lng_lat_bounds');\nvar Point = require('point-geometry');\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo},\n * controlling the destination's location, zoom level, bearing, and pitch.\n * All properties are optional. Unspecified\n * options will default to the map's current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLatLike} center The destination's center.\n * @property {number} zoom The destination's zoom level.\n * @property {number} bearing The destination's bearing (rotation), measured in degrees counter-clockwise from north.\n * @property {number} pitch The destination's pitch (tilt), measured in degrees.\n * @property {LngLatLike} around If a `zoom` is specified, `around` determines the zoom center (defaults to the center of the map).\n */\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration The animation's duration, measured in milliseconds.\n * @property {Function} easing The animation's easing function.\n * @property {PointLike} offset `x` and `y` coordinates representing the animation's origin of movement relative to the map's center.\n * @property {boolean} animate If `false`, no animation will occur.\n */\n\nvar Camera = module.exports = function() {};\n\nutil.extend(Camera.prototype, /** @lends Map.prototype */{\n    /**\n     * Returns the map's geographical centerpoint.\n     *\n     * @returns {LngLat} The map's geographical centerpoint.\n     */\n    getCenter: function() { return this.transform.center; },\n\n    /**\n     * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.\n     *\n     * @param {LngLatLike} center The centerpoint to set.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * map.setCenter([-74, 38]);\n     */\n    setCenter: function(center, eventData) {\n        this.jumpTo({center: center}, eventData);\n        return this;\n    },\n\n    /**\n     * Pans the map by the specified offest.\n     *\n     * @param {Array<number>} offset `x` and `y` coordinates by which to pan the map.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panBy: function(offset, options, eventData) {\n        this.panTo(this.transform.center,\n            util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Pans the map to the specified location, with an animated transition.\n     *\n     * @param {LngLatLike} lnglat The location to pan the map to.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    panTo: function(lnglat, options, eventData) {\n        return this.easeTo(util.extend({\n            center: lnglat\n        }, options), eventData);\n    },\n\n\n    /**\n     * Returns the map's current zoom level.\n     *\n     * @returns {number} The map's current zoom level.\n     */\n    getZoom: function() { return this.transform.zoom; },\n\n    /**\n     * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.\n     *\n     * @param {number} zoom The zoom level to set (0-20).\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     * @example\n     * // zoom the map to 5\n     * map.setZoom(5);\n     */\n    setZoom: function(zoom, eventData) {\n        this.jumpTo({zoom: zoom}, eventData);\n        return this;\n    },\n\n    /**\n     * Zooms the map to the specified zoom level, with an animated transition.\n     *\n     * @param {number} zoom The zoom level to transition to.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomTo: function(zoom, options, eventData) {\n        return this.easeTo(util.extend({\n            zoom: zoom\n        }, options), eventData);\n    },\n\n    /**\n     * Increases the map's zoom level by 1.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomIn: function(options, eventData) {\n        this.zoomTo(this.getZoom() + 1, options, eventData);\n        return this;\n    },\n\n    /**\n     * Decreases the map's zoom level by 1.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires moveend\n     * @fires zoomend\n     * @returns {Map} `this`\n     */\n    zoomOut: function(options, eventData) {\n        this.zoomTo(this.getZoom() - 1, options, eventData);\n        return this;\n    },\n\n\n    /**\n     * Returns the map's current bearing (rotation).\n     *\n     * @returns {number} The map's current bearing, measured in degrees counter-clockwise from north.\n     */\n    getBearing: function() { return this.transform.bearing; },\n\n    /**\n     * Sets the maps' bearing (rotation). Equivalent to `jumpTo({bearing: bearing})`.\n     *\n     * @param {number} bearing The bearing to set, measured in degrees counter-clockwise from north.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // rotate the map to 90 degrees\n     * map.setBearing(90);\n     */\n    setBearing: function(bearing, eventData) {\n        this.jumpTo({bearing: bearing}, eventData);\n        return this;\n    },\n\n    /**\n     * Rotates the map to the specified bearing, with an animated transition.\n     *\n     * @param {number} bearing The bearing to rotate the map to, measured in degrees counter-clockwise from north.\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    rotateTo: function(bearing, options, eventData) {\n        return this.easeTo(util.extend({\n            bearing: bearing\n        }, options), eventData);\n    },\n\n    /**\n     * Rotates the map to a bearing of 0 (due north), with an animated transition.\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    resetNorth: function(options, eventData) {\n        this.rotateTo(0, util.extend({duration: 1000}, options), eventData);\n        return this;\n    },\n\n    /**\n     * Snaps the map's bearing to 0 (due north), if the current bearing is close enough to it (i.e. within the `bearingSnap` threshold).\n     *\n     * @param {AnimationOptions} [options]\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    snapToNorth: function(options, eventData) {\n        if (Math.abs(this.getBearing()) < this._bearingSnap) {\n            return this.resetNorth(options, eventData);\n        }\n        return this;\n    },\n\n    /**\n     * Returns the map's current pitch (tilt).\n     *\n     * @returns {number} The map's current pitch, measured in degrees away from the plane of the screen.\n     */\n    getPitch: function() { return this.transform.pitch; },\n\n    /**\n     * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`.\n     *\n     * @param {number} pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    setPitch: function(pitch, eventData) {\n        this.jumpTo({pitch: pitch}, eventData);\n        return this;\n    },\n\n\n    /**\n     * Pans and zooms the map to contain its visible area within the specified geographical bounds.\n     *\n     * @param {LngLatBoundsLike} bounds The bounds to fit the visible area into.\n     * @param {Object} [options]\n     * @param {boolean} [options.linear=false] If `true`, the map transitions using\n     *     {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See\n     *     {@link Map#flyTo} for information about the options specific to that animated transition.\n     * @param {Function} [options.easing] An easing function for the animated transition.\n     * @param {number} [options.padding=0] The amount of padding, in pixels, to allow around the specified bounds.\n     * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n     * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    fitBounds: function(bounds, options, eventData) {\n\n        options = util.extend({\n            padding: 0,\n            offset: [0, 0],\n            maxZoom: Infinity\n        }, options);\n\n        bounds = LngLatBounds.convert(bounds);\n\n        var offset = Point.convert(options.offset),\n            tr = this.transform,\n            nw = tr.project(bounds.getNorthWest()),\n            se = tr.project(bounds.getSouthEast()),\n            size = se.sub(nw),\n            scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x,\n            scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n        options.center = tr.unproject(nw.add(se).div(2));\n        options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n        options.bearing = 0;\n\n        return options.linear ?\n            this.easeTo(options, eventData) :\n            this.flyTo(options, eventData);\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, without\n     * an animated transition. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * @param {CameraOptions} options\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    jumpTo: function(options, eventData) {\n        this.stop();\n\n        var tr = this.transform,\n            zoomChanged = false,\n            bearingChanged = false,\n            pitchChanged = false;\n\n        if ('zoom' in options && tr.zoom !== +options.zoom) {\n            zoomChanged = true;\n            tr.zoom = +options.zoom;\n        }\n\n        if ('center' in options) {\n            tr.center = LngLat.convert(options.center);\n        }\n\n        if ('bearing' in options && tr.bearing !== +options.bearing) {\n            bearingChanged = true;\n            tr.bearing = +options.bearing;\n        }\n\n        if ('pitch' in options && tr.pitch !== +options.pitch) {\n            pitchChanged = true;\n            tr.pitch = +options.pitch;\n        }\n\n        this.fire('movestart', eventData)\n            .fire('move', eventData);\n\n        if (zoomChanged) {\n            this.fire('zoomstart', eventData)\n                .fire('zoom', eventData)\n                .fire('zoomend', eventData);\n        }\n\n        if (bearingChanged) {\n            this.fire('rotate', eventData);\n        }\n\n        if (pitchChanged) {\n            this.fire('pitch', eventData);\n        }\n\n        return this.fire('moveend', eventData);\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, with an animated transition\n     * between old and new values. The map will retain its current values for any\n     * details not specified in `options`.\n     *\n     * @param {CameraOptions|AnimationOptions} options Options describing the destination and animation of the transition.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     */\n    easeTo: function(options, eventData) {\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            duration: 500,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch(),\n\n            zoom = 'zoom' in options ? +options.zoom : startZoom,\n            bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n            pitch = 'pitch' in options ? +options.pitch : startPitch,\n\n            toLngLat,\n            toPoint;\n\n        if ('center' in options) {\n            toLngLat = LngLat.convert(options.center);\n            toPoint = tr.centerPoint.add(offset);\n        } else if ('around' in options) {\n            toLngLat = LngLat.convert(options.around);\n            toPoint = tr.locationPoint(toLngLat);\n        } else {\n            toPoint = tr.centerPoint.add(offset);\n            toLngLat = tr.pointLocation(toPoint);\n        }\n\n        var fromPoint = tr.locationPoint(toLngLat);\n\n        if (options.animate === false) options.duration = 0;\n\n        this.zooming = (zoom !== startZoom);\n        this.rotating = (startBearing !== bearing);\n        this.pitching = (pitch !== startPitch);\n\n        if (!options.noMoveStart) {\n            this.fire('movestart', eventData);\n        }\n        if (this.zooming) {\n            this.fire('zoomstart', eventData);\n        }\n\n        clearTimeout(this._onEaseEnd);\n\n        this._ease(function (k) {\n            if (this.zooming) {\n                tr.zoom = interpolate(startZoom, zoom, k);\n            }\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k)));\n\n            this.fire('move', eventData);\n            if (this.zooming) {\n                this.fire('zoom', eventData);\n            }\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            if (options.delayEndEvents) {\n                this._onEaseEnd = setTimeout(this._easeToEnd.bind(this, eventData), options.delayEndEvents);\n            } else {\n                this._easeToEnd(eventData);\n            }\n        }.bind(this), options);\n\n        return this;\n    },\n\n    _easeToEnd: function(eventData) {\n        var wasZooming = this.zooming;\n        this.zooming = false;\n        this.rotating = false;\n        this.pitching = false;\n\n        if (wasZooming) {\n            this.fire('zoomend', eventData);\n        }\n        this.fire('moveend', eventData);\n\n    },\n\n    /**\n     * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that\n     * evokes flight. The animation seamlessly incorporates zooming and panning to help\n     * the user maintain her bearings even after traversing a great distance.\n     *\n     * @param {Object} options Options describing the destination and animation of the transition.\n     *     Accepts [CameraOptions](#CameraOptions), [AnimationOptions](#AnimationOptions),\n     *     and the following additional options.\n     * @param {number} [options.curve=1.42] The zooming \"curve\" that will occur along the\n     *     flight path. A high value maximizes zooming for an exaggerated animation, while a low\n     *     value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average\n     *     value selected by participants in the user study discussed in\n     *     [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n     *     `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n     *     value of 1 would produce a circular motion.\n     * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If\n     *     `options.curve` is specified, this option is ignored.\n     * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to\n     *     `options.curve`. A speed of 1.2 means that the map appears to move along the flight path\n     *     by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.\n     *     It does not correspond to a fixed physical distance, but varies by zoom level.\n     * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls\n     *     per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.\n     * @param {Function} [options.easing] An easing function for the animated transition.\n     * @param {Object} [eventData] Data to propagate to any event listeners.\n     * @fires movestart\n     * @fires zoomstart\n     * @fires move\n     * @fires zoom\n     * @fires rotate\n     * @fires pitch\n     * @fires zoomend\n     * @fires moveend\n     * @returns {Map} `this`\n     * @example\n     * // fly with default options to null island\n     * map.flyTo({center: [0, 0], zoom: 9});\n     * // using flyTo options\n     * map.flyTo({\n     *   center: [0, 0],\n     *   zoom: 9,\n     *   speed: 0.2,\n     *   curve: 1,\n     *   easing: function(t) {\n     *     return t;\n     *   }\n     * });\n     */\n    flyTo: function(options, eventData) {\n        // This method implements an “optimal path” animation, as detailed in:\n        //\n        // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n        //   ’03. pp. 15–22. <https://www.win.tue.nl/~vanwijk/zoompan.pdf#page=5>.\n        //\n        // Where applicable, local variable documentation begins with the associated variable or\n        // function in van Wijk (2003).\n\n        this.stop();\n\n        options = util.extend({\n            offset: [0, 0],\n            speed: 1.2,\n            curve: 1.42,\n            easing: util.ease\n        }, options);\n\n        var tr = this.transform,\n            offset = Point.convert(options.offset),\n            startZoom = this.getZoom(),\n            startBearing = this.getBearing(),\n            startPitch = this.getPitch();\n\n        var center = 'center' in options ? LngLat.convert(options.center) : this.getCenter();\n        var zoom = 'zoom' in options ?  +options.zoom : startZoom;\n        var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n        var pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n        // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n        // interpolating between the two endpoints will cross it.\n        if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) {\n            if (tr.center.lng > 0 && center.lng < 0) {\n                center.lng += 360;\n            } else if (tr.center.lng < 0 && center.lng > 0) {\n                center.lng -= 360;\n            }\n        }\n\n        var scale = tr.zoomScale(zoom - startZoom),\n            from = tr.point,\n            to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from;\n\n        var startWorldSize = tr.worldSize,\n            rho = options.curve,\n\n            // w₀: Initial visible span, measured in pixels at the initial scale.\n            w0 = Math.max(tr.width, tr.height),\n            // w₁: Final visible span, measured in pixels with respect to the initial scale.\n            w1 = w0 / scale,\n            // Length of the flight path as projected onto the ground plane, measured in pixels from\n            // the world image origin at the initial scale.\n            u1 = to.sub(from).mag();\n\n        if ('minZoom' in options) {\n            var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n            // w<sub>m</sub>: Maximum visible span, measured in pixels with respect to the initial\n            // scale.\n            var wMax = w0 / tr.zoomScale(minZoom - startZoom);\n            rho = Math.sqrt(wMax / u1 * 2);\n        }\n\n        // ρ²\n        var rho2 = rho * rho;\n\n        /**\n         * rᵢ: Returns the zoom-out factor at one end of the animation.\n         *\n         * @param i 0 for the ascent or 1 for the descent.\n         * @private\n         */\n        function r(i) {\n            var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n            return Math.log(Math.sqrt(b * b + 1) - b);\n        }\n\n        function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n        function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n        function tanh(n) { return sinh(n) / cosh(n); }\n\n        // r₀: Zoom-out factor during ascent.\n        var r0 = r(0),\n            /**\n             * w(s): Returns the visible span on the ground, measured in pixels with respect to the\n             * initial scale.\n             *\n             * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n             * @private\n             */\n            w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n            /**\n             * u(s): Returns the distance along the flight path as projected onto the ground plane,\n             * measured in pixels from the world image origin at the initial scale.\n             * @private\n             */\n            u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n            // S: Total length of the flight path, measured in ρ-screenfuls.\n            S = (r(1) - r0) / rho;\n\n        // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n        if (Math.abs(u1) < 0.000001) {\n            // Perform a more or less instantaneous transition if the path is too short.\n            if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options);\n\n            var k = w1 < w0 ? -1 : 1;\n            S = Math.abs(Math.log(w1 / w0)) / rho;\n\n            u = function() { return 0; };\n            w = function(s) { return Math.exp(k * rho * s); };\n        }\n\n        if ('duration' in options) {\n            options.duration = +options.duration;\n        } else {\n            var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n            options.duration = 1000 * S / V;\n        }\n\n        this.zooming = true;\n        if (startBearing !== bearing) this.rotating = true;\n        if (startPitch !== pitch) this.pitching = true;\n\n        this.fire('movestart', eventData);\n        this.fire('zoomstart', eventData);\n\n        this._ease(function (k) {\n            // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n            var s = k * S,\n                us = u(s);\n\n            tr.zoom = startZoom + tr.scaleZoom(1 / w(s));\n            tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize);\n\n            if (this.rotating) {\n                tr.bearing = interpolate(startBearing, bearing, k);\n            }\n            if (this.pitching) {\n                tr.pitch = interpolate(startPitch, pitch, k);\n            }\n\n            this.fire('move', eventData);\n            this.fire('zoom', eventData);\n            if (this.rotating) {\n                this.fire('rotate', eventData);\n            }\n            if (this.pitching) {\n                this.fire('pitch', eventData);\n            }\n        }, function() {\n            this.zooming = false;\n            this.rotating = false;\n            this.pitching = false;\n\n            this.fire('zoomend', eventData);\n            this.fire('moveend', eventData);\n        }, options);\n\n        return this;\n    },\n\n    isEasing: function() {\n        return !!this._abortFn;\n    },\n\n    /**\n     * Stops any animated transition underway.\n     *\n     * @returns {Map} `this`\n     */\n    stop: function() {\n        if (this._abortFn) {\n            this._abortFn();\n            this._finishEase();\n        }\n        return this;\n    },\n\n    _ease: function(frame, finish, options) {\n        this._finishFn = finish;\n        this._abortFn = browser.timed(function (t) {\n            frame.call(this, options.easing(t));\n            if (t === 1) {\n                this._finishEase();\n            }\n        }, options.animate === false ? 0 : options.duration, this);\n    },\n\n    _finishEase: function() {\n        delete this._abortFn;\n        // The finish function might emit events which trigger new eases, which\n        // set a new _finishFn. Ensure we don't delete it unintentionally.\n        var finish = this._finishFn;\n        delete this._finishFn;\n        finish.call(this);\n    },\n\n    // convert bearing so that it's numerically close to the current one so that it interpolates properly\n    _normalizeBearing: function(bearing, currentBearing) {\n        bearing = util.wrap(bearing, -180, 180);\n        var diff = Math.abs(bearing - currentBearing);\n        if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n        if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n        return bearing;\n    },\n\n    _updateEasing: function(duration, zoom, bezier) {\n        var easing;\n\n        if (this.ease) {\n            var ease = this.ease,\n                t = (Date.now() - ease.start) / ease.duration,\n                speed = ease.easing(t + 0.01) - ease.easing(t),\n\n                // Quick hack to make new bezier that is continuous with last\n                x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n                y = Math.sqrt(0.27 * 0.27 - x * x);\n\n            easing = util.bezier(x, y, 0.25, 1);\n        } else {\n            easing = bezier ? util.bezier.apply(util, bezier) : util.ease;\n        }\n\n        // store information on current easing\n        this.ease = {\n            start: (new Date()).getTime(),\n            to: Math.pow(2, zoom),\n            duration: duration,\n            easing: easing\n        };\n\n        return easing;\n    }\n});\n\n/**\n * Fired whenever the map's pitch (tilt) changes.\n *\n * @event pitch\n * @memberof Map\n * @instance\n * @property {MapEventData} data\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/camera.js\n// module id = 1421\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Navigation;\n\n/**\n * A `Navigation` control contains zoom buttons and a compass.\n * Extends [`Control`](#Control).\n *\n * @class Navigation\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * var nav = new mapboxgl.Navigation({position: 'top-left'}); // position is optional\n * map.addControl(nav);\n */\nfunction Navigation(options) {\n    util.setOptions(this, options);\n}\n\nNavigation.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map));\n        this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map));\n        this._compass = this._createButton(className + '-icon ' + className + '-compass', map.resetNorth.bind(map));\n\n        this._compassArrow = DOM.create('div', 'arrow', this._compass);\n\n        this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n        this._onCompassMove = this._onCompassMove.bind(this);\n        this._onCompassUp = this._onCompassUp.bind(this);\n\n        map.on('rotate', this._rotateCompassArrow.bind(this));\n        this._rotateCompassArrow();\n\n        this._el = map.getCanvasContainer();\n\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onCompassDown: function(e) {\n        if (e.button !== 0) return;\n\n        DOM.disableDrag();\n        document.addEventListener('mousemove', this._onCompassMove);\n        document.addEventListener('mouseup', this._onCompassUp);\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassMove: function(e) {\n        if (e.button !== 0) return;\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _onCompassUp: function(e) {\n        if (e.button !== 0) return;\n\n        document.removeEventListener('mousemove', this._onCompassMove);\n        document.removeEventListener('mouseup', this._onCompassUp);\n        DOM.enableDrag();\n\n        this._el.dispatchEvent(copyMouseEvent(e));\n        e.stopPropagation();\n    },\n\n    _createButton: function(className, fn) {\n        var a = DOM.create('button', className, this._container);\n        a.type = 'button';\n        a.addEventListener('click', function() { fn(); });\n        return a;\n    },\n\n    _rotateCompassArrow: function() {\n        var rotate = 'rotate(' + (this._map.transform.angle * (180 / Math.PI)) + 'deg)';\n        this._compassArrow.style.transform = rotate;\n    }\n});\n\n\nfunction copyMouseEvent(e) {\n    return new MouseEvent(e.type, {\n        button: 2,    // right click\n        buttons: 2,   // right click\n        bubbles: true,\n        cancelable: true,\n        detail: e.detail,\n        view: e.view,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        movementX: e.movementX,\n        movementY: e.movementY,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey\n    });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/control/navigation.js\n// module id = 1422\n// module chunks = 0 1","'use strict';\n\nvar Control = require('./control');\nvar browser = require('../../util/browser');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Geolocate;\n\nvar geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };\n\n\n/**\n * A `Geolocate` control provides a button that uses the browser's geolocation\n * API to locate the user on the map. Extends [`Control`](#Control).\n *\n * @class Geolocate\n * @param {Object} [options]\n * @param {string} [options.position='top-right'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @example\n * map.addControl(new mapboxgl.Geolocate({position: 'top-left'})); // position is optional\n */\nfunction Geolocate(options) {\n    util.setOptions(this, options);\n}\n\nGeolocate.prototype = util.inherit(Control, {\n    options: {\n        position: 'top-right'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl';\n\n        var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n        if (!browser.supportsGeolocation) return container;\n\n        this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n        this._geolocateButton = DOM.create('button', (className + '-icon ' + className + '-geolocate'), this._container);\n        this._geolocateButton.type = 'button';\n        this._geolocateButton.addEventListener('click', this._onClickGeolocate.bind(this));\n        return container;\n    },\n\n    _onContextMenu: function(e) {\n        e.preventDefault();\n    },\n\n    _onClickGeolocate: function() {\n        navigator.geolocation.getCurrentPosition(this._success.bind(this), this._error.bind(this), geoOptions);\n\n        // This timeout ensures that we still call finish() even if\n        // the user declines to share their location in Firefox\n        this._timeoutId = setTimeout(this._finish.bind(this), 10000 /* 10sec */);\n    },\n\n    _success: function(position) {\n        this._map.jumpTo({\n            center: [position.coords.longitude, position.coords.latitude],\n            zoom: 17,\n            bearing: 0,\n            pitch: 0\n        });\n\n        this.fire('geolocate', position);\n        this._finish();\n    },\n\n    _error: function(error) {\n        this.fire('error', error);\n        this._finish();\n    },\n\n    _finish: function() {\n        if (this._timeoutId) { clearTimeout(this._timeoutId); }\n        this._timeoutId = undefined;\n    }\n\n});\n\n/**\n * geolocate event.\n *\n * @event geolocate\n * @memberof Geolocate\n * @instance\n * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n\n/**\n * error event.\n *\n * @event error\n * @memberof Geolocate\n * @instance\n * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/control/geolocate.js\n// module id = 1423\n// module chunks = 0 1","'use strict';\nvar util = require('../../util/util');\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\n\nmodule.exports = Scale;\n\n/**\n * A `Scale` control displays the ratio of a distance on the map to the corresponding distance on the ground.\n * Extends [`Control`](#Control).\n *\n * @class Scale\n * @param {Object} [options]\n * @param {string} [options.position='bottom-left'] A string indicating the control's position on the map. Options are `'top-right'`, `'top-left'`, `'bottom-right'`, and `'bottom-left'`.\n * @param {number} [options.maxWidth='150'] The maximum length of the scale control in pixels.\n * @example\n * map.addControl(new mapboxgl.Scale({position: 'top-left'})); // position is optional\n * map.addControl(new mapboxgl.Scale({maxWidth: 80})); //maxWidth is optional\n */\nfunction Scale(options) {\n    util.setOptions(this, options);\n}\n\nScale.prototype = util.inherit(Control, {\n    options: {\n        position: 'bottom-left'\n    },\n\n    onAdd: function(map) {\n        var className = 'mapboxgl-ctrl-scale',\n            container = this._container = DOM.create('div', className, map.getContainer()),\n            options = this.options;\n\n        updateScale(map, container, options);\n        map.on('move', function() {\n            updateScale(map, container, options);\n        });\n\n        return container;\n    }\n});\n\nfunction updateScale(map, scale, options) {\n    // A horizontal scale is imagined to be present at center of the map\n    // container with maximum length (Default) as 100px.\n    // Using spherical law of cosines approximation, the real distance is\n    // found between the two coordinates.\n    var maxWidth = options && options.maxWidth || 100;\n\n    var y = map._container.clientHeight / 2;\n    var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y]));\n\n    // The real distance corresponding to 100px scale length is rounded off to\n    // near pretty number and the scale length for the same is found out.\n    var meters = getRoundNum(maxMeters);\n    var ratio = meters / maxMeters;\n    scale.style.width = maxWidth * ratio + 'px';\n    scale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\n}\n\nfunction getDistance(latlng1, latlng2) {\n    // Uses spherical law of cosines approximation.\n    var R = 6371000;\n\n    var rad = Math.PI / 180,\n        lat1 = latlng1.lat * rad,\n        lat2 = latlng2.lat * rad,\n        a = Math.sin(lat1) * Math.sin(lat2) +\n          Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n    var maxMeters = R * Math.acos(Math.min(a, 1));\n    return maxMeters;\n\n}\n\nfunction getRoundNum(num) {\n    var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n        d = num / pow10;\n\n    d = d >= 10 ? 10 :\n        d >= 5 ? 5 :\n        d >= 3 ? 3 :\n        d >= 2 ? 2 : 1;\n\n    return pow10 * d;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/control/scale.js\n// module id = 1424\n// module chunks = 0 1","/* eslint-disable */\n'use strict';\n\nmodule.exports = Marker;\n\nvar DOM = require('../util/dom');\nvar util = require('../util/util');\nvar LngLat = require('../geo/lng_lat');\nvar Point = require('point-geometry');\nvar Popup = require('./popup');\n\n/**\n * Creates a marker component\n * @class Marker\n * @param {HTMLElement=} element DOM element to use as a marker (creates a div element by default)\n * @param {Object=} options\n * @param {PointLike=} options.offset The offset in pixels as a [`PointLike`](#PointLike) object to apply relative to the element's top left corner. Negatives indicate left and up.\n * @example\n * var marker = new mapboxgl.Marker()\n *   .setLngLat([30.5, 50.5])\n *   .addTo(map);\n */\nfunction Marker(element, options) {\n    if (!element) {\n        element = DOM.create('div');\n    }\n    element.classList.add('mapboxgl-marker');\n    this._el = element;\n\n    this._offset = Point.convert(options && options.offset || [0, 0]);\n\n    this._update = this._update.bind(this);\n}\n\nMarker.prototype = {\n    /**\n     * Attaches the marker to a map\n     * @param {Map} map\n     * @returns {Marker} `this`\n     */\n    addTo: function (map) {\n        this.remove();\n        this._map = map;\n        map.getCanvasContainer().appendChild(this._el);\n        map.on('move', this._update);\n        this._update();\n        return this;\n    },\n\n    /**\n     * Removes the marker from a map\n     * @example\n     * var marker = new mapboxgl.Marker().addTo(map);\n     * marker.remove();\n     * @returns {Marker} `this`\n     */\n    remove: function () {\n        if (this._map) {\n            this._map.off('move', this._update);\n            this._map = null;\n        }\n        var parent = this._el.parentNode;\n        if (parent) parent.removeChild(this._el);\n        if (this._popup) this._closePopup();\n        return this;\n    },\n\n    /**\n     * Get the marker's geographical location\n     * @returns {LngLat}\n     */\n    getLngLat: function () {\n        return this._lngLat;\n    },\n\n    /**\n     * Set the marker's geographical position and move it.\n     * @param {LngLat} lnglat\n     * @returns {Marker} `this`\n     */\n    setLngLat: function (lnglat) {\n        this._lngLat = LngLat.convert(lnglat);\n        if (this._popup) this._popup.setLngLat(this._lngLat);\n        this._update();\n        return this;\n    },\n\n    getElement: function () {\n        return this._el;\n    },\n\n    /**\n     * Binds a Popup to the Marker\n     * @param {Popup=} popup an instance of the `Popup` class. If undefined or null, any popup \n     * set on this `Marker` instance is unset\n     * @returns {Marker} `this`\n     */\n\n    setPopup: function (popup) {\n        if (popup == null) {\n            this._closePopup();\n            delete this._popupHandlersAdded;\n            delete this._popup;\n        } else if (popup instanceof Popup) {\n            this._popup = popup;\n        } else {\n            util.warnOnce('Marker.setPopup only accepts an instance of the Popup class as an argument. If no argument is provided, the popup is unset from this Marker instance');\n        }\n\n        if (this._popup && this._lngLat) this._popup.setLngLat(this._lngLat);\n\n        if (!this._popupHandlersAdded) {\n            this.getElement().addEventListener('click', this._openPopup.bind(this));\n            this._popupHandlersAdded = true;\n        }\n        return this;\n    },\n\n    /**\n     * Returns the Popup instance that is bound to the Marker\n     * @returns {Popup} popup\n     */\n    getPopup: function () {\n        return this._popup;\n    },\n\n    /**\n     * Opens or closes the bound popup, depending on the current state\n     * @returns {Marker} `this`\n     */\n    togglePopup: function () {\n        if (this._popup) {\n            if (this._popup._map) {\n                this._closePopup();\n            } else {\n                this._openPopup();\n            }\n        }\n    },\n\n    _openPopup: function (e) {\n        // prevent event from bubbling up to the map canvas\n        e.stopPropagation();\n\n        if (!this._popup || !this._map) return;\n\n        if (!this._popup._map) {\n            this._popup.addTo(this._map);\n        }\n\n        return this;\n    },\n\n    _closePopup: function () {\n        if (this._popup) {\n            this._popup.remove();\n        }\n\n        return this;\n    },\n\n    _update: function () {\n        if (!this._map) return;\n        var pos = this._map.project(this._lngLat)._add(this._offset);\n        DOM.setTransform(this._el, 'translate(' + pos.x + 'px,' + pos.y + 'px)');\n    }\n};\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/mapbox-gl/js/ui/marker.js\n// module id = 1425\n// module chunks = 0 1","import React from 'react';\n\nimport GridReportActions from '../actions/grid_report_actions';\n\nexport default class VisualizationButton extends React.Component<any, any> {\n  render() {\n    return (\n      <button className=\"visualization-button\" onClick={GridReportActions.toggleVisualizations} >\n          <span className={`icon-righthead-3 ${ this.props.isVisible ? 'active' : ''}`}></span>\n          <h3>Visualization</h3>\n      </button>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/visualization_button.tsx","import React from 'react';\nimport { Dropdown } from '@opengov/ovid';\nimport ShareList from './share/share_links';\nimport SharedLinkHelper from './share/shared_link_helper';\nimport GridHelpMenu from './header_actions/grid_help_menu';\nimport GridReportActions from './actions/grid_report_actions';\nimport ShareOptions from './share/share_options';\nimport GridDownMenu from './header_actions/grid_download_menu/';\nimport TransparencyLoginButton from './TransparencyLoginButton';\n\nimport createReactClass from 'create-react-class';\n\nconst HeaderActions = createReactClass<any, any>({\n  getInitialState() {\n    return {\n      renderedDownloads: false,\n      linkHelper: null\n    };\n  },\n\n  render() {\n    const { headerOptions } = this.props;\n    const content = headerOptions && headerOptions.entity && this.state.linkHelper ?\n      (\n      [\n        <Dropdown\n            title=\"Download\"\n            position=\"align-right\"\n            dropdownClass=\"ui-nav-bar__item\"\n            toggleClass=\"ui-button small ghost no-color\"\n            ignoreContentClicks\n            key=\"download\">\n            <GridDownMenu\n              {...this.props}\n              fiscalYears={headerOptions.downloads.fiscalYears}\n              fullDataSet={headerOptions.downloads.fullDataSet}\n              showExportFilter={headerOptions.showExportFilter}\n              isLoading={headerOptions.downloads.isLoading}\n              report={this.props.report} />\n          </Dropdown>,\n          (!this.props.embedded &&\n            <TransparencyLoginButton\n              entityId={headerOptions.entity.id}\n              key=\"login\"\n              transparencyUrl={gon && gon.entity && gon.entity.transparency_url}\n            />\n          ),\n          <Dropdown\n            title=\"Help\"\n            position=\"align-right\"\n            targetClass=\"ui-dropdown__target help-menu\"\n            dropdownClass=\"ui-nav-bar__item\"\n            toggleClass=\"ui-button small ghost no-color\"\n            key=\"help\">\n            <GridHelpMenu entity={headerOptions.entity}\n              showHowTo={!headerOptions.showHowToModal}\n              showWelcome={!this.props.embedded} />\n          </Dropdown>,\n          (this.props.embedded ?\n            this.props.showShareMenu ?\n              <ShareOptions key=\"options\" report={this.props.report} />\n            : null\n          :\n            <Dropdown\n              title=\"Share\"\n              position=\"align-right\"\n              dropdownClass=\"ui-nav-bar__item\"\n              toggleClass=\"ui-button small no-color\"\n              key=\"share\">\n              <ShareList linkHelper={this.state.linkHelper} />\n            </Dropdown>\n          )\n      ]\n      ) : null;\n\n    return (\n      <header>\n        <nav aria-label=\"Header menu\" className=\"ui-main__actions ui-nav-bar\" style={this.props.embed === 'y' ? { width: '100%' } : null}>\n          {content}\n        </nav>\n      </header>\n    );\n  },\n  componentWillReceiveProps(nextProps) {\n    if (this.state.linkHelper === null && nextProps.headerOptions.entity) {\n      this.setState({ linkHelper: SharedLinkHelper.create(nextProps.headerOptions.entity)});\n    }\n  },\n  componentDidMount() {\n    GridReportActions.setDownloadsLoading();\n  }\n});\n\nexport default HeaderActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/grid_header_actions.tsx","import React from 'react';\nimport ReportActions from '../actions/report_actions';\nimport GridReportActions from '../actions/grid_report_actions';\n\nclass GridHelpMenu extends React.Component<any, any> {\n  handleOpenHowTo = (e) => {\n    e.preventDefault();\n    GridReportActions.showHowToModal();\n  }\n\n  handleOpenFeedback = (e) => {\n    e.preventDefault();\n    ReportActions.showFeedback();\n  }\n\n  handleOpenWelcome = (e) => {\n    e.preventDefault();\n    // Forgive me for my hacky and sinful JavaScript ways...\n    // Emergency Hack for Tallahassee to show Summary Welcome instead of Grid Welcome\n    // nope.\n    const isTallahasseeFl = this.props.entity && this.props.entity.get('subdomain') === 'tallahasseefl';\n    if (isTallahasseeFl) {\n      ReportActions.showWelcomeModal();\n    } else {\n      GridReportActions.showWelcomeModal();\n    }\n  }\n\n  handleOpenBudget101 = (e) => {\n    e.preventDefault();\n    GridReportActions.showBudget101();\n  }\n\n  entityHasWelcomeDisabled = () => {\n    return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1\n  }\n\n  render() {\n    return (\n      <ul className=\"ui-dropdown__list\">\n        {this.props.showHowTo &&\n          <li>\n            <button id=\"howto\" className=\"modal__open\" data-modal=\"checkbook_howto\" onClick={this.handleOpenHowTo}>How to use this report</button>\n          </li>\n        }\n        {this.props.showWelcome && !this.entityHasWelcomeDisabled() &&\n          <li>\n            <button id=\"welcome\" className=\"modal__open\" data-modal=\"welcome\" onClick={this.handleOpenWelcome}>View welcome message</button>\n          </li>\n        }\n        {(!!this.props.entity.attributes && !!this.props.entity.attributes.budget_101) &&\n          <li>\n            <button id=\"budget101\" className=\"modal__open\" onClick={this.handleOpenBudget101}>Multi-Fund Accounting 101</button>\n          </li>\n        }\n        <li>\n          <button id=\"entity-feedback-help\"\n            className=\"modal__open\"\n            data-modal=\"feedback\" onClick={this.handleOpenFeedback}>\n            Contact {this.props.entity.get('display_name')}\n          </button>\n        </li>\n      </ul>\n    );\n  }\n}\n\nexport default GridHelpMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_help_menu.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = undefined;\n\nvar _TetherComponent = require('./TetherComponent');\n\nvar _TetherComponent2 = _interopRequireDefault(_TetherComponent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _TetherComponent2.default;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-tether/lib/react-tether.js\n// module id = 1429\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _tether = require('tether');\n\nvar _tether2 = _interopRequireDefault(_tether);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nif (!_tether2.default) {\n  console.error('It looks like Tether has not been included. Please load this dependency first https://github.com/HubSpot/tether');\n}\n\nvar renderElementToPropTypes = [_propTypes2.default.string, _propTypes2.default.shape({\n  appendChild: _propTypes2.default.func.isRequired\n})];\n\nvar childrenPropType = function childrenPropType(_ref, propName, componentName) {\n  var children = _ref.children;\n\n  var childCount = _react.Children.count(children);\n  if (childCount <= 0) {\n    return new Error(componentName + ' expects at least one child to use as the target element.');\n  } else if (childCount > 2) {\n    return new Error('Only a max of two children allowed in ' + componentName + '.');\n  }\n};\n\nvar attachmentPositions = ['auto auto', 'top left', 'top center', 'top right', 'middle left', 'middle center', 'middle right', 'bottom left', 'bottom center', 'bottom right'];\n\nvar TetherComponent = function (_Component) {\n  _inherits(TetherComponent, _Component);\n\n  function TetherComponent() {\n    var _ref2;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, TetherComponent);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = TetherComponent.__proto__ || Object.getPrototypeOf(TetherComponent)).call.apply(_ref2, [this].concat(args))), _this), _this._targetNode = null, _this._elementParentNode = null, _this._tether = false, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(TetherComponent, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this._targetNode = _reactDom2.default.findDOMNode(this);\n      this._update();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      this._targetNode = _reactDom2.default.findDOMNode(this);\n      this._update();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this._destroy();\n    }\n  }, {\n    key: 'getTetherInstance',\n    value: function getTetherInstance() {\n      return this._tether;\n    }\n  }, {\n    key: 'disable',\n    value: function disable() {\n      this._tether.disable();\n    }\n  }, {\n    key: 'enable',\n    value: function enable() {\n      this._tether.enable();\n    }\n  }, {\n    key: 'on',\n    value: function on(event, handler, ctx) {\n      this._tether.on(event, handler, ctx);\n    }\n  }, {\n    key: 'once',\n    value: function once(event, handler, ctx) {\n      this._tether.once(event, handler, ctx);\n    }\n  }, {\n    key: 'off',\n    value: function off(event, handler) {\n      this._tether.off(event, handler);\n    }\n  }, {\n    key: 'position',\n    value: function position() {\n      this._tether.position();\n    }\n  }, {\n    key: '_registerEventListeners',\n    value: function _registerEventListeners() {\n      var _this2 = this,\n          _arguments = arguments;\n\n      this.on('update', function () {\n        return _this2.props.onUpdate && _this2.props.onUpdate.apply(_this2, _arguments);\n      });\n\n      this.on('repositioned', function () {\n        return _this2.props.onRepositioned && _this2.props.onRepositioned.apply(_this2, _arguments);\n      });\n    }\n  }, {\n    key: '_destroy',\n    value: function _destroy() {\n      if (this._elementParentNode) {\n        _reactDom2.default.unmountComponentAtNode(this._elementParentNode);\n        this._elementParentNode.parentNode.removeChild(this._elementParentNode);\n      }\n\n      if (this._tether) {\n        this._tether.destroy();\n      }\n\n      this._elementParentNode = null;\n      this._tether = null;\n    }\n  }, {\n    key: '_update',\n    value: function _update() {\n      var _this3 = this;\n\n      var _props = this.props,\n          children = _props.children,\n          renderElementTag = _props.renderElementTag;\n\n      var elementComponent = _react.Children.toArray(children)[1];\n\n      // if no element component provided, bail out\n      if (!elementComponent) {\n        // destroy Tether element if it has been created\n        if (this._tether) {\n          this._destroy();\n        }\n        return;\n      }\n\n      // create element node container if it hasn't been yet\n      if (!this._elementParentNode) {\n        // create a node that we can stick our content Component in\n        this._elementParentNode = document.createElement(renderElementTag);\n\n        // append node to the render node\n        this._renderNode.appendChild(this._elementParentNode);\n      }\n\n      // render element component into the DOM\n      _reactDom2.default.unstable_renderSubtreeIntoContainer(this, elementComponent, this._elementParentNode, function () {\n        // if we're not destroyed, update Tether once the subtree has finished rendering\n        if (_this3._elementParentNode) {\n          _this3._updateTether();\n        }\n      });\n    }\n  }, {\n    key: '_updateTether',\n    value: function _updateTether() {\n      var _this4 = this;\n\n      var _props2 = this.props,\n          children = _props2.children,\n          renderElementTag = _props2.renderElementTag,\n          renderElementTo = _props2.renderElementTo,\n          id = _props2.id,\n          className = _props2.className,\n          style = _props2.style,\n          options = _objectWithoutProperties(_props2, ['children', 'renderElementTag', 'renderElementTo', 'id', 'className', 'style']);\n\n      var tetherOptions = _extends({\n        target: this._targetNode,\n        element: this._elementParentNode\n      }, options);\n\n      if (id) {\n        this._elementParentNode.id = id;\n      }\n\n      if (className) {\n        this._elementParentNode.className = className;\n      }\n\n      if (style) {\n        Object.keys(style).forEach(function (key) {\n          _this4._elementParentNode.style[key] = style[key];\n        });\n      }\n\n      if (!this._tether) {\n        this._tether = new _tether2.default(tetherOptions);\n        this._registerEventListeners();\n      } else {\n        this._tether.setOptions(tetherOptions);\n      }\n\n      this._tether.position();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return _react.Children.toArray(this.props.children)[0];\n    }\n  }, {\n    key: '_renderNode',\n    get: function get() {\n      var renderElementTo = this.props.renderElementTo;\n\n      if (typeof renderElementTo === 'string') {\n        return document.querySelector(renderElementTo);\n      } else {\n        return renderElementTo || document.body;\n      }\n    }\n  }]);\n\n  return TetherComponent;\n}(_react.Component);\n\nTetherComponent.propTypes = {\n  renderElementTag: _propTypes2.default.string,\n  renderElementTo: _propTypes2.default.oneOfType(renderElementToPropTypes),\n  attachment: _propTypes2.default.oneOf(attachmentPositions).isRequired,\n  targetAttachment: _propTypes2.default.oneOf(attachmentPositions),\n  offset: _propTypes2.default.string,\n  targetOffset: _propTypes2.default.string,\n  targetModifier: _propTypes2.default.string,\n  enabled: _propTypes2.default.bool,\n  classes: _propTypes2.default.object,\n  classPrefix: _propTypes2.default.string,\n  optimizations: _propTypes2.default.object,\n  constraints: _propTypes2.default.array,\n  id: _propTypes2.default.string,\n  className: _propTypes2.default.string,\n  style: _propTypes2.default.object,\n  onUpdate: _propTypes2.default.func,\n  onRepositioned: _propTypes2.default.func,\n  children: childrenPropType\n};\nTetherComponent.defaultProps = {\n  renderElementTag: 'div',\n  renderElementTo: null\n};\nexports.default = TetherComponent;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-tether/lib/TetherComponent.js\n// module id = 1430\n// module chunks = 0 1","/*! tether 1.4.7 */\n\n(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define([], factory);\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.Tether = factory();\n  }\n}(this, function() {\n\n'use strict';\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar TetherBase = undefined;\nif (typeof TetherBase === 'undefined') {\n  TetherBase = { modules: [] };\n}\n\nvar zeroElement = null;\n\n// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets\n// if the element lies within a nested document (<frame> or <iframe>-like).\nfunction getActualBoundingClientRect(node) {\n  var boundingRect = node.getBoundingClientRect();\n\n  // The original object returned by getBoundingClientRect is immutable, so we clone it\n  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9\n  var rect = {};\n  for (var k in boundingRect) {\n    rect[k] = boundingRect[k];\n  }\n\n  try {\n    if (node.ownerDocument !== document) {\n      var _frameElement = node.ownerDocument.defaultView.frameElement;\n      if (_frameElement) {\n        var frameRect = getActualBoundingClientRect(_frameElement);\n        rect.top += frameRect.top;\n        rect.bottom += frameRect.top;\n        rect.left += frameRect.left;\n        rect.right += frameRect.left;\n      }\n    }\n  } catch (err) {\n    // Ignore \"Access is denied\" in IE11/Edge\n  }\n\n  return rect;\n}\n\nfunction getScrollParents(el) {\n  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n  var computedStyle = getComputedStyle(el) || {};\n  var position = computedStyle.position;\n  var parents = [];\n\n  if (position === 'fixed') {\n    return [el];\n  }\n\n  var parent = el;\n  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {\n    var style = undefined;\n    try {\n      style = getComputedStyle(parent);\n    } catch (err) {}\n\n    if (typeof style === 'undefined' || style === null) {\n      parents.push(parent);\n      return parents;\n    }\n\n    var _style = style;\n    var overflow = _style.overflow;\n    var overflowX = _style.overflowX;\n    var overflowY = _style.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {\n        parents.push(parent);\n      }\n    }\n  }\n\n  parents.push(el.ownerDocument.body);\n\n  // If the node is within a frame, account for the parent window scroll\n  if (el.ownerDocument !== document) {\n    parents.push(el.ownerDocument.defaultView);\n  }\n\n  return parents;\n}\n\nvar uniqueId = (function () {\n  var id = 0;\n  return function () {\n    return ++id;\n  };\n})();\n\nvar zeroPosCache = {};\nvar getOrigin = function getOrigin() {\n  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of\n  // jitter as the user scrolls that messes with our ability to detect if two positions\n  // are equivilant or not.  We place an element at the top left of the page that will\n  // get the same jitter, so we can cancel the two out.\n  var node = zeroElement;\n  if (!node || !document.body.contains(node)) {\n    node = document.createElement('div');\n    node.setAttribute('data-tether-id', uniqueId());\n    extend(node.style, {\n      top: 0,\n      left: 0,\n      position: 'absolute'\n    });\n\n    document.body.appendChild(node);\n\n    zeroElement = node;\n  }\n\n  var id = node.getAttribute('data-tether-id');\n  if (typeof zeroPosCache[id] === 'undefined') {\n    zeroPosCache[id] = getActualBoundingClientRect(node);\n\n    // Clear the cache when this position call is done\n    defer(function () {\n      delete zeroPosCache[id];\n    });\n  }\n\n  return zeroPosCache[id];\n};\n\nfunction removeUtilElements() {\n  if (zeroElement) {\n    document.body.removeChild(zeroElement);\n  }\n  zeroElement = null;\n};\n\nfunction getBounds(el) {\n  var doc = undefined;\n  if (el === document) {\n    doc = document;\n    el = document.documentElement;\n  } else {\n    doc = el.ownerDocument;\n  }\n\n  var docEl = doc.documentElement;\n\n  var box = getActualBoundingClientRect(el);\n\n  var origin = getOrigin();\n\n  box.top -= origin.top;\n  box.left -= origin.left;\n\n  if (typeof box.width === 'undefined') {\n    box.width = document.body.scrollWidth - box.left - box.right;\n  }\n  if (typeof box.height === 'undefined') {\n    box.height = document.body.scrollHeight - box.top - box.bottom;\n  }\n\n  box.top = box.top - docEl.clientTop;\n  box.left = box.left - docEl.clientLeft;\n  box.right = doc.body.clientWidth - box.width - box.left;\n  box.bottom = doc.body.clientHeight - box.height - box.top;\n\n  return box;\n}\n\nfunction getOffsetParent(el) {\n  return el.offsetParent || document.documentElement;\n}\n\nvar _scrollBarSize = null;\nfunction getScrollBarSize() {\n  if (_scrollBarSize) {\n    return _scrollBarSize;\n  }\n  var inner = document.createElement('div');\n  inner.style.width = '100%';\n  inner.style.height = '200px';\n\n  var outer = document.createElement('div');\n  extend(outer.style, {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    pointerEvents: 'none',\n    visibility: 'hidden',\n    width: '200px',\n    height: '150px',\n    overflow: 'hidden'\n  });\n\n  outer.appendChild(inner);\n\n  document.body.appendChild(outer);\n\n  var widthContained = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var widthScroll = inner.offsetWidth;\n\n  if (widthContained === widthScroll) {\n    widthScroll = outer.clientWidth;\n  }\n\n  document.body.removeChild(outer);\n\n  var width = widthContained - widthScroll;\n\n  _scrollBarSize = { width: width, height: width };\n  return _scrollBarSize;\n}\n\nfunction extend() {\n  var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n  var args = [];\n\n  Array.prototype.push.apply(args, arguments);\n\n  args.slice(1).forEach(function (obj) {\n    if (obj) {\n      for (var key in obj) {\n        if (({}).hasOwnProperty.call(obj, key)) {\n          out[key] = obj[key];\n        }\n      }\n    }\n  });\n\n  return out;\n}\n\nfunction removeClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    name.split(' ').forEach(function (cls) {\n      if (cls.trim()) {\n        el.classList.remove(cls);\n      }\n    });\n  } else {\n    var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');\n    var className = getClassName(el).replace(regex, ' ');\n    setClassName(el, className);\n  }\n}\n\nfunction addClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    name.split(' ').forEach(function (cls) {\n      if (cls.trim()) {\n        el.classList.add(cls);\n      }\n    });\n  } else {\n    removeClass(el, name);\n    var cls = getClassName(el) + (' ' + name);\n    setClassName(el, cls);\n  }\n}\n\nfunction hasClass(el, name) {\n  if (typeof el.classList !== 'undefined') {\n    return el.classList.contains(name);\n  }\n  var className = getClassName(el);\n  return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);\n}\n\nfunction getClassName(el) {\n  // Can't use just SVGAnimatedString here since nodes within a Frame in IE have\n  // completely separately SVGAnimatedString base classes\n  if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {\n    return el.className.baseVal;\n  }\n  return el.className;\n}\n\nfunction setClassName(el, className) {\n  el.setAttribute('class', className);\n}\n\nfunction updateClasses(el, add, all) {\n  // Of the set of 'all' classes, we need the 'add' classes, and only the\n  // 'add' classes to be set.\n  all.forEach(function (cls) {\n    if (add.indexOf(cls) === -1 && hasClass(el, cls)) {\n      removeClass(el, cls);\n    }\n  });\n\n  add.forEach(function (cls) {\n    if (!hasClass(el, cls)) {\n      addClass(el, cls);\n    }\n  });\n}\n\nvar deferred = [];\n\nvar defer = function defer(fn) {\n  deferred.push(fn);\n};\n\nvar flush = function flush() {\n  var fn = undefined;\n  while (fn = deferred.pop()) {\n    fn();\n  }\n};\n\nvar Evented = (function () {\n  function Evented() {\n    _classCallCheck(this, Evented);\n  }\n\n  _createClass(Evented, [{\n    key: 'on',\n    value: function on(event, handler, ctx) {\n      var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];\n\n      if (typeof this.bindings === 'undefined') {\n        this.bindings = {};\n      }\n      if (typeof this.bindings[event] === 'undefined') {\n        this.bindings[event] = [];\n      }\n      this.bindings[event].push({ handler: handler, ctx: ctx, once: once });\n    }\n  }, {\n    key: 'once',\n    value: function once(event, handler, ctx) {\n      this.on(event, handler, ctx, true);\n    }\n  }, {\n    key: 'off',\n    value: function off(event, handler) {\n      if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {\n        return;\n      }\n\n      if (typeof handler === 'undefined') {\n        delete this.bindings[event];\n      } else {\n        var i = 0;\n        while (i < this.bindings[event].length) {\n          if (this.bindings[event][i].handler === handler) {\n            this.bindings[event].splice(i, 1);\n          } else {\n            ++i;\n          }\n        }\n      }\n    }\n  }, {\n    key: 'trigger',\n    value: function trigger(event) {\n      if (typeof this.bindings !== 'undefined' && this.bindings[event]) {\n        var i = 0;\n\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        while (i < this.bindings[event].length) {\n          var _bindings$event$i = this.bindings[event][i];\n          var handler = _bindings$event$i.handler;\n          var ctx = _bindings$event$i.ctx;\n          var once = _bindings$event$i.once;\n\n          var context = ctx;\n          if (typeof context === 'undefined') {\n            context = this;\n          }\n\n          handler.apply(context, args);\n\n          if (once) {\n            this.bindings[event].splice(i, 1);\n          } else {\n            ++i;\n          }\n        }\n      }\n    }\n  }]);\n\n  return Evented;\n})();\n\nTetherBase.Utils = {\n  getActualBoundingClientRect: getActualBoundingClientRect,\n  getScrollParents: getScrollParents,\n  getBounds: getBounds,\n  getOffsetParent: getOffsetParent,\n  extend: extend,\n  addClass: addClass,\n  removeClass: removeClass,\n  hasClass: hasClass,\n  updateClasses: updateClasses,\n  defer: defer,\n  flush: flush,\n  uniqueId: uniqueId,\n  Evented: Evented,\n  getScrollBarSize: getScrollBarSize,\n  removeUtilElements: removeUtilElements\n};\n/* globals TetherBase, performance */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nif (typeof TetherBase === 'undefined') {\n  throw new Error('You must include the utils.js file before tether.js');\n}\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getScrollParents = _TetherBase$Utils.getScrollParents;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar getOffsetParent = _TetherBase$Utils.getOffsetParent;\nvar extend = _TetherBase$Utils.extend;\nvar addClass = _TetherBase$Utils.addClass;\nvar removeClass = _TetherBase$Utils.removeClass;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\nvar flush = _TetherBase$Utils.flush;\nvar getScrollBarSize = _TetherBase$Utils.getScrollBarSize;\nvar removeUtilElements = _TetherBase$Utils.removeUtilElements;\n\nfunction within(a, b) {\n  var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];\n\n  return a + diff >= b && b >= a - diff;\n}\n\nvar transformKey = (function () {\n  if (typeof document === 'undefined') {\n    return '';\n  }\n  var el = document.createElement('div');\n\n  var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];\n  for (var i = 0; i < transforms.length; ++i) {\n    var key = transforms[i];\n    if (el.style[key] !== undefined) {\n      return key;\n    }\n  }\n})();\n\nvar tethers = [];\n\nvar position = function position() {\n  tethers.forEach(function (tether) {\n    tether.position(false);\n  });\n  flush();\n};\n\nfunction now() {\n  if (typeof performance === 'object' && typeof performance.now === 'function') {\n    return performance.now();\n  }\n  return +new Date();\n}\n\n(function () {\n  var lastCall = null;\n  var lastDuration = null;\n  var pendingTimeout = null;\n\n  var tick = function tick() {\n    if (typeof lastDuration !== 'undefined' && lastDuration > 16) {\n      // We voluntarily throttle ourselves if we can't manage 60fps\n      lastDuration = Math.min(lastDuration - 16, 250);\n\n      // Just in case this is the last event, remember to position just once more\n      pendingTimeout = setTimeout(tick, 250);\n      return;\n    }\n\n    if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {\n      // Some browsers call events a little too frequently, refuse to run more than is reasonable\n      return;\n    }\n\n    if (pendingTimeout != null) {\n      clearTimeout(pendingTimeout);\n      pendingTimeout = null;\n    }\n\n    lastCall = now();\n    position();\n    lastDuration = now() - lastCall;\n  };\n\n  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {\n    ['resize', 'scroll', 'touchmove'].forEach(function (event) {\n      window.addEventListener(event, tick);\n    });\n  }\n})();\n\nvar MIRROR_LR = {\n  center: 'center',\n  left: 'right',\n  right: 'left'\n};\n\nvar MIRROR_TB = {\n  middle: 'middle',\n  top: 'bottom',\n  bottom: 'top'\n};\n\nvar OFFSET_MAP = {\n  top: 0,\n  left: 0,\n  middle: '50%',\n  center: '50%',\n  bottom: '100%',\n  right: '100%'\n};\n\nvar autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {\n  var left = attachment.left;\n  var top = attachment.top;\n\n  if (left === 'auto') {\n    left = MIRROR_LR[relativeToAttachment.left];\n  }\n\n  if (top === 'auto') {\n    top = MIRROR_TB[relativeToAttachment.top];\n  }\n\n  return { left: left, top: top };\n};\n\nvar attachmentToOffset = function attachmentToOffset(attachment) {\n  var left = attachment.left;\n  var top = attachment.top;\n\n  if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {\n    left = OFFSET_MAP[attachment.left];\n  }\n\n  if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {\n    top = OFFSET_MAP[attachment.top];\n  }\n\n  return { left: left, top: top };\n};\n\nfunction addOffset() {\n  var out = { top: 0, left: 0 };\n\n  for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {\n    offsets[_key] = arguments[_key];\n  }\n\n  offsets.forEach(function (_ref) {\n    var top = _ref.top;\n    var left = _ref.left;\n\n    if (typeof top === 'string') {\n      top = parseFloat(top, 10);\n    }\n    if (typeof left === 'string') {\n      left = parseFloat(left, 10);\n    }\n\n    out.top += top;\n    out.left += left;\n  });\n\n  return out;\n}\n\nfunction offsetToPx(offset, size) {\n  if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {\n    offset.left = parseFloat(offset.left, 10) / 100 * size.width;\n  }\n  if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {\n    offset.top = parseFloat(offset.top, 10) / 100 * size.height;\n  }\n\n  return offset;\n}\n\nvar parseOffset = function parseOffset(value) {\n  var _value$split = value.split(' ');\n\n  var _value$split2 = _slicedToArray(_value$split, 2);\n\n  var top = _value$split2[0];\n  var left = _value$split2[1];\n\n  return { top: top, left: left };\n};\nvar parseAttachment = parseOffset;\n\nvar TetherClass = (function (_Evented) {\n  _inherits(TetherClass, _Evented);\n\n  function TetherClass(options) {\n    var _this = this;\n\n    _classCallCheck(this, TetherClass);\n\n    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);\n    this.position = this.position.bind(this);\n\n    tethers.push(this);\n\n    this.history = [];\n\n    this.setOptions(options, false);\n\n    TetherBase.modules.forEach(function (module) {\n      if (typeof module.initialize !== 'undefined') {\n        module.initialize.call(_this);\n      }\n    });\n\n    this.position();\n  }\n\n  _createClass(TetherClass, [{\n    key: 'getClass',\n    value: function getClass() {\n      var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n      var classes = this.options.classes;\n\n      if (typeof classes !== 'undefined' && classes[key]) {\n        return this.options.classes[key];\n      } else if (this.options.classPrefix) {\n        return this.options.classPrefix + '-' + key;\n      } else {\n        return key;\n      }\n    }\n  }, {\n    key: 'setOptions',\n    value: function setOptions(options) {\n      var _this2 = this;\n\n      var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n      var defaults = {\n        offset: '0 0',\n        targetOffset: '0 0',\n        targetAttachment: 'auto auto',\n        classPrefix: 'tether'\n      };\n\n      this.options = extend(defaults, options);\n\n      var _options = this.options;\n      var element = _options.element;\n      var target = _options.target;\n      var targetModifier = _options.targetModifier;\n\n      this.element = element;\n      this.target = target;\n      this.targetModifier = targetModifier;\n\n      if (this.target === 'viewport') {\n        this.target = document.body;\n        this.targetModifier = 'visible';\n      } else if (this.target === 'scroll-handle') {\n        this.target = document.body;\n        this.targetModifier = 'scroll-handle';\n      }\n\n      ['element', 'target'].forEach(function (key) {\n        if (typeof _this2[key] === 'undefined') {\n          throw new Error('Tether Error: Both element and target must be defined');\n        }\n\n        if (typeof _this2[key].jquery !== 'undefined') {\n          _this2[key] = _this2[key][0];\n        } else if (typeof _this2[key] === 'string') {\n          _this2[key] = document.querySelector(_this2[key]);\n        }\n      });\n\n      addClass(this.element, this.getClass('element'));\n      if (!(this.options.addTargetClasses === false)) {\n        addClass(this.target, this.getClass('target'));\n      }\n\n      if (!this.options.attachment) {\n        throw new Error('Tether Error: You must provide an attachment');\n      }\n\n      this.targetAttachment = parseAttachment(this.options.targetAttachment);\n      this.attachment = parseAttachment(this.options.attachment);\n      this.offset = parseOffset(this.options.offset);\n      this.targetOffset = parseOffset(this.options.targetOffset);\n\n      if (typeof this.scrollParents !== 'undefined') {\n        this.disable();\n      }\n\n      if (this.targetModifier === 'scroll-handle') {\n        this.scrollParents = [this.target];\n      } else {\n        this.scrollParents = getScrollParents(this.target);\n      }\n\n      if (!(this.options.enabled === false)) {\n        this.enable(pos);\n      }\n    }\n  }, {\n    key: 'getTargetBounds',\n    value: function getTargetBounds() {\n      if (typeof this.targetModifier !== 'undefined') {\n        if (this.targetModifier === 'visible') {\n          if (this.target === document.body) {\n            return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };\n          } else {\n            var bounds = getBounds(this.target);\n\n            var out = {\n              height: bounds.height,\n              width: bounds.width,\n              top: bounds.top,\n              left: bounds.left\n            };\n\n            out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));\n            out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));\n            out.height = Math.min(innerHeight, out.height);\n            out.height -= 2;\n\n            out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));\n            out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));\n            out.width = Math.min(innerWidth, out.width);\n            out.width -= 2;\n\n            if (out.top < pageYOffset) {\n              out.top = pageYOffset;\n            }\n            if (out.left < pageXOffset) {\n              out.left = pageXOffset;\n            }\n\n            return out;\n          }\n        } else if (this.targetModifier === 'scroll-handle') {\n          var bounds = undefined;\n          var target = this.target;\n          if (target === document.body) {\n            target = document.documentElement;\n\n            bounds = {\n              left: pageXOffset,\n              top: pageYOffset,\n              height: innerHeight,\n              width: innerWidth\n            };\n          } else {\n            bounds = getBounds(target);\n          }\n\n          var style = getComputedStyle(target);\n\n          var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;\n\n          var scrollBottom = 0;\n          if (hasBottomScroll) {\n            scrollBottom = 15;\n          }\n\n          var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;\n\n          var out = {\n            width: 15,\n            height: height * 0.975 * (height / target.scrollHeight),\n            left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15\n          };\n\n          var fitAdj = 0;\n          if (height < 408 && this.target === document.body) {\n            fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;\n          }\n\n          if (this.target !== document.body) {\n            out.height = Math.max(out.height, 24);\n          }\n\n          var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);\n          out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);\n\n          if (this.target === document.body) {\n            out.height = Math.max(out.height, 24);\n          }\n\n          return out;\n        }\n      } else {\n        return getBounds(this.target);\n      }\n    }\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this._cache = {};\n    }\n  }, {\n    key: 'cache',\n    value: function cache(k, getter) {\n      // More than one module will often need the same DOM info, so\n      // we keep a cache which is cleared on each position call\n      if (typeof this._cache === 'undefined') {\n        this._cache = {};\n      }\n\n      if (typeof this._cache[k] === 'undefined') {\n        this._cache[k] = getter.call(this);\n      }\n\n      return this._cache[k];\n    }\n  }, {\n    key: 'enable',\n    value: function enable() {\n      var _this3 = this;\n\n      var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n      if (!(this.options.addTargetClasses === false)) {\n        addClass(this.target, this.getClass('enabled'));\n      }\n      addClass(this.element, this.getClass('enabled'));\n      this.enabled = true;\n\n      this.scrollParents.forEach(function (parent) {\n        if (parent !== _this3.target.ownerDocument) {\n          parent.addEventListener('scroll', _this3.position);\n        }\n      });\n\n      if (pos) {\n        this.position();\n      }\n    }\n  }, {\n    key: 'disable',\n    value: function disable() {\n      var _this4 = this;\n\n      removeClass(this.target, this.getClass('enabled'));\n      removeClass(this.element, this.getClass('enabled'));\n      this.enabled = false;\n\n      if (typeof this.scrollParents !== 'undefined') {\n        this.scrollParents.forEach(function (parent) {\n          parent.removeEventListener('scroll', _this4.position);\n        });\n      }\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this5 = this;\n\n      this.disable();\n\n      tethers.forEach(function (tether, i) {\n        if (tether === _this5) {\n          tethers.splice(i, 1);\n        }\n      });\n\n      // Remove any elements we were using for convenience from the DOM\n      if (tethers.length === 0) {\n        removeUtilElements();\n      }\n    }\n  }, {\n    key: 'updateAttachClasses',\n    value: function updateAttachClasses(elementAttach, targetAttach) {\n      var _this6 = this;\n\n      elementAttach = elementAttach || this.attachment;\n      targetAttach = targetAttach || this.targetAttachment;\n      var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];\n\n      if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {\n        // updateAttachClasses can be called more than once in a position call, so\n        // we need to clean up after ourselves such that when the last defer gets\n        // ran it doesn't add any extra classes from previous calls.\n        this._addAttachClasses.splice(0, this._addAttachClasses.length);\n      }\n\n      if (typeof this._addAttachClasses === 'undefined') {\n        this._addAttachClasses = [];\n      }\n      var add = this._addAttachClasses;\n\n      if (elementAttach.top) {\n        add.push(this.getClass('element-attached') + '-' + elementAttach.top);\n      }\n      if (elementAttach.left) {\n        add.push(this.getClass('element-attached') + '-' + elementAttach.left);\n      }\n      if (targetAttach.top) {\n        add.push(this.getClass('target-attached') + '-' + targetAttach.top);\n      }\n      if (targetAttach.left) {\n        add.push(this.getClass('target-attached') + '-' + targetAttach.left);\n      }\n\n      var all = [];\n      sides.forEach(function (side) {\n        all.push(_this6.getClass('element-attached') + '-' + side);\n        all.push(_this6.getClass('target-attached') + '-' + side);\n      });\n\n      defer(function () {\n        if (!(typeof _this6._addAttachClasses !== 'undefined')) {\n          return;\n        }\n\n        updateClasses(_this6.element, _this6._addAttachClasses, all);\n        if (!(_this6.options.addTargetClasses === false)) {\n          updateClasses(_this6.target, _this6._addAttachClasses, all);\n        }\n\n        delete _this6._addAttachClasses;\n      });\n    }\n  }, {\n    key: 'position',\n    value: function position() {\n      var _this7 = this;\n\n      var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];\n\n      // flushChanges commits the changes immediately, leave true unless you are positioning multiple\n      // tethers (in which case call Tether.Utils.flush yourself when you're done)\n\n      if (!this.enabled) {\n        return;\n      }\n\n      this.clearCache();\n\n      // Turn 'auto' attachments into the appropriate corner or edge\n      var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);\n\n      this.updateAttachClasses(this.attachment, targetAttachment);\n\n      var elementPos = this.cache('element-bounds', function () {\n        return getBounds(_this7.element);\n      });\n\n      var width = elementPos.width;\n      var height = elementPos.height;\n\n      if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\n        var _lastSize = this.lastSize;\n\n        // We cache the height and width to make it possible to position elements that are\n        // getting hidden.\n        width = _lastSize.width;\n        height = _lastSize.height;\n      } else {\n        this.lastSize = { width: width, height: height };\n      }\n\n      var targetPos = this.cache('target-bounds', function () {\n        return _this7.getTargetBounds();\n      });\n      var targetSize = targetPos;\n\n      // Get an actual px offset from the attachment\n      var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });\n      var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);\n\n      var manualOffset = offsetToPx(this.offset, { width: width, height: height });\n      var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);\n\n      // Add the manually provided offset\n      offset = addOffset(offset, manualOffset);\n      targetOffset = addOffset(targetOffset, manualTargetOffset);\n\n      // It's now our goal to make (element position + offset) == (target position + target offset)\n      var left = targetPos.left + targetOffset.left - offset.left;\n      var top = targetPos.top + targetOffset.top - offset.top;\n\n      for (var i = 0; i < TetherBase.modules.length; ++i) {\n        var _module2 = TetherBase.modules[i];\n        var ret = _module2.position.call(this, {\n          left: left,\n          top: top,\n          targetAttachment: targetAttachment,\n          targetPos: targetPos,\n          elementPos: elementPos,\n          offset: offset,\n          targetOffset: targetOffset,\n          manualOffset: manualOffset,\n          manualTargetOffset: manualTargetOffset,\n          scrollbarSize: scrollbarSize,\n          attachment: this.attachment\n        });\n\n        if (ret === false) {\n          return false;\n        } else if (typeof ret === 'undefined' || typeof ret !== 'object') {\n          continue;\n        } else {\n          top = ret.top;\n          left = ret.left;\n        }\n      }\n\n      // We describe the position three different ways to give the optimizer\n      // a chance to decide the best possible way to position the element\n      // with the fewest repaints.\n      var next = {\n        // It's position relative to the page (absolute positioning when\n        // the element is a child of the body)\n        page: {\n          top: top,\n          left: left\n        },\n\n        // It's position relative to the viewport (fixed positioning)\n        viewport: {\n          top: top - pageYOffset,\n          bottom: pageYOffset - top - height + innerHeight,\n          left: left - pageXOffset,\n          right: pageXOffset - left - width + innerWidth\n        }\n      };\n\n      var doc = this.target.ownerDocument;\n      var win = doc.defaultView;\n\n      var scrollbarSize = undefined;\n      if (win.innerHeight > doc.documentElement.clientHeight) {\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n        next.viewport.bottom -= scrollbarSize.height;\n      }\n\n      if (win.innerWidth > doc.documentElement.clientWidth) {\n        scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n        next.viewport.right -= scrollbarSize.width;\n      }\n\n      if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {\n        // Absolute positioning in the body will be relative to the page, not the 'initial containing block'\n        next.page.bottom = doc.body.scrollHeight - top - height;\n        next.page.right = doc.body.scrollWidth - left - width;\n      }\n\n      if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {\n        (function () {\n          var offsetParent = _this7.cache('target-offsetparent', function () {\n            return getOffsetParent(_this7.target);\n          });\n          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {\n            return getBounds(offsetParent);\n          });\n          var offsetParentStyle = getComputedStyle(offsetParent);\n          var offsetParentSize = offsetPosition;\n\n          var offsetBorder = {};\n          ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {\n            offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);\n          });\n\n          offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;\n          offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;\n\n          if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {\n            if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {\n              // We're within the visible part of the target's scroll parent\n              var scrollTop = offsetParent.scrollTop;\n              var scrollLeft = offsetParent.scrollLeft;\n\n              // It's position relative to the target's offset parent (absolute positioning when\n              // the element is moved to be a child of the target's offset parent).\n              next.offset = {\n                top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,\n                left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left\n              };\n            }\n          }\n        })();\n      }\n\n      // We could also travel up the DOM and try each containing context, rather than only\n      // looking at the body, but we're gonna get diminishing returns.\n\n      this.move(next);\n\n      this.history.unshift(next);\n\n      if (this.history.length > 3) {\n        this.history.pop();\n      }\n\n      if (flushChanges) {\n        flush();\n      }\n\n      return true;\n    }\n\n    // THE ISSUE\n  }, {\n    key: 'move',\n    value: function move(pos) {\n      var _this8 = this;\n\n      if (!(typeof this.element.parentNode !== 'undefined')) {\n        return;\n      }\n\n      var same = {};\n\n      for (var type in pos) {\n        same[type] = {};\n\n        for (var key in pos[type]) {\n          var found = false;\n\n          for (var i = 0; i < this.history.length; ++i) {\n            var point = this.history[i];\n            if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            same[type][key] = true;\n          }\n        }\n      }\n\n      var css = { top: '', left: '', right: '', bottom: '' };\n\n      var transcribe = function transcribe(_same, _pos) {\n        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';\n        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;\n        if (gpu !== false) {\n          var yPos = undefined,\n              xPos = undefined;\n          if (_same.top) {\n            css.top = 0;\n            yPos = _pos.top;\n          } else {\n            css.bottom = 0;\n            yPos = -_pos.bottom;\n          }\n\n          if (_same.left) {\n            css.left = 0;\n            xPos = _pos.left;\n          } else {\n            css.right = 0;\n            xPos = -_pos.right;\n          }\n\n          if (typeof window.devicePixelRatio === 'number' && devicePixelRatio % 1 === 0) {\n            xPos = Math.round(xPos * devicePixelRatio) / devicePixelRatio;\n            yPos = Math.round(yPos * devicePixelRatio) / devicePixelRatio;\n          }\n\n          css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';\n\n          if (transformKey !== 'msTransform') {\n            // The Z transform will keep this in the GPU (faster, and prevents artifacts),\n            // but IE9 doesn't support 3d transforms and will choke.\n            css[transformKey] += \" translateZ(0)\";\n          }\n        } else {\n          if (_same.top) {\n            css.top = _pos.top + 'px';\n          } else {\n            css.bottom = _pos.bottom + 'px';\n          }\n\n          if (_same.left) {\n            css.left = _pos.left + 'px';\n          } else {\n            css.right = _pos.right + 'px';\n          }\n        }\n      };\n\n      var moved = false;\n      if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {\n        css.position = 'absolute';\n        transcribe(same.page, pos.page);\n      } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {\n        css.position = 'fixed';\n        transcribe(same.viewport, pos.viewport);\n      } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {\n        (function () {\n          css.position = 'absolute';\n          var offsetParent = _this8.cache('target-offsetparent', function () {\n            return getOffsetParent(_this8.target);\n          });\n\n          if (getOffsetParent(_this8.element) !== offsetParent) {\n            defer(function () {\n              _this8.element.parentNode.removeChild(_this8.element);\n              offsetParent.appendChild(_this8.element);\n            });\n          }\n\n          transcribe(same.offset, pos.offset);\n          moved = true;\n        })();\n      } else {\n        css.position = 'absolute';\n        transcribe({ top: true, left: true }, pos.page);\n      }\n\n      if (!moved) {\n        if (this.options.bodyElement) {\n          if (this.element.parentNode !== this.options.bodyElement) {\n            this.options.bodyElement.appendChild(this.element);\n          }\n        } else {\n          var isFullscreenElement = function isFullscreenElement(e) {\n            var d = e.ownerDocument;\n            var fe = d.fullscreenElement || d.webkitFullscreenElement || d.mozFullScreenElement || d.msFullscreenElement;\n            return fe === e;\n          };\n\n          var offsetParentIsBody = true;\n\n          var currentNode = this.element.parentNode;\n          while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY' && !isFullscreenElement(currentNode)) {\n            if (getComputedStyle(currentNode).position !== 'static') {\n              offsetParentIsBody = false;\n              break;\n            }\n\n            currentNode = currentNode.parentNode;\n          }\n\n          if (!offsetParentIsBody) {\n            this.element.parentNode.removeChild(this.element);\n            this.element.ownerDocument.body.appendChild(this.element);\n          }\n        }\n      }\n\n      // Any css change will trigger a repaint, so let's avoid one if nothing changed\n      var writeCSS = {};\n      var write = false;\n      for (var key in css) {\n        var val = css[key];\n        var elVal = this.element.style[key];\n\n        if (elVal !== val) {\n          write = true;\n          writeCSS[key] = val;\n        }\n      }\n\n      if (write) {\n        defer(function () {\n          extend(_this8.element.style, writeCSS);\n          _this8.trigger('repositioned');\n        });\n      }\n    }\n  }]);\n\n  return TetherClass;\n})(Evented);\n\nTetherClass.modules = [];\n\nTetherBase.position = position;\n\nvar Tether = extend(TetherClass, TetherBase);\n/* globals TetherBase */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar extend = _TetherBase$Utils.extend;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\n\nvar BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];\n\nfunction getBoundingRect(tether, to) {\n  if (to === 'scrollParent') {\n    to = tether.scrollParents[0];\n  } else if (to === 'window') {\n    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];\n  }\n\n  if (to === document) {\n    to = to.documentElement;\n  }\n\n  if (typeof to.nodeType !== 'undefined') {\n    (function () {\n      var node = to;\n      var size = getBounds(to);\n      var pos = size;\n      var style = getComputedStyle(to);\n\n      to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];\n\n      // Account any parent Frames scroll offset\n      if (node.ownerDocument !== document) {\n        var win = node.ownerDocument.defaultView;\n        to[0] += win.pageXOffset;\n        to[1] += win.pageYOffset;\n        to[2] += win.pageXOffset;\n        to[3] += win.pageYOffset;\n      }\n\n      BOUNDS_FORMAT.forEach(function (side, i) {\n        side = side[0].toUpperCase() + side.substr(1);\n        if (side === 'Top' || side === 'Left') {\n          to[i] += parseFloat(style['border' + side + 'Width']);\n        } else {\n          to[i] -= parseFloat(style['border' + side + 'Width']);\n        }\n      });\n    })();\n  }\n\n  return to;\n}\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var _this = this;\n\n    var top = _ref.top;\n    var left = _ref.left;\n    var targetAttachment = _ref.targetAttachment;\n\n    if (!this.options.constraints) {\n      return true;\n    }\n\n    var _cache = this.cache('element-bounds', function () {\n      return getBounds(_this.element);\n    });\n\n    var height = _cache.height;\n    var width = _cache.width;\n\n    if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {\n      var _lastSize = this.lastSize;\n\n      // Handle the item getting hidden as a result of our positioning without glitching\n      // the classes in and out\n      width = _lastSize.width;\n      height = _lastSize.height;\n    }\n\n    var targetSize = this.cache('target-bounds', function () {\n      return _this.getTargetBounds();\n    });\n\n    var targetHeight = targetSize.height;\n    var targetWidth = targetSize.width;\n\n    var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];\n\n    this.options.constraints.forEach(function (constraint) {\n      var outOfBoundsClass = constraint.outOfBoundsClass;\n      var pinnedClass = constraint.pinnedClass;\n\n      if (outOfBoundsClass) {\n        allClasses.push(outOfBoundsClass);\n      }\n      if (pinnedClass) {\n        allClasses.push(pinnedClass);\n      }\n    });\n\n    allClasses.forEach(function (cls) {\n      ['left', 'top', 'right', 'bottom'].forEach(function (side) {\n        allClasses.push(cls + '-' + side);\n      });\n    });\n\n    var addClasses = [];\n\n    var tAttachment = extend({}, targetAttachment);\n    var eAttachment = extend({}, this.attachment);\n\n    this.options.constraints.forEach(function (constraint) {\n      var to = constraint.to;\n      var attachment = constraint.attachment;\n      var pin = constraint.pin;\n\n      if (typeof attachment === 'undefined') {\n        attachment = '';\n      }\n\n      var changeAttachX = undefined,\n          changeAttachY = undefined;\n      if (attachment.indexOf(' ') >= 0) {\n        var _attachment$split = attachment.split(' ');\n\n        var _attachment$split2 = _slicedToArray(_attachment$split, 2);\n\n        changeAttachY = _attachment$split2[0];\n        changeAttachX = _attachment$split2[1];\n      } else {\n        changeAttachX = changeAttachY = attachment;\n      }\n\n      var bounds = getBoundingRect(_this, to);\n\n      if (changeAttachY === 'target' || changeAttachY === 'both') {\n        if (top < bounds[1] && tAttachment.top === 'top') {\n          top += targetHeight;\n          tAttachment.top = 'bottom';\n        }\n\n        if (top + height > bounds[3] && tAttachment.top === 'bottom') {\n          top -= targetHeight;\n          tAttachment.top = 'top';\n        }\n      }\n\n      if (changeAttachY === 'together') {\n        if (tAttachment.top === 'top') {\n          if (eAttachment.top === 'bottom' && top < bounds[1]) {\n            top += targetHeight;\n            tAttachment.top = 'bottom';\n\n            top += height;\n            eAttachment.top = 'top';\n          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {\n            top -= height - targetHeight;\n            tAttachment.top = 'bottom';\n\n            eAttachment.top = 'bottom';\n          }\n        }\n\n        if (tAttachment.top === 'bottom') {\n          if (eAttachment.top === 'top' && top + height > bounds[3]) {\n            top -= targetHeight;\n            tAttachment.top = 'top';\n\n            top -= height;\n            eAttachment.top = 'bottom';\n          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {\n            top += height - targetHeight;\n            tAttachment.top = 'top';\n\n            eAttachment.top = 'top';\n          }\n        }\n\n        if (tAttachment.top === 'middle') {\n          if (top + height > bounds[3] && eAttachment.top === 'top') {\n            top -= height;\n            eAttachment.top = 'bottom';\n          } else if (top < bounds[1] && eAttachment.top === 'bottom') {\n            top += height;\n            eAttachment.top = 'top';\n          }\n        }\n      }\n\n      if (changeAttachX === 'target' || changeAttachX === 'both') {\n        if (left < bounds[0] && tAttachment.left === 'left') {\n          left += targetWidth;\n          tAttachment.left = 'right';\n        }\n\n        if (left + width > bounds[2] && tAttachment.left === 'right') {\n          left -= targetWidth;\n          tAttachment.left = 'left';\n        }\n      }\n\n      if (changeAttachX === 'together') {\n        if (left < bounds[0] && tAttachment.left === 'left') {\n          if (eAttachment.left === 'right') {\n            left += targetWidth;\n            tAttachment.left = 'right';\n\n            left += width;\n            eAttachment.left = 'left';\n          } else if (eAttachment.left === 'left') {\n            left += targetWidth;\n            tAttachment.left = 'right';\n\n            left -= width;\n            eAttachment.left = 'right';\n          }\n        } else if (left + width > bounds[2] && tAttachment.left === 'right') {\n          if (eAttachment.left === 'left') {\n            left -= targetWidth;\n            tAttachment.left = 'left';\n\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (eAttachment.left === 'right') {\n            left -= targetWidth;\n            tAttachment.left = 'left';\n\n            left += width;\n            eAttachment.left = 'left';\n          }\n        } else if (tAttachment.left === 'center') {\n          if (left + width > bounds[2] && eAttachment.left === 'left') {\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (left < bounds[0] && eAttachment.left === 'right') {\n            left += width;\n            eAttachment.left = 'left';\n          }\n        }\n      }\n\n      if (changeAttachY === 'element' || changeAttachY === 'both') {\n        if (top < bounds[1] && eAttachment.top === 'bottom') {\n          top += height;\n          eAttachment.top = 'top';\n        }\n\n        if (top + height > bounds[3] && eAttachment.top === 'top') {\n          top -= height;\n          eAttachment.top = 'bottom';\n        }\n      }\n\n      if (changeAttachX === 'element' || changeAttachX === 'both') {\n        if (left < bounds[0]) {\n          if (eAttachment.left === 'right') {\n            left += width;\n            eAttachment.left = 'left';\n          } else if (eAttachment.left === 'center') {\n            left += width / 2;\n            eAttachment.left = 'left';\n          }\n        }\n\n        if (left + width > bounds[2]) {\n          if (eAttachment.left === 'left') {\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (eAttachment.left === 'center') {\n            left -= width / 2;\n            eAttachment.left = 'right';\n          }\n        }\n      }\n\n      if (typeof pin === 'string') {\n        pin = pin.split(',').map(function (p) {\n          return p.trim();\n        });\n      } else if (pin === true) {\n        pin = ['top', 'left', 'right', 'bottom'];\n      }\n\n      pin = pin || [];\n\n      var pinned = [];\n      var oob = [];\n\n      if (top < bounds[1]) {\n        if (pin.indexOf('top') >= 0) {\n          top = bounds[1];\n          pinned.push('top');\n        } else {\n          oob.push('top');\n        }\n      }\n\n      if (top + height > bounds[3]) {\n        if (pin.indexOf('bottom') >= 0) {\n          top = bounds[3] - height;\n          pinned.push('bottom');\n        } else {\n          oob.push('bottom');\n        }\n      }\n\n      if (left < bounds[0]) {\n        if (pin.indexOf('left') >= 0) {\n          left = bounds[0];\n          pinned.push('left');\n        } else {\n          oob.push('left');\n        }\n      }\n\n      if (left + width > bounds[2]) {\n        if (pin.indexOf('right') >= 0) {\n          left = bounds[2] - width;\n          pinned.push('right');\n        } else {\n          oob.push('right');\n        }\n      }\n\n      if (pinned.length) {\n        (function () {\n          var pinnedClass = undefined;\n          if (typeof _this.options.pinnedClass !== 'undefined') {\n            pinnedClass = _this.options.pinnedClass;\n          } else {\n            pinnedClass = _this.getClass('pinned');\n          }\n\n          addClasses.push(pinnedClass);\n          pinned.forEach(function (side) {\n            addClasses.push(pinnedClass + '-' + side);\n          });\n        })();\n      }\n\n      if (oob.length) {\n        (function () {\n          var oobClass = undefined;\n          if (typeof _this.options.outOfBoundsClass !== 'undefined') {\n            oobClass = _this.options.outOfBoundsClass;\n          } else {\n            oobClass = _this.getClass('out-of-bounds');\n          }\n\n          addClasses.push(oobClass);\n          oob.forEach(function (side) {\n            addClasses.push(oobClass + '-' + side);\n          });\n        })();\n      }\n\n      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {\n        eAttachment.left = tAttachment.left = false;\n      }\n      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {\n        eAttachment.top = tAttachment.top = false;\n      }\n\n      if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {\n        _this.updateAttachClasses(eAttachment, tAttachment);\n        _this.trigger('update', {\n          attachment: eAttachment,\n          targetAttachment: tAttachment\n        });\n      }\n    });\n\n    defer(function () {\n      if (!(_this.options.addTargetClasses === false)) {\n        updateClasses(_this.target, addClasses, allClasses);\n      }\n      updateClasses(_this.element, addClasses, allClasses);\n    });\n\n    return { top: top, left: left };\n  }\n});\n/* globals TetherBase */\n\n'use strict';\n\nvar _TetherBase$Utils = TetherBase.Utils;\nvar getBounds = _TetherBase$Utils.getBounds;\nvar updateClasses = _TetherBase$Utils.updateClasses;\nvar defer = _TetherBase$Utils.defer;\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var _this = this;\n\n    var top = _ref.top;\n    var left = _ref.left;\n\n    var _cache = this.cache('element-bounds', function () {\n      return getBounds(_this.element);\n    });\n\n    var height = _cache.height;\n    var width = _cache.width;\n\n    var targetPos = this.getTargetBounds();\n\n    var bottom = top + height;\n    var right = left + width;\n\n    var abutted = [];\n    if (top <= targetPos.bottom && bottom >= targetPos.top) {\n      ['left', 'right'].forEach(function (side) {\n        var targetPosSide = targetPos[side];\n        if (targetPosSide === left || targetPosSide === right) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    if (left <= targetPos.right && right >= targetPos.left) {\n      ['top', 'bottom'].forEach(function (side) {\n        var targetPosSide = targetPos[side];\n        if (targetPosSide === top || targetPosSide === bottom) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    var allClasses = [];\n    var addClasses = [];\n\n    var sides = ['left', 'top', 'right', 'bottom'];\n    allClasses.push(this.getClass('abutted'));\n    sides.forEach(function (side) {\n      allClasses.push(_this.getClass('abutted') + '-' + side);\n    });\n\n    if (abutted.length) {\n      addClasses.push(this.getClass('abutted'));\n    }\n\n    abutted.forEach(function (side) {\n      addClasses.push(_this.getClass('abutted') + '-' + side);\n    });\n\n    defer(function () {\n      if (!(_this.options.addTargetClasses === false)) {\n        updateClasses(_this.target, addClasses, allClasses);\n      }\n      updateClasses(_this.element, addClasses, allClasses);\n    });\n\n    return true;\n  }\n});\n/* globals TetherBase */\n\n'use strict';\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nTetherBase.modules.push({\n  position: function position(_ref) {\n    var top = _ref.top;\n    var left = _ref.left;\n\n    if (!this.options.shift) {\n      return;\n    }\n\n    var shift = this.options.shift;\n    if (typeof this.options.shift === 'function') {\n      shift = this.options.shift.call(this, { top: top, left: left });\n    }\n\n    var shiftTop = undefined,\n        shiftLeft = undefined;\n    if (typeof shift === 'string') {\n      shift = shift.split(' ');\n      shift[1] = shift[1] || shift[0];\n\n      var _shift = shift;\n\n      var _shift2 = _slicedToArray(_shift, 2);\n\n      shiftTop = _shift2[0];\n      shiftLeft = _shift2[1];\n\n      shiftTop = parseFloat(shiftTop, 10);\n      shiftLeft = parseFloat(shiftLeft, 10);\n    } else {\n      shiftTop = shift.top;\n      shiftLeft = shift.left;\n    }\n\n    top += shiftTop;\n    left += shiftLeft;\n\n    return { top: top, left: left };\n  }\n});\nreturn Tether;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/tether/dist/js/tether.js\n// module id = 1431\n// module chunks = 0 1","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ShareMessageFooter from './share_message_footer';\nimport ShareMessageHeader from './share_message_header';\nimport ShareMessageAction from './share_message_action';\nimport MessageSearch from './message_search';\nimport { trackIntercomEvent } from '../utils/intercom_utils';\n\nimport * as InviteActions from '../actions/invite_actions';\n\nexport default class ShareMessage extends Component<any, any> {\n  static propTypes = {\n    showOverview: PropTypes.func.isRequired,\n    currentUser: PropTypes.object.isRequired,\n    currentInvitedUsers: PropTypes.object.isRequired,\n    messageUsers: PropTypes.object.isRequired,\n    query: PropTypes.string,\n    results: PropTypes.object,\n    permission: PropTypes.object,\n    message: PropTypes.string,\n    isSendingMessage: PropTypes.bool,\n    isLoadingUsers: PropTypes.bool.isRequired,\n    send: PropTypes.func.isRequired,\n    cancel: PropTypes.func.isRequired,\n    updateMessage: PropTypes.func.isRequired,\n    addUser: PropTypes.func.isRequired,\n    removeUser: PropTypes.func.isRequired,\n    reportId: PropTypes.number.isRequired,\n    reportOwner: PropTypes.object.isRequired,\n    disableSearch: PropTypes.bool,\n    email: PropTypes.string\n  };\n\n  handleUpdateMessageField = (event) => {\n    this.props.updateMessage(event.target.value);\n  }\n\n  handleSubmit = (event) => {\n    event.preventDefault();\n    this.props.send();\n    const metadata = {\n      count: this.props.messageUsers.size,\n      message: this.props.message,\n      reportId: this.props.reportId\n    };\n    trackIntercomEvent('report-share', metadata);\n  }\n\n  handleInviteAll() {\n    InviteActions.addMessageAllUsers();\n  }\n\n  render() {\n    const { showOverview, messageUsers, currentInvitedUsers, permission, message, cancel, isSendingMessage, currentUser, reportOwner } = this.props;\n\n    const isDisabled = messageUsers.isEmpty();\n\n    return (\n      <span>\n        <div className=\"ui-modal__content\">\n          <ShareMessageHeader title={\"Invite & Update\"} message={\"Send the latest report to colleagues and stay on the same page.\"}/>\n          <MessageSearch {...this.props}/>\n          <a onClick={this.handleInviteAll}>\n            <p className=\"share-panel-invite-all\">Invite everyone this report is shared with.</p>\n          </a>\n          <ShareMessageAction\n            handleSubmit={this.handleSubmit}\n            isDisabled={isDisabled}\n            isSendingMessage={isSendingMessage}\n            cancel={cancel}\n            description={<span>Newly invited users will have <strong className=\"view-only-color\">view-only</strong> report access </span>}>\n              <fieldset className=\"ui-form\">\n                  <textarea\n                    value={message}\n                    name=\"report-actions-share-message\"\n                    onChange={this.handleUpdateMessageField}\n                    rows={3}\n                    placeholder=\"Include a personal note with the email message (optional)\"/>\n              </fieldset>\n          </ShareMessageAction>\n        </div>\n        <ShareMessageFooter\n          currentInvitedUsers={currentInvitedUsers}\n          currentUser={currentUser}\n          permission={permission}\n          reportOwner={reportOwner}\n          showOverview={showOverview}\n        />\n      </span>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_message.tsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ShareIcon from './share_icons';\nimport strings from '../strings';\n\nconst { formatShareMessageFooter } = strings;\n\nexport default class ShareMessageFooter extends Component<any, any> {\n  static propTypes = {\n    currentInvitedUsers: PropTypes.object.isRequired,\n    currentUser: PropTypes.object.isRequired,\n    permission: PropTypes.shape({\n      id: PropTypes.string,\n      name: PropTypes.string\n    }).isRequired,\n    reportOwner: PropTypes.object.isRequired,\n    showOverview: PropTypes.func.isRequired\n  }\n\n  render() {\n    const { props } = this;\n\n    // We need to push the `reportOwner` into this list and filter the\n    // `currentUser` from it because `formatShareMessageFooter` expects an array\n    // of users who have access that are not the current user\n    // e.g.: Report Editors\n    const currentInvitedUserNames = props.currentInvitedUsers\n      .push(props.reportOwner)\n      .filter(user => user.get('id') !== props.currentUser.get('id'))\n      .map(user => `${user.get('first_name')} ${user.get('last_name')}`);\n    const shareDescription = formatShareMessageFooter(currentInvitedUserNames.toArray(), 4);\n\n    return (\n      <div className=\"ui-modal__content\">\n        <div className=\"share__options\">\n          <div className=\"share__option\">\n            <ShareIcon type={props.permission.id} size={42}/>\n            <div className=\"share__option__body\">\n              <strong>{props.permission.name}</strong>\n              <p className=\"share__option__description\">\n                {shareDescription}\n              </p>\n            </div>\n            <a\n              className=\"share-panel-navigation-link share__option__edit__access\"\n              onClick={props.showOverview}\n            >\n              Edit Access\n              <span className=\"icon-righthead-2 share-panel-navigation-link-arrow\" />\n            </a>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_message_footer.tsx","import React from 'react';\n\nconst ShareMessageHeader = ({title, message}) => {\n  return (\n    <div className=\"share-panel-message-header-container\">\n      <span className=\"icon-email-1 color-gray_6\" />\n      <div className=\"share-panel-message-header\">\n        <h3>{title}</h3>\n        <p>{message}</p>\n      </div>\n    </div>\n  );\n};\n\nexport default ShareMessageHeader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_message_header.tsx","import React from 'react';\n\nconst ShareMessageAction: React.SFC<any> = ({handleSubmit, children, description, cancel, isDisabled, isSendingMessage}) => {\n  return (\n      <div>\n        <form onSubmit={handleSubmit}>\n          {children}\n          <fieldset className=\"share-panel-to-description\">\n          {description}\n          </fieldset>\n          <fieldset className=\"share-panel-message-actions\">\n            <a onClick={cancel} className=\"ui-button ghost\">Cancel</a>\n            <button\n              type=\"submit\"\n              name=\"report-actions-submit-message\"\n              className=\"ui-button primary\"\n              disabled={isDisabled}>\n              {isSendingMessage && <span className=\"ui-loading_button\" />}\n              Send\n            </button>\n          </fieldset>\n        </form>\n      </div>\n  );\n};\nexport default ShareMessageAction;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_message_action.tsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport * as Scroll from 'react-scroll';\nimport _ from 'lodash';\nimport * as InviteActions from '../actions/invite_actions';\n\nimport { Search } from '@opengov/ovid';\nimport classNames from 'classnames';\nconst scroll = Scroll.animateScroll;\n\n\nclass MessageUser extends Component<any, any> {\n  static propTypes = {\n    user: PropTypes.object.isRequired,\n    isNewUser: PropTypes.bool.isRequired,\n    isCurrentUser: PropTypes.bool.isRequired,\n    removeUser: PropTypes.func\n  }\n\n  onRemoveMessageUser = (user) => {\n    this.props.removeUser(user);\n  }\n\n  render() {\n    const {user, isNewUser, isCurrentUser, removeUser} = this.props;\n    const userClasses = classNames('ui-button', 'small', { 'new-user': isNewUser});\n    return (\n      <span title={isCurrentUser && 'Added automatically'} className={userClasses}>\n          {user.get('full_name')}\n          <span className=\"icon-remove-4\" onClick={() => removeUser(user)}/>\n      </span>\n    );\n  }\n}\n\nexport default class MessageSearch extends Component<any, any> {\n  static propTypes = {\n    query: PropTypes.string,\n    results: PropTypes.object,\n    currentUser: PropTypes.object.isRequired,\n    currentInvitedUsers: PropTypes.object.isRequired,\n    isLoadingUsers: PropTypes.bool.isRequired,\n    messageUsers: PropTypes.object.isRequired,\n    addUser: PropTypes.func,\n    removeUser: PropTypes.func\n  }\n\n  onInputChange = _.debounce((value) => {\n    InviteActions.updateSearchQuery(value);\n  }, 150)\n\n  onSelectResult = (index) => {\n    const { results, addUser} = this.props;\n    const user = results.get(index);\n\n    if (user) {\n      addUser(user);\n\n      scroll.scrollToBottom({\n        containerId: 'message-search-pill-container',\n        smooth: true,\n        isDynamic: true\n      });\n    }\n  }\n\n  isCurrentUser = (user) => {\n    return this.props.currentUser && user.get('id') === this.props.currentUser.get('id');\n  }\n\n  renderMessageUsers = () => {\n    const { messageUsers, currentInvitedUsers, removeUser} = this.props;\n\n    return messageUsers.map(user => <MessageUser\n      key={user.get('id')}\n      user={user}\n      isNewUser={(currentInvitedUsers.filter(eachUser => eachUser.get('id') === user.get('id'))).isEmpty()\n        && !this.isCurrentUser(user)}\n      isCurrentUser={this.isCurrentUser(user)}\n      removeUser={removeUser}\n      />, this);\n  }\n\n  getResults() {\n    if (_.isEmpty(this.props.query)) {\n      return;\n    }\n\n    const { query, results } = this.props;\n\n    return {\n      heading: `${results.count()} matches to \"${query}\" in your organization`,\n      items: results.map((user) => ({\n        title: user.get('full_name'),\n        type: user.get('email')\n      })).toArray()\n    };\n  }\n\n  handleSearchClick = () => {\n    (this.refs.search as any).focusInput();\n  }\n\n  render() {\n    return (\n      <div className=\"share__options\">\n        <div className=\"share__option message-search\">\n          <div className=\"prefix\">To:</div>\n          <div className=\"ui-search ui-search-div search\" onClick={this.handleSearchClick}>\n            <div id=\"message-search-pill-container\" className=\"pill-container\">\n              {this.renderMessageUsers()}\n            </div>\n            <Search\n              ref=\"search\"\n              results={this.getResults()}\n              onInputChange={this.onInputChange}\n              onSelectResult={this.onSelectResult}\n              placeholder={this.props.isLoadingUsers ? 'Loading members...' : null}\n              />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/message_search.tsx","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Helpers = exports.ScrollElement = exports.ScrollLink = exports.animateScroll = exports.scrollSpy = exports.Events = exports.scroller = exports.Element = exports.Button = exports.Link = undefined;\n\nvar _Link = require('./components/Link.js');\n\nvar _Link2 = _interopRequireDefault(_Link);\n\nvar _Button = require('./components/Button.js');\n\nvar _Button2 = _interopRequireDefault(_Button);\n\nvar _Element = require('./components/Element.js');\n\nvar _Element2 = _interopRequireDefault(_Element);\n\nvar _scroller = require('./mixins/scroller.js');\n\nvar _scroller2 = _interopRequireDefault(_scroller);\n\nvar _scrollEvents = require('./mixins/scroll-events.js');\n\nvar _scrollEvents2 = _interopRequireDefault(_scrollEvents);\n\nvar _scrollSpy = require('./mixins/scroll-spy.js');\n\nvar _scrollSpy2 = _interopRequireDefault(_scrollSpy);\n\nvar _animateScroll = require('./mixins/animate-scroll.js');\n\nvar _animateScroll2 = _interopRequireDefault(_animateScroll);\n\nvar _scrollLink = require('./mixins/scroll-link.js');\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nvar _scrollElement = require('./mixins/scroll-element.js');\n\nvar _scrollElement2 = _interopRequireDefault(_scrollElement);\n\nvar _Helpers = require('./mixins/Helpers.js');\n\nvar _Helpers2 = _interopRequireDefault(_Helpers);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Link = _Link2.default;\nexports.Button = _Button2.default;\nexports.Element = _Element2.default;\nexports.scroller = _scroller2.default;\nexports.Events = _scrollEvents2.default;\nexports.scrollSpy = _scrollSpy2.default;\nexports.animateScroll = _animateScroll2.default;\nexports.ScrollLink = _scrollLink2.default;\nexports.ScrollElement = _scrollElement2.default;\nexports.Helpers = _Helpers2.default;\nexports.default = { Link: _Link2.default, Button: _Button2.default, Element: _Element2.default, scroller: _scroller2.default, Events: _scrollEvents2.default, scrollSpy: _scrollSpy2.default, animateScroll: _animateScroll2.default, ScrollLink: _scrollLink2.default, ScrollElement: _scrollElement2.default, Helpers: _Helpers2.default };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/index.js\n// module id = 1437\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollLink = require('../mixins/scroll-link');\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar LinkElement = function (_React$Component) {\n  _inherits(LinkElement, _React$Component);\n\n  function LinkElement() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LinkElement);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = LinkElement.__proto__ || Object.getPrototypeOf(LinkElement)).call.apply(_ref, [this].concat(args))), _this), _this.render = function () {\n      return _react2.default.createElement(\n        'a',\n        _this.props,\n        _this.props.children\n      );\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  return LinkElement;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _scrollLink2.default)(LinkElement);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/components/Link.js\n// module id = 1438\n// module chunks = 0 1","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/lodash.throttle/index.js\n// module id = 1439\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n  /*\r\n   * https://github.com/oblador/angular-scroll (duScrollDefaultEasing)\r\n   */\n  defaultEasing: function defaultEasing(x) {\n    if (x < 0.5) {\n      return Math.pow(x * 2, 2) / 2;\n    }\n    return 1 - Math.pow((1 - x) * 2, 2) / 2;\n  },\n  /*\r\n   * https://gist.github.com/gre/1650294\r\n   */\n  // no easing, no acceleration\n  linear: function linear(x) {\n    return x;\n  },\n  // accelerating from zero velocity\n  easeInQuad: function easeInQuad(x) {\n    return x * x;\n  },\n  // decelerating to zero velocity\n  easeOutQuad: function easeOutQuad(x) {\n    return x * (2 - x);\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuad: function easeInOutQuad(x) {\n    return x < .5 ? 2 * x * x : -1 + (4 - 2 * x) * x;\n  },\n  // accelerating from zero velocity \n  easeInCubic: function easeInCubic(x) {\n    return x * x * x;\n  },\n  // decelerating to zero velocity π\n  easeOutCubic: function easeOutCubic(x) {\n    return --x * x * x + 1;\n  },\n  // acceleration until halfway, then deceleration \n  easeInOutCubic: function easeInOutCubic(x) {\n    return x < .5 ? 4 * x * x * x : (x - 1) * (2 * x - 2) * (2 * x - 2) + 1;\n  },\n  // accelerating from zero velocity \n  easeInQuart: function easeInQuart(x) {\n    return x * x * x * x;\n  },\n  // decelerating to zero velocity \n  easeOutQuart: function easeOutQuart(x) {\n    return 1 - --x * x * x * x;\n  },\n  // acceleration until halfway, then deceleration\n  easeInOutQuart: function easeInOutQuart(x) {\n    return x < .5 ? 8 * x * x * x * x : 1 - 8 * --x * x * x * x;\n  },\n  // accelerating from zero velocity\n  easeInQuint: function easeInQuint(x) {\n    return x * x * x * x * x;\n  },\n  // decelerating to zero velocity\n  easeOutQuint: function easeOutQuint(x) {\n    return 1 + --x * x * x * x * x;\n  },\n  // acceleration until halfway, then deceleration \n  easeInOutQuint: function easeInOutQuint(x) {\n    return x < .5 ? 16 * x * x * x * x * x : 1 + 16 * --x * x * x * x * x;\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/smooth.js\n// module id = 1440\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _passiveEventListeners = require('./passive-event-listeners');\n\nvar events = ['mousedown', 'mousewheel', 'touchmove', 'keydown'];\n\nexports.default = {\n  subscribe: function subscribe(cancelEvent) {\n    return typeof document !== 'undefined' && events.forEach(function (event) {\n      return (0, _passiveEventListeners.addPassiveEventListener)(document, event, cancelEvent);\n    });\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/cancel-events.js\n// module id = 1441\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollLink = require('../mixins/scroll-link');\n\nvar _scrollLink2 = _interopRequireDefault(_scrollLink);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ButtonElement = function (_React$Component) {\n  _inherits(ButtonElement, _React$Component);\n\n  function ButtonElement() {\n    _classCallCheck(this, ButtonElement);\n\n    return _possibleConstructorReturn(this, (ButtonElement.__proto__ || Object.getPrototypeOf(ButtonElement)).apply(this, arguments));\n  }\n\n  _createClass(ButtonElement, [{\n    key: 'render',\n    value: function render() {\n      return _react2.default.createElement(\n        'input',\n        this.props,\n        this.props.children\n      );\n    }\n  }]);\n\n  return ButtonElement;\n}(_react2.default.Component);\n\n;\n\nexports.default = (0, _scrollLink2.default)(ButtonElement);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/components/Button.js\n// module id = 1442\n// module chunks = 0 1","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _scrollElement = require('../mixins/scroll-element');\n\nvar _scrollElement2 = _interopRequireDefault(_scrollElement);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar ElementWrapper = function (_React$Component) {\n  _inherits(ElementWrapper, _React$Component);\n\n  function ElementWrapper() {\n    _classCallCheck(this, ElementWrapper);\n\n    return _possibleConstructorReturn(this, (ElementWrapper.__proto__ || Object.getPrototypeOf(ElementWrapper)).apply(this, arguments));\n  }\n\n  _createClass(ElementWrapper, [{\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      // Remove `parentBindings` from props\n      var newProps = _extends({}, this.props);\n      if (newProps.parentBindings) {\n        delete newProps.parentBindings;\n      }\n\n      return _react2.default.createElement(\n        'div',\n        _extends({}, newProps, { ref: function ref(el) {\n            _this2.props.parentBindings.domNode = el;\n          } }),\n        this.props.children\n      );\n    }\n  }]);\n\n  return ElementWrapper;\n}(_react2.default.Component);\n\n;\n\nElementWrapper.propTypes = {\n  name: _propTypes2.default.string,\n  id: _propTypes2.default.string\n};\n\nexports.default = (0, _scrollElement2.default)(ElementWrapper);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/components/Element.js\n// module id = 1443\n// module chunks = 0 1","\"use strict\";\n\n/* DEPRECATED */\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require('react');\nvar ReactDOM = require('react-dom');\n\nvar utils = require('./utils');\nvar scrollSpy = require('./scroll-spy');\nvar defaultScroller = require('./scroller');\nvar PropTypes = require('prop-types');\nvar scrollHash = require('./scroll-hash');\n\nvar protoTypes = {\n  to: PropTypes.string.isRequired,\n  containerId: PropTypes.string,\n  container: PropTypes.object,\n  activeClass: PropTypes.string,\n  spy: PropTypes.bool,\n  smooth: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n  offset: PropTypes.number,\n  delay: PropTypes.number,\n  isDynamic: PropTypes.bool,\n  onClick: PropTypes.func,\n  duration: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),\n  absolute: PropTypes.bool,\n  onSetActive: PropTypes.func,\n  onSetInactive: PropTypes.func,\n  ignoreCancelEvents: PropTypes.bool,\n  hashSpy: PropTypes.bool\n};\n\nvar Helpers = {\n  Scroll: function Scroll(Component, customScroller) {\n\n    console.warn(\"Helpers.Scroll is deprecated since v1.7.0\");\n\n    var scroller = customScroller || defaultScroller;\n\n    var Scroll = function (_React$Component) {\n      _inherits(Scroll, _React$Component);\n\n      function Scroll(props) {\n        _classCallCheck(this, Scroll);\n\n        var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, props));\n\n        _initialiseProps.call(_this);\n\n        _this.state = {\n          active: false\n        };\n        return _this;\n      }\n\n      _createClass(Scroll, [{\n        key: 'getScrollSpyContainer',\n        value: function getScrollSpyContainer() {\n          var containerId = this.props.containerId;\n          var container = this.props.container;\n\n          if (containerId) {\n            return document.getElementById(containerId);\n          }\n\n          if (container && container.nodeType) {\n            return container;\n          }\n\n          return document;\n        }\n      }, {\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n          if (this.props.spy || this.props.hashSpy) {\n            var scrollSpyContainer = this.getScrollSpyContainer();\n\n            if (!scrollSpy.isMounted(scrollSpyContainer)) {\n              scrollSpy.mount(scrollSpyContainer);\n            }\n\n            if (this.props.hashSpy) {\n              if (!scrollHash.isMounted()) {\n                scrollHash.mount(scroller);\n              }\n              scrollHash.mapContainer(this.props.to, scrollSpyContainer);\n            }\n\n            if (this.props.spy) {\n              scrollSpy.addStateHandler(this.stateHandler);\n            }\n\n            scrollSpy.addSpyHandler(this.spyHandler, scrollSpyContainer);\n\n            this.setState({\n              container: scrollSpyContainer\n            });\n          }\n        }\n      }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n          scrollSpy.unmount(this.stateHandler, this.spyHandler);\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          var className = \"\";\n\n          if (this.state && this.state.active) {\n            className = ((this.props.className || \"\") + \" \" + (this.props.activeClass || \"active\")).trim();\n          } else {\n            className = this.props.className;\n          }\n\n          var props = _extends({}, this.props);\n\n          for (var prop in protoTypes) {\n            if (props.hasOwnProperty(prop)) {\n              delete props[prop];\n            }\n          }\n\n          props.className = className;\n          props.onClick = this.handleClick;\n\n          return React.createElement(Component, props);\n        }\n      }]);\n\n      return Scroll;\n    }(React.Component);\n\n    var _initialiseProps = function _initialiseProps() {\n      var _this2 = this;\n\n      this.scrollTo = function (to, props) {\n        scroller.scrollTo(to, _extends({}, _this2.state, props));\n      };\n\n      this.handleClick = function (event) {\n\n        /*\r\n         * give the posibility to override onClick\r\n         */\n\n        if (_this2.props.onClick) {\n          _this2.props.onClick(event);\n        }\n\n        /*\r\n         * dont bubble the navigation\r\n         */\n\n        if (event.stopPropagation) event.stopPropagation();\n        if (event.preventDefault) event.preventDefault();\n\n        /*\r\n         * do the magic!\r\n         */\n        _this2.scrollTo(_this2.props.to, _this2.props);\n      };\n\n      this.stateHandler = function () {\n        if (scroller.getActiveLink() !== _this2.props.to) {\n          if (_this2.state !== null && _this2.state.active && _this2.props.onSetInactive) {\n            _this2.props.onSetInactive();\n          }\n          _this2.setState({ active: false });\n        }\n      };\n\n      this.spyHandler = function (y) {\n\n        var scrollSpyContainer = _this2.getScrollSpyContainer();\n\n        if (scrollHash.isMounted() && !scrollHash.isInitialized()) {\n          return;\n        }\n\n        var to = _this2.props.to;\n        var element = null;\n        var elemTopBound = 0;\n        var elemBottomBound = 0;\n        var containerTop = 0;\n\n        if (scrollSpyContainer.getBoundingClientRect) {\n          var containerCords = scrollSpyContainer.getBoundingClientRect();\n          containerTop = containerCords.top;\n        }\n\n        if (!element || _this2.props.isDynamic) {\n          element = scroller.get(to);\n          if (!element) {\n            return;\n          }\n\n          var cords = element.getBoundingClientRect();\n          elemTopBound = cords.top - containerTop + y;\n          elemBottomBound = elemTopBound + cords.height;\n        }\n\n        var offsetY = y - _this2.props.offset;\n        var isInside = offsetY >= Math.floor(elemTopBound) && offsetY < Math.floor(elemBottomBound);\n        var isOutside = offsetY < Math.floor(elemTopBound) || offsetY >= Math.floor(elemBottomBound);\n        var activeLink = scroller.getActiveLink();\n\n        if (isOutside) {\n          if (to === activeLink) {\n            scroller.setActiveLink(void 0);\n          }\n\n          if (_this2.props.hashSpy && scrollHash.getHash() === to) {\n            scrollHash.changeHash();\n          }\n\n          if (_this2.props.spy && _this2.state.active) {\n            _this2.setState({ active: false });\n            _this2.props.onSetInactive && _this2.props.onSetInactive();\n          }\n\n          return scrollSpy.updateStates();\n        }\n\n        if (isInside && activeLink !== to) {\n          scroller.setActiveLink(to);\n\n          _this2.props.hashSpy && scrollHash.changeHash(to);\n\n          if (_this2.props.spy) {\n            _this2.setState({ active: true });\n            _this2.props.onSetActive && _this2.props.onSetActive(to);\n          }\n          return scrollSpy.updateStates();\n        }\n      };\n    };\n\n    ;\n\n    Scroll.propTypes = protoTypes;\n\n    Scroll.defaultProps = { offset: 0 };\n\n    return Scroll;\n  },\n  Element: function Element(Component) {\n\n    console.warn(\"Helpers.Element is deprecated since v1.7.0\");\n\n    var Element = function (_React$Component2) {\n      _inherits(Element, _React$Component2);\n\n      function Element(props) {\n        _classCallCheck(this, Element);\n\n        var _this3 = _possibleConstructorReturn(this, (Element.__proto__ || Object.getPrototypeOf(Element)).call(this, props));\n\n        _this3.childBindings = {\n          domNode: null\n        };\n        return _this3;\n      }\n\n      _createClass(Element, [{\n        key: 'componentDidMount',\n        value: function componentDidMount() {\n          if (typeof window === 'undefined') {\n            return false;\n          }\n          this.registerElems(this.props.name);\n        }\n      }, {\n        key: 'componentWillReceiveProps',\n        value: function componentWillReceiveProps(nextProps) {\n          if (this.props.name !== nextProps.name) {\n            this.registerElems(nextProps.name);\n          }\n        }\n      }, {\n        key: 'componentWillUnmount',\n        value: function componentWillUnmount() {\n          if (typeof window === 'undefined') {\n            return false;\n          }\n          defaultScroller.unregister(this.props.name);\n        }\n      }, {\n        key: 'registerElems',\n        value: function registerElems(name) {\n          defaultScroller.register(name, this.childBindings.domNode);\n        }\n      }, {\n        key: 'render',\n        value: function render() {\n          return React.createElement(Component, _extends({}, this.props, { parentBindings: this.childBindings }));\n        }\n      }]);\n\n      return Element;\n    }(React.Component);\n\n    ;\n\n    Element.propTypes = {\n      name: PropTypes.string,\n      id: PropTypes.string\n    };\n\n    return Element;\n  }\n};\n\nmodule.exports = Helpers;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scroll/modules/mixins/Helpers.js\n// module id = 1444\n// module chunks = 0 1","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class ShareNotification extends Component<any, any> {\n  static propTypes = {\n    onYes: PropTypes.func.isRequired,\n    onNo: PropTypes.func.isRequired,\n    onNever: PropTypes.func.isRequired\n  };\n\n  render() {\n    return (\n      <div className=\"ui-modal share-notification\">\n        <header className=\"ui-modal__header\" />\n        <div className=\"ui-modal__content\">\n          <h2>We see you've made changes!</h2>\n          <p>Would you like to share with your colleagues?</p>\n          <div className=\"ui-modal__actions\">\n            <button id=\"share-report-notification-accept\" className=\"ui-button primary report-share-share-button\" onClick={this.props.onYes}>Yes, share</button>\n            <button id=\"share-report-notification-ignore\" className=\"ui-button ghost report-share-ignore-button\" onClick={this.props.onNo}>Not now</button>\n          </div>\n          <button id=\"share-report-notification-disable\" className=\"ui-button ghost no-color small dismiss-forever-button\" onClick={this.props.onNever}>Do not show this notification again</button>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_notification.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport ReportPermissionOptions from './report_permission_options';\nimport ReportPermissionOption from './report_permission_option';\nimport ReportActions from '../actions/report_actions';\n\nexport default class ChangeReportPermission extends React.Component<any, any> {\n  static propTypes = {\n    initialPermission: PropTypes.object,\n    onSave: PropTypes.func,\n    onCancel: PropTypes.func\n  }\n\n  constructor(props) {\n    super(props);\n    this.state = {selectedOption: props.initialPermission};\n  }\n\n  onOptionClick = (selectedOption) => {\n    this.setState({selectedOption});\n  }\n\n  onSaveClick = () => {\n    const {selectedOption} = this.state;\n    ReportActions.updateReportPermission({\n      visibility: selectedOption.id\n    });\n\n    if (this.props.onSave) {\n      this.props.onSave();\n    }\n  }\n\n  render() {\n    return (\n      <div>\n        <div className=\"ui-modal__content\">\n          <h3>Edit sharing settings</h3>\n          <p>Change who is able to see this report.</p>\n          <ul className=\"ui-select-list\">\n            {ReportPermissionOptions.map(option =>\n              <ReportPermissionOption {...option} selected={option === this.state.selectedOption} onClick={() => this.onOptionClick(option)} />\n            )}\n          </ul>\n        </div>\n        <footer className=\"ui-modal__footer\">\n          <div className=\"ui-modal__actions\">\n            <a onClick={this.props.onCancel}>Cancel</a>\n            <button className=\"ui-button primary\" onClick={this.onSaveClick}>Save</button>\n          </div>\n        </footer>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/change_report_permission.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ShareIcon from './share_icons';\n\nexport default class ReportPermissionOption extends React.Component<any, any> {\n  static propTypes = {\n    name: PropTypes.string,\n    description: PropTypes.string,\n    selected: PropTypes.bool,\n    onClick: PropTypes.func\n  }\n\n  render() {\n    const itemClassName = classNames({\n      'ui-select-list__item': true,\n      'is-selected': this.props.selected\n    });\n\n    return (\n      <li onClick={this.props.onClick}>\n        <a className={itemClassName}>\n          <ShareIcon type={this.props.id} size={42}/>\n          <div className=\"share__option__body\">\n            <strong>{this.props.name}</strong>\n            <p className=\"share__option__description\">{this.props.description}</p>\n          </div>\n        </a>\n      </li>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/report_permission_option.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport InvitableUser from './invitable_user';\nimport ShareIcon from './share_icons';\nimport ErrorDisplay from './error_display';\nimport InviteeSearch from './invitee_search';\n\nimport * as InviteActions from '../actions/invite_actions';\n\nexport default class ShareOptionsContent extends React.Component<any, any> {\n  static propTypes = {\n    reportId: PropTypes.number.isRequired,\n    sessionId: PropTypes.number.isRequired,\n    entity: PropTypes.string.isRequired,\n    currentPermission: PropTypes.object,\n    transitionTo: PropTypes.func.isRequired,\n    invites: PropTypes.object.isRequired,\n    isLoadingUsers: PropTypes.bool.isRequired\n  }\n\n  onClick = () => {\n    if (!this.props.currentPermission.readonly) {\n      this.props.onEditPermission();\n    }\n  }\n\n  onRemoveUser = (user) => {\n    InviteActions.removeUser(user);\n    if (user.get('id') === this.props.sessionId) {\n      this._loadReportIndex();\n    }\n  }\n\n  renderInvitedUsers = () => {\n    const {\n      users,\n      currentInvitedUsers,\n      reportRoles\n    } = this.props.invites;\n\n    return users.map(user => {\n      const invite = currentInvitedUsers.filter(u => u.get('id') === user.get('id')).first();\n      return (\n      <InvitableUser\n        user={user}\n        key={user.get('id')}\n        invite={invite}\n        reportRoles={reportRoles}\n        onRemoveUser={this.onRemoveUser}\n        updateRole={this._updateRole}/>\n      );\n    });\n  }\n\n  render() {\n    const {currentPermission, onBack} = this.props;\n\n    return (\n      <span>\n        <div className=\"ui-modal__content\">\n          <a className=\"share-panel-navigation-link back-link\" onClick={onBack}>\n            <span className=\"icon-lefthead-2 share-panel-navigation-link-arrow\"></span>\n            Back\n          </a>\n          <h3 className=\"share-panel-inline-header\">Report Access</h3>\n        </div>\n        <div className=\"ui-modal__content\">\n          <div className=\"share__options\">\n            <div className=\"share__option\">\n              <ShareIcon type={currentPermission.id} size={42}/>\n              {!currentPermission.readonly ? <a className=\"ui-button small ghost\" onClick={this.onClick}>Change</a> : null}\n              <div className=\"share__option__body\">\n                <strong className=\"share__option__name\">{currentPermission.name}</strong>\n                <p className=\"share__option__description\">{currentPermission.description}</p>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div className=\"ui-modal__content\">\n          { this.props.error ?\n            <ErrorDisplay error={this.props.error} /> :\n            null\n          }\n          <h3>Who can see this report?</h3>\n          <p>Invite members of your organization to this report.</p>\n          <div className=\"share__users\">\n            <InviteeSearch\n              {...this.props.invites.search}\n              isLoadingUsers={this.props.isLoadingUsers}\n              />\n            {currentPermission.id === 'my_organization' ?\n              <div className=\"share__user share__user_my-org\">\n                <ShareIcon type=\"my_organization\"/>\n                <strong className=\"share__user__name\">My organization</strong>\n              </div>\n            : null}\n            {this.props.invites.owner && this.props.invites.owner.get('id') ?\n              <InvitableUser\n                user={this.props.invites.owner}\n                key={this.props.invites.owner.get('id')}\n                isOwner\n                reportRoles={this.props.invites.reportRoles}\n                onRemoveUser={this.onRemoveUser}\n                updateRole={this._updateRole} />\n            : null}\n            { this.renderInvitedUsers() }\n            { this.props.invites.pendingUser ?\n                <InvitableUser\n                  user={this.props.invites.pendingUser}\n                  pending={true}\n                  key={this.props.invites.pendingUser.get('id')}\n                  reportRoles={this.props.invites.reportRoles}\n                  onRemoveUser={this.onRemoveUser}\n                  updateRole={this._updateRole} /> :\n                null }\n          </div>\n        </div>\n      </span>\n    );\n  }\n\n  _loadReportIndex() {\n    const { entity } = this.props;\n\n    this.props.transitionTo('report-index', {entity});\n  }\n\n  _reloadReport() {\n    window.location.reload();\n  }\n\n  _updateRole = (userId, role) => {\n    const { reportId, sessionId } = this.props;\n\n    // TODO: GRA-462: actually handle the response from the server correctly\n    // fix this method as well as _loadReportIndex() and _reloadReport()\n    InviteActions.updateUserRole(userId, reportId, role).then(() => {\n      //if we are changing the owner redirect to the report page\n      if (role === 'owner') {\n        this._loadReportIndex();\n      }\n\n      //if we are editing a role for current user reload page\n      if (userId === sessionId) {\n        this._reloadReport();\n      }\n    });\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_options_content.tsx","import moment from 'moment';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Avatar } from '@opengov/ovid';\nimport OwnerConfirmation from './owner_confirmation';\nimport ShareOptionsDropdown from './share_options_dropdown';\n\nexport default class InvitableUser extends React.Component<any, any> {\n  static propTypes = {\n    user: PropTypes.object.isRequired,\n    reportRoles: PropTypes.object.isRequired,\n    updateRole: PropTypes.func.isRequired,\n    onRemoveUser: PropTypes.func.isRequired,\n    pending: PropTypes.bool\n  }\n\n  state = {\n    showConfirmation: false\n  };\n\n  render() {\n    const {\n      user,\n      pending,\n      invite,\n      isOwner\n    } = this.props;\n\n    const userClasses = classNames({\n      share__user: true,\n      share__user__pending: pending\n    });\n\n    let userMessage;\n\n    if (invite) {\n      const hasUserSeenReport = invite.get('last_seen') !== null;\n      userMessage = hasUserSeenReport ? 'Viewed' : 'Invited';\n      if (hasUserSeenReport) {\n        userMessage += ` ${moment(invite.get('last_seen')).fromNow()}`;\n      }\n    }\n\n    if (isOwner) {\n      userMessage = 'Report Owner';\n    }\n\n    return (\n      <div key={user.get('id')} className={userClasses}>\n        {/* Here's someone you've shared your report with */}\n        <Avatar\n          id={user.get('id')}\n          size=\"small\"\n          firstName={user.get('first_name')}\n          lastName={user.get('last_name')}\n          email={user.get('email')}\n          url={user.get('avatar')}\n        />\n        <span className=\"share__user__name\">\n          <strong>{user.get('full_name')}</strong> {user.get('isCurrentUser') && <span>(You)</span>}\n          {userMessage && <small>{userMessage}</small>}\n        </span>\n        {!isOwner && this._getActionSection()}\n        {this.state.showConfirmation &&\n          <OwnerConfirmation\n            confirm={this._onChangeRole}\n            cancel={this._hideConfirmation}/>}\n      </div>);\n  }\n\n  _getActionSection = () => {\n    const { user, reportRoles, onRemoveUser } = this.props;\n\n    const content = this.props.pending ?\n      (\n        <div className=\"share__user__action pending__label\">\n          Pending...\n        </div>\n      ) : (\n        <div className=\"share__user__action\">\n          <ShareOptionsDropdown options={reportRoles} onChange={this._onChangeRole} user={user} />\n          <a className=\"share__user__remove ui-button small ghost negative icon-remove-2\"\n            data-hint=\"Remove user from report\"\n            data-hint-position=\"bottom\"\n            data-hint-align=\"right\"\n            onClick={() => onRemoveUser(user)}/>\n          </div>\n        );\n\n    return (\n      <div className=\"share__user__action\">\n        {content}\n      </div>\n    );\n  }\n\n  _onChangeRole = (value, confirmOwner = true) => {\n    const { user, updateRole } = this.props;\n\n    if (value === 'owner' && confirmOwner) {\n      this.setState({ showConfirmation: true });\n      return;\n    }\n    updateRole(user.get('id'), value);\n  }\n\n  _hideConfirmation = () => {\n    this.setState({ showConfirmation: false });\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/invitable_user.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport default class OwnerConfirmation extends React.Component<any, any> {\n  static propTypes = {\n    confirm: PropTypes.func.isRequired,\n    cancel: PropTypes.func.isRequired\n  }\n\n  render() {\n    const { cancel } = this.props;\n\n    return (\n      <div className=\"share__confirmation\">\n        <h5>Are you sure?</h5>\n        <p>\n          Changing owners will remove your access to this report unless you are invited again.\n        </p>\n        <div className=\"share__confirmation__buttons\">\n          <button className=\"ui-button small ghost\" onClick={cancel}>Cancel</button>\n          <button className=\"ui-button primary small\" onClick={this._onConfirm}>Confirm</button>\n        </div>\n      </div>);\n  }\n\n  _onConfirm = () => {\n    const { confirm } = this.props;\n\n    confirm('owner', false);\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/owner_confirmation.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\n\nexport default class ShareOptionsDropdown extends React.Component<any, any> {\n  static propTypes = {\n    options: PropTypes.object.isRequired,\n    onChange: PropTypes.func.isRequired,\n    user: PropTypes.object.isRequired\n  }\n\n  render() {\n    const { options, onChange, user } = this.props;\n    return (\n      <DropdownList\n        defaultTitle={user.get('reportRole')}\n        position=\"align-right\"\n        onChange={onChange}>\n        {options.map(option =>\n          <DropdownListItem\n            title={option.get('display_name')}\n            key={option.get('name')}\n            value={option.get('name')} />\n        )}\n      </DropdownList>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/share_options_dropdown.tsx","import React from 'react';\n\nimport * as InviteActions from '../actions/invite_actions';\n\nexport const getInviteErrorMessage = (type) => {\n  switch (type) {\n  case 'inviteFailed':\n    return 'Could not invite the user';\n\n  case 'notAuthorized':\n    return 'You are not authorized to make this change';\n\n  default:\n    return 'An error has occurred';\n  }\n};\n\nconst ErrorDisplay = ({ error }) => (\n  <div className=\"ui-alert-box whoops\">\n    <span className=\"icon-exclamation-1\" />\n    {getInviteErrorMessage(error)}\n    <div className=\"ui-alert__actions\">\n      <button className=\"ui-button small\" onClick={InviteActions.dismissError}>Ok</button>\n    </div>\n  </div>\n);\n\nexport default ErrorDisplay;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/error_display.tsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { debounce, isEmpty } from 'lodash';\nimport { Search } from '@opengov/ovid';\n\nimport * as InviteActions from '../actions/invite_actions';\n\nexport default class InviteeSearch extends Component<any, any> {\n  static propTypes = {\n    query: PropTypes.string,\n    results: PropTypes.object,\n    isLoadingUsers: PropTypes.bool.isRequired\n  }\n\n  onInputChange = debounce((value) => {\n    InviteActions.updateSearchQuery(value);\n  }, 150)\n\n  onSelectResult = (index) => {\n    const { results } = this.props;\n    const user = results.get(index);\n    if (user) {\n      InviteActions.addUser(user);\n    }\n  }\n\n  getResults() {\n    if (isEmpty(this.props.query)) {\n      return;\n    }\n\n    const { query, results } = this.props;\n\n    return {\n      heading: `${results.count()} matches to \"${query}\" in your organization`,\n      items: results.map((user) => ({\n        title: user.get('full_name'),\n        type: user.get('email')\n      })).toArray()\n    };\n  }\n\n  render() {\n    return (\n      <Search\n        placeholder={this.props.isLoadingUsers ? 'Loading members...' : 'Search by name or email'}\n        results={this.getResults()}\n        onInputChange={this.onInputChange}\n        onSelectResult={this.onSelectResult} />\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/share/invitee_search.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport GridDownloadMenu from './grid_download_menu';\nimport { StoreListener } from '@opengov/og_flux';\nimport GridReportStore from '../../stores/grid_report_store';\nimport GridReportActions from '../../actions/grid_report_actions';\n\nimport createReactClass from 'create-react-class';\n\nconst ExportFilter = createReactClass<any, any>({\n  mixins: [StoreListener(GridReportStore)] as any,\n  propTypes: {\n    fiscalYears: PropTypes.array,\n    fullDataSet: PropTypes.object,\n    showExportFilter: PropTypes.bool,\n    hideExportFilter: PropTypes.bool,\n    isLoading: PropTypes.bool\n  },\n  getDefaultProps() {\n    return {\n      email: null,\n      fiscalYears: [],\n      showExportFilter: false,\n      fullDataSet: null\n    };\n  },\n  getInitialState() {\n    return {\n      shouldShowExportFilter: GridReportStore.isShowingExportFilter(),\n      parallelCapable: GridReportStore.getSchema().get('dbParallelCapable')\n    };\n  },\n  storeDidUpdate() {\n    this.setState({\n      shouldShowExportFilter: GridReportStore.isShowingExportFilter(),\n      parallelCapable: GridReportStore.getSchema().get('dbParallelCapable')\n    });\n  },\n  render() {\n    return (\n      <div id=\"grid-download-content\">\n        {!this.state.shouldShowExportFilter && (\n          <GridDownloadMenu\n            stateScaleEntity={this.state.parallelCapable}\n            fiscalYears={this.props.fiscalYears}\n            fullDataSet={this.props.fullDataSet}\n            onExportFilter={GridReportActions.showExportFilter}\n            isLoading={this.props.isLoading}\n          />\n        )}\n      </div>\n    );\n  }\n});\n\nexport default ExportFilter;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/index.tsx","import React from 'react';\nimport createReactClass from 'create-react-class';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport cn from 'classnames';\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\nimport utils from '../../querygrid/utils';\n\nexport const ROW_LIMIT = 50000;\n\nconst GridDownloadMenu = createReactClass<any, any>({\n  propTypes: {\n    stateScaleEntity: PropTypes.bool,\n    fiscalYears: PropTypes.array,\n    fullDataSet: PropTypes.object,\n    isLoading: PropTypes.bool,\n    reportDataSize: PropTypes.number,\n    onExportFilter: PropTypes.func.isRequired,\n    headerOptions: PropTypes.object\n  },\n  getDefaultProps() {\n    return {\n      fiscalYears: [],\n      fullDataSet: null,\n      reportDataSize: 0\n    };\n  },\n  buttonItem(fiscalYear, index) {\n    return (\n      <a className=\"ui-button flex-btn\" target=\"_blank\" href={fiscalYear.url} key={`${fiscalYear.name}_${index}`}>\n        <span className=\"flex-item icon-csv-1\" aria-label=\"File type CSV\">{fiscalYear.name}</span>\n        <small className=\"icon-download-1\" aria-label=\"File size\">{fiscalYear.size}</small>\n      </a>\n    );\n  },\n  buttonContainer(content, key, stacked) {\n    return (\n      <div className={cn('transaction-download', {'ui-button-stack': stacked})}>\n        {content}\n      </div>\n    );\n  },\n  tooManyRowsError(rowsLimit) {\n    return (`Filter selections with more than ${utils.formatNumberComma(rowsLimit)} rows are not available for export at this time`);\n  },\n  exportFilterButton() {\n    const { headerOptions, onExportFilter } = this.props;\n    const session = SessionStore.getSession();\n    const rowsCount = headerOptions && headerOptions.griddleState.count;\n    const exportDisabled = !session && rowsCount > ROW_LIMIT;\n\n    return (\n      <div data-hint-position=\"bottom\" data-hint={exportDisabled ? this.tooManyRowsError(ROW_LIMIT) : null}>\n        <button className={cn('ui-button primary block', { disabled: exportDisabled })} onClick={onExportFilter}>\n          {exportDisabled ? 'Exporting Unavailable' : 'Export Current View'}\n        </button>\n      </div>\n    );\n  },\n\n  renderContent() {\n    const { stateScaleEntity, isLoading, fiscalYears, fullDataSet } = this.props;\n\n    if (!isLoading && (fiscalYears.length > 0 || fullDataSet)) {\n      return (\n        <div>\n          <p className=\"message\">Export the currently filtered view or select which file to download:</p>\n          {this.exportFilterButton()}\n          {fullDataSet && this.buttonContainer(this.buttonItem(fullDataSet), 'fullDataSetContainer', false)}\n          {this.buttonContainer(_.map(fiscalYears, this.buttonItem), 'fiscalYears', true)}\n        </div>\n      );\n    }\n\n    return (\n      <div>\n        {this.exportFilterButton()}\n        {!stateScaleEntity && <p className=\"no-data\">We are generating yearly export files. Check back later for more options.</p>}\n      </div>\n    );\n  },\n\n  render() {\n    const { isLoading } = this.props;\n\n    return (\n      <div id=\"dropdown-grid-download\">\n        <div className=\"ui-card__header\"><h4>Download Data</h4></div>\n        <div className=\"ui-card__content\">\n          {isLoading ?\n            <div className=\"ui-loading_small\"></div> :\n            this.renderContent()\n          }\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default GridDownloadMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/grid_download_menu.tsx","import React from 'react';\nimport GridReportActions from '../actions/grid_report_actions';\nimport { isTargetGraph, getTargetText, isTargetValid } from '../utils/target_utils';\n\nexport default class TargetToggle extends React.Component<any, any> {\n  render() {\n    const { isControlPanel, isPanelOpen, graphType, isVisShown, target } = this.props;\n\n    if (isControlPanel) {\n      return (\n        <div>\n          <div className=\"ui-mainpanel__section-header\">\n            Target\n          </div>\n          <div className=\"ui-mainpanel__section\">\n            <div className={`filter-toggle ui-button small target-toggle ${ isPanelOpen ? 'active' : ''} ${ !(isVisShown && isTargetGraph(graphType)) ? 'disabled' : '' }`}\n                 onClick={GridReportActions.toggleTargetPanel} >\n              <span className=\"target-toggle__text\">\n                { isTargetValid(target) ?\n                  getTargetText(target)\n                  :\n                  'Add a Target'\n                }\n              </span>\n              <div className=\"filter-toggle__actions\">\n                <span className=\"ui-panel-toggle__close\"></span>\n                <span className=\"ui-panel-toggle__open\"></span>\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    } else {\n      if(isTargetValid(target)) {\n        return (\n          <div>\n            <div className=\"ui-mainpanel__section-header\">\n              Target\n            </div>\n            <div className=\"ui-mainpanel__section\">\n              {getTargetText(target)}\n            </div>\n          </div>\n        );\n      } else {\n        return null;\n      }\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/targets/target_toggle.tsx","import React from 'react';\nimport { findDOMNode } from 'react-dom';\nimport GridReportActions from '../actions/grid_report_actions';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport { Map } from 'immutable';\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\n\nimport { isNumeric, targetTypes, isBetweenTarget } from '../utils/target_utils';\nimport TargetProgressBar from './target_progress_bar';\n\nexport default class TargetPanelContainer extends React.Component<any, any> {\n  targetPanel: any;\n  fromInput: any;\n  toInput: any;\n  warningFromInput: any;\n  warningToInput: any;\n  warningInput: any;\n  valueInput: any;\n\n  constructor(props) {\n    super(props);\n\n    const { target } = this.props;\n    const type = target.get('type') || targetTypes.Above;\n\n    if (isBetweenTarget(type)) {\n      this.state = {\n        type,\n        value: {\n          from: target.getIn(['value', 'from']),\n          to: target.getIn(['value', 'to'])\n        },\n        warning: {\n          from: target.getIn(['warning', 'from']),\n          to: target.getIn(['warning', 'to'])\n        }\n      };\n    } else {\n      this.state = {\n        type,\n        value: target.get('value'),\n        warning: target.get('warning')\n      };\n    }\n  }\n\n  componentWillMount() {\n    this._subscribeDOMEvents();\n  }\n\n  componentWillUnmount() {\n    this._unsubscribeDOMEvents();\n  }\n\n  _subscribeDOMEvents = () => {\n    $(document).on('click', this.handleDocumentClick);\n  }\n\n  _unsubscribeDOMEvents = () => {\n    $(document).off('click', this.handleDocumentClick);\n  }\n\n  isBetweenValuesValid = () => {\n    const { from, to } = this.state.value;\n    return !(from && to) || parseFloat(to) > parseFloat(from);\n  }\n\n  isTargetValid = () => {\n    const { type, value } = this.state;\n\n    if (isBetweenTarget(type)) {\n      return (\n        isNumeric(value.from) &&\n        isNumeric(value.to) &&\n        this.isBetweenValuesValid() &&\n        _.every((this.isWarningThresholdValid() as any), Boolean)\n      );\n    } else {\n      return isNumeric(value) && this.isWarningThresholdValid();\n    }\n  }\n\n  isWarningThresholdValid = () => {\n    const { type, value, warning } = this.state;\n\n    if (isBetweenTarget(type)) {\n      const noWarningProvided = !(warning.from && warning.to);\n      return {\n        from: noWarningProvided || (parseFloat(warning.from) < parseFloat(value.from)),\n        to: noWarningProvided || (parseFloat(warning.to) > parseFloat(value.to))\n      };\n    } else {\n      const valueAsFloat = parseFloat(value);\n      const warningAsFloat = parseFloat(warning);\n      return !warning || (type === targetTypes.Above ? warningAsFloat < valueAsFloat : warningAsFloat > valueAsFloat);\n    }\n  }\n\n  handleDocumentClick = (e) => {\n    const inContainer = $.contains(findDOMNode(this.targetPanel) as Element, e.target);\n\n    if (!inContainer) {\n      GridReportActions.toggleTargetPanel();\n    }\n  }\n\n  handleTargetChange = () => {\n    const { type } = this.state;\n    const stripInput = (input) => input.replace(/[^0-9.]/g, '');\n\n    if (isBetweenTarget(type)) {\n      this.setState({\n        value: {\n          from: stripInput(this.fromInput.value),\n          to: stripInput(this.toInput.value),\n        },\n        warning: {\n          from: stripInput(this.warningFromInput.value),\n          to: stripInput(this.warningToInput.value)\n        }\n      });\n    } else {\n      this.setState({ value: stripInput(this.valueInput.value), warning: stripInput(this.warningInput.value) });\n    }\n  }\n\n  handleTargetSave = () => {\n    const { type, value, warning } = this.state;\n\n    if (isBetweenTarget(type)) {\n      GridReportActions.setTarget({\n        type,\n        value: Map({ from: value.from, to: value.to }),\n        warning: Map({ from: warning.from, to: warning.to })\n      });\n    } else {\n      // If warning value is no provided we must set it to `null`\n      // otherwise the grid state api will not accept it. Attribute values\n      // may not contain empty strings.\n      GridReportActions.setTarget({ type, value, warning: warning || null });\n    }\n\n    GridReportActions.toggleTargetPanel();\n  }\n\n  handleTypeChange = (type) => {\n    this.setState({\n      type,\n      value: isBetweenTarget(type) ? {} : '',\n      warning: isBetweenTarget(type) ? {} : ''\n    });\n  }\n\n  render() {\n    const { type, value, warning } = this.state;\n    const warningThresholdValid: any = this.isWarningThresholdValid();\n\n    return (\n      <div ref={(targetPanel) => { this.targetPanel = targetPanel; }} className=\"subpanels js-subpanels is-expanded\">\n        <div className=\"subpanel ui-panel js-subpanel ready open\">\n          <header className=\"ui-panel__header\">\n            <h3>Targets</h3>\n            <span className=\"ui-panel__close\" onClick={GridReportActions.toggleTargetPanel} />\n          </header>\n          <div className=\"ui-panel__content target_panel\">\n            <div className=\"subpanel__options form_section\">\n              My <span className=\"onTarget\">Target</span> is\n              <div className=\"types-select\" >\n                <DropdownList value={type} onChange={this.handleTypeChange}>\n                  {\n                    _.map(targetTypes, (value, key) => (\n                      <DropdownListItem key={key} title={key} value={value} />\n                    ))\n                  }\n                </DropdownList>\n              </div>\n              {\n                isBetweenTarget(type) ?\n                <span>\n                  <input\n                    className=\"shortestShortest\"\n                    placeholder=\"ex. 500\"\n                    type=\"text\"\n                    value={value.from}\n                    ref={(fromInput) => this.fromInput = fromInput}\n                    onChange={this.handleTargetChange}/>\n                  <br/>\n                  <span> and </span>\n                  <input\n                    className=\"shortestShortest\"\n                    placeholder=\"ex. 1000\"\n                    type=\"text\"\n                    value={value.to}\n                    ref={(toInput) => this.toInput = toInput}\n                    onChange={this.handleTargetChange}/>\n                  <span className={`error betweenError ${this.isBetweenValuesValid() ? 'hidden' : ''}`}>\n                    <span className=\"icon-remove-2\"></span> This value needs to be higher than the first.\n                  </span>\n                  <span>, and consider <span className=\"onTrack\">On Track</span></span>\n                  <br />\n                  <span>above</span>\n                  <input\n                    className=\"shortestShortest\"\n                    placeholder=\"ex. 300\"\n                    type=\"text\"\n                    value={warning.from}\n                    ref={(warningFromInput) => this.warningFromInput = warningFromInput}\n                    onChange={this.handleTargetChange} />\n                    <span className={`error targetWarningError ${warningThresholdValid.from ? 'hidden' : ''}`}>\n                      <span className=\"icon-remove-2\"></span> This value needs to be <br/> lower than your target.\n                    </span>\n                  <span>and below</span>\n                  <input\n                    className=\"shortestShortest\"\n                    placeholder=\"ex. 1200\"\n                    type=\"text\"\n                    value={warning.to}\n                    ref={(warningToInput) => this.warningToInput = warningToInput}\n                    onChange={this.handleTargetChange} />\n                    <span className={`error targetWarningError ${warningThresholdValid.to ? 'hidden' : ''}`}>\n                      <span className=\"icon-remove-2\"></span> This value needs to be <br /> higher than your target.\n                    </span>\n                  <span>.</span>\n                  <br />\n                </span>\n                :\n                <span>\n                  <input\n                    type=\"text\"\n                    className=\"shortestShortest target-panel__target_input\"\n                    placeholder={type === targetTypes.Above ? 'ex. 1000' : 'ex. 500'}\n                    value={value}\n                    ref={(valueInput) => this.valueInput = valueInput}\n                    onChange={this.handleTargetChange}/>\n                  <span>,</span>\n                  <br />\n                  <span>and I consider <span className=\"onTrack\">On Track</span> {type}</span>\n                  <input\n                    type=\"text\"\n                    className=\"shortestShortest\"\n                    placeholder={type === targetTypes.Above ? 'ex. 500' : 'ex. 1000'}\n                    value={warning}\n                    ref={(warningInput) => this.warningInput = warningInput}\n                    onChange={this.handleTargetChange} />\n                    <span className={`error targetWarningError ${warningThresholdValid ? 'hidden' : ''}`}>\n                      <span className=\"icon-remove-2\"></span> This value needs to be <br /> {type === targetTypes.Above ? 'lower' : 'higher'} than your target.\n                    </span>\n                  <span>.</span>\n                </span>\n              }\n            </div>\n            <div className=\"subpanel__options progress_section\">\n              <div className=\"ui-mainpanel__section-header\">\n                RESULT\n              </div>\n              <TargetProgressBar type={type} value={value} warning={warning} />\n            </div>\n            <footer className=\"ui-panel__footer\">\n              <div className=\"ui-panel__actions\">\n                <button className=\"ui-button ghost no-color\" onClick={GridReportActions.toggleTargetPanel}>Cancel</button>\n                <button className={`ui-button primary ${!this.isTargetValid() ? 'disabled' : ''}`} onClick={this.handleTargetSave} disabled={!this.isTargetValid() ? true : false}>Add Target</button>\n              </div>\n            </footer>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/targets/target_panel.tsx","import React from 'react';\n\nimport querygridUtils from '../querygrid/utils';\nimport { targetStatuses, getProgressBars, getProgressValues } from '../utils/target_utils';\n\nconst { formatNumberComma } = querygridUtils;\n\nexport default class TargetProgressBar extends React.Component<any, any> {\n  renderBarComponent = (status, value: any = {}) => {\n    const amount = value.amount;\n    const placeholder = value.placeholder;\n\n    return (\n      <div className={`progress-bar ${status}`}>\n        <div className={`value ${amount ? '' : 'placeholder'}`}>{amount ? formatNumberComma(amount) : `ex. ${placeholder}`}</div>\n        <div className=\"bar\"><div className=\"inner\" /></div>\n        <div className=\"text\">\n          { targetStatuses[status] }\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { type, value, warning } = this.props;\n\n    const bars = getProgressBars(type);\n    const progressValues = getProgressValues(type, value, warning);\n    return (\n      <div className={`progress ${type}`}>\n        { bars.map((status, i) => this.renderBarComponent(status, progressValues[i])) }\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/targets/target_progress_bar.tsx","import React from 'react';\nimport { getTargetStatus, targetStatuses } from '../utils/target_utils';\n\nexport default class TargetStatus extends React.Component<any, any> {\n  render() {\n    const { target, current } = this.props;\n    const status = getTargetStatus(target, current);\n\n    return (\n      <div className={`ui-mainpanel__section target-status ${status}`}>\n        <span className=\"target-status__dot\">\n        </span>\n        <span className=\"target-status__text\">\n          { targetStatuses[status] }\n        </span>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/targets/target_status.tsx","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport transitionDefaults from './utils/css_transition_defaults';\nimport _ from 'lodash';\nimport {CheckMock, Dropdown} from '@opengov/ovid';\nimport GridReportActions from './actions/grid_report_actions';\nimport SharedLinkHelper from './share/shared_link_helper';\nimport ShareList from './share/share_links';\nimport config from './config';\nimport api from '@opengov/og_api';\nimport utils from './querygrid/utils';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport createReactClass from 'create-react-class';\n\nconst { CheckSettings } = config;\n\nconst CheckMessageLink = createReactClass<any, any>({\n  propTypes: {\n    itemKey: PropTypes.string.isRequired,\n    text: PropTypes.string.isRequired,\n    value: PropTypes.string.isRequired,\n    handleFilter: PropTypes.func.isRequired\n  },\n\n  handleFilter(e) {\n    e.preventDefault();\n\n    this.props.handleFilter(this.props.itemKey, this.props.value);\n  },\n\n  render() {\n    return <a href=\"#\" onClick={this.handleFilter}>{this.props.text}</a>;\n  }\n});\n\nexport const CheckMessage = createReactClass<any, any>({\n  propTypes: {\n    voucherId: PropTypes.string,\n    handleFilter: PropTypes.func.isRequired,\n    amountColumn: PropTypes.string.isRequired,\n    relatedTransactions: PropTypes.object,\n    checkData: PropTypes.object\n  },\n\n  handleFilter(key, value) {\n    this.props.handleFilter({value, key});\n  },\n\n  getLink(key, text, value) {\n    return <CheckMessageLink itemKey={key} text={text} value={value || text} handleFilter={this.handleFilter} />;\n  },\n\n  getCheckMessage() {\n    if (!this.props.relatedTransactions || this.props.relatedTransactions.loading) {\n      return <div className=\"ui-loading_small\"></div>;\n    }\n\n    return this.props.relatedTransactions.amount ?\n      (\n        <p>\n          This ${utils.formatMonetary(this.props.checkData[this.props.amountColumn])} payment for {this.getLink('expense_type', this.props.checkData.expense_type)} is part of a larger check total of ${utils.formatMonetary(this.props.relatedTransactions.amount)} from the {this.getLink('department', this.props.checkData.department)}.\n          If you would like to see a list of the other payments included in {(_.find(CheckSettings.descriptionFields, ({key: 'voucher_id'})) as any).label} {this.getLink('voucher_id', this.props.checkData.voucher_id)}, {this.getLink('voucher_id', 'click here', this.props.checkData.voucher_id)}.\n        </p>\n      ) :\n      null;\n  },\n\n  render() {\n    const cx = classNames({\n      'check-panel__description': true,\n      'message-loading': !this.props.relatedTransactions || this.props.relatedTransactions.loading\n    });\n\n    return <div className={cx}>{this.getCheckMessage()}</div>;\n  }\n});\n\nexport const PdfButton = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.string,\n    issuer: PropTypes.string,\n    checkDate: PropTypes.string,\n    checkNumber: PropTypes.string,\n    recipient: PropTypes.string,\n    dollarAmount: PropTypes.string,\n    centsAmount: PropTypes.string,\n    memo: PropTypes.string\n  },\n\n  //this operation is in more recent versions of lodash\n  toSnakeCase(value) {\n    return value.replace(/([A-Z])/g, function(word) {return '_' + word.toLowerCase();});\n  },\n\n  getQueryStringPart(key, value) {\n    const parseValues = ['dollarAmount', 'centsAmount'];\n    return `${this.toSnakeCase(key)}=${(_.includes(parseValues, key) && typeof value === 'string' ?\n      utils.parseMonetary(value) :\n      encodeURIComponent(value))}`;\n  },\n\n  getUrl(baseUrl, checkData) {\n    const queryString = this.getQueryString(checkData);\n    baseUrl += baseUrl.indexOf('?') > -1 ? '&' + queryString : '?' + queryString;\n    return baseUrl;\n  },\n\n  getQueryString(checkData) {\n    const checkProperties = _.chain(checkData)\n      .toPairs()\n      .filter(function(checkProperty) { return !!checkProperty[1]; })\n      .map(_.bind(function(checkProperty) {\n        return this.getQueryStringPart(checkProperty[0], checkProperty[1]);\n      }, this));\n\n    return checkProperties.join('&');\n  },\n\n  render() {\n    const url = this.getUrl(`${api.core._apiUrl}${CheckSettings.pdfPath}`, this.props);\n    return (\n      <a href={url} className=\"ui-button\" target=\"_blank\">Save PDF</a>\n    );\n  }\n});\n\nexport const CheckDescriptionItems = createReactClass<any, any>({\n  propTypes: {\n    checkData: PropTypes.object.isRequired,\n    entity: PropTypes.string.isRequired,\n    locale: PropTypes.string\n  },\n\n  getDefaultProps() {\n    return {\n      descriptionFields: CheckSettings.descriptionFields,\n      checkData: null,\n      entity: null\n    };\n  },\n\n  getValue(checkDescription) {\n    if (checkDescription.key === 'entity') {\n      return this.props.entity;\n    } else if (checkDescription.key === 'amount') {\n      return this.props.checkData[this.props.amountColumn];\n    } else {\n      return this.props.checkData[checkDescription.key];\n    }\n  },\n\n  render() {\n    const getColumn = (checkDescription) => {\n      const checkDescriptionValue = this.getValue(checkDescription);\n      const currentField: any = _.find(this.props.descriptionFields, {key: checkDescription.key});\n      const format = !!currentField ? currentField.format : null;\n      return (\n        <div className=\"ui-col-3of6\" key={checkDescription.key}>\n          <CheckDescriptionItem\n            label={checkDescription.label}\n            value={checkDescriptionValue ? checkDescriptionValue : 'NA'}\n            resourceKey={checkDescription.key}\n            filterable={!!(checkDescription.hasOwnProperty('filter') && checkDescription.filter && checkDescriptionValue)}\n            format={format}\n            locale={this.props.locale}\n            handleFilter={this.props.handleFilter} />\n        </div>\n      );\n    };\n\n    //_.chunk isn't available in current lodash\n    const filteredFields = _.reject(this.props.descriptionFields, (element: any) => {\n      return element.hidden === true;\n    });\n    const descriptionPairs = _.toArray(_.groupBy(filteredFields, (element) => {\n      const index = filteredFields.indexOf(element);\n      return Math.floor(index / 2);\n    }));\n\n    const rows = descriptionPairs.map((items) => {\n      return (\n        <div className=\"ui-row\" key={items[0].label}>\n        {items.length > 1 ?\n          [getColumn(items[0]), getColumn(items[1])] :\n          getColumn(items[0]) }\n        </div>\n      );\n    });\n\n    return <div className=\"check-panel__details\">{rows}</div>;\n  }\n});\n\nvar CheckDescriptionItem = createReactClass<any, any>({\n  propTypes: {\n    label: PropTypes.string.isRequired,\n    value: PropTypes.string,\n    resourceKey: PropTypes.string,\n    filterable: PropTypes.bool,\n    format: PropTypes.string,\n    locale: PropTypes.string,\n    handleFilter: PropTypes.func.isRequired\n  },\n\n  handleClick(e) {\n    e.preventDefault();\n    //do something to filter the grid based on the current key / value and close the panel\n    this.props.handleFilter({label: this.props.label, value: this.props.value, key: this.props.resourceKey});\n  },\n\n  render() {\n    let value = this.props.value;\n\n    if (this.props.format === 'money') {\n      value = '$' + utils.formatMonetary(value);\n    } else if (this.props.format === 'date') {\n      value = utils.formatDate(this.props.locale)(value);\n    } else if (this.props.format === 'capitalize') {\n      value = utils.capitalize(value);\n    }\n\n    return (\n      <dl>\n        <dt>{this.props.label}</dt>\n        { this.props.filterable ?\n          <dd>\n            <a onClick={this.handleClick} className=\"check-filter\">\n              <strong className=\"check-filter-value\">{value}</strong>\n            </a>\n          </dd> :\n          <dd><strong className=\"check-filter-value\">{value}</strong></dd>\n        }\n      </dl>\n    );\n  }\n});\n\nconst CheckPanel = createReactClass<any, any>({\n  getInitialState() {\n    return ({ linkHelper: null });\n  },\n\n  handleClose() {\n    GridReportActions.hideCheckImagePanel();\n  },\n\n  handleQuestions() {\n    this.props.openFeedbackModal();\n  },\n\n  handleFilter(props) {\n    //do something here to filter griddle\n    GridReportActions.filterColumn(props.key, 'eq', props.value);\n  },\n\n  onWrapperClick(e) {\n    // Close the settings panel when the user clicks outside it.\n    if (e.target === ReactDOM.findDOMNode(this)) {\n      GridReportActions.hideCheckImagePanel();\n    }\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.state.linkHelper === null && nextProps.checkData) {\n      this.setState({ linkHelper: SharedLinkHelper.create(nextProps.entity)});\n    }\n  },\n\n  render() {\n    const amountColumn = (this.props.checkData && this.props.checkData.data && this.props.checkData.amountColumn);\n    const amount = !!amountColumn ?\n      utils.formatMonetary(this.props.checkData.data[this.props.checkData.amountColumn]).split('.') :\n      null;\n\n    const entity = !!(this.props.entity && this.props.entity.attributes && this.props.entity.attributes.display_name) ? utils.capitalize(this.props.entity.attributes.display_name) : null;\n    const featurePermissions = !!(this.props.entity && this.props.entity.attributes && this.props.entity.attributes.feature_permissions)\n      ? this.props.entity.attributes.feature_permissions\n      : [];\n\n    return (\n      <CSSTransitionGroup transitionName=\"check-panel\" {...transitionDefaults}>\n        {(this.props.checkData && this.props.checkData.visible) ?\n          <div className=\"check-panel__wrapper ui-panel__wrapper\">\n            <div className=\"check-panel ui-panel\" ref=\"checkPanel\">\n              <header className=\"ui-panel__header\">\n                <h3>Check Details</h3>\n                <div className=\"ui-panel__close\" onClick={this.handleClose}></div>\n              </header>\n              { this.props.checkData.loading ?\n                <footer></footer> :\n                (\n                  <footer className=\"ui-panel__footer\">\n                    <PdfButton entity= {this.props.entity.attributes.display_name}\n                      issuer={this.props.checkData.data.department}\n                      checkDate={utils.formatDate(this.props.locale)(this.props.checkData.data.check_date)}\n                      checkNumber={this.props.checkData.data.check_no}\n                      recipient = {this.props.checkData.data.paid_to}\n                      dollarAmount = {amount[0]}\n                      centsAmount = {amount[1]}\n                      memo = {this.props.checkData.data.expense_type} />\n\n                    <Dropdown title=\"Share\" dropdownClass=\"ui-button check-panel__share-button\" position=\"align-top\">\n                      <ShareList entity={this.props.entity} linkHelper={this.state.linkHelper} />\n                    </Dropdown>\n                    <div className=\"ui-panel__actions\">\n                      <a className=\"ui-button primary\" onClick={this.handleQuestions}>Questions about this payment</a>\n                    </div>\n                  </footer>\n                )\n              }\n              { this.props.checkData.loading ?\n                <div className=\"ui-loading\"></div> :\n                (\n                  <div className=\"ui-container_scroll\">\n                    <CheckMock\n                      entity= {entity}\n                      issuer={this.props.checkData.data.department}\n                      checkDate={utils.formatDate(this.props.locale)(this.props.checkData.data.check_date)}\n                      checkNumber={this.props.checkData.data.check_no}\n                      recipient = {this.props.checkData.data.paid_to}\n                      dollarAmount = {amount[0]}\n                      centsAmount = {amount[1]}\n                      memo = {this.props.checkData.data.expense_type}\n                      handleFilter = {this.handleFilter} />\n\n                    <div className=\"ui-panel__content\">\n\n                    <CheckMessage\n                      voucherId={this.props.checkData.data.voucher_id}\n                      amountColumn={amountColumn}\n                      relatedTransactions={this.props.relatedTransactions}\n                      checkData={this.props.checkData.data}\n                      handleFilter={this.handleFilter} />\n\n                      <div className=\"ui-card\">\n                        <header className=\"ui-card__header\">\n                          <h3>Who's getting paid?</h3>\n                        </header>\n                        <div className=\"ui-card__content\">\n                          <CheckDescriptionItems\n                            amountColumn={amountColumn}\n                            handleFilter={this.handleFilter}\n                            checkData={this.props.checkData.data}\n                            descriptionFields={\n                              _.filter(CheckSettings.descriptionFields, {type: 'description'})\n                               .filter(({ requiresFeaturePermission }) =>\n                                  !requiresFeaturePermission\n                                  || featurePermissions.indexOf(requiresFeaturePermission) > -1)}\n                            entity={this.props.entity.attributes.display_name}\n                            locale={this.props.locale} />\n                        </div>\n                      </div>\n                      <div className=\"ui-card\">\n                        <header className=\"ui-card__header\">\n                          <h3>Where's the money coming from?</h3>\n                        </header>\n                        <div className=\"ui-card__content\">\n                          <CheckDescriptionItems\n                            handleFilter={this.handleFilter}\n                            amountColumn={amountColumn}\n                            checkData={this.props.checkData.data}\n                            descriptionFields={_.filter(CheckSettings.descriptionFields, {type: 'money'})}\n                            entity={this.props.entity.attributes.display_name}\n                            locale={this.props.locale} />\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                )\n              }\n\n            </div>\n            <div className=\"check-panel__overlay\" onClick={this.handleClose}/>\n          </div>\n        : null}\n      </CSSTransitionGroup>\n    );\n  }\n});\n\nexport default CheckPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/check_panel.tsx","import React from 'react';\nimport GridReportActions from './actions/grid_report_actions';\nimport {assetPath} from './asset_helpers';\n\nimport createReactClass from 'create-react-class';\n\nconst HowToModal = createReactClass<any, any>({\n  hideModal(e) {\n    e.preventDefault();\n    GridReportActions.hideHowToModal();\n  },\n  render() {\n    return (\n    <div className=\"ui-modal__wrapper open\" id=\"overlay-modal_gridhowto\" >\n      <div className=\"ui-modal wide\">\n        <header className=\"ui-modal__header\">\n          <h3>How To</h3>\n          <span className=\"ui-modal__close\" onClick={this.hideModal}></span>\n        </header>\n        <div className=\"ui-modal__content\">\n          <article className=\"howto-content\">\n            <img\n              src={assetPath('images/howto/grid_report/grid_report_view.png')}\n              className=\"howto-content__graphic\"\n              alt=\"Diagram of an OpenGov report\" />\n            <p className=\"howto-content__graphic-desc\">\n              OpenGov’s Grid Reports allow you to explore individual transactions in a simple user interface. The main view,\n              depicted here, includes a grid with various controls to view all or individual expenses.\n            </p>\n\n            <img\n              src={assetPath('images/howto/grid_report/search_bar.gif')}\n              className=\"howto-content__graphic\"\n              alt=\"Diagram showing the search bar\" />\n            <p className=\"howto-content__graphic-desc\">\n              There is a search bar located at the top of the screen. This search bar allows you to search for any text\n              across the grid.\n            </p>\n\n            <img\n              src={assetPath('images/howto/grid_report/filters.gif')}\n              className=\"howto-content__graphic\"\n              alt=\"Diagram of the various methods to filter report data\"/>\n            <p className=\"howto-content__graphic-desc\">\n              There are many ways to apply filters to the grid data. You may use the Filter panel located to the left of\n              the report. You can also click on the filter icon for a specific column to apply a filter.\n            </p>\n\n            <img\n              src={assetPath('images/howto/grid_report/visualization.gif')}\n              className=\"howto-content__graphic\"\n              alt=\"Diagram showing how to toggle data visualizations\"/>\n            <p className=\"howto-content__graphic-desc\">\n              At any point you are able to visualize the data, or display a graphical representation of the data, in the grid.\n              To do this, click on the Visualizations button on the left hand side of the screen. The visualization will show\n              total amounts, grouped by year. You are able to control the breakdown of the visualization in the Breakdown menu.\n            </p>\n\n            <img\n              src={assetPath('images/howto/grid_report/share_download.gif')}\n              className=\"howto-content__graphic\"\n              alt=\"Diagram showing how to download report data\"/>\n            <p className=\"howto-content__graphic-desc\">\n              You can share any grid view via social media or through email. There is also the option to download the source\n              data as a .csv spreadsheet in the Download menu.\n            </p>\n          </article>\n        </div>\n        <footer className=\"ui-modal__footer\">\n          <div className=\"ui-modal__actions\">\n            <button className=\"ui-button primary\" onClick={this.hideModal}>\n              Done\n            </button>\n          </div>\n        </footer>\n      </div>\n      <div className=\"ui-modal__background\" onClick={this.hideModal}></div>\n    </div>\n    );\n  }\n});\n\nexport default HowToModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modal_gridhowto.tsx","import React from 'react';\n\nimport createReactClass from 'create-react-class';\n\nconst Banner = createReactClass<any, any>({\n  render() {\n    return (\n      <div className=\"banner\">\n        {this.props.children}\n      </div>\n    );\n  }\n});\n\nexport default Banner;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/banner.tsx","import React from 'react';\nimport GridReportActions from '../actions/grid_report_actions';\n\nimport createReactClass from 'create-react-class';\n\nconst WelcomeModal = createReactClass<any, any>({\n  handleOpenHowTo(e) {\n    e.preventDefault();\n    GridReportActions.showHowToModal();\n  },\n\n  handleOpenBudget101(e) {\n    e.preventDefault();\n    GridReportActions.showBudget101();\n  },\n\n  render() {\n    return (\n      <div className=\"ui-modal__wrapper modal_welcome\">\n        <div className=\"ui-modal wide\">\n          <div className=\"ui-modal__content\">\n            <h1 className=\"welcome__title\">\n              Welcome to {this.props.entity.get('display_name')}&apos;s Report\n            </h1>\n            <p>This site is designed to help you understand more about the operations and performance of {this.props.entity.get('name')}. Start exploring and learn more.</p>\n            <p><small>You can read our quick <a onClick={this.handleOpenHowTo}>How-to instructions</a> or view other topics in the Help menu.</small></p>\n          </div>\n          <footer className=\"ui-modal__footer\">\n            <button className=\"ui-button\" onClick={this.props.closeWelcomeModal}>Just get started</button>\n            <div className=\"ui-modal__actions\">\n              <button className=\"ui-button primary\" onClick={this.props.startTour}>Take tour</button>\n            </div>\n          </footer>\n        </div>\n        <div className=\"ui-modal__background\"></div>\n      </div>\n    );\n  }\n});\n\nexport default WelcomeModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/welcome_modal.tsx","import React from 'react';\nimport BreakdownMenu from './griddle/breakdown_menu';\nimport { filterBreakdown } from './utils/transactions_utils';\nimport { MapTypes } from './maps/map_constants';\n\nexport default function GridBreakDownDropdown(props) {\n  const visualization = props.visualization;\n  const currentBreakdown = visualization.get('breakdown');\n  const visibleBreakdowns = filterBreakdown(visualization);\n  const breakdowns = !props.showBreakdownsSettingsPanel ? visibleBreakdowns || visualization.get('breakdownColumns') : visualization.get('breakdownColumns');\n  const graphType = visualization.get('graphType');\n  const isMap = graphType === 'map';\n  const currentMapType = visualization.get('currentMapType');\n  const isTypeWithBreakdown = !(isMap && currentMapType === MapTypes.Heatmap.name);\n  if (isTypeWithBreakdown) {\n    return <BreakdownMenu currentBreakdown={currentBreakdown} breakdowns={breakdowns} showBreakdownsSettingsPanel={props.showBreakdownsSettingsPanel} columns={visualization.get('breakdownColumns')} visualization={props.visualization} isControlPanel={props.isControlPanel}/>;\n  } else {\n    return null;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/grid_break_down_dropdown.tsx","import React from 'react';\n\nimport { DropdownList, DropdownListItem } from '@opengov/ovid';\n\nimport GridReportActions from '../actions/grid_report_actions';\nimport BreakdownsSettingsToggle from '../visibility_settings/breakdown_settings/breakdowns_settings_toggle';\nimport BreakdownsSettingsPanel from '../visibility_settings/breakdown_settings/breakdowns_settings_panel';\n\nexport default class BreakdownMenu extends React.Component<any, any> {\n  render() {\n    return (\n      <div className=\"ui-mainpanel__section griddle_breakdown\">\n      <div className=\"ui-mainpanel__section-header\">\n        Broken down by{this.props.isControlPanel && <BreakdownsSettingsToggle />}\n      </div>\n      {this.props.showBreakdownsSettingsPanel && <BreakdownsSettingsPanel columns={this.props.columns} panelType=\"Breakdown\" visualization={this.props.visualization} /> }\n      <DropdownList\n        value={this.props.currentBreakdown}\n        onChange={GridReportActions.setVisualBreakdown}>\n        {this.props.breakdowns.map((column, i) => {\n          return (\n            <DropdownListItem\n              key={i}\n              value={column.get('name')}\n              title={column.get('label')} />\n          );\n        }).toArray()}\n      </DropdownList>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/breakdown_menu.tsx","import React from 'react';\nimport GridReportActions from '../../actions/grid_report_actions';\n\nexport default function BreakdownsSettingsToggle() {\n  return (\n    <div className=\"visibility-settings-icon icon-settings-1 breakdown_column_toggle\" onClick={GridReportActions.toggleBreakdownsSettingsPanel} >\n    </div>\n  );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/breakdown_settings/breakdowns_settings_toggle.tsx","import React from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { filterBreakdown } from '../../utils/transactions_utils';\nimport GridReportActions from '../../actions/grid_report_actions';\nimport PanelHeader from '../panel_header';\nimport ErrorContainer from '../error';\nimport PanelData from '../panel_data';\nimport ReportViewStore from '../../stores/report_view_store';\nimport { getFooterClass, getVisibilityPanelClass } from '../visibility_utils';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nexport default class BreakdownsSettingsPanelContainer extends React.Component<any, any> {\n\n  settingsColumns: any[];\n  breakdownsSettingsPanel: any;\n\n  componentWillMount() {\n    this._subscribeDOMEvents();\n    //settingsColumns holds the list of ids of changed columns.\n    //This is tracked to handle reset of columns in cancel\n    this.settingsColumns = [];\n  }\n\n  componentWillUnmount() {\n    this._unsubscribeDOMEvents();\n  }\n\n  _subscribeDOMEvents = () => {\n    $(document).on('click', this.handleDocumentClick);\n  }\n\n  _unsubscribeDOMEvents = () => {\n    this.resetColumns();\n    $(document).off('click', this.handleDocumentClick);\n  }\n\n  handleDocumentClick = (e) => {\n    const inContainer = $.contains(findDOMNode(this.breakdownsSettingsPanel) as Element, e.target);\n    const inBreakdownColumnSettingToggle = e.target.className.indexOf('breakdown_column_toggle');\n    //check if the click is not in the panel container and the gear toggle icon\n    if (!inContainer && inBreakdownColumnSettingToggle == -1) {\n      this.handleBreakdownsSettingsCancel();\n    }\n  }\n\n  //Returns false if all columns are hidden\n  isVisibilityValid = () => {\n    const visibleBreakdowns = filterBreakdown(this.props.visualization);\n    return visibleBreakdowns.size > 0 ? true : false;\n  }\n\n  handleBreakdownsSettingsSave = () => {\n    this.setCurrentBreakdown();\n    this.settingsColumns = [];\n    GridReportActions.toggleBreakdownsSettingsPanel();\n  }\n\n  resetColumns = () => {\n    if (this.settingsColumns.length > 0) {\n      GridReportActions.resetColumns(this.settingsColumns, 'breakdown');\n    }\n  }\n\n  handleBreakdownsSettingsCancel = () => {\n    this.resetColumns();\n    this.settingsColumns = [];\n    GridReportActions.toggleBreakdownsSettingsPanel();\n  }\n\n  //set breakdown in the visualization\n  setCurrentBreakdown = () => {\n    const visibleBreakdowns = filterBreakdown(this.props.visualization);\n    if (visibleBreakdowns) {\n      const currentBreakdown = this.props.visualization.get('breakdown');\n      const filteredBreakdowns = _.map(visibleBreakdowns.filter((column) => column.get('visible') === true).toJS(), 'id');\n      if (filteredBreakdowns.indexOf(currentBreakdown) === -1) {\n        const newBreakdown = filteredBreakdowns[0];\n        GridReportActions.setVisualBreakdown(newBreakdown);\n      }\n    }\n  }\n\n  toggleBreakdownVisibility = (column, visibility) => {\n    GridReportActions.hideColumn(column, visibility, 'breakdown', false);\n    const index = this.settingsColumns.indexOf(column.get('id'));\n    _.includes(this.settingsColumns, column.get('id')) ? this.settingsColumns.splice(index, 1) : this.settingsColumns.push(column.get('id'));\n  }\n\n  //Returns true if all the columns are checked\n  //the columns that will undergo a change in its visibility\n  isAllBreakdownsVisible = () => {\n    const visibleBreakdowns = _.map(filterBreakdown(this.props.visualization).toJS(), 'id');\n    const isAllBreakdownsChecked = visibleBreakdowns.length === this.props.columns.size;\n    const hiddenColumns = isAllBreakdownsChecked ? this.props.columns : this.props.columns.filter((breakdownColumn) => !_.includes(visibleBreakdowns, breakdownColumn.get('id')));\n    return { isAllBreakdownsChecked, hiddenColumns};\n  }\n\n  toggleAllBreakdownVisibility = () => {\n    const { isAllBreakdownsChecked, hiddenColumns} = this.isAllBreakdownsVisible();\n    //Update the settingsColumns used for reseting\n    const hiddenColumnsIds = _.map(hiddenColumns.toJS(), 'id');\n    _.each(hiddenColumnsIds, (hiddenColumn: any) => {\n      const index = this.settingsColumns.indexOf(hiddenColumn);\n      _.includes(this.settingsColumns, hiddenColumn) ? this.settingsColumns.splice(index, 1) : this.settingsColumns.push(hiddenColumn);\n    });\n    //if any one unchecked -> isVisibilityValid = true then check all.\n    const visibility = this.isVisibilityValid() ? !isAllBreakdownsChecked : false;\n    GridReportActions.hideColumn(hiddenColumns, visibility, 'breakdown', true);\n  }\n\n  render() {\n    const { columns, panelType } = this.props;\n    const isEditingDefaultState = ReportViewStore.isEditingDefaultState();\n    const footerClass = getFooterClass(isEditingDefaultState);\n    const visibilityPanelClass = getVisibilityPanelClass(isEditingDefaultState);\n\n    return (\n      <div ref={(breakdownsSettingsPanel) => { this.breakdownsSettingsPanel = breakdownsSettingsPanel; }} className=\"subpanels js-subpanels is-expanded\">\n        <div className=\"subpanel ui-panel js-subpanel ready open\">\n          <header className=\"ui-panel__header\">\n            <h3>{panelType} Columns</h3>\n            <span className=\"ui-panel__close\" onClick={this.handleBreakdownsSettingsCancel} />\n          </header>\n          <footer className={footerClass}>\n            <button className=\"ui-button ghost no-color pull-right visibility-panel-cancel\" onClick={this.handleBreakdownsSettingsCancel}>Cancel</button>\n            <button className={`ui-button primary pull-right ${!this.isVisibilityValid() ? 'disabled' : ''}`} onClick={this.handleBreakdownsSettingsSave}>Save</button>\n          </footer>\n          <div className={visibilityPanelClass}>\n            <div className=\"visibility-panel-sub-header subpanel__options\">\n              {!this.isVisibilityValid() ?\n                <ErrorContainer message={'You must select at least one breakdown column'} />\n              : null}\n              <PanelHeader panelType={panelType} toggleAllColumnVisibility={this.toggleAllBreakdownVisibility} />\n            </div>\n            <ul className=\"visibility-panel-container drop-item1__wrapper sortable-items\">\n              {columns.map((column) => {\n                return (\n                  <PanelData column={column} toggleColumnVisibility={this.toggleBreakdownVisibility} />\n                );\n              })}\n            </ul>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/visibility_settings/breakdown_settings/breakdowns_settings_panel.tsx","import React from 'react';\n\ninterface IGridReportTotalProps {\n  totalString: string;\n  calculatedTotal: string;\n}\n\nexport default class GridReportTotal extends React.Component<IGridReportTotalProps, any> {\n  render() {\n    const { totalString, calculatedTotal } = this.props;\n    return (\n      <div className=\"ui-mainpanel__section\">\n        <div className=\"ui-mainpanel__section-header\">\n          {totalString}\n        </div>\n        <span id=\"js-grid-total-value\" className=\"ui-mainpanel__section__value\" title={calculatedTotal}>{calculatedTotal}</span>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/grid_report_total.tsx","import React from 'react';\nimport ExportFilter from './header_actions/grid_download_menu/export_filter/public_user/index';\nimport EmailLoggedInUser from './header_actions/grid_download_menu/export_filter/email_logged_in_user';\nimport GridReportActions from './actions/grid_report_actions';\nimport { findColumnByName } from './utils/schema_utils';\nimport { getAmountColumn } from './utils/transactions_utils';\n\nexport default function EmailOrExportFilter(props) {\n  const { session, reportCurrentFilter, report, gridReport, visualization } = props.state;\n  const transactionId = report.get('transaction_id');\n  const reportId = report.get('id');\n  const schema = gridReport.get('schema');\n\n  if (session) {\n    return (<EmailLoggedInUser\n      {...props.state}\n      reportId={reportId}\n      transactionId={transactionId}\n      currentFilter={reportCurrentFilter}\n      onCancelExportFilter={GridReportActions.hideExportFilter}\n      email={session.attributes.email}\n      onClose={props.handleCloseDownloadPanel} />);\n  } else {\n    return (<ExportFilter\n      {...props.state}\n      reportId={reportId}\n      transactionId={transactionId}\n      currentFilter={reportCurrentFilter}\n      amountColumnState={getAmountColumnState(visualization, schema, props.griddleState)}\n      onClose={GridReportActions.hideExportFilter} />);\n  }\n}\n\nfunction getAmountColumnState(visualization, schema, griddleState) {\n  const amountColumnName = getAmountColumn(visualization, schema);\n  const targetCol = findColumnByName(schema, amountColumnName);\n  const friendlyColumnName = targetCol.get('label');\n  const total = griddleState.get('amount');\n  return {total, 'column_name' : friendlyColumnName};\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/email_export_filter.tsx","import React from 'react';\nimport ExportModal from './export_modal';\nimport ReportDownloadActions from '../../../../actions/report_download_actions';\nimport ProcessingExport from './processing_export';\nimport GridReportActions from '../../../../actions/grid_report_actions';\n\nconst {updateFilteredExportJob, errorFilteredExportJob} = GridReportActions;\nconst { exportCurrentFilterWithJobPoll, STATES } = ReportDownloadActions;\n\nexport default class PublicUser extends React.Component<any, any> {\n  jobObservable: any;\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      nextState: false\n    };\n  }\n\n  componentWillUnmount() {\n    this.jobObservable && this.jobObservable.dispose();\n  }\n\n  handleConfirm = () => {\n    const { reportId, transactionId, currentFilter, amountColumnState } = this.props;\n    this.setState({\n      nextState: true\n    });\n    this.jobObservable = exportCurrentFilterWithJobPoll( transactionId, reportId, currentFilter, amountColumnState ).subscribe(\n        (res: any) => {\n          if (res.state === STATES.FAILED) {\n            errorFilteredExportJob(res.state, res.errors.map(m => m.message));\n          } else {\n            updateFilteredExportJob(res.state, res.job_result);\n          }\n        },\n        () => errorFilteredExportJob(STATES.FAILED, ['There was an error exporting your file. Please try again later.']));\n    return this.jobObservable;\n  }\n\n  renderError(errors) {\n    return (<ExportModal\n              title=\"Error Exporting File\"\n              confirmText=\"Close\"\n              onClose={this.props.onClose}\n              onConfirm={this.props.onClose}\n              confirmable\n             >\n              <div>{errors}</div>\n            </ExportModal>);\n  }\n\n  render() {\n    const state = this.props.gridReport.getIn(['filteredExport', 'state']);\n    if (state === STATES.FAILED) {\n      return this.renderError(this.props.gridReport.getIn(['filteredExport', 'errors']));\n    }\n    if (this.state.nextState) {\n      return (<ProcessingExport {...this.props} />);\n    } else {\n      return (<ExportModal\n                title=\"Export Generation Time\"\n                onConfirm={this.handleConfirm}\n                onClose={this.props.onClose}\n                confirmText=\"Yes, Continue\"\n                confirmable\n                cancelable\n                rightButtonClass=\"primary\">\n                  <span>\n                    <div>Sometimes generating files from a filtered view can take a while, especially if there are a lot of rows in the view.</div>\n                    <div className=\"small-margin-top\"> Are you sure you would like to continue?</div>\n                  </span>\n              </ExportModal>);\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/export_filter/public_user/index.tsx","import React from 'react';\nimport ExportModal from './export_modal';\nimport FinishedExport from './finished_export';\nexport default class ProcessingExport extends React.Component<any, any> {\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const state = this.props.gridReport.getIn(['filteredExport', 'state']);\n    if (state === 'finished') {\n      return (<FinishedExport {...this.props} />);\n    } else {\n      return (<ExportModal\n                     title=\"Generate File\"\n                     onClose={this.props.onClose}>\n                    <div className=\"ui-loader\">\n                      <div className=\"ui-loading\"></div>\n                      <div className=\"ui-loader__message\">\n                        <strong>Generating file for download</strong>\n                      </div>\n                    </div>\n            </ExportModal>);\n    }\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/export_filter/public_user/processing_export.tsx","import React from 'react';\nimport ExportModal from './export_modal';\nimport ReportViewStore from '../../../../stores/report_view_store';\n\nexport default class FinishedExport extends React.Component<any, any> {\n  render() {\n    const jobResult = this.props.gridReport.getIn(['filteredExport', 'jobResult']);\n    const report = ReportViewStore.getRenderedReport();\n    const reportName = report.get('name');\n    const { onClose } = this.props;\n\n    return (<ExportModal\n                   title=\"Export Complete\"\n                   confirmText=\"Done\"\n                   onClose={onClose}\n                   onConfirm={onClose}\n                   confirmable>\n                   <div>\n                    <span>Click to download:</span>\n                    <br/>\n                    <p className=\"transaction-download\">\n                      <a className=\"ui-button\" href={jobResult.get('url')} onClick={onClose}>\n                      <span className=\"button-left icon-csv-1\">{reportName}</span>\n                      </a>\n                    </p>\n                  </div>\n            </ExportModal>);\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/export_filter/public_user/finished_export.tsx","import React from 'react';\nimport * as Ovid from '@opengov/ovid';\nimport ExportModal from './public_user/export_modal';\nimport { exportCurrentFilter } from '../../../actions/report_download_actions';\n\nexport const UserEmail = ({email}) => (\n  <p><strong>Your email: </strong> <span className=\"user-email\">{email}</span></p>\n);\n\nexport default class EmailLoggedInUser extends React.Component<any, any> {\n  constructor(props) {\n    super(props);\n  }\n\n errorWithRequest() {\n   Ovid.Flash.show({\n     title: 'Whoops, something went wrong',\n     message: 'There was an error when trying to generate your request. Try again later.',\n     modifiers: {\n       whoops: true\n     }\n   });\n }\n\n  submitExport = (e) => {\n    e.preventDefault();\n    const { reportId, transactionId, currentFilter} = this.props;\n    exportCurrentFilter(transactionId, reportId, currentFilter).subscribe(() => {\n      Ovid.Flash.ftw({title: 'Request sent!', message: 'We\\'ll send a link to your email when your file is ready.'});\n    }, () => {\n      this.errorWithRequest();\n    });\n    this.props.onClose();\n  }\n\n  render() {\n    const { onClose, email } = this.props;\n    return (\n      <ExportModal\n        title=\"Generate Export File\"\n        onConfirm={this.submitExport}\n        onClose={onClose}\n        confirmText=\"Export & Send\"\n        confirmable\n        cancelable\n        leftButtonClass=\"cancel\"\n        rightButtonClass=\"primary\">\n        <div className=\"hero-icon\">\n          <span className=\"icon-email-1 color-primary_3\"></span>\n        </div>\n        <div>\n          <p>Generating files from a filtered view can take a long time. For your convenience, we will email you a link to download the file once it is ready (typically within 30 minutes).</p>\n        </div>\n        <br/>\n        <UserEmail email={email} />\n      </ExportModal>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/grid_download_menu/export_filter/email_logged_in_user.tsx","import React, { CSSProperties } from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport { formatUnits, getAmountColumn, AmountsTypes } from '../utils/transactions_utils';\nimport $ from 'jquery';\n\nexport default class SummaryTable extends React.Component<any, any> {\n    static propTypes = {\n      visualization: PropTypes.object,\n      schema: PropTypes.object,\n      columnOnClick: PropTypes.func,\n      aggregatesData: PropTypes.object\n    }\n\n    constructor(props) {\n      super(props);\n      this.state = {\n        scrollTop: 0,\n        scrollLeft: 0\n      };\n    }\n\n    componentDidUpdate() {\n      const summaryTableContainer = $('.summary-table-container');\n      this.state = {\n        scrollTop: summaryTableContainer[0] && summaryTableContainer[0].scrollTop,\n        scrollLeft: summaryTableContainer[0] && summaryTableContainer[0].scrollLeft\n      };\n    }\n\n    handleOnScroll = (event) => {\n      this.setState({\n        scrollTop: event.target.scrollTop,\n        scrollLeft: event.target.scrollLeft\n      });\n    }\n\n    getFixedRowStyle(customStyles = {}) {\n      return Object.assign({\n        position: 'relative',\n        top: this.state.scrollTop,\n        zIndex: 3\n      } as CSSProperties, customStyles);\n    }\n\n    getFixedColumnStyle(customStyles = {}) {\n      return Object.assign({\n        borderRightWidth: this.state.scrollLeft > 0 ? '1px' : 0,\n        left: this.state.scrollLeft,\n        position: 'relative',\n        zIndex: 3\n      } as CSSProperties, customStyles);\n    }\n\n    renderHeaderCells(breakdownData) {\n      const header = [];\n      const visualization = this.props.visualization;\n      const breakdown = visualization.get('breakdown');\n      const breakdownTitle = visualization.get('breakdownColumns').find(b => b.get('name') == breakdown).get('label');\n      const firstElementData = _.head(_.values(breakdownData));\n      const headerTitle = _.keys(firstElementData);\n      const categories = visualization.get('xAxis').map((d) => d.value).toJS();\n      categories.push('Total');\n\n      header.push(\n        <th key=\"head\" className=\"fixed-column row-header\" style={this.getFixedRowStyle(this.getFixedColumnStyle({\n          zIndex: 4\n        }))}>\n          <span className=\"ui-drop-item__placeholder is-disabled\" />\n          <strong>{breakdownTitle}</strong>\n        </th>\n      );\n\n      _.each(headerTitle, (title, key) => {\n        header.push(\n          <th key={key} className=\"row-header\" style={this.getFixedRowStyle()}>\n            <strong>{categories[key]}</strong>\n          </th>\n        );\n      });\n      return header;\n    }\n\n    renderHeader(breakdownData) {\n      return (\n        <thead>\n          <tr className=\"fixed-row-background\">\n            {this.renderHeaderCells(breakdownData)}\n          </tr>\n        </thead>\n      );\n    }\n\n    renderRows(breakdownData, rowKey) {\n      const rows = [];\n      const row = [];\n      const legend = _.head(_.keys(breakdownData));\n      const rowItemValues = _.head(_.values(breakdownData));\n      const { visualization, schema } = this.props;\n      const amountColumn = getAmountColumn(visualization, schema);\n\n      row.push(\n        <th key=\"row_legend\" className=\"fixed-column\" style={this.getFixedColumnStyle()}>\n          <span className=\"ui-drop-item__placeholder is-disabled\" />\n          { legend == 'Others' ?\n            <span>{legend}</span> :\n            <span className=\"ui-table__cell__link\" onClick={this.handleFilterClick.bind(this, legend)} >{legend}</span>\n          }\n        </th>\n      );\n\n      _.each(rowItemValues, (item, key) => {\n        const showCurrencySymbol = rowKey == 0 ? true : false;\n        const formatedItem = formatUnits(schema, amountColumn, item, showCurrencySymbol);\n\n        row.push(\n          <td key={key}>\n            <span>{formatedItem}</span>\n          </td>\n        );\n      });\n      rows.push(row);\n\n      return rows;\n    }\n\n    renderBody(breakdownData) {\n      return (\n        <tbody>\n          {\n            _.map(breakdownData, (data, key) => {\n              return (\n                <tr key={key}>\n                  {this.renderRows(data, key)}\n                </tr>\n              );\n            })\n          }\n        </tbody>\n      );\n    }\n\n    renderFooterCells(yearTotals) {\n      const footer = [];\n      const footerData = _.values(yearTotals);\n      const { visualization, schema } = this.props;\n      const amountColumn = getAmountColumn(visualization, schema);\n      let grandTotal = 0;\n\n      footer.push(\n        <td key=\"foot_first\" className=\"fixed-column row-footer\" style={this.getFixedColumnStyle()}>\n          <span className=\"ui-drop-item__placeholder is-disabled\" />\n          <strong>Total</strong>\n        </td>\n      );\n\n      _.each(footerData, (total: number, key) => {\n        grandTotal += total;\n        const formatedTotal = formatUnits(schema, amountColumn, total);\n        footer.push(\n          <td key={key} className=\"row-footer\">\n            <strong>{formatedTotal}</strong>\n          </td>\n        );\n      });\n\n      // If cumulative grand total is just the last period's total.\n      const isCumulative = visualization && visualization.get('amountsType') === AmountsTypes.Cumulative;\n      grandTotal = formatUnits(schema, amountColumn, isCumulative ? _.last(footerData) : grandTotal);\n      footer.push(\n        <td key=\"foot_last\" className=\"row-footer\">\n          <strong>{grandTotal}</strong>\n        </td>\n      );\n      return footer;\n    }\n\n    renderFooter(yearTotals) {\n      return (\n        <tfoot>\n          <tr className=\"fixed-row-background\">\n            {this.renderFooterCells(yearTotals)}\n          </tr>\n        </tfoot>\n      );\n    }\n\n    handleFilterClick(legend) {\n      const column = this.props.visualization.get('breakdown');\n      const operator = legend === '- Blank -' ? null : 'eq';\n      legend = legend === '- Blank -' ? true : legend;\n      this.props.columnOnClick(column, operator, legend);\n    }\n\n    processData(aggregatesData) {\n      const summaryData = [];\n      const breakdownDataBySeriesName = [];\n      const breakdownTotals = {};\n      let breakdownData = [];\n      const yearTotals = {};\n      const { visualization, schema } = this.props;\n      const breakdown = visualization.get('breakdown');\n      const amountColumn = getAmountColumn(visualization, schema);\n      const sumField = `${amountColumn}_sum`;\n      const noSeriesName = '- Blank -';\n      const isCumulative = visualization && visualization.get('amountsType') === AmountsTypes.Cumulative;\n      aggregatesData.forEach((yearData) => {\n        let yearTotal = 0;\n        const year = yearData.get('fiscal_year') || (yearData.get('year') + _.padStart(yearData.get('month'), 2, '0'));\n        yearData.get('transactions').forEach((v) => {\n          let seriesName = v.get(breakdown);\n          const sum = v.get(sumField);\n\n          // If breakdown is undefined, don't continue\n          if (_.isUndefined(seriesName) || _.isUndefined(sum)) {\n            return false;\n          }\n\n          seriesName = (seriesName == 'Show More') ? 'Others' : (seriesName || noSeriesName);\n\n          if (!breakdownDataBySeriesName[seriesName]) {\n            breakdownDataBySeriesName[seriesName] = [];\n          }\n          if (!breakdownDataBySeriesName[seriesName][year]) {\n            breakdownDataBySeriesName[seriesName][year] = {};\n          }\n          breakdownDataBySeriesName[seriesName] = Object.assign({...breakdownDataBySeriesName[seriesName]}, { [year]: sum });\n          breakdownTotals[seriesName] = (breakdownTotals[seriesName] ? breakdownTotals[seriesName] : 0) + sum;\n          yearTotal += sum;\n        });\n        yearTotals[year] = yearTotal;\n      });\n\n      // Check for any missing years\n      Object.keys(breakdownDataBySeriesName).forEach((seriesName) => {\n        Object.keys(yearTotals).forEach((year) => {\n          if (!_.includes(_.keys(breakdownDataBySeriesName[seriesName]), year)) {\n            breakdownDataBySeriesName[seriesName] = Object.assign({...breakdownDataBySeriesName[seriesName]}, { [year]: 0 });\n          }\n        });\n        breakdownDataBySeriesName[seriesName] = _.sortBy(breakdownDataBySeriesName[seriesName], (value, key) => { return key; });\n      });\n      // Totals of each breakdown for all years\n      Object.keys(breakdownDataBySeriesName).forEach((seriesName) => {\n        // When amounts are cumulative the totals column is just the last period in the table.\n        const yearTotal = isCumulative ? _.last(breakdownDataBySeriesName[seriesName]) : breakdownTotals[seriesName];\n        breakdownDataBySeriesName[seriesName] = Object.assign({...breakdownDataBySeriesName[seriesName]}, { 'Total' : yearTotal });\n        breakdownData.push({ [seriesName]: breakdownDataBySeriesName[seriesName] });\n      });\n      // Sort data based on legendSortBy\n      breakdownData = this.sortData(breakdownData, visualization.get('legendSortBy'));\n      summaryData.push({ breakdownData });\n      summaryData.push({ yearTotals });\n      return summaryData;\n    }\n\n    sortData(breakdownData, sortBy) {\n      if (sortBy == 'asc') {\n        breakdownData = _.sortBy(breakdownData, (data) => { return (_.head(_.values(data)) as any).Total; });\n      }\n\n      if (sortBy == 'desc') {\n        breakdownData = _.sortBy(breakdownData, (data) => { return (_.head(_.values(data)) as any).Total; }).reverse();\n      }\n\n      if (sortBy == 'alpha') {\n        breakdownData = _.sortBy(breakdownData, (data) => { return _.head(_.keys(data)); });\n      }\n\n      if (sortBy == 'alpha_rev') {\n        breakdownData = _.sortBy(breakdownData, (data) => { return _.head(_.keys(data)); }).reverse();\n      }\n\n      breakdownData.push(_.remove(breakdownData, (data) => { return _.head(_.keys(data)) == 'Others'; }));\n      breakdownData = _.flattenDeep(breakdownData);\n\n      return breakdownData;\n    }\n\n    render() {\n      const { aggregatesData } = this.props;\n      const summaryData = this.processData(aggregatesData);\n\n      if (_.size(summaryData) > 0 && _.size(summaryData[0].breakdownData) > 0) {\n        const breakdownData = summaryData[0].breakdownData;\n        return (\n          <div\n            className=\"summary-table-container summary-table ui-table js-table-container layout_expansion\"\n            onScroll={this.handleOnScroll}>\n            <table className=\"table summary_table\">\n              {this.renderHeader(breakdownData[0])}\n              {this.renderBody(breakdownData)}\n              {this.renderFooter(summaryData[1].yearTotals)}\n            </table>\n          </div>\n        );\n      } else {\n        return null;\n      }\n    }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/griddle/summary_table.tsx","import cx from 'classnames';\nimport _ from 'lodash';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport ReportActions from './actions/report_actions';\nimport SavedViewActions from './actions/saved_view_actions';\n\nexport default class ReportConfigButtons extends React.Component<any, any> {\n  static propTypes = {\n    isNetwork: PropTypes.bool,\n    isGridReport: PropTypes.bool,\n    report: PropTypes.object,\n    disableEditDefaultState: PropTypes.bool,\n    isEditingDefaultState: PropTypes.bool,\n    isControlPanel: PropTypes.bool,\n    entity: PropTypes.any\n  };\n\n  render() {\n    const {\n      isNetwork,\n      isGridReport,\n      report,\n      isEditingDefaultState,\n      disableEditDefaultState,\n      isControlPanel,\n      entity\n    } = this.props;\n    let settingsButton;\n\n    const canUpdateReport: boolean = report && _.get(report.get('abilities'), ['update']);\n    const canCreateSavedViews: boolean = report && _.get(report.get('user_abilities'), ['saved_views', 'create']);\n    const showCreateViews: boolean = isControlPanel && canCreateSavedViews;\n\n    if (isGridReport && (isNetwork || !canUpdateReport)) {\n      return null;\n    }\n\n    const reportActionsClassName = cx({\n      'ui-mainpanel__section': true,\n      'ui-button-stack': true,\n      report__actions: true,\n      'report__actions__configure-report': canUpdateReport,\n      'report__actions__create-saved-view': showCreateViews,\n      'editing-default-state': isEditingDefaultState\n    });\n\n    // TODO: GRA-470: even though we dynamically render a SettingsCategoryItem,\n    // we don't have an easy way of knowing which category we are actually rendering in this component\n    // we would need to do some precomputation when the report loads in order to know,\n    // all the settings panel cateogry item visibilty state should be hoisted into state anyway\n    //Show Presentation when Public View and not a Grid Report\n    //Show Presentation when ControlPanel and demoted User\n    const isPresentation = (!isControlPanel && !isGridReport) || (isControlPanel && !canUpdateReport);\n\n    if (isControlPanel || !isGridReport) {\n      if (isPresentation && entity.get('population') !== null && entity.get('population') > 0) {\n        settingsButton = <SettingsButton title=\"Presentation\" />;\n      } else {\n        settingsButton = <SettingsButton title=\"Settings\" />;\n      }\n    }\n\n    return (\n      <div className={reportActionsClassName}>\n        {showCreateViews &&\n          <div className=\"saved-view-add-btn__container\">\n            <SavedViewButton />\n          </div>\n        }\n        {isControlPanel && canUpdateReport &&\n          <div className=\"ui-mainpanel__section-header\">\n            Configure report\n          </div>\n        }\n        {((isControlPanel || !isGridReport) || (isControlPanel && canUpdateReport && !isEditingDefaultState)) &&\n        <div className=\"ui-button-stack\">\n          {settingsButton}\n          {isControlPanel && canUpdateReport && !isEditingDefaultState &&\n            <SetDefaultStateButton disabled={disableEditDefaultState} />\n          }\n        </div>\n        }\n      </div>\n    );\n  }\n}\n\nexport const SettingsButton = ({ title }) => (\n  <button className=\"ui-button small\" onClick={ReportActions.openSettingsPanel}>\n    <span className=\"icon-settings-1\" /> {title}\n    <ToggleIcons />\n  </button>\n);\n\nexport const SetDefaultStateButton = ({ disabled }) => (\n  <button className=\"ui-button small\"\n          onClick={ReportActions.enableEditDefaultStateMode}\n          disabled={disabled}>\n    <span className=\"icon-preview-1\" /> Set default state\n    <ToggleIcons />\n  </button>\n);\n\nexport const ToggleIcons = () => (\n  <div className=\"ui-panel-toggle\">\n    <span className=\"ui-panel-toggle__close\"></span>\n    <span className=\"ui-panel-toggle__open\"></span>\n  </div>\n);\n\nexport const SavedViewButton = () => (\n  <button className=\"saved-view-add-btn ui-button small\"\n          onClick={SavedViewActions.newView}>\n    <span className=\"saved-view-add-btn__icon icon-plus-2\" /> Save view\n  </button>\n);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_config_buttons.tsx","import React from 'react';\n\nexport default class EntityLogo extends React.Component<any, any> {\n  render() {\n    const { entity } = this.props;\n    const displayName = entity.get('display_name');\n    const logo = entity.get('logo');\n    const logoSrc = logo ? logo : 'app/Ovid/dist/images/default-logo.png';\n\n    return (\n      <a href=\"/\" className=\"entity-logo ui-mainpanel__section\">\n        <img src={logoSrc} alt={`Go to ${displayName} Transparency Home`}/>\n      </a>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/entity_logo.tsx","import { sortBy, map } from 'lodash';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst getListItemId = (report) => {\n  const reportType = report.get('report_type');\n  if (reportType !== 'grid') {\n    return reportType;\n  }\n\n  const isGeoEnabled = report.get('is_geo_enabled');\n  return isGeoEnabled ? 'map' : reportType;\n};\n\nimport createReactClass from 'create-react-class';\n\nexport const ReportListItem = createReactClass<any, any>({\n  propTypes: {\n    report: PropTypes.object.isRequired,\n    active: PropTypes.bool\n  },\n\n  render() {\n    const report = this.props.report;\n\n    const rowButtonClasses = classNames({\n      'ui-nav-list__item': true,\n      'is-selected': this.props.active\n    });\n\n    const reportPath = report.get('report_type') === 'grid' && !gon.isPreview ? 'data' : 'transparency';\n\n    return (\n      <a className={rowButtonClasses}\n        id={'product_' + getListItemId(report)}\n        href={'/' + reportPath + '#' + report.id}\n        onClick={this.handleClick}>\n        <div className=\"product-icon\">\n          <span className=\"product-icon__foreground\" />\n          <span className=\"product-icon__background\" />\n        </div>\n        <span className=\"ui-nav-list__item__text\">{report.get('name')}</span>\n      </a>\n    );\n  },\n\n  handleClick(e) {\n    // Clicking the active report item should be a no-op.\n    if (this.props.active) {\n      e.preventDefault();\n    }\n  }\n});\n\nconst ReportList = createReactClass<any, any>({\n  propTypes: {\n    reports: PropTypes.object,\n    activeReport: PropTypes.object\n  },\n\n  render() {\n    if (!this.props.reports) {\n      return <noscript />;\n    }\n\n    const activeReport = this.props.activeReport;\n\n    const reports = sortBy(this.props.reports.models, 'attributes.position');\n    const reportItems = map(reports, function(report: any) {\n      return <ReportListItem key={report.id} report={report} active={report === activeReport} />;\n    });\n\n    return (\n      <div className=\"ui-mainpanel__section product-list\">\n        <nav aria-label=\"List of reports\" className=\"ui-nav-list\">\n          {reportItems}\n        </nav>\n      </div>\n    );\n  }\n});\n\nexport default ReportList;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_list.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { StoreListener } from '@opengov/og_flux';\n\nimport SavedViewsStore from './stores/saved_views_store';\nimport ReportViewStore from './stores/report_view_store';\nimport ReportActions from './actions/report_actions';\nimport SavedViewsPanel from './saved_views_panel';\n\nimport createReactClass from 'create-react-class';\n\nconst TogglePanel = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object,\n    session: PropTypes.object,\n    isControlPanel: PropTypes.bool\n  },\n\n  mixins: [\n    StoreListener(ReportViewStore, SavedViewsStore)\n  ] as any,\n\n  getInitialState() {\n    return this.getStateFromStore();\n  },\n\n  getStateFromStore() {\n    return {\n      activePanel: ReportViewStore.getActiveMainPanel(),\n      isSavedViewsEnabled: this.isSavedViewsEnabled(),\n      report: ReportViewStore.getRenderedReport()\n    };\n  },\n\n  storeDidUpdate() {\n    this.setState(this.getStateFromStore());\n  },\n\n  isSavedViewsEnabled() {\n    // Disable in public or network reports ( isControlPanel ) if the report has no saved views.\n    // also don't bother showing if no views and they can't create one\n\n    const publicFacing = !this.props.isControlPanel;\n    const hasSavedViews = SavedViewsStore.getSavedViewsCount() > 0;\n    const canCreate = this.state\n                      && this.state.report\n                      && this.state.report.getIn(['user_abilities', 'saved_views', 'create'], false);\n\n    return ( !publicFacing && canCreate ) || hasSavedViews;\n  },\n\n  render() {\n    if (!this.state.isSavedViewsEnabled) {\n      return <div>{this.props.children}</div>;\n    }\n\n    const activePanelClass = this.state.activePanel === 'filter' ? 'is-first' : 'is-second';\n\n    return (\n      <div className={`ui-togglepanel ${ activePanelClass }`}>\n        <div className=\"ui-togglepanel__control\" role=\"tablist\">\n          <div className=\"ui-togglepanel__control-pointer\"></div>\n          <button role=\"tab\" className=\"ui-togglepanel__control-label_first\" onClick={this.handleFilterClick}>Filters</button>\n          <button role=\"tab\" className=\"ui-togglepanel__control-label_second\" onClick={this.handleSavedClick}>Views</button>\n        </div>\n\n        <div className=\"ui-togglepanel__body\">\n          <div className=\"ui-togglepanel__body-inner\">\n            <div className=\"ui-togglepanel__panel_first\">\n              <p className=\"panel-detail\">Changing filters will update visualization automatically.</p>\n              {this.props.children}\n            </div>\n            <div className=\"ui-togglepanel__panel_second\">\n              <SavedViewsPanel\n                entity={this.props.entity}\n                session={this.props.session}\n                isControlPanel={this.props.isControlPanel}\n                isGridReport={this.props.isGridReport}\n                report={this.state.report} />\n            </div>\n          </div>\n        </div>\n    </div>\n    );\n  },\n\n  handleChange() {\n    this.setState(this.getStateFromStore());\n  },\n\n  handleSavedClick() {\n    ReportActions.toggleMainPanel('saved');\n  },\n\n  handleFilterClick() {\n    ReportActions.toggleMainPanel('filter');\n  },\n});\n\nexport default TogglePanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/toggle_panel.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport * as Ovid from '@opengov/ovid';\nimport { StoreListener } from '@opengov/og_flux';\n\nimport SavedViewsStore from '../stores/saved_views_store';\nimport SavedViewActions from '../actions/saved_view_actions';\n\nimport SavedViewsList from './saved_views_list';\nimport SavedViewModal from './saved_view_modal';\n\nimport { trackIntercomEvent } from '../utils/intercom_utils';\n\nimport createReactClass from 'create-react-class';\n\nconst SavedViewsPanel = createReactClass<any, any>({\n  mixins: [\n    StoreListener(SavedViewsStore)\n  ] as any,\n\n  propTypes: {\n    entity: PropTypes.object,\n    session: PropTypes.object,\n    isControlPanel: PropTypes.bool,\n    report: PropTypes.object.isRequired\n  },\n\n  getInitialState() {\n    return this.getStateFromStore();\n  },\n\n  getStateFromStore() {\n    return {\n      savedViews: SavedViewsStore.getSortedViews(),\n      visitedSavedViews: SavedViewsStore.getVisitedViews(),\n      activeSavedView: SavedViewsStore.getActiveView(),\n      editView: SavedViewsStore.getEditView(),\n      isEditViewSyncing: SavedViewsStore.isEditViewSyncing()\n    };\n  },\n\n  storeDidUpdate() {\n    this.setState(this.getStateFromStore());\n  },\n\n  render() {\n    const modalView = this.state.editView;\n\n    return (\n      <div className=\"ui-saved-views-panel\">\n        <SavedViewsList\n          report={this.props.report}\n          items={this.state.savedViews}\n          visitedItems={this.state.visitedSavedViews}\n          activeItem={this.state.activeSavedView}\n          entity={this.props.entity}\n          isEditable={this.canUserEditViews()}\n          isControlPanel={this.props.isControlPanel}\n          isGridReport={this.props.isGridReport}\n          onEditItem={this.handleEditClick} />\n\n        {modalView ?\n          <Ovid.Overlay id=\"saved-view-modal\">\n            <SavedViewModal\n              savedView={modalView}\n              isSyncing={this.state.isEditViewSyncing}\n              onSubmit={this.handleSubmit}\n              onDelete={this.handleDelete}\n              onClose={this.handleClose}\n            />\n          </Ovid.Overlay>\n        : null}\n      </div>\n    );\n  },\n\n  isSameEntityOrOpenGov() {\n    if (this.props.session.isOpenGov() || (this.props.entity.id === this.props.session.entity.id)) {\n      return true;\n    }\n\n    return false;\n  },\n\n  canUserEditViews() {\n    const session = this.props.session;\n    const canManage = this.props.report.get('user_abilities')\n      .get('saved_views')\n      .get('update');\n\n    return this.props.isControlPanel && session && canManage;\n  },\n\n  handleChange() {\n    this.setState(this.getStateFromStore());\n  },\n\n  handleSubmit(savedView, description) {\n    if (this.state.editView.id) {\n      SavedViewActions.updateView(this.state.editView.id, {description});\n      var metadata = {\n        reportId: savedView.report_id,\n        description\n      };\n      trackIntercomEvent('update-saved-view', metadata);\n    } else {\n      SavedViewActions.createView(description);\n      var metadata = {\n        reportId: savedView.report_id,\n        description\n      };\n      trackIntercomEvent('create-saved-view', metadata);\n    }\n  },\n\n  handleEditClick(savedView) {\n    SavedViewActions.editView(savedView.id);\n  },\n\n  handleDelete(savedView) {\n    SavedViewActions.deleteView(savedView.id);\n    const metadata = {\n      reportId: savedView.report_id,\n      description: savedView.description\n    };\n    trackIntercomEvent('delete-saved-view', metadata);\n  },\n\n  handleClose() {\n    SavedViewActions.cancelView();\n  }\n});\n\nexport default SavedViewsPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/saved_views_panel/index.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport querystring from 'querystring';\nimport _ from 'lodash';\n\nimport SavedViewItem from './saved_view_item';\n\nimport createReactClass from 'create-react-class';\n\nconst SavedViewsList = createReactClass<any, any>({\n  propTypes: {\n    items: PropTypes.array,\n    activeItem: PropTypes.object,\n    visitedItems: PropTypes.array,\n    entity: PropTypes.object,\n    isEditable: PropTypes.bool,\n    isConrolPanel: PropTypes.bool,\n\n    onEditItem: PropTypes.func\n  },\n\n  render() {\n    const items = this.props.items;\n\n    if (_.isEmpty(items)) {\n      return (\n        <div className=\"saved-view-empty\">You haven't added any saved views to this report. To save the view you're currently looking at, click the Save button below.</div>\n      );\n    }\n\n    return (\n      <nav aria-label=\"List of saved views\" className=\"ui-saved-views-list\">\n        {items.map(this.renderItem)}\n      </nav>\n    );\n  },\n\n  renderItem(savedView, index) {\n    const state = savedView.view_state;\n    const fiscalYearRange = state.fiscal_year_range;\n\n    let params;\n    if (this.props.isGridReport) {\n      params = querystring.stringify({\n        query: state.query,\n      });\n    } else {\n      params = querystring.stringify({\n        breakdown: state.breakdown_id,\n        accountType: state.ledger,\n        graph: state.graph,\n        month: state.month || 'latest',\n        year: state.year || 'latest',\n        selection: state.selection,\n        legend_sort: state.sort_order,\n        saved_view: savedView.id,\n        projections: state.projections === true,\n        projectionType: state.projection_type,\n        highlightingVariance: state.highlighting_variance,\n        highlighting: state.highlighting === true,\n        fiscal_start: _.result(fiscalYearRange, 'start'),\n        fiscal_end: _.result(fiscalYearRange, 'end'),\n        currentYearPeriod: state.current_year_period,\n        currentYearAmount: state.current_year_amount,\n        selectedDataSetIndex: state.selected_data_set_index == null ? 'latest' : state.selected_data_set_index\n      });\n    }\n\n    let href;\n\n    if (this.props.isControlPanel && this.props.entity) {\n      href = `#/${ this.props.entity.id }/reports/${ savedView.report_id }/${ params }`;\n    } else {\n      href = `#/${ savedView.report_id }/${ params }`;\n    }\n\n    return (\n      <SavedViewItem\n        key={index}\n        savedView={savedView}\n        href={href}\n        isActive={this.props.activeItem === savedView}\n        isVisited={_.last(this.props.visitedItems) === savedView.id}\n        isEditable={this.props.isEditable}\n        onEditClick={this.handleEditClick.bind(null, savedView)} />\n    );\n  },\n\n  handleEditClick(item) {\n    if (this.props.onEditItem) {\n      this.props.onEditItem(item);\n    }\n  }\n});\n\nexport default SavedViewsList;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/saved_views_panel/saved_views_list.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\n\nimport SavedViewActions from '../actions/saved_view_actions';\n\n// The distance from the center of an item another item must\n// be dragged to before the will swap positions.\nconst ITEM_SWAP_THRESHOLD = 2;\n\nimport createReactClass from 'create-react-class';\n\nconst SavedViewItem = createReactClass<any, any>({\n  propTypes: {\n    savedView: PropTypes.object.isRequired,\n    href: PropTypes.string.isRequired,\n    isActive: PropTypes.bool,\n    isEditable: PropTypes.bool,\n    isVisited: PropTypes.bool,\n\n    onEditClick: PropTypes.func\n  },\n\n  render() {\n    const savedView = this.props.savedView;\n\n    const savedViewModifiers = `\n      ${ this.props.isActive ? 'is-active' : '' }\n      ${ !this.props.isActive && this.props.isVisited ? 'is-visited' : '' }\n    `;\n\n    return (\n      <div draggable={this.props.isEditable}\n           onDragStart={this.handleDragStart}\n           onDragOver={this.handleDragOver}\n           onDragEnter={this.handleDragEnter}\n           onDrop={this.handleDrop}\n      >\n        <a className={`saved-view ${ savedViewModifiers }`}\n           href={this.props.href}\n           draggable={false}\n           onClick={this.handleViewClick}\n           title={savedView.description}\n        >\n          {savedView.description}\n          {this.renderEditControls()}\n        </a>\n      </div>\n    );\n  },\n\n  renderEditControls() {\n    if (!this.props.isEditable) {\n      return null;\n    }\n\n    return (\n      <span>\n        <span className=\"saved-view__edit-btn\" onClick={this.handleEditClick}>EDIT</span>\n        <span className=\"saved-view__drag-btn icon-drag-n-drop-1\"></span>\n      </span>\n    );\n  },\n\n  handleViewClick() {\n    SavedViewActions.selectView(this.props.savedView);\n  },\n\n  handleEditClick(e) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (this.props.onEditClick) {\n      this.props.onEditClick();\n    }\n  },\n\n  handleDragStart(e) {\n    try {\n      // Firefox won't drag without setting data\n      e.dataTransfer.setData('application/json', {});\n    } catch (err) {\n      // IE doesn't support MIME types in setData\n    }\n\n    e.dataTransfer.effectAllowed = 'move';\n\n    SavedViewActions.startViewDrag(this.props.savedView.id);\n  },\n\n  handleDragOver(e) {\n    e.preventDefault();\n    e.dataTransfer.dropEffect = 'move';\n\n    const el: any = ReactDOM.findDOMNode(this);\n    const rect = el.getBoundingClientRect();\n\n    const relY = e.clientY - rect.top;\n    const middle = rect.height / 2;\n    const distanceToMiddle = Math.abs(middle - relY);\n\n    if (distanceToMiddle <= ITEM_SWAP_THRESHOLD) {\n      SavedViewActions.dragViewAfter(this.props.savedView.id);\n    }\n  },\n\n  handleDragEnter(e) {\n    e.preventDefault();\n  },\n\n  handleDrop(e) {\n    e.preventDefault();\n    SavedViewActions.dropView();\n  }\n});\n\nexport default SavedViewItem;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/saved_views_panel/saved_view_item.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport createReactClass from 'create-react-class';\n\nconst SavedViewModal = createReactClass<any, any>({\n\n  propTypes: {\n    savedView: PropTypes.object,\n    isSyncing: PropTypes.bool,\n\n    onSubmit: PropTypes.func,\n    onClose: PropTypes.func\n  },\n\n  getInitialState() {\n    return {\n      description: null\n    };\n  },\n\n  componentDidMount() {\n    if (this.props.savedView) {\n      this.focusDescription();\n    }\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.savedView !== nextProps.savedView) {\n      this.setState({\n        description: _.result(nextProps.savedView, 'description')\n      });\n    }\n  },\n\n  componentDidUpdate(prevProps) {\n    if (!prevProps.savedView && this.props.savedView) {\n      this.focusDescription();\n    }\n  },\n\n  render() {\n    const savedView = this.props.savedView;\n    if (!savedView) {\n      return null;\n    }\n\n    const isNew = !_.has(savedView, 'id');\n    const isPending = _.has(savedView, '__clientId') || this.props.isSyncing;\n\n    const description = this.currentDescription();\n    const count = _.size(description);\n\n    return (\n      <div className=\"ui-modal__wrapper\" style={{ display:'block' }}>\n        <div className=\"ui-modal\">\n          <header className=\"ui-modal__header\">\n            <h3>{isNew ? 'Add' : 'Edit'} Saved View</h3>\n            <span className=\"ui-modal__close\" onClick={this.props.onClose}></span>\n          </header>\n          <div className=\"ui-modal__content\">\n            <div className={`savedview-modal ${ count > 70 ? 'is-long-title' : '' }`}>\n              <div className=\"savedview-modal__input\">\n                <fieldset className=\"ui-form\">\n                  <label>Title</label>\n                  <div className=\"savedview-modal__count\">{count}</div>\n                  <textarea className=\"savedview-modal__textarea\" ref=\"descriptionField\" placeholder=\"Your message...\" value={description} onChange={this.handleChange} />\n                </fieldset>\n              </div>\n              {savedView.__error ?\n                <div className=\"savedview-modal__error\">\n                  {savedView.__error}\n                </div>\n              :\n                <div className=\"savedview-modal__hint\">\n                  {count > 70 ?\n                    <span>\n                      <strong>Tip:</strong> Great titles are less than 70 characters. Try shortening your message.\n                    </span>\n                  :\n                    <span>\n                      Give this saved view a title.\n                      <br/>\n                      For example: \"How much does our Police Department spend?\"\n                    </span>\n                  }\n                </div>\n              }\n            </div>\n          </div>\n          <footer className=\"ui-modal__footer\">\n            {!isNew ? <button className=\"ui-button negative\" disabled={isPending} onClick={this.handleDelete}>Delete</button> : null}\n            {isPending ?\n              <div className=\"ui-modal__actions ui-flex-1\">\n                <button className=\"ui-button primary\" disabled>\n                  <span className=\"ui-loading_button\" /> {isNew ? 'Adding...' : 'Updating...'}\n                </button>\n              </div>\n            :\n              <div className=\"ui-modal__actions ui-flex-1\">\n                <button className=\"ui-button ghost secondary\" onClick={this.props.onClose}>Cancel</button>\n                <button className=\"ui-button primary\" disabled={count === 0} onClick={this.handleSubmit}>\n                  {isNew ? 'Add Saved View' : 'Update Title'}\n                </button>\n              </div>\n            }\n          </footer>\n        </div>\n        <div className=\"ui-modal__background\"></div>\n      </div>\n    );\n  },\n\n  // Focus and position cursor at the end of the description field.\n  focusDescription() {\n    const el = this.refs.descriptionField;\n    if (el.setSelectionRange) {\n      const pos = el.value.length;\n      el.focus();\n      el.setSelectionRange(pos, pos);\n    } else {\n      const range = el.createTextRange();\n      range.collapse(false);\n      range.select();\n    }\n  },\n\n  currentDescription() {\n    if (_.isNull(this.state.description)) {\n      return _.result(this.props.savedView, 'description');\n    }\n    return this.state.description;\n  },\n\n  handleChange(e) {\n    this.setState({\n      description: e.target.value\n    });\n  },\n\n  handleSubmit() {\n    if (this.props.onSubmit) {\n      this.props.onSubmit(this.props.savedView, this.currentDescription());\n    }\n  },\n\n  handleDelete() {\n    if (this.props.onDelete) {\n      this.props.onDelete(this.props.savedView);\n    }\n  }\n});\n\nexport default SavedViewModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/saved_views_panel/saved_view_modal.tsx","import React from 'react';\nimport classNames from 'classnames';\n\nconst StoryListItem = props => {\n  const rowButtonClasses = classNames({\n    'ui-nav-list__item': true,\n    'is-selected': props.active\n  });\n\n  return (\n    <a className={rowButtonClasses} href={props.story.get('public_url')} target=\"_blank\">\n      <span className=\"ui-nav-list__item__text\">{props.story.get('title')}</span>\n    </a>\n  );\n};\n\nconst StoryList = props => (\n  <div className=\"ui-mainpanel__section product-list\">\n    <nav aria-label=\"List of stories\" className=\"ui-nav-list\">\n      {props.stories && props.stories.sortBy(s => s.get('order')).map(s =>\n        <StoryListItem\n          key={s.get('_id')}\n          story={s}\n          active={s.get('_id') === props.selectedStoryId}\n        />\n      )}\n    </nav>\n  </div>\n);\n\nexport default StoryList;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/story_list.tsx","import React from 'react';\nimport { Map } from 'immutable';\n\nexport interface IFilterButtonsProps {\n  items: [{name: string; id: string;}];\n  activeFilterIds: Map<string, boolean>;\n  toggleAll(): void;\n  addFilter(id: string): void;\n  removeFilter(id: string): void;\n}\n\nclass FilterButtons extends React.Component<IFilterButtonsProps, any> {\n\n  handleFilterClick = (item) => {\n    if (this.props.activeFilterIds.get(item.id)) {\n      this.props.removeFilter(item.id);\n    } else {\n      this.props.addFilter(item.id);\n    }\n  }\n\n  handleFilterAll = (e) => {\n    e.preventDefault();\n    this.props.toggleAll();\n  }\n\n  render() {\n    const {items} = this.props;\n\n    return (\n      <div className=\"ui-mainpanel__section\"\n        id=\"section-filter\">\n        <div className=\"ui-mainpanel__section-header\">\n          Filtered By\n          <button className=\"ui-mainpanel__section-expand-all js-show-filter-all\" id=\"wd-filter-button-all\" onClick={this.handleFilterAll}>\n            All\n            <span className=\"icon-righthead-2\"></span>\n          </button>\n        </div>\n\n        <div className=\"ui-button-stack\">\n          {items.map(item => {\n            const isActive = this.props.activeFilterIds.get(item.id);\n            return (\n              <button key={item.id} className={`filter-toggle ui-button small ${isActive ? 'active' : ''}`} onClick={() => this.handleFilterClick(item)}>\n                <span className=\"filter-toggle__text\">\n                  {item.name}\n                </span>\n                <div className=\"filter-toggle__actions\">\n                  <span className=\"filter-annotation\" id={`filter-annotation_${item.id}`}></span>\n                  <span className=\"ui-panel-toggle__close\"></span>\n                  <span className=\"ui-panel-toggle__open\"></span>\n                </div>\n              </button>\n            );\n          })}\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default FilterButtons;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter-buttons.tsx","import React, { CSSProperties } from 'react';\nimport ReactDOM from 'react-dom';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport Backbone from 'backbone';\nimport * as Ovid from '@opengov/ovid';\nimport update from 'immutability-helper';\n\nimport * as og from './og';\nimport Router, { parseParameters } from './router';\nimport Header from './header';\nimport Footer from './footer';\nimport ReportHeader from './report_header';\nimport HeaderActions from './header_actions';\nimport GraphType from './graphtype';\nimport DocumentList from './document_list';\nimport FilterPanelOptions from './filter_panel_options';\nimport Legend from './legend';\nimport RecoverableError from './views/recoverable_error';\nimport Download from './models/download';\n\nimport * as graph from './graph';\nimport SummaryGraph from './summary_graph';\nimport AnnotationsPanel from './annotations_panel';\nimport strings from './strings';\nimport SummaryReportFiltersPanel from './summary_report_filters_panel';\nimport GlobalAlert from './global_alert';\n\nimport ReportActions from './actions/report_actions';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport SavedViewsStore from './stores/saved_views_store';\nimport SummaryReportStore from './stores/summary_report_store';\nimport ModalStore from './stores/modal_store';\nimport { StoreListener } from '@opengov/og_flux';\n\nimport Budget101 from './griddle/budget101';\nimport WelcomeModal from './modals/summary_welcome';\nimport HowToModal from './modals/howto';\nimport FeedbackModal from './modals/feedback';\nimport TermsOfServiceModal from './modals/terms-of-service';\nimport DownloadModal from './modals/download';\n\nimport FilterPanel from './filter_panel';\nimport {compatibleReports} from './metric_data_constants';\nimport {\n  getErrorsByProjectionTypesFromSourceDatasets\n} from './utils/projections_utils';\nimport { coaNodesToLinkageNodes, getMaskNodesForLinkage } from './utils/transactions_utils';\n\nimport SummaryTable from './tables_section/summary_table';\nimport DatagridContainerComponent from './tables_section/datagrid_container_component';\n\nimport cookies from 'cookies-js';\nimport CookieHelper from './cookie_helper';\n\nimport Sidebar from './sidebar';\nimport { isEmbed, hideTable, hideViz } from './utils/embed_utils';\n\nlet summaryTableHeight;\nconst gridHeaderHeight = 28;\n\nimport createReactClass from 'create-react-class';\n\nconst SummaryReport = createReactClass<any, any>({\n  mixins: [StoreListener(ModalStore)] as any,\n\n  getInitialState() {\n    this.events = _.extend({}, Backbone.Events);\n    return _.assign({\n      initialized: false,\n      loading: true,\n      store: SummaryReportStore.getState(),\n    }, SummaryReportStore.getState().toObject(), {showWelcome: this.showWelcome()});\n  },\n\n  storeDidUpdate() {\n    //this is just the modal store currently\n    this.setState(update(this.state, {\n      showWelcome: {\n        $set: ModalStore.getState().get('showWelcome') === null ? this.state.welcomeModal : ModalStore.getState().get('showWelcome')\n      },\n      showHowTo: {\n        $set: ModalStore.getState().get('showHowTo')\n      },\n      showDownloadModal:{\n        $set: ModalStore.getState().get('showDownloadModal')\n      },\n      showTOS: {\n        $set: ModalStore.getState().get('showTOS')\n      },\n      showBudget101: {\n        $set: ModalStore.getState().get('showBudget101')\n      },\n      showFeedback: {\n        $set: ModalStore.getState().get('feedback').get('showFeedback')\n      },\n      feedbackSaving: {\n        $set: ModalStore.getState().get('feedback').get('saving')\n      },\n      feedbackError: {\n        $set: ModalStore.getState().get('feedback').get('showError')\n      },\n      feedbackErrorMessage: {\n        $set: ModalStore.getState().get('feedback').get('errorMessage')\n      }\n    }));\n  },\n\n  componentDidMount() {\n    const $graph = $(ReactDOM.findDOMNode(this.refs.graph));\n    summaryTableHeight = $graph.height() - gridHeaderHeight;\n\n    if (_.includes(this.props.entity.get('feature_permissions'), 'metric_data') && _.includes(compatibleReports, this.props.report.get('technical_name'))) {\n      SummaryReportActions.getMetricsAvailable();\n    }\n\n    SummaryReportStore.addChangeListener(this.handleChange);\n    var entity = this.props.entity.toJSON();\n    var report = this.report = this.props.report;\n    this.events.on('reset', () => {\n      ReportActions.resetState();\n      SummaryReportActions.getAggregations();\n    });\n\n    if (this.state.showWelcome) {\n      CookieHelper.setVisitedCookie('transparency_visited');\n    }\n\n    const athena = this.athena = new Athena({\n      showLogo: this.props.showLogo,\n      entity,\n      report,\n      reportParams: this.props.reportParams,\n      embedded: this.props.embedded,\n      onParamsChange: this.props.onParamsChange,\n      reportEvents: this.events,\n      auditModeEnabled: this.props.auditModeEnabled\n    });\n\n    SavedViewsStore.addChangeListener(this.handleSavedViewsStoreChange);\n\n    if (!report.dataSets.isEmpty()) {\n      athena.on('initialized', this.handleAthenaInitialized);\n      athena.on('loaded', this.handleAthenaLoaded);\n      athena.on('error', this.handleAthenaError);\n    } else {\n      this.handleAthenaInitialized();\n      this.handleAthenaLoaded();\n    }\n\n    if (this.props.onStateChange) {\n      athena.on('stateChange', this.handleDefaultStateChange);\n    }\n    /**\n    * every time athena_state gets event renderData, Athena re-triggers this event in this this handler\n    */\n    athena.on('renderData', this.handleRenderData);\n\n\n    if (this.props.onDataSetChange) {\n      athena.on('dataSetChange', this.props.onDataSetChange);\n    }\n\n    if (this.props.onCoaMaskChange) {\n      athena.on('coaMaskChange', this.props.onCoaMaskChange);\n    }\n\n    const pkg = SummaryReportStore.getState().get('pkg');\n    if (pkg) {\n      athena.renderPackage(pkg);\n    }\n  },\n\n  /**\n  * every time Summary Report Store state is updated, this function is called\n  * basically we update Summary report state from the Summary Report Store state <-- go figure\n  *\n  * _/﹋\\_\n  * (҂`_´)\n  * <,︻╦╤─ ҉ - -\n  * _/﹋\\_\n  */\n  handleChange() {\n    const state = SummaryReportStore.getState();\n    this.setState({\n      store: state,\n      amountUnit: SummaryReportStore.getAmountUnit(),\n      filterPanels: SummaryReportStore.getFilterPanels(),\n      yAxisScale: state.get('yAxisScale') && state.get('yAxisScale').toJS()\n    });\n\n    if (this.athena) {\n      this.athena.state.set('showAnnotations', state.isAnnotationsPanelOpen);\n    }\n  },\n\n  componentWillUnmount() {\n    SummaryReportStore.removeChangeListener(this.handleChange);\n    if (this.athena) {\n      this.athena.unmount();\n      this.athena.off('initialized', this.handleAthenaInitialized);\n      this.athena.off('renderData', this.handleRenderData);\n      if (this.props.onStateChange) {\n        this.athena.off('stateChange', this.handleDefaultStateChange);\n      }\n      this.athena.stopListening();\n      if (this.loadPackageRequest) {\n        this.loadPackageRequest.abort();\n      }\n    }\n\n    SavedViewsStore.removeChangeListener(this.handleSavedViewsStoreChange);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (nextProps.renderedReport.get('data_sets') !== this.props.renderedReport.get('data_sets')) {\n      _.defer(() => {\n        this.athena.updateDataSets(nextProps.renderedReport.get('data_sets').toJS());\n      });\n    }\n\n    if (nextProps.renderedReport.get('coa_mask_id') !== this.props.renderedReport.get('coa_mask_id')) {\n      _.defer(() => {\n        this.athena.updateCoaMask(nextProps.renderedReport.get('coa_mask_id'));\n      });\n    }\n\n    if (nextProps.editingDefaultState !== this.props.editingDefaultState) {\n      this.events.trigger('editingDefaultState', nextProps.editingDefaultState);\n    }\n\n    if (nextProps.reportParams !== this.props.reportParams) {\n      if (this.state.initialized) {\n        this.athena.updateParams(nextProps.reportParams);\n      } else {\n        this.athena.reportParams = nextProps.reportParams;\n      }\n    }\n  },\n\n  componentDidUpdate(prevProps, prevState) {\n    const pkg = this.state.store.get('pkg');\n    if (prevState.store.get('pkg') !== pkg) {\n      this.athena.renderPackage(pkg);\n    }\n  },\n\n  handleSavedViewsStoreChange() {\n    const activeView = SavedViewsStore.getActiveView();\n    if (activeView) {\n      //The store is expecting the range to be an array\n      _.defer(SummaryReportActions.setFiscalYearRange, _.values(activeView.view_state.fiscal_year_range));\n      this.athena.state.set('saved_view', _.result(SavedViewsStore.getActiveView(), 'id'));\n    }\n  },\n\n  /**\n  * every time Athena receives 'renderData' event, it re-triggers this event with budgetData on itself\n  */\n  handleRenderData() {\n    if (!this.props.report) {\n      return;\n    }\n\n    const renderedData = SummaryReportStore.getRenderedData();\n    const fiscalYearStartMonth = this.props.entity.get('fiscal_year_start_month');\n    const product = this.props.report.get('technical_name');\n    const xAxisLabels = [];\n\n    if (renderedData && !_.isEmpty(renderedData.lines)) {\n      const dataSets = SummaryReportStore.getRenderedDataSets();\n\n      _.each(dataSets, _.bind(function(dataSet) {\n        const label = strings.dataSetLabel(\n          dataSet,\n          product,\n          SummaryReportStore.getState().get('currentYearPeriod'), //Issue was that state was not uptodate\n          SummaryReportStore.getState().get('currentYearAmount'),\n          fiscalYearStartMonth,\n          {\n            proration: SummaryReportStore.getState().get('proration'),\n            projections: SummaryReportStore.getState().get('athenaState').get('projections')\n          }\n        );\n        xAxisLabels.push(label);\n      }, this));\n    }\n\n    if (!this.isFirstRenderComplete) {\n      this.isFirstRenderComplete = true;\n      this.props.onLoaded(true/*isTriggeredFromSummaryReport*/);\n    }\n\n    this.setState({xAxisLabels});\n  },\n\n  /**\n  * every time Athena's state is changed, this function is called\n  */\n  handleDefaultStateChange() {\n    if (_.includes(this.props.entity.get('feature_permissions'), 'linkage_view')) {\n      const versusView = this.state.store.get('versusView');\n      const includedLedgerTypes = versusView ? versusView.get('trees').toJS() : [this.state.store.get('accountType')];\n      const selectedNodes = this.athena.budgetData.minimalSelectedNodeList(includedLedgerTypes);\n      const nodesForLinkage = this.state.store.get('nodesForLinkage');\n      const masks = this.state.store.get('masksForLinkage');\n      const linkageNodes = coaNodesToLinkageNodes(selectedNodes, nodesForLinkage);\n      var maskNodesForLinkage = [];\n      if (!_.isEmpty(masks)) {\n        maskNodesForLinkage = getMaskNodesForLinkage(masks, nodesForLinkage);\n     }\n     this.setState({\n        linkageNodes\n      });\n      this.setState({\n        maskNodesForLinkage\n      });\n    } else {\n      this.setState({\n        accountCodeQuery: this.athena.state.getLeafAccountCodeTreeMap()\n      });\n    }\n\n    const changingProps = SummaryReportStore.generateSummaryReportState();\n    this.props.onStateChange( changingProps );\n  },\n\n  handleAthenaInitialized() {\n    this.setState({\n      // Only mark report as initialized if data sets have been loaded.\n      initialized: !this.props.report.dataSets.isEmpty(),\n\n      headerOptions: {\n        athenaState: this.athena.state,\n        onMakeDefaultReport: this.props.onMakeDefaultReport,\n        report: this.props.report,\n        renderedReport: this.props.renderedReport,\n        router: this.athena.router,\n        budgetData: this.athena.budgetData,\n        entity: this.props.entity,\n        extraFiles: this.athena.report.extra_files,\n        filterMenu: this.athena.filterMenu,\n        downloadModel: new Download({entity: this.props.entity, athena: this.athena}),\n        embedded: this.props.embedded,\n        showBudget101: !this.props.embedded && this.props.entity.get('budget_101')\n      }\n    });\n  },\n\n  handleAthenaLoaded() {\n    if (this._isMounted) {\n      this.setState({athenaLoaded: true});\n    }\n  },\n\n  handleAthenaError(err) {\n    this.setState({loading: false, error: err});\n  },\n\n  handleLegendSelect(lineId) {\n    const graph = this.refs.graph.graph;\n    graph.unhighlightSeries(lineId);\n    SummaryReportActions.drill(lineId);\n  },\n\n  handleLegendMore() {\n    this.athena.state.expandMore();\n  },\n\n  handleLegendLess() {\n    this.athena.state.collapseMore();\n  },\n\n  handleLegendSortChange(sortId) {\n    this.athena.state.set('legendSort', sortId);\n  },\n\n  handleLegendItemEnter(lineId) {\n    this.events.trigger('highlightNode', lineId);\n    const graph = this.refs.graph.graph;\n    if (!graph.legendOver) {\n      graph.legendOver = true;\n      graph.highlightSeries(lineId);\n    }\n  },\n\n  showWelcome() {\n    // this.props.embedded is tied to isControlPanel.\n    // isEmbed() is checking to see if url has 'embed=table' etc.\n    return !isEmbed() && !this.props.embedded && !cookies.get('transparency_visited');\n  },\n\n  handleLegendItemLeave(lineId) {\n    this.events.trigger('highlightNode');\n    const graph = this.refs.graph.graph;\n    if (graph.legendOver) {\n      graph.legendOver = false;\n      graph.unhighlightSeries(lineId);\n    }\n  },\n\n  handleRetryClick() {\n    this.athena.budgetData.triggerSelectionChange();\n    ReportActions.hasValidData();\n  },\n\n  entityHasWelcomeDisabled() {\n    return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1\n  },\n\n  render() {\n    const retryButton = (\n      <button type=\"button\"\n        className=\"ui-button primary small js-button\"\n        onClick={this.handleRetryClick} key=\"retry-button\">Retry</button>\n    );\n\n    const linkedYears = _.map(this.props.report.dataSets.models, function(reportModel: { attributes: { year } }) {\n      return reportModel.attributes.year;\n    });\n    let welcomeModal = this.state.initialized && (this.state.showWelcome) && !this.entityHasWelcomeDisabled()?\n      (<WelcomeModal\n        entity={this.props.entity}\n        showBudget101={!this.props.embedded ? this.props.entity.get('budget_101') : false} />\n      )\n    : null;\n\n    let howToModal = this.state.initialized && this.state.showHowTo ?\n      <HowToModal /> :\n      null;\n\n    let downloadModal = this.state.initialized && this.state.showDownloadModal ?\n      <DownloadModal\n        athenaState={this.state.athenaState}\n        budgetData={this.athena && this.athena.budgetData}\n        breakdown={this.state.store.get('breakdown')}\n        entity={this.props.entity}/> :\n      null;\n\n    let budget101Modal = this.state.initialized && this.state.showBudget101 ?\n      <Budget101 /> :\n      null;\n\n    let tosModal = this.state.initialized && this.state.showTOS ?\n      <TermsOfServiceModal /> :\n      null;\n\n    let feedbackModal = this.state.showFeedback ?\n      <FeedbackModal\n        entityDisplayName={this.props.entity.get('display_name')}\n        showError={this.state.feedbackError}\n        errorMessage={this.state.feedbackErrorMessage}\n        feedbackSaving={this.state.feedbackSaving}\n        reportId={this.props.report.id}\n        entityId={this.props.entity.get('entity_id')}/> :\n      null;\n\n    let athenaState = this.athena && this.athena.state;\n    let isHighlightingEnabled = this.state.store.get('highlighting') !== true ? false : this.state.store.get('highlighting');\n    let highlightingVariance = this.state.store.get('highlightingVariance');\n    let isProjectionsEnabled = athenaState && athenaState.get('projections') || false;\n    let projectionType = athenaState && athenaState.get('projectionType') || 'auto_year_avg';\n    let sourceDatasets = athenaState && athenaState.get('report').get('source_datasets');\n    const projectionsErrors = getErrorsByProjectionTypesFromSourceDatasets(sourceDatasets);\n    const embedMainContentStyle = isEmbed() ? { paddingLeft: '0px' } : {};\n    const embedReportStyle = isEmbed() ? { paddingTop: '10px' } : {};\n    const embedTableStyle = hideTable() ? { display: 'none' } as CSSProperties: {};\n    const embedVizStyle = hideViz() ? { display: 'none' } as CSSProperties: {};\n    const isBalanceSheetReport = this.props.report && this.props.report.attributes && this.props.report.attributes.report_type === 'balance';\n\n    return (\n      <div className=\"report__container report_summary\" style={embedReportStyle}>\n        {!this.props.hasValidData ?\n        <GlobalAlert\n          title=\"Unable to request data from the server\"\n          message=\"Please try again in a moment.\"\n          buttons={[retryButton]} /> : null }\n\n        <div ref=\"panels\">\n        { !isEmbed() &&\n            <Ovid.MainPanel ref=\"sidebar\">\n              <Sidebar\n                entity={this.props.entity}\n                session={this.props.session}\n                report={this.props.report}\n                reports={this.props.reports}\n                embedded={this.props.embedded}\n                stories={this.props.stories}\n                activeSidebar={this.props.activeSidebar}\n                isEditingDefaultState={this.props.editingDefaultState}\n                isNetwork={this.props.isNetwork}\n                reportError={this.state.reportError}\n                initialized={this.state.initialized}\n                isControlPanel={this.props.isControlPanel}\n              >\n                <SummaryReportFiltersPanel\n                  accountType={this.state.store.get('accountType')}\n                  accountTypes={this.athena && this.athena.budgetData && this.athena.budgetData.visibleAccounts}\n                  versusView={this.state.store.get('versusView')}\n                  versusViews={SummaryReportStore.getVersusViews()}\n                  breakdown={this.state.store.get('breakdown')}\n                  breakdowns={this.athena && this.athena.state.breakdowns.toArray()}\n                  month={this.state.store.get('month')}\n                  months={this.state.store.get('months')}\n                  minYear={this.state.store.get('minYear')}\n                  maxYear={this.state.store.get('maxYear')}\n                  fiscalYearRange={this.state.store.get('fiscalYearRange')}\n                  year={this.state.store.get('year')}\n                  filterPanels={this.state.filterPanels}\n                  years={this.athena && this.athena.budgetData && this.athena.budgetData.years}\n                  athena={this.state.initialized && this.state.athenaLoaded ? this.athena : null}\n                  entity={this.props.entity}\n                  currentYearPeriod={this.state.store.get('currentYearPeriod')}\n                  reportType={this.props.report.get('technical_name')}\n                />\n                <DocumentList embedded={this.props.embedded} entity={this.props.entity} />\n                <FilterPanelOptions\n                  entity={this.props.entity}\n                  isNetwork={this.props.isNetwork}\n                  isControlPanel={this.props.isControlPanel}\n                  scalePerCapitaEnabled={this.props.scalePerCapitaEnabled} />\n              </Sidebar>\n            </Ovid.MainPanel>\n          }\n          {this.state.store.get('isAnnotationsPanelOpen') ?\n            <AnnotationsPanel\n              events={this.events}\n              annotations={this.athena.budgetData.activeAnnotations()}\n              fiscalYearStartMonth={this.props.entity.get('fiscal_year_start_month')}\n              breakdown={this.state.store.get('breakdown')} />\n          : null}\n          {this.state.initialized && this.state.athenaLoaded ?\n            <FilterPanel\n              filterPanels={this.state.filterPanels}\n              budgetData={this.athena.budgetData}\n              athenaState={this.athena.state}\n              accountType={this.state.store.get('accountType')} />\n          : null}\n        </div>\n\n        {this.state.initialized ?\n          <header>\n            <HeaderActions\n              embedded={this.props.embedded}\n              {...this.state}\n              entity={this.props.entity}\n              report={this.props.renderedReport}\n              reportState={this.props.reportState}\n              isNetwork={this.props.isNetwork}\n              showHowTo={true}\n              showDownloadModal= {true}\n              showBudget101={!this.props.embedded ? this.props.entity.attributes.budget_101 : false}\n              showShareMenu={this.props.renderedReport.getIn(['abilities', 'update'])}\n              session={this.props.session}\n              />\n          </header>\n        : null}\n\n        <Header\n          entity={this.props.entity}\n          isNetwork={this.props.isNetwork}\n          headerOptions={this.state.headerOptions}\n          report={this.props.renderedReport}\n          reports={this.props.reports}\n          embedded={this.props.embedded} />\n\n        <main style={embedMainContentStyle} className=\"ui-main__content\">\n          {this.state.initialized ?\n            <ReportHeader\n              {...this.state.headerOptions}\n              yAxisScale={this.state.store.get('yAxisScale')}\n              scale={this.state.store.get('scale')}\n              amountUnit={this.state.amountUnit}\n              accountType={this.state.store.get('accountType')}\n              breakdown={this.state.store.get('breakdown')}\n              isControlPanel={this.props.isControlPanel} />\n          : null}\n\n          <section id=\"transparency-content\" className=\"report__section\">\n            {(this.state.initialized && !hideViz()) ?\n              <GraphType\n                graphTypes={graph.validGraphTypes}\n                athenaState={this.athena.state} /> : null}\n            <div className='report__header_updated_on'>\n            { isBalanceSheetReport &&\n              <small>\n                Calculated Change in Fund Balance / Net Assets is not shown in the visualization\n              </small>\n            }\n            </div>\n            <div className=\"report__graph-wrapper\" style={embedVizStyle}>\n              <h3>Visualization</h3>\n              <div id=\"template-modal-recoverable-error\"></div>\n\n              {this.props.report.dataSets.isEmpty() || !this.props.hasValidData ?\n                <p className=\"ui-null\">\n                  <strong>No data available for this report.</strong>\n                  {this.props.embedded && this.props.report.canEdit() ?\n                    <span>Please <a onClick={ReportActions.openEditData}>choose</a> which data sets to include in this report.</span>\n                  : null}\n                </p>\n              : null}\n              <SummaryGraph\n                ref=\"graph\"\n                isBalanceSheetReport={isBalanceSheetReport}\n                showAnnotations={this.state.store.get('isAnnotationsPanelOpen')}\n                loading={this.state.store.get('loading')}\n                graphLoading={this.state.store.get('graphLoading')}\n                shouldRenderGraph={this.state.initialized && this.state.athenaLoaded}\n                xAxisLabels={this.state.xAxisLabels}\n                xAxisTitle={this.props.renderedReport.getIn(['properties', 'fiscal_year_text'])}\n                reportEvents={this.events}\n                budgetData={this.athena && this.athena.budgetData}\n                entity={this.props.entity}\n                athenaState={this.athena && this.athena.state}\n                router={this.props.router}\n                yAxisScale={this.state.yAxisScale}\n                overlay={this.state.store.get('overlay')}\n                metricData={this.state.store.get('metricData')}\n                accountType={this.state.store.get('accountType')}\n                projections={isProjectionsEnabled}\n                projectionType={projectionType}\n                projectionsErrors={projectionsErrors} />\n\n              {this.state.store.get('loading') && !this.props.report.dataSets.isEmpty() ?\n                <div className=\"ui-loader\">\n                  <div className=\"ui-loading\" />\n                  <div className=\"ui-loader__message\">\n                    <small>Loading</small>\n                    <strong>Report Data</strong>\n                  </div>\n                </div>\n              : null}\n\n              {this.state.error ? (\n                <p className=\"ui-null\">\n                  <strong>{this.state.error.message}</strong>\n                </p>\n              ) : null}\n            </div>\n            {(this.state.initialized && this.state.athenaLoaded && !hideViz()) ? (\n              <Legend\n                lines={SummaryReportStore.getRenderedData(true).lines}\n                isExpanded={this.athena.state.legendExpanded()}\n                sortBy={this.athena.state.get('legendSort')}\n                onItemClick={this.handleLegendSelect}\n                onItemEnter={this.handleLegendItemEnter}\n                onItemLeave={this.handleLegendItemLeave}\n                onShowMore={this.handleLegendMore}\n                onShowLess={this.handleLegendLess}\n                annotationCount={this.athena.budgetData.activeAnnotations().length}\n                onSortChange={this.handleLegendSortChange}\n                entity={this.props.entity} />\n            ) : null}\n          </section>\n          {!this.state.store.get('loading') && this.athena ?\n            <section className=\"table__wrapper\" style={embedTableStyle}>\n              <h3>Data</h3>\n              {_.includes(this.props.entity.get('feature_permissions'), 'transaction_linkage') ?\n                <DatagridContainerComponent\n                  locale={this.props.report.attributes.locale}\n                  isBalanceSheetReport={isBalanceSheetReport}\n                  athenaState={this.athena.state}\n                  embedded={this.props.embedded}\n                  entity={this.props.entity}\n                  isPublic={!this.props.embedded}\n                  onOpenSettingsPanel={this.props.onOpenSettingsPanel}\n                  query={this.state.accountCodeQuery}\n                  linkageNodes={this.state.linkageNodes}\n                  maskNodesForLinkage={this.state.maskNodesForLinkage}\n                  report={this.props.report.associatedReport}\n                  canEdit={this.props.report.canEdit()}\n                  linkedYears={linkedYears}\n                  reportEvents={this.events}\n                  expandedNodes={this.state.store.get('expandedNodes').toJSON()}\n                  height={summaryTableHeight}\n                  accountType={this.state.store.get('accountType')}\n                  overlay={this.state.store.get('overlay')}\n                  scale={this.state.store.get('scale')}\n                  metricData={this.state.store.get('metricData')}\n                  highlighting={isHighlightingEnabled}\n                  highlightingVariance={highlightingVariance}\n                  projections={isProjectionsEnabled}\n                  projectionType={projectionType} />\n                :\n                  <SummaryTable\n                    isBalanceSheetReport={isBalanceSheetReport}\n                    expandedNodes={this.state.store.get('expandedNodes').toJSON()}\n                    fiscalYearStartMonth={this.props.entity.get('fiscal_year_start_month')}\n                    athenaState={this.athena.state}\n                    yAxisScale={this.state.yAxisScale}\n                    reportEvents={this.events}\n                    height={summaryTableHeight}\n                    accountType={this.state.store.get('accountType')}\n                    overlay={this.state.store.get('overlay')}\n                    scale={this.state.store.get('scale')}\n                    metricData={this.state.store.get('metricData')}\n                    highlighting={isHighlightingEnabled}\n                    highlightingVariance={highlightingVariance}\n                    projections={isProjectionsEnabled}\n                    projectionType={projectionType} />\n                }\n            </section>\n          : null}\n          {!this.props.isControlPanel && !this.props.embedded ?\n              <Footer ref=\"footer\" entity={this.props.entity}/>\n          : null}\n          {welcomeModal}\n          {howToModal}\n          {feedbackModal}\n          {downloadModal}\n          {budget101Modal}\n          {tosModal}\n        </main>\n      </div>\n    );\n  }\n});\n\nvar Athena = og.View.extend({\n  el: 'body',\n\n  initialize(options) {\n    this.options = options;\n    this.entity = options.entity;\n    this.report = options.report;\n    this.reportParams = this.lastParams = options.reportParams;\n\n    this.state = SummaryReportStore.getState().get('athenaState');\n    this.state.set('mounted', true);\n\n    /**\n    * This function listens to the athena_state event 'renderData'\n    */\n    this.state.on('renderData', function() {\n      this.trigger('renderData', this.state, this.budgetData);\n      this.trigger('stateChange', SummaryReportStore.hashState());\n\n      const downloadButtons = this.$('#template-download_menu > .ui-dropdown');\n      if (this.budgetData.hasAggregations()) {\n        this.recoverableErrorModal.close();\n        downloadButtons.removeClass('disabled');\n      } else {\n        downloadButtons.addClass('disabled');\n      }\n    }, this);\n\n    this.listenTo(this.state, 'error', function(err) {\n      this.state.pauseRendering();\n      this.trigger('error', err);\n    });\n\n    /**\n    * Athena created backbone router\n    */\n    this.router = new Router({\n      state: this.state\n    });\n\n    /**\n    * this function is called whenever the Backbone router updates the pushState in the browser,\n    */\n    this.listenTo(this.router, 'change:params', function routerParamsChanged(newParams) {\n      if (!this.report.isNew()) {\n        this.lastParams = newParams;\n        /**\n        * see report_view.setReportParams, which calls React's Routes (routes.js) handleRouteChange\n        */\n        options.onParamsChange(newParams);\n      }\n    });\n\n    this.recoverableErrorModal = new RecoverableError({});\n\n    this.render();\n  },\n\n  unmount() {\n    this.state.set('mounted', false);\n  },\n\n  renderPackage() {\n    const budgetData = this.budgetData = SummaryReportStore.getState().get('budgetData');\n\n    this.listenTo(this.budgetData, 'changeDataSets', function() {\n      this.trigger('dataSetChange', this.budgetData.dataSets);\n    }, this);\n\n    this.trigger('initialized');\n\n    this.render();\n\n    budgetData.on('aggregation', function(aggregations) {\n      // Always replace our expansion state with minimal expansions\n      SummaryReportActions.summarySetExpandedNodes(aggregations.expanded_nodes, true);\n      this.trigger('loaded');\n    }, this);\n\n    // This changes the athenaState\n    this.state.changeProduct(\n      this.report.toJSON(),\n      !this.report.isNew()\n        ? {hash: parseParameters(this.reportParams)} : null\n    );\n  },\n\n  updateDataSets(dataSets) {\n    if (!this.budgetData) {\n      return;\n    }\n\n    dataSets.forEach(dataSet => dataSet.label = dataSet.name);\n    this.report.dataSets.reset(dataSets);\n\n    this.budgetData.dataSets = dataSets;\n    this.budgetData.trigger('changeDataSets');\n    this.state.trigger('renderData');\n  },\n\n  updateCoaMask() {\n    this.trigger('coaMaskChange');\n    this.state.trigger('renderData');\n  },\n\n  /**\n  * this is called from SummaryReport.componentWillReceiveProps\n  */\n  updateParams(params) {\n    if (this.lastParams && this.lastParams === params) {\n      this.lastParams = null;\n      return;\n    }\n\n    const parsedParams = parseParameters(params);\n\n    this.state.changeState(parsedParams);\n    SummaryReportActions.getAggregations();\n  }\n});\n\nexport default SummaryReport;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/summary_report.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport Breadcrumbs from './breadcrumbs';\nimport Title from './title';\nimport ReportDescription from './report_description';\n\nimport ReportUpdatedInfo from './griddle/report_updated_info';\nimport ReportActions from './actions/report_actions';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport { isEmbed } from './utils/embed_utils';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportHeader = createReactClass<any, any>({\n  propTypes: {\n    isControlPanel: PropTypes.bool,\n    athenaState: PropTypes.object,\n    budgetData: PropTypes.object,\n    yAxisScale: PropTypes.object,\n    scale: PropTypes.object,\n    amountUnit: PropTypes.string\n  },\n\n  render() {\n    const backClass = classNames(\n      'ui-button',\n      'icon-left-1',\n      'small',\n      {\n        'disabled': !this.props.router.backEnabled()\n      }\n    );\n    const resetClass = classNames(\n      'ui-button',\n      'icon-rotateleft-1',\n      'small',\n      {\n        'disabled': !this.props.router.resetEnabled()\n      }\n    );\n\n    let breakdownTree;\n    const budgetData = this.props.budgetData;\n\n    // Find the breakdown tree which will be used to build the breadcrumbs history.\n    // If breaking down by account types or budget data is not laoded, no tree\n    // will be provided causing the breadcrumbs history to be disabled.\n    if (budgetData && this.props.accountType !== 'types') {\n      breakdownTree = budgetData.getBreakdownTree(this.props.breakdown);\n    }\n\n    const perCapitaValue = 'Look at table below for values';\n    const embedHeaderStyle = isEmbed() ? { left: 0 } : {};\n    return (\n      <div className=\"report__header\" style={embedHeaderStyle}>\n        {(!this.props.isControlPanel && !isEmbed()) && <h1>{this.props.report.attributes.name}</h1>}\n        <ReportDescription report={this.props.renderedReport} />\n        <div className=\"report__header_updated_on\">\n          <ReportUpdatedInfo description={'Updated On '} timeStamp={this.props.report.get('data_updated_at')} />\n        </div>\n        <div className=\"page-navigation\">\n          <div className=\"ui-button-group\">\n            <button className={backClass}\n              onClick={this.handleClickBack}\n              disabled={!this.props.router.backEnabled()}>\n              Back\n            </button>\n            <Breadcrumbs tree={breakdownTree} />\n          </div>\n          <button id=\"reset_button\"\n            className={resetClass}\n            onClick={this.handleReset}\n            disabled={!this.props.router.resetEnabled()}>\n            Reset\n          </button>\n        </div>\n        <Title\n          {...this.props}\n          perCapitaValue={perCapitaValue} />\n      </div>\n    );\n  },\n\n  handleClickBack() {\n    this.props.router.back();\n  },\n\n  handleReset() {\n    ReportActions.resetState();\n    ReportActions.clearHistory();\n    SummaryReportActions.getAggregations();\n  }\n});\n\nexport default ReportHeader;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_header.tsx","import React from 'react';\nimport classNames from 'classnames';\n\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\nconst Dropdown = Ovid.Dropdown;\nimport SummaryReportActions from './actions/summary_report_actions';\n\nimport createReactClass from 'create-react-class';\n\nexport interface IBreadcrumbs {\n  name: string;\n  count: number;\n  selected: boolean;\n  onSelect: Function;\n};\n\nexport const Crumb = createReactClass<IBreadcrumbs, any>({\n\n  getDefaultProps() {\n    return {\n      name: 'Unknown',\n      onSelect: _.noop,\n      count: 0,\n      selected: false\n    };\n  },\n\n  render() {\n    const itemClasses = classNames({\n      'nav-history__item': true,\n      'js-crumb': true,\n      'is-selected': this.props.selected\n    });\n\n    return (\n      <button className={itemClasses} onClick={this.handleSelect}>{this.props.name} {this.props.count > 1 ? '(' + this.props.count + ')' : null}</button>\n    );\n  },\n\n  handleSelect() {\n    if (!this.props.selected) {\n      this.props.onSelect();\n    }\n  }\n});\n\nexport const Breadcrumbs = createReactClass<{ tree?: any, onSelect?: Function }, any>({\n  getDefaultProps() {\n    return {\n      onSelect: _.noop,\n      tree: null\n    };\n  },\n\n  render() {\n    const crumbs = this.computeCrumbs();\n\n    return (\n      <Dropdown\n        toggleClass=\"icon-history-1 nav-history__button\"\n        title=\"History\"\n        hint=\"Show the drill-down history\"\n        hintPosition=\"bottom\"\n        disabled={crumbs.length <= 1}>\n        <header className=\"ui-dropdown__header\">\n          <h4>Navigation Path</h4>\n        </header>\n        <nav className=\"nav-history\">\n          {this.renderCrumbItems(crumbs)}\n        </nav>\n      </Dropdown>\n    );\n  },\n\n  handleCrumbSelect(crumb) {\n    crumb.nodes.forEach(function(node) {\n      node.select();\n    });\n    SummaryReportActions.getAggregations();\n  },\n\n  computeCrumbs() {\n    const crumbs = [];\n    const queue = [];\n    let node;\n    let i;\n    let count;\n    let crumb;\n\n    if (this.props.tree) {\n      queue.push(this.props.tree);\n    }\n\n    while (queue.length > 0) {\n      node = queue.shift();\n      crumb = crumbs[node.depth] || (crumbs[node.depth] = {nodes: []});\n      if (node.selected || node.partiallySelected) {\n        crumb.name = node.name;\n        crumb.nodes.push(node);\n        if (node.partiallySelected) {\n          for (i = 0, count = node.children.length; i < count; i++) {\n            queue.push(node.children[i]);\n          }\n        }\n      }\n    }\n\n    return crumbs;\n  },\n\n  renderCrumbItems(crumbs) {\n    const lastIndex = crumbs.length - 1;\n    const categories = this.props.tree && this.props.tree.categories || [];\n\n    return crumbs.map(function(crumb, index) {\n      const count = crumb.nodes.length;\n      const name = count === 1 ? crumb.nodes[0].name : categories[index - 1];\n\n      return (\n        <Crumb key={index} name={name} count={count} selected={index === lastIndex} onSelect={this.handleCrumbSelect.bind(this, crumb)} />\n      );\n    }, this);\n  }\n});\n\nexport default Breadcrumbs;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/breadcrumbs.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport SummaryReportStore from './stores/summary_report_store';\nimport _ from 'lodash';\n\nimport numeral from 'numeral';\nimport strings from './strings';\n\nimport createReactClass from 'create-react-class';\n\nconst Title = createReactClass<any, any>({\n  propTypes: {\n    budgetData: PropTypes.object,\n    yAxisScale: PropTypes.object,\n    scale: PropTypes.object,\n    perCapitaValue: PropTypes.string,\n    amountUnit: PropTypes.string\n  },\n\n  render() {\n    const titles = this.props.budgetData.titles(this.props.breakdown);\n    const primary = titles.primary;\n    const secondary = titles.secondary;\n    const yAxisScale = this.props.yAxisScale;\n    const validScale = Boolean(yAxisScale && yAxisScale.type && yAxisScale.value);\n    let scaleDescription = validScale ? yAxisScale.description : null;\n    const validNumericScale = validScale && yAxisScale.type === 'numeric';\n    const scaleValue = validNumericScale ? numeral(yAxisScale.value).format('0,0') : null;\n    scaleDescription = validNumericScale ? (yAxisScale.description + ' (' + scaleValue + ')') : scaleDescription;\n    const currentScale = this.props.scale.getIn(['selected', 0]);\n\n    return (\n      <div id=\"report-drilldown-title\">\n        <h2\n          title={primary.partiallySelected ? '*This is a partial selection of ' + primary.name : ''}\n          className=\"page-title__primary-title js-show-filter\"\n          id=\"primary-title\"\n          data-id={primary.breakdownId}>\n          <small>Broken down by</small>\n          {primary.name ?\n            primary.name + (primary.partiallySelected ? '*' : '') : ''\n          }\n        </h2>\n\n        {secondary.map((title) => {\n          const nodeName = title.node.name + (title.node.partiallySelected ? ' ' : '');\n          return (\n            <span\n              key={title.node.name}\n              className=\"page-title__filter-tag\"\n              data-id={title.node.breakdownId}\n              onClick={_.partial(this.handleClick, title.breakdownId)}\n              data-hint={title.node.partiallySelected ? ('This is a partial selection of ' + title.node.name) : null}\n              data-hint-position={title.node.partiallySelected ? 'bottom' : null}>\n                <button className=\"ui-button pill tiny icon-filter-1\">\n                  {nodeName}\n                  {title.node.partiallySelected ?\n                    <span className=\"icon-more-1\"/>\n                  : null}\n                </button>\n            </span>\n          );\n        })}\n\n        {currentScale !== null || yAxisScale ?\n          <YAxisScalePill scaleValue={this.props.perCapitaValue} scale={this.props.scale} amountUnit={this.props.amountUnit} />\n        : null}\n\n        {false ?\n          <span\n            className=\"page-title__filter-tag\"\n            data-hint={scaleDescription}\n            data-hint-position=\"bottom\">\n            <button className=\"ui-button pill tiny icon-dollar-1\">\n              {yAxisScale.name}\n            </button>\n          </span>\n        : null}\n      </div>\n    );\n  },\n\n  handleClick(breakdownId) {\n    SummaryReportActions.toggleFilterPanel(breakdownId);\n  }\n});\n\nconst YAxisScalePill = createReactClass<any, any>({\n  propTypes: {\n    amountUnit: PropTypes.string.isRequired,\n    scaleValue: PropTypes.string.isRequired,\n    scale: PropTypes.object\n  },\n\n  render() {\n    const amountUnit = this.props.amountUnit;\n    let amountUnitLabel = strings.amountUnitLabel(amountUnit);\n    let pillTextBody = 'Per Capita';\n    let perSomething = '';\n    let classNameForIcon = strings.pillIconToUse(amountUnit);\n    switch (amountUnit) {\n    case '$':\n      perSomething = 'per capita';\n      break;\n    case 'FTE':\n      perSomething = 'per capita';\n      break;\n    }\n\n    const selected = this.props.scale.getIn(['selected', 0]);\n    const state = SummaryReportStore.getState();\n    const selectedData = state.getIn(['metricData', 'data', selected]);\n    if (selectedData) {\n      const units = selectedData.get('units');\n      classNameForIcon = strings.pillIconToUse(units);\n      pillTextBody = 'Per ' + selectedData.get('name');\n      amountUnitLabel = selectedData.get('name');\n      perSomething = units === 'people' && amountUnitLabel ? 'per capita' : '';\n    }\n\n    // Note the different units are : [%, US cents/person (converted to $/person), US cents, person, incidents]\n    const dataHint = `Amounts scaled to/by ${amountUnitLabel} ${perSomething} (${this.props.scaleValue})`;\n    // TODO the prior action `ReportActions.openAdvancedSettings` doesn't exist- do we want `openSettingsPanel`?\n    return (\n      <span className=\"page-title__filter-tag\"\n            data-hint={dataHint}\n            data-hint-position=\"bottom\"\n            onClick={null /*ReportActions.openSettingsPanel*/}>\n        <button className={classNames({'ui-button pill tiny': true}, classNameForIcon)} style={{maxWidth:'300px'}}>\n          {pillTextBody}\n        </button>\n      </span>\n    );\n  }\n});\n\nexport default Title;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/title.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nimport ShareList from './share/share_links';\nimport SharedLinkHelper from './share/shared_link_helper';\nimport { Dropdown } from '@opengov/ovid';\nimport HelpMenu from './header_actions/help_menu';\nimport ShareOptions from './share/share_options';\nimport CreateCopyMenu from './header_actions/create_copy_menu';\n\nimport Reports from './models/reports';\nconst reports = new Reports();\n\nimport TransparencyLoginButton from './TransparencyLoginButton';\n\n\nimport createReactClass from 'create-react-class';\n\nconst DropDownCopyMenu = createReactClass<any, any>({\n  getInitialState() {\n    return {\n      existingReports: reports\n    };\n  },\n  componentWillMount() {\n    reports.fetch({\n      data: $.param({\n        fields: 'name',\n        entity_id: this.props.entity.get('entity_id')\n      }),\n      success: reports => {\n        this.setState({\n          existingReports: reports\n        });\n      }\n    });\n  },\n\n  render() {\n    const { report, reportState } = this.props;\n    const { existingReports } = this.state;\n\n    return (\n      <Dropdown\n        title=\"Create Copy\"\n        position=\"align-right\"\n        dropdownClass=\"ui-nav-bar__item create-copy-menu\"\n        toggleClass=\"ui-button small no-color\"\n        ignoreContentClicks={true}\n        key=\"createCopy\">\n        <CreateCopyMenu\n          report={report}\n          existingReports={existingReports}\n          reportState={reportState} />\n      </Dropdown>\n    );\n  }\n});\n\nconst HeaderActions = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object.isRequired,\n    headerOptions: PropTypes.object,\n    showHowTo: PropTypes.bool,\n    showBudget101: PropTypes.bool,\n    showShareMenu: PropTypes.bool,\n    showCreateCopyMenu: PropTypes.bool,\n    isNetwork: PropTypes.bool\n  },\n\n  componentWillMount() {\n    this.linkHelper = SharedLinkHelper.create(this.props.entity);\n  },\n\n\n  render() {\n    const { entity, session, embedded, isNetwork } = this.props;\n    const dropdownName = embedded ? 'Download' : 'Share';\n\n    const canCreateReport = session && _.get(session.get('abilities'), ['report', 'create']);\n    return (\n      <nav aria-label=\"Header menu\" className=\"ui-main__actions ui-nav-bar\" style={ this.props.embed === 'y' ? {width: \"100%\"} : null }>\n        {!embedded &&\n          <TransparencyLoginButton\n            entityId={entity.id}\n            transparencyUrl={gon && gon.entity && gon.entity.transparency_url}\n          />\n        }\n        <Dropdown\n          title=\"Help\"\n          position=\"align-right\"\n          targetClass=\"ui-dropdown__target help-menu\"\n          dropdownClass=\"ui-nav-bar__item\"\n          toggleClass=\"ui-button small ghost no-color\"\n          key=\"help\">\n          <HelpMenu\n            showHowTo={this.props.showHowTo}\n            showBudget101={this.props.showBudget101}\n            showWelcome={!embedded}\n            entity={entity} />\n        </Dropdown>\n        <Dropdown\n          title={dropdownName}\n          position=\"align-right\"\n          dropdownClass=\"ui-nav-bar__item\"\n          toggleClass=\"ui-button small no-color\"\n          key=\"share\">\n          <ShareList\n            linkHelper={this.linkHelper}\n            options={this.props.headerOptions}\n            showShareMenu={embedded}\n            showDownloadItems\n          />\n        </Dropdown>\n        {canCreateReport && !isNetwork &&\n          <DropDownCopyMenu\n            entity={entity}\n            report={this.props.report}\n            reportState={this.props.reportState} />\n        }\n        {/* toggleClass icon should reflect current share state */}\n        {embedded && this.props.showShareMenu &&\n          <ShareOptions report={this.props.report} />\n        }\n      </nav>\n    );\n  },\n});\n\nexport default HeaderActions;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReportActions from '../actions/report_actions';\n\nimport createReactClass from 'create-react-class';\n\nconst HelpMenu = createReactClass<any, any>({\n  propTypes: {\n    showBudget101: PropTypes.bool,\n    showHowTo: PropTypes.bool,\n    entity: PropTypes.object.isRequired\n  },\n\n  showHowTo(e) {\n    e.preventDefault();\n    ReportActions.showHowTo();\n  },\n\n  showWelcome(e) {\n    e.preventDefault();\n    ReportActions.showWelcomeModal();\n  },\n\n  showBudget101(e) {\n    e.preventDefault();\n    ReportActions.showBudget101();\n  },\n\n  showFeedback(e) {\n    e.preventDefault();\n    ReportActions.showFeedback();\n  },\n\n  entityHasWelcomeDisabled() {\n    return this.props.entity && this.props.entity.get('feature_permissions') && this.props.entity.get('feature_permissions').indexOf('disable_transparency_welcome_message') !== -1\n  },\n\n  render() {\n    return (\n      <ul className=\"ui-dropdown__list\">\n        {this.props.showHowTo ?\n        (<li>\n          <button id=\"howto\" className=\"modal__open\" onClick={this.showHowTo}>How To</button>\n        </li>) :\n        null }\n        {this.props.showWelcome && !this.entityHasWelcomeDisabled() ?\n          (<li>\n            <button id=\"welcome\" className=\"modal__open\" onClick={this.showWelcome}>Welcome Screen</button>\n          </li>) :\n        null }\n        {this.props.showBudget101 ?\n          (<li>\n            <button id=\"budget101\" className=\"modal__open\" onClick={this.showBudget101}>Multi-Fund Accounting 101</button>\n          </li>) :\n        null}\n        <li>\n          <button id=\"entity-feedback-help\"\n            className=\"modal__open\"\n            onClick={this.showFeedback}>\n            Contact {this.props.entity.get('name')}\n          </button>\n        </li>\n      </ul>);\n  }\n\n});\n\nexport default HelpMenu;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/help_menu.tsx","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { ToggleSwitch } from '@opengov/ovid';\n\nimport ReportActions from '../actions/report_actions';\n\nexport default class CreateCopyMenu extends Component<any, any> {\n  static propTypes = {\n    existingReports: PropTypes.object.isRequired,\n    report: PropTypes.object.isRequired,\n    reportState: PropTypes.object.isRequired\n  }\n\n  state = {\n    name: null,\n    useCurrentReportState: true,\n    copySavedViews: true,\n    invalidName: false,\n    isSubmitting: false\n  }\n\n  handleNameChange = (event) => {\n    const name = event.target.value;\n    const invalidName = !!this.props.existingReports.where({name}).length;\n    this.setState({\n      name,\n      invalidName\n    });\n  }\n\n  toggleSetDefaultState = () => {\n    this.setState({\n      useCurrentReportState: !this.state.useCurrentReportState\n    });\n  }\n\n  toggleCopySavedViews = () => {\n    this.setState({\n      copySavedViews: !this.state.copySavedViews\n    });\n  }\n\n  handleCloneReport = () => {\n    const { report } = this.props;\n    const { invalidName, name, useCurrentReportState, copySavedViews, isSubmitting } = this.state;\n\n    if (invalidName || isSubmitting) {\n      return;\n    }\n\n    const cloneReportOptions = {\n      report,\n      name,\n      copySavedViews,\n      properties: null\n    };\n\n    if (useCurrentReportState) {\n      cloneReportOptions.properties = this.props.reportState;\n    }\n\n    this.setState({\n      isSubmitting: true\n    });\n    ReportActions.cloneReport(cloneReportOptions);\n  }\n\n  handleFormSubmit = (event) => {\n    event.preventDefault();\n    this.handleCloneReport();\n  }\n\n  handleFormCancel = () => {\n    // the dropdown component does not provide a close function to its children\n    // so we do this as a hack until it does\n    document.body.click();\n  }\n\n  componentDidUpdate() {\n    (this.refs['report-name'] as any).focus();\n  }\n\n  render() {\n    const { report } = this.props;\n    const { name, useCurrentReportState, copySavedViews, invalidName, isSubmitting } = this.state;\n\n    return (\n      <div className=\"ui-card\">\n        <form onSubmit={this.handleFormSubmit}>\n          <div className=\"ui-card__header\">\n            Copy this report\n          </div>\n          <div className=\"ui-card__content\">\n            <fieldset className={classnames('ui-form', 'required', {\n              whoops: invalidName\n            })}>\n              <label>Report name</label>\n              <input\n                ref=\"report-name\"\n                type=\"text\"\n                required\n                placeholder={`${report.get('name')} (Copy)`}\n                value={name}\n                onChange={this.handleNameChange} />\n              {invalidName ? <p className=\"hint whoops\">This name is already taken.</p> : ''}\n            </fieldset>\n            <fieldset className=\"ui-form\">\n              <label>Use the current view as the new Default State?</label>\n              <ToggleSwitch state={useCurrentReportState ? 'on' : 'off'} onToggle={this.toggleSetDefaultState} />\n            </fieldset>\n            <fieldset className=\"ui-form\">\n              <label>Copy Saved Views with report?</label>\n              <ToggleSwitch state={copySavedViews ? 'on' : 'off'} onToggle={this.toggleCopySavedViews} />\n            </fieldset>\n          </div>\n          <div className=\"ui-card__footer\">\n            <div className=\"ui-card__actions\">\n              <button\n                type=\"button\"\n                className=\"ui-button ghost\"\n                disabled={isSubmitting}\n                onClick={this.handleFormCancel}>Cancel</button>\n              <button\n                type=\"submit\"\n                className=\"ui-button primary\"\n                disabled={!name || invalidName || isSubmitting}>\n                {isSubmitting && <span className=\"ui-loading_button card__actions__button__loading\" />}\n                <span className=\"no-left-margin\">Copy</span>\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/header_actions/create_copy_menu.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { translate } from 'react-i18next';\n\nexport class GraphType extends React.Component<any, any> {\n  static propTypes = {\n    athenaState: PropTypes.object.isRequired, //take in a method instead...\n    graphTypes: PropTypes.array.isRequired\n  };\n\n  graphTypes = {\n    table: {\n      icon: 'ui-graphtype__table',\n      name: 'Table View'\n    },\n    line: {\n      icon: 'ui-graphtype__line',\n      name: 'Line Graph'\n    },\n    stacked: {\n      icon: 'ui-graphtype__stacked',\n      name: 'Stacked Graph'\n    },\n    percentage: {\n      icon: 'ui-graphtype__percentage',\n      name: 'Percentage Graph'\n    },\n    pie: {\n      icon: 'ui-graphtype__pie',\n      name: 'Pie Graph'\n    },\n    bar: {\n      icon: 'ui-graphtype__bar',\n      name: 'Bar Graph'\n    },\n    map: {\n      icon: 'ui-graphtype__map',\n      name: 'Map'\n    }\n  };\n\n  handleChangeGraphType = (id) => {\n    this.props.athenaState.set('graphType', id);\n  }\n\n  render() {\n    const { t } = this.props;\n\n    return (\n      <div className=\"ui-graphtype ui-button-group\">\n\n      {this.props.graphTypes.map((id) => {\n        const graphType = this.graphTypes[id];\n        const classes = {};\n        const name = t(`strings.graph.types.${id}`);\n\n        classes[graphType.icon] = true;\n        classes['ui-button'] = true;\n        //find a class that has a graphtype get method, pass in a function\n        classes['is-selected'] = id === this.props.athenaState.get('graphType');\n\n        return (\n          <button\n            id={'wd-change-graph-type_' + id}\n            key={id}\n            ref={id}\n            className={classNames(classes)}\n            onClick={this.handleChangeGraphType.bind(this, id)}\n            data-hint={name}\n            data-hint-position=\"bottom\">\n            <span className=\"ui-graphtype__icon\" aria-label={`Switch to ${name}`}/>\n          </button>\n        );\n      })}\n      </div>\n    );\n  }\n}\n\nconst TranslatedGraphType = translate('report', { wait: true })(GraphType);\nTranslatedGraphType.contextTypes = {\n  i18n: PropTypes.object\n};\n\nexport default TranslatedGraphType;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/graphtype.tsx","import React from 'react';\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\nimport PropTypes from 'prop-types';\n\nimport ReportActions from './actions/report_actions';\nimport ReportViewStore from './stores/report_view_store';\nimport SummaryReportActions from './actions/summary_report_actions';\nimport SummaryReportStore from './stores/summary_report_store';\n\nexport default class FilterPanelOptions extends React.Component<any, any> {\n  static propTypes = {\n    entity: PropTypes.object.isRequired,\n    isNetwork: PropTypes.bool,\n    isControlPanel: PropTypes.bool,\n    scalePerCapitaEnabled: PropTypes.bool\n  };\n\n  render() {\n    const {\n      entity,\n      isControlPanel,\n      isNetwork,\n      scalePerCapitaEnabled\n    } = this.props;\n\n    const summaryReportState = SummaryReportStore.getState();\n    const toggleState = summaryReportState.get('yAxisScale') ? 'on' : 'off';\n    const toggleLabel = summaryReportState.get('yAxisScale') ? 'Scale by per capita' : 'Don\\'t scale amounts';\n    const disabled = !entity.get('population');\n    const onToggle = disabled ? null : () => SummaryReportActions.togglePerCapitaScale();\n    const yAxisScaleToggle = _.includes(entity.get('feature_permissions'), 'metric_data') || (!isControlPanel && disabled);\n\n    return (\n      <div className=\"ui-mainpanel__section\">\n        <div className=\"ui-mainpanel__section-header\">\n          Options\n        </div>\n        {isControlPanel && !isNetwork &&\n          <div className=\"filter_panel_option\">\n            <div className=\"ui-form\">\n              <Ovid.ToggleSwitch\n                size=\"small\"\n                state={ReportViewStore.getAuditModeEnabled() ? 'on' : 'off'}\n                onToggle={ReportActions.toggleAuditMode}>\n                Account Codes\n              </Ovid.ToggleSwitch>\n            </div>\n          </div>}\n        {(scalePerCapitaEnabled && !yAxisScaleToggle) ?\n          <div className=\"filter_panel_option\">\n            <div className=\"ui-form\">\n              <Ovid.ToggleSwitch\n                size=\"small\"\n                state={toggleState}\n                onToggle={onToggle}>\n                {toggleLabel}\n              </Ovid.ToggleSwitch>\n            </div>\n          </div>\n        : null}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel_options.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport $ from 'jquery';\n\nimport * as og from '../og';\nimport AnnotationsButton from '../annotations_button';\nimport LegendItem from './legend_item';\nimport LegendMoreButton from './legend_more_button';\nimport LegendSort from './legend_sort';\n\nimport createReactClass from 'create-react-class';\n\nconst Legend = createReactClass<any, any>({\n  propTypes: {\n    lines: PropTypes.array.isRequired,\n    isExpanded: PropTypes.bool,\n    sortBy: PropTypes.string,\n    onItemClick: PropTypes.func,\n    onItemEnter: PropTypes.func,\n    onItemLeave: PropTypes.func,\n    onSortChange: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      onItemClick: _.noop,\n      onItemEnter: _.noop,\n      onItemLeave: _.noop,\n      onSortChange: _.noop\n    };\n  },\n\n  render() {\n    const singleRow = _.size(this.props.lines) === 1;\n    const items = this.props.lines.map(function(line) {\n      return (\n        <LegendItem\n          key={line.id}\n          line={line}\n          color={og.colorIntTohtmlRGB(line.color)}\n          childless={line.childless && singleRow || line.ungrouped}\n          onClick={_.partial(this.props.onItemClick, line.id)}\n          onMouseEnter={_.partial(this.props.onItemEnter, line.id)}\n          onMouseLeave={_.partial(this.props.onItemLeave, line.id)} />\n      );\n    }, this);\n\n    const hasMore = _.some(this.props.lines, {id: '_moreLine'});\n\n    return (\n      <div className=\"report__legend-wrapper\" id=\"legend\">\n        <AnnotationsButton annotationCount={this.props.annotationCount} />\n        <LegendSort selection={this.props.sortBy} onSelect={this.props.onSortChange} />\n        <div className=\"legend__items\">\n          {items}\n          <LegendMoreButton\n            ref=\"moreButton\"\n            hasMore={hasMore}\n            isExpanded={this.props.isExpanded}\n            onShowMore={this.props.onShowMore}\n            onShowLess={this.props.onShowLess} />\n        </div>\n      </div>\n    );\n  },\n\n  handleTableLinkClick() {\n    const duration = 800;\n    const scrollPadding = 56;\n    const tableOffsetTop = $('.js-table-container').offset().top;\n    const reportOffsetTop = $('.js-report-container').offset().top;\n    $('html, body').animate({\n      scrollTop: tableOffsetTop - reportOffsetTop - scrollPadding\n    }, duration);\n  }\n});\n\nexport default Legend;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/legend/index.tsx","import React from 'react';\n\nimport ReportActions from './actions/report_actions';\n\nexport interface IAnnotationsButtonProps {\n  annotationCount: number;\n};\n\nclass AnnotationsButton extends React.Component<IAnnotationsButtonProps, any> {\n  render() {\n    if (!this.props.annotationCount) {\n      return null;\n    }\n\n    const plural = this.props.annotationCount > 1;\n\n    return (\n      <a className=\"legend__item legend__annotations-button  wd-show-annotations\" onClick={ReportActions.openAnnotationsPanel}>\n        <span className=\"icon-annotation-1\"></span>\n        <span className=\"legend__item__text\">\n          <strong>{this.props.annotationCount} Note{plural ? 's' : null}</strong> in this view\n        </span>\n      </a>\n    );\n  }\n};\n\nexport default AnnotationsButton;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/annotations_button.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport _ from 'lodash';\n\nimport strings from '../strings';\n\nimport createReactClass from 'create-react-class';\n\nconst LegendItem = createReactClass<any, any>({\n  propTypes: {\n    line: PropTypes.object.isRequired,\n    color: PropTypes.string,\n    childless: PropTypes.bool,\n    onClick: PropTypes.func,\n    onMouseEnter: PropTypes.func,\n    onMouseLeave: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      onClick: _.noop,\n      onMouseEnter: _.noop,\n      onMouseLeave: _.noop\n    };\n  },\n\n  render() {\n    const itemClasses = classNames({\n      legend__item: true,\n      childless: this.props.childless\n    });\n\n    const name = strings.nodeName(this.props.line);\n    return (\n      <button id={'legend_' + this.props.line.id}\n         className={itemClasses}\n         style={{color: this.props.color}}\n         title={name}\n         aria-label={`Filter visualization by ${name}`}\n         onClick={this.handleClick}\n         onMouseEnter={this.props.onMouseEnter}\n         onMouseLeave={this.props.onMouseLeave}>\n\n        <div className=\"legend__item__decorator\" style={{background: this.props.color}} />\n        <span className=\"legend__item__text\">{name}</span>\n      </button>\n    );\n  },\n\n  handleClick(e) {\n    e.preventDefault();\n\n    // Only emit a click event if this legend item has children.\n    if (!this.props.childless) {\n      this.props.onClick();\n    }\n  }\n});\n\nexport default LegendItem;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/legend/legend_item.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport createReactClass from 'create-react-class';\n\nconst LegendMoreButton = createReactClass<any, any>({\n  propTypes: {\n    hasMore: PropTypes.bool,\n    isExpanded: PropTypes.bool,\n    onShowMore: PropTypes.func,\n    onShowLess: PropTypes.func\n  },\n\n  render() {\n    if (!this.props.hasMore && !this.props.isExpanded) {\n      return null;\n    }\n\n    return (\n      <div className=\"legend__button-wrapper\">\n        {this.props.hasMore ? (\n          <button className=\"ui-button small wd-legend-show-more\" onClick={this.props.onShowMore}>Show More</button>\n        ) : null}\n        {this.props.isExpanded ? (\n          <button className=\"ui-button small wd-legend-show-fewer\" onClick={this.props.onShowLess}>Show Fewer</button>\n        ) : null}\n      </div>\n    );\n  }\n});\n\nexport default LegendMoreButton;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/legend/legend_more_button.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\n\nconst SortItemFactories = {\n  alpha: () => <span className=\"wd-alpha-sort\">A to Z</span>,\n  coa: () => <span className=\"wd-coa-sort\">By Chart of Accounts</span>,\n  desc: () => <span className=\"wd-desc-sort\">Large to Small</span>,\n  asc: () => <span className=\"wd-asc-sort\">Small to Large</span>\n};\n\nconst SortItemOrder = ['alpha', 'coa', 'desc', 'asc'];\n\nimport createReactClass from 'create-react-class';\n\nconst LegendSort = createReactClass<any, any>({\n  propTypes: {\n    selection: PropTypes.string,\n    onSelect: PropTypes.func\n  },\n\n  getDefaultProps() {\n    return {\n      selection: _.head(SortItemOrder),\n      onSelect: _.noop\n    };\n  },\n\n  render() {\n    const {selection} = this.props;\n\n    const items = SortItemOrder.map(function(sortId) {\n      return (\n        <li key={sortId}>\n          <a className={selection === sortId ? 'active' : ''} onClick={this.handleClick.bind(this, sortId)}>{SortItemFactories[sortId]()}</a>\n        </li>\n      );\n    }, this);\n\n    const currentSort = SortItemFactories[selection]();\n\n    return (\n      <div className=\"legend__sort\">\n        <Ovid.Dropdown title={currentSort} toggleClass=\"legend__sort__target wd-legend-toggle\" label=\"Sort\">\n          <header className=\"ui-dropdown__header\">\n            <h4>Sort by</h4>\n          </header>\n          <ul className=\"ui-dropdown__list wd-legend-options\">\n            {items}\n          </ul>\n        </Ovid.Dropdown>\n      </div>\n    );\n  },\n\n  handleClick(sortId) {\n    this.props.onSelect(sortId);\n  }\n});\n\nexport default LegendSort;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/legend/legend_sort.tsx","import $ from 'jquery';\nimport _ from 'lodash';\nimport Backbone from 'backbone';\nimport ReportViewStore from '../stores/report_view_store';\n\nexport default Backbone.Model.extend({\n  downloadUrls: {\n    csv: '/download/csv.csv',\n    table: '/download/table_image.png',\n    graph: '/download/image.png'\n  },\n\n  downloadCsv(data) {\n    this.createAndSubmitForm(this.downloadUrls.csv, data);\n  },\n\n  createAndSubmitForm(downloadUrl, data) {\n    const newForm = this.createForm(downloadUrl, data);\n\n    newForm.appendTo('body').submit().remove();\n  },\n\n  createForm(downloadUrl, data) {\n    const newForm = $('<form>', {\n      action: downloadUrl,\n      method: 'POST'\n    });\n\n    const entity = this.get('entity');\n\n    newForm.append($('<input>', {\n      name: 'entity',\n      value: entity.get('entity_id'),\n      type: 'hidden'\n    }));\n\n    const renderedReport = ReportViewStore.getRenderedReport();\n\n    newForm.append($('<input>', {\n      name: 'report_type',\n      value: renderedReport.get('name'),\n      type: 'hidden'\n    }));\n\n    _.each(data, function(value, key) {\n      newForm.append($('<input>', {\n        name: key,\n        value,\n        type: 'hidden'\n      }));\n    });\n\n    return newForm;\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/download.ts","const measureSpan = document.createElement('measurespan');\nmeasureSpan.style.cssText = 'position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1.2';\n\nexport default function(textStyle, text) {\n  const span = measureSpan;\n  const style = span.style;\n\n  if (textStyle.fontSize) {\n    style.fontSize = textStyle.fontSize;\n  }\n\n  if (textStyle.fontFamily) {\n    style.fontFamily = textStyle.fontFamily;\n  }\n\n  document.body.appendChild(span);\n  span.innerHTML = text.replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1<br>$2');\n  const bounds = span.getBoundingClientRect();\n\n  return [\n    bounds.right - bounds.left,\n    bounds.bottom - bounds.top\n  ];\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/measure_text.ts","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nimport SummaryPieSlider from './summary_pie_slider';\nimport * as graph from './graph';\nimport strings from './strings';\nimport SummaryTooltip from './summary_tooltip';\nimport SeriesTooltip from './series_tooltip';\nimport SinglePointTooltip from './single_point_tooltip';\nimport ReportActions from './actions/report_actions';\nimport SummaryReportStore from './stores/summary_report_store';\nimport * as Immutable from 'immutable';\nimport EventObserver from './utils/event_observer_mixin';\nimport MiniLoader from './mini_loader';\n\nimport createReactClass from 'create-react-class';\n\nconst SummaryGraph = createReactClass<any, any>({\n  mixins: [EventObserver] as any,\n\n  propTypes: {\n    isBalanceSheetReport: PropTypes.bool,\n    loading: PropTypes.bool.isRequired,\n    shouldRenderGraph: PropTypes.bool,\n    xAxisLabels: PropTypes.array,\n    reportEvents: PropTypes.object,\n    budgetData: PropTypes.object,\n    entity: PropTypes.object,\n    athenaState: PropTypes.object,\n    router: PropTypes.object,\n    yAxisScale: PropTypes.object,\n    overlay: PropTypes.object,\n    metricData: PropTypes.object,\n    projections: PropTypes.bool\n  },\n\n  render() {\n    const graphType = this.props.athenaState ? this.props.athenaState.get('graphType') : '';\n    const tip = this.state.singleTooltip;\n    const unit = SummaryReportStore.getReportAmountType();\n\n    const items = typeof(this.props.xAxisLabels) === 'object' ?\n      _.map(this.props.xAxisLabels, (year, index) => {\n        return {key: index.toString(), value: year};\n      })\n      : []; //defaults\n\n    return (\n      <div onMouseLeave={this.handleMouseLeave}>\n        {this.renderDataError()}\n        {!this.props.loading && this.props.graphLoading ?\n          <div className=\"summary_report_ui_loading\">\n            <MiniLoader isError={false} isLoading={true}/>\n          </div>\n        : null\n        }\n\n        <div className=\"graph\" id=\"graph\" ref=\"graph\"/>\n        {graphType === 'pie' ?\n          <SummaryPieSlider\n            ref=\"slider\"\n            items={items}\n            initialSelection={\n              //Would be best to centralise in the flux model\n              typeof(this.props.athenaState.get('selectedDataSetIndex')) === 'string' && typeof(this.props.xAxisLabels) === 'object' ?\n                Math.min(_.size(items) - 1, this.props.athenaState.get('selectedDataSetIndex')).toString()\n                : (_.size(items) - 1) + '' //default\n            }\n            onChange={this.handleDataSetChange} />\n        : null }\n\n        {tip ?\n          <SummaryTooltip left={tip.left} top={tip.top} color={tip.color} key={tip.index}>\n            <SinglePointTooltip {...tip} yAxisScale={this.props.yAxisScale} unit={unit} />\n          </SummaryTooltip>\n          : _.map(this.filterSummaryTooltips(), (tip: any, index) => {\n            return (\n              <SummaryTooltip left={tip.left} top={tip.top} color={tip.color} key={index}>\n                <SeriesTooltip {...tip} yAxisScale={this.props.yAxisScale} unit={unit} />\n              </SummaryTooltip>\n            );\n          })\n        }\n\n      </div>\n    );\n  },\n\n  /**\n   * Returns only the tooltips that have a corresponding\n   * label in the x-axis\n   *\n   * @returns {Array}\n   */\n  filterSummaryTooltips() {\n\n    let tooltips = this.state.tooltips;\n    const hasChart = !!this.graph && !!this.graph.chart;\n    const hasAxis = hasChart && !!this.graph.chart.xAxis && this.graph.chart.xAxis.length > 0;\n    const hasTooltips = !!this.state.tooltips && this.state.tooltips.length > 0;\n\n    if (hasTooltips && hasChart && hasAxis) {\n      tooltips = [];\n      const ticks = this.graph.chart.xAxis[0].tickPositions;\n      this.state.tooltips.forEach((tooltip, index) => {\n        if (ticks.indexOf(index) >= 0) {\n          tooltips.push(tooltip);\n        }\n      });\n    }\n\n    return tooltips;\n\n  },\n\n  getInitialState() {\n    return {};\n  },\n\n  getDefaultProps() {\n    return {\n      minimumHeight: 250\n    };\n  },\n\n  handleDataSetChange(index) {\n    this.props.athenaState.set('selectedDataSetIndex', index);\n  },\n\n  componentDidMount() {\n    $(window).on('resize', this.updateGraphSize);\n    this.updateGraphSize();\n    if (this.props.shouldRenderGraph) {\n      this.renderGraph();\n    }\n  },\n\n  componentWillUnmount() {\n    $(window).off('resize', this.updateGraphSize);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.xAxisTitle !== nextProps.xAxisTitle) {\n      _.defer(() => {\n        this.props.athenaState.trigger('renderData');\n      });\n    }\n  },\n\n  componentDidUpdate(prevProps) {\n    const {\n      overlay,\n      metricData,\n      projections,\n      projectionType,\n      projectionsErrors,\n      shouldRenderGraph,\n      showAnnotations,\n      yAxisScale,\n      athenaState\n    } = this.props;\n\n    const projectionsChanged = projections !== prevProps.projections;\n    const projectionTypeChanged = projectionType !== prevProps.projectionType;\n    const projectionTypeHasNoErrors = !(projectionsErrors && !_.isEmpty(projectionsErrors[projectionType]));\n\n    if (!Immutable.is(overlay, prevProps.overlay) || !Immutable.is(metricData.get('data'), prevProps.metricData.get('data'))) {\n      const overlayData = metricData.get('data');\n      if (this.graph && overlayData.size > 0) {\n        this.graph.removeAllOverlays();\n        this.graph.constructOverlay(overlay, overlayData);\n      }\n    }\n\n    if (this.shouldUpdateGraphSize) {\n      this.shouldUpdateGraphSize = false;\n      this.updateGraphSize();\n    }\n    if (\n      (\n        !this.graph\n        || projectionsChanged\n        || projectionTypeChanged && projectionTypeHasNoErrors\n      )\n      && shouldRenderGraph\n    ) {\n      this.renderGraph();\n    }\n    if (showAnnotations !== prevProps.showAnnotations) {\n      this.graph.addAnnotations();\n    }\n    if (yAxisScale !== prevProps.yAxisScale) {\n      athenaState.selectionChange();\n    }\n  },\n\n  renderGraph() {\n    this.graph = new graph.Graph(\n      this.refs.graph,\n      this.props.reportEvents,\n      this.props.budgetData,\n      this.props.athenaState,\n      this.handleTooltip);\n\n    /**\n    * Please see router.js for who triggers this event\n    */\n    this.listenToProp('athenaState', 'renderData', function(skipGraph) {\n      if (!skipGraph) {\n        this.update(this.props.athenaState, this.props.budgetData);\n      }\n    });\n\n    this.listenToProp('reportEvents', 'highlightNode', this.handleTooltip.bind(this, 'highlightNode'));\n\n    this.update(this.props.athenaState, this.props.budgetData);\n  },\n\n  renderDataError() {\n    if (this.props.loading) {\n      return null;\n    }\n\n    const dataError = SummaryReportStore.getDataError();\n\n    if (dataError === 'DATA_ERROR_NO_MONTHLY_DATA_SETS') {\n      return (\n        <div className=\"graph-nodata__overlay\">\n          <div className=\"graph-nomonthdata\">\n            <h3>This report has a case of missing months</h3>\n            <p>Our <strong>Monthly Reports</strong> require you to select at least one month of data for this report.</p>\n            <p><strong>How to fix this and view your report</strong><br />\n              Under <span className=\"caps\">Report Settings > Report Data</span> select a row that lists the month you'd like to visualize in the month column. Do this for each of the months you want shown in the report.\n            </p>\n          </div>\n        </div>\n      );\n    }\n\n    if (dataError === 'DATA_ERROR_MISSING_BALANCE_SHEET_TREES') {\n      return (\n        <div className=\"graph-nodata__overlay\">\n          <div className=\"graph-nodata\">\n            <h3>No balance sheet data available.</h3>\n          </div>\n        </div>\n      );\n    }\n\n    if (dataError === 'DATA_ERROR_NO_RENDERED_DATA_SETS') {\n      return (\n        <div className=\"graph-nodata__overlay\">\n          <div className=\"graph-nodata\">\n            <h3>Your Fiscal Year selection has no data.</h3>\n            <p>Use the <b>\"Fiscal Year\"</b> menu on the left to change your year selection.</p>\n          </div>\n        </div>\n      );\n    }\n\n    if (!this.hasData()) {\n      return (\n        <div className=\"graph-nodata__overlay\">\n          <div className=\"graph-nodata\">\n            <h3>Your Filter Selection has no data.</h3>\n            <p><b><a onClick={this.handleReset}>Reset</a></b> the selection or use the <b>\"Filtered By\"</b> menu on the left to change your filter selection.</p>\n          </div>\n        </div>\n      );\n    }\n\n    return null;\n  },\n\n  handleTooltip(type, id, index) {\n    if (type === 'highlightNode') {\n      this.setSeriesTooltipState(id);\n    }\n\n    if (type === 'highlightNodeAmount') {\n      this.setSingleTooltipState(id, index);\n    }\n  },\n\n  handleMouseLeave() {\n    this.setState({tooltips: null, singleTooltip: null});\n  },\n\n  setSingleTooltipState(id, index) {\n    const graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n    if (graphType === 'pie') {\n      return;\n    }\n\n    let line = _.find(this.renderedData.lines, {id});\n    const selected = this.props.overlay.getIn(['selected', 0]);\n    if (!line && selected !== id) {\n      return this.setState({singleTooltip: null, tooltips: null});\n    }\n\n    let graphPoints = this.graph.getPointsFromSeries(id);\n    let isOverlay = false;\n\n    if (selected === id) { // Overlay case\n      graphPoints = _.uniqBy(graphPoints, (graphPoint: any) => graphPoint.x);\n      graphPoints = _.sortBy(graphPoints, (graphPoint: any) => graphPoint.x);\n      const amounts = _.map(graphPoints, (point: any) => {\n        return { value: point.y, year: point.year };\n      });\n      line = {\n        amounts,\n        name: this.props.metricData.getIn(['data', selected, 'name']),\n        color: '#000000',\n        units: this.props.metricData.getIn(['data', selected, 'units'])\n      };\n      isOverlay = true;\n    }\n    const graphPoint = graphPoints[index] || {};\n\n    this.setState({singleTooltip: this.tooltipData(line, index, graphPoint, isOverlay), tooltips: null});\n  },\n\n  setSeriesTooltipState(id) {\n    const graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n    if (graphType === 'pie') {\n      return;\n    }\n\n    const line: any = _.find(this.renderedData.lines, {id});\n    if (!line) {\n      return this.setState({tooltips: null, singleTooltip: null});\n    }\n\n    const graphPoints = this.graph.getPointsFromSeries(id);\n\n    this.setState({tooltips: _.map(line.amounts, (data, index) => {\n      const graphPoint = graphPoints[index] || {};\n      return this.tooltipData(line, index, graphPoint, false);\n    }), singleTooltip: null});\n  },\n\n  tooltipData(line, index, graphPoint, isOverlay) {\n    const accountType = this.props.accountType;\n    const data = line.amounts[index];\n    let change;\n    let total;\n    let percentage;\n    let unit = SummaryReportStore.getAmountUnit();\n    let category = graphPoint.category;\n\n    if (index !== 0) {\n      const previousValue = line.amounts[index - 1].value;\n      change = 100 * (data.value - previousValue) / previousValue;\n    }\n\n    const totalData = this.renderedData.totals[index];\n    if (totalData) {\n      if (accountType !== 'types') {\n        total = totalData.amount;\n        percentage = 100 * data.value / total;\n      } else {\n        total = totalData.delta;\n      }\n    }\n\n    let left = this.graph.chart.plotLeft;\n    const top = _.max([this.graph.chart.plotTop + graphPoint.plotY, 0]); //Values cannot be negative\n    left += graphPoint.barX ? graphPoint.barX + graphPoint.pointWidth / 2 : graphPoint.plotX;\n\n    if (isOverlay) {\n      total = null;\n      percentage = null;\n      const interpolation = !_.isUndefined(graphPoint.interpolate) ? ' Interpolated - ' + graphPoint.interpolate : '';\n      category = graphPoint.year + interpolation;\n      unit = line.units;\n    }\n\n    return {\n      index,\n      name: line.name,\n      value: data.value,\n      category,\n      left,\n      top,\n      color: line.htmlColor,\n      aggregateTitle: strings.aggregateRowLabel(accountType, this.props.budgetData.visibleAccounts, this.props.isBalanceSheetReport),\n      change, total, percentage, unit\n    };\n  },\n\n  updateGraphSize() {\n    const $graph = $(this.refs.graph);\n    const graphType = this.props.athenaState && this.props.athenaState.get('graphType');\n\n    const width = $graph.width();\n    const top = $graph.offset().top;\n    const windowHeight = $(window).height();\n    var height = windowHeight - top;\n\n    if (graphType === 'pie' && this.refs.slider) {\n      const $slider = $(ReactDOM.findDOMNode(this.refs.slider));\n      height -= $slider.height() + 28;\n    }\n\n    if (height < this.props.minimumHeight) {\n      height = this.props.minimumHeight;\n    }\n    $graph.height(height);\n\n    if (this.graph) {\n      this.graph.size(width, height);\n    }\n\n    // We need this to occur on the next tick because we're usually already in an action response\n    _.debounce(() => {\n      ReportActions.graphResized(width, height);\n    }, 10);\n  },\n\n  hasData() {\n    return this.renderedData && !_.isEmpty(this.renderedData.lines);\n  },\n\n  update(athenaState, budgetData, reportState) {\n    this.setState({\n      singleTooltip: null,\n      tooltips: null\n    });\n    this.renderedData = SummaryReportStore.getRenderedData(true);\n    this.shouldUpdateGraphSize = true;\n\n    // Mostly allow passing the report state in for testing. :\\\n    const state = reportState || SummaryReportStore.getState();\n\n    const dataSets = SummaryReportStore.getRenderedDataSets();\n    if (!_.isEmpty(dataSets) && this.hasData()) {\n      this.xAxisLabels = [];\n\n      _.each(dataSets, _.bind(function(dataSet) {\n        const label = strings.dataSetLabel(\n          dataSet,\n          athenaState.get('product').technical_name,\n          state.get('currentYearPeriod'),\n          state.get('currentYearAmount'),\n          this.props.entity.get('fiscal_year_start_month'),\n          {\n            proration: state.get('proration')\n          }\n        );\n        this.xAxisLabels.push(label);\n      }, this));\n\n      const graphType = athenaState.get('graphType');\n\n      const xAxisTitle = this.props.xAxisTitle || strings.xAxis({\n        reportType: athenaState.get('product').report_type,\n        currentYearPeriod: state.get('currentYearPeriod'),\n        currentYearAmount: state.get('currentYearAmount'),\n        year: state.get('year'),\n        fiscalYearStartMonth: this.props.entity.get('fiscal_year_start_month'),\n        month: athenaState.get('month')\n      });\n\n      const accountType = state.get('accountType');\n      const product = athenaState.get('product').report_type;\n      const selection = athenaState.get('selection');\n      const yAxisScale = this.props.yAxisScale;\n\n      //Two ways for overlay data to propagate -> update function + dedicated overlay passing function\n      const overlay = this.props.overlay;\n      const metricData = this.props.metricData.get('data'); //Issues with percentage chart having maxAxis be off.....\n\n      this.graph.update(\n        this.renderedData.lines,\n        this.renderedData.totals,\n        graphType,\n        accountType,\n        xAxisTitle,\n        this.xAxisLabels,\n        !(product === 'balance' && accountType === 'types'),\n        selection === this.lastSelection && accountType === this.lastAccountType,\n        yAxisScale,\n        metricData,\n        overlay\n      );\n\n      this.lastAccountType = accountType;\n      this.lastSelection = selection;\n    }\n  },\n\n  handleReset() {\n    this.props.reportEvents.trigger('reset');\n  }\n});\n\nexport default SummaryGraph;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/summary_graph.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport strings from './strings';\n\nimport Amount from './amount';\n\nexport default class SeriesTooltip extends React.Component<any, any> {\n\n  static propTypes = {\n    value: PropTypes.number.isRequired,\n    percentage: PropTypes.number,\n    change: PropTypes.number,\n    aggregateTitle: PropTypes.string,\n    total: PropTypes.number,\n    unit: PropTypes.shape({\n      formatter: PropTypes.func.isRequired,\n      symbol: PropTypes.string\n    })\n  };\n\n  render() {\n    const {\n      value,\n      unit,\n      percentage,\n      change,\n      total,\n      aggregateTitle\n    } = this.props;\n\n    return (\n      <div>\n        <div className=\"graph-tooltip__section\">\n          <h5><Amount value={value} unit={unit} abbreviated /></h5>\n          {_.isFinite(percentage) &&\n            <span ref=\"percentage\" data-test=\"percentage\">{'(' + strings.percentage(percentage) + ')'}</span>}\n        </div>\n        {_.isFinite(change) &&\n          <div className=\"graph-tooltip__section\">\n            <h5>Change</h5>\n            {strings.percentage(change)}\n          </div>}\n        {_.isFinite(total) &&\n          <div className=\"graph-tooltip__section\">\n            <h5>\n              {aggregateTitle.split(' ').map(function(str, index) {\n                return <div key={index}>{str}</div>;\n              })}\n            </h5>\n            <span ref=\"aggregateValue\" data-test=\"aggregate-value\"><Amount value={total} unit={unit} abbreviated /></span>\n          </div>}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/series_tooltip.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport strings from './strings';\n\nimport Amount from './amount';\n\nexport default class SinglePointTooltip extends React.Component<any, any> {\n  static propTypes = {\n    name: PropTypes.string.isRequired,\n    value: PropTypes.number.isRequired,\n    percentage: PropTypes.number,\n    change: PropTypes.number,\n    aggregateTitle: PropTypes.string,\n    total: PropTypes.number,\n    unit: PropTypes.object\n  };\n\n  render() {\n    const {\n      name,\n      category,\n      value,\n      unit,\n      percentage,\n      change,\n      total,\n      aggregateTitle\n    } = this.props;\n\n    return (\n      <div>\n        <h5 className=\"graph-tooltip__section\">{name}</h5>\n        <div className=\"graph-tooltip__section\">\n          <span dangerouslySetInnerHTML={{__html: category}} />\n        </div>\n\n        <div className=\"graph-tooltip__section\">\n          <h5><Amount value={value} unit={unit} /></h5>\n          {_.isFinite(percentage) &&\n            <span ref=\"percentage\" data-test=\"percentage\">{'(' + percentage.toFixed(2) + '%)'}</span>}\n        </div>\n\n        {_.isFinite(change) &&\n          <div className=\"graph-tooltip__section\">\n            <h5>Change</h5>\n            {strings.percentage(change)}\n          </div>}\n\n        {_.isFinite(total) &&\n          <div className=\"graph-tooltip__section\">\n            <h5>{aggregateTitle}</h5>\n            <h5 ref=\"aggregateValue\" data-test=\"aggregate-value\"><Amount value={total} unit={unit} /></h5>\n          </div>}\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/single_point_tooltip.tsx","import React from 'react';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport AutoLinkText from 'react-autolink-text';\nimport { EventObserver } from './utils/event_observer_mixin';\nimport classNames from 'classnames';\n\nimport ReportActions from './actions/report_actions';\nimport strings from './strings';\n\nimport createReactClass from 'create-react-class';\n\nconst AnnotationsPanel = createReactClass<{ maxAnnotationLength?: number, annotations: any[], breakdown: string, fiscalYearStartMonth: string | number, events: any }, any>({\n  mixins: [EventObserver] as any,\n\n  getDefaultProps() {\n    return {\n      maxAnnotationLength: 100,\n      annotations: [],\n      breakdown: null,\n      fiscalYearStartMonth: null,\n      events: null\n    };\n  },\n\n  render() {\n    const annotations = this.props.annotations;\n    const selectedAnnotation = this.state.selectedAnnotation;\n\n    return (\n      <div className={classNames({'annotations-panel': true, 'ui-panel': true, open: true, wide: selectedAnnotation})}>\n        <div className=\"ui-panel__header\">\n          <h3>Notes</h3>\n          <span className=\"ui-panel__close\" onClick={ReportActions.closeAnnotationsPanel}></span>\n        </div>\n        {selectedAnnotation ?\n          <header className=\"ui-panel__sub-header\">\n            <h4>\n              <span className=\"ui-panel__back\" onClick={this.handleBack}>Back to all notes</span>\n            </h4>\n          </header>\n        : null}\n        <div className=\"ui-panel__content ui-container_scroll\" ref=\"scrollContainer\">\n          {selectedAnnotation ?\n            <div className=\"annotation_single\">\n              <header className=\"annotation__header\">\n                <strong className=\"annotation__title icon-annotation-1\">\n                  {this.annotationNodeNames(selectedAnnotation)}\n                </strong>\n                <small className=\"annotation__subtitle\">\n                  {strings.fiscalYear(selectedAnnotation.dataSet.year, this.props.fiscalYearStartMonth)} {selectedAnnotation.dataSet.description}\n                </small>\n              </header>\n              <div className=\"annotation__content\">\n                <AutoLinkText text={selectedAnnotation.text} />\n              </div>\n            </div>\n          : annotations.map((annotation) => {\n            const readMore = annotation.text.length > this.props.maxAnnotationLength;\n            const dataSetYear = strings.fiscalYear(annotation.dataSet.year, this.props.fiscalYearStartMonth);\n            const onClick = readMore ? ()=>{this.handleReadMore(annotation);} : null;\n\n            const node = annotation.primaryNode;\n\n            if (!node) { return null; }\n\n            const secondaryNodes = annotation.secondaryNodes;\n            const classes = {annotation: true};\n            classes['annotation-' + annotation.id] = true;\n            classes['annotation-node-' + node.id] = true;\n            classes['is-truncated'] = readMore;\n\n            return (\n              <div\n                className={classNames(classes)}\n                key={annotation.id} onClick={onClick}\n                onMouseEnter={()=>{this.handleMouseEnter(annotation.id);}}\n                onMouseLeave={()=>{this.handleMouseLeave(annotation.id);}}>\n\n                <header className=\"annotation__header\">\n                  <strong className=\"annotation__title icon-annotation-1\">{node.name}</strong>\n                  <small className=\"annotation__subtitle\">\n                    {secondaryNodes.map((node) => {\n                      return <div>{node.name}</div>;\n                    })}\n                    {dataSetYear} {annotation.dataSet.description}\n                  </small>\n                </header>\n                <div className=\"annotation__content\">\n                  <AutoLinkText ref=\"annotationText\" data-test=\"annotation-text\" text={annotation.text} maxLength={this.props.maxAnnotationLength} />\n                  {readMore ?\n                    <span>\n                      <span>&#8230;</span>\n                      <a className=\"annotation__read-more\">Read More</a>\n                    </span>\n                  : null}\n                </div>\n              </div>);\n          })}\n        </div>\n      </div>\n    );\n  },\n\n  scrollToNode(id) {\n    const $node = $('.annotation-node-' + id);\n    const $scroll = $(this.refs.scrollContainer);\n    $scroll.scrollTop($node[0].offsetTop);\n  },\n\n  annotationNodeNames(annotation) {\n    return _.map(annotation.nodes, 'name').join(', ');\n  },\n\n  handleMouseLeave(id) {\n    $('.annotation-' + id).removeClass('hover');\n  },\n\n  handleMouseEnter(id) {\n    $('.annotation-' + id).addClass('hover');\n  },\n\n  handleReadMore(annotation) {\n    this.setState({selectedAnnotation: annotation});\n  },\n\n  handleBack() {\n    this.setState({selectedAnnotation: null});\n  },\n\n  componentDidMount() {\n    this.props.events.on('scrollToAnnotationNode', this.scrollToNode);\n  },\n\n  componentWillUnmount() {\n    this.props.events.off('scrollToAnnotationNode', this.scrollToNode);\n  },\n\n  getInitialState() {\n    return {\n      selectedAnnotation: null\n    };\n  }\n});\n\nexport default AnnotationsPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/annotations_panel.tsx","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactPureRenderFunction = require('react-pure-render/function');\n\nvar _reactPureRenderFunction2 = _interopRequireDefault(_reactPureRenderFunction);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _match_parser = require('./match_parser');\n\nvar _match_parser2 = _interopRequireDefault(_match_parser);\n\nvar AutoLinkText = (function (_React$Component) {\n  _inherits(AutoLinkText, _React$Component);\n\n  function AutoLinkText() {\n    _classCallCheck(this, AutoLinkText);\n\n    _get(Object.getPrototypeOf(AutoLinkText.prototype), 'constructor', this).apply(this, arguments);\n\n    this.shouldComponentUpdate = _reactPureRenderFunction2['default'];\n  }\n\n  _createClass(AutoLinkText, [{\n    key: 'render',\n    value: function render() {\n      var _context;\n\n      var text = this.props.text || '';\n      return _react2['default'].createElement(\n        'span',\n        null,\n        (_context = (_context = (_context = (0, _match_parser2['default'])(text), prepareElements).call(_context, text), truncate).call(_context, this.props.maxLength), keyElements).call(_context)\n      );\n    }\n  }]);\n\n  return AutoLinkText;\n})(_react2['default'].Component);\n\nexports['default'] = AutoLinkText;\n\nfunction prepareElements(text) {\n  var elements = [];\n  var lastIndex = 0;\n\n  this.forEach(function (match) {\n    if (match.position.start !== 0) {\n      elements.push(_react2['default'].createElement(\n        'span',\n        null,\n        text.slice(lastIndex, match.position.start)\n      ));\n    }\n    elements.push(_react2['default'].createElement(\n      'a',\n      { href: match.getAnchorHref() },\n      match.getAnchorText()\n    ));\n    lastIndex = match.position.end;\n  });\n\n  if (lastIndex < text.length) {\n    elements.push(_react2['default'].createElement(\n      'span',\n      null,\n      text.slice(lastIndex)\n    ));\n  }\n\n  return elements;\n}\n\nfunction truncate(maxLength) {\n  if (!maxLength) return this;\n\n  var elements = [];\n  var length = 0;\n\n  this.some(function (el) {\n    length += el.props.children.length;\n\n    if (length > maxLength) {\n      var truncatedText = el.props.children.slice(0, -(length - maxLength));\n      elements.push(_react2['default'].cloneElement(el, {}, truncatedText));\n      return true; // stop iterating through the elements\n    }\n\n    elements.push(el);\n  });\n\n  return elements;\n}\n\n/*\n * Generate unique keys for each of the elements.\n * The key will be based on the index of the element.\n */\nfunction keyElements() {\n  return this.map(function (el, index) {\n    return _react2['default'].cloneElement(el, { key: index });\n  });\n}\n\nAutoLinkText.propTypes = {\n  text: _propTypes2['default'].string,\n  maxLength: _propTypes2['default'].oneOfType([_propTypes2['default'].number, _propTypes2['default'].string])\n};\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-autolink-text/lib/index.js\n// module id = 1505\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _match_validator = require('./match_validator');\n\nvar _url_match = require('./url_match');\n\nvar _url_match2 = _interopRequireDefault(_url_match);\n\n// match protocol, allow in format \"http://\" or \"mailto:\". However, do not match\n// the first part of something like 'link:http://www.google.com' (i.e. don't match \"link:\").\n// Also, make sure we don't interpret 'google.com:8000' as if 'google.com' was a\n// protocol here (i.e. ignore a trailing port number in this regex)\nvar protocolRegex = /(?:[A-Za-z][-.+A-Za-z0-9]+:(?![A-Za-z][-.+A-Za-z0-9]+:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/;\n\n// starting with 'www.'\nvar wwwRegex = /(?:www\\.)/;\n\n// anything looking at all like a domain, non-unicode domains, not ending in a period\nvar domainNameRegex = /[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/;\n\n// match our known top level domains (TLDs)\nvar tldRegex = /\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/;\n\n// Allow optional path, query string, and hash anchor, not ending in the following characters: \"?!:,.;\"\n// http://blog.codinghorror.com/the-problem-with-urls/\nvar urlSuffixRegex = /[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]?!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]]/;\n\nvar charBeforeProtocolRelMatchRegex = /^(.)?\\/\\//;\n\nvar urlRegex = ['(?:', // parens to cover match for protocol (optional), and domain\n'(', // *** Capturing group $1, for a protocol-prefixed url (ex: http://google.com)\nprotocolRegex.source, domainNameRegex.source, ')', '|', '(?:', // non-capturing paren for a 'www.' prefixed url (ex: www.google.com)\n'(.?//)?', // *** Capturing group $2 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\nwwwRegex.source, domainNameRegex.source, ')', '|', '(?:', // non-capturing paren for known a TLD url (ex: google.com)\n'(.?//)?', // *** Capturing group $3 for an optional protocol-relative URL. Must be at the beginning of the string or start with a non-word character\ndomainNameRegex.source, tldRegex.source, ')', ')', '(?:' + urlSuffixRegex.source + ')?']. // match for path, query string, and/or hash anchor - optional\njoin('');\n\nexports['default'] = function () {\n  var text = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n  var regex = new RegExp(urlRegex, 'gi');\n  var matches = [];\n\n  var match;\n  while ((match = regex.exec(text)) !== null) {\n    var _match = match;\n\n    var _match2 = _slicedToArray(_match, 4);\n\n    var matchedText = _match2[0];\n    var protocolUrlMatch = _match2[1];\n    var wwwProtocolRelativeMatch = _match2[2];\n    var tldProtocolRelativeMatch = _match2[3];\n\n    var protocolRelativeMatch = wwwProtocolRelativeMatch || tldProtocolRelativeMatch;\n\n    // If it's a protocol-relative '//' match, remove the character\n    // before the '//' (which the matcherRegex needed to match due to\n    // the lack of a negative look-behind in JavaScript regular\n    // expressions)\n    if (protocolRelativeMatch) {\n      var charBeforeMatch = protocolRelativeMatch.match(charBeforeProtocolRelMatchRegex)[1] || '';\n\n      // fix up the `matchStr` if there was a preceding char before a protocol-relative match, which was needed to determine the match itself (since there are no look-behinds in JS regexes)\n      if (charBeforeMatch) {\n        matchedText = matchedText.slice(1); // remove the prefixed char from the match\n        match.index++;\n      }\n    }\n\n    if ((0, _match_validator.isValidMatch)(matchedText, protocolUrlMatch, protocolRelativeMatch)) {\n      var position = { start: match.index, end: regex.lastIndex };\n      matches.push(new _url_match2['default'](matchedText, protocolUrlMatch, protocolRelativeMatch, position));\n    }\n  }\n\n  return matches;\n};\n\n;\nmodule.exports = exports['default'];\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-autolink-text/lib/match_parser.js\n// module id = 1506\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\nexports.isValidMatch = isValidMatch;\nvar uriSchemeRegex = /^[A-Za-z][-.+A-Za-z0-9]+:/;\nvar hasFullProtocolRegex = /^[A-Za-z][-.+A-Za-z0-9]+:\\/\\//;\nvar hasWordCharAfterProtocolRegex = /:[^\\s]*?[A-Za-z]/;\nvar invalidProtocolRelMatchRegex = /^[\\w]\\/\\//;\n\n/**\n * Determines if a given match found by the match parser is valid.\n * Will return `false` for:\n *\n * 1) URL matches which do not have at least have one period ('.') in the\n *    domain name (effectively skipping over matches like \"abc:def\").\n *    However, URL matches with a protocol will be allowed (ex: 'http://localhost')\n * 2) URL matches which do not have at least one word character in the\n *    domain name (effectively skipping over matches like \"git:1.0\").\n * 3) A protocol-relative url match (a URL beginning with '//') whose\n *    previous character is a word character (effectively skipping over\n *    strings like \"abc//google.com\")\n *\n * Otherwise, returns `true`.\n *\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to match something like\n *   'http://localhost', where we won't double check that the domain name\n *   has at least one '.' in it.\n * @param {String} protocolRelativeMatch The protocol-relative string for a\n *   URL match (i.e. '//'), possibly with a preceding character (ex, a\n *   space, such as: ' //', or a letter, such as: 'a//'). The match is\n *   invalid if there is a word character preceding the '//'.\n * @return {Boolean} `true` if the match given is valid and should be\n *   processed, or `false` if the match is invalid and/or should just not be\n *   processed.\n */\n\nfunction isValidMatch(urlMatch, protocolUrlMatch, protocolRelativeMatch) {\n  if (protocolUrlMatch && !isValidUriScheme(protocolUrlMatch) || urlMatchDoesNotHaveProtocolOrDot(urlMatch, protocolUrlMatch) || // At least one period ('.') must exist in the URL match for us to consider it an actual URL, *unless* it was a full protocol match (like 'http://localhost')\n  urlMatchDoesNotHaveAtLeastOneWordChar(urlMatch, protocolUrlMatch) || // At least one letter character must exist in the domain name after a protocol match. Ex: skip over something like \"git:1.0\"\n  isInvalidProtocolRelativeMatch(protocolRelativeMatch) // A protocol-relative match which has a word character in front of it (so we can skip something like \"abc//google.com\")\n  ) {\n      return false;\n    }\n\n  return true;\n}\n\n/**\n * Determines if the URI scheme is a valid scheme to be autolinked. Returns\n * `false` if the scheme is 'javascript:' or 'vbscript:'\n *\n * @private\n * @param {String} uriSchemeMatch The match URL string for a full URI scheme\n *   match. Ex: 'http://yahoo.com' or 'mailto:a@a.com'.\n * @return {Boolean} `true` if the scheme is a valid one, `false` otherwise.\n */\nfunction isValidUriScheme(uriSchemeMatch) {\n  var uriScheme = uriSchemeMatch.match(uriSchemeRegex)[0].toLowerCase();\n\n  return uriScheme !== 'javascript:' && uriScheme !== 'vbscript:';\n}\n\n/**\n * Determines if a URL match does not have either:\n *\n * a) a full protocol (i.e. 'http://'), or\n * b) at least one dot ('.') in the domain name (for a non-full-protocol\n *    match).\n *\n * Either situation is considered an invalid URL (ex: 'git:d' does not have\n * either the '://' part, or at least one dot in the domain name. If the\n * match was 'git:abc.com', we would consider this valid.)\n *\n * @private\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to match something like\n *   'http://localhost', where we won't double check that the domain name\n *   has at least one '.' in it.\n * @return {Boolean} `true` if the URL match does not have a full protocol,\n *   or at least one dot ('.') in a non-full-protocol match.\n */\nfunction urlMatchDoesNotHaveProtocolOrDot(urlMatch, protocolUrlMatch) {\n  return !!urlMatch && (!protocolUrlMatch || !hasFullProtocolRegex.test(protocolUrlMatch)) && urlMatch.indexOf('.') === -1;\n}\n\n/**\n * Determines if a URL match does not have at least one word character after\n * the protocol (i.e. in the domain name).\n *\n * At least one letter character must exist in the domain name after a\n * protocol match. Ex: skip over something like \"git:1.0\"\n *\n * @private\n * @param {String} urlMatch The matched URL, if there was one. Will be an\n *   empty string if the match is not a URL match.\n * @param {String} protocolUrlMatch The match URL string for a protocol\n *   match. Ex: 'http://yahoo.com'. This is used to know whether or not we\n *   have a protocol in the URL string, in order to check for a word\n *   character after the protocol separator (':').\n * @return {Boolean} `true` if the URL match does not have at least one word\n *   character in it after the protocol, `false` otherwise.\n */\nfunction urlMatchDoesNotHaveAtLeastOneWordChar(urlMatch, protocolUrlMatch) {\n  if (urlMatch && protocolUrlMatch) {\n    return !hasWordCharAfterProtocolRegex.test(urlMatch);\n  } else {\n    return false;\n  }\n}\n\n/**\n * Determines if a protocol-relative match is an invalid one. This method\n * returns `true` if there is a `protocolRelativeMatch`, and that match\n * contains a word character before the '//' (i.e. it must contain\n * whitespace or nothing before the '//' in order to be considered valid).\n *\n * @private\n * @param {String} protocolRelativeMatch The protocol-relative string for a\n *   URL match (i.e. '//'), possibly with a preceding character (ex, a\n *   space, such as: ' //', or a letter, such as: 'a//'). The match is\n *   invalid if there is a word character preceding the '//'.\n * @return {Boolean} `true` if it is an invalid protocol-relative match,\n *   `false` otherwise.\n */\nfunction isInvalidProtocolRelativeMatch(protocolRelativeMatch) {\n  return !!protocolRelativeMatch && invalidProtocolRelMatchRegex.test(protocolRelativeMatch);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-autolink-text/lib/match_validator.js\n// module id = 1507\n// module chunks = 0 1","/**\n * @class Autolinker.match.Url\n *\n * Represents a Url match found in an input string which should be Autolinked.\n */\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar URLMatch = (function () {\n  function URLMatch(url, protocolUrlMatch, protocolRelativeMatch, position) {\n    _classCallCheck(this, URLMatch);\n\n    this.urlPrefixRegex = /^(https?:\\/\\/)?(www\\.)?/i;\n    this.protocolRelativeRegex = /^\\/\\//;\n    this.protocolPrepended = false;\n    this.stripPrefix = true;\n\n    this._url = url;\n    this._protocolUrlMatch = protocolUrlMatch;\n    this._protocolRelativeMatch = protocolRelativeMatch;\n    this.position = position;\n  }\n\n  /**\n   * A regular expression used to remove the 'http://' or 'https://' and/or the 'www.' from URLs.\n   */\n\n  _createClass(URLMatch, [{\n    key: 'getUrl',\n\n    /**\n     * Returns the url that was matched, assuming the protocol to be 'http://' if the original\n     * match was missing a protocol.\n     *\n     * @return {String}\n     */\n    value: function getUrl() {\n      var url = this._url;\n\n      // if the url string doesn't begin with a protocol, assume 'http://'\n      if (!this._protocolRelativeMatch && !this._protocolUrlMatch && !this.protocolPrepended) {\n        url = this._url = 'http://' + url;\n\n        this.protocolPrepended = true;\n      }\n\n      return url;\n    }\n\n    /**\n     * Returns the anchor href that should be generated for the match.\n     *\n     * @return {String}\n     */\n  }, {\n    key: 'getAnchorHref',\n    value: function getAnchorHref() {\n      var url = this.getUrl();\n\n      return url.replace(/&amp;/g, '&'); // any &amp;'s in the URL should be converted back to '&' if they were displayed as &amp; in the source html\n    }\n\n    /**\n     * Returns the anchor text that should be generated for the match.\n     *\n     * @return {String}\n     */\n  }, {\n    key: 'getAnchorText',\n    value: function getAnchorText() {\n      var anchorText = this.getUrl();\n\n      if (this._protocolRelativeMatch) {\n        // Strip off any protocol-relative '//' from the anchor text\n        anchorText = this.stripProtocolRelativePrefix(anchorText);\n      }\n      if (this.stripPrefix) {\n        anchorText = this.stripUrlPrefix(anchorText);\n      }\n      anchorText = this.removeTrailingSlash(anchorText); // remove trailing slash, if there is one\n\n      return anchorText;\n    }\n\n    // ---------------------------------------\n\n    // Utility Functionality\n\n    /**\n     * Strips the URL prefix (such as \"http://\" or \"https://\") from the given text.\n     *\n     * @private\n     * @param {String} text The text of the anchor that is being generated, for which to strip off the\n     *   url prefix (such as stripping off \"http://\")\n     * @return {String} The `anchorText`, with the prefix stripped.\n     */\n  }, {\n    key: 'stripUrlPrefix',\n    value: function stripUrlPrefix(text) {\n      return text.replace(this.urlPrefixRegex, '');\n    }\n\n    /**\n     * Strips any protocol-relative '//' from the anchor text.\n     *\n     * @private\n     * @param {String} text The text of the anchor that is being generated, for which to strip off the\n     *   protocol-relative prefix (such as stripping off \"//\")\n     * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\n     */\n  }, {\n    key: 'stripProtocolRelativePrefix',\n    value: function stripProtocolRelativePrefix(text) {\n      return text.replace(this.protocolRelativeRegex, '');\n    }\n\n    /**\n     * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\n     *\n     * @private\n     * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\n     *   slash ('/') that may exist.\n     * @return {String} The `anchorText`, with the trailing slash removed.\n     */\n  }, {\n    key: 'removeTrailingSlash',\n    value: function removeTrailingSlash(anchorText) {\n      if (anchorText.charAt(anchorText.length - 1) === '/') {\n        anchorText = anchorText.slice(0, -1);\n      }\n      return anchorText;\n    }\n  }]);\n\n  return URLMatch;\n})();\n\nexports['default'] = URLMatch;\nmodule.exports = exports['default'];\n\n/**\n * The regular expression used to remove the protocol-relative '//' from the {@link #url} string, for purposes\n * of {@link #getAnchorText}. A protocol-relative URL is, for example, \"//yahoo.com\"\n */\n\n/**\n * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\n * {@link #url} did not have a protocol)\n */\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-autolink-text/lib/url_match.js\n// module id = 1508\n// module chunks = 0 1","import React from 'react';\nimport _ from 'lodash';\nimport {DropdownList, DropdownListItem} from '@opengov/ovid';\n\nimport SummaryReportActions from './actions/summary_report_actions';\nimport BreakdownSwitcher from './breakdown_switcher';\nimport FilterMenuToggles from './filter_menu_toggles';\nimport TimePeriod from './time_period';\nimport strings from './strings';\nimport fiscalYearDropdown from './fiscal_year_dropdown';\n\nexport default class SummaryReportFiltersPanel extends React.Component<any, any> {\n  render() {\n    const {\n      accountType,\n      breakdowns,\n      breakdown,\n      year,\n      years,\n      versusView\n    } = this.props;\n    const fiscalYearStartMonth = this.props.entity.get('fiscal_year_start_month');\n    const action = SummaryReportActions.setYear;\n    const fiscal_year_dropdown = fiscalYearDropdown(year, years, action, strings, fiscalYearStartMonth);\n    return (\n      <div>\n        <div className=\"ui-mainpanel__section\">\n          <AccountTypesDropdown {...this.props} />\n          <BreakdownSwitcher\n            accountType={accountType}\n            breakdowns={breakdowns}\n            breakdown={breakdown}\n            versusView={versusView}\n          />\n\n          {this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'years' ?\n            <div className=\"ui-mainpanel__section\">\n              <div className=\"ui-mainpanel__section-header\">Fiscal year through</div>\n              <DropdownList value={this.props.month} onChange={SummaryReportActions.setMonth}>\n                {this.props.months.map((month) => {\n                  return <DropdownListItem key={month} value={month} title={strings.month(month)} />;\n                })}\n              </DropdownList>\n            </div> : null}\n          {this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'months' ?\n            fiscal_year_dropdown : null}\n        </div>\n\n        <FilterMenuToggles\n          accountType={this.props.accountType}\n          reportType={this.props.reportType}\n          filterPanels={this.props.filterPanels}\n          breakdown={this.props.breakdown}\n          visibleAccounts={this.props.accountTypes}/>\n\n        {this.props.athena && !(this.props.reportType === 'ytd' && this.props.currentYearPeriod === 'months') ?\n          <TimePeriod\n            minYear={this.props.minYear}\n            maxYear={this.props.maxYear}\n            fiscalYearRange={this.props.fiscalYearRange}\n            budgetData={this.props.athena.budgetData} /> : null}\n      </div>\n    );\n  }\n}\n\nclass AccountTypesDropdown extends React.Component<any, any> {\n  _onSelectAccountType(value) {\n    if (this.props.versusViews.find((view) => view.get('id') === value)) {\n      SummaryReportActions.setVersusView(value);\n\n    } else {\n      SummaryReportActions.setAccountType(value);\n    }\n  }\n\n  render() {\n    const selectedValue = this.props.versusView ? this.props.versusView.get('id') : this.props.accountType;\n    return (\n      <div className=\"ui-mainpanel__section account_types\" title=\"Select which measure is shown in your report\">\n        <div className=\"ui-mainpanel__section-header\">Show</div>\n        <DropdownList value={selectedValue} onChange={(value) => this._onSelectAccountType(value)}>\n          {_.map(this.props.accountTypes, (accountType: { id, name }) => {\n            return <DropdownListItem key={accountType.id} value={accountType.id} title={accountType.name} />;\n          })}\n          {this.props.versusViews.map((view) => {\n            return <DropdownListItem key={view.get('id')} value={view.get('id')} title={view.get('name')} />;\n          })}\n        </DropdownList>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/summary_report_filters_panel.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport SummaryReportActions from './actions/summary_report_actions';\nimport {DropdownList, DropdownListItem} from '@opengov/ovid';\nimport strings from './strings';\n\ninterface IBreakdownSwitcher {\n  breakdowns: any[];\n  breakdown: string;\n  accountType: string;\n  versusView?: { get(s: string): string };\n}\n\nexport default class BreakdownSwitcher extends React.Component<IBreakdownSwitcher, any> {\n  render() {\n    const disabled = !!this.props.versusView;\n    const accountType = disabled ? this.props.versusView.get('name') : null;\n\n    return (\n      <div className=\"ui-mainpanel__section\" title={`Select how the data is broken down. For\n        example, breaking down by department will force the graph to show names of\n        departments or children of departments.`}>\n\n        <div className=\"ui-mainpanel__section-header\">Broken down by</div>\n\n        <DropdownList value={this.props.breakdown}\n                      disabled={disabled}\n                      onChange={SummaryReportActions.setBreakdown}>\n\n          {_.map(this.props.breakdowns, (breakdown) => {\n            const name = strings.breakdownName(breakdown, this.props.accountType);\n            return (\n              <DropdownListItem key={breakdown.get('id')}\n                value={breakdown.get('id')}\n                title={accountType || name} />\n            );\n          })}\n        </DropdownList>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/breakdown_switcher.tsx","import React from 'react';\nimport classnames from 'classnames';\n\nimport SummaryReportActions from './actions/summary_report_actions';\nimport strings from './strings';\n\ninterface IFilterMenuTogglesProps {\n  filterPanels: any;\n  accountTypes?: any[];\n  breakdown: string;\n  reportType: string;\n  accountType: string;\n  visibleAccounts: any;\n};\n\n\nexport default class FilterMenuToggles extends React.Component<IFilterMenuTogglesProps, any> {\n  render() {\n    const { filterPanels } = this.props;\n\n    return (\n      <div className=\"ui-mainpanel__section\" id=\"wd-section-filter\">\n\n        <div className=\"ui-mainpanel__section-header\">\n          Filtered By\n          <button className=\"ui-mainpanel__section-expand-all\"\n               id=\"wd-filter-button-all\"\n               onClick={SummaryReportActions.toggleAllFilterPanels}>\n            All\n\n            <span className=\"icon-righthead-2\"></span>\n          </button>\n        </div>\n\n        <div className=\"ui-button-stack\">\n          {!!filterPanels.size && filterPanels.filter((breakdown) => breakdown.get('visible')).map((breakdown) => {\n            const isBreakdown = this.props.breakdown === breakdown.get('id');\n            const isActive = breakdown.get('isOpen');\n\n            return (\n              <button className={classnames('filter-toggle', 'ui-button', 'small', {active_breakdown: isBreakdown, active: isActive})}\n                   key={breakdown.get('id')}\n                   onClick={() => SummaryReportActions.toggleFilterPanel(breakdown.get('id'))}>\n                <span className=\"filter-toggle__text\">\n                  {strings.breakdownName(breakdown, this.props.accountType, this.props.visibleAccounts, this.props.reportType)}\n                </span>\n                <div className=\"filter-toggle__actions\">\n                  <span className=\"ui-panel-toggle__close\"></span>\n                  <span className=\"ui-panel-toggle__open\"></span>\n                </div>\n              </button>\n            );\n          })}\n        </div>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_menu_toggles.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\n\nimport SummaryReportActions from './actions/summary_report_actions';\nimport Toggle from './utils/toggle_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst TimePeriod = createReactClass<any, any>({\n  mixins: [Toggle] as any,\n\n  propTypes: {\n    budgetData: PropTypes.object,\n\n    // Only show time period selector if report has this number of data sets or more.\n    minDataSetCount: PropTypes.number\n  },\n\n  getDefaultProps() {\n    return {\n      ignoreContentClicks: true,\n      minDataSetCount: 3\n    };\n  },\n\n  getInitialState() {\n    return {\n      selectedHandle: null\n    };\n  },\n\n  render() {\n    if (!this.props.budgetData ||\n        this.props.budgetData.dataSets.length < this.props.minDataSetCount) {\n      return null;\n    }\n\n    const handleClasses = {};\n    if (this.state.open) {\n      handleClasses[this.state.selectedHandle] = {'is-picked': true};\n    }\n\n    if (this.props.minYear === this.props.maxYear) {\n      // Hide time slider if only 1 year of data sets exists in the report.\n      return null;\n    }\n\n    return (\n      <div className=\"ui-mainpanel__section\">\n        <div className=\"ui-mainpanel__section-header\">Fiscal Year</div>\n        <div className=\"time-period\">\n          <Ovid.Slider\n            ref=\"slider\"\n            min={this.props.minYear}\n            max={this.props.maxYear}\n            value={this.props.fiscalYearRange.toArray()}\n            handleClasses={handleClasses}\n            onChange={_.throttle(this.handleChange, 250)}\n            onSliderClick={this.handleSliderClick} />\n\n          {this.renderPicker()}\n        </div>\n      </div>\n    );\n  },\n\n  renderPicker() {\n    if (!this.state.open) {\n      return null;\n    }\n\n    const handle = this.state.selectedHandle;\n\n    const selectedYear = this.props.fiscalYearRange.get(handle);\n\n    let pickerMinYear;\n    let pickerMaxYear;\n    if (handle === 0) {\n      pickerMinYear = this.props.minYear;\n      pickerMaxYear = this.props.fiscalYearRange.get(1);\n\n    } else {\n      pickerMinYear = this.props.fiscalYearRange.get(0);\n      pickerMaxYear = this.props.maxYear;\n    }\n\n    return (\n      <div className=\"time-period__datepicker ui-dropdown__target\" onClick={this.handlePickerClick}>\n        <header className=\"ui-dropdown__header\">\n          <h4>Choose {handle === 0 ? 'a start' : 'an end'} date:</h4>\n        </header>\n        <Ovid.Calendar\n          date={new Date(selectedYear, 0)}\n          minSelectionMode=\"years\"\n          minYear={new Date(pickerMinYear, 0)}\n          maxYear={new Date(pickerMaxYear, 0)}\n          selectionRange={{min: this.props.minYear, max: this.props.maxYear}}\n          onDateSelected={this.handlePickerSelect} />\n      </div>\n    );\n  },\n\n  handleChange(value) {\n    SummaryReportActions.setFiscalYearRange(value);\n    SummaryReportActions.getAggregations();\n  },\n\n  handleSliderClick(index) {\n    this.setState({\n      selectedHandle: index\n    });\n\n    if (!this.state.open) {\n      this.toggle(true);\n    }\n\n    if (this.state.selectedHandle !== index) {\n      this.ignoreClick = true;\n    }\n  },\n\n  handlePickerClick() {\n    this.ignoreClick = true;\n  },\n\n  handlePickerSelect(selection) {\n    const nextYear = selection.year();\n    const selectedHandle = this.state.selectedHandle;\n    const prevYear = this.props.fiscalYearRange.get(selectedHandle);\n    if (nextYear === prevYear) {\n      return;\n    }\n\n    this.handleChange(this.props.fiscalYearRange.set(selectedHandle, nextYear).toArray());\n    this.toggle();\n  }\n});\n\nexport default TimePeriod;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/time_period.tsx","import _ from 'lodash';\n\nexport default {\n  getInitialState() {\n    return {\n      open: false\n    };\n  },\n\n  componentDidMount() {\n    document.addEventListener('click', this.handleDocumentClick);\n  },\n\n  componentWillUnmount() {\n    document.removeEventListener('click', this.handleDocumentClick);\n  },\n\n  handleToggleClick() {\n    if (this.props.disabled) {\n      return;\n    }\n\n    if (!this.ignoreToggle) {\n      this.toggle();\n    }\n    this.ignoreClick = true;\n    this.ignoreToggle = false;\n  },\n\n  handleContentClick() {\n    if (this.props.ignoreContentClicks) {\n      this.ignoreToggle = true;\n    }\n  },\n\n  handleDocumentClick() {\n    const self = this;\n\n    // Allow the handleClick handler a chance to run first\n    // before checking if we should toggle the menu closed.\n    // It isn't defined what order the click handlers will run.\n    _.defer(function() {\n      if (!self.ignoreClick && self.state.open) {\n        self.toggle();\n      }\n      self.ignoreClick = !self.ignoreClick;\n    });\n  },\n\n  // When calling this from a click event listener be sure to\n  // pass true for ignoreClick otherwise the menu will never open.\n  toggle(ignoreClick) {\n    const opening = !this.state.open;\n    this.setState({ open: opening });\n\n    const onToggle = this.onToggle;\n    if (onToggle) {\n      onToggle(opening);\n    }\n\n    this.ignoreClick = ignoreClick;\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/toggle_mixin.ts","import React from 'react';\nimport _ from 'lodash';\nimport {DropdownList, DropdownListItem} from '@opengov/ovid';\n\nexport default function fiscalYearDropdown(year, years, action, strings, fiscalYearStartMonth) {\n  return (\n    <div className=\"ui-mainpanel__section\">\n    <div className=\"ui-mainpanel__section-header\">For Fiscal Year</div>\n    <DropdownList value={year || _.head(years)} onChange={action}>\n      {_.map(years, (yr) => {\n        return (\n          <DropdownListItem key={yr} value={yr} title={strings.fiscalYear(yr, fiscalYearStartMonth)} />\n        );\n      })}\n    </DropdownList>\n    </div> );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/fiscal_year_dropdown.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport createReactClass from 'create-react-class';\n\nconst GlobalAlert = createReactClass<any, any>({\n  propTypes: {\n    title: PropTypes.string,\n    message: PropTypes.node,\n    buttons: PropTypes.arrayOf(PropTypes.element)\n  },\n  render() {\n    return (\n      <div className=\"ui-alert retry-alert open\">\n        <p>\n          {this.props.title ?\n            <strong className=\"retry-alert-title\">{this.props.title}</strong> : null }\n          {this.props.message ?\n            this.props.message : null }\n        </p>\n        {this.props.buttons ?\n          (<div className=\"ui-alert__actions\">\n            {this.props.buttons}\n          </div>) : null }\n      </div>\n    );\n  }\n});\n\nexport default GlobalAlert;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/global_alert.tsx","import React from 'react';\nimport { assetPath } from '../asset_helpers';\nimport ReportActions from '../actions/report_actions';\n\nexport interface IHowToModalProps {\n}\n\nconst HowToModal: React.SFC<IHowToModalProps> = () => {\n  return (\n    <div className=\"ui-modal__wrapper open\" id=\"overlay-modal_howto\">\n      <div className=\"ui-modal wide\">\n        <header className=\"ui-modal__header\">\n          <h3>How To</h3>\n          <span className=\"ui-modal__close\" onClick={ReportActions.hideHowTo}></span>\n        </header>\n        <div className=\"ui-modal__content\">\n          <article className=\"howto-content\">\n            <img src={assetPath('images/howto/1.png')} className=\"howto-content__graphic\" />\n            <p className=\"howto-content__graphic-desc\">\n              OpenGov allows you to explore budget and historical finances in a simple graphical user interface. The main view, depicted here, includes a graph, legend, and various controls to view expenses by departments out of all funds.\n            </p>\n\n            <img src={assetPath('images/howto/2.png')} className=\"howto-content__graphic\" />\n            <p className=\"howto-content__graphic-desc\">\n              You'll notice the title of the graph you are viewing on top along with the account type selector. You can use the filter to see the data of most interest to you.\n            </p>\n\n            <img src={assetPath('images/howto/3.png')} className=\"howto-content__graphic\" />\n            <p className=\"howto-content__graphic-desc\">\n              To focus on specific data — like a fund, department, expense type, or any combination — use the menu on the side panel. The \"Breakdown by\" allows you to specify which breakdown you want the graphs and table rows to represent on the graph. The \"Data Filter\" shows you the hierarchical relationships of Funds, Departments, and Account Types.\n            </p>\n\n            <img src={assetPath('images/howto/4.png')} className=\"howto-content__graphic\" />\n            <p className=\"howto-content__graphic-desc\">\n              In the \"Data Filter,\" you can see that, if a particular department never gets money from a particular fund, selecting only that department will gray out the fund.\n            </p>\n\n            <img src={assetPath('images/howto/5.png')} className=\"howto-content__graphic\" />\n            <p className=\"howto-content__graphic-desc\">\n              There are five graph types overall: an area graph, an area graph by percentage, a line graph, a pie graph, and a table.\n              You can share any view on a social network or by email. There are also options to download the displayed data in .csv spreadsheet and .png image formats.\n            </p>\n          </article>\n        </div>\n        <footer className=\"ui-modal__footer\">\n          <div className=\"ui-modal__actions\">\n            <button className=\"ui-button primary\" onClick={ReportActions.hideHowTo}>\n              Done\n            </button>\n          </div>\n        </footer>\n      </div>\n      <div className=\"ui-modal__background\"></div>\n    </div>\n  );\n}\n\nexport default HowToModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/howto.tsx","import React from 'react';\nimport ReportActions from '../actions/report_actions';\nimport ReportViewStore from '../stores/report_view_store';\nimport SummaryReportStore from '../stores/summary_report_store';\nimport {\n  createDummyReport,\n  setDownloadOption,\n  removeDummyReport,\n  downloadPreviewImage,\n  updateDesc,\n  updateTitle,\n  generatePreview,\n  printSetup\n} from './modal_operations/download_operations';\nimport { InputField, TextArea, Form, DropdownList, DropdownListItem } from '@opengov/ovid';\nimport _ from 'lodash';\n\nimport createReactClass from 'create-react-class';\n\nconst DownloadModal = createReactClass<any, any>({\n  getInitialState: () => {\n    const renderedReport = ReportViewStore.getRenderedReport();\n    const desc = renderedReport.get('description');\n    const title = renderedReport.get('name');\n    return {\n      optionValue: 'chart+table',\n      status: false,\n      includeDetails: true,\n      title: title ? title : '',\n      description: desc ? desc : '',\n      textChanged: false,\n      exportError: false,\n      warning: ''\n    };\n  },\n\n  setOption(value) {\n    this.setState({ optionValue: value });\n    this.addRemoveDetails();\n    const type = this.props.athenaState.get('graphType');\n    setDownloadOption(value, type);\n    generatePreview(this.updateStatus);\n  },\n\n  addRemoveDetails() {\n    if (!this.state.includeDetails) {\n      this.removeDetails();\n    } else {\n      this.updateDetails();\n    }\n  },\n\n  toggleCustomDetails() {\n    if (this.state.includeDetails) {\n      this.removeDetails();\n    } else {\n      this.updateDetails();\n    }\n    const type = this.props.athenaState.get('graphType');\n    setDownloadOption(this.state.optionValue, type);\n    generatePreview(this.updateStatus);\n    this.setState({\n      includeDetails: !this.state.includeDetails,\n    });\n  },\n\n  removeDetails() {\n    updateDesc('');\n    updateTitle('');\n  },\n\n  updateDetails() {\n    updateDesc(this.state.description);\n    updateTitle(this.state.title);\n  },\n\n  updateStatus(status) {\n    this.setState({ status });\n  },\n\n  checkRows() {\n    const renderedData = SummaryReportStore.getRenderedData(false, true);\n    const lines = renderedData.lines;\n    return lines.length > 150 ? true : false;\n  },\n\n  checkColumn() {\n    const renderedData = SummaryReportStore.getRenderedData(false, true);\n    const dataSets = SummaryReportStore.getRenderedDataSets();\n    const totals = renderedData.totals;\n    let varianceColCount = 0;\n    _.forEach(totals, (total) => {\n      varianceColCount = total.variance ? varianceColCount + 1 : varianceColCount;\n    });\n    const numberOfColumns = dataSets.length + (varianceColCount * 2);\n    return numberOfColumns > 10 ? true : false;\n  },\n\n  hasTable() {\n    return this.state.optionValue == 'table' || this.state.optionValue == 'chart+table' ? true : false;\n  },\n\n  download() {\n    const option = this.state.optionValue;\n    this.addRemoveDetails();\n    const type = this.props.athenaState.get('graphType');\n    setDownloadOption(option, type);\n    try {\n      this.setState({exportError: false});\n      if (this.state.textChanged) {\n        generatePreview(this.updateStatus, downloadPreviewImage, option);\n        this.setState({textChanged : false});\n      } else {\n        downloadPreviewImage(option);\n      }\n    } catch (err) {\n      this.setState({exportError: true});\n    }\n  },\n\n  print() {\n    const type = this.props.athenaState.get('graphType');\n    let option = this.state.optionValue;\n    this.addRemoveDetails();\n    setDownloadOption(option, type);\n    printSetup(option);\n    ReportActions.printReport();\n    window.print();\n  },\n\n  componentDidMount() {\n    const renderedData = SummaryReportStore.getRenderedData(false, true);\n    const lines = renderedData.lines;\n    const rerender = this.props.athenaState;\n    const titles = this.props.budgetData.titles( this.props.breakdown);\n    const primary = titles.primary;\n    const secondary = titles.secondary;\n    const filter = secondary.map((title) => {\n      return title.node.name;\n    });\n    filter.unshift(primary.name);\n    const type = this.props.athenaState.get('graphType');\n    createDummyReport(this.state.title, this.state.description, lines.length, rerender, filter, type, this.updateStatus);\n  },\n\n  renderReportDescription() {\n    return (\n      <TextArea name=\"description\"\n        label=\"Report Description\"\n        placeholder=\"Add a description for this report\"\n        maxLength={250} />\n    );\n  },\n\n  previewWarning() {\n    const renderedData = SummaryReportStore.getRenderedData(false, true);\n    const lines = renderedData.lines;\n    return (this.hasTable() && lines.length > 90) ? 'Preview might take sometime' : 'Loading';\n  },\n\n  renderWarning() {\n    if (this.hasTable() && this.checkColumn() && this.checkRows()) {\n      return (\n        <div className=\" ui-alert-box notice\">\n          <strong>Print table, for best result</strong>\n          <p> This report include more than 150 rows and 10 columns, which may not display well in the image download. We recommend that you print it as a Acrobat PDF</p>\n        </div>\n      );\n    }\n\n    if (this.hasTable() && this.checkRows()) {\n      return (\n        <div className=\" ui-alert-box notice\">\n          <strong>Print table, for best result</strong>\n          <p> This report include more than 150 rows, which may not display well in the image download. We recommend that you print it as a Acrobat PDF</p>\n        </div>\n      );\n    }\n\n    if (this.hasTable() && this.checkColumn()) {\n      return (\n        <div className=\" ui-alert-box notice\">\n          <strong>Print table, for best result</strong>\n          <p>This report include more than 10 columns, which may not display well in the image download. We recommend that you print it as a Acrobat PDF</p>\n        </div>\n      );\n    }\n\n    return null;\n  },\n\n  renderReportTitle() {\n    return (\n      <InputField name=\"title\"\n        label=\"Report Title\"\n        placeholder=\"Add a Title for this report\"\n        maxLength={75}\n      />\n    );\n  },\n\n  componentWillUnmount() {\n    removeDummyReport();\n    this.props.athenaState.trigger('renderData', false);\n  },\n\n  componentDidUpdate(prevProps, prevState) {\n    if ((this.state.title != prevState.title) || (this.state.description != prevState.description)) {\n      this.setState({textChanged:true});\n    }\n\n  },\n  checkMaxCharacters() {\n    return ((this.state.title && this.state.title.length > 75)\n      || (this.state.description && this.state.description.length > 250) ? true : false);\n  },\n\n  _onFormChange(fieldName, newValue) {\n    this.setState({ [fieldName] : newValue });\n  },\n\n  render() {\n    const initialValues = {...this.state};\n    const errors = {};\n    const reportDetails = this.state.includeDetails ?\n      <div>\n        <Form initialValues={initialValues} errors={errors} onChange={this._onFormChange}>\n          {this.renderReportTitle()}\n          {this.renderReportDescription()}\n        </Form>\n      </div>\n    : null;\n    return (\n      <div>\n        <div className=\"ui-modal__wrapper open\" id=\"overlay-modal_download\">\n          <div className=\"ui-modal lg-modal\">\n            <header className=\"ui-modal__header\">\n              <h3>Download Image</h3>\n              <span className=\"ui-modal__close\" onClick={ReportActions.hideDownloadModal}></span>\n            </header>\n            <div className=\"ui-modal__content\">\n              <div className=\"download_wrapper\">\n                <div className=\"download_options\">\n                  {this.renderWarning()}\n                  <fieldset className=\"ui-form\">\n                    <label className=\"ui-form__checkbox-label\" onClick={this.toggleCustomDetails}>\n                      <div className={this.state.includeDetails ? 'ui-form__checkbox is-checked' : 'ui-form__checkbox'}></div> Include report title and description\n                    </label>\n                  </fieldset>\n\n                  {reportDetails}\n                  <fieldset className=\"ui-form option\">\n                    <label>Image Options</label>\n                    <DropdownList value={this.state.optionValue} onChange={this.setOption}>\n                      <DropdownListItem key = \"1\" value = \"chart\" title = \"Chart only\" />\n                      <DropdownListItem\n                        key=\"2\"\n                        value=\"table\"\n                        title=\"Table only\" />\n                      <DropdownListItem\n                        key=\"3\"\n                        value=\"chart+table\"\n                        title=\"Chart & Table\" />\n                   </DropdownList>\n                   </fieldset>\n                </div>\n                <div className=\"download_preview_conatiner\">\n                  {this.state.status ?\n                  <div className=\"ui-loader\">\n                    <div className=\"ui-loading\"></div>\n                    <div className=\"ui-loader__message\">\n                      <strong>{this.previewWarning()}</strong>\n                    </div>\n                  </div> : ''}\n                  <div className=\"ui-form\">\n                   <label>Preview</label>\n                  </div>\n                  {this.state.exportError ?\n                    <div className=\"ui-alert-box whoops\">\n                      <span className=\"icon-exclamation-1\" /> The download failed. Please retry\n                    </div>\n                  : null}\n                  <div className=\"download_preview\">\n                    <img className= \"download_preview_image\" />\n                  </div>\n                </div>\n              </div>\n              <div id=\"download_status\"></div>\n            </div>\n            <footer className=\"ui-modal__footer\">\n              <div className=\"ui-modal__actions\">\n                <button className=\"ui-button cancel_button\" disabled={this.state.status} onClick={ReportActions.hideDownloadModal}>\n                  Cancel\n                </button>\n\n                <button className=\"ui-button print_button\" disabled={this.state.status || this.checkMaxCharacters()} onClick={this.print}>\n                  Print\n                </button>\n\n                <button className=\"ui-button download_button primary\" disabled={this.state.status || this.checkMaxCharacters()} onClick={this.download}>\n                  Download Image\n                </button>\n              </div>\n            </footer>\n          </div>\n          <div className=\"ui-modal__background\"></div>\n      </div>\n    </div>\n    );\n  }\n});\n\nexport default DownloadModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/download.tsx","import {\n  convertSvgToCanvas,\n  createDummyContainer,\n  removeDummyContainer,\n  generateCanvas\n} from '../../operations/html2canvas_operations';\nimport moment from 'moment';\n\nlet currentCanvas;\n\nexport function createDummyReport(title, desc, rowsLength, render, filters, type, updateStatus) {\n  if (document.getElementById('transparency-content')) {\n    updateStatus(true);\n    document.documentElement.style.overflow = 'hidden';\n    const dummyContainer = createReportContainer(render, isScalable());\n    setTimeout(() => {\n      addTitle(dummyContainer, title);\n      addDesc(dummyContainer, desc);\n      const graph = addGraph('dummyGraph', dummyContainer, type, false);\n      const reportDesc = (graph as any).querySelector('.report-description');\n      if (reportDesc) {\n        reportDesc.innerHTML = '';\n      }\n      convertSvgToCanvas(graph);\n      const scale = document.getElementById('scaling');\n      if (scale) {\n        scale.innerHTML = '';\n      }\n      render.trigger('renderData', false);\n      setTimeout(() => {\n        const graph = addGraph('dummyGraph2', dummyContainer, type, true);\n        convertSvgToCanvas(graph);\n        const style = document.createElement('style');\n        style.innerHTML = '@media print { #App{display:none; }  #dummy_report_footer { display:block; }   #dummyContainer tr{page-break-inside: avoid !important;} #dummyContainer { display: block; height: 100%; width: 100%; -webkit-print-color-adjust:exact;print-color-adjust:exact;}}';\n        dummyContainer.appendChild(style);\n        addSummaryTable(dummyContainer, rowsLength);\n        addFooter(dummyContainer, filters);\n        generatePreview(updateStatus);\n        find(dummyContainer, '.highcharts-container > div > span', (ele) => {ele.style.fontFamily = 'arial';});\n        find(dummyContainer, '.highcharts-container > div > div > span', (ele) => {ele.style.fontFamily = 'arial';});\n      }, 2000);\n    }, 2000);\n  }\n}\n\nfunction isScalable() {\n  const summaryTable = document.getElementsByClassName('summary-table');\n  if (summaryTable) {\n    const summaryTableWidth = (summaryTable[0] as any).offsetWidth;\n    const tableWidth = document.getElementById('table').offsetWidth;\n    return summaryTableWidth < tableWidth ? true : false;\n  }\n  return false;\n}\n\nfunction createReportContainer(render, resize) {\n  const dummyContainer = createDummyContainer();\n  if (resize) {\n    const css = document.createElement('style');\n    css.type = 'text/css';\n    css.id = 'scaling';\n    css.innerHTML = '.ui-main__content{display: inline-block} .table__wrapper{display: inline-block} ';\n    dummyContainer.appendChild(css);\n    render.trigger('renderData', false);\n  }\n  return dummyContainer;\n}\n\nfunction addTitle(dummyContainer, title) {\n  const titleElement = document.createElement('div');\n  titleElement.id = 'dummy_report_title';\n  titleElement.innerHTML = title;\n  dummyContainer.appendChild(titleElement);\n  return titleElement;\n}\n\nfunction addDesc(dummyContainer, desc) {\n  const desciptionElement = document.createElement('div');\n  desciptionElement.id = 'dummy_report_desc';\n  (desciptionElement as any).class = 'report-description';\n  desciptionElement.innerHTML = desc;\n  dummyContainer.appendChild(desciptionElement);\n  return desciptionElement;\n}\n\nfunction addFooter(dummyContainer, filters) {\n  const titleElement = document.createElement('div');\n  const filtersMessage = filters.length > 0 ? 'Data filtered by ' + filters.join(', ') + ' and exported on ' : 'Exported on ';\n  titleElement.id = 'dummy_report_footer';\n  titleElement.innerHTML = '<span>' + filtersMessage + '' + moment().format('MMMM D, YYYY') + '. </span> <span>Created with OpenGov</span>';\n  dummyContainer.appendChild(titleElement);\n  return titleElement;\n}\n\nexport function updateDesc(desc) {\n  const desciptionElement = document.getElementById('dummy_report_desc');\n  if (desciptionElement) desciptionElement.innerHTML = desc;\n}\n\nexport function updateTitle(title) {\n  const titleElement = document.getElementById('dummy_report_title');\n  if (titleElement) titleElement.innerHTML = title;\n}\n\nfunction addGraph(id, dummyContainer, type, secondaryGraph) {\n  const graph: any = document.getElementById('transparency-content').cloneNode(true);\n  graph.id = id;\n\n  if ((type == 'pie' && !secondaryGraph) || type != 'pie' && secondaryGraph ) {\n    graph.style.display = 'none';\n  }\n\n  dummyContainer.appendChild(graph);\n  find(dummyContainer, '.wd-show-annotations', (element) => { element.style.cssText = 'display: none;'; } );\n  return graph;\n}\n\nfunction find(element, query, callback) {\n  const elems = element.querySelectorAll(query);\n  Array.from(elems).forEach((elem) => {\n    callback(elem);\n  });\n}\n\nfunction addCss(element, query, cssStyle) {\n  const elems = element.querySelectorAll(query);\n  Array.from(elems).forEach((elem: any) => {\n    elem.style.cssText = cssStyle;\n  });\n}\n\nfunction removeAttribute(element, query, atrib) {\n  const elems = element.querySelectorAll(query);\n  Array.from(elems).forEach((elem: any) => {\n    elem.removeAttribute(atrib);\n  });\n}\n\nfunction addSummaryTable(dummyContainer, rowsLength) {\n  const summaryTable: any = document.getElementsByClassName('summary-table')[0].cloneNode(true);\n  summaryTable.id = 'dummySummaryTable';\n  summaryTable.className = summaryTable.className.replace(/\\bsummary-table\\b/, ' ');\n  const isChrome = !!(window as any).chrome && !!(window as any).chrome.webstore;\n  const table = summaryTable.querySelector('#table');\n  const cssStyle = 'position: relative; top: 0px; z-index: 3;';\n  const rowHeader = 'border-right-width: 0px; left: 0px;';\n  find(table, 'thead th', (element) => {\n    element.removeAttribute('data-hint');\n    element.style.cssText = cssStyle;\n  });\n  if (isChrome) {\n    removeAttribute(table, '.ui-drop-item__icon', 'class');\n  }\n  removeAttribute(table, '.icon-info-1', 'class');\n  addCss(table, '.row-header', rowHeader);\n  if (rowsLength > 100 ) {\n    addCss(table, 'tr', 'height:auto;font-size:10px;');\n  } else {\n    addCss(table, 'tr', 'height:30px;font-size:10px;');\n  }\n  table.id = 'dummyTable';\n  dummyContainer.appendChild(summaryTable);\n  return summaryTable;\n}\n\nexport function setDownloadOption(option, type) {\n  const graph = document.getElementById('dummyGraph');\n  const table = document.getElementById('dummySummaryTable');\n  const graph2 = document.getElementById('dummyGraph2');\n  if (graph) {\n    graph.style.cssText = 'display: inline-flex;';\n    table.style.cssText = 'display: inline-block';\n    graph2.style.cssText = 'display: none;';\n    if (option == 'table') {\n      graph.style.cssText = 'display: none;';\n    } else if (option == 'chart') {\n      table.style.cssText = 'display: none;';\n      graph.style.cssText = 'display: none;';\n      graph2.style.cssText = 'inline-flex;';\n    } else if (option == 'chart+table' && type == 'pie') {\n      graph.style.cssText = 'display: none;';\n      graph2.style.cssText = 'inline-flex;';\n    }\n  }\n}\n\nfunction dataURLtoBlob(dataurl) {\n  const arr = dataurl.split(',');\n  const mime = arr[0].match(/:(.*?);/)[1];\n  const bstr = atob(arr[1]);\n  let n = bstr.length;\n  const u8arr = new Uint8Array(n);\n  while (n--) {\n    u8arr[n] = bstr.charCodeAt(n);\n  }\n  return new Blob([u8arr], {type:mime});\n}\n\nfunction convertCanvasToImage(canvas) {\n  currentCanvas = canvas;\n  const imgData = canvas.toDataURL({ format: 'png', multiplier: 4});\n  const blob = dataURLtoBlob(imgData);\n  return URL.createObjectURL(blob);\n}\n\nexport function downloadPreviewImage(filename) {\n  if (currentCanvas.msToBlob) {\n    const blob = currentCanvas.msToBlob();\n    window.navigator.msSaveBlob(blob, filename + '.png');\n  } else {\n    const a = document.createElement('a');\n    const preview: any = document.getElementsByClassName('download_preview_image')[0];\n    a.href = preview.src;\n    document.body.appendChild(a);\n    a.download = filename;\n    a.click();\n    a.remove();\n  }\n}\n\nexport function generatePreview(statusCallBack, previewCallBack?, option?) {\n  const dummyContainer = document.getElementById('dummyContainer');\n  if (dummyContainer) {\n    dummyContainer.style.display = 'inline-block';\n  }\n  statusCallBack(true);\n  generateCanvas((canvas) => {\n    const image = convertCanvasToImage(canvas);\n    const preview = document.getElementsByClassName('download_preview_image')[0];\n    (preview as any).src = image;\n    statusCallBack(false);\n    if (previewCallBack) {\n      previewCallBack(option);\n    }\n  });\n}\nexport function printSetup(option) {\n  const dummyContainer = document.getElementById('dummyContainer');\n  if (dummyContainer) {\n    const dummySummaryTable = document.getElementById('dummySummaryTable');\n    dummyContainer.style.display = 'block';\n    if (option != 'chart') {\n      dummySummaryTable.style.display = 'block';\n    }\n  }\n}\n\nexport function removeDummyReport() {\n  removeDummyContainer();\n  document.documentElement.style.overflow = 'auto';\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/modal_operations/download_operations.ts","import html2canvas from 'html2canvas';\nimport canvg from 'canvg';\n\nexport function convertSvgToCanvas(graph) {\n  const svgimage = graph.querySelector('svg');\n  if (svgimage) {\n    const serializer = new XMLSerializer();\n    const str = serializer.serializeToString(svgimage);\n    const canvas = document.createElement('canvas');\n    canvas.setAttribute('width', '150px;');\n    canvas.setAttribute('height', '150px;');\n    canvg(canvas, str);\n    const image = document.createElement('img');\n    const imgData = canvas.toDataURL();\n    image.src = imgData;\n    graph.querySelector('svg').parentNode.replaceChild(image, svgimage);\n  }\n}\n\nexport function createDummyContainer() {\n  const dummyContainer = document.createElement('div');\n  dummyContainer.id = 'dummyContainer';\n  dummyContainer.style.cssText = 'display: inline-block; background: white; font-family: arial;';\n  document.body.appendChild(dummyContainer);\n  return dummyContainer;\n}\n\nexport function removeDummyContainer() {\n  const element = document.getElementById('dummyContainer');\n  element.parentNode.removeChild(element);\n}\n\nexport function generateCanvas(callback) {\n  let doc = document.getElementById('dummyContainer');\n  if (doc) {\n    html2canvas(doc, {\n      logging: false,\n      useCORS: true,\n      scale: 1.5,\n      allowTaint: true\n    }).then((canvas) => {\n      callback(canvas);\n    });\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/operations/html2canvas_operations.ts","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _CanvasRenderer = require('./renderer/CanvasRenderer');\n\nvar _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer);\n\nvar _Logger = require('./Logger');\n\nvar _Logger2 = _interopRequireDefault(_Logger);\n\nvar _Window = require('./Window');\n\nvar _Bounds = require('./Bounds');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar html2canvas = function html2canvas(element, conf) {\n    // eslint-disable-next-line no-console\n    if ((typeof console === 'undefined' ? 'undefined' : _typeof(console)) === 'object' && typeof console.log === 'function') {\n        // eslint-disable-next-line no-console\n        console.log('html2canvas ' + \"$npm_package_version\");\n    }\n\n    var config = conf || {};\n    var logger = new _Logger2.default(typeof config.logging === 'boolean' ? config.logging : true);\n\n    if (process.env.NODE_ENV !== 'production' && typeof config.onrendered === 'function') {\n        logger.error('onrendered option is deprecated, html2canvas returns a Promise with the canvas as the value');\n    }\n\n    var ownerDocument = element.ownerDocument;\n    if (!ownerDocument) {\n        return Promise.reject('Provided element is not within a Document');\n    }\n    var defaultView = ownerDocument.defaultView;\n\n    var scrollX = defaultView.pageXOffset;\n    var scrollY = defaultView.pageYOffset;\n\n    var isDocument = element.tagName === 'HTML' || element.tagName === 'BODY';\n\n    var _ref = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(element, scrollX, scrollY),\n        width = _ref.width,\n        height = _ref.height,\n        left = _ref.left,\n        top = _ref.top;\n\n    var defaultOptions = {\n        async: true,\n        allowTaint: false,\n        backgroundColor: '#ffffff',\n        imageTimeout: 15000,\n        logging: true,\n        proxy: null,\n        removeContainer: true,\n        foreignObjectRendering: false,\n        scale: defaultView.devicePixelRatio || 1,\n        target: new _CanvasRenderer2.default(config.canvas),\n        x: left,\n        y: top,\n        width: Math.ceil(width),\n        height: Math.ceil(height),\n        windowWidth: defaultView.innerWidth,\n        windowHeight: defaultView.innerHeight,\n        scrollX: defaultView.pageXOffset,\n        scrollY: defaultView.pageYOffset\n    };\n\n    var result = (0, _Window.renderElement)(element, _extends({}, defaultOptions, config), logger);\n\n    if (process.env.NODE_ENV !== 'production') {\n        return result.catch(function (e) {\n            logger.error(e);\n            throw e;\n        });\n    }\n    return result;\n};\n\nhtml2canvas.CanvasRenderer = _CanvasRenderer2.default;\n\nmodule.exports = html2canvas;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/index.js\n// module id = 1520\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.renderElement = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _Logger = require('./Logger');\n\nvar _Logger2 = _interopRequireDefault(_Logger);\n\nvar _NodeParser = require('./NodeParser');\n\nvar _Renderer = require('./Renderer');\n\nvar _Renderer2 = _interopRequireDefault(_Renderer);\n\nvar _ForeignObjectRenderer = require('./renderer/ForeignObjectRenderer');\n\nvar _ForeignObjectRenderer2 = _interopRequireDefault(_ForeignObjectRenderer);\n\nvar _Feature = require('./Feature');\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nvar _Bounds = require('./Bounds');\n\nvar _Clone = require('./Clone');\n\nvar _Font = require('./Font');\n\nvar _Color = require('./Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar renderElement = exports.renderElement = function renderElement(element, options, logger) {\n    var ownerDocument = element.ownerDocument;\n\n    var windowBounds = new _Bounds.Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight);\n\n    // http://www.w3.org/TR/css3-background/#special-backgrounds\n    var documentBackgroundColor = ownerDocument.documentElement ? new _Color2.default(getComputedStyle(ownerDocument.documentElement).backgroundColor) : _Color.TRANSPARENT;\n    var bodyBackgroundColor = ownerDocument.body ? new _Color2.default(getComputedStyle(ownerDocument.body).backgroundColor) : _Color.TRANSPARENT;\n\n    var backgroundColor = element === ownerDocument.documentElement ? documentBackgroundColor.isTransparent() ? bodyBackgroundColor.isTransparent() ? options.backgroundColor ? new _Color2.default(options.backgroundColor) : null : bodyBackgroundColor : documentBackgroundColor : options.backgroundColor ? new _Color2.default(options.backgroundColor) : null;\n\n    return (options.foreignObjectRendering ? // $FlowFixMe\n    _Feature2.default.SUPPORT_FOREIGNOBJECT_DRAWING : Promise.resolve(false)).then(function (supportForeignObject) {\n        return supportForeignObject ? function (cloner) {\n            if (process.env.NODE_ENV !== 'production') {\n                logger.log('Document cloned, using foreignObject rendering');\n            }\n\n            return cloner.inlineFonts(ownerDocument).then(function () {\n                return cloner.resourceLoader.ready();\n            }).then(function () {\n                var renderer = new _ForeignObjectRenderer2.default(cloner.documentElement);\n                return renderer.render({\n                    backgroundColor: backgroundColor,\n                    logger: logger,\n                    scale: options.scale,\n                    x: options.x,\n                    y: options.y,\n                    width: options.width,\n                    height: options.height,\n                    windowWidth: options.windowWidth,\n                    windowHeight: options.windowHeight,\n                    scrollX: options.scrollX,\n                    scrollY: options.scrollY\n                });\n            });\n        }(new _Clone.DocumentCloner(element, options, logger, true, renderElement)) : (0, _Clone.cloneWindow)(ownerDocument, windowBounds, element, options, logger, renderElement).then(function (_ref) {\n            var _ref2 = _slicedToArray(_ref, 3),\n                container = _ref2[0],\n                clonedElement = _ref2[1],\n                resourceLoader = _ref2[2];\n\n            if (process.env.NODE_ENV !== 'production') {\n                logger.log('Document cloned, using computed rendering');\n            }\n\n            var stack = (0, _NodeParser.NodeParser)(clonedElement, resourceLoader, logger);\n            var clonedDocument = clonedElement.ownerDocument;\n\n            if (backgroundColor === stack.container.style.background.backgroundColor) {\n                stack.container.style.background.backgroundColor = _Color.TRANSPARENT;\n            }\n\n            return resourceLoader.ready().then(function (imageStore) {\n                if (options.removeContainer === true) {\n                    if (container.parentNode) {\n                        container.parentNode.removeChild(container);\n                    } else if (process.env.NODE_ENV !== 'production') {\n                        logger.log('Cannot detach cloned iframe as it is not in the DOM anymore');\n                    }\n                }\n\n                var fontMetrics = new _Font.FontMetrics(clonedDocument);\n                if (process.env.NODE_ENV !== 'production') {\n                    logger.log('Starting renderer');\n                }\n\n                var renderOptions = {\n                    backgroundColor: backgroundColor,\n                    fontMetrics: fontMetrics,\n                    imageStore: imageStore,\n                    logger: logger,\n                    scale: options.scale,\n                    x: options.x,\n                    y: options.y,\n                    width: options.width,\n                    height: options.height\n                };\n\n                if (Array.isArray(options.target)) {\n                    return Promise.all(options.target.map(function (target) {\n                        var renderer = new _Renderer2.default(target, renderOptions);\n                        return renderer.render(stack);\n                    }));\n                } else {\n                    var renderer = new _Renderer2.default(options.target, renderOptions);\n                    return renderer.render(stack);\n                }\n            });\n        });\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Window.js\n// module id = 1521\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.NodeParser = undefined;\n\nvar _StackingContext = require('./StackingContext');\n\nvar _StackingContext2 = _interopRequireDefault(_StackingContext);\n\nvar _NodeContainer = require('./NodeContainer');\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _TextContainer = require('./TextContainer');\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _Input = require('./Input');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NodeParser = exports.NodeParser = function NodeParser(node, resourceLoader, logger) {\n    if (process.env.NODE_ENV !== 'production') {\n        logger.log('Starting node parsing');\n    }\n\n    var index = 0;\n\n    var container = new _NodeContainer2.default(node, null, resourceLoader, index++);\n    var stack = new _StackingContext2.default(container, null, true);\n\n    parseNodeTree(node, container, stack, resourceLoader, index);\n\n    if (process.env.NODE_ENV !== 'production') {\n        logger.log('Finished parsing node tree');\n    }\n\n    return stack;\n};\n\nvar IGNORED_NODE_NAMES = ['SCRIPT', 'HEAD', 'TITLE', 'OBJECT', 'BR', 'OPTION'];\n\nvar parseNodeTree = function parseNodeTree(node, parent, stack, resourceLoader, index) {\n    if (process.env.NODE_ENV !== 'production' && index > 50000) {\n        throw new Error('Recursion error while parsing node tree');\n    }\n\n    for (var childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {\n        nextNode = childNode.nextSibling;\n        var defaultView = childNode.ownerDocument.defaultView;\n        if (childNode instanceof defaultView.Text || childNode instanceof Text || defaultView.parent && childNode instanceof defaultView.parent.Text) {\n            if (childNode.data.trim().length > 0) {\n                parent.childNodes.push(_TextContainer2.default.fromTextNode(childNode, parent));\n            }\n        } else if (childNode instanceof defaultView.HTMLElement || childNode instanceof HTMLElement || defaultView.parent && childNode instanceof defaultView.parent.HTMLElement) {\n            if (IGNORED_NODE_NAMES.indexOf(childNode.nodeName) === -1) {\n                var container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++);\n                if (container.isVisible()) {\n                    if (childNode.tagName === 'INPUT') {\n                        // $FlowFixMe\n                        (0, _Input.inlineInputElement)(childNode, container);\n                    } else if (childNode.tagName === 'TEXTAREA') {\n                        // $FlowFixMe\n                        (0, _Input.inlineTextAreaElement)(childNode, container);\n                    } else if (childNode.tagName === 'SELECT') {\n                        // $FlowFixMe\n                        (0, _Input.inlineSelectElement)(childNode, container);\n                    }\n\n                    var SHOULD_TRAVERSE_CHILDREN = childNode.tagName !== 'TEXTAREA';\n                    var treatAsRealStackingContext = createsRealStackingContext(container, childNode);\n                    if (treatAsRealStackingContext || createsStackingContext(container)) {\n                        // for treatAsRealStackingContext:false, any positioned descendants and descendants\n                        // which actually create a new stacking context should be considered part of the parent stacking context\n                        var parentStack = treatAsRealStackingContext || container.isPositioned() ? stack.getRealParentStackingContext() : stack;\n                        var childStack = new _StackingContext2.default(container, parentStack, treatAsRealStackingContext);\n                        parentStack.contexts.push(childStack);\n                        if (SHOULD_TRAVERSE_CHILDREN) {\n                            parseNodeTree(childNode, container, childStack, resourceLoader, index);\n                        }\n                    } else {\n                        stack.children.push(container);\n                        if (SHOULD_TRAVERSE_CHILDREN) {\n                            parseNodeTree(childNode, container, stack, resourceLoader, index);\n                        }\n                    }\n                }\n            }\n        } else if (childNode instanceof defaultView.SVGSVGElement || childNode instanceof SVGSVGElement || defaultView.parent && childNode instanceof defaultView.parent.SVGSVGElement) {\n            var _container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++);\n            var _treatAsRealStackingContext = createsRealStackingContext(_container, childNode);\n            if (_treatAsRealStackingContext || createsStackingContext(_container)) {\n                // for treatAsRealStackingContext:false, any positioned descendants and descendants\n                // which actually create a new stacking context should be considered part of the parent stacking context\n                var _parentStack = _treatAsRealStackingContext || _container.isPositioned() ? stack.getRealParentStackingContext() : stack;\n                var _childStack = new _StackingContext2.default(_container, _parentStack, _treatAsRealStackingContext);\n                _parentStack.contexts.push(_childStack);\n            } else {\n                stack.children.push(_container);\n            }\n        }\n    }\n};\n\nvar createsRealStackingContext = function createsRealStackingContext(container, node) {\n    return container.isRootElement() || container.isPositionedWithZIndex() || container.style.opacity < 1 || container.isTransformed() || isBodyWithTransparentRoot(container, node);\n};\n\nvar createsStackingContext = function createsStackingContext(container) {\n    return container.isPositioned() || container.isFloating();\n};\n\nvar isBodyWithTransparentRoot = function isBodyWithTransparentRoot(container, node) {\n    return node.nodeName === 'BODY' && container.parent instanceof _NodeContainer2.default && container.parent.style.background.backgroundColor.isTransparent();\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/NodeParser.js\n// module id = 1522\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _NodeContainer = require('./NodeContainer');\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _position = require('./parsing/position');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar StackingContext = function () {\n    function StackingContext(container, parent, treatAsRealStackingContext) {\n        _classCallCheck(this, StackingContext);\n\n        this.container = container;\n        this.parent = parent;\n        this.contexts = [];\n        this.children = [];\n        this.treatAsRealStackingContext = treatAsRealStackingContext;\n    }\n\n    _createClass(StackingContext, [{\n        key: 'getOpacity',\n        value: function getOpacity() {\n            return this.parent ? this.container.style.opacity * this.parent.getOpacity() : this.container.style.opacity;\n        }\n    }, {\n        key: 'getRealParentStackingContext',\n        value: function getRealParentStackingContext() {\n            return !this.parent || this.treatAsRealStackingContext ? this : this.parent.getRealParentStackingContext();\n        }\n    }]);\n\n    return StackingContext;\n}();\n\nexports.default = StackingContext;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/StackingContext.js\n// module id = 1523\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Size = function Size(width, height) {\n    _classCallCheck(this, Size);\n\n    this.width = width;\n    this.height = height;\n};\n\nexports.default = Size;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/drawing/Size.js\n// module id = 1524\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Path = require('./Path');\n\nvar _Vector = require('./Vector');\n\nvar _Vector2 = _interopRequireDefault(_Vector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar lerp = function lerp(a, b, t) {\n    return new _Vector2.default(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\n};\n\nvar BezierCurve = function () {\n    function BezierCurve(start, startControl, endControl, end) {\n        _classCallCheck(this, BezierCurve);\n\n        this.type = _Path.PATH.BEZIER_CURVE;\n        this.start = start;\n        this.startControl = startControl;\n        this.endControl = endControl;\n        this.end = end;\n    }\n\n    _createClass(BezierCurve, [{\n        key: 'subdivide',\n        value: function subdivide(t, firstHalf) {\n            var ab = lerp(this.start, this.startControl, t);\n            var bc = lerp(this.startControl, this.endControl, t);\n            var cd = lerp(this.endControl, this.end, t);\n            var abbc = lerp(ab, bc, t);\n            var bccd = lerp(bc, cd, t);\n            var dest = lerp(abbc, bccd, t);\n            return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);\n        }\n    }, {\n        key: 'reverse',\n        value: function reverse() {\n            return new BezierCurve(this.end, this.endControl, this.startControl, this.start);\n        }\n    }]);\n\n    return BezierCurve;\n}();\n\nexports.default = BezierCurve;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/drawing/BezierCurve.js\n// module id = 1525\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseBorderRadius = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _Length = require('../Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SIDES = ['top-left', 'top-right', 'bottom-right', 'bottom-left'];\n\nvar parseBorderRadius = exports.parseBorderRadius = function parseBorderRadius(style) {\n    return SIDES.map(function (side) {\n        var value = style.getPropertyValue('border-' + side + '-radius');\n\n        var _value$split$map = value.split(' ').map(_Length2.default.create),\n            _value$split$map2 = _slicedToArray(_value$split$map, 2),\n            horizontal = _value$split$map2[0],\n            vertical = _value$split$map2[1];\n\n        return typeof vertical === 'undefined' ? [horizontal, horizontal] : [horizontal, vertical];\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/borderRadius.js\n// module id = 1526\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar DISPLAY = exports.DISPLAY = {\n    NONE: 1 << 0,\n    BLOCK: 1 << 1,\n    INLINE: 1 << 2,\n    RUN_IN: 1 << 3,\n    FLOW: 1 << 4,\n    FLOW_ROOT: 1 << 5,\n    TABLE: 1 << 6,\n    FLEX: 1 << 7,\n    GRID: 1 << 8,\n    RUBY: 1 << 9,\n    SUBGRID: 1 << 10,\n    LIST_ITEM: 1 << 11,\n    TABLE_ROW_GROUP: 1 << 12,\n    TABLE_HEADER_GROUP: 1 << 13,\n    TABLE_FOOTER_GROUP: 1 << 14,\n    TABLE_ROW: 1 << 15,\n    TABLE_CELL: 1 << 16,\n    TABLE_COLUMN_GROUP: 1 << 17,\n    TABLE_COLUMN: 1 << 18,\n    TABLE_CAPTION: 1 << 19,\n    RUBY_BASE: 1 << 20,\n    RUBY_TEXT: 1 << 21,\n    RUBY_BASE_CONTAINER: 1 << 22,\n    RUBY_TEXT_CONTAINER: 1 << 23,\n    CONTENTS: 1 << 24,\n    INLINE_BLOCK: 1 << 25,\n    INLINE_LIST_ITEM: 1 << 26,\n    INLINE_TABLE: 1 << 27,\n    INLINE_FLEX: 1 << 28,\n    INLINE_GRID: 1 << 29\n};\n\nvar parseDisplayValue = function parseDisplayValue(display) {\n    switch (display) {\n        case 'block':\n            return DISPLAY.BLOCK;\n        case 'inline':\n            return DISPLAY.INLINE;\n        case 'run-in':\n            return DISPLAY.RUN_IN;\n        case 'flow':\n            return DISPLAY.FLOW;\n        case 'flow-root':\n            return DISPLAY.FLOW_ROOT;\n        case 'table':\n            return DISPLAY.TABLE;\n        case 'flex':\n            return DISPLAY.FLEX;\n        case 'grid':\n            return DISPLAY.GRID;\n        case 'ruby':\n            return DISPLAY.RUBY;\n        case 'subgrid':\n            return DISPLAY.SUBGRID;\n        case 'list-item':\n            return DISPLAY.LIST_ITEM;\n        case 'table-row-group':\n            return DISPLAY.TABLE_ROW_GROUP;\n        case 'table-header-group':\n            return DISPLAY.TABLE_HEADER_GROUP;\n        case 'table-footer-group':\n            return DISPLAY.TABLE_FOOTER_GROUP;\n        case 'table-row':\n            return DISPLAY.TABLE_ROW;\n        case 'table-cell':\n            return DISPLAY.TABLE_CELL;\n        case 'table-column-group':\n            return DISPLAY.TABLE_COLUMN_GROUP;\n        case 'table-column':\n            return DISPLAY.TABLE_COLUMN;\n        case 'table-caption':\n            return DISPLAY.TABLE_CAPTION;\n        case 'ruby-base':\n            return DISPLAY.RUBY_BASE;\n        case 'ruby-text':\n            return DISPLAY.RUBY_TEXT;\n        case 'ruby-base-container':\n            return DISPLAY.RUBY_BASE_CONTAINER;\n        case 'ruby-text-container':\n            return DISPLAY.RUBY_TEXT_CONTAINER;\n        case 'contents':\n            return DISPLAY.CONTENTS;\n        case 'inline-block':\n            return DISPLAY.INLINE_BLOCK;\n        case 'inline-list-item':\n            return DISPLAY.INLINE_LIST_ITEM;\n        case 'inline-table':\n            return DISPLAY.INLINE_TABLE;\n        case 'inline-flex':\n            return DISPLAY.INLINE_FLEX;\n        case 'inline-grid':\n            return DISPLAY.INLINE_GRID;\n    }\n\n    return DISPLAY.NONE;\n};\n\nvar setDisplayBit = function setDisplayBit(bit, display) {\n    return bit | parseDisplayValue(display);\n};\n\nvar parseDisplay = exports.parseDisplay = function parseDisplay(display) {\n    return display.split(' ').reduce(setDisplayBit, 0);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/display.js\n// module id = 1527\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar FLOAT = exports.FLOAT = {\n    NONE: 0,\n    LEFT: 1,\n    RIGHT: 2,\n    INLINE_START: 3,\n    INLINE_END: 4\n};\n\nvar parseCSSFloat = exports.parseCSSFloat = function parseCSSFloat(float) {\n    switch (float) {\n        case 'left':\n            return FLOAT.LEFT;\n        case 'right':\n            return FLOAT.RIGHT;\n        case 'inline-start':\n            return FLOAT.INLINE_START;\n        case 'inline-end':\n            return FLOAT.INLINE_END;\n    }\n    return FLOAT.NONE;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/float.js\n// module id = 1528\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n\nvar parseFontWeight = function parseFontWeight(weight) {\n    switch (weight) {\n        case 'normal':\n            return 400;\n        case 'bold':\n            return 700;\n    }\n\n    var value = parseInt(weight, 10);\n    return isNaN(value) ? 400 : value;\n};\n\nvar parseFont = exports.parseFont = function parseFont(style) {\n    var fontFamily = style.fontFamily;\n    var fontSize = style.fontSize;\n    var fontStyle = style.fontStyle;\n    var fontVariant = style.fontVariant;\n    var fontWeight = parseFontWeight(style.fontWeight);\n\n    return {\n        fontFamily: fontFamily,\n        fontSize: fontSize,\n        fontStyle: fontStyle,\n        fontVariant: fontVariant,\n        fontWeight: fontWeight\n    };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/font.js\n// module id = 1529\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar parseLetterSpacing = exports.parseLetterSpacing = function parseLetterSpacing(letterSpacing) {\n    if (letterSpacing === 'normal') {\n        return 0;\n    }\n    var value = parseFloat(letterSpacing);\n    return isNaN(value) ? 0 : value;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/letterSpacing.js\n// module id = 1530\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar OVERFLOW = exports.OVERFLOW = {\n    VISIBLE: 0,\n    HIDDEN: 1,\n    SCROLL: 2,\n    AUTO: 3\n};\n\nvar parseOverflow = exports.parseOverflow = function parseOverflow(overflow) {\n    switch (overflow) {\n        case 'hidden':\n            return OVERFLOW.HIDDEN;\n        case 'scroll':\n            return OVERFLOW.SCROLL;\n        case 'auto':\n            return OVERFLOW.AUTO;\n        case 'visible':\n        default:\n            return OVERFLOW.VISIBLE;\n    }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/overflow.js\n// module id = 1531\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTextShadow = undefined;\n\nvar _Color = require('../Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NUMBER = /^([+-]|\\d|\\.)$/i;\n\nvar parseTextShadow = exports.parseTextShadow = function parseTextShadow(textShadow) {\n    if (textShadow === 'none' || typeof textShadow !== 'string') {\n        return null;\n    }\n\n    var currentValue = '';\n    var isLength = false;\n    var values = [];\n    var shadows = [];\n    var numParens = 0;\n    var color = null;\n\n    var appendValue = function appendValue() {\n        if (currentValue.length) {\n            if (isLength) {\n                values.push(parseFloat(currentValue));\n            } else {\n                color = new _Color2.default(currentValue);\n            }\n        }\n        isLength = false;\n        currentValue = '';\n    };\n\n    var appendShadow = function appendShadow() {\n        if (values.length && color !== null) {\n            shadows.push({\n                color: color,\n                offsetX: values[0] || 0,\n                offsetY: values[1] || 0,\n                blur: values[2] || 0\n            });\n        }\n        values.splice(0, values.length);\n        color = null;\n    };\n\n    for (var i = 0; i < textShadow.length; i++) {\n        var c = textShadow[i];\n        switch (c) {\n            case '(':\n                currentValue += c;\n                numParens++;\n                break;\n            case ')':\n                currentValue += c;\n                numParens--;\n                break;\n            case ',':\n                if (numParens === 0) {\n                    appendValue();\n                    appendShadow();\n                } else {\n                    currentValue += c;\n                }\n                break;\n            case ' ':\n                if (numParens === 0) {\n                    appendValue();\n                } else {\n                    currentValue += c;\n                }\n                break;\n            default:\n                if (currentValue.length === 0 && NUMBER.test(c)) {\n                    isLength = true;\n                }\n                currentValue += c;\n        }\n    }\n\n    appendValue();\n    appendShadow();\n\n    if (shadows.length === 0) {\n        return null;\n    }\n\n    return shadows;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/textShadow.js\n// module id = 1532\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.parseTransform = undefined;\n\nvar _Length = require('../Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toFloat = function toFloat(s) {\n    return parseFloat(s.trim());\n};\n\nvar MATRIX = /(matrix|matrix3d)\\((.+)\\)/;\n\nvar parseTransform = exports.parseTransform = function parseTransform(style) {\n    var transform = parseTransformMatrix(style.transform || style.webkitTransform || style.mozTransform ||\n    // $FlowFixMe\n    style.msTransform ||\n    // $FlowFixMe\n    style.oTransform);\n    if (transform === null) {\n        return null;\n    }\n\n    return {\n        transform: transform,\n        transformOrigin: parseTransformOrigin(style.transformOrigin || style.webkitTransformOrigin || style.mozTransformOrigin ||\n        // $FlowFixMe\n        style.msTransformOrigin ||\n        // $FlowFixMe\n        style.oTransformOrigin)\n    };\n};\n\n// $FlowFixMe\nvar parseTransformOrigin = function parseTransformOrigin(origin) {\n    if (typeof origin !== 'string') {\n        var v = new _Length2.default('0');\n        return [v, v];\n    }\n    var values = origin.split(' ').map(_Length2.default.create);\n    return [values[0], values[1]];\n};\n\n// $FlowFixMe\nvar parseTransformMatrix = function parseTransformMatrix(transform) {\n    if (transform === 'none' || typeof transform !== 'string') {\n        return null;\n    }\n\n    var match = transform.match(MATRIX);\n    if (match) {\n        if (match[1] === 'matrix') {\n            var matrix = match[2].split(',').map(toFloat);\n            return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]];\n        } else {\n            var matrix3d = match[2].split(',').map(toFloat);\n            return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]];\n        }\n    }\n    return null;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/transform.js\n// module id = 1533\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar VISIBILITY = exports.VISIBILITY = {\n    VISIBLE: 0,\n    HIDDEN: 1,\n    COLLAPSE: 2\n};\n\nvar parseVisibility = exports.parseVisibility = function parseVisibility(visibility) {\n    switch (visibility) {\n        case 'hidden':\n            return VISIBILITY.HIDDEN;\n        case 'collapse':\n            return VISIBILITY.COLLAPSE;\n        case 'visible':\n        default:\n            return VISIBILITY.VISIBLE;\n    }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/visibility.js\n// module id = 1534\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar parseZIndex = exports.parseZIndex = function parseZIndex(zIndex) {\n    var auto = zIndex === 'auto';\n    return {\n        auto: auto,\n        order: auto ? 0 : parseInt(zIndex, 10)\n    };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/parsing/zIndex.js\n// module id = 1535\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _Path = require('./Path');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Circle = function Circle(x, y, radius) {\n    _classCallCheck(this, Circle);\n\n    this.type = _Path.PATH.CIRCLE;\n    this.x = x;\n    this.y = y;\n    this.radius = radius;\n    if (process.env.NODE_ENV !== 'production') {\n        if (isNaN(x)) {\n            console.error('Invalid x value given for Circle');\n        }\n        if (isNaN(y)) {\n            console.error('Invalid y value given for Circle');\n        }\n        if (isNaN(radius)) {\n            console.error('Invalid radius value given for Circle');\n        }\n    }\n};\n\nexports.default = Circle;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/drawing/Circle.js\n// module id = 1536\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Bounds = require('./Bounds');\n\nvar _Font = require('./Font');\n\nvar _Gradient = require('./Gradient');\n\nvar _TextContainer = require('./TextContainer');\n\nvar _TextContainer2 = _interopRequireDefault(_TextContainer);\n\nvar _background = require('./parsing/background');\n\nvar _border = require('./parsing/border');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Renderer = function () {\n    function Renderer(target, options) {\n        _classCallCheck(this, Renderer);\n\n        this.target = target;\n        this.options = options;\n        target.render(options);\n    }\n\n    _createClass(Renderer, [{\n        key: 'renderNode',\n        value: function renderNode(container) {\n            if (container.isVisible()) {\n                this.renderNodeBackgroundAndBorders(container);\n                this.renderNodeContent(container);\n            }\n        }\n    }, {\n        key: 'renderNodeContent',\n        value: function renderNodeContent(container) {\n            var _this = this;\n\n            var callback = function callback() {\n                if (container.childNodes.length) {\n                    container.childNodes.forEach(function (child) {\n                        if (child instanceof _TextContainer2.default) {\n                            var style = child.parent.style;\n                            _this.target.renderTextNode(child.bounds, style.color, style.font, style.textDecoration, style.textShadow);\n                        } else {\n                            _this.target.drawShape(child, container.style.color);\n                        }\n                    });\n                }\n\n                if (container.image) {\n                    var _image = _this.options.imageStore.get(container.image);\n                    if (_image) {\n                        var contentBox = (0, _Bounds.calculateContentBox)(container.bounds, container.style.padding, container.style.border);\n                        var _width = typeof _image.width === 'number' && _image.width > 0 ? _image.width : contentBox.width;\n                        var _height = typeof _image.height === 'number' && _image.height > 0 ? _image.height : contentBox.height;\n                        if (_width > 0 && _height > 0) {\n                            _this.target.clip([(0, _Bounds.calculatePaddingBoxPath)(container.curvedBounds)], function () {\n                                _this.target.drawImage(_image, new _Bounds.Bounds(0, 0, _width, _height), contentBox);\n                            });\n                        }\n                    }\n                }\n            };\n            var paths = container.getClipPaths();\n            if (paths.length) {\n                this.target.clip(paths, callback);\n            } else {\n                callback();\n            }\n        }\n    }, {\n        key: 'renderNodeBackgroundAndBorders',\n        value: function renderNodeBackgroundAndBorders(container) {\n            var _this2 = this;\n\n            var HAS_BACKGROUND = !container.style.background.backgroundColor.isTransparent() || container.style.background.backgroundImage.length;\n\n            var renderableBorders = container.style.border.filter(function (border) {\n                return border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent();\n            });\n\n            var callback = function callback() {\n                var backgroundPaintingArea = (0, _background.calculateBackgroungPaintingArea)(container.curvedBounds, container.style.background.backgroundClip);\n\n                if (HAS_BACKGROUND) {\n                    _this2.target.clip([backgroundPaintingArea], function () {\n                        if (!container.style.background.backgroundColor.isTransparent()) {\n                            _this2.target.fill(container.style.background.backgroundColor);\n                        }\n\n                        _this2.renderBackgroundImage(container);\n                    });\n                }\n\n                renderableBorders.forEach(function (border, side) {\n                    _this2.renderBorder(border, side, container.curvedBounds);\n                });\n            };\n\n            if (HAS_BACKGROUND || renderableBorders.length) {\n                var paths = container.parent ? container.parent.getClipPaths() : [];\n                if (paths.length) {\n                    this.target.clip(paths, callback);\n                } else {\n                    callback();\n                }\n            }\n        }\n    }, {\n        key: 'renderBackgroundImage',\n        value: function renderBackgroundImage(container) {\n            var _this3 = this;\n\n            container.style.background.backgroundImage.slice(0).reverse().forEach(function (backgroundImage) {\n                if (backgroundImage.source.method === 'url' && backgroundImage.source.args.length) {\n                    _this3.renderBackgroundRepeat(container, backgroundImage);\n                } else if (/gradient/i.test(backgroundImage.source.method)) {\n                    _this3.renderBackgroundGradient(container, backgroundImage);\n                }\n            });\n        }\n    }, {\n        key: 'renderBackgroundRepeat',\n        value: function renderBackgroundRepeat(container, background) {\n            var image = this.options.imageStore.get(background.source.args[0]);\n            if (image) {\n                var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border);\n                var backgroundImageSize = (0, _background.calculateBackgroundSize)(background, image, backgroundPositioningArea);\n                var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea);\n                var _path = (0, _background.calculateBackgroundRepeatPath)(background, position, backgroundImageSize, backgroundPositioningArea, container.bounds);\n\n                var _offsetX = Math.round(backgroundPositioningArea.left + position.x);\n                var _offsetY = Math.round(backgroundPositioningArea.top + position.y);\n                this.target.renderRepeat(_path, image, backgroundImageSize, _offsetX, _offsetY);\n            }\n        }\n    }, {\n        key: 'renderBackgroundGradient',\n        value: function renderBackgroundGradient(container, background) {\n            var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border);\n            var backgroundImageSize = (0, _background.calculateGradientBackgroundSize)(background, backgroundPositioningArea);\n            var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea);\n            var gradientBounds = new _Bounds.Bounds(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y), backgroundImageSize.width, backgroundImageSize.height);\n\n            var gradient = (0, _Gradient.parseGradient)(container, background.source, gradientBounds);\n            if (gradient) {\n                switch (gradient.type) {\n                    case _Gradient.GRADIENT_TYPE.LINEAR_GRADIENT:\n                        // $FlowFixMe\n                        this.target.renderLinearGradient(gradientBounds, gradient);\n                        break;\n                    case _Gradient.GRADIENT_TYPE.RADIAL_GRADIENT:\n                        // $FlowFixMe\n                        this.target.renderRadialGradient(gradientBounds, gradient);\n                        break;\n                }\n            }\n        }\n    }, {\n        key: 'renderBorder',\n        value: function renderBorder(border, side, curvePoints) {\n            this.target.drawShape((0, _Bounds.parsePathForBorder)(curvePoints, side), border.borderColor);\n        }\n    }, {\n        key: 'renderStack',\n        value: function renderStack(stack) {\n            var _this4 = this;\n\n            if (stack.container.isVisible()) {\n                var _opacity = stack.getOpacity();\n                if (_opacity !== this._opacity) {\n                    this.target.setOpacity(stack.getOpacity());\n                    this._opacity = _opacity;\n                }\n\n                var _transform = stack.container.style.transform;\n                if (_transform !== null) {\n                    this.target.transform(stack.container.bounds.left + _transform.transformOrigin[0].value, stack.container.bounds.top + _transform.transformOrigin[1].value, _transform.transform, function () {\n                        return _this4.renderStackContent(stack);\n                    });\n                } else {\n                    this.renderStackContent(stack);\n                }\n            }\n        }\n    }, {\n        key: 'renderStackContent',\n        value: function renderStackContent(stack) {\n            var _splitStackingContext = splitStackingContexts(stack),\n                _splitStackingContext2 = _slicedToArray(_splitStackingContext, 5),\n                negativeZIndex = _splitStackingContext2[0],\n                zeroOrAutoZIndexOrTransformedOrOpacity = _splitStackingContext2[1],\n                positiveZIndex = _splitStackingContext2[2],\n                nonPositionedFloats = _splitStackingContext2[3],\n                nonPositionedInlineLevel = _splitStackingContext2[4];\n\n            var _splitDescendants = splitDescendants(stack),\n                _splitDescendants2 = _slicedToArray(_splitDescendants, 2),\n                inlineLevel = _splitDescendants2[0],\n                nonInlineLevel = _splitDescendants2[1];\n\n            // https://www.w3.org/TR/css-position-3/#painting-order\n            // 1. the background and borders of the element forming the stacking context.\n\n\n            this.renderNodeBackgroundAndBorders(stack.container);\n            // 2. the child stacking contexts with negative stack levels (most negative first).\n            negativeZIndex.sort(sortByZIndex).forEach(this.renderStack, this);\n            // 3. For all its in-flow, non-positioned, block-level descendants in tree order:\n            this.renderNodeContent(stack.container);\n            nonInlineLevel.forEach(this.renderNode, this);\n            // 4. All non-positioned floating descendants, in tree order. For each one of these,\n            // treat the element as if it created a new stacking context, but any positioned descendants and descendants\n            // which actually create a new stacking context should be considered part of the parent stacking context,\n            // not this new one.\n            nonPositionedFloats.forEach(this.renderStack, this);\n            // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.\n            nonPositionedInlineLevel.forEach(this.renderStack, this);\n            inlineLevel.forEach(this.renderNode, this);\n            // 6. All positioned, opacity or transform descendants, in tree order that fall into the following categories:\n            //  All positioned descendants with 'z-index: auto' or 'z-index: 0', in tree order.\n            //  For those with 'z-index: auto', treat the element as if it created a new stacking context,\n            //  but any positioned descendants and descendants which actually create a new stacking context should be\n            //  considered part of the parent stacking context, not this new one. For those with 'z-index: 0',\n            //  treat the stacking context generated atomically.\n            //\n            //  All opacity descendants with opacity less than 1\n            //\n            //  All transform descendants with transform other than none\n            zeroOrAutoZIndexOrTransformedOrOpacity.forEach(this.renderStack, this);\n            // 7. Stacking contexts formed by positioned descendants with z-indices greater than or equal to 1 in z-index\n            // order (smallest first) then tree order.\n            positiveZIndex.sort(sortByZIndex).forEach(this.renderStack, this);\n        }\n    }, {\n        key: 'render',\n        value: function render(stack) {\n            var _this5 = this;\n\n            if (this.options.backgroundColor) {\n                this.target.rectangle(this.options.x, this.options.y, this.options.width, this.options.height, this.options.backgroundColor);\n            }\n            this.renderStack(stack);\n            var target = this.target.getTarget();\n            if (process.env.NODE_ENV !== 'production') {\n                return target.then(function (output) {\n                    _this5.options.logger.log('Render completed');\n                    return output;\n                });\n            }\n            return target;\n        }\n    }]);\n\n    return Renderer;\n}();\n\nexports.default = Renderer;\n\n\nvar splitDescendants = function splitDescendants(stack) {\n    var inlineLevel = [];\n    var nonInlineLevel = [];\n\n    var length = stack.children.length;\n    for (var i = 0; i < length; i++) {\n        var child = stack.children[i];\n        if (child.isInlineLevel()) {\n            inlineLevel.push(child);\n        } else {\n            nonInlineLevel.push(child);\n        }\n    }\n    return [inlineLevel, nonInlineLevel];\n};\n\nvar splitStackingContexts = function splitStackingContexts(stack) {\n    var negativeZIndex = [];\n    var zeroOrAutoZIndexOrTransformedOrOpacity = [];\n    var positiveZIndex = [];\n    var nonPositionedFloats = [];\n    var nonPositionedInlineLevel = [];\n    var length = stack.contexts.length;\n    for (var i = 0; i < length; i++) {\n        var child = stack.contexts[i];\n        if (child.container.isPositioned() || child.container.style.opacity < 1 || child.container.isTransformed()) {\n            if (child.container.style.zIndex.order < 0) {\n                negativeZIndex.push(child);\n            } else if (child.container.style.zIndex.order > 0) {\n                positiveZIndex.push(child);\n            } else {\n                zeroOrAutoZIndexOrTransformedOrOpacity.push(child);\n            }\n        } else {\n            if (child.container.isFloating()) {\n                nonPositionedFloats.push(child);\n            } else {\n                nonPositionedInlineLevel.push(child);\n            }\n        }\n    }\n    return [negativeZIndex, zeroOrAutoZIndexOrTransformedOrOpacity, positiveZIndex, nonPositionedFloats, nonPositionedInlineLevel];\n};\n\nvar sortByZIndex = function sortByZIndex(a, b) {\n    if (a.container.style.zIndex.order > b.container.style.zIndex.order) {\n        return 1;\n    } else if (a.container.style.zIndex.order < b.container.style.zIndex.order) {\n        return -1;\n    }\n\n    return a.container.index > b.container.index ? 1 : -1;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Renderer.js\n// module id = 1537\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.transformWebkitRadialGradientArgs = exports.parseGradient = exports.RadialGradient = exports.LinearGradient = exports.RADIAL_GRADIENT_SHAPE = exports.GRADIENT_TYPE = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _NodeContainer = require('./NodeContainer');\n\nvar _NodeContainer2 = _interopRequireDefault(_NodeContainer);\n\nvar _Angle = require('./Angle');\n\nvar _Color = require('./Color');\n\nvar _Color2 = _interopRequireDefault(_Color);\n\nvar _Length = require('./Length');\n\nvar _Length2 = _interopRequireDefault(_Length);\n\nvar _Util = require('./Util');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar SIDE_OR_CORNER = /^(to )?(left|top|right|bottom)( (left|top|right|bottom))?$/i;\nvar PERCENTAGE_ANGLES = /^([+-]?\\d*\\.?\\d+)% ([+-]?\\d*\\.?\\d+)%$/i;\nvar ENDS_WITH_LENGTH = /(px)|%|( 0)$/i;\nvar FROM_TO_COLORSTOP = /^(from|to|color-stop)\\((?:([\\d.]+)(%)?,\\s*)?(.+?)\\)$/i;\nvar RADIAL_SHAPE_DEFINITION = /^\\s*(circle|ellipse)?\\s*((?:([\\d.]+)(px|r?em|%)\\s*(?:([\\d.]+)(px|r?em|%))?)|closest-side|closest-corner|farthest-side|farthest-corner)?\\s*(?:at\\s*(?:(left|center|right)|([\\d.]+)(px|r?em|%))\\s+(?:(top|center|bottom)|([\\d.]+)(px|r?em|%)))?(?:\\s|$)/i;\n\nvar GRADIENT_TYPE = exports.GRADIENT_TYPE = {\n    LINEAR_GRADIENT: 0,\n    RADIAL_GRADIENT: 1\n};\n\nvar RADIAL_GRADIENT_SHAPE = exports.RADIAL_GRADIENT_SHAPE = {\n    CIRCLE: 0,\n    ELLIPSE: 1\n};\n\nvar LENGTH_FOR_POSITION = {\n    left: new _Length2.default('0%'),\n    top: new _Length2.default('0%'),\n    center: new _Length2.default('50%'),\n    right: new _Length2.default('100%'),\n    bottom: new _Length2.default('100%')\n};\n\nvar LinearGradient = exports.LinearGradient = function LinearGradient(colorStops, direction) {\n    _classCallCheck(this, LinearGradient);\n\n    this.type = GRADIENT_TYPE.LINEAR_GRADIENT;\n    this.colorStops = colorStops;\n    this.direction = direction;\n};\n\nvar RadialGradient = exports.RadialGradient = function RadialGradient(colorStops, shape, center, radius) {\n    _classCallCheck(this, RadialGradient);\n\n    this.type = GRADIENT_TYPE.RADIAL_GRADIENT;\n    this.colorStops = colorStops;\n    this.shape = shape;\n    this.center = center;\n    this.radius = radius;\n};\n\nvar parseGradient = exports.parseGradient = function parseGradient(container, _ref, bounds) {\n    var args = _ref.args,\n        method = _ref.method,\n        prefix = _ref.prefix;\n\n    if (method === 'linear-gradient') {\n        return parseLinearGradient(args, bounds, !!prefix);\n    } else if (method === 'gradient' && args[0] === 'linear') {\n        // TODO handle correct angle\n        return parseLinearGradient(['to bottom'].concat(transformObsoleteColorStops(args.slice(3))), bounds, !!prefix);\n    } else if (method === 'radial-gradient') {\n        return parseRadialGradient(container, prefix === '-webkit-' ? transformWebkitRadialGradientArgs(args) : args, bounds);\n    } else if (method === 'gradient' && args[0] === 'radial') {\n        return parseRadialGradient(container, transformObsoleteColorStops(transformWebkitRadialGradientArgs(args.slice(1))), bounds);\n    }\n};\n\nvar parseColorStops = function parseColorStops(args, firstColorStopIndex, lineLength) {\n    var colorStops = [];\n\n    for (var i = firstColorStopIndex; i < args.length; i++) {\n        var value = args[i];\n        var HAS_LENGTH = ENDS_WITH_LENGTH.test(value);\n        var lastSpaceIndex = value.lastIndexOf(' ');\n        var _color = new _Color2.default(HAS_LENGTH ? value.substring(0, lastSpaceIndex) : value);\n        var _stop = HAS_LENGTH ? new _Length2.default(value.substring(lastSpaceIndex + 1)) : i === firstColorStopIndex ? new _Length2.default('0%') : i === args.length - 1 ? new _Length2.default('100%') : null;\n        colorStops.push({ color: _color, stop: _stop });\n    }\n\n    var absoluteValuedColorStops = colorStops.map(function (_ref2) {\n        var color = _ref2.color,\n            stop = _ref2.stop;\n\n        var absoluteStop = lineLength === 0 ? 0 : stop ? stop.getAbsoluteValue(lineLength) / lineLength : null;\n\n        return {\n            color: color,\n            // $FlowFixMe\n            stop: absoluteStop\n        };\n    });\n\n    var previousColorStop = absoluteValuedColorStops[0].stop;\n    for (var _i = 0; _i < absoluteValuedColorStops.length; _i++) {\n        if (previousColorStop !== null) {\n            var _stop2 = absoluteValuedColorStops[_i].stop;\n            if (_stop2 === null) {\n                var n = _i;\n                while (absoluteValuedColorStops[n].stop === null) {\n                    n++;\n                }\n                var steps = n - _i + 1;\n                var nextColorStep = absoluteValuedColorStops[n].stop;\n                var stepSize = (nextColorStep - previousColorStop) / steps;\n                for (; _i < n; _i++) {\n                    previousColorStop = absoluteValuedColorStops[_i].stop = previousColorStop + stepSize;\n                }\n            } else {\n                previousColorStop = _stop2;\n            }\n        }\n    }\n\n    return absoluteValuedColorStops;\n};\n\nvar parseLinearGradient = function parseLinearGradient(args, bounds, hasPrefix) {\n    var angle = (0, _Angle.parseAngle)(args[0]);\n    var HAS_SIDE_OR_CORNER = SIDE_OR_CORNER.test(args[0]);\n    var HAS_DIRECTION = HAS_SIDE_OR_CORNER || angle !== null || PERCENTAGE_ANGLES.test(args[0]);\n    var direction = HAS_DIRECTION ? angle !== null ? calculateGradientDirection(\n    // if there is a prefix, the 0° angle points due East (instead of North per W3C)\n    hasPrefix ? angle - Math.PI * 0.5 : angle, bounds) : HAS_SIDE_OR_CORNER ? parseSideOrCorner(args[0], bounds) : parsePercentageAngle(args[0], bounds) : calculateGradientDirection(Math.PI, bounds);\n    var firstColorStopIndex = HAS_DIRECTION ? 1 : 0;\n\n    // TODO: Fix some inaccuracy with color stops with px values\n    var lineLength = Math.min((0, _Util.distance)(Math.abs(direction.x0) + Math.abs(direction.x1), Math.abs(direction.y0) + Math.abs(direction.y1)), bounds.width * 2, bounds.height * 2);\n\n    return new LinearGradient(parseColorStops(args, firstColorStopIndex, lineLength), direction);\n};\n\nvar parseRadialGradient = function parseRadialGradient(container, args, bounds) {\n    var m = args[0].match(RADIAL_SHAPE_DEFINITION);\n    var shape = m && (m[1] === 'circle' || // explicit shape specification\n    m[3] !== undefined && m[5] === undefined) // only one radius coordinate\n    ? RADIAL_GRADIENT_SHAPE.CIRCLE : RADIAL_GRADIENT_SHAPE.ELLIPSE;\n    var radius = {};\n    var center = {};\n\n    if (m) {\n        // Radius\n        if (m[3] !== undefined) {\n            radius.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[3], m[4]).getAbsoluteValue(bounds.width);\n        }\n\n        if (m[5] !== undefined) {\n            radius.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[5], m[6]).getAbsoluteValue(bounds.height);\n        }\n\n        // Position\n        if (m[7]) {\n            center.x = LENGTH_FOR_POSITION[m[7].toLowerCase()];\n        } else if (m[8] !== undefined) {\n            center.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[8], m[9]);\n        }\n\n        if (m[10]) {\n            center.y = LENGTH_FOR_POSITION[m[10].toLowerCase()];\n        } else if (m[11] !== undefined) {\n            center.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[11], m[12]);\n        }\n    }\n\n    var gradientCenter = {\n        x: center.x === undefined ? bounds.width / 2 : center.x.getAbsoluteValue(bounds.width),\n        y: center.y === undefined ? bounds.height / 2 : center.y.getAbsoluteValue(bounds.height)\n    };\n    var gradientRadius = calculateRadius(m && m[2] || 'farthest-corner', shape, gradientCenter, radius, bounds);\n\n    return new RadialGradient(parseColorStops(args, m ? 1 : 0, Math.min(gradientRadius.x, gradientRadius.y)), shape, gradientCenter, gradientRadius);\n};\n\nvar calculateGradientDirection = function calculateGradientDirection(radian, bounds) {\n    var width = bounds.width;\n    var height = bounds.height;\n    var HALF_WIDTH = width * 0.5;\n    var HALF_HEIGHT = height * 0.5;\n    var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\n    var HALF_LINE_LENGTH = lineLength / 2;\n\n    var x0 = HALF_WIDTH + Math.sin(radian) * HALF_LINE_LENGTH;\n    var y0 = HALF_HEIGHT - Math.cos(radian) * HALF_LINE_LENGTH;\n    var x1 = width - x0;\n    var y1 = height - y0;\n\n    return { x0: x0, x1: x1, y0: y0, y1: y1 };\n};\n\nvar parseTopRight = function parseTopRight(bounds) {\n    return Math.acos(bounds.width / 2 / ((0, _Util.distance)(bounds.width, bounds.height) / 2));\n};\n\nvar parseSideOrCorner = function parseSideOrCorner(side, bounds) {\n    switch (side) {\n        case 'bottom':\n        case 'to top':\n            return calculateGradientDirection(0, bounds);\n        case 'left':\n        case 'to right':\n            return calculateGradientDirection(Math.PI / 2, bounds);\n        case 'right':\n        case 'to left':\n            return calculateGradientDirection(3 * Math.PI / 2, bounds);\n        case 'top right':\n        case 'right top':\n        case 'to bottom left':\n        case 'to left bottom':\n            return calculateGradientDirection(Math.PI + parseTopRight(bounds), bounds);\n        case 'top left':\n        case 'left top':\n        case 'to bottom right':\n        case 'to right bottom':\n            return calculateGradientDirection(Math.PI - parseTopRight(bounds), bounds);\n        case 'bottom left':\n        case 'left bottom':\n        case 'to top right':\n        case 'to right top':\n            return calculateGradientDirection(parseTopRight(bounds), bounds);\n        case 'bottom right':\n        case 'right bottom':\n        case 'to top left':\n        case 'to left top':\n            return calculateGradientDirection(2 * Math.PI - parseTopRight(bounds), bounds);\n        case 'top':\n        case 'to bottom':\n        default:\n            return calculateGradientDirection(Math.PI, bounds);\n    }\n};\n\nvar parsePercentageAngle = function parsePercentageAngle(angle, bounds) {\n    var _angle$split$map = angle.split(' ').map(parseFloat),\n        _angle$split$map2 = _slicedToArray(_angle$split$map, 2),\n        left = _angle$split$map2[0],\n        top = _angle$split$map2[1];\n\n    var ratio = left / 100 * bounds.width / (top / 100 * bounds.height);\n\n    return calculateGradientDirection(Math.atan(isNaN(ratio) ? 1 : ratio) + Math.PI / 2, bounds);\n};\n\nvar findCorner = function findCorner(bounds, x, y, closest) {\n    var corners = [{ x: 0, y: 0 }, { x: 0, y: bounds.height }, { x: bounds.width, y: 0 }, { x: bounds.width, y: bounds.height }];\n\n    // $FlowFixMe\n    return corners.reduce(function (stat, corner) {\n        var d = (0, _Util.distance)(x - corner.x, y - corner.y);\n        if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\n            return {\n                optimumCorner: corner,\n                optimumDistance: d\n            };\n        }\n\n        return stat;\n    }, {\n        optimumDistance: closest ? Infinity : -Infinity,\n        optimumCorner: null\n    }).optimumCorner;\n};\n\nvar calculateRadius = function calculateRadius(extent, shape, center, radius, bounds) {\n    var x = center.x;\n    var y = center.y;\n    var rx = 0;\n    var ry = 0;\n\n    switch (extent) {\n        case 'closest-side':\n            // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, it exactly meets the closest side in each dimension.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.min(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                rx = Math.min(Math.abs(x), Math.abs(x - bounds.width));\n                ry = Math.min(Math.abs(y), Math.abs(y - bounds.height));\n            }\n            break;\n\n        case 'closest-corner':\n            // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\n            // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.min((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\n                var c = Math.min(Math.abs(y), Math.abs(y - bounds.height)) / Math.min(Math.abs(x), Math.abs(x - bounds.width));\n                var corner = findCorner(bounds, x, y, true);\n                rx = (0, _Util.distance)(corner.x - x, (corner.y - y) / c);\n                ry = c * rx;\n            }\n            break;\n\n        case 'farthest-side':\n            // Same as closest-side, except the ending shape is sized based on the farthest side(s)\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.max(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                rx = Math.max(Math.abs(x), Math.abs(x - bounds.width));\n                ry = Math.max(Math.abs(y), Math.abs(y - bounds.height));\n            }\n            break;\n\n        case 'farthest-corner':\n            // Same as closest-corner, except the ending shape is sized based on the farthest corner.\n            // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\n            if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) {\n                rx = ry = Math.max((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height));\n            } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) {\n                // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\n                var _c = Math.max(Math.abs(y), Math.abs(y - bounds.height)) / Math.max(Math.abs(x), Math.abs(x - bounds.width));\n                var _corner = findCorner(bounds, x, y, false);\n                rx = (0, _Util.distance)(_corner.x - x, (_corner.y - y) / _c);\n                ry = _c * rx;\n            }\n            break;\n\n        default:\n            // pixel or percentage values\n            rx = radius.x || 0;\n            ry = radius.y !== undefined ? radius.y : rx;\n            break;\n    }\n\n    return {\n        x: rx,\n        y: ry\n    };\n};\n\nvar transformWebkitRadialGradientArgs = exports.transformWebkitRadialGradientArgs = function transformWebkitRadialGradientArgs(args) {\n    var shape = '';\n    var radius = '';\n    var extent = '';\n    var position = '';\n    var idx = 0;\n\n    var POSITION = /^(left|center|right|\\d+(?:px|r?em|%)?)(?:\\s+(top|center|bottom|\\d+(?:px|r?em|%)?))?$/i;\n    var SHAPE_AND_EXTENT = /^(circle|ellipse)?\\s*(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)?$/i;\n    var RADIUS = /^\\d+(px|r?em|%)?(?:\\s+\\d+(px|r?em|%)?)?$/i;\n\n    var matchStartPosition = args[idx].match(POSITION);\n    if (matchStartPosition) {\n        idx++;\n    }\n\n    var matchShapeExtent = args[idx].match(SHAPE_AND_EXTENT);\n    if (matchShapeExtent) {\n        shape = matchShapeExtent[1] || '';\n        extent = matchShapeExtent[2] || '';\n        if (extent === 'contain') {\n            extent = 'closest-side';\n        } else if (extent === 'cover') {\n            extent = 'farthest-corner';\n        }\n        idx++;\n    }\n\n    var matchStartRadius = args[idx].match(RADIUS);\n    if (matchStartRadius) {\n        idx++;\n    }\n\n    var matchEndPosition = args[idx].match(POSITION);\n    if (matchEndPosition) {\n        idx++;\n    }\n\n    var matchEndRadius = args[idx].match(RADIUS);\n    if (matchEndRadius) {\n        idx++;\n    }\n\n    var matchPosition = matchEndPosition || matchStartPosition;\n    if (matchPosition && matchPosition[1]) {\n        position = matchPosition[1] + (/^\\d+$/.test(matchPosition[1]) ? 'px' : '');\n        if (matchPosition[2]) {\n            position += ' ' + matchPosition[2] + (/^\\d+$/.test(matchPosition[2]) ? 'px' : '');\n        }\n    }\n\n    var matchRadius = matchEndRadius || matchStartRadius;\n    if (matchRadius) {\n        radius = matchRadius[0];\n        if (!matchRadius[1]) {\n            radius += 'px';\n        }\n    }\n\n    if (position && !shape && !radius && !extent) {\n        radius = position;\n        position = '';\n    }\n\n    if (position) {\n        position = 'at ' + position;\n    }\n\n    return [[shape, extent, radius, position].filter(function (s) {\n        return !!s;\n    }).join(' ')].concat(args.slice(idx));\n};\n\nvar transformObsoleteColorStops = function transformObsoleteColorStops(args) {\n    return args.map(function (color) {\n        return color.match(FROM_TO_COLORSTOP);\n    })\n    // $FlowFixMe\n    .map(function (v, index) {\n        if (!v) {\n            return args[index];\n        }\n\n        switch (v[1]) {\n            case 'from':\n                return v[4] + ' 0%';\n            case 'to':\n                return v[4] + ' 100%';\n            case 'color-stop':\n                if (v[3] === '%') {\n                    return v[4] + ' ' + v[2];\n                }\n                return v[4] + ' ' + parseFloat(v[2]) * 100 + '%';\n        }\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Gradient.js\n// module id = 1538\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nvar ANGLE = /([+-]?\\d*\\.?\\d+)(deg|grad|rad|turn)/i;\n\nvar parseAngle = exports.parseAngle = function parseAngle(angle) {\n    var match = angle.match(ANGLE);\n\n    if (match) {\n        var value = parseFloat(match[1]);\n        switch (match[2].toLowerCase()) {\n            case 'deg':\n                return Math.PI * value / 180;\n            case 'grad':\n                return Math.PI / 200 * value;\n            case 'rad':\n                return value;\n            case 'turn':\n                return Math.PI * 2 * value;\n        }\n    }\n\n    return null;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Angle.js\n// module id = 1539\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.cloneWindow = exports.DocumentCloner = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Bounds = require('./Bounds');\n\nvar _Proxy = require('./Proxy');\n\nvar _ResourceLoader = require('./ResourceLoader');\n\nvar _ResourceLoader2 = _interopRequireDefault(_ResourceLoader);\n\nvar _Util = require('./Util');\n\nvar _background = require('./parsing/background');\n\nvar _CanvasRenderer = require('./renderer/CanvasRenderer');\n\nvar _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\n\nvar DocumentCloner = exports.DocumentCloner = function () {\n    function DocumentCloner(element, options, logger, copyInline, renderer) {\n        _classCallCheck(this, DocumentCloner);\n\n        this.referenceElement = element;\n        this.scrolledElements = [];\n        this.copyStyles = copyInline;\n        this.inlineImages = copyInline;\n        this.logger = logger;\n        this.options = options;\n        this.renderer = renderer;\n        this.resourceLoader = new _ResourceLoader2.default(options, logger, window);\n        // $FlowFixMe\n        this.documentElement = this.cloneNode(element.ownerDocument.documentElement);\n    }\n\n    _createClass(DocumentCloner, [{\n        key: 'inlineAllImages',\n        value: function inlineAllImages(node) {\n            var _this = this;\n\n            if (this.inlineImages && node) {\n                var style = node.style;\n                Promise.all((0, _background.parseBackgroundImage)(style.backgroundImage).map(function (backgroundImage) {\n                    if (backgroundImage.method === 'url') {\n                        return _this.resourceLoader.inlineImage(backgroundImage.args[0]).then(function (img) {\n                            return img && typeof img.src === 'string' ? 'url(\"' + img.src + '\")' : 'none';\n                        }).catch(function (e) {\n                            if (process.env.NODE_ENV !== 'production') {\n                                _this.logger.log('Unable to load image', e);\n                            }\n                        });\n                    }\n                    return Promise.resolve('' + backgroundImage.prefix + backgroundImage.method + '(' + backgroundImage.args.join(',') + ')');\n                })).then(function (backgroundImages) {\n                    if (backgroundImages.length > 1) {\n                        // TODO Multiple backgrounds somehow broken in Chrome\n                        style.backgroundColor = '';\n                    }\n                    style.backgroundImage = backgroundImages.join(',');\n                });\n\n                if (node instanceof HTMLImageElement) {\n                    this.resourceLoader.inlineImage(node.src).then(function (img) {\n                        if (img && node instanceof HTMLImageElement && node.parentNode) {\n                            var parentNode = node.parentNode;\n                            var clonedChild = (0, _Util.copyCSSStyles)(node.style, img.cloneNode(false));\n                            parentNode.replaceChild(clonedChild, node);\n                        }\n                    }).catch(function (e) {\n                        if (process.env.NODE_ENV !== 'production') {\n                            _this.logger.log('Unable to load image', e);\n                        }\n                    });\n                }\n            }\n        }\n    }, {\n        key: 'inlineFonts',\n        value: function inlineFonts(document) {\n            var _this2 = this;\n\n            return Promise.all(Array.from(document.styleSheets).map(function (sheet) {\n                if (sheet.href) {\n                    return fetch(sheet.href).then(function (res) {\n                        return res.text();\n                    }).then(function (text) {\n                        return createStyleSheetFontsFromText(text, sheet.href);\n                    }).catch(function (e) {\n                        if (process.env.NODE_ENV !== 'production') {\n                            _this2.logger.log('Unable to load stylesheet', e);\n                        }\n                        return [];\n                    });\n                }\n                return getSheetFonts(sheet, document);\n            })).then(function (fonts) {\n                return fonts.reduce(function (acc, font) {\n                    return acc.concat(font);\n                }, []);\n            }).then(function (fonts) {\n                return Promise.all(fonts.map(function (font) {\n                    return fetch(font.formats[0].src).then(function (response) {\n                        return response.blob();\n                    }).then(function (blob) {\n                        return new Promise(function (resolve, reject) {\n                            var reader = new FileReader();\n                            reader.onerror = reject;\n                            reader.onload = function () {\n                                // $FlowFixMe\n                                var result = reader.result;\n                                resolve(result);\n                            };\n                            reader.readAsDataURL(blob);\n                        });\n                    }).then(function (dataUri) {\n                        font.fontFace.setProperty('src', 'url(\"' + dataUri + '\")');\n                        return '@font-face {' + font.fontFace.cssText + ' ';\n                    });\n                }));\n            }).then(function (fontCss) {\n                var style = document.createElement('style');\n                style.textContent = fontCss.join('\\n');\n                _this2.documentElement.appendChild(style);\n            });\n        }\n    }, {\n        key: 'createElementClone',\n        value: function createElementClone(node) {\n            var _this3 = this;\n\n            if (this.copyStyles && node instanceof HTMLCanvasElement) {\n                var img = node.ownerDocument.createElement('img');\n                try {\n                    img.src = node.toDataURL();\n                    return img;\n                } catch (e) {\n                    if (process.env.NODE_ENV !== 'production') {\n                        this.logger.log('Unable to clone canvas contents, canvas is tainted');\n                    }\n                }\n            }\n\n            if (node instanceof HTMLIFrameElement) {\n                var tempIframe = node.cloneNode(false);\n                var iframeKey = generateIframeKey();\n                tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);\n\n                var _parseBounds = (0, _Bounds.parseBounds)(node, 0, 0),\n                    width = _parseBounds.width,\n                    height = _parseBounds.height;\n\n                this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(node, this.options).then(function (documentElement) {\n                    return _this3.renderer(documentElement, {\n                        async: _this3.options.async,\n                        allowTaint: _this3.options.allowTaint,\n                        backgroundColor: '#ffffff',\n                        canvas: null,\n                        imageTimeout: _this3.options.imageTimeout,\n                        logging: _this3.options.logging,\n                        proxy: _this3.options.proxy,\n                        removeContainer: _this3.options.removeContainer,\n                        scale: _this3.options.scale,\n                        foreignObjectRendering: _this3.options.foreignObjectRendering,\n                        target: new _CanvasRenderer2.default(),\n                        width: width,\n                        height: height,\n                        x: 0,\n                        y: 0,\n                        windowWidth: documentElement.ownerDocument.defaultView.innerWidth,\n                        windowHeight: documentElement.ownerDocument.defaultView.innerHeight,\n                        scrollX: documentElement.ownerDocument.defaultView.pageXOffset,\n                        scrollY: documentElement.ownerDocument.defaultView.pageYOffset\n                    }, _this3.logger.child(iframeKey));\n                }).then(function (canvas) {\n                    return new Promise(function (resolve, reject) {\n                        var iframeCanvas = document.createElement('img');\n                        iframeCanvas.onload = function () {\n                            return resolve(canvas);\n                        };\n                        iframeCanvas.onerror = reject;\n                        iframeCanvas.src = canvas.toDataURL();\n                        if (tempIframe.parentNode) {\n                            tempIframe.parentNode.replaceChild((0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), iframeCanvas), tempIframe);\n                        }\n                    });\n                });\n                return tempIframe;\n            }\n\n            return node.cloneNode(false);\n        }\n    }, {\n        key: 'cloneNode',\n        value: function cloneNode(node) {\n            var clone = node.nodeType === Node.TEXT_NODE ? document.createTextNode(node.nodeValue) : this.createElementClone(node);\n\n            var window = node.ownerDocument.defaultView;\n\n            if (this.referenceElement === node && clone instanceof window.HTMLElement) {\n                this.clonedReferenceElement = clone;\n            }\n\n            if (clone instanceof window.HTMLBodyElement) {\n                createPseudoHideStyles(clone);\n            }\n\n            for (var child = node.firstChild; child; child = child.nextSibling) {\n                if (child.nodeType !== Node.ELEMENT_NODE ||\n                // $FlowFixMe\n                child.nodeName !== 'SCRIPT' && !child.hasAttribute(IGNORE_ATTRIBUTE)) {\n                    if (!this.copyStyles || child.nodeName !== 'STYLE') {\n                        clone.appendChild(this.cloneNode(child));\n                    }\n                }\n            }\n            if (node instanceof window.HTMLElement && clone instanceof window.HTMLElement) {\n                this.inlineAllImages(inlinePseudoElement(node, clone, PSEUDO_BEFORE));\n                this.inlineAllImages(inlinePseudoElement(node, clone, PSEUDO_AFTER));\n                if (this.copyStyles && !(node instanceof HTMLIFrameElement)) {\n                    (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), clone);\n                }\n                this.inlineAllImages(clone);\n                if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\n                    this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);\n                }\n                switch (node.nodeName) {\n                    case 'CANVAS':\n                        if (!this.copyStyles) {\n                            cloneCanvasContents(node, clone);\n                        }\n                        break;\n                    case 'TEXTAREA':\n                    case 'SELECT':\n                        clone.value = node.value;\n                        break;\n                }\n            }\n            return clone;\n        }\n    }]);\n\n    return DocumentCloner;\n}();\n\nvar getSheetFonts = function getSheetFonts(sheet, document) {\n    // $FlowFixMe\n    return (sheet.cssRules ? Array.from(sheet.cssRules) : []).filter(function (rule) {\n        return rule.type === CSSRule.FONT_FACE_RULE;\n    }).map(function (rule) {\n        var src = (0, _background.parseBackgroundImage)(rule.style.getPropertyValue('src'));\n        var formats = [];\n        for (var i = 0; i < src.length; i++) {\n            if (src[i].method === 'url' && src[i + 1] && src[i + 1].method === 'format') {\n                var a = document.createElement('a');\n                a.href = src[i].args[0];\n                if (document.body) {\n                    document.body.appendChild(a);\n                }\n\n                var font = {\n                    src: a.href,\n                    format: src[i + 1].args[0]\n                };\n                formats.push(font);\n            }\n        }\n\n        return {\n            // TODO select correct format for browser),\n\n            formats: formats.filter(function (font) {\n                return (/^woff/i.test(font.format)\n                );\n            }),\n            fontFace: rule.style\n        };\n    }).filter(function (font) {\n        return font.formats.length;\n    });\n};\n\nvar createStyleSheetFontsFromText = function createStyleSheetFontsFromText(text, baseHref) {\n    var doc = document.implementation.createHTMLDocument('');\n    var base = document.createElement('base');\n    // $FlowFixMe\n    base.href = baseHref;\n    var style = document.createElement('style');\n\n    style.textContent = text;\n    if (doc.head) {\n        doc.head.appendChild(base);\n    }\n    if (doc.body) {\n        doc.body.appendChild(style);\n    }\n\n    return style.sheet ? getSheetFonts(style.sheet, doc) : [];\n};\n\nvar restoreOwnerScroll = function restoreOwnerScroll(ownerDocument, x, y) {\n    if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {\n        ownerDocument.defaultView.scrollTo(x, y);\n    }\n};\n\nvar cloneCanvasContents = function cloneCanvasContents(canvas, clonedCanvas) {\n    try {\n        if (clonedCanvas) {\n            clonedCanvas.width = canvas.width;\n            clonedCanvas.height = canvas.height;\n            var ctx = canvas.getContext('2d');\n            var clonedCtx = clonedCanvas.getContext('2d');\n            if (ctx) {\n                clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);\n            } else {\n                clonedCtx.drawImage(canvas, 0, 0);\n            }\n        }\n    } catch (e) {}\n};\n\nvar inlinePseudoElement = function inlinePseudoElement(node, clone, pseudoElt) {\n    var style = node.ownerDocument.defaultView.getComputedStyle(node, pseudoElt);\n    if (!style || !style.content || style.content === 'none' || style.content === '-moz-alt-content' || style.display === 'none') {\n        return;\n    }\n\n    var content = stripQuotes(style.content);\n    var image = content.match(URL_REGEXP);\n    var anonymousReplacedElement = clone.ownerDocument.createElement(image ? 'img' : 'html2canvaspseudoelement');\n    if (image) {\n        // $FlowFixMe\n        anonymousReplacedElement.src = stripQuotes(image[1]);\n    } else {\n        anonymousReplacedElement.textContent = content;\n    }\n\n    (0, _Util.copyCSSStyles)(style, anonymousReplacedElement);\n\n    anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\n    clone.className += pseudoElt === PSEUDO_BEFORE ? ' ' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE : ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;\n    if (pseudoElt === PSEUDO_BEFORE) {\n        clone.insertBefore(anonymousReplacedElement, clone.firstChild);\n    } else {\n        clone.appendChild(anonymousReplacedElement);\n    }\n\n    return anonymousReplacedElement;\n};\n\nvar stripQuotes = function stripQuotes(content) {\n    var first = content.substr(0, 1);\n    return first === content.substr(content.length - 1) && first.match(/['\"]/) ? content.substr(1, content.length - 2) : content;\n};\n\nvar URL_REGEXP = /^url\\((.+)\\)$/i;\nvar PSEUDO_BEFORE = ':before';\nvar PSEUDO_AFTER = ':after';\nvar PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';\nvar PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';\n\nvar PSEUDO_HIDE_ELEMENT_STYLE = '{\\n    content: \"\" !important;\\n    display: none !important;\\n}';\n\nvar createPseudoHideStyles = function createPseudoHideStyles(body) {\n    createStyles(body, '.' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + '\\n         .' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE);\n};\n\nvar createStyles = function createStyles(body, styles) {\n    var style = body.ownerDocument.createElement('style');\n    style.innerHTML = styles;\n    body.appendChild(style);\n};\n\nvar initNode = function initNode(_ref) {\n    var _ref2 = _slicedToArray(_ref, 3),\n        element = _ref2[0],\n        x = _ref2[1],\n        y = _ref2[2];\n\n    element.scrollLeft = x;\n    element.scrollTop = y;\n};\n\nvar generateIframeKey = function generateIframeKey() {\n    return Math.ceil(Date.now() + Math.random() * 10000000).toString(16);\n};\n\nvar DATA_URI_REGEXP = /^data:text\\/(.+);(base64)?,(.*)$/i;\n\nvar getIframeDocumentElement = function getIframeDocumentElement(node, options) {\n    try {\n        return Promise.resolve(node.contentWindow.document.documentElement);\n    } catch (e) {\n        return options.proxy ? (0, _Proxy.Proxy)(node.src, options).then(function (html) {\n            var match = html.match(DATA_URI_REGEXP);\n            if (!match) {\n                return Promise.reject();\n            }\n\n            return match[2] === 'base64' ? window.atob(decodeURIComponent(match[3])) : decodeURIComponent(match[3]);\n        }).then(function (html) {\n            return createIframeContainer(node.ownerDocument, (0, _Bounds.parseBounds)(node, 0, 0)).then(function (cloneIframeContainer) {\n                var cloneWindow = cloneIframeContainer.contentWindow;\n                var documentClone = cloneWindow.document;\n\n                documentClone.open();\n                documentClone.write(html);\n                var iframeLoad = iframeLoader(cloneIframeContainer).then(function () {\n                    return documentClone.documentElement;\n                });\n\n                documentClone.close();\n                return iframeLoad;\n            });\n        }) : Promise.reject();\n    }\n};\n\nvar createIframeContainer = function createIframeContainer(ownerDocument, bounds) {\n    var cloneIframeContainer = ownerDocument.createElement('iframe');\n\n    cloneIframeContainer.className = 'html2canvas-container';\n    cloneIframeContainer.style.visibility = 'hidden';\n    cloneIframeContainer.style.position = 'fixed';\n    cloneIframeContainer.style.left = '-10000px';\n    cloneIframeContainer.style.top = '0px';\n    cloneIframeContainer.style.border = '0';\n    cloneIframeContainer.width = bounds.width.toString();\n    cloneIframeContainer.height = bounds.height.toString();\n    cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it\n    cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');\n    if (!ownerDocument.body) {\n        return Promise.reject(process.env.NODE_ENV !== 'production' ? 'Body element not found in Document that is getting rendered' : '');\n    }\n\n    ownerDocument.body.appendChild(cloneIframeContainer);\n\n    return Promise.resolve(cloneIframeContainer);\n};\n\nvar iframeLoader = function iframeLoader(cloneIframeContainer) {\n    var cloneWindow = cloneIframeContainer.contentWindow;\n    var documentClone = cloneWindow.document;\n\n    return new Promise(function (resolve, reject) {\n        cloneWindow.onload = cloneIframeContainer.onload = documentClone.onreadystatechange = function () {\n            var interval = setInterval(function () {\n                if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {\n                    clearInterval(interval);\n                    resolve(cloneIframeContainer);\n                }\n            }, 50);\n        };\n    });\n};\n\nvar cloneWindow = exports.cloneWindow = function cloneWindow(ownerDocument, bounds, referenceElement, options, logger, renderer) {\n    var cloner = new DocumentCloner(referenceElement, options, logger, false, renderer);\n    var scrollX = ownerDocument.defaultView.pageXOffset;\n    var scrollY = ownerDocument.defaultView.pageYOffset;\n\n    return createIframeContainer(ownerDocument, bounds).then(function (cloneIframeContainer) {\n        var cloneWindow = cloneIframeContainer.contentWindow;\n        var documentClone = cloneWindow.document;\n\n        /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle\n             if window url is about:blank, we can assign the url to current by writing onto the document\n             */\n\n        var iframeLoad = iframeLoader(cloneIframeContainer).then(function () {\n            cloner.scrolledElements.forEach(initNode);\n            cloneWindow.scrollTo(bounds.left, bounds.top);\n            if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) && (cloneWindow.scrollY !== bounds.top || cloneWindow.scrollX !== bounds.left)) {\n                documentClone.documentElement.style.top = -bounds.top + 'px';\n                documentClone.documentElement.style.left = -bounds.left + 'px';\n                documentClone.documentElement.style.position = 'absolute';\n            }\n            return cloner.clonedReferenceElement instanceof cloneWindow.HTMLElement || cloner.clonedReferenceElement instanceof ownerDocument.defaultView.HTMLElement || cloner.clonedReferenceElement instanceof HTMLElement ? Promise.resolve([cloneIframeContainer, cloner.clonedReferenceElement, cloner.resourceLoader]) : Promise.reject(process.env.NODE_ENV !== 'production' ? 'Error finding the ' + referenceElement.nodeName + ' in the cloned document' : '');\n        });\n\n        documentClone.open();\n        documentClone.write('<!DOCTYPE html><html></html>');\n        // Chrome scrolls the parent document for some reason after the write to the cloned window???\n        restoreOwnerScroll(referenceElement.ownerDocument, scrollX, scrollY);\n        documentClone.replaceChild(documentClone.adoptNode(cloner.documentElement), documentClone.documentElement);\n        documentClone.close();\n\n        return iframeLoad;\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/Clone.js\n// module id = 1540\n// module chunks = 0 1","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ResourceStore = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _Feature = require('./Feature');\n\nvar _Feature2 = _interopRequireDefault(_Feature);\n\nvar _Proxy = require('./Proxy');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ResourceLoader = function () {\n    function ResourceLoader(options, logger, window) {\n        _classCallCheck(this, ResourceLoader);\n\n        this.options = options;\n        this._window = window;\n        this.origin = this.getOrigin(window.location.href);\n        this.cache = {};\n        this.logger = logger;\n        this._index = 0;\n    }\n\n    _createClass(ResourceLoader, [{\n        key: 'loadImage',\n        value: function loadImage(src) {\n            var _this = this;\n\n            if (this.hasResourceInCache(src)) {\n                return src;\n            }\n\n            if (!isSVG(src) || _Feature2.default.SUPPORT_SVG_DRAWING) {\n                if (this.options.allowTaint === true || isInlineImage(src) || this.isSameOrigin(src)) {\n                    return this.addImage(src, src, false);\n                } else if (!this.isSameOrigin(src)) {\n                    if (typeof this.options.proxy === 'string') {\n                        this.cache[src] = (0, _Proxy.Proxy)(src, this.options).then(function (src) {\n                            return _loadImage(src, _this.options.imageTimeout || 0);\n                        });\n                        return src;\n                    } else if (this.options.useCORS === true && _Feature2.default.SUPPORT_CORS_IMAGES) {\n                        return this.addImage(src, src, true);\n                    }\n                }\n            }\n        }\n    }, {\n        key: 'inlineImage',\n        value: function inlineImage(src) {\n            var _this2 = this;\n\n            if (isInlineImage(src)) {\n                return _loadImage(src, this.options.imageTimeout || 0);\n            }\n            if (this.hasResourceInCache(src)) {\n                return this.cache[src];\n            }\n            if (!this.isSameOrigin(src) && typeof this.options.proxy === 'string') {\n                return this.cache[src] = (0, _Proxy.Proxy)(src, this.options).then(function (src) {\n                    return _loadImage(src, _this2.options.imageTimeout || 0);\n                });\n            }\n\n            return this.xhrImage(src);\n        }\n    }, {\n        key: 'xhrImage',\n        value: function xhrImage(src) {\n            var _this3 = this;\n\n            this.cache[src] = new Promise(function (resolve, reject) {\n                var xhr = new XMLHttpRequest();\n                xhr.onreadystatechange = function () {\n                    if (xhr.readyState === 4) {\n                        if (xhr.status !== 200) {\n                            reject('Failed to fetch image ' + src.substring(0, 256) + ' with status code ' + xhr.status);\n                        } else {\n                            var reader = new FileReader();\n                            reader.addEventListener('load', function () {\n                                // $FlowFixMe\n                                var result = reader.result;\n                                resolve(result);\n                            }, false);\n                            reader.addEventListener('error', function (e) {\n                                return reject(e);\n                            }, false);\n                            reader.readAsDataURL(xhr.response);\n                        }\n                    }\n                };\n                xhr.responseType = 'blob';\n                if (_this3.options.imageTimeout) {\n                    var timeout = _this3.options.imageTimeout;\n                    xhr.timeout = timeout;\n                    xhr.ontimeout = function () {\n                        return reject(process.env.NODE_ENV !== 'production' ? 'Timed out (' + timeout + 'ms) fetching ' + src.substring(0, 256) : '');\n                    };\n                }\n                xhr.open('GET', src, true);\n                xhr.send();\n            }).then(function (src) {\n                return _loadImage(src, _this3.options.imageTimeout || 0);\n            });\n\n            return this.cache[src];\n        }\n    }, {\n        key: 'loadCanvas',\n        value: function loadCanvas(node) {\n            var key = String(this._index++);\n            this.cache[key] = Promise.resolve(node);\n            return key;\n        }\n    }, {\n        key: 'hasResourceInCache',\n        value: function hasResourceInCache(key) {\n            return typeof this.cache[key] !== 'undefined';\n        }\n    }, {\n        key: 'addImage',\n        value: function addImage(key, src, useCORS) {\n            var _this4 = this;\n\n            if (process.env.NODE_ENV !== 'production') {\n                this.logger.log('Added image ' + key.substring(0, 256));\n            }\n\n            var imageLoadHandler = function imageLoadHandler(supportsDataImages) {\n                return new Promise(function (resolve, reject) {\n                    var img = new Image();\n                    img.onload = function () {\n                        return resolve(img);\n                    };\n                    //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous\n                    if (!supportsDataImages || useCORS) {\n                        img.crossOrigin = 'anonymous';\n                    }\n\n                    img.onerror = reject;\n                    img.src = src;\n                    if (img.complete === true) {\n                        // Inline XML images may fail to parse, throwing an Error later on\n                        setTimeout(function () {\n                            resolve(img);\n                        }, 500);\n                    }\n                    if (_this4.options.imageTimeout) {\n                        var timeout = _this4.options.imageTimeout;\n                        setTimeout(function () {\n                            return reject(process.env.NODE_ENV !== 'production' ? 'Timed out (' + timeout + 'ms) fetching ' + src.substring(0, 256) : '');\n                        }, timeout);\n                    }\n                });\n            };\n\n            this.cache[key] = isInlineBase64Image(src) && !isSVG(src) ? // $FlowFixMe\n            _Feature2.default.SUPPORT_BASE64_DRAWING(src).then(imageLoadHandler) : imageLoadHandler(true);\n            return key;\n        }\n    }, {\n        key: 'isSameOrigin',\n        value: function isSameOrigin(url) {\n            return this.getOrigin(url) === this.origin;\n        }\n    }, {\n        key: 'getOrigin',\n        value: function getOrigin(url) {\n            var link = this._link || (this._link = this._window.document.createElement('a'));\n            link.href = url;\n            link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/\n            return link.protocol + link.hostname + link.port;\n        }\n    }, {\n        key: 'ready',\n        value: function ready() {\n            var _this5 = this;\n\n            var keys = Object.keys(this.cache);\n            var values = keys.map(function (str) {\n                return _this5.cache[str].catch(function (e) {\n                    if (process.env.NODE_ENV !== 'production') {\n                        _this5.logger.log('Unable to load image', e);\n                    }\n                    return null;\n                });\n            });\n            return Promise.all(values).then(function (images) {\n                if (process.env.NODE_ENV !== 'production') {\n                    _this5.logger.log('Finished loading ' + images.length + ' images', images);\n                }\n                return new ResourceStore(keys, images);\n            });\n        }\n    }]);\n\n    return ResourceLoader;\n}();\n\nexports.default = ResourceLoader;\n\nvar ResourceStore = exports.ResourceStore = function () {\n    function ResourceStore(keys, resources) {\n        _classCallCheck(this, ResourceStore);\n\n        this._keys = keys;\n        this._resources = resources;\n    }\n\n    _createClass(ResourceStore, [{\n        key: 'get',\n        value: function get(key) {\n            var index = this._keys.indexOf(key);\n            return index === -1 ? null : this._resources[index];\n        }\n    }]);\n\n    return ResourceStore;\n}();\n\nvar INLINE_SVG = /^data:image\\/svg\\+xml/i;\nvar INLINE_BASE64 = /^data:image\\/.*;base64,/i;\nvar INLINE_IMG = /^data:image\\/.*/i;\n\nvar isInlineImage = function isInlineImage(src) {\n    return INLINE_IMG.test(src);\n};\nvar isInlineBase64Image = function isInlineBase64Image(src) {\n    return INLINE_BASE64.test(src);\n};\n\nvar isSVG = function isSVG(src) {\n    return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src);\n};\n\nvar _loadImage = function _loadImage(src, timeout) {\n    return new Promise(function (resolve, reject) {\n        var img = new Image();\n        img.onload = function () {\n            return resolve(img);\n        };\n        img.onerror = reject;\n        img.src = src;\n        if (img.complete === true) {\n            // Inline XML images may fail to parse, throwing an Error later on\n            setTimeout(function () {\n                resolve(img);\n            }, 500);\n        }\n        if (timeout) {\n            setTimeout(function () {\n                return reject(process.env.NODE_ENV !== 'production' ? 'Timed out (' + timeout + 'ms) loading image' : '');\n            }, timeout);\n        }\n    });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html2canvas/dist/npm/ResourceLoader.js\n// module id = 1541\n// module chunks = 0 1","/*\r\n * canvg.js - Javascript SVG parser and renderer on Canvas\r\n * MIT Licensed\r\n * Gabe Lerner (gabelerner@gmail.com)\r\n * http://code.google.com/p/canvg/\r\n *\r\n * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\r\n */\r\n (function ( global, factory ) {\r\n\r\n\t'use strict';\r\n\r\n\t// export as AMD...\r\n\tif ( typeof define !== 'undefined' && define.amd ) {\r\n\t\tdefine('canvgModule', [ 'rgbcolor', 'stackblur' ], factory );\r\n\t}\r\n\r\n\t// ...or as browserify\r\n\telse if ( typeof module !== 'undefined' && module.exports ) {\r\n\t\tmodule.exports = factory( require( 'rgbcolor' ), require( 'stackblur' ) );\r\n\t}\r\n\r\n\tglobal.canvg = factory( global.RGBColor, global.stackBlur );\r\n\r\n}( typeof window !== 'undefined' ? window : this, function ( RGBColor, stackBlur ) {\r\n\r\n\t// canvg(target, s)\r\n\t// empty parameters: replace all 'svg' elements on page with 'canvas' elements\r\n\t// target: canvas element or the id of a canvas element\r\n\t// s: svg string, url to svg file, or xml document\r\n\t// opts: optional hash of options\r\n\t//\t\t ignoreMouse: true => ignore mouse events\r\n\t//\t\t ignoreAnimation: true => ignore animations\r\n\t//\t\t ignoreDimensions: true => does not try to resize canvas\r\n\t//\t\t ignoreClear: true => does not clear canvas\r\n\t//\t\t offsetX: int => draws at a x offset\r\n\t//\t\t offsetY: int => draws at a y offset\r\n\t//\t\t scaleWidth: int => scales horizontally to width\r\n\t//\t\t scaleHeight: int => scales vertically to height\r\n\t//\t\t renderCallback: function => will call the function after the first render is completed\r\n\t//\t\t forceRedraw: function => will call the function on every frame, if it returns true, will redraw\r\n\tvar canvg = function (target, s, opts) {\r\n\t\t// no parameters\r\n\t\tif (target == null && s == null && opts == null) {\r\n\t\t\tvar svgTags = document.querySelectorAll('svg');\r\n\t\t\tfor (var i=0; i<svgTags.length; i++) {\r\n\t\t\t\tvar svgTag = svgTags[i];\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = svgTag.clientWidth;\r\n\t\t\t\tc.height = svgTag.clientHeight;\r\n\t\t\t\tsvgTag.parentNode.insertBefore(c, svgTag);\r\n\t\t\t\tsvgTag.parentNode.removeChild(svgTag);\r\n\t\t\t\tvar div = document.createElement('div');\r\n\t\t\t\tdiv.appendChild(svgTag);\r\n\t\t\t\tcanvg(c, div.innerHTML);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof target == 'string') {\r\n\t\t\ttarget = document.getElementById(target);\r\n\t\t}\r\n\r\n\t\t// store class on canvas\r\n\t\tif (target.svg != null) target.svg.stop();\r\n\t\tvar svg = build(opts || {});\r\n\t\t// on i.e. 8 for flash canvas, we can't assign the property so check for it\r\n\t\tif (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == 'OBJECT')) target.svg = svg;\r\n\r\n\t\tvar ctx = target.getContext('2d');\r\n\t\tif (typeof s.documentElement != 'undefined') {\r\n\t\t\t// load from xml doc\r\n\t\t\tsvg.loadXmlDoc(ctx, s);\r\n\t\t}\r\n\t\telse if (s.substr(0,1) == '<') {\r\n\t\t\t// load from xml string\r\n\t\t\tsvg.loadXml(ctx, s);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// load from url\r\n\t\t\tsvg.load(ctx, s);\r\n\t\t}\r\n\t}\r\n\r\n\t// see https://developer.mozilla.org/en-US/docs/Web/API/Element.matches\r\n\tvar matchesSelector;\r\n\tif (typeof Element == 'undefined') {\r\n\t\t// We include this test, as otherwise IE7 will throw an error simply by\r\n\t\t// including this file, as it does not support the Element object.\r\n\t} else if (typeof Element.prototype.matches != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.matches(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.webkitMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.webkitMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.mozMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.mozMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.msMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.msMatchesSelector(selector);\r\n\t\t};\r\n\t} else if (typeof Element.prototype.oMatchesSelector != 'undefined') {\r\n\t\tmatchesSelector = function(node, selector) {\r\n\t\t\treturn node.oMatchesSelector(selector);\r\n\t\t};\r\n\t} else {\r\n\t\t// requires Sizzle: https://github.com/jquery/sizzle/wiki/Sizzle-Documentation\r\n\t\t// or jQuery: http://jquery.com/download/\r\n\t\t// or Zepto: http://zeptojs.com/#\r\n\t\t// without it, this is a ReferenceError\r\n\r\n\t\tif (typeof jQuery === 'function' || typeof Zepto === 'function') {\r\n\t\t\tmatchesSelector = function (node, selector) {\r\n\t\t\t\treturn $(node).is(selector);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (typeof matchesSelector === 'undefined') {\r\n\t\t\tmatchesSelector = Sizzle.matchesSelector;\r\n\t\t}\r\n\t}\r\n\r\n\t// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\r\n\tvar attributeRegex = /(\\[[^\\]]+\\])/g;\r\n\tvar idRegex = /(#[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar classRegex = /(\\.[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar pseudoElementRegex = /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\r\n\tvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\r\n\tvar pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\r\n\tvar elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\r\n\tfunction getSelectorSpecificity(selector) {\r\n\t\tvar typeCount = [0, 0, 0];\r\n\t\tvar findMatch = function(regex, type) {\r\n\t\t\tvar matches = selector.match(regex);\r\n\t\t\tif (matches == null) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttypeCount[type] += matches.length;\r\n\t\t\tselector = selector.replace(regex, ' ');\r\n\t\t};\r\n\r\n\t\tselector = selector.replace(/:not\\(([^\\)]*)\\)/g, '     $1 ');\r\n\t\tselector = selector.replace(/{[\\s\\S]*/gm, ' ');\r\n\t\tfindMatch(attributeRegex, 1);\r\n\t\tfindMatch(idRegex, 0);\r\n\t\tfindMatch(classRegex, 1);\r\n\t\tfindMatch(pseudoElementRegex, 2);\r\n\t\tfindMatch(pseudoClassWithBracketsRegex, 1);\r\n\t\tfindMatch(pseudoClassRegex, 1);\r\n\t\tselector = selector.replace(/[\\*\\s\\+>~]/g, ' ');\r\n\t\tselector = selector.replace(/[#\\.]/g, ' ');\r\n\t\tfindMatch(elementRegex, 2);\r\n\t\treturn typeCount.join('');\r\n\t}\r\n\r\n\tfunction build(opts) {\r\n\t\tvar svg = { opts: opts };\r\n\r\n\t\tsvg.FRAMERATE = 30;\r\n\t\tsvg.MAX_VIRTUAL_PIXELS = 30000;\r\n\r\n\t\tsvg.log = function(msg) {};\r\n\t\tif (svg.opts['log'] == true && typeof console != 'undefined') {\r\n\t\t\tsvg.log = function(msg) { console.log(msg); };\r\n\t\t};\r\n\r\n\t\t// globals\r\n\t\tsvg.init = function(ctx) {\r\n\t\t\tvar uniqueId = 0;\r\n\t\t\tsvg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId;\t};\r\n\t\t\tsvg.Definitions = {};\r\n\t\t\tsvg.Styles = {};\r\n\t\t\tsvg.StylesSpecificity = {};\r\n\t\t\tsvg.Animations = [];\r\n\t\t\tsvg.Images = [];\r\n\t\t\tsvg.ctx = ctx;\r\n\t\t\tsvg.ViewPort = new (function () {\r\n\t\t\t\tthis.viewPorts = [];\r\n\t\t\t\tthis.Clear = function() { this.viewPorts = []; }\r\n\t\t\t\tthis.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }\r\n\t\t\t\tthis.RemoveCurrent = function() { this.viewPorts.pop(); }\r\n\t\t\t\tthis.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }\r\n\t\t\t\tthis.width = function() { return this.Current().width; }\r\n\t\t\t\tthis.height = function() { return this.Current().height; }\r\n\t\t\t\tthis.ComputeSize = function(d) {\r\n\t\t\t\t\tif (d != null && typeof d == 'number') return d;\r\n\t\t\t\t\tif (d == 'x') return this.width();\r\n\t\t\t\t\tif (d == 'y') return this.height();\r\n\t\t\t\t\treturn Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tsvg.init();\r\n\r\n\t\t// images loaded\r\n\t\tsvg.ImagesLoaded = function() {\r\n\t\t\tfor (var i=0; i<svg.Images.length; i++) {\r\n\t\t\t\tif (!svg.Images[i].loaded) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// trim\r\n\t\tsvg.trim = function(s) { return s.replace(/^\\s+|\\s+$/g, ''); }\r\n\r\n\t\t// compress spaces\r\n\t\tsvg.compressSpaces = function(s) { return s.replace(/[\\s\\r\\t\\n]+/gm,' '); }\r\n\r\n\t\t// ajax\r\n\t\tsvg.ajax = function(url) {\r\n\t\t\tvar AJAX;\r\n\t\t\tif(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}\r\n\t\t\telse{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}\r\n\t\t\tif(AJAX){\r\n\t\t\t   AJAX.open('GET',url,false);\r\n\t\t\t   AJAX.send(null);\r\n\t\t\t   return AJAX.responseText;\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// parse xml\r\n\t\tsvg.parseXml = function(xml) {\r\n\t\t\tif (typeof Windows != 'undefined' && typeof Windows.Data != 'undefined' && typeof Windows.Data.Xml != 'undefined') {\r\n\t\t\t\tvar xmlDoc = new Windows.Data.Xml.Dom.XmlDocument();\r\n\t\t\t\tvar settings = new Windows.Data.Xml.Dom.XmlLoadSettings();\r\n\t\t\t\tsettings.prohibitDtd = false;\r\n\t\t\t\txmlDoc.loadXml(xml, settings);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t\telse if (window.DOMParser)\r\n\t\t\t{\r\n\t\t\t\ttry {\r\n\t\t\t\t\tvar parser = new DOMParser();\r\n\t\t\t\t\treturn parser.parseFromString(xml, 'image/svg+xml');\r\n\t\t\t\t}\r\n\t\t\t\tcatch(e){\r\n\t\t\t\t\tparser = new DOMParser();\r\n\t\t\t\t\treturn parser.parseFromString(xml, 'text/xml');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\txml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\r\n\t\t\t\tvar xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\r\n\t\t\t\txmlDoc.async = 'false';\r\n\t\t\t\txmlDoc.loadXML(xml);\r\n\t\t\t\treturn xmlDoc;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Property = function(name, value) {\r\n\t\t\tthis.name = name;\r\n\t\t\tthis.value = value;\r\n\t\t}\r\n\t\t\tsvg.Property.prototype.getValue = function() {\r\n\t\t\t\treturn this.value;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.hasValue = function() {\r\n\t\t\t\treturn (this.value != null && this.value !== '');\r\n\t\t\t}\r\n\r\n\t\t\t// return the numerical value of the property\r\n\t\t\tsvg.Property.prototype.numValue = function() {\r\n\t\t\t\tif (!this.hasValue()) return 0;\r\n\r\n\t\t\t\tvar n = parseFloat(this.value);\r\n\t\t\t\tif ((this.value + '').match(/%$/)) {\r\n\t\t\t\t\tn = n / 100.0;\r\n\t\t\t\t}\r\n\t\t\t\treturn n;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.valueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.value;\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Property.prototype.numValueOrDefault = function(def) {\r\n\t\t\t\tif (this.hasValue()) return this.numValue();\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\r\n\t\t\t// color extensions\r\n\t\t\t\t// augment the current color value with the opacity\r\n\t\t\t\tsvg.Property.prototype.addOpacity = function(opacityProp) {\r\n\t\t\t\t\tvar newValue = this.value;\r\n\t\t\t\t\tif (opacityProp.value != null && opacityProp.value != '' && typeof this.value == 'string') { // can only add opacity to colors, not patterns\r\n\t\t\t\t\t\tvar color = new RGBColor(this.value);\r\n\t\t\t\t\t\tif (color.ok) {\r\n\t\t\t\t\t\t\tnewValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new svg.Property(this.name, newValue);\r\n\t\t\t\t}\r\n\r\n\t\t\t// definition extensions\r\n\t\t\t\t// get the definition from the definitions table\r\n\t\t\t\tsvg.Property.prototype.getDefinition = function() {\r\n\t\t\t\t\tvar name = this.value.match(/#([^\\)'\"]+)/);\r\n\t\t\t\t\tif (name) { name = name[1]; }\r\n\t\t\t\t\tif (!name) { name = this.value; }\r\n\t\t\t\t\treturn svg.Definitions[name];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.isUrlDefinition = function() {\r\n\t\t\t\t\treturn this.value.indexOf('url(') == 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {\r\n\t\t\t\t\tvar def = this.getDefinition();\r\n\r\n\t\t\t\t\t// gradient\r\n\t\t\t\t\tif (def != null && def.createGradient) {\r\n\t\t\t\t\t\treturn def.createGradient(svg.ctx, e, opacityProp);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// pattern\r\n\t\t\t\t\tif (def != null && def.createPattern) {\r\n\t\t\t\t\t\tif (def.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\t\t\tvar pt = def.attribute('patternTransform');\r\n\t\t\t\t\t\t\tdef = def.getHrefAttribute().getDefinition();\r\n\t\t\t\t\t\t\tif (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn def.createPattern(svg.ctx, e);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t// length extensions\r\n\t\t\t\tsvg.Property.prototype.getDPI = function(viewPort) {\r\n\t\t\t\t\treturn 96.0; // TODO: compute?\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getEM = function(viewPort) {\r\n\t\t\t\t\tvar em = 12;\r\n\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tif (fontSize.hasValue()) em = fontSize.toPixels(viewPort);\r\n\r\n\t\t\t\t\treturn em;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsvg.Property.prototype.getUnits = function() {\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\treturn s.replace(/[0-9\\.\\-]/g,'');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get the length as pixels\r\n\t\t\t\tsvg.Property.prototype.toPixels = function(viewPort, processPercent) {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);\r\n\t\t\t\t\tif (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0;\r\n\t\t\t\t\tif (s.match(/px$/)) return this.numValue();\r\n\t\t\t\t\tif (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);\r\n\t\t\t\t\tif (s.match(/pc$/)) return this.numValue() * 15;\r\n\t\t\t\t\tif (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;\r\n\t\t\t\t\tif (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;\r\n\t\t\t\t\tif (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);\r\n\t\t\t\t\tif (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\tvar n = this.numValue();\r\n\t\t\t\t\tif (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);\r\n\t\t\t\t\treturn n;\r\n\t\t\t\t}\r\n\r\n\t\t\t// time extensions\r\n\t\t\t\t// get the time as milliseconds\r\n\t\t\t\tsvg.Property.prototype.toMilliseconds = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/s$/)) return this.numValue() * 1000;\r\n\t\t\t\t\tif (s.match(/ms$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue();\r\n\t\t\t\t}\r\n\r\n\t\t\t// angle extensions\r\n\t\t\t\t// get the angle as radians\r\n\t\t\t\tsvg.Property.prototype.toRadians = function() {\r\n\t\t\t\t\tif (!this.hasValue()) return 0;\r\n\t\t\t\t\tvar s = this.value+'';\r\n\t\t\t\t\tif (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t\tif (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0);\r\n\t\t\t\t\tif (s.match(/rad$/)) return this.numValue();\r\n\t\t\t\t\treturn this.numValue() * (Math.PI / 180.0);\r\n\t\t\t\t}\r\n\r\n\t\t\t// text extensions\r\n\t\t\t\t// get the text baseline\r\n\t\t\t\tvar textBaselineMapping = {\r\n\t\t\t\t\t'baseline': 'alphabetic',\r\n\t\t\t\t\t'before-edge': 'top',\r\n\t\t\t\t\t'text-before-edge': 'top',\r\n\t\t\t\t\t'middle': 'middle',\r\n\t\t\t\t\t'central': 'middle',\r\n\t\t\t\t\t'after-edge': 'bottom',\r\n\t\t\t\t\t'text-after-edge': 'bottom',\r\n\t\t\t\t\t'ideographic': 'ideographic',\r\n\t\t\t\t\t'alphabetic': 'alphabetic',\r\n\t\t\t\t\t'hanging': 'hanging',\r\n\t\t\t\t\t'mathematical': 'alphabetic'\r\n\t\t\t\t};\r\n\t\t\t\tsvg.Property.prototype.toTextBaseline = function () {\r\n\t\t\t\t\tif (!this.hasValue()) return null;\r\n\t\t\t\t\treturn textBaselineMapping[this.value];\r\n\t\t\t\t}\r\n\r\n\t\t// fonts\r\n\t\tsvg.Font = new (function() {\r\n\t\t\tthis.Styles = 'normal|italic|oblique|inherit';\r\n\t\t\tthis.Variants = 'normal|small-caps|inherit';\r\n\t\t\tthis.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\r\n\r\n\t\t\tthis.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\r\n\t\t\t\tvar f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tfontFamily: fontFamily || f.fontFamily,\r\n\t\t\t\t\tfontSize: fontSize || f.fontSize,\r\n\t\t\t\t\tfontStyle: fontStyle || f.fontStyle,\r\n\t\t\t\t\tfontWeight: fontWeight || f.fontWeight,\r\n\t\t\t\t\tfontVariant: fontVariant || f.fontVariant,\r\n\t\t\t\t\ttoString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Parse = function(s) {\r\n\t\t\t\tvar f = {};\r\n\t\t\t\tvar d = svg.trim(svg.compressSpaces(s || '')).split(' ');\r\n\t\t\t\tvar set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }\r\n\t\t\t\tvar ff = '';\r\n\t\t\t\tfor (var i=0; i<d.length; i++) {\r\n\t\t\t\t\tif (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }\r\n\t\t\t\t\telse if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;\t}\r\n\t\t\t\t\telse if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {\tif (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }\r\n\t\t\t\t\telse if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }\r\n\t\t\t\t\telse { if (d[i] != 'inherit') ff += d[i]; }\r\n\t\t\t\t} if (ff != '') f.fontFamily = ff;\r\n\t\t\t\treturn f;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// points and paths\r\n\t\tsvg.ToNumberArray = function(s) {\r\n\t\t\tvar a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\r\n\t\t\tfor (var i=0; i<a.length; i++) {\r\n\t\t\t\ta[i] = parseFloat(a[i]);\r\n\t\t\t}\r\n\t\t\treturn a;\r\n\t\t}\r\n\t\tsvg.Point = function(x, y) {\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t}\r\n\t\t\tsvg.Point.prototype.angleTo = function(p) {\r\n\t\t\t\treturn Math.atan2(p.y - this.y, p.x - this.x);\r\n\t\t\t}\r\n\r\n\t\t\tsvg.Point.prototype.applyTransform = function(v) {\r\n\t\t\t\tvar xp = this.x * v[0] + this.y * v[2] + v[4];\r\n\t\t\t\tvar yp = this.x * v[1] + this.y * v[3] + v[5];\r\n\t\t\t\tthis.x = xp;\r\n\t\t\t\tthis.y = yp;\r\n\t\t\t}\r\n\r\n\t\tsvg.CreatePoint = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\treturn new svg.Point(a[0], a[1]);\r\n\t\t}\r\n\t\tsvg.CreatePath = function(s) {\r\n\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\tvar path = [];\r\n\t\t\tfor (var i=0; i<a.length; i+=2) {\r\n\t\t\t\tpath.push(new svg.Point(a[i], a[i+1]));\r\n\t\t\t}\r\n\t\t\treturn path;\r\n\t\t}\r\n\r\n\t\t// bounding box\r\n\t\tsvg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want\r\n\t\t\tthis.x1 = Number.NaN;\r\n\t\t\tthis.y1 = Number.NaN;\r\n\t\t\tthis.x2 = Number.NaN;\r\n\t\t\tthis.y2 = Number.NaN;\r\n\r\n\t\t\tthis.x = function() { return this.x1; }\r\n\t\t\tthis.y = function() { return this.y1; }\r\n\t\t\tthis.width = function() { return this.x2 - this.x1; }\r\n\t\t\tthis.height = function() { return this.y2 - this.y1; }\r\n\r\n\t\t\tthis.addPoint = function(x, y) {\r\n\t\t\t\tif (x != null) {\r\n\t\t\t\t\tif (isNaN(this.x1) || isNaN(this.x2)) {\r\n\t\t\t\t\t\tthis.x1 = x;\r\n\t\t\t\t\t\tthis.x2 = x;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x < this.x1) this.x1 = x;\r\n\t\t\t\t\tif (x > this.x2) this.x2 = x;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (y != null) {\r\n\t\t\t\t\tif (isNaN(this.y1) || isNaN(this.y2)) {\r\n\t\t\t\t\t\tthis.y1 = y;\r\n\t\t\t\t\t\tthis.y2 = y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y < this.y1) this.y1 = y;\r\n\t\t\t\t\tif (y > this.y2) this.y2 = y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.addX = function(x) { this.addPoint(x, null); }\r\n\t\t\tthis.addY = function(y) { this.addPoint(null, y); }\r\n\r\n\t\t\tthis.addBoundingBox = function(bb) {\r\n\t\t\t\tthis.addPoint(bb.x1, bb.y1);\r\n\t\t\t\tthis.addPoint(bb.x2, bb.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {\r\n\t\t\t\tvar cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\r\n\t\t\t\tvar cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tvar cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\r\n\t\t\t\tthis.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,\tcp2y, p2x, p2y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\r\n\t\t\t\t// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\r\n\t\t\t\tvar p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\r\n\t\t\t\tthis.addPoint(p0[0], p0[1]);\r\n\t\t\t\tthis.addPoint(p3[0], p3[1]);\r\n\r\n\t\t\t\tfor (i=0; i<=1; i++) {\r\n\t\t\t\t\tvar f = function(t) {\r\n\t\t\t\t\t\treturn Math.pow(1-t, 3) * p0[i]\r\n\t\t\t\t\t\t+ 3 * Math.pow(1-t, 2) * t * p1[i]\r\n\t\t\t\t\t\t+ 3 * (1-t) * Math.pow(t, 2) * p2[i]\r\n\t\t\t\t\t\t+ Math.pow(t, 3) * p3[i];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\r\n\t\t\t\t\tvar a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\r\n\t\t\t\t\tvar c = 3 * p1[i] - 3 * p0[i];\r\n\r\n\t\t\t\t\tif (a == 0) {\r\n\t\t\t\t\t\tif (b == 0) continue;\r\n\t\t\t\t\t\tvar t = -c / b;\r\n\t\t\t\t\t\tif (0 < t && t < 1) {\r\n\t\t\t\t\t\t\tif (i == 0) this.addX(f(t));\r\n\t\t\t\t\t\t\tif (i == 1) this.addY(f(t));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar b2ac = Math.pow(b, 2) - 4 * c * a;\r\n\t\t\t\t\tif (b2ac < 0) continue;\r\n\t\t\t\t\tvar t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t1 && t1 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t1));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t1));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\r\n\t\t\t\t\tif (0 < t2 && t2 < 1) {\r\n\t\t\t\t\t\tif (i == 0) this.addX(f(t2));\r\n\t\t\t\t\t\tif (i == 1) this.addY(f(t2));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.isPointInBox = function(x, y) {\r\n\t\t\t\treturn (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\r\n\t\t\t}\r\n\r\n\t\t\tthis.addPoint(x1, y1);\r\n\t\t\tthis.addPoint(x2, y2);\r\n\t\t}\r\n\r\n\t\t// transforms\r\n\t\tsvg.Transform = function(v) {\r\n\t\t\tvar that = this;\r\n\t\t\tthis.Type = {}\r\n\r\n\t\t\t// translate\r\n\t\t\tthis.Type.translate = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.p.x || 0.0, this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// rotate\r\n\t\t\tthis.Type.rotate = function(s) {\r\n\t\t\t\tvar a = svg.ToNumberArray(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', a[0]);\r\n\t\t\t\tthis.cx = a[1] || 0;\r\n\t\t\t\tthis.cy = a[2] || 0;\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.translate(this.cx, this.cy);\r\n\t\t\t\t\tctx.rotate(-1.0 * this.angle.toRadians());\r\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tvar a = this.angle.toRadians();\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\r\n\t\t\t\t\tp.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\r\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.scale = function(s) {\r\n\t\t\t\tthis.p = svg.CreatePoint(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.matrix = function(s) {\r\n\t\t\t\tthis.m = svg.ToNumberArray(s);\r\n\t\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\t\tctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\r\n\t\t\t\t}\r\n\t\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\t\tvar a = this.m[0];\r\n\t\t\t\t\tvar b = this.m[2];\r\n\t\t\t\t\tvar c = this.m[4];\r\n\t\t\t\t\tvar d = this.m[1];\r\n\t\t\t\t\tvar e = this.m[3];\r\n\t\t\t\t\tvar f = this.m[5];\r\n\t\t\t\t\tvar g = 0.0;\r\n\t\t\t\t\tvar h = 0.0;\r\n\t\t\t\t\tvar i = 1.0;\r\n\t\t\t\t\tvar det = 1 / (a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g));\r\n\t\t\t\t\tctx.transform(\r\n\t\t\t\t\t\tdet*(e*i-f*h),\r\n\t\t\t\t\t\tdet*(f*g-d*i),\r\n\t\t\t\t\t\tdet*(c*h-b*i),\r\n\t\t\t\t\t\tdet*(a*i-c*g),\r\n\t\t\t\t\t\tdet*(b*f-c*e),\r\n\t\t\t\t\t\tdet*(c*d-a*f)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\t\tp.applyTransform(this.m);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.Type.SkewBase = function(s) {\r\n\t\t\t\tthis.base = that.Type.matrix;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.angle = new svg.Property('angle', s);\r\n\t\t\t}\r\n\t\t\tthis.Type.SkewBase.prototype = new this.Type.matrix;\r\n\r\n\t\t\tthis.Type.skewX = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewX.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.Type.skewY = function(s) {\r\n\t\t\t\tthis.base = that.Type.SkewBase;\r\n\t\t\t\tthis.base(s);\r\n\t\t\t\tthis.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];\r\n\t\t\t}\r\n\t\t\tthis.Type.skewY.prototype = new this.Type.SkewBase;\r\n\r\n\t\t\tthis.transforms = [];\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].apply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.unapply = function(ctx) {\r\n\t\t\t\tfor (var i=this.transforms.length-1; i>=0; i--) {\r\n\t\t\t\t\tthis.transforms[i].unapply(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.applyToPoint = function(p) {\r\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\r\n\t\t\t\t\tthis.transforms[i].applyToPoint(p);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar data = svg.trim(svg.compressSpaces(v)).replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g,') ').split(/\\s(?=[a-z])/);\r\n\t\t\tfor (var i=0; i<data.length; i++) {\r\n\t\t\t\tvar type = svg.trim(data[i].split('(')[0]);\r\n\t\t\t\tvar s = data[i].split('(')[1].replace(')','');\r\n\t\t\t\tvar transformType = this.Type[type];\r\n\t\t\t\tif (typeof transformType != 'undefined') {\r\n\t\t\t\t\tvar transform = new transformType(s);\r\n\t\t\t\t\ttransform.type = type;\r\n\t\t\t\t\tthis.transforms.push(transform);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// aspect ratio\r\n\t\tsvg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\r\n\t\t\t// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\r\n\t\t\taspectRatio = svg.compressSpaces(aspectRatio);\r\n\t\t\taspectRatio = aspectRatio.replace(/^defer\\s/,''); // ignore defer\r\n\t\t\tvar align = aspectRatio.split(' ')[0] || 'xMidYMid';\r\n\t\t\tvar meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\r\n\r\n\t\t\t// calculate scale\r\n\t\t\tvar scaleX = width / desiredWidth;\r\n\t\t\tvar scaleY = height / desiredHeight;\r\n\t\t\tvar scaleMin = Math.min(scaleX, scaleY);\r\n\t\t\tvar scaleMax = Math.max(scaleX, scaleY);\r\n\t\t\tif (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\r\n\t\t\tif (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\r\n\r\n\t\t\trefX = new svg.Property('refX', refX);\r\n\t\t\trefY = new svg.Property('refY', refY);\r\n\t\t\tif (refX.hasValue() && refY.hasValue()) {\r\n\t\t\t\tctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// align\r\n\t\t\t\tif (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0);\r\n\t\t\t\tif (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0);\r\n\t\t\t\tif (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0);\r\n\t\t\t\tif (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight);\r\n\t\t\t}\r\n\r\n\t\t\t// scale\r\n\t\t\tif (align == 'none') ctx.scale(scaleX, scaleY);\r\n\t\t\telse if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin);\r\n\t\t\telse if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax);\r\n\r\n\t\t\t// translate\r\n\t\t\tctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);\r\n\t\t}\r\n\r\n\t\t// elements\r\n\t\tsvg.Element = {}\r\n\r\n\t\tsvg.EmptyProperty = new svg.Property('EMPTY', '');\r\n\r\n\t\tsvg.Element.ElementBase = function(node) {\r\n\t\t\tthis.attributes = {};\r\n\t\t\tthis.styles = {};\r\n\t\t\tthis.stylesSpecificity = {};\r\n\t\t\tthis.children = [];\r\n\r\n\t\t\t// get or create attribute\r\n\t\t\tthis.attribute = function(name, createIfNotExists) {\r\n\t\t\t\tvar a = this.attributes[name];\r\n\t\t\t\tif (a != null) return a;\r\n\r\n\t\t\t\tif (createIfNotExists == true) { a = new svg.Property(name, ''); this.attributes[name] = a; }\r\n\t\t\t\treturn a || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getHrefAttribute = function() {\r\n\t\t\t\tfor (var a in this.attributes) {\r\n\t\t\t\t\tif (a == 'href' || a.match(/:href$/)) {\r\n\t\t\t\t\t\treturn this.attributes[a];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// get or create style, crawls up node tree\r\n\t\t\tthis.style = function(name, createIfNotExists, skipAncestors) {\r\n\t\t\t\tvar s = this.styles[name];\r\n\t\t\t\tif (s != null) return s;\r\n\r\n\t\t\t\tvar a = this.attribute(name);\r\n\t\t\t\tif (a != null && a.hasValue()) {\r\n\t\t\t\t\tthis.styles[name] = a; // move up to me to cache\r\n\t\t\t\t\treturn a;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (skipAncestors != true) {\r\n\t\t\t\t\tvar p = this.parent;\r\n\t\t\t\t\tif (p != null) {\r\n\t\t\t\t\t\tvar ps = p.style(name);\r\n\t\t\t\t\t\tif (ps != null && ps.hasValue()) {\r\n\t\t\t\t\t\t\treturn ps;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (createIfNotExists == true) { s = new svg.Property(name, ''); this.styles[name] = s; }\r\n\t\t\t\treturn s || svg.EmptyProperty;\r\n\t\t\t}\r\n\r\n\t\t\t// base render\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// don't render display=none\r\n\t\t\t\tif (this.style('display').value == 'none') return;\r\n\r\n\t\t\t\t// don't render visibility=hidden\r\n\t\t\t\tif (this.style('visibility').value == 'hidden') return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (this.style('mask').hasValue()) { // mask\r\n\t\t\t\t\tvar mask = this.style('mask').getDefinition();\r\n\t\t\t\t\tif (mask != null) mask.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('filter').hasValue()) { // filter\r\n\t\t\t\t\tvar filter = this.style('filter').getDefinition();\r\n\t\t\t\t\tif (filter != null) filter.apply(ctx, this);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\t\tthis.renderChildren(ctx);\r\n\t\t\t\t\tthis.clearContext(ctx);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\t// base set context\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base clear context\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\t// base render children\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.children[i].render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addChild = function(childNode, create) {\r\n\t\t\t\tvar child = childNode;\r\n\t\t\t\tif (create) child = svg.CreateElement(childNode);\r\n\t\t\t\tchild.parent = this;\r\n\t\t\t\tif (child.type != 'title') { this.children.push(child);\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addStylesFromStyleDefinition = function () {\r\n\t\t\t\t// add styles\r\n\t\t\t\tfor (var selector in svg.Styles) {\r\n\t\t\t\t\tif (selector[0] != '@' && matchesSelector(node, selector)) {\r\n\t\t\t\t\t\tvar styles = svg.Styles[selector];\r\n\t\t\t\t\t\tvar specificity = svg.StylesSpecificity[selector];\r\n\t\t\t\t\t\tif (styles != null) {\r\n\t\t\t\t\t\t\tfor (var name in styles) {\r\n\t\t\t\t\t\t\t\tvar existingSpecificity = this.stylesSpecificity[name];\r\n\t\t\t\t\t\t\t\tif (typeof existingSpecificity == 'undefined') {\r\n\t\t\t\t\t\t\t\t\texistingSpecificity = '000';\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (specificity > existingSpecificity) {\r\n\t\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\r\n\t\t\t\t\t\t\t\t\tthis.stylesSpecificity[name] = specificity;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// Microsoft Edge fix\r\n\t\t\tvar allUppercase = new RegExp(\"^[A-Z\\-]+$\");\r\n\t\t\tvar normalizeAttributeName = function (name) {\r\n\t\t\t\tif (allUppercase.test(name)) {\r\n\t\t\t\t\treturn name.toLowerCase();\r\n\t\t\t\t}\r\n\t\t\t\treturn name;\r\n\t\t\t};\r\n\r\n\t\t\tif (node != null && node.nodeType == 1) { //ELEMENT_NODE\r\n\t\t\t\t// add attributes\r\n\t\t\t\tfor (var i=0; i<node.attributes.length; i++) {\r\n\t\t\t\t\tvar attribute = node.attributes[i];\r\n\t\t\t\t\tvar nodeName = normalizeAttributeName(attribute.nodeName);\r\n\t\t\t\t\tthis.attributes[nodeName] = new svg.Property(nodeName, attribute.value);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addStylesFromStyleDefinition();\r\n\r\n\t\t\t\t// add inline styles\r\n\t\t\t\tif (this.attribute('style').hasValue()) {\r\n\t\t\t\t\tvar styles = this.attribute('style').value.split(';');\r\n\t\t\t\t\tfor (var i=0; i<styles.length; i++) {\r\n\t\t\t\t\t\tif (svg.trim(styles[i]) != '') {\r\n\t\t\t\t\t\t\tvar style = styles[i].split(':');\r\n\t\t\t\t\t\t\tvar name = svg.trim(style[0]);\r\n\t\t\t\t\t\t\tvar value = svg.trim(style[1]);\r\n\t\t\t\t\t\t\tthis.styles[name] = new svg.Property(name, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add id\r\n\t\t\t\tif (this.attribute('id').hasValue()) {\r\n\t\t\t\t\tif (svg.Definitions[this.attribute('id').value] == null) {\r\n\t\t\t\t\t\tsvg.Definitions[this.attribute('id').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add children\r\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\t\tvar childNode = node.childNodes[i];\r\n\t\t\t\t\tif (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE\r\n\t\t\t\t\tif (this.captureTextNodes && (childNode.nodeType == 3 || childNode.nodeType == 4)) {\r\n\t\t\t\t\t\tvar text = childNode.value || childNode.text || childNode.textContent || '';\r\n\t\t\t\t\t\tif (svg.compressSpaces(text) != '') {\r\n\t\t\t\t\t\t\tthis.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Element.RenderedElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// fill\r\n\t\t\t\tif (this.style('fill').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.fillStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('fill').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = this.style('fill');\r\n\t\t\t\t\tif (fillStyle.value == 'currentColor') fillStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (fillStyle.value != 'inherit') ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('fill-opacity').hasValue()) {\r\n\t\t\t\t\tvar fillStyle = new svg.Property('fill', ctx.fillStyle);\r\n\t\t\t\t\tfillStyle = fillStyle.addOpacity(this.style('fill-opacity'));\r\n\t\t\t\t\tctx.fillStyle = fillStyle.value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// stroke\r\n\t\t\t\tif (this.style('stroke').isUrlDefinition()) {\r\n\t\t\t\t\tvar fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));\r\n\t\t\t\t\tif (fs != null) ctx.strokeStyle = fs;\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.style('stroke').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = this.style('stroke');\r\n\t\t\t\t\tif (strokeStyle.value == 'currentColor') strokeStyle.value = this.style('color').value;\r\n\t\t\t\t\tif (strokeStyle.value != 'inherit') ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-opacity').hasValue()) {\r\n\t\t\t\t\tvar strokeStyle = new svg.Property('stroke', ctx.strokeStyle);\r\n\t\t\t\t\tstrokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));\r\n\t\t\t\t\tctx.strokeStyle = strokeStyle.value;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.style('stroke-width').hasValue()) {\r\n\t\t\t\t\tvar newLineWidth = this.style('stroke-width').toPixels();\r\n\t\t\t\t\tctx.lineWidth = newLineWidth == 0 ? 0.001 : newLineWidth; // browsers don't respect 0\r\n\t\t\t    }\r\n\t\t\t\tif (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\r\n\t\t\t\tif (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\r\n\t\t\t\tif (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\r\n\t\t\t\tif (this.style('paint-order').hasValue()) ctx.paintOrder = this.style('paint-order').value;\r\n\t\t\t\tif (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value != 'none') {\r\n\t\t\t\t\tvar gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);\r\n\t\t\t\t\tif (typeof ctx.setLineDash != 'undefined') { ctx.setLineDash(gaps); }\r\n\t\t\t\t\telse if (typeof ctx.webkitLineDash != 'undefined') { ctx.webkitLineDash = gaps; }\r\n\t\t\t\t\telse if (typeof ctx.mozDash != 'undefined' && !(gaps.length==1 && gaps[0]==0)) { ctx.mozDash = gaps; }\r\n\r\n\t\t\t\t\tvar offset = this.style('stroke-dashoffset').numValueOrDefault(1);\r\n\t\t\t\t\tif (typeof ctx.lineDashOffset != 'undefined') { ctx.lineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof ctx.webkitLineDashOffset != 'undefined') { ctx.webkitLineDashOffset = offset; }\r\n\t\t\t\t\telse if (typeof ctx.mozDashOffset != 'undefined') { ctx.mozDashOffset = offset; }\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// font\r\n\t\t\t\tif (typeof ctx.font != 'undefined') {\r\n\t\t\t\t\tctx.font = svg.Font.CreateFont(\r\n\t\t\t\t\t\tthis.style('font-style').value,\r\n\t\t\t\t\t\tthis.style('font-variant').value,\r\n\t\t\t\t\t\tthis.style('font-weight').value,\r\n\t\t\t\t\t\tthis.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '',\r\n\t\t\t\t\t\tthis.style('font-family').value).toString();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// transform\r\n\t\t\t\tif (this.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\tvar transform = new svg.Transform(this.style('transform', false, true).value);\r\n\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clip\r\n\t\t\t\tif (this.style('clip-path', false, true).hasValue()) {\r\n\t\t\t\t\tvar clip = this.style('clip-path', false, true).getDefinition();\r\n\t\t\t\t\tif (clip != null) clip.apply(ctx);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// opacity\r\n\t\t\t\tif (this.style('opacity').hasValue()) {\r\n\t\t\t\t\tctx.globalAlpha = this.style('opacity').numValue();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.PathElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\treturn new svg.BoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.path(ctx);\r\n\t\t\t\tsvg.Mouse.checkPath(this, ctx);\r\n\t\t\t\tif (ctx.fillStyle != '') {\r\n\t\t\t\t\tif (this.style('fill-rule').valueOrDefault('inherit') != 'inherit') { ctx.fill(this.style('fill-rule').value); }\r\n\t\t\t\t\telse { ctx.fill(); }\r\n\t\t\t\t}\r\n\t\t\t\tif (ctx.strokeStyle != '') ctx.stroke();\r\n\r\n\t\t\t\tvar markers = this.getMarkers();\r\n\t\t\t\tif (markers != null) {\r\n\t\t\t\t\tif (this.style('marker-start').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-start').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[0][0], markers[0][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-mid').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-mid').getDefinition();\r\n\t\t\t\t\t\tfor (var i=1;i<markers.length-1;i++) {\r\n\t\t\t\t\t\t\tmarker.render(ctx, markers[i][0], markers[i][1]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.style('marker-end').isUrlDefinition()) {\r\n\t\t\t\t\t\tvar marker = this.style('marker-end').getDefinition();\r\n\t\t\t\t\t\tmarker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\treturn this.path();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// svg element\r\n\t\tsvg.Element.svg = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseClearContext = this.clearContext;\r\n\t\t\tthis.clearContext = function(ctx) {\r\n\t\t\t\tthis.baseClearContext(ctx);\r\n\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\t// initial values and defaults\r\n\t\t\t\tctx.strokeStyle = 'rgba(0,0,0,0)';\r\n\t\t\t\tctx.lineCap = 'butt';\r\n\t\t\t\tctx.lineJoin = 'miter';\r\n\t\t\t\tctx.miterLimit = 4;\r\n\t\t\t\tif (typeof ctx.font != 'undefined' && typeof window.getComputedStyle != 'undefined') {\r\n\t\t\t\t\tctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\t// create new view port\r\n\t\t\t\tif (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;\r\n\t\t\t\tif (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;\r\n\t\t\t\tctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));\r\n\r\n\t\t\t\tvar width = svg.ViewPort.width();\r\n\t\t\t\tvar height = svg.ViewPort.height();\r\n\r\n\t\t\t\tif (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';\r\n\t\t\t\tif (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';\r\n\t\t\t\tif (typeof this.root == 'undefined') {\r\n\t\t\t\t\twidth = this.attribute('width').toPixels('x');\r\n\t\t\t\t\theight = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\t\tvar x = 0;\r\n\t\t\t\t\tvar y = 0;\r\n\t\t\t\t\tif (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\r\n\t\t\t\t\t\tx = -this.attribute('refX').toPixels('x');\r\n\t\t\t\t\t\ty = -this.attribute('refY').toPixels('y');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.attribute('overflow').valueOrDefault('hidden') != 'visible') {\r\n\t\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\t\tctx.moveTo(x, y);\r\n\t\t\t\t\t\tctx.lineTo(width, y);\r\n\t\t\t\t\t\tctx.lineTo(width, height);\r\n\t\t\t\t\t\tctx.lineTo(x, height);\r\n\t\t\t\t\t\tctx.closePath();\r\n\t\t\t\t\t\tctx.clip();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(width, height);\r\n\r\n\t\t\t\t// viewbox\r\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\r\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\r\n\t\t\t\t\tvar minX = viewBox[0];\r\n\t\t\t\t\tvar minY = viewBox[1];\r\n\t\t\t\t\twidth = viewBox[2];\r\n\t\t\t\t\theight = viewBox[3];\r\n\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.width(),\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.height(),\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tminX,\r\n\t\t\t\t\t\t\t\t\tminY,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refX').value,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('refY').value);\r\n\r\n\t\t\t\t\tsvg.ViewPort.RemoveCurrent();\r\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.svg.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// rect element\r\n\t\tsvg.Element.rect = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tif (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\r\n\t\t\t\tif (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\r\n\t\t\t\trx = Math.min(rx, width / 2.0);\r\n\t\t\t\try = Math.min(ry, height / 2.0);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(x + rx, y);\r\n\t\t\t\t\tctx.lineTo(x + width - rx, y);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\r\n\t\t\t\t\tctx.lineTo(x + width, y + height - ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\r\n\t\t\t\t\tctx.lineTo(x + rx, y + height);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\r\n\t\t\t\t\tctx.lineTo(x, y + ry);\r\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + rx, y)\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.rect.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// circle element\r\n\t\tsvg.Element.circle = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\t\t\t\tvar r = this.attribute('r').toPixels();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.arc(cx, cy, r, 0, Math.PI * 2, true);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.circle.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// ellipse element\r\n\t\tsvg.Element.ellipse = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\r\n\t\t\t\tvar rx = this.attribute('rx').toPixels('x');\r\n\t\t\t\tvar ry = this.attribute('ry').toPixels('y');\r\n\t\t\t\tvar cx = this.attribute('cx').toPixels('x');\r\n\t\t\t\tvar cy = this.attribute('cy').toPixels('y');\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(cx, cy - ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\r\n\t\t\t\t\tctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.ellipse.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// line element\r\n\t\tsvg.Element.line = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getPoints = function() {\r\n\t\t\t\treturn [\r\n\t\t\t\t\tnew svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),\r\n\t\t\t\t\tnew svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))];\r\n\t\t\t}\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar points = this.getPoints();\r\n\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\r\n\t\t\t\t\tctx.lineTo(points[1].x, points[1].y);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.getPoints();\r\n\t\t\t\tvar a = points[0].angleTo(points[1]);\r\n\t\t\t\treturn [[points[0], a], [points[1], a]];\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.line.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polyline element\r\n\t\tsvg.Element.polyline = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.points = svg.CreatePath(this.attribute('points').value);\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.beginPath();\r\n\t\t\t\t\tctx.moveTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i=1; i<this.points.length; i++) {\r\n\t\t\t\t\tbb.addPoint(this.points[i].x, this.points[i].y);\r\n\t\t\t\t\tif (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<this.points.length - 1; i++) {\r\n\t\t\t\t\tmarkers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);\r\n\t\t\t\t}\r\n\t\t\t\tif (markers.length > 0) {\r\n\t\t\t\t\tmarkers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);\r\n\t\t\t\t}\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polyline.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// polygon element\r\n\t\tsvg.Element.polygon = function(node) {\r\n\t\t\tthis.base = svg.Element.polyline;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.basePath = this.path;\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar bb = this.basePath(ctx);\r\n\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\tctx.lineTo(this.points[0].x, this.points[0].y);\r\n\t\t\t\t\tctx.closePath();\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.polygon.prototype = new svg.Element.polyline;\r\n\r\n\t\t// path element\r\n\t\tsvg.Element.path = function(node) {\r\n\t\t\tthis.base = svg.Element.PathElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar d = this.attribute('d').value;\r\n\t\t\t// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF\r\n\t\t\td = d.replace(/,/gm,' '); // get rid of all commas\r\n\t\t\t// As the end of a match can also be the start of the next match, we need to run this replace twice.\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,'$1 $2'); // suffix commands with spaces\r\n\t\t\td = d.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // prefix commands with spaces\r\n\t\t\td = d.replace(/([0-9])([+\\-])/gm,'$1 $2'); // separate digits on +- signs\r\n\t\t\t// Again, we need to run this twice to find all occurances\r\n\t\t\tfor(var i=0; i<2; i++)\r\n\t\t\t\td = d.replace(/(\\.[0-9]*)(\\.)/gm,'$1 $2'); // separate digits when they start with a comma\r\n\t\t\td = d.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax\r\n\t\t\td = svg.compressSpaces(d); // compress multiple spaces\r\n\t\t\td = svg.trim(d);\r\n\t\t\tthis.PathParser = new (function(d) {\r\n\t\t\t\tthis.tokens = d.split(' ');\r\n\r\n\t\t\t\tthis.reset = function() {\r\n\t\t\t\t\tthis.i = -1;\r\n\t\t\t\t\tthis.command = '';\r\n\t\t\t\t\tthis.previousCommand = '';\r\n\t\t\t\t\tthis.start = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.control = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.current = new svg.Point(0, 0);\r\n\t\t\t\t\tthis.points = [];\r\n\t\t\t\t\tthis.angles = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isEnd = function() {\r\n\t\t\t\t\treturn this.i >= this.tokens.length - 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isCommandOrEnd = function() {\r\n\t\t\t\t\tif (this.isEnd()) return true;\r\n\t\t\t\t\treturn this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isRelativeCommand = function() {\r\n\t\t\t\t\tswitch(this.command)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getToken = function() {\r\n\t\t\t\t\tthis.i++;\r\n\t\t\t\t\treturn this.tokens[this.i];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getScalar = function() {\r\n\t\t\t\t\treturn parseFloat(this.getToken());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.nextCommand = function() {\r\n\t\t\t\t\tthis.previousCommand = this.command;\r\n\t\t\t\t\tthis.command = this.getToken();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getPoint = function() {\r\n\t\t\t\t\tvar p = new svg.Point(this.getScalar(), this.getScalar());\r\n\t\t\t\t\treturn this.makeAbsolute(p);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsControlPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.control = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getAsCurrentPoint = function() {\r\n\t\t\t\t\tvar p = this.getPoint();\r\n\t\t\t\t\tthis.current = p;\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getReflectedControlPoint = function() {\r\n\t\t\t\t\tif (this.previousCommand.toLowerCase() != 'c' &&\r\n\t\t\t\t\t    this.previousCommand.toLowerCase() != 's' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 'q' &&\r\n\t\t\t\t\t\tthis.previousCommand.toLowerCase() != 't' ){\r\n\t\t\t\t\t\treturn this.current;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// reflect point\r\n\t\t\t\t\tvar p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.makeAbsolute = function(p) {\r\n\t\t\t\t\tif (this.isRelativeCommand()) {\r\n\t\t\t\t\t\tp.x += this.current.x;\r\n\t\t\t\t\t\tp.y += this.current.y;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn p;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarker = function(p, from, priorTo) {\r\n\t\t\t\t\t// if the last angle isn't filled in because we didn't have this point yet ...\r\n\t\t\t\t\tif (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {\r\n\t\t\t\t\t\tthis.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.addMarkerAngle(p, from == null ? null : from.angleTo(p));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.addMarkerAngle = function(p, a) {\r\n\t\t\t\t\tthis.points.push(p);\r\n\t\t\t\t\tthis.angles.push(a);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.getMarkerPoints = function() { return this.points; }\r\n\t\t\t\tthis.getMarkerAngles = function() {\r\n\t\t\t\t\tfor (var i=0; i<this.angles.length; i++) {\r\n\t\t\t\t\t\tif (this.angles[i] == null) {\r\n\t\t\t\t\t\t\tfor (var j=i+1; j<this.angles.length; j++) {\r\n\t\t\t\t\t\t\t\tif (this.angles[j] != null) {\r\n\t\t\t\t\t\t\t\t\tthis.angles[i] = this.angles[j];\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.angles;\r\n\t\t\t\t}\r\n\t\t\t})(d);\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tvar pp = this.PathParser;\r\n\t\t\t\tpp.reset();\r\n\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tif (ctx != null) ctx.beginPath();\r\n\t\t\t\twhile (!pp.isEnd()) {\r\n\t\t\t\t\tpp.nextCommand();\r\n\t\t\t\t\tswitch (pp.command) {\r\n\t\t\t\t\tcase 'M':\r\n\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\tpp.addMarker(p);\r\n\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\tif (ctx != null) ctx.moveTo(p.x, p.y);\r\n\t\t\t\t\t\tpp.start = pp.current;\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, pp.start);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'L':\r\n\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar c = pp.current;\r\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(p, c);\r\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'H':\r\n\t\t\t\t\tcase 'h':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'V':\r\n\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\r\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\r\n\t\t\t\t\t\t\tpp.current = newP;\r\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'C':\r\n\t\t\t\t\tcase 'c':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'S':\r\n\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar p1 = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\r\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Q':\r\n\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'T':\r\n\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t\tvar curr = pp.current;\r\n\t\t\t\t\t\t\tvar cntrl = pp.getReflectedControlPoint();\r\n\t\t\t\t\t\t\tpp.control = cntrl;\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\r\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'A':\r\n\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\r\n\t\t\t\t\t\t    var curr = pp.current;\r\n\t\t\t\t\t\t\tvar rx = pp.getScalar();\r\n\t\t\t\t\t\t\tvar ry = pp.getScalar();\r\n\t\t\t\t\t\t\tvar xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\r\n\t\t\t\t\t\t\tvar largeArcFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar sweepFlag = pp.getScalar();\r\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\r\n\r\n\t\t\t\t\t\t\t// Conversion from endpoint to center parameterization\r\n\t\t\t\t\t\t\t// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\r\n\t\t\t\t\t\t\t// x1', y1'\r\n\t\t\t\t\t\t\tvar currp = new svg.Point(\r\n\t\t\t\t\t\t\t\tMath.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\r\n\t\t\t\t\t\t\t\t-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// adjust radii\r\n\t\t\t\t\t\t\tvar l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);\r\n\t\t\t\t\t\t\tif (l > 1) {\r\n\t\t\t\t\t\t\t\trx *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t\try *= Math.sqrt(l);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// cx', cy'\r\n\t\t\t\t\t\t\tvar s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(\r\n\t\t\t\t\t\t\t\t((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /\r\n\t\t\t\t\t\t\t\t(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tif (isNaN(s)) s = 0;\r\n\t\t\t\t\t\t\tvar cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\r\n\t\t\t\t\t\t\t// cx, cy\r\n\t\t\t\t\t\t\tvar centp = new svg.Point(\r\n\t\t\t\t\t\t\t\t(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\r\n\t\t\t\t\t\t\t\t(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// vector magnitude\r\n\t\t\t\t\t\t\tvar m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }\r\n\t\t\t\t\t\t\t// ratio between two vectors\r\n\t\t\t\t\t\t\tvar r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }\r\n\t\t\t\t\t\t\t// angle between two vectors\r\n\t\t\t\t\t\t\tvar a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }\r\n\t\t\t\t\t\t\t// initial angle\r\n\t\t\t\t\t\t\tvar a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);\r\n\t\t\t\t\t\t\t// angle delta\r\n\t\t\t\t\t\t\tvar u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];\r\n\t\t\t\t\t\t\tvar ad = a(u, v);\r\n\t\t\t\t\t\t\tif (r(u,v) <= -1) ad = Math.PI;\r\n\t\t\t\t\t\t\tif (r(u,v) >= 1) ad = 0;\r\n\r\n\t\t\t\t\t\t\t// for markers\r\n\t\t\t\t\t\t\tvar dir = 1 - sweepFlag ? 1.0 : -1.0;\r\n\t\t\t\t\t\t\tvar ah = a1 + dir * (ad / 2.0);\r\n\t\t\t\t\t\t\tvar halfWay = new svg.Point(\r\n\t\t\t\t\t\t\t\tcentp.x + rx * Math.cos(ah),\r\n\t\t\t\t\t\t\t\tcentp.y + ry * Math.sin(ah)\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\r\n\t\t\t\t\t\t\tpp.addMarkerAngle(cp, ah - dir * Math.PI);\r\n\r\n\t\t\t\t\t\t\tbb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\r\n\t\t\t\t\t\t\tif (ctx != null) {\r\n\t\t\t\t\t\t\t\tvar r = rx > ry ? rx : ry;\r\n\t\t\t\t\t\t\t\tvar sx = rx > ry ? 1 : rx / ry;\r\n\t\t\t\t\t\t\t\tvar sy = rx > ry ? ry / rx : 1;\r\n\r\n\t\t\t\t\t\t\t\tctx.translate(centp.x, centp.y);\r\n\t\t\t\t\t\t\t\tctx.rotate(xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.scale(sx, sy);\r\n\t\t\t\t\t\t\t\tctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);\r\n\t\t\t\t\t\t\t\tctx.scale(1/sx, 1/sy);\r\n\t\t\t\t\t\t\t\tctx.rotate(-xAxisRotation);\r\n\t\t\t\t\t\t\t\tctx.translate(-centp.x, -centp.y);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'Z':\r\n\t\t\t\t\tcase 'z':\r\n\t\t\t\t\t\tif (ctx != null) ctx.closePath();\r\n\t\t\t\t\t\tpp.current = pp.start;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn bb;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMarkers = function() {\r\n\t\t\t\tvar points = this.PathParser.getMarkerPoints();\r\n\t\t\t\tvar angles = this.PathParser.getMarkerAngles();\r\n\r\n\t\t\t\tvar markers = [];\r\n\t\t\t\tfor (var i=0; i<points.length; i++) {\r\n\t\t\t\t\tmarkers.push([points[i], angles[i]]);\r\n\t\t\t\t}\r\n\t\t\t\treturn markers;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.path.prototype = new svg.Element.PathElementBase;\r\n\r\n\t\t// pattern element\r\n\t\tsvg.Element.pattern = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.createPattern = function(ctx, element) {\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x', true);\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y', true);\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', width + 'px');\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', height + 'px');\r\n\t\t\t\ttempSvg.attributes['transform'] = new svg.Property('transform', this.attribute('patternTransform').value);\r\n\t\t\t\ttempSvg.children = this.children;\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width;\r\n\t\t\t\tc.height = height;\r\n\t\t\t\tvar cctx = c.getContext('2d');\r\n\t\t\t\tif (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\r\n\t\t\t\t\tcctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));\r\n\t\t\t\t}\r\n\t\t\t\t// render 3x3 grid so when we transform there's no white space on edges\r\n\t\t\t\tfor (var x=-1; x<=1; x++) {\r\n\t\t\t\t\tfor (var y=-1; y<=1; y++) {\r\n\t\t\t\t\t\tcctx.save();\r\n\t\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', x * c.width);\r\n\t\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', y * c.height);\r\n\t\t\t\t\t\ttempSvg.render(cctx);\r\n\t\t\t\t\t\tcctx.restore();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar pattern = ctx.createPattern(c, 'repeat');\r\n\t\t\t\treturn pattern;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.pattern.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// marker element\r\n\t\tsvg.Element.marker = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseRender = this.render;\r\n\t\t\tthis.render = function(ctx, point, angle) {\r\n\t\t\t\tctx.translate(point.x, point.y);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\r\n\t\t\t\tctx.save();\r\n\r\n\t\t\t\t// render me using a temporary svg element\r\n\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\r\n\t\t\t\ttempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);\r\n\t\t\t\ttempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);\r\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);\r\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);\r\n\t\t\t\ttempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));\r\n\t\t\t\ttempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));\r\n\t\t\t\ttempSvg.children = this.children;\r\n\t\t\t\ttempSvg.render(ctx);\r\n\r\n\t\t\t\tctx.restore();\r\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);\r\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);\r\n\t\t\t\tctx.translate(-point.x, -point.y);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.marker.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// definitions element\r\n\t\tsvg.Element.defs = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NOOP\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.defs.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// base for gradients\r\n\t\tsvg.Element.GradientBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.stops = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'stop') this.stops.push(child);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getGradient = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t}\r\n\r\n\t\t\tthis.gradientUnits = function () {\r\n\t\t\t\treturn this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\r\n\t\t\t}\r\n\r\n\t\t\tthis.attributesToInherit = ['gradientUnits'];\r\n\r\n\t\t\tthis.inheritStopContainer = function (stopsContainer) {\r\n\t\t\t\tfor (var i=0; i<this.attributesToInherit.length; i++) {\r\n\t\t\t\t\tvar attributeToInherit = this.attributesToInherit[i];\r\n\t\t\t\t\tif (!this.attribute(attributeToInherit).hasValue() && stopsContainer.attribute(attributeToInherit).hasValue()) {\r\n\t\t\t\t\t\tthis.attribute(attributeToInherit, true).value = stopsContainer.attribute(attributeToInherit).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.createGradient = function(ctx, element, parentOpacityProp) {\r\n\t\t\t\tvar stopsContainer = this;\r\n\t\t\t\tif (this.getHrefAttribute().hasValue()) {\r\n\t\t\t\t\tstopsContainer = this.getHrefAttribute().getDefinition();\r\n\t\t\t\t\tthis.inheritStopContainer(stopsContainer);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar addParentOpacity = function (color) {\r\n\t\t\t\t\tif (parentOpacityProp.hasValue()) {\r\n\t\t\t\t\t\tvar p = new svg.Property('color', color);\r\n\t\t\t\t\t\treturn p.addOpacity(parentOpacityProp).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn color;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar g = this.getGradient(ctx, element);\r\n\t\t\t\tif (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);\r\n\t\t\t\tfor (var i=0; i<stopsContainer.stops.length; i++) {\r\n\t\t\t\t\tg.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.attribute('gradientTransform').hasValue()) {\r\n\t\t\t\t\t// render as transformed pattern on temporary canvas\r\n\t\t\t\t\tvar rootView = svg.ViewPort.viewPorts[0];\r\n\r\n\t\t\t\t\tvar rect = new svg.Element.rect();\r\n\t\t\t\t\trect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);\r\n\t\t\t\t\trect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\r\n\t\t\t\t\trect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\r\n\r\n\t\t\t\t\tvar group = new svg.Element.g();\r\n\t\t\t\t\tgroup.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);\r\n\t\t\t\t\tgroup.children = [ rect ];\r\n\r\n\t\t\t\t\tvar tempSvg = new svg.Element.svg();\r\n\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', 0);\r\n\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', 0);\r\n\t\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', rootView.width);\r\n\t\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', rootView.height);\r\n\t\t\t\t\ttempSvg.children = [ group ];\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = rootView.width;\r\n\t\t\t\t\tc.height = rootView.height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\ttempCtx.fillStyle = g;\r\n\t\t\t\t\ttempSvg.render(tempCtx);\r\n\t\t\t\t\treturn tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn g;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.GradientBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// linear gradient element\r\n\t\tsvg.Element.linearGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.attributesToInherit.push('x1');\r\n\t\t\tthis.attributesToInherit.push('y1');\r\n\t\t\tthis.attributesToInherit.push('x2');\r\n\t\t\tthis.attributesToInherit.push('y2');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = this.gradientUnits() == 'objectBoundingBox' ? element.getBoundingBox() : null;\r\n\r\n\t\t\t\tif (!this.attribute('x1').hasValue()\r\n\t\t\t\t && !this.attribute('y1').hasValue()\r\n\t\t\t\t && !this.attribute('x2').hasValue()\r\n\t\t\t\t && !this.attribute('y2').hasValue()) {\r\n\t\t\t\t\tthis.attribute('x1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('y1', true).value = 0;\r\n\t\t\t\t\tthis.attribute('x2', true).value = 1;\r\n\t\t\t\t\tthis.attribute('y2', true).value = 0;\r\n\t\t\t\t }\r\n\r\n\t\t\t\tvar x1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x1').numValue()\r\n\t\t\t\t\t: this.attribute('x1').toPixels('x'));\r\n\t\t\t\tvar y1 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y1').numValue()\r\n\t\t\t\t\t: this.attribute('y1').toPixels('y'));\r\n\t\t\t\tvar x2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x2').numValue()\r\n\t\t\t\t\t: this.attribute('x2').toPixels('x'));\r\n\t\t\t\tvar y2 = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y2').numValue()\r\n\t\t\t\t\t: this.attribute('y2').toPixels('y'));\r\n\r\n\t\t\t\tif (x1 == x2 && y1 == y2) return null;\r\n\t\t\t\treturn ctx.createLinearGradient(x1, y1, x2, y2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.linearGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// radial gradient element\r\n\t\tsvg.Element.radialGradient = function(node) {\r\n\t\t\tthis.base = svg.Element.GradientBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.attributesToInherit.push('cx');\r\n\t\t\tthis.attributesToInherit.push('cy');\r\n\t\t\tthis.attributesToInherit.push('r');\r\n\t\t\tthis.attributesToInherit.push('fx');\r\n\t\t\tthis.attributesToInherit.push('fy');\r\n\r\n\t\t\tthis.getGradient = function(ctx, element) {\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\r\n\t\t\t\tif (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';\r\n\t\t\t\tif (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';\r\n\r\n\t\t\t\tvar cx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('cx').numValue()\r\n\t\t\t\t\t: this.attribute('cx').toPixels('x'));\r\n\t\t\t\tvar cy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('cy').numValue()\r\n\t\t\t\t\t: this.attribute('cy').toPixels('y'));\r\n\r\n\t\t\t\tvar fx = cx;\r\n\t\t\t\tvar fy = cy;\r\n\t\t\t\tif (this.attribute('fx').hasValue()) {\r\n\t\t\t\t\tfx = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('fx').numValue()\r\n\t\t\t\t\t: this.attribute('fx').toPixels('x'));\r\n\t\t\t\t}\r\n\t\t\t\tif (this.attribute('fy').hasValue()) {\r\n\t\t\t\t\tfy = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('fy').numValue()\r\n\t\t\t\t\t: this.attribute('fy').toPixels('y'));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar r = (this.gradientUnits() == 'objectBoundingBox'\r\n\t\t\t\t\t? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\r\n\t\t\t\t\t: this.attribute('r').toPixels());\r\n\r\n\t\t\t\treturn ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.radialGradient.prototype = new svg.Element.GradientBase;\r\n\r\n\t\t// gradient stop element\r\n\t\tsvg.Element.stop = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.offset = this.attribute('offset').numValue();\r\n\t\t\tif (this.offset < 0) this.offset = 0;\r\n\t\t\tif (this.offset > 1) this.offset = 1;\r\n\r\n\t\t\tvar stopColor = this.style('stop-color', true);\r\n\t\t\tif (stopColor.value === '') stopColor.value = '#000';\r\n\t\t\tif (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity'));\r\n\t\t\tthis.color = stopColor.value;\r\n\t\t}\r\n\t\tsvg.Element.stop.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animation base element\r\n\t\tsvg.Element.AnimateBase = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tsvg.Animations.push(this);\r\n\r\n\t\t\tthis.duration = 0.0;\r\n\t\t\tthis.begin = this.attribute('begin').toMilliseconds();\r\n\t\t\tthis.maxDuration = this.begin + this.attribute('dur').toMilliseconds();\r\n\r\n\t\t\tthis.getProperty = function() {\r\n\t\t\t\tvar attributeType = this.attribute('attributeType').value;\r\n\t\t\t\tvar attributeName = this.attribute('attributeName').value;\r\n\r\n\t\t\t\tif (attributeType == 'CSS') {\r\n\t\t\t\t\treturn this.parent.style(attributeName, true);\r\n\t\t\t\t}\r\n\t\t\t\treturn this.parent.attribute(attributeName, true);\r\n\t\t\t};\r\n\r\n\t\t\tthis.initialValue = null;\r\n\t\t\tthis.initialUnits = '';\r\n\t\t\tthis.removed = false;\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\t// OVERRIDE ME!\r\n\t\t\t\treturn '';\r\n\t\t\t}\r\n\r\n\t\t\tthis.update = function(delta) {\r\n\t\t\t\t// set initial value\r\n\t\t\t\tif (this.initialValue == null) {\r\n\t\t\t\t\tthis.initialValue = this.getProperty().value;\r\n\t\t\t\t\tthis.initialUnits = this.getProperty().getUnits();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if we're past the end time\r\n\t\t\t\tif (this.duration > this.maxDuration) {\r\n\t\t\t\t\t// loop for indefinitely repeating animations\r\n\t\t\t\t\tif (this.attribute('repeatCount').value == 'indefinite'\r\n\t\t\t\t\t || this.attribute('repeatDur').value == 'indefinite') {\r\n\t\t\t\t\t\tthis.duration = 0.0\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) {\r\n\t\t\t\t\t\tthis.frozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozen = true;\r\n\t\t\t\t\t\tthis.parent.animationFrozenValue = this.getProperty().value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {\r\n\t\t\t\t\t\tthis.removed = true;\r\n\t\t\t\t\t\tthis.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.duration = this.duration + delta;\r\n\r\n\t\t\t\t// if we're past the begin time\r\n\t\t\t\tvar updated = false;\r\n\t\t\t\tif (this.begin < this.duration) {\r\n\t\t\t\t\tvar newValue = this.calcValue(); // tween\r\n\r\n\t\t\t\t\tif (this.attribute('type').hasValue()) {\r\n\t\t\t\t\t\t// for transform, etc.\r\n\t\t\t\t\t\tvar type = this.attribute('type').value;\r\n\t\t\t\t\t\tnewValue = type + '(' + newValue + ')';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.getProperty().value = newValue;\r\n\t\t\t\t\tupdated = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn updated;\r\n\t\t\t}\r\n\r\n\t\t\tthis.from = this.attribute('from');\r\n\t\t\tthis.to = this.attribute('to');\r\n\t\t\tthis.values = this.attribute('values');\r\n\t\t\tif (this.values.hasValue()) this.values.value = this.values.value.split(';');\r\n\r\n\t\t\t// fraction of duration we've covered\r\n\t\t\tthis.progress = function() {\r\n\t\t\t\tvar ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) };\r\n\t\t\t\tif (this.values.hasValue()) {\r\n\t\t\t\t\tvar p = ret.progress * (this.values.value.length - 1);\r\n\t\t\t\t\tvar lb = Math.floor(p), ub = Math.ceil(p);\r\n\t\t\t\t\tret.from = new svg.Property('from', parseFloat(this.values.value[lb]));\r\n\t\t\t\t\tret.to = new svg.Property('to', parseFloat(this.values.value[ub]));\r\n\t\t\t\t\tret.progress = (p - lb) / (ub - lb);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tret.from = this.from;\r\n\t\t\t\t\tret.to = this.to;\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.AnimateBase.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// animate element\r\n\t\tsvg.Element.animate = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;\r\n\t\t\t\treturn newValue + this.initialUnits;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animate.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate color element\r\n\t\tsvg.Element.animateColor = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\t\t\t\tvar from = new RGBColor(p.from.value);\r\n\t\t\t\tvar to = new RGBColor(p.to.value);\r\n\r\n\t\t\t\tif (from.ok && to.ok) {\r\n\t\t\t\t\t// tween color linearly\r\n\t\t\t\t\tvar r = from.r + (to.r - from.r) * p.progress;\r\n\t\t\t\t\tvar g = from.g + (to.g - from.g) * p.progress;\r\n\t\t\t\t\tvar b = from.b + (to.b - from.b) * p.progress;\r\n\t\t\t\t\treturn 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';\r\n\t\t\t\t}\r\n\t\t\t\treturn this.attribute('from').value;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateColor.prototype = new svg.Element.AnimateBase;\r\n\r\n\t\t// animate transform element\r\n\t\tsvg.Element.animateTransform = function(node) {\r\n\t\t\tthis.base = svg.Element.AnimateBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.calcValue = function() {\r\n\t\t\t\tvar p = this.progress();\r\n\r\n\t\t\t\t// tween value linearly\r\n\t\t\t\tvar from = svg.ToNumberArray(p.from.value);\r\n\t\t\t\tvar to = svg.ToNumberArray(p.to.value);\r\n\t\t\t\tvar newValue = '';\r\n\t\t\t\tfor (var i=0; i<from.length; i++) {\r\n\t\t\t\t\tnewValue += from[i] + (to[i] - from[i]) * p.progress + ' ';\r\n\t\t\t\t}\r\n\t\t\t\treturn newValue;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.animateTransform.prototype = new svg.Element.animate;\r\n\r\n\t\t// font element\r\n\t\tsvg.Element.font = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\r\n\t\t\tthis.isRTL = false;\r\n\t\t\tthis.isArabic = false;\r\n\t\t\tthis.fontFace = null;\r\n\t\t\tthis.missingGlyph = null;\r\n\t\t\tthis.glyphs = [];\r\n\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\tvar child = this.children[i];\r\n\t\t\t\tif (child.type == 'font-face') {\r\n\t\t\t\t\tthis.fontFace = child;\r\n\t\t\t\t\tif (child.style('font-family').hasValue()) {\r\n\t\t\t\t\t\tsvg.Definitions[child.style('font-family').value] = this;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (child.type == 'missing-glyph') this.missingGlyph = child;\r\n\t\t\t\telse if (child.type == 'glyph') {\r\n\t\t\t\t\tif (child.arabicForm != '') {\r\n\t\t\t\t\t\tthis.isRTL = true;\r\n\t\t\t\t\t\tthis.isArabic = true;\r\n\t\t\t\t\t\tif (typeof this.glyphs[child.unicode] == 'undefined') this.glyphs[child.unicode] = [];\r\n\t\t\t\t\t\tthis.glyphs[child.unicode][child.arabicForm] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.glyphs[child.unicode] = child;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.font.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// font-face element\r\n\t\tsvg.Element.fontface = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.ascent = this.attribute('ascent').value;\r\n\t\t\tthis.descent = this.attribute('descent').value;\r\n\t\t\tthis.unitsPerEm = this.attribute('units-per-em').numValue();\r\n\t\t}\r\n\t\tsvg.Element.fontface.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// missing-glyph element\r\n\t\tsvg.Element.missingglyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = 0;\r\n\t\t}\r\n\t\tsvg.Element.missingglyph.prototype = new svg.Element.path;\r\n\r\n\t\t// glyph element\r\n\t\tsvg.Element.glyph = function(node) {\r\n\t\t\tthis.base = svg.Element.path;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\r\n\t\t\tthis.unicode = this.attribute('unicode').value;\r\n\t\t\tthis.arabicForm = this.attribute('arabic-form').value;\r\n\t\t}\r\n\t\tsvg.Element.glyph.prototype = new svg.Element.path;\r\n\r\n\t\t// text element\r\n\t\tsvg.Element.text = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\r\n\t\t\t\tvar textBaseline = this.style('dominant-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline == null) textBaseline = this.style('alignment-baseline').toTextBaseline();\r\n\t\t\t\tif (textBaseline != null) ctx.textBaseline = textBaseline;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function () {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\treturn new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tthis.x = this.attribute('x').toPixels('x');\r\n\t\t\t\tthis.y = this.attribute('y').toPixels('y');\r\n\t\t\t\tif (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');\r\n\t\t\t\tif (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');\r\n\t\t\t\tthis.x += this.getAnchorDelta(ctx, this, 0);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tthis.renderChild(ctx, this, this, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getAnchorDelta = function (ctx, parent, startI) {\r\n\t\t\t\tvar textAnchor = this.style('text-anchor').valueOrDefault('start');\r\n\t\t\t\tif (textAnchor != 'start') {\r\n\t\t\t\t\tvar width = 0;\r\n\t\t\t\t\tfor (var i=startI; i<parent.children.length; i++) {\r\n\t\t\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\t\t\tif (i > startI && child.attribute('x').hasValue()) break; // new group\r\n\t\t\t\t\t\twidth += child.measureTextRecursive(ctx);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn -1 * (textAnchor == 'end' ? width : width / 2.0);\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChild = function(ctx, textParent, parent, i) {\r\n\t\t\t\tvar child = parent.children[i];\r\n\t\t\t\tif (child.attribute('x').hasValue()) {\r\n\t\t\t\t\tchild.x = child.attribute('x').toPixels('x') + textParent.getAnchorDelta(ctx, parent, i);\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dx').hasValue()) textParent.x += child.attribute('dx').toPixels('x');\r\n\t\t\t\t\tchild.x = textParent.x;\r\n\t\t\t\t}\r\n\t\t\t\ttextParent.x = child.x + child.measureText(ctx);\r\n\r\n\t\t\t\tif (child.attribute('y').hasValue()) {\r\n\t\t\t\t\tchild.y = child.attribute('y').toPixels('y');\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (child.attribute('dy').hasValue()) textParent.y += child.attribute('dy').toPixels('y');\r\n\t\t\t\t\tchild.y = textParent.y;\r\n\t\t\t\t}\r\n\t\t\t\ttextParent.y = child.y;\r\n\r\n\t\t\t\tchild.render(ctx);\r\n\r\n\t\t\t\tfor (var i=0; i<child.children.length; i++) {\r\n\t\t\t\t\ttextParent.renderChild(ctx, textParent, child, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.text.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// text base\r\n\t\tsvg.Element.TextElementBase = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getGlyph = function(font, text, i) {\r\n\t\t\t\tvar c = text[i];\r\n\t\t\t\tvar glyph = null;\r\n\t\t\t\tif (font.isArabic) {\r\n\t\t\t\t\tvar arabicForm = 'isolated';\r\n\t\t\t\t\tif ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';\r\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';\r\n\t\t\t\t\tif (typeof font.glyphs[c] != 'undefined') {\r\n\t\t\t\t\t\tglyph = font.glyphs[c][arabicForm];\r\n\t\t\t\t\t\tif (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tglyph = font.glyphs[c];\r\n\t\t\t\t}\r\n\t\t\t\tif (glyph == null) glyph = font.missingGlyph;\r\n\t\t\t\treturn glyph;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tvar scale = fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tctx.translate(this.x, this.y);\r\n\t\t\t\t\t\tctx.scale(scale, -scale);\r\n\t\t\t\t\t\tvar lw = ctx.lineWidth;\r\n\t\t\t\t\t\tctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);\r\n\t\t\t\t\t\tglyph.render(ctx);\r\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);\r\n\t\t\t\t\t\tctx.lineWidth = lw;\r\n\t\t\t\t\t\tctx.scale(1/scale, -1/scale);\r\n\t\t\t\t\t\tctx.translate(-this.x, -this.y);\r\n\r\n\t\t\t\t\t\tthis.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof dx[i] != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tthis.x += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif(ctx.paintOrder == \"stroke\") {\r\n\t\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// OVERRIDE ME\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureTextRecursive = function(ctx) {\r\n\t\t\t\tvar width = this.measureText(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\twidth += this.children[i].measureTextRecursive(ctx);\r\n\t\t\t\t}\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\r\n\t\t\tthis.measureText = function(ctx) {\r\n\t\t\t\tvar customFont = this.parent.style('font-family').getDefinition();\r\n\t\t\t\tif (customFont != null) {\r\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tvar measure = 0;\r\n\t\t\t\t\tvar text = this.getText();\r\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\r\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\r\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\r\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\r\n\t\t\t\t\t\tmeasure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\r\n\t\t\t\t\t\tif (typeof dx[i] != 'undefined' && !isNaN(dx[i])) {\r\n\t\t\t\t\t\t\tmeasure += dx[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn measure;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar textToMeasure = svg.compressSpaces(this.getText());\r\n\t\t\t\tif (!ctx.measureText) return textToMeasure.length * 10;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tthis.setContext(ctx);\r\n\t\t\t\tvar width = ctx.measureText(textToMeasure).width;\r\n\t\t\t\tctx.restore();\r\n\t\t\t\treturn width;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// tspan\r\n\t\tsvg.Element.tspan = function(node) {\r\n\t\t\tthis.captureTextNodes = true;\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.text = svg.compressSpaces(node.value || node.text || node.textContent || '');\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\t// if this node has children, then they own the text\r\n\t\t\t\tif (this.children.length > 0) { return ''; }\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tspan.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// tref\r\n\t\tsvg.Element.tref = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\t\t\t\tif (element != null) return element.children[0].getText();\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.tref.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// a element\r\n\t\tsvg.Element.a = function(node) {\r\n\t\t\tthis.base = svg.Element.TextElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.hasText = node.childNodes.length > 0;\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t\tif (node.childNodes[i].nodeType != 3) this.hasText = false;\r\n\t\t\t}\r\n\r\n\t\t\t// this might contain text\r\n\t\t\tthis.text = this.hasText ? node.childNodes[0].value : '';\r\n\t\t\tthis.getText = function() {\r\n\t\t\t\treturn this.text;\r\n\t\t\t}\r\n\r\n\t\t\tthis.baseRenderChildren = this.renderChildren;\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (this.hasText) {\r\n\t\t\t\t\t// render as text element\r\n\t\t\t\t\tthis.baseRenderChildren(ctx);\r\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\r\n\t\t\t\t\tsvg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y));\r\n\t\t\t\t}\r\n\t\t\t\telse if (this.children.length > 0) {\r\n\t\t\t\t\t// render as temporary group\r\n\t\t\t\t\tvar g = new svg.Element.g();\r\n\t\t\t\t\tg.children = this.children;\r\n\t\t\t\t\tg.parent = this;\r\n\t\t\t\t\tg.render(ctx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.onclick = function() {\r\n\t\t\t\twindow.open(this.getHrefAttribute().value);\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = 'pointer';\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.a.prototype = new svg.Element.TextElementBase;\r\n\r\n\t\t// image element\r\n\t\tsvg.Element.image = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar href = this.getHrefAttribute().value;\r\n\t\t\tif (href == '') { return; }\r\n\t\t\tvar isSvg = href.match(/\\.svg$/)\r\n\r\n\t\t\tsvg.Images.push(this);\r\n\t\t\tthis.loaded = false;\r\n\t\t\tif (!isSvg) {\r\n\t\t\t\tthis.img = document.createElement('img');\r\n\t\t\t\tif (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; }\r\n\t\t\t\tvar self = this;\r\n\t\t\t\tthis.img.onload = function() { self.loaded = true; }\r\n\t\t\t\tthis.img.onerror = function() { svg.log('ERROR: image \"' + href + '\" not found'); self.loaded = true; }\r\n\t\t\t\tthis.img.src = href;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.img = svg.ajax(href);\r\n\t\t\t\tthis.loaded = true;\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\tif (width == 0 || height == 0) return;\r\n\r\n\t\t\t\tctx.save();\r\n\t\t\t\tif (isSvg) {\r\n\t\t\t\t\tctx.drawSvg(this.img, x, y, width, height);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tctx.translate(x, y);\r\n\t\t\t\t\tsvg.AspectRatio(ctx,\r\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\r\n\t\t\t\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\t\t\t\tthis.img.width,\r\n\t\t\t\t\t\t\t\t\theight,\r\n\t\t\t\t\t\t\t\t\tthis.img.height,\r\n\t\t\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\t\t\t0);\r\n\t\t\t\t\tctx.drawImage(this.img, 0, 0);\r\n\t\t\t\t}\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.image.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// group element\r\n\t\tsvg.Element.g = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t}\r\n\t\t\t\treturn bb;\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.g.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// symbol element\r\n\t\tsvg.Element.symbol = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t};\r\n\t\t}\r\n\t\tsvg.Element.symbol.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// style element\r\n\t\tsvg.Element.style = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\t// text, or spaces then CDATA\r\n\t\t\tvar css = ''\r\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\r\n\t\t\t  css += node.childNodes[i].data;\r\n\t\t\t}\r\n\t\t\tcss = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, ''); // remove comments\r\n\t\t\tcss = svg.compressSpaces(css); // replace whitespace\r\n\t\t\tvar cssDefs = css.split('}');\r\n\t\t\tfor (var i=0; i<cssDefs.length; i++) {\r\n\t\t\t\tif (svg.trim(cssDefs[i]) != '') {\r\n\t\t\t\t\tvar cssDef = cssDefs[i].split('{');\r\n\t\t\t\t\tvar cssClasses = cssDef[0].split(',');\r\n\t\t\t\t\tvar cssProps = cssDef[1].split(';');\r\n\t\t\t\t\tfor (var j=0; j<cssClasses.length; j++) {\r\n\t\t\t\t\t\tvar cssClass = svg.trim(cssClasses[j]);\r\n\t\t\t\t\t\tif (cssClass != '') {\r\n\t\t\t\t\t\t\tvar props = svg.Styles[cssClass] || {};\r\n\t\t\t\t\t\t\tfor (var k=0; k<cssProps.length; k++) {\r\n\t\t\t\t\t\t\t\tvar prop = cssProps[k].indexOf(':');\r\n\t\t\t\t\t\t\t\tvar name = cssProps[k].substr(0, prop);\r\n\t\t\t\t\t\t\t\tvar value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);\r\n\t\t\t\t\t\t\t\tif (name != null && value != null) {\r\n\t\t\t\t\t\t\t\t\tprops[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsvg.Styles[cssClass] = props;\r\n\t\t\t\t\t\t\tsvg.StylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\r\n\t\t\t\t\t\t\tif (cssClass == '@font-face') {\r\n\t\t\t\t\t\t\t\tvar fontFamily = props['font-family'].value.replace(/\"/g,'');\r\n\t\t\t\t\t\t\t\tvar srcs = props['src'].value.split(',');\r\n\t\t\t\t\t\t\t\tfor (var s=0; s<srcs.length; s++) {\r\n\t\t\t\t\t\t\t\t\tif (srcs[s].indexOf('format(\"svg\")') > 0) {\r\n\t\t\t\t\t\t\t\t\t\tvar urlStart = srcs[s].indexOf('url');\r\n\t\t\t\t\t\t\t\t\t\tvar urlEnd = srcs[s].indexOf(')', urlStart);\r\n\t\t\t\t\t\t\t\t\t\tvar url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);\r\n\t\t\t\t\t\t\t\t\t\tvar doc = svg.parseXml(svg.ajax(url));\r\n\t\t\t\t\t\t\t\t\t\tvar fonts = doc.getElementsByTagName('font');\r\n\t\t\t\t\t\t\t\t\t\tfor (var f=0; f<fonts.length; f++) {\r\n\t\t\t\t\t\t\t\t\t\t\tvar font = svg.CreateElement(fonts[f]);\r\n\t\t\t\t\t\t\t\t\t\t\tsvg.Definitions[fontFamily] = font;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.style.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// use element\r\n\t\tsvg.Element.use = function(node) {\r\n\t\t\tthis.base = svg.Element.RenderedElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.baseSetContext = this.setContext;\r\n\t\t\tthis.setContext = function(ctx) {\r\n\t\t\t\tthis.baseSetContext(ctx);\r\n\t\t\t\tif (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);\r\n\t\t\t\tif (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));\r\n\t\t\t}\r\n\r\n\t\t\tvar element = this.getHrefAttribute().getDefinition();\r\n\r\n\t\t\tthis.path = function(ctx) {\r\n\t\t\t\tif (element != null) element.path(ctx);\r\n\t\t\t}\r\n\r\n\t\t\tthis.getBoundingBox = function() {\r\n\t\t\t\tif (element != null) return element.getBoundingBox();\r\n\t\t\t}\r\n\r\n\t\t\tthis.renderChildren = function(ctx) {\r\n\t\t\t\tif (element != null) {\r\n\t\t\t\t\tvar tempSvg = element;\r\n\t\t\t\t\tif (element.type == 'symbol') {\r\n\t\t\t\t\t\t// render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\r\n\t\t\t\t\t\ttempSvg = new svg.Element.svg();\r\n\t\t\t\t\t\ttempSvg.type = 'svg';\r\n\t\t\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', element.attribute('viewBox').value);\r\n\t\t\t\t\t\ttempSvg.attributes['preserveAspectRatio'] = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value);\r\n\t\t\t\t\t\ttempSvg.attributes['overflow'] = new svg.Property('overflow', element.attribute('overflow').value);\r\n\t\t\t\t\t\ttempSvg.children = element.children;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tempSvg.type == 'svg') {\r\n\t\t\t\t\t\t// if symbol or svg, inherit width/height from me\r\n\t\t\t\t\t\tif (this.attribute('width').hasValue()) tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);\r\n\t\t\t\t\t\tif (this.attribute('height').hasValue()) tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar oldParent = tempSvg.parent;\r\n\t\t\t\t\ttempSvg.parent = null;\r\n\t\t\t\t\ttempSvg.render(ctx);\r\n\t\t\t\t\ttempSvg.parent = oldParent;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.use.prototype = new svg.Element.RenderedElementBase;\r\n\r\n\t\t// mask element\r\n\t\tsvg.Element.mask = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar x = this.attribute('x').toPixels('x');\r\n\t\t\t\tvar y = this.attribute('y').toPixels('y');\r\n\t\t\t\tvar width = this.attribute('width').toPixels('x');\r\n\t\t\t\tvar height = this.attribute('height').toPixels('y');\r\n\r\n\t\t\t\tif (width == 0 && height == 0) {\r\n\t\t\t\t\tvar bb = new svg.BoundingBox();\r\n\t\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// temporarily remove mask to avoid recursion\r\n\t\t\t\tvar mask = element.attribute('mask').value;\r\n\t\t\t\telement.attribute('mask').value = '';\r\n\r\n\t\t\t\t\tvar cMask = document.createElement('canvas');\r\n\t\t\t\t\tcMask.width = x + width;\r\n\t\t\t\t\tcMask.height = y + height;\r\n\t\t\t\t\tvar maskCtx = cMask.getContext('2d');\r\n\t\t\t\t\tthis.renderChildren(maskCtx);\r\n\r\n\t\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\t\tc.width = x + width;\r\n\t\t\t\t\tc.height = y + height;\r\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\t\telement.render(tempCtx);\r\n\t\t\t\t\ttempCtx.globalCompositeOperation = 'destination-in';\r\n\t\t\t\t\ttempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\r\n\t\t\t\t\ttempCtx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t\tctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\r\n\t\t\t\t\tctx.fillRect(0, 0, x + width, y + height);\r\n\r\n\t\t\t\t// reassign mask\r\n\t\t\t\telement.attribute('mask').value = mask;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.mask.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// clip element\r\n\t\tsvg.Element.clipPath = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx) {\r\n\t\t\t\tvar oldBeginPath = CanvasRenderingContext2D.prototype.beginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = function () { };\r\n\r\n\t\t\t\tvar oldClosePath = CanvasRenderingContext2D.prototype.closePath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = function () { };\r\n\r\n\t\t\t\toldBeginPath.call(ctx);\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar child = this.children[i];\r\n\t\t\t\t\tif (typeof child.path != 'undefined') {\r\n\t\t\t\t\t\tvar transform = null;\r\n\t\t\t\t\t\tif (child.style('transform', false, true).hasValue()) {\r\n\t\t\t\t\t\t\ttransform = new svg.Transform(child.style('transform', false, true).value);\r\n\t\t\t\t\t\t\ttransform.apply(ctx);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tchild.path(ctx);\r\n\t\t\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t\t\t\tif (transform) { transform.unapply(ctx); }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\toldClosePath.call(ctx);\r\n\t\t\t\tctx.clip();\r\n\r\n\t\t\t\tCanvasRenderingContext2D.prototype.beginPath = oldBeginPath;\r\n\t\t\t\tCanvasRenderingContext2D.prototype.closePath = oldClosePath;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.clipPath.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// filters\r\n\t\tsvg.Element.filter = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, element) {\r\n\t\t\t\t// render as temp svg\r\n\t\t\t\tvar bb = element.getBoundingBox();\r\n\t\t\t\tvar x = Math.floor(bb.x1);\r\n\t\t\t\tvar y = Math.floor(bb.y1);\r\n\t\t\t\tvar width = Math.floor(bb.width());\r\n\t\t\t\tvar\theight = Math.floor(bb.height());\r\n\r\n\t\t\t\t// temporarily remove filter to avoid recursion\r\n\t\t\t\tvar filter = element.style('filter').value;\r\n\t\t\t\telement.style('filter').value = '';\r\n\r\n\t\t\t\tvar px = 0, py = 0;\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tvar efd = this.children[i].extraFilterDistance || 0;\r\n\t\t\t\t\tpx = Math.max(px, efd);\r\n\t\t\t\t\tpy = Math.max(py, efd);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar c = document.createElement('canvas');\r\n\t\t\t\tc.width = width + 2*px;\r\n\t\t\t\tc.height = height + 2*py;\r\n\t\t\t\tvar tempCtx = c.getContext('2d');\r\n\t\t\t\ttempCtx.translate(-x + px, -y + py);\r\n\t\t\t\telement.render(tempCtx);\r\n\r\n\t\t\t\t// apply filters\r\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\r\n\t\t\t\t\tif (typeof this.children[i].apply == 'function') {\r\n\t\t\t\t\t\tthis.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render on me\r\n\t\t\t\tctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);\r\n\r\n\t\t\t\t// reassign filter\r\n\t\t\t\telement.style('filter', true).value = filter;\r\n\t\t\t}\r\n\r\n\t\t\tthis.render = function(ctx) {\r\n\t\t\t\t// NO RENDER\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.filter.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feMorphology = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feMorphology.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feComposite = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// TODO: implement\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feComposite.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feColorMatrix = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tvar matrix = svg.ToNumberArray(this.attribute('values').value);\r\n\t\t\tswitch (this.attribute('type').valueOrDefault('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\r\n\t\t\t\tcase 'saturate':\r\n\t\t\t\t\tvar s = matrix[0];\r\n\t\t\t\t\tmatrix = [0.213+0.787*s,0.715-0.715*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715+0.285*s,0.072-0.072*s,0,0,\r\n\t\t\t\t\t\t\t  0.213-0.213*s,0.715-0.715*s,0.072+0.928*s,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'hueRotate':\r\n\t\t\t\t\tvar a = matrix[0] * Math.PI / 180.0;\r\n\t\t\t\t\tvar c = function (m1,m2,m3) { return m1 + Math.cos(a)*m2 + Math.sin(a)*m3; };\r\n\t\t\t\t\tmatrix = [c(0.213,0.787,-0.213),c(0.715,-0.715,-0.715),c(0.072,-0.072,0.928),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,0.143),c(0.715,0.285,0.140),c(0.072,-0.072,-0.283),0,0,\r\n\t\t\t\t\t\t\t  c(0.213,-0.213,-0.787),c(0.715,-0.715,0.715),c(0.072,0.928,0.072),0,0,\r\n\t\t\t\t\t\t\t  0,0,0,1,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'luminanceToAlpha':\r\n\t\t\t\t\tmatrix = [0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,0,\r\n\t\t\t\t\t\t\t  0.2125,0.7154,0.0721,0,0,\r\n\t\t\t\t\t\t\t  0,0,0,0,1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tfunction imGet(img, x, y, width, height, rgba) {\r\n\t\t\t\treturn img[y*width*4 + x*4 + rgba];\r\n\t\t\t}\r\n\r\n\t\t\tfunction imSet(img, x, y, width, height, rgba, val) {\r\n\t\t\t\timg[y*width*4 + x*4 + rgba] = val;\r\n\t\t\t}\r\n\r\n\t\t\tfunction m(i, v) {\r\n\t\t\t\tvar mi = matrix[i];\r\n\t\t\t\treturn mi * (mi < 0 ? v - 255 : v);\r\n\t\t\t}\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\t// assuming x==0 && y==0 for now\r\n\t\t\t\tvar srcData = ctx.getImageData(0, 0, width, height);\r\n\t\t\t\tfor (var y = 0; y < height; y++) {\r\n\t\t\t\t\tfor (var x = 0; x < width; x++) {\r\n\t\t\t\t\t\tvar r = imGet(srcData.data, x, y, width, height, 0);\r\n\t\t\t\t\t\tvar g = imGet(srcData.data, x, y, width, height, 1);\r\n\t\t\t\t\t\tvar b = imGet(srcData.data, x, y, width, height, 2);\r\n\t\t\t\t\t\tvar a = imGet(srcData.data, x, y, width, height, 3);\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 0, m(0,r)+m(1,g)+m(2,b)+m(3,a)+m(4,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 1, m(5,r)+m(6,g)+m(7,b)+m(8,a)+m(9,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 2, m(10,r)+m(11,g)+m(12,b)+m(13,a)+m(14,1));\r\n\t\t\t\t\t\timSet(srcData.data, x, y, width, height, 3, m(15,r)+m(16,g)+m(17,b)+m(18,a)+m(19,1));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tctx.clearRect(0, 0, width, height);\r\n\t\t\t\tctx.putImageData(srcData, 0, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feColorMatrix.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.feGaussianBlur = function(node) {\r\n\t\t\tthis.base = svg.Element.ElementBase;\r\n\t\t\tthis.base(node);\r\n\r\n\t\t\tthis.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());\r\n\t\t\tthis.extraFilterDistance = this.blurRadius;\r\n\r\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\r\n\t\t\t\tif (typeof stackBlur.canvasRGBA == 'undefined') {\r\n\t\t\t\t\tsvg.log('ERROR: StackBlur.js must be included for blur to work');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// StackBlur requires canvas be on document\r\n\t\t\t\tctx.canvas.id = svg.UniqueId();\r\n\t\t\t\tctx.canvas.style.display = 'none';\r\n\t\t\t\tdocument.body.appendChild(ctx.canvas);\r\n\t\t\t\tstackBlur.canvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);\r\n\t\t\t\tdocument.body.removeChild(ctx.canvas);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsvg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// title element, do nothing\r\n\t\tsvg.Element.title = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.title.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// desc element, do nothing\r\n\t\tsvg.Element.desc = function(node) {\r\n\t\t}\r\n\t\tsvg.Element.desc.prototype = new svg.Element.ElementBase;\r\n\r\n\t\tsvg.Element.MISSING = function(node) {\r\n\t\t\tsvg.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\r\n\t\t}\r\n\t\tsvg.Element.MISSING.prototype = new svg.Element.ElementBase;\r\n\r\n\t\t// element factory\r\n\t\tsvg.CreateElement = function(node) {\r\n\t\t\tvar className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace\r\n\t\t\tclassName = className.replace(/\\-/g,''); // remove dashes\r\n\t\t\tvar e = null;\r\n\t\t\tif (typeof svg.Element[className] != 'undefined') {\r\n\t\t\t\te = new svg.Element[className](node);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\te = new svg.Element.MISSING(node);\r\n\t\t\t}\r\n\r\n\t\t\te.type = node.nodeName;\r\n\t\t\treturn e;\r\n\t\t}\r\n\r\n\t\t// load from url\r\n\t\tsvg.load = function(ctx, url) {\r\n\t\t\tsvg.loadXml(ctx, svg.ajax(url));\r\n\t\t}\r\n\r\n\t\t// load from xml\r\n\t\tsvg.loadXml = function(ctx, xml) {\r\n\t\t\tsvg.loadXmlDoc(ctx, svg.parseXml(xml));\r\n\t\t}\r\n\r\n\t\tsvg.loadXmlDoc = function(ctx, dom) {\r\n\t\t\tsvg.init(ctx);\r\n\r\n\t\t\tvar mapXY = function(p) {\r\n\t\t\t\tvar e = ctx.canvas;\r\n\t\t\t\twhile (e) {\r\n\t\t\t\t\tp.x -= e.offsetLeft;\r\n\t\t\t\t\tp.y -= e.offsetTop;\r\n\t\t\t\t\te = e.offsetParent;\r\n\t\t\t\t}\r\n\t\t\t\tif (window.scrollX) p.x += window.scrollX;\r\n\t\t\t\tif (window.scrollY) p.y += window.scrollY;\r\n\t\t\t\treturn p;\r\n\t\t\t}\r\n\r\n\t\t\t// bind mouse\r\n\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\tctx.canvas.onclick = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onclick(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t\tctx.canvas.onmousemove = function(e) {\r\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\r\n\t\t\t\t\tsvg.Mouse.onmousemove(p.x, p.y);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar e = svg.CreateElement(dom.documentElement);\r\n\t\t\te.root = true;\r\n\t\t\te.addStylesFromStyleDefinition();\r\n\r\n\t\t\t// render loop\r\n\t\t\tvar isFirstRender = true;\r\n\t\t\tvar draw = function() {\r\n\t\t\t\tsvg.ViewPort.Clear();\r\n\t\t\t\tif (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);\r\n\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] != true) {\r\n\t\t\t\t\t// set canvas size\r\n\t\t\t\t\tif (e.style('width').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.width = e.style('width').toPixels('x');\r\n\t\t\t\t\t\tctx.canvas.style.width = ctx.canvas.width + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.style('height').hasValue()) {\r\n\t\t\t\t\t\tctx.canvas.height = e.style('height').toPixels('y');\r\n\t\t\t\t\t\tctx.canvas.style.height = ctx.canvas.height + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvar cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\r\n\t\t\t\tvar cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\r\n\t\t\t\tif (svg.opts['ignoreDimensions'] == true && e.style('width').hasValue() && e.style('height').hasValue()) {\r\n\t\t\t\t\tcWidth = e.style('width').toPixels('x');\r\n\t\t\t\t\tcHeight = e.style('height').toPixels('y');\r\n\t\t\t\t}\r\n\t\t\t\tsvg.ViewPort.SetCurrent(cWidth, cHeight);\r\n\r\n\t\t\t\tif (svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];\r\n\t\t\t\tif (svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];\r\n\t\t\t\tif (svg.opts['scaleWidth'] != null || svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\tvar xRatio = null, yRatio = null, viewBox = svg.ToNumberArray(e.attribute('viewBox').value);\r\n\r\n\t\t\t\t\tif (svg.opts['scaleWidth'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('width').hasValue()) xRatio = e.attribute('width').toPixels('x') / svg.opts['scaleWidth'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts['scaleWidth'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (svg.opts['scaleHeight'] != null) {\r\n\t\t\t\t\t\tif (e.attribute('height').hasValue()) yRatio = e.attribute('height').toPixels('y') / svg.opts['scaleHeight'];\r\n\t\t\t\t\t\telse if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts['scaleHeight'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (xRatio == null) { xRatio = yRatio; }\r\n\t\t\t\t\tif (yRatio == null) { yRatio = xRatio; }\r\n\r\n\t\t\t\t\te.attribute('width', true).value = svg.opts['scaleWidth'];\r\n\t\t\t\t\te.attribute('height', true).value = svg.opts['scaleHeight'];\r\n\t\t\t\t\te.style('transform', true, true).value += ' scale('+(1.0/xRatio)+','+(1.0/yRatio)+')';\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// clear and render\r\n\t\t\t\tif (svg.opts['ignoreClear'] != true) {\r\n\t\t\t\t\tctx.clearRect(0, 0, cWidth, cHeight);\r\n\t\t\t\t}\r\n\t\t\t\te.render(ctx);\r\n\t\t\t\tif (isFirstRender) {\r\n\t\t\t\t\tisFirstRender = false;\r\n\t\t\t\t\tif (typeof svg.opts['renderCallback'] == 'function') svg.opts['renderCallback'](dom);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar waitingForImages = true;\r\n\t\t\tif (svg.ImagesLoaded()) {\r\n\t\t\t\twaitingForImages = false;\r\n\t\t\t\tdraw();\r\n\t\t\t}\r\n\t\t\tsvg.intervalID = setInterval(function() {\r\n\t\t\t\tvar needUpdate = false;\r\n\r\n\t\t\t\tif (waitingForImages && svg.ImagesLoaded()) {\r\n\t\t\t\t\twaitingForImages = false;\r\n\t\t\t\t\tneedUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from mouse events?\r\n\t\t\t\tif (svg.opts['ignoreMouse'] != true) {\r\n\t\t\t\t\tneedUpdate = needUpdate | svg.Mouse.hasEvents();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from animations?\r\n\t\t\t\tif (svg.opts['ignoreAnimation'] != true) {\r\n\t\t\t\t\tfor (var i=0; i<svg.Animations.length; i++) {\r\n\t\t\t\t\t\tneedUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// need update from redraw?\r\n\t\t\t\tif (typeof svg.opts['forceRedraw'] == 'function') {\r\n\t\t\t\t\tif (svg.opts['forceRedraw']() == true) needUpdate = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render if needed\r\n\t\t\t\tif (needUpdate) {\r\n\t\t\t\t\tdraw();\r\n\t\t\t\t\tsvg.Mouse.runEvents(); // run and clear our events\r\n\t\t\t\t}\r\n\t\t\t}, 1000 / svg.FRAMERATE);\r\n\t\t}\r\n\r\n\t\tsvg.stop = function() {\r\n\t\t\tif (svg.intervalID) {\r\n\t\t\t\tclearInterval(svg.intervalID);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsvg.Mouse = new (function() {\r\n\t\t\tthis.events = [];\r\n\t\t\tthis.hasEvents = function() { return this.events.length != 0; }\r\n\r\n\t\t\tthis.onclick = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onclick', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onclick) e.onclick(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.onmousemove = function(x, y) {\r\n\t\t\t\tthis.events.push({ type: 'onmousemove', x: x, y: y,\r\n\t\t\t\t\trun: function(e) { if (e.onmousemove) e.onmousemove(); }\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.eventElements = [];\r\n\r\n\t\t\tthis.checkPath = function(element, ctx) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.checkBoundingBox = function(element, bb) {\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tif (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.runEvents = function() {\r\n\t\t\t\tsvg.ctx.canvas.style.cursor = '';\r\n\r\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\r\n\t\t\t\t\tvar e = this.events[i];\r\n\t\t\t\t\tvar element = this.eventElements[i];\r\n\t\t\t\t\twhile (element) {\r\n\t\t\t\t\t\te.run(element);\r\n\t\t\t\t\t\telement = element.parent;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// done running, clear\r\n\t\t\t\tthis.events = [];\r\n\t\t\t\tthis.eventElements = [];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn svg;\r\n\t};\r\n\r\n\tif (typeof CanvasRenderingContext2D  != 'undefined') {\r\n\t\tCanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh, opts) {\r\n\t\t\tvar cOpts = {\r\n\t\t\t\tignoreMouse: true,\r\n\t\t\t\tignoreAnimation: true,\r\n\t\t\t\tignoreDimensions: true,\r\n\t\t\t\tignoreClear: true,\r\n\t\t\t\toffsetX: dx,\r\n\t\t\t\toffsetY: dy,\r\n\t\t\t\tscaleWidth: dw,\r\n\t\t\t\tscaleHeight: dh\r\n\t\t\t}\r\n\r\n\t\t\tfor(var prop in opts) {\r\n\t\t\t\tif(opts.hasOwnProperty(prop)){\r\n\t\t\t\t\tcOpts[prop] = opts[prop];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcanvg(this.canvas, s, cOpts);\r\n\t\t}\r\n\t}\r\n\r\n\treturn canvg;\r\n\r\n}));\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/canvg/canvg.js\n// module id = 1542\n// module chunks = 0 1","/*\n\tBased on rgbcolor.js by Stoyan Stefanov <sstoo@gmail.com>\n\thttp://www.phpied.com/rgb-color-parser-in-javascript/\n*/\n\nmodule.exports = function(color_string) {\n    this.ok = false;\n    this.alpha = 1.0;\n\n    // strip any leading #\n    if (color_string.charAt(0) == '#') { // remove # if any\n        color_string = color_string.substr(1,6);\n    }\n\n    color_string = color_string.replace(/ /g,'');\n    color_string = color_string.toLowerCase();\n\n    // before getting into regexps, try simple matches\n    // and overwrite the input\n    var simple_colors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dodgerblue: '1e90ff',\n        feldspar: 'd19275',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred : 'cd5c5c',\n        indigo : '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslateblue: '8470ff',\n        lightslategray: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        violetred: 'd02090',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    color_string = simple_colors[color_string] || color_string;\n    // emd of simple type-in colors\n\n    // array of color definition objects\n    var color_defs = [\n        {\n            re: /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*((?:\\d?\\.)?\\d)\\)$/,\n            example: ['rgba(123, 234, 45, 0.8)', 'rgba(255,234,245,1.0)'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1]),\n                    parseInt(bits[2]),\n                    parseInt(bits[3]),\n                    parseFloat(bits[4])\n                ];\n            }\n        },\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1]),\n                    parseInt(bits[2]),\n                    parseInt(bits[3])\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            example: ['#00ff00', '336699'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1], 16),\n                    parseInt(bits[2], 16),\n                    parseInt(bits[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            example: ['#fb0', 'f0f'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1] + bits[1], 16),\n                    parseInt(bits[2] + bits[2], 16),\n                    parseInt(bits[3] + bits[3], 16)\n                ];\n            }\n        }\n    ];\n\n    // search through the definitions to find a match\n    for (var i = 0; i < color_defs.length; i++) {\n        var re = color_defs[i].re;\n        var processor = color_defs[i].process;\n        var bits = re.exec(color_string);\n        if (bits) {\n            var channels = processor(bits);\n            this.r = channels[0];\n            this.g = channels[1];\n            this.b = channels[2];\n            if (channels.length > 3) {\n                this.alpha = channels[3];\n            }\n            this.ok = true;\n        }\n\n    }\n\n    // validate/cleanup values\n    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n    this.alpha = (this.alpha < 0) ? 0 : ((this.alpha > 1.0 || isNaN(this.alpha)) ? 1.0 : this.alpha);\n\n    // some getters\n    this.toRGB = function () {\n        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n    }\n    this.toRGBA = function () {\n        return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.alpha + ')';\n    }\n    this.toHex = function () {\n        var r = this.r.toString(16);\n        var g = this.g.toString(16);\n        var b = this.b.toString(16);\n        if (r.length == 1) r = '0' + r;\n        if (g.length == 1) g = '0' + g;\n        if (b.length == 1) b = '0' + b;\n        return '#' + r + g + b;\n    }\n\n    // help\n    this.getHelpXML = function () {\n\n        var examples = new Array();\n        // add regexps\n        for (var i = 0; i < color_defs.length; i++) {\n            var example = color_defs[i].example;\n            for (var j = 0; j < example.length; j++) {\n                examples[examples.length] = example[j];\n            }\n        }\n        // add type-in colors\n        for (var sc in simple_colors) {\n            examples[examples.length] = sc;\n        }\n\n        var xml = document.createElement('ul');\n        xml.setAttribute('id', 'rgbcolor-examples');\n        for (var i = 0; i < examples.length; i++) {\n            try {\n                var list_item = document.createElement('li');\n                var list_color = new RGBColor(examples[i]);\n                var example_div = document.createElement('div');\n                example_div.style.cssText =\n                        'margin: 3px; '\n                        + 'border: 1px solid black; '\n                        + 'background:' + list_color.toHex() + '; '\n                        + 'color:' + list_color.toHex()\n                ;\n                example_div.appendChild(document.createTextNode('test'));\n                var list_item_value = document.createTextNode(\n                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n                );\n                list_item.appendChild(example_div);\n                list_item.appendChild(list_item_value);\n                xml.appendChild(list_item);\n\n            } catch(e){}\n        }\n        return xml;\n\n    }\n\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/rgbcolor/index.js\n// module id = 1543\n// module chunks = 0 1","/*\n\nStackBlur - a fast almost Gaussian Blur For Canvas\n\nVersion: \t0.5\nAuthor:\t\tMario Klingemann\nContact: \tmario@quasimondo.com\nWebsite:\thttp://www.quasimondo.com/StackBlurForCanvas\nTwitter:\t@quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr: \nhttps://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2010 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\nvar mul_table = [\n        512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,\n        454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,\n        482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,\n        437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,\n        497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,\n        320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,\n        446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,\n        329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,\n        505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,\n        399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,\n        324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,\n        268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,\n        451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,\n        385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,\n        332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,\n        289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];\n        \n   \nvar shg_table = [\n\t     9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, \n\t\t17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, \n\t\t19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,\n\t\t20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,\n\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,\n\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, \n\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, \n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, \n\t\t23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ];\n\nfunction blur( pixels, width, height, radius )\n{\n\tif ( isNaN(radius) || radius < 1 ) return;\n\tradius |= 0;\n\n\tvar x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, \n\tr_out_sum, g_out_sum, b_out_sum, a_out_sum,\n\tr_in_sum, g_in_sum, b_in_sum, a_in_sum, \n\tpr, pg, pb, pa, rbs;\n\t\t\t\n\tvar div = radius + radius + 1;\n\tvar w4 = width << 2;\n\tvar widthMinus1  = width - 1;\n\tvar heightMinus1 = height - 1;\n\tvar radiusPlus1  = radius + 1;\n\tvar sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2;\n\t\n\tvar stackStart = new BlurStack();\n\tvar stack = stackStart;\n\tfor ( i = 1; i < div; i++ )\n\t{\n\t\tstack = stack.next = new BlurStack();\n\t\tif ( i == radiusPlus1 ) var stackEnd = stack;\n\t}\n\tstack.next = stackStart;\n\tvar stackIn = null;\n\tvar stackOut = null;\n\t\n\tyw = yi = 0;\n\t\n\tvar mul_sum = mul_table[radius];\n\tvar shg_sum = shg_table[radius];\n\t\n\tfor ( y = 0; y < height; y++ )\n\t{\n\t\tr_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;\n\t\t\n\t\tr_out_sum = radiusPlus1 * ( pr = pixels[yi] );\n\t\tg_out_sum = radiusPlus1 * ( pg = pixels[yi+1] );\n\t\tb_out_sum = radiusPlus1 * ( pb = pixels[yi+2] );\n\t\ta_out_sum = radiusPlus1 * ( pa = pixels[yi+3] );\n\t\t\n\t\tr_sum += sumFactor * pr;\n\t\tg_sum += sumFactor * pg;\n\t\tb_sum += sumFactor * pb;\n\t\ta_sum += sumFactor * pa;\n\t\t\n\t\tstack = stackStart;\n\t\t\n\t\tfor( i = 0; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tstack.r = pr;\n\t\t\tstack.g = pg;\n\t\t\tstack.b = pb;\n\t\t\tstack.a = pa;\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\tfor( i = 1; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tp = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 );\n\t\t\tr_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i );\n\t\t\tg_sum += ( stack.g = ( pg = pixels[p+1])) * rbs;\n\t\t\tb_sum += ( stack.b = ( pb = pixels[p+2])) * rbs;\n\t\t\ta_sum += ( stack.a = ( pa = pixels[p+3])) * rbs;\n\t\t\t\n\t\t\tr_in_sum += pr;\n\t\t\tg_in_sum += pg;\n\t\t\tb_in_sum += pb;\n\t\t\ta_in_sum += pa;\n\t\t\t\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\t\n\t\tstackIn = stackStart;\n\t\tstackOut = stackEnd;\n\t\tfor ( x = 0; x < width; x++ )\n\t\t{\n\t\t\tpixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum;\n\t\t\tif ( pa != 0 )\n\t\t\t{\n\t\t\t\tpa = 255 / pa;\n\t\t\t\tpixels[yi]   = ((r_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t\tpixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t\tpixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa;\n\t\t\t} else {\n\t\t\t\tpixels[yi] = pixels[yi+1] = pixels[yi+2] = 0;\n\t\t\t}\n\t\t\t\n\t\t\tr_sum -= r_out_sum;\n\t\t\tg_sum -= g_out_sum;\n\t\t\tb_sum -= b_out_sum;\n\t\t\ta_sum -= a_out_sum;\n\t\t\t\n\t\t\tr_out_sum -= stackIn.r;\n\t\t\tg_out_sum -= stackIn.g;\n\t\t\tb_out_sum -= stackIn.b;\n\t\t\ta_out_sum -= stackIn.a;\n\t\t\t\n\t\t\tp =  ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2;\n\t\t\t\n\t\t\tr_in_sum += ( stackIn.r = pixels[p]);\n\t\t\tg_in_sum += ( stackIn.g = pixels[p+1]);\n\t\t\tb_in_sum += ( stackIn.b = pixels[p+2]);\n\t\t\ta_in_sum += ( stackIn.a = pixels[p+3]);\n\t\t\t\n\t\t\tr_sum += r_in_sum;\n\t\t\tg_sum += g_in_sum;\n\t\t\tb_sum += b_in_sum;\n\t\t\ta_sum += a_in_sum;\n\t\t\t\n\t\t\tstackIn = stackIn.next;\n\t\t\t\n\t\t\tr_out_sum += ( pr = stackOut.r );\n\t\t\tg_out_sum += ( pg = stackOut.g );\n\t\t\tb_out_sum += ( pb = stackOut.b );\n\t\t\ta_out_sum += ( pa = stackOut.a );\n\t\t\t\n\t\t\tr_in_sum -= pr;\n\t\t\tg_in_sum -= pg;\n\t\t\tb_in_sum -= pb;\n\t\t\ta_in_sum -= pa;\n\t\t\t\n\t\t\tstackOut = stackOut.next;\n\n\t\t\tyi += 4;\n\t\t}\n\t\tyw += width;\n\t}\n\n\t\n\tfor ( x = 0; x < width; x++ )\n\t{\n\t\tg_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;\n\t\t\n\t\tyi = x << 2;\n\t\tr_out_sum = radiusPlus1 * ( pr = pixels[yi]);\n\t\tg_out_sum = radiusPlus1 * ( pg = pixels[yi+1]);\n\t\tb_out_sum = radiusPlus1 * ( pb = pixels[yi+2]);\n\t\ta_out_sum = radiusPlus1 * ( pa = pixels[yi+3]);\n\t\t\n\t\tr_sum += sumFactor * pr;\n\t\tg_sum += sumFactor * pg;\n\t\tb_sum += sumFactor * pb;\n\t\ta_sum += sumFactor * pa;\n\t\t\n\t\tstack = stackStart;\n\t\t\n\t\tfor( i = 0; i < radiusPlus1; i++ )\n\t\t{\n\t\t\tstack.r = pr;\n\t\t\tstack.g = pg;\n\t\t\tstack.b = pb;\n\t\t\tstack.a = pa;\n\t\t\tstack = stack.next;\n\t\t}\n\t\t\n\t\typ = width;\n\t\t\n\t\tfor( i = 1; i <= radius; i++ )\n\t\t{\n\t\t\tyi = ( yp + x ) << 2;\n\t\t\t\n\t\t\tr_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i );\n\t\t\tg_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs;\n\t\t\tb_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs;\n\t\t\ta_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs;\n\t\t   \n\t\t\tr_in_sum += pr;\n\t\t\tg_in_sum += pg;\n\t\t\tb_in_sum += pb;\n\t\t\ta_in_sum += pa;\n\t\t\t\n\t\t\tstack = stack.next;\n\t\t\n\t\t\tif( i < heightMinus1 )\n\t\t\t{\n\t\t\t\typ += width;\n\t\t\t}\n\t\t}\n\t\t\n\t\tyi = x;\n\t\tstackIn = stackStart;\n\t\tstackOut = stackEnd;\n\t\tfor ( y = 0; y < height; y++ )\n\t\t{\n\t\t\tp = yi << 2;\n\t\t\tpixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum;\n\t\t\tif ( pa > 0 )\n\t\t\t{\n\t\t\t\tpa = 255 / pa;\n\t\t\t\tpixels[p]   = ((r_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t\tpixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t\tpixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa;\n\t\t\t} else {\n\t\t\t\tpixels[p] = pixels[p+1] = pixels[p+2] = 0;\n\t\t\t}\n\t\t\t\n\t\t\tr_sum -= r_out_sum;\n\t\t\tg_sum -= g_out_sum;\n\t\t\tb_sum -= b_out_sum;\n\t\t\ta_sum -= a_out_sum;\n\t\t   \n\t\t\tr_out_sum -= stackIn.r;\n\t\t\tg_out_sum -= stackIn.g;\n\t\t\tb_out_sum -= stackIn.b;\n\t\t\ta_out_sum -= stackIn.a;\n\t\t\t\n\t\t\tp = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2;\n\t\t\t\n\t\t\tr_sum += ( r_in_sum += ( stackIn.r = pixels[p]));\n\t\t\tg_sum += ( g_in_sum += ( stackIn.g = pixels[p+1]));\n\t\t\tb_sum += ( b_in_sum += ( stackIn.b = pixels[p+2]));\n\t\t\ta_sum += ( a_in_sum += ( stackIn.a = pixels[p+3]));\n\t\t   \n\t\t\tstackIn = stackIn.next;\n\t\t\t\n\t\t\tr_out_sum += ( pr = stackOut.r );\n\t\t\tg_out_sum += ( pg = stackOut.g );\n\t\t\tb_out_sum += ( pb = stackOut.b );\n\t\t\ta_out_sum += ( pa = stackOut.a );\n\t\t\t\n\t\t\tr_in_sum -= pr;\n\t\t\tg_in_sum -= pg;\n\t\t\tb_in_sum -= pb;\n\t\t\ta_in_sum -= pa;\n\t\t\t\n\t\t\tstackOut = stackOut.next;\n\t\t\t\n\t\t\tyi += width;\n\t\t}\n\t}\n}\n\nfunction BlurStack()\n{\n\tthis.r = 0;\n\tthis.g = 0;\n\tthis.b = 0;\n\tthis.a = 0;\n\tthis.next = null;\n}\n\nmodule.exports = blur;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/stackblur/index.js\n// module id = 1544\n// module chunks = 0 1","/**\n * Filter Panel Container\n *\n * Component hierarchy:\n *                                                                                                                                +-+\n * +----------------------------------------+\n * |    <FilterPanel>              |\n * |    +----------------------+       +----+\n * |    | <Panel>              |       | <Pa|\n * |    | +------------------+ |       | +--+\n * |    | | <Node>           | |       | |  |\n * |    | | +---------------++ |       | |  |\n * |    | | | <Node>        || |       | |  |\n * |    | | | +------------+-| |       | |  |\n * |    | | | |            |-| |       | |  |\n * |    | | | |   ...      |-| |       | |  |\n * |    | | | |            |-| |       | |  |\n * |    | | | |            |-| |       | |  |\n * |    | | | +--------------| |       | |  |\n * |    | | +-+--------------+ |       | |  |\n * |    | |        .         | |       | |  |\n * |    | +------------------+ |       | +--+\n * |    +-+------------------+-+       +-+--+\n * +----------------------------------------+\n *\n * This container 'owns' the budgetData instance and is responsible for generating <Panel> components for each breakdown,\n * along with handling all node toggle/sort events that originate from either <Panel>s or the <Node> components owned by those\n * <Panel>s\n *\n */\n\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport PropTypes from 'prop-types';\n\nimport Panel from './panel';\nimport SummaryReportActions from '../actions/summary_report_actions';\n\nimport createReactClass from 'create-react-class';\n\nconst FilterPanel = createReactClass<any, any>({\n  propTypes: {\n    accountType: PropTypes.string,\n    athenaState: PropTypes.object.isRequired,\n    budgetData: PropTypes.object.isRequired,\n    filterPanels: PropTypes.object\n  },\n\n  componentWillMount() {\n    this.athenaState = this.props.athenaState;\n    this.budgetData = this.props.budgetData;\n\n    this._subscribeDOMEvents();\n    this._subscribeBudgetDataEvents();\n\n    this._setAccountTypeChildren(this.props.accountType);\n\n    const panels = _.chain(this.athenaState.breakdowns.toJSON()).filter({visible:true}).map((panel: { id, name }) => ({\n      id: panel.id,\n      name: panel.name,\n      visible: false\n    })).value();\n\n    this.setState({panelState: panels});\n  },\n\n  componentWillUnmount() {\n    this._unsubscribeBudgetDataEvents();\n    this._unsubscribeDOMEvents();\n  },\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.accountType !== nextProps.accountType) {\n      this._setAccountTypeChildren(nextProps.accountType);\n    }\n  },\n\n  _subscribeDOMEvents() {\n    $(document).on('click', this.handleDocumentClick);\n  },\n\n  _subscribeBudgetDataEvents() {\n    const budgetData = this.budgetData;\n    const typesBreakdown = budgetData.breakdowns.get('types');\n\n    budgetData.on('change:accountType', function(m, accountType) {\n      this._setAccountTypeChildren(accountType);\n    }, this);\n\n    typesBreakdown.on('change:name', function(breakdown, name) {\n      this._setPanelTitle('types', name);\n    }, this);\n  },\n\n  _unsubscribeDOMEvents() {\n    $(document).off('click', this.handleDocumentClick);\n  },\n\n  _unsubscribeBudgetDataEvents() {\n    const budgetData = this.budgetData;\n    const typesBreakdown = budgetData.breakdowns.get('types');\n\n    budgetData.off();\n    typesBreakdown.off();\n  },\n\n  handleSort(id, sort) {\n    this.athenaState.setTreeSort(id, sort);\n    this.forceUpdate();\n  },\n\n  handleDocumentClick(e) {\n    if (!this._getVisiblePanels().size) {\n      // we can bail early if no panels are open\n      return;\n    }\n\n    //TODO: figure out better approach for excluding click targets for closing all panels\n    const isFilterButtonClick = $('#wd-section-filter').get(0) && $.contains($('#wd-section-filter').get(0), e.target);\n    const isTitleFilterClick = $('#report-drilldown-title').get(0) && $.contains($('#report-drilldown-title').get(0), e.target);\n    const inContainer = $.contains((ReactDOM.findDOMNode(this) as any), e.target);\n\n    const targetClassName = e.target.className || '';\n    const isFilterCloseClick = targetClassName.includes('ui-panel__close');\n\n    if (!isFilterButtonClick && !isTitleFilterClick && !inContainer && !isFilterCloseClick) {\n      SummaryReportActions.closeAllFilterPanels();\n    }\n  },\n\n  _setPanelTitle(id, title) {\n    const panelStateCopy = this.state.panelState.slice(0);\n    const panel: { name } = _.find(panelStateCopy, {id});\n\n    panel.name = title;\n    this.setState({panelState: panelStateCopy});\n  },\n\n  /**\n   * Sets the child nodes under the special 'types' tree based on the selected account type (this allows\n   * for multiple account type trees to be rendered by a <Panel> component, since it expects a single root node to be passed\n   *\n   * @param {string} accountType\n   */\n  _setAccountTypeChildren(accountType) {\n    const filterPredicate = (accountType === 'types') ? (t) => t.visible : (t) => t.id === accountType;\n\n    this.budgetData.trees.types.children = _.chain(this.budgetData.accountTrees)\n      .filter(filterPredicate)\n        .map((t: { children }) => t.children).flatten().value();\n  },\n\n  _getVisiblePanels() {\n    return this.props.filterPanels.filter(panel => panel.get('isOpen'));\n  },\n\n  render() {\n    const visiblePanels = this._getVisiblePanels();\n    if (!visiblePanels.size) {\n      return null;\n    }\n\n    return (\n      <div className=\"subpanels js-subpanels\">\n        {visiblePanels.map((panel) => {\n          return (\n            <Panel\n              key={panel.get('id')}\n              title={panel.get('name')}\n              visible={panel.get('isOpen')}\n              changeSort={this.handleSort}\n              sort={this.athenaState.getTreeSort(panel.get('id'))}\n              node={this.budgetData.trees[panel.get('id')]} />\n          );\n        })}\n      </div>\n    );\n  }\n});\n\nexport default FilterPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel/index.tsx","import React from 'react';\nimport _ from 'lodash';\nimport PropTypes from 'prop-types';\n\nimport strings from '../strings';\nimport Node from './node';\nimport SearchInput from './search_input';\nimport { SortDropdown } from './sort_dropdown';\n\nimport SummaryReportActions from '../actions/summary_report_actions';\n\nimport { translate } from 'react-i18next';\n\nexport class Panel extends React.Component<any, any> {\n  state = {\n    filterText: '',\n    searchOverflow: 0,\n    searchResultCount: null,\n\n  };\n\n  static defaultProps = {\n    maxSearchResults: 100\n  };\n\n  handleUserInput = (filterText) => {\n    let searchResultCount = 0;\n\n    if (filterText !== '') {\n      searchResultCount = this._tagMatchedNodes(filterText);\n    } else {\n      this._clearTaggedNodes();\n    }\n\n    this.setState({\n      filterText,\n      searchResultCount\n    });\n  }\n\n  /**\n   * DFS for visiting all descendent nodes under root\n   *\n   * @param {BudgetNode} node\n   * @param {function} visitorFunc\n   */\n  _visitChildNodes = (node, visitorFunc) => {\n    if (visitorFunc) {\n      visitorFunc(node);\n    }\n    _.each(node.children, _.bind(function(child) {\n      this._visitChildNodes(child, visitorFunc);\n    }, this));\n  }\n\n  /**\n   * Visits all descendent nodes and tags those matching a search string (along with their parents and ancestors)\n   * with attributes that the <Node> component will use during rendering (the 'search{Attribute}' properties)\n   *\n   * @param {string} search - Term to match node titles on\n   */\n  _tagMatchedNodes = (search) => {\n    const matchedNodes = [];\n    const expandStrategy = this.props.node.id === 'types' ? this._accountTreeNodeExpand : this._nodeExpand;\n    const regexpSearch = new RegExp(search, 'i');\n    let count = 0;\n\n    //Build up an array of nodes matching the search term and decorate them\n    //with attributes to be rendered out\n    this._visitChildNodes(this.props.node, n => {\n      n.searchExpanded = false;\n      n.searchHidden = true;\n      n.searchIndexStart = undefined;\n      n.searchIndexEnd = undefined;\n\n      const name = strings.nodeName(n);\n\n      const startMatchIndex = name.search(regexpSearch);\n      if (startMatchIndex !== -1) {\n        if (count++ < this.props.maxSearchResults) {\n          this._tagMatchedNode(n, startMatchIndex, startMatchIndex + search.length);\n          matchedNodes.push(n);\n        }\n      }\n    });\n\n    //Expand out parents based on the strategy determined by the tree type\n    //The 'types' tree differs from other trees in that it is a \"virtual\" parent of its children\n    //since they don't actually contain a parent pointer back to it\n    matchedNodes.forEach(expandStrategy);\n\n    return count;\n  }\n\n  _tagMatchedNode(node, startMatchIndex, endMatchIndex) {\n    node.searchHidden = false;\n    node.searchIndexStart = startMatchIndex;\n    node.searchIndexEnd = endMatchIndex;\n  }\n\n  _nodeExpand(n) {\n    let p = n;\n    while (p.parent) {\n      p.parent.searchExpanded = true;\n      p.parent.searchHidden = false;\n\n      p = p.parent;\n    }\n  }\n\n  _accountTreeNodeExpand = (n) => {\n    let p = n;\n    const typesTree = this.props.node;\n\n    while (p.parent) {\n      if (p.parent.isAccountTypeTree) {\n        typesTree.searchExpanded = true;\n        typesTree.searchHidden = false;\n      } else {\n        p.parent.searchExpanded = true;\n        p.parent.searchHidden = false;\n      }\n      p = p.parent;\n    }\n  }\n\n  _clearTaggedNodes = () => {\n    this._visitChildNodes(this.props.node, function(n) {\n      n.searchExpanded = false;\n      n.searchHidden = false;\n      n.searchIndexStart = undefined;\n      n.searchIndexEnd = undefined;\n    });\n  }\n\n  shouldComponentUpdate(nextProps) {\n    return !nextProps.visible ? this.props.visible : true;\n  }\n\n  _selectAllNodes = () => {\n    SummaryReportActions.treeSelect(this.props.node.id);\n  }\n\n  _closePanel = () => {\n    SummaryReportActions.toggleFilterPanel(this.props.node.id);\n  }\n\n  render() {\n    const {\n      t,\n      visible,\n      title,\n      sort,\n      changeSort,\n      node,\n      maxSearchResults\n    } = this.props;\n\n    return (\n      <div className={'subpanel ui-panel js-subpanel ' + (visible ? 'ready open' : '')}>\n        <header className=\"ui-panel__header\">\n          <h3>{title}</h3>\n          <button className=\"ui-panel__close\" onClick={this._closePanel} />\n        </header>\n        <div className=\"ui-panel__content\">\n          <div className=\"subpanel__options\">\n            <SearchInput\n              filterText={this.state.filterText}\n              placeholderText={`${t('components.FilterPanel.searchPlaceholder')} ${title}`}\n              onUserInput={this.handleUserInput}/>\n          </div>\n          <div className=\"subpanel__options\">\n            <SortDropdown\n              treeId={node.id}\n              sort={sort}\n              changeSort={changeSort} />\n\n            <button className=\"subpanel__options__reset ui-button small no-color\" onClick={this._selectAllNodes}>\n              <i className=\"fonticon icon-confirm-1\"></i>\n            All\n            </button>\n          </div>\n          <div className=\"subpanel__content\">\n            {this.state.searchResultCount > maxSearchResults ?\n              <div className=\"report-state-alert ui-alert-box notice\">\n                <span className=\"icon-exclamation-1\"></span>\n                <strong>{maxSearchResults} results shown of {this.state.searchResultCount}</strong>\n              </div>\n            :\n              null\n            }\n            {node.children.every((n) => n.searchHidden) ?\n              <p className=\"ui-null\">\n                <strong>No results found</strong>\n              </p>\n            :\n              <Node node={node} />\n            }\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nconst TranslatedPanel = translate('report', { wait: true })(Panel);\nTranslatedPanel.contextTypes = {\n  i18n: PropTypes.object\n};\n\nexport default TranslatedPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel/panel.tsx","import React from 'react';\nimport _ from 'lodash';\nimport classNames from 'classnames';\nimport strings from '../strings';\n\nimport SummaryReportActions from '../actions/summary_report_actions';\n\nexport class Node extends React.Component<any, any> {\n  _toggleNode = (id) => {\n    SummaryReportActions.nodeToggleSelect(id);\n    this.forceUpdate();\n  }\n\n  _expandNode = (node) => {\n    node.expanded = !node.expanded;\n    this.forceUpdate();\n  }\n\n  _selectExclusiveNode = (id) => {\n    SummaryReportActions.nodeExclusiveSelect(id);\n  }\n\n  _renderHighlightNode(text, indexStart, indexEnd) {\n    if (!_.isUndefined(indexStart)) {\n      return (\n        <span>\n          <span>{text.slice(0, indexStart)}</span>\n          <span className=\"ui-highlight\" >{text.slice(indexStart, indexEnd)}</span>\n          <span>{text.slice(indexEnd)}</span>\n        </span>\n      );\n    }\n\n    return <span>{text}</span>;\n  }\n\n  _renderDropItemBar = (node) => {\n    const name = strings.nodeName(node);\n    const hasChildren = node.children.length > 0;\n    const isUngrouped = node.ungrouped;\n\n    const dropItemBarClassNames = classNames({\n      'drop-item__bar': true,\n      locked: isUngrouped,\n      'no-children': !hasChildren\n    });\n\n    const textClasses = classNames({\n      'drop-item__text': true,\n      locked: isUngrouped,\n    });\n\n    if(hasChildren) {\n      return (\n        <button className={dropItemBarClassNames} onClick={this._expandNode.bind(null, node)}>\n          <span className=\"drop-item__bar__icon\"/>\n          <span\n            className={textClasses}\n            title={name}\n            onClick={(!isUngrouped) && this._selectExclusiveNode.bind(null, node.id)}>\n            {this._renderHighlightNode(name, node.searchIndexStart, node.searchIndexEnd)}\n          </span>\n        </button>\n      );\n    }\n    else {\n      return (\n        <div className={dropItemBarClassNames}>\n          <span className=\"drop-item__bar__icon__blank\"/>\n          <span\n            className={textClasses}\n            title={name}\n            onClick={(!isUngrouped) && this._selectExclusiveNode.bind(null, node.id)}>\n            {this._renderHighlightNode(name, node.searchIndexStart, node.searchIndexEnd)}\n          </span>\n        </div>\n      );\n    }\n  }\n\n  render() {\n    let childNodes;\n    let isCurExpanded = this.props.node.isTree ? true : !!this.props.node.searchExpanded || !!this.props.node.expanded;\n\n    if (this.props.node.children && !this.props.node.searchHidden && isCurExpanded) {\n      childNodes = this.props.node.children.map(n => {\n        const liClasses = classNames({\n          'drop-item': true,\n          expanded: n.searchExpanded || n.expanded,\n          disabled: n.disabled\n        });\n\n        const buttonsClasses = classNames({\n          'drop-item__checkbox js-node-checkbox': true,\n          checked: n.selected,\n          'checked checked_partial': n.partiallySelected\n        });\n\n        if (!n.searchHidden) {\n          return (\n            <li key={n.id} className={liClasses}>\n              {this._renderDropItemBar(n)}\n              <div className=\"drop-item__buttons\">\n              {!n.ungrouped ?\n                <button\n                  role=\"checkbox\"\n                  onClick={this._toggleNode.bind(null, n.id)}\n                  className={buttonsClasses}\n                  data-id={n.id}\n                >\n                  <span className=\"fonticon checkmark-icon\"/>\n                </button> : null}\n              </div>\n              <Node node={n} />\n            </li>\n          );\n        }\n      });\n    }\n\n    return (\n      <ul className=\"drop-item__wrapper\">\n        {childNodes}\n      </ul>\n    );\n  }\n}\n\nexport default Node;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel/node.tsx","import React from 'react';\n\nimport createReactClass from 'create-react-class';\n\nconst SearchInput = createReactClass<any, any>({\n\n  componentDidMount() {\n    this.props.onUserInput('');\n  },\n\n  handleChange(e) {\n    this.props.onUserInput(e.target.value);\n  },\n\n  render() {\n    return (\n      <div className=\"ui-search small\">\n        <span className=\"icon-search-1\"></span>\n        <input\n          type=\"search\"\n          placeholder={this.props.placeholderText}\n          value={this.props.filterText}\n          onChange={this.handleChange}/>\n          <span className=\"icon-remove-2\"></span>\n      </div>\n     );\n  }\n});\n\nexport default SearchInput\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel/search_input.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\nconst Dropdown = Ovid.Dropdown;\n\nconst sortMethods = [\n  {id: 'alpha', name: <span>Sort A <i className=\"fonticon icon-right-1\"></i> Z </span>},\n  {id: 'coa', name: <span>Sort by Chart of Accounts</span>}\n];\n\nexport const SortDropdown = ({ sort, changeSort, treeId }) => {\n\n  const sortOptions = _.map(sortMethods, _.bind((item) => {\n    return (\n       <li key={item.id}>\n         <a onClick={changeSort.bind(null, treeId, item.id)}> {item.name} </a>\n       </li>\n     );\n  }, this));\n\n  const curSort = _.find(sortMethods, (item) => item.id === sort, this);\n  const title = curSort ? curSort.name : '';\n\n  return (\n    <Dropdown\n      dropdownClass=\"subpanel__options__sort-by\"\n      title={title}\n      disabled={false}>\n        <ul className=\"ui-dropdown__list\">\n          {sortOptions}\n        </ul>\n    </Dropdown>\n   );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/filter_panel/sort_dropdown.tsx","import React from 'react';\nimport _ from 'lodash';\nimport moment from 'moment';\n\nexport const PROJECTIONS_ERROR_TYPE_MESSAGES = {\n  'missing_months': 'In order to use projections you need five full years of monthly data. It looks like you are missing expense and revenue information for:',\n  'duplicative_months': 'It looks like you have duplicate datasets in your report. Please review the following time periods and remove the duplicates:',\n  'future_months': 'It looks like you have monthly actuals in your report for time periods that have not occurred. In order to run projections you need to remove the following datasets:'\n};\nexport const PROJECTIONS_ERROR_TYPE_VALUES = _.keys(PROJECTIONS_ERROR_TYPE_MESSAGES);\nconst isValidErrorType = (errorType) => _.includes(PROJECTIONS_ERROR_TYPE_VALUES, errorType);\nconst getErrorMessage = (errorType) => PROJECTIONS_ERROR_TYPE_MESSAGES[errorType];\n\nconst PROJECTION_TYPE_BASE_DESCRIPTION = 'Based on YTD actuals and activity from the previous';\nexport const PROJECTION_TYPES = {\n  '1_year_avg': {\n    title: 'Prior-Year Actuals',\n    description: `${PROJECTION_TYPE_BASE_DESCRIPTION} year`\n  },\n  '2_year_avg': {\n    title: '2-Year Average',\n    description: `${PROJECTION_TYPE_BASE_DESCRIPTION} 2 years`\n  },\n  '3_year_avg': {\n    title: '3-Year Average',\n    description: `${PROJECTION_TYPE_BASE_DESCRIPTION} 3 years`\n  },\n  '4_year_avg': {\n    title: '4-Year Average',\n    description: `${PROJECTION_TYPE_BASE_DESCRIPTION} 4 years`\n  },\n  'auto_year_avg': {\n    title: 'OpenGov Trend Analysis (Recommended)',\n    description: 'Use the method that performs best on previous years'\n  }\n};\nexport const PROJECTION_TYPE_VALUES = _.keys(PROJECTION_TYPES);\n\nexport const PROJECTION_ERROR_MESSAGE = 'Click here to learn more about this error';\n\n/**\n * Returns a object of props to be consumed by a DropdowListItem component.\n * @param  {object}  projection    The current projection\n * @param  {boolean} typehasErrors If the current projection type has errors\n * @return {object}                An object with title and description values\n */\nexport const getProjectionDropdownListItemTitleAndDescription = (projection, typehasErrors) => {\n  let { title, description } = projection;\n\n  title = typehasErrors ?\n    <span className=\"projections-warning\">\n      <span className=\"icon-warning-1\" /> {title}\n    </span>\n  : title;\n\n  description = typehasErrors ? PROJECTION_ERROR_MESSAGE : description;\n\n  return {\n    title,\n    description\n  };\n};\n\n/**\n * Return a string with a list of years and months.\n * @param  {object} error The error object with keys being years, and values being an array of months\n * @return {string}       A string with the years and months that the error has\n */\nexport const getReadableErrorYears = (error) => {\n  return _.map(error, (months: any, year) => {\n    // if we have a years worth of errors, then just show the year\n    if (months.length === 12) {\n      return `${year}`;\n    }\n\n    return `${months.map((m) => `${moment().month(m - 1).format('MMM')} ${year}`).join(', ')}`;\n  }).join(', ');\n};\n\nexport const getReadableProjectionsErrors = (error, errorType) => {\n  if (isValidErrorType(errorType)) {\n    return `${getErrorMessage(errorType)} ${getReadableErrorYears(error)}`;\n  }\n};\n\n/**\n * Returns the sourceDatasets without any errors with an invalid type.\n * @param  {array}  sourceDatasets Array of source datasets from the server.\n * @return {array}                 Array of source dataset without any invalid error types.\n */\nexport const cleanSourceDatasetErrors = (sourceDatasets) => (\n  sourceDatasets && sourceDatasets.map((sourceDataset) => ({\n    ...sourceDataset,\n    data_errors: sourceDataset.data_errors.filter((e) => isValidErrorType(e.name))\n  }))\n);\n\nexport const formatError = (previousError, currentError, errorType) => {\n  if (isValidErrorType(errorType)) {\n    const currentErrorValue = currentError.fields.date;\n    const {\n      calendar_year: calendarYear,\n      calendar_month: calendarMonth\n    } = currentErrorValue;\n\n    // this checks for the existence of the calendar for the given error and concats it\n    // otherwise sends a new array with the calendar month\n    let calendarYearErrors = previousError && previousError[calendarYear];\n    calendarYearErrors = (calendarYearErrors && calendarYearErrors.concat(calendarMonth)) || [calendarMonth];\n\n    return {\n      ...previousError,\n      [calendarYear]: calendarYearErrors\n    };\n  }\n\n  return previousError;\n};\n\n\n/**\n * Returns an object tof the following shape:\n * {\n *   [<projectionType]: {\n *     [<errorType]: {\n *       [<calendarYear]: [<calendarMonth1, ..., calendarMonth12]\n *     },\n *     ...\n *   },\n *   ...\n * }\n *\n * @param  {array<object>} sourceDatasets Array of source datasets form the server\n * @return {object}                       An object with aforementioned shape\n */\nexport const getErrorsByProjectionTypesFromSourceDatasets = (sourceDatasets) => {\n  const cleanedSourceDatasets = cleanSourceDatasetErrors(sourceDatasets);\n\n  return cleanedSourceDatasets && cleanedSourceDatasets.reduce((previousDatasets, currentDataset) => {\n    const {\n      data_errors: dataErrors,\n      metadata: {\n        name: projectionType\n      }\n    } = currentDataset;\n\n    return {\n      [projectionType]: dataErrors.reduce((previousErrors, currentError) => {\n        const { name: errorType } = currentError;\n        const previousError = previousErrors && previousErrors[errorType];\n\n        return {\n          ...previousErrors,\n          [errorType]: formatError(previousError, currentError, errorType)\n        };\n      }, {}),\n      ...previousDatasets\n    };\n  }, {});\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/projections_utils.tsx","import React, { Component, CSSProperties } from 'react';\nimport _ from 'lodash';\nimport classNames from 'classnames';\n\nimport SummaryReportStore from '../stores/summary_report_store';\n\nclass SummaryTableHead extends Component<any, any> {\n  getFixedRowStyle(customStyles = {}) {\n    return Object.assign({\n      position: 'relative',\n      top: this.props.scrollTop,\n      zIndex: 3\n    } as CSSProperties, customStyles);\n  }\n\n  getFixedColumnStyle(customStyles = {}) {\n    return Object.assign({\n      borderRightWidth: this.props.scrollLeft ? '1px' : 0,\n      position: 'relative',\n      left: this.props.scrollLeft,\n      zIndex: 3\n    } as CSSProperties, customStyles);\n  }\n\n  renderCollapseCell() {\n    const { handleAllExpansion, pendingExpandAll, expandedLines, trueLines, lines, expandedNodes } = this.props;\n    const anyExpandedRootLines = _.some(expandedLines, ([line]) =>\n      expandedNodes[line.id] === 'expanded'\n    );\n\n    const firstColumnStyle = this.getFixedRowStyle(this.getFixedColumnStyle({\n      paddingLeft: pendingExpandAll ? 7 : null,\n      zIndex: 4\n    }));\n\n    if (_.every(trueLines, 'childless')) {\n      return (\n        <th\n          style={firstColumnStyle}\n          className=\"row-header\"\n        />\n      );\n    } else {\n      return (\n        <th\n          style={firstColumnStyle}\n          className=\"no-sort expander row-header\"\n        >\n          <button className=\"ui-drop-item__button\" onClick={handleAllExpansion.bind(null, lines)}>\n            {pendingExpandAll ? <span className=\"ui-drop-item__icon\" /> : null}\n            <span className=\"ui-table__cell__link\">\n              {anyExpandedRootLines ? 'Collapse All' : 'Expand All'}\n            </span>\n          </button>\n        </th>\n      );\n    }\n  }\n\n  renderHeaderCell(dataSet) {\n    const headers = [];\n\n    const headerTitle = dataSet.title;\n    const classes = classNames('header', {\n      'no-sort uncertain': dataSet.type === 'budget',\n      currency: SummaryReportStore.getReportAmountType().isCurrency\n    });\n\n    headers.push(\n      <th\n        style={this.getFixedRowStyle()}\n        className={classes}\n        data-hint={dataSet.prorated ? 'Prorated' : null}\n        data-hint-position=\"bottom\"\n        data-hint-align=\"right\"\n        key={headerTitle}\n      >\n        <strong dangerouslySetInnerHTML={{__html: headerTitle}} />\n        {\n          dataSet.prorated\n            ? <a className=\"ui-table__cell__label icon-info-1\" />\n            : null\n        }\n      </th>\n    );\n\n    if (dataSet.showVariance) {\n      headers.push(\n        <th\n          style={this.getFixedRowStyle()}\n          className={classes}\n          data-hint={dataSet.varianceBaseType === 'projection' ? 'Projection vs Budget' : 'Actual vs Budget'}\n          data-hint-position=\"bottom\"\n          data-hint-align=\"right\"\n          key={`${dataSet.year}-value`}\n          >\n          <strong>{dataSet.year}</strong> Variance\n          <a className=\"ui-table__cell__label icon-info-1\" />\n        </th>\n      );\n\n      headers.push(\n        <th\n          style={this.getFixedRowStyle()}\n          className={classes}\n          data-hint={dataSet.varianceBaseType === 'projection' ? 'Projection vs Budget' : 'Actual vs Budget'}\n          data-hint-position=\"bottom\"\n          data-hint-align=\"right\"\n          key={`${dataSet.year}-percent`}\n        >\n          <strong>{dataSet.year}</strong> Variance\n          <a className=\"ui-table__cell__label icon-info-1\" />\n        </th>\n      );\n    }\n\n    return headers;\n  }\n\n  render() {\n    const { dataSets, pendingExpandAll, headerHeight } = this.props;\n    return (\n      <thead>\n        <tr\n          style={this.getFixedRowStyle(this.getFixedColumnStyle({\n            height: headerHeight,\n            position: 'absolute'\n          }))}\n          className=\"fixed-row-background\"\n        />\n        <tr style={{position: 'relative'}} className={classNames({\n          loading: pendingExpandAll\n        })}>\n          {this.renderCollapseCell()}\n          {dataSets.map(dataSet => this.renderHeaderCell(dataSet) )}\n        </tr>\n      </thead>\n    );\n  }\n}\n\nexport default SummaryTableHead;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/tables_section/summary_table_head.tsx","export const getHighlightingClass = (account_type, highlight_variance, current_variance, variance_formulas) => {\n  const delta = Math.abs(current_variance);\n\n  if (variance_formulas.isVarianceOverOrUnderBudget(account_type, current_variance)) {\n    if (delta > 0 && delta <= highlight_variance) {\n      return 'over1x';\n    } else if (delta > highlight_variance && delta <= (2 * highlight_variance)) {\n      return 'over2x';\n    } else if (delta > (2 * highlight_variance)) {\n      return 'over3x';\n    }\n\n  }\n  return 'normal';\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/summary_table_utils.ts","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport * as Ovid from '@opengov/ovid';\nimport classNames from 'classnames';\nimport DataGrid from './datagrid_component';\nimport SummaryTable from './summary_table';\n\nimport utils from '../querygrid/utils';\n\nimport GridReportActions from '../actions/grid_report_actions';\nimport GridReportStore from '../stores/grid_report_store';\nimport { StoreListener } from '@opengov/og_flux';\n\nimport { ReportHeaderRowCount } from '../griddle/report_header_row_count';\n\nimport createReactClass from 'create-react-class';\n\nconst EmbeddedGriddleComponent = createReactClass<any, any>({\n  propTypes: {\n    isBalanceSheetReport: PropTypes.bool,\n    isPublic: PropTypes.bool,\n    query: PropTypes.object,\n    report: PropTypes.object,\n    locale: PropTypes.string,\n    entity: PropTypes.object,\n    linkedYears: PropTypes.array,\n    overlay: PropTypes.object,\n    scale: PropTypes.object,\n    metricData: PropTypes.object,\n    projections: PropTypes.bool,\n    projectionType: PropTypes.string\n  },\n\n  mixins: [\n    StoreListener(GridReportStore)\n  ] as any,\n\n  storeDidUpdate() {\n    //make sure this has grid + columns before setting the property\n    const grid = GridReportStore.getState().get('grid');\n    if (!GridReportStore.getState().get('loading') && grid && grid.get('columns')) {\n      this.setState({columnProperties: grid.get('columns').toJSON()});\n    }\n  },\n\n  getInitialState() {\n    const state = GridReportStore.getState();\n\n    return {\n      initialized: false,\n      loading: true,\n      errorMessage: null,\n      griddleState: null,\n      filter: '',\n      fromDate: null,\n      toDate: null,\n      availableYears:[],\n      date: moment(),\n      transactionTableHeight: 500,\n      queryModel: state.get('queryModel'),\n      columnProperties: [],\n      selectedTab: 0\n    };\n  },\n\n  shouldRenderDatagrid() {\n    if (!this.props.report) {\n      return false;\n    }\n\n    const isPublicMode = !this.props.embedded;\n    const isHidden = this.props.report.get('hidden');\n\n      //Don't show the linked tx report if there isn't a child report, or if this is in public mode and the linked report is private\n    return !(isPublicMode && isHidden);\n  },\n\n  componentDidMount() {\n    if (this.shouldRenderDatagrid()) {\n      _.defer(() =>\n        GridReportActions.loadGridState({query: this.props.report.get('properties').grid_state_id}));\n    }\n  },\n\n  handleFetchAvailableYears(years) {\n    const minYear = moment([years[0], 0, 1]);\n    const maxYear = moment([years[years.length - 1], 0, 1]);\n\n    if (this._isMounted) {\n      this.setState({minYear, maxYear, date: maxYear});\n      this.handleDateChange(maxYear);\n      this.formatYearSelection(maxYear);\n    }\n  },\n\n  griddleStateChangeHandler(state) {\n    this.setState({griddleState: state});\n  },\n\n  onKeyUp(ev) {\n    const text = this.refs.search.value;\n\n    //Trap for enter keypress\n    if (ev.which === 13) {\n      GridReportActions.filterColumn('all', 'contains', utils.parseNumber(text) || text);\n    }\n  },\n\n  changeHandler(event) {\n    if (event.target.value === '') {\n      GridReportActions.filterColumn('all', 'contains', '');\n    }\n  },\n\n  handleFilterReset() {\n    this.refs.search.value = '';\n    GridReportActions.filterColumn('all', 'contains', '');\n  },\n\n  handleDateChange(date) {\n    const fyMonthOffset = this.props.entity.get('fiscal_year_start_month') - 1;\n    const fiscalAdjust = fyMonthOffset === 0 ? 1 : 0;\n    const from = moment([date.year() - 1 + fiscalAdjust, fyMonthOffset, 1]).locale(this.props.locale);\n    const to = from.clone().add(1, 'years').subtract(1, 'second');\n    this.setState({fromDate:from, toDate:to, date});\n  },\n\n  buildFormattedFYString(from, to) {\n    return (from && to) ? <span>FY {from.year() + ' - ' + to.year()}</span> : null;\n  },\n\n  handleSelectedTab(index) {\n    if (index === 1) {\n      this.setState({\n        transactionTableHeight: (ReactDOM.findDOMNode(this.refs.container) as any).offsetHeight,\n        isGridVisible: true,\n        selectedTab: index\n      });\n    } else {\n      this.setState({\n        isGridVisible: false,\n        selectedTab: index\n      });\n    }\n  },\n\n  formatYearSelection(date) {\n    return <span>Transactions for <strong>FYE {date.year()}</strong> </span>;\n  },\n\n  getTabContent(griddleState, isGridVisible) {\n    if (isGridVisible && griddleState && !griddleState.loadingTotals) {\n      const txTabCount = griddleState.count || 0;\n      return txTabCount > 9999 ? '9999+' : txTabCount.toString();\n    }\n\n    if (!isGridVisible && griddleState && !griddleState.loadingTotals && griddleState.count === 0) {\n      return '0';\n    }\n\n    return '';\n  },\n\n  getTabIcons(griddleState, isGridVisible) {\n    if (griddleState && griddleState.loadingTotals ) {\n      return (\n        <span className=\"ui-badge_loader_container\">\n              <div className=\"querygrid-loader__icon_loading ui-badge_loader\" />\n        </span>\n      );\n    }\n    if (!isGridVisible && griddleState && !griddleState.loadingTotals && griddleState.count !== 0) {\n      return <div className=\"ui-badge_exists\"></div>;\n    }\n\n    return null;\n  },\n\n  render() {\n    const txTabCount = this.getTabContent(this.state.griddleState, this.state.isGridVisible);\n    const txTabIcons = this.getTabIcons(this.state.griddleState, this.state.isGridVisible);\n    return (\n      <span>\n        {this.shouldRenderDatagrid() ?\n          <Ovid.Tabs.Container minimal={true} selectedTabIndex={this.state.selectedTab} selectedTabHandler={this.handleSelectedTab} ref=\"container\">\n\n            <Ovid.Tabs.Tab\n              title=\"Summary Table\"\n              tabPanelClasses=\"table-tab-panel table-tab-panel_breakdown\">\n                <SummaryTable\n                  isBalanceSheetReport={this.props.isBalanceSheetReport}\n                  fiscalYearStartMonth={this.props.entity.get('fiscal_year_start_month')}\n                  athenaState={this.props.athenaState}\n                  reportEvents={this.props.reportEvents}\n                  expandedNodes={this.props.expandedNodes}\n                  height={this.props.height}\n                  accountType={this.props.accountType}\n                  overlay={this.props.overlay}\n                  metricData={this.props.metricData}\n                  scale={this.props.scale}\n                  stickyHeader={true}\n                  highlighting={this.props.highlighting}\n                  highlightingVariance={this.props.highlightingVariance}\n                  projections={this.props.projections}\n                  projectionType={this.props.projectionType} />\n            </Ovid.Tabs.Tab>\n            <Ovid.Tabs.Tab\n              title={\n                <span>\n                  { this.props.report.get('name') }\n                  { txTabIcons }\n                </span>\n              }\n              tabPanelClasses=\"table-tab-panel table-tab-panel_datagrid\"\n              tabCount={txTabCount}>\n              <header className=\"table__header\">\n                <div className=\"ui-col-2of6\">\n                  <div className=\"ui-search small\">\n                    <span className=\"icon-search-1\" />\n                    <input type=\"search\" ref=\"search\"\n                      placeholder=\"Search in table\"\n                      onChange={this.changeHandler}\n                      onKeyUp={this.onKeyUp} />\n                    <span className={'icon-remove-2 ' + classNames({'is-active': this.state.value})}\n                      onClick={this.clearSearch} />\n                  </div>\n                </div>\n                <div className=\"ui-col-2of6\">\n                  {this.state.griddleState != null ?\n                    <ReportHeaderRowCount\n                      className=\"row-count\"\n                      count={this.state.griddleState.count}\n                      estimate={this.state.griddleState.estimate}\n                    /> : null}\n                </div>\n                <div className=\"date-pagination ui-col-2of6\">\n                  <Ovid.DatePicker\n                    minYear={this.state.minYear}\n                    maxYear={this.state.maxYear}\n                    formatDisplayDate={this.formatYearSelection}\n                    minSelectionMode=\"years\"\n                    date={this.state.date}\n                    onDateSelected={this.handleDateChange} />\n                </div>\n              </header>\n              <DataGrid ref=\"griddle\"\n                locale={this.props.locale}\n                height= { this.state.transactionTableHeight }\n                entity={this.props.entity}\n                isVisible={this.state.selectedTab === 1}\n                fromDate={this.state.fromDate}\n                toDate={this.state.toDate}\n                query={this.props.query}\n                queryModel={this.state.queryModel}\n                linkageNodes={this.props.linkageNodes}\n                maskNodesForLinkage={this.props.maskNodesForLinkage}\n                filter={this.state.filter}\n                report={this.props.report}\n                columnProperties={this.state.columnProperties}\n                linkedYears={this.props.linkedYears}\n                onFilterReset={this.handleFilterReset}\n                onGriddleStateChange={this.griddleStateChangeHandler}\n                onBreakdownTableSwitch={this.props.handleBreakdownTabSwitch}\n                onFetchAvailableYears={this.handleFetchAvailableYears}/>\n            </Ovid.Tabs.Tab>\n          </Ovid.Tabs.Container>\n        :\n          <SummaryTable\n            isBalanceSheetReport={this.props.isBalanceSheetReport}\n            fiscalYearStartMonth={this.props.entity.get('fiscal_year_start_month')}\n            athenaState={this.props.athenaState}\n            reportEvents={this.props.reportEvents}\n            expandedNodes={this.props.expandedNodes}\n            height={this.props.height}\n            accountType={this.props.accountType}\n            overlay={this.props.overlay}\n            scale={this.props.scale}\n            metricData={this.props.metricData}\n            highlighting={this.props.highlighting}\n            highlightingVariance={this.props.highlightingVariance}\n            projections={this.props.projections}\n            projectionType={this.props.projectionType} />\n        }\n      </span>\n    );\n  }\n});\n\n\nexport default EmbeddedGriddleComponent;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/tables_section/datagrid_container_component.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport classNames from 'classnames';\n\nimport $ from 'jquery';\nimport * as og from './../og';\nimport Backbone from 'backbone';\nimport moment from 'moment';\n\nimport QueryGrid from './../querygrid/querygrid';\nimport RemoteModel from './../querygrid/remotemodel';\nimport ContextMenu from './../querygrid/plugins/contextmenu';\nimport HeaderMenu from './../querygrid/plugins/headermenu';\nimport { numberTypes, localeToCurrency } from '../numberTypes';\n\nimport createReactClass from 'create-react-class';\n\nconst DataGrid = createReactClass<any, any>({\n  propTypes: {\n    query: PropTypes.object,\n    queryModel: PropTypes.object,\n    filter: PropTypes.string,\n    report: PropTypes.object,\n    linkedYears: PropTypes.array,\n    fromDate: PropTypes.object,\n    toDate: PropTypes.object,\n    locale: PropTypes.string,\n    onFetchAvailableYears: PropTypes.func,\n    onGriddleStateChange: PropTypes.func\n  },\n\n  getInitialState() {\n    return {\n      initialized: false,\n      loading: true,\n      errorMessage: null,\n      griddleState: null,\n      columns: [],\n      reportNumberType: numberTypes.dollar,\n      dateColumn: ''\n    };\n  },\n\n  getDefaultProps() {\n    return {\n      height: 0,\n      width: 0\n    };\n  },\n\n  componentDidMount() {\n    this._createModels(this.props.report, this.props.isVisible);\n    this._createGridInstance(this.props.report);\n    this._adjustGridDimensions(this.props.height, this.props.width);\n  },\n\n  componentWillReceiveProps(nextProps) {\n    const tableHeaderHeight = $('.table__header').outerHeight();\n    const tabHeadingHeight = $('.ui-tab-card__header').outerHeight();\n\n    this._adjustGridDimensions(this.props.height, this.props.width);\n\n    if (nextProps.width !== this.props.width || nextProps.height !== this.props.height) {\n      this._adjustGridDimensions(nextProps.height - (tableHeaderHeight + tabHeadingHeight), nextProps.width);\n    }\n\n    //re-fetch all schema data for a new report that gets passed in\n    if (nextProps.report.id !== this.props.report.id) {\n      this._createModels(nextProps.report, nextProps.isVisible);\n      this._createGridInstance(nextProps.report);\n    }\n    const locale = nextProps.locale ? nextProps.locale : this.props.report && this.props.report.attributes.locale;\n\n    if (nextProps.columnProperties !== this.props.columnProperties && nextProps.columnProperties.length > 0 && this.grid) {\n      this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), nextProps.columnProperties), locale);\n    }\n\n    //Dates\n    if ((this.props.fromDate && this.props.toDate)) {\n      this.props.queryModel.filterColumn(this.state.dateColumn, 'ge', nextProps.fromDate.format('YYYY-MM-DD'));\n      this.props.queryModel.filterColumn(this.state.dateColumn, 'le', nextProps.toDate.format('YYYY-MM-DD'));\n    }\n\n    //CoA Filters\n    if (nextProps.linkageNodes) {\n      this.props.queryModel.setLinkageNodes(nextProps.linkageNodes, nextProps.maskNodesForLinkage);\n    } else {\n      this.props.queryModel.setAccountCodeQuery(nextProps.query);\n    }\n\n\n    //Visiblity prop (Prevents blank grid bug when grid is tabbed into view)\n    if (nextProps.isVisible !== this.props.isVisible && this.grid) {\n      this.grid.resizeCanvas();\n      this.grid.handleViewportChanged();\n      this.grid.adjustHeader();\n    }\n\n    if (nextProps.isVisible !== this.props.isVisible) {\n      this.loader.options.endpoint = nextProps.isVisible ? this.createFetchDataHandler(nextProps.report) : this.emptyFetchDataHandler();\n\n      if (nextProps.isVisible) {\n        this.props.queryModel.trigger('load');\n      }\n    }\n  },\n\n  componentWillUnmount() {\n    this.loader.off();\n    this.props.queryModel.off();\n    this.griddleState.off();\n  },\n\n  _createGridInstance(report) {\n    this.fetchGridState(report).then(({ grid_state }) => {\n      const columns = _.get(grid_state, 'columns', []);\n\n      this.fetchSchema(report).then((data) => {\n        const locale = this.props.locale || report.get('locale');\n        const reportNumberType = localeToCurrency(locale);\n        this.setState({ reportNumberType: reportNumberType, dateColumn: data.meta.date_column });\n        const transformedCols = this.getColumnProperties(data.schema, columns, reportNumberType);\n        this._createSlickgridInstance(transformedCols, data.meta, locale);\n        return data;\n      }).then((data) => {\n        const dateColumn: any = _.find(data.schema, {name: data.meta.date_column});\n        if (dateColumn) {\n          const transformedYears = this._fiscalYearRange(dateColumn.min_value, dateColumn.max_value);\n          this.props.onFetchAvailableYears(_.intersection(transformedYears, this.props.linkedYears));\n        }\n      });\n    });\n  },\n\n  _fiscalYearRange(minDate, maxDate) {\n    const fiscalYearStartMonth = this.props.entity.fiscal_year_start_month;\n    minDate = moment(minDate);\n    maxDate = moment(maxDate);\n    const minDateAfterFYBreak = fiscalYearStartMonth !== 1 && minDate.month() + 1 >= fiscalYearStartMonth;\n    const maxDateBeforeFYBreak = fiscalYearStartMonth === 1 || maxDate.month() + 1 < fiscalYearStartMonth;\n\n    return _.range(minDate.year() + (minDateAfterFYBreak ? 1 : 0), maxDate.year() + (maxDateBeforeFYBreak ? 1 : 2));\n  },\n\n  _adjustGridDimensions: _.debounce(function(height, width) {\n    const container = $('.querygrid');\n    container.css({\n      width: width === 0 ? '100%' : width,\n      height: height === 0 ? '100%' : height\n    });\n\n    if (this.grid) {\n      this.grid.resizeCanvas();\n      this.onViewportChanged();\n      this.grid.adjustHeader();\n    }\n  }, 250, {leading: true}),\n\n  _createModels(report, isVisible) {\n    this.griddleState = new Backbone.Model();\n    this.loader = new RemoteModel({\n      endpoint: isVisible ? this.createFetchDataHandler(report) : this.emptyFetchDataHandler(),\n      queryModel: this.props.queryModel\n    });\n  },\n\n  fetchTotal(report, query) {\n\n    const $deferred = $.Deferred();\n    const parameters: any = {filter: query.filter, entity_id: this.props.entity.id};\n\n    if (query.linkage_nodes) {\n      parameters.linkage_nodes = query.linkage_nodes;\n      parameters.mask_nodes_for_linkage = query.mask_nodes_for_linkage;\n    } else {\n      parameters.account_codes = query.account_codes;\n    }\n\n    og.api.trapi.post('total', report.get('transaction_id'), parameters, (error, response) => {\n      if (error || (response && response.error)) {\n        this.setState({isError: true});\n        $deferred.reject();\n        return;\n      }\n      $deferred.resolve(response && response.body);\n    });\n\n    return $deferred;\n  },\n\n  fetchSchema(report) {\n    const params: any = {};\n    const entity = this.props.entity;\n    const featurePermissions = this.props.entity.get('feature_permissions');\n\n    if (_.includes(featurePermissions, 'linkage_view')) {\n      params.linkage_view = true;\n      params.entity_id = entity.id;\n    }\n\n    const $deferred = $.Deferred();\n\n    og.api.trapi.get('schema', report.get('transaction_id'), params, (error, response) => {\n      if (error || (response && response.error)) {\n        this.setState({isError: true});\n        $deferred.reject();\n        return;\n      }\n\n      $deferred.resolve(response && response.body);\n    });\n\n    return $deferred;\n  },\n\n  fetchGridState(report) {\n    const $deferred = $.Deferred();\n    const gridStateId = report.get('properties').grid_state_id;\n\n    // If grid report is not configured defult grid_state_id\n    // will be null and break grid_state query.\n    // Bypass here to apply defaults\n    if (!gridStateId) {\n      $deferred.resolve({});\n      return $deferred;\n    }\n\n    og.api.get('grid_state', gridStateId, (error, response) => {\n      if (error || (response && response.error)) {\n        this.setState({isError: true});\n        $deferred.reject();\n        return;\n      }\n\n      $deferred.resolve(response && response.body);\n    });\n\n    return $deferred;\n  },\n\n  createFetchDataHandler(report) {\n    return function(q, cb) {\n      const query = {...q, entity_id: report.get('entity')};\n      return og.api.trapi.post('query', report.get('transaction_id'), query, (error, response) => {\n        cb(error, response);\n      });\n    };\n  },\n\n  emptyFetchDataHandler() {\n    return function(q, cb) {\n      const response = { body: { transactions: [] } };\n      cb(null, response);\n      return ($ as any).ajax();\n    };\n  },\n\n  _createSlickgridInstance(columns, meta, locale) {\n    const grid = this.grid = new (QueryGrid as any)({\n      container: '.querygrid',\n      gridOptions: {},\n      characterWidth: 7,\n      cellPadding: 40,\n      autoWidth: true,\n      height: '500px',\n      queryModel: this.props.queryModel,\n      loader: this.loader,\n      columns,\n      meta,\n      showDropdown: true,\n      sendVisibleFieldsOnly: true\n    });\n\n    // header menu plugin for filtering and querying\n    const headerMenuPlugin = new HeaderMenu({\n      locale,\n      queryModel: this.props.queryModel,\n      features: {\n        hideColumn: false\n      }\n    });\n    grid.registerPlugin(headerMenuPlugin);\n\n    // plugin for right-click menu actions\n    const contextMenuPlugin = new ContextMenu({\n      queryModel: this.props.queryModel,\n      positionCallback(elementPosition, otherProperties) {\n        $(this).css({\n          top: otherProperties.element.top,\n          left: otherProperties.element.left\n        });\n      }\n    });\n\n    grid.registerPlugin(contextMenuPlugin);\n\n    grid.on('viewportChanged', this.onViewportChanged, this);\n\n    this.setReportState(this.props.report.get('properties'));\n    grid.handleViewportChanged();\n    grid.adjustHeader();\n\n    this.loader.on('loading', () => {\n      this.setState({loading: true});\n    });\n    this.loader.on('loaded', () => {\n      this.setState({loading: false});\n      this.grid.adjustHeader();\n    });\n    this.loader.on('error', (e) => {\n      this.setState({errorMessage: JSON.stringify(e)});\n    });\n\n    //'load' is emitted when the query model attributes changed (which invalidates all local data and count totals)\n    this.props.queryModel.on('load', function() {\n      const query = this.props.queryModel.toJSON();\n\n      this.loader.processQuery(query);\n      this.loader.clear();\n\n      this.griddleState.set({\n        loadingTotals: true\n      });\n      this.fetchTotal(this.props.report, query).then((data) => {\n        this.griddleState.set({\n          count: data.count,\n          amount: data.total,\n          loadingTotals: false\n        });\n      });\n\n      this.grid.handleViewportChanged();\n      this.grid.adjustHeader();\n    }, this);\n\n    this.griddleState.on('change', () => {\n      this.setState({griddleState: this.griddleState.toJSON()}, () => {\n        if (this.props.onGriddleStateChange) {\n          this.props.onGriddleStateChange(this.griddleState.toJSON());\n        }\n      });\n    });\n  },\n\n  getColumnProperties(schema, columnSettings, numberType = this.state.reportNumberType) {\n    const schemaColumns = _.chain(schema).map((c) => {\n      const label = c.type === 'monetary' && c.label.indexOf(numberType.symbol) < 0 ? `${c.label} (${numberType.symbol})` : c.label;\n      return _.extend(c, {\n        id: c.id || c.name,\n        label: label\n      });\n    }).keyBy('id').value();\n    const settingsColumns = columnSettings || [];\n    const columns = [];\n\n    // get columns in the order that was set in report settings\n    _.each(settingsColumns, (c) => {\n      if (c.id in schemaColumns) {\n        columns.push(_.extend({}, schemaColumns[c.id], c));\n        delete schemaColumns[c.id];\n      }\n    });\n\n    // add the rest of the columns from schema\n    _.each(schema, (c) => {\n      if (c.id in schemaColumns) {\n        columns.push(_.extend({visible: !c.hidden}, schemaColumns[c.id]));\n      }\n    });\n\n    return columns;\n  },\n\n  onViewportChanged() {\n    const vp = this.grid.getViewport();\n    this.griddleState.set({\n      top: vp.top,\n      bottom: vp.bottom\n    });\n  },\n\n  resetFilters() {\n    const queryModel = this.props.queryModel;\n    queryModel.beginUpdate();\n    queryModel.filterClear();\n    queryModel.sort([]);\n    queryModel.endUpdate();\n  },\n\n  setReportState(state) {\n    const locale = this.props && this.props.locale ? this.props.locale : this.props && this.props.report && this.props.report.attributes.locale;\n    this.grid.setAllColumns(this.getColumnProperties(this.grid.getAllColumns(), state.columns), locale);\n    this.props.queryModel.setQuery(_.cloneDeep(state.query));\n  },\n\n  handleFilterReset() {\n    this.props.onFilterReset();\n    this.resetFilters();\n  },\n\n  render() {\n\n    const loaderClasses = classNames({\n      'error-state': this.state.isError,\n      'querygrid-loader ajax-loader': true\n    });\n\n    return (\n      <div>\n  {(this.state.griddleState && this.state.griddleState.count === 0 && !this.state.loading) ?\n    <p className=\"ui-null align-center\">\n      There's no transaction data for the given year or filter, try <a onClick={this.handleFilterReset}>resetting</a> your selection.\n    </p>\n    : null}\n        <div className=\"querygrid\" style={{display: 'inline-block'}}/>\n        <div className={loaderClasses} style={{display: this.state.loading ? 'block' : 'none'}}>\n          <div className=\"querygrid-loader__icon_loading\"></div>\n          <div className=\"querygrid-loader__icon_error icon-exclamation-4\"></div>\n          <div className=\"querygrid-loader__text_loading\">Loading...</div>\n          <div className=\"querygrid-loader__text_error\">Transactions Unavailable</div>\n          {!this.state.isError ? <div className=\"querygrid-loader__button js-griddle-loader-button\">Cancel</div> : null}\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default DataGrid;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/tables_section/datagrid_component.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport classNames from 'classnames';\nimport ReportWizard from './wizard';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportVisibility = createReactClass<any, any>({\n  propTypes: {\n    hidden: PropTypes.bool.isRequired\n  },\n\n  render() {\n    const hidden = this.props.hidden;\n    const visibiltyClass = hidden ? 'icon-team-1' : 'icon-public-1';\n    const visibilityHint = hidden ? 'Visible only to my organization' : 'Visible to the public';\n\n    return (\n      <span className={visibiltyClass}\n        data-hint={visibilityHint}\n        data-hint-align=\"right\"\n        data-hint-position=\"bottom\" />\n    );\n  }\n});\n\nconst ReportPanelItem = createReactClass<any, any>({\n  propTypes: {\n    report: PropTypes.object.isRequired,\n    href: PropTypes.string.isRequired,\n    selected: PropTypes.bool,\n    isOtherEntity: PropTypes.bool,\n    isDefault: PropTypes.bool\n  },\n\n  render() {\n    const report = this.props.report;\n\n    const itemClasses = classNames({\n      'report-menu__item': true,\n      'is-selected': !!this.props.selected\n    });\n\n    const productIconClass = 'report-menu__item__type icon-px-' + report.get('technical_name') + '-1';\n\n    return (\n      <a onClick={this.props.onClick}\n        href={this.props.href}\n        className={itemClasses}>\n        <div className=\"report-menu__item__title\">\n          <span className={productIconClass} />\n          <h3>{report.get('name')}</h3>\n          {!this.props.isOtherEntity ?\n            <div className=\"report-menu__actions\">\n              <ReportVisibility hidden={report.get('hidden')} />\n            </div>\n          : null}\n        </div>\n        {report.has('description') ?\n          <small>{report.get('description')}</small>\n        : null}\n      </a>\n    );\n  },\n\n  handleSettings(e) {\n    e.stopPropagation();\n    this.props.report.editSettings();\n  }\n});\n\nconst ReportPanelList = createReactClass<any, any>({\n  propTypes: {\n    reports: PropTypes.object,\n    entity: PropTypes.object.isRequired,\n    entityDefaultReportId: PropTypes.any,\n    isOtherEntity: PropTypes.bool,\n    onClose: PropTypes.func\n  },\n\n  render() {\n    if (this.props.reports.isEmpty()) {\n      return (\n        <p className=\"ui-null\">\n          <strong>No reports available to view.</strong>\n        </p>\n      );\n    }\n\n    return (\n      <nav className=\"report-menu\">\n        {this.props.reports.map(function(report) {\n          return (\n            <ReportPanelItem\n              key={report.id}\n              report={report}\n              selected={this.props.selectedReportId === report.id}\n              isDefault={report.id === this.props.entityDefaultReportId}\n              href={'#/' + this.props.entity.id + '/reports/' + report.id}\n              isOtherEntity={this.props.isOtherEntity}\n              onClick={this.props.onClose}\n              onMakeDefault={this.props.onMakeDefaultReport} />\n          );\n        }, this)}\n      </nav>\n    );\n  }\n});\n\nconst ReportsTab = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object.isRequired,\n    reports: PropTypes.object\n  },\n\n  render() {\n    const entity = this.props.entity;\n    const entityDefaultReportId = this.props.reportEntity.get('default_report_id');\n\n    return (\n      <div>\n        {!this.isOtherEntity() && this.props.session.can('create', 'report') ?\n        <footer className=\"ui-panel__footer\">\n          <div className=\"ui-panel__actions\">\n            <a id=\"wd-create-report-button\" className=\"ui-button primary\" href={'#' + entity.id + '/reports/new'}>Create new</a>\n          </div>\n        </footer>\n        : null}\n        <div className=\"ui-panel__content ui-container_scroll\">\n          {this.props.reports ?\n            <ReportPanelList\n              entity={entity}\n              reports={this.props.reports}\n              selectedReportId={_.result(this.props.selectedReport, 'id')}\n              entityDefaultReportId={entityDefaultReportId}\n              isOtherEntity={this.isOtherEntity()}\n              onMakeDefaultReport={this.props.onMakeDefaultReport}\n              onClose={this.props.onClose} />\n          : <div className=\"ui-loading\" />}\n        </div>\n        {this.isOtherEntity() ?\n          <footer className=\"ui-panel__footer\">\n            <button className=\"ui-button\"\n              onClick={this.props.onClickAllEntities}>\n              <span className=\"icon-left-1\" />\n              All Entities\n            </button>\n          </footer>\n        : null}\n      </div>\n    );\n  },\n\n  isOtherEntity() {\n    return this.props.entity !== this.props.reportEntity;\n  }\n});\n\nexport default createReactClass<any, any>({\n  render() {\n    if (!this.props.isOpen) {\n      return (<div></div>);\n    }\n\n    return (\n      <div className=\"ui-panel__wrapper\" onClick={this.handleWrapperClick}>\n        <div className=\"report-panel ui-panel wide\" onClick={this.handleRootClick}>\n          <header className=\"ui-panel__header\">\n            <h3>Reports</h3>\n            <span className=\"ui-panel__close\" onClick={this.props.onClose} />\n          </header>\n          <ReportsTab\n            reports={this.props.reports}\n            entity={this.props.entity}\n            reportEntity={this.props.entity}\n            session={this.props.session}\n            selectedReport={this.props.selectedReport}\n            onClose={this.props.onClose}\n            onMakeDefaultReport={this.props.onMakeDefaultReport} />\n        </div>\n\n        {this.props.editReport ?\n           <ReportWizard\n           session={this.props.session}\n           flowKey={this.props.flowKey}\n           entity={this.props.entity}\n           report={this.props.editReport}\n           onComplete={this.props.onWizardComplete}\n           onClose={this.props.onClose}\n           onClick={this.handleRootClick} />\n         : null}\n\n      </div>\n    );\n  },\n\n  getInitialState() {\n    return {\n      tab: 'reports'\n    };\n  },\n\n  handleTabClick(tab) {\n    this.setState({\n      tab\n    });\n  },\n\n  handleWrapperClick() {\n    if (!this.clicked && this.props.onClose) {\n      this.props.onClose();\n    }\n    this.clicked = false;\n  },\n\n  handleRootClick() {\n    this.clicked = true;\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/report_panel.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { CSSTransitionGroup } from 'react-transition-group';\nimport transitionDefaults from '../utils/css_transition_defaults';\n\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\n\nimport ReportCreationFlow from './report_creation_flow';\nimport ReportEditFlow from './report_edit_flow';\nimport LinkGridReportFlow from './report_linking_flow';\nimport EventObserver from '../utils/event_observer_mixin';\n\n//Maps from flowKey prop to a machina.Fsm flow definition\nconst flowMap = {\n  NewReport: ReportCreationFlow,\n  EditDatasets: ReportEditFlow,\n  LinkGridReport: LinkGridReportFlow\n};\n\n\nimport createReactClass from 'create-react-class';\n\nconst ReportWizard = createReactClass<any, any>({\n  mixins: [EventObserver] as any,\n\n  propTypes: {\n    report: PropTypes.object.isRequired,\n    entity: PropTypes.object.isRequired,\n    flow: PropTypes.func,  // For testing purposes only to mock up a flow.\n    flowKey: PropTypes.oneOf(Object.keys(flowMap)),\n    onCancel: PropTypes.func,\n    onClose: PropTypes.func\n  },\n\n  getInitialState() {\n    return {\n      history: [],\n      saving: false\n    };\n  },\n\n  componentWillMount() {\n    const ReportFlow = this.props.flow || flowMap[this.props.flowKey];\n    this.originalReport = this.props.report;\n\n    const role = !!this.props.session && this.props.session.get('role');\n    const hasCOASelectionRights = !!role && (role.name === 'opengov_admin' || role.name === 'opengov_tsd');\n\n    this.stateMachine = new ReportFlow({\n      entity: this.props.entity,\n      report: this.originalReport,\n      showCOASelection: hasCOASelectionRights,\n      eventListeners: {\n        transition: [this.handleStateTransition],\n        complete: [this.props.onComplete],\n        close: [this.props.onClose]\n      }\n    });\n\n    this.listenToProp('report', 'error', this.handleReportError);\n    this.listenToProp('report', 'request sync error', this.toggleSaving);\n  },\n\n  componentWillUnmount() {\n    this.props.onClose();\n  },\n\n  render() {\n    let stepComponent = this.stateMachine.getStateComponent();\n    this.modifiedReport = this.originalReport.clone();\n\n    //Pass clone of report model to wizard step components that modify the existing report (these steps only exist in ReportEditFlow)\n    //this.handleNext() will provide the stateMachine with both versions where it can decide how to update the original model and persist the updates\n\n    const report = this.props.report.isNew() ? this.originalReport : this.modifiedReport;\n\n    if (stepComponent) {\n      stepComponent = React.cloneElement(stepComponent, {\n        report,\n        entity: this.props.entity,\n        errors: this.state.errors,\n        saving: this.state.saving,\n        canGoBack: this.state.history.length > 1,\n        onNextStep: this.handleNext,\n        onPrevStep: this.handlePrev,\n        onCancel: this.props.onClose\n      });\n    }\n\n    const displayName = report && report.get('display_name');\n\n    const heading = (this.props.flowKey === 'NewReport' ?\n      <span>New Report {displayName ? <span className=\"icon-righthead-3\">{displayName}</span> : null}</span> :\n      <span><span className=\"icon-settings-1\" /> Settings</span>);\n\n    return (\n      <CSSTransitionGroup transitionName=\"ui-panel\" {...transitionDefaults}>\n        <div className=\"report-wizard-panel ui-panel\" onClick={this.props.onClick}>\n          <header className=\"ui-panel__header\">\n            <h3>{heading}</h3>\n            <div className=\"ui-panel__close\" onClick={this.props.onClose}></div>\n          </header>\n\n          {stepComponent}\n\n        </div>\n      </CSSTransitionGroup>\n    );\n  },\n\n  handleStateTransition(transition) {\n    let nextHistory;\n\n    if (transition.toState === _.last(this.state.history)) {\n      // Going back in history to the previous step.\n      nextHistory = this.state.history.slice(0, -1);\n    } else if (transition.fromState) {\n      // Moving forward to the next step.\n      nextHistory = this.state.history.concat(transition.fromState);\n    }\n\n    if (nextHistory) {\n      this.setState({\n        history: nextHistory\n      });\n    }\n  },\n\n  handleComponentSetProps(nextProps) {\n    this.setState({\n      stepComponentProps: nextProps\n    });\n  },\n\n  handleNext() {\n    this.stateMachine.handle('next', this.originalReport, this.modifiedReport);\n  },\n\n  handlePrev() {\n    const prevState = _.last(this.state.history);\n    this.stateMachine.transition(prevState);\n  },\n\n  handleReportError(model, response) {\n    if (response.status === 422) {\n      const err = model.parseError(response);\n\n      this.stateMachine.handle('error', err);\n\n      this.setState({\n        errors: err.errors\n      });\n\n\n    } else {\n      const message = _.result(response.responseJSON, 'message');\n\n      Ovid.Alert.open({\n        title: 'There was an error while saving the report.',\n        content: <p>{message || 'Please try again and if you continue having issues contact our support team.'}</p>\n      });\n    }\n  },\n\n  toggleSaving() {\n    this.setState({saving: !this.state.saving});\n  }\n});\n\nexport default ReportWizard;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/index.tsx","import React from 'react';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nimport BaseReportFlow from './base_report_flow';\n\nimport Start from './start';\nimport ChooseReportType from './report_type';\nimport ChooseLedgerTypes from './ledger_types';\nimport ChooseGLDataSets from './gl_data_sets';\nimport ChooseChartOfAccounts from './coa';\nimport ChooseTXDataSets from './tx_data_sets';\nimport ChooseReportName from './report_name';\nimport ReportCreated from './report_created';\nimport NoData from './no_data';\nimport { fetchReportTypes, fetchDataSets } from './report_creation_utils';\nimport { trackIntercomEvent } from '../utils/intercom_utils';\n\nfunction chooseLedgerTypes() {\n  if (this.report.get('technical_name') === 'balance') {\n    this.report.get('properties').ledger_types = {'Assets': true, 'Liabilities & Equities': true};\n    this.transition('ChooseLedgerDataSets');\n  } else {\n    this.transition('ChooseLedgerTypes');\n  }\n}\n\nconst ReportCreationFlow = BaseReportFlow.extend({\n  initialState: 'Start',\n\n  validateFlow(flow) {\n    return this === flow;\n  },\n\n  loadReportTypes() {\n    return fetchReportTypes(this);\n  },\n\n  loadDataSets() {\n    return fetchDataSets(this);\n  },\n\n  onDataSetsLoaded() {\n    this.chartOfAccountsIds = this.ledgerDataSets.getChartOfAccountsIds();\n    this.reportTypes.forEach(function(type) {\n      let disabled;\n\n      if (type.get('technical_name') === 'grid') {\n        if (this.failedDataSetRequests.transactions) {\n          disabled = 'Grid report creation is not available right now.';\n\n        } else if (this.transactionDataSets.length < 1) {\n          disabled = 'No transaction data sets uploaded.';\n        }\n      } else {\n        if (this.failedDataSetRequests.ledger) {\n          disabled = 'Summary report creation is not available right now.';\n\n        } else if (this.ledgerDataSets.isEmpty()) {\n          disabled = 'No general ledger data sets uploaded.';\n        }\n      }\n\n      type.set('disabled', disabled);\n    }, this);\n\n    this.handle('dataSetsLoaded');\n  },\n\n  states: {\n    Start: {\n      _component() {\n        return (\n          <Start />\n        );\n      },\n\n      _onEnter() {\n        $.when(this.loadReportTypes(), this.loadDataSets())\n          .then(() => this.onDataSetsLoaded());\n      },\n\n      dataSetsLoaded() {\n        if (!this.ledgerDataSets.isEmpty() || (this.transactionDataSets && this.transactionDataSets.length > 0)) {\n          this.transition('ChooseReportType');\n        } else {\n          this.transition('NoData');\n        }\n      }\n    },\n\n    NoData: {\n      _component() {\n        return (\n          <NoData />\n        );\n      }\n    },\n\n    ChooseReportType: {\n      _component() {\n        return (\n          <ChooseReportType isFirstStep reportTypes={this.reportTypes.toJSON()} />\n        );\n      },\n\n      next(report) {\n        if (report.get('technical_name') === 'grid') {\n          this.transition('ChooseTransactionDataSet');\n        } else if (this.showCOASelection && this.chartOfAccountsIds.length > 1) {\n          this.transition('ChooseChartOfAccounts');\n        } else {\n          report.set('coa_id', this.entity.attributes.default_coa_id);\n          chooseLedgerTypes.bind(this)();\n        }\n      }\n    },\n\n    ChooseChartOfAccounts: {\n      _component() {\n        return (\n          <ChooseChartOfAccounts />\n        );\n      },\n\n      next() {\n        chooseLedgerTypes.bind(this)();\n      }\n    },\n\n    ChooseLedgerTypes: {\n      _component() {\n        return (\n          <ChooseLedgerTypes />\n        );\n      },\n\n      next() {\n        this.transition('ChooseLedgerDataSets');\n      }\n    },\n\n    ChooseLedgerDataSets: {\n      _component() {\n        const dataSets = _.filter(this.ledgerDataSets.toJSON(), {coa_id: this.report.get('coa_id')});\n        return (\n          <ChooseGLDataSets dataSets={dataSets} />\n        );\n      },\n\n      next() {\n        this.transition('ReportDetails');\n      }\n    },\n\n    ChooseTransactionDataSet: {\n      _component() {\n        return (\n          <ChooseTXDataSets />\n        );\n      },\n\n      next() {\n        this.transition('ReportDetails');\n      }\n    },\n\n    ReportDetails: {\n      _component() {\n        return (\n          <ChooseReportName isLastStep />\n        );\n      },\n\n      next() {\n        this.report.save(null, {\n          success: response => {\n            this.emit('complete');\n            if (response && response.attributes) {\n              const metadata = {\n                name: response.attributes.name,\n                coa_mask_id: response.attributes.coa_mask_id,\n                visibility: response.attributes.visibility,\n                reportType: response.attributes.report_type,\n                entityId: response.attributes.entity_id\n              };\n              trackIntercomEvent('create-new-report', metadata);\n            }\n          }\n        });\n      },\n\n      error(response) {\n        const reportType = this.report.get('technical_name');\n        const errors = response.errors || {};\n\n        if (reportType === 'grid') {\n          if (errors.coa) {\n            this.transition('ChooseTransactionDataSet');\n          }\n        } else {\n          if (errors.data_sets) {\n            this.transition('ChooseLedgerDataSets');\n          } else if (errors.coa) {\n            this.report.unset('coa_id');\n            this.transition('ChooseChartOfAccounts');\n          }\n        }\n      }\n    },\n\n    ReportCreated: {\n      _component() {\n        return (\n          <ReportCreated />\n        );\n      }\n    }\n  }\n});\n\nexport default ReportCreationFlow;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_creation_flow.tsx","/**\n * machina - A library for creating powerful and flexible finite state machines.  Loosely inspired by Erlang/OTP's gen_fsm behavior.\n * Author: Jim Cowart (http://freshbrewedcode.com/jimcowart)\n * Version: v0.3.8\n * Url: http://machina-js.org/\n * License(s): MIT, GPL\n */\n\n(function (root, factory) {\n    if (typeof module === \"object\" && module.exports) {\n        // Node, or CommonJS-Like environments\n        module.exports = function (_) {\n            _ = _ || require(\"lodash\");\n            return factory(_);\n        };\n    } else if (typeof define === \"function\" && define.amd) {\n        // AMD. Register as an anonymous module.\n        define([\"lodash\"], function (_) {\n            return factory(_, root);\n        });\n    } else {\n        // Browser globals\n        root.machina = factory(root._, root);\n    }\n}(this, function (_, global, undefined) {\n    var slice = [].slice;\n    var NEXT_TRANSITION = \"transition\";\n    var NEXT_HANDLER = \"handler\";\n    var HANDLING = \"handling\";\n    var HANDLED = \"handled\";\n    var NO_HANDLER = \"nohandler\";\n    var TRANSITION = \"transition\";\n    var INVALID_STATE = \"invalidstate\";\n    var DEFERRED = \"deferred\";\n    var NEW_FSM = \"newfsm\";\n    var utils = {\n        makeFsmNamespace: (function () {\n            var machinaCount = 0;\n            return function () {\n                return \"fsm.\" + machinaCount++;\n            };\n        })(),\n        getDefaultOptions: function () {\n            return {\n                initialState: \"uninitialized\",\n                eventListeners: {\n                    \"*\": []\n                },\n                states: {},\n                eventQueue: [],\n                namespace: utils.makeFsmNamespace(),\n                targetReplayState: \"\",\n                state: undefined,\n                priorState: undefined,\n                _priorAction: \"\",\n                _currentAction: \"\"\n            };\n        }\n    };\n\n    if (!_.deepExtend) {\n        var behavior = {\n            \"*\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = sourcePropVal;\n            },\n            \"object\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = deepExtend({}, obj[sourcePropKey] || {}, sourcePropVal);\n            },\n            \"array\": function (obj, sourcePropKey, sourcePropVal) {\n                obj[sourcePropKey] = [];\n                _.each(sourcePropVal, function (item, idx) {\n                    behavior[getHandlerName(item)](obj[sourcePropKey], idx, item);\n                }, this);\n            }\n        },\n            getActualType = function (val) {\n                if (_.isArray(val)) {\n                    return \"array\";\n                }\n                if (_.isDate(val)) {\n                    return \"date\";\n                }\n                if (_.isRegExp(val)) {\n                    return \"regex\";\n                }\n                return typeof val;\n            },\n            getHandlerName = function (val) {\n                var propType = getActualType(val);\n                return behavior[propType] ? propType : \"*\";\n            },\n            deepExtend = function (obj) {\n                _.each(slice.call(arguments, 1), function (source) {\n                    _.each(source, function (sourcePropVal, sourcePropKey) {\n                        behavior[getHandlerName(sourcePropVal)](obj, sourcePropKey, sourcePropVal);\n                    });\n                });\n                return obj;\n            };\n\n        _.mixin({\n            deepExtend: deepExtend\n        });\n    }\n    var Fsm = function (options) {\n        _.extend(this, options);\n        _.defaults(this, utils.getDefaultOptions());\n        this.initialize.apply(this, arguments);\n        machina.emit(NEW_FSM, this);\n        if (this.initialState) {\n            this.transition(this.initialState);\n        }\n    };\n\n    _.extend(Fsm.prototype, {\n        initialize: function () {},\n        emit: function (eventName) {\n            var args = arguments;\n            if (this.eventListeners[\"*\"]) {\n                _.each(this.eventListeners[\"*\"], function (callback) {\n                    try {\n                        callback.apply(this, slice.call(args, 0));\n                    } catch (exception) {\n                        if (console && typeof console.log !== \"undefined\") {\n                            console.log(exception.toString());\n                        }\n                    }\n                }, this);\n            }\n            if (this.eventListeners[eventName]) {\n                _.each(this.eventListeners[eventName], function (callback) {\n                    try {\n                        callback.apply(this, slice.call(args, 1));\n                    } catch (exception) {\n                        if (console && typeof console.log !== \"undefined\") {\n                            console.log(exception.toString());\n                        }\n                    }\n                }, this);\n            }\n        },\n        handle: function (inputType) {\n            if (!this.inExitHandler) {\n                var states = this.states,\n                    current = this.state,\n                    args = slice.call(arguments, 0),\n                    handlerName, handler, catchAll, action;\n                this.currentActionArgs = args;\n                if (states[current][inputType] || states[current][\"*\"] || this[\"*\"]) {\n                    handlerName = states[current][inputType] ? inputType : \"*\";\n                    catchAll = handlerName === \"*\";\n                    if (states[current][handlerName]) {\n                        handler = states[current][handlerName];\n                        action = current + \".\" + handlerName;\n                    } else {\n                        handler = this[\"*\"];\n                        action = \"*\";\n                    }\n                    if (!this._currentAction) this._currentAction = action;\n                    this.emit.call(this, HANDLING, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                    if (_.isFunction(handler)) handler = handler.apply(this, catchAll ? args : args.slice(1));\n                    if (_.isString(handler)) this.transition(handler);\n                    this.emit.call(this, HANDLED, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                    this._priorAction = this._currentAction;\n                    this._currentAction = \"\";\n                    this.processQueue(NEXT_HANDLER);\n                } else {\n                    this.emit.call(this, NO_HANDLER, {\n                        inputType: inputType,\n                        args: args.slice(1)\n                    });\n                }\n                this.currentActionArgs = undefined;\n            }\n        },\n        transition: function (newState) {\n            if (!this.inExitHandler && newState !== this.state) {\n                var curState = this.state;\n                if (this.states[newState]) {\n                    if (curState && this.states[curState] && this.states[curState]._onExit) {\n                        this.inExitHandler = true;\n                        this.states[curState]._onExit.call(this);\n                        this.inExitHandler = false;\n                    }\n                    this.targetReplayState = newState;\n                    this.priorState = curState;\n                    this.state = newState;\n                    this.emit.call(this, TRANSITION, {\n                        fromState: this.priorState,\n                        action: this._currentAction,\n                        toState: newState\n                    });\n                    if (this.states[newState]._onEnter) {\n                        this.states[newState]._onEnter.call(this);\n                    }\n                    if (this.targetReplayState === newState) {\n                        this.processQueue(NEXT_TRANSITION);\n                    }\n                    return;\n                }\n                this.emit.call(this, INVALID_STATE, {\n                    state: this.state,\n                    attemptedState: newState\n                });\n            }\n        },\n        processQueue: function (type) {\n            var filterFn = type === NEXT_TRANSITION ?\n            function (item) {\n                return item.type === NEXT_TRANSITION && ((!item.untilState) || (item.untilState === this.state));\n            } : function (item) {\n                return item.type === NEXT_HANDLER;\n            };\n            var toProcess = _.filter(this.eventQueue, filterFn, this);\n            this.eventQueue = _.difference(this.eventQueue, toProcess);\n            _.each(toProcess, function (item) {\n                this.handle.apply(this, item.args);\n            }, this);\n        },\n        clearQueue: function (type, name) {\n            if (!type) {\n                this.eventQueue = [];\n            } else {\n                var filter;\n                if (type === NEXT_TRANSITION) {\n                    filter = function (evnt) {\n                        return (evnt.type === NEXT_TRANSITION && (name ? evnt.untilState === name : true));\n                    };\n                } else if (type === NEXT_HANDLER) {\n                    filter = function (evnt) {\n                        return evnt.type === NEXT_HANDLER;\n                    };\n                }\n                this.eventQueue = _.filter(this.eventQueue, filter);\n            }\n        },\n        deferUntilTransition: function (stateName) {\n            if (this.currentActionArgs) {\n                var queued = {\n                    type: NEXT_TRANSITION,\n                    untilState: stateName,\n                    args: this.currentActionArgs\n                };\n                this.eventQueue.push(queued);\n                this.emit.call(this, DEFERRED, {\n                    state: this.state,\n                    queuedArgs: queued\n                });\n            }\n        },\n        deferUntilNextHandler: function () {\n            if (this.currentActionArgs) {\n                var queued = {\n                    type: NEXT_HANDLER,\n                    args: this.currentActionArgs\n                };\n                this.eventQueue.push(queued);\n                this.emit.call(this, DEFERRED, {\n                    state: this.state,\n                    queuedArgs: queued\n                });\n            }\n        },\n        on: function (eventName, callback) {\n            var self = this;\n            if (!self.eventListeners[eventName]) {\n                self.eventListeners[eventName] = [];\n            }\n            self.eventListeners[eventName].push(callback);\n            return {\n                eventName: eventName,\n                callback: callback,\n                off: function () {\n                    self.off(eventName, callback);\n                }\n            };\n        },\n        off: function (eventName, callback) {\n            if (!eventName) {\n                this.eventListeners = {};\n            } else {\n                if (this.eventListeners[eventName]) {\n                    if (callback) {\n                        this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);\n                    } else {\n                        this.eventListeners[eventName] = [];\n                    }\n                }\n            }\n        }\n    });\n\n    Fsm.prototype.trigger = Fsm.prototype.emit;\n\n    // _machKeys are members we want to track across the prototype chain of an extended FSM constructor\n    // Since we want to eventually merge the aggregate of those values onto the instance so that FSMs\n    // that share the same extended prototype won't share state *on* those prototypes.\n    var _machKeys = [\"states\", \"initialState\"];\n    var inherits = function (parent, protoProps, staticProps) {\n        var fsm; // placeholder for instance constructor\n        var machObj = {}; // object used to hold initialState & states from prototype for instance-level merging\n        var ctor = function () {}; // placeholder ctor function used to insert level in prototype chain\n        // The constructor function for the new subclass is either defined by you\n        // (the \"constructor\" property in your `extend` definition), or defaulted\n        // by us to simply call the parent's constructor.\n        if (protoProps && protoProps.hasOwnProperty('constructor')) {\n            fsm = protoProps.constructor;\n        } else {\n            // The default machina constructor (when using inheritance) creates a\n            // deep copy of the states/initialState values from the prototype and\n            // extends them over the instance so that they'll be instance-level.\n            // If an options arg (args[0]) is passed in, a states or intialState\n            // value will be preferred over any data pulled up from the prototype.\n            fsm = function () {\n                var args = slice.call(arguments, 0);\n                args[0] = args[0] || {};\n                var blendedState;\n                var instanceStates = args[0].states || {};\n                blendedState = _.deepExtend(_.cloneDeep(machObj), {\n                    states: instanceStates\n                });\n                blendedState.initialState = args[0].initialState || this.initialState;\n                _.extend(args[0], blendedState);\n                parent.apply(this, args);\n            };\n        }\n\n        // Inherit class (static) properties from parent.\n        _.deepExtend(fsm, parent);\n\n        // Set the prototype chain to inherit from `parent`, without calling\n        // `parent`'s constructor function.\n        ctor.prototype = parent.prototype;\n        fsm.prototype = new ctor();\n\n        // Add prototype properties (instance properties) to the subclass,\n        // if supplied.\n        if (protoProps) {\n            _.extend(fsm.prototype, protoProps);\n            _.deepExtend(machObj, _.transform(protoProps, function (accum, val, key) {\n                if (_machKeys.indexOf(key) !== -1) {\n                    accum[key] = val;\n                }\n            }));\n        }\n\n        // Add static properties to the constructor function, if supplied.\n        if (staticProps) {\n            _.deepExtend(fsm, staticProps);\n        }\n\n        // Correctly set child's `prototype.constructor`.\n        fsm.prototype.constructor = fsm;\n\n        // Set a convenience property in case the parent's prototype is needed later.\n        fsm.__super__ = parent.prototype;\n\n        return fsm;\n    };\n\n    // The self-propagating extend function that Backbone classes use.\n    Fsm.extend = function (protoProps, classProps) {\n        var fsm = inherits(this, protoProps, classProps);\n        fsm.extend = this.extend;\n        return fsm;\n    };\n    var machina = {\n        Fsm: Fsm,\n        utils: utils,\n        on: function (eventName, callback) {\n            if (!this.eventListeners[eventName]) {\n                this.eventListeners[eventName] = [];\n            }\n            this.eventListeners[eventName].push(callback);\n            return callback;\n        },\n        off: function (eventName, callback) {\n            if (this.eventListeners[eventName]) {\n                this.eventListeners[eventName] = _.without(this.eventListeners[eventName], callback);\n            }\n        },\n        trigger: function (eventName) {\n            var i = 0,\n                len, args = arguments,\n                listeners = this.eventListeners[eventName] || [];\n            if (listeners && listeners.length) {\n                _.each(listeners, function (callback) {\n                    callback.apply(null, slice.call(args, 1));\n                });\n            }\n        },\n        eventListeners: {\n            newFsm: []\n        }\n    };\n\n    machina.emit = machina.trigger;\n    return machina;\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/machina/lib/machina.js\n// module id = 1558\n// module chunks = 0 1","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport _ from 'lodash';\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportTypeItem = createReactClass<any, any>({\n  propTypes: {\n    reportType: PropTypes.object.isRequired,\n    selected: PropTypes.bool,\n    disabled: PropTypes.bool,\n    tooltip: PropTypes.string,\n    onSelect: PropTypes.func\n  },\n\n  render() {\n    const reportType = this.props.reportType;\n\n    const itemClasses = classNames({\n      'ui-select-list__item wd-report-type': true,\n      'is-selected': this.props.selected,\n      disabled: this.props.disabled\n    });\n    const iconClass = 'icon-px-' + this.props.reportType.technical_name + '-1';\n\n    return (\n      <li>\n        <a className={itemClasses} onClick={this.handleClick} title={this.props.tooltip}>\n          <h3>\n            <span className={iconClass} />\n            <b className=\"wd-report-type__name\">{reportType.name}</b>\n          </h3>\n          <small>{reportType.description}</small>\n        </a>\n      </li>\n      );\n  },\n\n  handleClick() {\n    if (!this.props.disabled && this.props.onSelect) {\n      this.props.onSelect(this.props.reportType);\n    }\n  }\n});\n\nconst ChooseReportType = createReactClass<any, any>({\n  mixins: [WizardStep] as any,\n\n  propTypes: {\n    reportTypes: PropTypes.array.isRequired,\n    report: PropTypes.object.isRequired\n  },\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderHeader() {\n    return <h4>Select a report type</h4>;\n  },\n\n  renderContent() {\n    const currentType = this.getSelectedType();\n    const reportTypes = _.filter(this.props.reportTypes, function(type: any) {return _.isUndefined(type.disabled); });\n\n    const reportTypeItems = reportTypes && _.sortBy(reportTypes, 'id').map(function(reportType) {\n      const selected = reportType.technical_name === currentType;\n      return (\n        <ReportTypeItem\n          key={reportType.id}\n          reportType={reportType}\n          selected={selected}\n          disabled={!!reportType.disabled}\n          tooltip={reportType.disabled}\n          onSelect={this.handleSelect} />\n      );\n    }, this);\n\n    return (\n      <div>\n        <p>\n          <strong>Looking for some inspiration on what you can build?</strong>\n          <span> Finance Directors across the country have built unique reports with OpenGov.</span>\n          <span> <a href=\"https://opengov.zendesk.com/hc/en-us/articles/205335120-Unique-Reports-\" target=\"_blank\">Check them out in the Resource Center</a></span>.\n        </p>\n        <ul className=\"ui-select-list\">\n          {reportTypeItems}\n        </ul>\n      </div>\n    );\n  },\n\n  getSelectedType() {\n    return this.props.report.get('technical_name');\n  },\n\n  isValid() {\n    return !!this.getSelectedType();\n  },\n\n  handleSelect(reportType) {\n    this.props.report.set('technical_name', reportType.technical_name);\n    this.props.report.set('display_name', reportType.name);\n    this.nextStep();\n  }\n} as any); // this sucks but render gets defined in the WizardStep mixin and the type defs for mixins are bad so even that's casted to any\n\n\nexport default ChooseReportType;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_type.tsx","import React from 'react';\nimport * as Immutable from 'immutable';\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst ChooseLedgerTypes = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      ledgerTypes: Immutable.fromJS({\n        revenues: {title: 'Revenues', included: false},\n        expenses: {title: 'Expenses', included: false},\n        assets: {title: 'Assets', included: false},\n        liabilities: {title: 'Liabilities & Equities', included: false},\n        fteCount: {title: 'FTE Count', included: false}\n      })\n    };\n  },\n\n  isValid() {\n    if (!this.state.ledgerTypes.some((ledger) => ledger.get('included'))) {\n      return false;\n    }\n\n    const reportProps = this.props.report.get('properties');\n    reportProps.ledger_types = this.state.ledgerTypes.filter((ledgerType) => ledgerType.get('included')).keySeq().toJS();\n\n    return true;\n  },\n\n  _toggleLedgerType(ledgerType) {\n    const {ledgerTypes} = this.state;\n    this.setState({\n      ledgerTypes: ledgerTypes.updateIn([ledgerType, 'included'], (included) => !included)\n    });\n  },\n\n  renderHeader() {\n    return <h4>Choose ledger types to include in this report</h4>;\n  },\n\n  renderContent() {\n    const {ledgerTypes} = this.state;\n\n    return (\n      <div>\n        {ledgerTypes.entrySeq().map(([key, ledgerType]) =>\n          <LedgerTypeOption type={ledgerType} onChange={() => this._toggleLedgerType(key)} />\n        )}\n      </div>\n    );\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nconst LedgerTypeOption = createReactClass<any, any>({\n  render() {\n    return (\n      <fieldset className=\"ui-form\">\n        <label className=\"ui-form__checkbox-label\">\n          <input type=\"checkbox\" checked={this.props.type.get('included')} onChange={this.props.onChange} /> {this.props.type.get('title')}\n        </label>\n      </fieldset>\n    );\n  }\n});\n\nexport default ChooseLedgerTypes;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/ledger_types.tsx","import _ from 'lodash';\n\n//check if all the coaDataSets are included in the reports dataset in order to evaluate selectAll checkbox status\nexport default function checkDataSetSubSet(filteredDataSets, reportDataSets) {\n  let differenceDataSetsCounter = filteredDataSets.length;\n  if (differenceDataSetsCounter !== 0) {\n    _.forEach(filteredDataSets, (coaDataSet) => {\n      _.forEach(reportDataSets.models, (dataSet) => {\n        if (dataSet.id === coaDataSet.id) {\n          differenceDataSetsCounter -= 1;\n        }\n      });\n    });\n  }\n  return differenceDataSetsCounter === 0 ? true : false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/check_dataset_subset.ts","import React from 'react';\n\nimport _ from 'lodash';\n\n\nimport * as Ovid from '@opengov/ovid';\nconst Table = Ovid.Table;\n\nimport WizardStep from './wizard_step_mixin';\nimport ChartOfAccounts from './../models/chart_of_accounts';\n\n\nimport createReactClass from 'create-react-class';\n\nconst ChooseChartOfAccounts = createReactClass<any, any>({\n  mixins: [WizardStep] as any,\n\n  getInitialState() {\n    return {\n      charts: new ChartOfAccounts(),\n      loading: true\n    };\n  },\n\n  renderHeader() {\n    return <h4>Select a Chart of Accounts</h4>;\n  },\n\n  renderContent() {\n    const selectedChart = this.getSelectedChart();\n\n    // Sort the chart of accounts by most recently updated.\n    const charts = _.sortBy(this.state.charts, (chart: any) => -Date.parse(chart.updated));\n\n    if (_.isEmpty(charts)) {\n      return <h3>No Charts.</h3>;\n    }\n\n    const columns = [\n      new Ovid.RadioColumn({\n        key: 'select',\n        selectedRow: selectedChart\n      }),\n      {key: 'name', name: 'Name', sortable: false, formatter: (row, value) => `${ value } ${ row.is_default ? '(Default)' : '' }`},\n      {key: 'date_created', name: 'Created', sortable: false},\n      {key: 'date_updated', name: 'Last Updated', sortable: false}\n    ];\n\n    const coaErrors = _.result(this.props.errors, 'coa');\n\n    return (\n      <div>\n        {coaErrors ? (\n          <div className=\"ui-alert-box whoops\"><span className=\"icon-exclamation-1\" /> The Chart of Accounts you selected {coaErrors[0]}.</div>\n        ) : null}\n        <p>From the list of Chart of Accounts you've uploaded and configured, choose one for this report. Only Charts of Accounts with data sets associated with them appear in this list. Once the report is created, you won't be able to change which Chart of Accounts is associated with the report.</p>\n        <div className=\"ui-card\">\n          <div className=\"data-table__scroll-container\">\n            <Table columns={columns} rows={charts} onRowClick={this.handleSelect} layout=\"scale\" />\n          </div>\n        </div>\n      </div>\n    );\n  },\n\n  componentDidMount() {\n    const charts = this.charts = new ChartOfAccounts();\n    charts.fetch({\n      data: {entity_id: this.props.report.get('entity_id'), embed: 'ledger_data_set_ids'},\n      success: () => {\n        const chartsWithDataSets = charts.filterWithDataSets();\n\n        this.setState({\n          charts: chartsWithDataSets.map(function(coa) {\n            return coa.toJSON();\n          }),\n          loading: false\n        });\n      }\n    });\n  },\n\n  getSelectedChart() {\n    return this.props.report.get('coa_id');\n  },\n\n  isValid() {\n    return this.props.report.has('coa_id');\n  },\n\n  handleSelect(chart) {\n    this.props.report.set('coa_id', chart.id);\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\n\nexport default ChooseChartOfAccounts;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/coa.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\nconst Form = Ovid.Form;\nconst InputField = Ovid.InputField;\nconst TextArea = Ovid.TextArea;\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst ChooseReportName = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderHeader() {\n    return <h4>Report Information</h4>;\n  },\n\n  renderContent() {\n    return (\n      <div>\n        <Form\n          initialValues={this.props.report.attributes}\n          errors={this.props.errors}\n          onChange={this.handleFormChange}\n          onSubmit={this.handleFormSubmit}>\n          <InputField\n            name=\"name\"\n            label=\"Report Name\"\n            description=\"Report names can be as long as you like, however shorter titles are best for public reports. Long titles will automatically be truncated\"\n            placeholder=\"Annual, for example\"/>\n\n          <TextArea\n            name=\"description\"\n            label=\"Description\"\n            maxLength={250}\n            hint=\"You may include links to other resources in your report description\"/>\n        </Form>\n      </div>\n    );\n  },\n\n  handleFormChange(fieldName, newValue) {\n    this.props.report.set(fieldName, newValue);\n  },\n\n  handleFormSubmit(event) {\n    event.preventDefault();\n    this.handleClickNext();\n  },\n\n  isValid() {\n    return !_.isEmpty(this.props.report.get('name'));\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default ChooseReportName;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_name.tsx","import React from 'react';\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportCreated = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderContent() {\n    return (\n      <div className=\"ui-null\">\n        <strong>New report successfully created!</strong>\n        Customize your new report by <a onClick={this.handleSettings}>configuring its settings</a>.\n      </div>\n    );\n  },\n\n  renderFooter() {\n    return (\n      <div>\n        <div className=\"ui-panel__actions\">\n          <button className=\"ui-button primary\" onClick={this.cancel}>Close</button>\n        </div>\n      </div>\n    );\n  },\n\n  isValid() {\n    return true;\n  },\n\n  handleSettings(e) {\n    e.preventDefault();\n    this.cancel();\n    this.props.report.trigger('action:editSettings');\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default ReportCreated;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_created.tsx","import React from 'react';\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst NoData = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderContent() {\n    const manageDataURL = 'data_manager/' + this.props.entity.id;\n\n    return (\n      <p className=\"ui-null\">\n        <strong>No General Ledger or Transaction data sets uploaded to create a report.</strong>\n        Go to <a href={manageDataURL}>manage data</a> to upload a data set.\n      </p>\n    );\n  },\n\n  isValid() {\n    return false;\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default NoData;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/no_data.tsx","import $ from 'jquery';\nimport ReportTypes from '../models/report_types';\n\nexport const fetchReportTypes = (self) => {\n  self.reportTypes = new ReportTypes();\n  return self.reportTypes.fetch();\n};\n\nexport const fetchDataSets = (self) => {\n  const defer = $.Deferred();\n  let pendingRequests = 2;\n  const failedRequests: any = self.failedDataSetRequests = {};\n\n  const onRequestCompleted = () => {\n    pendingRequests--;\n\n    if (!pendingRequests) {\n      defer.resolve();\n    }\n  };\n\n  self.loadLedgerDataSets()\n    .fail(() => {failedRequests.ledger = true;})\n    .always(onRequestCompleted);\n\n  self.transactionDataSets = [];\n  self.loadTransactionDataSets()\n    .end()\n    .then((results) => { self.transactionDataSets = results.body.hasOwnProperty('data_sets') ? results.body.data_sets : [];})\n    .catch(() => { failedRequests.transactions = true; })\n    .finally(onRequestCompleted);\n\n  return defer.promise();\n}\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_creation_utils.ts","import Backbone from 'backbone';\n\nimport ReportType from './report_type';\n\nexport default Backbone.Collection.extend({\n  url: '/api/v1/report_types',\n  model: ReportType,\n\n  parse(resp) {\n    return resp.report_types;\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/report_types.ts","import Backbone from 'backbone';\n\nexport default Backbone.Model.extend({\n  urlRoot: '/api/v1/report_types'\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/models/report_type.ts","import React from 'react';\nimport _ from 'lodash';\n\nimport BaseReportFlow from './base_report_flow';\n\nimport Start from './start';\nimport ChooseGLDataSets from './gl_data_sets';\nimport ChooseTXDataSets from './tx_data_sets';\n\n\nconst ReportEditFlow = BaseReportFlow.extend({\n  initialState: 'Start',\n\n  save() {\n    this.report.save(null, {\n      success: () => {\n        this.emit('complete');\n        this.emit('close');\n      }\n    });\n  },\n\n  states: {\n    Start: {\n      _component() {\n        return (\n          <Start />\n        );\n      },\n\n      _onEnter() {\n        if (this.report.get('report_type') === 'grid') {\n          this.transition('ChooseTransactionDataSet');\n\n        } else {\n          this.loadLedgerDataSets().then(() => {\n            this.transition('ChooseLedgerDataSets');\n          });\n        }\n      }\n    },\n\n    ChooseLedgerDataSets: {\n      _component() {\n        return (\n          <ChooseGLDataSets isLastStep dataSets={this.ledgerDataSets.toJSON()} />\n        );\n      },\n\n      next(original, modified) {\n        const originalReport = original;\n        const originalDataSetIds = originalReport.dataSets.models.map(m => m.attributes.id);\n        const modifiedReport = modified;\n\n        const updatedDataSets = modifiedReport.dataSets.map(ds => {\n          // Omit the original dataset name (on new datasets) so our default label logic kicks in\n          // Otherwise the label in the chart will be incorrect.\n          return originalDataSetIds.indexOf(ds.id) > -1 ?\n            ds.toJSON() :\n            _.omit(ds.toJSON(), 'name');\n        });\n\n        originalReport.dataSets.reset(updatedDataSets);\n        originalReport.save(null, {\n          success: () => {\n            this.emit('complete');\n            this.emit('close');\n          }\n        });\n      }\n    },\n\n    ChooseTransactionDataSet: {\n      _component() {\n        return (\n          <ChooseTXDataSets isLastStep />\n        );\n      },\n\n      next(originalReport, modifiedReport) {\n        originalReport.set({\n          transaction_id: modifiedReport.get('transaction_id'),\n          coa_id: modifiedReport.get('coa_id'),\n          properties: modifiedReport.get('properties')\n        });\n        originalReport.save(null, {\n          success: () => {\n            this.emit('complete');\n            this.emit('close');\n          }\n        });\n      }\n    }\n  }\n});\n\nexport default ReportEditFlow;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_edit_flow.tsx","import React from 'react';\nimport BaseReportFlow from './base_report_flow';\n\nimport AjaxError from './ajax_error';\nimport NoData from './no_grid_reports';\n\nimport Start from './start';\nimport EmbedGridReport from './embed_grid_report';\n\n\nconst ReportLinkFlow = BaseReportFlow.extend({\n  initialState: 'Start',\n\n  loadDataSets() {\n    this.transactionDataSets = [];\n    this.loadTransactionDataSets()\n      .end()\n      .then((result) => {\n        this.transactionDataSets = result.body.hasOwnProperty('data_sets') ? result.body.data_sets : [];\n        this.onDataSetsLoaded();\n      })\n      .catch(() => {\n        this.onDataSetsError();\n      });\n  },\n\n  onDataSetsLoaded() {\n    this.handle('loadDataSets:done');\n  },\n\n  onDataSetsError() {\n    this.handle('loadDataSets:error');\n  },\n\n\n  save() {\n    this.report.save(null, {\n      success: () => {\n        this.emit('complete');\n        this.emit('close');\n      }\n    });\n  },\n\n  states: {\n    Start: {\n      _component() {\n        return (\n          <Start />\n          );\n      },\n\n      _onEnter() {\n        this.loadDataSets();\n      },\n\n      'loadDataSets:done': function() {\n        if (this.transactionDataSets.length > 0) {\n          this.transition('EmbedGridReport');\n        } else {\n          this.transition('NotData');\n        }\n      },\n\n      'loadDataSets:error': function() {\n        this.transition('Error');\n      }\n\n    },\n\n\n    Error: {\n      _component() {\n        return (\n          <AjaxError message=\"Error loading report data\" />\n        );\n      }\n    },\n\n    NotData: {\n      _component() {\n        return (\n          <NoData entity={this.entity} />\n          );\n      }\n    },\n\n    EmbedGridReport: {\n      _component() {\n        return (\n          <EmbedGridReport isLastStep report={this.report} entity={this.entity} />\n          );\n      },\n\n      next(original, modified) {\n        const originalReport = original;\n        const modifiedReport = modified;\n\n        if (modifiedReport.associatedReport) {\n          originalReport.setAssocReport(modifiedReport.associatedReport);\n        } else {\n          originalReport.unsetAssocReport();\n        }\n        originalReport.save(null, {\n          success: () => {\n            this.emit('complete');\n            this.emit('close');\n          }\n        });\n      }\n    }\n  }\n});\n\nexport default ReportLinkFlow;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/report_linking_flow.tsx","import React from 'react';\n\nimport WizardStep from './wizard_step_mixin';\n\n\nimport createReactClass from 'create-react-class';\n\nconst AjaxError = createReactClass<any, any>({\n  mixins: [WizardStep] as any,\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderContent() {\n    return (\n      <p className=\"ui-null\">\n        <strong>{this.props.message}</strong>\n      </p>\n    );\n  },\n\n  renderFooter() {\n    return (\n      <div className=\"ui-panel__actions\">\n        <button className=\"ui-button ghost\" onClick={this.cancel}>Cancel</button>\n        <button className=\"ui-button\" onClick={this.prevStep}>Retry</button>\n      </div>\n    );\n  },\n\n  isValid() {\n    return true;\n  }\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default AjaxError;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/ajax_error.tsx","import React from 'react';\n\nimport WizardStep from './wizard_step_mixin';\n\nimport createReactClass from 'create-react-class';\n\nconst NoData = createReactClass<any, any>({\n  mixins: [WizardStep],\n\n  getInitialState() {\n    return {\n      loading: false\n    };\n  },\n\n  renderContent() {\n    return (\n      <p className=\"ui-null\">\n        <strong>No available grid reports</strong>\n       Create a new grid report before using this feature.\n      </p>\n      );\n  },\n\n  isValid() {\n    return false;\n  }\n\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\nexport default NoData;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/no_grid_reports.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport * as Ovid from '@opengov/ovid';\n\n\nimport WizardStep from './wizard_step_mixin';\nimport Reports from '../models/reports';\n\nconst Table = Ovid.Table;\nconst Alert = Ovid.Alert;\n\nimport createReactClass from 'create-react-class';\n\nconst LinkGridReports = createReactClass<any, any>({\n  mixins: [WizardStep] as any,\n\n  getInitialState() {\n    return {\n      loading: true,\n      sortBy: 'name'\n    };\n  },\n\n  renderHeader() {\n    return (\n      <h4>Link Transaction Report</h4>\n    );\n  },\n\n  renderContent() {\n\n    const availableReports = _.sortBy(this.state.availableReports, this.state.sortBy);\n\n    availableReports.push({\n      id: 'none',\n      name: 'No linked report'\n    });\n\n    if (this.state.sortAsc) {\n      availableReports.reverse();\n    }\n\n    const assocReportID = _.get(this.props.report.associatedReport, 'id', 'none');\n\n    if (_.isEmpty(availableReports)) {\n      return (\n        <p className=\"ui-null\">\n          <strong>No available grid reports</strong>\n          Create a new grid report using the\n          <a onClick={this.navigateNewReport}> new report wizard</a>\n          before using this feature.\n        </p>\n      );\n    }\n\n    const columns = [\n      new Ovid.RadioColumn({\n        key: 'select',\n        selectedRow: assocReportID,\n        onSelect: this.handleSelect\n      }),\n      {key: 'name', name: 'Name'},\n      {key: 'visibility', name: 'Visibility'}\n    ];\n\n    return (\n      <div>\n        <p>Select a transaction report to be associated with the current one.  It will be accessible as a tab next to the Summary tab at the bottom of this report.</p>\n        <p>Links to private reports will only be available for your organization's users.</p>\n        <br/>\n        <div className=\"ui-card overflow-auto\">\n          <Table\n            columns={columns}\n            rows={availableReports}\n            onSort={this.handleSort}\n            sortBy={this.state.sortBy}\n            sortAsc={this.state.sortAsc}\n            layout=\"scale\" />\n        </div>\n      </div>\n    );\n  },\n\n  renderFooter() {\n    return (\n      <div>\n        {this.props.canGoBack ? (\n          <button className=\"ui-button pull-left\" onClick={this.prevStep}>\n            <span className=\"icon-left-1\" />\n          Back\n          </button>\n        ) : null}\n        {this.renderActions()}\n      </div>\n    );\n  },\n\n  navigateNewReport(e) {\n    e.preventDefault();\n    window.location.hash = '#/' + this.props.entity.get('subdomain') + '/reports/new';\n    Alert.close();\n  },\n\n  componentDidMount() {\n    const report = this.props.report;\n\n    const reports = (this.availableReports = new Reports());\n\n    reports.fetch({\n      data: { entity_id: report.get('entity_id') },\n      success: () => {\n        this.setState({\n          availableReports: _(reports.toJSON())\n          .filter((r) => {\n            console.log('r', r);\n            return r.report_type === 'grid' && r.coa_id === report.get('coa_id');\n          })\n          .map((r) => {\n            r.visibility = r.hidden ? 'Private' : 'Public'\n            return r;\n          })\n          .value(),\n          loading: false,\n        });\n      },\n    });\n  },\n\n  isValid() {\n    return true;\n  },\n\n  handleSort(sortBy, ascending) {\n    this.setState({sortBy, sortAsc: ascending});\n  },\n\n  handleSearchChange(items) {\n    this.setState({filteredReports: items});\n  },\n\n  handleSelect(r) {\n    if (r.id === 'none') {\n      this.props.report.unsetAssocReport();\n    } else {\n      this.props.report.setAssocReport(this.availableReports.get(r.id), {silent: true});\n    }\n    this.forceUpdate();\n  }\n\n} as any); // TODO again, this any cast here is because the WizardStep defines render, not the component\n\n\nexport default LinkGridReports;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/wizard/embed_grid_report.tsx","import React from 'react';\n\nexport interface IPasswordModalProps {\n  accessCode: string;\n  onSubmit(password: string): void;\n  onClose(): void;\n}\n\nclass PasswordModal extends React.Component<IPasswordModalProps, any> {\n\n  state = {\n    password: '',\n    showError: false\n  }\n\n  onClose = () => {\n    this.props.onClose();\n  }\n\n  onSubmit = () => {\n    const { password } = this.state;\n    if (this.props.accessCode !== password) {\n      this.setState({ showError: true });\n    } else {\n      this.props.onSubmit(this.state.password);\n    }\n  }\n\n  handlePasswordChange = e => {\n    this.setState({ password: e.target.value });\n  }\n\n  render() {\n    const { password, showError } = this.state;\n    return (\n      <div className=\"alert__overlay open ready\" id=\"overlay-modal_password\">\n        <div className=\"alert_full\">\n          <div className=\"alert__close-btn\">\n            <a onClick={this.onClose} href=\"/\" className=\"fonticon icon-remove-3\"></a>\n          </div>\n          <div className=\"alert__inner\">\n            <div className=\"alert__inner__text\">Limited Access: Password Required</div>\n            {showError && <div className=\"alert__inner__subtext\">Password does not match</div>}\n            <div className=\"alert__inner__password-wrapper\">\n              <label className=\"alert__inner__password-label\" htmlFor=\"password-form__input\">Password:</label>\n              <input className=\"alert__inner__password-input\" value={password} onChange={this.handlePasswordChange} type=\"password\" name=\"password\" placeholder=\"•••••••\" autoFocus={true} />\n              <button className=\"ui-button alert__inner__password-submit\" onClick={this.onSubmit}>\n                Submit\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default PasswordModal;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/modals/password.tsx","import React from 'react';\n\nimport createReactClass from 'create-react-class';\n\nexport default createReactClass<any, any>({\n  render() {\n    return (\n      <footer className=\"editor-footer ui-flex ui-align-items-center\">\n        <div className=\"ui-flex-1\">\n          <strong>Configuring the report's default state.</strong> {this.props.subMessage}\n        </div>\n        <div className=\"editor-footer__actions ui-justify-content-end\">\n          <button className=\"ui-button ghost\" onClick={this.props.onCancel}>Cancel</button>\n          <button className=\"ui-button primary\" onClick={this.props.onSave}>\n            Save Report\n          </button>\n        </div>\n      </footer>\n    );\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/editor_footer.tsx","import React from 'react';\nimport * as Ovid from '@opengov/ovid';\n\nconst unexpectedErrorMessage = (\n  <span>\n    An unexpected error occurred. Please try again. If the problem persists contact us at\n    <a href=\"mailto:support@opengov.com\">support@opengov.com</a>\n  </span>\n);\n\nexport default function(text, response) {\n  const {responseJSON} = response;\n\n  Ovid.Alert.open({\n    title: text,\n    content: <p>{responseJSON && responseJSON.message || unexpectedErrorMessage}</p>\n  });\n\n  Raven.captureException(\n    new Error(text),\n    {extra: {\n      responseText: response.responseText,\n      status: response.status,\n      statusText: response.statusText,\n      statusCode: response.statusCode(),\n      responseJSON\n    }}\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/handle_jquery_ajax_error.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport PureRenderMixin from 'react-pure-render/mixin';\nimport _ from 'lodash';\n\nimport { StoreListener } from '@opengov/og_flux';\n\nimport SessionStore from '@opengov/controlpanel/lib/stores/session_store';\n\nimport ReportActions from '../actions/report_actions';\nimport SettingsPanelActions from '../actions/settings_panel_actions';\n\nimport ReportViewStore from '../stores/report_view_store';\nimport SettingsPanelStore from '../stores/settings_panel_store';\nimport SummaryReportStore from '../stores/summary_report_store';\n\nimport CategoryList from './settings_category_list';\nimport Category from './settings_category_item';\nimport SettingsCategoryPanel from './settings_category_panel';\n\nimport GeneralSettings from './general_settings';\nimport ViewSettings from './view_settings';\nimport DefaultConfiguration from './default_configuration';\nimport CurrentYearSettings from './current_year_settings';\n\nimport createReactClass from 'create-react-class';\n\nconst ReportSettingsPanel = createReactClass<any, any>({\n  propTypes: {\n    isControlPanel: PropTypes.bool,\n    entity: PropTypes.object.isRequired,\n    session: PropTypes.object,\n    scalePerCapitaEnabled: PropTypes.bool,\n  },\n\n  mixins: [\n    StoreListener(\n      SettingsPanelStore,\n      ReportViewStore,\n      SessionStore,\n      SummaryReportStore\n    ),\n    PureRenderMixin\n  ] as any,\n\n  getInitialState() {\n    return this._getStateFromStore();\n  },\n\n  storeDidUpdate() {\n    this.setState(this._getStateFromStore());\n  },\n\n  _getStateFromStore() {\n    const settingsPanelState = SettingsPanelStore.getState().toObject();\n    const summaryReportState = SummaryReportStore.getState();\n    const session = SessionStore.getSession();\n    const report = SettingsPanelStore.getState().get('updatedReport');\n    const athenaState = summaryReportState.get('athenaState');\n\n    const canDelete = session && report && report.get('abilities') && report.get('abilities').get('destroy');\n\n    return _.extend(settingsPanelState, {\n      amountUnit: SummaryReportStore.getAmountUnit(),\n      auditModeEnabled: ReportViewStore.getAuditModeEnabled(),\n      canDelete,\n      canUpdate: session && report.getIn(['abilities', 'update']),\n      canUpdateMask: session && session.can('update', 'data_manager/coa_mask'),\n      canUpdateReportName: report.getIn(['abilities', 'update_name']),\n      currentYearAmount: summaryReportState.get('currentYearAmount'),\n      currentYearPeriod: summaryReportState.get('currentYearPeriod'),\n      hasChanges: SettingsPanelStore.isDirty(),\n      isControlPanel: this.props.isControlPanel,\n      isNetwork: this.props.isNetwork,\n      isEntityAdmin: session && _.result(session.get('role'), 'name') === 'entity_admin',\n      isOpengovAdmin: session && _.result(session.get('role'), 'name') === 'opengov_admin',\n      isOpengovTSD: session && _.result(session.get('role'), 'name') === 'opengov_tsd',\n      isTitleTooLong: SettingsPanelStore.isTitleTooLong(),\n      maskOptions: ReportViewStore.getMaskOptions(),\n      overlay: summaryReportState.get('overlay'),\n      highlighting: summaryReportState.get('highlighting') !== true ? false : summaryReportState.get('highlighting'),\n      highlightingVariance: summaryReportState.get('highlightingVariance'),\n      proration: summaryReportState.get('proration'),\n      projections: athenaState && athenaState.get('projections'),\n      projectionType: athenaState && athenaState.get('projectionType'),\n      sourceDatasets: athenaState && athenaState.get('report') && athenaState.get('report').get('source_datasets'),\n      reportType: report.get('report_type'),\n      scale: summaryReportState.get('scale'),\n      yAxisScale: summaryReportState.get('yAxisScale'),\n      scalePerCapitaEnabled: this.props.scalePerCapitalEnabled,\n    });\n  },\n\n  _shouldShowLinkage() {\n    const isNotGrid = this.state.reportType !== 'grid';\n    const hasLinkageEnabled = _.includes(this.props.entity.get('feature_permissions'), 'transaction_linkage');\n\n    if (isNotGrid && this.state.canUpdate && hasLinkageEnabled) {\n      return true;\n    }\n\n    return false;\n  },\n\n  _onWrapperClick(e) {\n    // Close the settings panel when the user clicks outside it.\n    if (e.target === ReactDOM.findDOMNode(this)) {\n      SettingsPanelActions.cancel();\n    }\n  },\n\n  _getCategories() {\n    const {\n      isControlPanel,\n      isNetwork\n    } = this.props;\n\n    const showReportSettings = isControlPanel && this.state.canUpdate;\n    const isYTDReport = this.state.reportType === 'ytd';\n    const isGridReport = this.state.reportType === 'grid';\n\n    return [\n      <Category\n        title=\"General\"\n        key=\"General\"\n        description=\"Basic report settings, including description\"\n        saveable\n        hidden={!showReportSettings}\n        handler={GeneralSettings} />,\n      <Category\n        title=\"Link transactional data\"\n        key=\"Link transactional data\"\n        description=\"Include transactional data in your report\"\n        hidden={!this._shouldShowLinkage()}\n        onClick={ReportActions.openEditLinkage} />,\n      <Category\n        title=\"Monthly report options\"\n        key=\"Monthly report options\"\n        description=\"Fine-tune how monthly data is displayed\"\n        hidden={!isYTDReport}\n        handler={CurrentYearSettings} />,\n      <Category\n        title=\"Presentation\"\n        key=\"Presentation\"\n        description={`Control display of ${(isControlPanel && !isNetwork && 'account codes and') || ''} per capita scaling`}\n        hidden={isGridReport}\n        handler={ViewSettings} />,\n      <Category\n        title=\"Report data\"\n        key=\"Report data\"\n        description=\"Determine what data is included in this report\"\n        hidden={!showReportSettings}\n        onClick={ReportActions.openEditData} />,\n      <Category\n        title=\"X-axis configuration\"\n        key=\"X-axis configuration\"\n        description=\"Refine the order and titles of data on the X-axis\"\n        saveable\n        hidden={isGridReport || !showReportSettings}\n        handler={DefaultConfiguration} />\n    ];\n  },\n\n  render() {\n    if (!this.state.isOpen) {\n      return null;\n    }\n\n    const { entity } = this.props;\n\n    const categories = this._getCategories();\n    const visibleCategories = _.filter(categories, (category: any) => !category.props.hidden);\n    const oneVisibleCategory = _.size(visibleCategories) === 1 && _.head(visibleCategories);\n\n    return (\n      <div className=\"ui-panel__wrapper settings__wrapper\" onClick={this._onWrapperClick}>\n        <CategoryList oneVisibleCategory={oneVisibleCategory}>\n          {categories}\n        </CategoryList>\n\n        <SettingsCategoryPanel\n          {...this.state}\n          entity={entity}\n          oneVisibleCategory={oneVisibleCategory} />\n      </div>\n    );\n  }\n});\n\nexport default ReportSettingsPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/index.tsx","import React from 'react';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\nimport SettingsPanelHeader from './settings_panel_header';\n\nexport default class SettingsCategoryList extends React.Component<any, any> {\n  componentWillMount() {\n    const { oneVisibleCategory } = this.props;\n\n    if (oneVisibleCategory) {\n      SettingsPanelActions.selectCategory({\n        title: oneVisibleCategory.props.title,\n        saveable: oneVisibleCategory.props.saveable,\n        handler: oneVisibleCategory.props.handler\n      });\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"ui-panel\">\n        <SettingsPanelHeader />\n        <div className=\"ui-panel__content\">\n          <ul className=\"ui-nav-list\">\n            {this.props.children}\n          </ul>\n        </div>\n        <footer className=\"ui-panel__footer\">\n          <div className=\"ui-panel__actions\">\n            <button className=\"ui-button\" onClick={SettingsPanelActions.cancel}>Cancel</button>\n          </div>\n        </footer>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/settings_category_list.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport createReactClass from 'create-react-class';\n\nconst AdditionalTitle = createReactClass<any, any>({\n  propTypes: {\n    additionalHeadingText: PropTypes.string,\n    additionalHeadingDescription: PropTypes.string\n  },\n  render() {\n    return (<span className=\"ui-panel__header-additional\">\n              <span className=\"icon-righthead-3\"/>{this.props.additionalHeadingText}\n              <small> ({this.props.additionalHeadingDescription})</small>\n            </span>);\n  }\n});\n\nconst SettingsPanelHeaderText = createReactClass<any, any>({\n  propTypes: {\n    additionalHeadingText: PropTypes.string,\n    additionalHeadingDescription: PropTypes.string\n  },\n  render() {\n    const additional = (this.props.additionalHeadingText || this.props.additionalHeadingDescription) ?\n      <AdditionalTitle additionalHeadingText={this.props.additionalHeadingText} additionalHeadingDescription={this.props.additionalHeadingDescription} /> :\n      null;\n\n    return (\n      <h3><span className=\"icon-settings-1\" /> Settings {additional}</h3>\n    );\n  }\n});\n\nexport default SettingsPanelHeaderText;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/settings_panel_header_text.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\n\nexport default class SettingsCategoryItem extends React.Component<any, any> {\n  static propTypes = {\n    title: PropTypes.string,\n    description: PropTypes.string,\n    hidden: PropTypes.bool,\n    handler: PropTypes.func,\n    onClick: PropTypes.func,\n    entity: PropTypes.object,\n    yAxisScale: PropTypes.object,\n    isControlPanel: PropTypes.bool\n  }\n\n  _onClick = () => {\n    if (this.props.onClick) {\n      this.props.onClick();\n\n    } else {\n      SettingsPanelActions.selectCategory({\n        title: this.props.title,\n        saveable: this.props.saveable,\n        handler: this.props.handler\n      });\n    }\n  }\n\n  render() {\n    if (this.props.hidden) {\n      return null;\n    }\n\n    return (\n      <button className=\"ui-nav-list__item multiline\" onClick={this._onClick}>\n        <h3 className=\"ui-nav-list__item__title\">{this.props.title}</h3>\n        <span className=\"ui-nav-list__item__description\">{this.props.description}</span>\n        <span className=\"ui-nav-list__item__right-arrow icon-righthead-3\" />\n      </button>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/settings_category_item.tsx","import React from 'react';\nimport {Navigation} from 'react-router';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\nimport SettingsPanelHeader from './settings_panel_header';\n\nimport createReactClass from 'create-react-class';\n\nconst SettingsCategoryPanel = createReactClass<any, any>({\n  mixins: [Navigation] as any,\n\n  render() {\n    const { activeCategory, oneVisibleCategory } = this.props;\n\n    if (!activeCategory) {\n      return null;\n    }\n\n    const CategoryHandler = activeCategory.get('handler');\n\n    return (\n      <div className=\"ui-panel\">\n        <SettingsPanelHeader report={this.props.updatedReport} oneVisibleCategory={oneVisibleCategory} />\n        {!oneVisibleCategory &&\n          <header className=\"ui-panel__sub-header\">\n            <h4>\n              {<button className=\"ui-panel__back\" onClick={SettingsPanelActions.goBack}>Back</button>}\n              {activeCategory.get('title')}\n            </h4>\n          </header>\n        }\n        <footer className=\"ui-panel__footer\">\n          <div className=\"ui-panel__actions\">\n            <button className=\"ui-button\" onClick={SettingsPanelActions.cancel}>Cancel</button>\n            {this.props.activeCategory.get('saveable') ?\n              <button className=\"ui-button primary\"\n                      disabled={!this.props.hasChanges}\n                      onClick={SettingsPanelActions.save}>\n                {this.props.saving ? 'Saving...' : 'Save'}\n              </button>\n            : null}\n          </div>\n        </footer>\n        <div className=\"ui-container_scroll\">\n          <div className=\"ui-panel__content\">\n            <CategoryHandler transitionTo={this.transitionTo} {...this.props} />\n          </div>\n        </div>\n      </div>\n    );\n  }\n});\n\nexport default SettingsCategoryPanel;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/settings_category_panel.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport {\n  Form,\n  InputField,\n  Toggle,\n  TextArea,\n  Overlay,\n  Alert,\n  SelectField\n} from '@opengov/ovid';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\nimport MaskField from './mask_field';\n\nexport default class GeneralSettings extends React.Component<any, any> {\n  static propTypes = {\n    updatedReport: PropTypes.object.isRequired,\n    errors: PropTypes.object,\n    isOpengovAdmin: PropTypes.bool,\n    canUpdate: PropTypes.bool,\n    isOpengovTSD: PropTypes.bool,\n    isEntityAdmin: PropTypes.bool,\n    canUpdateMask: PropTypes.bool,\n    deleteStatus: PropTypes.string,\n    reportType: PropTypes.string,\n    transitionTo: PropTypes.func\n  }\n\n  static contextTypes = {\n    router: PropTypes.func\n  };\n\n  _onFormChange(fieldName, newValue) {\n    SettingsPanelActions.changeAttribute(fieldName, newValue);\n  }\n\n  _onDeleteConfirm(confirmed) {\n    if (confirmed) {\n      SettingsPanelActions.confirmedDeleteReport();\n    } else {\n      SettingsPanelActions.cancelDeleteReport();\n    }\n  }\n\n  _onContinue = () => {\n    const entity = this.props.updatedReport.get('entity');\n    SettingsPanelActions.finishDeleteReport();\n    this.props.transitionTo('report-index', {entity});\n  }\n\n  renderUpdateReportName() {\n    return this.props.canUpdateReportName && (\n      <InputField name=\"name\" label=\"Report name\" description=\"Report names can be as long as you like, however shorter titles are best for public reports. Long titles will be automatically truncated.\" />\n    );\n  }\n\n  renderTotalToggle() {\n    const report = this.props.updatedReport;\n    const canShowTotal = (report && report.get('report_type') == 'grid') &&\n      (this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin);\n    return canShowTotal && [\n      <Toggle\n        className='total_text_visible_toggle'\n        name={['properties', 'total_text_visible']}\n        label=\"Show total amount\"\n        description=\"Calculate the sum of your transactions and display it in the side bar\"\n        toggleLabel={{true: 'Show total amount', false: \"Don't show total amount\"}}\n        key=\"toggle\"/>,\n      <hr key=\"hr\"/>\n    ];\n  }\n\n  renderCheckImages() {\n    const report = this.props.updatedReport;\n    const canShowCheckImages = (report && report.get('report_type') === 'grid') && (this.props.canUpdate);\n\n    return canShowCheckImages && [\n      <Toggle\n        className='check_image_visible_toggle'\n        name={['properties', 'check_image_visible']}\n        label=\"Check images\"\n        description=\"Clicking on a transaction row will give the option to view a simulated check image of the transaction.\"\n        toggleLabel={{true: 'Show check images', false: \"Don't show check images\"}} key=\"toggle\"/>,\n      <hr key=\"hr\"/>\n    ];\n  }\n\n  renderDeleteStatus(deleteStatus, name) {\n    if (deleteStatus === 'confirm') {\n      return (\n        <Alert title=\"Confirm delete report\"\n          confirmText=\"Yes, delete the report\"\n          confirmButtonModifiers={{negative: true}}\n          cancelable\n          onConfirm={this._onDeleteConfirm}>\n        <p>Are you sure you want to delete the <strong>{name}</strong> report?</p>\n        </Alert>\n      );\n    }\n    if (deleteStatus === 'completed') {\n      return (\n        <Alert title=\"Successfully deleted report\"\n          confirmText=\"Continue\"\n          onConfirm={this._onContinue}>\n        <p>The <strong>{name}</strong> report has been deleted.</p>\n        </Alert>\n      );\n    }\n  }\n\n  renderLocaleField() {\n    const canShowLocale = (this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin || this.props.canUpdate);\n    return canShowLocale && [\n      <SelectField\n        name=\"locale\"\n        key=\"select\"\n        label=\"Report Locale\"\n          items={[\n            {option: 'United States', value: 'en_US'},\n            {option: 'United Kingdom', value: 'en_GB'},\n            {option: 'Australia', value: 'en_AU'}\n          ]}\n      />,\n      <hr key=\"hr\" />\n    ];\n  }\n\n  renderCanDelete() {\n    const isReportHidden = this.props.updatedReport.get('hidden');\n    const isDeleting = this.props.deleteStatus === 'pending';\n    return this.props.canDelete && (\n      <fieldset className=\"ui-form\">\n        <label className=\"hint negative\">Careful, this action cannot be undone</label>\n        <button type=\"button\"\n                className=\"ui-button negative pull-left\"\n                disabled={!isReportHidden || isDeleting}\n                title={isReportHidden ? 'Delete this report' : 'Can\\'t delete public report'}\n                onClick={SettingsPanelActions.deleteReport}>\n          {isDeleting ? 'Deleting report...' : 'Delete report'}\n        </button>\n      </fieldset>\n    );\n  }\n\n  renderReportDescription() {\n    return (\n      <TextArea name=\"description\"\n        label=\"Report Description\"\n        placeholder=\"Add a description for this report\"\n        hint=\"You may include links to other resources in your report description\"\n        maxLength={250} />\n    );\n  }\n\n  renderSetReportDescriptionVisible() {\n    return (\n      <Toggle\n        className='description_visible_toggle'\n        name={['properties', 'description_visible']}\n        toggleLabel={{true: 'Visible in report', false: 'Not visible in report'}} />\n    );\n  }\n\n  renderSetReportAutoUpdate() {\n    // DSVC-174 only general ledger report will have auto update ability\n    // https://opengovinc.atlassian.net/browse/DSVC-174\n    const report = this.props.updatedReport;\n    const canSetAutoUpdate = (report && report.get('report_type') !== 'grid');\n\n    return canSetAutoUpdate && (\n      <Toggle\n        className='auto_update_toggle'\n        name=\"include_new_periods\"\n        description=\"Automatically add new periods when they are added to the source dataset(s). Changes will appear on the next update.\"\n        toggleLabel={{\n          true: 'Automatic updates',\n          false: 'Automatic updates'\n        }}\n      />\n    );\n  }\n\n  renderSummaryTableToggle() {\n    const report = this.props.updatedReport;\n    const canShowSummaryTable = (report && report.get('report_type') == 'grid') &&\n      (this.props.isOpengovAdmin || this.props.isOpengovTSD || this.props.isEntityAdmin);\n    return canShowSummaryTable && [\n      <Toggle\n        className='summary_table_visible_toggle'\n        name={['properties', 'summary_table_visible']}\n        label=\"Show summary table\"\n        description=\"Show a summary table of the report breakdown\"\n        toggleLabel={{true: 'Show summary table', false: \"Don't show summary table\"}}\n        key=\"toggle\"/>,\n      <hr key=\"hr\"/>\n    ];\n  }\n\n  render() {\n    const { updatedReport: report } = this.props;\n    const errors = this.props.errors ? this.props.errors.toJS() : {};\n\n    return (\n      <Form initialValues={report.toJS()} errors={errors} onChange={this._onFormChange}>\n        {this.renderUpdateReportName()}\n\n        {this.renderReportDescription()}\n        {this.renderSetReportDescriptionVisible()}\n        {this.renderSetReportAutoUpdate()}\n\n        <hr/>\n\n        {this.renderCheckImages()}\n        {this.renderTotalToggle()}\n        {this.renderSummaryTableToggle()}\n\n        <InputField name=\"access_code\" label=\"Password\" hint=\"Require a password to access this report\" />\n        <hr />\n\n        {MaskField(this.props)}\n        {this.renderLocaleField()}\n        {this.renderCanDelete()}\n\n        <Overlay id=\"report_general_settings_modals\">\n          {this.renderDeleteStatus(this.props.deleteStatus, report.get('name'))}\n        </Overlay>\n      </Form>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/general_settings.tsx","import React from 'react';\nimport _ from 'lodash';\nimport { SelectField } from '@opengov/ovid';\n\nconst MaskField = (props) => (\n  props.reportType !== 'grid' && props.canUpdateMask && [\n    <SelectField name=\"coa_mask_id\"\n      label=\"Chart of Accounts Mask\"\n      hint=\"Select a Chart of Accounts Mask to apply to this report\"\n      disabled={_.isEmpty(props.maskOptions)}\n      items={[{option: 'No mask', value: ''}].concat(props.maskOptions)} />,\n    <hr />\n  ]\n);\n\nexport default MaskField;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/mask_field.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport * as Ovid from '@opengov/ovid';\nimport _ from 'lodash';\nimport ReportActions from '../actions/report_actions';\nimport YAxisScale from './y_axis_scale';\nimport SummaryReportStore from '../stores/summary_report_store';\nimport {compatibleReports} from '../metric_data_constants';\nimport MetricsDropdown from './metrics_dropdown';\n\nimport createReactClass from 'create-react-class';\n\nconst ViewSettings = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object.isRequired,\n    isControlPanel: PropTypes.bool,\n    yAxisScale: PropTypes.object,\n    overlay: PropTypes.object,\n    scale: PropTypes.object,\n    reportType: PropTypes.string,\n    scalePerCapitaEnabled: PropTypes.bool\n  },\n\n  render() {\n    const summaryReportState = SummaryReportStore.getState();\n    const {\n      isControlPanel,\n      isNetwork,\n      scalePerCapitaEnabled\n    } = this.props;\n\n    return (\n      <div>\n        {isControlPanel && !isNetwork &&\n          <fieldset className=\"ui-form\">\n            <label>Account codes</label>\n            <p>\n              Governments use Chart of Account codes to track and classify spending in their accounting systems.\n              Toggle this feature to include account codes in the report presentation.\n            </p>\n            <Ovid.ToggleSwitch\n              state={this.props.auditModeEnabled ? 'on' : 'off'}\n              onToggle={ReportActions.toggleAuditMode}>\n              Show account codes\n            </Ovid.ToggleSwitch>\n            <p className=\"hint\"/>\n          </fieldset>}\n        {\n          scalePerCapitaEnabled && (<YAxisScale\n            yAxisScale={this.props.yAxisScale}\n            amountUnit={this.props.amountUnit}\n            isControlPanel={this.props.isControlPanel}\n            entity={this.props.entity} />\n          )\n        }\n        {_.includes(this.props.entity.get('feature_permissions'), 'metric_data') && _.includes(compatibleReports, this.props.reportType) ?\n          <MetricsDropdown isControlPanel={this.props.isControlPanel}\n            graphType={summaryReportState.get('athenaState').attributes.graphType || ''}\n            overlay={this.props.overlay}\n            scale={this.props.scale} /> : null}\n      </div>\n    );\n  }\n});\n\nexport default ViewSettings;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/view_settings.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport * as Ovid from '@opengov/ovid';\n\nimport SummaryReportActions from '../actions/summary_report_actions';\nimport strings from '../strings';\n\nimport createReactClass from 'create-react-class';\n\nconst YAxisScale = createReactClass<any, any>({\n  propTypes: {\n    entity: PropTypes.object.isRequired,\n    isControlPanel: PropTypes.bool,\n    yAxisScale: PropTypes.object,\n    amountUnit: PropTypes.string\n  },\n\n  render() {\n    const disabled = !this.props.entity.get('population');\n    if (_.includes(this.props.entity.get('feature_permissions'), 'metric_data') || (!this.props.isControlPanel && disabled)) {\n      return null;\n    }\n\n    const toggleState = this.props.yAxisScale ? 'on' : 'off';\n    const toggleLabel = this.props.yAxisScale ? 'Scale by per capita' : 'Don\\'t scale amounts';\n\n    const entitySettingsLink = 'controlpanel#/' + this.props.entity.get('subdomain') + '/manage';\n    const unitLabel = strings.amountUnitLabel(this.props.amountUnit);\n    const description = `Display ${unitLabel} amounts as per capita. To calculate amount shown, we will divide any ${unitLabel} value by your population`;\n    const scaleValue = 'Toggle and view the table below to see population by year';\n\n    const onToggle = disabled ? null : () => SummaryReportActions.togglePerCapitaScale();\n\n    return (\n      <fieldset className=\"ui-form\">\n        <span>\n          <label>Scale Per Capita</label>\n          {this.props.isControlPanel ?\n            <p className=\"info-text\"><small>{\"This setting will be active only for this session, and won't be included in your default state.\"}</small></p>\n          : null}\n          {disabled ?\n            <p>{description}. Go to <a href={entitySettingsLink}>Entity Settings</a> to set your population and then return here to enable this feature.</p>\n          :\n            <p>{description + ' (' + scaleValue + ').'}</p>\n          }\n          <Ovid.ToggleSwitch\n            state={toggleState}\n            onToggle={onToggle}>\n            {toggleLabel}\n          </Ovid.ToggleSwitch>\n        </span>\n      </fieldset>\n    );\n  }\n});\n\nexport default YAxisScale;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/y_axis_scale.tsx","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport SummaryReportStore from '../stores/summary_report_store';\nimport SummaryReportActions from '../actions/summary_report_actions';\n\nimport {DropdownList, DropdownListItem} from '@opengov/ovid';\n\nimport createReactClass from 'create-react-class';\n\nconst MetricsDropdown = createReactClass<any, any>({\n  propTypes: {\n    isControlPanel: PropTypes.bool, // Is this required, might not be relevant for metric_dropdown?\n    overlay: PropTypes.object.isRequired,\n    scale: PropTypes.object.isRequired,\n    graphType: PropTypes.string.isRequired\n  },\n\n  render() {\n    const overlaysAvailable = this.props.overlay.get('available');\n    const scalesAvailable = this.props.scale.get('available');\n\n    const overlaySelected = this.props.overlay.get('selected').first();\n    const scaleSelected = this.props.scale.get('selected').first();\n\n    const overlayCompatibleCharts = SummaryReportStore.getInitialState().getIn(['overlay', 'overlayCompatibleCharts']);\n    const disableOverdownDropdown = !overlayCompatibleCharts.includes(this.props.graphType);\n\n    const overlayDescription = \"Compare your financial data with measurement's we've collected from public data sources.\";\n    const scaleDescription = \"Scale your financial data by measurement's we've collected from public data sources.\";\n\n    return (\n      <fieldset className=\"ui-form\">\n        <label>Overlay <span className={`feature-version-badge beta`}>beta</span></label>\n        {this.props.isControlPanel ?\n          <p className=\"info-text\"><small>{\"This setting will be active only for this session, and won't be included in your default state.\"}</small></p>\n        : null}\n        <p>{overlayDescription}</p>\n        <DropdownList value={overlaySelected} onChange={SummaryReportActions.setOverlays} disabled={disableOverdownDropdown}>\n          {overlaysAvailable.map((overlay) =>\n            <DropdownListItem key={overlay.get('metric_type')} value={overlay.get('metric_type')} title={overlay.get('name')} />\n          )}\n        </DropdownList>\n\n\n        <label>Scale By <span className={`feature-version-badge beta`}>beta</span></label>\n        {this.props.isControlPanel ?\n          <p className=\"info-text\"><small>{\"This setting will be active only for this session, and won't be included in your default state.\"}</small></p>\n        : null}\n        <p>{scaleDescription}</p>\n        <DropdownList value={scaleSelected} onChange={SummaryReportActions.setScale}>\n          {scalesAvailable.map((scale) =>\n            <DropdownListItem key={scale.get('metric_type')} value={scale.get('metric_type')} title={scale.get('name')} />\n          )}\n        </DropdownList>\n      </fieldset>\n    );\n  }\n});\n\nexport default MetricsDropdown;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/metrics_dropdown.tsx","import React from 'react';\n\nimport SettingsPanelActions from '../actions/settings_panel_actions';\nimport XAxisEditor from '../x_axis_editor';\n\nimport createReactClass from 'create-react-class';\n\nconst DefaultConfiguration = createReactClass<any, any>({\n  statics: {\n    title: 'Default configuration'\n  },\n\n  _onChangeXAxisLabel(e) {\n    SettingsPanelActions.changeXAxisLabel(e.target.value);\n  },\n\n  render() {\n    const dataSets = this.props.updatedReport.get('data_sets');\n    const fiscalYearText = this.props.updatedReport.getIn(['properties', 'fiscal_year_text']);\n\n    return (\n      <div>\n        <fieldset className=\"ui-form\">\n          <label>Customize the X-axis label</label>\n          <input type=\"text\" value={fiscalYearText} onChange={this._onChangeXAxisLabel} />\n          <p className=\"hint\">Default value: Fiscal Year</p>\n        </fieldset>\n        <hr/>\n        <fieldset className=\"ui-form\">\n          <label>Edit and re-arrange x-axis columns</label>\n          <XAxisEditor entity={this.props.entity} dataSets={dataSets.toJS()} />\n        </fieldset>\n      </div>\n    );\n  }\n});\n\nexport default DefaultConfiguration;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/default_configuration.tsx","import React from 'react';\nimport _ from 'lodash';\n\nimport strings from './strings';\n\nimport SettingsPanelActions from './actions/settings_panel_actions';\n\nimport createReactClass from 'create-react-class';\n\nconst XAxisEditor = createReactClass<any, any>({\n  getInitialState() {\n    let dataSets;\n\n    if (!this.props.dataSets) {\n      dataSets = [];\n    } else {\n      dataSets = this.props.dataSets.map(function(dataSet) {\n        return _.cloneDeep(dataSet);\n      });\n    }\n\n    return {\n      xAxisLabel: this.props.xAxisLabel,\n      dataSets\n    };\n  },\n\n  render() {\n    const dataSets = this.props.dataSets;\n\n    return (\n      <div className=\"x-axis-edit\">\n        <div className=\"x-axis-edit__columns\">\n          {dataSets.map(function(dataSet, i) {\n            const isLast = i === dataSets.length - 1;\n            return (\n              <DataSet\n                dataSet={dataSet}\n                entity={this.props.entity}\n                onDataSetUp={this.handleDataSetUp}\n                onDataSetDown={this.handleDataSetDown}\n                isLast={isLast}\n                onDrop={this.handleDrop} index={i} key={dataSet.id} />\n            );\n          }, this)}\n        </div>\n      </div>\n    );\n  },\n\n  handleConfirm(success) {\n    if (success) {\n      this.props.onConfirm(this.state.dataSets, this.state.xAxisLabel);\n    }\n  },\n\n  handleDrop(index, evt) {\n    const otherIndex = evt.dataTransfer.getData('index');\n    SettingsPanelActions.changeDataSetOrder(index, otherIndex);\n  },\n\n  handleDataSetUp(index) {\n    if (index > 0) {\n      SettingsPanelActions.changeDataSetOrder(index, index - 1);\n    }\n  },\n\n  handleDataSetDown(index) {\n    if (index < this.props.dataSets.length - 1) {\n      SettingsPanelActions.changeDataSetOrder(index, index + 1);\n    }\n  }\n});\n\nvar DataSet = createReactClass<any, any>({\n  render() {\n    const dataSet = this.props.dataSet;\n    const index = this.props.index;\n    const defaultLabel = strings.summaryHeaderLabel(dataSet, null, this.props.entity.get('fiscal_year_start_month'));\n\n    return (\n      <div\n        className=\"x-axis-edit__row\"\n        draggable={true}\n        onDragStart={_.partial(this.handleDragStart, this.props.index)}\n        onDrop={_.partial(this.props.onDrop, this.props.index)}\n        onDragOver={this.preventDefault}>\n        <div className=\"icon-drag-n-drop-1\" />\n        <div className=\"ui-button-stack\">\n          <button className=\"ui-button small icon-up-1\"\n            disabled={index === 0}\n            onClick={_.partial(this.props.onDataSetUp, index)}\n            title=\"Move up\" />\n          <button className=\"ui-button small icon-down-1\"\n            disabled={this.props.isLast}\n            onClick={_.partial(this.props.onDataSetDown, index)}\n            title=\"Move down\" />\n        </div>\n        <fieldset className=\"ui-form\">\n          <textarea\n            rows={2}\n            defaultValue={this.props.dataSet.name ? this.props.dataSet.name : defaultLabel}\n            onChange={_.partial(this.handleNameChange, index)}\n          />\n          <p className=\"hint\">Default: <strong>{defaultLabel}</strong></p>\n        </fieldset>\n      </div>\n    );\n  },\n\n  handleNameChange(index, evt) {\n    SettingsPanelActions.renameDataSet(index, evt.target.value);\n  },\n\n  handleDragStart(index, evt) {\n    evt.dataTransfer.setData('index', index);\n  },\n\n  preventDefault(evt) {\n    evt.preventDefault();\n  }\n});\n\nexport default XAxisEditor;\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/x_axis_editor.tsx","import React from 'react';\nimport { DropdownList, DropdownListItem} from '@opengov/ovid';\nimport DisableableToggle from './disableable_toggle';\nimport SummaryReportActions from '../actions/summary_report_actions';\n\nconst invalidProrationProps = (props) => (props.currentYearAmount === 'cumulative'\n      && props.currentYearPeriod === 'months');\n\nexport default class CurrentYearSettings extends React.Component<any, any> {\n  render() {\n    return (\n      <div id=\"current-year-settings\">\n        <fieldset className=\"ui-form\">\n          <label>Data Representation</label>\n          <p>Show your expenses/revenues trends within a fiscal year or across many years.</p>\n          <DropdownList value={this.props.currentYearPeriod} onChange={SummaryReportActions.changeCurrentYearPeriod}>\n            <DropdownListItem\n              key=\"years\"\n              value=\"years\"\n              title=\"Year over year\"\n              description=\"Displays years on the x-axis\" />\n            <DropdownListItem\n              key=\"months\"\n              value=\"months\"\n              title=\"Month over month\"\n              description=\"Displays months on the x-axis\" />\n          </DropdownList>\n        </fieldset>\n        <fieldset className=\"ui-form\">\n          <label>Amounts</label>\n          <p>Select how you want your amounts displayed in your report.</p>\n          <DropdownList value={this.props.currentYearAmount} onChange={SummaryReportActions.changeCurrentYearAmount}>\n            <DropdownListItem\n              key=\"cumulative\"\n              value=\"cumulative\"\n              title=\"Cumulative\"\n              description='Data in the report completes the sentence \"through the month of ...\"' />\n            <DropdownListItem\n              key=\"monthly\"\n              value=\"monthly\"\n              title=\"Incremental\"\n              description='Data in the report completes the sentence \"in the month of ...\"' />\n          </DropdownList>\n        </fieldset>\n        <DisableableToggle\n          {...this.props}\n          title={\"Budget Proration\"}\n          isEnabled={this.props.proration}\n          description={\"Proration adjusts budget amounts linearly (divided by 1/12) based on the current point within the fiscal year.\"}\n          enabledToggleLabel={\"Proration enabled\"}\n          disabledToggleLabel={\"Proration disabled\"}\n          disabledHint={\"Proration is disabled when viewing cumulative amounts in a single fiscal year.\"}\n          onToggle={SummaryReportActions.toggleProration}\n          hasInvalidProps={invalidProrationProps}/>\n      </div>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/current_year_settings.tsx","import React, { Component } from 'react';\nimport { ToggleSwitch } from '@opengov/ovid';\n\nexport const TOGGLE_OFF_STATE = 'off';\nexport const TOGGLE_ON_STATE = 'on';\n\nexport default class DisableableToggle extends Component<any, any> {\n  handleOnToggle = () => {\n    const { hasInvalidProps, onToggle } = this.props;\n\n    if (!hasInvalidProps(this.props)) {\n      onToggle();\n    }\n  };\n\n  render() {\n    const {\n      title,\n      description,\n      isEnabled,\n      enabledToggleLabel,\n      disabledToggleLabel,\n      disabledHint,\n      hasInvalidProps\n    } = this.props;\n\n    let toggleState = isEnabled ? TOGGLE_ON_STATE : TOGGLE_OFF_STATE;\n    let toggleLabel = isEnabled ? enabledToggleLabel : disabledToggleLabel;\n\n    const invalidProps = hasInvalidProps(this.props);\n    const showHint = invalidProps && disabledHint;\n\n    if (invalidProps) {\n      toggleState = TOGGLE_OFF_STATE;\n      toggleLabel = disabledToggleLabel;\n    }\n\n    return (\n      <fieldset className=\"ui-form\">\n        <span>\n          <label>{title}</label>\n          <p className=\"info-text\">\n            <small>{description}</small>\n          </p>\n          <ToggleSwitch\n            {...this.props}\n            state={toggleState}\n            onToggle={this.handleOnToggle}>\n            {toggleLabel}\n          </ToggleSwitch>\n          {showHint &&\n            <span className=\"hint\">{disabledHint}</span>}\n        </span>\n      </fieldset>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/settings_panel/disableable_toggle.tsx","import api from '@opengov/og_api';\nimport _ from 'lodash';\n\nlet selectedEntity;\n\napi.trapi.use(function(request) {\n  const useGridData = selectedEntity && _.includes(selectedEntity.get('feature_permissions'), 'data_manager');\n\n  if (useGridData && request.url.indexOf('grid_state') === -1) {\n    request.url = request.url.replace('v1', 'v2');\n  }\n\n  return request;\n});\n\nexport default {\n  setEntity(entity) {\n    selectedEntity = entity;\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/trapi_middleware.ts","import React, { Component } from 'react';\nimport _ from 'lodash';\nimport { Connect } from '@opengov/og_flux';\nimport { MainPanel } from '@opengov/ovid';\n\nimport ReportViewStore from './stores/report_view_store';\nimport ReportActions from './actions/report_actions';\nimport StoriesStore from './stores/stories_store';\nimport * as StoryActions from './actions/stories_actions';\n\nimport StoriesHeaderActions from './stories_header_actions';\nimport Sidebar from './sidebar';\n\nexport class StoryView extends Component<any, any> {\n  componentDidMount() {\n    StoryActions.fetchStories(this.props.entity.get('entity_id'));\n    if (this.props.params.storyId) {\n      StoryActions.selectStoryToView(this.props.params.storyId);\n    }\n    if (this.props.activeSidebar !== 'stories') {\n      // Handle the case when we load the application from a stories URL.\n      // The selected sidebar should be stories not the default reports one.\n      ReportActions.selectSidebar('stories');\n    }\n  }\n\n  componentWillReceiveProps() {\n    _.defer(() => {\n      // Seems to be a bug with the `props.params.storyId` not updating when the route changes.\n      // So to workaround this we will just parse out the story ID from the location hash ourselves.\n      const nextStoryId = _.last(window.location.hash.split('/'));\n      if (this.props.selectedStoryId !== nextStoryId) {\n        StoryActions.selectStoryToView(nextStoryId);\n      }\n    });\n  }\n\n  render() {\n    return (\n      <div className=\"story-view__container\">\n        <MainPanel>\n          <Sidebar\n            session={this.props.session}\n            entity={this.props.entity}\n            reports={this.props.reports}\n            stories={this.props.stories}\n            selectedStoryId={this.props.selectedStoryId}\n            activeSidebar={this.props.activeSidebar}\n          />\n        </MainPanel>\n        <StoriesHeaderActions entity={this.props.entity} />\n        <div className=\"ui-main__content\">\n          <iframe\n            className=\"story-view__iframe\"\n            src={this.props.selectedStoryPublicURL}\n            frameBorder=\"0\"\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Connect(\n  () => {\n    const state = StoriesStore.getState();\n    return {\n      stories: state.get('stories'),\n      selectedStoryId: state.get('selectedStoryId'),\n      selectedStoryPublicURL: StoriesStore.selectedStoryPublicURL(),\n      activeSidebar: ReportViewStore.getActiveSidebar()\n    };\n  },\n  StoriesStore,\n  ReportViewStore\n)(StoryView);\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/story_view.tsx","import React, { Component } from 'react';\nimport { Dropdown } from '@opengov/ovid';\n\nimport ShareList from './share/share_links';\nimport SharedLinkHelper from './share/shared_link_helper';\n\nexport default class StoriesHeaderActions extends Component<any, any> {\n  linkHelper: any;\n\n  componentWillMount() {\n    this.linkHelper = SharedLinkHelper.create(this.props.entity);\n  }\n\n  render() {\n    return (\n      <nav className=\"ui-main__actions ui-nav-bar\">\n        <Dropdown\n          title={<span>Share <i className=\"icon-downhead-3\"/></span>}\n          position=\"align-right\"\n          dropdownClass=\"ui-nav-bar__item\"\n          toggleClass=\"ui-button small no-color\"\n          key=\"share\">\n          <ShareList\n            linkHelper={this.linkHelper}\n          />\n        </Dropdown>\n      </nav>\n    );\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/stories_header_actions.tsx","/**\n * Gets the reports, sorted by position\n * @param {array<Object>} reports - The reports to sort\n */\nexport function getSortedReports(reports) {\n  if (!reports) { return reports; }\n\n  return reports.sort((a, b) => {\n    if (a.position < b.position) {\n      return -1;\n    } else if (a.position > b.position) {\n      return 1;\n    }\n\n    return 0;\n  });\n}\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/utils/report_utils.ts","\"use strict\";\n\nrequire(\"core-js/shim\");\n\nrequire(\"regenerator-runtime/runtime\");\n\nrequire(\"core-js/fn/regexp/escape\");\n\nif (global._babelPolyfill) {\n  throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n\nvar DEFINE_PROPERTY = \"defineProperty\";\nfunction define(O, key, value) {\n  O[key] || Object[DEFINE_PROPERTY](O, key, {\n    writable: true,\n    configurable: true,\n    value: value\n  });\n}\n\ndefine(String.prototype, \"padLeft\", \"\".padStart);\ndefine(String.prototype, \"padRight\", \"\".padEnd);\n\n\"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\".split(\",\").forEach(function (key) {\n  [][key] && define(Array, key, Function.call.bind([][key]));\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/lib/index.js\n// module id = 1595\n// module chunks = 0 1","require('./modules/es6.symbol');\nrequire('./modules/es6.object.create');\nrequire('./modules/es6.object.define-property');\nrequire('./modules/es6.object.define-properties');\nrequire('./modules/es6.object.get-own-property-descriptor');\nrequire('./modules/es6.object.get-prototype-of');\nrequire('./modules/es6.object.keys');\nrequire('./modules/es6.object.get-own-property-names');\nrequire('./modules/es6.object.freeze');\nrequire('./modules/es6.object.seal');\nrequire('./modules/es6.object.prevent-extensions');\nrequire('./modules/es6.object.is-frozen');\nrequire('./modules/es6.object.is-sealed');\nrequire('./modules/es6.object.is-extensible');\nrequire('./modules/es6.object.assign');\nrequire('./modules/es6.object.is');\nrequire('./modules/es6.object.set-prototype-of');\nrequire('./modules/es6.object.to-string');\nrequire('./modules/es6.function.bind');\nrequire('./modules/es6.function.name');\nrequire('./modules/es6.function.has-instance');\nrequire('./modules/es6.parse-int');\nrequire('./modules/es6.parse-float');\nrequire('./modules/es6.number.constructor');\nrequire('./modules/es6.number.to-fixed');\nrequire('./modules/es6.number.to-precision');\nrequire('./modules/es6.number.epsilon');\nrequire('./modules/es6.number.is-finite');\nrequire('./modules/es6.number.is-integer');\nrequire('./modules/es6.number.is-nan');\nrequire('./modules/es6.number.is-safe-integer');\nrequire('./modules/es6.number.max-safe-integer');\nrequire('./modules/es6.number.min-safe-integer');\nrequire('./modules/es6.number.parse-float');\nrequire('./modules/es6.number.parse-int');\nrequire('./modules/es6.math.acosh');\nrequire('./modules/es6.math.asinh');\nrequire('./modules/es6.math.atanh');\nrequire('./modules/es6.math.cbrt');\nrequire('./modules/es6.math.clz32');\nrequire('./modules/es6.math.cosh');\nrequire('./modules/es6.math.expm1');\nrequire('./modules/es6.math.fround');\nrequire('./modules/es6.math.hypot');\nrequire('./modules/es6.math.imul');\nrequire('./modules/es6.math.log10');\nrequire('./modules/es6.math.log1p');\nrequire('./modules/es6.math.log2');\nrequire('./modules/es6.math.sign');\nrequire('./modules/es6.math.sinh');\nrequire('./modules/es6.math.tanh');\nrequire('./modules/es6.math.trunc');\nrequire('./modules/es6.string.from-code-point');\nrequire('./modules/es6.string.raw');\nrequire('./modules/es6.string.trim');\nrequire('./modules/es6.string.iterator');\nrequire('./modules/es6.string.code-point-at');\nrequire('./modules/es6.string.ends-with');\nrequire('./modules/es6.string.includes');\nrequire('./modules/es6.string.repeat');\nrequire('./modules/es6.string.starts-with');\nrequire('./modules/es6.string.anchor');\nrequire('./modules/es6.string.big');\nrequire('./modules/es6.string.blink');\nrequire('./modules/es6.string.bold');\nrequire('./modules/es6.string.fixed');\nrequire('./modules/es6.string.fontcolor');\nrequire('./modules/es6.string.fontsize');\nrequire('./modules/es6.string.italics');\nrequire('./modules/es6.string.link');\nrequire('./modules/es6.string.small');\nrequire('./modules/es6.string.strike');\nrequire('./modules/es6.string.sub');\nrequire('./modules/es6.string.sup');\nrequire('./modules/es6.date.now');\nrequire('./modules/es6.date.to-json');\nrequire('./modules/es6.date.to-iso-string');\nrequire('./modules/es6.date.to-string');\nrequire('./modules/es6.date.to-primitive');\nrequire('./modules/es6.array.is-array');\nrequire('./modules/es6.array.from');\nrequire('./modules/es6.array.of');\nrequire('./modules/es6.array.join');\nrequire('./modules/es6.array.slice');\nrequire('./modules/es6.array.sort');\nrequire('./modules/es6.array.for-each');\nrequire('./modules/es6.array.map');\nrequire('./modules/es6.array.filter');\nrequire('./modules/es6.array.some');\nrequire('./modules/es6.array.every');\nrequire('./modules/es6.array.reduce');\nrequire('./modules/es6.array.reduce-right');\nrequire('./modules/es6.array.index-of');\nrequire('./modules/es6.array.last-index-of');\nrequire('./modules/es6.array.copy-within');\nrequire('./modules/es6.array.fill');\nrequire('./modules/es6.array.find');\nrequire('./modules/es6.array.find-index');\nrequire('./modules/es6.array.species');\nrequire('./modules/es6.array.iterator');\nrequire('./modules/es6.regexp.constructor');\nrequire('./modules/es6.regexp.exec');\nrequire('./modules/es6.regexp.to-string');\nrequire('./modules/es6.regexp.flags');\nrequire('./modules/es6.regexp.match');\nrequire('./modules/es6.regexp.replace');\nrequire('./modules/es6.regexp.search');\nrequire('./modules/es6.regexp.split');\nrequire('./modules/es6.promise');\nrequire('./modules/es6.map');\nrequire('./modules/es6.set');\nrequire('./modules/es6.weak-map');\nrequire('./modules/es6.weak-set');\nrequire('./modules/es6.typed.array-buffer');\nrequire('./modules/es6.typed.data-view');\nrequire('./modules/es6.typed.int8-array');\nrequire('./modules/es6.typed.uint8-array');\nrequire('./modules/es6.typed.uint8-clamped-array');\nrequire('./modules/es6.typed.int16-array');\nrequire('./modules/es6.typed.uint16-array');\nrequire('./modules/es6.typed.int32-array');\nrequire('./modules/es6.typed.uint32-array');\nrequire('./modules/es6.typed.float32-array');\nrequire('./modules/es6.typed.float64-array');\nrequire('./modules/es6.reflect.apply');\nrequire('./modules/es6.reflect.construct');\nrequire('./modules/es6.reflect.define-property');\nrequire('./modules/es6.reflect.delete-property');\nrequire('./modules/es6.reflect.enumerate');\nrequire('./modules/es6.reflect.get');\nrequire('./modules/es6.reflect.get-own-property-descriptor');\nrequire('./modules/es6.reflect.get-prototype-of');\nrequire('./modules/es6.reflect.has');\nrequire('./modules/es6.reflect.is-extensible');\nrequire('./modules/es6.reflect.own-keys');\nrequire('./modules/es6.reflect.prevent-extensions');\nrequire('./modules/es6.reflect.set');\nrequire('./modules/es6.reflect.set-prototype-of');\nrequire('./modules/es7.array.includes');\nrequire('./modules/es7.array.flat-map');\nrequire('./modules/es7.array.flatten');\nrequire('./modules/es7.string.at');\nrequire('./modules/es7.string.pad-start');\nrequire('./modules/es7.string.pad-end');\nrequire('./modules/es7.string.trim-left');\nrequire('./modules/es7.string.trim-right');\nrequire('./modules/es7.string.match-all');\nrequire('./modules/es7.symbol.async-iterator');\nrequire('./modules/es7.symbol.observable');\nrequire('./modules/es7.object.get-own-property-descriptors');\nrequire('./modules/es7.object.values');\nrequire('./modules/es7.object.entries');\nrequire('./modules/es7.object.define-getter');\nrequire('./modules/es7.object.define-setter');\nrequire('./modules/es7.object.lookup-getter');\nrequire('./modules/es7.object.lookup-setter');\nrequire('./modules/es7.map.to-json');\nrequire('./modules/es7.set.to-json');\nrequire('./modules/es7.map.of');\nrequire('./modules/es7.set.of');\nrequire('./modules/es7.weak-map.of');\nrequire('./modules/es7.weak-set.of');\nrequire('./modules/es7.map.from');\nrequire('./modules/es7.set.from');\nrequire('./modules/es7.weak-map.from');\nrequire('./modules/es7.weak-set.from');\nrequire('./modules/es7.global');\nrequire('./modules/es7.system.global');\nrequire('./modules/es7.error.is-error');\nrequire('./modules/es7.math.clamp');\nrequire('./modules/es7.math.deg-per-rad');\nrequire('./modules/es7.math.degrees');\nrequire('./modules/es7.math.fscale');\nrequire('./modules/es7.math.iaddh');\nrequire('./modules/es7.math.isubh');\nrequire('./modules/es7.math.imulh');\nrequire('./modules/es7.math.rad-per-deg');\nrequire('./modules/es7.math.radians');\nrequire('./modules/es7.math.scale');\nrequire('./modules/es7.math.umulh');\nrequire('./modules/es7.math.signbit');\nrequire('./modules/es7.promise.finally');\nrequire('./modules/es7.promise.try');\nrequire('./modules/es7.reflect.define-metadata');\nrequire('./modules/es7.reflect.delete-metadata');\nrequire('./modules/es7.reflect.get-metadata');\nrequire('./modules/es7.reflect.get-metadata-keys');\nrequire('./modules/es7.reflect.get-own-metadata');\nrequire('./modules/es7.reflect.get-own-metadata-keys');\nrequire('./modules/es7.reflect.has-metadata');\nrequire('./modules/es7.reflect.has-own-metadata');\nrequire('./modules/es7.reflect.metadata');\nrequire('./modules/es7.asap');\nrequire('./modules/es7.observable');\nrequire('./modules/web.timers');\nrequire('./modules/web.immediate');\nrequire('./modules/web.dom.iterable');\nmodule.exports = require('./modules/_core');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/shim.js\n// module id = 1596\n// module chunks = 0 1","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toObject = require('./_to-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $GOPS = require('./_object-gops');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n  require('./_object-pie').f = $propertyIsEnumerable;\n  $GOPS.f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./_library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });\n\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    return $GOPS.f(toObject(it));\n  }\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js\n// module id = 1597\n// module chunks = 0 1","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js\n// module id = 1598\n// module chunks = 0 1","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js\n// module id = 1599\n// module chunks = 0 1","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js\n// module id = 1600\n// module chunks = 0 1","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js\n// module id = 1601\n// module chunks = 0 1","var $export = require('./_export');\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperties: require('./_object-dps') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js\n// module id = 1602\n// module chunks = 0 1","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js\n// module id = 1603\n// module chunks = 0 1","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js\n// module id = 1604\n// module chunks = 0 1","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js\n// module id = 1605\n// module chunks = 0 1","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n  return require('./_object-gopn-ext').f;\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js\n// module id = 1606\n// module chunks = 0 1","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js\n// module id = 1607\n// module chunks = 0 1","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js\n// module id = 1608\n// module chunks = 0 1","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js\n// module id = 1609\n// module chunks = 0 1","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js\n// module id = 1610\n// module chunks = 0 1","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js\n// module id = 1611\n// module chunks = 0 1","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js\n// module id = 1612\n// module chunks = 0 1","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js\n// module id = 1613\n// module chunks = 0 1","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js\n// module id = 1614\n// module chunks = 0 1","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js\n// module id = 1615\n// module chunks = 0 1","'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = require('./_classof');\nvar test = {};\ntest[require('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  require('./_redefine')(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js\n// module id = 1616\n// module chunks = 0 1","// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = require('./_export');\n\n$export($export.P, 'Function', { bind: require('./_bind') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js\n// module id = 1617\n// module chunks = 0 1","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js\n// module id = 1618\n// module chunks = 0 1","'use strict';\nvar isObject = require('./_is-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar HAS_INSTANCE = require('./_wks')('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) require('./_object-dp').f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n  if (typeof this != 'function' || !isObject(O)) return false;\n  if (!isObject(this.prototype)) return O instanceof this;\n  // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n  while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n  return false;\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js\n// module id = 1619\n// module chunks = 0 1","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js\n// module id = 1620\n// module chunks = 0 1","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js\n// module id = 1621\n// module chunks = 0 1","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0);\n    var third, radix, maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n        default: return +it;\n      }\n      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof $Number\n      // check on 1..constructor(foo) case\n      && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n        ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n  };\n  for (var keys = require('./_descriptors') ? gOPN(Base) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES6 (in case, if modules with ES6 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (has(Base, key = keys[j]) && !has($Number, key)) {\n      dP($Number, key, gOPD(Base, key));\n    }\n  }\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  require('./_redefine')(global, NUMBER, $Number);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js\n// module id = 1622\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n  var i = -1;\n  var c2 = c;\n  while (++i < 6) {\n    c2 += n * data[i];\n    data[i] = c2 % 1e7;\n    c2 = floor(c2 / 1e7);\n  }\n};\nvar divide = function (n) {\n  var i = 6;\n  var c = 0;\n  while (--i >= 0) {\n    c += data[i];\n    data[i] = floor(c / n);\n    c = (c % n) * 1e7;\n  }\n};\nvar numToString = function () {\n  var i = 6;\n  var s = '';\n  while (--i >= 0) {\n    if (s !== '' || i === 0 || data[i] !== 0) {\n      var t = String(data[i]);\n      s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n    }\n  } return s;\n};\nvar pow = function (x, n, acc) {\n  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n  var n = 0;\n  var x2 = x;\n  while (x2 >= 4096) {\n    n += 12;\n    x2 /= 4096;\n  }\n  while (x2 >= 2) {\n    n += 1;\n    x2 /= 2;\n  } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n  0.00008.toFixed(3) !== '0.000' ||\n  0.9.toFixed(0) !== '1' ||\n  1.255.toFixed(2) !== '1.25' ||\n  1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n  // V8 ~ Android 4.3-\n  $toFixed.call({});\n})), 'Number', {\n  toFixed: function toFixed(fractionDigits) {\n    var x = aNumberValue(this, ERROR);\n    var f = toInteger(fractionDigits);\n    var s = '';\n    var m = ZERO;\n    var e, z, j, k;\n    if (f < 0 || f > 20) throw RangeError(ERROR);\n    // eslint-disable-next-line no-self-compare\n    if (x != x) return 'NaN';\n    if (x <= -1e21 || x >= 1e21) return String(x);\n    if (x < 0) {\n      s = '-';\n      x = -x;\n    }\n    if (x > 1e-21) {\n      e = log(x * pow(2, 69, 1)) - 69;\n      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n      z *= 0x10000000000000;\n      e = 52 - e;\n      if (e > 0) {\n        multiply(0, z);\n        j = f;\n        while (j >= 7) {\n          multiply(1e7, 0);\n          j -= 7;\n        }\n        multiply(pow(10, j, 1), 0);\n        j = e - 1;\n        while (j >= 23) {\n          divide(1 << 23);\n          j -= 23;\n        }\n        divide(1 << j);\n        multiply(1, 1);\n        divide(2);\n        m = numToString();\n      } else {\n        multiply(0, z);\n        multiply(1 << -e, 0);\n        m = numToString() + repeat.call(ZERO, f);\n      }\n    }\n    if (f > 0) {\n      k = m.length;\n      m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n    } else {\n      m = s + m;\n    } return m;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js\n// module id = 1623\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n  // IE7-\n  return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n  // V8 ~ Android 4.3-\n  $toPrecision.call({});\n})), 'Number', {\n  toPrecision: function toPrecision(precision) {\n    var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n    return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js\n// module id = 1624\n// module chunks = 0 1","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js\n// module id = 1625\n// module chunks = 0 1","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js\n// module id = 1626\n// module chunks = 0 1","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js\n// module id = 1627\n// module chunks = 0 1","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js\n// module id = 1628\n// module chunks = 0 1","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js\n// module id = 1629\n// module chunks = 0 1","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js\n// module id = 1630\n// module chunks = 0 1","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js\n// module id = 1631\n// module chunks = 0 1","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js\n// module id = 1632\n// module chunks = 0 1","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js\n// module id = 1633\n// module chunks = 0 1","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n  // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n  && Math.floor($acosh(Number.MAX_VALUE)) == 710\n  // Tor Browser bug: Math.acosh(Infinity) -> NaN\n  && $acosh(Infinity) == Infinity\n), 'Math', {\n  acosh: function acosh(x) {\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156\n      ? Math.log(x) + Math.LN2\n      : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js\n// module id = 1634\n// module chunks = 0 1","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js\n// module id = 1635\n// module chunks = 0 1","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n  atanh: function atanh(x) {\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js\n// module id = 1636\n// module chunks = 0 1","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x) {\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js\n// module id = 1637\n// module chunks = 0 1","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x) {\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js\n// module id = 1638\n// module chunks = 0 1","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n  cosh: function cosh(x) {\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js\n// module id = 1639\n// module chunks = 0 1","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js\n// module id = 1640\n// module chunks = 0 1","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js\n// module id = 1641\n// module chunks = 0 1","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n    var sum = 0;\n    var i = 0;\n    var aLen = arguments.length;\n    var larg = 0;\n    var arg, div;\n    while (i < aLen) {\n      arg = abs(arguments[i++]);\n      if (larg < arg) {\n        div = larg / arg;\n        sum = sum * div * div + 1;\n        larg = arg;\n      } else if (arg > 0) {\n        div = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js\n// module id = 1642\n// module chunks = 0 1","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y) {\n    var UINT16 = 0xffff;\n    var xn = +x;\n    var yn = +y;\n    var xl = UINT16 & xn;\n    var yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js\n// module id = 1643\n// module chunks = 0 1","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  log10: function log10(x) {\n    return Math.log(x) * Math.LOG10E;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js\n// module id = 1644\n// module chunks = 0 1","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js\n// module id = 1645\n// module chunks = 0 1","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js\n// module id = 1646\n// module chunks = 0 1","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js\n// module id = 1647\n// module chunks = 0 1","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x) {\n    return Math.abs(x = +x) < 1\n      ? (expm1(x) - expm1(-x)) / 2\n      : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js\n// module id = 1648\n// module chunks = 0 1","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n  tanh: function tanh(x) {\n    var a = expm1(x = +x);\n    var b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js\n// module id = 1649\n// module chunks = 0 1","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it) {\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js\n// module id = 1650\n// module chunks = 0 1","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js\n// module id = 1651\n// module chunks = 0 1","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js\n// module id = 1652\n// module chunks = 0 1","'use strict';\n// 21.1.3.25 String.prototype.trim()\nrequire('./_string-trim')('trim', function ($trim) {\n  return function trim() {\n    return $trim(this, 3);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js\n// module id = 1653\n// module chunks = 0 1","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js\n// module id = 1654\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js\n// module id = 1655\n// module chunks = 0 1","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js\n// module id = 1656\n// module chunks = 0 1","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js\n// module id = 1657\n// module chunks = 0 1","var $export = require('./_export');\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: require('./_string-repeat')\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js\n// module id = 1658\n// module chunks = 0 1","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js\n// module id = 1659\n// module chunks = 0 1","'use strict';\n// B.2.3.2 String.prototype.anchor(name)\nrequire('./_string-html')('anchor', function (createHTML) {\n  return function anchor(name) {\n    return createHTML(this, 'a', 'name', name);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js\n// module id = 1660\n// module chunks = 0 1","'use strict';\n// B.2.3.3 String.prototype.big()\nrequire('./_string-html')('big', function (createHTML) {\n  return function big() {\n    return createHTML(this, 'big', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js\n// module id = 1661\n// module chunks = 0 1","'use strict';\n// B.2.3.4 String.prototype.blink()\nrequire('./_string-html')('blink', function (createHTML) {\n  return function blink() {\n    return createHTML(this, 'blink', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js\n// module id = 1662\n// module chunks = 0 1","'use strict';\n// B.2.3.5 String.prototype.bold()\nrequire('./_string-html')('bold', function (createHTML) {\n  return function bold() {\n    return createHTML(this, 'b', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js\n// module id = 1663\n// module chunks = 0 1","'use strict';\n// B.2.3.6 String.prototype.fixed()\nrequire('./_string-html')('fixed', function (createHTML) {\n  return function fixed() {\n    return createHTML(this, 'tt', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js\n// module id = 1664\n// module chunks = 0 1","'use strict';\n// B.2.3.7 String.prototype.fontcolor(color)\nrequire('./_string-html')('fontcolor', function (createHTML) {\n  return function fontcolor(color) {\n    return createHTML(this, 'font', 'color', color);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js\n// module id = 1665\n// module chunks = 0 1","'use strict';\n// B.2.3.8 String.prototype.fontsize(size)\nrequire('./_string-html')('fontsize', function (createHTML) {\n  return function fontsize(size) {\n    return createHTML(this, 'font', 'size', size);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js\n// module id = 1666\n// module chunks = 0 1","'use strict';\n// B.2.3.9 String.prototype.italics()\nrequire('./_string-html')('italics', function (createHTML) {\n  return function italics() {\n    return createHTML(this, 'i', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js\n// module id = 1667\n// module chunks = 0 1","'use strict';\n// B.2.3.10 String.prototype.link(url)\nrequire('./_string-html')('link', function (createHTML) {\n  return function link(url) {\n    return createHTML(this, 'a', 'href', url);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js\n// module id = 1668\n// module chunks = 0 1","'use strict';\n// B.2.3.11 String.prototype.small()\nrequire('./_string-html')('small', function (createHTML) {\n  return function small() {\n    return createHTML(this, 'small', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js\n// module id = 1669\n// module chunks = 0 1","'use strict';\n// B.2.3.12 String.prototype.strike()\nrequire('./_string-html')('strike', function (createHTML) {\n  return function strike() {\n    return createHTML(this, 'strike', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js\n// module id = 1670\n// module chunks = 0 1","'use strict';\n// B.2.3.13 String.prototype.sub()\nrequire('./_string-html')('sub', function (createHTML) {\n  return function sub() {\n    return createHTML(this, 'sub', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js\n// module id = 1671\n// module chunks = 0 1","'use strict';\n// B.2.3.14 String.prototype.sup()\nrequire('./_string-html')('sup', function (createHTML) {\n  return function sup() {\n    return createHTML(this, 'sup', '', '');\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js\n// module id = 1672\n// module chunks = 0 1","// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = require('./_export');\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js\n// module id = 1673\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\n\n$export($export.P + $export.F * require('./_fails')(function () {\n  return new Date(NaN).toJSON() !== null\n    || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n  // eslint-disable-next-line no-unused-vars\n  toJSON: function toJSON(key) {\n    var O = toObject(this);\n    var pv = toPrimitive(O);\n    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js\n// module id = 1674\n// module chunks = 0 1","// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = require('./_export');\nvar toISOString = require('./_date-to-iso-string');\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n  toISOString: toISOString\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js\n// module id = 1675\n// module chunks = 0 1","'use strict';\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = require('./_fails');\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n  return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n  return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n  $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n  var d = this;\n  var y = d.getUTCFullYear();\n  var m = d.getUTCMilliseconds();\n  var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n  return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n    '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n    'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n    ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js\n// module id = 1676\n// module chunks = 0 1","var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n  require('./_redefine')(DateProto, TO_STRING, function toString() {\n    var value = getTime.call(this);\n    // eslint-disable-next-line no-self-compare\n    return value === value ? $toString.call(this) : INVALID_DATE;\n  });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js\n// module id = 1677\n// module chunks = 0 1","var TO_PRIMITIVE = require('./_wks')('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) require('./_hide')(proto, TO_PRIMITIVE, require('./_date-to-primitive'));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js\n// module id = 1678\n// module chunks = 0 1","'use strict';\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n  if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n  return toPrimitive(anObject(this), hint != NUMBER);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js\n// module id = 1679\n// module chunks = 0 1","// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = require('./_export');\n\n$export($export.S, 'Array', { isArray: require('./_is-array') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js\n// module id = 1680\n// module chunks = 0 1","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js\n// module id = 1681\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js\n// module id = 1682\n// module chunks = 0 1","'use strict';\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (require('./_iobject') != Object || !require('./_strict-method')(arrayJoin)), 'Array', {\n  join: function join(separator) {\n    return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js\n// module id = 1683\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar html = require('./_html');\nvar cof = require('./_cof');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * require('./_fails')(function () {\n  if (html) arraySlice.call(html);\n}), 'Array', {\n  slice: function slice(begin, end) {\n    var len = toLength(this.length);\n    var klass = cof(this);\n    end = end === undefined ? len : end;\n    if (klass == 'Array') return arraySlice.call(this, begin, end);\n    var start = toAbsoluteIndex(begin, len);\n    var upTo = toAbsoluteIndex(end, len);\n    var size = toLength(upTo - start);\n    var cloned = new Array(size);\n    var i = 0;\n    for (; i < size; i++) cloned[i] = klass == 'String'\n      ? this.charAt(start + i)\n      : this[start + i];\n    return cloned;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js\n// module id = 1684\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar fails = require('./_fails');\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n  // IE8-\n  test.sort(undefined);\n}) || !fails(function () {\n  // V8 bug\n  test.sort(null);\n  // Old WebKit\n}) || !require('./_strict-method')($sort)), 'Array', {\n  // 22.1.3.25 Array.prototype.sort(comparefn)\n  sort: function sort(comparefn) {\n    return comparefn === undefined\n      ? $sort.call(toObject(this))\n      : $sort.call(toObject(this), aFunction(comparefn));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js\n// module id = 1685\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $forEach = require('./_array-methods')(0);\nvar STRICT = require('./_strict-method')([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: function forEach(callbackfn /* , thisArg */) {\n    return $forEach(this, callbackfn, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js\n// module id = 1686\n// module chunks = 0 1","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js\n// module id = 1687\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $map = require('./_array-methods')(1);\n\n$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: function map(callbackfn /* , thisArg */) {\n    return $map(this, callbackfn, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js\n// module id = 1688\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $filter = require('./_array-methods')(2);\n\n$export($export.P + $export.F * !require('./_strict-method')([].filter, true), 'Array', {\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: function filter(callbackfn /* , thisArg */) {\n    return $filter(this, callbackfn, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js\n// module id = 1689\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $some = require('./_array-methods')(3);\n\n$export($export.P + $export.F * !require('./_strict-method')([].some, true), 'Array', {\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: function some(callbackfn /* , thisArg */) {\n    return $some(this, callbackfn, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js\n// module id = 1690\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $every = require('./_array-methods')(4);\n\n$export($export.P + $export.F * !require('./_strict-method')([].every, true), 'Array', {\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: function every(callbackfn /* , thisArg */) {\n    return $every(this, callbackfn, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js\n// module id = 1691\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduce, true), 'Array', {\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js\n// module id = 1692\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduceRight, true), 'Array', {\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n    return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js\n// module id = 1693\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $indexOf = require('./_array-includes')(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n    return NEGATIVE_ZERO\n      // convert -0 to +0\n      ? $native.apply(this, arguments) || 0\n      : $indexOf(this, searchElement, arguments[1]);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js\n// module id = 1694\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n    // convert -0 to +0\n    if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n    var O = toIObject(this);\n    var length = toLength(O.length);\n    var index = length - 1;\n    if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n    if (index < 0) index = length + index;\n    for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n    return -1;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js\n// module id = 1695\n// module chunks = 0 1","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js\n// module id = 1696\n// module chunks = 0 1","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js\n// module id = 1697\n// module chunks = 0 1","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./_add-to-unscopables')(KEY);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js\n// module id = 1698\n// module chunks = 0 1","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./_add-to-unscopables')(KEY);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js\n// module id = 1699\n// module chunks = 0 1","require('./_set-species')('Array');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js\n// module id = 1700\n// module chunks = 0 1","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n  re2[require('./_wks')('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var tiRE = this instanceof $RegExp;\n    var piRE = isRegExp(p);\n    var fiU = f === undefined;\n    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n      : inheritIfRequired(CORRECT_NEW\n        ? new Base(piRE && !fiU ? p.source : p, f)\n        : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n      , tiRE ? this : proto, $RegExp);\n  };\n  var proxy = function (key) {\n    key in $RegExp || dP($RegExp, key, {\n      configurable: true,\n      get: function () { return Base[key]; },\n      set: function (it) { Base[key] = it; }\n    });\n  };\n  for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js\n// module id = 1701\n// module chunks = 0 1","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n  require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n  define(function toString() {\n    var R = anObject(this);\n    return '/'.concat(R.source, '/',\n      'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n  });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n  define(function toString() {\n    return $toString.call(this);\n  });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js\n// module id = 1702\n// module chunks = 0 1","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[MATCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n    function (regexp) {\n      var res = maybeCallNative($match, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      if (!rx.global) return regExpExec(rx, S);\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = String(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js\n// module id = 1703\n// module chunks = 0 1","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = defined(this);\n      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n      return fn !== undefined\n        ? fn.call(searchValue, O, replaceValue)\n        : $replace.call(String(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n    function (regexp, replaceValue) {\n      var res = maybeCallNative($replace, regexp, this, replaceValue);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var functionalReplace = typeof replaceValue === 'function';\n      if (!functionalReplace) replaceValue = String(replaceValue);\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n        results.push(result);\n        if (!global) break;\n        var matchStr = String(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n        var matched = String(result[0]);\n        var position = max(min(toInteger(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = [matched].concat(captures, position, S);\n          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + S.slice(nextSourcePosition);\n    }\n  ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n      switch (ch.charAt(0)) {\n        case '$': return '$';\n        case '&': return matched;\n        case '`': return str.slice(0, position);\n        case \"'\": return str.slice(tailPos);\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n        default: // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n          capture = captures[n - 1];\n      }\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js\n// module id = 1704\n// module chunks = 0 1","'use strict';\n\nvar anObject = require('./_an-object');\nvar sameValue = require('./_same-value');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n  return [\n    // `String.prototype.search` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.search\n    function search(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[SEARCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n    },\n    // `RegExp.prototype[@@search]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n    function (regexp) {\n      var res = maybeCallNative($search, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      var previousLastIndex = rx.lastIndex;\n      if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n      var result = regExpExec(rx, S);\n      if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n      return result === null ? -1 : result.index;\n    }\n  ];\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js\n// module id = 1705\n// module chunks = 0 1","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n  var internalSplit;\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    // based on es5-shim implementation, need to rework it\n    internalSplit = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return $split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var match, lastIndex, lastLength;\n      while (match = regexpExec.call(separatorCopy, string)) {\n        lastIndex = separatorCopy[LAST_INDEX];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    internalSplit = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n    };\n  } else {\n    internalSplit = $split;\n  }\n\n  return [\n    // `String.prototype.split` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.split\n    function split(separator, limit) {\n      var O = defined(this);\n      var splitter = separator == undefined ? undefined : separator[SPLIT];\n      return splitter !== undefined\n        ? splitter.call(separator, O, limit)\n        : internalSplit.call(String(O), separator, limit);\n    },\n    // `RegExp.prototype[@@split]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n    //\n    // NOTE: This cannot be properly polyfilled in engines that don't support\n    // the 'y' flag.\n    function (regexp, limit) {\n      var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var C = speciesConstructor(rx, RegExp);\n\n      var unicodeMatching = rx.unicode;\n      var flags = (rx.ignoreCase ? 'i' : '') +\n                  (rx.multiline ? 'm' : '') +\n                  (rx.unicode ? 'u' : '') +\n                  (SUPPORTS_Y ? 'y' : 'g');\n\n      // ^(? + rx + ) is needed, in combination with some S slicing, to\n      // simulate the 'y' flag.\n      var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n      var p = 0;\n      var q = 0;\n      var A = [];\n      while (q < S.length) {\n        splitter.lastIndex = SUPPORTS_Y ? q : 0;\n        var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n        var e;\n        if (\n          z === null ||\n          (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n        ) {\n          q = advanceStringIndex(S, q, unicodeMatching);\n        } else {\n          A.push(S.slice(p, q));\n          if (A.length === lim) return A;\n          for (var i = 1; i <= z.length - 1; i++) {\n            A.push(z[i]);\n            if (A.length === lim) return A;\n          }\n          q = p = e;\n        }\n      }\n      A.push(S.slice(p));\n      return A;\n    }\n  ];\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js\n// module id = 1706\n// module chunks = 0 1","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js\n// module id = 1707\n// module chunks = 0 1","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js\n// module id = 1708\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n  // 24.1.3.1 ArrayBuffer.isView(arg)\n  isView: function isView(it) {\n    return $isView && $isView(it) || isObject(it) && VIEW in it;\n  }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n  return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n  // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n  slice: function slice(start, end) {\n    if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n    var len = anObject(this).byteLength;\n    var first = toAbsoluteIndex(start, len);\n    var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n    var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n    var viewS = new $DataView(this);\n    var viewT = new $DataView(result);\n    var index = 0;\n    while (first < fin) {\n      viewT.setUint8(index++, viewS.getUint8(first++));\n    } return result;\n  }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js\n// module id = 1709\n// module chunks = 0 1","var $export = require('./_export');\n$export($export.G + $export.W + $export.F * !require('./_typed').ABV, {\n  DataView: require('./_typed-buffer').DataView\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js\n// module id = 1710\n// module chunks = 0 1","require('./_typed-array')('Int8', 1, function (init) {\n  return function Int8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js\n// module id = 1711\n// module chunks = 0 1","require('./_typed-array')('Uint8', 1, function (init) {\n  return function Uint8Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js\n// module id = 1712\n// module chunks = 0 1","require('./_typed-array')('Uint8', 1, function (init) {\n  return function Uint8ClampedArray(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n}, true);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js\n// module id = 1713\n// module chunks = 0 1","require('./_typed-array')('Int16', 2, function (init) {\n  return function Int16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js\n// module id = 1714\n// module chunks = 0 1","require('./_typed-array')('Uint16', 2, function (init) {\n  return function Uint16Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js\n// module id = 1715\n// module chunks = 0 1","require('./_typed-array')('Int32', 4, function (init) {\n  return function Int32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js\n// module id = 1716\n// module chunks = 0 1","require('./_typed-array')('Uint32', 4, function (init) {\n  return function Uint32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js\n// module id = 1717\n// module chunks = 0 1","require('./_typed-array')('Float32', 4, function (init) {\n  return function Float32Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js\n// module id = 1718\n// module chunks = 0 1","require('./_typed-array')('Float64', 8, function (init) {\n  return function Float64Array(data, byteOffset, length) {\n    return init(this, data, byteOffset, length);\n  };\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js\n// module id = 1719\n// module chunks = 0 1","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n  rApply(function () { /* empty */ });\n}), 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList) {\n    var T = aFunction(target);\n    var L = anObject(argumentsList);\n    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js\n// module id = 1720\n// module chunks = 0 1","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n  function F() { /* empty */ }\n  return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n  rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n  construct: function construct(Target, args /* , newTarget */) {\n    aFunction(Target);\n    anObject(args);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n    if (Target == newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      switch (args.length) {\n        case 0: return new Target();\n        case 1: return new Target(args[0]);\n        case 2: return new Target(args[0], args[1]);\n        case 3: return new Target(args[0], args[1], args[2]);\n        case 4: return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args))();\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto = newTarget.prototype;\n    var instance = create(isObject(proto) ? proto : Object.prototype);\n    var result = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js\n// module id = 1721\n// module chunks = 0 1","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n  // eslint-disable-next-line no-undef\n  Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes) {\n    anObject(target);\n    propertyKey = toPrimitive(propertyKey, true);\n    anObject(attributes);\n    try {\n      dP.f(target, propertyKey, attributes);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js\n// module id = 1722\n// module chunks = 0 1","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey) {\n    var desc = gOPD(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js\n// module id = 1723\n// module chunks = 0 1","'use strict';\n// 26.1.5 Reflect.enumerate(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar Enumerate = function (iterated) {\n  this._t = anObject(iterated); // target\n  this._i = 0;                  // next index\n  var keys = this._k = [];      // keys\n  var key;\n  for (key in iterated) keys.push(key);\n};\nrequire('./_iter-create')(Enumerate, 'Object', function () {\n  var that = this;\n  var keys = that._k;\n  var key;\n  do {\n    if (that._i >= keys.length) return { value: undefined, done: true };\n  } while (!((key = keys[that._i++]) in that._t));\n  return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target) {\n    return new Enumerate(target);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js\n// module id = 1724\n// module chunks = 0 1","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n  var receiver = arguments.length < 3 ? target : arguments[2];\n  var desc, proto;\n  if (anObject(target) === receiver) return target[propertyKey];\n  if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n    ? desc.value\n    : desc.get !== undefined\n      ? desc.get.call(receiver)\n      : undefined;\n  if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js\n// module id = 1725\n// module chunks = 0 1","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n    return gOPD.f(anObject(target), propertyKey);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js\n// module id = 1726\n// module chunks = 0 1","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target) {\n    return getProto(anObject(target));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js\n// module id = 1727\n// module chunks = 0 1","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey) {\n    return propertyKey in target;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js\n// module id = 1728\n// module chunks = 0 1","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target) {\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js\n// module id = 1729\n// module chunks = 0 1","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js\n// module id = 1730\n// module chunks = 0 1","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target) {\n    anObject(target);\n    try {\n      if ($preventExtensions) $preventExtensions(target);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js\n// module id = 1731\n// module chunks = 0 1","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n  var receiver = arguments.length < 4 ? target : arguments[3];\n  var ownDesc = gOPD.f(anObject(target), propertyKey);\n  var existingDescriptor, proto;\n  if (!ownDesc) {\n    if (isObject(proto = getPrototypeOf(target))) {\n      return set(proto, propertyKey, V, receiver);\n    }\n    ownDesc = createDesc(0);\n  }\n  if (has(ownDesc, 'value')) {\n    if (ownDesc.writable === false || !isObject(receiver)) return false;\n    if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n      existingDescriptor.value = V;\n      dP.f(receiver, propertyKey, existingDescriptor);\n    } else dP.f(receiver, propertyKey, createDesc(0, V));\n    return true;\n  }\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js\n// module id = 1732\n// module chunks = 0 1","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto) {\n    setProto.check(target, proto);\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js\n// module id = 1733\n// module chunks = 0 1","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\nrequire('./_add-to-unscopables')('includes');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js\n// module id = 1734\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar aFunction = require('./_a-function');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n  flatMap: function flatMap(callbackfn /* , thisArg */) {\n    var O = toObject(this);\n    var sourceLen, A;\n    aFunction(callbackfn);\n    sourceLen = toLength(O.length);\n    A = arraySpeciesCreate(O, 0);\n    flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n    return A;\n  }\n});\n\nrequire('./_add-to-unscopables')('flatMap');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js\n// module id = 1735\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n  flatten: function flatten(/* depthArg = 1 */) {\n    var depthArg = arguments[0];\n    var O = toObject(this);\n    var sourceLen = toLength(O.length);\n    var A = arraySpeciesCreate(O, 0);\n    flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n    return A;\n  }\n});\n\nrequire('./_add-to-unscopables')('flatten');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js\n// module id = 1736\n// module chunks = 0 1","'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\nvar $export = require('./_export');\nvar $at = require('./_string-at')(true);\n\n$export($export.P, 'String', {\n  at: function at(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js\n// module id = 1737\n// module chunks = 0 1","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js\n// module id = 1738\n// module chunks = 0 1","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js\n// module id = 1739\n// module chunks = 0 1","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimLeft', function ($trim) {\n  return function trimLeft() {\n    return $trim(this, 1);\n  };\n}, 'trimStart');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js\n// module id = 1740\n// module chunks = 0 1","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimRight', function ($trim) {\n  return function trimRight() {\n    return $trim(this, 2);\n  };\n}, 'trimEnd');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js\n// module id = 1741\n// module chunks = 0 1","'use strict';\n// https://tc39.github.io/String.prototype.matchAll/\nvar $export = require('./_export');\nvar defined = require('./_defined');\nvar toLength = require('./_to-length');\nvar isRegExp = require('./_is-regexp');\nvar getFlags = require('./_flags');\nvar RegExpProto = RegExp.prototype;\n\nvar $RegExpStringIterator = function (regexp, string) {\n  this._r = regexp;\n  this._s = string;\n};\n\nrequire('./_iter-create')($RegExpStringIterator, 'RegExp String', function next() {\n  var match = this._r.exec(this._s);\n  return { value: match, done: match === null };\n});\n\n$export($export.P, 'String', {\n  matchAll: function matchAll(regexp) {\n    defined(this);\n    if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');\n    var S = String(this);\n    var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);\n    var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);\n    rx.lastIndex = toLength(regexp.lastIndex);\n    return new $RegExpStringIterator(rx, S);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js\n// module id = 1742\n// module chunks = 0 1","require('./_wks-define')('asyncIterator');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js\n// module id = 1743\n// module chunks = 0 1","require('./_wks-define')('observable');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js\n// module id = 1744\n// module chunks = 0 1","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\n// module id = 1745\n// module chunks = 0 1","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js\n// module id = 1746\n// module chunks = 0 1","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js\n// module id = 1747\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.2 Object.prototype.__defineGetter__(P, getter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n  __defineGetter__: function __defineGetter__(P, getter) {\n    $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js\n// module id = 1748\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.3 Object.prototype.__defineSetter__(P, setter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n  __defineSetter__: function __defineSetter__(P, setter) {\n    $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js\n// module id = 1749\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.4 Object.prototype.__lookupGetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n  __lookupGetter__: function __lookupGetter__(P) {\n    var O = toObject(this);\n    var K = toPrimitive(P, true);\n    var D;\n    do {\n      if (D = getOwnPropertyDescriptor(O, K)) return D.get;\n    } while (O = getPrototypeOf(O));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js\n// module id = 1750\n// module chunks = 0 1","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.5 Object.prototype.__lookupSetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n  __lookupSetter__: function __lookupSetter__(P) {\n    var O = toObject(this);\n    var K = toPrimitive(P, true);\n    var D;\n    do {\n      if (D = getOwnPropertyDescriptor(O, K)) return D.set;\n    } while (O = getPrototypeOf(O));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js\n// module id = 1751\n// module chunks = 0 1","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js\n// module id = 1752\n// module chunks = 0 1","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Set', { toJSON: require('./_collection-to-json')('Set') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js\n// module id = 1753\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('./_set-collection-of')('Map');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js\n// module id = 1754\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\nrequire('./_set-collection-of')('Set');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js\n// module id = 1755\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\nrequire('./_set-collection-of')('WeakMap');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js\n// module id = 1756\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\nrequire('./_set-collection-of')('WeakSet');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js\n// module id = 1757\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('./_set-collection-from')('Map');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js\n// module id = 1758\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\nrequire('./_set-collection-from')('Set');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js\n// module id = 1759\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\nrequire('./_set-collection-from')('WeakMap');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js\n// module id = 1760\n// module chunks = 0 1","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\nrequire('./_set-collection-from')('WeakSet');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js\n// module id = 1761\n// module chunks = 0 1","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.G, { global: require('./_global') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js\n// module id = 1762\n// module chunks = 0 1","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.S, 'System', { global: require('./_global') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js\n// module id = 1763\n// module chunks = 0 1","// https://github.com/ljharb/proposal-is-error\nvar $export = require('./_export');\nvar cof = require('./_cof');\n\n$export($export.S, 'Error', {\n  isError: function isError(it) {\n    return cof(it) === 'Error';\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js\n// module id = 1764\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  clamp: function clamp(x, lower, upper) {\n    return Math.min(upper, Math.max(lower, x));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js\n// module id = 1765\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js\n// module id = 1766\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar RAD_PER_DEG = 180 / Math.PI;\n\n$export($export.S, 'Math', {\n  degrees: function degrees(radians) {\n    return radians * RAD_PER_DEG;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js\n// module id = 1767\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar scale = require('./_math-scale');\nvar fround = require('./_math-fround');\n\n$export($export.S, 'Math', {\n  fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n    return fround(scale(x, inLow, inHigh, outLow, outHigh));\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js\n// module id = 1768\n// module chunks = 0 1","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  iaddh: function iaddh(x0, x1, y0, y1) {\n    var $x0 = x0 >>> 0;\n    var $x1 = x1 >>> 0;\n    var $y0 = y0 >>> 0;\n    return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js\n// module id = 1769\n// module chunks = 0 1","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  isubh: function isubh(x0, x1, y0, y1) {\n    var $x0 = x0 >>> 0;\n    var $x1 = x1 >>> 0;\n    var $y0 = y0 >>> 0;\n    return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js\n// module id = 1770\n// module chunks = 0 1","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  imulh: function imulh(u, v) {\n    var UINT16 = 0xffff;\n    var $u = +u;\n    var $v = +v;\n    var u0 = $u & UINT16;\n    var v0 = $v & UINT16;\n    var u1 = $u >> 16;\n    var v1 = $v >> 16;\n    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n    return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js\n// module id = 1771\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js\n// module id = 1772\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar DEG_PER_RAD = Math.PI / 180;\n\n$export($export.S, 'Math', {\n  radians: function radians(degrees) {\n    return degrees * DEG_PER_RAD;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js\n// module id = 1773\n// module chunks = 0 1","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { scale: require('./_math-scale') });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js\n// module id = 1774\n// module chunks = 0 1","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  umulh: function umulh(u, v) {\n    var UINT16 = 0xffff;\n    var $u = +u;\n    var $v = +v;\n    var u0 = $u & UINT16;\n    var v0 = $v & UINT16;\n    var u1 = $u >>> 16;\n    var v1 = $v >>> 16;\n    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n    return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js\n// module id = 1775\n// module chunks = 0 1","// http://jfbastien.github.io/papers/Math.signbit.html\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { signbit: function signbit(x) {\n  // eslint-disable-next-line no-self-compare\n  return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js\n// module id = 1776\n// module chunks = 0 1","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js\n// module id = 1777\n// module chunks = 0 1","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n  var promiseCapability = newPromiseCapability.f(this);\n  var result = perform(callbackfn);\n  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n  return promiseCapability.promise;\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js\n// module id = 1778\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar ordinaryDefineOwnMetadata = metadata.set;\n\nmetadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {\n  ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js\n// module id = 1779\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar getOrCreateMetadataMap = metadata.map;\nvar store = metadata.store;\n\nmetadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n  var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);\n  var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n  if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n  if (metadataMap.size) return true;\n  var targetMetadata = store.get(target);\n  targetMetadata['delete'](targetKey);\n  return !!targetMetadata.size || store['delete'](target);\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js\n// module id = 1780\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n  if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n  var parent = getPrototypeOf(O);\n  return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\nmetadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js\n// module id = 1781\n// module chunks = 0 1","var Set = require('./es6.set');\nvar from = require('./_array-from-iterable');\nvar metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nvar ordinaryMetadataKeys = function (O, P) {\n  var oKeys = ordinaryOwnMetadataKeys(O, P);\n  var parent = getPrototypeOf(O);\n  if (parent === null) return oKeys;\n  var pKeys = ordinaryMetadataKeys(parent, P);\n  return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;\n};\n\nmetadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n  return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js\n// module id = 1782\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryGetOwnMetadata(metadataKey, anObject(target)\n    , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js\n// module id = 1783\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n  return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js\n// module id = 1784\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n  if (hasOwn) return true;\n  var parent = getPrototypeOf(O);\n  return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\nmetadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js\n// module id = 1785\n// module chunks = 0 1","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n  return ordinaryHasOwnMetadata(metadataKey, anObject(target)\n    , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js\n// module id = 1786\n// module chunks = 0 1","var $metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar toMetaKey = $metadata.key;\nvar ordinaryDefineOwnMetadata = $metadata.set;\n\n$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {\n  return function decorator(target, targetKey) {\n    ordinaryDefineOwnMetadata(\n      metadataKey, metadataValue,\n      (targetKey !== undefined ? anObject : aFunction)(target),\n      toMetaKey(targetKey)\n    );\n  };\n} });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js\n// module id = 1787\n// module chunks = 0 1","// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask\nvar $export = require('./_export');\nvar microtask = require('./_microtask')();\nvar process = require('./_global').process;\nvar isNode = require('./_cof')(process) == 'process';\n\n$export($export.G, {\n  asap: function asap(fn) {\n    var domain = isNode && process.domain;\n    microtask(domain ? domain.bind(fn) : fn);\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js\n// module id = 1788\n// module chunks = 0 1","'use strict';\n// https://github.com/zenparsing/es-observable\nvar $export = require('./_export');\nvar global = require('./_global');\nvar core = require('./_core');\nvar microtask = require('./_microtask')();\nvar OBSERVABLE = require('./_wks')('observable');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar anInstance = require('./_an-instance');\nvar redefineAll = require('./_redefine-all');\nvar hide = require('./_hide');\nvar forOf = require('./_for-of');\nvar RETURN = forOf.RETURN;\n\nvar getMethod = function (fn) {\n  return fn == null ? undefined : aFunction(fn);\n};\n\nvar cleanupSubscription = function (subscription) {\n  var cleanup = subscription._c;\n  if (cleanup) {\n    subscription._c = undefined;\n    cleanup();\n  }\n};\n\nvar subscriptionClosed = function (subscription) {\n  return subscription._o === undefined;\n};\n\nvar closeSubscription = function (subscription) {\n  if (!subscriptionClosed(subscription)) {\n    subscription._o = undefined;\n    cleanupSubscription(subscription);\n  }\n};\n\nvar Subscription = function (observer, subscriber) {\n  anObject(observer);\n  this._c = undefined;\n  this._o = observer;\n  observer = new SubscriptionObserver(this);\n  try {\n    var cleanup = subscriber(observer);\n    var subscription = cleanup;\n    if (cleanup != null) {\n      if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };\n      else aFunction(cleanup);\n      this._c = cleanup;\n    }\n  } catch (e) {\n    observer.error(e);\n    return;\n  } if (subscriptionClosed(this)) cleanupSubscription(this);\n};\n\nSubscription.prototype = redefineAll({}, {\n  unsubscribe: function unsubscribe() { closeSubscription(this); }\n});\n\nvar SubscriptionObserver = function (subscription) {\n  this._s = subscription;\n};\n\nSubscriptionObserver.prototype = redefineAll({}, {\n  next: function next(value) {\n    var subscription = this._s;\n    if (!subscriptionClosed(subscription)) {\n      var observer = subscription._o;\n      try {\n        var m = getMethod(observer.next);\n        if (m) return m.call(observer, value);\n      } catch (e) {\n        try {\n          closeSubscription(subscription);\n        } finally {\n          throw e;\n        }\n      }\n    }\n  },\n  error: function error(value) {\n    var subscription = this._s;\n    if (subscriptionClosed(subscription)) throw value;\n    var observer = subscription._o;\n    subscription._o = undefined;\n    try {\n      var m = getMethod(observer.error);\n      if (!m) throw value;\n      value = m.call(observer, value);\n    } catch (e) {\n      try {\n        cleanupSubscription(subscription);\n      } finally {\n        throw e;\n      }\n    } cleanupSubscription(subscription);\n    return value;\n  },\n  complete: function complete(value) {\n    var subscription = this._s;\n    if (!subscriptionClosed(subscription)) {\n      var observer = subscription._o;\n      subscription._o = undefined;\n      try {\n        var m = getMethod(observer.complete);\n        value = m ? m.call(observer, value) : undefined;\n      } catch (e) {\n        try {\n          cleanupSubscription(subscription);\n        } finally {\n          throw e;\n        }\n      } cleanupSubscription(subscription);\n      return value;\n    }\n  }\n});\n\nvar $Observable = function Observable(subscriber) {\n  anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);\n};\n\nredefineAll($Observable.prototype, {\n  subscribe: function subscribe(observer) {\n    return new Subscription(observer, this._f);\n  },\n  forEach: function forEach(fn) {\n    var that = this;\n    return new (core.Promise || global.Promise)(function (resolve, reject) {\n      aFunction(fn);\n      var subscription = that.subscribe({\n        next: function (value) {\n          try {\n            return fn(value);\n          } catch (e) {\n            reject(e);\n            subscription.unsubscribe();\n          }\n        },\n        error: reject,\n        complete: resolve\n      });\n    });\n  }\n});\n\nredefineAll($Observable, {\n  from: function from(x) {\n    var C = typeof this === 'function' ? this : $Observable;\n    var method = getMethod(anObject(x)[OBSERVABLE]);\n    if (method) {\n      var observable = anObject(method.call(x));\n      return observable.constructor === C ? observable : new C(function (observer) {\n        return observable.subscribe(observer);\n      });\n    }\n    return new C(function (observer) {\n      var done = false;\n      microtask(function () {\n        if (!done) {\n          try {\n            if (forOf(x, false, function (it) {\n              observer.next(it);\n              if (done) return RETURN;\n            }) === RETURN) return;\n          } catch (e) {\n            if (done) throw e;\n            observer.error(e);\n            return;\n          } observer.complete();\n        }\n      });\n      return function () { done = true; };\n    });\n  },\n  of: function of() {\n    for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];\n    return new (typeof this === 'function' ? this : $Observable)(function (observer) {\n      var done = false;\n      microtask(function () {\n        if (!done) {\n          for (var j = 0; j < items.length; ++j) {\n            observer.next(items[j]);\n            if (done) return;\n          } observer.complete();\n        }\n      });\n      return function () { done = true; };\n    });\n  }\n});\n\nhide($Observable.prototype, OBSERVABLE, function () { return this; });\n\n$export($export.G, { Observable: $Observable });\n\nrequire('./_set-species')('Observable');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js\n// module id = 1789\n// module chunks = 0 1","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n  return function (fn, time /* , ...args */) {\n    var boundArgs = arguments.length > 2;\n    var args = boundArgs ? slice.call(arguments, 2) : false;\n    return set(boundArgs ? function () {\n      // eslint-disable-next-line no-new-func\n      (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n    } : fn, time);\n  };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout: wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js\n// module id = 1790\n// module chunks = 0 1","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js\n// module id = 1791\n// module chunks = 0 1","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js\n// module id = 1792\n// module chunks = 0 1","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    if (typeof global.process === \"object\" && global.process.domain) {\n      invoke = global.process.domain.bind(invoke);\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // Among the various tricks for obtaining a reference to the global\n  // object, this seems to be the most reliable technique that does not\n  // use indirect eval (which violates Content Security Policy).\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js\n// module id = 1793\n// module chunks = 0 1","require('../../modules/core.regexp.escape');\nmodule.exports = require('../../modules/_core').RegExp.escape;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js\n// module id = 1794\n// module chunks = 0 1","// https://github.com/benjamingr/RexExp.escape\nvar $export = require('./_export');\nvar $re = require('./_replacer')(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js\n// module id = 1795\n// module chunks = 0 1","module.exports = function (regExp, replace) {\n  var replacer = replace === Object(replace) ? function (part) {\n    return replace[part];\n  } : replace;\n  return function (it) {\n    return String(it).replace(regExp, replacer);\n  };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js\n// module id = 1796\n// module chunks = 0 1","require('babel-polyfill');\nrequire('@opengov/og_analytics').initialize();\n\nimport cookies from 'cookies-js';\n\nimport Backbone from 'backbone';\nimport $ from 'jquery';\nimport i18n, { currentLanguage } from './i18n';\n// :-( For jquery-ui which slickgrid depends on\nBackbone.$ = (window as any).jQuery = $;\n\nimport {\n  externalRoutes,\n  createRouter,\n  createRunCallback,\n  createStandalonePropExtractor\n} from '../javascripts/routes';\n\nconst router = createRouter(externalRoutes);\ni18n.on('initialized', () => {\n  router.run(createRunCallback(router, document.getElementById('App'), createStandalonePropExtractor()));\n});\n\n(window as any).jQuery(document).ready(() => {\n  /**\n  * if user has Spanish locale, we tell Google widget to invoke translation immediately\n  */\n  if (currentLanguage === 'es-MX') {\n    cookies.set('googtrans', '/en-US/es-MX');\n    (window as any).jQuery(document).on('translate', () => {\n      /* eslint-disable no-new */\n      new google.translate.TranslateElement({\n        pageLanguage: 'en-US',\n        includedLanguages: 'es-MX',\n        layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL,\n        gaTrack: true,\n        gaId: 'UA-33531311-2'\n      }, 'google_translate_element');\n    });\n  } else {\n    // NOTE: we remove cookie if the locale was changed back\n    cookies.expire('googtrans');\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./javascripts/standalone.ts"],"sourceRoot":""}